<?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>225270</bug_id>
          
          <creation_ts>2021-05-01 09:14:46 -0700</creation_ts>
          <short_desc>[LFC] Move formatting contexts to layout/formattingContexts directory</short_desc>
          <delta_ts>2021-05-01 12:56:17 -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>annulen</cc>
    
    <cc>bfulgham</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>koivisto</cc>
    
    <cc>ryuan.choi</cc>
    
    <cc>sergio</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>1755947</commentid>
    <comment_count>0</comment_count>
    <who name="alan">zalan</who>
    <bug_when>2021-05-01 09:14:46 -0700</bug_when>
    <thetext>ssia</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1755949</commentid>
    <comment_count>1</comment_count>
      <attachid>427499</attachid>
    <who name="alan">zalan</who>
    <bug_when>2021-05-01 09:17:38 -0700</bug_when>
    <thetext>Created attachment 427499
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1755950</commentid>
    <comment_count>2</comment_count>
    <who name="alan">zalan</who>
    <bug_when>2021-05-01 09:18:13 -0700</bug_when>
    <thetext>Next step is to rename the directories e.g blockformatting to block</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1755951</commentid>
    <comment_count>3</comment_count>
      <attachid>427500</attachid>
    <who name="alan">zalan</who>
    <bug_when>2021-05-01 09:23:56 -0700</bug_when>
    <thetext>Created attachment 427500
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1755957</commentid>
    <comment_count>4</comment_count>
      <attachid>427503</attachid>
    <who name="alan">zalan</who>
    <bug_when>2021-05-01 09:38:10 -0700</bug_when>
    <thetext>Created attachment 427503
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1755959</commentid>
    <comment_count>5</comment_count>
      <attachid>427504</attachid>
    <who name="alan">zalan</who>
    <bug_when>2021-05-01 09:44:57 -0700</bug_when>
    <thetext>Created attachment 427504
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1755987</commentid>
    <comment_count>6</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2021-05-01 12:55:43 -0700</bug_when>
    <thetext>Committed r276876 (237222@main): &lt;https://commits.webkit.org/237222@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 427504.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1755988</commentid>
    <comment_count>7</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-05-01 12:56:17 -0700</bug_when>
    <thetext>&lt;rdar://problem/77421391&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>427499</attachid>
            <date>2021-05-01 09:17:38 -0700</date>
            <delta_ts>2021-05-01 09:23:54 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-225270-20210501091737.patch</filename>
            <type>text/plain</type>
            <size>1296751</size>
            <attacher name="alan">zalan</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc2NzQ1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYTQ4MzViNDQwZjJhZWQ2
MGJkYzFjNGMxZTQ3NzBjYmI4NzgxY2RjYS4uZWFhMDEzNWFmMTM5OGUxYjZhMGViNzk3M2FlMWQ2
MDViYjU5ZTE3MiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDIxLTA1LTAxICBaYWxh
biBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CisKKyAgICAgICAgW0xGQ10gTW92ZSBmb3JtYXR0
aW5nIGNvbnRleHRzIGZpbGVzIHRvIGxheW91dC9mb3JtYXR0aW5nQ29udGV4dHMgZGlyZWN0b3J5
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMjUyNzAK
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIENNYWtl
TGlzdHMudHh0OgorICAgICAgICAqIFNvdXJjZXMudHh0OgorICAgICAgICAqIFdlYkNvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKwogMjAyMS0wNC0yOCAgUm9iIEJ1aXMgIDxyYnVpc0Bp
Z2FsaWEuY29tPgogCiAgICAgICAgIFthc3BlY3QtcmF0aW9dIFRyZWF0IGJvcmRlci9wYWRkaW5n
IGNvcnJlY3RseSBmb3IgYm94LXNpemluZzogYm9yZGVyLWJveApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvQ01ha2VMaXN0cy50eHQgYi9Tb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dApp
bmRleCBmMWYyYWRlN2Y3NjM1MjdmYTllZjMwYmRkMzk3YTMzMTcxM2EzY2Q3Li45YWQzMWU0MzNm
MDhlZGM5MDMwOTA1NjEyY2MzZjYyYTJjNGU3ZDYyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DTWFrZUxpc3RzLnR4dAorKysgYi9Tb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dApAQCAt
MTAxLDE2ICsxMDEsMTYgQEAgc2V0KFdlYkNvcmVfUFJJVkFURV9JTkNMVURFX0RJUkVDVE9SSUVT
CiAgICAgIiR7V0VCQ09SRV9ESVJ9L2luc3BlY3Rvci9hZ2VudHMvcGFnZSIKICAgICAiJHtXRUJD
T1JFX0RJUn0vaW5zcGVjdG9yL2FnZW50cy93b3JrZXIiCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xh
eW91dCIKLSAgICAiJHtXRUJDT1JFX0RJUn0vbGF5b3V0L2Jsb2NrZm9ybWF0dGluZyIKLSAgICAi
JHtXRUJDT1JFX0RJUn0vbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIiCi0gICAg
IiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mbGV4Zm9ybWF0dGluZyIKKyAgICAiJHtXRUJDT1JFX0RJ
Un0vbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmciCisgICAgIiR7V0VC
Q09SRV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxl
d3JhcHBlciIKKyAgICAiJHtXRUJDT1JFX0RJUn0vbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9m
bGV4Zm9ybWF0dGluZyIKICAgICAiJHtXRUJDT1JFX0RJUn0vbGF5b3V0L2Zsb2F0cyIKLSAgICAi
JHtXRUJDT1JFX0RJUn0vbGF5b3V0L2lubGluZWZvcm1hdHRpbmciCi0gICAgIiR7V0VCQ09SRV9E
SVJ9L2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQiCisgICAgIiR7V0VCQ09SRV9ESVJ9L2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZyIKKyAgICAiJHtXRUJDT1JF
X0RJUn0vbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL3RleHQiCiAg
ICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9pbnRlZ3JhdGlvbiIKICAgICAiJHtXRUJDT1JFX0RJ
Un0vbGF5b3V0L2ludmFsaWRhdGlvbiIKICAgICAiJHtXRUJDT1JFX0RJUn0vbGF5b3V0L2xheW91
dHRyZWUiCi0gICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC90YWJsZWZvcm1hdHRpbmciCisgICAg
IiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5n
IgogICAgICIke1dFQkNPUkVfRElSfS9sb2FkZXIiCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xvYWRl
ci9hcHBjYWNoZSIKICAgICAiJHtXRUJDT1JFX0RJUn0vbG9hZGVyL2FyY2hpdmUiCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9Tb3VyY2VzLnR4dCBiL1NvdXJjZS9XZWJDb3JlL1NvdXJjZXMu
dHh0CmluZGV4IDBiNDhjMTFkM2EyZmQ3OGYxY2M4OTgwNjNhZjMyNzVlODJkNDYzOTMuLmIzMjk1
MmE0YTRjZmIxZDNmYjliYWUwYTk3MjZmYjIzOTVkOWEzNGUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL1NvdXJjZXMudHh0CisrKyBiL1NvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0CkBAIC0x
NTA4LDQwICsxNTA4LDQwIEBAIGluc3BlY3Rvci9hZ2VudHMvd29ya2VyL1dvcmtlckRPTURlYnVn
Z2VyQWdlbnQuY3BwCiBpbnNwZWN0b3IvYWdlbnRzL3dvcmtlci9Xb3JrZXJEZWJ1Z2dlckFnZW50
LmNwcAogaW5zcGVjdG9yL2FnZW50cy93b3JrZXIvV29ya2VyTmV0d29ya0FnZW50LmNwcAogaW5z
cGVjdG9yL2FnZW50cy93b3JrZXIvV29ya2VyUnVudGltZUFnZW50LmNwcAotbGF5b3V0L0Zvcm1h
dHRpbmdDb250ZXh0LmNwcAotbGF5b3V0L0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCi1s
YXlvdXQvRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL0Zvcm1hdHRpbmdDb250ZXh0LmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9Gb3Jt
YXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9Gb3Jt
YXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKIGxheW91dC9Gb3JtYXR0aW5nU3RhdGUuY3BwCiBsYXlv
dXQvTGF5b3V0Q29udGV4dC5jcHAKIGxheW91dC9MYXlvdXRQaGFzZS5jcHAKIGxheW91dC9MYXlv
dXRTdGF0ZS5jcHAKIGxheW91dC9MYXlvdXRVbml0cy5jcHAKIGxheW91dC9WZXJpZmljYXRpb24u
Y3BwCi1sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCi1s
YXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAK
LWxheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAK
LWxheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuY3BwCi1sYXlvdXQv
YmxvY2tmb3JtYXR0aW5nL0Jsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCi1sYXlvdXQvYmxvY2tmb3Jt
YXR0aW5nL1ByZWNvbXB1dGVkQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAKLWxheW91dC9ibG9ja2Zv
cm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQu
Y3BwCi1sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcAotbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhG
b3JtYXR0aW5nQ29udGV4dC5jcHAKLWxheW91dC9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGlu
Z0NvbnRleHRHZW9tZXRyeS5jcHAKLWxheW91dC9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGlu
Z1N0YXRlLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dC5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tm
b3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKK2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWly
a3MuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zv
cm1hdHRpbmdTdGF0ZS5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0
aW5nL0Jsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Js
b2NrZm9ybWF0dGluZy9QcmVjb21wdXRlZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCitsYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFw
cGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
YmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0UXVpcmtzLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGlu
Zy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Zs
ZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ1N0YXRlLmNwcAog
bGF5b3V0L2Zsb2F0cy9GbG9hdEF2b2lkZXIuY3BwCiBsYXlvdXQvZmxvYXRzL0Zsb2F0aW5nQ29u
dGV4dC5jcHAKIGxheW91dC9mbG9hdHMvRmxvYXRpbmdTdGF0ZS5jcHAKLWxheW91dC9pbmxpbmVm
b3JtYXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2VyLmNwcAotbGF5b3V0L2lubGluZWZvcm1hdHRp
bmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuY3BwCi1sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9J
bmxpbmVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAotbGF5b3V0L2lubGluZWZvcm1hdHRp
bmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCi1sYXlvdXQvaW5saW5lZm9ybWF0
dGluZy9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuY3BwCi1sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9J
bmxpbmVJdGVtLmNwcAotbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAKLWxh
eW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwCi1sYXlvdXQvaW5saW5lZm9y
bWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5jcHAKLWxheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZVRleHRJdGVtLmNwcAotbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvdGV4dC9UZXh0VXRpbC5j
cHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250
ZW50QnJlYWtlci5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdD
b250ZXh0UXVpcmtzLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0
aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5jcHAKK2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5jcHAKK2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVUZXh0SXRlbS5jcHAKK2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRVdGlsLmNw
cAogbGF5b3V0L2ludGVncmF0aW9uL0xheW91dEludGVncmF0aW9uQm94VHJlZS5jcHAKIGxheW91
dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbkNvdmVyYWdlLmNwcAogbGF5b3V0L2ludGVn
cmF0aW9uL0xheW91dEludGVncmF0aW9uSW5saW5lQ29udGVudEJ1aWxkZXIuY3BwCkBAIC0xNTYw
LDEyICsxNTYwLDEyIEBAIGxheW91dC9sYXlvdXR0cmVlL0xheW91dElubGluZVRleHRCb3guY3Bw
CiBsYXlvdXQvbGF5b3V0dHJlZS9MYXlvdXRMaW5lQnJlYWtCb3guY3BwCiBsYXlvdXQvbGF5b3V0
dHJlZS9MYXlvdXRSZXBsYWNlZEJveC5jcHAKIGxheW91dC9sYXlvdXR0cmVlL0xheW91dFRyZWVC
dWlsZGVyLmNwcAotbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0
LmNwcAotbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0
cnkuY3BwCi1sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRRdWly
a3MuY3BwCi1sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcAot
bGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuY3BwCi1sYXlvdXQvdGFibGVmb3JtYXR0
aW5nL1RhYmxlTGF5b3V0LmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1h
dHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKK2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0Nv
bnRleHRRdWlya3MuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGlu
Zy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFi
bGVmb3JtYXR0aW5nL1RhYmxlR3JpZC5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFi
bGVmb3JtYXR0aW5nL1RhYmxlTGF5b3V0LmNwcAogbG9hZGVyL1ByaXZhdGVDbGlja01lYXN1cmVt
ZW50LmNwcAogbG9hZGVyL0FwcGxpY2F0aW9uTWFuaWZlc3RMb2FkZXIuY3BwCiBsb2FkZXIvQ2Fu
dmFzQWN0aXZpdHlSZWNvcmQuY3BwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggYzc5NzAwM2M4OWRkNGM2ZDBhNzJlMDJhNGVhMTY2
MDJlMDcwYTk2MS4uNzk2Mzk3MTY3YjIxNWI5YWYxMTQ4MzA1NWFmY2UyNTAyZjliNzIwOSAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
CisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpA
QCAtMTgxNzcsMTggKzE4MTc3LDExIEBACiAJCTExNUNGQTY2MjA4QUY3MjAwMDFFNjk5MSAvKiBs
YXlvdXQgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKAotCQkJCTEx
NUNGQTk5MjA4QkMwOUEwMDFFNjk5MSAvKiBibG9ja2Zvcm1hdHRpbmcgKi8sCi0JCQkJNkZCN0Qy
RDUyNTBGRDdCNTAwMDIwN0FBIC8qIGZsZXhmb3JtYXR0aW5nICovLAogCQkJCTZGQ0ZDMDU1MjEy
REFDQzIwMDc2OTVEMiAvKiBmbG9hdHMgKi8sCi0JCQkJMTE1Q0ZBOUEyMDhCQzE0MDAwMUU2OTkx
IC8qIGlubGluZWZvcm1hdHRpbmcgKi8sCisJCQkJNkY4NDRGN0YyNjNEOTE2MTAwRjkxMzcwIC8q
IGZvcm1hdHRpbmdDb250ZXh0cyAqLywKIAkJCQlFNEZCNEIxRTIzOTUzNTZGMDAzQzMzNkEgLyog
aW50ZWdyYXRpb24gKi8sCiAJCQkJNkY5NURFNEEyMzdCODgzMDAwRTUxN0UxIC8qIGludmFsaWRh
dGlvbiAqLywKIAkJCQkxMTVDRkE5MDIwOEI5NDQxMDAxRTY5OTEgLyogbGF5b3V0dHJlZSAqLywK
LQkJCQk2RkM1Q0E5MTIyRTM1OTMzMDBCMTNFMTEgLyogdGFibGVmb3JtYXR0aW5nICovLAotCQkJ
CTExNUNGQTY5MjA4QUY3RDAwMDFFNjk5MSAvKiBGb3JtYXR0aW5nQ29udGV4dC5jcHAgKi8sCi0J
CQkJMTE1Q0ZBNjgyMDhBRjdEMDAwMUU2OTkxIC8qIEZvcm1hdHRpbmdDb250ZXh0LmggKi8sCi0J
CQkJNkZCQjg2MDUyMEI0NjRCNjAwREFEOTM4IC8qIEZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnku
Y3BwICovLAotCQkJCTZGOEY0NjAxMjFCMDNCQjQwMDQxQUMzQSAvKiBGb3JtYXR0aW5nQ29udGV4
dFF1aXJrcy5jcHAgKi8sCiAJCQkJMTE1Q0ZBNzUyMDhBRkUzMDAwMUU2OTkxIC8qIEZvcm1hdHRp
bmdTdGF0ZS5jcHAgKi8sCiAJCQkJMTE1Q0ZBNzQyMDhBRkUzMDAwMUU2OTkxIC8qIEZvcm1hdHRp
bmdTdGF0ZS5oICovLAogCQkJCTZGMjZCQjY5MjMzNDNFNUEwMDJGMkJFQSAvKiBMYXlvdXRDb250
ZXh0LmNwcCAqLywKQEAgLTIyNTk3LDYgKzIyNTkwLDIxIEBACiAJCQlwYXRoID0gYW5nbGU7CiAJ
CQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwogCQl9OworCQk2Rjg0NEY3RjI2M0Q5MTYxMDBGOTEz
NzAgLyogZm9ybWF0dGluZ0NvbnRleHRzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQlj
aGlsZHJlbiA9ICgKKwkJCQkxMTVDRkE5OTIwOEJDMDlBMDAxRTY5OTEgLyogYmxvY2tmb3JtYXR0
aW5nICovLAorCQkJCTZGQjdEMkQ1MjUwRkQ3QjUwMDAyMDdBQSAvKiBmbGV4Zm9ybWF0dGluZyAq
LywKKwkJCQkxMTVDRkE5QTIwOEJDMTQwMDAxRTY5OTEgLyogaW5saW5lZm9ybWF0dGluZyAqLywK
KwkJCQk2RkM1Q0E5MTIyRTM1OTMzMDBCMTNFMTEgLyogdGFibGVmb3JtYXR0aW5nICovLAorCQkJ
CTExNUNGQTY5MjA4QUY3RDAwMDFFNjk5MSAvKiBGb3JtYXR0aW5nQ29udGV4dC5jcHAgKi8sCisJ
CQkJMTE1Q0ZBNjgyMDhBRjdEMDAwMUU2OTkxIC8qIEZvcm1hdHRpbmdDb250ZXh0LmggKi8sCisJ
CQkJNkZCQjg2MDUyMEI0NjRCNjAwREFEOTM4IC8qIEZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnku
Y3BwICovLAorCQkJCTZGOEY0NjAxMjFCMDNCQjQwMDQxQUMzQSAvKiBGb3JtYXR0aW5nQ29udGV4
dFF1aXJrcy5jcHAgKi8sCisJCQkpOworCQkJcGF0aCA9IGZvcm1hdHRpbmdDb250ZXh0czsKKwkJ
CXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CiAJCTZGOTVERTRBMjM3Qjg4MzAwMEU1MTdF
MSAvKiBpbnZhbGlkYXRpb24gKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVu
ID0gKApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdDb250ZXh0
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dC5jcHAKZGVsZXRl
ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NTdkYmEyYzdkNjUyOTYwYzQxMWZhYmNhMzU3NTg2
OTViYTExMjguLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdDb250ZXh0LmNwcAorKysgL2Rldi9udWxs
CkBAIC0xLDMwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICog
YXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2lu
Y2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJ
TkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIklu
dmFsaWRhdGlvblN0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5
b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNs
dWRlICJMYXlvdXRDb250ZXh0LmgiCi0jaW5jbHVkZSAiTGF5b3V0RGVzY2VuZGFudEl0ZXJhdG9y
LmgiCi0jaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRhaW5pbmdCbG9jay5oIgotI2luY2x1ZGUg
IkxheW91dFJlcGxhY2VkQm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKLSNpbmNsdWRl
ICJMb2dnaW5nLmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KLSNpbmNsdWRl
IDx3dGYvdGV4dC9UZXh0U3RyZWFtLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFj
ZSBMYXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoRm9ybWF0dGluZ0NvbnRl
eHQpOwotCi1Gb3JtYXR0aW5nQ29udGV4dDo6Rm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFp
bmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGlu
Z1N0YXRlKQotICAgIDogbV9yb290KG1ha2VXZWFrUHRyKGZvcm1hdHRpbmdDb250ZXh0Um9vdCkp
Ci0gICAgLCBtX2Zvcm1hdHRpbmdTdGF0ZShmb3JtYXR0aW5nU3RhdGUpCi17Ci0gICAgQVNTRVJU
KGZvcm1hdHRpbmdDb250ZXh0Um9vdC5oYXNDaGlsZCgpKTsKLSNpZm5kZWYgTkRFQlVHCi0gICAg
bGF5b3V0U3RhdGUoKS5yZWdpc3RlckZvcm1hdHRpbmdDb250ZXh0KCp0aGlzKTsKLSNlbmRpZgot
fQotCi1Gb3JtYXR0aW5nQ29udGV4dDo6fkZvcm1hdHRpbmdDb250ZXh0KCkKLXsKLSNpZm5kZWYg
TkRFQlVHCi0gICAgbGF5b3V0U3RhdGUoKS5kZXJlZ2lzdGVyRm9ybWF0dGluZ0NvbnRleHQoKnRo
aXMpOwotI2VuZGlmCi19Ci0KLUxheW91dFN0YXRlJiBGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0
U3RhdGUoKSBjb25zdAotewotICAgIHJldHVybiBtX2Zvcm1hdHRpbmdTdGF0ZS5sYXlvdXRTdGF0
ZSgpOwotfQotCi12b2lkIEZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlT3V0T2ZGbG93SG9yaXpv
bnRhbEdlb21ldHJ5KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBDb25zdHJhaW50c0Zvck91
dE9mRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNP
dXRPZkZsb3dQb3NpdGlvbmVkKCkpOwotICAgIGF1dG8gY29tcHV0ZSA9IFsmXShPcHRpb25hbDxM
YXlvdXRVbml0PiB1c2VkV2lkdGgpIHsKLSAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCkub3V0T2ZG
bG93SG9yaXpvbnRhbEdlb21ldHJ5KGxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwg
Y29uc3RyYWludHMudmVydGljYWwsIHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0gICAgfTsKLQotICAg
IGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2lj
YWxXaWR0aDsKLSAgICBhdXRvIGhvcml6b250YWxHZW9tZXRyeSA9IGNvbXB1dGUoeyB9KTsKLSAg
ICBpZiAoYXV0byBtYXhXaWR0aCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhXaWR0aChsYXlvdXRC
b3gsIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSkgewotICAgICAgICBhdXRvIG1heEhvcml6b250YWxH
ZW9tZXRyeSA9IGNvbXB1dGUobWF4V2lkdGgpOwotICAgICAgICBpZiAoaG9yaXpvbnRhbEdlb21l
dHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGggPiBtYXhIb3Jpem9udGFsR2Vv
bWV0cnkuY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkKLSAgICAgICAgICAgIGhv
cml6b250YWxHZW9tZXRyeSA9IG1heEhvcml6b250YWxHZW9tZXRyeTsKLSAgICB9Ci0KLSAgICBp
ZiAoYXV0byBtaW5XaWR0aCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNaW5XaWR0aChsYXlvdXRCb3gs
IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSkgewotICAgICAgICBhdXRvIG1pbkhvcml6b250YWxHZW9t
ZXRyeSA9IGNvbXB1dGUobWluV2lkdGgpOwotICAgICAgICBpZiAoaG9yaXpvbnRhbEdlb21ldHJ5
LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGggPCBtaW5Ib3Jpem9udGFsR2VvbWV0
cnkuY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkKLSAgICAgICAgICAgIGhvcml6
b250YWxHZW9tZXRyeSA9IG1pbkhvcml6b250YWxHZW9tZXRyeTsKLSAgICB9Ci0KLSAgICBhdXRv
JiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7
Ci0gICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbExlZnQoaG9yaXpvbnRhbEdlb21ldHJ5LmxlZnQg
KyBob3Jpem9udGFsR2VvbWV0cnkuY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uc3Rh
cnQpOwotICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChob3Jpem9udGFsR2VvbWV0
cnkuY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCk7Ci0gICAgYXV0byYgdXNlZEhv
cml6b250YWxNYXJnaW4gPSBob3Jpem9udGFsR2VvbWV0cnkuY29udGVudFdpZHRoQW5kTWFyZ2lu
LnVzZWRNYXJnaW47Ci0gICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IHVzZWRI
b3Jpem9udGFsTWFyZ2luLnN0YXJ0LCB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgfSk7Ci19Ci0K
LXZvaWQgRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVPdXRPZkZsb3dWZXJ0aWNhbEdlb21ldHJ5
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBDb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRl
bnQmIGNvbnN0cmFpbnRzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3Np
dGlvbmVkKCkpOwotICAgIGF1dG8gY29tcHV0ZSA9IFsmXShPcHRpb25hbDxMYXlvdXRVbml0PiB1
c2VkSGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBnZW9tZXRyeSgpLm91dE9mRmxvd1ZlcnRpY2Fs
R2VvbWV0cnkobGF5b3V0Qm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFsLCBjb25zdHJhaW50cy52
ZXJ0aWNhbCwgeyB1c2VkSGVpZ2h0IH0pOwotICAgIH07Ci0KLSAgICBhdXRvIGNvbnRhaW5pbmdC
bG9ja0hlaWdodCA9ICpjb25zdHJhaW50cy52ZXJ0aWNhbC5sb2dpY2FsSGVpZ2h0OwotICAgIGF1
dG8gdmVydGljYWxHZW9tZXRyeSA9IGNvbXB1dGUoeyB9KTsKLSAgICBpZiAoYXV0byBtYXhIZWln
aHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWF4SGVpZ2h0KGxheW91dEJveCwgY29udGFpbmluZ0Js
b2NrSGVpZ2h0KSkgewotICAgICAgICBhdXRvIG1heFZlcnRpY2FsR2VvbWV0cnkgPSBjb21wdXRl
KG1heEhlaWdodCk7Ci0gICAgICAgIGlmICh2ZXJ0aWNhbEdlb21ldHJ5LmNvbnRlbnRIZWlnaHRB
bmRNYXJnaW4uY29udGVudEhlaWdodCA+IG1heFZlcnRpY2FsR2VvbWV0cnkuY29udGVudEhlaWdo
dEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KQotICAgICAgICAgICAgdmVydGljYWxHZW9tZXRyeSA9
IG1heFZlcnRpY2FsR2VvbWV0cnk7Ci0gICAgfQotCi0gICAgaWYgKGF1dG8gbWluSGVpZ2h0ID0g
Z2VvbWV0cnkoKS5jb21wdXRlZE1pbkhlaWdodChsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja0hl
aWdodCkpIHsKLSAgICAgICAgYXV0byBtaW5WZXJ0aWNhbEdlb21ldHJ5ID0gY29tcHV0ZShtaW5I
ZWlnaHQpOwotICAgICAgICBpZiAodmVydGljYWxHZW9tZXRyeS5jb250ZW50SGVpZ2h0QW5kTWFy
Z2luLmNvbnRlbnRIZWlnaHQgPCBtaW5WZXJ0aWNhbEdlb21ldHJ5LmNvbnRlbnRIZWlnaHRBbmRN
YXJnaW4uY29udGVudEhlaWdodCkKLSAgICAgICAgICAgIHZlcnRpY2FsR2VvbWV0cnkgPSBtaW5W
ZXJ0aWNhbEdlb21ldHJ5OwotICAgIH0KLQotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0
dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsKLSAgICBhdXRvIG5vbkNvbGxhcHNl
ZFZlcnRpY2FsTWFyZ2luID0gdmVydGljYWxHZW9tZXRyeS5jb250ZW50SGVpZ2h0QW5kTWFyZ2lu
Lm5vbkNvbGxhcHNlZE1hcmdpbjsKLSAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRp
Y2FsR2VvbWV0cnkudG9wICsgbm9uQ29sbGFwc2VkVmVydGljYWxNYXJnaW4uYmVmb3JlKTsKLSAg
ICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KHZlcnRpY2FsR2VvbWV0cnkuY29udGVu
dEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KTsKLSAgICAvLyBNYXJnaW5zIG9mIGFic29s
dXRlbHkgcG9zaXRpb25lZCBib3hlcyBkbyBub3QgY29sbGFwc2UuCi0gICAgYm94R2VvbWV0cnku
c2V0VmVydGljYWxNYXJnaW4oeyBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUsIG5v
bkNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyIH0pOwotfQotCi12b2lkIEZvcm1hdHRpbmdD
b250ZXh0Ojpjb21wdXRlQm9yZGVyQW5kUGFkZGluZyhjb25zdCBCb3gmIGxheW91dEJveCwgY29u
c3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludCkKLXsKLSAgICBh
dXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJv
eCk7Ci0gICAgYm94R2VvbWV0cnkuc2V0Qm9yZGVyKGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIo
bGF5b3V0Qm94KSk7Ci0gICAgYm94R2VvbWV0cnkuc2V0UGFkZGluZyhnZW9tZXRyeSgpLmNvbXB1
dGVkUGFkZGluZyhsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50LmxvZ2ljYWxXaWR0aCkp
OwotfQotCi12b2lkIEZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRPdXRPZkZsb3dDb250ZW50KElu
dmFsaWRhdGlvblN0YXRlJiBpbnZhbGlkYXRpb25TdGF0ZSwgY29uc3QgQ29uc3RyYWludHNGb3JP
dXRPZkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9y
bWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiU3RhcnQ6IGxheW91dCBvdXQtb2YtZmxv
dyBjb250ZW50IC0+IGNvbnRleHQ6ICIgPDwgJmxheW91dFN0YXRlKCkgPDwgIiByb290OiAiIDw8
ICZyb290KCkpOwotCi0gICAgY29sbGVjdE91dE9mRmxvd0Rlc2NlbmRhbnRzSWZOZWVkZWQoKTsK
LQotICAgIGF1dG8gY29uc3RyYWludHNGb3JMYXlvdXRCb3ggPSBbJl0gKGNvbnN0IGF1dG8mIG91
dE9mRmxvd0JveCkgewotICAgICAgICBhdXRvJiBjb250YWluaW5nQmxvY2sgPSBvdXRPZkZsb3dC
b3guY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgIHJldHVybiAmY29udGFpbmluZ0Jsb2NrID09
ICZyb290KCkgPyBjb25zdHJhaW50cyA6IGdlb21ldHJ5KCkuY29uc3RyYWludHNGb3JPdXRPZkZs
b3dDb250ZW50KGNvbnRhaW5pbmdCbG9jayk7Ci0gICAgfTsKLQotICAgIGZvciAoYXV0byYgb3V0
T2ZGbG93Qm94IDogZm9ybWF0dGluZ1N0YXRlKCkub3V0T2ZGbG93Qm94ZXMoKSkgewotICAgICAg
ICBBU1NFUlQob3V0T2ZGbG93Qm94LT5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOwot
ICAgICAgICBpZiAoIWludmFsaWRhdGlvblN0YXRlLm5lZWRzTGF5b3V0KCpvdXRPZkZsb3dCb3gp
KQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tD
b25zdHJhaW50cyA9IGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94KCpvdXRPZkZsb3dCb3gpOwotICAg
ICAgICBhdXRvIGhvcml6b250YWxDb25zdHJhaW50c0ZvckJvcmRlckFuZFBhZGRpbmcgPSBIb3Jp
em9udGFsQ29uc3RyYWludHMgeyBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cy5ob3Jpem9udGFs
LmxvZ2ljYWxMZWZ0LCBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cy5ib3JkZXJBbmRQYWRkaW5n
Q29uc3RyYWludHMgfTsKLSAgICAgICAgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoKm91dE9mRmxv
d0JveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzRm9yQm9yZGVyQW5kUGFkZGluZyk7Ci0KLSAgICAg
ICAgY29tcHV0ZU91dE9mRmxvd0hvcml6b250YWxHZW9tZXRyeSgqb3V0T2ZGbG93Qm94LCBjb250
YWluaW5nQmxvY2tDb25zdHJhaW50cyk7Ci0gICAgICAgIGF1dG8gb3V0T2ZGbG93Qm94SGFzQ29u
dGVudCA9IGlzPENvbnRhaW5lckJveD4oKm91dE9mRmxvd0JveCkgJiYgZG93bmNhc3Q8Q29udGFp
bmVyQm94Pigqb3V0T2ZGbG93Qm94KS5oYXNDaGlsZCgpOwotICAgICAgICBpZiAob3V0T2ZGbG93
Qm94SGFzQ29udGVudCkgewotICAgICAgICAgICAgYXV0byYgY29udGFpbmVyQm94ID0gZG93bmNh
c3Q8Q29udGFpbmVyQm94Pigqb3V0T2ZGbG93Qm94KTsKLSAgICAgICAgICAgIGF1dG8gZm9ybWF0
dGluZ0NvbnRleHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjb250
YWluZXJCb3gsIGxheW91dFN0YXRlKCkpOwotICAgICAgICAgICAgaWYgKGNvbnRhaW5lckJveC5o
YXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKLSAgICAgICAgICAgICAgICBmb3JtYXR0aW5nQ29u
dGV4dC0+bGF5b3V0SW5GbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5j
b25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7Ci0gICAgICAgICAgICBj
b21wdXRlT3V0T2ZGbG93VmVydGljYWxHZW9tZXRyeShjb250YWluZXJCb3gsIGNvbnRhaW5pbmdC
bG9ja0NvbnN0cmFpbnRzKTsKLSAgICAgICAgICAgIGZvcm1hdHRpbmdDb250ZXh0LT5sYXlvdXRP
dXRPZkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBnZW9tZXRyeSgpLmNvbnN0cmFpbnRz
Rm9yT3V0T2ZGbG93Q29udGVudChjb250YWluZXJCb3gpKTsKLSAgICAgICAgfSBlbHNlCi0gICAg
ICAgICAgICBjb21wdXRlT3V0T2ZGbG93VmVydGljYWxHZW9tZXRyeSgqb3V0T2ZGbG93Qm94LCBj
b250YWluaW5nQmxvY2tDb25zdHJhaW50cyk7Ci0gICAgfQotICAgIExPR19XSVRIX1NUUkVBTShG
b3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJFbmQ6IGxheW91dCBvdXQtb2YtZmxv
dyBjb250ZW50IC0+IGNvbnRleHQ6ICIgPDwgJmxheW91dFN0YXRlKCkgPDwgIiByb290OiAiIDw8
ICZyb290KCkpOwotfQotCi1jb25zdCBCb3hHZW9tZXRyeSYgRm9ybWF0dGluZ0NvbnRleHQ6Omdl
b21ldHJ5Rm9yQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBPcHRpb25hbDxFc2NhcGVSZWFzb24+
IGVzY2FwZVJlYXNvbikgY29uc3QKLXsKLSAgICBVTlVTRURfUEFSQU0oZXNjYXBlUmVhc29uKTsK
LSNpZiBBU1NFUlRfRU5BQkxFRAotICAgIGF1dG8gaXNPa1RvQWNjZXNzQm94R2VvbWV0cnkgPSBb
Jl0gewotICAgICAgICBpZiAoIWlzPEluaXRpYWxDb250YWluaW5nQmxvY2s+KGxheW91dEJveCkg
JiYgJmxheW91dEJveC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKSA9PSAmcm9vdCgpKSB7Ci0gICAg
ICAgICAgICAvLyBUaGlzIGlzIHRoZSBub24tZXNjYXBlIGNhc2Ugb2YgYWNjZXNzaW5nIGEgYm94
J3MgZ2VvbWV0cnkgaW5mb3JtYXRpb24gd2l0aGluIHRoZSBzYW1lIGZvcm1hdHRpbmcgY29udGV4
dC4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFl
c2NhcGVSZWFzb24pIHsKLSAgICAgICAgICAgIC8vIEFueSBnZW9tZXRyeSBhY2Nlc3Mgb3V0c2lk
ZSBvZiB0aGUgZm9ybWF0dGluZyBjb250ZXh0IHdpdGhvdXQgYSB2YWxpZCByZWFzb24gaXMgY29u
c2lkZXJlZCBhbiBlc2NhcGUuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAoKmVzY2FwZVJlYXNvbiA9PSBFc2NhcGVSZWFzb246OkRvY3VtZW50Qm94
U3RyZXRjaGVzVG9WaWV3cG9ydFF1aXJrKSB7Ci0gICAgICAgICAgICBBU1NFUlQobGF5b3V0U3Rh
dGUoKS5pblF1aXJrc01vZGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gaXM8SW5pdGlhbENvbnRh
aW5pbmdCbG9jaz4obGF5b3V0Qm94KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgqZXNjYXBl
UmVhc29uID09IEVzY2FwZVJlYXNvbjo6Qm9keVN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaykgewot
ICAgICAgICAgICAgQVNTRVJUKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpOwotICAgICAg
ICAgICAgcmV0dXJuIGlzPEluaXRpYWxDb250YWluaW5nQmxvY2s+KGxheW91dEJveCkgfHwgbGF5
b3V0Qm94LmlzRG9jdW1lbnRCb3goKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCplc2Nh
cGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpUYWJsZVF1aXJrTmVlZHNHZW9tZXRyeUZyb21Fc3Rh
Ymxpc2hlZEZvcm1hdHRpbmdDb250ZXh0KSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBj
YXNlIHdoZW4gdGhlIHRhYmxlIGZvcm1hdHRpbmcgcm9vdCBjb2xsZWN0cyBnZW9tZXRyeSBpbmZv
cm1hdGlvbiBmcm9tIHRoZSBjZWxsJ3MKLSAgICAgICAgICAgIC8vIGZvcm1hdHRpbmcgY29udGV4
dCB0byBiZSBhYmxlIHRvIGRldGVybWluZSB3aWR0aC9oZWlnaHQuIHNlZSBzaG91bGRJZ25vcmVD
aGlsZENvbnRlbnRWZXJ0aWNhbE1hcmdpbgotICAgICAgICAgICAgQVNTRVJUKHJvb3QoKS5lc3Rh
Ymxpc2hlc1RhYmxlRm9ybWF0dGluZ0NvbnRleHQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gJmxh
eW91dEJveC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKS5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKSA9
PSAmcm9vdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCplc2NhcGVSZWFzb24gPT0gRXNj
YXBlUmVhc29uOjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5KSB7Ci0gICAgICAgICAg
ICAvLyBXaGVuIGNvbXB1dGluZyB0aGUgc3RhdGljIHBvc2l0aW9uIG9mIGFuIG91dC1vZi1mbG93
IGJveCwgd2UgbmVlZCB0byBnYXRoZXIgc2libGluZy9wYXJlbnQgZ2VvbWV0cnkgaW5mb3JtYXRp
b24KLSAgICAgICAgICAgIC8vIGFzIGlmIHRoZSBvdXQtb2YtZmxvdyBib3ggd2FzIGEgc2ltcGxl
IGluZmxvdyBib3guCi0gICAgICAgICAgICAvLyBOb3cgc2luY2UgdGhlIG91dC1vZi1mbG93IGFu
ZCB0aGUgc2libGluZy9wYXJlbnQgYm94ZXMgY291bGQgdmVyeSB3ZWxsIGJlIGluIGRpZmZlcmVu
dCBjb250YWluaW5nIGJsb2NrIHN1YnRyZWVzCi0gICAgICAgICAgICAvLyB0aGUgZm9ybWF0dGlu
ZyBjb250ZXh0IHRoZXkgbGl2ZSBpbiBjb3VsZCBhbHNvIGJlIHZlcnkgZGlmZmVyZW50LgotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKmVzY2FwZVJl
YXNvbiA9PSBFc2NhcGVSZWFzb246OkZsb2F0Qm94SXNBbHdheXNSZWxhdGl2ZVRvRmxvYXRTdGF0
ZVJvb3QpIHsKLSAgICAgICAgICAgIC8vIEZsb2F0IGJveCB0b3AvbGVmdCB2YWx1ZXMgYXJlIG1h
cHBlZCByZWxhdGl2ZSB0byB0aGUgRmxvYXRTdGF0ZSdzIHJvb3QuIElubGluZSBmb3JtYXR0aW5n
IGNvbnRleHRzKEEpIGluaGVyaXQgZmxvYXRzIGZyb20gcGFyZW50Ci0gICAgICAgICAgICAvLyBi
bG9jayBmb3JtYXR0aW5nIGNvbnRleHRzKEIpLiBGbG9hdHMgaW4gdGhlc2UgaW5saW5lIGZvcm1h
dHRpbmcgY29udGV4dHMoQSkgbmVlZCB0byBiZSBtYXBwZWQgdG8gdGhlIHBhcmVudCwgYmxvY2sg
Zm9ybWF0dGluZyBjb250ZXh0KEIpLgotICAgICAgICAgICAgYXV0byYgZm9ybWF0dGluZ0NvbnRl
eHRSb290ID0gbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpOwotICAgICAgICAgICAg
cmV0dXJuICZmb3JtYXR0aW5nQ29udGV4dFJvb3QgPT0gJnJvb3QoKSB8fCAmZm9ybWF0dGluZ0Nv
bnRleHRSb290ID09ICZyb290KCkuZm9ybWF0dGluZ0NvbnRleHRSb290KCk7Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAoKmVzY2FwZVJlYXNvbiA9PSBFc2NhcGVSZWFzb246OkZpbmRGaXhlZEhl
aWdodEFuY2VzdG9yUXVpcmspIHsKLSAgICAgICAgICAgIEFTU0VSVChsYXlvdXRTdGF0ZSgpLmlu
UXVpcmtzTW9kZSgpKTsKLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGNvbnRhaW5pbmcg
YmxvY2sgd2l0aCBmaXhlZCBoZWlnaHQgcXVpcmsuIFNlZSBRdWlya3M6OmhlaWdodFZhbHVlT2ZO
ZWFyZXN0Q29udGFpbmluZ0Jsb2NrV2l0aEZpeGVkSGVpZ2h0LgotICAgICAgICAgICAgLy8gVGhp
cyBpcyBvbmx5IHRvIGNoZWNrIGlmIHRoZSB0YXJnZXRGb3JtYXR0aW5nUm9vdCBpcyBhbiBhbmNl
c3RvciBmb3JtYXR0aW5nIHJvb3QuCi0gICAgICAgICAgICBpZiAoaXM8SW5pdGlhbENvbnRhaW5p
bmdCbG9jaz4obGF5b3V0Qm94KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgICAgIGF1dG8mIHRhcmdldEZvcm1hdHRpbmdSb290ID0gbGF5b3V0Qm94LmZvcm1hdHRpbmdD
b250ZXh0Um9vdCgpOwotICAgICAgICAgICAgYXV0byogYW5jZXN0b3JGb3JtYXR0aW5nQ29udGV4
dFJvb3QgPSAmcm9vdCgpLmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpOwotICAgICAgICAgICAgd2hp
bGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoJnRhcmdldEZvcm1hdHRpbmdSb290ID09
IGFuY2VzdG9yRm9ybWF0dGluZ0NvbnRleHRSb290KQotICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhbmNlc3RvckZvcm1hdHRpbmdDb250ZXh0Um9vdCA9
ICZhbmNlc3RvckZvcm1hdHRpbmdDb250ZXh0Um9vdC0+Zm9ybWF0dGluZ0NvbnRleHRSb290KCk7
Ci0gICAgICAgICAgICAgICAgaWYgKGlzPEluaXRpYWxDb250YWluaW5nQmxvY2s+KCphbmNlc3Rv
ckZvcm1hdHRpbmdDb250ZXh0Um9vdCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpUYWJsZU5lZWRzQWNj
ZXNzVG9UYWJsZVdyYXBwZXIpIHsKLSAgICAgICAgICAgIC8vIFRhYmxlcyBhcmUgd3JhcHBlZCBp
biBhIDIgbGV2ZWwgZm9ybWF0dGluZyBjb250ZXh0IHN0cnVjdHVyZS4gQSA8dGFibGU+IGVsZW1l
bnQgaW5pdGlhdGVzIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IGZvciBpdHMgcHJpbmNpcGFs
IHRhYmxlIGJveAotICAgICAgICAgICAgLy8gd2hlcmUgdGhlIGNhcHRpb24gYW5kIHRoZSB0YWJs
ZSBjb250ZW50IGxpdmUuIEl0IGFsc28gaW5pdGlhdGVzIGEgdGFibGUgd3JhcHBlciBib3ggd2hp
Y2ggZXN0YWJsaXNoZXMgdGhlIHRhYmxlIGZvcm1hdHRpbmcgY29udGV4dC4KLSAgICAgICAgICAg
IC8vIEluIG1hbnkgY2FzZXMgdGhlIFRGQyBuZWVkcyBhY2Nlc3MgdG8gdGhlIHBhcmVudCAoZ2Vu
ZXJhdGVkKSBCRkMuCi0gICAgICAgICAgICByZXR1cm4gJmxheW91dEJveCA9PSAmcm9vdCgpLmZv
cm1hdHRpbmdDb250ZXh0Um9vdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9OwotI2VuZGlmCi0gICAgQVNT
RVJUKGlzT2tUb0FjY2Vzc0JveEdlb21ldHJ5KCkpOwotICAgIEFTU0VSVChsYXlvdXRTdGF0ZSgp
Lmhhc0JveEdlb21ldHJ5KGxheW91dEJveCkpOwotICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmdl
b21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci19Ci0KLXZvaWQgRm9ybWF0dGluZ0NvbnRleHQ6OmNv
bGxlY3RPdXRPZkZsb3dEZXNjZW5kYW50c0lmTmVlZGVkKCkKLXsKLSAgICBpZiAoIWZvcm1hdHRp
bmdTdGF0ZSgpLm91dE9mRmxvd0JveGVzKCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0g
ICAgYXV0byYgcm9vdCA9IHRoaXMtPnJvb3QoKTsKLSAgICBpZiAoIXJvb3QuaGFzQ2hpbGQoKSkK
LSAgICAgICAgcmV0dXJuOwotICAgIGlmICghcm9vdC5pc1Bvc2l0aW9uZWQoKSAmJiAhaXM8SW5p
dGlhbENvbnRhaW5pbmdCbG9jaz4ocm9vdCkpCi0gICAgICAgIHJldHVybjsKLSAgICAvLyBDb2xs
ZWN0IHRoZSBvdXQtb2YtZmxvdyBkZXNjZW5kYW50cyBhdCB0aGUgZm9ybWF0dGluZyByb290IGxl
dmVsIChhcyBvcHBvc2VkIHRvIGF0IHRoZSBjb250YWluaW5nIGJsb2NrIGxldmVsLCB0aG91Z2gg
dGhleSBtaWdodCBiZSB0aGUgc2FtZSkuCi0gICAgLy8gRklYTUU6IFR1cm4gdGhpcyBpbnRvIGEg
cmVnaXN0ZXItc2VsZiBhcyBib3hlcyBhcmUgYmVpbmcgaW5zZXJ0ZWQuCi0gICAgZm9yIChhdXRv
JiBkZXNjZW5kYW50IDogZGVzY2VuZGFudHNPZlR5cGU8Qm94Pihyb290KSkgewotICAgICAgICBp
ZiAoIWRlc2NlbmRhbnQuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgaWYgKCZkZXNjZW5kYW50LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpICE9
ICZyb290KQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGZvcm1hdHRpbmdTdGF0ZSgp
LmFkZE91dE9mRmxvd0JveChkZXNjZW5kYW50KTsKLSAgICB9Ci19Ci0KLSNpZm5kZWYgTkRFQlVH
Ci12b2lkIEZvcm1hdHRpbmdDb250ZXh0Ojp2YWxpZGF0ZUdlb21ldHJ5Q29uc3RyYWludHNBZnRl
ckxheW91dCgpIGNvbnN0Ci17Ci0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHRSb290ID0gcm9v
dCgpOwotICAgIC8vIEZJWE1FOiBhZGQgYSBkZXNjZW5kYW50c09mVHlwZTw+IGZsYXZvciB0aGF0
IHN0b3BzIGF0IG5lc3RlZCBmb3JtYXR0aW5nIGNvbnRleHRzCi0gICAgZm9yIChhdXRvJiBsYXlv
dXRCb3ggOiBkZXNjZW5kYW50c09mVHlwZTxCb3g+KGZvcm1hdHRpbmdDb250ZXh0Um9vdCkpIHsK
LSAgICAgICAgaWYgKCZsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCkgIT0gJmZvcm1h
dHRpbmdDb250ZXh0Um9vdCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBhdXRvJiBj
b250YWluaW5nQmxvY2tHZW9tZXRyeSA9IGdlb21ldHJ5Rm9yQm94KGxheW91dEJveC5jb250YWlu
aW5nQmxvY2soKSk7Ci0gICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZ2VvbWV0cnlGb3JCb3go
bGF5b3V0Qm94KTsKLQotICAgICAgICAvLyAxMC4zLjMgQmxvY2stbGV2ZWwsIG5vbi1yZXBsYWNl
ZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdwotICAgICAgICAvLyAxMC4zLjcgQWJzb2x1dGVseSBw
b3NpdGlvbmVkLCBub24tcmVwbGFjZWQgZWxlbWVudHMKLSAgICAgICAgaWYgKChsYXlvdXRCb3gu
aXNCbG9ja0xldmVsQm94KCkgfHwgbGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKSAm
JiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkgewotICAgICAgICAgICAgLy8gbWFyZ2luLWxl
ZnQgKyBib3JkZXItbGVmdC13aWR0aCArIHBhZGRpbmctbGVmdCArIHdpZHRoICsgcGFkZGluZy1y
aWdodCArIGJvcmRlci1yaWdodC13aWR0aCArIG1hcmdpbi1yaWdodCA9IHdpZHRoIG9mIGNvbnRh
aW5pbmcgYmxvY2sKLSAgICAgICAgICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBjb250
YWluaW5nQmxvY2tHZW9tZXRyeS5jb250ZW50Qm94V2lkdGgoKTsKLSAgICAgICAgICAgIEFTU0VS
VChib3hHZW9tZXRyeS5ob3Jpem9udGFsTWFyZ2luQm9yZGVyQW5kUGFkZGluZygpICsgYm94R2Vv
bWV0cnkuY29udGVudEJveFdpZHRoKCkgPT0gY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgLy8gMTAuNi40IEFic29sdXRlbHkgcG9zaXRpb25lZCwgbm9uLXJlcGxh
Y2VkIGVsZW1lbnRzCi0gICAgICAgIGlmIChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVk
KCkgJiYgIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpIHsKLSAgICAgICAgICAgIC8vIHRvcCAr
IG1hcmdpbi10b3AgKyBib3JkZXItdG9wLXdpZHRoICsgcGFkZGluZy10b3AgKyBoZWlnaHQgKyBw
YWRkaW5nLWJvdHRvbSArIGJvcmRlci1ib3R0b20td2lkdGggKyBtYXJnaW4tYm90dG9tICsgYm90
dG9tID0gaGVpZ2h0IG9mIGNvbnRhaW5pbmcgYmxvY2sKLSAgICAgICAgICAgIGF1dG8gY29udGFp
bmluZ0Jsb2NrSGVpZ2h0ID0gY29udGFpbmluZ0Jsb2NrR2VvbWV0cnkuY29udGVudEJveEhlaWdo
dCgpOwotICAgICAgICAgICAgQVNTRVJUKEJveEdlb21ldHJ5Ojpib3JkZXJCb3hUb3AoYm94R2Vv
bWV0cnkpICsgYm94R2VvbWV0cnkubWFyZ2luQmVmb3JlKCkgKyBib3hHZW9tZXRyeS5ib3JkZXJU
b3AoKSArIGJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKDApICsgYm94R2VvbWV0cnku
Y29udGVudEJveEhlaWdodCgpCi0gICAgICAgICAgICAgICAgKyBib3hHZW9tZXRyeS5wYWRkaW5n
Qm90dG9tKCkudmFsdWVPcigwKSArIGJveEdlb21ldHJ5LmJvcmRlckJvdHRvbSgpICsgYm94R2Vv
bWV0cnkubWFyZ2luQWZ0ZXIoKSA9PSBjb250YWluaW5nQmxvY2tIZWlnaHQpOwotICAgICAgICB9
Ci0gICAgfQotfQotI2VuZGlmCi0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Rm9ybWF0dGluZ0NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExMDI1
NTg4ZWM0YTAzZDllMzVhMGFjOTMwYTc3NmM2MjNmODQ0NC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRm9ybWF0dGlu
Z0NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
Ci0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAq
Ci0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQot
I3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQot
I2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgotI2luY2x1ZGUgIkxheW91dFVuaXQuaCIK
LSNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLSNp
bmNsdWRlIDx3dGYvV2Vha1B0ci5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIExh
eW91dFNpemU7Ci1zdHJ1Y3QgTGVuZ3RoOwotCi1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3Mg
Qm94R2VvbWV0cnk7Ci1jbGFzcyBSZXBsYWNlZEJveDsKLXN0cnVjdCBDb21wdXRlZEhvcml6b250
YWxNYXJnaW47Ci1zdHJ1Y3QgQ29tcHV0ZWRWZXJ0aWNhbE1hcmdpbjsKLWNsYXNzIENvbnRhaW5l
ckJveDsKLXN0cnVjdCBDb250ZW50SGVpZ2h0QW5kTWFyZ2luOwotc3RydWN0IENvbnRlbnRXaWR0
aEFuZE1hcmdpbjsKLXN0cnVjdCBFZGdlczsKLWNsYXNzIEZvcm1hdHRpbmdTdGF0ZTsKLXN0cnVj
dCBIb3Jpem9udGFsR2VvbWV0cnk7Ci1jbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKLWNsYXNzIExh
eW91dFN0YXRlOwotc3RydWN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzOwotc3RydWN0IE92
ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlczsKLXN0cnVjdCBWZXJ0aWNhbEdlb21ldHJ5OwotCi1jbGFz
cyBGb3JtYXR0aW5nQ29udGV4dCB7Ci0gICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChGb3JtYXR0
aW5nQ29udGV4dCk7Ci1wdWJsaWM6Ci0gICAgRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFp
bmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEZvcm1hdHRpbmdTdGF0ZSYpOwotICAgIHZp
cnR1YWwgfkZvcm1hdHRpbmdDb250ZXh0KCk7Ci0KLSAgICBzdHJ1Y3QgQ29uc3RyYWludHNGb3JJ
bkZsb3dDb250ZW50IHsKLSAgICAgICAgSG9yaXpvbnRhbENvbnN0cmFpbnRzIGhvcml6b250YWw7
Ci0gICAgICAgIFZlcnRpY2FsQ29uc3RyYWludHMgdmVydGljYWw7Ci0gICAgfTsKLSAgICB2aXJ0
dWFsIHZvaWQgbGF5b3V0SW5GbG93Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENv
bnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpID0gMDsKLQotICAgIHN0cnVjdCBDb25zdHJhaW50
c0Zvck91dE9mRmxvd0NvbnRlbnQgewotICAgICAgICBIb3Jpem9udGFsQ29uc3RyYWludHMgaG9y
aXpvbnRhbDsKLSAgICAgICAgVmVydGljYWxDb25zdHJhaW50cyB2ZXJ0aWNhbDsKLSAgICAgICAg
Ly8gQm9yZGVycyBhbmQgcGFkZGluZyBhcmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgY29udGFpbmlu
ZyBibG9jaydzIGNvbnRlbnQgYm94IGFzIGlmIHRoZSBib3ggd2FzIGFuIGluLWZsb3cgYm94Lgot
ICAgICAgICBMYXlvdXRVbml0IGJvcmRlckFuZFBhZGRpbmdDb25zdHJhaW50czsKLSAgICB9Owot
ICAgIHZvaWQgbGF5b3V0T3V0T2ZGbG93Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0
IENvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCYpOwotCi0gICAgc3RydWN0IEludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMgewotICAgICAgICB2b2lkIGV4cGFuZChMYXlvdXRVbml0IGhvcml6
b250YWxWYWx1ZSk7Ci0gICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIG9wZXJhdG9y
Kz0oY29uc3QgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYpOwotICAgICAgICBJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzJiBvcGVyYXRvcis9KExheW91dFVuaXQpOwotICAgICAgICBJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzJiBvcGVyYXRvci09KGNvbnN0IEludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMmKTsKLSAgICAgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3BlcmF0b3ItPShM
YXlvdXRVbml0KTsKLQotICAgICAgICBMYXlvdXRVbml0IG1pbmltdW07Ci0gICAgICAgIExheW91
dFVuaXQgbWF4aW11bTsKLSAgICB9OwotICAgIHZpcnR1YWwgSW50cmluc2ljV2lkdGhDb25zdHJh
aW50cyBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSA9IDA7Ci0gICAgdmlydHVh
bCBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3QgPSAwOwotCi0gICAgYm9vbCBp
c0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiByb290KCkuZXN0YWJsaXNo
ZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCk7IH0KLSAgICBib29sIGlzSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQoKSBjb25zdCB7IHJldHVybiByb290KCkuZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCgpOyB9Ci0gICAgYm9vbCBpc1RhYmxlRm9ybWF0dGluZ0NvbnRleHQoKSBjb25z
dCB7IHJldHVybiByb290KCkuZXN0YWJsaXNoZXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCk7IH0K
LSAgICBib29sIGlzVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsg
cmV0dXJuIGlzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpICYmIHJvb3QoKS5pc1RhYmxlV3JhcHBl
ckJveCgpOyB9Ci0gICAgYm9vbCBpc0ZsZXhGb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0
dXJuIHJvb3QoKS5lc3RhYmxpc2hlc0ZsZXhGb3JtYXR0aW5nQ29udGV4dCgpOyB9Ci0KLSAgICBl
bnVtIGNsYXNzIEVzY2FwZVJlYXNvbiB7Ci0gICAgICAgIFRhYmxlUXVpcmtOZWVkc0dlb21ldHJ5
RnJvbUVzdGFibGlzaGVkRm9ybWF0dGluZ0NvbnRleHQsCi0gICAgICAgIE91dE9mRmxvd0JveE5l
ZWRzSW5GbG93R2VvbWV0cnksCi0gICAgICAgIEZsb2F0Qm94SXNBbHdheXNSZWxhdGl2ZVRvRmxv
YXRTdGF0ZVJvb3QsCi0gICAgICAgIEZpbmRGaXhlZEhlaWdodEFuY2VzdG9yUXVpcmssCi0gICAg
ICAgIERvY3VtZW50Qm94U3RyZXRjaGVzVG9WaWV3cG9ydFF1aXJrLAotICAgICAgICBCb2R5U3Ry
ZXRjaGVzVG9WaWV3cG9ydFF1aXJrLAotICAgICAgICBUYWJsZU5lZWRzQWNjZXNzVG9UYWJsZVdy
YXBwZXIKLSAgICB9OwotICAgIGNvbnN0IEJveEdlb21ldHJ5JiBnZW9tZXRyeUZvckJveChjb25z
dCBCb3gmLCBPcHRpb25hbDxFc2NhcGVSZWFzb24+ID0gV1RGOjpudWxsb3B0KSBjb25zdDsKLSAg
ICBjb25zdCBDb250YWluZXJCb3gmIHJvb3QoKSBjb25zdCB7IHJldHVybiAqbV9yb290OyB9Ci0K
LSAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAg
IHVzaW5nIExheW91dFF1ZXVlID0gVmVjdG9yPGNvbnN0IEJveCo+OwotCi0gICAgY29uc3QgRm9y
bWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2Zvcm1hdHRp
bmdTdGF0ZTsgfQotICAgIEZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKCkgeyByZXR1
cm4gbV9mb3JtYXR0aW5nU3RhdGU7IH0KLQotICAgIHZvaWQgY29tcHV0ZUJvcmRlckFuZFBhZGRp
bmcoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7Ci0KLSNpZm5kZWYg
TkRFQlVHCi0gICAgdmlydHVhbCB2b2lkIHZhbGlkYXRlR2VvbWV0cnlDb25zdHJhaW50c0FmdGVy
TGF5b3V0KCkgY29uc3Q7Ci0jZW5kaWYKLQotICAgIC8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBn
ZW5lcmljIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcuCi0gICAgY2xhc3MgR2VvbWV0cnkgewotICAg
IHB1YmxpYzoKLSAgICAgICAgVmVydGljYWxHZW9tZXRyeSBvdXRPZkZsb3dWZXJ0aWNhbEdlb21l
dHJ5KGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IFZlcnRp
Y2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKSBjb25zdDsK
LSAgICAgICAgSG9yaXpvbnRhbEdlb21ldHJ5IG91dE9mRmxvd0hvcml6b250YWxHZW9tZXRyeShj
b25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBWZXJ0aWNhbENv
bnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKLQotICAgICAg
ICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGZsb2F0aW5nQ29udGVudEhlaWdodEFuZE1hcmdpbihj
b25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVu
VmVydGljYWxWYWx1ZXMmKSBjb25zdDsKLSAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGZs
b2F0aW5nQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0KLSAgICAg
ICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRN
YXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBP
cHRpb25hbDxWZXJ0aWNhbENvbnN0cmFpbnRzPiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFs
dWVzJikgY29uc3Q7Ci0gICAgICAgIENvbnRlbnRXaWR0aEFuZE1hcmdpbiBpbmxpbmVSZXBsYWNl
ZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYsIE9wdGlvbmFsPFZlcnRpY2FsQ29uc3RyYWludHM+LCBjb25zdCBPdmVy
cmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYpOwotCi0gICAgICAgIExheW91dFNpemUgaW5GbG93UG9z
aXRpb25lZFBvc2l0aW9uT2Zmc2V0KGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYpIGNvbnN0OwotCi0gICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gY29tcGxpY2F0
ZWRDYXNlcyhjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBP
dmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKSBjb25zdDsKLSAgICAgICAgTGF5b3V0VW5pdCBzaHJp
bmtUb0ZpdFdpZHRoKGNvbnN0IEJveCYsIExheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgpOwotCi0g
ICAgICAgIEVkZ2VzIGNvbXB1dGVkQm9yZGVyKGNvbnN0IEJveCYpIGNvbnN0OwotICAgICAgICBP
cHRpb25hbDxFZGdlcz4gY29tcHV0ZWRQYWRkaW5nKGNvbnN0IEJveCYsIExheW91dFVuaXQgY29u
dGFpbmluZ0Jsb2NrV2lkdGgpIGNvbnN0OwotCi0gICAgICAgIENvbXB1dGVkSG9yaXpvbnRhbE1h
cmdpbiBjb21wdXRlZEhvcml6b250YWxNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJikgY29uc3Q7Ci0gICAgICAgIENvbXB1dGVkVmVydGljYWxNYXJnaW4gY29t
cHV0ZWRWZXJ0aWNhbE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmKSBjb25zdDsKLQotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZFZhbHVl
KGNvbnN0IExlbmd0aCYgZ2VvbWV0cnlQcm9wZXJ0eSwgTGF5b3V0VW5pdCBjb250YWluaW5nQmxv
Y2tXaWR0aCkgY29uc3Q7Ci0gICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGZpeGVkVmFsdWUo
Y29uc3QgTGVuZ3RoJiBnZW9tZXRyeVByb3BlcnR5KSBjb25zdDsKLQotICAgICAgICBPcHRpb25h
bDxMYXlvdXRVbml0PiBjb21wdXRlZE1pbkhlaWdodChjb25zdCBCb3gmLCBPcHRpb25hbDxMYXlv
dXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBXVEY6Om51bGxvcHQpIGNvbnN0OwotICAg
ICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZE1heEhlaWdodChjb25zdCBCb3gmLCBP
cHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBXVEY6Om51bGxvcHQp
IGNvbnN0OwotCi0gICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbXB1dGVkTWluV2lkdGgo
Y29uc3QgQm94JiwgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0gICAgICAgIE9w
dGlvbmFsPExheW91dFVuaXQ+IGNvbXB1dGVkTWF4V2lkdGgoY29uc3QgQm94JiwgTGF5b3V0VW5p
dCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0KLSAgICAgICAgRm9ybWF0dGluZ0NvbnRleHQ6Oklu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29uc3RyYWluQnlNaW5NYXhXaWR0aChjb25zdCBCb3gm
LCBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKSBjb25zdDsKLQotICAgICAgICBMYXlvdXRVbml0
IGNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QoY29uc3QgQ29udGFpbmVyQm94
JikgY29uc3Q7Ci0KLSAgICAgICAgQ29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50IGNvbnN0
cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudChjb25zdCBDb250YWluZXJCb3gmKTsKLSAgICAgICAg
Q29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IGNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChj
b25zdCBDb250YWluZXJCb3gmLCBPcHRpb25hbDxFc2NhcGVSZWFzb24+ID0gV1RGOjpudWxsb3B0
KTsKLQotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZEhlaWdodChjb25zdCBC
b3gmLCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBXVEY6Om51
bGxvcHQpIGNvbnN0OwotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZFdpZHRo
KGNvbnN0IEJveCYsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotCi0gICAgcHJv
dGVjdGVkOgotICAgICAgICBmcmllbmQgY2xhc3MgRm9ybWF0dGluZ0NvbnRleHQ7Ci0gICAgICAg
IEdlb21ldHJ5KGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0Jik7Ci0KLSAgICAgICAgY29uc3QgTGF5
b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9mb3JtYXR0aW5nQ29udGV4
dC5sYXlvdXRTdGF0ZSgpOyB9Ci0gICAgICAgIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIHsg
cmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQotICAgICAgICBjb25z
dCBGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBt
X2Zvcm1hdHRpbmdDb250ZXh0OyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBWZXJ0aWNhbEdl
b21ldHJ5IG91dE9mRmxvd1JlcGxhY2VkVmVydGljYWxHZW9tZXRyeShjb25zdCBSZXBsYWNlZEJv
eCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWlu
dHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKSBjb25zdDsKLSAgICAgICAgSG9y
aXpvbnRhbEdlb21ldHJ5IG91dE9mRmxvd1JlcGxhY2VkSG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0
IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgVmVydGlj
YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0KLSAg
ICAgICAgVmVydGljYWxHZW9tZXRyeSBvdXRPZkZsb3dOb25SZXBsYWNlZFZlcnRpY2FsR2VvbWV0
cnkoY29uc3QgQ29udGFpbmVyQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29u
c3QgVmVydGljYWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYp
IGNvbnN0OwotICAgICAgICBIb3Jpem9udGFsR2VvbWV0cnkgb3V0T2ZGbG93Tm9uUmVwbGFjZWRI
b3Jpem9udGFsR2VvbWV0cnkoY29uc3QgQ29udGFpbmVyQm94JiwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKLQotICAgICAg
ICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGZsb2F0aW5nUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5k
TWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwg
Y29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7Ci0gICAgICAgIENvbnRlbnRX
aWR0aEFuZE1hcmdpbiBmbG9hdGluZ1JlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0
IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJp
ZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKLQotICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4g
ZmxvYXRpbmdOb25SZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVl
cyYpOwotCi0gICAgICAgIExheW91dFVuaXQgc3RhdGljVmVydGljYWxQb3NpdGlvbkZvck91dE9m
Rmxvd1Bvc2l0aW9uZWQoY29uc3QgQm94JiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYpIGNv
bnN0OwotICAgICAgICBMYXlvdXRVbml0IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbkZvck91dE9m
Rmxvd1Bvc2l0aW9uZWQoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJikg
Y29uc3Q7Ci0KLSAgICAgICAgZW51bSBjbGFzcyBIZWlnaHRUeXBlIHsgTWluLCBNYXgsIE5vcm1h
bCB9OwotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZEhlaWdodFZhbHVlKGNv
bnN0IEJveCYsIEhlaWdodFR5cGUsIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbnRhaW5pbmdCbG9j
a0hlaWdodCkgY29uc3Q7Ci0KLSAgICAgICAgZW51bSBjbGFzcyBXaWR0aFR5cGUgeyBNaW4sIE1h
eCwgTm9ybWFsIH07Ci0gICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbXB1dGVkV2lkdGhW
YWx1ZShjb25zdCBCb3gmLCBXaWR0aFR5cGUsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lk
dGgpOwotCi0gICAgICAgIGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0JiBtX2Zvcm1hdHRpbmdDb250
ZXh0OwotICAgIH07Ci0gICAgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkg
Y29uc3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMpOyB9Ci0KLSAgICBjbGFzcyBRdWlya3Mgewot
ICAgIHB1YmxpYzoKLSAgICAgICAgUXVpcmtzKGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0Jik7Ci0K
LSAgICAgICAgTGF5b3V0VW5pdCBoZWlnaHRWYWx1ZU9mTmVhcmVzdENvbnRhaW5pbmdCbG9ja1dp
dGhGaXhlZEhlaWdodChjb25zdCBCb3gmKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgY29u
c3QgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9mb3JtYXR0aW5n
Q29udGV4dC5sYXlvdXRTdGF0ZSgpOyB9Ci0gICAgICAgIExheW91dFN0YXRlJiBsYXlvdXRTdGF0
ZSgpIHsgcmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQotICAgICAg
ICBjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJl
dHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0OyB9Ci0KLSAgICAgICAgY29uc3QgRm9ybWF0dGluZ0Nv
bnRleHQmIG1fZm9ybWF0dGluZ0NvbnRleHQ7Ci0gICAgfTsKLSAgICBGb3JtYXR0aW5nQ29udGV4
dDo6UXVpcmtzIHF1aXJrcygpIGNvbnN0IHsgcmV0dXJuIFF1aXJrcygqdGhpcyk7IH0KLQotcHJp
dmF0ZToKLSAgICB2b2lkIGNvbGxlY3RPdXRPZkZsb3dEZXNjZW5kYW50c0lmTmVlZGVkKCk7Ci0g
ICAgdm9pZCBjb21wdXRlT3V0T2ZGbG93VmVydGljYWxHZW9tZXRyeShjb25zdCBCb3gmLCBjb25z
dCBDb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQmKTsKLSAgICB2b2lkIGNvbXB1dGVPdXRP
ZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkoY29uc3QgQm94JiwgY29uc3QgQ29uc3RyYWludHNGb3JP
dXRPZkZsb3dDb250ZW50Jik7Ci0KLSAgICBXZWFrUHRyPGNvbnN0IENvbnRhaW5lckJveD4gbV9y
b290OwotICAgIEZvcm1hdHRpbmdTdGF0ZSYgbV9mb3JtYXR0aW5nU3RhdGU7Ci19OwotCi1pbmxp
bmUgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpHZW9tZXRyeShjb25zdCBGb3JtYXR0aW5n
Q29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQpCi0gICAgOiBtX2Zvcm1hdHRpbmdDb250ZXh0KGZv
cm1hdHRpbmdDb250ZXh0KQotewotfQotCi1pbmxpbmUgRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJr
czo6UXVpcmtzKGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCkKLSAg
ICA6IG1fZm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHQpCi17Ci19Ci0KLWlubGlu
ZSB2b2lkIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOjpleHBh
bmQoTGF5b3V0VW5pdCBob3Jpem9udGFsVmFsdWUpCi17Ci0gICAgbWluaW11bSArPSBob3Jpem9u
dGFsVmFsdWU7Ci0gICAgbWF4aW11bSArPSBob3Jpem9udGFsVmFsdWU7Ci19Ci0KLWlubGluZSBG
b3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgRm9ybWF0dGluZ0Nv
bnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM6Om9wZXJhdG9yKz0oY29uc3QgSW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyYgb3RoZXIpCi17Ci0gICAgbWluaW11bSArPSBvdGhlci5taW5p
bXVtOwotICAgIG1heGltdW0gKz0gb3RoZXIubWF4aW11bTsKLSAgICByZXR1cm4gKnRoaXM7Ci19
Ci0KLWlubGluZSBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYg
Rm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM6Om9wZXJhdG9yKz0o
TGF5b3V0VW5pdCB2YWx1ZSkKLXsKLSAgICBleHBhbmQodmFsdWUpOwotICAgIHJldHVybiAqdGhp
czsKLX0KLQotaW5saW5lIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzJiBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50czo6b3BlcmF0
b3ItPShjb25zdCBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzJiBvdGhlcikKLXsKLSAgICBtaW5p
bXVtIC09IG90aGVyLm1pbmltdW07Ci0gICAgbWF4aW11bSAtPSBvdGhlci5tYXhpbXVtOwotICAg
IHJldHVybiAqdGhpczsKLX0KLQotaW5saW5lIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzJiBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJh
aW50czo6b3BlcmF0b3ItPShMYXlvdXRVbml0IHZhbHVlKQotewotICAgIGV4cGFuZCgtdmFsdWUp
OwotICAgIHJldHVybiAqdGhpczsKLX0KLQotfQotfQotCi0jZGVmaW5lIFNQRUNJQUxJWkVfVFlQ
RV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChUb1ZhbHVlVHlwZU5hbWUsIHByZWRp
Y2F0ZSkgXAotU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19CRUdJTihXZWJDb3JlOjpMYXlvdXQ6OlRv
VmFsdWVUeXBlTmFtZSkgXAotICAgIHN0YXRpYyBib29sIGlzVHlwZShjb25zdCBXZWJDb3JlOjpM
YXlvdXQ6OkZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCkgeyByZXR1cm4gZm9y
bWF0dGluZ0NvbnRleHQucHJlZGljYXRlOyB9IFwKLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfRU5E
KCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRm9ybWF0dGlu
Z0NvbnRleHRHZW9tZXRyeS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRm9ybWF0dGluZ0Nv
bnRleHRHZW9tZXRyeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjE5NjU3
YjhiZTcxOTlhYTNmZmMyMDZmNTcyMWE3MmNkNjJjODEuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdD
b250ZXh0R2VvbWV0cnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE2NSArMCwwIEBACi0vKgot
ICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAq
Ci0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
Ci0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0
LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUg
IkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdTdGF0ZS5o
IgotI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUu
aCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJMYXlvdXRD
b250ZXh0LmgiCi0jaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRhaW5pbmdCbG9jay5oIgotI2lu
Y2x1ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCi0jaW5jbHVkZSAiTG9nZ2luZy5oIgotI2luY2x1
ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVz
cGFjZSBMYXlvdXQgewotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNIZWlnaHRBdXRvKGNvbnN0IEJv
eCYgbGF5b3V0Qm94KQotewotICAgIC8vIDEwLjUgQ29udGVudCBoZWlnaHQ6IHRoZSAnaGVpZ2h0
JyBwcm9wZXJ0eQotICAgIC8vCi0gICAgLy8gVGhlIHBlcmNlbnRhZ2UgaXMgY2FsY3VsYXRlZCB3
aXRoIHJlc3BlY3QgdG8gdGhlIGhlaWdodCBvZiB0aGUgZ2VuZXJhdGVkIGJveCdzIGNvbnRhaW5p
bmcgYmxvY2suCi0gICAgLy8gSWYgdGhlIGhlaWdodCBvZiB0aGUgY29udGFpbmluZyBibG9jayBp
cyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHkgKGkuZS4sIGl0IGRlcGVuZHMgb24gY29udGVudCBo
ZWlnaHQpLAotICAgIC8vIGFuZCB0aGlzIGVsZW1lbnQgaXMgbm90IGFic29sdXRlbHkgcG9zaXRp
b25lZCwgdGhlIHVzZWQgaGVpZ2h0IGlzIGNhbGN1bGF0ZWQgYXMgaWYgJ2F1dG8nIHdhcyBzcGVj
aWZpZWQuCi0KLSAgICBhdXRvIGhlaWdodCA9IGxheW91dEJveC5zdHlsZSgpLmxvZ2ljYWxIZWln
aHQoKTsKLSAgICBpZiAoaGVpZ2h0LmlzQXV0bygpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQot
ICAgIGlmIChoZWlnaHQuaXNQZXJjZW50KCkpIHsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc091
dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAg
ICByZXR1cm4gIWxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5zdHlsZSgpLmxvZ2ljYWxIZWln
aHQoKS5pc0ZpeGVkKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1PcHRpb25h
bDxMYXlvdXRVbml0PiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkSGVpZ2h0
VmFsdWUoY29uc3QgQm94JiBsYXlvdXRCb3gsIEhlaWdodFR5cGUgaGVpZ2h0VHlwZSwgT3B0aW9u
YWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSBjb25zdAotewotICAgIGF1dG8m
IHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAgYXV0byBoZWlnaHQgPSBoZWlnaHRUeXBl
ID09IEhlaWdodFR5cGU6Ok5vcm1hbCA/IHN0eWxlLmxvZ2ljYWxIZWlnaHQoKSA6IGhlaWdodFR5
cGUgPT0gSGVpZ2h0VHlwZTo6TWluID8gc3R5bGUubG9naWNhbE1pbkhlaWdodCgpIDogc3R5bGUu
bG9naWNhbE1heEhlaWdodCgpOwotICAgIGlmIChoZWlnaHQuaXNVbmRlZmluZWQoKSB8fCBoZWln
aHQuaXNBdXRvKCkgfHwgaGVpZ2h0LmlzTWF4Q29udGVudCgpIHx8IGhlaWdodC5pc01pbkNvbnRl
bnQoKSB8fCBoZWlnaHQuaXNGaXRDb250ZW50KCkpCi0gICAgICAgIHJldHVybiB7IH07Ci0KLSAg
ICBpZiAoaGVpZ2h0LmlzRml4ZWQoKSkKLSAgICAgICAgcmV0dXJuIExheW91dFVuaXQgeyBoZWln
aHQudmFsdWUoKSB9OwotCi0gICAgaWYgKCFjb250YWluaW5nQmxvY2tIZWlnaHQpIHsKLSAgICAg
ICAgaWYgKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpCi0gICAgICAgICAgICBjb250YWlu
aW5nQmxvY2tIZWlnaHQgPSBmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJrcygpLmhlaWdodFZhbHVl
T2ZOZWFyZXN0Q29udGFpbmluZ0Jsb2NrV2l0aEZpeGVkSGVpZ2h0KGxheW91dEJveCk7Ci0gICAg
ICAgIGVsc2UgewotICAgICAgICAgICAgYXV0byBub25Bbm9ueW1vdXNDb250YWluaW5nQmxvY2tM
b2dpY2FsSGVpZ2h0ID0gWyZdIHsKLSAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBibG9jayBs
ZXZlbCBib3ggaXMgYSBkaXJlY3QgY2hpbGQgb2YgYW4gaW5saW5lIGxldmVsIGJveCAoPHNwYW4+
PGRpdj48L2Rpdj48L3NwYW4+KSBhbmQgd2Ugd3JhcCBpdCBpbnRvIGEgY29udGludWF0aW9uLAot
ICAgICAgICAgICAgICAgIC8vIHRoZSBjb250YWluaW5nIGJsb2NrIChhbm9ueW1vdXMgd3JhcHBl
cikgaXMgbm90IHRoZSBib3ggd2UgbmVlZCB0byBjaGVjayBmb3IgZml4ZWQgaGVpZ2h0LgotICAg
ICAgICAgICAgICAgIGF1dG8mIGluaXRpYWxDb250YWluaW5nQmxvY2sgPSBsYXlvdXRCb3guaW5p
dGlhbENvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byogY29udGFp
bmluZ0Jsb2NrID0gJmxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsgY29udGFpbmluZ0Jsb2Nr
ICE9ICZpbml0aWFsQ29udGFpbmluZ0Jsb2NrOyBjb250YWluaW5nQmxvY2sgPSAmY29udGFpbmlu
Z0Jsb2NrLT5jb250YWluaW5nQmxvY2soKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29u
dGFpbmluZ0Jsb2NrLT5pc0Fub255bW91cygpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluaW5nQmxvY2stPnN0eWxl
KCkubG9naWNhbEhlaWdodCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBy
ZXR1cm4gaW5pdGlhbENvbnRhaW5pbmdCbG9jay5zdHlsZSgpLmxvZ2ljYWxIZWlnaHQoKTsKLSAg
ICAgICAgICAgIH07Ci0gICAgICAgICAgICBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBmaXhlZFZh
bHVlKG5vbkFub255bW91c0NvbnRhaW5pbmdCbG9ja0xvZ2ljYWxIZWlnaHQoKSk7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBpZiAoIWNvbnRhaW5pbmdCbG9ja0hlaWdodCkKLSAgICAgICAgcmV0
dXJuIHsgfTsKLQotICAgIHJldHVybiB2YWx1ZUZvckxlbmd0aChoZWlnaHQsICpjb250YWluaW5n
QmxvY2tIZWlnaHQpOwotfQotCi1PcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0aW5nQ29udGV4
dDo6R2VvbWV0cnk6OmNvbXB1dGVkSGVpZ2h0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBPcHRpb25h
bDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF1
dG8gaGVpZ2h0ID0gY29tcHV0ZWRIZWlnaHRWYWx1ZShsYXlvdXRCb3gsIEhlaWdodFR5cGU6Ok5v
cm1hbCwgY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSkgewotICAgICAgICBpZiAobGF5b3V0Qm94LnN0
eWxlKCkuYm94U2l6aW5nKCkgPT0gQm94U2l6aW5nOjpDb250ZW50Qm94KQotICAgICAgICAgICAg
cmV0dXJuIGhlaWdodDsKLSAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29u
dGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0gICAgICAgIHJldHVybiAqaGVpZ2h0
IC0gKGJveEdlb21ldHJ5LnZlcnRpY2FsQm9yZGVyKCkgKyBib3hHZW9tZXRyeS52ZXJ0aWNhbFBh
ZGRpbmcoKS52YWx1ZU9yKDApKTsKLSAgICB9Ci0gICAgcmV0dXJuIHsgfTsKLX0KLQotT3B0aW9u
YWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZFdpZHRo
VmFsdWUoY29uc3QgQm94JiBsYXlvdXRCb3gsIFdpZHRoVHlwZSB3aWR0aFR5cGUsIExheW91dFVu
aXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpCi17Ci0gICAgLy8gQXBwbGllcyB0bzogYWxsIGVsZW1l
bnRzIGV4Y2VwdCBub24tcmVwbGFjZWQgaW5saW5lcyAob3V0LW9mLWZsb3cgY2hlY2sgaXMgcmVx
dWlyZWQgZm9yIHBvc2l0aW9uZWQgPGJyPiBhcyBmb3Igc29tZSByZWFzb24gd2UgZG9uJ3QgYmxv
Y2tpZnkgdGhlbSkuCi0gICAgQVNTRVJUKCFsYXlvdXRCb3guaXNJbmxpbmVCb3goKSB8fCBsYXlv
dXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOwotCi0gICAgYXV0byB3aWR0aCA9IFsmXSB7
Ci0gICAgICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAgICAgIHN3aXRj
aCAod2lkdGhUeXBlKSB7Ci0gICAgICAgIGNhc2UgV2lkdGhUeXBlOjpOb3JtYWw6Ci0gICAgICAg
ICAgICByZXR1cm4gc3R5bGUubG9naWNhbFdpZHRoKCk7Ci0gICAgICAgIGNhc2UgV2lkdGhUeXBl
OjpNaW46Ci0gICAgICAgICAgICByZXR1cm4gc3R5bGUubG9naWNhbE1pbldpZHRoKCk7Ci0gICAg
ICAgIGNhc2UgV2lkdGhUeXBlOjpNYXg6Ci0gICAgICAgICAgICByZXR1cm4gc3R5bGUubG9naWNh
bE1heFdpZHRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0g
ICAgICAgIHJldHVybiBzdHlsZS5sb2dpY2FsV2lkdGgoKTsKLSAgICB9KCk7Ci0gICAgaWYgKGF1
dG8gY29tcHV0ZWRWYWx1ZSA9IHRoaXMtPmNvbXB1dGVkVmFsdWUod2lkdGgsIGNvbnRhaW5pbmdC
bG9ja1dpZHRoKSkKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7Ci0KLSAgICBpZiAod2lk
dGguaXNNaW5Db250ZW50KCkgfHwgd2lkdGguaXNNYXhDb250ZW50KCkgfHwgd2lkdGguaXNGaXRD
b250ZW50KCkpIHsKLSAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkpCi0g
ICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICBhdXRvJiBjb250YWluZXJCb3ggPSBkb3du
Y2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7Ci0gICAgICAgIC8vIEZJWE1FOiBDb25zaWRl
ciBzcGxpdHRpbmcgdXAgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHNvIHRoYXQg
d2UgY291bGQgY29tcHV0ZWQgdGhlIG1pbiBhbmQgbWF4IHZhbHVlcyBzZXBhcmF0ZWx5LgotICAg
ICAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBbJl0gewotICAgICAgICAgICAg
aWYgKCFjb250YWluZXJCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyAwX2x1LCBjb250YWluaW5n
QmxvY2tXaWR0aCB9OwotICAgICAgICAgICAgQVNTRVJUKGNvbnRhaW5lckJveC5lc3RhYmxpc2hl
c0Zvcm1hdHRpbmdDb250ZXh0KCkpOwotICAgICAgICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRl
ID0gbGF5b3V0U3RhdGUoKS5lbnN1cmVGb3JtYXR0aW5nU3RhdGUoY29udGFpbmVyQm94KTsKLSAg
ICAgICAgICAgIGlmIChhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBmb3JtYXR0aW5n
U3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpKQotICAgICAgICAgICAgICAgIHJldHVy
biAqaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKLSAgICAgICAgICAgIHJldHVybiBMYXlvdXRD
b250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjb250YWluZXJCb3gsIGxheW91dFN0YXRl
KCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKLSAgICAgICAgfSgpOwot
ICAgICAgICBpZiAod2lkdGguaXNNaW5Db250ZW50KCkpCi0gICAgICAgICAgICByZXR1cm4gaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtOwotICAgICAgICBpZiAod2lkdGguaXNNYXhD
b250ZW50KCkpCi0gICAgICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5t
YXhpbXVtOwotICAgICAgICBBU1NFUlQod2lkdGguaXNGaXRDb250ZW50KCkpOwotICAgICAgICAv
LyBJZiB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIGEgZ2l2ZW4gYXhpcyBpcyBkZWZpbml0ZSwgZXF1
YWwgdG8gbWluKG1heC1jb250ZW50IHNpemUsCi0gICAgICAgIC8vIG1heChtaW4tY29udGVudCBz
aXplLCBzdHJldGNoLWZpdCBzaXplKSkuIE90aGVyd2lzZSwgZXF1YWwgdG8gdGhlIG1heC1jb250
ZW50IHNpemUgaW4gdGhhdCBheGlzLgotICAgICAgICAvLyBGSVhNRTogV2UgZG9uJ3QgeWV0IGhh
dmUgaW5kZWZpbml0ZSBhdmFpbGFibGUgc2l6ZS4KLSAgICAgICAgcmV0dXJuIHN0ZDo6bWluKGlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSwgc3RkOjptYXgoaW50cmluc2ljV2lkdGhD
b25zdHJhaW50cy5taW5pbXVtLCBjb250YWluaW5nQmxvY2tXaWR0aCkpOwotICAgIH0KLSAgICBy
ZXR1cm4geyB9OwotfQotCi1PcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0aW5nQ29udGV4dDo6
R2VvbWV0cnk6OmNvbXB1dGVkV2lkdGgoY29uc3QgQm94JiBsYXlvdXRCb3gsIExheW91dFVuaXQg
Y29udGFpbmluZ0Jsb2NrV2lkdGgpCi17Ci0gICAgaWYgKGF1dG8gY29tcHV0ZWRXaWR0aCA9IGNv
bXB1dGVkV2lkdGhWYWx1ZShsYXlvdXRCb3gsIFdpZHRoVHlwZTo6Tm9ybWFsLCBjb250YWluaW5n
QmxvY2tXaWR0aCkpIHsKLSAgICAgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsK
LSAgICAgICAgLy8gTm9uLXF1YW50aXRhdGl2ZSB2YWx1ZXMgc3VjaCBhcyBhdXRvIGFuZCBtaW4t
Y29udGVudCBhcmUgbm90IGluZmx1ZW5jZWQgYnkgdGhlIGJveC1zaXppbmcgcHJvcGVydHkuCi0g
ICAgICAgIGlmIChzdHlsZS5ib3hTaXppbmcoKSA9PSBCb3hTaXppbmc6OkNvbnRlbnRCb3ggfHwg
c3R5bGUud2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQotICAgICAgICAgICAgcmV0dXJuIGNv
bXB1dGVkV2lkdGg7Ci0gICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRl
eHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwotICAgICAgICByZXR1cm4gKmNvbXB1dGVk
V2lkdGggLSAoYm94R2VvbWV0cnkuaG9yaXpvbnRhbEJvcmRlcigpICsgYm94R2VvbWV0cnkuaG9y
aXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDApKTsKLSAgICB9Ci0gICAgcmV0dXJuIHsgfTsKLX0K
LQotTGF5b3V0VW5pdCBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbnRlbnRIZWlnaHRG
b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29u
dGV4dFJvb3QpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGZvcm1hdHRpbmdDb250ZXh0Um9vdC5lc3Rh
Ymxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOwotICAgIEFTU0VSVChpc0hlaWdodEF1dG8oZm9y
bWF0dGluZ0NvbnRleHRSb290KSB8fCBmb3JtYXR0aW5nQ29udGV4dFJvb3QuZXN0YWJsaXNoZXNU
YWJsZUZvcm1hdHRpbmdDb250ZXh0KCkgfHwgZm9ybWF0dGluZ0NvbnRleHRSb290LmlzVGFibGVD
ZWxsKCkpOwotICAgIGF1dG8gdXNlZENvbnRlbnRIZWlnaHQgPSBMYXlvdXRVbml0IHsgfTsgCi0g
ICAgYXV0byBoYXNDb250ZW50ID0gZm9ybWF0dGluZ0NvbnRleHRSb290Lmhhc0luRmxvd09yRmxv
YXRpbmdDaGlsZCgpOwotICAgIC8vIFRoZSB1c2VkIGhlaWdodCBvZiB0aGUgY29udGFpbm1lbnQg
Ym94IGlzIGRldGVybWluZWQgYXMgaWYgcGVyZm9ybWluZyBhIG5vcm1hbCBsYXlvdXQgb2YgdGhl
IGJveCwgZXhjZXB0IHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBoYXZpbmcgbm8gY29udGVudC4KLSAg
ICBhdXRvIHNob3VsZElnbm9yZUNvbnRlbnQgPSBmb3JtYXR0aW5nQ29udGV4dFJvb3QuaXNTaXpl
Q29udGFpbm1lbnRCb3goKTsKLSAgICBpZiAoaGFzQ29udGVudCAmJiAhc2hvdWxkSWdub3JlQ29u
dGVudCkKLSAgICAgICAgdXNlZENvbnRlbnRIZWlnaHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVG
b3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGNvbnN0X2Nhc3Q8TGF5b3V0
U3RhdGUmPihsYXlvdXRTdGF0ZSgpKSktPnVzZWRDb250ZW50SGVpZ2h0KCk7Ci0gICAgcmV0dXJu
IHVzZWRDb250ZW50SGVpZ2h0OwotfQotCi1PcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0aW5n
Q29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkVmFsdWUoY29uc3QgTGVuZ3RoJiBnZW9tZXRyeVBy
b3BlcnR5LCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSBjb25zdAotewotICAgIC8v
ICBJbiBnZW5lcmFsLCB0aGUgY29tcHV0ZWQgdmFsdWUgcmVzb2x2ZXMgdGhlIHNwZWNpZmllZCB2
YWx1ZSBhcyBmYXIgYXMgcG9zc2libGUgd2l0aG91dCBsYXlpbmcgb3V0IHRoZSBjb250ZW50Lgot
ICAgIGlmIChnZW9tZXRyeVByb3BlcnR5LmlzRml4ZWQoKSB8fCBnZW9tZXRyeVByb3BlcnR5Lmlz
UGVyY2VudCgpIHx8IGdlb21ldHJ5UHJvcGVydHkuaXNDYWxjdWxhdGVkKCkpCi0gICAgICAgIHJl
dHVybiB2YWx1ZUZvckxlbmd0aChnZW9tZXRyeVByb3BlcnR5LCBjb250YWluaW5nQmxvY2tXaWR0
aCk7Ci0gICAgcmV0dXJuIHsgfTsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5OjpmaXhlZFZhbHVlKGNvbnN0IExlbmd0aCYgZ2VvbWV0cnlQcm9w
ZXJ0eSkgY29uc3QKLXsKLSAgICBpZiAoIWdlb21ldHJ5UHJvcGVydHkuaXNGaXhlZCgpKQotICAg
ICAgICByZXR1cm4geyB9OwotICAgIHJldHVybiBMYXlvdXRVbml0IHsgZ2VvbWV0cnlQcm9wZXJ0
eS52YWx1ZSgpIH07Ci19Ci0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi92aXN1ZGV0
Lmh0bWwjbWluLW1heC1oZWlnaHRzCi0vLyBTcGVjaWZpZXMgYSBwZXJjZW50YWdlIGZvciBkZXRl
cm1pbmluZyB0aGUgdXNlZCB2YWx1ZS4gVGhlIHBlcmNlbnRhZ2UgaXMgY2FsY3VsYXRlZCB3aXRo
IHJlc3BlY3QgdG8gdGhlIGhlaWdodCBvZiB0aGUgZ2VuZXJhdGVkIGJveCdzIGNvbnRhaW5pbmcg
YmxvY2suCi0vLyBJZiB0aGUgaGVpZ2h0IG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGlzIG5vdCBz
cGVjaWZpZWQgZXhwbGljaXRseSAoaS5lLiwgaXQgZGVwZW5kcyBvbiBjb250ZW50IGhlaWdodCks
IGFuZCB0aGlzIGVsZW1lbnQgaXMgbm90IGFic29sdXRlbHkgcG9zaXRpb25lZCwKLS8vIHRoZSBw
ZXJjZW50YWdlIHZhbHVlIGlzIHRyZWF0ZWQgYXMgJzAnIChmb3IgJ21pbi1oZWlnaHQnKSBvciAn
bm9uZScgKGZvciAnbWF4LWhlaWdodCcpLgotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZE1heEhlaWdodChjb25zdCBCb3gmIGxheW91dEJv
eCwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSBjb25zdAotewot
ICAgIHJldHVybiBjb21wdXRlZEhlaWdodFZhbHVlKGxheW91dEJveCwgSGVpZ2h0VHlwZTo6TWF4
LCBjb250YWluaW5nQmxvY2tIZWlnaHQpOwotfQotCi1PcHRpb25hbDxMYXlvdXRVbml0PiBGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkTWluSGVpZ2h0KGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGNvbXB1dGVkSGVpZ2h0VmFsdWUobGF5b3V0Qm94LCBIZWlnaHRUeXBl
OjpNaW4sIGNvbnRhaW5pbmdCbG9ja0hlaWdodCk7Ci19Ci0KLU9wdGlvbmFsPExheW91dFVuaXQ+
IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRNaW5XaWR0aChjb25zdCBCb3gm
IGxheW91dEJveCwgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCkKLXsKLSAgICByZXR1
cm4gY29tcHV0ZWRXaWR0aFZhbHVlKGxheW91dEJveCwgV2lkdGhUeXBlOjpNaW4sIGNvbnRhaW5p
bmdCbG9ja1dpZHRoKTsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5Ojpjb21wdXRlZE1heFdpZHRoKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBMYXlv
dXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKQotewotICAgIHJldHVybiBjb21wdXRlZFdpZHRo
VmFsdWUobGF5b3V0Qm94LCBXaWR0aFR5cGU6Ok1heCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwot
fQotCi1MYXlvdXRVbml0IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6c3RhdGljVmVydGlj
YWxQb3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNv
bnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpIGNvbnN0Ci17Ci0g
ICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7Ci0KLSAgICAvLyBG
b3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgc2VjdGlvbiBhbmQgdGhlIG5leHQsIHRoZSB0ZXJtICJz
dGF0aWMgcG9zaXRpb24iIChvZiBhbiBlbGVtZW50KSByZWZlcnMsIHJvdWdobHksIHRvIHRoZSBw
b3NpdGlvbiBhbiBlbGVtZW50IHdvdWxkIGhhdmUKLSAgICAvLyBoYWQgaW4gdGhlIG5vcm1hbCBm
bG93LiBNb3JlIHByZWNpc2VseSwgdGhlIHN0YXRpYyBwb3NpdGlvbiBmb3IgJ3RvcCcgaXMgdGhl
IGRpc3RhbmNlIGZyb20gdGhlIHRvcCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrIHRvIHRo
ZSB0b3AgbWFyZ2luCi0gICAgLy8gZWRnZSBvZiBhIGh5cG90aGV0aWNhbCBib3ggdGhhdCB3b3Vs
ZCBoYXZlIGJlZW4gdGhlIGZpcnN0IGJveCBvZiB0aGUgZWxlbWVudCBpZiBpdHMgc3BlY2lmaWVk
ICdwb3NpdGlvbicgdmFsdWUgaGFkIGJlZW4gJ3N0YXRpYycgYW5kIGl0cyBzcGVjaWZpZWQKLSAg
ICAvLyAnZmxvYXQnIGhhZCBiZWVuICdub25lJyBhbmQgaXRzIHNwZWNpZmllZCAnY2xlYXInIGhh
ZCBiZWVuICdub25lJy4gKE5vdGUgdGhhdCBkdWUgdG8gdGhlIHJ1bGVzIGluIHNlY3Rpb24gOS43
IHRoaXMgbWlnaHQgcmVxdWlyZSBhbHNvIGFzc3VtaW5nIGEgZGlmZmVyZW50Ci0gICAgLy8gY29t
cHV0ZWQgdmFsdWUgZm9yICdkaXNwbGF5Jy4pIFRoZSB2YWx1ZSBpcyBuZWdhdGl2ZSBpZiB0aGUg
aHlwb3RoZXRpY2FsIGJveCBpcyBhYm92ZSB0aGUgY29udGFpbmluZyBibG9jay4KLQotICAgIC8v
IFN0YXJ0IHdpdGggdGhpcyBib3gncyBib3JkZXIgYm94IG9mZnNldCBmcm9tIHRoZSBwYXJlbnQn
cyBib3JkZXIgYm94LgotICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9ybWF0
dGluZ0NvbnRleHQoKTsKLSAgICBMYXlvdXRVbml0IHRvcDsKLSAgICBpZiAobGF5b3V0Qm94LnBy
ZXZpb3VzSW5GbG93U2libGluZygpICYmIGxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmco
KS0+aXNCbG9ja0xldmVsQm94KCkpIHsKLSAgICAgICAgLy8gQWRkIHNpYmxpbmcgb2Zmc2V0Ci0g
ICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9ICpsYXlvdXRCb3gucHJldmlvdXNJ
bkZsb3dTaWJsaW5nKCk7Ci0gICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93Qm94R2VvbWV0cnkg
PSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChwcmV2aW91c0luRmxvd1NpYmxpbmcs
IEVzY2FwZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRyeSk7Ci0gICAgICAg
IGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IGRvd25jYXN0PEJsb2NrRm9ybWF0dGluZ1N0YXRlPihs
YXlvdXRTdGF0ZSgpLmZvcm1hdHRpbmdTdGF0ZUZvckJveChwcmV2aW91c0luRmxvd1NpYmxpbmcp
KTsKLSAgICAgICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW5Gb3JQcmV2aW91c0JveCA9IGZvcm1h
dHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNJbkZsb3dTaWJsaW5nKTsKLQot
ICAgICAgICB0b3AgKz0gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QocHJldmlvdXNJbkZsb3dC
b3hHZW9tZXRyeSkuYm90dG9tKCkgKyB1c2VkVmVydGljYWxNYXJnaW5Gb3JQcmV2aW91c0JveC5u
b25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXI7Ci0gICAgfSBlbHNlCi0gICAgICAgIHRvcCA9IGZvcm1h
dHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveC5wYXJlbnQoKSwgRXNjYXBlUmVh
c29uOjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5KS5jb250ZW50Qm94VG9wKCk7Ci0K
LSAgICAvLyBSZXNvbHZlIHRvcCBhbGwgdGhlIHdheSB1cCB0byB0aGUgY29udGFpbmluZyBibG9j
ay4KLSAgICBhdXRvJiBjb250YWluaW5nQmxvY2sgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2Nr
KCk7Ci0gICAgLy8gU3RhcnQgd2l0aCB0aGUgcGFyZW50IHNpbmNlIHdlIHByZXRlbmQgdGhhdCB0
aGlzIGJveCBpcyBub3JtYWwgZmxvdy4KLSAgICBmb3IgKGF1dG8qIGFuY2VzdG9yID0gJmxheW91
dEJveC5wYXJlbnQoKTsgYW5jZXN0b3IgIT0gJmNvbnRhaW5pbmdCbG9jazsgYW5jZXN0b3IgPSAm
YW5jZXN0b3ItPmNvbnRhaW5pbmdCbG9jaygpKSB7Ci0gICAgICAgIGF1dG8mIGJveEdlb21ldHJ5
ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goKmFuY2VzdG9yLCBFc2NhcGVSZWFz
b246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0cnkpOwotICAgICAgICAvLyBCb3hHZW9t
ZXRyeTo6dG9wIGlzIHRoZSBib3JkZXIgYm94IHRvcCBwb3NpdGlvbiBpbiBpdHMgY29udGFpbmlu
ZyBibG9jaydzIGNvb3JkaW5hdGUgc3lzdGVtLgotICAgICAgICB0b3AgKz0gQm94R2VvbWV0cnk6
OmJvcmRlckJveFRvcChib3hHZW9tZXRyeSk7Ci0gICAgICAgIEFTU0VSVCghYW5jZXN0b3ItPmlz
UG9zaXRpb25lZCgpIHx8IGxheW91dEJveC5pc0ZpeGVkUG9zaXRpb25lZCgpKTsKLSAgICB9Ci0g
ICAgLy8gTW92ZSB0aGUgc3RhdGljIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBwYWRkaW5nIGJv
eC4gVGhpcyBpcyB2ZXJ5IHNwZWNpZmljIHRvIGFib2x1dGVseSBwb3NpdGlvbmVkIGJveGVzLgot
ICAgIHJldHVybiB0b3AgLSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7Ci19Ci0KLUxh
eW91dFVuaXQgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNIb3Jpem9udGFsUG9z
aXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBI
b3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykgY29uc3QKLXsKLSAg
ICBBU1NFUlQobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKLSAgICAvLyBTZWUg
c3RhdGljVmVydGljYWxQb3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQgZm9yIHRoZSBkZWZp
bml0aW9uIG9mIHRoZSBzdGF0aWMgcG9zaXRpb24uCi0KLSAgICAvLyBTdGFydCB3aXRoIHRoaXMg
Ym94J3MgYm9yZGVyIGJveCBvZmZzZXQgZnJvbSB0aGUgcGFyZW50J3MgYm9yZGVyIGJveC4KLSAg
ICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7Ci0g
ICAgYXV0byBsZWZ0ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94
LnBhcmVudCgpLCBFc2NhcGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0cnkp
LmNvbnRlbnRCb3hMZWZ0KCk7Ci0KLSAgICAvLyBSZXNvbHZlIGxlZnQgYWxsIHRoZSB3YXkgdXAg
dG8gdGhlIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gbGF5
b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOwotICAgIC8vIFN0YXJ0IHdpdGggdGhlIHBhcmVudCBz
aW5jZSB3ZSBwcmV0ZW5kIHRoYXQgdGhpcyBib3ggaXMgbm9ybWFsIGZsb3cuCi0gICAgZm9yIChh
dXRvKiBhbmNlc3RvciA9ICZsYXlvdXRCb3gucGFyZW50KCk7IGFuY2VzdG9yICE9ICZjb250YWlu
aW5nQmxvY2s7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkgewotICAg
ICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94
KCphbmNlc3RvciwgRXNjYXBlUmVhc29uOjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5
KTsKLSAgICAgICAgLy8gQm94R2VvbWV0cnk6OmxlZnQgaXMgdGhlIGJvcmRlciBib3ggbGVmdCBw
b3NpdGlvbiBpbiBpdHMgY29udGFpbmluZyBibG9jaydzIGNvb3JkaW5hdGUgc3lzdGVtLgotICAg
ICAgICBsZWZ0ICs9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hMZWZ0KGJveEdlb21ldHJ5KTsKLSAg
ICAgICAgQVNTRVJUKCFhbmNlc3Rvci0+aXNQb3NpdGlvbmVkKCkgfHwgbGF5b3V0Qm94LmlzRml4
ZWRQb3NpdGlvbmVkKCkpOwotICAgIH0KLSAgICAvLyBNb3ZlIHRoZSBzdGF0aWMgcG9zaXRpb24g
cmVsYXRpdmUgdG8gdGhlIHBhZGRpbmcgYm94LiBUaGlzIGlzIHZlcnkgc3BlY2lmaWMgdG8gYWJv
bHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMuCi0gICAgcmV0dXJuIGxlZnQgLSBob3Jpem9udGFsQ29u
c3RyYWludHMubG9naWNhbExlZnQ7Ci19Ci0KLUxheW91dFVuaXQgRm9ybWF0dGluZ0NvbnRleHQ6
Okdlb21ldHJ5OjpzaHJpbmtUb0ZpdFdpZHRoKGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRS
b290LCBMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKQotewotICAgIExPR19XSVRIX1NUUkVBTShG
b3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbV2lkdGhdIC0+IHNocmluayB0byBm
aXQgLT4gdW5zdXBwb3J0ZWQgLT4gd2lkdGgoIiA8PCBMYXlvdXRVbml0IHsgfSA8PCAicHgpIGxh
eW91dEJveDogIiA8PCAmZm9ybWF0dGluZ0NvbnRleHRSb290IDw8ICIpIik7Ci0gICAgQVNTRVJU
KGZvcm1hdHRpbmdDb250ZXh0Um9vdC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOwot
Ci0gICAgLy8gQ2FsY3VsYXRpb24gb2YgdGhlIHNocmluay10by1maXQgd2lkdGggaXMgc2ltaWxh
ciB0byBjYWxjdWxhdGluZyB0aGUgd2lkdGggb2YgYSB0YWJsZSBjZWxsIHVzaW5nIHRoZSBhdXRv
bWF0aWMgdGFibGUgbGF5b3V0IGFsZ29yaXRobS4KLSAgICAvLyBSb3VnaGx5OiBjYWxjdWxhdGUg
dGhlIHByZWZlcnJlZCB3aWR0aCBieSBmb3JtYXR0aW5nIHRoZSBjb250ZW50IHdpdGhvdXQgYnJl
YWtpbmcgbGluZXMgb3RoZXIgdGhhbiB3aGVyZSBleHBsaWNpdCBsaW5lIGJyZWFrcyBvY2N1ciwK
LSAgICAvLyBhbmQgYWxzbyBjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBtaW5pbXVtIHdpZHRoLCBl
LmcuLCBieSB0cnlpbmcgYWxsIHBvc3NpYmxlIGxpbmUgYnJlYWtzLiBDU1MgMi4yIGRvZXMgbm90
IGRlZmluZSB0aGUgZXhhY3QgYWxnb3JpdGhtLgotICAgIC8vIFRoaXJkbHksIGZpbmQgdGhlIGF2
YWlsYWJsZSB3aWR0aDogaW4gdGhpcyBjYXNlLCB0aGlzIGlzIHRoZSB3aWR0aCBvZiB0aGUgY29u
dGFpbmluZyBibG9jayBtaW51cyB0aGUgdXNlZCB2YWx1ZXMgb2YgJ21hcmdpbi1sZWZ0JywgJ2Jv
cmRlci1sZWZ0LXdpZHRoJywKLSAgICAvLyAncGFkZGluZy1sZWZ0JywgJ3BhZGRpbmctcmlnaHQn
LCAnYm9yZGVyLXJpZ2h0LXdpZHRoJywgJ21hcmdpbi1yaWdodCcsIGFuZCB0aGUgd2lkdGhzIG9m
IGFueSByZWxldmFudCBzY3JvbGwgYmFycy4KLQotICAgIC8vIFRoZW4gdGhlIHNocmluay10by1m
aXQgd2lkdGggaXM6IG1pbihtYXgocHJlZmVycmVkIG1pbmltdW0gd2lkdGgsIGF2YWlsYWJsZSB3
aWR0aCksIHByZWZlcnJlZCB3aWR0aCkuCi0gICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07Ci0gICAgYXV0byBoYXNDb250ZW50
ID0gaXM8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3QpICYmIGRvd25jYXN0PENv
bnRhaW5lckJveD4oZm9ybWF0dGluZ0NvbnRleHRSb290KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hp
bGQoKTsKLSAgICAvLyBUaGUgdXNlZCB3aWR0aCBvZiB0aGUgY29udGFpbm1lbnQgYm94IGlzIGRl
dGVybWluZWQgYXMgaWYgcGVyZm9ybWluZyBhIG5vcm1hbCBsYXlvdXQgb2YgdGhlIGJveCwgZXhj
ZXB0IHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBoYXZpbmcgbm8gY29udGVudC4KLSAgICBhdXRvIHNo
b3VsZElnbm9yZUNvbnRlbnQgPSBmb3JtYXR0aW5nQ29udGV4dFJvb3QuaXNTaXplQ29udGFpbm1l
bnRCb3goKTsgIAotICAgIGlmIChoYXNDb250ZW50ICYmICFzaG91bGRJZ25vcmVDb250ZW50KSB7
Ci0gICAgICAgIGF1dG8mIHJvb3QgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGZvcm1hdHRpbmdD
b250ZXh0Um9vdCk7Ci0gICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZUZvclJvb3QgPSBsYXlv
dXRTdGF0ZSgpLmVuc3VyZUZvcm1hdHRpbmdTdGF0ZShyb290KTsKLSAgICAgICAgYXV0byBwcmVj
b21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBmb3JtYXR0aW5nU3RhdGVGb3JSb290
LmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKLSAgICAgICAgaWYgKCFwcmVjb21wdXRlZElu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMpCi0gICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQocm9vdCwgbGF5
b3V0U3RhdGUoKSktPmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOwotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gKnByZWNvbXB1
dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKLSAgICB9Ci0gICAgcmV0dXJuIHN0ZDo6bWlu
KHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgYXZhaWxhYmxlV2lk
dGgpLCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0pOwotfQotCi1WZXJ0aWNhbEdl
b21ldHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93Tm9uUmVwbGFjZWRW
ZXJ0aWNhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jp
em9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVydGljYWxD
b25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2Fs
VmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxh
eW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRC
b3goKSk7Ci0gICAgQVNTRVJUKHZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbEhlaWdodCk7Ci0K
LSAgICAvLyAxMC42LjQgQWJzb2x1dGVseSBwb3NpdGlvbmVkLCBub24tcmVwbGFjZWQgZWxlbWVu
dHMKLSAgICAvLwotICAgIC8vIEZvciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgZWxlbWVudHMsIHRo
ZSB1c2VkIHZhbHVlcyBvZiB0aGUgdmVydGljYWwgZGltZW5zaW9ucyBtdXN0IHNhdGlzZnkgdGhp
cyBjb25zdHJhaW50OgotICAgIC8vICd0b3AnICsgJ21hcmdpbi10b3AnICsgJ2JvcmRlci10b3At
d2lkdGgnICsgJ3BhZGRpbmctdG9wJyArICdoZWlnaHQnICsgJ3BhZGRpbmctYm90dG9tJyArICdi
b3JkZXItYm90dG9tLXdpZHRoJyArICdtYXJnaW4tYm90dG9tJyArICdib3R0b20nCi0gICAgLy8g
PSBoZWlnaHQgb2YgY29udGFpbmluZyBibG9jawotCi0gICAgLy8gSWYgYWxsIHRocmVlIG9mICd0
b3AnLCAnaGVpZ2h0JywgYW5kICdib3R0b20nIGFyZSBhdXRvLCBzZXQgJ3RvcCcgdG8gdGhlIHN0
YXRpYyBwb3NpdGlvbiBhbmQgYXBwbHkgcnVsZSBudW1iZXIgdGhyZWUgYmVsb3cuCi0KLSAgICAv
LyBJZiBub25lIG9mIHRoZSB0aHJlZSBhcmUgJ2F1dG8nOiBJZiBib3RoICdtYXJnaW4tdG9wJyBh
bmQgJ21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0
aGUgZXh0cmEKLSAgICAvLyBjb25zdHJhaW50IHRoYXQgdGhlIHR3byBtYXJnaW5zIGdldCBlcXVh
bCB2YWx1ZXMuIElmIG9uZSBvZiAnbWFyZ2luLXRvcCcgb3IgJ21hcmdpbi1ib3R0b20nIGlzICdh
dXRvJywgc29sdmUgdGhlIGVxdWF0aW9uIGZvciB0aGF0IHZhbHVlLgotICAgIC8vIElmIHRoZSB2
YWx1ZXMgYXJlIG92ZXItY29uc3RyYWluZWQsIGlnbm9yZSB0aGUgdmFsdWUgZm9yICdib3R0b20n
IGFuZCBzb2x2ZSBmb3IgdGhhdCB2YWx1ZS4KLQotICAgIC8vIE90aGVyd2lzZSwgcGljayB0aGUg
b25lIG9mIHRoZSBmb2xsb3dpbmcgc2l4IHJ1bGVzIHRoYXQgYXBwbGllcy4KLQotICAgIC8vIDEu
ICd0b3AnIGFuZCAnaGVpZ2h0JyBhcmUgJ2F1dG8nIGFuZCAnYm90dG9tJyBpcyBub3QgJ2F1dG8n
LCB0aGVuIHRoZSBoZWlnaHQgaXMgYmFzZWQgb24gdGhlIGNvbnRlbnQgcGVyIDEwLjYuNywKLSAg
ICAvLyAgICAgc2V0ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1i
b3R0b20nIHRvIDAsIGFuZCBzb2x2ZSBmb3IgJ3RvcCcKLSAgICAvLyAyLiAndG9wJyBhbmQgJ2Jv
dHRvbScgYXJlICdhdXRvJyBhbmQgJ2hlaWdodCcgaXMgbm90ICdhdXRvJywgdGhlbiBzZXQgJ3Rv
cCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbiwgc2V0ICdhdXRvJyB2YWx1ZXMgZm9yCi0gICAgLy8g
ICAgJ21hcmdpbi10b3AnIGFuZCAnbWFyZ2luLWJvdHRvbScgdG8gMCwgYW5kIHNvbHZlIGZvciAn
Ym90dG9tJwotICAgIC8vIDMuICdoZWlnaHQnIGFuZCAnYm90dG9tJyBhcmUgJ2F1dG8nIGFuZCAn
dG9wJyBpcyBub3QgJ2F1dG8nLCB0aGVuIHRoZSBoZWlnaHQgaXMgYmFzZWQgb24gdGhlIGNvbnRl
bnQgcGVyIDEwLjYuNywgc2V0ICdhdXRvJwotICAgIC8vICAgICB2YWx1ZXMgZm9yICdtYXJnaW4t
dG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAsIGFuZCBzb2x2ZSBmb3IgJ2JvdHRvbScKLSAg
ICAvLyA0LiAndG9wJyBpcyAnYXV0bycsICdoZWlnaHQnIGFuZCAnYm90dG9tJyBhcmUgbm90ICdh
dXRvJywgdGhlbiBzZXQgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi10b3AnIGFuZCAnbWFyZ2lu
LWJvdHRvbScgdG8gMCwgYW5kIHNvbHZlIGZvciAndG9wJwotICAgIC8vIDUuICdoZWlnaHQnIGlz
ICdhdXRvJywgJ3RvcCcgYW5kICdib3R0b20nIGFyZSBub3QgJ2F1dG8nLCB0aGVuICdhdXRvJyB2
YWx1ZXMgZm9yICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIGFyZSBzZXQgdG8gMCBh
bmQgc29sdmUgZm9yICdoZWlnaHQnCi0gICAgLy8gNi4gJ2JvdHRvbScgaXMgJ2F1dG8nLCAndG9w
JyBhbmQgJ2hlaWdodCcgYXJlIG5vdCAnYXV0bycsIHRoZW4gc2V0ICdhdXRvJyB2YWx1ZXMgZm9y
ICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAgYW5kIHNvbHZlIGZvciAnYm90
dG9tJwotCi0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29u
dGV4dCgpOwotICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAgYXV0byYg
Ym94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gp
OwotICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gKnZlcnRpY2FsQ29uc3RyYWludHMu
bG9naWNhbEhlaWdodDsKLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpvbnRh
bENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLQotICAgIGF1dG8gdG9wID0gY29tcHV0ZWRWYWx1
ZShzdHlsZS5sb2dpY2FsVG9wKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLSAgICBhdXRvIGJv
dHRvbSA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbEJvdHRvbSgpLCBjb250YWluaW5nQmxv
Y2tXaWR0aCk7Ci0gICAgYXV0byBoZWlnaHQgPSBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVp
Z2h0ID8gb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodC52YWx1ZSgpIDogY29tcHV0ZWRI
ZWlnaHQobGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tIZWlnaHQpOwotICAgIGF1dG8gY29tcHV0
ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKGxheW91
dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICBVc2VkVmVydGljYWxNYXJnaW46Ok5v
bkNvbGxhcHNlZFZhbHVlcyB1c2VkVmVydGljYWxNYXJnaW47IAotICAgIGF1dG8gcGFkZGluZ1Rv
cCA9IGJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKDApOwotICAgIGF1dG8gcGFkZGlu
Z0JvdHRvbSA9IGJveEdlb21ldHJ5LnBhZGRpbmdCb3R0b20oKS52YWx1ZU9yKDApOwotICAgIGF1
dG8gYm9yZGVyVG9wID0gYm94R2VvbWV0cnkuYm9yZGVyVG9wKCk7Ci0gICAgYXV0byBib3JkZXJC
b3R0b20gPSBib3hHZW9tZXRyeS5ib3JkZXJCb3R0b20oKTsKLQotICAgIGlmICghdG9wICYmICFo
ZWlnaHQgJiYgIWJvdHRvbSkKLSAgICAgICAgdG9wID0gc3RhdGljVmVydGljYWxQb3NpdGlvbkZv
ck91dE9mRmxvd1Bvc2l0aW9uZWQobGF5b3V0Qm94LCB2ZXJ0aWNhbENvbnN0cmFpbnRzKTsKLQot
ICAgIGlmICh0b3AgJiYgaGVpZ2h0ICYmIGJvdHRvbSkgewotICAgICAgICBpZiAoIWNvbXB1dGVk
VmVydGljYWxNYXJnaW4uYmVmb3JlICYmICFjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyKSB7
Ci0gICAgICAgICAgICBhdXRvIG1hcmdpbkJlZm9yZUFuZEFmdGVyID0gY29udGFpbmluZ0Jsb2Nr
SGVpZ2h0IC0gKCp0b3AgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBhZGRp
bmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqYm90dG9tKTsKLSAgICAgICAgICAgIHVzZWRWZXJ0
aWNhbE1hcmdpbiA9IHsgbWFyZ2luQmVmb3JlQW5kQWZ0ZXIgLyAyLCBtYXJnaW5CZWZvcmVBbmRB
ZnRlciAvIDIgfTsKLSAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5i
ZWZvcmUpIHsKLSAgICAgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciA9ICpjb21wdXRl
ZFZlcnRpY2FsTWFyZ2luLmFmdGVyOwotICAgICAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luLmJl
Zm9yZSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsgcGFkZGlu
Z1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRp
Y2FsTWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWNvbXB1dGVk
VmVydGljYWxNYXJnaW4uYWZ0ZXIpIHsKLSAgICAgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5i
ZWZvcmUgPSAqY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmU7Ci0gICAgICAgICAgICB1c2Vk
VmVydGljYWxNYXJnaW4uYWZ0ZXIgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIHVz
ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdo
dCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqYm90dG9tKTsKLSAgICAgICAgfSBl
bHNlCi0gICAgICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7ICpjb21wdXRlZFZlcnRpY2Fs
TWFyZ2luLmJlZm9yZSwgKmNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIgfTsKLSAgICAgICAg
Ly8gT3Zlci1jb25zdHJhaW5lZD8KLSAgICAgICAgYXV0byBib3hIZWlnaHQgPSAqdG9wICsgdXNl
ZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyAqaGVpZ2h0
ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRl
ciArICpib3R0b207Ci0gICAgICAgIGlmIChib3hIZWlnaHQgIT0gY29udGFpbmluZ0Jsb2NrSGVp
Z2h0KQotICAgICAgICAgICAgYm90dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3Ag
KyB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpo
ZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2lu
LmFmdGVyKTsKLSAgICB9Ci0KLSAgICBpZiAoIXRvcCAmJiAhaGVpZ2h0ICYmIGJvdHRvbSkgewot
ICAgICAgICAvLyAjMQotICAgICAgICBoZWlnaHQgPSBjb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGlu
Z0NvbnRleHRSb290KGxheW91dEJveCk7Ci0gICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IHsg
Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNh
bE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07Ci0gICAgICAgIHRvcCA9IGNvbnRhaW5pbmdCbG9j
a0hlaWdodCAtICh1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGlu
Z1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRp
Y2FsTWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7IAotICAgIH0KLQotICAgIGlmICghdG9wICYmICFi
b3R0b20gJiYgaGVpZ2h0KSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIHRvcCA9IHN0YXRpY1Zl
cnRpY2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGxheW91dEJveCwgdmVydGljYWxD
b25zdHJhaW50cyk7Ci0gICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IHsgY29tcHV0ZWRWZXJ0
aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRl
ci52YWx1ZU9yKDApIH07Ci0gICAgICAgIGJvdHRvbSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAt
ICgqdG9wICsgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdU
b3AgKyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0aWNh
bE1hcmdpbi5hZnRlcik7Ci0gICAgfQotCi0gICAgaWYgKCFoZWlnaHQgJiYgIWJvdHRvbSAmJiB0
b3ApIHsKLSAgICAgICAgLy8gIzMKLSAgICAgICAgaGVpZ2h0ID0gY29udGVudEhlaWdodEZvckZv
cm1hdHRpbmdDb250ZXh0Um9vdChsYXlvdXRCb3gpOwotICAgICAgICB1c2VkVmVydGljYWxNYXJn
aW4gPSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVk
VmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OwotICAgICAgICBib3R0b20gPSBjb250
YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBi
b3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJC
b3R0b20gKyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIpOwotICAgIH0KLQotICAgIGlmICghdG9w
ICYmIGhlaWdodCAmJiBib3R0b20pIHsKLSAgICAgICAgLy8gIzQKLSAgICAgICAgdXNlZFZlcnRp
Y2FsTWFyZ2luID0geyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBj
b21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKLSAgICAgICAgdG9wID0g
Y29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3Jk
ZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0
b20gKyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgKyAqYm90dG9tKTsKLSAgICB9Ci0KLSAgICBp
ZiAoIWhlaWdodCAmJiB0b3AgJiYgYm90dG9tKSB7Ci0gICAgICAgIC8vICM1Ci0gICAgICAgIHVz
ZWRWZXJ0aWNhbE1hcmdpbiA9IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVP
cigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07Ci0gICAgICAg
IGhlaWdodCA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgdXNlZFZlcnRpY2FsTWFy
Z2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBwYWRkaW5nQm90dG9tICsgYm9y
ZGVyQm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7Ci0gICAgfQot
Ci0gICAgaWYgKCFib3R0b20gJiYgdG9wICYmIGhlaWdodCkgewotICAgICAgICAvLyAjNgotICAg
ICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3Jl
LnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9Owot
ICAgICAgICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIHVzZWRWZXJ0
aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBh
ZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIpOwot
ICAgIH0KLQotICAgIEFTU0VSVCh0b3ApOwotICAgIEFTU0VSVChib3R0b20pOwotICAgIEFTU0VS
VChoZWlnaHQpOwotCi0gICAgLy8gRm9yIG91dC1vZi1mbG93IGVsZW1lbnRzIHRoZSBjb250YWlu
aW5nIGJsb2NrIGlzIGZvcm1lZCBieSB0aGUgcGFkZGluZyBlZGdlIG9mIHRoZSBhbmNlc3Rvci4K
LSAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwb3NpdGlvbmVkIHZhbHVlIGlzIGluIHRoZSBjb29y
ZGluYXRlIHN5c3RlbSBvZiB0aGUgcGFkZGluZyBib3guIExldCdzIGNvbnZlcnQgaXQgdG8gYm9y
ZGVyIGJveCBjb29yZGluYXRlIHN5c3RlbS4KLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1BhZGRp
bmdWZXJ0aWNhbEVkZ2UgPSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7Ci0gICAgKnRv
cCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOwotICAgICpib3R0b20gKz0g
Y29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZTsKLQotICAgIExPR19XSVRIX1NUUkVB
TShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbUG9zaXRpb25dW0hlaWdodF1b
TWFyZ2luXSAtPiBvdXQtb2YtZmxvdyBub24tcmVwbGFjZWQgLT4gdG9wKCIgPDwgKnRvcCA8PCAi
cHgpIGJvdHRvbSgiICA8PCAqYm90dG9tIDw8ICJweCkgaGVpZ2h0KCIgPDwgKmhlaWdodCA8PCAi
cHgpIG1hcmdpbigiIDw8IHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPDwgInB4LCAiICA8PCB1
c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgPDwgInB4KSBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94
IDw8ICIpIik7Ci0gICAgcmV0dXJuIHsgKnRvcCwgKmJvdHRvbSwgeyAqaGVpZ2h0LCB1c2VkVmVy
dGljYWxNYXJnaW4gfSB9OwotfQotCi1Ib3Jpem9udGFsR2VvbWV0cnkgRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dOb25SZXBsYWNlZEhvcml6b250YWxHZW9tZXRyeShjb25z
dCBDb250YWluZXJCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBo
b3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJiBv
dmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3V0
T2ZGbG93UG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKLSAgICAK
LSAgICAvLyAxMC4zLjcgQWJzb2x1dGVseSBwb3NpdGlvbmVkLCBub24tcmVwbGFjZWQgZWxlbWVu
dHMKLSAgICAvLwotICAgIC8vICdsZWZ0JyArICdtYXJnaW4tbGVmdCcgKyAnYm9yZGVyLWxlZnQt
d2lkdGgnICsgJ3BhZGRpbmctbGVmdCcgKyAnd2lkdGgnICsgJ3BhZGRpbmctcmlnaHQnICsgJ2Jv
cmRlci1yaWdodC13aWR0aCcgKyAnbWFyZ2luLXJpZ2h0JyArICdyaWdodCcKLSAgICAvLyA9IHdp
ZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKLQotICAgIC8vIElmIGFsbCB0aHJlZSBvZiAnbGVmdCcs
ICd3aWR0aCcsIGFuZCAncmlnaHQnIGFyZSAnYXV0byc6IEZpcnN0IHNldCBhbnkgJ2F1dG8nIHZh
bHVlcyBmb3IgJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgdG8gMC4KLSAgICAvLyBU
aGVuLCBpZiB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGVsZW1lbnQgZXN0YWJsaXNo
aW5nIHRoZSBzdGF0aWMtcG9zaXRpb24gY29udGFpbmluZyBibG9jayBpcyAnbHRyJyBzZXQgJ2xl
ZnQnIHRvIHRoZSBzdGF0aWMKLSAgICAvLyBwb3NpdGlvbiBhbmQgYXBwbHkgcnVsZSBudW1iZXIg
dGhyZWUgYmVsb3c7IG90aGVyd2lzZSwgc2V0ICdyaWdodCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlv
biBhbmQgYXBwbHkgcnVsZSBudW1iZXIgb25lIGJlbG93LgotICAgIC8vCi0gICAgLy8gSWYgbm9u
ZSBvZiB0aGUgdGhyZWUgaXMgJ2F1dG8nOiBJZiBib3RoICdtYXJnaW4tbGVmdCcgYW5kICdtYXJn
aW4tcmlnaHQnIGFyZSAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0aGUgZXh0cmEg
Y29uc3RyYWludCB0aGF0IHRoZSB0d28gbWFyZ2lucyBnZXQgZXF1YWwgdmFsdWVzLAotICAgIC8v
IHVubGVzcyB0aGlzIHdvdWxkIG1ha2UgdGhlbSBuZWdhdGl2ZSwgaW4gd2hpY2ggY2FzZSB3aGVu
IGRpcmVjdGlvbiBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAnbHRyJyAoJ3J0bCcpLCBzZXQg
J21hcmdpbi1sZWZ0JyAoJ21hcmdpbi1yaWdodCcpIHRvIHplcm8gYW5kCi0gICAgLy8gc29sdmUg
Zm9yICdtYXJnaW4tcmlnaHQnICgnbWFyZ2luLWxlZnQnKS4gSWYgb25lIG9mICdtYXJnaW4tbGVm
dCcgb3IgJ21hcmdpbi1yaWdodCcgaXMgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gZm9yIHRo
YXQgdmFsdWUuCi0gICAgLy8gSWYgdGhlIHZhbHVlcyBhcmUgb3Zlci1jb25zdHJhaW5lZCwgaWdu
b3JlIHRoZSB2YWx1ZSBmb3IgJ2xlZnQnIChpbiBjYXNlIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0
eSBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAncnRsJykgb3IgJ3JpZ2h0JwotICAgIC8vIChp
biBjYXNlICdkaXJlY3Rpb24nIGlzICdsdHInKSBhbmQgc29sdmUgZm9yIHRoYXQgdmFsdWUuCi0g
ICAgLy8KLSAgICAvLyBPdGhlcndpc2UsIHNldCAnYXV0bycgdmFsdWVzIGZvciAnbWFyZ2luLWxl
ZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyB0byAwLCBhbmQgcGljayB0aGUgb25lIG9mIHRoZSBmb2xs
b3dpbmcgc2l4IHJ1bGVzIHRoYXQgYXBwbGllcy4KLSAgICAvLwotICAgIC8vIDEuICdsZWZ0JyBh
bmQgJ3dpZHRoJyBhcmUgJ2F1dG8nIGFuZCAncmlnaHQnIGlzIG5vdCAnYXV0bycsIHRoZW4gdGhl
IHdpZHRoIGlzIHNocmluay10by1maXQuIFRoZW4gc29sdmUgZm9yICdsZWZ0JwotICAgIC8vIDIu
ICdsZWZ0JyBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nIGFuZCAnd2lkdGgnIGlzIG5vdCAnYXV0bycs
IHRoZW4gaWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGVzdGFibGlz
aGluZyB0aGUgc3RhdGljLXBvc2l0aW9uIAotICAgIC8vICAgIGNvbnRhaW5pbmcgYmxvY2sgaXMg
J2x0cicgc2V0ICdsZWZ0JyB0byB0aGUgc3RhdGljIHBvc2l0aW9uLCBvdGhlcndpc2Ugc2V0ICdy
aWdodCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbi4KLSAgICAvLyAgICBUaGVuIHNvbHZlIGZvciAn
bGVmdCcgKGlmICdkaXJlY3Rpb24gaXMgJ3J0bCcpIG9yICdyaWdodCcgKGlmICdkaXJlY3Rpb24n
IGlzICdsdHInKS4KLSAgICAvLyAzLiAnd2lkdGgnIGFuZCAncmlnaHQnIGFyZSAnYXV0bycgYW5k
ICdsZWZ0JyBpcyBub3QgJ2F1dG8nLCB0aGVuIHRoZSB3aWR0aCBpcyBzaHJpbmstdG8tZml0IC4g
VGhlbiBzb2x2ZSBmb3IgJ3JpZ2h0JwotICAgIC8vIDQuICdsZWZ0JyBpcyAnYXV0bycsICd3aWR0
aCcgYW5kICdyaWdodCcgYXJlIG5vdCAnYXV0bycsIHRoZW4gc29sdmUgZm9yICdsZWZ0JwotICAg
IC8vIDUuICd3aWR0aCcgaXMgJ2F1dG8nLCAnbGVmdCcgYW5kICdyaWdodCcgYXJlIG5vdCAnYXV0
bycsIHRoZW4gc29sdmUgZm9yICd3aWR0aCcKLSAgICAvLyA2LiAncmlnaHQnIGlzICdhdXRvJywg
J2xlZnQnIGFuZCAnd2lkdGgnIGFyZSBub3QgJ2F1dG8nLCB0aGVuIHNvbHZlIGZvciAncmlnaHQn
Ci0KLSAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0
KCk7Ci0gICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICBhdXRvJiBib3hH
ZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0g
ICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dp
Y2FsV2lkdGg7Ci0gICAgYXV0byBpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uID0gbGF5b3V0Qm94LmNv
bnRhaW5pbmdCbG9jaygpLnN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOwotICAgIAot
ICAgIGF1dG8gbGVmdCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbExlZnQoKSwgY29udGFp
bmluZ0Jsb2NrV2lkdGgpOwotICAgIGF1dG8gcmlnaHQgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxv
Z2ljYWxSaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0gICAgYXV0byB3aWR0aCA9IG92
ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoID8gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMud2lkdGggOiBjb21wdXRlZFdpZHRoKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrV2lkdGgp
OwotICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAg
VXNlZEhvcml6b250YWxNYXJnaW4gdXNlZEhvcml6b250YWxNYXJnaW47Ci0gICAgYXV0byBwYWRk
aW5nTGVmdCA9IGJveEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCkudmFsdWVPcigwKTsKLSAgICBhdXRv
IHBhZGRpbmdSaWdodCA9IGJveEdlb21ldHJ5LnBhZGRpbmdSaWdodCgpLnZhbHVlT3IoMCk7Ci0g
ICAgYXV0byBib3JkZXJMZWZ0ID0gYm94R2VvbWV0cnkuYm9yZGVyTGVmdCgpOwotICAgIGF1dG8g
Ym9yZGVyUmlnaHQgPSBib3hHZW9tZXRyeS5ib3JkZXJSaWdodCgpOwotICAgIGlmICghbGVmdCAm
JiAhd2lkdGggJiYgIXJpZ2h0KSB7Ci0gICAgICAgIC8vIElmIGFsbCB0aHJlZSBvZiAnbGVmdCcs
ICd3aWR0aCcsIGFuZCAncmlnaHQnIGFyZSAnYXV0byc6IEZpcnN0IHNldCBhbnkgJ2F1dG8nIHZh
bHVlcyBmb3IgJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgdG8gMC4KLSAgICAgICAg
Ly8gVGhlbiwgaWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGVzdGFi
bGlzaGluZyB0aGUgc3RhdGljLXBvc2l0aW9uIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicgc2V0
ICdsZWZ0JyB0byB0aGUgc3RhdGljCi0gICAgICAgIC8vIHBvc2l0aW9uIGFuZCBhcHBseSBydWxl
IG51bWJlciB0aHJlZSBiZWxvdzsgb3RoZXJ3aXNlLCBzZXQgJ3JpZ2h0JyB0byB0aGUgc3RhdGlj
IHBvc2l0aW9uIGFuZCBhcHBseSBydWxlIG51bWJlciBvbmUgYmVsb3cuCi0gICAgICAgIHVzZWRI
b3Jpem9udGFsTWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVP
cigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07Ci0KLSAgICAg
ICAgYXV0byBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24gPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRp
b25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
KTsKLSAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pCi0gICAgICAgICAgICBsZWZ0
ID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBy
aWdodCA9IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbjsKLSAgICB9IGVsc2UgaWYgKGxlZnQgJiYg
d2lkdGggJiYgcmlnaHQpIHsKLSAgICAgICAgLy8gSWYgbm9uZSBvZiB0aGUgdGhyZWUgaXMgJ2F1
dG8nOiBJZiBib3RoICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIGFyZSAnYXV0bycs
IHNvbHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0aGUgZXh0cmEgY29uc3RyYWludCB0aGF0IHRoZSB0
d28gbWFyZ2lucyBnZXQgZXF1YWwgdmFsdWVzLAotICAgICAgICAvLyB1bmxlc3MgdGhpcyB3b3Vs
ZCBtYWtlIHRoZW0gbmVnYXRpdmUsIGluIHdoaWNoIGNhc2Ugd2hlbiBkaXJlY3Rpb24gb2YgdGhl
IGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicgKCdydGwnKSwgc2V0ICdtYXJnaW4tbGVmdCcgKCdt
YXJnaW4tcmlnaHQnKSB0byB6ZXJvIGFuZAotICAgICAgICAvLyBzb2x2ZSBmb3IgJ21hcmdpbi1y
aWdodCcgKCdtYXJnaW4tbGVmdCcpLiBJZiBvbmUgb2YgJ21hcmdpbi1sZWZ0JyBvciAnbWFyZ2lu
LXJpZ2h0JyBpcyAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiBmb3IgdGhhdCB2YWx1ZS4KLSAg
ICAgICAgLy8gSWYgdGhlIHZhbHVlcyBhcmUgb3Zlci1jb25zdHJhaW5lZCwgaWdub3JlIHRoZSB2
YWx1ZSBmb3IgJ2xlZnQnIChpbiBjYXNlIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUg
Y29udGFpbmluZyBibG9jayBpcyAncnRsJykgb3IgJ3JpZ2h0JwotICAgICAgICAvLyAoaW4gY2Fz
ZSAnZGlyZWN0aW9uJyBpcyAnbHRyJykgYW5kIHNvbHZlIGZvciB0aGF0IHZhbHVlLgotICAgICAg
ICBpZiAoIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiAhY29tcHV0ZWRIb3Jpem9u
dGFsTWFyZ2luLmVuZCkgewotICAgICAgICAgICAgYXV0byBtYXJnaW5TdGFydEFuZEVuZCA9IGNv
bnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsg
KndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqcmlnaHQpOwotICAgICAgICAg
ICAgaWYgKG1hcmdpblN0YXJ0QW5kRW5kID49IDApCi0gICAgICAgICAgICAgICAgdXNlZEhvcml6
b250YWxNYXJnaW4gPSB7IG1hcmdpblN0YXJ0QW5kRW5kIC8gMiwgbWFyZ2luU3RhcnRBbmRFbmQg
LyAyIH07Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNMZWZ0VG9S
aWdodERpcmVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdp
bi5zdGFydCA9IDBfbHU7Ci0gICAgICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2lu
LmVuZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJn
aW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmln
aHQgKyBib3JkZXJSaWdodCArICpyaWdodCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gMF9sdTsKLSAgICAg
ICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSBjb250YWluaW5nQmxv
Y2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBh
ZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kICsgKnJp
Z2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBp
ZiAoIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCkgewotICAgICAgICAgICAgdXNlZEhv
cml6b250YWxNYXJnaW4uZW5kID0gKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQ7Ci0gICAg
ICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRo
IC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1Jp
Z2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOwot
ICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7Ci0gICAg
ICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9ICpjb21wdXRlZEhvcml6b250YWxN
YXJnaW4uc3RhcnQ7Ci0gICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgPSBjb250
YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsg
Ym9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVy
UmlnaHQgKyAqcmlnaHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXNlZEhvcml6
b250YWxNYXJnaW4gPSB7ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQsICpjb21wdXRl
ZEhvcml6b250YWxNYXJnaW4uZW5kIH07Ci0gICAgICAgICAgICAvLyBPdmVyY29uc3RyYWluZWQ/
IElnbm9yZSByaWdodCAobGVmdCkuCi0gICAgICAgICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVj
dGlvbikKLSAgICAgICAgICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVz
ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgKmxlZnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xl
ZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFs
TWFyZ2luLmVuZCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbGVmdCA9IGNv
bnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVy
TGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQg
KyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOwotICAgICAgICB9Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdp
bi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgdG8gMCwgYW5kIHBpY2sgdGhlIG9uZSBvZiB0aGUg
Zm9sbG93aW5nIHNpeCBydWxlcyB0aGF0IGFwcGxpZXMuCi0gICAgICAgIHVzZWRIb3Jpem9udGFs
TWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07Ci0gICAgfQotCi0gICAgaWYg
KCFsZWZ0ICYmICF3aWR0aCAmJiByaWdodCkgewotICAgICAgICAvLyAjMQotICAgICAgICAvLyBD
YWxjdWxhdGUgdGhlIGF2YWlsYWJsZSB3aWR0aCBieSBzb2x2aW5nIGZvciAnd2lkdGgnIGFmdGVy
IHNldHRpbmcgJ2xlZnQnIChpbiBjYXNlIDEpIHRvIDAKLSAgICAgICAgbGVmdCA9IExheW91dFVu
aXQgeyAwIH07Ci0gICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBjb250YWluaW5nQmxvY2tX
aWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCAr
IHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRh
bE1hcmdpbi5lbmQgKyAqcmlnaHQpOwotICAgICAgICB3aWR0aCA9IHNocmlua1RvRml0V2lkdGgo
bGF5b3V0Qm94LCBhdmFpbGFibGVXaWR0aCk7Ci0gICAgICAgIGxlZnQgPSBjb250YWluaW5nQmxv
Y2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRk
aW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCAgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7Ci0gICAgfSBlbHNlIGlmICghbGVmdCAmJiAhcmln
aHQgJiYgd2lkdGgpIHsKLSAgICAgICAgLy8gIzIKLSAgICAgICAgYXV0byBzdGF0aWNIb3Jpem9u
dGFsUG9zaXRpb24gPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlv
bmVkKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgaWYgKGlzTGVm
dFRvUmlnaHREaXJlY3Rpb24pIHsKLSAgICAgICAgICAgIGxlZnQgPSBzdGF0aWNIb3Jpem9udGFs
UG9zaXRpb247Ci0gICAgICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCps
ZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xl
ZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFs
TWFyZ2luLmVuZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByaWdodCA9IHN0YXRp
Y0hvcml6b250YWxQb3NpdGlvbjsKLSAgICAgICAgICAgIGxlZnQgPSBjb250YWluaW5nQmxvY2tX
aWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5n
TGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250
YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXdpZHRo
ICYmICFyaWdodCAmJiBsZWZ0KSB7Ci0gICAgICAgIC8vICMzCi0gICAgICAgIC8vIENhbGN1bGF0
ZSB0aGUgYXZhaWxhYmxlIHdpZHRoIGJ5IHNvbHZpbmcgZm9yICd3aWR0aCcgYWZ0ZXIgc2V0dGlu
ZyAncmlnaHQnIChpbiBjYXNlIDMpIHRvIDAKLSAgICAgICAgcmlnaHQgPSBMYXlvdXRVbml0IHsg
MCB9OwotICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gY29udGFpbmluZ0Jsb2NrV2lkdGgg
LSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRk
aW5nTGVmdCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJn
aW4uZW5kICsgKnJpZ2h0KTsKLSAgICAgICAgd2lkdGggPSBzaHJpbmtUb0ZpdFdpZHRoKGxheW91
dEJveCwgYXZhaWxhYmxlV2lkdGgpOwotICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9ja1dp
ZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsg
cGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRI
b3Jpem9udGFsTWFyZ2luLmVuZCk7Ci0gICAgfSBlbHNlIGlmICghbGVmdCAmJiB3aWR0aCAmJiBy
aWdodCkgewotICAgICAgICAvLyAjNAotICAgICAgICBsZWZ0ID0gY29udGFpbmluZ0Jsb2NrV2lk
dGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xl
ZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFs
TWFyZ2luLmVuZCArICpyaWdodCk7Ci0gICAgfSBlbHNlIGlmICghd2lkdGggJiYgbGVmdCAmJiBy
aWdodCkgewotICAgICAgICAvLyAjNQotICAgICAgICB3aWR0aCA9IGNvbnRhaW5pbmdCbG9ja1dp
ZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsg
cGFkZGluZ0xlZnQgKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFs
TWFyZ2luLmVuZCArICpyaWdodCk7Ci0gICAgfSBlbHNlIGlmICghcmlnaHQgJiYgbGVmdCAmJiB3
aWR0aCkgewotICAgICAgICAvLyAjNgotICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9ja1dp
ZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsg
cGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRI
b3Jpem9udGFsTWFyZ2luLmVuZCk7Ci0gICAgfQotCi0gICAgQVNTRVJUKGxlZnQpOwotICAgIEFT
U0VSVChyaWdodCk7Ci0gICAgQVNTRVJUKHdpZHRoKTsKLQotICAgIC8vIEZvciBvdXQtb2YtZmxv
dyBlbGVtZW50cyB0aGUgY29udGFpbmluZyBibG9jayBpcyBmb3JtZWQgYnkgdGhlIHBhZGRpbmcg
ZWRnZSBvZiB0aGUgYW5jZXN0b3IuCi0gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcG9zaXRpb25l
ZCB2YWx1ZSBpcyBpbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIHBhZGRpbmcgYm94LiBM
ZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBib3ggY29vcmRpbmF0ZSBzeXN0ZW0uCi0gICAgYXV0
byBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlID0gaG9yaXpvbnRhbENvbnN0cmFp
bnRzLmxvZ2ljYWxMZWZ0OwotICAgICpsZWZ0ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0
aWNhbEVkZ2U7Ci0gICAgKnJpZ2h0ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVk
Z2U7Ci0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVh
bSA8PCAiW1Bvc2l0aW9uXVtXaWR0aF1bTWFyZ2luXSAtPiBvdXQtb2YtZmxvdyBub24tcmVwbGFj
ZWQgLT4gbGVmdCgiIDw8ICpsZWZ0IDw8ICJweCkgcmlnaHQoIiAgPDwgKnJpZ2h0IDw8ICJweCkg
d2lkdGgoIiA8PCAqd2lkdGggPDwgInB4KSBtYXJnaW4oIiA8PCB1c2VkSG9yaXpvbnRhbE1hcmdp
bi5zdGFydCA8PCAicHgsICIgIDw8IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA8PCAicHgpIGxh
eW91dEJveCgiIDw8ICZsYXlvdXRCb3ggPDwgIikiKTsKLSAgICByZXR1cm4geyAqbGVmdCwgKnJp
Z2h0LCB7ICp3aWR0aCwgdXNlZEhvcml6b250YWxNYXJnaW4gfSB9OwotfQotCi1WZXJ0aWNhbEdl
b21ldHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93UmVwbGFjZWRWZXJ0
aWNhbEdlb21ldHJ5KGNvbnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRpY2FsQ29u
c3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZh
bHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAgIEFTU0VSVChyZXBs
YWNlZEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7Ci0gICAgQVNTRVJUKHZlcnRpY2FsQ29u
c3RyYWludHMubG9naWNhbEhlaWdodCk7Ci0KLSAgICAvLyAxMC42LjUgQWJzb2x1dGVseSBwb3Np
dGlvbmVkLCByZXBsYWNlZCBlbGVtZW50cwotICAgIC8vCi0gICAgLy8gVGhlIHVzZWQgdmFsdWUg
b2YgJ2hlaWdodCcgaXMgZGV0ZXJtaW5lZCBhcyBmb3IgaW5saW5lIHJlcGxhY2VkIGVsZW1lbnRz
LgotICAgIC8vIElmICdtYXJnaW4tdG9wJyBvciAnbWFyZ2luLWJvdHRvbScgaXMgc3BlY2lmaWVk
IGFzICdhdXRvJyBpdHMgdXNlZCB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBydWxlcyBiZWxv
dy4KLSAgICAvLyAxLiBJZiBib3RoICd0b3AnIGFuZCAnYm90dG9tJyBoYXZlIHRoZSB2YWx1ZSAn
YXV0bycsIHJlcGxhY2UgJ3RvcCcgd2l0aCB0aGUgZWxlbWVudCdzIHN0YXRpYyBwb3NpdGlvbi4K
LSAgICAvLyAyLiBJZiAnYm90dG9tJyBpcyAnYXV0bycsIHJlcGxhY2UgYW55ICdhdXRvJyBvbiAn
bWFyZ2luLXRvcCcgb3IgJ21hcmdpbi1ib3R0b20nIHdpdGggJzAnLgotICAgIC8vIDMuIElmIGF0
IHRoaXMgcG9pbnQgYm90aCAnbWFyZ2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyBhcmUgc3Rp
bGwgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4dHJhIGNvbnN0cmFpbnQg
dGhhdCB0aGUgdHdvIG1hcmdpbnMgbXVzdCBnZXQgZXF1YWwgdmFsdWVzLgotICAgIC8vIDQuIElm
IGF0IHRoaXMgcG9pbnQgdGhlcmUgaXMgb25seSBvbmUgJ2F1dG8nIGxlZnQsIHNvbHZlIHRoZSBl
cXVhdGlvbiBmb3IgdGhhdCB2YWx1ZS4KLSAgICAvLyA1LiBJZiBhdCB0aGlzIHBvaW50IHRoZSB2
YWx1ZXMgYXJlIG92ZXItY29uc3RyYWluZWQsIGlnbm9yZSB0aGUgdmFsdWUgZm9yICdib3R0b20n
IGFuZCBzb2x2ZSBmb3IgdGhhdCB2YWx1ZS4KLQotICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0
ID0gdGhpcy0+Zm9ybWF0dGluZ0NvbnRleHQoKTsKLSAgICBhdXRvJiBzdHlsZSA9IHJlcGxhY2Vk
Qm94LnN0eWxlKCk7Ci0gICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5n
ZW9tZXRyeUZvckJveChyZXBsYWNlZEJveCk7Ci0gICAgYXV0byBjb250YWluaW5nQmxvY2tIZWln
aHQgPSAqdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2FsSGVpZ2h0OwotICAgIGF1dG8gY29udGFp
bmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoOwotCi0g
ICAgYXV0byB0b3AgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxUb3AoKSwgY29udGFpbmlu
Z0Jsb2NrV2lkdGgpOwotICAgIGF1dG8gYm90dG9tID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dp
Y2FsQm90dG9tKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLSAgICBhdXRvIGhlaWdodCA9IGlu
bGluZVJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRh
bENvbnN0cmFpbnRzLCB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1
ZXMpLmNvbnRlbnRIZWlnaHQ7Ci0gICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gR2Vv
bWV0cnk6OmNvbXB1dGVkVmVydGljYWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cyk7Ci0gICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZE1hcmdpbkJlZm9yZSA9IGNv
bXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlOwotICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IHVz
ZWRNYXJnaW5BZnRlciA9IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXI7Ci0gICAgYXV0byBw
YWRkaW5nVG9wID0gYm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCk7Ci0gICAgYXV0
byBwYWRkaW5nQm90dG9tID0gYm94R2VvbWV0cnkucGFkZGluZ0JvdHRvbSgpLnZhbHVlT3IoMCk7
Ci0gICAgYXV0byBib3JkZXJUb3AgPSBib3hHZW9tZXRyeS5ib3JkZXJUb3AoKTsKLSAgICBhdXRv
IGJvcmRlckJvdHRvbSA9IGJveEdlb21ldHJ5LmJvcmRlckJvdHRvbSgpOwotCi0gICAgaWYgKCF0
b3AgJiYgIWJvdHRvbSkgewotICAgICAgICAvLyAjMQotICAgICAgICB0b3AgPSBzdGF0aWNWZXJ0
aWNhbFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChyZXBsYWNlZEJveCwgdmVydGljYWxD
b25zdHJhaW50cyk7Ci0gICAgfQotCi0gICAgaWYgKCFib3R0b20pIHsKLSAgICAgICAgLy8gIzIK
LSAgICAgICAgdXNlZE1hcmdpbkJlZm9yZSA9IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3Jl
LnZhbHVlT3IoMCk7Ci0gICAgICAgIHVzZWRNYXJnaW5BZnRlciA9IHVzZWRNYXJnaW5CZWZvcmU7
Ci0gICAgfQotCi0gICAgaWYgKCF1c2VkTWFyZ2luQmVmb3JlICYmICF1c2VkTWFyZ2luQWZ0ZXIp
IHsKLSAgICAgICAgLy8gIzMKLSAgICAgICAgYXV0byBtYXJnaW5CZWZvcmVBbmRBZnRlciA9IGNv
bnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhl
aWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqYm90dG9tKTsKLSAgICAgICAg
dXNlZE1hcmdpbkJlZm9yZSA9IG1hcmdpbkJlZm9yZUFuZEFmdGVyIC8gMjsKLSAgICAgICAgdXNl
ZE1hcmdpbkFmdGVyID0gdXNlZE1hcmdpbkJlZm9yZTsKLSAgICB9Ci0KLSAgICAvLyAjNAotICAg
IGlmICghdG9wKQotICAgICAgICB0b3AgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnVzZWRN
YXJnaW5CZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgaGVpZ2h0ICsgcGFkZGluZ0Jv
dHRvbSArIGJvcmRlckJvdHRvbSArICp1c2VkTWFyZ2luQWZ0ZXIgKyAqYm90dG9tKTsKLQotICAg
IGlmICghYm90dG9tKQotICAgICAgICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAo
KnRvcCArICp1c2VkTWFyZ2luQmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdo
dCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyKTsKLQot
ICAgIGlmICghdXNlZE1hcmdpbkJlZm9yZSkKLSAgICAgICAgdXNlZE1hcmdpbkJlZm9yZSA9IGNv
bnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhl
aWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyICsg
KmJvdHRvbSk7Ci0KLSAgICBpZiAoIXVzZWRNYXJnaW5BZnRlcikKLSAgICAgICAgdXNlZE1hcmdp
bkFmdGVyID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyAqdXNlZE1hcmdpbkJlZm9y
ZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9y
ZGVyQm90dG9tICsgKmJvdHRvbSk7Ci0KLSAgICAvLyAjNQotICAgIGF1dG8gYm94SGVpZ2h0ID0g
KnRvcCArICp1c2VkTWFyZ2luQmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdo
dCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyICsgKmJv
dHRvbTsKLSAgICBpZiAoYm94SGVpZ2h0ID4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KQotICAgICAg
ICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArICp1c2VkTWFyZ2luQmVm
b3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBi
b3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyKTsgCi0KLSAgICAvLyBGb3Igb3V0LW9mLWZs
b3cgZWxlbWVudHMgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgZm9ybWVkIGJ5IHRoZSBwYWRkaW5n
IGVkZ2Ugb2YgdGhlIGFuY2VzdG9yLgotICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBvc2l0aW9u
ZWQgdmFsdWUgaXMgaW4gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBwYWRkaW5nIGJveC4g
TGV0J3MgY29udmVydCBpdCB0byBib3JkZXIgYm94IGNvb3JkaW5hdGUgc3lzdGVtLgotICAgIGF1
dG8gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZSA9IHZlcnRpY2FsQ29uc3RyYWlu
dHMubG9naWNhbFRvcDsKLSAgICAqdG9wICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNh
bEVkZ2U7Ci0gICAgKmJvdHRvbSArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdl
OwotCi0gICAgQVNTRVJUKHRvcCk7Ci0gICAgQVNTRVJUKGJvdHRvbSk7Ci0gICAgQVNTRVJUKHVz
ZWRNYXJnaW5CZWZvcmUpOwotICAgIEFTU0VSVCh1c2VkTWFyZ2luQWZ0ZXIpOwotICAgIExPR19X
SVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbUG9zaXRpb25d
W0hlaWdodF1bTWFyZ2luXSAtPiBvdXQtb2YtZmxvdyByZXBsYWNlZCAtPiB0b3AoIiA8PCAqdG9w
IDw8ICJweCkgYm90dG9tKCIgIDw8ICpib3R0b20gPDwgInB4KSBoZWlnaHQoIiA8PCBoZWlnaHQg
PDwgInB4KSBtYXJnaW4oIiA8PCAqdXNlZE1hcmdpbkJlZm9yZSA8PCAicHgsICIgIDw8ICp1c2Vk
TWFyZ2luQWZ0ZXIgPDwgInB4KSBsYXlvdXRCb3goIiA8PCAmcmVwbGFjZWRCb3ggPDwgIikiKTsK
LSAgICByZXR1cm4geyAqdG9wLCAqYm90dG9tLCB7IGhlaWdodCwgeyAqdXNlZE1hcmdpbkJlZm9y
ZSwgKnVzZWRNYXJnaW5BZnRlciB9IH0gfTsKLX0KLQotSG9yaXpvbnRhbEdlb21ldHJ5IEZvcm1h
dHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93UmVwbGFjZWRIb3Jpem9udGFsR2VvbWV0
cnkoY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYg
dmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92
ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQotewotICAgIEFTU0VSVChyZXBsYWNlZEJveC5pc091
dE9mRmxvd1Bvc2l0aW9uZWQoKSk7Ci0KLSAgICAvLyAxMC4zLjggQWJzb2x1dGVseSBwb3NpdGlv
bmVkLCByZXBsYWNlZCBlbGVtZW50cwotICAgIC8vIEluIHRoaXMgY2FzZSwgc2VjdGlvbiAxMC4z
LjcgYXBwbGllcyB1cCB0aHJvdWdoIGFuZCBpbmNsdWRpbmcgdGhlIGNvbnN0cmFpbnQgZXF1YXRp
b24sIGJ1dCB0aGUgcmVzdCBvZiBzZWN0aW9uIDEwLjMuNyBpcyByZXBsYWNlZCBieSB0aGUgZm9s
bG93aW5nIHJ1bGVzOgotICAgIC8vCi0gICAgLy8gVGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBp
cyBkZXRlcm1pbmVkIGFzIGZvciBpbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMuIElmICdtYXJnaW4t
bGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgaXMgc3BlY2lmaWVkIGFzICdhdXRvJyBpdHMgdXNlZCB2
YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBydWxlcyBiZWxvdy4KLSAgICAvLyAxLiBJZiBib3Ro
ICdsZWZ0JyBhbmQgJ3JpZ2h0JyBoYXZlIHRoZSB2YWx1ZSAnYXV0bycsIHRoZW4gaWYgdGhlICdk
aXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGVzdGFibGlzaGluZyB0aGUgc3RhdGlj
LXBvc2l0aW9uIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicsCi0gICAgLy8gICBzZXQgJ2xlZnQn
IHRvIHRoZSBzdGF0aWMgcG9zaXRpb247IGVsc2UgaWYgJ2RpcmVjdGlvbicgaXMgJ3J0bCcsIHNl
dCAncmlnaHQnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb24uCi0gICAgLy8gMi4gSWYgJ2xlZnQnIG9y
ICdyaWdodCcgYXJlICdhdXRvJywgcmVwbGFjZSBhbnkgJ2F1dG8nIG9uICdtYXJnaW4tbGVmdCcg
b3IgJ21hcmdpbi1yaWdodCcgd2l0aCAnMCcuCi0gICAgLy8gMy4gSWYgYXQgdGhpcyBwb2ludCBi
b3RoICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIGFyZSBzdGlsbCAnYXV0bycsIHNv
bHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0aGUgZXh0cmEgY29uc3RyYWludCB0aGF0IHRoZSB0d28g
bWFyZ2lucyBtdXN0IGdldCBlcXVhbCB2YWx1ZXMsCi0gICAgLy8gICB1bmxlc3MgdGhpcyB3b3Vs
ZCBtYWtlIHRoZW0gbmVnYXRpdmUsIGluIHdoaWNoIGNhc2Ugd2hlbiB0aGUgZGlyZWN0aW9uIG9m
IHRoZSBjb250YWluaW5nIGJsb2NrIGlzICdsdHInICgncnRsJyksIHNldCAnbWFyZ2luLWxlZnQn
ICgnbWFyZ2luLXJpZ2h0JykgdG8gemVybyBhbmQKLSAgICAvLyAgIHNvbHZlIGZvciAnbWFyZ2lu
LXJpZ2h0JyAoJ21hcmdpbi1sZWZ0JykuCi0gICAgLy8gNC4gSWYgYXQgdGhpcyBwb2ludCB0aGVy
ZSBpcyBhbiAnYXV0bycgbGVmdCwgc29sdmUgdGhlIGVxdWF0aW9uIGZvciB0aGF0IHZhbHVlLgot
ICAgIC8vIDUuIElmIGF0IHRoaXMgcG9pbnQgdGhlIHZhbHVlcyBhcmUgb3Zlci1jb25zdHJhaW5l
ZCwgaWdub3JlIHRoZSB2YWx1ZSBmb3IgZWl0aGVyICdsZWZ0JyAoaW4gY2FzZSB0aGUgJ2RpcmVj
dGlvbicgcHJvcGVydHkgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ3J0bCcpIG9yCi0gICAg
Ly8gICAncmlnaHQnIChpbiBjYXNlICdkaXJlY3Rpb24nIGlzICdsdHInKSBhbmQgc29sdmUgZm9y
IHRoYXQgdmFsdWUuCi0KLSAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1h
dHRpbmdDb250ZXh0KCk7Ci0gICAgYXV0byYgc3R5bGUgPSByZXBsYWNlZEJveC5zdHlsZSgpOwot
ICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3go
cmVwbGFjZWRCb3gpOwotICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFs
Q29uc3RyYWludHMubG9naWNhbFdpZHRoOwotICAgIGF1dG8gaXNMZWZ0VG9SaWdodERpcmVjdGlv
biA9IHJlcGxhY2VkQm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCkuaXNMZWZ0VG9SaWdodERp
cmVjdGlvbigpOwotCi0gICAgYXV0byBsZWZ0ID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2Fs
TGVmdCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0gICAgYXV0byByaWdodCA9IGNvbXB1dGVk
VmFsdWUoc3R5bGUubG9naWNhbFJpZ2h0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLSAgICBh
dXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6b250
YWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgT3B0aW9u
YWw8TGF5b3V0VW5pdD4gdXNlZE1hcmdpblN0YXJ0ID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LnN0YXJ0OwotICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRNYXJnaW5FbmQgPSBjb21wdXRl
ZEhvcml6b250YWxNYXJnaW4uZW5kOwotICAgIGF1dG8gd2lkdGggPSBpbmxpbmVSZXBsYWNlZENv
bnRlbnRXaWR0aEFuZE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB2
ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykuY29udGVudFdp
ZHRoOwotICAgIGF1dG8gcGFkZGluZ0xlZnQgPSBib3hHZW9tZXRyeS5wYWRkaW5nTGVmdCgpLnZh
bHVlT3IoMCk7Ci0gICAgYXV0byBwYWRkaW5nUmlnaHQgPSBib3hHZW9tZXRyeS5wYWRkaW5nUmln
aHQoKS52YWx1ZU9yKDApOwotICAgIGF1dG8gYm9yZGVyTGVmdCA9IGJveEdlb21ldHJ5LmJvcmRl
ckxlZnQoKTsKLSAgICBhdXRvIGJvcmRlclJpZ2h0ID0gYm94R2VvbWV0cnkuYm9yZGVyUmlnaHQo
KTsKLQotICAgIGlmICghbGVmdCAmJiAhcmlnaHQpIHsKLSAgICAgICAgLy8gIzEKLSAgICAgICAg
YXV0byBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24gPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb25G
b3JPdXRPZkZsb3dQb3NpdGlvbmVkKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMp
OwotICAgICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikKLSAgICAgICAgICAgIGxlZnQg
PSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb247Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJp
Z2h0ID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uOwotICAgIH0KLQotICAgIGlmICghbGVmdCB8
fCAhcmlnaHQpIHsKLSAgICAgICAgLy8gIzIKLSAgICAgICAgdXNlZE1hcmdpblN0YXJ0ID0gY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCk7Ci0gICAgICAgIHVzZWRNYXJn
aW5FbmQgPSBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMCk7Ci0gICAgfQot
Ci0gICAgaWYgKCF1c2VkTWFyZ2luU3RhcnQgJiYgIXVzZWRNYXJnaW5FbmQpIHsKLSAgICAgICAg
Ly8gIzMKLSAgICAgICAgYXV0byBtYXJnaW5TdGFydEFuZEVuZCA9IGNvbnRhaW5pbmdCbG9ja1dp
ZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5n
UmlnaHQgKyBib3JkZXJSaWdodCArICpyaWdodCk7Ci0gICAgICAgIGlmIChtYXJnaW5TdGFydEFu
ZEVuZCA+PSAwKSB7Ci0gICAgICAgICAgICB1c2VkTWFyZ2luU3RhcnQgPSBtYXJnaW5TdGFydEFu
ZEVuZCAvIDI7Ci0gICAgICAgICAgICB1c2VkTWFyZ2luRW5kID0gdXNlZE1hcmdpblN0YXJ0Owot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24p
IHsKLSAgICAgICAgICAgICAgICB1c2VkTWFyZ2luU3RhcnQgPSAwX2x1OwotICAgICAgICAgICAg
ICAgIHVzZWRNYXJnaW5FbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArICp1c2Vk
TWFyZ2luU3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdS
aWdodCArIGJvcmRlclJpZ2h0ICsgKnJpZ2h0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICAgICAgdXNlZE1hcmdpbkVuZCA9IDBfbHU7Ci0gICAgICAgICAgICAgICAgdXNlZE1h
cmdpblN0YXJ0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyBib3JkZXJMZWZ0ICsg
cGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnVzZWRN
YXJnaW5FbmQgKyAqcmlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgLy8gIzQKLSAgICBpZiAoIWxlZnQpCi0gICAgICAgIGxlZnQgPSBjb250YWluaW5nQmxvY2tX
aWR0aCAtICgqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lk
dGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFyZ2luRW5kICsgKnJpZ2h0
KTsKLQotICAgIGlmICghcmlnaHQpCi0gICAgICAgIHJpZ2h0ID0gY29udGFpbmluZ0Jsb2NrV2lk
dGggLSAoKmxlZnQgKyAqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0
ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFyZ2luRW5kKTsK
LQotICAgIGlmICghdXNlZE1hcmdpblN0YXJ0KQotICAgICAgICB1c2VkTWFyZ2luU3RhcnQgPSBj
b250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCAr
IHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNlZE1hcmdpbkVuZCArICpy
aWdodCk7Ci0KLSAgICBpZiAoIXVzZWRNYXJnaW5FbmQpCi0gICAgICAgIHVzZWRNYXJnaW5FbmQg
PSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArICp1c2VkTWFyZ2luU3RhcnQgKyBib3Jk
ZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0
ICsgKnJpZ2h0KTsKLQotICAgIGF1dG8gYm94V2lkdGggPSAoKmxlZnQgKyAqdXNlZE1hcmdpblN0
YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBi
b3JkZXJSaWdodCArICp1c2VkTWFyZ2luRW5kICsgKnJpZ2h0KTsKLSAgICBpZiAoYm94V2lkdGgg
PiBjb250YWluaW5nQmxvY2tXaWR0aCkgewotICAgICAgICAvLyAjNSBPdmVyLWNvbnN0cmFpbmVk
PwotICAgICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikKLSAgICAgICAgICAgIHJpZ2h0
ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyAqdXNlZE1hcmdpblN0YXJ0ICsgYm9y
ZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdo
dCArICp1c2VkTWFyZ2luRW5kKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGVmdCA9IGNv
bnRhaW5pbmdCbG9ja1dpZHRoIC0gKCp1c2VkTWFyZ2luU3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnVzZWRNYXJn
aW5FbmQgKyAqcmlnaHQpOwotICAgIH0KLQotICAgIEFTU0VSVChsZWZ0KTsKLSAgICBBU1NFUlQo
cmlnaHQpOwotICAgIEFTU0VSVCh1c2VkTWFyZ2luU3RhcnQpOwotICAgIEFTU0VSVCh1c2VkTWFy
Z2luRW5kKTsKLQotICAgIC8vIEZvciBvdXQtb2YtZmxvdyBlbGVtZW50cyB0aGUgY29udGFpbmlu
ZyBibG9jayBpcyBmb3JtZWQgYnkgdGhlIHBhZGRpbmcgZWRnZSBvZiB0aGUgYW5jZXN0b3IuCi0g
ICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcG9zaXRpb25lZCB2YWx1ZSBpcyBpbiB0aGUgY29vcmRp
bmF0ZSBzeXN0ZW0gb2YgdGhlIHBhZGRpbmcgYm94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRl
ciBib3ggY29vcmRpbmF0ZSBzeXN0ZW0uCi0gICAgYXV0byBjb250YWluaW5nQmxvY2tQYWRkaW5n
VmVydGljYWxFZGdlID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxMZWZ0OwotICAgICps
ZWZ0ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7Ci0gICAgKnJpZ2h0ICs9
IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7Ci0KLSAgICBMT0dfV0lUSF9TVFJF
QU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1Bvc2l0aW9uXVtXaWR0aF1b
TWFyZ2luXSAtPiBvdXQtb2YtZmxvdyByZXBsYWNlZCAtPiBsZWZ0KCIgPDwgKmxlZnQgPDwgInB4
KSByaWdodCgiICA8PCAqcmlnaHQgPDwgInB4KSB3aWR0aCgiIDw8IHdpZHRoIDw8ICJweCkgbWFy
Z2luKCIgPDwgKnVzZWRNYXJnaW5TdGFydCA8PCAicHgsICIgIDw8ICp1c2VkTWFyZ2luRW5kIDw8
ICJweCkgbGF5b3V0Qm94KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIHsg
KmxlZnQsICpyaWdodCwgeyB3aWR0aCwgeyAqdXNlZE1hcmdpblN0YXJ0LCAqdXNlZE1hcmdpbkVu
ZCB9IH0gfTsKLX0KLQotQ29udGVudEhlaWdodEFuZE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6
R2VvbWV0cnk6OmNvbXBsaWNhdGVkQ2FzZXMoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlk
ZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgY29uc3QKLXsKLSAg
ICBBU1NFUlQoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpOwotICAgIC8vIFRPRE86IFVzZSBj
b21wbGljYXRlZC1jYXNlIGZvciBkb2N1bWVudCByZW5kZXJlciBmb3Igbm93IChzZWUgQmxvY2tG
b3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd0hlaWdodEFuZE1hcmdpbikuCi0gICAg
QVNTRVJUKChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkgJiYgbGF5b3V0Qm94LmlzSW5GbG93
KCkgJiYgIWxheW91dEJveC5pc092ZXJmbG93VmlzaWJsZSgpKSB8fCBsYXlvdXRCb3guaXNJbmxp
bmVCbG9ja0JveCgpIHx8IGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpIHx8IGxheW91
dEJveC5pc0RvY3VtZW50Qm94KCkgfHwgbGF5b3V0Qm94LmlzVGFibGVCb3goKSk7Ci0KLSAgICAv
LyAxMC42LjYgQ29tcGxpY2F0ZWQgY2FzZXMKLSAgICAvLwotICAgIC8vIEJsb2NrLWxldmVsLCBu
b24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgd2hlbiAnb3ZlcmZsb3cnIGRvZXMg
bm90IGNvbXB1dGUgdG8gJ3Zpc2libGUnIChleGNlcHQgaWYgdGhlICdvdmVyZmxvdycgcHJvcGVy
dHkncyB2YWx1ZSBoYXMgYmVlbiBwcm9wYWdhdGVkIHRvIHRoZSB2aWV3cG9ydCkuCi0gICAgLy8g
J0lubGluZS1ibG9jaycsIG5vbi1yZXBsYWNlZCBlbGVtZW50cy4KLSAgICAvLyBGbG9hdGluZywg
bm9uLXJlcGxhY2VkIGVsZW1lbnRzLgotICAgIC8vCi0gICAgLy8gMS4gSWYgJ21hcmdpbi10b3An
LCBvciAnbWFyZ2luLWJvdHRvbScgYXJlICdhdXRvJywgdGhlaXIgdXNlZCB2YWx1ZSBpcyAwLgot
ICAgIC8vIDIuIElmICdoZWlnaHQnIGlzICdhdXRvJywgdGhlIGhlaWdodCBkZXBlbmRzIG9uIHRo
ZSBlbGVtZW50J3MgZGVzY2VuZGFudHMgcGVyIDEwLjYuNy4KLQotICAgIGF1dG8gaGVpZ2h0ID0g
b3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVl
cy5oZWlnaHQudmFsdWUoKSA6IGNvbXB1dGVkSGVpZ2h0KGxheW91dEJveCk7Ci0gICAgYXV0byBj
b21wdXRlZFZlcnRpY2FsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVkVmVydGljYWxNYXJnaW4o
bGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgIC8vICMxCi0gICAgYXV0byB1
c2VkVmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVl
cyB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVy
dGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OyAKLSAgICAvLyAjMgotICAgIGlmICghaGVp
Z2h0KSB7Ci0gICAgICAgIEFTU0VSVChpc0hlaWdodEF1dG8obGF5b3V0Qm94KSk7Ci0gICAgICAg
IGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxDb250YWluZXJC
b3g+KGxheW91dEJveCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCi0gICAgICAgICAgICBo
ZWlnaHQgPSAwX2x1OwotICAgICAgICBlbHNlIGlmIChsYXlvdXRCb3guaXNEb2N1bWVudEJveCgp
ICYmICFsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAgICAg
ICAgICBhdXRvJiBkb2N1bWVudEJveCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94
KTsKLSAgICAgICAgICAgIGF1dG8gdG9wID0gQm94R2VvbWV0cnk6Om1hcmdpbkJveFJlY3QoZm9y
bWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveCgqZG9jdW1lbnRCb3guZmlyc3RJbkZsb3dD
aGlsZCgpKSkudG9wKCk7Ci0gICAgICAgICAgICBhdXRvIGJvdHRvbSA9IEJveEdlb21ldHJ5Ojpt
YXJnaW5Cb3hSZWN0KGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goKmRvY3VtZW50
Qm94Lmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7Ci0gICAgICAgICAgICAvLyBUaGlzIGlz
IGEgc3BlY2lhbCAocXVpcms/KSBiZWhhdmlvciBzaW5jZSB0aGUgZG9jdW1lbnQgYm94IGlzIG5v
dCBhIGZvcm1hdHRpbmcgY29udGV4dCByb290IGFuZAotICAgICAgICAgICAgLy8gYWxsIHRoZSBm
bG9hdCBib3hlcyBlbmQgdXAgYXQgdGhlIElDQiBsZXZlbC4KLSAgICAgICAgICAgIGF1dG8mIGlu
aXRpYWxDb250YWluaW5nQmxvY2sgPSBkb2N1bWVudEJveC5mb3JtYXR0aW5nQ29udGV4dFJvb3Qo
KTsKLSAgICAgICAgICAgIGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250ZXh0IHsg
Zm9ybWF0dGluZ0NvbnRleHQoKSwgbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZEZvcm1hdHRpbmdT
dGF0ZShpbml0aWFsQ29udGFpbmluZ0Jsb2NrKS5mbG9hdGluZ1N0YXRlKCkgfTsKLSAgICAgICAg
ICAgIGlmIChhdXRvIGZsb2F0Qm90dG9tID0gZmxvYXRpbmdDb250ZXh0LmJvdHRvbSgpKSB7Ci0g
ICAgICAgICAgICAgICAgYm90dG9tID0gc3RkOjptYXg8TGF5b3V0VW5pdD4oKmZsb2F0Qm90dG9t
LCBib3R0b20pOwotICAgICAgICAgICAgICAgIGF1dG8gZmxvYXRUb3AgPSBmbG9hdGluZ0NvbnRl
eHQudG9wKCk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKGZsb2F0VG9wKTsKLSAgICAgICAgICAg
ICAgICB0b3AgPSBzdGQ6Om1pbjxMYXlvdXRVbml0PigqZmxvYXRUb3AsIHRvcCk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBoZWlnaHQgPSBib3R0b20gLSB0b3A7Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICBBU1NFUlQobGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0Nv
bnRleHQoKSk7Ci0gICAgICAgICAgICBoZWlnaHQgPSBjb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGlu
Z0NvbnRleHRSb290KGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KSk7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBBU1NFUlQoaGVpZ2h0KTsKLQotICAgIExPR19XSVRIX1NUUkVBTShG
b3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbSGVpZ2h0XVtNYXJnaW5dIC0+IGZs
b2F0aW5nIG5vbi1yZXBsYWNlZCAtPiBoZWlnaHQoIiA8PCAqaGVpZ2h0IDw8ICJweCkgbWFyZ2lu
KCIgPDwgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSA8PCAicHgsICIgPDwgdXNlZFZlcnRpY2Fs
TWFyZ2luLmFmdGVyIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIp
OwotICAgIHJldHVybiBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIHsgKmhlaWdodCwgdXNlZFZlcnRp
Y2FsTWFyZ2luIH07Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4
dDo6R2VvbWV0cnk6OmZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29u
c3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRh
bENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0aW5nUG9z
aXRpb25lZCgpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKLQotICAgIC8vIDEwLjMu
NSBGbG9hdGluZywgbm9uLXJlcGxhY2VkIGVsZW1lbnRzCi0gICAgLy8KLSAgICAvLyAxLiBJZiAn
bWFyZ2luLWxlZnQnLCBvciAnbWFyZ2luLXJpZ2h0JyBhcmUgY29tcHV0ZWQgYXMgJ2F1dG8nLCB0
aGVpciB1c2VkIHZhbHVlIGlzICcwJy4KLSAgICAvLyAyLiBJZiAnd2lkdGgnIGlzIGNvbXB1dGVk
IGFzICdhdXRvJywgdGhlIHVzZWQgdmFsdWUgaXMgdGhlICJzaHJpbmstdG8tZml0IiB3aWR0aC4K
LQotICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0KLSAg
ICAvLyAjMQotICAgIGF1dG8gdXNlZEhvcml6b250YWxsTWFyZ2luID0gVXNlZEhvcml6b250YWxN
YXJnaW4geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07Ci0gICAgLy8gIzIKLSAgICBhdXRv
IHdpZHRoID0gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGggPyBvdmVycmlkZGVuSG9y
aXpvbnRhbFZhbHVlcy53aWR0aCA6IGNvbXB1dGVkV2lkdGgobGF5b3V0Qm94LCBob3Jpem9udGFs
Q29uc3RyYWludHMubG9naWNhbFdpZHRoKTsKLSAgICBpZiAoIXdpZHRoKQotICAgICAgICB3aWR0
aCA9IHNocmlua1RvRml0V2lkdGgobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMubG9n
aWNhbFdpZHRoKTsKLQotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91
dCwgc3RyZWFtIDw8ICJbV2lkdGhdW01hcmdpbl0gLT4gZmxvYXRpbmcgbm9uLXJlcGxhY2VkIC0+
IHdpZHRoKCIgPDwgKndpZHRoIDw8ICJweCkgbWFyZ2luKCIgPDwgdXNlZEhvcml6b250YWxsTWFy
Z2luLnN0YXJ0IDw8ICJweCwgIiA8PCB1c2VkSG9yaXpvbnRhbGxNYXJnaW4uZW5kIDw8ICJweCkg
LT4gbGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIpOwotICAgIHJldHVybiBDb250ZW50
V2lkdGhBbmRNYXJnaW4geyAqd2lkdGgsIHVzZWRIb3Jpem9udGFsbE1hcmdpbiB9OwotfQotCi1D
b250ZW50SGVpZ2h0QW5kTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6ZmxvYXRp
bmdSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxh
Y2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50
cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1
ZXMpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKHJlcGxhY2VkQm94LmlzRmxvYXRpbmdQb3NpdGlvbmVk
KCkpOwotCi0gICAgLy8gMTAuNi4yIElubGluZSByZXBsYWNlZCBlbGVtZW50cywgYmxvY2stbGV2
ZWwgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3csICdpbmxpbmUtYmxvY2snCi0gICAg
Ly8gcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZsb2F0aW5nIHJlcGxhY2Vk
IGVsZW1lbnRzCi0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBz
dHJlYW0gPDwgIltIZWlnaHRdW01hcmdpbl0gLT4gZmxvYXRpbmcgcmVwbGFjZWQgLT4gcmVkaXJl
Y3RlZCB0byBpbmxpbmUgcmVwbGFjZWQiKTsKLSAgICByZXR1cm4gaW5saW5lUmVwbGFjZWRDb250
ZW50SGVpZ2h0QW5kTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsg
fSwgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKLX0KLQotQ29udGVudFdpZHRoQW5kTWFyZ2lu
IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6ZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRXaWR0
aEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9y
aXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJU
KHJlcGxhY2VkQm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOwotCi0gICAgLy8gMTAuMy42IEZs
b2F0aW5nLCByZXBsYWNlZCBlbGVtZW50cwotICAgIC8vCi0gICAgLy8gMS4gSWYgJ21hcmdpbi1s
ZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBhcmUgY29tcHV0ZWQgYXMgJ2F1dG8nLCB0aGVpciB1c2Vk
IHZhbHVlIGlzICcwJy4KLSAgICAvLyAyLiBUaGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgnIGlzIGRl
dGVybWluZWQgYXMgZm9yIGlubGluZSByZXBsYWNlZCBlbGVtZW50cy4KLSAgICBhdXRvIGNvbXB1
dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6b250YWxNYXJnaW4o
cmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0KLSAgICBMT0dfV0lUSF9TVFJF
QU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW0hlaWdodF1bTWFyZ2luXSAt
PiBmbG9hdGluZyByZXBsYWNlZCAtPiByZWRpcmVjdGVkIHRvIGlubGluZSByZXBsYWNlZCIpOwot
ICAgIGF1dG8gdXNlZE1hcmdpbiA9IFVzZWRIb3Jpem9udGFsTWFyZ2luIHsgY29tcHV0ZWRIb3Jp
em9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5l
bmQudmFsdWVPcigwKSB9OwotICAgIHJldHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRXaWR0aEFu
ZE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IH0sIHsgb3ZlcnJp
ZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGgsIHVzZWRNYXJnaW4gfSk7Ci19Ci0KLVZlcnRpY2Fs
R2VvbWV0cnkgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dWZXJ0aWNhbEdl
b21ldHJ5KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMm
IGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVydGlj
YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVu
VmVydGljYWxWYWx1ZXMpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxv
d1Bvc2l0aW9uZWQoKSk7Ci0KLSAgICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0g
ICAgICAgIHJldHVybiBvdXRPZkZsb3dOb25SZXBsYWNlZFZlcnRpY2FsR2VvbWV0cnkoZG93bmNh
c3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMsIHZlcnRp
Y2FsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci0gICAgcmV0dXJuIG91
dE9mRmxvd1JlcGxhY2VkVmVydGljYWxHZW9tZXRyeShkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5
b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVy
cmlkZGVuVmVydGljYWxWYWx1ZXMpOwotfQotCi1Ib3Jpem9udGFsR2VvbWV0cnkgRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkoY29uc3QgQm94
JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0
cmFpbnRzLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBj
b25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMpCi17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7Ci0K
LSAgICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0gICAgICAgIHJldHVybiBvdXRP
ZkZsb3dOb25SZXBsYWNlZEhvcml6b250YWxHZW9tZXRyeShkb3duY2FzdDxDb250YWluZXJCb3g+
KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxW
YWx1ZXMpOwotICAgIHJldHVybiBvdXRPZkZsb3dSZXBsYWNlZEhvcml6b250YWxHZW9tZXRyeShk
b3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB2
ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyk7Ci19Ci0KLUNv
bnRlbnRIZWlnaHRBbmRNYXJnaW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpmbG9hdGlu
Z0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVu
VmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgY29uc3QKLXsKLSAgICBB
U1NFUlQobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOwotCi0gICAgaWYgKCFsYXlv
dXRCb3guaXNSZXBsYWNlZEJveCgpKQotICAgICAgICByZXR1cm4gY29tcGxpY2F0ZWRDYXNlcyhs
YXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVz
KTsKLSAgICByZXR1cm4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oZG93
bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgb3Zl
cnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKLX0KLQotQ29udGVudFdpZHRoQW5kTWFyZ2luIEZvcm1h
dHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6ZmxvYXRpbmdDb250ZW50V2lkdGhBbmRNYXJnaW4oY29u
c3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRh
bENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0aW5nUG9z
aXRpb25lZCgpKTsKLQotICAgIGlmICghbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKLSAgICAg
ICAgcmV0dXJuIGZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0
Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKTsK
LSAgICByZXR1cm4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihkb3duY2Fz
dDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcyk7Ci19Ci0KLUNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gRm9ybWF0
dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJn
aW4oY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgT3B0aW9uYWw8VmVydGljYWxDb25zdHJhaW50
cz4gdmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBv
dmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Ci17Ci0gICAgLy8gMTAuNi4yIElubGluZSBy
ZXBsYWNlZCBlbGVtZW50cywgYmxvY2stbGV2ZWwgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFs
IGZsb3csICdpbmxpbmUtYmxvY2snIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93IGFu
ZCBmbG9hdGluZyByZXBsYWNlZCBlbGVtZW50cwotICAgIC8vCi0gICAgLy8gMS4gSWYgJ21hcmdp
bi10b3AnLCBvciAnbWFyZ2luLWJvdHRvbScgYXJlICdhdXRvJywgdGhlaXIgdXNlZCB2YWx1ZSBp
cyAwLgotICAgIC8vIDIuIElmICdoZWlnaHQnIGFuZCAnd2lkdGgnIGJvdGggaGF2ZSBjb21wdXRl
ZCB2YWx1ZXMgb2YgJ2F1dG8nIGFuZCB0aGUgZWxlbWVudCBhbHNvIGhhcyBhbiBpbnRyaW5zaWMg
aGVpZ2h0LCB0aGVuIHRoYXQgaW50cmluc2ljIGhlaWdodCBpcyB0aGUgdXNlZCB2YWx1ZSBvZiAn
aGVpZ2h0Jy4KLSAgICAvLyAzLiBPdGhlcndpc2UsIGlmICdoZWlnaHQnIGhhcyBhIGNvbXB1dGVk
IHZhbHVlIG9mICdhdXRvJywgYW5kIHRoZSBlbGVtZW50IGhhcyBhbiBpbnRyaW5zaWMgcmF0aW8g
dGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnaGVpZ2h0JyBpczoKLSAgICAvLyAgICAodXNlZCB3aWR0
aCkgLyAoaW50cmluc2ljIHJhdGlvKQotICAgIC8vIDQuIE90aGVyd2lzZSwgaWYgJ2hlaWdodCcg
aGFzIGEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8nLCBhbmQgdGhlIGVsZW1lbnQgaGFzIGFuIGlu
dHJpbnNpYyBoZWlnaHQsIHRoZW4gdGhhdCBpbnRyaW5zaWMgaGVpZ2h0IGlzIHRoZSB1c2VkIHZh
bHVlIG9mICdoZWlnaHQnLgotICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgJ2hlaWdodCcgaGFzIGEg
Y29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8nLCBidXQgbm9uZSBvZiB0aGUgY29uZGl0aW9ucyBhYm92
ZSBhcmUgbWV0LCB0aGVuIHRoZSB1c2VkIHZhbHVlIG9mICdoZWlnaHQnIG11c3QgYmUgc2V0IHRv
Ci0gICAgLy8gICAgdGhlIGhlaWdodCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgdGhhdCBoYXMg
YSAyOjEgcmF0aW8sIGhhcyBhIGhlaWdodCBub3QgZ3JlYXRlciB0aGFuIDE1MHB4LCBhbmQgaGFz
IGEgd2lkdGggbm90IGdyZWF0ZXIgdGhhbiB0aGUgZGV2aWNlIHdpZHRoLgotCi0gICAgLy8gIzEK
LSAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7
Ci0gICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVkVmVy
dGljYWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgYXV0
byB1c2VkVmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZh
bHVlcyB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVk
VmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OwotICAgIGF1dG8mIHN0eWxlID0gcmVw
bGFjZWRCb3guc3R5bGUoKTsKLQotICAgIGF1dG8gaGVpZ2h0ID0gb3ZlcnJpZGRlblZlcnRpY2Fs
VmFsdWVzLmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQudmFsdWUoKSA6
IGNvbXB1dGVkSGVpZ2h0KHJlcGxhY2VkQm94LCB2ZXJ0aWNhbENvbnN0cmFpbnRzID8gdmVydGlj
YWxDb25zdHJhaW50cy0+bG9naWNhbEhlaWdodCA6IFdURjo6bnVsbG9wdCk7Ci0gICAgYXV0byBo
ZWlnaHRJc0F1dG8gPSAhb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCAmJiBpc0hlaWdo
dEF1dG8ocmVwbGFjZWRCb3gpOwotICAgIGF1dG8gd2lkdGhJc0F1dG8gPSBzdHlsZS5sb2dpY2Fs
V2lkdGgoKS5pc0F1dG8oKTsKLQotICAgIGlmIChoZWlnaHRJc0F1dG8gJiYgd2lkdGhJc0F1dG8g
JiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkpIHsKLSAgICAgICAgLy8gIzIKLSAg
ICAgICAgaGVpZ2h0ID0gcmVwbGFjZWRCb3guaW50cmluc2ljSGVpZ2h0KCk7Ci0gICAgfSBlbHNl
IGlmIChoZWlnaHRJc0F1dG8gJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljUmF0aW8oKSkgewot
ICAgICAgICAvLyAjMwotICAgICAgICBhdXRvIHVzZWRXaWR0aCA9IGZvcm1hdHRpbmdDb250ZXh0
Lmdlb21ldHJ5Rm9yQm94KHJlcGxhY2VkQm94KS5jb250ZW50Qm94V2lkdGgoKTsKLSAgICAgICAg
aGVpZ2h0ID0gdXNlZFdpZHRoIC8gcmVwbGFjZWRCb3guaW50cmluc2ljUmF0aW8oKTsKLSAgICB9
IGVsc2UgaWYgKGhlaWdodElzQXV0byAmJiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNIZWlnaHQo
KSkgewotICAgICAgICAvLyAjNAotICAgICAgICBoZWlnaHQgPSByZXBsYWNlZEJveC5pbnRyaW5z
aWNIZWlnaHQoKTsKLSAgICB9IGVsc2UgaWYgKGhlaWdodElzQXV0bykgewotICAgICAgICAvLyAj
NQotICAgICAgICBoZWlnaHQgPSB7IDE1MCB9OwotICAgIH0KLQotICAgIEFTU0VSVChoZWlnaHQp
OwotCi0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0g
PDwgIltIZWlnaHRdW01hcmdpbl0gLT4gaW5mbG93IHJlcGxhY2VkIC0+IGhlaWdodCgiIDw8ICpo
ZWlnaHQgPDwgInB4KSBtYXJnaW4oIiA8PCB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlIDw8ICJw
eCwgIiA8PCB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgPDwgInB4KSAtPiBsYXlvdXRCb3goIiA8
PCAmcmVwbGFjZWRCb3ggPDwgIikiKTsKLSAgICByZXR1cm4geyAqaGVpZ2h0LCB1c2VkVmVydGlj
YWxNYXJnaW4gfTsKLX0KLQotQ29udGVudFdpZHRoQW5kTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeTo6aW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVw
bGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6
b250YWxDb25zdHJhaW50cywgT3B0aW9uYWw8VmVydGljYWxDb25zdHJhaW50cz4gdmVydGljYWxD
b25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5I
b3Jpem9udGFsVmFsdWVzKQotewotICAgIC8vIDEwLjMuMiBJbmxpbmUsIHJlcGxhY2VkIGVsZW1l
bnRzCi0gICAgLy8KLSAgICAvLyBBIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJyBmb3IgJ21hcmdp
bi1sZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBiZWNvbWVzIGEgdXNlZCB2YWx1ZSBvZiAnMCcuCi0g
ICAgLy8KLSAgICAvLyAxLiBJZiAnaGVpZ2h0JyBhbmQgJ3dpZHRoJyBib3RoIGhhdmUgY29tcHV0
ZWQgdmFsdWVzIG9mICdhdXRvJyBhbmQgdGhlIGVsZW1lbnQgYWxzbyBoYXMgYW4gaW50cmluc2lj
IHdpZHRoLCB0aGVuIHRoYXQgaW50cmluc2ljIHdpZHRoIGlzIHRoZSB1c2VkIHZhbHVlIG9mICd3
aWR0aCcuCi0gICAgLy8KLSAgICAvLyAyLiBJZiAnaGVpZ2h0JyBhbmQgJ3dpZHRoJyBib3RoIGhh
dmUgY29tcHV0ZWQgdmFsdWVzIG9mICdhdXRvJyBhbmQgdGhlIGVsZW1lbnQgaGFzIG5vIGludHJp
bnNpYyB3aWR0aCwgYnV0IGRvZXMgaGF2ZSBhbiBpbnRyaW5zaWMgaGVpZ2h0IGFuZCBpbnRyaW5z
aWMgcmF0aW87Ci0gICAgLy8gICAgb3IgaWYgJ3dpZHRoJyBoYXMgYSBjb21wdXRlZCB2YWx1ZSBv
ZiAnYXV0bycsICdoZWlnaHQnIGhhcyBzb21lIG90aGVyIGNvbXB1dGVkIHZhbHVlLCBhbmQgdGhl
IGVsZW1lbnQgZG9lcyBoYXZlIGFuIGludHJpbnNpYyByYXRpbzsKLSAgICAvLyAgICB0aGVuIHRo
ZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcgaXM6ICh1c2VkIGhlaWdodCkgKiAoaW50cmluc2ljIHJh
dGlvKQotICAgIC8vCi0gICAgLy8gMy4gSWYgJ2hlaWdodCcgYW5kICd3aWR0aCcgYm90aCBoYXZl
IGNvbXB1dGVkIHZhbHVlcyBvZiAnYXV0bycgYW5kIHRoZSBlbGVtZW50IGhhcyBhbiBpbnRyaW5z
aWMgcmF0aW8gYnV0IG5vIGludHJpbnNpYyBoZWlnaHQgb3Igd2lkdGgsCi0gICAgLy8gICAgdGhl
biB0aGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgnIGlzIHVuZGVmaW5lZCBpbiBDU1MgMi4yLiBIb3dl
dmVyLCBpdCBpcyBzdWdnZXN0ZWQgdGhhdCwgaWYgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0
aCBkb2VzIG5vdCBpdHNlbGYgZGVwZW5kIG9uIHRoZSByZXBsYWNlZAotICAgIC8vICAgIGVsZW1l
bnQncyB3aWR0aCwgdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgnIGlzIGNhbGN1bGF0ZWQg
ZnJvbSB0aGUgY29uc3RyYWludCBlcXVhdGlvbiB1c2VkIGZvciBibG9jay1sZXZlbCwgbm9uLXJl
cGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93LgotICAgIC8vCi0gICAgLy8gNC4gT3RoZXJ3
aXNlLCBpZiAnd2lkdGgnIGhhcyBhIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJywgYW5kIHRoZSBl
bGVtZW50IGhhcyBhbiBpbnRyaW5zaWMgd2lkdGgsIHRoZW4gdGhhdCBpbnRyaW5zaWMgd2lkdGgg
aXMgdGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJy4KLSAgICAvLwotICAgIC8vIDUuIE90aGVyd2lz
ZSwgaWYgJ3dpZHRoJyBoYXMgYSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycsIGJ1dCBub25lIG9m
IHRoZSBjb25kaXRpb25zIGFib3ZlIGFyZSBtZXQsIHRoZW4gdGhlIHVzZWQgdmFsdWUgb2YgJ3dp
ZHRoJyBiZWNvbWVzIDMwMHB4LgotICAgIC8vICAgIElmIDMwMHB4IGlzIHRvbyB3aWRlIHRvIGZp
dCB0aGUgZGV2aWNlLCBVQXMgc2hvdWxkIHVzZSB0aGUgd2lkdGggb2YgdGhlIGxhcmdlc3QgcmVj
dGFuZ2xlIHRoYXQgaGFzIGEgMjoxIHJhdGlvIGFuZCBmaXRzIHRoZSBkZXZpY2UgaW5zdGVhZC4K
LQotICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLQot
ICAgIGF1dG8gdXNlZE1hcmdpblN0YXJ0ID0gWyZdIHsKLSAgICAgICAgaWYgKG92ZXJyaWRkZW5I
b3Jpem9udGFsVmFsdWVzLm1hcmdpbikKLSAgICAgICAgICAgIHJldHVybiBvdmVycmlkZGVuSG9y
aXpvbnRhbFZhbHVlcy5tYXJnaW4tPnN0YXJ0OwotICAgICAgICByZXR1cm4gY29tcHV0ZWRIb3Jp
em9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMF9sdSk7Ci0gICAgfTsKLQotICAgIGF1dG8gdXNl
ZE1hcmdpbkVuZCA9IFsmXSB7Ci0gICAgICAgIGlmIChvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVl
cy5tYXJnaW4pCi0gICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMu
bWFyZ2luLT5lbmQ7Ci0gICAgICAgIHJldHVybiBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5k
LnZhbHVlT3IoMF9sdSk7Ci0gICAgfTsKLQotICAgIGF1dG8gd2lkdGggPSBvdmVycmlkZGVuSG9y
aXpvbnRhbFZhbHVlcy53aWR0aCA/IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoIDog
Y29tcHV0ZWRXaWR0aChyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxX
aWR0aCk7Ci0gICAgYXV0byBoZWlnaHRJc0F1dG8gPSBpc0hlaWdodEF1dG8ocmVwbGFjZWRCb3gp
OwotICAgIGF1dG8gaGVpZ2h0ID0gY29tcHV0ZWRIZWlnaHQocmVwbGFjZWRCb3gsIHZlcnRpY2Fs
Q29uc3RyYWludHMgPyB2ZXJ0aWNhbENvbnN0cmFpbnRzLT5sb2dpY2FsSGVpZ2h0IDogV1RGOjpu
dWxsb3B0KTsKLQotICAgIGlmICghd2lkdGggJiYgaGVpZ2h0SXNBdXRvICYmIHJlcGxhY2VkQm94
Lmhhc0ludHJpbnNpY1dpZHRoKCkpIHsKLSAgICAgICAgLy8gIzEKLSAgICAgICAgd2lkdGggPSBy
ZXBsYWNlZEJveC5pbnRyaW5zaWNXaWR0aCgpOwotICAgIH0gZWxzZSBpZiAoKCF3aWR0aCAmJiBo
ZWlnaHRJc0F1dG8gJiYgIXJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1dpZHRoKCkgJiYgcmVwbGFj
ZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkgJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljUmF0
aW8oKSkKLSAgICAgICAgfHwgKCF3aWR0aCAmJiBoZWlnaHQgJiYgcmVwbGFjZWRCb3guaGFzSW50
cmluc2ljUmF0aW8oKSkpIHsKLSAgICAgICAgLy8gIzIKLSAgICAgICAgd2lkdGggPSBoZWlnaHQu
dmFsdWVPcihyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNIZWlnaHQoKSkgKiByZXBsYWNlZEJveC5p
bnRyaW5zaWNSYXRpbygpOwotICAgIH0gZWxzZSBpZiAoIXdpZHRoICYmIGhlaWdodElzQXV0byAm
JiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNSYXRpbygpICYmICFyZXBsYWNlZEJveC5oYXNJbnRy
aW5zaWNXaWR0aCgpICYmICFyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNIZWlnaHQoKSkgewotICAg
ICAgICAvLyAjMwotICAgICAgICAvLyBGSVhNRTogdW5kZWZpbmVkIGJ1dCBzdXJlbHkgZG9hYmxl
LgotICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOwotICAgIH0gZWxzZSBpZiAo
IXdpZHRoICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1dpZHRoKCkpIHsKLSAgICAgICAgLy8g
IzQKLSAgICAgICAgd2lkdGggPSByZXBsYWNlZEJveC5pbnRyaW5zaWNXaWR0aCgpOwotICAgIH0g
ZWxzZSBpZiAoIXdpZHRoKSB7Ci0gICAgICAgIC8vICM1Ci0gICAgICAgIHdpZHRoID0geyAzMDAg
fTsKLSAgICB9Ci0KLSAgICBBU1NFUlQod2lkdGgpOwotCi0gICAgTE9HX1dJVEhfU1RSRUFNKEZv
cm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltXaWR0aF1bTWFyZ2luXSAtPiBpbmZs
b3cgcmVwbGFjZWQgLT4gd2lkdGgoIiA8PCAqd2lkdGggPDwgInB4KSBtYXJnaW4oIiA8PCB1c2Vk
TWFyZ2luU3RhcnQoKSA8PCAicHgsICIgPDwgdXNlZE1hcmdpbkVuZCgpIDw8ICJweCkgLT4gbGF5
b3V0Qm94KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIHsgKndpZHRoLCB7
IHVzZWRNYXJnaW5TdGFydCgpLCB1c2VkTWFyZ2luRW5kKCkgfSB9OwotfQotCi1MYXlvdXRTaXpl
IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93UG9zaXRpb25lZFBvc2l0aW9uT2Zm
c2V0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhv
cml6b250YWxDb25zdHJhaW50cykgY29uc3QKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5G
bG93UG9zaXRpb25lZCgpKTsKLQotICAgIC8vIDkuNC4zIFJlbGF0aXZlIHBvc2l0aW9uaW5nCi0g
ICAgLy8KLSAgICAvLyBUaGUgJ3RvcCcgYW5kICdib3R0b20nIHByb3BlcnRpZXMgbW92ZSByZWxh
dGl2ZWx5IHBvc2l0aW9uZWQgZWxlbWVudChzKSB1cCBvciBkb3duIHdpdGhvdXQgY2hhbmdpbmcg
dGhlaXIgc2l6ZS4KLSAgICAvLyBUb3AnIG1vdmVzIHRoZSBib3hlcyBkb3duLCBhbmQgJ2JvdHRv
bScgbW92ZXMgdGhlbSB1cC4gU2luY2UgYm94ZXMgYXJlIG5vdCBzcGxpdCBvciBzdHJldGNoZWQg
YXMgYSByZXN1bHQgb2YgJ3RvcCcgb3IgJ2JvdHRvbScsIHRoZSB1c2VkIHZhbHVlcyBhcmUgYWx3
YXlzOiB0b3AgPSAtYm90dG9tLgotICAgIC8vCi0gICAgLy8gMS4gSWYgYm90aCBhcmUgJ2F1dG8n
LCB0aGVpciB1c2VkIHZhbHVlcyBhcmUgYm90aCAnMCcuCi0gICAgLy8gMi4gSWYgb25lIG9mIHRo
ZW0gaXMgJ2F1dG8nLCBpdCBiZWNvbWVzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb3RoZXIuCi0gICAg
Ly8gMy4gSWYgbmVpdGhlciBpcyAnYXV0bycsICdib3R0b20nIGlzIGlnbm9yZWQgKGkuZS4sIHRo
ZSB1c2VkIHZhbHVlIG9mICdib3R0b20nIHdpbGwgYmUgbWludXMgdGhlIHZhbHVlIG9mICd0b3An
KS4KLQotICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAgYXV0byBjb250
YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7Ci0K
LSAgICBhdXRvIHRvcCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbFRvcCgpLCBjb250YWlu
aW5nQmxvY2tXaWR0aCk7Ci0gICAgYXV0byBib3R0b20gPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxv
Z2ljYWxCb3R0b20oKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotCi0gICAgaWYgKCF0b3AgJiYg
IWJvdHRvbSkgewotICAgICAgICAvLyAjMQotICAgICAgICB0b3AgPSBib3R0b20gPSB7IDAgfTsK
LSAgICB9IGVsc2UgaWYgKCF0b3ApIHsKLSAgICAgICAgLy8gIzIKLSAgICAgICAgdG9wID0gLSpi
b3R0b207Ci0gICAgfSBlbHNlIGlmICghYm90dG9tKSB7Ci0gICAgICAgIC8vICMzCi0gICAgICAg
IGJvdHRvbSA9IC0qdG9wOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vICM0Ci0gICAgICAgIGJv
dHRvbSA9IFdURjo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICAvLyBGb3IgcmVsYXRpdmVseSBwb3Np
dGlvbmVkIGVsZW1lbnRzLCAnbGVmdCcgYW5kICdyaWdodCcgbW92ZSB0aGUgYm94KGVzKSBob3Jp
em9udGFsbHksIHdpdGhvdXQgY2hhbmdpbmcgdGhlaXIgc2l6ZS4KLSAgICAvLyAnTGVmdCcgbW92
ZXMgdGhlIGJveGVzIHRvIHRoZSByaWdodCwgYW5kICdyaWdodCcgbW92ZXMgdGhlbSB0byB0aGUg
bGVmdC4KLSAgICAvLyBTaW5jZSBib3hlcyBhcmUgbm90IHNwbGl0IG9yIHN0cmV0Y2hlZCBhcyBh
IHJlc3VsdCBvZiAnbGVmdCcgb3IgJ3JpZ2h0JywgdGhlIHVzZWQgdmFsdWVzIGFyZSBhbHdheXM6
IGxlZnQgPSAtcmlnaHQuCi0gICAgLy8KLSAgICAvLyAxLiBJZiBib3RoICdsZWZ0JyBhbmQgJ3Jp
Z2h0JyBhcmUgJ2F1dG8nICh0aGVpciBpbml0aWFsIHZhbHVlcyksIHRoZSB1c2VkIHZhbHVlcyBh
cmUgJzAnIChpLmUuLCB0aGUgYm94ZXMgc3RheSBpbiB0aGVpciBvcmlnaW5hbCBwb3NpdGlvbiku
Ci0gICAgLy8gMi4gSWYgJ2xlZnQnIGlzICdhdXRvJywgaXRzIHVzZWQgdmFsdWUgaXMgbWludXMg
dGhlIHZhbHVlIG9mICdyaWdodCcgKGkuZS4sIHRoZSBib3hlcyBtb3ZlIHRvIHRoZSBsZWZ0IGJ5
IHRoZSB2YWx1ZSBvZiAncmlnaHQnKS4KLSAgICAvLyAzLiBJZiAncmlnaHQnIGlzIHNwZWNpZmll
ZCBhcyAnYXV0bycsIGl0cyB1c2VkIHZhbHVlIGlzIG1pbnVzIHRoZSB2YWx1ZSBvZiAnbGVmdCcu
Ci0gICAgLy8gNC4gSWYgbmVpdGhlciAnbGVmdCcgbm9yICdyaWdodCcgaXMgJ2F1dG8nLCB0aGUg
cG9zaXRpb24gaXMgb3Zlci1jb25zdHJhaW5lZCwgYW5kIG9uZSBvZiB0aGVtIGhhcyB0byBiZSBp
Z25vcmVkLgotICAgIC8vICAgIElmIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgY29u
dGFpbmluZyBibG9jayBpcyAnbHRyJywgdGhlIHZhbHVlIG9mICdsZWZ0JyB3aW5zIGFuZCAncmln
aHQnIGJlY29tZXMgLSdsZWZ0Jy4KLSAgICAvLyAgICBJZiAnZGlyZWN0aW9uJyBvZiB0aGUgY29u
dGFpbmluZyBibG9jayBpcyAncnRsJywgJ3JpZ2h0JyB3aW5zIGFuZCAnbGVmdCcgaXMgaWdub3Jl
ZC4KLQotICAgIGF1dG8gbGVmdCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbExlZnQoKSwg
Y29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgIGF1dG8gcmlnaHQgPSBjb21wdXRlZFZhbHVlKHN0
eWxlLmxvZ2ljYWxSaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0KLSAgICBpZiAoIWxl
ZnQgJiYgIXJpZ2h0KSB7Ci0gICAgICAgIC8vICMxCi0gICAgICAgIGxlZnQgPSByaWdodCA9IHsg
MCB9OwotICAgIH0gZWxzZSBpZiAoIWxlZnQpIHsKLSAgICAgICAgLy8gIzIKLSAgICAgICAgbGVm
dCA9IC0qcmlnaHQ7Ci0gICAgfSBlbHNlIGlmICghcmlnaHQpIHsKLSAgICAgICAgLy8gIzMKLSAg
ICAgICAgcmlnaHQgPSAtKmxlZnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gIzQKLSAgICAg
ICAgYXV0byBpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9j
aygpLnN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOwotICAgICAgICBpZiAoaXNMZWZ0
VG9SaWdodERpcmVjdGlvbikKLSAgICAgICAgICAgIHJpZ2h0ID0gLSpsZWZ0OwotICAgICAgICBl
bHNlCi0gICAgICAgICAgICBsZWZ0ID0gV1RGOjpudWxsb3B0OwotICAgIH0KLQotICAgIEFTU0VS
VCghYm90dG9tIHx8ICp0b3AgPT0gLSpib3R0b20pOwotICAgIEFTU0VSVCghbGVmdCB8fCAqbGVm
dCA9PSAtKnJpZ2h0KTsKLQotICAgIGF1dG8gdG9wUG9zaXRpb25PZmZzZXQgPSAqdG9wOwotICAg
IGF1dG8gbGVmdFBvc2l0aW9uT2Zmc2V0ID0gbGVmdC52YWx1ZU9yKC0qcmlnaHQpOwotCi0gICAg
TE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltQb3Np
dGlvbl0gLT4gcG9zaXRpb25lZCBpbmZsb3cgLT4gdG9wIG9mZnNldCgiIDw8IHRvcFBvc2l0aW9u
T2Zmc2V0IDw8ICJweCkgbGVmdCBvZmZzZXQoIiA8PCBsZWZ0UG9zaXRpb25PZmZzZXQgPDwgInB4
KSBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIHsgbGVmdFBv
c2l0aW9uT2Zmc2V0LCB0b3BQb3NpdGlvbk9mZnNldCB9OwotfQotCi1pbmxpbmUgc3RhdGljIFdy
aXRpbmdNb2RlIHVzZWRXcml0aW5nTW9kZShjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICAv
LyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXdyaXRpbmctbW9kZXMtNC8jbG9naWNhbC1kaXJl
Y3Rpb24tbGF5b3V0Ci0gICAgLy8gRmxvdy1yZWxhdGl2ZSBkaXJlY3Rpb25zIGFyZSBjYWxjdWxh
dGVkIHdpdGggcmVzcGVjdCB0byB0aGUgd3JpdGluZyBtb2RlIG9mIHRoZSBjb250YWluaW5nIGJs
b2NrIG9mIHRoZSBib3guCi0gICAgLy8gRm9yIGlubGluZS1sZXZlbCBib3hlcywgdGhlIHdyaXRp
bmcgbW9kZSBvZiB0aGUgcGFyZW50IGJveCBpcyB1c2VkIGluc3RlYWQuCi0gICAgcmV0dXJuIGxh
eW91dEJveC5pc0lubGluZUxldmVsQm94KCkgPyBsYXlvdXRCb3gucGFyZW50KCkuc3R5bGUoKS53
cml0aW5nTW9kZSgpIDogbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCkud3JpdGlu
Z01vZGUoKTsKLX0KLQotRWRnZXMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRl
ZEJvcmRlcihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAgICBhdXRvJiBzdHlsZSA9
IGxheW91dEJveC5zdHlsZSgpOwotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4
dExheW91dCwgc3RyZWFtIDw8ICJbQm9yZGVyXSAtPiBsYXlvdXRCb3g6ICIgPDwgJmxheW91dEJv
eCk7Ci0gICAgcmV0dXJuIHsKLSAgICAgICAgeyBMYXlvdXRVbml0KHN0eWxlLmJvcmRlckxlZnRX
aWR0aCgpKSwgTGF5b3V0VW5pdChzdHlsZS5ib3JkZXJSaWdodFdpZHRoKCkpIH0sCi0gICAgICAg
IHsgTGF5b3V0VW5pdChzdHlsZS5ib3JkZXJUb3BXaWR0aCgpKSwgTGF5b3V0VW5pdChzdHlsZS5i
b3JkZXJCb3R0b21XaWR0aCgpKSB9Ci0gICAgfTsKLX0KLQotT3B0aW9uYWw8RWRnZXM+IEZvcm1h
dHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRQYWRkaW5nKGNvbnN0IEJveCYgbGF5b3V0
Qm94LCBjb25zdCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSBjb25zdAotewotICAg
IGlmICghbGF5b3V0Qm94LmlzUGFkZGluZ0FwcGxpY2FibGUoKSkKLSAgICAgICAgcmV0dXJuIFdU
Rjo6bnVsbG9wdDsKLQotICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAg
TE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltQYWRk
aW5nXSAtPiBsYXlvdXRCb3g6ICIgPDwgJmxheW91dEJveCk7Ci0gICAgcmV0dXJuIEVkZ2VzIHsK
LSAgICAgICAgeyB2YWx1ZUZvckxlbmd0aChzdHlsZS5wYWRkaW5nTGVmdCgpLCBjb250YWluaW5n
QmxvY2tXaWR0aCksIHZhbHVlRm9yTGVuZ3RoKHN0eWxlLnBhZGRpbmdSaWdodCgpLCBjb250YWlu
aW5nQmxvY2tXaWR0aCkgfSwKLSAgICAgICAgeyB2YWx1ZUZvckxlbmd0aChzdHlsZS5wYWRkaW5n
VG9wKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgdmFsdWVGb3JMZW5ndGgoc3R5bGUucGFkZGlu
Z0JvdHRvbSgpLCBjb250YWluaW5nQmxvY2tXaWR0aCkgfQotICAgIH07Ci19Ci0KLUNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0
cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIGNvbnN0Ci17Ci0gICAgYXV0byYgc3R5bGUg
PSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9y
aXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAgICBpZiAoaXNIb3Jpem9udGFsV3Jp
dGluZ01vZGUodXNlZFdyaXRpbmdNb2RlKGxheW91dEJveCkpKQotICAgICAgICByZXR1cm4geyBj
b21wdXRlZFZhbHVlKHN0eWxlLm1hcmdpbkxlZnQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpLCBj
b21wdXRlZFZhbHVlKHN0eWxlLm1hcmdpblJpZ2h0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSB9
OwotICAgIHJldHVybiB7IGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luVG9wKCksIGNvbnRhaW5p
bmdCbG9ja1dpZHRoKSwgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5Cb3R0b20oKSwgY29udGFp
bmluZ0Jsb2NrV2lkdGgpIH07Ci19Ci0KLUNvbXB1dGVkVmVydGljYWxNYXJnaW4gRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50
cykgY29uc3QKLXsKLSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIGF1
dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdp
ZHRoOwotICAgIGlmIChpc0hvcml6b250YWxXcml0aW5nTW9kZSh1c2VkV3JpdGluZ01vZGUobGF5
b3V0Qm94KSkpCi0gICAgICAgIHJldHVybiB7IGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luVG9w
KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5Cb3R0
b20oKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpIH07Ci0gICAgcmV0dXJuIHsgY29tcHV0ZWRWYWx1
ZShzdHlsZS5tYXJnaW5MZWZ0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgY29tcHV0ZWRWYWx1
ZShzdHlsZS5tYXJnaW5SaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCkgfTsKLX0KLQotRm9y
bWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5Ojpjb25zdHJhaW5CeU1pbk1heFdpZHRoKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGludHJpbnNpY1dpZHRoKSBjb25zdAotewotICAg
IGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAgYXV0byBtaW5XaWR0aCA9IGZp
eGVkVmFsdWUoc3R5bGUubG9naWNhbE1pbldpZHRoKCkpOwotICAgIGF1dG8gbWF4V2lkdGggPSBm
aXhlZFZhbHVlKHN0eWxlLmxvZ2ljYWxNYXhXaWR0aCgpKTsKLSAgICBpZiAoIW1pbldpZHRoICYm
ICFtYXhXaWR0aCkKLSAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoOwotCi0gICAgaWYgKG1h
eFdpZHRoKSB7Ci0gICAgICAgIGludHJpbnNpY1dpZHRoLm1pbmltdW0gPSBzdGQ6Om1pbigqbWF4
V2lkdGgsIGludHJpbnNpY1dpZHRoLm1pbmltdW0pOwotICAgICAgICBpbnRyaW5zaWNXaWR0aC5t
YXhpbXVtID0gc3RkOjptaW4oKm1heFdpZHRoLCBpbnRyaW5zaWNXaWR0aC5tYXhpbXVtKTsKLSAg
ICB9Ci0KLSAgICBpZiAobWluV2lkdGgpIHsKLSAgICAgICAgaW50cmluc2ljV2lkdGgubWluaW11
bSA9IHN0ZDo6bWF4KCptaW5XaWR0aCwgaW50cmluc2ljV2lkdGgubWluaW11bSk7Ci0gICAgICAg
IGludHJpbnNpY1dpZHRoLm1heGltdW0gPSBzdGQ6Om1heCgqbWluV2lkdGgsIGludHJpbnNpY1dp
ZHRoLm1heGltdW0pOwotICAgIH0KLQotICAgIEFTU0VSVChpbnRyaW5zaWNXaWR0aC5taW5pbXVt
IDw9IGludHJpbnNpY1dpZHRoLm1heGltdW0pOwotICAgIHJldHVybiBpbnRyaW5zaWNXaWR0aDsK
LX0KLQotRm9ybWF0dGluZ0NvbnRleHQ6OkNvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCBG
b3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVu
dChjb25zdCBDb250YWluZXJCb3gmIGNvbnRhaW5lckJveCkKLXsKLSAgICBhdXRvJiBib3hHZW9t
ZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goY29udGFpbmVyQm94KTsK
LSAgICByZXR1cm4gewotICAgICAgICB7IGJveEdlb21ldHJ5LnBhZGRpbmdCb3hMZWZ0KCksIGJv
eEdlb21ldHJ5LnBhZGRpbmdCb3hXaWR0aCgpIH0sCi0gICAgICAgIHsgYm94R2VvbWV0cnkucGFk
ZGluZ0JveFRvcCgpLCBib3hHZW9tZXRyeS5wYWRkaW5nQm94SGVpZ2h0KCkgfSwKLSAgICAgICAg
Ym94R2VvbWV0cnkuY29udGVudEJveFdpZHRoKCkgfTsKLX0KLQotRm9ybWF0dGluZ0NvbnRleHQ6
OkNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6
OmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb25zdCBDb250YWluZXJCb3gmIGNvbnRhaW5l
ckJveCwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiBlc2NhcGVSZWFzb24pCi17Ci0gICAgYXV0byYg
Ym94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGNvbnRhaW5l
ckJveCwgZXNjYXBlUmVhc29uKTsKLSAgICByZXR1cm4geyB7IGJveEdlb21ldHJ5LmNvbnRlbnRC
b3hMZWZ0KCksIGJveEdlb21ldHJ5LmNvbnRlbnRCb3hXaWR0aCgpIH0sIHsgYm94R2VvbWV0cnku
Y29udGVudEJveFRvcCgpLCBjb21wdXRlZEhlaWdodChjb250YWluZXJCb3gpIH0gfTsKLX0KLQot
fQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRm9ybWF0dGlu
Z0NvbnRleHRRdWlya3MuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdDb250
ZXh0UXVpcmtzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxMWIwZGM2MzBj
YTIzOTdiYWIzODRmOTgwODMwMzE5MWYyYmQwYS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRm9ybWF0dGluZ0NvbnRl
eHRRdWlya3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHly
aWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0g
KgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0g
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
IElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICog
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0K
LSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0j
aWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJMYXlvdXRC
b3guaCIKLSNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgotI2luY2x1ZGUgIkxheW91dElu
aXRpYWxDb250YWluaW5nQmxvY2suaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNl
IExheW91dCB7Ci0KLUxheW91dFVuaXQgRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6aGVpZ2h0
VmFsdWVPZk5lYXJlc3RDb250YWluaW5nQmxvY2tXaXRoRml4ZWRIZWlnaHQoY29uc3QgQm94JiBs
YXlvdXRCb3gpCi17Ci0gICAgLy8gSW4gcXVpcmtzIG1vZGUsIHdlIGdvIGFuZCB0cmF2ZXJzIHRo
ZSBjb250YWluaW5nIGJsb2NrIGNoYWluIHRvIGZpbmQgYSBibG9jayBsZXZlbCBib3ggd2l0aCBm
aXhlZCBoZWlnaHQgdmFsdWUsIGV2ZW4gaWYgaXQgbWVhbnMgbGVhdmluZwotICAgIC8vIHRoZSBj
dXJyZW50IGZvcm1hdHRpbmcgY29udGV4dC4gRklYTUU6IHN1cmVseSB3ZSBuZWVkIHRvIGRvIHNv
bWUgdHJpY2tzIGhlcmUgd2hlbiBibG9jayBkaXJlY3Rpb24gc3VwcG9ydCBpcyBhZGRlZC4KLSAg
ICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7Ci0g
ICAgYXV0byogY29udGFpbmluZ0Jsb2NrID0gJmxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsK
LSAgICBMYXlvdXRVbml0IGJvZHlBbmREb2N1bWVudFZlcnRpY2FsTWFyZ2luUGFkZGluZ0FuZEJv
cmRlcjsKLSAgICB3aGlsZSAoY29udGFpbmluZ0Jsb2NrKSB7Ci0gICAgICAgIGF1dG8gY29udGFp
bmluZ0Jsb2NrSGVpZ2h0ID0gY29udGFpbmluZ0Jsb2NrLT5zdHlsZSgpLmxvZ2ljYWxIZWlnaHQo
KTsKLSAgICAgICAgaWYgKGNvbnRhaW5pbmdCbG9ja0hlaWdodC5pc0ZpeGVkKCkpCi0gICAgICAg
ICAgICByZXR1cm4gTGF5b3V0VW5pdChjb250YWluaW5nQmxvY2tIZWlnaHQudmFsdWUoKSAtIGJv
ZHlBbmREb2N1bWVudFZlcnRpY2FsTWFyZ2luUGFkZGluZ0FuZEJvcmRlcik7Ci0KLSAgICAgICAg
Ly8gSWYgdGhlIG9ubHkgZml4ZWQgdmFsdWUgYm94IHdlIGZpbmQgaXMgdGhlIElDQiwgdGhlbiBp
Z25vcmUgdGhlIGJvZHkgYW5kIHRoZSBkb2N1bWVudCAodmVydGljYWwpIG1hcmdpbiwgcGFkZGlu
ZyBhbmQgYm9yZGVyLiBTbyBtdWNoIHF1aXJraW5lc3MuCi0gICAgICAgIC8vIC1hbmQgaXQncyB0
b3RhbGx5IGluc2FuZSBiZWNhdXNlIG5vdyB3ZSBmcmVlbHkgdHJhdmVsIGFjcm9zcyBmb3JtYXR0
aW5nIGNvbnRleHQgYm91bmRhcmllcyBhbmQgY29tcHV0ZWQgbWFyZ2lucyBhcmUgbm9uZXhpc3Rl
bnQuCi0gICAgICAgIGlmIChjb250YWluaW5nQmxvY2stPmlzQm9keUJveCgpIHx8IGNvbnRhaW5p
bmdCbG9jay0+aXNEb2N1bWVudEJveCgpKSB7Ci0KLSAgICAgICAgICAgIGF1dG8gZ2VvbWV0cnkg
PSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeSgpOwotICAgICAgICAgICAgYXV0byBob3Jpem9u
dGFsQ29uc3RyYWludHMgPSBnZW9tZXRyeS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29u
dGFpbmluZ0Jsb2NrLT5jb250YWluaW5nQmxvY2soKSwgRm9ybWF0dGluZ0NvbnRleHQ6OkVzY2Fw
ZVJlYXNvbjo6RmluZEZpeGVkSGVpZ2h0QW5jZXN0b3JRdWlyaykuaG9yaXpvbnRhbDsKLSAgICAg
ICAgICAgIGF1dG8gdmVydGljYWxNYXJnaW4gPSBnZW9tZXRyeS5jb21wdXRlZFZlcnRpY2FsTWFy
Z2luKCpjb250YWluaW5nQmxvY2ssIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0KLSAgICAgICAg
ICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3go
KmNvbnRhaW5pbmdCbG9jaywgRm9ybWF0dGluZ0NvbnRleHQ6OkVzY2FwZVJlYXNvbjo6RmluZEZp
eGVkSGVpZ2h0QW5jZXN0b3JRdWlyayk7Ci0gICAgICAgICAgICBhdXRvIHZlcnRpY2FsUGFkZGlu
ZyA9IGJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKDApICsgYm94R2VvbWV0cnkucGFk
ZGluZ0JvdHRvbSgpLnZhbHVlT3IoMCk7Ci0gICAgICAgICAgICBhdXRvIHZlcnRpY2FsQm9yZGVy
ID0gYm94R2VvbWV0cnkuYm9yZGVyVG9wKCkgKyBib3hHZW9tZXRyeS5ib3JkZXJCb3R0b20oKTsK
LSAgICAgICAgICAgIGJvZHlBbmREb2N1bWVudFZlcnRpY2FsTWFyZ2luUGFkZGluZ0FuZEJvcmRl
ciArPSB2ZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSArIHZlcnRpY2FsTWFyZ2luLmFm
dGVyLnZhbHVlT3IoMCkgKyB2ZXJ0aWNhbFBhZGRpbmcgKyB2ZXJ0aWNhbEJvcmRlcjsKLSAgICAg
ICAgfQotCi0gICAgICAgIGlmIChpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPigqY29udGFpbmlu
Z0Jsb2NrKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjb250YWluaW5nQmxvY2sgPSAm
Y29udGFpbmluZ0Jsb2NrLT5jb250YWluaW5nQmxvY2soKTsKLSAgICB9Ci0gICAgLy8gSW5pdGlh
bCBjb250YWluaW5nIGJsb2NrIGhhcyB0byBoYXZlIGEgaGVpZ2h0LgotICAgIHJldHVybiBmb3Jt
YXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3guaW5pdGlhbENvbnRhaW5pbmdC
bG9jaygpLCBGb3JtYXR0aW5nQ29udGV4dDo6RXNjYXBlUmVhc29uOjpGaW5kRml4ZWRIZWlnaHRB
bmNlc3RvclF1aXJrKS5jb250ZW50Qm94KCkuaGVpZ2h0KCkgLSBib2R5QW5kRG9jdW1lbnRWZXJ0
aWNhbE1hcmdpblBhZGRpbmdBbmRCb3JkZXI7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGlu
Z0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9j
a0Zvcm1hdHRpbmdDb250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1
NTVmODE5MzgxZTczYWYzZTE5YzAyZjM4YjBmY2YzYmQxMjA0Yi4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tm
b3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEs
NTYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0
OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
QmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5H
X0NPTlRFWFQpCi0KLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUg
IkZsb2F0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIKLSNpbmNsdWRl
ICJJbnZhbGlkYXRpb25TdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUg
IkxheW91dENoaWxkSXRlcmF0b3IuaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIK
LSNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCi0jaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRh
aW5pbmdCbG9jay5oIgotI2luY2x1ZGUgIkxheW91dFN0YXRlLmgiCi0jaW5jbHVkZSAiTG9nZ2lu
Zy5oIgotI2luY2x1ZGUgIlRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNp
bmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRT
dHJlYW0uaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLVdU
Rl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KTsKLQotQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dDo6QmxvY2tGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWlu
ZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgQmxvY2tGb3JtYXR0aW5nU3RhdGUmIGZvcm1h
dHRpbmdTdGF0ZSkKLSAgICA6IEZvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0Um9v
dCwgZm9ybWF0dGluZ1N0YXRlKQotewotfQotCi12b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
OmxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmIGludmFsaWRhdGlvblN0YXRl
LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQotewotICAg
IC8vIDkuNC4xIEJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMKLSAgICAvLyBJbiBhIGJsb2NrIGZv
cm1hdHRpbmcgY29udGV4dCwgYm94ZXMgYXJlIGxhaWQgb3V0IG9uZSBhZnRlciB0aGUgb3RoZXIs
IHZlcnRpY2FsbHksIGJlZ2lubmluZyBhdCB0aGUgdG9wIG9mIGEgY29udGFpbmluZyBibG9jay4K
LSAgICAvLyBUaGUgdmVydGljYWwgZGlzdGFuY2UgYmV0d2VlbiB0d28gc2libGluZyBib3hlcyBp
cyBkZXRlcm1pbmVkIGJ5IHRoZSAnbWFyZ2luJyBwcm9wZXJ0aWVzLgotICAgIC8vIFZlcnRpY2Fs
IG1hcmdpbnMgYmV0d2VlbiBhZGphY2VudCBibG9jay1sZXZlbCBib3hlcyBpbiBhIGJsb2NrIGZv
cm1hdHRpbmcgY29udGV4dCBjb2xsYXBzZS4KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGlu
Z0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1N0YXJ0XSAtPiBibG9jayBmb3JtYXR0aW5nIGNv
bnRleHQgLT4gZm9ybWF0dGluZyByb290KCIgPDwgJnJvb3QoKSA8PCAiKSIpOwotICAgIGF1dG8m
IGZvcm1hdHRpbmdSb290ID0gcm9vdCgpOwotICAgIEFTU0VSVChmb3JtYXR0aW5nUm9vdC5oYXNJ
bkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7Ci0gICAgYXV0byYgZmxvYXRpbmdTdGF0ZSA9IGZvcm1h
dHRpbmdTdGF0ZSgpLmZsb2F0aW5nU3RhdGUoKTsKLSAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9
IEZsb2F0aW5nQ29udGV4dCB7ICp0aGlzLCBmbG9hdGluZ1N0YXRlIH07Ci0KLSAgICBMYXlvdXRR
dWV1ZSBsYXlvdXRRdWV1ZTsKLSAgICBlbnVtIGNsYXNzIExheW91dERpcmVjdGlvbiB7IENoaWxk
LCBTaWJsaW5nIH07Ci0gICAgYXV0byBhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZSA9IFsmXSAoY29u
c3QgYXV0byYgbGF5b3V0Qm94LCBhdXRvIGRpcmVjdGlvbikgewotICAgICAgICBpZiAoZGlyZWN0
aW9uID09IExheW91dERpcmVjdGlvbjo6Q2hpbGQpIHsKLSAgICAgICAgICAgIGlmICghaXM8Q29u
dGFpbmVyQm94PihsYXlvdXRCb3gpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgICAgIGZvciAoYXV0byogY2hpbGQgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91
dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQt
Pm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFp
bnZhbGlkYXRpb25TdGF0ZS5uZWVkc0xheW91dCgqY2hpbGQpKQotICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBsYXlvdXRRdWV1ZS5hcHBlbmQoY2hpbGQpOwot
ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBMYXlv
dXREaXJlY3Rpb246OlNpYmxpbmcpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byogbmV4dFNpYmxp
bmcgPSBsYXlvdXRCb3gubmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCk7IG5leHRTaWJsaW5n
OyBuZXh0U2libGluZyA9IG5leHRTaWJsaW5nLT5uZXh0SW5GbG93T3JGbG9hdGluZ1NpYmxpbmco
KSkgewotICAgICAgICAgICAgICAgIGlmICghaW52YWxpZGF0aW9uU3RhdGUubmVlZHNMYXlvdXQo
Km5leHRTaWJsaW5nKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICAgICAgbGF5b3V0UXVldWUuYXBwZW5kKG5leHRTaWJsaW5nKTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgfQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIH07Ci0KLSAgICBhdXRvIGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94ID0gWyZdIChj
b25zdCBhdXRvJiBsYXlvdXRCb3gpIHsKLSAgICAgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0g
bGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICByZXR1cm4gJmNvbnRhaW5pbmdC
bG9jayA9PSAmZm9ybWF0dGluZ1Jvb3QgPyBjb25zdHJhaW50cyA6IGdlb21ldHJ5KCkuY29uc3Ry
YWludHNGb3JJbkZsb3dDb250ZW50KGNvbnRhaW5pbmdCbG9jayk7Ci0gICAgfTsKLQotICAgIC8v
IFRoaXMgaXMgYSBwb3N0LW9yZGVyIHRyZWUgdHJhdmVyc2FsIGxheW91dC4KLSAgICAvLyBUaGUg
cm9vdCBjb250YWluZXIgbGF5b3V0IGlzIGRvbmUgaW4gdGhlIGZvcm1hdHRpbmcgY29udGV4dCBp
dCBsaXZlcyBpbiwgbm90IHRoYXQgb25lIGl0IGNyZWF0ZXMsIHNvIGxldCdzIHN0YXJ0IHdpdGgg
dGhlIGZpcnN0IGNoaWxkLgotICAgIGFwcGVuZE5leHRUb0xheW91dFF1ZXVlKGZvcm1hdHRpbmdS
b290LCBMYXlvdXREaXJlY3Rpb246OkNoaWxkKTsKLSAgICAvLyAxLiBHbyBhbGwgdGhlIHdheSBk
b3duIHRvIHRoZSBsZWFmIG5vZGUKLSAgICAvLyAyLiBDb21wdXRlIHN0YXRpYyBwb3NpdGlvbiBh
bmQgd2lkdGggYXMgd2UgdHJhdmVyc2UgZG93bgotICAgIC8vIDMuIEFzIHdlIGNsaW1iIGJhY2sg
b24gdGhlIHRyZWUsIGNvbXB1dGUgaGVpZ2h0IGFuZCBmaW5pYWxpemUgcG9zaXRpb24KLSAgICAv
LyAoQW55IHN1YnRyZWVzIHdpdGggbmV3IGZvcm1hdHRpbmcgY29udGV4dHMgbmVlZCB0byBsYXlv
dXQgc3luY2hyb25vdXNseSkKLSAgICB3aGlsZSAoIWxheW91dFF1ZXVlLmlzRW1wdHkoKSkgewot
ICAgICAgICAvLyBUcmF2ZXJzZSBkb3duIG9uIHRoZSBkZXNjZW5kYW50cyBhbmQgY29tcHV0ZSB3
aWR0aC9zdGF0aWMgcG9zaXRpb24gdW50aWwgd2UgZmluZCBhIGxlYWYgbm9kZS4KLSAgICAgICAg
d2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9ICpsYXlvdXRRdWV1
ZS5sYXN0KCk7Ci0gICAgICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzID0g
Y29uc3RyYWludHNGb3JMYXlvdXRCb3gobGF5b3V0Qm94KTsKLQotICAgICAgICAgICAgY29tcHV0
ZUJvcmRlckFuZFBhZGRpbmcobGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cy5o
b3Jpem9udGFsKTsKLSAgICAgICAgICAgIGNvbXB1dGVTdGF0aWNWZXJ0aWNhbFBvc2l0aW9uKGxh
eW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMudmVydGljYWwpOwotICAgICAgICAg
ICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCB7IGNv
bnN0cmFpbnRzLCBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyB9KTsKLSAgICAgICAgICAgIGNv
bXB1dGVTdGF0aWNIb3Jpem9udGFsUG9zaXRpb24obGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tD
b25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICAgICAgICAgIGNvbXB1dGVQb3NpdGlvblRvQXZv
aWRGbG9hdHMoZmxvYXRpbmdDb250ZXh0LCBsYXlvdXRCb3gsIHsgY29uc3RyYWludHMsIGNvbnRh
aW5pbmdCbG9ja0NvbnN0cmFpbnRzIH0pOwotCi0gICAgICAgICAgICBpZiAobGF5b3V0Qm94LmVz
dGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChpczxD
b250YWluZXJCb3g+KGxheW91dEJveCkgJiYgZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRC
b3gpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1
dG8mIGNvbnRhaW5lckJveCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1h
dHRpbmdDb250ZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElGQ3MgaW5oZXJp
dCBmbG9hdHMgZnJvbSBwYXJlbnQgRkNzLiBXZSBuZWVkIGZpbmFsIHZlcnRpY2FsIHBvc2l0aW9u
IHRvIGZpbmQgaW50cnVkaW5nIGZsb2F0cy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWNv
bXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGNvbnRhaW5lckJveCwgeyBj
b25zdHJhaW50cywgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMgfSk7Ci0gICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gTGF5b3V0IHRoZSBpbmZsb3cgZGVzY2Vu
ZGFudHMgb2YgdGhpcyBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdC4KLSAgICAgICAgICAgICAgICAg
ICAgYXV0byBmb3JtYXR0aW5nQ29udGV4dCA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRp
bmdDb250ZXh0KGNvbnRhaW5lckJveCwgbGF5b3V0U3RhdGUoKSk7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChjb250YWluZXJCb3guaXNUYWJsZVdyYXBwZXJCb3goKSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGRvd25jYXN0PFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ+KCpm
b3JtYXR0aW5nQ29udGV4dCkuc2V0SG9yaXpvbnRhbENvbnN0cmFpbnRzSWdub3JpbmdGbG9hdHMo
Y29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGZvcm1hdHRpbmdDb250ZXh0LT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0
YXRlLCBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb250YWluZXJCb3gp
KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBpZiAoIWFwcGVuZE5leHRUb0xheW91dFF1ZXVlKGxheW91dEJveCwg
TGF5b3V0RGlyZWN0aW9uOjpDaGlsZCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLQotICAgICAgICAvLyBDbGltYiBiYWNrIG9uIHRoZSBhbmNlc3RvcnMgYW5kIGNvbXB1dGUg
aGVpZ2h0L2ZpbmFsIHBvc2l0aW9uLgotICAgICAgICB3aGlsZSAoIWxheW91dFF1ZXVlLmlzRW1w
dHkoKSkgewotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKmxheW91dFF1ZXVlLnRha2VM
YXN0KCk7Ci0gICAgICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzID0gY29u
c3RyYWludHNGb3JMYXlvdXRCb3gobGF5b3V0Qm94KTsKLQotICAgICAgICAgICAgLy8gQWxsIGlu
ZmxvdyBkZXNjZW5kYW50cyAoaWYgdGhlcmUgYXJlIGFueSkgYXJlIGxhaWQgb3V0IGJ5IG5vdy4g
TGV0J3MgY29tcHV0ZSB0aGUgYm94J3MgaGVpZ2h0IGFuZCB2ZXJ0aWNhbCBtYXJnaW4uCi0gICAg
ICAgICAgICBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2Nr
Q29uc3RyYWludHMpOwotICAgICAgICAgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRp
b25lZCgpKQotICAgICAgICAgICAgICAgIGZsb2F0aW5nU3RhdGUuYXBwZW5kKGZsb2F0aW5nQ29u
dGV4dC50b0Zsb2F0SXRlbShsYXlvdXRCb3gpKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAg
ICAgICAgICAgIC8vIEFkanVzdCB0aGUgdmVydGljYWwgcG9zaXRpb24gbm93IHRoYXQgd2UndmUg
Z290IGZpbmFsIG1hcmdpbiB2YWx1ZXMgZm9yIG5vbi1mbG9hdCBhdm9pZGVyIGJveGVzLgotICAg
ICAgICAgICAgICAgIC8vIEZsb2F0IGF2b2lkZXJzIGhhdmUgcHJlLWNvbXB1dGVkIHZlcnRpY2Fs
IHBvc2l0aW9ucyB3aGVuIGZsb2F0cyBhcmUgcHJlc2VudC4KLSAgICAgICAgICAgICAgICBpZiAo
IWxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpIHx8IGZsb2F0aW5nQ29udGV4dC5pc0VtcHR5KCkp
IHsKLSAgICAgICAgICAgICAgICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9y
bWF0dGluZ1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0g
Zm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3AodmVydGljYWxQb3NpdGlvbldpdGhNYXJnaW4o
bGF5b3V0Qm94LCBmb3JtYXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCks
IGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLnZlcnRpY2FsKSk7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXV0byBlc3RhYmxpc2hlc0Zvcm1hdHRpbmdD
b250ZXh0ID0gbGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKTsgCi0gICAg
ICAgICAgICBpZiAoZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCkgewotICAgICAgICAgICAg
ICAgIC8vIE5vdyB0aGF0IHdlIGNvbXB1dGVkIHRoZSBib3gncyBoZWlnaHQsIHdlIGNhbiBsYXlv
dXQgdGhlIG91dC1vZi1mbG93IGRlc2NlbmRhbnRzLgotICAgICAgICAgICAgICAgIGlmIChpczxD
b250YWluZXJCb3g+KGxheW91dEJveCkgJiYgZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRC
b3gpLmhhc0NoaWxkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXV0byYgY29udGFpbmVyQm94
ID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpOwotICAgICAgICAgICAgICAgICAg
ICBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjb250YWluZXJCb3gsIGxh
eW91dFN0YXRlKCkpLT5sYXlvdXRPdXRPZkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBn
ZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudChjb250YWluZXJCb3gpKTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWVzdGFi
bGlzaGVzRm9ybWF0dGluZ0NvbnRleHQgJiYgaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpKQot
ICAgICAgICAgICAgICAgIHBsYWNlSW5GbG93UG9zaXRpb25lZENoaWxkcmVuKGRvd25jYXN0PENv
bnRhaW5lckJveD4obGF5b3V0Qm94KSwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9yaXpv
bnRhbCk7Ci0KLSAgICAgICAgICAgIGlmIChhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShsYXlvdXRC
b3gsIExheW91dERpcmVjdGlvbjo6U2libGluZykpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgLy8gUGxhY2UgdGhlIGluZmxvdyBwb3NpdGlvbmVkIGNoaWxk
cmVuLgotICAgIHBsYWNlSW5GbG93UG9zaXRpb25lZENoaWxkcmVuKGZvcm1hdHRpbmdSb290LCBj
b25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0Nv
bnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW0VuZF0gLT4gYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0
IC0+IGZvcm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKLX0KLQotTGF5b3V0VW5p
dCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojp1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0Ci17Ci0g
ICAgLy8gMTAuNi43ICdBdXRvJyBoZWlnaHRzIGZvciBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQg
cm9vdHMKLQotICAgIC8vIElmIGl0IGhhcyBibG9jay1sZXZlbCBjaGlsZHJlbiwgdGhlIGhlaWdo
dCBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdG9wIG1hcmdpbi1lZGdlIG9mIHRoZSB0b3Bt
b3N0IGJsb2NrLWxldmVsCi0gICAgLy8gY2hpbGQgYm94IGFuZCB0aGUgYm90dG9tIG1hcmdpbi1l
ZGdlIG9mIHRoZSBib3R0b21tb3N0IGJsb2NrLWxldmVsIGNoaWxkIGJveC4KLQotICAgIC8vIElu
IGFkZGl0aW9uLCBpZiB0aGUgZWxlbWVudCBoYXMgYW55IGZsb2F0aW5nIGRlc2NlbmRhbnRzIHdo
b3NlIGJvdHRvbSBtYXJnaW4gZWRnZSBpcyBiZWxvdyB0aGUgZWxlbWVudCdzIGJvdHRvbSBjb250
ZW50IGVkZ2UsCi0gICAgLy8gdGhlbiB0aGUgaGVpZ2h0IGlzIGluY3JlYXNlZCB0byBpbmNsdWRl
IHRob3NlIGVkZ2VzLiBPbmx5IGZsb2F0cyB0aGF0IHBhcnRpY2lwYXRlIGluIHRoaXMgYmxvY2sg
Zm9ybWF0dGluZyBjb250ZXh0IGFyZSB0YWtlbgotICAgIC8vIGludG8gYWNjb3VudCwgZS5nLiwg
ZmxvYXRzIGluc2lkZSBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgZGVzY2VuZGFudHMgb3Igb3RoZXIg
ZmxvYXRzIGFyZSBub3QuCi0gICAgYXV0byB0b3AgPSBPcHRpb25hbDxMYXlvdXRVbml0PiB7IH07
Ci0gICAgYXV0byBib3R0b20gPSBPcHRpb25hbDxMYXlvdXRVbml0PiB7IH07Ci0gICAgaWYgKHJv
b3QoKS5oYXNJbkZsb3dDaGlsZCgpKSB7Ci0gICAgICAgIHRvcCA9IEJveEdlb21ldHJ5OjptYXJn
aW5Cb3hSZWN0KGdlb21ldHJ5Rm9yQm94KCpyb290KCkuZmlyc3RJbkZsb3dDaGlsZCgpKSkudG9w
KCk7Ci0gICAgICAgIGJvdHRvbSA9IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KGdlb21ldHJ5
Rm9yQm94KCpyb290KCkubGFzdEluRmxvd0NoaWxkKCkpKS5ib3R0b20oKTsKLSAgICB9Ci0KLSAg
ICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7ICp0aGlzLCBmb3JtYXR0
aW5nU3RhdGUoKS5mbG9hdGluZ1N0YXRlKCkgfTsKLSAgICBpZiAoYXV0byBmbG9hdFRvcCA9IGZs
b2F0aW5nQ29udGV4dC50b3AoKSkgewotICAgICAgICB0b3AgPSBzdGQ6Om1pbigqZmxvYXRUb3As
IHRvcC52YWx1ZU9yKCpmbG9hdFRvcCkpOwotICAgICAgICBhdXRvIGZsb2F0Qm90dG9tID0gKmZs
b2F0aW5nQ29udGV4dC5ib3R0b20oKTsKLSAgICAgICAgYm90dG9tID0gc3RkOjptYXgoZmxvYXRC
b3R0b20sIGJvdHRvbS52YWx1ZU9yKGZsb2F0Qm90dG9tKSk7Ci0gICAgfQotICAgIHJldHVybiAq
Ym90dG9tIC0gKnRvcDsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gQmxvY2tGb3JtYXR0aW5n
Q29udGV4dDo6dXNlZEF2YWlsYWJsZVdpZHRoRm9yRmxvYXRBdm9pZGVyKGNvbnN0IEZsb2F0aW5n
Q29udGV4dCYgZmxvYXRpbmdDb250ZXh0LCBjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29u
c3RyYWludHNQYWlyJiBjb25zdHJhaW50c1BhaXIpCi17Ci0gICAgLy8gTm9ybWFsbHkgdGhlIGF2
YWlsYWJsZSB3aWR0aCBmb3IgYW4gaW4tZmxvdyBibG9jayBsZXZlbCBib3ggaXMgdGhlIHdpZHRo
IG9mIHRoZSBjb250YWluaW5nIGJsb2NrJ3MgY29udGVudCBib3guCi0gICAgLy8gSG93ZXZlciAo
YW5kIGNhbid0IGZpbmQgaXQgYW55d2hlcmUgaW4gdGhlIHNwZWMpIG5vbi1mbG9hdGluZyBwb3Np
dGlvbmVkIGZsb2F0IGF2b2lkZXIgYmxvY2sgbGV2ZWwgYm94ZXMgYXJlIGNvbnN0cmFpbmVkIGJ5
IGV4aXN0aW5nIGZsb2F0cy4KLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkp
OwotICAgIGlmIChmbG9hdGluZ0NvbnRleHQuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4geyB9
OwotICAgIC8vIEZsb2F0IGNsZWFyIHB1c2hlcyB0aGUgYmxvY2sgbGV2ZWwgYm94IGVpdGhlciBi
ZWxvdyB0aGUgZmxvYXRzLCBvciBqdXN0IG9uZSBzaWRlIGJlbG93IGJ1dCB0aGUgb3RoZXIgc2lk
ZSBjb3VsZCBvdmVybGFwLgotICAgIC8vIFdoYXQgaXQgbWVhbnMgaXMgdGhhdCB0aGUgdXNlZCBh
dmFpbGFibGUgd2lkdGggYWx3YXlzIG1hdGNoZXMgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBjb25z
dHJhaW50LgotICAgIGlmIChsYXlvdXRCb3guaGFzRmxvYXRDbGVhcigpKQotICAgICAgICByZXR1
cm4geyB9OwotCi0gICAgQVNTRVJUKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250
ZXh0KCkpOwotICAgIC8vIFZlcnRpY2FsIHN0YXRpYyBwb3NpdGlvbiBpcyBub3QgY29tcHV0ZWQg
eWV0IGZvciB0aGlzIGZvcm1hdHRpbmcgY29udGV4dCByb290LCBzbyBsZXQncyBqdXN0IHByZS1j
b21wdXRlIGl0IGZvciBub3cuCi0gICAgcHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hB
bmRBbmNlc3RvcnMobGF5b3V0Qm94LCBjb25zdHJhaW50c1BhaXIpOwotCi0gICAgYXV0byBsb2dp
Y2FsVG9wSW5Gb3JtYXR0aW5nQ29udGV4dFJvb3RDb29yZGluYXRlID0gWyZdIChhdXRvJiBmbG9h
dEF2b2lkZXIpIHsKLSAgICAgICAgYXV0byB0b3AgPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94VG9w
KGdlb21ldHJ5Rm9yQm94KGZsb2F0QXZvaWRlcikpOwotICAgICAgICBmb3IgKGF1dG8qIGFuY2Vz
dG9yID0gJmZsb2F0QXZvaWRlci5jb250YWluaW5nQmxvY2soKTsgYW5jZXN0b3IgIT0gJnJvb3Qo
KTsgYW5jZXN0b3IgPSAmYW5jZXN0b3ItPmNvbnRhaW5pbmdCbG9jaygpKQotICAgICAgICAgICAg
dG9wICs9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hUb3AoZ2VvbWV0cnlGb3JCb3goKmFuY2VzdG9y
KSk7Ci0gICAgICAgIHJldHVybiB0b3A7Ci0gICAgfTsKLQotICAgIGF1dG8gZmxvYXRDb25zdHJh
aW50c0luQ29udGFpbmluZ0Jsb2NrQ29vcmRpbmF0ZSA9IFsmXSAoYXV0byBmbG9hdENvbnN0cmFp
bnRzKSB7Ci0gICAgICAgIGlmICghZmxvYXRDb25zdHJhaW50cy5sZWZ0ICYmICFmbG9hdENvbnN0
cmFpbnRzLnJpZ2h0KQotICAgICAgICAgICAgcmV0dXJuIEZsb2F0aW5nQ29udGV4dDo6Q29uc3Ry
YWludHMgeyB9OwotICAgICAgICBhdXRvIG9mZnNldCA9IExheW91dFNpemUgeyB9OwotICAgICAg
ICBmb3IgKGF1dG8qIGFuY2VzdG9yID0gJmxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsgYW5j
ZXN0b3IgIT0gJnJvb3QoKTsgYW5jZXN0b3IgPSAmYW5jZXN0b3ItPmNvbnRhaW5pbmdCbG9jaygp
KQotICAgICAgICAgICAgb2Zmc2V0ICs9IHRvTGF5b3V0U2l6ZShCb3hHZW9tZXRyeTo6Ym9yZGVy
Qm94VG9wTGVmdChnZW9tZXRyeUZvckJveCgqYW5jZXN0b3IpKSk7Ci0gICAgICAgIGlmIChmbG9h
dENvbnN0cmFpbnRzLmxlZnQpCi0gICAgICAgICAgICBmbG9hdENvbnN0cmFpbnRzLmxlZnQgPSBQ
b2ludEluQ29udGV4dFJvb3QgeyAqZmxvYXRDb25zdHJhaW50cy5sZWZ0IC0gb2Zmc2V0IH07Ci0g
ICAgICAgIGlmIChmbG9hdENvbnN0cmFpbnRzLnJpZ2h0KQotICAgICAgICAgICAgZmxvYXRDb25z
dHJhaW50cy5yaWdodCA9IFBvaW50SW5Db250ZXh0Um9vdCB7ICpmbG9hdENvbnN0cmFpbnRzLnJp
Z2h0IC0gb2Zmc2V0IH07Ci0gICAgICAgIHJldHVybiBmbG9hdENvbnN0cmFpbnRzOwotICAgIH07
Ci0KLSAgICAvLyBGSVhNRTogQ2hlY2sgaWYgdGhlIG5vbi15ZXQtY29tcHV0ZWQgaGVpZ2h0IGFm
ZmVjdHMgdGhpcyBjb21wdXRhdGlvbiAtIGFuZCB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzb2x2ZSBp
dCBhdCBhIGxhdGVyIHBvaW50LgotICAgIGF1dG8gbG9naWNhbFRvcCA9IGxvZ2ljYWxUb3BJbkZv
cm1hdHRpbmdDb250ZXh0Um9vdENvb3JkaW5hdGUobGF5b3V0Qm94KTsKLSAgICBhdXRvIGNvbnN0
cmFpbnRzID0gZmxvYXRDb25zdHJhaW50c0luQ29udGFpbmluZ0Jsb2NrQ29vcmRpbmF0ZShmbG9h
dGluZ0NvbnRleHQuY29uc3RyYWludHMobG9naWNhbFRvcCwgbG9naWNhbFRvcCkpOwotICAgIGlm
ICghY29uc3RyYWludHMubGVmdCAmJiAhY29uc3RyYWludHMucmlnaHQpCi0gICAgICAgIHJldHVy
biB7IH07Ci0gICAgLy8gU2hyaW5rIHRoZSBhdmFpbGFibGUgc3BhY2UgaWYgdGhlIGZsb2F0cyBh
cmUgYWN0dWFsbHkgaW50cnVkaW5nIGF0IHRoaXMgdmVydGljYWwgcG9zaXRpb24uCi0gICAgYXV0
byBhdmFpbGFibGVXaWR0aCA9IGNvbnN0cmFpbnRzUGFpci5jb250YWluaW5nQmxvY2suaG9yaXpv
bnRhbC5sb2dpY2FsV2lkdGg7Ci0gICAgaWYgKGNvbnN0cmFpbnRzLmxlZnQpCi0gICAgICAgIGF2
YWlsYWJsZVdpZHRoIC09IGNvbnN0cmFpbnRzLmxlZnQtPng7Ci0gICAgaWYgKGNvbnN0cmFpbnRz
LnJpZ2h0KQotICAgICAgICBhdmFpbGFibGVXaWR0aCAtPSBzdGQ6Om1heCgwX2x1LCBjb25zdHJh
aW50c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250YWwubG9naWNhbFJpZ2h0KCkgLSBjb25z
dHJhaW50cy5yaWdodC0+eCk7Ci0gICAgcmV0dXJuIGF2YWlsYWJsZVdpZHRoOwotfQotCi12b2lk
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OnBsYWNlSW5GbG93UG9zaXRpb25lZENoaWxkcmVuKGNv
bnN0IENvbnRhaW5lckJveCYgY29udGFpbmVyQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmIGhvcml6b250YWxDb25zdHJhaW50cykKLXsKLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0
dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiU3RhcnQ6IG1vdmUgaW4tZmxvdyBwb3NpdGlv
bmVkIGNoaWxkcmVuIC0+IHBhcmVudDogIiA8PCAmY29udGFpbmVyQm94KTsKLSAgICBmb3IgKGF1
dG8mIGNoaWxkQm94IDogY2hpbGRyZW5PZlR5cGU8Qm94Pihjb250YWluZXJCb3gpKSB7Ci0gICAg
ICAgIGlmICghY2hpbGRCb3guaXNJbkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgYXV0byBwb3NpdGlvbk9mZnNldCA9IGdlb21ldHJ5KCkuaW5GbG93UG9z
aXRpb25lZFBvc2l0aW9uT2Zmc2V0KGNoaWxkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwot
ICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShjaGlsZEJveCkubW92ZShwb3Np
dGlvbk9mZnNldCk7Ci0gICAgfQotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4
dExheW91dCwgc3RyZWFtIDw8ICJFbmQ6IG1vdmUgaW4tZmxvdyBwb3NpdGlvbmVkIGNoaWxkcmVu
IC0+IHBhcmVudDogIiA8PCAmY29udGFpbmVyQm94KTsKLX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0Ojpjb21wdXRlU3RhdGljVmVydGljYWxQb3NpdGlvbihjb25zdCBCb3gmIGxheW91
dEJveCwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cykKLXsK
LSAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxU
b3AoZ2VvbWV0cnkoKS5zdGF0aWNWZXJ0aWNhbFBvc2l0aW9uKGxheW91dEJveCwgdmVydGljYWxD
b25zdHJhaW50cykpOwotfQotCi12b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVT
dGF0aWNIb3Jpem9udGFsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQotewotICAgIGZvcm1hdHRp
bmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCkuc2V0TG9naWNhbExlZnQoZ2VvbWV0cnko
KS5zdGF0aWNIb3Jpem9udGFsUG9zaXRpb24obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMpKTsKLX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpwcmVjb21wdXRlVmVydGlj
YWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3Qg
Q29uc3RyYWludHNQYWlyJiBjb25zdHJhaW50c1BhaXIpCi17Ci0gICAgLy8gSW4gb3JkZXIgdG8g
ZmlndXJlIG91dCB3aGV0aGVyIGEgYm94IHNob3VsZCBhdm9pZCBhIGZsb2F0LCB3ZSBuZWVkIHRv
IGtub3cgdGhlIGZpbmFsIHBvc2l0aW9ucyBvZiBib3RoIChpZ25vcmUgcmVsYXRpdmUgcG9zaXRp
b25pbmcgZm9yIG5vdykuCi0gICAgLy8gSW4gYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHRoZSBm
aW5hbCBwb3NpdGlvbiBmb3IgYSBub3JtYWwgZmxvdyBib3ggaW5jbHVkZXMKLSAgICAvLyAxLiB0
aGUgc3RhdGljIHBvc2l0aW9uIGFuZAotICAgIC8vIDIuIHRoZSBjb3JyZXNwb25kaW5nIChub24p
Y29sbGFwc2VkIG1hcmdpbnMuCi0gICAgLy8gTm93IHRoZSB2ZXJ0aWNhbCBtYXJnaW5zIGFyZSBj
b21wdXRlZCB3aGVuIGFsbCB0aGUgZGVzY2VuZGFudHMgYXJlIGZpbmFsaXplZCwgYmVjYXVzZSB0
aGUgbWFyZ2luIHZhbHVlcyBtaWdodCBiZSBkZXBlbmRpbmcgb24gdGhlIGhlaWdodCBvZiB0aGUg
Ym94Ci0gICAgLy8gKGFuZCB0aGUgaGVpZ2h0IG1pZ2h0IGJlIGJhc2VkIG9uIHRoZSBjb250ZW50
KS4KLSAgICAvLyBTbyB3aGVuIHdlIGdldCB0byB0aGUgcG9pbnQgd2hlcmUgd2UgaW50ZXJzZWN0
IHRoZSBib3ggd2l0aCB0aGUgZmxvYXQgdG8gZGVjaWRlIGlmIHRoZSBib3ggbmVlZHMgdG8gbW92
ZSwgd2UgZG9uJ3QgeWV0IGhhdmUgdGhlIGZpbmFsIHZlcnRpY2FsIHBvc2l0aW9uLgotICAgIC8v
Ci0gICAgLy8gVGhlIGlkZWEgaGVyZSBpcyB0aGF0IGFzIGxvbmcgYXMgd2UgZG9uJ3QgY3Jvc3Mg
dGhlIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBib3VuZGFyeSwgd2Ugc2hvdWxkIGJlIGFibGUg
dG8gcHJlLWNvbXB1dGUgdGhlIGZpbmFsIHRvcCBwb3NpdGlvbi4KLSAgICAvLyBGSVhNRTogd2Ug
Y3VycmVudGx5IGRvbid0IGFjY291bnQgZm9yIHRoZSAiY2xlYXIiIHByb3BlcnR5IHdoZW4gY29t
cHV0aW5nIHRoZSBmaW5hbCBwb3NpdGlvbiBmb3IgYW4gYW5jZXN0b3IuCi0gICAgZm9yIChhdXRv
KiBhbmNlc3RvciA9ICZsYXlvdXRCb3g7IGFuY2VzdG9yICYmIGFuY2VzdG9yICE9ICZyb290KCk7
IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkgewotICAgICAgICBhdXRv
IGNvbnN0cmFpbnRzRm9yQW5jZXN0b3IgPSBbJl0gewotICAgICAgICAgICAgYXV0byYgY29udGFp
bmluZ0Jsb2NrID0gYW5jZXN0b3ItPmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICAgICAgcmV0
dXJuICZjb250YWluaW5nQmxvY2sgPT0gJnJvb3QoKSA/IGNvbnN0cmFpbnRzUGFpci5mb3JtYXR0
aW5nQ29udGV4dFJvb3QgOiBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChj
b250YWluaW5nQmxvY2spOwotICAgICAgICB9KCk7Ci0KLSAgICAgICAgYXV0byBjb21wdXRlZFZl
cnRpY2FsTWFyZ2luID0gZ2VvbWV0cnkoKS5jb21wdXRlZFZlcnRpY2FsTWFyZ2luKCphbmNlc3Rv
ciwgY29uc3RyYWludHNGb3JBbmNlc3Rvci5ob3Jpem9udGFsKTsKLSAgICAgICAgYXV0byB1c2Vk
Tm9uQ29sbGFwc2VkTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1
ZXMgeyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21wdXRlZFZl
cnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKLSAgICAgICAgYXV0byBwcmVjb21wdXRl
ZE1hcmdpbkJlZm9yZSA9IG1hcmdpbkNvbGxhcHNlKCkucHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUo
KmFuY2VzdG9yLCB1c2VkTm9uQ29sbGFwc2VkTWFyZ2luKTsKLQotICAgICAgICBhdXRvJiBib3hH
ZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KCphbmNlc3Rvcik7Ci0gICAg
ICAgIGF1dG8gbm9uQ29sbGFwc2VkVmFsdWVzID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xs
YXBzZWRWYWx1ZXMgeyBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZS5ub25Db2xsYXBzZWRWYWx1ZSwg
eyB9IH07Ci0gICAgICAgIGF1dG8gY29sbGFwc2VkVmFsdWVzID0gVXNlZFZlcnRpY2FsTWFyZ2lu
OjpDb2xsYXBzZWRWYWx1ZXMgeyBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZS5jb2xsYXBzZWRWYWx1
ZSwgeyB9LCBmYWxzZSB9OwotICAgICAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gVXNlZFZlcnRp
Y2FsTWFyZ2luIHsgbm9uQ29sbGFwc2VkVmFsdWVzLCBjb2xsYXBzZWRWYWx1ZXMsIHsgcHJlY29t
cHV0ZWRNYXJnaW5CZWZvcmUucG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbkJlZm9yZSwgeyB9IH0g
fTsKLQotICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRVc2VkVmVydGljYWxNYXJnaW4oKmFu
Y2VzdG9yLCB2ZXJ0aWNhbE1hcmdpbik7Ci0gICAgICAgIGJveEdlb21ldHJ5LnNldFZlcnRpY2Fs
TWFyZ2luKHsgbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKSwgbWFyZ2luQWZ0ZXIodmVydGlj
YWxNYXJnaW4pIH0pOwotICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2Fs
UG9zaXRpb25XaXRoTWFyZ2luKCphbmNlc3RvciwgdmVydGljYWxNYXJnaW4sIGNvbnN0cmFpbnRz
Rm9yQW5jZXN0b3IudmVydGljYWwpKTsKLSNpZiBBU1NFUlRfRU5BQkxFRAotICAgICAgICBzZXRQ
cmVjb21wdXRlZE1hcmdpbkJlZm9yZSgqYW5jZXN0b3IsIHByZWNvbXB1dGVkTWFyZ2luQmVmb3Jl
KTsKLSAgICAgICAgYm94R2VvbWV0cnkuc2V0SGFzUHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoKTsK
LSNlbmRpZgotICAgIH0KLX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRl
UG9zaXRpb25Ub0F2b2lkRmxvYXRzKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYgZmxvYXRpbmdDb250
ZXh0LCBjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29uc3RyYWludHNQYWlyJiBjb25zdHJh
aW50c1BhaXIpCi17Ci0gICAgaWYgKCFsYXlvdXRCb3guaXNGbG9hdEF2b2lkZXIoKSkKLSAgICAg
ICAgcmV0dXJuOwotICAgIC8vIEluIG9yZGVyIHRvIHBvc2l0aW9uIGEgZmxvYXQgYXZvaWRlciB3
ZSBuZWVkIHRvIGtub3cgaXRzIHZlcnRpY2FsIHBvc2l0aW9uIHJlbGF0aXZlIHRvIGl0cyBmb3Jt
YXR0aW5nIGNvbnRleHQgcm9vdCAoYW5kIG5vdCBqdXN0IGl0cyBjb250YWluaW5nIGJsb2NrKSwK
LSAgICAvLyBiZWNhdXNlIGFsbCB0aGUgYWxyZWFkeS1wbGFjZWQgZmxvYXRzIChmbG9hdHMgdGhh
dCB3ZSBhcmUgdHJ5aW5nIHRvIGF2b2lkIGhlcmUpIGluIHRoaXMgQkZDIG1pZ2h0IGJlbG9uZwot
ICAgIC8vIHRvIGEgZGlmZmVyZW50IHNldCBvZiBjb250YWluaW5nIGJsb2NrcyAoYnV0IHRoZXkg
YWxsIGRlc2NlbmRhbnRzIG9mIHRoZSBCRkMgcm9vdCkuCi0gICAgLy8gSG93ZXZlciBhY2NvcmRp
bmcgdG8gdGhlIEJGQyBydWxlcywgYXQgdGhpcyBwb2ludCBvZiB0aGUgbGF5b3V0IGZsb3cgd2Ug
ZG9uJ3QgeWV0IGhhdmUgY29tcHV0ZWQgdmVydGljYWwgcG9zaXRpb25zIGZvciB0aGUgYW5jZXN0
b3JzLgotICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkgewotICAgICAg
ICBwcmVjb21wdXRlVmVydGljYWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhsYXlvdXRCb3gs
IGNvbnN0cmFpbnRzUGFpcik7Ci0gICAgICAgIGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5
KGxheW91dEJveCkuc2V0TG9naWNhbFRvcExlZnQoZmxvYXRpbmdDb250ZXh0LnBvc2l0aW9uRm9y
RmxvYXQobGF5b3V0Qm94LCBjb25zdHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250
YWwpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBOb24tZmxvYXQgcG9zaXRpb25l
ZCBmbG9hdCBhdm9pZGVycyAoZm9ybWF0dGluZyBjb250ZXh0IHJvb3RzIGFuZCBjbGVhciBib3hl
cykgc2hvdWxkIGJlIGZpbmUgdW5sZXNzIHRoZXJlIGFyZSBmbG9hdHMgaW4gdGhpcyBjb250ZXh0
LgotICAgIGlmIChmbG9hdGluZ0NvbnRleHQuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0g
ICAgcHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMobGF5b3V0Qm94
LCBjb25zdHJhaW50c1BhaXIpOwotICAgIGlmIChsYXlvdXRCb3guaGFzRmxvYXRDbGVhcigpKQot
ICAgICAgICByZXR1cm4gY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JGbG9hdENsZWFyKGZsb2F0
aW5nQ29udGV4dCwgbGF5b3V0Qm94KTsKLQotICAgIEFTU0VSVChsYXlvdXRCb3guZXN0YWJsaXNo
ZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKLSAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRy
eShsYXlvdXRCb3gpLnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nQ29udGV4dC5wb3NpdGlvbkZv
ck5vbkZsb2F0aW5nRmxvYXRBdm9pZGVyKGxheW91dEJveCwgY29uc3RyYWludHNQYWlyLmNvbnRh
aW5pbmdCbG9jay5ob3Jpem9udGFsKSk7Ci19Ci0KLXZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6Y29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JGbG9hdENsZWFyKGNvbnN0IEZsb2F0aW5nQ29u
dGV4dCYgZmxvYXRpbmdDb250ZXh0LCBjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICBBU1NF
UlQobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSk7Ci0gICAgaWYgKGZsb2F0aW5nQ29udGV4dC5p
c0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLSAgICBhdXRvIHZlcnRpY2FsUG9zaXRpb25BbmRD
bGVhcmFuY2UgPSBmbG9hdGluZ0NvbnRleHQudmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2Uo
bGF5b3V0Qm94KTsKLSAgICBpZiAoIXZlcnRpY2FsUG9zaXRpb25BbmRDbGVhcmFuY2UpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCku
Ym94R2VvbWV0cnkobGF5b3V0Qm94KTsKLSAgICBBU1NFUlQodmVydGljYWxQb3NpdGlvbkFuZENs
ZWFyYW5jZS0+cG9zaXRpb24gPj0gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChib3hHZW9tZXRy
eSkpOwotICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3AodmVydGljYWxQb3NpdGlvbkFuZENs
ZWFyYW5jZS0+cG9zaXRpb24pOwotICAgIGlmICh2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJhbmNl
LT5jbGVhcmFuY2UpCi0gICAgICAgIGZvcm1hdHRpbmdTdGF0ZSgpLnNldEhhc0NsZWFyYW5jZShs
YXlvdXRCb3gpOwotICAgIC8vIEZJWE1FOiBSZXNldCB0aGUgbWFyZ2luIHZhbHVlcyBvbiB0aGUg
YW5jZXN0b3JzL3ByZXZpb3VzIHNpYmxpbmdzIG5vdyB0aGF0IHRoZSBmbG9hdCBhdm9pZGVyIHdp
dGggY2xlYXJhbmNlIGRvZXMgbm90IG1hcmdpbiBjb2xsYXBzZSBhbnltb3JlLgotfQotCi12b2lk
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVXaWR0aEFuZE1hcmdpbihjb25zdCBGbG9h
dGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0
IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQotewotICAgIGF1dG8gYXZhaWxhYmxl
V2lkdGhGbG9hdEF2b2lkZXIgPSBPcHRpb25hbDxMYXlvdXRVbml0PiB7IH07Ci0gICAgaWYgKGxh
eW91dEJveC5pc0Zsb2F0QXZvaWRlcigpKSB7Ci0gICAgICAgIC8vIEZsb2F0IGF2b2lkZXJzJyBh
dmFpbGFibGUgd2lkdGggbWlnaHQgYmUgc2hydW5rIGJ5IGV4aXN0aW5nIGZsb2F0cyBpbiB0aGUg
Y29udGV4dC4KLSAgICAgICAgYXZhaWxhYmxlV2lkdGhGbG9hdEF2b2lkZXIgPSB1c2VkQXZhaWxh
YmxlV2lkdGhGb3JGbG9hdEF2b2lkZXIoZmxvYXRpbmdDb250ZXh0LCBsYXlvdXRCb3gsIGNvbnN0
cmFpbnRzUGFpcik7Ci0gICAgfQotICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFyZ2luID0gZ2Vv
bWV0cnkoKS5jb21wdXRlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnN0cmFp
bnRzUGFpci5jb250YWluaW5nQmxvY2suaG9yaXpvbnRhbCwgYXZhaWxhYmxlV2lkdGhGbG9hdEF2
b2lkZXIpOwotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2Vv
bWV0cnkobGF5b3V0Qm94KTsKLSAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29u
dGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCk7Ci0gICAgYm94R2VvbWV0cnkuc2V0SG9y
aXpvbnRhbE1hcmdpbih7IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0LCBj
b250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgfSk7Ci19Ci0KLXZvaWQgQmxvY2tG
b3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91
dEJveCwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsK
LSAgICBhdXRvIGNvbXB1dGUgPSBbJl0oT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZEhlaWdodCkg
LT4gQ29udGVudEhlaWdodEFuZE1hcmdpbiB7Ci0gICAgICAgIGlmIChsYXlvdXRCb3guaXNJbkZs
b3coKSkKLSAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmluRmxvd0NvbnRlbnRIZWlnaHRB
bmRNYXJnaW4obGF5b3V0Qm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFsLCB7IHVzZWRIZWlnaHQg
fSk7Ci0KLSAgICAgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKQotICAg
ICAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCkuZmxvYXRpbmdDb250ZW50SGVpZ2h0QW5kTWFyZ2lu
KGxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwgeyB1c2VkSGVpZ2h0IH0pOwotCi0g
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4geyB9OwotICAgIH07
Ci0KLSAgICBhdXRvIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRlKHsgfSk7Ci0gICAg
aWYgKGF1dG8gbWF4SGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1heEhlaWdodChsYXlvdXRC
b3gpKSB7Ci0gICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQg
PiAqbWF4SGVpZ2h0KSB7Ci0gICAgICAgICAgICBhdXRvIG1heEhlaWdodEFuZE1hcmdpbiA9IGNv
bXB1dGUobWF4SGVpZ2h0KTsKLSAgICAgICAgICAgIC8vIFVzZWQgaGVpZ2h0IHNob3VsZCByZW1h
aW4gdGhlIHNhbWUuCi0gICAgICAgICAgICBBU1NFUlQoKGxheW91dFN0YXRlKCkuaW5RdWlya3NN
b2RlKCkgJiYgKGxheW91dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJv
eCgpKSkgfHwgbWF4SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPT0gKm1heEhlaWdodCk7
Ci0gICAgICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0geyAqbWF4SGVpZ2h0LCBtYXhI
ZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBpZiAoYXV0byBtaW5IZWlnaHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluSGVpZ2h0KGxh
eW91dEJveCkpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhl
aWdodCA8ICptaW5IZWlnaHQpIHsKLSAgICAgICAgICAgIGF1dG8gbWluSGVpZ2h0QW5kTWFyZ2lu
ID0gY29tcHV0ZShtaW5IZWlnaHQpOwotICAgICAgICAgICAgLy8gVXNlZCBoZWlnaHQgc2hvdWxk
IHJlbWFpbiB0aGUgc2FtZS4KLSAgICAgICAgICAgIEFTU0VSVCgobGF5b3V0U3RhdGUoKS5pblF1
aXJrc01vZGUoKSAmJiAobGF5b3V0Qm94LmlzQm9keUJveCgpIHx8IGxheW91dEJveC5pc0RvY3Vt
ZW50Qm94KCkpKSB8fCBtaW5IZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCA9PSAqbWluSGVp
Z2h0KTsKLSAgICAgICAgICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gPSB7ICptaW5IZWlnaHQs
IG1pbkhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW4gfTsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIC8vIDEuIENvbXB1dGUgY29sbGFwc2VkIG1hcmdpbnMuCi0gICAgLy8gMi4gQWRq
dXN0IHZlcnRpY2FsIHBvc2l0aW9uIHVzaW5nIHRoZSBjb2xsYXBzZWQgdmFsdWVzLgotICAgIC8v
IDMuIEFkanVzdCBwcmV2aW91cyBpbi1mbG93IHNpYmxpbmcgbWFyZ2luIGFmdGVyIHVzaW5nIHRo
aXMgbWFyZ2luLgotICAgIGF1dG8gbWFyZ2luQ29sbGFwc2UgPSB0aGlzLT5tYXJnaW5Db2xsYXBz
ZSgpOwotICAgIGF1dG8gdmVydGljYWxNYXJnaW4gPSBtYXJnaW5Db2xsYXBzZS5jb2xsYXBzZWRW
ZXJ0aWNhbFZhbHVlcyhsYXlvdXRCb3gsIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFw
c2VkTWFyZ2luKTsKLSAgICAvLyBDYWNoZSB0aGUgY29tcHV0ZWQgcG9zaXRpdmUgYW5kIG5lZ2F0
aXZlIG1hcmdpbiB2YWx1ZSBwYWlyLgotICAgIGZvcm1hdHRpbmdTdGF0ZSgpLnNldFVzZWRWZXJ0
aWNhbE1hcmdpbihsYXlvdXRCb3gsIHZlcnRpY2FsTWFyZ2luKTsKLQotI2lmIEFTU0VSVF9FTkFC
TEVECi0gICAgaWYgKGhhc1ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGxheW91dEJveCkgJiYgcHJl
Y29tcHV0ZWRNYXJnaW5CZWZvcmUobGF5b3V0Qm94KS51c2VkVmFsdWUoKSAhPSBtYXJnaW5CZWZv
cmUodmVydGljYWxNYXJnaW4pKSB7Ci0gICAgICAgIC8vIFdoZW4gdGhlIHByZS1jb21wdXRlZCBt
YXJnaW4gdHVybnMgb3V0IHRvIGJlIGluY29ycmVjdCwgd2UgbmVlZCB0byByZS1sYXlvdXQgdGhp
cyBzdWJ0cmVlIHdpdGggdGhlIGNvcnJlY3QgbWFyZ2luIHZhbHVlcy4KLSAgICAgICAgLy8gPGRp
diBzdHlsZT0iZmxvYXQ6IGxlZnQiPjwvZGl2PgotICAgICAgICAvLyA8ZGl2PgotICAgICAgICAv
LyAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDIwMHB4Ij48L2Rpdj4KLSAgICAgICAgLy8g
PC9kaXY+Ci0gICAgICAgIC8vIFRoZSBmbG9hdCBib3ggdHJpZ2dlcnMgbWFyZ2luIGJlZm9yZSBj
b21wdXRhdGlvbiBvbiB0aGUgYW5jZXN0b3IgY2hhaW4gdG8gYmUgYWJsZSB0byBpbnRlcnNlY3Qg
d2l0aCBvdGhlciBmbG9hdHMgaW4gdGhlIHNhbWUgZmxvYXRpbmcgY29udGV4dC4KLSAgICAgICAg
Ly8gSG93ZXZlciBpbiBzb21lIGNhc2VzIHRoZSBwYXJlbnQgbWFyZ2luLXRvcCBjb2xsYXBzZXMg
d2l0aCBzb21lIG5leHQgc2libGluZ3MgKG5lcGhld3MpIGFuZCB0aGVyZSdzIG5vIHdheSB0byBi
ZSBhYmxlIHRvIHByb3Blcmx5Ci0gICAgICAgIC8vIGFjY291bnQgZm9yIHRoYXQgd2l0aG91dCBs
YXlpbmcgb3V0IGV2ZXJ5IG5vZGUgaW4gdGhlIEZDIChpbiB0aGUgZXhhbXBsZSwgdGhlIG1hcmdp
bi1ib3R0b20gcHVzaGVzIGRvd24gdGhlIGZsb2F0KS4KLSAgICAgICAgQVNTRVJUX05PVF9JTVBM
RU1FTlRFRF9ZRVQoKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZv
cm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgYm94R2VvbWV0cnku
c2V0Q29udGVudEJveEhlaWdodChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQp
OwotICAgIGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgbWFyZ2luQmVmb3JlKHZlcnRp
Y2FsTWFyZ2luKSwgbWFyZ2luQWZ0ZXIodmVydGljYWxNYXJnaW4pIH0pOwotICAgIC8vIEFkanVz
dCB0aGUgcHJldmlvdXMgc2libGluZydzIG1hcmdpbiBib3R0b20gbm93IHRoYXQgdGhpcyBib3gn
cyB2ZXJ0aWNhbCBtYXJnaW4gaXMgY29tcHV0ZWQuCi0gICAgTWFyZ2luQ29sbGFwc2U6OnVwZGF0
ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nKCp0aGlzLCBtYXJnaW5Db2xsYXBzZSwgbGF5
b3V0Qm94KTsKLX0KLQotRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzKCkKLXsKLSAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5nU3Rh
dGUoKTsKLSAgICBBU1NFUlQoIWZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzKCkpOwotICAgIC8vIFZpc2l0IHRoZSBpbi1mbG93IGRlc2NlbmRhbnRzIGFuZCBjb21wdXRl
IHRoZWlyIG1pbi9tYXggaW50cmluc2ljIHdpZHRoIGlmIG5lZWRlZC4KLSAgICAvLyAxLiBHbyBh
bGwgdGhlIHdheSBkb3duIHRvIHRoZSBsZWFmIG5vZGUKLSAgICAvLyAyLiBDaGVjayBpZiBhY3R1
YWxseSBuZWVkIHRvIHZpc2l0IGFsbCB0aGUgYm94ZXMgYXMgd2UgdHJhdmVyc2UgZG93biAoYWxy
ZWFkeSBjb21wdXRlZCwgY29udGFpbmVyJ3MgbWluL21heCBkb2VzIG5vdCBkZXBlbmQgb24gZGVz
Y2VuZGFudHMgZXRjKQotICAgIC8vIDMuIEFzIHdlIGNsaW1iIGJhY2sgb24gdGhlIHRyZWUsIGNv
bXB1dGUgbWluL21heCBpbnRyaW5zaWMgd2lkdGgKLSAgICAvLyAoQW55IHN1YnRyZWVzIHdpdGgg
bmV3IGZvcm1hdHRpbmcgY29udGV4dHMgbmVlZCB0byBsYXlvdXQgc3luY2hyb25vdXNseSkKLSAg
ICBWZWN0b3I8Y29uc3QgQm94Kj4gcXVldWU7Ci0gICAgaWYgKHJvb3QoKS5oYXNJbkZsb3dPckZs
b2F0aW5nQ2hpbGQoKSkKLSAgICAgICAgcXVldWUuYXBwZW5kKHJvb3QoKS5maXJzdEluRmxvd09y
RmxvYXRpbmdDaGlsZCgpKTsKLQotICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29uc3Ry
YWludHM7Ci0gICAgYXV0byBtYXhpbXVtSG9yaXpvbnRhbFN0YWNraW5nV2lkdGggPSBMYXlvdXRV
bml0IHsgfTsKLSAgICBhdXRvIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IExheW91
dFVuaXQgeyB9OwotICAgIHdoaWxlICghcXVldWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHdoaWxl
ICh0cnVlKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBk
ZXNjZW5kYW50IGNvbnRlbnQuCi0gICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSAqcXVldWUu
bGFzdCgpOwotICAgICAgICAgICAgLy8gRmxvYXQgYXZvaWRlcnMgYXJlIGFsbCBlc3RhYmxpc2gg
YSBuZXcgZm9ybWF0dGluZyBjb250ZXh0LiBObyBuZWVkIHRvIGxvb2sgaW5zaWRlIHRoZW0uCi0g
ICAgICAgICAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkgJiYgIWxheW91dEJveC5o
YXNGbG9hdENsZWFyKCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvLyBO
b24tZmxvYXRpbmcgYmxvY2sgbGV2ZWwgYm94ZXMgcmVzZXQgdGhlIGN1cnJlbnQgaG9yaXpvbnRh
bCBmbG9hdCBzdGFja2luZy4KLSAgICAgICAgICAgIC8vIFNQRUM6IFRoaXMgaXMgYSBiaXQgb2Rk
IGFzIGZsb2F0aW5nIHBvc2l0aW9uaW5nIGlzIGEgZm9ybWF0dGluZyBjb250ZXh0IGxldmVsIGNv
bmNlcHQ6Ci0gICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAvLyA8ZGl2IHN0eWxlPSJm
bG9hdDogbGVmdDsgd2lkdGg6IDEwcHg7Ij48L2Rpdj4KLSAgICAgICAgICAgIC8vIDxkaXY+PC9k
aXY+Ci0gICAgICAgICAgICAvLyA8ZGl2IHN0eWxlPSJmbG9hdDogbGVmdDsgd2lkdGg6IDQwcHg7
Ij48L2Rpdj4KLSAgICAgICAgICAgIC8vIC4uLndpbGwgcHJvZHVjZSBhIG1heCB3aWR0aCBvZiA0
MHB4IHdoaWNoIG1ha2VzIHRoZSBmbG9hdHMgdmVydGljYWxseSBzdGFja2VkLgotICAgICAgICAg
ICAgLy8gVmVydGljYWxseSBzdGFja2VkIGZsb2F0cyBtYWtlcyBtZSB0aGluayB3ZSBoYXZlbid0
IG1hbmFnZWQgdG8gcHJvdmlkZSB0aGUgbWF4aW11bSBwcmVmZXJyZWQgd2lkdGggZm9yIHRoZSBj
b250ZW50LgotICAgICAgICAgICAgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoID0gc3Rk
OjptYXgoY3VycmVudEhvcml6b250YWxTdGFja2luZ1dpZHRoLCBtYXhpbXVtSG9yaXpvbnRhbFN0
YWNraW5nV2lkdGgpOwotICAgICAgICAgICAgY3VycmVudEhvcml6b250YWxTdGFja2luZ1dpZHRo
ID0geyB9OwotICAgICAgICAgICAgLy8gQWxyZWFkeSBoYXMgY29tcHV0ZWQgaW50cmluc2ljIGNv
bnN0cmFpbnRzLgotICAgICAgICAgICAgaWYgKGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzRm9yQm94KGxheW91dEJveCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICAvLyBCb3ggd2l0aCBmaXhlZCB3aWR0aCBkZWZpbmVzIHRoZWlyIGRlc2NlbmRh
bnQgY29udGVudCBpbnRyaW5zaWMgd2lkdGguCi0gICAgICAgICAgICBpZiAobGF5b3V0Qm94LnN0
eWxlKCkud2lkdGgoKS5pc0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICAvLyBOb24tZmxvYXQgYXZvaWRlciBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdHMgYXJlIG9w
YXF1ZSB0byBpbnRyaW5zaWMgd2lkdGggY29tcHV0YXRpb24uCi0gICAgICAgICAgICBpZiAobGF5
b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSkKLSAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgIC8vIE5vIHJlbGV2YW50IGNoaWxkIGNvbnRlbnQuCi0gICAgICAg
ICAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSB8fCAhZG93bmNhc3Q8Q29udGFp
bmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcXVldWUuYXBwZW5kKGRvd25jYXN0PENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KS5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpKTsKLSAgICAgICAg
fQotICAgICAgICAvLyBDb21wdXRlIG1pbi9tYXggaW50cmluc2ljIHdpZHRoIGJvdHRvbSB1cCBp
ZiBuZWVkZWQuCi0gICAgICAgIHdoaWxlICghcXVldWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAg
ICBhdXRvJiBsYXlvdXRCb3ggPSAqcXVldWUudGFrZUxhc3QoKTsKLSAgICAgICAgICAgIGF1dG8g
ZGVzZGVuZGFudENvbnN0cmFpbnRzID0gZm9ybWF0dGluZ1N0YXRlLmludHJpbnNpY1dpZHRoQ29u
c3RyYWludHNGb3JCb3gobGF5b3V0Qm94KTsKLSAgICAgICAgICAgIGlmICghZGVzZGVuZGFudENv
bnN0cmFpbnRzKSB7Ci0gICAgICAgICAgICAgICAgZGVzZGVuZGFudENvbnN0cmFpbnRzID0gZ2Vv
bWV0cnkoKS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGxheW91dEJveCk7Ci0gICAgICAgICAg
ICAgICAgZm9ybWF0dGluZ1N0YXRlLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3go
bGF5b3V0Qm94LCAqZGVzZGVuZGFudENvbnN0cmFpbnRzKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGNvbnN0cmFpbnRzLm1pbmltdW0gPSBzdGQ6Om1heChjb25zdHJhaW50cy5taW5pbXVt
LCBkZXNkZW5kYW50Q29uc3RyYWludHMtPm1pbmltdW0pOwotICAgICAgICAgICAgYXV0byB3aWxs
U3RhY2tIb3Jpem9udGFsbHkgPSBsYXlvdXRCb3guaXNGbG9hdEF2b2lkZXIoKSAmJiAhbGF5b3V0
Qm94Lmhhc0Zsb2F0Q2xlYXIoKTsKLSAgICAgICAgICAgIGlmICh3aWxsU3RhY2tIb3Jpem9udGFs
bHkpCi0gICAgICAgICAgICAgICAgY3VycmVudEhvcml6b250YWxTdGFja2luZ1dpZHRoICs9IGRl
c2RlbmRhbnRDb25zdHJhaW50cy0+bWF4aW11bTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAg
ICAgICAgICBjb25zdHJhaW50cy5tYXhpbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMubWF4aW11
bSwgZGVzZGVuZGFudENvbnN0cmFpbnRzLT5tYXhpbXVtKTsKLSAgICAgICAgICAgIC8vIE1vdmUg
b3ZlciB0byB0aGUgbmV4dCBzaWJsaW5nIG9yIHRha2UgdGhlIG5leHQgYm94IGluIHRoZSBxdWV1
ZS4KLSAgICAgICAgICAgIGlmIChhdXRvKiBuZXh0U2libGluZyA9IGxheW91dEJveC5uZXh0SW5G
bG93T3JGbG9hdGluZ1NpYmxpbmcoKSkgewotICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChu
ZXh0U2libGluZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoID0gc3RkOjpt
YXgoY3VycmVudEhvcml6b250YWxTdGFja2luZ1dpZHRoLCBtYXhpbXVtSG9yaXpvbnRhbFN0YWNr
aW5nV2lkdGgpOwotICAgIGNvbnN0cmFpbnRzLm1heGltdW0gPSBzdGQ6Om1heChjb25zdHJhaW50
cy5tYXhpbXVtLCBtYXhpbXVtSG9yaXpvbnRhbFN0YWNraW5nV2lkdGgpOwotICAgIGZvcm1hdHRp
bmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKTsKLSAgICBy
ZXR1cm4gY29uc3RyYWludHM7Ci19Ci0KLUxheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6dmVydGljYWxQb3NpdGlvbldpdGhNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0
IFVzZWRWZXJ0aWNhbE1hcmdpbiYgdmVydGljYWxNYXJnaW4sICBjb25zdCBWZXJ0aWNhbENvbnN0
cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzKSBjb25zdAotewotICAgIEFTU0VSVCghbGF5b3V0
Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKLSAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBjb21w
dXRlZCB0aGUgZmluYWwgbWFyZ2luIGJlZm9yZSwgbGV0J3Mgc2hpZnQgdGhlIGJveCdzIHZlcnRp
Y2FsIHBvc2l0aW9uIGlmIG5lZWRlZC4KLSAgICAvLyAxLiBDaGVjayBpZiB0aGUgYm94IGhhcyBj
bGVhcmFuY2UuIElmIHNvLCB3ZSd2ZSBhbHJlYWR5IHByZWNvbXB1dGVkL2ZpbmFsaXplZCB0aGUg
dG9wIHZhbHVlIGFuZCB2ZXJ0aWNhbCBtYXJnaW4gZG9lcyBub3QgaW1wYWN0IGl0IGFueW1vcmUu
Ci0gICAgLy8gMi4gQ2hlY2sgaWYgdGhlIG1hcmdpbiBiZWZvcmUgY29sbGFwc2VzIHdpdGggdGhl
IHByZXZpb3VzIGJveCdzIG1hcmdpbiBhZnRlci4gaWYgbm90IC0+IHJldHVybiBwcmV2aW91cyBi
b3gncyBib3R0b20gaW5jbHVkaW5nIG1hcmdpbiBhZnRlciArIG1hcmdpbkJlZm9yZQotICAgIC8v
IDMuIENoZWNrIGlmIHRoZSBwcmV2aW91cyBib3gncyBtYXJnaW5zIGNvbGxhcHNlIHRocm91Z2gu
IElmIG5vdCAtPiByZXR1cm4gcHJldmlvdXMgYm94JyBib3R0b20gZXhjbHVkaW5nIG1hcmdpbiBh
ZnRlciArIG1hcmdpbkJlZm9yZSAodGhleSBhcmUgc3VwcG9zZWQgdG8gYmUgZXF1YWwpCi0gICAg
Ly8gNC4gR28gdG8gcHJldmlvdXMgYm94IGFuZCBzdGFydCBmcm9tIHN0ZXAgIzEgdW50aWwgd2Ug
aGl0IHRoZSBwYXJlbnQgYm94LgotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZ2VvbWV0cnlGb3JC
b3gobGF5b3V0Qm94KTsKLSAgICBpZiAoZm9ybWF0dGluZ1N0YXRlKCkuaGFzQ2xlYXJhbmNlKGxh
eW91dEJveCkpCi0gICAgICAgIHJldHVybiBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94VG9wKGJveEdl
b21ldHJ5KTsKLQotICAgIGF1dG8qIGN1cnJlbnRMYXlvdXRCb3ggPSAmbGF5b3V0Qm94OwotICAg
IHdoaWxlIChjdXJyZW50TGF5b3V0Qm94KSB7Ci0gICAgICAgIGlmICghY3VycmVudExheW91dEJv
eC0+cHJldmlvdXNJbkZsb3dTaWJsaW5nKCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
YXV0byYgcHJldmlvdXNJbkZsb3dTaWJsaW5nID0gKmN1cnJlbnRMYXlvdXRCb3gtPnByZXZpb3Vz
SW5GbG93U2libGluZygpOwotICAgICAgICBpZiAoIW1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVm
b3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKCpjdXJyZW50TGF5b3V0
Qm94KSkgewotICAgICAgICAgICAgYXV0byYgcHJldmlvdXNCb3hHZW9tZXRyeSA9IGdlb21ldHJ5
Rm9yQm94KHByZXZpb3VzSW5GbG93U2libGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gQm94R2Vv
bWV0cnk6Om1hcmdpbkJveFJlY3QocHJldmlvdXNCb3hHZW9tZXRyeSkuYm90dG9tKCkgKyBtYXJn
aW5CZWZvcmUodmVydGljYWxNYXJnaW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtYXJn
aW5Db2xsYXBzZSgpLm1hcmdpbnNDb2xsYXBzZVRocm91Z2gocHJldmlvdXNJbkZsb3dTaWJsaW5n
KSkgewotICAgICAgICAgICAgYXV0byYgcHJldmlvdXNCb3hHZW9tZXRyeSA9IGdlb21ldHJ5Rm9y
Qm94KHByZXZpb3VzSW5GbG93U2libGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gQm94R2VvbWV0
cnk6OmJvcmRlckJveFJlY3QocHJldmlvdXNCb3hHZW9tZXRyeSkuYm90dG9tKCkgKyBtYXJnaW5C
ZWZvcmUodmVydGljYWxNYXJnaW4pOwotICAgICAgICB9Ci0gICAgICAgIGN1cnJlbnRMYXlvdXRC
b3ggPSAmcHJldmlvdXNJbkZsb3dTaWJsaW5nOwotICAgIH0KLQotICAgIGF1dG8gY29udGFpbmlu
Z0Jsb2NrQ29udGVudEJveFRvcCA9IHZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbFRvcDsKLSAg
ICAvLyBBZGp1c3QgdmVydGljYWwgcG9zaXRpb24gZGVwZW5kaW5nIHdoZXRoZXIgdGhpcyBib3gg
ZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBhZGpvaW5zIHdpdGggaXRzIHBhcmVudC4KLSAgICBhdXRv
IGRpcmVjdGx5QWRqb2luc1BhcmVudCA9ICFsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5n
KCk7Ci0gICAgaWYgKGRpcmVjdGx5QWRqb2luc1BhcmVudCkgewotICAgICAgICAvLyBJZiB0aGUg
dG9wIGFuZCBib3R0b20gbWFyZ2lucyBvZiBhIGJveCBhcmUgYWRqb2luaW5nLCB0aGVuIGl0IGlz
IHBvc3NpYmxlIGZvciBtYXJnaW5zIHRvIGNvbGxhcHNlIHRocm91Z2ggaXQuCi0gICAgICAgIC8v
IEluIHRoaXMgY2FzZSwgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGRlcGVuZHMgb24gaXRz
IHJlbGF0aW9uc2hpcCB3aXRoIHRoZSBvdGhlciBlbGVtZW50cyB3aG9zZSBtYXJnaW5zIGFyZSBi
ZWluZyBjb2xsYXBzZWQuCi0gICAgICAgIGlmICh2ZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1
ZXMuaXNDb2xsYXBzZWRUaHJvdWdoKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCdz
IG1hcmdpbnMgYXJlIGNvbGxhcHNlZCB3aXRoIGl0cyBwYXJlbnQncyB0b3AgbWFyZ2luLCB0aGUg
dG9wIGJvcmRlciBlZGdlIG9mIHRoZSBib3ggaXMgZGVmaW5lZCB0byBiZSB0aGUgc2FtZSBhcyB0
aGUgcGFyZW50J3MuCi0gICAgICAgICAgICBpZiAobWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5CZWZv
cmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxheW91dEJveCkpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3A7Ci0gICAgICAgICAgICAv
LyBPdGhlcndpc2UsIGVpdGhlciB0aGUgZWxlbWVudCdzIHBhcmVudCBpcyBub3QgdGFraW5nIHBh
cnQgaW4gdGhlIG1hcmdpbiBjb2xsYXBzaW5nLCBvciBvbmx5IHRoZSBwYXJlbnQncyBib3R0b20g
bWFyZ2luIGlzIGludm9sdmVkLgotICAgICAgICAgICAgLy8gVGhlIHBvc2l0aW9uIG9mIHRoZSBl
bGVtZW50J3MgdG9wIGJvcmRlciBlZGdlIGlzIHRoZSBzYW1lIGFzIGl0IHdvdWxkIGhhdmUgYmVl
biBpZiB0aGUgZWxlbWVudCBoYWQgYSBub24temVybyBib3R0b20gYm9yZGVyLgotICAgICAgICAg
ICAgYXV0byBiZWZvcmVNYXJnaW5XaXRoQm90dG9tQm9yZGVyID0gbWFyZ2luQ29sbGFwc2UoKS5t
YXJnaW5CZWZvcmVJZ25vcmluZ0NvbGxhcHNpbmdUaHJvdWdoKGxheW91dEJveCwgdmVydGljYWxN
YXJnaW4ubm9uQ29sbGFwc2VkVmFsdWVzKTsKLSAgICAgICAgICAgIHJldHVybiBjb250YWluaW5n
QmxvY2tDb250ZW50Qm94VG9wICsgYmVmb3JlTWFyZ2luV2l0aEJvdHRvbUJvcmRlcjsKLSAgICAg
ICAgfQotICAgICAgICAvLyBOb24tY29sbGFwc2VkIHRocm91Z2ggYm94IHZlcnRpY2FsIHBvc2l0
aW9uIGRlcGVuZGluZyB3aGV0aGVyIHRoZSBtYXJnaW4gY29sbGFwc2VzLgotICAgICAgICBpZiAo
bWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVm
b3JlKGxheW91dEJveCkpCi0gICAgICAgICAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrQ29udGVu
dEJveFRvcDsKLQotICAgICAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrQ29udGVudEJveFRvcCAr
IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbik7Ci0gICAgfQotICAgIC8vIEF0IHRoaXMgcG9p
bnQgdGhpcyBib3ggaW5kaXJlY3RseSAodmlhIGNvbGxhcHNlZCB0aHJvdWdoIHByZXZpb3VzIGlu
LWZsb3cgc2libGluZ3MpIGFkam9pbnMgdGhlIHBhcmVudC4gTGV0J3MgY2hlY2sgaWYgaXQgbWFy
Z2luIGNvbGxhcHNlcyB3aXRoIHRoZSBwYXJlbnQuCi0gICAgYXV0byYgY29udGFpbmluZ0Jsb2Nr
ID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOwotICAgIEFTU0VSVChjb250YWluaW5nQmxv
Y2suZmlyc3RJbkZsb3dDaGlsZCgpKTsKLSAgICBBU1NFUlQoY29udGFpbmluZ0Jsb2NrLmZpcnN0
SW5GbG93Q2hpbGQoKSAhPSAmbGF5b3V0Qm94KTsKLSAgICBpZiAobWFyZ2luQ29sbGFwc2UoKS5t
YXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKCpjb250YWluaW5nQmxv
Y2suZmlyc3RJbkZsb3dDaGlsZCgpKSkKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0Nv
bnRlbnRCb3hUb3A7Ci0KLSAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrQ29udGVudEJveFRvcCAr
IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbik7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0
dGluZ0NvbnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Q5
OTY5M2U4N2NkMGIwZjEzMmVhYzcxMzY5MGUwYjcwNTJlMTI5Li4wMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zv
cm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk4
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0Ogot
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
Ci0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
Ci0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgot
ICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRf
Rk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIK
LSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+
Ci0jaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNs
YXNzIExheW91dFVuaXQ7Ci0KLW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBCb3g7Ci1jbGFz
cyBGbG9hdGluZ0NvbnRleHQ7Ci0KLS8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbGF5b3V0
IGxvZ2ljIGZvciBibG9jayBmb3JtYXR0aW5nIGNvbnRleHRzLgotLy8gaHR0cHM6Ly93d3cudzMu
b3JnL1RSL0NTUzIyL3Zpc3VyZW4uaHRtbCNibG9jay1mb3JtYXR0aW5nCi1jbGFzcyBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0IHsKLSAgICBXVEZfTUFL
RV9JU09fQUxMT0NBVEVEKEJsb2NrRm9ybWF0dGluZ0NvbnRleHQpOwotcHVibGljOgotICAgIEJs
b2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4
dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJik7Ci0KLSAgICB2b2lkIGxheW91dEluRmxvd0Nv
bnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRl
bnQmKSBvdmVycmlkZTsKLSAgICBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3Qg
b3ZlcnJpZGU7Ci0KLXByb3RlY3RlZDoKLSAgICBzdHJ1Y3QgQ29uc3RyYWludHNQYWlyIHsKLSAg
ICAgICAgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IGZvcm1hdHRpbmdDb250ZXh0Um9vdDsK
LSAgICAgICAgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IGNvbnRhaW5pbmdCbG9jazsKLSAg
ICB9OwotICAgIHZvaWQgcGxhY2VJbkZsb3dQb3NpdGlvbmVkQ2hpbGRyZW4oY29uc3QgQ29udGFp
bmVyQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7Ci0KLSAgICB2b2lkIGNvbXB1
dGVXaWR0aEFuZE1hcmdpbihjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBCb3gmLCBjb25z
dCBDb25zdHJhaW50c1BhaXImKTsKLSAgICB2b2lkIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29u
c3QgQm94JiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jik7Ci0KLSAgICB2b2lk
IGNvbXB1dGVTdGF0aWNIb3Jpem9udGFsUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJik7Ci0gICAgdm9pZCBjb21wdXRlU3RhdGljVmVydGljYWxQb3NpdGlv
bihjb25zdCBCb3gmLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJik7Ci0gICAgdm9pZCBjb21w
dXRlUG9zaXRpb25Ub0F2b2lkRmxvYXRzKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0IEJv
eCYsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYpOwotICAgIHZvaWQgY29tcHV0ZVZlcnRpY2FsUG9z
aXRpb25Gb3JGbG9hdENsZWFyKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0IEJveCYpOwot
Ci0gICAgdm9pZCBwcmVjb21wdXRlVmVydGljYWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhj
b25zdCBCb3gmLCBjb25zdCBDb25zdHJhaW50c1BhaXImKTsKLQotICAgIEludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJpZGU7
Ci0KLSAgICBMYXlvdXRVbml0IHZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGNvbnN0IEJveCYs
IGNvbnN0IFVzZWRWZXJ0aWNhbE1hcmdpbiYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmKSBj
b25zdDsKLQotICAgIC8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBwb3NpdGlvbmluZyBhbmQgc2l6
aW5nIGZvciBib3hlcyBwYXJ0aWNpcGF0aW5nIGluIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0
LgotICAgIGNsYXNzIEdlb21ldHJ5IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRy
eSB7Ci0gICAgcHVibGljOgotICAgICAgICBHZW9tZXRyeShjb25zdCBCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0Jik7Ci0KLSAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBpbkZsb3dDb250ZW50
SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYs
IGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpOwotICAgICAgICBDb250ZW50V2lkdGhB
bmRNYXJnaW4gaW5GbG93Q29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7
Ci0KLSAgICAgICAgUG9pbnQgc3RhdGljUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYpIGNvbnN0OwotICAg
ICAgICBMYXlvdXRVbml0IHN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3Qg
VmVydGljYWxDb25zdHJhaW50cyYpIGNvbnN0OwotICAgICAgICBMYXlvdXRVbml0IHN0YXRpY0hv
cml6b250YWxQb3NpdGlvbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMm
KSBjb25zdDsKLQotICAgICAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMoY29uc3QgQm94Jik7Ci0KLSAgICAgICAgQ29udGVudFdpZHRoQW5kTWFy
Z2luIGNvbXB1dGVkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYsIE9wdGlvbmFsPExheW91dFVuaXQ+IGF2YWlsYWJsZVdpZHRoRmxv
YXRBdm9pZGVyKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJn
aW4gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNv
bnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVl
cyYpOwotICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gaW5GbG93Tm9uUmVwbGFjZWRDb250
ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKLSAgICAgICAgQ29udGVudFdp
ZHRoQW5kTWFyZ2luIGluRmxvd1JlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IFJl
cGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMmKTsKLQotICAgICAgICBjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Zm9ybWF0dGluZ0Nv
bnRleHQoKSk7IH0KLSAgICB9OwotICAgIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5
IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMpOyB9Ci0KLSAgICAvLyBU
aGlzIGNsYXNzIGltcGxlbWVudHMgbWFyZ2luIGNvbGxhcHNpbmcgZm9yIGJsb2NrIGZvcm1hdHRp
bmcgY29udGV4dC4KLSAgICBjbGFzcyBNYXJnaW5Db2xsYXBzZSB7Ci0gICAgcHVibGljOgotICAg
ICAgICBVc2VkVmVydGljYWxNYXJnaW4gY29sbGFwc2VkVmVydGljYWxWYWx1ZXMoY29uc3QgQm94
JiwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpOwotCi0gICAgICAgIFBy
ZWNvbXB1dGVkTWFyZ2luQmVmb3JlIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYs
IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsKLSAgICAgICAgTGF5b3V0
VW5pdCBtYXJnaW5CZWZvcmVJZ25vcmluZ0NvbGxhcHNpbmdUaHJvdWdoKGNvbnN0IEJveCYsIFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsKLSAgICAgICAgc3RhdGljIHZv
aWQgdXBkYXRlTWFyZ2luQWZ0ZXJGb3JQcmV2aW91c1NpYmxpbmcoQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dCYsIGNvbnN0IE1hcmdpbkNvbGxhcHNlJiwgY29uc3QgQm94Jik7Ci0KLSAgICAgICAgYm9v
bCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYp
IGNvbnN0OwotICAgICAgICBib29sIG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxv
d0NoaWxkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OwotICAgICAgICBib29sIG1hcmdp
bkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmKSBjb25zdDsK
LSAgICAgICAgYm9vbCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5nTWFy
Z2luQWZ0ZXIoY29uc3QgQm94JikgY29uc3Q7Ci0KLSAgICAgICAgYm9vbCBtYXJnaW5BZnRlckNv
bGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmKSBjb25zdDsKLSAgICAgICAg
Ym9vbCBtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhMYXN0SW5GbG93Q2hpbGRNYXJnaW5BZnRlcihj
b25zdCBCb3gmKSBjb25zdDsKLSAgICAgICAgYm9vbCBtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQ
YXJlbnRNYXJnaW5CZWZvcmUoY29uc3QgQm94JikgY29uc3Q7Ci0gICAgICAgIGJvb2wgbWFyZ2lu
QWZ0ZXJDb2xsYXBzZXNXaXRoTmV4dFNpYmxpbmdNYXJnaW5CZWZvcmUoY29uc3QgQm94JikgY29u
c3Q7Ci0gICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoU2libGluZ01hcmdpbkJl
Zm9yZVdpdGhDbGVhcmFuY2UoY29uc3QgQm94JikgY29uc3Q7Ci0KLSAgICAgICAgYm9vbCBtYXJn
aW5zQ29sbGFwc2VUaHJvdWdoKGNvbnN0IEJveCYpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAg
ICAgICAgZnJpZW5kIGNsYXNzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ7Ci0gICAgICAgIE1hcmdp
bkNvbGxhcHNlKGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsKLQotICAgICAgICBlbnVt
IGNsYXNzIE1hcmdpblR5cGUgeyBCZWZvcmUsIEFmdGVyIH07Ci0gICAgICAgIFVzZWRWZXJ0aWNh
bE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBwb3NpdGl2ZU5lZ2F0aXZl
VmFsdWVzKGNvbnN0IEJveCYsIE1hcmdpblR5cGUpIGNvbnN0OwotICAgICAgICBVc2VkVmVydGlj
YWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcG9zaXRpdmVOZWdhdGl2
ZU1hcmdpbkJlZm9yZShjb25zdCBCb3gmLCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNl
ZFZhbHVlcykgY29uc3Q7Ci0gICAgICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmRO
ZWdhdGl2ZVBhaXI6OlZhbHVlcyBwb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQWZ0ZXIoY29uc3QgQm94
JiwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0OwotCi0gICAg
ICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBw
cmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUoY29uc3QgQm94JiwgVXNlZFZl
cnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0OwotICAgICAgICBVc2VkVmVy
dGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcHJlY29tcHV0ZWRQ
b3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKGNvbnN0IEJveCYpIGNvbnN0OwotCi0gICAgICAgIFVzZWRW
ZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBjb21wdXRlZFBv
c2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4oVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5l
Z2F0aXZlUGFpcjo6VmFsdWVzLCBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRp
dmVQYWlyOjpWYWx1ZXMpIGNvbnN0OwotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBtYXJn
aW5WYWx1ZShVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1
ZXMpIGNvbnN0OwotCi0gICAgICAgIGJvb2wgaGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYpIGNvbnN0
OwotCi0gICAgICAgIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIHsgcmV0dXJuIG1fYmxvY2tG
b3JtYXR0aW5nQ29udGV4dC5sYXlvdXRTdGF0ZSgpOyB9Ci0gICAgICAgIGNvbnN0IExheW91dFN0
YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4
dC5sYXlvdXRTdGF0ZSgpOyB9Ci0gICAgICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQm
IGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja0Zvcm1hdHRpbmdDb250
ZXh0OyB9Ci0KLSAgICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgbV9ibG9ja0Zv
cm1hdHRpbmdDb250ZXh0OwotICAgIH07Ci0gICAgTWFyZ2luQ29sbGFwc2UgbWFyZ2luQ29sbGFw
c2UoKSBjb25zdCB7IHJldHVybiBNYXJnaW5Db2xsYXBzZSgqdGhpcyk7IH0KLQotICAgIGNsYXNz
IFF1aXJrcyA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzIHsKLSAgICBwdWJsaWM6
Ci0gICAgICAgIFF1aXJrcyhjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Jik7Ci0KLSAgICAg
ICAgYm9vbCBuZWVkc1N0cmV0Y2hpbmcoY29uc3QgQm94JikgY29uc3Q7Ci0gICAgICAgIExheW91
dFVuaXQgc3RyZXRjaGVkSW5GbG93SGVpZ2h0KGNvbnN0IEJveCYsIENvbnRlbnRIZWlnaHRBbmRN
YXJnaW4pOwotCi0gICAgICAgIGJvb2wgc2hvdWxkSWdub3JlQ29sbGFwc2VkUXVpcmtNYXJnaW4o
Y29uc3QgQm94JikgY29uc3Q7Ci0gICAgICAgIGJvb2wgc2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZv
cmVXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OwotICAgICAgICBib29s
IHNob3VsZENvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94
JikgY29uc3Q7Ci0KLSAgICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0
dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0PihGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpmb3JtYXR0aW5nQ29udGV4dCgpKTsgfQot
ICAgICAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgpIGNvbnN0
IHsgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnkoKTsgfQotCi0gICAgfTsKLSAg
ICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4g
UXVpcmtzKCp0aGlzKTsgfQotCi0gICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZEF2YWlsYWJs
ZVdpZHRoRm9yRmxvYXRBdm9pZGVyKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0IEJveCYs
IGNvbnN0IENvbnN0cmFpbnRzUGFpciYpOwotCi0gICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nU3Rh
dGUmIGZvcm1hdHRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEJsb2NrRm9ybWF0
dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9Ci0gICAg
QmxvY2tGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIGRvd25jYXN0
PEJsb2NrRm9ybWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRl
KCkpOyB9Ci0KLSNpZiBBU1NFUlRfRU5BQkxFRAotICAgIHZvaWQgc2V0UHJlY29tcHV0ZWRNYXJn
aW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IFByZWNvbXB1dGVkTWFyZ2luQmVm
b3JlJiBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZSkgeyBtX3ByZWNvbXB1dGVkTWFyZ2luQmVmb3Jl
TGlzdC5zZXQoJmxheW91dEJveCwgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUpOyB9Ci0gICAgUHJl
Y29tcHV0ZWRNYXJnaW5CZWZvcmUgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBs
YXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmVMaXN0Lmdl
dCgmbGF5b3V0Qm94KTsgfQotICAgIGJvb2wgaGFzUHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoY29u
c3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fcHJlY29tcHV0ZWRNYXJnaW5CZWZv
cmVMaXN0LmNvbnRhaW5zKCZsYXlvdXRCb3gpOyB9Ci0jZW5kaWYKLXByaXZhdGU6Ci0gICAgSGFz
aE1hcDxjb25zdCBCb3gqLCBQcmVjb21wdXRlZE1hcmdpbkJlZm9yZT4gbV9wcmVjb21wdXRlZE1h
cmdpbkJlZm9yZUxpc3Q7Ci19OwotCi1pbmxpbmUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnk6Okdlb21ldHJ5KGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2NrRm9ybWF0
dGluZ0NvbnRleHQpCi0gICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkoYmxvY2tGb3Jt
YXR0aW5nQ29udGV4dCkKLXsKLX0KLQotaW5saW5lIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1
aXJrczo6UXVpcmtzKGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQpCi0gICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzKGJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQpCi17Ci19Ci0KLWlubGluZSBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5D
b2xsYXBzZTo6TWFyZ2luQ29sbGFwc2UoY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgYmxv
Y2tGb3JtYXR0aW5nQ29udGV4dCkKLSAgICA6IG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4dChibG9j
a0Zvcm1hdHRpbmdDb250ZXh0KQotewotfQotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJ
VFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LCBpc0Js
b2NrRm9ybWF0dGluZ0NvbnRleHQoKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRy
eS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0
dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBh
MWEyYjQxNmM2N2RlNWYyNDVkNTJjMTVkYjYzNDM1OGRjY2I1YjEuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2Nr
Zm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCisrKyAvZGV2L251
bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0g
KiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0j
aW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9G
T1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgot
I2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiSW5saW5lRm9ybWF0dGlu
Z1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlv
dXRDaGlsZEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUg
IkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKLSNpbmNsdWRlICJMYXlvdXRSZXBsYWNl
ZEJveC5oIgotI2luY2x1ZGUgIkxvZ2dpbmcuaCIKLSNpbmNsdWRlIDx3dGYvdGV4dC9UZXh0U3Ry
ZWFtLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1Db250
ZW50SGVpZ2h0QW5kTWFyZ2luIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbkZs
b3dOb25SZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25z
dCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykKLXsK
LSAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5GbG93KCkgJiYgIWxheW91dEJveC5pc1JlcGxhY2Vk
Qm94KCkpOwotICAgIEFTU0VSVChsYXlvdXRCb3guaXNPdmVyZmxvd1Zpc2libGUoKSk7Ci0KLSAg
ICBhdXRvIGNvbXB1dGUgPSBbJl0oY29uc3QgYXV0byYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVz
KSAtPiBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIHsKLQotICAgICAgICAvLyAxMC42LjMgQmxvY2st
bGV2ZWwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93IHdoZW4gJ292ZXJmbG93
JyBjb21wdXRlcyB0byAndmlzaWJsZScKLSAgICAgICAgLy8KLSAgICAgICAgLy8gSWYgJ21hcmdp
bi10b3AnLCBvciAnbWFyZ2luLWJvdHRvbScgYXJlICdhdXRvJywgdGhlaXIgdXNlZCB2YWx1ZSBp
cyAwLgotICAgICAgICAvLyBJZiAnaGVpZ2h0JyBpcyAnYXV0bycsIHRoZSBoZWlnaHQgZGVwZW5k
cyBvbiB3aGV0aGVyIHRoZSBlbGVtZW50IGhhcyBhbnkgYmxvY2stbGV2ZWwgY2hpbGRyZW4gYW5k
IHdoZXRoZXIgaXQgaGFzIHBhZGRpbmcgb3IgYm9yZGVyczoKLSAgICAgICAgLy8gVGhlIGVsZW1l
bnQncyBoZWlnaHQgaXMgdGhlIGRpc3RhbmNlIGZyb20gaXRzIHRvcCBjb250ZW50IGVkZ2UgdG8g
dGhlIGZpcnN0IGFwcGxpY2FibGUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgLy8gMS4gdGhl
IGJvdHRvbSBlZGdlIG9mIHRoZSBsYXN0IGxpbmUgYm94LCBpZiB0aGUgYm94IGVzdGFibGlzaGVz
IGEgaW5saW5lIGZvcm1hdHRpbmcgY29udGV4dCB3aXRoIG9uZSBvciBtb3JlIGxpbmVzCi0gICAg
ICAgIC8vIDIuIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgYm90dG9tIChwb3NzaWJseSBjb2xsYXBz
ZWQpIG1hcmdpbiBvZiBpdHMgbGFzdCBpbi1mbG93IGNoaWxkLCBpZiB0aGUgY2hpbGQncyBib3R0
b20gbWFyZ2luCi0gICAgICAgIC8vICAgIGRvZXMgbm90IGNvbGxhcHNlIHdpdGggdGhlIGVsZW1l
bnQncyBib3R0b20gbWFyZ2luCi0gICAgICAgIC8vIDMuIHRoZSBib3R0b20gYm9yZGVyIGVkZ2Ug
b2YgdGhlIGxhc3QgaW4tZmxvdyBjaGlsZCB3aG9zZSB0b3AgbWFyZ2luIGRvZXNuJ3QgY29sbGFw
c2Ugd2l0aCB0aGUgZWxlbWVudCdzIGJvdHRvbSBtYXJnaW4KLSAgICAgICAgLy8gNC4gemVybywg
b3RoZXJ3aXNlCi0gICAgICAgIC8vIE9ubHkgY2hpbGRyZW4gaW4gdGhlIG5vcm1hbCBmbG93IGFy
ZSB0YWtlbiBpbnRvIGFjY291bnQgKGkuZS4sIGZsb2F0aW5nIGJveGVzIGFuZCBhYnNvbHV0ZWx5
IHBvc2l0aW9uZWQgYm94ZXMgYXJlIGlnbm9yZWQsCi0gICAgICAgIC8vIGFuZCByZWxhdGl2ZWx5
IHBvc2l0aW9uZWQgYm94ZXMgYXJlIGNvbnNpZGVyZWQgd2l0aG91dCB0aGVpciBvZmZzZXQpLiBO
b3RlIHRoYXQgdGhlIGNoaWxkIGJveCBtYXkgYmUgYW4gYW5vbnltb3VzIGJsb2NrIGJveC4KLQot
ICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlG
b3JCb3gobGF5b3V0Qm94KTsKLSAgICAgICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0g
R2VvbWV0cnk6OmNvbXB1dGVkVmVydGljYWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29u
c3RyYWludHMpOwotICAgICAgICBhdXRvIG5vbkNvbGxhcHNlZE1hcmdpbiA9IFVzZWRWZXJ0aWNh
bE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZv
cmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07
IAotICAgICAgICBhdXRvIGJvcmRlckFuZFBhZGRpbmdUb3AgPSBib3hHZW9tZXRyeS5ib3JkZXJU
b3AoKSArIGJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKDApOwotICAgICAgICBhdXRv
IGhlaWdodCA9IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQgPyBvdmVycmlkZGVuVmVy
dGljYWxWYWx1ZXMuaGVpZ2h0LnZhbHVlKCkgOiBjb21wdXRlZEhlaWdodChsYXlvdXRCb3gpOwot
Ci0gICAgICAgIGlmIChoZWlnaHQpCi0gICAgICAgICAgICByZXR1cm4geyAqaGVpZ2h0LCBub25D
b2xsYXBzZWRNYXJnaW4gfTsKLQotICAgICAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0
Qm94KSB8fCAhZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxvd0NoaWxk
KCkpCi0gICAgICAgICAgICByZXR1cm4geyAwLCBub25Db2xsYXBzZWRNYXJnaW4gfTsKLQotICAg
ICAgICAvLyAxLiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGxhc3QgbGluZSBib3gsIGlmIHRoZSBi
b3ggZXN0YWJsaXNoZXMgYSBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0IHdpdGggb25lIG9yIG1v
cmUgbGluZXMKLSAgICAgICAgYXV0byYgbGF5b3V0Q29udGFpbmVyID0gZG93bmNhc3Q8Q29udGFp
bmVyQm94PihsYXlvdXRCb3gpOwotICAgICAgICBpZiAobGF5b3V0Q29udGFpbmVyLmVzdGFibGlz
aGVzSW5saW5lRm9ybWF0dGluZ0NvbnRleHQoKSkgewotICAgICAgICAgICAgYXV0byYgaW5saW5l
Rm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZElubGluZUZvcm1hdHRp
bmdTdGF0ZShsYXlvdXRDb250YWluZXIpOwotICAgICAgICAgICAgYXV0byYgbGluZXMgPSBpbmxp
bmVGb3JtYXR0aW5nU3RhdGUubGluZXMoKTsKLSAgICAgICAgICAgIC8vIEV2ZW4gZW1wdHkgY29u
dGFpbmVycyBnZW5lcmF0ZSBvbmUgbGluZS4gCi0gICAgICAgICAgICBBU1NFUlQoIWxpbmVzLmlz
RW1wdHkoKSk7Ci0gICAgICAgICAgICByZXR1cm4geyB0b0xheW91dFVuaXQobGluZXMubGFzdCgp
LmxpbmVCb3hMb2dpY2FsUmVjdCgpLmJvdHRvbSgpICsgaW5saW5lRm9ybWF0dGluZ1N0YXRlLmNs
ZWFyR2FwQWZ0ZXJMYXN0TGluZSgpKSAtIGJvcmRlckFuZFBhZGRpbmdUb3AsIG5vbkNvbGxhcHNl
ZE1hcmdpbiB9OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gMi4gdGhlIGJvdHRvbSBlZGdlIG9m
IHRoZSBib3R0b20gKHBvc3NpYmx5IGNvbGxhcHNlZCkgbWFyZ2luIG9mIGl0cyBsYXN0IGluLWZs
b3cgY2hpbGQsIGlmIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4uLi4KLSAgICAgICAgYXV0byYg
bGFzdEluRmxvd0NoaWxkID0gKmxheW91dENvbnRhaW5lci5sYXN0SW5GbG93Q2hpbGQoKTsKLSAg
ICAgICAgaWYgKCFmb3JtYXR0aW5nQ29udGV4dCgpLm1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQWZ0
ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIobGFzdEluRmxvd0NoaWxkKSkgewotICAg
ICAgICAgICAgYXV0byYgbGFzdEluRmxvd0JveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQo
KS5nZW9tZXRyeUZvckJveChsYXN0SW5GbG93Q2hpbGQpOwotICAgICAgICAgICAgYXV0byBib3R0
b21FZGdlT2ZCb3R0b21NYXJnaW4gPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChsYXN0SW5G
bG93Qm94R2VvbWV0cnkpLmJvdHRvbSgpICsgbGFzdEluRmxvd0JveEdlb21ldHJ5Lm1hcmdpbkFm
dGVyKCk7Ci0gICAgICAgICAgICByZXR1cm4geyBib3R0b21FZGdlT2ZCb3R0b21NYXJnaW4gLSBi
b3JkZXJBbmRQYWRkaW5nVG9wLCBub25Db2xsYXBzZWRNYXJnaW4gfTsKLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIDMuIHRoZSBib3R0b20gYm9yZGVyIGVkZ2Ugb2YgdGhlIGxhc3QgaW4tZmxvdyBj
aGlsZCB3aG9zZSB0b3AgbWFyZ2luIGRvZXNuJ3QgY29sbGFwc2Ugd2l0aCB0aGUgZWxlbWVudCdz
IGJvdHRvbSBtYXJnaW4KLSAgICAgICAgYXV0byogaW5GbG93Q2hpbGQgPSAmbGFzdEluRmxvd0No
aWxkOwotICAgICAgICB3aGlsZSAoaW5GbG93Q2hpbGQgJiYgZm9ybWF0dGluZ0NvbnRleHQoKS5t
YXJnaW5Db2xsYXBzZSgpLm1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRl
cigqaW5GbG93Q2hpbGQpKQotICAgICAgICAgICAgaW5GbG93Q2hpbGQgPSBpbkZsb3dDaGlsZC0+
cHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7Ci0gICAgICAgIGlmIChpbkZsb3dDaGlsZCkgewotICAg
ICAgICAgICAgYXV0byYgaW5GbG93Qm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdl
b21ldHJ5Rm9yQm94KCppbkZsb3dDaGlsZCk7Ci0gICAgICAgICAgICByZXR1cm4geyBCb3hHZW9t
ZXRyeTo6Ym9yZGVyQm94VG9wKGluRmxvd0JveEdlb21ldHJ5KSArIGluRmxvd0JveEdlb21ldHJ5
LmJvcmRlckJveCgpLmhlaWdodCgpIC0gYm9yZGVyQW5kUGFkZGluZ1RvcCwgbm9uQ29sbGFwc2Vk
TWFyZ2luIH07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA0LiB6ZXJvLCBvdGhlcndpc2UKLSAg
ICAgICAgcmV0dXJuIHsgMCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0gICAgfTsKLQotICAgIC8v
IDEwLjYuNyAnQXV0bycgaGVpZ2h0cyBmb3IgYmxvY2stbGV2ZWwgZm9ybWF0dGluZyBjb250ZXh0
IGJveGVzLgotICAgIGF1dG8gaXNBdXRvSGVpZ2h0ID0gIW92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVl
cy5oZWlnaHQgJiYgIWNvbXB1dGVkSGVpZ2h0KGxheW91dEJveCk7Ci0gICAgaWYgKGlzQXV0b0hl
aWdodCAmJiAobGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSAmJiAhbGF5
b3V0Qm94LmVzdGFibGlzaGVzSW5saW5lRm9ybWF0dGluZ0NvbnRleHQoKSkpCi0gICAgICAgIHJl
dHVybiBjb21wdXRlKCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMgeyBjb250ZW50SGVpZ2h0Rm9y
Rm9ybWF0dGluZ0NvbnRleHRSb290KGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkg
fSk7Ci0gICAgcmV0dXJuIGNvbXB1dGUob3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKLX0KLQot
Q29udGVudFdpZHRoQW5kTWFyZ2luIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpp
bkZsb3dOb25SZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJv
eCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNv
bnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVl
cykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5GbG93KCkpOwotCi0gICAgYXV0byBjb21w
dXRlID0gWyZdKCkgewotCi0gICAgICAgIC8vIDEwLjMuMyBCbG9jay1sZXZlbCwgbm9uLXJlcGxh
Y2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoZSBm
b2xsb3dpbmcgY29uc3RyYWludHMgbXVzdCBob2xkIGFtb25nIHRoZSB1c2VkIHZhbHVlcyBvZiB0
aGUgb3RoZXIgcHJvcGVydGllczoKLSAgICAgICAgLy8gJ21hcmdpbi1sZWZ0JyArICdib3JkZXIt
bGVmdC13aWR0aCcgKyAncGFkZGluZy1sZWZ0JyArICd3aWR0aCcgKyAncGFkZGluZy1yaWdodCcg
KyAnYm9yZGVyLXJpZ2h0LXdpZHRoJyArICdtYXJnaW4tcmlnaHQnID0gd2lkdGggb2YgY29udGFp
bmluZyBibG9jawotICAgICAgICAvLwotICAgICAgICAvLyAxLiBJZiAnd2lkdGgnIGlzIG5vdCAn
YXV0bycgYW5kICdib3JkZXItbGVmdC13aWR0aCcgKyAncGFkZGluZy1sZWZ0JyArICd3aWR0aCcg
KyAncGFkZGluZy1yaWdodCcgKyAnYm9yZGVyLXJpZ2h0LXdpZHRoJyAKLSAgICAgICAgLy8gICAg
KHBsdXMgYW55IG9mICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgdGhhdCBhcmUgbm90
ICdhdXRvJykgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpZHRoIG9mIHRoZSBjb250YWluaW5nIGJsb2Nr
LCB0aGVuCi0gICAgICAgIC8vICAgIGFueSAnYXV0bycgdmFsdWVzIGZvciAnbWFyZ2luLWxlZnQn
IG9yICdtYXJnaW4tcmlnaHQnIGFyZSwgZm9yIHRoZSBmb2xsb3dpbmcgcnVsZXMsIHRyZWF0ZWQg
YXMgemVyby4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gMi4gSWYgYWxsIG9mIHRoZSBhYm92ZSBo
YXZlIGEgY29tcHV0ZWQgdmFsdWUgb3RoZXIgdGhhbiAnYXV0bycsIHRoZSB2YWx1ZXMgYXJlIHNh
aWQgdG8gYmUgIm92ZXItY29uc3RyYWluZWQiIGFuZCBvbmUgb2YgdGhlIHVzZWQgdmFsdWVzIHdp
bGwKLSAgICAgICAgLy8gICAgaGF2ZSB0byBiZSBkaWZmZXJlbnQgZnJvbSBpdHMgY29tcHV0ZWQg
dmFsdWUuIElmIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgY29udGFpbmluZyBibG9j
ayBoYXMgdGhlIHZhbHVlICdsdHInLCB0aGUgc3BlY2lmaWVkIHZhbHVlCi0gICAgICAgIC8vICAg
IG9mICdtYXJnaW4tcmlnaHQnIGlzIGlnbm9yZWQgYW5kIHRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVk
IHNvIGFzIHRvIG1ha2UgdGhlIGVxdWFsaXR5IHRydWUuIElmIHRoZSB2YWx1ZSBvZiAnZGlyZWN0
aW9uJyBpcyAncnRsJywKLSAgICAgICAgLy8gICAgdGhpcyBoYXBwZW5zIHRvICdtYXJnaW4tbGVm
dCcgaW5zdGVhZC4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gMy4gSWYgdGhlcmUgaXMgZXhhY3Rs
eSBvbmUgdmFsdWUgc3BlY2lmaWVkIGFzICdhdXRvJywgaXRzIHVzZWQgdmFsdWUgZm9sbG93cyBm
cm9tIHRoZSBlcXVhbGl0eS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gNC4gSWYgJ3dpZHRoJyBp
cyBzZXQgdG8gJ2F1dG8nLCBhbnkgb3RoZXIgJ2F1dG8nIHZhbHVlcyBiZWNvbWUgJzAnIGFuZCAn
d2lkdGgnIGZvbGxvd3MgZnJvbSB0aGUgcmVzdWx0aW5nIGVxdWFsaXR5LgotICAgICAgICAvLwot
ICAgICAgICAvLyA1LiBJZiBib3RoICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIGFy
ZSAnYXV0bycsIHRoZWlyIHVzZWQgdmFsdWVzIGFyZSBlcXVhbC4gVGhpcyBob3Jpem9udGFsbHkg
Y2VudGVycyB0aGUgZWxlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhlCi0gICAgICAgIC8vICAgIGVk
Z2VzIG9mIHRoZSBjb250YWluaW5nIGJsb2NrLgotCi0gICAgICAgIGF1dG8gY29udGFpbmluZ0Js
b2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoOwotICAgICAgICBh
dXRvJiBjb250YWluaW5nQmxvY2tTdHlsZSA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5z
dHlsZSgpOwotICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCku
Z2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKLQotICAgICAgICBhdXRvIHdpZHRoID0gb3ZlcnJp
ZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGggPyBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy53
aWR0aCA6IGNvbXB1dGVkV2lkdGgobGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0g
ICAgICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAg
ICAgIFVzZWRIb3Jpem9udGFsTWFyZ2luIHVzZWRIb3Jpem9udGFsTWFyZ2luOwotICAgICAgICBh
dXRvIGJvcmRlckxlZnQgPSBib3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCk7Ci0gICAgICAgIGF1dG8g
Ym9yZGVyUmlnaHQgPSBib3hHZW9tZXRyeS5ib3JkZXJSaWdodCgpOwotICAgICAgICBhdXRvIHBh
ZGRpbmdMZWZ0ID0gYm94R2VvbWV0cnkucGFkZGluZ0xlZnQoKS52YWx1ZU9yKDApOwotICAgICAg
ICBhdXRvIHBhZGRpbmdSaWdodCA9IGJveEdlb21ldHJ5LnBhZGRpbmdSaWdodCgpLnZhbHVlT3Io
MCk7Ci0KLSAgICAgICAgLy8gIzEKLSAgICAgICAgaWYgKHdpZHRoKSB7Ci0gICAgICAgICAgICBh
dXRvIGhvcml6b250YWxTcGFjZUZvck1hcmdpbiA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKGNv
bXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDApICsgYm9yZGVyTGVmdCArIHBh
ZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyBjb21wdXRl
ZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMCkpOwotICAgICAgICAgICAgaWYgKGhvcml6
b250YWxTcGFjZUZvck1hcmdpbiA8IDApCi0gICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxN
YXJnaW4gPSB7IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDApLCBjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMCkgfTsKLSAgICAgICAgfQotCi0gICAg
ICAgIC8vICMyCi0gICAgICAgIGlmICh3aWR0aCAmJiBjb21wdXRlZEhvcml6b250YWxNYXJnaW4u
c3RhcnQgJiYgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgewotICAgICAgICAgICAgaWYg
KGNvbnRhaW5pbmdCbG9ja1N0eWxlLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkgewotICAgICAg
ICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gKmNvbXB1dGVkSG9yaXpvbnRh
bE1hcmdpbi5zdGFydDsKLSAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQg
PSBjb250YWluaW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJv
cmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJp
Z2h0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXNlZEhvcml6b250
YWxNYXJnaW4uZW5kID0gKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQ7Ci0gICAgICAgICAg
ICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAt
IChib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3Jk
ZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLQotICAgICAgICAvLyAjMwotICAgICAgICBpZiAoIWNvbXB1dGVkSG9yaXpvbnRhbE1h
cmdpbi5zdGFydCAmJiB3aWR0aCAmJiBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7Ci0g
ICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgPSAqY29tcHV0ZWRIb3Jpem9udGFs
TWFyZ2luLmVuZDsKLSAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gY29u
dGFpbmluZ0Jsb2NrV2lkdGggLSAoYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICArICp3aWR0aCAr
IHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kKTsK
LSAgICAgICAgfSBlbHNlIGlmIChjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgJiYgIXdp
ZHRoICYmIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKLSAgICAgICAgICAgIHVzZWRI
b3Jpem9udGFsTWFyZ2luID0geyAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LCAqY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCB9OwotICAgICAgICAgICAgd2lkdGggPSBjb250YWlu
aW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250
YWxNYXJnaW4uZW5kKTsKLSAgICAgICAgfSBlbHNlIGlmIChjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uc3RhcnQgJiYgd2lkdGggJiYgIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKLSAg
ICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gKmNvbXB1dGVkSG9yaXpvbnRh
bE1hcmdpbi5zdGFydDsKLSAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9IGNv
bnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVy
TGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQp
OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIzQKLSAgICAgICAgaWYgKCF3aWR0aCkgewotICAg
ICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4gPSB7IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdp
bi5zdGFydC52YWx1ZU9yKDApLCBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3Io
MCkgfTsKLSAgICAgICAgICAgIHdpZHRoID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAodXNlZEhv
cml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyBwYWRkaW5n
UmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7Ci0gICAgICAg
IH0KLQotICAgICAgICAvLyAjNQotICAgICAgICBpZiAoIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdp
bi5zdGFydCAmJiAhY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgewotICAgICAgICAgICAg
YXV0byBob3Jpem9udGFsU3BhY2VGb3JNYXJnaW4gPSBjb250YWluaW5nQmxvY2tXaWR0aCAtIChi
b3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVy
UmlnaHQpOwotICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4gPSB7IGhvcml6b250YWxT
cGFjZUZvck1hcmdpbiAvIDIsIGhvcml6b250YWxTcGFjZUZvck1hcmdpbiAvIDIgfTsKLSAgICAg
ICAgfQotCi0gICAgICAgIGF1dG8gc2hvdWxkQXBwbHlDZW50ZXJBbGlnbkZvckJsb2NrQ29udGVu
dCA9IGNvbnRhaW5pbmdCbG9ja1N0eWxlLnRleHRBbGlnbigpID09IFRleHRBbGlnbk1vZGU6Oldl
YktpdENlbnRlciAmJiAoY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0IHx8IGNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAgICAgICBpZiAoc2hvdWxkQXBwbHlDZW50ZXJBbGln
bkZvckJsb2NrQ29udGVudCkgewotICAgICAgICAgICAgYXV0byBib3JkZXJCb3hXaWR0aCA9IChi
b3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVy
UmlnaHQpOwotICAgICAgICAgICAgYXV0byBtYXJnaW5TdGFydCA9IGNvbXB1dGVkSG9yaXpvbnRh
bE1hcmdpbi5zdGFydC52YWx1ZU9yKDApOwotICAgICAgICAgICAgYXV0byBtYXJnaW5FbmQgPSBj
b21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMCk7Ci0gICAgICAgICAgICBhdXRv
IGNlbnRlcmVkTG9naWNhbExlZnRGb3JNYXJnaW5Cb3ggPSBzdGQ6Om1heCgoY29udGFpbmluZ0Js
b2NrV2lkdGggLSBib3JkZXJCb3hXaWR0aCAtIG1hcmdpblN0YXJ0IC0gbWFyZ2luRW5kKSAvIDIs
IDBfbHUpOwotICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSBjZW50ZXJl
ZExvZ2ljYWxMZWZ0Rm9yTWFyZ2luQm94ICsgbWFyZ2luU3RhcnQ7Ci0gICAgICAgICAgICB1c2Vk
SG9yaXpvbnRhbE1hcmdpbi5lbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtIGJvcmRlckJveFdp
ZHRoIC0gbWFyZ2luU3RhcnQgKyBtYXJnaW5FbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJU
KHdpZHRoKTsKLQotICAgICAgICByZXR1cm4gQ29udGVudFdpZHRoQW5kTWFyZ2luIHsgKndpZHRo
LCB1c2VkSG9yaXpvbnRhbE1hcmdpbiB9OwotICAgIH07Ci0KLSAgICBhdXRvIGNvbnRlbnRXaWR0
aEFuZE1hcmdpbiA9IGNvbXB1dGUoKTsKLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0Nv
bnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1dpZHRoXVtNYXJnaW5dIC0+IGluZmxvdyBub24tcmVw
bGFjZWQgLT4gd2lkdGgoIiA8PCBjb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoIDw8
ICJweCkgbWFyZ2luKCIgPDwgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uc3RhcnQg
PDwgInB4LCAiIDw8IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLmVuZCA8PCAicHgp
IC0+IGxheW91dEJveCgiIDw8ICZsYXlvdXRCb3ggPDwgIikiKTsKLSAgICByZXR1cm4gY29udGVu
dFdpZHRoQW5kTWFyZ2luOwotfQotCi1Db250ZW50V2lkdGhBbmRNYXJnaW4gQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd1JlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2lu
KGNvbnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFs
dWVzJiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKLXsKLSAgICBBU1NFUlQocmVwbGFjZWRC
b3guaXNJbkZsb3coKSk7Ci0KLSAgICAvLyAxMC4zLjQgQmxvY2stbGV2ZWwsIHJlcGxhY2VkIGVs
ZW1lbnRzIGluIG5vcm1hbCBmbG93Ci0gICAgLy8KLSAgICAvLyAxLiBUaGUgdXNlZCB2YWx1ZSBv
ZiAnd2lkdGgnIGlzIGRldGVybWluZWQgYXMgZm9yIGlubGluZSByZXBsYWNlZCBlbGVtZW50cy4K
LSAgICAvLyAyLiBUaGVuIHRoZSBydWxlcyBmb3Igbm9uLXJlcGxhY2VkIGJsb2NrLWxldmVsIGVs
ZW1lbnRzIGFyZSBhcHBsaWVkIHRvIGRldGVybWluZSB0aGUgbWFyZ2lucy4KLQotICAgIC8vICMx
Ci0gICAgYXV0byB1c2VkV2lkdGggPSBpbmxpbmVSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdp
bihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IH0sIG92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzKS5jb250ZW50V2lkdGg7Ci0gICAgLy8gIzIKLSAgICBhdXRvIG5vblJlcGxh
Y2VkV2lkdGhBbmRNYXJnaW4gPSBpbkZsb3dOb25SZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdp
bihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBPdmVycmlkZGVuSG9yaXpvbnRh
bFZhbHVlcyB7IHVzZWRXaWR0aCwgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMubWFyZ2luIH0p
OwotCi0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0g
PDwgIltXaWR0aF1bTWFyZ2luXSAtPiBpbmZsb3cgcmVwbGFjZWQgLT4gd2lkdGgoIiA8PCB1c2Vk
V2lkdGggIDw8ICJweCkgbWFyZ2luKCIgPDwgbm9uUmVwbGFjZWRXaWR0aEFuZE1hcmdpbi51c2Vk
TWFyZ2luLnN0YXJ0IDw8ICJweCwgIiA8PCBub25SZXBsYWNlZFdpZHRoQW5kTWFyZ2luLnVzZWRN
YXJnaW4uZW5kIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIpIik7
Ci0gICAgcmV0dXJuIHsgdXNlZFdpZHRoLCBub25SZXBsYWNlZFdpZHRoQW5kTWFyZ2luLnVzZWRN
YXJnaW4gfTsKLX0KLQotTGF5b3V0VW5pdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRy
eTo6c3RhdGljVmVydGljYWxQb3NpdGlvbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgVmVy
dGljYWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cykgY29uc3QKLXsKLSAgICAvLyBo
dHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjIvdmlzdXJlbi5odG1sI2Jsb2NrLWZvcm1hdHRpbmcK
LSAgICAvLyBJbiBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCwgYm94ZXMgYXJlIGxhaWQgb3V0
IG9uZSBhZnRlciB0aGUgb3RoZXIsIHZlcnRpY2FsbHksIGJlZ2lubmluZyBhdCB0aGUgdG9wIG9m
IGEgY29udGFpbmluZyBibG9jay4KLSAgICAvLyBUaGUgdmVydGljYWwgZGlzdGFuY2UgYmV0d2Vl
biB0d28gc2libGluZyBib3hlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSAnbWFyZ2luJyBwcm9wZXJ0
aWVzLgotICAgIC8vIFZlcnRpY2FsIG1hcmdpbnMgYmV0d2VlbiBhZGphY2VudCBibG9jay1sZXZl
bCBib3hlcyBpbiBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBjb2xsYXBzZS4KLSAgICBpZiAo
YXV0byogcHJldmlvdXNJbkZsb3dTaWJsaW5nID0gbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2li
bGluZygpKSB7Ci0gICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93Qm94R2VvbWV0cnkgPSBmb3Jt
YXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KCpwcmV2aW91c0luRmxvd1NpYmxpbmcpOwot
ICAgICAgICByZXR1cm4gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QocHJldmlvdXNJbkZsb3dC
b3hHZW9tZXRyeSkuYm90dG9tKCkgKyBwcmV2aW91c0luRmxvd0JveEdlb21ldHJ5Lm1hcmdpbkFm
dGVyKCk7Ci0gICAgfQotICAgIHJldHVybiB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7
Ci19Ci0KLUxheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OnN0YXRp
Y0hvcml6b250YWxQb3NpdGlvbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIGNvbnN0Ci17Ci0gICAgLy8gaHR0
cHM6Ly93d3cudzMub3JnL1RSL0NTUzIyL3Zpc3VyZW4uaHRtbCNibG9jay1mb3JtYXR0aW5nCi0g
ICAgLy8gSW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGVhY2ggYm94J3MgbGVmdCBvdXRl
ciBlZGdlIHRvdWNoZXMgdGhlIGxlZnQgZWRnZSBvZiB0aGUgY29udGFpbmluZyBibG9jayAoZm9y
IHJpZ2h0LXRvLWxlZnQgZm9ybWF0dGluZywgcmlnaHQgZWRnZXMgdG91Y2gpLgotICAgIHJldHVy
biBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbExlZnQgKyBmb3JtYXR0aW5nQ29udGV4dCgp
Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCkubWFyZ2luU3RhcnQoKTsKLX0KLQotUG9pbnQgQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OnN0YXRpY1Bvc2l0aW9uKGNvbnN0IEJveCYg
bGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJh
aW50cywgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cykgY29u
c3QKLXsKLSAgICByZXR1cm4geyBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24obGF5b3V0Qm94LCBo
b3Jpem9udGFsQ29uc3RyYWludHMpLCBzdGF0aWNWZXJ0aWNhbFBvc2l0aW9uKGxheW91dEJveCwg
dmVydGljYWxDb25zdHJhaW50cykgfTsKLX0KLQotQ29udGVudEhlaWdodEFuZE1hcmdpbiBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93Q29udGVudEhlaWdodEFuZE1hcmdp
bihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jp
em9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJp
ZGRlblZlcnRpY2FsVmFsdWVzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7
Ci0KLSAgICAvLyAxMC42LjIgSW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLCBibG9jay1sZXZlbCBy
ZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdywgJ2lubGluZS1ibG9jaycKLSAgICAvLyBy
ZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdyBhbmQgZmxvYXRpbmcgcmVwbGFjZWQgZWxl
bWVudHMKLSAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgcmV0dXJu
IGlubGluZVJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihkb3duY2FzdDxSZXBsYWNlZEJv
eD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IH0sIG92ZXJyaWRkZW5WZXJ0
aWNhbFZhbHVlcyk7Ci0KLSAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGNvbnRlbnRIZWlnaHRB
bmRNYXJnaW47Ci0gICAgaWYgKGxheW91dEJveC5pc092ZXJmbG93VmlzaWJsZSgpICYmICFsYXlv
dXRCb3guaXNEb2N1bWVudEJveCgpKSB7Ci0gICAgICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgdGhl
IGNhc2UgZm9yIHRoZSBkb2N1bWVudCBlbGVtZW50LiBMZXQncyBqdXN0IGNvbXBsaWNhdGVkLWNh
c2UgaXQgZm9yIG5vdy4KLSAgICAgICAgY29udGVudEhlaWdodEFuZE1hcmdpbiA9IGluRmxvd05v
blJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cywgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAg
ICAvLyAxMC42LjYgQ29tcGxpY2F0ZWQgY2FzZXMKLSAgICAgICAgLy8gQmxvY2stbGV2ZWwsIG5v
bi1yZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdyB3aGVuICdvdmVyZmxvdycgZG9lcyBu
b3QgY29tcHV0ZSB0byAndmlzaWJsZScgKGV4Y2VwdCBpZiB0aGUgJ292ZXJmbG93JyBwcm9wZXJ0
eSdzIHZhbHVlIGhhcyBiZWVuIHByb3BhZ2F0ZWQgdG8gdGhlIHZpZXdwb3J0KS4KLSAgICAgICAg
Y29udGVudEhlaWdodEFuZE1hcmdpbiA9IGNvbXBsaWNhdGVkQ2FzZXMobGF5b3V0Qm94LCBob3Jp
em9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci0gICAgfQotCi0g
ICAgYXV0byBxdWlya3MgPSBmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJrcygpOwotICAgIGlmICgh
cXVpcmtzLm5lZWRzU3RyZXRjaGluZyhsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gY29udGVu
dEhlaWdodEFuZE1hcmdpbjsKLQotICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhl
aWdodCA9IHF1aXJrcy5zdHJldGNoZWRJbkZsb3dIZWlnaHQobGF5b3V0Qm94LCBjb250ZW50SGVp
Z2h0QW5kTWFyZ2luKTsKLQotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExh
eW91dCwgc3RyZWFtIDw8ICJbSGVpZ2h0XVtNYXJnaW5dIC0+IGluZmxvdyBub24tcmVwbGFjZWQg
LT4gc3RyZWNoZWQgdG8gdmlld3BvcnQgLT4gaGVpZ2h0KCIgPDwgY29udGVudEhlaWdodEFuZE1h
cmdpbi5jb250ZW50SGVpZ2h0IDw8ICJweCkgbWFyZ2luKCIgPDwgY29udGVudEhlaWdodEFuZE1h
cmdpbi5ub25Db2xsYXBzZWRNYXJnaW4uYmVmb3JlIDw8ICJweCwgIiA8PCBjb250ZW50SGVpZ2h0
QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbi5hZnRlciA8PCAicHgpIC0+IGxheW91dEJveCgi
IDw8ICZsYXlvdXRCb3ggPDwgIikiKTsKLSAgICByZXR1cm4gY29udGVudEhlaWdodEFuZE1hcmdp
bjsKLX0KLQotQ29udGVudFdpZHRoQW5kTWFyZ2luIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5OjppbkZsb3dDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25z
dCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMp
Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpKTsKLQotICAgIGlmICghbGF5b3V0
Qm94LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgcmV0dXJuIGluRmxvd05vblJlcGxhY2VkQ29u
dGVudFdpZHRoQW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVy
cmlkZGVuSG9yaXpvbnRhbFZhbHVlcyk7Ci0gICAgcmV0dXJuIGluRmxvd1JlcGxhY2VkQ29udGVu
dFdpZHRoQW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jpem9u
dGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKTsKLX0KLQotQ29udGVu
dFdpZHRoQW5kTWFyZ2luIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRl
ZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIE9wdGlvbmFsPExheW91dFVu
aXQ+IGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyKQotewotICAgIGF1dG8gY29tcHV0ZSA9IFsm
XSAoYXV0byBjb25zdHJhaW50c0ZvcldpZHRoLCBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkV2lk
dGgpIHsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKQotICAg
ICAgICAgICAgcmV0dXJuIGZsb2F0aW5nQ29udGVudFdpZHRoQW5kTWFyZ2luKGxheW91dEJveCwg
Y29uc3RyYWludHNGb3JXaWR0aCwgeyB1c2VkV2lkdGgsIHsgfSB9KTsKLQotICAgICAgICBpZiAo
bGF5b3V0Qm94LmlzSW5GbG93KCkpCi0gICAgICAgICAgICByZXR1cm4gaW5GbG93Q29udGVudFdp
ZHRoQW5kTWFyZ2luKGxheW91dEJveCwgY29uc3RyYWludHNGb3JXaWR0aCwgeyB1c2VkV2lkdGgs
IHsgfSB9KTsKLQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJu
IENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7IH07Ci0gICAgfTsKLQotICAgIGF1dG8gaG9yaXpvbnRh
bENvbnN0cmFpbnRzRm9yV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHM7Ci0gICAgaWYgKGxh
eW91dEJveC5zdHlsZSgpLmxvZ2ljYWxXaWR0aCgpLmlzQXV0bygpICYmIGF2YWlsYWJsZVdpZHRo
RmxvYXRBdm9pZGVyKSB7Ci0gICAgICAgIC8vIFdoaWxlIHRoZSBub24tYXV0byB3aWR0aCB2YWx1
ZXMgc2hvdWxkIGFsbCBiZSByZXNvbHZlZCBhZ2FpbnN0IHRoZSBjb250YWluaW5nIGJsb2NrJ3Mg
d2lkdGgsIHdoZW4KLSAgICAgICAgLy8gdGhlIHdpZHRoIGlzIGF1dG8gdGhlIGF2YWlsYWJsZSBo
b3Jpem9udGFsIHNwYWNlIGlzIHNocnVuayBieSBuZWlnaGJvcmluZyBmbG9hdHMuCi0gICAgICAg
IGhvcml6b250YWxDb25zdHJhaW50c0ZvcldpZHRoLmxvZ2ljYWxXaWR0aCA9ICphdmFpbGFibGVX
aWR0aEZsb2F0QXZvaWRlcjsKLSAgICB9Ci0gICAgYXV0byBjb250ZW50V2lkdGhBbmRNYXJnaW4g
PSBjb21wdXRlKGhvcml6b250YWxDb25zdHJhaW50c0ZvcldpZHRoLCB7IH0pOwotICAgIGF1dG8g
YXZhaWxhYmxlV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoOwotICAg
IGlmIChhdXRvIG1heFdpZHRoID0gY29tcHV0ZWRNYXhXaWR0aChsYXlvdXRCb3gsIGF2YWlsYWJs
ZVdpZHRoKSkgewotICAgICAgICBhdXRvIG1heFdpZHRoQW5kTWFyZ2luID0gY29tcHV0ZShob3Jp
em9udGFsQ29uc3RyYWludHMsIG1heFdpZHRoKTsKLSAgICAgICAgaWYgKGNvbnRlbnRXaWR0aEFu
ZE1hcmdpbi5jb250ZW50V2lkdGggPiBtYXhXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCi0g
ICAgICAgICAgICBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBtYXhXaWR0aEFuZE1hcmdpbjsKLSAg
ICB9Ci0KLSAgICBhdXRvIG1pbldpZHRoID0gY29tcHV0ZWRNaW5XaWR0aChsYXlvdXRCb3gsIGF2
YWlsYWJsZVdpZHRoKS52YWx1ZU9yKDApOwotICAgIGF1dG8gbWluV2lkdGhBbmRNYXJnaW4gPSBj
b21wdXRlKGhvcml6b250YWxDb25zdHJhaW50cywgbWluV2lkdGgpOwotICAgIGlmIChjb250ZW50
V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoIDwgbWluV2lkdGhBbmRNYXJnaW4uY29udGVudFdp
ZHRoKQotICAgICAgICBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBtaW5XaWR0aEFuZE1hcmdpbjsK
LSAgICByZXR1cm4gY29udGVudFdpZHRoQW5kTWFyZ2luOwotfQotCi1Gb3JtYXR0aW5nQ29udGV4
dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeTo6aW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25zdCBCb3gmIGxheW91dEJveCkKLXsK
LSAgICBhdXRvIGZpeGVkTWFyZ2luQm9yZGVyQW5kUGFkZGluZyA9IFsmXShhdXRvJiBsYXlvdXRC
b3gpIHsKLSAgICAgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICAgICAg
cmV0dXJuIGZpeGVkVmFsdWUoc3R5bGUubWFyZ2luU3RhcnQoKSkudmFsdWVPcigwKQotICAgICAg
ICAgICAgKyBMYXlvdXRVbml0IHsgc3R5bGUuYm9yZGVyTGVmdFdpZHRoKCkgfQotICAgICAgICAg
ICAgKyBmaXhlZFZhbHVlKHN0eWxlLnBhZGRpbmdMZWZ0KCkpLnZhbHVlT3IoMCkKLSAgICAgICAg
ICAgICsgZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nUmlnaHQoKSkudmFsdWVPcigwKQotICAgICAg
ICAgICAgKyBMYXlvdXRVbml0IHsgc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCgpIH0KLSAgICAgICAg
ICAgICsgZml4ZWRWYWx1ZShzdHlsZS5tYXJnaW5FbmQoKSkudmFsdWVPcigwKTsKLSAgICB9Owot
Ci0gICAgYXV0byBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBbJl0oKSAtPiBJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsKLSAgICAgICAgYXV0byBsb2dpY2FsV2lkdGggPSBs
YXlvdXRCb3guc3R5bGUoKS5sb2dpY2FsV2lkdGgoKTsKLSAgICAgICAgLy8gTWluaW11bS9tYXhp
bXVtIHdpZHRoIGNhbid0IGJlIGRlcGVuZGluZyBvbiB0aGUgY29udGFpbmluZyBibG9jaydzIHdp
ZHRoLgotICAgICAgICBhdXRvIG5lZWRzUmVzb2x2ZWRDb250YWluaW5nQmxvY2tXaWR0aCA9IGxv
Z2ljYWxXaWR0aC5pc0NhbGN1bGF0ZWQoKSB8fCBsb2dpY2FsV2lkdGguaXNQZXJjZW50KCkgfHwg
bG9naWNhbFdpZHRoLmlzUmVsYXRpdmUoKTsKLSAgICAgICAgaWYgKG5lZWRzUmVzb2x2ZWRDb250
YWluaW5nQmxvY2tXaWR0aCkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0KLSAgICAgICAgaWYg
KGF1dG8gd2lkdGggPSBmaXhlZFZhbHVlKGxvZ2ljYWxXaWR0aCkpCi0gICAgICAgICAgICByZXR1
cm4geyAqd2lkdGgsICp3aWR0aCB9OwotCi0gICAgICAgIGlmIChsYXlvdXRCb3guaXNSZXBsYWNl
ZEJveCgpKSB7Ci0gICAgICAgICAgICBhdXRvJiByZXBsYWNlZEJveCA9IGRvd25jYXN0PFJlcGxh
Y2VkQm94PihsYXlvdXRCb3gpOwotICAgICAgICAgICAgaWYgKHJlcGxhY2VkQm94Lmhhc0ludHJp
bnNpY1dpZHRoKCkpIHsKLSAgICAgICAgICAgICAgICBhdXRvIHJlcGxhY2VkV2lkdGggPSByZXBs
YWNlZEJveC5pbnRyaW5zaWNXaWR0aCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB7IHJlcGxh
Y2VkV2lkdGgsIHJlcGxhY2VkV2lkdGggfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJl
dHVybiB7IH07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5
b3V0Qm94KSB8fCAhZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxvd09y
RmxvYXRpbmdDaGlsZCgpKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgICAgICBpZiAo
bGF5b3V0Qm94LmlzU2l6ZUNvbnRhaW5tZW50Qm94KCkpIHsKLSAgICAgICAgICAgIC8vIFRoZSBp
bnRyaW5zaWMgc2l6ZXMgb2YgdGhlIHNpemUgY29udGFpbm1lbnQgYm94IGFyZSBkZXRlcm1pbmVk
IGFzIGlmIHRoZSBlbGVtZW50IGhhZCBubyBjb250ZW50LAotICAgICAgICAgICAgLy8gZm9sbG93
aW5nIHRoZSBzYW1lIGxvZ2ljIGFzIHdoZW4gc2l6aW5nIGFzIGlmIGVtcHR5LgotICAgICAgICAg
ICAgcmV0dXJuIHsgfTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsYXlvdXRCb3guZXN0YWJs
aXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICBhdXRvIGludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChk
b3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCksIGxheW91dFN0YXRlKCkpLT5jb21wdXRl
ZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKLSAgICAgICAgICAgIGlmIChsb2dpY2FsV2lk
dGguaXNNaW5Db250ZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHsgaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cy5taW5pbXVtLCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0g
fTsKLSAgICAgICAgICAgIGlmIChsb2dpY2FsV2lkdGguaXNNYXhDb250ZW50KCkpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIHsgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtLCBpbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0gfTsKLSAgICAgICAgICAgIHJldHVybiBpbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzOwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07Ci0gICAg
ICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IGxheW91dFN0YXRlKCkuZm9ybWF0dGluZ1N0YXRl
Rm9yQm94KGxheW91dEJveCk7Ci0gICAgICAgIGZvciAoYXV0byYgY2hpbGQgOiBjaGlsZHJlbk9m
VHlwZTxCb3g+KGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkpIHsKLSAgICAgICAg
ICAgIGlmIChjaGlsZC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSB8fCAoY2hpbGQuaXNGbG9hdEF2
b2lkZXIoKSAmJiAhY2hpbGQuaGFzRmxvYXRDbGVhcigpKSkKLSAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgICAgIGF1dG8gY2hpbGRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0g
Zm9ybWF0dGluZ1N0YXRlLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goY2hpbGQpOwot
ICAgICAgICAgICAgQVNTRVJUKGNoaWxkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyk7Ci0KLSAg
ICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSA9IHN0ZDo6bWF4KGlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgY2hpbGRJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzLT5taW5pbXVtKTsKLSAgICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMu
bWF4aW11bSA9IHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSwgY2hp
bGRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLT5tYXhpbXVtKTsKLSAgICAgICAgfQotICAgICAg
ICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKLSAgICB9OwotICAgIC8vIEZJWE1F
IENoZWNrIGZvciBib3gtc2l6aW5nOiBib3JkZXItYm94OwotICAgIGF1dG8gaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cyA9IGNvbnN0cmFpbkJ5TWluTWF4V2lkdGgobGF5b3V0Qm94LCBjb21wdXRl
ZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSk7Ci0gICAgaW50cmluc2ljV2lkdGhDb25zdHJh
aW50cy5leHBhbmQoZml4ZWRNYXJnaW5Cb3JkZXJBbmRQYWRkaW5nKGxheW91dEJveCkpOwotICAg
IHJldHVybiBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOwotfQotCi19Ci19Ci0KLSNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zv
cm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zv
cm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKZGVsZXRlZCBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDcxYjA4ODQyMDNkYzg2YTY3MzZhYmM4ZWJkYWYyYTVlZjFkNTg2YWUu
LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtz
LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1
ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lm
IEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQmxvY2tGb3Jt
YXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJMYXlvdXRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRC
b3hHZW9tZXRyeS5oIgotI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgotI2luY2x1ZGUg
IkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKLSNpbmNsdWRlICJMYXlvdXRTdGF0ZS5o
IgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotc3RhdGljIGJv
b2wgaXNRdWlya0NvbnRhaW5lcihjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICByZXR1cm4g
bGF5b3V0Qm94LmlzQm9keUJveCgpIHx8IGxheW91dEJveC5pc0RvY3VtZW50Qm94KCkgfHwgbGF5
b3V0Qm94LmlzVGFibGVDZWxsKCk7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6
UXVpcmtzOjpuZWVkc1N0cmV0Y2hpbmcoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0g
ICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpKTsKLSAgICAvLyBJbiBxdWlya3MgbW9kZSwg
aW4tZmxvdyBib2R5IGFuZCBodG1sIHN0cmV0Y2ggdG8gdGhlIGluaXRpYWwgY29udGFpbmluZyBi
bG9jayAoaGVpZ2h0OiBhdXRvIG9ubHkpLgotICAgIGlmICghbGF5b3V0U3RhdGUoKS5pblF1aXJr
c01vZGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFsYXlvdXRCb3guaXNE
b2N1bWVudEJveCgpICYmICFsYXlvdXRCb3guaXNCb2R5Qm94KCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIHJldHVybiBsYXlvdXRCb3guc3R5bGUoKS5sb2dpY2FsSGVpZ2h0KCkuaXNB
dXRvKCk7Ci19Ci0KLUxheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpz
dHJldGNoZWRJbkZsb3dIZWlnaHQoY29uc3QgQm94JiBsYXlvdXRCb3gsIENvbnRlbnRIZWlnaHRB
bmRNYXJnaW4gY29udGVudEhlaWdodEFuZE1hcmdpbikKLXsKLSAgICBBU1NFUlQobmVlZHNTdHJl
dGNoaW5nKGxheW91dEJveCkpOwotICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+
Zm9ybWF0dGluZ0NvbnRleHQoKTsKLSAgICBhdXRvIG5vbkNvbGxhcHNlZFZlcnRpY2FsTWFyZ2lu
ID0gY29udGVudEhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW4uYmVmb3JlICsgY29u
dGVudEhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXI7Ci0KLSAgICBpZiAo
bGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSkgewotICAgICAgICAvLyBMZXQncyBzdHJldGNoIHRo
ZSBpbmZsb3cgZG9jdW1lbnQgYm94KDxodG1sPikgdG8gdGhlIGhlaWdodCBvZiB0aGUgaW5pdGlh
bCBjb250YWluaW5nIGJsb2NrICh2aWV3KS4KLSAgICAgICAgYXV0byBkb2N1bWVudEJveENvbnRl
bnRIZWlnaHQgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3guaW5p
dGlhbENvbnRhaW5pbmdCbG9jaygpLCBFc2NhcGVSZWFzb246OkRvY3VtZW50Qm94U3RyZXRjaGVz
VG9WaWV3cG9ydFF1aXJrKS5jb250ZW50Qm94SGVpZ2h0KCk7Ci0gICAgICAgIC8vIERvY3VtZW50
IGJveCdzIG93biB2ZXJ0aWNhbCBtYXJnaW4vYm9yZGVyL3BhZGRpbmcgdmFsdWVzIGFsd2F5cyBz
aHJpbmsgdGhlIGNvbnRlbnQgaGVpZ2h0LgotICAgICAgICBhdXRvJiBkb2N1bWVudEJveEdlb21l
dHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKLSAgICAg
ICAgZG9jdW1lbnRCb3hDb250ZW50SGVpZ2h0IC09IG5vbkNvbGxhcHNlZFZlcnRpY2FsTWFyZ2lu
ICsgZG9jdW1lbnRCb3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgZG9jdW1lbnRCb3hHZW9t
ZXRyeS52ZXJ0aWNhbFBhZGRpbmcoKS52YWx1ZU9yKDApOwotICAgICAgICByZXR1cm4gc3RkOjpt
YXgoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0LCAgZG9jdW1lbnRCb3hDb250
ZW50SGVpZ2h0KTsKLSAgICB9Ci0KLSAgICAvLyBIZXJlIGlzIHRoZSBxdWlya3kgcGFydCBmb3Ig
Ym9keSBib3ggd2hlbiBpdCBzdHJldGNoZXMgYWxsIHRoZSB3YXkgdG8gdGhlIElDQiBldmVuIHdo
ZW4gdGhlIGRvY3VtZW50IGJveCBkb2VzIG5vdCAoZS5nLiBvdXQtb2YtZmxvdyBwb3NpdGlvbmVk
KS4KLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQm9keUJveCgpKTsKLSAgICBhdXRvJiBpbml0aWFs
Q29udGFpbmluZ0Jsb2NrID0gbGF5b3V0Qm94LmluaXRpYWxDb250YWluaW5nQmxvY2soKTsKLSAg
ICBhdXRvJiBpbml0aWFsQ29udGFpbmluZ0Jsb2NrR2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4
dC5nZW9tZXRyeUZvckJveChpbml0aWFsQ29udGFpbmluZ0Jsb2NrLCBFc2NhcGVSZWFzb246OkJv
ZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspOwotICAgIC8vIFN0YXJ0IHRoZSBjb250ZW50IGhl
aWdodCB3aXRoIHRoZSBJQ0IuCi0gICAgYXV0byBib2R5Qm94Q29udGVudEhlaWdodCA9IGluaXRp
YWxDb250YWluaW5nQmxvY2tHZW9tZXRyeS5jb250ZW50Qm94SGVpZ2h0KCk7Ci0gICAgLy8gQm9k
eSBib3gncyBvd24gYm9yZGVyIGFuZCBwYWRkaW5nIHNocmluayB0aGUgY29udGVudCBoZWlnaHQu
Ci0gICAgYXV0byYgYm9keUJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlG
b3JCb3gobGF5b3V0Qm94KTsKLSAgICBib2R5Qm94Q29udGVudEhlaWdodCAtPSBib2R5Qm94R2Vv
bWV0cnkudmVydGljYWxCb3JkZXIoKSArIGJvZHlCb3hHZW9tZXRyeS52ZXJ0aWNhbFBhZGRpbmco
KS52YWx1ZU9yKDApOwotICAgIC8vIEJvZHkgYm94IG5ldmVyIGNvbGxhcHNlcyBpdHMgdmVydGlj
YWwgbWFyZ2lucyB3aXRoIHRoZSBkb2N1bWVudCBib3ggYnV0IGl0IG1pZ2h0IGNvbGxhcHNlIGl0
cyBtYXJnaW4gd2l0aCBpdHMgZGVzY2VuZGFudHMuCi0gICAgYXV0byBub25Db2xsYXBzZWRNYXJn
aW4gPSBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbjsKLSAgICBhdXRv
IGNvbGxhcHNlZE1hcmdpbiA9IGZvcm1hdHRpbmdDb250ZXh0Lm1hcmdpbkNvbGxhcHNlKCkuY29s
bGFwc2VkVmVydGljYWxWYWx1ZXMobGF5b3V0Qm94LCBub25Db2xsYXBzZWRNYXJnaW4pLmNvbGxh
cHNlZFZhbHVlczsKLSAgICBhdXRvIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IGNvbGxhcHNlZE1hcmdp
bi5iZWZvcmUudmFsdWVPcihub25Db2xsYXBzZWRNYXJnaW4uYmVmb3JlKTsKLSAgICB1c2VkVmVy
dGljYWxNYXJnaW4gKz0gY29sbGFwc2VkTWFyZ2luLmlzQ29sbGFwc2VkVGhyb3VnaCA/IG5vbkNv
bGxhcHNlZE1hcmdpbi5hZnRlciA6IGNvbGxhcHNlZE1hcmdpbi5hZnRlci52YWx1ZU9yKG5vbkNv
bGxhcHNlZE1hcmdpbi5hZnRlcik7Ci0gICAgYm9keUJveENvbnRlbnRIZWlnaHQgLT0gdXNlZFZl
cnRpY2FsTWFyZ2luOwotICAgIC8vIERvY3VtZW50IGJveCdzIHBhZGRpbmcgYW5kIGJvcmRlciBh
bHNvIHNocmluayB0aGUgYm9keSBib3gncyBjb250ZW50IGhlaWdodC4KLSAgICBhdXRvJiBkb2N1
bWVudEJveCA9IGxheW91dEJveC5wYXJlbnQoKTsKLSAgICBhdXRvJiBkb2N1bWVudEJveEdlb21l
dHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goZG9jdW1lbnRCb3gsIEVzY2Fw
ZVJlYXNvbjo6Qm9keVN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyayk7Ci0gICAgYm9keUJveENvbnRl
bnRIZWlnaHQgLT0gZG9jdW1lbnRCb3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgZG9jdW1l
bnRCb3hHZW9tZXRyeS52ZXJ0aWNhbFBhZGRpbmcoKS52YWx1ZU9yKDApOwotICAgIC8vIEhvd2V2
ZXIgdGhlIG5vbi1pbi1mbG93IGRvY3VtZW50IGJveCdzIHZlcnRpY2FsIG1hcmdpbnMgYXJlIGln
bm9yZWQuIFRoZXkgZG9uJ3QgYWZmZWN0IHRoZSBib2R5IGJveCdzIGNvbnRlbnQgaGVpZ2h0Lgot
ICAgIGlmIChkb2N1bWVudEJveC5pc0luRmxvdygpKSB7Ci0gICAgICAgIGF1dG8gZ2VvbWV0cnkg
PSB0aGlzLT5nZW9tZXRyeSgpOwotICAgICAgICBhdXRvIHByZWNvbXB1dGVEb2N1bWVudEJveFZl
cnRpY2FsTWFyZ2luID0gZ2VvbWV0cnkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihkb2N1bWVudEJv
eCwgZ2VvbWV0cnkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KGluaXRpYWxDb250YWluaW5n
QmxvY2ssIEVzY2FwZVJlYXNvbjo6Qm9keVN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaykuaG9yaXpv
bnRhbCk7Ci0gICAgICAgIGJvZHlCb3hDb250ZW50SGVpZ2h0IC09IHByZWNvbXB1dGVEb2N1bWVu
dEJveFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApICsgcHJlY29tcHV0ZURvY3VtZW50
Qm94VmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0
ZDo6bWF4KGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCwgIGJvZHlCb3hDb250
ZW50SGVpZ2h0KTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OnNo
b3VsZElnbm9yZUNvbGxhcHNlZFF1aXJrTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25z
dAotewotICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpICYmIGlzUXVpcmtD
b250YWluZXIobGF5b3V0Qm94KTsKLX0KLQotZW51bSBjbGFzcyBWZXJ0aWNhbE1hcmdpbiB7IEJl
Zm9yZSwgQWZ0ZXIgfTsKLXN0YXRpYyBpbmxpbmUgYm9vbCBoYXNRdWlya01hcmdpblRvQ29sbGFw
c2UoY29uc3QgQm94JiBsYXlvdXRCb3gsIFZlcnRpY2FsTWFyZ2luIHZlcnRpY2FsTWFyZ2luKQot
ewotICAgIGlmICghbGF5b3V0Qm94LmlzSW5GbG93KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIHJldHVybiAodmVydGlj
YWxNYXJnaW4gPT0gVmVydGljYWxNYXJnaW46OkJlZm9yZSAmJiBzdHlsZS5oYXNNYXJnaW5CZWZv
cmVRdWlyaygpKSB8fCAodmVydGljYWxNYXJnaW4gPT0gVmVydGljYWxNYXJnaW46OkFmdGVyICYm
IHN0eWxlLmhhc01hcmdpbkFmdGVyUXVpcmsoKSk7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5n
Q29udGV4dDo6UXVpcmtzOjpzaG91bGRDb2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhQYXJlbnRNYXJn
aW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGxheW91
dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkgJiYgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGxheW91
dEJveCwgVmVydGljYWxNYXJnaW46OkJlZm9yZSkgJiYgaXNRdWlya0NvbnRhaW5lcihsYXlvdXRC
b3guY29udGFpbmluZ0Jsb2NrKCkpOwotfQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
OlF1aXJrczo6c2hvdWxkQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhQYXJlbnRNYXJnaW5BZnRlcihj
b25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAgICByZXR1cm4gbGF5b3V0U3RhdGUoKS5p
blF1aXJrc01vZGUoKSAmJiBoYXNRdWlya01hcmdpblRvQ29sbGFwc2UobGF5b3V0Qm94LCBWZXJ0
aWNhbE1hcmdpbjo6QWZ0ZXIpICYmIGlzUXVpcmtDb250YWluZXIobGF5b3V0Qm94LmNvbnRhaW5p
bmdCbG9jaygpKTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuY3BwIGIvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdTdGF0ZS5j
cHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NGE1MGZmNjkxM2FkMTJhMDhkNTJl
MzkwMjc1OTEwNzdmMjMzNWIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1h
dHRpbmdTdGF0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
LSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0g
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgi
Ci0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgPHd0
Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoQmxvY2tGb3JtYXR0aW5nU3Rh
dGUpOwotCi1CbG9ja0Zvcm1hdHRpbmdTdGF0ZTo6QmxvY2tGb3JtYXR0aW5nU3RhdGUoUmVmPEZs
b2F0aW5nU3RhdGU+JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQot
ICAgIDogRm9ybWF0dGluZ1N0YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OkJsb2Nr
LCBsYXlvdXRTdGF0ZSkKLXsKLX0KLQotQmxvY2tGb3JtYXR0aW5nU3RhdGU6On5CbG9ja0Zvcm1h
dHRpbmdTdGF0ZSgpCi17Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIGIvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdTdGF0ZS5o
CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTZjZDYxOWRkMzE2ZjU5YjNmNDA5YmYz
NWQ3MDk2ZDlmYjdjOGIxLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0
aW5nU3RhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoK
LSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0j
cHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0j
aW5jbHVkZSAiRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgot
I2luY2x1ZGUgPHd0Zi9XZWFrSGFzaFNldC5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1l
c3BhY2UgTGF5b3V0IHsKLQotLy8gQmxvY2tGb3JtYXR0aW5nU3RhdGUgaG9sZHMgdGhlIHN0YXRl
IGZvciBhIHBhcnRpY3VsYXIgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHRyZWUuCi1jbGFzcyBC
bG9ja0Zvcm1hdHRpbmdTdGF0ZSA6IHB1YmxpYyBGb3JtYXR0aW5nU3RhdGUgewotICAgIFdURl9N
QUtFX0lTT19BTExPQ0FURUQoQmxvY2tGb3JtYXR0aW5nU3RhdGUpOwotcHVibGljOgotICAgIEJs
b2NrRm9ybWF0dGluZ1N0YXRlKFJlZjxGbG9hdGluZ1N0YXRlPiYmLCBMYXlvdXRTdGF0ZSYpOwot
ICAgIH5CbG9ja0Zvcm1hdHRpbmdTdGF0ZSgpOwotCi0gICAgdm9pZCBzZXRVc2VkVmVydGljYWxN
YXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IFVzZWRWZXJ0aWNhbE1hcmdpbiYgdXNl
ZFZlcnRpY2FsTWFyZ2luKSB7IG1fdXNlZFZlcnRpY2FsTWFyZ2lucy5zZXQoJmxheW91dEJveCwg
dXNlZFZlcnRpY2FsTWFyZ2luKTsgfQotICAgIFVzZWRWZXJ0aWNhbE1hcmdpbiB1c2VkVmVydGlj
YWxNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fdXNlZFZlcnRp
Y2FsTWFyZ2lucy5nZXQoJmxheW91dEJveCk7IH0KLSAgICBib29sIGhhc1VzZWRWZXJ0aWNhbE1h
cmdpbihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QgeyByZXR1cm4gbV91c2VkVmVydGljYWxN
YXJnaW5zLmNvbnRhaW5zKCZsYXlvdXRCb3gpOyB9Ci0KLSAgICB2b2lkIHNldEhhc0NsZWFyYW5j
ZShjb25zdCBCb3gmIGxheW91dEJveCkgeyBtX2NsZWFyYW5jZVNldC5hZGQobGF5b3V0Qm94KTsg
fQotICAgIHZvaWQgY2xlYXJIYXNDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIHsgbV9j
bGVhcmFuY2VTZXQucmVtb3ZlKGxheW91dEJveCk7IH0KLSAgICBib29sIGhhc0NsZWFyYW5jZShj
b25zdCBCb3gmIGxheW91dEJveCkgY29uc3QgeyByZXR1cm4gbV9jbGVhcmFuY2VTZXQuY29udGFp
bnMobGF5b3V0Qm94KTsgfQotCi1wcml2YXRlOgotICAgIEhhc2hNYXA8Y29uc3QgQm94KiwgVXNl
ZFZlcnRpY2FsTWFyZ2luPiBtX3VzZWRWZXJ0aWNhbE1hcmdpbnM7Ci0gICAgV2Vha0hhc2hTZXQ8
Y29uc3QgQm94PiBtX2NsZWFyYW5jZVNldDsKLX07Ci0KLX0KLX0KLQotU1BFQ0lBTElaRV9UWVBF
X1RSQUlUU19MQVlPVVRfRk9STUFUVElOR19TVEFURShCbG9ja0Zvcm1hdHRpbmdTdGF0ZSwgaXNC
bG9ja0Zvcm1hdHRpbmdTdGF0ZSgpKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrTWFyZ2luQ29sbGFwc2UuY3Bw
CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZkNWJiZTIyYTFhYjkyZTg1MWQ4NTBk
ZTBmNGE2YWQxODcxMGRiLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tNYXJnaW5D
b2xsYXBzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MDcgKzAsMCBAQAotLyoKLSAqIENvcHly
aWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0g
KgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0g
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
IElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICog
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0K
LSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Lmgi
Ci0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkJs
b2NrRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiRmxvYXRpbmdTdGF0ZS5oIgotI2luY2x1
ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2lu
Y2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgotI2luY2x1ZGUgIkxheW91dFVuaXQuaCIKLSNp
bmNsdWRlICJSZW5kZXJTdHlsZS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2Ug
TGF5b3V0IHsKLQotc3RhdGljIGJvb2wgaGFzQm9yZGVyKGNvbnN0IEJvcmRlclZhbHVlJiBib3Jk
ZXJWYWx1ZSkKLXsKLSAgICBpZiAoYm9yZGVyVmFsdWUuc3R5bGUoKSA9PSBCb3JkZXJTdHlsZTo6
Tm9uZSB8fCBib3JkZXJWYWx1ZS5zdHlsZSgpID09IEJvcmRlclN0eWxlOjpIaWRkZW4pCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gISFib3JkZXJWYWx1ZS53aWR0aCgpOwotfQot
Ci1zdGF0aWMgYm9vbCBoYXNQYWRkaW5nKGNvbnN0IExlbmd0aCYgcGFkZGluZ1ZhbHVlKQotewot
ICAgIC8vIEZJWE1FOiBDaGVjayBpZiBwZXJjZW50IHZhbHVlIG5lZWRzIHRvIGJlIHJlc29sdmVk
LgotICAgIHJldHVybiAhcGFkZGluZ1ZhbHVlLmlzWmVybygpOwotfQotCi1zdGF0aWMgYm9vbCBo
YXNCb3JkZXJCZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAgcmV0dXJuIGhhc0Jv
cmRlcihsYXlvdXRCb3guc3R5bGUoKS5ib3JkZXJCZWZvcmUoKSk7Ci19Ci0KLXN0YXRpYyBib29s
IGhhc0JvcmRlckFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAgIHJldHVybiBoYXNC
b3JkZXIobGF5b3V0Qm94LnN0eWxlKCkuYm9yZGVyQWZ0ZXIoKSk7Ci19Ci0KLXN0YXRpYyBib29s
IGhhc1BhZGRpbmdCZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAgcmV0dXJuIGhh
c1BhZGRpbmcobGF5b3V0Qm94LnN0eWxlKCkucGFkZGluZ0JlZm9yZSgpKTsKLX0KLQotc3RhdGlj
IGJvb2wgaGFzUGFkZGluZ0FmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAgIHJldHVy
biBoYXNQYWRkaW5nKGxheW91dEJveC5zdHlsZSgpLnBhZGRpbmdBZnRlcigpKTsKLX0KLQotc3Rh
dGljIGJvb2wgZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGNvbnN0IEJveCYgbGF5
b3V0Qm94KQotewotICAgIC8vIFdlYktpdCB0cmVhdHMgdGhlIGRvY3VtZW50IGVsZW1lbnQgcmVu
ZGVyZXIgYXMgYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdC4gSXQgcHJvYmFibHkgb25s
eSBpbXBhY3RzIG1hcmdpbiBjb2xsYXBzaW5nLCBzbyBsZXQncyBub3QgZG8KLSAgICAvLyBhIGxh
eW91dCB3aWRlIHF1aXJrIG9uIHRoaXMgZm9yIG5vdy4KLSAgICBpZiAobGF5b3V0Qm94LmlzRG9j
dW1lbnRCb3goKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGxheW91dEJveC5l
c3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6aGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYgbGF5
b3V0Qm94KSBjb25zdAotewotICAgIGlmICghbGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIC8vIEZJWE1FOiBwcmVjb21wdXRlZFZlcnRpY2FsUG9z
aXRpb25Gb3JGb3JtYXR0aW5nUm9vdCBsb2dpYyBlbmRzIHVwIGNhbGxpbmcgaW50byB0aGlzIGZ1
bmN0aW9uIHdoZW4gdGhlIGxheW91dEJveCAoZmlyc3QgaW5mbG93IGNoaWxkKSBoYXMKLSAgICAv
LyBub3QgYmVlbiBsYWlkIG91dC4KLSAgICByZXR1cm4gZm9ybWF0dGluZ0NvbnRleHQoKS5mb3Jt
YXR0aW5nU3RhdGUoKS5oYXNDbGVhcmFuY2UobGF5b3V0Qm94KTsKLX0KLQotYm9vbCBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0
aFBhcmVudE1hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIC8v
IDEuIFRoaXMgaXMgdGhlIGxhc3QgaW4tZmxvdyBjaGlsZCBhbmQgaXRzIG1hcmdpbnMgY29sbGFw
c2UgdGhyb3VnaCBhbmQgdGhlIG1hcmdpbiBhZnRlciBjb2xsYXBzZXMgd2l0aCBwYXJlbnQncyBt
YXJnaW4gYWZ0ZXIgb3IKLSAgICAvLyAyLiBUaGlzIGJveCdzIG1hcmdpbiBhZnRlciBjb2xsYXBz
ZXMgd2l0aCB0aGUgbmV4dCBzaWJsaW5nJ3MgbWFyZ2luIGJlZm9yZSBhbmQgdGhhdCBzaWJsaW5n
IGNvbGxhcHNlcyB0aHJvdWdoIGFuZAotICAgIC8vIHdlIGNhbiBnZXQgdG8gdGhlIGxhc3QgaW4t
ZmxvdyBjaGlsZCBsaWtlIHRoYXQuCi0gICAgYXV0byogbGFzdEluRmxvd0NoaWxkID0gbGF5b3V0
Qm94LmNvbnRhaW5pbmdCbG9jaygpLmxhc3RJbkZsb3dDaGlsZCgpOwotICAgIGZvciAoYXV0byog
Y3VycmVudEJveCA9ICZsYXlvdXRCb3g7IGN1cnJlbnRCb3g7IGN1cnJlbnRCb3ggPSBjdXJyZW50
Qm94LT5uZXh0SW5GbG93U2libGluZygpKSB7Ci0gICAgICAgIGlmICghbWFyZ2luc0NvbGxhcHNl
VGhyb3VnaCgqY3VycmVudEJveCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
IGlmIChjdXJyZW50Qm94ID09IGxhc3RJbkZsb3dDaGlsZCkKLSAgICAgICAgICAgIHJldHVybiBt
YXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcigqY3VycmVudEJveCk7IAot
ICAgICAgICBpZiAoIW1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aE5leHRTaWJsaW5nTWFyZ2luQmVm
b3JlKCpjdXJyZW50Qm94KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5CZWZvcmVDb2xsYXBzZXNX
aXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAg
IC8vIFRoZSBmaXJzdCBpbmZsb3cgY2hpbGQgY291bGQgcHJvcGFnYXRlIGl0cyB0b3AgbWFyZ2lu
IHRvIHBhcmVudC4KLSAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjEvYm94Lmh0bWwj
Y29sbGFwc2luZy1tYXJnaW5zCi0gICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3go
KSk7Ci0KLSAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRDb2xsYXBz
ZU1hcmdpbkJlZm9yZVdpdGhQYXJlbnRNYXJnaW5CZWZvcmUobGF5b3V0Qm94KSkKLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0KLSAgICAvLyBNYXJnaW5zIGJldHdlZW4gYSBmbG9hdGVkIGJveCBhbmQg
YW55IG90aGVyIGJveCBkbyBub3QgY29sbGFwc2UuCi0gICAgaWYgKGxheW91dEJveC5pc0Zsb2F0
aW5nUG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5z
IG9mIGFic29sdXRlbHkgcG9zaXRpb25lZCBib3hlcyBkbyBub3QgY29sbGFwc2UuCi0gICAgaWYg
KGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgLy8gTWFyZ2lucyBvZiBpbmxpbmUtYmxvY2sgYm94ZXMgZG8gbm90IGNvbGxhcHNl
LgotICAgIGlmIChsYXlvdXRCb3guaXNJbmxpbmVCbG9ja0JveCgpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICAvLyBPbmx5IHRoZSBmaXJzdCBpbmxmbG93IGNoaWxkIGNvbGxhcHNlcyB3
aXRoIHBhcmVudC4KLSAgICBpZiAobGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBhdXRvJiBjb250YWluaW5nQmxvY2sgPSBsYXlv
dXRCb3guY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgLy8gTWFyZ2lucyBvZiBlbGVtZW50cyB0aGF0
IGVzdGFibGlzaCBuZXcgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cyBkbyBub3QgY29sbGFwc2Ug
d2l0aCB0aGVpciBpbi1mbG93IGNoaWxkcmVuCi0gICAgaWYgKGVzdGFibGlzaGVzQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dChjb250YWluaW5nQmxvY2spKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBpZiAoaGFzQm9yZGVyQmVmb3JlKGNvbnRhaW5pbmdCbG9jaykpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIGlmIChoYXNQYWRkaW5nQmVmb3JlKGNvbnRhaW5pbmdCbG9jaykpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIC4uLmFuZCB0aGUgY2hpbGQgaGFzIG5vIGNs
ZWFyYW5jZS4KLSAgICBpZiAoaGFzQ2xlYXJhbmNlKGxheW91dEJveCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNT
aWJsaW5nTWFyZ2luQWZ0ZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNT
RVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7Ci0KLSAgICBpZiAoIWxheW91dEJveC5w
cmV2aW91c0luRmxvd1NpYmxpbmcoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXV0
byYgcHJldmlvdXNJbkZsb3dTaWJsaW5nID0gKmxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxp
bmcoKTsKLSAgICAvLyBNYXJnaW5zIGJldHdlZW4gYSBmbG9hdGVkIGJveCBhbmQgYW55IG90aGVy
IGJveCBkbyBub3QgY29sbGFwc2UuCi0gICAgaWYgKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRp
b25lZCgpIHx8IHByZXZpb3VzSW5GbG93U2libGluZy5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIG9mIGFic29sdXRlbHkgcG9z
aXRpb25lZCBib3hlcyBkbyBub3QgY29sbGFwc2UuCi0gICAgaWYgKChsYXlvdXRCb3guaXNPdXRP
ZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWxheW91dEJveC5zdHlsZSgpLnRvcCgpLmlzQXV0bygpKQot
ICAgICAgICB8fCAocHJldmlvdXNJbkZsb3dTaWJsaW5nLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgp
ICYmICFwcmV2aW91c0luRmxvd1NpYmxpbmcuc3R5bGUoKS5ib3R0b20oKS5pc0F1dG8oKSkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIE1hcmdpbnMgb2YgaW5saW5lLWJsb2NrIGJv
eGVzIGRvIG5vdCBjb2xsYXBzZS4KLSAgICBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxvY2tCb3go
KSB8fCBwcmV2aW91c0luRmxvd1NpYmxpbmcuaXNJbmxpbmVCbG9ja0JveCgpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBUaGUgYm90dG9tIG1hcmdpbiBvZiBhbiBpbi1mbG93IGJs
b2NrLWxldmVsIGVsZW1lbnQgYWx3YXlzIGNvbGxhcHNlcyB3aXRoIHRoZSB0b3AgbWFyZ2luIG9m
Ci0gICAgLy8gaXRzIG5leHQgaW4tZmxvdyBibG9jay1sZXZlbCBzaWJsaW5nLCB1bmxlc3MgdGhh
dCBzaWJsaW5nIGhhcyBjbGVhcmFuY2UuCi0gICAgaWYgKGhhc0NsZWFyYW5jZShsYXlvdXRCb3gp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFw
c2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gp
IGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7Ci0gICAg
Ly8gTWFyZ2lucyBvZiBlbGVtZW50cyB0aGF0IGVzdGFibGlzaCBuZXcgYmxvY2sgZm9ybWF0dGlu
ZyBjb250ZXh0cyBkbyBub3QgY29sbGFwc2Ugd2l0aCB0aGVpciBpbi1mbG93IGNoaWxkcmVuLgot
ICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQobGF5b3V0Qm94KSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gVGhlIHRvcCBtYXJnaW4gb2YgYW4gaW4tZmxv
dyBibG9jayBlbGVtZW50IGNvbGxhcHNlcyB3aXRoIGl0cyBmaXJzdCBpbi1mbG93IGJsb2NrLWxl
dmVsCi0gICAgLy8gY2hpbGQncyB0b3AgbWFyZ2luIGlmIHRoZSBlbGVtZW50IGhhcyBubyB0b3Ag
Ym9yZGVyLi4uCi0gICAgaWYgKGhhc0JvcmRlckJlZm9yZShsYXlvdXRCb3gpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyAuLi5ubyB0b3AgcGFkZGluZwotICAgIGlmIChoYXNQYWRk
aW5nQmVmb3JlKGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICgh
aXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxDb250YWluZXJCb3g+KGxh
eW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
YXV0byYgZmlyc3RJbkZsb3dDaGlsZCA9ICpkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJv
eCkuZmlyc3RJbkZsb3dDaGlsZCgpOwotICAgIGlmICghZmlyc3RJbkZsb3dDaGlsZC5pc0Jsb2Nr
TGV2ZWxCb3goKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gLi4uYW5kIHRoZSBj
aGlsZCBoYXMgbm8gY2xlYXJhbmNlLgotICAgIGlmIChoYXNDbGVhcmFuY2UoZmlyc3RJbkZsb3dD
aGlsZCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIE1hcmdpbnMgb2YgaW5saW5l
LWJsb2NrIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KLSAgICBpZiAoZmlyc3RJbkZsb3dDaGlsZC5p
c0lubGluZUJsb2NrQm94KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0
cnVlOwotfQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjpt
YXJnaW5BZnRlckNvbGxhcHNlc1dpdGhTaWJsaW5nTWFyZ2luQmVmb3JlV2l0aENsZWFyYW5jZShj
b25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAgICAvLyBJZiB0aGUgdG9wIGFuZCBib3R0
b20gbWFyZ2lucyBvZiBhbiBlbGVtZW50IHdpdGggY2xlYXJhbmNlIGFyZSBhZGpvaW5pbmcsIGl0
cyBtYXJnaW5zIGNvbGxhcHNlIHdpdGggdGhlIGFkam9pbmluZyBtYXJnaW5zCi0gICAgLy8gb2Yg
Zm9sbG93aW5nIHNpYmxpbmdzIGJ1dCB0aGF0IHJlc3VsdGluZyBtYXJnaW4gZG9lcyBub3QgY29s
bGFwc2Ugd2l0aCB0aGUgYm90dG9tIG1hcmdpbiBvZiB0aGUgcGFyZW50IGJsb2NrLgotICAgIGlm
ICghbWFyZ2luc0NvbGxhcHNlVGhyb3VnaChsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBmb3IgKGF1dG8qIHByZXZpb3VzU2libGluZyA9IGxheW91dEJveC5wcmV2aW91
c0luRmxvd1NpYmxpbmcoKTsgcHJldmlvdXNTaWJsaW5nOyBwcmV2aW91c1NpYmxpbmcgPSBwcmV2
aW91c1NpYmxpbmctPnByZXZpb3VzSW5GbG93U2libGluZygpKSB7Ci0gICAgICAgIGlmICghbWFy
Z2luc0NvbGxhcHNlVGhyb3VnaCgqcHJldmlvdXNTaWJsaW5nKSkKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgaWYgKGhhc0NsZWFyYW5jZSgqcHJldmlvdXNTaWJsaW5nKSkKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJv
b2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkFmdGVyQ29s
bGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QK
LXsKLSAgICAvLyAxLiBUaGlzIGlzIHRoZSBmaXJzdCBpbi1mbG93IGNoaWxkIGFuZCBpdHMgbWFy
Z2lucyBjb2xsYXBzZSB0aHJvdWdoIGFuZCB0aGUgbWFyZ2luIGJlZm9yZSBjb2xsYXBzZXMgd2l0
aCBwYXJlbnQncyBtYXJnaW4gYmVmb3JlIG9yCi0gICAgLy8gMi4gVGhpcyBib3gncyBtYXJnaW4g
YmVmb3JlIGNvbGxhcHNlcyB3aXRoIHRoZSBwcmV2aW91cyBzaWJsaW5nJ3MgbWFyZ2luIGFmdGVy
IGFuZCB0aGF0IHNpYmxpbmcgY29sbGFwc2VzIHRocm91Z2ggYW5kCi0gICAgLy8gd2UgY2FuIGdl
dCB0byB0aGUgZmlyc3QgaW4tZmxvdyBjaGlsZCBsaWtlIHRoYXQuCi0gICAgYXV0byogZmlyc3RJ
bkZsb3dDaGlsZCA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5maXJzdEluRmxvd0NoaWxk
KCk7Ci0gICAgZm9yIChhdXRvKiBjdXJyZW50Qm94ID0gJmxheW91dEJveDsgY3VycmVudEJveDsg
Y3VycmVudEJveCA9IGN1cnJlbnRCb3gtPnByZXZpb3VzSW5GbG93U2libGluZygpKSB7Ci0gICAg
ICAgIGlmICghbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCgqY3VycmVudEJveCkpCi0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChjdXJyZW50Qm94ID09IGZpcnN0SW5GbG93Q2hp
bGQpCi0gICAgICAgICAgICByZXR1cm4gbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1h
cmdpbkJlZm9yZSgqY3VycmVudEJveCk7IAotICAgICAgICBpZiAoIW1hcmdpbkJlZm9yZUNvbGxh
cHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVudEJveCkpCi0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5D
b2xsYXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3Qg
Qm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2
ZWxCb3goKSk7Ci0KLSAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRD
b2xsYXBzZU1hcmdpbkFmdGVyV2l0aFBhcmVudE1hcmdpbkFmdGVyKGxheW91dEJveCkpCi0gICAg
ICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gTWFyZ2lucyBiZXR3ZWVuIGEgZmxvYXRlZCBib3gg
YW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxhcHNlLgotICAgIGlmIChsYXlvdXRCb3guaXNG
bG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gTWFy
Z2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgotICAg
IGlmIChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIC8vIE1hcmdpbnMgb2YgaW5saW5lLWJsb2NrIGJveGVzIGRvIG5vdCBjb2xs
YXBzZS4KLSAgICBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxvY2tCb3goKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgLy8gT25seSB0aGUgbGFzdCBpbmxmbG93IGNoaWxkIGNvbGxhcHNl
cyB3aXRoIHBhcmVudC4KLSAgICBpZiAobGF5b3V0Qm94Lm5leHRJbkZsb3dTaWJsaW5nKCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxheW91
dEJveC5jb250YWluaW5nQmxvY2soKTsKLSAgICAvLyBNYXJnaW5zIG9mIGVsZW1lbnRzIHRoYXQg
ZXN0YWJsaXNoIG5ldyBibG9jayBmb3JtYXR0aW5nIGNvbnRleHRzIGRvIG5vdCBjb2xsYXBzZSB3
aXRoIHRoZWlyIGluLWZsb3cgY2hpbGRyZW4uCi0gICAgaWYgKGVzdGFibGlzaGVzQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dChjb250YWluaW5nQmxvY2spKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAvLyBUaGUgYm90dG9tIG1hcmdpbiBvZiBhbiBpbi1mbG93IGJsb2NrIGJveCB3aXRoIGEg
J2hlaWdodCcgb2YgJ2F1dG8nIGNvbGxhcHNlcyB3aXRoIGl0cyBsYXN0IGluLWZsb3cgYmxvY2st
bGV2ZWwgY2hpbGQncyBib3R0b20gbWFyZ2luLCBpZjoKLSAgICBpZiAoIWNvbnRhaW5pbmdCbG9j
ay5zdHlsZSgpLmhlaWdodCgpLmlzQXV0bygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICAvLyB0aGUgYm94IGhhcyBubyBib3R0b20gcGFkZGluZywgYW5kCi0gICAgaWYgKGhhc1BhZGRp
bmdBZnRlcihjb250YWluaW5nQmxvY2spKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAv
LyB0aGUgYm94IGhhcyBubyBib3R0b20gYm9yZGVyLCBhbmQKLSAgICBpZiAoaGFzQm9yZGVyQWZ0
ZXIoY29udGFpbmluZ0Jsb2NrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gdGhl
IGNoaWxkJ3MgYm90dG9tIG1hcmdpbiBuZWl0aGVyIGNvbGxhcHNlcyB3aXRoIGEgdG9wIG1hcmdp
biB0aGF0IGhhcyBjbGVhcmFuY2UuLi4KLSAgICBpZiAobWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRo
U2libGluZ01hcmdpbkJlZm9yZVdpdGhDbGVhcmFuY2UobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgLy8gbm9yIChpZiB0aGUgYm94J3MgbWluLWhlaWdodCBpcyBub24t
emVybykgd2l0aCB0aGUgYm94J3MgdG9wIG1hcmdpbi4KLSAgICBhdXRvIGNvbXB1dGVkTWluSGVp
Z2h0ID0gY29udGFpbmluZ0Jsb2NrLnN0eWxlKCkubG9naWNhbE1pbkhlaWdodCgpOwotICAgIGlm
ICghY29tcHV0ZWRNaW5IZWlnaHQuaXNBdXRvKCkgJiYgY29tcHV0ZWRNaW5IZWlnaHQudmFsdWUo
KSAmJiBtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUobGF5b3V0Qm94
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wg
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkFmdGVyQ29sbGFw
c2VzV2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBj
b25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwotCi0gICAg
Ly8gTWFyZ2lucyBvZiBlbGVtZW50cyB0aGF0IGVzdGFibGlzaCBuZXcgYmxvY2sgZm9ybWF0dGlu
ZyBjb250ZXh0cyBkbyBub3QgY29sbGFwc2Ugd2l0aCB0aGVpciBpbi1mbG93IGNoaWxkcmVuLgot
ICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQobGF5b3V0Qm94KSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJv
eCkgfHwgIWRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dDaGlsZCgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBhdXRvJiBsYXN0SW5GbG93Q2hpbGQgPSAq
ZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmxhc3RJbkZsb3dDaGlsZCgpOwotICAg
IGlmICghbGFzdEluRmxvd0NoaWxkLmlzQmxvY2tMZXZlbEJveCgpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICAvLyBUaGUgYm90dG9tIG1hcmdpbiBvZiBhbiBpbi1mbG93IGJsb2NrIGJv
eCB3aXRoIGEgJ2hlaWdodCcgb2YgJ2F1dG8nIGNvbGxhcHNlcyB3aXRoIGl0cyBsYXN0IGluLWZs
b3cgYmxvY2stbGV2ZWwgY2hpbGQncyBib3R0b20gbWFyZ2luLCBpZjoKLSAgICBpZiAoIWxheW91
dEJveC5zdHlsZSgpLmhlaWdodCgpLmlzQXV0bygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAvLyB0aGUgYm94IGhhcyBubyBib3R0b20gcGFkZGluZywgYW5kCi0gICAgaWYgKGhhc1Bh
ZGRpbmdBZnRlcihsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyB0
aGUgYm94IGhhcyBubyBib3R0b20gYm9yZGVyLCBhbmQKLSAgICBpZiAoaGFzQm9yZGVyQWZ0ZXIo
bGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gdGhlIGNoaWxkJ3Mg
Ym90dG9tIG1hcmdpbiBuZWl0aGVyIGNvbGxhcHNlcyB3aXRoIGEgdG9wIG1hcmdpbiB0aGF0IGhh
cyBjbGVhcmFuY2UuLi4KLSAgICBpZiAobWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoU2libGluZ01h
cmdpbkJlZm9yZVdpdGhDbGVhcmFuY2UobGFzdEluRmxvd0NoaWxkKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgLy8gbm9yIChpZiB0aGUgYm94J3MgbWluLWhlaWdodCBpcyBub24temVy
bykgd2l0aCB0aGUgYm94J3MgdG9wIG1hcmdpbi4KLSAgICBhdXRvIGNvbXB1dGVkTWluSGVpZ2h0
ID0gbGF5b3V0Qm94LnN0eWxlKCkubG9naWNhbE1pbkhlaWdodCgpOwotICAgIGlmICghY29tcHV0
ZWRNaW5IZWlnaHQuaXNBdXRvKCkgJiYgY29tcHV0ZWRNaW5IZWlnaHQudmFsdWUoKQotICAgICAg
ICAmJiAobWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxhc3RJbkZs
b3dDaGlsZCkgfHwgaGFzQ2xlYXJhbmNlKGxhc3RJbkZsb3dDaGlsZCkpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3Qg
Y29sbGFwc2UuCi0gICAgaWYgKGxhc3RJbkZsb3dDaGlsZC5pc0lubGluZUJsb2NrQm94KCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIFRoaXMgaXMgYSBxdWlyayBiZWhhdmlvcjog
V2hlbiB0aGUgbWFyZ2luIGFmdGVyIG9mIHRoZSBsYXN0IGluZmxvdyBjaGlsZCAob3IgYSBwcmV2
aW91cyBzaWJsaW5nIHdpdGggY29sbGFwc2VkIHRocm91Z2ggbWFyZ2lucykKLSAgICAvLyBjb2xs
YXBzZXMgd2l0aCBhIHF1aXJrIHBhcmVudCdzIHRoZSBtYXJnaW4gYmVmb3JlLCB0aGVuIHRoZSBz
YW1lIG1hcmdpbiBhZnRlciBkb2VzIG5vdCBjb2xsYXBzZXMgd2l0aCB0aGUgcGFyZW50J3MgbWFy
Z2luIGFmdGVyLgotICAgIGlmIChmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJrcygpLnNob3VsZEln
bm9yZUNvbGxhcHNlZFF1aXJrTWFyZ2luKGxheW91dEJveCkgJiYgbWFyZ2luQWZ0ZXJDb2xsYXBz
ZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxhc3RJbkZsb3dDaGlsZCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhOZXh0U2libGlu
Z01hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAgICBBU1NFUlQo
bGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLQotICAgIGlmICghbGF5b3V0Qm94Lm5leHRJ
bkZsb3dTaWJsaW5nKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiBtYXJn
aW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5nTWFyZ2luQWZ0ZXIoKmxheW91dEJv
eC5uZXh0SW5GbG93U2libGluZygpKTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luc0NvbGxhcHNlVGhyb3VnaChjb25zdCBCb3gmIGxheW91
dEJveCkgY29uc3QKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsK
LQotICAgIC8vIEEgYm94J3Mgb3duIG1hcmdpbnMgY29sbGFwc2UgaWYgdGhlICdtaW4taGVpZ2h0
JyBwcm9wZXJ0eSBpcyB6ZXJvLCBhbmQgaXQgaGFzIG5laXRoZXIgdG9wIG9yIGJvdHRvbSBib3Jk
ZXJzIG5vciB0b3Agb3IgYm90dG9tIHBhZGRpbmcsCi0gICAgLy8gYW5kIGl0IGhhcyBhICdoZWln
aHQnIG9mIGVpdGhlciAwIG9yICdhdXRvJywgYW5kIGl0IGRvZXMgbm90IGNvbnRhaW4gYSBsaW5l
IGJveCwgYW5kIGFsbCBvZiBpdHMgaW4tZmxvdyBjaGlsZHJlbidzIG1hcmdpbnMgKGlmIGFueSkg
Y29sbGFwc2UuCi0gICAgaWYgKGhhc0JvcmRlckJlZm9yZShsYXlvdXRCb3gpIHx8IGhhc0JvcmRl
ckFmdGVyKGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChoYXNQ
YWRkaW5nQmVmb3JlKGxheW91dEJveCkgfHwgaGFzUGFkZGluZ0FmdGVyKGxheW91dEJveCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIE1hcmdpbnMgYXJlIG5vdCBhZGpvaW5pbmcg
d2hlbiB0aGUgYm94IGhhcyBjbGVhcmFuY2UuCi0gICAgaWYgKGhhc0NsZWFyYW5jZShsYXlvdXRC
b3gpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJv
eC5zdHlsZSgpOwotICAgIGF1dG8gY29tcHV0ZWRIZWlnaHRWYWx1ZUlzWmVybyA9IHN0eWxlLmhl
aWdodCgpLmlzRml4ZWQoKSAmJiAhc3R5bGUuaGVpZ2h0KCkudmFsdWUoKTsKLSAgICBpZiAoIShz
dHlsZS5oZWlnaHQoKS5pc0F1dG8oKSB8fCBjb21wdXRlZEhlaWdodFZhbHVlSXNaZXJvKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gRklYTUU6IENoZWNrIGZvciBjb21wdXRlZCAw
IGhlaWdodC4KLSAgICBpZiAoIXN0eWxlLm1pbkhlaWdodCgpLmlzQXV0bygpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBGSVhNRTogQmxvY2sgcmVwbGFjZWQgYm94ZXMgY2xlYXJs
eSBkb24ndCBjb2xsYXBzZSB0aHJvdWdoIHRoZWlyIG1hcmdpbnMsIGJ1dCBJIGNvdWxkbid0IGZp
bmQgaXQgaW4gdGhlIHNwZWMgeWV0IChhbmQgbm8sIGl0J3Mgbm90IGEgcXVpcmspLgotICAgIGlm
IChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0KLSAgICBpZiAoIWRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dD
aGlsZCgpKQotICAgICAgICByZXR1cm4gIWVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4
dChsYXlvdXRCb3gpOwotCi0gICAgaWYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdD
b250ZXh0KCkpIHsKLSAgICAgICAgaWYgKGxheW91dEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1h
dHRpbmdDb250ZXh0KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGxheW91dFN0YXRlID0gdGhpcy0+
bGF5b3V0U3RhdGUoKTsKLSAgICAgICAgICAgIC8vIElmIHdlIGdldCBoZXJlIHRocm91Z2ggbWFy
Z2luIGVzdGltYXRpb24sIHdlIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYW4gYWN0dWFsIHN0YXRl
IGZvciB0aGlzIGxheW91dCBib3ggc2luY2UKLSAgICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgc3Rh
cnRlZCBsYXlpbmcgaXQgb3V0IHlldC4KLSAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5lckJveCA9
IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKLSAgICAgICAgICAgIGlmICghbGF5
b3V0U3RhdGUuaGFzSW5saW5lRm9ybWF0dGluZ1N0YXRlKGNvbnRhaW5lckJveCkpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBhdXRvIGlzQ29uc2lkZXJlZEVt
cHR5ID0gWyZdIHsKLSAgICAgICAgICAgICAgICBhdXRvJiBpbmxpbmVGb3JtYXR0aW5nU3RhdGUg
PSBsYXlvdXRTdGF0ZS5lc3RhYmxpc2hlZElubGluZUZvcm1hdHRpbmdTdGF0ZShjb250YWluZXJC
b3gpOwotICAgICAgICAgICAgICAgIGlmICghaW5saW5lRm9ybWF0dGluZ1N0YXRlLmxpbmVzKCku
aXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAg
ICAgICAgLy8gQW55IGZsb2F0IGJveCBpbiB0aGlzIGZvcm1hdHRpbmcgY29udGV4dCBwcmV2ZW50
cyBjb2xsYXBzaW5nIHRocm91Z2guCi0gICAgICAgICAgICAgICAgYXV0byYgZmxvYXRzID0gaW5s
aW5lRm9ybWF0dGluZ1N0YXRlLmZsb2F0aW5nU3RhdGUoKS5mbG9hdHMoKTsKLSAgICAgICAgICAg
ICAgICBmb3IgKGF1dG8mIGZsb2F0SXRlbSA6IGZsb2F0cykgewotICAgICAgICAgICAgICAgICAg
ICBpZiAoZmxvYXRJdGVtLmlzSW5Gb3JtYXR0aW5nQ29udGV4dE9mKGNvbnRhaW5lckJveCkpCi0g
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfTsKLSAgICAgICAgICAg
IHJldHVybiBpc0NvbnNpZGVyZWRFbXB0eSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQSBy
b290IG9mIGEgbm9uLWlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgKHRhYmxlLCBmbGV4IGV0Yykg
d2l0aCBpbmZsb3cgZGVzY2VuZGFudHMgc2hvdWxkIG5vdCBjb2xsYXBzZSB0aHJvdWdoLgotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZm9yIChhdXRvKiBpbmZsb3dDaGlsZCA9
IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5maXJzdEluRmxvd09yRmxvYXRpbmdD
aGlsZCgpOyBpbmZsb3dDaGlsZDsgaW5mbG93Q2hpbGQgPSBpbmZsb3dDaGlsZC0+bmV4dEluRmxv
d09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKGVzdGFibGlzaGVzQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dCgqaW5mbG93Q2hpbGQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKmluZmxvd0NoaWxkKSkKLSAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLVVzZWRW
ZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6Y29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZl
TWFyZ2luKFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVl
cyBhLCBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMg
YikgY29uc3QKLXsKLSAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQ
YWlyOjpWYWx1ZXMgY29tcHV0ZWRWYWx1ZXM7Ci0gICAgaWYgKGEucG9zaXRpdmUgJiYgYi5wb3Np
dGl2ZSkKLSAgICAgICAgY29tcHV0ZWRWYWx1ZXMucG9zaXRpdmUgPSBzdGQ6Om1heCgqYS5wb3Np
dGl2ZSwgKmIucG9zaXRpdmUpOwotICAgIGVsc2UKLSAgICAgICAgY29tcHV0ZWRWYWx1ZXMucG9z
aXRpdmUgPSBhLnBvc2l0aXZlID8gYS5wb3NpdGl2ZSA6IGIucG9zaXRpdmU7Ci0KLSAgICBpZiAo
YS5uZWdhdGl2ZSAmJiBiLm5lZ2F0aXZlKQotICAgICAgICBjb21wdXRlZFZhbHVlcy5uZWdhdGl2
ZSA9IHN0ZDo6bWluKCphLm5lZ2F0aXZlLCAqYi5uZWdhdGl2ZSk7Ci0gICAgZWxzZQotICAgICAg
ICBjb21wdXRlZFZhbHVlcy5uZWdhdGl2ZSA9IGEubmVnYXRpdmUgPyBhLm5lZ2F0aXZlIDogYi5u
ZWdhdGl2ZTsKLQotICAgIGlmIChhLmlzTm9uWmVybygpICYmIGIuaXNOb25aZXJvKCkpCi0gICAg
ICAgIGNvbXB1dGVkVmFsdWVzLmlzUXVpcmsgPSBhLmlzUXVpcmsgfHwgYi5pc1F1aXJrOwotICAg
IGVsc2UgaWYgKGEuaXNOb25aZXJvKCkpCi0gICAgICAgIGNvbXB1dGVkVmFsdWVzLmlzUXVpcmsg
PSBhLmlzUXVpcms7Ci0gICAgZWxzZQotICAgICAgICBjb21wdXRlZFZhbHVlcy5pc1F1aXJrID0g
Yi5pc1F1aXJrOwotCi0gICAgcmV0dXJuIGNvbXB1dGVkVmFsdWVzOwotfQotCi1PcHRpb25hbDxM
YXlvdXRVbml0PiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2lu
VmFsdWUoVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVz
IG1hcmdpblZhbHVlcykgY29uc3QKLXsKLSAgICAvLyBXaGVuIHR3byBvciBtb3JlIG1hcmdpbnMg
Y29sbGFwc2UsIHRoZSByZXN1bHRpbmcgbWFyZ2luIHdpZHRoIGlzIHRoZSBtYXhpbXVtIG9mIHRo
ZSBjb2xsYXBzaW5nIG1hcmdpbnMnIHdpZHRocy4KLSAgICAvLyBJbiB0aGUgY2FzZSBvZiBuZWdh
dGl2ZSBtYXJnaW5zLCB0aGUgbWF4aW11bSBvZiB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHRoZSBu
ZWdhdGl2ZSBhZGpvaW5pbmcgbWFyZ2lucyBpcyBkZWR1Y3RlZCBmcm9tIHRoZSBtYXhpbXVtCi0g
ICAgLy8gb2YgdGhlIHBvc2l0aXZlIGFkam9pbmluZyBtYXJnaW5zLiBJZiB0aGVyZSBhcmUgbm8g
cG9zaXRpdmUgbWFyZ2lucywgdGhlIG1heGltdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0
aGUgYWRqb2luaW5nIG1hcmdpbnMgaXMgZGVkdWN0ZWQgZnJvbSB6ZXJvLgotICAgIGlmICghbWFy
Z2luVmFsdWVzLm5lZ2F0aXZlKQotICAgICAgICByZXR1cm4gbWFyZ2luVmFsdWVzLnBvc2l0aXZl
OwotCi0gICAgaWYgKCFtYXJnaW5WYWx1ZXMucG9zaXRpdmUpCi0gICAgICAgIHJldHVybiBtYXJn
aW5WYWx1ZXMubmVnYXRpdmU7Ci0KLSAgICByZXR1cm4gKm1hcmdpblZhbHVlcy5wb3NpdGl2ZSAr
ICptYXJnaW5WYWx1ZXMubmVnYXRpdmU7Ci19Ci0KLXZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6TWFyZ2luQ29sbGFwc2U6OnVwZGF0ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nKEJs
b2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2NrRm9ybWF0dGluZ0NvbnRleHQsIGNvbnN0IE1hcmdp
bkNvbGxhcHNlJiBtYXJnaW5Db2xsYXBzZSwgY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAg
Ly8gMS4gR2V0IHRoZSBtYXJnaW4gYmVmb3JlIHZhbHVlIGZyb20gdGhlIG5leHQgaW4tZmxvdyBz
aWJsaW5nLiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoaXMgYm94J3MgbWFyZ2luIGFmdGVyIHZhbHVl
IG5vdyBzaW5jZSB0aGV5IGFyZSBjb2xsYXBzZWQuCi0gICAgLy8gMi4gVXBkYXRlIHRoZSBjb2xs
YXBzZWQgbWFyZ2luIGFmdGVyIHZhbHVlIGFzIHdlbGwgYXMgdGhlIHBvc2l0aXZlL25lZ2F0aXZl
IGNhY2hlLgotICAgIC8vIDMuIENoZWNrIGlmIHRoZSBib3gncyBtYXJnaW5zIGNvbGxhcHNlIHRo
cm91Z2guCi0gICAgLy8gNC4gSWYgc28sIHVwZGF0ZSB0aGUgcG9zaXRpdmUvbmVnYXRpdmUgY2Fj
aGUuCi0gICAgLy8gNS4gSW4gY2FzZSBvZiBjb2xsYXBzZWQgdGhyb3VnaCBtYXJnaW5zIGNoZWNr
IGlmIHRoZSBiZWZvcmUgbWFyZ2luIGNvbGxhcGVzIHdpdGggdGhlIHByZXZpb3VzIGluZmxvdyBz
aWJsaW5nJ3MgYWZ0ZXIgbWFyZ2luLgotICAgIC8vIDYuIElmIHNvLCBqdW1wIHRvICMyLgotICAg
IC8vIDcuIE5vIG5lZWQgdG8gcHJvcGFnYXRlIHRvIHBhcmVudCBiZWNhdXNlIGl0cyBtYXJnaW4g
aXMgbm90IGNvbXB1dGVkIHlldCAocHJlLWNvbXB1dGVkIGF0IG1vc3QpLgotICAgIGF1dG8qIGN1
cnJlbnRCb3ggPSAmbGF5b3V0Qm94OwotICAgIGF1dG8mIGJsb2NrRm9ybWF0dGluZ1N0YXRlID0g
YmxvY2tGb3JtYXR0aW5nQ29udGV4dC5mb3JtYXR0aW5nU3RhdGUoKTsKLSAgICB3aGlsZSAobWFy
Z2luQ29sbGFwc2UubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdp
bkFmdGVyKCpjdXJyZW50Qm94KSkgewotICAgICAgICBhdXRvJiBwcmV2aW91c1NpYmxpbmcgPSAq
Y3VycmVudEJveC0+cHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7Ci0gICAgICAgIGF1dG8gcHJldmlv
dXNTaWJsaW5nVmVydGljYWxNYXJnaW4gPSBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGlj
YWxNYXJnaW4ocHJldmlvdXNTaWJsaW5nKTsKLQotICAgICAgICBhdXRvIGNvbGxhcHNlZFZlcnRp
Y2FsTWFyZ2luQmVmb3JlID0gcHJldmlvdXNTaWJsaW5nVmVydGljYWxNYXJnaW4uY29sbGFwc2Vk
VmFsdWVzLmJlZm9yZTsKLSAgICAgICAgYXV0byBjb2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkFmdGVy
ID0gYmxvY2tGb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveCgqY3VycmVudEJveCkubWFy
Z2luQmVmb3JlKCk7Ci0KLSAgICAgICAgYXV0byBtYXJnaW5zQ29sbGFwc2VUaHJvdWdoID0gbWFy
Z2luQ29sbGFwc2UubWFyZ2luc0NvbGxhcHNlVGhyb3VnaChwcmV2aW91c1NpYmxpbmcpOwotICAg
ICAgICBpZiAobWFyZ2luc0NvbGxhcHNlVGhyb3VnaCkKLSAgICAgICAgICAgIGNvbGxhcHNlZFZl
cnRpY2FsTWFyZ2luQmVmb3JlID0gY29sbGFwc2VkVmVydGljYWxNYXJnaW5BZnRlcjsKLQotICAg
ICAgICAvLyBVcGRhdGUgcG9zaXRpdmUvbmVnYXRpdmUgY2FjaGUuCi0gICAgICAgIGF1dG8gcHJl
dmlvdXNTaWJsaW5nUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbiA9IGJsb2NrRm9ybWF0dGluZ1N0YXRl
LnVzZWRWZXJ0aWNhbE1hcmdpbihwcmV2aW91c1NpYmxpbmcpLnBvc2l0aXZlQW5kTmVnYXRpdmVW
YWx1ZXM7Ci0gICAgICAgIGF1dG8gcG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IGJsb2Nr
Rm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbigqY3VycmVudEJveCkucG9zaXRpdmVB
bmROZWdhdGl2ZVZhbHVlcy5iZWZvcmU7Ci0KLSAgICAgICAgYXV0byBhZGp1c3RlZFByZXZpb3Vz
U2libGluZ1ZlcnRpY2FsTWFyZ2luID0gcHJldmlvdXNTaWJsaW5nVmVydGljYWxNYXJnaW47Ci0g
ICAgICAgIGFkanVzdGVkUHJldmlvdXNTaWJsaW5nVmVydGljYWxNYXJnaW4ucG9zaXRpdmVBbmRO
ZWdhdGl2ZVZhbHVlcy5hZnRlciA9IG1hcmdpbkNvbGxhcHNlLmNvbXB1dGVkUG9zaXRpdmVBbmRO
ZWdhdGl2ZU1hcmdpbihwb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlLCBwcmV2aW91c1NpYmxp
bmdQb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luLmFmdGVyKTsKLSAgICAgICAgaWYgKG1hcmdpbnNDb2xs
YXBzZVRocm91Z2gpIHsKLSAgICAgICAgICAgIGFkanVzdGVkUHJldmlvdXNTaWJsaW5nVmVydGlj
YWxNYXJnaW4ucG9zaXRpdmVBbmROZWdhdGl2ZVZhbHVlcy5iZWZvcmUgPSBtYXJnaW5Db2xsYXBz
ZS5jb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4ocHJldmlvdXNTaWJsaW5nUG9zaXRp
dmVOZWdhdGl2ZU1hcmdpbi5iZWZvcmUsIGFkanVzdGVkUHJldmlvdXNTaWJsaW5nVmVydGljYWxN
YXJnaW4ucG9zaXRpdmVBbmROZWdhdGl2ZVZhbHVlcy5hZnRlcik7Ci0gICAgICAgICAgICBhZGp1
c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1
ZXMuYWZ0ZXIgPSBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZl
QW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlOwotICAgICAgICB9Ci0gICAgICAgIGJsb2NrRm9ybWF0
dGluZ1N0YXRlLnNldFVzZWRWZXJ0aWNhbE1hcmdpbihwcmV2aW91c1NpYmxpbmcsIGFkanVzdGVk
UHJldmlvdXNTaWJsaW5nVmVydGljYWxNYXJnaW4pOwotCi0gICAgICAgIGlmICghbWFyZ2luc0Nv
bGxhcHNlVGhyb3VnaCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGN1cnJlbnRCb3gg
PSAmcHJldmlvdXNTaWJsaW5nOwotICAgIH0KLX0KLQotVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3Np
dGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdp
bkNvbGxhcHNlOjpwb3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBN
YXJnaW5UeXBlIG1hcmdpblR5cGUpIGNvbnN0Ci17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRl
ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5mb3JtYXR0aW5nU3RhdGUoKTsKLSAgICAvLyBCeSB0aGUg
dGltZSB3ZSBnZXQgaGVyZSBpbiBCRkMgbGF5b3V0IHRvIGdhdGhlciBwb3NpdGl2ZSBhbmQgbmVn
YXRpdmUgbWFyZ2luIHZhbHVlcyBmb3IgZWl0aGVyIGEgcHJldmlvdXMgc2libGluZyBvciBhIGNo
aWxkIGJveCwKLSAgICAvLyB3ZSBtdXNoIGhhdmUgY29tcHV0ZWQgYW5kIGNhY2hlZCB0aG9zZSB2
YWx1ZXMuCi0gICAgQVNTRVJUKGZvcm1hdHRpbmdTdGF0ZS5oYXNVc2VkVmVydGljYWxNYXJnaW4o
bGF5b3V0Qm94KSk7Ci0gICAgYXV0byBwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVydGljYWxNYXJnaW4g
PSBmb3JtYXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCkucG9zaXRpdmVB
bmROZWdhdGl2ZVZhbHVlczsKLSAgICByZXR1cm4gbWFyZ2luVHlwZSA9PSBNYXJnaW5UeXBlOjpC
ZWZvcmUgPyBwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVydGljYWxNYXJnaW4uYmVmb3JlIDogcG9zaXRp
dmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyOyAKLX0KLQotVXNlZFZlcnRpY2FsTWFy
Z2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6Ok1hcmdpbkNvbGxhcHNlOjpwb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGNvbnN0IEJv
eCYgbGF5b3V0Qm94LCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyBub25D
b2xsYXBzZWRWYWx1ZXMpIGNvbnN0Ci17Ci0gICAgYXV0byBmaXJzdENoaWxkQ29sbGFwc2VkTWFy
Z2luQmVmb3JlID0gWyZdKCkgLT4gVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0
aXZlUGFpcjo6VmFsdWVzIHsKLSAgICAgICAgaWYgKCFtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRo
Rmlyc3RJbkZsb3dDaGlsZE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQotICAgICAgICAgICAgcmV0
dXJuIHsgfTsKLSAgICAgICAgcmV0dXJuIHBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMoKmRvd25jYXN0
PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5maXJzdEluRmxvd0NoaWxkKCksIE1hcmdpblR5cGU6
OkJlZm9yZSk7Ci0gICAgfTsKLQotICAgIGF1dG8gcHJldmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJn
aW5BZnRlciA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2
ZVBhaXI6OlZhbHVlcyB7Ci0gICAgICAgIGlmICghbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBy
ZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGxheW91dEJveCkpCi0gICAgICAgICAgICByZXR1cm4g
eyB9OwotICAgICAgICByZXR1cm4gcG9zaXRpdmVOZWdhdGl2ZVZhbHVlcygqbGF5b3V0Qm94LnBy
ZXZpb3VzSW5GbG93U2libGluZygpLCBNYXJnaW5UeXBlOjpBZnRlcik7Ci0gICAgfTsKLQotICAg
IC8vIDEuIEdhdGhlciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgbWFyZ2luIHZhbHVlcyBmcm9tIGZp
cnN0IGNoaWxkIGlmIG1hcmdpbnMgYXJlIGFkam9pbmluZy4KLSAgICAvLyAyLiBHYXRoZXIgcG9z
aXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZnJvbSBwcmV2aW91cyBpbmZsb3cgc2li
bGluZyBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcuCi0gICAgLy8gMy4gQ29tcHV0ZSBtaW4vbWF4
IHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBjb2xsYXBzZWQgbWFyZ2luIHZhbHVlcyB1c2luZyBub24t
Y29sbHBhc2VkIGNvbXB1dGVkIG1hcmdpbiBiZWZvcmUuCi0gICAgYXV0byBjb2xsYXBzZWRNYXJn
aW5CZWZvcmUgPSBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4oZmlyc3RDaGlsZENv
bGxhcHNlZE1hcmdpbkJlZm9yZSgpLCBwcmV2aW91U2libGluZ0NvbGxhcHNlZE1hcmdpbkFmdGVy
KCkpOwotICAgIGlmIChjb2xsYXBzZWRNYXJnaW5CZWZvcmUuaXNRdWlyayAmJiBmb3JtYXR0aW5n
Q29udGV4dCgpLnF1aXJrcygpLnNob3VsZElnbm9yZUNvbGxhcHNlZFF1aXJrTWFyZ2luKGxheW91
dEJveCkpCi0gICAgICAgIGNvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IHsgfTsKLQotICAgIFVzZWRW
ZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBub25Db2xsYXBz
ZWRCZWZvcmU7Ci0gICAgaWYgKG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUgPiAwKQotICAgICAg
ICBub25Db2xsYXBzZWRCZWZvcmUgPSB7IG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUsIHsgfSwg
bGF5b3V0Qm94LnN0eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSB9OwotICAgIGVsc2UgaWYg
KG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUgPCAwKQotICAgICAgICBub25Db2xsYXBzZWRCZWZv
cmUgPSB7IHsgfSwgbm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSwgbGF5b3V0Qm94LnN0eWxlKCku
aGFzTWFyZ2luQmVmb3JlUXVpcmsoKSB9OwotCi0gICAgcmV0dXJuIGNvbXB1dGVkUG9zaXRpdmVB
bmROZWdhdGl2ZU1hcmdpbihjb2xsYXBzZWRNYXJnaW5CZWZvcmUsIG5vbkNvbGxhcHNlZEJlZm9y
ZSk7Ci19Ci0KLVVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZh
bHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdh
dGl2ZU1hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBVc2VkVmVydGljYWxNYXJnaW46
Ok5vbkNvbGxhcHNlZFZhbHVlcyBub25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0Ci17Ci0gICAgYXV0
byBsYXN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5BZnRlciA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1h
cmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7Ci0gICAgICAgIGlmICghbWFy
Z2luQWZ0ZXJDb2xsYXBzZXNXaXRoTGFzdEluRmxvd0NoaWxkTWFyZ2luQWZ0ZXIobGF5b3V0Qm94
KSkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIHJldHVybiBwb3NpdGl2ZU5lZ2F0
aXZlVmFsdWVzKCpkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkubGFzdEluRmxvd0No
aWxkKCksIE1hcmdpblR5cGU6OkFmdGVyKTsKLSAgICB9OwotCi0gICAgLy8gV2UgZG9uJ3Qga25v
dyB5ZXQgdGhlIG1hcmdpbiBiZWZvcmUgdmFsdWUgb2YgdGhlIG5leHQgc2libGluZy4gTGV0J3Mg
anVzdCBwcmV0ZW5kIGl0IGRvZXMgbm90IGhhdmUgb25lIGFuZCAKLSAgICAvLyB1cGRhdGUgaXQg
bGF0ZXIgd2hlbiB3ZSBjb21wdXRlIHRoZSBuZXh0IHNpYmxpbmcncyBtYXJnaW4gYmVmb3JlLiBT
ZWUgdXBkYXRlTWFyZ2luQWZ0ZXJGb3JQcmV2aW91c1NpYmxpbmcuCi0gICAgVXNlZFZlcnRpY2Fs
TWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIG5vbkNvbGxhcHNlZEFmdGVy
OwotICAgIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIgPiAwKQotICAgICAgICBub25Db2xs
YXBzZWRBZnRlciA9IHsgbm9uQ29sbGFwc2VkVmFsdWVzLmFmdGVyLCB7IH0sIGxheW91dEJveC5z
dHlsZSgpLmhhc01hcmdpbkFmdGVyUXVpcmsoKSB9OwotICAgIGVsc2UgaWYgKG5vbkNvbGxhcHNl
ZFZhbHVlcy5hZnRlciA8IDApCi0gICAgICAgIG5vbkNvbGxhcHNlZEFmdGVyID0geyB7IH0sIG5v
bkNvbGxhcHNlZFZhbHVlcy5hZnRlciwgbGF5b3V0Qm94LnN0eWxlKCkuaGFzTWFyZ2luQWZ0ZXJR
dWlyaygpIH07Ci0KLSAgICByZXR1cm4gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2lu
KGxhc3RDaGlsZENvbGxhcHNlZE1hcmdpbkFmdGVyKCksIG5vbkNvbGxhcHNlZEFmdGVyKTsKLX0K
LQotTGF5b3V0VW5pdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFy
Z2luQmVmb3JlSWdub3JpbmdDb2xsYXBzaW5nVGhyb3VnaChjb25zdCBCb3gmIGxheW91dEJveCwg
VXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVz
KQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwotICAgIHJldHVy
biBtYXJnaW5WYWx1ZShwb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGxheW91dEJveCwgbm9u
Q29sbGFwc2VkVmFsdWVzKSkudmFsdWVPcihub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlKTsKLX0K
LQotVXNlZFZlcnRpY2FsTWFyZ2luIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxh
cHNlOjpjb2xsYXBzZWRWZXJ0aWNhbFZhbHVlcyhjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZl
cnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKQotewot
ICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwotICAgIC8vIDEuIEdldCBt
aW4vbWF4IG1hcmdpbiB0b3AgdmFsdWVzIGZyb20gdGhlIGZpcnN0IGluLWZsb3cgY2hpbGQgaWYg
d2UgYXJlIGNvbGxhcHNpbmcgbWFyZ2luIHRvcCB3aXRoIGl0LgotICAgIC8vIDIuIEdldCBtaW4v
bWF4IG1hcmdpbiB0b3AgdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIGluLWZsb3cgc2libGluZywg
aWYgd2UgYXJlIGNvbGxhcHNpbmcgbWFyZ2luIHRvcCB3aXRoIGl0LgotICAgIC8vIDMuIEdldCB0
aGlzIGxheW91dCBib3gncyBjb21wdXRlZCBtYXJnaW4gdG9wIHZhbHVlLgotICAgIC8vIDQuIFVw
ZGF0ZSB0aGUgbWluL21heCB2YWx1ZSBhbmQgY29tcHV0ZSB0aGUgZmluYWwgbWFyZ2luLgotICAg
IGF1dG8gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFy
Z2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpciB7IHRoaXMtPnBvc2l0aXZlTmVnYXRpdmVNYXJn
aW5CZWZvcmUobGF5b3V0Qm94LCBub25Db2xsYXBzZWRWYWx1ZXMpLCB0aGlzLT5wb3NpdGl2ZU5l
Z2F0aXZlTWFyZ2luQWZ0ZXIobGF5b3V0Qm94LCBub25Db2xsYXBzZWRWYWx1ZXMpIH07Ci0KLSAg
ICBhdXRvIG1hcmdpbnNDb2xsYXBzZVRocm91Z2ggPSB0aGlzLT5tYXJnaW5zQ29sbGFwc2VUaHJv
dWdoKGxheW91dEJveCk7Ci0gICAgaWYgKG1hcmdpbnNDb2xsYXBzZVRocm91Z2gpIHsKLSAgICAg
ICAgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSA9IGNvbXB1dGVkUG9z
aXRpdmVBbmROZWdhdGl2ZU1hcmdpbihwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVydGljYWxNYXJnaW4u
YmVmb3JlLCBwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVydGljYWxNYXJnaW4uYWZ0ZXIpOwotICAgICAg
ICBwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVydGljYWxNYXJnaW4uYWZ0ZXIgPSBwb3NpdGl2ZUFuZE5l
Z2F0aXZlVmVydGljYWxNYXJnaW4uYmVmb3JlOwotICAgIH0KLQotICAgIGF1dG8gaGFzQ29sbGFw
c2VkTWFyZ2luQmVmb3JlID0gbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hp
bGRNYXJnaW5CZWZvcmUobGF5b3V0Qm94KSB8fCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJl
dmlvdXNTaWJsaW5nTWFyZ2luQWZ0ZXIobGF5b3V0Qm94KTsKLSAgICBhdXRvIGhhc0NvbGxhcHNl
ZE1hcmdpbkFmdGVyID0gbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoTGFzdEluRmxvd0NoaWxkTWFy
Z2luQWZ0ZXIobGF5b3V0Qm94KTsKLSAgICBhdXRvIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IFVzZWRW
ZXJ0aWNhbE1hcmdpbiB7IG5vbkNvbGxhcHNlZFZhbHVlcywgeyB9LCBwb3NpdGl2ZUFuZE5lZ2F0
aXZlVmVydGljYWxNYXJnaW4gfTsKLQotICAgIGlmICgoaGFzQ29sbGFwc2VkTWFyZ2luQmVmb3Jl
ICYmIGhhc0NvbGxhcHNlZE1hcmdpbkFmdGVyKSB8fCBtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKQot
ICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4uY29sbGFwc2VkVmFsdWVzID0geyBtYXJnaW5WYWx1
ZShwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVydGljYWxNYXJnaW4uYmVmb3JlKSwgbWFyZ2luVmFsdWUo
cG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyKSwgbWFyZ2luc0NvbGxhcHNl
VGhyb3VnaCB9OwotICAgIGVsc2UgaWYgKGhhc0NvbGxhcHNlZE1hcmdpbkJlZm9yZSkKLSAgICAg
ICAgdXNlZFZlcnRpY2FsTWFyZ2luLmNvbGxhcHNlZFZhbHVlcyA9IHsgbWFyZ2luVmFsdWUocG9z
aXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSksIHsgfSwgZmFsc2UgfTsKLSAg
ICBlbHNlIGlmIChoYXNDb2xsYXBzZWRNYXJnaW5BZnRlcikKLSAgICAgICAgdXNlZFZlcnRpY2Fs
TWFyZ2luLmNvbGxhcHNlZFZhbHVlcyA9IHsgeyB9LCBtYXJnaW5WYWx1ZShwb3NpdGl2ZUFuZE5l
Z2F0aXZlVmVydGljYWxNYXJnaW4uYWZ0ZXIpLCBmYWxzZSB9OwotICAgIHJldHVybiB1c2VkVmVy
dGljYWxNYXJnaW47Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9QcmVjb21wdXRlZEJsb2NrTWFyZ2luQ29sbGFwc2Uu
Y3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9QcmVjb21wdXRlZEJs
b2NrTWFyZ2luQ29sbGFwc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWZi
M2Q1NTRmZTY4ZGU0MjczMWZmOGUyZDRiMjBlYWJmNjU5ZWMyLi4wMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zv
cm1hdHRpbmcvUHJlY29tcHV0ZWRCbG9ja01hcmdpbkNvbGxhcHNlLmNwcAorKysgL2Rldi9udWxs
CkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICog
YXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2lu
Y2x1ZGUgIkJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9S
TUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKLSNp
bmNsdWRlICJMYXlvdXRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNp
bmNsdWRlICJMYXlvdXRTdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dFVuaXQuaCIKLSNpbmNsdWRl
ICJSZW5kZXJTdHlsZS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0
IHsKLQotVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVz
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjpwcmVjb21wdXRlZFBvc2l0
aXZlTmVnYXRpdmVWYWx1ZXMoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgYXV0
byYgYmxvY2tGb3JtYXR0aW5nU3RhdGUgPSBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4o
bGF5b3V0U3RhdGUoKS5mb3JtYXR0aW5nU3RhdGVGb3JCb3gobGF5b3V0Qm94KSk7Ci0gICAgaWYg
KGJsb2NrRm9ybWF0dGluZ1N0YXRlLmhhc1VzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpKQot
ICAgICAgICByZXR1cm4gYmxvY2tGb3JtYXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKGxh
eW91dEJveCkucG9zaXRpdmVBbmROZWdhdGl2ZVZhbHVlcy5iZWZvcmU7Ci0KLSAgICBhdXRvIGdl
b21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeSgpOwotICAgIGF1dG8gaG9yaXpv
bnRhbENvbnN0cmFpbnRzID0gZ2VvbWV0cnkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KGxh
eW91dEJveC5jb250YWluaW5nQmxvY2soKSkuaG9yaXpvbnRhbDsKLSAgICBhdXRvIGNvbXB1dGVk
VmVydGljYWxNYXJnaW4gPSBnZW9tZXRyeS5jb21wdXRlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJv
eCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICBhdXRvIG5vbkNvbGxhcHNlZE1hcmdpbiA9
IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIHsgY29tcHV0ZWRWZXJ0aWNh
bE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52
YWx1ZU9yKDApIH07Ci0gICAgcmV0dXJuIHByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZU1hcmdp
bkJlZm9yZShsYXlvdXRCb3gsIG5vbkNvbGxhcHNlZE1hcmdpbik7Ci19Ci0KLVVzZWRWZXJ0aWNh
bE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cHJlY29tcHV0ZWRQb3NpdGl2ZU5lZ2F0aXZlTWFyZ2lu
QmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxh
cHNlZFZhbHVlcyBub25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0Ci17Ci0gICAgYXV0byBmaXJzdENo
aWxkQ29sbGFwc2VkTWFyZ2luQmVmb3JlID0gWyZdKCkgLT4gVXNlZFZlcnRpY2FsTWFyZ2luOjpQ
b3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHsKLSAgICAgICAgaWYgKCFtYXJnaW5CZWZv
cmVDb2xsYXBzZXNXaXRoRmlyc3RJbkZsb3dDaGlsZE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQot
ICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgcmV0dXJuIHByZWNvbXB1dGVkUG9zaXRp
dmVOZWdhdGl2ZVZhbHVlcygqZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0
SW5GbG93Q2hpbGQoKSk7Ci0gICAgfTsKLQotICAgIGF1dG8gcHJldmlvdVNpYmxpbmdDb2xsYXBz
ZWRNYXJnaW5BZnRlciA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmRO
ZWdhdGl2ZVBhaXI6OlZhbHVlcyB7Ci0gICAgICAgIGlmICghbWFyZ2luQmVmb3JlQ29sbGFwc2Vz
V2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGxheW91dEJveCkpCi0gICAgICAgICAgICBy
ZXR1cm4geyB9OwotICAgICAgICBhdXRvJiBwcmV2aW91c0luRmxvd1NpYmxpbmcgPSAqbGF5b3V0
Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpOwotICAgICAgICBhdXRvJiBibG9ja0Zvcm1hdHRp
bmdTdGF0ZSA9IGRvd25jYXN0PEJsb2NrRm9ybWF0dGluZ1N0YXRlPihsYXlvdXRTdGF0ZSgpLmZv
cm1hdHRpbmdTdGF0ZUZvckJveChwcmV2aW91c0luRmxvd1NpYmxpbmcpKTsKLSAgICAgICAgcmV0
dXJuIGJsb2NrRm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihwcmV2aW91c0luRmxv
d1NpYmxpbmcpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0ZXI7Ci0gICAgfTsKLQotICAg
IC8vIDEuIEdhdGhlciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgbWFyZ2luIHZhbHVlcyBmcm9tIGZp
cnN0IGNoaWxkIGlmIG1hcmdpbnMgYXJlIGFkam9pbmluZy4KLSAgICAvLyAyLiBHYXRoZXIgcG9z
aXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZnJvbSBwcmV2aW91cyBpbmZsb3cgc2li
bGluZyBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcuCi0gICAgLy8gMy4gQ29tcHV0ZSBtaW4vbWF4
IHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBjb2xsYXBzZWQgbWFyZ2luIHZhbHVlcyB1c2luZyBub24t
Y29sbHBhc2VkIGNvbXB1dGVkIG1hcmdpbiBiZWZvcmUuCi0gICAgYXV0byBjb2xsYXBzZWRNYXJn
aW5CZWZvcmUgPSBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4oZmlyc3RDaGlsZENv
bGxhcHNlZE1hcmdpbkJlZm9yZSgpLCBwcmV2aW91U2libGluZ0NvbGxhcHNlZE1hcmdpbkFmdGVy
KCkpOwotICAgIGlmIChjb2xsYXBzZWRNYXJnaW5CZWZvcmUuaXNRdWlyayAmJiBmb3JtYXR0aW5n
Q29udGV4dCgpLnF1aXJrcygpLnNob3VsZElnbm9yZUNvbGxhcHNlZFF1aXJrTWFyZ2luKGxheW91
dEJveCkpCi0gICAgICAgIGNvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IHsgfTsKLQotICAgIGF1dG8g
bm9uQ29sbGFwc2VkQmVmb3JlID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0
aXZlUGFpcjo6VmFsdWVzIHsgfTsKLSAgICBpZiAobm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSA+
IDApCi0gICAgICAgIG5vbkNvbGxhcHNlZEJlZm9yZSA9IHsgbm9uQ29sbGFwc2VkVmFsdWVzLmJl
Zm9yZSwgeyB9LCBsYXlvdXRCb3guc3R5bGUoKS5oYXNNYXJnaW5CZWZvcmVRdWlyaygpIH07Ci0g
ICAgZWxzZSBpZiAobm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSA8IDApCi0gICAgICAgIG5vbkNv
bGxhcHNlZEJlZm9yZSA9IHsgeyB9LCBub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlLCBsYXlvdXRC
b3guc3R5bGUoKS5oYXNNYXJnaW5CZWZvcmVRdWlyaygpIH07Ci0KLSAgICByZXR1cm4gY29tcHV0
ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKGNvbGxhcHNlZE1hcmdpbkJlZm9yZSwgbm9uQ29s
bGFwc2VkQmVmb3JlKTsKLX0KLQotUHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUgQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OnByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0
IEJveCYgbGF5b3V0Qm94LCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB1
c2VkTm9uQ29sbGFwc2VkTWFyZ2luKQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xl
dmVsQm94KCkpOwotICAgIC8vIERvbid0IHByZS1jb21wdXRlIHZlcnRpY2FsIG1hcmdpbnMgZm9y
IG91dCBvZiBmbG93IGJveGVzLgotICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSB8fCBs
YXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7Ci0gICAgQVNTRVJUKCFsYXlvdXRCb3gu
aXNSZXBsYWNlZEJveCgpKTsKLQotICAgIGF1dG8gcG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9y
ZSA9IHByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gsIHVz
ZWROb25Db2xsYXBzZWRNYXJnaW4pOwotICAgIGF1dG8gY29sbGFwc2VkTWFyZ2luQmVmb3JlID0g
bWFyZ2luVmFsdWUocG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSk7Ci0gICAgcmV0dXJuIHsg
dXNlZE5vbkNvbGxhcHNlZE1hcmdpbi5iZWZvcmUsIGNvbGxhcHNlZE1hcmdpbkJlZm9yZSwgcG9z
aXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSB9OwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1Rh
YmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0
aW5nQ29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNmRmNjVjYTRi
YjcxMzYwNGVhYjcwMDE2Y2Y3ZGVmMWMyMmYwNGQuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGlu
Zy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5jcHAKKysr
IC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
LSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgot
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25m
aWcuaCIKLSNpbmNsdWRlICJUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCi0K
LSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkJsb2Nr
Rm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIKLSNpbmNs
dWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgotI2luY2x1ZGUgIkxheW91dENoaWxkSXRlcmF0b3Iu
aCIKLSNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCi0jaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENv
bnRhaW5pbmdCbG9jay5oIgotI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNp
bmNsdWRlICJUYWJsZUZvcm1hdHRpbmdTdGF0ZS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1u
YW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKFRhYmxlV3Jh
cHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQpOwotCi1UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRh
aW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBCbG9ja0Zvcm1hdHRpbmdTdGF0ZSYgZm9y
bWF0dGluZ1N0YXRlKQotICAgIDogQmxvY2tGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29u
dGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKLXsKLX0KLQotdm9pZCBUYWJsZVdyYXBwZXJCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRl
JiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAg
ICAvLyBUaGUgdGFibGUgZ2VuZXJhdGVzIGEgcHJpbmNpcGFsIGJsb2NrIGNvbnRhaW5lciBib3gg
Y2FsbGVkIHRoZSB0YWJsZSB3cmFwcGVyIGJveCB0aGF0IGNvbnRhaW5zIHRoZSB0YWJsZSBib3gg
aXRzZWxmIGFuZCBhbnkgY2FwdGlvbiBib3hlcwotICAgIC8vIChpbiBkb2N1bWVudCBvcmRlciku
IFRoZSB0YWJsZSBib3ggaXMgYSBibG9jay1sZXZlbCBib3ggdGhhdCBjb250YWlucyB0aGUgdGFi
bGUncyBpbnRlcm5hbCB0YWJsZSBib3hlcy4KLSAgICAvLyBUaGUgY2FwdGlvbiBib3hlcyBhcmUg
cHJpbmNpcGFsIGJsb2NrLWxldmVsIGJveGVzIHRoYXQgcmV0YWluIHRoZWlyIG93biBjb250ZW50
LCBwYWRkaW5nLCBtYXJnaW4sIGFuZCBib3JkZXIgYXJlYXMsIGFuZCBhcmUgcmVuZGVyZWQKLSAg
ICAvLyBhcyBub3JtYWwgYmxvY2sgYm94ZXMgaW5zaWRlIHRoZSB0YWJsZSB3cmFwcGVyIGJveC4g
V2hldGhlciB0aGUgY2FwdGlvbiBib3hlcyBhcmUgcGxhY2VkIGJlZm9yZSBvciBhZnRlciB0aGUg
dGFibGUgYm94IGlzIGRlY2lkZWQgYnkKLSAgICAvLyB0aGUgJ2NhcHRpb24tc2lkZScgcHJvcGVy
dHksIGFzIGRlc2NyaWJlZCBiZWxvdy4KLSAgICBmb3IgKGF1dG8mIGNoaWxkIDogY2hpbGRyZW5P
ZlR5cGU8Q29udGFpbmVyQm94Pihyb290KCkpKSB7Ci0gICAgICAgIGlmIChjaGlsZC5pc1RhYmxl
Qm94KCkpCi0gICAgICAgICAgICBsYXlvdXRUYWJsZUJveChjaGlsZCwgY29uc3RyYWludHMpOwot
ICAgICAgICBlbHNlIGlmIChjaGlsZC5pc1RhYmxlQ2FwdGlvbigpKQotICAgICAgICAgICAgQVNT
RVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotfQotCi12b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6OmxheW91dFRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVC
b3gsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCi17Ci0g
ICAgbGF5b3V0U3RhdGUoKS5lbnN1cmVUYWJsZUZvcm1hdHRpbmdTdGF0ZSh0YWJsZUJveCk7Ci0K
LSAgICBjb21wdXRlQm9yZGVyQW5kUGFkZGluZ0ZvclRhYmxlQm94KHRhYmxlQm94LCBjb25zdHJh
aW50cy5ob3Jpem9udGFsKTsKLSAgICBjb21wdXRlU3RhdGljVmVydGljYWxQb3NpdGlvbih0YWJs
ZUJveCwgY29uc3RyYWludHMudmVydGljYWwpOwotICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbkZv
clRhYmxlQm94KHRhYmxlQm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICBjb21wdXRl
U3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKHRhYmxlQm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFs
KTsKLQotICAgIGlmICh0YWJsZUJveC5oYXNDaGlsZCgpKSB7Ci0gICAgICAgIGF1dG8gaW52YWxp
ZGF0aW9uU3RhdGUgPSBJbnZhbGlkYXRpb25TdGF0ZSB7IH07Ci0gICAgICAgIExheW91dENvbnRl
eHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KHRhYmxlQm94LCBsYXlvdXRTdGF0ZSgpKS0+bGF5
b3V0SW5GbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5jb25zdHJhaW50
c0ZvckluRmxvd0NvbnRlbnQodGFibGVCb3gpKTsKLSAgICB9Ci0KLSAgICBjb21wdXRlSGVpZ2h0
QW5kTWFyZ2luRm9yVGFibGVCb3godGFibGVCb3gsIGNvbnN0cmFpbnRzKTsKLX0KLQotdm9pZCBU
YWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlQm9yZGVyQW5kUGFkZGlu
Z0ZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQotewotICAgIEFTU0VSVCh0YWJs
ZUJveC5pc1RhYmxlQm94KCkpOwotICAgIGlmICghdGFibGVCb3guaGFzQ2hpbGQoKSB8fCB0YWJs
ZUJveC5zdHlsZSgpLmJvcmRlckNvbGxhcHNlKCkgPT0gQm9yZGVyQ29sbGFwc2U6OlNlcGFyYXRl
KSB7Ci0gICAgICAgIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVCb3JkZXJBbmRQYWRk
aW5nKHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotICAgIC8vIFVBcyBtdXN0IGNvbXB1dGUgYW4gaW5pdGlhbCBsZWZ0IGFuZCByaWdodCBi
b3JkZXIgd2lkdGggZm9yIHRoZSB0YWJsZSBieSBleGFtaW5pbmcKLSAgICAvLyB0aGUgZmlyc3Qg
YW5kIGxhc3QgY2VsbHMgaW4gdGhlIGZpcnN0IHJvdyBvZiB0aGUgdGFibGUuCi0gICAgLy8gVGhl
IGxlZnQgYm9yZGVyIHdpZHRoIG9mIHRoZSB0YWJsZSBpcyBoYWxmIG9mIHRoZSBmaXJzdCBjZWxs
J3MgY29sbGFwc2VkIGxlZnQgYm9yZGVyLAotICAgIC8vIGFuZCB0aGUgcmlnaHQgYm9yZGVyIHdp
ZHRoIG9mIHRoZSB0YWJsZSBpcyBoYWxmIG9mIHRoZSBsYXN0IGNlbGwncyBjb2xsYXBzZWQgcmln
aHQgYm9yZGVyLgotICAgIC8vIFRoZSB0b3AgYm9yZGVyIHdpZHRoIG9mIHRoZSB0YWJsZSBpcyBj
b21wdXRlZCBieSBleGFtaW5pbmcgYWxsIGNlbGxzIHdobyBjb2xsYXBzZSB0aGVpciB0b3AKLSAg
ICAvLyBib3JkZXJzIHdpdGggdGhlIHRvcCBib3JkZXIgb2YgdGhlIHRhYmxlLiBUaGUgdG9wIGJv
cmRlciB3aWR0aCBvZiB0aGUgdGFibGUgaXMgZXF1YWwgdG8gaGFsZiBvZiB0aGUKLSAgICAvLyBt
YXhpbXVtIGNvbGxhcHNlZCB0b3AgYm9yZGVyLiBUaGUgYm90dG9tIGJvcmRlciB3aWR0aCBpcyBj
b21wdXRlZCBieSBleGFtaW5pbmcgYWxsIGNlbGxzIHdob3NlIGJvdHRvbSBib3JkZXJzIGNvbGxh
cHNlCi0gICAgLy8gd2l0aCB0aGUgYm90dG9tIG9mIHRoZSB0YWJsZS4gVGhlIGJvdHRvbSBib3Jk
ZXIgd2lkdGggaXMgZXF1YWwgdG8gaGFsZiBvZiB0aGUgbWF4aW11bSBjb2xsYXBzZWQgYm90dG9t
IGJvcmRlci4KLSAgICBhdXRvJiBncmlkID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZFRhYmxl
Rm9ybWF0dGluZ1N0YXRlKHRhYmxlQm94KS50YWJsZUdyaWQoKTsKLSAgICBhdXRvIHRhYmxlQm9y
ZGVyID0gZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcih0YWJsZUJveCk7Ci0KLSAgICBhdXRvJiBm
aXJzdENvbHVtbkZpcnN0Um93Qm94ID0gZ3JpZC5zbG90KHsgMCAsIDAgfSktPmNlbGwoKS5ib3go
KTsKLSAgICBhdXRvIGxlZnRCb3JkZXIgPSBzdGQ6Om1heCh0YWJsZUJvcmRlci5ob3Jpem9udGFs
LmxlZnQsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIoZmlyc3RDb2x1bW5GaXJzdFJvd0JveCku
aG9yaXpvbnRhbC5sZWZ0KTsKLQotICAgIGF1dG8mIGxhc3RDb2x1bW5GaXJzdFJvdyA9IGdyaWQu
c2xvdCh7IGdyaWQuY29sdW1ucygpLnNpemUoKSAtIDEsIDAgfSktPmNlbGwoKS5ib3goKTsKLSAg
ICBhdXRvIHJpZ2h0Qm9yZGVyID0gc3RkOjptYXgodGFibGVCb3JkZXIuaG9yaXpvbnRhbC5yaWdo
dCwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihsYXN0Q29sdW1uRmlyc3RSb3cpLmhvcml6b250
YWwucmlnaHQpOwotCi0gICAgYXV0byB0b3BCb3JkZXIgPSB0YWJsZUJvcmRlci52ZXJ0aWNhbC50
b3A7Ci0gICAgYXV0byBib3R0b21Cb3JkZXIgPSB0YWJsZUJvcmRlci52ZXJ0aWNhbC5ib3R0b207
Ci0gICAgYXV0byBsYXN0Um93SW5kZXggPSBncmlkLnJvd3MoKS5zaXplKCkgLSAxOwotICAgIGZv
ciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBncmlkLmNvbHVtbnMoKS5z
aXplKCk7ICsrY29sdW1uSW5kZXgpIHsKLSAgICAgICAgYXV0byYgYm94SW5GaXJzdFJveCA9IGdy
aWQuc2xvdCh7IGNvbHVtbkluZGV4LCAwIH0pLT5jZWxsKCkuYm94KCk7Ci0gICAgICAgIGF1dG8m
IGJveEluTGFzdFJvdyA9IGdyaWQuc2xvdCh7IGNvbHVtbkluZGV4LCBsYXN0Um93SW5kZXggfSkt
PmNlbGwoKS5ib3goKTsKLQotICAgICAgICB0b3BCb3JkZXIgPSBzdGQ6Om1heCh0b3BCb3JkZXIs
IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIoYm94SW5GaXJzdFJveCkudmVydGljYWwudG9wKTsK
LSAgICAgICAgYm90dG9tQm9yZGVyID0gc3RkOjptYXgoYm90dG9tQm9yZGVyLCBnZW9tZXRyeSgp
LmNvbXB1dGVkQm9yZGVyKGJveEluTGFzdFJvdykudmVydGljYWwuYm90dG9tKTsKLSAgICB9Ci0K
LSAgICB0b3BCb3JkZXIgPSBzdGQ6Om1heCh0b3BCb3JkZXIsIGdlb21ldHJ5KCkuY29tcHV0ZWRC
b3JkZXIoKnRhYmxlQm94LmZpcnN0Q2hpbGQoKSkudmVydGljYWwudG9wKTsKLSAgICBmb3IgKGF1
dG8mIHNlY3Rpb24gOiBjaGlsZHJlbk9mVHlwZTxDb250YWluZXJCb3g+KHRhYmxlQm94KSkgewot
ICAgICAgICBhdXRvIGhvcml6dG9uYWxCb3JkZXIgPSBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVy
KHNlY3Rpb24pLmhvcml6b250YWw7Ci0gICAgICAgIGxlZnRCb3JkZXIgPSBzdGQ6Om1heChsZWZ0
Qm9yZGVyLCBob3JpenRvbmFsQm9yZGVyLmxlZnQpOwotICAgICAgICByaWdodEJvcmRlciA9IHN0
ZDo6bWF4KHJpZ2h0Qm9yZGVyLCBob3JpenRvbmFsQm9yZGVyLnJpZ2h0KTsKLSAgICB9Ci0gICAg
Ym90dG9tQm9yZGVyID0gc3RkOjptYXgoYm90dG9tQm9yZGVyLCBnZW9tZXRyeSgpLmNvbXB1dGVk
Qm9yZGVyKCp0YWJsZUJveC5sYXN0Q2hpbGQoKSkudmVydGljYWwuYm90dG9tKTsKLQotICAgIGF1
dG8mIHJvd3MgPSBncmlkLnJvd3MoKS5saXN0KCk7Ci0gICAgdG9wQm9yZGVyID0gc3RkOjptYXgo
dG9wQm9yZGVyLCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKHJvd3MuZmlyc3QoKS5ib3goKSku
dmVydGljYWwudG9wKTsKLSAgICBmb3IgKGF1dG8mIHJvdyA6IHJvd3MpIHsKLSAgICAgICAgYXV0
byBob3JpenRvbmFsQm9yZGVyID0gZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihyb3cuYm94KCkp
Lmhvcml6b250YWw7Ci0gICAgICAgIGxlZnRCb3JkZXIgPSBzdGQ6Om1heChsZWZ0Qm9yZGVyLCBo
b3JpenRvbmFsQm9yZGVyLmxlZnQpOwotICAgICAgICByaWdodEJvcmRlciA9IHN0ZDo6bWF4KHJp
Z2h0Qm9yZGVyLCBob3JpenRvbmFsQm9yZGVyLnJpZ2h0KTsKLSAgICB9Ci0gICAgYm90dG9tQm9y
ZGVyID0gc3RkOjptYXgoYm90dG9tQm9yZGVyLCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKHJv
d3MubGFzdCgpLmJveCgpKS52ZXJ0aWNhbC5ib3R0b20pOwotCi0gICAgYXV0byBjb2xsYXBzZWRC
b3JkZXIgPSBFZGdlcyB7IHsgbGVmdEJvcmRlciwgcmlnaHRCb3JkZXIgfSwgeyB0b3BCb3JkZXIs
IGJvdHRvbUJvcmRlciB9IH07Ci0gICAgZ3JpZC5zZXRDb2xsYXBzZWRCb3JkZXIoY29sbGFwc2Vk
Qm9yZGVyKTsKLQotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94
R2VvbWV0cnkodGFibGVCb3gpOwotICAgIGJveEdlb21ldHJ5LnNldEJvcmRlcihjb2xsYXBzZWRC
b3JkZXIgLyAyKTsKLSAgICBib3hHZW9tZXRyeS5zZXRQYWRkaW5nKGdlb21ldHJ5KCkuY29tcHV0
ZWRQYWRkaW5nKHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoKSk7
Ci19Ci0KLXZvaWQgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZVdp
ZHRoQW5kTWFyZ2luRm9yVGFibGVCb3goY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCwgY29u
c3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCi17Ci0gICAg
QVNTRVJUKHRhYmxlQm94LmlzVGFibGVCb3goKSk7Ci0gICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwg
dGFibGUgImZpdC1jb250ZW50IHNpemUiIGJlaGF2aW9yIGhhbmRsaW5nLiBOb3QgaW4gdGhlIHNw
ZWMgdGhvdWdoLgotICAgIC8vIFRhYmxlIHJldHVybnMgaXRzIGZpbmFsIHdpZHRoIGFzIG1pbi9t
YXguIFVzZSB0aGlzIGZpbmFsIHdpZHRoIHZhbHVlIHRvIGNvbXB1dGVkIGhvcml6b250YWwgbWFy
Z2lucyBldGMuCi0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlRm9yVGFibGVCb3ggPSBsYXlvdXRT
dGF0ZSgpLmVzdGFibGlzaGVkVGFibGVGb3JtYXR0aW5nU3RhdGUodGFibGVCb3gpOwotICAgIGF1
dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMg
eyB9OwotICAgIGlmIChhdXRvIHByZWNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9
IGZvcm1hdHRpbmdTdGF0ZUZvclRhYmxlQm94LmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSkK
LSAgICAgICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9ICpwcmVjb21wdXRlZEludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHM7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmICh0YWJsZUJveC5oYXND
aGlsZCgpKQotICAgICAgICAgICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IExheW91dENv
bnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KHRhYmxlQm94LCBsYXlvdXRTdGF0ZSgpKS0+
Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGZvcm1hdHRpbmdT
dGF0ZUZvclRhYmxlQm94LnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cyk7Ci0gICAgfQotCi0gICAgYXV0byBhdmFpbGFibGVIb3Jpem9udGFsU3Bh
Y2UgPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoOwotICAgIC8vIDEuIFRoZSB0
YWJsZSBnZW5lcmF0ZXMgYSBwcmluY2lwYWwgYmxvY2sgY29udGFpbmVyIGJveCBjYWxsZWQgdGhl
IHRhYmxlIHdyYXBwZXIgYm94IHRoYXQgY29udGFpbnMgdGhlIHRhYmxlIGJveCBpdHNlbGYgYW5k
IGFueSBjYXB0aW9uIGJveGVzLgotICAgIC8vIDIuIFRoZSB0YWJsZSB3cmFwcGVyIGJveCBlc3Rh
Ymxpc2hlcyBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCwgYW5kIHRoZSB0YWJsZSBib3ggZXN0
YWJsaXNoZXMgYSB0YWJsZSBmb3JtYXR0aW5nIGNvbnRleHQuCi0gICAgLy8gMy4gVGhlIGNvbXB1
dGVkIHZhbHVlcyBvZiBwcm9wZXJ0aWVzICdwb3NpdGlvbicsICdmbG9hdCcsICdtYXJnaW4tKics
ICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgYW5kICdsZWZ0JyBvbgotICAgIC8vICAgIHRoZSB0
YWJsZSBlbGVtZW50IGFyZSB1c2VkIG9uIHRoZSB0YWJsZSB3cmFwcGVyIGJveCBhbmQgbm90IHRo
ZSB0YWJsZSBib3g7IGFsbCBvdGhlciB2YWx1ZXMgb2Ygbm9uLWluaGVyaXRhYmxlCi0gICAgLy8g
ICAgcHJvcGVydGllcyBhcmUgdXNlZCBvbiB0aGUgdGFibGUgYm94IGFuZCBub3QgdGhlIHRhYmxl
IHdyYXBwZXIgYm94LgotICAgIC8vIDQuIEluIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0LCBl
YWNoIGJveCdzIGxlZnQgb3V0ZXIgZWRnZSB0b3VjaGVzIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNv
bnRhaW5pbmcgYmxvY2suCi0gICAgLy8gICAgVGhpcyBpcyB0cnVlIGV2ZW4gaW4gdGhlIHByZXNl
bmNlIG9mIGZsb2F0cywgdW5sZXNzIHRoZSBib3ggZXN0YWJsaXNoZXMgYSBuZXcgYmxvY2sgZm9y
bWF0dGluZyBjb250ZXh0IChpbiB3aGljaCBjYXNlIHRoZQotICAgIC8vICAgIGJveCBpdHNlbGYg
bWF5IGJlY29tZSBuYXJyb3dlciBkdWUgdG8gdGhlIGZsb2F0cykKLSAgICAvLwotICAgIC8vIE5v
dyBjb25zaWRlciB0aGUgZm9sbG93aW5nIGNhc2U6Ci0gICAgLy8gPGRpdiBzdHlsZT0iZGlzcGxh
eTogYmxvY2s7IHdpZHRoOiA1MDBweDsiPgotICAgIC8vICAgICA8ZGl2IHN0eWxlPSJmbG9hdDog
bGVmdDsgd2lkdGg6IDEwMHB4OyI+PC9kaXY+Ci0gICAgLy8gICAgICAgICA8ZGl2IHN0eWxlPSJk
aXNwbGF5OiB0YWJsZTsgd2lkdGg6IDEwJTsiPjwvZGl2PgotICAgIC8vICAgICA8L2Rpdj4KLSAg
ICAvLyA8L2Rpdj4KLSAgICAvLyAxLiBXZSBjcmVhdGUgYSB0YWJsZSB3cmFwcGVyIGJveCB0byB3
cmFwIHRoZSAiZGlzcGxheTogdGFibGUiIGJsb2NrIGxldmVsIGJveCAoIzEpLgotICAgIC8vIDIu
IFRoZSB0YWJsZSB3cmFwcGVyIGJveCdzIHdpZHRoIHByb3BlcnR5IGlzIHNldCB0byBhdXRvICgj
MykuCi0gICAgLy8gMy4gU2luY2UgaXQgZXN0YWJsaXNoZXMgYSBuZXcgYmxvY2sgZm9ybWF0dGlu
ZyBjb250ZXh0LCB0aGUgYXZhaWxhYmxlIGhvcml6b250YWwgc3BhY2UgZ2V0cyBzaHJ1bmsgYnkg
dGhlIGZsb2F0ICgjNCkKLSAgICAvLyA0LiBUaGUgdGFibGUgd3JhcHBlciBib3gncyB1c2VkIHdp
ZHRoIGNvbXB1dGVzIHRvIDUwMHB4IC0gMTAwcHggLT4gNDAwcHg7Ci0gICAgLy8KLSAgICAvLyBO
b3cgd2UgYXJlIGluc2lkZSB0aGUgQkZDIGVzdGFibGlzaGVkIGJ5IHRoZSB0YWJsZSB3cmFwcGVy
IGJveCBhbmQgdHJ5IHRvIHJlc29sdmUgdGhlIHRhYmxlJ3Mgd2lkdGggLT4gJTEwLgotICAgIC8v
IEFjY29yZGluZyB0byB0aGUgbm9ybWFsIEJGQyBydWxlcywgaXQgc2hvdWxkIGNvbXB1dGUgdG8g
MTAlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrJ3MgbG9naWNhbCB3aWR0aDogNDAwcHggLT4gNDBw
eC4KLSAgICAvLyBIb3dldmVyIGluIHByYWN0aWNlIGl0IGNvbXB1dGVzIHRvIDUwcHggKDEwJSBv
ZiA1MDBweCkuCi0gICAgLy8gU2ltaWxhciBzZXR1cCB3aXRoIG5vbi10YWJsZSBjb250ZW50IHdv
dWxkIHJlc29sdmUgdGhlIGlubmVyIGJsb2NrIGxldmVsIGJveCdzIHdpZHRoIHRvIDQwcHg7Ci0g
ICAgLy8gVGhpcyBuZWVkcyBjbGFyaWZpY2F0aW9uIGluIHRoZSBzcGVjLgotICAgIGF1dG8gaG9y
aXpvbnRhbENvbnN0cmFpbnRGb3JSZXNvbHZpbmdXaWR0aCA9IG1faG9yaXpvbnRhbENvbnN0cmFp
bnRzSWdub3JpbmdGbG9hdHMubG9naWNhbFdpZHRoOwotICAgIGF1dG8gZ2VvbWV0cnkgPSB0aGlz
LT5nZW9tZXRyeSgpOwotICAgIGF1dG8gY29tcHV0ZWRXaWR0aCA9IGdlb21ldHJ5LmNvbXB1dGVk
V2lkdGgodGFibGVCb3gsIGhvcml6b250YWxDb25zdHJhaW50Rm9yUmVzb2x2aW5nV2lkdGgpOwot
ICAgIGF1dG8gY29tcHV0ZWRNYXhXaWR0aCA9IGdlb21ldHJ5LmNvbXB1dGVkTWF4V2lkdGgodGFi
bGVCb3gsIGhvcml6b250YWxDb25zdHJhaW50Rm9yUmVzb2x2aW5nV2lkdGgpOwotICAgIGF1dG8g
Y29tcHV0ZWRNaW5XaWR0aCA9IGdlb21ldHJ5LmNvbXB1dGVkTWluV2lkdGgodGFibGVCb3gsIGhv
cml6b250YWxDb25zdHJhaW50Rm9yUmVzb2x2aW5nV2lkdGgpOwotICAgIC8vIFVzZSB0aGUgZ2Vu
ZXJpYyBzaHJpbmstdG8tZml0LXdpZHRoIGxvZ2ljIGFzIHRoZSBpbml0aWFsIHdpZHRoIGZvciB0
aGUgdGFibGUuCi0gICAgYXV0byB1c2VkV2lkdGggPSBzdGQ6Om1pbihzdGQ6Om1heChpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0sIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSksIGlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSk7Ci0gICAgaWYgKGNvbXB1dGVkV2lkdGgg
fHwgY29tcHV0ZWRNaW5XaWR0aCB8fCBjb21wdXRlZE1heFdpZHRoKSB7Ci0gICAgICAgIGlmIChj
b21wdXRlZFdpZHRoKSB7Ci0gICAgICAgICAgICAvLyBOb3JtYWxpemUgdGhlIGNvbXB1dGVkIHdp
ZHRoIHZhbHVlIGZpcnN0LgotICAgICAgICAgICAgaWYgKGNvbXB1dGVkTWF4V2lkdGggJiYgKmNv
bXB1dGVkV2lkdGggPiAqY29tcHV0ZWRNYXhXaWR0aCkKLSAgICAgICAgICAgICAgICBjb21wdXRl
ZFdpZHRoID0gY29tcHV0ZWRNYXhXaWR0aDsKLSAgICAgICAgICAgIGlmIChjb21wdXRlZE1pbldp
ZHRoICYmICpjb21wdXRlZFdpZHRoIDwgKmNvbXB1dGVkTWluV2lkdGgpCi0gICAgICAgICAgICAg
ICAgY29tcHV0ZWRXaWR0aCA9IGNvbXB1dGVkTWluV2lkdGg7Ci0gICAgICAgICAgICB1c2VkV2lk
dGggPSAqY29tcHV0ZWRXaWR0aCA8IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSA/
IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSA6ICpjb21wdXRlZFdpZHRoOwotICAg
ICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbXB1dGVkTWF4V2lkdGggJiYgKmNvbXB1dGVkTWF4V2lk
dGggPCB1c2VkV2lkdGgpCi0gICAgICAgICAgICB1c2VkV2lkdGggPSBpbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzLm1pbmltdW07Ci0gICAgICAgIGlmIChjb21wdXRlZE1pbldpZHRoICYmICpjb21w
dXRlZE1pbldpZHRoID4gdXNlZFdpZHRoKQotICAgICAgICAgICAgdXNlZFdpZHRoID0gKmNvbXB1
dGVkTWluV2lkdGg7Ci0gICAgfQotCi0gICAgYXV0byBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBn
ZW9tZXRyeS5pbkZsb3dDb250ZW50V2lkdGhBbmRNYXJnaW4odGFibGVCb3gsIGhvcml6b250YWxD
b25zdHJhaW50cywgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMgeyB1c2VkV2lkdGgsIHsgfSB9
KTsKLQotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0
cnkodGFibGVCb3gpOwotICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChjb250ZW50
V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKTsKLSAgICBib3hHZW9tZXRyeS5zZXRIb3Jpem9u
dGFsTWFyZ2luKHsgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uc3RhcnQsIGNvbnRl
bnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLmVuZCB9KTsKLX0KLQotdm9pZCBUYWJsZVdyYXBw
ZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlSGVpZ2h0QW5kTWFyZ2luRm9yVGFibGVC
b3goY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZs
b3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBBU1NFUlQodGFibGVCb3guaXNUYWJsZUJv
eCgpKTsKLSAgICAvLyBUYWJsZSBpcyBhIHNwZWNpYWwgQkZDIGNvbnRlbnQuIEl0cyBoZWlnaHQg
aXMgbWFpbmx5IGRyaXZlbiBieSB0aGUgY29udGVudC4gQ29tcHV0ZWQgaGVpZ2h0LCBtaW4taGVp
Z2h0IGFuZCBtYXgtaGVpZ2h0IGFyZSBhbGwKLSAgICAvLyBhbHJlYWR5IGJlZW4gdGFrZW4gaW50
byBhY2NvdW50IGR1cmluZyB0aGUgVEZDIGxheW91dC4KLSAgICBhdXRvIGhlaWdodEFuZE1hcmdp
biA9IGdlb21ldHJ5KCkuaW5GbG93Q29udGVudEhlaWdodEFuZE1hcmdpbih0YWJsZUJveCwgY29u
c3RyYWludHMuaG9yaXpvbnRhbCwgeyBxdWlya3MoKS5vdmVycmlkZGVuVGFibGVIZWlnaHQodGFi
bGVCb3gpIH0pOwotCi0gICAgYXV0byBtYXJnaW5Db2xsYXBzZSA9IHRoaXMtPm1hcmdpbkNvbGxh
cHNlKCk7Ci0gICAgYXV0byB2ZXJ0aWNhbE1hcmdpbiA9IG1hcmdpbkNvbGxhcHNlLmNvbGxhcHNl
ZFZlcnRpY2FsVmFsdWVzKHRhYmxlQm94LCBoZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFy
Z2luKTsKLSAgICAvLyBDYWNoZSB0aGUgY29tcHV0ZWQgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1h
cmdpbiB2YWx1ZSBwYWlyLgotICAgIGZvcm1hdHRpbmdTdGF0ZSgpLnNldFVzZWRWZXJ0aWNhbE1h
cmdpbih0YWJsZUJveCwgdmVydGljYWxNYXJnaW4pOwotCi0gICAgYXV0byYgYm94R2VvbWV0cnkg
PSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSh0YWJsZUJveCk7Ci0gICAgYm94R2VvbWV0
cnkuc2V0TG9naWNhbFRvcCh2ZXJ0aWNhbFBvc2l0aW9uV2l0aE1hcmdpbih0YWJsZUJveCwgdmVy
dGljYWxNYXJnaW4sIGNvbnN0cmFpbnRzLnZlcnRpY2FsKSk7Ci0gICAgYm94R2VvbWV0cnkuc2V0
Q29udGVudEJveEhlaWdodChoZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCk7Ci0gICAgYm94
R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyBtYXJnaW5CZWZvcmUodmVydGljYWxNYXJnaW4p
LCBtYXJnaW5BZnRlcih2ZXJ0aWNhbE1hcmdpbikgfSk7Ci0gICAgLy8gQWRqdXN0IHRoZSBwcmV2
aW91cyBzaWJsaW5nJ3MgbWFyZ2luIGJvdHRvbSBub3cgdGhhdCB0aGlzIGJveCdzIHZlcnRpY2Fs
IG1hcmdpbiBpcyBjb21wdXRlZC4KLSAgICBNYXJnaW5Db2xsYXBzZTo6dXBkYXRlTWFyZ2luQWZ0
ZXJGb3JQcmV2aW91c1NpYmxpbmcoKnRoaXMsIG1hcmdpbkNvbGxhcHNlLCB0YWJsZUJveCk7Ci19
Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxv
Y2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBl
ci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDBkZWExNTdjYzUyMTZmODg0ZmQyODk4MzRhM2M4NjY5NTM3NDI3YTUuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tG
b3JtYXR0aW5nQ29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
Ci0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgot
ICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRF
WFQpCi0KLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSA8d3Rm
L0lzb01hbGxvYy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsK
LQotLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzcGVjaWFsIGJsb2NrIGZvcm1hdHRpbmcg
Y29udGV4dCBsYXlvdXQgbG9naWMgZm9yIHRoZSB0YWJsZSB3cmFwcGVyLgotLy8gaHR0cHM6Ly93
d3cudzMub3JnL1RSL0NTUzIyL3RhYmxlcy5odG1sI21vZGVsCi1jbGFzcyBUYWJsZVdyYXBwZXJC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0IGZpbmFsIDogcHVibGljIEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQgewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0
aW5nQ29udGV4dCk7Ci1wdWJsaWM6Ci0gICAgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgQmxvY2tGb3Jt
YXR0aW5nU3RhdGUmKTsKLQotICAgIHZvaWQgbGF5b3V0SW5GbG93Q29udGVudChJbnZhbGlkYXRp
b25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpIGZpbmFsOwotCi0g
ICAgdm9pZCBzZXRIb3Jpem9udGFsQ29uc3RyYWludHNJZ25vcmluZ0Zsb2F0cyhjb25zdCBIb3Jp
em9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykgeyBtX2hvcml6b250YWxD
b25zdHJhaW50c0lnbm9yaW5nRmxvYXRzID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzOyB9Ci0KLXBy
aXZhdGU6Ci0gICAgY2xhc3MgUXVpcmtzIDogcHVibGljIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
OlF1aXJrcyB7Ci0gICAgcHVibGljOgotICAgICAgICBRdWlya3MoY29uc3QgVGFibGVXcmFwcGVy
QmxvY2tGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0gICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+
IG92ZXJyaWRkZW5UYWJsZUhlaWdodChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KSBjb25z
dDsKLSAgICB9OwotICAgIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJr
cyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9Ci0KLSAgICB2b2lkIGxh
eW91dFRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gsIGNvbnN0IENvbnN0cmFp
bnRzRm9ySW5GbG93Q29udGVudCYpOwotCi0gICAgdm9pZCBjb21wdXRlQm9yZGVyQW5kUGFkZGlu
Z0ZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYpOwotICAgIHZvaWQgY29tcHV0ZVdpZHRoQW5kTWFyZ2luRm9yVGFibGVCb3goY29uc3Qg
Q29udGFpbmVyQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7Ci0gICAgdm9pZCBj
b21wdXRlSGVpZ2h0QW5kTWFyZ2luRm9yVGFibGVCb3goY29uc3QgQ29udGFpbmVyQm94JiwgY29u
c3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jik7Ci0KLXByaXZhdGU6Ci0gICAgSG9yaXpv
bnRhbENvbnN0cmFpbnRzIG1faG9yaXpvbnRhbENvbnN0cmFpbnRzSWdub3JpbmdGbG9hdHM7Ci19
OwotCi1pbmxpbmUgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpR
dWlya3MoY29uc3QgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGlu
Z0NvbnRleHQpCi0gICAgOiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MoZm9ybWF0dGlu
Z0NvbnRleHQpCi17Ci19Ci0KLX0KLX0KLQotU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19MQVlPVVRf
Rk9STUFUVElOR19DT05URVhUKFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQsIGlz
VGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpKQotCi0jZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1Rh
YmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwIGIvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tG
b3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IGVhZGE5MmVkMjhmNzk3ZjNiODI2YjBmYjkxNTQyNWViNzg5YmI5OTUuLjAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Js
b2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dFF1aXJrcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
LSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0g
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlRhYmxlV3JhcHBlckJsb2NrRm9ybWF0
dGluZ0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQot
Ci0jaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNw
YWNlIExheW91dCB7Ci0KLU9wdGlvbmFsPExheW91dFVuaXQ+IFRhYmxlV3JhcHBlckJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6b3ZlcnJpZGRlblRhYmxlSGVpZ2h0KGNvbnN0IENvbnRh
aW5lckJveCYgdGFibGVCb3gpIGNvbnN0Ci17Ci0gICAgaWYgKGxheW91dFN0YXRlKCkuaW5RdWly
a3NNb2RlKCkpIHsKLSAgICAgICAgLy8gSW4gcXVpcmtzIG1vZGUgYWx3YXlzIHVzZSB0aGUgY29u
dGVudCBoZWlnaHQuIE5vdGUgdGhhdCB0aGUgdGFibGVzIHdpdGggY29udGVudCB0YWtlIGNvbXB1
dGVkIHZhbHVlcyBpbnRvIGFjY291bnQuCi0gICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmNvbnRl
bnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QodGFibGVCb3gpOwotICAgIH0KLSAgICBy
ZXR1cm4gdGFibGVCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkgPyBnZW9tZXRyeSgpLmNv
bnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QodGFibGVCb3gpIDogT3B0aW9uYWw8
TGF5b3V0VW5pdD4geyB9OwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250
ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1N2ZkNjk5MDQyODY5N2U4
NWQxNzFmNmQzYWM4ZDU4N2FjYWNmOC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZv
cm1hdHRpbmdDb250ZXh0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgot
ICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAq
Ci0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
Ci0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkZsZXhGb3JtYXR0aW5nQ29u
dGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNs
dWRlICJGbGV4Rm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiSW5saW5lUmVjdC5oIgotI2lu
Y2x1ZGUgIkludmFsaWRhdGlvblN0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnku
aCIKLSNpbmNsdWRlICJMYXlvdXRDaGlsZEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29u
dGV4dC5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBX
ZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lN
UEwoRmxleEZvcm1hdHRpbmdDb250ZXh0KTsKLQotRmxleEZvcm1hdHRpbmdDb250ZXh0OjpGbGV4
Rm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJv
b3QsIEZsZXhGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSkKLSAgICA6IEZvcm1hdHRp
bmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgZm9ybWF0dGluZ1N0YXRlKQotewotfQot
Ci12b2lkIEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0SW5GbG93Q29udGVudChJbnZhbGlk
YXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWlu
dHMpCi17Ci0gICAgY29tcHV0ZUludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JGbGV4SXRlbXMo
KTsKLSAgICBzaXplQW5kUGxhY2VGbGV4SXRlbXMoY29uc3RyYWludHMpOwotfQotCi1MYXlvdXRV
bml0IEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdAotewot
ICAgIGF1dG8mIGxpbmVzID0gZm9ybWF0dGluZ1N0YXRlKCkubGluZXMoKTsKLSAgICByZXR1cm4g
TGF5b3V0VW5pdCB7IGxpbmVzLmxhc3QoKS5ib3R0b20oKSAtIGxpbmVzLmZpcnN0KCkudG9wKCkg
fTsKLX0KLQotRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgRmxl
eEZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKQot
ewotICAgIHJldHVybiB7IH07Ci19Ci0KLXZvaWQgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpzaXpl
QW5kUGxhY2VGbGV4SXRlbXMoY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25z
dHJhaW50cykKLXsKLSAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5n
U3RhdGUoKTsKLSAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2VvbWV0cnkoKTsKLSAgICBhdXRv
IGZsZXhJdGVtTWFpbkF4aXNTdGFydCA9IGNvbnN0cmFpbnRzLmhvcml6b250YWwubG9naWNhbExl
ZnQ7Ci0gICAgYXV0byBmbGV4SXRlbU1haW5BeGlzRW5kID0gZmxleEl0ZW1NYWluQXhpc1N0YXJ0
OwotICAgIGF1dG8gZmxleEl0ZW1Dcm9zQXhpc1N0YXJ0ID0gY29uc3RyYWludHMudmVydGljYWwu
bG9naWNhbFRvcDsKLSAgICBhdXRvIGZsZXhJdGVtQ3Jvc0F4aXNFbmQgPSBmbGV4SXRlbUNyb3NB
eGlzU3RhcnQ7Ci0gICAgZm9yIChhdXRvJiBmbGV4SXRlbSA6IGNoaWxkcmVuT2ZUeXBlPENvbnRh
aW5lckJveD4ocm9vdCgpKSkgewotICAgICAgICBBU1NFUlQoZmxleEl0ZW0uZXN0YWJsaXNoZXNG
b3JtYXR0aW5nQ29udGV4dCgpKTsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMganVzdCBhIHNp
bXBsZSwgbGV0J3MgbGF5b3V0IHRoZSBmbGV4IGl0ZW1zIGFuZCBwbGFjZSB0aGVtIG5leHQgdG8g
ZWFjaCBvdGhlciBzZXR1cC4KLSAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aHMgPSBmb3JtYXR0
aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChmbGV4SXRlbSk7Ci0gICAg
ICAgIGF1dG8gZmxleEl0ZW1Mb2dpY2FsV2lkdGggPSBzdGQ6Om1pbihzdGQ6Om1heChpbnRyaW5z
aWNXaWR0aHMtPm1pbmltdW0sIGNvbnN0cmFpbnRzLmhvcml6b250YWwubG9naWNhbFdpZHRoKSwg
aW50cmluc2ljV2lkdGhzLT5tYXhpbXVtKTsKLSAgICAgICAgYXV0byBmbGV4SXRlbUNvbnN0cmFp
bnRzID0gQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IHsgeyB7IH0sIGZsZXhJdGVtTG9naWNh
bFdpZHRoIH0sIHsgfSB9OwotCi0gICAgICAgIGF1dG8gaW52YWxpZGF0aW9uU3RhdGUgPSBJbnZh
bGlkYXRpb25TdGF0ZSB7IH07Ci0gICAgICAgIExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRp
bmdDb250ZXh0KGZsZXhJdGVtLCBsYXlvdXRTdGF0ZSgpKS0+bGF5b3V0SW5GbG93Q29udGVudChp
bnZhbGlkYXRpb25TdGF0ZSwgZmxleEl0ZW1Db25zdHJhaW50cyk7Ci0KLSAgICAgICAgYXV0byBj
b21wdXRlRmxleEl0ZW1HZW9tZXRyeSA9IFsmXSB7Ci0gICAgICAgICAgICBhdXRvJiBmbGV4SXRl
bUdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGZsZXhJdGVtKTsKLQotICAg
ICAgICAgICAgZmxleEl0ZW1HZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVmdChMYXlvdXRQb2ludCB7
IGZsZXhJdGVtTWFpbkF4aXNFbmQsIGZsZXhJdGVtQ3Jvc0F4aXNTdGFydCB9KTsKLQotICAgICAg
ICAgICAgZmxleEl0ZW1HZW9tZXRyeS5zZXRCb3JkZXIoZ2VvbWV0cnkuY29tcHV0ZWRCb3JkZXIo
ZmxleEl0ZW0pKTsKLSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0UGFkZGluZyhnZW9t
ZXRyeS5jb21wdXRlZFBhZGRpbmcoZmxleEl0ZW0sIGNvbnN0cmFpbnRzLmhvcml6b250YWwubG9n
aWNhbFdpZHRoKSk7Ci0KLSAgICAgICAgICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
ID0gZ2VvbWV0cnkuY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKGZsZXhJdGVtLCBjb25zdHJhaW50
cy5ob3Jpem9udGFsKTsKLSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0SG9yaXpvbnRh
bE1hcmdpbih7IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDBfbHUpLCBj
b21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMF9sdSkgfSk7Ci0KLSAgICAgICAg
ICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkVmVydGlj
YWxNYXJnaW4oZmxleEl0ZW0sIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwotICAgICAgICAgICAg
ZmxleEl0ZW1HZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IGNvbXB1dGVkVmVydGljYWxNYXJn
aW4uYmVmb3JlLnZhbHVlT3IoMF9sdSksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFs
dWVPcigwX2x1KSB9KTsKLQotICAgICAgICAgICAgZmxleEl0ZW1HZW9tZXRyeS5zZXRDb250ZW50
Qm94SGVpZ2h0KGdlb21ldHJ5LmNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3Qo
ZmxleEl0ZW0pKTsKLSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0Q29udGVudEJveFdp
ZHRoKGZsZXhJdGVtTG9naWNhbFdpZHRoKTsKLSAgICAgICAgICAgIGZsZXhJdGVtTWFpbkF4aXNF
bmQ9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGZsZXhJdGVtR2VvbWV0cnkpLnJpZ2h0KCk7
Ci0gICAgICAgICAgICBmbGV4SXRlbUNyb3NBeGlzRW5kID0gc3RkOjptYXgoZmxleEl0ZW1Dcm9z
QXhpc0VuZCwgQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QoZmxleEl0ZW1HZW9tZXRyeSkuYm90
dG9tKCkpOwotICAgICAgICB9OwotICAgICAgICBjb21wdXRlRmxleEl0ZW1HZW9tZXRyeSgpOwot
ICAgIH0KLSAgICBhdXRvIGZsZXhMaW5lID0gSW5saW5lUmVjdCB7IGZsZXhJdGVtQ3Jvc0F4aXNT
dGFydCwgZmxleEl0ZW1NYWluQXhpc1N0YXJ0LCBmbGV4SXRlbU1haW5BeGlzRW5kIC0gZmxleEl0
ZW1NYWluQXhpc1N0YXJ0LCBmbGV4SXRlbUNyb3NBeGlzRW5kIC0gZmxleEl0ZW1Dcm9zQXhpc1N0
YXJ0IH07Ci0gICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmUoZmxleExpbmUpOwotfQotCi12b2lk
IEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUludHJpbnNpY1dpZHRoQ29uc3RyYWludHNG
b3JGbGV4SXRlbXMoKQotewotICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1h
dHRpbmdTdGF0ZSgpOwotICAgIGF1dG8gZ2VvbWV0cnkgPSB0aGlzLT5nZW9tZXRyeSgpOwotICAg
IGZvciAoYXV0byYgZmxleEl0ZW0gOiBjaGlsZHJlbk9mVHlwZTxDb250YWluZXJCb3g+KHJvb3Qo
KSkpIHsKLSAgICAgICAgaWYgKGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzRm9yQm94KGZsZXhJdGVtKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBmb3Jt
YXR0aW5nU3RhdGUuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChmbGV4SXRlbSwg
Z2VvbWV0cnkuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhmbGV4SXRlbSkpOwotICAgIH0KLX0K
LQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mbGV4
Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggODFhMGU0MDY5ZmZkMTAyOTY4OGNjNTE2Y2ZkOTU5MGNjYzkzNjUyYi4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmgKKysrIC9k
ZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAot
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
Ci0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwot
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICog
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNp
ZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZsZXhGb3Jt
YXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUg
PHd0Zi9Jc29NYWxsb2MuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91
dCB7Ci0KLWNsYXNzIEludmFsaWRhdGlvblN0YXRlOwotLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRz
IHRoZSBsYXlvdXQgbG9naWMgZm9yIGZsZXggZm9ybWF0dGluZyBjb250ZXh0cy4KLS8vIGh0dHBz
Oi8vd3d3LnczLm9yZy9UUi9jc3MtZmxleGJveC0xLwotY2xhc3MgRmxleEZvcm1hdHRpbmdDb250
ZXh0IGZpbmFsIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0IHsKLSAgICBXVEZfTUFLRV9JU09f
QUxMT0NBVEVEKEZsZXhGb3JtYXR0aW5nQ29udGV4dCk7Ci1wdWJsaWM6Ci0gICAgRmxleEZvcm1h
dHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBG
bGV4Rm9ybWF0dGluZ1N0YXRlJik7Ci0gICAgdm9pZCBsYXlvdXRJbkZsb3dDb250ZW50KEludmFs
aWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jikgb3ZlcnJp
ZGU7Ci0gICAgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0IG92ZXJyaWRlOwot
Ci0gICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMoKSBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICAvLyBUaGlzIGNsYXNzIGltcGxl
bWVudHMgcG9zaXRpb25pbmcgYW5kIHNpemluZyBmb3IgZmxleCBpdGVtcy4KLSAgICBjbGFzcyBH
ZW9tZXRyeSA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgewotICAgIHB1Ymxp
YzoKLSAgICAgICAgR2VvbWV0cnkoY29uc3QgRmxleEZvcm1hdHRpbmdDb250ZXh0Jik7Ci0KLSAg
ICAgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
KGNvbnN0IENvbnRhaW5lckJveCYpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgY29uc3QgRmxl
eEZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGRv
d25jYXN0PEZsZXhGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5
Ojpmb3JtYXR0aW5nQ29udGV4dCgpKTsgfQotICAgIH07Ci0gICAgRmxleEZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlzKTsg
fQotCi0gICAgdm9pZCBzaXplQW5kUGxhY2VGbGV4SXRlbXMoY29uc3QgQ29uc3RyYWludHNGb3JJ
bkZsb3dDb250ZW50Jik7Ci0gICAgdm9pZCBjb21wdXRlSW50cmluc2ljV2lkdGhDb25zdHJhaW50
c0ZvckZsZXhJdGVtcygpOwotCi0gICAgY29uc3QgRmxleEZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0
dGluZ1N0YXRlKCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8RmxleEZvcm1hdHRpbmdTdGF0ZT4o
Rm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQotICAgIEZsZXhGb3JtYXR0
aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIGRvd25jYXN0PEZsZXhGb3JtYXR0
aW5nU3RhdGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KLX07Ci0K
LWlubGluZSBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpHZW9tZXRyeShjb25zdCBG
bGV4Rm9ybWF0dGluZ0NvbnRleHQmIGZsZXhGb3JtYXR0aW5nQ29udGV4dCkKLSAgICA6IEZvcm1h
dHRpbmdDb250ZXh0OjpHZW9tZXRyeShmbGV4Rm9ybWF0dGluZ0NvbnRleHQpCi17Ci19Ci0KLX0K
LX0KLQotU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19MQVlPVVRfRk9STUFUVElOR19DT05URVhUKEZs
ZXhGb3JtYXR0aW5nQ29udGV4dCwgaXNGbGV4Rm9ybWF0dGluZ0NvbnRleHQoKSkKLQotI2VuZGlm
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZv
cm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhm
b3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggZGM3YzhkZDA5ODA5ZDFkMGI1ODRhYmZmNzhkZDE3OTFiZmY0Njg5
OC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0R2VvbWV0
cnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
QykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNs
dWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJGbGV4Rm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lm
IEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiRmxleEZvcm1h
dHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAi
TGF5b3V0Q29udGV4dC5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0
IHsKLQotRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgRmxleEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25z
dCBDb250YWluZXJCb3gmIGZsZXhJdGVtKQotewotICAgIGF1dG8gZml4ZWRNYXJnaW5Cb3JkZXJB
bmRQYWRkaW5nID0gWyZdKGF1dG8mIGxheW91dEJveCkgewotICAgICAgICBhdXRvJiBzdHlsZSA9
IGxheW91dEJveC5zdHlsZSgpOwotICAgICAgICByZXR1cm4gZml4ZWRWYWx1ZShzdHlsZS5tYXJn
aW5TdGFydCgpKS52YWx1ZU9yKDApCi0gICAgICAgICAgICArIExheW91dFVuaXQgeyBzdHlsZS5i
b3JkZXJMZWZ0V2lkdGgoKSB9Ci0gICAgICAgICAgICArIGZpeGVkVmFsdWUoc3R5bGUucGFkZGlu
Z0xlZnQoKSkudmFsdWVPcigwKQotICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0eWxlLnBhZGRp
bmdSaWdodCgpKS52YWx1ZU9yKDApCi0gICAgICAgICAgICArIExheW91dFVuaXQgeyBzdHlsZS5i
b3JkZXJSaWdodFdpZHRoKCkgfQotICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0eWxlLm1hcmdp
bkVuZCgpKS52YWx1ZU9yKDApOwotICAgIH07Ci0KLSAgICBhdXRvIGNvbXB1dGVkSW50cmluc2lj
V2lkdGhDb25zdHJhaW50cyA9IFsmXSgpIC0+IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgewot
ICAgICAgICBhdXRvIGxvZ2ljYWxXaWR0aCA9IGZsZXhJdGVtLnN0eWxlKCkubG9naWNhbFdpZHRo
KCk7Ci0gICAgICAgIC8vIE1pbmltdW0vbWF4aW11bSB3aWR0aCBjYW4ndCBiZSBkZXBlbmRpbmcg
b24gdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0aC4KLSAgICAgICAgYXV0byBuZWVkc1Jlc29s
dmVkQ29udGFpbmluZ0Jsb2NrV2lkdGggPSBsb2dpY2FsV2lkdGguaXNDYWxjdWxhdGVkKCkgfHwg
bG9naWNhbFdpZHRoLmlzUGVyY2VudCgpIHx8IGxvZ2ljYWxXaWR0aC5pc1JlbGF0aXZlKCk7Ci0g
ICAgICAgIGlmIChuZWVkc1Jlc29sdmVkQ29udGFpbmluZ0Jsb2NrV2lkdGgpCi0gICAgICAgICAg
ICByZXR1cm4geyB9OwotCi0gICAgICAgIGlmIChhdXRvIHdpZHRoID0gZml4ZWRWYWx1ZShsb2dp
Y2FsV2lkdGgpKQotICAgICAgICAgICAgcmV0dXJuIHsgKndpZHRoLCAqd2lkdGggfTsKLQotICAg
ICAgICBBU1NFUlQoZmxleEl0ZW0uZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKLSAg
ICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gTGF5b3V0Q29udGV4dDo6Y3Jl
YXRlRm9ybWF0dGluZ0NvbnRleHQoZmxleEl0ZW0sIGxheW91dFN0YXRlKCkpLT5jb21wdXRlZElu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKLSAgICAgICAgaWYgKGxvZ2ljYWxXaWR0aC5pc01p
bkNvbnRlbnQoKSkKLSAgICAgICAgICAgIHJldHVybiB7IGludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMubWluaW11bSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtIH07Ci0gICAgICAg
IGlmIChsb2dpY2FsV2lkdGguaXNNYXhDb250ZW50KCkpCi0gICAgICAgICAgICByZXR1cm4geyBp
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIGludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMubWF4aW11bSB9OwotICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsK
LSAgICB9OwotICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGNvbnN0cmFpbkJ5
TWluTWF4V2lkdGgoZmxleEl0ZW0sIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygp
KTsKLSAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLmV4cGFuZChmaXhlZE1hcmdpbkJvcmRl
ckFuZFBhZGRpbmcoZmxleEl0ZW0pKTsKLSAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJh
aW50czsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ1N0YXRlLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ1N0YXRlLmNwcApkZWxldGVk
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5ZmM4NWEwMzg1MmQzMzUyNjEzODQwZjMxMjJjNzMz
YzU0ZmFhMC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5j
cHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAy
MDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUg
ImNvbmZpZy5oIgotI2luY2x1ZGUgIkZsZXhGb3JtYXR0aW5nU3RhdGUuaCIKLQotI2lmIEVOQUJM
RShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lu
bGluZXMuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLVdU
Rl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChGbGV4Rm9ybWF0dGluZ1N0YXRlKTsKLQotRmxleEZv
cm1hdHRpbmdTdGF0ZTo6RmxleEZvcm1hdHRpbmdTdGF0ZShSZWY8RmxvYXRpbmdTdGF0ZT4mJiBm
bG9hdGluZ1N0YXRlLCBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCi0gICAgOiBGb3JtYXR0aW5n
U3RhdGUoV1RGTW92ZShmbG9hdGluZ1N0YXRlKSwgVHlwZTo6RmxleCwgbGF5b3V0U3RhdGUpCi17
Ci19Ci0KLUZsZXhGb3JtYXR0aW5nU3RhdGU6On5GbGV4Rm9ybWF0dGluZ1N0YXRlKCkKLXsKLX0K
LQotfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxleGZv
cm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zs
ZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggYTA2M2I5ZGEyYTViOGRjMjcwMjA4Nzk0YTQ4MzY1NDQxNjA5ZTNhMy4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5oCisrKyAvZGV2L251bGwK
QEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFy
ZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxF
KExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUu
aCIKLSNpbmNsdWRlICJJbmxpbmVSZWN0LmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgot
Ci1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgRmxleEZv
cm1hdHRpbmdTdGF0ZSA6IHB1YmxpYyBGb3JtYXR0aW5nU3RhdGUgewotICAgIFdURl9NQUtFX0lT
T19BTExPQ0FURUQoRmxleEZvcm1hdHRpbmdTdGF0ZSk7Ci1wdWJsaWM6Ci0gICAgRmxleEZvcm1h
dHRpbmdTdGF0ZShSZWY8RmxvYXRpbmdTdGF0ZT4mJiwgTGF5b3V0U3RhdGUmKTsKLSAgICB+Rmxl
eEZvcm1hdHRpbmdTdGF0ZSgpOwotCi0gICAgY29uc3QgYXV0byYgbGluZXMoKSBjb25zdCB7IHJl
dHVybiBtX2xpbmVzOyB9Ci0gICAgdm9pZCBhZGRMaW5lKGNvbnN0IElubGluZVJlY3QmIGxpbmUp
IHsgbV9saW5lcy5hcHBlbmQobGluZSk7IH0KLQotcHJpdmF0ZToKLSAgICBWZWN0b3I8SW5saW5l
UmVjdD4gbV9saW5lczsKLX07Ci0KLX0KLX0KLQotU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19MQVlP
VVRfRk9STUFUVElOR19TVEFURShGbGV4Rm9ybWF0dGluZ1N0YXRlLCBpc0ZsZXhGb3JtYXR0aW5n
U3RhdGUoKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL0Zvcm1hdHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHQuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
Ljk4NTdkYmEyYzdkNjUyOTYwYzQxMWZhYmNhMzU3NTg2OTViYTExMjgKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL0Zvcm1hdHRpbmdD
b250ZXh0LmNwcApAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
KyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgor
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9V
VF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUuaCIKKyNp
bmNsdWRlICJJbnZhbGlkYXRpb25TdGF0ZS5oIgorI2luY2x1ZGUgIkxheW91dEJveC5oIgorI2lu
Y2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94
LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgorI2luY2x1ZGUgIkxheW91dERlc2NlbmRh
bnRJdGVyYXRvci5oIgorI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIK
KyNpbmNsdWRlICJMYXlvdXRSZXBsYWNlZEJveC5oIgorI2luY2x1ZGUgIkxheW91dFN0YXRlLmgi
CisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+
CisjaW5jbHVkZSA8d3RmL3RleHQvVGV4dFN0cmVhbS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CituYW1lc3BhY2UgTGF5b3V0IHsKKworV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEZvcm1h
dHRpbmdDb250ZXh0KTsKKworRm9ybWF0dGluZ0NvbnRleHQ6OkZvcm1hdHRpbmdDb250ZXh0KGNv
bnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBGb3JtYXR0aW5nU3RhdGUm
IGZvcm1hdHRpbmdTdGF0ZSkKKyAgICA6IG1fcm9vdChtYWtlV2Vha1B0cihmb3JtYXR0aW5nQ29u
dGV4dFJvb3QpKQorICAgICwgbV9mb3JtYXR0aW5nU3RhdGUoZm9ybWF0dGluZ1N0YXRlKQorewor
ICAgIEFTU0VSVChmb3JtYXR0aW5nQ29udGV4dFJvb3QuaGFzQ2hpbGQoKSk7CisjaWZuZGVmIE5E
RUJVRworICAgIGxheW91dFN0YXRlKCkucmVnaXN0ZXJGb3JtYXR0aW5nQ29udGV4dCgqdGhpcyk7
CisjZW5kaWYKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6On5Gb3JtYXR0aW5nQ29udGV4dCgpCit7
CisjaWZuZGVmIE5ERUJVRworICAgIGxheW91dFN0YXRlKCkuZGVyZWdpc3RlckZvcm1hdHRpbmdD
b250ZXh0KCp0aGlzKTsKKyNlbmRpZgorfQorCitMYXlvdXRTdGF0ZSYgRm9ybWF0dGluZ0NvbnRl
eHQ6OmxheW91dFN0YXRlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mb3JtYXR0aW5nU3RhdGUu
bGF5b3V0U3RhdGUoKTsKK30KKwordm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZU91dE9m
Rmxvd0hvcml6b250YWxHZW9tZXRyeShjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29uc3Ry
YWludHNGb3JPdXRPZkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKK3sKKyAgICBBU1NFUlQobGF5
b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKKyAgICBhdXRvIGNvbXB1dGUgPSBbJl0o
T3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZFdpZHRoKSB7CisgICAgICAgIHJldHVybiBnZW9tZXRy
eSgpLm91dE9mRmxvd0hvcml6b250YWxHZW9tZXRyeShsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhv
cml6b250YWwsIGNvbnN0cmFpbnRzLnZlcnRpY2FsLCB7IHVzZWRXaWR0aCwgeyB9IH0pOworICAg
IH07CisKKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gY29uc3RyYWludHMuaG9yaXpv
bnRhbC5sb2dpY2FsV2lkdGg7CisgICAgYXV0byBob3Jpem9udGFsR2VvbWV0cnkgPSBjb21wdXRl
KHsgfSk7CisgICAgaWYgKGF1dG8gbWF4V2lkdGggPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWF4V2lk
dGgobGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tXaWR0aCkpIHsKKyAgICAgICAgYXV0byBtYXhI
b3Jpem9udGFsR2VvbWV0cnkgPSBjb21wdXRlKG1heFdpZHRoKTsKKyAgICAgICAgaWYgKGhvcml6
b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoID4gbWF4SG9y
aXpvbnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCisgICAg
ICAgICAgICBob3Jpem9udGFsR2VvbWV0cnkgPSBtYXhIb3Jpem9udGFsR2VvbWV0cnk7CisgICAg
fQorCisgICAgaWYgKGF1dG8gbWluV2lkdGggPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluV2lkdGgo
bGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tXaWR0aCkpIHsKKyAgICAgICAgYXV0byBtaW5Ib3Jp
em9udGFsR2VvbWV0cnkgPSBjb21wdXRlKG1pbldpZHRoKTsKKyAgICAgICAgaWYgKGhvcml6b250
YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoIDwgbWluSG9yaXpv
bnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCisgICAgICAg
ICAgICBob3Jpem9udGFsR2VvbWV0cnkgPSBtaW5Ib3Jpem9udGFsR2VvbWV0cnk7CisgICAgfQor
CisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShs
YXlvdXRCb3gpOworICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxMZWZ0KGhvcml6b250YWxHZW9t
ZXRyeS5sZWZ0ICsgaG9yaXpvbnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2Vk
TWFyZ2luLnN0YXJ0KTsKKyAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoaG9yaXpv
bnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOworICAgIGF1
dG8mIHVzZWRIb3Jpem9udGFsTWFyZ2luID0gaG9yaXpvbnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0
aEFuZE1hcmdpbi51c2VkTWFyZ2luOworICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJn
aW4oeyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCwgdXNlZEhvcml6b250YWxNYXJnaW4uZW5k
IH0pOworfQorCit2b2lkIEZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlT3V0T2ZGbG93VmVydGlj
YWxHZW9tZXRyeShjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29uc3RyYWludHNGb3JPdXRP
ZkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3V0
T2ZGbG93UG9zaXRpb25lZCgpKTsKKyAgICBhdXRvIGNvbXB1dGUgPSBbJl0oT3B0aW9uYWw8TGF5
b3V0VW5pdD4gdXNlZEhlaWdodCkgeworICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5vdXRPZkZs
b3dWZXJ0aWNhbEdlb21ldHJ5KGxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwgY29u
c3RyYWludHMudmVydGljYWwsIHsgdXNlZEhlaWdodCB9KTsKKyAgICB9OworCisgICAgYXV0byBj
b250YWluaW5nQmxvY2tIZWlnaHQgPSAqY29uc3RyYWludHMudmVydGljYWwubG9naWNhbEhlaWdo
dDsKKyAgICBhdXRvIHZlcnRpY2FsR2VvbWV0cnkgPSBjb21wdXRlKHsgfSk7CisgICAgaWYgKGF1
dG8gbWF4SGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1heEhlaWdodChsYXlvdXRCb3gsIGNv
bnRhaW5pbmdCbG9ja0hlaWdodCkpIHsKKyAgICAgICAgYXV0byBtYXhWZXJ0aWNhbEdlb21ldHJ5
ID0gY29tcHV0ZShtYXhIZWlnaHQpOworICAgICAgICBpZiAodmVydGljYWxHZW9tZXRyeS5jb250
ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPiBtYXhWZXJ0aWNhbEdlb21ldHJ5LmNv
bnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCkKKyAgICAgICAgICAgIHZlcnRpY2Fs
R2VvbWV0cnkgPSBtYXhWZXJ0aWNhbEdlb21ldHJ5OworICAgIH0KKworICAgIGlmIChhdXRvIG1p
bkhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNaW5IZWlnaHQobGF5b3V0Qm94LCBjb250YWlu
aW5nQmxvY2tIZWlnaHQpKSB7CisgICAgICAgIGF1dG8gbWluVmVydGljYWxHZW9tZXRyeSA9IGNv
bXB1dGUobWluSGVpZ2h0KTsKKyAgICAgICAgaWYgKHZlcnRpY2FsR2VvbWV0cnkuY29udGVudEhl
aWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0IDwgbWluVmVydGljYWxHZW9tZXRyeS5jb250ZW50
SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpCisgICAgICAgICAgICB2ZXJ0aWNhbEdlb21l
dHJ5ID0gbWluVmVydGljYWxHZW9tZXRyeTsKKyAgICB9CisKKyAgICBhdXRvJiBib3hHZW9tZXRy
eSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7CisgICAgYXV0byBu
b25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiA9IHZlcnRpY2FsR2VvbWV0cnkuY29udGVudEhlaWdo
dEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW47CisgICAgYm94R2VvbWV0cnkuc2V0TG9naWNh
bFRvcCh2ZXJ0aWNhbEdlb21ldHJ5LnRvcCArIG5vbkNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luLmJl
Zm9yZSk7CisgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodCh2ZXJ0aWNhbEdlb21l
dHJ5LmNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCk7CisgICAgLy8gTWFyZ2lu
cyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgorICAgIGJv
eEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgbm9uQ29sbGFwc2VkVmVydGljYWxNYXJnaW4u
YmVmb3JlLCBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciB9KTsKK30KKwordm9pZCBG
b3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoY29uc3QgQm94JiBsYXlv
dXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnQp
Cit7CisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRy
eShsYXlvdXRCb3gpOworICAgIGJveEdlb21ldHJ5LnNldEJvcmRlcihnZW9tZXRyeSgpLmNvbXB1
dGVkQm9yZGVyKGxheW91dEJveCkpOworICAgIGJveEdlb21ldHJ5LnNldFBhZGRpbmcoZ2VvbWV0
cnkoKS5jb21wdXRlZFBhZGRpbmcobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludC5sb2dp
Y2FsV2lkdGgpKTsKK30KKwordm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0T3V0T2ZGbG93
Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYgaW52YWxpZGF0aW9uU3RhdGUsIGNvbnN0IENvbnN0
cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgTE9HX1dJVEhf
U1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIlN0YXJ0OiBsYXlvdXQg
b3V0LW9mLWZsb3cgY29udGVudCAtPiBjb250ZXh0OiAiIDw8ICZsYXlvdXRTdGF0ZSgpIDw8ICIg
cm9vdDogIiA8PCAmcm9vdCgpKTsKKworICAgIGNvbGxlY3RPdXRPZkZsb3dEZXNjZW5kYW50c0lm
TmVlZGVkKCk7CisKKyAgICBhdXRvIGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94ID0gWyZdIChjb25z
dCBhdXRvJiBvdXRPZkZsb3dCb3gpIHsKKyAgICAgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0g
b3V0T2ZGbG93Qm94LmNvbnRhaW5pbmdCbG9jaygpOworICAgICAgICByZXR1cm4gJmNvbnRhaW5p
bmdCbG9jayA9PSAmcm9vdCgpID8gY29uc3RyYWludHMgOiBnZW9tZXRyeSgpLmNvbnN0cmFpbnRz
Rm9yT3V0T2ZGbG93Q29udGVudChjb250YWluaW5nQmxvY2spOworICAgIH07CisKKyAgICBmb3Ig
KGF1dG8mIG91dE9mRmxvd0JveCA6IGZvcm1hdHRpbmdTdGF0ZSgpLm91dE9mRmxvd0JveGVzKCkp
IHsKKyAgICAgICAgQVNTRVJUKG91dE9mRmxvd0JveC0+ZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29u
dGV4dCgpKTsKKyAgICAgICAgaWYgKCFpbnZhbGlkYXRpb25TdGF0ZS5uZWVkc0xheW91dCgqb3V0
T2ZGbG93Qm94KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGF1dG8gY29udGFp
bmluZ0Jsb2NrQ29uc3RyYWludHMgPSBjb25zdHJhaW50c0ZvckxheW91dEJveCgqb3V0T2ZGbG93
Qm94KTsKKyAgICAgICAgYXV0byBob3Jpem9udGFsQ29uc3RyYWludHNGb3JCb3JkZXJBbmRQYWRk
aW5nID0gSG9yaXpvbnRhbENvbnN0cmFpbnRzIHsgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMu
aG9yaXpvbnRhbC5sb2dpY2FsTGVmdCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuYm9yZGVy
QW5kUGFkZGluZ0NvbnN0cmFpbnRzIH07CisgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5n
KCpvdXRPZkZsb3dCb3gsIGhvcml6b250YWxDb25zdHJhaW50c0ZvckJvcmRlckFuZFBhZGRpbmcp
OworCisgICAgICAgIGNvbXB1dGVPdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkoKm91dE9mRmxv
d0JveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMpOworICAgICAgICBhdXRvIG91dE9mRmxv
d0JveEhhc0NvbnRlbnQgPSBpczxDb250YWluZXJCb3g+KCpvdXRPZkZsb3dCb3gpICYmIGRvd25j
YXN0PENvbnRhaW5lckJveD4oKm91dE9mRmxvd0JveCkuaGFzQ2hpbGQoKTsKKyAgICAgICAgaWYg
KG91dE9mRmxvd0JveEhhc0NvbnRlbnQpIHsKKyAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5lckJv
eCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4oKm91dE9mRmxvd0JveCk7CisgICAgICAgICAgICBh
dXRvIGZvcm1hdHRpbmdDb250ZXh0ID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0Nv
bnRleHQoY29udGFpbmVyQm94LCBsYXlvdXRTdGF0ZSgpKTsKKyAgICAgICAgICAgIGlmIChjb250
YWluZXJCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCisgICAgICAgICAgICAgICAgZm9y
bWF0dGluZ0NvbnRleHQtPmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGdl
b21ldHJ5KCkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KGNvbnRhaW5lckJveCkpOworICAg
ICAgICAgICAgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoY29udGFpbmVyQm94LCBj
b250YWluaW5nQmxvY2tDb25zdHJhaW50cyk7CisgICAgICAgICAgICBmb3JtYXR0aW5nQ29udGV4
dC0+bGF5b3V0T3V0T2ZGbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5j
b25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7CisgICAgICAgIH0g
ZWxzZQorICAgICAgICAgICAgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoKm91dE9m
Rmxvd0JveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMpOworICAgIH0KKyAgICBMT0dfV0lU
SF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiRW5kOiBsYXlvdXQg
b3V0LW9mLWZsb3cgY29udGVudCAtPiBjb250ZXh0OiAiIDw8ICZsYXlvdXRTdGF0ZSgpIDw8ICIg
cm9vdDogIiA8PCAmcm9vdCgpKTsKK30KKworY29uc3QgQm94R2VvbWV0cnkmIEZvcm1hdHRpbmdD
b250ZXh0OjpnZW9tZXRyeUZvckJveChjb25zdCBCb3gmIGxheW91dEJveCwgT3B0aW9uYWw8RXNj
YXBlUmVhc29uPiBlc2NhcGVSZWFzb24pIGNvbnN0Cit7CisgICAgVU5VU0VEX1BBUkFNKGVzY2Fw
ZVJlYXNvbik7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICBhdXRvIGlzT2tUb0FjY2Vzc0JveEdl
b21ldHJ5ID0gWyZdIHsKKyAgICAgICAgaWYgKCFpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihs
YXlvdXRCb3gpICYmICZsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCkgPT0gJnJvb3Qo
KSkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbm9uLWVzY2FwZSBjYXNlIG9mIGFjY2Vz
c2luZyBhIGJveCdzIGdlb21ldHJ5IGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgc2FtZSBmb3JtYXR0
aW5nIGNvbnRleHQuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAg
ICAgIGlmICghZXNjYXBlUmVhc29uKSB7CisgICAgICAgICAgICAvLyBBbnkgZ2VvbWV0cnkgYWNj
ZXNzIG91dHNpZGUgb2YgdGhlIGZvcm1hdHRpbmcgY29udGV4dCB3aXRob3V0IGEgdmFsaWQgcmVh
c29uIGlzIGNvbnNpZGVyZWQgYW4gZXNjYXBlLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICB9CisKKyAgICAgICAgaWYgKCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpE
b2N1bWVudEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaykgeworICAgICAgICAgICAgQVNTRVJU
KGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpOworICAgICAgICAgICAgcmV0dXJuIGlzPElu
aXRpYWxDb250YWluaW5nQmxvY2s+KGxheW91dEJveCk7CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoKmVzY2FwZVJlYXNvbiA9PSBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0
UXVpcmspIHsKKyAgICAgICAgICAgIEFTU0VSVChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgp
KTsKKyAgICAgICAgICAgIHJldHVybiBpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihsYXlvdXRC
b3gpIHx8IGxheW91dEJveC5pc0RvY3VtZW50Qm94KCk7CisKKyAgICAgICAgfQorCisgICAgICAg
IGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNvbjo6VGFibGVRdWlya05lZWRzR2VvbWV0
cnlGcm9tRXN0YWJsaXNoZWRGb3JtYXR0aW5nQ29udGV4dCkgeworICAgICAgICAgICAgLy8gVGhp
cyBpcyB0aGUgY2FzZSB3aGVuIHRoZSB0YWJsZSBmb3JtYXR0aW5nIHJvb3QgY29sbGVjdHMgZ2Vv
bWV0cnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgY2VsbCdzCisgICAgICAgICAgICAvLyBmb3JtYXR0
aW5nIGNvbnRleHQgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgd2lkdGgvaGVpZ2h0LiBzZWUgc2hv
dWxkSWdub3JlQ2hpbGRDb250ZW50VmVydGljYWxNYXJnaW4KKyAgICAgICAgICAgIEFTU0VSVChy
b290KCkuZXN0YWJsaXNoZXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkpOworICAgICAgICAgICAg
cmV0dXJuICZsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCkuZm9ybWF0dGluZ0NvbnRl
eHRSb290KCkgPT0gJnJvb3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqZXNjYXBlUmVh
c29uID09IEVzY2FwZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRyeSkgewor
ICAgICAgICAgICAgLy8gV2hlbiBjb21wdXRpbmcgdGhlIHN0YXRpYyBwb3NpdGlvbiBvZiBhbiBv
dXQtb2YtZmxvdyBib3gsIHdlIG5lZWQgdG8gZ2F0aGVyIHNpYmxpbmcvcGFyZW50IGdlb21ldHJ5
IGluZm9ybWF0aW9uCisgICAgICAgICAgICAvLyBhcyBpZiB0aGUgb3V0LW9mLWZsb3cgYm94IHdh
cyBhIHNpbXBsZSBpbmZsb3cgYm94LgorICAgICAgICAgICAgLy8gTm93IHNpbmNlIHRoZSBvdXQt
b2YtZmxvdyBhbmQgdGhlIHNpYmxpbmcvcGFyZW50IGJveGVzIGNvdWxkIHZlcnkgd2VsbCBiZSBp
biBkaWZmZXJlbnQgY29udGFpbmluZyBibG9jayBzdWJ0cmVlcworICAgICAgICAgICAgLy8gdGhl
IGZvcm1hdHRpbmcgY29udGV4dCB0aGV5IGxpdmUgaW4gY291bGQgYWxzbyBiZSB2ZXJ5IGRpZmZl
cmVudC4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYg
KCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpGbG9hdEJveElzQWx3YXlzUmVsYXRpdmVU
b0Zsb2F0U3RhdGVSb290KSB7CisgICAgICAgICAgICAvLyBGbG9hdCBib3ggdG9wL2xlZnQgdmFs
dWVzIGFyZSBtYXBwZWQgcmVsYXRpdmUgdG8gdGhlIEZsb2F0U3RhdGUncyByb290LiBJbmxpbmUg
Zm9ybWF0dGluZyBjb250ZXh0cyhBKSBpbmhlcml0IGZsb2F0cyBmcm9tIHBhcmVudAorICAgICAg
ICAgICAgLy8gYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cyhCKS4gRmxvYXRzIGluIHRoZXNlIGlu
bGluZSBmb3JtYXR0aW5nIGNvbnRleHRzKEEpIG5lZWQgdG8gYmUgbWFwcGVkIHRvIHRoZSBwYXJl
bnQsIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dChCKS4KKyAgICAgICAgICAgIGF1dG8mIGZvcm1h
dHRpbmdDb250ZXh0Um9vdCA9IGxheW91dEJveC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKKyAg
ICAgICAgICAgIHJldHVybiAmZm9ybWF0dGluZ0NvbnRleHRSb290ID09ICZyb290KCkgfHwgJmZv
cm1hdHRpbmdDb250ZXh0Um9vdCA9PSAmcm9vdCgpLmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpOwor
ICAgICAgICB9CisKKyAgICAgICAgaWYgKCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpG
aW5kRml4ZWRIZWlnaHRBbmNlc3RvclF1aXJrKSB7CisgICAgICAgICAgICBBU1NFUlQobGF5b3V0
U3RhdGUoKS5pblF1aXJrc01vZGUoKSk7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBj
b250YWluaW5nIGJsb2NrIHdpdGggZml4ZWQgaGVpZ2h0IHF1aXJrLiBTZWUgUXVpcmtzOjpoZWln
aHRWYWx1ZU9mTmVhcmVzdENvbnRhaW5pbmdCbG9ja1dpdGhGaXhlZEhlaWdodC4KKyAgICAgICAg
ICAgIC8vIFRoaXMgaXMgb25seSB0byBjaGVjayBpZiB0aGUgdGFyZ2V0Rm9ybWF0dGluZ1Jvb3Qg
aXMgYW4gYW5jZXN0b3IgZm9ybWF0dGluZyByb290LgorICAgICAgICAgICAgaWYgKGlzPEluaXRp
YWxDb250YWluaW5nQmxvY2s+KGxheW91dEJveCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgICAgICBhdXRvJiB0YXJnZXRGb3JtYXR0aW5nUm9vdCA9IGxheW91dEJveC5m
b3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKKyAgICAgICAgICAgIGF1dG8qIGFuY2VzdG9yRm9ybWF0
dGluZ0NvbnRleHRSb290ID0gJnJvb3QoKS5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKKyAgICAg
ICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaWYgKCZ0YXJnZXRGb3JtYXR0
aW5nUm9vdCA9PSBhbmNlc3RvckZvcm1hdHRpbmdDb250ZXh0Um9vdCkKKyAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgYW5jZXN0b3JGb3JtYXR0aW5nQ29u
dGV4dFJvb3QgPSAmYW5jZXN0b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QtPmZvcm1hdHRpbmdDb250
ZXh0Um9vdCgpOworICAgICAgICAgICAgICAgIGlmIChpczxJbml0aWFsQ29udGFpbmluZ0Jsb2Nr
PigqYW5jZXN0b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QpKQorICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorCisgICAgICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNvbjo6VGFi
bGVOZWVkc0FjY2Vzc1RvVGFibGVXcmFwcGVyKSB7CisgICAgICAgICAgICAvLyBUYWJsZXMgYXJl
IHdyYXBwZWQgaW4gYSAyIGxldmVsIGZvcm1hdHRpbmcgY29udGV4dCBzdHJ1Y3R1cmUuIEEgPHRh
YmxlPiBlbGVtZW50IGluaXRpYXRlcyBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBmb3IgaXRz
IHByaW5jaXBhbCB0YWJsZSBib3gKKyAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBjYXB0aW9uIGFu
ZCB0aGUgdGFibGUgY29udGVudCBsaXZlLiBJdCBhbHNvIGluaXRpYXRlcyBhIHRhYmxlIHdyYXBw
ZXIgYm94IHdoaWNoIGVzdGFibGlzaGVzIHRoZSB0YWJsZSBmb3JtYXR0aW5nIGNvbnRleHQuCisg
ICAgICAgICAgICAvLyBJbiBtYW55IGNhc2VzIHRoZSBURkMgbmVlZHMgYWNjZXNzIHRvIHRoZSBw
YXJlbnQgKGdlbmVyYXRlZCkgQkZDLgorICAgICAgICAgICAgcmV0dXJuICZsYXlvdXRCb3ggPT0g
JnJvb3QoKS5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKyNlbmRp
ZgorICAgIEFTU0VSVChpc09rVG9BY2Nlc3NCb3hHZW9tZXRyeSgpKTsKKyAgICBBU1NFUlQobGF5
b3V0U3RhdGUoKS5oYXNCb3hHZW9tZXRyeShsYXlvdXRCb3gpKTsKKyAgICByZXR1cm4gbGF5b3V0
U3RhdGUoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOworfQorCit2b2lkIEZvcm1hdHRpbmdD
b250ZXh0Ojpjb2xsZWN0T3V0T2ZGbG93RGVzY2VuZGFudHNJZk5lZWRlZCgpCit7CisgICAgaWYg
KCFmb3JtYXR0aW5nU3RhdGUoKS5vdXRPZkZsb3dCb3hlcygpLmlzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuOworICAgIGF1dG8mIHJvb3QgPSB0aGlzLT5yb290KCk7CisgICAgaWYgKCFyb290Lmhh
c0NoaWxkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIXJvb3QuaXNQb3NpdGlvbmVkKCkg
JiYgIWlzPEluaXRpYWxDb250YWluaW5nQmxvY2s+KHJvb3QpKQorICAgICAgICByZXR1cm47Cisg
ICAgLy8gQ29sbGVjdCB0aGUgb3V0LW9mLWZsb3cgZGVzY2VuZGFudHMgYXQgdGhlIGZvcm1hdHRp
bmcgcm9vdCBsZXZlbCAoYXMgb3Bwb3NlZCB0byBhdCB0aGUgY29udGFpbmluZyBibG9jayBsZXZl
bCwgdGhvdWdoIHRoZXkgbWlnaHQgYmUgdGhlIHNhbWUpLgorICAgIC8vIEZJWE1FOiBUdXJuIHRo
aXMgaW50byBhIHJlZ2lzdGVyLXNlbGYgYXMgYm94ZXMgYXJlIGJlaW5nIGluc2VydGVkLgorICAg
IGZvciAoYXV0byYgZGVzY2VuZGFudCA6IGRlc2NlbmRhbnRzT2ZUeXBlPEJveD4ocm9vdCkpIHsK
KyAgICAgICAgaWYgKCFkZXNjZW5kYW50LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQorICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIGlmICgmZGVzY2VuZGFudC5mb3JtYXR0aW5nQ29udGV4
dFJvb3QoKSAhPSAmcm9vdCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3JtYXR0
aW5nU3RhdGUoKS5hZGRPdXRPZkZsb3dCb3goZGVzY2VuZGFudCk7CisgICAgfQorfQorCisjaWZu
ZGVmIE5ERUJVRwordm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6dmFsaWRhdGVHZW9tZXRyeUNvbnN0
cmFpbnRzQWZ0ZXJMYXlvdXQoKSBjb25zdAoreworICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0
Um9vdCA9IHJvb3QoKTsKKyAgICAvLyBGSVhNRTogYWRkIGEgZGVzY2VuZGFudHNPZlR5cGU8PiBm
bGF2b3IgdGhhdCBzdG9wcyBhdCBuZXN0ZWQgZm9ybWF0dGluZyBjb250ZXh0cworICAgIGZvciAo
YXV0byYgbGF5b3V0Qm94IDogZGVzY2VuZGFudHNPZlR5cGU8Qm94Pihmb3JtYXR0aW5nQ29udGV4
dFJvb3QpKSB7CisgICAgICAgIGlmICgmbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgp
ICE9ICZmb3JtYXR0aW5nQ29udGV4dFJvb3QpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgYXV0byYgY29udGFpbmluZ0Jsb2NrR2VvbWV0cnkgPSBnZW9tZXRyeUZvckJveChsYXlvdXRC
b3guY29udGFpbmluZ0Jsb2NrKCkpOworICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGdlb21l
dHJ5Rm9yQm94KGxheW91dEJveCk7CisKKyAgICAgICAgLy8gMTAuMy4zIEJsb2NrLWxldmVsLCBu
b24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cKKyAgICAgICAgLy8gMTAuMy43IEFi
c29sdXRlbHkgcG9zaXRpb25lZCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzCisgICAgICAgIGlmICgo
bGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpIHx8IGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0
aW9uZWQoKSkgJiYgIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpIHsKKyAgICAgICAgICAgIC8v
IG1hcmdpbi1sZWZ0ICsgYm9yZGVyLWxlZnQtd2lkdGggKyBwYWRkaW5nLWxlZnQgKyB3aWR0aCAr
IHBhZGRpbmctcmlnaHQgKyBib3JkZXItcmlnaHQtd2lkdGggKyBtYXJnaW4tcmlnaHQgPSB3aWR0
aCBvZiBjb250YWluaW5nIGJsb2NrCisgICAgICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dp
ZHRoID0gY29udGFpbmluZ0Jsb2NrR2VvbWV0cnkuY29udGVudEJveFdpZHRoKCk7CisgICAgICAg
ICAgICBBU1NFUlQoYm94R2VvbWV0cnkuaG9yaXpvbnRhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmco
KSArIGJveEdlb21ldHJ5LmNvbnRlbnRCb3hXaWR0aCgpID09IGNvbnRhaW5pbmdCbG9ja1dpZHRo
KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDEwLjYuNCBBYnNvbHV0ZWx5IHBvc2l0aW9uZWQs
IG5vbi1yZXBsYWNlZCBlbGVtZW50cworICAgICAgICBpZiAobGF5b3V0Qm94LmlzT3V0T2ZGbG93
UG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKSB7CisgICAgICAgICAg
ICAvLyB0b3AgKyBtYXJnaW4tdG9wICsgYm9yZGVyLXRvcC13aWR0aCArIHBhZGRpbmctdG9wICsg
aGVpZ2h0ICsgcGFkZGluZy1ib3R0b20gKyBib3JkZXItYm90dG9tLXdpZHRoICsgbWFyZ2luLWJv
dHRvbSArIGJvdHRvbSA9IGhlaWdodCBvZiBjb250YWluaW5nIGJsb2NrCisgICAgICAgICAgICBh
dXRvIGNvbnRhaW5pbmdCbG9ja0hlaWdodCA9IGNvbnRhaW5pbmdCbG9ja0dlb21ldHJ5LmNvbnRl
bnRCb3hIZWlnaHQoKTsKKyAgICAgICAgICAgIEFTU0VSVChCb3hHZW9tZXRyeTo6Ym9yZGVyQm94
VG9wKGJveEdlb21ldHJ5KSArIGJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpICsgYm94R2VvbWV0
cnkuYm9yZGVyVG9wKCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKSArIGJv
eEdlb21ldHJ5LmNvbnRlbnRCb3hIZWlnaHQoKQorICAgICAgICAgICAgICAgICsgYm94R2VvbWV0
cnkucGFkZGluZ0JvdHRvbSgpLnZhbHVlT3IoMCkgKyBib3hHZW9tZXRyeS5ib3JkZXJCb3R0b20o
KSArIGJveEdlb21ldHJ5Lm1hcmdpbkFmdGVyKCkgPT0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KTsK
KyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGluZ0NvbnRl
eHQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGlu
Z0NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43MTEwMjU1ODhlYzRhMDNkOWUzNWEwYWM5MzBhNzc2YzYy
M2Y4NDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9Gb3JtYXR0aW5nQ29udGV4dC5oCkBAIC0wLDAgKzEsMjczIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKKworI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgorI2luY2x1ZGUgIkxheW91dFVu
aXQuaCIKKyNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2Mu
aD4KKyNpbmNsdWRlIDx3dGYvV2Vha1B0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Ns
YXNzIExheW91dFNpemU7CitzdHJ1Y3QgTGVuZ3RoOworCituYW1lc3BhY2UgTGF5b3V0IHsKKwor
Y2xhc3MgQm94R2VvbWV0cnk7CitjbGFzcyBSZXBsYWNlZEJveDsKK3N0cnVjdCBDb21wdXRlZEhv
cml6b250YWxNYXJnaW47CitzdHJ1Y3QgQ29tcHV0ZWRWZXJ0aWNhbE1hcmdpbjsKK2NsYXNzIENv
bnRhaW5lckJveDsKK3N0cnVjdCBDb250ZW50SGVpZ2h0QW5kTWFyZ2luOworc3RydWN0IENvbnRl
bnRXaWR0aEFuZE1hcmdpbjsKK3N0cnVjdCBFZGdlczsKK2NsYXNzIEZvcm1hdHRpbmdTdGF0ZTsK
K3N0cnVjdCBIb3Jpem9udGFsR2VvbWV0cnk7CitjbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKK2Ns
YXNzIExheW91dFN0YXRlOworc3RydWN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzOworc3Ry
dWN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlczsKK3N0cnVjdCBWZXJ0aWNhbEdlb21ldHJ5Owor
CitjbGFzcyBGb3JtYXR0aW5nQ29udGV4dCB7CisgICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChG
b3JtYXR0aW5nQ29udGV4dCk7CitwdWJsaWM6CisgICAgRm9ybWF0dGluZ0NvbnRleHQoY29uc3Qg
Q29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEZvcm1hdHRpbmdTdGF0ZSYpOwor
ICAgIHZpcnR1YWwgfkZvcm1hdHRpbmdDb250ZXh0KCk7CisKKyAgICBzdHJ1Y3QgQ29uc3RyYWlu
dHNGb3JJbkZsb3dDb250ZW50IHsKKyAgICAgICAgSG9yaXpvbnRhbENvbnN0cmFpbnRzIGhvcml6
b250YWw7CisgICAgICAgIFZlcnRpY2FsQ29uc3RyYWludHMgdmVydGljYWw7CisgICAgfTsKKyAg
ICB2aXJ0dWFsIHZvaWQgbGF5b3V0SW5GbG93Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYsIGNv
bnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpID0gMDsKKworICAgIHN0cnVjdCBDb25z
dHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQgeworICAgICAgICBIb3Jpem9udGFsQ29uc3RyYWlu
dHMgaG9yaXpvbnRhbDsKKyAgICAgICAgVmVydGljYWxDb25zdHJhaW50cyB2ZXJ0aWNhbDsKKyAg
ICAgICAgLy8gQm9yZGVycyBhbmQgcGFkZGluZyBhcmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgY29u
dGFpbmluZyBibG9jaydzIGNvbnRlbnQgYm94IGFzIGlmIHRoZSBib3ggd2FzIGFuIGluLWZsb3cg
Ym94LgorICAgICAgICBMYXlvdXRVbml0IGJvcmRlckFuZFBhZGRpbmdDb25zdHJhaW50czsKKyAg
ICB9OworICAgIHZvaWQgbGF5b3V0T3V0T2ZGbG93Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYs
IGNvbnN0IENvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCYpOworCisgICAgc3RydWN0IElu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeworICAgICAgICB2b2lkIGV4cGFuZChMYXlvdXRVbml0
IGhvcml6b250YWxWYWx1ZSk7CisgICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIG9w
ZXJhdG9yKz0oY29uc3QgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYpOworICAgICAgICBJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzJiBvcGVyYXRvcis9KExheW91dFVuaXQpOworICAgICAgICBJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzJiBvcGVyYXRvci09KGNvbnN0IEludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMmKTsKKyAgICAgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3BlcmF0
b3ItPShMYXlvdXRVbml0KTsKKworICAgICAgICBMYXlvdXRVbml0IG1pbmltdW07CisgICAgICAg
IExheW91dFVuaXQgbWF4aW11bTsKKyAgICB9OworICAgIHZpcnR1YWwgSW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSA9IDA7CisgICAg
dmlydHVhbCBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3QgPSAwOworCisgICAg
Ym9vbCBpc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiByb290KCkuZXN0
YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCk7IH0KKyAgICBib29sIGlzSW5saW5lRm9y
bWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiByb290KCkuZXN0YWJsaXNoZXNJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCgpOyB9CisgICAgYm9vbCBpc1RhYmxlRm9ybWF0dGluZ0NvbnRleHQo
KSBjb25zdCB7IHJldHVybiByb290KCkuZXN0YWJsaXNoZXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0
KCk7IH0KKyAgICBib29sIGlzVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpIGNv
bnN0IHsgcmV0dXJuIGlzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpICYmIHJvb3QoKS5pc1RhYmxl
V3JhcHBlckJveCgpOyB9CisgICAgYm9vbCBpc0ZsZXhGb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0
IHsgcmV0dXJuIHJvb3QoKS5lc3RhYmxpc2hlc0ZsZXhGb3JtYXR0aW5nQ29udGV4dCgpOyB9CisK
KyAgICBlbnVtIGNsYXNzIEVzY2FwZVJlYXNvbiB7CisgICAgICAgIFRhYmxlUXVpcmtOZWVkc0dl
b21ldHJ5RnJvbUVzdGFibGlzaGVkRm9ybWF0dGluZ0NvbnRleHQsCisgICAgICAgIE91dE9mRmxv
d0JveE5lZWRzSW5GbG93R2VvbWV0cnksCisgICAgICAgIEZsb2F0Qm94SXNBbHdheXNSZWxhdGl2
ZVRvRmxvYXRTdGF0ZVJvb3QsCisgICAgICAgIEZpbmRGaXhlZEhlaWdodEFuY2VzdG9yUXVpcmss
CisgICAgICAgIERvY3VtZW50Qm94U3RyZXRjaGVzVG9WaWV3cG9ydFF1aXJrLAorICAgICAgICBC
b2R5U3RyZXRjaGVzVG9WaWV3cG9ydFF1aXJrLAorICAgICAgICBUYWJsZU5lZWRzQWNjZXNzVG9U
YWJsZVdyYXBwZXIKKyAgICB9OworICAgIGNvbnN0IEJveEdlb21ldHJ5JiBnZW9tZXRyeUZvckJv
eChjb25zdCBCb3gmLCBPcHRpb25hbDxFc2NhcGVSZWFzb24+ID0gV1RGOjpudWxsb3B0KSBjb25z
dDsKKyAgICBjb25zdCBDb250YWluZXJCb3gmIHJvb3QoKSBjb25zdCB7IHJldHVybiAqbV9yb290
OyB9CisKKyAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSBjb25zdDsKKworcHJvdGVjdGVk
OgorICAgIHVzaW5nIExheW91dFF1ZXVlID0gVmVjdG9yPGNvbnN0IEJveCo+OworCisgICAgY29u
c3QgRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2Zv
cm1hdHRpbmdTdGF0ZTsgfQorICAgIEZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKCkg
eyByZXR1cm4gbV9mb3JtYXR0aW5nU3RhdGU7IH0KKworICAgIHZvaWQgY29tcHV0ZUJvcmRlckFu
ZFBhZGRpbmcoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7CisKKyNp
Zm5kZWYgTkRFQlVHCisgICAgdmlydHVhbCB2b2lkIHZhbGlkYXRlR2VvbWV0cnlDb25zdHJhaW50
c0FmdGVyTGF5b3V0KCkgY29uc3Q7CisjZW5kaWYKKworICAgIC8vIFRoaXMgY2xhc3MgaW1wbGVt
ZW50cyBnZW5lcmljIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcuCisgICAgY2xhc3MgR2VvbWV0cnkg
eworICAgIHB1YmxpYzoKKyAgICAgICAgVmVydGljYWxHZW9tZXRyeSBvdXRPZkZsb3dWZXJ0aWNh
bEdlb21ldHJ5KGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0
IFZlcnRpY2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKSBj
b25zdDsKKyAgICAgICAgSG9yaXpvbnRhbEdlb21ldHJ5IG91dE9mRmxvd0hvcml6b250YWxHZW9t
ZXRyeShjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBWZXJ0
aWNhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKwor
ICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGZsb2F0aW5nQ29udGVudEhlaWdodEFuZE1h
cmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVy
cmlkZGVuVmVydGljYWxWYWx1ZXMmKSBjb25zdDsKKyAgICAgICAgQ29udGVudFdpZHRoQW5kTWFy
Z2luIGZsb2F0aW5nQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7CisK
KyAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWln
aHRBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmLCBPcHRpb25hbDxWZXJ0aWNhbENvbnN0cmFpbnRzPiwgY29uc3QgT3ZlcnJpZGRlblZlcnRp
Y2FsVmFsdWVzJikgY29uc3Q7CisgICAgICAgIENvbnRlbnRXaWR0aEFuZE1hcmdpbiBpbmxpbmVS
ZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYsIE9wdGlvbmFsPFZlcnRpY2FsQ29uc3RyYWludHM+LCBjb25z
dCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYpOworCisgICAgICAgIExheW91dFNpemUgaW5G
bG93UG9zaXRpb25lZFBvc2l0aW9uT2Zmc2V0KGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYpIGNvbnN0OworCisgICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gY29t
cGxpY2F0ZWRDYXNlcyhjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBj
b25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKSBjb25zdDsKKyAgICAgICAgTGF5b3V0VW5p
dCBzaHJpbmtUb0ZpdFdpZHRoKGNvbnN0IEJveCYsIExheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgp
OworCisgICAgICAgIEVkZ2VzIGNvbXB1dGVkQm9yZGVyKGNvbnN0IEJveCYpIGNvbnN0OworICAg
ICAgICBPcHRpb25hbDxFZGdlcz4gY29tcHV0ZWRQYWRkaW5nKGNvbnN0IEJveCYsIExheW91dFVu
aXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpIGNvbnN0OworCisgICAgICAgIENvbXB1dGVkSG9yaXpv
bnRhbE1hcmdpbiBjb21wdXRlZEhvcml6b250YWxNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJikgY29uc3Q7CisgICAgICAgIENvbXB1dGVkVmVydGljYWxNYXJn
aW4gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29u
c3RyYWludHMmKSBjb25zdDsKKworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRl
ZFZhbHVlKGNvbnN0IExlbmd0aCYgZ2VvbWV0cnlQcm9wZXJ0eSwgTGF5b3V0VW5pdCBjb250YWlu
aW5nQmxvY2tXaWR0aCkgY29uc3Q7CisgICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGZpeGVk
VmFsdWUoY29uc3QgTGVuZ3RoJiBnZW9tZXRyeVByb3BlcnR5KSBjb25zdDsKKworICAgICAgICBP
cHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZE1pbkhlaWdodChjb25zdCBCb3gmLCBPcHRpb25h
bDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBXVEY6Om51bGxvcHQpIGNvbnN0
OworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZE1heEhlaWdodChjb25zdCBC
b3gmLCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBXVEY6Om51
bGxvcHQpIGNvbnN0OworCisgICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbXB1dGVkTWlu
V2lkdGgoY29uc3QgQm94JiwgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisgICAg
ICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbXB1dGVkTWF4V2lkdGgoY29uc3QgQm94JiwgTGF5
b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisKKyAgICAgICAgRm9ybWF0dGluZ0NvbnRl
eHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29uc3RyYWluQnlNaW5NYXhXaWR0aChjb25z
dCBCb3gmLCBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKSBjb25zdDsKKworICAgICAgICBMYXlv
dXRVbml0IGNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QoY29uc3QgQ29udGFp
bmVyQm94JikgY29uc3Q7CisKKyAgICAgICAgQ29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50
IGNvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudChjb25zdCBDb250YWluZXJCb3gmKTsKKyAg
ICAgICAgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IGNvbnN0cmFpbnRzRm9ySW5GbG93Q29u
dGVudChjb25zdCBDb250YWluZXJCb3gmLCBPcHRpb25hbDxFc2NhcGVSZWFzb24+ID0gV1RGOjpu
dWxsb3B0KTsKKworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZEhlaWdodChj
b25zdCBCb3gmLCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBX
VEY6Om51bGxvcHQpIGNvbnN0OworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRl
ZFdpZHRoKGNvbnN0IEJveCYsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworCisg
ICAgcHJvdGVjdGVkOgorICAgICAgICBmcmllbmQgY2xhc3MgRm9ybWF0dGluZ0NvbnRleHQ7Cisg
ICAgICAgIEdlb21ldHJ5KGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0Jik7CisKKyAgICAgICAgY29u
c3QgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9mb3JtYXR0aW5n
Q29udGV4dC5sYXlvdXRTdGF0ZSgpOyB9CisgICAgICAgIExheW91dFN0YXRlJiBsYXlvdXRTdGF0
ZSgpIHsgcmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQorICAgICAg
ICBjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJl
dHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBWZXJ0
aWNhbEdlb21ldHJ5IG91dE9mRmxvd1JlcGxhY2VkVmVydGljYWxHZW9tZXRyeShjb25zdCBSZXBs
YWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IFZlcnRpY2FsQ29u
c3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKSBjb25zdDsKKyAgICAg
ICAgSG9yaXpvbnRhbEdlb21ldHJ5IG91dE9mRmxvd1JlcGxhY2VkSG9yaXpvbnRhbEdlb21ldHJ5
KGNvbnN0IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3Qg
VmVydGljYWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7
CisKKyAgICAgICAgVmVydGljYWxHZW9tZXRyeSBvdXRPZkZsb3dOb25SZXBsYWNlZFZlcnRpY2Fs
R2VvbWV0cnkoY29uc3QgQ29udGFpbmVyQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZh
bHVlcyYpIGNvbnN0OworICAgICAgICBIb3Jpem9udGFsR2VvbWV0cnkgb3V0T2ZGbG93Tm9uUmVw
bGFjZWRIb3Jpem9udGFsR2VvbWV0cnkoY29uc3QgQ29udGFpbmVyQm94JiwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKwor
ICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGZsb2F0aW5nUmVwbGFjZWRDb250ZW50SGVp
Z2h0QW5kTWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7CisgICAgICAgIENv
bnRlbnRXaWR0aEFuZE1hcmdpbiBmbG9hdGluZ1JlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2lu
KGNvbnN0IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3Qg
T3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKworICAgICAgICBDb250ZW50V2lkdGhBbmRN
YXJnaW4gZmxvYXRpbmdOb25SZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gm
LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRh
bFZhbHVlcyYpOworCisgICAgICAgIExheW91dFVuaXQgc3RhdGljVmVydGljYWxQb3NpdGlvbkZv
ck91dE9mRmxvd1Bvc2l0aW9uZWQoY29uc3QgQm94JiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50
cyYpIGNvbnN0OworICAgICAgICBMYXlvdXRVbml0IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbkZv
ck91dE9mRmxvd1Bvc2l0aW9uZWQoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJikgY29uc3Q7CisKKyAgICAgICAgZW51bSBjbGFzcyBIZWlnaHRUeXBlIHsgTWluLCBNYXgs
IE5vcm1hbCB9OworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZEhlaWdodFZh
bHVlKGNvbnN0IEJveCYsIEhlaWdodFR5cGUsIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbnRhaW5p
bmdCbG9ja0hlaWdodCkgY29uc3Q7CisKKyAgICAgICAgZW51bSBjbGFzcyBXaWR0aFR5cGUgeyBN
aW4sIE1heCwgTm9ybWFsIH07CisgICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbXB1dGVk
V2lkdGhWYWx1ZShjb25zdCBCb3gmLCBXaWR0aFR5cGUsIExheW91dFVuaXQgY29udGFpbmluZ0Js
b2NrV2lkdGgpOworCisgICAgICAgIGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0JiBtX2Zvcm1hdHRp
bmdDb250ZXh0OworICAgIH07CisgICAgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21l
dHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMpOyB9CisKKyAgICBjbGFzcyBRdWly
a3MgeworICAgIHB1YmxpYzoKKyAgICAgICAgUXVpcmtzKGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0
Jik7CisKKyAgICAgICAgTGF5b3V0VW5pdCBoZWlnaHRWYWx1ZU9mTmVhcmVzdENvbnRhaW5pbmdC
bG9ja1dpdGhGaXhlZEhlaWdodChjb25zdCBCb3gmKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAg
ICAgY29uc3QgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9mb3Jt
YXR0aW5nQ29udGV4dC5sYXlvdXRTdGF0ZSgpOyB9CisgICAgICAgIExheW91dFN0YXRlJiBsYXlv
dXRTdGF0ZSgpIHsgcmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQor
ICAgICAgICBjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25z
dCB7IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0OyB9CisKKyAgICAgICAgY29uc3QgRm9ybWF0
dGluZ0NvbnRleHQmIG1fZm9ybWF0dGluZ0NvbnRleHQ7CisgICAgfTsKKyAgICBGb3JtYXR0aW5n
Q29udGV4dDo6UXVpcmtzIHF1aXJrcygpIGNvbnN0IHsgcmV0dXJuIFF1aXJrcygqdGhpcyk7IH0K
KworcHJpdmF0ZToKKyAgICB2b2lkIGNvbGxlY3RPdXRPZkZsb3dEZXNjZW5kYW50c0lmTmVlZGVk
KCk7CisgICAgdm9pZCBjb21wdXRlT3V0T2ZGbG93VmVydGljYWxHZW9tZXRyeShjb25zdCBCb3gm
LCBjb25zdCBDb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQmKTsKKyAgICB2b2lkIGNvbXB1
dGVPdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkoY29uc3QgQm94JiwgY29uc3QgQ29uc3RyYWlu
dHNGb3JPdXRPZkZsb3dDb250ZW50Jik7CisKKyAgICBXZWFrUHRyPGNvbnN0IENvbnRhaW5lckJv
eD4gbV9yb290OworICAgIEZvcm1hdHRpbmdTdGF0ZSYgbV9mb3JtYXR0aW5nU3RhdGU7Cit9Owor
CitpbmxpbmUgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpHZW9tZXRyeShjb25zdCBGb3Jt
YXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQpCisgICAgOiBtX2Zvcm1hdHRpbmdDb250
ZXh0KGZvcm1hdHRpbmdDb250ZXh0KQoreworfQorCitpbmxpbmUgRm9ybWF0dGluZ0NvbnRleHQ6
OlF1aXJrczo6UXVpcmtzKGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4
dCkKKyAgICA6IG1fZm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHQpCit7Cit9CisK
K2lubGluZSB2b2lkIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
OjpleHBhbmQoTGF5b3V0VW5pdCBob3Jpem9udGFsVmFsdWUpCit7CisgICAgbWluaW11bSArPSBo
b3Jpem9udGFsVmFsdWU7CisgICAgbWF4aW11bSArPSBob3Jpem9udGFsVmFsdWU7Cit9CisKK2lu
bGluZSBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgRm9ybWF0
dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM6Om9wZXJhdG9yKz0oY29uc3Qg
SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3RoZXIpCit7CisgICAgbWluaW11bSArPSBvdGhl
ci5taW5pbXVtOworICAgIG1heGltdW0gKz0gb3RoZXIubWF4aW11bTsKKyAgICByZXR1cm4gKnRo
aXM7Cit9CisKK2lubGluZSBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJh
aW50cyYgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM6Om9wZXJh
dG9yKz0oTGF5b3V0VW5pdCB2YWx1ZSkKK3sKKyAgICBleHBhbmQodmFsdWUpOworICAgIHJldHVy
biAqdGhpczsKK30KKworaW5saW5lIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzJiBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50czo6
b3BlcmF0b3ItPShjb25zdCBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzJiBvdGhlcikKK3sKKyAg
ICBtaW5pbXVtIC09IG90aGVyLm1pbmltdW07CisgICAgbWF4aW11bSAtPSBvdGhlci5tYXhpbXVt
OworICAgIHJldHVybiAqdGhpczsKK30KKworaW5saW5lIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzJiBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhD
b25zdHJhaW50czo6b3BlcmF0b3ItPShMYXlvdXRVbml0IHZhbHVlKQoreworICAgIGV4cGFuZCgt
dmFsdWUpOworICAgIHJldHVybiAqdGhpczsKK30KKworfQorfQorCisjZGVmaW5lIFNQRUNJQUxJ
WkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChUb1ZhbHVlVHlwZU5hbWUs
IHByZWRpY2F0ZSkgXAorU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19CRUdJTihXZWJDb3JlOjpMYXlv
dXQ6OlRvVmFsdWVUeXBlTmFtZSkgXAorICAgIHN0YXRpYyBib29sIGlzVHlwZShjb25zdCBXZWJD
b3JlOjpMYXlvdXQ6OkZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCkgeyByZXR1
cm4gZm9ybWF0dGluZ0NvbnRleHQucHJlZGljYXRlOyB9IFwKK1NQRUNJQUxJWkVfVFlQRV9UUkFJ
VFNfRU5EKCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9Gb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5
LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi45ZWIxOTY1N2I4YmU3MTk5YWEzZmZjMjA2ZjU3MjFhNzJjZDYyYzgx
Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250
ZXh0cy9Gb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApAQCAtMCwwICsxLDExNjUgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRl
eHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVk
ZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJGbGV4Rm9ybWF0dGluZ1N0YXRl
LmgiCisjaW5jbHVkZSAiRmxvYXRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiRmxvYXRpbmdTdGF0
ZS5oIgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkxheW91
dENvbnRleHQuaCIKKyNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisj
aW5jbHVkZSAiTGF5b3V0UmVwbGFjZWRCb3guaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5j
bHVkZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFt
ZXNwYWNlIExheW91dCB7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0hlaWdodEF1dG8oY29uc3Qg
Qm94JiBsYXlvdXRCb3gpCit7CisgICAgLy8gMTAuNSBDb250ZW50IGhlaWdodDogdGhlICdoZWln
aHQnIHByb3BlcnR5CisgICAgLy8KKyAgICAvLyBUaGUgcGVyY2VudGFnZSBpcyBjYWxjdWxhdGVk
IHdpdGggcmVzcGVjdCB0byB0aGUgaGVpZ2h0IG9mIHRoZSBnZW5lcmF0ZWQgYm94J3MgY29udGFp
bmluZyBibG9jay4KKyAgICAvLyBJZiB0aGUgaGVpZ2h0IG9mIHRoZSBjb250YWluaW5nIGJsb2Nr
IGlzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSAoaS5lLiwgaXQgZGVwZW5kcyBvbiBjb250ZW50
IGhlaWdodCksCisgICAgLy8gYW5kIHRoaXMgZWxlbWVudCBpcyBub3QgYWJzb2x1dGVseSBwb3Np
dGlvbmVkLCB0aGUgdXNlZCBoZWlnaHQgaXMgY2FsY3VsYXRlZCBhcyBpZiAnYXV0bycgd2FzIHNw
ZWNpZmllZC4KKworICAgIGF1dG8gaGVpZ2h0ID0gbGF5b3V0Qm94LnN0eWxlKCkubG9naWNhbEhl
aWdodCgpOworICAgIGlmIChoZWlnaHQuaXNBdXRvKCkpCisgICAgICAgIHJldHVybiB0cnVlOwor
CisgICAgaWYgKGhlaWdodC5pc1BlcmNlbnQoKSkgeworICAgICAgICBpZiAobGF5b3V0Qm94Lmlz
T3V0T2ZGbG93UG9zaXRpb25lZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIHJldHVybiAhbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCkubG9naWNhbEhl
aWdodCgpLmlzRml4ZWQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK09wdGlv
bmFsPExheW91dFVuaXQ+IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRIZWln
aHRWYWx1ZShjb25zdCBCb3gmIGxheW91dEJveCwgSGVpZ2h0VHlwZSBoZWlnaHRUeXBlLCBPcHRp
b25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQpIGNvbnN0Cit7CisgICAgYXV0
byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICBhdXRvIGhlaWdodCA9IGhlaWdodFR5
cGUgPT0gSGVpZ2h0VHlwZTo6Tm9ybWFsID8gc3R5bGUubG9naWNhbEhlaWdodCgpIDogaGVpZ2h0
VHlwZSA9PSBIZWlnaHRUeXBlOjpNaW4gPyBzdHlsZS5sb2dpY2FsTWluSGVpZ2h0KCkgOiBzdHls
ZS5sb2dpY2FsTWF4SGVpZ2h0KCk7CisgICAgaWYgKGhlaWdodC5pc1VuZGVmaW5lZCgpIHx8IGhl
aWdodC5pc0F1dG8oKSB8fCBoZWlnaHQuaXNNYXhDb250ZW50KCkgfHwgaGVpZ2h0LmlzTWluQ29u
dGVudCgpIHx8IGhlaWdodC5pc0ZpdENvbnRlbnQoKSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKwor
ICAgIGlmIChoZWlnaHQuaXNGaXhlZCgpKQorICAgICAgICByZXR1cm4gTGF5b3V0VW5pdCB7IGhl
aWdodC52YWx1ZSgpIH07CisKKyAgICBpZiAoIWNvbnRhaW5pbmdCbG9ja0hlaWdodCkgeworICAg
ICAgICBpZiAobGF5b3V0U3RhdGUoKS5pblF1aXJrc01vZGUoKSkKKyAgICAgICAgICAgIGNvbnRh
aW5pbmdCbG9ja0hlaWdodCA9IGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuaGVpZ2h0VmFs
dWVPZk5lYXJlc3RDb250YWluaW5nQmxvY2tXaXRoRml4ZWRIZWlnaHQobGF5b3V0Qm94KTsKKyAg
ICAgICAgZWxzZSB7CisgICAgICAgICAgICBhdXRvIG5vbkFub255bW91c0NvbnRhaW5pbmdCbG9j
a0xvZ2ljYWxIZWlnaHQgPSBbJl0geworICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGJsb2Nr
IGxldmVsIGJveCBpcyBhIGRpcmVjdCBjaGlsZCBvZiBhbiBpbmxpbmUgbGV2ZWwgYm94ICg8c3Bh
bj48ZGl2PjwvZGl2Pjwvc3Bhbj4pIGFuZCB3ZSB3cmFwIGl0IGludG8gYSBjb250aW51YXRpb24s
CisgICAgICAgICAgICAgICAgLy8gdGhlIGNvbnRhaW5pbmcgYmxvY2sgKGFub255bW91cyB3cmFw
cGVyKSBpcyBub3QgdGhlIGJveCB3ZSBuZWVkIHRvIGNoZWNrIGZvciBmaXhlZCBoZWlnaHQuCisg
ICAgICAgICAgICAgICAgYXV0byYgaW5pdGlhbENvbnRhaW5pbmdCbG9jayA9IGxheW91dEJveC5p
bml0aWFsQ29udGFpbmluZ0Jsb2NrKCk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvKiBjb250
YWluaW5nQmxvY2sgPSAmbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOyBjb250YWluaW5nQmxv
Y2sgIT0gJmluaXRpYWxDb250YWluaW5nQmxvY2s7IGNvbnRhaW5pbmdCbG9jayA9ICZjb250YWlu
aW5nQmxvY2stPmNvbnRhaW5pbmdCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChj
b250YWluaW5nQmxvY2stPmlzQW5vbnltb3VzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9jay0+c3R5
bGUoKS5sb2dpY2FsSGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IHJldHVybiBpbml0aWFsQ29udGFpbmluZ0Jsb2NrLnN0eWxlKCkubG9naWNhbEhlaWdodCgpOwor
ICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNvbnRhaW5pbmdCbG9ja0hlaWdodCA9IGZpeGVk
VmFsdWUobm9uQW5vbnltb3VzQ29udGFpbmluZ0Jsb2NrTG9naWNhbEhlaWdodCgpKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIGlmICghY29udGFpbmluZ0Jsb2NrSGVpZ2h0KQorICAgICAgICBy
ZXR1cm4geyB9OworCisgICAgcmV0dXJuIHZhbHVlRm9yTGVuZ3RoKGhlaWdodCwgKmNvbnRhaW5p
bmdCbG9ja0hlaWdodCk7Cit9CisKK09wdGlvbmFsPExheW91dFVuaXQ+IEZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRIZWlnaHQoY29uc3QgQm94JiBsYXlvdXRCb3gsIE9wdGlv
bmFsPExheW91dFVuaXQ+IGNvbnRhaW5pbmdCbG9ja0hlaWdodCkgY29uc3QKK3sKKyAgICBpZiAo
YXV0byBoZWlnaHQgPSBjb21wdXRlZEhlaWdodFZhbHVlKGxheW91dEJveCwgSGVpZ2h0VHlwZTo6
Tm9ybWFsLCBjb250YWluaW5nQmxvY2tIZWlnaHQpKSB7CisgICAgICAgIGlmIChsYXlvdXRCb3gu
c3R5bGUoKS5ib3hTaXppbmcoKSA9PSBCb3hTaXppbmc6OkNvbnRlbnRCb3gpCisgICAgICAgICAg
ICByZXR1cm4gaGVpZ2h0OworICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdD
b250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKKyAgICAgICAgcmV0dXJuICpoZWln
aHQgLSAoYm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGJveEdlb21ldHJ5LnZlcnRpY2Fs
UGFkZGluZygpLnZhbHVlT3IoMCkpOworICAgIH0KKyAgICByZXR1cm4geyB9OworfQorCitPcHRp
b25hbDxMYXlvdXRVbml0PiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkV2lk
dGhWYWx1ZShjb25zdCBCb3gmIGxheW91dEJveCwgV2lkdGhUeXBlIHdpZHRoVHlwZSwgTGF5b3V0
VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCkKK3sKKyAgICAvLyBBcHBsaWVzIHRvOiBhbGwgZWxl
bWVudHMgZXhjZXB0IG5vbi1yZXBsYWNlZCBpbmxpbmVzIChvdXQtb2YtZmxvdyBjaGVjayBpcyBy
ZXF1aXJlZCBmb3IgcG9zaXRpb25lZCA8YnI+IGFzIGZvciBzb21lIHJlYXNvbiB3ZSBkb24ndCBi
bG9ja2lmeSB0aGVtKS4KKyAgICBBU1NFUlQoIWxheW91dEJveC5pc0lubGluZUJveCgpIHx8IGxh
eW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisKKyAgICBhdXRvIHdpZHRoID0gWyZd
IHsKKyAgICAgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICAgICAgc3dp
dGNoICh3aWR0aFR5cGUpIHsKKyAgICAgICAgY2FzZSBXaWR0aFR5cGU6Ok5vcm1hbDoKKyAgICAg
ICAgICAgIHJldHVybiBzdHlsZS5sb2dpY2FsV2lkdGgoKTsKKyAgICAgICAgY2FzZSBXaWR0aFR5
cGU6Ok1pbjoKKyAgICAgICAgICAgIHJldHVybiBzdHlsZS5sb2dpY2FsTWluV2lkdGgoKTsKKyAg
ICAgICAgY2FzZSBXaWR0aFR5cGU6Ok1heDoKKyAgICAgICAgICAgIHJldHVybiBzdHlsZS5sb2dp
Y2FsTWF4V2lkdGgoKTsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICAgICAgcmV0dXJuIHN0eWxlLmxvZ2ljYWxXaWR0aCgpOworICAgIH0oKTsKKyAgICBpZiAo
YXV0byBjb21wdXRlZFZhbHVlID0gdGhpcy0+Y29tcHV0ZWRWYWx1ZSh3aWR0aCwgY29udGFpbmlu
Z0Jsb2NrV2lkdGgpKQorICAgICAgICByZXR1cm4gY29tcHV0ZWRWYWx1ZTsKKworICAgIGlmICh3
aWR0aC5pc01pbkNvbnRlbnQoKSB8fCB3aWR0aC5pc01heENvbnRlbnQoKSB8fCB3aWR0aC5pc0Zp
dENvbnRlbnQoKSkgeworICAgICAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkK
KyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgIGF1dG8mIGNvbnRhaW5lckJveCA9IGRv
d25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKKyAgICAgICAgLy8gRklYTUU6IENvbnNp
ZGVyIHNwbGl0dGluZyB1cCBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgc28gdGhh
dCB3ZSBjb3VsZCBjb21wdXRlZCB0aGUgbWluIGFuZCBtYXggdmFsdWVzIHNlcGFyYXRlbHkuCisg
ICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IFsmXSB7CisgICAgICAgICAg
ICBpZiAoIWNvbnRhaW5lckJveC5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IDBfbHUsIGNvbnRhaW5p
bmdCbG9ja1dpZHRoIH07CisgICAgICAgICAgICBBU1NFUlQoY29udGFpbmVyQm94LmVzdGFibGlz
aGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7CisgICAgICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3Rh
dGUgPSBsYXlvdXRTdGF0ZSgpLmVuc3VyZUZvcm1hdHRpbmdTdGF0ZShjb250YWluZXJCb3gpOwor
ICAgICAgICAgICAgaWYgKGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGZvcm1hdHRp
bmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkpCisgICAgICAgICAgICAgICAgcmV0
dXJuICppbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOworICAgICAgICAgICAgcmV0dXJuIExheW91
dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGNvbnRhaW5lckJveCwgbGF5b3V0U3Rh
dGUoKSktPmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOworICAgICAgICB9KCk7
CisgICAgICAgIGlmICh3aWR0aC5pc01pbkNvbnRlbnQoKSkKKyAgICAgICAgICAgIHJldHVybiBp
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW07CisgICAgICAgIGlmICh3aWR0aC5pc01h
eENvbnRlbnQoKSkKKyAgICAgICAgICAgIHJldHVybiBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
Lm1heGltdW07CisgICAgICAgIEFTU0VSVCh3aWR0aC5pc0ZpdENvbnRlbnQoKSk7CisgICAgICAg
IC8vIElmIHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gYSBnaXZlbiBheGlzIGlzIGRlZmluaXRlLCBl
cXVhbCB0byBtaW4obWF4LWNvbnRlbnQgc2l6ZSwKKyAgICAgICAgLy8gbWF4KG1pbi1jb250ZW50
IHNpemUsIHN0cmV0Y2gtZml0IHNpemUpKS4gT3RoZXJ3aXNlLCBlcXVhbCB0byB0aGUgbWF4LWNv
bnRlbnQgc2l6ZSBpbiB0aGF0IGF4aXMuCisgICAgICAgIC8vIEZJWE1FOiBXZSBkb24ndCB5ZXQg
aGF2ZSBpbmRlZmluaXRlIGF2YWlsYWJsZSBzaXplLgorICAgICAgICByZXR1cm4gc3RkOjptaW4o
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtLCBzdGQ6Om1heChpbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzLm1pbmltdW0sIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSk7CisgICAgfQorICAg
IHJldHVybiB7IH07Cit9CisKK09wdGlvbmFsPExheW91dFVuaXQ+IEZvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeTo6Y29tcHV0ZWRXaWR0aChjb25zdCBCb3gmIGxheW91dEJveCwgTGF5b3V0VW5p
dCBjb250YWluaW5nQmxvY2tXaWR0aCkKK3sKKyAgICBpZiAoYXV0byBjb21wdXRlZFdpZHRoID0g
Y29tcHV0ZWRXaWR0aFZhbHVlKGxheW91dEJveCwgV2lkdGhUeXBlOjpOb3JtYWwsIGNvbnRhaW5p
bmdCbG9ja1dpZHRoKSkgeworICAgICAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgp
OworICAgICAgICAvLyBOb24tcXVhbnRpdGF0aXZlIHZhbHVlcyBzdWNoIGFzIGF1dG8gYW5kIG1p
bi1jb250ZW50IGFyZSBub3QgaW5mbHVlbmNlZCBieSB0aGUgYm94LXNpemluZyBwcm9wZXJ0eS4K
KyAgICAgICAgaWYgKHN0eWxlLmJveFNpemluZygpID09IEJveFNpemluZzo6Q29udGVudEJveCB8
fCBzdHlsZS53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCisgICAgICAgICAgICByZXR1cm4g
Y29tcHV0ZWRXaWR0aDsKKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29u
dGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAgICAgIHJldHVybiAqY29tcHV0
ZWRXaWR0aCAtIChib3hHZW9tZXRyeS5ob3Jpem9udGFsQm9yZGVyKCkgKyBib3hHZW9tZXRyeS5o
b3Jpem9udGFsUGFkZGluZygpLnZhbHVlT3IoMCkpOworICAgIH0KKyAgICByZXR1cm4geyB9Owor
fQorCitMYXlvdXRVbml0IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29udGVudEhlaWdo
dEZvckZvcm1hdHRpbmdDb250ZXh0Um9vdChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdD
b250ZXh0Um9vdCkgY29uc3QKK3sKKyAgICBBU1NFUlQoZm9ybWF0dGluZ0NvbnRleHRSb290LmVz
dGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7CisgICAgQVNTRVJUKGlzSGVpZ2h0QXV0byhm
b3JtYXR0aW5nQ29udGV4dFJvb3QpIHx8IGZvcm1hdHRpbmdDb250ZXh0Um9vdC5lc3RhYmxpc2hl
c1RhYmxlRm9ybWF0dGluZ0NvbnRleHQoKSB8fCBmb3JtYXR0aW5nQ29udGV4dFJvb3QuaXNUYWJs
ZUNlbGwoKSk7CisgICAgYXV0byB1c2VkQ29udGVudEhlaWdodCA9IExheW91dFVuaXQgeyB9OyAK
KyAgICBhdXRvIGhhc0NvbnRlbnQgPSBmb3JtYXR0aW5nQ29udGV4dFJvb3QuaGFzSW5GbG93T3JG
bG9hdGluZ0NoaWxkKCk7CisgICAgLy8gVGhlIHVzZWQgaGVpZ2h0IG9mIHRoZSBjb250YWlubWVu
dCBib3ggaXMgZGV0ZXJtaW5lZCBhcyBpZiBwZXJmb3JtaW5nIGEgbm9ybWFsIGxheW91dCBvZiB0
aGUgYm94LCBleGNlcHQgdGhhdCBpdCBpcyB0cmVhdGVkIGFzIGhhdmluZyBubyBjb250ZW50Lgor
ICAgIGF1dG8gc2hvdWxkSWdub3JlQ29udGVudCA9IGZvcm1hdHRpbmdDb250ZXh0Um9vdC5pc1Np
emVDb250YWlubWVudEJveCgpOworICAgIGlmIChoYXNDb250ZW50ICYmICFzaG91bGRJZ25vcmVD
b250ZW50KQorICAgICAgICB1c2VkQ29udGVudEhlaWdodCA9IExheW91dENvbnRleHQ6OmNyZWF0
ZUZvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgY29uc3RfY2FzdDxMYXlv
dXRTdGF0ZSY+KGxheW91dFN0YXRlKCkpKS0+dXNlZENvbnRlbnRIZWlnaHQoKTsKKyAgICByZXR1
cm4gdXNlZENvbnRlbnRIZWlnaHQ7Cit9CisKK09wdGlvbmFsPExheW91dFVuaXQ+IEZvcm1hdHRp
bmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRWYWx1ZShjb25zdCBMZW5ndGgmIGdlb21ldHJ5
UHJvcGVydHksIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpIGNvbnN0Cit7CisgICAg
Ly8gIEluIGdlbmVyYWwsIHRoZSBjb21wdXRlZCB2YWx1ZSByZXNvbHZlcyB0aGUgc3BlY2lmaWVk
IHZhbHVlIGFzIGZhciBhcyBwb3NzaWJsZSB3aXRob3V0IGxheWluZyBvdXQgdGhlIGNvbnRlbnQu
CisgICAgaWYgKGdlb21ldHJ5UHJvcGVydHkuaXNGaXhlZCgpIHx8IGdlb21ldHJ5UHJvcGVydHku
aXNQZXJjZW50KCkgfHwgZ2VvbWV0cnlQcm9wZXJ0eS5pc0NhbGN1bGF0ZWQoKSkKKyAgICAgICAg
cmV0dXJuIHZhbHVlRm9yTGVuZ3RoKGdlb21ldHJ5UHJvcGVydHksIGNvbnRhaW5pbmdCbG9ja1dp
ZHRoKTsKKyAgICByZXR1cm4geyB9OworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0
aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZpeGVkVmFsdWUoY29uc3QgTGVuZ3RoJiBnZW9tZXRyeVBy
b3BlcnR5KSBjb25zdAoreworICAgIGlmICghZ2VvbWV0cnlQcm9wZXJ0eS5pc0ZpeGVkKCkpCisg
ICAgICAgIHJldHVybiB7IH07CisgICAgcmV0dXJuIExheW91dFVuaXQgeyBnZW9tZXRyeVByb3Bl
cnR5LnZhbHVlKCkgfTsKK30KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIyL3Zpc3Vk
ZXQuaHRtbCNtaW4tbWF4LWhlaWdodHMKKy8vIFNwZWNpZmllcyBhIHBlcmNlbnRhZ2UgZm9yIGRl
dGVybWluaW5nIHRoZSB1c2VkIHZhbHVlLiBUaGUgcGVyY2VudGFnZSBpcyBjYWxjdWxhdGVkIHdp
dGggcmVzcGVjdCB0byB0aGUgaGVpZ2h0IG9mIHRoZSBnZW5lcmF0ZWQgYm94J3MgY29udGFpbmlu
ZyBibG9jay4KKy8vIElmIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgbm90
IHNwZWNpZmllZCBleHBsaWNpdGx5IChpLmUuLCBpdCBkZXBlbmRzIG9uIGNvbnRlbnQgaGVpZ2h0
KSwgYW5kIHRoaXMgZWxlbWVudCBpcyBub3QgYWJzb2x1dGVseSBwb3NpdGlvbmVkLAorLy8gdGhl
IHBlcmNlbnRhZ2UgdmFsdWUgaXMgdHJlYXRlZCBhcyAnMCcgKGZvciAnbWluLWhlaWdodCcpIG9y
ICdub25lJyAoZm9yICdtYXgtaGVpZ2h0JykuCitPcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0
aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkTWF4SGVpZ2h0KGNvbnN0IEJveCYgbGF5b3V0
Qm94LCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGNvbXB1dGVkSGVpZ2h0VmFsdWUobGF5b3V0Qm94LCBIZWlnaHRUeXBlOjpN
YXgsIGNvbnRhaW5pbmdCbG9ja0hlaWdodCk7Cit9CisKK09wdGlvbmFsPExheW91dFVuaXQ+IEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRNaW5IZWlnaHQoY29uc3QgQm94JiBs
YXlvdXRCb3gsIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbnRhaW5pbmdCbG9ja0hlaWdodCkgY29u
c3QKK3sKKyAgICByZXR1cm4gY29tcHV0ZWRIZWlnaHRWYWx1ZShsYXlvdXRCb3gsIEhlaWdodFR5
cGU6Ok1pbiwgY29udGFpbmluZ0Jsb2NrSGVpZ2h0KTsKK30KKworT3B0aW9uYWw8TGF5b3V0VW5p
dD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZE1pbldpZHRoKGNvbnN0IEJv
eCYgbGF5b3V0Qm94LCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKQoreworICAgIHJl
dHVybiBjb21wdXRlZFdpZHRoVmFsdWUobGF5b3V0Qm94LCBXaWR0aFR5cGU6Ok1pbiwgY29udGFp
bmluZ0Jsb2NrV2lkdGgpOworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkTWF4V2lkdGgoY29uc3QgQm94JiBsYXlvdXRCb3gsIExh
eW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpCit7CisgICAgcmV0dXJuIGNvbXB1dGVkV2lk
dGhWYWx1ZShsYXlvdXRCb3gsIFdpZHRoVHlwZTo6TWF4LCBjb250YWluaW5nQmxvY2tXaWR0aCk7
Cit9CisKK0xheW91dFVuaXQgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNWZXJ0
aWNhbFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChjb25zdCBCb3gmIGxheW91dEJveCwg
Y29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cykgY29uc3QKK3sK
KyAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKKworICAgIC8v
IEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBzZWN0aW9uIGFuZCB0aGUgbmV4dCwgdGhlIHRlcm0g
InN0YXRpYyBwb3NpdGlvbiIgKG9mIGFuIGVsZW1lbnQpIHJlZmVycywgcm91Z2hseSwgdG8gdGhl
IHBvc2l0aW9uIGFuIGVsZW1lbnQgd291bGQgaGF2ZQorICAgIC8vIGhhZCBpbiB0aGUgbm9ybWFs
IGZsb3cuIE1vcmUgcHJlY2lzZWx5LCB0aGUgc3RhdGljIHBvc2l0aW9uIGZvciAndG9wJyBpcyB0
aGUgZGlzdGFuY2UgZnJvbSB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgdG8g
dGhlIHRvcCBtYXJnaW4KKyAgICAvLyBlZGdlIG9mIGEgaHlwb3RoZXRpY2FsIGJveCB0aGF0IHdv
dWxkIGhhdmUgYmVlbiB0aGUgZmlyc3QgYm94IG9mIHRoZSBlbGVtZW50IGlmIGl0cyBzcGVjaWZp
ZWQgJ3Bvc2l0aW9uJyB2YWx1ZSBoYWQgYmVlbiAnc3RhdGljJyBhbmQgaXRzIHNwZWNpZmllZAor
ICAgIC8vICdmbG9hdCcgaGFkIGJlZW4gJ25vbmUnIGFuZCBpdHMgc3BlY2lmaWVkICdjbGVhcicg
aGFkIGJlZW4gJ25vbmUnLiAoTm90ZSB0aGF0IGR1ZSB0byB0aGUgcnVsZXMgaW4gc2VjdGlvbiA5
LjcgdGhpcyBtaWdodCByZXF1aXJlIGFsc28gYXNzdW1pbmcgYSBkaWZmZXJlbnQKKyAgICAvLyBj
b21wdXRlZCB2YWx1ZSBmb3IgJ2Rpc3BsYXknLikgVGhlIHZhbHVlIGlzIG5lZ2F0aXZlIGlmIHRo
ZSBoeXBvdGhldGljYWwgYm94IGlzIGFib3ZlIHRoZSBjb250YWluaW5nIGJsb2NrLgorCisgICAg
Ly8gU3RhcnQgd2l0aCB0aGlzIGJveCdzIGJvcmRlciBib3ggb2Zmc2V0IGZyb20gdGhlIHBhcmVu
dCdzIGJvcmRlciBib3guCisgICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3Jt
YXR0aW5nQ29udGV4dCgpOworICAgIExheW91dFVuaXQgdG9wOworICAgIGlmIChsYXlvdXRCb3gu
cHJldmlvdXNJbkZsb3dTaWJsaW5nKCkgJiYgbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGlu
ZygpLT5pc0Jsb2NrTGV2ZWxCb3goKSkgeworICAgICAgICAvLyBBZGQgc2libGluZyBvZmZzZXQK
KyAgICAgICAgYXV0byYgcHJldmlvdXNJbkZsb3dTaWJsaW5nID0gKmxheW91dEJveC5wcmV2aW91
c0luRmxvd1NpYmxpbmcoKTsKKyAgICAgICAgYXV0byYgcHJldmlvdXNJbkZsb3dCb3hHZW9tZXRy
eSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KHByZXZpb3VzSW5GbG93U2libGlu
ZywgRXNjYXBlUmVhc29uOjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5KTsKKyAgICAg
ICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gZG93bmNhc3Q8QmxvY2tGb3JtYXR0aW5nU3RhdGU+
KGxheW91dFN0YXRlKCkuZm9ybWF0dGluZ1N0YXRlRm9yQm94KHByZXZpb3VzSW5GbG93U2libGlu
ZykpOworICAgICAgICBhdXRvIHVzZWRWZXJ0aWNhbE1hcmdpbkZvclByZXZpb3VzQm94ID0gZm9y
bWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihwcmV2aW91c0luRmxvd1NpYmxpbmcpOwor
CisgICAgICAgIHRvcCArPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChwcmV2aW91c0luRmxv
d0JveEdlb21ldHJ5KS5ib3R0b20oKSArIHVzZWRWZXJ0aWNhbE1hcmdpbkZvclByZXZpb3VzQm94
Lm5vbkNvbGxhcHNlZFZhbHVlcy5hZnRlcjsKKyAgICB9IGVsc2UKKyAgICAgICAgdG9wID0gZm9y
bWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LnBhcmVudCgpLCBFc2NhcGVS
ZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0cnkpLmNvbnRlbnRCb3hUb3AoKTsK
KworICAgIC8vIFJlc29sdmUgdG9wIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSBjb250YWluaW5nIGJs
b2NrLgorICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxheW91dEJveC5jb250YWluaW5nQmxv
Y2soKTsKKyAgICAvLyBTdGFydCB3aXRoIHRoZSBwYXJlbnQgc2luY2Ugd2UgcHJldGVuZCB0aGF0
IHRoaXMgYm94IGlzIG5vcm1hbCBmbG93LgorICAgIGZvciAoYXV0byogYW5jZXN0b3IgPSAmbGF5
b3V0Qm94LnBhcmVudCgpOyBhbmNlc3RvciAhPSAmY29udGFpbmluZ0Jsb2NrOyBhbmNlc3RvciA9
ICZhbmNlc3Rvci0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKKyAgICAgICAgYXV0byYgYm94R2VvbWV0
cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveCgqYW5jZXN0b3IsIEVzY2FwZVJl
YXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRyeSk7CisgICAgICAgIC8vIEJveEdl
b21ldHJ5Ojp0b3AgaXMgdGhlIGJvcmRlciBib3ggdG9wIHBvc2l0aW9uIGluIGl0cyBjb250YWlu
aW5nIGJsb2NrJ3MgY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAgICAgIHRvcCArPSBCb3hHZW9tZXRy
eTo6Ym9yZGVyQm94VG9wKGJveEdlb21ldHJ5KTsKKyAgICAgICAgQVNTRVJUKCFhbmNlc3Rvci0+
aXNQb3NpdGlvbmVkKCkgfHwgbGF5b3V0Qm94LmlzRml4ZWRQb3NpdGlvbmVkKCkpOworICAgIH0K
KyAgICAvLyBNb3ZlIHRoZSBzdGF0aWMgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHBhZGRpbmcg
Ym94LiBUaGlzIGlzIHZlcnkgc3BlY2lmaWMgdG8gYWJvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMu
CisgICAgcmV0dXJuIHRvcCAtIHZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbFRvcDsKK30KKwor
TGF5b3V0VW5pdCBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OnN0YXRpY0hvcml6b250YWxQ
b3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0
IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSBjb25zdAorewor
ICAgIEFTU0VSVChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOworICAgIC8vIFNl
ZSBzdGF0aWNWZXJ0aWNhbFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZCBmb3IgdGhlIGRl
ZmluaXRpb24gb2YgdGhlIHN0YXRpYyBwb3NpdGlvbi4KKworICAgIC8vIFN0YXJ0IHdpdGggdGhp
cyBib3gncyBib3JkZXIgYm94IG9mZnNldCBmcm9tIHRoZSBwYXJlbnQncyBib3JkZXIgYm94Lgor
ICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9ybWF0dGluZ0NvbnRleHQoKTsK
KyAgICBhdXRvIGxlZnQgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRC
b3gucGFyZW50KCksIEVzY2FwZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRy
eSkuY29udGVudEJveExlZnQoKTsKKworICAgIC8vIFJlc29sdmUgbGVmdCBhbGwgdGhlIHdheSB1
cCB0byB0aGUgY29udGFpbmluZyBibG9jay4KKyAgICBhdXRvJiBjb250YWluaW5nQmxvY2sgPSBs
YXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7CisgICAgLy8gU3RhcnQgd2l0aCB0aGUgcGFyZW50
IHNpbmNlIHdlIHByZXRlbmQgdGhhdCB0aGlzIGJveCBpcyBub3JtYWwgZmxvdy4KKyAgICBmb3Ig
KGF1dG8qIGFuY2VzdG9yID0gJmxheW91dEJveC5wYXJlbnQoKTsgYW5jZXN0b3IgIT0gJmNvbnRh
aW5pbmdCbG9jazsgYW5jZXN0b3IgPSAmYW5jZXN0b3ItPmNvbnRhaW5pbmdCbG9jaygpKSB7Cisg
ICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JC
b3goKmFuY2VzdG9yLCBFc2NhcGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0
cnkpOworICAgICAgICAvLyBCb3hHZW9tZXRyeTo6bGVmdCBpcyB0aGUgYm9yZGVyIGJveCBsZWZ0
IHBvc2l0aW9uIGluIGl0cyBjb250YWluaW5nIGJsb2NrJ3MgY29vcmRpbmF0ZSBzeXN0ZW0uCisg
ICAgICAgIGxlZnQgKz0gQm94R2VvbWV0cnk6OmJvcmRlckJveExlZnQoYm94R2VvbWV0cnkpOwor
ICAgICAgICBBU1NFUlQoIWFuY2VzdG9yLT5pc1Bvc2l0aW9uZWQoKSB8fCBsYXlvdXRCb3guaXNG
aXhlZFBvc2l0aW9uZWQoKSk7CisgICAgfQorICAgIC8vIE1vdmUgdGhlIHN0YXRpYyBwb3NpdGlv
biByZWxhdGl2ZSB0byB0aGUgcGFkZGluZyBib3guIFRoaXMgaXMgdmVyeSBzcGVjaWZpYyB0byBh
Ym9sdXRlbHkgcG9zaXRpb25lZCBib3hlcy4KKyAgICByZXR1cm4gbGVmdCAtIGhvcml6b250YWxD
b25zdHJhaW50cy5sb2dpY2FsTGVmdDsKK30KKworTGF5b3V0VW5pdCBGb3JtYXR0aW5nQ29udGV4
dDo6R2VvbWV0cnk6OnNocmlua1RvRml0V2lkdGgoY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4
dFJvb3QsIExheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgpCit7CisgICAgTE9HX1dJVEhfU1RSRUFN
KEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltXaWR0aF0gLT4gc2hyaW5rIHRv
IGZpdCAtPiB1bnN1cHBvcnRlZCAtPiB3aWR0aCgiIDw8IExheW91dFVuaXQgeyB9IDw8ICJweCkg
bGF5b3V0Qm94OiAiIDw8ICZmb3JtYXR0aW5nQ29udGV4dFJvb3QgPDwgIikiKTsKKyAgICBBU1NF
UlQoZm9ybWF0dGluZ0NvbnRleHRSb290LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7
CisKKyAgICAvLyBDYWxjdWxhdGlvbiBvZiB0aGUgc2hyaW5rLXRvLWZpdCB3aWR0aCBpcyBzaW1p
bGFyIHRvIGNhbGN1bGF0aW5nIHRoZSB3aWR0aCBvZiBhIHRhYmxlIGNlbGwgdXNpbmcgdGhlIGF1
dG9tYXRpYyB0YWJsZSBsYXlvdXQgYWxnb3JpdGhtLgorICAgIC8vIFJvdWdobHk6IGNhbGN1bGF0
ZSB0aGUgcHJlZmVycmVkIHdpZHRoIGJ5IGZvcm1hdHRpbmcgdGhlIGNvbnRlbnQgd2l0aG91dCBi
cmVha2luZyBsaW5lcyBvdGhlciB0aGFuIHdoZXJlIGV4cGxpY2l0IGxpbmUgYnJlYWtzIG9jY3Vy
LAorICAgIC8vIGFuZCBhbHNvIGNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIG1pbmltdW0gd2lkdGgs
IGUuZy4sIGJ5IHRyeWluZyBhbGwgcG9zc2libGUgbGluZSBicmVha3MuIENTUyAyLjIgZG9lcyBu
b3QgZGVmaW5lIHRoZSBleGFjdCBhbGdvcml0aG0uCisgICAgLy8gVGhpcmRseSwgZmluZCB0aGUg
YXZhaWxhYmxlIHdpZHRoOiBpbiB0aGlzIGNhc2UsIHRoaXMgaXMgdGhlIHdpZHRoIG9mIHRoZSBj
b250YWluaW5nIGJsb2NrIG1pbnVzIHRoZSB1c2VkIHZhbHVlcyBvZiAnbWFyZ2luLWxlZnQnLCAn
Ym9yZGVyLWxlZnQtd2lkdGgnLAorICAgIC8vICdwYWRkaW5nLWxlZnQnLCAncGFkZGluZy1yaWdo
dCcsICdib3JkZXItcmlnaHQtd2lkdGgnLCAnbWFyZ2luLXJpZ2h0JywgYW5kIHRoZSB3aWR0aHMg
b2YgYW55IHJlbGV2YW50IHNjcm9sbCBiYXJzLgorCisgICAgLy8gVGhlbiB0aGUgc2hyaW5rLXRv
LWZpdCB3aWR0aCBpczogbWluKG1heChwcmVmZXJyZWQgbWluaW11bSB3aWR0aCwgYXZhaWxhYmxl
IHdpZHRoKSwgcHJlZmVycmVkIHdpZHRoKS4KKyAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMgPSBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKKyAgICBhdXRvIGhhc0NvbnRl
bnQgPSBpczxDb250YWluZXJCb3g+KGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgJiYgZG93bmNhc3Q8
Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3QpLmhhc0luRmxvd09yRmxvYXRpbmdD
aGlsZCgpOworICAgIC8vIFRoZSB1c2VkIHdpZHRoIG9mIHRoZSBjb250YWlubWVudCBib3ggaXMg
ZGV0ZXJtaW5lZCBhcyBpZiBwZXJmb3JtaW5nIGEgbm9ybWFsIGxheW91dCBvZiB0aGUgYm94LCBl
eGNlcHQgdGhhdCBpdCBpcyB0cmVhdGVkIGFzIGhhdmluZyBubyBjb250ZW50LgorICAgIGF1dG8g
c2hvdWxkSWdub3JlQ29udGVudCA9IGZvcm1hdHRpbmdDb250ZXh0Um9vdC5pc1NpemVDb250YWlu
bWVudEJveCgpOyAgCisgICAgaWYgKGhhc0NvbnRlbnQgJiYgIXNob3VsZElnbm9yZUNvbnRlbnQp
IHsKKyAgICAgICAgYXV0byYgcm9vdCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4oZm9ybWF0dGlu
Z0NvbnRleHRSb290KTsKKyAgICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlRm9yUm9vdCA9IGxh
eW91dFN0YXRlKCkuZW5zdXJlRm9ybWF0dGluZ1N0YXRlKHJvb3QpOworICAgICAgICBhdXRvIHBy
ZWNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGZvcm1hdHRpbmdTdGF0ZUZvclJv
b3QuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOworICAgICAgICBpZiAoIXByZWNvbXB1dGVk
SW50cmluc2ljV2lkdGhDb25zdHJhaW50cykKKyAgICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChyb290LCBs
YXlvdXRTdGF0ZSgpKS0+Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSAqcHJlY29t
cHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOworICAgIH0KKyAgICByZXR1cm4gc3RkOjpt
aW4oc3RkOjptYXgoaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtLCBhdmFpbGFibGVX
aWR0aCksIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSk7Cit9CisKK1ZlcnRpY2Fs
R2VvbWV0cnkgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dOb25SZXBsYWNl
ZFZlcnRpY2FsR2VvbWV0cnkoY29uc3QgQ29udGFpbmVyQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBWZXJ0aWNh
bENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuVmVydGlj
YWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgY29uc3QKK3sKKyAgICBBU1NFUlQo
bGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guaXNSZXBsYWNl
ZEJveCgpKTsKKyAgICBBU1NFUlQodmVydGljYWxDb25zdHJhaW50cy5sb2dpY2FsSGVpZ2h0KTsK
KworICAgIC8vIDEwLjYuNCBBYnNvbHV0ZWx5IHBvc2l0aW9uZWQsIG5vbi1yZXBsYWNlZCBlbGVt
ZW50cworICAgIC8vCisgICAgLy8gRm9yIGFic29sdXRlbHkgcG9zaXRpb25lZCBlbGVtZW50cywg
dGhlIHVzZWQgdmFsdWVzIG9mIHRoZSB2ZXJ0aWNhbCBkaW1lbnNpb25zIG11c3Qgc2F0aXNmeSB0
aGlzIGNvbnN0cmFpbnQ6CisgICAgLy8gJ3RvcCcgKyAnbWFyZ2luLXRvcCcgKyAnYm9yZGVyLXRv
cC13aWR0aCcgKyAncGFkZGluZy10b3AnICsgJ2hlaWdodCcgKyAncGFkZGluZy1ib3R0b20nICsg
J2JvcmRlci1ib3R0b20td2lkdGgnICsgJ21hcmdpbi1ib3R0b20nICsgJ2JvdHRvbScKKyAgICAv
LyA9IGhlaWdodCBvZiBjb250YWluaW5nIGJsb2NrCisKKyAgICAvLyBJZiBhbGwgdGhyZWUgb2Yg
J3RvcCcsICdoZWlnaHQnLCBhbmQgJ2JvdHRvbScgYXJlIGF1dG8sIHNldCAndG9wJyB0byB0aGUg
c3RhdGljIHBvc2l0aW9uIGFuZCBhcHBseSBydWxlIG51bWJlciB0aHJlZSBiZWxvdy4KKworICAg
IC8vIElmIG5vbmUgb2YgdGhlIHRocmVlIGFyZSAnYXV0byc6IElmIGJvdGggJ21hcmdpbi10b3An
IGFuZCAnbWFyZ2luLWJvdHRvbScgYXJlICdhdXRvJywgc29sdmUgdGhlIGVxdWF0aW9uIHVuZGVy
IHRoZSBleHRyYQorICAgIC8vIGNvbnN0cmFpbnQgdGhhdCB0aGUgdHdvIG1hcmdpbnMgZ2V0IGVx
dWFsIHZhbHVlcy4gSWYgb25lIG9mICdtYXJnaW4tdG9wJyBvciAnbWFyZ2luLWJvdHRvbScgaXMg
J2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gZm9yIHRoYXQgdmFsdWUuCisgICAgLy8gSWYgdGhl
IHZhbHVlcyBhcmUgb3Zlci1jb25zdHJhaW5lZCwgaWdub3JlIHRoZSB2YWx1ZSBmb3IgJ2JvdHRv
bScgYW5kIHNvbHZlIGZvciB0aGF0IHZhbHVlLgorCisgICAgLy8gT3RoZXJ3aXNlLCBwaWNrIHRo
ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzaXggcnVsZXMgdGhhdCBhcHBsaWVzLgorCisgICAgLy8g
MS4gJ3RvcCcgYW5kICdoZWlnaHQnIGFyZSAnYXV0bycgYW5kICdib3R0b20nIGlzIG5vdCAnYXV0
bycsIHRoZW4gdGhlIGhlaWdodCBpcyBiYXNlZCBvbiB0aGUgY29udGVudCBwZXIgMTAuNi43LAor
ICAgIC8vICAgICBzZXQgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi10b3AnIGFuZCAnbWFyZ2lu
LWJvdHRvbScgdG8gMCwgYW5kIHNvbHZlIGZvciAndG9wJworICAgIC8vIDIuICd0b3AnIGFuZCAn
Ym90dG9tJyBhcmUgJ2F1dG8nIGFuZCAnaGVpZ2h0JyBpcyBub3QgJ2F1dG8nLCB0aGVuIHNldCAn
dG9wJyB0byB0aGUgc3RhdGljIHBvc2l0aW9uLCBzZXQgJ2F1dG8nIHZhbHVlcyBmb3IKKyAgICAv
LyAgICAnbWFyZ2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyB0byAwLCBhbmQgc29sdmUgZm9y
ICdib3R0b20nCisgICAgLy8gMy4gJ2hlaWdodCcgYW5kICdib3R0b20nIGFyZSAnYXV0bycgYW5k
ICd0b3AnIGlzIG5vdCAnYXV0bycsIHRoZW4gdGhlIGhlaWdodCBpcyBiYXNlZCBvbiB0aGUgY29u
dGVudCBwZXIgMTAuNi43LCBzZXQgJ2F1dG8nCisgICAgLy8gICAgIHZhbHVlcyBmb3IgJ21hcmdp
bi10b3AnIGFuZCAnbWFyZ2luLWJvdHRvbScgdG8gMCwgYW5kIHNvbHZlIGZvciAnYm90dG9tJwor
ICAgIC8vIDQuICd0b3AnIGlzICdhdXRvJywgJ2hlaWdodCcgYW5kICdib3R0b20nIGFyZSBub3Qg
J2F1dG8nLCB0aGVuIHNldCAnYXV0bycgdmFsdWVzIGZvciAnbWFyZ2luLXRvcCcgYW5kICdtYXJn
aW4tYm90dG9tJyB0byAwLCBhbmQgc29sdmUgZm9yICd0b3AnCisgICAgLy8gNS4gJ2hlaWdodCcg
aXMgJ2F1dG8nLCAndG9wJyBhbmQgJ2JvdHRvbScgYXJlIG5vdCAnYXV0bycsIHRoZW4gJ2F1dG8n
IHZhbHVlcyBmb3IgJ21hcmdpbi10b3AnIGFuZCAnbWFyZ2luLWJvdHRvbScgYXJlIHNldCB0byAw
IGFuZCBzb2x2ZSBmb3IgJ2hlaWdodCcKKyAgICAvLyA2LiAnYm90dG9tJyBpcyAnYXV0bycsICd0
b3AnIGFuZCAnaGVpZ2h0JyBhcmUgbm90ICdhdXRvJywgdGhlbiBzZXQgJ2F1dG8nIHZhbHVlcyBm
b3IgJ21hcmdpbi10b3AnIGFuZCAnbWFyZ2luLWJvdHRvbScgdG8gMCBhbmQgc29sdmUgZm9yICdi
b3R0b20nCisKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdD
b250ZXh0KCk7CisgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICBhdXRv
JiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJv
eCk7CisgICAgYXV0byBjb250YWluaW5nQmxvY2tIZWlnaHQgPSAqdmVydGljYWxDb25zdHJhaW50
cy5sb2dpY2FsSGVpZ2h0OworICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9u
dGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoOworCisgICAgYXV0byB0b3AgPSBjb21wdXRlZFZh
bHVlKHN0eWxlLmxvZ2ljYWxUb3AoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworICAgIGF1dG8g
Ym90dG9tID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2FsQm90dG9tKCksIGNvbnRhaW5pbmdC
bG9ja1dpZHRoKTsKKyAgICBhdXRvIGhlaWdodCA9IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5o
ZWlnaHQgPyBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVpZ2h0LnZhbHVlKCkgOiBjb21wdXRl
ZEhlaWdodChsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja0hlaWdodCk7CisgICAgYXV0byBjb21w
dXRlZFZlcnRpY2FsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVkVmVydGljYWxNYXJnaW4obGF5
b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6
Tm9uQ29sbGFwc2VkVmFsdWVzIHVzZWRWZXJ0aWNhbE1hcmdpbjsgCisgICAgYXV0byBwYWRkaW5n
VG9wID0gYm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCk7CisgICAgYXV0byBwYWRk
aW5nQm90dG9tID0gYm94R2VvbWV0cnkucGFkZGluZ0JvdHRvbSgpLnZhbHVlT3IoMCk7CisgICAg
YXV0byBib3JkZXJUb3AgPSBib3hHZW9tZXRyeS5ib3JkZXJUb3AoKTsKKyAgICBhdXRvIGJvcmRl
ckJvdHRvbSA9IGJveEdlb21ldHJ5LmJvcmRlckJvdHRvbSgpOworCisgICAgaWYgKCF0b3AgJiYg
IWhlaWdodCAmJiAhYm90dG9tKQorICAgICAgICB0b3AgPSBzdGF0aWNWZXJ0aWNhbFBvc2l0aW9u
Rm9yT3V0T2ZGbG93UG9zaXRpb25lZChsYXlvdXRCb3gsIHZlcnRpY2FsQ29uc3RyYWludHMpOwor
CisgICAgaWYgKHRvcCAmJiBoZWlnaHQgJiYgYm90dG9tKSB7CisgICAgICAgIGlmICghY29tcHV0
ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgJiYgIWNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIp
IHsKKyAgICAgICAgICAgIGF1dG8gbWFyZ2luQmVmb3JlQW5kQWZ0ZXIgPSBjb250YWluaW5nQmxv
Y2tIZWlnaHQgLSAoKnRvcCArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyAqaGVpZ2h0ICsgcGFk
ZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArICpib3R0b20pOworICAgICAgICAgICAgdXNlZFZl
cnRpY2FsTWFyZ2luID0geyBtYXJnaW5CZWZvcmVBbmRBZnRlciAvIDIsIG1hcmdpbkJlZm9yZUFu
ZEFmdGVyIC8gMiB9OworICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZFZlcnRpY2FsTWFyZ2lu
LmJlZm9yZSkgeworICAgICAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyID0gKmNvbXB1
dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXI7CisgICAgICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4u
YmVmb3JlID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyBib3JkZXJUb3AgKyBwYWRk
aW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVy
dGljYWxNYXJnaW4uYWZ0ZXIgKyAqYm90dG9tKTsKKyAgICAgICAgfSBlbHNlIGlmICghY29tcHV0
ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlcikgeworICAgICAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2lu
LmJlZm9yZSA9ICpjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZTsKKyAgICAgICAgICAgIHVz
ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsg
dXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyAqaGVp
Z2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArICpib3R0b20pOworICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IHsgKmNvbXB1dGVkVmVydGlj
YWxNYXJnaW4uYmVmb3JlLCAqY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciB9OworICAgICAg
ICAvLyBPdmVyLWNvbnN0cmFpbmVkPworICAgICAgICBhdXRvIGJveEhlaWdodCA9ICp0b3AgKyB1
c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWln
aHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFm
dGVyICsgKmJvdHRvbTsKKyAgICAgICAgaWYgKGJveEhlaWdodCAhPSBjb250YWluaW5nQmxvY2tI
ZWlnaHQpCisgICAgICAgICAgICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRv
cCArIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsg
KmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVydGljYWxNYXJn
aW4uYWZ0ZXIpOworICAgIH0KKworICAgIGlmICghdG9wICYmICFoZWlnaHQgJiYgYm90dG9tKSB7
CisgICAgICAgIC8vICMxCisgICAgICAgIGhlaWdodCA9IGNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0
aW5nQ29udGV4dFJvb3QobGF5b3V0Qm94KTsKKyAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luID0g
eyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21wdXRlZFZlcnRp
Y2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKKyAgICAgICAgdG9wID0gY29udGFpbmluZ0Js
b2NrSGVpZ2h0IC0gKHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRk
aW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVy
dGljYWxNYXJnaW4uYWZ0ZXIgKyAqYm90dG9tKTsgCisgICAgfQorCisgICAgaWYgKCF0b3AgJiYg
IWJvdHRvbSAmJiBoZWlnaHQpIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAgdG9wID0gc3RhdGlj
VmVydGljYWxQb3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQobGF5b3V0Qm94LCB2ZXJ0aWNh
bENvbnN0cmFpbnRzKTsKKyAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luID0geyBjb21wdXRlZFZl
cnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFm
dGVyLnZhbHVlT3IoMCkgfTsKKyAgICAgICAgYm90dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0
IC0gKCp0b3AgKyB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGlu
Z1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRp
Y2FsTWFyZ2luLmFmdGVyKTsKKyAgICB9CisKKyAgICBpZiAoIWhlaWdodCAmJiAhYm90dG9tICYm
IHRvcCkgeworICAgICAgICAvLyAjMworICAgICAgICBoZWlnaHQgPSBjb250ZW50SGVpZ2h0Rm9y
Rm9ybWF0dGluZ0NvbnRleHRSb290KGxheW91dEJveCk7CisgICAgICAgIHVzZWRWZXJ0aWNhbE1h
cmdpbiA9IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0
ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgICAgIGJvdHRvbSA9IGNv
bnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSAr
IGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRl
ckJvdHRvbSArIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlcik7CisgICAgfQorCisgICAgaWYgKCF0
b3AgJiYgaGVpZ2h0ICYmIGJvdHRvbSkgeworICAgICAgICAvLyAjNAorICAgICAgICB1c2VkVmVy
dGljYWxNYXJnaW4gPSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCks
IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OworICAgICAgICB0b3Ag
PSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAodXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJv
cmRlclRvcCArIHBhZGRpbmdUb3AgKyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJv
dHRvbSArIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciArICpib3R0b20pOworICAgIH0KKworICAg
IGlmICghaGVpZ2h0ICYmIHRvcCAmJiBib3R0b20pIHsKKyAgICAgICAgLy8gIzUKKyAgICAgICAg
dXNlZFZlcnRpY2FsTWFyZ2luID0geyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1
ZU9yKDApLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKKyAgICAg
ICAgaGVpZ2h0ID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyB1c2VkVmVydGljYWxN
YXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIHBhZGRpbmdCb3R0b20gKyBi
b3JkZXJCb3R0b20gKyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgKyAqYm90dG9tKTsKKyAgICB9
CisKKyAgICBpZiAoIWJvdHRvbSAmJiB0b3AgJiYgaGVpZ2h0KSB7CisgICAgICAgIC8vICM2Cisg
ICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZv
cmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07
CisgICAgICAgIGJvdHRvbSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgdXNlZFZl
cnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyAqaGVpZ2h0ICsg
cGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlcik7
CisgICAgfQorCisgICAgQVNTRVJUKHRvcCk7CisgICAgQVNTRVJUKGJvdHRvbSk7CisgICAgQVNT
RVJUKGhlaWdodCk7CisKKyAgICAvLyBGb3Igb3V0LW9mLWZsb3cgZWxlbWVudHMgdGhlIGNvbnRh
aW5pbmcgYmxvY2sgaXMgZm9ybWVkIGJ5IHRoZSBwYWRkaW5nIGVkZ2Ugb2YgdGhlIGFuY2VzdG9y
LgorICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBvc2l0aW9uZWQgdmFsdWUgaXMgaW4gdGhlIGNv
b3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBwYWRkaW5nIGJveC4gTGV0J3MgY29udmVydCBpdCB0byBi
b3JkZXIgYm94IGNvb3JkaW5hdGUgc3lzdGVtLgorICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrUGFk
ZGluZ1ZlcnRpY2FsRWRnZSA9IHZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbFRvcDsKKyAgICAq
dG9wICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7CisgICAgKmJvdHRvbSAr
PSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOworCisgICAgTE9HX1dJVEhfU1RS
RUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltQb3NpdGlvbl1bSGVpZ2h0
XVtNYXJnaW5dIC0+IG91dC1vZi1mbG93IG5vbi1yZXBsYWNlZCAtPiB0b3AoIiA8PCAqdG9wIDw8
ICJweCkgYm90dG9tKCIgIDw8ICpib3R0b20gPDwgInB4KSBoZWlnaHQoIiA8PCAqaGVpZ2h0IDw8
ICJweCkgbWFyZ2luKCIgPDwgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSA8PCAicHgsICIgIDw8
IHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciA8PCAicHgpIGxheW91dEJveCgiIDw8ICZsYXlvdXRC
b3ggPDwgIikiKTsKKyAgICByZXR1cm4geyAqdG9wLCAqYm90dG9tLCB7ICpoZWlnaHQsIHVzZWRW
ZXJ0aWNhbE1hcmdpbiB9IH07Cit9CisKK0hvcml6b250YWxHZW9tZXRyeSBGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6Om91dE9mRmxvd05vblJlcGxhY2VkSG9yaXpvbnRhbEdlb21ldHJ5KGNv
bnN0IENvbnRhaW5lckJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMm
IGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMm
IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNP
dXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpOworICAg
IAorICAgIC8vIDEwLjMuNyBBYnNvbHV0ZWx5IHBvc2l0aW9uZWQsIG5vbi1yZXBsYWNlZCBlbGVt
ZW50cworICAgIC8vCisgICAgLy8gJ2xlZnQnICsgJ21hcmdpbi1sZWZ0JyArICdib3JkZXItbGVm
dC13aWR0aCcgKyAncGFkZGluZy1sZWZ0JyArICd3aWR0aCcgKyAncGFkZGluZy1yaWdodCcgKyAn
Ym9yZGVyLXJpZ2h0LXdpZHRoJyArICdtYXJnaW4tcmlnaHQnICsgJ3JpZ2h0JworICAgIC8vID0g
d2lkdGggb2YgY29udGFpbmluZyBibG9jaworCisgICAgLy8gSWYgYWxsIHRocmVlIG9mICdsZWZ0
JywgJ3dpZHRoJywgYW5kICdyaWdodCcgYXJlICdhdXRvJzogRmlyc3Qgc2V0IGFueSAnYXV0bycg
dmFsdWVzIGZvciAnbWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyB0byAwLgorICAgIC8v
IFRoZW4sIGlmIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgZWxlbWVudCBlc3RhYmxp
c2hpbmcgdGhlIHN0YXRpYy1wb3NpdGlvbiBjb250YWluaW5nIGJsb2NrIGlzICdsdHInIHNldCAn
bGVmdCcgdG8gdGhlIHN0YXRpYworICAgIC8vIHBvc2l0aW9uIGFuZCBhcHBseSBydWxlIG51bWJl
ciB0aHJlZSBiZWxvdzsgb3RoZXJ3aXNlLCBzZXQgJ3JpZ2h0JyB0byB0aGUgc3RhdGljIHBvc2l0
aW9uIGFuZCBhcHBseSBydWxlIG51bWJlciBvbmUgYmVsb3cuCisgICAgLy8KKyAgICAvLyBJZiBu
b25lIG9mIHRoZSB0aHJlZSBpcyAnYXV0byc6IElmIGJvdGggJ21hcmdpbi1sZWZ0JyBhbmQgJ21h
cmdpbi1yaWdodCcgYXJlICdhdXRvJywgc29sdmUgdGhlIGVxdWF0aW9uIHVuZGVyIHRoZSBleHRy
YSBjb25zdHJhaW50IHRoYXQgdGhlIHR3byBtYXJnaW5zIGdldCBlcXVhbCB2YWx1ZXMsCisgICAg
Ly8gdW5sZXNzIHRoaXMgd291bGQgbWFrZSB0aGVtIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIHdo
ZW4gZGlyZWN0aW9uIG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGlzICdsdHInICgncnRsJyksIHNl
dCAnbWFyZ2luLWxlZnQnICgnbWFyZ2luLXJpZ2h0JykgdG8gemVybyBhbmQKKyAgICAvLyBzb2x2
ZSBmb3IgJ21hcmdpbi1yaWdodCcgKCdtYXJnaW4tbGVmdCcpLiBJZiBvbmUgb2YgJ21hcmdpbi1s
ZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBpcyAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiBmb3Ig
dGhhdCB2YWx1ZS4KKyAgICAvLyBJZiB0aGUgdmFsdWVzIGFyZSBvdmVyLWNvbnN0cmFpbmVkLCBp
Z25vcmUgdGhlIHZhbHVlIGZvciAnbGVmdCcgKGluIGNhc2UgdGhlICdkaXJlY3Rpb24nIHByb3Bl
cnR5IG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGlzICdydGwnKSBvciAncmlnaHQnCisgICAgLy8g
KGluIGNhc2UgJ2RpcmVjdGlvbicgaXMgJ2x0cicpIGFuZCBzb2x2ZSBmb3IgdGhhdCB2YWx1ZS4K
KyAgICAvLworICAgIC8vIE90aGVyd2lzZSwgc2V0ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4t
bGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIHRvIDAsIGFuZCBwaWNrIHRoZSBvbmUgb2YgdGhlIGZv
bGxvd2luZyBzaXggcnVsZXMgdGhhdCBhcHBsaWVzLgorICAgIC8vCisgICAgLy8gMS4gJ2xlZnQn
IGFuZCAnd2lkdGgnIGFyZSAnYXV0bycgYW5kICdyaWdodCcgaXMgbm90ICdhdXRvJywgdGhlbiB0
aGUgd2lkdGggaXMgc2hyaW5rLXRvLWZpdC4gVGhlbiBzb2x2ZSBmb3IgJ2xlZnQnCisgICAgLy8g
Mi4gJ2xlZnQnIGFuZCAncmlnaHQnIGFyZSAnYXV0bycgYW5kICd3aWR0aCcgaXMgbm90ICdhdXRv
JywgdGhlbiBpZiB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGVsZW1lbnQgZXN0YWJs
aXNoaW5nIHRoZSBzdGF0aWMtcG9zaXRpb24gCisgICAgLy8gICAgY29udGFpbmluZyBibG9jayBp
cyAnbHRyJyBzZXQgJ2xlZnQnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb24sIG90aGVyd2lzZSBzZXQg
J3JpZ2h0JyB0byB0aGUgc3RhdGljIHBvc2l0aW9uLgorICAgIC8vICAgIFRoZW4gc29sdmUgZm9y
ICdsZWZ0JyAoaWYgJ2RpcmVjdGlvbiBpcyAncnRsJykgb3IgJ3JpZ2h0JyAoaWYgJ2RpcmVjdGlv
bicgaXMgJ2x0cicpLgorICAgIC8vIDMuICd3aWR0aCcgYW5kICdyaWdodCcgYXJlICdhdXRvJyBh
bmQgJ2xlZnQnIGlzIG5vdCAnYXV0bycsIHRoZW4gdGhlIHdpZHRoIGlzIHNocmluay10by1maXQg
LiBUaGVuIHNvbHZlIGZvciAncmlnaHQnCisgICAgLy8gNC4gJ2xlZnQnIGlzICdhdXRvJywgJ3dp
ZHRoJyBhbmQgJ3JpZ2h0JyBhcmUgbm90ICdhdXRvJywgdGhlbiBzb2x2ZSBmb3IgJ2xlZnQnCisg
ICAgLy8gNS4gJ3dpZHRoJyBpcyAnYXV0bycsICdsZWZ0JyBhbmQgJ3JpZ2h0JyBhcmUgbm90ICdh
dXRvJywgdGhlbiBzb2x2ZSBmb3IgJ3dpZHRoJworICAgIC8vIDYuICdyaWdodCcgaXMgJ2F1dG8n
LCAnbGVmdCcgYW5kICd3aWR0aCcgYXJlIG5vdCAnYXV0bycsIHRoZW4gc29sdmUgZm9yICdyaWdo
dCcKKworICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9ybWF0dGluZ0NvbnRl
eHQoKTsKKyAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOworICAgIGF1dG8mIGJv
eEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsK
KyAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxv
Z2ljYWxXaWR0aDsKKyAgICBhdXRvIGlzTGVmdFRvUmlnaHREaXJlY3Rpb24gPSBsYXlvdXRCb3gu
Y29udGFpbmluZ0Jsb2NrKCkuc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCk7CisgICAg
CisgICAgYXV0byBsZWZ0ID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2FsTGVmdCgpLCBjb250
YWluaW5nQmxvY2tXaWR0aCk7CisgICAgYXV0byByaWdodCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUu
bG9naWNhbFJpZ2h0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKyAgICBhdXRvIHdpZHRoID0g
b3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGggPyBvdmVycmlkZGVuSG9yaXpvbnRhbFZh
bHVlcy53aWR0aCA6IGNvbXB1dGVkV2lkdGgobGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tXaWR0
aCk7CisgICAgYXV0byBjb21wdXRlZEhvcml6b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAg
ICBVc2VkSG9yaXpvbnRhbE1hcmdpbiB1c2VkSG9yaXpvbnRhbE1hcmdpbjsKKyAgICBhdXRvIHBh
ZGRpbmdMZWZ0ID0gYm94R2VvbWV0cnkucGFkZGluZ0xlZnQoKS52YWx1ZU9yKDApOworICAgIGF1
dG8gcGFkZGluZ1JpZ2h0ID0gYm94R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVPcigwKTsK
KyAgICBhdXRvIGJvcmRlckxlZnQgPSBib3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCk7CisgICAgYXV0
byBib3JkZXJSaWdodCA9IGJveEdlb21ldHJ5LmJvcmRlclJpZ2h0KCk7CisgICAgaWYgKCFsZWZ0
ICYmICF3aWR0aCAmJiAhcmlnaHQpIHsKKyAgICAgICAgLy8gSWYgYWxsIHRocmVlIG9mICdsZWZ0
JywgJ3dpZHRoJywgYW5kICdyaWdodCcgYXJlICdhdXRvJzogRmlyc3Qgc2V0IGFueSAnYXV0bycg
dmFsdWVzIGZvciAnbWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyB0byAwLgorICAgICAg
ICAvLyBUaGVuLCBpZiB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGVsZW1lbnQgZXN0
YWJsaXNoaW5nIHRoZSBzdGF0aWMtcG9zaXRpb24gY29udGFpbmluZyBibG9jayBpcyAnbHRyJyBz
ZXQgJ2xlZnQnIHRvIHRoZSBzdGF0aWMKKyAgICAgICAgLy8gcG9zaXRpb24gYW5kIGFwcGx5IHJ1
bGUgbnVtYmVyIHRocmVlIGJlbG93OyBvdGhlcndpc2UsIHNldCAncmlnaHQnIHRvIHRoZSBzdGF0
aWMgcG9zaXRpb24gYW5kIGFwcGx5IHJ1bGUgbnVtYmVyIG9uZSBiZWxvdy4KKyAgICAgICAgdXNl
ZEhvcml6b250YWxNYXJnaW4gPSB7IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1
ZU9yKDApLCBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMCkgfTsKKworICAg
ICAgICBhdXRvIHN0YXRpY0hvcml6b250YWxQb3NpdGlvbiA9IHN0YXRpY0hvcml6b250YWxQb3Np
dGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMpOworICAgICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikKKyAgICAgICAgICAgIGxl
ZnQgPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IHJpZ2h0ID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uOworICAgIH0gZWxzZSBpZiAobGVmdCAm
JiB3aWR0aCAmJiByaWdodCkgeworICAgICAgICAvLyBJZiBub25lIG9mIHRoZSB0aHJlZSBpcyAn
YXV0byc6IElmIGJvdGggJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgYXJlICdhdXRv
Jywgc29sdmUgdGhlIGVxdWF0aW9uIHVuZGVyIHRoZSBleHRyYSBjb25zdHJhaW50IHRoYXQgdGhl
IHR3byBtYXJnaW5zIGdldCBlcXVhbCB2YWx1ZXMsCisgICAgICAgIC8vIHVubGVzcyB0aGlzIHdv
dWxkIG1ha2UgdGhlbSBuZWdhdGl2ZSwgaW4gd2hpY2ggY2FzZSB3aGVuIGRpcmVjdGlvbiBvZiB0
aGUgY29udGFpbmluZyBibG9jayBpcyAnbHRyJyAoJ3J0bCcpLCBzZXQgJ21hcmdpbi1sZWZ0JyAo
J21hcmdpbi1yaWdodCcpIHRvIHplcm8gYW5kCisgICAgICAgIC8vIHNvbHZlIGZvciAnbWFyZ2lu
LXJpZ2h0JyAoJ21hcmdpbi1sZWZ0JykuIElmIG9uZSBvZiAnbWFyZ2luLWxlZnQnIG9yICdtYXJn
aW4tcmlnaHQnIGlzICdhdXRvJywgc29sdmUgdGhlIGVxdWF0aW9uIGZvciB0aGF0IHZhbHVlLgor
ICAgICAgICAvLyBJZiB0aGUgdmFsdWVzIGFyZSBvdmVyLWNvbnN0cmFpbmVkLCBpZ25vcmUgdGhl
IHZhbHVlIGZvciAnbGVmdCcgKGluIGNhc2UgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRo
ZSBjb250YWluaW5nIGJsb2NrIGlzICdydGwnKSBvciAncmlnaHQnCisgICAgICAgIC8vIChpbiBj
YXNlICdkaXJlY3Rpb24nIGlzICdsdHInKSBhbmQgc29sdmUgZm9yIHRoYXQgdmFsdWUuCisgICAg
ICAgIGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmICFjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uZW5kKSB7CisgICAgICAgICAgICBhdXRvIG1hcmdpblN0YXJ0QW5kRW5kID0g
Y29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQg
KyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICpyaWdodCk7CisgICAgICAg
ICAgICBpZiAobWFyZ2luU3RhcnRBbmRFbmQgPj0gMCkKKyAgICAgICAgICAgICAgICB1c2VkSG9y
aXpvbnRhbE1hcmdpbiA9IHsgbWFyZ2luU3RhcnRBbmRFbmQgLyAyLCBtYXJnaW5TdGFydEFuZEVu
ZCAvIDIgfTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFy
Z2luLnN0YXJ0ID0gMF9sdTsKKyAgICAgICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJn
aW4uZW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1h
cmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdS
aWdodCArIGJvcmRlclJpZ2h0ICsgKnJpZ2h0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgPSAwX2x1OworICAg
ICAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNvbnRhaW5pbmdC
bG9ja1dpZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsg
cGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAq
cmlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNl
IGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0KSB7CisgICAgICAgICAgICB1c2Vk
SG9yaXpvbnRhbE1hcmdpbi5lbmQgPSAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZDsKKyAg
ICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gY29udGFpbmluZ0Jsb2NrV2lk
dGggLSAoKmxlZnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5n
UmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7
CisgICAgICAgIH0gZWxzZSBpZiAoIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKKyAg
ICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gKmNvbXB1dGVkSG9yaXpvbnRh
bE1hcmdpbi5zdGFydDsKKyAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9IGNv
bnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQg
KyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3Jk
ZXJSaWdodCArICpyaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1c2VkSG9y
aXpvbnRhbE1hcmdpbiA9IHsgKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCwgKmNvbXB1
dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQgfTsKKyAgICAgICAgICAgIC8vIE92ZXJjb25zdHJhaW5l
ZD8gSWdub3JlIHJpZ2h0IChsZWZ0KS4KKyAgICAgICAgICAgIGlmIChpc0xlZnRUb1JpZ2h0RGly
ZWN0aW9uKQorICAgICAgICAgICAgICAgIHJpZ2h0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAo
dXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyAqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5n
TGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250
YWxNYXJnaW4uZW5kKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsZWZ0ID0g
Y29udGFpbmluZ0Jsb2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3Jk
ZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdo
dCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7CisgICAgICAgIH0KKyAgICB9
IGVsc2UgeworICAgICAgICAvLyBPdGhlcndpc2UsIHNldCAnYXV0bycgdmFsdWVzIGZvciAnbWFy
Z2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyB0byAwLCBhbmQgcGljayB0aGUgb25lIG9mIHRo
ZSBmb2xsb3dpbmcgc2l4IHJ1bGVzIHRoYXQgYXBwbGllcy4KKyAgICAgICAgdXNlZEhvcml6b250
YWxNYXJnaW4gPSB7IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDApLCBj
b21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMCkgfTsKKyAgICB9CisKKyAgICBp
ZiAoIWxlZnQgJiYgIXdpZHRoICYmIHJpZ2h0KSB7CisgICAgICAgIC8vICMxCisgICAgICAgIC8v
IENhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIHdpZHRoIGJ5IHNvbHZpbmcgZm9yICd3aWR0aCcgYWZ0
ZXIgc2V0dGluZyAnbGVmdCcgKGluIGNhc2UgMSkgdG8gMAorICAgICAgICBsZWZ0ID0gTGF5b3V0
VW5pdCB7IDAgfTsKKyAgICAgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGNvbnRhaW5pbmdCbG9j
a1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0
ICsgcGFkZGluZ0xlZnQgKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9u
dGFsTWFyZ2luLmVuZCArICpyaWdodCk7CisgICAgICAgIHdpZHRoID0gc2hyaW5rVG9GaXRXaWR0
aChsYXlvdXRCb3gsIGF2YWlsYWJsZVdpZHRoKTsKKyAgICAgICAgbGVmdCA9IGNvbnRhaW5pbmdC
bG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBh
ZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICArIGJvcmRlclJpZ2h0ICsgdXNlZEhv
cml6b250YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKKyAgICB9IGVsc2UgaWYgKCFsZWZ0ICYmICFy
aWdodCAmJiB3aWR0aCkgeworICAgICAgICAvLyAjMgorICAgICAgICBhdXRvIHN0YXRpY0hvcml6
b250YWxQb3NpdGlvbiA9IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0
aW9uZWQobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAgICBpZiAoaXNM
ZWZ0VG9SaWdodERpcmVjdGlvbikgeworICAgICAgICAgICAgbGVmdCA9IHN0YXRpY0hvcml6b250
YWxQb3NpdGlvbjsKKyAgICAgICAgICAgIHJpZ2h0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAo
KmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5n
TGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250
YWxNYXJnaW4uZW5kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJpZ2h0ID0gc3Rh
dGljSG9yaXpvbnRhbFBvc2l0aW9uOworICAgICAgICAgICAgbGVmdCA9IGNvbnRhaW5pbmdCbG9j
a1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRp
bmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpv
bnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghd2lk
dGggJiYgIXJpZ2h0ICYmIGxlZnQpIHsKKyAgICAgICAgLy8gIzMKKyAgICAgICAgLy8gQ2FsY3Vs
YXRlIHRoZSBhdmFpbGFibGUgd2lkdGggYnkgc29sdmluZyBmb3IgJ3dpZHRoJyBhZnRlciBzZXR0
aW5nICdyaWdodCcgKGluIGNhc2UgMykgdG8gMAorICAgICAgICByaWdodCA9IExheW91dFVuaXQg
eyAwIH07CisgICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBjb250YWluaW5nQmxvY2tXaWR0
aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBh
ZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1h
cmdpbi5lbmQgKyAqcmlnaHQpOworICAgICAgICB3aWR0aCA9IHNocmlua1RvRml0V2lkdGgobGF5
b3V0Qm94LCBhdmFpbGFibGVXaWR0aCk7CisgICAgICAgIHJpZ2h0ID0gY29udGFpbmluZ0Jsb2Nr
V2lkdGggLSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNl
ZEhvcml6b250YWxNYXJnaW4uZW5kKTsKKyAgICB9IGVsc2UgaWYgKCFsZWZ0ICYmIHdpZHRoICYm
IHJpZ2h0KSB7CisgICAgICAgIC8vICM0CisgICAgICAgIGxlZnQgPSBjb250YWluaW5nQmxvY2tX
aWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5n
TGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250
YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKKyAgICB9IGVsc2UgaWYgKCF3aWR0aCAmJiBsZWZ0ICYm
IHJpZ2h0KSB7CisgICAgICAgIC8vICM1CisgICAgICAgIHdpZHRoID0gY29udGFpbmluZ0Jsb2Nr
V2lkdGggLSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250
YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKKyAgICB9IGVsc2UgaWYgKCFyaWdodCAmJiBsZWZ0ICYm
IHdpZHRoKSB7CisgICAgICAgIC8vICM2CisgICAgICAgIHJpZ2h0ID0gY29udGFpbmluZ0Jsb2Nr
V2lkdGggLSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNl
ZEhvcml6b250YWxNYXJnaW4uZW5kKTsKKyAgICB9CisKKyAgICBBU1NFUlQobGVmdCk7CisgICAg
QVNTRVJUKHJpZ2h0KTsKKyAgICBBU1NFUlQod2lkdGgpOworCisgICAgLy8gRm9yIG91dC1vZi1m
bG93IGVsZW1lbnRzIHRoZSBjb250YWluaW5nIGJsb2NrIGlzIGZvcm1lZCBieSB0aGUgcGFkZGlu
ZyBlZGdlIG9mIHRoZSBhbmNlc3Rvci4KKyAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwb3NpdGlv
bmVkIHZhbHVlIGlzIGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgcGFkZGluZyBib3gu
IExldCdzIGNvbnZlcnQgaXQgdG8gYm9yZGVyIGJveCBjb29yZGluYXRlIHN5c3RlbS4KKyAgICBh
dXRvIGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2UgPSBob3Jpem9udGFsQ29uc3Ry
YWludHMubG9naWNhbExlZnQ7CisgICAgKmxlZnQgKz0gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1Zl
cnRpY2FsRWRnZTsKKyAgICAqcmlnaHQgKz0gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2Fs
RWRnZTsKKworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3Ry
ZWFtIDw8ICJbUG9zaXRpb25dW1dpZHRoXVtNYXJnaW5dIC0+IG91dC1vZi1mbG93IG5vbi1yZXBs
YWNlZCAtPiBsZWZ0KCIgPDwgKmxlZnQgPDwgInB4KSByaWdodCgiICA8PCAqcmlnaHQgPDwgInB4
KSB3aWR0aCgiIDw8ICp3aWR0aCA8PCAicHgpIG1hcmdpbigiIDw8IHVzZWRIb3Jpem9udGFsTWFy
Z2luLnN0YXJ0IDw8ICJweCwgIiAgPDwgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kIDw8ICJweCkg
bGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIpOworICAgIHJldHVybiB7ICpsZWZ0LCAq
cmlnaHQsIHsgKndpZHRoLCB1c2VkSG9yaXpvbnRhbE1hcmdpbiB9IH07Cit9CisKK1ZlcnRpY2Fs
R2VvbWV0cnkgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dSZXBsYWNlZFZl
cnRpY2FsR2VvbWV0cnkoY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jp
em9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVydGljYWxD
b25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2Fs
VmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Cit7CisgICAgQVNTRVJUKHJl
cGxhY2VkQm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKKyAgICBBU1NFUlQodmVydGljYWxD
b25zdHJhaW50cy5sb2dpY2FsSGVpZ2h0KTsKKworICAgIC8vIDEwLjYuNSBBYnNvbHV0ZWx5IHBv
c2l0aW9uZWQsIHJlcGxhY2VkIGVsZW1lbnRzCisgICAgLy8KKyAgICAvLyBUaGUgdXNlZCB2YWx1
ZSBvZiAnaGVpZ2h0JyBpcyBkZXRlcm1pbmVkIGFzIGZvciBpbmxpbmUgcmVwbGFjZWQgZWxlbWVu
dHMuCisgICAgLy8gSWYgJ21hcmdpbi10b3AnIG9yICdtYXJnaW4tYm90dG9tJyBpcyBzcGVjaWZp
ZWQgYXMgJ2F1dG8nIGl0cyB1c2VkIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIHJ1bGVzIGJl
bG93LgorICAgIC8vIDEuIElmIGJvdGggJ3RvcCcgYW5kICdib3R0b20nIGhhdmUgdGhlIHZhbHVl
ICdhdXRvJywgcmVwbGFjZSAndG9wJyB3aXRoIHRoZSBlbGVtZW50J3Mgc3RhdGljIHBvc2l0aW9u
LgorICAgIC8vIDIuIElmICdib3R0b20nIGlzICdhdXRvJywgcmVwbGFjZSBhbnkgJ2F1dG8nIG9u
ICdtYXJnaW4tdG9wJyBvciAnbWFyZ2luLWJvdHRvbScgd2l0aCAnMCcuCisgICAgLy8gMy4gSWYg
YXQgdGhpcyBwb2ludCBib3RoICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIGFyZSBz
dGlsbCAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0aGUgZXh0cmEgY29uc3RyYWlu
dCB0aGF0IHRoZSB0d28gbWFyZ2lucyBtdXN0IGdldCBlcXVhbCB2YWx1ZXMuCisgICAgLy8gNC4g
SWYgYXQgdGhpcyBwb2ludCB0aGVyZSBpcyBvbmx5IG9uZSAnYXV0bycgbGVmdCwgc29sdmUgdGhl
IGVxdWF0aW9uIGZvciB0aGF0IHZhbHVlLgorICAgIC8vIDUuIElmIGF0IHRoaXMgcG9pbnQgdGhl
IHZhbHVlcyBhcmUgb3Zlci1jb25zdHJhaW5lZCwgaWdub3JlIHRoZSB2YWx1ZSBmb3IgJ2JvdHRv
bScgYW5kIHNvbHZlIGZvciB0aGF0IHZhbHVlLgorCisgICAgYXV0byYgZm9ybWF0dGluZ0NvbnRl
eHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgpOworICAgIGF1dG8mIHN0eWxlID0gcmVwbGFj
ZWRCb3guc3R5bGUoKTsKKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0
Lmdlb21ldHJ5Rm9yQm94KHJlcGxhY2VkQm94KTsKKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja0hl
aWdodCA9ICp2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxIZWlnaHQ7CisgICAgYXV0byBjb250
YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7CisK
KyAgICBhdXRvIHRvcCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbFRvcCgpLCBjb250YWlu
aW5nQmxvY2tXaWR0aCk7CisgICAgYXV0byBib3R0b20gPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxv
Z2ljYWxCb3R0b20oKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworICAgIGF1dG8gaGVpZ2h0ID0g
aW5saW5lUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9u
dGFsQ29uc3RyYWludHMsIHZlcnRpY2FsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZh
bHVlcykuY29udGVudEhlaWdodDsKKyAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBH
ZW9tZXRyeTo6Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzKTsKKyAgICBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkTWFyZ2luQmVmb3JlID0g
Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmU7CisgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4g
dXNlZE1hcmdpbkFmdGVyID0gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlcjsKKyAgICBhdXRv
IHBhZGRpbmdUb3AgPSBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKTsKKyAgICBh
dXRvIHBhZGRpbmdCb3R0b20gPSBib3hHZW9tZXRyeS5wYWRkaW5nQm90dG9tKCkudmFsdWVPcigw
KTsKKyAgICBhdXRvIGJvcmRlclRvcCA9IGJveEdlb21ldHJ5LmJvcmRlclRvcCgpOworICAgIGF1
dG8gYm9yZGVyQm90dG9tID0gYm94R2VvbWV0cnkuYm9yZGVyQm90dG9tKCk7CisKKyAgICBpZiAo
IXRvcCAmJiAhYm90dG9tKSB7CisgICAgICAgIC8vICMxCisgICAgICAgIHRvcCA9IHN0YXRpY1Zl
cnRpY2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKHJlcGxhY2VkQm94LCB2ZXJ0aWNh
bENvbnN0cmFpbnRzKTsKKyAgICB9CisKKyAgICBpZiAoIWJvdHRvbSkgeworICAgICAgICAvLyAj
MgorICAgICAgICB1c2VkTWFyZ2luQmVmb3JlID0gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZv
cmUudmFsdWVPcigwKTsKKyAgICAgICAgdXNlZE1hcmdpbkFmdGVyID0gdXNlZE1hcmdpbkJlZm9y
ZTsKKyAgICB9CisKKyAgICBpZiAoIXVzZWRNYXJnaW5CZWZvcmUgJiYgIXVzZWRNYXJnaW5BZnRl
cikgeworICAgICAgICAvLyAjMworICAgICAgICBhdXRvIG1hcmdpbkJlZm9yZUFuZEFmdGVyID0g
Y29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsg
aGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArICpib3R0b20pOworICAgICAg
ICB1c2VkTWFyZ2luQmVmb3JlID0gbWFyZ2luQmVmb3JlQW5kQWZ0ZXIgLyAyOworICAgICAgICB1
c2VkTWFyZ2luQWZ0ZXIgPSB1c2VkTWFyZ2luQmVmb3JlOworICAgIH0KKworICAgIC8vICM0Cisg
ICAgaWYgKCF0b3ApCisgICAgICAgIHRvcCA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdXNl
ZE1hcmdpbkJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBoZWlnaHQgKyBwYWRkaW5n
Qm90dG9tICsgYm9yZGVyQm90dG9tICsgKnVzZWRNYXJnaW5BZnRlciArICpib3R0b20pOworCisg
ICAgaWYgKCFib3R0b20pCisgICAgICAgIGJvdHRvbSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAt
ICgqdG9wICsgKnVzZWRNYXJnaW5CZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgaGVp
Z2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArICp1c2VkTWFyZ2luQWZ0ZXIpOwor
CisgICAgaWYgKCF1c2VkTWFyZ2luQmVmb3JlKQorICAgICAgICB1c2VkTWFyZ2luQmVmb3JlID0g
Y29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsg
aGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArICp1c2VkTWFyZ2luQWZ0ZXIg
KyAqYm90dG9tKTsKKworICAgIGlmICghdXNlZE1hcmdpbkFmdGVyKQorICAgICAgICB1c2VkTWFy
Z2luQWZ0ZXIgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArICp1c2VkTWFyZ2luQmVm
b3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBi
b3JkZXJCb3R0b20gKyAqYm90dG9tKTsKKworICAgIC8vICM1CisgICAgYXV0byBib3hIZWlnaHQg
PSAqdG9wICsgKnVzZWRNYXJnaW5CZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgaGVp
Z2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArICp1c2VkTWFyZ2luQWZ0ZXIgKyAq
Ym90dG9tOworICAgIGlmIChib3hIZWlnaHQgPiBjb250YWluaW5nQmxvY2tIZWlnaHQpCisgICAg
ICAgIGJvdHRvbSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgKnVzZWRNYXJnaW5C
ZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSAr
IGJvcmRlckJvdHRvbSArICp1c2VkTWFyZ2luQWZ0ZXIpOyAKKworICAgIC8vIEZvciBvdXQtb2Yt
ZmxvdyBlbGVtZW50cyB0aGUgY29udGFpbmluZyBibG9jayBpcyBmb3JtZWQgYnkgdGhlIHBhZGRp
bmcgZWRnZSBvZiB0aGUgYW5jZXN0b3IuCisgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcG9zaXRp
b25lZCB2YWx1ZSBpcyBpbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIHBhZGRpbmcgYm94
LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBib3ggY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAg
YXV0byBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlID0gdmVydGljYWxDb25zdHJh
aW50cy5sb2dpY2FsVG9wOworICAgICp0b3AgKz0gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRp
Y2FsRWRnZTsKKyAgICAqYm90dG9tICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVk
Z2U7CisKKyAgICBBU1NFUlQodG9wKTsKKyAgICBBU1NFUlQoYm90dG9tKTsKKyAgICBBU1NFUlQo
dXNlZE1hcmdpbkJlZm9yZSk7CisgICAgQVNTRVJUKHVzZWRNYXJnaW5BZnRlcik7CisgICAgTE9H
X1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltQb3NpdGlv
bl1bSGVpZ2h0XVtNYXJnaW5dIC0+IG91dC1vZi1mbG93IHJlcGxhY2VkIC0+IHRvcCgiIDw8ICp0
b3AgPDwgInB4KSBib3R0b20oIiAgPDwgKmJvdHRvbSA8PCAicHgpIGhlaWdodCgiIDw8IGhlaWdo
dCA8PCAicHgpIG1hcmdpbigiIDw8ICp1c2VkTWFyZ2luQmVmb3JlIDw8ICJweCwgIiAgPDwgKnVz
ZWRNYXJnaW5BZnRlciA8PCAicHgpIGxheW91dEJveCgiIDw8ICZyZXBsYWNlZEJveCA8PCAiKSIp
OworICAgIHJldHVybiB7ICp0b3AsICpib3R0b20sIHsgaGVpZ2h0LCB7ICp1c2VkTWFyZ2luQmVm
b3JlLCAqdXNlZE1hcmdpbkFmdGVyIH0gfSB9OworfQorCitIb3Jpem9udGFsR2VvbWV0cnkgRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dSZXBsYWNlZEhvcml6b250YWxHZW9t
ZXRyeShjb25zdCBSZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRz
JiB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYg
b3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKHJlcGxhY2VkQm94Lmlz
T3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKKworICAgIC8vIDEwLjMuOCBBYnNvbHV0ZWx5IHBvc2l0
aW9uZWQsIHJlcGxhY2VkIGVsZW1lbnRzCisgICAgLy8gSW4gdGhpcyBjYXNlLCBzZWN0aW9uIDEw
LjMuNyBhcHBsaWVzIHVwIHRocm91Z2ggYW5kIGluY2x1ZGluZyB0aGUgY29uc3RyYWludCBlcXVh
dGlvbiwgYnV0IHRoZSByZXN0IG9mIHNlY3Rpb24gMTAuMy43IGlzIHJlcGxhY2VkIGJ5IHRoZSBm
b2xsb3dpbmcgcnVsZXM6CisgICAgLy8KKyAgICAvLyBUaGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgn
IGlzIGRldGVybWluZWQgYXMgZm9yIGlubGluZSByZXBsYWNlZCBlbGVtZW50cy4gSWYgJ21hcmdp
bi1sZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBpcyBzcGVjaWZpZWQgYXMgJ2F1dG8nIGl0cyB1c2Vk
IHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIHJ1bGVzIGJlbG93LgorICAgIC8vIDEuIElmIGJv
dGggJ2xlZnQnIGFuZCAncmlnaHQnIGhhdmUgdGhlIHZhbHVlICdhdXRvJywgdGhlbiBpZiB0aGUg
J2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGVsZW1lbnQgZXN0YWJsaXNoaW5nIHRoZSBzdGF0
aWMtcG9zaXRpb24gY29udGFpbmluZyBibG9jayBpcyAnbHRyJywKKyAgICAvLyAgIHNldCAnbGVm
dCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbjsgZWxzZSBpZiAnZGlyZWN0aW9uJyBpcyAncnRsJywg
c2V0ICdyaWdodCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbi4KKyAgICAvLyAyLiBJZiAnbGVmdCcg
b3IgJ3JpZ2h0JyBhcmUgJ2F1dG8nLCByZXBsYWNlIGFueSAnYXV0bycgb24gJ21hcmdpbi1sZWZ0
JyBvciAnbWFyZ2luLXJpZ2h0JyB3aXRoICcwJy4KKyAgICAvLyAzLiBJZiBhdCB0aGlzIHBvaW50
IGJvdGggJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgYXJlIHN0aWxsICdhdXRvJywg
c29sdmUgdGhlIGVxdWF0aW9uIHVuZGVyIHRoZSBleHRyYSBjb25zdHJhaW50IHRoYXQgdGhlIHR3
byBtYXJnaW5zIG11c3QgZ2V0IGVxdWFsIHZhbHVlcywKKyAgICAvLyAgIHVubGVzcyB0aGlzIHdv
dWxkIG1ha2UgdGhlbSBuZWdhdGl2ZSwgaW4gd2hpY2ggY2FzZSB3aGVuIHRoZSBkaXJlY3Rpb24g
b2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicgKCdydGwnKSwgc2V0ICdtYXJnaW4tbGVm
dCcgKCdtYXJnaW4tcmlnaHQnKSB0byB6ZXJvIGFuZAorICAgIC8vICAgc29sdmUgZm9yICdtYXJn
aW4tcmlnaHQnICgnbWFyZ2luLWxlZnQnKS4KKyAgICAvLyA0LiBJZiBhdCB0aGlzIHBvaW50IHRo
ZXJlIGlzIGFuICdhdXRvJyBsZWZ0LCBzb2x2ZSB0aGUgZXF1YXRpb24gZm9yIHRoYXQgdmFsdWUu
CisgICAgLy8gNS4gSWYgYXQgdGhpcyBwb2ludCB0aGUgdmFsdWVzIGFyZSBvdmVyLWNvbnN0cmFp
bmVkLCBpZ25vcmUgdGhlIHZhbHVlIGZvciBlaXRoZXIgJ2xlZnQnIChpbiBjYXNlIHRoZSAnZGly
ZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAncnRsJykgb3IKKyAg
ICAvLyAgICdyaWdodCcgKGluIGNhc2UgJ2RpcmVjdGlvbicgaXMgJ2x0cicpIGFuZCBzb2x2ZSBm
b3IgdGhhdCB2YWx1ZS4KKworICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9y
bWF0dGluZ0NvbnRleHQoKTsKKyAgICBhdXRvJiBzdHlsZSA9IHJlcGxhY2VkQm94LnN0eWxlKCk7
CisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJv
eChyZXBsYWNlZEJveCk7CisgICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250
YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7CisgICAgYXV0byBpc0xlZnRUb1JpZ2h0RGlyZWN0
aW9uID0gcmVwbGFjZWRCb3guY29udGFpbmluZ0Jsb2NrKCkuc3R5bGUoKS5pc0xlZnRUb1JpZ2h0
RGlyZWN0aW9uKCk7CisKKyAgICBhdXRvIGxlZnQgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2lj
YWxMZWZ0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKyAgICBhdXRvIHJpZ2h0ID0gY29tcHV0
ZWRWYWx1ZShzdHlsZS5sb2dpY2FsUmlnaHQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworICAg
IGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVkSG9yaXpv
bnRhbE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICBPcHRp
b25hbDxMYXlvdXRVbml0PiB1c2VkTWFyZ2luU3RhcnQgPSBjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uc3RhcnQ7CisgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZE1hcmdpbkVuZCA9IGNvbXB1
dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQ7CisgICAgYXV0byB3aWR0aCA9IGlubGluZVJlcGxhY2Vk
Q29udGVudFdpZHRoQW5kTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMs
IHZlcnRpY2FsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKS5jb250ZW50
V2lkdGg7CisgICAgYXV0byBwYWRkaW5nTGVmdCA9IGJveEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCku
dmFsdWVPcigwKTsKKyAgICBhdXRvIHBhZGRpbmdSaWdodCA9IGJveEdlb21ldHJ5LnBhZGRpbmdS
aWdodCgpLnZhbHVlT3IoMCk7CisgICAgYXV0byBib3JkZXJMZWZ0ID0gYm94R2VvbWV0cnkuYm9y
ZGVyTGVmdCgpOworICAgIGF1dG8gYm9yZGVyUmlnaHQgPSBib3hHZW9tZXRyeS5ib3JkZXJSaWdo
dCgpOworCisgICAgaWYgKCFsZWZ0ICYmICFyaWdodCkgeworICAgICAgICAvLyAjMQorICAgICAg
ICBhdXRvIHN0YXRpY0hvcml6b250YWxQb3NpdGlvbiA9IHN0YXRpY0hvcml6b250YWxQb3NpdGlv
bkZvck91dE9mRmxvd1Bvc2l0aW9uZWQocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50
cyk7CisgICAgICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKQorICAgICAgICAgICAgbGVm
dCA9IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
cmlnaHQgPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb247CisgICAgfQorCisgICAgaWYgKCFsZWZ0
IHx8ICFyaWdodCkgeworICAgICAgICAvLyAjMgorICAgICAgICB1c2VkTWFyZ2luU3RhcnQgPSBj
b21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKTsKKyAgICAgICAgdXNlZE1h
cmdpbkVuZCA9IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKTsKKyAgICB9
CisKKyAgICBpZiAoIXVzZWRNYXJnaW5TdGFydCAmJiAhdXNlZE1hcmdpbkVuZCkgeworICAgICAg
ICAvLyAjMworICAgICAgICBhdXRvIG1hcmdpblN0YXJ0QW5kRW5kID0gY29udGFpbmluZ0Jsb2Nr
V2lkdGggLSAoKmxlZnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRp
bmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnJpZ2h0KTsKKyAgICAgICAgaWYgKG1hcmdpblN0YXJ0
QW5kRW5kID49IDApIHsKKyAgICAgICAgICAgIHVzZWRNYXJnaW5TdGFydCA9IG1hcmdpblN0YXJ0
QW5kRW5kIC8gMjsKKyAgICAgICAgICAgIHVzZWRNYXJnaW5FbmQgPSB1c2VkTWFyZ2luU3RhcnQ7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlv
bikgeworICAgICAgICAgICAgICAgIHVzZWRNYXJnaW5TdGFydCA9IDBfbHU7CisgICAgICAgICAg
ICAgICAgdXNlZE1hcmdpbkVuZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgKnVz
ZWRNYXJnaW5TdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFkZGlu
Z1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqcmlnaHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICB1c2VkTWFyZ2luRW5kID0gMF9sdTsKKyAgICAgICAgICAgICAgICB1c2Vk
TWFyZ2luU3RhcnQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNl
ZE1hcmdpbkVuZCArICpyaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisK
KyAgICAvLyAjNAorICAgIGlmICghbGVmdCkKKyAgICAgICAgbGVmdCA9IGNvbnRhaW5pbmdCbG9j
a1dpZHRoIC0gKCp1c2VkTWFyZ2luU3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3
aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnVzZWRNYXJnaW5FbmQgKyAqcmln
aHQpOworCisgICAgaWYgKCFyaWdodCkKKyAgICAgICAgcmlnaHQgPSBjb250YWluaW5nQmxvY2tX
aWR0aCAtICgqbGVmdCArICp1c2VkTWFyZ2luU3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xl
ZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnVzZWRNYXJnaW5FbmQp
OworCisgICAgaWYgKCF1c2VkTWFyZ2luU3RhcnQpCisgICAgICAgIHVzZWRNYXJnaW5TdGFydCA9
IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0
ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFyZ2luRW5kICsg
KnJpZ2h0KTsKKworICAgIGlmICghdXNlZE1hcmdpbkVuZCkKKyAgICAgICAgdXNlZE1hcmdpbkVu
ZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgKnVzZWRNYXJnaW5TdGFydCArIGJv
cmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmln
aHQgKyAqcmlnaHQpOworCisgICAgYXV0byBib3hXaWR0aCA9ICgqbGVmdCArICp1c2VkTWFyZ2lu
U3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCAr
IGJvcmRlclJpZ2h0ICsgKnVzZWRNYXJnaW5FbmQgKyAqcmlnaHQpOworICAgIGlmIChib3hXaWR0
aCA+IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSB7CisgICAgICAgIC8vICM1IE92ZXItY29uc3RyYWlu
ZWQ/CisgICAgICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKQorICAgICAgICAgICAgcmln
aHQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArICp1c2VkTWFyZ2luU3RhcnQgKyBi
b3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJp
Z2h0ICsgKnVzZWRNYXJnaW5FbmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsZWZ0ID0g
Y29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKnVzZWRNYXJnaW5TdGFydCArIGJvcmRlckxlZnQgKyBw
YWRkaW5nTGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNlZE1h
cmdpbkVuZCArICpyaWdodCk7CisgICAgfQorCisgICAgQVNTRVJUKGxlZnQpOworICAgIEFTU0VS
VChyaWdodCk7CisgICAgQVNTRVJUKHVzZWRNYXJnaW5TdGFydCk7CisgICAgQVNTRVJUKHVzZWRN
YXJnaW5FbmQpOworCisgICAgLy8gRm9yIG91dC1vZi1mbG93IGVsZW1lbnRzIHRoZSBjb250YWlu
aW5nIGJsb2NrIGlzIGZvcm1lZCBieSB0aGUgcGFkZGluZyBlZGdlIG9mIHRoZSBhbmNlc3Rvci4K
KyAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwb3NpdGlvbmVkIHZhbHVlIGlzIGluIHRoZSBjb29y
ZGluYXRlIHN5c3RlbSBvZiB0aGUgcGFkZGluZyBib3guIExldCdzIGNvbnZlcnQgaXQgdG8gYm9y
ZGVyIGJveCBjb29yZGluYXRlIHN5c3RlbS4KKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1BhZGRp
bmdWZXJ0aWNhbEVkZ2UgPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbExlZnQ7CisgICAg
KmxlZnQgKz0gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZTsKKyAgICAqcmlnaHQg
Kz0gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZTsKKworICAgIExPR19XSVRIX1NU
UkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbUG9zaXRpb25dW1dpZHRo
XVtNYXJnaW5dIC0+IG91dC1vZi1mbG93IHJlcGxhY2VkIC0+IGxlZnQoIiA8PCAqbGVmdCA8PCAi
cHgpIHJpZ2h0KCIgIDw8ICpyaWdodCA8PCAicHgpIHdpZHRoKCIgPDwgd2lkdGggPDwgInB4KSBt
YXJnaW4oIiA8PCAqdXNlZE1hcmdpblN0YXJ0IDw8ICJweCwgIiAgPDwgKnVzZWRNYXJnaW5FbmQg
PDwgInB4KSBsYXlvdXRCb3goIiA8PCAmcmVwbGFjZWRCb3ggPDwgIikiKTsKKyAgICByZXR1cm4g
eyAqbGVmdCwgKnJpZ2h0LCB7IHdpZHRoLCB7ICp1c2VkTWFyZ2luU3RhcnQsICp1c2VkTWFyZ2lu
RW5kIH0gfSB9OworfQorCitDb250ZW50SGVpZ2h0QW5kTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeTo6Y29tcGxpY2F0ZWRDYXNlcyhjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3Qg
SG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJy
aWRkZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAorewor
ICAgIEFTU0VSVCghbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSk7CisgICAgLy8gVE9ETzogVXNl
IGNvbXBsaWNhdGVkLWNhc2UgZm9yIGRvY3VtZW50IHJlbmRlcmVyIGZvciBub3cgKHNlZSBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93SGVpZ2h0QW5kTWFyZ2luKS4KKyAg
ICBBU1NFUlQoKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSAmJiBsYXlvdXRCb3guaXNJbkZs
b3coKSAmJiAhbGF5b3V0Qm94LmlzT3ZlcmZsb3dWaXNpYmxlKCkpIHx8IGxheW91dEJveC5pc0lu
bGluZUJsb2NrQm94KCkgfHwgbGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkgfHwgbGF5
b3V0Qm94LmlzRG9jdW1lbnRCb3goKSB8fCBsYXlvdXRCb3guaXNUYWJsZUJveCgpKTsKKworICAg
IC8vIDEwLjYuNiBDb21wbGljYXRlZCBjYXNlcworICAgIC8vCisgICAgLy8gQmxvY2stbGV2ZWws
IG5vbi1yZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdyB3aGVuICdvdmVyZmxvdycgZG9l
cyBub3QgY29tcHV0ZSB0byAndmlzaWJsZScgKGV4Y2VwdCBpZiB0aGUgJ292ZXJmbG93JyBwcm9w
ZXJ0eSdzIHZhbHVlIGhhcyBiZWVuIHByb3BhZ2F0ZWQgdG8gdGhlIHZpZXdwb3J0KS4KKyAgICAv
LyAnSW5saW5lLWJsb2NrJywgbm9uLXJlcGxhY2VkIGVsZW1lbnRzLgorICAgIC8vIEZsb2F0aW5n
LCBub24tcmVwbGFjZWQgZWxlbWVudHMuCisgICAgLy8KKyAgICAvLyAxLiBJZiAnbWFyZ2luLXRv
cCcsIG9yICdtYXJnaW4tYm90dG9tJyBhcmUgJ2F1dG8nLCB0aGVpciB1c2VkIHZhbHVlIGlzIDAu
CisgICAgLy8gMi4gSWYgJ2hlaWdodCcgaXMgJ2F1dG8nLCB0aGUgaGVpZ2h0IGRlcGVuZHMgb24g
dGhlIGVsZW1lbnQncyBkZXNjZW5kYW50cyBwZXIgMTAuNi43LgorCisgICAgYXV0byBoZWlnaHQg
PSBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVpZ2h0ID8gb3ZlcnJpZGRlblZlcnRpY2FsVmFs
dWVzLmhlaWdodC52YWx1ZSgpIDogY29tcHV0ZWRIZWlnaHQobGF5b3V0Qm94KTsKKyAgICBhdXRv
IGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRWZXJ0aWNhbE1hcmdp
bihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgLy8gIzEKKyAgICBhdXRv
IHVzZWRWZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFs
dWVzIHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRW
ZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07IAorICAgIC8vICMyCisgICAgaWYgKCFo
ZWlnaHQpIHsKKyAgICAgICAgQVNTRVJUKGlzSGVpZ2h0QXV0byhsYXlvdXRCb3gpKTsKKyAgICAg
ICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKKyAgICAgICAgICAg
IGhlaWdodCA9IDBfbHU7CisgICAgICAgIGVsc2UgaWYgKGxheW91dEJveC5pc0RvY3VtZW50Qm94
KCkgJiYgIWxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpIHsKKyAgICAg
ICAgICAgIGF1dG8mIGRvY3VtZW50Qm94ID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRC
b3gpOworICAgICAgICAgICAgYXV0byB0b3AgPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChm
b3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KCpkb2N1bWVudEJveC5maXJzdEluRmxv
d0NoaWxkKCkpKS50b3AoKTsKKyAgICAgICAgICAgIGF1dG8gYm90dG9tID0gQm94R2VvbWV0cnk6
Om1hcmdpbkJveFJlY3QoZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveCgqZG9jdW1l
bnRCb3gubGFzdEluRmxvd0NoaWxkKCkpKS5ib3R0b20oKTsKKyAgICAgICAgICAgIC8vIFRoaXMg
aXMgYSBzcGVjaWFsIChxdWlyaz8pIGJlaGF2aW9yIHNpbmNlIHRoZSBkb2N1bWVudCBib3ggaXMg
bm90IGEgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QgYW5kCisgICAgICAgICAgICAvLyBhbGwgdGhl
IGZsb2F0IGJveGVzIGVuZCB1cCBhdCB0aGUgSUNCIGxldmVsLgorICAgICAgICAgICAgYXV0byYg
aW5pdGlhbENvbnRhaW5pbmdCbG9jayA9IGRvY3VtZW50Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9v
dCgpOworICAgICAgICAgICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQg
eyBmb3JtYXR0aW5nQ29udGV4dCgpLCBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkRm9ybWF0dGlu
Z1N0YXRlKGluaXRpYWxDb250YWluaW5nQmxvY2spLmZsb2F0aW5nU3RhdGUoKSB9OworICAgICAg
ICAgICAgaWYgKGF1dG8gZmxvYXRCb3R0b20gPSBmbG9hdGluZ0NvbnRleHQuYm90dG9tKCkpIHsK
KyAgICAgICAgICAgICAgICBib3R0b20gPSBzdGQ6Om1heDxMYXlvdXRVbml0PigqZmxvYXRCb3R0
b20sIGJvdHRvbSk7CisgICAgICAgICAgICAgICAgYXV0byBmbG9hdFRvcCA9IGZsb2F0aW5nQ29u
dGV4dC50b3AoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQoZmxvYXRUb3ApOworICAgICAgICAg
ICAgICAgIHRvcCA9IHN0ZDo6bWluPExheW91dFVuaXQ+KCpmbG9hdFRvcCwgdG9wKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGhlaWdodCA9IGJvdHRvbSAtIHRvcDsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5n
Q29udGV4dCgpKTsKKyAgICAgICAgICAgIGhlaWdodCA9IGNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0
aW5nQ29udGV4dFJvb3QoZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIEFTU0VSVChoZWlnaHQpOworCisgICAgTE9HX1dJVEhfU1RSRUFN
KEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltIZWlnaHRdW01hcmdpbl0gLT4g
ZmxvYXRpbmcgbm9uLXJlcGxhY2VkIC0+IGhlaWdodCgiIDw8ICpoZWlnaHQgPDwgInB4KSBtYXJn
aW4oIiA8PCB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlIDw8ICJweCwgIiA8PCB1c2VkVmVydGlj
YWxNYXJnaW4uYWZ0ZXIgPDwgInB4KSAtPiBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIp
Iik7CisgICAgcmV0dXJuIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4geyAqaGVpZ2h0LCB1c2VkVmVy
dGljYWxNYXJnaW4gfTsKK30KKworQ29udGVudFdpZHRoQW5kTWFyZ2luIEZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeTo6ZmxvYXRpbmdOb25SZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihj
b25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9u
dGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJiBvdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzRmxvYXRpbmdQ
b3NpdGlvbmVkKCkgJiYgIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpOworCisgICAgLy8gMTAu
My41IEZsb2F0aW5nLCBub24tcmVwbGFjZWQgZWxlbWVudHMKKyAgICAvLworICAgIC8vIDEuIElm
ICdtYXJnaW4tbGVmdCcsIG9yICdtYXJnaW4tcmlnaHQnIGFyZSBjb21wdXRlZCBhcyAnYXV0bycs
IHRoZWlyIHVzZWQgdmFsdWUgaXMgJzAnLgorICAgIC8vIDIuIElmICd3aWR0aCcgaXMgY29tcHV0
ZWQgYXMgJ2F1dG8nLCB0aGUgdXNlZCB2YWx1ZSBpcyB0aGUgInNocmluay10by1maXQiIHdpZHRo
LgorCisgICAgYXV0byBjb21wdXRlZEhvcml6b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKwor
ICAgIC8vICMxCisgICAgYXV0byB1c2VkSG9yaXpvbnRhbGxNYXJnaW4gPSBVc2VkSG9yaXpvbnRh
bE1hcmdpbiB7IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDApLCBjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMCkgfTsKKyAgICAvLyAjMgorICAgIGF1
dG8gd2lkdGggPSBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0aCA/IG92ZXJyaWRkZW5I
b3Jpem9udGFsVmFsdWVzLndpZHRoIDogY29tcHV0ZWRXaWR0aChsYXlvdXRCb3gsIGhvcml6b250
YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOworICAgIGlmICghd2lkdGgpCisgICAgICAgIHdp
ZHRoID0gc2hyaW5rVG9GaXRXaWR0aChsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cy5s
b2dpY2FsV2lkdGgpOworCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5
b3V0LCBzdHJlYW0gPDwgIltXaWR0aF1bTWFyZ2luXSAtPiBmbG9hdGluZyBub24tcmVwbGFjZWQg
LT4gd2lkdGgoIiA8PCAqd2lkdGggPDwgInB4KSBtYXJnaW4oIiA8PCB1c2VkSG9yaXpvbnRhbGxN
YXJnaW4uc3RhcnQgPDwgInB4LCAiIDw8IHVzZWRIb3Jpem9udGFsbE1hcmdpbi5lbmQgPDwgInB4
KSAtPiBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7CisgICAgcmV0dXJuIENvbnRl
bnRXaWR0aEFuZE1hcmdpbiB7ICp3aWR0aCwgdXNlZEhvcml6b250YWxsTWFyZ2luIH07Cit9CisK
K0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpmbG9h
dGluZ1JlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYgcmVw
bGFjZWRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZh
bHVlcykgY29uc3QKK3sKKyAgICBBU1NFUlQocmVwbGFjZWRCb3guaXNGbG9hdGluZ1Bvc2l0aW9u
ZWQoKSk7CisKKyAgICAvLyAxMC42LjIgSW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLCBibG9jay1s
ZXZlbCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdywgJ2lubGluZS1ibG9jaycKKyAg
ICAvLyByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdyBhbmQgZmxvYXRpbmcgcmVwbGFj
ZWQgZWxlbWVudHMKKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQs
IHN0cmVhbSA8PCAiW0hlaWdodF1bTWFyZ2luXSAtPiBmbG9hdGluZyByZXBsYWNlZCAtPiByZWRp
cmVjdGVkIHRvIGlubGluZSByZXBsYWNlZCIpOworICAgIHJldHVybiBpbmxpbmVSZXBsYWNlZENv
bnRlbnRIZWlnaHRBbmRNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywg
eyB9LCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworfQorCitDb250ZW50V2lkdGhBbmRNYXJn
aW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpmbG9hdGluZ1JlcGxhY2VkQ29udGVudFdp
ZHRoQW5kTWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5I
b3Jpem9udGFsVmFsdWVzJiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKK3sKKyAgICBBU1NF
UlQocmVwbGFjZWRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7CisKKyAgICAvLyAxMC4zLjYg
RmxvYXRpbmcsIHJlcGxhY2VkIGVsZW1lbnRzCisgICAgLy8KKyAgICAvLyAxLiBJZiAnbWFyZ2lu
LWxlZnQnIG9yICdtYXJnaW4tcmlnaHQnIGFyZSBjb21wdXRlZCBhcyAnYXV0bycsIHRoZWlyIHVz
ZWQgdmFsdWUgaXMgJzAnLgorICAgIC8vIDIuIFRoZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcgaXMg
ZGV0ZXJtaW5lZCBhcyBmb3IgaW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLgorICAgIGF1dG8gY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdp
bihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKworICAgIExPR19XSVRIX1NU
UkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbSGVpZ2h0XVtNYXJnaW5d
IC0+IGZsb2F0aW5nIHJlcGxhY2VkIC0+IHJlZGlyZWN0ZWQgdG8gaW5saW5lIHJlcGxhY2VkIik7
CisgICAgYXV0byB1c2VkTWFyZ2luID0gVXNlZEhvcml6b250YWxNYXJnaW4geyBjb21wdXRlZEhv
cml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LmVuZC52YWx1ZU9yKDApIH07CisgICAgcmV0dXJuIGlubGluZVJlcGxhY2VkQ29udGVudFdpZHRo
QW5kTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgfSwgeyBvdmVy
cmlkZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0aCwgdXNlZE1hcmdpbiB9KTsKK30KKworVmVydGlj
YWxHZW9tZXRyeSBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Om91dE9mRmxvd1ZlcnRpY2Fs
R2VvbWV0cnkoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiB2ZXJ0
aWNhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRk
ZW5WZXJ0aWNhbFZhbHVlcykgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3V0T2ZG
bG93UG9zaXRpb25lZCgpKTsKKworICAgIGlmICghbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkK
KyAgICAgICAgcmV0dXJuIG91dE9mRmxvd05vblJlcGxhY2VkVmVydGljYWxHZW9tZXRyeShkb3du
Y2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgdmVy
dGljYWxDb25zdHJhaW50cywgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKKyAgICByZXR1cm4g
b3V0T2ZGbG93UmVwbGFjZWRWZXJ0aWNhbEdlb21ldHJ5KGRvd25jYXN0PFJlcGxhY2VkQm94Pihs
YXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMsIHZlcnRpY2FsQ29uc3RyYWludHMsIG92
ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Cit9CisKK0hvcml6b250YWxHZW9tZXRyeSBGb3JtYXR0
aW5nQ29udGV4dDo6R2VvbWV0cnk6Om91dE9mRmxvd0hvcml6b250YWxHZW9tZXRyeShjb25zdCBC
b3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29u
c3RyYWludHMsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMs
IGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJiBvdmVycmlkZGVuSG9yaXpvbnRhbFZh
bHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsK
KworICAgIGlmICghbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKKyAgICAgICAgcmV0dXJuIG91
dE9mRmxvd05vblJlcGxhY2VkSG9yaXpvbnRhbEdlb21ldHJ5KGRvd25jYXN0PENvbnRhaW5lckJv
eD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRh
bFZhbHVlcyk7CisgICAgcmV0dXJuIG91dE9mRmxvd1JlcGxhY2VkSG9yaXpvbnRhbEdlb21ldHJ5
KGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMs
IHZlcnRpY2FsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKTsKK30KKwor
Q29udGVudEhlaWdodEFuZE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZsb2F0
aW5nQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRk
ZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAoreworICAg
IEFTU0VSVChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7CisKKyAgICBpZiAoIWxh
eW91dEJveC5pc1JlcGxhY2VkQm94KCkpCisgICAgICAgIHJldHVybiBjb21wbGljYXRlZENhc2Vz
KGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1
ZXMpOworICAgIHJldHVybiBmbG9hdGluZ1JlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihk
b3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBv
dmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworfQorCitDb250ZW50V2lkdGhBbmRNYXJnaW4gRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpmbG9hdGluZ0NvbnRlbnRXaWR0aEFuZE1hcmdpbihj
b25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9u
dGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJiBvdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzRmxvYXRpbmdQ
b3NpdGlvbmVkKCkpOworCisgICAgaWYgKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQorICAg
ICAgICByZXR1cm4gZmxvYXRpbmdOb25SZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlv
dXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMp
OworICAgIHJldHVybiBmbG9hdGluZ1JlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGRvd25j
YXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJy
aWRkZW5Ib3Jpem9udGFsVmFsdWVzKTsKK30KKworQ29udGVudEhlaWdodEFuZE1hcmdpbiBGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmlubGluZVJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1h
cmdpbihjb25zdCBSZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBPcHRpb25hbDxWZXJ0aWNhbENvbnN0cmFp
bnRzPiB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMm
IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgY29uc3QKK3sKKyAgICAvLyAxMC42LjIgSW5saW5l
IHJlcGxhY2VkIGVsZW1lbnRzLCBibG9jay1sZXZlbCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3Jt
YWwgZmxvdywgJ2lubGluZS1ibG9jaycgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cg
YW5kIGZsb2F0aW5nIHJlcGxhY2VkIGVsZW1lbnRzCisgICAgLy8KKyAgICAvLyAxLiBJZiAnbWFy
Z2luLXRvcCcsIG9yICdtYXJnaW4tYm90dG9tJyBhcmUgJ2F1dG8nLCB0aGVpciB1c2VkIHZhbHVl
IGlzIDAuCisgICAgLy8gMi4gSWYgJ2hlaWdodCcgYW5kICd3aWR0aCcgYm90aCBoYXZlIGNvbXB1
dGVkIHZhbHVlcyBvZiAnYXV0bycgYW5kIHRoZSBlbGVtZW50IGFsc28gaGFzIGFuIGludHJpbnNp
YyBoZWlnaHQsIHRoZW4gdGhhdCBpbnRyaW5zaWMgaGVpZ2h0IGlzIHRoZSB1c2VkIHZhbHVlIG9m
ICdoZWlnaHQnLgorICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgJ2hlaWdodCcgaGFzIGEgY29tcHV0
ZWQgdmFsdWUgb2YgJ2F1dG8nLCBhbmQgdGhlIGVsZW1lbnQgaGFzIGFuIGludHJpbnNpYyByYXRp
byB0aGVuIHRoZSB1c2VkIHZhbHVlIG9mICdoZWlnaHQnIGlzOgorICAgIC8vICAgICh1c2VkIHdp
ZHRoKSAvIChpbnRyaW5zaWMgcmF0aW8pCisgICAgLy8gNC4gT3RoZXJ3aXNlLCBpZiAnaGVpZ2h0
JyBoYXMgYSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycsIGFuZCB0aGUgZWxlbWVudCBoYXMgYW4g
aW50cmluc2ljIGhlaWdodCwgdGhlbiB0aGF0IGludHJpbnNpYyBoZWlnaHQgaXMgdGhlIHVzZWQg
dmFsdWUgb2YgJ2hlaWdodCcuCisgICAgLy8gNS4gT3RoZXJ3aXNlLCBpZiAnaGVpZ2h0JyBoYXMg
YSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycsIGJ1dCBub25lIG9mIHRoZSBjb25kaXRpb25zIGFi
b3ZlIGFyZSBtZXQsIHRoZW4gdGhlIHVzZWQgdmFsdWUgb2YgJ2hlaWdodCcgbXVzdCBiZSBzZXQg
dG8KKyAgICAvLyAgICB0aGUgaGVpZ2h0IG9mIHRoZSBsYXJnZXN0IHJlY3RhbmdsZSB0aGF0IGhh
cyBhIDI6MSByYXRpbywgaGFzIGEgaGVpZ2h0IG5vdCBncmVhdGVyIHRoYW4gMTUwcHgsIGFuZCBo
YXMgYSB3aWR0aCBub3QgZ3JlYXRlciB0aGFuIHRoZSBkZXZpY2Ugd2lkdGguCisKKyAgICAvLyAj
MQorICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9ybWF0dGluZ0NvbnRleHQo
KTsKKyAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRW
ZXJ0aWNhbE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICBh
dXRvIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2Vk
VmFsdWVzIHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0
ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgYXV0byYgc3R5bGUgPSBy
ZXBsYWNlZEJveC5zdHlsZSgpOworCisgICAgYXV0byBoZWlnaHQgPSBvdmVycmlkZGVuVmVydGlj
YWxWYWx1ZXMuaGVpZ2h0ID8gb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodC52YWx1ZSgp
IDogY29tcHV0ZWRIZWlnaHQocmVwbGFjZWRCb3gsIHZlcnRpY2FsQ29uc3RyYWludHMgPyB2ZXJ0
aWNhbENvbnN0cmFpbnRzLT5sb2dpY2FsSGVpZ2h0IDogV1RGOjpudWxsb3B0KTsKKyAgICBhdXRv
IGhlaWdodElzQXV0byA9ICFvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVpZ2h0ICYmIGlzSGVp
Z2h0QXV0byhyZXBsYWNlZEJveCk7CisgICAgYXV0byB3aWR0aElzQXV0byA9IHN0eWxlLmxvZ2lj
YWxXaWR0aCgpLmlzQXV0bygpOworCisgICAgaWYgKGhlaWdodElzQXV0byAmJiB3aWR0aElzQXV0
byAmJiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNIZWlnaHQoKSkgeworICAgICAgICAvLyAjMgor
ICAgICAgICBoZWlnaHQgPSByZXBsYWNlZEJveC5pbnRyaW5zaWNIZWlnaHQoKTsKKyAgICB9IGVs
c2UgaWYgKGhlaWdodElzQXV0byAmJiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNSYXRpbygpKSB7
CisgICAgICAgIC8vICMzCisgICAgICAgIGF1dG8gdXNlZFdpZHRoID0gZm9ybWF0dGluZ0NvbnRl
eHQuZ2VvbWV0cnlGb3JCb3gocmVwbGFjZWRCb3gpLmNvbnRlbnRCb3hXaWR0aCgpOworICAgICAg
ICBoZWlnaHQgPSB1c2VkV2lkdGggLyByZXBsYWNlZEJveC5pbnRyaW5zaWNSYXRpbygpOworICAg
IH0gZWxzZSBpZiAoaGVpZ2h0SXNBdXRvICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY0hlaWdo
dCgpKSB7CisgICAgICAgIC8vICM0CisgICAgICAgIGhlaWdodCA9IHJlcGxhY2VkQm94LmludHJp
bnNpY0hlaWdodCgpOworICAgIH0gZWxzZSBpZiAoaGVpZ2h0SXNBdXRvKSB7CisgICAgICAgIC8v
ICM1CisgICAgICAgIGhlaWdodCA9IHsgMTUwIH07CisgICAgfQorCisgICAgQVNTRVJUKGhlaWdo
dCk7CisKKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVh
bSA8PCAiW0hlaWdodF1bTWFyZ2luXSAtPiBpbmZsb3cgcmVwbGFjZWQgLT4gaGVpZ2h0KCIgPDwg
KmhlaWdodCA8PCAicHgpIG1hcmdpbigiIDw8IHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPDwg
InB4LCAiIDw8IHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciA8PCAicHgpIC0+IGxheW91dEJveCgi
IDw8ICZyZXBsYWNlZEJveCA8PCAiKSIpOworICAgIHJldHVybiB7ICpoZWlnaHQsIHVzZWRWZXJ0
aWNhbE1hcmdpbiB9OworfQorCitDb250ZW50V2lkdGhBbmRNYXJnaW4gRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5OjppbmxpbmVSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBS
ZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9y
aXpvbnRhbENvbnN0cmFpbnRzLCBPcHRpb25hbDxWZXJ0aWNhbENvbnN0cmFpbnRzPiB2ZXJ0aWNh
bENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMpCit7CisgICAgLy8gMTAuMy4yIElubGluZSwgcmVwbGFjZWQgZWxl
bWVudHMKKyAgICAvLworICAgIC8vIEEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8nIGZvciAnbWFy
Z2luLWxlZnQnIG9yICdtYXJnaW4tcmlnaHQnIGJlY29tZXMgYSB1c2VkIHZhbHVlIG9mICcwJy4K
KyAgICAvLworICAgIC8vIDEuIElmICdoZWlnaHQnIGFuZCAnd2lkdGgnIGJvdGggaGF2ZSBjb21w
dXRlZCB2YWx1ZXMgb2YgJ2F1dG8nIGFuZCB0aGUgZWxlbWVudCBhbHNvIGhhcyBhbiBpbnRyaW5z
aWMgd2lkdGgsIHRoZW4gdGhhdCBpbnRyaW5zaWMgd2lkdGggaXMgdGhlIHVzZWQgdmFsdWUgb2Yg
J3dpZHRoJy4KKyAgICAvLworICAgIC8vIDIuIElmICdoZWlnaHQnIGFuZCAnd2lkdGgnIGJvdGgg
aGF2ZSBjb21wdXRlZCB2YWx1ZXMgb2YgJ2F1dG8nIGFuZCB0aGUgZWxlbWVudCBoYXMgbm8gaW50
cmluc2ljIHdpZHRoLCBidXQgZG9lcyBoYXZlIGFuIGludHJpbnNpYyBoZWlnaHQgYW5kIGludHJp
bnNpYyByYXRpbzsKKyAgICAvLyAgICBvciBpZiAnd2lkdGgnIGhhcyBhIGNvbXB1dGVkIHZhbHVl
IG9mICdhdXRvJywgJ2hlaWdodCcgaGFzIHNvbWUgb3RoZXIgY29tcHV0ZWQgdmFsdWUsIGFuZCB0
aGUgZWxlbWVudCBkb2VzIGhhdmUgYW4gaW50cmluc2ljIHJhdGlvOworICAgIC8vICAgIHRoZW4g
dGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBpczogKHVzZWQgaGVpZ2h0KSAqIChpbnRyaW5zaWMg
cmF0aW8pCisgICAgLy8KKyAgICAvLyAzLiBJZiAnaGVpZ2h0JyBhbmQgJ3dpZHRoJyBib3RoIGhh
dmUgY29tcHV0ZWQgdmFsdWVzIG9mICdhdXRvJyBhbmQgdGhlIGVsZW1lbnQgaGFzIGFuIGludHJp
bnNpYyByYXRpbyBidXQgbm8gaW50cmluc2ljIGhlaWdodCBvciB3aWR0aCwKKyAgICAvLyAgICB0
aGVuIHRoZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcgaXMgdW5kZWZpbmVkIGluIENTUyAyLjIuIEhv
d2V2ZXIsIGl0IGlzIHN1Z2dlc3RlZCB0aGF0LCBpZiB0aGUgY29udGFpbmluZyBibG9jaydzIHdp
ZHRoIGRvZXMgbm90IGl0c2VsZiBkZXBlbmQgb24gdGhlIHJlcGxhY2VkCisgICAgLy8gICAgZWxl
bWVudCdzIHdpZHRoLCB0aGVuIHRoZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcgaXMgY2FsY3VsYXRl
ZCBmcm9tIHRoZSBjb25zdHJhaW50IGVxdWF0aW9uIHVzZWQgZm9yIGJsb2NrLWxldmVsLCBub24t
cmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cuCisgICAgLy8KKyAgICAvLyA0LiBPdGhl
cndpc2UsIGlmICd3aWR0aCcgaGFzIGEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8nLCBhbmQgdGhl
IGVsZW1lbnQgaGFzIGFuIGludHJpbnNpYyB3aWR0aCwgdGhlbiB0aGF0IGludHJpbnNpYyB3aWR0
aCBpcyB0aGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgnLgorICAgIC8vCisgICAgLy8gNS4gT3RoZXJ3
aXNlLCBpZiAnd2lkdGgnIGhhcyBhIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJywgYnV0IG5vbmUg
b2YgdGhlIGNvbmRpdGlvbnMgYWJvdmUgYXJlIG1ldCwgdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAn
d2lkdGgnIGJlY29tZXMgMzAwcHguCisgICAgLy8gICAgSWYgMzAwcHggaXMgdG9vIHdpZGUgdG8g
Zml0IHRoZSBkZXZpY2UsIFVBcyBzaG91bGQgdXNlIHRoZSB3aWR0aCBvZiB0aGUgbGFyZ2VzdCBy
ZWN0YW5nbGUgdGhhdCBoYXMgYSAyOjEgcmF0aW8gYW5kIGZpdHMgdGhlIGRldmljZSBpbnN0ZWFk
LgorCisgICAgYXV0byBjb21wdXRlZEhvcml6b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwor
CisgICAgYXV0byB1c2VkTWFyZ2luU3RhcnQgPSBbJl0geworICAgICAgICBpZiAob3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMubWFyZ2luKQorICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRkZW5I
b3Jpem9udGFsVmFsdWVzLm1hcmdpbi0+c3RhcnQ7CisgICAgICAgIHJldHVybiBjb21wdXRlZEhv
cml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwX2x1KTsKKyAgICB9OworCisgICAgYXV0byB1
c2VkTWFyZ2luRW5kID0gWyZdIHsKKyAgICAgICAgaWYgKG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFs
dWVzLm1hcmdpbikKKyAgICAgICAgICAgIHJldHVybiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVl
cy5tYXJnaW4tPmVuZDsKKyAgICAgICAgcmV0dXJuIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5l
bmQudmFsdWVPcigwX2x1KTsKKyAgICB9OworCisgICAgYXV0byB3aWR0aCA9IG92ZXJyaWRkZW5I
b3Jpem9udGFsVmFsdWVzLndpZHRoID8gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGgg
OiBjb21wdXRlZFdpZHRoKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNh
bFdpZHRoKTsKKyAgICBhdXRvIGhlaWdodElzQXV0byA9IGlzSGVpZ2h0QXV0byhyZXBsYWNlZEJv
eCk7CisgICAgYXV0byBoZWlnaHQgPSBjb21wdXRlZEhlaWdodChyZXBsYWNlZEJveCwgdmVydGlj
YWxDb25zdHJhaW50cyA/IHZlcnRpY2FsQ29uc3RyYWludHMtPmxvZ2ljYWxIZWlnaHQgOiBXVEY6
Om51bGxvcHQpOworCisgICAgaWYgKCF3aWR0aCAmJiBoZWlnaHRJc0F1dG8gJiYgcmVwbGFjZWRC
b3guaGFzSW50cmluc2ljV2lkdGgoKSkgeworICAgICAgICAvLyAjMQorICAgICAgICB3aWR0aCA9
IHJlcGxhY2VkQm94LmludHJpbnNpY1dpZHRoKCk7CisgICAgfSBlbHNlIGlmICgoIXdpZHRoICYm
IGhlaWdodElzQXV0byAmJiAhcmVwbGFjZWRCb3guaGFzSW50cmluc2ljV2lkdGgoKSAmJiByZXBs
YWNlZEJveC5oYXNJbnRyaW5zaWNIZWlnaHQoKSAmJiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNS
YXRpbygpKQorICAgICAgICB8fCAoIXdpZHRoICYmIGhlaWdodCAmJiByZXBsYWNlZEJveC5oYXNJ
bnRyaW5zaWNSYXRpbygpKSkgeworICAgICAgICAvLyAjMgorICAgICAgICB3aWR0aCA9IGhlaWdo
dC52YWx1ZU9yKHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY0hlaWdodCgpKSAqIHJlcGxhY2VkQm94
LmludHJpbnNpY1JhdGlvKCk7CisgICAgfSBlbHNlIGlmICghd2lkdGggJiYgaGVpZ2h0SXNBdXRv
ICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1JhdGlvKCkgJiYgIXJlcGxhY2VkQm94Lmhhc0lu
dHJpbnNpY1dpZHRoKCkgJiYgIXJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY0hlaWdodCgpKSB7Cisg
ICAgICAgIC8vICMzCisgICAgICAgIC8vIEZJWE1FOiB1bmRlZmluZWQgYnV0IHN1cmVseSBkb2Fi
bGUuCisgICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7CisgICAgfSBlbHNlIGlm
ICghd2lkdGggJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljV2lkdGgoKSkgeworICAgICAgICAv
LyAjNAorICAgICAgICB3aWR0aCA9IHJlcGxhY2VkQm94LmludHJpbnNpY1dpZHRoKCk7CisgICAg
fSBlbHNlIGlmICghd2lkdGgpIHsKKyAgICAgICAgLy8gIzUKKyAgICAgICAgd2lkdGggPSB7IDMw
MCB9OworICAgIH0KKworICAgIEFTU0VSVCh3aWR0aCk7CisKKyAgICBMT0dfV0lUSF9TVFJFQU0o
Rm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1dpZHRoXVtNYXJnaW5dIC0+IGlu
ZmxvdyByZXBsYWNlZCAtPiB3aWR0aCgiIDw8ICp3aWR0aCA8PCAicHgpIG1hcmdpbigiIDw8IHVz
ZWRNYXJnaW5TdGFydCgpIDw8ICJweCwgIiA8PCB1c2VkTWFyZ2luRW5kKCkgPDwgInB4KSAtPiBs
YXlvdXRCb3goIiA8PCAmcmVwbGFjZWRCb3ggPDwgIikiKTsKKyAgICByZXR1cm4geyAqd2lkdGgs
IHsgdXNlZE1hcmdpblN0YXJ0KCksIHVzZWRNYXJnaW5FbmQoKSB9IH07Cit9CisKK0xheW91dFNp
emUgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbkZsb3dQb3NpdGlvbmVkUG9zaXRpb25P
ZmZzZXQoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYg
aG9yaXpvbnRhbENvbnN0cmFpbnRzKSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNJ
bkZsb3dQb3NpdGlvbmVkKCkpOworCisgICAgLy8gOS40LjMgUmVsYXRpdmUgcG9zaXRpb25pbmcK
KyAgICAvLworICAgIC8vIFRoZSAndG9wJyBhbmQgJ2JvdHRvbScgcHJvcGVydGllcyBtb3ZlIHJl
bGF0aXZlbHkgcG9zaXRpb25lZCBlbGVtZW50KHMpIHVwIG9yIGRvd24gd2l0aG91dCBjaGFuZ2lu
ZyB0aGVpciBzaXplLgorICAgIC8vIFRvcCcgbW92ZXMgdGhlIGJveGVzIGRvd24sIGFuZCAnYm90
dG9tJyBtb3ZlcyB0aGVtIHVwLiBTaW5jZSBib3hlcyBhcmUgbm90IHNwbGl0IG9yIHN0cmV0Y2hl
ZCBhcyBhIHJlc3VsdCBvZiAndG9wJyBvciAnYm90dG9tJywgdGhlIHVzZWQgdmFsdWVzIGFyZSBh
bHdheXM6IHRvcCA9IC1ib3R0b20uCisgICAgLy8KKyAgICAvLyAxLiBJZiBib3RoIGFyZSAnYXV0
bycsIHRoZWlyIHVzZWQgdmFsdWVzIGFyZSBib3RoICcwJy4KKyAgICAvLyAyLiBJZiBvbmUgb2Yg
dGhlbSBpcyAnYXV0bycsIGl0IGJlY29tZXMgdGhlIG5lZ2F0aXZlIG9mIHRoZSBvdGhlci4KKyAg
ICAvLyAzLiBJZiBuZWl0aGVyIGlzICdhdXRvJywgJ2JvdHRvbScgaXMgaWdub3JlZCAoaS5lLiwg
dGhlIHVzZWQgdmFsdWUgb2YgJ2JvdHRvbScgd2lsbCBiZSBtaW51cyB0aGUgdmFsdWUgb2YgJ3Rv
cCcpLgorCisgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICBhdXRvIGNv
bnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsK
KworICAgIGF1dG8gdG9wID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2FsVG9wKCksIGNvbnRh
aW5pbmdCbG9ja1dpZHRoKTsKKyAgICBhdXRvIGJvdHRvbSA9IGNvbXB1dGVkVmFsdWUoc3R5bGUu
bG9naWNhbEJvdHRvbSgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisKKyAgICBpZiAoIXRvcCAm
JiAhYm90dG9tKSB7CisgICAgICAgIC8vICMxCisgICAgICAgIHRvcCA9IGJvdHRvbSA9IHsgMCB9
OworICAgIH0gZWxzZSBpZiAoIXRvcCkgeworICAgICAgICAvLyAjMgorICAgICAgICB0b3AgPSAt
KmJvdHRvbTsKKyAgICB9IGVsc2UgaWYgKCFib3R0b20pIHsKKyAgICAgICAgLy8gIzMKKyAgICAg
ICAgYm90dG9tID0gLSp0b3A7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gIzQKKyAgICAgICAg
Ym90dG9tID0gV1RGOjpudWxsb3B0OworICAgIH0KKworICAgIC8vIEZvciByZWxhdGl2ZWx5IHBv
c2l0aW9uZWQgZWxlbWVudHMsICdsZWZ0JyBhbmQgJ3JpZ2h0JyBtb3ZlIHRoZSBib3goZXMpIGhv
cml6b250YWxseSwgd2l0aG91dCBjaGFuZ2luZyB0aGVpciBzaXplLgorICAgIC8vICdMZWZ0JyBt
b3ZlcyB0aGUgYm94ZXMgdG8gdGhlIHJpZ2h0LCBhbmQgJ3JpZ2h0JyBtb3ZlcyB0aGVtIHRvIHRo
ZSBsZWZ0LgorICAgIC8vIFNpbmNlIGJveGVzIGFyZSBub3Qgc3BsaXQgb3Igc3RyZXRjaGVkIGFz
IGEgcmVzdWx0IG9mICdsZWZ0JyBvciAncmlnaHQnLCB0aGUgdXNlZCB2YWx1ZXMgYXJlIGFsd2F5
czogbGVmdCA9IC1yaWdodC4KKyAgICAvLworICAgIC8vIDEuIElmIGJvdGggJ2xlZnQnIGFuZCAn
cmlnaHQnIGFyZSAnYXV0bycgKHRoZWlyIGluaXRpYWwgdmFsdWVzKSwgdGhlIHVzZWQgdmFsdWVz
IGFyZSAnMCcgKGkuZS4sIHRoZSBib3hlcyBzdGF5IGluIHRoZWlyIG9yaWdpbmFsIHBvc2l0aW9u
KS4KKyAgICAvLyAyLiBJZiAnbGVmdCcgaXMgJ2F1dG8nLCBpdHMgdXNlZCB2YWx1ZSBpcyBtaW51
cyB0aGUgdmFsdWUgb2YgJ3JpZ2h0JyAoaS5lLiwgdGhlIGJveGVzIG1vdmUgdG8gdGhlIGxlZnQg
YnkgdGhlIHZhbHVlIG9mICdyaWdodCcpLgorICAgIC8vIDMuIElmICdyaWdodCcgaXMgc3BlY2lm
aWVkIGFzICdhdXRvJywgaXRzIHVzZWQgdmFsdWUgaXMgbWludXMgdGhlIHZhbHVlIG9mICdsZWZ0
Jy4KKyAgICAvLyA0LiBJZiBuZWl0aGVyICdsZWZ0JyBub3IgJ3JpZ2h0JyBpcyAnYXV0bycsIHRo
ZSBwb3NpdGlvbiBpcyBvdmVyLWNvbnN0cmFpbmVkLCBhbmQgb25lIG9mIHRoZW0gaGFzIHRvIGJl
IGlnbm9yZWQuCisgICAgLy8gICAgSWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBj
b250YWluaW5nIGJsb2NrIGlzICdsdHInLCB0aGUgdmFsdWUgb2YgJ2xlZnQnIHdpbnMgYW5kICdy
aWdodCcgYmVjb21lcyAtJ2xlZnQnLgorICAgIC8vICAgIElmICdkaXJlY3Rpb24nIG9mIHRoZSBj
b250YWluaW5nIGJsb2NrIGlzICdydGwnLCAncmlnaHQnIHdpbnMgYW5kICdsZWZ0JyBpcyBpZ25v
cmVkLgorCisgICAgYXV0byBsZWZ0ID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2FsTGVmdCgp
LCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisgICAgYXV0byByaWdodCA9IGNvbXB1dGVkVmFsdWUo
c3R5bGUubG9naWNhbFJpZ2h0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKworICAgIGlmICgh
bGVmdCAmJiAhcmlnaHQpIHsKKyAgICAgICAgLy8gIzEKKyAgICAgICAgbGVmdCA9IHJpZ2h0ID0g
eyAwIH07CisgICAgfSBlbHNlIGlmICghbGVmdCkgeworICAgICAgICAvLyAjMgorICAgICAgICBs
ZWZ0ID0gLSpyaWdodDsKKyAgICB9IGVsc2UgaWYgKCFyaWdodCkgeworICAgICAgICAvLyAjMwor
ICAgICAgICByaWdodCA9IC0qbGVmdDsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyAjNAorICAg
ICAgICBhdXRvIGlzTGVmdFRvUmlnaHREaXJlY3Rpb24gPSBsYXlvdXRCb3guY29udGFpbmluZ0Js
b2NrKCkuc3R5bGUoKS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCk7CisgICAgICAgIGlmIChpc0xl
ZnRUb1JpZ2h0RGlyZWN0aW9uKQorICAgICAgICAgICAgcmlnaHQgPSAtKmxlZnQ7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIGxlZnQgPSBXVEY6Om51bGxvcHQ7CisgICAgfQorCisgICAgQVNT
RVJUKCFib3R0b20gfHwgKnRvcCA9PSAtKmJvdHRvbSk7CisgICAgQVNTRVJUKCFsZWZ0IHx8ICps
ZWZ0ID09IC0qcmlnaHQpOworCisgICAgYXV0byB0b3BQb3NpdGlvbk9mZnNldCA9ICp0b3A7Cisg
ICAgYXV0byBsZWZ0UG9zaXRpb25PZmZzZXQgPSBsZWZ0LnZhbHVlT3IoLSpyaWdodCk7CisKKyAg
ICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1Bv
c2l0aW9uXSAtPiBwb3NpdGlvbmVkIGluZmxvdyAtPiB0b3Agb2Zmc2V0KCIgPDwgdG9wUG9zaXRp
b25PZmZzZXQgPDwgInB4KSBsZWZ0IG9mZnNldCgiIDw8IGxlZnRQb3NpdGlvbk9mZnNldCA8PCAi
cHgpIGxheW91dEJveCgiIDw8ICZsYXlvdXRCb3ggPDwgIikiKTsKKyAgICByZXR1cm4geyBsZWZ0
UG9zaXRpb25PZmZzZXQsIHRvcFBvc2l0aW9uT2Zmc2V0IH07Cit9CisKK2lubGluZSBzdGF0aWMg
V3JpdGluZ01vZGUgdXNlZFdyaXRpbmdNb2RlKGNvbnN0IEJveCYgbGF5b3V0Qm94KQoreworICAg
IC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mtd3JpdGluZy1tb2Rlcy00LyNsb2dpY2FsLWRp
cmVjdGlvbi1sYXlvdXQKKyAgICAvLyBGbG93LXJlbGF0aXZlIGRpcmVjdGlvbnMgYXJlIGNhbGN1
bGF0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSB3cml0aW5nIG1vZGUgb2YgdGhlIGNvbnRhaW5pbmcg
YmxvY2sgb2YgdGhlIGJveC4KKyAgICAvLyBGb3IgaW5saW5lLWxldmVsIGJveGVzLCB0aGUgd3Jp
dGluZyBtb2RlIG9mIHRoZSBwYXJlbnQgYm94IGlzIHVzZWQgaW5zdGVhZC4KKyAgICByZXR1cm4g
bGF5b3V0Qm94LmlzSW5saW5lTGV2ZWxCb3goKSA/IGxheW91dEJveC5wYXJlbnQoKS5zdHlsZSgp
LndyaXRpbmdNb2RlKCkgOiBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkuc3R5bGUoKS53cml0
aW5nTW9kZSgpOworfQorCitFZGdlcyBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1
dGVkQm9yZGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIGF1dG8mIHN0eWxl
ID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250
ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltCb3JkZXJdIC0+IGxheW91dEJveDogIiA8PCAmbGF5b3V0
Qm94KTsKKyAgICByZXR1cm4geworICAgICAgICB7IExheW91dFVuaXQoc3R5bGUuYm9yZGVyTGVm
dFdpZHRoKCkpLCBMYXlvdXRVbml0KHN0eWxlLmJvcmRlclJpZ2h0V2lkdGgoKSkgfSwKKyAgICAg
ICAgeyBMYXlvdXRVbml0KHN0eWxlLmJvcmRlclRvcFdpZHRoKCkpLCBMYXlvdXRVbml0KHN0eWxl
LmJvcmRlckJvdHRvbVdpZHRoKCkpIH0KKyAgICB9OworfQorCitPcHRpb25hbDxFZGdlcz4gRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZFBhZGRpbmcoY29uc3QgQm94JiBsYXlv
dXRCb3gsIGNvbnN0IExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpIGNvbnN0Cit7Cisg
ICAgaWYgKCFsYXlvdXRCb3guaXNQYWRkaW5nQXBwbGljYWJsZSgpKQorICAgICAgICByZXR1cm4g
V1RGOjpudWxsb3B0OworCisgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAg
ICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1Bh
ZGRpbmddIC0+IGxheW91dEJveDogIiA8PCAmbGF5b3V0Qm94KTsKKyAgICByZXR1cm4gRWRnZXMg
eworICAgICAgICB7IHZhbHVlRm9yTGVuZ3RoKHN0eWxlLnBhZGRpbmdMZWZ0KCksIGNvbnRhaW5p
bmdCbG9ja1dpZHRoKSwgdmFsdWVGb3JMZW5ndGgoc3R5bGUucGFkZGluZ1JpZ2h0KCksIGNvbnRh
aW5pbmdCbG9ja1dpZHRoKSB9LAorICAgICAgICB7IHZhbHVlRm9yTGVuZ3RoKHN0eWxlLnBhZGRp
bmdUb3AoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpLCB2YWx1ZUZvckxlbmd0aChzdHlsZS5wYWRk
aW5nQm90dG9tKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSB9CisgICAgfTsKK30KKworQ29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRI
b3Jpem9udGFsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29u
c3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICBhdXRvJiBzdHls
ZSA9IGxheW91dEJveC5zdHlsZSgpOworICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBo
b3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoOworICAgIGlmIChpc0hvcml6b250YWxX
cml0aW5nTW9kZSh1c2VkV3JpdGluZ01vZGUobGF5b3V0Qm94KSkpCisgICAgICAgIHJldHVybiB7
IGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luTGVmdCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCks
IGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luUmlnaHQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgp
IH07CisgICAgcmV0dXJuIHsgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5Ub3AoKSwgY29udGFp
bmluZ0Jsb2NrV2lkdGgpLCBjb21wdXRlZFZhbHVlKHN0eWxlLm1hcmdpbkJvdHRvbSgpLCBjb250
YWluaW5nQmxvY2tXaWR0aCkgfTsKK30KKworQ29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiBGb3JtYXR0
aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkVmVydGljYWxNYXJnaW4oY29uc3QgQm94JiBs
YXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFp
bnRzKSBjb25zdAoreworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAg
YXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2Fs
V2lkdGg7CisgICAgaWYgKGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKHVzZWRXcml0aW5nTW9kZShs
YXlvdXRCb3gpKSkKKyAgICAgICAgcmV0dXJuIHsgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5U
b3AoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpLCBjb21wdXRlZFZhbHVlKHN0eWxlLm1hcmdpbkJv
dHRvbSgpLCBjb250YWluaW5nQmxvY2tXaWR0aCkgfTsKKyAgICByZXR1cm4geyBjb21wdXRlZFZh
bHVlKHN0eWxlLm1hcmdpbkxlZnQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpLCBjb21wdXRlZFZh
bHVlKHN0eWxlLm1hcmdpblJpZ2h0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSB9OworfQorCitG
b3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6OmNvbnN0cmFpbkJ5TWluTWF4V2lkdGgoY29uc3QgQm94JiBsYXlvdXRC
b3gsIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2ljV2lkdGgpIGNvbnN0Cit7Cisg
ICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICBhdXRvIG1pbldpZHRoID0g
Zml4ZWRWYWx1ZShzdHlsZS5sb2dpY2FsTWluV2lkdGgoKSk7CisgICAgYXV0byBtYXhXaWR0aCA9
IGZpeGVkVmFsdWUoc3R5bGUubG9naWNhbE1heFdpZHRoKCkpOworICAgIGlmICghbWluV2lkdGgg
JiYgIW1heFdpZHRoKQorICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGg7CisKKyAgICBpZiAo
bWF4V2lkdGgpIHsKKyAgICAgICAgaW50cmluc2ljV2lkdGgubWluaW11bSA9IHN0ZDo6bWluKCpt
YXhXaWR0aCwgaW50cmluc2ljV2lkdGgubWluaW11bSk7CisgICAgICAgIGludHJpbnNpY1dpZHRo
Lm1heGltdW0gPSBzdGQ6Om1pbigqbWF4V2lkdGgsIGludHJpbnNpY1dpZHRoLm1heGltdW0pOwor
ICAgIH0KKworICAgIGlmIChtaW5XaWR0aCkgeworICAgICAgICBpbnRyaW5zaWNXaWR0aC5taW5p
bXVtID0gc3RkOjptYXgoKm1pbldpZHRoLCBpbnRyaW5zaWNXaWR0aC5taW5pbXVtKTsKKyAgICAg
ICAgaW50cmluc2ljV2lkdGgubWF4aW11bSA9IHN0ZDo6bWF4KCptaW5XaWR0aCwgaW50cmluc2lj
V2lkdGgubWF4aW11bSk7CisgICAgfQorCisgICAgQVNTRVJUKGludHJpbnNpY1dpZHRoLm1pbmlt
dW0gPD0gaW50cmluc2ljV2lkdGgubWF4aW11bSk7CisgICAgcmV0dXJuIGludHJpbnNpY1dpZHRo
OworfQorCitGb3JtYXR0aW5nQ29udGV4dDo6Q29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50
IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250
ZW50KGNvbnN0IENvbnRhaW5lckJveCYgY29udGFpbmVyQm94KQoreworICAgIGF1dG8mIGJveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChjb250YWluZXJCb3gp
OworICAgIHJldHVybiB7CisgICAgICAgIHsgYm94R2VvbWV0cnkucGFkZGluZ0JveExlZnQoKSwg
Ym94R2VvbWV0cnkucGFkZGluZ0JveFdpZHRoKCkgfSwKKyAgICAgICAgeyBib3hHZW9tZXRyeS5w
YWRkaW5nQm94VG9wKCksIGJveEdlb21ldHJ5LnBhZGRpbmdCb3hIZWlnaHQoKSB9LAorICAgICAg
ICBib3hHZW9tZXRyeS5jb250ZW50Qm94V2lkdGgoKSB9OworfQorCitGb3JtYXR0aW5nQ29udGV4
dDo6Q29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRy
eTo6Y29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KGNvbnN0IENvbnRhaW5lckJveCYgY29udGFp
bmVyQm94LCBPcHRpb25hbDxFc2NhcGVSZWFzb24+IGVzY2FwZVJlYXNvbikKK3sKKyAgICBhdXRv
JiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goY29udGFp
bmVyQm94LCBlc2NhcGVSZWFzb24pOworICAgIHJldHVybiB7IHsgYm94R2VvbWV0cnkuY29udGVu
dEJveExlZnQoKSwgYm94R2VvbWV0cnkuY29udGVudEJveFdpZHRoKCkgfSwgeyBib3hHZW9tZXRy
eS5jb250ZW50Qm94VG9wKCksIGNvbXB1dGVkSGVpZ2h0KGNvbnRhaW5lckJveCkgfSB9OworfQor
Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9Gb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uODIxMWIwZGM2MzBjYTIzOTdiYWIzODRmOTgwODMwMzE5MWYyYmQwYQotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9y
bWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lm
IEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiTGF5b3V0Qm94
LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKKyNpbmNsdWRlICJMYXlvdXRJbml0
aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBM
YXlvdXQgeworCitMYXlvdXRVbml0IEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OmhlaWdodFZh
bHVlT2ZOZWFyZXN0Q29udGFpbmluZ0Jsb2NrV2l0aEZpeGVkSGVpZ2h0KGNvbnN0IEJveCYgbGF5
b3V0Qm94KQoreworICAgIC8vIEluIHF1aXJrcyBtb2RlLCB3ZSBnbyBhbmQgdHJhdmVycyB0aGUg
Y29udGFpbmluZyBibG9jayBjaGFpbiB0byBmaW5kIGEgYmxvY2sgbGV2ZWwgYm94IHdpdGggZml4
ZWQgaGVpZ2h0IHZhbHVlLCBldmVuIGlmIGl0IG1lYW5zIGxlYXZpbmcKKyAgICAvLyB0aGUgY3Vy
cmVudCBmb3JtYXR0aW5nIGNvbnRleHQuIEZJWE1FOiBzdXJlbHkgd2UgbmVlZCB0byBkbyBzb21l
IHRyaWNrcyBoZXJlIHdoZW4gYmxvY2sgZGlyZWN0aW9uIHN1cHBvcnQgaXMgYWRkZWQuCisgICAg
YXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgpOworICAg
IGF1dG8qIGNvbnRhaW5pbmdCbG9jayA9ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7Cisg
ICAgTGF5b3V0VW5pdCBib2R5QW5kRG9jdW1lbnRWZXJ0aWNhbE1hcmdpblBhZGRpbmdBbmRCb3Jk
ZXI7CisgICAgd2hpbGUgKGNvbnRhaW5pbmdCbG9jaykgeworICAgICAgICBhdXRvIGNvbnRhaW5p
bmdCbG9ja0hlaWdodCA9IGNvbnRhaW5pbmdCbG9jay0+c3R5bGUoKS5sb2dpY2FsSGVpZ2h0KCk7
CisgICAgICAgIGlmIChjb250YWluaW5nQmxvY2tIZWlnaHQuaXNGaXhlZCgpKQorICAgICAgICAg
ICAgcmV0dXJuIExheW91dFVuaXQoY29udGFpbmluZ0Jsb2NrSGVpZ2h0LnZhbHVlKCkgLSBib2R5
QW5kRG9jdW1lbnRWZXJ0aWNhbE1hcmdpblBhZGRpbmdBbmRCb3JkZXIpOworCisgICAgICAgIC8v
IElmIHRoZSBvbmx5IGZpeGVkIHZhbHVlIGJveCB3ZSBmaW5kIGlzIHRoZSBJQ0IsIHRoZW4gaWdu
b3JlIHRoZSBib2R5IGFuZCB0aGUgZG9jdW1lbnQgKHZlcnRpY2FsKSBtYXJnaW4sIHBhZGRpbmcg
YW5kIGJvcmRlci4gU28gbXVjaCBxdWlya2luZXNzLgorICAgICAgICAvLyAtYW5kIGl0J3MgdG90
YWxseSBpbnNhbmUgYmVjYXVzZSBub3cgd2UgZnJlZWx5IHRyYXZlbCBhY3Jvc3MgZm9ybWF0dGlu
ZyBjb250ZXh0IGJvdW5kYXJpZXMgYW5kIGNvbXB1dGVkIG1hcmdpbnMgYXJlIG5vbmV4aXN0ZW50
LgorICAgICAgICBpZiAoY29udGFpbmluZ0Jsb2NrLT5pc0JvZHlCb3goKSB8fCBjb250YWluaW5n
QmxvY2stPmlzRG9jdW1lbnRCb3goKSkgeworCisgICAgICAgICAgICBhdXRvIGdlb21ldHJ5ID0g
Zm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnkoKTsKKyAgICAgICAgICAgIGF1dG8gaG9yaXpvbnRh
bENvbnN0cmFpbnRzID0gZ2VvbWV0cnkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KGNvbnRh
aW5pbmdCbG9jay0+Y29udGFpbmluZ0Jsb2NrKCksIEZvcm1hdHRpbmdDb250ZXh0OjpFc2NhcGVS
ZWFzb246OkZpbmRGaXhlZEhlaWdodEFuY2VzdG9yUXVpcmspLmhvcml6b250YWw7CisgICAgICAg
ICAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gZ2VvbWV0cnkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdp
bigqY29udGFpbmluZ0Jsb2NrLCBob3Jpem9udGFsQ29uc3RyYWludHMpOworCisgICAgICAgICAg
ICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KCpj
b250YWluaW5nQmxvY2ssIEZvcm1hdHRpbmdDb250ZXh0OjpFc2NhcGVSZWFzb246OkZpbmRGaXhl
ZEhlaWdodEFuY2VzdG9yUXVpcmspOworICAgICAgICAgICAgYXV0byB2ZXJ0aWNhbFBhZGRpbmcg
PSBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKSArIGJveEdlb21ldHJ5LnBhZGRp
bmdCb3R0b20oKS52YWx1ZU9yKDApOworICAgICAgICAgICAgYXV0byB2ZXJ0aWNhbEJvcmRlciA9
IGJveEdlb21ldHJ5LmJvcmRlclRvcCgpICsgYm94R2VvbWV0cnkuYm9yZGVyQm90dG9tKCk7Cisg
ICAgICAgICAgICBib2R5QW5kRG9jdW1lbnRWZXJ0aWNhbE1hcmdpblBhZGRpbmdBbmRCb3JkZXIg
Kz0gdmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCkgKyB2ZXJ0aWNhbE1hcmdpbi5hZnRl
ci52YWx1ZU9yKDApICsgdmVydGljYWxQYWRkaW5nICsgdmVydGljYWxCb3JkZXI7CisgICAgICAg
IH0KKworICAgICAgICBpZiAoaXM8SW5pdGlhbENvbnRhaW5pbmdCbG9jaz4oKmNvbnRhaW5pbmdC
bG9jaykpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY29udGFpbmluZ0Jsb2NrID0gJmNv
bnRhaW5pbmdCbG9jay0+Y29udGFpbmluZ0Jsb2NrKCk7CisgICAgfQorICAgIC8vIEluaXRpYWwg
Y29udGFpbmluZyBibG9jayBoYXMgdG8gaGF2ZSBhIGhlaWdodC4KKyAgICByZXR1cm4gZm9ybWF0
dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LmluaXRpYWxDb250YWluaW5nQmxv
Y2soKSwgRm9ybWF0dGluZ0NvbnRleHQ6OkVzY2FwZVJlYXNvbjo6RmluZEZpeGVkSGVpZ2h0QW5j
ZXN0b3JRdWlyaykuY29udGVudEJveCgpLmhlaWdodCgpIC0gYm9keUFuZERvY3VtZW50VmVydGlj
YWxNYXJnaW5QYWRkaW5nQW5kQm9yZGVyOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRp
bmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi4wZjU1NWY4MTkzODFlNzNhZjNlMTljMDJmMzhiMGZjZjNiZDEyMDRiCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5jcHAKQEAgLTAsMCArMSw1
NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisg
KiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICog
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQmxvY2tG
b3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRF
WFQpCisKKyNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkZsb2F0
aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbnZh
bGlkYXRpb25TdGF0ZS5oIgorI2luY2x1ZGUgIkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91
dENoaWxkSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNs
dWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRhaW5pbmdC
bG9jay5oIgorI2luY2x1ZGUgIkxheW91dFN0YXRlLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgor
I2luY2x1ZGUgIlRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRl
IDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0u
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtF
X0lTT19BTExPQ0FURURfSU1QTChCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KTsKKworQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dDo6QmxvY2tGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gm
IGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgQmxvY2tGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdT
dGF0ZSkKKyAgICA6IEZvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgZm9y
bWF0dGluZ1N0YXRlKQoreworfQorCit2b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmxheW91
dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmIGludmFsaWRhdGlvblN0YXRlLCBjb25z
dCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAgIC8vIDku
NC4xIEJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMKKyAgICAvLyBJbiBhIGJsb2NrIGZvcm1hdHRp
bmcgY29udGV4dCwgYm94ZXMgYXJlIGxhaWQgb3V0IG9uZSBhZnRlciB0aGUgb3RoZXIsIHZlcnRp
Y2FsbHksIGJlZ2lubmluZyBhdCB0aGUgdG9wIG9mIGEgY29udGFpbmluZyBibG9jay4KKyAgICAv
LyBUaGUgdmVydGljYWwgZGlzdGFuY2UgYmV0d2VlbiB0d28gc2libGluZyBib3hlcyBpcyBkZXRl
cm1pbmVkIGJ5IHRoZSAnbWFyZ2luJyBwcm9wZXJ0aWVzLgorICAgIC8vIFZlcnRpY2FsIG1hcmdp
bnMgYmV0d2VlbiBhZGphY2VudCBibG9jay1sZXZlbCBib3hlcyBpbiBhIGJsb2NrIGZvcm1hdHRp
bmcgY29udGV4dCBjb2xsYXBzZS4KKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRl
eHRMYXlvdXQsIHN0cmVhbSA8PCAiW1N0YXJ0XSAtPiBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQg
LT4gZm9ybWF0dGluZyByb290KCIgPDwgJnJvb3QoKSA8PCAiKSIpOworICAgIGF1dG8mIGZvcm1h
dHRpbmdSb290ID0gcm9vdCgpOworICAgIEFTU0VSVChmb3JtYXR0aW5nUm9vdC5oYXNJbkZsb3dP
ckZsb2F0aW5nQ2hpbGQoKSk7CisgICAgYXV0byYgZmxvYXRpbmdTdGF0ZSA9IGZvcm1hdHRpbmdT
dGF0ZSgpLmZsb2F0aW5nU3RhdGUoKTsKKyAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0
aW5nQ29udGV4dCB7ICp0aGlzLCBmbG9hdGluZ1N0YXRlIH07CisKKyAgICBMYXlvdXRRdWV1ZSBs
YXlvdXRRdWV1ZTsKKyAgICBlbnVtIGNsYXNzIExheW91dERpcmVjdGlvbiB7IENoaWxkLCBTaWJs
aW5nIH07CisgICAgYXV0byBhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZSA9IFsmXSAoY29uc3QgYXV0
byYgbGF5b3V0Qm94LCBhdXRvIGRpcmVjdGlvbikgeworICAgICAgICBpZiAoZGlyZWN0aW9uID09
IExheW91dERpcmVjdGlvbjo6Q2hpbGQpIHsKKyAgICAgICAgICAgIGlmICghaXM8Q29udGFpbmVy
Qm94PihsYXlvdXRCb3gpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgIGZvciAoYXV0byogY2hpbGQgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCku
Zmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRJ
bkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpbnZhbGlk
YXRpb25TdGF0ZS5uZWVkc0xheW91dCgqY2hpbGQpKQorICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgICAgICBsYXlvdXRRdWV1ZS5hcHBlbmQoY2hpbGQpOworICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBMYXlvdXREaXJl
Y3Rpb246OlNpYmxpbmcpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byogbmV4dFNpYmxpbmcgPSBs
YXlvdXRCb3gubmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCk7IG5leHRTaWJsaW5nOyBuZXh0
U2libGluZyA9IG5leHRTaWJsaW5nLT5uZXh0SW5GbG93T3JGbG9hdGluZ1NpYmxpbmcoKSkgewor
ICAgICAgICAgICAgICAgIGlmICghaW52YWxpZGF0aW9uU3RhdGUubmVlZHNMYXlvdXQoKm5leHRT
aWJsaW5nKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAg
bGF5b3V0UXVldWUuYXBwZW5kKG5leHRTaWJsaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
fQorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH07CisKKyAgICBhdXRvIGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94ID0gWyZdIChjb25zdCBh
dXRvJiBsYXlvdXRCb3gpIHsKKyAgICAgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gbGF5b3V0
Qm94LmNvbnRhaW5pbmdCbG9jaygpOworICAgICAgICByZXR1cm4gJmNvbnRhaW5pbmdCbG9jayA9
PSAmZm9ybWF0dGluZ1Jvb3QgPyBjb25zdHJhaW50cyA6IGdlb21ldHJ5KCkuY29uc3RyYWludHNG
b3JJbkZsb3dDb250ZW50KGNvbnRhaW5pbmdCbG9jayk7CisgICAgfTsKKworICAgIC8vIFRoaXMg
aXMgYSBwb3N0LW9yZGVyIHRyZWUgdHJhdmVyc2FsIGxheW91dC4KKyAgICAvLyBUaGUgcm9vdCBj
b250YWluZXIgbGF5b3V0IGlzIGRvbmUgaW4gdGhlIGZvcm1hdHRpbmcgY29udGV4dCBpdCBsaXZl
cyBpbiwgbm90IHRoYXQgb25lIGl0IGNyZWF0ZXMsIHNvIGxldCdzIHN0YXJ0IHdpdGggdGhlIGZp
cnN0IGNoaWxkLgorICAgIGFwcGVuZE5leHRUb0xheW91dFF1ZXVlKGZvcm1hdHRpbmdSb290LCBM
YXlvdXREaXJlY3Rpb246OkNoaWxkKTsKKyAgICAvLyAxLiBHbyBhbGwgdGhlIHdheSBkb3duIHRv
IHRoZSBsZWFmIG5vZGUKKyAgICAvLyAyLiBDb21wdXRlIHN0YXRpYyBwb3NpdGlvbiBhbmQgd2lk
dGggYXMgd2UgdHJhdmVyc2UgZG93bgorICAgIC8vIDMuIEFzIHdlIGNsaW1iIGJhY2sgb24gdGhl
IHRyZWUsIGNvbXB1dGUgaGVpZ2h0IGFuZCBmaW5pYWxpemUgcG9zaXRpb24KKyAgICAvLyAoQW55
IHN1YnRyZWVzIHdpdGggbmV3IGZvcm1hdHRpbmcgY29udGV4dHMgbmVlZCB0byBsYXlvdXQgc3lu
Y2hyb25vdXNseSkKKyAgICB3aGlsZSAoIWxheW91dFF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAg
ICAvLyBUcmF2ZXJzZSBkb3duIG9uIHRoZSBkZXNjZW5kYW50cyBhbmQgY29tcHV0ZSB3aWR0aC9z
dGF0aWMgcG9zaXRpb24gdW50aWwgd2UgZmluZCBhIGxlYWYgbm9kZS4KKyAgICAgICAgd2hpbGUg
KHRydWUpIHsKKyAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9ICpsYXlvdXRRdWV1ZS5sYXN0
KCk7CisgICAgICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzID0gY29uc3Ry
YWludHNGb3JMYXlvdXRCb3gobGF5b3V0Qm94KTsKKworICAgICAgICAgICAgY29tcHV0ZUJvcmRl
ckFuZFBhZGRpbmcobGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cy5ob3Jpem9u
dGFsKTsKKyAgICAgICAgICAgIGNvbXB1dGVTdGF0aWNWZXJ0aWNhbFBvc2l0aW9uKGxheW91dEJv
eCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMudmVydGljYWwpOworICAgICAgICAgICAgY29t
cHV0ZVdpZHRoQW5kTWFyZ2luKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCB7IGNvbnN0cmFp
bnRzLCBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyB9KTsKKyAgICAgICAgICAgIGNvbXB1dGVT
dGF0aWNIb3Jpem9udGFsUG9zaXRpb24obGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tDb25zdHJh
aW50cy5ob3Jpem9udGFsKTsKKyAgICAgICAgICAgIGNvbXB1dGVQb3NpdGlvblRvQXZvaWRGbG9h
dHMoZmxvYXRpbmdDb250ZXh0LCBsYXlvdXRCb3gsIHsgY29uc3RyYWludHMsIGNvbnRhaW5pbmdC
bG9ja0NvbnN0cmFpbnRzIH0pOworCisgICAgICAgICAgICBpZiAobGF5b3V0Qm94LmVzdGFibGlz
aGVzRm9ybWF0dGluZ0NvbnRleHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChpczxDb250YWlu
ZXJCb3g+KGxheW91dEJveCkgJiYgZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmhh
c0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGNv
bnRhaW5lckJveCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKGNvbnRhaW5lckJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdD
b250ZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElGQ3MgaW5oZXJpdCBmbG9h
dHMgZnJvbSBwYXJlbnQgRkNzLiBXZSBuZWVkIGZpbmFsIHZlcnRpY2FsIHBvc2l0aW9uIHRvIGZp
bmQgaW50cnVkaW5nIGZsb2F0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvbXB1dGVW
ZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGNvbnRhaW5lckJveCwgeyBjb25zdHJh
aW50cywgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMgfSk7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICAgICAgLy8gTGF5b3V0IHRoZSBpbmZsb3cgZGVzY2VuZGFudHMg
b2YgdGhpcyBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdC4KKyAgICAgICAgICAgICAgICAgICAgYXV0
byBmb3JtYXR0aW5nQ29udGV4dCA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250
ZXh0KGNvbnRhaW5lckJveCwgbGF5b3V0U3RhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlm
IChjb250YWluZXJCb3guaXNUYWJsZVdyYXBwZXJCb3goKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGRvd25jYXN0PFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ+KCpmb3JtYXR0
aW5nQ29udGV4dCkuc2V0SG9yaXpvbnRhbENvbnN0cmFpbnRzSWdub3JpbmdGbG9hdHMoY29udGFp
bmluZ0Jsb2NrQ29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAgICAgICAgICAgICAgICAgIGZv
cm1hdHRpbmdDb250ZXh0LT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBn
ZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb250YWluZXJCb3gpKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBpZiAoIWFwcGVuZE5leHRUb0xheW91dFF1ZXVlKGxheW91dEJveCwgTGF5b3V0
RGlyZWN0aW9uOjpDaGlsZCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwor
ICAgICAgICAvLyBDbGltYiBiYWNrIG9uIHRoZSBhbmNlc3RvcnMgYW5kIGNvbXB1dGUgaGVpZ2h0
L2ZpbmFsIHBvc2l0aW9uLgorICAgICAgICB3aGlsZSAoIWxheW91dFF1ZXVlLmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKmxheW91dFF1ZXVlLnRha2VMYXN0KCk7
CisgICAgICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzID0gY29uc3RyYWlu
dHNGb3JMYXlvdXRCb3gobGF5b3V0Qm94KTsKKworICAgICAgICAgICAgLy8gQWxsIGluZmxvdyBk
ZXNjZW5kYW50cyAoaWYgdGhlcmUgYXJlIGFueSkgYXJlIGxhaWQgb3V0IGJ5IG5vdy4gTGV0J3Mg
Y29tcHV0ZSB0aGUgYm94J3MgaGVpZ2h0IGFuZCB2ZXJ0aWNhbCBtYXJnaW4uCisgICAgICAgICAg
ICBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3Ry
YWludHMpOworICAgICAgICAgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgp
KQorICAgICAgICAgICAgICAgIGZsb2F0aW5nU3RhdGUuYXBwZW5kKGZsb2F0aW5nQ29udGV4dC50
b0Zsb2F0SXRlbShsYXlvdXRCb3gpKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
ICAgIC8vIEFkanVzdCB0aGUgdmVydGljYWwgcG9zaXRpb24gbm93IHRoYXQgd2UndmUgZ290IGZp
bmFsIG1hcmdpbiB2YWx1ZXMgZm9yIG5vbi1mbG9hdCBhdm9pZGVyIGJveGVzLgorICAgICAgICAg
ICAgICAgIC8vIEZsb2F0IGF2b2lkZXJzIGhhdmUgcHJlLWNvbXB1dGVkIHZlcnRpY2FsIHBvc2l0
aW9ucyB3aGVuIGZsb2F0cyBhcmUgcHJlc2VudC4KKyAgICAgICAgICAgICAgICBpZiAoIWxheW91
dEJveC5pc0Zsb2F0QXZvaWRlcigpIHx8IGZsb2F0aW5nQ29udGV4dC5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGlu
Z1N0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0
dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7CisgICAgICAgICAgICAgICAgICAgIGJv
eEdlb21ldHJ5LnNldExvZ2ljYWxUb3AodmVydGljYWxQb3NpdGlvbldpdGhNYXJnaW4obGF5b3V0
Qm94LCBmb3JtYXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCksIGNvbnRh
aW5pbmdCbG9ja0NvbnN0cmFpbnRzLnZlcnRpY2FsKSk7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBlc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0
ID0gbGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKTsgCisgICAgICAgICAg
ICBpZiAoZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCkgeworICAgICAgICAgICAgICAgIC8v
IE5vdyB0aGF0IHdlIGNvbXB1dGVkIHRoZSBib3gncyBoZWlnaHQsIHdlIGNhbiBsYXlvdXQgdGhl
IG91dC1vZi1mbG93IGRlc2NlbmRhbnRzLgorICAgICAgICAgICAgICAgIGlmIChpczxDb250YWlu
ZXJCb3g+KGxheW91dEJveCkgJiYgZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmhh
c0NoaWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byYgY29udGFpbmVyQm94ID0gZG93
bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpOworICAgICAgICAgICAgICAgICAgICBMYXlv
dXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjb250YWluZXJCb3gsIGxheW91dFN0
YXRlKCkpLT5sYXlvdXRPdXRPZkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBnZW9tZXRy
eSgpLmNvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudChjb250YWluZXJCb3gpKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWVzdGFibGlzaGVz
Rm9ybWF0dGluZ0NvbnRleHQgJiYgaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpKQorICAgICAg
ICAgICAgICAgIHBsYWNlSW5GbG93UG9zaXRpb25lZENoaWxkcmVuKGRvd25jYXN0PENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KSwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9yaXpvbnRhbCk7
CisKKyAgICAgICAgICAgIGlmIChhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShsYXlvdXRCb3gsIExh
eW91dERpcmVjdGlvbjo6U2libGluZykpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICB9CisgICAgLy8gUGxhY2UgdGhlIGluZmxvdyBwb3NpdGlvbmVkIGNoaWxkcmVuLgor
ICAgIHBsYWNlSW5GbG93UG9zaXRpb25lZENoaWxkcmVuKGZvcm1hdHRpbmdSb290LCBjb25zdHJh
aW50cy5ob3Jpem9udGFsKTsKKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRM
YXlvdXQsIHN0cmVhbSA8PCAiW0VuZF0gLT4gYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IC0+IGZv
cm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKK30KKworTGF5b3V0VW5pdCBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0Ojp1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0Cit7CisgICAgLy8g
MTAuNi43ICdBdXRvJyBoZWlnaHRzIGZvciBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdHMK
KworICAgIC8vIElmIGl0IGhhcyBibG9jay1sZXZlbCBjaGlsZHJlbiwgdGhlIGhlaWdodCBpcyB0
aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdG9wIG1hcmdpbi1lZGdlIG9mIHRoZSB0b3Btb3N0IGJs
b2NrLWxldmVsCisgICAgLy8gY2hpbGQgYm94IGFuZCB0aGUgYm90dG9tIG1hcmdpbi1lZGdlIG9m
IHRoZSBib3R0b21tb3N0IGJsb2NrLWxldmVsIGNoaWxkIGJveC4KKworICAgIC8vIEluIGFkZGl0
aW9uLCBpZiB0aGUgZWxlbWVudCBoYXMgYW55IGZsb2F0aW5nIGRlc2NlbmRhbnRzIHdob3NlIGJv
dHRvbSBtYXJnaW4gZWRnZSBpcyBiZWxvdyB0aGUgZWxlbWVudCdzIGJvdHRvbSBjb250ZW50IGVk
Z2UsCisgICAgLy8gdGhlbiB0aGUgaGVpZ2h0IGlzIGluY3JlYXNlZCB0byBpbmNsdWRlIHRob3Nl
IGVkZ2VzLiBPbmx5IGZsb2F0cyB0aGF0IHBhcnRpY2lwYXRlIGluIHRoaXMgYmxvY2sgZm9ybWF0
dGluZyBjb250ZXh0IGFyZSB0YWtlbgorICAgIC8vIGludG8gYWNjb3VudCwgZS5nLiwgZmxvYXRz
IGluc2lkZSBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgZGVzY2VuZGFudHMgb3Igb3RoZXIgZmxvYXRz
IGFyZSBub3QuCisgICAgYXV0byB0b3AgPSBPcHRpb25hbDxMYXlvdXRVbml0PiB7IH07CisgICAg
YXV0byBib3R0b20gPSBPcHRpb25hbDxMYXlvdXRVbml0PiB7IH07CisgICAgaWYgKHJvb3QoKS5o
YXNJbkZsb3dDaGlsZCgpKSB7CisgICAgICAgIHRvcCA9IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hS
ZWN0KGdlb21ldHJ5Rm9yQm94KCpyb290KCkuZmlyc3RJbkZsb3dDaGlsZCgpKSkudG9wKCk7Cisg
ICAgICAgIGJvdHRvbSA9IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KGdlb21ldHJ5Rm9yQm94
KCpyb290KCkubGFzdEluRmxvd0NoaWxkKCkpKS5ib3R0b20oKTsKKyAgICB9CisKKyAgICBhdXRv
IGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7ICp0aGlzLCBmb3JtYXR0aW5nU3Rh
dGUoKS5mbG9hdGluZ1N0YXRlKCkgfTsKKyAgICBpZiAoYXV0byBmbG9hdFRvcCA9IGZsb2F0aW5n
Q29udGV4dC50b3AoKSkgeworICAgICAgICB0b3AgPSBzdGQ6Om1pbigqZmxvYXRUb3AsIHRvcC52
YWx1ZU9yKCpmbG9hdFRvcCkpOworICAgICAgICBhdXRvIGZsb2F0Qm90dG9tID0gKmZsb2F0aW5n
Q29udGV4dC5ib3R0b20oKTsKKyAgICAgICAgYm90dG9tID0gc3RkOjptYXgoZmxvYXRCb3R0b20s
IGJvdHRvbS52YWx1ZU9yKGZsb2F0Qm90dG9tKSk7CisgICAgfQorICAgIHJldHVybiAqYm90dG9t
IC0gKnRvcDsKK30KKworT3B0aW9uYWw8TGF5b3V0VW5pdD4gQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6dXNlZEF2YWlsYWJsZVdpZHRoRm9yRmxvYXRBdm9pZGVyKGNvbnN0IEZsb2F0aW5nQ29udGV4
dCYgZmxvYXRpbmdDb250ZXh0LCBjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29uc3RyYWlu
dHNQYWlyJiBjb25zdHJhaW50c1BhaXIpCit7CisgICAgLy8gTm9ybWFsbHkgdGhlIGF2YWlsYWJs
ZSB3aWR0aCBmb3IgYW4gaW4tZmxvdyBibG9jayBsZXZlbCBib3ggaXMgdGhlIHdpZHRoIG9mIHRo
ZSBjb250YWluaW5nIGJsb2NrJ3MgY29udGVudCBib3guCisgICAgLy8gSG93ZXZlciAoYW5kIGNh
bid0IGZpbmQgaXQgYW55d2hlcmUgaW4gdGhlIHNwZWMpIG5vbi1mbG9hdGluZyBwb3NpdGlvbmVk
IGZsb2F0IGF2b2lkZXIgYmxvY2sgbGV2ZWwgYm94ZXMgYXJlIGNvbnN0cmFpbmVkIGJ5IGV4aXN0
aW5nIGZsb2F0cy4KKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkpOworICAg
IGlmIChmbG9hdGluZ0NvbnRleHQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4geyB9OworICAg
IC8vIEZsb2F0IGNsZWFyIHB1c2hlcyB0aGUgYmxvY2sgbGV2ZWwgYm94IGVpdGhlciBiZWxvdyB0
aGUgZmxvYXRzLCBvciBqdXN0IG9uZSBzaWRlIGJlbG93IGJ1dCB0aGUgb3RoZXIgc2lkZSBjb3Vs
ZCBvdmVybGFwLgorICAgIC8vIFdoYXQgaXQgbWVhbnMgaXMgdGhhdCB0aGUgdXNlZCBhdmFpbGFi
bGUgd2lkdGggYWx3YXlzIG1hdGNoZXMgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBjb25zdHJhaW50
LgorICAgIGlmIChsYXlvdXRCb3guaGFzRmxvYXRDbGVhcigpKQorICAgICAgICByZXR1cm4geyB9
OworCisgICAgQVNTRVJUKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkp
OworICAgIC8vIFZlcnRpY2FsIHN0YXRpYyBwb3NpdGlvbiBpcyBub3QgY29tcHV0ZWQgeWV0IGZv
ciB0aGlzIGZvcm1hdHRpbmcgY29udGV4dCByb290LCBzbyBsZXQncyBqdXN0IHByZS1jb21wdXRl
IGl0IGZvciBub3cuCisgICAgcHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNl
c3RvcnMobGF5b3V0Qm94LCBjb25zdHJhaW50c1BhaXIpOworCisgICAgYXV0byBsb2dpY2FsVG9w
SW5Gb3JtYXR0aW5nQ29udGV4dFJvb3RDb29yZGluYXRlID0gWyZdIChhdXRvJiBmbG9hdEF2b2lk
ZXIpIHsKKyAgICAgICAgYXV0byB0b3AgPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94VG9wKGdlb21l
dHJ5Rm9yQm94KGZsb2F0QXZvaWRlcikpOworICAgICAgICBmb3IgKGF1dG8qIGFuY2VzdG9yID0g
JmZsb2F0QXZvaWRlci5jb250YWluaW5nQmxvY2soKTsgYW5jZXN0b3IgIT0gJnJvb3QoKTsgYW5j
ZXN0b3IgPSAmYW5jZXN0b3ItPmNvbnRhaW5pbmdCbG9jaygpKQorICAgICAgICAgICAgdG9wICs9
IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hUb3AoZ2VvbWV0cnlGb3JCb3goKmFuY2VzdG9yKSk7Cisg
ICAgICAgIHJldHVybiB0b3A7CisgICAgfTsKKworICAgIGF1dG8gZmxvYXRDb25zdHJhaW50c0lu
Q29udGFpbmluZ0Jsb2NrQ29vcmRpbmF0ZSA9IFsmXSAoYXV0byBmbG9hdENvbnN0cmFpbnRzKSB7
CisgICAgICAgIGlmICghZmxvYXRDb25zdHJhaW50cy5sZWZ0ICYmICFmbG9hdENvbnN0cmFpbnRz
LnJpZ2h0KQorICAgICAgICAgICAgcmV0dXJuIEZsb2F0aW5nQ29udGV4dDo6Q29uc3RyYWludHMg
eyB9OworICAgICAgICBhdXRvIG9mZnNldCA9IExheW91dFNpemUgeyB9OworICAgICAgICBmb3Ig
KGF1dG8qIGFuY2VzdG9yID0gJmxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsgYW5jZXN0b3Ig
IT0gJnJvb3QoKTsgYW5jZXN0b3IgPSAmYW5jZXN0b3ItPmNvbnRhaW5pbmdCbG9jaygpKQorICAg
ICAgICAgICAgb2Zmc2V0ICs9IHRvTGF5b3V0U2l6ZShCb3hHZW9tZXRyeTo6Ym9yZGVyQm94VG9w
TGVmdChnZW9tZXRyeUZvckJveCgqYW5jZXN0b3IpKSk7CisgICAgICAgIGlmIChmbG9hdENvbnN0
cmFpbnRzLmxlZnQpCisgICAgICAgICAgICBmbG9hdENvbnN0cmFpbnRzLmxlZnQgPSBQb2ludElu
Q29udGV4dFJvb3QgeyAqZmxvYXRDb25zdHJhaW50cy5sZWZ0IC0gb2Zmc2V0IH07CisgICAgICAg
IGlmIChmbG9hdENvbnN0cmFpbnRzLnJpZ2h0KQorICAgICAgICAgICAgZmxvYXRDb25zdHJhaW50
cy5yaWdodCA9IFBvaW50SW5Db250ZXh0Um9vdCB7ICpmbG9hdENvbnN0cmFpbnRzLnJpZ2h0IC0g
b2Zmc2V0IH07CisgICAgICAgIHJldHVybiBmbG9hdENvbnN0cmFpbnRzOworICAgIH07CisKKyAg
ICAvLyBGSVhNRTogQ2hlY2sgaWYgdGhlIG5vbi15ZXQtY29tcHV0ZWQgaGVpZ2h0IGFmZmVjdHMg
dGhpcyBjb21wdXRhdGlvbiAtIGFuZCB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzb2x2ZSBpdCBhdCBh
IGxhdGVyIHBvaW50LgorICAgIGF1dG8gbG9naWNhbFRvcCA9IGxvZ2ljYWxUb3BJbkZvcm1hdHRp
bmdDb250ZXh0Um9vdENvb3JkaW5hdGUobGF5b3V0Qm94KTsKKyAgICBhdXRvIGNvbnN0cmFpbnRz
ID0gZmxvYXRDb25zdHJhaW50c0luQ29udGFpbmluZ0Jsb2NrQ29vcmRpbmF0ZShmbG9hdGluZ0Nv
bnRleHQuY29uc3RyYWludHMobG9naWNhbFRvcCwgbG9naWNhbFRvcCkpOworICAgIGlmICghY29u
c3RyYWludHMubGVmdCAmJiAhY29uc3RyYWludHMucmlnaHQpCisgICAgICAgIHJldHVybiB7IH07
CisgICAgLy8gU2hyaW5rIHRoZSBhdmFpbGFibGUgc3BhY2UgaWYgdGhlIGZsb2F0cyBhcmUgYWN0
dWFsbHkgaW50cnVkaW5nIGF0IHRoaXMgdmVydGljYWwgcG9zaXRpb24uCisgICAgYXV0byBhdmFp
bGFibGVXaWR0aCA9IGNvbnN0cmFpbnRzUGFpci5jb250YWluaW5nQmxvY2suaG9yaXpvbnRhbC5s
b2dpY2FsV2lkdGg7CisgICAgaWYgKGNvbnN0cmFpbnRzLmxlZnQpCisgICAgICAgIGF2YWlsYWJs
ZVdpZHRoIC09IGNvbnN0cmFpbnRzLmxlZnQtPng7CisgICAgaWYgKGNvbnN0cmFpbnRzLnJpZ2h0
KQorICAgICAgICBhdmFpbGFibGVXaWR0aCAtPSBzdGQ6Om1heCgwX2x1LCBjb25zdHJhaW50c1Bh
aXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250YWwubG9naWNhbFJpZ2h0KCkgLSBjb25zdHJhaW50
cy5yaWdodC0+eCk7CisgICAgcmV0dXJuIGF2YWlsYWJsZVdpZHRoOworfQorCit2b2lkIEJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQ6OnBsYWNlSW5GbG93UG9zaXRpb25lZENoaWxkcmVuKGNvbnN0IENv
bnRhaW5lckJveCYgY29udGFpbmVyQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhv
cml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0Nv
bnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiU3RhcnQ6IG1vdmUgaW4tZmxvdyBwb3NpdGlvbmVkIGNo
aWxkcmVuIC0+IHBhcmVudDogIiA8PCAmY29udGFpbmVyQm94KTsKKyAgICBmb3IgKGF1dG8mIGNo
aWxkQm94IDogY2hpbGRyZW5PZlR5cGU8Qm94Pihjb250YWluZXJCb3gpKSB7CisgICAgICAgIGlm
ICghY2hpbGRCb3guaXNJbkZsb3dQb3NpdGlvbmVkKCkpCisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgYXV0byBwb3NpdGlvbk9mZnNldCA9IGdlb21ldHJ5KCkuaW5GbG93UG9zaXRpb25l
ZFBvc2l0aW9uT2Zmc2V0KGNoaWxkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAg
ICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShjaGlsZEJveCkubW92ZShwb3NpdGlvbk9m
ZnNldCk7CisgICAgfQorICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91
dCwgc3RyZWFtIDw8ICJFbmQ6IG1vdmUgaW4tZmxvdyBwb3NpdGlvbmVkIGNoaWxkcmVuIC0+IHBh
cmVudDogIiA8PCAmY29udGFpbmVyQm94KTsKK30KKwordm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0Ojpjb21wdXRlU3RhdGljVmVydGljYWxQb3NpdGlvbihjb25zdCBCb3gmIGxheW91dEJveCwg
Y29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cykKK3sKKyAgICBm
b3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxUb3AoZ2Vv
bWV0cnkoKS5zdGF0aWNWZXJ0aWNhbFBvc2l0aW9uKGxheW91dEJveCwgdmVydGljYWxDb25zdHJh
aW50cykpOworfQorCit2b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVTdGF0aWNI
b3Jpem9udGFsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQoreworICAgIGZvcm1hdHRpbmdTdGF0
ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCkuc2V0TG9naWNhbExlZnQoZ2VvbWV0cnkoKS5zdGF0
aWNIb3Jpem9udGFsUG9zaXRpb24obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpKTsK
K30KKwordm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpwcmVjb21wdXRlVmVydGljYWxQb3Np
dGlvbkZvckJveEFuZEFuY2VzdG9ycyhjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29uc3Ry
YWludHNQYWlyJiBjb25zdHJhaW50c1BhaXIpCit7CisgICAgLy8gSW4gb3JkZXIgdG8gZmlndXJl
IG91dCB3aGV0aGVyIGEgYm94IHNob3VsZCBhdm9pZCBhIGZsb2F0LCB3ZSBuZWVkIHRvIGtub3cg
dGhlIGZpbmFsIHBvc2l0aW9ucyBvZiBib3RoIChpZ25vcmUgcmVsYXRpdmUgcG9zaXRpb25pbmcg
Zm9yIG5vdykuCisgICAgLy8gSW4gYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHRoZSBmaW5hbCBw
b3NpdGlvbiBmb3IgYSBub3JtYWwgZmxvdyBib3ggaW5jbHVkZXMKKyAgICAvLyAxLiB0aGUgc3Rh
dGljIHBvc2l0aW9uIGFuZAorICAgIC8vIDIuIHRoZSBjb3JyZXNwb25kaW5nIChub24pY29sbGFw
c2VkIG1hcmdpbnMuCisgICAgLy8gTm93IHRoZSB2ZXJ0aWNhbCBtYXJnaW5zIGFyZSBjb21wdXRl
ZCB3aGVuIGFsbCB0aGUgZGVzY2VuZGFudHMgYXJlIGZpbmFsaXplZCwgYmVjYXVzZSB0aGUgbWFy
Z2luIHZhbHVlcyBtaWdodCBiZSBkZXBlbmRpbmcgb24gdGhlIGhlaWdodCBvZiB0aGUgYm94Cisg
ICAgLy8gKGFuZCB0aGUgaGVpZ2h0IG1pZ2h0IGJlIGJhc2VkIG9uIHRoZSBjb250ZW50KS4KKyAg
ICAvLyBTbyB3aGVuIHdlIGdldCB0byB0aGUgcG9pbnQgd2hlcmUgd2UgaW50ZXJzZWN0IHRoZSBi
b3ggd2l0aCB0aGUgZmxvYXQgdG8gZGVjaWRlIGlmIHRoZSBib3ggbmVlZHMgdG8gbW92ZSwgd2Ug
ZG9uJ3QgeWV0IGhhdmUgdGhlIGZpbmFsIHZlcnRpY2FsIHBvc2l0aW9uLgorICAgIC8vCisgICAg
Ly8gVGhlIGlkZWEgaGVyZSBpcyB0aGF0IGFzIGxvbmcgYXMgd2UgZG9uJ3QgY3Jvc3MgdGhlIGJs
b2NrIGZvcm1hdHRpbmcgY29udGV4dCBib3VuZGFyeSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcHJl
LWNvbXB1dGUgdGhlIGZpbmFsIHRvcCBwb3NpdGlvbi4KKyAgICAvLyBGSVhNRTogd2UgY3VycmVu
dGx5IGRvbid0IGFjY291bnQgZm9yIHRoZSAiY2xlYXIiIHByb3BlcnR5IHdoZW4gY29tcHV0aW5n
IHRoZSBmaW5hbCBwb3NpdGlvbiBmb3IgYW4gYW5jZXN0b3IuCisgICAgZm9yIChhdXRvKiBhbmNl
c3RvciA9ICZsYXlvdXRCb3g7IGFuY2VzdG9yICYmIGFuY2VzdG9yICE9ICZyb290KCk7IGFuY2Vz
dG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkgeworICAgICAgICBhdXRvIGNvbnN0
cmFpbnRzRm9yQW5jZXN0b3IgPSBbJl0geworICAgICAgICAgICAgYXV0byYgY29udGFpbmluZ0Js
b2NrID0gYW5jZXN0b3ItPmNvbnRhaW5pbmdCbG9jaygpOworICAgICAgICAgICAgcmV0dXJuICZj
b250YWluaW5nQmxvY2sgPT0gJnJvb3QoKSA/IGNvbnN0cmFpbnRzUGFpci5mb3JtYXR0aW5nQ29u
dGV4dFJvb3QgOiBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb250YWlu
aW5nQmxvY2spOworICAgICAgICB9KCk7CisKKyAgICAgICAgYXV0byBjb21wdXRlZFZlcnRpY2Fs
TWFyZ2luID0gZ2VvbWV0cnkoKS5jb21wdXRlZFZlcnRpY2FsTWFyZ2luKCphbmNlc3RvciwgY29u
c3RyYWludHNGb3JBbmNlc3Rvci5ob3Jpem9udGFsKTsKKyAgICAgICAgYXV0byB1c2VkTm9uQ29s
bGFwc2VkTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgeyBj
b21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21wdXRlZFZlcnRpY2Fs
TWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKKyAgICAgICAgYXV0byBwcmVjb21wdXRlZE1hcmdp
bkJlZm9yZSA9IG1hcmdpbkNvbGxhcHNlKCkucHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoKmFuY2Vz
dG9yLCB1c2VkTm9uQ29sbGFwc2VkTWFyZ2luKTsKKworICAgICAgICBhdXRvJiBib3hHZW9tZXRy
eSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KCphbmNlc3Rvcik7CisgICAgICAgIGF1
dG8gbm9uQ29sbGFwc2VkVmFsdWVzID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRW
YWx1ZXMgeyBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZS5ub25Db2xsYXBzZWRWYWx1ZSwgeyB9IH07
CisgICAgICAgIGF1dG8gY29sbGFwc2VkVmFsdWVzID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpDb2xs
YXBzZWRWYWx1ZXMgeyBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZS5jb2xsYXBzZWRWYWx1ZSwgeyB9
LCBmYWxzZSB9OworICAgICAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFy
Z2luIHsgbm9uQ29sbGFwc2VkVmFsdWVzLCBjb2xsYXBzZWRWYWx1ZXMsIHsgcHJlY29tcHV0ZWRN
YXJnaW5CZWZvcmUucG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbkJlZm9yZSwgeyB9IH0gfTsKKwor
ICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRVc2VkVmVydGljYWxNYXJnaW4oKmFuY2VzdG9y
LCB2ZXJ0aWNhbE1hcmdpbik7CisgICAgICAgIGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2lu
KHsgbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKSwgbWFyZ2luQWZ0ZXIodmVydGljYWxNYXJn
aW4pIH0pOworICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRp
b25XaXRoTWFyZ2luKCphbmNlc3RvciwgdmVydGljYWxNYXJnaW4sIGNvbnN0cmFpbnRzRm9yQW5j
ZXN0b3IudmVydGljYWwpKTsKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgICAgICBzZXRQcmVjb21w
dXRlZE1hcmdpbkJlZm9yZSgqYW5jZXN0b3IsIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKTsKKyAg
ICAgICAgYm94R2VvbWV0cnkuc2V0SGFzUHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoKTsKKyNlbmRp
ZgorICAgIH0KK30KKwordm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlUG9zaXRp
b25Ub0F2b2lkRmxvYXRzKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYgZmxvYXRpbmdDb250ZXh0LCBj
b25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29uc3RyYWludHNQYWlyJiBjb25zdHJhaW50c1Bh
aXIpCit7CisgICAgaWYgKCFsYXlvdXRCb3guaXNGbG9hdEF2b2lkZXIoKSkKKyAgICAgICAgcmV0
dXJuOworICAgIC8vIEluIG9yZGVyIHRvIHBvc2l0aW9uIGEgZmxvYXQgYXZvaWRlciB3ZSBuZWVk
IHRvIGtub3cgaXRzIHZlcnRpY2FsIHBvc2l0aW9uIHJlbGF0aXZlIHRvIGl0cyBmb3JtYXR0aW5n
IGNvbnRleHQgcm9vdCAoYW5kIG5vdCBqdXN0IGl0cyBjb250YWluaW5nIGJsb2NrKSwKKyAgICAv
LyBiZWNhdXNlIGFsbCB0aGUgYWxyZWFkeS1wbGFjZWQgZmxvYXRzIChmbG9hdHMgdGhhdCB3ZSBh
cmUgdHJ5aW5nIHRvIGF2b2lkIGhlcmUpIGluIHRoaXMgQkZDIG1pZ2h0IGJlbG9uZworICAgIC8v
IHRvIGEgZGlmZmVyZW50IHNldCBvZiBjb250YWluaW5nIGJsb2NrcyAoYnV0IHRoZXkgYWxsIGRl
c2NlbmRhbnRzIG9mIHRoZSBCRkMgcm9vdCkuCisgICAgLy8gSG93ZXZlciBhY2NvcmRpbmcgdG8g
dGhlIEJGQyBydWxlcywgYXQgdGhpcyBwb2ludCBvZiB0aGUgbGF5b3V0IGZsb3cgd2UgZG9uJ3Qg
eWV0IGhhdmUgY29tcHV0ZWQgdmVydGljYWwgcG9zaXRpb25zIGZvciB0aGUgYW5jZXN0b3JzLgor
ICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkgeworICAgICAgICBwcmVj
b21wdXRlVmVydGljYWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhsYXlvdXRCb3gsIGNvbnN0
cmFpbnRzUGFpcik7CisgICAgICAgIGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91
dEJveCkuc2V0TG9naWNhbFRvcExlZnQoZmxvYXRpbmdDb250ZXh0LnBvc2l0aW9uRm9yRmxvYXQo
bGF5b3V0Qm94LCBjb25zdHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250YWwpKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBOb24tZmxvYXQgcG9zaXRpb25lZCBmbG9h
dCBhdm9pZGVycyAoZm9ybWF0dGluZyBjb250ZXh0IHJvb3RzIGFuZCBjbGVhciBib3hlcykgc2hv
dWxkIGJlIGZpbmUgdW5sZXNzIHRoZXJlIGFyZSBmbG9hdHMgaW4gdGhpcyBjb250ZXh0LgorICAg
IGlmIChmbG9hdGluZ0NvbnRleHQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisgICAgcHJl
Y29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMobGF5b3V0Qm94LCBjb25z
dHJhaW50c1BhaXIpOworICAgIGlmIChsYXlvdXRCb3guaGFzRmxvYXRDbGVhcigpKQorICAgICAg
ICByZXR1cm4gY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JGbG9hdENsZWFyKGZsb2F0aW5nQ29u
dGV4dCwgbGF5b3V0Qm94KTsKKworICAgIEFTU0VSVChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3Jt
YXR0aW5nQ29udGV4dCgpKTsKKyAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlv
dXRCb3gpLnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nQ29udGV4dC5wb3NpdGlvbkZvck5vbkZs
b2F0aW5nRmxvYXRBdm9pZGVyKGxheW91dEJveCwgY29uc3RyYWludHNQYWlyLmNvbnRhaW5pbmdC
bG9jay5ob3Jpem9udGFsKSk7Cit9CisKK3ZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29t
cHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JGbG9hdENsZWFyKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYg
ZmxvYXRpbmdDb250ZXh0LCBjb25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICBBU1NFUlQobGF5
b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSk7CisgICAgaWYgKGZsb2F0aW5nQ29udGV4dC5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybjsKKyAgICBhdXRvIHZlcnRpY2FsUG9zaXRpb25BbmRDbGVhcmFu
Y2UgPSBmbG9hdGluZ0NvbnRleHQudmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UobGF5b3V0
Qm94KTsKKyAgICBpZiAoIXZlcnRpY2FsUG9zaXRpb25BbmRDbGVhcmFuY2UpCisgICAgICAgIHJl
dHVybjsKKworICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2Vv
bWV0cnkobGF5b3V0Qm94KTsKKyAgICBBU1NFUlQodmVydGljYWxQb3NpdGlvbkFuZENsZWFyYW5j
ZS0+cG9zaXRpb24gPj0gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChib3hHZW9tZXRyeSkpOwor
ICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3AodmVydGljYWxQb3NpdGlvbkFuZENsZWFyYW5j
ZS0+cG9zaXRpb24pOworICAgIGlmICh2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJhbmNlLT5jbGVh
cmFuY2UpCisgICAgICAgIGZvcm1hdHRpbmdTdGF0ZSgpLnNldEhhc0NsZWFyYW5jZShsYXlvdXRC
b3gpOworICAgIC8vIEZJWE1FOiBSZXNldCB0aGUgbWFyZ2luIHZhbHVlcyBvbiB0aGUgYW5jZXN0
b3JzL3ByZXZpb3VzIHNpYmxpbmdzIG5vdyB0aGF0IHRoZSBmbG9hdCBhdm9pZGVyIHdpdGggY2xl
YXJhbmNlIGRvZXMgbm90IG1hcmdpbiBjb2xsYXBzZSBhbnltb3JlLgorfQorCit2b2lkIEJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVXaWR0aEFuZE1hcmdpbihjb25zdCBGbG9hdGluZ0Nv
bnRleHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0
cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQoreworICAgIGF1dG8gYXZhaWxhYmxlV2lkdGhG
bG9hdEF2b2lkZXIgPSBPcHRpb25hbDxMYXlvdXRVbml0PiB7IH07CisgICAgaWYgKGxheW91dEJv
eC5pc0Zsb2F0QXZvaWRlcigpKSB7CisgICAgICAgIC8vIEZsb2F0IGF2b2lkZXJzJyBhdmFpbGFi
bGUgd2lkdGggbWlnaHQgYmUgc2hydW5rIGJ5IGV4aXN0aW5nIGZsb2F0cyBpbiB0aGUgY29udGV4
dC4KKyAgICAgICAgYXZhaWxhYmxlV2lkdGhGbG9hdEF2b2lkZXIgPSB1c2VkQXZhaWxhYmxlV2lk
dGhGb3JGbG9hdEF2b2lkZXIoZmxvYXRpbmdDb250ZXh0LCBsYXlvdXRCb3gsIGNvbnN0cmFpbnRz
UGFpcik7CisgICAgfQorICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFyZ2luID0gZ2VvbWV0cnko
KS5jb21wdXRlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzUGFp
ci5jb250YWluaW5nQmxvY2suaG9yaXpvbnRhbCwgYXZhaWxhYmxlV2lkdGhGbG9hdEF2b2lkZXIp
OworICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnko
bGF5b3V0Qm94KTsKKyAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudFdp
ZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCk7CisgICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRh
bE1hcmdpbih7IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0LCBjb250ZW50
V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgfSk7Cit9CisKK3ZvaWQgQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6Y29tcHV0ZUhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwg
Y29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKK3sKKyAgICBh
dXRvIGNvbXB1dGUgPSBbJl0oT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZEhlaWdodCkgLT4gQ29u
dGVudEhlaWdodEFuZE1hcmdpbiB7CisgICAgICAgIGlmIChsYXlvdXRCb3guaXNJbkZsb3coKSkK
KyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmluRmxvd0NvbnRlbnRIZWlnaHRBbmRNYXJn
aW4obGF5b3V0Qm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFsLCB7IHVzZWRIZWlnaHQgfSk7CisK
KyAgICAgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKQorICAgICAgICAg
ICAgcmV0dXJuIGdlb21ldHJ5KCkuZmxvYXRpbmdDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGxheW91
dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwgeyB1c2VkSGVpZ2h0IH0pOworCisgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4geyB9OworICAgIH07CisKKyAg
ICBhdXRvIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRlKHsgfSk7CisgICAgaWYgKGF1
dG8gbWF4SGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1heEhlaWdodChsYXlvdXRCb3gpKSB7
CisgICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPiAqbWF4
SGVpZ2h0KSB7CisgICAgICAgICAgICBhdXRvIG1heEhlaWdodEFuZE1hcmdpbiA9IGNvbXB1dGUo
bWF4SGVpZ2h0KTsKKyAgICAgICAgICAgIC8vIFVzZWQgaGVpZ2h0IHNob3VsZCByZW1haW4gdGhl
IHNhbWUuCisgICAgICAgICAgICBBU1NFUlQoKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkg
JiYgKGxheW91dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpKSkg
fHwgbWF4SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPT0gKm1heEhlaWdodCk7CisgICAg
ICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0geyAqbWF4SGVpZ2h0LCBtYXhIZWlnaHRB
bmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBp
ZiAoYXV0byBtaW5IZWlnaHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluSGVpZ2h0KGxheW91dEJv
eCkpIHsKKyAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCA8
ICptaW5IZWlnaHQpIHsKKyAgICAgICAgICAgIGF1dG8gbWluSGVpZ2h0QW5kTWFyZ2luID0gY29t
cHV0ZShtaW5IZWlnaHQpOworICAgICAgICAgICAgLy8gVXNlZCBoZWlnaHQgc2hvdWxkIHJlbWFp
biB0aGUgc2FtZS4KKyAgICAgICAgICAgIEFTU0VSVCgobGF5b3V0U3RhdGUoKS5pblF1aXJrc01v
ZGUoKSAmJiAobGF5b3V0Qm94LmlzQm9keUJveCgpIHx8IGxheW91dEJveC5pc0RvY3VtZW50Qm94
KCkpKSB8fCBtaW5IZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCA9PSAqbWluSGVpZ2h0KTsK
KyAgICAgICAgICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gPSB7ICptaW5IZWlnaHQsIG1pbkhl
aWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW4gfTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIC8vIDEuIENvbXB1dGUgY29sbGFwc2VkIG1hcmdpbnMuCisgICAgLy8gMi4gQWRqdXN0IHZl
cnRpY2FsIHBvc2l0aW9uIHVzaW5nIHRoZSBjb2xsYXBzZWQgdmFsdWVzLgorICAgIC8vIDMuIEFk
anVzdCBwcmV2aW91cyBpbi1mbG93IHNpYmxpbmcgbWFyZ2luIGFmdGVyIHVzaW5nIHRoaXMgbWFy
Z2luLgorICAgIGF1dG8gbWFyZ2luQ29sbGFwc2UgPSB0aGlzLT5tYXJnaW5Db2xsYXBzZSgpOwor
ICAgIGF1dG8gdmVydGljYWxNYXJnaW4gPSBtYXJnaW5Db2xsYXBzZS5jb2xsYXBzZWRWZXJ0aWNh
bFZhbHVlcyhsYXlvdXRCb3gsIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFy
Z2luKTsKKyAgICAvLyBDYWNoZSB0aGUgY29tcHV0ZWQgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1h
cmdpbiB2YWx1ZSBwYWlyLgorICAgIGZvcm1hdHRpbmdTdGF0ZSgpLnNldFVzZWRWZXJ0aWNhbE1h
cmdpbihsYXlvdXRCb3gsIHZlcnRpY2FsTWFyZ2luKTsKKworI2lmIEFTU0VSVF9FTkFCTEVECisg
ICAgaWYgKGhhc1ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGxheW91dEJveCkgJiYgcHJlY29tcHV0
ZWRNYXJnaW5CZWZvcmUobGF5b3V0Qm94KS51c2VkVmFsdWUoKSAhPSBtYXJnaW5CZWZvcmUodmVy
dGljYWxNYXJnaW4pKSB7CisgICAgICAgIC8vIFdoZW4gdGhlIHByZS1jb21wdXRlZCBtYXJnaW4g
dHVybnMgb3V0IHRvIGJlIGluY29ycmVjdCwgd2UgbmVlZCB0byByZS1sYXlvdXQgdGhpcyBzdWJ0
cmVlIHdpdGggdGhlIGNvcnJlY3QgbWFyZ2luIHZhbHVlcy4KKyAgICAgICAgLy8gPGRpdiBzdHls
ZT0iZmxvYXQ6IGxlZnQiPjwvZGl2PgorICAgICAgICAvLyA8ZGl2PgorICAgICAgICAvLyAgIDxk
aXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDIwMHB4Ij48L2Rpdj4KKyAgICAgICAgLy8gPC9kaXY+
CisgICAgICAgIC8vIFRoZSBmbG9hdCBib3ggdHJpZ2dlcnMgbWFyZ2luIGJlZm9yZSBjb21wdXRh
dGlvbiBvbiB0aGUgYW5jZXN0b3IgY2hhaW4gdG8gYmUgYWJsZSB0byBpbnRlcnNlY3Qgd2l0aCBv
dGhlciBmbG9hdHMgaW4gdGhlIHNhbWUgZmxvYXRpbmcgY29udGV4dC4KKyAgICAgICAgLy8gSG93
ZXZlciBpbiBzb21lIGNhc2VzIHRoZSBwYXJlbnQgbWFyZ2luLXRvcCBjb2xsYXBzZXMgd2l0aCBz
b21lIG5leHQgc2libGluZ3MgKG5lcGhld3MpIGFuZCB0aGVyZSdzIG5vIHdheSB0byBiZSBhYmxl
IHRvIHByb3Blcmx5CisgICAgICAgIC8vIGFjY291bnQgZm9yIHRoYXQgd2l0aG91dCBsYXlpbmcg
b3V0IGV2ZXJ5IG5vZGUgaW4gdGhlIEZDIChpbiB0aGUgZXhhbXBsZSwgdGhlIG1hcmdpbi1ib3R0
b20gcHVzaGVzIGRvd24gdGhlIGZsb2F0KS4KKyAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRF
RF9ZRVQoKTsKKyAgICB9CisjZW5kaWYKKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRp
bmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7CisgICAgYm94R2VvbWV0cnkuc2V0Q29u
dGVudEJveEhlaWdodChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpOworICAg
IGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFy
Z2luKSwgbWFyZ2luQWZ0ZXIodmVydGljYWxNYXJnaW4pIH0pOworICAgIC8vIEFkanVzdCB0aGUg
cHJldmlvdXMgc2libGluZydzIG1hcmdpbiBib3R0b20gbm93IHRoYXQgdGhpcyBib3gncyB2ZXJ0
aWNhbCBtYXJnaW4gaXMgY29tcHV0ZWQuCisgICAgTWFyZ2luQ29sbGFwc2U6OnVwZGF0ZU1hcmdp
bkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nKCp0aGlzLCBtYXJnaW5Db2xsYXBzZSwgbGF5b3V0Qm94
KTsKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkK
K3sKKyAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5nU3RhdGUoKTsK
KyAgICBBU1NFUlQoIWZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkp
OworICAgIC8vIFZpc2l0IHRoZSBpbi1mbG93IGRlc2NlbmRhbnRzIGFuZCBjb21wdXRlIHRoZWly
IG1pbi9tYXggaW50cmluc2ljIHdpZHRoIGlmIG5lZWRlZC4KKyAgICAvLyAxLiBHbyBhbGwgdGhl
IHdheSBkb3duIHRvIHRoZSBsZWFmIG5vZGUKKyAgICAvLyAyLiBDaGVjayBpZiBhY3R1YWxseSBu
ZWVkIHRvIHZpc2l0IGFsbCB0aGUgYm94ZXMgYXMgd2UgdHJhdmVyc2UgZG93biAoYWxyZWFkeSBj
b21wdXRlZCwgY29udGFpbmVyJ3MgbWluL21heCBkb2VzIG5vdCBkZXBlbmQgb24gZGVzY2VuZGFu
dHMgZXRjKQorICAgIC8vIDMuIEFzIHdlIGNsaW1iIGJhY2sgb24gdGhlIHRyZWUsIGNvbXB1dGUg
bWluL21heCBpbnRyaW5zaWMgd2lkdGgKKyAgICAvLyAoQW55IHN1YnRyZWVzIHdpdGggbmV3IGZv
cm1hdHRpbmcgY29udGV4dHMgbmVlZCB0byBsYXlvdXQgc3luY2hyb25vdXNseSkKKyAgICBWZWN0
b3I8Y29uc3QgQm94Kj4gcXVldWU7CisgICAgaWYgKHJvb3QoKS5oYXNJbkZsb3dPckZsb2F0aW5n
Q2hpbGQoKSkKKyAgICAgICAgcXVldWUuYXBwZW5kKHJvb3QoKS5maXJzdEluRmxvd09yRmxvYXRp
bmdDaGlsZCgpKTsKKworICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29uc3RyYWludHM7
CisgICAgYXV0byBtYXhpbXVtSG9yaXpvbnRhbFN0YWNraW5nV2lkdGggPSBMYXlvdXRVbml0IHsg
fTsKKyAgICBhdXRvIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IExheW91dFVuaXQg
eyB9OworICAgIHdoaWxlICghcXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIHdoaWxlICh0cnVl
KSB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBkZXNjZW5k
YW50IGNvbnRlbnQuCisgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSAqcXVldWUubGFzdCgp
OworICAgICAgICAgICAgLy8gRmxvYXQgYXZvaWRlcnMgYXJlIGFsbCBlc3RhYmxpc2ggYSBuZXcg
Zm9ybWF0dGluZyBjb250ZXh0LiBObyBuZWVkIHRvIGxvb2sgaW5zaWRlIHRoZW0uCisgICAgICAg
ICAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkgJiYgIWxheW91dEJveC5oYXNGbG9h
dENsZWFyKCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBOb24tZmxv
YXRpbmcgYmxvY2sgbGV2ZWwgYm94ZXMgcmVzZXQgdGhlIGN1cnJlbnQgaG9yaXpvbnRhbCBmbG9h
dCBzdGFja2luZy4KKyAgICAgICAgICAgIC8vIFNQRUM6IFRoaXMgaXMgYSBiaXQgb2RkIGFzIGZs
b2F0aW5nIHBvc2l0aW9uaW5nIGlzIGEgZm9ybWF0dGluZyBjb250ZXh0IGxldmVsIGNvbmNlcHQ6
CisgICAgICAgICAgICAvLyBlLmcuCisgICAgICAgICAgICAvLyA8ZGl2IHN0eWxlPSJmbG9hdDog
bGVmdDsgd2lkdGg6IDEwcHg7Ij48L2Rpdj4KKyAgICAgICAgICAgIC8vIDxkaXY+PC9kaXY+Cisg
ICAgICAgICAgICAvLyA8ZGl2IHN0eWxlPSJmbG9hdDogbGVmdDsgd2lkdGg6IDQwcHg7Ij48L2Rp
dj4KKyAgICAgICAgICAgIC8vIC4uLndpbGwgcHJvZHVjZSBhIG1heCB3aWR0aCBvZiA0MHB4IHdo
aWNoIG1ha2VzIHRoZSBmbG9hdHMgdmVydGljYWxseSBzdGFja2VkLgorICAgICAgICAgICAgLy8g
VmVydGljYWxseSBzdGFja2VkIGZsb2F0cyBtYWtlcyBtZSB0aGluayB3ZSBoYXZlbid0IG1hbmFn
ZWQgdG8gcHJvdmlkZSB0aGUgbWF4aW11bSBwcmVmZXJyZWQgd2lkdGggZm9yIHRoZSBjb250ZW50
LgorICAgICAgICAgICAgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoID0gc3RkOjptYXgo
Y3VycmVudEhvcml6b250YWxTdGFja2luZ1dpZHRoLCBtYXhpbXVtSG9yaXpvbnRhbFN0YWNraW5n
V2lkdGgpOworICAgICAgICAgICAgY3VycmVudEhvcml6b250YWxTdGFja2luZ1dpZHRoID0geyB9
OworICAgICAgICAgICAgLy8gQWxyZWFkeSBoYXMgY29tcHV0ZWQgaW50cmluc2ljIGNvbnN0cmFp
bnRzLgorICAgICAgICAgICAgaWYgKGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzRm9yQm94KGxheW91dEJveCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAvLyBCb3ggd2l0aCBmaXhlZCB3aWR0aCBkZWZpbmVzIHRoZWlyIGRlc2NlbmRhbnQgY29u
dGVudCBpbnRyaW5zaWMgd2lkdGguCisgICAgICAgICAgICBpZiAobGF5b3V0Qm94LnN0eWxlKCku
d2lkdGgoKS5pc0ZpeGVkKCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAv
LyBOb24tZmxvYXQgYXZvaWRlciBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdHMgYXJlIG9wYXF1ZSB0
byBpbnRyaW5zaWMgd2lkdGggY29tcHV0YXRpb24uCisgICAgICAgICAgICBpZiAobGF5b3V0Qm94
LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIC8vIE5vIHJlbGV2YW50IGNoaWxkIGNvbnRlbnQuCisgICAgICAgICAgICBp
ZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSB8fCAhZG93bmNhc3Q8Q29udGFpbmVyQm94
PihsYXlvdXRCb3gpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQorICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgcXVldWUuYXBwZW5kKGRvd25jYXN0PENvbnRhaW5lckJveD4o
bGF5b3V0Qm94KS5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpKTsKKyAgICAgICAgfQorICAg
ICAgICAvLyBDb21wdXRlIG1pbi9tYXggaW50cmluc2ljIHdpZHRoIGJvdHRvbSB1cCBpZiBuZWVk
ZWQuCisgICAgICAgIHdoaWxlICghcXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhdXRv
JiBsYXlvdXRCb3ggPSAqcXVldWUudGFrZUxhc3QoKTsKKyAgICAgICAgICAgIGF1dG8gZGVzZGVu
ZGFudENvbnN0cmFpbnRzID0gZm9ybWF0dGluZ1N0YXRlLmludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHNGb3JCb3gobGF5b3V0Qm94KTsKKyAgICAgICAgICAgIGlmICghZGVzZGVuZGFudENvbnN0cmFp
bnRzKSB7CisgICAgICAgICAgICAgICAgZGVzZGVuZGFudENvbnN0cmFpbnRzID0gZ2VvbWV0cnko
KS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGxheW91dEJveCk7CisgICAgICAgICAgICAgICAg
Zm9ybWF0dGluZ1N0YXRlLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3gobGF5b3V0
Qm94LCAqZGVzZGVuZGFudENvbnN0cmFpbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGNvbnN0cmFpbnRzLm1pbmltdW0gPSBzdGQ6Om1heChjb25zdHJhaW50cy5taW5pbXVtLCBkZXNk
ZW5kYW50Q29uc3RyYWludHMtPm1pbmltdW0pOworICAgICAgICAgICAgYXV0byB3aWxsU3RhY2tI
b3Jpem9udGFsbHkgPSBsYXlvdXRCb3guaXNGbG9hdEF2b2lkZXIoKSAmJiAhbGF5b3V0Qm94Lmhh
c0Zsb2F0Q2xlYXIoKTsKKyAgICAgICAgICAgIGlmICh3aWxsU3RhY2tIb3Jpem9udGFsbHkpCisg
ICAgICAgICAgICAgICAgY3VycmVudEhvcml6b250YWxTdGFja2luZ1dpZHRoICs9IGRlc2RlbmRh
bnRDb25zdHJhaW50cy0+bWF4aW11bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICBjb25zdHJhaW50cy5tYXhpbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMubWF4aW11bSwgZGVz
ZGVuZGFudENvbnN0cmFpbnRzLT5tYXhpbXVtKTsKKyAgICAgICAgICAgIC8vIE1vdmUgb3ZlciB0
byB0aGUgbmV4dCBzaWJsaW5nIG9yIHRha2UgdGhlIG5leHQgYm94IGluIHRoZSBxdWV1ZS4KKyAg
ICAgICAgICAgIGlmIChhdXRvKiBuZXh0U2libGluZyA9IGxheW91dEJveC5uZXh0SW5GbG93T3JG
bG9hdGluZ1NpYmxpbmcoKSkgeworICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChuZXh0U2li
bGluZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICB9CisgICAgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoID0gc3RkOjptYXgoY3Vy
cmVudEhvcml6b250YWxTdGFja2luZ1dpZHRoLCBtYXhpbXVtSG9yaXpvbnRhbFN0YWNraW5nV2lk
dGgpOworICAgIGNvbnN0cmFpbnRzLm1heGltdW0gPSBzdGQ6Om1heChjb25zdHJhaW50cy5tYXhp
bXVtLCBtYXhpbXVtSG9yaXpvbnRhbFN0YWNraW5nV2lkdGgpOworICAgIGZvcm1hdHRpbmdTdGF0
ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKTsKKyAgICByZXR1cm4g
Y29uc3RyYWludHM7Cit9CisKK0xheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6dmVy
dGljYWxQb3NpdGlvbldpdGhNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IFVzZWRW
ZXJ0aWNhbE1hcmdpbiYgdmVydGljYWxNYXJnaW4sICBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRz
JiB2ZXJ0aWNhbENvbnN0cmFpbnRzKSBjb25zdAoreworICAgIEFTU0VSVCghbGF5b3V0Qm94Lmlz
T3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKKyAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBjb21wdXRlZCB0
aGUgZmluYWwgbWFyZ2luIGJlZm9yZSwgbGV0J3Mgc2hpZnQgdGhlIGJveCdzIHZlcnRpY2FsIHBv
c2l0aW9uIGlmIG5lZWRlZC4KKyAgICAvLyAxLiBDaGVjayBpZiB0aGUgYm94IGhhcyBjbGVhcmFu
Y2UuIElmIHNvLCB3ZSd2ZSBhbHJlYWR5IHByZWNvbXB1dGVkL2ZpbmFsaXplZCB0aGUgdG9wIHZh
bHVlIGFuZCB2ZXJ0aWNhbCBtYXJnaW4gZG9lcyBub3QgaW1wYWN0IGl0IGFueW1vcmUuCisgICAg
Ly8gMi4gQ2hlY2sgaWYgdGhlIG1hcmdpbiBiZWZvcmUgY29sbGFwc2VzIHdpdGggdGhlIHByZXZp
b3VzIGJveCdzIG1hcmdpbiBhZnRlci4gaWYgbm90IC0+IHJldHVybiBwcmV2aW91cyBib3gncyBi
b3R0b20gaW5jbHVkaW5nIG1hcmdpbiBhZnRlciArIG1hcmdpbkJlZm9yZQorICAgIC8vIDMuIENo
ZWNrIGlmIHRoZSBwcmV2aW91cyBib3gncyBtYXJnaW5zIGNvbGxhcHNlIHRocm91Z2guIElmIG5v
dCAtPiByZXR1cm4gcHJldmlvdXMgYm94JyBib3R0b20gZXhjbHVkaW5nIG1hcmdpbiBhZnRlciAr
IG1hcmdpbkJlZm9yZSAodGhleSBhcmUgc3VwcG9zZWQgdG8gYmUgZXF1YWwpCisgICAgLy8gNC4g
R28gdG8gcHJldmlvdXMgYm94IGFuZCBzdGFydCBmcm9tIHN0ZXAgIzEgdW50aWwgd2UgaGl0IHRo
ZSBwYXJlbnQgYm94LgorICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZ2VvbWV0cnlGb3JCb3gobGF5
b3V0Qm94KTsKKyAgICBpZiAoZm9ybWF0dGluZ1N0YXRlKCkuaGFzQ2xlYXJhbmNlKGxheW91dEJv
eCkpCisgICAgICAgIHJldHVybiBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94VG9wKGJveEdlb21ldHJ5
KTsKKworICAgIGF1dG8qIGN1cnJlbnRMYXlvdXRCb3ggPSAmbGF5b3V0Qm94OworICAgIHdoaWxl
IChjdXJyZW50TGF5b3V0Qm94KSB7CisgICAgICAgIGlmICghY3VycmVudExheW91dEJveC0+cHJl
dmlvdXNJbkZsb3dTaWJsaW5nKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYXV0byYg
cHJldmlvdXNJbkZsb3dTaWJsaW5nID0gKmN1cnJlbnRMYXlvdXRCb3gtPnByZXZpb3VzSW5GbG93
U2libGluZygpOworICAgICAgICBpZiAoIW1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29s
bGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKCpjdXJyZW50TGF5b3V0Qm94KSkg
eworICAgICAgICAgICAgYXV0byYgcHJldmlvdXNCb3hHZW9tZXRyeSA9IGdlb21ldHJ5Rm9yQm94
KHByZXZpb3VzSW5GbG93U2libGluZyk7CisgICAgICAgICAgICByZXR1cm4gQm94R2VvbWV0cnk6
Om1hcmdpbkJveFJlY3QocHJldmlvdXNCb3hHZW9tZXRyeSkuYm90dG9tKCkgKyBtYXJnaW5CZWZv
cmUodmVydGljYWxNYXJnaW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtYXJnaW5Db2xs
YXBzZSgpLm1hcmdpbnNDb2xsYXBzZVRocm91Z2gocHJldmlvdXNJbkZsb3dTaWJsaW5nKSkgewor
ICAgICAgICAgICAgYXV0byYgcHJldmlvdXNCb3hHZW9tZXRyeSA9IGdlb21ldHJ5Rm9yQm94KHBy
ZXZpb3VzSW5GbG93U2libGluZyk7CisgICAgICAgICAgICByZXR1cm4gQm94R2VvbWV0cnk6OmJv
cmRlckJveFJlY3QocHJldmlvdXNCb3hHZW9tZXRyeSkuYm90dG9tKCkgKyBtYXJnaW5CZWZvcmUo
dmVydGljYWxNYXJnaW4pOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnRMYXlvdXRCb3ggPSAm
cHJldmlvdXNJbkZsb3dTaWJsaW5nOworICAgIH0KKworICAgIGF1dG8gY29udGFpbmluZ0Jsb2Nr
Q29udGVudEJveFRvcCA9IHZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbFRvcDsKKyAgICAvLyBB
ZGp1c3QgdmVydGljYWwgcG9zaXRpb24gZGVwZW5kaW5nIHdoZXRoZXIgdGhpcyBib3ggZGlyZWN0
bHkgb3IgaW5kaXJlY3RseSBhZGpvaW5zIHdpdGggaXRzIHBhcmVudC4KKyAgICBhdXRvIGRpcmVj
dGx5QWRqb2luc1BhcmVudCA9ICFsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7Cisg
ICAgaWYgKGRpcmVjdGx5QWRqb2luc1BhcmVudCkgeworICAgICAgICAvLyBJZiB0aGUgdG9wIGFu
ZCBib3R0b20gbWFyZ2lucyBvZiBhIGJveCBhcmUgYWRqb2luaW5nLCB0aGVuIGl0IGlzIHBvc3Np
YmxlIGZvciBtYXJnaW5zIHRvIGNvbGxhcHNlIHRocm91Z2ggaXQuCisgICAgICAgIC8vIEluIHRo
aXMgY2FzZSwgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGRlcGVuZHMgb24gaXRzIHJlbGF0
aW9uc2hpcCB3aXRoIHRoZSBvdGhlciBlbGVtZW50cyB3aG9zZSBtYXJnaW5zIGFyZSBiZWluZyBj
b2xsYXBzZWQuCisgICAgICAgIGlmICh2ZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1ZXMuaXND
b2xsYXBzZWRUaHJvdWdoKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCdzIG1hcmdp
bnMgYXJlIGNvbGxhcHNlZCB3aXRoIGl0cyBwYXJlbnQncyB0b3AgbWFyZ2luLCB0aGUgdG9wIGJv
cmRlciBlZGdlIG9mIHRoZSBib3ggaXMgZGVmaW5lZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgcGFy
ZW50J3MuCisgICAgICAgICAgICBpZiAobWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5CZWZvcmVDb2xs
YXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxheW91dEJveCkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3A7CisgICAgICAgICAgICAvLyBPdGhl
cndpc2UsIGVpdGhlciB0aGUgZWxlbWVudCdzIHBhcmVudCBpcyBub3QgdGFraW5nIHBhcnQgaW4g
dGhlIG1hcmdpbiBjb2xsYXBzaW5nLCBvciBvbmx5IHRoZSBwYXJlbnQncyBib3R0b20gbWFyZ2lu
IGlzIGludm9sdmVkLgorICAgICAgICAgICAgLy8gVGhlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50
J3MgdG9wIGJvcmRlciBlZGdlIGlzIHRoZSBzYW1lIGFzIGl0IHdvdWxkIGhhdmUgYmVlbiBpZiB0
aGUgZWxlbWVudCBoYWQgYSBub24temVybyBib3R0b20gYm9yZGVyLgorICAgICAgICAgICAgYXV0
byBiZWZvcmVNYXJnaW5XaXRoQm90dG9tQm9yZGVyID0gbWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5C
ZWZvcmVJZ25vcmluZ0NvbGxhcHNpbmdUaHJvdWdoKGxheW91dEJveCwgdmVydGljYWxNYXJnaW4u
bm9uQ29sbGFwc2VkVmFsdWVzKTsKKyAgICAgICAgICAgIHJldHVybiBjb250YWluaW5nQmxvY2tD
b250ZW50Qm94VG9wICsgYmVmb3JlTWFyZ2luV2l0aEJvdHRvbUJvcmRlcjsKKyAgICAgICAgfQor
ICAgICAgICAvLyBOb24tY29sbGFwc2VkIHRocm91Z2ggYm94IHZlcnRpY2FsIHBvc2l0aW9uIGRl
cGVuZGluZyB3aGV0aGVyIHRoZSBtYXJnaW4gY29sbGFwc2VzLgorICAgICAgICBpZiAobWFyZ2lu
Q29sbGFwc2UoKS5tYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxh
eW91dEJveCkpCisgICAgICAgICAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrQ29udGVudEJveFRv
cDsKKworICAgICAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrQ29udGVudEJveFRvcCArIG1hcmdp
bkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbik7CisgICAgfQorICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhp
cyBib3ggaW5kaXJlY3RseSAodmlhIGNvbGxhcHNlZCB0aHJvdWdoIHByZXZpb3VzIGluLWZsb3cg
c2libGluZ3MpIGFkam9pbnMgdGhlIHBhcmVudC4gTGV0J3MgY2hlY2sgaWYgaXQgbWFyZ2luIGNv
bGxhcHNlcyB3aXRoIHRoZSBwYXJlbnQuCisgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gbGF5
b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOworICAgIEFTU0VSVChjb250YWluaW5nQmxvY2suZmly
c3RJbkZsb3dDaGlsZCgpKTsKKyAgICBBU1NFUlQoY29udGFpbmluZ0Jsb2NrLmZpcnN0SW5GbG93
Q2hpbGQoKSAhPSAmbGF5b3V0Qm94KTsKKyAgICBpZiAobWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5C
ZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKCpjb250YWluaW5nQmxvY2suZmly
c3RJbkZsb3dDaGlsZCgpKSkKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRC
b3hUb3A7CisKKyAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrQ29udGVudEJveFRvcCArIG1hcmdp
bkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbik7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGlu
Zy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uNjNkOTk2OTNlODdjZDBiMGYxMzJlYWM3MTM2OTBlMGI3MDUyZTEyOQotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxv
Y2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuaApAQCAtMCwwICsxLDE5OCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5H
X0NPTlRFWFQpCisKKyNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUg
IkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRl
IDx3dGYvSXNvTWFsbG9jLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5b3V0
VW5pdDsKKworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIEJveDsKK2NsYXNzIEZsb2F0aW5n
Q29udGV4dDsKKworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBsYXlvdXQgbG9naWMgZm9y
IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMuCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvQ1NT
MjIvdmlzdXJlbi5odG1sI2Jsb2NrLWZvcm1hdHRpbmcKK2NsYXNzIEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQgeworICAgIFdURl9NQUtFX0lTT19BTExP
Q0FURUQoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCk7CitwdWJsaWM6CisgICAgQmxvY2tGb3JtYXR0
aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgQmxv
Y2tGb3JtYXR0aW5nU3RhdGUmKTsKKworICAgIHZvaWQgbGF5b3V0SW5GbG93Q29udGVudChJbnZh
bGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpIG92ZXJy
aWRlOworICAgIExheW91dFVuaXQgdXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdCBvdmVycmlkZTsK
KworcHJvdGVjdGVkOgorICAgIHN0cnVjdCBDb25zdHJhaW50c1BhaXIgeworICAgICAgICBDb25z
dHJhaW50c0ZvckluRmxvd0NvbnRlbnQgZm9ybWF0dGluZ0NvbnRleHRSb290OworICAgICAgICBD
b25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQgY29udGFpbmluZ0Jsb2NrOworICAgIH07CisgICAg
dm9pZCBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihjb25zdCBDb250YWluZXJCb3gmLCBj
b25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmKTsKKworICAgIHZvaWQgY29tcHV0ZVdpZHRoQW5k
TWFyZ2luKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0IEJveCYsIGNvbnN0IENvbnN0cmFp
bnRzUGFpciYpOworICAgIHZvaWQgY29tcHV0ZUhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmLCBj
b25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsKKworICAgIHZvaWQgY29tcHV0ZVN0
YXRpY0hvcml6b250YWxQb3NpdGlvbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmKTsKKyAgICB2b2lkIGNvbXB1dGVTdGF0aWNWZXJ0aWNhbFBvc2l0aW9uKGNvbnN0IEJv
eCYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmKTsKKyAgICB2b2lkIGNvbXB1dGVQb3NpdGlv
blRvQXZvaWRGbG9hdHMoY29uc3QgRmxvYXRpbmdDb250ZXh0JiwgY29uc3QgQm94JiwgY29uc3Qg
Q29uc3RyYWludHNQYWlyJik7CisgICAgdm9pZCBjb21wdXRlVmVydGljYWxQb3NpdGlvbkZvckZs
b2F0Q2xlYXIoY29uc3QgRmxvYXRpbmdDb250ZXh0JiwgY29uc3QgQm94Jik7CisKKyAgICB2b2lk
IHByZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGNvbnN0IEJveCYs
IGNvbnN0IENvbnN0cmFpbnRzUGFpciYpOworCisgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cyBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSBvdmVycmlkZTsKKworICAgIExh
eW91dFVuaXQgdmVydGljYWxQb3NpdGlvbldpdGhNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgVXNl
ZFZlcnRpY2FsTWFyZ2luJiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYpIGNvbnN0OworCisg
ICAgLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcgZm9yIGJv
eGVzIHBhcnRpY2lwYXRpbmcgaW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQuCisgICAgY2xh
c3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKKyAgICBw
dWJsaWM6CisgICAgICAgIEdlb21ldHJ5KGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsK
KworICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGluRmxvd0NvbnRlbnRIZWlnaHRBbmRN
YXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3Zl
cnJpZGRlblZlcnRpY2FsVmFsdWVzJik7CisgICAgICAgIENvbnRlbnRXaWR0aEFuZE1hcmdpbiBp
bkZsb3dDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKworICAgICAg
ICBQb2ludCBzdGF0aWNQb3NpdGlvbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJikgY29uc3Q7CisgICAgICAgIExheW91
dFVuaXQgc3RhdGljVmVydGljYWxQb3NpdGlvbihjb25zdCBCb3gmLCBjb25zdCBWZXJ0aWNhbENv
bnN0cmFpbnRzJikgY29uc3Q7CisgICAgICAgIExheW91dFVuaXQgc3RhdGljSG9yaXpvbnRhbFBv
c2l0aW9uKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpIGNvbnN0Owor
CisgICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2ljV2lkdGhDb25zdHJh
aW50cyhjb25zdCBCb3gmKTsKKworICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gY29tcHV0
ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0
cmFpbnRzJiwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlV2lkdGhGbG9hdEF2b2lkZXIp
OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBpbkZsb3dO
b25SZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJik7CisgICAg
ICAgIENvbnRlbnRXaWR0aEFuZE1hcmdpbiBpbkZsb3dOb25SZXBsYWNlZENvbnRlbnRXaWR0aEFu
ZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBP
dmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYpOworICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJn
aW4gaW5GbG93UmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gm
LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRh
bFZhbHVlcyYpOworCisgICAgICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1h
dHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8QmxvY2tGb3JtYXR0aW5nQ29u
dGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpmb3JtYXR0aW5nQ29udGV4dCgpKTsg
fQorICAgIH07CisgICAgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnko
KSBjb25zdCB7IHJldHVybiBHZW9tZXRyeSgqdGhpcyk7IH0KKworICAgIC8vIFRoaXMgY2xhc3Mg
aW1wbGVtZW50cyBtYXJnaW4gY29sbGFwc2luZyBmb3IgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0
LgorICAgIGNsYXNzIE1hcmdpbkNvbGxhcHNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFVzZWRW
ZXJ0aWNhbE1hcmdpbiBjb2xsYXBzZWRWZXJ0aWNhbFZhbHVlcyhjb25zdCBCb3gmLCBVc2VkVmVy
dGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyk7CisKKyAgICAgICAgUHJlY29tcHV0ZWRN
YXJnaW5CZWZvcmUgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoY29uc3QgQm94JiwgVXNlZFZlcnRp
Y2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpOworICAgICAgICBMYXlvdXRVbml0IG1hcmdp
bkJlZm9yZUlnbm9yaW5nQ29sbGFwc2luZ1Rocm91Z2goY29uc3QgQm94JiwgVXNlZFZlcnRpY2Fs
TWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpOworICAgICAgICBzdGF0aWMgdm9pZCB1cGRhdGVN
YXJnaW5BZnRlckZvclByZXZpb3VzU2libGluZyhCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiwgY29u
c3QgTWFyZ2luQ29sbGFwc2UmLCBjb25zdCBCb3gmKTsKKworICAgICAgICBib29sIG1hcmdpbkJl
Zm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUoY29uc3QgQm94JikgY29uc3Q7Cisg
ICAgICAgIGJvb2wgbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJn
aW5CZWZvcmUoY29uc3QgQm94JikgY29uc3Q7CisgICAgICAgIGJvb2wgbWFyZ2luQmVmb3JlQ29s
bGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKGNvbnN0IEJveCYpIGNvbnN0OworICAgICAgICBi
b29sIG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcihj
b25zdCBCb3gmKSBjb25zdDsKKworICAgICAgICBib29sIG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0
aFBhcmVudE1hcmdpbkFmdGVyKGNvbnN0IEJveCYpIGNvbnN0OworICAgICAgICBib29sIG1hcmdp
bkFmdGVyQ29sbGFwc2VzV2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFmdGVyKGNvbnN0IEJveCYp
IGNvbnN0OworICAgICAgICBib29sIG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdp
bkJlZm9yZShjb25zdCBCb3gmKSBjb25zdDsKKyAgICAgICAgYm9vbCBtYXJnaW5BZnRlckNvbGxh
cHNlc1dpdGhOZXh0U2libGluZ01hcmdpbkJlZm9yZShjb25zdCBCb3gmKSBjb25zdDsKKyAgICAg
ICAgYm9vbCBtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhTaWJsaW5nTWFyZ2luQmVmb3JlV2l0aENs
ZWFyYW5jZShjb25zdCBCb3gmKSBjb25zdDsKKworICAgICAgICBib29sIG1hcmdpbnNDb2xsYXBz
ZVRocm91Z2goY29uc3QgQm94JikgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmll
bmQgY2xhc3MgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDsKKyAgICAgICAgTWFyZ2luQ29sbGFwc2Uo
Y29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYpOworCisgICAgICAgIGVudW0gY2xhc3MgTWFy
Z2luVHlwZSB7IEJlZm9yZSwgQWZ0ZXIgfTsKKyAgICAgICAgVXNlZFZlcnRpY2FsTWFyZ2luOjpQ
b3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMoY29u
c3QgQm94JiwgTWFyZ2luVHlwZSkgY29uc3Q7CisgICAgICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6
UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBwb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVm
b3JlKGNvbnN0IEJveCYsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKSBj
b25zdDsKKyAgICAgICAgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFp
cjo6VmFsdWVzIHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5BZnRlcihjb25zdCBCb3gmLCBVc2VkVmVy
dGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcykgY29uc3Q7CisKKyAgICAgICAgVXNlZFZl
cnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHByZWNvbXB1dGVk
UG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShjb25zdCBCb3gmLCBVc2VkVmVydGljYWxNYXJn
aW46Ok5vbkNvbGxhcHNlZFZhbHVlcykgY29uc3Q7CisgICAgICAgIFVzZWRWZXJ0aWNhbE1hcmdp
bjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBwcmVjb21wdXRlZFBvc2l0aXZlTmVn
YXRpdmVWYWx1ZXMoY29uc3QgQm94JikgY29uc3Q7CisKKyAgICAgICAgVXNlZFZlcnRpY2FsTWFy
Z2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIGNvbXB1dGVkUG9zaXRpdmVBbmRO
ZWdhdGl2ZU1hcmdpbihVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWly
OjpWYWx1ZXMsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZh
bHVlcykgY29uc3Q7CisgICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IG1hcmdpblZhbHVlKFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcykgY29uc3Q7
CisKKyAgICAgICAgYm9vbCBoYXNDbGVhcmFuY2UoY29uc3QgQm94JikgY29uc3Q7CisKKyAgICAg
ICAgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgeyByZXR1cm4gbV9ibG9ja0Zvcm1hdHRpbmdD
b250ZXh0LmxheW91dFN0YXRlKCk7IH0KKyAgICAgICAgY29uc3QgTGF5b3V0U3RhdGUmIGxheW91
dFN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja0Zvcm1hdHRpbmdDb250ZXh0LmxheW91dFN0
YXRlKCk7IH0KKyAgICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGlu
Z0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2Jsb2NrRm9ybWF0dGluZ0NvbnRleHQ7IH0KKwor
ICAgICAgICBjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBtX2Jsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ7CisgICAgfTsKKyAgICBNYXJnaW5Db2xsYXBzZSBtYXJnaW5Db2xsYXBzZSgpIGNvbnN0
IHsgcmV0dXJuIE1hcmdpbkNvbGxhcHNlKCp0aGlzKTsgfQorCisgICAgY2xhc3MgUXVpcmtzIDog
cHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgeworICAgIHB1YmxpYzoKKyAgICAgICAg
UXVpcmtzKGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsKKworICAgICAgICBib29sIG5l
ZWRzU3RyZXRjaGluZyhjb25zdCBCb3gmKSBjb25zdDsKKyAgICAgICAgTGF5b3V0VW5pdCBzdHJl
dGNoZWRJbkZsb3dIZWlnaHQoY29uc3QgQm94JiwgQ29udGVudEhlaWdodEFuZE1hcmdpbik7CisK
KyAgICAgICAgYm9vbCBzaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihjb25zdCBCb3gm
KSBjb25zdDsKKyAgICAgICAgYm9vbCBzaG91bGRDb2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhQYXJl
bnRNYXJnaW5CZWZvcmUoY29uc3QgQm94JikgY29uc3Q7CisgICAgICAgIGJvb2wgc2hvdWxkQ29s
bGFwc2VNYXJnaW5BZnRlcldpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmKSBjb25zdDsK
KworICAgICAgICBjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4
dCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1h
dHRpbmdDb250ZXh0OjpRdWlya3M6OmZvcm1hdHRpbmdDb250ZXh0KCkpOyB9CisgICAgICAgIEJs
b2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4g
Zm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeSgpOyB9CisKKyAgICB9OworICAgIEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRo
aXMpOyB9CisKKyAgICBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkQXZhaWxhYmxlV2lkdGhGb3JG
bG9hdEF2b2lkZXIoY29uc3QgRmxvYXRpbmdDb250ZXh0JiwgY29uc3QgQm94JiwgY29uc3QgQ29u
c3RyYWludHNQYWlyJik7CisKKyAgICBjb25zdCBCbG9ja0Zvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0
dGluZ1N0YXRlKCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8QmxvY2tGb3JtYXR0aW5nU3RhdGU+
KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KKyAgICBCbG9ja0Zvcm1h
dHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKCkgeyByZXR1cm4gZG93bmNhc3Q8QmxvY2tGb3Jt
YXR0aW5nU3RhdGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KKwor
I2lmIEFTU0VSVF9FTkFCTEVECisgICAgdm9pZCBzZXRQcmVjb21wdXRlZE1hcmdpbkJlZm9yZShj
b25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgUHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUmIHByZWNv
bXB1dGVkTWFyZ2luQmVmb3JlKSB7IG1fcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmVMaXN0LnNldCgm
bGF5b3V0Qm94LCBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZSk7IH0KKyAgICBQcmVjb21wdXRlZE1h
cmdpbkJlZm9yZSBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCkg
Y29uc3QgeyByZXR1cm4gbV9wcmVjb21wdXRlZE1hcmdpbkJlZm9yZUxpc3QuZ2V0KCZsYXlvdXRC
b3gpOyB9CisgICAgYm9vbCBoYXNQcmVjb21wdXRlZE1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxh
eW91dEJveCkgY29uc3QgeyByZXR1cm4gbV9wcmVjb21wdXRlZE1hcmdpbkJlZm9yZUxpc3QuY29u
dGFpbnMoJmxheW91dEJveCk7IH0KKyNlbmRpZgorcHJpdmF0ZToKKyAgICBIYXNoTWFwPGNvbnN0
IEJveCosIFByZWNvbXB1dGVkTWFyZ2luQmVmb3JlPiBtX3ByZWNvbXB1dGVkTWFyZ2luQmVmb3Jl
TGlzdDsKK307CisKK2lubGluZSBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6R2Vv
bWV0cnkoY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgYmxvY2tGb3JtYXR0aW5nQ29udGV4
dCkKKyAgICA6IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeShibG9ja0Zvcm1hdHRpbmdDb250
ZXh0KQoreworfQorCitpbmxpbmUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpRdWly
a3MoY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgYmxvY2tGb3JtYXR0aW5nQ29udGV4dCkK
KyAgICA6IEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MoYmxvY2tGb3JtYXR0aW5nQ29udGV4dCkK
K3sKK30KKworaW5saW5lIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjpN
YXJnaW5Db2xsYXBzZShjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBibG9ja0Zvcm1hdHRp
bmdDb250ZXh0KQorICAgIDogbV9ibG9ja0Zvcm1hdHRpbmdDb250ZXh0KGJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQpCit7Cit9CisKK30KK30KKworU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19MQVlPVVRf
Rk9STUFUVElOR19DT05URVhUKEJsb2NrRm9ybWF0dGluZ0NvbnRleHQsIGlzQmxvY2tGb3JtYXR0
aW5nQ29udGV4dCgpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRl
eHRHZW9tZXRyeS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjBhMWEyYjQxNmM2N2RlNWYyNDVkNTJjMTVkYjYzNDM1OGRjY2I1YjEKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2Nr
Zm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCkBAIC0wLDAgKzEs
NDAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgor
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJGb3Jt
YXR0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgorI2lu
Y2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVkZSAiTGF5b3V0Q2hpbGRJdGVyYXRv
ci5oIgorI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKKyNpbmNsdWRlICJMYXlvdXRJbml0aWFs
Q29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiTGF5b3V0UmVwbGFjZWRCb3guaCIKKyNpbmNs
dWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvVGV4dFN0cmVhbS5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworQ29udGVudEhlaWdodEFuZE1h
cmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93Tm9uUmVwbGFjZWRD
b250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZl
cnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGxh
eW91dEJveC5pc0luRmxvdygpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKKyAgICBB
U1NFUlQobGF5b3V0Qm94LmlzT3ZlcmZsb3dWaXNpYmxlKCkpOworCisgICAgYXV0byBjb21wdXRl
ID0gWyZdKGNvbnN0IGF1dG8mIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgLT4gQ29udGVudEhl
aWdodEFuZE1hcmdpbiB7CisKKyAgICAgICAgLy8gMTAuNi4zIEJsb2NrLWxldmVsIG5vbi1yZXBs
YWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdyB3aGVuICdvdmVyZmxvdycgY29tcHV0ZXMgdG8g
J3Zpc2libGUnCisgICAgICAgIC8vCisgICAgICAgIC8vIElmICdtYXJnaW4tdG9wJywgb3IgJ21h
cmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHRoZWlyIHVzZWQgdmFsdWUgaXMgMC4KKyAgICAgICAg
Ly8gSWYgJ2hlaWdodCcgaXMgJ2F1dG8nLCB0aGUgaGVpZ2h0IGRlcGVuZHMgb24gd2hldGhlciB0
aGUgZWxlbWVudCBoYXMgYW55IGJsb2NrLWxldmVsIGNoaWxkcmVuIGFuZCB3aGV0aGVyIGl0IGhh
cyBwYWRkaW5nIG9yIGJvcmRlcnM6CisgICAgICAgIC8vIFRoZSBlbGVtZW50J3MgaGVpZ2h0IGlz
IHRoZSBkaXN0YW5jZSBmcm9tIGl0cyB0b3AgY29udGVudCBlZGdlIHRvIHRoZSBmaXJzdCBhcHBs
aWNhYmxlIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgIC8vIDEuIHRoZSBib3R0b20gZWRnZSBv
ZiB0aGUgbGFzdCBsaW5lIGJveCwgaWYgdGhlIGJveCBlc3RhYmxpc2hlcyBhIGlubGluZSBmb3Jt
YXR0aW5nIGNvbnRleHQgd2l0aCBvbmUgb3IgbW9yZSBsaW5lcworICAgICAgICAvLyAyLiB0aGUg
Ym90dG9tIGVkZ2Ugb2YgdGhlIGJvdHRvbSAocG9zc2libHkgY29sbGFwc2VkKSBtYXJnaW4gb2Yg
aXRzIGxhc3QgaW4tZmxvdyBjaGlsZCwgaWYgdGhlIGNoaWxkJ3MgYm90dG9tIG1hcmdpbgorICAg
ICAgICAvLyAgICBkb2VzIG5vdCBjb2xsYXBzZSB3aXRoIHRoZSBlbGVtZW50J3MgYm90dG9tIG1h
cmdpbgorICAgICAgICAvLyAzLiB0aGUgYm90dG9tIGJvcmRlciBlZGdlIG9mIHRoZSBsYXN0IGlu
LWZsb3cgY2hpbGQgd2hvc2UgdG9wIG1hcmdpbiBkb2Vzbid0IGNvbGxhcHNlIHdpdGggdGhlIGVs
ZW1lbnQncyBib3R0b20gbWFyZ2luCisgICAgICAgIC8vIDQuIHplcm8sIG90aGVyd2lzZQorICAg
ICAgICAvLyBPbmx5IGNoaWxkcmVuIGluIHRoZSBub3JtYWwgZmxvdyBhcmUgdGFrZW4gaW50byBh
Y2NvdW50IChpLmUuLCBmbG9hdGluZyBib3hlcyBhbmQgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJv
eGVzIGFyZSBpZ25vcmVkLAorICAgICAgICAvLyBhbmQgcmVsYXRpdmVseSBwb3NpdGlvbmVkIGJv
eGVzIGFyZSBjb25zaWRlcmVkIHdpdGhvdXQgdGhlaXIgb2Zmc2V0KS4gTm90ZSB0aGF0IHRoZSBj
aGlsZCBib3ggbWF5IGJlIGFuIGFub255bW91cyBibG9jayBib3guCisKKyAgICAgICAgYXV0byYg
Ym94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJv
eCk7CisgICAgICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21w
dXRlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAg
ICAgICAgYXV0byBub25Db2xsYXBzZWRNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNv
bGxhcHNlZFZhbHVlcyB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCks
IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OyAKKyAgICAgICAgYXV0
byBib3JkZXJBbmRQYWRkaW5nVG9wID0gYm94R2VvbWV0cnkuYm9yZGVyVG9wKCkgKyBib3hHZW9t
ZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKTsKKyAgICAgICAgYXV0byBoZWlnaHQgPSBvdmVy
cmlkZGVuVmVydGljYWxWYWx1ZXMuaGVpZ2h0ID8gb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhl
aWdodC52YWx1ZSgpIDogY29tcHV0ZWRIZWlnaHQobGF5b3V0Qm94KTsKKworICAgICAgICBpZiAo
aGVpZ2h0KQorICAgICAgICAgICAgcmV0dXJuIHsgKmhlaWdodCwgbm9uQ29sbGFwc2VkTWFyZ2lu
IH07CisKKyAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25j
YXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dDaGlsZCgpKQorICAgICAgICAg
ICAgcmV0dXJuIHsgMCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07CisKKyAgICAgICAgLy8gMS4gdGhl
IGJvdHRvbSBlZGdlIG9mIHRoZSBsYXN0IGxpbmUgYm94LCBpZiB0aGUgYm94IGVzdGFibGlzaGVz
IGEgaW5saW5lIGZvcm1hdHRpbmcgY29udGV4dCB3aXRoIG9uZSBvciBtb3JlIGxpbmVzCisgICAg
ICAgIGF1dG8mIGxheW91dENvbnRhaW5lciA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0
Qm94KTsKKyAgICAgICAgaWYgKGxheW91dENvbnRhaW5lci5lc3RhYmxpc2hlc0lubGluZUZvcm1h
dHRpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgICAgIGF1dG8mIGlubGluZUZvcm1hdHRpbmdTdGF0
ZSA9IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUobGF5b3V0
Q29udGFpbmVyKTsKKyAgICAgICAgICAgIGF1dG8mIGxpbmVzID0gaW5saW5lRm9ybWF0dGluZ1N0
YXRlLmxpbmVzKCk7CisgICAgICAgICAgICAvLyBFdmVuIGVtcHR5IGNvbnRhaW5lcnMgZ2VuZXJh
dGUgb25lIGxpbmUuIAorICAgICAgICAgICAgQVNTRVJUKCFsaW5lcy5pc0VtcHR5KCkpOworICAg
ICAgICAgICAgcmV0dXJuIHsgdG9MYXlvdXRVbml0KGxpbmVzLmxhc3QoKS5saW5lQm94TG9naWNh
bFJlY3QoKS5ib3R0b20oKSArIGlubGluZUZvcm1hdHRpbmdTdGF0ZS5jbGVhckdhcEFmdGVyTGFz
dExpbmUoKSkgLSBib3JkZXJBbmRQYWRkaW5nVG9wLCBub25Db2xsYXBzZWRNYXJnaW4gfTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIDIuIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgYm90dG9tIChw
b3NzaWJseSBjb2xsYXBzZWQpIG1hcmdpbiBvZiBpdHMgbGFzdCBpbi1mbG93IGNoaWxkLCBpZiB0
aGUgY2hpbGQncyBib3R0b20gbWFyZ2luLi4uCisgICAgICAgIGF1dG8mIGxhc3RJbkZsb3dDaGls
ZCA9ICpsYXlvdXRDb250YWluZXIubGFzdEluRmxvd0NoaWxkKCk7CisgICAgICAgIGlmICghZm9y
bWF0dGluZ0NvbnRleHQoKS5tYXJnaW5Db2xsYXBzZSgpLm1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0
aFBhcmVudE1hcmdpbkFmdGVyKGxhc3RJbkZsb3dDaGlsZCkpIHsKKyAgICAgICAgICAgIGF1dG8m
IGxhc3RJbkZsb3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JC
b3gobGFzdEluRmxvd0NoaWxkKTsKKyAgICAgICAgICAgIGF1dG8gYm90dG9tRWRnZU9mQm90dG9t
TWFyZ2luID0gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QobGFzdEluRmxvd0JveEdlb21ldHJ5
KS5ib3R0b20oKSArIGxhc3RJbkZsb3dCb3hHZW9tZXRyeS5tYXJnaW5BZnRlcigpOworICAgICAg
ICAgICAgcmV0dXJuIHsgYm90dG9tRWRnZU9mQm90dG9tTWFyZ2luIC0gYm9yZGVyQW5kUGFkZGlu
Z1RvcCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07CisgICAgICAgIH0KKworICAgICAgICAvLyAzLiB0
aGUgYm90dG9tIGJvcmRlciBlZGdlIG9mIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgd2hvc2UgdG9w
IG1hcmdpbiBkb2Vzbid0IGNvbGxhcHNlIHdpdGggdGhlIGVsZW1lbnQncyBib3R0b20gbWFyZ2lu
CisgICAgICAgIGF1dG8qIGluRmxvd0NoaWxkID0gJmxhc3RJbkZsb3dDaGlsZDsKKyAgICAgICAg
d2hpbGUgKGluRmxvd0NoaWxkICYmIGZvcm1hdHRpbmdDb250ZXh0KCkubWFyZ2luQ29sbGFwc2Uo
KS5tYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoKmluRmxvd0NoaWxk
KSkKKyAgICAgICAgICAgIGluRmxvd0NoaWxkID0gaW5GbG93Q2hpbGQtPnByZXZpb3VzSW5GbG93
U2libGluZygpOworICAgICAgICBpZiAoaW5GbG93Q2hpbGQpIHsKKyAgICAgICAgICAgIGF1dG8m
IGluRmxvd0JveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveCgq
aW5GbG93Q2hpbGQpOworICAgICAgICAgICAgcmV0dXJuIHsgQm94R2VvbWV0cnk6OmJvcmRlckJv
eFRvcChpbkZsb3dCb3hHZW9tZXRyeSkgKyBpbkZsb3dCb3hHZW9tZXRyeS5ib3JkZXJCb3goKS5o
ZWlnaHQoKSAtIGJvcmRlckFuZFBhZGRpbmdUb3AsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OworICAg
ICAgICB9CisKKyAgICAgICAgLy8gNC4gemVybywgb3RoZXJ3aXNlCisgICAgICAgIHJldHVybiB7
IDAsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OworICAgIH07CisKKyAgICAvLyAxMC42LjcgJ0F1dG8n
IGhlaWdodHMgZm9yIGJsb2NrLWxldmVsIGZvcm1hdHRpbmcgY29udGV4dCBib3hlcy4KKyAgICBh
dXRvIGlzQXV0b0hlaWdodCA9ICFvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVpZ2h0ICYmICFj
b21wdXRlZEhlaWdodChsYXlvdXRCb3gpOworICAgIGlmIChpc0F1dG9IZWlnaHQgJiYgKGxheW91
dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkgJiYgIWxheW91dEJveC5lc3RhYmxp
c2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpKQorICAgICAgICByZXR1cm4gY29tcHV0ZSgg
T3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzIHsgY29udGVudEhlaWdodEZvckZvcm1hdHRpbmdDb250
ZXh0Um9vdChkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkpIH0pOworICAgIHJldHVy
biBjb21wdXRlKG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Cit9CisKK0NvbnRlbnRXaWR0aEFu
ZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93Tm9uUmVwbGFj
ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVu
SG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCit7CisgICAgQVNT
RVJUKGxheW91dEJveC5pc0luRmxvdygpKTsKKworICAgIGF1dG8gY29tcHV0ZSA9IFsmXSgpIHsK
KworICAgICAgICAvLyAxMC4zLjMgQmxvY2stbGV2ZWwsIG5vbi1yZXBsYWNlZCBlbGVtZW50cyBp
biBub3JtYWwgZmxvdworICAgICAgICAvLworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvbnN0
cmFpbnRzIG11c3QgaG9sZCBhbW9uZyB0aGUgdXNlZCB2YWx1ZXMgb2YgdGhlIG90aGVyIHByb3Bl
cnRpZXM6CisgICAgICAgIC8vICdtYXJnaW4tbGVmdCcgKyAnYm9yZGVyLWxlZnQtd2lkdGgnICsg
J3BhZGRpbmctbGVmdCcgKyAnd2lkdGgnICsgJ3BhZGRpbmctcmlnaHQnICsgJ2JvcmRlci1yaWdo
dC13aWR0aCcgKyAnbWFyZ2luLXJpZ2h0JyA9IHdpZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKKyAg
ICAgICAgLy8KKyAgICAgICAgLy8gMS4gSWYgJ3dpZHRoJyBpcyBub3QgJ2F1dG8nIGFuZCAnYm9y
ZGVyLWxlZnQtd2lkdGgnICsgJ3BhZGRpbmctbGVmdCcgKyAnd2lkdGgnICsgJ3BhZGRpbmctcmln
aHQnICsgJ2JvcmRlci1yaWdodC13aWR0aCcgCisgICAgICAgIC8vICAgIChwbHVzIGFueSBvZiAn
bWFyZ2luLWxlZnQnIG9yICdtYXJnaW4tcmlnaHQnIHRoYXQgYXJlIG5vdCAnYXV0bycpIGlzIGxh
cmdlciB0aGFuIHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmluZyBibG9jaywgdGhlbgorICAgICAg
ICAvLyAgICBhbnkgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi1sZWZ0JyBvciAnbWFyZ2luLXJp
Z2h0JyBhcmUsIGZvciB0aGUgZm9sbG93aW5nIHJ1bGVzLCB0cmVhdGVkIGFzIHplcm8uCisgICAg
ICAgIC8vCisgICAgICAgIC8vIDIuIElmIGFsbCBvZiB0aGUgYWJvdmUgaGF2ZSBhIGNvbXB1dGVk
IHZhbHVlIG90aGVyIHRoYW4gJ2F1dG8nLCB0aGUgdmFsdWVzIGFyZSBzYWlkIHRvIGJlICJvdmVy
LWNvbnN0cmFpbmVkIiBhbmQgb25lIG9mIHRoZSB1c2VkIHZhbHVlcyB3aWxsCisgICAgICAgIC8v
ICAgIGhhdmUgdG8gYmUgZGlmZmVyZW50IGZyb20gaXRzIGNvbXB1dGVkIHZhbHVlLiBJZiB0aGUg
J2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaGFzIHRoZSB2YWx1
ZSAnbHRyJywgdGhlIHNwZWNpZmllZCB2YWx1ZQorICAgICAgICAvLyAgICBvZiAnbWFyZ2luLXJp
Z2h0JyBpcyBpZ25vcmVkIGFuZCB0aGUgdmFsdWUgaXMgY2FsY3VsYXRlZCBzbyBhcyB0byBtYWtl
IHRoZSBlcXVhbGl0eSB0cnVlLiBJZiB0aGUgdmFsdWUgb2YgJ2RpcmVjdGlvbicgaXMgJ3J0bCcs
CisgICAgICAgIC8vICAgIHRoaXMgaGFwcGVucyB0byAnbWFyZ2luLWxlZnQnIGluc3RlYWQuCisg
ICAgICAgIC8vCisgICAgICAgIC8vIDMuIElmIHRoZXJlIGlzIGV4YWN0bHkgb25lIHZhbHVlIHNw
ZWNpZmllZCBhcyAnYXV0bycsIGl0cyB1c2VkIHZhbHVlIGZvbGxvd3MgZnJvbSB0aGUgZXF1YWxp
dHkuCisgICAgICAgIC8vCisgICAgICAgIC8vIDQuIElmICd3aWR0aCcgaXMgc2V0IHRvICdhdXRv
JywgYW55IG90aGVyICdhdXRvJyB2YWx1ZXMgYmVjb21lICcwJyBhbmQgJ3dpZHRoJyBmb2xsb3dz
IGZyb20gdGhlIHJlc3VsdGluZyBlcXVhbGl0eS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gNS4g
SWYgYm90aCAnbWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyBhcmUgJ2F1dG8nLCB0aGVp
ciB1c2VkIHZhbHVlcyBhcmUgZXF1YWwuIFRoaXMgaG9yaXpvbnRhbGx5IGNlbnRlcnMgdGhlIGVs
ZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoZQorICAgICAgICAvLyAgICBlZGdlcyBvZiB0aGUgY29u
dGFpbmluZyBibG9jay4KKworICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9y
aXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKKyAgICAgICAgYXV0byYgY29udGFpbmlu
Z0Jsb2NrU3R5bGUgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkuc3R5bGUoKTsKKyAgICAg
ICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94
KGxheW91dEJveCk7CisKKyAgICAgICAgYXV0byB3aWR0aCA9IG92ZXJyaWRkZW5Ib3Jpem9udGFs
VmFsdWVzLndpZHRoID8gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGggOiBjb21wdXRl
ZFdpZHRoKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworICAgICAgICBhdXRvIGNv
bXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6b250YWxNYXJn
aW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAgICBVc2VkSG9yaXpv
bnRhbE1hcmdpbiB1c2VkSG9yaXpvbnRhbE1hcmdpbjsKKyAgICAgICAgYXV0byBib3JkZXJMZWZ0
ID0gYm94R2VvbWV0cnkuYm9yZGVyTGVmdCgpOworICAgICAgICBhdXRvIGJvcmRlclJpZ2h0ID0g
Ym94R2VvbWV0cnkuYm9yZGVyUmlnaHQoKTsKKyAgICAgICAgYXV0byBwYWRkaW5nTGVmdCA9IGJv
eEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCkudmFsdWVPcigwKTsKKyAgICAgICAgYXV0byBwYWRkaW5n
UmlnaHQgPSBib3hHZW9tZXRyeS5wYWRkaW5nUmlnaHQoKS52YWx1ZU9yKDApOworCisgICAgICAg
IC8vICMxCisgICAgICAgIGlmICh3aWR0aCkgeworICAgICAgICAgICAgYXV0byBob3Jpem9udGFs
U3BhY2VGb3JNYXJnaW4gPSBjb250YWluaW5nQmxvY2tXaWR0aCAtIChjb21wdXRlZEhvcml6b250
YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3
aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgY29tcHV0ZWRIb3Jpem9udGFsTWFy
Z2luLmVuZC52YWx1ZU9yKDApKTsKKyAgICAgICAgICAgIGlmIChob3Jpem9udGFsU3BhY2VGb3JN
YXJnaW4gPCAwKQorICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyBjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29tcHV0ZWRIb3Jpem9udGFs
TWFyZ2luLmVuZC52YWx1ZU9yKDApIH07CisgICAgICAgIH0KKworICAgICAgICAvLyAjMgorICAg
ICAgICBpZiAod2lkdGggJiYgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmIGNvbXB1
dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKKyAgICAgICAgICAgIGlmIChjb250YWluaW5nQmxv
Y2tTdHlsZS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICB1c2Vk
SG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQ7
CisgICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gY29udGFpbmluZ0Js
b2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7CisgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9
ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kOworICAgICAgICAgICAgICAgIHVzZWRIb3Jp
em9udGFsTWFyZ2luLnN0YXJ0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoYm9yZGVyTGVmdCAr
IHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2Vk
SG9yaXpvbnRhbE1hcmdpbi5lbmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgLy8gIzMKKyAgICAgICAgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgJiYg
d2lkdGggJiYgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgeworICAgICAgICAgICAgdXNl
ZEhvcml6b250YWxNYXJnaW4uZW5kID0gKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQ7Cisg
ICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNvbnRhaW5pbmdCbG9ja1dp
ZHRoIC0gKGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCAgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQg
KyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7CisgICAgICAgIH0gZWxz
ZSBpZiAoY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmICF3aWR0aCAmJiBjb21wdXRl
ZEhvcml6b250YWxNYXJnaW4uZW5kKSB7CisgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdp
biA9IHsgKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCwgKmNvbXB1dGVkSG9yaXpvbnRh
bE1hcmdpbi5lbmQgfTsKKyAgICAgICAgICAgIHdpZHRoID0gY29udGFpbmluZ0Jsb2NrV2lkdGgg
LSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQg
KyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7
CisgICAgICAgIH0gZWxzZSBpZiAoY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmIHdp
ZHRoICYmICFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7CisgICAgICAgICAgICB1c2Vk
SG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQ7
CisgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgPSBjb250YWluaW5nQmxvY2tX
aWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5n
TGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0KTsKKyAgICAgICAgfQor
CisgICAgICAgIC8vICM0CisgICAgICAgIGlmICghd2lkdGgpIHsKKyAgICAgICAgICAgIHVzZWRI
b3Jpem9udGFsTWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVP
cigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07CisgICAgICAg
ICAgICB3aWR0aCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2lu
LnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVy
UmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gIzUKKyAgICAgICAgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgJiYgIWNv
bXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKKyAgICAgICAgICAgIGF1dG8gaG9yaXpvbnRh
bFNwYWNlRm9yTWFyZ2luID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoYm9yZGVyTGVmdCArIHBh
ZGRpbmdMZWZ0ICArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0KTsKKyAgICAg
ICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyBob3Jpem9udGFsU3BhY2VGb3JNYXJnaW4g
LyAyLCBob3Jpem9udGFsU3BhY2VGb3JNYXJnaW4gLyAyIH07CisgICAgICAgIH0KKworICAgICAg
ICBhdXRvIHNob3VsZEFwcGx5Q2VudGVyQWxpZ25Gb3JCbG9ja0NvbnRlbnQgPSBjb250YWluaW5n
QmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRDZW50ZXIgJiYg
KGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCB8fCBjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uZW5kKTsKKyAgICAgICAgaWYgKHNob3VsZEFwcGx5Q2VudGVyQWxpZ25Gb3JCbG9ja0NvbnRl
bnQpIHsKKyAgICAgICAgICAgIGF1dG8gYm9yZGVyQm94V2lkdGggPSAoYm9yZGVyTGVmdCArIHBh
ZGRpbmdMZWZ0ICArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0KTsKKyAgICAg
ICAgICAgIGF1dG8gbWFyZ2luU3RhcnQgPSBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQu
dmFsdWVPcigwKTsKKyAgICAgICAgICAgIGF1dG8gbWFyZ2luRW5kID0gY29tcHV0ZWRIb3Jpem9u
dGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApOworICAgICAgICAgICAgYXV0byBjZW50ZXJlZExvZ2lj
YWxMZWZ0Rm9yTWFyZ2luQm94ID0gc3RkOjptYXgoKGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gYm9y
ZGVyQm94V2lkdGggLSBtYXJnaW5TdGFydCAtIG1hcmdpbkVuZCkgLyAyLCAwX2x1KTsKKyAgICAg
ICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gY2VudGVyZWRMb2dpY2FsTGVmdEZv
ck1hcmdpbkJveCArIG1hcmdpblN0YXJ0OworICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJn
aW4uZW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSBib3JkZXJCb3hXaWR0aCAtIG1hcmdpblN0
YXJ0ICsgbWFyZ2luRW5kOworICAgICAgICB9CisgICAgICAgIEFTU0VSVCh3aWR0aCk7CisKKyAg
ICAgICAgcmV0dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7ICp3aWR0aCwgdXNlZEhvcml6b250
YWxNYXJnaW4gfTsKKyAgICB9OworCisgICAgYXV0byBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBj
b21wdXRlKCk7CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBz
dHJlYW0gPDwgIltXaWR0aF1bTWFyZ2luXSAtPiBpbmZsb3cgbm9uLXJlcGxhY2VkIC0+IHdpZHRo
KCIgPDwgY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA8PCAicHgpIG1hcmdpbigi
IDw8IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0IDw8ICJweCwgIiA8PCBj
b250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgPDwgInB4KSAtPiBsYXlvdXRCb3go
IiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7CisgICAgcmV0dXJuIGNvbnRlbnRXaWR0aEFuZE1hcmdp
bjsKK30KKworQ29udGVudFdpZHRoQW5kTWFyZ2luIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5OjppbkZsb3dSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBSZXBsYWNl
ZEJveCYgcmVwbGFjZWRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRh
bENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKHJlcGxhY2VkQm94LmlzSW5GbG93KCkp
OworCisgICAgLy8gMTAuMy40IEJsb2NrLWxldmVsLCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3Jt
YWwgZmxvdworICAgIC8vCisgICAgLy8gMS4gVGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBpcyBk
ZXRlcm1pbmVkIGFzIGZvciBpbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMuCisgICAgLy8gMi4gVGhl
biB0aGUgcnVsZXMgZm9yIG5vbi1yZXBsYWNlZCBibG9jay1sZXZlbCBlbGVtZW50cyBhcmUgYXBw
bGllZCB0byBkZXRlcm1pbmUgdGhlIG1hcmdpbnMuCisKKyAgICAvLyAjMQorICAgIGF1dG8gdXNl
ZFdpZHRoID0gaW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4ocmVwbGFjZWRCb3gs
IGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyku
Y29udGVudFdpZHRoOworICAgIC8vICMyCisgICAgYXV0byBub25SZXBsYWNlZFdpZHRoQW5kTWFy
Z2luID0gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4ocmVwbGFjZWRCb3gs
IGhvcml6b250YWxDb25zdHJhaW50cywgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMgeyB1c2Vk
V2lkdGgsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLm1hcmdpbiB9KTsKKworICAgIExPR19X
SVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbV2lkdGhdW01h
cmdpbl0gLT4gaW5mbG93IHJlcGxhY2VkIC0+IHdpZHRoKCIgPDwgdXNlZFdpZHRoICA8PCAicHgp
IG1hcmdpbigiIDw8IG5vblJlcGxhY2VkV2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCA8
PCAicHgsICIgPDwgbm9uUmVwbGFjZWRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLmVuZCA8PCAi
cHgpIC0+IGxheW91dEJveCgiIDw8ICZyZXBsYWNlZEJveCA8PCAiKSIpOworICAgIHJldHVybiB7
IHVzZWRXaWR0aCwgbm9uUmVwbGFjZWRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luIH07Cit9CisK
K0xheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OnN0YXRpY1ZlcnRp
Y2FsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWlu
dHMmIHZlcnRpY2FsQ29uc3RyYWludHMpIGNvbnN0Cit7CisgICAgLy8gaHR0cHM6Ly93d3cudzMu
b3JnL1RSL0NTUzIyL3Zpc3VyZW4uaHRtbCNibG9jay1mb3JtYXR0aW5nCisgICAgLy8gSW4gYSBi
bG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGJveGVzIGFyZSBsYWlkIG91dCBvbmUgYWZ0ZXIgdGhl
IG90aGVyLCB2ZXJ0aWNhbGx5LCBiZWdpbm5pbmcgYXQgdGhlIHRvcCBvZiBhIGNvbnRhaW5pbmcg
YmxvY2suCisgICAgLy8gVGhlIHZlcnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNpYmxpbmcg
Ym94ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgJ21hcmdpbicgcHJvcGVydGllcy4KKyAgICAvLyBW
ZXJ0aWNhbCBtYXJnaW5zIGJldHdlZW4gYWRqYWNlbnQgYmxvY2stbGV2ZWwgYm94ZXMgaW4gYSBi
bG9jayBmb3JtYXR0aW5nIGNvbnRleHQgY29sbGFwc2UuCisgICAgaWYgKGF1dG8qIHByZXZpb3Vz
SW5GbG93U2libGluZyA9IGxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkgeworICAg
ICAgICBhdXRvJiBwcmV2aW91c0luRmxvd0JveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQo
KS5nZW9tZXRyeUZvckJveCgqcHJldmlvdXNJbkZsb3dTaWJsaW5nKTsKKyAgICAgICAgcmV0dXJu
IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KHByZXZpb3VzSW5GbG93Qm94R2VvbWV0cnkpLmJv
dHRvbSgpICsgcHJldmlvdXNJbkZsb3dCb3hHZW9tZXRyeS5tYXJnaW5BZnRlcigpOworICAgIH0K
KyAgICByZXR1cm4gdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2FsVG9wOworfQorCitMYXlvdXRV
bml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNIb3Jpem9udGFsUG9z
aXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYg
aG9yaXpvbnRhbENvbnN0cmFpbnRzKSBjb25zdAoreworICAgIC8vIGh0dHBzOi8vd3d3LnczLm9y
Zy9UUi9DU1MyMi92aXN1cmVuLmh0bWwjYmxvY2stZm9ybWF0dGluZworICAgIC8vIEluIGEgYmxv
Y2sgZm9ybWF0dGluZyBjb250ZXh0LCBlYWNoIGJveCdzIGxlZnQgb3V0ZXIgZWRnZSB0b3VjaGVz
IHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgKGZvciByaWdodC10by1sZWZ0
IGZvcm1hdHRpbmcsIHJpZ2h0IGVkZ2VzIHRvdWNoKS4KKyAgICByZXR1cm4gaG9yaXpvbnRhbENv
bnN0cmFpbnRzLmxvZ2ljYWxMZWZ0ICsgZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJv
eChsYXlvdXRCb3gpLm1hcmdpblN0YXJ0KCk7Cit9CisKK1BvaW50IEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNQb3NpdGlvbihjb25zdCBCb3gmIGxheW91dEJveCwgY29u
c3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZl
cnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpIGNvbnN0Cit7CisgICAgcmV0
dXJuIHsgc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0
cmFpbnRzKSwgc3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIHZlcnRpY2FsQ29uc3Ry
YWludHMpIH07Cit9CisKK0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6OmluRmxvd0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBs
YXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZh
bHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5GbG93KCkpOworCisgICAgLy8gMTAu
Ni4yIElubGluZSByZXBsYWNlZCBlbGVtZW50cywgYmxvY2stbGV2ZWwgcmVwbGFjZWQgZWxlbWVu
dHMgaW4gbm9ybWFsIGZsb3csICdpbmxpbmUtYmxvY2snCisgICAgLy8gcmVwbGFjZWQgZWxlbWVu
dHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZsb2F0aW5nIHJlcGxhY2VkIGVsZW1lbnRzCisgICAgaWYg
KGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCisgICAgICAgIHJldHVybiBpbmxpbmVSZXBsYWNl
ZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCks
IGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwor
CisgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBjb250ZW50SGVpZ2h0QW5kTWFyZ2luOworICAg
IGlmIChsYXlvdXRCb3guaXNPdmVyZmxvd1Zpc2libGUoKSAmJiAhbGF5b3V0Qm94LmlzRG9jdW1l
bnRCb3goKSkgeworICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHRoZSBjYXNlIGZvciB0aGUg
ZG9jdW1lbnQgZWxlbWVudC4gTGV0J3MganVzdCBjb21wbGljYXRlZC1jYXNlIGl0IGZvciBub3cu
CisgICAgICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gPSBpbkZsb3dOb25SZXBsYWNlZENvbnRl
bnRIZWlnaHRBbmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJy
aWRkZW5WZXJ0aWNhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gMTAuNi42IENv
bXBsaWNhdGVkIGNhc2VzCisgICAgICAgIC8vIEJsb2NrLWxldmVsLCBub24tcmVwbGFjZWQgZWxl
bWVudHMgaW4gbm9ybWFsIGZsb3cgd2hlbiAnb3ZlcmZsb3cnIGRvZXMgbm90IGNvbXB1dGUgdG8g
J3Zpc2libGUnIChleGNlcHQgaWYgdGhlICdvdmVyZmxvdycgcHJvcGVydHkncyB2YWx1ZSBoYXMg
YmVlbiBwcm9wYWdhdGVkIHRvIHRoZSB2aWV3cG9ydCkuCisgICAgICAgIGNvbnRlbnRIZWlnaHRB
bmRNYXJnaW4gPSBjb21wbGljYXRlZENhc2VzKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworICAgIH0KKworICAgIGF1dG8gcXVpcmtz
ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKTsKKyAgICBpZiAoIXF1aXJrcy5uZWVkc1N0
cmV0Y2hpbmcobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRIZWlnaHRBbmRNYXJn
aW47CisKKyAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPSBxdWlya3Mu
c3RyZXRjaGVkSW5GbG93SGVpZ2h0KGxheW91dEJveCwgY29udGVudEhlaWdodEFuZE1hcmdpbik7
CisKKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8
PCAiW0hlaWdodF1bTWFyZ2luXSAtPiBpbmZsb3cgbm9uLXJlcGxhY2VkIC0+IHN0cmVjaGVkIHRv
IHZpZXdwb3J0IC0+IGhlaWdodCgiIDw8IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhl
aWdodCA8PCAicHgpIG1hcmdpbigiIDw8IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFw
c2VkTWFyZ2luLmJlZm9yZSA8PCAicHgsICIgPDwgY29udGVudEhlaWdodEFuZE1hcmdpbi5ub25D
b2xsYXBzZWRNYXJnaW4uYWZ0ZXIgPDwgInB4KSAtPiBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94
IDw8ICIpIik7CisgICAgcmV0dXJuIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW47Cit9CisKK0NvbnRl
bnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93
Q29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhv
cml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQoreworICAgIEFTU0VS
VChsYXlvdXRCb3guaXNJbkZsb3coKSk7CisKKyAgICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2Vk
Qm94KCkpCisgICAgICAgIHJldHVybiBpbkZsb3dOb25SZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1h
cmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250
YWxWYWx1ZXMpOworICAgIHJldHVybiBpbkZsb3dSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdp
bihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
LCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyk7Cit9CisKK0NvbnRlbnRXaWR0aEFuZE1hcmdp
biBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRDb250ZW50V2lkdGhB
bmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVX
aWR0aEZsb2F0QXZvaWRlcikKK3sKKyAgICBhdXRvIGNvbXB1dGUgPSBbJl0gKGF1dG8gY29uc3Ry
YWludHNGb3JXaWR0aCwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZFdpZHRoKSB7CisgICAgICAg
IGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVy
biBmbG9hdGluZ0NvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzRm9y
V2lkdGgsIHsgdXNlZFdpZHRoLCB7IH0gfSk7CisKKyAgICAgICAgaWYgKGxheW91dEJveC5pc0lu
RmxvdygpKQorICAgICAgICAgICAgcmV0dXJuIGluRmxvd0NvbnRlbnRXaWR0aEFuZE1hcmdpbihs
YXlvdXRCb3gsIGNvbnN0cmFpbnRzRm9yV2lkdGgsIHsgdXNlZFdpZHRoLCB7IH0gfSk7CisKKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBDb250ZW50V2lkdGhB
bmRNYXJnaW4geyB9OworICAgIH07CisKKyAgICBhdXRvIGhvcml6b250YWxDb25zdHJhaW50c0Zv
cldpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzOworICAgIGlmIChsYXlvdXRCb3guc3R5bGUo
KS5sb2dpY2FsV2lkdGgoKS5pc0F1dG8oKSAmJiBhdmFpbGFibGVXaWR0aEZsb2F0QXZvaWRlcikg
eworICAgICAgICAvLyBXaGlsZSB0aGUgbm9uLWF1dG8gd2lkdGggdmFsdWVzIHNob3VsZCBhbGwg
YmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgY29udGFpbmluZyBibG9jaydzIHdpZHRoLCB3aGVuCisg
ICAgICAgIC8vIHRoZSB3aWR0aCBpcyBhdXRvIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFj
ZSBpcyBzaHJ1bmsgYnkgbmVpZ2hib3JpbmcgZmxvYXRzLgorICAgICAgICBob3Jpem9udGFsQ29u
c3RyYWludHNGb3JXaWR0aC5sb2dpY2FsV2lkdGggPSAqYXZhaWxhYmxlV2lkdGhGbG9hdEF2b2lk
ZXI7CisgICAgfQorICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFyZ2luID0gY29tcHV0ZShob3Jp
em9udGFsQ29uc3RyYWludHNGb3JXaWR0aCwgeyB9KTsKKyAgICBhdXRvIGF2YWlsYWJsZVdpZHRo
ID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKKyAgICBpZiAoYXV0byBtYXhX
aWR0aCA9IGNvbXB1dGVkTWF4V2lkdGgobGF5b3V0Qm94LCBhdmFpbGFibGVXaWR0aCkpIHsKKyAg
ICAgICAgYXV0byBtYXhXaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUoaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCBtYXhXaWR0aCk7CisgICAgICAgIGlmIChjb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVu
dFdpZHRoID4gbWF4V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQorICAgICAgICAgICAgY29u
dGVudFdpZHRoQW5kTWFyZ2luID0gbWF4V2lkdGhBbmRNYXJnaW47CisgICAgfQorCisgICAgYXV0
byBtaW5XaWR0aCA9IGNvbXB1dGVkTWluV2lkdGgobGF5b3V0Qm94LCBhdmFpbGFibGVXaWR0aCku
dmFsdWVPcigwKTsKKyAgICBhdXRvIG1pbldpZHRoQW5kTWFyZ2luID0gY29tcHV0ZShob3Jpem9u
dGFsQ29uc3RyYWludHMsIG1pbldpZHRoKTsKKyAgICBpZiAoY29udGVudFdpZHRoQW5kTWFyZ2lu
LmNvbnRlbnRXaWR0aCA8IG1pbldpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkKKyAgICAgICAg
Y29udGVudFdpZHRoQW5kTWFyZ2luID0gbWluV2lkdGhBbmRNYXJnaW47CisgICAgcmV0dXJuIGNv
bnRlbnRXaWR0aEFuZE1hcmdpbjsKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMoY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgYXV0byBmaXhl
ZE1hcmdpbkJvcmRlckFuZFBhZGRpbmcgPSBbJl0oYXV0byYgbGF5b3V0Qm94KSB7CisgICAgICAg
IGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgICAgIHJldHVybiBmaXhlZFZh
bHVlKHN0eWxlLm1hcmdpblN0YXJ0KCkpLnZhbHVlT3IoMCkKKyAgICAgICAgICAgICsgTGF5b3V0
VW5pdCB7IHN0eWxlLmJvcmRlckxlZnRXaWR0aCgpIH0KKyAgICAgICAgICAgICsgZml4ZWRWYWx1
ZShzdHlsZS5wYWRkaW5nTGVmdCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIGZpeGVkVmFs
dWUoc3R5bGUucGFkZGluZ1JpZ2h0KCkpLnZhbHVlT3IoMCkKKyAgICAgICAgICAgICsgTGF5b3V0
VW5pdCB7IHN0eWxlLmJvcmRlclJpZ2h0V2lkdGgoKSB9CisgICAgICAgICAgICArIGZpeGVkVmFs
dWUoc3R5bGUubWFyZ2luRW5kKCkpLnZhbHVlT3IoMCk7CisgICAgfTsKKworICAgIGF1dG8gY29t
cHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gWyZdKCkgLT4gSW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyB7CisgICAgICAgIGF1dG8gbG9naWNhbFdpZHRoID0gbGF5b3V0Qm94LnN0eWxl
KCkubG9naWNhbFdpZHRoKCk7CisgICAgICAgIC8vIE1pbmltdW0vbWF4aW11bSB3aWR0aCBjYW4n
dCBiZSBkZXBlbmRpbmcgb24gdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0aC4KKyAgICAgICAg
YXV0byBuZWVkc1Jlc29sdmVkQ29udGFpbmluZ0Jsb2NrV2lkdGggPSBsb2dpY2FsV2lkdGguaXND
YWxjdWxhdGVkKCkgfHwgbG9naWNhbFdpZHRoLmlzUGVyY2VudCgpIHx8IGxvZ2ljYWxXaWR0aC5p
c1JlbGF0aXZlKCk7CisgICAgICAgIGlmIChuZWVkc1Jlc29sdmVkQ29udGFpbmluZ0Jsb2NrV2lk
dGgpCisgICAgICAgICAgICByZXR1cm4geyB9OworCisgICAgICAgIGlmIChhdXRvIHdpZHRoID0g
Zml4ZWRWYWx1ZShsb2dpY2FsV2lkdGgpKQorICAgICAgICAgICAgcmV0dXJuIHsgKndpZHRoLCAq
d2lkdGggfTsKKworICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkgeworICAg
ICAgICAgICAgYXV0byYgcmVwbGFjZWRCb3ggPSBkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0
Qm94KTsKKyAgICAgICAgICAgIGlmIChyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNXaWR0aCgpKSB7
CisgICAgICAgICAgICAgICAgYXV0byByZXBsYWNlZFdpZHRoID0gcmVwbGFjZWRCb3guaW50cmlu
c2ljV2lkdGgoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4geyByZXBsYWNlZFdpZHRoLCByZXBs
YWNlZFdpZHRoIH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4geyB9OworICAg
ICAgICB9CisKKyAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRv
d25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQo
KSkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisKKyAgICAgICAgaWYgKGxheW91dEJveC5pc1Np
emVDb250YWlubWVudEJveCgpKSB7CisgICAgICAgICAgICAvLyBUaGUgaW50cmluc2ljIHNpemVz
IG9mIHRoZSBzaXplIGNvbnRhaW5tZW50IGJveCBhcmUgZGV0ZXJtaW5lZCBhcyBpZiB0aGUgZWxl
bWVudCBoYWQgbm8gY29udGVudCwKKyAgICAgICAgICAgIC8vIGZvbGxvd2luZyB0aGUgc2FtZSBs
b2dpYyBhcyB3aGVuIHNpemluZyBhcyBpZiBlbXB0eS4KKyAgICAgICAgICAgIHJldHVybiB7IH07
CisgICAgICAgIH0KKworICAgICAgICBpZiAobGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGlu
Z0NvbnRleHQoKSkgeworICAgICAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
ID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZG93bmNhc3Q8Q29udGFp
bmVyQm94PihsYXlvdXRCb3gpLCBsYXlvdXRTdGF0ZSgpKS0+Y29tcHV0ZWRJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzKCk7CisgICAgICAgICAgICBpZiAobG9naWNhbFdpZHRoLmlzTWluQ29udGVu
dCgpKQorICAgICAgICAgICAgICAgIHJldHVybiB7IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMu
bWluaW11bSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtIH07CisgICAgICAgICAg
ICBpZiAobG9naWNhbFdpZHRoLmlzTWF4Q29udGVudCgpKQorICAgICAgICAgICAgICAgIHJldHVy
biB7IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSwgaW50cmluc2ljV2lkdGhDb25z
dHJhaW50cy5tYXhpbXVtIH07CisgICAgICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25z
dHJhaW50czsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJh
aW50cyA9IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9OworICAgICAgICBhdXRvJiBmb3Jt
YXR0aW5nU3RhdGUgPSBsYXlvdXRTdGF0ZSgpLmZvcm1hdHRpbmdTdGF0ZUZvckJveChsYXlvdXRC
b3gpOworICAgICAgICBmb3IgKGF1dG8mIGNoaWxkIDogY2hpbGRyZW5PZlR5cGU8Qm94Pihkb3du
Y2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkpKSB7CisgICAgICAgICAgICBpZiAoY2hpbGQu
aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgfHwgKGNoaWxkLmlzRmxvYXRBdm9pZGVyKCkgJiYgIWNo
aWxkLmhhc0Zsb2F0Q2xlYXIoKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICBhdXRvIGNoaWxkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGZvcm1hdHRpbmdTdGF0
ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGNoaWxkKTsKKyAgICAgICAgICAgIEFT
U0VSVChjaGlsZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMpOworCisgICAgICAgICAgICBpbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0gPSBzdGQ6Om1heChpbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzLm1pbmltdW0sIGNoaWxkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cy0+bWluaW11
bSk7CisgICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0gPSBzdGQ6
Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIGNoaWxkSW50cmluc2ljV2lk
dGhDb25zdHJhaW50cy0+bWF4aW11bSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGludHJp
bnNpY1dpZHRoQ29uc3RyYWludHM7CisgICAgfTsKKyAgICAvLyBGSVhNRSBDaGVjayBmb3IgYm94
LXNpemluZzogYm9yZGVyLWJveDsKKyAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMg
PSBjb25zdHJhaW5CeU1pbk1heFdpZHRoKGxheW91dEJveCwgY29tcHV0ZWRJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzKCkpOworICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMuZXhwYW5kKGZp
eGVkTWFyZ2luQm9yZGVyQW5kUGFkZGluZyhsYXlvdXRCb3gpKTsKKyAgICByZXR1cm4gaW50cmlu
c2ljV2lkdGhDb25zdHJhaW50czsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Js
b2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1
aXJrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uNzFiMDg4NDIwM2RjODZhNjczNmFiYzhlYmRhZjJhNWVmMWQ1
ODZhZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3Bw
CkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9S
TUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNp
bmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2lu
Y2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgorI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250
YWluaW5nQmxvY2suaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworc3RhdGljIGJvb2wgaXNRdWlya0NvbnRhaW5l
cihjb25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICByZXR1cm4gbGF5b3V0Qm94LmlzQm9keUJv
eCgpIHx8IGxheW91dEJveC5pc0RvY3VtZW50Qm94KCkgfHwgbGF5b3V0Qm94LmlzVGFibGVDZWxs
KCk7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpuZWVkc1N0cmV0
Y2hpbmcoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJv
eC5pc0luRmxvdygpKTsKKyAgICAvLyBJbiBxdWlya3MgbW9kZSwgaW4tZmxvdyBib2R5IGFuZCBo
dG1sIHN0cmV0Y2ggdG8gdGhlIGluaXRpYWwgY29udGFpbmluZyBibG9jayAoaGVpZ2h0OiBhdXRv
IG9ubHkpLgorICAgIGlmICghbGF5b3V0U3RhdGUoKS5pblF1aXJrc01vZGUoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpICYmICFs
YXlvdXRCb3guaXNCb2R5Qm94KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVy
biBsYXlvdXRCb3guc3R5bGUoKS5sb2dpY2FsSGVpZ2h0KCkuaXNBdXRvKCk7Cit9CisKK0xheW91
dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpzdHJldGNoZWRJbkZsb3dIZWln
aHQoY29uc3QgQm94JiBsYXlvdXRCb3gsIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gY29udGVudEhl
aWdodEFuZE1hcmdpbikKK3sKKyAgICBBU1NFUlQobmVlZHNTdHJldGNoaW5nKGxheW91dEJveCkp
OworICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9ybWF0dGluZ0NvbnRleHQo
KTsKKyAgICBhdXRvIG5vbkNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luID0gY29udGVudEhlaWdodEFu
ZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW4uYmVmb3JlICsgY29udGVudEhlaWdodEFuZE1hcmdp
bi5ub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXI7CisKKyAgICBpZiAobGF5b3V0Qm94LmlzRG9jdW1l
bnRCb3goKSkgeworICAgICAgICAvLyBMZXQncyBzdHJldGNoIHRoZSBpbmZsb3cgZG9jdW1lbnQg
Ym94KDxodG1sPikgdG8gdGhlIGhlaWdodCBvZiB0aGUgaW5pdGlhbCBjb250YWluaW5nIGJsb2Nr
ICh2aWV3KS4KKyAgICAgICAgYXV0byBkb2N1bWVudEJveENvbnRlbnRIZWlnaHQgPSBmb3JtYXR0
aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3guaW5pdGlhbENvbnRhaW5pbmdCbG9j
aygpLCBFc2NhcGVSZWFzb246OkRvY3VtZW50Qm94U3RyZXRjaGVzVG9WaWV3cG9ydFF1aXJrKS5j
b250ZW50Qm94SGVpZ2h0KCk7CisgICAgICAgIC8vIERvY3VtZW50IGJveCdzIG93biB2ZXJ0aWNh
bCBtYXJnaW4vYm9yZGVyL3BhZGRpbmcgdmFsdWVzIGFsd2F5cyBzaHJpbmsgdGhlIGNvbnRlbnQg
aGVpZ2h0LgorICAgICAgICBhdXRvJiBkb2N1bWVudEJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0Nv
bnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKKyAgICAgICAgZG9jdW1lbnRCb3hDb250
ZW50SGVpZ2h0IC09IG5vbkNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luICsgZG9jdW1lbnRCb3hHZW9t
ZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgZG9jdW1lbnRCb3hHZW9tZXRyeS52ZXJ0aWNhbFBhZGRp
bmcoKS52YWx1ZU9yKDApOworICAgICAgICByZXR1cm4gc3RkOjptYXgoY29udGVudEhlaWdodEFu
ZE1hcmdpbi5jb250ZW50SGVpZ2h0LCAgZG9jdW1lbnRCb3hDb250ZW50SGVpZ2h0KTsKKyAgICB9
CisKKyAgICAvLyBIZXJlIGlzIHRoZSBxdWlya3kgcGFydCBmb3IgYm9keSBib3ggd2hlbiBpdCBz
dHJldGNoZXMgYWxsIHRoZSB3YXkgdG8gdGhlIElDQiBldmVuIHdoZW4gdGhlIGRvY3VtZW50IGJv
eCBkb2VzIG5vdCAoZS5nLiBvdXQtb2YtZmxvdyBwb3NpdGlvbmVkKS4KKyAgICBBU1NFUlQobGF5
b3V0Qm94LmlzQm9keUJveCgpKTsKKyAgICBhdXRvJiBpbml0aWFsQ29udGFpbmluZ0Jsb2NrID0g
bGF5b3V0Qm94LmluaXRpYWxDb250YWluaW5nQmxvY2soKTsKKyAgICBhdXRvJiBpbml0aWFsQ29u
dGFpbmluZ0Jsb2NrR2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChp
bml0aWFsQ29udGFpbmluZ0Jsb2NrLCBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdw
b3J0UXVpcmspOworICAgIC8vIFN0YXJ0IHRoZSBjb250ZW50IGhlaWdodCB3aXRoIHRoZSBJQ0Iu
CisgICAgYXV0byBib2R5Qm94Q29udGVudEhlaWdodCA9IGluaXRpYWxDb250YWluaW5nQmxvY2tH
ZW9tZXRyeS5jb250ZW50Qm94SGVpZ2h0KCk7CisgICAgLy8gQm9keSBib3gncyBvd24gYm9yZGVy
IGFuZCBwYWRkaW5nIHNocmluayB0aGUgY29udGVudCBoZWlnaHQuCisgICAgYXV0byYgYm9keUJv
eEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsK
KyAgICBib2R5Qm94Q29udGVudEhlaWdodCAtPSBib2R5Qm94R2VvbWV0cnkudmVydGljYWxCb3Jk
ZXIoKSArIGJvZHlCb3hHZW9tZXRyeS52ZXJ0aWNhbFBhZGRpbmcoKS52YWx1ZU9yKDApOworICAg
IC8vIEJvZHkgYm94IG5ldmVyIGNvbGxhcHNlcyBpdHMgdmVydGljYWwgbWFyZ2lucyB3aXRoIHRo
ZSBkb2N1bWVudCBib3ggYnV0IGl0IG1pZ2h0IGNvbGxhcHNlIGl0cyBtYXJnaW4gd2l0aCBpdHMg
ZGVzY2VuZGFudHMuCisgICAgYXV0byBub25Db2xsYXBzZWRNYXJnaW4gPSBjb250ZW50SGVpZ2h0
QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbjsKKyAgICBhdXRvIGNvbGxhcHNlZE1hcmdpbiA9
IGZvcm1hdHRpbmdDb250ZXh0Lm1hcmdpbkNvbGxhcHNlKCkuY29sbGFwc2VkVmVydGljYWxWYWx1
ZXMobGF5b3V0Qm94LCBub25Db2xsYXBzZWRNYXJnaW4pLmNvbGxhcHNlZFZhbHVlczsKKyAgICBh
dXRvIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IGNvbGxhcHNlZE1hcmdpbi5iZWZvcmUudmFsdWVPcihu
b25Db2xsYXBzZWRNYXJnaW4uYmVmb3JlKTsKKyAgICB1c2VkVmVydGljYWxNYXJnaW4gKz0gY29s
bGFwc2VkTWFyZ2luLmlzQ29sbGFwc2VkVGhyb3VnaCA/IG5vbkNvbGxhcHNlZE1hcmdpbi5hZnRl
ciA6IGNvbGxhcHNlZE1hcmdpbi5hZnRlci52YWx1ZU9yKG5vbkNvbGxhcHNlZE1hcmdpbi5hZnRl
cik7CisgICAgYm9keUJveENvbnRlbnRIZWlnaHQgLT0gdXNlZFZlcnRpY2FsTWFyZ2luOworICAg
IC8vIERvY3VtZW50IGJveCdzIHBhZGRpbmcgYW5kIGJvcmRlciBhbHNvIHNocmluayB0aGUgYm9k
eSBib3gncyBjb250ZW50IGhlaWdodC4KKyAgICBhdXRvJiBkb2N1bWVudEJveCA9IGxheW91dEJv
eC5wYXJlbnQoKTsKKyAgICBhdXRvJiBkb2N1bWVudEJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0Nv
bnRleHQuZ2VvbWV0cnlGb3JCb3goZG9jdW1lbnRCb3gsIEVzY2FwZVJlYXNvbjo6Qm9keVN0cmV0
Y2hlc1RvVmlld3BvcnRRdWlyayk7CisgICAgYm9keUJveENvbnRlbnRIZWlnaHQgLT0gZG9jdW1l
bnRCb3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgZG9jdW1lbnRCb3hHZW9tZXRyeS52ZXJ0
aWNhbFBhZGRpbmcoKS52YWx1ZU9yKDApOworICAgIC8vIEhvd2V2ZXIgdGhlIG5vbi1pbi1mbG93
IGRvY3VtZW50IGJveCdzIHZlcnRpY2FsIG1hcmdpbnMgYXJlIGlnbm9yZWQuIFRoZXkgZG9uJ3Qg
YWZmZWN0IHRoZSBib2R5IGJveCdzIGNvbnRlbnQgaGVpZ2h0LgorICAgIGlmIChkb2N1bWVudEJv
eC5pc0luRmxvdygpKSB7CisgICAgICAgIGF1dG8gZ2VvbWV0cnkgPSB0aGlzLT5nZW9tZXRyeSgp
OworICAgICAgICBhdXRvIHByZWNvbXB1dGVEb2N1bWVudEJveFZlcnRpY2FsTWFyZ2luID0gZ2Vv
bWV0cnkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihkb2N1bWVudEJveCwgZ2VvbWV0cnkuY29uc3Ry
YWludHNGb3JJbkZsb3dDb250ZW50KGluaXRpYWxDb250YWluaW5nQmxvY2ssIEVzY2FwZVJlYXNv
bjo6Qm9keVN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaykuaG9yaXpvbnRhbCk7CisgICAgICAgIGJv
ZHlCb3hDb250ZW50SGVpZ2h0IC09IHByZWNvbXB1dGVEb2N1bWVudEJveFZlcnRpY2FsTWFyZ2lu
LmJlZm9yZS52YWx1ZU9yKDApICsgcHJlY29tcHV0ZURvY3VtZW50Qm94VmVydGljYWxNYXJnaW4u
YWZ0ZXIudmFsdWVPcigwKTsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bWF4KGNvbnRlbnRIZWln
aHRBbmRNYXJnaW4uY29udGVudEhlaWdodCwgIGJvZHlCb3hDb250ZW50SGVpZ2h0KTsKK30KKwor
Ym9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OnNob3VsZElnbm9yZUNvbGxhcHNl
ZFF1aXJrTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIHJldHVybiBs
YXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpICYmIGlzUXVpcmtDb250YWluZXIobGF5b3V0Qm94
KTsKK30KKworZW51bSBjbGFzcyBWZXJ0aWNhbE1hcmdpbiB7IEJlZm9yZSwgQWZ0ZXIgfTsKK3N0
YXRpYyBpbmxpbmUgYm9vbCBoYXNRdWlya01hcmdpblRvQ29sbGFwc2UoY29uc3QgQm94JiBsYXlv
dXRCb3gsIFZlcnRpY2FsTWFyZ2luIHZlcnRpY2FsTWFyZ2luKQoreworICAgIGlmICghbGF5b3V0
Qm94LmlzSW5GbG93KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBhdXRvJiBzdHlsZSA9
IGxheW91dEJveC5zdHlsZSgpOworICAgIHJldHVybiAodmVydGljYWxNYXJnaW4gPT0gVmVydGlj
YWxNYXJnaW46OkJlZm9yZSAmJiBzdHlsZS5oYXNNYXJnaW5CZWZvcmVRdWlyaygpKSB8fCAodmVy
dGljYWxNYXJnaW4gPT0gVmVydGljYWxNYXJnaW46OkFmdGVyICYmIHN0eWxlLmhhc01hcmdpbkFm
dGVyUXVpcmsoKSk7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpz
aG91bGRDb2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhQYXJlbnRNYXJnaW5CZWZvcmUoY29uc3QgQm94
JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxheW91dFN0YXRlKCkuaW5RdWlya3NN
b2RlKCkgJiYgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGxheW91dEJveCwgVmVydGljYWxNYXJn
aW46OkJlZm9yZSkgJiYgaXNRdWlya0NvbnRhaW5lcihsYXlvdXRCb3guY29udGFpbmluZ0Jsb2Nr
KCkpOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6c2hvdWxkQ29s
bGFwc2VNYXJnaW5BZnRlcldpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJv
eCkgY29uc3QKK3sKKyAgICByZXR1cm4gbGF5b3V0U3RhdGUoKS5pblF1aXJrc01vZGUoKSAmJiBo
YXNRdWlya01hcmdpblRvQ29sbGFwc2UobGF5b3V0Qm94LCBWZXJ0aWNhbE1hcmdpbjo6QWZ0ZXIp
ICYmIGlzUXVpcmtDb250YWluZXIobGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpKTsKK30KKwor
fQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Js
b2NrRm9ybWF0dGluZ1N0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iNzRhNTBmZjY5MTNhZDEyYTA4ZDUy
ZTM5MDI3NTkxMDc3ZjIzMzViCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3Rh
dGUuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
KyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisg
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKworI2lmIEVOQUJMRShMQVlPVVRf
Rk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lT
T19BTExPQ0FURURfSU1QTChCbG9ja0Zvcm1hdHRpbmdTdGF0ZSk7CisKK0Jsb2NrRm9ybWF0dGlu
Z1N0YXRlOjpCbG9ja0Zvcm1hdHRpbmdTdGF0ZShSZWY8RmxvYXRpbmdTdGF0ZT4mJiBmbG9hdGlu
Z1N0YXRlLCBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCisgICAgOiBGb3JtYXR0aW5nU3RhdGUo
V1RGTW92ZShmbG9hdGluZ1N0YXRlKSwgVHlwZTo6QmxvY2ssIGxheW91dFN0YXRlKQoreworfQor
CitCbG9ja0Zvcm1hdHRpbmdTdGF0ZTo6fkJsb2NrRm9ybWF0dGluZ1N0YXRlKCkKK3sKK30KKwor
fQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tG
b3JtYXR0aW5nU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xZTZjZDYxOWRkMzE2ZjU5YjNmNDA5YmYzNWQ3
MDk2ZDlmYjdjOGIxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuaApA
QCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUo
TEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZvcm1hdHRpbmdTdGF0ZS5o
IgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKyNpbmNsdWRlIDx3dGYvV2Vha0hhc2hTZXQu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKKy8vIEJsb2Nr
Rm9ybWF0dGluZ1N0YXRlIGhvbGRzIHRoZSBzdGF0ZSBmb3IgYSBwYXJ0aWN1bGFyIGJsb2NrIGZv
cm1hdHRpbmcgY29udGV4dCB0cmVlLgorY2xhc3MgQmxvY2tGb3JtYXR0aW5nU3RhdGUgOiBwdWJs
aWMgRm9ybWF0dGluZ1N0YXRlIHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKEJsb2NrRm9y
bWF0dGluZ1N0YXRlKTsKK3B1YmxpYzoKKyAgICBCbG9ja0Zvcm1hdHRpbmdTdGF0ZShSZWY8Rmxv
YXRpbmdTdGF0ZT4mJiwgTGF5b3V0U3RhdGUmKTsKKyAgICB+QmxvY2tGb3JtYXR0aW5nU3RhdGUo
KTsKKworICAgIHZvaWQgc2V0VXNlZFZlcnRpY2FsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBjb25zdCBVc2VkVmVydGljYWxNYXJnaW4mIHVzZWRWZXJ0aWNhbE1hcmdpbikgeyBtX3VzZWRW
ZXJ0aWNhbE1hcmdpbnMuc2V0KCZsYXlvdXRCb3gsIHVzZWRWZXJ0aWNhbE1hcmdpbik7IH0KKyAg
ICBVc2VkVmVydGljYWxNYXJnaW4gdXNlZFZlcnRpY2FsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0
Qm94KSBjb25zdCB7IHJldHVybiBtX3VzZWRWZXJ0aWNhbE1hcmdpbnMuZ2V0KCZsYXlvdXRCb3gp
OyB9CisgICAgYm9vbCBoYXNVc2VkVmVydGljYWxNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gp
IGNvbnN0IHsgcmV0dXJuIG1fdXNlZFZlcnRpY2FsTWFyZ2lucy5jb250YWlucygmbGF5b3V0Qm94
KTsgfQorCisgICAgdm9pZCBzZXRIYXNDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIHsg
bV9jbGVhcmFuY2VTZXQuYWRkKGxheW91dEJveCk7IH0KKyAgICB2b2lkIGNsZWFySGFzQ2xlYXJh
bmNlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSB7IG1fY2xlYXJhbmNlU2V0LnJlbW92ZShsYXlvdXRC
b3gpOyB9CisgICAgYm9vbCBoYXNDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0
IHsgcmV0dXJuIG1fY2xlYXJhbmNlU2V0LmNvbnRhaW5zKGxheW91dEJveCk7IH0KKworcHJpdmF0
ZToKKyAgICBIYXNoTWFwPGNvbnN0IEJveCosIFVzZWRWZXJ0aWNhbE1hcmdpbj4gbV91c2VkVmVy
dGljYWxNYXJnaW5zOworICAgIFdlYWtIYXNoU2V0PGNvbnN0IEJveD4gbV9jbGVhcmFuY2VTZXQ7
Cit9OworCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdf
U1RBVEUoQmxvY2tGb3JtYXR0aW5nU3RhdGUsIGlzQmxvY2tGb3JtYXR0aW5nU3RhdGUoKSkKKwor
I2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja01hcmdpbkNvbGxhcHNlLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrTWFyZ2lu
Q29sbGFwc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmYxZmQ1YmJlMjJhMWFiOTJlODUxZDg1MGRlMGY0YTZh
ZDE4NzEwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja01hcmdpbkNvbGxhcHNlLmNwcApAQCAt
MCwwICsxLDYwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJ
TkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVk
ZSAiRmxvYXRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgor
I2luY2x1ZGUgIkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgor
I2luY2x1ZGUgIkxheW91dFVuaXQuaCIKKyNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworc3RhdGljIGJvb2wgaGFzQm9y
ZGVyKGNvbnN0IEJvcmRlclZhbHVlJiBib3JkZXJWYWx1ZSkKK3sKKyAgICBpZiAoYm9yZGVyVmFs
dWUuc3R5bGUoKSA9PSBCb3JkZXJTdHlsZTo6Tm9uZSB8fCBib3JkZXJWYWx1ZS5zdHlsZSgpID09
IEJvcmRlclN0eWxlOjpIaWRkZW4pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4g
ISFib3JkZXJWYWx1ZS53aWR0aCgpOworfQorCitzdGF0aWMgYm9vbCBoYXNQYWRkaW5nKGNvbnN0
IExlbmd0aCYgcGFkZGluZ1ZhbHVlKQoreworICAgIC8vIEZJWE1FOiBDaGVjayBpZiBwZXJjZW50
IHZhbHVlIG5lZWRzIHRvIGJlIHJlc29sdmVkLgorICAgIHJldHVybiAhcGFkZGluZ1ZhbHVlLmlz
WmVybygpOworfQorCitzdGF0aWMgYm9vbCBoYXNCb3JkZXJCZWZvcmUoY29uc3QgQm94JiBsYXlv
dXRCb3gpCit7CisgICAgcmV0dXJuIGhhc0JvcmRlcihsYXlvdXRCb3guc3R5bGUoKS5ib3JkZXJC
ZWZvcmUoKSk7Cit9CisKK3N0YXRpYyBib29sIGhhc0JvcmRlckFmdGVyKGNvbnN0IEJveCYgbGF5
b3V0Qm94KQoreworICAgIHJldHVybiBoYXNCb3JkZXIobGF5b3V0Qm94LnN0eWxlKCkuYm9yZGVy
QWZ0ZXIoKSk7Cit9CisKK3N0YXRpYyBib29sIGhhc1BhZGRpbmdCZWZvcmUoY29uc3QgQm94JiBs
YXlvdXRCb3gpCit7CisgICAgcmV0dXJuIGhhc1BhZGRpbmcobGF5b3V0Qm94LnN0eWxlKCkucGFk
ZGluZ0JlZm9yZSgpKTsKK30KKworc3RhdGljIGJvb2wgaGFzUGFkZGluZ0FmdGVyKGNvbnN0IEJv
eCYgbGF5b3V0Qm94KQoreworICAgIHJldHVybiBoYXNQYWRkaW5nKGxheW91dEJveC5zdHlsZSgp
LnBhZGRpbmdBZnRlcigpKTsKK30KKworc3RhdGljIGJvb2wgZXN0YWJsaXNoZXNCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0KGNvbnN0IEJveCYgbGF5b3V0Qm94KQoreworICAgIC8vIFdlYktpdCB0cmVh
dHMgdGhlIGRvY3VtZW50IGVsZW1lbnQgcmVuZGVyZXIgYXMgYSBibG9jayBmb3JtYXR0aW5nIGNv
bnRleHQgcm9vdC4gSXQgcHJvYmFibHkgb25seSBpbXBhY3RzIG1hcmdpbiBjb2xsYXBzaW5nLCBz
byBsZXQncyBub3QgZG8KKyAgICAvLyBhIGxheW91dCB3aWRlIHF1aXJrIG9uIHRoaXMgZm9yIG5v
dy4KKyAgICBpZiAobGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSkKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgcmV0dXJuIGxheW91dEJveC5lc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRl
eHQoKTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6
aGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIGlmICghbGF5
b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIEZJ
WE1FOiBwcmVjb21wdXRlZFZlcnRpY2FsUG9zaXRpb25Gb3JGb3JtYXR0aW5nUm9vdCBsb2dpYyBl
bmRzIHVwIGNhbGxpbmcgaW50byB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIGxheW91dEJveCAoZmly
c3QgaW5mbG93IGNoaWxkKSBoYXMKKyAgICAvLyBub3QgYmVlbiBsYWlkIG91dC4KKyAgICByZXR1
cm4gZm9ybWF0dGluZ0NvbnRleHQoKS5mb3JtYXR0aW5nU3RhdGUoKS5oYXNDbGVhcmFuY2UobGF5
b3V0Qm94KTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBz
ZTo6bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKGNvbnN0IEJveCYg
bGF5b3V0Qm94KSBjb25zdAoreworICAgIC8vIDEuIFRoaXMgaXMgdGhlIGxhc3QgaW4tZmxvdyBj
aGlsZCBhbmQgaXRzIG1hcmdpbnMgY29sbGFwc2UgdGhyb3VnaCBhbmQgdGhlIG1hcmdpbiBhZnRl
ciBjb2xsYXBzZXMgd2l0aCBwYXJlbnQncyBtYXJnaW4gYWZ0ZXIgb3IKKyAgICAvLyAyLiBUaGlz
IGJveCdzIG1hcmdpbiBhZnRlciBjb2xsYXBzZXMgd2l0aCB0aGUgbmV4dCBzaWJsaW5nJ3MgbWFy
Z2luIGJlZm9yZSBhbmQgdGhhdCBzaWJsaW5nIGNvbGxhcHNlcyB0aHJvdWdoIGFuZAorICAgIC8v
IHdlIGNhbiBnZXQgdG8gdGhlIGxhc3QgaW4tZmxvdyBjaGlsZCBsaWtlIHRoYXQuCisgICAgYXV0
byogbGFzdEluRmxvd0NoaWxkID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLmxhc3RJbkZs
b3dDaGlsZCgpOworICAgIGZvciAoYXV0byogY3VycmVudEJveCA9ICZsYXlvdXRCb3g7IGN1cnJl
bnRCb3g7IGN1cnJlbnRCb3ggPSBjdXJyZW50Qm94LT5uZXh0SW5GbG93U2libGluZygpKSB7Cisg
ICAgICAgIGlmICghbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCgqY3VycmVudEJveCkpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChjdXJyZW50Qm94ID09IGxhc3RJbkZsb3dD
aGlsZCkKKyAgICAgICAgICAgIHJldHVybiBtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRN
YXJnaW5BZnRlcigqY3VycmVudEJveCk7IAorICAgICAgICBpZiAoIW1hcmdpbkFmdGVyQ29sbGFw
c2VzV2l0aE5leHRTaWJsaW5nTWFyZ2luQmVmb3JlKCpjdXJyZW50Qm94KSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0
dXJuIGZhbHNlOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxh
cHNlOjptYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJv
eCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIC8vIFRoZSBmaXJzdCBpbmZsb3cgY2hpbGQgY291
bGQgcHJvcGFnYXRlIGl0cyB0b3AgbWFyZ2luIHRvIHBhcmVudC4KKyAgICAvLyBodHRwczovL3d3
dy53My5vcmcvVFIvQ1NTMjEvYm94Lmh0bWwjY29sbGFwc2luZy1tYXJnaW5zCisgICAgQVNTRVJU
KGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7CisKKyAgICBpZiAoZm9ybWF0dGluZ0NvbnRl
eHQoKS5xdWlya3MoKS5zaG91bGRDb2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhQYXJlbnRNYXJnaW5C
ZWZvcmUobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBNYXJnaW5z
IGJldHdlZW4gYSBmbG9hdGVkIGJveCBhbmQgYW55IG90aGVyIGJveCBkbyBub3QgY29sbGFwc2Uu
CisgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAvLyBNYXJnaW5zIG9mIGFic29sdXRlbHkgcG9zaXRpb25lZCBib3hl
cyBkbyBub3QgY29sbGFwc2UuCisgICAgaWYgKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9u
ZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTWFyZ2lucyBvZiBpbmxpbmUt
YmxvY2sgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgorICAgIGlmIChsYXlvdXRCb3guaXNJbmxpbmVC
bG9ja0JveCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBPbmx5IHRoZSBmaXJz
dCBpbmxmbG93IGNoaWxkIGNvbGxhcHNlcyB3aXRoIHBhcmVudC4KKyAgICBpZiAobGF5b3V0Qm94
LnByZXZpb3VzSW5GbG93U2libGluZygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBh
dXRvJiBjb250YWluaW5nQmxvY2sgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7CisgICAg
Ly8gTWFyZ2lucyBvZiBlbGVtZW50cyB0aGF0IGVzdGFibGlzaCBuZXcgYmxvY2sgZm9ybWF0dGlu
ZyBjb250ZXh0cyBkbyBub3QgY29sbGFwc2Ugd2l0aCB0aGVpciBpbi1mbG93IGNoaWxkcmVuCisg
ICAgaWYgKGVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dChjb250YWluaW5nQmxvY2sp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaGFzQm9yZGVyQmVmb3JlKGNvbnRh
aW5pbmdCbG9jaykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChoYXNQYWRkaW5n
QmVmb3JlKGNvbnRhaW5pbmdCbG9jaykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8v
IC4uLmFuZCB0aGUgY2hpbGQgaGFzIG5vIGNsZWFyYW5jZS4KKyAgICBpZiAoaGFzQ2xlYXJhbmNl
KGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOwor
fQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5C
ZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5nTWFyZ2luQWZ0ZXIoY29uc3QgQm94JiBs
YXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3go
KSk7CisKKyAgICBpZiAoIWxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgYXV0byYgcHJldmlvdXNJbkZsb3dTaWJsaW5nID0gKmxh
eW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKTsKKyAgICAvLyBNYXJnaW5zIGJldHdlZW4g
YSBmbG9hdGVkIGJveCBhbmQgYW55IG90aGVyIGJveCBkbyBub3QgY29sbGFwc2UuCisgICAgaWYg
KGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpIHx8IHByZXZpb3VzSW5GbG93U2libGlu
Zy5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAv
LyBNYXJnaW5zIG9mIGFic29sdXRlbHkgcG9zaXRpb25lZCBib3hlcyBkbyBub3QgY29sbGFwc2Uu
CisgICAgaWYgKChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWxheW91dEJv
eC5zdHlsZSgpLnRvcCgpLmlzQXV0bygpKQorICAgICAgICB8fCAocHJldmlvdXNJbkZsb3dTaWJs
aW5nLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFwcmV2aW91c0luRmxvd1NpYmxpbmcuc3R5
bGUoKS5ib3R0b20oKS5pc0F1dG8oKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8v
IE1hcmdpbnMgb2YgaW5saW5lLWJsb2NrIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KKyAgICBpZiAo
bGF5b3V0Qm94LmlzSW5saW5lQmxvY2tCb3goKSB8fCBwcmV2aW91c0luRmxvd1NpYmxpbmcuaXNJ
bmxpbmVCbG9ja0JveCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUaGUgYm90
dG9tIG1hcmdpbiBvZiBhbiBpbi1mbG93IGJsb2NrLWxldmVsIGVsZW1lbnQgYWx3YXlzIGNvbGxh
cHNlcyB3aXRoIHRoZSB0b3AgbWFyZ2luIG9mCisgICAgLy8gaXRzIG5leHQgaW4tZmxvdyBibG9j
ay1sZXZlbCBzaWJsaW5nLCB1bmxlc3MgdGhhdCBzaWJsaW5nIGhhcyBjbGVhcmFuY2UuCisgICAg
aWYgKGhhc0NsZWFyYW5jZShsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5D
b2xsYXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJnaW5C
ZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJv
eC5pc0Jsb2NrTGV2ZWxCb3goKSk7CisgICAgLy8gTWFyZ2lucyBvZiBlbGVtZW50cyB0aGF0IGVz
dGFibGlzaCBuZXcgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cyBkbyBub3QgY29sbGFwc2Ugd2l0
aCB0aGVpciBpbi1mbG93IGNoaWxkcmVuLgorICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0
dGluZ0NvbnRleHQobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8g
VGhlIHRvcCBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jayBlbGVtZW50IGNvbGxhcHNlcyB3aXRo
IGl0cyBmaXJzdCBpbi1mbG93IGJsb2NrLWxldmVsCisgICAgLy8gY2hpbGQncyB0b3AgbWFyZ2lu
IGlmIHRoZSBlbGVtZW50IGhhcyBubyB0b3AgYm9yZGVyLi4uCisgICAgaWYgKGhhc0JvcmRlckJl
Zm9yZShsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyAuLi5ubyB0
b3AgcGFkZGluZworICAgIGlmIChoYXNQYWRkaW5nQmVmb3JlKGxheW91dEJveCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8
ICFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYXV0byYgZmlyc3RJbkZsb3dDaGlsZCA9ICpkb3du
Y2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dDaGlsZCgpOworICAgIGlm
ICghZmlyc3RJbkZsb3dDaGlsZC5pc0Jsb2NrTGV2ZWxCb3goKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgLy8gLi4uYW5kIHRoZSBjaGlsZCBoYXMgbm8gY2xlYXJhbmNlLgorICAgIGlm
IChoYXNDbGVhcmFuY2UoZmlyc3RJbkZsb3dDaGlsZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIC8vIE1hcmdpbnMgb2YgaW5saW5lLWJsb2NrIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4K
KyAgICBpZiAoZmlyc3RJbkZsb3dDaGlsZC5pc0lubGluZUJsb2NrQm94KCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhTaWJsaW5n
TWFyZ2luQmVmb3JlV2l0aENsZWFyYW5jZShjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sK
KyAgICAvLyBJZiB0aGUgdG9wIGFuZCBib3R0b20gbWFyZ2lucyBvZiBhbiBlbGVtZW50IHdpdGgg
Y2xlYXJhbmNlIGFyZSBhZGpvaW5pbmcsIGl0cyBtYXJnaW5zIGNvbGxhcHNlIHdpdGggdGhlIGFk
am9pbmluZyBtYXJnaW5zCisgICAgLy8gb2YgZm9sbG93aW5nIHNpYmxpbmdzIGJ1dCB0aGF0IHJl
c3VsdGluZyBtYXJnaW4gZG9lcyBub3QgY29sbGFwc2Ugd2l0aCB0aGUgYm90dG9tIG1hcmdpbiBv
ZiB0aGUgcGFyZW50IGJsb2NrLgorICAgIGlmICghbWFyZ2luc0NvbGxhcHNlVGhyb3VnaChsYXlv
dXRCb3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3IgKGF1dG8qIHByZXZpb3Vz
U2libGluZyA9IGxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKTsgcHJldmlvdXNTaWJs
aW5nOyBwcmV2aW91c1NpYmxpbmcgPSBwcmV2aW91c1NpYmxpbmctPnByZXZpb3VzSW5GbG93U2li
bGluZygpKSB7CisgICAgICAgIGlmICghbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCgqcHJldmlvdXNT
aWJsaW5nKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGhhc0NsZWFy
YW5jZSgqcHJldmlvdXNTaWJsaW5nKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFy
Z2luQ29sbGFwc2U6Om1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShj
b25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICAvLyAxLiBUaGlzIGlzIHRoZSBmaXJz
dCBpbi1mbG93IGNoaWxkIGFuZCBpdHMgbWFyZ2lucyBjb2xsYXBzZSB0aHJvdWdoIGFuZCB0aGUg
bWFyZ2luIGJlZm9yZSBjb2xsYXBzZXMgd2l0aCBwYXJlbnQncyBtYXJnaW4gYmVmb3JlIG9yCisg
ICAgLy8gMi4gVGhpcyBib3gncyBtYXJnaW4gYmVmb3JlIGNvbGxhcHNlcyB3aXRoIHRoZSBwcmV2
aW91cyBzaWJsaW5nJ3MgbWFyZ2luIGFmdGVyIGFuZCB0aGF0IHNpYmxpbmcgY29sbGFwc2VzIHRo
cm91Z2ggYW5kCisgICAgLy8gd2UgY2FuIGdldCB0byB0aGUgZmlyc3QgaW4tZmxvdyBjaGlsZCBs
aWtlIHRoYXQuCisgICAgYXV0byogZmlyc3RJbkZsb3dDaGlsZCA9IGxheW91dEJveC5jb250YWlu
aW5nQmxvY2soKS5maXJzdEluRmxvd0NoaWxkKCk7CisgICAgZm9yIChhdXRvKiBjdXJyZW50Qm94
ID0gJmxheW91dEJveDsgY3VycmVudEJveDsgY3VycmVudEJveCA9IGN1cnJlbnRCb3gtPnByZXZp
b3VzSW5GbG93U2libGluZygpKSB7CisgICAgICAgIGlmICghbWFyZ2luc0NvbGxhcHNlVGhyb3Vn
aCgqY3VycmVudEJveCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChj
dXJyZW50Qm94ID09IGZpcnN0SW5GbG93Q2hpbGQpCisgICAgICAgICAgICByZXR1cm4gbWFyZ2lu
QmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZSgqY3VycmVudEJveCk7IAorICAg
ICAgICBpZiAoIW1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5B
ZnRlcigqY3VycmVudEJveCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNX
aXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAg
QVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7CisKKyAgICBpZiAoZm9ybWF0dGlu
Z0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRDb2xsYXBzZU1hcmdpbkFmdGVyV2l0aFBhcmVudE1h
cmdpbkFmdGVyKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gTWFy
Z2lucyBiZXR3ZWVuIGEgZmxvYXRlZCBib3ggYW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxh
cHNlLgorICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgLy8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQg
Ym94ZXMgZG8gbm90IGNvbGxhcHNlLgorICAgIGlmIChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3Np
dGlvbmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE1hcmdpbnMgb2YgaW5s
aW5lLWJsb2NrIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KKyAgICBpZiAobGF5b3V0Qm94LmlzSW5s
aW5lQmxvY2tCb3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gT25seSB0aGUg
bGFzdCBpbmxmbG93IGNoaWxkIGNvbGxhcHNlcyB3aXRoIHBhcmVudC4KKyAgICBpZiAobGF5b3V0
Qm94Lm5leHRJbkZsb3dTaWJsaW5nKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGF1
dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsKKyAgICAv
LyBNYXJnaW5zIG9mIGVsZW1lbnRzIHRoYXQgZXN0YWJsaXNoIG5ldyBibG9jayBmb3JtYXR0aW5n
IGNvbnRleHRzIGRvIG5vdCBjb2xsYXBzZSB3aXRoIHRoZWlyIGluLWZsb3cgY2hpbGRyZW4uCisg
ICAgaWYgKGVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dChjb250YWluaW5nQmxvY2sp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUaGUgYm90dG9tIG1hcmdpbiBvZiBh
biBpbi1mbG93IGJsb2NrIGJveCB3aXRoIGEgJ2hlaWdodCcgb2YgJ2F1dG8nIGNvbGxhcHNlcyB3
aXRoIGl0cyBsYXN0IGluLWZsb3cgYmxvY2stbGV2ZWwgY2hpbGQncyBib3R0b20gbWFyZ2luLCBp
ZjoKKyAgICBpZiAoIWNvbnRhaW5pbmdCbG9jay5zdHlsZSgpLmhlaWdodCgpLmlzQXV0bygpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyB0aGUgYm94IGhhcyBubyBib3R0b20gcGFk
ZGluZywgYW5kCisgICAgaWYgKGhhc1BhZGRpbmdBZnRlcihjb250YWluaW5nQmxvY2spKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyB0aGUgYm94IGhhcyBubyBib3R0b20gYm9yZGVy
LCBhbmQKKyAgICBpZiAoaGFzQm9yZGVyQWZ0ZXIoY29udGFpbmluZ0Jsb2NrKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGNoaWxkJ3MgYm90dG9tIG1hcmdpbiBuZWl0aGVy
IGNvbGxhcHNlcyB3aXRoIGEgdG9wIG1hcmdpbiB0aGF0IGhhcyBjbGVhcmFuY2UuLi4KKyAgICBp
ZiAobWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoU2libGluZ01hcmdpbkJlZm9yZVdpdGhDbGVhcmFu
Y2UobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gbm9yIChpZiB0
aGUgYm94J3MgbWluLWhlaWdodCBpcyBub24temVybykgd2l0aCB0aGUgYm94J3MgdG9wIG1hcmdp
bi4KKyAgICBhdXRvIGNvbXB1dGVkTWluSGVpZ2h0ID0gY29udGFpbmluZ0Jsb2NrLnN0eWxlKCku
bG9naWNhbE1pbkhlaWdodCgpOworICAgIGlmICghY29tcHV0ZWRNaW5IZWlnaHQuaXNBdXRvKCkg
JiYgY29tcHV0ZWRNaW5IZWlnaHQudmFsdWUoKSAmJiBtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQ
YXJlbnRNYXJnaW5CZWZvcmUobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2lu
Q29sbGFwc2U6Om1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFm
dGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3gu
aXNCbG9ja0xldmVsQm94KCkpOworCisgICAgLy8gTWFyZ2lucyBvZiBlbGVtZW50cyB0aGF0IGVz
dGFibGlzaCBuZXcgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cyBkbyBub3QgY29sbGFwc2Ugd2l0
aCB0aGVpciBpbi1mbG93IGNoaWxkcmVuLgorICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0
dGluZ0NvbnRleHQobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYg
KCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENvbnRhaW5lckJveD4o
bGF5b3V0Qm94KS5oYXNJbkZsb3dDaGlsZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBhdXRvJiBsYXN0SW5GbG93Q2hpbGQgPSAqZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRC
b3gpLmxhc3RJbkZsb3dDaGlsZCgpOworICAgIGlmICghbGFzdEluRmxvd0NoaWxkLmlzQmxvY2tM
ZXZlbEJveCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUaGUgYm90dG9tIG1h
cmdpbiBvZiBhbiBpbi1mbG93IGJsb2NrIGJveCB3aXRoIGEgJ2hlaWdodCcgb2YgJ2F1dG8nIGNv
bGxhcHNlcyB3aXRoIGl0cyBsYXN0IGluLWZsb3cgYmxvY2stbGV2ZWwgY2hpbGQncyBib3R0b20g
bWFyZ2luLCBpZjoKKyAgICBpZiAoIWxheW91dEJveC5zdHlsZSgpLmhlaWdodCgpLmlzQXV0bygp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyB0aGUgYm94IGhhcyBubyBib3R0b20g
cGFkZGluZywgYW5kCisgICAgaWYgKGhhc1BhZGRpbmdBZnRlcihsYXlvdXRCb3gpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyB0aGUgYm94IGhhcyBubyBib3R0b20gYm9yZGVyLCBh
bmQKKyAgICBpZiAoaGFzQm9yZGVyQWZ0ZXIobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgLy8gdGhlIGNoaWxkJ3MgYm90dG9tIG1hcmdpbiBuZWl0aGVyIGNvbGxhcHNl
cyB3aXRoIGEgdG9wIG1hcmdpbiB0aGF0IGhhcyBjbGVhcmFuY2UuLi4KKyAgICBpZiAobWFyZ2lu
QWZ0ZXJDb2xsYXBzZXNXaXRoU2libGluZ01hcmdpbkJlZm9yZVdpdGhDbGVhcmFuY2UobGFzdElu
Rmxvd0NoaWxkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gbm9yIChpZiB0aGUg
Ym94J3MgbWluLWhlaWdodCBpcyBub24temVybykgd2l0aCB0aGUgYm94J3MgdG9wIG1hcmdpbi4K
KyAgICBhdXRvIGNvbXB1dGVkTWluSGVpZ2h0ID0gbGF5b3V0Qm94LnN0eWxlKCkubG9naWNhbE1p
bkhlaWdodCgpOworICAgIGlmICghY29tcHV0ZWRNaW5IZWlnaHQuaXNBdXRvKCkgJiYgY29tcHV0
ZWRNaW5IZWlnaHQudmFsdWUoKQorICAgICAgICAmJiAobWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRo
UGFyZW50TWFyZ2luQmVmb3JlKGxhc3RJbkZsb3dDaGlsZCkgfHwgaGFzQ2xlYXJhbmNlKGxhc3RJ
bkZsb3dDaGlsZCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBNYXJnaW5zIG9m
IGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCisgICAgaWYgKGxhc3RJbkZsb3dD
aGlsZC5pc0lubGluZUJsb2NrQm94KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8v
IFRoaXMgaXMgYSBxdWlyayBiZWhhdmlvcjogV2hlbiB0aGUgbWFyZ2luIGFmdGVyIG9mIHRoZSBs
YXN0IGluZmxvdyBjaGlsZCAob3IgYSBwcmV2aW91cyBzaWJsaW5nIHdpdGggY29sbGFwc2VkIHRo
cm91Z2ggbWFyZ2lucykKKyAgICAvLyBjb2xsYXBzZXMgd2l0aCBhIHF1aXJrIHBhcmVudCdzIHRo
ZSBtYXJnaW4gYmVmb3JlLCB0aGVuIHRoZSBzYW1lIG1hcmdpbiBhZnRlciBkb2VzIG5vdCBjb2xs
YXBzZXMgd2l0aCB0aGUgcGFyZW50J3MgbWFyZ2luIGFmdGVyLgorICAgIGlmIChmb3JtYXR0aW5n
Q29udGV4dCgpLnF1aXJrcygpLnNob3VsZElnbm9yZUNvbGxhcHNlZFF1aXJrTWFyZ2luKGxheW91
dEJveCkgJiYgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxhc3RJ
bkZsb3dDaGlsZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOwor
fQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5B
ZnRlckNvbGxhcHNlc1dpdGhOZXh0U2libGluZ01hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91
dEJveCkgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsK
KworICAgIGlmICghbGF5b3V0Qm94Lm5leHRJbkZsb3dTaWJsaW5nKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIHJldHVybiBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNT
aWJsaW5nTWFyZ2luQWZ0ZXIoKmxheW91dEJveC5uZXh0SW5GbG93U2libGluZygpKTsKK30KKwor
Ym9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luc0NvbGxh
cHNlVGhyb3VnaChjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5
b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKKworICAgIC8vIEEgYm94J3Mgb3duIG1hcmdpbnMg
Y29sbGFwc2UgaWYgdGhlICdtaW4taGVpZ2h0JyBwcm9wZXJ0eSBpcyB6ZXJvLCBhbmQgaXQgaGFz
IG5laXRoZXIgdG9wIG9yIGJvdHRvbSBib3JkZXJzIG5vciB0b3Agb3IgYm90dG9tIHBhZGRpbmcs
CisgICAgLy8gYW5kIGl0IGhhcyBhICdoZWlnaHQnIG9mIGVpdGhlciAwIG9yICdhdXRvJywgYW5k
IGl0IGRvZXMgbm90IGNvbnRhaW4gYSBsaW5lIGJveCwgYW5kIGFsbCBvZiBpdHMgaW4tZmxvdyBj
aGlsZHJlbidzIG1hcmdpbnMgKGlmIGFueSkgY29sbGFwc2UuCisgICAgaWYgKGhhc0JvcmRlckJl
Zm9yZShsYXlvdXRCb3gpIHx8IGhhc0JvcmRlckFmdGVyKGxheW91dEJveCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIGlmIChoYXNQYWRkaW5nQmVmb3JlKGxheW91dEJveCkgfHwgaGFz
UGFkZGluZ0FmdGVyKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8v
IE1hcmdpbnMgYXJlIG5vdCBhZGpvaW5pbmcgd2hlbiB0aGUgYm94IGhhcyBjbGVhcmFuY2UuCisg
ICAgaWYgKGhhc0NsZWFyYW5jZShsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOworICAgIGF1dG8gY29tcHV0ZWRI
ZWlnaHRWYWx1ZUlzWmVybyA9IHN0eWxlLmhlaWdodCgpLmlzRml4ZWQoKSAmJiAhc3R5bGUuaGVp
Z2h0KCkudmFsdWUoKTsKKyAgICBpZiAoIShzdHlsZS5oZWlnaHQoKS5pc0F1dG8oKSB8fCBjb21w
dXRlZEhlaWdodFZhbHVlSXNaZXJvKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8g
RklYTUU6IENoZWNrIGZvciBjb21wdXRlZCAwIGhlaWdodC4KKyAgICBpZiAoIXN0eWxlLm1pbkhl
aWdodCgpLmlzQXV0bygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTog
QmxvY2sgcmVwbGFjZWQgYm94ZXMgY2xlYXJseSBkb24ndCBjb2xsYXBzZSB0aHJvdWdoIHRoZWly
IG1hcmdpbnMsIGJ1dCBJIGNvdWxkbid0IGZpbmQgaXQgaW4gdGhlIHNwZWMgeWV0IChhbmQgbm8s
IGl0J3Mgbm90IGEgcXVpcmspLgorICAgIGlmIChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0
Qm94KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoIWRvd25jYXN0PENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dDaGlsZCgpKQorICAgICAgICByZXR1cm4gIWVzdGFi
bGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dChsYXlvdXRCb3gpOworCisgICAgaWYgKGxheW91
dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgaWYgKGxheW91
dEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgICAg
IGF1dG8mIGxheW91dFN0YXRlID0gdGhpcy0+bGF5b3V0U3RhdGUoKTsKKyAgICAgICAgICAgIC8v
IElmIHdlIGdldCBoZXJlIHRocm91Z2ggbWFyZ2luIGVzdGltYXRpb24sIHdlIGRvbid0IG5lY2Vz
c2FyaWx5IGhhdmUgYW4gYWN0dWFsIHN0YXRlIGZvciB0aGlzIGxheW91dCBib3ggc2luY2UKKyAg
ICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgc3RhcnRlZCBsYXlpbmcgaXQgb3V0IHlldC4KKyAgICAg
ICAgICAgIGF1dG8mIGNvbnRhaW5lckJveCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0
Qm94KTsKKyAgICAgICAgICAgIGlmICghbGF5b3V0U3RhdGUuaGFzSW5saW5lRm9ybWF0dGluZ1N0
YXRlKGNvbnRhaW5lckJveCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgICAgICBhdXRvIGlzQ29uc2lkZXJlZEVtcHR5ID0gWyZdIHsKKyAgICAgICAgICAgICAgICBh
dXRvJiBpbmxpbmVGb3JtYXR0aW5nU3RhdGUgPSBsYXlvdXRTdGF0ZS5lc3RhYmxpc2hlZElubGlu
ZUZvcm1hdHRpbmdTdGF0ZShjb250YWluZXJCb3gpOworICAgICAgICAgICAgICAgIGlmICghaW5s
aW5lRm9ybWF0dGluZ1N0YXRlLmxpbmVzKCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgLy8gQW55IGZsb2F0IGJveCBpbiB0aGlz
IGZvcm1hdHRpbmcgY29udGV4dCBwcmV2ZW50cyBjb2xsYXBzaW5nIHRocm91Z2guCisgICAgICAg
ICAgICAgICAgYXV0byYgZmxvYXRzID0gaW5saW5lRm9ybWF0dGluZ1N0YXRlLmZsb2F0aW5nU3Rh
dGUoKS5mbG9hdHMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGZsb2F0SXRlbSA6IGZs
b2F0cykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmxvYXRJdGVtLmlzSW5Gb3JtYXR0aW5n
Q29udGV4dE9mKGNvbnRhaW5lckJveCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHJldHVybiBpc0NvbnNpZGVyZWRFbXB0eSgpOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gQSByb290IG9mIGEgbm9uLWlubGluZSBmb3JtYXR0aW5n
IGNvbnRleHQgKHRhYmxlLCBmbGV4IGV0Yykgd2l0aCBpbmZsb3cgZGVzY2VuZGFudHMgc2hvdWxk
IG5vdCBjb2xsYXBzZSB0aHJvdWdoLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgZm9yIChhdXRvKiBpbmZsb3dDaGlsZCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0
Qm94KS5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpOyBpbmZsb3dDaGlsZDsgaW5mbG93Q2hp
bGQgPSBpbmZsb3dDaGlsZC0+bmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKKyAgICAg
ICAgaWYgKGVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgqaW5mbG93Q2hpbGQpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRo
cm91Z2goKmluZmxvd0NoaWxkKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdh
dGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6
Y29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9z
aXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBhLCBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0
aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgYikgY29uc3QKK3sKKyAgICBVc2VkVmVydGljYWxN
YXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgY29tcHV0ZWRWYWx1ZXM7Cisg
ICAgaWYgKGEucG9zaXRpdmUgJiYgYi5wb3NpdGl2ZSkKKyAgICAgICAgY29tcHV0ZWRWYWx1ZXMu
cG9zaXRpdmUgPSBzdGQ6Om1heCgqYS5wb3NpdGl2ZSwgKmIucG9zaXRpdmUpOworICAgIGVsc2UK
KyAgICAgICAgY29tcHV0ZWRWYWx1ZXMucG9zaXRpdmUgPSBhLnBvc2l0aXZlID8gYS5wb3NpdGl2
ZSA6IGIucG9zaXRpdmU7CisKKyAgICBpZiAoYS5uZWdhdGl2ZSAmJiBiLm5lZ2F0aXZlKQorICAg
ICAgICBjb21wdXRlZFZhbHVlcy5uZWdhdGl2ZSA9IHN0ZDo6bWluKCphLm5lZ2F0aXZlLCAqYi5u
ZWdhdGl2ZSk7CisgICAgZWxzZQorICAgICAgICBjb21wdXRlZFZhbHVlcy5uZWdhdGl2ZSA9IGEu
bmVnYXRpdmUgPyBhLm5lZ2F0aXZlIDogYi5uZWdhdGl2ZTsKKworICAgIGlmIChhLmlzTm9uWmVy
bygpICYmIGIuaXNOb25aZXJvKCkpCisgICAgICAgIGNvbXB1dGVkVmFsdWVzLmlzUXVpcmsgPSBh
LmlzUXVpcmsgfHwgYi5pc1F1aXJrOworICAgIGVsc2UgaWYgKGEuaXNOb25aZXJvKCkpCisgICAg
ICAgIGNvbXB1dGVkVmFsdWVzLmlzUXVpcmsgPSBhLmlzUXVpcms7CisgICAgZWxzZQorICAgICAg
ICBjb21wdXRlZFZhbHVlcy5pc1F1aXJrID0gYi5pc1F1aXJrOworCisgICAgcmV0dXJuIGNvbXB1
dGVkVmFsdWVzOworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luVmFsdWUoVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3Np
dGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIG1hcmdpblZhbHVlcykgY29uc3QKK3sKKyAgICAv
LyBXaGVuIHR3byBvciBtb3JlIG1hcmdpbnMgY29sbGFwc2UsIHRoZSByZXN1bHRpbmcgbWFyZ2lu
IHdpZHRoIGlzIHRoZSBtYXhpbXVtIG9mIHRoZSBjb2xsYXBzaW5nIG1hcmdpbnMnIHdpZHRocy4K
KyAgICAvLyBJbiB0aGUgY2FzZSBvZiBuZWdhdGl2ZSBtYXJnaW5zLCB0aGUgbWF4aW11bSBvZiB0
aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHRoZSBuZWdhdGl2ZSBhZGpvaW5pbmcgbWFyZ2lucyBpcyBk
ZWR1Y3RlZCBmcm9tIHRoZSBtYXhpbXVtCisgICAgLy8gb2YgdGhlIHBvc2l0aXZlIGFkam9pbmlu
ZyBtYXJnaW5zLiBJZiB0aGVyZSBhcmUgbm8gcG9zaXRpdmUgbWFyZ2lucywgdGhlIG1heGltdW0g
b2YgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgYWRqb2luaW5nIG1hcmdpbnMgaXMgZGVkdWN0
ZWQgZnJvbSB6ZXJvLgorICAgIGlmICghbWFyZ2luVmFsdWVzLm5lZ2F0aXZlKQorICAgICAgICBy
ZXR1cm4gbWFyZ2luVmFsdWVzLnBvc2l0aXZlOworCisgICAgaWYgKCFtYXJnaW5WYWx1ZXMucG9z
aXRpdmUpCisgICAgICAgIHJldHVybiBtYXJnaW5WYWx1ZXMubmVnYXRpdmU7CisKKyAgICByZXR1
cm4gKm1hcmdpblZhbHVlcy5wb3NpdGl2ZSArICptYXJnaW5WYWx1ZXMubmVnYXRpdmU7Cit9CisK
K3ZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OnVwZGF0ZU1hcmdp
bkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nKEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2NrRm9y
bWF0dGluZ0NvbnRleHQsIGNvbnN0IE1hcmdpbkNvbGxhcHNlJiBtYXJnaW5Db2xsYXBzZSwgY29u
c3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgLy8gMS4gR2V0IHRoZSBtYXJnaW4gYmVmb3JlIHZh
bHVlIGZyb20gdGhlIG5leHQgaW4tZmxvdyBzaWJsaW5nLiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRo
aXMgYm94J3MgbWFyZ2luIGFmdGVyIHZhbHVlIG5vdyBzaW5jZSB0aGV5IGFyZSBjb2xsYXBzZWQu
CisgICAgLy8gMi4gVXBkYXRlIHRoZSBjb2xsYXBzZWQgbWFyZ2luIGFmdGVyIHZhbHVlIGFzIHdl
bGwgYXMgdGhlIHBvc2l0aXZlL25lZ2F0aXZlIGNhY2hlLgorICAgIC8vIDMuIENoZWNrIGlmIHRo
ZSBib3gncyBtYXJnaW5zIGNvbGxhcHNlIHRocm91Z2guCisgICAgLy8gNC4gSWYgc28sIHVwZGF0
ZSB0aGUgcG9zaXRpdmUvbmVnYXRpdmUgY2FjaGUuCisgICAgLy8gNS4gSW4gY2FzZSBvZiBjb2xs
YXBzZWQgdGhyb3VnaCBtYXJnaW5zIGNoZWNrIGlmIHRoZSBiZWZvcmUgbWFyZ2luIGNvbGxhcGVz
IHdpdGggdGhlIHByZXZpb3VzIGluZmxvdyBzaWJsaW5nJ3MgYWZ0ZXIgbWFyZ2luLgorICAgIC8v
IDYuIElmIHNvLCBqdW1wIHRvICMyLgorICAgIC8vIDcuIE5vIG5lZWQgdG8gcHJvcGFnYXRlIHRv
IHBhcmVudCBiZWNhdXNlIGl0cyBtYXJnaW4gaXMgbm90IGNvbXB1dGVkIHlldCAocHJlLWNvbXB1
dGVkIGF0IG1vc3QpLgorICAgIGF1dG8qIGN1cnJlbnRCb3ggPSAmbGF5b3V0Qm94OworICAgIGF1
dG8mIGJsb2NrRm9ybWF0dGluZ1N0YXRlID0gYmxvY2tGb3JtYXR0aW5nQ29udGV4dC5mb3JtYXR0
aW5nU3RhdGUoKTsKKyAgICB3aGlsZSAobWFyZ2luQ29sbGFwc2UubWFyZ2luQmVmb3JlQ29sbGFw
c2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKCpjdXJyZW50Qm94KSkgeworICAgICAg
ICBhdXRvJiBwcmV2aW91c1NpYmxpbmcgPSAqY3VycmVudEJveC0+cHJldmlvdXNJbkZsb3dTaWJs
aW5nKCk7CisgICAgICAgIGF1dG8gcHJldmlvdXNTaWJsaW5nVmVydGljYWxNYXJnaW4gPSBibG9j
a0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNTaWJsaW5nKTsKKwor
ICAgICAgICBhdXRvIGNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luQmVmb3JlID0gcHJldmlvdXNTaWJs
aW5nVmVydGljYWxNYXJnaW4uY29sbGFwc2VkVmFsdWVzLmJlZm9yZTsKKyAgICAgICAgYXV0byBj
b2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkFmdGVyID0gYmxvY2tGb3JtYXR0aW5nQ29udGV4dC5nZW9t
ZXRyeUZvckJveCgqY3VycmVudEJveCkubWFyZ2luQmVmb3JlKCk7CisKKyAgICAgICAgYXV0byBt
YXJnaW5zQ29sbGFwc2VUaHJvdWdoID0gbWFyZ2luQ29sbGFwc2UubWFyZ2luc0NvbGxhcHNlVGhy
b3VnaChwcmV2aW91c1NpYmxpbmcpOworICAgICAgICBpZiAobWFyZ2luc0NvbGxhcHNlVGhyb3Vn
aCkKKyAgICAgICAgICAgIGNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luQmVmb3JlID0gY29sbGFwc2Vk
VmVydGljYWxNYXJnaW5BZnRlcjsKKworICAgICAgICAvLyBVcGRhdGUgcG9zaXRpdmUvbmVnYXRp
dmUgY2FjaGUuCisgICAgICAgIGF1dG8gcHJldmlvdXNTaWJsaW5nUG9zaXRpdmVOZWdhdGl2ZU1h
cmdpbiA9IGJsb2NrRm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihwcmV2aW91c1Np
YmxpbmcpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXM7CisgICAgICAgIGF1dG8gcG9zaXRpdmVO
ZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IGJsb2NrRm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1h
cmdpbigqY3VycmVudEJveCkucG9zaXRpdmVBbmROZWdhdGl2ZVZhbHVlcy5iZWZvcmU7CisKKyAg
ICAgICAgYXV0byBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luID0gcHJldmlv
dXNTaWJsaW5nVmVydGljYWxNYXJnaW47CisgICAgICAgIGFkanVzdGVkUHJldmlvdXNTaWJsaW5n
VmVydGljYWxNYXJnaW4ucG9zaXRpdmVBbmROZWdhdGl2ZVZhbHVlcy5hZnRlciA9IG1hcmdpbkNv
bGxhcHNlLmNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihwb3NpdGl2ZU5lZ2F0aXZl
TWFyZ2luQmVmb3JlLCBwcmV2aW91c1NpYmxpbmdQb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luLmFmdGVy
KTsKKyAgICAgICAgaWYgKG1hcmdpbnNDb2xsYXBzZVRocm91Z2gpIHsKKyAgICAgICAgICAgIGFk
anVzdGVkUHJldmlvdXNTaWJsaW5nVmVydGljYWxNYXJnaW4ucG9zaXRpdmVBbmROZWdhdGl2ZVZh
bHVlcy5iZWZvcmUgPSBtYXJnaW5Db2xsYXBzZS5jb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVN
YXJnaW4ocHJldmlvdXNTaWJsaW5nUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbi5iZWZvcmUsIGFkanVz
dGVkUHJldmlvdXNTaWJsaW5nVmVydGljYWxNYXJnaW4ucG9zaXRpdmVBbmROZWdhdGl2ZVZhbHVl
cy5hZnRlcik7CisgICAgICAgICAgICBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFy
Z2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0ZXIgPSBhZGp1c3RlZFByZXZpb3VzU2li
bGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlOworICAg
ICAgICB9CisgICAgICAgIGJsb2NrRm9ybWF0dGluZ1N0YXRlLnNldFVzZWRWZXJ0aWNhbE1hcmdp
bihwcmV2aW91c1NpYmxpbmcsIGFkanVzdGVkUHJldmlvdXNTaWJsaW5nVmVydGljYWxNYXJnaW4p
OworCisgICAgICAgIGlmICghbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCkKKyAgICAgICAgICAgIGJy
ZWFrOworCisgICAgICAgIGN1cnJlbnRCb3ggPSAmcHJldmlvdXNTaWJsaW5nOworICAgIH0KK30K
KworVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIEJs
b2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjpwb3NpdGl2ZU5lZ2F0aXZlVmFs
dWVzKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBNYXJnaW5UeXBlIG1hcmdpblR5cGUpIGNvbnN0Cit7
CisgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gZm9ybWF0dGluZ0NvbnRleHQoKS5mb3JtYXR0
aW5nU3RhdGUoKTsKKyAgICAvLyBCeSB0aGUgdGltZSB3ZSBnZXQgaGVyZSBpbiBCRkMgbGF5b3V0
IHRvIGdhdGhlciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgbWFyZ2luIHZhbHVlcyBmb3IgZWl0aGVy
IGEgcHJldmlvdXMgc2libGluZyBvciBhIGNoaWxkIGJveCwKKyAgICAvLyB3ZSBtdXNoIGhhdmUg
Y29tcHV0ZWQgYW5kIGNhY2hlZCB0aG9zZSB2YWx1ZXMuCisgICAgQVNTRVJUKGZvcm1hdHRpbmdT
dGF0ZS5oYXNVc2VkVmVydGljYWxNYXJnaW4obGF5b3V0Qm94KSk7CisgICAgYXV0byBwb3NpdGl2
ZUFuZE5lZ2F0aXZlVmVydGljYWxNYXJnaW4gPSBmb3JtYXR0aW5nU3RhdGUudXNlZFZlcnRpY2Fs
TWFyZ2luKGxheW91dEJveCkucG9zaXRpdmVBbmROZWdhdGl2ZVZhbHVlczsKKyAgICByZXR1cm4g
bWFyZ2luVHlwZSA9PSBNYXJnaW5UeXBlOjpCZWZvcmUgPyBwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVy
dGljYWxNYXJnaW4uYmVmb3JlIDogcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFm
dGVyOyAKK30KKworVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6
VmFsdWVzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjpwb3NpdGl2ZU5l
Z2F0aXZlTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBVc2VkVmVydGljYWxNYXJn
aW46Ok5vbkNvbGxhcHNlZFZhbHVlcyBub25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0Cit7CisgICAg
YXV0byBmaXJzdENoaWxkQ29sbGFwc2VkTWFyZ2luQmVmb3JlID0gWyZdKCkgLT4gVXNlZFZlcnRp
Y2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHsKKyAgICAgICAgaWYg
KCFtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoRmlyc3RJbkZsb3dDaGlsZE1hcmdpbkJlZm9yZShs
YXlvdXRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgcmV0dXJuIHBvc2l0
aXZlTmVnYXRpdmVWYWx1ZXMoKmRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5maXJz
dEluRmxvd0NoaWxkKCksIE1hcmdpblR5cGU6OkJlZm9yZSk7CisgICAgfTsKKworICAgIGF1dG8g
cHJldmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5BZnRlciA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNh
bE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7CisgICAgICAgIGlmICgh
bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGxheW91
dEJveCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICByZXR1cm4gcG9zaXRpdmVO
ZWdhdGl2ZVZhbHVlcygqbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpLCBNYXJnaW5U
eXBlOjpBZnRlcik7CisgICAgfTsKKworICAgIC8vIDEuIEdhdGhlciBwb3NpdGl2ZSBhbmQgbmVn
YXRpdmUgbWFyZ2luIHZhbHVlcyBmcm9tIGZpcnN0IGNoaWxkIGlmIG1hcmdpbnMgYXJlIGFkam9p
bmluZy4KKyAgICAvLyAyLiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1
ZXMgZnJvbSBwcmV2aW91cyBpbmZsb3cgc2libGluZyBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcu
CisgICAgLy8gMy4gQ29tcHV0ZSBtaW4vbWF4IHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBjb2xsYXBz
ZWQgbWFyZ2luIHZhbHVlcyB1c2luZyBub24tY29sbHBhc2VkIGNvbXB1dGVkIG1hcmdpbiBiZWZv
cmUuCisgICAgYXV0byBjb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSBjb21wdXRlZFBvc2l0aXZlQW5k
TmVnYXRpdmVNYXJnaW4oZmlyc3RDaGlsZENvbGxhcHNlZE1hcmdpbkJlZm9yZSgpLCBwcmV2aW91
U2libGluZ0NvbGxhcHNlZE1hcmdpbkFmdGVyKCkpOworICAgIGlmIChjb2xsYXBzZWRNYXJnaW5C
ZWZvcmUuaXNRdWlyayAmJiBmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJrcygpLnNob3VsZElnbm9y
ZUNvbGxhcHNlZFF1aXJrTWFyZ2luKGxheW91dEJveCkpCisgICAgICAgIGNvbGxhcHNlZE1hcmdp
bkJlZm9yZSA9IHsgfTsKKworICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdh
dGl2ZVBhaXI6OlZhbHVlcyBub25Db2xsYXBzZWRCZWZvcmU7CisgICAgaWYgKG5vbkNvbGxhcHNl
ZFZhbHVlcy5iZWZvcmUgPiAwKQorICAgICAgICBub25Db2xsYXBzZWRCZWZvcmUgPSB7IG5vbkNv
bGxhcHNlZFZhbHVlcy5iZWZvcmUsIHsgfSwgbGF5b3V0Qm94LnN0eWxlKCkuaGFzTWFyZ2luQmVm
b3JlUXVpcmsoKSB9OworICAgIGVsc2UgaWYgKG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUgPCAw
KQorICAgICAgICBub25Db2xsYXBzZWRCZWZvcmUgPSB7IHsgfSwgbm9uQ29sbGFwc2VkVmFsdWVz
LmJlZm9yZSwgbGF5b3V0Qm94LnN0eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSB9OworCisg
ICAgcmV0dXJuIGNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihjb2xsYXBzZWRNYXJn
aW5CZWZvcmUsIG5vbkNvbGxhcHNlZEJlZm9yZSk7Cit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbjo6
UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpN
YXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyBub25Db2xsYXBz
ZWRWYWx1ZXMpIGNvbnN0Cit7CisgICAgYXV0byBsYXN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5BZnRl
ciA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6
OlZhbHVlcyB7CisgICAgICAgIGlmICghbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoTGFzdEluRmxv
d0NoaWxkTWFyZ2luQWZ0ZXIobGF5b3V0Qm94KSkKKyAgICAgICAgICAgIHJldHVybiB7IH07Cisg
ICAgICAgIHJldHVybiBwb3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKCpkb3duY2FzdDxDb250YWluZXJC
b3g+KGxheW91dEJveCkubGFzdEluRmxvd0NoaWxkKCksIE1hcmdpblR5cGU6OkFmdGVyKTsKKyAg
ICB9OworCisgICAgLy8gV2UgZG9uJ3Qga25vdyB5ZXQgdGhlIG1hcmdpbiBiZWZvcmUgdmFsdWUg
b2YgdGhlIG5leHQgc2libGluZy4gTGV0J3MganVzdCBwcmV0ZW5kIGl0IGRvZXMgbm90IGhhdmUg
b25lIGFuZCAKKyAgICAvLyB1cGRhdGUgaXQgbGF0ZXIgd2hlbiB3ZSBjb21wdXRlIHRoZSBuZXh0
IHNpYmxpbmcncyBtYXJnaW4gYmVmb3JlLiBTZWUgdXBkYXRlTWFyZ2luQWZ0ZXJGb3JQcmV2aW91
c1NpYmxpbmcuCisgICAgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFp
cjo6VmFsdWVzIG5vbkNvbGxhcHNlZEFmdGVyOworICAgIGlmIChub25Db2xsYXBzZWRWYWx1ZXMu
YWZ0ZXIgPiAwKQorICAgICAgICBub25Db2xsYXBzZWRBZnRlciA9IHsgbm9uQ29sbGFwc2VkVmFs
dWVzLmFmdGVyLCB7IH0sIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkFmdGVyUXVpcmsoKSB9
OworICAgIGVsc2UgaWYgKG5vbkNvbGxhcHNlZFZhbHVlcy5hZnRlciA8IDApCisgICAgICAgIG5v
bkNvbGxhcHNlZEFmdGVyID0geyB7IH0sIG5vbkNvbGxhcHNlZFZhbHVlcy5hZnRlciwgbGF5b3V0
Qm94LnN0eWxlKCkuaGFzTWFyZ2luQWZ0ZXJRdWlyaygpIH07CisKKyAgICByZXR1cm4gY29tcHV0
ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKGxhc3RDaGlsZENvbGxhcHNlZE1hcmdpbkFmdGVy
KCksIG5vbkNvbGxhcHNlZEFmdGVyKTsKK30KKworTGF5b3V0VW5pdCBCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVmb3JlSWdub3JpbmdDb2xsYXBzaW5nVGhy
b3VnaChjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBz
ZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKQoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNC
bG9ja0xldmVsQm94KCkpOworICAgIHJldHVybiBtYXJnaW5WYWx1ZShwb3NpdGl2ZU5lZ2F0aXZl
TWFyZ2luQmVmb3JlKGxheW91dEJveCwgbm9uQ29sbGFwc2VkVmFsdWVzKSkudmFsdWVPcihub25D
b2xsYXBzZWRWYWx1ZXMuYmVmb3JlKTsKK30KKworVXNlZFZlcnRpY2FsTWFyZ2luIEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjpjb2xsYXBzZWRWZXJ0aWNhbFZhbHVlcyhj
b25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1
ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKQoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xl
dmVsQm94KCkpOworICAgIC8vIDEuIEdldCBtaW4vbWF4IG1hcmdpbiB0b3AgdmFsdWVzIGZyb20g
dGhlIGZpcnN0IGluLWZsb3cgY2hpbGQgaWYgd2UgYXJlIGNvbGxhcHNpbmcgbWFyZ2luIHRvcCB3
aXRoIGl0LgorICAgIC8vIDIuIEdldCBtaW4vbWF4IG1hcmdpbiB0b3AgdmFsdWVzIGZyb20gdGhl
IHByZXZpb3VzIGluLWZsb3cgc2libGluZywgaWYgd2UgYXJlIGNvbGxhcHNpbmcgbWFyZ2luIHRv
cCB3aXRoIGl0LgorICAgIC8vIDMuIEdldCB0aGlzIGxheW91dCBib3gncyBjb21wdXRlZCBtYXJn
aW4gdG9wIHZhbHVlLgorICAgIC8vIDQuIFVwZGF0ZSB0aGUgbWluL21heCB2YWx1ZSBhbmQgY29t
cHV0ZSB0aGUgZmluYWwgbWFyZ2luLgorICAgIGF1dG8gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRp
Y2FsTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpciB7
IHRoaXMtPnBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUobGF5b3V0Qm94LCBub25Db2xsYXBz
ZWRWYWx1ZXMpLCB0aGlzLT5wb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQWZ0ZXIobGF5b3V0Qm94LCBu
b25Db2xsYXBzZWRWYWx1ZXMpIH07CisKKyAgICBhdXRvIG1hcmdpbnNDb2xsYXBzZVRocm91Z2gg
PSB0aGlzLT5tYXJnaW5zQ29sbGFwc2VUaHJvdWdoKGxheW91dEJveCk7CisgICAgaWYgKG1hcmdp
bnNDb2xsYXBzZVRocm91Z2gpIHsKKyAgICAgICAgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2Fs
TWFyZ2luLmJlZm9yZSA9IGNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihwb3NpdGl2
ZUFuZE5lZ2F0aXZlVmVydGljYWxNYXJnaW4uYmVmb3JlLCBwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVy
dGljYWxNYXJnaW4uYWZ0ZXIpOworICAgICAgICBwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVydGljYWxN
YXJnaW4uYWZ0ZXIgPSBwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVydGljYWxNYXJnaW4uYmVmb3JlOwor
ICAgIH0KKworICAgIGF1dG8gaGFzQ29sbGFwc2VkTWFyZ2luQmVmb3JlID0gbWFyZ2luQmVmb3Jl
Q29sbGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJnaW5CZWZvcmUobGF5b3V0Qm94KSB8fCBt
YXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5nTWFyZ2luQWZ0ZXIobGF5b3V0
Qm94KTsKKyAgICBhdXRvIGhhc0NvbGxhcHNlZE1hcmdpbkFmdGVyID0gbWFyZ2luQWZ0ZXJDb2xs
YXBzZXNXaXRoTGFzdEluRmxvd0NoaWxkTWFyZ2luQWZ0ZXIobGF5b3V0Qm94KTsKKyAgICBhdXRv
IHVzZWRWZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbiB7IG5vbkNvbGxhcHNlZFZh
bHVlcywgeyB9LCBwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVydGljYWxNYXJnaW4gfTsKKworICAgIGlm
ICgoaGFzQ29sbGFwc2VkTWFyZ2luQmVmb3JlICYmIGhhc0NvbGxhcHNlZE1hcmdpbkFmdGVyKSB8
fCBtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKQorICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4uY29s
bGFwc2VkVmFsdWVzID0geyBtYXJnaW5WYWx1ZShwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVydGljYWxN
YXJnaW4uYmVmb3JlKSwgbWFyZ2luVmFsdWUocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFy
Z2luLmFmdGVyKSwgbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCB9OworICAgIGVsc2UgaWYgKGhhc0Nv
bGxhcHNlZE1hcmdpbkJlZm9yZSkKKyAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luLmNvbGxhcHNl
ZFZhbHVlcyA9IHsgbWFyZ2luVmFsdWUocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2lu
LmJlZm9yZSksIHsgfSwgZmFsc2UgfTsKKyAgICBlbHNlIGlmIChoYXNDb2xsYXBzZWRNYXJnaW5B
ZnRlcikKKyAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luLmNvbGxhcHNlZFZhbHVlcyA9IHsgeyB9
LCBtYXJnaW5WYWx1ZShwb3NpdGl2ZUFuZE5lZ2F0aXZlVmVydGljYWxNYXJnaW4uYWZ0ZXIpLCBm
YWxzZSB9OworICAgIHJldHVybiB1c2VkVmVydGljYWxNYXJnaW47Cit9CisKK30KK30KKyNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9i
bG9ja2Zvcm1hdHRpbmcvUHJlY29tcHV0ZWRCbG9ja01hcmdpbkNvbGxhcHNlLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL1ByZWNv
bXB1dGVkQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZGVmYjNkNTU0ZmU2OGRl
NDI3MzFmZjhlMmQ0YjIwZWFiZjY1OWVjMgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL1ByZWNvbXB1dGVk
QmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgor
CisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJCbG9j
a0Zvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxh
eW91dENvbnRhaW5lckJveC5oIgorI2luY2x1ZGUgIkxheW91dFN0YXRlLmgiCisjaW5jbHVkZSAi
TGF5b3V0VW5pdC5oIgorI2luY2x1ZGUgIlJlbmRlclN0eWxlLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZl
QW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29s
bGFwc2U6OnByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZVZhbHVlcyhjb25zdCBCb3gmIGxheW91
dEJveCkgY29uc3QKK3sKKyAgICBhdXRvJiBibG9ja0Zvcm1hdHRpbmdTdGF0ZSA9IGRvd25jYXN0
PEJsb2NrRm9ybWF0dGluZ1N0YXRlPihsYXlvdXRTdGF0ZSgpLmZvcm1hdHRpbmdTdGF0ZUZvckJv
eChsYXlvdXRCb3gpKTsKKyAgICBpZiAoYmxvY2tGb3JtYXR0aW5nU3RhdGUuaGFzVXNlZFZlcnRp
Y2FsTWFyZ2luKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBibG9ja0Zvcm1hdHRpbmdTdGF0
ZS51c2VkVmVydGljYWxNYXJnaW4obGF5b3V0Qm94KS5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVz
LmJlZm9yZTsKKworICAgIGF1dG8gZ2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21l
dHJ5KCk7CisgICAgYXV0byBob3Jpem9udGFsQ29uc3RyYWludHMgPSBnZW9tZXRyeS5jb25zdHJh
aW50c0ZvckluRmxvd0NvbnRlbnQobGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpKS5ob3Jpem9u
dGFsOworICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVk
VmVydGljYWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgIGF1
dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRW
YWx1ZXMgeyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21wdXRl
ZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKKyAgICByZXR1cm4gcHJlY29tcHV0
ZWRQb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGxheW91dEJveCwgbm9uQ29sbGFwc2VkTWFy
Z2luKTsKK30KKworVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6
VmFsdWVzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjpwcmVjb21wdXRl
ZFBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gsIFVzZWRW
ZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIG5vbkNvbGxhcHNlZFZhbHVlcykgY29u
c3QKK3sKKyAgICBhdXRvIGZpcnN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSBbJl0oKSAt
PiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgewor
ICAgICAgICBpZiAoIW1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxkTWFy
Z2luQmVmb3JlKGxheW91dEJveCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICBy
ZXR1cm4gcHJlY29tcHV0ZWRQb3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKCpkb3duY2FzdDxDb250YWlu
ZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dDaGlsZCgpKTsKKyAgICB9OworCisgICAgYXV0
byBwcmV2aW91U2libGluZ0NvbGxhcHNlZE1hcmdpbkFmdGVyID0gWyZdKCkgLT4gVXNlZFZlcnRp
Y2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHsKKyAgICAgICAgaWYg
KCFtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5nTWFyZ2luQWZ0ZXIobGF5
b3V0Qm94KSkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgIGF1dG8mIHByZXZpb3Vz
SW5GbG93U2libGluZyA9ICpsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7CisgICAg
ICAgIGF1dG8mIGJsb2NrRm9ybWF0dGluZ1N0YXRlID0gZG93bmNhc3Q8QmxvY2tGb3JtYXR0aW5n
U3RhdGU+KGxheW91dFN0YXRlKCkuZm9ybWF0dGluZ1N0YXRlRm9yQm94KHByZXZpb3VzSW5GbG93
U2libGluZykpOworICAgICAgICByZXR1cm4gYmxvY2tGb3JtYXR0aW5nU3RhdGUudXNlZFZlcnRp
Y2FsTWFyZ2luKHByZXZpb3VzSW5GbG93U2libGluZykucG9zaXRpdmVBbmROZWdhdGl2ZVZhbHVl
cy5hZnRlcjsKKyAgICB9OworCisgICAgLy8gMS4gR2F0aGVyIHBvc2l0aXZlIGFuZCBuZWdhdGl2
ZSBtYXJnaW4gdmFsdWVzIGZyb20gZmlyc3QgY2hpbGQgaWYgbWFyZ2lucyBhcmUgYWRqb2luaW5n
LgorICAgIC8vIDIuIEdhdGhlciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgbWFyZ2luIHZhbHVlcyBm
cm9tIHByZXZpb3VzIGluZmxvdyBzaWJsaW5nIGlmIG1hcmdpbnMgYXJlIGFkam9pbmluZy4KKyAg
ICAvLyAzLiBDb21wdXRlIG1pbi9tYXggcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGNvbGxhcHNlZCBt
YXJnaW4gdmFsdWVzIHVzaW5nIG5vbi1jb2xscGFzZWQgY29tcHV0ZWQgbWFyZ2luIGJlZm9yZS4K
KyAgICBhdXRvIGNvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IGNvbXB1dGVkUG9zaXRpdmVBbmROZWdh
dGl2ZU1hcmdpbihmaXJzdENoaWxkQ29sbGFwc2VkTWFyZ2luQmVmb3JlKCksIHByZXZpb3VTaWJs
aW5nQ29sbGFwc2VkTWFyZ2luQWZ0ZXIoKSk7CisgICAgaWYgKGNvbGxhcHNlZE1hcmdpbkJlZm9y
ZS5pc1F1aXJrICYmIGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkSWdub3JlQ29s
bGFwc2VkUXVpcmtNYXJnaW4obGF5b3V0Qm94KSkKKyAgICAgICAgY29sbGFwc2VkTWFyZ2luQmVm
b3JlID0geyB9OworCisgICAgYXV0byBub25Db2xsYXBzZWRCZWZvcmUgPSBVc2VkVmVydGljYWxN
YXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgeyB9OworICAgIGlmIChub25D
b2xsYXBzZWRWYWx1ZXMuYmVmb3JlID4gMCkKKyAgICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0g
eyBub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlLCB7IH0sIGxheW91dEJveC5zdHlsZSgpLmhhc01h
cmdpbkJlZm9yZVF1aXJrKCkgfTsKKyAgICBlbHNlIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYmVm
b3JlIDwgMCkKKyAgICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0geyB7IH0sIG5vbkNvbGxhcHNl
ZFZhbHVlcy5iZWZvcmUsIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkg
fTsKKworICAgIHJldHVybiBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4oY29sbGFw
c2VkTWFyZ2luQmVmb3JlLCBub25Db2xsYXBzZWRCZWZvcmUpOworfQorCitQcmVjb21wdXRlZE1h
cmdpbkJlZm9yZSBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cHJlY29t
cHV0ZWRNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gsIFVzZWRWZXJ0aWNhbE1hcmdp
bjo6Tm9uQ29sbGFwc2VkVmFsdWVzIHVzZWROb25Db2xsYXBzZWRNYXJnaW4pCit7CisgICAgQVNT
RVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7CisgICAgLy8gRG9uJ3QgcHJlLWNvbXB1
dGUgdmVydGljYWwgbWFyZ2lucyBmb3Igb3V0IG9mIGZsb3cgYm94ZXMuCisgICAgQVNTRVJUKGxh
eW91dEJveC5pc0luRmxvdygpIHx8IGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKTsK
KyAgICBBU1NFUlQoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpOworCisgICAgYXV0byBwb3Np
dGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlID0gcHJlY29tcHV0ZWRQb3NpdGl2ZU5lZ2F0aXZlTWFy
Z2luQmVmb3JlKGxheW91dEJveCwgdXNlZE5vbkNvbGxhcHNlZE1hcmdpbik7CisgICAgYXV0byBj
b2xsYXBzZWRNYXJnaW5CZWZvcmUgPSBtYXJnaW5WYWx1ZShwb3NpdGl2ZU5lZ2F0aXZlTWFyZ2lu
QmVmb3JlKTsKKyAgICByZXR1cm4geyB1c2VkTm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSwgY29s
bGFwc2VkTWFyZ2luQmVmb3JlLCBwb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlIH07Cit9CisK
K30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9y
bWF0dGluZ0NvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmFjNmRmNjVjYTRiYjcxMzYwNGVhYjcwMDE2
Y2Y3ZGVmMWMyMmYwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFw
cGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5jcHAKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgor
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
KyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGFibGVXcmFwcGVyQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQp
CisKKyNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkludmFsaWRh
dGlvblN0YXRlLmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKKyNpbmNsdWRlICJM
YXlvdXRDaGlsZEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgorI2luY2x1
ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKKyNpbmNsdWRlICJUYWJsZUZvcm1h
dHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExP
Q0FURURfSU1QTChUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KTsKKworVGFibGVX
cmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6VGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5n
Q29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgQmxvY2tG
b3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSkKKyAgICA6IEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQoZm9ybWF0dGluZ0NvbnRleHRSb290LCBmb3JtYXR0aW5nU3RhdGUpCit7Cit9CisKK3Zv
aWQgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0SW5GbG93Q29udGVu
dChJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYg
Y29uc3RyYWludHMpCit7CisgICAgLy8gVGhlIHRhYmxlIGdlbmVyYXRlcyBhIHByaW5jaXBhbCBi
bG9jayBjb250YWluZXIgYm94IGNhbGxlZCB0aGUgdGFibGUgd3JhcHBlciBib3ggdGhhdCBjb250
YWlucyB0aGUgdGFibGUgYm94IGl0c2VsZiBhbmQgYW55IGNhcHRpb24gYm94ZXMKKyAgICAvLyAo
aW4gZG9jdW1lbnQgb3JkZXIpLiBUaGUgdGFibGUgYm94IGlzIGEgYmxvY2stbGV2ZWwgYm94IHRo
YXQgY29udGFpbnMgdGhlIHRhYmxlJ3MgaW50ZXJuYWwgdGFibGUgYm94ZXMuCisgICAgLy8gVGhl
IGNhcHRpb24gYm94ZXMgYXJlIHByaW5jaXBhbCBibG9jay1sZXZlbCBib3hlcyB0aGF0IHJldGFp
biB0aGVpciBvd24gY29udGVudCwgcGFkZGluZywgbWFyZ2luLCBhbmQgYm9yZGVyIGFyZWFzLCBh
bmQgYXJlIHJlbmRlcmVkCisgICAgLy8gYXMgbm9ybWFsIGJsb2NrIGJveGVzIGluc2lkZSB0aGUg
dGFibGUgd3JhcHBlciBib3guIFdoZXRoZXIgdGhlIGNhcHRpb24gYm94ZXMgYXJlIHBsYWNlZCBi
ZWZvcmUgb3IgYWZ0ZXIgdGhlIHRhYmxlIGJveCBpcyBkZWNpZGVkIGJ5CisgICAgLy8gdGhlICdj
YXB0aW9uLXNpZGUnIHByb3BlcnR5LCBhcyBkZXNjcmliZWQgYmVsb3cuCisgICAgZm9yIChhdXRv
JiBjaGlsZCA6IGNoaWxkcmVuT2ZUeXBlPENvbnRhaW5lckJveD4ocm9vdCgpKSkgeworICAgICAg
ICBpZiAoY2hpbGQuaXNUYWJsZUJveCgpKQorICAgICAgICAgICAgbGF5b3V0VGFibGVCb3goY2hp
bGQsIGNvbnN0cmFpbnRzKTsKKyAgICAgICAgZWxzZSBpZiAoY2hpbGQuaXNUYWJsZUNhcHRpb24o
KSkKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KK30KKwordm9pZCBU
YWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRUYWJsZUJveChjb25zdCBD
b250YWluZXJCb3gmIHRhYmxlQm94LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQm
IGNvbnN0cmFpbnRzKQoreworICAgIGxheW91dFN0YXRlKCkuZW5zdXJlVGFibGVGb3JtYXR0aW5n
U3RhdGUodGFibGVCb3gpOworCisgICAgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmdGb3JUYWJsZUJv
eCh0YWJsZUJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAgY29tcHV0ZVN0YXRpY1Zl
cnRpY2FsUG9zaXRpb24odGFibGVCb3gsIGNvbnN0cmFpbnRzLnZlcnRpY2FsKTsKKyAgICBjb21w
dXRlV2lkdGhBbmRNYXJnaW5Gb3JUYWJsZUJveCh0YWJsZUJveCwgY29uc3RyYWludHMuaG9yaXpv
bnRhbCk7CisgICAgY29tcHV0ZVN0YXRpY0hvcml6b250YWxQb3NpdGlvbih0YWJsZUJveCwgY29u
c3RyYWludHMuaG9yaXpvbnRhbCk7CisKKyAgICBpZiAodGFibGVCb3guaGFzQ2hpbGQoKSkgewor
ICAgICAgICBhdXRvIGludmFsaWRhdGlvblN0YXRlID0gSW52YWxpZGF0aW9uU3RhdGUgeyB9Owor
ICAgICAgICBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dCh0YWJsZUJveCwg
bGF5b3V0U3RhdGUoKSktPmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGdl
b21ldHJ5KCkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KHRhYmxlQm94KSk7CisgICAgfQor
CisgICAgY29tcHV0ZUhlaWdodEFuZE1hcmdpbkZvclRhYmxlQm94KHRhYmxlQm94LCBjb25zdHJh
aW50cyk7Cit9CisKK3ZvaWQgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29t
cHV0ZUJvcmRlckFuZFBhZGRpbmdGb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxl
Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykK
K3sKKyAgICBBU1NFUlQodGFibGVCb3guaXNUYWJsZUJveCgpKTsKKyAgICBpZiAoIXRhYmxlQm94
Lmhhc0NoaWxkKCkgfHwgdGFibGVCb3guc3R5bGUoKS5ib3JkZXJDb2xsYXBzZSgpID09IEJvcmRl
ckNvbGxhcHNlOjpTZXBhcmF0ZSkgeworICAgICAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpj
b21wdXRlQm9yZGVyQW5kUGFkZGluZyh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBVQXMgbXVzdCBjb21wdXRlIGFuIGluaXRp
YWwgbGVmdCBhbmQgcmlnaHQgYm9yZGVyIHdpZHRoIGZvciB0aGUgdGFibGUgYnkgZXhhbWluaW5n
CisgICAgLy8gdGhlIGZpcnN0IGFuZCBsYXN0IGNlbGxzIGluIHRoZSBmaXJzdCByb3cgb2YgdGhl
IHRhYmxlLgorICAgIC8vIFRoZSBsZWZ0IGJvcmRlciB3aWR0aCBvZiB0aGUgdGFibGUgaXMgaGFs
ZiBvZiB0aGUgZmlyc3QgY2VsbCdzIGNvbGxhcHNlZCBsZWZ0IGJvcmRlciwKKyAgICAvLyBhbmQg
dGhlIHJpZ2h0IGJvcmRlciB3aWR0aCBvZiB0aGUgdGFibGUgaXMgaGFsZiBvZiB0aGUgbGFzdCBj
ZWxsJ3MgY29sbGFwc2VkIHJpZ2h0IGJvcmRlci4KKyAgICAvLyBUaGUgdG9wIGJvcmRlciB3aWR0
aCBvZiB0aGUgdGFibGUgaXMgY29tcHV0ZWQgYnkgZXhhbWluaW5nIGFsbCBjZWxscyB3aG8gY29s
bGFwc2UgdGhlaXIgdG9wCisgICAgLy8gYm9yZGVycyB3aXRoIHRoZSB0b3AgYm9yZGVyIG9mIHRo
ZSB0YWJsZS4gVGhlIHRvcCBib3JkZXIgd2lkdGggb2YgdGhlIHRhYmxlIGlzIGVxdWFsIHRvIGhh
bGYgb2YgdGhlCisgICAgLy8gbWF4aW11bSBjb2xsYXBzZWQgdG9wIGJvcmRlci4gVGhlIGJvdHRv
bSBib3JkZXIgd2lkdGggaXMgY29tcHV0ZWQgYnkgZXhhbWluaW5nIGFsbCBjZWxscyB3aG9zZSBi
b3R0b20gYm9yZGVycyBjb2xsYXBzZQorICAgIC8vIHdpdGggdGhlIGJvdHRvbSBvZiB0aGUgdGFi
bGUuIFRoZSBib3R0b20gYm9yZGVyIHdpZHRoIGlzIGVxdWFsIHRvIGhhbGYgb2YgdGhlIG1heGlt
dW0gY29sbGFwc2VkIGJvdHRvbSBib3JkZXIuCisgICAgYXV0byYgZ3JpZCA9IGxheW91dFN0YXRl
KCkuZXN0YWJsaXNoZWRUYWJsZUZvcm1hdHRpbmdTdGF0ZSh0YWJsZUJveCkudGFibGVHcmlkKCk7
CisgICAgYXV0byB0YWJsZUJvcmRlciA9IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIodGFibGVC
b3gpOworCisgICAgYXV0byYgZmlyc3RDb2x1bW5GaXJzdFJvd0JveCA9IGdyaWQuc2xvdCh7IDAg
LCAwIH0pLT5jZWxsKCkuYm94KCk7CisgICAgYXV0byBsZWZ0Qm9yZGVyID0gc3RkOjptYXgodGFi
bGVCb3JkZXIuaG9yaXpvbnRhbC5sZWZ0LCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKGZpcnN0
Q29sdW1uRmlyc3RSb3dCb3gpLmhvcml6b250YWwubGVmdCk7CisKKyAgICBhdXRvJiBsYXN0Q29s
dW1uRmlyc3RSb3cgPSBncmlkLnNsb3QoeyBncmlkLmNvbHVtbnMoKS5zaXplKCkgLSAxLCAwIH0p
LT5jZWxsKCkuYm94KCk7CisgICAgYXV0byByaWdodEJvcmRlciA9IHN0ZDo6bWF4KHRhYmxlQm9y
ZGVyLmhvcml6b250YWwucmlnaHQsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIobGFzdENvbHVt
bkZpcnN0Um93KS5ob3Jpem9udGFsLnJpZ2h0KTsKKworICAgIGF1dG8gdG9wQm9yZGVyID0gdGFi
bGVCb3JkZXIudmVydGljYWwudG9wOworICAgIGF1dG8gYm90dG9tQm9yZGVyID0gdGFibGVCb3Jk
ZXIudmVydGljYWwuYm90dG9tOworICAgIGF1dG8gbGFzdFJvd0luZGV4ID0gZ3JpZC5yb3dzKCku
c2l6ZSgpIC0gMTsKKyAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4
IDwgZ3JpZC5jb2x1bW5zKCkuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7CisgICAgICAgIGF1dG8m
IGJveEluRmlyc3RSb3ggPSBncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgMCB9KS0+Y2VsbCgpLmJv
eCgpOworICAgICAgICBhdXRvJiBib3hJbkxhc3RSb3cgPSBncmlkLnNsb3QoeyBjb2x1bW5JbmRl
eCwgbGFzdFJvd0luZGV4IH0pLT5jZWxsKCkuYm94KCk7CisKKyAgICAgICAgdG9wQm9yZGVyID0g
c3RkOjptYXgodG9wQm9yZGVyLCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKGJveEluRmlyc3RS
b3gpLnZlcnRpY2FsLnRvcCk7CisgICAgICAgIGJvdHRvbUJvcmRlciA9IHN0ZDo6bWF4KGJvdHRv
bUJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihib3hJbkxhc3RSb3cpLnZlcnRpY2Fs
LmJvdHRvbSk7CisgICAgfQorCisgICAgdG9wQm9yZGVyID0gc3RkOjptYXgodG9wQm9yZGVyLCBn
ZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKCp0YWJsZUJveC5maXJzdENoaWxkKCkpLnZlcnRpY2Fs
LnRvcCk7CisgICAgZm9yIChhdXRvJiBzZWN0aW9uIDogY2hpbGRyZW5PZlR5cGU8Q29udGFpbmVy
Qm94Pih0YWJsZUJveCkpIHsKKyAgICAgICAgYXV0byBob3JpenRvbmFsQm9yZGVyID0gZ2VvbWV0
cnkoKS5jb21wdXRlZEJvcmRlcihzZWN0aW9uKS5ob3Jpem9udGFsOworICAgICAgICBsZWZ0Qm9y
ZGVyID0gc3RkOjptYXgobGVmdEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5sZWZ0KTsKKyAgICAg
ICAgcmlnaHRCb3JkZXIgPSBzdGQ6Om1heChyaWdodEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5y
aWdodCk7CisgICAgfQorICAgIGJvdHRvbUJvcmRlciA9IHN0ZDo6bWF4KGJvdHRvbUJvcmRlciwg
Z2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcigqdGFibGVCb3gubGFzdENoaWxkKCkpLnZlcnRpY2Fs
LmJvdHRvbSk7CisKKyAgICBhdXRvJiByb3dzID0gZ3JpZC5yb3dzKCkubGlzdCgpOworICAgIHRv
cEJvcmRlciA9IHN0ZDo6bWF4KHRvcEJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihy
b3dzLmZpcnN0KCkuYm94KCkpLnZlcnRpY2FsLnRvcCk7CisgICAgZm9yIChhdXRvJiByb3cgOiBy
b3dzKSB7CisgICAgICAgIGF1dG8gaG9yaXp0b25hbEJvcmRlciA9IGdlb21ldHJ5KCkuY29tcHV0
ZWRCb3JkZXIocm93LmJveCgpKS5ob3Jpem9udGFsOworICAgICAgICBsZWZ0Qm9yZGVyID0gc3Rk
OjptYXgobGVmdEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5sZWZ0KTsKKyAgICAgICAgcmlnaHRC
b3JkZXIgPSBzdGQ6Om1heChyaWdodEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5yaWdodCk7Cisg
ICAgfQorICAgIGJvdHRvbUJvcmRlciA9IHN0ZDo6bWF4KGJvdHRvbUJvcmRlciwgZ2VvbWV0cnko
KS5jb21wdXRlZEJvcmRlcihyb3dzLmxhc3QoKS5ib3goKSkudmVydGljYWwuYm90dG9tKTsKKwor
ICAgIGF1dG8gY29sbGFwc2VkQm9yZGVyID0gRWRnZXMgeyB7IGxlZnRCb3JkZXIsIHJpZ2h0Qm9y
ZGVyIH0sIHsgdG9wQm9yZGVyLCBib3R0b21Cb3JkZXIgfSB9OworICAgIGdyaWQuc2V0Q29sbGFw
c2VkQm9yZGVyKGNvbGxhcHNlZEJvcmRlcik7CisKKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZv
cm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KHRhYmxlQm94KTsKKyAgICBib3hHZW9tZXRyeS5z
ZXRCb3JkZXIoY29sbGFwc2VkQm9yZGVyIC8gMik7CisgICAgYm94R2VvbWV0cnkuc2V0UGFkZGlu
ZyhnZW9tZXRyeSgpLmNvbXB1dGVkUGFkZGluZyh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLmxvZ2ljYWxXaWR0aCkpOworfQorCit2b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ6OmNvbXB1dGVXaWR0aEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5l
ckJveCYgdGFibGVCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENv
bnN0cmFpbnRzKQoreworICAgIEFTU0VSVCh0YWJsZUJveC5pc1RhYmxlQm94KCkpOworICAgIC8v
IFRoaXMgaXMgYSBzcGVjaWFsIHRhYmxlICJmaXQtY29udGVudCBzaXplIiBiZWhhdmlvciBoYW5k
bGluZy4gTm90IGluIHRoZSBzcGVjIHRob3VnaC4KKyAgICAvLyBUYWJsZSByZXR1cm5zIGl0cyBm
aW5hbCB3aWR0aCBhcyBtaW4vbWF4LiBVc2UgdGhpcyBmaW5hbCB3aWR0aCB2YWx1ZSB0byBjb21w
dXRlZCBob3Jpem9udGFsIG1hcmdpbnMgZXRjLgorICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZUZv
clRhYmxlQm94ID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZFRhYmxlRm9ybWF0dGluZ1N0YXRl
KHRhYmxlQm94KTsKKyAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKKyAgICBpZiAoYXV0byBwcmVjb21wdXRlZEludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMgPSBmb3JtYXR0aW5nU3RhdGVGb3JUYWJsZUJveC5pbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzKCkpCisgICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSAq
cHJlY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOworICAgIGVsc2UgeworICAgICAg
ICBpZiAodGFibGVCb3guaGFzQ2hpbGQoKSkKKyAgICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dCh0YWJsZUJv
eCwgbGF5b3V0U3RhdGUoKSktPmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOwor
ICAgICAgICBmb3JtYXR0aW5nU3RhdGVGb3JUYWJsZUJveC5zZXRJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzKGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMpOworICAgIH0KKworICAgIGF1dG8gYXZh
aWxhYmxlSG9yaXpvbnRhbFNwYWNlID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0
aDsKKyAgICAvLyAxLiBUaGUgdGFibGUgZ2VuZXJhdGVzIGEgcHJpbmNpcGFsIGJsb2NrIGNvbnRh
aW5lciBib3ggY2FsbGVkIHRoZSB0YWJsZSB3cmFwcGVyIGJveCB0aGF0IGNvbnRhaW5zIHRoZSB0
YWJsZSBib3ggaXRzZWxmIGFuZCBhbnkgY2FwdGlvbiBib3hlcy4KKyAgICAvLyAyLiBUaGUgdGFi
bGUgd3JhcHBlciBib3ggZXN0YWJsaXNoZXMgYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGFu
ZCB0aGUgdGFibGUgYm94IGVzdGFibGlzaGVzIGEgdGFibGUgZm9ybWF0dGluZyBjb250ZXh0Lgor
ICAgIC8vIDMuIFRoZSBjb21wdXRlZCB2YWx1ZXMgb2YgcHJvcGVydGllcyAncG9zaXRpb24nLCAn
ZmxvYXQnLCAnbWFyZ2luLSonLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsIGFuZCAnbGVmdCcg
b24KKyAgICAvLyAgICB0aGUgdGFibGUgZWxlbWVudCBhcmUgdXNlZCBvbiB0aGUgdGFibGUgd3Jh
cHBlciBib3ggYW5kIG5vdCB0aGUgdGFibGUgYm94OyBhbGwgb3RoZXIgdmFsdWVzIG9mIG5vbi1p
bmhlcml0YWJsZQorICAgIC8vICAgIHByb3BlcnRpZXMgYXJlIHVzZWQgb24gdGhlIHRhYmxlIGJv
eCBhbmQgbm90IHRoZSB0YWJsZSB3cmFwcGVyIGJveC4KKyAgICAvLyA0LiBJbiBhIGJsb2NrIGZv
cm1hdHRpbmcgY29udGV4dCwgZWFjaCBib3gncyBsZWZ0IG91dGVyIGVkZ2UgdG91Y2hlcyB0aGUg
bGVmdCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrLgorICAgIC8vICAgIFRoaXMgaXMgdHJ1
ZSBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiBmbG9hdHMsIHVubGVzcyB0aGUgYm94IGVzdGFibGlz
aGVzIGEgbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCAoaW4gd2hpY2ggY2FzZSB0aGUKKyAg
ICAvLyAgICBib3ggaXRzZWxmIG1heSBiZWNvbWUgbmFycm93ZXIgZHVlIHRvIHRoZSBmbG9hdHMp
CisgICAgLy8KKyAgICAvLyBOb3cgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBjYXNlOgorICAgIC8v
IDxkaXYgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KKyAgICAvLyAgICAg
PGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiAxMDBweDsiPjwvZGl2PgorICAgIC8vICAg
ICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogdGFibGU7IHdpZHRoOiAxMCU7Ij48L2Rpdj4KKyAg
ICAvLyAgICAgPC9kaXY+CisgICAgLy8gPC9kaXY+CisgICAgLy8gMS4gV2UgY3JlYXRlIGEgdGFi
bGUgd3JhcHBlciBib3ggdG8gd3JhcCB0aGUgImRpc3BsYXk6IHRhYmxlIiBibG9jayBsZXZlbCBi
b3ggKCMxKS4KKyAgICAvLyAyLiBUaGUgdGFibGUgd3JhcHBlciBib3gncyB3aWR0aCBwcm9wZXJ0
eSBpcyBzZXQgdG8gYXV0byAoIzMpLgorICAgIC8vIDMuIFNpbmNlIGl0IGVzdGFibGlzaGVzIGEg
bmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCwgdGhlIGF2YWlsYWJsZSBob3Jpem9udGFsIHNw
YWNlIGdldHMgc2hydW5rIGJ5IHRoZSBmbG9hdCAoIzQpCisgICAgLy8gNC4gVGhlIHRhYmxlIHdy
YXBwZXIgYm94J3MgdXNlZCB3aWR0aCBjb21wdXRlcyB0byA1MDBweCAtIDEwMHB4IC0+IDQwMHB4
OworICAgIC8vCisgICAgLy8gTm93IHdlIGFyZSBpbnNpZGUgdGhlIEJGQyBlc3RhYmxpc2hlZCBi
eSB0aGUgdGFibGUgd3JhcHBlciBib3ggYW5kIHRyeSB0byByZXNvbHZlIHRoZSB0YWJsZSdzIHdp
ZHRoIC0+ICUxMC4KKyAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIG5vcm1hbCBCRkMgcnVsZXMsIGl0
IHNob3VsZCBjb21wdXRlIHRvIDEwJSBvZiB0aGUgY29udGFpbmluZyBibG9jaydzIGxvZ2ljYWwg
d2lkdGg6IDQwMHB4IC0+IDQwcHguCisgICAgLy8gSG93ZXZlciBpbiBwcmFjdGljZSBpdCBjb21w
dXRlcyB0byA1MHB4ICgxMCUgb2YgNTAwcHgpLgorICAgIC8vIFNpbWlsYXIgc2V0dXAgd2l0aCBu
b24tdGFibGUgY29udGVudCB3b3VsZCByZXNvbHZlIHRoZSBpbm5lciBibG9jayBsZXZlbCBib3gn
cyB3aWR0aCB0byA0MHB4OworICAgIC8vIFRoaXMgbmVlZHMgY2xhcmlmaWNhdGlvbiBpbiB0aGUg
c3BlYy4KKyAgICBhdXRvIGhvcml6b250YWxDb25zdHJhaW50Rm9yUmVzb2x2aW5nV2lkdGggPSBt
X2hvcml6b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxvYXRzLmxvZ2ljYWxXaWR0aDsKKyAgICBh
dXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2VvbWV0cnkoKTsKKyAgICBhdXRvIGNvbXB1dGVkV2lkdGgg
PSBnZW9tZXRyeS5jb21wdXRlZFdpZHRoKHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludEZv
clJlc29sdmluZ1dpZHRoKTsKKyAgICBhdXRvIGNvbXB1dGVkTWF4V2lkdGggPSBnZW9tZXRyeS5j
b21wdXRlZE1heFdpZHRoKHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29sdmlu
Z1dpZHRoKTsKKyAgICBhdXRvIGNvbXB1dGVkTWluV2lkdGggPSBnZW9tZXRyeS5jb21wdXRlZE1p
bldpZHRoKHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRoKTsK
KyAgICAvLyBVc2UgdGhlIGdlbmVyaWMgc2hyaW5rLXRvLWZpdC13aWR0aCBsb2dpYyBhcyB0aGUg
aW5pdGlhbCB3aWR0aCBmb3IgdGhlIHRhYmxlLgorICAgIGF1dG8gdXNlZFdpZHRoID0gc3RkOjpt
aW4oc3RkOjptYXgoaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtLCBhdmFpbGFibGVI
b3Jpem9udGFsU3BhY2UpLCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0pOworICAg
IGlmIChjb21wdXRlZFdpZHRoIHx8IGNvbXB1dGVkTWluV2lkdGggfHwgY29tcHV0ZWRNYXhXaWR0
aCkgeworICAgICAgICBpZiAoY29tcHV0ZWRXaWR0aCkgeworICAgICAgICAgICAgLy8gTm9ybWFs
aXplIHRoZSBjb21wdXRlZCB3aWR0aCB2YWx1ZSBmaXJzdC4KKyAgICAgICAgICAgIGlmIChjb21w
dXRlZE1heFdpZHRoICYmICpjb21wdXRlZFdpZHRoID4gKmNvbXB1dGVkTWF4V2lkdGgpCisgICAg
ICAgICAgICAgICAgY29tcHV0ZWRXaWR0aCA9IGNvbXB1dGVkTWF4V2lkdGg7CisgICAgICAgICAg
ICBpZiAoY29tcHV0ZWRNaW5XaWR0aCAmJiAqY29tcHV0ZWRXaWR0aCA8ICpjb21wdXRlZE1pbldp
ZHRoKQorICAgICAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggPSBjb21wdXRlZE1pbldpZHRoOwor
ICAgICAgICAgICAgdXNlZFdpZHRoID0gKmNvbXB1dGVkV2lkdGggPCBpbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzLm1pbmltdW0gPyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0gOiAq
Y29tcHV0ZWRXaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb21wdXRlZE1heFdpZHRo
ICYmICpjb21wdXRlZE1heFdpZHRoIDwgdXNlZFdpZHRoKQorICAgICAgICAgICAgdXNlZFdpZHRo
ID0gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtOworICAgICAgICBpZiAoY29tcHV0
ZWRNaW5XaWR0aCAmJiAqY29tcHV0ZWRNaW5XaWR0aCA+IHVzZWRXaWR0aCkKKyAgICAgICAgICAg
IHVzZWRXaWR0aCA9ICpjb21wdXRlZE1pbldpZHRoOworICAgIH0KKworICAgIGF1dG8gY29udGVu
dFdpZHRoQW5kTWFyZ2luID0gZ2VvbWV0cnkuaW5GbG93Q29udGVudFdpZHRoQW5kTWFyZ2luKHRh
YmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVz
IHsgdXNlZFdpZHRoLCB7IH0gfSk7CisKKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRp
bmdTdGF0ZSgpLmJveEdlb21ldHJ5KHRhYmxlQm94KTsKKyAgICBib3hHZW9tZXRyeS5zZXRDb250
ZW50Qm94V2lkdGgoY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCk7CisgICAgYm94
R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2Vk
TWFyZ2luLnN0YXJ0LCBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgfSk7Cit9
CisKK3ZvaWQgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUhlaWdo
dEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gsIGNvbnN0
IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgQVNTRVJU
KHRhYmxlQm94LmlzVGFibGVCb3goKSk7CisgICAgLy8gVGFibGUgaXMgYSBzcGVjaWFsIEJGQyBj
b250ZW50LiBJdHMgaGVpZ2h0IGlzIG1haW5seSBkcml2ZW4gYnkgdGhlIGNvbnRlbnQuIENvbXB1
dGVkIGhlaWdodCwgbWluLWhlaWdodCBhbmQgbWF4LWhlaWdodCBhcmUgYWxsCisgICAgLy8gYWxy
ZWFkeSBiZWVuIHRha2VuIGludG8gYWNjb3VudCBkdXJpbmcgdGhlIFRGQyBsYXlvdXQuCisgICAg
YXV0byBoZWlnaHRBbmRNYXJnaW4gPSBnZW9tZXRyeSgpLmluRmxvd0NvbnRlbnRIZWlnaHRBbmRN
YXJnaW4odGFibGVCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIHsgcXVpcmtzKCkub3ZlcnJp
ZGRlblRhYmxlSGVpZ2h0KHRhYmxlQm94KSB9KTsKKworICAgIGF1dG8gbWFyZ2luQ29sbGFwc2Ug
PSB0aGlzLT5tYXJnaW5Db2xsYXBzZSgpOworICAgIGF1dG8gdmVydGljYWxNYXJnaW4gPSBtYXJn
aW5Db2xsYXBzZS5jb2xsYXBzZWRWZXJ0aWNhbFZhbHVlcyh0YWJsZUJveCwgaGVpZ2h0QW5kTWFy
Z2luLm5vbkNvbGxhcHNlZE1hcmdpbik7CisgICAgLy8gQ2FjaGUgdGhlIGNvbXB1dGVkIHBvc2l0
aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWUgcGFpci4KKyAgICBmb3JtYXR0aW5nU3RhdGUo
KS5zZXRVc2VkVmVydGljYWxNYXJnaW4odGFibGVCb3gsIHZlcnRpY2FsTWFyZ2luKTsKKworICAg
IGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkodGFibGVC
b3gpOworICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3AodmVydGljYWxQb3NpdGlvbldpdGhN
YXJnaW4odGFibGVCb3gsIHZlcnRpY2FsTWFyZ2luLCBjb25zdHJhaW50cy52ZXJ0aWNhbCkpOwor
ICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoaGVpZ2h0QW5kTWFyZ2luLmNvbnRl
bnRIZWlnaHQpOworICAgIGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgbWFyZ2luQmVm
b3JlKHZlcnRpY2FsTWFyZ2luKSwgbWFyZ2luQWZ0ZXIodmVydGljYWxNYXJnaW4pIH0pOworICAg
IC8vIEFkanVzdCB0aGUgcHJldmlvdXMgc2libGluZydzIG1hcmdpbiBib3R0b20gbm93IHRoYXQg
dGhpcyBib3gncyB2ZXJ0aWNhbCBtYXJnaW4gaXMgY29tcHV0ZWQuCisgICAgTWFyZ2luQ29sbGFw
c2U6OnVwZGF0ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nKCp0aGlzLCBtYXJnaW5Db2xs
YXBzZSwgdGFibGVCb3gpOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3
cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBl
ci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGRlYTE1
N2NjNTIxNmY4ODRmZDI4OTgzNGEzYzg2Njk1Mzc0MjdhNQotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL3Rh
Ymxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgKQEAgLTAsMCAr
MSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
KyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisg
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9G
T1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Lmgi
CisjaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1l
c3BhY2UgTGF5b3V0IHsKKworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzcGVjaWFsIGJs
b2NrIGZvcm1hdHRpbmcgY29udGV4dCBsYXlvdXQgbG9naWMgZm9yIHRoZSB0YWJsZSB3cmFwcGVy
LgorLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIyL3RhYmxlcy5odG1sI21vZGVsCitjbGFz
cyBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0IGZpbmFsIDogcHVibGljIEJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVXcmFw
cGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCk7CitwdWJsaWM6CisgICAgVGFibGVXcmFwcGVyQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0
Um9vdCwgQmxvY2tGb3JtYXR0aW5nU3RhdGUmKTsKKworICAgIHZvaWQgbGF5b3V0SW5GbG93Q29u
dGVudChJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVu
dCYpIGZpbmFsOworCisgICAgdm9pZCBzZXRIb3Jpem9udGFsQ29uc3RyYWludHNJZ25vcmluZ0Zs
b2F0cyhjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykg
eyBtX2hvcml6b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxvYXRzID0gaG9yaXpvbnRhbENvbnN0
cmFpbnRzOyB9CisKK3ByaXZhdGU6CisgICAgY2xhc3MgUXVpcmtzIDogcHVibGljIEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6OlF1aXJrcyB7CisgICAgcHVibGljOgorICAgICAgICBRdWlya3MoY29u
c3QgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYpOworCisgICAgICAgIE9wdGlv
bmFsPExheW91dFVuaXQ+IG92ZXJyaWRkZW5UYWJsZUhlaWdodChjb25zdCBDb250YWluZXJCb3gm
IHRhYmxlQm94KSBjb25zdDsKKyAgICB9OworICAgIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9
CisKKyAgICB2b2lkIGxheW91dFRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gs
IGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOworCisgICAgdm9pZCBjb21wdXRl
Qm9yZGVyQW5kUGFkZGluZ0ZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYpOworICAgIHZvaWQgY29tcHV0ZVdpZHRoQW5kTWFyZ2luRm9y
VGFibGVCb3goY29uc3QgQ29udGFpbmVyQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
Jik7CisgICAgdm9pZCBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luRm9yVGFibGVCb3goY29uc3QgQ29u
dGFpbmVyQm94JiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jik7CisKK3ByaXZh
dGU6CisgICAgSG9yaXpvbnRhbENvbnN0cmFpbnRzIG1faG9yaXpvbnRhbENvbnN0cmFpbnRzSWdu
b3JpbmdGbG9hdHM7Cit9OworCitpbmxpbmUgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6UXVpcmtzOjpRdWlya3MoY29uc3QgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dCYgZm9ybWF0dGluZ0NvbnRleHQpCisgICAgOiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpR
dWlya3MoZm9ybWF0dGluZ0NvbnRleHQpCit7Cit9CisKK30KK30KKworU1BFQ0lBTElaRV9UWVBF
X1RSQUlUU19MQVlPVVRfRk9STUFUVElOR19DT05URVhUKFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0
dGluZ0NvbnRleHQsIGlzVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpKQorCisj
ZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0UXVpcmtzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lYWRhOTJlZDI4Zjc5N2YzYjgyNmIw
ZmI5MTU0MjVlYjc4OWJiOTk1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxl
V3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCkBAIC0wLDAgKzEsNDggQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGFibGVXcmFwcGVy
QmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5H
X0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworT3B0aW9uYWw8TGF5b3V0VW5pdD4gVGFibGVXcmFw
cGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpvdmVycmlkZGVuVGFibGVIZWlnaHQo
Y29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCkgY29uc3QKK3sKKyAgICBpZiAobGF5b3V0U3Rh
dGUoKS5pblF1aXJrc01vZGUoKSkgeworICAgICAgICAvLyBJbiBxdWlya3MgbW9kZSBhbHdheXMg
dXNlIHRoZSBjb250ZW50IGhlaWdodC4gTm90ZSB0aGF0IHRoZSB0YWJsZXMgd2l0aCBjb250ZW50
IHRha2UgY29tcHV0ZWQgdmFsdWVzIGludG8gYWNjb3VudC4KKyAgICAgICAgcmV0dXJuIGdlb21l
dHJ5KCkuY29udGVudEhlaWdodEZvckZvcm1hdHRpbmdDb250ZXh0Um9vdCh0YWJsZUJveCk7Cisg
ICAgfQorICAgIHJldHVybiB0YWJsZUJveC5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSA/IGdl
b21ldHJ5KCkuY29udGVudEhlaWdodEZvckZvcm1hdHRpbmdDb250ZXh0Um9vdCh0YWJsZUJveCkg
OiBPcHRpb25hbDxMYXlvdXRVbml0PiB7IH07Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0
aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uMzE1N2ZkNjk5MDQyODY5N2U4NWQxNzFmNmQzYWM4ZDU4N2FjYWNmOAotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
ZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmNwcApAQCAtMCwwICsxLDEyMyBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGbGV4Rm9ybWF0
dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQor
CisjaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIklubGluZVJlY3Qu
aCIKKyNpbmNsdWRlICJJbnZhbGlkYXRpb25TdGF0ZS5oIgorI2luY2x1ZGUgIkxheW91dEJveEdl
b21ldHJ5LmgiCisjaW5jbHVkZSAiTGF5b3V0Q2hpbGRJdGVyYXRvci5oIgorI2luY2x1ZGUgIkxh
eW91dENvbnRleHQuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworV1RGX01BS0VfSVNPX0FMTE9D
QVRFRF9JTVBMKEZsZXhGb3JtYXR0aW5nQ29udGV4dCk7CisKK0ZsZXhGb3JtYXR0aW5nQ29udGV4
dDo6RmxleEZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0Nv
bnRleHRSb290LCBGbGV4Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCisgICAgOiBG
b3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkK
K3sKK30KKwordm9pZCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dEluRmxvd0NvbnRlbnQo
SW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNv
bnN0cmFpbnRzKQoreworICAgIGNvbXB1dGVJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yRmxl
eEl0ZW1zKCk7CisgICAgc2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0cmFpbnRzKTsKK30KKwor
TGF5b3V0VW5pdCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OnVzZWRDb250ZW50SGVpZ2h0KCkgY29u
c3QKK3sKKyAgICBhdXRvJiBsaW5lcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmxpbmVzKCk7CisgICAg
cmV0dXJuIExheW91dFVuaXQgeyBsaW5lcy5sYXN0KCkuYm90dG9tKCkgLSBsaW5lcy5maXJzdCgp
LnRvcCgpIH07Cit9CisKK0Zvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzIEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzKCkKK3sKKyAgICByZXR1cm4geyB9OworfQorCit2b2lkIEZsZXhGb3JtYXR0aW5nQ29udGV4
dDo6c2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVu
dCYgY29uc3RyYWludHMpCit7CisgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9y
bWF0dGluZ1N0YXRlKCk7CisgICAgYXV0byBnZW9tZXRyeSA9IHRoaXMtPmdlb21ldHJ5KCk7Cisg
ICAgYXV0byBmbGV4SXRlbU1haW5BeGlzU3RhcnQgPSBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxv
Z2ljYWxMZWZ0OworICAgIGF1dG8gZmxleEl0ZW1NYWluQXhpc0VuZCA9IGZsZXhJdGVtTWFpbkF4
aXNTdGFydDsKKyAgICBhdXRvIGZsZXhJdGVtQ3Jvc0F4aXNTdGFydCA9IGNvbnN0cmFpbnRzLnZl
cnRpY2FsLmxvZ2ljYWxUb3A7CisgICAgYXV0byBmbGV4SXRlbUNyb3NBeGlzRW5kID0gZmxleEl0
ZW1Dcm9zQXhpc1N0YXJ0OworICAgIGZvciAoYXV0byYgZmxleEl0ZW0gOiBjaGlsZHJlbk9mVHlw
ZTxDb250YWluZXJCb3g+KHJvb3QoKSkpIHsKKyAgICAgICAgQVNTRVJUKGZsZXhJdGVtLmVzdGFi
bGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7CisgICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGp1
c3QgYSBzaW1wbGUsIGxldCdzIGxheW91dCB0aGUgZmxleCBpdGVtcyBhbmQgcGxhY2UgdGhlbSBu
ZXh0IHRvIGVhY2ggb3RoZXIgc2V0dXAuCisgICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhzID0g
Zm9ybWF0dGluZ1N0YXRlLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goZmxleEl0ZW0p
OworICAgICAgICBhdXRvIGZsZXhJdGVtTG9naWNhbFdpZHRoID0gc3RkOjptaW4oc3RkOjptYXgo
aW50cmluc2ljV2lkdGhzLT5taW5pbXVtLCBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxX
aWR0aCksIGludHJpbnNpY1dpZHRocy0+bWF4aW11bSk7CisgICAgICAgIGF1dG8gZmxleEl0ZW1D
b25zdHJhaW50cyA9IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCB7IHsgeyB9LCBmbGV4SXRl
bUxvZ2ljYWxXaWR0aCB9LCB7IH0gfTsKKworICAgICAgICBhdXRvIGludmFsaWRhdGlvblN0YXRl
ID0gSW52YWxpZGF0aW9uU3RhdGUgeyB9OworICAgICAgICBMYXlvdXRDb250ZXh0OjpjcmVhdGVG
b3JtYXR0aW5nQ29udGV4dChmbGV4SXRlbSwgbGF5b3V0U3RhdGUoKSktPmxheW91dEluRmxvd0Nv
bnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGZsZXhJdGVtQ29uc3RyYWludHMpOworCisgICAgICAg
IGF1dG8gY29tcHV0ZUZsZXhJdGVtR2VvbWV0cnkgPSBbJl0geworICAgICAgICAgICAgYXV0byYg
ZmxleEl0ZW1HZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShmbGV4SXRlbSk7
CisKKyAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQoTGF5b3V0
UG9pbnQgeyBmbGV4SXRlbU1haW5BeGlzRW5kLCBmbGV4SXRlbUNyb3NBeGlzU3RhcnQgfSk7CisK
KyAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0Qm9yZGVyKGdlb21ldHJ5LmNvbXB1dGVk
Qm9yZGVyKGZsZXhJdGVtKSk7CisgICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldFBhZGRp
bmcoZ2VvbWV0cnkuY29tcHV0ZWRQYWRkaW5nKGZsZXhJdGVtLCBjb25zdHJhaW50cy5ob3Jpem9u
dGFsLmxvZ2ljYWxXaWR0aCkpOworCisgICAgICAgICAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRh
bE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihmbGV4SXRlbSwgY29u
c3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldEhv
cml6b250YWxNYXJnaW4oeyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigw
X2x1KSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDBfbHUpIH0pOworCisg
ICAgICAgICAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBnZW9tZXRyeS5jb21wdXRl
ZFZlcnRpY2FsTWFyZ2luKGZsZXhJdGVtLCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKKyAgICAg
ICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyBjb21wdXRlZFZlcnRp
Y2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDBfbHUpLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFm
dGVyLnZhbHVlT3IoMF9sdSkgfSk7CisKKyAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0
Q29udGVudEJveEhlaWdodChnZW9tZXRyeS5jb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRl
eHRSb290KGZsZXhJdGVtKSk7CisgICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldENvbnRl
bnRCb3hXaWR0aChmbGV4SXRlbUxvZ2ljYWxXaWR0aCk7CisgICAgICAgICAgICBmbGV4SXRlbU1h
aW5BeGlzRW5kPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChmbGV4SXRlbUdlb21ldHJ5KS5y
aWdodCgpOworICAgICAgICAgICAgZmxleEl0ZW1Dcm9zQXhpc0VuZCA9IHN0ZDo6bWF4KGZsZXhJ
dGVtQ3Jvc0F4aXNFbmQsIEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGZsZXhJdGVtR2VvbWV0
cnkpLmJvdHRvbSgpKTsKKyAgICAgICAgfTsKKyAgICAgICAgY29tcHV0ZUZsZXhJdGVtR2VvbWV0
cnkoKTsKKyAgICB9CisgICAgYXV0byBmbGV4TGluZSA9IElubGluZVJlY3QgeyBmbGV4SXRlbUNy
b3NBeGlzU3RhcnQsIGZsZXhJdGVtTWFpbkF4aXNTdGFydCwgZmxleEl0ZW1NYWluQXhpc0VuZCAt
IGZsZXhJdGVtTWFpbkF4aXNTdGFydCwgZmxleEl0ZW1Dcm9zQXhpc0VuZCAtIGZsZXhJdGVtQ3Jv
c0F4aXNTdGFydCB9OworICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lKGZsZXhMaW5lKTsKK30K
Kwordm9pZCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzRm9yRmxleEl0ZW1zKCkKK3sKKyAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlz
LT5mb3JtYXR0aW5nU3RhdGUoKTsKKyAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2VvbWV0cnko
KTsKKyAgICBmb3IgKGF1dG8mIGZsZXhJdGVtIDogY2hpbGRyZW5PZlR5cGU8Q29udGFpbmVyQm94
Pihyb290KCkpKSB7CisgICAgICAgIGlmIChmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhD
b25zdHJhaW50c0ZvckJveChmbGV4SXRlbSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgZm9ybWF0dGluZ1N0YXRlLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goZmxl
eEl0ZW0sIGdlb21ldHJ5LmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoZmxleEl0ZW0pKTsKKyAg
ICB9Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4
dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0
dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44MWEwZTQwNjlmZmQxMDI5
Njg4Y2M1MTZjZmQ5NTkwY2NjOTM2NTJiCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGlu
Z0NvbnRleHQuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwor
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisg
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisK
KyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsZXhG
b3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgorI2luY2x1
ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExh
eW91dCB7CisKK2NsYXNzIEludmFsaWRhdGlvblN0YXRlOworLy8gVGhpcyBjbGFzcyBpbXBsZW1l
bnRzIHRoZSBsYXlvdXQgbG9naWMgZm9yIGZsZXggZm9ybWF0dGluZyBjb250ZXh0cy4KKy8vIGh0
dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtZmxleGJveC0xLworY2xhc3MgRmxleEZvcm1hdHRpbmdD
b250ZXh0IGZpbmFsIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9J
U09fQUxMT0NBVEVEKEZsZXhGb3JtYXR0aW5nQ29udGV4dCk7CitwdWJsaWM6CisgICAgRmxleEZv
cm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290
LCBGbGV4Rm9ybWF0dGluZ1N0YXRlJik7CisgICAgdm9pZCBsYXlvdXRJbkZsb3dDb250ZW50KElu
dmFsaWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jikgb3Zl
cnJpZGU7CisgICAgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0IG92ZXJyaWRl
OworCisgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBjb21wdXRlZEludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICAvLyBUaGlzIGNsYXNzIGlt
cGxlbWVudHMgcG9zaXRpb25pbmcgYW5kIHNpemluZyBmb3IgZmxleCBpdGVtcy4KKyAgICBjbGFz
cyBHZW9tZXRyeSA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgeworICAgIHB1
YmxpYzoKKyAgICAgICAgR2VvbWV0cnkoY29uc3QgRmxleEZvcm1hdHRpbmdDb250ZXh0Jik7CisK
KyAgICAgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzKGNvbnN0IENvbnRhaW5lckJveCYpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qg
RmxleEZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJu
IGRvd25jYXN0PEZsZXhGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5Ojpmb3JtYXR0aW5nQ29udGV4dCgpKTsgfQorICAgIH07CisgICAgRmxleEZvcm1hdHRpbmdD
b250ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlz
KTsgfQorCisgICAgdm9pZCBzaXplQW5kUGxhY2VGbGV4SXRlbXMoY29uc3QgQ29uc3RyYWludHNG
b3JJbkZsb3dDb250ZW50Jik7CisgICAgdm9pZCBjb21wdXRlSW50cmluc2ljV2lkdGhDb25zdHJh
aW50c0ZvckZsZXhJdGVtcygpOworCisgICAgY29uc3QgRmxleEZvcm1hdHRpbmdTdGF0ZSYgZm9y
bWF0dGluZ1N0YXRlKCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8RmxleEZvcm1hdHRpbmdTdGF0
ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQorICAgIEZsZXhGb3Jt
YXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIGRvd25jYXN0PEZsZXhGb3Jt
YXR0aW5nU3RhdGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KK307
CisKK2lubGluZSBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpHZW9tZXRyeShjb25z
dCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQmIGZsZXhGb3JtYXR0aW5nQ29udGV4dCkKKyAgICA6IEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeShmbGV4Rm9ybWF0dGluZ0NvbnRleHQpCit7Cit9CisK
K30KK30KKworU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19MQVlPVVRfRk9STUFUVElOR19DT05URVhU
KEZsZXhGb3JtYXR0aW5nQ29udGV4dCwgaXNGbGV4Rm9ybWF0dGluZ0NvbnRleHQoKSkKKworI2Vu
ZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZv
cm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRjN2M4ZGQwOTgwOWQxZDBi
NTg0YWJmZjc4ZGQxNzkxYmZmNDY4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5n
Q29udGV4dEdlb21ldHJ5LmNwcApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZsZXhGb3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGbGV4Rm9ybWF0
dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJM
YXlvdXRDb250ZXh0LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQg
eworCitGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBGbGV4Rm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0
IENvbnRhaW5lckJveCYgZmxleEl0ZW0pCit7CisgICAgYXV0byBmaXhlZE1hcmdpbkJvcmRlckFu
ZFBhZGRpbmcgPSBbJl0oYXV0byYgbGF5b3V0Qm94KSB7CisgICAgICAgIGF1dG8mIHN0eWxlID0g
bGF5b3V0Qm94LnN0eWxlKCk7CisgICAgICAgIHJldHVybiBmaXhlZFZhbHVlKHN0eWxlLm1hcmdp
blN0YXJ0KCkpLnZhbHVlT3IoMCkKKyAgICAgICAgICAgICsgTGF5b3V0VW5pdCB7IHN0eWxlLmJv
cmRlckxlZnRXaWR0aCgpIH0KKyAgICAgICAgICAgICsgZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5n
TGVmdCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIGZpeGVkVmFsdWUoc3R5bGUucGFkZGlu
Z1JpZ2h0KCkpLnZhbHVlT3IoMCkKKyAgICAgICAgICAgICsgTGF5b3V0VW5pdCB7IHN0eWxlLmJv
cmRlclJpZ2h0V2lkdGgoKSB9CisgICAgICAgICAgICArIGZpeGVkVmFsdWUoc3R5bGUubWFyZ2lu
RW5kKCkpLnZhbHVlT3IoMCk7CisgICAgfTsKKworICAgIGF1dG8gY29tcHV0ZWRJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzID0gWyZdKCkgLT4gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7Cisg
ICAgICAgIGF1dG8gbG9naWNhbFdpZHRoID0gZmxleEl0ZW0uc3R5bGUoKS5sb2dpY2FsV2lkdGgo
KTsKKyAgICAgICAgLy8gTWluaW11bS9tYXhpbXVtIHdpZHRoIGNhbid0IGJlIGRlcGVuZGluZyBv
biB0aGUgY29udGFpbmluZyBibG9jaydzIHdpZHRoLgorICAgICAgICBhdXRvIG5lZWRzUmVzb2x2
ZWRDb250YWluaW5nQmxvY2tXaWR0aCA9IGxvZ2ljYWxXaWR0aC5pc0NhbGN1bGF0ZWQoKSB8fCBs
b2dpY2FsV2lkdGguaXNQZXJjZW50KCkgfHwgbG9naWNhbFdpZHRoLmlzUmVsYXRpdmUoKTsKKyAg
ICAgICAgaWYgKG5lZWRzUmVzb2x2ZWRDb250YWluaW5nQmxvY2tXaWR0aCkKKyAgICAgICAgICAg
IHJldHVybiB7IH07CisKKyAgICAgICAgaWYgKGF1dG8gd2lkdGggPSBmaXhlZFZhbHVlKGxvZ2lj
YWxXaWR0aCkpCisgICAgICAgICAgICByZXR1cm4geyAqd2lkdGgsICp3aWR0aCB9OworCisgICAg
ICAgIEFTU0VSVChmbGV4SXRlbS5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOworICAg
ICAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBMYXlvdXRDb250ZXh0OjpjcmVh
dGVGb3JtYXR0aW5nQ29udGV4dChmbGV4SXRlbSwgbGF5b3V0U3RhdGUoKSktPmNvbXB1dGVkSW50
cmluc2ljV2lkdGhDb25zdHJhaW50cygpOworICAgICAgICBpZiAobG9naWNhbFdpZHRoLmlzTWlu
Q29udGVudCgpKQorICAgICAgICAgICAgcmV0dXJuIHsgaW50cmluc2ljV2lkdGhDb25zdHJhaW50
cy5taW5pbXVtLCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0gfTsKKyAgICAgICAg
aWYgKGxvZ2ljYWxXaWR0aC5pc01heENvbnRlbnQoKSkKKyAgICAgICAgICAgIHJldHVybiB7IGlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50
cy5tYXhpbXVtIH07CisgICAgICAgIHJldHVybiBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOwor
ICAgIH07CisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gY29uc3RyYWluQnlN
aW5NYXhXaWR0aChmbGV4SXRlbSwgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkp
OworICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMuZXhwYW5kKGZpeGVkTWFyZ2luQm9yZGVy
QW5kUGFkZGluZyhmbGV4SXRlbSkpOworICAgIHJldHVybiBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ1N0YXRl
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1h
dHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZDU5ZmM4NWEwMzg1MmQz
MzUyNjEzODQwZjMxMjJjNzMzYzU0ZmFhMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRp
bmdTdGF0ZS5jcHAKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
KyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgor
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJGbGV4Rm9ybWF0dGluZ1N0YXRlLmgiCisKKyNpZiBFTkFCTEUoTEFZ
T1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVz
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFL
RV9JU09fQUxMT0NBVEVEX0lNUEwoRmxleEZvcm1hdHRpbmdTdGF0ZSk7CisKK0ZsZXhGb3JtYXR0
aW5nU3RhdGU6OkZsZXhGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYgZmxvYXRp
bmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQorICAgIDogRm9ybWF0dGluZ1N0YXRl
KFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OkZsZXgsIGxheW91dFN0YXRlKQoreworfQor
CitGbGV4Rm9ybWF0dGluZ1N0YXRlOjp+RmxleEZvcm1hdHRpbmdTdGF0ZSgpCit7Cit9CisKK30K
K30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ1N0YXRlLmggYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0
aW5nU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hMDYzYjlkYTJhNWI4ZGMyNzAyMDg3OTRhNDgzNjU0NDE2
MDllM2EzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ1N0YXRlLmgKQEAgLTAsMCAr
MSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
KyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisg
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9G
T1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNs
dWRlICJJbmxpbmVSZWN0LmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgRmxleEZvcm1hdHRpbmdT
dGF0ZSA6IHB1YmxpYyBGb3JtYXR0aW5nU3RhdGUgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FU
RUQoRmxleEZvcm1hdHRpbmdTdGF0ZSk7CitwdWJsaWM6CisgICAgRmxleEZvcm1hdHRpbmdTdGF0
ZShSZWY8RmxvYXRpbmdTdGF0ZT4mJiwgTGF5b3V0U3RhdGUmKTsKKyAgICB+RmxleEZvcm1hdHRp
bmdTdGF0ZSgpOworCisgICAgY29uc3QgYXV0byYgbGluZXMoKSBjb25zdCB7IHJldHVybiBtX2xp
bmVzOyB9CisgICAgdm9pZCBhZGRMaW5lKGNvbnN0IElubGluZVJlY3QmIGxpbmUpIHsgbV9saW5l
cy5hcHBlbmQobGluZSk7IH0KKworcHJpdmF0ZToKKyAgICBWZWN0b3I8SW5saW5lUmVjdD4gbV9s
aW5lczsKK307CisKK30KK30KKworU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19MQVlPVVRfRk9STUFU
VElOR19TVEFURShGbGV4Rm9ybWF0dGluZ1N0YXRlLCBpc0ZsZXhGb3JtYXR0aW5nU3RhdGUoKSkK
KworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lQ29udGVudEJyZWFrZXIuY3BwIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZUNvbnRlbnRCcmVha2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45NDBhNmRhOWY5YzE0ZjAxNDQ1MWZhZGEy
NDZmYjBlYmNkMTJkMmI4Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2Vy
LmNwcApAQCAtMCwwICsxLDUzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJJbmxpbmVDb250ZW50QnJlYWtlci5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9G
T1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgorI2luY2x1ZGUg
Ikh5cGhlbmF0aW9uLmgiCisjaW5jbHVkZSAiSW5saW5lSXRlbS5oIgorI2luY2x1ZGUgIklubGlu
ZVRleHRJdGVtLmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCisjaW5jbHVkZSAi
VGV4dFV0aWwuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisK
KworI2lmIEFTU0VSVF9FTkFCTEVECitzdGF0aWMgaW5saW5lIGJvb2wgaGFzVHJhaWxpbmdUZXh0
Q29udGVudChjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQmIGNv
bnRpbnVvdXNDb250ZW50KQoreworICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJz
ZWRSYW5nZShjb250aW51b3VzQ29udGVudC5ydW5zKCkpKSB7CisgICAgICAgIGF1dG8mIGlubGlu
ZUl0ZW0gPSBydW4uaW5saW5lSXRlbTsKKyAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNJbmxpbmVC
b3hTdGFydCgpIHx8IGlubGluZUl0ZW0uaXNJbmxpbmVCb3hFbmQoKSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICByZXR1cm4gaW5saW5lSXRlbS5pc1RleHQoKTsKKyAgICB9CisgICAg
cmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNMZWFkaW5n
VGV4dENvbnRlbnQoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50
JiBjb250aW51b3VzQ29udGVudCkKK3sKKyAgICBmb3IgKGF1dG8mIHJ1biA6IGNvbnRpbnVvdXND
b250ZW50LnJ1bnMoKSkgeworICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gcnVuLmlubGluZUl0
ZW07CisgICAgICAgIGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJ
dGVtLmlzSW5saW5lQm94RW5kKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcmV0
dXJuIGlubGluZUl0ZW0uaXNUZXh0KCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwor
c3RhdGljIGlubGluZSBib29sIGhhc1RleHRSdW4oY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6
OkNvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkKK3sKKyAgICAvLyA8c3Bhbj50
ZXh0PC9zcGFuPiBpcyBjb25zaWRlcmVkIGEgdGV4dCBydW4gZXZlbiB3aXRoIHRoZSBbaW5saW5l
IGJveCBzdGFydF1baW5saW5lIGJveCBlbmRdIGlubGluZSBpdGVtcy4KKyAgICAvLyBCYXNlZCBv
biBzdGFuZGFyZHMgY29tbWl0IGJvdW5kYXJ5IHJ1bGVzIGl0IHdvdWxkIGJlIGVub3VnaCB0byBj
aGVjayB0aGUgZmlyc3QgaW5saW5lIGl0ZW0sIGJ1dCBkdWUgdG8gdGhlIHRhYmxlIHF1aXJrLCB3
ZSBjYW4gaGF2ZQorICAgIC8vIGltYWdlIGFuZCB0ZXh0IG5leHQgdG8gZWFjaCBvdGhlciBpbnNp
ZGUgYSBjb250aW51b3VzIHNldCBvZiBydW5zIChzZWUgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6
OlF1aXJrczo6aGFzU29mdFdyYXBPcHBvcnR1bml0eUF0SW1hZ2UpLgorICAgIGZvciAoYXV0byYg
cnVuIDogY29udGludW91c0NvbnRlbnQucnVucygpKSB7CisgICAgICAgIGlmIChydW4uaW5saW5l
SXRlbS5pc1RleHQoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1Zpc3VhbGx5RW1wdHlXaGl0ZXNw
YWNlQ29udGVudChjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQm
IGNvbnRpbnVvdXNDb250ZW50KQoreworICAgIC8vIFs8c3Bhbj48L3NwYW4+IF0gWzxzcGFuPiA8
L3NwYW4+XSBbIDxzcGFuIHN0eWxlPSJwYWRkaW5nOiAwcHg7Ij48L3NwYW4+XSBhcmUgYWxsIGNv
bnNpZGVyZWQgdmlzdWFsbHkgZW1wdHkgd2hpdGVzcGFjZSBjb250ZW50LgorICAgIC8vIFs8c3Bh
biBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgcmVkIj48L3NwYW4+IF0gd2hpbGUgdGhpcyBpcyB3
aGl0ZXNwYWNlIGNvbnRlbnQgb25seSwgaXQgaXMgbm90IGNvbnNpZGVyZWQgdmlzdWFsbHkgZW1w
dHkuCisgICAgLy8gRHVlIHRvIGNvbW1pdCBib3VuZGFyeSBydWxlcywgd2UganVzdCBuZWVkIHRv
IGNoZWNrIHRoZSBmaXJzdCBub24tdHlwZWxlc3MgaW5saW5lIGl0ZW0gKGNhbid0IGhhdmUgYm90
aCBbaW1nXSBhbmQgW3RleHRdKQorICAgIGZvciAoYXV0byYgcnVuIDogY29udGludW91c0NvbnRl
bnQucnVucygpKSB7CisgICAgICAgIGF1dG8mIGlubGluZUl0ZW0gPSBydW4uaW5saW5lSXRlbTsK
KyAgICAgICAgLy8gRklYTUU6IGNoZWNrIGZvciBwYWRkaW5nIGJvcmRlciBldGMuCisgICAgICAg
IGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5l
Qm94RW5kKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcmV0dXJuIGlubGluZUl0
ZW0uaXNUZXh0KCkgJiYgZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGlubGluZUl0ZW0pLmlzV2hp
dGVzcGFjZSgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUg
Ym9vbCBpc05vbkNvbnRlbnRSdW5zT25seShjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29u
dGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250ZW50KQoreworICAgIC8vIDxzcGFuPjwvc3Bh
bj4gPC0gbm9uIGNvbnRlbnQgcnVucy4KKyAgICBmb3IgKGF1dG8mIHJ1biA6IGNvbnRpbnVvdXND
b250ZW50LnJ1bnMoKSkgeworICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gcnVuLmlubGluZUl0
ZW07CisgICAgICAgIGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJ
dGVtLmlzSW5saW5lQm94RW5kKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBP
cHRpb25hbDxzaXplX3Q+IGZpcnN0VGV4dFJ1bkluZGV4KGNvbnN0IElubGluZUNvbnRlbnRCcmVh
a2VyOjpDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQpCit7CisgICAgYXV0byYg
cnVucyA9IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKTsKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9
IDA7IGluZGV4IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgaWYgKHJ1bnNbaW5k
ZXhdLmlubGluZUl0ZW0uaXNUZXh0KCkpCisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAg
fQorICAgIHJldHVybiB7IH07Cit9CisKK2Jvb2wgSW5saW5lQ29udGVudEJyZWFrZXI6OmlzV3Jh
cHBpbmdBbGxvd2VkKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0pCit7CisgICAgYXV0byYg
c3R5bGVUb1VzZSA9IGlubGluZUl0ZW0uaXNCb3goKSA/IGlubGluZUl0ZW0ubGF5b3V0Qm94KCku
cGFyZW50KCkuc3R5bGUoKSA6IGlubGluZUl0ZW0ubGF5b3V0Qm94KCkuc3R5bGUoKTsgCisgICAg
Ly8gRG8gbm90IHRyeSB0byB3cmFwIG92ZXJmbG93biAncHJlJyBhbmQgJ25vLXdyYXAnIGNvbnRl
bnQgdG8gbmV4dCBsaW5lLgorICAgIHJldHVybiBzdHlsZVRvVXNlLndoaXRlU3BhY2UoKSAhPSBX
aGl0ZVNwYWNlOjpQcmUgJiYgc3R5bGVUb1VzZS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6
Tm9XcmFwOworfQorCitib29sIElubGluZUNvbnRlbnRCcmVha2VyOjpzaG91bGRLZWVwRW5kT2ZM
aW5lV2hpdGVzcGFjZShjb25zdCBDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQp
IGNvbnN0Cit7CisgICAgLy8gR3JhYiB0aGUgc3R5bGUgYW5kIGNoZWNrIGZvciB3aGl0ZS1zcGFj
ZSBwcm9wZXJ0eSB0byBkZWNpZGUgd2hldGhlciB3ZSBzaG91bGQgbGV0IHRoaXMgd2hpdGVzcGFj
ZSBjb250ZW50IG92ZXJmbG93IHRoZSBjdXJyZW50IGxpbmUuCisgICAgLy8gTm90ZSB0aGF0IHRo
ZSAia2VlcCIgaW4gdGhpcyBjb250ZXh0IG1lYW5zIHdlIGxldCB0aGUgd2hpdGVzcGFjZSBjb250
ZW50IHNpdCBvbiB0aGUgY3VycmVudCBsaW5lLgorICAgIC8vIEl0IG1pZ2h0IHZlcnkgd2VsbCBn
ZXQgY29sbGFwc2VkIHdoZW4gd2UgY2xvc2UgdGhlIGxpbmUgKG5vcm1hbC9ub3dyYXAvcHJlLWxp
bmUpLgorICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXRleHQtMy8jd2hpdGUt
c3BhY2UtcHJvcGVydHkKKyAgICBhdXRvIHdoaXRlc3BhY2UgPSBjb250aW51b3VzQ29udGVudC5y
dW5zKClbKmZpcnN0VGV4dFJ1bkluZGV4KGNvbnRpbnVvdXNDb250ZW50KV0uaW5saW5lSXRlbS5z
dHlsZSgpLndoaXRlU3BhY2UoKTsKKyAgICByZXR1cm4gd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNl
OjpOb3JtYWwgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpOb1dyYXAgfHwgd2hpdGVzcGFj
ZSA9PSBXaGl0ZVNwYWNlOjpQcmVXcmFwIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJl
TGluZTsKK30KKworSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdCBJbmxpbmVDb250ZW50QnJl
YWtlcjo6cHJvY2Vzc0lubGluZUNvbnRlbnQoY29uc3QgQ29udGludW91c0NvbnRlbnQmIGNhbmRp
ZGF0ZUNvbnRlbnQsIGNvbnN0IExpbmVTdGF0dXMmIGxpbmVTdGF0dXMpCit7CisgICAgQVNTRVJU
KCFzdGQ6OmlzbmFuKGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGgpKTsKKyAgICBhdXRvIHByb2Nl
c3NDYW5kaWRhdGVDb250ZW50ID0gWyZdIHsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZUNvbnRlbnQu
bG9naWNhbFdpZHRoKCkgPD0gbGluZVN0YXR1cy5hdmFpbGFibGVXaWR0aCkKKyAgICAgICAgICAg
IHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCB9OworI2lmIFVTRV9GTE9BVF9B
U19JTkxJTkVfTEFZT1VUX1VOSVQKKyAgICAgICAgLy8gUHJlZmVycmVkIHdpZHRoIGNvbXB1dGF0
aW9uIHN1bXMgdXAgZmxvYXRzIHdoaWxlIGxpbmUgYnJlYWtlciBzdWJ0cmFjdHMgdGhlbS4gVGhp
cyBjYW4gbGVhZCB0byBlcHNpbG9uLXNjYWxlIGRpZmZlcmVuY2VzLgorICAgICAgICBpZiAoV1RG
OjphcmVFc3NlbnRpYWxseUVxdWFsKGNhbmRpZGF0ZUNvbnRlbnQubG9naWNhbFdpZHRoKCksIGxp
bmVTdGF0dXMuYXZhaWxhYmxlV2lkdGgpKQorICAgICAgICAgICAgcmV0dXJuIFJlc3VsdCB7IFJl
c3VsdDo6QWN0aW9uOjpLZWVwIH07CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NPdmVy
Zmxvd2luZ0NvbnRlbnQoY2FuZGlkYXRlQ29udGVudCwgbGluZVN0YXR1cyk7CisgICAgfTsKKwor
ICAgIGF1dG8gcmVzdWx0ID0gcHJvY2Vzc0NhbmRpZGF0ZUNvbnRlbnQoKTsKKyAgICBpZiAocmVz
dWx0LmFjdGlvbiA9PSBSZXN1bHQ6OkFjdGlvbjo6V3JhcCAmJiBsaW5lU3RhdHVzLnRyYWlsaW5n
U29mdEh5cGhlbldpZHRoICYmIGhhc0xlYWRpbmdUZXh0Q29udGVudChjYW5kaWRhdGVDb250ZW50
KSkgeworICAgICAgICAvLyBBIHRyYWlsaW5nIHNvZnQgaHlwaGVuIHdpdGggYSB3cmFwcGVkIHRl
eHQgY29udGVudCB0dXJucyBpbnRvIGEgdmlzaWJsZSBoeXBoZW4uCisgICAgICAgIC8vIExldCdz
IGNoZWNrIGlmIHRoZXJlJ3MgZW5vdWdoIHNwYWNlIGZvciB0aGUgaHlwaGVuIGNoYXJhY3Rlci4K
KyAgICAgICAgYXV0byBoeXBoZW5PdmVyZmxvd3MgPSAqbGluZVN0YXR1cy50cmFpbGluZ1NvZnRI
eXBoZW5XaWR0aCA+IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGg7CisgICAgICAgIGF1dG8gYWN0
aW9uID0gaHlwaGVuT3ZlcmZsb3dzID8gUmVzdWx0OjpBY3Rpb246OlJldmVydFRvTGFzdE5vbk92
ZXJmbG93aW5nV3JhcE9wcG9ydHVuaXR5IDogUmVzdWx0OjpBY3Rpb246OldyYXBXaXRoSHlwaGVu
OworICAgICAgICByZXN1bHQgPSB7IGFjdGlvbiwgSXNFbmRPZkxpbmU6OlllcyB9OworICAgIH0K
KyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdHJ1Y3QgT3ZlcmZsb3dpbmdUZXh0Q29udGVudCB7
CisgICAgc2l6ZV90IHJ1bkluZGV4IHsgMCB9OyAvLyBPdmVyZmxvd2luZyBydW4gaW5kZXguIFRo
ZXJlJ3MgYWx3YXlzIGFuIG92ZXJmbG93aW5nIHJ1bi4KKyAgICBzdHJ1Y3QgQnJlYWtpbmdQb3Np
dGlvbiB7CisgICAgICAgIHNpemVfdCBydW5JbmRleCB7IDAgfTsKKyAgICAgICAgc3RydWN0IFRy
YWlsaW5nQ29udGVudCB7CisgICAgICAgICAgICAvLyBUcmFpbGluZyBjb250ZW50IGlzIGVpdGhl
ciB0aGUgcnVuJ3MgbGVmdCBzaWRlICh3aGVuIHdlIGJyZWFrIHRoZSBydW4gc29tZXdoZXJlIGlu
IHRoZSBtaWRkbGUpIG9yIHRoZSBwcmV2aW91cyBydW4uCisgICAgICAgICAgICAvLyBTb21ldGlt
ZXMgdGhlIGJyZWFraW5nIHBvc2l0aW9uIGlzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUg
Zmlyc3QgcnVuLCBzbyB0aGVyZSdzIG5vIHRyYWlsaW5nIHJ1biBhdCBhbGwuCisgICAgICAgICAg
ICBib29sIG92ZXJmbG93cyB7IGZhbHNlIH07CisgICAgICAgICAgICBPcHRpb25hbDxJbmxpbmVD
b250ZW50QnJlYWtlcjo6UGFydGlhbFJ1bj4gcGFydGlhbFJ1biB7IH07CisgICAgICAgIH07Cisg
ICAgICAgIE9wdGlvbmFsPFRyYWlsaW5nQ29udGVudD4gdHJhaWxpbmdDb250ZW50IHsgfTsKKyAg
ICB9OworICAgIE9wdGlvbmFsPEJyZWFraW5nUG9zaXRpb24+IGJyZWFraW5nUG9zaXRpb24geyB9
OyAvLyBXaGVyZSB3ZSBhY3R1YWxseSBicmVhayB0aGlzIG92ZXJmbG93aW5nIGNvbnRlbnQuCit9
OworCitJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0IElubGluZUNvbnRlbnRCcmVha2VyOjpw
cm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50KGNvbnN0IENvbnRpbnVvdXNDb250ZW50JiBvdmVyZmxv
d0NvbnRlbnQsIGNvbnN0IExpbmVTdGF0dXMmIGxpbmVTdGF0dXMpIGNvbnN0Cit7CisgICAgYXV0
byBjb250aW51b3VzQ29udGVudCA9IENvbnRpbnVvdXNDb250ZW50IHsgb3ZlcmZsb3dDb250ZW50
IH07CisgICAgQVNTRVJUKCFjb250aW51b3VzQ29udGVudC5ydW5zKCkuaXNFbXB0eSgpKTsKKwor
ICAgIEFTU0VSVChjb250aW51b3VzQ29udGVudC5sb2dpY2FsV2lkdGgoKSA+IGxpbmVTdGF0dXMu
YXZhaWxhYmxlV2lkdGgpOworICAgIGlmIChjb250aW51b3VzQ29udGVudC5oYXNUcmFpbGluZ0Nv
bGxhcHNpYmxlQ29udGVudCgpKSB7CisgICAgICAgIEFTU0VSVChoYXNUcmFpbGluZ1RleHRDb250
ZW50KG92ZXJmbG93Q29udGVudCkpOworICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgY29u
dGVudCBmaXRzIHdpdGhvdXQgdGhlIHRyYWlsaW5nIGNvbGxhcHNpYmxlIHBhcnQuCisgICAgICAg
IGlmIChjb250aW51b3VzQ29udGVudC5ub25Db2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCgpIDw9IGxp
bmVTdGF0dXMuYXZhaWxhYmxlV2lkdGgpCisgICAgICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFj
dGlvbjo6S2VlcCwgSXNFbmRPZkxpbmU6Ok5vIH07CisgICAgICAgIC8vIE5vdyBjaGVjayBpZiB3
ZSBjYW4gdHJpbSB0aGUgbGluZSB0b28uCisgICAgICAgIGlmIChsaW5lU3RhdHVzLmhhc0Z1bGx5
Q29sbGFwc2libGVUcmFpbGluZ1J1biAmJiBjb250aW51b3VzQ29udGVudC5pc0Z1bGx5Q29sbGFw
c2libGUoKSkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBuZXcgY29udGVudCBpcyBmdWxseSBj
b2xsYXBzaWJsZSwgaXQgc2hvdWxkIHN1cmVseSBmaXQuCisgICAgICAgICAgICByZXR1cm4geyBS
ZXN1bHQ6OkFjdGlvbjo6S2VlcCwgSXNFbmRPZkxpbmU6Ok5vIH07CisgICAgICAgIH0KKyAgICB9
IGVsc2UgaWYgKGxpbmVTdGF0dXMuY29sbGFwc2libGVXaWR0aCAmJiBpc05vbkNvbnRlbnRSdW5z
T25seShjb250aW51b3VzQ29udGVudCkpIHsKKyAgICAgICAgLy8gTGV0J3Mgc2VlIGlmIHRoZSBu
b24tY29udGVudCBydW5zIGZpdCB3aGVuIHRoZSBsaW5lIGhhcyB0cmFpbGluZyBjb2xsYXBzaWJs
ZSBjb250ZW50LgorICAgICAgICAvLyAidGV4dCBjb250ZW50IDxzcGFuIHN0eWxlPSJwYWRkaW5n
OiAxcHgiPjwvc3Bhbj4iIDwtIHRoZSA8c3Bhbj48L3NwYW4+IHJ1bnMgY291bGQgZml0IGFmdGVy
IGNvbGxhcHNpbmcgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICAgIGlmIChjb250aW51
b3VzQ29udGVudC5sb2dpY2FsV2lkdGgoKSA8PSBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoICsg
bGluZVN0YXR1cy5jb2xsYXBzaWJsZVdpZHRoKQorICAgICAgICAgICAgcmV0dXJuIHsgUmVzdWx0
OjpBY3Rpb246OktlZXAgfTsKKyAgICB9CisgICAgaWYgKGlzVmlzdWFsbHlFbXB0eVdoaXRlc3Bh
Y2VDb250ZW50KGNvbnRpbnVvdXNDb250ZW50KSAmJiBzaG91bGRLZWVwRW5kT2ZMaW5lV2hpdGVz
cGFjZShjb250aW51b3VzQ29udGVudCkpIHsKKyAgICAgICAgLy8gVGhpcyBvdmVyZmxvd2luZyBj
b250ZW50IGFwcGFyZW50bHkgZmFsbHMgaW50byB0aGUgcmVtb3ZlL2hhbmcgZW5kLW9mLWxpbmUt
c3BhY2VzIGNhdGVnb3J5LgorICAgICAgICAvLyBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nz
cy10ZXh0LTMvI3doaXRlLXNwYWNlLXByb3BlcnR5IG1hdHJpeAorICAgICAgICByZXR1cm4geyBS
ZXN1bHQ6OkFjdGlvbjo6S2VlcCB9OworICAgIH0KKworICAgIHNpemVfdCBvdmVyZmxvd2luZ1J1
bkluZGV4ID0gMDsKKyAgICBpZiAoaGFzVGV4dFJ1bihjb250aW51b3VzQ29udGVudCkpIHsKKyAg
ICAgICAgYXV0byB0cnlCcmVha2luZ0NvbnRlbnRXaXRoVGV4dCA9IFsmXSgpIC0+IE9wdGlvbmFs
PFJlc3VsdD4geworICAgICAgICAgICAgLy8gMS4gVGhpcyB0ZXh0IGNvbnRlbnQgaXMgbm90IGJy
ZWFrYWJsZS4KKyAgICAgICAgICAgIC8vIDIuIFRoaXMgYnJlYWthYmxlIHRleHQgY29udGVudCBk
b2VzIG5vdCBmaXQgYXQgYWxsLiBOb3QgZXZlbiB0aGUgZmlyc3QgZ2x5cGguIFRoaXMgaXMgYSB2
ZXJ5IHNwZWNpYWwgY2FzZS4KKyAgICAgICAgICAgIC8vIDMuIFdlIGNhbiBicmVhayB0aGUgY29u
dGVudCBidXQgaXQgc3RpbGwgb3ZlcmZsb3dzLgorICAgICAgICAgICAgLy8gNC4gTWFuYWdlZCB0
byBicmVhayB0aGUgY29udGVudCBiZWZvcmUgdGhlIG92ZXJmbG93IHBvaW50LgorICAgICAgICAg
ICAgYXV0byBvdmVyZmxvd2luZ0NvbnRlbnQgPSBwcm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50V2l0
aFRleHQoY29udGludW91c0NvbnRlbnQsIGxpbmVTdGF0dXMpOworICAgICAgICAgICAgb3ZlcmZs
b3dpbmdSdW5JbmRleCA9IG92ZXJmbG93aW5nQ29udGVudC5ydW5JbmRleDsKKyAgICAgICAgICAg
IGlmICghb3ZlcmZsb3dpbmdDb250ZW50LmJyZWFraW5nUG9zaXRpb24pCisgICAgICAgICAgICAg
ICAgcmV0dXJuIHsgfTsKKyAgICAgICAgICAgIGF1dG8gdHJhaWxpbmdDb250ZW50ID0gb3ZlcmZs
b3dpbmdDb250ZW50LmJyZWFraW5nUG9zaXRpb24tPnRyYWlsaW5nQ29udGVudDsKKyAgICAgICAg
ICAgIGlmICghdHJhaWxpbmdDb250ZW50KSB7CisgICAgICAgICAgICAgICAgLy8gV2UgdHJpZWQg
dG8gYnJlYWsgdGhlIGNvbnRlbnQgYnV0IHRoZSBhdmFpbGFibGUgc3BhY2UgY2FuJ3QgZXZlbiBh
Y2NvbW1vZGF0ZSB0aGUgZmlyc3QgZ2x5cGguCisgICAgICAgICAgICAgICAgLy8gMS4gV3JhcCB0
aGUgY29udGVudCBvdmVyIHRvIHRoZSBuZXh0IGxpbmUgd2hlbiB3ZSd2ZSBnb3QgY29udGVudCBv
biB0aGUgbGluZSBhbHJlYWR5LgorICAgICAgICAgICAgICAgIC8vIDIuIEtlZXAgdGhlIGZpcnN0
IGdseXBoIG9uIHRoZSBlbXB0eSBsaW5lIChvciBrZWVwIHRoZSB3aG9sZSBydW4gaWYgaXQgaGFz
IG9ubHkgb25lIGdseXBoL2NvbXBsZXRlbHkgZW1wdHkpLgorICAgICAgICAgICAgICAgIGlmIChs
aW5lU3RhdHVzLmhhc0NvbnRlbnQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQg
eyBSZXN1bHQ6OkFjdGlvbjo6V3JhcCwgSXNFbmRPZkxpbmU6OlllcyB9OworICAgICAgICAgICAg
ICAgIGF1dG8gbGVhZGluZ1RleHRSdW5JbmRleCA9ICpmaXJzdFRleHRSdW5JbmRleChjb250aW51
b3VzQ29udGVudCk7CisgICAgICAgICAgICAgICAgYXV0byYgaW5saW5lVGV4dEl0ZW0gPSBkb3du
Y2FzdDxJbmxpbmVUZXh0SXRlbT4oY29udGludW91c0NvbnRlbnQucnVucygpW2xlYWRpbmdUZXh0
UnVuSW5kZXhdLmlubGluZUl0ZW0pOworICAgICAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0SXRl
bS5sZW5ndGgoKSA8PSAxKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVz
dWx0OjpBY3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpZZXMgfTsKKyAgICAgICAgICAgICAgICBh
dXRvIGZpcnN0Q2hhcmFjdGVyV2lkdGggPSBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0s
IGlubGluZVRleHRJdGVtLnN0YXJ0KCksIGlubGluZVRleHRJdGVtLnN0YXJ0KCkgKyAxLCBsaW5l
U3RhdHVzLmNvbnRlbnRMb2dpY2FsUmlnaHQpOworICAgICAgICAgICAgICAgIGF1dG8gZmlyc3RD
aGFyYWN0ZXJSdW4gPSBQYXJ0aWFsUnVuIHsgMSwgZmlyc3RDaGFyYWN0ZXJXaWR0aCB9OworICAg
ICAgICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6OkFjdGlvbjo6QnJlYWssIElzRW5k
T2ZMaW5lOjpZZXMsIFJlc3VsdDo6UGFydGlhbFRyYWlsaW5nQ29udGVudCB7IGxlYWRpbmdUZXh0
UnVuSW5kZXgsIGZpcnN0Q2hhcmFjdGVyUnVuIH0gfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlmICh0cmFpbGluZ0NvbnRlbnQtPm92ZXJmbG93cyAmJiBsaW5lU3RhdHVzLmhhc0NvbnRl
bnQpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBtYW5hZ2VkIHRvIGJyZWFrIGEgcnVuIHdpdGgg
b3ZlcmZsb3cgYnV0IHRoZSBsaW5lIGFscmVhZHkgaGFzIGNvbnRlbnQuIExldCdzIHdyYXAgaXQg
dG8gdGhlIG5leHQgbGluZS4KKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0
OjpBY3Rpb246OldyYXAsIElzRW5kT2ZMaW5lOjpZZXMgfTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIC8vIEVpdGhlciB3ZSBtYW5hZ2VkIHRvIGJyZWFrIHdpdGggbm8gb3ZlcmZsb3cgb3Ig
dGhlIGxpbmUgaXMgZW1wdHkuCisgICAgICAgICAgICBhdXRvIHRyYWlsaW5nUGFydGlhbENvbnRl
bnQgPSBSZXN1bHQ6OlBhcnRpYWxUcmFpbGluZ0NvbnRlbnQgeyBvdmVyZmxvd2luZ0NvbnRlbnQu
YnJlYWtpbmdQb3NpdGlvbi0+cnVuSW5kZXgsIHRyYWlsaW5nQ29udGVudC0+cGFydGlhbFJ1biB9
OworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdCB7IFJlc3VsdDo6QWN0aW9uOjpCcmVhaywgSXNF
bmRPZkxpbmU6OlllcywgdHJhaWxpbmdQYXJ0aWFsQ29udGVudCB9OworICAgICAgICB9OworICAg
ICAgICBpZiAoYXV0byByZXN1bHQgPSB0cnlCcmVha2luZ0NvbnRlbnRXaXRoVGV4dCgpKQorICAg
ICAgICAgICAgcmV0dXJuICpyZXN1bHQ7CisgICAgfSBlbHNlIGlmIChjb250aW51b3VzQ29udGVu
dC5ydW5zKCkuc2l6ZSgpID4gMSkgeworICAgICAgICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9y
IHZhcmlvdXMgY29udGVudC4KKyAgICAgICAgYXV0byYgcnVucyA9IGNvbnRpbnVvdXNDb250ZW50
LnJ1bnMoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBydW5zLnNpemUoKTsgKytp
KSB7CisgICAgICAgICAgICBpZiAocnVuc1tpXS5pbmxpbmVJdGVtLmlzQm94KCkpIHsKKyAgICAg
ICAgICAgICAgICBvdmVyZmxvd2luZ1J1bkluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHdlIGFyZSBu
b3QgYWxsb3dlZCB0byBicmVhayB0aGlzIG92ZXJmbG93aW5nIGNvbnRlbnQsIHdlIHN0aWxsIG5l
ZWQgdG8gZGVjaWRlIHdoZXRoZXIga2VlcCBpdCBvciB3cmFwIGl0IHRvIHRoZSBuZXh0IGxpbmUu
CisgICAgaWYgKCFsaW5lU3RhdHVzLmhhc0NvbnRlbnQpCisgICAgICAgIHJldHVybiB7IFJlc3Vs
dDo6QWN0aW9uOjpLZWVwLCBJc0VuZE9mTGluZTo6Tm8gfTsKKyAgICAvLyBOb3cgZWl0aGVyIHdy
YXAgdGhpcyBjb250ZW50IG92ZXIgdG8gdGhlIG5leHQgbGluZSBvciByZXZlcnQgYmFjayB0byBh
biBlYXJsaWVyIHdyYXBwaW5nIG9wcG9ydHVuaXR5LCBvciBub3Qgd3JhcCBhdCBhbGwuCisgICAg
YXV0byBzaG91bGRXcmFwVW5icmVha2FibGVDb250ZW50VG9OZXh0TGluZSA9IFsmXSB7CisgICAg
ICAgIC8vIFRoZSBpbmRpdmlkdWFsIHJ1bnMgaW4gdGhpcyBjb250aW51b3VzIGNvbnRlbnQgZG9u
J3QgYnJlYWssIGxldCdzIGNoZWNrIGlmIHdlIGFyZSBhbGxvd2VkIHRvIHdyYXAgdGhpcyBjb250
ZW50IHRvIG5leHQgbGluZSAoZS5nLiBwcmUgd291bGQgcHJldmVudCB1cyBmcm9tIHdyYXBwaW5n
KS4KKyAgICAgICAgLy8gUGFyZW50IHN0eWxlIGRyaXZlcyB0aGUgd3JhcHBpbmcgYmVoYXZpb3Ig
aGVyZS4KKyAgICAgICAgLy8gZS5nLiA8ZGl2IHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwIj5z
b21lIHRleHQ8ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBw
cmUtd3JhcCI+PC9kaXY+PC9kaXY+LgorICAgICAgICAvLyBXaGlsZSB0aGUgaW5saW5lLWJsb2Nr
IGhhcyBwcmUtd3JhcCB3aGljaCBhbGxvd3Mgd3JhcHBpbmcsIHRoZSBjb250ZW50IGxpdmVzIGlu
IGEgbm93cmFwIGNvbnRleHQuCisgICAgICAgIHJldHVybiBpc1dyYXBwaW5nQWxsb3dlZChjb250
aW51b3VzQ29udGVudC5ydW5zKClbb3ZlcmZsb3dpbmdSdW5JbmRleF0uaW5saW5lSXRlbSk7Cisg
ICAgfTsKKyAgICBpZiAoc2hvdWxkV3JhcFVuYnJlYWthYmxlQ29udGVudFRvTmV4dExpbmUoKSkK
KyAgICAgICAgcmV0dXJuIHsgUmVzdWx0OjpBY3Rpb246OldyYXAsIElzRW5kT2ZMaW5lOjpZZXMg
fTsKKyAgICBpZiAobGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRp
b24pCisgICAgICAgIHJldHVybiB7IFJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xhc3RXcmFwT3Bw
b3J0dW5pdHksIElzRW5kT2ZMaW5lOjpZZXMgfTsKKyAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlv
bjo6S2VlcCwgSXNFbmRPZkxpbmU6Ok5vIH07Cit9CisKK092ZXJmbG93aW5nVGV4dENvbnRlbnQg
SW5saW5lQ29udGVudEJyZWFrZXI6OnByb2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnRXaXRoVGV4dChj
b25zdCBDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQsIGNvbnN0IExpbmVTdGF0
dXMmIGxpbmVTdGF0dXMpIGNvbnN0Cit7CisgICAgYXV0byYgcnVucyA9IGNvbnRpbnVvdXNDb250
ZW50LnJ1bnMoKTsKKyAgICBBU1NFUlQoIXJ1bnMuaXNFbXB0eSgpKTsKKworICAgIGF1dG8gaXNC
cmVha2FibGVSdW4gPSBbXSAoYXV0byYgcnVuKSB7CisgICAgICAgIEFTU0VSVChydW4uaW5saW5l
SXRlbS5pc1RleHQoKSB8fCBydW4uaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgcnVu
LmlubGluZUl0ZW0uaXNJbmxpbmVCb3hFbmQoKSB8fCBydW4uaW5saW5lSXRlbS5sYXlvdXRCb3go
KS5pc0ltYWdlKCkpOworICAgICAgICBpZiAoIXJ1bi5pbmxpbmVJdGVtLmlzVGV4dCgpKSB7Cisg
ICAgICAgICAgICAvLyBDYW4ndCBicmVhayBob3Jpem9udGFsIHNwYWNpbmcgLT4gZS5nLiA8c3Bh
biBzdHlsZT0icGFkZGluZy1yaWdodDogMTAwcHg7Ij50ZXh0Y29udGVudDwvc3Bhbj4sIGlmIHRo
ZSBbaW5saW5lIGJveCBlbmRdIGlzIHRoZSBvdmVyZmxvd24gaW5saW5lIGl0ZW0KKyAgICAgICAg
ICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUncyBhbm90aGVyIGlubGluZSBpdGVtIGJl
eW9uZCB0aGUgW2lubGluZSBib3ggZW5kXSB0byBzcGxpdC4KKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHRleHQgcnVuIG5lZWRz
IHRvIHN0YXkgb24gdGhlIGN1cnJlbnQgbGluZS4gIAorICAgICAgICByZXR1cm4gaXNXcmFwcGlu
Z0FsbG93ZWQocnVuLmlubGluZUl0ZW0pOworICAgIH07CisKKyAgICBhdXRvIGZpbmRUcmFpbGlu
Z1J1bkluZGV4ID0gWyZdIChhdXRvIGJyZWFrYWJsZVJ1bkluZGV4KSAtPiBPcHRpb25hbDxzaXpl
X3Q+IHsKKyAgICAgICAgLy8gV2hlbiB0aGUgYnJlYWtpbmcgcG9zaXRpb24gaXMgYXQgdGhlIGJl
Z2lubmluZyBvZiB0aGUgcnVuLCB0aGUgdHJhaWxpbmcgcnVuIGlzIHRoZSBwcmV2aW91cyBvbmUu
CisgICAgICAgIGlmICghYnJlYWthYmxlUnVuSW5kZXgpCisgICAgICAgICAgICByZXR1cm4geyB9
OworICAgICAgICAvLyBUcnkgbm90IGJyZWFrIGNvbnRlbnQgYXQgaW5saW5lIGJveCBib3VuZGFy
eQorICAgICAgICAvLyBlLmcuIDxzcGFuPmZpdHM8L3NwYW4+PHNwYW4+b3ZlcmZsb3dzPC9zcGFu
PgorICAgICAgICAvLyB3aGVuIHRoZSB0ZXh0ICJvdmVyZmxvd3MiIGNvbXBsZXRlbHkgb3ZlcmZs
b3dzLCBsZXQncyBicmVhayB0aGUgY29udGVudCByaWdodCBiZWZvcmUgdGhlICc8c3Bhbj4nLgor
ICAgICAgICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIHN1YnNlcXVlbnQgZW1wdHkgaW5saW5l
IGJveGVzIGUuZy4KKyAgICAgICAgYXV0byB0cmFpbGluZ0NhbmRpZGF0ZUluZGV4ID0gYnJlYWth
YmxlUnVuSW5kZXggLSAxOworICAgICAgICBhdXRvIGlzQXRJbmxpbmVCb3ggPSBydW5zW3RyYWls
aW5nQ2FuZGlkYXRlSW5kZXhdLmlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpOworICAgICAg
ICByZXR1cm4gIWlzQXRJbmxpbmVCb3ggPyB0cmFpbGluZ0NhbmRpZGF0ZUluZGV4IDogdHJhaWxp
bmdDYW5kaWRhdGVJbmRleCA/IG1ha2VPcHRpb25hbCh0cmFpbGluZ0NhbmRpZGF0ZUluZGV4IC0g
MSkgOiBXVEY6Om51bGxvcHQ7CisgICAgfTsKKworICAgIC8vIENoZWNrIHdoZXJlIHRoZSBvdmVy
ZmxvdyBvY2N1cnMgYW5kIHVzZSB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSB0byBmaWd1cmUgb3V0
IHRoZSBicmVha2luZyBiZWhhdmlvdXIuCisgICAgLy8gPHNwYW4gc3R5bGU9IndvcmQtYnJlYWs6
IG5vcm1hbCI+Zmlyc3Q8L3NwYW4+PHNwYW4gc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLWFsbCI+
c2Vjb25kPC9zcGFuPjxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBub3JtYWwiPnRoaXJkPC9zcGFu
PgorCisgICAgLy8gRmlyc3QgZmluZCB0aGUgb3ZlcmZsb3dpbmcgcnVuLiAKKyAgICBhdXRvIGFj
Y3VtdWxhdGVkQ29udGVudFdpZHRoID0gSW5saW5lTGF5b3V0VW5pdCB7IH07CisgICAgYXV0byBv
dmVyZmxvd2luZ1J1bkluZGV4ID0gcnVucy5zaXplKCk7IAorICAgIGZvciAoc2l6ZV90IGluZGV4
ID0gMDsgaW5kZXggPCBydW5zLnNpemUoKTsgKytpbmRleCkgeworICAgICAgICBhdXRvIHJ1bkxv
Z2ljYWxXaWR0aCA9IHJ1bnNbaW5kZXhdLmxvZ2ljYWxXaWR0aDsKKyAgICAgICAgaWYgKGFjY3Vt
dWxhdGVkQ29udGVudFdpZHRoICsgcnVuTG9naWNhbFdpZHRoICA+IGxpbmVTdGF0dXMuYXZhaWxh
YmxlV2lkdGgpIHsKKyAgICAgICAgICAgIG92ZXJmbG93aW5nUnVuSW5kZXggPSBpbmRleDsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGFjY3VtdWxhdGVkQ29udGVudFdp
ZHRoICs9IHJ1bkxvZ2ljYWxXaWR0aDsKKyAgICB9CisgICAgLy8gV2UgaGF2ZSB0byBoYXZlIGFu
IG92ZXJmbG93aW5nIHJ1bi4KKyAgICBSRUxFQVNFX0FTU0VSVChvdmVyZmxvd2luZ1J1bkluZGV4
IDwgcnVucy5zaXplKCkpOworCisgICAgYXV0byB0cnlCcmVha2luZ092ZXJmbG93aW5nUnVuID0g
WyZdKCkgLT4gT3B0aW9uYWw8T3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlv
bj4geworICAgICAgICBhdXRvIG92ZXJmbG93aW5nUnVuID0gcnVuc1tvdmVyZmxvd2luZ1J1bklu
ZGV4XTsKKyAgICAgICAgaWYgKCFpc0JyZWFrYWJsZVJ1bihvdmVyZmxvd2luZ1J1bikpCisgICAg
ICAgICAgICByZXR1cm4geyB9OworICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gdHJ5QnJl
YWtpbmdUZXh0UnVuKG92ZXJmbG93aW5nUnVuLCBsaW5lU3RhdHVzLmNvbnRlbnRMb2dpY2FsUmln
aHQgKyBhY2N1bXVsYXRlZENvbnRlbnRXaWR0aCwgc3RkOjptYXgoMC4wZiwgbGluZVN0YXR1cy5h
dmFpbGFibGVXaWR0aCAtIGFjY3VtdWxhdGVkQ29udGVudFdpZHRoKSwgbGluZVN0YXR1cy5oYXNX
cmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pKSB7CisgICAgICAgICAgICBpZiAocGFy
dGlhbFJ1bi0+bGVuZ3RoKQorICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRD
b250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgb3ZlcmZsb3dpbmdSdW5JbmRleCwgT3ZlcmZsb3dp
bmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbjo6VHJhaWxpbmdDb250ZW50IHsgZmFsc2Us
IHBhcnRpYWxSdW4gfSB9OworICAgICAgICAgICAgLy8gV2hlbiB0aGUgYnJlYWtpbmcgcG9zaXRp
b24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcnVuLCB0aGUgdHJhaWxpbmcgcnVuIGlzIHRo
ZSBwcmV2aW91cyBvbmUuCisgICAgICAgICAgICBpZiAoYXV0byB0cmFpbGluZ1J1bkluZGV4ID0g
ZmluZFRyYWlsaW5nUnVuSW5kZXgob3ZlcmZsb3dpbmdSdW5JbmRleCkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb24geyAqdHJh
aWxpbmdSdW5JbmRleCwgT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbjo6
VHJhaWxpbmdDb250ZW50IHsgfSB9OworICAgICAgICAgICAgLy8gU29tZXRpbWVzIHdlIGNhbid0
IGFjY29tbW9kYXRlIGV2ZW4gdGhlIHZlcnkgZmlyc3QgY2hhcmFjdGVyLiAKKyAgICAgICAgICAg
IC8vIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHdoZW4gdGhlcmUncyBubyBicmVh
a2FibGUgcnVuIGluIHRoaXMgc2V0LgorICAgICAgICAgICAgcmV0dXJuIE92ZXJmbG93aW5nVGV4
dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb24geyB9OworICAgICAgICB9CisgICAgICAgIHJldHVy
biB7IH07CisgICAgfTsKKyAgICAvLyBDaGVjayBpZiB3ZSBhY3R1YWxseSBicmVhayB0aGlzIHJ1
bi4KKyAgICBpZiAoYXV0byBicmVha2luZ1Bvc2l0aW9uID0gdHJ5QnJlYWtpbmdPdmVyZmxvd2lu
Z1J1bigpKQorICAgICAgICByZXR1cm4geyBvdmVyZmxvd2luZ1J1bkluZGV4LCBicmVha2luZ1Bv
c2l0aW9uIH07CisKKyAgICBhdXRvIHRyeUJyZWFraW5nUHJldmlvdXNOb25PdmVyZmxvd2luZ1J1
bnMgPSBbJl0oKSAtPiBPcHRpb25hbDxPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bv
c2l0aW9uPiB7CisgICAgICAgIGF1dG8gcHJldmlvdXNDb250ZW50V2lkdGggPSBhY2N1bXVsYXRl
ZENvbnRlbnRXaWR0aDsKKyAgICAgICAgZm9yIChhdXRvIGluZGV4ID0gb3ZlcmZsb3dpbmdSdW5J
bmRleDsgaW5kZXgtLTspIHsKKyAgICAgICAgICAgIGF1dG8mIHJ1biA9IHJ1bnNbaW5kZXhdOwor
ICAgICAgICAgICAgcHJldmlvdXNDb250ZW50V2lkdGggLT0gcnVuLmxvZ2ljYWxXaWR0aDsKKyAg
ICAgICAgICAgIGlmICghaXNCcmVha2FibGVSdW4ocnVuKSkKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIEFTU0VSVChydW4uaW5saW5lSXRlbS5pc1RleHQoKSk7CisgICAg
ICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gdHJ5QnJlYWtpbmdUZXh0UnVuKHJ1biwgbGlu
ZVN0YXR1cy5jb250ZW50TG9naWNhbFJpZ2h0ICsgcHJldmlvdXNDb250ZW50V2lkdGgsIHsgfSwg
bGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pKSB7CisgICAg
ICAgICAgICAgICAgLy8gV2Uga25vdyB0aGlzIHJ1biBmaXRzLCBzbyBpZiBicmVha2luZyBpcyBh
bGxvd2VkIG9uIHRoZSBydW4sIGl0IHNob3VsZCByZXR1cm4gYSBub24tZW1wdHkgbGVmdC1zaWRl
CisgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQncyBlaXRoZXIgYXQgaHlwaGVuIHBvc2l0aW9u
IG9yIHRoZSBlbnRpcmUgcnVuIGlzIHJldHVybmVkLgorICAgICAgICAgICAgICAgIEFTU0VSVChw
YXJ0aWFsUnVuLT5sZW5ndGgpOworICAgICAgICAgICAgICAgIGF1dG8gcnVuSXNGdWxseUFjY29t
bW9kYXRlZCA9IHBhcnRpYWxSdW4tPmxlbmd0aCA9PSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4o
cnVuLmlubGluZUl0ZW0pLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxv
d2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgaW5kZXgsIE92ZXJmbG93aW5nVGV4
dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb246OlRyYWlsaW5nQ29udGVudCB7IGZhbHNlLCBydW5J
c0Z1bGx5QWNjb21tb2RhdGVkID8gV1RGOjpudWxsb3B0IDogcGFydGlhbFJ1biB9IH07CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICB9OworICAgIC8v
IFdlIGRpZCBub3QgbWFuYWdlIHRvIGJyZWFrIHRoZSBydW4gdGhhdCBhY3R1YWxseSBvdmVyZmxv
d3MgdGhlIGxpbmUuCisgICAgLy8gTGV0J3MgdHJ5IHRvIGZpbmQgYSBwcmV2aW91cyBicmVha2lu
ZyBwb3NpdGlvbiBzdGFydGluZyBmcm9tIHRoZSBvdmVyZmxvd2luZyBydW4uIEl0IHN1cmVseSBm
aXRzLgorICAgIGlmIChhdXRvIGJyZWFraW5nUG9zaXRpb24gPSB0cnlCcmVha2luZ1ByZXZpb3Vz
Tm9uT3ZlcmZsb3dpbmdSdW5zKCkpCisgICAgICAgIHJldHVybiB7IG92ZXJmbG93aW5nUnVuSW5k
ZXgsIGJyZWFraW5nUG9zaXRpb24gfTsKKworICAgIGF1dG8gdHJ5QnJlYWtpbmdOZXh0T3ZlcmZs
b3dpbmdSdW5zID0gWyZdKCkgLT4gT3B0aW9uYWw8T3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJl
YWtpbmdQb3NpdGlvbj4geworICAgICAgICBhdXRvIG5leHRDb250ZW50V2lkdGggPSBhY2N1bXVs
YXRlZENvbnRlbnRXaWR0aCArIHJ1bnNbb3ZlcmZsb3dpbmdSdW5JbmRleF0ubG9naWNhbFdpZHRo
OworICAgICAgICBmb3IgKGF1dG8gaW5kZXggPSBvdmVyZmxvd2luZ1J1bkluZGV4ICsgMTsgaW5k
ZXggPCBydW5zLnNpemUoKTsgKytpbmRleCkgeworICAgICAgICAgICAgYXV0byYgcnVuID0gcnVu
c1tpbmRleF07CisgICAgICAgICAgICBpZiAoaXNCcmVha2FibGVSdW4ocnVuKSkgeworICAgICAg
ICAgICAgICAgIEFTU0VSVChydW4uaW5saW5lSXRlbS5pc1RleHQoKSk7CisgICAgICAgICAgICAg
ICAgLy8gV2Uga25vdyB0aGF0IHRoaXMgcnVuIGRvZXMgbm90IGZpdCB0aGUgYXZhaWxhYmxlIHNw
YWNlLiBJZiB3ZSBjYW4gYnJlYWsgaXQgYXQgYW55IHBvc2l0aW9uLCBsZXQncyBqdXN0IHVzZSB0
aGUgc3RhcnQgb2YgdGhlIHJ1bi4KKyAgICAgICAgICAgICAgICBpZiAod29yZEJyZWFrQmVoYXZp
b3IocnVuLmlubGluZUl0ZW0uc3R5bGUoKSwgbGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlB
dFByZXZpb3VzUG9zaXRpb24pID09IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRpb24p
IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbXVzdCBiZSBvbiBhbiBpbmxpbmUgYm94IGJv
dW5kYXJ5LiBMZXQncyBnbyBiYWNrIHRvIHRoZSBydW4gaW4gZnJvbnQgb2YgdGhlIGlubGluZSBi
b3ggc3RhcnQgcnVuLgorICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIDxzcGFuPnVuYnJlYWth
YmxlX2FuZF9vdmVyZmxvdzxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay1hbGwiPmJyZWFr
YWJsZTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGF0ICJicmVha2FibGUi
LCA8c3Bhbj4gaXMgYXQgaW5kZXggLSAxIGFuZCB0aGUgdHJhaWxpbmcgcnVuIGlzIGF0IGluZGV4
IC0gMi4KKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHJ1bnNbaW5kZXggLSAxXS5pbmxpbmVJ
dGVtLmlzSW5saW5lQm94U3RhcnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gdHJhaWxp
bmdSdW5JbmRleCA9IGZpbmRUcmFpbGluZ1J1bkluZGV4KGluZGV4KTsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKCF0cmFpbGluZ1J1bkluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAv
LyBUaGlzIGNvbnRpbnVvdXMgY29udGVudCBkaWQgbm90IGZpdCBmcm9tIHRoZSBnZXQtZ28uIE5v
IHRyYWlsaW5nIHJ1bi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2lu
Z1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgfTsKKyAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgICAgICAvLyBBdCB3b3JzdCB3ZSBhcmUgYmFjayB0byB0aGUgb3Zl
cmZsb3dpbmcgcnVuLCBsaWtlIGluIHRoZSBleGFtcGxlIGFib3ZlLgorICAgICAgICAgICAgICAg
ICAgICBBU1NFUlQoKnRyYWlsaW5nUnVuSW5kZXggPj0gb3ZlcmZsb3dpbmdSdW5JbmRleCk7Cisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2lu
Z1Bvc2l0aW9uIHsgKnRyYWlsaW5nUnVuSW5kZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJy
ZWFraW5nUG9zaXRpb246OlRyYWlsaW5nQ29udGVudCB7IHRydWUgfSB9OworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gdHJ5QnJlYWtpbmdU
ZXh0UnVuKHJ1biwgbGluZVN0YXR1cy5jb250ZW50TG9naWNhbFJpZ2h0ICsgbmV4dENvbnRlbnRX
aWR0aCwgeyB9LCBsaW5lU3RhdHVzLmhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlv
bikpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHBhcnRpYWxSdW4tPmxlbmd0aCk7Cisg
ICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hbmFnZWQgdG8gYnJlYWsgdGhpcyB0ZXh0IHJ1biBt
aWQgY29udGVudC4gSXQgaGFzIHRvIGJlIGEgaHlwaGVuIGJyZWFrLgorICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IGlu
ZGV4LCBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uOjpUcmFpbGluZ0Nv
bnRlbnQgeyB0cnVlLCBwYXJ0aWFsUnVuIH0gfTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBuZXh0Q29udGVudFdpZHRoICs9IHJ1bi5sb2dpY2FsV2lkdGg7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICB9OworICAgIC8vIEF0IHRoaXMg
cG9pbnQgd2Uga25vdyB0aGF0IHRoZXJlJ3Mgbm8gYnJlYWthYmxlIHJ1biBhbGwgdGhlIHdheSB0
byB0aGUgb3ZlcmZsb3dpbmcgcnVuLgorICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGFu
eSBydW4gYWZ0ZXIgdGhlIG92ZXJmbG93aW5nIGNvbnRlbnQgY2FuIGJyZWFrLgorICAgIC8vIGUu
Zy4gPHNwYW4+dGhpc19jb250ZW50X292ZXJmbG93c19idXRfbm90X2JyZWFrYWJsZTxzcGFuPjxz
cGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay1hbGwiPmJ1dF90aGlzX2lzX2JyZWFrYWJsZTwv
c3Bhbj4KKyAgICBpZiAoYXV0byBicmVha2luZ1Bvc2l0aW9uID0gdHJ5QnJlYWtpbmdOZXh0T3Zl
cmZsb3dpbmdSdW5zKCkpCisgICAgICAgIHJldHVybiB7IG92ZXJmbG93aW5nUnVuSW5kZXgsIGJy
ZWFraW5nUG9zaXRpb24gfTsKKworICAgIC8vIEdpdmUgdXAsIHRoZXJlJ3Mgbm8gYnJlYWthYmxl
IHJ1biBpbiBoZXJlLgorICAgIHJldHVybiB7IG92ZXJmbG93aW5nUnVuSW5kZXggfTsKK30KKwor
T3B0aW9uU2V0PElubGluZUNvbnRlbnRCcmVha2VyOjpXb3JkQnJlYWtSdWxlPiBJbmxpbmVDb250
ZW50QnJlYWtlcjo6d29yZEJyZWFrQmVoYXZpb3IoY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlLCBi
b29sIGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3QKK3sKKyAgICAv
LyBEaXNyZWdhcmQgYW55IHByb2hpYml0aW9uIGFnYWluc3QgbGluZSBicmVha3MgbWFuZGF0ZWQg
YnkgdGhlIHdvcmQtYnJlYWsgcHJvcGVydHkuCisgICAgLy8gVGhlIGRpZmZlcmVudCB3cmFwcGlu
ZyBvcHBvcnR1bml0aWVzIG11c3Qgbm90IGJlIHByaW9yaXRpemVkLiBIeXBoZW5hdGlvbiBpcyBu
b3QgYXBwbGllZC4KKyAgICBpZiAoc3R5bGUubGluZUJyZWFrKCkgPT0gTGluZUJyZWFrOjpBbnl3
aGVyZSkKKyAgICAgICAgcmV0dXJuIHsgV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlv
biB9OworICAgIC8vIEJyZWFraW5nIGlzIGFsbG93ZWQgd2l0aGluIOKAnHdvcmRz4oCdLgorICAg
IGlmIChzdHlsZS53b3JkQnJlYWsoKSA9PSBXb3JkQnJlYWs6OkJyZWFrQWxsKQorICAgICAgICBy
ZXR1cm4geyBXb3JkQnJlYWtSdWxlOjpBdEFyYml0cmFyeVBvc2l0aW9uIH07CisgICAgLy8gQnJl
YWtpbmcgaXMgZm9yYmlkZGVuIHdpdGhpbiDigJx3b3Jkc+KAnS4KKyAgICBpZiAoc3R5bGUud29y
ZEJyZWFrKCkgPT0gV29yZEJyZWFrOjpLZWVwQWxsKQorICAgICAgICByZXR1cm4geyB9OworCisg
ICAgYXV0byBicmVha1J1bGVzID0gT3B0aW9uU2V0PFdvcmRCcmVha1J1bGU+IHsgfTsKKyAgICBh
dXRvIGh5cGhlbmF0aW9uSXNBbGxvd2VkID0gIW5faHlwaGVuYXRpb25Jc0Rpc2FibGVkICYmIHN0
eWxlLmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpBdXRvICYmIGNhbkh5cGhlbmF0ZShzdHlsZS5jb21w
dXRlZExvY2FsZSgpKTsKKyAgICBpZiAoaHlwaGVuYXRpb25Jc0FsbG93ZWQpCisgICAgICAgIGJy
ZWFrUnVsZXMuYWRkKHsgV29yZEJyZWFrUnVsZTo6QXRIeXBoZW5hdGlvbk9wcG9ydHVuaXRpZXMg
fSk7CisgICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgY29udGVudCwgdGhlIHdv
cmQtYnJlYWsgcHJvcGVydHkgYWxzbyBzdXBwb3J0cyBhIGRlcHJlY2F0ZWQgYnJlYWstd29yZCBr
ZXl3b3JkLgorICAgIC8vIFdoZW4gc3BlY2lmaWVkLCB0aGlzIGhhcyB0aGUgc2FtZSBlZmZlY3Qg
YXMgd29yZC1icmVhazogbm9ybWFsIGFuZCBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZSwgcmVnYXJk
bGVzcyBvZiB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBvdmVyZmxvdy13cmFwIHByb3BlcnR5Lgor
ICAgIGlmIChzdHlsZS53b3JkQnJlYWsoKSA9PSBXb3JkQnJlYWs6OkJyZWFrV29yZCAmJiAhaGFz
V3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSB7CisgICAgICAgIGJyZWFrUnVsZXMu
YWRkKHsgV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbiB9KTsKKyAgICAgICAgcmV0
dXJuIGJyZWFrUnVsZXM7CisgICAgfQorICAgIC8vIE92ZXJmbG93V3JhcDo6QnJlYWs6IEFuIG90
aGVyd2lzZSB1bmJyZWFrYWJsZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIG1heSBiZSBicm9rZW4g
YXQgYW4gYXJiaXRyYXJ5IHBvaW50IGlmIHRoZXJlIGFyZSBubyBvdGhlcndpc2UtYWNjZXB0YWJs
ZSBicmVhayBwb2ludHMgaW4gdGhlIGxpbmUuCisgICAgaWYgKHN0eWxlLm92ZXJmbG93V3JhcCgp
ID09IE92ZXJmbG93V3JhcDo6QnJlYWsgJiYgIWhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQ
b3NpdGlvbikgeworICAgICAgICBicmVha1J1bGVzLmFkZCh7IFdvcmRCcmVha1J1bGU6OkF0QXJi
aXRyYXJ5UG9zaXRpb24gfSk7CisgICAgICAgIHJldHVybiBicmVha1J1bGVzOworICAgIH0KKyAg
ICByZXR1cm4gYnJlYWtSdWxlczsKK30KKworT3B0aW9uYWw8SW5saW5lQ29udGVudEJyZWFrZXI6
OlBhcnRpYWxSdW4+IElubGluZUNvbnRlbnRCcmVha2VyOjp0cnlCcmVha2luZ1RleHRSdW4oY29u
c3QgQ29udGludW91c0NvbnRlbnQ6OlJ1biYgb3ZlcmZsb3dpbmdSdW4sIElubGluZUxheW91dFVu
aXQgbG9naWNhbExlZnQsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGF2YWlsYWJsZVdpZHRo
LCBib29sIGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3QKK3sKKyAg
ICBBU1NFUlQob3ZlcmZsb3dpbmdSdW4uaW5saW5lSXRlbS5pc1RleHQoKSk7CisgICAgYXV0byYg
aW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4ob3ZlcmZsb3dpbmdSdW4u
aW5saW5lSXRlbSk7CisgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVUZXh0SXRlbS5zdHlsZSgpOwor
ICAgIGF1dG8gYXZhaWxhYmxlU3BhY2VJc0luZmluaXRlID0gIWF2YWlsYWJsZVdpZHRoLmhhc1Zh
bHVlKCk7CisKKyAgICBhdXRvIGJyZWFrUnVsZXMgPSB3b3JkQnJlYWtCZWhhdmlvcihzdHlsZSwg
aGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKTsKKyAgICBpZiAoYnJlYWtSdWxl
cy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICBpZiAoYnJlYWtSdWxlcy5j
b250YWlucyhXb3JkQnJlYWtSdWxlOjpBdEh5cGhlbmF0aW9uT3Bwb3J0dW5pdGllcykpIHsKKyAg
ICAgICAgYXV0byB0cnlCcmVha2luZ0F0SHlwaGVuYXRpb25PcHBvcnR1bml0eSA9IFsmXSgpIC0+
IE9wdGlvbmFsPFBhcnRpYWxSdW4+IHsKKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIGh5cGhlbiBw
b3NpdGlvbiBhcyBmb2xsb3dzOgorICAgICAgICAgICAgLy8gMS4gU3BsaXQgdGhlIHRleHQgYnkg
dGFraW5nIHRoZSBoeXBoZW4gd2lkdGggaW50byBhY2NvdW50CisgICAgICAgICAgICAvLyAyLiBG
aW5kIHRoZSBsYXN0IGh5cGhlbiBwb3NpdGlvbiBiZWZvcmUgdGhlIHNwbGl0IHBvc2l0aW9uCisg
ICAgICAgICAgICBpZiAoIWF2YWlsYWJsZVNwYWNlSXNJbmZpbml0ZSAmJiAhKmF2YWlsYWJsZVdp
ZHRoKSB7CisgICAgICAgICAgICAgICAgLy8gV2Ugd29uJ3QgYmUgYWJsZSB0byBmaW5kIGh5cGhl
biBsb2NhdGlvbiB3aGVuIHRoZXJlJ3Mgbm8gYXZhaWxhYmxlIHNwYWNlLgorICAgICAgICAgICAg
ICAgIHJldHVybiB7IH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIHJ1bkxlbmd0
aCA9IGlubGluZVRleHRJdGVtLmxlbmd0aCgpOworICAgICAgICAgICAgdW5zaWduZWQgbGltaXRC
ZWZvcmUgPSBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCkgPT0gUmVuZGVyU3R5bGU6Omlu
aXRpYWxIeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCkgPyAwIDogc3R5bGUuaHlwaGVuYXRpb25MaW1p
dEJlZm9yZSgpOworICAgICAgICAgICAgdW5zaWduZWQgbGltaXRBZnRlciA9IHN0eWxlLmh5cGhl
bmF0aW9uTGltaXRBZnRlcigpID09IFJlbmRlclN0eWxlOjppbml0aWFsSHlwaGVuYXRpb25MaW1p
dEFmdGVyKCkgPyAwIDogc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCk7CisgICAgICAgICAg
ICAvLyBDaGVjayBpZiB0aGlzIHJ1biBjYW4gYWNjb21tb2RhdGUgdGhlIGJlZm9yZS9hZnRlciBs
aW1pdHMgYXQgYWxsIGJlZm9yZSBzdGFydCBtZWFzdXJpbmcgdGV4dC4KKyAgICAgICAgICAgIGlm
IChsaW1pdEJlZm9yZSA+PSBydW5MZW5ndGggfHwgbGltaXRBZnRlciA+PSBydW5MZW5ndGggfHwg
bGltaXRCZWZvcmUgKyBsaW1pdEFmdGVyID4gcnVuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHJl
dHVybiB7IH07CisKKyAgICAgICAgICAgIHVuc2lnbmVkIGxlZnRTaWRlTGVuZ3RoID0gcnVuTGVu
Z3RoOworICAgICAgICAgICAgYXV0byYgZm9udENhc2NhZGUgPSBzdHlsZS5mb250Q2FzY2FkZSgp
OworICAgICAgICAgICAgYXV0byBoeXBoZW5XaWR0aCA9IElubGluZUxheW91dFVuaXQgeyBmb250
Q2FzY2FkZS53aWR0aChUZXh0UnVuIHsgU3RyaW5nVmlldyB7IHN0eWxlLmh5cGhlblN0cmluZygp
IH0gfSkgfTsKKyAgICAgICAgICAgIGlmICghYXZhaWxhYmxlU3BhY2VJc0luZmluaXRlKSB7Cisg
ICAgICAgICAgICAgICAgYXV0byBhdmFpbGFibGVXaWR0aEV4Y2x1ZGluZ0h5cGhlbiA9ICphdmFp
bGFibGVXaWR0aCAtIGh5cGhlbldpZHRoOworICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVX
aWR0aEV4Y2x1ZGluZ0h5cGhlbiA8PSAwIHx8ICFlbm91Z2hXaWR0aEZvckh5cGhlbmF0aW9uKGF2
YWlsYWJsZVdpZHRoRXhjbHVkaW5nSHlwaGVuLCBmb250Q2FzY2FkZS5waXhlbFNpemUoKSkpCisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgICAgICAgICAgbGVmdFNpZGVM
ZW5ndGggPSBUZXh0VXRpbDo6c3BsaXQoaW5saW5lVGV4dEl0ZW0sIG92ZXJmbG93aW5nUnVuLmxv
Z2ljYWxXaWR0aCwgYXZhaWxhYmxlV2lkdGhFeGNsdWRpbmdIeXBoZW4sIGxvZ2ljYWxMZWZ0KS5s
ZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGVmdFNpZGVMZW5ndGggPCBs
aW1pdEJlZm9yZSkKKyAgICAgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICAgICAgLy8g
QWRqdXN0IGJlZm9yZSBpbmRleCB0byBhY2NvbW1vZGF0ZSB0aGUgbGltaXQtYWZ0ZXIgdmFsdWUg
KGl0J3MgdGhlIGxhc3QgcG90ZW50aWFsIGh5cGhlbiBsb2NhdGlvbiBpbiB0aGlzIHJ1bikuCisg
ICAgICAgICAgICBhdXRvIGh5cGhlbkJlZm9yZSA9IHN0ZDo6bWluKGxlZnRTaWRlTGVuZ3RoLCBy
dW5MZW5ndGggLSBsaW1pdEFmdGVyKSArIDE7CisgICAgICAgICAgICB1bnNpZ25lZCBoeXBoZW5M
b2NhdGlvbiA9IGxhc3RIeXBoZW5Mb2NhdGlvbihTdHJpbmdWaWV3KGlubGluZVRleHRJdGVtLmlu
bGluZVRleHRCb3goKS5jb250ZW50KCkpLnN1YnN0cmluZyhpbmxpbmVUZXh0SXRlbS5zdGFydCgp
LCBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSksIGh5cGhlbkJlZm9yZSwgc3R5bGUuY29tcHV0ZWRM
b2NhbGUoKSk7CisgICAgICAgICAgICBpZiAoIWh5cGhlbkxvY2F0aW9uIHx8IGh5cGhlbkxvY2F0
aW9uIDwgbGltaXRCZWZvcmUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAg
ICAgIC8vIGh5cGhlbkxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGlzIElu
bGluZUl0ZW1UZXh0LgorICAgICAgICAgICAgQVNTRVJUKGlubGluZVRleHRJdGVtLnN0YXJ0KCkg
KyBoeXBoZW5Mb2NhdGlvbiA8IGlubGluZVRleHRJdGVtLmVuZCgpKTsKKyAgICAgICAgICAgIGF1
dG8gdHJhaWxpbmdQYXJ0aWFsUnVuV2lkdGhXaXRoSHlwaGVuID0gVGV4dFV0aWw6OndpZHRoKGlu
bGluZVRleHRJdGVtLCBpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBpbmxpbmVUZXh0SXRlbS5zdGFy
dCgpICsgaHlwaGVuTG9jYXRpb24sIGxvZ2ljYWxMZWZ0KTsKKyAgICAgICAgICAgIHJldHVybiBQ
YXJ0aWFsUnVuIHsgaHlwaGVuTG9jYXRpb24sIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoV2l0aEh5
cGhlbiwgaHlwaGVuV2lkdGggfTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKGF1dG8gcGFydGlh
bFJ1biA9IHRyeUJyZWFraW5nQXRIeXBoZW5hdGlvbk9wcG9ydHVuaXR5KCkpCisgICAgICAgICAg
ICByZXR1cm4gcGFydGlhbFJ1bjsKKyAgICB9CisKKyAgICBpZiAoYnJlYWtSdWxlcy5jb250YWlu
cyhXb3JkQnJlYWtSdWxlOjpBdEFyYml0cmFyeVBvc2l0aW9uKSkgeworICAgICAgICBhdXRvIHRy
eUJyZWFraW5nQXRBcmJpdHJhcnlQb3NpdGlvbiA9IFsmXSgpIC0+IFBhcnRpYWxSdW4geworICAg
ICAgICAgICAgaWYgKCFpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAg
IC8vIEVtcHR5IHRleHQgcnVucyBtYXkgYmUgYnJlYWthYmxlIGJhc2VkIG9uIHN0eWxlLCBidXQg
aW4gcHJhY3RpY2Ugd2UgY2FuJ3QgcmVhbGx5IHNwbGl0IHRoZW0gYW55IGZ1cnRoZXIuCisgICAg
ICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChh
dmFpbGFibGVTcGFjZUlzSW5maW5pdGUpIHsKKyAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBy
dW4gY2FuIGJlIHNwbGl0IGF0IGFyYml0cmFyeSBwb3NpdGlvbiBsZXQncyBqdXN0IHJldHVybiB0
aGUgZW50aXJlIHJ1biB3aGVuIGl0IGlzIGludGVuZGVkIHRvIGZpdCBvbiB0aGUgbGluZS4KKyAg
ICAgICAgICAgICAgICBBU1NFUlQoaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpOworICAgICAgICAg
ICAgICAgIGF1dG8gdHJhaWxpbmdQYXJ0aWFsUnVuV2lkdGggPSBUZXh0VXRpbDo6d2lkdGgoaW5s
aW5lVGV4dEl0ZW0sIGxvZ2ljYWxMZWZ0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4geyBpbmxp
bmVUZXh0SXRlbS5sZW5ndGgoKSwgdHJhaWxpbmdQYXJ0aWFsUnVuV2lkdGggfTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGlmICghKmF2YWlsYWJsZVdpZHRoKSB7CisgICAgICAgICAgICAg
ICAgLy8gRmFzdCBwYXRoIGZvciBjYXNlcyB3aGVuIHRoZXJlJ3Mgbm8gcm9vbSBhdCBhbGwuIFRo
ZSBjb250ZW50IGlzIGJyZWFrYWJsZSBidXQgd2UgZG9uJ3QgaGF2ZSBzcGFjZSBmb3IgaXQuCisg
ICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1
dG8gc3BsaXREYXRhID0gVGV4dFV0aWw6OnNwbGl0KGlubGluZVRleHRJdGVtLCBvdmVyZmxvd2lu
Z1J1bi5sb2dpY2FsV2lkdGgsICphdmFpbGFibGVXaWR0aCwgbG9naWNhbExlZnQpOworICAgICAg
ICAgICAgcmV0dXJuIHsgc3BsaXREYXRhLmxlbmd0aCwgc3BsaXREYXRhLmxvZ2ljYWxXaWR0aCB9
OworICAgICAgICB9OworICAgICAgICAvLyBXaXRoIGFyYml0cmFyeSBicmVha2luZyB0aGVyZSdz
IGFsd2F5cyBhIHZhbGlkIGJyZWFraW5nIHBvc2l0aW9uIChldmVuIGlmIGl0IGlzIGJlZm9yZSB0
aGUgZmlyc3QgcG9zaXRpb24pLgorICAgICAgICByZXR1cm4gdHJ5QnJlYWtpbmdBdEFyYml0cmFy
eVBvc2l0aW9uKCk7CisgICAgfQorICAgIHJldHVybiB7IH07Cit9CisKK3ZvaWQgSW5saW5lQ29u
dGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50OjphcHBlbmQoY29uc3QgSW5saW5lSXRlbSYg
aW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgsIE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+IGNvbGxhcHNpYmxlV2lkdGgpCit7CisgICAgbV9ydW5zLmFwcGVuZCh7IGlu
bGluZUl0ZW0sIGxvZ2ljYWxXaWR0aCB9KTsKKyAgICBtX2xvZ2ljYWxXaWR0aCA9IGNsYW1wVG88
SW5saW5lTGF5b3V0VW5pdD4obV9sb2dpY2FsV2lkdGggKyBsb2dpY2FsV2lkdGgpOworICAgIGlm
ICghY29sbGFwc2libGVXaWR0aCkgeworICAgICAgICBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRo
ID0geyB9OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgqY29sbGFwc2libGVXaWR0
aCA9PSBsb2dpY2FsV2lkdGgpIHsKKyAgICAgICAgLy8gRnVsbHkgY29sbGFwc2libGUgcnVuLgor
ICAgICAgICBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoICs9IGxvZ2ljYWxXaWR0aDsKKyAgICAg
ICAgQVNTRVJUKG1fY29sbGFwc2libGVMb2dpY2FsV2lkdGggPD0gbV9sb2dpY2FsV2lkdGgpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFBhcnRpYWxseSBjb2xsYXBzaWJsZSBydW4u
CisgICAgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCA9ICpjb2xsYXBzaWJsZVdpZHRoOworICAg
IEFTU0VSVChtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoIDw9IG1fbG9naWNhbFdpZHRoKTsKK30K
Kwordm9pZCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OnJlc2V0KCkK
K3sKKyAgICBtX2xvZ2ljYWxXaWR0aCA9IHsgfTsKKyAgICBtX2NvbGxhcHNpYmxlTG9naWNhbFdp
ZHRoID0geyB9OworICAgIG1fcnVucy5jbGVhcigpOworfQorCit9Cit9CisjZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9y
bWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2VyLmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uNWQyZDRkNmNlOGMxODkzMWQ1ZmU4YjUwYTM3MzAxZDRhY2E4ZTdkOQotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5oCkBAIC0wLDAgKzEsMTUwIEBA
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
TkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkxheW91dFVuaXRzLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgUmVuZGVyU3R5bGU7CisKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFz
cyBJbmxpbmVJdGVtOworc3RydWN0IE92ZXJmbG93aW5nVGV4dENvbnRlbnQ7CisKK2NsYXNzIElu
bGluZUNvbnRlbnRCcmVha2VyIHsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgUGFydGlhbFJ1biB7Cisg
ICAgICAgIHNpemVfdCBsZW5ndGggeyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgbG9n
aWNhbFdpZHRoIHsgMCB9OworICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBoeXBo
ZW5XaWR0aCB7IH07CisgICAgfTsKKyAgICBlbnVtIGNsYXNzIElzRW5kT2ZMaW5lIHsgTm8sIFll
cyB9OworICAgIHN0cnVjdCBSZXN1bHQgeworICAgICAgICBlbnVtIGNsYXNzIEFjdGlvbiB7Cisg
ICAgICAgICAgICBLZWVwLCAvLyBLZWVwIGNvbnRlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAg
ICAgICAgICAgIEJyZWFrLCAvLyBQYXJ0aWFsIGNvbnRlbnQgaXMgb24gdGhlIGN1cnJlbnQgbGlu
ZS4KKyAgICAgICAgICAgIFdyYXAsIC8vIENvbnRlbnQgaXMgd3JhcHBlZCB0byB0aGUgbmV4dCBs
aW5lLgorICAgICAgICAgICAgV3JhcFdpdGhIeXBoZW4sIC8vIENvbnRlbnQgaXMgd3JhcHBlZCB0
byB0aGUgbmV4dCBsaW5lIGFuZCB0aGUgY3VycmVudCBsaW5lIGVuZHMgd2l0aCBhIHZpc2libGUg
aHlwaGVuLgorICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgY29udGVudCBvdmVyZmxvd3MgYW5k
IGNhbid0IGdldCBicm9rZW4gdXAgaW50byBzbWFsbGVyIGJpdHMuCisgICAgICAgICAgICBSZXZl
cnRUb0xhc3RXcmFwT3Bwb3J0dW5pdHksIC8vIFRoZSBjb250ZW50IG5lZWRzIHRvIGJlIHJldmVy
dGVkIGJhY2sgdG8gdGhlIGxhc3Qgd3JhcCBvcHBvcnR1bml0eS4KKyAgICAgICAgICAgIFJldmVy
dFRvTGFzdE5vbk92ZXJmbG93aW5nV3JhcE9wcG9ydHVuaXR5IC8vIFRoZSBjb250ZW50IG5lZWRz
IHRvIGJlIHJldmVydGVkIGJhY2sgdG8gYSB3cmFwIG9wcG9ydHVuaXR5IHRoYXQgc3RpbGwgZml0
cyB0aGUgbGluZS4KKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IFBhcnRpYWxUcmFpbGluZ0Nv
bnRlbnQgeworICAgICAgICAgICAgc2l6ZV90IHRyYWlsaW5nUnVuSW5kZXggeyAwIH07CisgICAg
ICAgICAgICBPcHRpb25hbDxQYXJ0aWFsUnVuPiBwYXJ0aWFsUnVuOyAvLyBudWxsb3B0IHBhcnRp
YWwgcnVuIG1lYW5zIHRoZSB0cmFpbGluZyBydW4gaXMgYSBjb21wbGV0ZSBydW4uCisgICAgICAg
IH07CisgICAgICAgIEFjdGlvbiBhY3Rpb24geyBBY3Rpb246OktlZXAgfTsKKyAgICAgICAgSXNF
bmRPZkxpbmUgaXNFbmRPZkxpbmUgeyBJc0VuZE9mTGluZTo6Tm8gfTsKKyAgICAgICAgT3B0aW9u
YWw8UGFydGlhbFRyYWlsaW5nQ29udGVudD4gcGFydGlhbFRyYWlsaW5nQ29udGVudCB7IH07Cisg
ICAgICAgIGNvbnN0IElubGluZUl0ZW0qIGxhc3RXcmFwT3Bwb3J0dW5pdHlJdGVtIHsgbnVsbHB0
ciB9OworICAgIH07CisKKyAgICAvLyBUaGlzIHN0cnVjdCByZXByZXNlbnRzIHRoZSBhbW91bnQg
b2YgY29udGludW91cyBjb250ZW50IGNvbW1pdHRlZCB0byBjb250ZW50IGJyZWFraW5nIGF0IGEg
dGltZSAobm8gaW4tYmV0d2VlbiB3cmFwIG9wcG9ydHVuaXRpZXMpLgorICAgIC8vIGUuZy4KKyAg
ICAvLyA8ZGl2PnRleHQgY29udGVudCA8c3Bhbj5zcGFuMTwvc3Bhbj5iZXR3ZWVuPHNwYW4+c3Bh
bjI8L3NwYW4+PC9kaXY+CisgICAgLy8gW3RleHRdWyBdW2NvbnRlbnRdWyBdW2lubGluZSBib3gg
c3RhcnRdW3NwYW4xXVtpbmxpbmUgYm94IGVuZF1bYmV0d2Vlbl1baW5saW5lIGJveCBzdGFydF1b
c3BhbjJdW2lubGluZSBib3ggZW5kXQorICAgIC8vIGNvbnRpbnVvdXMgY2FuZGlkYXRlIGNvbnRl
bnQgYXQgYSB0aW1lOgorICAgIC8vIDEuIFt0ZXh0XQorICAgIC8vIDIuIFsgXQorICAgIC8vIDMu
IFtjb250ZW50XQorICAgIC8vIDQuIFsgXQorICAgIC8vIDUuIFtpbmxpbmUgYm94IHN0YXJ0XVtz
cGFuMV1baW5saW5lIGJveCBlbmRdW2JldHdlZW5dW2lubGluZSBib3ggc3RhcnRdW3NwYW4yXVtp
bmxpbmUgYm94IGVuZF0KKyAgICAvLyBzZWUgaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy10
ZXh0LTMvI2xpbmUtYnJlYWstZGV0YWlscworICAgIHN0cnVjdCBDb250aW51b3VzQ29udGVudCB7
CisgICAgICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4g
bV9sb2dpY2FsV2lkdGg7IH0KKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBjb2xsYXBzaWJsZUxv
Z2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fY29sbGFwc2libGVMb2dpY2FsV2lkdGg7IH0K
KyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBub25Db2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCgpIGNv
bnN0IHsgcmV0dXJuIGxvZ2ljYWxXaWR0aCgpIC0gY29sbGFwc2libGVMb2dpY2FsV2lkdGgoKTsg
fQorICAgICAgICBib29sIGhhc1RyYWlsaW5nQ29sbGFwc2libGVDb250ZW50KCkgY29uc3QgeyBy
ZXR1cm4gISFjb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCgpOyB9CisgICAgICAgIGJvb2wgaXNGdWxs
eUNvbGxhcHNpYmxlKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFdpZHRoKCkgPT0gY29sbGFwc2li
bGVMb2dpY2FsV2lkdGgoKTsgfQorCisgICAgICAgIHZvaWQgYXBwZW5kKGNvbnN0IElubGluZUl0
ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCwgT3B0aW9uYWw8SW5saW5lTGF5b3V0
VW5pdD4gY29sbGFwc2libGVXaWR0aCk7CisgICAgICAgIHZvaWQgcmVzZXQoKTsKKworICAgICAg
ICBzdHJ1Y3QgUnVuIHsKKyAgICAgICAgICAgIFJ1bihjb25zdCBJbmxpbmVJdGVtJiwgSW5saW5l
TGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOworICAgICAgICAgICAgUnVuKGNvbnN0IFJ1biYpOwor
ICAgICAgICAgICAgUnVuJiBvcGVyYXRvcj0oY29uc3QgUnVuJik7CisKKyAgICAgICAgICAgIGNv
bnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW07CisgICAgICAgICAgICBJbmxpbmVMYXlvdXRVbml0
IGxvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICAgICAgfTsKKyAgICAgICAgdXNpbmcgUnVuTGlzdCA9
IFZlY3RvcjxSdW4sIDM+OworICAgICAgICBjb25zdCBSdW5MaXN0JiBydW5zKCkgY29uc3QgeyBy
ZXR1cm4gbV9ydW5zOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBSdW5MaXN0IG1fcnVuczsK
KyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2xvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoIHsgMCB9OworICAgIH07
CisKKyAgICBzdHJ1Y3QgTGluZVN0YXR1cyB7CisgICAgICAgIElubGluZUxheW91dFVuaXQgY29u
dGVudExvZ2ljYWxSaWdodCB7IDAgfTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFi
bGVXaWR0aCB7IDAgfTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBjb2xsYXBzaWJsZVdpZHRo
IHsgMCB9OworICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB0cmFpbGluZ1NvZnRI
eXBoZW5XaWR0aDsKKyAgICAgICAgYm9vbCBoYXNGdWxseUNvbGxhcHNpYmxlVHJhaWxpbmdSdW4g
eyBmYWxzZSB9OworICAgICAgICBib29sIGhhc0NvbnRlbnQgeyBmYWxzZSB9OworICAgICAgICBi
b29sIGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbiB7IGZhbHNlIH07CisgICAg
fTsKKyAgICBSZXN1bHQgcHJvY2Vzc0lubGluZUNvbnRlbnQoY29uc3QgQ29udGludW91c0NvbnRl
bnQmLCBjb25zdCBMaW5lU3RhdHVzJik7CisgICAgdm9pZCBzZXRIeXBoZW5hdGlvbkRpc2FibGVk
KCkgeyBuX2h5cGhlbmF0aW9uSXNEaXNhYmxlZCA9IHRydWU7IH0KKworICAgIHN0YXRpYyBib29s
IGlzV3JhcHBpbmdBbGxvd2VkKGNvbnN0IElubGluZUl0ZW0mKTsKKworcHJpdmF0ZToKKyAgICBS
ZXN1bHQgcHJvY2Vzc092ZXJmbG93aW5nQ29udGVudChjb25zdCBDb250aW51b3VzQ29udGVudCYs
IGNvbnN0IExpbmVTdGF0dXMmKSBjb25zdDsKKyAgICBPdmVyZmxvd2luZ1RleHRDb250ZW50IHBy
b2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnRXaXRoVGV4dChjb25zdCBDb250aW51b3VzQ29udGVudCYs
IGNvbnN0IExpbmVTdGF0dXMmKSBjb25zdDsKKyAgICBPcHRpb25hbDxQYXJ0aWFsUnVuPiB0cnlC
cmVha2luZ1RleHRSdW4oY29uc3QgQ29udGludW91c0NvbnRlbnQ6OlJ1biYgb3ZlcmZsb3dSdW4s
IElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+
IGF2YWlsYWJsZVdpZHRoLCBib29sIGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlv
bikgY29uc3Q7CisKKyAgICBlbnVtIGNsYXNzIFdvcmRCcmVha1J1bGUgeworICAgICAgICBBdEFy
Yml0cmFyeVBvc2l0aW9uICAgICAgICA9IDEgPDwgMCwKKyAgICAgICAgQXRIeXBoZW5hdGlvbk9w
cG9ydHVuaXRpZXMgPSAxIDw8IDEKKyAgICB9OworICAgIE9wdGlvblNldDxXb3JkQnJlYWtSdWxl
PiB3b3JkQnJlYWtCZWhhdmlvcihjb25zdCBSZW5kZXJTdHlsZSYsIGJvb2wgaGFzV3JhcE9wcG9y
dHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSBjb25zdDsKKyAgICBib29sIHNob3VsZEtlZXBFbmRP
ZkxpbmVXaGl0ZXNwYWNlKGNvbnN0IENvbnRpbnVvdXNDb250ZW50JikgY29uc3Q7CisKKyAgICBi
b29sIG5faHlwaGVuYXRpb25Jc0Rpc2FibGVkIHsgZmFsc2UgfTsKK307CisKK2lubGluZSBJbmxp
bmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OlJ1bjo6UnVuKGNvbnN0IElubGlu
ZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQorICAgIDog
aW5saW5lSXRlbShpbmxpbmVJdGVtKQorICAgICwgbG9naWNhbFdpZHRoKGxvZ2ljYWxXaWR0aCkK
K3sKK30KKworaW5saW5lIElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudDo6
UnVuOjpSdW4oY29uc3QgUnVuJiBvdGhlcikKKyAgICA6IGlubGluZUl0ZW0ob3RoZXIuaW5saW5l
SXRlbSkKKyAgICAsIGxvZ2ljYWxXaWR0aChvdGhlci5sb2dpY2FsV2lkdGgpCit7Cit9CisKK30K
K30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9J
bmxpbmVGb3JtYXR0aW5nQ29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTUxZWFmZmNkYTNlZWNjNDNl
MjE1ZDFkOTY0NjEwNmMwY2M1YTk3MgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0
aW5nQ29udGV4dC5jcHAKQEAgLTAsMCArMSw2MTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVO
QUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRmxvYXRpbmdDb250
ZXh0LmgiCisjaW5jbHVkZSAiRm9udENhc2NhZGUuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0
aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbmxpbmVMaW5lQm94LmgiCisjaW5jbHVkZSAiSW5saW5l
TGluZVJ1bi5oIgorI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgiCisjaW5jbHVkZSAiSW52YWxp
ZGF0aW9uU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRD
b250YWluZXJCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5
b3V0SW5pdGlhbENvbnRhaW5pbmdCbG9jay5oIgorI2luY2x1ZGUgIkxheW91dElubGluZVRleHRC
b3guaCIKKyNpbmNsdWRlICJMYXlvdXRMaW5lQnJlYWtCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRS
ZXBsYWNlZEJveC5oIgorI2luY2x1ZGUgIkxheW91dFN0YXRlLmgiCisjaW5jbHVkZSAiTG9nZ2lu
Zy5oIgorI2luY2x1ZGUgIlJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuaCIKKyNpbmNsdWRlICJUZXh0
VXRpbC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisjaW5jbHVkZSA8d3Rm
L3RleHQvVGV4dFN0cmVhbS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5
b3V0IHsKKworV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKElubGluZUZvcm1hdHRpbmdDb250
ZXh0KTsKKworSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OklubGluZUZvcm1hdHRpbmdDb250ZXh0
KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBJbmxpbmVGb3JtYXR0
aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSkKKyAgICA6IEZvcm1hdHRpbmdDb250ZXh0KGZvcm1h
dHRpbmdDb250ZXh0Um9vdCwgZm9ybWF0dGluZ1N0YXRlKQoreworfQorCitzdGF0aWMgaW5saW5l
IGNvbnN0IEJveCogbmV4dElubGluZUxldmVsQm94VG9MYXlvdXQoY29uc3QgQm94JiBsYXlvdXRC
b3gsIGNvbnN0IENvbnRhaW5lckJveCYgc3RheVdpdGhpbikKK3sKKyAgICAvLyBBdG9taWMgaW5s
aW5lLWxldmVsIGJveGVzIGFuZCBmbG9hdHMgYXJlIG9wYXF1ZSBib3hlcyBtZWFuaW5nIHRoYXQg
dGhleSBhcmUKKyAgICAvLyByZXNwb25zaWJsZSBmb3IgdGhlaXIgb3duIGNvbnRlbnQgKGRvIG5v
dCBuZWVkIHRvIGRlc2NlbmQgaW50byB0aGVpciBzdWJ0cmVlcykuCisgICAgLy8gT25seSBpbmxp
bmUgYm94ZXMgbWF5IGhhdmUgcmVsZXZhbnQgZGVzY2VuZGFudCBjb250ZW50LgorICAgIGlmIChs
YXlvdXRCb3guaXNJbmxpbmVCb3goKSkgeworICAgICAgICBpZiAoaXM8Q29udGFpbmVyQm94Pihs
YXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dP
ckZsb2F0aW5nQ2hpbGQoKSkgeworICAgICAgICAgICAgLy8gQW5vbnltb3VzIGlubGluZSB0ZXh0
IGJveGVzL2xpbmUgYnJlYWtzIGNhbid0IGhhdmUgZGVzY2VuZGFudCBjb250ZW50IGJ5IGRlZmlu
aXRpb24uCisgICAgICAgICAgICBBU1NFUlQoIWxheW91dEJveC5pc0lubGluZVRleHRCb3goKSAm
JiAhbGF5b3V0Qm94LmlzTGluZUJyZWFrQm94KCkpOworICAgICAgICAgICAgcmV0dXJuIGRvd25j
YXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgp
OworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvKiBuZXh0SW5QcmVPcmRlciA9ICZs
YXlvdXRCb3g7IG5leHRJblByZU9yZGVyICYmIG5leHRJblByZU9yZGVyICE9ICZzdGF5V2l0aGlu
OyBuZXh0SW5QcmVPcmRlciA9ICZuZXh0SW5QcmVPcmRlci0+cGFyZW50KCkpIHsKKyAgICAgICAg
aWYgKGF1dG8qIG5leHRTaWJsaW5nID0gbmV4dEluUHJlT3JkZXItPm5leHRJbkZsb3dPckZsb2F0
aW5nU2libGluZygpKQorICAgICAgICAgICAgcmV0dXJuIG5leHRTaWJsaW5nOworICAgIH0KKyAg
ICByZXR1cm4gbnVsbHB0cjsKK30KKwordm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6bGF5
b3V0SW5GbG93Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYgaW52YWxpZGF0aW9uU3RhdGUsIGNv
bnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgTE9H
X1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltTdGFydF0g
LT4gaW5saW5lIGZvcm1hdHRpbmcgY29udGV4dCAtPiBmb3JtYXR0aW5nIHJvb3QoIiA8PCAmcm9v
dCgpIDw8ICIpIik7CisgICAgQVNTRVJUKHJvb3QoKS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQo
KSk7CisKKyAgICBpbnZhbGlkYXRlRm9ybWF0dGluZ1N0YXRlKGludmFsaWRhdGlvblN0YXRlKTsK
KyAgICBhdXRvKiBsYXlvdXRCb3ggPSByb290KCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQo
KTsKKyAgICAvLyAxLiBWaXNpdCBlYWNoIGlubGluZSBib3ggYW5kIHBhcnRpYWxseSBjb21wdXRl
IHRoZWlyIGdlb21ldHJ5IChtYXJnaW5zLCBwYWRkaW5nIGFuZCBib3JkZXJzKS4KKyAgICAvLyAy
LiBDb2xsZWN0IHRoZSBpbmxpbmUgaXRlbXMgKGZsYXR0ZW4gdGhlIHRoZSBsYXlvdXQgdHJlZSkg
YW5kIHBsYWNlIHRoZW0gb24gbGluZXMgaW4gYmlkaXJlY3Rpb25hbCBvcmRlci4gCisgICAgd2hp
bGUgKGxheW91dEJveCkgeworICAgICAgICBBU1NFUlQobGF5b3V0Qm94LT5pc0lubGluZUxldmVs
Qm94KCkgfHwgbGF5b3V0Qm94LT5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKTsKKworICAgICAgICBp
ZiAobGF5b3V0Qm94LT5pc0F0b21pY0lubGluZUxldmVsQm94KCkgfHwgbGF5b3V0Qm94LT5pc0Zs
b2F0aW5nUG9zaXRpb25lZCgpKSB7CisgICAgICAgICAgICAvLyBJbmxpbmUtYmxvY2tzLCBpbmxp
bmUtdGFibGVzIGFuZCByZXBsYWNlZCBlbGVtZW50cyAoaW1nLCB2aWRlbykgY2FuIGJlIHNpemVk
IGJ1dCBub3QgeWV0IHBvc2l0aW9uZWQuCisgICAgICAgICAgICBpZiAoaXM8Q29udGFpbmVyQm94
PihsYXlvdXRCb3gpICYmIGxheW91dEJveC0+ZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgp
KSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKGxheW91dEJveC0+aXNJbmxpbmVCbG9ja0JveCgp
IHx8IGxheW91dEJveC0+aXNJbmxpbmVUYWJsZUJveCgpIHx8IGxheW91dEJveC0+aXNGbG9hdGlu
Z1Bvc2l0aW9uZWQoKSk7CisgICAgICAgICAgICAgICAgYXV0byYgZm9ybWF0dGluZ1Jvb3QgPSBk
b3duY2FzdDxDb250YWluZXJCb3g+KCpsYXlvdXRCb3gpOworICAgICAgICAgICAgICAgIGNvbXB1
dGVCb3JkZXJBbmRQYWRkaW5nKGZvcm1hdHRpbmdSb290LCBjb25zdHJhaW50cy5ob3Jpem9udGFs
KTsKKyAgICAgICAgICAgICAgICBjb21wdXRlV2lkdGhBbmRNYXJnaW4oZm9ybWF0dGluZ1Jvb3Qs
IGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworCisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRp
bmdSb290Lmhhc0NoaWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBmb3JtYXR0aW5n
Q29udGV4dCA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRp
bmdSb290LCBsYXlvdXRTdGF0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRp
bmdSb290Lmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQorICAgICAgICAgICAgICAgICAgICAg
ICAgZm9ybWF0dGluZ0NvbnRleHQtPmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3Rh
dGUsIGdlb21ldHJ5KCkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KGZvcm1hdHRpbmdSb290
KSk7CisgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oZm9ybWF0dGlu
Z1Jvb3QsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAgICAgICAgICAgICBmb3Jt
YXR0aW5nQ29udGV4dC0+bGF5b3V0T3V0T2ZGbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwg
Z2VvbWV0cnkoKS5jb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoZm9ybWF0dGluZ1Jvb3Qp
KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY29tcHV0ZUhl
aWdodEFuZE1hcmdpbihmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Cisg
ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFJlcGxhY2VkIGFuZCBvdGhl
ciB0eXBlIG9mIGxlYWYgYXRvbWljIGlubGluZSBib3hlcy4KKyAgICAgICAgICAgICAgICBjb21w
dXRlQm9yZGVyQW5kUGFkZGluZygqbGF5b3V0Qm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsK
KyAgICAgICAgICAgICAgICBjb21wdXRlV2lkdGhBbmRNYXJnaW4oKmxheW91dEJveCwgY29uc3Ry
YWludHMuaG9yaXpvbnRhbCk7CisgICAgICAgICAgICAgICAgY29tcHV0ZUhlaWdodEFuZE1hcmdp
bigqbGF5b3V0Qm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfSBlbHNlIGlmIChsYXlvdXRCb3gtPmlzTGluZUJyZWFrQm94KCkpIHsKKyAgICAgICAg
ICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoKmxh
eW91dEJveCk7CisgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRIb3Jpem9udGFsTWFyZ2luKHsg
fSk7CisgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRCb3JkZXIoeyB9KTsKKyAgICAgICAgICAg
IGJveEdlb21ldHJ5LnNldFBhZGRpbmcoeyB9KTsKKyAgICAgICAgICAgIGJveEdlb21ldHJ5LnNl
dENvbnRlbnRCb3hXaWR0aCh7IH0pOworICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0VmVydGlj
YWxNYXJnaW4oeyB9KTsKKyAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRCb3gtPmlzSW5saW5lQm94
KCkpIHsKKyAgICAgICAgICAgIC8vIFRleHQgd3JhcHBlciBib3hlcyAoYW5vbnltb3VzIGlubGlu
ZSBsZXZlbCBib3hlcykgZG9uJ3QgaGF2ZSBib3ggZ2VvbWV0cmllcyAodGhleSBvbmx5IGdlbmVy
YXRlIHJ1bnMpLgorICAgICAgICAgICAgaWYgKCFsYXlvdXRCb3gtPmlzSW5saW5lVGV4dEJveCgp
KSB7CisgICAgICAgICAgICAgICAgLy8gSW5saW5lIGJveGVzICg8c3Bhbj4pIGNhbid0IGdldCBz
aXplZC9wb3NpdGlvbmVkIHlldC4gQXQgdGhpcyBwb2ludCB3ZSBjYW4gb25seSBjb21wdXRlIHRo
ZWlyIG1hcmdpbnMsIGJvcmRlcnMgYW5kIHBhZGRpbmcuCisgICAgICAgICAgICAgICAgY29tcHV0
ZUJvcmRlckFuZFBhZGRpbmcoKmxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Cisg
ICAgICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxNYXJnaW4oKmxheW91dEJveCwgY29uc3Ry
YWludHMuaG9yaXpvbnRhbCk7CisgICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94
R2VvbWV0cnkoKmxheW91dEJveCkuc2V0VmVydGljYWxNYXJnaW4oeyB9KTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKwor
ICAgICAgICBsYXlvdXRCb3ggPSBuZXh0SW5saW5lTGV2ZWxCb3hUb0xheW91dCgqbGF5b3V0Qm94
LCByb290KCkpOworICAgIH0KKworICAgIGNvbGxlY3RJbmxpbmVDb250ZW50SWZOZWVkZWQoKTsK
KworICAgIGF1dG8mIGlubGluZUl0ZW1zID0gZm9ybWF0dGluZ1N0YXRlKCkuaW5saW5lSXRlbXMo
KTsKKyAgICBsaW5lTGF5b3V0KGlubGluZUl0ZW1zLCB7IDAsIGlubGluZUl0ZW1zLnNpemUoKSB9
LCBjb25zdHJhaW50cyk7CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5
b3V0LCBzdHJlYW0gPDwgIltFbmRdIC0+IGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgLT4gZm9y
bWF0dGluZyByb290KCIgPDwgJnJvb3QoKSA8PCAiKSIpOworfQorCit2b2lkIElubGluZUZvcm1h
dHRpbmdDb250ZXh0OjpsaW5lTGF5b3V0Rm9ySW50ZXJncmF0aW9uKEludmFsaWRhdGlvblN0YXRl
JiBpbnZhbGlkYXRpb25TdGF0ZSwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBj
b25zdHJhaW50cykKK3sKKyAgICBpbnZhbGlkYXRlRm9ybWF0dGluZ1N0YXRlKGludmFsaWRhdGlv
blN0YXRlKTsKKyAgICBjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCk7CisgICAgYXV0byYg
aW5saW5lSXRlbXMgPSBmb3JtYXR0aW5nU3RhdGUoKS5pbmxpbmVJdGVtcygpOworICAgIGxpbmVM
YXlvdXQoaW5saW5lSXRlbXMsIHsgMCwgaW5saW5lSXRlbXMuc2l6ZSgpIH0sIGNvbnN0cmFpbnRz
KTsKK30KKworTGF5b3V0VW5pdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRI
ZWlnaHQoKSBjb25zdAoreworICAgIC8vIDEwLjYuNyAnQXV0bycgaGVpZ2h0cyBmb3IgYmxvY2sg
Zm9ybWF0dGluZyBjb250ZXh0IHJvb3RzCisKKyAgICAvLyBJZiBpdCBvbmx5IGhhcyBpbmxpbmUt
bGV2ZWwgY2hpbGRyZW4sIHRoZSBoZWlnaHQgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHRv
cCBvZiB0aGUgdG9wbW9zdCBsaW5lIGJveCBhbmQgdGhlIGJvdHRvbSBvZiB0aGUgYm90dG9tbW9z
dCBsaW5lIGJveC4KKworICAgIC8vIEluIGFkZGl0aW9uLCBpZiB0aGUgZWxlbWVudCBoYXMgYW55
IGZsb2F0aW5nIGRlc2NlbmRhbnRzIHdob3NlIGJvdHRvbSBtYXJnaW4gZWRnZSBpcyBiZWxvdyB0
aGUgZWxlbWVudCdzIGJvdHRvbSBjb250ZW50IGVkZ2UsCisgICAgLy8gdGhlbiB0aGUgaGVpZ2h0
IGlzIGluY3JlYXNlZCB0byBpbmNsdWRlIHRob3NlIGVkZ2VzLiBPbmx5IGZsb2F0cyB0aGF0IHBh
cnRpY2lwYXRlIGluIHRoaXMgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IGFyZSB0YWtlbgorICAg
IC8vIGludG8gYWNjb3VudCwgZS5nLiwgZmxvYXRzIGluc2lkZSBhYnNvbHV0ZWx5IHBvc2l0aW9u
ZWQgZGVzY2VuZGFudHMgb3Igb3RoZXIgZmxvYXRzIGFyZSBub3QuCisgICAgYXV0byYgbGluZXMg
PSBmb3JtYXR0aW5nU3RhdGUoKS5saW5lcygpOworICAgIC8vIEV2ZW4gZW1wdHkgY29udGVudCBn
ZW5lcmF0ZXMgYSBsaW5lLgorICAgIEFTU0VSVCghbGluZXMuaXNFbXB0eSgpKTsKKyAgICBhdXRv
IHRvcCA9IExheW91dFVuaXQgeyBsaW5lcy5maXJzdCgpLmxpbmVCb3hMb2dpY2FsUmVjdCgpLnRv
cCgpIH07CisgICAgYXV0byBib3R0b20gPSBMYXlvdXRVbml0IHsgbGluZXMubGFzdCgpLmxpbmVC
b3hMb2dpY2FsUmVjdCgpLmJvdHRvbSgpICsgZm9ybWF0dGluZ1N0YXRlKCkuY2xlYXJHYXBBZnRl
ckxhc3RMaW5lKCkgfTsKKworICAgIGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250
ZXh0IHsgKnRoaXMsIGZvcm1hdHRpbmdTdGF0ZSgpLmZsb2F0aW5nU3RhdGUoKSB9OworICAgIGlm
IChhdXRvIGZsb2F0Qm90dG9tID0gZmxvYXRpbmdDb250ZXh0LmJvdHRvbSgpKSB7CisgICAgICAg
IGJvdHRvbSA9IHN0ZDo6bWF4KCpmbG9hdEJvdHRvbSwgYm90dG9tKTsKKyAgICAgICAgdG9wID0g
c3RkOjptaW4oKmZsb2F0aW5nQ29udGV4dC50b3AoKSwgdG9wKTsKKyAgICB9CisgICAgcmV0dXJu
IGJvdHRvbSAtIHRvcDsKK30KKwordm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6bGluZUxh
eW91dChJbmxpbmVJdGVtcyYgaW5saW5lSXRlbXMsIExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFu
Z2UgbmVlZHNMYXlvdXRSYW5nZSwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBj
b25zdHJhaW50cykKK3sKKyAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0
aW5nU3RhdGUoKTsKKyAgICBmb3JtYXR0aW5nU3RhdGUubGluZVJ1bnMoKS5yZXNlcnZlSW5pdGlh
bENhcGFjaXR5KGZvcm1hdHRpbmdTdGF0ZS5pbmxpbmVJdGVtcygpLnNpemUoKSk7CisgICAgSW5s
aW5lTGF5b3V0VW5pdCBsaW5lTG9naWNhbFRvcCA9IGNvbnN0cmFpbnRzLnZlcnRpY2FsLmxvZ2lj
YWxUb3A7CisgICAgc3RydWN0IFByZXZpb3VzTGluZSB7CisgICAgICAgIExpbmVCdWlsZGVyOjpJ
bmxpbmVJdGVtUmFuZ2UgcmFuZ2U7CisgICAgICAgIHNpemVfdCBvdmVyZmxvd0NvbnRlbnRMZW5n
dGggeyAwIH07CisgICAgICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IG92ZXJmbG93TG9n
aWNhbFdpZHRoOworICAgIH07CisgICAgT3B0aW9uYWw8UHJldmlvdXNMaW5lPiBwcmV2aW91c0xp
bmU7CisgICAgYXV0byYgZmxvYXRpbmdTdGF0ZSA9IGZvcm1hdHRpbmdTdGF0ZS5mbG9hdGluZ1N0
YXRlKCk7CisgICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhp
cywgZmxvYXRpbmdTdGF0ZSB9OworICAgIGF1dG8gaXNGaXJzdExpbmUgPSBmb3JtYXR0aW5nU3Rh
dGUubGluZXMoKS5pc0VtcHR5KCk7CisKKyAgICBhdXRvIGxpbmVCdWlsZGVyID0gTGluZUJ1aWxk
ZXIgeyAqdGhpcywgZmxvYXRpbmdTdGF0ZSwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwgaW5saW5l
SXRlbXMgfTsKKyAgICB3aGlsZSAoIW5lZWRzTGF5b3V0UmFuZ2UuaXNFbXB0eSgpKSB7CisgICAg
ICAgIC8vIFR1cm4gcHJldmlvdXMgbGluZSdzIG92ZXJmbG93IGNvbnRlbnQgbGVuZ3RoIGludG8g
dGhlIG5leHQgbGluZSdzIGxlYWRpbmcgY29udGVudCBwYXJ0aWFsIGxlbmd0aC4KKyAgICAgICAg
Ly8gInNwWzwtbGluZSBicmVhay0+XWxpdF9jb250ZW50IiAtPiBvdmVyZmxvdyBsZW5ndGg6IDEx
IC0+IGxlYWRpbmcgcGFydGlhbCBjb250ZW50IGxlbmd0aDogMTEuCisgICAgICAgIGF1dG8gcGFy
dGlhbExlYWRpbmdDb250ZW50TGVuZ3RoID0gcHJldmlvdXNMaW5lID8gcHJldmlvdXNMaW5lLT5v
dmVyZmxvd0NvbnRlbnRMZW5ndGggOiAwOworICAgICAgICBhdXRvIGxlYWRpbmdMb2dpY2FsV2lk
dGggPSBwcmV2aW91c0xpbmUgPyBwcmV2aW91c0xpbmUtPm92ZXJmbG93TG9naWNhbFdpZHRoIDog
V1RGOjpudWxsb3B0OworICAgICAgICBhdXRvIGluaXRpYWxMaW5lQ29uc3RyYWludHMgPSBJbmxp
bmVSZWN0IHsgbGluZUxvZ2ljYWxUb3AsIGNvbnN0cmFpbnRzLmhvcml6b250YWwubG9naWNhbExl
ZnQsIGNvbnN0cmFpbnRzLmhvcml6b250YWwubG9naWNhbFdpZHRoLCBxdWlya3MoKS5pbml0aWFs
TGluZUhlaWdodCgpIH07CisgICAgICAgIGF1dG8gbGluZUNvbnRlbnQgPSBsaW5lQnVpbGRlci5s
YXlvdXRJbmxpbmVDb250ZW50KG5lZWRzTGF5b3V0UmFuZ2UsIHBhcnRpYWxMZWFkaW5nQ29udGVu
dExlbmd0aCwgbGVhZGluZ0xvZ2ljYWxXaWR0aCwgaW5pdGlhbExpbmVDb25zdHJhaW50cywgaXNG
aXJzdExpbmUpOworICAgICAgICBhdXRvIGxpbmVMb2dpY2FsUmVjdCA9IGNvbXB1dGVHZW9tZXRy
eUZvckxpbmVDb250ZW50KGxpbmVDb250ZW50LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKKwor
ICAgICAgICBhdXRvIGxpbmVDb250ZW50UmFuZ2UgPSBsaW5lQ29udGVudC5pbmxpbmVJdGVtUmFu
Z2U7CisgICAgICAgIGlmICghbGluZUNvbnRlbnRSYW5nZS5pc0VtcHR5KCkpIHsKKyAgICAgICAg
ICAgIEFTU0VSVChuZWVkc0xheW91dFJhbmdlLnN0YXJ0IDwgbGluZUNvbnRlbnRSYW5nZS5lbmQp
OworICAgICAgICAgICAgaXNGaXJzdExpbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIGxpbmVMb2dp
Y2FsVG9wID0gZ2VvbWV0cnkoKS5sb2dpY2FsVG9wRm9yTmV4dExpbmUobGluZUNvbnRlbnQsIGxp
bmVMb2dpY2FsUmVjdC5ib3R0b20oKSwgZmxvYXRpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIGlm
IChsaW5lQ29udGVudC5pc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQpIHsKKyAgICAgICAgICAg
ICAgICAvLyBUaGUgZmluYWwgY29udGVudCBoZWlnaHQgb2YgdGhpcyBpbmxpbmUgZm9ybWF0dGlu
ZyBjb250ZXh0IHNob3VsZCBpbmNsdWRlIHRoZSBjbGVhcmVkIGZsb2F0cyBhcyB3ZWxsLgorICAg
ICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5zZXRDbGVhckdhcEFmdGVyTGFzdExpbmUobGlu
ZUxvZ2ljYWxUb3AgLSBsaW5lTG9naWNhbFJlY3QuYm90dG9tKCkpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgLy8gV2hlbiB0aGUgdHJhaWxpbmcgY29udGVudCBpcyBwYXJ0aWFsLCB3ZSBu
ZWVkIHRvIHJldXNlIHRoZSBsYXN0IElubGluZVRleHRJdGVtLgorICAgICAgICAgICAgYXV0byBs
YXN0SW5saW5lSXRlbU5lZWRzUGFydGlhbExheW91dCA9IGxpbmVDb250ZW50LnBhcnRpYWxUcmFp
bGluZ0NvbnRlbnRMZW5ndGg7CisgICAgICAgICAgICBpZiAobGFzdElubGluZUl0ZW1OZWVkc1Bh
cnRpYWxMYXlvdXQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGxpbmVMYXlvdXRIYXNBZHZhbmNl
ZCA9ICFwcmV2aW91c0xpbmUKKyAgICAgICAgICAgICAgICAgICAgfHwgbGluZUNvbnRlbnRSYW5n
ZS5lbmQgPiBwcmV2aW91c0xpbmUtPnJhbmdlLmVuZAorICAgICAgICAgICAgICAgICAgICB8fCAo
cHJldmlvdXNMaW5lLT5vdmVyZmxvd0NvbnRlbnRMZW5ndGggJiYgcHJldmlvdXNMaW5lLT5vdmVy
Zmxvd0NvbnRlbnRMZW5ndGggPiBsaW5lQ29udGVudC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVu
Z3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWxpbmVMYXlvdXRIYXNBZHZhbmNlZCkgeworICAg
ICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICAg
ICAgLy8gTW92ZSBvdmVyIHRvIHRoZSBuZXh0IHJ1biBpZiB3ZSBhcmUgc3R1Y2sgb24gdGhpcyBw
YXJ0aWFsIGNvbnRlbnQgKHdoZW4gdGhlIG92ZXJmbG93IGNvbnRlbnQgbGVuZ3RoIHJlbWFpbnMg
dGhlIHNhbWUpLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSBjZXJ0YWlubHkgbG9zZSBzb21l
IGNvbnRlbnQsIGJ1dCB3ZSB3b3VsZCBiZSBidXN5IGxvb3Bpbmcgb3RoZXJ3aXNlLgorICAgICAg
ICAgICAgICAgICAgICBsYXN0SW5saW5lSXRlbU5lZWRzUGFydGlhbExheW91dCA9IGZhbHNlOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5lZWRzTGF5b3V0
UmFuZ2Uuc3RhcnQgPSBsYXN0SW5saW5lSXRlbU5lZWRzUGFydGlhbExheW91dCA/IGxpbmVDb250
ZW50UmFuZ2UuZW5kIC0gMSA6IGxpbmVDb250ZW50UmFuZ2UuZW5kOworICAgICAgICAgICAgcHJl
dmlvdXNMaW5lID0gUHJldmlvdXNMaW5lIHsgbGluZUNvbnRlbnRSYW5nZSwgbGluZUNvbnRlbnQu
cGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCwgbGluZUNvbnRlbnQub3ZlcmZsb3dMb2dpY2Fs
V2lkdGggfTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIEZs
b2F0cyBwcmV2ZW50ZWQgdXMgcGxhY2luZyBhbnkgY29udGVudCBvbiB0aGUgbGluZS4KKyAgICAg
ICAgQVNTRVJUKGxpbmVDb250ZW50LnJ1bnMuaXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJUKGxp
bmVDb250ZW50Lmhhc0ludHJ1c2l2ZUZsb2F0KTsKKyAgICAgICAgLy8gTW92ZSB0aGUgbmV4dCBs
aW5lIGJlbG93IHRoZSBpbnRydXNpdmUgZmxvYXQuCisgICAgICAgIGF1dG8gZmxvYXRDb25zdHJh
aW50cyA9IGZsb2F0aW5nQ29udGV4dC5jb25zdHJhaW50cyh0b0xheW91dFVuaXQobGluZUxvZ2lj
YWxUb3ApLCB0b0xheW91dFVuaXQobGluZUxvZ2ljYWxSZWN0LmJvdHRvbSgpKSk7CisgICAgICAg
IEFTU0VSVChmbG9hdENvbnN0cmFpbnRzLmxlZnQgfHwgZmxvYXRDb25zdHJhaW50cy5yaWdodCk7
CisgICAgICAgIHN0YXRpYyBhdXRvIGluaWZpdGVQb2ludCA9IFBvaW50SW5Db250ZXh0Um9vdDo6
bWF4KCk7CisgICAgICAgIC8vIEluIGNhc2Ugb2YgbGVmdCBhbmQgcmlnaHQgY29uc3RyYWludHMs
IHdlIG5lZWQgdG8gcGljayB0aGUgb25lIHRoYXQncyBjbG9zZXIgdG8gdGhlIGN1cnJlbnQgbGlu
ZS4KKyAgICAgICAgbGluZUxvZ2ljYWxUb3AgPSBzdGQ6Om1pbihmbG9hdENvbnN0cmFpbnRzLmxl
ZnQudmFsdWVPcihpbmlmaXRlUG9pbnQpLnksIGZsb2F0Q29uc3RyYWludHMucmlnaHQudmFsdWVP
cihpbmlmaXRlUG9pbnQpLnkpOworICAgICAgICBBU1NFUlQobGluZUxvZ2ljYWxUb3AgPCBpbmlm
aXRlUG9pbnQueSk7CisgICAgfQorfQorCitGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lk
dGhDb25zdHJhaW50cyBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzKCkKK3sKKyAgICBhdXRvJiBsYXlvdXRTdGF0ZSA9IHRoaXMtPmxheW91
dFN0YXRlKCk7CisgICAgQVNTRVJUKCFmb3JtYXR0aW5nU3RhdGUoKS5pbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzKCkpOworCisgICAgaWYgKCFyb290KCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxk
KCkpIHsKKyAgICAgICAgYXV0byBjb25zdHJhaW50cyA9IGdlb21ldHJ5KCkuY29uc3RyYWluQnlN
aW5NYXhXaWR0aChyb290KCksIHsgfSk7CisgICAgICAgIGZvcm1hdHRpbmdTdGF0ZSgpLnNldElu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3RyYWludHMpOworICAgICAgICByZXR1cm4gY29u
c3RyYWludHM7CisgICAgfQorCisgICAgVmVjdG9yPGNvbnN0IEJveCo+IGZvcm1hdHRpbmdDb250
ZXh0Um9vdExpc3Q7CisgICAgYXV0byBob3Jpem9udGFsQ29uc3RyYWludHMgPSBIb3Jpem9udGFs
Q29uc3RyYWludHMgeyAwX2x1LCAwX2x1IH07CisgICAgYXV0byogbGF5b3V0Qm94ID0gcm9vdCgp
LmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7CisgICAgLy8gSW4gb3JkZXIgdG8gY29tcHV0
ZSB0aGUgbWF4L21pbiB3aWR0aHMsIHdlIG5lZWQgdG8gY29tcHV0ZSBtYXJnaW5zLCBib3JkZXJz
IGFuZCBwYWRkaW5nIGZvciBjZXJ0YWluIGlubGluZSBib3hlcyBmaXJzdC4KKyAgICB3aGlsZSAo
bGF5b3V0Qm94KSB7CisgICAgICAgIGlmIChsYXlvdXRCb3gtPmlzSW5saW5lVGV4dEJveCgpKSB7
CisgICAgICAgICAgICBsYXlvdXRCb3ggPSBuZXh0SW5saW5lTGV2ZWxCb3hUb0xheW91dCgqbGF5
b3V0Qm94LCByb290KCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAg
ICAgaWYgKGxheW91dEJveC0+aXNSZXBsYWNlZEJveCgpKSB7CisgICAgICAgICAgICBjb21wdXRl
Qm9yZGVyQW5kUGFkZGluZygqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAg
ICAgICAgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKCpsYXlvdXRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cyk7CisgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LT5pc0Zsb2F0aW5nUG9zaXRp
b25lZCgpIHx8IGxheW91dEJveC0+aXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKSB7CisgICAgICAg
ICAgICBBU1NFUlQobGF5b3V0Qm94LT5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOwor
ICAgICAgICAgICAgZm9ybWF0dGluZ0NvbnRleHRSb290TGlzdC5hcHBlbmQobGF5b3V0Qm94KTsK
KworICAgICAgICAgICAgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoKmxheW91dEJveCwgaG9yaXpv
bnRhbENvbnN0cmFpbnRzKTsKKyAgICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsTWFyZ2luKCps
YXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgICAgICAgICBjb21wdXRlSW50
cmluc2ljV2lkdGhGb3JGb3JtYXR0aW5nUm9vdCgqbGF5b3V0Qm94KTsKKyAgICAgICAgfSBlbHNl
IGlmIChsYXlvdXRCb3gtPmlzSW5saW5lQm94KCkpIHsKKyAgICAgICAgICAgIGNvbXB1dGVCb3Jk
ZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgICAg
ICAgICBjb21wdXRlSG9yaXpvbnRhbE1hcmdpbigqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3Ry
YWludHMpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgICAgICBsYXlvdXRCb3ggPSBuZXh0SW5saW5lTGV2ZWxCb3hUb0xheW91dCgqbGF5b3V0
Qm94LCByb290KCkpOworICAgIH0KKworICAgIGNvbGxlY3RJbmxpbmVDb250ZW50SWZOZWVkZWQo
KTsKKworICAgIGF1dG8gbWF4aW11bUxpbmVXaWR0aCA9IFsmXShhdXRvIGF2YWlsYWJsZVdpZHRo
KSB7CisgICAgICAgIC8vIFN3aXRjaCB0byB0aGUgbWluL21heCBmb3JtYXR0aW5nIHJvb3Qgd2lk
dGggdmFsdWVzIGJlZm9yZSBmb3JtYXR0aW5nIHRoZSBsaW5lcy4KKyAgICAgICAgZm9yIChhdXRv
KiBmb3JtYXR0aW5nUm9vdCA6IGZvcm1hdHRpbmdDb250ZXh0Um9vdExpc3QpIHsKKyAgICAgICAg
ICAgIGF1dG8gaW50cmluc2ljV2lkdGhzID0gbGF5b3V0U3RhdGUuZm9ybWF0dGluZ1N0YXRlRm9y
Qm94KCpmb3JtYXR0aW5nUm9vdCkuaW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveCgqZm9y
bWF0dGluZ1Jvb3QpOworICAgICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5n
U3RhdGUoKS5ib3hHZW9tZXRyeSgqZm9ybWF0dGluZ1Jvb3QpOworICAgICAgICAgICAgYXV0byBj
b250ZW50V2lkdGggPSAoYXZhaWxhYmxlV2lkdGggPyBpbnRyaW5zaWNXaWR0aHMtPm1heGltdW0g
OiBpbnRyaW5zaWNXaWR0aHMtPm1pbmltdW0pIC0gYm94R2VvbWV0cnkuaG9yaXpvbnRhbE1hcmdp
bkJvcmRlckFuZFBhZGRpbmcoKTsKKyAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRC
b3hXaWR0aChjb250ZW50V2lkdGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21wdXRl
ZEludHJpbnNpY1dpZHRoRm9yQ29uc3RyYWludChhdmFpbGFibGVXaWR0aCk7CisgICAgfTsKKwor
ICAgIGF1dG8gbWluaW11bUNvbnRlbnRXaWR0aCA9IGNlaWxlZExheW91dFVuaXQobWF4aW11bUxp
bmVXaWR0aCgwKSk7CisgICAgYXV0byBtYXhpbXVtQ29udGVudFdpZHRoID0gY2VpbGVkTGF5b3V0
VW5pdChtYXhpbXVtTGluZVdpZHRoKG1heElubGluZUxheW91dFVuaXQoKSkpOworICAgIGF1dG8g
Y29uc3RyYWludHMgPSBnZW9tZXRyeSgpLmNvbnN0cmFpbkJ5TWluTWF4V2lkdGgocm9vdCgpLCB7
IG1pbmltdW1Db250ZW50V2lkdGgsIG1heGltdW1Db250ZW50V2lkdGggfSk7CisgICAgZm9ybWF0
dGluZ1N0YXRlKCkuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25zdHJhaW50cyk7Cisg
ICAgcmV0dXJuIGNvbnN0cmFpbnRzOworfQorCitJbmxpbmVMYXlvdXRVbml0IElubGluZUZvcm1h
dHRpbmdDb250ZXh0Ojpjb21wdXRlZEludHJpbnNpY1dpZHRoRm9yQ29uc3RyYWludChJbmxpbmVM
YXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKSBjb25zdAoreworICAgIGF1dG8mIGlubGluZUl0ZW1z
ID0gZm9ybWF0dGluZ1N0YXRlKCkuaW5saW5lSXRlbXMoKTsKKyAgICBhdXRvIGxpbmVCdWlsZGVy
ID0gTGluZUJ1aWxkZXIgeyAqdGhpcywgaW5saW5lSXRlbXMgfTsKKyAgICBhdXRvIGxheW91dFJh
bmdlID0gTGluZUJ1aWxkZXI6OklubGluZUl0ZW1SYW5nZSB7IDAgLCBpbmxpbmVJdGVtcy5zaXpl
KCkgfTsKKyAgICBhdXRvIG1heGltdW1MaW5lV2lkdGggPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsK
KyAgICBhdXRvIG1heGltdW1GbG9hdFdpZHRoID0gTGF5b3V0VW5pdCB7IH07CisgICAgd2hpbGUg
KCFsYXlvdXRSYW5nZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpbnRyaW5zaWNDb250ZW50
ID0gbGluZUJ1aWxkZXIuY29tcHV0ZWRJbnRyaW5zaWNXaWR0aChsYXlvdXRSYW5nZSwgYXZhaWxh
YmxlV2lkdGgpOworICAgICAgICBsYXlvdXRSYW5nZS5zdGFydCA9IGludHJpbnNpY0NvbnRlbnQu
aW5saW5lSXRlbVJhbmdlLmVuZDsKKyAgICAgICAgbWF4aW11bUxpbmVXaWR0aCA9IHN0ZDo6bWF4
KG1heGltdW1MaW5lV2lkdGgsIGludHJpbnNpY0NvbnRlbnQubG9naWNhbFdpZHRoKTsKKyAgICAg
ICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBjbGVhci4KKyAgICAgICAgZm9yIChhdXRvKiBm
bG9hdEJveCA6IGludHJpbnNpY0NvbnRlbnQuZmxvYXRzKQorICAgICAgICAgICAgbWF4aW11bUZs
b2F0V2lkdGggKz0gZ2VvbWV0cnlGb3JCb3goKmZsb2F0Qm94KS5tYXJnaW5Cb3hXaWR0aCgpOwor
ICAgIH0KKyAgICByZXR1cm4gbWF4aW11bUxpbmVXaWR0aCArIG1heGltdW1GbG9hdFdpZHRoOwor
fQorCit2b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlSW50cmluc2ljV2lkdGhG
b3JGb3JtYXR0aW5nUm9vdChjb25zdCBCb3gmIGZvcm1hdHRpbmdSb290KQoreworICAgIEFTU0VS
VChmb3JtYXR0aW5nUm9vdC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOworICAgIGF1
dG8gY29uc3RyYWludHMgPSBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKKyAgICBpZiAo
YXV0byBmaXhlZFdpZHRoID0gZ2VvbWV0cnkoKS5maXhlZFZhbHVlKGZvcm1hdHRpbmdSb290LnN0
eWxlKCkubG9naWNhbFdpZHRoKCkpKQorICAgICAgICBjb25zdHJhaW50cyA9IHsgKmZpeGVkV2lk
dGgsICpmaXhlZFdpZHRoIH07CisgICAgZWxzZSB7CisgICAgICAgIGF1dG8gaGFzSW5mbG93T3JG
bG9hdGluZ0NvbnRlbnQgPSBpczxDb250YWluZXJCb3g+KGZvcm1hdHRpbmdSb290KSAmJiBkb3du
Y2FzdDxDb250YWluZXJCb3g+KGZvcm1hdHRpbmdSb290KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hp
bGQoKTsKKyAgICAgICAgLy8gVGhlIGludHJpbnNpYyBzaXplcyBvZiB0aGUgc2l6ZSBjb250YWlu
bWVudCBib3ggYXJlIGRldGVybWluZWQgYXMgaWYgdGhlIGVsZW1lbnQgaGFkIG5vIGNvbnRlbnQu
CisgICAgICAgIGF1dG8gc2hvdWxkSWdub3JlQ2hpbGRDb250ZW50ID0gZm9ybWF0dGluZ1Jvb3Qu
aXNTaXplQ29udGFpbm1lbnRCb3goKTsKKyAgICAgICAgaWYgKGhhc0luZmxvd09yRmxvYXRpbmdD
b250ZW50ICYmICFzaG91bGRJZ25vcmVDaGlsZENvbnRlbnQpCisgICAgICAgICAgICBjb25zdHJh
aW50cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGRvd25jYXN0PENv
bnRhaW5lckJveD4oZm9ybWF0dGluZ1Jvb3QpLCBsYXlvdXRTdGF0ZSgpKS0+Y29tcHV0ZWRJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7CisgICAgfQorICAgIGNvbnN0cmFpbnRzID0gZ2VvbWV0
cnkoKS5jb25zdHJhaW5CeU1pbk1heFdpZHRoKGZvcm1hdHRpbmdSb290LCBjb25zdHJhaW50cyk7
CisgICAgY29uc3RyYWludHMuZXhwYW5kKGdlb21ldHJ5Rm9yQm94KGZvcm1hdHRpbmdSb290KS5o
b3Jpem9udGFsTWFyZ2luQm9yZGVyQW5kUGFkZGluZygpKTsKKyAgICBmb3JtYXR0aW5nU3RhdGUo
KS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGZvcm1hdHRpbmdSb290LCBjb25z
dHJhaW50cyk7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVIb3Jp
em9udGFsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBhdXRvIGNvbXB1dGVkSG9yaXpv
bnRhbE1hcmdpbiA9IGdlb21ldHJ5KCkuY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKGxheW91dEJv
eCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9t
ZXRyeShsYXlvdXRCb3gpLnNldEhvcml6b250YWxNYXJnaW4oeyBjb21wdXRlZEhvcml6b250YWxN
YXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1
ZU9yKDApIH0pOworfQorCit2b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlV2lk
dGhBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQoreworICAgIGF1dG8gY29tcHV0ZSA9IFsmXShP
cHRpb25hbDxMYXlvdXRVbml0PiB1c2VkV2lkdGgpIHsKKyAgICAgICAgaWYgKGxheW91dEJveC5p
c0Zsb2F0aW5nUG9zaXRpb25lZCgpKQorICAgICAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCkuZmxv
YXRpbmdDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMsIHsgdXNlZFdpZHRoLCB7IH0gfSk7CisgICAgICAgIGlmIChsYXlvdXRCb3guaXNJbmxpbmVC
bG9ja0JveCgpKQorICAgICAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCkuaW5saW5lQmxvY2tDb250
ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgdXNl
ZFdpZHRoLCB7IH0gfSk7CisgICAgICAgIGlmIChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQor
ICAgICAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCkuaW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhB
bmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25z
dHJhaW50cywgeyB9LCB7IHVzZWRXaWR0aCwgeyB9IH0pOworICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7IH07CisgICAg
fTsKKworICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFyZ2luID0gY29tcHV0ZSh7IH0pOworCisg
ICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lk
dGg7CisgICAgaWYgKGF1dG8gbWF4V2lkdGggPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWF4V2lkdGgo
bGF5b3V0Qm94LCBhdmFpbGFibGVXaWR0aCkpIHsKKyAgICAgICAgYXV0byBtYXhXaWR0aEFuZE1h
cmdpbiA9IGNvbXB1dGUobWF4V2lkdGgpOworICAgICAgICBpZiAoY29udGVudFdpZHRoQW5kTWFy
Z2luLmNvbnRlbnRXaWR0aCA+IG1heFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkKKyAgICAg
ICAgICAgIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IG1heFdpZHRoQW5kTWFyZ2luOworICAgIH0K
KworICAgIGF1dG8gbWluV2lkdGggPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluV2lkdGgobGF5b3V0
Qm94LCBhdmFpbGFibGVXaWR0aCkudmFsdWVPcigwKTsKKyAgICBhdXRvIG1pbldpZHRoQW5kTWFy
Z2luID0gY29tcHV0ZShtaW5XaWR0aCk7CisgICAgaWYgKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5j
b250ZW50V2lkdGggPCBtaW5XaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCisgICAgICAgIGNv
bnRlbnRXaWR0aEFuZE1hcmdpbiA9IG1pbldpZHRoQW5kTWFyZ2luOworCisgICAgYXV0byYgYm94
R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOworICAg
IGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChjb250ZW50V2lkdGhBbmRNYXJnaW4uY29u
dGVudFdpZHRoKTsKKyAgICBib3hHZW9tZXRyeS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgY29udGVu
dFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uc3RhcnQsIGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51
c2VkTWFyZ2luLmVuZCB9KTsKK30KKwordm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29t
cHV0ZUhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCit7CisgICAgYXV0byBjb21wdXRl
ID0gWyZdKE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRIZWlnaHQpIHsKKyAgICAgICAgaWYgKGxh
eW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKQorICAgICAgICAgICAgcmV0dXJuIGdlb21l
dHJ5KCkuZmxvYXRpbmdDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRh
bENvbnN0cmFpbnRzLCB7IHVzZWRIZWlnaHQgfSk7CisgICAgICAgIGlmIChsYXlvdXRCb3guaXNJ
bmxpbmVCbG9ja0JveCgpKQorICAgICAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCkuaW5saW5lQmxv
Y2tDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
LCB7IHVzZWRIZWlnaHQgfSk7CisgICAgICAgIGlmIChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgp
KQorICAgICAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCkuaW5saW5lUmVwbGFjZWRDb250ZW50SGVp
Z2h0QW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFs
Q29uc3RyYWludHMsIHsgfSwgeyB1c2VkSGVpZ2h0IH0pOworICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4geyB9OworICAg
IH07CisKKyAgICBhdXRvIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRlKHsgfSk7Cisg
ICAgaWYgKGF1dG8gbWF4SGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1heEhlaWdodChsYXlv
dXRCb3gpKSB7CisgICAgICAgIGF1dG8gbWF4SGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZShtYXhI
ZWlnaHQpOworICAgICAgICBpZiAoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0
ID4gbWF4SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpCisgICAgICAgICAgICBjb250ZW50
SGVpZ2h0QW5kTWFyZ2luID0gbWF4SGVpZ2h0QW5kTWFyZ2luOworICAgIH0KKworICAgIGlmIChh
dXRvIG1pbkhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNaW5IZWlnaHQobGF5b3V0Qm94KSkg
eworICAgICAgICBhdXRvIG1pbkhlaWdodEFuZE1hcmdpbiA9IGNvbXB1dGUobWluSGVpZ2h0KTsK
KyAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCA8IG1pbkhl
aWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KQorICAgICAgICAgICAgY29udGVudEhlaWdodEFu
ZE1hcmdpbiA9IG1pbkhlaWdodEFuZE1hcmdpbjsKKyAgICB9CisgICAgYXV0byYgYm94R2VvbWV0
cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOworICAgIGJveEdl
b21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50
SGVpZ2h0KTsKKyAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IGNvbnRlbnRIZWln
aHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSwgY29udGVudEhlaWdodEFuZE1h
cmdpbi5ub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIgfSk7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0
dGluZ0NvbnRleHQ6OmNvbGxlY3RJbmxpbmVDb250ZW50SWZOZWVkZWQoKQoreworICAgIGF1dG8m
IGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1hdHRpbmdTdGF0ZSgpOworICAgIGlmICghZm9y
bWF0dGluZ1N0YXRlLmlubGluZUl0ZW1zKCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47Cisg
ICAgLy8gVHJhdmVyc2UgdGhlIHRyZWUgYW5kIGNyZWF0ZSBpbmxpbmUgaXRlbXMgb3V0IG9mIGlu
bGluZSBib3hlcyBhbmQgbGVhZiBub2Rlcy4gVGhpcyBlc3NlbnRpYWxseSB0dXJucyB0aGUgdHJl
ZSBpbmxpbmUgc3RydWN0dXJlIGludG8gYSBmbGF0IG9uZS4KKyAgICAvLyA8c3Bhbj50ZXh0PHNw
YW4+PC9zcGFuPjxpbWc+PC9zcGFuPiAtPiBbSW5saW5lQm94U3RhcnRdW0lubGluZUxldmVsQm94
XVtJbmxpbmVCb3hTdGFydF1bSW5saW5lQm94RW5kXVtJbmxpbmVMZXZlbEJveF1bSW5saW5lQm94
RW5kXQorICAgIEFTU0VSVChyb290KCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpOworICAg
IExheW91dFF1ZXVlIGxheW91dFF1ZXVlOworICAgIGxheW91dFF1ZXVlLmFwcGVuZChyb290KCku
Zmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7CisgICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5p
c0VtcHR5KCkpIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGF1dG8mIGxh
eW91dEJveCA9ICpsYXlvdXRRdWV1ZS5sYXN0KCk7CisgICAgICAgICAgICBhdXRvIGlzQm94V2l0
aElubGluZUNvbnRlbnQgPSBsYXlvdXRCb3guaXNJbmxpbmVCb3goKSAmJiAhbGF5b3V0Qm94Lmlz
SW5saW5lVGV4dEJveCgpICYmICFsYXlvdXRCb3guaXNMaW5lQnJlYWtCb3goKTsKKyAgICAgICAg
ICAgIGlmICghaXNCb3hXaXRoSW5saW5lQ29udGVudCkKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIGFuIGlubGluZSBib3ggKGUuZy4g
PHNwYW4+KS4KKyAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRJbmxpbmVJdGVtKHsgbGF5
b3V0Qm94LCBJbmxpbmVJdGVtOjpUeXBlOjpJbmxpbmVCb3hTdGFydCB9KTsKKyAgICAgICAgICAg
IGF1dG8mIGlubGluZUJveFdpdGhJbmxpbmVDb250ZW50ID0gZG93bmNhc3Q8Q29udGFpbmVyQm94
PihsYXlvdXRCb3gpOworICAgICAgICAgICAgaWYgKCFpbmxpbmVCb3hXaXRoSW5saW5lQ29udGVu
dC5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIGxheW91dFF1ZXVlLmFwcGVuZChpbmxpbmVCb3hXaXRoSW5saW5lQ29udGVudC5m
aXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxl
ICghbGF5b3V0UXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3gg
PSAqbGF5b3V0UXVldWUudGFrZUxhc3QoKTsKKyAgICAgICAgICAgIGlmIChpczxMaW5lQnJlYWtC
b3g+KGxheW91dEJveCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvJiBsaW5lQnJlYWtCb3ggPSBk
b3duY2FzdDxMaW5lQnJlYWtCb3g+KGxheW91dEJveCk7CisgICAgICAgICAgICAgICAgZm9ybWF0
dGluZ1N0YXRlLmFkZElubGluZUl0ZW0oeyBsYXlvdXRCb3gsIGxpbmVCcmVha0JveC5pc09wdGlv
bmFsKCkgPyBJbmxpbmVJdGVtOjpUeXBlOjpXb3JkQnJlYWtPcHBvcnR1bml0eSA6IElubGluZUl0
ZW06OlR5cGU6OkhhcmRMaW5lQnJlYWsgfSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxheW91
dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKQorICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdT
dGF0ZS5hZGRJbmxpbmVJdGVtKHsgbGF5b3V0Qm94LCBJbmxpbmVJdGVtOjpUeXBlOjpGbG9hdCB9
KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGxheW91dEJveC5pc0F0b21pY0lubGluZUxldmVsQm94
KCkpCisgICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZElubGluZUl0ZW0oeyBsYXlv
dXRCb3gsIElubGluZUl0ZW06OlR5cGU6OkJveCB9KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGxh
eW91dEJveC5pc0lubGluZVRleHRCb3goKSkgeworICAgICAgICAgICAgICAgIElubGluZVRleHRJ
dGVtOjpjcmVhdGVBbmRBcHBlbmRUZXh0SXRlbXMoZm9ybWF0dGluZ1N0YXRlLmlubGluZUl0ZW1z
KCksIGRvd25jYXN0PElubGluZVRleHRCb3g+KGxheW91dEJveCkpOworICAgICAgICAgICAgfSBl
bHNlIGlmIChsYXlvdXRCb3guaXNJbmxpbmVCb3goKSkKKyAgICAgICAgICAgICAgICBmb3JtYXR0
aW5nU3RhdGUuYWRkSW5saW5lSXRlbSh7IGxheW91dEJveCwgSW5saW5lSXRlbTo6VHlwZTo6SW5s
aW5lQm94RW5kIH0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworCisgICAgICAgICAgICBpZiAoYXV0byogbmV4dFNpYmxpbmcgPSBsYXlv
dXRCb3gubmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBs
YXlvdXRRdWV1ZS5hcHBlbmQobmV4dFNpYmxpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitJbmxpbmVSZWN0IElubGluZUZv
cm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlR2VvbWV0cnlGb3JMaW5lQ29udGVudChjb25zdCBMaW5l
QnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250ZW50LCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBhdXRvJiBmb3JtYXR0aW5nU3Rh
dGUgPSB0aGlzLT5mb3JtYXR0aW5nU3RhdGUoKTsKKyAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+
Z2VvbWV0cnkoKTsKKworICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lQm94KGdlb21ldHJ5Lmxp
bmVCb3hGb3JMaW5lQ29udGVudChsaW5lQ29udGVudCkpOworICAgIGNvbnN0IGF1dG8mIGxpbmVC
b3ggPSBmb3JtYXR0aW5nU3RhdGUubGluZUJveGVzKCkubGFzdCgpOworICAgIGF1dG8gbGluZUlu
ZGV4ID0gZm9ybWF0dGluZ1N0YXRlLmxpbmVzKCkuc2l6ZSgpOworICAgIGF1dG8mIGxpbmVCb3hM
b2dpY2FsUmVjdCA9IGxpbmVCb3gubG9naWNhbFJlY3QoKTsKKyAgICBpZiAoIWxpbmVCb3guaGFz
Q29udGVudCgpKSB7CisgICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgbGluZXMgd2l0aCBubyBjb250
ZW50IGUuZy4gPGRpdj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjwvZGl2PiBvciA8c3Bhbj48
ZGl2PjwvZGl2Pjwvc3Bhbj4gd2hlcmUgd2UgY29uc3RydWN0IGVtcHR5IHByZSBhbmQgcG9zdCBi
bG9ja3MuCisgICAgICAgIEFTU0VSVCghbGluZUJveC5jb250ZW50TG9naWNhbFdpZHRoKCkgJiYg
IWxpbmVCb3hMb2dpY2FsUmVjdC5oZWlnaHQoKSk7CisgICAgICAgIGF1dG8gdXBkYXRlSW5saW5l
Qm94ZXNHZW9tZXRyeUlmQXBwbGljYWJsZSA9IFsmXSB7CisgICAgICAgICAgICBpZiAoIWxpbmVC
b3guaGFzSW5saW5lQm94KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAg
VmVjdG9yPGNvbnN0IEJveCo+IGxheW91dEJveExpc3Q7CisgICAgICAgICAgICAvLyBDb2xsZWN0
IHRoZSBlbXB0eSBpbmxpbmUgYm94ZXMgdGhhdCBzaG93ZWQgdXAgZmlyc3Qgb24gdGhpcyBsaW5l
LgorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGFuIGlubGluZSBib3ggZW5kIG9uIGFuIGVtcHR5
IGxpbmUgZG9lcyBub3QgbWFrZSB0aGUgaW5saW5lIGJveCB0YWxsZXIuCisgICAgICAgICAgICAv
LyAoZS5nLiA8ZGl2PnRleHQ8c3Bhbj48YnI+PC9zcGFuPjwvZGl2PikgPC0gdGhlIDxzcGFuPiBp
bmxpbmUgYm94IGlzIGFzIHRhbGwgYXMgdGhlIGxpbmUgZXZlbiB0aG91Z2ggdGhlIDwvc3Bhbj4g
aXMgYWZ0ZXIgYSA8YnI+IHNvIHRlY2huaWNhbGx5IGlzIG9uIHRoZSBmb2xsb3dpbmcgKGVtcHR5
KWxpbmUuCisgICAgICAgICAgICBmb3IgKGF1dG8mIGxpbmVSdW4gOiBsaW5lQ29udGVudC5ydW5z
KSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmVSdW4uaXNJbmxpbmVCb3hTdGFydCgpKQorICAg
ICAgICAgICAgICAgICAgICBsYXlvdXRCb3hMaXN0LmFwcGVuZCgmbGluZVJ1bi5sYXlvdXRCb3go
KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGF1dG8qIGxheW91dEJveCA6IGxh
eW91dEJveExpc3QpIHsKKyAgICAgICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1h
dHRpbmdTdGF0ZS5ib3hHZW9tZXRyeSgqbGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICBhdXRv
IGlubGluZUJveExvZ2ljYWxIZWlnaHQgPSBMYXlvdXRVbml0Ojpmcm9tRmxvYXRDZWlsKGxpbmVC
b3gubG9naWNhbEJvcmRlckJveEZvcklubGluZUJveCgqbGF5b3V0Qm94LCBib3hHZW9tZXRyeSku
aGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWln
aHQoaW5saW5lQm94TG9naWNhbEhlaWdodCk7CisgICAgICAgICAgICAgICAgYm94R2VvbWV0cnku
c2V0Q29udGVudEJveFdpZHRoKHsgfSk7CisgICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0
TG9naWNhbFRvcExlZnQodG9MYXlvdXRQb2ludChsaW5lQm94TG9naWNhbFJlY3QudG9wTGVmdCgp
KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHVwZGF0ZUlubGluZUJveGVz
R2VvbWV0cnlJZkFwcGxpY2FibGUoKTsKKyAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmUo
eyBsaW5lQm94TG9naWNhbFJlY3QsIHsgeyB9LCB7IH0gfSwgeyB9LCB7IH0sIHsgfSB9KTsKKyAg
ICAgICAgcmV0dXJuIGxpbmVCb3hMb2dpY2FsUmVjdDsKKyAgICB9CisKKyAgICBhdXRvIHJvb3RJ
bmxpbmVCb3hMb2dpY2FsUmVjdCA9IGxpbmVCb3gubG9naWNhbFJlY3RGb3JSb290SW5saW5lQm94
KCk7CisgICAgYXV0byBlbmNsb3NpbmdUb3BBbmRCb3R0b20gPSBJbmxpbmVMaW5lR2VvbWV0cnk6
OkVuY2xvc2luZ1RvcEFuZEJvdHRvbSB7IHJvb3RJbmxpbmVCb3hMb2dpY2FsUmVjdC50b3AoKSwg
cm9vdElubGluZUJveExvZ2ljYWxSZWN0LmJvdHRvbSgpIH07CisgICAgSGFzaFNldDxjb25zdCBC
b3gqPiBpbmxpbmVCb3hTdGFydFNldDsKKyAgICBIYXNoU2V0PGNvbnN0IEJveCo+IGlubGluZUJv
eEVuZFNldDsKKworICAgIGF1dG8gY29uc3RydWN0TGluZVJ1bnNBbmRVcGRhdGVCb3hHZW9tZXRy
eSA9IFsmXSB7CisgICAgICAgIC8vIENyZWF0ZSB0aGUgaW5saW5lIHJ1bnMgb24gdGhlIGN1cnJl
bnQgbGluZS4gVGhpcyBpcyBtb3N0bHkgdGV4dCBhbmQgYXRvbWljIGlubGluZSBydW5zLgorICAg
ICAgICBmb3IgKGF1dG8mIGxpbmVSdW4gOiBsaW5lQ29udGVudC5ydW5zKSB7CisgICAgICAgICAg
ICAvLyBGSVhNRTogV2Ugc2hvdWxkIG5vdCBuZWVkIHRvIGNvbnN0cnVjdCBhIGxpbmUgcnVuIGZv
ciA8YnI+LgorICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gbGluZVJ1bi5sYXlvdXRCb3go
KTsKKyAgICAgICAgICAgIGlmIChsaW5lUnVuLmlzVGV4dCgpKSB7CisgICAgICAgICAgICAgICAg
Zm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBsaW5lSW5kZXgsIGxheW91dEJveCwgbGluZUJv
eC5sb2dpY2FsUmVjdEZvclRleHRSdW4obGluZVJ1biksIGxpbmVSdW4uZXhwYW5zaW9uKCksIGxp
bmVSdW4udGV4dENvbnRlbnQoKSB9KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaW5lUnVuLmlzTGluZUJyZWFrKCkpIHsKKyAgICAg
ICAgICAgICAgICBpZiAobGF5b3V0Qm94LmlzTGluZUJyZWFrQm94KCkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgLy8gT25seSBoYXJkIGxpbmVicmVha3MgaGF2ZSBhc3NvY2lhdGVkIGxheW91dCBi
b3hlcy4KKyAgICAgICAgICAgICAgICAgICAgYXV0byBsaW5lQnJlYWtCb3hSZWN0ID0gbGluZUJv
eC5sb2dpY2FsUmVjdEZvckxpbmVCcmVha0JveChsYXlvdXRCb3gpOworICAgICAgICAgICAgICAg
ICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZVJ1bih7IGxpbmVJbmRleCwgbGF5b3V0Qm94LCBs
aW5lQnJlYWtCb3hSZWN0LCBsaW5lUnVuLmV4cGFuc2lvbigpLCB7IH0gfSk7CisKKyAgICAgICAg
ICAgICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0
cnkobGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICAgICAgbGluZUJyZWFrQm94UmVjdC5tb3Zl
QnkobGluZUJveExvZ2ljYWxSZWN0LnRvcExlZnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGJv
eEdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KHRvTGF5b3V0UG9pbnQobGluZUJyZWFrQm94UmVj
dC50b3BMZWZ0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVu
dEJveEhlaWdodCh0b0xheW91dFVuaXQobGluZUJyZWFrQm94UmVjdC5oZWlnaHQoKSkpOworICAg
ICAgICAgICAgICAgIH0gZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRl
LmFkZExpbmVSdW4oeyBsaW5lSW5kZXgsIGxheW91dEJveCwgbGluZUJveC5sb2dpY2FsUmVjdEZv
clRleHRSdW4obGluZVJ1biksIGxpbmVSdW4uZXhwYW5zaW9uKCksIGxpbmVSdW4udGV4dENvbnRl
bnQoKSB9KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGlmIChsaW5lUnVuLmlzQm94KCkpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQobGF5
b3V0Qm94LmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSk7CisgICAgICAgICAgICAgICAgYXV0byYg
Ym94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsKKyAg
ICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxCb3JkZXJCb3ggPSBsaW5lQm94LmxvZ2ljYWxCb3Jk
ZXJCb3hGb3JBdG9taWNJbmxpbmVMZXZlbEJveChsYXlvdXRCb3gsIGJveEdlb21ldHJ5KTsKKyAg
ICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZVJ1bih7IGxpbmVJbmRleCwgbGF5
b3V0Qm94LCBsb2dpY2FsQm9yZGVyQm94LCBsaW5lUnVuLmV4cGFuc2lvbigpLCB7IH0gfSk7CisK
KyAgICAgICAgICAgICAgICBhdXRvIGJvcmRlckJveExvZ2ljYWxUb3BMZWZ0ID0gbG9naWNhbEJv
cmRlckJveC50b3BMZWZ0KCk7CisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGlubGluZSBi
b3hlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGxpbmUgYW5kIHRoZWlyIHRvcCBwb3NpdGlvbiBjYW4g
YmUgbmVnYXRpdmUuCisgICAgICAgICAgICAgICAgYm9yZGVyQm94TG9naWNhbFRvcExlZnQubW92
ZUJ5KGxpbmVCb3hMb2dpY2FsUmVjdC50b3BMZWZ0KCkpOworICAgICAgICAgICAgICAgIGlmIChs
YXlvdXRCb3guaXNJbkZsb3dQb3NpdGlvbmVkKCkpCisgICAgICAgICAgICAgICAgICAgIGJvcmRl
ckJveExvZ2ljYWxUb3BMZWZ0ICs9IGdlb21ldHJ5LmluRmxvd1Bvc2l0aW9uZWRQb3NpdGlvbk9m
ZnNldChsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgICAgICAgICAgICAg
Ly8gQXRvbWljIGlubGluZSBib3hlcyBhcmUgYWxsIHNldC4gVGhlaXIgbWFyZ2luL2JvcmRlci9j
b250ZW50IGJveCBnZW9tZXRyaWVzIGFyZSBhbHJlYWR5IGNvbXB1dGVkLiBXZSBqdXN0IGhhdmUg
dG8gcG9zaXRpb24gdGhlbSBoZXJlLgorICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldExv
Z2ljYWxUb3BMZWZ0KHRvTGF5b3V0UG9pbnQoYm9yZGVyQm94TG9naWNhbFRvcExlZnQpKTsKKwor
ICAgICAgICAgICAgICAgIGF1dG8gYm9yZGVyQm94VG9wID0gYm9yZGVyQm94TG9naWNhbFRvcExl
ZnQueSgpOworICAgICAgICAgICAgICAgIGF1dG8gYm9yZGVyQm94Qm90dG9tID0gYm9yZGVyQm94
VG9wICsgYm94R2VvbWV0cnkuYm9yZGVyQm94SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgZW5j
bG9zaW5nVG9wQW5kQm90dG9tLnRvcCA9IHN0ZDo6bWluKGVuY2xvc2luZ1RvcEFuZEJvdHRvbS50
b3AsIGJvcmRlckJveFRvcCk7CisgICAgICAgICAgICAgICAgZW5jbG9zaW5nVG9wQW5kQm90dG9t
LmJvdHRvbSA9IHN0ZDo6bWF4KGVuY2xvc2luZ1RvcEFuZEJvdHRvbS5ib3R0b20sIGJvcmRlckJv
eEJvdHRvbSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAobGluZVJ1bi5pc0lubGluZUJveFN0YXJ0KCkpIHsKKyAgICAgICAgICAgICAg
ICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRC
b3gpOworICAgICAgICAgICAgICAgIGF1dG8gaW5saW5lQm94TG9naWNhbFJlY3QgPSBsaW5lQm94
LmxvZ2ljYWxCb3JkZXJCb3hGb3JJbmxpbmVCb3gobGF5b3V0Qm94LCBib3hHZW9tZXRyeSk7Cisg
ICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBsaW5lSW5kZXgsIGxh
eW91dEJveCwgaW5saW5lQm94TG9naWNhbFJlY3QsIGxpbmVSdW4uZXhwYW5zaW9uKCksIHsgfSB9
KTsKKyAgICAgICAgICAgICAgICBpbmxpbmVCb3hTdGFydFNldC5hZGQoJmxheW91dEJveCk7Cisg
ICAgICAgICAgICAgICAgZW5jbG9zaW5nVG9wQW5kQm90dG9tLnRvcCA9IHN0ZDo6bWluKGVuY2xv
c2luZ1RvcEFuZEJvdHRvbS50b3AsIGlubGluZUJveExvZ2ljYWxSZWN0LnRvcCgpKTsKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaW5l
UnVuLmlzSW5saW5lQm94RW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpbmxpbmVCb3hFbmRTZXQu
YWRkKCZsYXlvdXRCb3gpOworICAgICAgICAgICAgICAgIGlmICghaW5saW5lQm94U3RhcnRTZXQu
Y29udGFpbnMoJmxheW91dEJveCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQW4gaW5saW5l
IGJveCBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcy4gVXNlIHRoZSBbaW5saW5lIGJveCBlbmRdIHNp
Z25hbCB0byBpbmNsdWRlIGl0IGluIHRoZSBlbmNsb3NpbmcgZ2VvbWV0cnkKKyAgICAgICAgICAg
ICAgICAgICAgLy8gb25seSB3aGVuIGl0IHN0YXJ0cyBhdCBhIHByZXZpb3VzIGxpbmUuCisgICAg
ICAgICAgICAgICAgICAgIGF1dG8gaW5saW5lQm94TG9naWNhbFJlY3QgPSBsaW5lQm94LmxvZ2lj
YWxCb3JkZXJCb3hGb3JJbmxpbmVCb3gobGF5b3V0Qm94LCBmb3JtYXR0aW5nU3RhdGUuYm94R2Vv
bWV0cnkobGF5b3V0Qm94KSk7CisgICAgICAgICAgICAgICAgICAgIGVuY2xvc2luZ1RvcEFuZEJv
dHRvbS5ib3R0b20gPSBzdGQ6Om1heChlbmNsb3NpbmdUb3BBbmRCb3R0b20uYm90dG9tLCBpbmxp
bmVCb3hMb2dpY2FsUmVjdC5ib3R0b20oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNTRVJUKGxpbmVS
dW4uaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgpKTsKKyAgICAgICAgfQorICAgIH07CisgICAgY29u
c3RydWN0TGluZVJ1bnNBbmRVcGRhdGVCb3hHZW9tZXRyeSgpOworCisgICAgYXV0byB1cGRhdGVC
b3hHZW9tZXRyeUZvcklubGluZUJveGVzID0gWyZdIHsKKyAgICAgICAgLy8gRklYTUU6IFdlIG1h
eSB3YW50IHRvIGtlZXAgYXJvdW5kIGFuIGlubGluZSBib3ggb25seSBzZXQuCisgICAgICAgIGlm
ICghbGluZUJveC5oYXNJbmxpbmVCb3goKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
Ly8gR3JhYiB0aGUgaW5saW5lIGJveGVzIChldmVuIHRob3NlIHRoYXQgZG9uJ3QgaGF2ZSBhc3Nv
Y2lhdGVkIGxheW91dCBib3hlcyBvbiB0aGUgY3VycmVudCBsaW5lIGR1ZSB0byBsaW5lIHdyYXBw
aW5nKQorICAgICAgICAvLyBhbmQgdXBkYXRlIHRoZWlyIGdlb21ldHJpZXMuCisgICAgICAgIGZv
ciAoYXV0byYgaW5saW5lTGV2ZWxCb3ggOiBsaW5lQm94Lm5vblJvb3RJbmxpbmVMZXZlbEJveGVz
KCkpIHsKKyAgICAgICAgICAgIGlmICghaW5saW5lTGV2ZWxCb3guaXNJbmxpbmVCb3goKSkKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9IGlu
bGluZUxldmVsQm94LmxheW91dEJveCgpOworICAgICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkg
PSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsKKyAgICAgICAgICAgIC8v
IElubGluZSBib3hlcyBtYXkgb3IgbWF5IG5vdCBiZSB3cmFwcGVkIGFuZCBoYXZlIHJ1bnMgb24g
bXVsdGlwbGUgbGluZXMgKGUuZy4gPHNwYW4+Zmlyc3QgbGluZTxicj5zZWNvbmQgbGluZTxicj50
aGlyZCBsaW5lPC9zcGFuPikKKyAgICAgICAgICAgIGF1dG8gaW5saW5lQm94Qm9yZGVyQm94ID0g
bGluZUJveC5sb2dpY2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KGxheW91dEJveCwgYm94R2VvbWV0
cnkpOworICAgICAgICAgICAgYXV0byBpbmxpbmVCb3hTaXplID0gTGF5b3V0U2l6ZSB7IExheW91
dFVuaXQ6OmZyb21GbG9hdENlaWwoaW5saW5lQm94Qm9yZGVyQm94LndpZHRoKCkpLCBMYXlvdXRV
bml0Ojpmcm9tRmxvYXRDZWlsKGlubGluZUJveEJvcmRlckJveC5oZWlnaHQoKSkgfTsKKyAgICAg
ICAgICAgIGF1dG8gbG9naWNhbFJlY3QgPSBSZWN0IHsgTGF5b3V0UG9pbnQgeyBpbmxpbmVCb3hC
b3JkZXJCb3gudG9wTGVmdCgpIH0sIGlubGluZUJveFNpemUgfTsKKyAgICAgICAgICAgIGxvZ2lj
YWxSZWN0Lm1vdmVCeShMYXlvdXRQb2ludCB7IGxpbmVCb3hMb2dpY2FsUmVjdC50b3BMZWZ0KCkg
fSk7CisgICAgICAgICAgICBpZiAoaW5saW5lQm94U3RhcnRTZXQuY29udGFpbnMoJmxheW91dEJv
eCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlubGluZSBib3ggc2hvd2VkIHVwIGZpcnN0
IG9uIHRoaXMgbGluZS4KKyAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9w
TGVmdChsb2dpY2FsUmVjdC50b3BMZWZ0KCkpOworICAgICAgICAgICAgICAgIGF1dG8gY29udGVu
dEJveEhlaWdodCA9IGxvZ2ljYWxSZWN0LmhlaWdodCgpIC0gKGJveEdlb21ldHJ5LnZlcnRpY2Fs
Qm9yZGVyKCkgKyBib3hHZW9tZXRyeS52ZXJ0aWNhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKTsK
KyAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGNvbnRlbnRC
b3hIZWlnaHQpOworICAgICAgICAgICAgICAgIGF1dG8gY29udGVudEJveFdpZHRoID0gbG9naWNh
bFJlY3Qud2lkdGgoKSAtIChib3hHZW9tZXRyeS5ob3Jpem9udGFsQm9yZGVyKCkgKyBib3hHZW9t
ZXRyeS5ob3Jpem9udGFsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpOworICAgICAgICAgICAgICAg
IGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChjb250ZW50Qm94V2lkdGgpOworICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTWlkZGxl
IG9yIGVuZCBvZiB0aGUgaW5saW5lIGJveC4gTGV0J3Mgc3RyZXRjaCB0aGUgYm94IGFzIG5lZWRl
ZC4KKyAgICAgICAgICAgIGF1dG8gZW5jbG9zaW5nQm9yZGVyQm94UmVjdCA9IEJveEdlb21ldHJ5
Ojpib3JkZXJCb3hSZWN0KGJveEdlb21ldHJ5KTsKKyAgICAgICAgICAgIGVuY2xvc2luZ0JvcmRl
ckJveFJlY3QuZXhwYW5kVG9Db250YWluKGxvZ2ljYWxSZWN0KTsKKyAgICAgICAgICAgIGJveEdl
b21ldHJ5LnNldExvZ2ljYWxMZWZ0KGVuY2xvc2luZ0JvcmRlckJveFJlY3QubGVmdCgpKTsKKwor
ICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodChlbmNsb3NpbmdCb3Jk
ZXJCb3hSZWN0LmhlaWdodCgpIC0gKGJveEdlb21ldHJ5LnZlcnRpY2FsQm9yZGVyKCkgKyBib3hH
ZW9tZXRyeS52ZXJ0aWNhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKSk7CisgICAgICAgICAgICBi
b3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoZW5jbG9zaW5nQm9yZGVyQm94UmVjdC53aWR0
aCgpIC0gKGJveEdlb21ldHJ5Lmhvcml6b250YWxCb3JkZXIoKSArIGJveEdlb21ldHJ5Lmhvcml6
b250YWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KSkpOworICAgICAgICB9CisgICAgfTsKKyAgICB1
cGRhdGVCb3hHZW9tZXRyeUZvcklubGluZUJveGVzKCk7CisKKyAgICBhdXRvIGNvbnN0cnVjdExp
bmVHZW9tZXRyeSA9IFsmXSB7CisgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lKHsgbGlu
ZUJveExvZ2ljYWxSZWN0LCBlbmNsb3NpbmdUb3BBbmRCb3R0b20sIGxpbmVCb3guYWxpZ25tZW50
QmFzZWxpbmUoKSwgcm9vdElubGluZUJveExvZ2ljYWxSZWN0LmxlZnQoKSwgbGluZUNvbnRlbnQu
Y29udGVudExvZ2ljYWxXaWR0aCB9KTsKKyAgICB9OworICAgIGNvbnN0cnVjdExpbmVHZW9tZXRy
eSgpOworCisgICAgcmV0dXJuIGxpbmVCb3hMb2dpY2FsUmVjdDsKK30KKwordm9pZCBJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dDo6aW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShjb25zdCBJbnZhbGlk
YXRpb25TdGF0ZSYpCit7CisgICAgLy8gRmluZCBvdXQgd2hhdCB3ZSBuZWVkIHRvIGludmFsaWRh
dGUuIFRoaXMgaXMgd2hlcmUgd2UgYWRkIHNvbWUgc21hcnRzIHRvIGRvIHBhcnRpYWwgbGluZSBs
YXlvdXQuCisgICAgLy8gRm9yIG5vdyBsZXQncyBqdXN0IGNsZWFyIHRoZSBydW5zLgorICAgIGZv
cm1hdHRpbmdTdGF0ZSgpLmNsZWFyTGluZUFuZFJ1bnMoKTsKKyAgICAvLyBGSVhNRTogVGhpcyBp
cyBhbHNvIHdoZXJlIHdlIHdvdWxkIGRlbGV0ZSBpbmxpbmUgaXRlbXMgaWYgdGhlaXIgY29udGVu
dCBjaGFuZ2VkLgorfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1h
dHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5h
ZDdlYzk3MjM3YzFlODhkNzg4NjAyNjdhMTgwN2UyMDQ4YWY0MzJlCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0
aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgor
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
KyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhU
KQorCisjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbmxpbmVMaW5l
QnVpbGRlci5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIElubGluZUZvcm1hdHRpbmdTdGF0ZTsK
K2NsYXNzIEludmFsaWRhdGlvblN0YXRlOworY2xhc3MgTGluZUJveDsKKworLy8gVGhpcyBjbGFz
cyBpbXBsZW1lbnRzIHRoZSBsYXlvdXQgbG9naWMgZm9yIGlubGluZSBmb3JtYXR0aW5nIGNvbnRl
eHRzLgorLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIyL3Zpc3VyZW4uaHRtbCNpbmxpbmUt
Zm9ybWF0dGluZworY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQgZmluYWwgOiBwdWJsaWMg
Rm9ybWF0dGluZ0NvbnRleHQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoSW5saW5lRm9y
bWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAgIElubGluZUZvcm1hdHRpbmdDb250ZXh0KGNv
bnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBJbmxpbmVGb3JtYXR0aW5n
U3RhdGUmKTsKKyAgICB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUm
LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSBvdmVycmlkZTsKKyAgICBMYXlv
dXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBjbGFzcyBR
dWlya3MgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyB7CisgICAgcHVibGljOgor
ICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGluaXRpYWxMaW5lSGVpZ2h0KCkgY29uc3Q7CisgICAg
ICAgIGJvb2wgaGFzU29mdFdyYXBPcHBvcnR1bml0eUF0SW1hZ2UoKSBjb25zdDsKKyAgICAgICAg
Ym9vbCBpbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGNvbnN0IExpbmVCb3g6OklubGluZUxl
dmVsQm94JiwgY29uc3QgTGluZUJveCYpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAg
ZnJpZW5kIGNsYXNzIElubGluZUZvcm1hdHRpbmdDb250ZXh0OworICAgICAgICBRdWlya3MoY29u
c3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmKTsKKworICAgICAgICBjb25zdCBJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2Fz
dDxJbmxpbmVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6Zm9y
bWF0dGluZ0NvbnRleHQoKSk7IH0KKworICAgIH07CisgICAgSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9CisKKyAg
ICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIGNvbnN0IHsg
cmV0dXJuIGRvd25jYXN0PElubGluZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6
OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQorICAgIElubGluZUZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0
dGluZ1N0YXRlKCkgeyByZXR1cm4gZG93bmNhc3Q8SW5saW5lRm9ybWF0dGluZ1N0YXRlPihGb3Jt
YXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9CisKKyAgICB2b2lkIGxpbmVMYXlv
dXRGb3JJbnRlcmdyYXRpb24oSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0Zv
ckluRmxvd0NvbnRlbnQmKTsKKworcHJpdmF0ZToKKyAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpIG92ZXJyaWRlOworCisgICAg
Y2xhc3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIExpbmVCb3ggbGluZUJveEZvckxpbmVDb250ZW50KGNvbnN0IExp
bmVCdWlsZGVyOjpMaW5lQ29udGVudCYpOworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxUb3BGb3JOZXh0TGluZShjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmLCBJbmxpbmVM
YXlvdXRVbml0IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIGNvbnN0IEZsb2F0aW5nQ29udGV4
dCYpIGNvbnN0OworCisgICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5saW5lQmxvY2tD
b250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpIGNvbnN0OworICAgICAgICBD
b250ZW50V2lkdGhBbmRNYXJnaW4gaW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRNYXJnaW4oY29u
c3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhv
cml6b250YWxWYWx1ZXMmKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGZyaWVuZCBjbGFzcyBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKKyAgICAgICAgR2VvbWV0cnkoY29uc3QgSW5saW5lRm9y
bWF0dGluZ0NvbnRleHQmKTsKKworICAgICAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpmb3JtYXR0aW5nQ29u
dGV4dCgpKTsgfQorCisgICAgfTsKKyAgICBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0
cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBHZW9tZXRyeSgqdGhpcyk7IH0KKworICAgIHZv
aWQgbGluZUxheW91dChJbmxpbmVJdGVtcyYsIExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2Us
IGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOworCisgICAgdm9pZCBjb21wdXRl
SW50cmluc2ljV2lkdGhGb3JGb3JtYXR0aW5nUm9vdChjb25zdCBCb3gmKTsKKyAgICBJbmxpbmVM
YXlvdXRVbml0IGNvbXB1dGVkSW50cmluc2ljV2lkdGhGb3JDb25zdHJhaW50KElubGluZUxheW91
dFVuaXQgYXZhaWxhYmxlV2lkdGgpIGNvbnN0OworCisgICAgdm9pZCBjb21wdXRlSG9yaXpvbnRh
bE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmKTsKKyAgICB2
b2lkIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJik7CisgICAgdm9pZCBjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3QgQm94Jiwg
Y29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7CisKKyAgICB2b2lkIGNvbGxlY3RJbmxpbmVD
b250ZW50SWZOZWVkZWQoKTsKKyAgICBJbmxpbmVSZWN0IGNvbXB1dGVHZW9tZXRyeUZvckxpbmVD
b250ZW50KGNvbnN0IExpbmVCdWlsZGVyOjpMaW5lQ29udGVudCYsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYpOworICAgIHZvaWQgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShjb25zdCBJ
bnZhbGlkYXRpb25TdGF0ZSYpOworfTsKKworaW5saW5lIElubGluZUZvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeTo6R2VvbWV0cnkoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGlu
ZUZvcm1hdHRpbmdDb250ZXh0KQorICAgIDogRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5KGlu
bGluZUZvcm1hdHRpbmdDb250ZXh0KQoreworfQorCitpbmxpbmUgSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQ6OlF1aXJrczo6UXVpcmtzKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxp
bmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICA6IEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MoaW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQpCit7Cit9CisKK30KK30KKworU1BFQ0lBTElaRV9UWVBFX1RS
QUlUU19MQVlPVVRfRk9STUFUVElOR19DT05URVhUKElubGluZUZvcm1hdHRpbmdDb250ZXh0LCBp
c0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0
R2VvbWV0cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmVkNWI4NjQ1NTNiOTA5ZTVjM2I4OGYxNmM4ZmE2MDcx
MzIyMzAyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRHZW9t
ZXRyeS5jcHAKQEAgLTAsMCArMSw3MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
CisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisg
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShM
QVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRmxvYXRpbmdDb250ZXh0Lmgi
CisjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbmxpbmVMaW5lQm94
LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94
LmgiCisjaW5jbHVkZSAiTGF5b3V0UmVwbGFjZWRCb3guaCIKKyNpbmNsdWRlICJMZW5ndGhGdW5j
dGlvbnMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2Ns
YXNzIExpbmVCb3hCdWlsZGVyIHsKK3B1YmxpYzoKKyAgICBMaW5lQm94QnVpbGRlcihjb25zdCBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dCYpOworICAgIExpbmVCb3ggYnVpbGQoY29uc3QgTGluZUJ1
aWxkZXI6OkxpbmVDb250ZW50Jik7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IFNpbXBsaWZpZWRW
ZXJ0aWNhbEFsaWdubWVudCB7CisgICAgICAgIFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudChj
b25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgcm9vdElubGluZUJveCk7CisKKyAgICAgICAg
c3RhdGljIGJvb2wgY2FuVXNlU2ltcGxpZmllZEFsaWdubWVudChjb25zdCBMaW5lQm94OjpJbmxp
bmVMZXZlbEJveCYgcm9vdElubGluZUJveCwgY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gm
LCBPcHRpb25hbDxjb25zdCBCb3hHZW9tZXRyeT4gaW5saW5lTGV2ZWxCb3hHZW9tZXRyeSk7CisK
KyAgICAgICAgdm9pZCBhbGlnbihMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYpOworCisgICAgICAg
IElubGluZUxheW91dFVuaXQgcm9vdElubGluZUJveExvZ2ljYWxUb3AoKSBjb25zdCB7IHJldHVy
biBtX3Jvb3RJbmxpbmVCb3hMb2dpY2FsVG9wOyB9CisgICAgICAgIElubGluZUxheW91dFVuaXQg
bGluZUJveEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJveExvZ2ljYWxCb3R0b20gLSBt
X2xpbmVCb3hMb2dpY2FsVG9wOyB9CisKKyAgICAgICAgdm9pZCBzZXRFbmFibGVkKGJvb2wgZW5h
YmxlZCkgeyBtX2lzRW5hYmxlZCA9IGVuYWJsZWQ7IH0KKyAgICAgICAgYm9vbCBpc0VuYWJsZWQo
KSBjb25zdCB7IHJldHVybiBtX2lzRW5hYmxlZDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAg
dm9pZCBhZGp1c3QoY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmKTsKKworICAgICAgICBj
b25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgbV9yb290SW5saW5lQm94OworICAgICAgICBi
b29sIG1faXNFbmFibGVkIHsgdHJ1ZSB9OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fbGlu
ZUJveExvZ2ljYWxUb3AgeyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9saW5lQm94
TG9naWNhbEJvdHRvbSB7IDAgfTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX3Jvb3RJbmxp
bmVCb3hMb2dpY2FsVG9wIHsgMCB9OworICAgIH07CisKKyAgICB2b2lkIHNldFZlcnRpY2FsR2Vv
bWV0cnlGb3JJbmxpbmVCb3goTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmKSBjb25zdDsKKyAgICB2
b2lkIGNvbnN0cnVjdEFuZEFsaWduSW5saW5lTGV2ZWxCb3hlcyhMaW5lQm94JiwgY29uc3QgTGlu
ZTo6UnVuTGlzdCYpOworICAgIHZvaWQgY29tcHV0ZUxpbmVCb3hIZWlnaHRBbmRBbGlnbklubGlu
ZUxldmVsQm94ZXNWZXJ0aWNhbGx5KExpbmVCb3gmKTsKKworICAgIGNvbnN0IElubGluZUZvcm1h
dHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQ7IH0KKyAgICBjb25zdCBCb3gmIHJvb3RCb3goKSBjb25zdCB7IHJl
dHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKTsgfQorICAgIExheW91dFN0YXRlJiBsYXlv
dXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkubGF5b3V0U3RhdGUo
KTsgfQorCisgICAgYm9vbCBpc1Jvb3RMYXlvdXRCb3goY29uc3QgQ29udGFpbmVyQm94JiBjb250
YWluZXJCb3gpIGNvbnN0IHsgcmV0dXJuICZjb250YWluZXJCb3ggPT0gJnJvb3RCb3goKTsgfQor
Citwcml2YXRlOgorICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBtX2lubGluZUZv
cm1hdHRpbmdDb250ZXh0OworfTsKKworc3RydWN0IEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VD
b250ZW50IHsKK3B1YmxpYzoKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICBJbmxpbmVMYXlvdXRV
bml0IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV93aWR0aDsgfQorICAgIGJvb2wgaXNDb25kaXRp
b25hbCgpIGNvbnN0IHsgcmV0dXJuIG1faXNDb25kaXRpb25hbDsgfQorCisgICAgdm9pZCBzZXRJ
c0NvbmRpdGlvbmFsKCkgeyBtX2lzQ29uZGl0aW9uYWwgPSB0cnVlOyB9CisgICAgdm9pZCBleHBh
bmQoSW5saW5lTGF5b3V0VW5pdCB3aWR0aCkgeyBtX3dpZHRoICs9IHdpZHRoOyB9CisKK3ByaXZh
dGU6CisgICAgYm9vbCBtX2lzQ29uZGl0aW9uYWwgeyBmYWxzZSB9OworICAgIElubGluZUxheW91
dFVuaXQgbV93aWR0aCB7IDAgfTsKK307CisKK3ZvaWQgSGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFj
ZUNvbnRlbnQ6OnJlc2V0KCkKK3sKKyAgICBtX2lzQ29uZGl0aW9uYWwgPSBmYWxzZTsKKyAgICBt
X3dpZHRoID0gIDA7Cit9CisKK3N0YXRpYyBIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVu
dCBjb2xsZWN0SGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQoY29uc3QgTGluZTo6UnVu
TGlzdCYgcnVucywgYm9vbCBpc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQpCit7CisgICAgYXV0
byBoYW5naW5nQ29udGVudCA9IEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50IHsgfTsK
KyAgICBpZiAoaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KQorICAgICAgICBoYW5naW5nQ29u
dGVudC5zZXRJc0NvbmRpdGlvbmFsKCk7CisgICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VS
ZXZlcnNlZFJhbmdlKHJ1bnMpKSB7CisgICAgICAgIGlmIChydW4uaXNJbmxpbmVCb3hTdGFydCgp
IHx8IHJ1bi5pc0lubGluZUJveEVuZCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IGlmIChydW4uaXNMaW5lQnJlYWsoKSkgeworICAgICAgICAgICAgaGFuZ2luZ0NvbnRlbnQuc2V0
SXNDb25kaXRpb25hbCgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAg
ICAgaWYgKCFydW4uaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkpCisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHByZXNlcnZlZCBvciBodW5nIHdoaXRlc3Bh
Y2UuCisgICAgICAgIGlmIChydW4uc3R5bGUoKS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6
UHJlV3JhcCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBUaGlzIGlzIGVpdGhlciBh
IG5vcm1hbCBvciBjb25kaXRpb25hbGx5IGhhbmdpbmcgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAg
ICAgICAgaGFuZ2luZ0NvbnRlbnQuZXhwYW5kKHJ1bi50cmFpbGluZ1doaXRlc3BhY2VXaWR0aCgp
KTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmdpbmdDb250ZW50OworfQorCitzdGF0aWMgT3B0aW9u
YWw8SW5saW5lTGF5b3V0VW5pdD4gaG9yaXpvbnRhbEFsaWdubWVudE9mZnNldChjb25zdCBMaW5l
OjpSdW5MaXN0JiBydW5zLCBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiwgSW5saW5lTGF5b3V0VW5p
dCBsaW5lTG9naWNhbFdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgs
IGJvb2wgaXNMYXN0TGluZSkKK3sKKyAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gbGluZUxvZ2lj
YWxXaWR0aCAtIGNvbnRlbnRMb2dpY2FsV2lkdGg7CisgICAgYXV0byBoYW5naW5nVHJhaWxpbmdX
aGl0ZXNwYWNlQ29udGVudCA9IGNvbGxlY3RIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVu
dChydW5zLCBpc0xhc3RMaW5lKTsKKyAgICBhdmFpbGFibGVXaWR0aCArPSBoYW5naW5nVHJhaWxp
bmdXaGl0ZXNwYWNlQ29udGVudC53aWR0aCgpOworICAgIGlmIChhdmFpbGFibGVXaWR0aCA8PSAw
KQorICAgICAgICByZXR1cm4geyB9OworCisgICAgYXV0byBjb21wdXRlZEhvcml6b250YWxBbGln
bm1lbnQgPSBbJl0geworICAgICAgICBpZiAodGV4dEFsaWduICE9IFRleHRBbGlnbk1vZGU6Okp1
c3RpZnkpCisgICAgICAgICAgICByZXR1cm4gdGV4dEFsaWduOworICAgICAgICAvLyBUZXh0IGlz
IGp1c3RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIG1ldGhvZCBzcGVjaWZpZWQgYnkgdGhlIHRleHQt
anVzdGlmeSBwcm9wZXJ0eSwKKyAgICAgICAgLy8gaW4gb3JkZXIgdG8gZXhhY3RseSBmaWxsIHRo
ZSBsaW5lIGJveC4gVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgYnkgdGV4dC1hbGlnbi1sYXN0
LAorICAgICAgICAvLyB0aGUgbGFzdCBsaW5lIGJlZm9yZSBhIGZvcmNlZCBicmVhayBvciB0aGUg
ZW5kIG9mIHRoZSBibG9jayBpcyBzdGFydC1hbGlnbmVkLgorICAgICAgICBpZiAoaXNMYXN0TGlu
ZSB8fCAoIXJ1bnMuaXNFbXB0eSgpICYmIHJ1bnMubGFzdCgpLmlzTGluZUJyZWFrKCkpKQorICAg
ICAgICAgICAgcmV0dXJuIFRleHRBbGlnbk1vZGU6OlN0YXJ0OworICAgICAgICByZXR1cm4gVGV4
dEFsaWduTW9kZTo6SnVzdGlmeTsKKyAgICB9OworCisgICAgc3dpdGNoIChjb21wdXRlZEhvcml6
b250YWxBbGlnbm1lbnQoKSkgeworICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6TGVmdDoKKyAgICBj
YXNlIFRleHRBbGlnbk1vZGU6OldlYktpdExlZnQ6CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpT
dGFydDoKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OlJpZ2h0
OgorICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6V2ViS2l0UmlnaHQ6CisgICAgY2FzZSBUZXh0QWxp
Z25Nb2RlOjpFbmQ6CisgICAgICAgIHJldHVybiBhdmFpbGFibGVXaWR0aDsKKyAgICBjYXNlIFRl
eHRBbGlnbk1vZGU6OkNlbnRlcjoKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdENlbnRl
cjoKKyAgICAgICAgcmV0dXJuIGF2YWlsYWJsZVdpZHRoIC8gMjsKKyAgICBjYXNlIFRleHRBbGln
bk1vZGU6Okp1c3RpZnk6CisgICAgICAgIC8vIFRleHRBbGlnbk1vZGU6Okp1c3RpZnkgaXMgYSBy
dW4gYWxpZ25tZW50IChhbmQgd2Ugb25seSBkbyBpbmxpbmUgYm94IGFsaWdubWVudCBoZXJlKQor
ICAgICAgICByZXR1cm4geyB9OworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfSU1Q
TEVNRU5URURfWUVUKCk7CisgICAgICAgIHJldHVybiB7IH07CisgICAgfQorICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgIHJldHVybiB7IH07Cit9CisKK0xpbmVCb3hCdWlsZGVyOjpMaW5l
Qm94QnVpbGRlcihjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQpCisgICAgOiBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0KGlubGluZUZvcm1hdHRp
bmdDb250ZXh0KQoreworfQorCitMaW5lQm94IExpbmVCb3hCdWlsZGVyOjpidWlsZChjb25zdCBM
aW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250ZW50KQoreworICAgIGF1dG8mIHJ1bnMg
PSBsaW5lQ29udGVudC5ydW5zOworICAgIGF1dG8gbGluZUxvZ2ljYWxXaWR0aCA9IGxpbmVDb250
ZW50LmxpbmVMb2dpY2FsV2lkdGg7CisgICAgYXV0byBjb250ZW50TG9naWNhbFdpZHRoID0gbGlu
ZUNvbnRlbnQuY29udGVudExvZ2ljYWxXaWR0aDsKKyAgICBhdXRvIGhvcml6b250YWxBbGlnbm1l
bnRPZmZzZXQgPSBMYXlvdXQ6Omhvcml6b250YWxBbGlnbm1lbnRPZmZzZXQocnVucywgcm9vdEJv
eCgpLnN0eWxlKCkudGV4dEFsaWduKCksIGxpbmVMb2dpY2FsV2lkdGgsIGNvbnRlbnRMb2dpY2Fs
V2lkdGgsIGxpbmVDb250ZW50LmlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudCk7CisgICAgYXV0
byBsaW5lQm94ID0gTGluZUJveCB7IHJvb3RCb3goKSwgbGluZUNvbnRlbnQubG9naWNhbFRvcExl
ZnQsIGxpbmVMb2dpY2FsV2lkdGgsIGhvcml6b250YWxBbGlnbm1lbnRPZmZzZXQudmFsdWVPcihJ
bmxpbmVMYXlvdXRVbml0IHsgfSksIGNvbnRlbnRMb2dpY2FsV2lkdGgsIGxpbmVDb250ZW50Lm5v
blNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCB9OworICAgIGNvbnN0cnVjdEFuZEFsaWduSW5s
aW5lTGV2ZWxCb3hlcyhsaW5lQm94LCBydW5zKTsKKyAgICByZXR1cm4gbGluZUJveDsKK30KKwor
dm9pZCBMaW5lQm94QnVpbGRlcjo6c2V0VmVydGljYWxHZW9tZXRyeUZvcklubGluZUJveChMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJU
KGlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkgfHwgaW5saW5lTGV2ZWxCb3guaXNMaW5lQnJl
YWtCb3goKSk7CisgICAgYXV0byYgZm9udE1ldHJpY3MgPSBpbmxpbmVMZXZlbEJveC5zdHlsZSgp
LmZvbnRNZXRyaWNzKCk7CisgICAgSW5saW5lTGF5b3V0VW5pdCBhc2NlbnQgPSBmb250TWV0cmlj
cy5hc2NlbnQoKTsKKyAgICBJbmxpbmVMYXlvdXRVbml0IGRlc2NlbnQgPSBmb250TWV0cmljcy5k
ZXNjZW50KCk7CisgICAgYXV0byBsb2dpY2FsSGVpZ2h0ID0gYXNjZW50ICsgZGVzY2VudDsKKyAg
ICAvLyBXZSBuZWVkIGZsb29yL2NlaWwgdG8gbWF0Y2ggbGVnYWN5IGxheW91dCBpbnRlZ3JhbCBw
b3NpdGlvbmluZy4KKyAgICBpbmxpbmVMZXZlbEJveC5zZXRCYXNlbGluZShmbG9vcmYoYXNjZW50
KSk7CisgICAgaW5saW5lTGV2ZWxCb3guc2V0RGVzY2VudChjZWlsKGRlc2NlbnQpKTsKKyAgICBp
bmxpbmVMZXZlbEJveC5zZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQpOworCisgICAgLy8g
RklYTUU6IEFkanVzdCBsYXlvdXQgYm91bmRzIHdpdGggZmFsbGJhY2sgZm9udCB3aGVuIGFwcGxp
Y2FibGUuCisgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKS5zdHls
ZSgpOworICAgIGF1dG8gbGluZUhlaWdodCA9IHN0eWxlLmxpbmVIZWlnaHQoKTsKKyAgICBpZiAo
bGluZUhlaWdodC5pc05lZ2F0aXZlKCkpIHsKKyAgICAgICAgLy8gSWYgbGluZS1oZWlnaHQgY29t
cHV0ZXMgdG8gbm9ybWFsIGFuZCBlaXRoZXIgdGV4dC1lZGdlIGlzIGxlYWRpbmcgb3IgdGhpcyBp
cyB0aGUgcm9vdCBpbmxpbmUgYm94LAorICAgICAgICAvLyB0aGUgZm9udOKAmXMgbGluZSBnYXAg
bWV0cmljIG1heSBhbHNvIGJlIGluY29ycG9yYXRlZCBpbnRvIEEgYW5kIEQgYnkgYWRkaW5nIGhh
bGYgdG8gZWFjaCBzaWRlIGFzIGhhbGYtbGVhZGluZy4KKyAgICAgICAgLy8gaHR0cHM6Ly93d3cu
dzMub3JnL1RSL2Nzcy1pbmxpbmUtMy8jaW5saW5lLWhlaWdodAorICAgICAgICAvLyBTaW5jZSB0
ZXh0LWVkZ2UgaXMgbm90IHN1cHBvcnRlZCB5ZXQgYW5kIHRoZSBpbml0aWFsIHZhbHVlIGlzIGxl
YWRpbmcsIHdlIHNob3VsZCBqdXN0IGFwcGx5IGl0IHRvCisgICAgICAgIC8vIGFsbCBpbmxpbmUg
Ym94ZXMuCisgICAgICAgIGF1dG8gaGFsZkxpbmVHYXAgPSAoZm9udE1ldHJpY3MubGluZVNwYWNp
bmcoKSAtIGxvZ2ljYWxIZWlnaHQpIC8gMjsKKyAgICAgICAgYXNjZW50ICs9IGhhbGZMaW5lR2Fw
OworICAgICAgICBkZXNjZW50ICs9IGhhbGZMaW5lR2FwOworICAgIH0gZWxzZSB7CisgICAgICAg
IElubGluZUxheW91dFVuaXQgbGluZUhlaWdodCA9IHN0eWxlLmNvbXB1dGVkTGluZUhlaWdodCgp
OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGhhbGZMZWFkaW5nID0gKGxpbmVIZWlnaHQgLSAo
YXNjZW50ICsgZGVzY2VudCkpIC8gMjsKKyAgICAgICAgYXNjZW50ICs9IGhhbGZMZWFkaW5nOwor
ICAgICAgICBkZXNjZW50ICs9IGhhbGZMZWFkaW5nOworICAgIH0KKyAgICAvLyBXZSBuZWVkIGZs
b29yL2NlaWwgdG8gbWF0Y2ggbGVnYWN5IGxheW91dCBpbnRlZ3JhbCBwb3NpdGlvbmluZy4KKyAg
ICBpbmxpbmVMZXZlbEJveC5zZXRMYXlvdXRCb3VuZHMoTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6
OkxheW91dEJvdW5kcyB7IGZsb29yZihhc2NlbnQpLCBjZWlsKGRlc2NlbnQpIH0pOworfQorCit2
b2lkIExpbmVCb3hCdWlsZGVyOjpjb25zdHJ1Y3RBbmRBbGlnbklubGluZUxldmVsQm94ZXMoTGlu
ZUJveCYgbGluZUJveCwgY29uc3QgTGluZTo6UnVuTGlzdCYgcnVucykKK3sKKyAgICBhdXRvJiBy
b290SW5saW5lQm94ID0gbGluZUJveC5yb290SW5saW5lQm94KCk7CisgICAgc2V0VmVydGljYWxH
ZW9tZXRyeUZvcklubGluZUJveChyb290SW5saW5lQm94KTsKKworICAgIGF1dG8gc2ltcGxpZmll
ZFZlcnRpY2FsQWxpZ25tZW50ID0gU2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50IHsgcm9vdElu
bGluZUJveCB9OworICAgIC8vIEZJWE1FOiBBZGQgZmFzdCBwYXRoIHN1cHBvcnQgZm9yIGxpbmUt
aGVpZ2h0IGNvbnRlbnQuCisgICAgc2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50LnNldEVuYWJs
ZWQobGF5b3V0U3RhdGUoKS5pblN0YW5kYXJkc01vZGUoKSAmJiByb290Qm94KCkuc3R5bGUoKS5s
aW5lSGVpZ2h0KCkuaXNOZWdhdGl2ZSgpKTsKKworICAgIGF1dG8gc2ltcGxpZmllZEFsaWduVmVy
dGljYWxseUlmQXBwbGljYWJsZSA9IFsmXShhdXRvJiBpbmxpbmVMZXZlbEJveCwgT3B0aW9uYWw8
Y29uc3QgQm94R2VvbWV0cnk+IGJveEdlb21ldHJ5KSB7CisgICAgICAgIGlmICghc2ltcGxpZmll
ZFZlcnRpY2FsQWxpZ25tZW50LmlzRW5hYmxlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICBpZiAoIVNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudDo6Y2FuVXNlU2ltcGxpZmllZEFs
aWdubWVudChyb290SW5saW5lQm94LCBpbmxpbmVMZXZlbEJveCwgYm94R2VvbWV0cnkpKSB7Cisg
ICAgICAgICAgICBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQuc2V0RW5hYmxlZChmYWxzZSk7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2ltcGxpZmllZFZlcnRp
Y2FsQWxpZ25tZW50LmFsaWduKGlubGluZUxldmVsQm94KTsKKyAgICB9OworCisgICAgYXV0byBj
cmVhdGVXcmFwcGVkSW5saW5lQm94ZXMgPSBbJl0geworICAgICAgICBpZiAocnVucy5pc0VtcHR5
KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8vIEFuIGlubGluZSBib3ggbWF5IG5v
dCBuZWNlc3NhcmlseSBzdGFydCBvbiB0aGUgY3VycmVudCBsaW5lOgorICAgICAgICAvLyA8c3Bh
biBpZD1vdXRlcj5saW5lIGJyZWFrPGJyPnRoaXMgY29udGVudCdzIHBhcmVudCBpbmxpbmUgYm94
KCdvdXRlcicpIDxzcGFuIGlkPWlubmVyPnN0YXJ0cyBvbiB0aGUgcHJldmlvdXMgbGluZTwvc3Bh
bj48L3NwYW4+CisgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlcmUncyBh
biBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBmb3IgZXZlcnkgaW5saW5lIGJveCB0aGF0J3MgcHJl
c2VudCBvbiB0aGUgY3VycmVudCBsaW5lLgorICAgICAgICAvLyBJbiBuZXN0aW5nIGNhc2Ugd2Ug
bmVlZCB0byBjcmVhdGUgTGluZUJveDo6SW5saW5lTGV2ZWxCb3hlcyBmb3IgdGhlIGlubGluZSBi
b3ggYW5jZXN0b3JzLgorICAgICAgICAvLyBXZSBvbmx5IGhhdmUgdG8gZG8gaXQgb24gdGhlIGZp
cnN0IHJ1biBhcyBhbnkgc3Vic2VxdWVudCBpbmxpbmUgY29udGVudCBpcyBlaXRoZXIgYXQgdGhl
IHNhbWUvaGlnaGVyIG5lc3RpbmcgbGV2ZWwgb3IKKyAgICAgICAgLy8gbmVzdGVkIHdpdGggYSBb
aW5saW5lIGJveCBzdGFydF0gcnVuLgorICAgICAgICBhdXRvJiBmaXJzdFJ1biA9IHJ1bnNbMF07
CisgICAgICAgIGF1dG8mIGZpcnN0UnVuUGFyZW50TGF5b3V0Qm94ID0gZmlyc3RSdW4ubGF5b3V0
Qm94KCkucGFyZW50KCk7CisgICAgICAgIC8vIElmIHRoZSBwYXJlbnQgaXMgdGhlIGZvcm1hdHRp
bmcgcm9vdCwgd2UgY2FuIHN0b3AgaGVyZS4gVGhpcyBpcyByb290IGlubGluZSBib3ggY29udGVu
dCwgdGhlcmUncyBubyBuZXN0aW5nIGlubGluZSBib3ggZnJvbSB0aGUgcHJldmlvdXMgbGluZShz
KQorICAgICAgICAvLyB1bmxlc3MgdGhlIGlubGluZSBib3ggY2xvc2luZyBpcyBmb3JjZWQgb3Zl
ciB0byB0aGUgY3VycmVudCBsaW5lLgorICAgICAgICAvLyBlLmcuCisgICAgICAgIC8vIDxzcGFu
Pm5vcm1hbGx5IHRoZSBpbmxpbmUgYm94IGNsb3NpbmcgZm9ybXMgYSBjb250aW51b3VzIGNvbnRl
bnQ8L3NwYW4+CisgICAgICAgIC8vIDxzcGFuPnVubGVzcyBpdCdzIGZvcmNlZCB0byB0aGUgbmV4
dCBsaW5lPGJyPjwvc3Bhbj4KKyAgICAgICAgYXV0byBmaXJzdFJ1bk5lZWRzSW5saW5lQm94ID0g
Zmlyc3RSdW4uaXNJbmxpbmVCb3hFbmQoKTsKKyAgICAgICAgaWYgKCFmaXJzdFJ1bk5lZWRzSW5s
aW5lQm94ICYmIGlzUm9vdExheW91dEJveChmaXJzdFJ1blBhcmVudExheW91dEJveCkpCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIFZlY3Rvcjxjb25zdCBCb3gqPiBsYXlvdXRCb3hlc1dp
dGhvdXRJbmxpbmVCb3hlczsKKyAgICAgICAgaWYgKGZpcnN0UnVuTmVlZHNJbmxpbmVCb3gpCisg
ICAgICAgICAgICBsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVCb3hlcy5hcHBlbmQoJmZpcnN0UnVu
LmxheW91dEJveCgpKTsKKyAgICAgICAgYXV0byogYW5jZXN0b3IgPSAmZmlyc3RSdW5QYXJlbnRM
YXlvdXRCb3g7CisgICAgICAgIHdoaWxlICghaXNSb290TGF5b3V0Qm94KCphbmNlc3RvcikpIHsK
KyAgICAgICAgICAgIGxheW91dEJveGVzV2l0aG91dElubGluZUJveGVzLmFwcGVuZChhbmNlc3Rv
cik7CisgICAgICAgICAgICBhbmNlc3RvciA9ICZhbmNlc3Rvci0+cGFyZW50KCk7CisgICAgICAg
IH0KKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBtaXNzaW5nIExpbmVCb3g6OklubGluZUJveGVz
IHN0YXJ0aW5nIHdpdGggdGhlIHRvcG1vc3QgbGF5b3V0IGJveC4KKyAgICAgICAgZm9yIChhdXRv
KiBsYXlvdXRCb3ggOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKGxheW91dEJveGVzV2l0aG91dElu
bGluZUJveGVzKSkgeworICAgICAgICAgICAgYXV0byBpbmxpbmVCb3ggPSBMaW5lQm94OjpJbmxp
bmVMZXZlbEJveDo6Y3JlYXRlSW5saW5lQm94KCpsYXlvdXRCb3gsIHJvb3RJbmxpbmVCb3gubG9n
aWNhbExlZnQoKSwgbGluZUJveC5jb250ZW50TG9naWNhbFdpZHRoKCkpOworICAgICAgICAgICAg
c2V0VmVydGljYWxHZW9tZXRyeUZvcklubGluZUJveChpbmxpbmVCb3gpOworICAgICAgICAgICAg
c2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGljYWJsZShpbmxpbmVCb3gsIHsgfSk7Cisg
ICAgICAgICAgICBsaW5lQm94LmFkZElubGluZUxldmVsQm94KFdURk1vdmUoaW5saW5lQm94KSk7
CisgICAgICAgIH0KKyAgICB9OworICAgIGNyZWF0ZVdyYXBwZWRJbmxpbmVCb3hlcygpOworCisg
ICAgYXV0byBsaW5lSGFzQ29udGVudCA9IGZhbHNlOworICAgIGZvciAoYXV0byYgcnVuIDogcnVu
cykgeworICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBydW4ubGF5b3V0Qm94KCk7CisgICAgICAg
IGF1dG8gcnVuSGFzQ29udGVudCA9IFsmXSAoKSAtPiBib29sIHsKKyAgICAgICAgICAgIEFTU0VS
VCghbGluZUhhc0NvbnRlbnQpOworICAgICAgICAgICAgaWYgKHJ1bi5pc1RleHQoKSB8fCBydW4u
aXNCb3goKSB8fCBydW4uaXNTb2Z0TGluZUJyZWFrKCkgfHwgcnVuLmlzSGFyZExpbmVCcmVhaygp
KQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgYXV0byYgaW5saW5l
Qm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJv
eCk7CisgICAgICAgICAgICAvLyBFdmVuIG5lZ2F0aXZlIGhvcml6b250YWwgbWFyZ2luIG1ha2Vz
IHRoZSBsaW5lICJjb250ZW50ZnVsIi4KKyAgICAgICAgICAgIGlmIChydW4uaXNJbmxpbmVCb3hT
dGFydCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVCb3hHZW9tZXRyeS5tYXJnaW5T
dGFydCgpIHx8IGlubGluZUJveEdlb21ldHJ5LmJvcmRlckxlZnQoKSB8fCBpbmxpbmVCb3hHZW9t
ZXRyeS5wYWRkaW5nTGVmdCgpLnZhbHVlT3IoMF9sdSk7CisgICAgICAgICAgICBpZiAocnVuLmlz
SW5saW5lQm94RW5kKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGlubGluZUJveEdlb21ldHJ5
Lm1hcmdpbkVuZCgpIHx8IGlubGluZUJveEdlb21ldHJ5LmJvcmRlclJpZ2h0KCkgfHwgaW5saW5l
Qm94R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVPcigwX2x1KTsKKyAgICAgICAgICAgIGlm
IChydW4uaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgIH07CisgICAgICAgIGxpbmVIYXNDb250ZW50ID0gbGluZUhhc0Nv
bnRlbnQgfHwgcnVuSGFzQ29udGVudCgpOworICAgICAgICBhdXRvIGxvZ2ljYWxMZWZ0ID0gcm9v
dElubGluZUJveC5sb2dpY2FsTGVmdCgpICsgcnVuLmxvZ2ljYWxMZWZ0KCk7CisgICAgICAgIGlm
IChydW4uaXNCb3goKSkgeworICAgICAgICAgICAgYXV0byYgaW5saW5lTGV2ZWxCb3hHZW9tZXRy
eSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKKyAgICAg
ICAgICAgIGF1dG8gbWFyZ2luQm94SGVpZ2h0ID0gaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS5tYXJn
aW5Cb3hIZWlnaHQoKTsKKyAgICAgICAgICAgIGF1dG8gYXNjZW50ID0gSW5saW5lTGF5b3V0VW5p
dCB7IH07CisgICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUoKS5zaG91bGROb3RTeW50aGVzaXpl
SW5saW5lQmxvY2tCYXNlbGluZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gSW50ZWdyYXRpb24g
Y29kZXBhdGggY29uc3RydWN0cyByZXBsYWNlZCBib3hlcyBmb3IgaW5saW5lLWJsb2NrIGNvbnRl
bnQuCisgICAgICAgICAgICAgICAgQVNTRVJUKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpOwor
ICAgICAgICAgICAgICAgIGFzY2VudCA9ICpkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94
KS5iYXNlbGluZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRCb3guaXNJbmxpbmVC
bG9ja0JveCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGJhc2VsaW5lIG9mIGFuICdpbmxp
bmUtYmxvY2snIGlzIHRoZSBiYXNlbGluZSBvZiBpdHMgbGFzdCBsaW5lIGJveCBpbiB0aGUgbm9y
bWFsIGZsb3csIHVubGVzcyBpdCBoYXMgZWl0aGVyIG5vIGluLWZsb3cgbGluZSBib3hlcyBvcgor
ICAgICAgICAgICAgICAgIC8vIGlmIGl0cyAnb3ZlcmZsb3cnIHByb3BlcnR5IGhhcyBhIGNvbXB1
dGVkIHZhbHVlIG90aGVyIHRoYW4gJ3Zpc2libGUnLCBpbiB3aGljaCBjYXNlIHRoZSBiYXNlbGlu
ZSBpcyB0aGUgYm90dG9tIG1hcmdpbiBlZGdlLgorICAgICAgICAgICAgICAgIGF1dG8gc3ludGhl
c2l6ZUJhc2VsaW5lID0gIWxheW91dEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250
ZXh0KCkgfHwgIWxheW91dEJveC5zdHlsZSgpLmlzT3ZlcmZsb3dWaXNpYmxlKCk7CisgICAgICAg
ICAgICAgICAgaWYgKHN5bnRoZXNpemVCYXNlbGluZSkKKyAgICAgICAgICAgICAgICAgICAgYXNj
ZW50ID0gbWFyZ2luQm94SGVpZ2h0OworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAg
ICAgICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlz
aGVkSW5saW5lRm9ybWF0dGluZ1N0YXRlKGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94
KSk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGxhc3RMaW5lID0gZm9ybWF0dGluZ1N0YXRl
LmxpbmVzKCkubGFzdCgpOworICAgICAgICAgICAgICAgICAgICBhdXRvIGlubGluZUJsb2NrQmFz
ZWxpbmUgPSBsYXN0TGluZS5saW5lQm94TG9naWNhbFJlY3QoKS50b3AoKSArIGxhc3RMaW5lLmJh
c2VsaW5lKCk7CisgICAgICAgICAgICAgICAgICAgIGFzY2VudCA9IGlubGluZUxldmVsQm94R2Vv
bWV0cnkubWFyZ2luQmVmb3JlKCkgKyBpbmxpbmVMZXZlbEJveEdlb21ldHJ5LmJvcmRlclRvcCgp
ICsgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKSArIGlubGlu
ZUJsb2NrQmFzZWxpbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlm
IChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQorICAgICAgICAgICAgICAgIGFzY2VudCA9IGRv
d25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLmJhc2VsaW5lKCkudmFsdWVPcihtYXJnaW5C
b3hIZWlnaHQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFzY2VudCA9IG1h
cmdpbkJveEhlaWdodDsKKyAgICAgICAgICAgIGxvZ2ljYWxMZWZ0ICs9IHN0ZDo6bWF4KDBfbHUs
IGlubGluZUxldmVsQm94R2VvbWV0cnkubWFyZ2luU3RhcnQoKSk7CisgICAgICAgICAgICBhdXRv
IGF0b21pY0lubGluZUxldmVsQm94ID0gTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUF0
b21pY0lubGluZUxldmVsQm94KGxheW91dEJveCwgbG9naWNhbExlZnQsIHsgaW5saW5lTGV2ZWxC
b3hHZW9tZXRyeS5ib3JkZXJCb3hXaWR0aCgpLCBtYXJnaW5Cb3hIZWlnaHQgfSk7CisgICAgICAg
ICAgICBhdG9taWNJbmxpbmVMZXZlbEJveC5zZXRCYXNlbGluZShhc2NlbnQpOworICAgICAgICAg
ICAgYXRvbWljSW5saW5lTGV2ZWxCb3guc2V0TGF5b3V0Qm91bmRzKExpbmVCb3g6OklubGluZUxl
dmVsQm94OjpMYXlvdXRCb3VuZHMgeyBhc2NlbnQsIG1hcmdpbkJveEhlaWdodCAtIGFzY2VudCB9
KTsKKyAgICAgICAgICAgIHNpbXBsaWZpZWRBbGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUoYXRv
bWljSW5saW5lTGV2ZWxCb3gsIGlubGluZUxldmVsQm94R2VvbWV0cnkpOworICAgICAgICAgICAg
bGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChXVEZNb3ZlKGF0b21pY0lubGluZUxldmVsQm94KSk7
CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVuLmlzSW5s
aW5lQm94U3RhcnQoKSkgeworICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBkb24ndCBr
bm93IHlldCBob3cgd2lkZSB0aGlzIGlubGluZSBib3ggaXMuIExldCdzIGFzc3VtZSBpdCdzIGFz
IGxvbmcgYXMgdGhlIGxpbmUgaXMKKyAgICAgICAgICAgIC8vIGFuZCBhZGp1c3QgaXQgbGF0ZXIg
aWYgd2UgY29tZSBhY3Jvc3MgYW4gaW5saW5lQm94RW5kIHJ1biAoc2VlIGJlbG93KS4KKyAgICAg
ICAgICAgIGF1dG8gaW5pdGlhbExvZ2ljYWxXaWR0aCA9IGxpbmVCb3guY29udGVudExvZ2ljYWxX
aWR0aCgpIC0gcnVuLmxvZ2ljYWxMZWZ0KCk7CisgICAgICAgICAgICBBU1NFUlQoaW5pdGlhbExv
Z2ljYWxXaWR0aCA+PSAwKTsKKyAgICAgICAgICAgIC8vIElubGluZSBib3ggcnVuIGlzIGJhc2Vk
IG9uIG1hcmdpbiBib3guIExldCdzIGNvbnZlcnQgaXQgdG8gYm9yZGVyIGJveC4KKyAgICAgICAg
ICAgIGF1dG8gbWFyZ2luU3RhcnQgPSBzdGQ6Om1heCgwX2x1LCBmb3JtYXR0aW5nQ29udGV4dCgp
Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCkubWFyZ2luU3RhcnQoKSk7CisgICAgICAgICAgICBs
b2dpY2FsTGVmdCArPSBtYXJnaW5TdGFydDsKKyAgICAgICAgICAgIGluaXRpYWxMb2dpY2FsV2lk
dGggLT0gbWFyZ2luU3RhcnQ7CisgICAgICAgICAgICBhdXRvIGlubGluZUJveCA9IExpbmVCb3g6
OklubGluZUxldmVsQm94OjpjcmVhdGVJbmxpbmVCb3gobGF5b3V0Qm94LCBsb2dpY2FsTGVmdCwg
aW5pdGlhbExvZ2ljYWxXaWR0aCk7CisgICAgICAgICAgICBzZXRWZXJ0aWNhbEdlb21ldHJ5Rm9y
SW5saW5lQm94KGlubGluZUJveCk7CisgICAgICAgICAgICBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNh
bGx5SWZBcHBsaWNhYmxlKGlubGluZUJveCwgeyB9KTsKKyAgICAgICAgICAgIGxpbmVCb3guYWRk
SW5saW5lTGV2ZWxCb3goV1RGTW92ZShpbmxpbmVCb3gpKTsKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICB9CisgICAgICAgIGlmIChydW4uaXNJbmxpbmVCb3hFbmQoKSkgeworICAgICAg
ICAgICAgLy8gQWRqdXN0IHRoZSBsb2dpY2FsIHdpZHRoIHdoZW4gdGhlIGlubGluZSBib3ggY2xv
c2VzIG9uIHRoaXMgbGluZS4KKyAgICAgICAgICAgIGF1dG8mIGlubGluZUJveCA9IGxpbmVCb3gu
aW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3gobGF5b3V0Qm94KTsKKyAgICAgICAgICAgIEFTU0VS
VChpbmxpbmVCb3guaXNJbmxpbmVCb3goKSk7CisgICAgICAgICAgICAvLyBJbmxpbmUgYm94IHJ1
biBpcyBiYXNlZCBvbiBtYXJnaW4gYm94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBib3gu
CisgICAgICAgICAgICBhdXRvIG1hcmdpbkVuZCA9IHN0ZDo6bWF4KDBfbHUsIGZvcm1hdHRpbmdD
b250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KS5tYXJnaW5FbmQoKSk7CisgICAgICAg
ICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxSaWdodCA9IGxvZ2ljYWxMZWZ0ICsgcnVuLmxvZ2lj
YWxXaWR0aCgpIC0gbWFyZ2luRW5kOworICAgICAgICAgICAgaW5saW5lQm94LnNldExvZ2ljYWxX
aWR0aChpbmxpbmVCb3hMb2dpY2FsUmlnaHQgLSBpbmxpbmVCb3gubG9naWNhbExlZnQoKSk7Cisg
ICAgICAgICAgICBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNhbGx5SWZBcHBsaWNhYmxlKGlubGluZUJv
eCwgeyB9KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChy
dW4uaXNUZXh0KCkgfHwgcnVuLmlzU29mdExpbmVCcmVhaygpKSB7CisgICAgICAgICAgICAvLyBG
SVhNRTogQWRqdXN0IG5vbi1lbXB0eSBpbmxpbmUgYm94IGhlaWdodCB3aGVuIGdseXBocyBmcm9t
IHRoZSBub24tcHJpbWFyeSBmb250IHN0cmV0Y2ggdGhlIGJveC4KKyAgICAgICAgICAgIGxpbmVC
b3guaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3gobGF5b3V0Qm94LnBhcmVudCgpKS5zZXRIYXND
b250ZW50KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAo
cnVuLmlzSGFyZExpbmVCcmVhaygpKSB7CisgICAgICAgICAgICBhdXRvIGxpbmVCcmVha0JveCA9
IExpbmVCb3g6OklubGluZUxldmVsQm94OjpjcmVhdGVMaW5lQnJlYWtCb3gobGF5b3V0Qm94LCBs
b2dpY2FsTGVmdCk7CisgICAgICAgICAgICBzZXRWZXJ0aWNhbEdlb21ldHJ5Rm9ySW5saW5lQm94
KGxpbmVCcmVha0JveCk7CisgICAgICAgICAgICBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNhbGx5SWZB
cHBsaWNhYmxlKGxpbmVCcmVha0JveCwgeyB9KTsKKyAgICAgICAgICAgIGxpbmVCb3guYWRkSW5s
aW5lTGV2ZWxCb3goV1RGTW92ZShsaW5lQnJlYWtCb3gpKTsKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICB9CisgICAgICAgIGlmIChydW4uaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgpKSB7
CisgICAgICAgICAgICBsaW5lQm94LmFkZElubGluZUxldmVsQm94KExpbmVCb3g6OklubGluZUxl
dmVsQm94OjpjcmVhdGVHZW5lcmljSW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94LCBsb2dpY2FsTGVm
dCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgbGluZUJveC5zZXRIYXNDb250ZW50KGxpbmVIYXND
b250ZW50KTsKKyAgICBpZiAoc2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50LmlzRW5hYmxlZCgp
IHx8ICFsaW5lSGFzQ29udGVudCkgeworICAgICAgICAvLyBXZSBzaG91bGQgYWx3YXlzIGJlIGFi
bGUgdG8gZXhlcmNpc2UgdGhlIGZhc3QgcGF0aCB3aGVuIHRoZSBsaW5lIGhhcyBubyBjb250ZW50
IGF0IGFsbCwgZXZlbiBpbiBub24tc3RhbmRhcmRzIG1vZGUgb3Igd2l0aCBsaW5lLWhlaWdodCBz
ZXQuCisgICAgICAgIHJvb3RJbmxpbmVCb3guc2V0TG9naWNhbFRvcChsaW5lSGFzQ29udGVudCA/
IHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5yb290SW5saW5lQm94TG9naWNhbFRvcCgpIDog
LXJvb3RJbmxpbmVCb3guYmFzZWxpbmUoKSk7CisgICAgICAgIGxpbmVCb3guc2V0TG9naWNhbEhl
aWdodChsaW5lSGFzQ29udGVudCA/IHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5saW5lQm94
SGVpZ2h0KCkgOiBJbmxpbmVMYXlvdXRVbml0KCkpOworICAgIH0gZWxzZQorICAgICAgICBjb21w
dXRlTGluZUJveEhlaWdodEFuZEFsaWduSW5saW5lTGV2ZWxCb3hlc1ZlcnRpY2FsbHkobGluZUJv
eCk7Cit9CisKK3ZvaWQgTGluZUJveEJ1aWxkZXI6OmNvbXB1dGVMaW5lQm94SGVpZ2h0QW5kQWxp
Z25JbmxpbmVMZXZlbEJveGVzVmVydGljYWxseShMaW5lQm94JiBsaW5lQm94KQoreworICAgIEFT
U0VSVChsaW5lQm94Lmhhc0NvbnRlbnQoKSk7CisgICAgLy8gVGhpcyBmdW5jdGlvbiAocGFydGlh
bGx5KSBpbXBsZW1lbnRzOgorICAgIC8vIDIuMi4gTGF5b3V0IFdpdGhpbiBMaW5lIEJveGVzCisg
ICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1pbmxpbmUtMy8jbGluZS1sYXlvdXQKKyAg
ICAvLyAxLiBDb21wdXRlIHRoZSBsaW5lIGJveCBoZWlnaHQgdXNpbmcgdGhlIGxheW91dCBib3Vu
ZHMgZ2VvbWV0cnkuIFRoaXMgaGVpZ2h0IGNvbXB1dGF0aW9uIHN0cmljdGx5IHVzZXMgbGF5b3V0
IGJvdW5kcyBhbmQgbm90IG5vcm1hbCBpbmxpbmUgbGV2ZWwgYm94IGdlb21ldHJpZXMuCisgICAg
Ly8gMi4gQ29tcHV0ZSB0aGUgYmFzZWxpbmUvbG9naWNhbCB0b3AgcG9zaXRpb24gb2YgdGhlIHJv
b3QgaW5saW5lIGJveC4gQWxpZ25lZCBib3hlcyBwdXNoIHRoZSByb290IGlubGluZSBib3ggYXJv
dW5kIGluc2lkZSB0aGUgbGluZSBib3guCisgICAgLy8gMy4gRmluYWxseSBhbGlnbiB0aGUgaW5s
aW5lIGxldmVsIGJveGVzIHVzaW5nIChtb3N0bHkpIG5vcm1hbCBpbmxpbmUgbGV2ZWwgYm94IGdl
b21ldHJpZXMuCisgICAgYXV0byBxdWlya3MgPSBmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJrcygp
OworICAgIGF1dG8mIHJvb3RJbmxpbmVCb3ggPSBsaW5lQm94LnJvb3RJbmxpbmVCb3goKTsKKwor
ICAgIGF1dG8gY29tcHV0ZUxpbmVCb3hMb2dpY2FsSGVpZ2h0ID0gWyZdIHsKKyAgICAgICAgLy8g
TGluZSBib3ggaGVpZ2h0IGNvbXB1dGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBsYXlvdXQgYm91bmRz
IG9mIHRoZSBpbmxpbmUgYm94ZXMgYW5kIG5vdCB0aGVpciBsb2dpY2FsIChhc2NlbnQvZGVzY2Vu
dCkgZGltZW5zaW9ucy4KKyAgICAgICAgc3RydWN0IEFic29sdXRlVG9wQW5kQm90dG9tIHsKKyAg
ICAgICAgICAgIElubGluZUxheW91dFVuaXQgdG9wIHsgMCB9OworICAgICAgICAgICAgSW5saW5l
TGF5b3V0VW5pdCBib3R0b20geyAwIH07CisgICAgICAgIH07CisgICAgICAgIEhhc2hNYXA8Y29u
c3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gqLCBBYnNvbHV0ZVRvcEFuZEJvdHRvbT4gaW5saW5l
TGV2ZWxCb3hBYnNvbHV0ZVRvcEFuZEJvdHRvbU1hcDsKKworICAgICAgICBhdXRvIG1pbmltdW1M
b2dpY2FsVG9wID0gT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geyB9OworICAgICAgICBhdXRv
IG1heGltdW1Mb2dpY2FsQm90dG9tID0gT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geyB9Owor
ICAgICAgICBpZiAocXVpcmtzLmlubGluZUxldmVsQm94QWZmZWN0c0xpbmVCb3gocm9vdElubGlu
ZUJveCwgbGluZUJveCkpIHsKKyAgICAgICAgICAgIG1pbmltdW1Mb2dpY2FsVG9wID0gSW5saW5l
TGF5b3V0VW5pdCB7IH07CisgICAgICAgICAgICBtYXhpbXVtTG9naWNhbEJvdHRvbSA9IHJvb3RJ
bmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCk7CisgICAgICAgICAgICBpbmxpbmVMZXZl
bEJveEFic29sdXRlVG9wQW5kQm90dG9tTWFwLmFkZCgmcm9vdElubGluZUJveCwgQWJzb2x1dGVU
b3BBbmRCb3R0b20geyAqbWluaW11bUxvZ2ljYWxUb3AsICptYXhpbXVtTG9naWNhbEJvdHRvbSB9
KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9w
QW5kQm90dG9tTWFwLmFkZCgmcm9vdElubGluZUJveCwgQWJzb2x1dGVUb3BBbmRCb3R0b20geyB9
KTsKKworICAgICAgICBWZWN0b3I8TGluZUJveDo6SW5saW5lTGV2ZWxCb3gqPiBsaW5lQm94UmVs
YXRpdmVJbmxpbmVMZXZlbEJveGVzOworICAgICAgICBmb3IgKGF1dG8mIGlubGluZUxldmVsQm94
IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hlcygpKSB7CisgICAgICAgICAgICBhdXRv
JiBsYXlvdXRCb3ggPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKKyAgICAgICAgICAgIGlm
IChpbmxpbmVMZXZlbEJveC5oYXNMaW5lQm94UmVsYXRpdmVBbGlnbm1lbnQoKSkgeworICAgICAg
ICAgICAgICAgIGxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94ZXMuYXBwZW5kKCZpbmxpbmVM
ZXZlbEJveCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVCb3ggPSBsaW5lQm94LmlubGluZUxldmVsQm94Rm9y
TGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSk7CisgICAgICAgICAgICAvLyBMb2dpY2FsIHRv
cCBpcyByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGlubGluZSBib3gncyBsYXlvdXQgYm91bmRzLgor
ICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbG9naWNhbCB0b3AgaXMgbm90IHRoZSBmaW5h
bCBsb2dpY2FsIHRvcCBvZiB0aGUgaW5saW5lIGxldmVsIGJveC4KKyAgICAgICAgICAgIC8vIFRo
aXMgaXMgdGhlIGxvZ2ljYWwgdG9wIGluIHRoZSBjb250ZXh0IG9mIHRoZSBsYXlvdXQgYm91bmRz
IGdlb21ldHJ5IHdoaWNoIG1heSBiZSB2ZXJ5IGRpZmZlcmVudCBmcm9tIHRoZSBpbmxpbmUgYm94
J3Mgbm9ybWFsIGdlb21ldHJ5LgorICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wID0gSW5saW5l
TGF5b3V0VW5pdCB7IH07CisgICAgICAgICAgICBzd2l0Y2ggKGlubGluZUxldmVsQm94LnZlcnRp
Y2FsQWxpZ24oKSkgeworICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZTog
eworICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGlu
ZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKKyAgICAgICAgICAgICAg
ICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5kcygpLmFzY2VudCAtIGxv
Z2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Ok1pZGRsZTog
eworICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGlu
ZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpIC8gMiArIHBhcmVudElu
bGluZUJveC5zdHlsZSgpLmZvbnRNZXRyaWNzKCkueEhlaWdodCgpIC8gMjsKKyAgICAgICAgICAg
ICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5kcygpLmFzY2VudCAt
IGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJhc2Vs
aW5lTWlkZGxlOiB7CisgICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBh
cmVudEJhc2VsaW5lID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCkgLyAy
OworICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxpbmVCb3gubGF5b3V0Qm91
bmRzKCkuYXNjZW50IC0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVmVydGlj
YWxBbGlnbjo6TGVuZ3RoOiB7CisgICAgICAgICAgICAgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVM
ZXZlbEJveC5zdHlsZSgpOworICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZSA9IGZsb2F0VmFsdWVGb3JMZW5ndGgoc3R5bGUudmVydGljYWxBbGln
bkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKSkgKyBpbmxpbmVMZXZlbEJveC5s
YXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVu
dElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBh
cmVudEJhc2VsaW5lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpUZXh0VG9wOiB7CisgICAgICAgICAgICAgICAg
Ly8gTm90ZSB0aGF0IHRleHQtdG9wIGFsaWducyB3aXRoIHRoZSBpbmxpbmUgYm94J3MgZm9udCBt
ZXRyaWNzIHRvcCAoYXNjZW50KSBhbmQgbm90IHRoZSBsYXlvdXQgYm91bmRzIHRvcC4KKyAgICAg
ICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5kcygpLmFz
Y2VudCAtIHBhcmVudElubGluZUJveC5iYXNlbGluZSgpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpUZXh0Qm90
dG9tOiB7CisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRleHQtYm90dG9tIGFsaWducyB3
aXRoIHRoZSBpbmxpbmUgYm94J3MgZm9udCBtZXRyaWNzIGJvdHRvbSAoZGVzY2VudCkgYW5kIG5v
dCB0aGUgbGF5b3V0IGJvdW5kcyBib3R0b20uCisgICAgICAgICAgICAgICAgYXV0byBwYXJlbnRJ
bmxpbmVCb3hMYXlvdXRCb3VuZHMgPSBwYXJlbnRJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCk7Cisg
ICAgICAgICAgICAgICAgYXV0byBwYXJlbnRJbmxpbmVCb3hMb2dpY2FsQm90dG9tID0gcGFyZW50
SW5saW5lQm94TGF5b3V0Qm91bmRzLmhlaWdodCgpIC0gcGFyZW50SW5saW5lQm94TGF5b3V0Qm91
bmRzLmRlc2NlbnQgKyBwYXJlbnRJbmxpbmVCb3guZGVzY2VudCgpLnZhbHVlT3IoSW5saW5lTGF5
b3V0VW5pdCgpKTsKKyAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94
TG9naWNhbEJvdHRvbSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVs
dDoKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBwYXJlbnRJ
bmxpbmVCb3hBYnNvbHV0ZVRvcEFuZEJvdHRvbSA9IGlubGluZUxldmVsQm94QWJzb2x1dGVUb3BB
bmRCb3R0b21NYXAuZ2V0KCZwYXJlbnRJbmxpbmVCb3gpOworICAgICAgICAgICAgYXV0byBhYnNv
bHV0ZUxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxpbmVCb3hBYnNvbHV0ZVRvcEFuZEJvdHRvbS50b3Ag
KyBsb2dpY2FsVG9wOworICAgICAgICAgICAgYXV0byBhYnNvbHV0ZUxvZ2ljYWxCb3R0b20gPSBh
YnNvbHV0ZUxvZ2ljYWxUb3AgKyBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQo
KTsKKyAgICAgICAgICAgIGlubGluZUxldmVsQm94QWJzb2x1dGVUb3BBbmRCb3R0b21NYXAuYWRk
KCZpbmxpbmVMZXZlbEJveCwgQWJzb2x1dGVUb3BBbmRCb3R0b20geyBhYnNvbHV0ZUxvZ2ljYWxU
b3AsIGFic29sdXRlTG9naWNhbEJvdHRvbSB9KTsKKyAgICAgICAgICAgIC8vIFN0cmV0Y2ggdGhl
IG1pbi9tYXggYWJzb2x1dGUgdmFsdWVzIGlmIGFwcGxpY2FibGUuCisgICAgICAgICAgICBpZiAo
cXVpcmtzLmlubGluZUxldmVsQm94QWZmZWN0c0xpbmVCb3goaW5saW5lTGV2ZWxCb3gsIGxpbmVC
b3gpKSB7CisgICAgICAgICAgICAgICAgbWluaW11bUxvZ2ljYWxUb3AgPSBzdGQ6Om1pbihtaW5p
bXVtTG9naWNhbFRvcC52YWx1ZU9yKGFic29sdXRlTG9naWNhbFRvcCksIGFic29sdXRlTG9naWNh
bFRvcCk7CisgICAgICAgICAgICAgICAgbWF4aW11bUxvZ2ljYWxCb3R0b20gPSBzdGQ6Om1heCht
YXhpbXVtTG9naWNhbEJvdHRvbS52YWx1ZU9yKGFic29sdXRlTG9naWNhbEJvdHRvbSksIGFic29s
dXRlTG9naWNhbEJvdHRvbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8g
VGhlIGxpbmUgYm94IGhlaWdodCBjb21wdXRhdGlvbiBpcyBhcyBmb2xsb3dzOgorICAgICAgICAv
LyAxLiBTdHJldGNoIHRoZSBsaW5lIGJveCB3aXRoIHRoZSBub24tbGluZS1ib3ggcmVsYXRpdmUg
YWxpZ25lZCBpbmxpbmUgYm94IGFic29sdXRlIHRvcCBhbmQgYm90dG9tIHZhbHVlcy4KKyAgICAg
ICAgLy8gMi4gQ2hlY2sgaWYgdGhlIGxpbmUgYm94IHJlbGF0aXZlIGFsaWduZWQgaW5saW5lIGJv
eGVzICh0b3AsIGJvdHRvbSBldGMpIGhhdmUgZW5vdWdoIHJvb20gYW5kIHN0cmV0Y2ggdGhlIGxp
bmUgYm94IGZ1cnRoZXIgaWYgbmVlZGVkLgorICAgICAgICBhdXRvIGxpbmVCb3hMb2dpY2FsSGVp
Z2h0ID0gbWF4aW11bUxvZ2ljYWxCb3R0b20udmFsdWVPcihJbmxpbmVMYXlvdXRVbml0KCkpIC0g
bWluaW11bUxvZ2ljYWxUb3AudmFsdWVPcihJbmxpbmVMYXlvdXRVbml0KCkpOworICAgICAgICBm
b3IgKGF1dG8qIGxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94IDogbGluZUJveFJlbGF0aXZl
SW5saW5lTGV2ZWxCb3hlcykgeworICAgICAgICAgICAgaWYgKCFxdWlya3MuaW5saW5lTGV2ZWxC
b3hBZmZlY3RzTGluZUJveCgqbGluZUJveFJlbGF0aXZlSW5saW5lTGV2ZWxCb3gsIGxpbmVCb3gp
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGluZUJveExvZ2ljYWxI
ZWlnaHQgPSBzdGQ6Om1heChsaW5lQm94TG9naWNhbEhlaWdodCwgbGluZUJveFJlbGF0aXZlSW5s
aW5lTGV2ZWxCb3gtPmxheW91dEJvdW5kcygpLmhlaWdodCgpKTsKKyAgICAgICAgfQorICAgICAg
ICBsaW5lQm94LnNldExvZ2ljYWxIZWlnaHQobGluZUJveExvZ2ljYWxIZWlnaHQpOworICAgIH07
CisgICAgY29tcHV0ZUxpbmVCb3hMb2dpY2FsSGVpZ2h0KCk7CisKKyAgICBhdXRvIGNvbXB1dGVS
b290SW5saW5lQm94VmVydGljYWxQb3NpdGlvbiA9IFsmXSB7CisgICAgICAgIEhhc2hNYXA8Y29u
c3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gqLCBJbmxpbmVMYXlvdXRVbml0PiBpbmxpbmVMZXZl
bEJveEFic29sdXRlQmFzZWxpbmVPZmZzZXRNYXA7CisgICAgICAgIGlubGluZUxldmVsQm94QWJz
b2x1dGVCYXNlbGluZU9mZnNldE1hcC5hZGQoJnJvb3RJbmxpbmVCb3gsIElubGluZUxheW91dFVu
aXQgeyB9KTsKKworICAgICAgICBhdXRvIG1heGltdW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJv
eEJhc2VsaW5lID0gT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geyB9OworICAgICAgICBpZiAo
cXVpcmtzLmlubGluZUxldmVsQm94QWZmZWN0c0xpbmVCb3gocm9vdElubGluZUJveCwgbGluZUJv
eCkpCisgICAgICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGlu
ZSA9IHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OworCisgICAgICAgIGZvciAo
YXV0byYgaW5saW5lTGV2ZWxCb3ggOiBsaW5lQm94Lm5vblJvb3RJbmxpbmVMZXZlbEJveGVzKCkp
IHsKKyAgICAgICAgICAgIGF1dG8gYWJzb2x1dGVCYXNlbGluZU9mZnNldCA9IElubGluZUxheW91
dFVuaXQgeyB9OworICAgICAgICAgICAgaWYgKCFpbmxpbmVMZXZlbEJveC5oYXNMaW5lQm94UmVs
YXRpdmVBbGlnbm1lbnQoKSkgeworICAgICAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9IGlu
bGluZUxldmVsQm94LmxheW91dEJveCgpOworICAgICAgICAgICAgICAgIGF1dG8mIHBhcmVudElu
bGluZUJveCA9IGxpbmVCb3guaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3gobGF5b3V0Qm94LnBh
cmVudCgpKTsKKyAgICAgICAgICAgICAgICBhdXRvIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJh
c2VsaW5lID0gSW5saW5lTGF5b3V0VW5pdCB7IH07CisKKyAgICAgICAgICAgICAgICBzd2l0Y2gg
KGlubGluZUxldmVsQm94LnZlcnRpY2FsQWxpZ24oKSkgeworICAgICAgICAgICAgICAgIGNhc2Ug
VmVydGljYWxBbGlnbjo6QmFzZWxpbmU6CisgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zm
c2V0RnJvbVBhcmVudEJhc2VsaW5lID0geyB9OworICAgICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Ok1pZGRsZTogeworICAgICAgICAg
ICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSAoaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCkgLyAyICsgcGFyZW50SW5saW5lQm94
LnN0eWxlKCkuZm9udE1ldHJpY3MoKS54SGVpZ2h0KCkgLyAyKTsKKyAgICAgICAgICAgICAgICAg
ICAgYmFzZWxpbmVPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBsb2dpY2FsVG9wT2Zmc2V0RnJv
bVBhcmVudEJhc2VsaW5lIC0gaW5saW5lTGV2ZWxCb3guYmFzZWxpbmUoKTsKKyAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Ug
VmVydGljYWxBbGlnbjo6QmFzZWxpbmVNaWRkbGU6IHsKKyAgICAgICAgICAgICAgICAgICAgYXV0
byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gaW5saW5lTGV2ZWxCb3gubGF5
b3V0Qm91bmRzKCkuaGVpZ2h0KCkgLyAyOworICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9m
ZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxp
bmUgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOworICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWdu
OjpMZW5ndGg6IHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVMZXZl
bEJveC5zdHlsZSgpOworICAgICAgICAgICAgICAgICAgICBhdXRvIHZlcnRpY2FsQWxpZ25PZmZz
ZXQgPSBmbG9hdFZhbHVlRm9yTGVuZ3RoKHN0eWxlLnZlcnRpY2FsQWxpZ25MZW5ndGgoKSwgc3R5
bGUuY29tcHV0ZWRMaW5lSGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICBhdXRvIGxvZ2lj
YWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSB2ZXJ0aWNhbEFsaWduT2Zmc2V0ICsgaW5s
aW5lTGV2ZWxCb3guYmFzZWxpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmVPZmZz
ZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5l
IC0gaW5saW5lTGV2ZWxCb3guYmFzZWxpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6
VGV4dFRvcDoKKyAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmVPZmZzZXRGcm9tUGFyZW50QmFz
ZWxpbmUgPSBwYXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94LmxheW91
dEJvdW5kcygpLmFzY2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpUZXh0Qm90dG9tOgorICAgICAgICAgICAgICAgICAg
ICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGlubGluZUxldmVsQm94LmxheW91
dEJvdW5kcygpLmRlc2NlbnQgLSAqcGFyZW50SW5saW5lQm94LmRlc2NlbnQoKTsKKyAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAg
ICAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKKyAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFic29sdXRlQmFz
ZWxpbmVPZmZzZXQgPSBpbmxpbmVMZXZlbEJveEFic29sdXRlQmFzZWxpbmVPZmZzZXRNYXAuZ2V0
KCZwYXJlbnRJbmxpbmVCb3gpICsgYmFzZWxpbmVPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7Cisg
ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5saW5lTGV2ZWxC
b3gudmVydGljYWxBbGlnbigpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWdu
OjpUb3A6IHsKKyAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVCYXNlbGluZU9mZnNldCA9IHJv
b3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gaW5saW5lTGV2ZWxCb3gubGF5b3V0
Qm91bmRzKCkuYXNjZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCb3R0b206IHsKKyAg
ICAgICAgICAgICAgICAgICAgYWJzb2x1dGVCYXNlbGluZU9mZnNldCA9IGlubGluZUxldmVsQm94
LmxheW91dEJvdW5kcygpLmRlc2NlbnQgLSByb290SW5saW5lQm94LmxheW91dEJvdW5kcygpLmRl
c2NlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lN
UExFTUVOVEVEX1lFVCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRl
QmFzZWxpbmVPZmZzZXRNYXAuYWRkKCZpbmxpbmVMZXZlbEJveCwgYWJzb2x1dGVCYXNlbGluZU9m
ZnNldCk7CisgICAgICAgICAgICBhdXRvIGFmZmVjdHNSb290SW5saW5lQm94VmVydGljYWxQb3Np
dGlvbiA9IHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGlubGluZUxldmVsQm94
LCBsaW5lQm94KTsKKyAgICAgICAgICAgIGlmIChhZmZlY3RzUm9vdElubGluZUJveFZlcnRpY2Fs
UG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICBhdXRvIHRvcE9mZnNldEZyb21Sb290SW5saW5l
Qm94QmFzZWxpbmUgPSBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0ICsgaW5saW5lTGV2ZWxCb3gubGF5
b3V0Qm91bmRzKCkuYXNjZW50OworICAgICAgICAgICAgICAgIGlmIChtYXhpbXVtVG9wT2Zmc2V0
RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSkKKyAgICAgICAgICAgICAgICAgICAgbWF4aW11bVRv
cE9mZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxpbmUgPSBzdGQ6Om1heCgqbWF4aW11bVRvcE9m
ZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxpbmUsIHRvcE9mZnNldEZyb21Sb290SW5saW5lQm94
QmFzZWxpbmUpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAv
LyBXZSBhcmUgaXMgcXVpcmsgbW9kZSBhbmQgdGhlIHJvb3QgaW5saW5lIGJveCBoYXMgbm8gY29u
dGVudC4gVGhlIHJvb3QgaW5saW5lIGJveCdzIGJhc2VsaW5lIGlzIGFuY2hvcmVkIGF0IDAuCisg
ICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIgbmVnYXRpdmUgYXNjZW50IChlLmcgbmVnYXRp
dmUgdG9wIG1hcmdpbikgY2FuICJwdXNoIiB0aGUgcm9vdCBpbmxpbmUgYm94IHVwd2FyZHMgYW5k
IGhhdmUgYSBuZWdhdGl2ZSB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgbWF4aW11bVRvcE9m
ZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3Vu
ZHMoKS5hc2NlbnQgPj0gMAorICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGQ6Om1heCgwLjBm
LCB0b3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2VsaW5lKQorICAgICAgICAgICAgICAgICAg
ICAgICAgOiB0b3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2VsaW5lOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdXRvIHJvb3RJbmxpbmVC
b3hMb2dpY2FsVG9wID0gbWF4aW11bVRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxpbmUu
dmFsdWVPcigwLmYpIC0gcm9vdElubGluZUJveC5iYXNlbGluZSgpOworICAgICAgICByb290SW5s
aW5lQm94LnNldExvZ2ljYWxUb3Aocm9vdElubGluZUJveExvZ2ljYWxUb3ApOworICAgIH07Cisg
ICAgY29tcHV0ZVJvb3RJbmxpbmVCb3hWZXJ0aWNhbFBvc2l0aW9uKCk7CisKKyAgICBhdXRvIGFs
aWduSW5saW5lTGV2ZWxCb3hlcyA9IFsmXSB7CisgICAgICAgIGZvciAoYXV0byYgaW5saW5lTGV2
ZWxCb3ggOiBsaW5lQm94Lm5vblJvb3RJbmxpbmVMZXZlbEJveGVzKCkpIHsKKyAgICAgICAgICAg
IGF1dG8mIGxheW91dEJveCA9IGlubGluZUxldmVsQm94LmxheW91dEJveCgpOworICAgICAgICAg
ICAgYXV0byYgcGFyZW50SW5saW5lQm94ID0gbGluZUJveC5pbmxpbmVMZXZlbEJveEZvckxheW91
dEJveChsYXlvdXRCb3gucGFyZW50KCkpOworICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wID0g
SW5saW5lTGF5b3V0VW5pdCB7IH07CisgICAgICAgICAgICBzd2l0Y2ggKGlubGluZUxldmVsQm94
LnZlcnRpY2FsQWxpZ24oKSkgeworICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNl
bGluZToKKyAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmJhc2Vs
aW5lKCkgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6IHsKKyAgICAgICAgICAg
ICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSAoaW5saW5lTGV2
ZWxCb3gubG9naWNhbEhlaWdodCgpIC8gMiArIHBhcmVudElubGluZUJveC5zdHlsZSgpLmZvbnRN
ZXRyaWNzKCkueEhlaWdodCgpIC8gMik7CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBh
cmVudElubGluZUJveC5iYXNlbGluZSgpIC0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNl
bGluZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmVNaWRkbGU6IHsKKyAgICAgICAgICAgICAgICBh
dXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5s
b2dpY2FsSGVpZ2h0KCkgLyAyOworICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJlbnRJ
bmxpbmVCb3guYmFzZWxpbmUoKSAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNl
IFZlcnRpY2FsQWxpZ246Okxlbmd0aDogeworICAgICAgICAgICAgICAgIGF1dG8mIHN0eWxlID0g
aW5saW5lTGV2ZWxCb3guc3R5bGUoKTsKKyAgICAgICAgICAgICAgICBhdXRvIHZlcnRpY2FsQWxp
Z25PZmZzZXQgPSBmbG9hdFZhbHVlRm9yTGVuZ3RoKHN0eWxlLnZlcnRpY2FsQWxpZ25MZW5ndGgo
KSwgc3R5bGUuY29tcHV0ZWRMaW5lSGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIGF1dG8gbG9n
aWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHZlcnRpY2FsQWxpZ25PZmZzZXQgKyBp
bmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOworICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBw
YXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKSAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFz
ZWxpbmU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICAvLyBOb3RlIHRoYXQgKHRleHQpdG9wL2JvdHRvbSBhbGlnbiB0aGVpciBsYXlvdXQgYm91bmRz
LgorICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpUZXh0VG9wOgorICAgICAgICAgICAg
ICAgIGxvZ2ljYWxUb3AgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBp
bmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpUZXh0Qm90dG9tOgorICAgICAgICAgICAgICAgIGxv
Z2ljYWxUb3AgPSBwYXJlbnRJbmxpbmVCb3gubG9naWNhbEhlaWdodCgpIC0gaW5saW5lTGV2ZWxC
b3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRv
cDoKKyAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBsb2dpY2FsIHRvcCBpcyBub3Qg
cmVsYXRpdmUgdG8gdGhlIHBhcmVudCBpbmxpbmUgYm94LgorICAgICAgICAgICAgICAgIGxvZ2lj
YWxUb3AgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBpbmxpbmVMZXZl
bEJveC5iYXNlbGluZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2Fz
ZSBWZXJ0aWNhbEFsaWduOjpCb3R0b206CisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRo
aXMgbG9naWNhbCB0b3AgaXMgbm90IHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQgaW5saW5lIGJveC4K
KyAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gbGluZUJveC5sb2dpY2FsSGVpZ2h0KCkgLSBp
bmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5kZXNjZW50IC0gaW5saW5lTGV2ZWxCb3guYmFz
ZWxpbmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlubGluZUxldmVsQm94LnNl
dExvZ2ljYWxUb3AobG9naWNhbFRvcCk7CisgICAgICAgIH0KKyAgICB9OworICAgIGFsaWduSW5s
aW5lTGV2ZWxCb3hlcygpOworfQorCitMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmllZFZlcnRpY2Fs
QWxpZ25tZW50OjpTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQoY29uc3QgTGluZUJveDo6SW5s
aW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gpCisgICAgOiBtX3Jvb3RJbmxpbmVCb3gocm9vdElu
bGluZUJveCkKK3sKKyAgICBhZGp1c3Qocm9vdElubGluZUJveCk7Cit9CisKK2Jvb2wgTGluZUJv
eEJ1aWxkZXI6OlNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudDo6Y2FuVXNlU2ltcGxpZmllZEFs
aWdubWVudChjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgcm9vdElubGluZUJveCwgY29u
c3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94LCBPcHRpb25hbDxjb25z
dCBCb3hHZW9tZXRyeT4gaW5saW5lTGV2ZWxCb3hHZW9tZXRyeSkKK3sKKyAgICBpZiAoaW5saW5l
TGV2ZWxCb3guaXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKSB7CisgICAgICAgIEFTU0VSVChpbmxp
bmVMZXZlbEJveEdlb21ldHJ5KTsKKyAgICAgICAgLy8gQmFzZWxpbmUgYWxpZ25lZCwgbm9uLXN0
cmV0Y2h5IGRpcmVjdCBjaGlsZHJlbiBhcmUgY29uc2lkZXJlZCB0byBiZSBzaW1wbGUgZm9yIG5v
dy4KKyAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7
CisgICAgICAgIHJldHVybiAmbGF5b3V0Qm94LnBhcmVudCgpID09ICZyb290SW5saW5lQm94Lmxh
eW91dEJveCgpCisgICAgICAgICAgICAmJiBsYXlvdXRCb3guc3R5bGUoKS52ZXJ0aWNhbEFsaWdu
KCkgPT0gVmVydGljYWxBbGlnbjo6QmFzZWxpbmUKKyAgICAgICAgICAgICYmICFpbmxpbmVMZXZl
bEJveEdlb21ldHJ5LT5tYXJnaW5CZWZvcmUoKQorICAgICAgICAgICAgJiYgIWlubGluZUxldmVs
Qm94R2VvbWV0cnktPm1hcmdpbkFmdGVyKCkKKyAgICAgICAgICAgICYmIGlubGluZUxldmVsQm94
R2VvbWV0cnktPm1hcmdpbkJveEhlaWdodCgpIDw9IHJvb3RJbmxpbmVCb3guYmFzZWxpbmUoKTsK
KyAgICB9CisgICAgaWYgKGlubGluZUxldmVsQm94LmlzTGluZUJyZWFrQm94KCkpIHsKKyAgICAg
ICAgLy8gQmFzZWxpbmUgYWxpZ25lZCwgbm9uLXN0cmV0Y2h5IGxpbmUgYnJlYWtzIGUuZy4gPGRp
dj48c3Bhbj48YnI+PC9zcGFuPjwvZGl2PiBidXQgbm90IDxkaXY+PHNwYW4gc3R5bGU9ImZvbnQt
c2l6ZTogMTAwcHg7Ij48YnI+PC9zcGFuPjwvZGl2Pi4KKyAgICAgICAgcmV0dXJuIGlubGluZUxl
dmVsQm94LmxheW91dEJveCgpLnN0eWxlKCkudmVydGljYWxBbGlnbigpID09IFZlcnRpY2FsQWxp
Z246OkJhc2VsaW5lICYmIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCkgPD0gcm9vdElubGluZUJv
eC5iYXNlbGluZSgpOworICAgIH0KKyAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNJbmxpbmVCb3go
KSkgeworICAgICAgICAvLyBCYXNlbGluZSBhbGlnbmVkLCBub24tc3RyZXRjaHkgaW5saW5lIGJv
eGVzIGUuZy4gPGRpdj48c3Bhbj48L3NwYW4+PC9kaXY+IGJ1dCBub3QgPGRpdj48c3BhbiBzdHls
ZT0iZm9udC1zaXplOiAxMDBweDsiPjwvc3Bhbj48L2Rpdj4uCisgICAgICAgIHJldHVybiBpbmxp
bmVMZXZlbEJveC5sYXlvdXRCb3goKS5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKSA9PSBWZXJ0aWNh
bEFsaWduOjpCYXNlbGluZSAmJiBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKSA9PSByb290
SW5saW5lQm94LmxheW91dEJvdW5kcygpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3ZvaWQgTGluZUJveEJ1aWxkZXI6OlNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudDo6YWxpZ24o
TGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94KQoreworICAgIGlmIChpbmxp
bmVMZXZlbEJveC5pc0F0b21pY0lubGluZUxldmVsQm94KCkgfHwgaW5saW5lTGV2ZWxCb3guaXNM
aW5lQnJlYWtCb3goKSB8fCBpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpKSB7CisgICAgICAg
IC8vIE9ubHkgYmFzZWxpbmUgYWxpZ25tZW50IGZvciBub3cuCisgICAgICAgIGlubGluZUxldmVs
Qm94LnNldExvZ2ljYWxUb3AobV9yb290SW5saW5lQm94LmJhc2VsaW5lKCkgLSBpbmxpbmVMZXZl
bEJveC5iYXNlbGluZSgpKTsKKyAgICAgICAgYWRqdXN0KGlubGluZUxldmVsQm94KTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOworfQor
Cit2b2lkIExpbmVCb3hCdWlsZGVyOjpTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OmFkanVz
dChjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3gpCit7CisgICAg
YXV0byBsYXlvdXRCb3VuZHNMb2dpY2FsVG9wID0gbV9yb290SW5saW5lQm94LmxheW91dEJvdW5k
cygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKKyAgICBt
X2xpbmVCb3hMb2dpY2FsVG9wID0gc3RkOjptaW4obV9saW5lQm94TG9naWNhbFRvcCwgbGF5b3V0
Qm91bmRzTG9naWNhbFRvcCk7CisgICAgbV9saW5lQm94TG9naWNhbEJvdHRvbSA9IHN0ZDo6bWF4
KG1fbGluZUJveExvZ2ljYWxCb3R0b20sIGxheW91dEJvdW5kc0xvZ2ljYWxUb3AgKyBpbmxpbmVM
ZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSk7CisgICAgbV9yb290SW5saW5lQm94TG9n
aWNhbFRvcCA9IHN0ZDo6bWF4KG1fcm9vdElubGluZUJveExvZ2ljYWxUb3AsIGlubGluZUxldmVs
Qm94LmxheW91dEJvdW5kcygpLmFzY2VudCAtIG1fcm9vdElubGluZUJveC5iYXNlbGluZSgpKTsK
K30KKworTGluZUJveCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmxpbmVCb3hG
b3JMaW5lQ29udGVudChjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250ZW50
KQoreworICAgIHJldHVybiBMaW5lQm94QnVpbGRlcihmb3JtYXR0aW5nQ29udGV4dCgpKS5idWls
ZChsaW5lQ29udGVudCk7Cit9CisKK0lubGluZUxheW91dFVuaXQgSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5Ojpsb2dpY2FsVG9wRm9yTmV4dExpbmUoY29uc3QgTGluZUJ1aWxkZXI6
OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCwgSW5saW5lTGF5b3V0VW5pdCBwcmV2aW91c0xpbmVM
b2dpY2FsQm90dG9tLCBjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCkgY29u
c3QKK3sKKyAgICAvLyBOb3JtYWxseSB0aGUgbmV4dCBsaW5lJ3MgbG9naWNhbCB0b3AgaXMgdGhl
IHByZXZpb3VzIGxpbmUncyBsb2dpY2FsIGJvdHRvbSwgYnV0IHdoZW4gdGhlIGxpbmUgZW5kcwor
ICAgIC8vIHdpdGggdGhlIGNsZWFyIHByb3BlcnR5IHNldCwgdGhlIG5leHQgbGluZSBuZWVkcyB0
byBjbGVhciB0aGUgZXhpc3RpbmcgZmxvYXRzLgorICAgIGlmIChsaW5lQ29udGVudC5ydW5zLmlz
RW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b207CisgICAg
YXV0byYgbGFzdFJ1bkxheW91dEJveCA9IGxpbmVDb250ZW50LnJ1bnMubGFzdCgpLmxheW91dEJv
eCgpOyAKKyAgICBpZiAobGFzdFJ1bkxheW91dEJveC5zdHlsZSgpLmNsZWFyKCkgPT0gQ2xlYXI6
Ok5vbmUpCisgICAgICAgIHJldHVybiBwcmV2aW91c0xpbmVMb2dpY2FsQm90dG9tOworICAgIGF1
dG8gcG9zaXRpb25XaXRoQ2xlYXJhbmNlID0gZmxvYXRpbmdDb250ZXh0LnZlcnRpY2FsUG9zaXRp
b25XaXRoQ2xlYXJhbmNlKGxhc3RSdW5MYXlvdXRCb3gpOworICAgIGlmICghcG9zaXRpb25XaXRo
Q2xlYXJhbmNlKQorICAgICAgICByZXR1cm4gcHJldmlvdXNMaW5lTG9naWNhbEJvdHRvbTsKKyAg
ICByZXR1cm4gc3RkOjptYXgocHJldmlvdXNMaW5lTG9naWNhbEJvdHRvbSwgSW5saW5lTGF5b3V0
VW5pdChwb3NpdGlvbldpdGhDbGVhcmFuY2UtPnBvc2l0aW9uKSk7Cit9CisKK0NvbnRlbnRXaWR0
aEFuZE1hcmdpbiBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmlubGluZUJsb2Nr
Q29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBj
b25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3Qg
T3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQor
eworICAgIEFTU0VSVChmb3JtYXR0aW5nQ29udGV4dFJvb3QuaXNJbkZsb3coKSk7CisKKyAgICAv
LyAxMC4zLjEwICdJbmxpbmUtYmxvY2snLCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxv
dworCisgICAgLy8gRXhhY3RseSBhcyBpbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMuCisgICAgaWYg
KGZvcm1hdHRpbmdDb250ZXh0Um9vdC5pc1JlcGxhY2VkQm94KCkpCisgICAgICAgIHJldHVybiBp
bmxpbmVSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4o
Zm9ybWF0dGluZ0NvbnRleHRSb290KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IH0sIG92ZXJy
aWRkZW5Ib3Jpem9udGFsVmFsdWVzKTsKKworICAgIC8vIDEwLjMuOSAnSW5saW5lLWJsb2NrJywg
bm9uLXJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93CisKKyAgICAvLyBJZiAnd2lkdGgn
IGlzICdhdXRvJywgdGhlIHVzZWQgdmFsdWUgaXMgdGhlIHNocmluay10by1maXQgd2lkdGggYXMg
Zm9yIGZsb2F0aW5nIGVsZW1lbnRzLgorICAgIC8vIEEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8n
IGZvciAnbWFyZ2luLWxlZnQnIG9yICdtYXJnaW4tcmlnaHQnIGJlY29tZXMgYSB1c2VkIHZhbHVl
IG9mICcwJy4KKyAgICAvLyAjMQorICAgIGF1dG8gd2lkdGggPSBjb21wdXRlZFZhbHVlKGZvcm1h
dHRpbmdDb250ZXh0Um9vdC5zdHlsZSgpLmxvZ2ljYWxXaWR0aCgpLCBob3Jpem9udGFsQ29uc3Ry
YWludHMubG9naWNhbFdpZHRoKTsKKyAgICBpZiAoIXdpZHRoKQorICAgICAgICB3aWR0aCA9IHNo
cmlua1RvRml0V2lkdGgoZm9ybWF0dGluZ0NvbnRleHRSb290LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMubG9naWNhbFdpZHRoKTsKKworICAgIC8vICMyCisgICAgYXV0byBjb21wdXRlZEhvcml6b250
YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKGZvcm1hdHRpbmdD
b250ZXh0Um9vdCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKworICAgIHJldHVybiBDb250ZW50
V2lkdGhBbmRNYXJnaW4geyAqd2lkdGgsIHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0
LnZhbHVlT3IoMF9sdSksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwX2x1
KSB9IH07Cit9CisKK0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4gSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5OjppbmxpbmVCbG9ja0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94
JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0
cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNh
bFZhbHVlcykgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5GbG93KCkpOworCisg
ICAgLy8gMTAuNi4yIElubGluZSByZXBsYWNlZCBlbGVtZW50cywgYmxvY2stbGV2ZWwgcmVwbGFj
ZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3csICdpbmxpbmUtYmxvY2snIHJlcGxhY2VkIGVsZW1l
bnRzIGluIG5vcm1hbCBmbG93IGFuZCBmbG9hdGluZyByZXBsYWNlZCBlbGVtZW50cworICAgIGlm
IChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQorICAgICAgICByZXR1cm4gaW5saW5lUmVwbGFj
ZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gp
LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsK
KworICAgIC8vIDEwLjYuNiBDb21wbGljYXRlZCBjYXNlcworICAgIC8vIC0gJ0lubGluZS1ibG9j
aycsIG5vbi1yZXBsYWNlZCBlbGVtZW50cy4KKyAgICByZXR1cm4gY29tcGxpY2F0ZWRDYXNlcyhs
YXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVz
KTsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dFF1aXJrcy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjkxYmU2NWRhZDVjYzVmNTZiMjllYjA3MDNlNmNkYzk0MzkwYWMyYTcKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCkBAIC0wLDAgKzEs
MTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgor
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklubGlu
ZUZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09O
VEVYVCkKKworI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitJbmxpbmVMYXlvdXRVbml0IElubGluZUZvcm1h
dHRpbmdDb250ZXh0OjpRdWlya3M6OmluaXRpYWxMaW5lSGVpZ2h0KCkgY29uc3QKK3sKKyAgICAv
LyBOZWdhdGl2ZSBsaW5lSGVpZ2h0IHZhbHVlIG1lYW5zIHRoZSBsaW5lLWhlaWdodCBpcyBub3Qg
c2V0CisgICAgYXV0byYgcm9vdCA9IGZvcm1hdHRpbmdDb250ZXh0KCkucm9vdCgpOworICAgIGlm
IChsYXlvdXRTdGF0ZSgpLmluU3RhbmRhcmRzTW9kZSgpIHx8ICFyb290LnN0eWxlKCkubGluZUhl
aWdodCgpLmlzTmVnYXRpdmUoKSkKKyAgICAgICAgcmV0dXJuIHJvb3Quc3R5bGUoKS5jb21wdXRl
ZExpbmVIZWlnaHQoKTsKKyAgICByZXR1cm4gcm9vdC5zdHlsZSgpLmZvbnRNZXRyaWNzKCkuZmxv
YXRIZWlnaHQoKTsKK30KKworYm9vbCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpp
bmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94
JiBpbmxpbmVMZXZlbEJveCwgY29uc3QgTGluZUJveCYgbGluZUJveCkgY29uc3QKK3sKKyAgICBp
ZiAoaW5saW5lTGV2ZWxCb3guaXNMaW5lQnJlYWtCb3goKSkgeworICAgICAgICBpZiAobGF5b3V0
U3RhdGUoKS5pblN0YW5kYXJkc01vZGUoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICAvLyBJbiBxdWlya3MgbW9kZSBsaW5lYnJlYWsgYm94ZXMgKDxicj4pIHN0b3AgYWZmZWN0
aW5nIHRoZSBsaW5lIGJveCB3aGVuIChhc3N1bWUgPGJyPiBpcyBuZXN0ZWQgZS5nLiA8c3BhbiBz
dHlsZT0iZm9udC1zaXplOiAxMDBweCI+PGJyPjwvc3Bhbj4pCisgICAgICAgIC8vIDEuIHRoZSBy
b290IGlubGluZSBib3ggaGFzIGNvbnRlbnQgPGRpdj5jb250ZW50PGJyPi9kaXY+CisgICAgICAg
IC8vIDIuIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGF0b21pYyBpbmxpbmUgbGV2ZWwgYm94IG9uIHRo
ZSBsaW5lIGUuZyA8ZGl2PjxpbWc+PGJyPjwvZGl2PiBvciA8ZGl2PjxzcGFuPjxpbWc+PC9zcGFu
Pjxicj48L2Rpdj4KKyAgICAgICAgLy8gMy4gdGhlcmUncyBhdCBsZWFzdCBvbmUgaW5saW5lIGJv
eCB3aXRoIGNvbnRlbnQgZS5nLiA8ZGl2PjxzcGFuPmNvbnRlbnQ8L3NwYW4+PGJyPjwvZGl2Pgor
ICAgICAgICBpZiAobGluZUJveC5yb290SW5saW5lQm94KCkuaGFzQ29udGVudCgpKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobGluZUJveC5oYXNBdG9taWNJbmxpbmVM
ZXZlbEJveCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyBBdCB0aGlz
IHBvaW50IHdlIGVpdGhlciBoYXZlIG9ubHkgdGhlIDxicj4gb24gdGhlIGxpbmUgb3IgaW5saW5l
IGJveGVzIHdpdGggb3Igd2l0aG91dCBjb250ZW50LgorICAgICAgICBhdXRvJiBpbmxpbmVMZXZl
bEJveGVzID0gbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hlcygpOworICAgICAgICBBU1NF
UlQoIWlubGluZUxldmVsQm94ZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgaWYgKGlubGluZUxldmVs
Qm94ZXMuc2l6ZSgpID09IDEpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZm9y
IChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMo
KSkgeworICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBlbXB0eSBpbmxpbmUgYm94ZXMgZS5nLiA8
ZGl2PjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PGJyPjwvZGl2PgorICAgICAgICAgICAgaWYg
KGlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkgJiYgaW5saW5lTGV2ZWxCb3guaGFzQ29udGVu
dCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkp
IHsKKyAgICAgICAgLy8gSW5saW5lIGJveGVzIChlLmcuIHJvb3QgaW5saW5lIGJveCBvciA8c3Bh
bj4pIGFmZmVjdHMgbGluZSBib3hlcyBlaXRoZXIgdGhyb3VnaCB0aGUgc3RydXQgb3IgYWN0dWFs
IGNvbnRlbnQuCisgICAgICAgIGF1dG8gaW5saW5lQm94SGFzSW1hZ2luYXJ5U3RydXQgPSBsYXlv
dXRTdGF0ZSgpLmluU3RhbmRhcmRzTW9kZSgpOworICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3gu
aGFzQ29udGVudCgpIHx8IGlubGluZUJveEhhc0ltYWdpbmFyeVN0cnV0KQorICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc1Jvb3RJbmxpbmVCb3go
KSkgeworICAgICAgICAgICAgYXV0byBzaG91bGRSb290SW5saW5lQm94V2l0aE5vQ29udGVudFN0
cmV0Y2hMaW5lQm94ID0gWyZdIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3gu
bGF5b3V0Qm94KCkuc3R5bGUoKS5saW5lSGVpZ2h0KCkuaXNOZWdhdGl2ZSgpKQorICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgLy8gVGhlIHJvb3QgaW5s
aW5lIGJveCB3aXRoIG5vbi1pbml0aWFsIGxpbmUgaGVpZ2h0IHZhbHVlIHN0cmV0Y2hlcyB0aGUg
bGluZSBib3ggZXZlbiB3aGVuIHJvb3QgaGFzIG5vIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAv
LyBidXQgdGhlcmUncyBhdCBsZWFzdCBvbmUgaW5saW5lIGJveCB3aXRoIGNvbnRlbnQuCisgICAg
ICAgICAgICAgICAgLy8gZS5nLiA8ZGl2IHN0eWxlPSJsaW5lLWhlaWdodDogMTAwcHg7Ij48c3Bh
bj5jb250ZW50PC9zcGFuPjwvZGl2PgorICAgICAgICAgICAgICAgIGlmICghbGluZUJveC5oYXNJ
bmxpbmVCb3goKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgICAgIGZvciAoYXV0byYgaW5saW5lTGV2ZWxCb3ggOiBsaW5lQm94Lm5vblJvb3RJbmxpbmVM
ZXZlbEJveGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmxpbmVMZXZlbEJveC5p
c0lubGluZUJveCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICAgICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5oYXNDb250ZW50KCkpCisgICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHJldHVybiBz
aG91bGRSb290SW5saW5lQm94V2l0aE5vQ29udGVudFN0cmV0Y2hMaW5lQm94KCk7CisgICAgICAg
IH0KKyAgICAgICAgLy8gTm9uLXJvb3QgaW5saW5lIGJveGVzIChlLmcuIDxzcGFuPikuCisgICAg
ICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJv
eChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKSk7CisgICAgICAgIGlmIChib3hHZW9tZXRyeS5o
b3Jpem9udGFsQm9yZGVyKCkgfHwgYm94R2VvbWV0cnkuaG9yaXpvbnRhbFBhZGRpbmcoKS52YWx1
ZU9yKDBfbHUpKSB7CisgICAgICAgICAgICAvLyBIb3Jpem9udGFsIGJvcmRlciBhbmQgcGFkZGlu
ZyBtYWtlIHRoZSBpbmxpbmUgYm94IHN0cmV0Y2ggdGhlIGxpbmUgKGUuZy4gPHNwYW4gc3R5bGU9
InBhZGRpbmc6IDEwcHg7Ij48L3NwYW4+KS4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlubGluZUxldmVs
Qm94LmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSkgeworICAgICAgICBpZiAoaW5saW5lTGV2ZWxC
b3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgLy8gV2hpbGUgaW4gcHJhY3RpY2Ugd2hlbiB0aGUgbmVnYXRpdmUgdmVydGljYWwgbWFy
Z2luIG1ha2VzIHRoZSBsYXlvdXQgYm91bmRzIGVtcHR5IChlLmc6IGhlaWdodDogMTAwcHg7IG1h
cmdpbi10b3A6IC0xMDBweDspLCBhbmQgdGhpcyBpbmxpbmUKKyAgICAgICAgLy8gbGV2ZWwgYm94
IGNvbnRyaWJ1dGVzIDBweCB0byB0aGUgbGluZSBib3ggaGVpZ2h0LCBpdCBzdGlsbCBuZWVkcyB0
byBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hpbGUgY29tcHV0aW5nIGxpbmUgYm94IGdlb21ldHJp
ZXMuCisgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9t
ZXRyeUZvckJveChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKSk7CisgICAgICAgIHJldHVybiBi
b3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUoKSB8fCBib3hHZW9tZXRyeS5tYXJnaW5BZnRlcigpOwor
ICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQ6OlF1aXJrczo6aGFzU29mdFdyYXBPcHBvcnR1bml0eUF0SW1hZ2UoKSBjb25zdAoreworICAg
IHJldHVybiAhZm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCkuaXNUYWJsZUNlbGwoKTsKK30KKwor
fQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuY3BwIGIv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5n
L0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODdiNmM5NWMxNTQ1ZDY0NWNk
YmQ0YjA1NDZhZWMxODZjZjNjY2Y1ZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0
aW5nU3RhdGUuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
CisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
KyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCisKKyNpZiBFTkFCTEUo
TEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxp
bmVzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZf
TUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoSW5saW5lRm9ybWF0dGluZ1N0YXRlKTsKKworSW5saW5l
Rm9ybWF0dGluZ1N0YXRlOjpJbmxpbmVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+
JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQorICAgIDogRm9ybWF0
dGluZ1N0YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OklubGluZSwgbGF5b3V0U3Rh
dGUpCit7Cit9CisKK0lubGluZUZvcm1hdHRpbmdTdGF0ZTo6fklubGluZUZvcm1hdHRpbmdTdGF0
ZSgpCit7Cit9CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdT
dGF0ZS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVm
b3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjM2M2IxNjAzNjg0
ZTU5NDAwN2EwODI3YmM5NGNiOTdiNGJhMDE3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5l
Rm9ybWF0dGluZ1N0YXRlLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21h
IG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVk
ZSAiRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiSW5saW5lSXRlbS5oIgorI2luY2x1ZGUg
IklubGluZUxpbmVCb3guaCIKKyNpbmNsdWRlICJJbmxpbmVMaW5lR2VvbWV0cnkuaCIKKyNpbmNs
dWRlICJJbmxpbmVMaW5lUnVuLmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKwordXNpbmcgSW5saW5lSXRlbXMg
PSBWZWN0b3I8SW5saW5lSXRlbT47Cit1c2luZyBJbmxpbmVMaW5lcyA9IFZlY3RvcjxJbmxpbmVM
aW5lR2VvbWV0cnk+OwordXNpbmcgSW5saW5lTGluZUJveGVzID0gVmVjdG9yPExpbmVCb3g+Owor
dXNpbmcgSW5saW5lTGluZVJ1bnMgPSBWZWN0b3I8TGluZVJ1bj47CisKKy8vIElubGluZUZvcm1h
dHRpbmdTdGF0ZSBob2xkcyB0aGUgc3RhdGUgZm9yIGEgcGFydGljdWxhciBpbmxpbmUgZm9ybWF0
dGluZyBjb250ZXh0IHRyZWUuCitjbGFzcyBJbmxpbmVGb3JtYXR0aW5nU3RhdGUgOiBwdWJsaWMg
Rm9ybWF0dGluZ1N0YXRlIHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKElubGluZUZvcm1h
dHRpbmdTdGF0ZSk7CitwdWJsaWM6CisgICAgSW5saW5lRm9ybWF0dGluZ1N0YXRlKFJlZjxGbG9h
dGluZ1N0YXRlPiYmLCBMYXlvdXRTdGF0ZSYpOworICAgIH5JbmxpbmVGb3JtYXR0aW5nU3RhdGUo
KTsKKworICAgIElubGluZUl0ZW1zJiBpbmxpbmVJdGVtcygpIHsgcmV0dXJuIG1faW5saW5lSXRl
bXM7IH0KKyAgICBjb25zdCBJbmxpbmVJdGVtcyYgaW5saW5lSXRlbXMoKSBjb25zdCB7IHJldHVy
biBtX2lubGluZUl0ZW1zOyB9CisgICAgdm9pZCBhZGRJbmxpbmVJdGVtKElubGluZUl0ZW0mJiBp
bmxpbmVJdGVtKSB7IG1faW5saW5lSXRlbXMuYXBwZW5kKFdURk1vdmUoaW5saW5lSXRlbSkpOyB9
CisKKyAgICBjb25zdCBJbmxpbmVMaW5lcyYgbGluZXMoKSBjb25zdCB7IHJldHVybiBtX2xpbmVz
OyB9CisgICAgSW5saW5lTGluZXMmIGxpbmVzKCkgeyByZXR1cm4gbV9saW5lczsgfQorICAgIHZv
aWQgYWRkTGluZShjb25zdCBJbmxpbmVMaW5lR2VvbWV0cnkmIGxpbmUpIHsgbV9saW5lcy5hcHBl
bmQobGluZSk7IH0KKworICAgIGNvbnN0IElubGluZUxpbmVCb3hlcyYgbGluZUJveGVzKCkgY29u
c3QgeyByZXR1cm4gbV9saW5lQm94ZXM7IH0KKyAgICB2b2lkIGFkZExpbmVCb3goTGluZUJveCYm
IGxpbmVCb3gpIHsgbV9saW5lQm94ZXMuYXBwZW5kKFdURk1vdmUobGluZUJveCkpOyB9CisKKyAg
ICBjb25zdCBJbmxpbmVMaW5lUnVucyYgbGluZVJ1bnMoKSBjb25zdCB7IHJldHVybiBtX2xpbmVS
dW5zOyB9CisgICAgSW5saW5lTGluZVJ1bnMmIGxpbmVSdW5zKCkgeyByZXR1cm4gbV9saW5lUnVu
czsgfQorICAgIHZvaWQgYWRkTGluZVJ1bihMaW5lUnVuJiYgcnVuKSB7IG1fbGluZVJ1bnMuYXBw
ZW5kKFdURk1vdmUocnVuKSk7IH0KKworICAgIHZvaWQgc2V0Q2xlYXJHYXBBZnRlckxhc3RMaW5l
KElubGluZUxheW91dFVuaXQgdmVydGljYWxHYXApOworICAgIElubGluZUxheW91dFVuaXQgY2xl
YXJHYXBBZnRlckxhc3RMaW5lKCkgY29uc3QgeyByZXR1cm4gbV9jbGVhckdhcEFmdGVyTGFzdExp
bmU7IH0KKworICAgIHZvaWQgY2xlYXJMaW5lQW5kUnVucygpOworICAgIHZvaWQgc2hyaW5rVG9G
aXQoKTsKKworcHJpdmF0ZToKKyAgICAvLyBDYWNoZWFibGUgaW5wdXQgdG8gbGluZSBsYXlvdXQu
CisgICAgSW5saW5lSXRlbXMgbV9pbmxpbmVJdGVtczsKKyAgICBJbmxpbmVMaW5lcyBtX2xpbmVz
OworICAgIElubGluZUxpbmVCb3hlcyBtX2xpbmVCb3hlczsKKyAgICBJbmxpbmVMaW5lUnVucyBt
X2xpbmVSdW5zOworICAgIElubGluZUxheW91dFVuaXQgbV9jbGVhckdhcEFmdGVyTGFzdExpbmUg
eyAwIH07Cit9OworCitpbmxpbmUgdm9pZCBJbmxpbmVGb3JtYXR0aW5nU3RhdGU6OnNldENsZWFy
R2FwQWZ0ZXJMYXN0TGluZShJbmxpbmVMYXlvdXRVbml0IHZlcnRpY2FsR2FwKQoreworICAgIEFT
U0VSVCh2ZXJ0aWNhbEdhcCA+PSAwKTsKKyAgICBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZSA9IHZl
cnRpY2FsR2FwOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVGb3JtYXR0aW5nU3RhdGU6OmNsZWFy
TGluZUFuZFJ1bnMoKQoreworICAgIG1fbGluZXMuY2xlYXIoKTsKKyAgICBtX2xpbmVCb3hlcy5j
bGVhcigpOworICAgIG1fbGluZVJ1bnMuY2xlYXIoKTsKKyAgICBtX2NsZWFyR2FwQWZ0ZXJMYXN0
TGluZSA9IHsgfTsKK30KKworaW5saW5lIHZvaWQgSW5saW5lRm9ybWF0dGluZ1N0YXRlOjpzaHJp
bmtUb0ZpdCgpCit7CisgICAgbV9pbmxpbmVJdGVtcy5zaHJpbmtUb0ZpdCgpOworICAgIG1fbGlu
ZXMuc2hyaW5rVG9GaXQoKTsKKyAgICBtX2xpbmVCb3hlcy5zaHJpbmtUb0ZpdCgpOworICAgIG1f
bGluZVJ1bnMuc2hyaW5rVG9GaXQoKTsKK30KKworfQorfQorCitTUEVDSUFMSVpFX1RZUEVfVFJB
SVRTX0xBWU9VVF9GT1JNQVRUSU5HX1NUQVRFKElubGluZUZvcm1hdHRpbmdTdGF0ZSwgaXNJbmxp
bmVGb3JtYXR0aW5nU3RhdGUoKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lSXRlbS5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1h
dHRpbmcvSW5saW5lSXRlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDYwNmYxODQ5YjVhOWE2MTg0OWEyMGVi
ZDQxOTY1YTZhZGQ4ZWM4NgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmNwcApAQCAt
MCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IklubGluZUl0ZW0uaCIKKworI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgiCisKKyNpZiBFTkFC
TEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFt
ZXNwYWNlIExheW91dCB7CisKK3N0cnVjdCBTYW1lU2l6ZUFzSW5saW5lSXRlbSB7CisgICAgdm9p
ZCogbGF5b3V0Qm94OworICAgIHVpbnQ4X3QgZW51bTE7CisgICAgdWludDhfdCBlbnVtMjsKKyAg
ICBib29sIHdpZHRoQm9vbDsKKyAgICBib29sIHNvZnRIeXBoZW5Cb29sOworICAgIGJvb2wgaXNX
b3JkU2VwYXJhdG9yOworICAgIElubGluZUxheW91dFVuaXQgd2lkdGg7CisgICAgdW5zaWduZWQg
c3RhcnQ7CisgICAgdW5zaWduZWQgbGVuZ3RoOworfTsKKworc3RhdGljX2Fzc2VydChzaXplb2Yo
SW5saW5lSXRlbSkgPT0gc2l6ZW9mKFNhbWVTaXplQXNJbmxpbmVJdGVtKSwgIiIpOworCit9Cit9
CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lSXRlbS5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLmMyYWUyNGE2MTI2ODQ1ODg3NGM3MjA5OTQzODJiYWI4MjkxZGRjNGQKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lSXRlbS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
cHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisj
aW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIElubGluZUl0ZW0gewor
cHVibGljOgorICAgIGVudW0gY2xhc3MgVHlwZSA6IHVpbnQ4X3QgeyBUZXh0LCBIYXJkTGluZUJy
ZWFrLCBTb2Z0TGluZUJyZWFrLCBXb3JkQnJlYWtPcHBvcnR1bml0eSwgQm94LCBGbG9hdCwgSW5s
aW5lQm94U3RhcnQsIElubGluZUJveEVuZCB9OworICAgIElubGluZUl0ZW0oY29uc3QgQm94JiBs
YXlvdXRCb3gsIFR5cGUpOworCisgICAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBl
OyB9CisgICAgY29uc3QgQm94JiBsYXlvdXRCb3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRC
b3g7IH0KKyAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUoKSBjb25zdCB7IHJldHVybiBsYXlv
dXRCb3goKS5zdHlsZSgpOyB9CisKKyAgICBib29sIGlzVGV4dCgpIGNvbnN0IHsgcmV0dXJuIHR5
cGUoKSA9PSBUeXBlOjpUZXh0OyB9CisgICAgYm9vbCBpc0JveCgpIGNvbnN0IHsgcmV0dXJuIHR5
cGUoKSA9PSBUeXBlOjpCb3g7IH0KKyAgICBib29sIGlzRmxvYXQoKSBjb25zdCB7IHJldHVybiB0
eXBlKCkgPT0gVHlwZTo6RmxvYXQ7IH0KKyAgICBib29sIGlzTGluZUJyZWFrKCkgY29uc3QgeyBy
ZXR1cm4gaXNTb2Z0TGluZUJyZWFrKCkgfHwgaXNIYXJkTGluZUJyZWFrKCk7IH0KKyAgICBib29s
IGlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0gVHlwZTo6
V29yZEJyZWFrT3Bwb3J0dW5pdHk7IH0KKyAgICBib29sIGlzU29mdExpbmVCcmVhaygpIGNvbnN0
IHsgcmV0dXJuIHR5cGUoKSA9PSBUeXBlOjpTb2Z0TGluZUJyZWFrOyB9CisgICAgYm9vbCBpc0hh
cmRMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0gVHlwZTo6SGFyZExpbmVCcmVh
azsgfQorICAgIGJvb2wgaXNJbmxpbmVCb3hTdGFydCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9
PSBUeXBlOjpJbmxpbmVCb3hTdGFydDsgfQorICAgIGJvb2wgaXNJbmxpbmVCb3hFbmQoKSBjb25z
dCB7IHJldHVybiB0eXBlKCkgPT0gVHlwZTo6SW5saW5lQm94RW5kOyB9CisKK3ByaXZhdGU6Cisg
ICAgY29uc3QgQm94KiBtX2xheW91dEJveCB7IG51bGxwdHIgfTsKKyAgICBUeXBlIG1fdHlwZSB7
IH07CisKK3Byb3RlY3RlZDoKKyAgICAvLyBGb3IgSW5saW5lVGV4dEl0ZW0KKyAgICBlbnVtIGNs
YXNzIFRleHRJdGVtVHlwZSAgOiB1aW50OF90IHsgVW5kZWZpbmVkLCBXaGl0ZXNwYWNlLCBOb25X
aGl0ZXNwYWNlIH07CisgICAgVGV4dEl0ZW1UeXBlIG1fdGV4dEl0ZW1UeXBlIHsgVGV4dEl0ZW1U
eXBlOjpVbmRlZmluZWQgfTsKKyAgICBib29sIG1faGFzV2lkdGggeyBmYWxzZSB9OworICAgIGJv
b2wgbV9oYXNUcmFpbGluZ1NvZnRIeXBoZW4geyBmYWxzZSB9OworICAgIGJvb2wgbV9pc1dvcmRT
ZXBhcmF0b3IgeyBmYWxzZSB9OworICAgIElubGluZUxheW91dFVuaXQgbV93aWR0aCB7IH07Cisg
ICAgdW5zaWduZWQgbV9sZW5ndGggeyAwIH07CisKKyAgICAvLyBGb3IgSW5saW5lVGV4dEl0ZW0g
YW5kIElubGluZVNvZnRMaW5lQnJlYWtJdGVtCisgICAgdW5zaWduZWQgbV9zdGFydE9yUG9zaXRp
b24geyAwIH07Cit9OworCitpbmxpbmUgSW5saW5lSXRlbTo6SW5saW5lSXRlbShjb25zdCBCb3gm
IGxheW91dEJveCwgVHlwZSB0eXBlKQorICAgIDogbV9sYXlvdXRCb3goJmxheW91dEJveCkKKyAg
ICAsIG1fdHlwZSh0eXBlKQoreworfQorCisjZGVmaW5lIFNQRUNJQUxJWkVfVFlQRV9UUkFJVFNf
SU5MSU5FX0lURU0oVG9WYWx1ZVR5cGVOYW1lLCBwcmVkaWNhdGUpIFwKK1NQRUNJQUxJWkVfVFlQ
RV9UUkFJVFNfQkVHSU4oV2ViQ29yZTo6TGF5b3V0OjpUb1ZhbHVlVHlwZU5hbWUpIFwKKyAgICBz
dGF0aWMgYm9vbCBpc1R5cGUoY29uc3QgV2ViQ29yZTo6TGF5b3V0OjpJbmxpbmVJdGVtJiBpbmxp
bmVJdGVtKSB7IHJldHVybiBpbmxpbmVJdGVtLnByZWRpY2F0ZTsgfSBcCitTUEVDSUFMSVpFX1RZ
UEVfVFJBSVRTX0VORCgpCisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUu
Y3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUxpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjViMzM1YmM0MGVlZmM5YzI4MzNkNGQx
MzdiNGE1ODQ3ODcwNzUyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAKQEAg
LTAsMCArMSw1MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiSW5saW5lTGluZS5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQp
CisKKyNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdD
b250ZXh0LmgiCisjaW5jbHVkZSAiSW5saW5lU29mdExpbmVCcmVha0l0ZW0uaCIKKyNpbmNsdWRl
ICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIlJ1bnRpbWVFbmFibGVkRmVhdHVyZXMu
aCIKKyNpbmNsdWRlICJUZXh0RmxhZ3MuaCIKKyNpbmNsdWRlICJUZXh0VXRpbC5oIgorI2luY2x1
ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVz
cGFjZSBMYXlvdXQgeworCitMaW5lOjpMaW5lKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0
JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICA6IG1faW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQoaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCisgICAgLCBtX3RyaW1tYWJsZVRyYWlsaW5nQ29u
dGVudChtX3J1bnMpCit7Cit9CisKK0xpbmU6On5MaW5lKCkKK3sKK30KKwordm9pZCBMaW5lOjpp
bml0aWFsaXplKCkKK3sKKyAgICBtX25vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCA9IDA7
CisgICAgbV9jb250ZW50TG9naWNhbFdpZHRoID0geyB9OworICAgIG1fcnVucy5jbGVhcigpOwor
ICAgIG1fdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPSB7IH07CisgICAgbV90cmltbWFibGVUcmFp
bGluZ0NvbnRlbnQucmVzZXQoKTsKK30KKwordm9pZCBMaW5lOjpyZW1vdmVDb2xsYXBzaWJsZUNv
bnRlbnQoSW5saW5lTGF5b3V0VW5pdCBleHRyYUhvcml6b250YWxTcGFjZSkKK3sKKyAgICByZW1v
dmVUcmFpbGluZ1RyaW1tYWJsZUNvbnRlbnQoKTsKKyAgICB2aXN1YWxseUNvbGxhcHNlUHJlV3Jh
cE92ZXJmbG93Q29udGVudChleHRyYUhvcml6b250YWxTcGFjZSk7Cit9CisKK3ZvaWQgTGluZTo6
YXBwbHlSdW5FeHBhbnNpb24oSW5saW5lTGF5b3V0VW5pdCBleHRyYUhvcml6b250YWxTcGFjZSkK
K3sKKyAgICBBU1NFUlQoZm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCkuc3R5bGUoKS50ZXh0QWxp
Z24oKSA9PSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5KTsKKyAgICAvLyBUZXh0IGlzIGp1c3RpZmll
ZCBhY2NvcmRpbmcgdG8gdGhlIG1ldGhvZCBzcGVjaWZpZWQgYnkgdGhlIHRleHQtanVzdGlmeSBw
cm9wZXJ0eSwKKyAgICAvLyBpbiBvcmRlciB0byBleGFjdGx5IGZpbGwgdGhlIGxpbmUgYm94LiBV
bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBieSB0ZXh0LWFsaWduLWxhc3QsCisgICAgLy8gdGhl
IGxhc3QgbGluZSBiZWZvcmUgYSBmb3JjZWQgYnJlYWsgb3IgdGhlIGVuZCBvZiB0aGUgYmxvY2sg
aXMgc3RhcnQtYWxpZ25lZC4KKyAgICBpZiAobV9ydW5zLmlzRW1wdHkoKSB8fCBtX3J1bnMubGFz
dCgpLmlzTGluZUJyZWFrKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGF1dG8gZXhwYW5zaW9u
T3Bwb3J0dW5pdHlDb3VudCA9IDA7CisgICAgUnVuKiBsYXN0UnVuV2l0aENvbnRlbnQgPSBudWxs
cHRyOworICAgIC8vIENvbGxlY3QgYW5kIGRpc3RyaWJ1dGUgdGhlIGV4cGFuc2lvbiBvcHBvcnR1
bml0aWVzLgorICAgIGZvciAoYXV0byYgcnVuIDogbV9ydW5zKSB7CisgICAgICAgIGV4cGFuc2lv
bk9wcG9ydHVuaXR5Q291bnQgKz0gcnVuLmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQoKTsKKyAg
ICAgICAgaWYgKHJ1bi5pc1RleHQoKSB8fCBydW4uaXNCb3goKSkKKyAgICAgICAgICAgIGxhc3RS
dW5XaXRoQ29udGVudCA9ICZydW47CisgICAgfQorICAgIC8vIE5lZWQgdG8gZml4IHVwIHRoZSBs
YXN0IHJ1bidzIHRyYWlsaW5nIGV4cGFuc2lvbi4KKyAgICBpZiAobGFzdFJ1bldpdGhDb250ZW50
ICYmIGxhc3RSdW5XaXRoQ29udGVudC0+aGFzRXhwYW5zaW9uT3Bwb3J0dW5pdHkoKSkgeworICAg
ICAgICAvLyBUdXJuIG9mZiB0aGUgdHJhaWxpbmcgYml0cyBmaXJzdCBhbmQgYWRkIHRoZSBmb3Ji
aWQgdHJhaWxpbmcgZXhwYW5zaW9uLgorICAgICAgICBhdXRvIGxlYWRpbmdFeHBhbnNpb24gPSBs
YXN0UnVuV2l0aENvbnRlbnQtPmV4cGFuc2lvbkJlaGF2aW9yKCkgJiBMZWZ0RXhwYW5zaW9uTWFz
azsKKyAgICAgICAgbGFzdFJ1bldpdGhDb250ZW50LT5zZXRFeHBhbnNpb25CZWhhdmlvcihsZWFk
aW5nRXhwYW5zaW9uIHwgRm9yYmlkUmlnaHRFeHBhbnNpb24pOworICAgIH0KKyAgICAvLyBBbnl0
aGluZyB0byBkaXN0cmlidXRlPworICAgIGlmICghZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCB8
fCAhZXh0cmFIb3Jpem9udGFsU3BhY2UpCisgICAgICAgIHJldHVybjsKKyAgICAvLyBEaXN0cmli
dXRlIHRoZSBleHRyYSBzcGFjZS4KKyAgICBhdXRvIGV4cGFuc2lvblRvRGlzdHJpYnV0ZSA9IGV4
dHJhSG9yaXpvbnRhbFNwYWNlIC8gZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudDsKKyAgICBhdXRv
IGFjY3VtdWxhdGVkRXhwYW5zaW9uID0gSW5saW5lTGF5b3V0VW5pdCB7IH07CisgICAgZm9yIChh
dXRvJiBydW4gOiBtX3J1bnMpIHsKKyAgICAgICAgLy8gRXhwYW5kIGFuZCBtb3ZlIHJ1bnMgYnkg
dGhlIGFjY3VtdWxhdGVkIGV4cGFuc2lvbi4KKyAgICAgICAgcnVuLm1vdmVIb3Jpem9udGFsbHko
YWNjdW11bGF0ZWRFeHBhbnNpb24pOworICAgICAgICBpZiAoIXJ1bi5oYXNFeHBhbnNpb25PcHBv
cnR1bml0eSgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIEFTU0VSVChydW4uZXhw
YW5zaW9uT3Bwb3J0dW5pdHlDb3VudCgpKTsKKyAgICAgICAgYXV0byBjb21wdXRlZEV4cGFuc2lv
biA9IGV4cGFuc2lvblRvRGlzdHJpYnV0ZSAqIHJ1bi5leHBhbnNpb25PcHBvcnR1bml0eUNvdW50
KCk7CisgICAgICAgIC8vIEZJWE1FOiBDaGVjayB3aHkgd2UgbmVlZCB0byBzZXQgYm90aC4KKyAg
ICAgICAgcnVuLnNldEhvcml6b250YWxFeHBhbnNpb24oY29tcHV0ZWRFeHBhbnNpb24pOworICAg
ICAgICBydW4uc2hyaW5rSG9yaXpvbnRhbGx5KC1jb21wdXRlZEV4cGFuc2lvbik7CisgICAgICAg
IGFjY3VtdWxhdGVkRXhwYW5zaW9uICs9IGNvbXB1dGVkRXhwYW5zaW9uOworICAgIH0KKyAgICAv
LyBDb250ZW50IGdyb3dzIGFzIHJ1bnMgZXhwYW5kLgorICAgIG1fY29udGVudExvZ2ljYWxXaWR0
aCArPSBhY2N1bXVsYXRlZEV4cGFuc2lvbjsKK30KKwordm9pZCBMaW5lOjpyZW1vdmVUcmFpbGlu
Z1RyaW1tYWJsZUNvbnRlbnQoKQoreworICAgIGlmIChtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVu
dC5pc0VtcHR5KCkgfHwgbV9ydW5zLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Ly8gQ29tcGxleCBsaW5lIGxheW91dCBxdWlyazoga2VlcCB0aGUgdHJhaWxpbmcgd2hpdGVzcGFj
ZSBhcm91bmQgd2hlbiBpdCBpcyBmb2xsb3dlZCBieSBhIGxpbmUgYnJlYWssIHVubGVzcyB0aGUg
Y29udGVudCBvdmVyZmxvd3MgdGhlIGxpbmUuCisgICAgaWYgKFJ1bnRpbWVFbmFibGVkRmVhdHVy
ZXM6OnNoYXJlZEZlYXR1cmVzKCkubGF5b3V0Rm9ybWF0dGluZ0NvbnRleHRJbnRlZ3JhdGlvbkVu
YWJsZWQoKSkgeworICAgICAgICBhdXRvIGlzVGV4dEFsaWduUmlnaHQgPSBbJl0geworICAgICAg
ICAgICAgYXV0byB0ZXh0QWxpZ24gPSBmb3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKS5zdHlsZSgp
LnRleHRBbGlnbigpOworICAgICAgICAgICAgcmV0dXJuIHRleHRBbGlnbiA9PSBUZXh0QWxpZ25N
b2RlOjpSaWdodAorICAgICAgICAgICAgICAgIHx8IHRleHRBbGlnbiA9PSBUZXh0QWxpZ25Nb2Rl
OjpXZWJLaXRSaWdodAorICAgICAgICAgICAgICAgIHx8IHRleHRBbGlnbiA9PSBUZXh0QWxpZ25N
b2RlOjpFbmQ7CisgICAgICAgICAgICB9KCk7CisKKyAgICAgICAgaWYgKG1fcnVucy5sYXN0KCku
aXNMaW5lQnJlYWsoKSAmJiAhaXNUZXh0QWxpZ25SaWdodCkgeworICAgICAgICAgICAgbV90cmlt
bWFibGVUcmFpbGluZ0NvbnRlbnQucmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCAtPSBtX3RyaW1tYWJsZVRy
YWlsaW5nQ29udGVudC5yZW1vdmUoKTsKK30KKwordm9pZCBMaW5lOjp2aXN1YWxseUNvbGxhcHNl
UHJlV3JhcE92ZXJmbG93Q29udGVudChJbmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNw
YWNlKQoreworICAgIEFTU0VSVChtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudC5pc0VtcHR5KCkp
OworICAgIC8vIElmIHdoaXRlLXNwYWNlIGlzIHNldCB0byBwcmUtd3JhcCwgdGhlIFVBIG11c3QK
KyAgICAvLyAuLi4KKyAgICAvLyBJdCBtYXkgYWxzbyB2aXN1YWxseSBjb2xsYXBzZSB0aGUgY2hh
cmFjdGVyIGFkdmFuY2Ugd2lkdGhzIG9mIGFueSB0aGF0IHdvdWxkIG90aGVyd2lzZSBvdmVyZmxv
dy4KKyAgICBhdXRvIG92ZXJmbG93V2lkdGggPSAtZXh0cmFIb3Jpem9udGFsU3BhY2U7CisgICAg
aWYgKG92ZXJmbG93V2lkdGggPD0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIC8vIExldCdzIGp1
c3QgZmluZCB0aGUgdHJhaWxpbmcgcHJlLXdyYXAgd2hpdGVzcGFjZSBjb250ZW50IGZvciBub3cg
KGUuZyBjaGVjayBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgdHJhaWxpbmcgcnVucyB3aXRoCisgICAg
Ly8gZGlmZmVyZW50IHNldCBvZiB3aGl0ZS1zcGFjZSB2YWx1ZXMgYW5kIGRlY2lkZSBpZiB0aGUg
aW4tYmV0d2VlbiBwcmUtd3JhcCBjb250ZW50IHNob3VsZCBiZSBjb2xsYXBzZWQgYXMgd2VsbC4p
CisgICAgSW5saW5lTGF5b3V0VW5pdCB0cmltbWVkQ29udGVudFdpZHRoID0gMDsKKyAgICBmb3Ig
KGF1dG8mIHJ1biA6IFdURjo6bWFrZVJldmVyc2VkUmFuZ2UobV9ydW5zKSkgeworICAgICAgICBp
ZiAocnVuLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9IFdoaXRlU3BhY2U6OlByZVdyYXApIHsKKyAg
ICAgICAgICAgIC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gcHJlLXdyYXAgdHJhaWxpbmcg
Y29udGVudC4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGF1dG8gcHJl
V3JhcFZpc3VhbGx5Q29sbGFwc2libGVJbmxpbmVJdGVtID0gcnVuLmlzSW5saW5lQm94U3RhcnQo
KSB8fCBydW4uaXNJbmxpbmVCb3hFbmQoKSB8fCBydW4uaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCk7
CisgICAgICAgIGlmICghcHJlV3JhcFZpc3VhbGx5Q29sbGFwc2libGVJbmxpbmVJdGVtKQorICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIEFTU0VSVCghcnVuLmhhc0NvbGxhcHNpYmxlVHJhaWxp
bmdXaGl0ZXNwYWNlKCkpOworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHRyaW1tYWJsZVdpZHRo
ID0geyB9OworICAgICAgICBpZiAocnVuLmlzVGV4dCgpKSB7CisgICAgICAgICAgICAvLyBGSVhN
RTogV2Ugc2hvdWxkIGFsd2F5cyBjb2xsYXBzZSB0aGUgcnVuIGF0IGEgZ2x5cGggYm91bmRhcnkg
YXMgdGhlIHNwZWMgaW5kaWNhdGVzOiAiY29sbGFwc2UgdGhlIGNoYXJhY3RlciBhZHZhbmNlIHdp
ZHRocyBvZiBhbnkgdGhhdCB3b3VsZCBvdGhlcndpc2Ugb3ZlcmZsb3ciCisgICAgICAgICAgICAv
LyBhbmQgdGhlIHRyaW1tZWQgd2lkdGggc2hvdWxkIGJlIGNhcHBlZCBhdCBzdGQ6Om1pbihydW4u
dHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoKSwgb3ZlcmZsb3dXaWR0aCkgZm9yIHRleHQgcnVucy4g
Qm90aCBGRiBhbmQgQ2hyb21lIGFncmVlLgorICAgICAgICAgICAgdHJpbW1hYmxlV2lkdGggPSBy
dW4udHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoKTsKKyAgICAgICAgICAgIHJ1bi52aXN1YWxseUNv
bGxhcHNlVHJhaWxpbmdXaGl0ZXNwYWNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICB0cmltbWFibGVXaWR0aCA9IHJ1bi5sb2dpY2FsV2lkdGgoKTsKKyAgICAgICAgICAgIHJ1bi5z
aHJpbmtIb3Jpem9udGFsbHkodHJpbW1hYmxlV2lkdGgpOworICAgICAgICB9CisgICAgICAgIHRy
aW1tZWRDb250ZW50V2lkdGggKz0gdHJpbW1hYmxlV2lkdGg7CisgICAgICAgIG92ZXJmbG93V2lk
dGggLT0gdHJpbW1hYmxlV2lkdGg7CisgICAgICAgIGlmIChvdmVyZmxvd1dpZHRoIDw9IDApCisg
ICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgbV9jb250ZW50TG9naWNhbFdpZHRoIC09IHRy
aW1tZWRDb250ZW50V2lkdGg7Cit9CisKK3ZvaWQgTGluZTo6YXBwZW5kKGNvbnN0IElubGluZUl0
ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQoreworICAgIGlm
IChpbmxpbmVJdGVtLmlzVGV4dCgpKQorICAgICAgICBhcHBlbmRUZXh0Q29udGVudChkb3duY2Fz
dDxJbmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSksIGxvZ2ljYWxXaWR0aCk7CisgICAgZWxzZSBp
ZiAoaW5saW5lSXRlbS5pc0xpbmVCcmVhaygpKQorICAgICAgICBhcHBlbmRMaW5lQnJlYWsoaW5s
aW5lSXRlbSk7CisgICAgZWxzZSBpZiAoaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5
KCkpCisgICAgICAgIGFwcGVuZFdvcmRCcmVha09wcG9ydHVuaXR5KGlubGluZUl0ZW0pOworICAg
IGVsc2UgaWYgKGlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpKQorICAgICAgICBhcHBlbmRJ
bmxpbmVCb3hTdGFydChpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgpOworICAgIGVsc2UgaWYgKGlu
bGluZUl0ZW0uaXNJbmxpbmVCb3hFbmQoKSkKKyAgICAgICAgYXBwZW5kSW5saW5lQm94RW5kKGlu
bGluZUl0ZW0sIGxvZ2ljYWxXaWR0aCk7CisgICAgZWxzZSBpZiAoaW5saW5lSXRlbS5sYXlvdXRC
b3goKS5pc1JlcGxhY2VkQm94KCkpCisgICAgICAgIGFwcGVuZFJlcGxhY2VkSW5saW5lTGV2ZWxC
b3goaW5saW5lSXRlbSwgbG9naWNhbFdpZHRoKTsKKyAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmlz
Qm94KCkpCisgICAgICAgIGFwcGVuZE5vblJlcGxhY2VkSW5saW5lTGV2ZWxCb3goaW5saW5lSXRl
bSwgbG9naWNhbFdpZHRoKTsKKyAgICBlbHNlCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworfQorCit2b2lkIExpbmU6OmFwcGVuZE5vbkJyZWFrYWJsZVNwYWNlKGNvbnN0IElubGluZUl0
ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91
dFVuaXQgbG9naWNhbFdpZHRoKQoreworICAgIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBs
b2dpY2FsTGVmdCwgbG9naWNhbFdpZHRoIH0pOworICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCAr
PSBsb2dpY2FsV2lkdGg7Cit9CisKK3ZvaWQgTGluZTo6YXBwZW5kSW5saW5lQm94U3RhcnQoY29u
c3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgp
Cit7CisgICAgLy8gVGhpcyBpcyByZWFsbHkganVzdCBhIHBsYWNlaG9sZGVyIHRvIG1hcmsgdGhl
IHN0YXJ0IG9mIHRoZSBpbmxpbmUgYm94IDxzcGFuPi4KKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9
IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goaW5saW5lSXRlbS5sYXlvdXRCb3go
KSk7CisgICAgYXV0byBhZGp1c3RlZFJ1blN0YXJ0ID0gY29udGVudExvZ2ljYWxSaWdodCgpICsg
c3RkOjptaW4oYm94R2VvbWV0cnkubWFyZ2luU3RhcnQoKSwgMF9sdSk7CisgICAgKyttX25vblNw
YW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudDsKKyAgICBhcHBlbmROb25CcmVha2FibGVTcGFjZShp
bmxpbmVJdGVtLCBhZGp1c3RlZFJ1blN0YXJ0LCBsb2dpY2FsV2lkdGgpOworfQorCit2b2lkIExp
bmU6OmFwcGVuZElubGluZUJveEVuZChjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKK3sKKyAgICAvLyBUaGlzIGlzIHJlYWxseSBqdXN0
IGEgcGxhY2Vob2xkZXIgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBpbmxpbmUgYm94IDwvc3Bhbj4u
CisgICAgYXV0byByZW1vdmVUcmFpbGluZ0xldHRlclNwYWNpbmcgPSBbJl0geworICAgICAgICBp
ZiAoIW1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmlzVHJhaWxpbmdSdW5QYXJ0aWFsbHlUcmlt
bWFibGUoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbV9jb250ZW50TG9naWNhbFdp
ZHRoIC09IG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlbW92ZVBhcnRpYWxseVRyaW1tYWJs
ZUNvbnRlbnQoKTsKKyAgICB9OworICAgIC8vIFByZXZlbnQgdHJhaWxpbmcgbGV0dGVyLXNwYWNp
bmcgZnJvbSBzcGlsbGluZyBvdXQgb2YgdGhlIGlubGluZSBib3guCisgICAgLy8gaHR0cHM6Ly9k
cmFmdHMuY3Nzd2cub3JnL2Nzcy10ZXh0LTMvI2xldHRlci1zcGFjaW5nLXByb3BlcnR5IFNlZSBl
eGFtcGxlIDIxLgorICAgIHJlbW92ZVRyYWlsaW5nTGV0dGVyU3BhY2luZygpOworICAgIGFwcGVu
ZE5vbkJyZWFrYWJsZVNwYWNlKGlubGluZUl0ZW0sIGNvbnRlbnRMb2dpY2FsV2lkdGgoKSwgbG9n
aWNhbFdpZHRoKTsKK30KKwordm9pZCBMaW5lOjphcHBlbmRUZXh0Q29udGVudChjb25zdCBJbmxp
bmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRo
KQoreworICAgIGF1dG8mIHN0eWxlID0gaW5saW5lVGV4dEl0ZW0uc3R5bGUoKTsKKyAgICBhdXRv
IHdpbGxDb2xsYXBzZUNvbXBsZXRlbHkgPSBbJl0geworICAgICAgICBpZiAoaW5saW5lVGV4dEl0
ZW0uaXNFbXB0eUNvbnRlbnQoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBp
ZiAoIWlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICBpZiAoSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5k
VGFicyhpbmxpbmVUZXh0SXRlbSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IC8vIENoZWNrIGlmIHRoZSBsYXN0IGl0ZW0gaXMgY29sbGFwc2VkIGFzIHdlbGwuCisgICAgICAg
IGZvciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShtX3J1bnMpKSB7CisgICAg
ICAgICAgICBpZiAocnVuLmlzQm94KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAgICAgLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy10ZXh0LTMvI3doaXRl
LXNwYWNlLXBoYXNlLTEKKyAgICAgICAgICAgIC8vIEFueSBjb2xsYXBzaWJsZSBzcGFjZSBpbW1l
ZGlhdGVseSBmb2xsb3dpbmcgYW5vdGhlciBjb2xsYXBzaWJsZSBzcGFjZeKAlGV2ZW4gb25lIG91
dHNpZGUgdGhlIGJvdW5kYXJ5IG9mIHRoZSBpbmxpbmUgY29udGFpbmluZyB0aGF0IHNwYWNlLAor
ICAgICAgICAgICAgLy8gcHJvdmlkZWQgYm90aCBzcGFjZXMgYXJlIHdpdGhpbiB0aGUgc2FtZSBp
bmxpbmUgZm9ybWF0dGluZyBjb250ZXh04oCUaXMgY29sbGFwc2VkIHRvIGhhdmUgemVybyBhZHZh
bmNlIHdpZHRoLgorICAgICAgICAgICAgLy8gOiAiPHNwYW4+ICA8L3NwYW4+ICIgPC0gdGhlIHRy
YWlsaW5nIHdoaXRlc3BhY2UgY29sbGFwc2VzIGNvbXBsZXRlbHkuCisgICAgICAgICAgICAvLyBO
b3QgdGhhdCB3aGVuIHRoZSBpbmxpbmUgYm94IGhhcyBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIHN0eWxl
LCAiPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOiBwcmUiPiAgPC9zcGFuPiAiIDwtIHRoaXMgd2hp
dGVzcGFjZSBzdGF5cyBhcm91bmQuCisgICAgICAgICAgICBpZiAocnVuLmlzVGV4dCgpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBydW4uaGFzQ29sbGFwc2libGVUcmFpbGluZ1doaXRlc3BhY2Uo
KTsKKyAgICAgICAgICAgIEFTU0VSVChydW4uaXNJbmxpbmVCb3hTdGFydCgpIHx8IHJ1bi5pc0lu
bGluZUJveEVuZCgpIHx8IHJ1bi5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkpOworICAgICAgICB9
CisgICAgICAgIC8vIExlYWRpbmcgd2hpdGVzcGFjZS4KKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfTsKKworICAgIGlmICh3aWxsQ29sbGFwc2VDb21wbGV0ZWx5KCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGF1dG8gbmVlZHNOZXdSdW4gPSBbJl0geworICAgICAgICBpZiAobV9ydW5zLmlz
RW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBhdXRvJiBsYXN0UnVu
ID0gbV9ydW5zLmxhc3QoKTsKKyAgICAgICAgaWYgKCZsYXN0UnVuLmxheW91dEJveCgpICE9ICZp
bmxpbmVUZXh0SXRlbS5sYXlvdXRCb3goKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICBpZiAoIWxhc3RSdW4uaXNUZXh0KCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgaWYgKGxhc3RSdW4uaGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCkpCisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlubGluZVRleHRJdGVtLmlzV29yZFNl
cGFyYXRvcigpICYmIHN0eWxlLmZvbnRDYXNjYWRlKCkud29yZFNwYWNpbmcoKSkKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSgpOworICAgIGF1
dG8gb2xkQ29udGVudExvZ2ljYWxXaWR0aCA9IGNvbnRlbnRMb2dpY2FsV2lkdGgoKTsKKyAgICBp
ZiAobmVlZHNOZXdSdW4pIHsKKyAgICAgICAgLy8gTm90ZSwgbmVnYXRpdmUgd29yZHMgc3BhY2lu
ZyBtYXkgY2F1c2UgZ2x5cGggb3ZlcmxhcC4KKyAgICAgICAgYXV0byBydW5Mb2dpY2FsTGVmdCA9
IGNvbnRlbnRMb2dpY2FsUmlnaHQoKSArIChpbmxpbmVUZXh0SXRlbS5pc1dvcmRTZXBhcmF0b3Io
KSA/IHN0eWxlLmZvbnRDYXNjYWRlKCkud29yZFNwYWNpbmcoKSA6IDAuMGYpOworICAgICAgICBt
X3J1bnMuYXBwZW5kKHsgaW5saW5lVGV4dEl0ZW0sIHJ1bkxvZ2ljYWxMZWZ0LCBsb2dpY2FsV2lk
dGggfSk7CisgICAgICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCA9IHN0ZDo6bWF4KG9sZENvbnRl
bnRMb2dpY2FsV2lkdGgsIHJ1bkxvZ2ljYWxMZWZ0ICsgbG9naWNhbFdpZHRoKTsKKyAgICB9IGVs
c2UgeworICAgICAgICBtX3J1bnMubGFzdCgpLmV4cGFuZChpbmxpbmVUZXh0SXRlbSwgbG9naWNh
bFdpZHRoKTsKKyAgICAgICAgLy8gRG8gbm90IGxldCBuZWdhdGl2ZSBsZXR0ZXIgc3BhY2luZyBt
YWtlIHRoZSBjb250ZW50IHNob3J0ZXIgdGhhbiBpdCBhbHJlYWR5IGlzLgorICAgICAgICBtX2Nv
bnRlbnRMb2dpY2FsV2lkdGggKz0gc3RkOjptYXgoMC4wZiwgbG9naWNhbFdpZHRoKTsKKyAgICB9
CisgICAgLy8gU2V0IHRoZSB0cmFpbGluZyB0cmltbWFibGUgY29udGVudC4KKyAgICBpZiAoaW5s
aW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkgJiYgIUlubGluZVRleHRJdGVtOjpzaG91bGRQcmVz
ZXJ2ZVNwYWNlc0FuZFRhYnMoaW5saW5lVGV4dEl0ZW0pKSB7CisgICAgICAgIG1fdHJpbW1hYmxl
VHJhaWxpbmdDb250ZW50LmFkZEZ1bGx5VHJpbW1hYmxlQ29udGVudChtX3J1bnMuc2l6ZSgpIC0g
MSwgY29udGVudExvZ2ljYWxXaWR0aCgpIC0gb2xkQ29udGVudExvZ2ljYWxXaWR0aCk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gQW55IG5vbi13aGl0ZXNwYWNlLCBuby10cmltbWFi
bGUgY29udGVudCByZXNldHMgdGhlIGV4aXN0aW5nIHRyaW1tYWJsZS4KKyAgICBtX3RyaW1tYWJs
ZVRyYWlsaW5nQ29udGVudC5yZXNldCgpOworICAgIGlmICghZm9ybWF0dGluZ0NvbnRleHQoKS5s
YXlvdXRTdGF0ZSgpLnNob3VsZElnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZygpICYmICFpbmxp
bmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiBzdHlsZS5sZXR0ZXJTcGFjaW5nKCkgPiAwKQor
ICAgICAgICBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudC5hZGRQYXJ0aWFsbHlUcmltbWFibGVD
b250ZW50KG1fcnVucy5zaXplKCkgLSAxLCBzdHlsZS5sZXR0ZXJTcGFjaW5nKCkpOworICAgIG1f
dHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPSBpbmxpbmVUZXh0SXRlbS5oYXNUcmFpbGluZ1NvZnRI
eXBoZW4oKSA/IG1ha2VPcHRpb25hbChzdHlsZS5mb250Q2FzY2FkZSgpLndpZHRoKFRleHRSdW4g
eyBTdHJpbmdWaWV3IHsgc3R5bGUuaHlwaGVuU3RyaW5nKCkgfSB9KSkgOiBXVEY6Om51bGxvcHQ7
Cit9CisKK3ZvaWQgTGluZTo6YXBwZW5kTm9uUmVwbGFjZWRJbmxpbmVMZXZlbEJveChjb25zdCBJ
bmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IG1hcmdpbkJveExvZ2ljYWxX
aWR0aCkKK3sKKyAgICBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudC5yZXNldCgpOworICAgIG1f
dHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPSB7IH07CisgICAgbV9jb250ZW50TG9naWNhbFdpZHRo
ICs9IG1hcmdpbkJveExvZ2ljYWxXaWR0aDsKKyAgICArK21fbm9uU3Bhbm5pbmdJbmxpbmVMZXZl
bEJveENvdW50OworICAgIGF1dG8gbWFyZ2luU3RhcnQgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdl
b21ldHJ5Rm9yQm94KGlubGluZUl0ZW0ubGF5b3V0Qm94KCkpLm1hcmdpblN0YXJ0KCk7CisgICAg
aWYgKG1hcmdpblN0YXJ0ID49IDApIHsKKyAgICAgICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0
ZW0sIGNvbnRlbnRMb2dpY2FsUmlnaHQoKSwgbWFyZ2luQm94TG9naWNhbFdpZHRoIH0pOworICAg
ICAgICByZXR1cm47CisgICAgfQorICAgIC8vIE5lZ2F0aXZlIG1hcmdpbi1zdGFydCBwdWxscyB0
aGUgY29udGVudCB0byB0aGUgbG9naWNhbCBsZWZ0IGRpcmVjdGlvbi4KKyAgICAvLyBOZWdhdGl2
ZSBtYXJnaW4gYWxzbyBzcXVlZXplcyB0aGUgbWFyZ2luIGJveCwgd2UgbmVlZCB0byBzdHJldGNo
IGl0IHRvIG1ha2Ugc3VyZSB0aGUgc3Vic2VxdWVudCBjb250ZW50IHdvbid0IG92ZXJsYXAuCisg
ICAgLy8gZS5nLiA8aW1nIHN0eWxlPSJ3aWR0aDogMTAwcHg7IG1hcmdpbi1sZWZ0OiAtMTAwcHg7
Ij4gcHVsbHMgdGhlIHJlcGxhY2VkIGJveCB0byAtMTAwcHggd2l0aCB0aGUgbWFyZ2luIGJveCB3
aWR0aCBvZiAwcHguCisgICAgLy8gSW5zdGVhZCB3ZSBuZWVkIHRvIHBvc2l0aW9uIGl0IGF0IC0x
MDBweCBhbmQgc2l6ZSBpdCB0byAxMDBweCBzbyB0aGUgc3Vic2VxdWVudCBjb250ZW50IHN0YXJ0
cyBhdCAwcHguIAorICAgIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBjb250ZW50TG9naWNh
bFJpZ2h0KCkgKyBtYXJnaW5TdGFydCwgbWFyZ2luQm94TG9naWNhbFdpZHRoIC0gbWFyZ2luU3Rh
cnQgfSk7Cit9CisKK3ZvaWQgTGluZTo6YXBwZW5kUmVwbGFjZWRJbmxpbmVMZXZlbEJveChjb25z
dCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IG1hcmdpbkJveExvZ2lj
YWxXaWR0aCkKK3sKKyAgICBBU1NFUlQoaW5saW5lSXRlbS5sYXlvdXRCb3goKS5pc1JlcGxhY2Vk
Qm94KCkpOworICAgIC8vIEZJWE1FOiBTdXJlbHkgcmVwbGFjZWQgYm94ZXMgYmVoYXZlIGRpZmZl
cmVudGx5LgorICAgIGFwcGVuZE5vblJlcGxhY2VkSW5saW5lTGV2ZWxCb3goaW5saW5lSXRlbSwg
bWFyZ2luQm94TG9naWNhbFdpZHRoKTsKK30KKwordm9pZCBMaW5lOjphcHBlbmRMaW5lQnJlYWso
Y29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSkKK3sKKyAgICBtX3RyYWlsaW5nU29mdEh5cGhl
bldpZHRoID0geyB9OworICAgIGlmIChpbmxpbmVJdGVtLmlzSGFyZExpbmVCcmVhaygpKSB7Cisg
ICAgICAgICsrbV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQ7CisgICAgICAgIHJldHVy
biBtX3J1bnMuYXBwZW5kKHsgaW5saW5lSXRlbSwgY29udGVudExvZ2ljYWxSaWdodCgpLCAwX2x1
IH0pOworICAgIH0KKyAgICAvLyBTb2Z0IGxpbmUgYnJlYWtzIChwcmVzZXJ2ZWQgbmV3IGxpbmUg
Y2hhcmFjdGVycykgcmVxdWlyZSBpbmxpbmUgdGV4dCBib3hlcyBmb3IgY29tcGF0aWJpbGl0eSBy
ZWFzb25zLgorICAgIEFTU0VSVChpbmxpbmVJdGVtLmlzU29mdExpbmVCcmVhaygpKTsKKyAgICBt
X3J1bnMuYXBwZW5kKHsgZG93bmNhc3Q8SW5saW5lU29mdExpbmVCcmVha0l0ZW0+KGlubGluZUl0
ZW0pLCBjb250ZW50TG9naWNhbFJpZ2h0KCkgfSk7Cit9CisKK3ZvaWQgTGluZTo6YXBwZW5kV29y
ZEJyZWFrT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSkKK3sKKyAgICBt
X3J1bnMuYXBwZW5kKHsgaW5saW5lSXRlbSwgY29udGVudExvZ2ljYWxSaWdodCgpLCAwX2x1IH0p
OworfQorCit2b2lkIExpbmU6OmFkZFRyYWlsaW5nSHlwaGVuKElubGluZUxheW91dFVuaXQgaHlw
aGVuTG9naWNhbFdpZHRoKQoreworICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJz
ZWRSYW5nZShtX3J1bnMpKSB7CisgICAgICAgIGlmICghcnVuLmlzVGV4dCgpKQorICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgIHJ1bi5zZXROZWVkc0h5cGhlbihoeXBoZW5Mb2dpY2FsV2lk
dGgpOworICAgICAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggKz0gaHlwaGVuTG9naWNhbFdpZHRo
OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQor
Citjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgTGluZTo6Zm9ybWF0dGluZ0NvbnRleHQo
KSBjb25zdAoreworICAgIHJldHVybiBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0OworfQorCitM
aW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudChS
dW5MaXN0JiBydW5zKQorICAgIDogbV9ydW5zKHJ1bnMpCit7Cit9CisKK3ZvaWQgTGluZTo6VHJp
bW1hYmxlVHJhaWxpbmdDb250ZW50OjphZGRGdWxseVRyaW1tYWJsZUNvbnRlbnQoc2l6ZV90IHJ1
bkluZGV4LCBJbmxpbmVMYXlvdXRVbml0IHRyaW1tYWJsZVdpZHRoKQoreworICAgIC8vIEFueSBz
dWJzZXF1ZW50IHRyaW1tYWJsZSB3aGl0ZXNwYWNlIHNob3VsZCBjb2xsYXBzZSB0byB6ZXJvIGFk
dmFuY2VkIHdpZHRoIGFuZCBpZ25vcmVkIGF0IDo6YXBwZW5kVGV4dENvbnRlbnQoKS4KKyAgICBB
U1NFUlQoIW1faGFzRnVsbHlUcmltbWFibGVDb250ZW50KTsKKyAgICBtX2Z1bGx5VHJpbW1hYmxl
V2lkdGggPSB0cmltbWFibGVXaWR0aDsKKyAgICAvLyBOb3RlIHRoYXQganVzdCBiZWNhdXNlIHRo
ZSB0cmltbWFibGUgd2lkdGggaXMgMCAoZm9udC1zaXplOiAwcHgpLCBpdCBkb2VzIG5vdCBtZWFu
IHdlIGRvbid0IGhhdmUgYSB0cmltbWFibGUgdHJhaWxpbmcgY29udGVudC4KKyAgICBtX2hhc0Z1
bGx5VHJpbW1hYmxlQ29udGVudCA9IHRydWU7CisgICAgbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4
ID0gbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4LnZhbHVlT3IocnVuSW5kZXgpOworfQorCit2b2lk
IExpbmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6YWRkUGFydGlhbGx5VHJpbW1hYmxlQ29u
dGVudChzaXplX3QgcnVuSW5kZXgsIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpCit7
CisgICAgLy8gRG8gbm90IGFkZCB0cmltbWFibGUgbGV0dGVyIHNwYWNpbmcgYWZ0ZXIgYSBmdWxs
eSB0cmltbWFibGUgd2hpdGVzcGFjZS4KKyAgICBBU1NFUlQoIW1fZmlyc3RUcmltbWFibGVSdW5J
bmRleCk7CisgICAgQVNTRVJUKCFtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCk7CisgICAgQVNT
RVJUKCFtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRoKTsKKyAgICBBU1NFUlQodHJpbW1hYmxlV2lk
dGgpOworICAgIG1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGggPSB0cmltbWFibGVXaWR0aDsKKyAg
ICBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXggPSBydW5JbmRleDsKK30KKworSW5saW5lTGF5b3V0
VW5pdCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OnJlbW92ZSgpCit7CisgICAgLy8g
UmVtb3ZlIHRyaW1tYWJsZSB0cmFpbGluZyBjb250ZW50IGFuZCBtb3ZlIGFsbCB0aGUgc3Vic2Vx
dWVudCB0cmFpbGluZyBydW5zLgorICAgIC8vIDxzcGFuPiA8L3NwYW4+PHNwYW4+PC9zcGFuPgor
ICAgIC8vIFt0cmFpbGluZyB3aGl0ZXNwYWNlXVtpbmxpbmUgYm94IGVuZF1baW5saW5lIGJveCBz
dGFydF1baW5saW5lIGJveCBlbmRdCisgICAgLy8gVHJpbSB0aGUgd2hpdGVzcGFjZSBydW4gYW5k
IG1vdmUgdGhlIHRyYWlsaW5nIGlubGluZSBib3ggcnVucyB0byB0aGUgbG9naWNhbCBsZWZ0Lgor
ICAgIEFTU0VSVCghaXNFbXB0eSgpKTsKKyAgICBhdXRvJiB0cmltbWFibGVSdW4gPSBtX3J1bnNb
Km1fZmlyc3RUcmltbWFibGVSdW5JbmRleF07CisgICAgQVNTRVJUKHRyaW1tYWJsZVJ1bi5pc1Rl
eHQoKSk7CisKKyAgICBpZiAobV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQpCisgICAgICAgIHRy
aW1tYWJsZVJ1bi5yZW1vdmVUcmFpbGluZ1doaXRlc3BhY2UoKTsKKyAgICBpZiAobV9wYXJ0aWFs
bHlUcmltbWFibGVXaWR0aCkKKyAgICAgICAgdHJpbW1hYmxlUnVuLnJlbW92ZVRyYWlsaW5nTGV0
dGVyU3BhY2luZygpOworCisgICAgYXV0byB0cmltbWFibGVXaWR0aCA9IHdpZHRoKCk7CisgICAg
Ly8gV2hlbiB0aGUgdHJpbW1hYmxlIHJ1biBpcyBmb2xsb3dlZCBieSBzb21lIG5vbi1jb250ZW50
IHJ1bnMsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZWlyIGhvcml6b250YWwgcG9zaXRpb25zLgorICAg
IC8vIGUuZy4gPGRpdj50ZXh0IGlzIGZvbGxvd2VkIGJ5IHRyaW1tYWJsZSBjb250ZW50ICAgIDxz
cGFuPiA8L3NwYW4+PC9kaXY+CisgICAgLy8gV2hlbiB0aGUgW3RleHQuLi5dIHJ1biBpcyB0cmlt
bWVkICh0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHJlbW92ZWQpLCBib3RoICI8c3Bhbj4iIGFuZCAi
PC9zcGFuPiIgcnVucworICAgIC8vIG5lZWQgdG8gYmUgbW92ZWQgaG9yaXpvbnRhbGx5IHRvIGNh
dGNoIHVwIHdpdGggdGhlIFt0ZXh0Li4uXSBydW4uIE5vdGUgdGhhdCB0aGUgd2hpdGVzcGFjZSBp
bnNpZGUgdGhlIDxzcGFuPiBkb2VzCisgICAgLy8gbm90IHByb2R1Y2UgYSBydW4gc2luY2UgaW4g
OjphcHBlbmRUZXh0KCkgd2Ugc2VlIGl0IGFzIGEgZnVsbHkgY29sbGFwc2libGUgcnVuLgorICAg
IGZvciAoYXV0byBpbmRleCA9ICptX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXggKyAxOyBpbmRleCA8
IG1fcnVucy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgYXV0byYgcnVuID0gbV9ydW5zW2lu
ZGV4XTsKKyAgICAgICAgQVNTRVJUKHJ1bi5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkgfHwgcnVu
LmlzSW5saW5lQm94U3RhcnQoKSB8fCBydW4uaXNJbmxpbmVCb3hFbmQoKSB8fCBydW4uaXNMaW5l
QnJlYWsoKSk7CisgICAgICAgIHJ1bi5tb3ZlSG9yaXpvbnRhbGx5KC10cmltbWFibGVXaWR0aCk7
CisgICAgfQorICAgIGlmICghdHJpbW1hYmxlUnVuLnRleHRDb250ZW50KCktPmxlbmd0aCgpKSB7
CisgICAgICAgIC8vIFRoaXMgdHJpbW1hYmxlIHJ1biBpcyBmdWxseSBjb2xsYXBzZWQgbm93IChl
LmcuIDxkaXY+PGltZz4gICAgPHNwYW4+PC9zcGFuPjwvZGl2PikuCisgICAgICAgIC8vIFdlIGRv
bid0IG5lZWQgdG8ga2VlcCBpdCBhcm91bmQgYW55bW9yZS4KKyAgICAgICAgbV9ydW5zLnJlbW92
ZSgqbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4KTsKKyAgICB9CisgICAgcmVzZXQoKTsKKyAgICBy
ZXR1cm4gdHJpbW1hYmxlV2lkdGg7Cit9CisKK0lubGluZUxheW91dFVuaXQgTGluZTo6VHJpbW1h
YmxlVHJhaWxpbmdDb250ZW50OjpyZW1vdmVQYXJ0aWFsbHlUcmltbWFibGVDb250ZW50KCkKK3sK
KyAgICAvLyBQYXJ0aWFsbHkgdHJpbW1hYmxlIGNvbnRlbnQgaXMgYWx3YXlzIGdhdGVkIGJ5IGEg
ZnVsbHkgdHJpbW1hYmxlIGNvbnRlbnQuCisgICAgLy8gV2UgY2FuJ3QganVzdCB0cmltIHNwYWNp
bmcgaW4gdGhlIG1pZGRsZS4KKyAgICBBU1NFUlQoIW1fZnVsbHlUcmltbWFibGVXaWR0aCk7Cisg
ICAgcmV0dXJuIHJlbW92ZSgpOworfQorCitMaW5lOjpSdW46OlJ1bihjb25zdCBJbmxpbmVJdGVt
JiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxXaWR0aCkKKyAgICA6IG1fdHlwZShpbmxpbmVJdGVtLnR5cGUoKSkKKyAgICAs
IG1fbGF5b3V0Qm94KCZpbmxpbmVJdGVtLmxheW91dEJveCgpKQorICAgICwgbV9sb2dpY2FsTGVm
dChsb2dpY2FsTGVmdCkKKyAgICAsIG1fbG9naWNhbFdpZHRoKGxvZ2ljYWxXaWR0aCkKK3sKK30K
KworTGluZTo6UnVuOjpSdW4oY29uc3QgSW5saW5lU29mdExpbmVCcmVha0l0ZW0mIHNvZnRMaW5l
QnJlYWtJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KQorICAgIDogbV90eXBlKHNv
ZnRMaW5lQnJlYWtJdGVtLnR5cGUoKSkKKyAgICAsIG1fbGF5b3V0Qm94KCZzb2Z0TGluZUJyZWFr
SXRlbS5sYXlvdXRCb3goKSkKKyAgICAsIG1fbG9naWNhbExlZnQobG9naWNhbExlZnQpCisgICAg
LCBtX3RleHRDb250ZW50KHsgc29mdExpbmVCcmVha0l0ZW0ucG9zaXRpb24oKSwgMSwgc29mdExp
bmVCcmVha0l0ZW0uaW5saW5lVGV4dEJveCgpLmNvbnRlbnQoKSB9KQoreworfQorCitMaW5lOjpS
dW46OlJ1bihjb25zdCBJbmxpbmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0ZW0sIElubGluZUxheW91
dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQorICAgIDog
bV90eXBlKElubGluZUl0ZW06OlR5cGU6OlRleHQpCisgICAgLCBtX2xheW91dEJveCgmaW5saW5l
VGV4dEl0ZW0ubGF5b3V0Qm94KCkpCisgICAgLCBtX2xvZ2ljYWxMZWZ0KGxvZ2ljYWxMZWZ0KQor
ICAgICwgbV9sb2dpY2FsV2lkdGgobG9naWNhbFdpZHRoKQorICAgICwgbV93aGl0ZXNwYWNlSXNF
eHBhbnNpb25PcHBvcnR1bml0eSghVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFi
cyhpbmxpbmVUZXh0SXRlbS5sYXlvdXRCb3goKSkpCisgICAgLCBtX3RyYWlsaW5nV2hpdGVzcGFj
ZVR5cGUodHJhaWxpbmdXaGl0ZXNwYWNlVHlwZShpbmxpbmVUZXh0SXRlbSkpCisgICAgLCBtX3Rl
eHRDb250ZW50KHsgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwgbV90cmFpbGluZ1doaXRlc3BhY2VU
eXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Q29sbGFwc2VkID8gMSA6IGlubGluZVRleHRJdGVt
Lmxlbmd0aCgpLCBpbmxpbmVUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpIH0pCit7
CisgICAgaWYgKG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSAhPSBUcmFpbGluZ1doaXRlc3BhY2U6
Ok5vbmUpIHsKKyAgICAgICAgbV90cmFpbGluZ1doaXRlc3BhY2VXaWR0aCA9IGxvZ2ljYWxXaWR0
aDsKKyAgICAgICAgaWYgKG1fd2hpdGVzcGFjZUlzRXhwYW5zaW9uT3Bwb3J0dW5pdHkpCisgICAg
ICAgICAgICBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQgPSAxOworICAgIH0KK30KKwordm9p
ZCBMaW5lOjpSdW46OmV4cGFuZChjb25zdCBJbmxpbmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0ZW0s
IElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQoreworICAgIC8vIEZJWE1FOiBUaGlzIGlz
IGEgdmVyeSBzaW1wbGUgZXhwYW5zaW9uIG1lcmdlLiBXZSBzaG91bGQgZXZlbnR1YWxseSBzd2l0
Y2ggb3ZlciB0byBGb250Q2FzY2FkZTo6ZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudC4KKyAgICBB
U1NFUlQoIWhhc0NvbGxhcHNlZFRyYWlsaW5nV2hpdGVzcGFjZSgpKTsKKyAgICBBU1NFUlQoaXNU
ZXh0KCkgJiYgaW5saW5lVGV4dEl0ZW0uaXNUZXh0KCkpOworICAgIEFTU0VSVChtX2xheW91dEJv
eCA9PSAmaW5saW5lVGV4dEl0ZW0ubGF5b3V0Qm94KCkpOworCisgICAgbV9sb2dpY2FsV2lkdGgg
Kz0gbG9naWNhbFdpZHRoOworICAgIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9IHRyYWlsaW5n
V2hpdGVzcGFjZVR5cGUoaW5saW5lVGV4dEl0ZW0pOworCisgICAgaWYgKG1fdHJhaWxpbmdXaGl0
ZXNwYWNlVHlwZSA9PSBUcmFpbGluZ1doaXRlc3BhY2U6Ok5vbmUpIHsKKyAgICAgICAgbV90cmFp
bGluZ1doaXRlc3BhY2VXaWR0aCA9IHsgfTsKKyAgICAgICAgc2V0RXhwYW5zaW9uQmVoYXZpb3Io
QWxsb3dMZWZ0RXhwYW5zaW9uIHwgQWxsb3dSaWdodEV4cGFuc2lvbik7CisgICAgICAgIG1fdGV4
dENvbnRlbnQtPmV4cGFuZChpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisgICAgbV90cmFpbGluZ1doaXRlc3BhY2VXaWR0aCArPSBsb2dpY2FsV2lkdGg7
CisgICAgaWYgKG1fd2hpdGVzcGFjZUlzRXhwYW5zaW9uT3Bwb3J0dW5pdHkpCisgICAgICAgICsr
bV9leHBhbnNpb25PcHBvcnR1bml0eUNvdW50OworICAgIHNldEV4cGFuc2lvbkJlaGF2aW9yKERl
ZmF1bHRFeHBhbnNpb24pOworICAgIG1fdGV4dENvbnRlbnQtPmV4cGFuZChtX3RyYWlsaW5nV2hp
dGVzcGFjZVR5cGUgPT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQgPyAxIDogaW5saW5l
VGV4dEl0ZW0ubGVuZ3RoKCkpOworfQorCitib29sIExpbmU6OlJ1bjo6aGFzVHJhaWxpbmdMZXR0
ZXJTcGFjaW5nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gIWhhc1RyYWlsaW5nV2hpdGVzcGFjZSgp
ICYmIHN0eWxlKCkubGV0dGVyU3BhY2luZygpID4gMDsKK30KKworSW5saW5lTGF5b3V0VW5pdCBM
aW5lOjpSdW46OnRyYWlsaW5nTGV0dGVyU3BhY2luZygpIGNvbnN0Cit7CisgICAgaWYgKCFoYXNU
cmFpbGluZ0xldHRlclNwYWNpbmcoKSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICByZXR1cm4g
SW5saW5lTGF5b3V0VW5pdCB7IHN0eWxlKCkubGV0dGVyU3BhY2luZygpIH07Cit9CisKK3ZvaWQg
TGluZTo6UnVuOjpyZW1vdmVUcmFpbGluZ0xldHRlclNwYWNpbmcoKQoreworICAgIEFTU0VSVCho
YXNUcmFpbGluZ0xldHRlclNwYWNpbmcoKSk7CisgICAgc2hyaW5rSG9yaXpvbnRhbGx5KHRyYWls
aW5nTGV0dGVyU3BhY2luZygpKTsKKyAgICBBU1NFUlQobG9naWNhbFdpZHRoKCkgPiAwIHx8ICgh
bG9naWNhbFdpZHRoKCkgJiYgc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCkgPj0gc3RhdGljX2Nhc3Q8
ZmxvYXQ+KGludE1heEZvckxheW91dFVuaXQpKSk7Cit9CisKK3ZvaWQgTGluZTo6UnVuOjpyZW1v
dmVUcmFpbGluZ1doaXRlc3BhY2UoKQoreworICAgIC8vIEFjY29yZGluZyB0byBodHRwczovL3d3
dy53My5vcmcvVFIvY3NzLXRleHQtMy8jd2hpdGUtc3BhY2UtcHJvcGVydHkgbWF0cml4CisgICAg
Ly8gVHJpbW1hYmxlIHdoaXRlc3BhY2UgaXMgYWx3YXlzIGNvbGxhcHNpYmxlIHNvIHRoZSBsZW5n
dGggb2YgdGhlIHRyYWlsaW5nIHRyaW1tYWJsZSB3aGl0ZXNwYWNlIGlzIGFsd2F5cyAxIChvciBu
b24tZXhpc3RlbnQpLgorICAgIEFTU0VSVChtX3RleHRDb250ZW50LT5sZW5ndGgoKSk7CisgICAg
Y29uc3RleHByIHNpemVfdCB0cmFpbGluZ1RyaW1tYWJsZUNvbnRlbnRMZW5ndGggPSAxOworICAg
IG1fdGV4dENvbnRlbnQtPnNocmluayh0cmFpbGluZ1RyaW1tYWJsZUNvbnRlbnRMZW5ndGgpOwor
ICAgIHZpc3VhbGx5Q29sbGFwc2VUcmFpbGluZ1doaXRlc3BhY2UoKTsKK30KKwordm9pZCBMaW5l
OjpSdW46OnZpc3VhbGx5Q29sbGFwc2VUcmFpbGluZ1doaXRlc3BhY2UoKQoreworICAgIC8vIFRo
aXMgaXMganVzdCBhIHZpc3VhbCBhZGp1c3RtZW50LCB0aGUgdGV4dCBsZW5ndGggc2hvdWxkIHJl
bWFpbiB0aGUgc2FtZS4KKyAgICBzaHJpbmtIb3Jpem9udGFsbHkobV90cmFpbGluZ1doaXRlc3Bh
Y2VXaWR0aCk7CisgICAgbV90cmFpbGluZ1doaXRlc3BhY2VXaWR0aCA9IHsgfTsKKyAgICBtX3Ry
YWlsaW5nV2hpdGVzcGFjZVR5cGUgPSBUcmFpbGluZ1doaXRlc3BhY2U6Ok5vbmU7CisKKyAgICBp
ZiAobV93aGl0ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1bml0eSkgeworICAgICAgICBBU1NFUlQo
bV9leHBhbnNpb25PcHBvcnR1bml0eUNvdW50KTsKKyAgICAgICAgbV9leHBhbnNpb25PcHBvcnR1
bml0eUNvdW50LS07CisgICAgfQorICAgIHNldEV4cGFuc2lvbkJlaGF2aW9yKEFsbG93TGVmdEV4
cGFuc2lvbiB8IEFsbG93UmlnaHRFeHBhbnNpb24pOworfQorCit2b2lkIExpbmU6OlJ1bjo6c2V0
RXhwYW5zaW9uQmVoYXZpb3IoRXhwYW5zaW9uQmVoYXZpb3IgZXhwYW5zaW9uQmVoYXZpb3IpCit7
CisgICAgQVNTRVJUKGlzVGV4dCgpKTsKKyAgICBtX2V4cGFuc2lvbi5iZWhhdmlvciA9IGV4cGFu
c2lvbkJlaGF2aW9yOworfQorCitFeHBhbnNpb25CZWhhdmlvciBMaW5lOjpSdW46OmV4cGFuc2lv
bkJlaGF2aW9yKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaXNUZXh0KCkpOworICAgIHJldHVybiBt
X2V4cGFuc2lvbi5iZWhhdmlvcjsKK30KKwordm9pZCBMaW5lOjpSdW46OnNldEhvcml6b250YWxF
eHBhbnNpb24oSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsRXhwYW5zaW9uKQoreworICAgIEFTU0VS
VChpc1RleHQoKSk7CisgICAgQVNTRVJUKGhhc0V4cGFuc2lvbk9wcG9ydHVuaXR5KCkpOworICAg
IG1fZXhwYW5zaW9uLmhvcml6b250YWxFeHBhbnNpb24gPSBsb2dpY2FsRXhwYW5zaW9uOworfQor
Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUuaCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5l
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uZmUzMzUxOTUyMWFhOWU0Zjk2YTc5MzRhZWQ4YzAzMmNjOWU3OTNmNQot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQorCisjaW5jbHVkZSAiSW5saW5lSXRlbS5oIgorI2luY2x1ZGUgIklubGluZUxpbmVSdW4u
aCIKKyNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7Citu
YW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7CitjbGFz
cyBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbTsKKworY2xhc3MgTGluZSB7CitwdWJsaWM6CisgICAg
TGluZShjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYpOworICAgIH5MaW5lKCk7CisKKyAg
ICB2b2lkIGluaXRpYWxpemUoKTsKKworICAgIHZvaWQgYXBwZW5kKGNvbnN0IElubGluZUl0ZW0m
LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7CisKKyAgICBJbmxpbmVMYXlvdXRVbml0
IGNvbnRlbnRMb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRMb2dpY2FsV2lk
dGg7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsUmlnaHQoKSBjb25zdCB7
IHJldHVybiBtX3J1bnMuaXNFbXB0eSgpID8gMC4wZiA6IG1fcnVucy5sYXN0KCkubG9naWNhbFJp
Z2h0KCk7IH0KKyAgICBzaXplX3Qgbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50KCkgY29u
c3QgeyByZXR1cm4gbV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQ7IH0KKworICAgIElu
bGluZUxheW91dFVuaXQgdHJpbW1hYmxlVHJhaWxpbmdXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1f
dHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LndpZHRoKCk7IH0KKyAgICBib29sIGlzVHJhaWxpbmdS
dW5GdWxseVRyaW1tYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250
ZW50LmlzVHJhaWxpbmdSdW5GdWxseVRyaW1tYWJsZSgpOyB9CisKKyAgICBPcHRpb25hbDxJbmxp
bmVMYXlvdXRVbml0PiB0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1f
dHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGg7IH0KKyAgICB2b2lkIGFkZFRyYWlsaW5nSHlwaGVuKElu
bGluZUxheW91dFVuaXQgaHlwaGVuTG9naWNhbFdpZHRoKTsKKworICAgIHZvaWQgcmVtb3ZlQ29s
bGFwc2libGVDb250ZW50KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFsU3BhY2UpOwor
ICAgIHZvaWQgYXBwbHlSdW5FeHBhbnNpb24oSW5saW5lTGF5b3V0VW5pdCBleHRyYUhvcml6b250
YWxTcGFjZSk7CisKKyAgICBzdHJ1Y3QgUnVuIHsKKyAgICAgICAgYm9vbCBpc1RleHQoKSBjb25z
dCB7IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6VGV4dDsgfQorICAgICAgICBi
b29sIGlzQm94KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5cGU6OkJv
eDsgfQorICAgICAgICBib29sIGlzTGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gaXNIYXJkTGlu
ZUJyZWFrKCkgfHwgaXNTb2Z0TGluZUJyZWFrKCk7IH0KKyAgICAgICAgYm9vbCBpc1NvZnRMaW5l
QnJlYWsoKSBjb25zdCAgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5cGU6OlNvZnRM
aW5lQnJlYWs7IH0KKyAgICAgICAgYm9vbCBpc0hhcmRMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVy
biBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6SGFyZExpbmVCcmVhazsgfQorICAgICAgICBi
b29sIGlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gSW5s
aW5lSXRlbTo6VHlwZTo6V29yZEJyZWFrT3Bwb3J0dW5pdHk7IH0KKyAgICAgICAgYm9vbCBpc0lu
bGluZUJveFN0YXJ0KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5cGU6
OklubGluZUJveFN0YXJ0OyB9CisgICAgICAgIGJvb2wgaXNJbmxpbmVCb3hFbmQoKSBjb25zdCB7
IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94RW5kOyB9CisKKyAg
ICAgICAgY29uc3QgQm94JiBsYXlvdXRCb3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRCb3g7
IH0KKyAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9s
YXlvdXRCb3gtPnN0eWxlKCk7IH0KKyAgICAgICAgY29uc3QgT3B0aW9uYWw8TGluZVJ1bjo6VGV4
dD4mIHRleHRDb250ZW50KCkgY29uc3QgeyByZXR1cm4gbV90ZXh0Q29udGVudDsgfQorCisgICAg
ICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9sb2dp
Y2FsV2lkdGg7IH0KKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgpIGNvbnN0
IHsgcmV0dXJuIG1fbG9naWNhbExlZnQ7IH0KKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dp
Y2FsUmlnaHQoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsTGVmdCgpICsgbG9naWNhbFdpZHRoKCk7
IH0KKworICAgICAgICBjb25zdCBMaW5lUnVuOjpFeHBhbnNpb24mIGV4cGFuc2lvbigpIGNvbnN0
IHsgcmV0dXJuIG1fZXhwYW5zaW9uOyB9CisgICAgICAgIGJvb2wgaGFzRXhwYW5zaW9uT3Bwb3J0
dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7IH0KKyAg
ICAgICAgRXhwYW5zaW9uQmVoYXZpb3IgZXhwYW5zaW9uQmVoYXZpb3IoKSBjb25zdDsKKyAgICAg
ICAgdW5zaWduZWQgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1f
ZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudDsgfQorCisgICAgICAgIGJvb2wgaGFzVHJhaWxpbmdX
aGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlICE9IFRy
YWlsaW5nV2hpdGVzcGFjZTo6Tm9uZTsgfQorICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHRyYWls
aW5nV2hpdGVzcGFjZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3BhY2VX
aWR0aDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIGNsYXNzIExpbmU7CisKKyAg
ICAgICAgUnVuKGNvbnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
TGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOworICAgICAgICBSdW4oY29uc3Qg
SW5saW5lU29mdExpbmVCcmVha0l0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KTsK
KyAgICAgICAgUnVuKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxM
ZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7CisKKyAgICAgICAgdm9pZCBleHBh
bmQoY29uc3QgSW5saW5lVGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7
CisgICAgICAgIHZvaWQgbW92ZUhvcml6b250YWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkg
eyBtX2xvZ2ljYWxMZWZ0ICs9IG9mZnNldDsgfQorICAgICAgICB2b2lkIHNocmlua0hvcml6b250
YWxseShJbmxpbmVMYXlvdXRVbml0IHdpZHRoKSB7IG1fbG9naWNhbFdpZHRoIC09IHdpZHRoOyB9
CisgICAgICAgIHZvaWQgc2V0RXhwYW5zaW9uQmVoYXZpb3IoRXhwYW5zaW9uQmVoYXZpb3IpOwor
ICAgICAgICB2b2lkIHNldEhvcml6b250YWxFeHBhbnNpb24oSW5saW5lTGF5b3V0VW5pdCBsb2dp
Y2FsRXhwYW5zaW9uKTsKKyAgICAgICAgdm9pZCBzZXROZWVkc0h5cGhlbihJbmxpbmVMYXlvdXRV
bml0IGh5cGhlbkxvZ2ljYWxXaWR0aCk7CisKKyAgICAgICAgZW51bSBjbGFzcyBUcmFpbGluZ1do
aXRlc3BhY2UgeworICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgIE5vdENvbGxhcHNpYmxl
LAorICAgICAgICAgICAgQ29sbGFwc2libGUsCisgICAgICAgICAgICBDb2xsYXBzZWQKKyAgICAg
ICAgfTsKKyAgICAgICAgYm9vbCBoYXNDb2xsYXBzaWJsZVRyYWlsaW5nV2hpdGVzcGFjZSgpIGNv
bnN0IHsgcmV0dXJuIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9PSBUcmFpbGluZ1doaXRlc3Bh
Y2U6OkNvbGxhcHNpYmxlIHx8IGhhc0NvbGxhcHNlZFRyYWlsaW5nV2hpdGVzcGFjZSgpOyB9Cisg
ICAgICAgIGJvb2wgaGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1
cm4gbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Q29sbGFw
c2VkOyB9CisgICAgICAgIFRyYWlsaW5nV2hpdGVzcGFjZSB0cmFpbGluZ1doaXRlc3BhY2VUeXBl
KGNvbnN0IElubGluZVRleHRJdGVtJikgY29uc3Q7CisgICAgICAgIHZvaWQgcmVtb3ZlVHJhaWxp
bmdXaGl0ZXNwYWNlKCk7CisgICAgICAgIHZvaWQgdmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hp
dGVzcGFjZSgpOworCisgICAgICAgIGJvb2wgaGFzVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgY29u
c3Q7CisgICAgICAgIElubGluZUxheW91dFVuaXQgdHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgY29u
c3Q7CisgICAgICAgIHZvaWQgcmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7CisKKyAgICAg
ICAgSW5saW5lSXRlbTo6VHlwZSBtX3R5cGUgeyBJbmxpbmVJdGVtOjpUeXBlOjpUZXh0IH07Cisg
ICAgICAgIGNvbnN0IEJveCogbV9sYXlvdXRCb3ggeyBudWxscHRyIH07CisgICAgICAgIElubGlu
ZUxheW91dFVuaXQgbV9sb2dpY2FsTGVmdCB7IDAgfTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5p
dCBtX2xvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICAgICAgYm9vbCBtX3doaXRlc3BhY2VJc0V4cGFu
c2lvbk9wcG9ydHVuaXR5IHsgZmFsc2UgfTsKKyAgICAgICAgVHJhaWxpbmdXaGl0ZXNwYWNlIG1f
dHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSB7IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSB9OworICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IG1fdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGggeyAwIH07Cisg
ICAgICAgIE9wdGlvbmFsPExpbmVSdW46OlRleHQ+IG1fdGV4dENvbnRlbnQ7CisgICAgICAgIExp
bmVSdW46OkV4cGFuc2lvbiBtX2V4cGFuc2lvbjsKKyAgICAgICAgdW5zaWduZWQgbV9leHBhbnNp
b25PcHBvcnR1bml0eUNvdW50IHsgMCB9OworICAgIH07CisgICAgdXNpbmcgUnVuTGlzdCA9IFZl
Y3RvcjxSdW4sIDEwPjsKKyAgICBjb25zdCBSdW5MaXN0JiBydW5zKCkgY29uc3QgeyByZXR1cm4g
bV9ydW5zOyB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBhcHBlbmROb25CcmVha2FibGVTcGFjZShj
b25zdCBJbmxpbmVJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsV2lkdGgpOworICAgIHZvaWQgYXBwZW5kVGV4dENvbnRlbnQoY29uc3Qg
SW5saW5lVGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7CisgICAgdm9p
ZCBhcHBlbmROb25SZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mLCBJbmxp
bmVMYXlvdXRVbml0IG1hcmdpbkJveExvZ2ljYWxXaWR0aCk7CisgICAgdm9pZCBhcHBlbmRSZXBs
YWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IG1h
cmdpbkJveExvZ2ljYWxXaWR0aCk7CisgICAgdm9pZCBhcHBlbmRJbmxpbmVCb3hTdGFydChjb25z
dCBJbmxpbmVJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOworICAgIHZvaWQg
YXBwZW5kSW5saW5lQm94RW5kKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxv
Z2ljYWxXaWR0aCk7CisgICAgdm9pZCBhcHBlbmRMaW5lQnJlYWsoY29uc3QgSW5saW5lSXRlbSYp
OworICAgIHZvaWQgYXBwZW5kV29yZEJyZWFrT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5lSXRlbSYp
OworCisgICAgdm9pZCByZW1vdmVUcmFpbGluZ1RyaW1tYWJsZUNvbnRlbnQoKTsKKyAgICB2b2lk
IHZpc3VhbGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KElubGluZUxheW91dFVuaXQg
ZXh0cmFIb3Jpem9udGFsU3BhY2UpOworCisgICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3Q7CisKKyAgICBzdHJ1Y3QgVHJpbW1hYmxlVHJh
aWxpbmdDb250ZW50IHsKKyAgICAgICAgVHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KFJ1bkxpc3Qm
KTsKKworICAgICAgICB2b2lkIGFkZEZ1bGx5VHJpbW1hYmxlQ29udGVudChzaXplX3QgcnVuSW5k
ZXgsIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpOworICAgICAgICB2b2lkIGFkZFBh
cnRpYWxseVRyaW1tYWJsZUNvbnRlbnQoc2l6ZV90IHJ1bkluZGV4LCBJbmxpbmVMYXlvdXRVbml0
IHRyaW1tYWJsZVdpZHRoKTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCByZW1vdmUoKTsKKyAg
ICAgICAgSW5saW5lTGF5b3V0VW5pdCByZW1vdmVQYXJ0aWFsbHlUcmltbWFibGVDb250ZW50KCk7
CisKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fZnVs
bHlUcmltbWFibGVXaWR0aCArIG1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGg7IH0KKyAgICAgICAg
Ym9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIW1fZmlyc3RUcmltbWFibGVSdW5JbmRleC5o
YXNWYWx1ZSgpOyB9CisgICAgICAgIGJvb2wgaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxlKCkg
Y29uc3QgeyByZXR1cm4gbV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQ7IH0KKyAgICAgICAgYm9v
bCBpc1RyYWlsaW5nUnVuUGFydGlhbGx5VHJpbW1hYmxlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJ0
aWFsbHlUcmltbWFibGVXaWR0aDsgfQorCisgICAgICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHBy
aXZhdGU6CisgICAgICAgIFJ1bkxpc3QmIG1fcnVuczsKKyAgICAgICAgT3B0aW9uYWw8c2l6ZV90
PiBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXg7CisgICAgICAgIGJvb2wgbV9oYXNGdWxseVRyaW1t
YWJsZUNvbnRlbnQgeyBmYWxzZSB9OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fZnVsbHlU
cmltbWFibGVXaWR0aCB7IDAgfTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX3BhcnRpYWxs
eVRyaW1tYWJsZVdpZHRoIHsgMCB9OworICAgIH07CisKKyAgICBjb25zdCBJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCYgbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKKyAgICBSdW5MaXN0IG1fcnVu
czsKKyAgICBUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQgbV90cmltbWFibGVUcmFpbGluZ0NvbnRl
bnQ7CisgICAgSW5saW5lTGF5b3V0VW5pdCBtX2NvbnRlbnRMb2dpY2FsV2lkdGggeyAwIH07Cisg
ICAgc2l6ZV90IG1fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50IHsgMCB9OworICAgIE9w
dGlvbmFsPElubGluZUxheW91dFVuaXQ+IG1fdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggeyAwIH07
Cit9OworCitpbmxpbmUgdm9pZCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OnJlc2V0
KCkKK3sKKyAgICBtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCA9IGZhbHNlOworICAgIG1fZmly
c3RUcmltbWFibGVSdW5JbmRleCA9IHsgfTsKKyAgICBtX2Z1bGx5VHJpbW1hYmxlV2lkdGggPSB7
IH07CisgICAgbV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aCA9IHsgfTsKK30KKworaW5saW5lIExp
bmU6OlJ1bjo6VHJhaWxpbmdXaGl0ZXNwYWNlIExpbmU6OlJ1bjo6dHJhaWxpbmdXaGl0ZXNwYWNl
VHlwZShjb25zdCBJbmxpbmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0ZW0pIGNvbnN0Cit7CisgICAg
aWYgKCFpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKKyAgICAgICAgcmV0dXJuIFRyYWls
aW5nV2hpdGVzcGFjZTo6Tm9uZTsKKyAgICBpZiAoSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNl
cnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpCisgICAgICAgIHJldHVybiBUcmFpbGlu
Z1doaXRlc3BhY2U6Ok5vdENvbGxhcHNpYmxlOworICAgIGlmIChpbmxpbmVUZXh0SXRlbS5sZW5n
dGgoKSA9PSAxKQorICAgICAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzaWJs
ZTsKKyAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQ7Cit9CisKK2lubGlu
ZSB2b2lkIExpbmU6OlJ1bjo6c2V0TmVlZHNIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBoeXBoZW5M
b2dpY2FsV2lkdGgpCit7CisgICAgQVNTRVJUKG1fdGV4dENvbnRlbnQpOworICAgIG1fdGV4dENv
bnRlbnQtPnNldE5lZWRzSHlwaGVuKCk7CisgICAgbV9sb2dpY2FsV2lkdGggKz0gaHlwaGVuTG9n
aWNhbFdpZHRoOworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9y
bWF0dGluZy9JbmxpbmVMaW5lQm94LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lZDIxM2FlMDFjYWEzOTVhNzk4
NDIxMThiOTk5NzIzMWU4ZDIwZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3gu
Y3BwCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisg
KiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICog
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIklubGluZUxpbmVCb3guaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElO
R19DT05URVhUKQorCisjaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKKyNpbmNsdWRlICJM
YXlvdXRDb250YWluZXJCb3guaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExh
eW91dCB7CisKK0xpbmVCb3g6OklubGluZUxldmVsQm94OjpJbmxpbmVMZXZlbEJveChjb25zdCBC
b3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0
U2l6ZSBsb2dpY2FsU2l6ZSwgVHlwZSB0eXBlKQorICAgIDogbV9sYXlvdXRCb3gobWFrZVdlYWtQ
dHIobGF5b3V0Qm94KSkKKyAgICAsIG1fbG9naWNhbFJlY3QoeyB9LCBsb2dpY2FsTGVmdCwgbG9n
aWNhbFNpemUud2lkdGgoKSwgbG9naWNhbFNpemUuaGVpZ2h0KCkpCisgICAgLCBtX3R5cGUodHlw
ZSkKK3sKK30KKwordm9pZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0QmFzZWxpbmUoSW5s
aW5lTGF5b3V0VW5pdCBiYXNlbGluZSkKK3sKKyAgICAvLyBGSVhNRTogUmVtb3ZlIGxlZ2FjeSBy
b3VuZGluZy4KKyAgICBtX2Jhc2VsaW5lID0gcm91bmRUb0ludChiYXNlbGluZSk7Cit9CisKK3Zv
aWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldERlc2NlbnQoSW5saW5lTGF5b3V0VW5pdCBk
ZXNjZW50KQoreworICAgIC8vIEZJWE1FOiBSZW1vdmUgbGVnYWN5IHJvdW5kaW5nLgorICAgIG1f
ZGVzY2VudCA9IHJvdW5kVG9JbnQoZGVzY2VudCk7Cit9CisKK3ZvaWQgTGluZUJveDo6SW5saW5l
TGV2ZWxCb3g6OnNldExheW91dEJvdW5kcyhjb25zdCBMYXlvdXRCb3VuZHMmIGxheW91dEJvdW5k
cykKK3sKKyAgICAvLyBGSVhNRTogUmVtb3ZlIGxlZ2FjeSByb3VuZGluZy4KKyAgICBtX2xheW91
dEJvdW5kcyA9IHsgSW5saW5lTGF5b3V0VW5pdChyb3VuZFRvSW50KGxheW91dEJvdW5kcy5hc2Nl
bnQpKSwgSW5saW5lTGF5b3V0VW5pdChyb3VuZFRvSW50KGxheW91dEJvdW5kcy5kZXNjZW50KSkg
fTsKK30KKwordm9pZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0TG9naWNhbFRvcChJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxUb3ApCit7CisgICAgLy8gRklYTUU6IFJlbW92ZSBsZWdhY3kg
cm91bmRpbmcuCisgICAgbV9sb2dpY2FsUmVjdC5zZXRUb3Aocm91bmRUb0ludChsb2dpY2FsVG9w
KSk7Cit9CisKK3ZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldExvZ2ljYWxIZWlnaHQo
SW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KQoreworICAgIC8vIEZJWE1FOiBSZW1vdmUg
bGVnYWN5IHJvdW5kaW5nLgorICAgIG1fbG9naWNhbFJlY3Quc2V0SGVpZ2h0KHJvdW5kVG9JbnQo
bG9naWNhbEhlaWdodCkpOworfQorCit2b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94OjpzZXRI
YXNDb250ZW50KCkKK3sKKyAgICBBU1NFUlQoaXNJbmxpbmVCb3goKSk7CisgICAgbV9oYXNDb250
ZW50ID0gdHJ1ZTsKK30KKworYm9vbCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6aGFzTGluZUJv
eFJlbGF0aXZlQWxpZ25tZW50KCkgY29uc3QKK3sKKyAgICBhdXRvIHZlcnRpY2FsQWxpZ25tZW50
ID0gbGF5b3V0Qm94KCkuc3R5bGUoKS52ZXJ0aWNhbEFsaWduKCk7CisgICAgcmV0dXJuIHZlcnRp
Y2FsQWxpZ25tZW50ID09IFZlcnRpY2FsQWxpZ246OlRvcCB8fCB2ZXJ0aWNhbEFsaWdubWVudCA9
PSBWZXJ0aWNhbEFsaWduOjpCb3R0b207Cit9CisKK0xpbmVCb3g6OkxpbmVCb3goY29uc3QgQm94
JiByb290TGF5b3V0Qm94LCBjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgbG9naWNhbFRvcGxlZnQs
IElubGluZUxheW91dFVuaXQgbGluZUxvZ2ljYWxXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250
ZW50TG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCwgc2l6
ZV90IG5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCkKKyAgICA6IG1fbG9naWNhbFJlY3Qo
bG9naWNhbFRvcGxlZnQsIElubGluZUxheW91dFNpemUgeyBsaW5lTG9naWNhbFdpZHRoLCB7IH0g
fSkKKyAgICAsIG1fY29udGVudExvZ2ljYWxXaWR0aChjb250ZW50TG9naWNhbFdpZHRoKQorICAg
ICwgbV9yb290SW5saW5lQm94KHJvb3RMYXlvdXRCb3gsIGNvbnRlbnRMb2dpY2FsTGVmdCwgSW5s
aW5lTGF5b3V0U2l6ZSB7IGNvbnRlbnRMb2dpY2FsV2lkdGgsIHsgfSB9LCBJbmxpbmVMZXZlbEJv
eDo6VHlwZTo6Um9vdElubGluZUJveCkKK3sKKyAgICBtX25vblJvb3RJbmxpbmVMZXZlbEJveExp
c3QucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQp
OworICAgIG1fbm9uUm9vdElubGluZUxldmVsQm94TWFwLnJlc2VydmVJbml0aWFsQ2FwYWNpdHko
bm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50KTsKK30KKwordm9pZCBMaW5lQm94OjphZGRJ
bmxpbmVMZXZlbEJveChJbmxpbmVMZXZlbEJveCYmIGlubGluZUxldmVsQm94KQoreworICAgIG1f
Ym94VHlwZXMuYWRkKGlubGluZUxldmVsQm94LnR5cGUoKSk7CisgICAgbV9ub25Sb290SW5saW5l
TGV2ZWxCb3hNYXAuc2V0KCZpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKSwgbV9ub25Sb290SW5s
aW5lTGV2ZWxCb3hMaXN0LnNpemUoKSk7CisgICAgbV9ub25Sb290SW5saW5lTGV2ZWxCb3hMaXN0
LmFwcGVuZChXVEZNb3ZlKGlubGluZUxldmVsQm94KSk7Cit9CisKK0lubGluZVJlY3QgTGluZUJv
eDo6bG9naWNhbFJlY3RGb3JUZXh0UnVuKGNvbnN0IExpbmU6OlJ1biYgcnVuKSBjb25zdAorewor
ICAgIEFTU0VSVChydW4uaXNUZXh0KCkgfHwgcnVuLmlzU29mdExpbmVCcmVhaygpKTsKKyAgICBh
dXRvKiBwYXJlbnRJbmxpbmVCb3ggPSAmaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3gocnVuLmxh
eW91dEJveCgpLnBhcmVudCgpKTsKKyAgICBBU1NFUlQocGFyZW50SW5saW5lQm94LT5pc0lubGlu
ZUJveCgpKTsKKyAgICBhdXRvJiBmb250TWV0cmljcyA9IHBhcmVudElubGluZUJveC0+c3R5bGUo
KS5mb250TWV0cmljcygpOworICAgIGF1dG8gcnVubG9naWNhbFRvcCA9IHBhcmVudElubGluZUJv
eC0+bG9naWNhbFRvcCgpICsgcGFyZW50SW5saW5lQm94LT5iYXNlbGluZSgpIC0gZm9udE1ldHJp
Y3MuYXNjZW50KCk7CisKKyAgICB3aGlsZSAocGFyZW50SW5saW5lQm94ICE9ICZtX3Jvb3RJbmxp
bmVCb3ggJiYgIXBhcmVudElubGluZUJveC0+aGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkp
IHsKKyAgICAgICAgcGFyZW50SW5saW5lQm94ID0gJmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94
KHBhcmVudElubGluZUJveC0+bGF5b3V0Qm94KCkucGFyZW50KCkpOworICAgICAgICBBU1NFUlQo
cGFyZW50SW5saW5lQm94LT5pc0lubGluZUJveCgpKTsKKyAgICAgICAgcnVubG9naWNhbFRvcCAr
PSBwYXJlbnRJbmxpbmVCb3gtPmxvZ2ljYWxUb3AoKTsKKyAgICB9CisgICAgSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsSGVpZ2h0ID0gZm9udE1ldHJpY3MuaGVpZ2h0KCk7CisgICAgcmV0dXJuIHsg
cnVubG9naWNhbFRvcCwgbV9yb290SW5saW5lQm94LmxvZ2ljYWxMZWZ0KCkgKyBydW4ubG9naWNh
bExlZnQoKSwgcnVuLmxvZ2ljYWxXaWR0aCgpLCBsb2dpY2FsSGVpZ2h0IH07Cit9CisKK0lubGlu
ZVJlY3QgTGluZUJveDo6bG9naWNhbFJlY3RGb3JMaW5lQnJlYWtCb3goY29uc3QgQm94JiBsYXlv
dXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKTsK
KyAgICByZXR1cm4gbG9naWNhbFJlY3RGb3JJbmxpbmVMZXZlbEJveChsYXlvdXRCb3gpOworfQor
CitJbmxpbmVSZWN0IExpbmVCb3g6OmxvZ2ljYWxSZWN0Rm9ySW5saW5lTGV2ZWxCb3goY29uc3Qg
Qm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0lubGluZUxl
dmVsQm94KCkgfHwgbGF5b3V0Qm94LmlzTGluZUJyZWFrQm94KCkpOworICAgIC8vIElubGluZSBs
ZXZlbCBib3hlcyBhcmUgcmVsYXRpdmUgdG8gdGhlaXIgcGFyZW50IHVubGVzcyB0aGUgdmVydGlj
YWwgYWxpZ25tZW50IG1ha2VzIHRoZW0gcmVsYXRpdmUgdG8gdGhlIGxpbmUgYm94IChlLmcuIHRv
cCwgYm90dG9tKS4KKyAgICBhdXRvKiBpbmxpbmVCb3ggPSAmaW5saW5lTGV2ZWxCb3hGb3JMYXlv
dXRCb3gobGF5b3V0Qm94KTsKKyAgICBhdXRvIGlubGluZUJveExvZ2ljYWxSZWN0ID0gaW5saW5l
Qm94LT5sb2dpY2FsUmVjdCgpOworICAgIGlmIChpbmxpbmVCb3gtPmhhc0xpbmVCb3hSZWxhdGl2
ZUFsaWdubWVudCgpKQorICAgICAgICByZXR1cm4gaW5saW5lQm94TG9naWNhbFJlY3Q7CisKKyAg
ICAvLyBGYXN0IHBhdGggZm9yIGlubGluZSBsZXZlbCBib3hlcyBvbiB0aGUgcm9vdCBpbmxpbmUg
Ym94IChlLmcgPGRpdj48aW1nPjwvZGl2PikuCisgICAgaWYgKCZsYXlvdXRCb3gucGFyZW50KCkg
PT0gJm1fcm9vdElubGluZUJveC5sYXlvdXRCb3goKSkgeworICAgICAgICBpbmxpbmVCb3hMb2dp
Y2FsUmVjdC5tb3ZlVmVydGljYWxseShtX3Jvb3RJbmxpbmVCb3gubG9naWNhbFRvcCgpKTsKKyAg
ICAgICAgcmV0dXJuIGlubGluZUJveExvZ2ljYWxSZWN0OworICAgIH0KKworICAgIC8vIGUuZyA8
ZGl2PjxzcGFuPjxpbWc+PC9zcGFuPjwvZGl2PgorICAgIGF1dG8gaW5saW5lQm94QWJzb2x1dGVs
b2dpY2FsVG9wID0gaW5saW5lQm94TG9naWNhbFJlY3QudG9wKCk7CisgICAgd2hpbGUgKGlubGlu
ZUJveCAhPSAmbV9yb290SW5saW5lQm94ICYmICFpbmxpbmVCb3gtPmhhc0xpbmVCb3hSZWxhdGl2
ZUFsaWdubWVudCgpKSB7CisgICAgICAgIGlubGluZUJveCA9ICZpbmxpbmVMZXZlbEJveEZvckxh
eW91dEJveChpbmxpbmVCb3gtPmxheW91dEJveCgpLnBhcmVudCgpKTsKKyAgICAgICAgQVNTRVJU
KGlubGluZUJveC0+aXNJbmxpbmVCb3goKSk7CisgICAgICAgIGlubGluZUJveEFic29sdXRlbG9n
aWNhbFRvcCArPSBpbmxpbmVCb3gtPmxvZ2ljYWxUb3AoKTsKKyAgICB9CisgICAgcmV0dXJuIElu
bGluZVJlY3QgeyBpbmxpbmVCb3hBYnNvbHV0ZWxvZ2ljYWxUb3AsIGlubGluZUJveExvZ2ljYWxS
ZWN0LmxlZnQoKSwgaW5saW5lQm94TG9naWNhbFJlY3Qud2lkdGgoKSwgaW5saW5lQm94TG9naWNh
bFJlY3QuaGVpZ2h0KCkgfTsKK30KKworSW5saW5lUmVjdCBMaW5lQm94Ojpsb2dpY2FsQm9yZGVy
Qm94Rm9yQXRvbWljSW5saW5lTGV2ZWxCb3goY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEJv
eEdlb21ldHJ5JiBib3hHZW9tZXRyeSkgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94Lmlz
QXRvbWljSW5saW5lTGV2ZWxCb3goKSk7CisgICAgYXV0byBsb2dpY2FsUmVjdCA9IGxvZ2ljYWxS
ZWN0Rm9ySW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94KTsKKyAgICAvLyBJbmxpbmUgbGV2ZWwgYm94
ZXMgdXNlIHRoZWlyIG1hcmdpbiBib3ggZm9yIHZlcnRpY2FsIGFsaWdubWVudC4gTGV0J3MgY292
ZXJ0IHRoZW0gdG8gYm9yZGVyIGJveGVzLgorICAgIGxvZ2ljYWxSZWN0Lm1vdmVWZXJ0aWNhbGx5
KGJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpKTsKKyAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0g
Ym94R2VvbWV0cnkubWFyZ2luQmVmb3JlKCkgKyBib3hHZW9tZXRyeS5tYXJnaW5BZnRlcigpOwor
ICAgIGxvZ2ljYWxSZWN0LmV4cGFuZFZlcnRpY2FsbHkoLXZlcnRpY2FsTWFyZ2luKTsKKyAgICBy
ZXR1cm4gbG9naWNhbFJlY3Q7Cit9CisKK0lubGluZVJlY3QgTGluZUJveDo6bG9naWNhbEJvcmRl
ckJveEZvcklubGluZUJveChjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQm94R2VvbWV0cnkm
IGJveEdlb21ldHJ5KSBjb25zdAoreworICAgIGF1dG8gbG9naWNhbFJlY3QgPSBsb2dpY2FsUmVj
dEZvcklubGluZUxldmVsQm94KGxheW91dEJveCk7CisgICAgLy8gVGhpcyBsb2dpY2FsIHJlY3Qg
aXMgYXMgdGFsbCBhcyB0aGUgInRleHQiIGNvbnRlbnQgaXMuIExldCdzIGFkanVzdCB3aXRoIHZl
cnRpY2FsIGJvcmRlciBhbmQgcGFkZGluZy4KKyAgICBhdXRvIHZlcnRpY2FsQm9yZGVyQW5kUGFk
ZGluZyA9IGJveEdlb21ldHJ5LnZlcnRpY2FsQm9yZGVyKCkgKyBib3hHZW9tZXRyeS52ZXJ0aWNh
bFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpOworICAgIGxvZ2ljYWxSZWN0LmV4cGFuZFZlcnRpY2Fs
bHkodmVydGljYWxCb3JkZXJBbmRQYWRkaW5nKTsKKyAgICBsb2dpY2FsUmVjdC5tb3ZlVmVydGlj
YWxseSgtKGJveEdlb21ldHJ5LmJvcmRlclRvcCgpICsgYm94R2VvbWV0cnkucGFkZGluZ1RvcCgp
LnZhbHVlT3IoMF9sdSkpKTsKKyAgICByZXR1cm4gbG9naWNhbFJlY3Q7Cit9CisKK30gLy8gbmFt
ZXNwYWNlIExheW91dAorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0
dGluZy9JbmxpbmVMaW5lQm94LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5oCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjY5MmU5
NjYzODM4ZWQzMmE4ZGRiMTliNWZlYWQyNDY5Nzk5ZjFjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcv
SW5saW5lTGluZUJveC5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBv
bmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUg
IklubGluZUxpbmUuaCIKKyNpbmNsdWRlICJJbmxpbmVSZWN0LmgiCisjaW5jbHVkZSA8d3RmL0lz
b01hbGxvY0lubGluZXMuaD4KKyNpbmNsdWRlIDx3dGYvVW5pcXVlUmVmLmg+CisjaW5jbHVkZSA8
d3RmL1dlYWtQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7
CisKK2NsYXNzIEJveEdlb21ldHJ5OworY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Citj
bGFzcyBMaW5lQm94QnVpbGRlcjsKK3N0cnVjdCBTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ7
CisKKy8vICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fIExpbmUgQm94CisvLyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHwgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKKy8vIHwgLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tIFJvb3QgSW5s
aW5lIEJveAorLy8gfHwgICBfX19fXyAgICBfX18gICAgICBfX18gICAgICAgICAgfCAgICAgICAg
ICAgICAgICAgICAgfAorLy8gfHwgIHwgICAgICAgIC8gICBcICAgIC8gICBcICAgICAgICAgfCAg
SW5saW5lIExldmVsIEJveCAgfAorLy8gfHwgIHxfX19fXyAgfCAgICAgfCAgfCAgICAgfCAgICAg
ICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICBhc2NlbnQKKy8vIHx8ICB8ICAgICAgIHwgICAg
IHwgIHwgICAgIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKKy8vIHx8X198X19fX19f
X19cX19fL19fX19cX19fL19fX19fX19fX3xfX19fX19fX19fX19fX19fX19fX3xfX19fX19fIGFs
aWdubWVudF9iYXNlbGluZQorLy8gfHwKKy8vIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VudAorLy8gfHxfX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKy8vIHxfX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fCisvLyBUaGUgcmVzdWx0aW5nIHJlY3Rhbmd1bGFyIGFyZWEgdGhhdCBjb250YWlucyB0aGUg
Ym94ZXMgdGhhdCBmb3JtIGEgc2luZ2xlIGxpbmUgb2YgaW5saW5lLWxldmVsIGNvbnRlbnQgaXMg
Y2FsbGVkIGEgbGluZSBib3guCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWlubGluZS0z
LyNtb2RlbAorY2xhc3MgTGluZUJveCB7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Citw
dWJsaWM6CisgICAgc3RydWN0IElubGluZUxldmVsQm94IHsKKyAgICBwdWJsaWM6CisgICAgICAg
IHN0YXRpYyBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBjcmVhdGVJbmxpbmVCb3goY29uc3QgQm94
JiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
V2lkdGgpOworICAgICAgICBzdGF0aWMgTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggY3JlYXRlQXRv
bWljSW5saW5lTGV2ZWxCb3goY29uc3QgQm94JiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVm
dCwgSW5saW5lTGF5b3V0U2l6ZSk7CisgICAgICAgIHN0YXRpYyBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveCBjcmVhdGVMaW5lQnJlYWtCb3goY29uc3QgQm94JiwgSW5saW5lTGF5b3V0VW5pdCBsb2dp
Y2FsTGVmdCk7CisgICAgICAgIHN0YXRpYyBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBjcmVhdGVH
ZW5lcmljSW5saW5lTGV2ZWxCb3goY29uc3QgQm94JiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
TGVmdCk7CisKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBiYXNlbGluZSgpIGNvbnN0IHsgcmV0
dXJuIG1fYmFzZWxpbmU7IH0KKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gZGVz
Y2VudCgpIGNvbnN0IHsgcmV0dXJuIG1fZGVzY2VudDsgfQorICAgICAgICAvLyBTZWUgaHR0cHM6
Ly93d3cudzMub3JnL1RSL2Nzcy1pbmxpbmUtMy8jbGF5b3V0LWJvdW5kcworICAgICAgICBzdHJ1
Y3QgTGF5b3V0Qm91bmRzIHsKKyAgICAgICAgICAgIElubGluZUxheW91dFVuaXQgaGVpZ2h0KCkg
Y29uc3QgeyByZXR1cm4gYXNjZW50ICsgZGVzY2VudDsgfQorICAgICAgICAgICAgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IExheW91dEJvdW5kcyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIGFzY2VudCA9
PSBvdGhlci5hc2NlbnQgJiYgZGVzY2VudCA9PSBvdGhlci5kZXNjZW50OyB9CisKKyAgICAgICAg
ICAgIElubGluZUxheW91dFVuaXQgYXNjZW50IHsgMCB9OworICAgICAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCBkZXNjZW50IHsgMCB9OworICAgICAgICB9OworICAgICAgICBMYXlvdXRCb3VuZHMg
bGF5b3V0Qm91bmRzKCkgY29uc3QgeyByZXR1cm4gbV9sYXlvdXRCb3VuZHM7IH0KKworICAgICAg
ICBib29sIGhhc0NvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX2hhc0NvbnRlbnQ7IH0KKyAgICAg
ICAgdm9pZCBzZXRIYXNDb250ZW50KCk7CisKKyAgICAgICAgVmVydGljYWxBbGlnbiB2ZXJ0aWNh
bEFsaWduKCkgY29uc3QgeyByZXR1cm4gbGF5b3V0Qm94KCkuc3R5bGUoKS52ZXJ0aWNhbEFsaWdu
KCk7IH0KKyAgICAgICAgY29uc3QgQm94JiBsYXlvdXRCb3goKSBjb25zdCB7IHJldHVybiAqbV9s
YXlvdXRCb3g7IH0KKyAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKCkgY29uc3QgeyBy
ZXR1cm4gbV9sYXlvdXRCb3gtPnN0eWxlKCk7IH0KKworICAgICAgICBib29sIGlzSW5saW5lQm94
KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IFR5cGU6OklubGluZUJveCB8fCBtX3R5cGUgPT0g
VHlwZTo6Um9vdElubGluZUJveDsgfQorICAgICAgICBib29sIGlzUm9vdElubGluZUJveCgpIGNv
bnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBUeXBlOjpSb290SW5saW5lQm94OyB9CisgICAgICAgIGJv
b2wgaXNBdG9taWNJbmxpbmVMZXZlbEJveCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBUeXBl
OjpBdG9taWNJbmxpbmVMZXZlbEJveDsgfQorICAgICAgICBib29sIGlzTGluZUJyZWFrQm94KCkg
Y29uc3QgeyByZXR1cm4gbV90eXBlID09IFR5cGU6OkxpbmVCcmVha0JveDsgfQorICAgICAgICBi
b29sIGhhc0xpbmVCb3hSZWxhdGl2ZUFsaWdubWVudCgpIGNvbnN0OworCisgICAgICAgIGVudW0g
Y2xhc3MgVHlwZSA6IHVpbnQ4X3QgeworICAgICAgICAgICAgSW5saW5lQm94ICAgICAgICAgICAg
ID0gMSA8PCAwLAorICAgICAgICAgICAgUm9vdElubGluZUJveCAgICAgICAgID0gMSA8PCAxLAor
ICAgICAgICAgICAgQXRvbWljSW5saW5lTGV2ZWxCb3ggID0gMSA8PCAyLAorICAgICAgICAgICAg
TGluZUJyZWFrQm94ICAgICAgICAgID0gMSA8PCAzLAorICAgICAgICAgICAgR2VuZXJpY0lubGlu
ZUxldmVsQm94ID0gMSA8PCA0CisgICAgICAgIH07CisgICAgICAgIFR5cGUgdHlwZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdHlwZTsgfQorCisgICAgICAgIElubGluZUxldmVsQm94KGNvbnN0IEJveCYs
IElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFNpemUsIFR5cGUpOwor
ICAgICAgICBJbmxpbmVMZXZlbEJveCgpID0gZGVmYXVsdDsKKworICAgIHByaXZhdGU6CisgICAg
ICAgIGZyaWVuZCBzdHJ1Y3QgU2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50OworICAgICAgICBm
cmllbmQgY2xhc3MgTGluZUJveEJ1aWxkZXI7CisgICAgICAgIGZyaWVuZCBjbGFzcyBMaW5lQm94
OworCisgICAgICAgIGNvbnN0IElubGluZVJlY3QmIGxvZ2ljYWxSZWN0KCkgY29uc3QgeyByZXR1
cm4gbV9sb2dpY2FsUmVjdDsgfQorICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxUb3Ao
KSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0LnRvcCgpOyB9CisgICAgICAgIElubGluZUxh
eW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3QuYm90
dG9tKCk7IH0KKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgpIGNvbnN0IHsg
cmV0dXJuIG1fbG9naWNhbFJlY3QubGVmdCgpOyB9CisgICAgICAgIElubGluZUxheW91dFVuaXQg
bG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC53aWR0aCgpOyB9Cisg
ICAgICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1f
bG9naWNhbFJlY3QuaGVpZ2h0KCk7IH0KKworICAgICAgICB2b2lkIHNldExvZ2ljYWxXaWR0aChJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkgeyBtX2xvZ2ljYWxSZWN0LnNldFdpZHRoKGxv
Z2ljYWxXaWR0aCk7IH0KKyAgICAgICAgdm9pZCBzZXRMb2dpY2FsSGVpZ2h0KElubGluZUxheW91
dFVuaXQpOworICAgICAgICB2b2lkIHNldExvZ2ljYWxUb3AoSW5saW5lTGF5b3V0VW5pdCk7Cisg
ICAgICAgIHZvaWQgc2V0QmFzZWxpbmUoSW5saW5lTGF5b3V0VW5pdCk7CisgICAgICAgIHZvaWQg
c2V0RGVzY2VudChJbmxpbmVMYXlvdXRVbml0KTsKKyAgICAgICAgdm9pZCBzZXRMYXlvdXRCb3Vu
ZHMoY29uc3QgTGF5b3V0Qm91bmRzJik7CisKKyAgICBwcml2YXRlOgorICAgICAgICBXZWFrUHRy
PGNvbnN0IEJveD4gbV9sYXlvdXRCb3g7CisgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNvbWJpbmF0
aW9uIG9mIG1hcmdpbiBhbmQgYm9yZGVyIGJveGVzLiBJbmxpbmUgbGV2ZWwgYm94ZXMgYXJlIHZl
cnRpY2FsbHkgYWxpZ25lZCB1c2luZyB0aGVpciBtYXJnaW4gYm94ZXMuCisgICAgICAgIElubGlu
ZVJlY3QgbV9sb2dpY2FsUmVjdDsKKyAgICAgICAgTGF5b3V0Qm91bmRzIG1fbGF5b3V0Qm91bmRz
OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fYmFzZWxpbmUgeyAwIH07CisgICAgICAgIE9w
dGlvbmFsPElubGluZUxheW91dFVuaXQ+IG1fZGVzY2VudDsKKyAgICAgICAgYm9vbCBtX2hhc0Nv
bnRlbnQgeyBmYWxzZSB9OworICAgICAgICBUeXBlIG1fdHlwZSB7IFR5cGU6OklubGluZUJveCB9
OworICAgIH07CisKKyAgICBMaW5lQm94KGNvbnN0IEJveCYgcm9vdExheW91dEJveCwgY29uc3Qg
SW5saW5lTGF5b3V0UG9pbnQmIGxvZ2ljYWxUb3BMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGNvbnRl
bnRMb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsaW5lTG9naWNhbFdpZHRoLCBJbmxpbmVM
YXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgsIHNpemVfdCBub25TcGFubmluZ0lubGluZUxl
dmVsQm94Q291bnQpOworCisgICAgY29uc3QgSW5saW5lUmVjdCYgbG9naWNhbFJlY3QoKSBjb25z
dCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0OyB9CisgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
V2lkdGgoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsU2l6ZSgpLndpZHRoKCk7IH0KKyAgICBJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsU2l6ZSgp
LmhlaWdodCgpOyB9CisgICAgSW5saW5lTGF5b3V0UG9pbnQgbG9naWNhbFRvcExlZnQoKSBjb25z
dCB7IHJldHVybiBsb2dpY2FsUmVjdCgpLnRvcExlZnQoKTsgfQorICAgIElubGluZUxheW91dFNp
emUgbG9naWNhbFNpemUoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVjdCgpLnNpemUoKTsgfQor
ICAgIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJu
IG1fY29udGVudExvZ2ljYWxXaWR0aDsgfQorCisgICAgLy8gTm90ZSB0aGF0IHRoZSBsaW5lIGNh
biBoYXZlIG1hbnkgaW5saW5lIGJveGVzIGFuZCBiZSAiZW1wdHkiIHRoZSBzYW1lIHRpbWUgZS5n
LiA8ZGl2PjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PC9kaXY+CisgICAgYm9vbCBoYXNDb250
ZW50KCkgY29uc3QgeyByZXR1cm4gbV9oYXNDb250ZW50OyB9CisgICAgYm9vbCBoYXNJbmxpbmVC
b3goKSBjb25zdCB7IHJldHVybiBtX2JveFR5cGVzLmNvbnRhaW5zKElubGluZUxldmVsQm94OjpU
eXBlOjpJbmxpbmVCb3gpOyB9CisgICAgYm9vbCBoYXNOb25JbmxpbmVCb3goKSBjb25zdCB7IHJl
dHVybiBtX2JveFR5cGVzLmNvbnRhaW5zQW55KHsgSW5saW5lTGV2ZWxCb3g6OlR5cGU6OkF0b21p
Y0lubGluZUxldmVsQm94LCBJbmxpbmVMZXZlbEJveDo6VHlwZTo6TGluZUJyZWFrQm94LCBJbmxp
bmVMZXZlbEJveDo6VHlwZTo6R2VuZXJpY0lubGluZUxldmVsQm94IH0pOyB9CisgICAgYm9vbCBo
YXNBdG9taWNJbmxpbmVMZXZlbEJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYm94VHlwZXMuY29udGFp
bnMoSW5saW5lTGV2ZWxCb3g6OlR5cGU6OkF0b21pY0lubGluZUxldmVsQm94KTsgfQorCisgICAg
Y29uc3QgSW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGNvbnN0IEJv
eCYgbGF5b3V0Qm94KSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PExpbmVCb3gmPigqdGhpcyku
aW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3gobGF5b3V0Qm94KTsgfQorCisgICAgSW5saW5lUmVj
dCBsb2dpY2FsUmVjdEZvclRleHRSdW4oY29uc3QgTGluZTo6UnVuJikgY29uc3Q7CisgICAgSW5s
aW5lUmVjdCBsb2dpY2FsUmVjdEZvckxpbmVCcmVha0JveChjb25zdCBCb3gmKSBjb25zdDsKKyAg
ICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9yUm9vdElubGluZUJveCgpIGNvbnN0IHsgcmV0dXJu
IG1fcm9vdElubGluZUJveC5sb2dpY2FsUmVjdCgpOyB9CisgICAgSW5saW5lUmVjdCBsb2dpY2Fs
Qm9yZGVyQm94Rm9yQXRvbWljSW5saW5lTGV2ZWxCb3goY29uc3QgQm94JiwgY29uc3QgQm94R2Vv
bWV0cnkmKSBjb25zdDsKKyAgICBJbmxpbmVSZWN0IGxvZ2ljYWxCb3JkZXJCb3hGb3JJbmxpbmVC
b3goY29uc3QgQm94JiwgY29uc3QgQm94R2VvbWV0cnkmKSBjb25zdDsKKworICAgIGNvbnN0IElu
bGluZUxldmVsQm94JiByb290SW5saW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV9yb290SW5saW5l
Qm94OyB9CisgICAgdXNpbmcgSW5saW5lTGV2ZWxCb3hMaXN0ID0gVmVjdG9yPElubGluZUxldmVs
Qm94PjsKKyAgICBjb25zdCBJbmxpbmVMZXZlbEJveExpc3QmIG5vblJvb3RJbmxpbmVMZXZlbEJv
eGVzKCkgY29uc3QgeyByZXR1cm4gbV9ub25Sb290SW5saW5lTGV2ZWxCb3hMaXN0OyB9CisKKyAg
ICBJbmxpbmVMYXlvdXRVbml0IGFsaWdubWVudEJhc2VsaW5lKCkgY29uc3QgeyByZXR1cm4gbV9y
b290SW5saW5lQm94LmxvZ2ljYWxUb3AoKSArIG1fcm9vdElubGluZUJveC5iYXNlbGluZSgpOyB9
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIExpbmVCb3hCdWlsZGVyOworCisgICAgdm9p
ZCBzZXRMb2dpY2FsSGVpZ2h0KElubGluZUxheW91dFVuaXQgbG9naWNhbEhlaWdodCkgeyBtX2xv
Z2ljYWxSZWN0LnNldEhlaWdodChsb2dpY2FsSGVpZ2h0KTsgfQorCisgICAgdm9pZCBhZGRJbmxp
bmVMZXZlbEJveChJbmxpbmVMZXZlbEJveCYmKTsKKyAgICBJbmxpbmVMZXZlbEJveExpc3QmIG5v
blJvb3RJbmxpbmVMZXZlbEJveGVzKCkgeyByZXR1cm4gbV9ub25Sb290SW5saW5lTGV2ZWxCb3hM
aXN0OyB9CisKKyAgICBJbmxpbmVMZXZlbEJveCYgcm9vdElubGluZUJveCgpIHsgcmV0dXJuIG1f
cm9vdElubGluZUJveDsgfQorCisgICAgSW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94Rm9y
TGF5b3V0Qm94KGNvbnN0IEJveCYgbGF5b3V0Qm94KSB7IHJldHVybiAmbGF5b3V0Qm94ID09ICZt
X3Jvb3RJbmxpbmVCb3gubGF5b3V0Qm94KCkgPyBtX3Jvb3RJbmxpbmVCb3ggOiBtX25vblJvb3RJ
bmxpbmVMZXZlbEJveExpc3RbbV9ub25Sb290SW5saW5lTGV2ZWxCb3hNYXAuZ2V0KCZsYXlvdXRC
b3gpXTsgfQorICAgIElubGluZVJlY3QgbG9naWNhbFJlY3RGb3JJbmxpbmVMZXZlbEJveChjb25z
dCBCb3gmIGxheW91dEJveCkgY29uc3Q7CisKKyAgICB2b2lkIHNldEhhc0NvbnRlbnQoYm9vbCBo
YXNDb250ZW50KSB7IG1faGFzQ29udGVudCA9IGhhc0NvbnRlbnQ7IH0KKworcHJpdmF0ZToKKyAg
ICBJbmxpbmVSZWN0IG1fbG9naWNhbFJlY3Q7CisgICAgSW5saW5lTGF5b3V0VW5pdCBtX2NvbnRl
bnRMb2dpY2FsV2lkdGggeyAwIH07CisgICAgYm9vbCBtX2hhc0NvbnRlbnQgeyBmYWxzZSB9Owor
ICAgIE9wdGlvblNldDxJbmxpbmVMZXZlbEJveDo6VHlwZT4gbV9ib3hUeXBlczsKKworICAgIElu
bGluZUxldmVsQm94IG1fcm9vdElubGluZUJveDsKKyAgICBJbmxpbmVMZXZlbEJveExpc3QgbV9u
b25Sb290SW5saW5lTGV2ZWxCb3hMaXN0OworCisgICAgSGFzaE1hcDxjb25zdCBCb3gqLCBzaXpl
X3Q+IG1fbm9uUm9vdElubGluZUxldmVsQm94TWFwOworfTsKKworaW5saW5lIExpbmVCb3g6Oklu
bGluZUxldmVsQm94IExpbmVCb3g6OklubGluZUxldmVsQm94OjpjcmVhdGVBdG9taWNJbmxpbmVM
ZXZlbEJveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVm
dCwgSW5saW5lTGF5b3V0U2l6ZSBsb2dpY2FsU2l6ZSkKK3sKKyAgICByZXR1cm4gTGluZUJveDo6
SW5saW5lTGV2ZWxCb3ggeyBsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCBsb2dpY2FsU2l6ZSwgVHlw
ZTo6QXRvbWljSW5saW5lTGV2ZWxCb3ggfTsKK30KKworaW5saW5lIExpbmVCb3g6OklubGluZUxl
dmVsQm94IExpbmVCb3g6OklubGluZUxldmVsQm94OjpjcmVhdGVJbmxpbmVCb3goY29uc3QgQm94
JiBsYXlvdXRCb3gsIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFVu
aXQgbG9naWNhbFdpZHRoKQoreworICAgIHJldHVybiBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCB7
IGxheW91dEJveCwgbG9naWNhbExlZnQsIElubGluZUxheW91dFNpemUgeyBsb2dpY2FsV2lkdGgs
IHsgfSB9LCBUeXBlOjpJbmxpbmVCb3ggfTsKK30KKworaW5saW5lIExpbmVCb3g6OklubGluZUxl
dmVsQm94IExpbmVCb3g6OklubGluZUxldmVsQm94OjpjcmVhdGVMaW5lQnJlYWtCb3goY29uc3Qg
Qm94JiBsYXlvdXRCb3gsIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQpCit7CisgICAgcmV0
dXJuIExpbmVCb3g6OklubGluZUxldmVsQm94IHsgbGF5b3V0Qm94LCBsb2dpY2FsTGVmdCwgSW5s
aW5lTGF5b3V0U2l6ZSB7IH0sIFR5cGU6OkxpbmVCcmVha0JveCB9OworfQorCitpbmxpbmUgTGlu
ZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUdlbmVy
aWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBs
b2dpY2FsTGVmdCkKK3sKKyAgICByZXR1cm4gTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggeyBsYXlv
dXRCb3gsIGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgfSwgVHlwZTo6R2VuZXJpY0lu
bGluZUxldmVsQm94IH07Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5l
TGluZUJ1aWxkZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCdWlsZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42YzYy
NmVhMGVlNWE2M2E0YTk2MmIxNTVjZTYxMDY1MzBmY2UyMmYyCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5n
L0lubGluZUxpbmVCdWlsZGVyLmNwcApAQCAtMCwwICsxLDg1NyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbmxpbmVMaW5lQnVpbGRlci5oIgorCisjaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGbG9hdGluZ0Nv
bnRleHQuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUg
IkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVkZSAi
TGF5b3V0U3RhdGUuaCIKKyNpbmNsdWRlICJUZXh0VXRpbC5oIgorI2luY2x1ZGUgPHd0Zi91bmlj
b2RlL0NoYXJhY3Rlck5hbWVzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBM
YXlvdXQgeworCitzdGF0aWMgaW5saW5lIGJvb2wgZW5kc1dpdGhTb2Z0V3JhcE9wcG9ydHVuaXR5
KGNvbnN0IElubGluZVRleHRJdGVtJiBjdXJyZW50VGV4dEl0ZW0sIGNvbnN0IElubGluZVRleHRJ
dGVtJiBuZXh0SW5saW5lVGV4dEl0ZW0pCit7CisgICAgQVNTRVJUKCFuZXh0SW5saW5lVGV4dEl0
ZW0uaXNXaGl0ZXNwYWNlKCkpOworICAgIC8vIFdlIGFyZSBhdCB0aGUgcG9zaXRpb24gYWZ0ZXIg
YSB3aGl0ZXNwYWNlLgorICAgIGlmIChjdXJyZW50VGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpCisg
ICAgICAgIHJldHVybiB0cnVlOworICAgIC8vIFdoZW4gYm90aCB0aGVzZSBub24td2hpdGVzcGFj
ZSBydW5zIGJlbG9uZyB0byB0aGUgc2FtZSBsYXlvdXQgYm94LCBpdCdzIGd1YXJhbnRlZWQgdGhh
dAorICAgIC8vIHRoZXkgYXJlIHNwbGl0IGF0IGEgc29mdCBicmVha2luZyBvcHBvcnR1bml0eS4g
U2VlIElubGluZVRleHRJdGVtOjptb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24uCisgICAgaWYg
KCZjdXJyZW50VGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpID09ICZuZXh0SW5saW5lVGV4dEl0ZW0u
aW5saW5lVGV4dEJveCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBOb3cgd2UgbmVl
ZCB0byBjb2xsZWN0IGF0IGxlYXN0IDMgYWRqYWNlbnQgY2hhcmFjdGVycyB0byBiZSBhYmxlIHRv
IG1ha2UgYSBkZWNpc2lvbiB3aGV0aGVyIHRoZSBwcmV2aW91cyB0ZXh0IGl0ZW0gZW5kcyB3aXRo
IGJyZWFraW5nIG9wcG9ydHVuaXR5LgorICAgIC8vIFtleC1dW2FtcGxlXSA8LSBzZWNvbmQgdG8g
bGFzdFt4XSBsYXN0Wy1dIGN1cnJlbnRbYV0KKyAgICAvLyBXZSBuZWVkIGF0IGxlYXN0IDEgY2hh
cmFjdGVyIGluIHRoZSBjdXJyZW50IGlubGluZSB0ZXh0IGl0ZW0gYW5kIDIgbW9yZSBmcm9tIHBy
ZXZpb3VzIGlubGluZSBpdGVtcy4KKyAgICBhdXRvIHByZXZpb3VzQ29udGVudCA9IGN1cnJlbnRU
ZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpOworICAgIGF1dG8gbGluZUJyZWFrSXRl
cmF0b3IgPSBMYXp5TGluZUJyZWFrSXRlcmF0b3IgeyBuZXh0SW5saW5lVGV4dEl0ZW0uaW5saW5l
VGV4dEJveCgpLmNvbnRlbnQoKSB9OworICAgIGF1dG8gcHJldmlvdXNDb250ZW50TGVuZ3RoID0g
cHJldmlvdXNDb250ZW50Lmxlbmd0aCgpOworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgbG9vayBp
bnRvIHRoZSBlbnRpcmUgdW5jb21taXR0ZWQgY29udGVudCBmb3IgbW9yZSB0ZXh0IGNvbnRleHQu
CisgICAgVUNoYXIgbGFzdENoYXJhY3RlciA9IHByZXZpb3VzQ29udGVudExlbmd0aCA/IHByZXZp
b3VzQ29udGVudFtwcmV2aW91c0NvbnRlbnRMZW5ndGggLSAxXSA6IDA7CisgICAgaWYgKGxhc3RD
aGFyYWN0ZXIgPT0gc29mdEh5cGhlbiAmJiBjdXJyZW50VGV4dEl0ZW0uc3R5bGUoKS5oeXBoZW5z
KCkgPT0gSHlwaGVuczo6Tm9uZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIFVDaGFyIHNl
Y29uZFRvTGFzdENoYXJhY3RlciA9IHByZXZpb3VzQ29udGVudExlbmd0aCA+IDEgPyBwcmV2aW91
c0NvbnRlbnRbcHJldmlvdXNDb250ZW50TGVuZ3RoIC0gMl0gOiAwOworICAgIGxpbmVCcmVha0l0
ZXJhdG9yLnNldFByaW9yQ29udGV4dChsYXN0Q2hhcmFjdGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0
ZXIpOworICAgIC8vIE5vdyBjaGVjayBpZiB3ZSBjYW4gYnJlYWsgcmlnaHQgYXQgdGhlIGlubGlu
ZSBpdGVtIGJvdW5kYXJ5LgorICAgIC8vIFdpdGggdGhlIFtleC1hbXBsZV0sIGZpbmROZXh0QnJl
YWthYmxlUG9zaXRpb24gc2hvdWxkIHJldHVybiB0aGUgc3RhcnRQb3NpdGlvbiAoMCkuCisgICAg
Ly8gRklYTUU6IENoZWNrIGlmIHRoZXJlJ3MgYSBtb3JlIGNvcnJlY3Qgd2F5IG9mIGZpbmRpbmcg
YnJlYWtpbmcgb3Bwb3J0dW5pdGllcy4KKyAgICByZXR1cm4gIVRleHRVdGlsOjpmaW5kTmV4dEJy
ZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCAwLCBuZXh0SW5saW5lVGV4dEl0ZW0u
c3R5bGUoKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F0U29mdFdyYXBPcHBvcnR1bml0
eShjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5lRm9ybWF0dGluZ0NvbnRleHQs
IGNvbnN0IElubGluZUl0ZW0mIGN1cnJlbnQsIGNvbnN0IElubGluZUl0ZW0mIG5leHQpCit7Cisg
ICAgLy8gImlzIGF0IiBzaW1wbGUgbWVhbnMgdGhhdCB0aGVyZSdzIGEgc29mdCB3cmFwIG9wcG9y
dHVuaXR5IHJpZ2h0IGFmdGVyIHRoZSBbY3VycmVudF0uCisgICAgLy8gW3RleHRdWyBdW3RleHRd
W2lubGluZSBib3ggc3RhcnRdLi4uICg8ZGl2PnRleHQgY29udGVudDxzcGFuPi4uPC9kaXY+KQor
ICAgIC8vIHNvZnQgd3JhcCBpbmRleGVzOiAwIGFuZCAxIGRlZmluaXRlbHksIDIgZGVwZW5kcyBv
biB0aGUgY29udGVudCBhZnRlciB0aGUgW2lubGluZSBib3ggc3RhcnRdLgorCisgICAgLy8gaHR0
cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy10ZXh0LTMvI2xpbmUtYnJlYWstZGV0YWlscworICAg
IC8vIEZpZ3VyZSBvdXQgaWYgdGhlIG5ldyBpbmNvbWluZyBjb250ZW50IHB1dHMgdGhlIHVuY29t
bWl0dGVkIGNvbnRlbnQgb24gYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkuCisgICAgLy8gZS5nLiBb
aW5saW5lIGJveCBzdGFydF1bcHJpb3JfY29udGludW91c19jb250ZW50XVtpbmxpbmUgYm94IGVu
ZF0gKDxzcGFuPnByaW9yX2NvbnRpbnVvdXNfY29udGVudDwvc3Bhbj4pCisgICAgLy8gQW4gaW5j
b21pbmcgPGltZz4gYm94IHdvdWxkIGVuYWJsZSB1cyB0byBjb21taXQgdGhlICI8c3Bhbj5wcmlv
cl9jb250aW51b3VzX2NvbnRlbnQ8L3NwYW4+IiBjb250ZW50CisgICAgLy8gYnV0IGFuIGluY29t
aW5nIHRleHQgY29udGVudCB3b3VsZCBub3QgbmVjZXNzYXJpbHkuCisgICAgQVNTRVJUKGN1cnJl
bnQuaXNUZXh0KCkgfHwgY3VycmVudC5pc0JveCgpIHx8IGN1cnJlbnQuaXNGbG9hdCgpKTsKKyAg
ICBBU1NFUlQobmV4dC5pc1RleHQoKSB8fCBuZXh0LmlzQm94KCkgfHwgbmV4dC5pc0Zsb2F0KCkp
OworICAgIGlmIChjdXJyZW50LmlzVGV4dCgpICYmIG5leHQuaXNUZXh0KCkpIHsKKyAgICAgICAg
YXV0byYgY3VycmVudElubGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGN1
cnJlbnQpOworICAgICAgICBhdXRvJiBuZXh0SW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxp
bmVUZXh0SXRlbT4obmV4dCk7CisgICAgICAgIGlmIChjdXJyZW50SW5saW5lVGV4dEl0ZW0uaXNX
aGl0ZXNwYWNlKCkpIHsKKyAgICAgICAgICAgIC8vIFsgXVt0ZXh0XSA6IGFmdGVyIFt3aGl0ZXNw
YWNlXSBwb3NpdGlvbiBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eS4KKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChuZXh0SW5saW5lVGV4dEl0ZW0uaXNX
aGl0ZXNwYWNlKCkpIHsKKyAgICAgICAgICAgIC8vIFt0ZXh0XVsgXSAoPHNwYW4+dGV4dDwvc3Bh
bj4gKQorICAgICAgICAgICAgLy8gd2hpdGUtc3BhY2U6IGJyZWFrLXNwYWNlczogbGluZSBicmVh
a2luZyBvcHBvcnR1bml0eSBleGlzdHMgYWZ0ZXIgZXZlcnkgcHJlc2VydmVkIHdoaXRlIHNwYWNl
IGNoYXJhY3RlciwgYnV0IG5vdCBiZWZvcmUuCisgICAgICAgICAgICByZXR1cm4gbmV4dElubGlu
ZVRleHRJdGVtLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9IFdoaXRlU3BhY2U6OkJyZWFrU3BhY2Vz
OworICAgICAgICB9CisgICAgICAgIGlmIChjdXJyZW50LnN0eWxlKCkubGluZUJyZWFrKCkgPT0g
TGluZUJyZWFrOjpBbnl3aGVyZSB8fCBuZXh0LnN0eWxlKCkubGluZUJyZWFrKCkgPT0gTGluZUJy
ZWFrOjpBbnl3aGVyZSkgeworICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBzb2Z0IHdyYXAgb3Bw
b3J0dW5pdHkgYXJvdW5kIGV2ZXJ5IHR5cG9ncmFwaGljIGNoYXJhY3RlciB1bml0LCBpbmNsdWRp
bmcgYXJvdW5kIGFueSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIKKyAgICAgICAgICAgIC8vIG9yIHBy
ZXNlcnZlZCB3aGl0ZSBzcGFjZXMsIG9yIGluIHRoZSBtaWRkbGUgb2Ygd29yZHMuCisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBCb3RoIGN1cnJlbnQgYW5k
IG5leHQgaXRlbXMgYXJlIG5vbi13aGl0ZXNwYWNlIHRleHQuCisgICAgICAgIC8vIFt0ZXh0XVt0
ZXh0XSA6IGlzIGEgY29udGludW91cyBjb250ZW50LgorICAgICAgICAvLyBbdGV4dC1dW3RleHRd
IDogYWZ0ZXIgW2h5cGhlbl0gcG9zaXRpb24gaXMgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkuCisg
ICAgICAgIHJldHVybiBlbmRzV2l0aFNvZnRXcmFwT3Bwb3J0dW5pdHkoY3VycmVudElubGluZVRl
eHRJdGVtLCBuZXh0SW5saW5lVGV4dEl0ZW0pOworICAgIH0KKyAgICBpZiAoY3VycmVudC5pc0Zs
b2F0KCkgfHwgbmV4dC5pc0Zsb2F0KCkpIHsKKyAgICAgICAgLy8gV2hpbGUgZmxvYXRzIGFyZSBu
b3QgcGFydCBvZiB0aGUgaW5saW5lIGNvbnRlbnQgYW5kIHRoZXkgYXJlIG5vdCBzdXBwb3NlZCB0
byBpbnRyb2R1Y2Ugc29mdCB3cmFwIG9wcG9ydHVuaXRpZXMsCisgICAgICAgIC8vIGUuZy4gW3Rl
eHRdW2Zsb2F0IGJveF1bZmxvYXQgYm94XVt0ZXh0XVtmbG9hdCBib3hdW3RleHRdIGlzIGVzc2Vu
dGlhbGx5IGp1c3QgW3RleHRdW3RleHRdW3RleHRdCisgICAgICAgIC8vIGZpZ3VyaW5nIG91dCB3
aGV0aGVyIGEgZmxvYXQgKG9yIHNldCBvZiBmbG9hdHMpIHNob3VsZCBzdGF5IG9uIHRoZSBsaW5l
IG9yIG5vdCAoYW5kIGhhbmRsZSBwb3RlbnRpYWxseSBvdXQgb2Ygb3JkZXIgaW5saW5lIGl0ZW1z
KQorICAgICAgICAvLyBicmluZ3MgaW4gdW5uZWNlc3NhcnkgY29tcGxleGl0eS4KKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChjdXJyZW50LmlzQm94KCkgfHwgbmV4dC5pc0Jv
eCgpKSB7CisgICAgICAgIGF1dG8gaXNJbWFnZUNvbnRlbnQgPSBjdXJyZW50LmxheW91dEJveCgp
LmlzSW1hZ2UoKSB8fCBuZXh0LmxheW91dEJveCgpLmlzSW1hZ2UoKTsKKyAgICAgICAgaWYgKGlz
SW1hZ2VDb250ZW50KQorICAgICAgICAgICAgcmV0dXJuIGlubGluZUZvcm1hdHRpbmdDb250ZXh0
LnF1aXJrcygpLmhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdlKCk7CisgICAgICAgIC8vIFt0
ZXh0XVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF1baW5saW5lIGJveF0gKHRleHQ8
c3Bhbj48L3NwYW4+PGltZz4pIDogdGhlcmUncyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBiZXR3
ZWVuIHRoZSBbdGV4dF0gYW5kIFtpbWddLgorICAgICAgICAvLyBUaGUgbGluZSBicmVha2luZyBi
ZWhhdmlvciBvZiBhIHJlcGxhY2VkIGVsZW1lbnQgb3Igb3RoZXIgYXRvbWljIGlubGluZSBpcyBl
cXVpdmFsZW50IHRvIGFuIGlkZW9ncmFwaGljIGNoYXJhY3Rlci4KKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiB0cnVlOwor
fQorCitzdHJ1Y3QgTGluZUNhbmRpZGF0ZSB7CisgICAgTGluZUNhbmRpZGF0ZShib29sIGlnbm9y
ZVRyYWlsaW5nTGV0dGVyU3BhY2luZyk7CisKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICBzdHJ1
Y3QgSW5saW5lQ29udGVudCB7CisgICAgICAgIElubGluZUNvbnRlbnQoYm9vbCBpZ25vcmVUcmFp
bGluZ0xldHRlclNwYWNpbmcpOworCisgICAgICAgIGNvbnN0IElubGluZUNvbnRlbnRCcmVha2Vy
OjpDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQoKSBjb25zdCB7IHJldHVybiBt
X2NvbnRpbnVvdXNDb250ZW50OyB9CisgICAgICAgIGNvbnN0IElubGluZUl0ZW0qIHRyYWlsaW5n
TGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ0xpbmVCcmVhazsgfQorICAgICAg
ICBjb25zdCBJbmxpbmVJdGVtKiB0cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5KCkgY29uc3Qg
eyByZXR1cm4gbV90cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5OyB9CisKKyAgICAgICAgdm9p
ZCBhcHBlbmRJbmxpbmVJdGVtKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxv
Z2ljYWxXaWR0aCk7CisgICAgICAgIHZvaWQgYXBwZW5kVHJhaWxpbmdMaW5lQnJlYWsoY29uc3Qg
SW5saW5lSXRlbSYgbGluZUJyZWFrSXRlbSkgeyBtX3RyYWlsaW5nTGluZUJyZWFrID0gJmxpbmVC
cmVha0l0ZW07IH0KKyAgICAgICAgdm9pZCBhcHBlbmR0cmFpbGluZ1dvcmRCcmVha09wcG9ydHVu
aXR5KGNvbnN0IElubGluZUl0ZW0mIHdvcmRCcmVha0l0ZW0pIHsgbV90cmFpbGluZ1dvcmRCcmVh
a09wcG9ydHVuaXR5ID0gJndvcmRCcmVha0l0ZW07IH0KKyAgICAgICAgdm9pZCByZXNldCgpOwor
ICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2NvbnRpbnVvdXNDb250ZW50
LnJ1bnMoKS5pc0VtcHR5KCkgJiYgIXRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSAmJiAh
dHJhaWxpbmdMaW5lQnJlYWsoKTsgfQorICAgICAgICBib29sIGhhc0lubGluZUxldmVsQm94KCkg
Y29uc3QgeyByZXR1cm4gbV9oYXNJbmxpbmVMZXZlbEJveDsgfQorCisgICAgICAgIHZvaWQgc2V0
SGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KGJvb2wgaGFzVHJhaWxpbmdTb2Z0V3JhcE9w
cG9ydHVuaXR5KSB7IG1faGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5ID0gaGFzVHJhaWxp
bmdTb2Z0V3JhcE9wcG9ydHVuaXR5OyB9CisgICAgICAgIGJvb2wgaGFzVHJhaWxpbmdTb2Z0V3Jh
cE9wcG9ydHVuaXR5KCkgY29uc3QgeyByZXR1cm4gbV9oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0
dW5pdHk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgbV9pZ25vcmVUcmFpbGluZ0xl
dHRlclNwYWNpbmcgeyBmYWxzZSB9OworCisgICAgICAgIElubGluZUNvbnRlbnRCcmVha2VyOjpD
b250aW51b3VzQ29udGVudCBtX2NvbnRpbnVvdXNDb250ZW50OworICAgICAgICBjb25zdCBJbmxp
bmVJdGVtKiBtX3RyYWlsaW5nTGluZUJyZWFrIHsgbnVsbHB0ciB9OworICAgICAgICBjb25zdCBJ
bmxpbmVJdGVtKiBtX3RyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkgeyBudWxscHRyIH07Cisg
ICAgICAgIGJvb2wgbV9oYXNJbmxpbmVMZXZlbEJveCB7IGZhbHNlIH07CisgICAgICAgIGJvb2wg
bV9oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkgeyBmYWxzZSB9OworICAgIH07CisKKyAg
ICAvLyBDYW5kaWRhdGUgY29udGVudCBpcyBhIGNvbGxlY3Rpb24gb2YgaW5saW5lIGNvbnRlbnQg
b3IgYSBmbG9hdCBib3guCisgICAgSW5saW5lQ29udGVudCBpbmxpbmVDb250ZW50OworICAgIGNv
bnN0IElubGluZUl0ZW0qIGZsb2F0SXRlbSB7IG51bGxwdHIgfTsKK307CisKK0xpbmVDYW5kaWRh
dGU6OkxpbmVDYW5kaWRhdGUoYm9vbCBpZ25vcmVUcmFpbGluZ0xldHRlclNwYWNpbmcpCisgICAg
OiBpbmxpbmVDb250ZW50KGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKK3sKK30KKworTGlu
ZUNhbmRpZGF0ZTo6SW5saW5lQ29udGVudDo6SW5saW5lQ29udGVudChib29sIGlnbm9yZVRyYWls
aW5nTGV0dGVyU3BhY2luZykKKyAgICA6IG1faWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKGln
bm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKK3sKK30KKworaW5saW5lIHZvaWQgTGluZUNhbmRp
ZGF0ZTo6SW5saW5lQ29udGVudDo6YXBwZW5kSW5saW5lSXRlbShjb25zdCBJbmxpbmVJdGVtJiBp
bmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKK3sKKyAgICBBU1NFUlQo
aW5saW5lSXRlbS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlzQm94KCkgfHwgaW5saW5lSXRlbS5p
c0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKTsKKyAgICBh
dXRvIGNvbGxhcHNpYmxlV2lkdGggPSBbJl0oKSAtPiBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0
PiB7CisgICAgICAgIGlmICghaW5saW5lSXRlbS5pc1RleHQoKSkKKyAgICAgICAgICAgIHJldHVy
biB7IH07CisgICAgICAgIGF1dG8mIGlubGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4
dEl0ZW0+KGlubGluZUl0ZW0pOworICAgICAgICBpZiAoaW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNw
YWNlKCkgJiYgIUlubGluZVRleHRJdGVtOjpzaG91bGRQcmVzZXJ2ZVNwYWNlc0FuZFRhYnMoaW5s
aW5lVGV4dEl0ZW0pKSB7CisgICAgICAgICAgICAvLyBGdWxseSBjb2xsYXBzaWJsZSB0cmFpbGlu
ZyBjb250ZW50LgorICAgICAgICAgICAgcmV0dXJuIGxvZ2ljYWxXaWR0aDsKKyAgICAgICAgfQor
ICAgICAgICAvLyBDaGVjayBmb3IgcGFydGlhbGx5IGNvbGxhcHNpYmxlIGNvbnRlbnQuCisgICAg
ICAgIGlmIChtX2lnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKKyAgICAgICAgICAgIHJldHVy
biB7IH07CisgICAgICAgIGF1dG8gbGV0dGVyU3BhY2luZyA9IGlubGluZUl0ZW0uc3R5bGUoKS5s
ZXR0ZXJTcGFjaW5nKCk7CisgICAgICAgIGlmIChsZXR0ZXJTcGFjaW5nIDw9IDApCisgICAgICAg
ICAgICByZXR1cm4geyB9OworICAgICAgICBBU1NFUlQobG9naWNhbFdpZHRoID4gbGV0dGVyU3Bh
Y2luZyk7CisgICAgICAgIHJldHVybiBsZXR0ZXJTcGFjaW5nOworICAgIH07CisgICAgbV9jb250
aW51b3VzQ29udGVudC5hcHBlbmQoaW5saW5lSXRlbSwgbG9naWNhbFdpZHRoLCBjb2xsYXBzaWJs
ZVdpZHRoKCkpOworICAgIG1faGFzSW5saW5lTGV2ZWxCb3ggPSBtX2hhc0lubGluZUxldmVsQm94
IHx8IGlubGluZUl0ZW0uaXNCb3goKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKTsK
K30KKworaW5saW5lIHZvaWQgTGluZUNhbmRpZGF0ZTo6SW5saW5lQ29udGVudDo6cmVzZXQoKQor
eworICAgIG1fY29udGludW91c0NvbnRlbnQucmVzZXQoKTsKKyAgICBtX3RyYWlsaW5nTGluZUJy
ZWFrID0geyB9OworICAgIG1fdHJhaWxpbmdXb3JkQnJlYWtPcHBvcnR1bml0eSA9IHsgfTsKKyAg
ICBtX2hhc0lubGluZUxldmVsQm94ID0gZmFsc2U7Cit9CisKK2lubGluZSB2b2lkIExpbmVDYW5k
aWRhdGU6OnJlc2V0KCkKK3sKKyAgICBmbG9hdEl0ZW0gPSBudWxscHRyOworICAgIGlubGluZUNv
bnRlbnQucmVzZXQoKTsKK30KKworSW5saW5lTGF5b3V0VW5pdCBMaW5lQnVpbGRlcjo6aW5saW5l
SXRlbVdpZHRoKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQg
Y29udGVudExvZ2ljYWxMZWZ0KSBjb25zdAoreworICAgIGlmIChpczxJbmxpbmVUZXh0SXRlbT4o
aW5saW5lSXRlbSkpIHsKKyAgICAgICAgYXV0byYgaW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJ
bmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSk7CisgICAgICAgIGlmIChhdXRvIGNvbnRlbnRXaWR0
aCA9IGlubGluZVRleHRJdGVtLndpZHRoKCkpCisgICAgICAgICAgICByZXR1cm4gKmNvbnRlbnRX
aWR0aDsKKyAgICAgICAgaWYgKCFpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSB8fCBJbmxp
bmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtKSkK
KyAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0sIGNvbnRl
bnRMb2dpY2FsTGVmdCk7CisgICAgICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4
dEl0ZW0sIGlubGluZVRleHRJdGVtLnN0YXJ0KCksIGlubGluZVRleHRJdGVtLnN0YXJ0KCkgKyAx
LCBjb250ZW50TG9naWNhbExlZnQpOworICAgIH0KKworICAgIGlmIChpbmxpbmVJdGVtLmlzTGlu
ZUJyZWFrKCkgfHwgaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkpCisgICAgICAg
IHJldHVybiB7IH07CisKKyAgICBhdXRvJiBsYXlvdXRCb3ggPSBpbmxpbmVJdGVtLmxheW91dEJv
eCgpOworICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5n
ZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOworCisgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0aW5n
UG9zaXRpb25lZCgpKQorICAgICAgICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luQm94V2lkdGgo
KTsKKworICAgIGlmIChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQorICAgICAgICByZXR1cm4g
Ym94R2VvbWV0cnkubWFyZ2luQm94V2lkdGgoKTsKKworICAgIGlmIChpbmxpbmVJdGVtLmlzSW5s
aW5lQm94U3RhcnQoKSkKKyAgICAgICAgcmV0dXJuIGJveEdlb21ldHJ5Lm1hcmdpblN0YXJ0KCkg
KyBib3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nTGVmdCgpLnZh
bHVlT3IoMCk7CisKKyAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQorICAgICAg
ICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luRW5kKCkgKyBib3hHZW9tZXRyeS5ib3JkZXJSaWdo
dCgpICsgYm94R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVPcigwKTsKKworICAgIC8vIE5v
bi1yZXBsYWNlZCBpbmxpbmUgYm94IChlLmcuIGlubGluZS1ibG9jaykKKyAgICByZXR1cm4gYm94
R2VvbWV0cnkubWFyZ2luQm94V2lkdGgoKTsKK30KKworTGluZUJ1aWxkZXI6OkxpbmVCdWlsZGVy
KElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCwgRmxvYXRp
bmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSwgSG9yaXpvbnRhbENvbnN0cmFpbnRzIHJvb3RIb3Jpem9u
dGFsQ29uc3RyYWludHMsIGNvbnN0IElubGluZUl0ZW1zJiBpbmxpbmVJdGVtcykKKyAgICA6IG1f
aW5saW5lRm9ybWF0dGluZ0NvbnRleHQoaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCisgICAgLCBt
X2lubGluZUZvcm1hdHRpbmdTdGF0ZSgmaW5saW5lRm9ybWF0dGluZ0NvbnRleHQuZm9ybWF0dGlu
Z1N0YXRlKCkpCisgICAgLCBtX2Zsb2F0aW5nU3RhdGUoJmZsb2F0aW5nU3RhdGUpCisgICAgLCBt
X3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHMocm9vdEhvcml6b250YWxDb25zdHJhaW50cykKKyAg
ICAsIG1fbGluZShpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1faW5saW5lSXRlbXMo
aW5saW5lSXRlbXMpCit7Cit9CisKK0xpbmVCdWlsZGVyOjpMaW5lQnVpbGRlcihjb25zdCBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5lRm9ybWF0dGluZ0NvbnRleHQsIGNvbnN0IElubGlu
ZUl0ZW1zJiBpbmxpbmVJdGVtcykKKyAgICA6IG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQoaW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQpCisgICAgLCBtX2xpbmUoaW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQpCisgICAgLCBtX2lubGluZUl0ZW1zKGlubGluZUl0ZW1zKQoreworfQorCitMaW5lQnVpbGRl
cjo6TGluZUNvbnRlbnQgTGluZUJ1aWxkZXI6OmxheW91dElubGluZUNvbnRlbnQoY29uc3QgSW5s
aW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBzaXplX3QgcGFydGlhbExlYWRpbmdDb250
ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxvd0xvZ2ljYWxXaWR0
aCwgY29uc3QgSW5saW5lUmVjdCYgaW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgYm9vbCBpc0ZpcnN0
TGluZSkKK3sKKyAgICBpbml0aWFsaXplKGluaXRpYWxDb25zdHJhaW50c0ZvckxpbmUoaW5pdGlh
bExpbmVMb2dpY2FsUmVjdCwgaXNGaXJzdExpbmUpKTsKKworICAgIGF1dG8gY29tbWl0dGVkQ29u
dGVudCA9IHBsYWNlSW5saW5lQ29udGVudChuZWVkc0xheW91dFJhbmdlLCBwYXJ0aWFsTGVhZGlu
Z0NvbnRlbnRMZW5ndGgsIG92ZXJmbG93TG9naWNhbFdpZHRoKTsKKyAgICBhdXRvIGNvbW1pdHRl
ZFJhbmdlID0gY2xvc2UobmVlZHNMYXlvdXRSYW5nZSwgY29tbWl0dGVkQ29udGVudCk7CisKKyAg
ICBhdXRvIGlzTGFzdExpbmUgPSBpc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQoY29tbWl0dGVk
UmFuZ2UsIG5lZWRzTGF5b3V0UmFuZ2UuZW5kLCBjb21taXR0ZWRDb250ZW50LnBhcnRpYWxUcmFp
bGluZ0NvbnRlbnRMZW5ndGgpOworICAgIHJldHVybiBMaW5lQ29udGVudCB7IGNvbW1pdHRlZFJh
bmdlLCBjb21taXR0ZWRDb250ZW50LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgsIGNvbW1p
dHRlZENvbnRlbnQub3ZlcmZsb3dMb2dpY2FsV2lkdGgsIG1fZmxvYXRzLCBtX2NvbnRlbnRJc0Nv
bnN0cmFpbmVkQnlGbG9hdAorICAgICAgICAsIG1fbGluZUxvZ2ljYWxSZWN0LnRvcExlZnQoKQor
ICAgICAgICAsIG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkKKyAgICAgICAgLCBtX2xpbmUuY29u
dGVudExvZ2ljYWxXaWR0aCgpCisgICAgICAgICwgaXNMYXN0TGluZQorICAgICAgICAsIG1fbGlu
ZS5ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQoKQorICAgICAgICAsIG1fbGluZS5ydW5z
KCl9OworfQorCitMaW5lQnVpbGRlcjo6SW50cmluc2ljQ29udGVudCBMaW5lQnVpbGRlcjo6Y29t
cHV0ZWRJbnRyaW5zaWNXaWR0aChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFu
Z2UsIElubGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgpCit7CisgICAgaW5pdGlhbGl6ZSh7
IHsgeyB9LCB7IGF2YWlsYWJsZVdpZHRoLCBtYXhJbmxpbmVMYXlvdXRVbml0KCkgfSB9LCBmYWxz
ZSB9KTsKKyAgICBhdXRvIGNvbW1pdHRlZENvbnRlbnQgPSBwbGFjZUlubGluZUNvbnRlbnQobmVl
ZHNMYXlvdXRSYW5nZSwgeyB9LCB7IH0pOworICAgIGF1dG8gY29tbWl0dGVkUmFuZ2UgPSBjbG9z
ZShuZWVkc0xheW91dFJhbmdlLCBjb21taXR0ZWRDb250ZW50KTsKKyAgICByZXR1cm4geyBjb21t
aXR0ZWRSYW5nZSwgbV9saW5lLmNvbnRlbnRMb2dpY2FsV2lkdGgoKSwgbV9mbG9hdHMgfTsKK30K
Kwordm9pZCBMaW5lQnVpbGRlcjo6aW5pdGlhbGl6ZShjb25zdCBVc2VkQ29uc3RyYWludHMmIGxp
bmVDb25zdHJhaW50cykKK3sKKyAgICBtX2Zsb2F0cy5jbGVhcigpOworICAgIG1fcGFydGlhbExl
YWRpbmdUZXh0SXRlbSA9IHsgfTsKKyAgICBtX3dyYXBPcHBvcnR1bml0eUxpc3QuY2xlYXIoKTsK
KworICAgIG1fbGluZS5pbml0aWFsaXplKCk7CisgICAgbV9saW5lTG9naWNhbFJlY3QgPSBsaW5l
Q29uc3RyYWludHMubG9naWNhbFJlY3Q7CisgICAgbV9jb250ZW50SXNDb25zdHJhaW5lZEJ5Rmxv
YXQgPSBsaW5lQ29uc3RyYWludHMuaXNDb25zdHJhaW5lZEJ5RmxvYXQ7Cit9CisKK0xpbmVCdWls
ZGVyOjpDb21taXR0ZWRDb250ZW50IExpbmVCdWlsZGVyOjpwbGFjZUlubGluZUNvbnRlbnQoY29u
c3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBzaXplX3QgcGFydGlhbExlYWRp
bmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBsZWFkaW5nTG9naWNh
bFdpZHRoKQoreworICAgIGF1dG8gbGluZUNhbmRpZGF0ZSA9IExpbmVDYW5kaWRhdGUgeyBsYXlv
dXRTdGF0ZSgpLnNob3VsZElnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZygpIH07CisgICAgYXV0
byBpbmxpbmVDb250ZW50QnJlYWtlciA9IElubGluZUNvbnRlbnRCcmVha2VyIHsgfTsKKworICAg
IGF1dG8gY3VycmVudEl0ZW1JbmRleCA9IG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQ7CisgICAgc2l6
ZV90IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCA9IDA7CisgICAgd2hpbGUgKGN1cnJlbnRJdGVt
SW5kZXggPCBuZWVkc0xheW91dFJhbmdlLmVuZCkgeworICAgICAgICAvLyAxLiBDb2xsZWN0IHRo
ZSBzZXQgb2YgcnVucyB0aGF0IHdlIGNhbiBjb21taXQgdG8gdGhlIGxpbmUgYXMgb25lIGVudGl0
eSBlLmcuIDxzcGFuPnRleHRfYW5kX3NwYW5fc3RhcnRfc3Bhbl9lbmQ8L3NwYW4+LgorICAgICAg
ICAvLyAyLiBBcHBseSBmbG9hdHMgYW5kIHNocmluayB0aGUgYXZhaWxhYmxlIGhvcml6b250YWwg
c3BhY2UgZS5nLiA8c3Bhbj5pbnRydV88ZGl2IHN0eWxlPSJmbG9hdDogbGVmdCI+PC9kaXY+c2l2
ZV9mbG9hdDwvc3Bhbj4uCisgICAgICAgIC8vIDMuIENoZWNrIGlmIHRoZSBjb250ZW50IGZpdHMg
dGhlIGxpbmUgYW5kIGNvbW1pdCB0aGUgY29udGVudCBhY2NvcmRpbmdseSAoZnVsbCwgcGFydGlh
bCBvciBub3QgY29tbWl0IGF0IGFsbCkuCisgICAgICAgIC8vIDQuIFJldHVybiBpZiB3ZSBhcmUg
YXQgdGhlIGVuZCBvZiB0aGUgbGluZSBlaXRoZXIgYnkgbm90IGJlaW5nIGFibGUgdG8gZml0IG1v
cmUgY29udGVudCBvciBiZWNhdXNlIG9mIGFuIGV4cGxpY2l0IGxpbmUgYnJlYWsuCisgICAgICAg
IGNhbmRpZGF0ZUNvbnRlbnRGb3JMaW5lKGxpbmVDYW5kaWRhdGUsIGN1cnJlbnRJdGVtSW5kZXgs
IG5lZWRzTGF5b3V0UmFuZ2UsIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCwgc3RkOjpleGNo
YW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6Om51bGxvcHQpLCBtX2xpbmUuY29udGVudExv
Z2ljYWxSaWdodCgpKTsKKyAgICAgICAgLy8gTm93IGNoZWNrIGlmIHdlIGNhbiBwdXQgdGhpcyBj
b250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCisgICAgICAgIGF1dG8gcmVzdWx0ID0gUmVzdWx0
IHsgfTsKKyAgICAgICAgaWYgKGxpbmVDYW5kaWRhdGUuZmxvYXRJdGVtKSB7CisgICAgICAgICAg
ICBBU1NFUlQobGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmlzRW1wdHkoKSk7CisgICAgICAg
ICAgICBoYW5kbGVGbG9hdENvbnRlbnQoKmxpbmVDYW5kaWRhdGUuZmxvYXRJdGVtKTsKKyAgICAg
ICAgICAgIC8vIEZsb2F0cyBuZXZlciB0ZXJtaW5hdGUgdGhlIGxpbmUuCisgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlSW5saW5lQ29udGVudChpbmxpbmVDb250ZW50
QnJlYWtlciwgbmVlZHNMYXlvdXRSYW5nZSwgbGluZUNhbmRpZGF0ZSk7CisgICAgICAgIGF1dG8g
aXNFbmRPZkxpbmUgPSByZXN1bHQuaXNFbmRPZkxpbmUgPT0gSW5saW5lQ29udGVudEJyZWFrZXI6
OklzRW5kT2ZMaW5lOjpZZXM7CisgICAgICAgIGlmICghcmVzdWx0LmNvbW1pdHRlZENvdW50Lmlz
UmV2ZXJ0KSB7CisgICAgICAgICAgICBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgKz0gcmVzdWx0
LmNvbW1pdHRlZENvdW50LnZhbHVlOworICAgICAgICAgICAgYXV0byYgaW5saW5lQ29udGVudCA9
IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudDsKKyAgICAgICAgICAgIGF1dG8gaW5saW5lQ29u
dGVudElzRnVsbHlDb21taXR0ZWQgPSBpbmxpbmVDb250ZW50LmNvbnRpbnVvdXNDb250ZW50KCku
cnVucygpLnNpemUoKSA9PSByZXN1bHQuY29tbWl0dGVkQ291bnQudmFsdWUgJiYgIXJlc3VsdC5w
YXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoOworICAgICAgICAgICAgaWYgKGlubGluZUNvbnRl
bnRJc0Z1bGx5Q29tbWl0dGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKGF1dG8qIHdvcmRCcmVh
a09wcG9ydHVuaXR5ID0gaW5saW5lQ29udGVudC50cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5
KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gPHdicj4gbmVlZHMgdG8gYmUgb24gdGhlIGxp
bmUgYXMgYW4gZW1wdHkgcnVuIHNvIHRoYXQgd2UgY2FuIGNvbnN0cnVjdCBhbiBpbmxpbmUgYm94
IGFuZCBjb21wdXRlIGJhc2ljIGdlb21ldHJ5LgorICAgICAgICAgICAgICAgICAgICArK2NvbW1p
dHRlZElubGluZUl0ZW1Db3VudDsKKyAgICAgICAgICAgICAgICAgICAgbV9saW5lLmFwcGVuZCgq
d29yZEJyZWFrT3Bwb3J0dW5pdHksIHsgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIGlmIChpbmxpbmVDb250ZW50LnRyYWlsaW5nTGluZUJyZWFrKCkpIHsKKyAgICAgICAg
ICAgICAgICAgICAgLy8gRnVsbHkgY29tbWl0dGVkIChvciBlbXB0eSkgY29udGVudCBmb2xsb3dl
ZCBieSBhIGxpbmUgYnJlYWsgbWVhbnMgImVuZCBvZiBsaW5lIi4KKyAgICAgICAgICAgICAgICAg
ICAgLy8gRklYTUU6IFRoaXMgd2lsbCBwdXQgdGhlIGxpbmUgYnJlYWsgYm94IGF0IHRoZSBlbmQg
b2YgdGhlIGxpbmUgd2hpbGUgaW4gY2FzZSBvZiBzb21lIGlubGluZSBib3hlcywgdGhlIGxpbmUg
YnJlYWsKKyAgICAgICAgICAgICAgICAgICAgLy8gY291bGQgdmVyeSB3ZWxsIGJlIGF0IGFuIGVh
cmxpZXIgcG9zaXRpb24uIFRoaXMgaGFzIG5vIHZpc3VhbCBpbXBsaWNhdGlvbnMgYXQgdGhpcyBw
b2ludCB0aG91Z2ggKG9ubHkgZ2VvbWV0cnkgY29ycmVjdG5lc3Mgb24gdGhlIGxpbmUgYnJlYWsg
Ym94KS4KKyAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiA8c3BhbiBzdHlsZT0iYm9yZGVyLXJp
Z2h0OiAxMHB4IHNvbGlkIGdyZWVuIj50ZXh0PGJyPjwvc3Bhbj4gd2hlcmUgdGhlIDxicj4ncyBo
b3Jpem9udGFsIHBvc2l0aW9uIGlzIGJlZm9yZSB0aGUgcmlnaHQgYm9yZGVyIGFuZCBub3QgYWZ0
ZXIuCisgICAgICAgICAgICAgICAgICAgIG1fbGluZS5hcHBlbmQoKmlubGluZUNvbnRlbnQudHJh
aWxpbmdMaW5lQnJlYWsoKSwgeyB9KTsKKyAgICAgICAgICAgICAgICAgICAgKytjb21taXR0ZWRJ
bmxpbmVJdGVtQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGlzRW5kT2ZMaW5lID0gdHJ1ZTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAg
ICAgICAgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50ID0gcmVzdWx0LmNvbW1pdHRlZENvdW50LnZh
bHVlOworCisgICAgICAgIGlmIChpc0VuZE9mTGluZSkgeworICAgICAgICAgICAgLy8gV2UgY2Fu
J3QgcGxhY2UgYW55IG1vcmUgaXRlbXMgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgICAg
IHJldHVybiB7IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCwgcmVzdWx0LnBhcnRpYWxUcmFpbGlu
Z0NvbnRlbnRMZW5ndGgsIHJlc3VsdC5vdmVyZmxvd0xvZ2ljYWxXaWR0aCB9OworICAgICAgICB9
CisgICAgICAgIGN1cnJlbnRJdGVtSW5kZXggPSBuZWVkc0xheW91dFJhbmdlLnN0YXJ0ICsgY29t
bWl0dGVkSW5saW5lSXRlbUNvdW50ICsgbV9mbG9hdHMuc2l6ZSgpOworICAgICAgICBwYXJ0aWFs
TGVhZGluZ0NvbnRlbnRMZW5ndGggPSB7IH07CisgICAgfQorICAgIC8vIExvb2tzIGxpa2Ugd2Un
dmUgcnVuIG91dCBvZiBydW5zLgorICAgIHJldHVybiB7IGNvbW1pdHRlZElubGluZUl0ZW1Db3Vu
dCwgeyB9IH07Cit9CisKK0xpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UgTGluZUJ1aWxkZXI6
OmNsb3NlKGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgY29uc3QgQ29t
bWl0dGVkQ29udGVudCYgY29tbWl0dGVkQ29udGVudCkKK3sKKyAgICBBU1NFUlQoY29tbWl0dGVk
Q29udGVudC5pbmxpbmVJdGVtQ291bnQgfHwgIW1fZmxvYXRzLmlzRW1wdHkoKSB8fCBtX2NvbnRl
bnRJc0NvbnN0cmFpbmVkQnlGbG9hdCk7CisgICAgYXV0byBudW1iZXJPZkNvbW1pdHRlZEl0ZW1z
ID0gY29tbWl0dGVkQ29udGVudC5pbmxpbmVJdGVtQ291bnQgKyBtX2Zsb2F0cy5zaXplKCk7Cisg
ICAgYXV0byB0cmFpbGluZ0lubGluZUl0ZW1JbmRleCA9IG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQg
KyBudW1iZXJPZkNvbW1pdHRlZEl0ZW1zIC0gMTsKKyAgICBhdXRvIGxpbmVSYW5nZSA9IElubGlu
ZUl0ZW1SYW5nZSB7IG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQsIHRyYWlsaW5nSW5saW5lSXRlbUlu
ZGV4ICsgMSB9OworICAgIEFTU0VSVChsaW5lUmFuZ2UuZW5kIDw9IG5lZWRzTGF5b3V0UmFuZ2Uu
ZW5kKTsKKyAgICBpZiAoIWNvbW1pdHRlZENvbnRlbnQuaW5saW5lSXRlbUNvdW50KSB7CisgICAg
ICAgIC8vIExpbmUgaXMgZW1wdHksIHdlIG9ubHkgbWFuYWdlZCB0byBwbGFjZSBmbG9hdCBib3hl
cy4KKyAgICAgICAgcmV0dXJuIGxpbmVSYW5nZTsKKyAgICB9CisgICAgYXV0byBhdmFpbGFibGVX
aWR0aCA9IG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkgLSBtX2xpbmUuY29udGVudExvZ2ljYWxS
aWdodCgpOworICAgIG1fbGluZS5yZW1vdmVDb2xsYXBzaWJsZUNvbnRlbnQoYXZhaWxhYmxlV2lk
dGgpOworICAgIGF1dG8gaG9yaXpvbnRhbEFsaWdubWVudCA9IHJvb3QoKS5zdHlsZSgpLnRleHRB
bGlnbigpOworICAgIGF1dG8gcnVuc0V4cGFuZEhvcml6b250YWxseSA9IGhvcml6b250YWxBbGln
bm1lbnQgPT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSAmJiAhaXNMYXN0TGluZVdpdGhJbmxpbmVD
b250ZW50KGxpbmVSYW5nZSwgbmVlZHNMYXlvdXRSYW5nZS5lbmQsIGNvbW1pdHRlZENvbnRlbnQu
cGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCk7CisgICAgaWYgKHJ1bnNFeHBhbmRIb3Jpem9u
dGFsbHkpCisgICAgICAgIG1fbGluZS5hcHBseVJ1bkV4cGFuc2lvbihtX2xpbmVMb2dpY2FsUmVj
dC53aWR0aCgpIC0gbV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKSk7CisgICAgYXV0byBsaW5l
RW5kc1dpdGhIeXBoZW4gPSBmYWxzZTsKKyAgICBpZiAoIW1fbGluZS5ydW5zKCkuaXNFbXB0eSgp
KSB7CisgICAgICAgIGF1dG8mIGxhc3RUZXh0Q29udGVudCA9IG1fbGluZS5ydW5zKCkubGFzdCgp
LnRleHRDb250ZW50KCk7CisgICAgICAgIGxpbmVFbmRzV2l0aEh5cGhlbiA9IGxhc3RUZXh0Q29u
dGVudCAmJiBsYXN0VGV4dENvbnRlbnQtPm5lZWRzSHlwaGVuKCk7CisgICAgfQorICAgIG1fc3Vj
Y2Vzc2l2ZUh5cGhlbmF0ZWRMaW5lQ291bnQgPSBsaW5lRW5kc1dpdGhIeXBoZW4gPyBtX3N1Y2Nl
c3NpdmVIeXBoZW5hdGVkTGluZUNvdW50ICsgMSA6IDA7CisgICAgcmV0dXJuIGxpbmVSYW5nZTsK
K30KKworT3B0aW9uYWw8SG9yaXpvbnRhbENvbnN0cmFpbnRzPiBMaW5lQnVpbGRlcjo6ZmxvYXRD
b25zdHJhaW50cyhjb25zdCBJbmxpbmVSZWN0JiBsaW5lTG9naWNhbFJlY3QpIGNvbnN0Cit7Cisg
ICAgYXV0byogZmxvYXRpbmdTdGF0ZSA9IHRoaXMtPmZsb2F0aW5nU3RhdGUoKTsKKyAgICBpZiAo
IWZsb2F0aW5nU3RhdGUgfHwgZmxvYXRpbmdTdGF0ZS0+ZmxvYXRzKCkuaXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm4geyB9OworCisgICAgLy8gQ2hlY2sgZm9yIGludHJ1ZGluZyBmbG9hdHMgYW5k
IGFkanVzdCBsb2dpY2FsIGxlZnQvYXZhaWxhYmxlIHdpZHRoIGZvciB0aGlzIGxpbmUgYWNjb3Jk
aW5nbHkuCisgICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyBmb3Jt
YXR0aW5nQ29udGV4dCgpLCAqZmxvYXRpbmdTdGF0ZSB9OworICAgIGF1dG8gY29uc3RyYWludHMg
PSBmbG9hdGluZ0NvbnRleHQuY29uc3RyYWludHModG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmVj
dC50b3AoKSksIHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFJlY3QuYm90dG9tKCkpKTsKKyAgICAv
LyBDaGVjayBpZiB0aGVzZSB2YWx1ZXMgYWN0dWFsbHkgY29uc3RyYWluIHRoZSBsaW5lLgorICAg
IGlmIChjb25zdHJhaW50cy5sZWZ0ICYmIGNvbnN0cmFpbnRzLmxlZnQtPnggPD0gbGluZUxvZ2lj
YWxSZWN0LmxlZnQoKSkKKyAgICAgICAgY29uc3RyYWludHMubGVmdCA9IHsgfTsKKworICAgIGlm
IChjb25zdHJhaW50cy5yaWdodCAmJiBjb25zdHJhaW50cy5yaWdodC0+eCA+PSBsaW5lTG9naWNh
bFJlY3QucmlnaHQoKSkKKyAgICAgICAgY29uc3RyYWludHMucmlnaHQgPSB7IH07CisKKyAgICBp
ZiAoIWNvbnN0cmFpbnRzLmxlZnQgJiYgIWNvbnN0cmFpbnRzLnJpZ2h0KQorICAgICAgICByZXR1
cm4geyB9OworCisgICAgYXV0byBsaW5lTG9naWNhbExlZnQgPSBsaW5lTG9naWNhbFJlY3QubGVm
dCgpOworICAgIGF1dG8gbGluZUxvZ2ljYWxSaWdodCA9IGxpbmVMb2dpY2FsUmVjdC5yaWdodCgp
OworICAgIGlmIChjb25zdHJhaW50cy5sZWZ0ICYmIGNvbnN0cmFpbnRzLnJpZ2h0KSB7CisgICAg
ICAgIGxpbmVMb2dpY2FsUmlnaHQgPSBjb25zdHJhaW50cy5yaWdodC0+eDsKKyAgICAgICAgbGlu
ZUxvZ2ljYWxMZWZ0ID0gY29uc3RyYWludHMubGVmdC0+eDsKKyAgICB9IGVsc2UgaWYgKGNvbnN0
cmFpbnRzLmxlZnQpIHsKKyAgICAgICAgQVNTRVJUKGNvbnN0cmFpbnRzLmxlZnQtPnggPj0gbGlu
ZUxvZ2ljYWxMZWZ0KTsKKyAgICAgICAgbGluZUxvZ2ljYWxMZWZ0ID0gY29uc3RyYWludHMubGVm
dC0+eDsKKyAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnRzLnJpZ2h0KSB7CisgICAgICAgIC8vIFJp
Z2h0IGZsb2F0IGJveGVzIG1heSBvdmVyZmxvdyB0aGUgY29udGFpbmluZyBibG9jayBvbiB0aGUg
bGVmdC4KKyAgICAgICAgbGluZUxvZ2ljYWxSaWdodCA9IHN0ZDo6bWF4PElubGluZUxheW91dFVu
aXQ+KGxpbmVMb2dpY2FsTGVmdCwgY29uc3RyYWludHMucmlnaHQtPngpOworICAgIH0KKyAgICBy
ZXR1cm4gSG9yaXpvbnRhbENvbnN0cmFpbnRzIHsgdG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsTGVm
dCksIHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFJpZ2h0IC0gbGluZUxvZ2ljYWxMZWZ0KSB9Owor
fQorCitMaW5lQnVpbGRlcjo6VXNlZENvbnN0cmFpbnRzIExpbmVCdWlsZGVyOjppbml0aWFsQ29u
c3RyYWludHNGb3JMaW5lKGNvbnN0IElubGluZVJlY3QmIGluaXRpYWxMaW5lTG9naWNhbFJlY3Qs
IGJvb2wgaXNGaXJzdExpbmUpIGNvbnN0Cit7CisgICAgYXV0byBsaW5lTG9naWNhbExlZnQgPSBp
bml0aWFsTGluZUxvZ2ljYWxSZWN0LmxlZnQoKTsKKyAgICBhdXRvIGxpbmVMb2dpY2FsUmlnaHQg
PSBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LnJpZ2h0KCk7CisgICAgYXV0byBsaW5lSXNDb25zdHJh
aW5lZEJ5RmxvYXQgPSBmYWxzZTsKKworICAgIGlmIChhdXRvIGxpbmVDb25zdHJhaW50cyA9IGZs
b2F0Q29uc3RyYWludHMoaW5pdGlhbExpbmVMb2dpY2FsUmVjdCkpIHsKKyAgICAgICAgbGluZUxv
Z2ljYWxMZWZ0ID0gbGluZUNvbnN0cmFpbnRzLT5sb2dpY2FsTGVmdDsKKyAgICAgICAgbGluZUxv
Z2ljYWxSaWdodCA9IGxpbmVDb25zdHJhaW50cy0+bG9naWNhbFJpZ2h0KCk7CisgICAgICAgIGxp
bmVJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IHRydWU7CisgICAgfQorCisgICAgYXV0byBjb21wdXRl
ZFRleHRJbmRlbnQgPSBbJl0oKSAtPiBJbmxpbmVMYXlvdXRVbml0IHsKKyAgICAgICAgLy8gdGV4
dC1pbmRlbnQgcHJvcGVydHkgc3BlY2lmaWVzIHRoZSBpbmRlbnRhdGlvbiBhcHBsaWVkIHRvIGxp
bmVzIG9mIGlubGluZSBjb250ZW50IGluIGEgYmxvY2suCisgICAgICAgIC8vIFRoZSBpbmRlbnQg
aXMgdHJlYXRlZCBhcyBhIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBzdGFydCBlZGdlIG9mIHRoZSBs
aW5lIGJveC4KKyAgICAgICAgLy8gVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIG9ubHkgbGlu
ZXMgdGhhdCBhcmUgdGhlIGZpcnN0IGZvcm1hdHRlZCBsaW5lIG9mIGFuIGVsZW1lbnQgYXJlIGFm
ZmVjdGVkLgorICAgICAgICAvLyBGb3IgZXhhbXBsZSwgdGhlIGZpcnN0IGxpbmUgb2YgYW4gYW5v
bnltb3VzIGJsb2NrIGJveCBpcyBvbmx5IGFmZmVjdGVkIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGls
ZCBvZiBpdHMgcGFyZW50IGVsZW1lbnQuCisgICAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBm
b3IgZWFjaC1saW5lLgorICAgICAgICAvLyBbSW50ZWdyYXRpb25dIHJvb3QoKS0+cGFyZW50KCkg
d291bGQgbm9ybWFsbHkgcHJvZHVjZSBhIHZhbGlkIGxheW91dCBib3guCisgICAgICAgIGF1dG8m
IHJvb3QgPSB0aGlzLT5yb290KCk7CisgICAgICAgIGF1dG8gaXNGb3JtYXR0aW5nQ29udGV4dFJv
b3RDYW5kaWRhdGVUb1RleHRJbmRlbnQgPSAhcm9vdC5pc0Fub255bW91cygpOworICAgICAgICBp
ZiAocm9vdC5pc0Fub255bW91cygpKSB7CisgICAgICAgICAgICAvLyBVbmxlc3Mgb3RoZXJ3aXNl
IHNwZWNpZmllZCBieSB0aGUgZWFjaC1saW5lIGFuZC9vciBoYW5naW5nIGtleXdvcmRzLCBvbmx5
IGxpbmVzIHRoYXQgYXJlIHRoZSBmaXJzdCBmb3JtYXR0ZWQgbGluZQorICAgICAgICAgICAgLy8g
b2YgYW4gZWxlbWVudCBhcmUgYWZmZWN0ZWQuCisgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwg
dGhlIGZpcnN0IGxpbmUgb2YgYW4gYW5vbnltb3VzIGJsb2NrIGJveCBpcyBvbmx5IGFmZmVjdGVk
IGlmIGl0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50IGVsZW1lbnQuCisgICAgICAg
ICAgICBhdXRvIGlzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkID0gbGF5b3V0U3RhdGUoKS5p
c0ludGVncmF0ZWRSb290Qm94Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgaWYgKGlzSW50ZWdy
YXRlZFJvb3RCb3hGaXJzdENoaWxkID09IExheW91dFN0YXRlOjpJc0ludGVncmF0ZWRSb290Qm94
Rmlyc3RDaGlsZDo6Tm90QXBwbGljYWJsZSkKKyAgICAgICAgICAgICAgICBpc0Zvcm1hdHRpbmdD
b250ZXh0Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCA9IHJvb3QucGFyZW50KCkuZmlyc3RJbkZs
b3dDaGlsZCgpID09ICZyb290OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGlz
Rm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9UZXh0SW5kZW50ID0gaXNJbnRlZ3JhdGVk
Um9vdEJveEZpcnN0Q2hpbGQgPT0gTGF5b3V0U3RhdGU6OklzSW50ZWdyYXRlZFJvb3RCb3hGaXJz
dENoaWxkOjpZZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpc0Zvcm1hdHRpbmdDb250ZXh0
Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAg
ICAgIGF1dG8gaW52ZXJ0TGluZVJhbmdlID0gcm9vdC5zdHlsZSgpLnRleHRJbmRlbnRUeXBlKCkg
PT0gVGV4dEluZGVudFR5cGU6Okhhbmdpbmc7CisgICAgICAgIC8vIHRleHQtaW5kZW50OiBoYW5n
aW5nIGludmVydHMgd2hpY2ggbGluZXMgYXJlIGFmZmVjdGVkLgorICAgICAgICAvLyBpbnZlcnRl
ZCBsaW5lIHJhbmdlIC0+IGFsbCB0aGUgbGluZXMgZXhjZXB0IHRoZSBmaXJzdCBvbmUuCisgICAg
ICAgIC8vICFpbnZlcnRlZCBsaW5lIHJhbmdlIC0+IGZpcnN0IGxpbmUgZ2V0cyB0aGUgaW5kZW50
LgorICAgICAgICBhdXRvIHNob3VsZEluZGVudCA9IGludmVydExpbmVSYW5nZSAhPSBpc0ZpcnN0
TGluZTsKKyAgICAgICAgaWYgKCFzaG91bGRJbmRlbnQpCisgICAgICAgICAgICByZXR1cm4geyB9
OworCisgICAgICAgIGF1dG8gdGV4dEluZGVudCA9IHJvb3Quc3R5bGUoKS50ZXh0SW5kZW50KCk7
CisgICAgICAgIGlmICh0ZXh0SW5kZW50ID09IFJlbmRlclN0eWxlOjppbml0aWFsVGV4dEluZGVu
dCgpKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgcmV0dXJuIHsgbWluaW11bVZh
bHVlRm9yTGVuZ3RoKHRleHRJbmRlbnQsIGluaXRpYWxMaW5lTG9naWNhbFJlY3Qud2lkdGgoKSkg
fTsKKyAgICB9OworICAgIGxpbmVMb2dpY2FsTGVmdCArPSBjb21wdXRlZFRleHRJbmRlbnQoKTsK
KyAgICByZXR1cm4gVXNlZENvbnN0cmFpbnRzIHsgeyBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LnRv
cCgpLCBsaW5lTG9naWNhbExlZnQsIGxpbmVMb2dpY2FsUmlnaHQgLSBsaW5lTG9naWNhbExlZnQs
IGluaXRpYWxMaW5lTG9naWNhbFJlY3QuaGVpZ2h0KCkgfSwgbGluZUlzQ29uc3RyYWluZWRCeUZs
b2F0IH07Cit9CisKK3ZvaWQgTGluZUJ1aWxkZXI6OmNhbmRpZGF0ZUNvbnRlbnRGb3JMaW5lKExp
bmVDYW5kaWRhdGUmIGxpbmVDYW5kaWRhdGUsIHNpemVfdCBjdXJyZW50SW5saW5lSXRlbUluZGV4
LCBjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBzaXplX3QgcGFydGlhbExlYWRp
bmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBsZWFkaW5nTG9naWNh
bFdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGN1cnJlbnRMb2dpY2FsUmlnaHQpCit7CisgICAgQVNT
RVJUKGN1cnJlbnRJbmxpbmVJdGVtSW5kZXggPCBsYXlvdXRSYW5nZS5lbmQpOworICAgIGxpbmVD
YW5kaWRhdGUucmVzZXQoKTsKKyAgICAvLyAxLiBTaW1wbHkgYWRkIGFueSBvdmVyZmxvdyBjb250
ZW50IGZyb20gdGhlIHByZXZpb3VzIGxpbmUgdG8gdGhlIGNhbmRpZGF0ZSBjb250ZW50LiBJdCdz
IGFsd2F5cyBhIHRleHQgY29udGVudC4KKyAgICAvLyAyLiBGaW5kIHRoZSBuZXh0IHNvZnQgd3Jh
cCBwb3NpdGlvbiBvciBleHBsaWNpdCBsaW5lIGJyZWFrLgorICAgIC8vIDMuIENvbGxlY3QgZmxv
YXRzIGJldHdlZW4gdGhlIGlubGluZSBjb250ZW50LgorICAgIGF1dG8gc29mdFdyYXBPcHBvcnR1
bml0eUluZGV4ID0gbmV4dFdyYXBPcHBvcnR1bml0eShjdXJyZW50SW5saW5lSXRlbUluZGV4LCBs
YXlvdXRSYW5nZSk7CisgICAgLy8gc29mdFdyYXBPcHBvcnR1bml0eUluZGV4ID09IGxheW91dFJh
bmdlLmVuZCBtZWFucyB3ZSBkb24ndCBoYXZlIGFueSB3cmFwIG9wcG9ydHVuaXR5IGluIHRoaXMg
Y29udGVudC4KKyAgICBBU1NFUlQoc29mdFdyYXBPcHBvcnR1bml0eUluZGV4IDw9IGxheW91dFJh
bmdlLmVuZCk7CisKKyAgICBpZiAocGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoKSB7CisgICAg
ICAgIC8vIEhhbmRsZSBsZWFkaW5nIHBhcnRpYWwgY29udGVudCBmaXJzdCAob3ZlcmZsb3dpbmcg
dGV4dCBmcm9tIHRoZSBwcmV2aW91cyBsaW5lKS4KKyAgICAgICAgLy8gQ29uc3RydWN0IGEgcGFy
dGlhbCBsZWFkaW5nIGlubGluZSBpdGVtLgorICAgICAgICBtX3BhcnRpYWxMZWFkaW5nVGV4dEl0
ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4obV9pbmxpbmVJdGVtc1tjdXJyZW50SW5saW5l
SXRlbUluZGV4XSkucmlnaHQocGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoKTsKKyAgICAgICAg
YXV0byBpdGVtV2lkdGggPSBsZWFkaW5nTG9naWNhbFdpZHRoID8gKnN0ZDo6ZXhjaGFuZ2UobGVh
ZGluZ0xvZ2ljYWxXaWR0aCwgV1RGOjpudWxsb3B0KSA6IGlubGluZUl0ZW1XaWR0aCgqbV9wYXJ0
aWFsTGVhZGluZ1RleHRJdGVtLCBjdXJyZW50TG9naWNhbFJpZ2h0KTsKKyAgICAgICAgbGluZUNh
bmRpZGF0ZS5pbmxpbmVDb250ZW50LmFwcGVuZElubGluZUl0ZW0oKm1fcGFydGlhbExlYWRpbmdU
ZXh0SXRlbSwgaXRlbVdpZHRoKTsKKyAgICAgICAgY3VycmVudExvZ2ljYWxSaWdodCArPSBpdGVt
V2lkdGg7CisgICAgICAgICsrY3VycmVudElubGluZUl0ZW1JbmRleDsKKyAgICB9CisKKyAgICBm
b3IgKGF1dG8gaW5kZXggPSBjdXJyZW50SW5saW5lSXRlbUluZGV4OyBpbmRleCA8IHNvZnRXcmFw
T3Bwb3J0dW5pdHlJbmRleDsgKytpbmRleCkgeworICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0g
bV9pbmxpbmVJdGVtc1tpbmRleF07CisgICAgICAgIGlmIChpbmxpbmVJdGVtLmlzRmxvYXQoKSkg
eworICAgICAgICAgICAgbGluZUNhbmRpZGF0ZS5mbG9hdEl0ZW0gPSAmaW5saW5lSXRlbTsKKyAg
ICAgICAgICAgIC8vIFRoaXMgaXMgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHksIG11c3QgYmUgdGhl
IG9ubHkgaXRlbSBpbiB0aGUgbGlzdC4KKyAgICAgICAgICAgIEFTU0VSVChjdXJyZW50SW5saW5l
SXRlbUluZGV4ICsgMSA9PSBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXgpOworICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNUZXh0KCkgfHwg
aW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVu
ZCgpIHx8IGlubGluZUl0ZW0uaXNCb3goKSkgeworICAgICAgICAgICAgQVNTRVJUKCFsZWFkaW5n
TG9naWNhbFdpZHRoIHx8IGlubGluZUl0ZW0uaXNUZXh0KCkpOworICAgICAgICAgICAgYXV0byBs
b2dpY2FsV2lkdGggPSBsZWFkaW5nTG9naWNhbFdpZHRoID8gKnN0ZDo6ZXhjaGFuZ2UobGVhZGlu
Z0xvZ2ljYWxXaWR0aCwgV1RGOjpudWxsb3B0KSA6IGlubGluZUl0ZW1XaWR0aChpbmxpbmVJdGVt
LCBjdXJyZW50TG9naWNhbFJpZ2h0KTsKKyAgICAgICAgICAgIGxpbmVDYW5kaWRhdGUuaW5saW5l
Q29udGVudC5hcHBlbmRJbmxpbmVJdGVtKGlubGluZUl0ZW0sIGxvZ2ljYWxXaWR0aCk7CisgICAg
ICAgICAgICBjdXJyZW50TG9naWNhbFJpZ2h0ICs9IGxvZ2ljYWxXaWR0aDsKKyAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpbmxpbmVJdGVtLmlzTGluZUJyZWFr
KCkgfHwgaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkpIHsKKyAgICAgICAgICAg
IC8vIFNpbmNlIGJvdGggPGJyPiBhbmQgPHdicj4gYXJlIGV4cGxpY2l0IHdvcmQgYnJlYWsgb3Bw
b3J0dW5pdGllcyB0aGV5IGhhdmUgdG8gYmUgdHJhaWxpbmcgaXRlbXMgaW4gdGhpcyBjYW5kaWRh
dGUgcnVuIGxpc3QgdW5sZXNzIHRoZXkgYXJlIGVtYmVkZGVkIGluIGlubGluZSBib3hlcy4KKyAg
ICAgICAgICAgIC8vIGUuZy4gPHNwYW4+PHdicj48L3NwYW4+CisjaWYgQVNTRVJUX0VOQUJMRUQK
KyAgICAgICAgICAgIGZvciAoYXV0byBpID0gaW5kZXggKyAxOyBpIDwgc29mdFdyYXBPcHBvcnR1
bml0eUluZGV4OyArK2kpCisgICAgICAgICAgICAgICAgQVNTRVJUKG1faW5saW5lSXRlbXNbaV0u
aXNJbmxpbmVCb3hFbmQoKSk7CisjZW5kaWYKKyAgICAgICAgICAgIGlubGluZUl0ZW0uaXNMaW5l
QnJlYWsoKSA/IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5hcHBlbmRUcmFpbGluZ0xpbmVC
cmVhayhpbmxpbmVJdGVtKSA6IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5hcHBlbmR0cmFp
bGluZ1dvcmRCcmVha09wcG9ydHVuaXR5KGlubGluZUl0ZW0pOworICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorICAg
IGF1dG8gaW5saW5lQ29udGVudEVuZHNJblNvZnRXcmFwT3Bwb3J0dW5pdHkgPSBbJl0geworICAg
ICAgICBpZiAoIXNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCB8fCBzb2Z0V3JhcE9wcG9ydHVuaXR5
SW5kZXggPT0gbGF5b3V0UmFuZ2UuZW5kKSB7CisgICAgICAgICAgICAvLyBUaGlzIGNhbmRpZGF0
ZSBpbmxpbmUgY29udGVudCBlbmRzIGJlY2F1c2UgdGhlIGVudGlyZSBjb250ZW50IGVuZHMgYW5k
IG5vdCBiZWNhdXNlIHRoZXJlJ3MgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkuCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1faW5saW5lSXRlbXNbc29m
dFdyYXBPcHBvcnR1bml0eUluZGV4IC0gMV0uaXNGbG9hdCgpKSB7CisgICAgICAgICAgICAvLyBX
aGlsZSB3ZSBzdG9wIGF0IGZsb2F0cywgdGhleSBhcmUgbm90IGNvbnNpZGVyZWQgcmVhbCBzb2Z0
IHdyYXAgb3Bwb3J0dW5pdGllcy4gCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyNsaW5l
LWJyZWFrLWRldGFpbHMKKyAgICAgICAgYXV0byYgdHJhaWxpbmdJbmxpbmVJdGVtID0gbV9pbmxp
bmVJdGVtc1tzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggLSAxXTsKKyAgICAgICAgaWYgKHRyYWls
aW5nSW5saW5lSXRlbS5pc0JveCgpIHx8IHRyYWlsaW5nSW5saW5lSXRlbS5pc0xpbmVCcmVhaygp
IHx8IHRyYWlsaW5nSW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkgfHwgdHJhaWxp
bmdJbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpIHsKKyAgICAgICAgICAgIC8vIEZvciBXZWIt
Y29tcGF0aWJpbGl0eSB0aGVyZSBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBiZWZvcmUgYW5k
IGFmdGVyIGVhY2ggcmVwbGFjZWQgZWxlbWVudCBvciBvdGhlciBhdG9taWMgaW5saW5lLgorICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYWlsaW5nSW5s
aW5lSXRlbS5pc1RleHQoKSkgeworICAgICAgICAgICAgYXV0byYgaW5saW5lVGV4dEl0ZW0gPSBk
b3duY2FzdDxJbmxpbmVUZXh0SXRlbT4odHJhaWxpbmdJbmxpbmVJdGVtKTsKKyAgICAgICAgICAg
IGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgICAgIC8vIE5vdyBpbiBjYXNlIG9mIG5vbi13aGl0ZXNwYWNlIHRy
YWlsaW5nIGNvbnRlbnQsIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGFjdHVhbCBzb2Z0IHdyYXAg
b3Bwb3J0dW5pdHkgYmVsb25ncyB0byB0aGUgbmV4dCBzZXQuCisgICAgICAgICAgICAvLyBlLmcu
ICJ0aGlzX2lzX3RoZV90cmFpbGluZ19ydW48c3Bhbj4gPC1idXRfdGhpc19zcGFjZV9oZXJlX2lz
X3RoZV9zb2Z0X3dyYXBfb3Bwb3J0dW5pdHkiCisgICAgICAgICAgICAvLyBXaGVuIHRoZXJlJ3Mg
YW4gaW5saW5lIGJveCBzdGFydCg8c3Bhbj4pL2VuZCg8L3NwYW4+KSBiZXR3ZWVuIHRoZSB0cmFp
bGluZyBhbmQgdGhlIChuZXh0KWxlYWRpbmcgcnVuLCB3aGlsZSB3ZSBicmVhayBiZWZvcmUgdGhl
IGlubGluZSBib3ggc3RhcnQgKDxzcGFuPikKKyAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc29m
dCB3cmFwIHBvc2l0aW9uIGlzIGFmdGVyIHRoZSBpbmxpbmUgYm94IHN0YXJ0ICg8c3Bhbj4pIGJ1
dCBpbiB0ZXJtcyBvZiBsaW5lIGJyZWFraW5nIGNvbnRpbnVpdHkgdGhlIGlubGluZSBib3ggc3Rh
cnQgKDxzcGFuPikgYW5kIHRoZSB3aGl0ZXNwYWNlIHJ1biBiZWxvbmcgdG9nZXRoZXIuCisgICAg
ICAgICAgICBSRUxFQVNFX0FTU0VSVChsYXlvdXRSYW5nZS5lbmQgPD0gbV9pbmxpbmVJdGVtcy5z
aXplKCkpOworICAgICAgICAgICAgZm9yIChhdXRvIGluZGV4ID0gc29mdFdyYXBPcHBvcnR1bml0
eUluZGV4OyBpbmRleCA8IGxheW91dFJhbmdlLmVuZDsgKytpbmRleCkgeworICAgICAgICAgICAg
ICAgIGlmIChtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJveFN0YXJ0KCkgfHwgbV9pbmxp
bmVJdGVtc1tpbmRleF0uaXNJbmxpbmVCb3hFbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IENoZWNrIGlmIFtub24td2hpdGVzcGFj
ZV1baW5saW5lLWJveF1bbm8td2hpdGVzcGFjZV0gY29udGVudCBoYXMgcnVsZXMgYWJvdXQgaXQu
CisgICAgICAgICAgICAgICAgLy8gRm9yIG5vdyBsZXQncyBzYXkgdGhlIHNvZnQgd3JhcCBwb3Np
dGlvbiBiZWxvbmdzIHRvIHRoZSBuZXh0IHNldCBvZiBydW5zIHdoZW4gW25vbi13aGl0ZXNwYWNl
XVtpbmxpbmUtYm94XVt3aGl0ZXNwYWNlXSwgW25vbi13aGl0ZXNwYWNlXVtpbmxpbmUtYm94XVti
b3hdIGV0Yy4KKyAgICAgICAgICAgICAgICByZXR1cm4gbV9pbmxpbmVJdGVtc1tpbmRleF0uaXNU
ZXh0KCkgJiYgIWRvd25jYXN0PElubGluZVRleHRJdGVtPihtX2lubGluZUl0ZW1zW2luZGV4XSku
aXNXaGl0ZXNwYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfTsKKyAgICBsaW5lQ2FuZGlkYXRlLmlubGluZUNvbnRlbnQuc2V0SGFzVHJh
aWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KGlubGluZUNvbnRlbnRFbmRzSW5Tb2Z0V3JhcE9wcG9y
dHVuaXR5KCkpOworfQorCitzaXplX3QgTGluZUJ1aWxkZXI6Om5leHRXcmFwT3Bwb3J0dW5pdHko
c2l6ZV90IHN0YXJ0SW5kZXgsIGNvbnN0IExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UmIGxh
eW91dFJhbmdlKSBjb25zdAoreworICAgIC8vIDEuIEZpbmQgdGhlIHN0YXJ0IGNhbmRpZGF0ZSBi
eSBza2lwcGluZyBsZWFkaW5nIG5vbi1jb250ZW50IGl0ZW1zIGUuZyAiPHNwYW4+PHNwYW4+c3Rh
cnQiLiBPcHBvcnR1bml0eSBpcyBhZnRlciAiPHNwYW4+PHNwYW4+Ii4KKyAgICAvLyAyLiBGaW5k
IHRoZSBlbmQgY2FuZGlkYXRlIGJ5IHNraXBwaW5nIG5vbi1jb250ZW50IGl0ZW1zIGluYmV0d2Vl
biBlLmcuICI8c3Bhbj48c3Bhbj5zdGFydDwvc3Bhbj5lbmQiLiBPcHBvcnR1bml0eSBpcyBhZnRl
ciAiPC9zcGFuPiIuCisgICAgLy8gMy4gQ2hlY2sgaWYgdGhlcmUncyBhIHNvZnQgd3JhcCBvcHBv
cnR1bml0eSBiZXR3ZWVuIHRoZSAyIGNhbmRpZGF0ZSBpbmxpbmUgaXRlbXMgYW5kIHJlcGVhdC4K
KyAgICAvLyA0LiBBbnkgZm9yY2UgbGluZSBicmVhay9leHBsaWNpdCB3cmFwIGNvbnRlbnQgaW5i
ZXR3ZWVuIGlzIGNvbnNpZGVyZWQgYXMgd3JhcCBvcHBvcnR1bml0eS4KKworICAgIC8vIFtleC1d
W2lubGluZSBib3ggc3RhcnRdW2lubGluZSBib3ggZW5kXVtmbG9hdF1bYW1wbGVdIChleC08c3Bh
bj48L3NwYW4+PGRpdiBzdHlsZT0iZmxvYXQ6bGVmdCI+PC9kaXY+YW1wbGUpLiBXcmFwIGluZGV4
IGlzIGF0IFtleC1dLgorICAgIC8vIFtleF1baW5saW5lIGJveCBzdGFydF1bYW1wLV1baW5saW5l
IGJveCBzdGFydF1bbGVdIChleDxzcGFuPmFtcC08c3Bhbj5hbXBsZSkuIFdyYXAgaW5kZXggaXMg
YXQgW2FtcC1dLgorICAgIC8vIFtleC1dW2lubGluZSBib3ggc3RhcnRdW2xpbmUgYnJlYWtdW2Ft
cGxlXSAoZXgtPHNwYW4+PGJyPmFtcGxlKS4gV3JhcCBpbmRleCBpcyBhZnRlciBbYnJdLgorICAg
IGF1dG8gcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBPcHRpb25hbDxzaXplX3Q+IHsgfTsKKyAg
ICBmb3IgKGF1dG8gaW5kZXggPSBzdGFydEluZGV4OyBpbmRleCA8IGxheW91dFJhbmdlLmVuZDsg
KytpbmRleCkgeworICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gbV9pbmxpbmVJdGVtc1tpbmRl
eF07CisgICAgICAgIGlmIChpbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkgfHwgaW5saW5lSXRlbS5p
c1dvcmRCcmVha09wcG9ydHVuaXR5KCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGFsd2F5cyBzdG9w
IGF0IGV4cGxpY2l0IHdyYXBwaW5nIG9wcG9ydHVuaXRpZXMgZS5nLiA8YnI+LiBIb3dldmVyIHRo
ZSB3cmFwIHBvc2l0aW9uIG1heSBiZSBhdCBsYXRlciBwb3NpdGlvbi4KKyAgICAgICAgICAgIC8v
IGUuZy4gPHNwYW4+PHNwYW4+PGJyPjwvc3Bhbj48L3NwYW4+IDwtIHdyYXAgcG9zaXRpb24gaXMg
YWZ0ZXIgdGhlIHNlY29uZCA8L3NwYW4+CisgICAgICAgICAgICAvLyBidXQgaW4gY2FzZSBvZiA8
c3Bhbj48YnI+PHNwYW4+PC9zcGFuPjwvc3Bhbj4gPC0gd3JhcCBwb3NpdGlvbiBpcyByaWdodCBh
ZnRlciA8YnI+LgorICAgICAgICAgICAgZm9yICgrK2luZGV4OyBpbmRleCA8IGxheW91dFJhbmdl
LmVuZCAmJiBtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJveEVuZCgpOyArK2luZGV4KSB7
IH0KKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5s
aW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgp
KSB7CisgICAgICAgICAgICAvLyBOZWVkIHRvIHNlZSB3aGF0IGNvbWVzIG5leHQgdG8gZGVjaWRl
LgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUKGlubGlu
ZUl0ZW0uaXNUZXh0KCkgfHwgaW5saW5lSXRlbS5pc0JveCgpIHx8IGlubGluZUl0ZW0uaXNGbG9h
dCgpKTsKKyAgICAgICAgaWYgKCFwcmV2aW91c0lubGluZUl0ZW1JbmRleCkgeworICAgICAgICAg
ICAgcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICB9CisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgcHJldmlvdXMgYW5kIGN1cnJl
bnQgaXRlbXMgYXJlIG5vdCBuZWNlc3NhcmlseSBhZGphY2VudCBpdGVtcyBlLmcgInByZXZpb3Vz
PHNwYW4+Y3VycmVudDwvc3Bhbj4iCisgICAgICAgIGF1dG8mIHByZXZpb3VzSXRlbSA9IG1faW5s
aW5lSXRlbXNbKnByZXZpb3VzSW5saW5lSXRlbUluZGV4XTsKKyAgICAgICAgYXV0byYgY3VycmVu
dEl0ZW0gPSBtX2lubGluZUl0ZW1zW2luZGV4XTsKKyAgICAgICAgaWYgKGlzQXRTb2Z0V3JhcE9w
cG9ydHVuaXR5KG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQsIHByZXZpb3VzSXRlbSwgY3VycmVu
dEl0ZW0pKSB7CisgICAgICAgICAgICBpZiAoKnByZXZpb3VzSW5saW5lSXRlbUluZGV4ICsgMSA9
PSBpbmRleCAmJiAoIXByZXZpb3VzSXRlbS5pc1RleHQoKSB8fCAhY3VycmVudEl0ZW0uaXNUZXh0
KCkpKSB7CisgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBrbm93IHRoZSBleGFjdCBzb2Z0IHdy
YXAgb3Bwb3J0dW5pdHkgaW5kZXggd2hlbiB0aGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgaXRlbXMg
YXJlIG5leHQgdG8gZWFjaCBvdGhlci4KKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGVyZSdzIGEgc29mdCB3cmFwIG9wcG9ydHVu
aXR5IGJldHdlZW4gJ3ByZXZpb3VzSW5saW5lSXRlbUluZGV4JyBhbmQgJ2luZGV4Jy4KKyAgICAg
ICAgICAgIC8vIE5vdyBmb3J3YXJkLWZpbmQgZnJvbSB0aGUgc3RhcnQgcG9zaXRpb24gdG8gc2Vl
IHdoZXJlIHdlIGNhbiBhY3R1YWxseSB3cmFwLgorICAgICAgICAgICAgLy8gW2V4LV1bYW1wbGVd
IHZzLiBbZXgtXVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF1bYW1wbGVdCisgICAg
ICAgICAgICAvLyB3aGVyZSBbZXgtXSBpcyBzdGFydENvbnRlbnQgYW5kIFthbXBsZV0gaXMgdGhl
IG5leHRDb250ZW50LgorICAgICAgICAgICAgZm9yIChhdXRvIGNhbmRpZGF0ZUluZGV4ID0gKnBy
ZXZpb3VzSW5saW5lSXRlbUluZGV4ICsgMTsgY2FuZGlkYXRlSW5kZXggPCBpbmRleDsgKytjYW5k
aWRhdGVJbmRleCkgeworICAgICAgICAgICAgICAgIGlmIChtX2lubGluZUl0ZW1zW2NhbmRpZGF0
ZUluZGV4XS5pc0lubGluZUJveFN0YXJ0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5s
aW5lIGNvbnRlbnQgYW5kIFtpbmxpbmUgYm94IHN0YXJ0XSBhbmQgW2lubGluZSBib3ggZW5kXSBm
b3JtIHVuYnJlYWthYmxlIGNvbnRlbnQuCisgICAgICAgICAgICAgICAgICAgIC8vIGV4LTxzcGFu
Pjwvc3Bhbj5hbXBsZSAgOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC0iLgorICAgICAg
ICAgICAgICAgICAgICAvLyBleC08L3NwYW4+PC9zcGFuPmFtcGxlIDogd3JhcCBvcHBvcnR1bml0
eSBpcyBhZnRlciAiZXgtPC9zcGFuPjwvc3Bhbj4iLgorICAgICAgICAgICAgICAgICAgICAvLyBl
eC08L3NwYW4+PHNwYW4+YW1wbGU8L3NwYW4+IDogd3JhcCBvcHBvcnR1bml0eSBpcyBhZnRlciAi
ZXgtPC9zcGFuPiIuCisgICAgICAgICAgICAgICAgICAgIC8vIGV4LTxzcGFuPjxzcGFuPmFtcGxl
PC9zcGFuPjwvc3Bhbj4gOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC0iLgorICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlSW5kZXg7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CisgICAg
ICAgIHByZXZpb3VzSW5saW5lSXRlbUluZGV4ID0gaW5kZXg7CisgICAgfQorICAgIHJldHVybiBs
YXlvdXRSYW5nZS5lbmQ7Cit9CisKK3ZvaWQgTGluZUJ1aWxkZXI6OmhhbmRsZUZsb2F0Q29udGVu
dChjb25zdCBJbmxpbmVJdGVtJiBmbG9hdEl0ZW0pCit7CisgICAgYXV0byYgZmxvYXRCb3ggPSBm
bG9hdEl0ZW0ubGF5b3V0Qm94KCk7CisgICAgbV9mbG9hdHMuYXBwZW5kKCZmbG9hdEJveCk7CisK
KyAgICBhdXRvKiBmbG9hdGluZ1N0YXRlID0gdGhpcy0+ZmxvYXRpbmdTdGF0ZSgpOworICAgIGlm
ICghZmxvYXRpbmdTdGF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKGZvcm1hdHRp
bmdTdGF0ZSgpKTsKKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLT5i
b3hHZW9tZXRyeShmbG9hdEJveCk7CisgICAgLy8gU2V0IHN0YXRpYyBwb3NpdGlvbiBmaXJzdC4K
KyAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVmdChMYXlvdXRQb2ludCB7IG1fbGluZUxv
Z2ljYWxSZWN0LnRvcExlZnQoKSB9KTsKKyAgICAvLyBGbG9hdCBpdC4KKyAgICBBU1NFUlQobV9y
b290SG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZs
b2F0aW5nQ29udGV4dCB7IGZvcm1hdHRpbmdDb250ZXh0KCksICpmbG9hdGluZ1N0YXRlIH07Cisg
ICAgYXV0byBmbG9hdGluZ1Bvc2l0aW9uID0gZmxvYXRpbmdDb250ZXh0LnBvc2l0aW9uRm9yRmxv
YXQoZmxvYXRCb3gsICptX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHMpOworICAgIGJveEdlb21l
dHJ5LnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nUG9zaXRpb24pOworICAgIGZsb2F0aW5nU3Rh
dGUtPmFwcGVuZChmbG9hdGluZ0NvbnRleHQudG9GbG9hdEl0ZW0oZmxvYXRCb3gpKTsKKyAgICAv
LyBDaGVjayBpZiB0aGlzIGZsb2F0IHNocmlua3MgdGhlIGxpbmUgKHRoZXkgZG9uJ3QgZ2V0IHBv
c2l0aW9uZWQgaGlnaGVyIHRoYW4gdGhlIGxpbmUpLgorICAgIGlmIChmbG9hdGluZ1Bvc2l0aW9u
LnkoKSA+IG1fbGluZUxvZ2ljYWxSZWN0LmJvdHRvbSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IHRydWU7CisgICAgYXV0byBmbG9hdEJv
eFdpZHRoID0gaW5saW5lSXRlbVdpZHRoKGZsb2F0SXRlbSwgeyB9KTsKKyAgICBpZiAoZmxvYXRC
b3guaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpCisgICAgICAgIG1fbGluZUxvZ2ljYWxSZWN0
LnNldExlZnQobV9saW5lTG9naWNhbFJlY3QubGVmdCgpICsgZmxvYXRCb3hXaWR0aCk7ICAgIAor
ICAgIG1fbGluZUxvZ2ljYWxSZWN0LmV4cGFuZEhvcml6b250YWxseSgtZmxvYXRCb3hXaWR0aCk7
Cit9CisKK0xpbmVCdWlsZGVyOjpSZXN1bHQgTGluZUJ1aWxkZXI6OmhhbmRsZUlubGluZUNvbnRl
bnQoSW5saW5lQ29udGVudEJyZWFrZXImIGlubGluZUNvbnRlbnRCcmVha2VyLCBjb25zdCBJbmxp
bmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBjb25zdCBMaW5lQ2FuZGlkYXRlJiBsaW5lQ2FuZGlk
YXRlKQoreworICAgIGF1dG8mIGlubGluZUNvbnRlbnQgPSBsaW5lQ2FuZGlkYXRlLmlubGluZUNv
bnRlbnQ7CisgICAgaWYgKGlubGluZUNvbnRlbnQuY29udGludW91c0NvbnRlbnQoKS5ydW5zKCku
aXNFbXB0eSgpKSB7CisgICAgICAgIEFTU0VSVChpbmxpbmVDb250ZW50LnRyYWlsaW5nTGluZUJy
ZWFrKCkgfHwgaW5saW5lQ29udGVudC50cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5KCkpOwor
ICAgICAgICByZXR1cm4geyBpbmxpbmVDb250ZW50LnRyYWlsaW5nTGluZUJyZWFrKCkgPyBJbmxp
bmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllcyA6IElubGluZUNvbnRlbnRCcmVha2Vy
OjpJc0VuZE9mTGluZTo6Tm8gfTsKKyAgICB9CisgICAgYXV0byBzaG91bGREaXNhYmxlSHlwaGVu
YXRpb24gPSBbJl0geworICAgICAgICBhdXRvJiBzdHlsZSA9IHJvb3QoKS5zdHlsZSgpOworICAg
ICAgICB1bnNpZ25lZCBsaW1pdExpbmVzID0gc3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCkg
PT0gUmVuZGVyU3R5bGU6OmluaXRpYWxIeXBoZW5hdGlvbkxpbWl0TGluZXMoKSA/IHN0ZDo6bnVt
ZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSA6IHN0eWxlLmh5cGhlbmF0aW9uTGltaXRMaW5l
cygpOworICAgICAgICByZXR1cm4gbV9zdWNjZXNzaXZlSHlwaGVuYXRlZExpbmVDb3VudCA+PSBs
aW1pdExpbmVzOworICAgIH07CisgICAgaWYgKHNob3VsZERpc2FibGVIeXBoZW5hdGlvbigpKQor
ICAgICAgICBpbmxpbmVDb250ZW50QnJlYWtlci5zZXRIeXBoZW5hdGlvbkRpc2FibGVkKCk7CisK
KyAgICBhdXRvJiBjb250aW51b3VzSW5saW5lQ29udGVudCA9IGxpbmVDYW5kaWRhdGUuaW5saW5l
Q29udGVudC5jb250aW51b3VzQ29udGVudCgpOworICAgIGF1dG8gbGluZUxvZ2ljYWxSZWN0Rm9y
Q2FuZGlkYXRlQ29udGVudCA9IFsmXSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjYW5kaWRh
dGUgY29udGVudCB3b3VsZCBzdHJldGNoIHRoZSBsaW5lIGFuZCB3aGV0aGVyIGFkZGl0aW9uYWwg
ZmxvYXRzIGFyZSBnZXR0aW5nIGluIHRoZSB3YXkuCisgICAgICAgIGlmICghZmxvYXRpbmdTdGF0
ZSgpIHx8ICFpbmxpbmVDb250ZW50Lmhhc0lubGluZUxldmVsQm94KCkpCisgICAgICAgICAgICBy
ZXR1cm4gbV9saW5lTG9naWNhbFJlY3Q7CisgICAgICAgIGF1dG8gbWF4aW11bUxpbmVMb2dpY2Fs
SGVpZ2h0ID0gbV9saW5lTG9naWNhbFJlY3QuaGVpZ2h0KCk7CisgICAgICAgIGZvciAoYXV0byYg
cnVuIDogY29udGludW91c0lubGluZUNvbnRlbnQucnVucygpKSB7CisgICAgICAgICAgICAvLyBG
SVhNRTogQWRkIHN1cHBvcnQgZm9yIGlubGluZSBib3hlcyB0b28uCisgICAgICAgICAgICBpZiAo
IXJ1bi5pbmxpbmVJdGVtLmlzQm94KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgICAgICBtYXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQgPSBzdGQ6Om1heChtYXhpbXVtTGluZUxv
Z2ljYWxIZWlnaHQsIElubGluZUxheW91dFVuaXQgeyBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21l
dHJ5Rm9yQm94KHJ1bi5pbmxpbmVJdGVtLmxheW91dEJveCgpKS5tYXJnaW5Cb3hIZWlnaHQoKSB9
KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4aW11bUxpbmVMb2dpY2FsSGVpZ2h0ID09IG1f
bGluZUxvZ2ljYWxSZWN0LmhlaWdodCgpKQorICAgICAgICAgICAgcmV0dXJuIG1fbGluZUxvZ2lj
YWxSZWN0OworICAgICAgICBhdXRvIGFkanVzdGVkTGluZUxvZ2ljYWxSZWN0ID0gSW5saW5lUmVj
dCB7IG1fbGluZUxvZ2ljYWxSZWN0LnRvcCgpLCBtX2xpbmVMb2dpY2FsUmVjdC5sZWZ0KCksIG1f
bGluZUxvZ2ljYWxSZWN0LndpZHRoKCksIG1heGltdW1MaW5lTG9naWNhbEhlaWdodCB9OworICAg
ICAgICBpZiAoYXV0byBob3Jpem9udGFsQ29uc3RyYWludHMgPSBmbG9hdENvbnN0cmFpbnRzKGFk
anVzdGVkTGluZUxvZ2ljYWxSZWN0KSkgeworICAgICAgICAgICAgYWRqdXN0ZWRMaW5lTG9naWNh
bFJlY3Quc2V0TGVmdChob3Jpem9udGFsQ29uc3RyYWludHMtPmxvZ2ljYWxMZWZ0KTsKKyAgICAg
ICAgICAgIGFkanVzdGVkTGluZUxvZ2ljYWxSZWN0LnNldFdpZHRoKGhvcml6b250YWxDb25zdHJh
aW50cy0+bG9naWNhbFdpZHRoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRqdXN0ZWRM
aW5lTG9naWNhbFJlY3Q7CisgICAgfSgpOworICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBbJl0g
eworICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoRm9yQ29udGVudCA9IGxpbmVMb2dpY2FsUmVj
dEZvckNhbmRpZGF0ZUNvbnRlbnQud2lkdGgoKSAtIG1fbGluZS5jb250ZW50TG9naWNhbFJpZ2h0
KCk7CisgICAgICAgIHJldHVybiBzdGQ6OmlzbmFuKGF2YWlsYWJsZVdpZHRoRm9yQ29udGVudCkg
PyBtYXhJbmxpbmVMYXlvdXRVbml0KCkgOiBhdmFpbGFibGVXaWR0aEZvckNvbnRlbnQ7CisgICAg
fSgpOworICAgIC8vIFdoaWxlIHRoZSBmbG9hdHMgYXJlIG5vdCBjb25zaWRlcmVkIHRvIGJlIG9u
IHRoZSBsaW5lLCB0aGV5IG1ha2UgdGhlIGxpbmUgY29udGVudGZ1bCBmb3IgbGluZSBicmVha2lu
Zy4KKyAgICBhdXRvIGxpbmVIYXNDb250ZW50ID0gIW1fbGluZS5ydW5zKCkuaXNFbXB0eSgpIHx8
IG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0OworICAgIGF1dG8gbGluZVN0YXR1cyA9IElu
bGluZUNvbnRlbnRCcmVha2VyOjpMaW5lU3RhdHVzIHsgbV9saW5lLmNvbnRlbnRMb2dpY2FsUmln
aHQoKSwgYXZhaWxhYmxlV2lkdGgsIG1fbGluZS50cmltbWFibGVUcmFpbGluZ1dpZHRoKCksIG1f
bGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpLCBtX2xpbmUuaXNUcmFpbGluZ1J1bkZ1bGx5
VHJpbW1hYmxlKCksIGxpbmVIYXNDb250ZW50LCAhbV93cmFwT3Bwb3J0dW5pdHlMaXN0LmlzRW1w
dHkoKSB9OworICAgIGF1dG8gcmVzdWx0ID0gaW5saW5lQ29udGVudEJyZWFrZXIucHJvY2Vzc0lu
bGluZUNvbnRlbnQoY29udGludW91c0lubGluZUNvbnRlbnQsIGxpbmVTdGF0dXMpOworICAgIGF1
dG8mIGNhbmRpZGF0ZVJ1bnMgPSBjb250aW51b3VzSW5saW5lQ29udGVudC5ydW5zKCk7CisgICAg
aWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9u
OjpLZWVwKSB7CisgICAgICAgIC8vIFRoaXMgY29udGludW91cyBjb250ZW50IGNhbiBiZSBmdWxs
eSBwbGFjZWQgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgbV9saW5lTG9naWNhbFJlY3Qg
PSBsaW5lTG9naWNhbFJlY3RGb3JDYW5kaWRhdGVDb250ZW50OworICAgICAgICBmb3IgKGF1dG8m
IHJ1biA6IGNhbmRpZGF0ZVJ1bnMpCisgICAgICAgICAgICBtX2xpbmUuYXBwZW5kKHJ1bi5pbmxp
bmVJdGVtLCBydW4ubG9naWNhbFdpZHRoKTsKKyAgICAgICAgaWYgKGxpbmVDYW5kaWRhdGUuaW5s
aW5lQ29udGVudC5oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoKSkgeworICAgICAgICAg
ICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGFsbG93ZWQgdG8gd3JhcCBhdCB0aGlzIHBvc2l0aW9uLgor
ICAgICAgICAgICAgYXV0byYgdHJhaWxpbmdJdGVtID0gY2FuZGlkYXRlUnVucy5sYXN0KCkuaW5s
aW5lSXRlbTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBUaGVyZSBtdXN0IGJlIGEgd2F5IHRvIGRl
Y2lkZSBpZiB0aGUgdHJhaWxpbmcgcnVuIGFjdHVhbGx5IGVuZGVkIHVwIG9uIHRoZSBsaW5lLgor
ICAgICAgICAgICAgLy8gTGV0J3MganVzdCBkZWFsIHdpdGggY29sbGFwc2VkIGxlYWRpbmcgd2hp
dGVzcGFjZSBmb3Igbm93LgorICAgICAgICAgICAgaWYgKCFtX2xpbmUucnVucygpLmlzRW1wdHko
KSAmJiBJbmxpbmVDb250ZW50QnJlYWtlcjo6aXNXcmFwcGluZ0FsbG93ZWQodHJhaWxpbmdJdGVt
KSkKKyAgICAgICAgICAgICAgICBtX3dyYXBPcHBvcnR1bml0eUxpc3QuYXBwZW5kKCZ0cmFpbGlu
Z0l0ZW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB7IHJlc3VsdC5pc0VuZE9mTGluZSwg
eyBjYW5kaWRhdGVSdW5zLnNpemUoKSwgZmFsc2UgfSB9OworICAgIH0KKworICAgIGF1dG8gZWxp
Z2libGVPdmVyZmxvd1dpZHRoQXNMZWFkaW5nID0gWyZdICgpIC0+IE9wdGlvbmFsPElubGluZUxh
eW91dFVuaXQ+IHsKKyAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBvdGhlciB0eXBl
cyBvZiBjb250aW51b3VzIGNvbnRlbnQuCisgICAgICAgIEFTU0VSVChyZXN1bHQuYWN0aW9uID09
IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6V3JhcCB8fCByZXN1bHQuYWN0
aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6QnJlYWspOworICAg
ICAgICBpZiAoY2FuZGlkYXRlUnVucy5zaXplKCkgIT0gMSB8fCAhY2FuZGlkYXRlUnVucy5maXJz
dCgpLmlubGluZUl0ZW0uaXNUZXh0KCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAg
ICBhdXRvJiBpbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihjYW5kaWRh
dGVSdW5zLmZpcnN0KCkuaW5saW5lSXRlbSk7CisgICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5p
c1doaXRlc3BhY2UoKSkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgIGlmIChyZXN1
bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6V3JhcCkK
KyAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVSdW5zLmZpcnN0KCkubG9naWNhbFdpZHRoOwor
ICAgICAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0
OjpBY3Rpb246OkJyZWFrICYmIHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50LT5wYXJ0aWFs
UnVuKQorICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVJ1bnMuZmlyc3QoKS5sb2dpY2FsV2lk
dGggLSByZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+cGFydGlhbFJ1bi0+bG9naWNhbFdp
ZHRoOworICAgICAgICByZXR1cm4geyB9OworICAgIH07CisKKyAgICBpZiAocmVzdWx0LmFjdGlv
biA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rpb246OldyYXApIHsKKyAgICAg
ICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNF
bmRPZkxpbmU6Olllcyk7CisgICAgICAgIC8vIFRoaXMgY29udGludW91cyBjb250ZW50IGNhbid0
IGJlIHBsYWNlZCBvbiB0aGUgY3VycmVudCBsaW5lLiBOb3RoaW5nIHRvIGNvbW1pdCBhdCB0aGlz
IHRpbWUuCisgICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGlu
ZTo6WWVzLCB7IH0sIHsgfSwgZWxpZ2libGVPdmVyZmxvd1dpZHRoQXNMZWFkaW5nKCkgfTsKKyAg
ICB9CisgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3Vs
dDo6QWN0aW9uOjpXcmFwV2l0aEh5cGhlbikgeworICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5k
T2ZMaW5lID09IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKKyAgICAg
ICAgLy8gVGhpcyBjb250aW51b3VzIGNvbnRlbnQgY2FuJ3QgYmUgcGxhY2VkIG9uIHRoZSBjdXJy
ZW50IGxpbmUsIG5vdGhpbmcgdG8gY29tbWl0LgorICAgICAgICAvLyBIb3dldmVyIHdlIG5lZWQg
dG8gbWFrZSBzdXJlIHRoYXQgdGhlIGN1cnJlbnQgbGluZSBnYWlucyBhIHRyYWlsaW5nIGh5cGhl
bi4KKyAgICAgICAgQVNTRVJUKG1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpKTsKKyAg
ICAgICAgbV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCptX2xpbmUudHJhaWxpbmdTb2Z0SHlwaGVu
V2lkdGgoKSk7CisgICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9m
TGluZTo6WWVzIH07CisgICAgfQorICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRl
bnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0V3JhcE9wcG9ydHVuaXR5KSB7
CisgICAgICAgIEFTU0VSVChyZXN1bHQuaXNFbmRPZkxpbmUgPT0gSW5saW5lQ29udGVudEJyZWFr
ZXI6OklzRW5kT2ZMaW5lOjpZZXMpOworICAgICAgICAvLyBOb3Qgb25seSB0aGlzIGNvbnRlbnQg
Y2FuJ3QgYmUgcGxhY2VkIG9uIHRoZSBjdXJyZW50IGxpbmUsIGJ1dCB3ZSBldmVuIG5lZWQgdG8g
cmV2ZXJ0IHRoZSBsaW5lIGJhY2sgdG8gYW4gZWFybGllciBwb3NpdGlvbi4KKyAgICAgICAgQVNT
RVJUKCFtX3dyYXBPcHBvcnR1bml0eUxpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgcmV0dXJuIHsg
SW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgcmVidWlsZExpbmUobGF5
b3V0UmFuZ2UsICptX3dyYXBPcHBvcnR1bml0eUxpc3QubGFzdCgpKSwgdHJ1ZSB9IH07CisgICAg
fQorICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6
OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0Tm9uT3ZlcmZsb3dpbmdXcmFwT3Bwb3J0dW5pdHkpIHsKKyAg
ICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6
SXNFbmRPZkxpbmU6Olllcyk7CisgICAgICAgIEFTU0VSVCghbV93cmFwT3Bwb3J0dW5pdHlMaXN0
LmlzRW1wdHkoKSk7CisgICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0Vu
ZE9mTGluZTo6WWVzLCB7IHJlYnVpbGRMaW5lRm9yVHJhaWxpbmdTb2Z0SHlwaGVuKGxheW91dFJh
bmdlKSwgdHJ1ZSB9IH07CisgICAgfQorICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNv
bnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6QnJlYWspIHsKKyAgICAgICAgQVNTRVJUKHJl
c3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olll
cyk7CisgICAgICAgIC8vIENvbW1pdCB0aGUgY29tYmluYXRpb24gb2YgZnVsbCBhbmQgcGFydGlh
bCBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCisgICAgICAgIEFTU0VSVChyZXN1bHQucGFy
dGlhbFRyYWlsaW5nQ29udGVudCk7CisgICAgICAgIGNvbW1pdFBhcnRpYWxDb250ZW50KGNhbmRp
ZGF0ZVJ1bnMsICpyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudCk7CisgICAgICAgIC8vIFdo
ZW4gYnJlYWtpbmcgbXVsdGlwbGUgcnVucyA8c3BhbiBzdHlsZT0id29yZC1icmVhazogYnJlYWst
YWxsIj50ZXh0PC9zcGFuPjxzcGFuPmNvbnRlbnQ8L3NwYW4+LCB3ZSBtaWdodCBlbmQgdXAgYnJl
YWtpbmcgdGhlbSBhdCBydW4gYm91bmRhcnkuCisgICAgICAgIC8vIEl0IHNpbXBseSBtZWFucyB3
ZSBkb24ndCByZWFsbHkgaGF2ZSBhIHBhcnRpYWwgcnVuLiBQYXJ0aWFsIGNvbnRlbnQgeWVzLCBi
dXQgbm90IHBhcnRpYWwgcnVuLgorICAgICAgICBhdXRvIHRyYWlsaW5nUnVuSW5kZXggPSByZXN1
bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+dHJhaWxpbmdSdW5JbmRleDsKKyAgICAgICAgYXV0
byBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgPSB0cmFpbGluZ1J1bkluZGV4ICsgMTsKKyAgICAg
ICAgaWYgKCFyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+cGFydGlhbFJ1bikKKyAgICAg
ICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzLCB7
IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCwgZmFsc2UgfSB9OworCisgICAgICAgIGF1dG8gcGFy
dGlhbFJ1biA9ICpyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+cGFydGlhbFJ1bjsKKyAg
ICAgICAgYXV0byYgdHJhaWxpbmdJbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJ
dGVtPihjYW5kaWRhdGVSdW5zW3RyYWlsaW5nUnVuSW5kZXhdLmlubGluZUl0ZW0pOworICAgICAg
ICBBU1NFUlQocGFydGlhbFJ1bi5sZW5ndGggPCB0cmFpbGluZ0lubGluZVRleHRJdGVtLmxlbmd0
aCgpKTsKKyAgICAgICAgYXV0byBvdmVyZmxvd0xlbmd0aCA9IHRyYWlsaW5nSW5saW5lVGV4dEl0
ZW0ubGVuZ3RoKCkgLSBwYXJ0aWFsUnVuLmxlbmd0aDsKKyAgICAgICAgcmV0dXJuIHsgSW5saW5l
Q29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgY29tbWl0dGVkSW5saW5lSXRlbUNv
dW50LCBmYWxzZSB9LCBvdmVyZmxvd0xlbmd0aCwgZWxpZ2libGVPdmVyZmxvd1dpZHRoQXNMZWFk
aW5nKCkgfTsKKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIHsg
SW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9OworfQorCit2b2lkIExpbmVC
dWlsZGVyOjpjb21taXRQYXJ0aWFsQ29udGVudChjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6
Q29udGludW91c0NvbnRlbnQ6OlJ1bkxpc3QmIHJ1bnMsIGNvbnN0IElubGluZUNvbnRlbnRCcmVh
a2VyOjpSZXN1bHQ6OlBhcnRpYWxUcmFpbGluZ0NvbnRlbnQmIHBhcnRpYWxUcmFpbGluZ0NvbnRl
bnQpCit7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJ1bnMuc2l6ZSgpOyAr
K2luZGV4KSB7CisgICAgICAgIGF1dG8mIHJ1biA9IHJ1bnNbaW5kZXhdOworICAgICAgICBpZiAo
cGFydGlhbFRyYWlsaW5nQ29udGVudC50cmFpbGluZ1J1bkluZGV4ID09IGluZGV4KSB7CisgICAg
ICAgICAgICAvLyBDcmVhdGUgYW5kIGNvbW1pdCBwYXJ0aWFsIHRyYWlsaW5nIGl0ZW0uCisgICAg
ICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gcGFydGlhbFRyYWlsaW5nQ29udGVudC5wYXJ0
aWFsUnVuKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKHJ1bi5pbmxpbmVJdGVtLmlzVGV4dCgp
KTsKKyAgICAgICAgICAgICAgICBhdXRvJiB0cmFpbGluZ0lubGluZVRleHRJdGVtID0gZG93bmNh
c3Q8SW5saW5lVGV4dEl0ZW0+KHJ1bnNbcGFydGlhbFRyYWlsaW5nQ29udGVudC50cmFpbGluZ1J1
bkluZGV4XS5pbmxpbmVJdGVtKTsKKyAgICAgICAgICAgICAgICBhdXRvIHBhcnRpYWxUcmFpbGlu
Z1RleHRJdGVtID0gdHJhaWxpbmdJbmxpbmVUZXh0SXRlbS5sZWZ0KHBhcnRpYWxSdW4tPmxlbmd0
aCk7CisgICAgICAgICAgICAgICAgbV9saW5lLmFwcGVuZChwYXJ0aWFsVHJhaWxpbmdUZXh0SXRl
bSwgcGFydGlhbFJ1bi0+bG9naWNhbFdpZHRoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXV0byBo
eXBoZW5XaWR0aCA9IHBhcnRpYWxSdW4tPmh5cGhlbldpZHRoKQorICAgICAgICAgICAgICAgICAg
ICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBoZW4oKmh5cGhlbldpZHRoKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGUgcGFydGlhbCBydW4g
aXMgdGhlIGxhc3QgY29udGVudCB0byBjb21taXQuCisgICAgICAgICAgICBtX2xpbmUuYXBwZW5k
KHJ1bi5pbmxpbmVJdGVtLCBydW4ubG9naWNhbFdpZHRoKTsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorICAgICAgICBtX2xpbmUuYXBwZW5kKHJ1bi5pbmxpbmVJdGVtLCBydW4ubG9n
aWNhbFdpZHRoKTsKKyAgICB9Cit9CisKK3NpemVfdCBMaW5lQnVpbGRlcjo6cmVidWlsZExpbmUo
Y29uc3QgSW5saW5lSXRlbVJhbmdlJiBsYXlvdXRSYW5nZSwgY29uc3QgSW5saW5lSXRlbSYgbGFz
dElubGluZUl0ZW1Ub0FkZCkKK3sKKyAgICBBU1NFUlQoIW1fd3JhcE9wcG9ydHVuaXR5TGlzdC5p
c0VtcHR5KCkpOworICAgIC8vIFdlIG1pZ2h0IGFscmVhZHkgaGF2ZSBhZGRlZCBmbG9hdHMuIFRo
ZXkgc2hyaW5rIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFjZSBmb3IgdGhlIGxpbmUuCisg
ICAgLy8gTGV0J3MganVzdCByZXVzZSB3aGF0IHRoZSBsaW5lIGhhcyBhdCB0aGlzIHBvaW50Lgor
ICAgIG1fbGluZS5pbml0aWFsaXplKCk7CisgICAgYXV0byBjdXJyZW50SXRlbUluZGV4ID0gbGF5
b3V0UmFuZ2Uuc3RhcnQ7CisgICAgaWYgKG1fcGFydGlhbExlYWRpbmdUZXh0SXRlbSkgeworICAg
ICAgICBtX2xpbmUuYXBwZW5kKCptX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0sIGlubGluZUl0ZW1X
aWR0aCgqbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtLCB7IH0pKTsKKyAgICAgICAgaWYgKCZtX3Bh
cnRpYWxMZWFkaW5nVGV4dEl0ZW0udmFsdWUoKSA9PSAmbGFzdElubGluZUl0ZW1Ub0FkZCkKKyAg
ICAgICAgICAgIHJldHVybiAxOworICAgICAgICArK2N1cnJlbnRJdGVtSW5kZXg7CisgICAgfQor
ICAgIGZvciAoOyBjdXJyZW50SXRlbUluZGV4IDwgbGF5b3V0UmFuZ2UuZW5kOyArK2N1cnJlbnRJ
dGVtSW5kZXgpIHsKKyAgICAgICAgYXV0byYgaW5saW5lSXRlbSA9IG1faW5saW5lSXRlbXNbY3Vy
cmVudEl0ZW1JbmRleF07CisgICAgICAgIG1fbGluZS5hcHBlbmQoaW5saW5lSXRlbSwgaW5saW5l
SXRlbVdpZHRoKGlubGluZUl0ZW0sIG1fbGluZS5jb250ZW50TG9naWNhbFJpZ2h0KCkpKTsKKyAg
ICAgICAgaWYgKCZpbmxpbmVJdGVtID09ICZsYXN0SW5saW5lSXRlbVRvQWRkKQorICAgICAgICAg
ICAgcmV0dXJuIGN1cnJlbnRJdGVtSW5kZXggLSBsYXlvdXRSYW5nZS5zdGFydCArIDE7CisgICAg
fQorICAgIHJldHVybiBsYXlvdXRSYW5nZS5zaXplKCk7Cit9CisKK3NpemVfdCBMaW5lQnVpbGRl
cjo6cmVidWlsZExpbmVGb3JUcmFpbGluZ1NvZnRIeXBoZW4oY29uc3QgSW5saW5lSXRlbVJhbmdl
JiBsYXlvdXRSYW5nZSkKK3sKKyAgICBBU1NFUlQoIW1fd3JhcE9wcG9ydHVuaXR5TGlzdC5pc0Vt
cHR5KCkpOworICAgIC8vIFJldmVydCBhbGwgdGhlIHdheSBiYWNrIHRvIGEgd3JhcCBvcHBvcnR1
bml0eSB3aGVuIGVpdGhlciBhIHNvZnQgaHlwaGVuIGZpdHMgb3Igbm8gaHlwaGVuIGlzIHJlcXVp
cmVkLgorICAgIGZvciAoYXV0byBpID0gbV93cmFwT3Bwb3J0dW5pdHlMaXN0LnNpemUoKTsgaS0t
ID4gMTspIHsKKyAgICAgICAgYXV0byYgc29mdFdyYXBPcHBvcnR1bml0eUl0ZW0gPSAqbV93cmFw
T3Bwb3J0dW5pdHlMaXN0W2ldOworICAgICAgICAvLyBGSVhNRTogSWYgdGhpcyB0dXJucyBvdXQg
dG8gYmUgYSBwZXJmIGlzc3VlLCB3ZSBjb3VsZCBhbHNvIHRyYXZlcnNlIHRoZSB3cmFwIGxpc3Qg
YW5kIGtlZXAgYWRkaW5nIHRoZSBpdGVtcworICAgICAgICAvLyB3aGlsZSB3YXRjaGluZyB0aGUg
YXZhaWxhYmxlIHdpZHRoIHZlcnkgY2xvc2VseS4KKyAgICAgICAgYXV0byBjb21taXR0ZWRDb3Vu
dCA9IHJlYnVpbGRMaW5lKGxheW91dFJhbmdlLCBzb2Z0V3JhcE9wcG9ydHVuaXR5SXRlbSk7Cisg
ICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBtX2xpbmVMb2dpY2FsUmVjdC53aWR0aCgpIC0g
bV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKTsKKyAgICAgICAgYXV0byB0cmFpbGluZ1NvZnRI
eXBoZW5XaWR0aCA9IG1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpOworICAgICAgICAv
LyBDaGVjayBpZiB0aGUgdHJhaWxpbmcgaHlwaGVuIG5vdyBmaXRzIHRoZSBsaW5lIChvciB3ZSBk
b24ndCBuZWVkIGh5aGVuIGFueW1vcmUpLgorICAgICAgICBpZiAoIXRyYWlsaW5nU29mdEh5cGhl
bldpZHRoIHx8IHRyYWlsaW5nU29mdEh5cGhlbldpZHRoIDw9IGF2YWlsYWJsZVdpZHRoKSB7Cisg
ICAgICAgICAgICBpZiAodHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgpCisgICAgICAgICAgICAgICAg
bV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCp0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCk7CisgICAg
ICAgICAgICByZXR1cm4gY29tbWl0dGVkQ291bnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8g
SGF2ZSBhdCBsZWFzdCBzb21lIGNvbnRlbnQgb24gdGhlIGxpbmUuCisgICAgYXV0byBjb21taXR0
ZWRDb3VudCA9IHJlYnVpbGRMaW5lKGxheW91dFJhbmdlLCAqbV93cmFwT3Bwb3J0dW5pdHlMaXN0
LmZpcnN0KCkpOworICAgIGlmIChhdXRvIHRyYWlsaW5nU29mdEh5cGhlbldpZHRoID0gbV9saW5l
LnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCkpCisgICAgICAgIG1fbGluZS5hZGRUcmFpbGluZ0h5
cGhlbigqdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgpOworICAgIHJldHVybiBjb21taXR0ZWRDb3Vu
dDsKK30KKworYm9vbCBMaW5lQnVpbGRlcjo6aXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KGNv
bnN0IElubGluZUl0ZW1SYW5nZSYgbGluZVJhbmdlLCBzaXplX3QgbGFzdElubGluZUl0ZW1JbmRl
eCwgYm9vbCBoYXNQYXJ0aWFsVHJhaWxpbmdDb250ZW50KSBjb25zdAoreworICAgIGlmIChoYXNQ
YXJ0aWFsVHJhaWxpbmdDb250ZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGxp
bmVSYW5nZS5lbmQgPT0gbGFzdElubGluZUl0ZW1JbmRleCkKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgLy8gT21pdCBmbG9hdHMgdG8gc2VlIGlmIHRoaXMgaXMgdGhlIGxhc3QgbGluZSB3aXRo
IGlubGluZSBjb250ZW50LgorICAgIGZvciAoYXV0byBpID0gbGFzdElubGluZUl0ZW1JbmRleDsg
aS0tOykgeworICAgICAgICBpZiAoIW1faW5saW5lSXRlbXNbaV0uaXNGbG9hdCgpKQorICAgICAg
ICAgICAgcmV0dXJuIGkgPT0gbGluZVJhbmdlLmVuZCAtIDE7CisgICAgfQorICAgIC8vIFRoZXJl
IGhhcyB0byBiZSBhdCBsZWFzdCBvbmUgbm9uLWZsb2F0IGl0ZW0uCisgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitjb25zdCBDb250YWluZXJCb3gmIExp
bmVCdWlsZGVyOjpyb290KCkgY29uc3QKK3sKKyAgICByZXR1cm4gZm9ybWF0dGluZ0NvbnRleHQo
KS5yb290KCk7Cit9CisKK2NvbnN0IExheW91dFN0YXRlJiBMaW5lQnVpbGRlcjo6bGF5b3V0U3Rh
dGUoKSBjb25zdAoreworICAgIHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmxheW91dFN0YXRl
KCk7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxkZXIu
aCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0
dGluZy9JbmxpbmVMaW5lQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBlMjE3MTUwNWVmZmI0MmZkZjBi
MzIxNjQzYjM0M2Q4YzU1ZmNhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxk
ZXIuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVDb250
ZW50QnJlYWtlci5oIgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1
ZGUgIklubGluZUxpbmUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91
dCB7CisKK2NsYXNzIEZsb2F0aW5nQ29udGV4dDsKK3N0cnVjdCBMaW5lQ2FuZGlkYXRlOworCitj
bGFzcyBMaW5lQnVpbGRlciB7CitwdWJsaWM6CisgICAgTGluZUJ1aWxkZXIoSW5saW5lRm9ybWF0
dGluZ0NvbnRleHQmLCBGbG9hdGluZ1N0YXRlJiwgSG9yaXpvbnRhbENvbnN0cmFpbnRzIHJvb3RI
b3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IElubGluZUl0ZW1zJik7CisgICAgTGluZUJ1aWxk
ZXIoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmLCBjb25zdCBJbmxpbmVJdGVtcyYpOwor
CisgICAgc3RydWN0IElubGluZUl0ZW1SYW5nZSB7CisgICAgICAgIGJvb2wgaXNFbXB0eSgpIGNv
bnN0IHsgcmV0dXJuIHN0YXJ0ID09IGVuZDsgfQorICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIGVuZCAtIHN0YXJ0OyB9CisgICAgICAgIHNpemVfdCBzdGFydCB7IDAgfTsKKyAg
ICAgICAgc2l6ZV90IGVuZCB7IDAgfTsKKyAgICB9OworICAgIHVzaW5nIEZsb2F0TGlzdCA9IFZl
Y3Rvcjxjb25zdCBCb3gqPjsKKyAgICBzdHJ1Y3QgTGluZUNvbnRlbnQgeworICAgICAgICBJbmxp
bmVJdGVtUmFuZ2UgaW5saW5lSXRlbVJhbmdlOworICAgICAgICBzaXplX3QgcGFydGlhbFRyYWls
aW5nQ29udGVudExlbmd0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5p
dD4gb3ZlcmZsb3dMb2dpY2FsV2lkdGg7CisgICAgICAgIGNvbnN0IEZsb2F0TGlzdCYgZmxvYXRz
OworICAgICAgICBib29sIGhhc0ludHJ1c2l2ZUZsb2F0IHsgZmFsc2UgfTsKKyAgICAgICAgSW5s
aW5lTGF5b3V0UG9pbnQgbG9naWNhbFRvcExlZnQ7CisgICAgICAgIElubGluZUxheW91dFVuaXQg
bGluZUxvZ2ljYWxXaWR0aDsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNh
bFdpZHRoOworICAgICAgICBib29sIGlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudCB7IHRydWUg
fTsKKyAgICAgICAgc2l6ZV90IG5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCB7IDAgfTsK
KyAgICAgICAgY29uc3QgTGluZTo6UnVuTGlzdCYgcnVuczsKKyAgICB9OworICAgIExpbmVDb250
ZW50IGxheW91dElubGluZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiwgc2l6ZV90IHBh
cnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gbGVh
ZGluZ0xvZ2ljYWxXaWR0aCwgY29uc3QgSW5saW5lUmVjdCYgaW5pdGlhbExpbmVMb2dpY2FsUmVj
dCwgYm9vbCBpc0ZpcnN0TGluZSk7CisKKyAgICBzdHJ1Y3QgSW50cmluc2ljQ29udGVudCB7Cisg
ICAgICAgIElubGluZUl0ZW1SYW5nZSBpbmxpbmVJdGVtUmFuZ2U7CisgICAgICAgIElubGluZUxh
eW91dFVuaXQgbG9naWNhbFdpZHRoIHsgMCB9OworICAgICAgICBjb25zdCBGbG9hdExpc3QmIGZs
b2F0czsKKyAgICB9OworICAgIEludHJpbnNpY0NvbnRlbnQgY29tcHV0ZWRJbnRyaW5zaWNXaWR0
aChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmLCBJbmxpbmVMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRo
KTsKKworcHJpdmF0ZToKKyAgICB2b2lkIGNhbmRpZGF0ZUNvbnRlbnRGb3JMaW5lKExpbmVDYW5k
aWRhdGUmLCBzaXplX3QgaW5saW5lSXRlbUluZGV4LCBjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5l
ZWRzTGF5b3V0UmFuZ2UsIHNpemVfdCBvdmVyZmxvd0xlbmd0aCwgT3B0aW9uYWw8SW5saW5lTGF5
b3V0VW5pdD4gbGVhZGluZ0xvZ2ljYWxXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjdXJyZW50TG9n
aWNhbFJpZ2h0KTsKKyAgICBzaXplX3QgbmV4dFdyYXBPcHBvcnR1bml0eShzaXplX3Qgc3RhcnRJ
bmRleCwgY29uc3QgTGluZUJ1aWxkZXI6OklubGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFuZ2UpIGNv
bnN0OworCisgICAgc3RydWN0IFJlc3VsdCB7CisgICAgICAgIElubGluZUNvbnRlbnRCcmVha2Vy
OjpJc0VuZE9mTGluZSBpc0VuZE9mTGluZSB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9m
TGluZTo6Tm8gfTsKKyAgICAgICAgc3RydWN0IENvbW1pdHRlZENvbnRlbnRDb3VudCB7CisgICAg
ICAgICAgICBzaXplX3QgdmFsdWUgeyAwIH07CisgICAgICAgICAgICBib29sIGlzUmV2ZXJ0IHsg
ZmFsc2UgfTsKKyAgICAgICAgfTsKKyAgICAgICAgQ29tbWl0dGVkQ29udGVudENvdW50IGNvbW1p
dHRlZENvdW50IHsgfTsKKyAgICAgICAgc2l6ZV90IHBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5n
dGggeyAwIH07CisgICAgICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IG92ZXJmbG93TG9n
aWNhbFdpZHRoIHsgfTsKKyAgICB9OworICAgIHN0cnVjdCBVc2VkQ29uc3RyYWludHMgeworICAg
ICAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0OworICAgICAgICBib29sIGlzQ29uc3RyYWluZWRC
eUZsb2F0IHsgZmFsc2UgfTsKKyAgICB9OworICAgIFVzZWRDb25zdHJhaW50cyBpbml0aWFsQ29u
c3RyYWludHNGb3JMaW5lKGNvbnN0IElubGluZVJlY3QmIGluaXRpYWxMaW5lTG9naWNhbFJlY3Qs
IGJvb2wgaXNGaXJzdExpbmUpIGNvbnN0OworICAgIE9wdGlvbmFsPEhvcml6b250YWxDb25zdHJh
aW50cz4gZmxvYXRDb25zdHJhaW50cyhjb25zdCBJbmxpbmVSZWN0JiBsaW5lTG9naWNhbFJlY3Qp
IGNvbnN0OworCisgICAgdm9pZCBoYW5kbGVGbG9hdENvbnRlbnQoY29uc3QgSW5saW5lSXRlbSYp
OworICAgIFJlc3VsdCBoYW5kbGVJbmxpbmVDb250ZW50KElubGluZUNvbnRlbnRCcmVha2VyJiwg
Y29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBjb25zdCBMaW5lQ2FuZGlk
YXRlJik7CisgICAgc2l6ZV90IHJlYnVpbGRMaW5lKGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVl
ZHNMYXlvdXRSYW5nZSwgY29uc3QgSW5saW5lSXRlbSYgbGFzdElubGluZUl0ZW1Ub0FkZCk7Cisg
ICAgc2l6ZV90IHJlYnVpbGRMaW5lRm9yVHJhaWxpbmdTb2Z0SHlwaGVuKGNvbnN0IElubGluZUl0
ZW1SYW5nZSYgbGF5b3V0UmFuZ2UpOworICAgIHZvaWQgY29tbWl0UGFydGlhbENvbnRlbnQoY29u
c3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50OjpSdW5MaXN0JiwgY29u
c3QgSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6UGFydGlhbFRyYWlsaW5nQ29udGVudCYp
OworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBVc2VkQ29uc3RyYWludHMmKTsKKyAgICBzdHJ1
Y3QgQ29tbWl0dGVkQ29udGVudCB7CisgICAgICAgIHNpemVfdCBpbmxpbmVJdGVtQ291bnQgeyAw
IH07CisgICAgICAgIHNpemVfdCBwYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoIHsgMCB9Owor
ICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxvd0xvZ2ljYWxXaWR0aCB7
IH07CisgICAgfTsKKyAgICBDb21taXR0ZWRDb250ZW50IHBsYWNlSW5saW5lQ29udGVudChjb25z
dCBJbmxpbmVJdGVtUmFuZ2UmLCBzaXplX3QgcGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBP
cHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxvd0xvZ2ljYWxXaWR0aCk7CisgICAgSW5s
aW5lSXRlbVJhbmdlIGNsb3NlKGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5n
ZSwgY29uc3QgQ29tbWl0dGVkQ29udGVudCYpOworCisgICAgSW5saW5lTGF5b3V0VW5pdCBpbmxp
bmVJdGVtV2lkdGgoY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgY29udGVudExv
Z2ljYWxMZWZ0KSBjb25zdDsKKyAgICBib29sIGlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudChj
b25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxpbmVSYW5nZSwgc2l6ZV90IGxhc3RJbmxpbmVJdGVtSW5k
ZXgsIGJvb2wgaGFzUGFydGlhbFRyYWlsaW5nQ29udGVudCkgY29uc3Q7CisKKyAgICBjb25zdCBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVy
biBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0OyB9CisgICAgSW5saW5lRm9ybWF0dGluZ1N0YXRl
KiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBtX2lubGluZUZvcm1hdHRpbmdTdGF0ZTsgfQor
ICAgIEZsb2F0aW5nU3RhdGUqIGZsb2F0aW5nU3RhdGUoKSB7IHJldHVybiBtX2Zsb2F0aW5nU3Rh
dGU7IH0KKyAgICBjb25zdCBGbG9hdGluZ1N0YXRlKiBmbG9hdGluZ1N0YXRlKCkgY29uc3QgeyBy
ZXR1cm4gbV9mbG9hdGluZ1N0YXRlOyB9CisgICAgY29uc3QgQ29udGFpbmVyQm94JiByb290KCkg
Y29uc3Q7CisgICAgY29uc3QgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgY29uc3Q7CisKKyAg
ICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4
dDsKKyAgICBJbmxpbmVGb3JtYXR0aW5nU3RhdGUqIG1faW5saW5lRm9ybWF0dGluZ1N0YXRlIHsg
bnVsbHB0ciB9OworICAgIEZsb2F0aW5nU3RhdGUqIG1fZmxvYXRpbmdTdGF0ZSB7IG51bGxwdHIg
fTsKKyAgICBPcHRpb25hbDxIb3Jpem9udGFsQ29uc3RyYWludHM+IG1fcm9vdEhvcml6b250YWxD
b25zdHJhaW50czsKKworICAgIExpbmUgbV9saW5lOworICAgIElubGluZVJlY3QgbV9saW5lTG9n
aWNhbFJlY3Q7CisgICAgY29uc3QgSW5saW5lSXRlbXMmIG1faW5saW5lSXRlbXM7CisgICAgRmxv
YXRMaXN0IG1fZmxvYXRzOworICAgIE9wdGlvbmFsPElubGluZVRleHRJdGVtPiBtX3BhcnRpYWxM
ZWFkaW5nVGV4dEl0ZW07CisgICAgVmVjdG9yPGNvbnN0IElubGluZUl0ZW0qPiBtX3dyYXBPcHBv
cnR1bml0eUxpc3Q7CisgICAgdW5zaWduZWQgbV9zdWNjZXNzaXZlSHlwaGVuYXRlZExpbmVDb3Vu
dCB7IDAgfTsKKyAgICBib29sIG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0IHsgZmFsc2Ug
fTsKK307CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVHZW9tZXRyeS5o
IGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0
aW5nL0lubGluZUxpbmVHZW9tZXRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQ2YTJjNThhMDc2ZTQ5YzJjZDNj
OWUyZjkyYWIzNmQwM2YyNzI5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUdlb21l
dHJ5LmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVSZWN0
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBJ
bmxpbmVMaW5lR2VvbWV0cnkgeworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGlj
OgorICAgIHN0cnVjdCBFbmNsb3NpbmdUb3BBbmRCb3R0b20geworICAgICAgICAvLyBUaGlzIHZh
bHVlcyBlbmNsb3NlcyB0aGUgcm9vdCBpbmxpbmUgYm94IGFuZCBhbnkgb3RoZXIgaW5saW5lIGxl
dmVsIGJveCdzIGJvcmRlciBib3guCisgICAgICAgIElubGluZUxheW91dFVuaXQgdG9wIHsgMCB9
OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJvdHRvbSB7IDAgfTsKKyAgICB9OworICAgIElu
bGluZUxpbmVHZW9tZXRyeShjb25zdCBJbmxpbmVSZWN0JiBsaW5lQm94TG9naWNhbFJlY3QsIEVu
Y2xvc2luZ1RvcEFuZEJvdHRvbSwgSW5saW5lTGF5b3V0VW5pdCBhbGlnbWVudEJhc2VsaW5lLCBJ
bmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBjb250
ZW50TG9naWNhbFdpZHRoKTsKKworICAgIGNvbnN0IElubGluZVJlY3QmIGxpbmVCb3hMb2dpY2Fs
UmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJveExvZ2ljYWxSZWN0OyB9CisKKyAgICBFbmNs
b3NpbmdUb3BBbmRCb3R0b20gZW5jbG9zaW5nVG9wQW5kQm90dG9tKCkgY29uc3QgeyByZXR1cm4g
bV9lbmNsb3NpbmdUb3BBbmRCb3R0b207IH0KKworICAgIElubGluZUxheW91dFVuaXQgYmFzZWxp
bmUoKSBjb25zdCB7IHJldHVybiBtX2FsaWdtZW50QmFzZWxpbmU7IH0KKworICAgIElubGluZUxh
eW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50TG9n
aWNhbExlZnQ7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgoKSBj
b25zdCB7IHJldHVybiBtX2NvbnRlbnRMb2dpY2FsV2lkdGg7IH0KKworICAgIHZvaWQgbW92ZVZl
cnRpY2FsbHkoSW5saW5lTGF5b3V0VW5pdCBvZmZzZXQpIHsgbV9saW5lQm94TG9naWNhbFJlY3Qu
bW92ZVZlcnRpY2FsbHkob2Zmc2V0KTsgfQorCitwcml2YXRlOgorICAgIC8vIFRoaXMgaXMgbGlu
ZSBib3ggZ2VvbWV0cnkgKHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWlubGluZS0zLyNs
aW5lLWJveCkuCisgICAgSW5saW5lUmVjdCBtX2xpbmVCb3hMb2dpY2FsUmVjdDsKKyAgICAvLyBF
bmNsb3NpbmcgdG9wIGFuZCBib3R0b20gaW5jbHVkZXMgYWxsIGlubGluZSBsZXZlbCBib3hlcyAo
Ym9yZGVyIGJveCkgdmVydGljYWxseS4KKyAgICAvLyBXaGlsZSB0aGUgbGluZSBib3ggdXN1YWxs
eSBlbmNsb3NlIHRoZW0gYXMgd2VsbCwgaXRzIHZlcnRpY2FsIGdlb21ldHJ5IGlzIGJhc2VkIG9u
CisgICAgLy8gdGhlIGxheW91dCBib3VuZHMgb2YgdGhlIGlubGluZSBsZXZlbCBib3hlcyB3aGlj
aCBtYXkgYmUgZGlmZmVyZW50IHdoZW4gbGluZS1oZWlnaHQgaXMgcHJlc2VudC4KKyAgICBFbmNs
b3NpbmdUb3BBbmRCb3R0b20gbV9lbmNsb3NpbmdUb3BBbmRCb3R0b207CisgICAgSW5saW5lTGF5
b3V0VW5pdCBtX2FsaWdtZW50QmFzZWxpbmUgeyAwIH07CisgICAgSW5saW5lTGF5b3V0VW5pdCBt
X2NvbnRlbnRMb2dpY2FsTGVmdCB7IDAgfTsKKyAgICBJbmxpbmVMYXlvdXRVbml0IG1fY29udGVu
dExvZ2ljYWxXaWR0aCB7IDAgfTsKK307CisKK2lubGluZSBJbmxpbmVMaW5lR2VvbWV0cnk6Oklu
bGluZUxpbmVHZW9tZXRyeShjb25zdCBJbmxpbmVSZWN0JiBsaW5lQm94TG9naWNhbFJlY3QsIEVu
Y2xvc2luZ1RvcEFuZEJvdHRvbSBlbmNsb3NpbmdUb3BBbmRCb3R0b20sIElubGluZUxheW91dFVu
aXQgYWxpZ21lbnRCYXNlbGluZSwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQs
IElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCkKKyAgICA6IG1fbGluZUJveExv
Z2ljYWxSZWN0KGxpbmVCb3hMb2dpY2FsUmVjdCkKKyAgICAsIG1fZW5jbG9zaW5nVG9wQW5kQm90
dG9tKGVuY2xvc2luZ1RvcEFuZEJvdHRvbSkKKyAgICAsIG1fYWxpZ21lbnRCYXNlbGluZShhbGln
bWVudEJhc2VsaW5lKQorICAgICwgbV9jb250ZW50TG9naWNhbExlZnQoY29udGVudExvZ2ljYWxM
ZWZ0KQorICAgICwgbV9jb250ZW50TG9naWNhbFdpZHRoKGNvbnRlbnRMb2dpY2FsV2lkdGgpCit7
Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZVJ1bi5oIGIvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUxpbmVSdW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wYjBlZTE0ZGVkMGJlMmNjZDUyZDM0MzNiMDg4NDU0
NmMxZjBkMmIyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVSdW4uaApAQCAtMCwwICsx
LDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
KyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisg
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9G
T1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVSZWN0LmgiCisjaW5jbHVkZSAi
TGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiVGV4dEZsYWdzLmgiCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitzdHJ1Y3QgTGluZVJ1biB7CisgICAgV1RGX01BS0Vf
U1RSVUNUX0ZBU1RfQUxMT0NBVEVEOworICAgIHN0cnVjdCBUZXh0IHsKKyAgICAgICAgV1RGX01B
S0VfU1RSVUNUX0ZBU1RfQUxMT0NBVEVEOworICAgIHB1YmxpYzoKKyAgICAgICAgVGV4dChzaXpl
X3QgcG9zaXRpb24sIHNpemVfdCBsZW5ndGgsIGNvbnN0IFN0cmluZyYpOworCisgICAgICAgIHNp
emVfdCBzdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnQ7IH0KKyAgICAgICAgc2l6ZV90IGVu
ZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0KCkgKyBsZW5ndGgoKTsgfQorICAgICAgICBzaXplX3Qg
bGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9sZW5ndGg7IH0KKyAgICAgICAgU3RyaW5nIGNvbnRl
bnQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRTdHJpbmc7IH0KKworICAgICAgICBib29sIG5l
ZWRzSHlwaGVuKCkgY29uc3QgeyByZXR1cm4gbV9uZWVkc0h5cGhlbjsgfQorICAgICAgICB2b2lk
IHNldE5lZWRzSHlwaGVuKCkgeyBtX25lZWRzSHlwaGVuID0gdHJ1ZTsgfQorCisgICAgICAgIHZv
aWQgZXhwYW5kKHNpemVfdCBkZWx0YSkgeyBtX2xlbmd0aCArPSBkZWx0YTsgfQorICAgICAgICB2
b2lkIHNocmluayhzaXplX3QgZGVsdGEpIHsgbV9sZW5ndGggLT0gZGVsdGE7IH0KKworICAgIHBy
aXZhdGU6CisgICAgICAgIHNpemVfdCBtX3N0YXJ0IHsgMCB9OworICAgICAgICBzaXplX3QgbV9s
ZW5ndGggeyAwIH07CisgICAgICAgIGJvb2wgbV9uZWVkc0h5cGhlbiB7IGZhbHNlIH07CisgICAg
ICAgIFN0cmluZyBtX2NvbnRlbnRTdHJpbmc7CisgICAgfTsKKworICAgIHN0cnVjdCBFeHBhbnNp
b247CisgICAgTGluZVJ1bihzaXplX3QgbGluZUluZGV4LCBjb25zdCBCb3gmLCBjb25zdCBJbmxp
bmVSZWN0JiwgRXhwYW5zaW9uLCBPcHRpb25hbDxUZXh0PiA9IFdURjo6bnVsbG9wdCk7CisKKyAg
ICBjb25zdCBJbmxpbmVSZWN0JiBsb2dpY2FsUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNh
bFJlY3Q7IH0KKworICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFRvcCgpIGNvbnN0IHsgcmV0
dXJuIGxvZ2ljYWxSZWN0KCkudG9wKCk7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxC
b3R0b20oKSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVjdCgpLmJvdHRvbSgpOyB9CisgICAgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCku
bGVmdCgpOyB9CisgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsUmlnaHQoKSBjb25zdCB7IHJl
dHVybiBsb2dpY2FsUmVjdCgpLnJpZ2h0KCk7IH0KKworICAgIElubGluZUxheW91dFVuaXQgbG9n
aWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS53aWR0aCgpOyB9CisgICAg
SW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJl
Y3QoKS5oZWlnaHQoKTsgfQorCisgICAgdm9pZCBtb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRV
bml0IG9mZnNldCkgeyBtX2xvZ2ljYWxSZWN0Lm1vdmVWZXJ0aWNhbGx5KG9mZnNldCk7IH0KKyAg
ICBPcHRpb25hbDxUZXh0PiYgdGV4dCgpIHsgcmV0dXJuIG1fdGV4dDsgfQorICAgIGNvbnN0IE9w
dGlvbmFsPFRleHQ+JiB0ZXh0KCkgY29uc3QgeyByZXR1cm4gbV90ZXh0OyB9CisKKyAgICBzdHJ1
Y3QgRXhwYW5zaW9uIHsKKyAgICAgICAgRXhwYW5zaW9uQmVoYXZpb3IgYmVoYXZpb3IgeyBEZWZh
dWx0RXhwYW5zaW9uIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgaG9yaXpvbnRhbEV4cGFu
c2lvbiB7IDAgfTsKKyAgICB9OworICAgIEV4cGFuc2lvbiBleHBhbnNpb24oKSBjb25zdCB7IHJl
dHVybiBtX2V4cGFuc2lvbjsgfQorCisgICAgY29uc3QgQm94JiBsYXlvdXRCb3goKSBjb25zdCB7
IHJldHVybiAqbV9sYXlvdXRCb3g7IH0KKyAgICBzaXplX3QgbGluZUluZGV4KCkgY29uc3QgeyBy
ZXR1cm4gbV9saW5lSW5kZXg7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBzaXplX3QgbV9saW5l
SW5kZXg7CisgICAgV2Vha1B0cjxjb25zdCBMYXlvdXQ6OkJveD4gbV9sYXlvdXRCb3g7CisgICAg
SW5saW5lUmVjdCBtX2xvZ2ljYWxSZWN0OworICAgIEV4cGFuc2lvbiBtX2V4cGFuc2lvbjsKKyAg
ICBPcHRpb25hbDxUZXh0PiBtX3RleHQ7Cit9OworCitpbmxpbmUgTGluZVJ1bjo6TGluZVJ1bihz
aXplX3QgbGluZUluZGV4LCBjb25zdCBMYXlvdXQ6OkJveCYgbGF5b3V0Qm94LCBjb25zdCBJbmxp
bmVSZWN0JiBsb2dpY2FsUmVjdCwgRXhwYW5zaW9uIGV4cGFuc2lvbiwgT3B0aW9uYWw8VGV4dD4g
dGV4dCkKKyAgICA6IG1fbGluZUluZGV4KGxpbmVJbmRleCkKKyAgICAsIG1fbGF5b3V0Qm94KG1h
a2VXZWFrUHRyKGxheW91dEJveCkpCisgICAgLCBtX2xvZ2ljYWxSZWN0KGxvZ2ljYWxSZWN0KQor
ICAgICwgbV9leHBhbnNpb24oZXhwYW5zaW9uKQorICAgICwgbV90ZXh0KHRleHQpCit7Cit9CisK
K2lubGluZSBMaW5lUnVuOjpUZXh0OjpUZXh0KHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbmd0aCwg
Y29uc3QgU3RyaW5nJiBjb250ZW50U3RyaW5nKQorICAgIDogbV9zdGFydChzdGFydCkKKyAgICAs
IG1fbGVuZ3RoKGxlbmd0aCkKKyAgICAsIG1fY29udGVudFN0cmluZyhjb250ZW50U3RyaW5nKQor
eworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVSZWN0LmggYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5l
UmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLmFjZDA5YWIxZTcxMDFhYTZlY2Y0MzNkMjY0MDA0ZmZlOGZiN2E4
YzQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lUmVjdC5oCkBAIC0wLDAgKzEsMjkzIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdf
Q09OVEVYVCkKKworI2luY2x1ZGUgIkxheW91dFVuaXRzLmgiCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBJbmxpbmVSZWN0IHsKK3B1YmxpYzoKKyAg
ICBJbmxpbmVSZWN0KCkgPSBkZWZhdWx0OworICAgIElubGluZVJlY3QoSW5saW5lTGF5b3V0VW5p
dCB0b3AsIElubGluZUxheW91dFVuaXQgbGVmdCwgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCwgSW5s
aW5lTGF5b3V0VW5pdCBoZWlnaHQpOworICAgIElubGluZVJlY3QoY29uc3QgSW5saW5lTGF5b3V0
UG9pbnQmIHRvcExlZnQsIElubGluZUxheW91dFVuaXQgd2lkdGgsIElubGluZUxheW91dFVuaXQg
aGVpZ2h0KTsKKyAgICBJbmxpbmVSZWN0KGNvbnN0IElubGluZUxheW91dFBvaW50JiB0b3BMZWZ0
LCBjb25zdCBJbmxpbmVMYXlvdXRTaXplJik7CisgICAgCisgICAgSW5saW5lTGF5b3V0VW5pdCB0
b3AoKSBjb25zdDsKKyAgICBJbmxpbmVMYXlvdXRVbml0IGxlZnQoKSBjb25zdDsKKyAgICBJbmxp
bmVMYXlvdXRQb2ludCB0b3BMZWZ0KCkgY29uc3Q7CisKKyAgICBJbmxpbmVMYXlvdXRVbml0IGJv
dHRvbSgpIGNvbnN0OworICAgIElubGluZUxheW91dFVuaXQgcmlnaHQoKSBjb25zdDsgICAgICAg
IAorCisgICAgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCgpIGNvbnN0OworICAgIElubGluZUxheW91
dFVuaXQgaGVpZ2h0KCkgY29uc3Q7CisgICAgSW5saW5lTGF5b3V0U2l6ZSBzaXplKCkgY29uc3Q7
CisKKyAgICB2b2lkIHNldFRvcChJbmxpbmVMYXlvdXRVbml0KTsKKyAgICB2b2lkIHNldEJvdHRv
bShJbmxpbmVMYXlvdXRVbml0KTsKKyAgICB2b2lkIHNldExlZnQoSW5saW5lTGF5b3V0VW5pdCk7
CisgICAgdm9pZCBzZXRUb3BMZWZ0KGNvbnN0IElubGluZUxheW91dFBvaW50Jik7CisgICAgdm9p
ZCBzZXRXaWR0aChJbmxpbmVMYXlvdXRVbml0KTsKKyAgICB2b2lkIHNldEhlaWdodChJbmxpbmVM
YXlvdXRVbml0KTsKKworICAgIHZvaWQgbW92ZUhvcml6b250YWxseShJbmxpbmVMYXlvdXRVbml0
KTsKKyAgICB2b2lkIG1vdmVWZXJ0aWNhbGx5KElubGluZUxheW91dFVuaXQpOworICAgIHZvaWQg
bW92ZUJ5KElubGluZUxheW91dFBvaW50KTsKKworICAgIHZvaWQgZXhwYW5kKE9wdGlvbmFsPElu
bGluZUxheW91dFVuaXQ+LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0Pik7CisgICAgdm9pZCBl
eHBhbmRUb0NvbnRhaW4oY29uc3QgSW5saW5lUmVjdCYpOworICAgIHZvaWQgZXhwYW5kSG9yaXpv
bnRhbGx5KElubGluZUxheW91dFVuaXQgZGVsdGEpIHsgZXhwYW5kKGRlbHRhLCB7IH0pOyB9Cisg
ICAgdm9pZCBleHBhbmRWZXJ0aWNhbGx5KElubGluZUxheW91dFVuaXQgZGVsdGEpIHsgZXhwYW5k
KHsgfSwgZGVsdGEpOyB9CisgICAgdm9pZCBleHBhbmRWZXJ0aWNhbGx5VG9Db250YWluKGNvbnN0
IElubGluZVJlY3QmKTsKKyAgICB2b2lkIGluZmxhdGUoSW5saW5lTGF5b3V0VW5pdCk7CisKKyAg
ICBvcGVyYXRvciBJbmxpbmVMYXlvdXRSZWN0KCkgY29uc3Q7CisKK3ByaXZhdGU6CisjaWYgQVNT
RVJUX0VOQUJMRUQKKyAgICB2b2lkIGludmFsaWRhdGVUb3AoKSB7IG1faGFzVmFsaWRUb3AgPSBm
YWxzZTsgfQorICAgIHZvaWQgaW52YWxpZGF0ZUxlZnQoKSB7IG1faGFzVmFsaWRMZWZ0ID0gZmFs
c2U7IH0KKyAgICB2b2lkIGludmFsaWRhdGVXaWR0aCgpIHsgbV9oYXNWYWxpZFdpZHRoID0gZmFs
c2U7IH0KKyAgICB2b2lkIGludmFsaWRhdGVIZWlnaHQoKSB7IG1faGFzVmFsaWRIZWlnaHQgPSBm
YWxzZTsgfQorICAgIHZvaWQgaW52YWxpZGF0ZVBvc2l0aW9uKCk7CisKKyAgICBib29sIGhhc1Zh
bGlkUG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBtX2hhc1ZhbGlkVG9wICYmIG1faGFzVmFsaWRM
ZWZ0OyB9CisgICAgYm9vbCBoYXNWYWxpZFNpemUoKSBjb25zdCB7IHJldHVybiBtX2hhc1ZhbGlk
V2lkdGggJiYgbV9oYXNWYWxpZEhlaWdodDsgfQorICAgIGJvb2wgaGFzVmFsaWRHZW9tZXRyeSgp
IGNvbnN0IHsgcmV0dXJuIGhhc1ZhbGlkUG9zaXRpb24oKSAmJiBoYXNWYWxpZFNpemUoKTsgfQor
CisgICAgdm9pZCBzZXRIYXNWYWxpZFBvc2l0aW9uKCk7CisgICAgdm9pZCBzZXRIYXNWYWxpZFNp
emUoKTsKKworICAgIGJvb2wgbV9oYXNWYWxpZFRvcCB7IGZhbHNlIH07CisgICAgYm9vbCBtX2hh
c1ZhbGlkTGVmdCB7IGZhbHNlIH07CisgICAgYm9vbCBtX2hhc1ZhbGlkV2lkdGggeyBmYWxzZSB9
OworICAgIGJvb2wgbV9oYXNWYWxpZEhlaWdodCB7IGZhbHNlIH07CisjZW5kaWYgLy8gQVNTRVJU
X0VOQUJMRUQKKyAgICBJbmxpbmVMYXlvdXRSZWN0IG1fcmVjdDsKK307CisKK2lubGluZSBJbmxp
bmVSZWN0OjpJbmxpbmVSZWN0KElubGluZUxheW91dFVuaXQgdG9wLCBJbmxpbmVMYXlvdXRVbml0
IGxlZnQsIElubGluZUxheW91dFVuaXQgd2lkdGgsIElubGluZUxheW91dFVuaXQgaGVpZ2h0KQor
ICAgIDogbV9yZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkKK3sKKyNpZiBBU1NFUlRfRU5B
QkxFRAorICAgIG1faGFzVmFsaWRUb3AgPSB0cnVlOworICAgIG1faGFzVmFsaWRMZWZ0ID0gdHJ1
ZTsKKyAgICBtX2hhc1ZhbGlkV2lkdGggPSB0cnVlOworICAgIG1faGFzVmFsaWRIZWlnaHQgPSB0
cnVlOworI2VuZGlmCit9CisKK2lubGluZSBJbmxpbmVSZWN0OjpJbmxpbmVSZWN0KGNvbnN0IElu
bGluZUxheW91dFBvaW50JiB0b3BMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IHdpZHRoLCBJbmxpbmVM
YXlvdXRVbml0IGhlaWdodCkKKyAgICA6IElubGluZVJlY3QodG9wTGVmdC55KCksIHRvcExlZnQu
eCgpLCB3aWR0aCwgaGVpZ2h0KQoreworfQorCitpbmxpbmUgSW5saW5lUmVjdDo6SW5saW5lUmVj
dChjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgdG9wTGVmdCwgY29uc3QgSW5saW5lTGF5b3V0U2l6
ZSYgc2l6ZSkKKyAgICA6IElubGluZVJlY3QodG9wTGVmdC55KCksIHRvcExlZnQueCgpLCBzaXpl
LndpZHRoKCksIHNpemUuaGVpZ2h0KCkpCit7Cit9CisKKyNpZiBBU1NFUlRfRU5BQkxFRAoraW5s
aW5lIHZvaWQgSW5saW5lUmVjdDo6aW52YWxpZGF0ZVBvc2l0aW9uKCkKK3sKKyAgICBpbnZhbGlk
YXRlVG9wKCk7CisgICAgaW52YWxpZGF0ZUxlZnQoKTsKK30KKworaW5saW5lIHZvaWQgSW5saW5l
UmVjdDo6c2V0SGFzVmFsaWRQb3NpdGlvbigpCit7CisgICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7
CisgICAgbV9oYXNWYWxpZExlZnQgPSB0cnVlOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0
OjpzZXRIYXNWYWxpZFNpemUoKQoreworICAgIG1faGFzVmFsaWRXaWR0aCA9IHRydWU7CisgICAg
bV9oYXNWYWxpZEhlaWdodCA9IHRydWU7Cit9CisjZW5kaWYgLy8gQVNTRVJUX0VOQUJMRUQKKwor
aW5saW5lIElubGluZUxheW91dFVuaXQgSW5saW5lUmVjdDo6dG9wKCkgY29uc3QKK3sKKyAgICBB
U1NFUlQobV9oYXNWYWxpZFRvcCk7CisgICAgcmV0dXJuIG1fcmVjdC55KCk7Cit9CisKK2lubGlu
ZSBJbmxpbmVMYXlvdXRVbml0IElubGluZVJlY3Q6OmxlZnQoKSBjb25zdAoreworICAgIEFTU0VS
VChtX2hhc1ZhbGlkTGVmdCk7CisgICAgcmV0dXJuIG1fcmVjdC54KCk7Cit9CisKK2lubGluZSBJ
bmxpbmVMYXlvdXRVbml0IElubGluZVJlY3Q6OmJvdHRvbSgpIGNvbnN0Cit7CisgICAgQVNTRVJU
KG1faGFzVmFsaWRUb3AgJiYgbV9oYXNWYWxpZEhlaWdodCk7CisgICAgcmV0dXJuIG1fcmVjdC5t
YXhZKCk7Cit9CisKK2lubGluZSBJbmxpbmVMYXlvdXRVbml0IElubGluZVJlY3Q6OnJpZ2h0KCkg
Y29uc3QKK3sKKyAgICBBU1NFUlQobV9oYXNWYWxpZExlZnQgJiYgbV9oYXNWYWxpZFdpZHRoKTsK
KyAgICByZXR1cm4gbV9yZWN0Lm1heFgoKTsKK30KKworaW5saW5lIElubGluZUxheW91dFBvaW50
IElubGluZVJlY3Q6OnRvcExlZnQoKSBjb25zdAoreworICAgIEFTU0VSVChoYXNWYWxpZFBvc2l0
aW9uKCkpOworICAgIHJldHVybiBtX3JlY3QubWluWE1pbllDb3JuZXIoKTsKK30KKworaW5saW5l
IElubGluZUxheW91dFNpemUgSW5saW5lUmVjdDo6c2l6ZSgpIGNvbnN0Cit7CisgICAgQVNTRVJU
KGhhc1ZhbGlkU2l6ZSgpKTsKKyAgICByZXR1cm4gbV9yZWN0LnNpemUoKTsKK30KKworaW5saW5l
IElubGluZUxheW91dFVuaXQgSW5saW5lUmVjdDo6d2lkdGgoKSBjb25zdAoreworICAgIEFTU0VS
VChtX2hhc1ZhbGlkV2lkdGgpOworICAgIHJldHVybiBtX3JlY3Qud2lkdGgoKTsKK30KKworaW5s
aW5lIElubGluZUxheW91dFVuaXQgSW5saW5lUmVjdDo6aGVpZ2h0KCkgY29uc3QKK3sKKyAgICBB
U1NFUlQobV9oYXNWYWxpZEhlaWdodCk7CisgICAgcmV0dXJuIG1fcmVjdC5oZWlnaHQoKTsKK30K
KworaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0VG9wTGVmdChjb25zdCBJbmxpbmVMYXlvdXRQ
b2ludCYgdG9wTGVmdCkKK3sKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIHNldEhhc1ZhbGlkUG9z
aXRpb24oKTsKKyNlbmRpZgorICAgIG1fcmVjdC5zZXRMb2NhdGlvbih0b3BMZWZ0KTsKK30KKwor
aW5saW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0VG9wKElubGluZUxheW91dFVuaXQgdG9wKQorewor
I2lmIEFTU0VSVF9FTkFCTEVECisgICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7CisjZW5kaWYKKyAg
ICBtX3JlY3Quc2V0WSh0b3ApOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRCb3R0
b20oSW5saW5lTGF5b3V0VW5pdCBib3R0b20pCit7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICBt
X2hhc1ZhbGlkVG9wID0gdHJ1ZTsKKyAgICBtX2hhc1ZhbGlkSGVpZ2h0ID0gdHJ1ZTsKKyNlbmRp
ZgorICAgIG1fcmVjdC5zaGlmdE1heFlFZGdlVG8oYm90dG9tKTsKK30KKworaW5saW5lIHZvaWQg
SW5saW5lUmVjdDo6c2V0TGVmdChJbmxpbmVMYXlvdXRVbml0IGxlZnQpCit7CisjaWYgQVNTRVJU
X0VOQUJMRUQKKyAgICBtX2hhc1ZhbGlkTGVmdCA9IHRydWU7CisjZW5kaWYKKyAgICBtX3JlY3Qu
c2V0WChsZWZ0KTsKK30KKworaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0V2lkdGgoSW5saW5l
TGF5b3V0VW5pdCB3aWR0aCkKK3sKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIG1faGFzVmFsaWRX
aWR0aCA9IHRydWU7CisjZW5kaWYKKyAgICBtX3JlY3Quc2V0V2lkdGgod2lkdGgpOworfQorCitp
bmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQp
Cit7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICBtX2hhc1ZhbGlkSGVpZ2h0ID0gdHJ1ZTsKKyNl
bmRpZgorICAgIG1fcmVjdC5zZXRIZWlnaHQoaGVpZ2h0KTsKK30KKworaW5saW5lIHZvaWQgSW5s
aW5lUmVjdDo6bW92ZUhvcml6b250YWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkKK3sKKyAg
ICBBU1NFUlQobV9oYXNWYWxpZExlZnQpOworICAgIG1fcmVjdC5tb3ZlKElubGluZUxheW91dFNp
emUgeyBvZmZzZXQsIDAgfSk7Cit9CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6Om1vdmVWZXJ0
aWNhbGx5KElubGluZUxheW91dFVuaXQgb2Zmc2V0KQoreworICAgIEFTU0VSVChtX2hhc1ZhbGlk
VG9wKTsKKyAgICBtX3JlY3QubW92ZShJbmxpbmVMYXlvdXRTaXplIHsgMCwgb2Zmc2V0IH0pOwor
fQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0Ojptb3ZlQnkoSW5saW5lTGF5b3V0UG9pbnQgb2Zm
c2V0KQoreworICAgIEFTU0VSVChtX2hhc1ZhbGlkVG9wKTsKKyAgICBBU1NFUlQobV9oYXNWYWxp
ZExlZnQpOworICAgIG1fcmVjdC5tb3ZlQnkob2Zmc2V0KTsKK30KKworaW5saW5lIHZvaWQgSW5s
aW5lUmVjdDo6ZXhwYW5kKE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRoLCBPcHRpb25h
bDxJbmxpbmVMYXlvdXRVbml0PiBoZWlnaHQpCit7CisgICAgQVNTRVJUKCF3aWR0aCB8fCBtX2hh
c1ZhbGlkV2lkdGgpOworICAgIEFTU0VSVCghaGVpZ2h0IHx8IG1faGFzVmFsaWRIZWlnaHQpOwor
ICAgIG1fcmVjdC5leHBhbmQod2lkdGgudmFsdWVPcigwKSwgaGVpZ2h0LnZhbHVlT3IoMCkpOwor
fQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpleHBhbmRUb0NvbnRhaW4oY29uc3QgSW5saW5l
UmVjdCYgb3RoZXIpCit7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICBtX2hhc1ZhbGlkVG9wID0g
dHJ1ZTsKKyAgICBtX2hhc1ZhbGlkTGVmdCA9IHRydWU7CisgICAgbV9oYXNWYWxpZFdpZHRoID0g
dHJ1ZTsKKyAgICBtX2hhc1ZhbGlkSGVpZ2h0ID0gdHJ1ZTsKKyNlbmRpZgorICAgIG1fcmVjdC51
bml0ZUV2ZW5JZkVtcHR5KG90aGVyKTsKK30KKworaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6ZXhw
YW5kVmVydGljYWxseVRvQ29udGFpbihjb25zdCBJbmxpbmVSZWN0JiBvdGhlcikKK3sKKyAgICBh
dXRvIGNvbnRhaW5Ub3AgPSBzdGQ6Om1pbih0b3AoKSwgb3RoZXIudG9wKCkpOworICAgIGF1dG8g
Y29udGFpbkJvdHRvbSA9IHN0ZDo6bWF4KGJvdHRvbSgpLCBvdGhlci5ib3R0b20oKSk7CisgICAg
c2V0VG9wKGNvbnRhaW5Ub3ApOworICAgIHNldEJvdHRvbShjb250YWluQm90dG9tKTsKK30KKwor
aW5saW5lIHZvaWQgSW5saW5lUmVjdDo6aW5mbGF0ZShJbmxpbmVMYXlvdXRVbml0IGluZmxhdGUp
Cit7CisgICAgQVNTRVJUKGhhc1ZhbGlkR2VvbWV0cnkoKSk7CisgICAgbV9yZWN0LmluZmxhdGUo
aW5mbGF0ZSk7Cit9CisKK2lubGluZSBJbmxpbmVSZWN0OjpvcGVyYXRvciBJbmxpbmVMYXlvdXRS
ZWN0KCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaGFzVmFsaWRHZW9tZXRyeSgpKTsgCisgICAgcmV0
dXJuIG1fcmVjdDsKK30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lU29mdExp
bmVCcmVha0l0ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjll
YTA2ZmJjZGQxNzgyNDJiYWI1NDczYTk0YTEzYWMzMGJjNzk3MGIKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRp
bmcvSW5saW5lU29mdExpbmVCcmVha0l0ZW0uaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisg
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkK
KworI2luY2x1ZGUgIklubGluZUl0ZW0uaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNw
YWNlIExheW91dCB7CisKK2NsYXNzIElubGluZVNvZnRMaW5lQnJlYWtJdGVtIDogcHVibGljIElu
bGluZUl0ZW0geworcHVibGljOgorICAgIHN0YXRpYyBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSBj
cmVhdGVTb2Z0TGluZUJyZWFrSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWduZWQgcG9z
aXRpb24pOworCisgICAgdW5zaWduZWQgcG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBtX3N0YXJ0
T3JQb3NpdGlvbjsgfQorICAgIGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRCb3goKSBj
b25zdCB7IHJldHVybiBkb3duY2FzdDxJbmxpbmVUZXh0Qm94PihsYXlvdXRCb3goKSk7IH0KKwor
ICAgIElubGluZVNvZnRMaW5lQnJlYWtJdGVtKGNvbnN0IElubGluZVRleHRCb3gmLCB1bnNpZ25l
ZCBwb3NpdGlvbik7Cit9OworCitpbmxpbmUgSW5saW5lU29mdExpbmVCcmVha0l0ZW0gSW5saW5l
U29mdExpbmVCcmVha0l0ZW06OmNyZWF0ZVNvZnRMaW5lQnJlYWtJdGVtKGNvbnN0IElubGluZVRl
eHRCb3gmIGlubGluZVRleHRCb3gsIHVuc2lnbmVkIHBvc2l0aW9uKQoreworICAgIHJldHVybiB7
IGlubGluZVRleHRCb3gsIHBvc2l0aW9uIH07Cit9CisKK2lubGluZSBJbmxpbmVTb2Z0TGluZUJy
ZWFrSXRlbTo6SW5saW5lU29mdExpbmVCcmVha0l0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5s
aW5lVGV4dEJveCwgdW5zaWduZWQgcG9zaXRpb24pCisgICAgOiBJbmxpbmVJdGVtKGlubGluZVRl
eHRCb3gsIFR5cGU6OlNvZnRMaW5lQnJlYWspCit7CisgICAgbV9zdGFydE9yUG9zaXRpb24gPSBw
b3NpdGlvbjsKK30KKworfQorfQorCitTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0lOTElORV9JVEVN
KElubGluZVNvZnRMaW5lQnJlYWtJdGVtLCBpc1NvZnRMaW5lQnJlYWsoKSkKKworI2VuZGlmCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi45YzczN2FmMGJkYmE5NWE1ZjQwNWVjYjQ5NDVmY2NkMTljZDhiYzM5Ci0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxp
bmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmNwcApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
CisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgor
CisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGb250
Q2FzY2FkZS5oIgorI2luY2x1ZGUgIklubGluZVNvZnRMaW5lQnJlYWtJdGVtLmgiCisjaW5jbHVk
ZSAiVGV4dFV0aWwuaCIKKyNpbmNsdWRlIDx3dGYvdW5pY29kZS9DaGFyYWN0ZXJOYW1lcy5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworc3RhdGljX2Fzc2Vy
dChzaXplb2YoSW5saW5lSXRlbSkgPT0gc2l6ZW9mKElubGluZVRleHRJdGVtKSwgIiIpOworCitz
dHJ1Y3QgV2hpdGVzcGFjZUNvbnRlbnQgeworICAgIHNpemVfdCBsZW5ndGggeyAwIH07CisgICAg
Ym9vbCBpc1dvcmRTZXBhcmF0b3IgeyB0cnVlIH07Cit9Oworc3RhdGljIE9wdGlvbmFsPFdoaXRl
c3BhY2VDb250ZW50PiBtb3ZlVG9OZXh0Tm9uV2hpdGVzcGFjZVBvc2l0aW9uKGNvbnN0IFN0cmlu
Z1ZpZXcmIHRleHRDb250ZW50LCBzaXplX3Qgc3RhcnRQb3NpdGlvbiwgYm9vbCBwcmVzZXJ2ZU5l
d2xpbmUsIGJvb2wgcHJlc2VydmVUYWIpCit7CisgICAgYXV0byBoYXNXb3JkU2VwYXJhdG9yQ2hh
cmFjdGVyID0gZmFsc2U7CisgICAgYXV0byBpc1doaXRlc3BhY2VDaGFyYWN0ZXIgPSBbJl0oYXV0
byBjaGFyYWN0ZXIpIHsKKyAgICAgICAgLy8gd2hpdGUgc3BhY2UgcHJvY2Vzc2luZyBpbiBDU1Mg
YWZmZWN0cyBvbmx5IHRoZSBkb2N1bWVudCB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzOiBzcGFjZXMg
KFUrMDAyMCksIHRhYnMgKFUrMDAwOSksIGFuZCBzZWdtZW50IGJyZWFrcy4KKyAgICAgICAgYXV0
byBpc1RyZWF0ZWRBc1NwYWNlQ2hhcmFjdGVyID0gY2hhcmFjdGVyID09IHNwYWNlIHx8IChjaGFy
YWN0ZXIgPT0gbmV3bGluZUNoYXJhY3RlciAmJiAhcHJlc2VydmVOZXdsaW5lKSB8fCAoY2hhcmFj
dGVyID09IHRhYkNoYXJhY3RlciAmJiAhcHJlc2VydmVUYWIpOworICAgICAgICBoYXNXb3JkU2Vw
YXJhdG9yQ2hhcmFjdGVyID0gaGFzV29yZFNlcGFyYXRvckNoYXJhY3RlciB8fCBpc1RyZWF0ZWRB
c1NwYWNlQ2hhcmFjdGVyOworICAgICAgICByZXR1cm4gaXNUcmVhdGVkQXNTcGFjZUNoYXJhY3Rl
ciB8fCBjaGFyYWN0ZXIgPT0gdGFiQ2hhcmFjdGVyOworICAgIH07CisgICAgYXV0byBuZXh0Tm9u
V2hpdGVTcGFjZVBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbjsKKyAgICB3aGlsZSAobmV4dE5vbldo
aXRlU3BhY2VQb3NpdGlvbiA8IHRleHRDb250ZW50Lmxlbmd0aCgpICYmIGlzV2hpdGVzcGFjZUNo
YXJhY3Rlcih0ZXh0Q29udGVudFtuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uXSkpCisgICAgICAg
ICsrbmV4dE5vbldoaXRlU3BhY2VQb3NpdGlvbjsKKyAgICByZXR1cm4gbmV4dE5vbldoaXRlU3Bh
Y2VQb3NpdGlvbiA9PSBzdGFydFBvc2l0aW9uID8gV1RGOjpudWxsb3B0IDogbWFrZU9wdGlvbmFs
KFdoaXRlc3BhY2VDb250ZW50IHsgbmV4dE5vbldoaXRlU3BhY2VQb3NpdGlvbiAtIHN0YXJ0UG9z
aXRpb24sIGhhc1dvcmRTZXBhcmF0b3JDaGFyYWN0ZXIgfSk7Cit9CisKK3N0YXRpYyB1bnNpZ25l
ZCBtb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24odW5zaWduZWQgc3RhcnRQb3NpdGlvbiwgTGF6
eUxpbmVCcmVha0l0ZXJhdG9yJiBsaW5lQnJlYWtJdGVyYXRvciwgY29uc3QgUmVuZGVyU3R5bGUm
IHN0eWxlKQoreworICAgIGF1dG8gdGV4dExlbmd0aCA9IGxpbmVCcmVha0l0ZXJhdG9yLnN0cmlu
Z1ZpZXcoKS5sZW5ndGgoKTsKKyAgICBhdXRvIHN0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxl
UG9zaXRpb24gPSBzdGFydFBvc2l0aW9uOworICAgIHdoaWxlIChzdGFydFBvc2l0aW9uRm9yTmV4
dEJyZWFrYWJsZVBvc2l0aW9uIDwgdGV4dExlbmd0aCkgeworICAgICAgICBhdXRvIG5leHRCcmVh
a2FibGVQb3NpdGlvbiA9IFRleHRVdGlsOjpmaW5kTmV4dEJyZWFrYWJsZVBvc2l0aW9uKGxpbmVC
cmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9uRm9yTmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBzdHls
ZSk7CisgICAgICAgIC8vIE9mdGVudGltZXMgdGhlIG5leHQgYnJlYWthYmxlIHBvc2l0aW9uIGNv
bWVzIGJhY2sgYXMgdGhlIHN0YXJ0IHBvc2l0aW9uIChtb3N0IG5vdGFibHkgaHlwaGVucykuCisg
ICAgICAgIGlmIChuZXh0QnJlYWthYmxlUG9zaXRpb24gIT0gc3RhcnRQb3NpdGlvbikKKyAgICAg
ICAgICAgIHJldHVybiBuZXh0QnJlYWthYmxlUG9zaXRpb24gLSBzdGFydFBvc2l0aW9uOworICAg
ICAgICArK3N0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb247CisgICAgfQorICAg
IHJldHVybiB0ZXh0TGVuZ3RoIC0gc3RhcnRQb3NpdGlvbjsKK30KKwordm9pZCBJbmxpbmVUZXh0
SXRlbTo6Y3JlYXRlQW5kQXBwZW5kVGV4dEl0ZW1zKElubGluZUl0ZW1zJiBpbmxpbmVDb250ZW50
LCBjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94KQoreworICAgIGF1dG8gdGV4dCA9
IGlubGluZVRleHRCb3guY29udGVudCgpOworICAgIGlmICghdGV4dC5sZW5ndGgoKSkKKyAgICAg
ICAgcmV0dXJuIGlubGluZUNvbnRlbnQuYXBwZW5kKElubGluZVRleHRJdGVtOjpjcmVhdGVFbXB0
eUl0ZW0oaW5saW5lVGV4dEJveCkpOworCisgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVUZXh0Qm94
LnN0eWxlKCk7CisgICAgYXV0byYgZm9udCA9IHN0eWxlLmZvbnRDYXNjYWRlKCk7CisgICAgYXV0
byB3aGl0ZXNwYWNlQ29udGVudElzVHJlYXRlZEFzU2luZ2xlU3BhY2UgPSAhVGV4dFV0aWw6OnNo
b3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0Qm94KTsKKyAgICBhdXRvIHNob3Vs
ZFByZXNlcnZlTmV3bGluZSA9IFRleHRVdGlsOjpzaG91bGRQcmVzZXJ2ZU5ld2xpbmUoaW5saW5l
VGV4dEJveCk7CisgICAgYXV0byBsaW5lQnJlYWtJdGVyYXRvciA9IExhenlMaW5lQnJlYWtJdGVy
YXRvciB7IHRleHQsIHN0eWxlLmNvbXB1dGVkTG9jYWxlKCksIFRleHRVdGlsOjpsaW5lQnJlYWtJ
dGVyYXRvck1vZGUoc3R5bGUubGluZUJyZWFrKCkpIH07CisgICAgdW5zaWduZWQgY3VycmVudFBv
c2l0aW9uID0gMDsKKworICAgIGF1dG8gaW5saW5lSXRlbVdpZHRoID0gWyZdKGF1dG8gc3RhcnRQ
b3NpdGlvbiwgYXV0byBsZW5ndGgpIC0+IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsKKyAg
ICAgICAgaWYgKCFpbmxpbmVUZXh0Qm94LmNhblVzZVNpbXBsaWZpZWRDb250ZW50TWVhc3VyaW5n
KCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICByZXR1cm4gVGV4dFV0aWw6Ondp
ZHRoKGlubGluZVRleHRCb3gsIHN0YXJ0UG9zaXRpb24sIHN0YXJ0UG9zaXRpb24gKyBsZW5ndGgs
IHsgfSk7CisgICAgfTsKKworICAgIHdoaWxlIChjdXJyZW50UG9zaXRpb24gPCB0ZXh0Lmxlbmd0
aCgpKSB7CisgICAgICAgIGF1dG8gaXNTZWdtZW50QnJlYWtDYW5kaWRhdGUgPSBbXShhdXRvIGNo
YXJhY3RlcikgeworICAgICAgICAgICAgcmV0dXJuIGNoYXJhY3RlciA9PSAnXG4nOworICAgICAg
ICB9OworCisgICAgICAgIC8vIFNlZ21lbnQgYnJlYWtzIHdpdGggcHJlc2VydmUgbmV3IGxpbmUg
c3R5bGUgKHdoaXRlLXNwYWNlOiBwcmUsIHByZS13cmFwLCBicmVhay1zcGFjZXMgYW5kIHByZS1s
aW5lKSBjb21wdXRlIHRvIGZvcmNlZCBsaW5lIGJyZWFrLgorICAgICAgICBpZiAoaXNTZWdtZW50
QnJlYWtDYW5kaWRhdGUodGV4dFtjdXJyZW50UG9zaXRpb25dKSAmJiBzaG91bGRQcmVzZXJ2ZU5l
d2xpbmUpIHsKKyAgICAgICAgICAgIGlubGluZUNvbnRlbnQuYXBwZW5kKElubGluZVNvZnRMaW5l
QnJlYWtJdGVtOjpjcmVhdGVTb2Z0TGluZUJyZWFrSXRlbShpbmxpbmVUZXh0Qm94LCBjdXJyZW50
UG9zaXRpb24pKTsKKyAgICAgICAgICAgICsrY3VycmVudFBvc2l0aW9uOworICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXV0byB3aGl0ZXNwYWNlQ29udGVu
dCA9IG1vdmVUb05leHROb25XaGl0ZXNwYWNlUG9zaXRpb24odGV4dCwgY3VycmVudFBvc2l0aW9u
LCBzaG91bGRQcmVzZXJ2ZU5ld2xpbmUsICF3aGl0ZXNwYWNlQ29udGVudElzVHJlYXRlZEFzU2lu
Z2xlU3BhY2UpKSB7CisgICAgICAgICAgICBBU1NFUlQod2hpdGVzcGFjZUNvbnRlbnQtPmxlbmd0
aCk7CisgICAgICAgICAgICBhdXRvIGFwcGVuZFdoaXRlc3BhY2VJdGVtID0gWyZdIChhdXRvIHN0
YXJ0UG9zaXRpb24sIGF1dG8gaXRlbUxlbmd0aCkgeworICAgICAgICAgICAgICAgIGF1dG8gc2lt
cGxlU2luZ2xlV2hpdGVzcGFjZUNvbnRlbnQgPSBpbmxpbmVUZXh0Qm94LmNhblVzZVNpbXBsaWZp
ZWRDb250ZW50TWVhc3VyaW5nKCkgJiYgKGl0ZW1MZW5ndGggPT0gMSB8fCB3aGl0ZXNwYWNlQ29u
dGVudElzVHJlYXRlZEFzU2luZ2xlU3BhY2UpOworICAgICAgICAgICAgICAgIGF1dG8gd2lkdGgg
PSBzaW1wbGVTaW5nbGVXaGl0ZXNwYWNlQ29udGVudCA/IG1ha2VPcHRpb25hbChJbmxpbmVMYXlv
dXRVbml0IHsgZm9udC5zcGFjZVdpZHRoKCkgfSkgOiBpbmxpbmVJdGVtV2lkdGgoc3RhcnRQb3Np
dGlvbiwgaXRlbUxlbmd0aCk7CisgICAgICAgICAgICAgICAgaW5saW5lQ29udGVudC5hcHBlbmQo
SW5saW5lVGV4dEl0ZW06OmNyZWF0ZVdoaXRlc3BhY2VJdGVtKGlubGluZVRleHRCb3gsIHN0YXJ0
UG9zaXRpb24sIGl0ZW1MZW5ndGgsIHdoaXRlc3BhY2VDb250ZW50LT5pc1dvcmRTZXBhcmF0b3Is
IHdpZHRoKSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgaWYgKHN0eWxlLndoaXRlU3Bh
Y2UoKSA9PSBXaGl0ZVNwYWNlOjpCcmVha1NwYWNlcykgeworICAgICAgICAgICAgICAgIC8vIGh0
dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1waGFzZS0xCisgICAg
ICAgICAgICAgICAgLy8gRm9yIGJyZWFrLXNwYWNlcywgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkg
ZXhpc3RzIGFmdGVyIGV2ZXJ5IHNwYWNlIGFuZCBldmVyeSB0YWIuCisgICAgICAgICAgICAgICAg
Ly8gRklYTUU6IGlmIHRoaXMgdHVybnMgb3V0IHRvIGJlIGEgcGVyZiBoaXQgd2l0aCB0b28gbWFu
eSBpbmRpdmlkdWFsIHdoaXRlc3BhY2UgaW5saW5lIGl0ZW1zLCB3ZSBzaG91bGQgdHJhbnNpdGlv
biB0aGlzIGxvZ2ljIHRvIGxpbmUgYnJlYWtpbmcuCisgICAgICAgICAgICAgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCB3aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoOyArK2kpCisgICAgICAgICAg
ICAgICAgICAgIGFwcGVuZFdoaXRlc3BhY2VJdGVtKGN1cnJlbnRQb3NpdGlvbiArIGksIDEpOwor
ICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYXBwZW5kV2hpdGVzcGFjZUl0ZW0o
Y3VycmVudFBvc2l0aW9uLCB3aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoKTsKKyAgICAgICAgICAg
IGN1cnJlbnRQb3NpdGlvbiArPSB3aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoOworICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGhhc1RyYWlsaW5nU29mdEh5
cGhlbiA9IGZhbHNlOworICAgICAgICBhdXRvIGluaXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRpb24g
PSBjdXJyZW50UG9zaXRpb247CisgICAgICAgIGF1dG8gaXNBdFNvZnRIeXBoZW4gPSBbJl0oYXV0
byBwb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHRleHRbcG9zaXRpb25dID09IHNvZnRI
eXBoZW47CisgICAgICAgIH07CisgICAgICAgIGlmIChzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVu
czo6Tm9uZSkgeworICAgICAgICAgICAgLy8gTGV0J3MgbWVyZ2UgY2FuZGlkYXRlIElubGluZVRl
eHRJdGVtcyBzZXBhcmF0ZWQgYnkgc29mdCBoeXBoZW4gd2hlbiB0aGUgc3R5bGUgc2F5cyBzby4K
KyAgICAgICAgICAgIHdoaWxlIChjdXJyZW50UG9zaXRpb24gPCB0ZXh0Lmxlbmd0aCgpKSB7Cisg
ICAgICAgICAgICAgICAgYXV0byBub25XaGl0ZVNwYWNlTGVuZ3RoID0gbW92ZVRvTmV4dEJyZWFr
YWJsZVBvc2l0aW9uKGN1cnJlbnRQb3NpdGlvbiwgbGluZUJyZWFrSXRlcmF0b3IsIHN0eWxlKTsK
KyAgICAgICAgICAgICAgICBBU1NFUlQobm9uV2hpdGVTcGFjZUxlbmd0aCk7CisgICAgICAgICAg
ICAgICAgY3VycmVudFBvc2l0aW9uICs9IG5vbldoaXRlU3BhY2VMZW5ndGg7CisgICAgICAgICAg
ICAgICAgaWYgKCFpc0F0U29mdEh5cGhlbihjdXJyZW50UG9zaXRpb24gLSAxKSkKKyAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICBhdXRvIG5vbldoaXRlU3BhY2VMZW5ndGggPSBtb3ZlVG9OZXh0QnJlYWthYmxlUG9z
aXRpb24oaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiwgbGluZUJyZWFrSXRlcmF0b3IsIHN0
eWxlKTsKKyAgICAgICAgICAgIEFTU0VSVChub25XaGl0ZVNwYWNlTGVuZ3RoKTsKKyAgICAgICAg
ICAgIGN1cnJlbnRQb3NpdGlvbiArPSBub25XaGl0ZVNwYWNlTGVuZ3RoOworICAgICAgICAgICAg
aGFzVHJhaWxpbmdTb2Z0SHlwaGVuID0gaXNBdFNvZnRIeXBoZW4oY3VycmVudFBvc2l0aW9uIC0g
MSk7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUKGluaXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRp
b24gPCBjdXJyZW50UG9zaXRpb24pOworICAgICAgICBBU1NFUlRfSU1QTElFUyhzdHlsZS5oeXBo
ZW5zKCkgPT0gSHlwaGVuczo6Tm9uZSwgIWhhc1RyYWlsaW5nU29mdEh5cGhlbik7CisgICAgICAg
IGF1dG8gbGVuZ3RoID0gY3VycmVudFBvc2l0aW9uIC0gaW5pdGlhbE5vbldoaXRlc3BhY2VQb3Np
dGlvbjsKKyAgICAgICAgaW5saW5lQ29udGVudC5hcHBlbmQoSW5saW5lVGV4dEl0ZW06OmNyZWF0
ZU5vbldoaXRlc3BhY2VJdGVtKGlubGluZVRleHRCb3gsIGluaXRpYWxOb25XaGl0ZXNwYWNlUG9z
aXRpb24sIGxlbmd0aCwgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBpbmxpbmVJdGVtV2lkdGgoaW5p
dGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiwgbGVuZ3RoKSkpOworICAgIH0KK30KKworYm9vbCBJ
bmxpbmVUZXh0SXRlbTo6aXNFbXB0eUNvbnRlbnQoKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBX
ZSBzaG91bGQgY2hlY2sgZm9yIG1vcmUgemVybyB3aWR0aCBjb250ZW50IGFuZCBub3QganVzdCBV
KzIwMEIuCisgICAgcmV0dXJuICFtX2xlbmd0aCB8fCAobV9sZW5ndGggPT0gMSAmJiBpbmxpbmVU
ZXh0Qm94KCkuY29udGVudCgpW3N0YXJ0KCldID09IHplcm9XaWR0aFNwYWNlKTsgCit9CisKK2Jv
b2wgSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhjb25zdCBJbmxp
bmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0ZW0pCit7CisgICAgQVNTRVJUKGlubGluZVRleHRJdGVt
LmlzV2hpdGVzcGFjZSgpKTsKKyAgICByZXR1cm4gVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3Bh
Y2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbS5sYXlvdXRCb3goKSk7Cit9CisKK30KK30KKyNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi41MmRjOThkY2YwNmExOWFhMDVmYzRhYTBhYTI0ZDk4M2E1YjdjZDE1Ci0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxp
bmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgor
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
KyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhU
KQorCisjaW5jbHVkZSAiSW5saW5lSXRlbS5oIgorI2luY2x1ZGUgIkxheW91dElubGluZVRleHRC
b3guaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3VzaW5n
IElubGluZUl0ZW1zID0gVmVjdG9yPElubGluZUl0ZW0+OworCitjbGFzcyBJbmxpbmVUZXh0SXRl
bSA6IHB1YmxpYyBJbmxpbmVJdGVtIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgdm9pZCBjcmVhdGVB
bmRBcHBlbmRUZXh0SXRlbXMoSW5saW5lSXRlbXMmLCBjb25zdCBJbmxpbmVUZXh0Qm94Jik7CisK
KyAgICB1bnNpZ25lZCBzdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRPclBvc2l0aW9uOyB9
CisgICAgdW5zaWduZWQgZW5kKCkgY29uc3QgeyByZXR1cm4gc3RhcnQoKSArIGxlbmd0aCgpOyB9
CisgICAgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9sZW5ndGg7IH0KKworICAg
IGJvb2wgaXNXaGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV90ZXh0SXRlbVR5cGUgPT0gVGV4
dEl0ZW1UeXBlOjpXaGl0ZXNwYWNlOyB9CisgICAgYm9vbCBpc1dvcmRTZXBhcmF0b3IoKSBjb25z
dCB7IHJldHVybiBtX2lzV29yZFNlcGFyYXRvcjsgfQorICAgIGJvb2wgaGFzVHJhaWxpbmdTb2Z0
SHlwaGVuKCkgY29uc3QgeyByZXR1cm4gbV9oYXNUcmFpbGluZ1NvZnRIeXBoZW47IH0KKyAgICBP
cHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzV2lk
dGggPyBtYWtlT3B0aW9uYWwobV93aWR0aCkgOiBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB7
IH07IH0KKyAgICBib29sIGlzRW1wdHlDb250ZW50KCkgY29uc3Q7CisKKyAgICBjb25zdCBJbmxp
bmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8SW5saW5l
VGV4dEJveD4obGF5b3V0Qm94KCkpOyB9CisKKyAgICBJbmxpbmVUZXh0SXRlbSBsZWZ0KHVuc2ln
bmVkIGxlbmd0aCkgY29uc3Q7CisgICAgSW5saW5lVGV4dEl0ZW0gcmlnaHQodW5zaWduZWQgbGVu
Z3RoKSBjb25zdDsKKworICAgIHN0YXRpYyBib29sIHNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFi
cyhjb25zdCBJbmxpbmVUZXh0SXRlbSYpOworCitwcml2YXRlOgorICAgIHVzaW5nIElubGluZUl0
ZW06OlRleHRJdGVtVHlwZTsKKworICAgIElubGluZVRleHRJdGVtKGNvbnN0IElubGluZVRleHRC
b3gmLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGhhc1RyYWlsaW5nU29m
dEh5cGhlbiwgYm9vbCBpc1dvcmRTZXBhcmF0b3IsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+
IHdpZHRoLCBUZXh0SXRlbVR5cGUpOworICAgIGV4cGxpY2l0IElubGluZVRleHRJdGVtKGNvbnN0
IElubGluZVRleHRCb3gmKTsKKworICAgIHN0YXRpYyBJbmxpbmVUZXh0SXRlbSBjcmVhdGVXaGl0
ZXNwYWNlSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVk
IGxlbmd0aCwgYm9vbCBpc1dvcmRTZXBhcmF0b3IsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+
IHdpZHRoKTsKKyAgICBzdGF0aWMgSW5saW5lVGV4dEl0ZW0gY3JlYXRlTm9uV2hpdGVzcGFjZUl0
ZW0oY29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgs
IGJvb2wgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3
aWR0aCk7CisgICAgc3RhdGljIElubGluZVRleHRJdGVtIGNyZWF0ZUVtcHR5SXRlbShjb25zdCBJ
bmxpbmVUZXh0Qm94Jik7Cit9OworCitpbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5saW5lVGV4dEl0
ZW06OmNyZWF0ZVdoaXRlc3BhY2VJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRC
b3gsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wgaXNXb3JkU2VwYXJhdG9y
LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCkKK3sKKyAgICByZXR1cm4geyBpbmxp
bmVUZXh0Qm94LCBzdGFydCwgbGVuZ3RoLCBmYWxzZSwgaXNXb3JkU2VwYXJhdG9yLCB3aWR0aCwg
VGV4dEl0ZW1UeXBlOjpXaGl0ZXNwYWNlIH07Cit9CisKK2lubGluZSBJbmxpbmVUZXh0SXRlbSBJ
bmxpbmVUZXh0SXRlbTo6Y3JlYXRlTm9uV2hpdGVzcGFjZUl0ZW0oY29uc3QgSW5saW5lVGV4dEJv
eCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBo
YXNUcmFpbGluZ1NvZnRIeXBoZW4sIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRoKQor
eworICAgIC8vIEZJWE1FOiBVc2UgdGhlIGZvbGxvd2luZyBsaXN0IG9mIG5vbi13aGl0ZXNwYWNl
IGNoYXJhY3RlcnMgdG8gc2V0IHRoZSAiaXNXb3JkU2VwYXJhdG9yIiBiaXQ6IG5vQnJlYWtTcGFj
ZSwgZXRoaW9waWNXb3Jkc3BhY2UsIGFlZ2VhbldvcmRTZXBhcmF0b3JMaW5lIGFlZ2VhbldvcmRT
ZXBhcmF0b3JEb3QgdWdhcml0aWNXb3JkRGl2aWRlci4KKyAgICByZXR1cm4geyBpbmxpbmVUZXh0
Qm94LCBzdGFydCwgbGVuZ3RoLCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIGZhbHNlLCB3aWR0aCwg
VGV4dEl0ZW1UeXBlOjpOb25XaGl0ZXNwYWNlIH07Cit9CisKK2lubGluZSBJbmxpbmVUZXh0SXRl
bSBJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlRW1wdHlJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlu
bGluZVRleHRCb3gpCit7CisgICAgcmV0dXJuIElubGluZVRleHRJdGVtIHsgaW5saW5lVGV4dEJv
eCB9OworfQorCitpbmxpbmUgSW5saW5lVGV4dEl0ZW06OklubGluZVRleHRJdGVtKGNvbnN0IElu
bGluZVRleHRCb3gmIGlubGluZVRleHRCb3gsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5n
dGgsIGJvb2wgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBib29sIGlzV29yZFNlcGFyYXRvciwgT3B0
aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgsIFRleHRJdGVtVHlwZSB0ZXh0SXRlbVR5cGUp
CisgICAgOiBJbmxpbmVJdGVtKGlubGluZVRleHRCb3gsIFR5cGU6OlRleHQpCit7CisgICAgbV9z
dGFydE9yUG9zaXRpb24gPSBzdGFydDsKKyAgICBtX2xlbmd0aCA9IGxlbmd0aDsKKyAgICBtX2hh
c1dpZHRoID0gISF3aWR0aDsKKyAgICBtX2hhc1RyYWlsaW5nU29mdEh5cGhlbiA9IGhhc1RyYWls
aW5nU29mdEh5cGhlbjsKKyAgICBtX2lzV29yZFNlcGFyYXRvciA9IGlzV29yZFNlcGFyYXRvcjsK
KyAgICBtX3dpZHRoID0gd2lkdGgudmFsdWVPcigwKTsKKyAgICBtX3RleHRJdGVtVHlwZSA9IHRl
eHRJdGVtVHlwZTsKK30KKworaW5saW5lIElubGluZVRleHRJdGVtOjpJbmxpbmVUZXh0SXRlbShj
b25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94KQorICAgIDogSW5saW5lSXRlbShpbmxp
bmVUZXh0Qm94LCBUeXBlOjpUZXh0KQoreworfQorCitpbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5s
aW5lVGV4dEl0ZW06OmxlZnQodW5zaWduZWQgbGVuZ3RoKSBjb25zdAoreworICAgIFJFTEVBU0Vf
QVNTRVJUKGxlbmd0aCA8PSB0aGlzLT5sZW5ndGgoKSk7CisgICAgQVNTRVJUKG1fdGV4dEl0ZW1U
eXBlICE9IFRleHRJdGVtVHlwZTo6VW5kZWZpbmVkKTsKKyAgICBBU1NFUlQobGVuZ3RoKTsKKyAg
ICByZXR1cm4geyBpbmxpbmVUZXh0Qm94KCksIHN0YXJ0KCksIGxlbmd0aCwgZmFsc2UsIGlzV29y
ZFNlcGFyYXRvcigpLCBXVEY6Om51bGxvcHQsIG1fdGV4dEl0ZW1UeXBlIH07Cit9CisKK2lubGlu
ZSBJbmxpbmVUZXh0SXRlbSBJbmxpbmVUZXh0SXRlbTo6cmlnaHQodW5zaWduZWQgbGVuZ3RoKSBj
b25zdAoreworICAgIFJFTEVBU0VfQVNTRVJUKGxlbmd0aCA8PSB0aGlzLT5sZW5ndGgoKSk7Cisg
ICAgQVNTRVJUKG1fdGV4dEl0ZW1UeXBlICE9IFRleHRJdGVtVHlwZTo6VW5kZWZpbmVkKTsKKyAg
ICBBU1NFUlQobGVuZ3RoKTsKKyAgICByZXR1cm4geyBpbmxpbmVUZXh0Qm94KCksIGVuZCgpIC0g
bGVuZ3RoLCBsZW5ndGgsIGhhc1RyYWlsaW5nU29mdEh5cGhlbigpLCBpc1dvcmRTZXBhcmF0b3Io
KSwgV1RGOjpudWxsb3B0LCBtX3RleHRJdGVtVHlwZSB9OworfQorCit9Cit9CisKK1NQRUNJQUxJ
WkVfVFlQRV9UUkFJVFNfSU5MSU5FX0lURU0oSW5saW5lVGV4dEl0ZW0sIGlzVGV4dCgpKQorCisj
ZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRVdGlsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRVdGlsLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi43ZTU3NWJjZTcyODUzYThjOWRiZjM2MmY0ZmM5YjE5OTc2YWIyNTIwCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuY3BwCkBAIC0wLDAgKzEsMTc1IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRleHRVdGlsLmgiCisK
KyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkJyZWFr
TGluZXMuaCIKKyNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgorI2luY2x1ZGUgIklubGluZVRleHRJ
dGVtLmgiCisjaW5jbHVkZSAiTGF5b3V0SW5saW5lVGV4dEJveC5oIgorI2luY2x1ZGUgIlJlbmRl
ckJveC5oIgorI2luY2x1ZGUgIlJlbmRlclN0eWxlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K25hbWVzcGFjZSBMYXlvdXQgeworCitJbmxpbmVMYXlvdXRVbml0IFRleHRVdGlsOjp3aWR0aChj
b25zdCBJbmxpbmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0ZW0sIElubGluZUxheW91dFVuaXQgY29u
dGVudExvZ2ljYWxMZWZ0KQoreworICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4
dEl0ZW0sIGlubGluZVRleHRJdGVtLnN0YXJ0KCksIGlubGluZVRleHRJdGVtLmVuZCgpLCBjb250
ZW50TG9naWNhbExlZnQpOworfQorCitJbmxpbmVMYXlvdXRVbml0IFRleHRVdGlsOjp3aWR0aChj
b25zdCBJbmxpbmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0ZW0sIHVuc2lnbmVkIGZyb20sIHVuc2ln
bmVkIHRvLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCkKK3sKKyAgICBSRUxF
QVNFX0FTU0VSVChmcm9tID49IGlubGluZVRleHRJdGVtLnN0YXJ0KCkpOworICAgIFJFTEVBU0Vf
QVNTRVJUKHRvIDw9IGlubGluZVRleHRJdGVtLmVuZCgpKTsKKyAgICBpZiAoaW5saW5lVGV4dEl0
ZW0uaXNXaGl0ZXNwYWNlKCkgJiYgIUlubGluZVRleHRJdGVtOjpzaG91bGRQcmVzZXJ2ZVNwYWNl
c0FuZFRhYnMoaW5saW5lVGV4dEl0ZW0pKSB7CisgICAgICAgIGF1dG8gc3BhY2VXaWR0aCA9IGlu
bGluZVRleHRJdGVtLnN0eWxlKCkuZm9udENhc2NhZGUoKS5zcGFjZVdpZHRoKCk7CisgICAgICAg
IHJldHVybiBzdGQ6OmlzbmFuKHNwYWNlV2lkdGgpID8gMC4wZiA6IHN0ZDo6aXNpbmYoc3BhY2VX
aWR0aCkgPyBtYXhJbmxpbmVMYXlvdXRVbml0KCkgOiBzcGFjZVdpZHRoOworICAgIH0KKyAgICBy
ZXR1cm4gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRJdGVtLmlubGluZVRleHRCb3goKSwgZnJv
bSwgdG8sIGNvbnRlbnRMb2dpY2FsTGVmdCk7Cit9CisKK0lubGluZUxheW91dFVuaXQgVGV4dFV0
aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRCb3gsIHVuc2lnbmVkIGZy
b20sIHVuc2lnbmVkIHRvLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCkKK3sK
KyAgICBpZiAoZnJvbSA9PSB0bykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBhdXRvJiBzdHls
ZSA9IGlubGluZVRleHRCb3guc3R5bGUoKTsKKyAgICBhdXRvJiBmb250ID0gc3R5bGUuZm9udENh
c2NhZGUoKTsKKyAgICBhdXRvIHRleHQgPSBpbmxpbmVUZXh0Qm94LmNvbnRlbnQoKTsKKyAgICBB
U1NFUlQodG8gPD0gdGV4dC5sZW5ndGgoKSk7CisgICAgYXV0byBoYXNLZXJuaW5nT3JMaWdhdHVy
ZXMgPSBmb250LmVuYWJsZUtlcm5pbmcoKSB8fCBmb250LnJlcXVpcmVzU2hhcGluZygpOworICAg
IGF1dG8gbWVhc3VyZVdpdGhFbmRTcGFjZSA9IGhhc0tlcm5pbmdPckxpZ2F0dXJlcyAmJiB0byA8
IHRleHQubGVuZ3RoKCkgJiYgdGV4dFt0b10gPT0gJyAnOworICAgIGlmIChtZWFzdXJlV2l0aEVu
ZFNwYWNlKQorICAgICAgICArK3RvOworICAgIGZsb2F0IHdpZHRoID0gMDsKKyAgICBpZiAoaW5s
aW5lVGV4dEJveC5jYW5Vc2VTaW1wbGlmaWVkQ29udGVudE1lYXN1cmluZygpKQorICAgICAgICB3
aWR0aCA9IGZvbnQud2lkdGhGb3JTaW1wbGVUZXh0KFN0cmluZ1ZpZXcodGV4dCkuc3Vic3RyaW5n
KGZyb20sIHRvIC0gZnJvbSkpOworICAgIGVsc2UgeworICAgICAgICBhdXRvIHRhYldpZHRoID0g
c3R5bGUuY29sbGFwc2VXaGl0ZVNwYWNlKCkgPyBUYWJTaXplKDApIDogc3R5bGUudGFiU2l6ZSgp
OworICAgICAgICBXZWJDb3JlOjpUZXh0UnVuIHJ1bihTdHJpbmdWaWV3KHRleHQpLnN1YnN0cmlu
Zyhmcm9tLCB0byAtIGZyb20pLCBjb250ZW50TG9naWNhbExlZnQpOworICAgICAgICBpZiAodGFi
V2lkdGgpCisgICAgICAgICAgICBydW4uc2V0VGFiU2l6ZSh0cnVlLCB0YWJXaWR0aCk7CisgICAg
ICAgIHdpZHRoID0gZm9udC53aWR0aChydW4pOworICAgIH0KKworICAgIGlmIChtZWFzdXJlV2l0
aEVuZFNwYWNlKQorICAgICAgICB3aWR0aCAtPSAoZm9udC5zcGFjZVdpZHRoKCkgKyBmb250Lndv
cmRTcGFjaW5nKCkpOworCisgICAgcmV0dXJuIHN0ZDo6aXNuYW4od2lkdGgpID8gMC4wZiA6IHN0
ZDo6aXNpbmYod2lkdGgpID8gbWF4SW5saW5lTGF5b3V0VW5pdCgpIDogd2lkdGg7Cit9CisKK1Rl
eHRVdGlsOjpTcGxpdERhdGEgVGV4dFV0aWw6OnNwbGl0KGNvbnN0IElubGluZVRleHRJdGVtJiBp
bmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCB0ZXh0V2lkdGgsIElubGluZUxheW91dFVu
aXQgYXZhaWxhYmxlV2lkdGgsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KQor
eworICAgIEFTU0VSVChhdmFpbGFibGVXaWR0aCA+PSAwKTsKKyAgICBhdXRvIHN0YXJ0UG9zaXRp
b24gPSBpbmxpbmVUZXh0SXRlbS5zdGFydCgpOworICAgIGF1dG8gbGVuZ3RoID0gaW5saW5lVGV4
dEl0ZW0ubGVuZ3RoKCk7CisgICAgQVNTRVJUKGxlbmd0aCk7CisKKyAgICBhdXRvIGxlZnQgPSBz
dGFydFBvc2l0aW9uOworICAgIC8vIFBhdGhvbG9naWNhbCBjYXNlIG9mIChleHRyZW1lbHkpbG9u
ZyBzdHJpbmcgYW5kIG5hcnJvdyBsaW5lcy4KKyAgICAvLyBBZGp1c3QgdGhlIHJhbmdlIHNvIHRo
YXQgd2UgY2FuIHBpY2sgYSByZWFzb25hYmxlIG1pZHBvaW50LgorICAgIElubGluZUxheW91dFVu
aXQgYXZlcmFnZUNoYXJhY3RlcldpZHRoID0gdGV4dFdpZHRoIC8gbGVuZ3RoOworICAgIHVuc2ln
bmVkIG9mZnNldCA9IHRvTGF5b3V0VW5pdCgyICogYXZhaWxhYmxlV2lkdGggLyBhdmVyYWdlQ2hh
cmFjdGVyV2lkdGgpLnRvVW5zaWduZWQoKTsKKyAgICBhdXRvIHJpZ2h0ID0gc3RkOjptaW48dW5z
aWduZWQ+KGxlZnQgKyBvZmZzZXQsIChzdGFydFBvc2l0aW9uICsgbGVuZ3RoIC0gMSkpOworICAg
IC8vIFByZXNlcnZlIHRoZSBsZWZ0IHdpZHRoIGZvciB0aGUgZmluYWwgc3BsaXQgcG9zaXRpb24g
c28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIHJlbWVhc3VyZSB0aGUgbGVmdCBzaWRlIGFnYWluLgor
ICAgIElubGluZUxheW91dFVuaXQgbGVmdFNpZGVXaWR0aCA9IDA7CisgICAgd2hpbGUgKGxlZnQg
PCByaWdodCkgeworICAgICAgICBhdXRvIG1pZGRsZSA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKKyAg
ICAgICAgYXV0byB3aWR0aCA9IFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgc3RhcnRQ
b3NpdGlvbiwgbWlkZGxlICsgMSwgY29udGVudExvZ2ljYWxMZWZ0KTsKKyAgICAgICAgaWYgKHdp
ZHRoIDwgYXZhaWxhYmxlV2lkdGgpIHsKKyAgICAgICAgICAgIGxlZnQgPSBtaWRkbGUgKyAxOwor
ICAgICAgICAgICAgbGVmdFNpZGVXaWR0aCA9IHdpZHRoOworICAgICAgICB9IGVsc2UgaWYgKHdp
ZHRoID4gYXZhaWxhYmxlV2lkdGgpCisgICAgICAgICAgICByaWdodCA9IG1pZGRsZTsKKyAgICAg
ICAgZWxzZSB7CisgICAgICAgICAgICByaWdodCA9IG1pZGRsZSArIDE7CisgICAgICAgICAgICBs
ZWZ0U2lkZVdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
IH0KKyAgICByZXR1cm4geyBzdGFydFBvc2l0aW9uLCByaWdodCAtIHN0YXJ0UG9zaXRpb24sIGxl
ZnRTaWRlV2lkdGggfTsKK30KKwordW5zaWduZWQgVGV4dFV0aWw6OmZpbmROZXh0QnJlYWthYmxl
UG9zaXRpb24oTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiBsaW5lQnJlYWtJdGVyYXRvciwgdW5zaWdu
ZWQgc3RhcnRQb3NpdGlvbiwgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKQoreworICAgIGF1dG8g
a2VlcEFsbFdvcmRzRm9yQ0pLID0gc3R5bGUud29yZEJyZWFrKCkgPT0gV29yZEJyZWFrOjpLZWVw
QWxsOworICAgIGF1dG8gYnJlYWtOQlNQID0gc3R5bGUuYXV0b1dyYXAoKSAmJiBzdHlsZS5uYnNw
TW9kZSgpID09IE5CU1BNb2RlOjpTcGFjZTsKKworICAgIGlmIChrZWVwQWxsV29yZHNGb3JDSksp
IHsKKyAgICAgICAgaWYgKGJyZWFrTkJTUCkKKyAgICAgICAgICAgIHJldHVybiBuZXh0QnJlYWth
YmxlUG9zaXRpb25LZWVwaW5nQWxsV29yZHMobGluZUJyZWFrSXRlcmF0b3IsIHN0YXJ0UG9zaXRp
b24pOworICAgICAgICByZXR1cm4gbmV4dEJyZWFrYWJsZVBvc2l0aW9uS2VlcGluZ0FsbFdvcmRz
SWdub3JpbmdOQlNQKGxpbmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9uKTsKKyAgICB9CisK
KyAgICBpZiAobGluZUJyZWFrSXRlcmF0b3IubW9kZSgpID09IExpbmVCcmVha0l0ZXJhdG9yTW9k
ZTo6RGVmYXVsdCkgeworICAgICAgICBpZiAoYnJlYWtOQlNQKQorICAgICAgICAgICAgcmV0dXJu
IFdlYkNvcmU6Om5leHRCcmVha2FibGVQb3NpdGlvbihsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQ
b3NpdGlvbik7CisgICAgICAgIHJldHVybiBuZXh0QnJlYWthYmxlUG9zaXRpb25JZ25vcmluZ05C
U1AobGluZUJyZWFrSXRlcmF0b3IsIHN0YXJ0UG9zaXRpb24pOworICAgIH0KKworICAgIGlmIChi
cmVha05CU1ApCisgICAgICAgIHJldHVybiBuZXh0QnJlYWthYmxlUG9zaXRpb25XaXRob3V0U2hv
cnRjdXQobGluZUJyZWFrSXRlcmF0b3IsIHN0YXJ0UG9zaXRpb24pOworICAgIHJldHVybiBuZXh0
QnJlYWthYmxlUG9zaXRpb25JZ25vcmluZ05CU1BXaXRob3V0U2hvcnRjdXQobGluZUJyZWFrSXRl
cmF0b3IsIHN0YXJ0UG9zaXRpb24pOworfQorCitib29sIFRleHRVdGlsOjpzaG91bGRQcmVzZXJ2
ZVNwYWNlc0FuZFRhYnMoY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgLy8gaHR0cHM6Ly93
d3cudzMub3JnL1RSL2Nzcy10ZXh0LTMvI3doaXRlLXNwYWNlLXByb3BlcnR5CisgICAgYXV0byB3
aGl0ZXNwYWNlID0gbGF5b3V0Qm94LnN0eWxlKCkud2hpdGVTcGFjZSgpOworICAgIHJldHVybiB3
aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZSB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6
OlByZVdyYXAgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpCcmVha1NwYWNlczsKK30KKwor
Ym9vbCBUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVOZXdsaW5lKGNvbnN0IEJveCYgbGF5b3V0Qm94
KQoreworICAgIGF1dG8gd2hpdGVzcGFjZSA9IGxheW91dEJveC5zdHlsZSgpLndoaXRlU3BhY2Uo
KTsKKyAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXRleHQtMy8jd2hpdGUtc3BhY2Ut
cHJvcGVydHkKKyAgICByZXR1cm4gd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpQcmUgfHwgd2hp
dGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpQcmVXcmFwIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFj
ZTo6QnJlYWtTcGFjZXMgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpQcmVMaW5lOyAKK30K
KworTGluZUJyZWFrSXRlcmF0b3JNb2RlIFRleHRVdGlsOjpsaW5lQnJlYWtJdGVyYXRvck1vZGUo
TGluZUJyZWFrIGxpbmVCcmVhaykKK3sKKyAgICBzd2l0Y2ggKGxpbmVCcmVhaykgeworICAgIGNh
c2UgTGluZUJyZWFrOjpBdXRvOgorICAgIGNhc2UgTGluZUJyZWFrOjpBZnRlcldoaXRlU3BhY2U6
CisgICAgY2FzZSBMaW5lQnJlYWs6OkFueXdoZXJlOgorICAgICAgICByZXR1cm4gTGluZUJyZWFr
SXRlcmF0b3JNb2RlOjpEZWZhdWx0OworICAgIGNhc2UgTGluZUJyZWFrOjpMb29zZToKKyAgICAg
ICAgcmV0dXJuIExpbmVCcmVha0l0ZXJhdG9yTW9kZTo6TG9vc2U7CisgICAgY2FzZSBMaW5lQnJl
YWs6Ok5vcm1hbDoKKyAgICAgICAgcmV0dXJuIExpbmVCcmVha0l0ZXJhdG9yTW9kZTo6Tm9ybWFs
OworICAgIGNhc2UgTGluZUJyZWFrOjpTdHJpY3Q6CisgICAgICAgIHJldHVybiBMaW5lQnJlYWtJ
dGVyYXRvck1vZGU6OlN0cmljdDsKKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgcmV0dXJuIExpbmVCcmVha0l0ZXJhdG9yTW9kZTo6RGVmYXVsdDsKK30KKworfQorfQorI2Vu
ZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2lubGluZWZvcm1hdHRpbmcvdGV4dC9UZXh0VXRpbC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi4xZjU4NGZhNzk4MWJkNDM4M2NmNDNlMjNhNGJmYWViODIwY2UzMmYyCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxp
bmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisg
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkK
KworI2luY2x1ZGUgIklubGluZUl0ZW0uaCIKKyNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1RleHRCcmVha0l0ZXJhdG9yLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgUmVuZGVyU3R5bGU7CisKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBJ
bmxpbmVUZXh0Qm94OworY2xhc3MgSW5saW5lVGV4dEl0ZW07CisKK2NsYXNzIFRleHRVdGlsIHsK
K3B1YmxpYzoKKyAgICBzdGF0aWMgSW5saW5lTGF5b3V0VW5pdCB3aWR0aChjb25zdCBJbmxpbmVU
ZXh0SXRlbSYsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KTsKKyAgICBzdGF0
aWMgSW5saW5lTGF5b3V0VW5pdCB3aWR0aChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIHVuc2lnbmVk
IGZyb20sIHVuc2lnbmVkIHRvLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCk7
CisgICAgc3RhdGljIElubGluZUxheW91dFVuaXQgd2lkdGgoY29uc3QgSW5saW5lVGV4dEJveCYs
IHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dp
Y2FsTGVmdCk7CisKKyAgICBzdHJ1Y3QgU3BsaXREYXRhIHsKKyAgICAgICAgdW5zaWduZWQgc3Rh
cnQgeyAwIH07CisgICAgICAgIHVuc2lnbmVkIGxlbmd0aCB7IDAgfTsKKyAgICAgICAgSW5saW5l
TGF5b3V0VW5pdCBsb2dpY2FsV2lkdGggeyAwIH07CisgICAgfTsKKyAgICBzdGF0aWMgU3BsaXRE
YXRhIHNwbGl0KGNvbnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCB0ZXh0V2lk
dGgsIElubGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgsIElubGluZUxheW91dFVuaXQgY29u
dGVudExvZ2ljYWxMZWZ0KTsKKworICAgIHN0YXRpYyB1bnNpZ25lZCBmaW5kTmV4dEJyZWFrYWJs
ZVBvc2l0aW9uKExhenlMaW5lQnJlYWtJdGVyYXRvciYsIHVuc2lnbmVkIHN0YXJ0UG9zaXRpb24s
IGNvbnN0IFJlbmRlclN0eWxlJik7CisgICAgc3RhdGljIExpbmVCcmVha0l0ZXJhdG9yTW9kZSBs
aW5lQnJlYWtJdGVyYXRvck1vZGUoTGluZUJyZWFrKTsKKworICAgIHN0YXRpYyBib29sIHNob3Vs
ZFByZXNlcnZlU3BhY2VzQW5kVGFicyhjb25zdCBCb3gmKTsKKyAgICBzdGF0aWMgYm9vbCBzaG91
bGRQcmVzZXJ2ZU5ld2xpbmUoY29uc3QgQm94Jik7Cit9OworCit9Cit9CisjZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3Jt
YXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4
dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uOTAyYWY3YzVlZDg4ZDUwNGNhYzQyNWExMzUyMTAwOGI2ZTU4Yjlh
YwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQuY3BwCkBAIC0wLDAg
KzEsNTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4K
KyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRh
YmxlRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19D
T05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJG
bG9hdGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5j
bHVkZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNs
dWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENoaWxkSXRlcmF0b3Iu
aCIKKyNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENv
bnRhaW5pbmdCbG9jay5oIgorI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5j
bHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFt
ZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChUYWJsZUZvcm1h
dHRpbmdDb250ZXh0KTsKKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10YWJsZXMtMy8j
dGFibGUtbGF5b3V0LWFsZ29yaXRobQorVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6VGFibGVGb3Jt
YXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwg
VGFibGVGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSkKKyAgICA6IEZvcm1hdHRpbmdD
b250ZXh0KGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgZm9ybWF0dGluZ1N0YXRlKQoreworfQorCit2
b2lkIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0
aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRz
KQoreworICAgIGF1dG8gYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlID0gY29uc3RyYWludHMuaG9y
aXpvbnRhbC5sb2dpY2FsV2lkdGg7CisgICAgYXV0byBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlID0g
Y29uc3RyYWludHMudmVydGljYWwubG9naWNhbEhlaWdodDsKKyAgICAvLyAxLiBDb21wdXRlIHdp
ZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSBncmlkLgorICAgIGNvbXB1dGVBbmREaXN0cmlidXRlRXh0
cmFTcGFjZShhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UsIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2Up
OworICAgIC8vIDIuIEZpbmFsaXplIGNlbGxzLgorICAgIHNldFVzZWRHZW9tZXRyeUZvckNlbGxz
KGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSk7CisgICAgLy8gMy4gRmluYWxpemUgcm93cy4KKyAg
ICBzZXRVc2VkR2VvbWV0cnlGb3JSb3dzKGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSk7CisgICAg
Ly8gNC4gRmluYWxpemUgc2VjdGlvbnMuCisgICAgc2V0VXNlZEdlb21ldHJ5Rm9yU2VjdGlvbnMo
Y29uc3RyYWludHMpOworfQorCitMYXlvdXRVbml0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OnVz
ZWRDb250ZW50SGVpZ2h0KCkgY29uc3QKK3sKKyAgICAvLyBUYWJsZSBoYXMgdG8gaGF2ZSBzb21l
IHNlY3Rpb24gY29udGVudCwgYXQgbGVhc3Qgb25lIDx0Ym9keT4uCisgICAgYXV0byB0b3AgPSBC
b3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9tZXRyeUZvckJveCgqcm9vdCgpLmZpcnN0SW5G
bG93Q2hpbGQoKSkpLnRvcCgpOworICAgIGF1dG8gYm90dG9tID0gQm94R2VvbWV0cnk6Om1hcmdp
bkJveFJlY3QoZ2VvbWV0cnlGb3JCb3goKnJvb3QoKS5sYXN0SW5GbG93Q2hpbGQoKSkpLmJvdHRv
bSgpOworICAgIHJldHVybiBib3R0b20gLSB0b3A7Cit9CisKK3ZvaWQgVGFibGVGb3JtYXR0aW5n
Q29udGV4dDo6c2V0VXNlZEdlb21ldHJ5Rm9yQ2VsbHMoTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jp
em9udGFsU3BhY2UpCit7CisgICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxl
R3JpZCgpOworICAgIGF1dG8mIGNvbHVtbkxpc3QgPSBncmlkLmNvbHVtbnMoKS5saXN0KCk7Cisg
ICAgYXV0byYgcm93TGlzdCA9IGdyaWQucm93cygpLmxpc3QoKTsKKyAgICAvLyBGaW5hbCB0YWJs
ZSBjZWxsIGxheW91dC4gQXQgdGhpcyBwb2ludCBhbGwgcGVyY2VudGFnZSB2YWx1ZXMgY2FuIGJl
IHJlc29sdmVkLgorICAgIGF1dG8gc2VjdGlvbk9mZnNldCA9IExheW91dFVuaXQgeyB9OworICAg
IGF1dG8qIGN1cnJlbnRTZWN0aW9uID0gJnJvd0xpc3QuZmlyc3QoKS5ib3goKS5wYXJlbnQoKTsK
KyAgICBmb3IgKGF1dG8mIGNlbGwgOiBncmlkLmNlbGxzKCkpIHsKKyAgICAgICAgYXV0byYgY2Vs
bEJveCA9IGNlbGwtPmJveCgpOworICAgICAgICBhdXRvJiBjZWxsQm94R2VvbWV0cnkgPSBmb3Jt
YXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShjZWxsQm94KTsKKyAgICAgICAgYXV0byYgc2VjdGlv
biA9IHJvd0xpc3RbY2VsbC0+c3RhcnRSb3coKV0uYm94KCkucGFyZW50KCk7CisgICAgICAgIGlm
ICgmc2VjdGlvbiAhPSBjdXJyZW50U2VjdGlvbikgeworICAgICAgICAgICAgY3VycmVudFNlY3Rp
b24gPSAmc2VjdGlvbjsKKyAgICAgICAgICAgIC8vIFdoaWxlIHRoZSBncmlkIGlzIGEgY29udGlu
dW91cyBmbG93IG9mIHJvd3MsIGluIHRoZSBkaXNwbGF5IHRyZWUgdGhleSBhcmUgcmVsYXRpdmUg
dG8gdGhlaXIgc2VjdGlvbnMuCisgICAgICAgICAgICBzZWN0aW9uT2Zmc2V0ID0gcm93TGlzdFtj
ZWxsLT5zdGFydFJvdygpXS5sb2dpY2FsVG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgY2VsbEJv
eEdlb21ldHJ5LnNldExvZ2ljYWxUb3Aocm93TGlzdFtjZWxsLT5zdGFydFJvdygpXS5sb2dpY2Fs
VG9wKCkgLSBzZWN0aW9uT2Zmc2V0KTsKKyAgICAgICAgY2VsbEJveEdlb21ldHJ5LnNldExvZ2lj
YWxMZWZ0KGNvbHVtbkxpc3RbY2VsbC0+c3RhcnRDb2x1bW4oKV0ubG9naWNhbExlZnQoKSk7Cisg
ICAgICAgIGF1dG8gYXZhaWxhYmxlVmVydGljYWxTcGFjZSA9IHJvd0xpc3RbY2VsbC0+c3RhcnRS
b3coKV0ubG9naWNhbEhlaWdodCgpOworICAgICAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IGNl
bGwtPnN0YXJ0Um93KCkgKyAxOyByb3dJbmRleCA8IGNlbGwtPmVuZFJvdygpOyArK3Jvd0luZGV4
KQorICAgICAgICAgICAgYXZhaWxhYmxlVmVydGljYWxTcGFjZSArPSByb3dMaXN0W3Jvd0luZGV4
XS5sb2dpY2FsSGVpZ2h0KCk7CisgICAgICAgIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UgKz0gKGNl
bGwtPnJvd1NwYW4oKSAtIDEpICogZ3JpZC52ZXJ0aWNhbFNwYWNpbmcoKTsKKyAgICAgICAgbGF5
b3V0Q2VsbCgqY2VsbCwgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBhdmFpbGFibGVWZXJ0aWNh
bFNwYWNlKTsKKyAgICAgICAgLy8gRklYTUU6IEZpbmQgb3V0IGlmIGl0IGlzIG9rIHRvIHVzZSB0
aGUgcmVndWxhciBwYWRkaW5nIGhlcmUgdG8gYWxpZ24gdGhlIGNvbnRlbnQgYm94IGluc2lkZSBh
IHRhbGwgY2VsbCBvciB3ZSBuZWVkIHRvIAorICAgICAgICAvLyB1c2Ugc29tZSBraW5kIG9mIGlu
dHJpbnNpYyBwYWRkaW5nIHNpbWlsYXIgdG8gUmVuZGVyVGFibGVDZWxsLgorICAgICAgICBhdXRv
IHBhZGRpbmdUb3AgPSBjZWxsQm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoTGF5b3V0
VW5pdCB7IH0pOworICAgICAgICBhdXRvIHBhZGRpbmdCb3R0b20gPSBjZWxsQm94R2VvbWV0cnku
cGFkZGluZ0JvdHRvbSgpLnZhbHVlT3IoTGF5b3V0VW5pdCB7IH0pOworICAgICAgICBhdXRvIGlu
dHJpbnNpY1BhZGRpbmdUb3AgPSBMYXlvdXRVbml0IHsgfTsKKyAgICAgICAgYXV0byBpbnRyaW5z
aWNQYWRkaW5nQm90dG9tID0gTGF5b3V0VW5pdCB7IH07CisKKyAgICAgICAgc3dpdGNoIChjZWxs
Qm94LnN0eWxlKCkudmVydGljYWxBbGlnbigpKSB7CisgICAgICAgIGNhc2UgVmVydGljYWxBbGln
bjo6TWlkZGxlOiB7CisgICAgICAgICAgICBhdXRvIGludHJpbnNpY1ZlcnRpY2FsUGFkZGluZyA9
IHN0ZDo6bWF4KDBfbHUsIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UgLSBjZWxsQm94R2VvbWV0cnku
dmVydGljYWxNYXJnaW5Cb3JkZXJBbmRQYWRkaW5nKCkgLSBjZWxsQm94R2VvbWV0cnkuY29udGVu
dEJveEhlaWdodCgpKTsKKyAgICAgICAgICAgIGludHJpbnNpY1BhZGRpbmdUb3AgPSBpbnRyaW5z
aWNWZXJ0aWNhbFBhZGRpbmcgLyAyOworICAgICAgICAgICAgaW50cmluc2ljUGFkZGluZ0JvdHRv
bSA9IGludHJpbnNpY1ZlcnRpY2FsUGFkZGluZyAvIDI7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lOiB7CisgICAgICAg
ICAgICBhdXRvIHJvd0Jhc2VsaW5lID0gTGF5b3V0VW5pdCB7IHJvd0xpc3RbY2VsbC0+c3RhcnRS
b3coKV0uYmFzZWxpbmUoKSB9OworICAgICAgICAgICAgYXV0byBjZWxsQmFzZWxpbmUgPSBMYXlv
dXRVbml0IHsgY2VsbC0+YmFzZWxpbmUoKSB9OworICAgICAgICAgICAgaW50cmluc2ljUGFkZGlu
Z1RvcCA9IHN0ZDo6bWF4KDBfbHUsIHJvd0Jhc2VsaW5lIC0gY2VsbEJhc2VsaW5lIC0gY2VsbEJv
eEdlb21ldHJ5LmJvcmRlclRvcCgpKTsKKyAgICAgICAgICAgIGludHJpbnNpY1BhZGRpbmdCb3R0
b20gPSBzdGQ6Om1heCgwX2x1LCBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlIC0gY2VsbEJveEdlb21l
dHJ5LnZlcnRpY2FsTWFyZ2luQm9yZGVyQW5kUGFkZGluZygpIC0gaW50cmluc2ljUGFkZGluZ1Rv
cCAtIGNlbGxCb3hHZW9tZXRyeS5jb250ZW50Qm94SGVpZ2h0KCkpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1Rf
SU1QTEVNRU5URURfWUVUKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAg
ICBpZiAoaW50cmluc2ljUGFkZGluZ1RvcCAmJiBjZWxsQm94Lmhhc0luRmxvd09yRmxvYXRpbmdD
aGlsZCgpKSB7CisgICAgICAgICAgICBhdXRvIGFkanVzdENlbGxDb250ZW50V2l0aEluc3RyaW5z
aWNQYWRkaW5nQmVmb3JlID0gWyZdIHsKKyAgICAgICAgICAgICAgICAvLyBDaGlsZCBib3hlcyAo
YW5kIHJ1bnMpIGFyZSBhbHdheXMgaW4gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBjb250
YWluaW5nIGJsb2NrJ3MgYm9yZGVyIGJveC4KKyAgICAgICAgICAgICAgICAvLyBUaGUgY29udGVu
dCBib3ggKHdoZXJlIHRoZSBjaGlsZCBjb250ZW50IGxpdmVzKSBpcyBpbnNpZGUgdGhlIHBhZGRp
bmcgYm94LCB3aGljaCBpcyBpbnNpZGUgdGhlIGJvcmRlciBib3guCisgICAgICAgICAgICAgICAg
Ly8gSW4gb3JkZXIgdG8gY29tcHV0ZSB0aGUgY2hpbGQgYm94IHRvcC9sZWZ0IHBvc2l0aW9uLCB3
ZSBuZWVkIHRvIGtub3cgYm90aCB0aGUgcGFkZGluZyBhbmQgdGhlIGJvcmRlciBvZmZzZXRzLiAg
CisgICAgICAgICAgICAgICAgLy8gTm9ybWFsbHkgYnkgdGhlIHRpbWUgd2Ugc3RhcnQgcG9zaXRp
b25pbmcgdGhlIGNoaWxkIGNvbnRlbnQsIHdlIGFscmVhZHkgaGF2ZSBjb21wdXRlZCBib3JkZXJz
IGFuZCBwYWRkaW5nIGZvciB0aGUgY29udGFpbmluZyBibG9jay4KKyAgICAgICAgICAgICAgICAv
LyBUaGlzIGlzIGRpZmZlcmVudCB3aXRoIHRhYmxlIGNlbGxzIHdoZXJlIHRoZSBmaW5hbCBwYWRk
aW5nIG9mZnNldCBkZXBlbmRzIG9uIHRoZSBjb250ZW50IGhlaWdodCBhcyB3ZSB1c2UKKyAgICAg
ICAgICAgICAgICAvLyB0aGUgcGFkZGluZyBib3ggdG8gdmVydGljYWxseSBhbGlnbiB0aGUgdGFi
bGUgY2VsbCBjb250ZW50LgorICAgICAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9
IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRGb3JtYXR0aW5nU3RhdGUoY2VsbEJveCk7CisgICAg
ICAgICAgICAgICAgZm9yIChhdXRvKiBjaGlsZCA9IGNlbGxCb3guZmlyc3RJbkZsb3dPckZsb2F0
aW5nQ2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRJbkZsb3dPckZsb2F0aW5nU2li
bGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNJbmxpbmVUZXh0Qm94
KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAg
ICAgZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KCpjaGlsZCkubW92ZVZlcnRpY2FsbHkoaW50
cmluc2ljUGFkZGluZ1RvcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlm
IChjZWxsQm94LmVzdGFibGlzaGVzSW5saW5lRm9ybWF0dGluZ0NvbnRleHQoKSkgeworICAgICAg
ICAgICAgICAgICAgICBhdXRvJiBpbmxpbmVGb3JtYXR0aW5nU3RhdGVlID0gbGF5b3V0U3RhdGUo
KS5lc3RhYmxpc2hlZElubGluZUZvcm1hdHRpbmdTdGF0ZShjZWxsQm94KTsKKyAgICAgICAgICAg
ICAgICAgICAgZm9yIChhdXRvJiBydW4gOiBpbmxpbmVGb3JtYXR0aW5nU3RhdGVlLmxpbmVSdW5z
KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBydW4ubW92ZVZlcnRpY2FsbHkoaW50cmluc2lj
UGFkZGluZ1RvcCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byYgbGluZSA6IGlubGlu
ZUZvcm1hdHRpbmdTdGF0ZWUubGluZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUu
bW92ZVZlcnRpY2FsbHkoaW50cmluc2ljUGFkZGluZ1RvcCk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGFkanVzdENlbGxDb250ZW50V2l0aEluc3RyaW5z
aWNQYWRkaW5nQmVmb3JlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2VsbEJveEdlb21ldHJ5LnNl
dFZlcnRpY2FsUGFkZGluZyh7IHBhZGRpbmdUb3AgKyBpbnRyaW5zaWNQYWRkaW5nVG9wLCBwYWRk
aW5nQm90dG9tICsgaW50cmluc2ljUGFkZGluZ0JvdHRvbSB9KTsKKyAgICB9Cit9CisKK3ZvaWQg
VGFibGVGb3JtYXR0aW5nQ29udGV4dDo6c2V0VXNlZEdlb21ldHJ5Rm9yUm93cyhMYXlvdXRVbml0
IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSkKK3sKKyAgICBhdXRvJiBncmlkID0gZm9ybWF0dGlu
Z1N0YXRlKCkudGFibGVHcmlkKCk7CisgICAgYXV0byYgcm93cyA9IGdyaWQucm93cygpLmxpc3Qo
KTsKKworICAgIGF1dG8gcm93TG9naWNhbFRvcCA9IGdyaWQudmVydGljYWxTcGFjaW5nKCk7Cisg
ICAgY29uc3QgQ29udGFpbmVyQm94KiBwcmV2aW91c1JvdyA9IG51bGxwdHI7CisgICAgZm9yIChz
aXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7
CisgICAgICAgIGF1dG8mIHJvdyA9IHJvd3Nbcm93SW5kZXhdOworICAgICAgICBhdXRvJiByb3dC
b3ggPSByb3cuYm94KCk7CisgICAgICAgIGF1dG8mIHJvd0JveEdlb21ldHJ5ID0gZm9ybWF0dGlu
Z1N0YXRlKCkuYm94R2VvbWV0cnkocm93Qm94KTsKKworICAgICAgICByb3dCb3hHZW9tZXRyeS5z
ZXRQYWRkaW5nKGdlb21ldHJ5KCkuY29tcHV0ZWRQYWRkaW5nKHJvd0JveCwgYXZhaWxhYmxlSG9y
aXpvbnRhbFNwYWNlKSk7CisgICAgICAgIC8vIEludGVybmFsIHRhYmxlIGVsZW1lbnRzIGRvIG5v
dCBoYXZlIG1hcmdpbnMuCisgICAgICAgIHJvd0JveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJn
aW4oeyB9KTsKKyAgICAgICAgcm93Qm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyB9KTsK
KworICAgICAgICBhdXRvIGNvbXB1dGVkUm93Qm9yZGVyID0gWyZdIHsKKyAgICAgICAgICAgIGF1
dG8gYm9yZGVyID0gZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihyb3dCb3gpOworICAgICAgICAg
ICAgaWYgKCFncmlkLmNvbGxhcHNlZEJvcmRlcigpKQorICAgICAgICAgICAgICAgIHJldHVybiBi
b3JkZXI7CisgICAgICAgICAgICAvLyBCb3JkZXIgY29sbGFwc2luZyBkZWxlZ2F0ZXMgYm9yZGVy
cyB0byB0YWJsZS9jZWxscy4KKyAgICAgICAgICAgIGJvcmRlci5ob3Jpem9udGFsID0geyB9Owor
ICAgICAgICAgICAgaWYgKCFyb3dJbmRleCkKKyAgICAgICAgICAgICAgICBib3JkZXIudmVydGlj
YWwudG9wID0geyB9OworICAgICAgICAgICAgaWYgKHJvd0luZGV4ID09IHJvd3Muc2l6ZSgpIC0g
MSkKKyAgICAgICAgICAgICAgICBib3JkZXIudmVydGljYWwuYm90dG9tID0geyB9OworICAgICAg
ICAgICAgcmV0dXJuIGJvcmRlcjsKKyAgICAgICAgfSgpOworICAgICAgICBpZiAoY29tcHV0ZWRS
b3dCb3JkZXIuaGVpZ2h0KCkgPiByb3cubG9naWNhbEhlaWdodCgpKSB7CisgICAgICAgICAgICAv
LyBGSVhNRTogVGhpcyBpcyBhbiBvZGQgcXVpcmsgd2hlbiB0aGUgcm93IGJvcmRlciBvdmVyZmxv
d3MgdGhlIHJvdy4KKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHBhaW50IHJvdyBib3JkZXJzIHNv
IGl0IGRvZXMgbm90IG1hdHRlciB0b28gbXVjaCwgYnV0IGlmIHdlIGRvbid0CisgICAgICAgICAg
ICAvLyBzZXQgdGhpcyBmYWtlIGJvcmRlciB2YWx1ZSwgdGhhbiB3ZSBlaXRoZXIgZW5kIHVwIHdp
dGggYSBuZWdhdGl2ZSBjb250ZW50IGJveAorICAgICAgICAgICAgLy8gb3Igd2l0aCBhIHdpZGUg
ZnJhbWUgYm94LgorICAgICAgICAgICAgLy8gSWYgaXQgaGFwcGVucyB0byBjYXVzZSBpc3N1ZXMg
aW4gdGhlIGRpc3BsYXkgdHJlZSwgd2UgY291bGQgYWxzbyBjb25zaWRlcgorICAgICAgICAgICAg
Ly8gYSBzcGVjaWFsIGZyYW1lIGJveCBvdmVycmlkZSwgd2hlcmUgcGFkZGluZyBib3ggKyBib3Jk
ZXIgIT0gZnJhbWUgYm94LgorICAgICAgICAgICAgY29tcHV0ZWRSb3dCb3JkZXIudmVydGljYWwu
dG9wID0geyB9OworICAgICAgICAgICAgY29tcHV0ZWRSb3dCb3JkZXIudmVydGljYWwuYm90dG9t
ID0geyB9OworICAgICAgICB9CisgICAgICAgIHJvd0JveEdlb21ldHJ5LnNldENvbnRlbnRCb3hI
ZWlnaHQocm93LmxvZ2ljYWxIZWlnaHQoKSAtIGNvbXB1dGVkUm93Qm9yZGVyLmhlaWdodCgpKTsK
KworICAgICAgICBhdXRvIHJvd0xvZ2ljYWxXaWR0aCA9IGdyaWQuY29sdW1ucygpLmxvZ2ljYWxX
aWR0aCgpICsgMiAqIGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKKyAgICAgICAgaWYgKGNvbXB1
dGVkUm93Qm9yZGVyLndpZHRoKCkgPiByb3dMb2dpY2FsV2lkdGgpIHsKKyAgICAgICAgICAgIC8v
IFNlZSBjb21tZW50IGFib3ZlLgorICAgICAgICAgICAgY29tcHV0ZWRSb3dCb3JkZXIuaG9yaXpv
bnRhbC5sZWZ0ID0geyB9OworICAgICAgICAgICAgY29tcHV0ZWRSb3dCb3JkZXIuaG9yaXpvbnRh
bC5yaWdodCA9IHsgfTsKKyAgICAgICAgfQorICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRDb250
ZW50Qm94V2lkdGgocm93TG9naWNhbFdpZHRoIC0gY29tcHV0ZWRSb3dCb3JkZXIud2lkdGgoKSk7
CisgICAgICAgIHJvd0JveEdlb21ldHJ5LnNldEJvcmRlcihjb21wdXRlZFJvd0JvcmRlcik7CisK
KyAgICAgICAgaWYgKHByZXZpb3VzUm93ICYmICZwcmV2aW91c1Jvdy0+cGFyZW50KCkgIT0gJnJv
d0JveC5wYXJlbnQoKSkgeworICAgICAgICAgICAgLy8gVGhpcyByb3cgaXMgaW4gYSBkaWZmZXJl
bnQgc2VjdGlvbi4KKyAgICAgICAgICAgIHJvd0xvZ2ljYWxUb3AgPSB7IH07CisgICAgICAgIH0K
KyAgICAgICAgcm93Qm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcChyb3dMb2dpY2FsVG9wKTsKKyAg
ICAgICAgcm93Qm94R2VvbWV0cnkuc2V0TG9naWNhbExlZnQoeyB9KTsKKworICAgICAgICByb3dM
b2dpY2FsVG9wICs9IHJvdy5sb2dpY2FsSGVpZ2h0KCkgKyBncmlkLnZlcnRpY2FsU3BhY2luZygp
OworICAgICAgICBwcmV2aW91c1JvdyA9ICZyb3dCb3g7CisgICAgfQorCisgICAgYXV0byYgY29s
dW1ucyA9IGdyaWQuY29sdW1ucygpOworICAgIFZlY3RvcjxJbmxpbmVMYXlvdXRVbml0PiByb3dC
YXNlbGluZXMocm93cy5zaXplKCksIDApOworICAgIC8vIE5vdyB0aGF0IGNlbGxzIGFyZSBsYWlk
IG91dCwgbGV0J3MgY29tcHV0ZSB0aGUgcm93IGJhc2VsaW5lcy4KKyAgICBmb3IgKHNpemVfdCBy
b3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAgICAg
ICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IGNvbHVtbnMuc2l6
ZSgpOyArK2NvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBhdXRvJiBzbG90ID0gKmdyaWQuc2xv
dCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsKKyAgICAgICAgICAgIGlmIChzbG90LmlzUm93
U3Bhbm5lZCgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHNs
b3QuaGFzUm93U3BhbigpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
YXV0byYgY2VsbCA9IHNsb3QuY2VsbCgpOworICAgICAgICAgICAgcm93QmFzZWxpbmVzW3Jvd0lu
ZGV4XSA9IHN0ZDo6bWF4KHJvd0Jhc2VsaW5lc1tyb3dJbmRleF0sIGNlbGwuYmFzZWxpbmUoKSk7
CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRl
eCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KQorICAgICAgICByb3dzW3Jvd0luZGV4XS5zZXRC
YXNlbGluZShyb3dCYXNlbGluZXNbcm93SW5kZXhdKTsKK30KKwordm9pZCBUYWJsZUZvcm1hdHRp
bmdDb250ZXh0OjpzZXRVc2VkR2VvbWV0cnlGb3JTZWN0aW9ucyhjb25zdCBDb25zdHJhaW50c0Zv
ckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAgIGF1dG8mIGdyaWQgPSBmb3JtYXR0
aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsKKyAgICBhdXRvJiB0YWJsZUJveCA9IHJvb3QoKTsKKyAg
ICBhdXRvIHNlY3Rpb25XaWR0aCA9IGdyaWQuY29sdW1ucygpLmxvZ2ljYWxXaWR0aCgpICsgMiAq
IGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKKyAgICBhdXRvIGxvZ2ljYWxUb3AgPSBjb25zdHJh
aW50cy52ZXJ0aWNhbC5sb2dpY2FsVG9wOworICAgIGF1dG8gdmVydGljYWxTcGFjaW5nID0gZ3Jp
ZC52ZXJ0aWNhbFNwYWNpbmcoKTsKKyAgICBhdXRvIHBhZGRpbmdCZWZvcmUgPSBPcHRpb25hbDxM
YXlvdXRVbml0PiB7IHZlcnRpY2FsU3BhY2luZyB9OworICAgIGF1dG8gcGFkZGluZ0FmdGVyID0g
dmVydGljYWxTcGFjaW5nOworICAgIGZvciAoYXV0byYgc2VjdGlvbkJveCA6IGNoaWxkcmVuT2ZU
eXBlPENvbnRhaW5lckJveD4odGFibGVCb3gpKSB7CisgICAgICAgIGF1dG8mIHNlY3Rpb25Cb3hH
ZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KHNlY3Rpb25Cb3gpOworICAg
ICAgICAvLyBTZWN0aW9uIGJvcmRlcnMgYXJlIGVpdGhlciBjb2xsYXBzZWQgb3IgaWdub3JlZC4K
KyAgICAgICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldEJvcmRlcih7IH0pOworICAgICAgICAvLyBV
c2UgZmFrZSB2ZXJ0aWNhbCBwYWRkaW5nIHRvIHNwYWNlIG91dCB0aGUgc2VjdGlvbnMuCisgICAg
ICAgIHNlY3Rpb25Cb3hHZW9tZXRyeS5zZXRQYWRkaW5nKEVkZ2VzIHsgeyB9LCB7IHBhZGRpbmdC
ZWZvcmUudmFsdWVPcigwX2x1KSwgcGFkZGluZ0FmdGVyIH0gfSk7CisgICAgICAgIHBhZGRpbmdC
ZWZvcmUgPSBXVEY6Om51bGxvcHQ7CisgICAgICAgIC8vIEludGVybmFsIHRhYmxlIGVsZW1lbnRz
IGRvIG5vdCBoYXZlIG1hcmdpbnMuCisgICAgICAgIHNlY3Rpb25Cb3hHZW9tZXRyeS5zZXRIb3Jp
em9udGFsTWFyZ2luKHsgfSk7CisgICAgICAgIHNlY3Rpb25Cb3hHZW9tZXRyeS5zZXRWZXJ0aWNh
bE1hcmdpbih7IH0pOworCisgICAgICAgIHNlY3Rpb25Cb3hHZW9tZXRyeS5zZXRDb250ZW50Qm94
V2lkdGgoc2VjdGlvbldpZHRoKTsKKyAgICAgICAgYXV0byBzZWN0aW9uQ29udGVudEhlaWdodCA9
IExheW91dFVuaXQgeyB9OworICAgICAgICBzaXplX3Qgcm93Q291bnQgPSAwOworICAgICAgICBm
b3IgKGF1dG8mIHJvd0JveCA6IGNoaWxkcmVuT2ZUeXBlPENvbnRhaW5lckJveD4oc2VjdGlvbkJv
eCkpIHsKKyAgICAgICAgICAgIHNlY3Rpb25Db250ZW50SGVpZ2h0ICs9IGdlb21ldHJ5Rm9yQm94
KHJvd0JveCkuYm9yZGVyQm94SGVpZ2h0KCk7CisgICAgICAgICAgICArK3Jvd0NvdW50OworICAg
ICAgICB9CisgICAgICAgIHNlY3Rpb25Db250ZW50SGVpZ2h0ICs9IHZlcnRpY2FsU3BhY2luZyAq
IChyb3dDb3VudCAtIDEpOworICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0Q29udGVudEJv
eEhlaWdodChzZWN0aW9uQ29udGVudEhlaWdodCk7CisgICAgICAgIHNlY3Rpb25Cb3hHZW9tZXRy
eS5zZXRMb2dpY2FsTGVmdChjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxMZWZ0KTsKKyAg
ICAgICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3AobG9naWNhbFRvcCk7CisKKyAg
ICAgICAgbG9naWNhbFRvcCArPSBzZWN0aW9uQm94R2VvbWV0cnkuYm9yZGVyQm94SGVpZ2h0KCk7
CisgICAgfQorfQorCit2b2lkIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dENlbGwoY29u
c3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsLCBMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxT
cGFjZSwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZENlbGxIZWlnaHQpCit7CisgICAgQVNTRVJU
KGNlbGwuYm94KCkuZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCkpOworCisgICAg
YXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpOworICAgIGF1dG8mIGNl
bGxCb3ggPSBjZWxsLmJveCgpOworICAgIGF1dG8mIGNlbGxCb3hHZW9tZXRyeSA9IGZvcm1hdHRp
bmdTdGF0ZSgpLmJveEdlb21ldHJ5KGNlbGxCb3gpOworCisgICAgY2VsbEJveEdlb21ldHJ5LnNl
dEJvcmRlcihnZW9tZXRyeSgpLmNvbXB1dGVkQ2VsbEJvcmRlcihjZWxsKSk7CisgICAgY2VsbEJv
eEdlb21ldHJ5LnNldFBhZGRpbmcoZ2VvbWV0cnkoKS5jb21wdXRlZFBhZGRpbmcoY2VsbEJveCwg
YXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKSk7CisgICAgLy8gSW50ZXJuYWwgdGFibGUgZWxlbWVu
dHMgZG8gbm90IGhhdmUgbWFyZ2lucy4KKyAgICBjZWxsQm94R2VvbWV0cnkuc2V0SG9yaXpvbnRh
bE1hcmdpbih7IH0pOworICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IH0p
OworCisgICAgYXV0byBhdmFpbGFibGVTcGFjZUZvckNvbnRlbnQgPSBbJl0geworICAgICAgICBh
dXRvJiBjb2x1bW5MaXN0ID0gZ3JpZC5jb2x1bW5zKCkubGlzdCgpOworICAgICAgICBhdXRvIGxv
Z2ljYWxXaWR0aCA9IExheW91dFVuaXQgeyB9OworICAgICAgICBmb3IgKGF1dG8gY29sdW1uSW5k
ZXggPSBjZWxsLnN0YXJ0Q29sdW1uKCk7IGNvbHVtbkluZGV4IDwgY2VsbC5lbmRDb2x1bW4oKTsg
Kytjb2x1bW5JbmRleCkKKyAgICAgICAgICAgIGxvZ2ljYWxXaWR0aCArPSBjb2x1bW5MaXN0LmF0
KGNvbHVtbkluZGV4KS5sb2dpY2FsV2lkdGgoKTsKKyAgICAgICAgLy8gTm8gY29sdW1uIHNwYWNp
bmcgd2hlbiBzcGFubmluZy4KKyAgICAgICAgbG9naWNhbFdpZHRoICs9IChjZWxsLmNvbHVtblNw
YW4oKSAtIDEpICogZ3JpZC5ob3Jpem9udGFsU3BhY2luZygpOworICAgICAgICByZXR1cm4gbG9n
aWNhbFdpZHRoIC0gY2VsbEJveEdlb21ldHJ5Lmhvcml6b250YWxNYXJnaW5Cb3JkZXJBbmRQYWRk
aW5nKCk7CisgICAgfSgpOworICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgo
YXZhaWxhYmxlU3BhY2VGb3JDb250ZW50KTsKKworICAgIGlmIChjZWxsQm94Lmhhc0luRmxvd09y
RmxvYXRpbmdDaGlsZCgpKSB7CisgICAgICAgIGF1dG8gY29uc3RyYWludHNGb3JDZWxsQ29udGVu
dCA9IGdlb21ldHJ5KCkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KGNlbGxCb3gpOworICAg
ICAgICBjb25zdHJhaW50c0ZvckNlbGxDb250ZW50LnZlcnRpY2FsLmxvZ2ljYWxIZWlnaHQgPSB1
c2VkQ2VsbEhlaWdodDsKKyAgICAgICAgYXV0byBpbnZhbGlkYXRpb25TdGF0ZSA9IEludmFsaWRh
dGlvblN0YXRlIHsgfTsKKyAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHByb2JhYmx5IGJl
IHBhcnQgb2YgdGhlIGludmFsaWRhdGlvbiBzdGF0ZSB0byBpbmRpY2F0ZSB3aGVuIHdlIHJlLWxh
eW91dCB0aGUgY2VsbAorICAgICAgICAvLyBtdWx0aXBsZSB0aW1lcyBhcyBwYXJ0IG9mIHRoZSBt
dWx0aS1wYXNzIHRhYmxlIGFsZ29yaXRobS4KKyAgICAgICAgYXV0byYgZmxvYXRpbmdTdGF0ZUZv
ckNlbGxDb250ZW50ID0gbGF5b3V0U3RhdGUoKS5lbnN1cmVCbG9ja0Zvcm1hdHRpbmdTdGF0ZShj
ZWxsQm94KS5mbG9hdGluZ1N0YXRlKCk7CisgICAgICAgIGZsb2F0aW5nU3RhdGVGb3JDZWxsQ29u
dGVudC5jbGVhcigpOworICAgICAgICBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29u
dGV4dChjZWxsQm94LCBsYXlvdXRTdGF0ZSgpKS0+bGF5b3V0SW5GbG93Q29udGVudChpbnZhbGlk
YXRpb25TdGF0ZSwgY29uc3RyYWludHNGb3JDZWxsQ29udGVudCk7CisgICAgfQorICAgIGNlbGxC
b3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGdlb21ldHJ5KCkuY2VsbEhlaWdoKGNlbGxC
b3gpKTsKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMg
VGFibGVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
KCkKK3sKKyAgICBBU1NFUlQoIXJvb3QoKS5pc1NpemVDb250YWlubWVudEJveCgpKTsKKyAgICAv
LyBUYWJsZXMgaGF2ZSBhIHNsaWdodHkgZGlmZmVyZW50IGNvbmNlcHQgb2Ygc2hyaW5rIHRvIGZp
dC4gSXQncyByZWFsbHkgb25seSBkaWZmZXJlbnQgd2l0aCBub24tYXV0byAid2lkdGgiIHZhbHVl
cywgd2hlcmUKKyAgICAvLyBhIGdlbmVyaWMgc2hyaW5rLXRvIGZpdCBibG9jayBsZXZlbCBib3gg
bGlrZSBhIGZsb2F0IGJveCB3b3VsZCBiZSBqdXN0IHNpemVkIHRvIHRoZSBjb21wdXRlZCB2YWx1
ZSBvZiAid2lkdGgiLCB0YWJsZXMKKyAgICAvLyBjYW4gYWN0dWFsbHkgYmUgc3RyZWNoZWQgd2F5
IG92ZXIuCisgICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpOwor
ICAgIGlmIChhdXRvIGNvbXB1dGVkV2lkdGhDb25zdHJhaW50cyA9IGdyaWQud2lkdGhDb25zdHJh
aW50cygpKQorICAgICAgICByZXR1cm4gKmNvbXB1dGVkV2lkdGhDb25zdHJhaW50czsKKworICAg
IC8vIENvbXB1dGUgdGhlIG1pbmltdW0vbWF4aW11bSB3aWR0aCBvZiBlYWNoIGNvbHVtbi4KKyAg
ICBhdXRvIGNvbXB1dGVkV2lkdGhDb25zdHJhaW50cyA9IGNvbXB1dGVkUHJlZmVycmVkV2lkdGhG
b3JDb2x1bW5zKCk7CisgICAgZ3JpZC5zZXRXaWR0aENvbnN0cmFpbnRzKGNvbXB1dGVkV2lkdGhD
b25zdHJhaW50cyk7CisgICAgcmV0dXJuIGNvbXB1dGVkV2lkdGhDb25zdHJhaW50czsKK30KKwor
VW5pcXVlUmVmPFRhYmxlR3JpZD4gVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6ZW5zdXJlVGFibGVH
cmlkKGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gpCit7CisgICAgYXV0byB0YWJsZUdyaWQg
PSBtYWtlVW5pcXVlUmVmPFRhYmxlR3JpZD4oKTsKKyAgICBhdXRvJiB0YWJsZVN0eWxlID0gdGFi
bGVCb3guc3R5bGUoKTsKKyAgICBhdXRvIHNob3VsZEFwcGx5Qm9yZGVyU3BhY2luZyA9IHRhYmxl
U3R5bGUuYm9yZGVyQ29sbGFwc2UoKSA9PSBCb3JkZXJDb2xsYXBzZTo6U2VwYXJhdGU7CisgICAg
dGFibGVHcmlkLT5zZXRIb3Jpem9udGFsU3BhY2luZyhMYXlvdXRVbml0IHsgc2hvdWxkQXBwbHlC
b3JkZXJTcGFjaW5nID8gdGFibGVTdHlsZS5ob3Jpem9udGFsQm9yZGVyU3BhY2luZygpIDogMCB9
KTsKKyAgICB0YWJsZUdyaWQtPnNldFZlcnRpY2FsU3BhY2luZyhMYXlvdXRVbml0IHsgc2hvdWxk
QXBwbHlCb3JkZXJTcGFjaW5nID8gdGFibGVTdHlsZS52ZXJ0aWNhbEJvcmRlclNwYWNpbmcoKSA6
IDAgfSk7CisKKyAgICBhdXRvKiBmaXJzdENoaWxkID0gdGFibGVCb3guZmlyc3RDaGlsZCgpOwor
ICAgIGlmICghZmlyc3RDaGlsZCkgeworICAgICAgICAvLyBUaGUgcmFyZSBjYXNlIG9mIGVtcHR5
IHRhYmxlLgorICAgICAgICByZXR1cm4gdGFibGVHcmlkOworICAgIH0KKworICAgIGNvbnN0IEJv
eCogdGFibGVDYXB0aW9uID0gbnVsbHB0cjsKKyAgICBjb25zdCBCb3gqIGNvbGdyb3VwID0gbnVs
bHB0cjsKKyAgICAvLyBUYWJsZSBjYXB0aW9uIGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQ7IGlmIHVz
ZWQsIGl0IGlzIGFsd2F5cyB0aGUgZmlyc3QgY2hpbGQgb2YgYSA8dGFibGU+LgorICAgIGlmIChm
aXJzdENoaWxkLT5pc1RhYmxlQ2FwdGlvbigpKQorICAgICAgICB0YWJsZUNhcHRpb24gPSBmaXJz
dENoaWxkOworICAgIC8vIFRoZSA8Y29sZ3JvdXA+IG11c3QgYXBwZWFyIGFmdGVyIGFueSBvcHRp
b25hbCA8Y2FwdGlvbj4gZWxlbWVudCBidXQgYmVmb3JlIGFueSA8dGhlYWQ+LCA8dGg+LCA8dGJv
ZHk+LCA8dGZvb3Q+IGFuZCA8dHI+IGVsZW1lbnQuCisgICAgYXV0byogY29sZ3JvdXBDYW5kaWRh
dGUgPSBmaXJzdENoaWxkOworICAgIGlmICh0YWJsZUNhcHRpb24pCisgICAgICAgIGNvbGdyb3Vw
Q2FuZGlkYXRlID0gdGFibGVDYXB0aW9uLT5uZXh0U2libGluZygpOworICAgIGlmIChjb2xncm91
cENhbmRpZGF0ZS0+aXNUYWJsZUNvbHVtbkdyb3VwKCkpCisgICAgICAgIGNvbGdyb3VwID0gY29s
Z3JvdXBDYW5kaWRhdGU7CisKKyAgICBpZiAoY29sZ3JvdXApIHsKKyAgICAgICAgYXV0byYgY29s
dW1ucyA9IHRhYmxlR3JpZC0+Y29sdW1ucygpOworICAgICAgICBmb3IgKGF1dG8qIGNvbHVtbiA9
IGRvd25jYXN0PENvbnRhaW5lckJveD4oKmNvbGdyb3VwKS5maXJzdENoaWxkKCk7IGNvbHVtbjsg
Y29sdW1uID0gY29sdW1uLT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICBBU1NFUlQoY29s
dW1uLT5pc1RhYmxlQ29sdW1uKCkpOworICAgICAgICAgICAgYXV0byBjb2x1bW5TcGFuQ291bnQg
PSBjb2x1bW4tPmNvbHVtblNwYW4oKTsKKyAgICAgICAgICAgIEFTU0VSVChjb2x1bW5TcGFuQ291
bnQgPiAwKTsKKyAgICAgICAgICAgIHdoaWxlIChjb2x1bW5TcGFuQ291bnQtLSkKKyAgICAgICAg
ICAgICAgICBjb2x1bW5zLmFkZENvbHVtbihkb3duY2FzdDxDb250YWluZXJCb3g+KCpjb2x1bW4p
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8qIGZpcnN0U2VjdGlvbiA9IGNvbGdyb3Vw
ID8gY29sZ3JvdXAtPm5leHRTaWJsaW5nKCkgOiB0YWJsZUNhcHRpb24gPyB0YWJsZUNhcHRpb24t
Pm5leHRTaWJsaW5nKCkgOiBmaXJzdENoaWxkOworICAgIGZvciAoYXV0byogc2VjdGlvbiA9IGZp
cnN0U2VjdGlvbjsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHRTaWJsaW5nKCkpIHsK
KyAgICAgICAgQVNTRVJUKHNlY3Rpb24tPmlzVGFibGVIZWFkZXIoKSB8fCBzZWN0aW9uLT5pc1Rh
YmxlQm9keSgpIHx8IHNlY3Rpb24tPmlzVGFibGVGb290ZXIoKSk7CisgICAgICAgIGZvciAoYXV0
byogcm93ID0gZG93bmNhc3Q8Q29udGFpbmVyQm94Pigqc2VjdGlvbikuZmlyc3RDaGlsZCgpOyBy
b3c7IHJvdyA9IHJvdy0+bmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgQVNTRVJUKHJvdy0+
aXNUYWJsZVJvdygpKTsKKyAgICAgICAgICAgIGZvciAoYXV0byogY2VsbCA9IGRvd25jYXN0PENv
bnRhaW5lckJveD4oKnJvdykuZmlyc3RDaGlsZCgpOyBjZWxsOyBjZWxsID0gY2VsbC0+bmV4dFNp
YmxpbmcoKSkgeworICAgICAgICAgICAgICAgIEFTU0VSVChjZWxsLT5pc1RhYmxlQ2VsbCgpKTsK
KyAgICAgICAgICAgICAgICB0YWJsZUdyaWQtPmFwcGVuZENlbGwoZG93bmNhc3Q8Q29udGFpbmVy
Qm94PigqY2VsbCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVy
biB0YWJsZUdyaWQ7Cit9CisKK0Zvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkUHJlZmVycmVkV2lkdGhGb3JD
b2x1bW5zKCkKK3sKKyAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5n
U3RhdGUoKTsKKyAgICBhdXRvJiBncmlkID0gZm9ybWF0dGluZ1N0YXRlLnRhYmxlR3JpZCgpOwor
ICAgIEFTU0VSVCghZ3JpZC53aWR0aENvbnN0cmFpbnRzKCkpOworCisgICAgLy8gQ29sdW1uIHBy
ZWZlcnJlZCB3aWR0aCBjb21wdXRhdGlvbiBhcyBmb2xsb3dzOgorICAgIC8vIDEuIENvbGxlY3Qg
ZWFjaCBjZWxscycgd2lkdGggY29uc3RyYWludHMKKyAgICAvLyAyLiBDb2xsZWN0IGZpeGVkIGNv
bHVtbiB3aWR0aHMgc2V0IGJ5IDxjb2xncm91cD4ncyBhbmQgPGNvbD5zCisgICAgLy8gMy4gRmlu
ZCB0aGUgbWluL21heCB3aWR0aCBmb3IgZWFjaCBjb2x1bW5zIHVzaW5nIHRoZSBjZWxsIGNvbnN0
cmFpbnRzIGFuZCB0aGUgPGNvbD4gZml4ZWQgd2lkdGhzIGJ1dCBpZ25vcmUgY29sdW1uIHNwYW5z
LgorICAgIC8vIDQuIERpc3RyaWJ1dGUgY29sdW1uIHNwYW5uaW5nIGNlbGxzIG1pbi9tYXggd2lk
dGhzLgorICAgIC8vIDUuIEFkZCB0aGVtIGFsbCB1cCBhbmQgcmV0dXJuIHRoZSBjb21wdXRlZCBt
aW4vbWF4IHdpZHRocy4KKyAgICBmb3IgKGF1dG8mIGNlbGwgOiBncmlkLmNlbGxzKCkpIHsKKyAg
ICAgICAgYXV0byYgY2VsbEJveCA9IGNlbGwtPmJveCgpOworICAgICAgICBBU1NFUlQoY2VsbEJv
eC5lc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSk7CisKKyAgICAgICAgYXV0byBp
bnRyaW5zaWNXaWR0aCA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
Rm9yQm94KGNlbGxCb3gpOworICAgICAgICBpZiAoIWludHJpbnNpY1dpZHRoKSB7CisgICAgICAg
ICAgICBpbnRyaW5zaWNXaWR0aCA9IGdlb21ldHJ5KCkuaW50cmluc2ljV2lkdGhDb25zdHJhaW50
c0ZvckNlbGwoKmNlbGwpOworICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLnNldEludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHNGb3JCb3goY2VsbEJveCwgKmludHJpbnNpY1dpZHRoKTsKKyAgICAg
ICAgfQorICAgICAgICAvLyBTcGFubmVyIGNlbGxzIHB1dCB0aGVpciBpbnRyaW5zaWMgd2lkdGhz
IG9uIHRoZSBpbml0aWFsIHNsb3RzLgorICAgICAgICBncmlkLnNsb3QoY2VsbC0+cG9zaXRpb24o
KSktPnNldFdpZHRoQ29uc3RyYWludHMoKmludHJpbnNpY1dpZHRoKTsKKyAgICB9CisKKyAgICAv
LyAyLiBDb2xsZWN0IHRoZSBmaXhlZCB3aWR0aCA8Y29sPnMuCisgICAgYXV0byYgY29sdW1uTGlz
dCA9IGdyaWQuY29sdW1ucygpLmxpc3QoKTsKKyAgICBWZWN0b3I8T3B0aW9uYWw8TGF5b3V0VW5p
dD4+IGZpeGVkV2lkdGhDb2x1bW5zOworICAgIGZvciAoYXV0byYgY29sdW1uIDogY29sdW1uTGlz
dCkgeworICAgICAgICBhdXRvIGZpeGVkV2lkdGggPSBbJl0gKCkgLT4gT3B0aW9uYWw8TGF5b3V0
VW5pdD4geworICAgICAgICAgICAgYXV0byogY29sdW1uQm94ID0gY29sdW1uLmJveCgpOworICAg
ICAgICAgICAgaWYgKCFjb2x1bW5Cb3gpIHsKKyAgICAgICAgICAgICAgICAvLyBBbm95bm1vdXMg
Y29sdW1ucyBkb24ndCBoYXZlIGFzc29jaWF0ZWQgbGF5b3V0IGJveGVzIGFuZCBjYW4ndCBoYXZl
IGZpeGVkIGNvbCBzaXplLgorICAgICAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiAoYXV0byB3aWR0aCA9IGNvbHVtbkJveC0+Y29sdW1uV2lkdGgo
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgICAgICAgICByZXR1cm4gZ2Vv
bWV0cnkoKS5jb21wdXRlZENvbHVtbldpZHRoKCpjb2x1bW5Cb3gpOworICAgICAgICB9OworICAg
ICAgICBmaXhlZFdpZHRoQ29sdW1ucy5hcHBlbmQoZml4ZWRXaWR0aCgpKTsKKyAgICB9CisKKyAg
ICBWZWN0b3I8Rm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM+IGNv
bHVtbkludHJpbnNpY1dpZHRocyhjb2x1bW5MaXN0LnNpemUoKSk7CisgICAgLy8gMy4gQ29sbGVj
dCBoZSBtaW4vbWF4IHdpZHRoIGZvciBlYWNoIGNvbHVtbiBidXQgaWdub3JlIGNvbHVtbiBzcGFu
cyBmb3Igbm93LgorICAgIFZlY3RvcjxTbG90UG9zaXRpb24+IHNwYW5uaW5nQ2VsbFBvc2l0aW9u
TGlzdDsKKyAgICBzaXplX3QgbnVtYmVyT2ZBY3R1YWxDb2x1bW5zID0gMDsKKyAgICBmb3IgKHNp
emVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1uTGlzdC5zaXplKCk7ICsr
Y29sdW1uSW5kZXgpIHsKKyAgICAgICAgYXV0byBjb2x1bW5IYXNOb25TcGFubmVkQ2VsbCA9IGZh
bHNlOworICAgICAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgZ3JpZC5y
b3dzKCkuc2l6ZSgpOyArK3Jvd0luZGV4KSB7CisgICAgICAgICAgICBhdXRvJiBzbG90ID0gKmdy
aWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsKKyAgICAgICAgICAgIGlmIChzbG90
LmlzQ29sdW1uU3Bhbm5lZCgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAg
ICAgY29sdW1uSGFzTm9uU3Bhbm5lZENlbGwgPSB0cnVlOworICAgICAgICAgICAgaWYgKHNsb3Qu
aGFzQ29sdW1uU3BhbigpKSB7CisgICAgICAgICAgICAgICAgc3Bhbm5pbmdDZWxsUG9zaXRpb25M
aXN0LmFwcGVuZCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gY29sdW1uRml4ZWRXaWR0
aCA9IGZpeGVkV2lkdGhDb2x1bW5zW2NvbHVtbkluZGV4XTsKKyAgICAgICAgICAgIGF1dG8gd2lk
dGhDb25zdHJhaW50cyA9ICFjb2x1bW5GaXhlZFdpZHRoID8gc2xvdC53aWR0aENvbnN0cmFpbnRz
KCkgOiBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7ICpjb2x1
bW5GaXhlZFdpZHRoLCAqY29sdW1uRml4ZWRXaWR0aCB9OworICAgICAgICAgICAgY29sdW1uSW50
cmluc2ljV2lkdGhzW2NvbHVtbkluZGV4XS5taW5pbXVtID0gc3RkOjptYXgod2lkdGhDb25zdHJh
aW50cy5taW5pbXVtLCBjb2x1bW5JbnRyaW5zaWNXaWR0aHNbY29sdW1uSW5kZXhdLm1pbmltdW0p
OworICAgICAgICAgICAgY29sdW1uSW50cmluc2ljV2lkdGhzW2NvbHVtbkluZGV4XS5tYXhpbXVt
ID0gc3RkOjptYXgod2lkdGhDb25zdHJhaW50cy5tYXhpbXVtLCBjb2x1bW5JbnRyaW5zaWNXaWR0
aHNbY29sdW1uSW5kZXhdLm1heGltdW0pOworICAgICAgICB9CisgICAgICAgIGlmIChjb2x1bW5I
YXNOb25TcGFubmVkQ2VsbCkKKyAgICAgICAgICAgICsrbnVtYmVyT2ZBY3R1YWxDb2x1bW5zOwor
ICAgIH0KKworICAgIC8vIDQuIERpc3RyaWJ1dGUgdGhlIHNwYW5uaW5nIG1pbi9tYXggd2lkdGhz
LgorICAgIGZvciAoYXV0byBzcGFubmluZ0NlbGxQb3NpdGlvbiA6IHNwYW5uaW5nQ2VsbFBvc2l0
aW9uTGlzdCkgeworICAgICAgICBhdXRvJiBzbG90ID0gKmdyaWQuc2xvdChzcGFubmluZ0NlbGxQ
b3NpdGlvbik7CisgICAgICAgIGF1dG8mIGNlbGwgPSBzbG90LmNlbGwoKTsKKyAgICAgICAgQVNT
RVJUKHNsb3QuaGFzQ29sdW1uU3BhbigpKTsKKyAgICAgICAgYXV0byB3aWR0aENvbnN0cmFpbnRz
VG9EaXN0cmlidXRlID0gc2xvdC53aWR0aENvbnN0cmFpbnRzKCk7CisgICAgICAgIGZvciAoc2l6
ZV90IGNvbHVtblNwYW5JbmRleCA9IGNlbGwuc3RhcnRDb2x1bW4oKTsgY29sdW1uU3BhbkluZGV4
IDwgY2VsbC5lbmRDb2x1bW4oKTsgKytjb2x1bW5TcGFuSW5kZXgpCisgICAgICAgICAgICB3aWR0
aENvbnN0cmFpbnRzVG9EaXN0cmlidXRlIC09IGNvbHVtbkludHJpbnNpY1dpZHRoc1tjb2x1bW5T
cGFuSW5kZXhdOworICAgICAgICAvLyA8dGFibGUgc3R5bGU9ImJvcmRlci1zcGFjaW5nOiA1MHB4
Ij48dHI+PHRkIGNvbHNwYW49Mj5sb25nIGxvbmcgdGV4dDwvdGQ+PC90cj48dHI+PHRkPmxvPC90
ZD48dGQ+eHQ8L3RkPjx0cj48L3RhYmxlPgorICAgICAgICAvLyBbbG9uZyBsb25nIHRleHRdCisg
ICAgICAgIC8vIFtsb10gICAgICAgIFt4dF0KKyAgICAgICAgLy8gV2hpbGUgaXQgbG9va3MgbGlr
ZSB0aGUgc3Bhbm5pbmcgY2VsbCBoYXMgdG8gZGlzdHJpYnV0ZSBhbGwgaXRzIHNwYW5uaW5nIHdp
ZHRoLCB0aGUgYm9yZGVyLXNwYWNpbmcgdGFrZXMgbW9zdCBvZiB0aGUgc3BhY2UgYW5kCisgICAg
ICAgIC8vIG5vIGRpc3RyaWJ1dGlvbiBpcyBuZWVkZWQgYXQgYWxsLgorICAgICAgICB3aWR0aENv
bnN0cmFpbnRzVG9EaXN0cmlidXRlIC09IChjZWxsLmNvbHVtblNwYW4oKSAtIDEpICogZ3JpZC5o
b3Jpem9udGFsU3BhY2luZygpOworICAgICAgICAvLyBGSVhNRTogQ2hlY2sgaWYgZml4ZWQgd2lk
dGggY29sdW1ucyBzaG91bGQgYmUgc2tpcHBlZCBoZXJlLgorICAgICAgICB3aWR0aENvbnN0cmFp
bnRzVG9EaXN0cmlidXRlLm1pbmltdW0gPSBzdGQ6Om1heChMYXlvdXRVbml0IHsgfSwgd2lkdGhD
b25zdHJhaW50c1RvRGlzdHJpYnV0ZS5taW5pbXVtIC8gY2VsbC5jb2x1bW5TcGFuKCkpOworICAg
ICAgICB3aWR0aENvbnN0cmFpbnRzVG9EaXN0cmlidXRlLm1heGltdW0gPSBzdGQ6Om1heChMYXlv
dXRVbml0IHsgfSwgd2lkdGhDb25zdHJhaW50c1RvRGlzdHJpYnV0ZS5tYXhpbXVtIC8gY2VsbC5j
b2x1bW5TcGFuKCkpOworICAgICAgICBpZiAod2lkdGhDb25zdHJhaW50c1RvRGlzdHJpYnV0ZS5t
aW5pbXVtIHx8IHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWF4aW11bSkgeworICAgICAg
ICAgICAgZm9yIChzaXplX3QgY29sdW1uU3BhbkluZGV4ID0gY2VsbC5zdGFydENvbHVtbigpOyBj
b2x1bW5TcGFuSW5kZXggPCBjZWxsLmVuZENvbHVtbigpOyArK2NvbHVtblNwYW5JbmRleCkKKyAg
ICAgICAgICAgICAgICBjb2x1bW5JbnRyaW5zaWNXaWR0aHNbY29sdW1uU3BhbkluZGV4XSArPSB3
aWR0aENvbnN0cmFpbnRzVG9EaXN0cmlidXRlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8g
NS4gVGhlIGZpbmFsIHRhYmxlIG1pbi9tYXggd2lkdGhzIGlzIGp1c3QgdGhlIGFjY3VtdWxhdGVk
IGNvbHVtbiBjb25zdHJhaW50cy4KKyAgICBhdXRvIHRhYmxlV2lkdGhDb25zdHJhaW50cyA9IElu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9OworICAgIGZvciAoYXV0byYgY29sdW1uSW50cmlu
c2ljV2lkdGggOiBjb2x1bW5JbnRyaW5zaWNXaWR0aHMpCisgICAgICAgIHRhYmxlV2lkdGhDb25z
dHJhaW50cyArPSBjb2x1bW5JbnRyaW5zaWNXaWR0aDsKKyAgICAvLyBFeGFwYW5kIHRoZSBwcmVm
ZXJyZWQgd2lkdGggd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyBjZWxsIHNwYWNpbmcgKG5vdGUg
dGhhdCBjb2x1bW4gc3Bhbm5lcnMgY291bnQgYXMgb25lIGNlbGwpLgorICAgIHRhYmxlV2lkdGhD
b25zdHJhaW50cyArPSAobnVtYmVyT2ZBY3R1YWxDb2x1bW5zICsgMSkgKiBncmlkLmhvcml6b250
YWxTcGFjaW5nKCk7CisgICAgcmV0dXJuIHRhYmxlV2lkdGhDb25zdHJhaW50czsKK30KKwordm9p
ZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlQW5kRGlzdHJpYnV0ZUV4dHJhU3BhY2Uo
TGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UsIE9wdGlvbmFsPExheW91dFVuaXQ+
IGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpCit7CisgICAgLy8gQ29tcHV0ZSBhbmQgYmFsYW5jZSB0
aGUgY29sdW1uIGFuZCByb3cgc3BhY2VzLgorICAgIGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3Rh
dGUoKS50YWJsZUdyaWQoKTsKKyAgICBhdXRvJiBjb2x1bW5zID0gZ3JpZC5jb2x1bW5zKCkubGlz
dCgpOworICAgIGF1dG8gdGFibGVMYXlvdXQgPSB0aGlzLT50YWJsZUxheW91dCgpOworCisgICAg
Ly8gQ29sdW1ucyBmaXJzdC4KKyAgICBhdXRvIGRpc3RyaWJ1dGVkSG9yaXpvbnRhbFNwYWNlcyA9
IHRhYmxlTGF5b3V0LmRpc3RyaWJ1dGVkSG9yaXpvbnRhbFNwYWNlKGF2YWlsYWJsZUhvcml6b250
YWxTcGFjZSk7CisgICAgQVNTRVJUKGRpc3RyaWJ1dGVkSG9yaXpvbnRhbFNwYWNlcy5zaXplKCkg
PT0gY29sdW1ucy5zaXplKCkpOworICAgIGF1dG8gY29sdW1uTG9naWNhbExlZnQgPSBncmlkLmhv
cml6b250YWxTcGFjaW5nKCk7CisgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBjb2x1
bW5JbmRleCA8IGNvbHVtbnMuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7CisgICAgICAgIGF1dG8m
IGNvbHVtbiA9IGNvbHVtbnNbY29sdW1uSW5kZXhdOworICAgICAgICBjb2x1bW4uc2V0TG9naWNh
bExlZnQoY29sdW1uTG9naWNhbExlZnQpOworICAgICAgICBjb2x1bW4uc2V0TG9naWNhbFdpZHRo
KGRpc3RyaWJ1dGVkSG9yaXpvbnRhbFNwYWNlc1tjb2x1bW5JbmRleF0pOworICAgICAgICBjb2x1
bW5Mb2dpY2FsTGVmdCArPSBkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZXNbY29sdW1uSW5kZXhd
ICsgZ3JpZC5ob3Jpem9udGFsU3BhY2luZygpOworICAgIH0KKworICAgIC8vIFJvd3Mgc2Vjb25k
LgorICAgIGF1dG8mIHJvd3MgPSBncmlkLnJvd3MoKS5saXN0KCk7CisgICAgZm9yIChzaXplX3Qg
cm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7CisgICAg
ICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1bW5zLnNp
emUoKTsgKytjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgYXV0byYgc2xvdCA9ICpncmlkLnNs
b3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7CisgICAgICAgICAgICBpZiAoc2xvdC5pc1Jv
d1NwYW5uZWQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGxheW91
dENlbGwoc2xvdC5jZWxsKCksIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSk7CisgICAgICAgICAg
ICBpZiAoc2xvdC5oYXNSb3dTcGFuKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgICAgICAvLyBUaGUgbWluaW11bSBoZWlnaHQgb2YgYSByb3cgKHdpdGhvdXQgc3Bhbm5pbmct
cmVsYXRlZCBoZWlnaHQgZGlzdHJpYnV0aW9uKSBpcyBkZWZpbmVkIGFzIHRoZSBoZWlnaHQgb2Yg
YW4gaHlwb3RoZXRpY2FsCisgICAgICAgICAgICAvLyBsaW5lYm94IGNvbnRhaW5pbmcgdGhlIGNl
bGxzIG9yaWdpbmF0aW5nIGluIHRoZSByb3cuCisgICAgICAgICAgICBhdXRvJiBjZWxsID0gc2xv
dC5jZWxsKCk7CisgICAgICAgICAgICBjZWxsLnNldEJhc2VsaW5lKGdlb21ldHJ5KCkudXNlZEJh
c2VsaW5lRm9yQ2VsbChjZWxsLmJveCgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRv
IGRpc3RyaWJ1dGVkVmVydGljYWxTcGFjZXMgPSB0YWJsZUxheW91dC5kaXN0cmlidXRlZFZlcnRp
Y2FsU3BhY2UoYXZhaWxhYmxlVmVydGljYWxTcGFjZSk7CisgICAgQVNTRVJUKGRpc3RyaWJ1dGVk
VmVydGljYWxTcGFjZXMuc2l6ZSgpID09IHJvd3Muc2l6ZSgpKTsKKyAgICBhdXRvIHJvd0xvZ2lj
YWxUb3AgPSBncmlkLnZlcnRpY2FsU3BhY2luZygpOworICAgIGZvciAoc2l6ZV90IHJvd0luZGV4
ID0gMDsgcm93SW5kZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkgeworICAgICAgICBhdXRv
JiByb3cgPSByb3dzW3Jvd0luZGV4XTsKKyAgICAgICAgcm93LnNldExvZ2ljYWxIZWlnaHQoZGlz
dHJpYnV0ZWRWZXJ0aWNhbFNwYWNlc1tyb3dJbmRleF0pOworICAgICAgICByb3cuc2V0TG9naWNh
bFRvcChyb3dMb2dpY2FsVG9wKTsKKyAgICAgICAgcm93TG9naWNhbFRvcCArPSBkaXN0cmlidXRl
ZFZlcnRpY2FsU3BhY2VzW3Jvd0luZGV4XSArIGdyaWQudmVydGljYWxTcGFjaW5nKCk7CisgICAg
fQorfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4
dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1h
dHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFmMzBkZTEzNTQ1NjY1
NTgxZWI5NDlhMjdiODBkZjRlMTIyMjVlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1h
dHRpbmdDb250ZXh0LmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9u
Y2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAi
Rm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdTdGF0ZS5oIgor
I2luY2x1ZGUgIlRhYmxlR3JpZC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKyNpbmNs
dWRlIDx3dGYvVW5pcXVlUmVmLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBM
YXlvdXQgeworCitjbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKKy8vIFRoaXMgY2xhc3MgaW1wbGVt
ZW50cyB0aGUgbGF5b3V0IGxvZ2ljIGZvciB0YWJsZSBmb3JtYXR0aW5nIGNvbnRleHRzLgorLy8g
aHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIyL3RhYmxlcy5odG1sCitjbGFzcyBUYWJsZUZvcm1h
dHRpbmdDb250ZXh0IGZpbmFsIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0IHsKKyAgICBXVEZf
TUFLRV9JU09fQUxMT0NBVEVEKFRhYmxlRm9ybWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAg
IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29u
dGV4dFJvb3QsIFRhYmxlRm9ybWF0dGluZ1N0YXRlJik7CisgICAgdm9pZCBsYXlvdXRJbkZsb3dD
b250ZW50KEludmFsaWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250
ZW50Jikgb3ZlcnJpZGU7CisgICAgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0
IG92ZXJyaWRlOworCisgICAgc3RhdGljIFVuaXF1ZVJlZjxUYWJsZUdyaWQ+IGVuc3VyZVRhYmxl
R3JpZChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KTsKKworcHJpdmF0ZToKKyAgICBjbGFz
cyBUYWJsZUxheW91dCB7CisgICAgcHVibGljOgorICAgICAgICBUYWJsZUxheW91dChjb25zdCBU
YWJsZUZvcm1hdHRpbmdDb250ZXh0JiwgY29uc3QgVGFibGVHcmlkJik7CisKKyAgICAgICAgdXNp
bmcgRGlzdHJpYnV0ZWRTcGFjZXMgPSBWZWN0b3I8TGF5b3V0VW5pdD47CisgICAgICAgIERpc3Ry
aWJ1dGVkU3BhY2VzIGRpc3RyaWJ1dGVkSG9yaXpvbnRhbFNwYWNlKExheW91dFVuaXQgYXZhaWxh
YmxlSG9yaXpvbnRhbFNwYWNlKTsKKyAgICAgICAgRGlzdHJpYnV0ZWRTcGFjZXMgZGlzdHJpYnV0
ZWRWZXJ0aWNhbFNwYWNlKE9wdGlvbmFsPExheW91dFVuaXQ+IGF2YWlsYWJsZVZlcnRpY2FsU3Bh
Y2UpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4
dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0
OyB9CisKKyAgICAgICAgY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYgbV9mb3JtYXR0aW5n
Q29udGV4dDsKKyAgICAgICAgY29uc3QgVGFibGVHcmlkJiBtX2dyaWQ7CisgICAgfTsKKworICAg
IGNsYXNzIEdlb21ldHJ5IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSB7Cisg
ICAgcHVibGljOgorICAgICAgICBMYXlvdXRVbml0IGNlbGxIZWlnaChjb25zdCBDb250YWluZXJC
b3gmKSBjb25zdDsKKyAgICAgICAgRWRnZXMgY29tcHV0ZWRDZWxsQm9yZGVyKGNvbnN0IFRhYmxl
R3JpZDo6Q2VsbCYpIGNvbnN0OworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRl
ZENvbHVtbldpZHRoKGNvbnN0IENvbnRhaW5lckJveCYgY29sdW1uQm94KTsKKyAgICAgICAgRm9y
bWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2ljV2lkdGhD
b25zdHJhaW50c0ZvckNlbGwoY29uc3QgVGFibGVHcmlkOjpDZWxsJik7CisgICAgICAgIElubGlu
ZUxheW91dFVuaXQgdXNlZEJhc2VsaW5lRm9yQ2VsbChjb25zdCBDb250YWluZXJCb3gmIGNlbGxC
b3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIGNsYXNzIFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQ7CisgICAgICAgIEdlb21ldHJ5KGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQm
LCBjb25zdCBUYWJsZUdyaWQmKTsKKworICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250
ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PFRhYmxlRm9y
bWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Zm9ybWF0dGluZ0Nv
bnRleHQoKSk7IH0KKyAgICAgICAgY29uc3QgVGFibGVHcmlkJiBtX2dyaWQ7CisgICAgfTsKKyAg
ICBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0
dXJuIEdlb21ldHJ5KCp0aGlzLCBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKSk7IH0KKwor
ICAgIGNsYXNzIFF1aXJrcyA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzIHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIFF1aXJrcyhjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0Jik7
CisKKyAgICAgICAgYm9vbCBzaG91bGRJZ25vcmVDaGlsZENvbnRlbnRWZXJ0aWNhbE1hcmdpbihj
b25zdCBDb250YWluZXJCb3gmKSBjb25zdDsKKworICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRp
bmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PFRh
YmxlRm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OmZvcm1hdHRp
bmdDb250ZXh0KCkpOyB9CisgICAgICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5
IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeSgp
OyB9CisgICAgfTsKKyAgICBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkg
Y29uc3QgeyByZXR1cm4gUXVpcmtzKCp0aGlzKTsgfQorCisgICAgVGFibGVGb3JtYXR0aW5nQ29u
dGV4dDo6VGFibGVMYXlvdXQgdGFibGVMYXlvdXQoKSBjb25zdCB7IHJldHVybiBUYWJsZUxheW91
dCgqdGhpcywgZm9ybWF0dGluZ1N0YXRlKCkudGFibGVHcmlkKCkpOyB9CisKKyAgICBJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpIG92
ZXJyaWRlOworICAgIHZvaWQgbGF5b3V0Q2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmLCBMYXlv
dXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNl
ZENlbGxIZWlnaHQgPSBXVEY6Om51bGxvcHQpOworICAgIHZvaWQgc2V0VXNlZEdlb21ldHJ5Rm9y
Q2VsbHMoTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOworICAgIHZvaWQgc2V0
VXNlZEdlb21ldHJ5Rm9yUm93cyhMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSk7
CisgICAgdm9pZCBzZXRVc2VkR2VvbWV0cnlGb3JTZWN0aW9ucyhjb25zdCBDb25zdHJhaW50c0Zv
ckluRmxvd0NvbnRlbnQmKTsKKworICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0
ZWRQcmVmZXJyZWRXaWR0aEZvckNvbHVtbnMoKTsKKyAgICB2b2lkIGNvbXB1dGVBbmREaXN0cmli
dXRlRXh0cmFTcGFjZShMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSwgT3B0aW9u
YWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlVmVydGljYWxTcGFjZSk7CisKKyAgICBjb25zdCBUYWJs
ZUZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKCkgY29uc3QgeyByZXR1cm4gZG93bmNh
c3Q8VGFibGVGb3JtYXR0aW5nU3RhdGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3Rh
dGUoKSk7IH0KKyAgICBUYWJsZUZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKCkgeyBy
ZXR1cm4gZG93bmNhc3Q8VGFibGVGb3JtYXR0aW5nU3RhdGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpm
b3JtYXR0aW5nU3RhdGUoKSk7IH0KK307CisKK2lubGluZSBUYWJsZUZvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeTo6R2VvbWV0cnkoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYgdGFibGVG
b3JtYXR0aW5nQ29udGV4dCwgY29uc3QgVGFibGVHcmlkJiBncmlkKQorICAgIDogRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5KHRhYmxlRm9ybWF0dGluZ0NvbnRleHQpCisgICAgLCBtX2dyaWQo
Z3JpZCkKK3sKK30KKworaW5saW5lIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6UXVp
cmtzKGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmIHRhYmxlRm9ybWF0dGluZ0NvbnRleHQp
CisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzKHRhYmxlRm9ybWF0dGluZ0NvbnRleHQp
Cit7Cit9CisKK30KK30KKworU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19MQVlPVVRfRk9STUFUVElO
R19DT05URVhUKFRhYmxlRm9ybWF0dGluZ0NvbnRleHQsIGlzVGFibGVGb3JtYXR0aW5nQ29udGV4
dCgpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRy
eS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9y
bWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQ3
MzIzOTI2OTRmNmU3YTgyNDI5YzIwYTVlNjEwOTg0MGUyYWVkYzgKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGlu
Zy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCkBAIC0wLDAgKzEsMTY1IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisj
aW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94R2Vv
bWV0cnkuaCIKKyNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0RGVz
Y2VuZGFudEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRhaW5pbmdCbG9j
ay5oIgorI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitMYXlvdXRVbml0IFRhYmxlRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5OjpjZWxsSGVpZ2goY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94KSBj
b25zdAoreworICAgIEFTU0VSVChjZWxsQm94LmlzSW5GbG93KCkpOworICAgIGF1dG8gY29udGVu
dEhlaWdodCA9IExheW91dFVuaXQgeyB9OworICAgIGlmIChmb3JtYXR0aW5nQ29udGV4dCgpLnF1
aXJrcygpLnNob3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luKGNlbGxCb3gpKSB7
CisgICAgICAgIEFTU0VSVChjZWxsQm94LmZpcnN0SW5GbG93Q2hpbGQoKSk7CisgICAgICAgIGF1
dG8gZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgpOworICAgICAg
ICBhdXRvJiBmaXJzdEluRmxvd0NoaWxkID0gKmNlbGxCb3guZmlyc3RJbkZsb3dDaGlsZCgpOwor
ICAgICAgICBhdXRvJiBsYXN0SW5GbG93Q2hpbGQgPSAqY2VsbEJveC5sYXN0SW5GbG93Q2hpbGQo
KTsKKyAgICAgICAgYXV0byYgZmlyc3RJbkZsb3dDaGlsZEdlb21ldHJ5ID0gZm9ybWF0dGluZ0Nv
bnRleHQuZ2VvbWV0cnlGb3JCb3goZmlyc3RJbkZsb3dDaGlsZCwgRXNjYXBlUmVhc29uOjpUYWJs
ZVF1aXJrTmVlZHNHZW9tZXRyeUZyb21Fc3RhYmxpc2hlZEZvcm1hdHRpbmdDb250ZXh0KTsKKyAg
ICAgICAgYXV0byYgbGFzdEluRmxvd0NoaWxkR2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5n
ZW9tZXRyeUZvckJveChsYXN0SW5GbG93Q2hpbGQsIEVzY2FwZVJlYXNvbjo6VGFibGVRdWlya05l
ZWRzR2VvbWV0cnlGcm9tRXN0YWJsaXNoZWRGb3JtYXR0aW5nQ29udGV4dCk7CisKKyAgICAgICAg
YXV0byB0b3AgPSBmaXJzdEluRmxvd0NoaWxkLnN0eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmso
KSA/IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGZpcnN0SW5GbG93Q2hpbGRHZW9tZXRyeSku
dG9wKCkgOiBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChmaXJzdEluRmxvd0NoaWxkR2VvbWV0
cnkpLnRvcCgpOworICAgICAgICBhdXRvIGJvdHRvbSA9IGxhc3RJbkZsb3dDaGlsZC5zdHlsZSgp
Lmhhc01hcmdpbkFmdGVyUXVpcmsoKSA/IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGxhc3RJ
bkZsb3dDaGlsZEdlb21ldHJ5KS5ib3R0b20oKSA6IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0
KGxhc3RJbkZsb3dDaGlsZEdlb21ldHJ5KS5ib3R0b20oKTsKKyAgICAgICAgY29udGVudEhlaWdo
dCA9IGJvdHRvbSAtIHRvcDsKKyAgICB9IGVsc2UKKyAgICAgICAgY29udGVudEhlaWdodCA9IGNv
bnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QoY2VsbEJveCk7CisgICAgcmV0dXJu
IHN0ZDo6bWF4KGNvbXB1dGVkSGVpZ2h0KGNlbGxCb3gpLnZhbHVlT3IoMF9sdSksIGNvbnRlbnRI
ZWlnaHQpOworfQorCitFZGdlcyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29t
cHV0ZWRDZWxsQm9yZGVyKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgY29uc3QKK3sKKyAg
ICBhdXRvJiBjZWxsQm94ID0gY2VsbC5ib3goKTsKKyAgICBhdXRvIGJvcmRlciA9IGNvbXB1dGVk
Qm9yZGVyKGNlbGxCb3gpOworICAgIGF1dG8gY29sbGFwc2VkQm9yZGVyID0gbV9ncmlkLmNvbGxh
cHNlZEJvcmRlcigpOworICAgIGlmICghY29sbGFwc2VkQm9yZGVyKQorICAgICAgICByZXR1cm4g
Ym9yZGVyOworCisgICAgLy8gV2UgbWlnaHQgd2FudCB0byBjYWNoZSB0aGVzZSBjb2xsYXBzZWQg
Ym9yZGVycyBvbiB0aGUgZ3JpZC4KKyAgICBhdXRvIGNlbGxQb3NpdGlvbiA9IGNlbGwucG9zaXRp
b24oKTsKKyAgICAvLyBDb2xsYXBzZWQgYm9yZGVyIGxlZnQgZnJvbSB0YWJsZSBhbmQgYWRqYWNl
bnQgY2VsbHMuCisgICAgaWYgKCFjZWxsUG9zaXRpb24uY29sdW1uKQorICAgICAgICBib3JkZXIu
aG9yaXpvbnRhbC5sZWZ0ID0gY29sbGFwc2VkQm9yZGVyLT5ob3Jpem9udGFsLmxlZnQgLyAyOwor
ICAgIGVsc2UgeworICAgICAgICBhdXRvIGFkamFjZW50Qm9yZGVyUmlnaHQgPSBjb21wdXRlZEJv
cmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4gLSAxLCBjZWxsUG9zaXRpb24u
cm93IH0pLT5jZWxsKCkuYm94KCkpLmhvcml6b250YWwucmlnaHQ7CisgICAgICAgIGJvcmRlci5o
b3Jpem9udGFsLmxlZnQgPSBzdGQ6Om1heChib3JkZXIuaG9yaXpvbnRhbC5sZWZ0LCBhZGphY2Vu
dEJvcmRlclJpZ2h0KSAvIDI7CisgICAgfQorICAgIC8vIENvbGxhcHNlZCBib3JkZXIgcmlnaHQg
ZnJvbSB0YWJsZSBhbmQgYWRqYWNlbnQgY2VsbHMuCisgICAgaWYgKGNlbGxQb3NpdGlvbi5jb2x1
bW4gPT0gbV9ncmlkLmNvbHVtbnMoKS5zaXplKCkgLSAxKQorICAgICAgICBib3JkZXIuaG9yaXpv
bnRhbC5yaWdodCA9IGNvbGxhcHNlZEJvcmRlci0+aG9yaXpvbnRhbC5yaWdodCAvIDI7CisgICAg
ZWxzZSB7CisgICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJMZWZ0ID0gY29tcHV0ZWRCb3JkZXIo
bV9ncmlkLnNsb3QoeyBjZWxsUG9zaXRpb24uY29sdW1uICsgMSwgY2VsbFBvc2l0aW9uLnJvdyB9
KS0+Y2VsbCgpLmJveCgpKS5ob3Jpem9udGFsLmxlZnQ7CisgICAgICAgIGJvcmRlci5ob3Jpem9u
dGFsLnJpZ2h0ID0gc3RkOjptYXgoYm9yZGVyLmhvcml6b250YWwucmlnaHQsIGFkamFjZW50Qm9y
ZGVyTGVmdCkgLyAyOworICAgIH0KKyAgICAvLyBDb2xsYXBzZWQgYm9yZGVyIHRvcCBmcm9tIHRh
YmxlLCByb3cgYW5kIGFkamFjZW50IGNlbGxzLgorICAgIGF1dG8mIHJvd3MgPSBtX2dyaWQucm93
cygpLmxpc3QoKTsKKyAgICBpZiAoIWNlbGxQb3NpdGlvbi5yb3cpCisgICAgICAgIGJvcmRlci52
ZXJ0aWNhbC50b3AgPSBjb2xsYXBzZWRCb3JkZXItPnZlcnRpY2FsLnRvcCAvIDI7CisgICAgZWxz
ZSB7CisgICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJCb3R0b20gPSBjb21wdXRlZEJvcmRlciht
X2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4sIGNlbGxQb3NpdGlvbi5yb3cgLSAxIH0p
LT5jZWxsKCkuYm94KCkpLnZlcnRpY2FsLmJvdHRvbTsKKyAgICAgICAgYXV0byBhZGphY2VudFJv
d0JvdHRvbSA9IGNvbXB1dGVkQm9yZGVyKHJvd3NbY2VsbFBvc2l0aW9uLnJvdyAtIDFdLmJveCgp
KS52ZXJ0aWNhbC5ib3R0b207CisgICAgICAgIGF1dG8gYWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIg
PSBzdGQ6Om1heChhZGphY2VudEJvcmRlckJvdHRvbSwgYWRqYWNlbnRSb3dCb3R0b20pOworICAg
ICAgICBib3JkZXIudmVydGljYWwudG9wID0gc3RkOjptYXgoYm9yZGVyLnZlcnRpY2FsLnRvcCwg
YWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIpIC8gMjsKKyAgICB9CisgICAgLy8gQ29sbGFwc2VkIGJv
cmRlciBib3R0b20gZnJvbSB0YWJsZSwgcm93IGFuZCBhZGphY2VudCBjZWxscy4KKyAgICBpZiAo
Y2VsbFBvc2l0aW9uLnJvdyA9PSBtX2dyaWQucm93cygpLnNpemUoKSAtIDEpCisgICAgICAgIGJv
cmRlci52ZXJ0aWNhbC5ib3R0b20gPSBjb2xsYXBzZWRCb3JkZXItPnZlcnRpY2FsLmJvdHRvbSAv
IDI7CisgICAgZWxzZSB7CisgICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJUb3AgPSBjb21wdXRl
ZEJvcmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4sIGNlbGxQb3NpdGlvbi5y
b3cgKyAxIH0pLT5jZWxsKCkuYm94KCkpLnZlcnRpY2FsLnRvcDsKKyAgICAgICAgYXV0byBhZGph
Y2VudFJvd1RvcCA9IGNvbXB1dGVkQm9yZGVyKHJvd3NbY2VsbFBvc2l0aW9uLnJvdyArIDFdLmJv
eCgpKS52ZXJ0aWNhbC50b3A7CisgICAgICAgIGF1dG8gYWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIg
PSBzdGQ6Om1heChhZGphY2VudEJvcmRlclRvcCwgYWRqYWNlbnRSb3dUb3ApOworICAgICAgICBi
b3JkZXIudmVydGljYWwuYm90dG9tID0gc3RkOjptYXgoYm9yZGVyLnZlcnRpY2FsLmJvdHRvbSwg
YWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIpIC8gMjsKKyAgICB9CisgICAgcmV0dXJuIGJvcmRlcjsK
K30KKworT3B0aW9uYWw8TGF5b3V0VW5pdD4gVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0
cnk6OmNvbXB1dGVkQ29sdW1uV2lkdGgoY29uc3QgQ29udGFpbmVyQm94JiBjb2x1bW5Cb3gpCit7
CisgICAgLy8gQ2hlY2sgYm90aCBzdHlsZSBhbmQgPGNvbD4ncyB3aWR0aCBhdHRyaWJ1dGUuCisg
ICAgLy8gRklYTUU6IEZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIGNhbGN1bGF0ZWQgdmFsdWVz
LCBsaWtlIDxjb2wgc3R5bGU9IndpZHRoOiAxMCUiPi4KKyAgICBpZiAoYXV0byBjb21wdXRlZFdp
ZHRoVmFsdWUgPSBjb21wdXRlZFdpZHRoKGNvbHVtbkJveCwgeyB9KSkKKyAgICAgICAgcmV0dXJu
IGNvbXB1dGVkV2lkdGhWYWx1ZTsKKyAgICByZXR1cm4gY29sdW1uQm94LmNvbHVtbldpZHRoKCk7
Cit9CisKK0Zvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIFRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9y
Q2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpCit7CisgICAgYXV0byYgY2VsbEJveCA9
IGNlbGwuYm94KCk7CisgICAgYXV0byYgc3R5bGUgPSBjZWxsQm94LnN0eWxlKCk7CisKKyAgICBh
dXRvIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IFsmXSgpIC0+IEZvcm1hdHRp
bmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsKKyAgICAgICAgLy8gRXZlbiBm
aXhlZCB3aWR0aCBjZWxscyBleHBhbmQgdG8gdGhlaXIgbWluaW11bSBjb250ZW50IHdpZHRoCisg
ICAgICAgIC8vIDx0ZCBzdHlsZT0id2lkdGg6IDEwcHgiPnRlc3RfY29udGVudDwvdGQ+IHdpbGwg
c2l6ZSB0byBtYXgobWluaW11bSBjb250ZW50IHdpZHRoLCBjb21wdXRlZCB3aWR0aCkuCisgICAg
ICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IEZvcm1hdHRpbmdDb250ZXh0OjpJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKKyAgICAgICAgaWYgKGNlbGxCb3guaGFzQ2hp
bGQoKSkKKyAgICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBMYXlvdXRDb250
ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjZWxsQm94LCBsYXlvdXRTdGF0ZSgpKS0+Y29t
cHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7CisgICAgICAgIGlmIChhdXRvIGZpeGVk
V2lkdGggPSBmaXhlZFZhbHVlKHN0eWxlLmxvZ2ljYWxXaWR0aCgpKSkKKyAgICAgICAgICAgIHJl
dHVybiB7IHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgKmZpeGVk
V2lkdGgpLCBzdGQ6Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0sICpmaXhl
ZFdpZHRoKSB9OworICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKKyAg
ICB9OworICAgIC8vIEZJWE1FIENoZWNrIGZvciBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAg
IGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGNvbnN0cmFpbkJ5TWluTWF4V2lkdGgo
Y2VsbEJveCwgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkpOworICAgIC8vIEV4
cGFuZCB3aXRoIGJvcmRlcgorICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMuZXhwYW5kKGNv
bXB1dGVkQ2VsbEJvcmRlcihjZWxsKS53aWR0aCgpKTsKKyAgICAvLyBwYWRkaW5nCisgICAgaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQoZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nTGVm
dCgpKS52YWx1ZU9yKDApICsgZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nUmlnaHQoKSkudmFsdWVP
cigwKSk7CisgICAgLy8gYW5kIG1hcmdpbgorICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMu
ZXhwYW5kKGZpeGVkVmFsdWUoc3R5bGUubWFyZ2luU3RhcnQoKSkudmFsdWVPcigwKSArIGZpeGVk
VmFsdWUoc3R5bGUubWFyZ2luRW5kKCkpLnZhbHVlT3IoMCkpOworICAgIHJldHVybiBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzOworfQorCisKK0lubGluZUxheW91dFVuaXQgVGFibGVGb3JtYXR0
aW5nQ29udGV4dDo6R2VvbWV0cnk6OnVzZWRCYXNlbGluZUZvckNlbGwoY29uc3QgQ29udGFpbmVy
Qm94JiBjZWxsQm94KQoreworICAgIC8vIFRoZSBiYXNlbGluZSBvZiBhIGNlbGwgaXMgZGVmaW5l
ZCBhcyB0aGUgYmFzZWxpbmUgb2YgdGhlIGZpcnN0IGluLWZsb3cgbGluZSBib3ggaW4gdGhlIGNl
bGwsCisgICAgLy8gb3IgdGhlIGZpcnN0IGluLWZsb3cgdGFibGUtcm93IGluIHRoZSBjZWxsLCB3
aGljaGV2ZXIgY29tZXMgZmlyc3QuCisgICAgLy8gSWYgdGhlcmUgaXMgbm8gc3VjaCBsaW5lIGJv
eCwgdGhlIGJhc2VsaW5lIGlzIHRoZSBib3R0b20gb2YgY29udGVudCBlZGdlIG9mIHRoZSBjZWxs
IGJveC4KKyAgICBpZiAoY2VsbEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0
KCkpCisgICAgICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkSW5saW5lRm9ybWF0
dGluZ1N0YXRlKGNlbGxCb3gpLmxpbmVzKClbMF0uYmFzZWxpbmUoKTsKKyAgICBmb3IgKGF1dG8m
IGNlbGxEZXNjZW5kYW50IDogZGVzY2VuZGFudHNPZlR5cGU8Q29udGFpbmVyQm94PihjZWxsQm94
KSkgeworICAgICAgICBpZiAoY2VsbERlc2NlbmRhbnQuZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCgpKSB7CisgICAgICAgICAgICBhdXRvJiBpbmxpbmVGb3JtYXR0aW5nU3RhdGVG
b3JDZWxsID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZElubGluZUZvcm1hdHRpbmdTdGF0ZShj
ZWxsRGVzY2VuZGFudCk7CisgICAgICAgICAgICBpZiAoIWlubGluZUZvcm1hdHRpbmdTdGF0ZUZv
ckNlbGwubGluZXMoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGlubGluZUZv
cm1hdHRpbmdTdGF0ZUZvckNlbGwubGluZXMoKVswXS5iYXNlbGluZSgpOworICAgICAgICB9Cisg
ICAgICAgIGlmIChjZWxsRGVzY2VuZGFudC5lc3RhYmxpc2hlc1RhYmxlRm9ybWF0dGluZ0NvbnRl
eHQoKSkKKyAgICAgICAgICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkVGFibGVG
b3JtYXR0aW5nU3RhdGUoY2VsbERlc2NlbmRhbnQpLnRhYmxlR3JpZCgpLnJvd3MoKS5saXN0KClb
MF0uYmFzZWxpbmUoKTsKKyAgICB9CisgICAgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkuZ2Vv
bWV0cnlGb3JCb3goY2VsbEJveCkuY29udGVudEJveEJvdHRvbSgpOworfQorCit9Cit9CisKKyNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJs
ZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iNjRhNjJkZmYwNzE0YWQ2
OGZhNzg5Njg1ZmJiYjIxMzc0ZmYxNTMyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0
aW5nQ29udGV4dFF1aXJrcy5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNp
ZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkxheW91dEJv
eC5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgorI2luY2x1ZGUgIkxheW91dFN0
YXRlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitib29s
IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6c2hvdWxkSWdub3JlQ2hpbGRDb250ZW50
VmVydGljYWxNYXJnaW4oY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94KSBjb25zdAoreworICAg
IC8vIE5vcm1hbGx5IEJGQyByb290IGNvbnRlbnQgaGVpZ2h0IHRha2VzIHRoZSBtYXJnaW4gYm94
IG9mIHRoZSBjaGlsZCBjb250ZW50IGFzIHZlcnRpY2FsIG1hcmdpbnMgZG9uJ3QgY29sbGFwc2Ug
d2l0aCBCRkMgcm9vdHMsCisgICAgLy8gYnV0IHRhYmxlIGNlbGwgYm94ZXMgZG8gY29sbGFwc2Ug
dGhlaXIgKG5vbi1leGlzdGluZykgbWFyZ2lucyB3aXRoIGNoaWxkIHF1aXJrIG1hcmdpbnMgKHNv
IG11Y2ggcXVpcmspLCBzbyBoZXJlIHdlIGNoZWNrCisgICAgLy8gaWYgdGhlIGNvbnRlbnQgaGVp
Z2h0IHNob3VsZCBpbmNsdWRlIG1hcmdpbnMgb3Igbm90LgorICAgIC8vIGUuZyA8dGFibGU+PHRy
Pjx0ZD48cD50ZXh0IGNvbnRlbnQ8L3RkPjwvdHI+PC90YWJsZT4gPC0gPHA+J3MgcXVpcmsgbWFy
Z2luIGNvbGxhcHNlcyB3aXRoIHRoZSA8dGQ+IHNvIGl0cyBjb250ZW50CisgICAgLy8gaGVpZ2h0
IHNob3VsZCBub3QgaW5jbHVkZSB2ZXJ0aWNhbCBtYXJnaW5zLgorICAgIGlmICghbGF5b3V0U3Rh
dGUoKS5pblF1aXJrc01vZGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChjZWxs
Qm94LmVzdGFibGlzaGVzSW5saW5lRm9ybWF0dGluZ0NvbnRleHQoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIGlmICghY2VsbEJveC5oYXNJbkZsb3dDaGlsZCgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgcmV0dXJuIGNlbGxCb3guZmlyc3RJbkZsb3dDaGlsZCgpLT5zdHlsZSgp
Lmhhc01hcmdpbkJlZm9yZVF1aXJrKCkgfHwgY2VsbEJveC5sYXN0SW5GbG93Q2hpbGQoKS0+c3R5
bGUoKS5oYXNNYXJnaW5BZnRlclF1aXJrKCk7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0
dGluZy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uMTMxMGVmNWUxMzI2MGQxYTMxZmIxZDllODZlMmM2YjYyM2E2NTk4NwotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
dGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcApAQCAtMCwwICsxLDUxIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRhYmxlRm9ybWF0
dGluZ1N0YXRlLmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKwor
I2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFs
bG9jSW5saW5lcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsK
KworV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKFRhYmxlRm9ybWF0dGluZ1N0YXRlKTsKKwor
VGFibGVGb3JtYXR0aW5nU3RhdGU6OlRhYmxlRm9ybWF0dGluZ1N0YXRlKFJlZjxGbG9hdGluZ1N0
YXRlPiYmIGZsb2F0aW5nU3RhdGUsIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSwgY29uc3QgQ29u
dGFpbmVyQm94JiB0YWJsZUJveCkKKyAgICA6IEZvcm1hdHRpbmdTdGF0ZShXVEZNb3ZlKGZsb2F0
aW5nU3RhdGUpLCBUeXBlOjpUYWJsZSwgbGF5b3V0U3RhdGUpCisgICAgLCBtX3RhYmxlR3JpZChU
YWJsZUZvcm1hdHRpbmdDb250ZXh0OjplbnN1cmVUYWJsZUdyaWQodGFibGVCb3gpKQoreworfQor
CitUYWJsZUZvcm1hdHRpbmdTdGF0ZTo6flRhYmxlRm9ybWF0dGluZ1N0YXRlKCkKK3sKK30KKwor
fQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5oIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVG
b3JtYXR0aW5nU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43ZDFlNGFmMGI5NmFjYzRkMzQzNDVhYTljZjZk
ODNmNzhkNTNjNzZmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuaApA
QCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUo
TEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZvcm1hdHRpbmdTdGF0ZS5o
IgorI2luY2x1ZGUgIlRhYmxlR3JpZC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKyNp
bmNsdWRlIDx3dGYvVW5pcXVlUmVmLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFj
ZSBMYXlvdXQgeworCisvLyBUYWJsZUZvcm1hdHRpbmdTdGF0ZSBob2xkcyB0aGUgc3RhdGUgZm9y
IGEgcGFydGljdWxhciB0YWJsZSBmb3JtYXR0aW5nIGNvbnRleHQgdHJlZS4KK2NsYXNzIFRhYmxl
Rm9ybWF0dGluZ1N0YXRlIDogcHVibGljIEZvcm1hdHRpbmdTdGF0ZSB7CisgICAgV1RGX01BS0Vf
SVNPX0FMTE9DQVRFRChUYWJsZUZvcm1hdHRpbmdTdGF0ZSk7CitwdWJsaWM6CisgICAgVGFibGVG
b3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRlJiwgY29uc3Qg
Q29udGFpbmVyQm94JiB0YWJsZUJveCk7CisgICAgflRhYmxlRm9ybWF0dGluZ1N0YXRlKCk7CisK
KyAgICBUYWJsZUdyaWQmIHRhYmxlR3JpZCgpIHsgcmV0dXJuIG1fdGFibGVHcmlkOyB9CisgICAg
Y29uc3QgVGFibGVHcmlkJiB0YWJsZUdyaWQoKSBjb25zdCB7IHJldHVybiBtX3RhYmxlR3JpZDsg
fQorCitwcml2YXRlOgorICAgIFVuaXF1ZVJlZjxUYWJsZUdyaWQ+IG1fdGFibGVHcmlkOworfTsK
KworfQorfQorCitTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX1NUQVRF
KFRhYmxlRm9ybWF0dGluZ1N0YXRlLCBpc1RhYmxlRm9ybWF0dGluZ1N0YXRlKCkpCisKKyNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90
YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlR3JpZC5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
M2M0MWQ4ZDA4YTUyNWU3NTZhYmNkY2IxYTIxNWM5ZjQ2NTZhY2ZiNgotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0
aW5nL1RhYmxlR3JpZC5jcHAKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGFibGVHcmlkLmgiCisKKyNpZiBFTkFCTEUoTEFZT1VU
X0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9J
U09fQUxMT0NBVEVEX0lNUEwoVGFibGVHcmlkKTsKKworVGFibGVHcmlkOjpDb2x1bW46OkNvbHVt
bihjb25zdCBDb250YWluZXJCb3gqIGNvbHVtbkJveCkKKyAgICA6IG1fbGF5b3V0Qm94KG1ha2VX
ZWFrUHRyKGNvbHVtbkJveCkpCit7Cit9CisKK3ZvaWQgVGFibGVHcmlkOjpDb2x1bW46OnNldExv
Z2ljYWxXaWR0aChMYXlvdXRVbml0IGNvbXB1dGVkTG9naWNhbFdpZHRoKQoreworI2lmIEFTU0VS
VF9FTkFCTEVECisgICAgbV9oYXNDb21wdXRlZFdpZHRoID0gdHJ1ZTsKKyNlbmRpZgorICAgIG1f
Y29tcHV0ZWRMb2dpY2FsV2lkdGggPSBjb21wdXRlZExvZ2ljYWxXaWR0aDsKK30KKworTGF5b3V0
VW5pdCBUYWJsZUdyaWQ6OkNvbHVtbjo6bG9naWNhbFdpZHRoKCkgY29uc3QKK3sKKyAgICBBU1NF
UlQobV9oYXNDb21wdXRlZFdpZHRoKTsKKyAgICByZXR1cm4gbV9jb21wdXRlZExvZ2ljYWxXaWR0
aDsKK30KKwordm9pZCBUYWJsZUdyaWQ6OkNvbHVtbjo6c2V0TG9naWNhbExlZnQoTGF5b3V0VW5p
dCBjb21wdXRlZExvZ2ljYWxMZWZ0KQoreworI2lmIEFTU0VSVF9FTkFCTEVECisgICAgbV9oYXND
b21wdXRlZExlZnQgPSB0cnVlOworI2VuZGlmCisgICAgbV9jb21wdXRlZExvZ2ljYWxMZWZ0ID0g
Y29tcHV0ZWRMb2dpY2FsTGVmdDsKK30KKworTGF5b3V0VW5pdCBUYWJsZUdyaWQ6OkNvbHVtbjo6
bG9naWNhbExlZnQoKSBjb25zdAoreworICAgIEFTU0VSVChtX2hhc0NvbXB1dGVkTGVmdCk7Cisg
ICAgcmV0dXJuIG1fY29tcHV0ZWRMb2dpY2FsTGVmdDsKK30KKworYm9vbCBUYWJsZUdyaWQ6OkNv
bHVtbjo6aXNGaXhlZFdpZHRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaGFzRml4ZWRXaWR0aENl
bGwoKSB8fCAoYm94KCkgJiYgYm94KCktPmNvbHVtbldpZHRoKCkpOworfQorCit2b2lkIFRhYmxl
R3JpZDo6Q29sdW1uczo6YWRkQ29sdW1uKGNvbnN0IENvbnRhaW5lckJveCYgY29sdW1uQm94KQor
eworICAgIG1fY29sdW1uTGlzdC5hcHBlbmQoeyAmY29sdW1uQm94IH0pOworfQorCit2b2lkIFRh
YmxlR3JpZDo6Q29sdW1uczo6YWRkQW5vbnltb3VzQ29sdW1uKCkKK3sKKyAgICBtX2NvbHVtbkxp
c3QuYXBwZW5kKHsgbnVsbHB0ciB9KTsKK30KKworYm9vbCBUYWJsZUdyaWQ6OkNvbHVtbnM6Omhh
c0ZpeGVkQ29sdW1uc09ubHkoKSBjb25zdAoreworICAgIGZvciAoYXV0byYgY29sdW1uIDogbV9j
b2x1bW5MaXN0KSB7CisgICAgICAgIGlmICghY29sdW1uLmlzRml4ZWRXaWR0aCgpKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBU
YWJsZUdyaWQ6OlJvd3M6OmFkZFJvdyhjb25zdCBDb250YWluZXJCb3gmIHJvd0JveCkKK3sKKyAg
ICBtX3Jvd0xpc3QuYXBwZW5kKHsgcm93Qm94IH0pOworfQorCitUYWJsZUdyaWQ6OlJvdzo6Um93
KGNvbnN0IENvbnRhaW5lckJveCYgcm93Qm94KQorICAgIDogbV9sYXlvdXRCb3gobWFrZVdlYWtQ
dHIocm93Qm94KSkKK3sKK30KKworVGFibGVHcmlkOjpDZWxsOjpDZWxsKGNvbnN0IENvbnRhaW5l
ckJveCYgY2VsbEJveCwgU2xvdFBvc2l0aW9uIHBvc2l0aW9uLCBDZWxsU3BhbiBzcGFuKQorICAg
IDogbV9sYXlvdXRCb3gobWFrZVdlYWtQdHIoY2VsbEJveCkpCisgICAgLCBtX3Bvc2l0aW9uKHBv
c2l0aW9uKQorICAgICwgbV9zcGFuKHNwYW4pCit7Cit9CisKK2Jvb2wgVGFibGVHcmlkOjpDZWxs
Ojppc0ZpeGVkV2lkdGgoKSBjb25zdAoreworICAgIHJldHVybiBib3goKS5zdHlsZSgpLmxvZ2lj
YWxXaWR0aCgpLmlzRml4ZWQoKTsKK30KKworVGFibGVHcmlkOjpTbG90OjpTbG90KENlbGwmIGNl
bGwsIGJvb2wgaXNDb2x1bW5TcGFubmVkLCBib29sIGlzUm93U3Bhbm5lZCkKKyAgICA6IG1fY2Vs
bChtYWtlV2Vha1B0cihjZWxsKSkKKyAgICAsIG1faXNDb2x1bW5TcGFubmVkKGlzQ29sdW1uU3Bh
bm5lZCkKKyAgICAsIG1faXNSb3dTcGFubmVkKGlzUm93U3Bhbm5lZCkKK3sKK30KKworVGFibGVH
cmlkOjpUYWJsZUdyaWQoKQoreworfQorCitUYWJsZUdyaWQ6OlNsb3QqIFRhYmxlR3JpZDo6c2xv
dChTbG90UG9zaXRpb24gcG9zaXRpb24pCit7CisgICAgcmV0dXJuIG1fc2xvdE1hcC5nZXQocG9z
aXRpb24pOworfQorCit2b2lkIFRhYmxlR3JpZDo6YXBwZW5kQ2VsbChjb25zdCBDb250YWluZXJC
b3gmIGNlbGxCb3gpCit7CisgICAgYXV0byByb3dTcGFuID0gY2VsbEJveC5yb3dTcGFuKCk7Cisg
ICAgYXV0byBjb2x1bW5TcGFuID0gY2VsbEJveC5jb2x1bW5TcGFuKCk7CisgICAgYXV0byBpc0lu
TmV3Um93ID0gIWNlbGxCb3gucHJldmlvdXNTaWJsaW5nKCk7CisgICAgYXV0byBpbml0aWFsU2xv
dFBvc2l0aW9uID0gU2xvdFBvc2l0aW9uIHsgfTsKKworICAgIGlmICghbV9jZWxscy5pc0VtcHR5
KCkpIHsKKyAgICAgICAgYXV0byYgbGFzdENlbGwgPSBtX2NlbGxzLmxhc3QoKTsKKyAgICAgICAg
YXV0byBsYXN0U2xvdFBvc2l0aW9uID0gbGFzdENlbGwtPnBvc2l0aW9uKCk7CisgICAgICAgIC8v
IEZpcnN0IHRhYmxlIGNlbGwgaW4gdGhpcyByb3c/CisgICAgICAgIGlmIChpc0luTmV3Um93KQor
ICAgICAgICAgICAgaW5pdGlhbFNsb3RQb3NpdGlvbiA9IFNsb3RQb3NpdGlvbiB7IDAsIGxhc3RT
bG90UG9zaXRpb24ucm93ICsgMSB9OworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbml0aWFs
U2xvdFBvc2l0aW9uID0gU2xvdFBvc2l0aW9uIHsgbGFzdFNsb3RQb3NpdGlvbi5jb2x1bW4gKyAx
LCBsYXN0U2xvdFBvc2l0aW9uLnJvdyB9OworCisgICAgICAgIC8vIFBpY2sgdGhlIG5leHQgYXZh
aWxhYmxlIHNsb3QgYnkgYXZvaWRpbmcgcm93IGFuZCBjb2x1bW4gc3Bhbm5lcnMuCisgICAgICAg
IHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAoIW1fc2xvdE1hcC5jb250YWlucyhpbml0
aWFsU2xvdFBvc2l0aW9uKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICsr
aW5pdGlhbFNsb3RQb3NpdGlvbi5jb2x1bW47CisgICAgICAgIH0KKyAgICB9CisgICAgYXV0byBj
ZWxsID0gbWFrZVVuaXF1ZTxDZWxsPihjZWxsQm94LCBpbml0aWFsU2xvdFBvc2l0aW9uLCBDZWxs
U3BhbiB7IGNvbHVtblNwYW4sIHJvd1NwYW4gfSk7CisgICAgLy8gUm93IGFuZCBjb2x1bW4gc3Bh
bm5lcnMgY3JlYXRlIGFkZGl0aW9uYWwgc2xvdHMuCisgICAgZm9yIChzaXplX3Qgcm93ID0gMDsg
cm93IDwgcm93U3BhbjsgKytyb3cpIHsKKyAgICAgICAgZm9yIChhdXRvIGNvbHVtbiA9IGNlbGwt
PnN0YXJ0Q29sdW1uKCk7IGNvbHVtbiA8IGNlbGwtPmVuZENvbHVtbigpOyArK2NvbHVtbikgewor
ICAgICAgICAgICAgYXV0byBwb3NpdGlvbiA9IFNsb3RQb3NpdGlvbiB7IGNvbHVtbiwgY2VsbC0+
c3RhcnRSb3coKSArIHJvdyB9OworICAgICAgICAgICAgQVNTRVJUKCFtX3Nsb3RNYXAuY29udGFp
bnMocG9zaXRpb24pKTsKKyAgICAgICAgICAgIC8vIFRoaXMgc2xvdCBpcyBzcGFubmVkIGJ5IGEg
Y2VsbCBhdCB0aGUgaW5pdGlhbCBzbG93IHBvc2l0aW9uLgorICAgICAgICAgICAgYXV0byBpc0Nv
bHVtblNwYW5uZWQgPSBjb2x1bW4gIT0gY2VsbC0+c3RhcnRDb2x1bW4oKTsKKyAgICAgICAgICAg
IGF1dG8gaXNSb3dTcGFubmVkID0gISFyb3c7CisgICAgICAgICAgICBtX3Nsb3RNYXAuYWRkKHBv
c2l0aW9uLCBtYWtlVW5pcXVlPFNsb3Q+KCpjZWxsLCBpc0NvbHVtblNwYW5uZWQsIGlzUm93U3Bh
bm5lZCkpOworICAgICAgICB9CisgICAgfQorICAgIC8vIEluaXRpYWxpemUgY29sdW1ucy9yb3dz
IGlmIG5lZWRlZC4KKyAgICBhdXRvIG1pc3NpbmdOdW1iZXJPZkNvbHVtbnMgPSBzdGQ6Om1heDxp
bnQ+KDAsIGluaXRpYWxTbG90UG9zaXRpb24uY29sdW1uICsgY29sdW1uU3BhbiAtIG1fY29sdW1u
cy5zaXplKCkpOworICAgIGZvciAoYXV0byBjb2x1bW4gPSAwOyBjb2x1bW4gPCBtaXNzaW5nTnVt
YmVyT2ZDb2x1bW5zOyArK2NvbHVtbikKKyAgICAgICAgbV9jb2x1bW5zLmFkZEFub255bW91c0Nv
bHVtbigpOworCisgICAgaWYgKGNlbGwtPmlzRml4ZWRXaWR0aCgpKSB7CisgICAgICAgIGZvciAo
YXV0byBjb2x1bW4gPSBjZWxsLT5zdGFydENvbHVtbigpOyBjb2x1bW4gPCBjZWxsLT5lbmRDb2x1
bW4oKTsgKytjb2x1bW4pCisgICAgICAgICAgICBtX2NvbHVtbnMubGlzdCgpW2NvbHVtbl0uc2V0
SGFzRml4ZWRXaWR0aENlbGwoKTsKKyAgICB9CisKKyAgICBpZiAoaXNJbk5ld1JvdykKKyAgICAg
ICAgbV9yb3dzLmFkZFJvdyhjZWxsQm94LnBhcmVudCgpKTsKKworICAgIG1fY2VsbHMuYWRkKFdU
Rk1vdmUoY2VsbCkpOworfQorCit2b2lkIFRhYmxlR3JpZDo6aW5zZXJ0Q2VsbChjb25zdCBDb250
YWluZXJCb3gmIGNlbGxCb3gsIGNvbnN0IENvbnRhaW5lckJveCYgYmVmb3JlKQoreworICAgIFVO
VVNFRF9QQVJBTShjZWxsQm94KTsKKyAgICBVTlVTRURfUEFSQU0oYmVmb3JlKTsKK30KKwordm9p
ZCBUYWJsZUdyaWQ6OnJlbW92ZUNlbGwoY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94KQorewor
ICAgIFVOVVNFRF9QQVJBTShjZWxsQm94KTsKK30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGlu
Zy9UYWJsZUdyaWQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
dGFibGVmb3JtYXR0aW5nL1RhYmxlR3JpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjYyNWEzZjQ0YmY2MjIxY2U0
NjUyNTk0MDkxM2VjZTEwYjA2YWFjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuaApA
QCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxF
KExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4
dC5oIgorI2luY2x1ZGUgIkxheW91dFVuaXRzLmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4K
KyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGlu
ZXMuaD4KKyNpbmNsdWRlIDx3dGYvTGlzdEhhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvV2Vha1B0
ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKK2NsYXNzIEJv
eDsKK2NsYXNzIENvbnRhaW5lckJveDsKKworY2xhc3MgVGFibGVHcmlkIHsKKyAgICBXVEZfTUFL
RV9JU09fQUxMT0NBVEVEKFRhYmxlR3JpZCk7CitwdWJsaWM6CisgICAgVGFibGVHcmlkKCk7CisK
KyAgICB2b2lkIGFwcGVuZENlbGwoY29uc3QgQ29udGFpbmVyQm94Jik7CisgICAgdm9pZCBpbnNl
cnRDZWxsKGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IENvbnRhaW5lckJveCYgYmVmb3JlKTsK
KyAgICB2b2lkIHJlbW92ZUNlbGwoY29uc3QgQ29udGFpbmVyQm94Jik7CisKKyAgICB2b2lkIHNl
dEhvcml6b250YWxTcGFjaW5nKExheW91dFVuaXQgaG9yaXpvbnRhbFNwYWNpbmcpIHsgbV9ob3Jp
em9udGFsU3BhY2luZyA9IGhvcml6b250YWxTcGFjaW5nOyB9CisgICAgTGF5b3V0VW5pdCBob3Jp
em9udGFsU3BhY2luZygpIGNvbnN0IHsgcmV0dXJuIG1faG9yaXpvbnRhbFNwYWNpbmc7IH0KKwor
ICAgIHZvaWQgc2V0VmVydGljYWxTcGFjaW5nKExheW91dFVuaXQgdmVydGljYWxTcGFjaW5nKSB7
IG1fdmVydGljYWxTcGFjaW5nID0gdmVydGljYWxTcGFjaW5nOyB9CisgICAgTGF5b3V0VW5pdCB2
ZXJ0aWNhbFNwYWNpbmcoKSBjb25zdCB7IHJldHVybiBtX3ZlcnRpY2FsU3BhY2luZzsgfQorCisg
ICAgdm9pZCBzZXRDb2xsYXBzZWRCb3JkZXIoY29uc3QgRWRnZXMmIGNvbGxhcHNlZEJvcmRlcikg
eyBtX2NvbGxhcHNlZEJvcmRlciA9IGNvbGxhcHNlZEJvcmRlcjsgfQorICAgIE9wdGlvbmFsPEVk
Z2VzPiBjb2xsYXBzZWRCb3JkZXIoKSBjb25zdCB7IHJldHVybiBtX2NvbGxhcHNlZEJvcmRlcjsg
fQorCisgICAgdm9pZCBzZXRXaWR0aENvbnN0cmFpbnRzKEZvcm1hdHRpbmdDb250ZXh0OjpJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMpIHsgbV9pbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzID0gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsgfQorICAg
IE9wdGlvbmFsPEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzPiB3
aWR0aENvbnN0cmFpbnRzKCkgY29uc3QgeyByZXR1cm4gbV9pbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzOyB9CisKKyAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX3Nsb3RNYXAuaXNF
bXB0eSgpOyB9CisgICAgLy8gQ29sdW1uIHJlcHJlc2VudHMgYSB2ZXJ0aWNhbCBzZXQgb2Ygc2xv
dHMgaW4gdGhlIGdyaWQuIEEgY29sdW1uIGhhcyBob3Jpem9udGFsIHBvc2l0aW9uIGFuZCB3aWR0
aC4KKyAgICBjbGFzcyBDb2x1bW4geworICAgIHB1YmxpYzoKKyAgICAgICAgQ29sdW1uKGNvbnN0
IENvbnRhaW5lckJveCopOworCisgICAgICAgIHZvaWQgc2V0TG9naWNhbExlZnQoTGF5b3V0VW5p
dCk7CisgICAgICAgIExheW91dFVuaXQgbG9naWNhbExlZnQoKSBjb25zdDsKKyAgICAgICAgTGF5
b3V0VW5pdCBsb2dpY2FsUmlnaHQoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsTGVmdCgpICsgbG9n
aWNhbFdpZHRoKCk7IH0KKyAgICAgICAgdm9pZCBzZXRMb2dpY2FsV2lkdGgoTGF5b3V0VW5pdCk7
CisgICAgICAgIExheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3Q7CisKKyAgICAgICAgYm9v
bCBpc0ZpeGVkV2lkdGgoKSBjb25zdDsKKworICAgICAgICB2b2lkIHNldEhhc0ZpeGVkV2lkdGhD
ZWxsKCkgeyBtX2hhc0ZpeGVkV2lkdGhDZWxsID0gdHJ1ZTsgfQorICAgICAgICBjb25zdCBDb250
YWluZXJCb3gqIGJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGF5b3V0Qm94LmdldCgpOyB9CisKKyAg
ICBwcml2YXRlOgorICAgICAgICBib29sIGhhc0ZpeGVkV2lkdGhDZWxsKCkgY29uc3QgeyByZXR1
cm4gbV9oYXNGaXhlZFdpZHRoQ2VsbDsgfQorCisgICAgICAgIExheW91dFVuaXQgbV9jb21wdXRl
ZExvZ2ljYWxXaWR0aDsKKyAgICAgICAgTGF5b3V0VW5pdCBtX2NvbXB1dGVkTG9naWNhbExlZnQ7
CisgICAgICAgIFdlYWtQdHI8Y29uc3QgQ29udGFpbmVyQm94PiBtX2xheW91dEJveDsKKyAgICAg
ICAgYm9vbCBtX2hhc0ZpeGVkV2lkdGhDZWxsIHsgZmFsc2UgfTsKKworI2lmIEFTU0VSVF9FTkFC
TEVECisgICAgICAgIGJvb2wgbV9oYXNDb21wdXRlZFdpZHRoIHsgZmFsc2UgfTsKKyAgICAgICAg
Ym9vbCBtX2hhc0NvbXB1dGVkTGVmdCB7IGZhbHNlIH07CisjZW5kaWYKKyAgICB9OworCisgICAg
Y2xhc3MgQ29sdW1ucyB7CisgICAgcHVibGljOgorICAgICAgICB1c2luZyBDb2x1bW5MaXN0ID0g
VmVjdG9yPENvbHVtbj47CisgICAgICAgIENvbHVtbkxpc3QmIGxpc3QoKSB7IHJldHVybiBtX2Nv
bHVtbkxpc3Q7IH0KKyAgICAgICAgY29uc3QgQ29sdW1uTGlzdCYgbGlzdCgpIGNvbnN0IHsgcmV0
dXJuIG1fY29sdW1uTGlzdDsgfQorICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJu
IG1fY29sdW1uTGlzdC5zaXplKCk7IH0KKworICAgICAgICB2b2lkIGFkZENvbHVtbihjb25zdCBD
b250YWluZXJCb3gmKTsKKyAgICAgICAgdm9pZCBhZGRBbm9ueW1vdXNDb2x1bW4oKTsKKworICAg
ICAgICBMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fY29sdW1uTGlz
dC5sYXN0KCkubG9naWNhbFJpZ2h0KCkgLSBtX2NvbHVtbkxpc3QuZmlyc3QoKS5sb2dpY2FsTGVm
dCgpOyB9CisgICAgICAgIGJvb2wgaGFzRml4ZWRDb2x1bW5zT25seSgpIGNvbnN0OworCisgICAg
cHJpdmF0ZToKKyAgICAgICAgQ29sdW1uTGlzdCBtX2NvbHVtbkxpc3Q7CisgICAgfTsKKworICAg
IGNsYXNzIFJvdyB7CisgICAgcHVibGljOgorICAgICAgICBSb3coY29uc3QgQ29udGFpbmVyQm94
Jik7CisKKyAgICAgICAgdm9pZCBzZXRMb2dpY2FsVG9wKExheW91dFVuaXQgbG9naWNhbFRvcCkg
eyBtX2xvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wOyB9CisgICAgICAgIExheW91dFVuaXQgbG9naWNh
bFRvcCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFRvcDsgfQorICAgICAgICBMYXlvdXRVbml0
IGxvZ2ljYWxCb3R0b20oKSBjb25zdCB7IHJldHVybiBsb2dpY2FsVG9wKCkgKyBsb2dpY2FsSGVp
Z2h0KCk7IH0KKworICAgICAgICB2b2lkIHNldExvZ2ljYWxIZWlnaHQoTGF5b3V0VW5pdCBsb2dp
Y2FsSGVpZ2h0KSB7IG1fbG9naWNhbEhlaWdodCA9IGxvZ2ljYWxIZWlnaHQ7IH0KKyAgICAgICAg
TGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsSGVpZ2h0
OyB9CisKKyAgICAgICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5l
KSB7IG1fYmFzZWxpbmUgPSBiYXNlbGluZTsgfQorICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJh
c2VsaW5lKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlbGluZTsgfQorCisgICAgICAgIGNvbnN0IENv
bnRhaW5lckJveCYgYm94KCkgY29uc3QgeyByZXR1cm4gKm1fbGF5b3V0Qm94LmdldCgpOyB9CisK
KyAgICBwcml2YXRlOgorICAgICAgICBMYXlvdXRVbml0IG1fbG9naWNhbFRvcDsKKyAgICAgICAg
TGF5b3V0VW5pdCBtX2xvZ2ljYWxIZWlnaHQ7CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9i
YXNlbGluZSB7IDAgfTsKKyAgICAgICAgV2Vha1B0cjxjb25zdCBDb250YWluZXJCb3g+IG1fbGF5
b3V0Qm94OworICAgIH07CisKKyAgICBjbGFzcyBSb3dzIHsKKyAgICBwdWJsaWM6CisgICAgICAg
IHVzaW5nIFJvd0xpc3QgPSBWZWN0b3I8Um93PjsKKyAgICAgICAgUm93TGlzdCYgbGlzdCgpIHsg
cmV0dXJuIG1fcm93TGlzdDsgfQorICAgICAgICBjb25zdCBSb3dMaXN0JiBsaXN0KCkgY29uc3Qg
eyByZXR1cm4gbV9yb3dMaXN0OyB9CisKKyAgICAgICAgdm9pZCBhZGRSb3coY29uc3QgQ29udGFp
bmVyQm94Jik7CisKKyAgICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3Jvd0xp
c3Quc2l6ZSgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBSb3dMaXN0IG1fcm93TGlzdDsK
KyAgICB9OworCisgICAgLy8gQ2VsbCByZXByZXNlbnRzIGEgPHRkPiBvciA8dGg+LiBJdCBjYW4g
c3BhbiBtdWx0aXBsZSBzbG90cyBpbiB0aGUgZ3JpZC4KKyAgICBjbGFzcyBDZWxsIDogcHVibGlj
IENhbk1ha2VXZWFrUHRyPENlbGw+IHsKKyAgICAgICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9J
TkxJTkUoQ2VsbCk7CisgICAgcHVibGljOgorICAgICAgICBDZWxsKGNvbnN0IENvbnRhaW5lckJv
eCYsIFNsb3RQb3NpdGlvbiwgQ2VsbFNwYW4pOworCisgICAgICAgIHNpemVfdCBzdGFydENvbHVt
bigpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb24uY29sdW1uOyB9CisgICAgICAgIHNpemVfdCBl
bmRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aW9uLmNvbHVtbiArIG1fc3Bhbi5jb2x1
bW47IH0KKworICAgICAgICBzaXplX3Qgc3RhcnRSb3coKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0
aW9uLnJvdzsgfQorICAgICAgICBzaXplX3QgZW5kUm93KCkgY29uc3QgeyByZXR1cm4gbV9wb3Np
dGlvbi5yb3cgKyBtX3NwYW4ucm93OyB9CisKKyAgICAgICAgc2l6ZV90IGNvbHVtblNwYW4oKSBj
b25zdCB7IHJldHVybiBtX3NwYW4uY29sdW1uOyB9CisgICAgICAgIHNpemVfdCByb3dTcGFuKCkg
Y29uc3QgeyByZXR1cm4gbV9zcGFuLnJvdzsgfQorCisgICAgICAgIFNsb3RQb3NpdGlvbiBwb3Np
dGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb247IH0KKyAgICAgICAgQ2VsbFNwYW4gc3Bh
bigpIGNvbnN0IHsgcmV0dXJuIG1fc3BhbjsgfQorCisgICAgICAgIHZvaWQgc2V0QmFzZWxpbmUo
SW5saW5lTGF5b3V0VW5pdCBiYXNlbGluZSkgeyBtX2Jhc2VsaW5lID0gYmFzZWxpbmU7IH0KKyAg
ICAgICAgSW5saW5lTGF5b3V0VW5pdCBiYXNlbGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fYmFzZWxp
bmU7IH0KKworICAgICAgICBib29sIGlzRml4ZWRXaWR0aCgpIGNvbnN0OworCisgICAgICAgIGNv
bnN0IENvbnRhaW5lckJveCYgYm94KCkgY29uc3QgeyByZXR1cm4gKm1fbGF5b3V0Qm94LmdldCgp
OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBXZWFrUHRyPGNvbnN0IENvbnRhaW5lckJveD4g
bV9sYXlvdXRCb3g7CisgICAgICAgIFNsb3RQb3NpdGlvbiBtX3Bvc2l0aW9uOworICAgICAgICBD
ZWxsU3BhbiBtX3NwYW47CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9iYXNlbGluZSB7IDAg
fTsKKyAgICB9OworCisgICAgY2xhc3MgU2xvdCB7CisgICAgcHVibGljOgorICAgICAgICBXVEZf
TUFLRV9TVFJVQ1RfRkFTVF9BTExPQ0FURUQ7CisgICAgICAgIFNsb3QoKSA9IGRlZmF1bHQ7Cisg
ICAgICAgIFNsb3QoQ2VsbCYsIGJvb2wgaXNDb2x1bW5TcGFubmVkLCBib29sIGlzUm93U3Bhbm5l
ZCk7CisKKyAgICAgICAgY29uc3QgQ2VsbCYgY2VsbCgpIGNvbnN0IHsgcmV0dXJuICptX2NlbGw7
IH0KKyAgICAgICAgQ2VsbCYgY2VsbCgpIHsgcmV0dXJuICptX2NlbGw7IH0KKworICAgICAgICBj
b25zdCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgd2lkdGhD
b25zdHJhaW50cygpIGNvbnN0IHsgcmV0dXJuIG1fd2lkdGhDb25zdHJhaW50czsgfQorICAgICAg
ICB2b2lkIHNldFdpZHRoQ29uc3RyYWludHMoY29uc3QgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMmIHdpZHRoQ29uc3RyYWludHMpIHsgbV93aWR0aENvbnN0cmFp
bnRzID0gd2lkdGhDb25zdHJhaW50czsgfQorCisgICAgICAgIC8vIEluaXRpYWwgc2xvdCBwb3Np
dGlvbiBmb3IgYSBzcGFubmluZyBjZWxsLgorICAgICAgICAvLyA8dGQ+PC90ZD48dGQgY29sc3Bh
bj0yPjwvdGQ+IFsxLCAwXSBzbG90IGhhcyBjb2x1bW4gc3BhbiBvZiAyLgorICAgICAgICBib29s
IGhhc0NvbHVtblNwYW4oKSBjb25zdCB7IHJldHVybiBtX2NlbGwtPmNvbHVtblNwYW4oKSA+IDEg
JiYgIWlzQ29sdW1uU3Bhbm5lZCgpOyB9CisgICAgICAgIGJvb2wgaGFzUm93U3BhbigpIGNvbnN0
IHsgcmV0dXJuIG1fY2VsbC0+cm93U3BhbigpID4gMSAmJiAhaXNSb3dTcGFubmVkKCk7IH0KKwor
ICAgICAgICAvLyBOb24taW5pdGlhbCBzcGFubmVkIHNsb3QuCisgICAgICAgIC8vIDx0ZD48L3Rk
Pjx0ZCBjb2xzcGFuPTI+PC90ZD4gWzIsIDBdIHNsb3QgaXMgY29sdW1uIHNwYW5uZWQgYnkgWzEs
IDBdLgorICAgICAgICAvLyA8dGQ+PC90ZD48dGQ+PC90ZD48dGQ+PC90ZD4KKyAgICAgICAgYm9v
bCBpc0NvbHVtblNwYW5uZWQoKSBjb25zdCB7IHJldHVybiBtX2lzQ29sdW1uU3Bhbm5lZDsgfQor
ICAgICAgICBib29sIGlzUm93U3Bhbm5lZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNSb3dTcGFubmVk
OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBXZWFrUHRyPENlbGw+IG1fY2VsbDsKKyAgICAg
ICAgYm9vbCBtX2lzQ29sdW1uU3Bhbm5lZCB7IGZhbHNlIH07CisgICAgICAgIGJvb2wgbV9pc1Jv
d1NwYW5uZWQgeyBmYWxzZSB9OworICAgICAgICBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2lj
V2lkdGhDb25zdHJhaW50cyBtX3dpZHRoQ29uc3RyYWludHM7CisgICAgfTsKKworICAgIGNvbnN0
IENvbHVtbnMmIGNvbHVtbnMoKSBjb25zdCB7IHJldHVybiBtX2NvbHVtbnM7IH0KKyAgICBDb2x1
bW5zJiBjb2x1bW5zKCkgeyByZXR1cm4gbV9jb2x1bW5zOyB9CisKKyAgICBjb25zdCBSb3dzJiBy
b3dzKCkgY29uc3QgeyByZXR1cm4gbV9yb3dzOyB9CisgICAgUm93cyYgcm93cygpIHsgcmV0dXJu
IG1fcm93czsgfQorCisgICAgdXNpbmcgQ2VsbHMgPSBXVEY6Okxpc3RIYXNoU2V0PHN0ZDo6dW5p
cXVlX3B0cjxDZWxsPj47CisgICAgQ2VsbHMmIGNlbGxzKCkgeyByZXR1cm4gbV9jZWxsczsgfQor
CisgICAgU2xvdCogc2xvdChTbG90UG9zaXRpb24pOworICAgIGNvbnN0IFNsb3QqIHNsb3QoU2xv
dFBvc2l0aW9uIHBvc2l0aW9uKSBjb25zdCB7IHJldHVybiBtX3Nsb3RNYXAuZ2V0KHBvc2l0aW9u
KTsgfQorICAgIGJvb2wgaXNTcGFubmVkKFNsb3RQb3NpdGlvbik7CisKK3ByaXZhdGU6CisgICAg
dXNpbmcgU2xvdE1hcCA9IFdURjo6SGFzaE1hcDxTbG90UG9zaXRpb24sIHN0ZDo6dW5pcXVlX3B0
cjxTbG90Pj47CisKKyAgICBDb2x1bW5zIG1fY29sdW1uczsKKyAgICBSb3dzIG1fcm93czsKKyAg
ICBDZWxscyBtX2NlbGxzOworICAgIFNsb3RNYXAgbV9zbG90TWFwOworCisgICAgTGF5b3V0VW5p
dCBtX2hvcml6b250YWxTcGFjaW5nOworICAgIExheW91dFVuaXQgbV92ZXJ0aWNhbFNwYWNpbmc7
CisgICAgT3B0aW9uYWw8Rm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHM+IG1faW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKKyAgICBPcHRpb25hbDxFZGdlcz4gbV9j
b2xsYXBzZWRCb3JkZXI7Cit9OworCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVM
YXlvdXQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJs
ZWZvcm1hdHRpbmcvVGFibGVMYXlvdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjIzMzUyYzVhMTdmOGMwYjNk
M2QyNDRlOTI1YTdlZjI0ODE5OGE4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUxheW91dC5j
cHAKQEAgLTAsMCArMSwzMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9G
T1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJM
YXlvdXRCb3hHZW9tZXRyeS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5
b3V0IHsKKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10YWJsZXMtMy8jdGFibGUtbGF5
b3V0LWFsZ29yaXRobQorVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6VGFibGVMYXlvdXQ6OlRhYmxl
TGF5b3V0KGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0LCBj
b25zdCBUYWJsZUdyaWQmIGdyaWQpCisgICAgOiBtX2Zvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRp
bmdDb250ZXh0KQorICAgICwgbV9ncmlkKGdyaWQpCit7Cit9CisKK3N0cnVjdCBDb2x1bW5TcGFu
IHsKKyAgICBzdGF0aWMgc2l6ZV90IGhhc1NwYW4oY29uc3QgVGFibGVHcmlkOjpTbG90JiBzbG90
KSB7IHJldHVybiBzbG90Lmhhc0NvbHVtblNwYW4oKTsgfQorICAgIHN0YXRpYyBzaXplX3QgaXNT
cGFubmVkKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCkgeyByZXR1cm4gc2xvdC5pc0NvbHVt
blNwYW5uZWQoKTsgfQorCisgICAgc3RhdGljIHNpemVfdCBzcGFuQ291bnQoY29uc3QgVGFibGVH
cmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBjZWxsLmNvbHVtblNwYW4oKTsgfQorICAgIHN0YXRp
YyBzaXplX3Qgc3RhcnRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4g
Y2VsbC5zdGFydENvbHVtbigpOyB9CisgICAgc3RhdGljIHNpemVfdCBlbmRTcGFuKGNvbnN0IFRh
YmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5lbmRDb2x1bW4oKTsgfQorCisgICAg
c3RhdGljIHNpemVfdCBpbmRleChzaXplX3QgY29sdW1uSW5kZXgsIHNpemVfdCAvKnJvd0luZGV4
Ki8pIHsgcmV0dXJuIGNvbHVtbkluZGV4OyB9CisgICAgc3RhdGljIHNpemVfdCBzaXplKGNvbnN0
IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5jb2x1bW5zKCkuc2l6ZSgpOyB9CisKKyAg
ICBzdGF0aWMgTGF5b3V0VW5pdCBzcGFjaW5nKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1
cm4gZ3JpZC5ob3Jpem9udGFsU3BhY2luZygpOyB9Cit9OworCitzdHJ1Y3QgUm93U3BhbiB7Cisg
ICAgc3RhdGljIHNpemVfdCBoYXNTcGFuKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCkgeyBy
ZXR1cm4gc2xvdC5oYXNSb3dTcGFuKCk7IH0KKyAgICBzdGF0aWMgc2l6ZV90IGlzU3Bhbm5lZChj
b25zdCBUYWJsZUdyaWQ6OlNsb3QmIHNsb3QpIHsgcmV0dXJuIHNsb3QuaXNSb3dTcGFubmVkKCk7
IH0KKworICAgIHN0YXRpYyBzaXplX3Qgc3BhbkNvdW50KGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYg
Y2VsbCkgeyByZXR1cm4gY2VsbC5yb3dTcGFuKCk7IH0KKyAgICBzdGF0aWMgc2l6ZV90IHN0YXJ0
U3Bhbihjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJuIGNlbGwuc3RhcnRSb3co
KTsgfQorICAgIHN0YXRpYyBzaXplX3QgZW5kU3Bhbihjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNl
bGwpIHsgcmV0dXJuIGNlbGwuZW5kUm93KCk7IH0KKworICAgIHN0YXRpYyBzaXplX3QgaW5kZXgo
c2l6ZV90IC8qY29sdW1uSW5kZXgqLywgc2l6ZV90IHJvd0luZGV4KSB7IHJldHVybiByb3dJbmRl
eDsgfQorICAgIHN0YXRpYyBzaXplX3Qgc2l6ZShjb25zdCBUYWJsZUdyaWQmIGdyaWQpIHsgcmV0
dXJuIGdyaWQucm93cygpLnNpemUoKTsgfQorCisgICAgc3RhdGljIExheW91dFVuaXQgc3BhY2lu
Zyhjb25zdCBUYWJsZUdyaWQmIGdyaWQpIHsgcmV0dXJuIGdyaWQudmVydGljYWxTcGFjaW5nKCk7
IH0KK307CisKK3N0cnVjdCBHcmlkU3BhY2UgeworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsg
cmV0dXJuICF2YWx1ZTsgfQorCisgICAgLy8gSW5pdGlhbCB3aWR0aC9oZWlnaHQgZm9yIGNvbHVt
bi9yb3cgd2Ugc3RhcnQgdGhlIGRpc3RyaWJ1dGlvbiB3aWR0aCAodXN1YWxseSBhIG1pbnVtdW0g
d2lkdGgpLgorICAgIGZsb2F0IHZhbHVlIHsgMCB9OworICAgIC8vIFRoZSBiYXNlIHRvIGNvbXB1
dGUgdGhlIGRpc3RyaWJ1dGlvbiByYXRpby4gSXQgbm9ybWFsbHkgbWF0Y2hlcyB0aGUgW3ZhbHVl
XSBidXQgaW4gc29tZSBjYXNlcyB3ZSB1c2UgdGhlIG1heGltdW0gdmFsdWUgdG8gZGlzdHJpYnV0
ZSB0aGUgZXh0cmEgc3BhY2UuIAorICAgIGZsb2F0IGRpc3RyaWJ1dGlvbkJhc2UgeyAwIH07Cit9
OworCitpbmxpbmUgc3RhdGljIEdyaWRTcGFjZSBtYXgoY29uc3QgR3JpZFNwYWNlJiBhLCBjb25z
dCBHcmlkU3BhY2UmIGIpCit7CisgICAgcmV0dXJuIHsgc3RkOjptYXgoYS52YWx1ZSwgYi52YWx1
ZSksIHN0ZDo6bWF4KGEuZGlzdHJpYnV0aW9uQmFzZSwgYi5kaXN0cmlidXRpb25CYXNlKSB9Owor
fQorCitpbmxpbmUgc3RhdGljIEdyaWRTcGFjZSYgb3BlcmF0b3ItKEdyaWRTcGFjZSYgYSwgY29u
c3QgR3JpZFNwYWNlJiBiKQoreworICAgIGEudmFsdWUgPSBzdGQ6Om1heCgwLjBmLCBhLnZhbHVl
IC0gYi52YWx1ZSk7CisgICAgYS5kaXN0cmlidXRpb25CYXNlID0gc3RkOjptYXgoMC4wZiwgYS5k
aXN0cmlidXRpb25CYXNlIC0gYi5kaXN0cmlidXRpb25CYXNlKTsKKyAgICByZXR1cm4gYTsKK30K
KworaW5saW5lIHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJhdG9yKz0oR3JpZFNwYWNlJiBhLCBjb25z
dCBHcmlkU3BhY2UmIGIpCit7CisgICAgYS52YWx1ZSArPSBiLnZhbHVlOworICAgIGEuZGlzdHJp
YnV0aW9uQmFzZSArPSBiLmRpc3RyaWJ1dGlvbkJhc2U7CisgICAgcmV0dXJuIGE7Cit9CisKK2lu
bGluZSBzdGF0aWMgR3JpZFNwYWNlJiBvcGVyYXRvci09KEdyaWRTcGFjZSYgYSwgY29uc3QgR3Jp
ZFNwYWNlJiBiKQoreworICAgIHJldHVybiBhIC0gYjsKK30KKworaW5saW5lIHN0YXRpYyBHcmlk
U3BhY2UmIG9wZXJhdG9yLyhHcmlkU3BhY2UmIGEsIHVuc2lnbmVkIHZhbHVlKQoreworICAgIGEu
dmFsdWUgLz0gdmFsdWU7CisgICAgYS5kaXN0cmlidXRpb25CYXNlIC89IHZhbHVlOworICAgIHJl
dHVybiBhOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BhblR5cGU+CitzdGF0aWMgVmVjdG9y
PExheW91dFVuaXQ+IGRpc3RyaWJ1dGVBdmFpbGFibGVTcGFjZShjb25zdCBUYWJsZUdyaWQmIGdy
aWQsIExheW91dFVuaXQgYXZhaWxhYmxlU3BhY2UsIGNvbnN0IFdURjo6RnVuY3Rpb248R3JpZFNw
YWNlKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYsIHNpemVfdCk+JiBzbG90U3BhY2UpCit7CisgICAg
c3RydWN0IFJlc29sdmVkSXRlbSB7CisgICAgICAgIEdyaWRTcGFjZSBzbG90U3BhY2U7CisgICAg
ICAgIGJvb2wgaXNGaXhlZCB7IGZhbHNlIH07CisgICAgfTsKKworICAgIGF1dG8mIGNvbHVtbnMg
PSBncmlkLmNvbHVtbnMoKTsKKyAgICBhdXRvJiByb3dzID0gZ3JpZC5yb3dzKCk7CisgICAgLy8g
MS4gQ29sbGVjdCB0aGUgbm9uLXNwYW5uaW5nIHNwYWNlcyBmaXJzdC4gVGhleSBhcmUgdXNlZCBm
b3IgdGhlIGZpbmFsIGRpc3RyaWJ1dGlvbiBhcyB3ZWxsIGFzIGZvciBkaXN0cmlidXRpbmcgdGhl
IHNwYW5uaW5nIHNwYWNlLgorICAgIFZlY3RvcjxPcHRpb25hbDxSZXNvbHZlZEl0ZW0+PiByZXNv
bHZlZEl0ZW1zKFNwYW5UeXBlOjpzaXplKGdyaWQpKTsKKyAgICBmb3IgKHNpemVfdCBjb2x1bW5J
bmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29sdW1uSW5kZXgpIHsK
KyAgICAgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgp
OyArK3Jvd0luZGV4KSB7CisgICAgICAgICAgICBhdXRvJiBzbG90ID0gKmdyaWQuc2xvdCh7IGNv
bHVtbkluZGV4LCByb3dJbmRleCB9KTsKKyAgICAgICAgICAgIGlmIChTcGFuVHlwZTo6aGFzU3Bh
bihzbG90KSB8fCBTcGFuVHlwZTo6aXNTcGFubmVkKHNsb3QpKQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgYXV0byBpbmRleCA9IFNwYW5UeXBlOjppbmRleChjb2x1bW5J
bmRleCwgcm93SW5kZXgpOworICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEl0ZW1zW2luZGV4XSkK
KyAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1zW2luZGV4XSA9IFJlc29sdmVkSXRlbSB7IH07
CisgICAgICAgICAgICByZXNvbHZlZEl0ZW1zW2luZGV4XS0+c2xvdFNwYWNlID0gbWF4KHJlc29s
dmVkSXRlbXNbaW5kZXhdLT5zbG90U3BhY2UsIHNsb3RTcGFjZShzbG90LCBpbmRleCkpOworICAg
ICAgICB9CisgICAgfQorCisgICAgLy8gMi4gQ29sbGVjdCB0aGUgc3Bhbm5pbmcgY2VsbHMuCisg
ICAgc3RydWN0IFNwYW5uaW5nQ2VsbCB7CisgICAgICAgIFNsb3RQb3NpdGlvbiBwb3NpdGlvbjsK
KyAgICAgICAgR3JpZFNwYWNlIHVucmVzb2x2ZWRTcGFjZTsKKyAgICB9OworICAgIFZlY3RvcjxT
cGFubmluZ0NlbGw+IHNwYW5uaW5nQ2VsbHM7CisgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAw
OyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7CisgICAgICAgIGZvciAoc2l6
ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1bW5zLnNpemUoKTsgKytjb2x1
bW5JbmRleCkgeworICAgICAgICAgICAgYXV0byYgc2xvdCA9ICpncmlkLnNsb3QoeyBjb2x1bW5J
bmRleCwgcm93SW5kZXggfSk7CisgICAgICAgICAgICBpZiAoU3BhblR5cGU6Omhhc1NwYW4oc2xv
dCkpCisgICAgICAgICAgICAgICAgc3Bhbm5pbmdDZWxscy5hcHBlbmQoeyB7IGNvbHVtbkluZGV4
LCByb3dJbmRleCB9LCBzbG90U3BhY2Uoc2xvdCwgU3BhblR5cGU6OmluZGV4KGNvbHVtbkluZGV4
LCByb3dJbmRleCkpIH0pOworICAgICAgICB9CisgICAgfQorICAgIC8vIFdlIG5lZWQgdGhlc2Ug
c3Bhbm5pbmcgY2VsbHMgaW4gdGhlIG9yZGVyIG9mIHRoZSBudW1iZXIgb2YgY29sdW1ucy9yb3dz
IHRoZXkgc3BhbiBzbyB0aGF0CisgICAgLy8gd2UgY2FuIHJlc29sdmUgb3ZlcmxhcHBpbmcgc3Bh
bnMgc3RhcnRpbmcgd2l0aCB0aGUgc2hvcnRlciBvbmVzIGUuZy4KKyAgICAvLyA8dGQgY29sc3Bh
bj00PiNhPC90ZD48dGQ+I2I8L3RkPgorICAgIC8vIDx0ZCBjb2xzcGFuPTI+I2M8L3RkPjx0ZCBj
b2xzcGFuPTM+I2Q8L3RkPgorICAgIHN0ZDo6c29ydChzcGFubmluZ0NlbGxzLmJlZ2luKCksIHNw
YW5uaW5nQ2VsbHMuZW5kKCksIFsmXSAoYXV0byYgYSwgYXV0byYgYikgeworICAgICAgICByZXR1
cm4gU3BhblR5cGU6OnNwYW5Db3VudChncmlkLnNsb3QoYS5wb3NpdGlvbiktPmNlbGwoKSkgPCBT
cGFuVHlwZTo6c3BhbkNvdW50KGdyaWQuc2xvdChiLnBvc2l0aW9uKS0+Y2VsbCgpKTsKKyAgICB9
KTsKKworICAgIC8vIDMuIERpc3RyaWJ1dGUgdGhlIHNwYW5uaW5nIGNlbGxzJyBtaW1pbXVtIHNw
YWNlIGFjcm9zcyB0aGUgY29sdW1ucy9yb3dzIHVzaW5nIHRoZSBub24tc3Bhbm5pbmcgc3BhY2Vz
LgorICAgIC8vIGUuZy4gWyAxIF1bIDUgXVsgMSBdCisgICAgLy8gICAgICBbICAgIDkgICBdWyAx
IF0KKyAgICAvLyBUaGUgaW5pdGlhbCB3aWR0aHMgYXJlOiBbIDIgXVsgNyBdWyAxIF0KKyAgICBm
b3IgKGF1dG8gc3Bhbm5pbmdDZWxsIDogc3Bhbm5pbmdDZWxscykgeworICAgICAgICBhdXRvJiBj
ZWxsID0gZ3JpZC5zbG90KHNwYW5uaW5nQ2VsbC5wb3NpdGlvbiktPmNlbGwoKTsKKyAgICAgICAg
YXV0byB1bnJlc29sdmVkU3Bhbm5pbmdTcGFjZSA9IHNwYW5uaW5nQ2VsbC51bnJlc29sdmVkU3Bh
Y2U7CisgICAgICAgIGlmICghcmVzb2x2ZWRJdGVtc1tTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwp
XSB8fCAhcmVzb2x2ZWRJdGVtc1tTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKSAtIDFdKSB7CisgICAg
ICAgICAgICAvLyA8dGQgY29sc3Bhbj00PiNhPC90ZD48dGQ+I2I8L3RkPgorICAgICAgICAgICAg
Ly8gPHRkIGNvbHNwYW49Mj4jYzwvdGQ+PHRkIGNvbHNwYW49Mz4jZDwvdGQ+CisgICAgICAgICAg
ICAvLyBVbnJlc29sdmVkIGNvbHVtbnMgYXJlOiAxIDIgMyA0CisgICAgICAgICAgICAvLyAxLiBU
YWtlIGNvbHNwYW49MiAoc2hvcnRlc3Qgc3BhbikgYW5kIHJlc29sdmUgY29sdW1uIDEgYW5kIDIK
KyAgICAgICAgICAgIC8vIDIuIFRha2UgY29sc3Bhbj0zIGFuZCByZXNvbHZlIGNvbHVtbiAzIGFu
ZCA0ICg1IGlzIHJlc29sdmVkIGJlY2F1c2UgaXQgYWxyZWFkeSBoYXMgYSBub24tc3Bhbm5pbmcg
Y2VsbCkuCisgICAgICAgICAgICAvLyAzLiBjb2xzcGFuPTQgbmVlZHMgbm8gcmVzb2x2aW5nIGJl
Y2F1c2UgYWxsIHRoZSBzcGFubmVkIGNvbHVtbnMgKDEgMiAzIDQpIGhhdmUgYWxyZWFkeSBiZWVu
IHJlc29sdmVkLgorICAgICAgICAgICAgYXV0byB1bnJlc29sdmVkQ29sdW1uQ291bnQgPSBjZWxs
LmNvbHVtblNwYW4oKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBzcGFuSW5kZXggPSBTcGFuVHlw
ZTo6c3RhcnRTcGFuKGNlbGwpOyBzcGFuSW5kZXggPCBTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsg
KytzcGFuSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkSXRlbXNbc3Bhbklu
ZGV4XSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgQVNT
RVJUKHVucmVzb2x2ZWRDb2x1bW5Db3VudCk7CisgICAgICAgICAgICAgICAgLS11bnJlc29sdmVk
Q29sdW1uQ291bnQ7CisgICAgICAgICAgICAgICAgdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UgLT0g
cmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2U7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBBU1NFUlQodW5yZXNvbHZlZENvbHVtbkNvdW50KTsKKyAgICAgICAgICAgIGF1dG8g
ZXF1YWxTcGFjZUZvclNwYW5uZWRDb2x1bW5zID0gdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UgLyB1
bnJlc29sdmVkQ29sdW1uQ291bnQ7CisgICAgICAgICAgICBmb3IgKGF1dG8gc3BhbkluZGV4ID0g
U3BhblR5cGU6OnN0YXJ0U3BhbihjZWxsKTsgc3BhbkluZGV4IDwgU3BhblR5cGU6OmVuZFNwYW4o
Y2VsbCk7ICsrc3BhbkluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSXRlbXNb
c3BhbkluZGV4XSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAg
ICAgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdID0gUmVzb2x2ZWRJdGVtIHsgZXF1YWxTcGFjZUZv
clNwYW5uZWRDb2x1bW5zLCBmYWxzZSB9OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgLy8gMS4gQ29sbGVjdCB0aGUgbm9uLXNwYW5pbmcgcmVzb2x2ZWQgc3Bh
Y2VzLgorICAgICAgICAgICAgLy8gMi4gRGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UgYW1vbmcg
dGhlIHNwYW5uZWQgY29sdW1ucy9yb3dzIGJhc2VkIG9uIHRoZSByZXNvbHZlZCBzcGFjZSB2YWx1
ZXMuCisgICAgICAgICAgICAvLyBlLmcuIHNwYW5uaW5nIHdpZHRoOiBbICAgOSAgIF0uIFJlc29s
dmVkIHdpZHRocyBmb3IgdGhlIHNwYW5uZWQgY29sdW1uczogWyAxIF0gWyAyIF0KKyAgICAgICAg
ICAgIC8vIE5ldyByZXNvbHZlZCB3aWR0aHM6IFsgMyBdIFsgNiBdLgorICAgICAgICAgICAgYXV0
byByZXNvbHZlZFNwYW5uaW5nU3BhY2UgPSBHcmlkU3BhY2UgeyB9OworICAgICAgICAgICAgZm9y
IChhdXRvIHNwYW5JbmRleCA9IFNwYW5UeXBlOjpzdGFydFNwYW4oY2VsbCk7IHNwYW5JbmRleCA8
IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwpOyArK3NwYW5JbmRleCkKKyAgICAgICAgICAgICAgICBy
ZXNvbHZlZFNwYW5uaW5nU3BhY2UgKz0gcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3Bh
Y2U7CisgICAgICAgICAgICBpZiAocmVzb2x2ZWRTcGFubmluZ1NwYWNlLnZhbHVlID49IHVucmVz
b2x2ZWRTcGFubmluZ1NwYWNlLnZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHNwYW5u
aW5nIGNlbGwgZml0cyB0aGUgc3Bhbm5lZCBjb2x1bW5zL3Jvd3MganVzdCBmaW5lLiBOb3RoaW5n
IHRvIGRpc3RyaWJ1dGUuCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBhdXRvIHNwYWNpbmcgPSBTcGFuVHlwZTo6c3BhY2luZyhncmlkKSAqIChT
cGFuVHlwZTo6c3BhbkNvdW50KGNlbGwpIC0gMSk7CisgICAgICAgICAgICBhdXRvIHNwYWNlVG9E
aXN0cmlidXRlID0gdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UgLSBHcmlkU3BhY2UgeyBzcGFjaW5n
LCBzcGFjaW5nIH0gLSByZXNvbHZlZFNwYW5uaW5nU3BhY2U7IAorICAgICAgICAgICAgaWYgKCFz
cGFjZVRvRGlzdHJpYnV0ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGRpc3Ry
aWJ1dGlvblJhdGlvID0gc3BhY2VUb0Rpc3RyaWJ1dGUuZGlzdHJpYnV0aW9uQmFzZSAvIHJlc29s
dmVkU3Bhbm5pbmdTcGFjZS5kaXN0cmlidXRpb25CYXNlOworICAgICAgICAgICAgICAgIGZvciAo
YXV0byBzcGFuSW5kZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpOyBzcGFuSW5kZXggPCBT
cGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5kZXgpCisgICAgICAgICAgICAgICAgICAg
IHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xvdFNwYWNlICs9IEdyaWRTcGFjZSB7IHJlc29s
dmVkSXRlbXNbc3BhbkluZGV4XS0+c2xvdFNwYWNlLnZhbHVlICogZGlzdHJpYnV0aW9uUmF0aW8s
IHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xvdFNwYWNlLmRpc3RyaWJ1dGlvbkJhc2UgKiBk
aXN0cmlidXRpb25SYXRpb307CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAg
Ly8gNC4gRGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UgdXNpbmcgdGhlIGZpbmFsIHJlc29sdmVk
IHdpZHRocy4KKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIC8vIFdlIGhhdmUgdG8gaGF2ZSBhbGwg
dGhlIHNwYWNlcyByZXNvbHZlZCBhdCB0aGlzIHBvaW50LgorICAgIGZvciAoYXV0byYgcmVzb2x2
ZWRJdGVtIDogcmVzb2x2ZWRJdGVtcykKKyAgICAgICAgQVNTRVJUKHJlc29sdmVkSXRlbSk7Cisj
ZW5kaWYKKyAgICAvLyBGaXhlZCBzaXplIGNlbGxzIGRvbid0IHBhcnRpY2lwYXRlIGluIGF2YWls
YWJsZSBzcGFjZSBkaXN0cmlidXRpb24uCisgICAgYXV0byBhZGp1c3RhYmxlZFNwYWNlID0gR3Jp
ZFNwYWNlIHsgfTsKKyAgICBmb3IgKGF1dG8mIHJlc29sdmVkSXRlbSA6IHJlc29sdmVkSXRlbXMp
IHsKKyAgICAgICAgaWYgKHJlc29sdmVkSXRlbS0+aXNGaXhlZCkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICBhZGp1c3RhYmxlZFNwYWNlICs9IHJlc29sdmVkSXRlbS0+c2xvdFNwYWNl
OworICAgIH0KKworICAgIFZlY3RvcjxMYXlvdXRVbml0PiBkaXN0cmlidXRlZFNwYWNlcyhyZXNv
bHZlZEl0ZW1zLnNpemUoKSk7CisgICAgZmxvYXQgc3BhY2VUb0Rpc3RyaWJ1dGUgPSBhdmFpbGFi
bGVTcGFjZSAtIGFkanVzdGFibGVkU3BhY2UudmFsdWUgLSAoKHJlc29sdmVkSXRlbXMuc2l6ZSgp
ICsgMSkgKiBTcGFuVHlwZTo6c3BhY2luZyhncmlkKSk7CisgICAgLy8gRXNzZW50aWFsbHkgdGhl
IHJlbWFpbmluZyBzcGFjZSB0byBkaXN0cmlidXRlIHNob3VsZCBuZXZlciBiZSBuZWdhdGl2ZS4g
TGF5b3V0VW5pdDo6ZXBzaWxvbigpIGlzIHJlcXVpcmVkIHRvIGNvbXBlbnNhdGUgZm9yIExheW91
dFVuaXQncyBsb3cgcHJlY2lzaW9uLgorICAgIEFTU0VSVChzcGFjZVRvRGlzdHJpYnV0ZSA+PSAt
TGF5b3V0VW5pdDo6ZXBzaWxvbigpICogcmVzb2x2ZWRJdGVtcy5zaXplKCkpOworICAgIC8vIERp
c3RyaWJ1dGUgdGhlIGV4dHJhIHNwYWNlIGJhc2VkIG9uIHRoZSByZXNvbHZlZCBzcGFjZXMuCisg
ICAgYXV0byBkaXN0cmlidXRpb25SYXRpbyA9IHNwYWNlVG9EaXN0cmlidXRlIC8gYWRqdXN0YWJs
ZWRTcGFjZS5kaXN0cmlidXRpb25CYXNlOworICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5k
ZXggPCByZXNvbHZlZEl0ZW1zLnNpemUoKTsgKytpbmRleCkgeworICAgICAgICBhdXRvIHNsb3RT
cGFjZSA9IHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90U3BhY2UudmFsdWU7CisgICAgICAgIGF1
dG8gbmVlZHNTcGFjZURpc3RyaWJ1dGlvbiA9IHNwYWNlVG9EaXN0cmlidXRlICYmICFyZXNvbHZl
ZEl0ZW1zW2luZGV4XS0+aXNGaXhlZDsKKyAgICAgICAgZGlzdHJpYnV0ZWRTcGFjZXNbaW5kZXhd
ID0gTGF5b3V0VW5pdCB7IHNsb3RTcGFjZSB9OworICAgICAgICBpZiAoIW5lZWRzU3BhY2VEaXN0
cmlidXRpb24pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZGlzdHJpYnV0ZWRTcGFj
ZXNbaW5kZXhdICs9IExheW91dFVuaXQgeyByZXNvbHZlZEl0ZW1zW2luZGV4XS0+c2xvdFNwYWNl
LmRpc3RyaWJ1dGlvbkJhc2UgKiBkaXN0cmlidXRpb25SYXRpbyB9OworICAgIH0KKyAgICByZXR1
cm4gZGlzdHJpYnV0ZWRTcGFjZXM7Cit9CisKK1RhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxl
TGF5b3V0OjpEaXN0cmlidXRlZFNwYWNlcyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUxh
eW91dDo6ZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2UoTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jp
em9udGFsU3BhY2UpCit7CisgICAgZW51bSBjbGFzcyBDb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2Ug
eyBNaW5pbXVtV2lkdGgsIE1heGltdW1XaWR0aCB9OworICAgIGF1dG8gY29sdW1uV2lkdGhCYWxh
bmNpbmdCYXNlID0gYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlID49IG1fZ3JpZC53aWR0aENvbnN0
cmFpbnRzKCktPm1heGltdW0gPyBDb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2U6Ok1heGltdW1XaWR0
aCA6IENvbHVtbldpZHRoQmFsYW5jaW5nQmFzZTo6TWluaW11bVdpZHRoOworICAgIHJldHVybiBk
aXN0cmlidXRlQXZhaWxhYmxlU3BhY2U8Q29sdW1uU3Bhbj4obV9ncmlkLCBhdmFpbGFibGVIb3Jp
em9udGFsU3BhY2UsIFsmXSAoY29uc3QgVGFibGVHcmlkOjpTbG90JiBzbG90LCBzaXplX3QgY29s
dW1uSW5kZXgpIHsKKyAgICAgICAgYXV0byYgY29sdW1uID0gbV9ncmlkLmNvbHVtbnMoKS5saXN0
KClbY29sdW1uSW5kZXhdOworICAgICAgICBhdXRvIGNvbHVtbkJveEZpeGVkV2lkdGggPSBjb2x1
bW4uYm94KCkgPyBjb2x1bW4uYm94KCktPmNvbHVtbldpZHRoKCkudmFsdWVPcigwX2x1KSA6IDBf
bHU7CisgICAgICAgIGF1dG8gbWluaW11bVdpZHRoID0gc3RkOjptYXg8ZmxvYXQ+KHNsb3Qud2lk
dGhDb25zdHJhaW50cygpLm1pbmltdW0sIGNvbHVtbkJveEZpeGVkV2lkdGgpOworICAgICAgICBh
dXRvIG1heGltdW1XaWR0aCA9IHN0ZDo6bWF4PGZsb2F0PihzbG90LndpZHRoQ29uc3RyYWludHMo
KS5tYXhpbXVtLCBjb2x1bW5Cb3hGaXhlZFdpZHRoKTsKKworICAgICAgICBpZiAoY29sdW1uV2lk
dGhCYWxhbmNpbmdCYXNlID09IENvbHVtbldpZHRoQmFsYW5jaW5nQmFzZTo6TWluaW11bVdpZHRo
KSB7CisgICAgICAgICAgICBBU1NFUlQobWF4aW11bVdpZHRoID49IG1pbmltdW1XaWR0aCk7Cisg
ICAgICAgICAgICByZXR1cm4gR3JpZFNwYWNlIHsgbWluaW11bVdpZHRoLCBtYXhpbXVtV2lkdGgg
LSBtaW5pbXVtV2lkdGggfTsKKyAgICAgICAgfQorICAgICAgICAvLyBXaGVuIHRoZSBjb2x1bW4g
aGFzIGEgZml4ZWQgd2lkdGggY2VsbCwgdGhlIG1heGltdW0gd2lkdGggYmFsYW5jaW5nIGlzIGJh
c2VkIG9uIHRoZSBtaW5pbXVtIHdpZHRoLgorICAgICAgICBpZiAoY29sdW1uLmlzRml4ZWRXaWR0
aCgpKQorICAgICAgICAgICAgcmV0dXJuIEdyaWRTcGFjZSB7IG1pbmltdW1XaWR0aCwgbWF4aW11
bVdpZHRoIH07CisgICAgICAgIHJldHVybiBHcmlkU3BhY2UgeyBtYXhpbXVtV2lkdGgsIG1heGlt
dW1XaWR0aCB9OworICAgIH0pOworfQorCitUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUxh
eW91dDo6RGlzdHJpYnV0ZWRTcGFjZXMgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6VGFibGVMYXlv
dXQ6OmRpc3RyaWJ1dGVkVmVydGljYWxTcGFjZShPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFi
bGVWZXJ0aWNhbFNwYWNlKQoreworICAgIGF1dG8mIHJvd3MgPSBtX2dyaWQucm93cygpOworICAg
IGF1dG8mIGNvbHVtbnMgPSBtX2dyaWQuY29sdW1ucygpOworCisgICAgVmVjdG9yPExheW91dFVu
aXQ+IHJvd0hlaWdodChyb3dzLnNpemUoKSk7CisgICAgYXV0byB0YWJsZVVzZWRIZWlnaHQgPSBM
YXlvdXRVbml0IHsgfTsKKyAgICAvLyAyLiBDb2xsZWN0IGluaXRpYWwsIGJhc2VsaW5lIGFsaWdu
ZWQgcm93IGhlaWdodHMuCisgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8
IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7CisgICAgICAgIGF1dG8gbWF4aW11bUNvbHVtbkFz
Y2VudCA9IElubGluZUxheW91dFVuaXQgeyB9OworICAgICAgICBhdXRvIG1heGltdW1Db2x1bW5E
ZXNjZW50ID0gSW5saW5lTGF5b3V0VW5pdCB7IH07CisgICAgICAgIC8vIEluaXRpYWwgbWluaW11
bSBoZWlnaHQgaXMgdGhlIGNvbXB1dGVkIGhlaWdodCBpZiBhdmFpbGFibGUgPHRyIHN0eWxlPSJo
ZWlnaHQ6IDEwMHB4Ij48dGQ+PC90ZD48L3RyPgorICAgICAgICByb3dIZWlnaHRbcm93SW5kZXhd
ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeSgpLmNvbXB1dGVkSGVpZ2h0KHJvd3MubGlz
dCgpW3Jvd0luZGV4XS5ib3goKSwgYXZhaWxhYmxlVmVydGljYWxTcGFjZSkudmFsdWVPcigwX2x1
KTsKKyAgICAgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IGNv
bHVtbnMuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBhdXRvJiBzbG90ID0g
Km1fZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0pOworICAgICAgICAgICAgaWYg
KHNsb3QuaXNSb3dTcGFubmVkKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICBpZiAoc2xvdC5oYXNSb3dTcGFuKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICAvLyBUaGUgbWluaW11bSBoZWlnaHQgb2YgYSByb3cgKHdpdGhvdXQgc3Bhbm5p
bmctcmVsYXRlZCBoZWlnaHQgZGlzdHJpYnV0aW9uKSBpcyBkZWZpbmVkIGFzIHRoZSBoZWlnaHQg
b2YgYW4gaHlwb3RoZXRpY2FsCisgICAgICAgICAgICAvLyBsaW5lYm94IGNvbnRhaW5pbmcgdGhl
IGNlbGxzIG9yaWdpbmF0aW5nIGluIHRoZSByb3cuCisgICAgICAgICAgICBhdXRvJiBjZWxsID0g
c2xvdC5jZWxsKCk7CisgICAgICAgICAgICBhdXRvJiBjZWxsQm94ID0gY2VsbC5ib3goKTsKKyAg
ICAgICAgICAgIGF1dG8gaGVpZ2h0ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJv
eChjZWxsQm94KS5ib3JkZXJCb3hIZWlnaHQoKTsKKyAgICAgICAgICAgIGlmIChjZWxsQm94LnN0
eWxlKCkudmVydGljYWxBbGlnbigpID09IFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lKSB7CisgICAg
ICAgICAgICAgICAgbWF4aW11bUNvbHVtbkFzY2VudCA9IHN0ZDo6bWF4KG1heGltdW1Db2x1bW5B
c2NlbnQsIGNlbGwuYmFzZWxpbmUoKSk7CisgICAgICAgICAgICAgICAgbWF4aW11bUNvbHVtbkRl
c2NlbnQgPSBzdGQ6Om1heChtYXhpbXVtQ29sdW1uRGVzY2VudCwgaGVpZ2h0IC0gY2VsbC5iYXNl
bGluZSgpKTsKKyAgICAgICAgICAgICAgICByb3dIZWlnaHRbcm93SW5kZXhdID0gc3RkOjptYXgo
cm93SGVpZ2h0W3Jvd0luZGV4XSwgTGF5b3V0VW5pdCB7IG1heGltdW1Db2x1bW5Bc2NlbnQgKyBt
YXhpbXVtQ29sdW1uRGVzY2VudCB9KTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAg
ICAgIHJvd0hlaWdodFtyb3dJbmRleF0gPSBzdGQ6Om1heChyb3dIZWlnaHRbcm93SW5kZXhdLCBo
ZWlnaHQpOworICAgICAgICB9CisgICAgICAgIHRhYmxlVXNlZEhlaWdodCArPSByb3dIZWlnaHRb
cm93SW5kZXhdOworICAgIH0KKyAgICAvLyBGSVhNRTogQ29sbGVjdCBzcGFubmluZyByb3cgbWF4
aW11bSBoZWlnaHRzLgorCisgICAgdGFibGVVc2VkSGVpZ2h0ICs9IChyb3dzLnNpemUoKSArIDEp
ICogbV9ncmlkLnZlcnRpY2FsU3BhY2luZygpOworICAgIGF1dG8gYXZhaWxhYmxlU3BhY2UgPSBz
dGQ6Om1heChhdmFpbGFibGVWZXJ0aWNhbFNwYWNlLnZhbHVlT3IoMF9sdSksIHRhYmxlVXNlZEhl
aWdodCk7CisgICAgLy8gRGlzdHJpYnV0ZSBleHRyYSBzcGFjZSBpZiB0aGUgdGFibGUgaXMgc3Vw
cG9zZWQgdG8gYmUgdGFsbGVyIHRoYW4gdGhlIHN1bSBvZiB0aGUgcm93IGhlaWdodHMuCisgICAg
cmV0dXJuIGRpc3RyaWJ1dGVBdmFpbGFibGVTcGFjZTxSb3dTcGFuPihtX2dyaWQsIGF2YWlsYWJs
ZVNwYWNlLCBbJl0gKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCwgc2l6ZV90IHJvd0luZGV4
KSB7CisgICAgICAgIGlmIChzbG90Lmhhc1Jvd1NwYW4oKSkKKyAgICAgICAgICAgIHJldHVybiBH
cmlkU3BhY2UgeyBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KHNsb3QuY2VsbCgp
LmJveCgpKS5ib3JkZXJCb3hIZWlnaHQoKSwgZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZv
ckJveChzbG90LmNlbGwoKS5ib3goKSkuYm9yZGVyQm94SGVpZ2h0KCkgfTsKKyAgICAgICAgYXV0
byYgcm93cyA9IG1fZ3JpZC5yb3dzKCk7CisgICAgICAgIGF1dG8gY29tcHV0ZWRSb3dIZWlnaHQg
PSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCkuY29tcHV0ZWRIZWlnaHQocm93cy5saXN0
KClbcm93SW5kZXhdLmJveCgpLCB7IH0pOworICAgICAgICBhdXRvIGhlaWdodCA9IHN0ZDo6bWF4
PGZsb2F0Pihyb3dIZWlnaHRbcm93SW5kZXhdLCBjb21wdXRlZFJvd0hlaWdodC52YWx1ZU9yKDBf
bHUpKTsKKyAgICAgICAgcmV0dXJuIEdyaWRTcGFjZSB7IGhlaWdodCwgaGVpZ2h0IH07CisgICAg
fSk7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5jcHAKZGVs
ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MGE2ZGE5ZjljMTRmMDE0NDUxZmFkYTI0NmZi
MGViY2QxMmQyYjguLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0t
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lQ29udGVudEJy
ZWFrZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoK
LSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0j
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSW5saW5lQ29udGVudEJyZWFrZXIuaCIKLQot
I2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiRm9udENh
c2NhZGUuaCIKLSNpbmNsdWRlICJIeXBoZW5hdGlvbi5oIgotI2luY2x1ZGUgIklubGluZUl0ZW0u
aCIKLSNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgotI2luY2x1ZGUgIkxheW91dENvbnRhaW5l
ckJveC5oIgotI2luY2x1ZGUgIlRleHRVdGlsLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi0KLSNpZiBBU1NFUlRfRU5BQkxFRAotc3RhdGljIGlubGluZSBi
b29sIGhhc1RyYWlsaW5nVGV4dENvbnRlbnQoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNv
bnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkKLXsKLSAgICBmb3IgKGF1dG8mIHJ1
biA6IFdURjo6bWFrZVJldmVyc2VkUmFuZ2UoY29udGludW91c0NvbnRlbnQucnVucygpKSkgewot
ICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gcnVuLmlubGluZUl0ZW07Ci0gICAgICAgIGlmIChp
bmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5k
KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcmV0dXJuIGlubGluZUl0ZW0uaXNU
ZXh0KCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW5s
aW5lIGJvb2wgaGFzTGVhZGluZ1RleHRDb250ZW50KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2Vy
OjpDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQpCi17Ci0gICAgZm9yIChhdXRv
JiBydW4gOiBjb250aW51b3VzQ29udGVudC5ydW5zKCkpIHsKLSAgICAgICAgYXV0byYgaW5saW5l
SXRlbSA9IHJ1bi5pbmxpbmVJdGVtOwotICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJv
eFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQotICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgIHJldHVybiBpbmxpbmVJdGVtLmlzVGV4dCgpOwotICAgIH0KLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBoYXNUZXh0UnVuKGNvbnN0IElu
bGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQp
Ci17Ci0gICAgLy8gPHNwYW4+dGV4dDwvc3Bhbj4gaXMgY29uc2lkZXJlZCBhIHRleHQgcnVuIGV2
ZW4gd2l0aCB0aGUgW2lubGluZSBib3ggc3RhcnRdW2lubGluZSBib3ggZW5kXSBpbmxpbmUgaXRl
bXMuCi0gICAgLy8gQmFzZWQgb24gc3RhbmRhcmRzIGNvbW1pdCBib3VuZGFyeSBydWxlcyBpdCB3
b3VsZCBiZSBlbm91Z2ggdG8gY2hlY2sgdGhlIGZpcnN0IGlubGluZSBpdGVtLCBidXQgZHVlIHRv
IHRoZSB0YWJsZSBxdWlyaywgd2UgY2FuIGhhdmUKLSAgICAvLyBpbWFnZSBhbmQgdGV4dCBuZXh0
IHRvIGVhY2ggb3RoZXIgaW5zaWRlIGEgY29udGludW91cyBzZXQgb2YgcnVucyAoc2VlIElubGlu
ZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6Omhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdl
KS4KLSAgICBmb3IgKGF1dG8mIHJ1biA6IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKSkgewotICAg
ICAgICBpZiAocnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNW
aXN1YWxseUVtcHR5V2hpdGVzcGFjZUNvbnRlbnQoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6
OkNvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkKLXsKLSAgICAvLyBbPHNwYW4+
PC9zcGFuPiBdIFs8c3Bhbj4gPC9zcGFuPl0gWyA8c3BhbiBzdHlsZT0icGFkZGluZzogMHB4OyI+
PC9zcGFuPl0gYXJlIGFsbCBjb25zaWRlcmVkIHZpc3VhbGx5IGVtcHR5IHdoaXRlc3BhY2UgY29u
dGVudC4KLSAgICAvLyBbPHNwYW4gc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIHJlZCI+PC9zcGFu
PiBdIHdoaWxlIHRoaXMgaXMgd2hpdGVzcGFjZSBjb250ZW50IG9ubHksIGl0IGlzIG5vdCBjb25z
aWRlcmVkIHZpc3VhbGx5IGVtcHR5LgotICAgIC8vIER1ZSB0byBjb21taXQgYm91bmRhcnkgcnVs
ZXMsIHdlIGp1c3QgbmVlZCB0byBjaGVjayB0aGUgZmlyc3Qgbm9uLXR5cGVsZXNzIGlubGluZSBp
dGVtIChjYW4ndCBoYXZlIGJvdGggW2ltZ10gYW5kIFt0ZXh0XSkKLSAgICBmb3IgKGF1dG8mIHJ1
biA6IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKSkgewotICAgICAgICBhdXRvJiBpbmxpbmVJdGVt
ID0gcnVuLmlubGluZUl0ZW07Ci0gICAgICAgIC8vIEZJWE1FOiBjaGVjayBmb3IgcGFkZGluZyBi
b3JkZXIgZXRjLgotICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwg
aW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgIHJldHVybiBpbmxpbmVJdGVtLmlzVGV4dCgpICYmIGRvd25jYXN0PElubGluZVRleHRJdGVt
PihpbmxpbmVJdGVtKS5pc1doaXRlc3BhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNOb25Db250ZW50UnVuc09ubHkoY29uc3QgSW5saW5l
Q29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkKLXsK
LSAgICAvLyA8c3Bhbj48L3NwYW4+IDwtIG5vbiBjb250ZW50IHJ1bnMuCi0gICAgZm9yIChhdXRv
JiBydW4gOiBjb250aW51b3VzQ29udGVudC5ydW5zKCkpIHsKLSAgICAgICAgYXV0byYgaW5saW5l
SXRlbSA9IHJ1bi5pbmxpbmVJdGVtOwotICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJv
eFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQotICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLXN0YXRpYyBpbmxpbmUgT3B0aW9uYWw8c2l6ZV90PiBmaXJzdFRleHRSdW5JbmRleChjb25z
dCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250
ZW50KQotewotICAgIGF1dG8mIHJ1bnMgPSBjb250aW51b3VzQ29udGVudC5ydW5zKCk7Ci0gICAg
Zm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJ1bnMuc2l6ZSgpOyArK2luZGV4KSB7Ci0g
ICAgICAgIGlmIChydW5zW2luZGV4XS5pbmxpbmVJdGVtLmlzVGV4dCgpKQotICAgICAgICAgICAg
cmV0dXJuIGluZGV4OwotICAgIH0KLSAgICByZXR1cm4geyB9OwotfQotCi1ib29sIElubGluZUNv
bnRlbnRCcmVha2VyOjppc1dyYXBwaW5nQWxsb3dlZChjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJ
dGVtKQotewotICAgIGF1dG8mIHN0eWxlVG9Vc2UgPSBpbmxpbmVJdGVtLmlzQm94KCkgPyBpbmxp
bmVJdGVtLmxheW91dEJveCgpLnBhcmVudCgpLnN0eWxlKCkgOiBpbmxpbmVJdGVtLmxheW91dEJv
eCgpLnN0eWxlKCk7IAotICAgIC8vIERvIG5vdCB0cnkgdG8gd3JhcCBvdmVyZmxvd24gJ3ByZScg
YW5kICduby13cmFwJyBjb250ZW50IHRvIG5leHQgbGluZS4KLSAgICByZXR1cm4gc3R5bGVUb1Vz
ZS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6UHJlICYmIHN0eWxlVG9Vc2Uud2hpdGVTcGFj
ZSgpICE9IFdoaXRlU3BhY2U6Ok5vV3JhcDsKLX0KLQotYm9vbCBJbmxpbmVDb250ZW50QnJlYWtl
cjo6c2hvdWxkS2VlcEVuZE9mTGluZVdoaXRlc3BhY2UoY29uc3QgQ29udGludW91c0NvbnRlbnQm
IGNvbnRpbnVvdXNDb250ZW50KSBjb25zdAotewotICAgIC8vIEdyYWIgdGhlIHN0eWxlIGFuZCBj
aGVjayBmb3Igd2hpdGUtc3BhY2UgcHJvcGVydHkgdG8gZGVjaWRlIHdoZXRoZXIgd2Ugc2hvdWxk
IGxldCB0aGlzIHdoaXRlc3BhY2UgY29udGVudCBvdmVyZmxvdyB0aGUgY3VycmVudCBsaW5lLgot
ICAgIC8vIE5vdGUgdGhhdCB0aGUgImtlZXAiIGluIHRoaXMgY29udGV4dCBtZWFucyB3ZSBsZXQg
dGhlIHdoaXRlc3BhY2UgY29udGVudCBzaXQgb24gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAvLyBJ
dCBtaWdodCB2ZXJ5IHdlbGwgZ2V0IGNvbGxhcHNlZCB3aGVuIHdlIGNsb3NlIHRoZSBsaW5lIChu
b3JtYWwvbm93cmFwL3ByZS1saW5lKS4KLSAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RS
L2Nzcy10ZXh0LTMvI3doaXRlLXNwYWNlLXByb3BlcnR5Ci0gICAgYXV0byB3aGl0ZXNwYWNlID0g
Y29udGludW91c0NvbnRlbnQucnVucygpWypmaXJzdFRleHRSdW5JbmRleChjb250aW51b3VzQ29u
dGVudCldLmlubGluZUl0ZW0uc3R5bGUoKS53aGl0ZVNwYWNlKCk7Ci0gICAgcmV0dXJuIHdoaXRl
c3BhY2UgPT0gV2hpdGVTcGFjZTo6Tm9ybWFsIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6
Tm9XcmFwIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlV3JhcCB8fCB3aGl0ZXNwYWNl
ID09IFdoaXRlU3BhY2U6OlByZUxpbmU7Ci19Ci0KLUlubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1
bHQgSW5saW5lQ29udGVudEJyZWFrZXI6OnByb2Nlc3NJbmxpbmVDb250ZW50KGNvbnN0IENvbnRp
bnVvdXNDb250ZW50JiBjYW5kaWRhdGVDb250ZW50LCBjb25zdCBMaW5lU3RhdHVzJiBsaW5lU3Rh
dHVzKQotewotICAgIEFTU0VSVCghc3RkOjppc25hbihsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRo
KSk7Ci0gICAgYXV0byBwcm9jZXNzQ2FuZGlkYXRlQ29udGVudCA9IFsmXSB7Ci0gICAgICAgIGlm
IChjYW5kaWRhdGVDb250ZW50LmxvZ2ljYWxXaWR0aCgpIDw9IGxpbmVTdGF0dXMuYXZhaWxhYmxl
V2lkdGgpCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246OktlZXAg
fTsKLSNpZiBVU0VfRkxPQVRfQVNfSU5MSU5FX0xBWU9VVF9VTklUCi0gICAgICAgIC8vIFByZWZl
cnJlZCB3aWR0aCBjb21wdXRhdGlvbiBzdW1zIHVwIGZsb2F0cyB3aGlsZSBsaW5lIGJyZWFrZXIg
c3VidHJhY3RzIHRoZW0uIFRoaXMgY2FuIGxlYWQgdG8gZXBzaWxvbi1zY2FsZSBkaWZmZXJlbmNl
cy4KLSAgICAgICAgaWYgKFdURjo6YXJlRXNzZW50aWFsbHlFcXVhbChjYW5kaWRhdGVDb250ZW50
LmxvZ2ljYWxXaWR0aCgpLCBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKSkKLSAgICAgICAgICAg
IHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCB9OwotI2VuZGlmCi0gICAgICAg
IHJldHVybiBwcm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50KGNhbmRpZGF0ZUNvbnRlbnQsIGxpbmVT
dGF0dXMpOwotICAgIH07Ci0KLSAgICBhdXRvIHJlc3VsdCA9IHByb2Nlc3NDYW5kaWRhdGVDb250
ZW50KCk7Ci0gICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gUmVzdWx0OjpBY3Rpb246OldyYXAgJiYg
bGluZVN0YXR1cy50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCAmJiBoYXNMZWFkaW5nVGV4dENvbnRl
bnQoY2FuZGlkYXRlQ29udGVudCkpIHsKLSAgICAgICAgLy8gQSB0cmFpbGluZyBzb2Z0IGh5cGhl
biB3aXRoIGEgd3JhcHBlZCB0ZXh0IGNvbnRlbnQgdHVybnMgaW50byBhIHZpc2libGUgaHlwaGVu
LgotICAgICAgICAvLyBMZXQncyBjaGVjayBpZiB0aGVyZSdzIGVub3VnaCBzcGFjZSBmb3IgdGhl
IGh5cGhlbiBjaGFyYWN0ZXIuCi0gICAgICAgIGF1dG8gaHlwaGVuT3ZlcmZsb3dzID0gKmxpbmVT
dGF0dXMudHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPiBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRo
OwotICAgICAgICBhdXRvIGFjdGlvbiA9IGh5cGhlbk92ZXJmbG93cyA/IFJlc3VsdDo6QWN0aW9u
OjpSZXZlcnRUb0xhc3ROb25PdmVyZmxvd2luZ1dyYXBPcHBvcnR1bml0eSA6IFJlc3VsdDo6QWN0
aW9uOjpXcmFwV2l0aEh5cGhlbjsKLSAgICAgICAgcmVzdWx0ID0geyBhY3Rpb24sIElzRW5kT2ZM
aW5lOjpZZXMgfTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RydWN0IE92ZXJm
bG93aW5nVGV4dENvbnRlbnQgewotICAgIHNpemVfdCBydW5JbmRleCB7IDAgfTsgLy8gT3ZlcmZs
b3dpbmcgcnVuIGluZGV4LiBUaGVyZSdzIGFsd2F5cyBhbiBvdmVyZmxvd2luZyBydW4uCi0gICAg
c3RydWN0IEJyZWFraW5nUG9zaXRpb24gewotICAgICAgICBzaXplX3QgcnVuSW5kZXggeyAwIH07
Ci0gICAgICAgIHN0cnVjdCBUcmFpbGluZ0NvbnRlbnQgewotICAgICAgICAgICAgLy8gVHJhaWxp
bmcgY29udGVudCBpcyBlaXRoZXIgdGhlIHJ1bidzIGxlZnQgc2lkZSAod2hlbiB3ZSBicmVhayB0
aGUgcnVuIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlKSBvciB0aGUgcHJldmlvdXMgcnVuLgotICAg
ICAgICAgICAgLy8gU29tZXRpbWVzIHRoZSBicmVha2luZyBwb3NpdGlvbiBpcyBhdCB0aGUgdmVy
eSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IHJ1biwgc28gdGhlcmUncyBubyB0cmFpbGluZyBydW4g
YXQgYWxsLgotICAgICAgICAgICAgYm9vbCBvdmVyZmxvd3MgeyBmYWxzZSB9OwotICAgICAgICAg
ICAgT3B0aW9uYWw8SW5saW5lQ29udGVudEJyZWFrZXI6OlBhcnRpYWxSdW4+IHBhcnRpYWxSdW4g
eyB9OwotICAgICAgICB9OwotICAgICAgICBPcHRpb25hbDxUcmFpbGluZ0NvbnRlbnQ+IHRyYWls
aW5nQ29udGVudCB7IH07Ci0gICAgfTsKLSAgICBPcHRpb25hbDxCcmVha2luZ1Bvc2l0aW9uPiBi
cmVha2luZ1Bvc2l0aW9uIHsgfTsgLy8gV2hlcmUgd2UgYWN0dWFsbHkgYnJlYWsgdGhpcyBvdmVy
Zmxvd2luZyBjb250ZW50LgotfTsKLQotSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdCBJbmxp
bmVDb250ZW50QnJlYWtlcjo6cHJvY2Vzc092ZXJmbG93aW5nQ29udGVudChjb25zdCBDb250aW51
b3VzQ29udGVudCYgb3ZlcmZsb3dDb250ZW50LCBjb25zdCBMaW5lU3RhdHVzJiBsaW5lU3RhdHVz
KSBjb25zdAotewotICAgIGF1dG8gY29udGludW91c0NvbnRlbnQgPSBDb250aW51b3VzQ29udGVu
dCB7IG92ZXJmbG93Q29udGVudCB9OwotICAgIEFTU0VSVCghY29udGludW91c0NvbnRlbnQucnVu
cygpLmlzRW1wdHkoKSk7Ci0KLSAgICBBU1NFUlQoY29udGludW91c0NvbnRlbnQubG9naWNhbFdp
ZHRoKCkgPiBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKTsKLSAgICBpZiAoY29udGludW91c0Nv
bnRlbnQuaGFzVHJhaWxpbmdDb2xsYXBzaWJsZUNvbnRlbnQoKSkgewotICAgICAgICBBU1NFUlQo
aGFzVHJhaWxpbmdUZXh0Q29udGVudChvdmVyZmxvd0NvbnRlbnQpKTsKLSAgICAgICAgLy8gRmly
c3QgY2hlY2sgaWYgdGhlIGNvbnRlbnQgZml0cyB3aXRob3V0IHRoZSB0cmFpbGluZyBjb2xsYXBz
aWJsZSBwYXJ0LgotICAgICAgICBpZiAoY29udGludW91c0NvbnRlbnQubm9uQ29sbGFwc2libGVM
b2dpY2FsV2lkdGgoKSA8PSBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKQotICAgICAgICAgICAg
cmV0dXJuIHsgUmVzdWx0OjpBY3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpObyB9OwotICAgICAg
ICAvLyBOb3cgY2hlY2sgaWYgd2UgY2FuIHRyaW0gdGhlIGxpbmUgdG9vLgotICAgICAgICBpZiAo
bGluZVN0YXR1cy5oYXNGdWxseUNvbGxhcHNpYmxlVHJhaWxpbmdSdW4gJiYgY29udGludW91c0Nv
bnRlbnQuaXNGdWxseUNvbGxhcHNpYmxlKCkpIHsKLSAgICAgICAgICAgIC8vIElmIHRoaXMgbmV3
IGNvbnRlbnQgaXMgZnVsbHkgY29sbGFwc2libGUsIGl0IHNob3VsZCBzdXJlbHkgZml0LgotICAg
ICAgICAgICAgcmV0dXJuIHsgUmVzdWx0OjpBY3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpObyB9
OwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChsaW5lU3RhdHVzLmNvbGxhcHNpYmxlV2lkdGgg
JiYgaXNOb25Db250ZW50UnVuc09ubHkoY29udGludW91c0NvbnRlbnQpKSB7Ci0gICAgICAgIC8v
IExldCdzIHNlZSBpZiB0aGUgbm9uLWNvbnRlbnQgcnVucyBmaXQgd2hlbiB0aGUgbGluZSBoYXMg
dHJhaWxpbmcgY29sbGFwc2libGUgY29udGVudC4KLSAgICAgICAgLy8gInRleHQgY29udGVudCA8
c3BhbiBzdHlsZT0icGFkZGluZzogMXB4Ij48L3NwYW4+IiA8LSB0aGUgPHNwYW4+PC9zcGFuPiBy
dW5zIGNvdWxkIGZpdCBhZnRlciBjb2xsYXBzaW5nIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlLgot
ICAgICAgICBpZiAoY29udGludW91c0NvbnRlbnQubG9naWNhbFdpZHRoKCkgPD0gbGluZVN0YXR1
cy5hdmFpbGFibGVXaWR0aCArIGxpbmVTdGF0dXMuY29sbGFwc2libGVXaWR0aCkKLSAgICAgICAg
ICAgIHJldHVybiB7IFJlc3VsdDo6QWN0aW9uOjpLZWVwIH07Ci0gICAgfQotICAgIGlmIChpc1Zp
c3VhbGx5RW1wdHlXaGl0ZXNwYWNlQ29udGVudChjb250aW51b3VzQ29udGVudCkgJiYgc2hvdWxk
S2VlcEVuZE9mTGluZVdoaXRlc3BhY2UoY29udGludW91c0NvbnRlbnQpKSB7Ci0gICAgICAgIC8v
IFRoaXMgb3ZlcmZsb3dpbmcgY29udGVudCBhcHBhcmVudGx5IGZhbGxzIGludG8gdGhlIHJlbW92
ZS9oYW5nIGVuZC1vZi1saW5lLXNwYWNlcyBjYXRlZ29yeS4KLSAgICAgICAgLy8gc2VlIGh0dHBz
Oi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eSBtYXRyaXgK
LSAgICAgICAgcmV0dXJuIHsgUmVzdWx0OjpBY3Rpb246OktlZXAgfTsKLSAgICB9Ci0KLSAgICBz
aXplX3Qgb3ZlcmZsb3dpbmdSdW5JbmRleCA9IDA7Ci0gICAgaWYgKGhhc1RleHRSdW4oY29udGlu
dW91c0NvbnRlbnQpKSB7Ci0gICAgICAgIGF1dG8gdHJ5QnJlYWtpbmdDb250ZW50V2l0aFRleHQg
PSBbJl0oKSAtPiBPcHRpb25hbDxSZXN1bHQ+IHsKLSAgICAgICAgICAgIC8vIDEuIFRoaXMgdGV4
dCBjb250ZW50IGlzIG5vdCBicmVha2FibGUuCi0gICAgICAgICAgICAvLyAyLiBUaGlzIGJyZWFr
YWJsZSB0ZXh0IGNvbnRlbnQgZG9lcyBub3QgZml0IGF0IGFsbC4gTm90IGV2ZW4gdGhlIGZpcnN0
IGdseXBoLiBUaGlzIGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UuCi0gICAgICAgICAgICAvLyAzLiBX
ZSBjYW4gYnJlYWsgdGhlIGNvbnRlbnQgYnV0IGl0IHN0aWxsIG92ZXJmbG93cy4KLSAgICAgICAg
ICAgIC8vIDQuIE1hbmFnZWQgdG8gYnJlYWsgdGhlIGNvbnRlbnQgYmVmb3JlIHRoZSBvdmVyZmxv
dyBwb2ludC4KLSAgICAgICAgICAgIGF1dG8gb3ZlcmZsb3dpbmdDb250ZW50ID0gcHJvY2Vzc092
ZXJmbG93aW5nQ29udGVudFdpdGhUZXh0KGNvbnRpbnVvdXNDb250ZW50LCBsaW5lU3RhdHVzKTsK
LSAgICAgICAgICAgIG92ZXJmbG93aW5nUnVuSW5kZXggPSBvdmVyZmxvd2luZ0NvbnRlbnQucnVu
SW5kZXg7Ci0gICAgICAgICAgICBpZiAoIW92ZXJmbG93aW5nQ29udGVudC5icmVha2luZ1Bvc2l0
aW9uKQotICAgICAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgICAgICBhdXRvIHRyYWls
aW5nQ29udGVudCA9IG92ZXJmbG93aW5nQ29udGVudC5icmVha2luZ1Bvc2l0aW9uLT50cmFpbGlu
Z0NvbnRlbnQ7Ci0gICAgICAgICAgICBpZiAoIXRyYWlsaW5nQ29udGVudCkgewotICAgICAgICAg
ICAgICAgIC8vIFdlIHRyaWVkIHRvIGJyZWFrIHRoZSBjb250ZW50IGJ1dCB0aGUgYXZhaWxhYmxl
IHNwYWNlIGNhbid0IGV2ZW4gYWNjb21tb2RhdGUgdGhlIGZpcnN0IGdseXBoLgotICAgICAgICAg
ICAgICAgIC8vIDEuIFdyYXAgdGhlIGNvbnRlbnQgb3ZlciB0byB0aGUgbmV4dCBsaW5lIHdoZW4g
d2UndmUgZ290IGNvbnRlbnQgb24gdGhlIGxpbmUgYWxyZWFkeS4KLSAgICAgICAgICAgICAgICAv
LyAyLiBLZWVwIHRoZSBmaXJzdCBnbHlwaCBvbiB0aGUgZW1wdHkgbGluZSAob3Iga2VlcCB0aGUg
d2hvbGUgcnVuIGlmIGl0IGhhcyBvbmx5IG9uZSBnbHlwaC9jb21wbGV0ZWx5IGVtcHR5KS4KLSAg
ICAgICAgICAgICAgICBpZiAobGluZVN0YXR1cy5oYXNDb250ZW50KQotICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246OldyYXAsIElzRW5kT2ZMaW5lOjpZ
ZXMgfTsKLSAgICAgICAgICAgICAgICBhdXRvIGxlYWRpbmdUZXh0UnVuSW5kZXggPSAqZmlyc3RU
ZXh0UnVuSW5kZXgoY29udGludW91c0NvbnRlbnQpOwotICAgICAgICAgICAgICAgIGF1dG8mIGlu
bGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGNvbnRpbnVvdXNDb250ZW50
LnJ1bnMoKVtsZWFkaW5nVGV4dFJ1bkluZGV4XS5pbmxpbmVJdGVtKTsKLSAgICAgICAgICAgICAg
ICBpZiAoaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkgPD0gMSkKLSAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIFJlc3VsdCB7IFJlc3VsdDo6QWN0aW9uOjpLZWVwLCBJc0VuZE9mTGluZTo6WWVzIH07
Ci0gICAgICAgICAgICAgICAgYXV0byBmaXJzdENoYXJhY3RlcldpZHRoID0gVGV4dFV0aWw6Ondp
ZHRoKGlubGluZVRleHRJdGVtLCBpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBpbmxpbmVUZXh0SXRl
bS5zdGFydCgpICsgMSwgbGluZVN0YXR1cy5jb250ZW50TG9naWNhbFJpZ2h0KTsKLSAgICAgICAg
ICAgICAgICBhdXRvIGZpcnN0Q2hhcmFjdGVyUnVuID0gUGFydGlhbFJ1biB7IDEsIGZpcnN0Q2hh
cmFjdGVyV2lkdGggfTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpB
Y3Rpb246OkJyZWFrLCBJc0VuZE9mTGluZTo6WWVzLCBSZXN1bHQ6OlBhcnRpYWxUcmFpbGluZ0Nv
bnRlbnQgeyBsZWFkaW5nVGV4dFJ1bkluZGV4LCBmaXJzdENoYXJhY3RlclJ1biB9IH07Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHJhaWxpbmdDb250ZW50LT5vdmVyZmxvd3MgJiYg
bGluZVN0YXR1cy5oYXNDb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbWFuYWdlZCB0
byBicmVhayBhIHJ1biB3aXRoIG92ZXJmbG93IGJ1dCB0aGUgbGluZSBhbHJlYWR5IGhhcyBjb250
ZW50LiBMZXQncyB3cmFwIGl0IHRvIHRoZSBuZXh0IGxpbmUuCi0gICAgICAgICAgICAgICAgcmV0
dXJuIFJlc3VsdCB7IFJlc3VsdDo6QWN0aW9uOjpXcmFwLCBJc0VuZE9mTGluZTo6WWVzIH07Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBFaXRoZXIgd2UgbWFuYWdlZCB0byBicmVhayB3
aXRoIG5vIG92ZXJmbG93IG9yIHRoZSBsaW5lIGlzIGVtcHR5LgotICAgICAgICAgICAgYXV0byB0
cmFpbGluZ1BhcnRpYWxDb250ZW50ID0gUmVzdWx0OjpQYXJ0aWFsVHJhaWxpbmdDb250ZW50IHsg
b3ZlcmZsb3dpbmdDb250ZW50LmJyZWFraW5nUG9zaXRpb24tPnJ1bkluZGV4LCB0cmFpbGluZ0Nv
bnRlbnQtPnBhcnRpYWxSdW4gfTsKLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6
OkFjdGlvbjo6QnJlYWssIElzRW5kT2ZMaW5lOjpZZXMsIHRyYWlsaW5nUGFydGlhbENvbnRlbnQg
fTsKLSAgICAgICAgfTsKLSAgICAgICAgaWYgKGF1dG8gcmVzdWx0ID0gdHJ5QnJlYWtpbmdDb250
ZW50V2l0aFRleHQoKSkKLSAgICAgICAgICAgIHJldHVybiAqcmVzdWx0OwotICAgIH0gZWxzZSBp
ZiAoY29udGludW91c0NvbnRlbnQucnVucygpLnNpemUoKSA+IDEpIHsKLSAgICAgICAgLy8gRklY
TUU6IEFkZCBzdXBwb3J0IGZvciB2YXJpb3VzIGNvbnRlbnQuCi0gICAgICAgIGF1dG8mIHJ1bnMg
PSBjb250aW51b3VzQ29udGVudC5ydW5zKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgcnVucy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaWYgKHJ1bnNbaV0uaW5saW5lSXRl
bS5pc0JveCgpKSB7Ci0gICAgICAgICAgICAgICAgb3ZlcmZsb3dpbmdSdW5JbmRleCA9IGk7Ci0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICAvLyBJZiB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gYnJlYWsgdGhpcyBvdmVyZmxvd2luZyBj
b250ZW50LCB3ZSBzdGlsbCBuZWVkIHRvIGRlY2lkZSB3aGV0aGVyIGtlZXAgaXQgb3Igd3JhcCBp
dCB0byB0aGUgbmV4dCBsaW5lLgotICAgIGlmICghbGluZVN0YXR1cy5oYXNDb250ZW50KQotICAg
ICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCwgSXNFbmRPZkxpbmU6Ok5vIH07Ci0g
ICAgLy8gTm93IGVpdGhlciB3cmFwIHRoaXMgY29udGVudCBvdmVyIHRvIHRoZSBuZXh0IGxpbmUg
b3IgcmV2ZXJ0IGJhY2sgdG8gYW4gZWFybGllciB3cmFwcGluZyBvcHBvcnR1bml0eSwgb3Igbm90
IHdyYXAgYXQgYWxsLgotICAgIGF1dG8gc2hvdWxkV3JhcFVuYnJlYWthYmxlQ29udGVudFRvTmV4
dExpbmUgPSBbJl0gewotICAgICAgICAvLyBUaGUgaW5kaXZpZHVhbCBydW5zIGluIHRoaXMgY29u
dGludW91cyBjb250ZW50IGRvbid0IGJyZWFrLCBsZXQncyBjaGVjayBpZiB3ZSBhcmUgYWxsb3dl
ZCB0byB3cmFwIHRoaXMgY29udGVudCB0byBuZXh0IGxpbmUgKGUuZy4gcHJlIHdvdWxkIHByZXZl
bnQgdXMgZnJvbSB3cmFwcGluZykuCi0gICAgICAgIC8vIFBhcmVudCBzdHlsZSBkcml2ZXMgdGhl
IHdyYXBwaW5nIGJlaGF2aW9yIGhlcmUuCi0gICAgICAgIC8vIGUuZy4gPGRpdiBzdHlsZT0id2hp
dGUtc3BhY2U6IG5vd3JhcCI+c29tZSB0ZXh0PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJs
b2NrOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXAiPjwvZGl2PjwvZGl2Pi4KLSAgICAgICAgLy8gV2hp
bGUgdGhlIGlubGluZS1ibG9jayBoYXMgcHJlLXdyYXAgd2hpY2ggYWxsb3dzIHdyYXBwaW5nLCB0
aGUgY29udGVudCBsaXZlcyBpbiBhIG5vd3JhcCBjb250ZXh0LgotICAgICAgICByZXR1cm4gaXNX
cmFwcGluZ0FsbG93ZWQoY29udGludW91c0NvbnRlbnQucnVucygpW292ZXJmbG93aW5nUnVuSW5k
ZXhdLmlubGluZUl0ZW0pOwotICAgIH07Ci0gICAgaWYgKHNob3VsZFdyYXBVbmJyZWFrYWJsZUNv
bnRlbnRUb05leHRMaW5lKCkpCi0gICAgICAgIHJldHVybiB7IFJlc3VsdDo6QWN0aW9uOjpXcmFw
LCBJc0VuZE9mTGluZTo6WWVzIH07Ci0gICAgaWYgKGxpbmVTdGF0dXMuaGFzV3JhcE9wcG9ydHVu
aXR5QXRQcmV2aW91c1Bvc2l0aW9uKQotICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6
UmV2ZXJ0VG9MYXN0V3JhcE9wcG9ydHVuaXR5LCBJc0VuZE9mTGluZTo6WWVzIH07Ci0gICAgcmV0
dXJuIHsgUmVzdWx0OjpBY3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpObyB9OwotfQotCi1PdmVy
Zmxvd2luZ1RleHRDb250ZW50IElubGluZUNvbnRlbnRCcmVha2VyOjpwcm9jZXNzT3ZlcmZsb3dp
bmdDb250ZW50V2l0aFRleHQoY29uc3QgQ29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250
ZW50LCBjb25zdCBMaW5lU3RhdHVzJiBsaW5lU3RhdHVzKSBjb25zdAotewotICAgIGF1dG8mIHJ1
bnMgPSBjb250aW51b3VzQ29udGVudC5ydW5zKCk7Ci0gICAgQVNTRVJUKCFydW5zLmlzRW1wdHko
KSk7Ci0KLSAgICBhdXRvIGlzQnJlYWthYmxlUnVuID0gW10gKGF1dG8mIHJ1bikgewotICAgICAg
ICBBU1NFUlQocnVuLmlubGluZUl0ZW0uaXNUZXh0KCkgfHwgcnVuLmlubGluZUl0ZW0uaXNJbmxp
bmVCb3hTdGFydCgpIHx8IHJ1bi5pbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkgfHwgcnVuLmlu
bGluZUl0ZW0ubGF5b3V0Qm94KCkuaXNJbWFnZSgpKTsKLSAgICAgICAgaWYgKCFydW4uaW5saW5l
SXRlbS5pc1RleHQoKSkgewotICAgICAgICAgICAgLy8gQ2FuJ3QgYnJlYWsgaG9yaXpvbnRhbCBz
cGFjaW5nIC0+IGUuZy4gPHNwYW4gc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEwMHB4OyI+dGV4dGNv
bnRlbnQ8L3NwYW4+LCBpZiB0aGUgW2lubGluZSBib3ggZW5kXSBpcyB0aGUgb3ZlcmZsb3duIGlu
bGluZSBpdGVtCi0gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlJ3MgYW5v
dGhlciBpbmxpbmUgaXRlbSBiZXlvbmQgdGhlIFtpbmxpbmUgYm94IGVuZF0gdG8gc3BsaXQuCi0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2hlY2sgaWYg
dGhpcyB0ZXh0IHJ1biBuZWVkcyB0byBzdGF5IG9uIHRoZSBjdXJyZW50IGxpbmUuICAKLSAgICAg
ICAgcmV0dXJuIGlzV3JhcHBpbmdBbGxvd2VkKHJ1bi5pbmxpbmVJdGVtKTsKLSAgICB9OwotCi0g
ICAgYXV0byBmaW5kVHJhaWxpbmdSdW5JbmRleCA9IFsmXSAoYXV0byBicmVha2FibGVSdW5JbmRl
eCkgLT4gT3B0aW9uYWw8c2l6ZV90PiB7Ci0gICAgICAgIC8vIFdoZW4gdGhlIGJyZWFraW5nIHBv
c2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJ1biwgdGhlIHRyYWlsaW5nIHJ1biBp
cyB0aGUgcHJldmlvdXMgb25lLgotICAgICAgICBpZiAoIWJyZWFrYWJsZVJ1bkluZGV4KQotICAg
ICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgLy8gVHJ5IG5vdCBicmVhayBjb250ZW50IGF0
IGlubGluZSBib3ggYm91bmRhcnkKLSAgICAgICAgLy8gZS5nLiA8c3Bhbj5maXRzPC9zcGFuPjxz
cGFuPm92ZXJmbG93czwvc3Bhbj4KLSAgICAgICAgLy8gd2hlbiB0aGUgdGV4dCAib3ZlcmZsb3dz
IiBjb21wbGV0ZWx5IG92ZXJmbG93cywgbGV0J3MgYnJlYWsgdGhlIGNvbnRlbnQgcmlnaHQgYmVm
b3JlIHRoZSAnPHNwYW4+Jy4KLSAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBzdWJz
ZXF1ZW50IGVtcHR5IGlubGluZSBib3hlcyBlLmcuCi0gICAgICAgIGF1dG8gdHJhaWxpbmdDYW5k
aWRhdGVJbmRleCA9IGJyZWFrYWJsZVJ1bkluZGV4IC0gMTsKLSAgICAgICAgYXV0byBpc0F0SW5s
aW5lQm94ID0gcnVuc1t0cmFpbGluZ0NhbmRpZGF0ZUluZGV4XS5pbmxpbmVJdGVtLmlzSW5saW5l
Qm94U3RhcnQoKTsKLSAgICAgICAgcmV0dXJuICFpc0F0SW5saW5lQm94ID8gdHJhaWxpbmdDYW5k
aWRhdGVJbmRleCA6IHRyYWlsaW5nQ2FuZGlkYXRlSW5kZXggPyBtYWtlT3B0aW9uYWwodHJhaWxp
bmdDYW5kaWRhdGVJbmRleCAtIDEpIDogV1RGOjpudWxsb3B0OwotICAgIH07Ci0KLSAgICAvLyBD
aGVjayB3aGVyZSB0aGUgb3ZlcmZsb3cgb2NjdXJzIGFuZCB1c2UgdGhlIGNvcnJlc3BvbmRpbmcg
c3R5bGUgdG8gZmlndXJlIG91dCB0aGUgYnJlYWtpbmcgYmVoYXZpb3VyLgotICAgIC8vIDxzcGFu
IHN0eWxlPSJ3b3JkLWJyZWFrOiBub3JtYWwiPmZpcnN0PC9zcGFuPjxzcGFuIHN0eWxlPSJ3b3Jk
LWJyZWFrOiBicmVhay1hbGwiPnNlY29uZDwvc3Bhbj48c3BhbiBzdHlsZT0id29yZC1icmVhazog
bm9ybWFsIj50aGlyZDwvc3Bhbj4KLQotICAgIC8vIEZpcnN0IGZpbmQgdGhlIG92ZXJmbG93aW5n
IHJ1bi4gCi0gICAgYXV0byBhY2N1bXVsYXRlZENvbnRlbnRXaWR0aCA9IElubGluZUxheW91dFVu
aXQgeyB9OwotICAgIGF1dG8gb3ZlcmZsb3dpbmdSdW5JbmRleCA9IHJ1bnMuc2l6ZSgpOyAKLSAg
ICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsK
LSAgICAgICAgYXV0byBydW5Mb2dpY2FsV2lkdGggPSBydW5zW2luZGV4XS5sb2dpY2FsV2lkdGg7
Ci0gICAgICAgIGlmIChhY2N1bXVsYXRlZENvbnRlbnRXaWR0aCArIHJ1bkxvZ2ljYWxXaWR0aCAg
PiBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKSB7Ci0gICAgICAgICAgICBvdmVyZmxvd2luZ1J1
bkluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBh
Y2N1bXVsYXRlZENvbnRlbnRXaWR0aCArPSBydW5Mb2dpY2FsV2lkdGg7Ci0gICAgfQotICAgIC8v
IFdlIGhhdmUgdG8gaGF2ZSBhbiBvdmVyZmxvd2luZyBydW4uCi0gICAgUkVMRUFTRV9BU1NFUlQo
b3ZlcmZsb3dpbmdSdW5JbmRleCA8IHJ1bnMuc2l6ZSgpKTsKLQotICAgIGF1dG8gdHJ5QnJlYWtp
bmdPdmVyZmxvd2luZ1J1biA9IFsmXSgpIC0+IE9wdGlvbmFsPE92ZXJmbG93aW5nVGV4dENvbnRl
bnQ6OkJyZWFraW5nUG9zaXRpb24+IHsKLSAgICAgICAgYXV0byBvdmVyZmxvd2luZ1J1biA9IHJ1
bnNbb3ZlcmZsb3dpbmdSdW5JbmRleF07Ci0gICAgICAgIGlmICghaXNCcmVha2FibGVSdW4ob3Zl
cmZsb3dpbmdSdW4pKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgaWYgKGF1dG8g
cGFydGlhbFJ1biA9IHRyeUJyZWFraW5nVGV4dFJ1bihvdmVyZmxvd2luZ1J1biwgbGluZVN0YXR1
cy5jb250ZW50TG9naWNhbFJpZ2h0ICsgYWNjdW11bGF0ZWRDb250ZW50V2lkdGgsIHN0ZDo6bWF4
KDAuMGYsIGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGggLSBhY2N1bXVsYXRlZENvbnRlbnRXaWR0
aCksIGxpbmVTdGF0dXMuaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSkgewot
ICAgICAgICAgICAgaWYgKHBhcnRpYWxSdW4tPmxlbmd0aCkKLSAgICAgICAgICAgICAgICByZXR1
cm4gT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IG92ZXJmbG93aW5n
UnVuSW5kZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb246OlRyYWls
aW5nQ29udGVudCB7IGZhbHNlLCBwYXJ0aWFsUnVuIH0gfTsKLSAgICAgICAgICAgIC8vIFdoZW4g
dGhlIGJyZWFraW5nIHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJ1biwgdGhl
IHRyYWlsaW5nIHJ1biBpcyB0aGUgcHJldmlvdXMgb25lLgotICAgICAgICAgICAgaWYgKGF1dG8g
dHJhaWxpbmdSdW5JbmRleCA9IGZpbmRUcmFpbGluZ1J1bkluZGV4KG92ZXJmbG93aW5nUnVuSW5k
ZXgpKQotICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVh
a2luZ1Bvc2l0aW9uIHsgKnRyYWlsaW5nUnVuSW5kZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6
OkJyZWFraW5nUG9zaXRpb246OlRyYWlsaW5nQ29udGVudCB7IH0gfTsKLSAgICAgICAgICAgIC8v
IFNvbWV0aW1lcyB3ZSBjYW4ndCBhY2NvbW1vZGF0ZSBldmVuIHRoZSB2ZXJ5IGZpcnN0IGNoYXJh
Y3Rlci4gCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB3
aGVuIHRoZXJlJ3Mgbm8gYnJlYWthYmxlIHJ1biBpbiB0aGlzIHNldC4KLSAgICAgICAgICAgIHJl
dHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgfTsKLSAgICAg
ICAgfQotICAgICAgICByZXR1cm4geyB9OwotICAgIH07Ci0gICAgLy8gQ2hlY2sgaWYgd2UgYWN0
dWFsbHkgYnJlYWsgdGhpcyBydW4uCi0gICAgaWYgKGF1dG8gYnJlYWtpbmdQb3NpdGlvbiA9IHRy
eUJyZWFraW5nT3ZlcmZsb3dpbmdSdW4oKSkKLSAgICAgICAgcmV0dXJuIHsgb3ZlcmZsb3dpbmdS
dW5JbmRleCwgYnJlYWtpbmdQb3NpdGlvbiB9OwotCi0gICAgYXV0byB0cnlCcmVha2luZ1ByZXZp
b3VzTm9uT3ZlcmZsb3dpbmdSdW5zID0gWyZdKCkgLT4gT3B0aW9uYWw8T3ZlcmZsb3dpbmdUZXh0
Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbj4gewotICAgICAgICBhdXRvIHByZXZpb3VzQ29udGVu
dFdpZHRoID0gYWNjdW11bGF0ZWRDb250ZW50V2lkdGg7Ci0gICAgICAgIGZvciAoYXV0byBpbmRl
eCA9IG92ZXJmbG93aW5nUnVuSW5kZXg7IGluZGV4LS07KSB7Ci0gICAgICAgICAgICBhdXRvJiBy
dW4gPSBydW5zW2luZGV4XTsKLSAgICAgICAgICAgIHByZXZpb3VzQ29udGVudFdpZHRoIC09IHJ1
bi5sb2dpY2FsV2lkdGg7Ci0gICAgICAgICAgICBpZiAoIWlzQnJlYWthYmxlUnVuKHJ1bikpCi0g
ICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBBU1NFUlQocnVuLmlubGluZUl0
ZW0uaXNUZXh0KCkpOwotICAgICAgICAgICAgaWYgKGF1dG8gcGFydGlhbFJ1biA9IHRyeUJyZWFr
aW5nVGV4dFJ1bihydW4sIGxpbmVTdGF0dXMuY29udGVudExvZ2ljYWxSaWdodCArIHByZXZpb3Vz
Q29udGVudFdpZHRoLCB7IH0sIGxpbmVTdGF0dXMuaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91
c1Bvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgdGhpcyBydW4gZml0cywg
c28gaWYgYnJlYWtpbmcgaXMgYWxsb3dlZCBvbiB0aGUgcnVuLCBpdCBzaG91bGQgcmV0dXJuIGEg
bm9uLWVtcHR5IGxlZnQtc2lkZQotICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0J3MgZWl0aGVy
IGF0IGh5cGhlbiBwb3NpdGlvbiBvciB0aGUgZW50aXJlIHJ1biBpcyByZXR1cm5lZC4KLSAgICAg
ICAgICAgICAgICBBU1NFUlQocGFydGlhbFJ1bi0+bGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBh
dXRvIHJ1bklzRnVsbHlBY2NvbW1vZGF0ZWQgPSBwYXJ0aWFsUnVuLT5sZW5ndGggPT0gZG93bmNh
c3Q8SW5saW5lVGV4dEl0ZW0+KHJ1bi5pbmxpbmVJdGVtKS5sZW5ndGgoKTsKLSAgICAgICAgICAg
ICAgICByZXR1cm4gT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IGlu
ZGV4LCBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uOjpUcmFpbGluZ0Nv
bnRlbnQgeyBmYWxzZSwgcnVuSXNGdWxseUFjY29tbW9kYXRlZCA/IFdURjo6bnVsbG9wdCA6IHBh
cnRpYWxSdW4gfSB9OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB7
IH07Ci0gICAgfTsKLSAgICAvLyBXZSBkaWQgbm90IG1hbmFnZSB0byBicmVhayB0aGUgcnVuIHRo
YXQgYWN0dWFsbHkgb3ZlcmZsb3dzIHRoZSBsaW5lLgotICAgIC8vIExldCdzIHRyeSB0byBmaW5k
IGEgcHJldmlvdXMgYnJlYWtpbmcgcG9zaXRpb24gc3RhcnRpbmcgZnJvbSB0aGUgb3ZlcmZsb3dp
bmcgcnVuLiBJdCBzdXJlbHkgZml0cy4KLSAgICBpZiAoYXV0byBicmVha2luZ1Bvc2l0aW9uID0g
dHJ5QnJlYWtpbmdQcmV2aW91c05vbk92ZXJmbG93aW5nUnVucygpKQotICAgICAgICByZXR1cm4g
eyBvdmVyZmxvd2luZ1J1bkluZGV4LCBicmVha2luZ1Bvc2l0aW9uIH07Ci0KLSAgICBhdXRvIHRy
eUJyZWFraW5nTmV4dE92ZXJmbG93aW5nUnVucyA9IFsmXSgpIC0+IE9wdGlvbmFsPE92ZXJmbG93
aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb24+IHsKLSAgICAgICAgYXV0byBuZXh0Q29u
dGVudFdpZHRoID0gYWNjdW11bGF0ZWRDb250ZW50V2lkdGggKyBydW5zW292ZXJmbG93aW5nUnVu
SW5kZXhdLmxvZ2ljYWxXaWR0aDsKLSAgICAgICAgZm9yIChhdXRvIGluZGV4ID0gb3ZlcmZsb3dp
bmdSdW5JbmRleCArIDE7IGluZGV4IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsKLSAgICAgICAg
ICAgIGF1dG8mIHJ1biA9IHJ1bnNbaW5kZXhdOwotICAgICAgICAgICAgaWYgKGlzQnJlYWthYmxl
UnVuKHJ1bikpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQocnVuLmlubGluZUl0ZW0uaXNUZXh0
KCkpOwotICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGlzIHJ1biBkb2VzIG5vdCBm
aXQgdGhlIGF2YWlsYWJsZSBzcGFjZS4gSWYgd2UgY2FuIGJyZWFrIGl0IGF0IGFueSBwb3NpdGlv
biwgbGV0J3MganVzdCB1c2UgdGhlIHN0YXJ0IG9mIHRoZSBydW4uCi0gICAgICAgICAgICAgICAg
aWYgKHdvcmRCcmVha0JlaGF2aW9yKHJ1bi5pbmxpbmVJdGVtLnN0eWxlKCksIGxpbmVTdGF0dXMu
aGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSA9PSBXb3JkQnJlYWtSdWxlOjpB
dEFyYml0cmFyeVBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgYmUg
b24gYW4gaW5saW5lIGJveCBib3VuZGFyeS4gTGV0J3MgZ28gYmFjayB0byB0aGUgcnVuIGluIGZy
b250IG9mIHRoZSBpbmxpbmUgYm94IHN0YXJ0IHJ1bi4KLSAgICAgICAgICAgICAgICAgICAgLy8g
ZS5nLiA8c3Bhbj51bmJyZWFrYWJsZV9hbmRfb3ZlcmZsb3c8c3BhbiBzdHlsZT0id29yZC1icmVh
azogYnJlYWstYWxsIj5icmVha2FibGU8L3NwYW4+Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdl
IGFyZSBhdCAiYnJlYWthYmxlIiwgPHNwYW4+IGlzIGF0IGluZGV4IC0gMSBhbmQgdGhlIHRyYWls
aW5nIHJ1biBpcyBhdCBpbmRleCAtIDIuCi0gICAgICAgICAgICAgICAgICAgIEFTU0VSVChydW5z
W2luZGV4IC0gMV0uaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkpOwotICAgICAgICAgICAg
ICAgICAgICBhdXRvIHRyYWlsaW5nUnVuSW5kZXggPSBmaW5kVHJhaWxpbmdSdW5JbmRleChpbmRl
eCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdHJhaWxpbmdSdW5JbmRleCkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjb250aW51b3VzIGNvbnRlbnQgZGlkIG5vdCBmaXQg
ZnJvbSB0aGUgZ2V0LWdvLiBObyB0cmFpbGluZyBydW4uCi0gICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IH07Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gQXQgd29yc3Qgd2Ug
YXJlIGJhY2sgdG8gdGhlIG92ZXJmbG93aW5nIHJ1biwgbGlrZSBpbiB0aGUgZXhhbXBsZSBhYm92
ZS4KLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKCp0cmFpbGluZ1J1bkluZGV4ID49IG92ZXJm
bG93aW5nUnVuSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3ZlcmZsb3dpbmdU
ZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7ICp0cmFpbGluZ1J1bkluZGV4LCBPdmVyZmxv
d2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uOjpUcmFpbGluZ0NvbnRlbnQgeyB0cnVl
IH0gfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGF1dG8gcGFydGlh
bFJ1biA9IHRyeUJyZWFraW5nVGV4dFJ1bihydW4sIGxpbmVTdGF0dXMuY29udGVudExvZ2ljYWxS
aWdodCArIG5leHRDb250ZW50V2lkdGgsIHsgfSwgbGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5p
dHlBdFByZXZpb3VzUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVChwYXJ0
aWFsUnVuLT5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYW5hZ2VkIHRvIGJy
ZWFrIHRoaXMgdGV4dCBydW4gbWlkIGNvbnRlbnQuIEl0IGhhcyB0byBiZSBhIGh5cGhlbiBicmVh
ay4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJy
ZWFraW5nUG9zaXRpb24geyBpbmRleCwgT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQ
b3NpdGlvbjo6VHJhaWxpbmdDb250ZW50IHsgdHJ1ZSwgcGFydGlhbFJ1biB9IH07Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV4dENvbnRlbnRXaWR0aCAr
PSBydW4ubG9naWNhbFdpZHRoOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB7IH07Ci0gICAg
fTsKLSAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB0aGVyZSdzIG5vIGJyZWFrYWJs
ZSBydW4gYWxsIHRoZSB3YXkgdG8gdGhlIG92ZXJmbG93aW5nIHJ1bi4KLSAgICAvLyBOb3cgd2Ug
bmVlZCB0byBjaGVjayBpZiBhbnkgcnVuIGFmdGVyIHRoZSBvdmVyZmxvd2luZyBjb250ZW50IGNh
biBicmVhay4KLSAgICAvLyBlLmcuIDxzcGFuPnRoaXNfY29udGVudF9vdmVyZmxvd3NfYnV0X25v
dF9icmVha2FibGU8c3Bhbj48c3BhbiBzdHlsZT0id29yZC1icmVhazogYnJlYWstYWxsIj5idXRf
dGhpc19pc19icmVha2FibGU8L3NwYW4+Ci0gICAgaWYgKGF1dG8gYnJlYWtpbmdQb3NpdGlvbiA9
IHRyeUJyZWFraW5nTmV4dE92ZXJmbG93aW5nUnVucygpKQotICAgICAgICByZXR1cm4geyBvdmVy
Zmxvd2luZ1J1bkluZGV4LCBicmVha2luZ1Bvc2l0aW9uIH07Ci0KLSAgICAvLyBHaXZlIHVwLCB0
aGVyZSdzIG5vIGJyZWFrYWJsZSBydW4gaW4gaGVyZS4KLSAgICByZXR1cm4geyBvdmVyZmxvd2lu
Z1J1bkluZGV4IH07Ci19Ci0KLU9wdGlvblNldDxJbmxpbmVDb250ZW50QnJlYWtlcjo6V29yZEJy
ZWFrUnVsZT4gSW5saW5lQ29udGVudEJyZWFrZXI6OndvcmRCcmVha0JlaGF2aW9yKGNvbnN0IFJl
bmRlclN0eWxlJiBzdHlsZSwgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRp
b24pIGNvbnN0Ci17Ci0gICAgLy8gRGlzcmVnYXJkIGFueSBwcm9oaWJpdGlvbiBhZ2FpbnN0IGxp
bmUgYnJlYWtzIG1hbmRhdGVkIGJ5IHRoZSB3b3JkLWJyZWFrIHByb3BlcnR5LgotICAgIC8vIFRo
ZSBkaWZmZXJlbnQgd3JhcHBpbmcgb3Bwb3J0dW5pdGllcyBtdXN0IG5vdCBiZSBwcmlvcml0aXpl
ZC4gSHlwaGVuYXRpb24gaXMgbm90IGFwcGxpZWQuCi0gICAgaWYgKHN0eWxlLmxpbmVCcmVhaygp
ID09IExpbmVCcmVhazo6QW55d2hlcmUpCi0gICAgICAgIHJldHVybiB7IFdvcmRCcmVha1J1bGU6
OkF0QXJiaXRyYXJ5UG9zaXRpb24gfTsKLSAgICAvLyBCcmVha2luZyBpcyBhbGxvd2VkIHdpdGhp
biDigJx3b3Jkc+KAnS4KLSAgICBpZiAoc3R5bGUud29yZEJyZWFrKCkgPT0gV29yZEJyZWFrOjpC
cmVha0FsbCkKLSAgICAgICAgcmV0dXJuIHsgV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3Np
dGlvbiB9OwotICAgIC8vIEJyZWFraW5nIGlzIGZvcmJpZGRlbiB3aXRoaW4g4oCcd29yZHPigJ0u
Ci0gICAgaWYgKHN0eWxlLndvcmRCcmVhaygpID09IFdvcmRCcmVhazo6S2VlcEFsbCkKLSAgICAg
ICAgcmV0dXJuIHsgfTsKLQotICAgIGF1dG8gYnJlYWtSdWxlcyA9IE9wdGlvblNldDxXb3JkQnJl
YWtSdWxlPiB7IH07Ci0gICAgYXV0byBoeXBoZW5hdGlvbklzQWxsb3dlZCA9ICFuX2h5cGhlbmF0
aW9uSXNEaXNhYmxlZCAmJiBzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVuczo6QXV0byAmJiBjYW5I
eXBoZW5hdGUoc3R5bGUuY29tcHV0ZWRMb2NhbGUoKSk7Ci0gICAgaWYgKGh5cGhlbmF0aW9uSXNB
bGxvd2VkKQotICAgICAgICBicmVha1J1bGVzLmFkZCh7IFdvcmRCcmVha1J1bGU6OkF0SHlwaGVu
YXRpb25PcHBvcnR1bml0aWVzIH0pOwotICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbGVn
YWN5IGNvbnRlbnQsIHRoZSB3b3JkLWJyZWFrIHByb3BlcnR5IGFsc28gc3VwcG9ydHMgYSBkZXBy
ZWNhdGVkIGJyZWFrLXdvcmQga2V5d29yZC4KLSAgICAvLyBXaGVuIHNwZWNpZmllZCwgdGhpcyBo
YXMgdGhlIHNhbWUgZWZmZWN0IGFzIHdvcmQtYnJlYWs6IG5vcm1hbCBhbmQgb3ZlcmZsb3ctd3Jh
cDogYW55d2hlcmUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgb3ZlcmZs
b3ctd3JhcCBwcm9wZXJ0eS4KLSAgICBpZiAoc3R5bGUud29yZEJyZWFrKCkgPT0gV29yZEJyZWFr
OjpCcmVha1dvcmQgJiYgIWhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgewot
ICAgICAgICBicmVha1J1bGVzLmFkZCh7IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRp
b24gfSk7Ci0gICAgICAgIHJldHVybiBicmVha1J1bGVzOwotICAgIH0KLSAgICAvLyBPdmVyZmxv
d1dyYXA6OkJyZWFrOiBBbiBvdGhlcndpc2UgdW5icmVha2FibGUgc2VxdWVuY2Ugb2YgY2hhcmFj
dGVycyBtYXkgYmUgYnJva2VuIGF0IGFuIGFyYml0cmFyeSBwb2ludCBpZiB0aGVyZSBhcmUgbm8g
b3RoZXJ3aXNlLWFjY2VwdGFibGUgYnJlYWsgcG9pbnRzIGluIHRoZSBsaW5lLgotICAgIGlmIChz
dHlsZS5vdmVyZmxvd1dyYXAoKSA9PSBPdmVyZmxvd1dyYXA6OkJyZWFrICYmICFoYXNXcmFwT3Bw
b3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pIHsKLSAgICAgICAgYnJlYWtSdWxlcy5hZGQoeyBX
b3JkQnJlYWtSdWxlOjpBdEFyYml0cmFyeVBvc2l0aW9uIH0pOwotICAgICAgICByZXR1cm4gYnJl
YWtSdWxlczsKLSAgICB9Ci0gICAgcmV0dXJuIGJyZWFrUnVsZXM7Ci19Ci0KLU9wdGlvbmFsPElu
bGluZUNvbnRlbnRCcmVha2VyOjpQYXJ0aWFsUnVuPiBJbmxpbmVDb250ZW50QnJlYWtlcjo6dHJ5
QnJlYWtpbmdUZXh0UnVuKGNvbnN0IENvbnRpbnVvdXNDb250ZW50OjpSdW4mIG92ZXJmbG93aW5n
UnVuLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRV
bml0PiBhdmFpbGFibGVXaWR0aCwgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9z
aXRpb24pIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG92ZXJmbG93aW5nUnVuLmlubGluZUl0ZW0uaXNU
ZXh0KCkpOwotICAgIGF1dG8mIGlubGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0
ZW0+KG92ZXJmbG93aW5nUnVuLmlubGluZUl0ZW0pOwotICAgIGF1dG8mIHN0eWxlID0gaW5saW5l
VGV4dEl0ZW0uc3R5bGUoKTsKLSAgICBhdXRvIGF2YWlsYWJsZVNwYWNlSXNJbmZpbml0ZSA9ICFh
dmFpbGFibGVXaWR0aC5oYXNWYWx1ZSgpOwotCi0gICAgYXV0byBicmVha1J1bGVzID0gd29yZEJy
ZWFrQmVoYXZpb3Ioc3R5bGUsIGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbik7
Ci0gICAgaWYgKGJyZWFrUnVsZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4geyB9OwotCi0g
ICAgaWYgKGJyZWFrUnVsZXMuY29udGFpbnMoV29yZEJyZWFrUnVsZTo6QXRIeXBoZW5hdGlvbk9w
cG9ydHVuaXRpZXMpKSB7Ci0gICAgICAgIGF1dG8gdHJ5QnJlYWtpbmdBdEh5cGhlbmF0aW9uT3Bw
b3J0dW5pdHkgPSBbJl0oKSAtPiBPcHRpb25hbDxQYXJ0aWFsUnVuPiB7Ci0gICAgICAgICAgICAv
LyBGaW5kIHRoZSBoeXBoZW4gcG9zaXRpb24gYXMgZm9sbG93czoKLSAgICAgICAgICAgIC8vIDEu
IFNwbGl0IHRoZSB0ZXh0IGJ5IHRha2luZyB0aGUgaHlwaGVuIHdpZHRoIGludG8gYWNjb3VudAot
ICAgICAgICAgICAgLy8gMi4gRmluZCB0aGUgbGFzdCBoeXBoZW4gcG9zaXRpb24gYmVmb3JlIHRo
ZSBzcGxpdCBwb3NpdGlvbgotICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVTcGFjZUlzSW5maW5p
dGUgJiYgISphdmFpbGFibGVXaWR0aCkgewotICAgICAgICAgICAgICAgIC8vIFdlIHdvbid0IGJl
IGFibGUgdG8gZmluZCBoeXBoZW4gbG9jYXRpb24gd2hlbiB0aGVyZSdzIG5vIGF2YWlsYWJsZSBz
cGFjZS4KLSAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgYXV0byBydW5MZW5ndGggPSBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKTsKLSAgICAgICAg
ICAgIHVuc2lnbmVkIGxpbWl0QmVmb3JlID0gc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgp
ID09IFJlbmRlclN0eWxlOjppbml0aWFsSHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpID8gMCA6IHN0
eWxlLmh5cGhlbmF0aW9uTGltaXRCZWZvcmUoKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxpbWl0
QWZ0ZXIgPSBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QWZ0ZXIoKSA9PSBSZW5kZXJTdHlsZTo6aW5p
dGlhbEh5cGhlbmF0aW9uTGltaXRBZnRlcigpID8gMCA6IHN0eWxlLmh5cGhlbmF0aW9uTGltaXRB
ZnRlcigpOwotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBydW4gY2FuIGFjY29tbW9kYXRl
IHRoZSBiZWZvcmUvYWZ0ZXIgbGltaXRzIGF0IGFsbCBiZWZvcmUgc3RhcnQgbWVhc3VyaW5nIHRl
eHQuCi0gICAgICAgICAgICBpZiAobGltaXRCZWZvcmUgPj0gcnVuTGVuZ3RoIHx8IGxpbWl0QWZ0
ZXIgPj0gcnVuTGVuZ3RoIHx8IGxpbWl0QmVmb3JlICsgbGltaXRBZnRlciA+IHJ1bkxlbmd0aCkK
LSAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotCi0gICAgICAgICAgICB1bnNpZ25lZCBsZWZ0
U2lkZUxlbmd0aCA9IHJ1bkxlbmd0aDsKLSAgICAgICAgICAgIGF1dG8mIGZvbnRDYXNjYWRlID0g
c3R5bGUuZm9udENhc2NhZGUoKTsKLSAgICAgICAgICAgIGF1dG8gaHlwaGVuV2lkdGggPSBJbmxp
bmVMYXlvdXRVbml0IHsgZm9udENhc2NhZGUud2lkdGgoVGV4dFJ1biB7IFN0cmluZ1ZpZXcgeyBz
dHlsZS5oeXBoZW5TdHJpbmcoKSB9IH0pIH07Ci0gICAgICAgICAgICBpZiAoIWF2YWlsYWJsZVNw
YWNlSXNJbmZpbml0ZSkgewotICAgICAgICAgICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGhFeGNs
dWRpbmdIeXBoZW4gPSAqYXZhaWxhYmxlV2lkdGggLSBoeXBoZW5XaWR0aDsKLSAgICAgICAgICAg
ICAgICBpZiAoYXZhaWxhYmxlV2lkdGhFeGNsdWRpbmdIeXBoZW4gPD0gMCB8fCAhZW5vdWdoV2lk
dGhGb3JIeXBoZW5hdGlvbihhdmFpbGFibGVXaWR0aEV4Y2x1ZGluZ0h5cGhlbiwgZm9udENhc2Nh
ZGUucGl4ZWxTaXplKCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAg
ICAgICAgICAgIGxlZnRTaWRlTGVuZ3RoID0gVGV4dFV0aWw6OnNwbGl0KGlubGluZVRleHRJdGVt
LCBvdmVyZmxvd2luZ1J1bi5sb2dpY2FsV2lkdGgsIGF2YWlsYWJsZVdpZHRoRXhjbHVkaW5nSHlw
aGVuLCBsb2dpY2FsTGVmdCkubGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYg
KGxlZnRTaWRlTGVuZ3RoIDwgbGltaXRCZWZvcmUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHsg
fTsKLSAgICAgICAgICAgIC8vIEFkanVzdCBiZWZvcmUgaW5kZXggdG8gYWNjb21tb2RhdGUgdGhl
IGxpbWl0LWFmdGVyIHZhbHVlIChpdCdzIHRoZSBsYXN0IHBvdGVudGlhbCBoeXBoZW4gbG9jYXRp
b24gaW4gdGhpcyBydW4pLgotICAgICAgICAgICAgYXV0byBoeXBoZW5CZWZvcmUgPSBzdGQ6Om1p
bihsZWZ0U2lkZUxlbmd0aCwgcnVuTGVuZ3RoIC0gbGltaXRBZnRlcikgKyAxOwotICAgICAgICAg
ICAgdW5zaWduZWQgaHlwaGVuTG9jYXRpb24gPSBsYXN0SHlwaGVuTG9jYXRpb24oU3RyaW5nVmll
dyhpbmxpbmVUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpKS5zdWJzdHJpbmcoaW5s
aW5lVGV4dEl0ZW0uc3RhcnQoKSwgaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpLCBoeXBoZW5CZWZv
cmUsIHN0eWxlLmNvbXB1dGVkTG9jYWxlKCkpOwotICAgICAgICAgICAgaWYgKCFoeXBoZW5Mb2Nh
dGlvbiB8fCBoeXBoZW5Mb2NhdGlvbiA8IGxpbWl0QmVmb3JlKQotICAgICAgICAgICAgICAgIHJl
dHVybiB7IH07Ci0gICAgICAgICAgICAvLyBoeXBoZW5Mb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0
aGUgc3RhcnQgb2YgdGhpcyBJbmxpbmVJdGVtVGV4dC4KLSAgICAgICAgICAgIEFTU0VSVChpbmxp
bmVUZXh0SXRlbS5zdGFydCgpICsgaHlwaGVuTG9jYXRpb24gPCBpbmxpbmVUZXh0SXRlbS5lbmQo
KSk7Ci0gICAgICAgICAgICBhdXRvIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoV2l0aEh5cGhlbiA9
IFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwg
aW5saW5lVGV4dEl0ZW0uc3RhcnQoKSArIGh5cGhlbkxvY2F0aW9uLCBsb2dpY2FsTGVmdCk7Ci0g
ICAgICAgICAgICByZXR1cm4gUGFydGlhbFJ1biB7IGh5cGhlbkxvY2F0aW9uLCB0cmFpbGluZ1Bh
cnRpYWxSdW5XaWR0aFdpdGhIeXBoZW4sIGh5cGhlbldpZHRoIH07Ci0gICAgICAgIH07Ci0gICAg
ICAgIGlmIChhdXRvIHBhcnRpYWxSdW4gPSB0cnlCcmVha2luZ0F0SHlwaGVuYXRpb25PcHBvcnR1
bml0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHBhcnRpYWxSdW47Ci0gICAgfQotCi0gICAgaWYg
KGJyZWFrUnVsZXMuY29udGFpbnMoV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbikp
IHsKLSAgICAgICAgYXV0byB0cnlCcmVha2luZ0F0QXJiaXRyYXJ5UG9zaXRpb24gPSBbJl0oKSAt
PiBQYXJ0aWFsUnVuIHsKLSAgICAgICAgICAgIGlmICghaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkp
IHsKLSAgICAgICAgICAgICAgICAvLyBFbXB0eSB0ZXh0IHJ1bnMgbWF5IGJlIGJyZWFrYWJsZSBi
YXNlZCBvbiBzdHlsZSwgYnV0IGluIHByYWN0aWNlIHdlIGNhbid0IHJlYWxseSBzcGxpdCB0aGVt
IGFueSBmdXJ0aGVyLgotICAgICAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBpZiAoYXZhaWxhYmxlU3BhY2VJc0luZmluaXRlKSB7Ci0gICAgICAgICAg
ICAgICAgLy8gV2hlbiB0aGUgcnVuIGNhbiBiZSBzcGxpdCBhdCBhcmJpdHJhcnkgcG9zaXRpb24g
bGV0J3MganVzdCByZXR1cm4gdGhlIGVudGlyZSBydW4gd2hlbiBpdCBpcyBpbnRlbmRlZCB0byBm
aXQgb24gdGhlIGxpbmUuCi0gICAgICAgICAgICAgICAgQVNTRVJUKGlubGluZVRleHRJdGVtLmxl
bmd0aCgpKTsKLSAgICAgICAgICAgICAgICBhdXRvIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoID0g
VGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRJdGVtLCBsb2dpY2FsTGVmdCk7Ci0gICAgICAgICAg
ICAgICAgcmV0dXJuIHsgaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCksIHRyYWlsaW5nUGFydGlhbFJ1
bldpZHRoIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoISphdmFpbGFibGVXaWR0
aCkgewotICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgY2FzZXMgd2hlbiB0aGVyZSdz
IG5vIHJvb20gYXQgYWxsLiBUaGUgY29udGVudCBpcyBicmVha2FibGUgYnV0IHdlIGRvbid0IGhh
dmUgc3BhY2UgZm9yIGl0LgotICAgICAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBhdXRvIHNwbGl0RGF0YSA9IFRleHRVdGlsOjpzcGxpdChpbmxpbmVU
ZXh0SXRlbSwgb3ZlcmZsb3dpbmdSdW4ubG9naWNhbFdpZHRoLCAqYXZhaWxhYmxlV2lkdGgsIGxv
Z2ljYWxMZWZ0KTsKLSAgICAgICAgICAgIHJldHVybiB7IHNwbGl0RGF0YS5sZW5ndGgsIHNwbGl0
RGF0YS5sb2dpY2FsV2lkdGggfTsKLSAgICAgICAgfTsKLSAgICAgICAgLy8gV2l0aCBhcmJpdHJh
cnkgYnJlYWtpbmcgdGhlcmUncyBhbHdheXMgYSB2YWxpZCBicmVha2luZyBwb3NpdGlvbiAoZXZl
biBpZiBpdCBpcyBiZWZvcmUgdGhlIGZpcnN0IHBvc2l0aW9uKS4KLSAgICAgICAgcmV0dXJuIHRy
eUJyZWFraW5nQXRBcmJpdHJhcnlQb3NpdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4geyB9Owot
fQotCi12b2lkIElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudDo6YXBwZW5k
KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdp
ZHRoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBjb2xsYXBzaWJsZVdpZHRoKQotewotICAg
IG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGggfSk7Ci0gICAgbV9sb2dp
Y2FsV2lkdGggPSBjbGFtcFRvPElubGluZUxheW91dFVuaXQ+KG1fbG9naWNhbFdpZHRoICsgbG9n
aWNhbFdpZHRoKTsKLSAgICBpZiAoIWNvbGxhcHNpYmxlV2lkdGgpIHsKLSAgICAgICAgbV9jb2xs
YXBzaWJsZUxvZ2ljYWxXaWR0aCA9IHsgfTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBp
ZiAoKmNvbGxhcHNpYmxlV2lkdGggPT0gbG9naWNhbFdpZHRoKSB7Ci0gICAgICAgIC8vIEZ1bGx5
IGNvbGxhcHNpYmxlIHJ1bi4KLSAgICAgICAgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCArPSBs
b2dpY2FsV2lkdGg7Ci0gICAgICAgIEFTU0VSVChtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoIDw9
IG1fbG9naWNhbFdpZHRoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBQYXJ0aWFs
bHkgY29sbGFwc2libGUgcnVuLgotICAgIG1fY29sbGFwc2libGVMb2dpY2FsV2lkdGggPSAqY29s
bGFwc2libGVXaWR0aDsKLSAgICBBU1NFUlQobV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCA8PSBt
X2xvZ2ljYWxXaWR0aCk7Ci19Ci0KLXZvaWQgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVv
dXNDb250ZW50OjpyZXNldCgpCi17Ci0gICAgbV9sb2dpY2FsV2lkdGggPSB7IH07Ci0gICAgbV9j
b2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCA9IHsgfTsKLSAgICBtX3J1bnMuY2xlYXIoKTsKLX0KLQot
fQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9y
bWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lQ29udGVudEJyZWFrZXIuaApkZWxldGVkIGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggNWQyZDRkNmNlOGMxODkzMWQ1ZmU4YjUwYTM3MzAxZDRhY2E4ZTdkOS4uMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5oCisrKyAvZGV2
L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Ci0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
LSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0g
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lm
IEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiTGF5b3V0VW5p
dHMuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1jbGFzcyBSZW5kZXJTdHlsZTsKLQotbmFt
ZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIElubGluZUl0ZW07Ci1zdHJ1Y3QgT3ZlcmZsb3dpbmdU
ZXh0Q29udGVudDsKLQotY2xhc3MgSW5saW5lQ29udGVudEJyZWFrZXIgewotcHVibGljOgotICAg
IHN0cnVjdCBQYXJ0aWFsUnVuIHsKLSAgICAgICAgc2l6ZV90IGxlbmd0aCB7IDAgfTsKLSAgICAg
ICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGggeyAwIH07Ci0gICAgICAgIE9wdGlvbmFs
PElubGluZUxheW91dFVuaXQ+IGh5cGhlbldpZHRoIHsgfTsKLSAgICB9OwotICAgIGVudW0gY2xh
c3MgSXNFbmRPZkxpbmUgeyBObywgWWVzIH07Ci0gICAgc3RydWN0IFJlc3VsdCB7Ci0gICAgICAg
IGVudW0gY2xhc3MgQWN0aW9uIHsKLSAgICAgICAgICAgIEtlZXAsIC8vIEtlZXAgY29udGVudCBv
biB0aGUgY3VycmVudCBsaW5lLgotICAgICAgICAgICAgQnJlYWssIC8vIFBhcnRpYWwgY29udGVu
dCBpcyBvbiB0aGUgY3VycmVudCBsaW5lLgotICAgICAgICAgICAgV3JhcCwgLy8gQ29udGVudCBp
cyB3cmFwcGVkIHRvIHRoZSBuZXh0IGxpbmUuCi0gICAgICAgICAgICBXcmFwV2l0aEh5cGhlbiwg
Ly8gQ29udGVudCBpcyB3cmFwcGVkIHRvIHRoZSBuZXh0IGxpbmUgYW5kIHRoZSBjdXJyZW50IGxp
bmUgZW5kcyB3aXRoIGEgdmlzaWJsZSBoeXBoZW4uCi0gICAgICAgICAgICAvLyBUaGUgY3VycmVu
dCBjb250ZW50IG92ZXJmbG93cyBhbmQgY2FuJ3QgZ2V0IGJyb2tlbiB1cCBpbnRvIHNtYWxsZXIg
Yml0cy4KLSAgICAgICAgICAgIFJldmVydFRvTGFzdFdyYXBPcHBvcnR1bml0eSwgLy8gVGhlIGNv
bnRlbnQgbmVlZHMgdG8gYmUgcmV2ZXJ0ZWQgYmFjayB0byB0aGUgbGFzdCB3cmFwIG9wcG9ydHVu
aXR5LgotICAgICAgICAgICAgUmV2ZXJ0VG9MYXN0Tm9uT3ZlcmZsb3dpbmdXcmFwT3Bwb3J0dW5p
dHkgLy8gVGhlIGNvbnRlbnQgbmVlZHMgdG8gYmUgcmV2ZXJ0ZWQgYmFjayB0byBhIHdyYXAgb3Bw
b3J0dW5pdHkgdGhhdCBzdGlsbCBmaXRzIHRoZSBsaW5lLgotICAgICAgICB9OwotICAgICAgICBz
dHJ1Y3QgUGFydGlhbFRyYWlsaW5nQ29udGVudCB7Ci0gICAgICAgICAgICBzaXplX3QgdHJhaWxp
bmdSdW5JbmRleCB7IDAgfTsKLSAgICAgICAgICAgIE9wdGlvbmFsPFBhcnRpYWxSdW4+IHBhcnRp
YWxSdW47IC8vIG51bGxvcHQgcGFydGlhbCBydW4gbWVhbnMgdGhlIHRyYWlsaW5nIHJ1biBpcyBh
IGNvbXBsZXRlIHJ1bi4KLSAgICAgICAgfTsKLSAgICAgICAgQWN0aW9uIGFjdGlvbiB7IEFjdGlv
bjo6S2VlcCB9OwotICAgICAgICBJc0VuZE9mTGluZSBpc0VuZE9mTGluZSB7IElzRW5kT2ZMaW5l
OjpObyB9OwotICAgICAgICBPcHRpb25hbDxQYXJ0aWFsVHJhaWxpbmdDb250ZW50PiBwYXJ0aWFs
VHJhaWxpbmdDb250ZW50IHsgfTsKLSAgICAgICAgY29uc3QgSW5saW5lSXRlbSogbGFzdFdyYXBP
cHBvcnR1bml0eUl0ZW0geyBudWxscHRyIH07Ci0gICAgfTsKLQotICAgIC8vIFRoaXMgc3RydWN0
IHJlcHJlc2VudHMgdGhlIGFtb3VudCBvZiBjb250aW51b3VzIGNvbnRlbnQgY29tbWl0dGVkIHRv
IGNvbnRlbnQgYnJlYWtpbmcgYXQgYSB0aW1lIChubyBpbi1iZXR3ZWVuIHdyYXAgb3Bwb3J0dW5p
dGllcykuCi0gICAgLy8gZS5nLgotICAgIC8vIDxkaXY+dGV4dCBjb250ZW50IDxzcGFuPnNwYW4x
PC9zcGFuPmJldHdlZW48c3Bhbj5zcGFuMjwvc3Bhbj48L2Rpdj4KLSAgICAvLyBbdGV4dF1bIF1b
Y29udGVudF1bIF1baW5saW5lIGJveCBzdGFydF1bc3BhbjFdW2lubGluZSBib3ggZW5kXVtiZXR3
ZWVuXVtpbmxpbmUgYm94IHN0YXJ0XVtzcGFuMl1baW5saW5lIGJveCBlbmRdCi0gICAgLy8gY29u
dGludW91cyBjYW5kaWRhdGUgY29udGVudCBhdCBhIHRpbWU6Ci0gICAgLy8gMS4gW3RleHRdCi0g
ICAgLy8gMi4gWyBdCi0gICAgLy8gMy4gW2NvbnRlbnRdCi0gICAgLy8gNC4gWyBdCi0gICAgLy8g
NS4gW2lubGluZSBib3ggc3RhcnRdW3NwYW4xXVtpbmxpbmUgYm94IGVuZF1bYmV0d2Vlbl1baW5s
aW5lIGJveCBzdGFydF1bc3BhbjJdW2lubGluZSBib3ggZW5kXQotICAgIC8vIHNlZSBodHRwczov
L2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jbGluZS1icmVhay1kZXRhaWxzCi0gICAgc3Ry
dWN0IENvbnRpbnVvdXNDb250ZW50IHsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
V2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxXaWR0aDsgfQotICAgICAgICBJbmxpbmVM
YXlvdXRVbml0IGNvbGxhcHNpYmxlTG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9jb2xs
YXBzaWJsZUxvZ2ljYWxXaWR0aDsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG5vbkNvbGxh
cHNpYmxlTG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFdpZHRoKCkgLSBjb2xs
YXBzaWJsZUxvZ2ljYWxXaWR0aCgpOyB9Ci0gICAgICAgIGJvb2wgaGFzVHJhaWxpbmdDb2xsYXBz
aWJsZUNvbnRlbnQoKSBjb25zdCB7IHJldHVybiAhIWNvbGxhcHNpYmxlTG9naWNhbFdpZHRoKCk7
IH0KLSAgICAgICAgYm9vbCBpc0Z1bGx5Q29sbGFwc2libGUoKSBjb25zdCB7IHJldHVybiBsb2dp
Y2FsV2lkdGgoKSA9PSBjb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCgpOyB9Ci0KLSAgICAgICAgdm9p
ZCBhcHBlbmQoY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRo
LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBjb2xsYXBzaWJsZVdpZHRoKTsKLSAgICAgICAg
dm9pZCByZXNldCgpOwotCi0gICAgICAgIHN0cnVjdCBSdW4gewotICAgICAgICAgICAgUnVuKGNv
bnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgICAg
ICAgICBSdW4oY29uc3QgUnVuJik7Ci0gICAgICAgICAgICBSdW4mIG9wZXJhdG9yPShjb25zdCBS
dW4mKTsKLQotICAgICAgICAgICAgY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbTsKLSAgICAg
ICAgICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoIHsgMCB9OwotICAgICAgICB9Owot
ICAgICAgICB1c2luZyBSdW5MaXN0ID0gVmVjdG9yPFJ1biwgMz47Ci0gICAgICAgIGNvbnN0IFJ1
bkxpc3QmIHJ1bnMoKSBjb25zdCB7IHJldHVybiBtX3J1bnM7IH0KLQotICAgIHByaXZhdGU6Ci0g
ICAgICAgIFJ1bkxpc3QgbV9ydW5zOwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fbG9naWNh
bFdpZHRoIHsgMCB9OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fY29sbGFwc2libGVMb2dp
Y2FsV2lkdGggeyAwIH07Ci0gICAgfTsKLQotICAgIHN0cnVjdCBMaW5lU3RhdHVzIHsKLSAgICAg
ICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFJpZ2h0IHsgMCB9OwotICAgICAgICBJ
bmxpbmVMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoIHsgMCB9OwotICAgICAgICBJbmxpbmVMYXlv
dXRVbml0IGNvbGxhcHNpYmxlV2lkdGggeyAwIH07Ci0gICAgICAgIE9wdGlvbmFsPElubGluZUxh
eW91dFVuaXQ+IHRyYWlsaW5nU29mdEh5cGhlbldpZHRoOwotICAgICAgICBib29sIGhhc0Z1bGx5
Q29sbGFwc2libGVUcmFpbGluZ1J1biB7IGZhbHNlIH07Ci0gICAgICAgIGJvb2wgaGFzQ29udGVu
dCB7IGZhbHNlIH07Ci0gICAgICAgIGJvb2wgaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bv
c2l0aW9uIHsgZmFsc2UgfTsKLSAgICB9OwotICAgIFJlc3VsdCBwcm9jZXNzSW5saW5lQ29udGVu
dChjb25zdCBDb250aW51b3VzQ29udGVudCYsIGNvbnN0IExpbmVTdGF0dXMmKTsKLSAgICB2b2lk
IHNldEh5cGhlbmF0aW9uRGlzYWJsZWQoKSB7IG5faHlwaGVuYXRpb25Jc0Rpc2FibGVkID0gdHJ1
ZTsgfQotCi0gICAgc3RhdGljIGJvb2wgaXNXcmFwcGluZ0FsbG93ZWQoY29uc3QgSW5saW5lSXRl
bSYpOwotCi1wcml2YXRlOgotICAgIFJlc3VsdCBwcm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50KGNv
bnN0IENvbnRpbnVvdXNDb250ZW50JiwgY29uc3QgTGluZVN0YXR1cyYpIGNvbnN0OwotICAgIE92
ZXJmbG93aW5nVGV4dENvbnRlbnQgcHJvY2Vzc092ZXJmbG93aW5nQ29udGVudFdpdGhUZXh0KGNv
bnN0IENvbnRpbnVvdXNDb250ZW50JiwgY29uc3QgTGluZVN0YXR1cyYpIGNvbnN0OwotICAgIE9w
dGlvbmFsPFBhcnRpYWxSdW4+IHRyeUJyZWFraW5nVGV4dFJ1bihjb25zdCBDb250aW51b3VzQ29u
dGVudDo6UnVuJiBvdmVyZmxvd1J1biwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgT3B0
aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gYXZhaWxhYmxlV2lkdGgsIGJvb2wgaGFzV3JhcE9wcG9y
dHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSBjb25zdDsKLQotICAgIGVudW0gY2xhc3MgV29yZEJy
ZWFrUnVsZSB7Ci0gICAgICAgIEF0QXJiaXRyYXJ5UG9zaXRpb24gICAgICAgID0gMSA8PCAwLAot
ICAgICAgICBBdEh5cGhlbmF0aW9uT3Bwb3J0dW5pdGllcyA9IDEgPDwgMQotICAgIH07Ci0gICAg
T3B0aW9uU2V0PFdvcmRCcmVha1J1bGU+IHdvcmRCcmVha0JlaGF2aW9yKGNvbnN0IFJlbmRlclN0
eWxlJiwgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pIGNvbnN0Owot
ICAgIGJvb2wgc2hvdWxkS2VlcEVuZE9mTGluZVdoaXRlc3BhY2UoY29uc3QgQ29udGludW91c0Nv
bnRlbnQmKSBjb25zdDsKLQotICAgIGJvb2wgbl9oeXBoZW5hdGlvbklzRGlzYWJsZWQgeyBmYWxz
ZSB9OwotfTsKLQotaW5saW5lIElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVu
dDo6UnVuOjpSdW4oY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsV2lkdGgpCi0gICAgOiBpbmxpbmVJdGVtKGlubGluZUl0ZW0pCi0gICAgLCBsb2dp
Y2FsV2lkdGgobG9naWNhbFdpZHRoKQotewotfQotCi1pbmxpbmUgSW5saW5lQ29udGVudEJyZWFr
ZXI6OkNvbnRpbnVvdXNDb250ZW50OjpSdW46OlJ1bihjb25zdCBSdW4mIG90aGVyKQotICAgIDog
aW5saW5lSXRlbShvdGhlci5pbmxpbmVJdGVtKQotICAgICwgbG9naWNhbFdpZHRoKG90aGVyLmxv
Z2ljYWxXaWR0aCkKLXsKLX0KLQotfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5n
Q29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWVhZmZjZGEzZWVj
YzQzZTIxNWQxZDk2NDYxMDZjMGNjNWE5NzIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcv
SW5saW5lRm9ybWF0dGluZ0NvbnRleHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjExICswLDAg
QEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSW5saW5lRm9y
bWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhU
KQotCi0jaW5jbHVkZSAiRmxvYXRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiRm9udENhc2NhZGUu
aCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJJbmxpbmVM
aW5lQm94LmgiCi0jaW5jbHVkZSAiSW5saW5lTGluZVJ1bi5oIgotI2luY2x1ZGUgIklubGluZVRl
eHRJdGVtLmgiCi0jaW5jbHVkZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIKLSNpbmNsdWRlICJMYXlv
dXRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJMYXlv
dXRDb250ZXh0LmgiCi0jaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRhaW5pbmdCbG9jay5oIgot
I2luY2x1ZGUgIkxheW91dElubGluZVRleHRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRMaW5lQnJl
YWtCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRSZXBsYWNlZEJveC5oIgotI2luY2x1ZGUgIkxheW91
dFN0YXRlLmgiCi0jaW5jbHVkZSAiTG9nZ2luZy5oIgotI2luY2x1ZGUgIlJ1bnRpbWVFbmFibGVk
RmVhdHVyZXMuaCIKLSNpbmNsdWRlICJUZXh0VXRpbC5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxs
b2NJbmxpbmVzLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvVGV4dFN0cmVhbS5oPgotCi1uYW1lc3Bh
Y2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRF
RF9JTVBMKElubGluZUZvcm1hdHRpbmdDb250ZXh0KTsKLQotSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQ6OklubGluZUZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGlu
Z0NvbnRleHRSb290LCBJbmxpbmVGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSkKLSAg
ICA6IEZvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgZm9ybWF0dGluZ1N0
YXRlKQotewotfQotCi1zdGF0aWMgaW5saW5lIGNvbnN0IEJveCogbmV4dElubGluZUxldmVsQm94
VG9MYXlvdXQoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnRhaW5lckJveCYgc3RheVdp
dGhpbikKLXsKLSAgICAvLyBBdG9taWMgaW5saW5lLWxldmVsIGJveGVzIGFuZCBmbG9hdHMgYXJl
IG9wYXF1ZSBib3hlcyBtZWFuaW5nIHRoYXQgdGhleSBhcmUKLSAgICAvLyByZXNwb25zaWJsZSBm
b3IgdGhlaXIgb3duIGNvbnRlbnQgKGRvIG5vdCBuZWVkIHRvIGRlc2NlbmQgaW50byB0aGVpciBz
dWJ0cmVlcykuCi0gICAgLy8gT25seSBpbmxpbmUgYm94ZXMgbWF5IGhhdmUgcmVsZXZhbnQgZGVz
Y2VuZGFudCBjb250ZW50LgotICAgIGlmIChsYXlvdXRCb3guaXNJbmxpbmVCb3goKSkgewotICAg
ICAgICBpZiAoaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkgewotICAgICAgICAg
ICAgLy8gQW5vbnltb3VzIGlubGluZSB0ZXh0IGJveGVzL2xpbmUgYnJlYWtzIGNhbid0IGhhdmUg
ZGVzY2VuZGFudCBjb250ZW50IGJ5IGRlZmluaXRpb24uCi0gICAgICAgICAgICBBU1NFUlQoIWxh
eW91dEJveC5pc0lubGluZVRleHRCb3goKSAmJiAhbGF5b3V0Qm94LmlzTGluZUJyZWFrQm94KCkp
OwotICAgICAgICAgICAgcmV0dXJuIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5m
aXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9y
IChhdXRvKiBuZXh0SW5QcmVPcmRlciA9ICZsYXlvdXRCb3g7IG5leHRJblByZU9yZGVyICYmIG5l
eHRJblByZU9yZGVyICE9ICZzdGF5V2l0aGluOyBuZXh0SW5QcmVPcmRlciA9ICZuZXh0SW5QcmVP
cmRlci0+cGFyZW50KCkpIHsKLSAgICAgICAgaWYgKGF1dG8qIG5leHRTaWJsaW5nID0gbmV4dElu
UHJlT3JkZXItPm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpKQotICAgICAgICAgICAgcmV0
dXJuIG5leHRTaWJsaW5nOwotICAgIH0KLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdm9pZCBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0SW5GbG93Q29udGVudChJbnZhbGlkYXRpb25T
dGF0ZSYgaW52YWxpZGF0aW9uU3RhdGUsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVu
dCYgY29uc3RyYWludHMpCi17Ci0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0
TGF5b3V0LCBzdHJlYW0gPDwgIltTdGFydF0gLT4gaW5saW5lIGZvcm1hdHRpbmcgY29udGV4dCAt
PiBmb3JtYXR0aW5nIHJvb3QoIiA8PCAmcm9vdCgpIDw8ICIpIik7Ci0gICAgQVNTRVJUKHJvb3Qo
KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7Ci0KLSAgICBpbnZhbGlkYXRlRm9ybWF0dGlu
Z1N0YXRlKGludmFsaWRhdGlvblN0YXRlKTsKLSAgICBhdXRvKiBsYXlvdXRCb3ggPSByb290KCku
Zmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsKLSAgICAvLyAxLiBWaXNpdCBlYWNoIGlubGlu
ZSBib3ggYW5kIHBhcnRpYWxseSBjb21wdXRlIHRoZWlyIGdlb21ldHJ5IChtYXJnaW5zLCBwYWRk
aW5nIGFuZCBib3JkZXJzKS4KLSAgICAvLyAyLiBDb2xsZWN0IHRoZSBpbmxpbmUgaXRlbXMgKGZs
YXR0ZW4gdGhlIHRoZSBsYXlvdXQgdHJlZSkgYW5kIHBsYWNlIHRoZW0gb24gbGluZXMgaW4gYmlk
aXJlY3Rpb25hbCBvcmRlci4gCi0gICAgd2hpbGUgKGxheW91dEJveCkgewotICAgICAgICBBU1NF
UlQobGF5b3V0Qm94LT5pc0lubGluZUxldmVsQm94KCkgfHwgbGF5b3V0Qm94LT5pc0Zsb2F0aW5n
UG9zaXRpb25lZCgpKTsKLQotICAgICAgICBpZiAobGF5b3V0Qm94LT5pc0F0b21pY0lubGluZUxl
dmVsQm94KCkgfHwgbGF5b3V0Qm94LT5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKSB7Ci0gICAgICAg
ICAgICAvLyBJbmxpbmUtYmxvY2tzLCBpbmxpbmUtdGFibGVzIGFuZCByZXBsYWNlZCBlbGVtZW50
cyAoaW1nLCB2aWRlbykgY2FuIGJlIHNpemVkIGJ1dCBub3QgeWV0IHBvc2l0aW9uZWQuCi0gICAg
ICAgICAgICBpZiAoaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpICYmIGxheW91dEJveC0+ZXN0
YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKGxh
eW91dEJveC0+aXNJbmxpbmVCbG9ja0JveCgpIHx8IGxheW91dEJveC0+aXNJbmxpbmVUYWJsZUJv
eCgpIHx8IGxheW91dEJveC0+aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7Ci0gICAgICAgICAgICAg
ICAgYXV0byYgZm9ybWF0dGluZ1Jvb3QgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KCpsYXlvdXRC
b3gpOwotICAgICAgICAgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKGZvcm1hdHRpbmdS
b290LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICAgICAgICAgICAgICBjb21wdXRlV2lk
dGhBbmRNYXJnaW4oZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwotCi0g
ICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRpbmdSb290Lmhhc0NoaWxkKCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgYXV0byBmb3JtYXR0aW5nQ29udGV4dCA9IExheW91dENvbnRleHQ6OmNyZWF0
ZUZvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdSb290LCBsYXlvdXRTdGF0ZSgpKTsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRpbmdSb290Lmhhc0luRmxvd09yRmxvYXRpbmdDaGls
ZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZ0NvbnRleHQtPmxheW91dElu
Rmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGdlb21ldHJ5KCkuY29uc3RyYWludHNGb3JJ
bkZsb3dDb250ZW50KGZvcm1hdHRpbmdSb290KSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXB1
dGVIZWlnaHRBbmRNYXJnaW4oZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzLmhvcml6b250YWwp
OwotICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nQ29udGV4dC0+bGF5b3V0T3V0T2ZGbG93
Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5jb25zdHJhaW50c0Zvck91dE9m
Rmxvd0NvbnRlbnQoZm9ybWF0dGluZ1Jvb3QpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAg
ICAgICAgICAgICAgICAgICAgY29tcHV0ZUhlaWdodEFuZE1hcmdpbihmb3JtYXR0aW5nUm9vdCwg
Y29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgICAgIC8vIFJlcGxhY2VkIGFuZCBvdGhlciB0eXBlIG9mIGxlYWYgYXRvbWljIGlubGluZSBi
b3hlcy4KLSAgICAgICAgICAgICAgICBjb21wdXRlQm9yZGVyQW5kUGFkZGluZygqbGF5b3V0Qm94
LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICAgICAgICAgICAgICBjb21wdXRlV2lkdGhB
bmRNYXJnaW4oKmxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAg
ICAgICAgY29tcHV0ZUhlaWdodEFuZE1hcmdpbigqbGF5b3V0Qm94LCBjb25zdHJhaW50cy5ob3Jp
em9udGFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRCb3gtPmlz
TGluZUJyZWFrQm94KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0
dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoKmxheW91dEJveCk7Ci0gICAgICAgICAgICBib3hHZW9t
ZXRyeS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgfSk7Ci0gICAgICAgICAgICBib3hHZW9tZXRyeS5z
ZXRCb3JkZXIoeyB9KTsKLSAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldFBhZGRpbmcoeyB9KTsK
LSAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aCh7IH0pOwotICAgICAg
ICAgICAgYm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyB9KTsKLSAgICAgICAgfSBlbHNl
IGlmIChsYXlvdXRCb3gtPmlzSW5saW5lQm94KCkpIHsKLSAgICAgICAgICAgIC8vIFRleHQgd3Jh
cHBlciBib3hlcyAoYW5vbnltb3VzIGlubGluZSBsZXZlbCBib3hlcykgZG9uJ3QgaGF2ZSBib3gg
Z2VvbWV0cmllcyAodGhleSBvbmx5IGdlbmVyYXRlIHJ1bnMpLgotICAgICAgICAgICAgaWYgKCFs
YXlvdXRCb3gtPmlzSW5saW5lVGV4dEJveCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW5saW5l
IGJveGVzICg8c3Bhbj4pIGNhbid0IGdldCBzaXplZC9wb3NpdGlvbmVkIHlldC4gQXQgdGhpcyBw
b2ludCB3ZSBjYW4gb25seSBjb21wdXRlIHRoZWlyIG1hcmdpbnMsIGJvcmRlcnMgYW5kIHBhZGRp
bmcuCi0gICAgICAgICAgICAgICAgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoKmxheW91dEJveCwg
Y29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICAgICAgY29tcHV0ZUhvcml6b250
YWxNYXJnaW4oKmxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAg
ICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoKmxheW91dEJveCkuc2V0VmVydGlj
YWxNYXJnaW4oeyB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLQotICAgICAgICBsYXlvdXRCb3ggPSBuZXh0SW5saW5l
TGV2ZWxCb3hUb0xheW91dCgqbGF5b3V0Qm94LCByb290KCkpOwotICAgIH0KLQotICAgIGNvbGxl
Y3RJbmxpbmVDb250ZW50SWZOZWVkZWQoKTsKLQotICAgIGF1dG8mIGlubGluZUl0ZW1zID0gZm9y
bWF0dGluZ1N0YXRlKCkuaW5saW5lSXRlbXMoKTsKLSAgICBsaW5lTGF5b3V0KGlubGluZUl0ZW1z
LCB7IDAsIGlubGluZUl0ZW1zLnNpemUoKSB9LCBjb25zdHJhaW50cyk7Ci0gICAgTE9HX1dJVEhf
U1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltFbmRdIC0+IGlubGlu
ZSBmb3JtYXR0aW5nIGNvbnRleHQgLT4gZm9ybWF0dGluZyByb290KCIgPDwgJnJvb3QoKSA8PCAi
KSIpOwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpsaW5lTGF5b3V0Rm9ySW50
ZXJncmF0aW9uKEludmFsaWRhdGlvblN0YXRlJiBpbnZhbGlkYXRpb25TdGF0ZSwgY29uc3QgQ29u
c3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBpbnZhbGlkYXRl
Rm9ybWF0dGluZ1N0YXRlKGludmFsaWRhdGlvblN0YXRlKTsKLSAgICBjb2xsZWN0SW5saW5lQ29u
dGVudElmTmVlZGVkKCk7Ci0gICAgYXV0byYgaW5saW5lSXRlbXMgPSBmb3JtYXR0aW5nU3RhdGUo
KS5pbmxpbmVJdGVtcygpOwotICAgIGxpbmVMYXlvdXQoaW5saW5lSXRlbXMsIHsgMCwgaW5saW5l
SXRlbXMuc2l6ZSgpIH0sIGNvbnN0cmFpbnRzKTsKLX0KLQotTGF5b3V0VW5pdCBJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdAotewotICAgIC8vIDEwLjYu
NyAnQXV0bycgaGVpZ2h0cyBmb3IgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHJvb3RzCi0KLSAg
ICAvLyBJZiBpdCBvbmx5IGhhcyBpbmxpbmUtbGV2ZWwgY2hpbGRyZW4sIHRoZSBoZWlnaHQgaXMg
dGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHRvcCBvZiB0aGUgdG9wbW9zdCBsaW5lIGJveCBhbmQg
dGhlIGJvdHRvbSBvZiB0aGUgYm90dG9tbW9zdCBsaW5lIGJveC4KLQotICAgIC8vIEluIGFkZGl0
aW9uLCBpZiB0aGUgZWxlbWVudCBoYXMgYW55IGZsb2F0aW5nIGRlc2NlbmRhbnRzIHdob3NlIGJv
dHRvbSBtYXJnaW4gZWRnZSBpcyBiZWxvdyB0aGUgZWxlbWVudCdzIGJvdHRvbSBjb250ZW50IGVk
Z2UsCi0gICAgLy8gdGhlbiB0aGUgaGVpZ2h0IGlzIGluY3JlYXNlZCB0byBpbmNsdWRlIHRob3Nl
IGVkZ2VzLiBPbmx5IGZsb2F0cyB0aGF0IHBhcnRpY2lwYXRlIGluIHRoaXMgYmxvY2sgZm9ybWF0
dGluZyBjb250ZXh0IGFyZSB0YWtlbgotICAgIC8vIGludG8gYWNjb3VudCwgZS5nLiwgZmxvYXRz
IGluc2lkZSBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgZGVzY2VuZGFudHMgb3Igb3RoZXIgZmxvYXRz
IGFyZSBub3QuCi0gICAgYXV0byYgbGluZXMgPSBmb3JtYXR0aW5nU3RhdGUoKS5saW5lcygpOwot
ICAgIC8vIEV2ZW4gZW1wdHkgY29udGVudCBnZW5lcmF0ZXMgYSBsaW5lLgotICAgIEFTU0VSVCgh
bGluZXMuaXNFbXB0eSgpKTsKLSAgICBhdXRvIHRvcCA9IExheW91dFVuaXQgeyBsaW5lcy5maXJz
dCgpLmxpbmVCb3hMb2dpY2FsUmVjdCgpLnRvcCgpIH07Ci0gICAgYXV0byBib3R0b20gPSBMYXlv
dXRVbml0IHsgbGluZXMubGFzdCgpLmxpbmVCb3hMb2dpY2FsUmVjdCgpLmJvdHRvbSgpICsgZm9y
bWF0dGluZ1N0YXRlKCkuY2xlYXJHYXBBZnRlckxhc3RMaW5lKCkgfTsKLQotICAgIGF1dG8gZmxv
YXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250ZXh0IHsgKnRoaXMsIGZvcm1hdHRpbmdTdGF0ZSgp
LmZsb2F0aW5nU3RhdGUoKSB9OwotICAgIGlmIChhdXRvIGZsb2F0Qm90dG9tID0gZmxvYXRpbmdD
b250ZXh0LmJvdHRvbSgpKSB7Ci0gICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4KCpmbG9hdEJvdHRv
bSwgYm90dG9tKTsKLSAgICAgICAgdG9wID0gc3RkOjptaW4oKmZsb2F0aW5nQ29udGV4dC50b3Ao
KSwgdG9wKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJvdHRvbSAtIHRvcDsKLX0KLQotdm9pZCBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDo6bGluZUxheW91dChJbmxpbmVJdGVtcyYgaW5saW5lSXRlbXMs
IExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UgbmVlZHNMYXlvdXRSYW5nZSwgY29uc3QgQ29u
c3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBhdXRvJiBmb3Jt
YXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5nU3RhdGUoKTsKLSAgICBmb3JtYXR0aW5nU3Rh
dGUubGluZVJ1bnMoKS5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGZvcm1hdHRpbmdTdGF0ZS5pbmxp
bmVJdGVtcygpLnNpemUoKSk7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsaW5lTG9naWNhbFRvcCA9
IGNvbnN0cmFpbnRzLnZlcnRpY2FsLmxvZ2ljYWxUb3A7Ci0gICAgc3RydWN0IFByZXZpb3VzTGlu
ZSB7Ci0gICAgICAgIExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UgcmFuZ2U7Ci0gICAgICAg
IHNpemVfdCBvdmVyZmxvd0NvbnRlbnRMZW5ndGggeyAwIH07Ci0gICAgICAgIE9wdGlvbmFsPElu
bGluZUxheW91dFVuaXQ+IG92ZXJmbG93TG9naWNhbFdpZHRoOwotICAgIH07Ci0gICAgT3B0aW9u
YWw8UHJldmlvdXNMaW5lPiBwcmV2aW91c0xpbmU7Ci0gICAgYXV0byYgZmxvYXRpbmdTdGF0ZSA9
IGZvcm1hdHRpbmdTdGF0ZS5mbG9hdGluZ1N0YXRlKCk7Ci0gICAgYXV0byBmbG9hdGluZ0NvbnRl
eHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhpcywgZmxvYXRpbmdTdGF0ZSB9OwotICAgIGF1dG8g
aXNGaXJzdExpbmUgPSBmb3JtYXR0aW5nU3RhdGUubGluZXMoKS5pc0VtcHR5KCk7Ci0KLSAgICBh
dXRvIGxpbmVCdWlsZGVyID0gTGluZUJ1aWxkZXIgeyAqdGhpcywgZmxvYXRpbmdTdGF0ZSwgY29u
c3RyYWludHMuaG9yaXpvbnRhbCwgaW5saW5lSXRlbXMgfTsKLSAgICB3aGlsZSAoIW5lZWRzTGF5
b3V0UmFuZ2UuaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIFR1cm4gcHJldmlvdXMgbGluZSdzIG92
ZXJmbG93IGNvbnRlbnQgbGVuZ3RoIGludG8gdGhlIG5leHQgbGluZSdzIGxlYWRpbmcgY29udGVu
dCBwYXJ0aWFsIGxlbmd0aC4KLSAgICAgICAgLy8gInNwWzwtbGluZSBicmVhay0+XWxpdF9jb250
ZW50IiAtPiBvdmVyZmxvdyBsZW5ndGg6IDExIC0+IGxlYWRpbmcgcGFydGlhbCBjb250ZW50IGxl
bmd0aDogMTEuCi0gICAgICAgIGF1dG8gcGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoID0gcHJl
dmlvdXNMaW5lID8gcHJldmlvdXNMaW5lLT5vdmVyZmxvd0NvbnRlbnRMZW5ndGggOiAwOwotICAg
ICAgICBhdXRvIGxlYWRpbmdMb2dpY2FsV2lkdGggPSBwcmV2aW91c0xpbmUgPyBwcmV2aW91c0xp
bmUtPm92ZXJmbG93TG9naWNhbFdpZHRoIDogV1RGOjpudWxsb3B0OwotICAgICAgICBhdXRvIGlu
aXRpYWxMaW5lQ29uc3RyYWludHMgPSBJbmxpbmVSZWN0IHsgbGluZUxvZ2ljYWxUb3AsIGNvbnN0
cmFpbnRzLmhvcml6b250YWwubG9naWNhbExlZnQsIGNvbnN0cmFpbnRzLmhvcml6b250YWwubG9n
aWNhbFdpZHRoLCBxdWlya3MoKS5pbml0aWFsTGluZUhlaWdodCgpIH07Ci0gICAgICAgIGF1dG8g
bGluZUNvbnRlbnQgPSBsaW5lQnVpbGRlci5sYXlvdXRJbmxpbmVDb250ZW50KG5lZWRzTGF5b3V0
UmFuZ2UsIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCwgbGVhZGluZ0xvZ2ljYWxXaWR0aCwg
aW5pdGlhbExpbmVDb25zdHJhaW50cywgaXNGaXJzdExpbmUpOwotICAgICAgICBhdXRvIGxpbmVM
b2dpY2FsUmVjdCA9IGNvbXB1dGVHZW9tZXRyeUZvckxpbmVDb250ZW50KGxpbmVDb250ZW50LCBj
b25zdHJhaW50cy5ob3Jpem9udGFsKTsKLQotICAgICAgICBhdXRvIGxpbmVDb250ZW50UmFuZ2Ug
PSBsaW5lQ29udGVudC5pbmxpbmVJdGVtUmFuZ2U7Ci0gICAgICAgIGlmICghbGluZUNvbnRlbnRS
YW5nZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFTU0VSVChuZWVkc0xheW91dFJhbmdlLnN0
YXJ0IDwgbGluZUNvbnRlbnRSYW5nZS5lbmQpOwotICAgICAgICAgICAgaXNGaXJzdExpbmUgPSBm
YWxzZTsKLSAgICAgICAgICAgIGxpbmVMb2dpY2FsVG9wID0gZ2VvbWV0cnkoKS5sb2dpY2FsVG9w
Rm9yTmV4dExpbmUobGluZUNvbnRlbnQsIGxpbmVMb2dpY2FsUmVjdC5ib3R0b20oKSwgZmxvYXRp
bmdDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChsaW5lQ29udGVudC5pc0xhc3RMaW5lV2l0aElu
bGluZUNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZmluYWwgY29udGVudCBoZWln
aHQgb2YgdGhpcyBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0IHNob3VsZCBpbmNsdWRlIHRoZSBj
bGVhcmVkIGZsb2F0cyBhcyB3ZWxsLgotICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5z
ZXRDbGVhckdhcEFmdGVyTGFzdExpbmUobGluZUxvZ2ljYWxUb3AgLSBsaW5lTG9naWNhbFJlY3Qu
Ym90dG9tKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gV2hlbiB0aGUgdHJhaWxp
bmcgY29udGVudCBpcyBwYXJ0aWFsLCB3ZSBuZWVkIHRvIHJldXNlIHRoZSBsYXN0IElubGluZVRl
eHRJdGVtLgotICAgICAgICAgICAgYXV0byBsYXN0SW5saW5lSXRlbU5lZWRzUGFydGlhbExheW91
dCA9IGxpbmVDb250ZW50LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGg7Ci0gICAgICAgICAg
ICBpZiAobGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQpIHsKLSAgICAgICAgICAgICAg
ICBhdXRvIGxpbmVMYXlvdXRIYXNBZHZhbmNlZCA9ICFwcmV2aW91c0xpbmUKLSAgICAgICAgICAg
ICAgICAgICAgfHwgbGluZUNvbnRlbnRSYW5nZS5lbmQgPiBwcmV2aW91c0xpbmUtPnJhbmdlLmVu
ZAotICAgICAgICAgICAgICAgICAgICB8fCAocHJldmlvdXNMaW5lLT5vdmVyZmxvd0NvbnRlbnRM
ZW5ndGggJiYgcHJldmlvdXNMaW5lLT5vdmVyZmxvd0NvbnRlbnRMZW5ndGggPiBsaW5lQ29udGVu
dC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWxp
bmVMYXlvdXRIYXNBZHZhbmNlZCkgewotICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvdmVyIHRvIHRoZSBuZXh0IHJ1
biBpZiB3ZSBhcmUgc3R1Y2sgb24gdGhpcyBwYXJ0aWFsIGNvbnRlbnQgKHdoZW4gdGhlIG92ZXJm
bG93IGNvbnRlbnQgbGVuZ3RoIHJlbWFpbnMgdGhlIHNhbWUpLgotICAgICAgICAgICAgICAgICAg
ICAvLyBXZSBjZXJ0YWlubHkgbG9zZSBzb21lIGNvbnRlbnQsIGJ1dCB3ZSB3b3VsZCBiZSBidXN5
IGxvb3Bpbmcgb3RoZXJ3aXNlLgotICAgICAgICAgICAgICAgICAgICBsYXN0SW5saW5lSXRlbU5l
ZWRzUGFydGlhbExheW91dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQgPSBsYXN0SW5saW5lSXRlbU5l
ZWRzUGFydGlhbExheW91dCA/IGxpbmVDb250ZW50UmFuZ2UuZW5kIC0gMSA6IGxpbmVDb250ZW50
UmFuZ2UuZW5kOwotICAgICAgICAgICAgcHJldmlvdXNMaW5lID0gUHJldmlvdXNMaW5lIHsgbGlu
ZUNvbnRlbnRSYW5nZSwgbGluZUNvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCwg
bGluZUNvbnRlbnQub3ZlcmZsb3dMb2dpY2FsV2lkdGggfTsKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICB9Ci0gICAgICAgIC8vIEZsb2F0cyBwcmV2ZW50ZWQgdXMgcGxhY2luZyBhbnkg
Y29udGVudCBvbiB0aGUgbGluZS4KLSAgICAgICAgQVNTRVJUKGxpbmVDb250ZW50LnJ1bnMuaXNF
bXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKGxpbmVDb250ZW50Lmhhc0ludHJ1c2l2ZUZsb2F0KTsK
LSAgICAgICAgLy8gTW92ZSB0aGUgbmV4dCBsaW5lIGJlbG93IHRoZSBpbnRydXNpdmUgZmxvYXQu
Ci0gICAgICAgIGF1dG8gZmxvYXRDb25zdHJhaW50cyA9IGZsb2F0aW5nQ29udGV4dC5jb25zdHJh
aW50cyh0b0xheW91dFVuaXQobGluZUxvZ2ljYWxUb3ApLCB0b0xheW91dFVuaXQobGluZUxvZ2lj
YWxSZWN0LmJvdHRvbSgpKSk7Ci0gICAgICAgIEFTU0VSVChmbG9hdENvbnN0cmFpbnRzLmxlZnQg
fHwgZmxvYXRDb25zdHJhaW50cy5yaWdodCk7Ci0gICAgICAgIHN0YXRpYyBhdXRvIGluaWZpdGVQ
b2ludCA9IFBvaW50SW5Db250ZXh0Um9vdDo6bWF4KCk7Ci0gICAgICAgIC8vIEluIGNhc2Ugb2Yg
bGVmdCBhbmQgcmlnaHQgY29uc3RyYWludHMsIHdlIG5lZWQgdG8gcGljayB0aGUgb25lIHRoYXQn
cyBjbG9zZXIgdG8gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAgbGluZUxvZ2ljYWxUb3AgPSBz
dGQ6Om1pbihmbG9hdENvbnN0cmFpbnRzLmxlZnQudmFsdWVPcihpbmlmaXRlUG9pbnQpLnksIGZs
b2F0Q29uc3RyYWludHMucmlnaHQudmFsdWVPcihpbmlmaXRlUG9pbnQpLnkpOwotICAgICAgICBB
U1NFUlQobGluZUxvZ2ljYWxUb3AgPCBpbmlmaXRlUG9pbnQueSk7Ci0gICAgfQotfQotCi1Gb3Jt
YXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkKLXsKLSAgICBhdXRv
JiBsYXlvdXRTdGF0ZSA9IHRoaXMtPmxheW91dFN0YXRlKCk7Ci0gICAgQVNTRVJUKCFmb3JtYXR0
aW5nU3RhdGUoKS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkpOwotCi0gICAgaWYgKCFyb290
KCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpIHsKLSAgICAgICAgYXV0byBjb25zdHJhaW50
cyA9IGdlb21ldHJ5KCkuY29uc3RyYWluQnlNaW5NYXhXaWR0aChyb290KCksIHsgfSk7Ci0gICAg
ICAgIGZvcm1hdHRpbmdTdGF0ZSgpLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3Ry
YWludHMpOwotICAgICAgICByZXR1cm4gY29uc3RyYWludHM7Ci0gICAgfQotCi0gICAgVmVjdG9y
PGNvbnN0IEJveCo+IGZvcm1hdHRpbmdDb250ZXh0Um9vdExpc3Q7Ci0gICAgYXV0byBob3Jpem9u
dGFsQ29uc3RyYWludHMgPSBIb3Jpem9udGFsQ29uc3RyYWludHMgeyAwX2x1LCAwX2x1IH07Ci0g
ICAgYXV0byogbGF5b3V0Qm94ID0gcm9vdCgpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7
Ci0gICAgLy8gSW4gb3JkZXIgdG8gY29tcHV0ZSB0aGUgbWF4L21pbiB3aWR0aHMsIHdlIG5lZWQg
dG8gY29tcHV0ZSBtYXJnaW5zLCBib3JkZXJzIGFuZCBwYWRkaW5nIGZvciBjZXJ0YWluIGlubGlu
ZSBib3hlcyBmaXJzdC4KLSAgICB3aGlsZSAobGF5b3V0Qm94KSB7Ci0gICAgICAgIGlmIChsYXlv
dXRCb3gtPmlzSW5saW5lVGV4dEJveCgpKSB7Ci0gICAgICAgICAgICBsYXlvdXRCb3ggPSBuZXh0
SW5saW5lTGV2ZWxCb3hUb0xheW91dCgqbGF5b3V0Qm94LCByb290KCkpOwotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxheW91dEJveC0+aXNSZXBsYWNlZEJv
eCgpKSB7Ci0gICAgICAgICAgICBjb21wdXRlQm9yZGVyQW5kUGFkZGluZygqbGF5b3V0Qm94LCBo
b3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgICAgICAgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2lu
KCpsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgICAgIH0gZWxzZSBpZiAo
bGF5b3V0Qm94LT5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpIHx8IGxheW91dEJveC0+aXNBdG9taWNJ
bmxpbmVMZXZlbEJveCgpKSB7Ci0gICAgICAgICAgICBBU1NFUlQobGF5b3V0Qm94LT5lc3RhYmxp
c2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOwotICAgICAgICAgICAgZm9ybWF0dGluZ0NvbnRleHRS
b290TGlzdC5hcHBlbmQobGF5b3V0Qm94KTsKLQotICAgICAgICAgICAgY29tcHV0ZUJvcmRlckFu
ZFBhZGRpbmcoKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgICAg
IGNvbXB1dGVIb3Jpem9udGFsTWFyZ2luKCpsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50
cyk7Ci0gICAgICAgICAgICBjb21wdXRlSW50cmluc2ljV2lkdGhGb3JGb3JtYXR0aW5nUm9vdCgq
bGF5b3V0Qm94KTsKLSAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRCb3gtPmlzSW5saW5lQm94KCkp
IHsKLSAgICAgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGhvcml6
b250YWxDb25zdHJhaW50cyk7Ci0gICAgICAgICAgICBjb21wdXRlSG9yaXpvbnRhbE1hcmdpbigq
bGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgICAgICB9IGVsc2UKLSAgICAg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBsYXlvdXRCb3ggPSBuZXh0SW5s
aW5lTGV2ZWxCb3hUb0xheW91dCgqbGF5b3V0Qm94LCByb290KCkpOwotICAgIH0KLQotICAgIGNv
bGxlY3RJbmxpbmVDb250ZW50SWZOZWVkZWQoKTsKLQotICAgIGF1dG8gbWF4aW11bUxpbmVXaWR0
aCA9IFsmXShhdXRvIGF2YWlsYWJsZVdpZHRoKSB7Ci0gICAgICAgIC8vIFN3aXRjaCB0byB0aGUg
bWluL21heCBmb3JtYXR0aW5nIHJvb3Qgd2lkdGggdmFsdWVzIGJlZm9yZSBmb3JtYXR0aW5nIHRo
ZSBsaW5lcy4KLSAgICAgICAgZm9yIChhdXRvKiBmb3JtYXR0aW5nUm9vdCA6IGZvcm1hdHRpbmdD
b250ZXh0Um9vdExpc3QpIHsKLSAgICAgICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhzID0gbGF5
b3V0U3RhdGUuZm9ybWF0dGluZ1N0YXRlRm9yQm94KCpmb3JtYXR0aW5nUm9vdCkuaW50cmluc2lj
V2lkdGhDb25zdHJhaW50c0ZvckJveCgqZm9ybWF0dGluZ1Jvb3QpOwotICAgICAgICAgICAgYXV0
byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSgqZm9ybWF0dGlu
Z1Jvb3QpOwotICAgICAgICAgICAgYXV0byBjb250ZW50V2lkdGggPSAoYXZhaWxhYmxlV2lkdGgg
PyBpbnRyaW5zaWNXaWR0aHMtPm1heGltdW0gOiBpbnRyaW5zaWNXaWR0aHMtPm1pbmltdW0pIC0g
Ym94R2VvbWV0cnkuaG9yaXpvbnRhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKTsKLSAgICAgICAg
ICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChjb250ZW50V2lkdGgpOwotICAgICAg
ICB9Ci0gICAgICAgIHJldHVybiBjb21wdXRlZEludHJpbnNpY1dpZHRoRm9yQ29uc3RyYWludChh
dmFpbGFibGVXaWR0aCk7Ci0gICAgfTsKLQotICAgIGF1dG8gbWluaW11bUNvbnRlbnRXaWR0aCA9
IGNlaWxlZExheW91dFVuaXQobWF4aW11bUxpbmVXaWR0aCgwKSk7Ci0gICAgYXV0byBtYXhpbXVt
Q29udGVudFdpZHRoID0gY2VpbGVkTGF5b3V0VW5pdChtYXhpbXVtTGluZVdpZHRoKG1heElubGlu
ZUxheW91dFVuaXQoKSkpOwotICAgIGF1dG8gY29uc3RyYWludHMgPSBnZW9tZXRyeSgpLmNvbnN0
cmFpbkJ5TWluTWF4V2lkdGgocm9vdCgpLCB7IG1pbmltdW1Db250ZW50V2lkdGgsIG1heGltdW1D
b250ZW50V2lkdGggfSk7Ci0gICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0SW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyhjb25zdHJhaW50cyk7Ci0gICAgcmV0dXJuIGNvbnN0cmFpbnRzOwotfQotCi1J
bmxpbmVMYXlvdXRVbml0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlZEludHJpbnNp
Y1dpZHRoRm9yQ29uc3RyYWludChJbmxpbmVMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKSBjb25z
dAotewotICAgIGF1dG8mIGlubGluZUl0ZW1zID0gZm9ybWF0dGluZ1N0YXRlKCkuaW5saW5lSXRl
bXMoKTsKLSAgICBhdXRvIGxpbmVCdWlsZGVyID0gTGluZUJ1aWxkZXIgeyAqdGhpcywgaW5saW5l
SXRlbXMgfTsKLSAgICBhdXRvIGxheW91dFJhbmdlID0gTGluZUJ1aWxkZXI6OklubGluZUl0ZW1S
YW5nZSB7IDAgLCBpbmxpbmVJdGVtcy5zaXplKCkgfTsKLSAgICBhdXRvIG1heGltdW1MaW5lV2lk
dGggPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAgICBhdXRvIG1heGltdW1GbG9hdFdpZHRoID0g
TGF5b3V0VW5pdCB7IH07Ci0gICAgd2hpbGUgKCFsYXlvdXRSYW5nZS5pc0VtcHR5KCkpIHsKLSAg
ICAgICAgYXV0byBpbnRyaW5zaWNDb250ZW50ID0gbGluZUJ1aWxkZXIuY29tcHV0ZWRJbnRyaW5z
aWNXaWR0aChsYXlvdXRSYW5nZSwgYXZhaWxhYmxlV2lkdGgpOwotICAgICAgICBsYXlvdXRSYW5n
ZS5zdGFydCA9IGludHJpbnNpY0NvbnRlbnQuaW5saW5lSXRlbVJhbmdlLmVuZDsKLSAgICAgICAg
bWF4aW11bUxpbmVXaWR0aCA9IHN0ZDo6bWF4KG1heGltdW1MaW5lV2lkdGgsIGludHJpbnNpY0Nv
bnRlbnQubG9naWNhbFdpZHRoKTsKLSAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBj
bGVhci4KLSAgICAgICAgZm9yIChhdXRvKiBmbG9hdEJveCA6IGludHJpbnNpY0NvbnRlbnQuZmxv
YXRzKQotICAgICAgICAgICAgbWF4aW11bUZsb2F0V2lkdGggKz0gZ2VvbWV0cnlGb3JCb3goKmZs
b2F0Qm94KS5tYXJnaW5Cb3hXaWR0aCgpOwotICAgIH0KLSAgICByZXR1cm4gbWF4aW11bUxpbmVX
aWR0aCArIG1heGltdW1GbG9hdFdpZHRoOwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250
ZXh0Ojpjb21wdXRlSW50cmluc2ljV2lkdGhGb3JGb3JtYXR0aW5nUm9vdChjb25zdCBCb3gmIGZv
cm1hdHRpbmdSb290KQotewotICAgIEFTU0VSVChmb3JtYXR0aW5nUm9vdC5lc3RhYmxpc2hlc0Zv
cm1hdHRpbmdDb250ZXh0KCkpOwotICAgIGF1dG8gY29uc3RyYWludHMgPSBJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzIHsgfTsKLSAgICBpZiAoYXV0byBmaXhlZFdpZHRoID0gZ2VvbWV0cnkoKS5m
aXhlZFZhbHVlKGZvcm1hdHRpbmdSb290LnN0eWxlKCkubG9naWNhbFdpZHRoKCkpKQotICAgICAg
ICBjb25zdHJhaW50cyA9IHsgKmZpeGVkV2lkdGgsICpmaXhlZFdpZHRoIH07Ci0gICAgZWxzZSB7
Ci0gICAgICAgIGF1dG8gaGFzSW5mbG93T3JGbG9hdGluZ0NvbnRlbnQgPSBpczxDb250YWluZXJC
b3g+KGZvcm1hdHRpbmdSb290KSAmJiBkb3duY2FzdDxDb250YWluZXJCb3g+KGZvcm1hdHRpbmdS
b290KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsKLSAgICAgICAgLy8gVGhlIGludHJpbnNp
YyBzaXplcyBvZiB0aGUgc2l6ZSBjb250YWlubWVudCBib3ggYXJlIGRldGVybWluZWQgYXMgaWYg
dGhlIGVsZW1lbnQgaGFkIG5vIGNvbnRlbnQuCi0gICAgICAgIGF1dG8gc2hvdWxkSWdub3JlQ2hp
bGRDb250ZW50ID0gZm9ybWF0dGluZ1Jvb3QuaXNTaXplQ29udGFpbm1lbnRCb3goKTsKLSAgICAg
ICAgaWYgKGhhc0luZmxvd09yRmxvYXRpbmdDb250ZW50ICYmICFzaG91bGRJZ25vcmVDaGlsZENv
bnRlbnQpCi0gICAgICAgICAgICBjb25zdHJhaW50cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZv
cm1hdHRpbmdDb250ZXh0KGRvd25jYXN0PENvbnRhaW5lckJveD4oZm9ybWF0dGluZ1Jvb3QpLCBs
YXlvdXRTdGF0ZSgpKS0+Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAg
fQotICAgIGNvbnN0cmFpbnRzID0gZ2VvbWV0cnkoKS5jb25zdHJhaW5CeU1pbk1heFdpZHRoKGZv
cm1hdHRpbmdSb290LCBjb25zdHJhaW50cyk7Ci0gICAgY29uc3RyYWludHMuZXhwYW5kKGdlb21l
dHJ5Rm9yQm94KGZvcm1hdHRpbmdSb290KS5ob3Jpem9udGFsTWFyZ2luQm9yZGVyQW5kUGFkZGlu
ZygpKTsKLSAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
Rm9yQm94KGZvcm1hdHRpbmdSb290LCBjb25zdHJhaW50cyk7Ci19Ci0KLXZvaWQgSW5saW5lRm9y
bWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVIb3Jpem9udGFsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0
Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykK
LXsKLSAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IGdlb21ldHJ5KCkuY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAg
ICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpLnNldEhvcml6b250YWxN
YXJnaW4oeyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH0pOwotfQotCi12b2lkIElubGluZUZv
cm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRC
b3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQot
ewotICAgIGF1dG8gY29tcHV0ZSA9IFsmXShPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkV2lkdGgp
IHsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKQotICAgICAg
ICAgICAgcmV0dXJuIGdlb21ldHJ5KCkuZmxvYXRpbmdDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5
b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0gICAg
ICAgIGlmIChsYXlvdXRCb3guaXNJbmxpbmVCbG9ja0JveCgpKQotICAgICAgICAgICAgcmV0dXJu
IGdlb21ldHJ5KCkuaW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBo
b3Jpem9udGFsQ29uc3RyYWludHMsIHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0gICAgICAgIGlmIChs
YXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQotICAgICAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCku
aW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+
KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCB7IHVzZWRXaWR0aCwgeyB9
IH0pOwotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIENvbnRl
bnRXaWR0aEFuZE1hcmdpbiB7IH07Ci0gICAgfTsKLQotICAgIGF1dG8gY29udGVudFdpZHRoQW5k
TWFyZ2luID0gY29tcHV0ZSh7IH0pOwotCi0gICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGhvcml6
b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7Ci0gICAgaWYgKGF1dG8gbWF4V2lkdGggPSBn
ZW9tZXRyeSgpLmNvbXB1dGVkTWF4V2lkdGgobGF5b3V0Qm94LCBhdmFpbGFibGVXaWR0aCkpIHsK
LSAgICAgICAgYXV0byBtYXhXaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUobWF4V2lkdGgpOwotICAg
ICAgICBpZiAoY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA+IG1heFdpZHRoQW5k
TWFyZ2luLmNvbnRlbnRXaWR0aCkKLSAgICAgICAgICAgIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9
IG1heFdpZHRoQW5kTWFyZ2luOwotICAgIH0KLQotICAgIGF1dG8gbWluV2lkdGggPSBnZW9tZXRy
eSgpLmNvbXB1dGVkTWluV2lkdGgobGF5b3V0Qm94LCBhdmFpbGFibGVXaWR0aCkudmFsdWVPcigw
KTsKLSAgICBhdXRvIG1pbldpZHRoQW5kTWFyZ2luID0gY29tcHV0ZShtaW5XaWR0aCk7Ci0gICAg
aWYgKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGggPCBtaW5XaWR0aEFuZE1hcmdp
bi5jb250ZW50V2lkdGgpCi0gICAgICAgIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IG1pbldpZHRo
QW5kTWFyZ2luOwotCi0gICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5i
b3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0
aChjb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKTsKLSAgICBib3hHZW9tZXRyeS5z
ZXRIb3Jpem9udGFsTWFyZ2luKHsgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uc3Rh
cnQsIGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLmVuZCB9KTsKLX0KLQotdm9pZCBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gm
IGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3Ry
YWludHMpCi17Ci0gICAgYXV0byBjb21wdXRlID0gWyZdKE9wdGlvbmFsPExheW91dFVuaXQ+IHVz
ZWRIZWlnaHQpIHsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgp
KQotICAgICAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCkuZmxvYXRpbmdDb250ZW50SGVpZ2h0QW5k
TWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IHVzZWRIZWlnaHQgfSk7
Ci0gICAgICAgIGlmIChsYXlvdXRCb3guaXNJbmxpbmVCbG9ja0JveCgpKQotICAgICAgICAgICAg
cmV0dXJuIGdlb21ldHJ5KCkuaW5saW5lQmxvY2tDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGxheW91
dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IHVzZWRIZWlnaHQgfSk7Ci0gICAgICAgIGlm
IChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQotICAgICAgICAgICAgcmV0dXJuIGdlb21ldHJ5
KCkuaW5saW5lUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2Vk
Qm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgfSwgeyB1c2VkSGVpZ2h0
IH0pOwotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIENvbnRl
bnRIZWlnaHRBbmRNYXJnaW4geyB9OwotICAgIH07Ci0KLSAgICBhdXRvIGNvbnRlbnRIZWlnaHRB
bmRNYXJnaW4gPSBjb21wdXRlKHsgfSk7Ci0gICAgaWYgKGF1dG8gbWF4SGVpZ2h0ID0gZ2VvbWV0
cnkoKS5jb21wdXRlZE1heEhlaWdodChsYXlvdXRCb3gpKSB7Ci0gICAgICAgIGF1dG8gbWF4SGVp
Z2h0QW5kTWFyZ2luID0gY29tcHV0ZShtYXhIZWlnaHQpOwotICAgICAgICBpZiAoY29udGVudEhl
aWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID4gbWF4SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRI
ZWlnaHQpCi0gICAgICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gbWF4SGVpZ2h0QW5k
TWFyZ2luOwotICAgIH0KLQotICAgIGlmIChhdXRvIG1pbkhlaWdodCA9IGdlb21ldHJ5KCkuY29t
cHV0ZWRNaW5IZWlnaHQobGF5b3V0Qm94KSkgewotICAgICAgICBhdXRvIG1pbkhlaWdodEFuZE1h
cmdpbiA9IGNvbXB1dGUobWluSGVpZ2h0KTsKLSAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHRBbmRN
YXJnaW4uY29udGVudEhlaWdodCA8IG1pbkhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KQot
ICAgICAgICAgICAgY29udGVudEhlaWdodEFuZE1hcmdpbiA9IG1pbkhlaWdodEFuZE1hcmdpbjsK
LSAgICB9Ci0gICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9t
ZXRyeShsYXlvdXRCb3gpOwotICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoY29u
dGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KTsKLSAgICBib3hHZW9tZXRyeS5zZXRW
ZXJ0aWNhbE1hcmdpbih7IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2lu
LmJlZm9yZSwgY29udGVudEhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIg
fSk7Ci19Ci0KLXZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbGxlY3RJbmxpbmVDb250
ZW50SWZOZWVkZWQoKQotewotICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1h
dHRpbmdTdGF0ZSgpOwotICAgIGlmICghZm9ybWF0dGluZ1N0YXRlLmlubGluZUl0ZW1zKCkuaXNF
bXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgLy8gVHJhdmVyc2UgdGhlIHRyZWUgYW5kIGNy
ZWF0ZSBpbmxpbmUgaXRlbXMgb3V0IG9mIGlubGluZSBib3hlcyBhbmQgbGVhZiBub2Rlcy4gVGhp
cyBlc3NlbnRpYWxseSB0dXJucyB0aGUgdHJlZSBpbmxpbmUgc3RydWN0dXJlIGludG8gYSBmbGF0
IG9uZS4KLSAgICAvLyA8c3Bhbj50ZXh0PHNwYW4+PC9zcGFuPjxpbWc+PC9zcGFuPiAtPiBbSW5s
aW5lQm94U3RhcnRdW0lubGluZUxldmVsQm94XVtJbmxpbmVCb3hTdGFydF1bSW5saW5lQm94RW5k
XVtJbmxpbmVMZXZlbEJveF1bSW5saW5lQm94RW5kXQotICAgIEFTU0VSVChyb290KCkuaGFzSW5G
bG93T3JGbG9hdGluZ0NoaWxkKCkpOwotICAgIExheW91dFF1ZXVlIGxheW91dFF1ZXVlOwotICAg
IGxheW91dFF1ZXVlLmFwcGVuZChyb290KCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7
Ci0gICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgd2hpbGUgKHRy
dWUpIHsKLSAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9ICpsYXlvdXRRdWV1ZS5sYXN0KCk7
Ci0gICAgICAgICAgICBhdXRvIGlzQm94V2l0aElubGluZUNvbnRlbnQgPSBsYXlvdXRCb3guaXNJ
bmxpbmVCb3goKSAmJiAhbGF5b3V0Qm94LmlzSW5saW5lVGV4dEJveCgpICYmICFsYXlvdXRCb3gu
aXNMaW5lQnJlYWtCb3goKTsKLSAgICAgICAgICAgIGlmICghaXNCb3hXaXRoSW5saW5lQ29udGVu
dCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHN0
YXJ0IG9mIGFuIGlubGluZSBib3ggKGUuZy4gPHNwYW4+KS4KLSAgICAgICAgICAgIGZvcm1hdHRp
bmdTdGF0ZS5hZGRJbmxpbmVJdGVtKHsgbGF5b3V0Qm94LCBJbmxpbmVJdGVtOjpUeXBlOjpJbmxp
bmVCb3hTdGFydCB9KTsKLSAgICAgICAgICAgIGF1dG8mIGlubGluZUJveFdpdGhJbmxpbmVDb250
ZW50ID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpOwotICAgICAgICAgICAgaWYg
KCFpbmxpbmVCb3hXaXRoSW5saW5lQ29udGVudC5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkK
LSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGxheW91dFF1ZXVlLmFwcGVuZChp
bmxpbmVCb3hXaXRoSW5saW5lQ29udGVudC5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpKTsK
LSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghbGF5b3V0UXVldWUuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSAqbGF5b3V0UXVldWUudGFrZUxhc3QoKTsKLSAg
ICAgICAgICAgIGlmIChpczxMaW5lQnJlYWtCb3g+KGxheW91dEJveCkpIHsKLSAgICAgICAgICAg
ICAgICBhdXRvJiBsaW5lQnJlYWtCb3ggPSBkb3duY2FzdDxMaW5lQnJlYWtCb3g+KGxheW91dEJv
eCk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZElubGluZUl0ZW0oeyBsYXlv
dXRCb3gsIGxpbmVCcmVha0JveC5pc09wdGlvbmFsKCkgPyBJbmxpbmVJdGVtOjpUeXBlOjpXb3Jk
QnJlYWtPcHBvcnR1bml0eSA6IElubGluZUl0ZW06OlR5cGU6OkhhcmRMaW5lQnJlYWsgfSk7Ci0g
ICAgICAgICAgICB9IGVsc2UgaWYgKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKQot
ICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRJbmxpbmVJdGVtKHsgbGF5b3V0Qm94
LCBJbmxpbmVJdGVtOjpUeXBlOjpGbG9hdCB9KTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGxheW91
dEJveC5pc0F0b21pY0lubGluZUxldmVsQm94KCkpCi0gICAgICAgICAgICAgICAgZm9ybWF0dGlu
Z1N0YXRlLmFkZElubGluZUl0ZW0oeyBsYXlvdXRCb3gsIElubGluZUl0ZW06OlR5cGU6OkJveCB9
KTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGxheW91dEJveC5pc0lubGluZVRleHRCb3goKSkgewot
ICAgICAgICAgICAgICAgIElubGluZVRleHRJdGVtOjpjcmVhdGVBbmRBcHBlbmRUZXh0SXRlbXMo
Zm9ybWF0dGluZ1N0YXRlLmlubGluZUl0ZW1zKCksIGRvd25jYXN0PElubGluZVRleHRCb3g+KGxh
eW91dEJveCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRCb3guaXNJbmxpbmVCb3go
KSkKLSAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkSW5saW5lSXRlbSh7IGxheW91
dEJveCwgSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94RW5kIH0pOwotICAgICAgICAgICAgZWxz
ZQotICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotCi0gICAgICAgICAgICBp
ZiAoYXV0byogbmV4dFNpYmxpbmcgPSBsYXlvdXRCb3gubmV4dEluRmxvd09yRmxvYXRpbmdTaWJs
aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBsYXlvdXRRdWV1ZS5hcHBlbmQobmV4dFNpYmxpbmcp
OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotfQotCi1JbmxpbmVSZWN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlR2VvbWV0
cnlGb3JMaW5lQ29udGVudChjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250
ZW50LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykK
LXsKLSAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5nU3RhdGUoKTsK
LSAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2VvbWV0cnkoKTsKLQotICAgIGZvcm1hdHRpbmdT
dGF0ZS5hZGRMaW5lQm94KGdlb21ldHJ5LmxpbmVCb3hGb3JMaW5lQ29udGVudChsaW5lQ29udGVu
dCkpOwotICAgIGNvbnN0IGF1dG8mIGxpbmVCb3ggPSBmb3JtYXR0aW5nU3RhdGUubGluZUJveGVz
KCkubGFzdCgpOwotICAgIGF1dG8gbGluZUluZGV4ID0gZm9ybWF0dGluZ1N0YXRlLmxpbmVzKCku
c2l6ZSgpOwotICAgIGF1dG8mIGxpbmVCb3hMb2dpY2FsUmVjdCA9IGxpbmVCb3gubG9naWNhbFJl
Y3QoKTsKLSAgICBpZiAoIWxpbmVCb3guaGFzQ29udGVudCgpKSB7Ci0gICAgICAgIC8vIEZhc3Qg
cGF0aCBmb3IgbGluZXMgd2l0aCBubyBjb250ZW50IGUuZy4gPGRpdj48c3Bhbj48L3NwYW4+PHNw
YW4+PC9zcGFuPjwvZGl2PiBvciA8c3Bhbj48ZGl2PjwvZGl2Pjwvc3Bhbj4gd2hlcmUgd2UgY29u
c3RydWN0IGVtcHR5IHByZSBhbmQgcG9zdCBibG9ja3MuCi0gICAgICAgIEFTU0VSVCghbGluZUJv
eC5jb250ZW50TG9naWNhbFdpZHRoKCkgJiYgIWxpbmVCb3hMb2dpY2FsUmVjdC5oZWlnaHQoKSk7
Ci0gICAgICAgIGF1dG8gdXBkYXRlSW5saW5lQm94ZXNHZW9tZXRyeUlmQXBwbGljYWJsZSA9IFsm
XSB7Ci0gICAgICAgICAgICBpZiAoIWxpbmVCb3guaGFzSW5saW5lQm94KCkpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICAgICAgVmVjdG9yPGNvbnN0IEJveCo+IGxheW91dEJveExp
c3Q7Ci0gICAgICAgICAgICAvLyBDb2xsZWN0IHRoZSBlbXB0eSBpbmxpbmUgYm94ZXMgdGhhdCBz
aG93ZWQgdXAgZmlyc3Qgb24gdGhpcyBsaW5lLgotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGFu
IGlubGluZSBib3ggZW5kIG9uIGFuIGVtcHR5IGxpbmUgZG9lcyBub3QgbWFrZSB0aGUgaW5saW5l
IGJveCB0YWxsZXIuCi0gICAgICAgICAgICAvLyAoZS5nLiA8ZGl2PnRleHQ8c3Bhbj48YnI+PC9z
cGFuPjwvZGl2PikgPC0gdGhlIDxzcGFuPiBpbmxpbmUgYm94IGlzIGFzIHRhbGwgYXMgdGhlIGxp
bmUgZXZlbiB0aG91Z2ggdGhlIDwvc3Bhbj4gaXMgYWZ0ZXIgYSA8YnI+IHNvIHRlY2huaWNhbGx5
IGlzIG9uIHRoZSBmb2xsb3dpbmcgKGVtcHR5KWxpbmUuCi0gICAgICAgICAgICBmb3IgKGF1dG8m
IGxpbmVSdW4gOiBsaW5lQ29udGVudC5ydW5zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmVS
dW4uaXNJbmxpbmVCb3hTdGFydCgpKQotICAgICAgICAgICAgICAgICAgICBsYXlvdXRCb3hMaXN0
LmFwcGVuZCgmbGluZVJ1bi5sYXlvdXRCb3goKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBmb3IgKGF1dG8qIGxheW91dEJveCA6IGxheW91dEJveExpc3QpIHsKLSAgICAgICAgICAgICAg
ICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeSgqbGF5b3V0
Qm94KTsKLSAgICAgICAgICAgICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxIZWlnaHQgPSBMYXlv
dXRVbml0Ojpmcm9tRmxvYXRDZWlsKGxpbmVCb3gubG9naWNhbEJvcmRlckJveEZvcklubGluZUJv
eCgqbGF5b3V0Qm94LCBib3hHZW9tZXRyeSkuaGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIGJv
eEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoaW5saW5lQm94TG9naWNhbEhlaWdodCk7Ci0g
ICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKHsgfSk7Ci0gICAg
ICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQodG9MYXlvdXRQb2ludChs
aW5lQm94TG9naWNhbFJlY3QudG9wTGVmdCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07
Ci0gICAgICAgIHVwZGF0ZUlubGluZUJveGVzR2VvbWV0cnlJZkFwcGxpY2FibGUoKTsKLSAgICAg
ICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmUoeyBsaW5lQm94TG9naWNhbFJlY3QsIHsgeyB9LCB7
IH0gfSwgeyB9LCB7IH0sIHsgfSB9KTsKLSAgICAgICAgcmV0dXJuIGxpbmVCb3hMb2dpY2FsUmVj
dDsKLSAgICB9Ci0KLSAgICBhdXRvIHJvb3RJbmxpbmVCb3hMb2dpY2FsUmVjdCA9IGxpbmVCb3gu
bG9naWNhbFJlY3RGb3JSb290SW5saW5lQm94KCk7Ci0gICAgYXV0byBlbmNsb3NpbmdUb3BBbmRC
b3R0b20gPSBJbmxpbmVMaW5lR2VvbWV0cnk6OkVuY2xvc2luZ1RvcEFuZEJvdHRvbSB7IHJvb3RJ
bmxpbmVCb3hMb2dpY2FsUmVjdC50b3AoKSwgcm9vdElubGluZUJveExvZ2ljYWxSZWN0LmJvdHRv
bSgpIH07Ci0gICAgSGFzaFNldDxjb25zdCBCb3gqPiBpbmxpbmVCb3hTdGFydFNldDsKLSAgICBI
YXNoU2V0PGNvbnN0IEJveCo+IGlubGluZUJveEVuZFNldDsKLQotICAgIGF1dG8gY29uc3RydWN0
TGluZVJ1bnNBbmRVcGRhdGVCb3hHZW9tZXRyeSA9IFsmXSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0
aGUgaW5saW5lIHJ1bnMgb24gdGhlIGN1cnJlbnQgbGluZS4gVGhpcyBpcyBtb3N0bHkgdGV4dCBh
bmQgYXRvbWljIGlubGluZSBydW5zLgotICAgICAgICBmb3IgKGF1dG8mIGxpbmVSdW4gOiBsaW5l
Q29udGVudC5ydW5zKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIG5vdCBuZWVk
IHRvIGNvbnN0cnVjdCBhIGxpbmUgcnVuIGZvciA8YnI+LgotICAgICAgICAgICAgYXV0byYgbGF5
b3V0Qm94ID0gbGluZVJ1bi5sYXlvdXRCb3goKTsKLSAgICAgICAgICAgIGlmIChsaW5lUnVuLmlz
VGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBs
aW5lSW5kZXgsIGxheW91dEJveCwgbGluZUJveC5sb2dpY2FsUmVjdEZvclRleHRSdW4obGluZVJ1
biksIGxpbmVSdW4uZXhwYW5zaW9uKCksIGxpbmVSdW4udGV4dENvbnRlbnQoKSB9KTsKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaW5l
UnVuLmlzTGluZUJyZWFrKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobGF5b3V0Qm94LmlzTGlu
ZUJyZWFrQm94KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT25seSBoYXJkIGxpbmVicmVh
a3MgaGF2ZSBhc3NvY2lhdGVkIGxheW91dCBib3hlcy4KLSAgICAgICAgICAgICAgICAgICAgYXV0
byBsaW5lQnJlYWtCb3hSZWN0ID0gbGluZUJveC5sb2dpY2FsUmVjdEZvckxpbmVCcmVha0JveChs
YXlvdXRCb3gpOwotICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZVJ1
bih7IGxpbmVJbmRleCwgbGF5b3V0Qm94LCBsaW5lQnJlYWtCb3hSZWN0LCBsaW5lUnVuLmV4cGFu
c2lvbigpLCB7IH0gfSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkg
PSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsKLSAgICAgICAgICAgICAg
ICAgICAgbGluZUJyZWFrQm94UmVjdC5tb3ZlQnkobGluZUJveExvZ2ljYWxSZWN0LnRvcExlZnQo
KSk7Ci0gICAgICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KHRv
TGF5b3V0UG9pbnQobGluZUJyZWFrQm94UmVjdC50b3BMZWZ0KCkpKTsKLSAgICAgICAgICAgICAg
ICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodCh0b0xheW91dFVuaXQobGluZUJy
ZWFrQm94UmVjdC5oZWlnaHQoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSAKLSAgICAgICAg
ICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBsaW5lSW5kZXgsIGxheW91
dEJveCwgbGluZUJveC5sb2dpY2FsUmVjdEZvclRleHRSdW4obGluZVJ1biksIGxpbmVSdW4uZXhw
YW5zaW9uKCksIGxpbmVSdW4udGV4dENvbnRlbnQoKSB9KTsKLSAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaW5lUnVuLmlzQm94KCkpIHsK
LSAgICAgICAgICAgICAgICBBU1NFUlQobGF5b3V0Qm94LmlzQXRvbWljSW5saW5lTGV2ZWxCb3go
KSk7Ci0gICAgICAgICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUu
Ym94R2VvbWV0cnkobGF5b3V0Qm94KTsKLSAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxCb3Jk
ZXJCb3ggPSBsaW5lQm94LmxvZ2ljYWxCb3JkZXJCb3hGb3JBdG9taWNJbmxpbmVMZXZlbEJveChs
YXlvdXRCb3gsIGJveEdlb21ldHJ5KTsKLSAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUu
YWRkTGluZVJ1bih7IGxpbmVJbmRleCwgbGF5b3V0Qm94LCBsb2dpY2FsQm9yZGVyQm94LCBsaW5l
UnVuLmV4cGFuc2lvbigpLCB7IH0gfSk7Ci0KLSAgICAgICAgICAgICAgICBhdXRvIGJvcmRlckJv
eExvZ2ljYWxUb3BMZWZ0ID0gbG9naWNhbEJvcmRlckJveC50b3BMZWZ0KCk7Ci0gICAgICAgICAg
ICAgICAgLy8gTm90ZSB0aGF0IGlubGluZSBib3hlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGxpbmUg
YW5kIHRoZWlyIHRvcCBwb3NpdGlvbiBjYW4gYmUgbmVnYXRpdmUuCi0gICAgICAgICAgICAgICAg
Ym9yZGVyQm94TG9naWNhbFRvcExlZnQubW92ZUJ5KGxpbmVCb3hMb2dpY2FsUmVjdC50b3BMZWZ0
KCkpOwotICAgICAgICAgICAgICAgIGlmIChsYXlvdXRCb3guaXNJbkZsb3dQb3NpdGlvbmVkKCkp
Ci0gICAgICAgICAgICAgICAgICAgIGJvcmRlckJveExvZ2ljYWxUb3BMZWZ0ICs9IGdlb21ldHJ5
LmluRmxvd1Bvc2l0aW9uZWRQb3NpdGlvbk9mZnNldChsYXlvdXRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cyk7Ci0gICAgICAgICAgICAgICAgLy8gQXRvbWljIGlubGluZSBib3hlcyBhcmUgYWxs
IHNldC4gVGhlaXIgbWFyZ2luL2JvcmRlci9jb250ZW50IGJveCBnZW9tZXRyaWVzIGFyZSBhbHJl
YWR5IGNvbXB1dGVkLiBXZSBqdXN0IGhhdmUgdG8gcG9zaXRpb24gdGhlbSBoZXJlLgotICAgICAg
ICAgICAgICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KHRvTGF5b3V0UG9pbnQoYm9y
ZGVyQm94TG9naWNhbFRvcExlZnQpKTsKLQotICAgICAgICAgICAgICAgIGF1dG8gYm9yZGVyQm94
VG9wID0gYm9yZGVyQm94TG9naWNhbFRvcExlZnQueSgpOwotICAgICAgICAgICAgICAgIGF1dG8g
Ym9yZGVyQm94Qm90dG9tID0gYm9yZGVyQm94VG9wICsgYm94R2VvbWV0cnkuYm9yZGVyQm94SGVp
Z2h0KCk7Ci0gICAgICAgICAgICAgICAgZW5jbG9zaW5nVG9wQW5kQm90dG9tLnRvcCA9IHN0ZDo6
bWluKGVuY2xvc2luZ1RvcEFuZEJvdHRvbS50b3AsIGJvcmRlckJveFRvcCk7Ci0gICAgICAgICAg
ICAgICAgZW5jbG9zaW5nVG9wQW5kQm90dG9tLmJvdHRvbSA9IHN0ZDo6bWF4KGVuY2xvc2luZ1Rv
cEFuZEJvdHRvbS5ib3R0b20sIGJvcmRlckJveEJvdHRvbSk7Ci0gICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGluZVJ1bi5pc0lubGluZUJv
eFN0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRp
bmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAgICAgICAgICAgICAgIGF1dG8gaW5s
aW5lQm94TG9naWNhbFJlY3QgPSBsaW5lQm94LmxvZ2ljYWxCb3JkZXJCb3hGb3JJbmxpbmVCb3go
bGF5b3V0Qm94LCBib3hHZW9tZXRyeSk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRl
LmFkZExpbmVSdW4oeyBsaW5lSW5kZXgsIGxheW91dEJveCwgaW5saW5lQm94TG9naWNhbFJlY3Qs
IGxpbmVSdW4uZXhwYW5zaW9uKCksIHsgfSB9KTsKLSAgICAgICAgICAgICAgICBpbmxpbmVCb3hT
dGFydFNldC5hZGQoJmxheW91dEJveCk7Ci0gICAgICAgICAgICAgICAgZW5jbG9zaW5nVG9wQW5k
Qm90dG9tLnRvcCA9IHN0ZDo6bWluKGVuY2xvc2luZ1RvcEFuZEJvdHRvbS50b3AsIGlubGluZUJv
eExvZ2ljYWxSZWN0LnRvcCgpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGlmIChsaW5lUnVuLmlzSW5saW5lQm94RW5kKCkpIHsKLSAgICAg
ICAgICAgICAgICBpbmxpbmVCb3hFbmRTZXQuYWRkKCZsYXlvdXRCb3gpOwotICAgICAgICAgICAg
ICAgIGlmICghaW5saW5lQm94U3RhcnRTZXQuY29udGFpbnMoJmxheW91dEJveCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgLy8gQW4gaW5saW5lIGJveCBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcy4g
VXNlIHRoZSBbaW5saW5lIGJveCBlbmRdIHNpZ25hbCB0byBpbmNsdWRlIGl0IGluIHRoZSBlbmNs
b3NpbmcgZ2VvbWV0cnkKLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSB3aGVuIGl0IHN0YXJ0
cyBhdCBhIHByZXZpb3VzIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIGF1dG8gaW5saW5lQm94
TG9naWNhbFJlY3QgPSBsaW5lQm94LmxvZ2ljYWxCb3JkZXJCb3hGb3JJbmxpbmVCb3gobGF5b3V0
Qm94LCBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkobGF5b3V0Qm94KSk7Ci0gICAgICAgICAg
ICAgICAgICAgIGVuY2xvc2luZ1RvcEFuZEJvdHRvbS5ib3R0b20gPSBzdGQ6Om1heChlbmNsb3Np
bmdUb3BBbmRCb3R0b20uYm90dG9tLCBpbmxpbmVCb3hMb2dpY2FsUmVjdC5ib3R0b20oKSk7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgQVNTRVJUKGxpbmVSdW4uaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgpKTsK
LSAgICAgICAgfQotICAgIH07Ci0gICAgY29uc3RydWN0TGluZVJ1bnNBbmRVcGRhdGVCb3hHZW9t
ZXRyeSgpOwotCi0gICAgYXV0byB1cGRhdGVCb3hHZW9tZXRyeUZvcklubGluZUJveGVzID0gWyZd
IHsKLSAgICAgICAgLy8gRklYTUU6IFdlIG1heSB3YW50IHRvIGtlZXAgYXJvdW5kIGFuIGlubGlu
ZSBib3ggb25seSBzZXQuCi0gICAgICAgIGlmICghbGluZUJveC5oYXNJbmxpbmVCb3goKSkKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgLy8gR3JhYiB0aGUgaW5saW5lIGJveGVzIChldmVu
IHRob3NlIHRoYXQgZG9uJ3QgaGF2ZSBhc3NvY2lhdGVkIGxheW91dCBib3hlcyBvbiB0aGUgY3Vy
cmVudCBsaW5lIGR1ZSB0byBsaW5lIHdyYXBwaW5nKQotICAgICAgICAvLyBhbmQgdXBkYXRlIHRo
ZWlyIGdlb21ldHJpZXMuCi0gICAgICAgIGZvciAoYXV0byYgaW5saW5lTGV2ZWxCb3ggOiBsaW5l
Qm94Lm5vblJvb3RJbmxpbmVMZXZlbEJveGVzKCkpIHsKLSAgICAgICAgICAgIGlmICghaW5saW5l
TGV2ZWxCb3guaXNJbmxpbmVCb3goKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgICAgIGF1dG8mIGxheW91dEJveCA9IGlubGluZUxldmVsQm94LmxheW91dEJveCgpOwotICAg
ICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnko
bGF5b3V0Qm94KTsKLSAgICAgICAgICAgIC8vIElubGluZSBib3hlcyBtYXkgb3IgbWF5IG5vdCBi
ZSB3cmFwcGVkIGFuZCBoYXZlIHJ1bnMgb24gbXVsdGlwbGUgbGluZXMgKGUuZy4gPHNwYW4+Zmly
c3QgbGluZTxicj5zZWNvbmQgbGluZTxicj50aGlyZCBsaW5lPC9zcGFuPikKLSAgICAgICAgICAg
IGF1dG8gaW5saW5lQm94Qm9yZGVyQm94ID0gbGluZUJveC5sb2dpY2FsQm9yZGVyQm94Rm9ySW5s
aW5lQm94KGxheW91dEJveCwgYm94R2VvbWV0cnkpOwotICAgICAgICAgICAgYXV0byBpbmxpbmVC
b3hTaXplID0gTGF5b3V0U2l6ZSB7IExheW91dFVuaXQ6OmZyb21GbG9hdENlaWwoaW5saW5lQm94
Qm9yZGVyQm94LndpZHRoKCkpLCBMYXlvdXRVbml0Ojpmcm9tRmxvYXRDZWlsKGlubGluZUJveEJv
cmRlckJveC5oZWlnaHQoKSkgfTsKLSAgICAgICAgICAgIGF1dG8gbG9naWNhbFJlY3QgPSBSZWN0
IHsgTGF5b3V0UG9pbnQgeyBpbmxpbmVCb3hCb3JkZXJCb3gudG9wTGVmdCgpIH0sIGlubGluZUJv
eFNpemUgfTsKLSAgICAgICAgICAgIGxvZ2ljYWxSZWN0Lm1vdmVCeShMYXlvdXRQb2ludCB7IGxp
bmVCb3hMb2dpY2FsUmVjdC50b3BMZWZ0KCkgfSk7Ci0gICAgICAgICAgICBpZiAoaW5saW5lQm94
U3RhcnRTZXQuY29udGFpbnMoJmxheW91dEJveCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlz
IGlubGluZSBib3ggc2hvd2VkIHVwIGZpcnN0IG9uIHRoaXMgbGluZS4KLSAgICAgICAgICAgICAg
ICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVmdChsb2dpY2FsUmVjdC50b3BMZWZ0KCkpOwot
ICAgICAgICAgICAgICAgIGF1dG8gY29udGVudEJveEhlaWdodCA9IGxvZ2ljYWxSZWN0LmhlaWdo
dCgpIC0gKGJveEdlb21ldHJ5LnZlcnRpY2FsQm9yZGVyKCkgKyBib3hHZW9tZXRyeS52ZXJ0aWNh
bFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKTsKLSAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5z
ZXRDb250ZW50Qm94SGVpZ2h0KGNvbnRlbnRCb3hIZWlnaHQpOwotICAgICAgICAgICAgICAgIGF1
dG8gY29udGVudEJveFdpZHRoID0gbG9naWNhbFJlY3Qud2lkdGgoKSAtIChib3hHZW9tZXRyeS5o
b3Jpem9udGFsQm9yZGVyKCkgKyBib3hHZW9tZXRyeS5ob3Jpem9udGFsUGFkZGluZygpLnZhbHVl
T3IoMF9sdSkpOwotICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0
aChjb250ZW50Qm94V2lkdGgpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgLy8gTWlkZGxlIG9yIGVuZCBvZiB0aGUgaW5saW5lIGJveC4gTGV0
J3Mgc3RyZXRjaCB0aGUgYm94IGFzIG5lZWRlZC4KLSAgICAgICAgICAgIGF1dG8gZW5jbG9zaW5n
Qm9yZGVyQm94UmVjdCA9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGJveEdlb21ldHJ5KTsK
LSAgICAgICAgICAgIGVuY2xvc2luZ0JvcmRlckJveFJlY3QuZXhwYW5kVG9Db250YWluKGxvZ2lj
YWxSZWN0KTsKLSAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxMZWZ0KGVuY2xvc2lu
Z0JvcmRlckJveFJlY3QubGVmdCgpKTsKLQotICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29u
dGVudEJveEhlaWdodChlbmNsb3NpbmdCb3JkZXJCb3hSZWN0LmhlaWdodCgpIC0gKGJveEdlb21l
dHJ5LnZlcnRpY2FsQm9yZGVyKCkgKyBib3hHZW9tZXRyeS52ZXJ0aWNhbFBhZGRpbmcoKS52YWx1
ZU9yKDBfbHUpKSk7Ci0gICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgo
ZW5jbG9zaW5nQm9yZGVyQm94UmVjdC53aWR0aCgpIC0gKGJveEdlb21ldHJ5Lmhvcml6b250YWxC
b3JkZXIoKSArIGJveEdlb21ldHJ5Lmhvcml6b250YWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KSkp
OwotICAgICAgICB9Ci0gICAgfTsKLSAgICB1cGRhdGVCb3hHZW9tZXRyeUZvcklubGluZUJveGVz
KCk7Ci0KLSAgICBhdXRvIGNvbnN0cnVjdExpbmVHZW9tZXRyeSA9IFsmXSB7Ci0gICAgICAgIGZv
cm1hdHRpbmdTdGF0ZS5hZGRMaW5lKHsgbGluZUJveExvZ2ljYWxSZWN0LCBlbmNsb3NpbmdUb3BB
bmRCb3R0b20sIGxpbmVCb3guYWxpZ25tZW50QmFzZWxpbmUoKSwgcm9vdElubGluZUJveExvZ2lj
YWxSZWN0LmxlZnQoKSwgbGluZUNvbnRlbnQuY29udGVudExvZ2ljYWxXaWR0aCB9KTsKLSAgICB9
OwotICAgIGNvbnN0cnVjdExpbmVHZW9tZXRyeSgpOwotCi0gICAgcmV0dXJuIGxpbmVCb3hMb2dp
Y2FsUmVjdDsKLX0KLQotdm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6aW52YWxpZGF0ZUZv
cm1hdHRpbmdTdGF0ZShjb25zdCBJbnZhbGlkYXRpb25TdGF0ZSYpCi17Ci0gICAgLy8gRmluZCBv
dXQgd2hhdCB3ZSBuZWVkIHRvIGludmFsaWRhdGUuIFRoaXMgaXMgd2hlcmUgd2UgYWRkIHNvbWUg
c21hcnRzIHRvIGRvIHBhcnRpYWwgbGluZSBsYXlvdXQuCi0gICAgLy8gRm9yIG5vdyBsZXQncyBq
dXN0IGNsZWFyIHRoZSBydW5zLgotICAgIGZvcm1hdHRpbmdTdGF0ZSgpLmNsZWFyTGluZUFuZFJ1
bnMoKTsKLSAgICAvLyBGSVhNRTogVGhpcyBpcyBhbHNvIHdoZXJlIHdlIHdvdWxkIGRlbGV0ZSBp
bmxpbmUgaXRlbXMgaWYgdGhlaXIgY29udGVudCBjaGFuZ2VkLgotfQotCi19Ci19Ci0KLSNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IGFkN2VjOTcyMzdjMWU4OGQ3ODg2MDI2N2ExODA3ZTIwNDhhZjQzMmUuLjAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaAorKysgL2Rldi9u
dWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0g
KiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICog
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBF
TkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZvcm1hdHRpbmdD
b250ZXh0LmgiCi0jaW5jbHVkZSAiSW5saW5lTGluZUJ1aWxkZXIuaCIKLSNpbmNsdWRlIDx3dGYv
SXNvTWFsbG9jLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewot
Ci1jbGFzcyBJbmxpbmVGb3JtYXR0aW5nU3RhdGU7Ci1jbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsK
LWNsYXNzIExpbmVCb3g7Ci0KLS8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbGF5b3V0IGxv
Z2ljIGZvciBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0cy4KLS8vIGh0dHBzOi8vd3d3LnczLm9y
Zy9UUi9DU1MyMi92aXN1cmVuLmh0bWwjaW5saW5lLWZvcm1hdHRpbmcKLWNsYXNzIElubGluZUZv
cm1hdHRpbmdDb250ZXh0IGZpbmFsIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0IHsKLSAgICBX
VEZfTUFLRV9JU09fQUxMT0NBVEVEKElubGluZUZvcm1hdHRpbmdDb250ZXh0KTsKLXB1YmxpYzoK
LSAgICBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRp
bmdDb250ZXh0Um9vdCwgSW5saW5lRm9ybWF0dGluZ1N0YXRlJik7Ci0gICAgdm9pZCBsYXlvdXRJ
bkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZs
b3dDb250ZW50Jikgb3ZlcnJpZGU7Ci0gICAgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgp
IGNvbnN0IG92ZXJyaWRlOwotCi0gICAgY2xhc3MgUXVpcmtzIDogcHVibGljIEZvcm1hdHRpbmdD
b250ZXh0OjpRdWlya3MgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBp
bml0aWFsTGluZUhlaWdodCgpIGNvbnN0OwotICAgICAgICBib29sIGhhc1NvZnRXcmFwT3Bwb3J0
dW5pdHlBdEltYWdlKCkgY29uc3Q7Ci0gICAgICAgIGJvb2wgaW5saW5lTGV2ZWxCb3hBZmZlY3Rz
TGluZUJveChjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYsIGNvbnN0IExpbmVCb3gmKSBj
b25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dDsKLSAgICAgICAgUXVpcmtzKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0
Jik7Ci0KLSAgICAgICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdD
b250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8SW5saW5lRm9ybWF0dGluZ0NvbnRleHQ+
KEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OmZvcm1hdHRpbmdDb250ZXh0KCkpOyB9Ci0KLSAg
ICB9OwotICAgIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3Qg
eyByZXR1cm4gUXVpcmtzKCp0aGlzKTsgfQotCi0gICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ1N0
YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxJbmxpbmVGb3Jt
YXR0aW5nU3RhdGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KLSAg
ICBJbmxpbmVGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIGRvd25j
YXN0PElubGluZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdT
dGF0ZSgpKTsgfQotCi0gICAgdm9pZCBsaW5lTGF5b3V0Rm9ySW50ZXJncmF0aW9uKEludmFsaWRh
dGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jik7Ci0KLXByaXZh
dGU6Ci0gICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBjb21wdXRlZEludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMoKSBvdmVycmlkZTsKLQotICAgIGNsYXNzIEdlb21ldHJ5IDogcHVibGljIEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSB7Ci0gICAgcHVibGljOgotICAgICAgICBMaW5lQm94
IGxpbmVCb3hGb3JMaW5lQ29udGVudChjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmKTsK
LSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsVG9wRm9yTmV4dExpbmUoY29uc3QgTGlu
ZUJ1aWxkZXI6OkxpbmVDb250ZW50JiwgSW5saW5lTGF5b3V0VW5pdCBwcmV2aW91c0xpbmVMb2dp
Y2FsQm90dG9tLCBjb25zdCBGbG9hdGluZ0NvbnRleHQmKSBjb25zdDsKLQotICAgICAgICBDb250
ZW50SGVpZ2h0QW5kTWFyZ2luIGlubGluZUJsb2NrQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25z
dCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVy
dGljYWxWYWx1ZXMmKSBjb25zdDsKLSAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGlubGlu
ZUJsb2NrQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0KLSAgICBw
cml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Ci0g
ICAgICAgIEdlb21ldHJ5KGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Jik7Ci0KLSAgICAg
ICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29u
c3QgeyByZXR1cm4gZG93bmNhc3Q8SW5saW5lRm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdD
b250ZXh0OjpHZW9tZXRyeTo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KLQotICAgIH07Ci0gICAg
SW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1
cm4gR2VvbWV0cnkoKnRoaXMpOyB9Ci0KLSAgICB2b2lkIGxpbmVMYXlvdXQoSW5saW5lSXRlbXMm
LCBMaW5lQnVpbGRlcjo6SW5saW5lSXRlbVJhbmdlLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxv
d0NvbnRlbnQmKTsKLQotICAgIHZvaWQgY29tcHV0ZUludHJpbnNpY1dpZHRoRm9yRm9ybWF0dGlu
Z1Jvb3QoY29uc3QgQm94Jik7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBjb21wdXRlZEludHJpbnNp
Y1dpZHRoRm9yQ29uc3RyYWludChJbmxpbmVMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKSBjb25z
dDsKLQotICAgIHZvaWQgY29tcHV0ZUhvcml6b250YWxNYXJnaW4oY29uc3QgQm94JiwgY29uc3Qg
SG9yaXpvbnRhbENvbnN0cmFpbnRzJik7Ci0gICAgdm9pZCBjb21wdXRlSGVpZ2h0QW5kTWFyZ2lu
KGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOwotICAgIHZvaWQgY29t
cHV0ZVdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYpOwotCi0gICAgdm9pZCBjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCk7Ci0gICAgSW5s
aW5lUmVjdCBjb21wdXRlR2VvbWV0cnlGb3JMaW5lQ29udGVudChjb25zdCBMaW5lQnVpbGRlcjo6
TGluZUNvbnRlbnQmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmKTsKLSAgICB2b2lkIGlu
dmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoY29uc3QgSW52YWxpZGF0aW9uU3RhdGUmKTsKLX07Ci0K
LWlubGluZSBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Okdlb21ldHJ5KGNvbnN0
IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICA6
IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeShpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLXsK
LX0KLQotaW5saW5lIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OlF1aXJrcyhjb25z
dCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCi0gICAg
OiBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzKGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQotewot
fQotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09O
VEVYVChJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCwgaXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgp
KQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRy
eS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNWI4NjQ1NTNiOTA5ZTVjM2I4
OGYxNmM4ZmE2MDcxMzIyMzAyNDEuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MjcgKzAs
MCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0g
KiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAq
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRF
WFQpCi0KLSNpbmNsdWRlICJGbG9hdGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJGb3JtYXR0aW5n
Q29udGV4dC5oIgotI2luY2x1ZGUgIklubGluZUxpbmVCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRC
b3guaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRS
ZXBsYWNlZEJveC5oIgotI2luY2x1ZGUgIkxlbmd0aEZ1bmN0aW9ucy5oIgotCi1uYW1lc3BhY2Ug
V2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgTGluZUJveEJ1aWxkZXIgewot
cHVibGljOgotICAgIExpbmVCb3hCdWlsZGVyKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0
Jik7Ci0gICAgTGluZUJveCBidWlsZChjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmKTsK
LQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgU2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50IHsKLSAg
ICAgICAgU2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50KGNvbnN0IExpbmVCb3g6OklubGluZUxl
dmVsQm94JiByb290SW5saW5lQm94KTsKLQotICAgICAgICBzdGF0aWMgYm9vbCBjYW5Vc2VTaW1w
bGlmaWVkQWxpZ25tZW50KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiByb290SW5saW5l
Qm94LCBjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYsIE9wdGlvbmFsPGNvbnN0IEJveEdl
b21ldHJ5PiBpbmxpbmVMZXZlbEJveEdlb21ldHJ5KTsKLQotICAgICAgICB2b2lkIGFsaWduKExp
bmVCb3g6OklubGluZUxldmVsQm94Jik7Ci0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCByb290
SW5saW5lQm94TG9naWNhbFRvcCgpIGNvbnN0IHsgcmV0dXJuIG1fcm9vdElubGluZUJveExvZ2lj
YWxUb3A7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsaW5lQm94SGVpZ2h0KCkgY29uc3Qg
eyByZXR1cm4gbV9saW5lQm94TG9naWNhbEJvdHRvbSAtIG1fbGluZUJveExvZ2ljYWxUb3A7IH0K
LQotICAgICAgICB2b2lkIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKSB7IG1faXNFbmFibGVkID0g
ZW5hYmxlZDsgfQotICAgICAgICBib29sIGlzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNF
bmFibGVkOyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB2b2lkIGFkanVzdChjb25zdCBMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveCYpOwotCi0gICAgICAgIGNvbnN0IExpbmVCb3g6OklubGluZUxl
dmVsQm94JiBtX3Jvb3RJbmxpbmVCb3g7Ci0gICAgICAgIGJvb2wgbV9pc0VuYWJsZWQgeyB0cnVl
IH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbV9saW5lQm94TG9naWNhbFRvcCB7IDAgfTsK
LSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2xpbmVCb3hMb2dpY2FsQm90dG9tIHsgMCB9Owot
ICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fcm9vdElubGluZUJveExvZ2ljYWxUb3AgeyAwIH07
Ci0gICAgfTsKLQotICAgIHZvaWQgc2V0VmVydGljYWxHZW9tZXRyeUZvcklubGluZUJveChMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveCYpIGNvbnN0OwotICAgIHZvaWQgY29uc3RydWN0QW5kQWxpZ25J
bmxpbmVMZXZlbEJveGVzKExpbmVCb3gmLCBjb25zdCBMaW5lOjpSdW5MaXN0Jik7Ci0gICAgdm9p
ZCBjb21wdXRlTGluZUJveEhlaWdodEFuZEFsaWduSW5saW5lTGV2ZWxCb3hlc1ZlcnRpY2FsbHko
TGluZUJveCYpOwotCi0gICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRp
bmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsgfQot
ICAgIGNvbnN0IEJveCYgcm9vdEJveCgpIGNvbnN0IHsgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0
KCkucm9vdCgpOyB9Ci0gICAgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgY29uc3QgeyByZXR1
cm4gZm9ybWF0dGluZ0NvbnRleHQoKS5sYXlvdXRTdGF0ZSgpOyB9Ci0KLSAgICBib29sIGlzUm9v
dExheW91dEJveChjb25zdCBDb250YWluZXJCb3gmIGNvbnRhaW5lckJveCkgY29uc3QgeyByZXR1
cm4gJmNvbnRhaW5lckJveCA9PSAmcm9vdEJveCgpOyB9Ci0KLXByaXZhdGU6Ci0gICAgY29uc3Qg
SW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Ci19Owot
Ci1zdHJ1Y3QgSGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQgewotcHVibGljOgotICAg
IHZvaWQgcmVzZXQoKTsKLQotICAgIElubGluZUxheW91dFVuaXQgd2lkdGgoKSBjb25zdCB7IHJl
dHVybiBtX3dpZHRoOyB9Ci0gICAgYm9vbCBpc0NvbmRpdGlvbmFsKCkgY29uc3QgeyByZXR1cm4g
bV9pc0NvbmRpdGlvbmFsOyB9Ci0KLSAgICB2b2lkIHNldElzQ29uZGl0aW9uYWwoKSB7IG1faXND
b25kaXRpb25hbCA9IHRydWU7IH0KLSAgICB2b2lkIGV4cGFuZChJbmxpbmVMYXlvdXRVbml0IHdp
ZHRoKSB7IG1fd2lkdGggKz0gd2lkdGg7IH0KLQotcHJpdmF0ZToKLSAgICBib29sIG1faXNDb25k
aXRpb25hbCB7IGZhbHNlIH07Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBtX3dpZHRoIHsgMCB9Owot
fTsKLQotdm9pZCBIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVudDo6cmVzZXQoKQotewot
ICAgIG1faXNDb25kaXRpb25hbCA9IGZhbHNlOwotICAgIG1fd2lkdGggPSAgMDsKLX0KLQotc3Rh
dGljIEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50IGNvbGxlY3RIYW5naW5nVHJhaWxp
bmdXaGl0ZXNwYWNlQ29udGVudChjb25zdCBMaW5lOjpSdW5MaXN0JiBydW5zLCBib29sIGlzTGFz
dExpbmVXaXRoSW5saW5lQ29udGVudCkKLXsKLSAgICBhdXRvIGhhbmdpbmdDb250ZW50ID0gSGFu
Z2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQgeyB9OwotICAgIGlmIChpc0xhc3RMaW5lV2l0
aElubGluZUNvbnRlbnQpCi0gICAgICAgIGhhbmdpbmdDb250ZW50LnNldElzQ29uZGl0aW9uYWwo
KTsKLSAgICBmb3IgKGF1dG8mIHJ1biA6IFdURjo6bWFrZVJldmVyc2VkUmFuZ2UocnVucykpIHsK
LSAgICAgICAgaWYgKHJ1bi5pc0lubGluZUJveFN0YXJ0KCkgfHwgcnVuLmlzSW5saW5lQm94RW5k
KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHJ1bi5pc0xpbmVCcmVhaygp
KSB7Ci0gICAgICAgICAgICBoYW5naW5nQ29udGVudC5zZXRJc0NvbmRpdGlvbmFsKCk7Ci0gICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXJ1bi5oYXNUcmFpbGlu
Z1doaXRlc3BhY2UoKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvLyBDaGVjayBpZiB3
ZSBoYXZlIGEgcHJlc2VydmVkIG9yIGh1bmcgd2hpdGVzcGFjZS4KLSAgICAgICAgaWYgKHJ1bi5z
dHlsZSgpLndoaXRlU3BhY2UoKSAhPSBXaGl0ZVNwYWNlOjpQcmVXcmFwKQotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIC8vIFRoaXMgaXMgZWl0aGVyIGEgbm9ybWFsIG9yIGNvbmRpdGlvbmFs
bHkgaGFuZ2luZyB0cmFpbGluZyB3aGl0ZXNwYWNlLgotICAgICAgICBoYW5naW5nQ29udGVudC5l
eHBhbmQocnVuLnRyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKCkpOwotICAgIH0KLSAgICByZXR1cm4g
aGFuZ2luZ0NvbnRlbnQ7Ci19Ci0KLXN0YXRpYyBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBo
b3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0KGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnMsIFRleHRB
bGlnbk1vZGUgdGV4dEFsaWduLCBJbmxpbmVMYXlvdXRVbml0IGxpbmVMb2dpY2FsV2lkdGgsIElu
bGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCwgYm9vbCBpc0xhc3RMaW5lKQotewot
ICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBsaW5lTG9naWNhbFdpZHRoIC0gY29udGVudExvZ2lj
YWxXaWR0aDsKLSAgICBhdXRvIGhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50ID0gY29s
bGVjdEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50KHJ1bnMsIGlzTGFzdExpbmUpOwot
ICAgIGF2YWlsYWJsZVdpZHRoICs9IGhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50Lndp
ZHRoKCk7Ci0gICAgaWYgKGF2YWlsYWJsZVdpZHRoIDw9IDApCi0gICAgICAgIHJldHVybiB7IH07
Ci0KLSAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbEFsaWdubWVudCA9IFsmXSB7Ci0gICAgICAg
IGlmICh0ZXh0QWxpZ24gIT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSkKLSAgICAgICAgICAgIHJl
dHVybiB0ZXh0QWxpZ247Ci0gICAgICAgIC8vIFRleHQgaXMganVzdGlmaWVkIGFjY29yZGluZyB0
byB0aGUgbWV0aG9kIHNwZWNpZmllZCBieSB0aGUgdGV4dC1qdXN0aWZ5IHByb3BlcnR5LAotICAg
ICAgICAvLyBpbiBvcmRlciB0byBleGFjdGx5IGZpbGwgdGhlIGxpbmUgYm94LiBVbmxlc3Mgb3Ro
ZXJ3aXNlIHNwZWNpZmllZCBieSB0ZXh0LWFsaWduLWxhc3QsCi0gICAgICAgIC8vIHRoZSBsYXN0
IGxpbmUgYmVmb3JlIGEgZm9yY2VkIGJyZWFrIG9yIHRoZSBlbmQgb2YgdGhlIGJsb2NrIGlzIHN0
YXJ0LWFsaWduZWQuCi0gICAgICAgIGlmIChpc0xhc3RMaW5lIHx8ICghcnVucy5pc0VtcHR5KCkg
JiYgcnVucy5sYXN0KCkuaXNMaW5lQnJlYWsoKSkpCi0gICAgICAgICAgICByZXR1cm4gVGV4dEFs
aWduTW9kZTo6U3RhcnQ7Ci0gICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5Owot
ICAgIH07Ci0KLSAgICBzd2l0Y2ggKGNvbXB1dGVkSG9yaXpvbnRhbEFsaWdubWVudCgpKSB7Ci0g
ICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpMZWZ0OgotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6V2Vi
S2l0TGVmdDoKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OlN0YXJ0OgotICAgICAgICByZXR1cm4g
eyB9OwotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6UmlnaHQ6Ci0gICAgY2FzZSBUZXh0QWxpZ25N
b2RlOjpXZWJLaXRSaWdodDoKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OkVuZDoKLSAgICAgICAg
cmV0dXJuIGF2YWlsYWJsZVdpZHRoOwotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6Q2VudGVyOgot
ICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6V2ViS2l0Q2VudGVyOgotICAgICAgICByZXR1cm4gYXZh
aWxhYmxlV2lkdGggLyAyOwotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6SnVzdGlmeToKLSAgICAg
ICAgLy8gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSBpcyBhIHJ1biBhbGlnbm1lbnQgKGFuZCB3ZSBv
bmx5IGRvIGlubGluZSBib3ggYWxpZ25tZW50IGhlcmUpCi0gICAgICAgIHJldHVybiB7IH07Ci0g
ICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKLSAgICAg
ICAgcmV0dXJuIHsgfTsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0
dXJuIHsgfTsKLX0KLQotTGluZUJveEJ1aWxkZXI6OkxpbmVCb3hCdWlsZGVyKGNvbnN0IElubGlu
ZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICA6IG1faW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQoaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCi17Ci19Ci0KLUxp
bmVCb3ggTGluZUJveEJ1aWxkZXI6OmJ1aWxkKGNvbnN0IExpbmVCdWlsZGVyOjpMaW5lQ29udGVu
dCYgbGluZUNvbnRlbnQpCi17Ci0gICAgYXV0byYgcnVucyA9IGxpbmVDb250ZW50LnJ1bnM7Ci0g
ICAgYXV0byBsaW5lTG9naWNhbFdpZHRoID0gbGluZUNvbnRlbnQubGluZUxvZ2ljYWxXaWR0aDsK
LSAgICBhdXRvIGNvbnRlbnRMb2dpY2FsV2lkdGggPSBsaW5lQ29udGVudC5jb250ZW50TG9naWNh
bFdpZHRoOwotICAgIGF1dG8gaG9yaXpvbnRhbEFsaWdubWVudE9mZnNldCA9IExheW91dDo6aG9y
aXpvbnRhbEFsaWdubWVudE9mZnNldChydW5zLCByb290Qm94KCkuc3R5bGUoKS50ZXh0QWxpZ24o
KSwgbGluZUxvZ2ljYWxXaWR0aCwgY29udGVudExvZ2ljYWxXaWR0aCwgbGluZUNvbnRlbnQuaXNM
YXN0TGluZVdpdGhJbmxpbmVDb250ZW50KTsKLSAgICBhdXRvIGxpbmVCb3ggPSBMaW5lQm94IHsg
cm9vdEJveCgpLCBsaW5lQ29udGVudC5sb2dpY2FsVG9wTGVmdCwgbGluZUxvZ2ljYWxXaWR0aCwg
aG9yaXpvbnRhbEFsaWdubWVudE9mZnNldC52YWx1ZU9yKElubGluZUxheW91dFVuaXQgeyB9KSwg
Y29udGVudExvZ2ljYWxXaWR0aCwgbGluZUNvbnRlbnQubm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJv
eENvdW50IH07Ci0gICAgY29uc3RydWN0QW5kQWxpZ25JbmxpbmVMZXZlbEJveGVzKGxpbmVCb3gs
IHJ1bnMpOwotICAgIHJldHVybiBsaW5lQm94OwotfQotCi12b2lkIExpbmVCb3hCdWlsZGVyOjpz
ZXRWZXJ0aWNhbEdlb21ldHJ5Rm9ySW5saW5lQm94KExpbmVCb3g6OklubGluZUxldmVsQm94JiBp
bmxpbmVMZXZlbEJveCkgY29uc3QKLXsKLSAgICBBU1NFUlQoaW5saW5lTGV2ZWxCb3guaXNJbmxp
bmVCb3goKSB8fCBpbmxpbmVMZXZlbEJveC5pc0xpbmVCcmVha0JveCgpKTsKLSAgICBhdXRvJiBm
b250TWV0cmljcyA9IGlubGluZUxldmVsQm94LnN0eWxlKCkuZm9udE1ldHJpY3MoKTsKLSAgICBJ
bmxpbmVMYXlvdXRVbml0IGFzY2VudCA9IGZvbnRNZXRyaWNzLmFzY2VudCgpOwotICAgIElubGlu
ZUxheW91dFVuaXQgZGVzY2VudCA9IGZvbnRNZXRyaWNzLmRlc2NlbnQoKTsKLSAgICBhdXRvIGxv
Z2ljYWxIZWlnaHQgPSBhc2NlbnQgKyBkZXNjZW50OwotICAgIC8vIFdlIG5lZWQgZmxvb3IvY2Vp
bCB0byBtYXRjaCBsZWdhY3kgbGF5b3V0IGludGVncmFsIHBvc2l0aW9uaW5nLgotICAgIGlubGlu
ZUxldmVsQm94LnNldEJhc2VsaW5lKGZsb29yZihhc2NlbnQpKTsKLSAgICBpbmxpbmVMZXZlbEJv
eC5zZXREZXNjZW50KGNlaWwoZGVzY2VudCkpOwotICAgIGlubGluZUxldmVsQm94LnNldExvZ2lj
YWxIZWlnaHQobG9naWNhbEhlaWdodCk7Ci0KLSAgICAvLyBGSVhNRTogQWRqdXN0IGxheW91dCBi
b3VuZHMgd2l0aCBmYWxsYmFjayBmb250IHdoZW4gYXBwbGljYWJsZS4KLSAgICBhdXRvJiBzdHls
ZSA9IGlubGluZUxldmVsQm94LmxheW91dEJveCgpLnN0eWxlKCk7Ci0gICAgYXV0byBsaW5lSGVp
Z2h0ID0gc3R5bGUubGluZUhlaWdodCgpOwotICAgIGlmIChsaW5lSGVpZ2h0LmlzTmVnYXRpdmUo
KSkgewotICAgICAgICAvLyBJZiBsaW5lLWhlaWdodCBjb21wdXRlcyB0byBub3JtYWwgYW5kIGVp
dGhlciB0ZXh0LWVkZ2UgaXMgbGVhZGluZyBvciB0aGlzIGlzIHRoZSByb290IGlubGluZSBib3gs
Ci0gICAgICAgIC8vIHRoZSBmb2504oCZcyBsaW5lIGdhcCBtZXRyaWMgbWF5IGFsc28gYmUgaW5j
b3Jwb3JhdGVkIGludG8gQSBhbmQgRCBieSBhZGRpbmcgaGFsZiB0byBlYWNoIHNpZGUgYXMgaGFs
Zi1sZWFkaW5nLgotICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWlubGluZS0z
LyNpbmxpbmUtaGVpZ2h0Ci0gICAgICAgIC8vIFNpbmNlIHRleHQtZWRnZSBpcyBub3Qgc3VwcG9y
dGVkIHlldCBhbmQgdGhlIGluaXRpYWwgdmFsdWUgaXMgbGVhZGluZywgd2Ugc2hvdWxkIGp1c3Qg
YXBwbHkgaXQgdG8KLSAgICAgICAgLy8gYWxsIGlubGluZSBib3hlcy4KLSAgICAgICAgYXV0byBo
YWxmTGluZUdhcCA9IChmb250TWV0cmljcy5saW5lU3BhY2luZygpIC0gbG9naWNhbEhlaWdodCkg
LyAyOwotICAgICAgICBhc2NlbnQgKz0gaGFsZkxpbmVHYXA7Ci0gICAgICAgIGRlc2NlbnQgKz0g
aGFsZkxpbmVHYXA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsaW5l
SGVpZ2h0ID0gc3R5bGUuY29tcHV0ZWRMaW5lSGVpZ2h0KCk7Ci0gICAgICAgIElubGluZUxheW91
dFVuaXQgaGFsZkxlYWRpbmcgPSAobGluZUhlaWdodCAtIChhc2NlbnQgKyBkZXNjZW50KSkgLyAy
OwotICAgICAgICBhc2NlbnQgKz0gaGFsZkxlYWRpbmc7Ci0gICAgICAgIGRlc2NlbnQgKz0gaGFs
ZkxlYWRpbmc7Ci0gICAgfQotICAgIC8vIFdlIG5lZWQgZmxvb3IvY2VpbCB0byBtYXRjaCBsZWdh
Y3kgbGF5b3V0IGludGVncmFsIHBvc2l0aW9uaW5nLgotICAgIGlubGluZUxldmVsQm94LnNldExh
eW91dEJvdW5kcyhMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6TGF5b3V0Qm91bmRzIHsgZmxvb3Jm
KGFzY2VudCksIGNlaWwoZGVzY2VudCkgfSk7Ci19Ci0KLXZvaWQgTGluZUJveEJ1aWxkZXI6OmNv
bnN0cnVjdEFuZEFsaWduSW5saW5lTGV2ZWxCb3hlcyhMaW5lQm94JiBsaW5lQm94LCBjb25zdCBM
aW5lOjpSdW5MaXN0JiBydW5zKQotewotICAgIGF1dG8mIHJvb3RJbmxpbmVCb3ggPSBsaW5lQm94
LnJvb3RJbmxpbmVCb3goKTsKLSAgICBzZXRWZXJ0aWNhbEdlb21ldHJ5Rm9ySW5saW5lQm94KHJv
b3RJbmxpbmVCb3gpOwotCi0gICAgYXV0byBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQgPSBT
aW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQgeyByb290SW5saW5lQm94IH07Ci0gICAgLy8gRklY
TUU6IEFkZCBmYXN0IHBhdGggc3VwcG9ydCBmb3IgbGluZS1oZWlnaHQgY29udGVudC4KLSAgICBz
aW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQuc2V0RW5hYmxlZChsYXlvdXRTdGF0ZSgpLmluU3Rh
bmRhcmRzTW9kZSgpICYmIHJvb3RCb3goKS5zdHlsZSgpLmxpbmVIZWlnaHQoKS5pc05lZ2F0aXZl
KCkpOwotCi0gICAgYXV0byBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNhbGx5SWZBcHBsaWNhYmxlID0g
WyZdKGF1dG8mIGlubGluZUxldmVsQm94LCBPcHRpb25hbDxjb25zdCBCb3hHZW9tZXRyeT4gYm94
R2VvbWV0cnkpIHsKLSAgICAgICAgaWYgKCFzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQuaXNF
bmFibGVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmICghU2ltcGxpZmllZFZl
cnRpY2FsQWxpZ25tZW50OjpjYW5Vc2VTaW1wbGlmaWVkQWxpZ25tZW50KHJvb3RJbmxpbmVCb3gs
IGlubGluZUxldmVsQm94LCBib3hHZW9tZXRyeSkpIHsKLSAgICAgICAgICAgIHNpbXBsaWZpZWRW
ZXJ0aWNhbEFsaWdubWVudC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgfQotICAgICAgICBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQuYWxpZ24oaW5s
aW5lTGV2ZWxCb3gpOwotICAgIH07Ci0KLSAgICBhdXRvIGNyZWF0ZVdyYXBwZWRJbmxpbmVCb3hl
cyA9IFsmXSB7Ci0gICAgICAgIGlmIChydW5zLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgLy8gQW4gaW5saW5lIGJveCBtYXkgbm90IG5lY2Vzc2FyaWx5IHN0YXJ0IG9u
IHRoZSBjdXJyZW50IGxpbmU6Ci0gICAgICAgIC8vIDxzcGFuIGlkPW91dGVyPmxpbmUgYnJlYWs8
YnI+dGhpcyBjb250ZW50J3MgcGFyZW50IGlubGluZSBib3goJ291dGVyJykgPHNwYW4gaWQ9aW5u
ZXI+c3RhcnRzIG9uIHRoZSBwcmV2aW91cyBsaW5lPC9zcGFuPjwvc3Bhbj4KLSAgICAgICAgLy8g
V2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSdzIGFuIExpbmVCb3g6OklubGluZUxldmVs
Qm94IGZvciBldmVyeSBpbmxpbmUgYm94IHRoYXQncyBwcmVzZW50IG9uIHRoZSBjdXJyZW50IGxp
bmUuCi0gICAgICAgIC8vIEluIG5lc3RpbmcgY2FzZSB3ZSBuZWVkIHRvIGNyZWF0ZSBMaW5lQm94
OjpJbmxpbmVMZXZlbEJveGVzIGZvciB0aGUgaW5saW5lIGJveCBhbmNlc3RvcnMuCi0gICAgICAg
IC8vIFdlIG9ubHkgaGF2ZSB0byBkbyBpdCBvbiB0aGUgZmlyc3QgcnVuIGFzIGFueSBzdWJzZXF1
ZW50IGlubGluZSBjb250ZW50IGlzIGVpdGhlciBhdCB0aGUgc2FtZS9oaWdoZXIgbmVzdGluZyBs
ZXZlbCBvcgotICAgICAgICAvLyBuZXN0ZWQgd2l0aCBhIFtpbmxpbmUgYm94IHN0YXJ0XSBydW4u
Ci0gICAgICAgIGF1dG8mIGZpcnN0UnVuID0gcnVuc1swXTsKLSAgICAgICAgYXV0byYgZmlyc3RS
dW5QYXJlbnRMYXlvdXRCb3ggPSBmaXJzdFJ1bi5sYXlvdXRCb3goKS5wYXJlbnQoKTsKLSAgICAg
ICAgLy8gSWYgdGhlIHBhcmVudCBpcyB0aGUgZm9ybWF0dGluZyByb290LCB3ZSBjYW4gc3RvcCBo
ZXJlLiBUaGlzIGlzIHJvb3QgaW5saW5lIGJveCBjb250ZW50LCB0aGVyZSdzIG5vIG5lc3Rpbmcg
aW5saW5lIGJveCBmcm9tIHRoZSBwcmV2aW91cyBsaW5lKHMpCi0gICAgICAgIC8vIHVubGVzcyB0
aGUgaW5saW5lIGJveCBjbG9zaW5nIGlzIGZvcmNlZCBvdmVyIHRvIHRoZSBjdXJyZW50IGxpbmUu
Ci0gICAgICAgIC8vIGUuZy4KLSAgICAgICAgLy8gPHNwYW4+bm9ybWFsbHkgdGhlIGlubGluZSBi
b3ggY2xvc2luZyBmb3JtcyBhIGNvbnRpbnVvdXMgY29udGVudDwvc3Bhbj4KLSAgICAgICAgLy8g
PHNwYW4+dW5sZXNzIGl0J3MgZm9yY2VkIHRvIHRoZSBuZXh0IGxpbmU8YnI+PC9zcGFuPgotICAg
ICAgICBhdXRvIGZpcnN0UnVuTmVlZHNJbmxpbmVCb3ggPSBmaXJzdFJ1bi5pc0lubGluZUJveEVu
ZCgpOwotICAgICAgICBpZiAoIWZpcnN0UnVuTmVlZHNJbmxpbmVCb3ggJiYgaXNSb290TGF5b3V0
Qm94KGZpcnN0UnVuUGFyZW50TGF5b3V0Qm94KSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgVmVjdG9yPGNvbnN0IEJveCo+IGxheW91dEJveGVzV2l0aG91dElubGluZUJveGVzOwotICAg
ICAgICBpZiAoZmlyc3RSdW5OZWVkc0lubGluZUJveCkKLSAgICAgICAgICAgIGxheW91dEJveGVz
V2l0aG91dElubGluZUJveGVzLmFwcGVuZCgmZmlyc3RSdW4ubGF5b3V0Qm94KCkpOwotICAgICAg
ICBhdXRvKiBhbmNlc3RvciA9ICZmaXJzdFJ1blBhcmVudExheW91dEJveDsKLSAgICAgICAgd2hp
bGUgKCFpc1Jvb3RMYXlvdXRCb3goKmFuY2VzdG9yKSkgewotICAgICAgICAgICAgbGF5b3V0Qm94
ZXNXaXRob3V0SW5saW5lQm94ZXMuYXBwZW5kKGFuY2VzdG9yKTsKLSAgICAgICAgICAgIGFuY2Vz
dG9yID0gJmFuY2VzdG9yLT5wYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBDb25zdHJ1
Y3QgdGhlIG1pc3NpbmcgTGluZUJveDo6SW5saW5lQm94ZXMgc3RhcnRpbmcgd2l0aCB0aGUgdG9w
bW9zdCBsYXlvdXQgYm94LgotICAgICAgICBmb3IgKGF1dG8qIGxheW91dEJveCA6IFdURjo6bWFr
ZVJldmVyc2VkUmFuZ2UobGF5b3V0Qm94ZXNXaXRob3V0SW5saW5lQm94ZXMpKSB7Ci0gICAgICAg
ICAgICBhdXRvIGlubGluZUJveCA9IExpbmVCb3g6OklubGluZUxldmVsQm94OjpjcmVhdGVJbmxp
bmVCb3goKmxheW91dEJveCwgcm9vdElubGluZUJveC5sb2dpY2FsTGVmdCgpLCBsaW5lQm94LmNv
bnRlbnRMb2dpY2FsV2lkdGgoKSk7Ci0gICAgICAgICAgICBzZXRWZXJ0aWNhbEdlb21ldHJ5Rm9y
SW5saW5lQm94KGlubGluZUJveCk7Ci0gICAgICAgICAgICBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNh
bGx5SWZBcHBsaWNhYmxlKGlubGluZUJveCwgeyB9KTsKLSAgICAgICAgICAgIGxpbmVCb3guYWRk
SW5saW5lTGV2ZWxCb3goV1RGTW92ZShpbmxpbmVCb3gpKTsKLSAgICAgICAgfQotICAgIH07Ci0g
ICAgY3JlYXRlV3JhcHBlZElubGluZUJveGVzKCk7Ci0KLSAgICBhdXRvIGxpbmVIYXNDb250ZW50
ID0gZmFsc2U7Ci0gICAgZm9yIChhdXRvJiBydW4gOiBydW5zKSB7Ci0gICAgICAgIGF1dG8mIGxh
eW91dEJveCA9IHJ1bi5sYXlvdXRCb3goKTsKLSAgICAgICAgYXV0byBydW5IYXNDb250ZW50ID0g
WyZdICgpIC0+IGJvb2wgewotICAgICAgICAgICAgQVNTRVJUKCFsaW5lSGFzQ29udGVudCk7Ci0g
ICAgICAgICAgICBpZiAocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc0JveCgpIHx8IHJ1bi5pc1NvZnRM
aW5lQnJlYWsoKSB8fCBydW4uaXNIYXJkTGluZUJyZWFrKCkpCi0gICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgICAgICBhdXRvJiBpbmxpbmVCb3hHZW9tZXRyeSA9IGZvcm1hdHRp
bmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKLSAgICAgICAgICAgIC8vIEV2
ZW4gbmVnYXRpdmUgaG9yaXpvbnRhbCBtYXJnaW4gbWFrZXMgdGhlIGxpbmUgImNvbnRlbnRmdWwi
LgotICAgICAgICAgICAgaWYgKHJ1bi5pc0lubGluZUJveFN0YXJ0KCkpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIGlubGluZUJveEdlb21ldHJ5Lm1hcmdpblN0YXJ0KCkgfHwgaW5saW5lQm94R2Vv
bWV0cnkuYm9yZGVyTGVmdCgpIHx8IGlubGluZUJveEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCkudmFs
dWVPcigwX2x1KTsKLSAgICAgICAgICAgIGlmIChydW4uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAg
ICAgICAgICAgICByZXR1cm4gaW5saW5lQm94R2VvbWV0cnkubWFyZ2luRW5kKCkgfHwgaW5saW5l
Qm94R2VvbWV0cnkuYm9yZGVyUmlnaHQoKSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5wYWRkaW5nUmln
aHQoKS52YWx1ZU9yKDBfbHUpOwotICAgICAgICAgICAgaWYgKHJ1bi5pc1dvcmRCcmVha09wcG9y
dHVuaXR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfTsK
LSAgICAgICAgbGluZUhhc0NvbnRlbnQgPSBsaW5lSGFzQ29udGVudCB8fCBydW5IYXNDb250ZW50
KCk7Ci0gICAgICAgIGF1dG8gbG9naWNhbExlZnQgPSByb290SW5saW5lQm94LmxvZ2ljYWxMZWZ0
KCkgKyBydW4ubG9naWNhbExlZnQoKTsKLSAgICAgICAgaWYgKHJ1bi5pc0JveCgpKSB7Ci0gICAg
ICAgICAgICBhdXRvJiBpbmxpbmVMZXZlbEJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQo
KS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwotICAgICAgICAgICAgYXV0byBtYXJnaW5Cb3hI
ZWlnaHQgPSBpbmxpbmVMZXZlbEJveEdlb21ldHJ5Lm1hcmdpbkJveEhlaWdodCgpOwotICAgICAg
ICAgICAgYXV0byBhc2NlbnQgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAgICAgICAgICAgIGlm
IChsYXlvdXRTdGF0ZSgpLnNob3VsZE5vdFN5bnRoZXNpemVJbmxpbmVCbG9ja0Jhc2VsaW5lKCkp
IHsKLSAgICAgICAgICAgICAgICAvLyBJbnRlZ3JhdGlvbiBjb2RlcGF0aCBjb25zdHJ1Y3RzIHJl
cGxhY2VkIGJveGVzIGZvciBpbmxpbmUtYmxvY2sgY29udGVudC4KLSAgICAgICAgICAgICAgICBB
U1NFUlQobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSk7Ci0gICAgICAgICAgICAgICAgYXNjZW50
ID0gKmRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLmJhc2VsaW5lKCk7Ci0gICAgICAg
ICAgICB9IGVsc2UgaWYgKGxheW91dEJveC5pc0lubGluZUJsb2NrQm94KCkpIHsKLSAgICAgICAg
ICAgICAgICAvLyBUaGUgYmFzZWxpbmUgb2YgYW4gJ2lubGluZS1ibG9jaycgaXMgdGhlIGJhc2Vs
aW5lIG9mIGl0cyBsYXN0IGxpbmUgYm94IGluIHRoZSBub3JtYWwgZmxvdywgdW5sZXNzIGl0IGhh
cyBlaXRoZXIgbm8gaW4tZmxvdyBsaW5lIGJveGVzIG9yCi0gICAgICAgICAgICAgICAgLy8gaWYg
aXRzICdvdmVyZmxvdycgcHJvcGVydHkgaGFzIGEgY29tcHV0ZWQgdmFsdWUgb3RoZXIgdGhhbiAn
dmlzaWJsZScsIGluIHdoaWNoIGNhc2UgdGhlIGJhc2VsaW5lIGlzIHRoZSBib3R0b20gbWFyZ2lu
IGVkZ2UuCi0gICAgICAgICAgICAgICAgYXV0byBzeW50aGVzaXplQmFzZWxpbmUgPSAhbGF5b3V0
Qm94LmVzdGFibGlzaGVzSW5saW5lRm9ybWF0dGluZ0NvbnRleHQoKSB8fCAhbGF5b3V0Qm94LnN0
eWxlKCkuaXNPdmVyZmxvd1Zpc2libGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3ludGhlc2l6
ZUJhc2VsaW5lKQotICAgICAgICAgICAgICAgICAgICBhc2NlbnQgPSBtYXJnaW5Cb3hIZWlnaHQ7
Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8mIGZvcm1h
dHRpbmdTdGF0ZSA9IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3Rh
dGUoZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpKTsKLSAgICAgICAgICAgICAgICAg
ICAgYXV0byYgbGFzdExpbmUgPSBmb3JtYXR0aW5nU3RhdGUubGluZXMoKS5sYXN0KCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGF1dG8gaW5saW5lQmxvY2tCYXNlbGluZSA9IGxhc3RMaW5lLmxpbmVC
b3hMb2dpY2FsUmVjdCgpLnRvcCgpICsgbGFzdExpbmUuYmFzZWxpbmUoKTsKLSAgICAgICAgICAg
ICAgICAgICAgYXNjZW50ID0gaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUoKSAr
IGlubGluZUxldmVsQm94R2VvbWV0cnkuYm9yZGVyVG9wKCkgKyBpbmxpbmVMZXZlbEJveEdlb21l
dHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKDApICsgaW5saW5lQmxvY2tCYXNlbGluZTsKLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxheW91dEJveC5pc1JlcGxhY2Vk
Qm94KCkpCi0gICAgICAgICAgICAgICAgYXNjZW50ID0gZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxh
eW91dEJveCkuYmFzZWxpbmUoKS52YWx1ZU9yKG1hcmdpbkJveEhlaWdodCk7Ci0gICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgYXNjZW50ID0gbWFyZ2luQm94SGVpZ2h0OwotICAgICAg
ICAgICAgbG9naWNhbExlZnQgKz0gc3RkOjptYXgoMF9sdSwgaW5saW5lTGV2ZWxCb3hHZW9tZXRy
eS5tYXJnaW5TdGFydCgpKTsKLSAgICAgICAgICAgIGF1dG8gYXRvbWljSW5saW5lTGV2ZWxCb3gg
PSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlQXRvbWljSW5saW5lTGV2ZWxCb3gobGF5
b3V0Qm94LCBsb2dpY2FsTGVmdCwgeyBpbmxpbmVMZXZlbEJveEdlb21ldHJ5LmJvcmRlckJveFdp
ZHRoKCksIG1hcmdpbkJveEhlaWdodCB9KTsKLSAgICAgICAgICAgIGF0b21pY0lubGluZUxldmVs
Qm94LnNldEJhc2VsaW5lKGFzY2VudCk7Ci0gICAgICAgICAgICBhdG9taWNJbmxpbmVMZXZlbEJv
eC5zZXRMYXlvdXRCb3VuZHMoTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OkxheW91dEJvdW5kcyB7
IGFzY2VudCwgbWFyZ2luQm94SGVpZ2h0IC0gYXNjZW50IH0pOwotICAgICAgICAgICAgc2ltcGxp
ZmllZEFsaWduVmVydGljYWxseUlmQXBwbGljYWJsZShhdG9taWNJbmxpbmVMZXZlbEJveCwgaW5s
aW5lTGV2ZWxCb3hHZW9tZXRyeSk7Ci0gICAgICAgICAgICBsaW5lQm94LmFkZElubGluZUxldmVs
Qm94KFdURk1vdmUoYXRvbWljSW5saW5lTGV2ZWxCb3gpKTsKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICB9Ci0gICAgICAgIGlmIChydW4uaXNJbmxpbmVCb3hTdGFydCgpKSB7Ci0gICAg
ICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGRvbid0IGtub3cgeWV0IGhvdyB3aWRlIHRoaXMg
aW5saW5lIGJveCBpcy4gTGV0J3MgYXNzdW1lIGl0J3MgYXMgbG9uZyBhcyB0aGUgbGluZSBpcwot
ICAgICAgICAgICAgLy8gYW5kIGFkanVzdCBpdCBsYXRlciBpZiB3ZSBjb21lIGFjcm9zcyBhbiBp
bmxpbmVCb3hFbmQgcnVuIChzZWUgYmVsb3cpLgotICAgICAgICAgICAgYXV0byBpbml0aWFsTG9n
aWNhbFdpZHRoID0gbGluZUJveC5jb250ZW50TG9naWNhbFdpZHRoKCkgLSBydW4ubG9naWNhbExl
ZnQoKTsKLSAgICAgICAgICAgIEFTU0VSVChpbml0aWFsTG9naWNhbFdpZHRoID49IDApOwotICAg
ICAgICAgICAgLy8gSW5saW5lIGJveCBydW4gaXMgYmFzZWQgb24gbWFyZ2luIGJveC4gTGV0J3Mg
Y29udmVydCBpdCB0byBib3JkZXIgYm94LgotICAgICAgICAgICAgYXV0byBtYXJnaW5TdGFydCA9
IHN0ZDo6bWF4KDBfbHUsIGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGF5b3V0
Qm94KS5tYXJnaW5TdGFydCgpKTsKLSAgICAgICAgICAgIGxvZ2ljYWxMZWZ0ICs9IG1hcmdpblN0
YXJ0OwotICAgICAgICAgICAgaW5pdGlhbExvZ2ljYWxXaWR0aCAtPSBtYXJnaW5TdGFydDsKLSAg
ICAgICAgICAgIGF1dG8gaW5saW5lQm94ID0gTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0
ZUlubGluZUJveChsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCBpbml0aWFsTG9naWNhbFdpZHRoKTsK
LSAgICAgICAgICAgIHNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3goaW5saW5lQm94KTsK
LSAgICAgICAgICAgIHNpbXBsaWZpZWRBbGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUoaW5saW5l
Qm94LCB7IH0pOwotICAgICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChXVEZNb3Zl
KGlubGluZUJveCkpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAg
aWYgKHJ1bi5pc0lubGluZUJveEVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBBZGp1c3QgdGhlIGxv
Z2ljYWwgd2lkdGggd2hlbiB0aGUgaW5saW5lIGJveCBjbG9zZXMgb24gdGhpcyBsaW5lLgotICAg
ICAgICAgICAgYXV0byYgaW5saW5lQm94ID0gbGluZUJveC5pbmxpbmVMZXZlbEJveEZvckxheW91
dEJveChsYXlvdXRCb3gpOwotICAgICAgICAgICAgQVNTRVJUKGlubGluZUJveC5pc0lubGluZUJv
eCgpKTsKLSAgICAgICAgICAgIC8vIElubGluZSBib3ggcnVuIGlzIGJhc2VkIG9uIG1hcmdpbiBi
b3guIExldCdzIGNvbnZlcnQgaXQgdG8gYm9yZGVyIGJveC4KLSAgICAgICAgICAgIGF1dG8gbWFy
Z2luRW5kID0gc3RkOjptYXgoMF9sdSwgZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJv
eChsYXlvdXRCb3gpLm1hcmdpbkVuZCgpKTsKLSAgICAgICAgICAgIGF1dG8gaW5saW5lQm94TG9n
aWNhbFJpZ2h0ID0gbG9naWNhbExlZnQgKyBydW4ubG9naWNhbFdpZHRoKCkgLSBtYXJnaW5FbmQ7
Ci0gICAgICAgICAgICBpbmxpbmVCb3guc2V0TG9naWNhbFdpZHRoKGlubGluZUJveExvZ2ljYWxS
aWdodCAtIGlubGluZUJveC5sb2dpY2FsTGVmdCgpKTsKLSAgICAgICAgICAgIHNpbXBsaWZpZWRB
bGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUoaW5saW5lQm94LCB7IH0pOwotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJ1bi5pc1RleHQoKSB8fCBydW4uaXNT
b2Z0TGluZUJyZWFrKCkpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBBZGp1c3Qgbm9uLWVtcHR5
IGlubGluZSBib3ggaGVpZ2h0IHdoZW4gZ2x5cGhzIGZyb20gdGhlIG5vbi1wcmltYXJ5IGZvbnQg
c3RyZXRjaCB0aGUgYm94LgotICAgICAgICAgICAgbGluZUJveC5pbmxpbmVMZXZlbEJveEZvckxh
eW91dEJveChsYXlvdXRCb3gucGFyZW50KCkpLnNldEhhc0NvbnRlbnQoKTsKLSAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChydW4uaXNIYXJkTGluZUJyZWFrKCkp
IHsKLSAgICAgICAgICAgIGF1dG8gbGluZUJyZWFrQm94ID0gTGluZUJveDo6SW5saW5lTGV2ZWxC
b3g6OmNyZWF0ZUxpbmVCcmVha0JveChsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0KTsKLSAgICAgICAg
ICAgIHNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3gobGluZUJyZWFrQm94KTsKLSAgICAg
ICAgICAgIHNpbXBsaWZpZWRBbGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUobGluZUJyZWFrQm94
LCB7IH0pOwotICAgICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChXVEZNb3ZlKGxp
bmVCcmVha0JveCkpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAg
aWYgKHJ1bi5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkpIHsKLSAgICAgICAgICAgIGxpbmVCb3gu
YWRkSW5saW5lTGV2ZWxCb3goTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUdlbmVyaWNJ
bmxpbmVMZXZlbEJveChsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0KSk7Ci0gICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgfQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICB9Ci0K
LSAgICBsaW5lQm94LnNldEhhc0NvbnRlbnQobGluZUhhc0NvbnRlbnQpOwotICAgIGlmIChzaW1w
bGlmaWVkVmVydGljYWxBbGlnbm1lbnQuaXNFbmFibGVkKCkgfHwgIWxpbmVIYXNDb250ZW50KSB7
Ci0gICAgICAgIC8vIFdlIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBleGVyY2lzZSB0aGUgZmFz
dCBwYXRoIHdoZW4gdGhlIGxpbmUgaGFzIG5vIGNvbnRlbnQgYXQgYWxsLCBldmVuIGluIG5vbi1z
dGFuZGFyZHMgbW9kZSBvciB3aXRoIGxpbmUtaGVpZ2h0IHNldC4KLSAgICAgICAgcm9vdElubGlu
ZUJveC5zZXRMb2dpY2FsVG9wKGxpbmVIYXNDb250ZW50ID8gc2ltcGxpZmllZFZlcnRpY2FsQWxp
Z25tZW50LnJvb3RJbmxpbmVCb3hMb2dpY2FsVG9wKCkgOiAtcm9vdElubGluZUJveC5iYXNlbGlu
ZSgpKTsKLSAgICAgICAgbGluZUJveC5zZXRMb2dpY2FsSGVpZ2h0KGxpbmVIYXNDb250ZW50ID8g
c2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50LmxpbmVCb3hIZWlnaHQoKSA6IElubGluZUxheW91
dFVuaXQoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGNvbXB1dGVMaW5lQm94SGVpZ2h0QW5kQWxp
Z25JbmxpbmVMZXZlbEJveGVzVmVydGljYWxseShsaW5lQm94KTsKLX0KLQotdm9pZCBMaW5lQm94
QnVpbGRlcjo6Y29tcHV0ZUxpbmVCb3hIZWlnaHRBbmRBbGlnbklubGluZUxldmVsQm94ZXNWZXJ0
aWNhbGx5KExpbmVCb3gmIGxpbmVCb3gpCi17Ci0gICAgQVNTRVJUKGxpbmVCb3guaGFzQ29udGVu
dCgpKTsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIChwYXJ0aWFsbHkpIGltcGxlbWVudHM6Ci0gICAg
Ly8gMi4yLiBMYXlvdXQgV2l0aGluIExpbmUgQm94ZXMKLSAgICAvLyBodHRwczovL3d3dy53My5v
cmcvVFIvY3NzLWlubGluZS0zLyNsaW5lLWxheW91dAotICAgIC8vIDEuIENvbXB1dGUgdGhlIGxp
bmUgYm94IGhlaWdodCB1c2luZyB0aGUgbGF5b3V0IGJvdW5kcyBnZW9tZXRyeS4gVGhpcyBoZWln
aHQgY29tcHV0YXRpb24gc3RyaWN0bHkgdXNlcyBsYXlvdXQgYm91bmRzIGFuZCBub3Qgbm9ybWFs
IGlubGluZSBsZXZlbCBib3ggZ2VvbWV0cmllcy4KLSAgICAvLyAyLiBDb21wdXRlIHRoZSBiYXNl
bGluZS9sb2dpY2FsIHRvcCBwb3NpdGlvbiBvZiB0aGUgcm9vdCBpbmxpbmUgYm94LiBBbGlnbmVk
IGJveGVzIHB1c2ggdGhlIHJvb3QgaW5saW5lIGJveCBhcm91bmQgaW5zaWRlIHRoZSBsaW5lIGJv
eC4KLSAgICAvLyAzLiBGaW5hbGx5IGFsaWduIHRoZSBpbmxpbmUgbGV2ZWwgYm94ZXMgdXNpbmcg
KG1vc3RseSkgbm9ybWFsIGlubGluZSBsZXZlbCBib3ggZ2VvbWV0cmllcy4KLSAgICBhdXRvIHF1
aXJrcyA9IGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCk7Ci0gICAgYXV0byYgcm9vdElubGlu
ZUJveCA9IGxpbmVCb3gucm9vdElubGluZUJveCgpOwotCi0gICAgYXV0byBjb21wdXRlTGluZUJv
eExvZ2ljYWxIZWlnaHQgPSBbJl0gewotICAgICAgICAvLyBMaW5lIGJveCBoZWlnaHQgY29tcHV0
YXRpb24gaXMgYmFzZWQgb24gdGhlIGxheW91dCBib3VuZHMgb2YgdGhlIGlubGluZSBib3hlcyBh
bmQgbm90IHRoZWlyIGxvZ2ljYWwgKGFzY2VudC9kZXNjZW50KSBkaW1lbnNpb25zLgotICAgICAg
ICBzdHJ1Y3QgQWJzb2x1dGVUb3BBbmRCb3R0b20gewotICAgICAgICAgICAgSW5saW5lTGF5b3V0
VW5pdCB0b3AgeyAwIH07Ci0gICAgICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJvdHRvbSB7IDAg
fTsKLSAgICAgICAgfTsKLSAgICAgICAgSGFzaE1hcDxjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveCosIEFic29sdXRlVG9wQW5kQm90dG9tPiBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9wQW5k
Qm90dG9tTWFwOwotCi0gICAgICAgIGF1dG8gbWluaW11bUxvZ2ljYWxUb3AgPSBPcHRpb25hbDxJ
bmxpbmVMYXlvdXRVbml0PiB7IH07Ci0gICAgICAgIGF1dG8gbWF4aW11bUxvZ2ljYWxCb3R0b20g
PSBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB7IH07Ci0gICAgICAgIGlmIChxdWlya3MuaW5s
aW5lTGV2ZWxCb3hBZmZlY3RzTGluZUJveChyb290SW5saW5lQm94LCBsaW5lQm94KSkgewotICAg
ICAgICAgICAgbWluaW11bUxvZ2ljYWxUb3AgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAgICAg
ICAgICAgIG1heGltdW1Mb2dpY2FsQm90dG9tID0gcm9vdElubGluZUJveC5sYXlvdXRCb3VuZHMo
KS5oZWlnaHQoKTsKLSAgICAgICAgICAgIGlubGluZUxldmVsQm94QWJzb2x1dGVUb3BBbmRCb3R0
b21NYXAuYWRkKCZyb290SW5saW5lQm94LCBBYnNvbHV0ZVRvcEFuZEJvdHRvbSB7ICptaW5pbXVt
TG9naWNhbFRvcCwgKm1heGltdW1Mb2dpY2FsQm90dG9tIH0pOwotICAgICAgICB9IGVsc2UKLSAg
ICAgICAgICAgIGlubGluZUxldmVsQm94QWJzb2x1dGVUb3BBbmRCb3R0b21NYXAuYWRkKCZyb290
SW5saW5lQm94LCBBYnNvbHV0ZVRvcEFuZEJvdHRvbSB7IH0pOwotCi0gICAgICAgIFZlY3RvcjxM
aW5lQm94OjpJbmxpbmVMZXZlbEJveCo+IGxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94ZXM7
Ci0gICAgICAgIGZvciAoYXV0byYgaW5saW5lTGV2ZWxCb3ggOiBsaW5lQm94Lm5vblJvb3RJbmxp
bmVMZXZlbEJveGVzKCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9IGlubGluZUxl
dmVsQm94LmxheW91dEJveCgpOwotICAgICAgICAgICAgaWYgKGlubGluZUxldmVsQm94Lmhhc0xp
bmVCb3hSZWxhdGl2ZUFsaWdubWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgbGluZUJveFJlbGF0
aXZlSW5saW5lTGV2ZWxCb3hlcy5hcHBlbmQoJmlubGluZUxldmVsQm94KTsKLSAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dG8mIHBhcmVudElu
bGluZUJveCA9IGxpbmVCb3guaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3gobGF5b3V0Qm94LnBh
cmVudCgpKTsKLSAgICAgICAgICAgIC8vIExvZ2ljYWwgdG9wIGlzIHJlbGF0aXZlIHRvIHRoZSBw
YXJlbnQgaW5saW5lIGJveCdzIGxheW91dCBib3VuZHMuCi0gICAgICAgICAgICAvLyBOb3RlIHRo
YXQgdGhpcyBsb2dpY2FsIHRvcCBpcyBub3QgdGhlIGZpbmFsIGxvZ2ljYWwgdG9wIG9mIHRoZSBp
bmxpbmUgbGV2ZWwgYm94LgotICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbG9naWNhbCB0b3Ag
aW4gdGhlIGNvbnRleHQgb2YgdGhlIGxheW91dCBib3VuZHMgZ2VvbWV0cnkgd2hpY2ggbWF5IGJl
IHZlcnkgZGlmZmVyZW50IGZyb20gdGhlIGlubGluZSBib3gncyBub3JtYWwgZ2VvbWV0cnkuCi0g
ICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3AgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAgICAg
ICAgICAgIHN3aXRjaCAoaW5saW5lTGV2ZWxCb3gudmVydGljYWxBbGlnbigpKSB7Ci0gICAgICAg
ICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lOiB7Ci0gICAgICAgICAgICAgICAgYXV0
byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gaW5saW5lTGV2ZWxCb3gubGF5
b3V0Qm91bmRzKCkuYXNjZW50OwotICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJlbnRJ
bmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJl
bnRCYXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6TWlkZGxlOiB7Ci0gICAgICAgICAgICAgICAgYXV0
byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gaW5saW5lTGV2ZWxCb3gubGF5
b3V0Qm91bmRzKCkuaGVpZ2h0KCkgLyAyICsgcGFyZW50SW5saW5lQm94LnN0eWxlKCkuZm9udE1l
dHJpY3MoKS54SGVpZ2h0KCkgLyAyOwotICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJl
bnRJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbG9naWNhbFRvcE9mZnNldEZyb21Q
YXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmVNaWRkbGU6IHsKLSAgICAgICAg
ICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBpbmxpbmVM
ZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSAvIDI7Ci0gICAgICAgICAgICAgICAgbG9n
aWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBsb2dpY2Fs
VG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpMZW5ndGg6IHsKLSAg
ICAgICAgICAgICAgICBhdXRvJiBzdHlsZSA9IGlubGluZUxldmVsQm94LnN0eWxlKCk7Ci0gICAg
ICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gZmxv
YXRWYWx1ZUZvckxlbmd0aChzdHlsZS52ZXJ0aWNhbEFsaWduTGVuZ3RoKCksIHN0eWxlLmNvbXB1
dGVkTGluZUhlaWdodCgpKSArIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsK
LSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5k
cygpLmFzY2VudCAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7Ci0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2Fs
QWxpZ246OlRleHRUb3A6IHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGV4dC10b3Ag
YWxpZ25zIHdpdGggdGhlIGlubGluZSBib3gncyBmb250IG1ldHJpY3MgdG9wIChhc2NlbnQpIGFu
ZCBub3QgdGhlIGxheW91dCBib3VuZHMgdG9wLgotICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3Ag
PSBwYXJlbnRJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gcGFyZW50SW5saW5lQm94
LmJhc2VsaW5lKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRCb3R0b206IHsKLSAgICAgICAgICAgICAg
ICAvLyBOb3RlIHRoYXQgdGV4dC1ib3R0b20gYWxpZ25zIHdpdGggdGhlIGlubGluZSBib3gncyBm
b250IG1ldHJpY3MgYm90dG9tIChkZXNjZW50KSBhbmQgbm90IHRoZSBsYXlvdXQgYm91bmRzIGJv
dHRvbS4KLSAgICAgICAgICAgICAgICBhdXRvIHBhcmVudElubGluZUJveExheW91dEJvdW5kcyA9
IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKTsKLSAgICAgICAgICAgICAgICBhdXRvIHBh
cmVudElubGluZUJveExvZ2ljYWxCb3R0b20gPSBwYXJlbnRJbmxpbmVCb3hMYXlvdXRCb3VuZHMu
aGVpZ2h0KCkgLSBwYXJlbnRJbmxpbmVCb3hMYXlvdXRCb3VuZHMuZGVzY2VudCArIHBhcmVudElu
bGluZUJveC5kZXNjZW50KCkudmFsdWVPcihJbmxpbmVMYXlvdXRVbml0KCkpOwotICAgICAgICAg
ICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxpbmVCb3hMb2dpY2FsQm90dG9tIC0gaW5saW5l
TGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFT
U0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIHBhcmVudElubGluZUJveEFic29sdXRlVG9wQW5k
Qm90dG9tID0gaW5saW5lTGV2ZWxCb3hBYnNvbHV0ZVRvcEFuZEJvdHRvbU1hcC5nZXQoJnBhcmVu
dElubGluZUJveCk7Ci0gICAgICAgICAgICBhdXRvIGFic29sdXRlTG9naWNhbFRvcCA9IHBhcmVu
dElubGluZUJveEFic29sdXRlVG9wQW5kQm90dG9tLnRvcCArIGxvZ2ljYWxUb3A7Ci0gICAgICAg
ICAgICBhdXRvIGFic29sdXRlTG9naWNhbEJvdHRvbSA9IGFic29sdXRlTG9naWNhbFRvcCArIGlu
bGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpOwotICAgICAgICAgICAgaW5saW5l
TGV2ZWxCb3hBYnNvbHV0ZVRvcEFuZEJvdHRvbU1hcC5hZGQoJmlubGluZUxldmVsQm94LCBBYnNv
bHV0ZVRvcEFuZEJvdHRvbSB7IGFic29sdXRlTG9naWNhbFRvcCwgYWJzb2x1dGVMb2dpY2FsQm90
dG9tIH0pOwotICAgICAgICAgICAgLy8gU3RyZXRjaCB0aGUgbWluL21heCBhYnNvbHV0ZSB2YWx1
ZXMgaWYgYXBwbGljYWJsZS4KLSAgICAgICAgICAgIGlmIChxdWlya3MuaW5saW5lTGV2ZWxCb3hB
ZmZlY3RzTGluZUJveChpbmxpbmVMZXZlbEJveCwgbGluZUJveCkpIHsKLSAgICAgICAgICAgICAg
ICBtaW5pbXVtTG9naWNhbFRvcCA9IHN0ZDo6bWluKG1pbmltdW1Mb2dpY2FsVG9wLnZhbHVlT3Io
YWJzb2x1dGVMb2dpY2FsVG9wKSwgYWJzb2x1dGVMb2dpY2FsVG9wKTsKLSAgICAgICAgICAgICAg
ICBtYXhpbXVtTG9naWNhbEJvdHRvbSA9IHN0ZDo6bWF4KG1heGltdW1Mb2dpY2FsQm90dG9tLnZh
bHVlT3IoYWJzb2x1dGVMb2dpY2FsQm90dG9tKSwgYWJzb2x1dGVMb2dpY2FsQm90dG9tKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgbGluZSBib3ggaGVpZ2h0IGNv
bXB1dGF0aW9uIGlzIGFzIGZvbGxvd3M6Ci0gICAgICAgIC8vIDEuIFN0cmV0Y2ggdGhlIGxpbmUg
Ym94IHdpdGggdGhlIG5vbi1saW5lLWJveCByZWxhdGl2ZSBhbGlnbmVkIGlubGluZSBib3ggYWJz
b2x1dGUgdG9wIGFuZCBib3R0b20gdmFsdWVzLgotICAgICAgICAvLyAyLiBDaGVjayBpZiB0aGUg
bGluZSBib3ggcmVsYXRpdmUgYWxpZ25lZCBpbmxpbmUgYm94ZXMgKHRvcCwgYm90dG9tIGV0Yykg
aGF2ZSBlbm91Z2ggcm9vbSBhbmQgc3RyZXRjaCB0aGUgbGluZSBib3ggZnVydGhlciBpZiBuZWVk
ZWQuCi0gICAgICAgIGF1dG8gbGluZUJveExvZ2ljYWxIZWlnaHQgPSBtYXhpbXVtTG9naWNhbEJv
dHRvbS52YWx1ZU9yKElubGluZUxheW91dFVuaXQoKSkgLSBtaW5pbXVtTG9naWNhbFRvcC52YWx1
ZU9yKElubGluZUxheW91dFVuaXQoKSk7Ci0gICAgICAgIGZvciAoYXV0byogbGluZUJveFJlbGF0
aXZlSW5saW5lTGV2ZWxCb3ggOiBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveGVzKSB7Ci0g
ICAgICAgICAgICBpZiAoIXF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KCpsaW5l
Qm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveCwgbGluZUJveCkpCi0gICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICBsaW5lQm94TG9naWNhbEhlaWdodCA9IHN0ZDo6bWF4KGxpbmVC
b3hMb2dpY2FsSGVpZ2h0LCBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveC0+bGF5b3V0Qm91
bmRzKCkuaGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGxpbmVCb3guc2V0TG9naWNhbEhl
aWdodChsaW5lQm94TG9naWNhbEhlaWdodCk7Ci0gICAgfTsKLSAgICBjb21wdXRlTGluZUJveExv
Z2ljYWxIZWlnaHQoKTsKLQotICAgIGF1dG8gY29tcHV0ZVJvb3RJbmxpbmVCb3hWZXJ0aWNhbFBv
c2l0aW9uID0gWyZdIHsKLSAgICAgICAgSGFzaE1hcDxjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveCosIElubGluZUxheW91dFVuaXQ+IGlubGluZUxldmVsQm94QWJzb2x1dGVCYXNlbGluZU9m
ZnNldE1hcDsKLSAgICAgICAgaW5saW5lTGV2ZWxCb3hBYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0TWFw
LmFkZCgmcm9vdElubGluZUJveCwgSW5saW5lTGF5b3V0VW5pdCB7IH0pOwotCi0gICAgICAgIGF1
dG8gbWF4aW11bVRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxpbmUgPSBPcHRpb25hbDxJ
bmxpbmVMYXlvdXRVbml0PiB7IH07Ci0gICAgICAgIGlmIChxdWlya3MuaW5saW5lTGV2ZWxCb3hB
ZmZlY3RzTGluZUJveChyb290SW5saW5lQm94LCBsaW5lQm94KSkKLSAgICAgICAgICAgIG1heGlt
dW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2VsaW5lID0gcm9vdElubGluZUJveC5sYXlv
dXRCb3VuZHMoKS5hc2NlbnQ7Ci0KLSAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6
IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgewotICAgICAgICAgICAgYXV0byBh
YnNvbHV0ZUJhc2VsaW5lT2Zmc2V0ID0gSW5saW5lTGF5b3V0VW5pdCB7IH07Ci0gICAgICAgICAg
ICBpZiAoIWlubGluZUxldmVsQm94Lmhhc0xpbmVCb3hSZWxhdGl2ZUFsaWdubWVudCgpKSB7Ci0g
ICAgICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94
KCk7Ci0gICAgICAgICAgICAgICAgYXV0byYgcGFyZW50SW5saW5lQm94ID0gbGluZUJveC5pbmxp
bmVMZXZlbEJveEZvckxheW91dEJveChsYXlvdXRCb3gucGFyZW50KCkpOwotICAgICAgICAgICAg
ICAgIGF1dG8gYmFzZWxpbmVPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBJbmxpbmVMYXlvdXRV
bml0IHsgfTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5saW5lTGV2ZWxCb3gudmVydGlj
YWxBbGlnbigpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGlu
ZToKLSAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmVPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUg
PSB7IH07Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Ug
VmVydGljYWxBbGlnbjo6TWlkZGxlOiB7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8gbG9naWNh
bFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3Vu
ZHMoKS5oZWlnaHQoKSAvIDIgKyBwYXJlbnRJbmxpbmVCb3guc3R5bGUoKS5mb250TWV0cmljcygp
LnhIZWlnaHQoKSAvIDIpOwotICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldEZyb21Q
YXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgLSBpbmxp
bmVMZXZlbEJveC5iYXNlbGluZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGlu
ZU1pZGRsZTogewotICAgICAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9t
UGFyZW50QmFzZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSAv
IDI7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5l
ID0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSAtIGlubGluZUxldmVsQm94LmJh
c2VsaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Okxlbmd0aDogewotICAgICAgICAg
ICAgICAgICAgICBhdXRvJiBzdHlsZSA9IGlubGluZUxldmVsQm94LnN0eWxlKCk7Ci0gICAgICAg
ICAgICAgICAgICAgIGF1dG8gdmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5n
dGgoc3R5bGUudmVydGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQo
KSk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRC
YXNlbGluZSA9IHZlcnRpY2FsQWxpZ25PZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgp
OwotICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9
IGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5iYXNl
bGluZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpUZXh0VG9wOgotICAgICAgICAgICAg
ICAgICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHBhcmVudElubGluZUJv
eC5iYXNlbGluZSgpIC0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OwotICAg
ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246OlRleHRCb3R0b206Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBh
cmVudEJhc2VsaW5lID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtICpw
YXJlbnRJbmxpbmVCb3guZGVzY2VudCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lN
UExFTUVOVEVEX1lFVCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgYWJzb2x1dGVCYXNlbGluZU9mZnNldCA9IGlubGluZUxl
dmVsQm94QWJzb2x1dGVCYXNlbGluZU9mZnNldE1hcC5nZXQoJnBhcmVudElubGluZUJveCkgKyBi
YXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsK
LSAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRvcDogewotICAgICAgICAgICAg
ICAgICAgICBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0ID0gcm9vdElubGluZUJveC5sYXlvdXRCb3Vu
ZHMoKS5hc2NlbnQgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0gICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICBjYXNlIFZlcnRpY2FsQWxpZ246OkJvdHRvbTogewotICAgICAgICAgICAgICAgICAgICBhYnNv
bHV0ZUJhc2VsaW5lT2Zmc2V0ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2Vu
dCAtIHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudDsKLSAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6
Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGlubGluZUxldmVsQm94QWJzb2x1dGVCYXNlbGluZU9mZnNldE1hcC5hZGQo
JmlubGluZUxldmVsQm94LCBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0KTsKLSAgICAgICAgICAgIGF1
dG8gYWZmZWN0c1Jvb3RJbmxpbmVCb3hWZXJ0aWNhbFBvc2l0aW9uID0gcXVpcmtzLmlubGluZUxl
dmVsQm94QWZmZWN0c0xpbmVCb3goaW5saW5lTGV2ZWxCb3gsIGxpbmVCb3gpOwotICAgICAgICAg
ICAgaWYgKGFmZmVjdHNSb290SW5saW5lQm94VmVydGljYWxQb3NpdGlvbikgewotICAgICAgICAg
ICAgICAgIGF1dG8gdG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IGFic29sdXRl
QmFzZWxpbmVPZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0g
ICAgICAgICAgICAgICAgaWYgKG1heGltdW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2Vs
aW5lKQotICAgICAgICAgICAgICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVC
b3hCYXNlbGluZSA9IHN0ZDo6bWF4KCptYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hC
YXNlbGluZSwgdG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSk7Ci0gICAgICAgICAg
ICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpcyBxdWlyayBtb2Rl
IGFuZCB0aGUgcm9vdCBpbmxpbmUgYm94IGhhcyBubyBjb250ZW50LiBUaGUgcm9vdCBpbmxpbmUg
Ym94J3MgYmFzZWxpbmUgaXMgYW5jaG9yZWQgYXQgMC4KLSAgICAgICAgICAgICAgICAgICAgLy8g
SG93ZXZlciBuZWdhdGl2ZSBhc2NlbnQgKGUuZyBuZWdhdGl2ZSB0b3AgbWFyZ2luKSBjYW4gInB1
c2giIHRoZSByb290IGlubGluZSBib3ggdXB3YXJkcyBhbmQgaGF2ZSBhIG5lZ2F0aXZlIHZhbHVl
LgotICAgICAgICAgICAgICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hC
YXNlbGluZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudCA+PSAwCi0gICAg
ICAgICAgICAgICAgICAgICAgICA/IHN0ZDo6bWF4KDAuMGYsIHRvcE9mZnNldEZyb21Sb290SW5s
aW5lQm94QmFzZWxpbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHRvcE9mZnNldEZyb21S
b290SW5saW5lQm94QmFzZWxpbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgICAgIGF1dG8gcm9vdElubGluZUJveExvZ2ljYWxUb3AgPSBtYXhpbXVt
VG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZS52YWx1ZU9yKDAuZikgLSByb290SW5s
aW5lQm94LmJhc2VsaW5lKCk7Ci0gICAgICAgIHJvb3RJbmxpbmVCb3guc2V0TG9naWNhbFRvcChy
b290SW5saW5lQm94TG9naWNhbFRvcCk7Ci0gICAgfTsKLSAgICBjb21wdXRlUm9vdElubGluZUJv
eFZlcnRpY2FsUG9zaXRpb24oKTsKLQotICAgIGF1dG8gYWxpZ25JbmxpbmVMZXZlbEJveGVzID0g
WyZdIHsKLSAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9v
dElubGluZUxldmVsQm94ZXMoKSkgewotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7Ci0gICAgICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVC
b3ggPSBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQo
KSk7Ci0gICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3AgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsK
LSAgICAgICAgICAgIHN3aXRjaCAoaW5saW5lTGV2ZWxCb3gudmVydGljYWxBbGlnbigpKSB7Ci0g
ICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lOgotICAgICAgICAgICAgICAg
IGxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94
LmJhc2VsaW5lKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246Ok1pZGRsZTogewotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9m
ZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IChpbmxpbmVMZXZlbEJveC5sb2dpY2FsSGVpZ2h0KCkg
LyAyICsgcGFyZW50SW5saW5lQm94LnN0eWxlKCkuZm9udE1ldHJpY3MoKS54SGVpZ2h0KCkgLyAy
KTsKLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmJhc2VsaW5l
KCkgLSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpC
YXNlbGluZU1pZGRsZTogewotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZSA9IGlubGluZUxldmVsQm94LmxvZ2ljYWxIZWlnaHQoKSAvIDI7Ci0g
ICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0g
bG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6TGVuZ3Ro
OiB7Ci0gICAgICAgICAgICAgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVMZXZlbEJveC5zdHlsZSgp
OwotICAgICAgICAgICAgICAgIGF1dG8gdmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVG
b3JMZW5ndGgoc3R5bGUudmVydGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVI
ZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVu
dEJhc2VsaW5lID0gdmVydGljYWxBbGlnbk9mZnNldCArIGlubGluZUxldmVsQm94LmJhc2VsaW5l
KCk7Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGlu
ZSgpIC0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCAodGV4dCl0
b3AvYm90dG9tIGFsaWduIHRoZWlyIGxheW91dCBib3VuZHMuCi0gICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246OlRleHRUb3A6Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGlu
ZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5l
KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246OlRleHRCb3R0b206Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGlu
ZUJveC5sb2dpY2FsSGVpZ2h0KCkgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5kZXNj
ZW50IC0gaW5saW5lTGV2ZWxCb3guYmFzZWxpbmUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VG9wOgotICAgICAgICAgICAgICAgIC8v
IE5vdGUgdGhhdCB0aGlzIGxvZ2ljYWwgdG9wIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgcGFyZW50
IGlubGluZSBib3guCi0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94
LmxheW91dEJvdW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7Ci0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJvdHRv
bToKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBsb2dpY2FsIHRvcCBpcyBub3Qg
cmVsYXRpdmUgdG8gdGhlIHBhcmVudCBpbmxpbmUgYm94LgotICAgICAgICAgICAgICAgIGxvZ2lj
YWxUb3AgPSBsaW5lQm94LmxvZ2ljYWxIZWlnaHQoKSAtIGlubGluZUxldmVsQm94LmxheW91dEJv
dW5kcygpLmRlc2NlbnQgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOwotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBU1NFUlRf
Tk9UX0lNUExFTUVOVEVEX1lFVCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChsb2dpY2FsVG9w
KTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgYWxpZ25JbmxpbmVMZXZlbEJveGVzKCk7Ci19Ci0K
LUxpbmVCb3hCdWlsZGVyOjpTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OlNpbXBsaWZpZWRW
ZXJ0aWNhbEFsaWdubWVudChjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgcm9vdElubGlu
ZUJveCkKLSAgICA6IG1fcm9vdElubGluZUJveChyb290SW5saW5lQm94KQotewotICAgIGFkanVz
dChyb290SW5saW5lQm94KTsKLX0KLQotYm9vbCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmllZFZl
cnRpY2FsQWxpZ25tZW50OjpjYW5Vc2VTaW1wbGlmaWVkQWxpZ25tZW50KGNvbnN0IExpbmVCb3g6
OklubGluZUxldmVsQm94JiByb290SW5saW5lQm94LCBjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveCYgaW5saW5lTGV2ZWxCb3gsIE9wdGlvbmFsPGNvbnN0IEJveEdlb21ldHJ5PiBpbmxpbmVM
ZXZlbEJveEdlb21ldHJ5KQotewotICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0F0b21pY0lubGlu
ZUxldmVsQm94KCkpIHsKLSAgICAgICAgQVNTRVJUKGlubGluZUxldmVsQm94R2VvbWV0cnkpOwot
ICAgICAgICAvLyBCYXNlbGluZSBhbGlnbmVkLCBub24tc3RyZXRjaHkgZGlyZWN0IGNoaWxkcmVu
IGFyZSBjb25zaWRlcmVkIHRvIGJlIHNpbXBsZSBmb3Igbm93LgotICAgICAgICBhdXRvJiBsYXlv
dXRCb3ggPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKLSAgICAgICAgcmV0dXJuICZsYXlv
dXRCb3gucGFyZW50KCkgPT0gJnJvb3RJbmxpbmVCb3gubGF5b3V0Qm94KCkKLSAgICAgICAgICAg
ICYmIGxheW91dEJveC5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKSA9PSBWZXJ0aWNhbEFsaWduOjpC
YXNlbGluZQotICAgICAgICAgICAgJiYgIWlubGluZUxldmVsQm94R2VvbWV0cnktPm1hcmdpbkJl
Zm9yZSgpCi0gICAgICAgICAgICAmJiAhaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQWZ0
ZXIoKQotICAgICAgICAgICAgJiYgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQm94SGVp
Z2h0KCkgPD0gcm9vdElubGluZUJveC5iYXNlbGluZSgpOwotICAgIH0KLSAgICBpZiAoaW5saW5l
TGV2ZWxCb3guaXNMaW5lQnJlYWtCb3goKSkgewotICAgICAgICAvLyBCYXNlbGluZSBhbGlnbmVk
LCBub24tc3RyZXRjaHkgbGluZSBicmVha3MgZS5nLiA8ZGl2PjxzcGFuPjxicj48L3NwYW4+PC9k
aXY+IGJ1dCBub3QgPGRpdj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMDBweDsiPjxicj48L3Nw
YW4+PC9kaXY+LgotICAgICAgICByZXR1cm4gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5
bGUoKS52ZXJ0aWNhbEFsaWduKCkgPT0gVmVydGljYWxBbGlnbjo6QmFzZWxpbmUgJiYgaW5saW5l
TGV2ZWxCb3guYmFzZWxpbmUoKSA8PSByb290SW5saW5lQm94LmJhc2VsaW5lKCk7Ci0gICAgfQot
ICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpKSB7Ci0gICAgICAgIC8vIEJhc2Vs
aW5lIGFsaWduZWQsIG5vbi1zdHJldGNoeSBpbmxpbmUgYm94ZXMgZS5nLiA8ZGl2PjxzcGFuPjwv
c3Bhbj48L2Rpdj4gYnV0IG5vdCA8ZGl2PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwMHB4OyI+
PC9zcGFuPjwvZGl2Pi4KLSAgICAgICAgcmV0dXJuIGlubGluZUxldmVsQm94LmxheW91dEJveCgp
LnN0eWxlKCkudmVydGljYWxBbGlnbigpID09IFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lICYmIGlu
bGluZUxldmVsQm94LmxheW91dEJvdW5kcygpID09IHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRz
KCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBMaW5lQm94QnVpbGRlcjo6
U2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50OjphbGlnbihMaW5lQm94OjpJbmxpbmVMZXZlbEJv
eCYgaW5saW5lTGV2ZWxCb3gpCi17Ci0gICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5s
aW5lTGV2ZWxCb3goKSB8fCBpbmxpbmVMZXZlbEJveC5pc0xpbmVCcmVha0JveCgpIHx8IGlubGlu
ZUxldmVsQm94LmlzSW5saW5lQm94KCkpIHsKLSAgICAgICAgLy8gT25seSBiYXNlbGluZSBhbGln
bm1lbnQgZm9yIG5vdy4KLSAgICAgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChtX3Jv
b3RJbmxpbmVCb3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCkpOwotICAg
ICAgICBhZGp1c3QoaW5saW5lTGV2ZWxCb3gpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAg
IEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci19Ci0KLXZvaWQgTGluZUJveEJ1aWxkZXI6
OlNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudDo6YWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGlu
ZUxldmVsQm94JiBpbmxpbmVMZXZlbEJveCkKLXsKLSAgICBhdXRvIGxheW91dEJvdW5kc0xvZ2lj
YWxUb3AgPSBtX3Jvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gaW5saW5lTGV2
ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OwotICAgIG1fbGluZUJveExvZ2ljYWxUb3AgPSBz
dGQ6Om1pbihtX2xpbmVCb3hMb2dpY2FsVG9wLCBsYXlvdXRCb3VuZHNMb2dpY2FsVG9wKTsKLSAg
ICBtX2xpbmVCb3hMb2dpY2FsQm90dG9tID0gc3RkOjptYXgobV9saW5lQm94TG9naWNhbEJvdHRv
bSwgbGF5b3V0Qm91bmRzTG9naWNhbFRvcCArIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygp
LmhlaWdodCgpKTsKLSAgICBtX3Jvb3RJbmxpbmVCb3hMb2dpY2FsVG9wID0gc3RkOjptYXgobV9y
b290SW5saW5lQm94TG9naWNhbFRvcCwgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNj
ZW50IC0gbV9yb290SW5saW5lQm94LmJhc2VsaW5lKCkpOwotfQotCi1MaW5lQm94IElubGluZUZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6bGluZUJveEZvckxpbmVDb250ZW50KGNvbnN0IExp
bmVCdWlsZGVyOjpMaW5lQ29udGVudCYgbGluZUNvbnRlbnQpCi17Ci0gICAgcmV0dXJuIExpbmVC
b3hCdWlsZGVyKGZvcm1hdHRpbmdDb250ZXh0KCkpLmJ1aWxkKGxpbmVDb250ZW50KTsKLX0KLQot
SW5saW5lTGF5b3V0VW5pdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmxvZ2lj
YWxUb3BGb3JOZXh0TGluZShjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250
ZW50LCBJbmxpbmVMYXlvdXRVbml0IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIGNvbnN0IEZs
b2F0aW5nQ29udGV4dCYgZmxvYXRpbmdDb250ZXh0KSBjb25zdAotewotICAgIC8vIE5vcm1hbGx5
IHRoZSBuZXh0IGxpbmUncyBsb2dpY2FsIHRvcCBpcyB0aGUgcHJldmlvdXMgbGluZSdzIGxvZ2lj
YWwgYm90dG9tLCBidXQgd2hlbiB0aGUgbGluZSBlbmRzCi0gICAgLy8gd2l0aCB0aGUgY2xlYXIg
cHJvcGVydHkgc2V0LCB0aGUgbmV4dCBsaW5lIG5lZWRzIHRvIGNsZWFyIHRoZSBleGlzdGluZyBm
bG9hdHMuCi0gICAgaWYgKGxpbmVDb250ZW50LnJ1bnMuaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm4gcHJldmlvdXNMaW5lTG9naWNhbEJvdHRvbTsKLSAgICBhdXRvJiBsYXN0UnVuTGF5b3V0Qm94
ID0gbGluZUNvbnRlbnQucnVucy5sYXN0KCkubGF5b3V0Qm94KCk7IAotICAgIGlmIChsYXN0UnVu
TGF5b3V0Qm94LnN0eWxlKCkuY2xlYXIoKSA9PSBDbGVhcjo6Tm9uZSkKLSAgICAgICAgcmV0dXJu
IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b207Ci0gICAgYXV0byBwb3NpdGlvbldpdGhDbGVhcmFu
Y2UgPSBmbG9hdGluZ0NvbnRleHQudmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UobGFzdFJ1
bkxheW91dEJveCk7Ci0gICAgaWYgKCFwb3NpdGlvbldpdGhDbGVhcmFuY2UpCi0gICAgICAgIHJl
dHVybiBwcmV2aW91c0xpbmVMb2dpY2FsQm90dG9tOwotICAgIHJldHVybiBzdGQ6Om1heChwcmV2
aW91c0xpbmVMb2dpY2FsQm90dG9tLCBJbmxpbmVMYXlvdXRVbml0KHBvc2l0aW9uV2l0aENsZWFy
YW5jZS0+cG9zaXRpb24pKTsKLX0KLQotQ29udGVudFdpZHRoQW5kTWFyZ2luIElubGluZUZvcm1h
dHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRNYXJnaW4o
Y29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZh
bHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGZvcm1hdHRp
bmdDb250ZXh0Um9vdC5pc0luRmxvdygpKTsKLQotICAgIC8vIDEwLjMuMTAgJ0lubGluZS1ibG9j
aycsIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93Ci0KLSAgICAvLyBFeGFjdGx5IGFz
IGlubGluZSByZXBsYWNlZCBlbGVtZW50cy4KLSAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHRSb290
LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgcmV0dXJuIGlubGluZVJlcGxhY2VkQ29udGVudFdp
ZHRoQW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3Qp
LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMp
OwotCi0gICAgLy8gMTAuMy45ICdJbmxpbmUtYmxvY2snLCBub24tcmVwbGFjZWQgZWxlbWVudHMg
aW4gbm9ybWFsIGZsb3cKLQotICAgIC8vIElmICd3aWR0aCcgaXMgJ2F1dG8nLCB0aGUgdXNlZCB2
YWx1ZSBpcyB0aGUgc2hyaW5rLXRvLWZpdCB3aWR0aCBhcyBmb3IgZmxvYXRpbmcgZWxlbWVudHMu
Ci0gICAgLy8gQSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycgZm9yICdtYXJnaW4tbGVmdCcgb3Ig
J21hcmdpbi1yaWdodCcgYmVjb21lcyBhIHVzZWQgdmFsdWUgb2YgJzAnLgotICAgIC8vICMxCi0g
ICAgYXV0byB3aWR0aCA9IGNvbXB1dGVkVmFsdWUoZm9ybWF0dGluZ0NvbnRleHRSb290LnN0eWxl
KCkubG9naWNhbFdpZHRoKCksIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOwot
ICAgIGlmICghd2lkdGgpCi0gICAgICAgIHdpZHRoID0gc2hyaW5rVG9GaXRXaWR0aChmb3JtYXR0
aW5nQ29udGV4dFJvb3QsIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOwotCi0g
ICAgLy8gIzIKLSAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpj
b21wdXRlZEhvcml6b250YWxNYXJnaW4oZm9ybWF0dGluZ0NvbnRleHRSb290LCBob3Jpem9udGFs
Q29uc3RyYWludHMpOwotCi0gICAgcmV0dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7ICp3aWR0
aCwgeyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwX2x1KSwgY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDBfbHUpIH0gfTsKLX0KLQotQ29udGVudEhl
aWdodEFuZE1hcmdpbiBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmlubGluZUJs
b2NrQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRk
ZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAg
IEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7Ci0KLSAgICAvLyAxMC42LjIgSW5saW5lIHJl
cGxhY2VkIGVsZW1lbnRzLCBibG9jay1sZXZlbCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwg
ZmxvdywgJ2lubGluZS1ibG9jaycgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5k
IGZsb2F0aW5nIHJlcGxhY2VkIGVsZW1lbnRzCi0gICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2Vk
Qm94KCkpCi0gICAgICAgIHJldHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJn
aW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50
cywgeyB9LCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwotCi0gICAgLy8gMTAuNi42IENvbXBs
aWNhdGVkIGNhc2VzCi0gICAgLy8gLSAnSW5saW5lLWJsb2NrJywgbm9uLXJlcGxhY2VkIGVsZW1l
bnRzLgotICAgIHJldHVybiBjb21wbGljYXRlZENhc2VzKGxheW91dEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwotfQotCi19Ci19Ci0KLSNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5s
aW5lRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWJlNjVkYWQ1Y2M1ZjU2YjI5ZWIwNzAzZTZjZGM5NDM5
MGFjMmE3Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250
ZXh0UXVpcmtzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
LSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0g
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0
LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUg
IkxheW91dEJveEdlb21ldHJ5LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1JbmxpbmVMYXlvdXRVbml0IElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpRdWly
a3M6OmluaXRpYWxMaW5lSGVpZ2h0KCkgY29uc3QKLXsKLSAgICAvLyBOZWdhdGl2ZSBsaW5lSGVp
Z2h0IHZhbHVlIG1lYW5zIHRoZSBsaW5lLWhlaWdodCBpcyBub3Qgc2V0Ci0gICAgYXV0byYgcm9v
dCA9IGZvcm1hdHRpbmdDb250ZXh0KCkucm9vdCgpOwotICAgIGlmIChsYXlvdXRTdGF0ZSgpLmlu
U3RhbmRhcmRzTW9kZSgpIHx8ICFyb290LnN0eWxlKCkubGluZUhlaWdodCgpLmlzTmVnYXRpdmUo
KSkKLSAgICAgICAgcmV0dXJuIHJvb3Quc3R5bGUoKS5jb21wdXRlZExpbmVIZWlnaHQoKTsKLSAg
ICByZXR1cm4gcm9vdC5zdHlsZSgpLmZvbnRNZXRyaWNzKCkuZmxvYXRIZWlnaHQoKTsKLX0KLQot
Ym9vbCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjppbmxpbmVMZXZlbEJveEFmZmVj
dHNMaW5lQm94KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiBpbmxpbmVMZXZlbEJveCwg
Y29uc3QgTGluZUJveCYgbGluZUJveCkgY29uc3QKLXsKLSAgICBpZiAoaW5saW5lTGV2ZWxCb3gu
aXNMaW5lQnJlYWtCb3goKSkgewotICAgICAgICBpZiAobGF5b3V0U3RhdGUoKS5pblN0YW5kYXJk
c01vZGUoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAvLyBJbiBxdWlya3Mg
bW9kZSBsaW5lYnJlYWsgYm94ZXMgKDxicj4pIHN0b3AgYWZmZWN0aW5nIHRoZSBsaW5lIGJveCB3
aGVuIChhc3N1bWUgPGJyPiBpcyBuZXN0ZWQgZS5nLiA8c3BhbiBzdHlsZT0iZm9udC1zaXplOiAx
MDBweCI+PGJyPjwvc3Bhbj4pCi0gICAgICAgIC8vIDEuIHRoZSByb290IGlubGluZSBib3ggaGFz
IGNvbnRlbnQgPGRpdj5jb250ZW50PGJyPi9kaXY+Ci0gICAgICAgIC8vIDIuIHRoZXJlJ3MgYXQg
bGVhc3Qgb25lIGF0b21pYyBpbmxpbmUgbGV2ZWwgYm94IG9uIHRoZSBsaW5lIGUuZyA8ZGl2Pjxp
bWc+PGJyPjwvZGl2PiBvciA8ZGl2PjxzcGFuPjxpbWc+PC9zcGFuPjxicj48L2Rpdj4KLSAgICAg
ICAgLy8gMy4gdGhlcmUncyBhdCBsZWFzdCBvbmUgaW5saW5lIGJveCB3aXRoIGNvbnRlbnQgZS5n
LiA8ZGl2PjxzcGFuPmNvbnRlbnQ8L3NwYW4+PGJyPjwvZGl2PgotICAgICAgICBpZiAobGluZUJv
eC5yb290SW5saW5lQm94KCkuaGFzQ29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICBpZiAobGluZUJveC5oYXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGVpdGhlciBo
YXZlIG9ubHkgdGhlIDxicj4gb24gdGhlIGxpbmUgb3IgaW5saW5lIGJveGVzIHdpdGggb3Igd2l0
aG91dCBjb250ZW50LgotICAgICAgICBhdXRvJiBpbmxpbmVMZXZlbEJveGVzID0gbGluZUJveC5u
b25Sb290SW5saW5lTGV2ZWxCb3hlcygpOwotICAgICAgICBBU1NFUlQoIWlubGluZUxldmVsQm94
ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgaWYgKGlubGluZUxldmVsQm94ZXMuc2l6ZSgpID09IDEp
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZl
bEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgewotICAgICAgICAgICAg
Ly8gRmlsdGVyIG91dCBlbXB0eSBpbmxpbmUgYm94ZXMgZS5nLiA8ZGl2PjxzcGFuPjwvc3Bhbj48
c3Bhbj48L3NwYW4+PGJyPjwvZGl2PgotICAgICAgICAgICAgaWYgKGlubGluZUxldmVsQm94Lmlz
SW5saW5lQm94KCkgJiYgaW5saW5lTGV2ZWxCb3guaGFzQ29udGVudCgpKQotICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9
Ci0gICAgaWYgKGlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkpIHsKLSAgICAgICAgLy8gSW5s
aW5lIGJveGVzIChlLmcuIHJvb3QgaW5saW5lIGJveCBvciA8c3Bhbj4pIGFmZmVjdHMgbGluZSBi
b3hlcyBlaXRoZXIgdGhyb3VnaCB0aGUgc3RydXQgb3IgYWN0dWFsIGNvbnRlbnQuCi0gICAgICAg
IGF1dG8gaW5saW5lQm94SGFzSW1hZ2luYXJ5U3RydXQgPSBsYXlvdXRTdGF0ZSgpLmluU3RhbmRh
cmRzTW9kZSgpOwotICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3guaGFzQ29udGVudCgpIHx8IGlu
bGluZUJveEhhc0ltYWdpbmFyeVN0cnV0KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
ICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc1Jvb3RJbmxpbmVCb3goKSkgewotICAgICAgICAgICAg
YXV0byBzaG91bGRSb290SW5saW5lQm94V2l0aE5vQ29udGVudFN0cmV0Y2hMaW5lQm94ID0gWyZd
IHsKLSAgICAgICAgICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5bGUo
KS5saW5lSGVpZ2h0KCkuaXNOZWdhdGl2ZSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHJvb3QgaW5saW5lIGJveCB3aXRoIG5vbi1p
bml0aWFsIGxpbmUgaGVpZ2h0IHZhbHVlIHN0cmV0Y2hlcyB0aGUgbGluZSBib3ggZXZlbiB3aGVu
IHJvb3QgaGFzIG5vIGNvbnRlbnQKLSAgICAgICAgICAgICAgICAvLyBidXQgdGhlcmUncyBhdCBs
ZWFzdCBvbmUgaW5saW5lIGJveCB3aXRoIGNvbnRlbnQuCi0gICAgICAgICAgICAgICAgLy8gZS5n
LiA8ZGl2IHN0eWxlPSJsaW5lLWhlaWdodDogMTAwcHg7Ij48c3Bhbj5jb250ZW50PC9zcGFuPjwv
ZGl2PgotICAgICAgICAgICAgICAgIGlmICghbGluZUJveC5oYXNJbmxpbmVCb3goKSkKLSAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byYg
aW5saW5lTGV2ZWxCb3ggOiBsaW5lQm94Lm5vblJvb3RJbmxpbmVMZXZlbEJveGVzKCkpIHsKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKCFpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChp
bmxpbmVMZXZlbEJveC5oYXNDb250ZW50KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHJldHVybiBzaG91bGRSb290SW5saW5lQm94
V2l0aE5vQ29udGVudFN0cmV0Y2hMaW5lQm94KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm9u
LXJvb3QgaW5saW5lIGJveGVzIChlLmcuIDxzcGFuPikuCi0gICAgICAgIGF1dG8mIGJveEdlb21l
dHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVMZXZlbEJveC5s
YXlvdXRCb3goKSk7Ci0gICAgICAgIGlmIChib3hHZW9tZXRyeS5ob3Jpem9udGFsQm9yZGVyKCkg
fHwgYm94R2VvbWV0cnkuaG9yaXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKSB7Ci0gICAg
ICAgICAgICAvLyBIb3Jpem9udGFsIGJvcmRlciBhbmQgcGFkZGluZyBtYWtlIHRoZSBpbmxpbmUg
Ym94IHN0cmV0Y2ggdGhlIGxpbmUgKGUuZy4gPHNwYW4gc3R5bGU9InBhZGRpbmc6IDEwcHg7Ij48
L3NwYW4+KS4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5saW5l
TGV2ZWxCb3goKSkgewotICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCku
aGVpZ2h0KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgLy8gV2hpbGUgaW4g
cHJhY3RpY2Ugd2hlbiB0aGUgbmVnYXRpdmUgdmVydGljYWwgbWFyZ2luIG1ha2VzIHRoZSBsYXlv
dXQgYm91bmRzIGVtcHR5IChlLmc6IGhlaWdodDogMTAwcHg7IG1hcmdpbi10b3A6IC0xMDBweDsp
LCBhbmQgdGhpcyBpbmxpbmUKLSAgICAgICAgLy8gbGV2ZWwgYm94IGNvbnRyaWJ1dGVzIDBweCB0
byB0aGUgbGluZSBib3ggaGVpZ2h0LCBpdCBzdGlsbCBuZWVkcyB0byBiZSB0YWtlbiBpbnRvIGFj
Y291bnQgd2hpbGUgY29tcHV0aW5nIGxpbmUgYm94IGdlb21ldHJpZXMuCi0gICAgICAgIGF1dG8m
IGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVM
ZXZlbEJveC5sYXlvdXRCb3goKSk7Ci0gICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5C
ZWZvcmUoKSB8fCBib3hHZW9tZXRyeS5tYXJnaW5BZnRlcigpOwotICAgIH0KLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KLWJvb2wgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6aGFzU29m
dFdyYXBPcHBvcnR1bml0eUF0SW1hZ2UoKSBjb25zdAotewotICAgIHJldHVybiAhZm9ybWF0dGlu
Z0NvbnRleHQoKS5yb290KCkuaXNUYWJsZUNlbGwoKTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZv
cm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCA4N2I2Yzk1YzE1NDVkNjQ1Y2RiZDRiMDU0NmFlYzE4NmNmM2NjZjVkLi4wMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAKKysrIC9kZXYvbnVsbApA
QCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1
ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRU
SU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1uYW1l
c3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9D
QVRFRF9JTVBMKElubGluZUZvcm1hdHRpbmdTdGF0ZSk7Ci0KLUlubGluZUZvcm1hdHRpbmdTdGF0
ZTo6SW5saW5lRm9ybWF0dGluZ1N0YXRlKFJlZjxGbG9hdGluZ1N0YXRlPiYmIGZsb2F0aW5nU3Rh
dGUsIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKLSAgICA6IEZvcm1hdHRpbmdTdGF0ZShXVEZN
b3ZlKGZsb2F0aW5nU3RhdGUpLCBUeXBlOjpJbmxpbmUsIGxheW91dFN0YXRlKQotewotfQotCi1J
bmxpbmVGb3JtYXR0aW5nU3RhdGU6On5JbmxpbmVGb3JtYXR0aW5nU3RhdGUoKQotewotfQotCi19
Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDM2M2IxNjAzNjg0ZTU5NDAwN2EwODI3YmM5NGNiOTdiNGJhMDE3NGYuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgKKysrIC9k
ZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMK
LSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAq
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICog
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0j
aWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb3JtYXR0
aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJJbmxpbmVJdGVtLmgiCi0jaW5jbHVkZSAiSW5saW5lTGlu
ZUJveC5oIgotI2luY2x1ZGUgIklubGluZUxpbmVHZW9tZXRyeS5oIgotI2luY2x1ZGUgIklubGlu
ZUxpbmVSdW4uaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+Ci0KLW5hbWVzcGFjZSBXZWJD
b3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi11c2luZyBJbmxpbmVJdGVtcyA9IFZlY3RvcjxJ
bmxpbmVJdGVtPjsKLXVzaW5nIElubGluZUxpbmVzID0gVmVjdG9yPElubGluZUxpbmVHZW9tZXRy
eT47Ci11c2luZyBJbmxpbmVMaW5lQm94ZXMgPSBWZWN0b3I8TGluZUJveD47Ci11c2luZyBJbmxp
bmVMaW5lUnVucyA9IFZlY3RvcjxMaW5lUnVuPjsKLQotLy8gSW5saW5lRm9ybWF0dGluZ1N0YXRl
IGhvbGRzIHRoZSBzdGF0ZSBmb3IgYSBwYXJ0aWN1bGFyIGlubGluZSBmb3JtYXR0aW5nIGNvbnRl
eHQgdHJlZS4KLWNsYXNzIElubGluZUZvcm1hdHRpbmdTdGF0ZSA6IHB1YmxpYyBGb3JtYXR0aW5n
U3RhdGUgewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoSW5saW5lRm9ybWF0dGluZ1N0YXRl
KTsKLXB1YmxpYzoKLSAgICBJbmxpbmVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+
JiYsIExheW91dFN0YXRlJik7Ci0gICAgfklubGluZUZvcm1hdHRpbmdTdGF0ZSgpOwotCi0gICAg
SW5saW5lSXRlbXMmIGlubGluZUl0ZW1zKCkgeyByZXR1cm4gbV9pbmxpbmVJdGVtczsgfQotICAg
IGNvbnN0IElubGluZUl0ZW1zJiBpbmxpbmVJdGVtcygpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5l
SXRlbXM7IH0KLSAgICB2b2lkIGFkZElubGluZUl0ZW0oSW5saW5lSXRlbSYmIGlubGluZUl0ZW0p
IHsgbV9pbmxpbmVJdGVtcy5hcHBlbmQoV1RGTW92ZShpbmxpbmVJdGVtKSk7IH0KLQotICAgIGNv
bnN0IElubGluZUxpbmVzJiBsaW5lcygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZXM7IH0KLSAgICBJ
bmxpbmVMaW5lcyYgbGluZXMoKSB7IHJldHVybiBtX2xpbmVzOyB9Ci0gICAgdm9pZCBhZGRMaW5l
KGNvbnN0IElubGluZUxpbmVHZW9tZXRyeSYgbGluZSkgeyBtX2xpbmVzLmFwcGVuZChsaW5lKTsg
fQotCi0gICAgY29uc3QgSW5saW5lTGluZUJveGVzJiBsaW5lQm94ZXMoKSBjb25zdCB7IHJldHVy
biBtX2xpbmVCb3hlczsgfQotICAgIHZvaWQgYWRkTGluZUJveChMaW5lQm94JiYgbGluZUJveCkg
eyBtX2xpbmVCb3hlcy5hcHBlbmQoV1RGTW92ZShsaW5lQm94KSk7IH0KLQotICAgIGNvbnN0IElu
bGluZUxpbmVSdW5zJiBsaW5lUnVucygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZVJ1bnM7IH0KLSAg
ICBJbmxpbmVMaW5lUnVucyYgbGluZVJ1bnMoKSB7IHJldHVybiBtX2xpbmVSdW5zOyB9Ci0gICAg
dm9pZCBhZGRMaW5lUnVuKExpbmVSdW4mJiBydW4pIHsgbV9saW5lUnVucy5hcHBlbmQoV1RGTW92
ZShydW4pKTsgfQotCi0gICAgdm9pZCBzZXRDbGVhckdhcEFmdGVyTGFzdExpbmUoSW5saW5lTGF5
b3V0VW5pdCB2ZXJ0aWNhbEdhcCk7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBjbGVhckdhcEFmdGVy
TGFzdExpbmUoKSBjb25zdCB7IHJldHVybiBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZTsgfQotCi0g
ICAgdm9pZCBjbGVhckxpbmVBbmRSdW5zKCk7Ci0gICAgdm9pZCBzaHJpbmtUb0ZpdCgpOwotCi1w
cml2YXRlOgotICAgIC8vIENhY2hlYWJsZSBpbnB1dCB0byBsaW5lIGxheW91dC4KLSAgICBJbmxp
bmVJdGVtcyBtX2lubGluZUl0ZW1zOwotICAgIElubGluZUxpbmVzIG1fbGluZXM7Ci0gICAgSW5s
aW5lTGluZUJveGVzIG1fbGluZUJveGVzOwotICAgIElubGluZUxpbmVSdW5zIG1fbGluZVJ1bnM7
Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZSB7IDAgfTsKLX07
Ci0KLWlubGluZSB2b2lkIElubGluZUZvcm1hdHRpbmdTdGF0ZTo6c2V0Q2xlYXJHYXBBZnRlckxh
c3RMaW5lKElubGluZUxheW91dFVuaXQgdmVydGljYWxHYXApCi17Ci0gICAgQVNTRVJUKHZlcnRp
Y2FsR2FwID49IDApOwotICAgIG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lID0gdmVydGljYWxHYXA7
Ci19Ci0KLWlubGluZSB2b2lkIElubGluZUZvcm1hdHRpbmdTdGF0ZTo6Y2xlYXJMaW5lQW5kUnVu
cygpCi17Ci0gICAgbV9saW5lcy5jbGVhcigpOwotICAgIG1fbGluZUJveGVzLmNsZWFyKCk7Ci0g
ICAgbV9saW5lUnVucy5jbGVhcigpOwotICAgIG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lID0geyB9
OwotfQotCi1pbmxpbmUgdm9pZCBJbmxpbmVGb3JtYXR0aW5nU3RhdGU6OnNocmlua1RvRml0KCkK
LXsKLSAgICBtX2lubGluZUl0ZW1zLnNocmlua1RvRml0KCk7Ci0gICAgbV9saW5lcy5zaHJpbmtU
b0ZpdCgpOwotICAgIG1fbGluZUJveGVzLnNocmlua1RvRml0KCk7Ci0gICAgbV9saW5lUnVucy5z
aHJpbmtUb0ZpdCgpOwotfQotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VU
X0ZPUk1BVFRJTkdfU1RBVEUoSW5saW5lRm9ybWF0dGluZ1N0YXRlLCBpc0lubGluZUZvcm1hdHRp
bmdTdGF0ZSgpKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZUl0ZW0uY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lSXRlbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDA2MDZmMTg0OWI1YTlhNjE4NDlhMjBlYmQ0MTk2NWE2YWRkOGVjODYuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lSXRlbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MiAr
MCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgot
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGlu
ZUl0ZW0uaCIKLQotI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgiCi0KLSNpZiBFTkFCTEUoTEFZ
T1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNl
IExheW91dCB7Ci0KLXN0cnVjdCBTYW1lU2l6ZUFzSW5saW5lSXRlbSB7Ci0gICAgdm9pZCogbGF5
b3V0Qm94OwotICAgIHVpbnQ4X3QgZW51bTE7Ci0gICAgdWludDhfdCBlbnVtMjsKLSAgICBib29s
IHdpZHRoQm9vbDsKLSAgICBib29sIHNvZnRIeXBoZW5Cb29sOwotICAgIGJvb2wgaXNXb3JkU2Vw
YXJhdG9yOwotICAgIElubGluZUxheW91dFVuaXQgd2lkdGg7Ci0gICAgdW5zaWduZWQgc3RhcnQ7
Ci0gICAgdW5zaWduZWQgbGVuZ3RoOwotfTsKLQotc3RhdGljX2Fzc2VydChzaXplb2YoSW5saW5l
SXRlbSkgPT0gc2l6ZW9mKFNhbWVTaXplQXNJbmxpbmVJdGVtKSwgIiIpOwotCi19Ci19Ci0jZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUl0ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZUl0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhZTI0YTYxMjY4NDU4ODc0
YzcyMDk5NDM4MmJhYjgyOTFkZGM0ZC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVJdGVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0
IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0g
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0g
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3By
YWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2lu
Y2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dFVuaXRzLmgiCi0KLW5hbWVzcGFj
ZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBJbmxpbmVJdGVtIHsKLXB1
YmxpYzoKLSAgICBlbnVtIGNsYXNzIFR5cGUgOiB1aW50OF90IHsgVGV4dCwgSGFyZExpbmVCcmVh
aywgU29mdExpbmVCcmVhaywgV29yZEJyZWFrT3Bwb3J0dW5pdHksIEJveCwgRmxvYXQsIElubGlu
ZUJveFN0YXJ0LCBJbmxpbmVCb3hFbmQgfTsKLSAgICBJbmxpbmVJdGVtKGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBUeXBlKTsKLQotICAgIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsg
fQotICAgIGNvbnN0IEJveCYgbGF5b3V0Qm94KCkgY29uc3QgeyByZXR1cm4gKm1fbGF5b3V0Qm94
OyB9Ci0gICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbGF5b3V0
Qm94KCkuc3R5bGUoKTsgfQotCi0gICAgYm9vbCBpc1RleHQoKSBjb25zdCB7IHJldHVybiB0eXBl
KCkgPT0gVHlwZTo6VGV4dDsgfQotICAgIGJvb2wgaXNCb3goKSBjb25zdCB7IHJldHVybiB0eXBl
KCkgPT0gVHlwZTo6Qm94OyB9Ci0gICAgYm9vbCBpc0Zsb2F0KCkgY29uc3QgeyByZXR1cm4gdHlw
ZSgpID09IFR5cGU6OkZsb2F0OyB9Ci0gICAgYm9vbCBpc0xpbmVCcmVhaygpIGNvbnN0IHsgcmV0
dXJuIGlzU29mdExpbmVCcmVhaygpIHx8IGlzSGFyZExpbmVCcmVhaygpOyB9Ci0gICAgYm9vbCBp
c1dvcmRCcmVha09wcG9ydHVuaXR5KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6Oldv
cmRCcmVha09wcG9ydHVuaXR5OyB9Ci0gICAgYm9vbCBpc1NvZnRMaW5lQnJlYWsoKSBjb25zdCB7
IHJldHVybiB0eXBlKCkgPT0gVHlwZTo6U29mdExpbmVCcmVhazsgfQotICAgIGJvb2wgaXNIYXJk
TGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OkhhcmRMaW5lQnJlYWs7
IH0KLSAgICBib29sIGlzSW5saW5lQm94U3RhcnQoKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0g
VHlwZTo6SW5saW5lQm94U3RhcnQ7IH0KLSAgICBib29sIGlzSW5saW5lQm94RW5kKCkgY29uc3Qg
eyByZXR1cm4gdHlwZSgpID09IFR5cGU6OklubGluZUJveEVuZDsgfQotCi1wcml2YXRlOgotICAg
IGNvbnN0IEJveCogbV9sYXlvdXRCb3ggeyBudWxscHRyIH07Ci0gICAgVHlwZSBtX3R5cGUgeyB9
OwotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gRm9yIElubGluZVRleHRJdGVtCi0gICAgZW51bSBjbGFz
cyBUZXh0SXRlbVR5cGUgIDogdWludDhfdCB7IFVuZGVmaW5lZCwgV2hpdGVzcGFjZSwgTm9uV2hp
dGVzcGFjZSB9OwotICAgIFRleHRJdGVtVHlwZSBtX3RleHRJdGVtVHlwZSB7IFRleHRJdGVtVHlw
ZTo6VW5kZWZpbmVkIH07Ci0gICAgYm9vbCBtX2hhc1dpZHRoIHsgZmFsc2UgfTsKLSAgICBib29s
IG1faGFzVHJhaWxpbmdTb2Z0SHlwaGVuIHsgZmFsc2UgfTsKLSAgICBib29sIG1faXNXb3JkU2Vw
YXJhdG9yIHsgZmFsc2UgfTsKLSAgICBJbmxpbmVMYXlvdXRVbml0IG1fd2lkdGggeyB9OwotICAg
IHVuc2lnbmVkIG1fbGVuZ3RoIHsgMCB9OwotCi0gICAgLy8gRm9yIElubGluZVRleHRJdGVtIGFu
ZCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbQotICAgIHVuc2lnbmVkIG1fc3RhcnRPclBvc2l0aW9u
IHsgMCB9OwotfTsKLQotaW5saW5lIElubGluZUl0ZW06OklubGluZUl0ZW0oY29uc3QgQm94JiBs
YXlvdXRCb3gsIFR5cGUgdHlwZSkKLSAgICA6IG1fbGF5b3V0Qm94KCZsYXlvdXRCb3gpCi0gICAg
LCBtX3R5cGUodHlwZSkKLXsKLX0KLQotI2RlZmluZSBTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0lO
TElORV9JVEVNKFRvVmFsdWVUeXBlTmFtZSwgcHJlZGljYXRlKSBcCi1TUEVDSUFMSVpFX1RZUEVf
VFJBSVRTX0JFR0lOKFdlYkNvcmU6OkxheW91dDo6VG9WYWx1ZVR5cGVOYW1lKSBcCi0gICAgc3Rh
dGljIGJvb2wgaXNUeXBlKGNvbnN0IFdlYkNvcmU6OkxheW91dDo6SW5saW5lSXRlbSYgaW5saW5l
SXRlbSkgeyByZXR1cm4gaW5saW5lSXRlbS5wcmVkaWNhdGU7IH0gXAotU1BFQ0lBTElaRV9UWVBF
X1RSQUlUU19FTkQoKQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUuY3BwIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDViMzM1YmM0MGVlZmM5YzI4MzNkNGQxMzdiNGE1ODQ3ODcwNzUyZmMuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAKKysrIC9kZXYvbnVsbApA
QCAtMSw1MzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFy
ZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNs
dWRlICJJbmxpbmVMaW5lLmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKLQotI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCi0jaW5jbHVkZSAiSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQuaCIKLSNpbmNsdWRlICJJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oIgotI2luY2x1
ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAiUnVudGltZUVuYWJsZWRGZWF0dXJl
cy5oIgotI2luY2x1ZGUgIlRleHRGbGFncy5oIgotI2luY2x1ZGUgIlRleHRVdGlsLmgiCi0jaW5j
bHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFt
ZXNwYWNlIExheW91dCB7Ci0KLUxpbmU6OkxpbmUoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQmIGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQotICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dChpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICAsIG1fdHJpbW1hYmxlVHJhaWxpbmdD
b250ZW50KG1fcnVucykKLXsKLX0KLQotTGluZTo6fkxpbmUoKQotewotfQotCi12b2lkIExpbmU6
OmluaXRpYWxpemUoKQotewotICAgIG1fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50ID0g
MDsKLSAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggPSB7IH07Ci0gICAgbV9ydW5zLmNsZWFyKCk7
Ci0gICAgbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IHsgfTsKLSAgICBtX3RyaW1tYWJsZVRy
YWlsaW5nQ29udGVudC5yZXNldCgpOwotfQotCi12b2lkIExpbmU6OnJlbW92ZUNvbGxhcHNpYmxl
Q29udGVudChJbmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKQotewotICAgIHJl
bW92ZVRyYWlsaW5nVHJpbW1hYmxlQ29udGVudCgpOwotICAgIHZpc3VhbGx5Q29sbGFwc2VQcmVX
cmFwT3ZlcmZsb3dDb250ZW50KGV4dHJhSG9yaXpvbnRhbFNwYWNlKTsKLX0KLQotdm9pZCBMaW5l
OjphcHBseVJ1bkV4cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNl
KQotewotICAgIEFTU0VSVChmb3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKS5zdHlsZSgpLnRleHRB
bGlnbigpID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkpOwotICAgIC8vIFRleHQgaXMganVzdGlm
aWVkIGFjY29yZGluZyB0byB0aGUgbWV0aG9kIHNwZWNpZmllZCBieSB0aGUgdGV4dC1qdXN0aWZ5
IHByb3BlcnR5LAotICAgIC8vIGluIG9yZGVyIHRvIGV4YWN0bHkgZmlsbCB0aGUgbGluZSBib3gu
IFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRleHQtYWxpZ24tbGFzdCwKLSAgICAvLyB0
aGUgbGFzdCBsaW5lIGJlZm9yZSBhIGZvcmNlZCBicmVhayBvciB0aGUgZW5kIG9mIHRoZSBibG9j
ayBpcyBzdGFydC1hbGlnbmVkLgotICAgIGlmIChtX3J1bnMuaXNFbXB0eSgpIHx8IG1fcnVucy5s
YXN0KCkuaXNMaW5lQnJlYWsoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYXV0byBleHBhbnNp
b25PcHBvcnR1bml0eUNvdW50ID0gMDsKLSAgICBSdW4qIGxhc3RSdW5XaXRoQ29udGVudCA9IG51
bGxwdHI7Ci0gICAgLy8gQ29sbGVjdCBhbmQgZGlzdHJpYnV0ZSB0aGUgZXhwYW5zaW9uIG9wcG9y
dHVuaXRpZXMuCi0gICAgZm9yIChhdXRvJiBydW4gOiBtX3J1bnMpIHsKLSAgICAgICAgZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudCArPSBydW4uZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCgpOwot
ICAgICAgICBpZiAocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc0JveCgpKQotICAgICAgICAgICAgbGFz
dFJ1bldpdGhDb250ZW50ID0gJnJ1bjsKLSAgICB9Ci0gICAgLy8gTmVlZCB0byBmaXggdXAgdGhl
IGxhc3QgcnVuJ3MgdHJhaWxpbmcgZXhwYW5zaW9uLgotICAgIGlmIChsYXN0UnVuV2l0aENvbnRl
bnQgJiYgbGFzdFJ1bldpdGhDb250ZW50LT5oYXNFeHBhbnNpb25PcHBvcnR1bml0eSgpKSB7Ci0g
ICAgICAgIC8vIFR1cm4gb2ZmIHRoZSB0cmFpbGluZyBiaXRzIGZpcnN0IGFuZCBhZGQgdGhlIGZv
cmJpZCB0cmFpbGluZyBleHBhbnNpb24uCi0gICAgICAgIGF1dG8gbGVhZGluZ0V4cGFuc2lvbiA9
IGxhc3RSdW5XaXRoQ29udGVudC0+ZXhwYW5zaW9uQmVoYXZpb3IoKSAmIExlZnRFeHBhbnNpb25N
YXNrOwotICAgICAgICBsYXN0UnVuV2l0aENvbnRlbnQtPnNldEV4cGFuc2lvbkJlaGF2aW9yKGxl
YWRpbmdFeHBhbnNpb24gfCBGb3JiaWRSaWdodEV4cGFuc2lvbik7Ci0gICAgfQotICAgIC8vIEFu
eXRoaW5nIHRvIGRpc3RyaWJ1dGU/Ci0gICAgaWYgKCFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50
IHx8ICFleHRyYUhvcml6b250YWxTcGFjZSkKLSAgICAgICAgcmV0dXJuOwotICAgIC8vIERpc3Ry
aWJ1dGUgdGhlIGV4dHJhIHNwYWNlLgotICAgIGF1dG8gZXhwYW5zaW9uVG9EaXN0cmlidXRlID0g
ZXh0cmFIb3Jpem9udGFsU3BhY2UgLyBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50OwotICAgIGF1
dG8gYWNjdW11bGF0ZWRFeHBhbnNpb24gPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAgICBmb3Ig
KGF1dG8mIHJ1biA6IG1fcnVucykgewotICAgICAgICAvLyBFeHBhbmQgYW5kIG1vdmUgcnVucyBi
eSB0aGUgYWNjdW11bGF0ZWQgZXhwYW5zaW9uLgotICAgICAgICBydW4ubW92ZUhvcml6b250YWxs
eShhY2N1bXVsYXRlZEV4cGFuc2lvbik7Ci0gICAgICAgIGlmICghcnVuLmhhc0V4cGFuc2lvbk9w
cG9ydHVuaXR5KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgQVNTRVJUKHJ1bi5l
eHBhbnNpb25PcHBvcnR1bml0eUNvdW50KCkpOwotICAgICAgICBhdXRvIGNvbXB1dGVkRXhwYW5z
aW9uID0gZXhwYW5zaW9uVG9EaXN0cmlidXRlICogcnVuLmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQoKTsKLSAgICAgICAgLy8gRklYTUU6IENoZWNrIHdoeSB3ZSBuZWVkIHRvIHNldCBib3RoLgot
ICAgICAgICBydW4uc2V0SG9yaXpvbnRhbEV4cGFuc2lvbihjb21wdXRlZEV4cGFuc2lvbik7Ci0g
ICAgICAgIHJ1bi5zaHJpbmtIb3Jpem9udGFsbHkoLWNvbXB1dGVkRXhwYW5zaW9uKTsKLSAgICAg
ICAgYWNjdW11bGF0ZWRFeHBhbnNpb24gKz0gY29tcHV0ZWRFeHBhbnNpb247Ci0gICAgfQotICAg
IC8vIENvbnRlbnQgZ3Jvd3MgYXMgcnVucyBleHBhbmQuCi0gICAgbV9jb250ZW50TG9naWNhbFdp
ZHRoICs9IGFjY3VtdWxhdGVkRXhwYW5zaW9uOwotfQotCi12b2lkIExpbmU6OnJlbW92ZVRyYWls
aW5nVHJpbW1hYmxlQ29udGVudCgpCi17Ci0gICAgaWYgKG1fdHJpbW1hYmxlVHJhaWxpbmdDb250
ZW50LmlzRW1wdHkoKSB8fCBtX3J1bnMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICAvLyBDb21wbGV4IGxpbmUgbGF5b3V0IHF1aXJrOiBrZWVwIHRoZSB0cmFpbGluZyB3aGl0ZXNw
YWNlIGFyb3VuZCB3aGVuIGl0IGlzIGZvbGxvd2VkIGJ5IGEgbGluZSBicmVhaywgdW5sZXNzIHRo
ZSBjb250ZW50IG92ZXJmbG93cyB0aGUgbGluZS4KLSAgICBpZiAoUnVudGltZUVuYWJsZWRGZWF0
dXJlczo6c2hhcmVkRmVhdHVyZXMoKS5sYXlvdXRGb3JtYXR0aW5nQ29udGV4dEludGVncmF0aW9u
RW5hYmxlZCgpKSB7Ci0gICAgICAgIGF1dG8gaXNUZXh0QWxpZ25SaWdodCA9IFsmXSB7Ci0gICAg
ICAgICAgICBhdXRvIHRleHRBbGlnbiA9IGZvcm1hdHRpbmdDb250ZXh0KCkucm9vdCgpLnN0eWxl
KCkudGV4dEFsaWduKCk7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dEFsaWduID09IFRleHRBbGln
bk1vZGU6OlJpZ2h0Ci0gICAgICAgICAgICAgICAgfHwgdGV4dEFsaWduID09IFRleHRBbGlnbk1v
ZGU6OldlYktpdFJpZ2h0Ci0gICAgICAgICAgICAgICAgfHwgdGV4dEFsaWduID09IFRleHRBbGln
bk1vZGU6OkVuZDsKLSAgICAgICAgICAgIH0oKTsKLQotICAgICAgICBpZiAobV9ydW5zLmxhc3Qo
KS5pc0xpbmVCcmVhaygpICYmICFpc1RleHRBbGlnblJpZ2h0KSB7Ci0gICAgICAgICAgICBtX3Ry
aW1tYWJsZVRyYWlsaW5nQ29udGVudC5yZXNldCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgbV9jb250ZW50TG9naWNhbFdpZHRoIC09IG1fdHJpbW1hYmxl
VHJhaWxpbmdDb250ZW50LnJlbW92ZSgpOwotfQotCi12b2lkIExpbmU6OnZpc3VhbGx5Q29sbGFw
c2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFs
U3BhY2UpCi17Ci0gICAgQVNTRVJUKG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmlzRW1wdHko
KSk7Ci0gICAgLy8gSWYgd2hpdGUtc3BhY2UgaXMgc2V0IHRvIHByZS13cmFwLCB0aGUgVUEgbXVz
dAotICAgIC8vIC4uLgotICAgIC8vIEl0IG1heSBhbHNvIHZpc3VhbGx5IGNvbGxhcHNlIHRoZSBj
aGFyYWN0ZXIgYWR2YW5jZSB3aWR0aHMgb2YgYW55IHRoYXQgd291bGQgb3RoZXJ3aXNlIG92ZXJm
bG93LgotICAgIGF1dG8gb3ZlcmZsb3dXaWR0aCA9IC1leHRyYUhvcml6b250YWxTcGFjZTsKLSAg
ICBpZiAob3ZlcmZsb3dXaWR0aCA8PSAwKQotICAgICAgICByZXR1cm47Ci0gICAgLy8gTGV0J3Mg
anVzdCBmaW5kIHRoZSB0cmFpbGluZyBwcmUtd3JhcCB3aGl0ZXNwYWNlIGNvbnRlbnQgZm9yIG5v
dyAoZS5nIGNoZWNrIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB0cmFpbGluZyBydW5zIHdpdGgKLSAg
ICAvLyBkaWZmZXJlbnQgc2V0IG9mIHdoaXRlLXNwYWNlIHZhbHVlcyBhbmQgZGVjaWRlIGlmIHRo
ZSBpbi1iZXR3ZWVuIHByZS13cmFwIGNvbnRlbnQgc2hvdWxkIGJlIGNvbGxhcHNlZCBhcyB3ZWxs
LikKLSAgICBJbmxpbmVMYXlvdXRVbml0IHRyaW1tZWRDb250ZW50V2lkdGggPSAwOwotICAgIGZv
ciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShtX3J1bnMpKSB7Ci0gICAgICAg
IGlmIChydW4uc3R5bGUoKS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6UHJlV3JhcCkgewot
ICAgICAgICAgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBwcmUtd3JhcCB0cmFpbGlu
ZyBjb250ZW50LgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYXV0byBw
cmVXcmFwVmlzdWFsbHlDb2xsYXBzaWJsZUlubGluZUl0ZW0gPSBydW4uaXNJbmxpbmVCb3hTdGFy
dCgpIHx8IHJ1bi5pc0lubGluZUJveEVuZCgpIHx8IHJ1bi5oYXNUcmFpbGluZ1doaXRlc3BhY2Uo
KTsKLSAgICAgICAgaWYgKCFwcmVXcmFwVmlzdWFsbHlDb2xsYXBzaWJsZUlubGluZUl0ZW0pCi0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgQVNTRVJUKCFydW4uaGFzQ29sbGFwc2libGVUcmFp
bGluZ1doaXRlc3BhY2UoKSk7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lk
dGggPSB7IH07Ci0gICAgICAgIGlmIChydW4uaXNUZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIEZJ
WE1FOiBXZSBzaG91bGQgYWx3YXlzIGNvbGxhcHNlIHRoZSBydW4gYXQgYSBnbHlwaCBib3VuZGFy
eSBhcyB0aGUgc3BlYyBpbmRpY2F0ZXM6ICJjb2xsYXBzZSB0aGUgY2hhcmFjdGVyIGFkdmFuY2Ug
d2lkdGhzIG9mIGFueSB0aGF0IHdvdWxkIG90aGVyd2lzZSBvdmVyZmxvdyIKLSAgICAgICAgICAg
IC8vIGFuZCB0aGUgdHJpbW1lZCB3aWR0aCBzaG91bGQgYmUgY2FwcGVkIGF0IHN0ZDo6bWluKHJ1
bi50cmFpbGluZ1doaXRlc3BhY2VXaWR0aCgpLCBvdmVyZmxvd1dpZHRoKSBmb3IgdGV4dCBydW5z
LiBCb3RoIEZGIGFuZCBDaHJvbWUgYWdyZWUuCi0gICAgICAgICAgICB0cmltbWFibGVXaWR0aCA9
IHJ1bi50cmFpbGluZ1doaXRlc3BhY2VXaWR0aCgpOwotICAgICAgICAgICAgcnVuLnZpc3VhbGx5
Q29sbGFwc2VUcmFpbGluZ1doaXRlc3BhY2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgIHRyaW1tYWJsZVdpZHRoID0gcnVuLmxvZ2ljYWxXaWR0aCgpOwotICAgICAgICAgICAgcnVu
LnNocmlua0hvcml6b250YWxseSh0cmltbWFibGVXaWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAg
dHJpbW1lZENvbnRlbnRXaWR0aCArPSB0cmltbWFibGVXaWR0aDsKLSAgICAgICAgb3ZlcmZsb3dX
aWR0aCAtPSB0cmltbWFibGVXaWR0aDsKLSAgICAgICAgaWYgKG92ZXJmbG93V2lkdGggPD0gMCkK
LSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggLT0g
dHJpbW1lZENvbnRlbnRXaWR0aDsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmQoY29uc3QgSW5saW5l
SXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAg
aWYgKGlubGluZUl0ZW0uaXNUZXh0KCkpCi0gICAgICAgIGFwcGVuZFRleHRDb250ZW50KGRvd25j
YXN0PElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKSwgbG9naWNhbFdpZHRoKTsKLSAgICBlbHNl
IGlmIChpbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkpCi0gICAgICAgIGFwcGVuZExpbmVCcmVhayhp
bmxpbmVJdGVtKTsKLSAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5p
dHkoKSkKLSAgICAgICAgYXBwZW5kV29yZEJyZWFrT3Bwb3J0dW5pdHkoaW5saW5lSXRlbSk7Ci0g
ICAgZWxzZSBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkpCi0gICAgICAgIGFwcGVu
ZElubGluZUJveFN0YXJ0KGlubGluZUl0ZW0sIGxvZ2ljYWxXaWR0aCk7Ci0gICAgZWxzZSBpZiAo
aW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQotICAgICAgICBhcHBlbmRJbmxpbmVCb3hFbmQo
aW5saW5lSXRlbSwgbG9naWNhbFdpZHRoKTsKLSAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmxheW91
dEJveCgpLmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgYXBwZW5kUmVwbGFjZWRJbmxpbmVMZXZl
bEJveChpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgpOwotICAgIGVsc2UgaWYgKGlubGluZUl0ZW0u
aXNCb3goKSkKLSAgICAgICAgYXBwZW5kTm9uUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJ
dGVtLCBsb2dpY2FsV2lkdGgpOwotICAgIGVsc2UKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7Ci19Ci0KLXZvaWQgTGluZTo6YXBwZW5kTm9uQnJlYWthYmxlU3BhY2UoY29uc3QgSW5saW5l
SXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0s
IGxvZ2ljYWxMZWZ0LCBsb2dpY2FsV2lkdGggfSk7Ci0gICAgbV9jb250ZW50TG9naWNhbFdpZHRo
ICs9IGxvZ2ljYWxXaWR0aDsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmRJbmxpbmVCb3hTdGFydChj
b25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0
aCkKLXsKLSAgICAvLyBUaGlzIGlzIHJlYWxseSBqdXN0IGEgcGxhY2Vob2xkZXIgdG8gbWFyayB0
aGUgc3RhcnQgb2YgdGhlIGlubGluZSBib3ggPHNwYW4+LgotICAgIGF1dG8mIGJveEdlb21ldHJ5
ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVJdGVtLmxheW91dEJv
eCgpKTsKLSAgICBhdXRvIGFkanVzdGVkUnVuU3RhcnQgPSBjb250ZW50TG9naWNhbFJpZ2h0KCkg
KyBzdGQ6Om1pbihib3hHZW9tZXRyeS5tYXJnaW5TdGFydCgpLCAwX2x1KTsKLSAgICArK21fbm9u
U3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50OwotICAgIGFwcGVuZE5vbkJyZWFrYWJsZVNwYWNl
KGlubGluZUl0ZW0sIGFkanVzdGVkUnVuU3RhcnQsIGxvZ2ljYWxXaWR0aCk7Ci19Ci0KLXZvaWQg
TGluZTo6YXBwZW5kSW5saW5lQm94RW5kKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElu
bGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQotewotICAgIC8vIFRoaXMgaXMgcmVhbGx5IGp1
c3QgYSBwbGFjZWhvbGRlciB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGlubGluZSBib3ggPC9zcGFu
Pi4KLSAgICBhdXRvIHJlbW92ZVRyYWlsaW5nTGV0dGVyU3BhY2luZyA9IFsmXSB7Ci0gICAgICAg
IGlmICghbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuaXNUcmFpbGluZ1J1blBhcnRpYWxseVRy
aW1tYWJsZSgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX2NvbnRlbnRMb2dpY2Fs
V2lkdGggLT0gbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQucmVtb3ZlUGFydGlhbGx5VHJpbW1h
YmxlQ29udGVudCgpOwotICAgIH07Ci0gICAgLy8gUHJldmVudCB0cmFpbGluZyBsZXR0ZXItc3Bh
Y2luZyBmcm9tIHNwaWxsaW5nIG91dCBvZiB0aGUgaW5saW5lIGJveC4KLSAgICAvLyBodHRwczov
L2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jbGV0dGVyLXNwYWNpbmctcHJvcGVydHkgU2Vl
IGV4YW1wbGUgMjEuCi0gICAgcmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7Ci0gICAgYXBw
ZW5kTm9uQnJlYWthYmxlU3BhY2UoaW5saW5lSXRlbSwgY29udGVudExvZ2ljYWxXaWR0aCgpLCBs
b2dpY2FsV2lkdGgpOwotfQotCi12b2lkIExpbmU6OmFwcGVuZFRleHRDb250ZW50KGNvbnN0IElu
bGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lk
dGgpCi17Ci0gICAgYXV0byYgc3R5bGUgPSBpbmxpbmVUZXh0SXRlbS5zdHlsZSgpOwotICAgIGF1
dG8gd2lsbENvbGxhcHNlQ29tcGxldGVseSA9IFsmXSB7Ci0gICAgICAgIGlmIChpbmxpbmVUZXh0
SXRlbS5pc0VtcHR5Q29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAg
IGlmICghaW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpCi0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgIGlmIChJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNB
bmRUYWJzKGlubGluZVRleHRJdGVtKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgLy8gQ2hlY2sgaWYgdGhlIGxhc3QgaXRlbSBpcyBjb2xsYXBzZWQgYXMgd2VsbC4KLSAgICAg
ICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKG1fcnVucykpIHsKLSAg
ICAgICAgICAgIGlmIChydW4uaXNCb3goKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgICAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jd2hp
dGUtc3BhY2UtcGhhc2UtMQotICAgICAgICAgICAgLy8gQW55IGNvbGxhcHNpYmxlIHNwYWNlIGlt
bWVkaWF0ZWx5IGZvbGxvd2luZyBhbm90aGVyIGNvbGxhcHNpYmxlIHNwYWNl4oCUZXZlbiBvbmUg
b3V0c2lkZSB0aGUgYm91bmRhcnkgb2YgdGhlIGlubGluZSBjb250YWluaW5nIHRoYXQgc3BhY2Us
Ci0gICAgICAgICAgICAvLyBwcm92aWRlZCBib3RoIHNwYWNlcyBhcmUgd2l0aGluIHRoZSBzYW1l
IGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHTigJRpcyBjb2xsYXBzZWQgdG8gaGF2ZSB6ZXJvIGFk
dmFuY2Ugd2lkdGguCi0gICAgICAgICAgICAvLyA6ICI8c3Bhbj4gIDwvc3Bhbj4gIiA8LSB0aGUg
dHJhaWxpbmcgd2hpdGVzcGFjZSBjb2xsYXBzZXMgY29tcGxldGVseS4KLSAgICAgICAgICAgIC8v
IE5vdCB0aGF0IHdoZW4gdGhlIGlubGluZSBib3ggaGFzIHByZXNlcnZlIHdoaXRlc3BhY2Ugc3R5
bGUsICI8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IHByZSI+ICA8L3NwYW4+ICIgPC0gdGhpcyB3
aGl0ZXNwYWNlIHN0YXlzIGFyb3VuZC4KLSAgICAgICAgICAgIGlmIChydW4uaXNUZXh0KCkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIHJ1bi5oYXNDb2xsYXBzaWJsZVRyYWlsaW5nV2hpdGVzcGFj
ZSgpOwotICAgICAgICAgICAgQVNTRVJUKHJ1bi5pc0lubGluZUJveFN0YXJ0KCkgfHwgcnVuLmlz
SW5saW5lQm94RW5kKCkgfHwgcnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7Ci0gICAgICAg
IH0KLSAgICAgICAgLy8gTGVhZGluZyB3aGl0ZXNwYWNlLgotICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICB9OwotCi0gICAgaWYgKHdpbGxDb2xsYXBzZUNvbXBsZXRlbHkoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgYXV0byBuZWVkc05ld1J1biA9IFsmXSB7Ci0gICAgICAgIGlmIChtX3J1bnMu
aXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGF1dG8mIGxhc3RS
dW4gPSBtX3J1bnMubGFzdCgpOwotICAgICAgICBpZiAoJmxhc3RSdW4ubGF5b3V0Qm94KCkgIT0g
JmlubGluZVRleHRJdGVtLmxheW91dEJveCgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgICAgIGlmICghbGFzdFJ1bi5pc1RleHQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwot
ICAgICAgICBpZiAobGFzdFJ1bi5oYXNDb2xsYXBzZWRUcmFpbGluZ1doaXRlc3BhY2UoKSkKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoaW5saW5lVGV4dEl0ZW0uaXNXb3Jk
U2VwYXJhdG9yKCkgJiYgc3R5bGUuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpKQotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9KCk7Ci0gICAg
YXV0byBvbGRDb250ZW50TG9naWNhbFdpZHRoID0gY29udGVudExvZ2ljYWxXaWR0aCgpOwotICAg
IGlmIChuZWVkc05ld1J1bikgewotICAgICAgICAvLyBOb3RlLCBuZWdhdGl2ZSB3b3JkcyBzcGFj
aW5nIG1heSBjYXVzZSBnbHlwaCBvdmVybGFwLgotICAgICAgICBhdXRvIHJ1bkxvZ2ljYWxMZWZ0
ID0gY29udGVudExvZ2ljYWxSaWdodCgpICsgKGlubGluZVRleHRJdGVtLmlzV29yZFNlcGFyYXRv
cigpID8gc3R5bGUuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpIDogMC4wZik7Ci0gICAgICAg
IG1fcnVucy5hcHBlbmQoeyBpbmxpbmVUZXh0SXRlbSwgcnVuTG9naWNhbExlZnQsIGxvZ2ljYWxX
aWR0aCB9KTsKLSAgICAgICAgbV9jb250ZW50TG9naWNhbFdpZHRoID0gc3RkOjptYXgob2xkQ29u
dGVudExvZ2ljYWxXaWR0aCwgcnVuTG9naWNhbExlZnQgKyBsb2dpY2FsV2lkdGgpOwotICAgIH0g
ZWxzZSB7Ci0gICAgICAgIG1fcnVucy5sYXN0KCkuZXhwYW5kKGlubGluZVRleHRJdGVtLCBsb2dp
Y2FsV2lkdGgpOwotICAgICAgICAvLyBEbyBub3QgbGV0IG5lZ2F0aXZlIGxldHRlciBzcGFjaW5n
IG1ha2UgdGhlIGNvbnRlbnQgc2hvcnRlciB0aGFuIGl0IGFscmVhZHkgaXMuCi0gICAgICAgIG1f
Y29udGVudExvZ2ljYWxXaWR0aCArPSBzdGQ6Om1heCgwLjBmLCBsb2dpY2FsV2lkdGgpOwotICAg
IH0KLSAgICAvLyBTZXQgdGhlIHRyYWlsaW5nIHRyaW1tYWJsZSBjb250ZW50LgotICAgIGlmIChp
bmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFBy
ZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpIHsKLSAgICAgICAgbV90cmltbWFi
bGVUcmFpbGluZ0NvbnRlbnQuYWRkRnVsbHlUcmltbWFibGVDb250ZW50KG1fcnVucy5zaXplKCkg
LSAxLCBjb250ZW50TG9naWNhbFdpZHRoKCkgLSBvbGRDb250ZW50TG9naWNhbFdpZHRoKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBBbnkgbm9uLXdoaXRlc3BhY2UsIG5vLXRyaW1t
YWJsZSBjb250ZW50IHJlc2V0cyB0aGUgZXhpc3RpbmcgdHJpbW1hYmxlLgotICAgIG1fdHJpbW1h
YmxlVHJhaWxpbmdDb250ZW50LnJlc2V0KCk7Ci0gICAgaWYgKCFmb3JtYXR0aW5nQ29udGV4dCgp
LmxheW91dFN0YXRlKCkuc2hvdWxkSWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgJiYgIWlu
bGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpICYmIHN0eWxlLmxldHRlclNwYWNpbmcoKSA+IDAp
Ci0gICAgICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmFkZFBhcnRpYWxseVRyaW1tYWJs
ZUNvbnRlbnQobV9ydW5zLnNpemUoKSAtIDEsIHN0eWxlLmxldHRlclNwYWNpbmcoKSk7Ci0gICAg
bV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IGlubGluZVRleHRJdGVtLmhhc1RyYWlsaW5nU29m
dEh5cGhlbigpID8gbWFrZU9wdGlvbmFsKHN0eWxlLmZvbnRDYXNjYWRlKCkud2lkdGgoVGV4dFJ1
biB7IFN0cmluZ1ZpZXcgeyBzdHlsZS5oeXBoZW5TdHJpbmcoKSB9IH0pKSA6IFdURjo6bnVsbG9w
dDsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmROb25SZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0
IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNh
bFdpZHRoKQotewotICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlc2V0KCk7Ci0gICAg
bV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IHsgfTsKLSAgICBtX2NvbnRlbnRMb2dpY2FsV2lk
dGggKz0gbWFyZ2luQm94TG9naWNhbFdpZHRoOwotICAgICsrbV9ub25TcGFubmluZ0lubGluZUxl
dmVsQm94Q291bnQ7Ci0gICAgYXV0byBtYXJnaW5TdGFydCA9IGZvcm1hdHRpbmdDb250ZXh0KCku
Z2VvbWV0cnlGb3JCb3goaW5saW5lSXRlbS5sYXlvdXRCb3goKSkubWFyZ2luU3RhcnQoKTsKLSAg
ICBpZiAobWFyZ2luU3RhcnQgPj0gMCkgewotICAgICAgICBtX3J1bnMuYXBwZW5kKHsgaW5saW5l
SXRlbSwgY29udGVudExvZ2ljYWxSaWdodCgpLCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGggfSk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gTmVnYXRpdmUgbWFyZ2luLXN0YXJ0IHB1bGxz
IHRoZSBjb250ZW50IHRvIHRoZSBsb2dpY2FsIGxlZnQgZGlyZWN0aW9uLgotICAgIC8vIE5lZ2F0
aXZlIG1hcmdpbiBhbHNvIHNxdWVlemVzIHRoZSBtYXJnaW4gYm94LCB3ZSBuZWVkIHRvIHN0cmV0
Y2ggaXQgdG8gbWFrZSBzdXJlIHRoZSBzdWJzZXF1ZW50IGNvbnRlbnQgd29uJ3Qgb3ZlcmxhcC4K
LSAgICAvLyBlLmcuIDxpbWcgc3R5bGU9IndpZHRoOiAxMDBweDsgbWFyZ2luLWxlZnQ6IC0xMDBw
eDsiPiBwdWxscyB0aGUgcmVwbGFjZWQgYm94IHRvIC0xMDBweCB3aXRoIHRoZSBtYXJnaW4gYm94
IHdpZHRoIG9mIDBweC4KLSAgICAvLyBJbnN0ZWFkIHdlIG5lZWQgdG8gcG9zaXRpb24gaXQgYXQg
LTEwMHB4IGFuZCBzaXplIGl0IHRvIDEwMHB4IHNvIHRoZSBzdWJzZXF1ZW50IGNvbnRlbnQgc3Rh
cnRzIGF0IDBweC4gCi0gICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGNvbnRlbnRMb2dp
Y2FsUmlnaHQoKSArIG1hcmdpblN0YXJ0LCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGggLSBtYXJnaW5T
dGFydCB9KTsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmRSZXBsYWNlZElubGluZUxldmVsQm94KGNv
bnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9n
aWNhbFdpZHRoKQotewotICAgIEFTU0VSVChpbmxpbmVJdGVtLmxheW91dEJveCgpLmlzUmVwbGFj
ZWRCb3goKSk7Ci0gICAgLy8gRklYTUU6IFN1cmVseSByZXBsYWNlZCBib3hlcyBiZWhhdmUgZGlm
ZmVyZW50bHkuCi0gICAgYXBwZW5kTm9uUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVt
LCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGgpOwotfQotCi12b2lkIExpbmU6OmFwcGVuZExpbmVCcmVh
ayhjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQotewotICAgIG1fdHJhaWxpbmdTb2Z0SHlw
aGVuV2lkdGggPSB7IH07Ci0gICAgaWYgKGlubGluZUl0ZW0uaXNIYXJkTGluZUJyZWFrKCkpIHsK
LSAgICAgICAgKyttX25vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudDsKLSAgICAgICAgcmV0
dXJuIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIDBf
bHUgfSk7Ci0gICAgfQotICAgIC8vIFNvZnQgbGluZSBicmVha3MgKHByZXNlcnZlZCBuZXcgbGlu
ZSBjaGFyYWN0ZXJzKSByZXF1aXJlIGlubGluZSB0ZXh0IGJveGVzIGZvciBjb21wYXRpYmlsaXR5
IHJlYXNvbnMuCi0gICAgQVNTRVJUKGlubGluZUl0ZW0uaXNTb2Z0TGluZUJyZWFrKCkpOwotICAg
IG1fcnVucy5hcHBlbmQoeyBkb3duY2FzdDxJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbT4oaW5saW5l
SXRlbSksIGNvbnRlbnRMb2dpY2FsUmlnaHQoKSB9KTsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmRX
b3JkQnJlYWtPcHBvcnR1bml0eShjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQotewotICAg
IG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIDBfbHUg
fSk7Ci19Ci0KLXZvaWQgTGluZTo6YWRkVHJhaWxpbmdIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBo
eXBoZW5Mb2dpY2FsV2lkdGgpCi17Ci0gICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZl
cnNlZFJhbmdlKG1fcnVucykpIHsKLSAgICAgICAgaWYgKCFydW4uaXNUZXh0KCkpCi0gICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgcnVuLnNldE5lZWRzSHlwaGVuKGh5cGhlbkxvZ2ljYWxX
aWR0aCk7Ci0gICAgICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCArPSBoeXBoZW5Mb2dpY2FsV2lk
dGg7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci19
Ci0KLWNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBMaW5lOjpmb3JtYXR0aW5nQ29udGV4
dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Ci19Ci0K
LUxpbmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50
KFJ1bkxpc3QmIHJ1bnMpCi0gICAgOiBtX3J1bnMocnVucykKLXsKLX0KLQotdm9pZCBMaW5lOjpU
cmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OmFkZEZ1bGx5VHJpbW1hYmxlQ29udGVudChzaXplX3Qg
cnVuSW5kZXgsIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpCi17Ci0gICAgLy8gQW55
IHN1YnNlcXVlbnQgdHJpbW1hYmxlIHdoaXRlc3BhY2Ugc2hvdWxkIGNvbGxhcHNlIHRvIHplcm8g
YWR2YW5jZWQgd2lkdGggYW5kIGlnbm9yZWQgYXQgOjphcHBlbmRUZXh0Q29udGVudCgpLgotICAg
IEFTU0VSVCghbV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQpOwotICAgIG1fZnVsbHlUcmltbWFi
bGVXaWR0aCA9IHRyaW1tYWJsZVdpZHRoOwotICAgIC8vIE5vdGUgdGhhdCBqdXN0IGJlY2F1c2Ug
dGhlIHRyaW1tYWJsZSB3aWR0aCBpcyAwIChmb250LXNpemU6IDBweCksIGl0IGRvZXMgbm90IG1l
YW4gd2UgZG9uJ3QgaGF2ZSBhIHRyaW1tYWJsZSB0cmFpbGluZyBjb250ZW50LgotICAgIG1faGFz
RnVsbHlUcmltbWFibGVDb250ZW50ID0gdHJ1ZTsKLSAgICBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5k
ZXggPSBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXgudmFsdWVPcihydW5JbmRleCk7Ci19Ci0KLXZv
aWQgTGluZTo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50OjphZGRQYXJ0aWFsbHlUcmltbWFibGVD
b250ZW50KHNpemVfdCBydW5JbmRleCwgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVXaWR0aCkK
LXsKLSAgICAvLyBEbyBub3QgYWRkIHRyaW1tYWJsZSBsZXR0ZXIgc3BhY2luZyBhZnRlciBhIGZ1
bGx5IHRyaW1tYWJsZSB3aGl0ZXNwYWNlLgotICAgIEFTU0VSVCghbV9maXJzdFRyaW1tYWJsZVJ1
bkluZGV4KTsKLSAgICBBU1NFUlQoIW1faGFzRnVsbHlUcmltbWFibGVDb250ZW50KTsKLSAgICBB
U1NFUlQoIW1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGgpOwotICAgIEFTU0VSVCh0cmltbWFibGVX
aWR0aCk7Ci0gICAgbV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aCA9IHRyaW1tYWJsZVdpZHRoOwot
ICAgIG1fZmlyc3RUcmltbWFibGVSdW5JbmRleCA9IHJ1bkluZGV4OwotfQotCi1JbmxpbmVMYXlv
dXRVbml0IExpbmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6cmVtb3ZlKCkKLXsKLSAgICAv
LyBSZW1vdmUgdHJpbW1hYmxlIHRyYWlsaW5nIGNvbnRlbnQgYW5kIG1vdmUgYWxsIHRoZSBzdWJz
ZXF1ZW50IHRyYWlsaW5nIHJ1bnMuCi0gICAgLy8gPHNwYW4+IDwvc3Bhbj48c3Bhbj48L3NwYW4+
Ci0gICAgLy8gW3RyYWlsaW5nIHdoaXRlc3BhY2VdW2lubGluZSBib3ggZW5kXVtpbmxpbmUgYm94
IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF0KLSAgICAvLyBUcmltIHRoZSB3aGl0ZXNwYWNlIHJ1biBh
bmQgbW92ZSB0aGUgdHJhaWxpbmcgaW5saW5lIGJveCBydW5zIHRvIHRoZSBsb2dpY2FsIGxlZnQu
Ci0gICAgQVNTRVJUKCFpc0VtcHR5KCkpOwotICAgIGF1dG8mIHRyaW1tYWJsZVJ1biA9IG1fcnVu
c1sqbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4XTsKLSAgICBBU1NFUlQodHJpbW1hYmxlUnVuLmlz
VGV4dCgpKTsKLQotICAgIGlmIChtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCkKLSAgICAgICAg
dHJpbW1hYmxlUnVuLnJlbW92ZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwotICAgIGlmIChtX3BhcnRp
YWxseVRyaW1tYWJsZVdpZHRoKQotICAgICAgICB0cmltbWFibGVSdW4ucmVtb3ZlVHJhaWxpbmdM
ZXR0ZXJTcGFjaW5nKCk7Ci0KLSAgICBhdXRvIHRyaW1tYWJsZVdpZHRoID0gd2lkdGgoKTsKLSAg
ICAvLyBXaGVuIHRoZSB0cmltbWFibGUgcnVuIGlzIGZvbGxvd2VkIGJ5IHNvbWUgbm9uLWNvbnRl
bnQgcnVucywgd2UgbmVlZCB0byBhZGp1c3QgdGhlaXIgaG9yaXpvbnRhbCBwb3NpdGlvbnMuCi0g
ICAgLy8gZS5nLiA8ZGl2PnRleHQgaXMgZm9sbG93ZWQgYnkgdHJpbW1hYmxlIGNvbnRlbnQgICAg
PHNwYW4+IDwvc3Bhbj48L2Rpdj4KLSAgICAvLyBXaGVuIHRoZSBbdGV4dC4uLl0gcnVuIGlzIHRy
aW1tZWQgKHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCksIGJvdGggIjxzcGFuPiIgYW5k
ICI8L3NwYW4+IiBydW5zCi0gICAgLy8gbmVlZCB0byBiZSBtb3ZlZCBob3Jpem9udGFsbHkgdG8g
Y2F0Y2ggdXAgd2l0aCB0aGUgW3RleHQuLi5dIHJ1bi4gTm90ZSB0aGF0IHRoZSB3aGl0ZXNwYWNl
IGluc2lkZSB0aGUgPHNwYW4+IGRvZXMKLSAgICAvLyBub3QgcHJvZHVjZSBhIHJ1biBzaW5jZSBp
biA6OmFwcGVuZFRleHQoKSB3ZSBzZWUgaXQgYXMgYSBmdWxseSBjb2xsYXBzaWJsZSBydW4uCi0g
ICAgZm9yIChhdXRvIGluZGV4ID0gKm1fZmlyc3RUcmltbWFibGVSdW5JbmRleCArIDE7IGluZGV4
IDwgbV9ydW5zLnNpemUoKTsgKytpbmRleCkgewotICAgICAgICBhdXRvJiBydW4gPSBtX3J1bnNb
aW5kZXhdOwotICAgICAgICBBU1NFUlQocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSB8fCBy
dW4uaXNJbmxpbmVCb3hTdGFydCgpIHx8IHJ1bi5pc0lubGluZUJveEVuZCgpIHx8IHJ1bi5pc0xp
bmVCcmVhaygpKTsKLSAgICAgICAgcnVuLm1vdmVIb3Jpem9udGFsbHkoLXRyaW1tYWJsZVdpZHRo
KTsKLSAgICB9Ci0gICAgaWYgKCF0cmltbWFibGVSdW4udGV4dENvbnRlbnQoKS0+bGVuZ3RoKCkp
IHsKLSAgICAgICAgLy8gVGhpcyB0cmltbWFibGUgcnVuIGlzIGZ1bGx5IGNvbGxhcHNlZCBub3cg
KGUuZy4gPGRpdj48aW1nPiAgICA8c3Bhbj48L3NwYW4+PC9kaXY+KS4KLSAgICAgICAgLy8gV2Ug
ZG9uJ3QgbmVlZCB0byBrZWVwIGl0IGFyb3VuZCBhbnltb3JlLgotICAgICAgICBtX3J1bnMucmVt
b3ZlKCptX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXgpOwotICAgIH0KLSAgICByZXNldCgpOwotICAg
IHJldHVybiB0cmltbWFibGVXaWR0aDsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBMaW5lOjpUcmlt
bWFibGVUcmFpbGluZ0NvbnRlbnQ6OnJlbW92ZVBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQoKQot
ewotICAgIC8vIFBhcnRpYWxseSB0cmltbWFibGUgY29udGVudCBpcyBhbHdheXMgZ2F0ZWQgYnkg
YSBmdWxseSB0cmltbWFibGUgY29udGVudC4KLSAgICAvLyBXZSBjYW4ndCBqdXN0IHRyaW0gc3Bh
Y2luZyBpbiB0aGUgbWlkZGxlLgotICAgIEFTU0VSVCghbV9mdWxseVRyaW1tYWJsZVdpZHRoKTsK
LSAgICByZXR1cm4gcmVtb3ZlKCk7Ci19Ci0KLUxpbmU6OlJ1bjo6UnVuKGNvbnN0IElubGluZUl0
ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91
dFVuaXQgbG9naWNhbFdpZHRoKQotICAgIDogbV90eXBlKGlubGluZUl0ZW0udHlwZSgpKQotICAg
ICwgbV9sYXlvdXRCb3goJmlubGluZUl0ZW0ubGF5b3V0Qm94KCkpCi0gICAgLCBtX2xvZ2ljYWxM
ZWZ0KGxvZ2ljYWxMZWZ0KQotICAgICwgbV9sb2dpY2FsV2lkdGgobG9naWNhbFdpZHRoKQotewot
fQotCi1MaW5lOjpSdW46OlJ1bihjb25zdCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSYgc29mdExp
bmVCcmVha0l0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQpCi0gICAgOiBtX3R5cGUo
c29mdExpbmVCcmVha0l0ZW0udHlwZSgpKQotICAgICwgbV9sYXlvdXRCb3goJnNvZnRMaW5lQnJl
YWtJdGVtLmxheW91dEJveCgpKQotICAgICwgbV9sb2dpY2FsTGVmdChsb2dpY2FsTGVmdCkKLSAg
ICAsIG1fdGV4dENvbnRlbnQoeyBzb2Z0TGluZUJyZWFrSXRlbS5wb3NpdGlvbigpLCAxLCBzb2Z0
TGluZUJyZWFrSXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpIH0pCi17Ci19Ci0KLUxpbmU6
OlJ1bjo6UnVuKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi0gICAg
OiBtX3R5cGUoSW5saW5lSXRlbTo6VHlwZTo6VGV4dCkKLSAgICAsIG1fbGF5b3V0Qm94KCZpbmxp
bmVUZXh0SXRlbS5sYXlvdXRCb3goKSkKLSAgICAsIG1fbG9naWNhbExlZnQobG9naWNhbExlZnQp
Ci0gICAgLCBtX2xvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGgpCi0gICAgLCBtX3doaXRlc3BhY2VJ
c0V4cGFuc2lvbk9wcG9ydHVuaXR5KCFUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRU
YWJzKGlubGluZVRleHRJdGVtLmxheW91dEJveCgpKSkKLSAgICAsIG1fdHJhaWxpbmdXaGl0ZXNw
YWNlVHlwZSh0cmFpbGluZ1doaXRlc3BhY2VUeXBlKGlubGluZVRleHRJdGVtKSkKLSAgICAsIG1f
dGV4dENvbnRlbnQoeyBpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBtX3RyYWlsaW5nV2hpdGVzcGFj
ZVR5cGUgPT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQgPyAxIDogaW5saW5lVGV4dEl0
ZW0ubGVuZ3RoKCksIGlubGluZVRleHRJdGVtLmlubGluZVRleHRCb3goKS5jb250ZW50KCkgfSkK
LXsKLSAgICBpZiAobV90cmFpbGluZ1doaXRlc3BhY2VUeXBlICE9IFRyYWlsaW5nV2hpdGVzcGFj
ZTo6Tm9uZSkgewotICAgICAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0gbG9naWNhbFdp
ZHRoOwotICAgICAgICBpZiAobV93aGl0ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1bml0eSkKLSAg
ICAgICAgICAgIG1fZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCA9IDE7Ci0gICAgfQotfQotCi12
b2lkIExpbmU6OlJ1bjo6ZXhwYW5kKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRl
bSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMg
aXMgYSB2ZXJ5IHNpbXBsZSBleHBhbnNpb24gbWVyZ2UuIFdlIHNob3VsZCBldmVudHVhbGx5IHN3
aXRjaCBvdmVyIHRvIEZvbnRDYXNjYWRlOjpleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LgotICAg
IEFTU0VSVCghaGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCkpOwotICAgIEFTU0VSVChp
c1RleHQoKSAmJiBpbmxpbmVUZXh0SXRlbS5pc1RleHQoKSk7Ci0gICAgQVNTRVJUKG1fbGF5b3V0
Qm94ID09ICZpbmxpbmVUZXh0SXRlbS5sYXlvdXRCb3goKSk7Ci0KLSAgICBtX2xvZ2ljYWxXaWR0
aCArPSBsb2dpY2FsV2lkdGg7Ci0gICAgbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID0gdHJhaWxp
bmdXaGl0ZXNwYWNlVHlwZShpbmxpbmVUZXh0SXRlbSk7Ci0KLSAgICBpZiAobV90cmFpbGluZ1do
aXRlc3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSkgewotICAgICAgICBtX3Ry
YWlsaW5nV2hpdGVzcGFjZVdpZHRoID0geyB9OwotICAgICAgICBzZXRFeHBhbnNpb25CZWhhdmlv
cihBbGxvd0xlZnRFeHBhbnNpb24gfCBBbGxvd1JpZ2h0RXhwYW5zaW9uKTsKLSAgICAgICAgbV90
ZXh0Q29udGVudC0+ZXhwYW5kKGlubGluZVRleHRJdGVtLmxlbmd0aCgpKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoICs9IGxvZ2ljYWxXaWR0
aDsKLSAgICBpZiAobV93aGl0ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1bml0eSkKLSAgICAgICAg
KyttX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7Ci0gICAgc2V0RXhwYW5zaW9uQmVoYXZpb3Io
RGVmYXVsdEV4cGFuc2lvbik7Ci0gICAgbV90ZXh0Q29udGVudC0+ZXhwYW5kKG1fdHJhaWxpbmdX
aGl0ZXNwYWNlVHlwZSA9PSBUcmFpbGluZ1doaXRlc3BhY2U6OkNvbGxhcHNlZCA/IDEgOiBpbmxp
bmVUZXh0SXRlbS5sZW5ndGgoKSk7Ci19Ci0KLWJvb2wgTGluZTo6UnVuOjpoYXNUcmFpbGluZ0xl
dHRlclNwYWNpbmcoKSBjb25zdAotewotICAgIHJldHVybiAhaGFzVHJhaWxpbmdXaGl0ZXNwYWNl
KCkgJiYgc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCkgPiAwOwotfQotCi1JbmxpbmVMYXlvdXRVbml0
IExpbmU6OlJ1bjo6dHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgY29uc3QKLXsKLSAgICBpZiAoIWhh
c1RyYWlsaW5nTGV0dGVyU3BhY2luZygpKQotICAgICAgICByZXR1cm4geyB9OwotICAgIHJldHVy
biBJbmxpbmVMYXlvdXRVbml0IHsgc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCkgfTsKLX0KLQotdm9p
ZCBMaW5lOjpSdW46OnJlbW92ZVRyYWlsaW5nTGV0dGVyU3BhY2luZygpCi17Ci0gICAgQVNTRVJU
KGhhc1RyYWlsaW5nTGV0dGVyU3BhY2luZygpKTsKLSAgICBzaHJpbmtIb3Jpem9udGFsbHkodHJh
aWxpbmdMZXR0ZXJTcGFjaW5nKCkpOwotICAgIEFTU0VSVChsb2dpY2FsV2lkdGgoKSA+IDAgfHwg
KCFsb2dpY2FsV2lkdGgoKSAmJiBzdHlsZSgpLmxldHRlclNwYWNpbmcoKSA+PSBzdGF0aWNfY2Fz
dDxmbG9hdD4oaW50TWF4Rm9yTGF5b3V0VW5pdCkpKTsKLX0KLQotdm9pZCBMaW5lOjpSdW46OnJl
bW92ZVRyYWlsaW5nV2hpdGVzcGFjZSgpCi17Ci0gICAgLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8v
d3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eSBtYXRyaXgKLSAg
ICAvLyBUcmltbWFibGUgd2hpdGVzcGFjZSBpcyBhbHdheXMgY29sbGFwc2libGUgc28gdGhlIGxl
bmd0aCBvZiB0aGUgdHJhaWxpbmcgdHJpbW1hYmxlIHdoaXRlc3BhY2UgaXMgYWx3YXlzIDEgKG9y
IG5vbi1leGlzdGVudCkuCi0gICAgQVNTRVJUKG1fdGV4dENvbnRlbnQtPmxlbmd0aCgpKTsKLSAg
ICBjb25zdGV4cHIgc2l6ZV90IHRyYWlsaW5nVHJpbW1hYmxlQ29udGVudExlbmd0aCA9IDE7Ci0g
ICAgbV90ZXh0Q29udGVudC0+c2hyaW5rKHRyYWlsaW5nVHJpbW1hYmxlQ29udGVudExlbmd0aCk7
Ci0gICAgdmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwotfQotCi12b2lkIExp
bmU6OlJ1bjo6dmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgpCi17Ci0gICAgLy8g
VGhpcyBpcyBqdXN0IGEgdmlzdWFsIGFkanVzdG1lbnQsIHRoZSB0ZXh0IGxlbmd0aCBzaG91bGQg
cmVtYWluIHRoZSBzYW1lLgotICAgIHNocmlua0hvcml6b250YWxseShtX3RyYWlsaW5nV2hpdGVz
cGFjZVdpZHRoKTsKLSAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0geyB9OwotICAgIG1f
dHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZTsKLQotICAg
IGlmIChtX3doaXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9ydHVuaXR5KSB7Ci0gICAgICAgIEFTU0VS
VChtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpOwotICAgICAgICBtX2V4cGFuc2lvbk9wcG9y
dHVuaXR5Q291bnQtLTsKLSAgICB9Ci0gICAgc2V0RXhwYW5zaW9uQmVoYXZpb3IoQWxsb3dMZWZ0
RXhwYW5zaW9uIHwgQWxsb3dSaWdodEV4cGFuc2lvbik7Ci19Ci0KLXZvaWQgTGluZTo6UnVuOjpz
ZXRFeHBhbnNpb25CZWhhdmlvcihFeHBhbnNpb25CZWhhdmlvciBleHBhbnNpb25CZWhhdmlvcikK
LXsKLSAgICBBU1NFUlQoaXNUZXh0KCkpOwotICAgIG1fZXhwYW5zaW9uLmJlaGF2aW9yID0gZXhw
YW5zaW9uQmVoYXZpb3I7Ci19Ci0KLUV4cGFuc2lvbkJlaGF2aW9yIExpbmU6OlJ1bjo6ZXhwYW5z
aW9uQmVoYXZpb3IoKSBjb25zdAotewotICAgIEFTU0VSVChpc1RleHQoKSk7Ci0gICAgcmV0dXJu
IG1fZXhwYW5zaW9uLmJlaGF2aW9yOwotfQotCi12b2lkIExpbmU6OlJ1bjo6c2V0SG9yaXpvbnRh
bEV4cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxFeHBhbnNpb24pCi17Ci0gICAgQVNT
RVJUKGlzVGV4dCgpKTsKLSAgICBBU1NFUlQoaGFzRXhwYW5zaW9uT3Bwb3J0dW5pdHkoKSk7Ci0g
ICAgbV9leHBhbnNpb24uaG9yaXpvbnRhbEV4cGFuc2lvbiA9IGxvZ2ljYWxFeHBhbnNpb247Ci19
Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5s
aW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5l
Zm9ybWF0dGluZy9JbmxpbmVMaW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZl
MzM1MTk1MjFhYTllNGY5NmE3OTM0YWVkOGMwMzJjYzllNzkzZjUuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lTGluZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAK
LS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElO
R19DT05URVhUKQotCi0jaW5jbHVkZSAiSW5saW5lSXRlbS5oIgotI2luY2x1ZGUgIklubGluZUxp
bmVSdW4uaCIKLSNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgotCi1uYW1lc3BhY2UgV2ViQ29y
ZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7
Ci1jbGFzcyBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbTsKLQotY2xhc3MgTGluZSB7Ci1wdWJsaWM6
Ci0gICAgTGluZShjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYpOwotICAgIH5MaW5lKCk7
Ci0KLSAgICB2b2lkIGluaXRpYWxpemUoKTsKLQotICAgIHZvaWQgYXBwZW5kKGNvbnN0IElubGlu
ZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0KLSAgICBJbmxpbmVMYXlv
dXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRMb2dp
Y2FsV2lkdGg7IH0KLSAgICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsUmlnaHQoKSBj
b25zdCB7IHJldHVybiBtX3J1bnMuaXNFbXB0eSgpID8gMC4wZiA6IG1fcnVucy5sYXN0KCkubG9n
aWNhbFJpZ2h0KCk7IH0KLSAgICBzaXplX3Qgbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50
KCkgY29uc3QgeyByZXR1cm4gbV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQ7IH0KLQot
ICAgIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlVHJhaWxpbmdXaWR0aCgpIGNvbnN0IHsgcmV0
dXJuIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LndpZHRoKCk7IH0KLSAgICBib29sIGlzVHJh
aWxpbmdSdW5GdWxseVRyaW1tYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHJpbW1hYmxlVHJhaWxp
bmdDb250ZW50LmlzVHJhaWxpbmdSdW5GdWxseVRyaW1tYWJsZSgpOyB9Ci0KLSAgICBPcHRpb25h
bDxJbmxpbmVMYXlvdXRVbml0PiB0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpIGNvbnN0IHsgcmV0
dXJuIG1fdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGg7IH0KLSAgICB2b2lkIGFkZFRyYWlsaW5nSHlw
aGVuKElubGluZUxheW91dFVuaXQgaHlwaGVuTG9naWNhbFdpZHRoKTsKLQotICAgIHZvaWQgcmVt
b3ZlQ29sbGFwc2libGVDb250ZW50KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFsU3Bh
Y2UpOwotICAgIHZvaWQgYXBwbHlSdW5FeHBhbnNpb24oSW5saW5lTGF5b3V0VW5pdCBleHRyYUhv
cml6b250YWxTcGFjZSk7Ci0KLSAgICBzdHJ1Y3QgUnVuIHsKLSAgICAgICAgYm9vbCBpc1RleHQo
KSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6VGV4dDsgfQotICAg
ICAgICBib29sIGlzQm94KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5
cGU6OkJveDsgfQotICAgICAgICBib29sIGlzTGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gaXNI
YXJkTGluZUJyZWFrKCkgfHwgaXNTb2Z0TGluZUJyZWFrKCk7IH0KLSAgICAgICAgYm9vbCBpc1Nv
ZnRMaW5lQnJlYWsoKSBjb25zdCAgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5cGU6
OlNvZnRMaW5lQnJlYWs7IH0KLSAgICAgICAgYm9vbCBpc0hhcmRMaW5lQnJlYWsoKSBjb25zdCB7
IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6SGFyZExpbmVCcmVhazsgfQotICAg
ICAgICBib29sIGlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX3R5cGUg
PT0gSW5saW5lSXRlbTo6VHlwZTo6V29yZEJyZWFrT3Bwb3J0dW5pdHk7IH0KLSAgICAgICAgYm9v
bCBpc0lubGluZUJveFN0YXJ0KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06
OlR5cGU6OklubGluZUJveFN0YXJ0OyB9Ci0gICAgICAgIGJvb2wgaXNJbmxpbmVCb3hFbmQoKSBj
b25zdCB7IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94RW5kOyB9
Ci0KLSAgICAgICAgY29uc3QgQm94JiBsYXlvdXRCb3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlv
dXRCb3g7IH0KLSAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKCkgY29uc3QgeyByZXR1
cm4gbV9sYXlvdXRCb3gtPnN0eWxlKCk7IH0KLSAgICAgICAgY29uc3QgT3B0aW9uYWw8TGluZVJ1
bjo6VGV4dD4mIHRleHRDb250ZW50KCkgY29uc3QgeyByZXR1cm4gbV90ZXh0Q29udGVudDsgfQot
Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4g
bV9sb2dpY2FsV2lkdGg7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgp
IGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbExlZnQ7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsUmlnaHQoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsTGVmdCgpICsgbG9naWNhbFdp
ZHRoKCk7IH0KLQotICAgICAgICBjb25zdCBMaW5lUnVuOjpFeHBhbnNpb24mIGV4cGFuc2lvbigp
IGNvbnN0IHsgcmV0dXJuIG1fZXhwYW5zaW9uOyB9Ci0gICAgICAgIGJvb2wgaGFzRXhwYW5zaW9u
T3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7
IH0KLSAgICAgICAgRXhwYW5zaW9uQmVoYXZpb3IgZXhwYW5zaW9uQmVoYXZpb3IoKSBjb25zdDsK
LSAgICAgICAgdW5zaWduZWQgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCgpIGNvbnN0IHsgcmV0
dXJuIG1fZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudDsgfQotCi0gICAgICAgIGJvb2wgaGFzVHJh
aWxpbmdXaGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3BhY2VUeXBl
ICE9IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0
IHRyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRl
c3BhY2VXaWR0aDsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNsYXNzIExpbmU7
Ci0KLSAgICAgICAgUnVuKGNvbnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBs
b2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOwotICAgICAgICBSdW4o
Y29uc3QgSW5saW5lU29mdExpbmVCcmVha0l0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxM
ZWZ0KTsKLSAgICAgICAgUnVuKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxv
Z2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0KLSAgICAgICAgdm9p
ZCBleHBhbmQoY29uc3QgSW5saW5lVGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxX
aWR0aCk7Ci0gICAgICAgIHZvaWQgbW92ZUhvcml6b250YWxseShJbmxpbmVMYXlvdXRVbml0IG9m
ZnNldCkgeyBtX2xvZ2ljYWxMZWZ0ICs9IG9mZnNldDsgfQotICAgICAgICB2b2lkIHNocmlua0hv
cml6b250YWxseShJbmxpbmVMYXlvdXRVbml0IHdpZHRoKSB7IG1fbG9naWNhbFdpZHRoIC09IHdp
ZHRoOyB9Ci0gICAgICAgIHZvaWQgc2V0RXhwYW5zaW9uQmVoYXZpb3IoRXhwYW5zaW9uQmVoYXZp
b3IpOwotICAgICAgICB2b2lkIHNldEhvcml6b250YWxFeHBhbnNpb24oSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsRXhwYW5zaW9uKTsKLSAgICAgICAgdm9pZCBzZXROZWVkc0h5cGhlbihJbmxpbmVM
YXlvdXRVbml0IGh5cGhlbkxvZ2ljYWxXaWR0aCk7Ci0KLSAgICAgICAgZW51bSBjbGFzcyBUcmFp
bGluZ1doaXRlc3BhY2UgewotICAgICAgICAgICAgTm9uZSwKLSAgICAgICAgICAgIE5vdENvbGxh
cHNpYmxlLAotICAgICAgICAgICAgQ29sbGFwc2libGUsCi0gICAgICAgICAgICBDb2xsYXBzZWQK
LSAgICAgICAgfTsKLSAgICAgICAgYm9vbCBoYXNDb2xsYXBzaWJsZVRyYWlsaW5nV2hpdGVzcGFj
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9PSBUcmFpbGluZ1do
aXRlc3BhY2U6OkNvbGxhcHNpYmxlIHx8IGhhc0NvbGxhcHNlZFRyYWlsaW5nV2hpdGVzcGFjZSgp
OyB9Ci0gICAgICAgIGJvb2wgaGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCkgY29uc3Qg
eyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6
Q29sbGFwc2VkOyB9Ci0gICAgICAgIFRyYWlsaW5nV2hpdGVzcGFjZSB0cmFpbGluZ1doaXRlc3Bh
Y2VUeXBlKGNvbnN0IElubGluZVRleHRJdGVtJikgY29uc3Q7Ci0gICAgICAgIHZvaWQgcmVtb3Zl
VHJhaWxpbmdXaGl0ZXNwYWNlKCk7Ci0gICAgICAgIHZvaWQgdmlzdWFsbHlDb2xsYXBzZVRyYWls
aW5nV2hpdGVzcGFjZSgpOwotCi0gICAgICAgIGJvb2wgaGFzVHJhaWxpbmdMZXR0ZXJTcGFjaW5n
KCkgY29uc3Q7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgdHJhaWxpbmdMZXR0ZXJTcGFjaW5n
KCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgcmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7Ci0K
LSAgICAgICAgSW5saW5lSXRlbTo6VHlwZSBtX3R5cGUgeyBJbmxpbmVJdGVtOjpUeXBlOjpUZXh0
IH07Ci0gICAgICAgIGNvbnN0IEJveCogbV9sYXlvdXRCb3ggeyBudWxscHRyIH07Ci0gICAgICAg
IElubGluZUxheW91dFVuaXQgbV9sb2dpY2FsTGVmdCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCBtX2xvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICAgICAgYm9vbCBtX3doaXRlc3BhY2VJ
c0V4cGFuc2lvbk9wcG9ydHVuaXR5IHsgZmFsc2UgfTsKLSAgICAgICAgVHJhaWxpbmdXaGl0ZXNw
YWNlIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSB7IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSB9
OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGggeyAw
IH07Ci0gICAgICAgIE9wdGlvbmFsPExpbmVSdW46OlRleHQ+IG1fdGV4dENvbnRlbnQ7Ci0gICAg
ICAgIExpbmVSdW46OkV4cGFuc2lvbiBtX2V4cGFuc2lvbjsKLSAgICAgICAgdW5zaWduZWQgbV9l
eHBhbnNpb25PcHBvcnR1bml0eUNvdW50IHsgMCB9OwotICAgIH07Ci0gICAgdXNpbmcgUnVuTGlz
dCA9IFZlY3RvcjxSdW4sIDEwPjsKLSAgICBjb25zdCBSdW5MaXN0JiBydW5zKCkgY29uc3QgeyBy
ZXR1cm4gbV9ydW5zOyB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBhcHBlbmROb25CcmVha2FibGVT
cGFjZShjb25zdCBJbmxpbmVJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOwotICAgIHZvaWQgYXBwZW5kVGV4dENvbnRlbnQo
Y29uc3QgSW5saW5lVGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0g
ICAgdm9pZCBhcHBlbmROb25SZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0m
LCBJbmxpbmVMYXlvdXRVbml0IG1hcmdpbkJveExvZ2ljYWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBl
bmRSZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRV
bml0IG1hcmdpbkJveExvZ2ljYWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBlbmRJbmxpbmVCb3hTdGFy
dChjb25zdCBJbmxpbmVJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOwotICAg
IHZvaWQgYXBwZW5kSW5saW5lQm94RW5kKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBlbmRMaW5lQnJlYWsoY29uc3QgSW5saW5l
SXRlbSYpOwotICAgIHZvaWQgYXBwZW5kV29yZEJyZWFrT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5l
SXRlbSYpOwotCi0gICAgdm9pZCByZW1vdmVUcmFpbGluZ1RyaW1tYWJsZUNvbnRlbnQoKTsKLSAg
ICB2b2lkIHZpc3VhbGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KElubGluZUxheW91
dFVuaXQgZXh0cmFIb3Jpem9udGFsU3BhY2UpOwotCi0gICAgY29uc3QgSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3Q7Ci0KLSAgICBzdHJ1Y3QgVHJpbW1h
YmxlVHJhaWxpbmdDb250ZW50IHsKLSAgICAgICAgVHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KFJ1
bkxpc3QmKTsKLQotICAgICAgICB2b2lkIGFkZEZ1bGx5VHJpbW1hYmxlQ29udGVudChzaXplX3Qg
cnVuSW5kZXgsIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpOwotICAgICAgICB2b2lk
IGFkZFBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQoc2l6ZV90IHJ1bkluZGV4LCBJbmxpbmVMYXlv
dXRVbml0IHRyaW1tYWJsZVdpZHRoKTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCByZW1vdmUo
KTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCByZW1vdmVQYXJ0aWFsbHlUcmltbWFibGVDb250
ZW50KCk7Ci0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJu
IG1fZnVsbHlUcmltbWFibGVXaWR0aCArIG1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGg7IH0KLSAg
ICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIW1fZmlyc3RUcmltbWFibGVSdW5J
bmRleC5oYXNWYWx1ZSgpOyB9Ci0gICAgICAgIGJvb2wgaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1h
YmxlKCkgY29uc3QgeyByZXR1cm4gbV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQ7IH0KLSAgICAg
ICAgYm9vbCBpc1RyYWlsaW5nUnVuUGFydGlhbGx5VHJpbW1hYmxlKCkgY29uc3QgeyByZXR1cm4g
bV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aDsgfQotCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLQot
ICAgIHByaXZhdGU6Ci0gICAgICAgIFJ1bkxpc3QmIG1fcnVuczsKLSAgICAgICAgT3B0aW9uYWw8
c2l6ZV90PiBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXg7Ci0gICAgICAgIGJvb2wgbV9oYXNGdWxs
eVRyaW1tYWJsZUNvbnRlbnQgeyBmYWxzZSB9OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1f
ZnVsbHlUcmltbWFibGVXaWR0aCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX3Bh
cnRpYWxseVRyaW1tYWJsZVdpZHRoIHsgMCB9OwotICAgIH07Ci0KLSAgICBjb25zdCBJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCYgbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKLSAgICBSdW5MaXN0
IG1fcnVuczsKLSAgICBUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQgbV90cmltbWFibGVUcmFpbGlu
Z0NvbnRlbnQ7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBtX2NvbnRlbnRMb2dpY2FsV2lkdGggeyAw
IH07Ci0gICAgc2l6ZV90IG1fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50IHsgMCB9Owot
ICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IG1fdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgg
eyAwIH07Ci19OwotCi1pbmxpbmUgdm9pZCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6
OnJlc2V0KCkKLXsKLSAgICBtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCA9IGZhbHNlOwotICAg
IG1fZmlyc3RUcmltbWFibGVSdW5JbmRleCA9IHsgfTsKLSAgICBtX2Z1bGx5VHJpbW1hYmxlV2lk
dGggPSB7IH07Ci0gICAgbV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aCA9IHsgfTsKLX0KLQotaW5s
aW5lIExpbmU6OlJ1bjo6VHJhaWxpbmdXaGl0ZXNwYWNlIExpbmU6OlJ1bjo6dHJhaWxpbmdXaGl0
ZXNwYWNlVHlwZShjb25zdCBJbmxpbmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0ZW0pIGNvbnN0Ci17
Ci0gICAgaWYgKCFpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKLSAgICAgICAgcmV0dXJu
IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZTsKLSAgICBpZiAoSW5saW5lVGV4dEl0ZW06OnNob3Vs
ZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpCi0gICAgICAgIHJldHVybiBU
cmFpbGluZ1doaXRlc3BhY2U6Ok5vdENvbGxhcHNpYmxlOwotICAgIGlmIChpbmxpbmVUZXh0SXRl
bS5sZW5ndGgoKSA9PSAxKQotICAgICAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xs
YXBzaWJsZTsKLSAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQ7Ci19Ci0K
LWlubGluZSB2b2lkIExpbmU6OlJ1bjo6c2V0TmVlZHNIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBo
eXBoZW5Mb2dpY2FsV2lkdGgpCi17Ci0gICAgQVNTRVJUKG1fdGV4dENvbnRlbnQpOwotICAgIG1f
dGV4dENvbnRlbnQtPnNldE5lZWRzSHlwaGVuKCk7Ci0gICAgbV9sb2dpY2FsV2lkdGggKz0gaHlw
aGVuTG9naWNhbFdpZHRoOwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5jcHAKZGVsZXRl
ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjEzYWUwMWNhYTM5NWE3OTg0MjExOGI5OTk3MjMx
ZThkMjBlMjkuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5jcHAK
KysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAy
MCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5lQm94LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VU
X0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0j
aW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi1MaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6SW5saW5lTGV2ZWxC
b3goY29uc3QgQm94JiBsYXlvdXRCb3gsIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElu
bGluZUxheW91dFNpemUgbG9naWNhbFNpemUsIFR5cGUgdHlwZSkKLSAgICA6IG1fbGF5b3V0Qm94
KG1ha2VXZWFrUHRyKGxheW91dEJveCkpCi0gICAgLCBtX2xvZ2ljYWxSZWN0KHsgfSwgbG9naWNh
bExlZnQsIGxvZ2ljYWxTaXplLndpZHRoKCksIGxvZ2ljYWxTaXplLmhlaWdodCgpKQotICAgICwg
bV90eXBlKHR5cGUpCi17Ci19Ci0KLXZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldEJh
c2VsaW5lKElubGluZUxheW91dFVuaXQgYmFzZWxpbmUpCi17Ci0gICAgLy8gRklYTUU6IFJlbW92
ZSBsZWdhY3kgcm91bmRpbmcuCi0gICAgbV9iYXNlbGluZSA9IHJvdW5kVG9JbnQoYmFzZWxpbmUp
OwotfQotCi12b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94OjpzZXREZXNjZW50KElubGluZUxh
eW91dFVuaXQgZGVzY2VudCkKLXsKLSAgICAvLyBGSVhNRTogUmVtb3ZlIGxlZ2FjeSByb3VuZGlu
Zy4KLSAgICBtX2Rlc2NlbnQgPSByb3VuZFRvSW50KGRlc2NlbnQpOwotfQotCi12b2lkIExpbmVC
b3g6OklubGluZUxldmVsQm94OjpzZXRMYXlvdXRCb3VuZHMoY29uc3QgTGF5b3V0Qm91bmRzJiBs
YXlvdXRCb3VuZHMpCi17Ci0gICAgLy8gRklYTUU6IFJlbW92ZSBsZWdhY3kgcm91bmRpbmcuCi0g
ICAgbV9sYXlvdXRCb3VuZHMgPSB7IElubGluZUxheW91dFVuaXQocm91bmRUb0ludChsYXlvdXRC
b3VuZHMuYXNjZW50KSksIElubGluZUxheW91dFVuaXQocm91bmRUb0ludChsYXlvdXRCb3VuZHMu
ZGVzY2VudCkpIH07Ci19Ci0KLXZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldExvZ2lj
YWxUb3AoSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsVG9wKQotewotICAgIC8vIEZJWE1FOiBSZW1v
dmUgbGVnYWN5IHJvdW5kaW5nLgotICAgIG1fbG9naWNhbFJlY3Quc2V0VG9wKHJvdW5kVG9JbnQo
bG9naWNhbFRvcCkpOwotfQotCi12b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94OjpzZXRMb2dp
Y2FsSGVpZ2h0KElubGluZUxheW91dFVuaXQgbG9naWNhbEhlaWdodCkKLXsKLSAgICAvLyBGSVhN
RTogUmVtb3ZlIGxlZ2FjeSByb3VuZGluZy4KLSAgICBtX2xvZ2ljYWxSZWN0LnNldEhlaWdodChy
b3VuZFRvSW50KGxvZ2ljYWxIZWlnaHQpKTsKLX0KLQotdm9pZCBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveDo6c2V0SGFzQ29udGVudCgpCi17Ci0gICAgQVNTRVJUKGlzSW5saW5lQm94KCkpOwotICAg
IG1faGFzQ29udGVudCA9IHRydWU7Ci19Ci0KLWJvb2wgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6
Omhhc0xpbmVCb3hSZWxhdGl2ZUFsaWdubWVudCgpIGNvbnN0Ci17Ci0gICAgYXV0byB2ZXJ0aWNh
bEFsaWdubWVudCA9IGxheW91dEJveCgpLnN0eWxlKCkudmVydGljYWxBbGlnbigpOwotICAgIHJl
dHVybiB2ZXJ0aWNhbEFsaWdubWVudCA9PSBWZXJ0aWNhbEFsaWduOjpUb3AgfHwgdmVydGljYWxB
bGlnbm1lbnQgPT0gVmVydGljYWxBbGlnbjo6Qm90dG9tOwotfQotCi1MaW5lQm94OjpMaW5lQm94
KGNvbnN0IEJveCYgcm9vdExheW91dEJveCwgY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIGxvZ2lj
YWxUb3BsZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxpbmVMb2dpY2FsV2lkdGgsIElubGluZUxheW91
dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2Fs
V2lkdGgsIHNpemVfdCBub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQpCi0gICAgOiBtX2xv
Z2ljYWxSZWN0KGxvZ2ljYWxUb3BsZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgbGluZUxvZ2ljYWxX
aWR0aCwgeyB9IH0pCi0gICAgLCBtX2NvbnRlbnRMb2dpY2FsV2lkdGgoY29udGVudExvZ2ljYWxX
aWR0aCkKLSAgICAsIG1fcm9vdElubGluZUJveChyb290TGF5b3V0Qm94LCBjb250ZW50TG9naWNh
bExlZnQsIElubGluZUxheW91dFNpemUgeyBjb250ZW50TG9naWNhbFdpZHRoLCB7IH0gfSwgSW5s
aW5lTGV2ZWxCb3g6OlR5cGU6OlJvb3RJbmxpbmVCb3gpCi17Ci0gICAgbV9ub25Sb290SW5saW5l
TGV2ZWxCb3hMaXN0LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobm9uU3Bhbm5pbmdJbmxpbmVMZXZl
bEJveENvdW50KTsKLSAgICBtX25vblJvb3RJbmxpbmVMZXZlbEJveE1hcC5yZXNlcnZlSW5pdGlh
bENhcGFjaXR5KG5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCk7Ci19Ci0KLXZvaWQgTGlu
ZUJveDo6YWRkSW5saW5lTGV2ZWxCb3goSW5saW5lTGV2ZWxCb3gmJiBpbmxpbmVMZXZlbEJveCkK
LXsKLSAgICBtX2JveFR5cGVzLmFkZChpbmxpbmVMZXZlbEJveC50eXBlKCkpOwotICAgIG1fbm9u
Um9vdElubGluZUxldmVsQm94TWFwLnNldCgmaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCksIG1f
bm9uUm9vdElubGluZUxldmVsQm94TGlzdC5zaXplKCkpOwotICAgIG1fbm9uUm9vdElubGluZUxl
dmVsQm94TGlzdC5hcHBlbmQoV1RGTW92ZShpbmxpbmVMZXZlbEJveCkpOwotfQotCi1JbmxpbmVS
ZWN0IExpbmVCb3g6OmxvZ2ljYWxSZWN0Rm9yVGV4dFJ1bihjb25zdCBMaW5lOjpSdW4mIHJ1bikg
Y29uc3QKLXsKLSAgICBBU1NFUlQocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc1NvZnRMaW5lQnJlYWso
KSk7Ci0gICAgYXV0byogcGFyZW50SW5saW5lQm94ID0gJmlubGluZUxldmVsQm94Rm9yTGF5b3V0
Qm94KHJ1bi5sYXlvdXRCb3goKS5wYXJlbnQoKSk7Ci0gICAgQVNTRVJUKHBhcmVudElubGluZUJv
eC0+aXNJbmxpbmVCb3goKSk7Ci0gICAgYXV0byYgZm9udE1ldHJpY3MgPSBwYXJlbnRJbmxpbmVC
b3gtPnN0eWxlKCkuZm9udE1ldHJpY3MoKTsKLSAgICBhdXRvIHJ1bmxvZ2ljYWxUb3AgPSBwYXJl
bnRJbmxpbmVCb3gtPmxvZ2ljYWxUb3AoKSArIHBhcmVudElubGluZUJveC0+YmFzZWxpbmUoKSAt
IGZvbnRNZXRyaWNzLmFzY2VudCgpOwotCi0gICAgd2hpbGUgKHBhcmVudElubGluZUJveCAhPSAm
bV9yb290SW5saW5lQm94ICYmICFwYXJlbnRJbmxpbmVCb3gtPmhhc0xpbmVCb3hSZWxhdGl2ZUFs
aWdubWVudCgpKSB7Ci0gICAgICAgIHBhcmVudElubGluZUJveCA9ICZpbmxpbmVMZXZlbEJveEZv
ckxheW91dEJveChwYXJlbnRJbmxpbmVCb3gtPmxheW91dEJveCgpLnBhcmVudCgpKTsKLSAgICAg
ICAgQVNTRVJUKHBhcmVudElubGluZUJveC0+aXNJbmxpbmVCb3goKSk7Ci0gICAgICAgIHJ1bmxv
Z2ljYWxUb3AgKz0gcGFyZW50SW5saW5lQm94LT5sb2dpY2FsVG9wKCk7Ci0gICAgfQotICAgIElu
bGluZUxheW91dFVuaXQgbG9naWNhbEhlaWdodCA9IGZvbnRNZXRyaWNzLmhlaWdodCgpOwotICAg
IHJldHVybiB7IHJ1bmxvZ2ljYWxUb3AsIG1fcm9vdElubGluZUJveC5sb2dpY2FsTGVmdCgpICsg
cnVuLmxvZ2ljYWxMZWZ0KCksIHJ1bi5sb2dpY2FsV2lkdGgoKSwgbG9naWNhbEhlaWdodCB9Owot
fQotCi1JbmxpbmVSZWN0IExpbmVCb3g6OmxvZ2ljYWxSZWN0Rm9yTGluZUJyZWFrQm94KGNvbnN0
IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNMaW5lQnJl
YWtCb3goKSk7Ci0gICAgcmV0dXJuIGxvZ2ljYWxSZWN0Rm9ySW5saW5lTGV2ZWxCb3gobGF5b3V0
Qm94KTsKLX0KLQotSW5saW5lUmVjdCBMaW5lQm94Ojpsb2dpY2FsUmVjdEZvcklubGluZUxldmVs
Qm94KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3gu
aXNJbmxpbmVMZXZlbEJveCgpIHx8IGxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKTsKLSAgICAv
LyBJbmxpbmUgbGV2ZWwgYm94ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZWlyIHBhcmVudCB1bmxlc3Mg
dGhlIHZlcnRpY2FsIGFsaWdubWVudCBtYWtlcyB0aGVtIHJlbGF0aXZlIHRvIHRoZSBsaW5lIGJv
eCAoZS5nLiB0b3AsIGJvdHRvbSkuCi0gICAgYXV0byogaW5saW5lQm94ID0gJmlubGluZUxldmVs
Qm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0gICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmVj
dCA9IGlubGluZUJveC0+bG9naWNhbFJlY3QoKTsKLSAgICBpZiAoaW5saW5lQm94LT5oYXNMaW5l
Qm94UmVsYXRpdmVBbGlnbm1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGlubGluZUJveExvZ2ljYWxS
ZWN0OwotCi0gICAgLy8gRmFzdCBwYXRoIGZvciBpbmxpbmUgbGV2ZWwgYm94ZXMgb24gdGhlIHJv
b3QgaW5saW5lIGJveCAoZS5nIDxkaXY+PGltZz48L2Rpdj4pLgotICAgIGlmICgmbGF5b3V0Qm94
LnBhcmVudCgpID09ICZtX3Jvb3RJbmxpbmVCb3gubGF5b3V0Qm94KCkpIHsKLSAgICAgICAgaW5s
aW5lQm94TG9naWNhbFJlY3QubW92ZVZlcnRpY2FsbHkobV9yb290SW5saW5lQm94LmxvZ2ljYWxU
b3AoKSk7Ci0gICAgICAgIHJldHVybiBpbmxpbmVCb3hMb2dpY2FsUmVjdDsKLSAgICB9Ci0KLSAg
ICAvLyBlLmcgPGRpdj48c3Bhbj48aW1nPjwvc3Bhbj48L2Rpdj4KLSAgICBhdXRvIGlubGluZUJv
eEFic29sdXRlbG9naWNhbFRvcCA9IGlubGluZUJveExvZ2ljYWxSZWN0LnRvcCgpOwotICAgIHdo
aWxlIChpbmxpbmVCb3ggIT0gJm1fcm9vdElubGluZUJveCAmJiAhaW5saW5lQm94LT5oYXNMaW5l
Qm94UmVsYXRpdmVBbGlnbm1lbnQoKSkgewotICAgICAgICBpbmxpbmVCb3ggPSAmaW5saW5lTGV2
ZWxCb3hGb3JMYXlvdXRCb3goaW5saW5lQm94LT5sYXlvdXRCb3goKS5wYXJlbnQoKSk7Ci0gICAg
ICAgIEFTU0VSVChpbmxpbmVCb3gtPmlzSW5saW5lQm94KCkpOwotICAgICAgICBpbmxpbmVCb3hB
YnNvbHV0ZWxvZ2ljYWxUb3AgKz0gaW5saW5lQm94LT5sb2dpY2FsVG9wKCk7Ci0gICAgfQotICAg
IHJldHVybiBJbmxpbmVSZWN0IHsgaW5saW5lQm94QWJzb2x1dGVsb2dpY2FsVG9wLCBpbmxpbmVC
b3hMb2dpY2FsUmVjdC5sZWZ0KCksIGlubGluZUJveExvZ2ljYWxSZWN0LndpZHRoKCksIGlubGlu
ZUJveExvZ2ljYWxSZWN0LmhlaWdodCgpIH07Ci19Ci0KLUlubGluZVJlY3QgTGluZUJveDo6bG9n
aWNhbEJvcmRlckJveEZvckF0b21pY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBjb25zdCBCb3hHZW9tZXRyeSYgYm94R2VvbWV0cnkpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxh
eW91dEJveC5pc0F0b21pY0lubGluZUxldmVsQm94KCkpOwotICAgIGF1dG8gbG9naWNhbFJlY3Qg
PSBsb2dpY2FsUmVjdEZvcklubGluZUxldmVsQm94KGxheW91dEJveCk7Ci0gICAgLy8gSW5saW5l
IGxldmVsIGJveGVzIHVzZSB0aGVpciBtYXJnaW4gYm94IGZvciB2ZXJ0aWNhbCBhbGlnbm1lbnQu
IExldCdzIGNvdmVydCB0aGVtIHRvIGJvcmRlciBib3hlcy4KLSAgICBsb2dpY2FsUmVjdC5tb3Zl
VmVydGljYWxseShib3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUoKSk7Ci0gICAgYXV0byB2ZXJ0aWNh
bE1hcmdpbiA9IGJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpICsgYm94R2VvbWV0cnkubWFyZ2lu
QWZ0ZXIoKTsKLSAgICBsb2dpY2FsUmVjdC5leHBhbmRWZXJ0aWNhbGx5KC12ZXJ0aWNhbE1hcmdp
bik7Ci0gICAgcmV0dXJuIGxvZ2ljYWxSZWN0OwotfQotCi1JbmxpbmVSZWN0IExpbmVCb3g6Omxv
Z2ljYWxCb3JkZXJCb3hGb3JJbmxpbmVCb3goY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEJv
eEdlb21ldHJ5JiBib3hHZW9tZXRyeSkgY29uc3QKLXsKLSAgICBhdXRvIGxvZ2ljYWxSZWN0ID0g
bG9naWNhbFJlY3RGb3JJbmxpbmVMZXZlbEJveChsYXlvdXRCb3gpOwotICAgIC8vIFRoaXMgbG9n
aWNhbCByZWN0IGlzIGFzIHRhbGwgYXMgdGhlICJ0ZXh0IiBjb250ZW50IGlzLiBMZXQncyBhZGp1
c3Qgd2l0aCB2ZXJ0aWNhbCBib3JkZXIgYW5kIHBhZGRpbmcuCi0gICAgYXV0byB2ZXJ0aWNhbEJv
cmRlckFuZFBhZGRpbmcgPSBib3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgYm94R2VvbWV0
cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KTsKLSAgICBsb2dpY2FsUmVjdC5leHBh
bmRWZXJ0aWNhbGx5KHZlcnRpY2FsQm9yZGVyQW5kUGFkZGluZyk7Ci0gICAgbG9naWNhbFJlY3Qu
bW92ZVZlcnRpY2FsbHkoLShib3hHZW9tZXRyeS5ib3JkZXJUb3AoKSArIGJveEdlb21ldHJ5LnBh
ZGRpbmdUb3AoKS52YWx1ZU9yKDBfbHUpKSk7Ci0gICAgcmV0dXJuIGxvZ2ljYWxSZWN0OwotfQot
Ci19IC8vIG5hbWVzcGFjZSBMYXlvdXQKLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKLQotI2VuZGlm
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVMaW5lQm94LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVMaW5lQm94LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MmU5NjYzODM4ZWQz
MmE4ZGRiMTliNWZlYWQyNDY5Nzk5ZjFjMTAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcv
SW5saW5lTGluZUJveC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgot
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
LSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhU
KQotCi0jaW5jbHVkZSAiSW5saW5lTGluZS5oIgotI2luY2x1ZGUgIklubGluZVJlY3QuaCIKLSNp
bmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotI2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYu
aD4KLSNpbmNsdWRlIDx3dGYvV2Vha1B0ci5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1l
c3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgQm94R2VvbWV0cnk7Ci1jbGFzcyBJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dDsKLWNsYXNzIExpbmVCb3hCdWlsZGVyOwotc3RydWN0IFNpbXBsaWZpZWRWZXJ0
aWNhbEFsaWdubWVudDsKLQotLy8gICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX18gTGluZSBCb3gKLS8vIHwgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gfCAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAotLy8gfCAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0t
LS0tLS0gUm9vdCBJbmxpbmUgQm94Ci0vLyB8fCAgIF9fX19fICAgIF9fXyAgICAgIF9fXyAgICAg
ICAgICB8ICAgICAgICAgICAgICAgICAgICB8Ci0vLyB8fCAgfCAgICAgICAgLyAgIFwgICAgLyAg
IFwgICAgICAgICB8ICBJbmxpbmUgTGV2ZWwgQm94ICB8Ci0vLyB8fCAgfF9fX19fICB8ICAgICB8
ICB8ICAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgIGFzY2VudAotLy8gfHwg
IHwgICAgICAgfCAgICAgfCAgfCAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAot
Ly8gfHxfX3xfX19fX19fX1xfX18vX19fX1xfX18vX19fX19fX19ffF9fX19fX19fX19fX19fX19f
X19ffF9fX19fX18gYWxpZ25tZW50X2Jhc2VsaW5lCi0vLyB8fAotLy8gfHwgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW50Ci0vLyB8fF9f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fXwotLy8gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18KLS8vIFRoZSByZXN1bHRpbmcgcmVjdGFuZ3VsYXIgYXJlYSB0aGF0
IGNvbnRhaW5zIHRoZSBib3hlcyB0aGF0IGZvcm0gYSBzaW5nbGUgbGluZSBvZiBpbmxpbmUtbGV2
ZWwgY29udGVudCBpcyBjYWxsZWQgYSBsaW5lIGJveC4KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9U
Ui9jc3MtaW5saW5lLTMvI21vZGVsCi1jbGFzcyBMaW5lQm94IHsKLSAgICBXVEZfTUFLRV9GQVNU
X0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBzdHJ1Y3QgSW5saW5lTGV2ZWxCb3ggewotICAgIHB1
YmxpYzoKLSAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGluZUxldmVsQm94IGNyZWF0ZUlubGlu
ZUJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIHN0YXRpYyBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveCBjcmVhdGVBdG9taWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplKTsKLSAgICAgICAgc3RhdGljIExpbmVC
b3g6OklubGluZUxldmVsQm94IGNyZWF0ZUxpbmVCcmVha0JveChjb25zdCBCb3gmLCBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGluZUxl
dmVsQm94IGNyZWF0ZUdlbmVyaWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxMZWZ0KTsKLQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5l
KCkgY29uc3QgeyByZXR1cm4gbV9iYXNlbGluZTsgfQotICAgICAgICBPcHRpb25hbDxJbmxpbmVM
YXlvdXRVbml0PiBkZXNjZW50KCkgY29uc3QgeyByZXR1cm4gbV9kZXNjZW50OyB9Ci0gICAgICAg
IC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWlubGluZS0zLyNsYXlvdXQtYm91bmRz
Ci0gICAgICAgIHN0cnVjdCBMYXlvdXRCb3VuZHMgewotICAgICAgICAgICAgSW5saW5lTGF5b3V0
VW5pdCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBhc2NlbnQgKyBkZXNjZW50OyB9Ci0gICAgICAg
ICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGF5b3V0Qm91bmRzJiBvdGhlcikgY29uc3QgeyBy
ZXR1cm4gYXNjZW50ID09IG90aGVyLmFzY2VudCAmJiBkZXNjZW50ID09IG90aGVyLmRlc2NlbnQ7
IH0KLQotICAgICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBhc2NlbnQgeyAwIH07Ci0gICAgICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IGRlc2NlbnQgeyAwIH07Ci0gICAgICAgIH07Ci0gICAgICAg
IExheW91dEJvdW5kcyBsYXlvdXRCb3VuZHMoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJvdW5k
czsgfQotCi0gICAgICAgIGJvb2wgaGFzQ29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzQ29u
dGVudDsgfQotICAgICAgICB2b2lkIHNldEhhc0NvbnRlbnQoKTsKLQotICAgICAgICBWZXJ0aWNh
bEFsaWduIHZlcnRpY2FsQWxpZ24oKSBjb25zdCB7IHJldHVybiBsYXlvdXRCb3goKS5zdHlsZSgp
LnZlcnRpY2FsQWxpZ24oKTsgfQotICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0
IHsgcmV0dXJuICptX2xheW91dEJveDsgfQotICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5
bGUoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJveC0+c3R5bGUoKTsgfQotCi0gICAgICAgIGJv
b2wgaXNJbmxpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gVHlwZTo6SW5saW5lQm94
IHx8IG1fdHlwZSA9PSBUeXBlOjpSb290SW5saW5lQm94OyB9Ci0gICAgICAgIGJvb2wgaXNSb290
SW5saW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IFR5cGU6OlJvb3RJbmxpbmVCb3g7
IH0KLSAgICAgICAgYm9vbCBpc0F0b21pY0lubGluZUxldmVsQm94KCkgY29uc3QgeyByZXR1cm4g
bV90eXBlID09IFR5cGU6OkF0b21pY0lubGluZUxldmVsQm94OyB9Ci0gICAgICAgIGJvb2wgaXNM
aW5lQnJlYWtCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gVHlwZTo6TGluZUJyZWFrQm94
OyB9Ci0gICAgICAgIGJvb2wgaGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkgY29uc3Q7Ci0K
LSAgICAgICAgZW51bSBjbGFzcyBUeXBlIDogdWludDhfdCB7Ci0gICAgICAgICAgICBJbmxpbmVC
b3ggICAgICAgICAgICAgPSAxIDw8IDAsCi0gICAgICAgICAgICBSb290SW5saW5lQm94ICAgICAg
ICAgPSAxIDw8IDEsCi0gICAgICAgICAgICBBdG9taWNJbmxpbmVMZXZlbEJveCAgPSAxIDw8IDIs
Ci0gICAgICAgICAgICBMaW5lQnJlYWtCb3ggICAgICAgICAgPSAxIDw8IDMsCi0gICAgICAgICAg
ICBHZW5lcmljSW5saW5lTGV2ZWxCb3ggPSAxIDw8IDQKLSAgICAgICAgfTsKLSAgICAgICAgVHlw
ZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9Ci0KLSAgICAgICAgSW5saW5lTGV2ZWxC
b3goY29uc3QgQm94JiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0
U2l6ZSwgVHlwZSk7Ci0gICAgICAgIElubGluZUxldmVsQm94KCkgPSBkZWZhdWx0OwotCi0gICAg
cHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIHN0cnVjdCBTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1l
bnQ7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBMaW5lQm94QnVpbGRlcjsKLSAgICAgICAgZnJpZW5k
IGNsYXNzIExpbmVCb3g7Ci0KLSAgICAgICAgY29uc3QgSW5saW5lUmVjdCYgbG9naWNhbFJlY3Qo
KSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0OyB9Ci0gICAgICAgIElubGluZUxheW91dFVu
aXQgbG9naWNhbFRvcCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3QudG9wKCk7IH0KLSAg
ICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tKCkgY29uc3QgeyByZXR1cm4gbV9s
b2dpY2FsUmVjdC5ib3R0b20oKTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxM
ZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5sZWZ0KCk7IH0KLSAgICAgICAgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0
LndpZHRoKCk7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KCkgY29u
c3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5oZWlnaHQoKTsgfQotCi0gICAgICAgIHZvaWQgc2V0
TG9naWNhbFdpZHRoKElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKSB7IG1fbG9naWNhbFJl
Y3Quc2V0V2lkdGgobG9naWNhbFdpZHRoKTsgfQotICAgICAgICB2b2lkIHNldExvZ2ljYWxIZWln
aHQoSW5saW5lTGF5b3V0VW5pdCk7Ci0gICAgICAgIHZvaWQgc2V0TG9naWNhbFRvcChJbmxpbmVM
YXlvdXRVbml0KTsKLSAgICAgICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0KTsK
LSAgICAgICAgdm9pZCBzZXREZXNjZW50KElubGluZUxheW91dFVuaXQpOwotICAgICAgICB2b2lk
IHNldExheW91dEJvdW5kcyhjb25zdCBMYXlvdXRCb3VuZHMmKTsKLQotICAgIHByaXZhdGU6Ci0g
ICAgICAgIFdlYWtQdHI8Y29uc3QgQm94PiBtX2xheW91dEJveDsKLSAgICAgICAgLy8gVGhpcyBp
cyB0aGUgY29tYmluYXRpb24gb2YgbWFyZ2luIGFuZCBib3JkZXIgYm94ZXMuIElubGluZSBsZXZl
bCBib3hlcyBhcmUgdmVydGljYWxseSBhbGlnbmVkIHVzaW5nIHRoZWlyIG1hcmdpbiBib3hlcy4K
LSAgICAgICAgSW5saW5lUmVjdCBtX2xvZ2ljYWxSZWN0OwotICAgICAgICBMYXlvdXRCb3VuZHMg
bV9sYXlvdXRCb3VuZHM7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbV9iYXNlbGluZSB7IDAg
fTsKLSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gbV9kZXNjZW50OwotICAgICAg
ICBib29sIG1faGFzQ29udGVudCB7IGZhbHNlIH07Ci0gICAgICAgIFR5cGUgbV90eXBlIHsgVHlw
ZTo6SW5saW5lQm94IH07Ci0gICAgfTsKLQotICAgIExpbmVCb3goY29uc3QgQm94JiByb290TGF5
b3V0Qm94LCBjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgbG9naWNhbFRvcExlZnQsIElubGluZUxh
eW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxpbmVMb2dpY2Fs
V2lkdGgsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCwgc2l6ZV90IG5vblNw
YW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCk7Ci0KLSAgICBjb25zdCBJbmxpbmVSZWN0JiBsb2dp
Y2FsUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3Q7IH0KLSAgICBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxTaXplKCkud2lkdGgo
KTsgfQotICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbEhlaWdodCgpIGNvbnN0IHsgcmV0dXJu
IGxvZ2ljYWxTaXplKCkuaGVpZ2h0KCk7IH0KLSAgICBJbmxpbmVMYXlvdXRQb2ludCBsb2dpY2Fs
VG9wTGVmdCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkudG9wTGVmdCgpOyB9Ci0gICAg
SW5saW5lTGF5b3V0U2l6ZSBsb2dpY2FsU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0
KCkuc2l6ZSgpOyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoKCkg
Y29uc3QgeyByZXR1cm4gbV9jb250ZW50TG9naWNhbFdpZHRoOyB9Ci0KLSAgICAvLyBOb3RlIHRo
YXQgdGhlIGxpbmUgY2FuIGhhdmUgbWFueSBpbmxpbmUgYm94ZXMgYW5kIGJlICJlbXB0eSIgdGhl
IHNhbWUgdGltZSBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2Rpdj4KLSAg
ICBib29sIGhhc0NvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX2hhc0NvbnRlbnQ7IH0KLSAgICBi
b29sIGhhc0lubGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYm94VHlwZXMuY29udGFpbnMoSW5s
aW5lTGV2ZWxCb3g6OlR5cGU6OklubGluZUJveCk7IH0KLSAgICBib29sIGhhc05vbklubGluZUJv
eCgpIGNvbnN0IHsgcmV0dXJuIG1fYm94VHlwZXMuY29udGFpbnNBbnkoeyBJbmxpbmVMZXZlbEJv
eDo6VHlwZTo6QXRvbWljSW5saW5lTGV2ZWxCb3gsIElubGluZUxldmVsQm94OjpUeXBlOjpMaW5l
QnJlYWtCb3gsIElubGluZUxldmVsQm94OjpUeXBlOjpHZW5lcmljSW5saW5lTGV2ZWxCb3ggfSk7
IH0KLSAgICBib29sIGhhc0F0b21pY0lubGluZUxldmVsQm94KCkgY29uc3QgeyByZXR1cm4gbV9i
b3hUeXBlcy5jb250YWlucyhJbmxpbmVMZXZlbEJveDo6VHlwZTo6QXRvbWljSW5saW5lTGV2ZWxC
b3gpOyB9Ci0KLSAgICBjb25zdCBJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3hGb3JMYXlv
dXRCb3goY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8TGlu
ZUJveCY+KCp0aGlzKS5pbmxpbmVMZXZlbEJveEZvckxheW91dEJveChsYXlvdXRCb3gpOyB9Ci0K
LSAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9yVGV4dFJ1bihjb25zdCBMaW5lOjpSdW4mKSBj
b25zdDsKLSAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9yTGluZUJyZWFrQm94KGNvbnN0IEJv
eCYpIGNvbnN0OwotICAgIElubGluZVJlY3QgbG9naWNhbFJlY3RGb3JSb290SW5saW5lQm94KCkg
Y29uc3QgeyByZXR1cm4gbV9yb290SW5saW5lQm94LmxvZ2ljYWxSZWN0KCk7IH0KLSAgICBJbmxp
bmVSZWN0IGxvZ2ljYWxCb3JkZXJCb3hGb3JBdG9taWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gm
LCBjb25zdCBCb3hHZW9tZXRyeSYpIGNvbnN0OwotICAgIElubGluZVJlY3QgbG9naWNhbEJvcmRl
ckJveEZvcklubGluZUJveChjb25zdCBCb3gmLCBjb25zdCBCb3hHZW9tZXRyeSYpIGNvbnN0Owot
Ci0gICAgY29uc3QgSW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3goKSBjb25zdCB7IHJldHVy
biBtX3Jvb3RJbmxpbmVCb3g7IH0KLSAgICB1c2luZyBJbmxpbmVMZXZlbEJveExpc3QgPSBWZWN0
b3I8SW5saW5lTGV2ZWxCb3g+OwotICAgIGNvbnN0IElubGluZUxldmVsQm94TGlzdCYgbm9uUm9v
dElubGluZUxldmVsQm94ZXMoKSBjb25zdCB7IHJldHVybiBtX25vblJvb3RJbmxpbmVMZXZlbEJv
eExpc3Q7IH0KLQotICAgIElubGluZUxheW91dFVuaXQgYWxpZ25tZW50QmFzZWxpbmUoKSBjb25z
dCB7IHJldHVybiBtX3Jvb3RJbmxpbmVCb3gubG9naWNhbFRvcCgpICsgbV9yb290SW5saW5lQm94
LmJhc2VsaW5lKCk7IH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgTGluZUJveEJ1aWxk
ZXI7Ci0KLSAgICB2b2lkIHNldExvZ2ljYWxIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
SGVpZ2h0KSB7IG1fbG9naWNhbFJlY3Quc2V0SGVpZ2h0KGxvZ2ljYWxIZWlnaHQpOyB9Ci0KLSAg
ICB2b2lkIGFkZElubGluZUxldmVsQm94KElubGluZUxldmVsQm94JiYpOwotICAgIElubGluZUxl
dmVsQm94TGlzdCYgbm9uUm9vdElubGluZUxldmVsQm94ZXMoKSB7IHJldHVybiBtX25vblJvb3RJ
bmxpbmVMZXZlbEJveExpc3Q7IH0KLQotICAgIElubGluZUxldmVsQm94JiByb290SW5saW5lQm94
KCkgeyByZXR1cm4gbV9yb290SW5saW5lQm94OyB9Ci0KLSAgICBJbmxpbmVMZXZlbEJveCYgaW5s
aW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3goY29uc3QgQm94JiBsYXlvdXRCb3gpIHsgcmV0dXJuICZs
YXlvdXRCb3ggPT0gJm1fcm9vdElubGluZUJveC5sYXlvdXRCb3goKSA/IG1fcm9vdElubGluZUJv
eCA6IG1fbm9uUm9vdElubGluZUxldmVsQm94TGlzdFttX25vblJvb3RJbmxpbmVMZXZlbEJveE1h
cC5nZXQoJmxheW91dEJveCldOyB9Ci0gICAgSW5saW5lUmVjdCBsb2dpY2FsUmVjdEZvcklubGlu
ZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdDsKLQotICAgIHZvaWQgc2V0SGFz
Q29udGVudChib29sIGhhc0NvbnRlbnQpIHsgbV9oYXNDb250ZW50ID0gaGFzQ29udGVudDsgfQot
Ci1wcml2YXRlOgotICAgIElubGluZVJlY3QgbV9sb2dpY2FsUmVjdDsKLSAgICBJbmxpbmVMYXlv
dXRVbml0IG1fY29udGVudExvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICBib29sIG1faGFzQ29udGVu
dCB7IGZhbHNlIH07Ci0gICAgT3B0aW9uU2V0PElubGluZUxldmVsQm94OjpUeXBlPiBtX2JveFR5
cGVzOwotCi0gICAgSW5saW5lTGV2ZWxCb3ggbV9yb290SW5saW5lQm94OwotICAgIElubGluZUxl
dmVsQm94TGlzdCBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Q7Ci0KLSAgICBIYXNoTWFwPGNv
bnN0IEJveCosIHNpemVfdD4gbV9ub25Sb290SW5saW5lTGV2ZWxCb3hNYXA7Ci19OwotCi1pbmxp
bmUgTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0
ZUF0b21pY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIGxvZ2ljYWxTaXplKQotewotICAgIHJl
dHVybiBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCB7IGxheW91dEJveCwgbG9naWNhbExlZnQsIGxv
Z2ljYWxTaXplLCBUeXBlOjpBdG9taWNJbmxpbmVMZXZlbEJveCB9OwotfQotCi1pbmxpbmUgTGlu
ZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUlubGlu
ZUJveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwg
SW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgcmV0dXJuIExpbmVCb3g6Oklu
bGluZUxldmVsQm94IHsgbGF5b3V0Qm94LCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0U2l6ZSB7
IGxvZ2ljYWxXaWR0aCwgeyB9IH0sIFR5cGU6OklubGluZUJveCB9OwotfQotCi1pbmxpbmUgTGlu
ZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUxpbmVC
cmVha0JveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVm
dCkKLXsKLSAgICByZXR1cm4gTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggeyBsYXlvdXRCb3gsIGxv
Z2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgfSwgVHlwZTo6TGluZUJyZWFrQm94IH07Ci19
Ci0KLWlubGluZSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBMaW5lQm94OjpJbmxpbmVMZXZlbEJv
eDo6Y3JlYXRlR2VuZXJpY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KQotewotICAgIHJldHVybiBMaW5lQm94OjpJbmxpbmVM
ZXZlbEJveCB7IGxheW91dEJveCwgbG9naWNhbExlZnQsIElubGluZUxheW91dFNpemUgeyB9LCBU
eXBlOjpHZW5lcmljSW5saW5lTGV2ZWxCb3ggfTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVC
dWlsZGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZUxpbmVCdWlsZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2MjZlYTBl
ZTVhNjNhNGE5NjJiMTU1Y2U2MTA2NTMwZmNlMjJmMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0
dGluZy9JbmxpbmVMaW5lQnVpbGRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NTcgKzAsMCBA
QAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5l
QnVpbGRlci5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNp
bmNsdWRlICJGbG9hdGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dEJveEdlb21l
dHJ5LmgiCi0jaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKLSNpbmNsdWRlICJUZXh0VXRpbC5oIgot
I2luY2x1ZGUgPHd0Zi91bmljb2RlL0NoYXJhY3Rlck5hbWVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJD
b3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1zdGF0aWMgaW5saW5lIGJvb2wgZW5kc1dpdGhT
b2Z0V3JhcE9wcG9ydHVuaXR5KGNvbnN0IElubGluZVRleHRJdGVtJiBjdXJyZW50VGV4dEl0ZW0s
IGNvbnN0IElubGluZVRleHRJdGVtJiBuZXh0SW5saW5lVGV4dEl0ZW0pCi17Ci0gICAgQVNTRVJU
KCFuZXh0SW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpOwotICAgIC8vIFdlIGFyZSBhdCB0
aGUgcG9zaXRpb24gYWZ0ZXIgYSB3aGl0ZXNwYWNlLgotICAgIGlmIChjdXJyZW50VGV4dEl0ZW0u
aXNXaGl0ZXNwYWNlKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIC8vIFdoZW4gYm90aCB0
aGVzZSBub24td2hpdGVzcGFjZSBydW5zIGJlbG9uZyB0byB0aGUgc2FtZSBsYXlvdXQgYm94LCBp
dCdzIGd1YXJhbnRlZWQgdGhhdAotICAgIC8vIHRoZXkgYXJlIHNwbGl0IGF0IGEgc29mdCBicmVh
a2luZyBvcHBvcnR1bml0eS4gU2VlIElubGluZVRleHRJdGVtOjptb3ZlVG9OZXh0QnJlYWthYmxl
UG9zaXRpb24uCi0gICAgaWYgKCZjdXJyZW50VGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpID09ICZu
ZXh0SW5saW5lVGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICAvLyBOb3cgd2UgbmVlZCB0byBjb2xsZWN0IGF0IGxlYXN0IDMgYWRqYWNlbnQgY2hhcmFj
dGVycyB0byBiZSBhYmxlIHRvIG1ha2UgYSBkZWNpc2lvbiB3aGV0aGVyIHRoZSBwcmV2aW91cyB0
ZXh0IGl0ZW0gZW5kcyB3aXRoIGJyZWFraW5nIG9wcG9ydHVuaXR5LgotICAgIC8vIFtleC1dW2Ft
cGxlXSA8LSBzZWNvbmQgdG8gbGFzdFt4XSBsYXN0Wy1dIGN1cnJlbnRbYV0KLSAgICAvLyBXZSBu
ZWVkIGF0IGxlYXN0IDEgY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IGlubGluZSB0ZXh0IGl0ZW0g
YW5kIDIgbW9yZSBmcm9tIHByZXZpb3VzIGlubGluZSBpdGVtcy4KLSAgICBhdXRvIHByZXZpb3Vz
Q29udGVudCA9IGN1cnJlbnRUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpOwotICAg
IGF1dG8gbGluZUJyZWFrSXRlcmF0b3IgPSBMYXp5TGluZUJyZWFrSXRlcmF0b3IgeyBuZXh0SW5s
aW5lVGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpLmNvbnRlbnQoKSB9OwotICAgIGF1dG8gcHJldmlv
dXNDb250ZW50TGVuZ3RoID0gcHJldmlvdXNDb250ZW50Lmxlbmd0aCgpOwotICAgIC8vIEZJWE1F
OiBXZSBzaG91bGQgbG9vayBpbnRvIHRoZSBlbnRpcmUgdW5jb21taXR0ZWQgY29udGVudCBmb3Ig
bW9yZSB0ZXh0IGNvbnRleHQuCi0gICAgVUNoYXIgbGFzdENoYXJhY3RlciA9IHByZXZpb3VzQ29u
dGVudExlbmd0aCA/IHByZXZpb3VzQ29udGVudFtwcmV2aW91c0NvbnRlbnRMZW5ndGggLSAxXSA6
IDA7Ci0gICAgaWYgKGxhc3RDaGFyYWN0ZXIgPT0gc29mdEh5cGhlbiAmJiBjdXJyZW50VGV4dEl0
ZW0uc3R5bGUoKS5oeXBoZW5zKCkgPT0gSHlwaGVuczo6Tm9uZSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIFVDaGFyIHNlY29uZFRvTGFzdENoYXJhY3RlciA9IHByZXZpb3VzQ29udGVudExl
bmd0aCA+IDEgPyBwcmV2aW91c0NvbnRlbnRbcHJldmlvdXNDb250ZW50TGVuZ3RoIC0gMl0gOiAw
OwotICAgIGxpbmVCcmVha0l0ZXJhdG9yLnNldFByaW9yQ29udGV4dChsYXN0Q2hhcmFjdGVyLCBz
ZWNvbmRUb0xhc3RDaGFyYWN0ZXIpOwotICAgIC8vIE5vdyBjaGVjayBpZiB3ZSBjYW4gYnJlYWsg
cmlnaHQgYXQgdGhlIGlubGluZSBpdGVtIGJvdW5kYXJ5LgotICAgIC8vIFdpdGggdGhlIFtleC1h
bXBsZV0sIGZpbmROZXh0QnJlYWthYmxlUG9zaXRpb24gc2hvdWxkIHJldHVybiB0aGUgc3RhcnRQ
b3NpdGlvbiAoMCkuCi0gICAgLy8gRklYTUU6IENoZWNrIGlmIHRoZXJlJ3MgYSBtb3JlIGNvcnJl
Y3Qgd2F5IG9mIGZpbmRpbmcgYnJlYWtpbmcgb3Bwb3J0dW5pdGllcy4KLSAgICByZXR1cm4gIVRl
eHRVdGlsOjpmaW5kTmV4dEJyZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCAwLCBu
ZXh0SW5saW5lVGV4dEl0ZW0uc3R5bGUoKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0F0
U29mdFdyYXBPcHBvcnR1bml0eShjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQsIGNvbnN0IElubGluZUl0ZW0mIGN1cnJlbnQsIGNvbnN0IElubGlu
ZUl0ZW0mIG5leHQpCi17Ci0gICAgLy8gImlzIGF0IiBzaW1wbGUgbWVhbnMgdGhhdCB0aGVyZSdz
IGEgc29mdCB3cmFwIG9wcG9ydHVuaXR5IHJpZ2h0IGFmdGVyIHRoZSBbY3VycmVudF0uCi0gICAg
Ly8gW3RleHRdWyBdW3RleHRdW2lubGluZSBib3ggc3RhcnRdLi4uICg8ZGl2PnRleHQgY29udGVu
dDxzcGFuPi4uPC9kaXY+KQotICAgIC8vIHNvZnQgd3JhcCBpbmRleGVzOiAwIGFuZCAxIGRlZmlu
aXRlbHksIDIgZGVwZW5kcyBvbiB0aGUgY29udGVudCBhZnRlciB0aGUgW2lubGluZSBib3ggc3Rh
cnRdLgotCi0gICAgLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy10ZXh0LTMvI2xpbmUt
YnJlYWstZGV0YWlscwotICAgIC8vIEZpZ3VyZSBvdXQgaWYgdGhlIG5ldyBpbmNvbWluZyBjb250
ZW50IHB1dHMgdGhlIHVuY29tbWl0dGVkIGNvbnRlbnQgb24gYSBzb2Z0IHdyYXAgb3Bwb3J0dW5p
dHkuCi0gICAgLy8gZS5nLiBbaW5saW5lIGJveCBzdGFydF1bcHJpb3JfY29udGludW91c19jb250
ZW50XVtpbmxpbmUgYm94IGVuZF0gKDxzcGFuPnByaW9yX2NvbnRpbnVvdXNfY29udGVudDwvc3Bh
bj4pCi0gICAgLy8gQW4gaW5jb21pbmcgPGltZz4gYm94IHdvdWxkIGVuYWJsZSB1cyB0byBjb21t
aXQgdGhlICI8c3Bhbj5wcmlvcl9jb250aW51b3VzX2NvbnRlbnQ8L3NwYW4+IiBjb250ZW50Ci0g
ICAgLy8gYnV0IGFuIGluY29taW5nIHRleHQgY29udGVudCB3b3VsZCBub3QgbmVjZXNzYXJpbHku
Ci0gICAgQVNTRVJUKGN1cnJlbnQuaXNUZXh0KCkgfHwgY3VycmVudC5pc0JveCgpIHx8IGN1cnJl
bnQuaXNGbG9hdCgpKTsKLSAgICBBU1NFUlQobmV4dC5pc1RleHQoKSB8fCBuZXh0LmlzQm94KCkg
fHwgbmV4dC5pc0Zsb2F0KCkpOwotICAgIGlmIChjdXJyZW50LmlzVGV4dCgpICYmIG5leHQuaXNU
ZXh0KCkpIHsKLSAgICAgICAgYXV0byYgY3VycmVudElubGluZVRleHRJdGVtID0gZG93bmNhc3Q8
SW5saW5lVGV4dEl0ZW0+KGN1cnJlbnQpOwotICAgICAgICBhdXRvJiBuZXh0SW5saW5lVGV4dEl0
ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4obmV4dCk7Ci0gICAgICAgIGlmIChjdXJyZW50
SW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpIHsKLSAgICAgICAgICAgIC8vIFsgXVt0ZXh0
XSA6IGFmdGVyIFt3aGl0ZXNwYWNlXSBwb3NpdGlvbiBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0
eS4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZXh0
SW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpIHsKLSAgICAgICAgICAgIC8vIFt0ZXh0XVsg
XSAoPHNwYW4+dGV4dDwvc3Bhbj4gKQotICAgICAgICAgICAgLy8gd2hpdGUtc3BhY2U6IGJyZWFr
LXNwYWNlczogbGluZSBicmVha2luZyBvcHBvcnR1bml0eSBleGlzdHMgYWZ0ZXIgZXZlcnkgcHJl
c2VydmVkIHdoaXRlIHNwYWNlIGNoYXJhY3RlciwgYnV0IG5vdCBiZWZvcmUuCi0gICAgICAgICAg
ICByZXR1cm4gbmV4dElubGluZVRleHRJdGVtLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9IFdoaXRl
U3BhY2U6OkJyZWFrU3BhY2VzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50LnN0eWxl
KCkubGluZUJyZWFrKCkgPT0gTGluZUJyZWFrOjpBbnl3aGVyZSB8fCBuZXh0LnN0eWxlKCkubGlu
ZUJyZWFrKCkgPT0gTGluZUJyZWFrOjpBbnl3aGVyZSkgewotICAgICAgICAgICAgLy8gVGhlcmUg
aXMgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgYXJvdW5kIGV2ZXJ5IHR5cG9ncmFwaGljIGNoYXJh
Y3RlciB1bml0LCBpbmNsdWRpbmcgYXJvdW5kIGFueSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIKLSAg
ICAgICAgICAgIC8vIG9yIHByZXNlcnZlZCB3aGl0ZSBzcGFjZXMsIG9yIGluIHRoZSBtaWRkbGUg
b2Ygd29yZHMuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAv
LyBCb3RoIGN1cnJlbnQgYW5kIG5leHQgaXRlbXMgYXJlIG5vbi13aGl0ZXNwYWNlIHRleHQuCi0g
ICAgICAgIC8vIFt0ZXh0XVt0ZXh0XSA6IGlzIGEgY29udGludW91cyBjb250ZW50LgotICAgICAg
ICAvLyBbdGV4dC1dW3RleHRdIDogYWZ0ZXIgW2h5cGhlbl0gcG9zaXRpb24gaXMgYSBzb2Z0IHdy
YXAgb3Bwb3J0dW5pdHkuCi0gICAgICAgIHJldHVybiBlbmRzV2l0aFNvZnRXcmFwT3Bwb3J0dW5p
dHkoY3VycmVudElubGluZVRleHRJdGVtLCBuZXh0SW5saW5lVGV4dEl0ZW0pOwotICAgIH0KLSAg
ICBpZiAoY3VycmVudC5pc0Zsb2F0KCkgfHwgbmV4dC5pc0Zsb2F0KCkpIHsKLSAgICAgICAgLy8g
V2hpbGUgZmxvYXRzIGFyZSBub3QgcGFydCBvZiB0aGUgaW5saW5lIGNvbnRlbnQgYW5kIHRoZXkg
YXJlIG5vdCBzdXBwb3NlZCB0byBpbnRyb2R1Y2Ugc29mdCB3cmFwIG9wcG9ydHVuaXRpZXMsCi0g
ICAgICAgIC8vIGUuZy4gW3RleHRdW2Zsb2F0IGJveF1bZmxvYXQgYm94XVt0ZXh0XVtmbG9hdCBi
b3hdW3RleHRdIGlzIGVzc2VudGlhbGx5IGp1c3QgW3RleHRdW3RleHRdW3RleHRdCi0gICAgICAg
IC8vIGZpZ3VyaW5nIG91dCB3aGV0aGVyIGEgZmxvYXQgKG9yIHNldCBvZiBmbG9hdHMpIHNob3Vs
ZCBzdGF5IG9uIHRoZSBsaW5lIG9yIG5vdCAoYW5kIGhhbmRsZSBwb3RlbnRpYWxseSBvdXQgb2Yg
b3JkZXIgaW5saW5lIGl0ZW1zKQotICAgICAgICAvLyBicmluZ3MgaW4gdW5uZWNlc3NhcnkgY29t
cGxleGl0eS4KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChjdXJyZW50Lmlz
Qm94KCkgfHwgbmV4dC5pc0JveCgpKSB7Ci0gICAgICAgIGF1dG8gaXNJbWFnZUNvbnRlbnQgPSBj
dXJyZW50LmxheW91dEJveCgpLmlzSW1hZ2UoKSB8fCBuZXh0LmxheW91dEJveCgpLmlzSW1hZ2Uo
KTsKLSAgICAgICAgaWYgKGlzSW1hZ2VDb250ZW50KQotICAgICAgICAgICAgcmV0dXJuIGlubGlu
ZUZvcm1hdHRpbmdDb250ZXh0LnF1aXJrcygpLmhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdl
KCk7Ci0gICAgICAgIC8vIFt0ZXh0XVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF1b
aW5saW5lIGJveF0gKHRleHQ8c3Bhbj48L3NwYW4+PGltZz4pIDogdGhlcmUncyBhIHNvZnQgd3Jh
cCBvcHBvcnR1bml0eSBiZXR3ZWVuIHRoZSBbdGV4dF0gYW5kIFtpbWddLgotICAgICAgICAvLyBU
aGUgbGluZSBicmVha2luZyBiZWhhdmlvciBvZiBhIHJlcGxhY2VkIGVsZW1lbnQgb3Igb3RoZXIg
YXRvbWljIGlubGluZSBpcyBlcXVpdmFsZW50IHRvIGFuIGlkZW9ncmFwaGljIGNoYXJhY3Rlci4K
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwot
ICAgIHJldHVybiB0cnVlOwotfQotCi1zdHJ1Y3QgTGluZUNhbmRpZGF0ZSB7Ci0gICAgTGluZUNh
bmRpZGF0ZShib29sIGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZyk7Ci0KLSAgICB2b2lkIHJl
c2V0KCk7Ci0KLSAgICBzdHJ1Y3QgSW5saW5lQ29udGVudCB7Ci0gICAgICAgIElubGluZUNvbnRl
bnQoYm9vbCBpZ25vcmVUcmFpbGluZ0xldHRlclNwYWNpbmcpOwotCi0gICAgICAgIGNvbnN0IElu
bGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQo
KSBjb25zdCB7IHJldHVybiBtX2NvbnRpbnVvdXNDb250ZW50OyB9Ci0gICAgICAgIGNvbnN0IElu
bGluZUl0ZW0qIHRyYWlsaW5nTGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ0xp
bmVCcmVhazsgfQotICAgICAgICBjb25zdCBJbmxpbmVJdGVtKiB0cmFpbGluZ1dvcmRCcmVha09w
cG9ydHVuaXR5KCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5
OyB9Ci0KLSAgICAgICAgdm9pZCBhcHBlbmRJbmxpbmVJdGVtKGNvbnN0IElubGluZUl0ZW0mLCBJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIHZvaWQgYXBwZW5kVHJhaWxp
bmdMaW5lQnJlYWsoY29uc3QgSW5saW5lSXRlbSYgbGluZUJyZWFrSXRlbSkgeyBtX3RyYWlsaW5n
TGluZUJyZWFrID0gJmxpbmVCcmVha0l0ZW07IH0KLSAgICAgICAgdm9pZCBhcHBlbmR0cmFpbGlu
Z1dvcmRCcmVha09wcG9ydHVuaXR5KGNvbnN0IElubGluZUl0ZW0mIHdvcmRCcmVha0l0ZW0pIHsg
bV90cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5ID0gJndvcmRCcmVha0l0ZW07IH0KLSAgICAg
ICAgdm9pZCByZXNldCgpOwotICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBt
X2NvbnRpbnVvdXNDb250ZW50LnJ1bnMoKS5pc0VtcHR5KCkgJiYgIXRyYWlsaW5nV29yZEJyZWFr
T3Bwb3J0dW5pdHkoKSAmJiAhdHJhaWxpbmdMaW5lQnJlYWsoKTsgfQotICAgICAgICBib29sIGhh
c0lubGluZUxldmVsQm94KCkgY29uc3QgeyByZXR1cm4gbV9oYXNJbmxpbmVMZXZlbEJveDsgfQot
Ci0gICAgICAgIHZvaWQgc2V0SGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KGJvb2wgaGFz
VHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KSB7IG1faGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9y
dHVuaXR5ID0gaGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5OyB9Ci0gICAgICAgIGJvb2wg
aGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KCkgY29uc3QgeyByZXR1cm4gbV9oYXNUcmFp
bGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wg
bV9pZ25vcmVUcmFpbGluZ0xldHRlclNwYWNpbmcgeyBmYWxzZSB9OwotCi0gICAgICAgIElubGlu
ZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudCBtX2NvbnRpbnVvdXNDb250ZW50Owot
ICAgICAgICBjb25zdCBJbmxpbmVJdGVtKiBtX3RyYWlsaW5nTGluZUJyZWFrIHsgbnVsbHB0ciB9
OwotICAgICAgICBjb25zdCBJbmxpbmVJdGVtKiBtX3RyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5p
dHkgeyBudWxscHRyIH07Ci0gICAgICAgIGJvb2wgbV9oYXNJbmxpbmVMZXZlbEJveCB7IGZhbHNl
IH07Ci0gICAgICAgIGJvb2wgbV9oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkgeyBmYWxz
ZSB9OwotICAgIH07Ci0KLSAgICAvLyBDYW5kaWRhdGUgY29udGVudCBpcyBhIGNvbGxlY3Rpb24g
b2YgaW5saW5lIGNvbnRlbnQgb3IgYSBmbG9hdCBib3guCi0gICAgSW5saW5lQ29udGVudCBpbmxp
bmVDb250ZW50OwotICAgIGNvbnN0IElubGluZUl0ZW0qIGZsb2F0SXRlbSB7IG51bGxwdHIgfTsK
LX07Ci0KLUxpbmVDYW5kaWRhdGU6OkxpbmVDYW5kaWRhdGUoYm9vbCBpZ25vcmVUcmFpbGluZ0xl
dHRlclNwYWNpbmcpCi0gICAgOiBpbmxpbmVDb250ZW50KGlnbm9yZVRyYWlsaW5nTGV0dGVyU3Bh
Y2luZykKLXsKLX0KLQotTGluZUNhbmRpZGF0ZTo6SW5saW5lQ29udGVudDo6SW5saW5lQ29udGVu
dChib29sIGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKLSAgICA6IG1faWdub3JlVHJhaWxp
bmdMZXR0ZXJTcGFjaW5nKGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKLXsKLX0KLQotaW5s
aW5lIHZvaWQgTGluZUNhbmRpZGF0ZTo6SW5saW5lQ29udGVudDo6YXBwZW5kSW5saW5lSXRlbShj
b25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0
aCkKLXsKLSAgICBBU1NFUlQoaW5saW5lSXRlbS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlzQm94
KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGlu
ZUJveEVuZCgpKTsKLSAgICBhdXRvIGNvbGxhcHNpYmxlV2lkdGggPSBbJl0oKSAtPiBPcHRpb25h
bDxJbmxpbmVMYXlvdXRVbml0PiB7Ci0gICAgICAgIGlmICghaW5saW5lSXRlbS5pc1RleHQoKSkK
LSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIGF1dG8mIGlubGluZVRleHRJdGVtID0g
ZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGlubGluZUl0ZW0pOwotICAgICAgICBpZiAoaW5saW5l
VGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkgJiYgIUlubGluZVRleHRJdGVtOjpzaG91bGRQcmVzZXJ2
ZVNwYWNlc0FuZFRhYnMoaW5saW5lVGV4dEl0ZW0pKSB7Ci0gICAgICAgICAgICAvLyBGdWxseSBj
b2xsYXBzaWJsZSB0cmFpbGluZyBjb250ZW50LgotICAgICAgICAgICAgcmV0dXJuIGxvZ2ljYWxX
aWR0aDsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayBmb3IgcGFydGlhbGx5IGNvbGxhcHNp
YmxlIGNvbnRlbnQuCi0gICAgICAgIGlmIChtX2lnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykK
LSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIGF1dG8gbGV0dGVyU3BhY2luZyA9IGlu
bGluZUl0ZW0uc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCk7Ci0gICAgICAgIGlmIChsZXR0ZXJTcGFj
aW5nIDw9IDApCi0gICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICBBU1NFUlQobG9naWNh
bFdpZHRoID4gbGV0dGVyU3BhY2luZyk7Ci0gICAgICAgIHJldHVybiBsZXR0ZXJTcGFjaW5nOwot
ICAgIH07Ci0gICAgbV9jb250aW51b3VzQ29udGVudC5hcHBlbmQoaW5saW5lSXRlbSwgbG9naWNh
bFdpZHRoLCBjb2xsYXBzaWJsZVdpZHRoKCkpOwotICAgIG1faGFzSW5saW5lTGV2ZWxCb3ggPSBt
X2hhc0lubGluZUxldmVsQm94IHx8IGlubGluZUl0ZW0uaXNCb3goKSB8fCBpbmxpbmVJdGVtLmlz
SW5saW5lQm94U3RhcnQoKTsKLX0KLQotaW5saW5lIHZvaWQgTGluZUNhbmRpZGF0ZTo6SW5saW5l
Q29udGVudDo6cmVzZXQoKQotewotICAgIG1fY29udGludW91c0NvbnRlbnQucmVzZXQoKTsKLSAg
ICBtX3RyYWlsaW5nTGluZUJyZWFrID0geyB9OwotICAgIG1fdHJhaWxpbmdXb3JkQnJlYWtPcHBv
cnR1bml0eSA9IHsgfTsKLSAgICBtX2hhc0lubGluZUxldmVsQm94ID0gZmFsc2U7Ci19Ci0KLWlu
bGluZSB2b2lkIExpbmVDYW5kaWRhdGU6OnJlc2V0KCkKLXsKLSAgICBmbG9hdEl0ZW0gPSBudWxs
cHRyOwotICAgIGlubGluZUNvbnRlbnQucmVzZXQoKTsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBM
aW5lQnVpbGRlcjo6aW5saW5lSXRlbVdpZHRoKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0s
IElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KSBjb25zdAotewotICAgIGlmIChp
czxJbmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSkpIHsKLSAgICAgICAgYXV0byYgaW5saW5lVGV4
dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSk7Ci0gICAgICAgIGlm
IChhdXRvIGNvbnRlbnRXaWR0aCA9IGlubGluZVRleHRJdGVtLndpZHRoKCkpCi0gICAgICAgICAg
ICByZXR1cm4gKmNvbnRlbnRXaWR0aDsKLSAgICAgICAgaWYgKCFpbmxpbmVUZXh0SXRlbS5pc1do
aXRlc3BhY2UoKSB8fCBJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJz
KGlubGluZVRleHRJdGVtKSkKLSAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5s
aW5lVGV4dEl0ZW0sIGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0gICAgICAgIHJldHVybiBUZXh0VXRp
bDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0sIGlubGluZVRleHRJdGVtLnN0YXJ0KCksIGlubGluZVRl
eHRJdGVtLnN0YXJ0KCkgKyAxLCBjb250ZW50TG9naWNhbExlZnQpOwotICAgIH0KLQotICAgIGlm
IChpbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkgfHwgaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9y
dHVuaXR5KCkpCi0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICBhdXRvJiBsYXlvdXRCb3ggPSBp
bmxpbmVJdGVtLmxheW91dEJveCgpOwotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gbV9pbmxpbmVG
b3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwotCi0gICAgaWYgKGxh
eW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gYm94R2VvbWV0
cnkubWFyZ2luQm94V2lkdGgoKTsKLQotICAgIGlmIChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgp
KQotICAgICAgICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luQm94V2lkdGgoKTsKLQotICAgIGlm
IChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSkKLSAgICAgICAgcmV0dXJuIGJveEdlb21l
dHJ5Lm1hcmdpblN0YXJ0KCkgKyBib3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCkgKyBib3hHZW9tZXRy
eS5wYWRkaW5nTGVmdCgpLnZhbHVlT3IoMCk7Ci0KLSAgICBpZiAoaW5saW5lSXRlbS5pc0lubGlu
ZUJveEVuZCgpKQotICAgICAgICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luRW5kKCkgKyBib3hH
ZW9tZXRyeS5ib3JkZXJSaWdodCgpICsgYm94R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVP
cigwKTsKLQotICAgIC8vIE5vbi1yZXBsYWNlZCBpbmxpbmUgYm94IChlLmcuIGlubGluZS1ibG9j
aykKLSAgICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luQm94V2lkdGgoKTsKLX0KLQotTGluZUJ1
aWxkZXI6OkxpbmVCdWlsZGVyKElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCwgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSwgSG9yaXpvbnRhbENvbnN0
cmFpbnRzIHJvb3RIb3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IElubGluZUl0ZW1zJiBpbmxp
bmVJdGVtcykKLSAgICA6IG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQoaW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQpCi0gICAgLCBtX2lubGluZUZvcm1hdHRpbmdTdGF0ZSgmaW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQuZm9ybWF0dGluZ1N0YXRlKCkpCi0gICAgLCBtX2Zsb2F0aW5nU3RhdGUoJmZsb2F0
aW5nU3RhdGUpCi0gICAgLCBtX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHMocm9vdEhvcml6b250
YWxDb25zdHJhaW50cykKLSAgICAsIG1fbGluZShpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLSAg
ICAsIG1faW5saW5lSXRlbXMoaW5saW5lSXRlbXMpCi17Ci19Ci0KLUxpbmVCdWlsZGVyOjpMaW5l
QnVpbGRlcihjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQsIGNvbnN0IElubGluZUl0ZW1zJiBpbmxpbmVJdGVtcykKLSAgICA6IG1faW5saW5lRm9y
bWF0dGluZ0NvbnRleHQoaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCi0gICAgLCBtX2xpbmUoaW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQpCi0gICAgLCBtX2lubGluZUl0ZW1zKGlubGluZUl0ZW1zKQot
ewotfQotCi1MaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQgTGluZUJ1aWxkZXI6OmxheW91dElubGlu
ZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBzaXplX3Qg
cGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBv
dmVyZmxvd0xvZ2ljYWxXaWR0aCwgY29uc3QgSW5saW5lUmVjdCYgaW5pdGlhbExpbmVMb2dpY2Fs
UmVjdCwgYm9vbCBpc0ZpcnN0TGluZSkKLXsKLSAgICBpbml0aWFsaXplKGluaXRpYWxDb25zdHJh
aW50c0ZvckxpbmUoaW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgaXNGaXJzdExpbmUpKTsKLQotICAg
IGF1dG8gY29tbWl0dGVkQ29udGVudCA9IHBsYWNlSW5saW5lQ29udGVudChuZWVkc0xheW91dFJh
bmdlLCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIG92ZXJmbG93TG9naWNhbFdpZHRoKTsK
LSAgICBhdXRvIGNvbW1pdHRlZFJhbmdlID0gY2xvc2UobmVlZHNMYXlvdXRSYW5nZSwgY29tbWl0
dGVkQ29udGVudCk7Ci0KLSAgICBhdXRvIGlzTGFzdExpbmUgPSBpc0xhc3RMaW5lV2l0aElubGlu
ZUNvbnRlbnQoY29tbWl0dGVkUmFuZ2UsIG5lZWRzTGF5b3V0UmFuZ2UuZW5kLCBjb21taXR0ZWRD
b250ZW50LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgpOwotICAgIHJldHVybiBMaW5lQ29u
dGVudCB7IGNvbW1pdHRlZFJhbmdlLCBjb21taXR0ZWRDb250ZW50LnBhcnRpYWxUcmFpbGluZ0Nv
bnRlbnRMZW5ndGgsIGNvbW1pdHRlZENvbnRlbnQub3ZlcmZsb3dMb2dpY2FsV2lkdGgsIG1fZmxv
YXRzLCBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdAotICAgICAgICAsIG1fbGluZUxvZ2lj
YWxSZWN0LnRvcExlZnQoKQotICAgICAgICAsIG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkKLSAg
ICAgICAgLCBtX2xpbmUuY29udGVudExvZ2ljYWxXaWR0aCgpCi0gICAgICAgICwgaXNMYXN0TGlu
ZQotICAgICAgICAsIG1fbGluZS5ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQoKQotICAg
ICAgICAsIG1fbGluZS5ydW5zKCl9OwotfQotCi1MaW5lQnVpbGRlcjo6SW50cmluc2ljQ29udGVu
dCBMaW5lQnVpbGRlcjo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aChjb25zdCBJbmxpbmVJdGVtUmFu
Z2UmIG5lZWRzTGF5b3V0UmFuZ2UsIElubGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgpCi17
Ci0gICAgaW5pdGlhbGl6ZSh7IHsgeyB9LCB7IGF2YWlsYWJsZVdpZHRoLCBtYXhJbmxpbmVMYXlv
dXRVbml0KCkgfSB9LCBmYWxzZSB9KTsKLSAgICBhdXRvIGNvbW1pdHRlZENvbnRlbnQgPSBwbGFj
ZUlubGluZUNvbnRlbnQobmVlZHNMYXlvdXRSYW5nZSwgeyB9LCB7IH0pOwotICAgIGF1dG8gY29t
bWl0dGVkUmFuZ2UgPSBjbG9zZShuZWVkc0xheW91dFJhbmdlLCBjb21taXR0ZWRDb250ZW50KTsK
LSAgICByZXR1cm4geyBjb21taXR0ZWRSYW5nZSwgbV9saW5lLmNvbnRlbnRMb2dpY2FsV2lkdGgo
KSwgbV9mbG9hdHMgfTsKLX0KLQotdm9pZCBMaW5lQnVpbGRlcjo6aW5pdGlhbGl6ZShjb25zdCBV
c2VkQ29uc3RyYWludHMmIGxpbmVDb25zdHJhaW50cykKLXsKLSAgICBtX2Zsb2F0cy5jbGVhcigp
OwotICAgIG1fcGFydGlhbExlYWRpbmdUZXh0SXRlbSA9IHsgfTsKLSAgICBtX3dyYXBPcHBvcnR1
bml0eUxpc3QuY2xlYXIoKTsKLQotICAgIG1fbGluZS5pbml0aWFsaXplKCk7Ci0gICAgbV9saW5l
TG9naWNhbFJlY3QgPSBsaW5lQ29uc3RyYWludHMubG9naWNhbFJlY3Q7Ci0gICAgbV9jb250ZW50
SXNDb25zdHJhaW5lZEJ5RmxvYXQgPSBsaW5lQ29uc3RyYWludHMuaXNDb25zdHJhaW5lZEJ5Rmxv
YXQ7Ci19Ci0KLUxpbmVCdWlsZGVyOjpDb21taXR0ZWRDb250ZW50IExpbmVCdWlsZGVyOjpwbGFj
ZUlubGluZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBz
aXplX3QgcGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRV
bml0PiBsZWFkaW5nTG9naWNhbFdpZHRoKQotewotICAgIGF1dG8gbGluZUNhbmRpZGF0ZSA9IExp
bmVDYW5kaWRhdGUgeyBsYXlvdXRTdGF0ZSgpLnNob3VsZElnbm9yZVRyYWlsaW5nTGV0dGVyU3Bh
Y2luZygpIH07Ci0gICAgYXV0byBpbmxpbmVDb250ZW50QnJlYWtlciA9IElubGluZUNvbnRlbnRC
cmVha2VyIHsgfTsKLQotICAgIGF1dG8gY3VycmVudEl0ZW1JbmRleCA9IG5lZWRzTGF5b3V0UmFu
Z2Uuc3RhcnQ7Ci0gICAgc2l6ZV90IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCA9IDA7Ci0gICAg
d2hpbGUgKGN1cnJlbnRJdGVtSW5kZXggPCBuZWVkc0xheW91dFJhbmdlLmVuZCkgewotICAgICAg
ICAvLyAxLiBDb2xsZWN0IHRoZSBzZXQgb2YgcnVucyB0aGF0IHdlIGNhbiBjb21taXQgdG8gdGhl
IGxpbmUgYXMgb25lIGVudGl0eSBlLmcuIDxzcGFuPnRleHRfYW5kX3NwYW5fc3RhcnRfc3Bhbl9l
bmQ8L3NwYW4+LgotICAgICAgICAvLyAyLiBBcHBseSBmbG9hdHMgYW5kIHNocmluayB0aGUgYXZh
aWxhYmxlIGhvcml6b250YWwgc3BhY2UgZS5nLiA8c3Bhbj5pbnRydV88ZGl2IHN0eWxlPSJmbG9h
dDogbGVmdCI+PC9kaXY+c2l2ZV9mbG9hdDwvc3Bhbj4uCi0gICAgICAgIC8vIDMuIENoZWNrIGlm
IHRoZSBjb250ZW50IGZpdHMgdGhlIGxpbmUgYW5kIGNvbW1pdCB0aGUgY29udGVudCBhY2NvcmRp
bmdseSAoZnVsbCwgcGFydGlhbCBvciBub3QgY29tbWl0IGF0IGFsbCkuCi0gICAgICAgIC8vIDQu
IFJldHVybiBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBlaXRoZXIgYnkgbm90IGJl
aW5nIGFibGUgdG8gZml0IG1vcmUgY29udGVudCBvciBiZWNhdXNlIG9mIGFuIGV4cGxpY2l0IGxp
bmUgYnJlYWsuCi0gICAgICAgIGNhbmRpZGF0ZUNvbnRlbnRGb3JMaW5lKGxpbmVDYW5kaWRhdGUs
IGN1cnJlbnRJdGVtSW5kZXgsIG5lZWRzTGF5b3V0UmFuZ2UsIHBhcnRpYWxMZWFkaW5nQ29udGVu
dExlbmd0aCwgc3RkOjpleGNoYW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6Om51bGxvcHQp
LCBtX2xpbmUuY29udGVudExvZ2ljYWxSaWdodCgpKTsKLSAgICAgICAgLy8gTm93IGNoZWNrIGlm
IHdlIGNhbiBwdXQgdGhpcyBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAgIGF1
dG8gcmVzdWx0ID0gUmVzdWx0IHsgfTsKLSAgICAgICAgaWYgKGxpbmVDYW5kaWRhdGUuZmxvYXRJ
dGVtKSB7Ci0gICAgICAgICAgICBBU1NFUlQobGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50Lmlz
RW1wdHkoKSk7Ci0gICAgICAgICAgICBoYW5kbGVGbG9hdENvbnRlbnQoKmxpbmVDYW5kaWRhdGUu
ZmxvYXRJdGVtKTsKLSAgICAgICAgICAgIC8vIEZsb2F0cyBuZXZlciB0ZXJtaW5hdGUgdGhlIGxp
bmUuCi0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlSW5saW5lQ29u
dGVudChpbmxpbmVDb250ZW50QnJlYWtlciwgbmVlZHNMYXlvdXRSYW5nZSwgbGluZUNhbmRpZGF0
ZSk7Ci0gICAgICAgIGF1dG8gaXNFbmRPZkxpbmUgPSByZXN1bHQuaXNFbmRPZkxpbmUgPT0gSW5s
aW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXM7Ci0gICAgICAgIGlmICghcmVzdWx0
LmNvbW1pdHRlZENvdW50LmlzUmV2ZXJ0KSB7Ci0gICAgICAgICAgICBjb21taXR0ZWRJbmxpbmVJ
dGVtQ291bnQgKz0gcmVzdWx0LmNvbW1pdHRlZENvdW50LnZhbHVlOwotICAgICAgICAgICAgYXV0
byYgaW5saW5lQ29udGVudCA9IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudDsKLSAgICAgICAg
ICAgIGF1dG8gaW5saW5lQ29udGVudElzRnVsbHlDb21taXR0ZWQgPSBpbmxpbmVDb250ZW50LmNv
bnRpbnVvdXNDb250ZW50KCkucnVucygpLnNpemUoKSA9PSByZXN1bHQuY29tbWl0dGVkQ291bnQu
dmFsdWUgJiYgIXJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoOwotICAgICAgICAg
ICAgaWYgKGlubGluZUNvbnRlbnRJc0Z1bGx5Q29tbWl0dGVkKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKGF1dG8qIHdvcmRCcmVha09wcG9ydHVuaXR5ID0gaW5saW5lQ29udGVudC50cmFpbGluZ1dv
cmRCcmVha09wcG9ydHVuaXR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gPHdicj4gbmVl
ZHMgdG8gYmUgb24gdGhlIGxpbmUgYXMgYW4gZW1wdHkgcnVuIHNvIHRoYXQgd2UgY2FuIGNvbnN0
cnVjdCBhbiBpbmxpbmUgYm94IGFuZCBjb21wdXRlIGJhc2ljIGdlb21ldHJ5LgotICAgICAgICAg
ICAgICAgICAgICArK2NvbW1pdHRlZElubGluZUl0ZW1Db3VudDsKLSAgICAgICAgICAgICAgICAg
ICAgbV9saW5lLmFwcGVuZCgqd29yZEJyZWFrT3Bwb3J0dW5pdHksIHsgfSk7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpbmxpbmVDb250ZW50LnRyYWlsaW5nTGluZUJy
ZWFrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRnVsbHkgY29tbWl0dGVkIChvciBlbXB0
eSkgY29udGVudCBmb2xsb3dlZCBieSBhIGxpbmUgYnJlYWsgbWVhbnMgImVuZCBvZiBsaW5lIi4K
LSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgd2lsbCBwdXQgdGhlIGxpbmUgYnJl
YWsgYm94IGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgd2hpbGUgaW4gY2FzZSBvZiBzb21lIGlubGlu
ZSBib3hlcywgdGhlIGxpbmUgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgLy8gY291bGQgdmVy
eSB3ZWxsIGJlIGF0IGFuIGVhcmxpZXIgcG9zaXRpb24uIFRoaXMgaGFzIG5vIHZpc3VhbCBpbXBs
aWNhdGlvbnMgYXQgdGhpcyBwb2ludCB0aG91Z2ggKG9ubHkgZ2VvbWV0cnkgY29ycmVjdG5lc3Mg
b24gdGhlIGxpbmUgYnJlYWsgYm94KS4KLSAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiA8c3Bh
biBzdHlsZT0iYm9yZGVyLXJpZ2h0OiAxMHB4IHNvbGlkIGdyZWVuIj50ZXh0PGJyPjwvc3Bhbj4g
d2hlcmUgdGhlIDxicj4ncyBob3Jpem9udGFsIHBvc2l0aW9uIGlzIGJlZm9yZSB0aGUgcmlnaHQg
Ym9yZGVyIGFuZCBub3QgYWZ0ZXIuCi0gICAgICAgICAgICAgICAgICAgIG1fbGluZS5hcHBlbmQo
KmlubGluZUNvbnRlbnQudHJhaWxpbmdMaW5lQnJlYWsoKSwgeyB9KTsKLSAgICAgICAgICAgICAg
ICAgICAgKytjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlz
RW5kT2ZMaW5lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0gZWxzZQotICAgICAgICAgICAgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50ID0gcmVzdWx0
LmNvbW1pdHRlZENvdW50LnZhbHVlOwotCi0gICAgICAgIGlmIChpc0VuZE9mTGluZSkgewotICAg
ICAgICAgICAgLy8gV2UgY2FuJ3QgcGxhY2UgYW55IG1vcmUgaXRlbXMgb24gdGhlIGN1cnJlbnQg
bGluZS4KLSAgICAgICAgICAgIHJldHVybiB7IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCwgcmVz
dWx0LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgsIHJlc3VsdC5vdmVyZmxvd0xvZ2ljYWxX
aWR0aCB9OwotICAgICAgICB9Ci0gICAgICAgIGN1cnJlbnRJdGVtSW5kZXggPSBuZWVkc0xheW91
dFJhbmdlLnN0YXJ0ICsgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50ICsgbV9mbG9hdHMuc2l6ZSgp
OwotICAgICAgICBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGggPSB7IH07Ci0gICAgfQotICAg
IC8vIExvb2tzIGxpa2Ugd2UndmUgcnVuIG91dCBvZiBydW5zLgotICAgIHJldHVybiB7IGNvbW1p
dHRlZElubGluZUl0ZW1Db3VudCwgeyB9IH07Ci19Ci0KLUxpbmVCdWlsZGVyOjpJbmxpbmVJdGVt
UmFuZ2UgTGluZUJ1aWxkZXI6OmNsb3NlKGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlv
dXRSYW5nZSwgY29uc3QgQ29tbWl0dGVkQ29udGVudCYgY29tbWl0dGVkQ29udGVudCkKLXsKLSAg
ICBBU1NFUlQoY29tbWl0dGVkQ29udGVudC5pbmxpbmVJdGVtQ291bnQgfHwgIW1fZmxvYXRzLmlz
RW1wdHkoKSB8fCBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdCk7Ci0gICAgYXV0byBudW1i
ZXJPZkNvbW1pdHRlZEl0ZW1zID0gY29tbWl0dGVkQ29udGVudC5pbmxpbmVJdGVtQ291bnQgKyBt
X2Zsb2F0cy5zaXplKCk7Ci0gICAgYXV0byB0cmFpbGluZ0lubGluZUl0ZW1JbmRleCA9IG5lZWRz
TGF5b3V0UmFuZ2Uuc3RhcnQgKyBudW1iZXJPZkNvbW1pdHRlZEl0ZW1zIC0gMTsKLSAgICBhdXRv
IGxpbmVSYW5nZSA9IElubGluZUl0ZW1SYW5nZSB7IG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQsIHRy
YWlsaW5nSW5saW5lSXRlbUluZGV4ICsgMSB9OwotICAgIEFTU0VSVChsaW5lUmFuZ2UuZW5kIDw9
IG5lZWRzTGF5b3V0UmFuZ2UuZW5kKTsKLSAgICBpZiAoIWNvbW1pdHRlZENvbnRlbnQuaW5saW5l
SXRlbUNvdW50KSB7Ci0gICAgICAgIC8vIExpbmUgaXMgZW1wdHksIHdlIG9ubHkgbWFuYWdlZCB0
byBwbGFjZSBmbG9hdCBib3hlcy4KLSAgICAgICAgcmV0dXJuIGxpbmVSYW5nZTsKLSAgICB9Ci0g
ICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkgLSBtX2xp
bmUuY29udGVudExvZ2ljYWxSaWdodCgpOwotICAgIG1fbGluZS5yZW1vdmVDb2xsYXBzaWJsZUNv
bnRlbnQoYXZhaWxhYmxlV2lkdGgpOwotICAgIGF1dG8gaG9yaXpvbnRhbEFsaWdubWVudCA9IHJv
b3QoKS5zdHlsZSgpLnRleHRBbGlnbigpOwotICAgIGF1dG8gcnVuc0V4cGFuZEhvcml6b250YWxs
eSA9IGhvcml6b250YWxBbGlnbm1lbnQgPT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSAmJiAhaXNM
YXN0TGluZVdpdGhJbmxpbmVDb250ZW50KGxpbmVSYW5nZSwgbmVlZHNMYXlvdXRSYW5nZS5lbmQs
IGNvbW1pdHRlZENvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCk7Ci0gICAgaWYg
KHJ1bnNFeHBhbmRIb3Jpem9udGFsbHkpCi0gICAgICAgIG1fbGluZS5hcHBseVJ1bkV4cGFuc2lv
bihtX2xpbmVMb2dpY2FsUmVjdC53aWR0aCgpIC0gbV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQo
KSk7Ci0gICAgYXV0byBsaW5lRW5kc1dpdGhIeXBoZW4gPSBmYWxzZTsKLSAgICBpZiAoIW1fbGlu
ZS5ydW5zKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGF1dG8mIGxhc3RUZXh0Q29udGVudCA9IG1f
bGluZS5ydW5zKCkubGFzdCgpLnRleHRDb250ZW50KCk7Ci0gICAgICAgIGxpbmVFbmRzV2l0aEh5
cGhlbiA9IGxhc3RUZXh0Q29udGVudCAmJiBsYXN0VGV4dENvbnRlbnQtPm5lZWRzSHlwaGVuKCk7
Ci0gICAgfQotICAgIG1fc3VjY2Vzc2l2ZUh5cGhlbmF0ZWRMaW5lQ291bnQgPSBsaW5lRW5kc1dp
dGhIeXBoZW4gPyBtX3N1Y2Nlc3NpdmVIeXBoZW5hdGVkTGluZUNvdW50ICsgMSA6IDA7Ci0gICAg
cmV0dXJuIGxpbmVSYW5nZTsKLX0KLQotT3B0aW9uYWw8SG9yaXpvbnRhbENvbnN0cmFpbnRzPiBM
aW5lQnVpbGRlcjo6ZmxvYXRDb25zdHJhaW50cyhjb25zdCBJbmxpbmVSZWN0JiBsaW5lTG9naWNh
bFJlY3QpIGNvbnN0Ci17Ci0gICAgYXV0byogZmxvYXRpbmdTdGF0ZSA9IHRoaXMtPmZsb2F0aW5n
U3RhdGUoKTsKLSAgICBpZiAoIWZsb2F0aW5nU3RhdGUgfHwgZmxvYXRpbmdTdGF0ZS0+ZmxvYXRz
KCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4geyB9OwotCi0gICAgLy8gQ2hlY2sgZm9yIGlu
dHJ1ZGluZyBmbG9hdHMgYW5kIGFkanVzdCBsb2dpY2FsIGxlZnQvYXZhaWxhYmxlIHdpZHRoIGZv
ciB0aGlzIGxpbmUgYWNjb3JkaW5nbHkuCi0gICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9h
dGluZ0NvbnRleHQgeyBmb3JtYXR0aW5nQ29udGV4dCgpLCAqZmxvYXRpbmdTdGF0ZSB9OwotICAg
IGF1dG8gY29uc3RyYWludHMgPSBmbG9hdGluZ0NvbnRleHQuY29uc3RyYWludHModG9MYXlvdXRV
bml0KGxpbmVMb2dpY2FsUmVjdC50b3AoKSksIHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFJlY3Qu
Ym90dG9tKCkpKTsKLSAgICAvLyBDaGVjayBpZiB0aGVzZSB2YWx1ZXMgYWN0dWFsbHkgY29uc3Ry
YWluIHRoZSBsaW5lLgotICAgIGlmIChjb25zdHJhaW50cy5sZWZ0ICYmIGNvbnN0cmFpbnRzLmxl
ZnQtPnggPD0gbGluZUxvZ2ljYWxSZWN0LmxlZnQoKSkKLSAgICAgICAgY29uc3RyYWludHMubGVm
dCA9IHsgfTsKLQotICAgIGlmIChjb25zdHJhaW50cy5yaWdodCAmJiBjb25zdHJhaW50cy5yaWdo
dC0+eCA+PSBsaW5lTG9naWNhbFJlY3QucmlnaHQoKSkKLSAgICAgICAgY29uc3RyYWludHMucmln
aHQgPSB7IH07Ci0KLSAgICBpZiAoIWNvbnN0cmFpbnRzLmxlZnQgJiYgIWNvbnN0cmFpbnRzLnJp
Z2h0KQotICAgICAgICByZXR1cm4geyB9OwotCi0gICAgYXV0byBsaW5lTG9naWNhbExlZnQgPSBs
aW5lTG9naWNhbFJlY3QubGVmdCgpOwotICAgIGF1dG8gbGluZUxvZ2ljYWxSaWdodCA9IGxpbmVM
b2dpY2FsUmVjdC5yaWdodCgpOwotICAgIGlmIChjb25zdHJhaW50cy5sZWZ0ICYmIGNvbnN0cmFp
bnRzLnJpZ2h0KSB7Ci0gICAgICAgIGxpbmVMb2dpY2FsUmlnaHQgPSBjb25zdHJhaW50cy5yaWdo
dC0+eDsKLSAgICAgICAgbGluZUxvZ2ljYWxMZWZ0ID0gY29uc3RyYWludHMubGVmdC0+eDsKLSAg
ICB9IGVsc2UgaWYgKGNvbnN0cmFpbnRzLmxlZnQpIHsKLSAgICAgICAgQVNTRVJUKGNvbnN0cmFp
bnRzLmxlZnQtPnggPj0gbGluZUxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgbGluZUxvZ2ljYWxMZWZ0
ID0gY29uc3RyYWludHMubGVmdC0+eDsKLSAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnRzLnJpZ2h0
KSB7Ci0gICAgICAgIC8vIFJpZ2h0IGZsb2F0IGJveGVzIG1heSBvdmVyZmxvdyB0aGUgY29udGFp
bmluZyBibG9jayBvbiB0aGUgbGVmdC4KLSAgICAgICAgbGluZUxvZ2ljYWxSaWdodCA9IHN0ZDo6
bWF4PElubGluZUxheW91dFVuaXQ+KGxpbmVMb2dpY2FsTGVmdCwgY29uc3RyYWludHMucmlnaHQt
PngpOwotICAgIH0KLSAgICByZXR1cm4gSG9yaXpvbnRhbENvbnN0cmFpbnRzIHsgdG9MYXlvdXRV
bml0KGxpbmVMb2dpY2FsTGVmdCksIHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFJpZ2h0IC0gbGlu
ZUxvZ2ljYWxMZWZ0KSB9OwotfQotCi1MaW5lQnVpbGRlcjo6VXNlZENvbnN0cmFpbnRzIExpbmVC
dWlsZGVyOjppbml0aWFsQ29uc3RyYWludHNGb3JMaW5lKGNvbnN0IElubGluZVJlY3QmIGluaXRp
YWxMaW5lTG9naWNhbFJlY3QsIGJvb2wgaXNGaXJzdExpbmUpIGNvbnN0Ci17Ci0gICAgYXV0byBs
aW5lTG9naWNhbExlZnQgPSBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LmxlZnQoKTsKLSAgICBhdXRv
IGxpbmVMb2dpY2FsUmlnaHQgPSBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LnJpZ2h0KCk7Ci0gICAg
YXV0byBsaW5lSXNDb25zdHJhaW5lZEJ5RmxvYXQgPSBmYWxzZTsKLQotICAgIGlmIChhdXRvIGxp
bmVDb25zdHJhaW50cyA9IGZsb2F0Q29uc3RyYWludHMoaW5pdGlhbExpbmVMb2dpY2FsUmVjdCkp
IHsKLSAgICAgICAgbGluZUxvZ2ljYWxMZWZ0ID0gbGluZUNvbnN0cmFpbnRzLT5sb2dpY2FsTGVm
dDsKLSAgICAgICAgbGluZUxvZ2ljYWxSaWdodCA9IGxpbmVDb25zdHJhaW50cy0+bG9naWNhbFJp
Z2h0KCk7Ci0gICAgICAgIGxpbmVJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IHRydWU7Ci0gICAgfQot
Ci0gICAgYXV0byBjb21wdXRlZFRleHRJbmRlbnQgPSBbJl0oKSAtPiBJbmxpbmVMYXlvdXRVbml0
IHsKLSAgICAgICAgLy8gdGV4dC1pbmRlbnQgcHJvcGVydHkgc3BlY2lmaWVzIHRoZSBpbmRlbnRh
dGlvbiBhcHBsaWVkIHRvIGxpbmVzIG9mIGlubGluZSBjb250ZW50IGluIGEgYmxvY2suCi0gICAg
ICAgIC8vIFRoZSBpbmRlbnQgaXMgdHJlYXRlZCBhcyBhIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBz
dGFydCBlZGdlIG9mIHRoZSBsaW5lIGJveC4KLSAgICAgICAgLy8gVW5sZXNzIG90aGVyd2lzZSBz
cGVjaWZpZWQsIG9ubHkgbGluZXMgdGhhdCBhcmUgdGhlIGZpcnN0IGZvcm1hdHRlZCBsaW5lIG9m
IGFuIGVsZW1lbnQgYXJlIGFmZmVjdGVkLgotICAgICAgICAvLyBGb3IgZXhhbXBsZSwgdGhlIGZp
cnN0IGxpbmUgb2YgYW4gYW5vbnltb3VzIGJsb2NrIGJveCBpcyBvbmx5IGFmZmVjdGVkIGlmIGl0
IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50IGVsZW1lbnQuCi0gICAgICAgIC8vIEZJ
WE1FOiBBZGQgc3VwcG9ydCBmb3IgZWFjaC1saW5lLgotICAgICAgICAvLyBbSW50ZWdyYXRpb25d
IHJvb3QoKS0+cGFyZW50KCkgd291bGQgbm9ybWFsbHkgcHJvZHVjZSBhIHZhbGlkIGxheW91dCBi
b3guCi0gICAgICAgIGF1dG8mIHJvb3QgPSB0aGlzLT5yb290KCk7Ci0gICAgICAgIGF1dG8gaXNG
b3JtYXR0aW5nQ29udGV4dFJvb3RDYW5kaWRhdGVUb1RleHRJbmRlbnQgPSAhcm9vdC5pc0Fub255
bW91cygpOwotICAgICAgICBpZiAocm9vdC5pc0Fub255bW91cygpKSB7Ci0gICAgICAgICAgICAv
LyBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBieSB0aGUgZWFjaC1saW5lIGFuZC9vciBoYW5n
aW5nIGtleXdvcmRzLCBvbmx5IGxpbmVzIHRoYXQgYXJlIHRoZSBmaXJzdCBmb3JtYXR0ZWQgbGlu
ZQotICAgICAgICAgICAgLy8gb2YgYW4gZWxlbWVudCBhcmUgYWZmZWN0ZWQuCi0gICAgICAgICAg
ICAvLyBGb3IgZXhhbXBsZSwgdGhlIGZpcnN0IGxpbmUgb2YgYW4gYW5vbnltb3VzIGJsb2NrIGJv
eCBpcyBvbmx5IGFmZmVjdGVkIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50
IGVsZW1lbnQuCi0gICAgICAgICAgICBhdXRvIGlzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxk
ID0gbGF5b3V0U3RhdGUoKS5pc0ludGVncmF0ZWRSb290Qm94Rmlyc3RDaGlsZCgpOwotICAgICAg
ICAgICAgaWYgKGlzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkID09IExheW91dFN0YXRlOjpJ
c0ludGVncmF0ZWRSb290Qm94Rmlyc3RDaGlsZDo6Tm90QXBwbGljYWJsZSkKLSAgICAgICAgICAg
ICAgICBpc0Zvcm1hdHRpbmdDb250ZXh0Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCA9IHJvb3Qu
cGFyZW50KCkuZmlyc3RJbkZsb3dDaGlsZCgpID09ICZyb290OwotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIGlzRm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9UZXh0SW5k
ZW50ID0gaXNJbnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQgPT0gTGF5b3V0U3RhdGU6OklzSW50
ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkOjpZZXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFp
c0Zvcm1hdHRpbmdDb250ZXh0Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCkKLSAgICAgICAgICAg
IHJldHVybiB7IH07Ci0gICAgICAgIGF1dG8gaW52ZXJ0TGluZVJhbmdlID0gcm9vdC5zdHlsZSgp
LnRleHRJbmRlbnRUeXBlKCkgPT0gVGV4dEluZGVudFR5cGU6Okhhbmdpbmc7Ci0gICAgICAgIC8v
IHRleHQtaW5kZW50OiBoYW5naW5nIGludmVydHMgd2hpY2ggbGluZXMgYXJlIGFmZmVjdGVkLgot
ICAgICAgICAvLyBpbnZlcnRlZCBsaW5lIHJhbmdlIC0+IGFsbCB0aGUgbGluZXMgZXhjZXB0IHRo
ZSBmaXJzdCBvbmUuCi0gICAgICAgIC8vICFpbnZlcnRlZCBsaW5lIHJhbmdlIC0+IGZpcnN0IGxp
bmUgZ2V0cyB0aGUgaW5kZW50LgotICAgICAgICBhdXRvIHNob3VsZEluZGVudCA9IGludmVydExp
bmVSYW5nZSAhPSBpc0ZpcnN0TGluZTsKLSAgICAgICAgaWYgKCFzaG91bGRJbmRlbnQpCi0gICAg
ICAgICAgICByZXR1cm4geyB9OwotCi0gICAgICAgIGF1dG8gdGV4dEluZGVudCA9IHJvb3Quc3R5
bGUoKS50ZXh0SW5kZW50KCk7Ci0gICAgICAgIGlmICh0ZXh0SW5kZW50ID09IFJlbmRlclN0eWxl
Ojppbml0aWFsVGV4dEluZGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAg
cmV0dXJuIHsgbWluaW11bVZhbHVlRm9yTGVuZ3RoKHRleHRJbmRlbnQsIGluaXRpYWxMaW5lTG9n
aWNhbFJlY3Qud2lkdGgoKSkgfTsKLSAgICB9OwotICAgIGxpbmVMb2dpY2FsTGVmdCArPSBjb21w
dXRlZFRleHRJbmRlbnQoKTsKLSAgICByZXR1cm4gVXNlZENvbnN0cmFpbnRzIHsgeyBpbml0aWFs
TGluZUxvZ2ljYWxSZWN0LnRvcCgpLCBsaW5lTG9naWNhbExlZnQsIGxpbmVMb2dpY2FsUmlnaHQg
LSBsaW5lTG9naWNhbExlZnQsIGluaXRpYWxMaW5lTG9naWNhbFJlY3QuaGVpZ2h0KCkgfSwgbGlu
ZUlzQ29uc3RyYWluZWRCeUZsb2F0IH07Ci19Ci0KLXZvaWQgTGluZUJ1aWxkZXI6OmNhbmRpZGF0
ZUNvbnRlbnRGb3JMaW5lKExpbmVDYW5kaWRhdGUmIGxpbmVDYW5kaWRhdGUsIHNpemVfdCBjdXJy
ZW50SW5saW5lSXRlbUluZGV4LCBjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBz
aXplX3QgcGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRV
bml0PiBsZWFkaW5nTG9naWNhbFdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGN1cnJlbnRMb2dpY2Fs
UmlnaHQpCi17Ci0gICAgQVNTRVJUKGN1cnJlbnRJbmxpbmVJdGVtSW5kZXggPCBsYXlvdXRSYW5n
ZS5lbmQpOwotICAgIGxpbmVDYW5kaWRhdGUucmVzZXQoKTsKLSAgICAvLyAxLiBTaW1wbHkgYWRk
IGFueSBvdmVyZmxvdyBjb250ZW50IGZyb20gdGhlIHByZXZpb3VzIGxpbmUgdG8gdGhlIGNhbmRp
ZGF0ZSBjb250ZW50LiBJdCdzIGFsd2F5cyBhIHRleHQgY29udGVudC4KLSAgICAvLyAyLiBGaW5k
IHRoZSBuZXh0IHNvZnQgd3JhcCBwb3NpdGlvbiBvciBleHBsaWNpdCBsaW5lIGJyZWFrLgotICAg
IC8vIDMuIENvbGxlY3QgZmxvYXRzIGJldHdlZW4gdGhlIGlubGluZSBjb250ZW50LgotICAgIGF1
dG8gc29mdFdyYXBPcHBvcnR1bml0eUluZGV4ID0gbmV4dFdyYXBPcHBvcnR1bml0eShjdXJyZW50
SW5saW5lSXRlbUluZGV4LCBsYXlvdXRSYW5nZSk7Ci0gICAgLy8gc29mdFdyYXBPcHBvcnR1bml0
eUluZGV4ID09IGxheW91dFJhbmdlLmVuZCBtZWFucyB3ZSBkb24ndCBoYXZlIGFueSB3cmFwIG9w
cG9ydHVuaXR5IGluIHRoaXMgY29udGVudC4KLSAgICBBU1NFUlQoc29mdFdyYXBPcHBvcnR1bml0
eUluZGV4IDw9IGxheW91dFJhbmdlLmVuZCk7Ci0KLSAgICBpZiAocGFydGlhbExlYWRpbmdDb250
ZW50TGVuZ3RoKSB7Ci0gICAgICAgIC8vIEhhbmRsZSBsZWFkaW5nIHBhcnRpYWwgY29udGVudCBm
aXJzdCAob3ZlcmZsb3dpbmcgdGV4dCBmcm9tIHRoZSBwcmV2aW91cyBsaW5lKS4KLSAgICAgICAg
Ly8gQ29uc3RydWN0IGEgcGFydGlhbCBsZWFkaW5nIGlubGluZSBpdGVtLgotICAgICAgICBtX3Bh
cnRpYWxMZWFkaW5nVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4obV9pbmxpbmVJ
dGVtc1tjdXJyZW50SW5saW5lSXRlbUluZGV4XSkucmlnaHQocGFydGlhbExlYWRpbmdDb250ZW50
TGVuZ3RoKTsKLSAgICAgICAgYXV0byBpdGVtV2lkdGggPSBsZWFkaW5nTG9naWNhbFdpZHRoID8g
KnN0ZDo6ZXhjaGFuZ2UobGVhZGluZ0xvZ2ljYWxXaWR0aCwgV1RGOjpudWxsb3B0KSA6IGlubGlu
ZUl0ZW1XaWR0aCgqbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtLCBjdXJyZW50TG9naWNhbFJpZ2h0
KTsKLSAgICAgICAgbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmFwcGVuZElubGluZUl0ZW0o
Km1fcGFydGlhbExlYWRpbmdUZXh0SXRlbSwgaXRlbVdpZHRoKTsKLSAgICAgICAgY3VycmVudExv
Z2ljYWxSaWdodCArPSBpdGVtV2lkdGg7Ci0gICAgICAgICsrY3VycmVudElubGluZUl0ZW1JbmRl
eDsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gaW5kZXggPSBjdXJyZW50SW5saW5lSXRlbUluZGV4
OyBpbmRleCA8IHNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleDsgKytpbmRleCkgewotICAgICAgICBh
dXRvJiBpbmxpbmVJdGVtID0gbV9pbmxpbmVJdGVtc1tpbmRleF07Ci0gICAgICAgIGlmIChpbmxp
bmVJdGVtLmlzRmxvYXQoKSkgewotICAgICAgICAgICAgbGluZUNhbmRpZGF0ZS5mbG9hdEl0ZW0g
PSAmaW5saW5lSXRlbTsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzb2Z0IHdyYXAgb3Bwb3J0
dW5pdHksIG11c3QgYmUgdGhlIG9ubHkgaXRlbSBpbiB0aGUgbGlzdC4KLSAgICAgICAgICAgIEFT
U0VSVChjdXJyZW50SW5saW5lSXRlbUluZGV4ICsgMSA9PSBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5k
ZXgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlubGlu
ZUl0ZW0uaXNUZXh0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5l
SXRlbS5pc0lubGluZUJveEVuZCgpIHx8IGlubGluZUl0ZW0uaXNCb3goKSkgewotICAgICAgICAg
ICAgQVNTRVJUKCFsZWFkaW5nTG9naWNhbFdpZHRoIHx8IGlubGluZUl0ZW0uaXNUZXh0KCkpOwot
ICAgICAgICAgICAgYXV0byBsb2dpY2FsV2lkdGggPSBsZWFkaW5nTG9naWNhbFdpZHRoID8gKnN0
ZDo6ZXhjaGFuZ2UobGVhZGluZ0xvZ2ljYWxXaWR0aCwgV1RGOjpudWxsb3B0KSA6IGlubGluZUl0
ZW1XaWR0aChpbmxpbmVJdGVtLCBjdXJyZW50TG9naWNhbFJpZ2h0KTsKLSAgICAgICAgICAgIGxp
bmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5hcHBlbmRJbmxpbmVJdGVtKGlubGluZUl0ZW0sIGxv
Z2ljYWxXaWR0aCk7Ci0gICAgICAgICAgICBjdXJyZW50TG9naWNhbFJpZ2h0ICs9IGxvZ2ljYWxX
aWR0aDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmxp
bmVJdGVtLmlzTGluZUJyZWFrKCkgfHwgaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5
KCkpIHsKLSAgICAgICAgICAgIC8vIFNpbmNlIGJvdGggPGJyPiBhbmQgPHdicj4gYXJlIGV4cGxp
Y2l0IHdvcmQgYnJlYWsgb3Bwb3J0dW5pdGllcyB0aGV5IGhhdmUgdG8gYmUgdHJhaWxpbmcgaXRl
bXMgaW4gdGhpcyBjYW5kaWRhdGUgcnVuIGxpc3QgdW5sZXNzIHRoZXkgYXJlIGVtYmVkZGVkIGlu
IGlubGluZSBib3hlcy4KLSAgICAgICAgICAgIC8vIGUuZy4gPHNwYW4+PHdicj48L3NwYW4+Ci0j
aWYgQVNTRVJUX0VOQUJMRUQKLSAgICAgICAgICAgIGZvciAoYXV0byBpID0gaW5kZXggKyAxOyBp
IDwgc29mdFdyYXBPcHBvcnR1bml0eUluZGV4OyArK2kpCi0gICAgICAgICAgICAgICAgQVNTRVJU
KG1faW5saW5lSXRlbXNbaV0uaXNJbmxpbmVCb3hFbmQoKSk7Ci0jZW5kaWYKLSAgICAgICAgICAg
IGlubGluZUl0ZW0uaXNMaW5lQnJlYWsoKSA/IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5h
cHBlbmRUcmFpbGluZ0xpbmVCcmVhayhpbmxpbmVJdGVtKSA6IGxpbmVDYW5kaWRhdGUuaW5saW5l
Q29udGVudC5hcHBlbmR0cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5KGlubGluZUl0ZW0pOwot
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7Ci0gICAgfQotICAgIGF1dG8gaW5saW5lQ29udGVudEVuZHNJblNvZnRXcmFwT3Bwb3J0
dW5pdHkgPSBbJl0gewotICAgICAgICBpZiAoIXNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCB8fCBz
b2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggPT0gbGF5b3V0UmFuZ2UuZW5kKSB7Ci0gICAgICAgICAg
ICAvLyBUaGlzIGNhbmRpZGF0ZSBpbmxpbmUgY29udGVudCBlbmRzIGJlY2F1c2UgdGhlIGVudGly
ZSBjb250ZW50IGVuZHMgYW5kIG5vdCBiZWNhdXNlIHRoZXJlJ3MgYSBzb2Z0IHdyYXAgb3Bwb3J0
dW5pdHkuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYg
KG1faW5saW5lSXRlbXNbc29mdFdyYXBPcHBvcnR1bml0eUluZGV4IC0gMV0uaXNGbG9hdCgpKSB7
Ci0gICAgICAgICAgICAvLyBXaGlsZSB3ZSBzdG9wIGF0IGZsb2F0cywgdGhleSBhcmUgbm90IGNv
bnNpZGVyZWQgcmVhbCBzb2Z0IHdyYXAgb3Bwb3J0dW5pdGllcy4gCi0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9U
Ui9jc3MtdGV4dC0zLyNsaW5lLWJyZWFrLWRldGFpbHMKLSAgICAgICAgYXV0byYgdHJhaWxpbmdJ
bmxpbmVJdGVtID0gbV9pbmxpbmVJdGVtc1tzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggLSAxXTsK
LSAgICAgICAgaWYgKHRyYWlsaW5nSW5saW5lSXRlbS5pc0JveCgpIHx8IHRyYWlsaW5nSW5saW5l
SXRlbS5pc0xpbmVCcmVhaygpIHx8IHRyYWlsaW5nSW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9y
dHVuaXR5KCkgfHwgdHJhaWxpbmdJbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpIHsKLSAgICAg
ICAgICAgIC8vIEZvciBXZWItY29tcGF0aWJpbGl0eSB0aGVyZSBpcyBhIHNvZnQgd3JhcCBvcHBv
cnR1bml0eSBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggcmVwbGFjZWQgZWxlbWVudCBvciBvdGhlciBh
dG9taWMgaW5saW5lLgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKHRyYWlsaW5nSW5saW5lSXRlbS5pc1RleHQoKSkgewotICAgICAgICAgICAgYXV0byYg
aW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4odHJhaWxpbmdJbmxpbmVJ
dGVtKTsKLSAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKLSAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIC8vIE5vdyBpbiBjYXNlIG9m
IG5vbi13aGl0ZXNwYWNlIHRyYWlsaW5nIGNvbnRlbnQsIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhl
IGFjdHVhbCBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgYmVsb25ncyB0byB0aGUgbmV4dCBzZXQuCi0g
ICAgICAgICAgICAvLyBlLmcuICJ0aGlzX2lzX3RoZV90cmFpbGluZ19ydW48c3Bhbj4gPC1idXRf
dGhpc19zcGFjZV9oZXJlX2lzX3RoZV9zb2Z0X3dyYXBfb3Bwb3J0dW5pdHkiCi0gICAgICAgICAg
ICAvLyBXaGVuIHRoZXJlJ3MgYW4gaW5saW5lIGJveCBzdGFydCg8c3Bhbj4pL2VuZCg8L3NwYW4+
KSBiZXR3ZWVuIHRoZSB0cmFpbGluZyBhbmQgdGhlIChuZXh0KWxlYWRpbmcgcnVuLCB3aGlsZSB3
ZSBicmVhayBiZWZvcmUgdGhlIGlubGluZSBib3ggc3RhcnQgKDxzcGFuPikKLSAgICAgICAgICAg
IC8vIHRoZSBhY3R1YWwgc29mdCB3cmFwIHBvc2l0aW9uIGlzIGFmdGVyIHRoZSBpbmxpbmUgYm94
IHN0YXJ0ICg8c3Bhbj4pIGJ1dCBpbiB0ZXJtcyBvZiBsaW5lIGJyZWFraW5nIGNvbnRpbnVpdHkg
dGhlIGlubGluZSBib3ggc3RhcnQgKDxzcGFuPikgYW5kIHRoZSB3aGl0ZXNwYWNlIHJ1biBiZWxv
bmcgdG9nZXRoZXIuCi0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChsYXlvdXRSYW5nZS5lbmQg
PD0gbV9pbmxpbmVJdGVtcy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChhdXRvIGluZGV4ID0g
c29mdFdyYXBPcHBvcnR1bml0eUluZGV4OyBpbmRleCA8IGxheW91dFJhbmdlLmVuZDsgKytpbmRl
eCkgewotICAgICAgICAgICAgICAgIGlmIChtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJv
eFN0YXJ0KCkgfHwgbV9pbmxpbmVJdGVtc1tpbmRleF0uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IENoZWNr
IGlmIFtub24td2hpdGVzcGFjZV1baW5saW5lLWJveF1bbm8td2hpdGVzcGFjZV0gY29udGVudCBo
YXMgcnVsZXMgYWJvdXQgaXQuCi0gICAgICAgICAgICAgICAgLy8gRm9yIG5vdyBsZXQncyBzYXkg
dGhlIHNvZnQgd3JhcCBwb3NpdGlvbiBiZWxvbmdzIHRvIHRoZSBuZXh0IHNldCBvZiBydW5zIHdo
ZW4gW25vbi13aGl0ZXNwYWNlXVtpbmxpbmUtYm94XVt3aGl0ZXNwYWNlXSwgW25vbi13aGl0ZXNw
YWNlXVtpbmxpbmUtYm94XVtib3hdIGV0Yy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbV9pbmxp
bmVJdGVtc1tpbmRleF0uaXNUZXh0KCkgJiYgIWRvd25jYXN0PElubGluZVRleHRJdGVtPihtX2lu
bGluZUl0ZW1zW2luZGV4XSkuaXNXaGl0ZXNwYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfTsKLSAgICBsaW5lQ2FuZGlkYXRlLmlubGlu
ZUNvbnRlbnQuc2V0SGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KGlubGluZUNvbnRlbnRF
bmRzSW5Tb2Z0V3JhcE9wcG9ydHVuaXR5KCkpOwotfQotCi1zaXplX3QgTGluZUJ1aWxkZXI6Om5l
eHRXcmFwT3Bwb3J0dW5pdHkoc2l6ZV90IHN0YXJ0SW5kZXgsIGNvbnN0IExpbmVCdWlsZGVyOjpJ
bmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlKSBjb25zdAotewotICAgIC8vIDEuIEZpbmQgdGhl
IHN0YXJ0IGNhbmRpZGF0ZSBieSBza2lwcGluZyBsZWFkaW5nIG5vbi1jb250ZW50IGl0ZW1zIGUu
ZyAiPHNwYW4+PHNwYW4+c3RhcnQiLiBPcHBvcnR1bml0eSBpcyBhZnRlciAiPHNwYW4+PHNwYW4+
Ii4KLSAgICAvLyAyLiBGaW5kIHRoZSBlbmQgY2FuZGlkYXRlIGJ5IHNraXBwaW5nIG5vbi1jb250
ZW50IGl0ZW1zIGluYmV0d2VlbiBlLmcuICI8c3Bhbj48c3Bhbj5zdGFydDwvc3Bhbj5lbmQiLiBP
cHBvcnR1bml0eSBpcyBhZnRlciAiPC9zcGFuPiIuCi0gICAgLy8gMy4gQ2hlY2sgaWYgdGhlcmUn
cyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBiZXR3ZWVuIHRoZSAyIGNhbmRpZGF0ZSBpbmxpbmUg
aXRlbXMgYW5kIHJlcGVhdC4KLSAgICAvLyA0LiBBbnkgZm9yY2UgbGluZSBicmVhay9leHBsaWNp
dCB3cmFwIGNvbnRlbnQgaW5iZXR3ZWVuIGlzIGNvbnNpZGVyZWQgYXMgd3JhcCBvcHBvcnR1bml0
eS4KLQotICAgIC8vIFtleC1dW2lubGluZSBib3ggc3RhcnRdW2lubGluZSBib3ggZW5kXVtmbG9h
dF1bYW1wbGVdIChleC08c3Bhbj48L3NwYW4+PGRpdiBzdHlsZT0iZmxvYXQ6bGVmdCI+PC9kaXY+
YW1wbGUpLiBXcmFwIGluZGV4IGlzIGF0IFtleC1dLgotICAgIC8vIFtleF1baW5saW5lIGJveCBz
dGFydF1bYW1wLV1baW5saW5lIGJveCBzdGFydF1bbGVdIChleDxzcGFuPmFtcC08c3Bhbj5hbXBs
ZSkuIFdyYXAgaW5kZXggaXMgYXQgW2FtcC1dLgotICAgIC8vIFtleC1dW2lubGluZSBib3ggc3Rh
cnRdW2xpbmUgYnJlYWtdW2FtcGxlXSAoZXgtPHNwYW4+PGJyPmFtcGxlKS4gV3JhcCBpbmRleCBp
cyBhZnRlciBbYnJdLgotICAgIGF1dG8gcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBPcHRpb25h
bDxzaXplX3Q+IHsgfTsKLSAgICBmb3IgKGF1dG8gaW5kZXggPSBzdGFydEluZGV4OyBpbmRleCA8
IGxheW91dFJhbmdlLmVuZDsgKytpbmRleCkgewotICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0g
bV9pbmxpbmVJdGVtc1tpbmRleF07Ci0gICAgICAgIGlmIChpbmxpbmVJdGVtLmlzTGluZUJyZWFr
KCkgfHwgaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkpIHsKLSAgICAgICAgICAg
IC8vIFdlIGFsd2F5cyBzdG9wIGF0IGV4cGxpY2l0IHdyYXBwaW5nIG9wcG9ydHVuaXRpZXMgZS5n
LiA8YnI+LiBIb3dldmVyIHRoZSB3cmFwIHBvc2l0aW9uIG1heSBiZSBhdCBsYXRlciBwb3NpdGlv
bi4KLSAgICAgICAgICAgIC8vIGUuZy4gPHNwYW4+PHNwYW4+PGJyPjwvc3Bhbj48L3NwYW4+IDwt
IHdyYXAgcG9zaXRpb24gaXMgYWZ0ZXIgdGhlIHNlY29uZCA8L3NwYW4+Ci0gICAgICAgICAgICAv
LyBidXQgaW4gY2FzZSBvZiA8c3Bhbj48YnI+PHNwYW4+PC9zcGFuPjwvc3Bhbj4gPC0gd3JhcCBw
b3NpdGlvbiBpcyByaWdodCBhZnRlciA8YnI+LgotICAgICAgICAgICAgZm9yICgrK2luZGV4OyBp
bmRleCA8IGxheW91dFJhbmdlLmVuZCAmJiBtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJv
eEVuZCgpOyArK2luZGV4KSB7IH0KLSAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAg
fQotICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRl
bS5pc0lubGluZUJveEVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBOZWVkIHRvIHNlZSB3aGF0IGNv
bWVzIG5leHQgdG8gZGVjaWRlLgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAg
ICAgICAgQVNTRVJUKGlubGluZUl0ZW0uaXNUZXh0KCkgfHwgaW5saW5lSXRlbS5pc0JveCgpIHx8
IGlubGluZUl0ZW0uaXNGbG9hdCgpKTsKLSAgICAgICAgaWYgKCFwcmV2aW91c0lubGluZUl0ZW1J
bmRleCkgewotICAgICAgICAgICAgcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBpbmRleDsKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQg
cHJldmlvdXMgYW5kIGN1cnJlbnQgaXRlbXMgYXJlIG5vdCBuZWNlc3NhcmlseSBhZGphY2VudCBp
dGVtcyBlLmcgInByZXZpb3VzPHNwYW4+Y3VycmVudDwvc3Bhbj4iCi0gICAgICAgIGF1dG8mIHBy
ZXZpb3VzSXRlbSA9IG1faW5saW5lSXRlbXNbKnByZXZpb3VzSW5saW5lSXRlbUluZGV4XTsKLSAg
ICAgICAgYXV0byYgY3VycmVudEl0ZW0gPSBtX2lubGluZUl0ZW1zW2luZGV4XTsKLSAgICAgICAg
aWYgKGlzQXRTb2Z0V3JhcE9wcG9ydHVuaXR5KG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQsIHBy
ZXZpb3VzSXRlbSwgY3VycmVudEl0ZW0pKSB7Ci0gICAgICAgICAgICBpZiAoKnByZXZpb3VzSW5s
aW5lSXRlbUluZGV4ICsgMSA9PSBpbmRleCAmJiAoIXByZXZpb3VzSXRlbS5pc1RleHQoKSB8fCAh
Y3VycmVudEl0ZW0uaXNUZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugb25seSBrbm93
IHRoZSBleGFjdCBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgaW5kZXggd2hlbiB0aGUgcHJldmlvdXMg
YW5kIGN1cnJlbnQgaXRlbXMgYXJlIG5leHQgdG8gZWFjaCBvdGhlci4KLSAgICAgICAgICAgICAg
ICByZXR1cm4gaW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGVyZSdzIGEg
c29mdCB3cmFwIG9wcG9ydHVuaXR5IGJldHdlZW4gJ3ByZXZpb3VzSW5saW5lSXRlbUluZGV4JyBh
bmQgJ2luZGV4Jy4KLSAgICAgICAgICAgIC8vIE5vdyBmb3J3YXJkLWZpbmQgZnJvbSB0aGUgc3Rh
cnQgcG9zaXRpb24gdG8gc2VlIHdoZXJlIHdlIGNhbiBhY3R1YWxseSB3cmFwLgotICAgICAgICAg
ICAgLy8gW2V4LV1bYW1wbGVdIHZzLiBbZXgtXVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94
IGVuZF1bYW1wbGVdCi0gICAgICAgICAgICAvLyB3aGVyZSBbZXgtXSBpcyBzdGFydENvbnRlbnQg
YW5kIFthbXBsZV0gaXMgdGhlIG5leHRDb250ZW50LgotICAgICAgICAgICAgZm9yIChhdXRvIGNh
bmRpZGF0ZUluZGV4ID0gKnByZXZpb3VzSW5saW5lSXRlbUluZGV4ICsgMTsgY2FuZGlkYXRlSW5k
ZXggPCBpbmRleDsgKytjYW5kaWRhdGVJbmRleCkgewotICAgICAgICAgICAgICAgIGlmIChtX2lu
bGluZUl0ZW1zW2NhbmRpZGF0ZUluZGV4XS5pc0lubGluZUJveFN0YXJ0KCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgLy8gaW5saW5lIGNvbnRlbnQgYW5kIFtpbmxpbmUgYm94IHN0YXJ0XSBhbmQg
W2lubGluZSBib3ggZW5kXSBmb3JtIHVuYnJlYWthYmxlIGNvbnRlbnQuCi0gICAgICAgICAgICAg
ICAgICAgIC8vIGV4LTxzcGFuPjwvc3Bhbj5hbXBsZSAgOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFm
dGVyICJleC0iLgotICAgICAgICAgICAgICAgICAgICAvLyBleC08L3NwYW4+PC9zcGFuPmFtcGxl
IDogd3JhcCBvcHBvcnR1bml0eSBpcyBhZnRlciAiZXgtPC9zcGFuPjwvc3Bhbj4iLgotICAgICAg
ICAgICAgICAgICAgICAvLyBleC08L3NwYW4+PHNwYW4+YW1wbGU8L3NwYW4+IDogd3JhcCBvcHBv
cnR1bml0eSBpcyBhZnRlciAiZXgtPC9zcGFuPiIuCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4
LTxzcGFuPjxzcGFuPmFtcGxlPC9zcGFuPjwvc3Bhbj4gOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFm
dGVyICJleC0iLgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlSW5kZXg7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluZGV4
OwotICAgICAgICB9Ci0gICAgICAgIHByZXZpb3VzSW5saW5lSXRlbUluZGV4ID0gaW5kZXg7Ci0g
ICAgfQotICAgIHJldHVybiBsYXlvdXRSYW5nZS5lbmQ7Ci19Ci0KLXZvaWQgTGluZUJ1aWxkZXI6
OmhhbmRsZUZsb2F0Q29udGVudChjb25zdCBJbmxpbmVJdGVtJiBmbG9hdEl0ZW0pCi17Ci0gICAg
YXV0byYgZmxvYXRCb3ggPSBmbG9hdEl0ZW0ubGF5b3V0Qm94KCk7Ci0gICAgbV9mbG9hdHMuYXBw
ZW5kKCZmbG9hdEJveCk7Ci0KLSAgICBhdXRvKiBmbG9hdGluZ1N0YXRlID0gdGhpcy0+ZmxvYXRp
bmdTdGF0ZSgpOwotICAgIGlmICghZmxvYXRpbmdTdGF0ZSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgQVNTRVJUKGZvcm1hdHRpbmdTdGF0ZSgpKTsKLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZv
cm1hdHRpbmdTdGF0ZSgpLT5ib3hHZW9tZXRyeShmbG9hdEJveCk7Ci0gICAgLy8gU2V0IHN0YXRp
YyBwb3NpdGlvbiBmaXJzdC4KLSAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVmdChMYXlv
dXRQb2ludCB7IG1fbGluZUxvZ2ljYWxSZWN0LnRvcExlZnQoKSB9KTsKLSAgICAvLyBGbG9hdCBp
dC4KLSAgICBBU1NFUlQobV9yb290SG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICBhdXRvIGZs
b2F0aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7IGZvcm1hdHRpbmdDb250ZXh0KCksICpm
bG9hdGluZ1N0YXRlIH07Ci0gICAgYXV0byBmbG9hdGluZ1Bvc2l0aW9uID0gZmxvYXRpbmdDb250
ZXh0LnBvc2l0aW9uRm9yRmxvYXQoZmxvYXRCb3gsICptX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWlu
dHMpOwotICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nUG9zaXRpb24p
OwotICAgIGZsb2F0aW5nU3RhdGUtPmFwcGVuZChmbG9hdGluZ0NvbnRleHQudG9GbG9hdEl0ZW0o
ZmxvYXRCb3gpKTsKLSAgICAvLyBDaGVjayBpZiB0aGlzIGZsb2F0IHNocmlua3MgdGhlIGxpbmUg
KHRoZXkgZG9uJ3QgZ2V0IHBvc2l0aW9uZWQgaGlnaGVyIHRoYW4gdGhlIGxpbmUpLgotICAgIGlm
IChmbG9hdGluZ1Bvc2l0aW9uLnkoKSA+IG1fbGluZUxvZ2ljYWxSZWN0LmJvdHRvbSgpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IHRydWU7
Ci0gICAgYXV0byBmbG9hdEJveFdpZHRoID0gaW5saW5lSXRlbVdpZHRoKGZsb2F0SXRlbSwgeyB9
KTsKLSAgICBpZiAoZmxvYXRCb3guaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAg
IG1fbGluZUxvZ2ljYWxSZWN0LnNldExlZnQobV9saW5lTG9naWNhbFJlY3QubGVmdCgpICsgZmxv
YXRCb3hXaWR0aCk7ICAgIAotICAgIG1fbGluZUxvZ2ljYWxSZWN0LmV4cGFuZEhvcml6b250YWxs
eSgtZmxvYXRCb3hXaWR0aCk7Ci19Ci0KLUxpbmVCdWlsZGVyOjpSZXN1bHQgTGluZUJ1aWxkZXI6
OmhhbmRsZUlubGluZUNvbnRlbnQoSW5saW5lQ29udGVudEJyZWFrZXImIGlubGluZUNvbnRlbnRC
cmVha2VyLCBjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBjb25zdCBMaW5lQ2Fu
ZGlkYXRlJiBsaW5lQ2FuZGlkYXRlKQotewotICAgIGF1dG8mIGlubGluZUNvbnRlbnQgPSBsaW5l
Q2FuZGlkYXRlLmlubGluZUNvbnRlbnQ7Ci0gICAgaWYgKGlubGluZUNvbnRlbnQuY29udGludW91
c0NvbnRlbnQoKS5ydW5zKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFTU0VSVChpbmxpbmVDb250
ZW50LnRyYWlsaW5nTGluZUJyZWFrKCkgfHwgaW5saW5lQ29udGVudC50cmFpbGluZ1dvcmRCcmVh
a09wcG9ydHVuaXR5KCkpOwotICAgICAgICByZXR1cm4geyBpbmxpbmVDb250ZW50LnRyYWlsaW5n
TGluZUJyZWFrKCkgPyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllcyA6IElu
bGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6Tm8gfTsKLSAgICB9Ci0gICAgYXV0byBz
aG91bGREaXNhYmxlSHlwaGVuYXRpb24gPSBbJl0gewotICAgICAgICBhdXRvJiBzdHlsZSA9IHJv
b3QoKS5zdHlsZSgpOwotICAgICAgICB1bnNpZ25lZCBsaW1pdExpbmVzID0gc3R5bGUuaHlwaGVu
YXRpb25MaW1pdExpbmVzKCkgPT0gUmVuZGVyU3R5bGU6OmluaXRpYWxIeXBoZW5hdGlvbkxpbWl0
TGluZXMoKSA/IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSA6IHN0eWxlLmh5
cGhlbmF0aW9uTGltaXRMaW5lcygpOwotICAgICAgICByZXR1cm4gbV9zdWNjZXNzaXZlSHlwaGVu
YXRlZExpbmVDb3VudCA+PSBsaW1pdExpbmVzOwotICAgIH07Ci0gICAgaWYgKHNob3VsZERpc2Fi
bGVIeXBoZW5hdGlvbigpKQotICAgICAgICBpbmxpbmVDb250ZW50QnJlYWtlci5zZXRIeXBoZW5h
dGlvbkRpc2FibGVkKCk7Ci0KLSAgICBhdXRvJiBjb250aW51b3VzSW5saW5lQ29udGVudCA9IGxp
bmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5jb250aW51b3VzQ29udGVudCgpOwotICAgIGF1dG8g
bGluZUxvZ2ljYWxSZWN0Rm9yQ2FuZGlkYXRlQ29udGVudCA9IFsmXSB7Ci0gICAgICAgIC8vIENo
ZWNrIGlmIHRoZSBjYW5kaWRhdGUgY29udGVudCB3b3VsZCBzdHJldGNoIHRoZSBsaW5lIGFuZCB3
aGV0aGVyIGFkZGl0aW9uYWwgZmxvYXRzIGFyZSBnZXR0aW5nIGluIHRoZSB3YXkuCi0gICAgICAg
IGlmICghZmxvYXRpbmdTdGF0ZSgpIHx8ICFpbmxpbmVDb250ZW50Lmhhc0lubGluZUxldmVsQm94
KCkpCi0gICAgICAgICAgICByZXR1cm4gbV9saW5lTG9naWNhbFJlY3Q7Ci0gICAgICAgIGF1dG8g
bWF4aW11bUxpbmVMb2dpY2FsSGVpZ2h0ID0gbV9saW5lTG9naWNhbFJlY3QuaGVpZ2h0KCk7Ci0g
ICAgICAgIGZvciAoYXV0byYgcnVuIDogY29udGludW91c0lubGluZUNvbnRlbnQucnVucygpKSB7
Ci0gICAgICAgICAgICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIGlubGluZSBib3hlcyB0b28u
Ci0gICAgICAgICAgICBpZiAoIXJ1bi5pbmxpbmVJdGVtLmlzQm94KCkpCi0gICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICBtYXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQgPSBzdGQ6
Om1heChtYXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQsIElubGluZUxheW91dFVuaXQgeyBmb3JtYXR0
aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KHJ1bi5pbmxpbmVJdGVtLmxheW91dEJveCgpKS5t
YXJnaW5Cb3hIZWlnaHQoKSB9KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF4aW11bUxpbmVM
b2dpY2FsSGVpZ2h0ID09IG1fbGluZUxvZ2ljYWxSZWN0LmhlaWdodCgpKQotICAgICAgICAgICAg
cmV0dXJuIG1fbGluZUxvZ2ljYWxSZWN0OwotICAgICAgICBhdXRvIGFkanVzdGVkTGluZUxvZ2lj
YWxSZWN0ID0gSW5saW5lUmVjdCB7IG1fbGluZUxvZ2ljYWxSZWN0LnRvcCgpLCBtX2xpbmVMb2dp
Y2FsUmVjdC5sZWZ0KCksIG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCksIG1heGltdW1MaW5lTG9n
aWNhbEhlaWdodCB9OwotICAgICAgICBpZiAoYXV0byBob3Jpem9udGFsQ29uc3RyYWludHMgPSBm
bG9hdENvbnN0cmFpbnRzKGFkanVzdGVkTGluZUxvZ2ljYWxSZWN0KSkgewotICAgICAgICAgICAg
YWRqdXN0ZWRMaW5lTG9naWNhbFJlY3Quc2V0TGVmdChob3Jpem9udGFsQ29uc3RyYWludHMtPmxv
Z2ljYWxMZWZ0KTsKLSAgICAgICAgICAgIGFkanVzdGVkTGluZUxvZ2ljYWxSZWN0LnNldFdpZHRo
KGhvcml6b250YWxDb25zdHJhaW50cy0+bG9naWNhbFdpZHRoKTsKLSAgICAgICAgfQotICAgICAg
ICByZXR1cm4gYWRqdXN0ZWRMaW5lTG9naWNhbFJlY3Q7Ci0gICAgfSgpOwotICAgIGF1dG8gYXZh
aWxhYmxlV2lkdGggPSBbJl0gewotICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoRm9yQ29udGVu
dCA9IGxpbmVMb2dpY2FsUmVjdEZvckNhbmRpZGF0ZUNvbnRlbnQud2lkdGgoKSAtIG1fbGluZS5j
b250ZW50TG9naWNhbFJpZ2h0KCk7Ci0gICAgICAgIHJldHVybiBzdGQ6OmlzbmFuKGF2YWlsYWJs
ZVdpZHRoRm9yQ29udGVudCkgPyBtYXhJbmxpbmVMYXlvdXRVbml0KCkgOiBhdmFpbGFibGVXaWR0
aEZvckNvbnRlbnQ7Ci0gICAgfSgpOwotICAgIC8vIFdoaWxlIHRoZSBmbG9hdHMgYXJlIG5vdCBj
b25zaWRlcmVkIHRvIGJlIG9uIHRoZSBsaW5lLCB0aGV5IG1ha2UgdGhlIGxpbmUgY29udGVudGZ1
bCBmb3IgbGluZSBicmVha2luZy4KLSAgICBhdXRvIGxpbmVIYXNDb250ZW50ID0gIW1fbGluZS5y
dW5zKCkuaXNFbXB0eSgpIHx8IG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0OwotICAgIGF1
dG8gbGluZVN0YXR1cyA9IElubGluZUNvbnRlbnRCcmVha2VyOjpMaW5lU3RhdHVzIHsgbV9saW5l
LmNvbnRlbnRMb2dpY2FsUmlnaHQoKSwgYXZhaWxhYmxlV2lkdGgsIG1fbGluZS50cmltbWFibGVU
cmFpbGluZ1dpZHRoKCksIG1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpLCBtX2xpbmUu
aXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxlKCksIGxpbmVIYXNDb250ZW50LCAhbV93cmFwT3Bw
b3J0dW5pdHlMaXN0LmlzRW1wdHkoKSB9OwotICAgIGF1dG8gcmVzdWx0ID0gaW5saW5lQ29udGVu
dEJyZWFrZXIucHJvY2Vzc0lubGluZUNvbnRlbnQoY29udGludW91c0lubGluZUNvbnRlbnQsIGxp
bmVTdGF0dXMpOwotICAgIGF1dG8mIGNhbmRpZGF0ZVJ1bnMgPSBjb250aW51b3VzSW5saW5lQ29u
dGVudC5ydW5zKCk7Ci0gICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFr
ZXI6OlJlc3VsdDo6QWN0aW9uOjpLZWVwKSB7Ci0gICAgICAgIC8vIFRoaXMgY29udGludW91cyBj
b250ZW50IGNhbiBiZSBmdWxseSBwbGFjZWQgb24gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAg
bV9saW5lTG9naWNhbFJlY3QgPSBsaW5lTG9naWNhbFJlY3RGb3JDYW5kaWRhdGVDb250ZW50Owot
ICAgICAgICBmb3IgKGF1dG8mIHJ1biA6IGNhbmRpZGF0ZVJ1bnMpCi0gICAgICAgICAgICBtX2xp
bmUuYXBwZW5kKHJ1bi5pbmxpbmVJdGVtLCBydW4ubG9naWNhbFdpZHRoKTsKLSAgICAgICAgaWYg
KGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5p
dHkoKSkgewotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGFsbG93ZWQgdG8gd3JhcCBh
dCB0aGlzIHBvc2l0aW9uLgotICAgICAgICAgICAgYXV0byYgdHJhaWxpbmdJdGVtID0gY2FuZGlk
YXRlUnVucy5sYXN0KCkuaW5saW5lSXRlbTsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBUaGVyZSBt
dXN0IGJlIGEgd2F5IHRvIGRlY2lkZSBpZiB0aGUgdHJhaWxpbmcgcnVuIGFjdHVhbGx5IGVuZGVk
IHVwIG9uIHRoZSBsaW5lLgotICAgICAgICAgICAgLy8gTGV0J3MganVzdCBkZWFsIHdpdGggY29s
bGFwc2VkIGxlYWRpbmcgd2hpdGVzcGFjZSBmb3Igbm93LgotICAgICAgICAgICAgaWYgKCFtX2xp
bmUucnVucygpLmlzRW1wdHkoKSAmJiBJbmxpbmVDb250ZW50QnJlYWtlcjo6aXNXcmFwcGluZ0Fs
bG93ZWQodHJhaWxpbmdJdGVtKSkKLSAgICAgICAgICAgICAgICBtX3dyYXBPcHBvcnR1bml0eUxp
c3QuYXBwZW5kKCZ0cmFpbGluZ0l0ZW0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB7IHJl
c3VsdC5pc0VuZE9mTGluZSwgeyBjYW5kaWRhdGVSdW5zLnNpemUoKSwgZmFsc2UgfSB9OwotICAg
IH0KLQotICAgIGF1dG8gZWxpZ2libGVPdmVyZmxvd1dpZHRoQXNMZWFkaW5nID0gWyZdICgpIC0+
IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsKLSAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBw
b3J0IGZvciBvdGhlciB0eXBlcyBvZiBjb250aW51b3VzIGNvbnRlbnQuCi0gICAgICAgIEFTU0VS
VChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6
V3JhcCB8fCByZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFj
dGlvbjo6QnJlYWspOwotICAgICAgICBpZiAoY2FuZGlkYXRlUnVucy5zaXplKCkgIT0gMSB8fCAh
Y2FuZGlkYXRlUnVucy5maXJzdCgpLmlubGluZUl0ZW0uaXNUZXh0KCkpCi0gICAgICAgICAgICBy
ZXR1cm4geyB9OwotICAgICAgICBhdXRvJiBpbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGlu
ZVRleHRJdGVtPihjYW5kaWRhdGVSdW5zLmZpcnN0KCkuaW5saW5lSXRlbSk7Ci0gICAgICAgIGlm
IChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKLSAgICAgICAgICAgIHJldHVybiB7IH07
Ci0gICAgICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1
bHQ6OkFjdGlvbjo6V3JhcCkKLSAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVSdW5zLmZpcnN0
KCkubG9naWNhbFdpZHRoOwotICAgICAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250
ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rpb246OkJyZWFrICYmIHJlc3VsdC5wYXJ0aWFsVHJhaWxp
bmdDb250ZW50LT5wYXJ0aWFsUnVuKQotICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVJ1bnMu
Zmlyc3QoKS5sb2dpY2FsV2lkdGggLSByZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+cGFy
dGlhbFJ1bi0+bG9naWNhbFdpZHRoOwotICAgICAgICByZXR1cm4geyB9OwotICAgIH07Ci0KLSAg
ICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rp
b246OldyYXApIHsKLSAgICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVD
b250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olllcyk7Ci0gICAgICAgIC8vIFRoaXMgY29udGlu
dW91cyBjb250ZW50IGNhbid0IGJlIHBsYWNlZCBvbiB0aGUgY3VycmVudCBsaW5lLiBOb3RoaW5n
IHRvIGNvbW1pdCBhdCB0aGlzIHRpbWUuCi0gICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRC
cmVha2VyOjpJc0VuZE9mTGluZTo6WWVzLCB7IH0sIHsgfSwgZWxpZ2libGVPdmVyZmxvd1dpZHRo
QXNMZWFkaW5nKCkgfTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29u
dGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpXcmFwV2l0aEh5cGhlbikgewotICAgICAgICBB
U1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9m
TGluZTo6WWVzKTsKLSAgICAgICAgLy8gVGhpcyBjb250aW51b3VzIGNvbnRlbnQgY2FuJ3QgYmUg
cGxhY2VkIG9uIHRoZSBjdXJyZW50IGxpbmUsIG5vdGhpbmcgdG8gY29tbWl0LgotICAgICAgICAv
LyBIb3dldmVyIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGN1cnJlbnQgbGluZSBnYWlu
cyBhIHRyYWlsaW5nIGh5cGhlbi4KLSAgICAgICAgQVNTRVJUKG1fbGluZS50cmFpbGluZ1NvZnRI
eXBoZW5XaWR0aCgpKTsKLSAgICAgICAgbV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCptX2xpbmUu
dHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgoKSk7Ci0gICAgICAgIHJldHVybiB7IElubGluZUNvbnRl
bnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzIH07Ci0gICAgfQotICAgIGlmIChyZXN1bHQuYWN0
aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0
V3JhcE9wcG9ydHVuaXR5KSB7Ci0gICAgICAgIEFTU0VSVChyZXN1bHQuaXNFbmRPZkxpbmUgPT0g
SW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMpOwotICAgICAgICAvLyBOb3Qg
b25seSB0aGlzIGNvbnRlbnQgY2FuJ3QgYmUgcGxhY2VkIG9uIHRoZSBjdXJyZW50IGxpbmUsIGJ1
dCB3ZSBldmVuIG5lZWQgdG8gcmV2ZXJ0IHRoZSBsaW5lIGJhY2sgdG8gYW4gZWFybGllciBwb3Np
dGlvbi4KLSAgICAgICAgQVNTRVJUKCFtX3dyYXBPcHBvcnR1bml0eUxpc3QuaXNFbXB0eSgpKTsK
LSAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMs
IHsgcmVidWlsZExpbmUobGF5b3V0UmFuZ2UsICptX3dyYXBPcHBvcnR1bml0eUxpc3QubGFzdCgp
KSwgdHJ1ZSB9IH07Ci0gICAgfQotICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRl
bnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0Tm9uT3ZlcmZsb3dpbmdXcmFw
T3Bwb3J0dW5pdHkpIHsKLSAgICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxp
bmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olllcyk7Ci0gICAgICAgIEFTU0VSVCghbV93
cmFwT3Bwb3J0dW5pdHlMaXN0LmlzRW1wdHkoKSk7Ci0gICAgICAgIHJldHVybiB7IElubGluZUNv
bnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzLCB7IHJlYnVpbGRMaW5lRm9yVHJhaWxpbmdT
b2Z0SHlwaGVuKGxheW91dFJhbmdlKSwgdHJ1ZSB9IH07Ci0gICAgfQotICAgIGlmIChyZXN1bHQu
YWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6QnJlYWspIHsK
LSAgICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtl
cjo6SXNFbmRPZkxpbmU6Olllcyk7Ci0gICAgICAgIC8vIENvbW1pdCB0aGUgY29tYmluYXRpb24g
b2YgZnVsbCBhbmQgcGFydGlhbCBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAg
IEFTU0VSVChyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudCk7Ci0gICAgICAgIGNvbW1pdFBh
cnRpYWxDb250ZW50KGNhbmRpZGF0ZVJ1bnMsICpyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVu
dCk7Ci0gICAgICAgIC8vIFdoZW4gYnJlYWtpbmcgbXVsdGlwbGUgcnVucyA8c3BhbiBzdHlsZT0i
d29yZC1icmVhazogYnJlYWstYWxsIj50ZXh0PC9zcGFuPjxzcGFuPmNvbnRlbnQ8L3NwYW4+LCB3
ZSBtaWdodCBlbmQgdXAgYnJlYWtpbmcgdGhlbSBhdCBydW4gYm91bmRhcnkuCi0gICAgICAgIC8v
IEl0IHNpbXBseSBtZWFucyB3ZSBkb24ndCByZWFsbHkgaGF2ZSBhIHBhcnRpYWwgcnVuLiBQYXJ0
aWFsIGNvbnRlbnQgeWVzLCBidXQgbm90IHBhcnRpYWwgcnVuLgotICAgICAgICBhdXRvIHRyYWls
aW5nUnVuSW5kZXggPSByZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+dHJhaWxpbmdSdW5J
bmRleDsKLSAgICAgICAgYXV0byBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgPSB0cmFpbGluZ1J1
bkluZGV4ICsgMTsKLSAgICAgICAgaWYgKCFyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+
cGFydGlhbFJ1bikKLSAgICAgICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJ
c0VuZE9mTGluZTo6WWVzLCB7IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCwgZmFsc2UgfSB9Owot
Ci0gICAgICAgIGF1dG8gcGFydGlhbFJ1biA9ICpyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVu
dC0+cGFydGlhbFJ1bjsKLSAgICAgICAgYXV0byYgdHJhaWxpbmdJbmxpbmVUZXh0SXRlbSA9IGRv
d25jYXN0PElubGluZVRleHRJdGVtPihjYW5kaWRhdGVSdW5zW3RyYWlsaW5nUnVuSW5kZXhdLmlu
bGluZUl0ZW0pOwotICAgICAgICBBU1NFUlQocGFydGlhbFJ1bi5sZW5ndGggPCB0cmFpbGluZ0lu
bGluZVRleHRJdGVtLmxlbmd0aCgpKTsKLSAgICAgICAgYXV0byBvdmVyZmxvd0xlbmd0aCA9IHRy
YWlsaW5nSW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkgLSBwYXJ0aWFsUnVuLmxlbmd0aDsKLSAgICAg
ICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgY29t
bWl0dGVkSW5saW5lSXRlbUNvdW50LCBmYWxzZSB9LCBvdmVyZmxvd0xlbmd0aCwgZWxpZ2libGVP
dmVyZmxvd1dpZHRoQXNMZWFkaW5nKCkgfTsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7Ci0gICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9
OwotfQotCi12b2lkIExpbmVCdWlsZGVyOjpjb21taXRQYXJ0aWFsQ29udGVudChjb25zdCBJbmxp
bmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OlJ1bkxpc3QmIHJ1bnMsIGNvbnN0
IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OlBhcnRpYWxUcmFpbGluZ0NvbnRlbnQmIHBh
cnRpYWxUcmFpbGluZ0NvbnRlbnQpCi17Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRl
eCA8IHJ1bnMuc2l6ZSgpOyArK2luZGV4KSB7Ci0gICAgICAgIGF1dG8mIHJ1biA9IHJ1bnNbaW5k
ZXhdOwotICAgICAgICBpZiAocGFydGlhbFRyYWlsaW5nQ29udGVudC50cmFpbGluZ1J1bkluZGV4
ID09IGluZGV4KSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYW5kIGNvbW1pdCBwYXJ0aWFsIHRy
YWlsaW5nIGl0ZW0uCi0gICAgICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gcGFydGlhbFRy
YWlsaW5nQ29udGVudC5wYXJ0aWFsUnVuKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHJ1bi5p
bmxpbmVJdGVtLmlzVGV4dCgpKTsKLSAgICAgICAgICAgICAgICBhdXRvJiB0cmFpbGluZ0lubGlu
ZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KHJ1bnNbcGFydGlhbFRyYWlsaW5n
Q29udGVudC50cmFpbGluZ1J1bkluZGV4XS5pbmxpbmVJdGVtKTsKLSAgICAgICAgICAgICAgICBh
dXRvIHBhcnRpYWxUcmFpbGluZ1RleHRJdGVtID0gdHJhaWxpbmdJbmxpbmVUZXh0SXRlbS5sZWZ0
KHBhcnRpYWxSdW4tPmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbV9saW5lLmFwcGVuZChwYXJ0
aWFsVHJhaWxpbmdUZXh0SXRlbSwgcGFydGlhbFJ1bi0+bG9naWNhbFdpZHRoKTsKLSAgICAgICAg
ICAgICAgICBpZiAoYXV0byBoeXBoZW5XaWR0aCA9IHBhcnRpYWxSdW4tPmh5cGhlbldpZHRoKQot
ICAgICAgICAgICAgICAgICAgICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBoZW4oKmh5cGhlbldpZHRo
KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAv
LyBUaGUgcGFydGlhbCBydW4gaXMgdGhlIGxhc3QgY29udGVudCB0byBjb21taXQuCi0gICAgICAg
ICAgICBtX2xpbmUuYXBwZW5kKHJ1bi5pbmxpbmVJdGVtLCBydW4ubG9naWNhbFdpZHRoKTsKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtX2xpbmUuYXBwZW5kKHJ1bi5p
bmxpbmVJdGVtLCBydW4ubG9naWNhbFdpZHRoKTsKLSAgICB9Ci19Ci0KLXNpemVfdCBMaW5lQnVp
bGRlcjo6cmVidWlsZExpbmUoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsYXlvdXRSYW5nZSwgY29u
c3QgSW5saW5lSXRlbSYgbGFzdElubGluZUl0ZW1Ub0FkZCkKLXsKLSAgICBBU1NFUlQoIW1fd3Jh
cE9wcG9ydHVuaXR5TGlzdC5pc0VtcHR5KCkpOwotICAgIC8vIFdlIG1pZ2h0IGFscmVhZHkgaGF2
ZSBhZGRlZCBmbG9hdHMuIFRoZXkgc2hyaW5rIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFj
ZSBmb3IgdGhlIGxpbmUuCi0gICAgLy8gTGV0J3MganVzdCByZXVzZSB3aGF0IHRoZSBsaW5lIGhh
cyBhdCB0aGlzIHBvaW50LgotICAgIG1fbGluZS5pbml0aWFsaXplKCk7Ci0gICAgYXV0byBjdXJy
ZW50SXRlbUluZGV4ID0gbGF5b3V0UmFuZ2Uuc3RhcnQ7Ci0gICAgaWYgKG1fcGFydGlhbExlYWRp
bmdUZXh0SXRlbSkgewotICAgICAgICBtX2xpbmUuYXBwZW5kKCptX3BhcnRpYWxMZWFkaW5nVGV4
dEl0ZW0sIGlubGluZUl0ZW1XaWR0aCgqbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtLCB7IH0pKTsK
LSAgICAgICAgaWYgKCZtX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0udmFsdWUoKSA9PSAmbGFzdElu
bGluZUl0ZW1Ub0FkZCkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICArK2N1cnJlbnRJ
dGVtSW5kZXg7Ci0gICAgfQotICAgIGZvciAoOyBjdXJyZW50SXRlbUluZGV4IDwgbGF5b3V0UmFu
Z2UuZW5kOyArK2N1cnJlbnRJdGVtSW5kZXgpIHsKLSAgICAgICAgYXV0byYgaW5saW5lSXRlbSA9
IG1faW5saW5lSXRlbXNbY3VycmVudEl0ZW1JbmRleF07Ci0gICAgICAgIG1fbGluZS5hcHBlbmQo
aW5saW5lSXRlbSwgaW5saW5lSXRlbVdpZHRoKGlubGluZUl0ZW0sIG1fbGluZS5jb250ZW50TG9n
aWNhbFJpZ2h0KCkpKTsKLSAgICAgICAgaWYgKCZpbmxpbmVJdGVtID09ICZsYXN0SW5saW5lSXRl
bVRvQWRkKQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJdGVtSW5kZXggLSBsYXlvdXRSYW5n
ZS5zdGFydCArIDE7Ci0gICAgfQotICAgIHJldHVybiBsYXlvdXRSYW5nZS5zaXplKCk7Ci19Ci0K
LXNpemVfdCBMaW5lQnVpbGRlcjo6cmVidWlsZExpbmVGb3JUcmFpbGluZ1NvZnRIeXBoZW4oY29u
c3QgSW5saW5lSXRlbVJhbmdlJiBsYXlvdXRSYW5nZSkKLXsKLSAgICBBU1NFUlQoIW1fd3JhcE9w
cG9ydHVuaXR5TGlzdC5pc0VtcHR5KCkpOwotICAgIC8vIFJldmVydCBhbGwgdGhlIHdheSBiYWNr
IHRvIGEgd3JhcCBvcHBvcnR1bml0eSB3aGVuIGVpdGhlciBhIHNvZnQgaHlwaGVuIGZpdHMgb3Ig
bm8gaHlwaGVuIGlzIHJlcXVpcmVkLgotICAgIGZvciAoYXV0byBpID0gbV93cmFwT3Bwb3J0dW5p
dHlMaXN0LnNpemUoKTsgaS0tID4gMTspIHsKLSAgICAgICAgYXV0byYgc29mdFdyYXBPcHBvcnR1
bml0eUl0ZW0gPSAqbV93cmFwT3Bwb3J0dW5pdHlMaXN0W2ldOwotICAgICAgICAvLyBGSVhNRTog
SWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgYSBwZXJmIGlzc3VlLCB3ZSBjb3VsZCBhbHNvIHRyYXZl
cnNlIHRoZSB3cmFwIGxpc3QgYW5kIGtlZXAgYWRkaW5nIHRoZSBpdGVtcwotICAgICAgICAvLyB3
aGlsZSB3YXRjaGluZyB0aGUgYXZhaWxhYmxlIHdpZHRoIHZlcnkgY2xvc2VseS4KLSAgICAgICAg
YXV0byBjb21taXR0ZWRDb3VudCA9IHJlYnVpbGRMaW5lKGxheW91dFJhbmdlLCBzb2Z0V3JhcE9w
cG9ydHVuaXR5SXRlbSk7Ci0gICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBtX2xpbmVMb2dp
Y2FsUmVjdC53aWR0aCgpIC0gbV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKTsKLSAgICAgICAg
YXV0byB0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IG1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5X
aWR0aCgpOwotICAgICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaWxpbmcgaHlwaGVuIG5vdyBmaXRz
IHRoZSBsaW5lIChvciB3ZSBkb24ndCBuZWVkIGh5aGVuIGFueW1vcmUpLgotICAgICAgICBpZiAo
IXRyYWlsaW5nU29mdEh5cGhlbldpZHRoIHx8IHRyYWlsaW5nU29mdEh5cGhlbldpZHRoIDw9IGF2
YWlsYWJsZVdpZHRoKSB7Ci0gICAgICAgICAgICBpZiAodHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgp
Ci0gICAgICAgICAgICAgICAgbV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCp0cmFpbGluZ1NvZnRI
eXBoZW5XaWR0aCk7Ci0gICAgICAgICAgICByZXR1cm4gY29tbWl0dGVkQ291bnQ7Ci0gICAgICAg
IH0KLSAgICB9Ci0gICAgLy8gSGF2ZSBhdCBsZWFzdCBzb21lIGNvbnRlbnQgb24gdGhlIGxpbmUu
Ci0gICAgYXV0byBjb21taXR0ZWRDb3VudCA9IHJlYnVpbGRMaW5lKGxheW91dFJhbmdlLCAqbV93
cmFwT3Bwb3J0dW5pdHlMaXN0LmZpcnN0KCkpOwotICAgIGlmIChhdXRvIHRyYWlsaW5nU29mdEh5
cGhlbldpZHRoID0gbV9saW5lLnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCkpCi0gICAgICAgIG1f
bGluZS5hZGRUcmFpbGluZ0h5cGhlbigqdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgpOwotICAgIHJl
dHVybiBjb21taXR0ZWRDb3VudDsKLX0KLQotYm9vbCBMaW5lQnVpbGRlcjo6aXNMYXN0TGluZVdp
dGhJbmxpbmVDb250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGluZVJhbmdlLCBzaXplX3Qg
bGFzdElubGluZUl0ZW1JbmRleCwgYm9vbCBoYXNQYXJ0aWFsVHJhaWxpbmdDb250ZW50KSBjb25z
dAotewotICAgIGlmIChoYXNQYXJ0aWFsVHJhaWxpbmdDb250ZW50KQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgaWYgKGxpbmVSYW5nZS5lbmQgPT0gbGFzdElubGluZUl0ZW1JbmRleCkKLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgLy8gT21pdCBmbG9hdHMgdG8gc2VlIGlmIHRoaXMgaXMg
dGhlIGxhc3QgbGluZSB3aXRoIGlubGluZSBjb250ZW50LgotICAgIGZvciAoYXV0byBpID0gbGFz
dElubGluZUl0ZW1JbmRleDsgaS0tOykgewotICAgICAgICBpZiAoIW1faW5saW5lSXRlbXNbaV0u
aXNGbG9hdCgpKQotICAgICAgICAgICAgcmV0dXJuIGkgPT0gbGluZVJhbmdlLmVuZCAtIDE7Ci0g
ICAgfQotICAgIC8vIFRoZXJlIGhhcyB0byBiZSBhdCBsZWFzdCBvbmUgbm9uLWZsb2F0IGl0ZW0u
Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1jb25z
dCBDb250YWluZXJCb3gmIExpbmVCdWlsZGVyOjpyb290KCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Zm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCk7Ci19Ci0KLWNvbnN0IExheW91dFN0YXRlJiBMaW5l
QnVpbGRlcjo6bGF5b3V0U3RhdGUoKSBjb25zdAotewotICAgIHJldHVybiBmb3JtYXR0aW5nQ29u
dGV4dCgpLmxheW91dFN0YXRlKCk7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5o
IGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxk
ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyMTcxNTA1ZWZmYjQyZmRmMGIz
MjE2NDNiMzQzZDhjNTVmY2FlZi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVM
aW5lQnVpbGRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgot
ICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgot
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAq
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwot
Ci0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQot
Ci0jaW5jbHVkZSAiSW5saW5lQ29udGVudEJyZWFrZXIuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3Jt
YXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5lLmgiCi0KLW5hbWVzcGFjZSBXZWJD
b3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBGbG9hdGluZ0NvbnRleHQ7Ci1zdHJ1
Y3QgTGluZUNhbmRpZGF0ZTsKLQotY2xhc3MgTGluZUJ1aWxkZXIgewotcHVibGljOgotICAgIExp
bmVCdWlsZGVyKElubGluZUZvcm1hdHRpbmdDb250ZXh0JiwgRmxvYXRpbmdTdGF0ZSYsIEhvcml6
b250YWxDb25zdHJhaW50cyByb290SG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBJbmxpbmVJ
dGVtcyYpOwotICAgIExpbmVCdWlsZGVyKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Jiwg
Y29uc3QgSW5saW5lSXRlbXMmKTsKLQotICAgIHN0cnVjdCBJbmxpbmVJdGVtUmFuZ2UgewotICAg
ICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBzdGFydCA9PSBlbmQ7IH0KLSAgICAg
ICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBlbmQgLSBzdGFydDsgfQotICAgICAgICBz
aXplX3Qgc3RhcnQgeyAwIH07Ci0gICAgICAgIHNpemVfdCBlbmQgeyAwIH07Ci0gICAgfTsKLSAg
ICB1c2luZyBGbG9hdExpc3QgPSBWZWN0b3I8Y29uc3QgQm94Kj47Ci0gICAgc3RydWN0IExpbmVD
b250ZW50IHsKLSAgICAgICAgSW5saW5lSXRlbVJhbmdlIGlubGluZUl0ZW1SYW5nZTsKLSAgICAg
ICAgc2l6ZV90IHBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGggeyAwIH07Ci0gICAgICAgIE9w
dGlvbmFsPElubGluZUxheW91dFVuaXQ+IG92ZXJmbG93TG9naWNhbFdpZHRoOwotICAgICAgICBj
b25zdCBGbG9hdExpc3QmIGZsb2F0czsKLSAgICAgICAgYm9vbCBoYXNJbnRydXNpdmVGbG9hdCB7
IGZhbHNlIH07Ci0gICAgICAgIElubGluZUxheW91dFBvaW50IGxvZ2ljYWxUb3BMZWZ0OwotICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IGxpbmVMb2dpY2FsV2lkdGg7Ci0gICAgICAgIElubGluZUxh
eW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aDsKLSAgICAgICAgYm9vbCBpc0xhc3RMaW5lV2l0
aElubGluZUNvbnRlbnQgeyB0cnVlIH07Ci0gICAgICAgIHNpemVfdCBub25TcGFubmluZ0lubGlu
ZUxldmVsQm94Q291bnQgeyAwIH07Ci0gICAgICAgIGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnM7
Ci0gICAgfTsKLSAgICBMaW5lQ29udGVudCBsYXlvdXRJbmxpbmVDb250ZW50KGNvbnN0IElubGlu
ZUl0ZW1SYW5nZSYsIHNpemVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFs
PElubGluZUxheW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgsIGNvbnN0IElubGluZVJlY3Qm
IGluaXRpYWxMaW5lTG9naWNhbFJlY3QsIGJvb2wgaXNGaXJzdExpbmUpOwotCi0gICAgc3RydWN0
IEludHJpbnNpY0NvbnRlbnQgewotICAgICAgICBJbmxpbmVJdGVtUmFuZ2UgaW5saW5lSXRlbVJh
bmdlOwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICAg
ICAgY29uc3QgRmxvYXRMaXN0JiBmbG9hdHM7Ci0gICAgfTsKLSAgICBJbnRyaW5zaWNDb250ZW50
IGNvbXB1dGVkSW50cmluc2ljV2lkdGgoY29uc3QgSW5saW5lSXRlbVJhbmdlJiwgSW5saW5lTGF5
b3V0VW5pdCBhdmFpbGFibGVXaWR0aCk7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBjYW5kaWRhdGVD
b250ZW50Rm9yTGluZShMaW5lQ2FuZGlkYXRlJiwgc2l6ZV90IGlubGluZUl0ZW1JbmRleCwgY29u
c3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBzaXplX3Qgb3ZlcmZsb3dMZW5n
dGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgsIElubGlu
ZUxheW91dFVuaXQgY3VycmVudExvZ2ljYWxSaWdodCk7Ci0gICAgc2l6ZV90IG5leHRXcmFwT3Bw
b3J0dW5pdHkoc2l6ZV90IHN0YXJ0SW5kZXgsIGNvbnN0IExpbmVCdWlsZGVyOjpJbmxpbmVJdGVt
UmFuZ2UmIGxheW91dFJhbmdlKSBjb25zdDsKLQotICAgIHN0cnVjdCBSZXN1bHQgewotICAgICAg
ICBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmUgaXNFbmRPZkxpbmUgeyBJbmxpbmVD
b250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Ok5vIH07Ci0gICAgICAgIHN0cnVjdCBDb21taXR0
ZWRDb250ZW50Q291bnQgewotICAgICAgICAgICAgc2l6ZV90IHZhbHVlIHsgMCB9OwotICAgICAg
ICAgICAgYm9vbCBpc1JldmVydCB7IGZhbHNlIH07Ci0gICAgICAgIH07Ci0gICAgICAgIENvbW1p
dHRlZENvbnRlbnRDb3VudCBjb21taXR0ZWRDb3VudCB7IH07Ci0gICAgICAgIHNpemVfdCBwYXJ0
aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoIHsgMCB9OwotICAgICAgICBPcHRpb25hbDxJbmxpbmVM
YXlvdXRVbml0PiBvdmVyZmxvd0xvZ2ljYWxXaWR0aCB7IH07Ci0gICAgfTsKLSAgICBzdHJ1Y3Qg
VXNlZENvbnN0cmFpbnRzIHsKLSAgICAgICAgSW5saW5lUmVjdCBsb2dpY2FsUmVjdDsKLSAgICAg
ICAgYm9vbCBpc0NvbnN0cmFpbmVkQnlGbG9hdCB7IGZhbHNlIH07Ci0gICAgfTsKLSAgICBVc2Vk
Q29uc3RyYWludHMgaW5pdGlhbENvbnN0cmFpbnRzRm9yTGluZShjb25zdCBJbmxpbmVSZWN0JiBp
bml0aWFsTGluZUxvZ2ljYWxSZWN0LCBib29sIGlzRmlyc3RMaW5lKSBjb25zdDsKLSAgICBPcHRp
b25hbDxIb3Jpem9udGFsQ29uc3RyYWludHM+IGZsb2F0Q29uc3RyYWludHMoY29uc3QgSW5saW5l
UmVjdCYgbGluZUxvZ2ljYWxSZWN0KSBjb25zdDsKLQotICAgIHZvaWQgaGFuZGxlRmxvYXRDb250
ZW50KGNvbnN0IElubGluZUl0ZW0mKTsKLSAgICBSZXN1bHQgaGFuZGxlSW5saW5lQ29udGVudChJ
bmxpbmVDb250ZW50QnJlYWtlciYsIGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRS
YW5nZSwgY29uc3QgTGluZUNhbmRpZGF0ZSYpOwotICAgIHNpemVfdCByZWJ1aWxkTGluZShjb25z
dCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2UsIGNvbnN0IElubGluZUl0ZW0mIGxh
c3RJbmxpbmVJdGVtVG9BZGQpOwotICAgIHNpemVfdCByZWJ1aWxkTGluZUZvclRyYWlsaW5nU29m
dEh5cGhlbihjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlKTsKLSAgICB2b2lkIGNv
bW1pdFBhcnRpYWxDb250ZW50KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3Vz
Q29udGVudDo6UnVuTGlzdCYsIGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OlBh
cnRpYWxUcmFpbGluZ0NvbnRlbnQmKTsKLSAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVXNlZENv
bnN0cmFpbnRzJik7Ci0gICAgc3RydWN0IENvbW1pdHRlZENvbnRlbnQgewotICAgICAgICBzaXpl
X3QgaW5saW5lSXRlbUNvdW50IHsgMCB9OwotICAgICAgICBzaXplX3QgcGFydGlhbFRyYWlsaW5n
Q29udGVudExlbmd0aCB7IDAgfTsKLSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4g
b3ZlcmZsb3dMb2dpY2FsV2lkdGggeyB9OwotICAgIH07Ci0gICAgQ29tbWl0dGVkQ29udGVudCBw
bGFjZUlubGluZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiwgc2l6ZV90IHBhcnRpYWxM
ZWFkaW5nQ29udGVudExlbmd0aCwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gb3ZlcmZsb3dM
b2dpY2FsV2lkdGgpOwotICAgIElubGluZUl0ZW1SYW5nZSBjbG9zZShjb25zdCBJbmxpbmVJdGVt
UmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2UsIGNvbnN0IENvbW1pdHRlZENvbnRlbnQmKTsKLQotICAg
IElubGluZUxheW91dFVuaXQgaW5saW5lSXRlbVdpZHRoKGNvbnN0IElubGluZUl0ZW0mLCBJbmxp
bmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCkgY29uc3Q7Ci0gICAgYm9vbCBpc0xhc3RM
aW5lV2l0aElubGluZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsaW5lUmFuZ2UsIHNp
emVfdCBsYXN0SW5saW5lSXRlbUluZGV4LCBib29sIGhhc1BhcnRpYWxUcmFpbGluZ0NvbnRlbnQp
IGNvbnN0OwotCi0gICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdD
b250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsgfQotICAg
IElubGluZUZvcm1hdHRpbmdTdGF0ZSogZm9ybWF0dGluZ1N0YXRlKCkgeyByZXR1cm4gbV9pbmxp
bmVGb3JtYXR0aW5nU3RhdGU7IH0KLSAgICBGbG9hdGluZ1N0YXRlKiBmbG9hdGluZ1N0YXRlKCkg
eyByZXR1cm4gbV9mbG9hdGluZ1N0YXRlOyB9Ci0gICAgY29uc3QgRmxvYXRpbmdTdGF0ZSogZmxv
YXRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRpbmdTdGF0ZTsgfQotICAgIGNvbnN0
IENvbnRhaW5lckJveCYgcm9vdCgpIGNvbnN0OwotICAgIGNvbnN0IExheW91dFN0YXRlJiBsYXlv
dXRTdGF0ZSgpIGNvbnN0OwotCi0gICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIG1f
aW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Ci0gICAgSW5saW5lRm9ybWF0dGluZ1N0YXRlKiBtX2lu
bGluZUZvcm1hdHRpbmdTdGF0ZSB7IG51bGxwdHIgfTsKLSAgICBGbG9hdGluZ1N0YXRlKiBtX2Zs
b2F0aW5nU3RhdGUgeyBudWxscHRyIH07Ci0gICAgT3B0aW9uYWw8SG9yaXpvbnRhbENvbnN0cmFp
bnRzPiBtX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHM7Ci0KLSAgICBMaW5lIG1fbGluZTsKLSAg
ICBJbmxpbmVSZWN0IG1fbGluZUxvZ2ljYWxSZWN0OwotICAgIGNvbnN0IElubGluZUl0ZW1zJiBt
X2lubGluZUl0ZW1zOwotICAgIEZsb2F0TGlzdCBtX2Zsb2F0czsKLSAgICBPcHRpb25hbDxJbmxp
bmVUZXh0SXRlbT4gbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtOwotICAgIFZlY3Rvcjxjb25zdCBJ
bmxpbmVJdGVtKj4gbV93cmFwT3Bwb3J0dW5pdHlMaXN0OwotICAgIHVuc2lnbmVkIG1fc3VjY2Vz
c2l2ZUh5cGhlbmF0ZWRMaW5lQ291bnQgeyAwIH07Ci0gICAgYm9vbCBtX2NvbnRlbnRJc0NvbnN0
cmFpbmVkQnlGbG9hdCB7IGZhbHNlIH07Ci19OwotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVHZW9tZXRy
eS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUdl
b21ldHJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTJjNThhMDc2ZTQ5YzJj
ZDNjOWUyZjkyYWIzNmQwM2YyNzI5ZTUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5s
aW5lTGluZUdlb21ldHJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICog
Q29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0g
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
LSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
Ci0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0g
Ki8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKLQotI2luY2x1ZGUgIklubGluZVJlY3QuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFt
ZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIElubGluZUxpbmVHZW9tZXRyeSB7Ci0gICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgc3RydWN0IEVuY2xvc2luZ1RvcEFuZEJv
dHRvbSB7Ci0gICAgICAgIC8vIFRoaXMgdmFsdWVzIGVuY2xvc2VzIHRoZSByb290IGlubGluZSBi
b3ggYW5kIGFueSBvdGhlciBpbmxpbmUgbGV2ZWwgYm94J3MgYm9yZGVyIGJveC4KLSAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCB0b3AgeyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgYm90
dG9tIHsgMCB9OwotICAgIH07Ci0gICAgSW5saW5lTGluZUdlb21ldHJ5KGNvbnN0IElubGluZVJl
Y3QmIGxpbmVCb3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tLCBJbmxpbmVMYXlv
dXRVbml0IGFsaWdtZW50QmFzZWxpbmUsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxM
ZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgpOwotCi0gICAgY29uc3Qg
SW5saW5lUmVjdCYgbGluZUJveExvZ2ljYWxSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94
TG9naWNhbFJlY3Q7IH0KLQotICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBlbmNsb3NpbmdUb3BB
bmRCb3R0b20oKSBjb25zdCB7IHJldHVybiBtX2VuY2xvc2luZ1RvcEFuZEJvdHRvbTsgfQotCi0g
ICAgSW5saW5lTGF5b3V0VW5pdCBiYXNlbGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fYWxpZ21lbnRC
YXNlbGluZTsgfQotCi0gICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQoKSBj
b25zdCB7IHJldHVybiBtX2NvbnRlbnRMb2dpY2FsTGVmdDsgfQotICAgIElubGluZUxheW91dFVu
aXQgY29udGVudExvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudExvZ2ljYWxX
aWR0aDsgfQotCi0gICAgdm9pZCBtb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNl
dCkgeyBtX2xpbmVCb3hMb2dpY2FsUmVjdC5tb3ZlVmVydGljYWxseShvZmZzZXQpOyB9Ci0KLXBy
aXZhdGU6Ci0gICAgLy8gVGhpcyBpcyBsaW5lIGJveCBnZW9tZXRyeSAoc2VlIGh0dHBzOi8vd3d3
LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xpbmUtYm94KS4KLSAgICBJbmxpbmVSZWN0IG1fbGlu
ZUJveExvZ2ljYWxSZWN0OwotICAgIC8vIEVuY2xvc2luZyB0b3AgYW5kIGJvdHRvbSBpbmNsdWRl
cyBhbGwgaW5saW5lIGxldmVsIGJveGVzIChib3JkZXIgYm94KSB2ZXJ0aWNhbGx5LgotICAgIC8v
IFdoaWxlIHRoZSBsaW5lIGJveCB1c3VhbGx5IGVuY2xvc2UgdGhlbSBhcyB3ZWxsLCBpdHMgdmVy
dGljYWwgZ2VvbWV0cnkgaXMgYmFzZWQgb24KLSAgICAvLyB0aGUgbGF5b3V0IGJvdW5kcyBvZiB0
aGUgaW5saW5lIGxldmVsIGJveGVzIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgd2hlbiBsaW5lLWhl
aWdodCBpcyBwcmVzZW50LgotICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBtX2VuY2xvc2luZ1Rv
cEFuZEJvdHRvbTsKLSAgICBJbmxpbmVMYXlvdXRVbml0IG1fYWxpZ21lbnRCYXNlbGluZSB7IDAg
fTsKLSAgICBJbmxpbmVMYXlvdXRVbml0IG1fY29udGVudExvZ2ljYWxMZWZ0IHsgMCB9OwotICAg
IElubGluZUxheW91dFVuaXQgbV9jb250ZW50TG9naWNhbFdpZHRoIHsgMCB9OwotfTsKLQotaW5s
aW5lIElubGluZUxpbmVHZW9tZXRyeTo6SW5saW5lTGluZUdlb21ldHJ5KGNvbnN0IElubGluZVJl
Y3QmIGxpbmVCb3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tIGVuY2xvc2luZ1Rv
cEFuZEJvdHRvbSwgSW5saW5lTGF5b3V0VW5pdCBhbGlnbWVudEJhc2VsaW5lLCBJbmxpbmVMYXlv
dXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNh
bFdpZHRoKQotICAgIDogbV9saW5lQm94TG9naWNhbFJlY3QobGluZUJveExvZ2ljYWxSZWN0KQot
ICAgICwgbV9lbmNsb3NpbmdUb3BBbmRCb3R0b20oZW5jbG9zaW5nVG9wQW5kQm90dG9tKQotICAg
ICwgbV9hbGlnbWVudEJhc2VsaW5lKGFsaWdtZW50QmFzZWxpbmUpCi0gICAgLCBtX2NvbnRlbnRM
b2dpY2FsTGVmdChjb250ZW50TG9naWNhbExlZnQpCi0gICAgLCBtX2NvbnRlbnRMb2dpY2FsV2lk
dGgoY29udGVudExvZ2ljYWxXaWR0aCkKLXsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVSdW4u
aCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVSdW4u
aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwZWUxNGRlZDBiZTJjY2Q1MmQzNDMz
YjA4ODQ1NDZjMWYwZDJiMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5l
UnVuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
QykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFn
bWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNs
dWRlICJJbmxpbmVSZWN0LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiVGV4
dEZsYWdzLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1z
dHJ1Y3QgTGluZVJ1biB7Ci0gICAgV1RGX01BS0VfU1RSVUNUX0ZBU1RfQUxMT0NBVEVEOwotICAg
IHN0cnVjdCBUZXh0IHsKLSAgICAgICAgV1RGX01BS0VfU1RSVUNUX0ZBU1RfQUxMT0NBVEVEOwot
ICAgIHB1YmxpYzoKLSAgICAgICAgVGV4dChzaXplX3QgcG9zaXRpb24sIHNpemVfdCBsZW5ndGgs
IGNvbnN0IFN0cmluZyYpOwotCi0gICAgICAgIHNpemVfdCBzdGFydCgpIGNvbnN0IHsgcmV0dXJu
IG1fc3RhcnQ7IH0KLSAgICAgICAgc2l6ZV90IGVuZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0KCkg
KyBsZW5ndGgoKTsgfQotICAgICAgICBzaXplX3QgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9s
ZW5ndGg7IH0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRl
bnRTdHJpbmc7IH0KLQotICAgICAgICBib29sIG5lZWRzSHlwaGVuKCkgY29uc3QgeyByZXR1cm4g
bV9uZWVkc0h5cGhlbjsgfQotICAgICAgICB2b2lkIHNldE5lZWRzSHlwaGVuKCkgeyBtX25lZWRz
SHlwaGVuID0gdHJ1ZTsgfQotCi0gICAgICAgIHZvaWQgZXhwYW5kKHNpemVfdCBkZWx0YSkgeyBt
X2xlbmd0aCArPSBkZWx0YTsgfQotICAgICAgICB2b2lkIHNocmluayhzaXplX3QgZGVsdGEpIHsg
bV9sZW5ndGggLT0gZGVsdGE7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNpemVfdCBtX3N0
YXJ0IHsgMCB9OwotICAgICAgICBzaXplX3QgbV9sZW5ndGggeyAwIH07Ci0gICAgICAgIGJvb2wg
bV9uZWVkc0h5cGhlbiB7IGZhbHNlIH07Ci0gICAgICAgIFN0cmluZyBtX2NvbnRlbnRTdHJpbmc7
Ci0gICAgfTsKLQotICAgIHN0cnVjdCBFeHBhbnNpb247Ci0gICAgTGluZVJ1bihzaXplX3QgbGlu
ZUluZGV4LCBjb25zdCBCb3gmLCBjb25zdCBJbmxpbmVSZWN0JiwgRXhwYW5zaW9uLCBPcHRpb25h
bDxUZXh0PiA9IFdURjo6bnVsbG9wdCk7Ci0KLSAgICBjb25zdCBJbmxpbmVSZWN0JiBsb2dpY2Fs
UmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3Q7IH0KLQotICAgIElubGluZUxheW91
dFVuaXQgbG9naWNhbFRvcCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkudG9wKCk7IH0K
LSAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxCb3R0b20oKSBjb25zdCB7IHJldHVybiBsb2dp
Y2FsUmVjdCgpLmJvdHRvbSgpOyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgp
IGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkubGVmdCgpOyB9Ci0gICAgSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsUmlnaHQoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVjdCgpLnJpZ2h0KCk7
IH0KLQotICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4g
bG9naWNhbFJlY3QoKS53aWR0aCgpOyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVp
Z2h0KCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS5oZWlnaHQoKTsgfQotCi0gICAgdm9p
ZCBtb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkgeyBtX2xvZ2ljYWxSZWN0
Lm1vdmVWZXJ0aWNhbGx5KG9mZnNldCk7IH0KLSAgICBPcHRpb25hbDxUZXh0PiYgdGV4dCgpIHsg
cmV0dXJuIG1fdGV4dDsgfQotICAgIGNvbnN0IE9wdGlvbmFsPFRleHQ+JiB0ZXh0KCkgY29uc3Qg
eyByZXR1cm4gbV90ZXh0OyB9Ci0KLSAgICBzdHJ1Y3QgRXhwYW5zaW9uIHsKLSAgICAgICAgRXhw
YW5zaW9uQmVoYXZpb3IgYmVoYXZpb3IgeyBEZWZhdWx0RXhwYW5zaW9uIH07Ci0gICAgICAgIElu
bGluZUxheW91dFVuaXQgaG9yaXpvbnRhbEV4cGFuc2lvbiB7IDAgfTsKLSAgICB9OwotICAgIEV4
cGFuc2lvbiBleHBhbnNpb24oKSBjb25zdCB7IHJldHVybiBtX2V4cGFuc2lvbjsgfQotCi0gICAg
Y29uc3QgQm94JiBsYXlvdXRCb3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRCb3g7IH0KLSAg
ICBzaXplX3QgbGluZUluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9saW5lSW5kZXg7IH0KLQotcHJp
dmF0ZToKLSAgICBjb25zdCBzaXplX3QgbV9saW5lSW5kZXg7Ci0gICAgV2Vha1B0cjxjb25zdCBM
YXlvdXQ6OkJveD4gbV9sYXlvdXRCb3g7Ci0gICAgSW5saW5lUmVjdCBtX2xvZ2ljYWxSZWN0Owot
ICAgIEV4cGFuc2lvbiBtX2V4cGFuc2lvbjsKLSAgICBPcHRpb25hbDxUZXh0PiBtX3RleHQ7Ci19
OwotCi1pbmxpbmUgTGluZVJ1bjo6TGluZVJ1bihzaXplX3QgbGluZUluZGV4LCBjb25zdCBMYXlv
dXQ6OkJveCYgbGF5b3V0Qm94LCBjb25zdCBJbmxpbmVSZWN0JiBsb2dpY2FsUmVjdCwgRXhwYW5z
aW9uIGV4cGFuc2lvbiwgT3B0aW9uYWw8VGV4dD4gdGV4dCkKLSAgICA6IG1fbGluZUluZGV4KGxp
bmVJbmRleCkKLSAgICAsIG1fbGF5b3V0Qm94KG1ha2VXZWFrUHRyKGxheW91dEJveCkpCi0gICAg
LCBtX2xvZ2ljYWxSZWN0KGxvZ2ljYWxSZWN0KQotICAgICwgbV9leHBhbnNpb24oZXhwYW5zaW9u
KQotICAgICwgbV90ZXh0KHRleHQpCi17Ci19Ci0KLWlubGluZSBMaW5lUnVuOjpUZXh0OjpUZXh0
KHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbmd0aCwgY29uc3QgU3RyaW5nJiBjb250ZW50U3RyaW5n
KQotICAgIDogbV9zdGFydChzdGFydCkKLSAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKLSAgICAsIG1f
Y29udGVudFN0cmluZyhjb250ZW50U3RyaW5nKQotewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVJlY3Qu
aCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVJlY3QuaApk
ZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkMDlhYjFlNzEwMWFhNmVjZjQzM2QyNjQw
MDRmZmU4ZmI3YThjNC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVSZWN0LmgK
KysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAx
OSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25j
ZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJM
YXlvdXRVbml0cy5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsK
LQotY2xhc3MgSW5saW5lUmVjdCB7Ci1wdWJsaWM6Ci0gICAgSW5saW5lUmVjdCgpID0gZGVmYXVs
dDsKLSAgICBJbmxpbmVSZWN0KElubGluZUxheW91dFVuaXQgdG9wLCBJbmxpbmVMYXlvdXRVbml0
IGxlZnQsIElubGluZUxheW91dFVuaXQgd2lkdGgsIElubGluZUxheW91dFVuaXQgaGVpZ2h0KTsK
LSAgICBJbmxpbmVSZWN0KGNvbnN0IElubGluZUxheW91dFBvaW50JiB0b3BMZWZ0LCBJbmxpbmVM
YXlvdXRVbml0IHdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCk7Ci0gICAgSW5saW5lUmVj
dChjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgdG9wTGVmdCwgY29uc3QgSW5saW5lTGF5b3V0U2l6
ZSYpOwotICAgIAotICAgIElubGluZUxheW91dFVuaXQgdG9wKCkgY29uc3Q7Ci0gICAgSW5saW5l
TGF5b3V0VW5pdCBsZWZ0KCkgY29uc3Q7Ci0gICAgSW5saW5lTGF5b3V0UG9pbnQgdG9wTGVmdCgp
IGNvbnN0OwotCi0gICAgSW5saW5lTGF5b3V0VW5pdCBib3R0b20oKSBjb25zdDsKLSAgICBJbmxp
bmVMYXlvdXRVbml0IHJpZ2h0KCkgY29uc3Q7ICAgICAgICAKLQotICAgIElubGluZUxheW91dFVu
aXQgd2lkdGgoKSBjb25zdDsKLSAgICBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCgpIGNvbnN0Owot
ICAgIElubGluZUxheW91dFNpemUgc2l6ZSgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRUb3AoSW5s
aW5lTGF5b3V0VW5pdCk7Ci0gICAgdm9pZCBzZXRCb3R0b20oSW5saW5lTGF5b3V0VW5pdCk7Ci0g
ICAgdm9pZCBzZXRMZWZ0KElubGluZUxheW91dFVuaXQpOwotICAgIHZvaWQgc2V0VG9wTGVmdChj
b25zdCBJbmxpbmVMYXlvdXRQb2ludCYpOwotICAgIHZvaWQgc2V0V2lkdGgoSW5saW5lTGF5b3V0
VW5pdCk7Ci0gICAgdm9pZCBzZXRIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCk7Ci0KLSAgICB2b2lk
IG1vdmVIb3Jpem9udGFsbHkoSW5saW5lTGF5b3V0VW5pdCk7Ci0gICAgdm9pZCBtb3ZlVmVydGlj
YWxseShJbmxpbmVMYXlvdXRVbml0KTsKLSAgICB2b2lkIG1vdmVCeShJbmxpbmVMYXlvdXRQb2lu
dCk7Ci0KLSAgICB2b2lkIGV4cGFuZChPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiwgT3B0aW9u
YWw8SW5saW5lTGF5b3V0VW5pdD4pOwotICAgIHZvaWQgZXhwYW5kVG9Db250YWluKGNvbnN0IElu
bGluZVJlY3QmKTsKLSAgICB2b2lkIGV4cGFuZEhvcml6b250YWxseShJbmxpbmVMYXlvdXRVbml0
IGRlbHRhKSB7IGV4cGFuZChkZWx0YSwgeyB9KTsgfQotICAgIHZvaWQgZXhwYW5kVmVydGljYWxs
eShJbmxpbmVMYXlvdXRVbml0IGRlbHRhKSB7IGV4cGFuZCh7IH0sIGRlbHRhKTsgfQotICAgIHZv
aWQgZXhwYW5kVmVydGljYWxseVRvQ29udGFpbihjb25zdCBJbmxpbmVSZWN0Jik7Ci0gICAgdm9p
ZCBpbmZsYXRlKElubGluZUxheW91dFVuaXQpOwotCi0gICAgb3BlcmF0b3IgSW5saW5lTGF5b3V0
UmVjdCgpIGNvbnN0OwotCi1wcml2YXRlOgotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAgdm9pZCBp
bnZhbGlkYXRlVG9wKCkgeyBtX2hhc1ZhbGlkVG9wID0gZmFsc2U7IH0KLSAgICB2b2lkIGludmFs
aWRhdGVMZWZ0KCkgeyBtX2hhc1ZhbGlkTGVmdCA9IGZhbHNlOyB9Ci0gICAgdm9pZCBpbnZhbGlk
YXRlV2lkdGgoKSB7IG1faGFzVmFsaWRXaWR0aCA9IGZhbHNlOyB9Ci0gICAgdm9pZCBpbnZhbGlk
YXRlSGVpZ2h0KCkgeyBtX2hhc1ZhbGlkSGVpZ2h0ID0gZmFsc2U7IH0KLSAgICB2b2lkIGludmFs
aWRhdGVQb3NpdGlvbigpOwotCi0gICAgYm9vbCBoYXNWYWxpZFBvc2l0aW9uKCkgY29uc3QgeyBy
ZXR1cm4gbV9oYXNWYWxpZFRvcCAmJiBtX2hhc1ZhbGlkTGVmdDsgfQotICAgIGJvb2wgaGFzVmFs
aWRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9oYXNWYWxpZFdpZHRoICYmIG1faGFzVmFsaWRIZWln
aHQ7IH0KLSAgICBib29sIGhhc1ZhbGlkR2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBoYXNWYWxp
ZFBvc2l0aW9uKCkgJiYgaGFzVmFsaWRTaXplKCk7IH0KLQotICAgIHZvaWQgc2V0SGFzVmFsaWRQ
b3NpdGlvbigpOwotICAgIHZvaWQgc2V0SGFzVmFsaWRTaXplKCk7Ci0KLSAgICBib29sIG1faGFz
VmFsaWRUb3AgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9oYXNWYWxpZExlZnQgeyBmYWxzZSB9Owot
ICAgIGJvb2wgbV9oYXNWYWxpZFdpZHRoIHsgZmFsc2UgfTsKLSAgICBib29sIG1faGFzVmFsaWRI
ZWlnaHQgeyBmYWxzZSB9OwotI2VuZGlmIC8vIEFTU0VSVF9FTkFCTEVECi0gICAgSW5saW5lTGF5
b3V0UmVjdCBtX3JlY3Q7Ci19OwotCi1pbmxpbmUgSW5saW5lUmVjdDo6SW5saW5lUmVjdChJbmxp
bmVMYXlvdXRVbml0IHRvcCwgSW5saW5lTGF5b3V0VW5pdCBsZWZ0LCBJbmxpbmVMYXlvdXRVbml0
IHdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCkKLSAgICA6IG1fcmVjdChsZWZ0LCB0b3As
IHdpZHRoLCBoZWlnaHQpCi17Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICBtX2hhc1ZhbGlkVG9w
ID0gdHJ1ZTsKLSAgICBtX2hhc1ZhbGlkTGVmdCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZFdpZHRo
ID0gdHJ1ZTsKLSAgICBtX2hhc1ZhbGlkSGVpZ2h0ID0gdHJ1ZTsKLSNlbmRpZgotfQotCi1pbmxp
bmUgSW5saW5lUmVjdDo6SW5saW5lUmVjdChjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgdG9wTGVm
dCwgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCwgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQpCi0gICAg
OiBJbmxpbmVSZWN0KHRvcExlZnQueSgpLCB0b3BMZWZ0LngoKSwgd2lkdGgsIGhlaWdodCkKLXsK
LX0KLQotaW5saW5lIElubGluZVJlY3Q6OklubGluZVJlY3QoY29uc3QgSW5saW5lTGF5b3V0UG9p
bnQmIHRvcExlZnQsIGNvbnN0IElubGluZUxheW91dFNpemUmIHNpemUpCi0gICAgOiBJbmxpbmVS
ZWN0KHRvcExlZnQueSgpLCB0b3BMZWZ0LngoKSwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgp
KQotewotfQotCi0jaWYgQVNTRVJUX0VOQUJMRUQKLWlubGluZSB2b2lkIElubGluZVJlY3Q6Omlu
dmFsaWRhdGVQb3NpdGlvbigpCi17Ci0gICAgaW52YWxpZGF0ZVRvcCgpOwotICAgIGludmFsaWRh
dGVMZWZ0KCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OnNldEhhc1ZhbGlkUG9zaXRp
b24oKQotewotICAgIG1faGFzVmFsaWRUb3AgPSB0cnVlOwotICAgIG1faGFzVmFsaWRMZWZ0ID0g
dHJ1ZTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0SGFzVmFsaWRTaXplKCkKLXsK
LSAgICBtX2hhc1ZhbGlkV2lkdGggPSB0cnVlOwotICAgIG1faGFzVmFsaWRIZWlnaHQgPSB0cnVl
OwotfQotI2VuZGlmIC8vIEFTU0VSVF9FTkFCTEVECi0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0
IElubGluZVJlY3Q6OnRvcCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRUb3ApOwot
ICAgIHJldHVybiBtX3JlY3QueSgpOwotfQotCi1pbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxp
bmVSZWN0OjpsZWZ0KCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZExlZnQpOwotICAg
IHJldHVybiBtX3JlY3QueCgpOwotfQotCi1pbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVS
ZWN0Ojpib3R0b20oKSBjb25zdAotewotICAgIEFTU0VSVChtX2hhc1ZhbGlkVG9wICYmIG1faGFz
VmFsaWRIZWlnaHQpOwotICAgIHJldHVybiBtX3JlY3QubWF4WSgpOwotfQotCi1pbmxpbmUgSW5s
aW5lTGF5b3V0VW5pdCBJbmxpbmVSZWN0OjpyaWdodCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1f
aGFzVmFsaWRMZWZ0ICYmIG1faGFzVmFsaWRXaWR0aCk7Ci0gICAgcmV0dXJuIG1fcmVjdC5tYXhY
KCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRQb2ludCBJbmxpbmVSZWN0Ojp0b3BMZWZ0KCkg
Y29uc3QKLXsKLSAgICBBU1NFUlQoaGFzVmFsaWRQb3NpdGlvbigpKTsKLSAgICByZXR1cm4gbV9y
ZWN0Lm1pblhNaW5ZQ29ybmVyKCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRTaXplIElubGlu
ZVJlY3Q6OnNpemUoKSBjb25zdAotewotICAgIEFTU0VSVChoYXNWYWxpZFNpemUoKSk7Ci0gICAg
cmV0dXJuIG1fcmVjdC5zaXplKCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0IElubGlu
ZVJlY3Q6OndpZHRoKCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZFdpZHRoKTsKLSAg
ICByZXR1cm4gbV9yZWN0LndpZHRoKCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0IElu
bGluZVJlY3Q6OmhlaWdodCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRIZWlnaHQp
OwotICAgIHJldHVybiBtX3JlY3QuaGVpZ2h0KCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJl
Y3Q6OnNldFRvcExlZnQoY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIHRvcExlZnQpCi17Ci0jaWYg
QVNTRVJUX0VOQUJMRUQKLSAgICBzZXRIYXNWYWxpZFBvc2l0aW9uKCk7Ci0jZW5kaWYKLSAgICBt
X3JlY3Quc2V0TG9jYXRpb24odG9wTGVmdCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6
OnNldFRvcChJbmxpbmVMYXlvdXRVbml0IHRvcCkKLXsKLSNpZiBBU1NFUlRfRU5BQkxFRAotICAg
IG1faGFzVmFsaWRUb3AgPSB0cnVlOwotI2VuZGlmCi0gICAgbV9yZWN0LnNldFkodG9wKTsKLX0K
LQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0Qm90dG9tKElubGluZUxheW91dFVuaXQgYm90
dG9tKQotewotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7Ci0g
ICAgbV9oYXNWYWxpZEhlaWdodCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX3JlY3Quc2hpZnRNYXhZ
RWRnZVRvKGJvdHRvbSk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OnNldExlZnQoSW5s
aW5lTGF5b3V0VW5pdCBsZWZ0KQotewotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAgbV9oYXNWYWxp
ZExlZnQgPSB0cnVlOwotI2VuZGlmCi0gICAgbV9yZWN0LnNldFgobGVmdCk7Ci19Ci0KLWlubGlu
ZSB2b2lkIElubGluZVJlY3Q6OnNldFdpZHRoKElubGluZUxheW91dFVuaXQgd2lkdGgpCi17Ci0j
aWYgQVNTRVJUX0VOQUJMRUQKLSAgICBtX2hhc1ZhbGlkV2lkdGggPSB0cnVlOwotI2VuZGlmCi0g
ICAgbV9yZWN0LnNldFdpZHRoKHdpZHRoKTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6
c2V0SGVpZ2h0KElubGluZUxheW91dFVuaXQgaGVpZ2h0KQotewotI2lmIEFTU0VSVF9FTkFCTEVE
Ci0gICAgbV9oYXNWYWxpZEhlaWdodCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX3JlY3Quc2V0SGVp
Z2h0KGhlaWdodCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6Om1vdmVIb3Jpem9udGFs
bHkoSW5saW5lTGF5b3V0VW5pdCBvZmZzZXQpCi17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRMZWZ0
KTsKLSAgICBtX3JlY3QubW92ZShJbmxpbmVMYXlvdXRTaXplIHsgb2Zmc2V0LCAwIH0pOwotfQot
Ci1pbmxpbmUgdm9pZCBJbmxpbmVSZWN0Ojptb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0
IG9mZnNldCkKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZFRvcCk7Ci0gICAgbV9yZWN0Lm1vdmUo
SW5saW5lTGF5b3V0U2l6ZSB7IDAsIG9mZnNldCB9KTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5l
UmVjdDo6bW92ZUJ5KElubGluZUxheW91dFBvaW50IG9mZnNldCkKLXsKLSAgICBBU1NFUlQobV9o
YXNWYWxpZFRvcCk7Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRMZWZ0KTsKLSAgICBtX3JlY3QubW92
ZUJ5KG9mZnNldCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OmV4cGFuZChPcHRpb25h
bDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gaGVp
Z2h0KQotewotICAgIEFTU0VSVCghd2lkdGggfHwgbV9oYXNWYWxpZFdpZHRoKTsKLSAgICBBU1NF
UlQoIWhlaWdodCB8fCBtX2hhc1ZhbGlkSGVpZ2h0KTsKLSAgICBtX3JlY3QuZXhwYW5kKHdpZHRo
LnZhbHVlT3IoMCksIGhlaWdodC52YWx1ZU9yKDApKTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5l
UmVjdDo6ZXhwYW5kVG9Db250YWluKGNvbnN0IElubGluZVJlY3QmIG90aGVyKQotewotI2lmIEFT
U0VSVF9FTkFCTEVECi0gICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZExl
ZnQgPSB0cnVlOwotICAgIG1faGFzVmFsaWRXaWR0aCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZEhl
aWdodCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX3JlY3QudW5pdGVFdmVuSWZFbXB0eShvdGhlcik7
Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OmV4cGFuZFZlcnRpY2FsbHlUb0NvbnRhaW4o
Y29uc3QgSW5saW5lUmVjdCYgb3RoZXIpCi17Ci0gICAgYXV0byBjb250YWluVG9wID0gc3RkOjpt
aW4odG9wKCksIG90aGVyLnRvcCgpKTsKLSAgICBhdXRvIGNvbnRhaW5Cb3R0b20gPSBzdGQ6Om1h
eChib3R0b20oKSwgb3RoZXIuYm90dG9tKCkpOwotICAgIHNldFRvcChjb250YWluVG9wKTsKLSAg
ICBzZXRCb3R0b20oY29udGFpbkJvdHRvbSk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6
OmluZmxhdGUoSW5saW5lTGF5b3V0VW5pdCBpbmZsYXRlKQotewotICAgIEFTU0VSVChoYXNWYWxp
ZEdlb21ldHJ5KCkpOwotICAgIG1fcmVjdC5pbmZsYXRlKGluZmxhdGUpOwotfQotCi1pbmxpbmUg
SW5saW5lUmVjdDo6b3BlcmF0b3IgSW5saW5lTGF5b3V0UmVjdCgpIGNvbnN0Ci17Ci0gICAgQVNT
RVJUKGhhc1ZhbGlkR2VvbWV0cnkoKSk7IAotICAgIHJldHVybiBtX3JlY3Q7Ci19Ci0KLX0KLX0K
LSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRp
bmcvSW5saW5lU29mdExpbmVCcmVha0l0ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxp
bmVmb3JtYXR0aW5nL0lubGluZVNvZnRMaW5lQnJlYWtJdGVtLmgKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDllYTA2ZmJjZGQxNzgyNDJiYWI1NDczYTk0YTEzYWMzMGJjNzk3MGIuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lU29mdExpbmVCcmVha0l0ZW0uaAorKysg
L2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
Ci0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0g
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQot
I2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiSW5saW5l
SXRlbS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xh
c3MgSW5saW5lU29mdExpbmVCcmVha0l0ZW0gOiBwdWJsaWMgSW5saW5lSXRlbSB7Ci1wdWJsaWM6
Ci0gICAgc3RhdGljIElubGluZVNvZnRMaW5lQnJlYWtJdGVtIGNyZWF0ZVNvZnRMaW5lQnJlYWtJ
dGVtKGNvbnN0IElubGluZVRleHRCb3gmLCB1bnNpZ25lZCBwb3NpdGlvbik7Ci0KLSAgICB1bnNp
Z25lZCBwb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRPclBvc2l0aW9uOyB9Ci0gICAg
Y29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25j
YXN0PElubGluZVRleHRCb3g+KGxheW91dEJveCgpKTsgfQotCi0gICAgSW5saW5lU29mdExpbmVC
cmVha0l0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHBvc2l0aW9uKTsKLX07Ci0K
LWlubGluZSBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbTo6
Y3JlYXRlU29mdExpbmVCcmVha0l0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJv
eCwgdW5zaWduZWQgcG9zaXRpb24pCi17Ci0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgcG9z
aXRpb24gfTsKLX0KLQotaW5saW5lIElubGluZVNvZnRMaW5lQnJlYWtJdGVtOjpJbmxpbmVTb2Z0
TGluZUJyZWFrSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25l
ZCBwb3NpdGlvbikKLSAgICA6IElubGluZUl0ZW0oaW5saW5lVGV4dEJveCwgVHlwZTo6U29mdExp
bmVCcmVhaykKLXsKLSAgICBtX3N0YXJ0T3JQb3NpdGlvbiA9IHBvc2l0aW9uOwotfQotCi19Ci19
Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfSU5MSU5FX0lURU0oSW5saW5lU29mdExpbmVCcmVh
a0l0ZW0sIGlzU29mdExpbmVCcmVhaygpKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmNwcApkZWxl
dGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3MzdhZjBiZGJhOTVhNWY0MDVlY2I0OTQ1ZmNj
ZDE5Y2Q4YmMzOS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVUZXh0SXRlbS5j
cHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykg
MjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0g
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRl
ICJjb25maWcuaCIKLSNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgotCi0jaWYgRU5BQkxFKExB
WU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgotI2lu
Y2x1ZGUgIklubGluZVNvZnRMaW5lQnJlYWtJdGVtLmgiCi0jaW5jbHVkZSAiVGV4dFV0aWwuaCIK
LSNpbmNsdWRlIDx3dGYvdW5pY29kZS9DaGFyYWN0ZXJOYW1lcy5oPgotCi1uYW1lc3BhY2UgV2Vi
Q29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotc3RhdGljX2Fzc2VydChzaXplb2YoSW5saW5l
SXRlbSkgPT0gc2l6ZW9mKElubGluZVRleHRJdGVtKSwgIiIpOwotCi1zdHJ1Y3QgV2hpdGVzcGFj
ZUNvbnRlbnQgewotICAgIHNpemVfdCBsZW5ndGggeyAwIH07Ci0gICAgYm9vbCBpc1dvcmRTZXBh
cmF0b3IgeyB0cnVlIH07Ci19Owotc3RhdGljIE9wdGlvbmFsPFdoaXRlc3BhY2VDb250ZW50PiBt
b3ZlVG9OZXh0Tm9uV2hpdGVzcGFjZVBvc2l0aW9uKGNvbnN0IFN0cmluZ1ZpZXcmIHRleHRDb250
ZW50LCBzaXplX3Qgc3RhcnRQb3NpdGlvbiwgYm9vbCBwcmVzZXJ2ZU5ld2xpbmUsIGJvb2wgcHJl
c2VydmVUYWIpCi17Ci0gICAgYXV0byBoYXNXb3JkU2VwYXJhdG9yQ2hhcmFjdGVyID0gZmFsc2U7
Ci0gICAgYXV0byBpc1doaXRlc3BhY2VDaGFyYWN0ZXIgPSBbJl0oYXV0byBjaGFyYWN0ZXIpIHsK
LSAgICAgICAgLy8gd2hpdGUgc3BhY2UgcHJvY2Vzc2luZyBpbiBDU1MgYWZmZWN0cyBvbmx5IHRo
ZSBkb2N1bWVudCB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzOiBzcGFjZXMgKFUrMDAyMCksIHRhYnMg
KFUrMDAwOSksIGFuZCBzZWdtZW50IGJyZWFrcy4KLSAgICAgICAgYXV0byBpc1RyZWF0ZWRBc1Nw
YWNlQ2hhcmFjdGVyID0gY2hhcmFjdGVyID09IHNwYWNlIHx8IChjaGFyYWN0ZXIgPT0gbmV3bGlu
ZUNoYXJhY3RlciAmJiAhcHJlc2VydmVOZXdsaW5lKSB8fCAoY2hhcmFjdGVyID09IHRhYkNoYXJh
Y3RlciAmJiAhcHJlc2VydmVUYWIpOwotICAgICAgICBoYXNXb3JkU2VwYXJhdG9yQ2hhcmFjdGVy
ID0gaGFzV29yZFNlcGFyYXRvckNoYXJhY3RlciB8fCBpc1RyZWF0ZWRBc1NwYWNlQ2hhcmFjdGVy
OwotICAgICAgICByZXR1cm4gaXNUcmVhdGVkQXNTcGFjZUNoYXJhY3RlciB8fCBjaGFyYWN0ZXIg
PT0gdGFiQ2hhcmFjdGVyOwotICAgIH07Ci0gICAgYXV0byBuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0
aW9uID0gc3RhcnRQb3NpdGlvbjsKLSAgICB3aGlsZSAobmV4dE5vbldoaXRlU3BhY2VQb3NpdGlv
biA8IHRleHRDb250ZW50Lmxlbmd0aCgpICYmIGlzV2hpdGVzcGFjZUNoYXJhY3Rlcih0ZXh0Q29u
dGVudFtuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uXSkpCi0gICAgICAgICsrbmV4dE5vbldoaXRl
U3BhY2VQb3NpdGlvbjsKLSAgICByZXR1cm4gbmV4dE5vbldoaXRlU3BhY2VQb3NpdGlvbiA9PSBz
dGFydFBvc2l0aW9uID8gV1RGOjpudWxsb3B0IDogbWFrZU9wdGlvbmFsKFdoaXRlc3BhY2VDb250
ZW50IHsgbmV4dE5vbldoaXRlU3BhY2VQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24sIGhhc1dvcmRT
ZXBhcmF0b3JDaGFyYWN0ZXIgfSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBtb3ZlVG9OZXh0QnJl
YWthYmxlUG9zaXRpb24odW5zaWduZWQgc3RhcnRQb3NpdGlvbiwgTGF6eUxpbmVCcmVha0l0ZXJh
dG9yJiBsaW5lQnJlYWtJdGVyYXRvciwgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKQotewotICAg
IGF1dG8gdGV4dExlbmd0aCA9IGxpbmVCcmVha0l0ZXJhdG9yLnN0cmluZ1ZpZXcoKS5sZW5ndGgo
KTsKLSAgICBhdXRvIHN0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb24gPSBzdGFy
dFBvc2l0aW9uOwotICAgIHdoaWxlIChzdGFydFBvc2l0aW9uRm9yTmV4dEJyZWFrYWJsZVBvc2l0
aW9uIDwgdGV4dExlbmd0aCkgewotICAgICAgICBhdXRvIG5leHRCcmVha2FibGVQb3NpdGlvbiA9
IFRleHRVdGlsOjpmaW5kTmV4dEJyZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCBz
dGFydFBvc2l0aW9uRm9yTmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBzdHlsZSk7Ci0gICAgICAgIC8v
IE9mdGVudGltZXMgdGhlIG5leHQgYnJlYWthYmxlIHBvc2l0aW9uIGNvbWVzIGJhY2sgYXMgdGhl
IHN0YXJ0IHBvc2l0aW9uIChtb3N0IG5vdGFibHkgaHlwaGVucykuCi0gICAgICAgIGlmIChuZXh0
QnJlYWthYmxlUG9zaXRpb24gIT0gc3RhcnRQb3NpdGlvbikKLSAgICAgICAgICAgIHJldHVybiBu
ZXh0QnJlYWthYmxlUG9zaXRpb24gLSBzdGFydFBvc2l0aW9uOwotICAgICAgICArK3N0YXJ0UG9z
aXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb247Ci0gICAgfQotICAgIHJldHVybiB0ZXh0TGVu
Z3RoIC0gc3RhcnRQb3NpdGlvbjsKLX0KLQotdm9pZCBJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlQW5k
QXBwZW5kVGV4dEl0ZW1zKElubGluZUl0ZW1zJiBpbmxpbmVDb250ZW50LCBjb25zdCBJbmxpbmVU
ZXh0Qm94JiBpbmxpbmVUZXh0Qm94KQotewotICAgIGF1dG8gdGV4dCA9IGlubGluZVRleHRCb3gu
Y29udGVudCgpOwotICAgIGlmICghdGV4dC5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIGlubGlu
ZUNvbnRlbnQuYXBwZW5kKElubGluZVRleHRJdGVtOjpjcmVhdGVFbXB0eUl0ZW0oaW5saW5lVGV4
dEJveCkpOwotCi0gICAgYXV0byYgc3R5bGUgPSBpbmxpbmVUZXh0Qm94LnN0eWxlKCk7Ci0gICAg
YXV0byYgZm9udCA9IHN0eWxlLmZvbnRDYXNjYWRlKCk7Ci0gICAgYXV0byB3aGl0ZXNwYWNlQ29u
dGVudElzVHJlYXRlZEFzU2luZ2xlU3BhY2UgPSAhVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3Bh
Y2VzQW5kVGFicyhpbmxpbmVUZXh0Qm94KTsKLSAgICBhdXRvIHNob3VsZFByZXNlcnZlTmV3bGlu
ZSA9IFRleHRVdGlsOjpzaG91bGRQcmVzZXJ2ZU5ld2xpbmUoaW5saW5lVGV4dEJveCk7Ci0gICAg
YXV0byBsaW5lQnJlYWtJdGVyYXRvciA9IExhenlMaW5lQnJlYWtJdGVyYXRvciB7IHRleHQsIHN0
eWxlLmNvbXB1dGVkTG9jYWxlKCksIFRleHRVdGlsOjpsaW5lQnJlYWtJdGVyYXRvck1vZGUoc3R5
bGUubGluZUJyZWFrKCkpIH07Ci0gICAgdW5zaWduZWQgY3VycmVudFBvc2l0aW9uID0gMDsKLQot
ICAgIGF1dG8gaW5saW5lSXRlbVdpZHRoID0gWyZdKGF1dG8gc3RhcnRQb3NpdGlvbiwgYXV0byBs
ZW5ndGgpIC0+IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsKLSAgICAgICAgaWYgKCFpbmxp
bmVUZXh0Qm94LmNhblVzZVNpbXBsaWZpZWRDb250ZW50TWVhc3VyaW5nKCkpCi0gICAgICAgICAg
ICByZXR1cm4geyB9OwotICAgICAgICByZXR1cm4gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRC
b3gsIHN0YXJ0UG9zaXRpb24sIHN0YXJ0UG9zaXRpb24gKyBsZW5ndGgsIHsgfSk7Ci0gICAgfTsK
LQotICAgIHdoaWxlIChjdXJyZW50UG9zaXRpb24gPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAg
IGF1dG8gaXNTZWdtZW50QnJlYWtDYW5kaWRhdGUgPSBbXShhdXRvIGNoYXJhY3RlcikgewotICAg
ICAgICAgICAgcmV0dXJuIGNoYXJhY3RlciA9PSAnXG4nOwotICAgICAgICB9OwotCi0gICAgICAg
IC8vIFNlZ21lbnQgYnJlYWtzIHdpdGggcHJlc2VydmUgbmV3IGxpbmUgc3R5bGUgKHdoaXRlLXNw
YWNlOiBwcmUsIHByZS13cmFwLCBicmVhay1zcGFjZXMgYW5kIHByZS1saW5lKSBjb21wdXRlIHRv
IGZvcmNlZCBsaW5lIGJyZWFrLgotICAgICAgICBpZiAoaXNTZWdtZW50QnJlYWtDYW5kaWRhdGUo
dGV4dFtjdXJyZW50UG9zaXRpb25dKSAmJiBzaG91bGRQcmVzZXJ2ZU5ld2xpbmUpIHsKLSAgICAg
ICAgICAgIGlubGluZUNvbnRlbnQuYXBwZW5kKElubGluZVNvZnRMaW5lQnJlYWtJdGVtOjpjcmVh
dGVTb2Z0TGluZUJyZWFrSXRlbShpbmxpbmVUZXh0Qm94LCBjdXJyZW50UG9zaXRpb24pKTsKLSAg
ICAgICAgICAgICsrY3VycmVudFBvc2l0aW9uOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgIH0KLQotICAgICAgICBpZiAoYXV0byB3aGl0ZXNwYWNlQ29udGVudCA9IG1vdmVUb05leHRO
b25XaGl0ZXNwYWNlUG9zaXRpb24odGV4dCwgY3VycmVudFBvc2l0aW9uLCBzaG91bGRQcmVzZXJ2
ZU5ld2xpbmUsICF3aGl0ZXNwYWNlQ29udGVudElzVHJlYXRlZEFzU2luZ2xlU3BhY2UpKSB7Ci0g
ICAgICAgICAgICBBU1NFUlQod2hpdGVzcGFjZUNvbnRlbnQtPmxlbmd0aCk7Ci0gICAgICAgICAg
ICBhdXRvIGFwcGVuZFdoaXRlc3BhY2VJdGVtID0gWyZdIChhdXRvIHN0YXJ0UG9zaXRpb24sIGF1
dG8gaXRlbUxlbmd0aCkgewotICAgICAgICAgICAgICAgIGF1dG8gc2ltcGxlU2luZ2xlV2hpdGVz
cGFjZUNvbnRlbnQgPSBpbmxpbmVUZXh0Qm94LmNhblVzZVNpbXBsaWZpZWRDb250ZW50TWVhc3Vy
aW5nKCkgJiYgKGl0ZW1MZW5ndGggPT0gMSB8fCB3aGl0ZXNwYWNlQ29udGVudElzVHJlYXRlZEFz
U2luZ2xlU3BhY2UpOwotICAgICAgICAgICAgICAgIGF1dG8gd2lkdGggPSBzaW1wbGVTaW5nbGVX
aGl0ZXNwYWNlQ29udGVudCA/IG1ha2VPcHRpb25hbChJbmxpbmVMYXlvdXRVbml0IHsgZm9udC5z
cGFjZVdpZHRoKCkgfSkgOiBpbmxpbmVJdGVtV2lkdGgoc3RhcnRQb3NpdGlvbiwgaXRlbUxlbmd0
aCk7Ci0gICAgICAgICAgICAgICAgaW5saW5lQ29udGVudC5hcHBlbmQoSW5saW5lVGV4dEl0ZW06
OmNyZWF0ZVdoaXRlc3BhY2VJdGVtKGlubGluZVRleHRCb3gsIHN0YXJ0UG9zaXRpb24sIGl0ZW1M
ZW5ndGgsIHdoaXRlc3BhY2VDb250ZW50LT5pc1dvcmRTZXBhcmF0b3IsIHdpZHRoKSk7Ci0gICAg
ICAgICAgICB9OwotICAgICAgICAgICAgaWYgKHN0eWxlLndoaXRlU3BhY2UoKSA9PSBXaGl0ZVNw
YWNlOjpCcmVha1NwYWNlcykgewotICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9y
Zy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1waGFzZS0xCi0gICAgICAgICAgICAgICAgLy8g
Rm9yIGJyZWFrLXNwYWNlcywgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgZXhpc3RzIGFmdGVyIGV2
ZXJ5IHNwYWNlIGFuZCBldmVyeSB0YWIuCi0gICAgICAgICAgICAgICAgLy8gRklYTUU6IGlmIHRo
aXMgdHVybnMgb3V0IHRvIGJlIGEgcGVyZiBoaXQgd2l0aCB0b28gbWFueSBpbmRpdmlkdWFsIHdo
aXRlc3BhY2UgaW5saW5lIGl0ZW1zLCB3ZSBzaG91bGQgdHJhbnNpdGlvbiB0aGlzIGxvZ2ljIHRv
IGxpbmUgYnJlYWtpbmcuCi0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3
aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoOyArK2kpCi0gICAgICAgICAgICAgICAgICAgIGFwcGVu
ZFdoaXRlc3BhY2VJdGVtKGN1cnJlbnRQb3NpdGlvbiArIGksIDEpOwotICAgICAgICAgICAgfSBl
bHNlCi0gICAgICAgICAgICAgICAgYXBwZW5kV2hpdGVzcGFjZUl0ZW0oY3VycmVudFBvc2l0aW9u
LCB3aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoKTsKLSAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlv
biArPSB3aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoOwotICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgIH0KLQotICAgICAgICBhdXRvIGhhc1RyYWlsaW5nU29mdEh5cGhlbiA9IGZhbHNlOwot
ICAgICAgICBhdXRvIGluaXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRpb24gPSBjdXJyZW50UG9zaXRp
b247Ci0gICAgICAgIGF1dG8gaXNBdFNvZnRIeXBoZW4gPSBbJl0oYXV0byBwb3NpdGlvbikgewot
ICAgICAgICAgICAgcmV0dXJuIHRleHRbcG9zaXRpb25dID09IHNvZnRIeXBoZW47Ci0gICAgICAg
IH07Ci0gICAgICAgIGlmIChzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVuczo6Tm9uZSkgewotICAg
ICAgICAgICAgLy8gTGV0J3MgbWVyZ2UgY2FuZGlkYXRlIElubGluZVRleHRJdGVtcyBzZXBhcmF0
ZWQgYnkgc29mdCBoeXBoZW4gd2hlbiB0aGUgc3R5bGUgc2F5cyBzby4KLSAgICAgICAgICAgIHdo
aWxlIChjdXJyZW50UG9zaXRpb24gPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAg
YXV0byBub25XaGl0ZVNwYWNlTGVuZ3RoID0gbW92ZVRvTmV4dEJyZWFrYWJsZVBvc2l0aW9uKGN1
cnJlbnRQb3NpdGlvbiwgbGluZUJyZWFrSXRlcmF0b3IsIHN0eWxlKTsKLSAgICAgICAgICAgICAg
ICBBU1NFUlQobm9uV2hpdGVTcGFjZUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgY3VycmVudFBv
c2l0aW9uICs9IG5vbldoaXRlU3BhY2VMZW5ndGg7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0F0
U29mdEh5cGhlbihjdXJyZW50UG9zaXRpb24gLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdXRvIG5v
bldoaXRlU3BhY2VMZW5ndGggPSBtb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24oaW5pdGlhbE5v
bldoaXRlc3BhY2VQb3NpdGlvbiwgbGluZUJyZWFrSXRlcmF0b3IsIHN0eWxlKTsKLSAgICAgICAg
ICAgIEFTU0VSVChub25XaGl0ZVNwYWNlTGVuZ3RoKTsKLSAgICAgICAgICAgIGN1cnJlbnRQb3Np
dGlvbiArPSBub25XaGl0ZVNwYWNlTGVuZ3RoOwotICAgICAgICAgICAgaGFzVHJhaWxpbmdTb2Z0
SHlwaGVuID0gaXNBdFNvZnRIeXBoZW4oY3VycmVudFBvc2l0aW9uIC0gMSk7Ci0gICAgICAgIH0K
LSAgICAgICAgQVNTRVJUKGluaXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRpb24gPCBjdXJyZW50UG9z
aXRpb24pOwotICAgICAgICBBU1NFUlRfSU1QTElFUyhzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVu
czo6Tm9uZSwgIWhhc1RyYWlsaW5nU29mdEh5cGhlbik7Ci0gICAgICAgIGF1dG8gbGVuZ3RoID0g
Y3VycmVudFBvc2l0aW9uIC0gaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbjsKLSAgICAgICAg
aW5saW5lQ29udGVudC5hcHBlbmQoSW5saW5lVGV4dEl0ZW06OmNyZWF0ZU5vbldoaXRlc3BhY2VJ
dGVtKGlubGluZVRleHRCb3gsIGluaXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRpb24sIGxlbmd0aCwg
aGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBpbmxpbmVJdGVtV2lkdGgoaW5pdGlhbE5vbldoaXRlc3Bh
Y2VQb3NpdGlvbiwgbGVuZ3RoKSkpOwotICAgIH0KLX0KLQotYm9vbCBJbmxpbmVUZXh0SXRlbTo6
aXNFbXB0eUNvbnRlbnQoKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sg
Zm9yIG1vcmUgemVybyB3aWR0aCBjb250ZW50IGFuZCBub3QganVzdCBVKzIwMEIuCi0gICAgcmV0
dXJuICFtX2xlbmd0aCB8fCAobV9sZW5ndGggPT0gMSAmJiBpbmxpbmVUZXh0Qm94KCkuY29udGVu
dCgpW3N0YXJ0KCldID09IHplcm9XaWR0aFNwYWNlKTsgCi19Ci0KLWJvb2wgSW5saW5lVGV4dEl0
ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhjb25zdCBJbmxpbmVUZXh0SXRlbSYgaW5s
aW5lVGV4dEl0ZW0pCi17Ci0gICAgQVNTRVJUKGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgp
KTsKLSAgICByZXR1cm4gVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxp
bmVUZXh0SXRlbS5sYXlvdXRCb3goKSk7Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uaCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmgK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGM5OGRjZjA2YTE5YWEwNWZjNGFhMGFh
MjRkOTgzYTViN2NkMTUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0
ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
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
ZGUgIklubGluZUl0ZW0uaCIKLSNpbmNsdWRlICJMYXlvdXRJbmxpbmVUZXh0Qm94LmgiCi0KLW5h
bWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi11c2luZyBJbmxpbmVJdGVt
cyA9IFZlY3RvcjxJbmxpbmVJdGVtPjsKLQotY2xhc3MgSW5saW5lVGV4dEl0ZW0gOiBwdWJsaWMg
SW5saW5lSXRlbSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgY3JlYXRlQW5kQXBwZW5kVGV4
dEl0ZW1zKElubGluZUl0ZW1zJiwgY29uc3QgSW5saW5lVGV4dEJveCYpOwotCi0gICAgdW5zaWdu
ZWQgc3RhcnQoKSBjb25zdCB7IHJldHVybiBtX3N0YXJ0T3JQb3NpdGlvbjsgfQotICAgIHVuc2ln
bmVkIGVuZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0KCkgKyBsZW5ndGgoKTsgfQotICAgIHVuc2ln
bmVkIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbGVuZ3RoOyB9Ci0KLSAgICBib29sIGlzV2hp
dGVzcGFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGV4dEl0ZW1UeXBlID09IFRleHRJdGVtVHlwZTo6
V2hpdGVzcGFjZTsgfQotICAgIGJvb2wgaXNXb3JkU2VwYXJhdG9yKCkgY29uc3QgeyByZXR1cm4g
bV9pc1dvcmRTZXBhcmF0b3I7IH0KLSAgICBib29sIGhhc1RyYWlsaW5nU29mdEh5cGhlbigpIGNv
bnN0IHsgcmV0dXJuIG1faGFzVHJhaWxpbmdTb2Z0SHlwaGVuOyB9Ci0gICAgT3B0aW9uYWw8SW5s
aW5lTGF5b3V0VW5pdD4gd2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2hhc1dpZHRoID8gbWFrZU9w
dGlvbmFsKG1fd2lkdGgpIDogT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geyB9OyB9Ci0gICAg
Ym9vbCBpc0VtcHR5Q29udGVudCgpIGNvbnN0OwotCi0gICAgY29uc3QgSW5saW5lVGV4dEJveCYg
aW5saW5lVGV4dEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PElubGluZVRleHRCb3g+KGxh
eW91dEJveCgpKTsgfQotCi0gICAgSW5saW5lVGV4dEl0ZW0gbGVmdCh1bnNpZ25lZCBsZW5ndGgp
IGNvbnN0OwotICAgIElubGluZVRleHRJdGVtIHJpZ2h0KHVuc2lnbmVkIGxlbmd0aCkgY29uc3Q7
Ci0KLSAgICBzdGF0aWMgYm9vbCBzaG91bGRQcmVzZXJ2ZVNwYWNlc0FuZFRhYnMoY29uc3QgSW5s
aW5lVGV4dEl0ZW0mKTsKLQotcHJpdmF0ZToKLSAgICB1c2luZyBJbmxpbmVJdGVtOjpUZXh0SXRl
bVR5cGU7Ci0KLSAgICBJbmxpbmVUZXh0SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWdu
ZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIGJv
b2wgaXNXb3JkU2VwYXJhdG9yLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCwgVGV4
dEl0ZW1UeXBlKTsKLSAgICBleHBsaWNpdCBJbmxpbmVUZXh0SXRlbShjb25zdCBJbmxpbmVUZXh0
Qm94Jik7Ci0KLSAgICBzdGF0aWMgSW5saW5lVGV4dEl0ZW0gY3JlYXRlV2hpdGVzcGFjZUl0ZW0o
Y29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJv
b2wgaXNXb3JkU2VwYXJhdG9yLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCk7Ci0g
ICAgc3RhdGljIElubGluZVRleHRJdGVtIGNyZWF0ZU5vbldoaXRlc3BhY2VJdGVtKGNvbnN0IElu
bGluZVRleHRCb3gmLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGhhc1Ry
YWlsaW5nU29mdEh5cGhlbiwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgpOwotICAg
IHN0YXRpYyBJbmxpbmVUZXh0SXRlbSBjcmVhdGVFbXB0eUl0ZW0oY29uc3QgSW5saW5lVGV4dEJv
eCYpOwotfTsKLQotaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpjcmVhdGVX
aGl0ZXNwYWNlSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25l
ZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGlzV29yZFNlcGFyYXRvciwgT3B0aW9uYWw8
SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgpCi17Ci0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwg
c3RhcnQsIGxlbmd0aCwgZmFsc2UsIGlzV29yZFNlcGFyYXRvciwgd2lkdGgsIFRleHRJdGVtVHlw
ZTo6V2hpdGVzcGFjZSB9OwotfQotCi1pbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5saW5lVGV4dEl0
ZW06OmNyZWF0ZU5vbldoaXRlc3BhY2VJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRl
eHRCb3gsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wgaGFzVHJhaWxpbmdT
b2Z0SHlwaGVuLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCkKLXsKLSAgICAvLyBG
SVhNRTogVXNlIHRoZSBmb2xsb3dpbmcgbGlzdCBvZiBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJz
IHRvIHNldCB0aGUgImlzV29yZFNlcGFyYXRvciIgYml0OiBub0JyZWFrU3BhY2UsIGV0aGlvcGlj
V29yZHNwYWNlLCBhZWdlYW5Xb3JkU2VwYXJhdG9yTGluZSBhZWdlYW5Xb3JkU2VwYXJhdG9yRG90
IHVnYXJpdGljV29yZERpdmlkZXIuCi0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgc3RhcnQs
IGxlbmd0aCwgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBmYWxzZSwgd2lkdGgsIFRleHRJdGVtVHlw
ZTo6Tm9uV2hpdGVzcGFjZSB9OwotfQotCi1pbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5saW5lVGV4
dEl0ZW06OmNyZWF0ZUVtcHR5SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94
KQotewotICAgIHJldHVybiBJbmxpbmVUZXh0SXRlbSB7IGlubGluZVRleHRCb3ggfTsKLX0KLQot
aW5saW5lIElubGluZVRleHRJdGVtOjpJbmxpbmVUZXh0SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94
JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGhh
c1RyYWlsaW5nU29mdEh5cGhlbiwgYm9vbCBpc1dvcmRTZXBhcmF0b3IsIE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+IHdpZHRoLCBUZXh0SXRlbVR5cGUgdGV4dEl0ZW1UeXBlKQotICAgIDogSW5s
aW5lSXRlbShpbmxpbmVUZXh0Qm94LCBUeXBlOjpUZXh0KQotewotICAgIG1fc3RhcnRPclBvc2l0
aW9uID0gc3RhcnQ7Ci0gICAgbV9sZW5ndGggPSBsZW5ndGg7Ci0gICAgbV9oYXNXaWR0aCA9ICEh
d2lkdGg7Ci0gICAgbV9oYXNUcmFpbGluZ1NvZnRIeXBoZW4gPSBoYXNUcmFpbGluZ1NvZnRIeXBo
ZW47Ci0gICAgbV9pc1dvcmRTZXBhcmF0b3IgPSBpc1dvcmRTZXBhcmF0b3I7Ci0gICAgbV93aWR0
aCA9IHdpZHRoLnZhbHVlT3IoMCk7Ci0gICAgbV90ZXh0SXRlbVR5cGUgPSB0ZXh0SXRlbVR5cGU7
Ci19Ci0KLWlubGluZSBJbmxpbmVUZXh0SXRlbTo6SW5saW5lVGV4dEl0ZW0oY29uc3QgSW5saW5l
VGV4dEJveCYgaW5saW5lVGV4dEJveCkKLSAgICA6IElubGluZUl0ZW0oaW5saW5lVGV4dEJveCwg
VHlwZTo6VGV4dCkKLXsKLX0KLQotaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVt
OjpsZWZ0KHVuc2lnbmVkIGxlbmd0aCkgY29uc3QKLXsKLSAgICBSRUxFQVNFX0FTU0VSVChsZW5n
dGggPD0gdGhpcy0+bGVuZ3RoKCkpOwotICAgIEFTU0VSVChtX3RleHRJdGVtVHlwZSAhPSBUZXh0
SXRlbVR5cGU6OlVuZGVmaW5lZCk7Ci0gICAgQVNTRVJUKGxlbmd0aCk7Ci0gICAgcmV0dXJuIHsg
aW5saW5lVGV4dEJveCgpLCBzdGFydCgpLCBsZW5ndGgsIGZhbHNlLCBpc1dvcmRTZXBhcmF0b3Io
KSwgV1RGOjpudWxsb3B0LCBtX3RleHRJdGVtVHlwZSB9OwotfQotCi1pbmxpbmUgSW5saW5lVGV4
dEl0ZW0gSW5saW5lVGV4dEl0ZW06OnJpZ2h0KHVuc2lnbmVkIGxlbmd0aCkgY29uc3QKLXsKLSAg
ICBSRUxFQVNFX0FTU0VSVChsZW5ndGggPD0gdGhpcy0+bGVuZ3RoKCkpOwotICAgIEFTU0VSVCht
X3RleHRJdGVtVHlwZSAhPSBUZXh0SXRlbVR5cGU6OlVuZGVmaW5lZCk7Ci0gICAgQVNTRVJUKGxl
bmd0aCk7Ci0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCgpLCBlbmQoKSAtIGxlbmd0aCwgbGVu
Z3RoLCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4oKSwgaXNXb3JkU2VwYXJhdG9yKCksIFdURjo6bnVs
bG9wdCwgbV90ZXh0SXRlbVR5cGUgfTsKLX0KLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJB
SVRTX0lOTElORV9JVEVNKElubGluZVRleHRJdGVtLCBpc1RleHQoKSkKLQotI2VuZGlmCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRV
dGlsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4
dFV0aWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTU3NWJjZTcyODUzYThj
OWRiZjM2MmY0ZmM5YjE5OTc2YWIyNTIwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3Rl
eHQvVGV4dFV0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgot
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
LSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGV4dFV0aWwuaCIKLQotI2lmIEVO
QUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQnJlYWtMaW5lcy5o
IgotI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCi0jaW5jbHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIK
LSNpbmNsdWRlICJMYXlvdXRJbmxpbmVUZXh0Qm94LmgiCi0jaW5jbHVkZSAiUmVuZGVyQm94Lmgi
Ci0jaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNw
YWNlIExheW91dCB7Ci0KLUlubGluZUxheW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElu
bGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9n
aWNhbExlZnQpCi17Ci0gICAgcmV0dXJuIFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwg
aW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwgaW5saW5lVGV4dEl0ZW0uZW5kKCksIGNvbnRlbnRMb2dp
Y2FsTGVmdCk7Ci19Ci0KLUlubGluZUxheW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElu
bGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8s
IElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KQotewotICAgIFJFTEVBU0VfQVNT
RVJUKGZyb20gPj0gaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSk7Ci0gICAgUkVMRUFTRV9BU1NFUlQo
dG8gPD0gaW5saW5lVGV4dEl0ZW0uZW5kKCkpOwotICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1do
aXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFi
cyhpbmxpbmVUZXh0SXRlbSkpIHsKLSAgICAgICAgYXV0byBzcGFjZVdpZHRoID0gaW5saW5lVGV4
dEl0ZW0uc3R5bGUoKS5mb250Q2FzY2FkZSgpLnNwYWNlV2lkdGgoKTsKLSAgICAgICAgcmV0dXJu
IHN0ZDo6aXNuYW4oc3BhY2VXaWR0aCkgPyAwLjBmIDogc3RkOjppc2luZihzcGFjZVdpZHRoKSA/
IG1heElubGluZUxheW91dFVuaXQoKSA6IHNwYWNlV2lkdGg7Ci0gICAgfQotICAgIHJldHVybiBU
ZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpLCBmcm9tLCB0bywg
Y29udGVudExvZ2ljYWxMZWZ0KTsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBUZXh0VXRpbDo6d2lk
dGgoY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgZnJvbSwgdW5z
aWduZWQgdG8sIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KQotewotICAgIGlm
IChmcm9tID09IHRvKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGF1dG8mIHN0eWxlID0gaW5s
aW5lVGV4dEJveC5zdHlsZSgpOwotICAgIGF1dG8mIGZvbnQgPSBzdHlsZS5mb250Q2FzY2FkZSgp
OwotICAgIGF1dG8gdGV4dCA9IGlubGluZVRleHRCb3guY29udGVudCgpOwotICAgIEFTU0VSVCh0
byA8PSB0ZXh0Lmxlbmd0aCgpKTsKLSAgICBhdXRvIGhhc0tlcm5pbmdPckxpZ2F0dXJlcyA9IGZv
bnQuZW5hYmxlS2VybmluZygpIHx8IGZvbnQucmVxdWlyZXNTaGFwaW5nKCk7Ci0gICAgYXV0byBt
ZWFzdXJlV2l0aEVuZFNwYWNlID0gaGFzS2VybmluZ09yTGlnYXR1cmVzICYmIHRvIDwgdGV4dC5s
ZW5ndGgoKSAmJiB0ZXh0W3RvXSA9PSAnICc7Ci0gICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2Up
Ci0gICAgICAgICsrdG87Ci0gICAgZmxvYXQgd2lkdGggPSAwOwotICAgIGlmIChpbmxpbmVUZXh0
Qm94LmNhblVzZVNpbXBsaWZpZWRDb250ZW50TWVhc3VyaW5nKCkpCi0gICAgICAgIHdpZHRoID0g
Zm9udC53aWR0aEZvclNpbXBsZVRleHQoU3RyaW5nVmlldyh0ZXh0KS5zdWJzdHJpbmcoZnJvbSwg
dG8gLSBmcm9tKSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF1dG8gdGFiV2lkdGggPSBzdHlsZS5j
b2xsYXBzZVdoaXRlU3BhY2UoKSA/IFRhYlNpemUoMCkgOiBzdHlsZS50YWJTaXplKCk7Ci0gICAg
ICAgIFdlYkNvcmU6OlRleHRSdW4gcnVuKFN0cmluZ1ZpZXcodGV4dCkuc3Vic3RyaW5nKGZyb20s
IHRvIC0gZnJvbSksIGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0gICAgICAgIGlmICh0YWJXaWR0aCkK
LSAgICAgICAgICAgIHJ1bi5zZXRUYWJTaXplKHRydWUsIHRhYldpZHRoKTsKLSAgICAgICAgd2lk
dGggPSBmb250LndpZHRoKHJ1bik7Ci0gICAgfQotCi0gICAgaWYgKG1lYXN1cmVXaXRoRW5kU3Bh
Y2UpCi0gICAgICAgIHdpZHRoIC09IChmb250LnNwYWNlV2lkdGgoKSArIGZvbnQud29yZFNwYWNp
bmcoKSk7Ci0KLSAgICByZXR1cm4gc3RkOjppc25hbih3aWR0aCkgPyAwLjBmIDogc3RkOjppc2lu
Zih3aWR0aCkgPyBtYXhJbmxpbmVMYXlvdXRVbml0KCkgOiB3aWR0aDsKLX0KLQotVGV4dFV0aWw6
OlNwbGl0RGF0YSBUZXh0VXRpbDo6c3BsaXQoY29uc3QgSW5saW5lVGV4dEl0ZW0mIGlubGluZVRl
eHRJdGVtLCBJbmxpbmVMYXlvdXRVbml0IHRleHRXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBhdmFp
bGFibGVXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpCi17Ci0gICAg
QVNTRVJUKGF2YWlsYWJsZVdpZHRoID49IDApOwotICAgIGF1dG8gc3RhcnRQb3NpdGlvbiA9IGlu
bGluZVRleHRJdGVtLnN0YXJ0KCk7Ci0gICAgYXV0byBsZW5ndGggPSBpbmxpbmVUZXh0SXRlbS5s
ZW5ndGgoKTsKLSAgICBBU1NFUlQobGVuZ3RoKTsKLQotICAgIGF1dG8gbGVmdCA9IHN0YXJ0UG9z
aXRpb247Ci0gICAgLy8gUGF0aG9sb2dpY2FsIGNhc2Ugb2YgKGV4dHJlbWVseSlsb25nIHN0cmlu
ZyBhbmQgbmFycm93IGxpbmVzLgotICAgIC8vIEFkanVzdCB0aGUgcmFuZ2Ugc28gdGhhdCB3ZSBj
YW4gcGljayBhIHJlYXNvbmFibGUgbWlkcG9pbnQuCi0gICAgSW5saW5lTGF5b3V0VW5pdCBhdmVy
YWdlQ2hhcmFjdGVyV2lkdGggPSB0ZXh0V2lkdGggLyBsZW5ndGg7Ci0gICAgdW5zaWduZWQgb2Zm
c2V0ID0gdG9MYXlvdXRVbml0KDIgKiBhdmFpbGFibGVXaWR0aCAvIGF2ZXJhZ2VDaGFyYWN0ZXJX
aWR0aCkudG9VbnNpZ25lZCgpOwotICAgIGF1dG8gcmlnaHQgPSBzdGQ6Om1pbjx1bnNpZ25lZD4o
bGVmdCArIG9mZnNldCwgKHN0YXJ0UG9zaXRpb24gKyBsZW5ndGggLSAxKSk7Ci0gICAgLy8gUHJl
c2VydmUgdGhlIGxlZnQgd2lkdGggZm9yIHRoZSBmaW5hbCBzcGxpdCBwb3NpdGlvbiBzbyB0aGF0
IHdlIGRvbid0IG5lZWQgdG8gcmVtZWFzdXJlIHRoZSBsZWZ0IHNpZGUgYWdhaW4uCi0gICAgSW5s
aW5lTGF5b3V0VW5pdCBsZWZ0U2lkZVdpZHRoID0gMDsKLSAgICB3aGlsZSAobGVmdCA8IHJpZ2h0
KSB7Ci0gICAgICAgIGF1dG8gbWlkZGxlID0gKGxlZnQgKyByaWdodCkgLyAyOwotICAgICAgICBh
dXRvIHdpZHRoID0gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRJdGVtLCBzdGFydFBvc2l0aW9u
LCBtaWRkbGUgKyAxLCBjb250ZW50TG9naWNhbExlZnQpOwotICAgICAgICBpZiAod2lkdGggPCBh
dmFpbGFibGVXaWR0aCkgewotICAgICAgICAgICAgbGVmdCA9IG1pZGRsZSArIDE7Ci0gICAgICAg
ICAgICBsZWZ0U2lkZVdpZHRoID0gd2lkdGg7Ci0gICAgICAgIH0gZWxzZSBpZiAod2lkdGggPiBh
dmFpbGFibGVXaWR0aCkKLSAgICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlOwotICAgICAgICBlbHNl
IHsKLSAgICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlICsgMTsKLSAgICAgICAgICAgIGxlZnRTaWRl
V2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAg
IHJldHVybiB7IHN0YXJ0UG9zaXRpb24sIHJpZ2h0IC0gc3RhcnRQb3NpdGlvbiwgbGVmdFNpZGVX
aWR0aCB9OwotfQotCi11bnNpZ25lZCBUZXh0VXRpbDo6ZmluZE5leHRCcmVha2FibGVQb3NpdGlv
bihMYXp5TGluZUJyZWFrSXRlcmF0b3ImIGxpbmVCcmVha0l0ZXJhdG9yLCB1bnNpZ25lZCBzdGFy
dFBvc2l0aW9uLCBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUpCi17Ci0gICAgYXV0byBrZWVwQWxs
V29yZHNGb3JDSksgPSBzdHlsZS53b3JkQnJlYWsoKSA9PSBXb3JkQnJlYWs6OktlZXBBbGw7Ci0g
ICAgYXV0byBicmVha05CU1AgPSBzdHlsZS5hdXRvV3JhcCgpICYmIHN0eWxlLm5ic3BNb2RlKCkg
PT0gTkJTUE1vZGU6OlNwYWNlOwotCi0gICAgaWYgKGtlZXBBbGxXb3Jkc0ZvckNKSykgewotICAg
ICAgICBpZiAoYnJlYWtOQlNQKQotICAgICAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3Np
dGlvbktlZXBpbmdBbGxXb3JkcyhsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Ci0g
ICAgICAgIHJldHVybiBuZXh0QnJlYWthYmxlUG9zaXRpb25LZWVwaW5nQWxsV29yZHNJZ25vcmlu
Z05CU1AobGluZUJyZWFrSXRlcmF0b3IsIHN0YXJ0UG9zaXRpb24pOwotICAgIH0KLQotICAgIGlm
IChsaW5lQnJlYWtJdGVyYXRvci5tb2RlKCkgPT0gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpEZWZh
dWx0KSB7Ci0gICAgICAgIGlmIChicmVha05CU1ApCi0gICAgICAgICAgICByZXR1cm4gV2ViQ29y
ZTo6bmV4dEJyZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9u
KTsKLSAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbklnbm9yaW5nTkJTUChsaW5l
QnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Ci0gICAgfQotCi0gICAgaWYgKGJyZWFrTkJT
UCkKLSAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbldpdGhvdXRTaG9ydGN1dChs
aW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Ci0gICAgcmV0dXJuIG5leHRCcmVha2Fi
bGVQb3NpdGlvbklnbm9yaW5nTkJTUFdpdGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJdGVyYXRvciwg
c3RhcnRQb3NpdGlvbik7Ci19Ci0KLWJvb2wgVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2Vz
QW5kVGFicyhjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICAvLyBodHRwczovL3d3dy53My5v
cmcvVFIvY3NzLXRleHQtMy8jd2hpdGUtc3BhY2UtcHJvcGVydHkKLSAgICBhdXRvIHdoaXRlc3Bh
Y2UgPSBsYXlvdXRCb3guc3R5bGUoKS53aGl0ZVNwYWNlKCk7Ci0gICAgcmV0dXJuIHdoaXRlc3Bh
Y2UgPT0gV2hpdGVTcGFjZTo6UHJlIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlV3Jh
cCB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OkJyZWFrU3BhY2VzOwotfQotCi1ib29sIFRl
eHRVdGlsOjpzaG91bGRQcmVzZXJ2ZU5ld2xpbmUoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0g
ICAgYXV0byB3aGl0ZXNwYWNlID0gbGF5b3V0Qm94LnN0eWxlKCkud2hpdGVTcGFjZSgpOwotICAg
IC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0
eQotICAgIHJldHVybiB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZSB8fCB3aGl0ZXNwYWNl
ID09IFdoaXRlU3BhY2U6OlByZVdyYXAgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpCcmVh
a1NwYWNlcyB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZUxpbmU7IAotfQotCi1MaW5l
QnJlYWtJdGVyYXRvck1vZGUgVGV4dFV0aWw6OmxpbmVCcmVha0l0ZXJhdG9yTW9kZShMaW5lQnJl
YWsgbGluZUJyZWFrKQotewotICAgIHN3aXRjaCAobGluZUJyZWFrKSB7Ci0gICAgY2FzZSBMaW5l
QnJlYWs6OkF1dG86Ci0gICAgY2FzZSBMaW5lQnJlYWs6OkFmdGVyV2hpdGVTcGFjZToKLSAgICBj
YXNlIExpbmVCcmVhazo6QW55d2hlcmU6Ci0gICAgICAgIHJldHVybiBMaW5lQnJlYWtJdGVyYXRv
ck1vZGU6OkRlZmF1bHQ7Ci0gICAgY2FzZSBMaW5lQnJlYWs6Okxvb3NlOgotICAgICAgICByZXR1
cm4gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpMb29zZTsKLSAgICBjYXNlIExpbmVCcmVhazo6Tm9y
bWFsOgotICAgICAgICByZXR1cm4gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpOb3JtYWw7Ci0gICAg
Y2FzZSBMaW5lQnJlYWs6OlN0cmljdDoKLSAgICAgICAgcmV0dXJuIExpbmVCcmVha0l0ZXJhdG9y
TW9kZTo6U3RyaWN0OwotICAgIH0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1
cm4gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpEZWZhdWx0OwotfQotCi19Ci19Ci0jZW5kaWYKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4
dFV0aWwuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4
dFV0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1ODRmYTc5ODFiZDQzODNj
ZjQzZTIzYTRiZmFlYjgyMGNlMzJmMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy90ZXh0
L1RleHRVdGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
Ci0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAq
Ci0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQot
I3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQot
I2luY2x1ZGUgIklubGluZUl0ZW0uaCIKLSNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgotI2luY2x1
ZGUgPHd0Zi90ZXh0L1RleHRCcmVha0l0ZXJhdG9yLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsK
LQotY2xhc3MgUmVuZGVyU3R5bGU7Ci0KLW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBJbmxp
bmVUZXh0Qm94OwotY2xhc3MgSW5saW5lVGV4dEl0ZW07Ci0KLWNsYXNzIFRleHRVdGlsIHsKLXB1
YmxpYzoKLSAgICBzdGF0aWMgSW5saW5lTGF5b3V0VW5pdCB3aWR0aChjb25zdCBJbmxpbmVUZXh0
SXRlbSYsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KTsKLSAgICBzdGF0aWMg
SW5saW5lTGF5b3V0VW5pdCB3aWR0aChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIHVuc2lnbmVkIGZy
b20sIHVuc2lnbmVkIHRvLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0g
ICAgc3RhdGljIElubGluZUxheW91dFVuaXQgd2lkdGgoY29uc3QgSW5saW5lVGV4dEJveCYsIHVu
c2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2Fs
TGVmdCk7Ci0KLSAgICBzdHJ1Y3QgU3BsaXREYXRhIHsKLSAgICAgICAgdW5zaWduZWQgc3RhcnQg
eyAwIH07Ci0gICAgICAgIHVuc2lnbmVkIGxlbmd0aCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsV2lkdGggeyAwIH07Ci0gICAgfTsKLSAgICBzdGF0aWMgU3BsaXREYXRh
IHNwbGl0KGNvbnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCB0ZXh0V2lkdGgs
IElubGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgsIElubGluZUxheW91dFVuaXQgY29udGVu
dExvZ2ljYWxMZWZ0KTsKLQotICAgIHN0YXRpYyB1bnNpZ25lZCBmaW5kTmV4dEJyZWFrYWJsZVBv
c2l0aW9uKExhenlMaW5lQnJlYWtJdGVyYXRvciYsIHVuc2lnbmVkIHN0YXJ0UG9zaXRpb24sIGNv
bnN0IFJlbmRlclN0eWxlJik7Ci0gICAgc3RhdGljIExpbmVCcmVha0l0ZXJhdG9yTW9kZSBsaW5l
QnJlYWtJdGVyYXRvck1vZGUoTGluZUJyZWFrKTsKLQotICAgIHN0YXRpYyBib29sIHNob3VsZFBy
ZXNlcnZlU3BhY2VzQW5kVGFicyhjb25zdCBCb3gmKTsKLSAgICBzdGF0aWMgYm9vbCBzaG91bGRQ
cmVzZXJ2ZU5ld2xpbmUoY29uc3QgQm94Jik7Ci19OwotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5n
Q29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxl
Rm9ybWF0dGluZ0NvbnRleHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDJh
ZjdjNWVkODhkNTA0Y2FjNDI1YTEzNTIxMDA4YjZlNThiOWFjLi4wMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZv
cm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1
MjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6
Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
Ci0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJU
YWJsZUZvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdf
Q09OVEVYVCkKLQotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAi
RmxvYXRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgotI2lu
Y2x1ZGUgIkludmFsaWRhdGlvblN0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5j
bHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDaGlsZEl0ZXJhdG9y
LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxD
b250YWluaW5nQmxvY2suaCIKLSNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdTdGF0ZS5oIgotI2lu
Y2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoVGFibGVGb3Jt
YXR0aW5nQ29udGV4dCk7Ci0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGFibGVzLTMv
I3RhYmxlLWxheW91dC1hbGdvcml0aG0KLVRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlRm9y
bWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3Qs
IFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCi0gICAgOiBGb3JtYXR0aW5n
Q29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKLXsKLX0KLQot
dm9pZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRh
dGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50
cykKLXsKLSAgICBhdXRvIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSA9IGNvbnN0cmFpbnRzLmhv
cml6b250YWwubG9naWNhbFdpZHRoOwotICAgIGF1dG8gYXZhaWxhYmxlVmVydGljYWxTcGFjZSA9
IGNvbnN0cmFpbnRzLnZlcnRpY2FsLmxvZ2ljYWxIZWlnaHQ7Ci0gICAgLy8gMS4gQ29tcHV0ZSB3
aWR0aCBhbmQgaGVpZ2h0IGZvciB0aGUgZ3JpZC4KLSAgICBjb21wdXRlQW5kRGlzdHJpYnV0ZUV4
dHJhU3BhY2UoYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBhdmFpbGFibGVWZXJ0aWNhbFNwYWNl
KTsKLSAgICAvLyAyLiBGaW5hbGl6ZSBjZWxscy4KLSAgICBzZXRVc2VkR2VvbWV0cnlGb3JDZWxs
cyhhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAgIC8vIDMuIEZpbmFsaXplIHJvd3MuCi0g
ICAgc2V0VXNlZEdlb21ldHJ5Rm9yUm93cyhhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAg
IC8vIDQuIEZpbmFsaXplIHNlY3Rpb25zLgotICAgIHNldFVzZWRHZW9tZXRyeUZvclNlY3Rpb25z
KGNvbnN0cmFpbnRzKTsKLX0KLQotTGF5b3V0VW5pdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0Ojp1
c2VkQ29udGVudEhlaWdodCgpIGNvbnN0Ci17Ci0gICAgLy8gVGFibGUgaGFzIHRvIGhhdmUgc29t
ZSBzZWN0aW9uIGNvbnRlbnQsIGF0IGxlYXN0IG9uZSA8dGJvZHk+LgotICAgIGF1dG8gdG9wID0g
Qm94R2VvbWV0cnk6Om1hcmdpbkJveFJlY3QoZ2VvbWV0cnlGb3JCb3goKnJvb3QoKS5maXJzdElu
Rmxvd0NoaWxkKCkpKS50b3AoKTsKLSAgICBhdXRvIGJvdHRvbSA9IEJveEdlb21ldHJ5OjptYXJn
aW5Cb3hSZWN0KGdlb21ldHJ5Rm9yQm94KCpyb290KCkubGFzdEluRmxvd0NoaWxkKCkpKS5ib3R0
b20oKTsKLSAgICByZXR1cm4gYm90dG9tIC0gdG9wOwotfQotCi12b2lkIFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQ6OnNldFVzZWRHZW9tZXRyeUZvckNlbGxzKExheW91dFVuaXQgYXZhaWxhYmxlSG9y
aXpvbnRhbFNwYWNlKQotewotICAgIGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJs
ZUdyaWQoKTsKLSAgICBhdXRvJiBjb2x1bW5MaXN0ID0gZ3JpZC5jb2x1bW5zKCkubGlzdCgpOwot
ICAgIGF1dG8mIHJvd0xpc3QgPSBncmlkLnJvd3MoKS5saXN0KCk7Ci0gICAgLy8gRmluYWwgdGFi
bGUgY2VsbCBsYXlvdXQuIEF0IHRoaXMgcG9pbnQgYWxsIHBlcmNlbnRhZ2UgdmFsdWVzIGNhbiBi
ZSByZXNvbHZlZC4KLSAgICBhdXRvIHNlY3Rpb25PZmZzZXQgPSBMYXlvdXRVbml0IHsgfTsKLSAg
ICBhdXRvKiBjdXJyZW50U2VjdGlvbiA9ICZyb3dMaXN0LmZpcnN0KCkuYm94KCkucGFyZW50KCk7
Ci0gICAgZm9yIChhdXRvJiBjZWxsIDogZ3JpZC5jZWxscygpKSB7Ci0gICAgICAgIGF1dG8mIGNl
bGxCb3ggPSBjZWxsLT5ib3goKTsKLSAgICAgICAgYXV0byYgY2VsbEJveEdlb21ldHJ5ID0gZm9y
bWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoY2VsbEJveCk7Ci0gICAgICAgIGF1dG8mIHNlY3Rp
b24gPSByb3dMaXN0W2NlbGwtPnN0YXJ0Um93KCldLmJveCgpLnBhcmVudCgpOwotICAgICAgICBp
ZiAoJnNlY3Rpb24gIT0gY3VycmVudFNlY3Rpb24pIHsKLSAgICAgICAgICAgIGN1cnJlbnRTZWN0
aW9uID0gJnNlY3Rpb247Ci0gICAgICAgICAgICAvLyBXaGlsZSB0aGUgZ3JpZCBpcyBhIGNvbnRp
bnVvdXMgZmxvdyBvZiByb3dzLCBpbiB0aGUgZGlzcGxheSB0cmVlIHRoZXkgYXJlIHJlbGF0aXZl
IHRvIHRoZWlyIHNlY3Rpb25zLgotICAgICAgICAgICAgc2VjdGlvbk9mZnNldCA9IHJvd0xpc3Rb
Y2VsbC0+c3RhcnRSb3coKV0ubG9naWNhbFRvcCgpOwotICAgICAgICB9Ci0gICAgICAgIGNlbGxC
b3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHJvd0xpc3RbY2VsbC0+c3RhcnRSb3coKV0ubG9naWNh
bFRvcCgpIC0gc2VjdGlvbk9mZnNldCk7Ci0gICAgICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRMb2dp
Y2FsTGVmdChjb2x1bW5MaXN0W2NlbGwtPnN0YXJ0Q29sdW1uKCldLmxvZ2ljYWxMZWZ0KCkpOwot
ICAgICAgICBhdXRvIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UgPSByb3dMaXN0W2NlbGwtPnN0YXJ0
Um93KCldLmxvZ2ljYWxIZWlnaHQoKTsKLSAgICAgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSBj
ZWxsLT5zdGFydFJvdygpICsgMTsgcm93SW5kZXggPCBjZWxsLT5lbmRSb3coKTsgKytyb3dJbmRl
eCkKLSAgICAgICAgICAgIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UgKz0gcm93TGlzdFtyb3dJbmRl
eF0ubG9naWNhbEhlaWdodCgpOwotICAgICAgICBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlICs9IChj
ZWxsLT5yb3dTcGFuKCkgLSAxKSAqIGdyaWQudmVydGljYWxTcGFjaW5nKCk7Ci0gICAgICAgIGxh
eW91dENlbGwoKmNlbGwsIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSwgYXZhaWxhYmxlVmVydGlj
YWxTcGFjZSk7Ci0gICAgICAgIC8vIEZJWE1FOiBGaW5kIG91dCBpZiBpdCBpcyBvayB0byB1c2Ug
dGhlIHJlZ3VsYXIgcGFkZGluZyBoZXJlIHRvIGFsaWduIHRoZSBjb250ZW50IGJveCBpbnNpZGUg
YSB0YWxsIGNlbGwgb3Igd2UgbmVlZCB0byAKLSAgICAgICAgLy8gdXNlIHNvbWUga2luZCBvZiBp
bnRyaW5zaWMgcGFkZGluZyBzaW1pbGFyIHRvIFJlbmRlclRhYmxlQ2VsbC4KLSAgICAgICAgYXV0
byBwYWRkaW5nVG9wID0gY2VsbEJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKExheW91
dFVuaXQgeyB9KTsKLSAgICAgICAgYXV0byBwYWRkaW5nQm90dG9tID0gY2VsbEJveEdlb21ldHJ5
LnBhZGRpbmdCb3R0b20oKS52YWx1ZU9yKExheW91dFVuaXQgeyB9KTsKLSAgICAgICAgYXV0byBp
bnRyaW5zaWNQYWRkaW5nVG9wID0gTGF5b3V0VW5pdCB7IH07Ci0gICAgICAgIGF1dG8gaW50cmlu
c2ljUGFkZGluZ0JvdHRvbSA9IExheW91dFVuaXQgeyB9OwotCi0gICAgICAgIHN3aXRjaCAoY2Vs
bEJveC5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKSkgewotICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246Ok1pZGRsZTogewotICAgICAgICAgICAgYXV0byBpbnRyaW5zaWNWZXJ0aWNhbFBhZGRpbmcg
PSBzdGQ6Om1heCgwX2x1LCBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlIC0gY2VsbEJveEdlb21ldHJ5
LnZlcnRpY2FsTWFyZ2luQm9yZGVyQW5kUGFkZGluZygpIC0gY2VsbEJveEdlb21ldHJ5LmNvbnRl
bnRCb3hIZWlnaHQoKSk7Ci0gICAgICAgICAgICBpbnRyaW5zaWNQYWRkaW5nVG9wID0gaW50cmlu
c2ljVmVydGljYWxQYWRkaW5nIC8gMjsKLSAgICAgICAgICAgIGludHJpbnNpY1BhZGRpbmdCb3R0
b20gPSBpbnRyaW5zaWNWZXJ0aWNhbFBhZGRpbmcgLyAyOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZTogewotICAgICAg
ICAgICAgYXV0byByb3dCYXNlbGluZSA9IExheW91dFVuaXQgeyByb3dMaXN0W2NlbGwtPnN0YXJ0
Um93KCldLmJhc2VsaW5lKCkgfTsKLSAgICAgICAgICAgIGF1dG8gY2VsbEJhc2VsaW5lID0gTGF5
b3V0VW5pdCB7IGNlbGwtPmJhc2VsaW5lKCkgfTsKLSAgICAgICAgICAgIGludHJpbnNpY1BhZGRp
bmdUb3AgPSBzdGQ6Om1heCgwX2x1LCByb3dCYXNlbGluZSAtIGNlbGxCYXNlbGluZSAtIGNlbGxC
b3hHZW9tZXRyeS5ib3JkZXJUb3AoKSk7Ci0gICAgICAgICAgICBpbnRyaW5zaWNQYWRkaW5nQm90
dG9tID0gc3RkOjptYXgoMF9sdSwgYXZhaWxhYmxlVmVydGljYWxTcGFjZSAtIGNlbGxCb3hHZW9t
ZXRyeS52ZXJ0aWNhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKSAtIGludHJpbnNpY1BhZGRpbmdU
b3AgLSBjZWxsQm94R2VvbWV0cnkuY29udGVudEJveEhlaWdodCgpKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlRfTk9U
X0lNUExFTUVOVEVEX1lFVCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKGludHJpbnNpY1BhZGRpbmdUb3AgJiYgY2VsbEJveC5oYXNJbkZsb3dPckZsb2F0aW5n
Q2hpbGQoKSkgewotICAgICAgICAgICAgYXV0byBhZGp1c3RDZWxsQ29udGVudFdpdGhJbnN0cmlu
c2ljUGFkZGluZ0JlZm9yZSA9IFsmXSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hpbGQgYm94ZXMg
KGFuZCBydW5zKSBhcmUgYWx3YXlzIGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgY29u
dGFpbmluZyBibG9jaydzIGJvcmRlciBib3guCi0gICAgICAgICAgICAgICAgLy8gVGhlIGNvbnRl
bnQgYm94ICh3aGVyZSB0aGUgY2hpbGQgY29udGVudCBsaXZlcykgaXMgaW5zaWRlIHRoZSBwYWRk
aW5nIGJveCwgd2hpY2ggaXMgaW5zaWRlIHRoZSBib3JkZXIgYm94LgotICAgICAgICAgICAgICAg
IC8vIEluIG9yZGVyIHRvIGNvbXB1dGUgdGhlIGNoaWxkIGJveCB0b3AvbGVmdCBwb3NpdGlvbiwg
d2UgbmVlZCB0byBrbm93IGJvdGggdGhlIHBhZGRpbmcgYW5kIHRoZSBib3JkZXIgb2Zmc2V0cy4g
IAotICAgICAgICAgICAgICAgIC8vIE5vcm1hbGx5IGJ5IHRoZSB0aW1lIHdlIHN0YXJ0IHBvc2l0
aW9uaW5nIHRoZSBjaGlsZCBjb250ZW50LCB3ZSBhbHJlYWR5IGhhdmUgY29tcHV0ZWQgYm9yZGVy
cyBhbmQgcGFkZGluZyBmb3IgdGhlIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgICAgICAgICAgICAg
Ly8gVGhpcyBpcyBkaWZmZXJlbnQgd2l0aCB0YWJsZSBjZWxscyB3aGVyZSB0aGUgZmluYWwgcGFk
ZGluZyBvZmZzZXQgZGVwZW5kcyBvbiB0aGUgY29udGVudCBoZWlnaHQgYXMgd2UgdXNlCi0gICAg
ICAgICAgICAgICAgLy8gdGhlIHBhZGRpbmcgYm94IHRvIHZlcnRpY2FsbHkgYWxpZ24gdGhlIHRh
YmxlIGNlbGwgY29udGVudC4KLSAgICAgICAgICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUg
PSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkRm9ybWF0dGluZ1N0YXRlKGNlbGxCb3gpOwotICAg
ICAgICAgICAgICAgIGZvciAoYXV0byogY2hpbGQgPSBjZWxsQm94LmZpcnN0SW5GbG93T3JGbG9h
dGluZ0NoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0SW5GbG93T3JGbG9hdGluZ1Np
YmxpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzSW5saW5lVGV4dEJv
eCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAg
ICAgIGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeSgqY2hpbGQpLm1vdmVWZXJ0aWNhbGx5KGlu
dHJpbnNpY1BhZGRpbmdUb3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBp
ZiAoY2VsbEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgYXV0byYgaW5saW5lRm9ybWF0dGluZ1N0YXRlZSA9IGxheW91dFN0YXRl
KCkuZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUoY2VsbEJveCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGZvciAoYXV0byYgcnVuIDogaW5saW5lRm9ybWF0dGluZ1N0YXRlZS5saW5lUnVu
cygpKQotICAgICAgICAgICAgICAgICAgICAgICAgcnVuLm1vdmVWZXJ0aWNhbGx5KGludHJpbnNp
Y1BhZGRpbmdUb3ApOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGxpbmUgOiBpbmxp
bmVGb3JtYXR0aW5nU3RhdGVlLmxpbmVzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5l
Lm1vdmVWZXJ0aWNhbGx5KGludHJpbnNpY1BhZGRpbmdUb3ApOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBhZGp1c3RDZWxsQ29udGVudFdpdGhJbnN0cmlu
c2ljUGFkZGluZ0JlZm9yZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNlbGxCb3hHZW9tZXRyeS5z
ZXRWZXJ0aWNhbFBhZGRpbmcoeyBwYWRkaW5nVG9wICsgaW50cmluc2ljUGFkZGluZ1RvcCwgcGFk
ZGluZ0JvdHRvbSArIGludHJpbnNpY1BhZGRpbmdCb3R0b20gfSk7Ci0gICAgfQotfQotCi12b2lk
IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OnNldFVzZWRHZW9tZXRyeUZvclJvd3MoTGF5b3V0VW5p
dCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpCi17Ci0gICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRp
bmdTdGF0ZSgpLnRhYmxlR3JpZCgpOwotICAgIGF1dG8mIHJvd3MgPSBncmlkLnJvd3MoKS5saXN0
KCk7Ci0KLSAgICBhdXRvIHJvd0xvZ2ljYWxUb3AgPSBncmlkLnZlcnRpY2FsU3BhY2luZygpOwot
ICAgIGNvbnN0IENvbnRhaW5lckJveCogcHJldmlvdXNSb3cgPSBudWxscHRyOwotICAgIGZvciAo
c2l6ZV90IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkg
ewotICAgICAgICBhdXRvJiByb3cgPSByb3dzW3Jvd0luZGV4XTsKLSAgICAgICAgYXV0byYgcm93
Qm94ID0gcm93LmJveCgpOwotICAgICAgICBhdXRvJiByb3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRp
bmdTdGF0ZSgpLmJveEdlb21ldHJ5KHJvd0JveCk7Ci0KLSAgICAgICAgcm93Qm94R2VvbWV0cnku
c2V0UGFkZGluZyhnZW9tZXRyeSgpLmNvbXB1dGVkUGFkZGluZyhyb3dCb3gsIGF2YWlsYWJsZUhv
cml6b250YWxTcGFjZSkpOwotICAgICAgICAvLyBJbnRlcm5hbCB0YWJsZSBlbGVtZW50cyBkbyBu
b3QgaGF2ZSBtYXJnaW5zLgotICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRIb3Jpem9udGFsTWFy
Z2luKHsgfSk7Ci0gICAgICAgIHJvd0JveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7
Ci0KLSAgICAgICAgYXV0byBjb21wdXRlZFJvd0JvcmRlciA9IFsmXSB7Ci0gICAgICAgICAgICBh
dXRvIGJvcmRlciA9IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIocm93Qm94KTsKLSAgICAgICAg
ICAgIGlmICghZ3JpZC5jb2xsYXBzZWRCb3JkZXIoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
Ym9yZGVyOwotICAgICAgICAgICAgLy8gQm9yZGVyIGNvbGxhcHNpbmcgZGVsZWdhdGVzIGJvcmRl
cnMgdG8gdGFibGUvY2VsbHMuCi0gICAgICAgICAgICBib3JkZXIuaG9yaXpvbnRhbCA9IHsgfTsK
LSAgICAgICAgICAgIGlmICghcm93SW5kZXgpCi0gICAgICAgICAgICAgICAgYm9yZGVyLnZlcnRp
Y2FsLnRvcCA9IHsgfTsKLSAgICAgICAgICAgIGlmIChyb3dJbmRleCA9PSByb3dzLnNpemUoKSAt
IDEpCi0gICAgICAgICAgICAgICAgYm9yZGVyLnZlcnRpY2FsLmJvdHRvbSA9IHsgfTsKLSAgICAg
ICAgICAgIHJldHVybiBib3JkZXI7Ci0gICAgICAgIH0oKTsKLSAgICAgICAgaWYgKGNvbXB1dGVk
Um93Qm9yZGVyLmhlaWdodCgpID4gcm93LmxvZ2ljYWxIZWlnaHQoKSkgewotICAgICAgICAgICAg
Ly8gRklYTUU6IFRoaXMgaXMgYW4gb2RkIHF1aXJrIHdoZW4gdGhlIHJvdyBib3JkZXIgb3ZlcmZs
b3dzIHRoZSByb3cuCi0gICAgICAgICAgICAvLyBXZSBkb24ndCBwYWludCByb3cgYm9yZGVycyBz
byBpdCBkb2VzIG5vdCBtYXR0ZXIgdG9vIG11Y2gsIGJ1dCBpZiB3ZSBkb24ndAotICAgICAgICAg
ICAgLy8gc2V0IHRoaXMgZmFrZSBib3JkZXIgdmFsdWUsIHRoYW4gd2UgZWl0aGVyIGVuZCB1cCB3
aXRoIGEgbmVnYXRpdmUgY29udGVudCBib3gKLSAgICAgICAgICAgIC8vIG9yIHdpdGggYSB3aWRl
IGZyYW1lIGJveC4KLSAgICAgICAgICAgIC8vIElmIGl0IGhhcHBlbnMgdG8gY2F1c2UgaXNzdWVz
IGluIHRoZSBkaXNwbGF5IHRyZWUsIHdlIGNvdWxkIGFsc28gY29uc2lkZXIKLSAgICAgICAgICAg
IC8vIGEgc3BlY2lhbCBmcmFtZSBib3ggb3ZlcnJpZGUsIHdoZXJlIHBhZGRpbmcgYm94ICsgYm9y
ZGVyICE9IGZyYW1lIGJveC4KLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLnZlcnRpY2Fs
LnRvcCA9IHsgfTsKLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLnZlcnRpY2FsLmJvdHRv
bSA9IHsgfTsKLSAgICAgICAgfQotICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRDb250ZW50Qm94
SGVpZ2h0KHJvdy5sb2dpY2FsSGVpZ2h0KCkgLSBjb21wdXRlZFJvd0JvcmRlci5oZWlnaHQoKSk7
Ci0KLSAgICAgICAgYXV0byByb3dMb2dpY2FsV2lkdGggPSBncmlkLmNvbHVtbnMoKS5sb2dpY2Fs
V2lkdGgoKSArIDIgKiBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7Ci0gICAgICAgIGlmIChjb21w
dXRlZFJvd0JvcmRlci53aWR0aCgpID4gcm93TG9naWNhbFdpZHRoKSB7Ci0gICAgICAgICAgICAv
LyBTZWUgY29tbWVudCBhYm92ZS4KLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLmhvcml6
b250YWwubGVmdCA9IHsgfTsKLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLmhvcml6b250
YWwucmlnaHQgPSB7IH07Ci0gICAgICAgIH0KLSAgICAgICAgcm93Qm94R2VvbWV0cnkuc2V0Q29u
dGVudEJveFdpZHRoKHJvd0xvZ2ljYWxXaWR0aCAtIGNvbXB1dGVkUm93Qm9yZGVyLndpZHRoKCkp
OwotICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRCb3JkZXIoY29tcHV0ZWRSb3dCb3JkZXIpOwot
Ci0gICAgICAgIGlmIChwcmV2aW91c1JvdyAmJiAmcHJldmlvdXNSb3ctPnBhcmVudCgpICE9ICZy
b3dCb3gucGFyZW50KCkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgcm93IGlzIGluIGEgZGlmZmVy
ZW50IHNlY3Rpb24uCi0gICAgICAgICAgICByb3dMb2dpY2FsVG9wID0geyB9OwotICAgICAgICB9
Ci0gICAgICAgIHJvd0JveEdlb21ldHJ5LnNldExvZ2ljYWxUb3Aocm93TG9naWNhbFRvcCk7Ci0g
ICAgICAgIHJvd0JveEdlb21ldHJ5LnNldExvZ2ljYWxMZWZ0KHsgfSk7Ci0KLSAgICAgICAgcm93
TG9naWNhbFRvcCArPSByb3cubG9naWNhbEhlaWdodCgpICsgZ3JpZC52ZXJ0aWNhbFNwYWNpbmco
KTsKLSAgICAgICAgcHJldmlvdXNSb3cgPSAmcm93Qm94OwotICAgIH0KLQotICAgIGF1dG8mIGNv
bHVtbnMgPSBncmlkLmNvbHVtbnMoKTsKLSAgICBWZWN0b3I8SW5saW5lTGF5b3V0VW5pdD4gcm93
QmFzZWxpbmVzKHJvd3Muc2l6ZSgpLCAwKTsKLSAgICAvLyBOb3cgdGhhdCBjZWxscyBhcmUgbGFp
ZCBvdXQsIGxldCdzIGNvbXB1dGUgdGhlIHJvdyBiYXNlbGluZXMuCi0gICAgZm9yIChzaXplX3Qg
cm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7Ci0gICAg
ICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1bW5zLnNp
emUoKTsgKytjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgYXV0byYgc2xvdCA9ICpncmlkLnNs
b3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICBpZiAoc2xvdC5pc1Jv
d1NwYW5uZWQoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChz
bG90Lmhhc1Jvd1NwYW4oKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAg
IGF1dG8mIGNlbGwgPSBzbG90LmNlbGwoKTsKLSAgICAgICAgICAgIHJvd0Jhc2VsaW5lc1tyb3dJ
bmRleF0gPSBzdGQ6Om1heChyb3dCYXNlbGluZXNbcm93SW5kZXhdLCBjZWxsLmJhc2VsaW5lKCkp
OwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IHJvd0luZGV4ID0gMDsgcm93SW5k
ZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkKLSAgICAgICAgcm93c1tyb3dJbmRleF0uc2V0
QmFzZWxpbmUocm93QmFzZWxpbmVzW3Jvd0luZGV4XSk7Ci19Ci0KLXZvaWQgVGFibGVGb3JtYXR0
aW5nQ29udGV4dDo6c2V0VXNlZEdlb21ldHJ5Rm9yU2VjdGlvbnMoY29uc3QgQ29uc3RyYWludHNG
b3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBhdXRvJiBncmlkID0gZm9ybWF0
dGluZ1N0YXRlKCkudGFibGVHcmlkKCk7Ci0gICAgYXV0byYgdGFibGVCb3ggPSByb290KCk7Ci0g
ICAgYXV0byBzZWN0aW9uV2lkdGggPSBncmlkLmNvbHVtbnMoKS5sb2dpY2FsV2lkdGgoKSArIDIg
KiBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7Ci0gICAgYXV0byBsb2dpY2FsVG9wID0gY29uc3Ry
YWludHMudmVydGljYWwubG9naWNhbFRvcDsKLSAgICBhdXRvIHZlcnRpY2FsU3BhY2luZyA9IGdy
aWQudmVydGljYWxTcGFjaW5nKCk7Ci0gICAgYXV0byBwYWRkaW5nQmVmb3JlID0gT3B0aW9uYWw8
TGF5b3V0VW5pdD4geyB2ZXJ0aWNhbFNwYWNpbmcgfTsKLSAgICBhdXRvIHBhZGRpbmdBZnRlciA9
IHZlcnRpY2FsU3BhY2luZzsKLSAgICBmb3IgKGF1dG8mIHNlY3Rpb25Cb3ggOiBjaGlsZHJlbk9m
VHlwZTxDb250YWluZXJCb3g+KHRhYmxlQm94KSkgewotICAgICAgICBhdXRvJiBzZWN0aW9uQm94
R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShzZWN0aW9uQm94KTsKLSAg
ICAgICAgLy8gU2VjdGlvbiBib3JkZXJzIGFyZSBlaXRoZXIgY29sbGFwc2VkIG9yIGlnbm9yZWQu
Ci0gICAgICAgIHNlY3Rpb25Cb3hHZW9tZXRyeS5zZXRCb3JkZXIoeyB9KTsKLSAgICAgICAgLy8g
VXNlIGZha2UgdmVydGljYWwgcGFkZGluZyB0byBzcGFjZSBvdXQgdGhlIHNlY3Rpb25zLgotICAg
ICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0UGFkZGluZyhFZGdlcyB7IHsgfSwgeyBwYWRkaW5n
QmVmb3JlLnZhbHVlT3IoMF9sdSksIHBhZGRpbmdBZnRlciB9IH0pOwotICAgICAgICBwYWRkaW5n
QmVmb3JlID0gV1RGOjpudWxsb3B0OwotICAgICAgICAvLyBJbnRlcm5hbCB0YWJsZSBlbGVtZW50
cyBkbyBub3QgaGF2ZSBtYXJnaW5zLgotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0SG9y
aXpvbnRhbE1hcmdpbih7IH0pOwotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0VmVydGlj
YWxNYXJnaW4oeyB9KTsKLQotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0Q29udGVudEJv
eFdpZHRoKHNlY3Rpb25XaWR0aCk7Ci0gICAgICAgIGF1dG8gc2VjdGlvbkNvbnRlbnRIZWlnaHQg
PSBMYXlvdXRVbml0IHsgfTsKLSAgICAgICAgc2l6ZV90IHJvd0NvdW50ID0gMDsKLSAgICAgICAg
Zm9yIChhdXRvJiByb3dCb3ggOiBjaGlsZHJlbk9mVHlwZTxDb250YWluZXJCb3g+KHNlY3Rpb25C
b3gpKSB7Ci0gICAgICAgICAgICBzZWN0aW9uQ29udGVudEhlaWdodCArPSBnZW9tZXRyeUZvckJv
eChyb3dCb3gpLmJvcmRlckJveEhlaWdodCgpOwotICAgICAgICAgICAgKytyb3dDb3VudDsKLSAg
ICAgICAgfQotICAgICAgICBzZWN0aW9uQ29udGVudEhlaWdodCArPSB2ZXJ0aWNhbFNwYWNpbmcg
KiAocm93Q291bnQgLSAxKTsKLSAgICAgICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldENvbnRlbnRC
b3hIZWlnaHQoc2VjdGlvbkNvbnRlbnRIZWlnaHQpOwotICAgICAgICBzZWN0aW9uQm94R2VvbWV0
cnkuc2V0TG9naWNhbExlZnQoY29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dpY2FsTGVmdCk7Ci0g
ICAgICAgIHNlY3Rpb25Cb3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKGxvZ2ljYWxUb3ApOwotCi0g
ICAgICAgIGxvZ2ljYWxUb3AgKz0gc2VjdGlvbkJveEdlb21ldHJ5LmJvcmRlckJveEhlaWdodCgp
OwotICAgIH0KLX0KLQotdm9pZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRDZWxsKGNv
bnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCwgTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFs
U3BhY2UsIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRDZWxsSGVpZ2h0KQotewotICAgIEFTU0VS
VChjZWxsLmJveCgpLmVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpKTsKLQotICAg
IGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsKLSAgICBhdXRvJiBj
ZWxsQm94ID0gY2VsbC5ib3goKTsKLSAgICBhdXRvJiBjZWxsQm94R2VvbWV0cnkgPSBmb3JtYXR0
aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShjZWxsQm94KTsKLQotICAgIGNlbGxCb3hHZW9tZXRyeS5z
ZXRCb3JkZXIoZ2VvbWV0cnkoKS5jb21wdXRlZENlbGxCb3JkZXIoY2VsbCkpOwotICAgIGNlbGxC
b3hHZW9tZXRyeS5zZXRQYWRkaW5nKGdlb21ldHJ5KCkuY29tcHV0ZWRQYWRkaW5nKGNlbGxCb3gs
IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSkpOwotICAgIC8vIEludGVybmFsIHRhYmxlIGVsZW1l
bnRzIGRvIG5vdCBoYXZlIG1hcmdpbnMuCi0gICAgY2VsbEJveEdlb21ldHJ5LnNldEhvcml6b250
YWxNYXJnaW4oeyB9KTsKLSAgICBjZWxsQm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyB9
KTsKLQotICAgIGF1dG8gYXZhaWxhYmxlU3BhY2VGb3JDb250ZW50ID0gWyZdIHsKLSAgICAgICAg
YXV0byYgY29sdW1uTGlzdCA9IGdyaWQuY29sdW1ucygpLmxpc3QoKTsKLSAgICAgICAgYXV0byBs
b2dpY2FsV2lkdGggPSBMYXlvdXRVbml0IHsgfTsKLSAgICAgICAgZm9yIChhdXRvIGNvbHVtbklu
ZGV4ID0gY2VsbC5zdGFydENvbHVtbigpOyBjb2x1bW5JbmRleCA8IGNlbGwuZW5kQ29sdW1uKCk7
ICsrY29sdW1uSW5kZXgpCi0gICAgICAgICAgICBsb2dpY2FsV2lkdGggKz0gY29sdW1uTGlzdC5h
dChjb2x1bW5JbmRleCkubG9naWNhbFdpZHRoKCk7Ci0gICAgICAgIC8vIE5vIGNvbHVtbiBzcGFj
aW5nIHdoZW4gc3Bhbm5pbmcuCi0gICAgICAgIGxvZ2ljYWxXaWR0aCArPSAoY2VsbC5jb2x1bW5T
cGFuKCkgLSAxKSAqIGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKLSAgICAgICAgcmV0dXJuIGxv
Z2ljYWxXaWR0aCAtIGNlbGxCb3hHZW9tZXRyeS5ob3Jpem9udGFsTWFyZ2luQm9yZGVyQW5kUGFk
ZGluZygpOwotICAgIH0oKTsKLSAgICBjZWxsQm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRo
KGF2YWlsYWJsZVNwYWNlRm9yQ29udGVudCk7Ci0KLSAgICBpZiAoY2VsbEJveC5oYXNJbkZsb3dP
ckZsb2F0aW5nQ2hpbGQoKSkgewotICAgICAgICBhdXRvIGNvbnN0cmFpbnRzRm9yQ2VsbENvbnRl
bnQgPSBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjZWxsQm94KTsKLSAg
ICAgICAgY29uc3RyYWludHNGb3JDZWxsQ29udGVudC52ZXJ0aWNhbC5sb2dpY2FsSGVpZ2h0ID0g
dXNlZENlbGxIZWlnaHQ7Ci0gICAgICAgIGF1dG8gaW52YWxpZGF0aW9uU3RhdGUgPSBJbnZhbGlk
YXRpb25TdGF0ZSB7IH07Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBwcm9iYWJseSBi
ZSBwYXJ0IG9mIHRoZSBpbnZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgd2hlbiB3ZSByZS1s
YXlvdXQgdGhlIGNlbGwKLSAgICAgICAgLy8gbXVsdGlwbGUgdGltZXMgYXMgcGFydCBvZiB0aGUg
bXVsdGktcGFzcyB0YWJsZSBhbGdvcml0aG0uCi0gICAgICAgIGF1dG8mIGZsb2F0aW5nU3RhdGVG
b3JDZWxsQ29udGVudCA9IGxheW91dFN0YXRlKCkuZW5zdXJlQmxvY2tGb3JtYXR0aW5nU3RhdGUo
Y2VsbEJveCkuZmxvYXRpbmdTdGF0ZSgpOwotICAgICAgICBmbG9hdGluZ1N0YXRlRm9yQ2VsbENv
bnRlbnQuY2xlYXIoKTsKLSAgICAgICAgTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0Nv
bnRleHQoY2VsbEJveCwgbGF5b3V0U3RhdGUoKSktPmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxp
ZGF0aW9uU3RhdGUsIGNvbnN0cmFpbnRzRm9yQ2VsbENvbnRlbnQpOwotICAgIH0KLSAgICBjZWxs
Qm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodChnZW9tZXRyeSgpLmNlbGxIZWlnaChjZWxs
Qm94KSk7Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cygpCi17Ci0gICAgQVNTRVJUKCFyb290KCkuaXNTaXplQ29udGFpbm1lbnRCb3goKSk7Ci0gICAg
Ly8gVGFibGVzIGhhdmUgYSBzbGlnaHR5IGRpZmZlcmVudCBjb25jZXB0IG9mIHNocmluayB0byBm
aXQuIEl0J3MgcmVhbGx5IG9ubHkgZGlmZmVyZW50IHdpdGggbm9uLWF1dG8gIndpZHRoIiB2YWx1
ZXMsIHdoZXJlCi0gICAgLy8gYSBnZW5lcmljIHNocmluay10byBmaXQgYmxvY2sgbGV2ZWwgYm94
IGxpa2UgYSBmbG9hdCBib3ggd291bGQgYmUganVzdCBzaXplZCB0byB0aGUgY29tcHV0ZWQgdmFs
dWUgb2YgIndpZHRoIiwgdGFibGVzCi0gICAgLy8gY2FuIGFjdHVhbGx5IGJlIHN0cmVjaGVkIHdh
eSBvdmVyLgotICAgIGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsK
LSAgICBpZiAoYXV0byBjb21wdXRlZFdpZHRoQ29uc3RyYWludHMgPSBncmlkLndpZHRoQ29uc3Ry
YWludHMoKSkKLSAgICAgICAgcmV0dXJuICpjb21wdXRlZFdpZHRoQ29uc3RyYWludHM7Ci0KLSAg
ICAvLyBDb21wdXRlIHRoZSBtaW5pbXVtL21heGltdW0gd2lkdGggb2YgZWFjaCBjb2x1bW4uCi0g
ICAgYXV0byBjb21wdXRlZFdpZHRoQ29uc3RyYWludHMgPSBjb21wdXRlZFByZWZlcnJlZFdpZHRo
Rm9yQ29sdW1ucygpOwotICAgIGdyaWQuc2V0V2lkdGhDb25zdHJhaW50cyhjb21wdXRlZFdpZHRo
Q29uc3RyYWludHMpOwotICAgIHJldHVybiBjb21wdXRlZFdpZHRoQ29uc3RyYWludHM7Ci19Ci0K
LVVuaXF1ZVJlZjxUYWJsZUdyaWQ+IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmVuc3VyZVRhYmxl
R3JpZChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KQotewotICAgIGF1dG8gdGFibGVHcmlk
ID0gbWFrZVVuaXF1ZVJlZjxUYWJsZUdyaWQ+KCk7Ci0gICAgYXV0byYgdGFibGVTdHlsZSA9IHRh
YmxlQm94LnN0eWxlKCk7Ci0gICAgYXV0byBzaG91bGRBcHBseUJvcmRlclNwYWNpbmcgPSB0YWJs
ZVN0eWxlLmJvcmRlckNvbGxhcHNlKCkgPT0gQm9yZGVyQ29sbGFwc2U6OlNlcGFyYXRlOwotICAg
IHRhYmxlR3JpZC0+c2V0SG9yaXpvbnRhbFNwYWNpbmcoTGF5b3V0VW5pdCB7IHNob3VsZEFwcGx5
Qm9yZGVyU3BhY2luZyA/IHRhYmxlU3R5bGUuaG9yaXpvbnRhbEJvcmRlclNwYWNpbmcoKSA6IDAg
fSk7Ci0gICAgdGFibGVHcmlkLT5zZXRWZXJ0aWNhbFNwYWNpbmcoTGF5b3V0VW5pdCB7IHNob3Vs
ZEFwcGx5Qm9yZGVyU3BhY2luZyA/IHRhYmxlU3R5bGUudmVydGljYWxCb3JkZXJTcGFjaW5nKCkg
OiAwIH0pOwotCi0gICAgYXV0byogZmlyc3RDaGlsZCA9IHRhYmxlQm94LmZpcnN0Q2hpbGQoKTsK
LSAgICBpZiAoIWZpcnN0Q2hpbGQpIHsKLSAgICAgICAgLy8gVGhlIHJhcmUgY2FzZSBvZiBlbXB0
eSB0YWJsZS4KLSAgICAgICAgcmV0dXJuIHRhYmxlR3JpZDsKLSAgICB9Ci0KLSAgICBjb25zdCBC
b3gqIHRhYmxlQ2FwdGlvbiA9IG51bGxwdHI7Ci0gICAgY29uc3QgQm94KiBjb2xncm91cCA9IG51
bGxwdHI7Ci0gICAgLy8gVGFibGUgY2FwdGlvbiBpcyBhbiBvcHRpb25hbCBlbGVtZW50OyBpZiB1
c2VkLCBpdCBpcyBhbHdheXMgdGhlIGZpcnN0IGNoaWxkIG9mIGEgPHRhYmxlPi4KLSAgICBpZiAo
Zmlyc3RDaGlsZC0+aXNUYWJsZUNhcHRpb24oKSkKLSAgICAgICAgdGFibGVDYXB0aW9uID0gZmly
c3RDaGlsZDsKLSAgICAvLyBUaGUgPGNvbGdyb3VwPiBtdXN0IGFwcGVhciBhZnRlciBhbnkgb3B0
aW9uYWwgPGNhcHRpb24+IGVsZW1lbnQgYnV0IGJlZm9yZSBhbnkgPHRoZWFkPiwgPHRoPiwgPHRi
b2R5PiwgPHRmb290PiBhbmQgPHRyPiBlbGVtZW50LgotICAgIGF1dG8qIGNvbGdyb3VwQ2FuZGlk
YXRlID0gZmlyc3RDaGlsZDsKLSAgICBpZiAodGFibGVDYXB0aW9uKQotICAgICAgICBjb2xncm91
cENhbmRpZGF0ZSA9IHRhYmxlQ2FwdGlvbi0+bmV4dFNpYmxpbmcoKTsKLSAgICBpZiAoY29sZ3Jv
dXBDYW5kaWRhdGUtPmlzVGFibGVDb2x1bW5Hcm91cCgpKQotICAgICAgICBjb2xncm91cCA9IGNv
bGdyb3VwQ2FuZGlkYXRlOwotCi0gICAgaWYgKGNvbGdyb3VwKSB7Ci0gICAgICAgIGF1dG8mIGNv
bHVtbnMgPSB0YWJsZUdyaWQtPmNvbHVtbnMoKTsKLSAgICAgICAgZm9yIChhdXRvKiBjb2x1bW4g
PSBkb3duY2FzdDxDb250YWluZXJCb3g+KCpjb2xncm91cCkuZmlyc3RDaGlsZCgpOyBjb2x1bW47
IGNvbHVtbiA9IGNvbHVtbi0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgQVNTRVJUKGNv
bHVtbi0+aXNUYWJsZUNvbHVtbigpKTsKLSAgICAgICAgICAgIGF1dG8gY29sdW1uU3BhbkNvdW50
ID0gY29sdW1uLT5jb2x1bW5TcGFuKCk7Ci0gICAgICAgICAgICBBU1NFUlQoY29sdW1uU3BhbkNv
dW50ID4gMCk7Ci0gICAgICAgICAgICB3aGlsZSAoY29sdW1uU3BhbkNvdW50LS0pCi0gICAgICAg
ICAgICAgICAgY29sdW1ucy5hZGRDb2x1bW4oZG93bmNhc3Q8Q29udGFpbmVyQm94PigqY29sdW1u
KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhdXRvKiBmaXJzdFNlY3Rpb24gPSBjb2xncm91
cCA/IGNvbGdyb3VwLT5uZXh0U2libGluZygpIDogdGFibGVDYXB0aW9uID8gdGFibGVDYXB0aW9u
LT5uZXh0U2libGluZygpIDogZmlyc3RDaGlsZDsKLSAgICBmb3IgKGF1dG8qIHNlY3Rpb24gPSBm
aXJzdFNlY3Rpb247IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0U2libGluZygpKSB7
Ci0gICAgICAgIEFTU0VSVChzZWN0aW9uLT5pc1RhYmxlSGVhZGVyKCkgfHwgc2VjdGlvbi0+aXNU
YWJsZUJvZHkoKSB8fCBzZWN0aW9uLT5pc1RhYmxlRm9vdGVyKCkpOwotICAgICAgICBmb3IgKGF1
dG8qIHJvdyA9IGRvd25jYXN0PENvbnRhaW5lckJveD4oKnNlY3Rpb24pLmZpcnN0Q2hpbGQoKTsg
cm93OyByb3cgPSByb3ctPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIEFTU0VSVChyb3ct
PmlzVGFibGVSb3coKSk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8qIGNlbGwgPSBkb3duY2FzdDxD
b250YWluZXJCb3g+KCpyb3cpLmZpcnN0Q2hpbGQoKTsgY2VsbDsgY2VsbCA9IGNlbGwtPm5leHRT
aWJsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoY2VsbC0+aXNUYWJsZUNlbGwoKSk7
Ci0gICAgICAgICAgICAgICAgdGFibGVHcmlkLT5hcHBlbmRDZWxsKGRvd25jYXN0PENvbnRhaW5l
ckJveD4oKmNlbGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1
cm4gdGFibGVHcmlkOwotfQotCi1Gb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25z
dHJhaW50cyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlZFByZWZlcnJlZFdpZHRoRm9y
Q29sdW1ucygpCi17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGlu
Z1N0YXRlKCk7Ci0gICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZS50YWJsZUdyaWQoKTsK
LSAgICBBU1NFUlQoIWdyaWQud2lkdGhDb25zdHJhaW50cygpKTsKLQotICAgIC8vIENvbHVtbiBw
cmVmZXJyZWQgd2lkdGggY29tcHV0YXRpb24gYXMgZm9sbG93czoKLSAgICAvLyAxLiBDb2xsZWN0
IGVhY2ggY2VsbHMnIHdpZHRoIGNvbnN0cmFpbnRzCi0gICAgLy8gMi4gQ29sbGVjdCBmaXhlZCBj
b2x1bW4gd2lkdGhzIHNldCBieSA8Y29sZ3JvdXA+J3MgYW5kIDxjb2w+cwotICAgIC8vIDMuIEZp
bmQgdGhlIG1pbi9tYXggd2lkdGggZm9yIGVhY2ggY29sdW1ucyB1c2luZyB0aGUgY2VsbCBjb25z
dHJhaW50cyBhbmQgdGhlIDxjb2w+IGZpeGVkIHdpZHRocyBidXQgaWdub3JlIGNvbHVtbiBzcGFu
cy4KLSAgICAvLyA0LiBEaXN0cmlidXRlIGNvbHVtbiBzcGFubmluZyBjZWxscyBtaW4vbWF4IHdp
ZHRocy4KLSAgICAvLyA1LiBBZGQgdGhlbSBhbGwgdXAgYW5kIHJldHVybiB0aGUgY29tcHV0ZWQg
bWluL21heCB3aWR0aHMuCi0gICAgZm9yIChhdXRvJiBjZWxsIDogZ3JpZC5jZWxscygpKSB7Ci0g
ICAgICAgIGF1dG8mIGNlbGxCb3ggPSBjZWxsLT5ib3goKTsKLSAgICAgICAgQVNTRVJUKGNlbGxC
b3guZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCkpOwotCi0gICAgICAgIGF1dG8g
aW50cmluc2ljV2lkdGggPSBmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50
c0ZvckJveChjZWxsQm94KTsKLSAgICAgICAgaWYgKCFpbnRyaW5zaWNXaWR0aCkgewotICAgICAg
ICAgICAgaW50cmluc2ljV2lkdGggPSBnZW9tZXRyeSgpLmludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHNGb3JDZWxsKCpjZWxsKTsKLSAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5zZXRJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGNlbGxCb3gsICppbnRyaW5zaWNXaWR0aCk7Ci0gICAg
ICAgIH0KLSAgICAgICAgLy8gU3Bhbm5lciBjZWxscyBwdXQgdGhlaXIgaW50cmluc2ljIHdpZHRo
cyBvbiB0aGUgaW5pdGlhbCBzbG90cy4KLSAgICAgICAgZ3JpZC5zbG90KGNlbGwtPnBvc2l0aW9u
KCkpLT5zZXRXaWR0aENvbnN0cmFpbnRzKCppbnRyaW5zaWNXaWR0aCk7Ci0gICAgfQotCi0gICAg
Ly8gMi4gQ29sbGVjdCB0aGUgZml4ZWQgd2lkdGggPGNvbD5zLgotICAgIGF1dG8mIGNvbHVtbkxp
c3QgPSBncmlkLmNvbHVtbnMoKS5saXN0KCk7Ci0gICAgVmVjdG9yPE9wdGlvbmFsPExheW91dFVu
aXQ+PiBmaXhlZFdpZHRoQ29sdW1uczsKLSAgICBmb3IgKGF1dG8mIGNvbHVtbiA6IGNvbHVtbkxp
c3QpIHsKLSAgICAgICAgYXV0byBmaXhlZFdpZHRoID0gWyZdICgpIC0+IE9wdGlvbmFsPExheW91
dFVuaXQ+IHsKLSAgICAgICAgICAgIGF1dG8qIGNvbHVtbkJveCA9IGNvbHVtbi5ib3goKTsKLSAg
ICAgICAgICAgIGlmICghY29sdW1uQm94KSB7Ci0gICAgICAgICAgICAgICAgLy8gQW5veW5tb3Vz
IGNvbHVtbnMgZG9uJ3QgaGF2ZSBhc3NvY2lhdGVkIGxheW91dCBib3hlcyBhbmQgY2FuJ3QgaGF2
ZSBmaXhlZCBjb2wgc2l6ZS4KLSAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgaWYgKGF1dG8gd2lkdGggPSBjb2x1bW5Cb3gtPmNvbHVtbldpZHRo
KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdpZHRoOwotICAgICAgICAgICAgcmV0dXJuIGdl
b21ldHJ5KCkuY29tcHV0ZWRDb2x1bW5XaWR0aCgqY29sdW1uQm94KTsKLSAgICAgICAgfTsKLSAg
ICAgICAgZml4ZWRXaWR0aENvbHVtbnMuYXBwZW5kKGZpeGVkV2lkdGgoKSk7Ci0gICAgfQotCi0g
ICAgVmVjdG9yPEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzPiBj
b2x1bW5JbnRyaW5zaWNXaWR0aHMoY29sdW1uTGlzdC5zaXplKCkpOwotICAgIC8vIDMuIENvbGxl
Y3QgaGUgbWluL21heCB3aWR0aCBmb3IgZWFjaCBjb2x1bW4gYnV0IGlnbm9yZSBjb2x1bW4gc3Bh
bnMgZm9yIG5vdy4KLSAgICBWZWN0b3I8U2xvdFBvc2l0aW9uPiBzcGFubmluZ0NlbGxQb3NpdGlv
bkxpc3Q7Ci0gICAgc2l6ZV90IG51bWJlck9mQWN0dWFsQ29sdW1ucyA9IDA7Ci0gICAgZm9yIChz
aXplX3QgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IGNvbHVtbkxpc3Quc2l6ZSgpOyAr
K2NvbHVtbkluZGV4KSB7Ci0gICAgICAgIGF1dG8gY29sdW1uSGFzTm9uU3Bhbm5lZENlbGwgPSBm
YWxzZTsKLSAgICAgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IGdyaWQu
cm93cygpLnNpemUoKTsgKytyb3dJbmRleCkgewotICAgICAgICAgICAgYXV0byYgc2xvdCA9ICpn
cmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICBpZiAoc2xv
dC5pc0NvbHVtblNwYW5uZWQoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgIGNvbHVtbkhhc05vblNwYW5uZWRDZWxsID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChzbG90
Lmhhc0NvbHVtblNwYW4oKSkgewotICAgICAgICAgICAgICAgIHNwYW5uaW5nQ2VsbFBvc2l0aW9u
TGlzdC5hcHBlbmQoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIGNvbHVtbkZpeGVkV2lk
dGggPSBmaXhlZFdpZHRoQ29sdW1uc1tjb2x1bW5JbmRleF07Ci0gICAgICAgICAgICBhdXRvIHdp
ZHRoQ29uc3RyYWludHMgPSAhY29sdW1uRml4ZWRXaWR0aCA/IHNsb3Qud2lkdGhDb25zdHJhaW50
cygpIDogRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyAqY29s
dW1uRml4ZWRXaWR0aCwgKmNvbHVtbkZpeGVkV2lkdGggfTsKLSAgICAgICAgICAgIGNvbHVtbklu
dHJpbnNpY1dpZHRoc1tjb2x1bW5JbmRleF0ubWluaW11bSA9IHN0ZDo6bWF4KHdpZHRoQ29uc3Ry
YWludHMubWluaW11bSwgY29sdW1uSW50cmluc2ljV2lkdGhzW2NvbHVtbkluZGV4XS5taW5pbXVt
KTsKLSAgICAgICAgICAgIGNvbHVtbkludHJpbnNpY1dpZHRoc1tjb2x1bW5JbmRleF0ubWF4aW11
bSA9IHN0ZDo6bWF4KHdpZHRoQ29uc3RyYWludHMubWF4aW11bSwgY29sdW1uSW50cmluc2ljV2lk
dGhzW2NvbHVtbkluZGV4XS5tYXhpbXVtKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29sdW1u
SGFzTm9uU3Bhbm5lZENlbGwpCi0gICAgICAgICAgICArK251bWJlck9mQWN0dWFsQ29sdW1uczsK
LSAgICB9Ci0KLSAgICAvLyA0LiBEaXN0cmlidXRlIHRoZSBzcGFubmluZyBtaW4vbWF4IHdpZHRo
cy4KLSAgICBmb3IgKGF1dG8gc3Bhbm5pbmdDZWxsUG9zaXRpb24gOiBzcGFubmluZ0NlbGxQb3Np
dGlvbkxpc3QpIHsKLSAgICAgICAgYXV0byYgc2xvdCA9ICpncmlkLnNsb3Qoc3Bhbm5pbmdDZWxs
UG9zaXRpb24pOwotICAgICAgICBhdXRvJiBjZWxsID0gc2xvdC5jZWxsKCk7Ci0gICAgICAgIEFT
U0VSVChzbG90Lmhhc0NvbHVtblNwYW4oKSk7Ci0gICAgICAgIGF1dG8gd2lkdGhDb25zdHJhaW50
c1RvRGlzdHJpYnV0ZSA9IHNsb3Qud2lkdGhDb25zdHJhaW50cygpOwotICAgICAgICBmb3IgKHNp
emVfdCBjb2x1bW5TcGFuSW5kZXggPSBjZWxsLnN0YXJ0Q29sdW1uKCk7IGNvbHVtblNwYW5JbmRl
eCA8IGNlbGwuZW5kQ29sdW1uKCk7ICsrY29sdW1uU3BhbkluZGV4KQotICAgICAgICAgICAgd2lk
dGhDb25zdHJhaW50c1RvRGlzdHJpYnV0ZSAtPSBjb2x1bW5JbnRyaW5zaWNXaWR0aHNbY29sdW1u
U3BhbkluZGV4XTsKLSAgICAgICAgLy8gPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogNTBw
eCI+PHRyPjx0ZCBjb2xzcGFuPTI+bG9uZyBsb25nIHRleHQ8L3RkPjwvdHI+PHRyPjx0ZD5sbzwv
dGQ+PHRkPnh0PC90ZD48dHI+PC90YWJsZT4KLSAgICAgICAgLy8gW2xvbmcgbG9uZyB0ZXh0XQot
ICAgICAgICAvLyBbbG9dICAgICAgICBbeHRdCi0gICAgICAgIC8vIFdoaWxlIGl0IGxvb2tzIGxp
a2UgdGhlIHNwYW5uaW5nIGNlbGwgaGFzIHRvIGRpc3RyaWJ1dGUgYWxsIGl0cyBzcGFubmluZyB3
aWR0aCwgdGhlIGJvcmRlci1zcGFjaW5nIHRha2VzIG1vc3Qgb2YgdGhlIHNwYWNlIGFuZAotICAg
ICAgICAvLyBubyBkaXN0cmlidXRpb24gaXMgbmVlZGVkIGF0IGFsbC4KLSAgICAgICAgd2lkdGhD
b25zdHJhaW50c1RvRGlzdHJpYnV0ZSAtPSAoY2VsbC5jb2x1bW5TcGFuKCkgLSAxKSAqIGdyaWQu
aG9yaXpvbnRhbFNwYWNpbmcoKTsKLSAgICAgICAgLy8gRklYTUU6IENoZWNrIGlmIGZpeGVkIHdp
ZHRoIGNvbHVtbnMgc2hvdWxkIGJlIHNraXBwZWQgaGVyZS4KLSAgICAgICAgd2lkdGhDb25zdHJh
aW50c1RvRGlzdHJpYnV0ZS5taW5pbXVtID0gc3RkOjptYXgoTGF5b3V0VW5pdCB7IH0sIHdpZHRo
Q29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWluaW11bSAvIGNlbGwuY29sdW1uU3BhbigpKTsKLSAg
ICAgICAgd2lkdGhDb25zdHJhaW50c1RvRGlzdHJpYnV0ZS5tYXhpbXVtID0gc3RkOjptYXgoTGF5
b3V0VW5pdCB7IH0sIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWF4aW11bSAvIGNlbGwu
Y29sdW1uU3BhbigpKTsKLSAgICAgICAgaWYgKHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUu
bWluaW11bSB8fCB3aWR0aENvbnN0cmFpbnRzVG9EaXN0cmlidXRlLm1heGltdW0pIHsKLSAgICAg
ICAgICAgIGZvciAoc2l6ZV90IGNvbHVtblNwYW5JbmRleCA9IGNlbGwuc3RhcnRDb2x1bW4oKTsg
Y29sdW1uU3BhbkluZGV4IDwgY2VsbC5lbmRDb2x1bW4oKTsgKytjb2x1bW5TcGFuSW5kZXgpCi0g
ICAgICAgICAgICAgICAgY29sdW1uSW50cmluc2ljV2lkdGhzW2NvbHVtblNwYW5JbmRleF0gKz0g
d2lkdGhDb25zdHJhaW50c1RvRGlzdHJpYnV0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8v
IDUuIFRoZSBmaW5hbCB0YWJsZSBtaW4vbWF4IHdpZHRocyBpcyBqdXN0IHRoZSBhY2N1bXVsYXRl
ZCBjb2x1bW4gY29uc3RyYWludHMuCi0gICAgYXV0byB0YWJsZVdpZHRoQ29uc3RyYWludHMgPSBJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKLSAgICBmb3IgKGF1dG8mIGNvbHVtbkludHJp
bnNpY1dpZHRoIDogY29sdW1uSW50cmluc2ljV2lkdGhzKQotICAgICAgICB0YWJsZVdpZHRoQ29u
c3RyYWludHMgKz0gY29sdW1uSW50cmluc2ljV2lkdGg7Ci0gICAgLy8gRXhhcGFuZCB0aGUgcHJl
ZmVycmVkIHdpZHRoIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgY2VsbCBzcGFjaW5nIChub3Rl
IHRoYXQgY29sdW1uIHNwYW5uZXJzIGNvdW50IGFzIG9uZSBjZWxsKS4KLSAgICB0YWJsZVdpZHRo
Q29uc3RyYWludHMgKz0gKG51bWJlck9mQWN0dWFsQ29sdW1ucyArIDEpICogZ3JpZC5ob3Jpem9u
dGFsU3BhY2luZygpOwotICAgIHJldHVybiB0YWJsZVdpZHRoQ29uc3RyYWludHM7Ci19Ci0KLXZv
aWQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUFuZERpc3RyaWJ1dGVFeHRyYVNwYWNl
KExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0
PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKQotewotICAgIC8vIENvbXB1dGUgYW5kIGJhbGFuY2Ug
dGhlIGNvbHVtbiBhbmQgcm93IHNwYWNlcy4KLSAgICBhdXRvJiBncmlkID0gZm9ybWF0dGluZ1N0
YXRlKCkudGFibGVHcmlkKCk7Ci0gICAgYXV0byYgY29sdW1ucyA9IGdyaWQuY29sdW1ucygpLmxp
c3QoKTsKLSAgICBhdXRvIHRhYmxlTGF5b3V0ID0gdGhpcy0+dGFibGVMYXlvdXQoKTsKLQotICAg
IC8vIENvbHVtbnMgZmlyc3QuCi0gICAgYXV0byBkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZXMg
PSB0YWJsZUxheW91dC5kaXN0cmlidXRlZEhvcml6b250YWxTcGFjZShhdmFpbGFibGVIb3Jpem9u
dGFsU3BhY2UpOwotICAgIEFTU0VSVChkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZXMuc2l6ZSgp
ID09IGNvbHVtbnMuc2l6ZSgpKTsKLSAgICBhdXRvIGNvbHVtbkxvZ2ljYWxMZWZ0ID0gZ3JpZC5o
b3Jpem9udGFsU3BhY2luZygpOwotICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29s
dW1uSW5kZXggPCBjb2x1bW5zLnNpemUoKTsgKytjb2x1bW5JbmRleCkgewotICAgICAgICBhdXRv
JiBjb2x1bW4gPSBjb2x1bW5zW2NvbHVtbkluZGV4XTsKLSAgICAgICAgY29sdW1uLnNldExvZ2lj
YWxMZWZ0KGNvbHVtbkxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgY29sdW1uLnNldExvZ2ljYWxXaWR0
aChkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZXNbY29sdW1uSW5kZXhdKTsKLSAgICAgICAgY29s
dW1uTG9naWNhbExlZnQgKz0gZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2VzW2NvbHVtbkluZGV4
XSArIGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBSb3dzIHNlY29u
ZC4KLSAgICBhdXRvJiByb3dzID0gZ3JpZC5yb3dzKCkubGlzdCgpOwotICAgIGZvciAoc2l6ZV90
IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkgewotICAg
ICAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5z
aXplKCk7ICsrY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGF1dG8mIHNsb3QgPSAqZ3JpZC5z
bG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0pOwotICAgICAgICAgICAgaWYgKHNsb3QuaXNS
b3dTcGFubmVkKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBsYXlv
dXRDZWxsKHNsb3QuY2VsbCgpLCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAgICAgICAg
ICAgaWYgKHNsb3QuaGFzUm93U3BhbigpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICAgICAgLy8gVGhlIG1pbmltdW0gaGVpZ2h0IG9mIGEgcm93ICh3aXRob3V0IHNwYW5uaW5n
LXJlbGF0ZWQgaGVpZ2h0IGRpc3RyaWJ1dGlvbikgaXMgZGVmaW5lZCBhcyB0aGUgaGVpZ2h0IG9m
IGFuIGh5cG90aGV0aWNhbAotICAgICAgICAgICAgLy8gbGluZWJveCBjb250YWluaW5nIHRoZSBj
ZWxscyBvcmlnaW5hdGluZyBpbiB0aGUgcm93LgotICAgICAgICAgICAgYXV0byYgY2VsbCA9IHNs
b3QuY2VsbCgpOwotICAgICAgICAgICAgY2VsbC5zZXRCYXNlbGluZShnZW9tZXRyeSgpLnVzZWRC
YXNlbGluZUZvckNlbGwoY2VsbC5ib3goKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXV0
byBkaXN0cmlidXRlZFZlcnRpY2FsU3BhY2VzID0gdGFibGVMYXlvdXQuZGlzdHJpYnV0ZWRWZXJ0
aWNhbFNwYWNlKGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpOwotICAgIEFTU0VSVChkaXN0cmlidXRl
ZFZlcnRpY2FsU3BhY2VzLnNpemUoKSA9PSByb3dzLnNpemUoKSk7Ci0gICAgYXV0byByb3dMb2dp
Y2FsVG9wID0gZ3JpZC52ZXJ0aWNhbFNwYWNpbmcoKTsKLSAgICBmb3IgKHNpemVfdCByb3dJbmRl
eCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKLSAgICAgICAgYXV0
byYgcm93ID0gcm93c1tyb3dJbmRleF07Ci0gICAgICAgIHJvdy5zZXRMb2dpY2FsSGVpZ2h0KGRp
c3RyaWJ1dGVkVmVydGljYWxTcGFjZXNbcm93SW5kZXhdKTsKLSAgICAgICAgcm93LnNldExvZ2lj
YWxUb3Aocm93TG9naWNhbFRvcCk7Ci0gICAgICAgIHJvd0xvZ2ljYWxUb3AgKz0gZGlzdHJpYnV0
ZWRWZXJ0aWNhbFNwYWNlc1tyb3dJbmRleF0gKyBncmlkLnZlcnRpY2FsU3BhY2luZygpOwotICAg
IH0KLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNv
cmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgKZGVsZXRl
ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMzBkZTEzNTQ1NjY1NTgxZWI5NDlhMjdiODBkZjRl
MTIyMjVlNmYuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250
ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
QykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFn
bWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNs
dWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRl
LmgiCi0jaW5jbHVkZSAiVGFibGVHcmlkLmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgot
I2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNw
YWNlIExheW91dCB7Ci0KLWNsYXNzIEludmFsaWRhdGlvblN0YXRlOwotLy8gVGhpcyBjbGFzcyBp
bXBsZW1lbnRzIHRoZSBsYXlvdXQgbG9naWMgZm9yIHRhYmxlIGZvcm1hdHRpbmcgY29udGV4dHMu
Ci0vLyBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjIvdGFibGVzLmh0bWwKLWNsYXNzIFRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQgZmluYWwgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQgewotICAg
IFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVGb3JtYXR0aW5nQ29udGV4dCk7Ci1wdWJsaWM6
Ci0gICAgVGFibGVGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRp
bmdDb250ZXh0Um9vdCwgVGFibGVGb3JtYXR0aW5nU3RhdGUmKTsKLSAgICB2b2lkIGxheW91dElu
Rmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxv
d0NvbnRlbnQmKSBvdmVycmlkZTsKLSAgICBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkg
Y29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICBzdGF0aWMgVW5pcXVlUmVmPFRhYmxlR3JpZD4gZW5zdXJl
VGFibGVHcmlkKGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gpOwotCi1wcml2YXRlOgotICAg
IGNsYXNzIFRhYmxlTGF5b3V0IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFRhYmxlTGF5b3V0KGNv
bnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmLCBjb25zdCBUYWJsZUdyaWQmKTsKLQotICAgICAg
ICB1c2luZyBEaXN0cmlidXRlZFNwYWNlcyA9IFZlY3RvcjxMYXlvdXRVbml0PjsKLSAgICAgICAg
RGlzdHJpYnV0ZWRTcGFjZXMgZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2UoTGF5b3V0VW5pdCBh
dmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAgICAgICBEaXN0cmlidXRlZFNwYWNlcyBkaXN0
cmlidXRlZFZlcnRpY2FsU3BhY2UoT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlVmVydGlj
YWxTcGFjZSk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRpbmdD
b250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0dGluZ0Nv
bnRleHQ7IH0KLQotICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiBtX2Zvcm1h
dHRpbmdDb250ZXh0OwotICAgICAgICBjb25zdCBUYWJsZUdyaWQmIG1fZ3JpZDsKLSAgICB9Owot
Ci0gICAgY2xhc3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5
IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIExheW91dFVuaXQgY2VsbEhlaWdoKGNvbnN0IENvbnRh
aW5lckJveCYpIGNvbnN0OwotICAgICAgICBFZGdlcyBjb21wdXRlZENlbGxCb3JkZXIoY29uc3Qg
VGFibGVHcmlkOjpDZWxsJikgY29uc3Q7Ci0gICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGNv
bXB1dGVkQ29sdW1uV2lkdGgoY29uc3QgQ29udGFpbmVyQm94JiBjb2x1bW5Cb3gpOwotICAgICAg
ICBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzRm9yQ2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmKTsKLSAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCB1c2VkQmFzZWxpbmVGb3JDZWxsKGNvbnN0IENvbnRhaW5lckJveCYg
Y2VsbEJveCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgVGFibGVGb3Jt
YXR0aW5nQ29udGV4dDsKLSAgICAgICAgR2VvbWV0cnkoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29u
dGV4dCYsIGNvbnN0IFRhYmxlR3JpZCYpOwotCi0gICAgICAgIGNvbnN0IFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8VGFi
bGVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpmb3JtYXR0
aW5nQ29udGV4dCgpKTsgfQotICAgICAgICBjb25zdCBUYWJsZUdyaWQmIG1fZ3JpZDsKLSAgICB9
OwotICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29uc3Qg
eyByZXR1cm4gR2VvbWV0cnkoKnRoaXMsIGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpKTsg
fQotCi0gICAgY2xhc3MgUXVpcmtzIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3Mg
ewotICAgIHB1YmxpYzoKLSAgICAgICAgUXVpcmtzKGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRl
eHQmKTsKLQotICAgICAgICBib29sIHNob3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFy
Z2luKGNvbnN0IENvbnRhaW5lckJveCYpIGNvbnN0OwotCi0gICAgICAgIGNvbnN0IFRhYmxlRm9y
bWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNh
c3Q8VGFibGVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6Zm9y
bWF0dGluZ0NvbnRleHQoKSk7IH0KLSAgICAgICAgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21l
dHJ5KCk7IH0KLSAgICB9OwotICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyBxdWly
a3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9Ci0KLSAgICBUYWJsZUZvcm1hdHRp
bmdDb250ZXh0OjpUYWJsZUxheW91dCB0YWJsZUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIFRhYmxl
TGF5b3V0KCp0aGlzLCBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKSk7IH0KLQotICAgIElu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
KCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBsYXlvdXRDZWxsKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYs
IExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0
PiB1c2VkQ2VsbEhlaWdodCA9IFdURjo6bnVsbG9wdCk7Ci0gICAgdm9pZCBzZXRVc2VkR2VvbWV0
cnlGb3JDZWxscyhMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSk7Ci0gICAgdm9p
ZCBzZXRVc2VkR2VvbWV0cnlGb3JSb3dzKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNw
YWNlKTsKLSAgICB2b2lkIHNldFVzZWRHZW9tZXRyeUZvclNlY3Rpb25zKGNvbnN0IENvbnN0cmFp
bnRzRm9ySW5GbG93Q29udGVudCYpOwotCi0gICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBj
b21wdXRlZFByZWZlcnJlZFdpZHRoRm9yQ29sdW1ucygpOwotICAgIHZvaWQgY29tcHV0ZUFuZERp
c3RyaWJ1dGVFeHRyYVNwYWNlKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBP
cHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKTsKLQotICAgIGNvbnN0
IFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBk
b3duY2FzdDxUYWJsZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRp
bmdTdGF0ZSgpKTsgfQotICAgIFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUo
KSB7IHJldHVybiBkb3duY2FzdDxUYWJsZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRl
eHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQotfTsKLQotaW5saW5lIFRhYmxlRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5OjpHZW9tZXRyeShjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiB0
YWJsZUZvcm1hdHRpbmdDb250ZXh0LCBjb25zdCBUYWJsZUdyaWQmIGdyaWQpCi0gICAgOiBGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnkodGFibGVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICAsIG1f
Z3JpZChncmlkKQotewotfQotCi1pbmxpbmUgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtz
OjpRdWlya3MoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYgdGFibGVGb3JtYXR0aW5nQ29u
dGV4dCkKLSAgICA6IEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3ModGFibGVGb3JtYXR0aW5nQ29u
dGV4dCkKLXsKLX0KLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JN
QVRUSU5HX0NPTlRFWFQoVGFibGVGb3JtYXR0aW5nQ29udGV4dCwgaXNUYWJsZUZvcm1hdHRpbmdD
b250ZXh0KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3Rh
YmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2Vv
bWV0cnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzMyMzkyNjk0ZjZlN2E4
MjQyOWMyMGE1ZTYxMDk4NDBlMmFlZGM4Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFi
bGVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSAr
MCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgot
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQotCi0jaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5
b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCi0jaW5jbHVkZSAi
TGF5b3V0RGVzY2VuZGFudEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRh
aW5pbmdCbG9jay5oIgotI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCi0KLW5hbWVz
cGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1MYXlvdXRVbml0IFRhYmxlRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpjZWxsSGVpZ2goY29uc3QgQ29udGFpbmVyQm94JiBj
ZWxsQm94KSBjb25zdAotewotICAgIEFTU0VSVChjZWxsQm94LmlzSW5GbG93KCkpOwotICAgIGF1
dG8gY29udGVudEhlaWdodCA9IExheW91dFVuaXQgeyB9OwotICAgIGlmIChmb3JtYXR0aW5nQ29u
dGV4dCgpLnF1aXJrcygpLnNob3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luKGNl
bGxCb3gpKSB7Ci0gICAgICAgIEFTU0VSVChjZWxsQm94LmZpcnN0SW5GbG93Q2hpbGQoKSk7Ci0g
ICAgICAgIGF1dG8gZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgp
OwotICAgICAgICBhdXRvJiBmaXJzdEluRmxvd0NoaWxkID0gKmNlbGxCb3guZmlyc3RJbkZsb3dD
aGlsZCgpOwotICAgICAgICBhdXRvJiBsYXN0SW5GbG93Q2hpbGQgPSAqY2VsbEJveC5sYXN0SW5G
bG93Q2hpbGQoKTsKLSAgICAgICAgYXV0byYgZmlyc3RJbkZsb3dDaGlsZEdlb21ldHJ5ID0gZm9y
bWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goZmlyc3RJbkZsb3dDaGlsZCwgRXNjYXBlUmVh
c29uOjpUYWJsZVF1aXJrTmVlZHNHZW9tZXRyeUZyb21Fc3RhYmxpc2hlZEZvcm1hdHRpbmdDb250
ZXh0KTsKLSAgICAgICAgYXV0byYgbGFzdEluRmxvd0NoaWxkR2VvbWV0cnkgPSBmb3JtYXR0aW5n
Q29udGV4dC5nZW9tZXRyeUZvckJveChsYXN0SW5GbG93Q2hpbGQsIEVzY2FwZVJlYXNvbjo6VGFi
bGVRdWlya05lZWRzR2VvbWV0cnlGcm9tRXN0YWJsaXNoZWRGb3JtYXR0aW5nQ29udGV4dCk7Ci0K
LSAgICAgICAgYXV0byB0b3AgPSBmaXJzdEluRmxvd0NoaWxkLnN0eWxlKCkuaGFzTWFyZ2luQmVm
b3JlUXVpcmsoKSA/IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGZpcnN0SW5GbG93Q2hpbGRH
ZW9tZXRyeSkudG9wKCkgOiBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChmaXJzdEluRmxvd0No
aWxkR2VvbWV0cnkpLnRvcCgpOwotICAgICAgICBhdXRvIGJvdHRvbSA9IGxhc3RJbkZsb3dDaGls
ZC5zdHlsZSgpLmhhc01hcmdpbkFmdGVyUXVpcmsoKSA/IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hS
ZWN0KGxhc3RJbkZsb3dDaGlsZEdlb21ldHJ5KS5ib3R0b20oKSA6IEJveEdlb21ldHJ5OjptYXJn
aW5Cb3hSZWN0KGxhc3RJbkZsb3dDaGlsZEdlb21ldHJ5KS5ib3R0b20oKTsKLSAgICAgICAgY29u
dGVudEhlaWdodCA9IGJvdHRvbSAtIHRvcDsKLSAgICB9IGVsc2UKLSAgICAgICAgY29udGVudEhl
aWdodCA9IGNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QoY2VsbEJveCk7Ci0g
ICAgcmV0dXJuIHN0ZDo6bWF4KGNvbXB1dGVkSGVpZ2h0KGNlbGxCb3gpLnZhbHVlT3IoMF9sdSks
IGNvbnRlbnRIZWlnaHQpOwotfQotCi1FZGdlcyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeTo6Y29tcHV0ZWRDZWxsQm9yZGVyKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgY29u
c3QKLXsKLSAgICBhdXRvJiBjZWxsQm94ID0gY2VsbC5ib3goKTsKLSAgICBhdXRvIGJvcmRlciA9
IGNvbXB1dGVkQm9yZGVyKGNlbGxCb3gpOwotICAgIGF1dG8gY29sbGFwc2VkQm9yZGVyID0gbV9n
cmlkLmNvbGxhcHNlZEJvcmRlcigpOwotICAgIGlmICghY29sbGFwc2VkQm9yZGVyKQotICAgICAg
ICByZXR1cm4gYm9yZGVyOwotCi0gICAgLy8gV2UgbWlnaHQgd2FudCB0byBjYWNoZSB0aGVzZSBj
b2xsYXBzZWQgYm9yZGVycyBvbiB0aGUgZ3JpZC4KLSAgICBhdXRvIGNlbGxQb3NpdGlvbiA9IGNl
bGwucG9zaXRpb24oKTsKLSAgICAvLyBDb2xsYXBzZWQgYm9yZGVyIGxlZnQgZnJvbSB0YWJsZSBh
bmQgYWRqYWNlbnQgY2VsbHMuCi0gICAgaWYgKCFjZWxsUG9zaXRpb24uY29sdW1uKQotICAgICAg
ICBib3JkZXIuaG9yaXpvbnRhbC5sZWZ0ID0gY29sbGFwc2VkQm9yZGVyLT5ob3Jpem9udGFsLmxl
ZnQgLyAyOwotICAgIGVsc2UgewotICAgICAgICBhdXRvIGFkamFjZW50Qm9yZGVyUmlnaHQgPSBj
b21wdXRlZEJvcmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4gLSAxLCBjZWxs
UG9zaXRpb24ucm93IH0pLT5jZWxsKCkuYm94KCkpLmhvcml6b250YWwucmlnaHQ7Ci0gICAgICAg
IGJvcmRlci5ob3Jpem9udGFsLmxlZnQgPSBzdGQ6Om1heChib3JkZXIuaG9yaXpvbnRhbC5sZWZ0
LCBhZGphY2VudEJvcmRlclJpZ2h0KSAvIDI7Ci0gICAgfQotICAgIC8vIENvbGxhcHNlZCBib3Jk
ZXIgcmlnaHQgZnJvbSB0YWJsZSBhbmQgYWRqYWNlbnQgY2VsbHMuCi0gICAgaWYgKGNlbGxQb3Np
dGlvbi5jb2x1bW4gPT0gbV9ncmlkLmNvbHVtbnMoKS5zaXplKCkgLSAxKQotICAgICAgICBib3Jk
ZXIuaG9yaXpvbnRhbC5yaWdodCA9IGNvbGxhcHNlZEJvcmRlci0+aG9yaXpvbnRhbC5yaWdodCAv
IDI7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJMZWZ0ID0gY29tcHV0
ZWRCb3JkZXIobV9ncmlkLnNsb3QoeyBjZWxsUG9zaXRpb24uY29sdW1uICsgMSwgY2VsbFBvc2l0
aW9uLnJvdyB9KS0+Y2VsbCgpLmJveCgpKS5ob3Jpem9udGFsLmxlZnQ7Ci0gICAgICAgIGJvcmRl
ci5ob3Jpem9udGFsLnJpZ2h0ID0gc3RkOjptYXgoYm9yZGVyLmhvcml6b250YWwucmlnaHQsIGFk
amFjZW50Qm9yZGVyTGVmdCkgLyAyOwotICAgIH0KLSAgICAvLyBDb2xsYXBzZWQgYm9yZGVyIHRv
cCBmcm9tIHRhYmxlLCByb3cgYW5kIGFkamFjZW50IGNlbGxzLgotICAgIGF1dG8mIHJvd3MgPSBt
X2dyaWQucm93cygpLmxpc3QoKTsKLSAgICBpZiAoIWNlbGxQb3NpdGlvbi5yb3cpCi0gICAgICAg
IGJvcmRlci52ZXJ0aWNhbC50b3AgPSBjb2xsYXBzZWRCb3JkZXItPnZlcnRpY2FsLnRvcCAvIDI7
Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJCb3R0b20gPSBjb21wdXRl
ZEJvcmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4sIGNlbGxQb3NpdGlvbi5y
b3cgLSAxIH0pLT5jZWxsKCkuYm94KCkpLnZlcnRpY2FsLmJvdHRvbTsKLSAgICAgICAgYXV0byBh
ZGphY2VudFJvd0JvdHRvbSA9IGNvbXB1dGVkQm9yZGVyKHJvd3NbY2VsbFBvc2l0aW9uLnJvdyAt
IDFdLmJveCgpKS52ZXJ0aWNhbC5ib3R0b207Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRDb2xsYXBz
ZWRCb3JkZXIgPSBzdGQ6Om1heChhZGphY2VudEJvcmRlckJvdHRvbSwgYWRqYWNlbnRSb3dCb3R0
b20pOwotICAgICAgICBib3JkZXIudmVydGljYWwudG9wID0gc3RkOjptYXgoYm9yZGVyLnZlcnRp
Y2FsLnRvcCwgYWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIpIC8gMjsKLSAgICB9Ci0gICAgLy8gQ29s
bGFwc2VkIGJvcmRlciBib3R0b20gZnJvbSB0YWJsZSwgcm93IGFuZCBhZGphY2VudCBjZWxscy4K
LSAgICBpZiAoY2VsbFBvc2l0aW9uLnJvdyA9PSBtX2dyaWQucm93cygpLnNpemUoKSAtIDEpCi0g
ICAgICAgIGJvcmRlci52ZXJ0aWNhbC5ib3R0b20gPSBjb2xsYXBzZWRCb3JkZXItPnZlcnRpY2Fs
LmJvdHRvbSAvIDI7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJUb3Ag
PSBjb21wdXRlZEJvcmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4sIGNlbGxQ
b3NpdGlvbi5yb3cgKyAxIH0pLT5jZWxsKCkuYm94KCkpLnZlcnRpY2FsLnRvcDsKLSAgICAgICAg
YXV0byBhZGphY2VudFJvd1RvcCA9IGNvbXB1dGVkQm9yZGVyKHJvd3NbY2VsbFBvc2l0aW9uLnJv
dyArIDFdLmJveCgpKS52ZXJ0aWNhbC50b3A7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRDb2xsYXBz
ZWRCb3JkZXIgPSBzdGQ6Om1heChhZGphY2VudEJvcmRlclRvcCwgYWRqYWNlbnRSb3dUb3ApOwot
ICAgICAgICBib3JkZXIudmVydGljYWwuYm90dG9tID0gc3RkOjptYXgoYm9yZGVyLnZlcnRpY2Fs
LmJvdHRvbSwgYWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIpIC8gMjsKLSAgICB9Ci0gICAgcmV0dXJu
IGJvcmRlcjsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gVGFibGVGb3JtYXR0aW5nQ29udGV4
dDo6R2VvbWV0cnk6OmNvbXB1dGVkQ29sdW1uV2lkdGgoY29uc3QgQ29udGFpbmVyQm94JiBjb2x1
bW5Cb3gpCi17Ci0gICAgLy8gQ2hlY2sgYm90aCBzdHlsZSBhbmQgPGNvbD4ncyB3aWR0aCBhdHRy
aWJ1dGUuCi0gICAgLy8gRklYTUU6IEZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIGNhbGN1bGF0
ZWQgdmFsdWVzLCBsaWtlIDxjb2wgc3R5bGU9IndpZHRoOiAxMCUiPi4KLSAgICBpZiAoYXV0byBj
b21wdXRlZFdpZHRoVmFsdWUgPSBjb21wdXRlZFdpZHRoKGNvbHVtbkJveCwgeyB9KSkKLSAgICAg
ICAgcmV0dXJuIGNvbXB1dGVkV2lkdGhWYWx1ZTsKLSAgICByZXR1cm4gY29sdW1uQm94LmNvbHVt
bldpZHRoKCk7Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzRm9yQ2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpCi17Ci0gICAgYXV0byYg
Y2VsbEJveCA9IGNlbGwuYm94KCk7Ci0gICAgYXV0byYgc3R5bGUgPSBjZWxsQm94LnN0eWxlKCk7
Ci0KLSAgICBhdXRvIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IFsmXSgpIC0+
IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsKLSAgICAgICAg
Ly8gRXZlbiBmaXhlZCB3aWR0aCBjZWxscyBleHBhbmQgdG8gdGhlaXIgbWluaW11bSBjb250ZW50
IHdpZHRoCi0gICAgICAgIC8vIDx0ZCBzdHlsZT0id2lkdGg6IDEwcHgiPnRlc3RfY29udGVudDwv
dGQ+IHdpbGwgc2l6ZSB0byBtYXgobWluaW11bSBjb250ZW50IHdpZHRoLCBjb21wdXRlZCB3aWR0
aCkuCi0gICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IEZvcm1hdHRpbmdD
b250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKLSAgICAgICAgaWYgKGNlbGxC
b3guaGFzQ2hpbGQoKSkKLSAgICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBM
YXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjZWxsQm94LCBsYXlvdXRTdGF0
ZSgpKS0+Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGlmIChh
dXRvIGZpeGVkV2lkdGggPSBmaXhlZFZhbHVlKHN0eWxlLmxvZ2ljYWxXaWR0aCgpKSkKLSAgICAg
ICAgICAgIHJldHVybiB7IHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11
bSwgKmZpeGVkV2lkdGgpLCBzdGQ6Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmlt
dW0sICpmaXhlZFdpZHRoKSB9OwotICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJh
aW50czsKLSAgICB9OwotICAgIC8vIEZJWE1FIENoZWNrIGZvciBib3gtc2l6aW5nOiBib3JkZXIt
Ym94OwotICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGNvbnN0cmFpbkJ5TWlu
TWF4V2lkdGgoY2VsbEJveCwgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkpOwot
ICAgIC8vIEV4cGFuZCB3aXRoIGJvcmRlcgotICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMu
ZXhwYW5kKGNvbXB1dGVkQ2VsbEJvcmRlcihjZWxsKS53aWR0aCgpKTsKLSAgICAvLyBwYWRkaW5n
Ci0gICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQoZml4ZWRWYWx1ZShzdHlsZS5w
YWRkaW5nTGVmdCgpKS52YWx1ZU9yKDApICsgZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nUmlnaHQo
KSkudmFsdWVPcigwKSk7Ci0gICAgLy8gYW5kIG1hcmdpbgotICAgIGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMuZXhwYW5kKGZpeGVkVmFsdWUoc3R5bGUubWFyZ2luU3RhcnQoKSkudmFsdWVPcigw
KSArIGZpeGVkVmFsdWUoc3R5bGUubWFyZ2luRW5kKCkpLnZhbHVlT3IoMCkpOwotICAgIHJldHVy
biBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOwotfQotCi0KLUlubGluZUxheW91dFVuaXQgVGFi
bGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OnVzZWRCYXNlbGluZUZvckNlbGwoY29uc3Qg
Q29udGFpbmVyQm94JiBjZWxsQm94KQotewotICAgIC8vIFRoZSBiYXNlbGluZSBvZiBhIGNlbGwg
aXMgZGVmaW5lZCBhcyB0aGUgYmFzZWxpbmUgb2YgdGhlIGZpcnN0IGluLWZsb3cgbGluZSBib3gg
aW4gdGhlIGNlbGwsCi0gICAgLy8gb3IgdGhlIGZpcnN0IGluLWZsb3cgdGFibGUtcm93IGluIHRo
ZSBjZWxsLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCi0gICAgLy8gSWYgdGhlcmUgaXMgbm8gc3Vj
aCBsaW5lIGJveCwgdGhlIGJhc2VsaW5lIGlzIHRoZSBib3R0b20gb2YgY29udGVudCBlZGdlIG9m
IHRoZSBjZWxsIGJveC4KLSAgICBpZiAoY2VsbEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRp
bmdDb250ZXh0KCkpCi0gICAgICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkSW5s
aW5lRm9ybWF0dGluZ1N0YXRlKGNlbGxCb3gpLmxpbmVzKClbMF0uYmFzZWxpbmUoKTsKLSAgICBm
b3IgKGF1dG8mIGNlbGxEZXNjZW5kYW50IDogZGVzY2VuZGFudHNPZlR5cGU8Q29udGFpbmVyQm94
PihjZWxsQm94KSkgewotICAgICAgICBpZiAoY2VsbERlc2NlbmRhbnQuZXN0YWJsaXNoZXNJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICBhdXRvJiBpbmxpbmVGb3JtYXR0
aW5nU3RhdGVGb3JDZWxsID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZElubGluZUZvcm1hdHRp
bmdTdGF0ZShjZWxsRGVzY2VuZGFudCk7Ci0gICAgICAgICAgICBpZiAoIWlubGluZUZvcm1hdHRp
bmdTdGF0ZUZvckNlbGwubGluZXMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGlubGluZUZvcm1hdHRpbmdTdGF0ZUZvckNlbGwubGluZXMoKVswXS5iYXNlbGluZSgpOwotICAg
ICAgICB9Ci0gICAgICAgIGlmIChjZWxsRGVzY2VuZGFudC5lc3RhYmxpc2hlc1RhYmxlRm9ybWF0
dGluZ0NvbnRleHQoKSkKLSAgICAgICAgICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmVzdGFibGlz
aGVkVGFibGVGb3JtYXR0aW5nU3RhdGUoY2VsbERlc2NlbmRhbnQpLnRhYmxlR3JpZCgpLnJvd3Mo
KS5saXN0KClbMF0uYmFzZWxpbmUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1hdHRpbmdDb250
ZXh0KCkuZ2VvbWV0cnlGb3JCb3goY2VsbEJveCkuY29udGVudEJveEJvdHRvbSgpOwotfQotCi19
Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9y
bWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NGE2MmRmZjA3MTRhZDY4ZmE3ODk2ODVm
YmJiMjEzNzRmZjE1MzIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRp
bmdDb250ZXh0UXVpcmtzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
LSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29u
dGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNs
dWRlICJMYXlvdXRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNs
dWRlICJMYXlvdXRTdGF0ZS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5
b3V0IHsKLQotYm9vbCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OnNob3VsZElnbm9y
ZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCkg
Y29uc3QKLXsKLSAgICAvLyBOb3JtYWxseSBCRkMgcm9vdCBjb250ZW50IGhlaWdodCB0YWtlcyB0
aGUgbWFyZ2luIGJveCBvZiB0aGUgY2hpbGQgY29udGVudCBhcyB2ZXJ0aWNhbCBtYXJnaW5zIGRv
bid0IGNvbGxhcHNlIHdpdGggQkZDIHJvb3RzLAotICAgIC8vIGJ1dCB0YWJsZSBjZWxsIGJveGVz
IGRvIGNvbGxhcHNlIHRoZWlyIChub24tZXhpc3RpbmcpIG1hcmdpbnMgd2l0aCBjaGlsZCBxdWly
ayBtYXJnaW5zIChzbyBtdWNoIHF1aXJrKSwgc28gaGVyZSB3ZSBjaGVjawotICAgIC8vIGlmIHRo
ZSBjb250ZW50IGhlaWdodCBzaG91bGQgaW5jbHVkZSBtYXJnaW5zIG9yIG5vdC4KLSAgICAvLyBl
LmcgPHRhYmxlPjx0cj48dGQ+PHA+dGV4dCBjb250ZW50PC90ZD48L3RyPjwvdGFibGU+IDwtIDxw
PidzIHF1aXJrIG1hcmdpbiBjb2xsYXBzZXMgd2l0aCB0aGUgPHRkPiBzbyBpdHMgY29udGVudAot
ICAgIC8vIGhlaWdodCBzaG91bGQgbm90IGluY2x1ZGUgdmVydGljYWwgbWFyZ2lucy4KLSAgICBp
ZiAoIWxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBpZiAoY2VsbEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIWNlbGxCb3guaGFzSW5GbG93Q2hpbGQoKSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBjZWxsQm94LmZpcnN0SW5GbG93Q2hp
bGQoKS0+c3R5bGUoKS5oYXNNYXJnaW5CZWZvcmVRdWlyaygpIHx8IGNlbGxCb3gubGFzdEluRmxv
d0NoaWxkKCktPnN0eWxlKCkuaGFzTWFyZ2luQWZ0ZXJRdWlyaygpOwotfQotCi19Ci19Ci0KLSNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9U
YWJsZUZvcm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3Jt
YXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMTMxMGVmNWUxMzI2MGQxYTMxZmIxZDllODZlMmM2YjYyM2E2NTk4Ny4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcAorKysgL2Rldi9udWxs
CkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBh
cmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5j
bHVkZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgotI2lu
Y2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoVGFibGVGb3Jt
YXR0aW5nU3RhdGUpOwotCi1UYWJsZUZvcm1hdHRpbmdTdGF0ZTo6VGFibGVGb3JtYXR0aW5nU3Rh
dGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91
dFN0YXRlLCBjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KQotICAgIDogRm9ybWF0dGluZ1N0
YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OlRhYmxlLCBsYXlvdXRTdGF0ZSkKLSAg
ICAsIG1fdGFibGVHcmlkKFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmVuc3VyZVRhYmxlR3JpZCh0
YWJsZUJveCkpCi17Ci19Ci0KLVRhYmxlRm9ybWF0dGluZ1N0YXRlOjp+VGFibGVGb3JtYXR0aW5n
U3RhdGUoKQotewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuaCBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuaApkZWxl
dGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxZTRhZjBiOTZhY2M0ZDM0MzQ1YWE5Y2Y2ZDgz
Zjc4ZDUzYzc2Zi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0
YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdt
YSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1
ZGUgIkZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIlRhYmxlR3JpZC5oIgotI2luY2x1ZGUg
PHd0Zi9Jc29NYWxsb2MuaD4KLSNpbmNsdWRlIDx3dGYvVW5pcXVlUmVmLmg+Ci0KLW5hbWVzcGFj
ZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi0vLyBUYWJsZUZvcm1hdHRpbmdTdGF0
ZSBob2xkcyB0aGUgc3RhdGUgZm9yIGEgcGFydGljdWxhciB0YWJsZSBmb3JtYXR0aW5nIGNvbnRl
eHQgdHJlZS4KLWNsYXNzIFRhYmxlRm9ybWF0dGluZ1N0YXRlIDogcHVibGljIEZvcm1hdHRpbmdT
dGF0ZSB7Ci0gICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChUYWJsZUZvcm1hdHRpbmdTdGF0ZSk7
Ci1wdWJsaWM6Ci0gICAgVGFibGVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYs
IExheW91dFN0YXRlJiwgY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCk7Ci0gICAgflRhYmxl
Rm9ybWF0dGluZ1N0YXRlKCk7Ci0KLSAgICBUYWJsZUdyaWQmIHRhYmxlR3JpZCgpIHsgcmV0dXJu
IG1fdGFibGVHcmlkOyB9Ci0gICAgY29uc3QgVGFibGVHcmlkJiB0YWJsZUdyaWQoKSBjb25zdCB7
IHJldHVybiBtX3RhYmxlR3JpZDsgfQotCi1wcml2YXRlOgotICAgIFVuaXF1ZVJlZjxUYWJsZUdy
aWQ+IG1fdGFibGVHcmlkOwotfTsKLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xB
WU9VVF9GT1JNQVRUSU5HX1NUQVRFKFRhYmxlRm9ybWF0dGluZ1N0YXRlLCBpc1RhYmxlRm9ybWF0
dGluZ1N0YXRlKCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L3Rh
YmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAzYzQxZDhkMDhhNTI1ZTc1NmFiY2RjYjFhMjE1YzlmNDY1NmFjZmI2Li4wMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90
YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlRhYmxlR3Jp
ZC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRl
IDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3Bh
Y2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKFRhYmxlR3JpZCk7Ci0K
LVRhYmxlR3JpZDo6Q29sdW1uOjpDb2x1bW4oY29uc3QgQ29udGFpbmVyQm94KiBjb2x1bW5Cb3gp
Ci0gICAgOiBtX2xheW91dEJveChtYWtlV2Vha1B0cihjb2x1bW5Cb3gpKQotewotfQotCi12b2lk
IFRhYmxlR3JpZDo6Q29sdW1uOjpzZXRMb2dpY2FsV2lkdGgoTGF5b3V0VW5pdCBjb21wdXRlZExv
Z2ljYWxXaWR0aCkKLXsKLSNpZiBBU1NFUlRfRU5BQkxFRAotICAgIG1faGFzQ29tcHV0ZWRXaWR0
aCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX2NvbXB1dGVkTG9naWNhbFdpZHRoID0gY29tcHV0ZWRM
b2dpY2FsV2lkdGg7Ci19Ci0KLUxheW91dFVuaXQgVGFibGVHcmlkOjpDb2x1bW46OmxvZ2ljYWxX
aWR0aCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzQ29tcHV0ZWRXaWR0aCk7Ci0gICAgcmV0
dXJuIG1fY29tcHV0ZWRMb2dpY2FsV2lkdGg7Ci19Ci0KLXZvaWQgVGFibGVHcmlkOjpDb2x1bW46
OnNldExvZ2ljYWxMZWZ0KExheW91dFVuaXQgY29tcHV0ZWRMb2dpY2FsTGVmdCkKLXsKLSNpZiBB
U1NFUlRfRU5BQkxFRAotICAgIG1faGFzQ29tcHV0ZWRMZWZ0ID0gdHJ1ZTsKLSNlbmRpZgotICAg
IG1fY29tcHV0ZWRMb2dpY2FsTGVmdCA9IGNvbXB1dGVkTG9naWNhbExlZnQ7Ci19Ci0KLUxheW91
dFVuaXQgVGFibGVHcmlkOjpDb2x1bW46OmxvZ2ljYWxMZWZ0KCkgY29uc3QKLXsKLSAgICBBU1NF
UlQobV9oYXNDb21wdXRlZExlZnQpOwotICAgIHJldHVybiBtX2NvbXB1dGVkTG9naWNhbExlZnQ7
Ci19Ci0KLWJvb2wgVGFibGVHcmlkOjpDb2x1bW46OmlzRml4ZWRXaWR0aCgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGhhc0ZpeGVkV2lkdGhDZWxsKCkgfHwgKGJveCgpICYmIGJveCgpLT5jb2x1bW5X
aWR0aCgpKTsKLX0KLQotdm9pZCBUYWJsZUdyaWQ6OkNvbHVtbnM6OmFkZENvbHVtbihjb25zdCBD
b250YWluZXJCb3gmIGNvbHVtbkJveCkKLXsKLSAgICBtX2NvbHVtbkxpc3QuYXBwZW5kKHsgJmNv
bHVtbkJveCB9KTsKLX0KLQotdm9pZCBUYWJsZUdyaWQ6OkNvbHVtbnM6OmFkZEFub255bW91c0Nv
bHVtbigpCi17Ci0gICAgbV9jb2x1bW5MaXN0LmFwcGVuZCh7IG51bGxwdHIgfSk7Ci19Ci0KLWJv
b2wgVGFibGVHcmlkOjpDb2x1bW5zOjpoYXNGaXhlZENvbHVtbnNPbmx5KCkgY29uc3QKLXsKLSAg
ICBmb3IgKGF1dG8mIGNvbHVtbiA6IG1fY29sdW1uTGlzdCkgewotICAgICAgICBpZiAoIWNvbHVt
bi5pc0ZpeGVkV2lkdGgoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAg
cmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVGFibGVHcmlkOjpSb3dzOjphZGRSb3coY29uc3QgQ29u
dGFpbmVyQm94JiByb3dCb3gpCi17Ci0gICAgbV9yb3dMaXN0LmFwcGVuZCh7IHJvd0JveCB9KTsK
LX0KLQotVGFibGVHcmlkOjpSb3c6OlJvdyhjb25zdCBDb250YWluZXJCb3gmIHJvd0JveCkKLSAg
ICA6IG1fbGF5b3V0Qm94KG1ha2VXZWFrUHRyKHJvd0JveCkpCi17Ci19Ci0KLVRhYmxlR3JpZDo6
Q2VsbDo6Q2VsbChjb25zdCBDb250YWluZXJCb3gmIGNlbGxCb3gsIFNsb3RQb3NpdGlvbiBwb3Np
dGlvbiwgQ2VsbFNwYW4gc3BhbikKLSAgICA6IG1fbGF5b3V0Qm94KG1ha2VXZWFrUHRyKGNlbGxC
b3gpKQotICAgICwgbV9wb3NpdGlvbihwb3NpdGlvbikKLSAgICAsIG1fc3BhbihzcGFuKQotewot
fQotCi1ib29sIFRhYmxlR3JpZDo6Q2VsbDo6aXNGaXhlZFdpZHRoKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gYm94KCkuc3R5bGUoKS5sb2dpY2FsV2lkdGgoKS5pc0ZpeGVkKCk7Ci19Ci0KLVRhYmxl
R3JpZDo6U2xvdDo6U2xvdChDZWxsJiBjZWxsLCBib29sIGlzQ29sdW1uU3Bhbm5lZCwgYm9vbCBp
c1Jvd1NwYW5uZWQpCi0gICAgOiBtX2NlbGwobWFrZVdlYWtQdHIoY2VsbCkpCi0gICAgLCBtX2lz
Q29sdW1uU3Bhbm5lZChpc0NvbHVtblNwYW5uZWQpCi0gICAgLCBtX2lzUm93U3Bhbm5lZChpc1Jv
d1NwYW5uZWQpCi17Ci19Ci0KLVRhYmxlR3JpZDo6VGFibGVHcmlkKCkKLXsKLX0KLQotVGFibGVH
cmlkOjpTbG90KiBUYWJsZUdyaWQ6OnNsb3QoU2xvdFBvc2l0aW9uIHBvc2l0aW9uKQotewotICAg
IHJldHVybiBtX3Nsb3RNYXAuZ2V0KHBvc2l0aW9uKTsKLX0KLQotdm9pZCBUYWJsZUdyaWQ6OmFw
cGVuZENlbGwoY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94KQotewotICAgIGF1dG8gcm93U3Bh
biA9IGNlbGxCb3gucm93U3BhbigpOwotICAgIGF1dG8gY29sdW1uU3BhbiA9IGNlbGxCb3guY29s
dW1uU3BhbigpOwotICAgIGF1dG8gaXNJbk5ld1JvdyA9ICFjZWxsQm94LnByZXZpb3VzU2libGlu
ZygpOwotICAgIGF1dG8gaW5pdGlhbFNsb3RQb3NpdGlvbiA9IFNsb3RQb3NpdGlvbiB7IH07Ci0K
LSAgICBpZiAoIW1fY2VsbHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGF1dG8mIGxhc3RDZWxsID0g
bV9jZWxscy5sYXN0KCk7Ci0gICAgICAgIGF1dG8gbGFzdFNsb3RQb3NpdGlvbiA9IGxhc3RDZWxs
LT5wb3NpdGlvbigpOwotICAgICAgICAvLyBGaXJzdCB0YWJsZSBjZWxsIGluIHRoaXMgcm93Pwot
ICAgICAgICBpZiAoaXNJbk5ld1JvdykKLSAgICAgICAgICAgIGluaXRpYWxTbG90UG9zaXRpb24g
PSBTbG90UG9zaXRpb24geyAwLCBsYXN0U2xvdFBvc2l0aW9uLnJvdyArIDEgfTsKLSAgICAgICAg
ZWxzZQotICAgICAgICAgICAgaW5pdGlhbFNsb3RQb3NpdGlvbiA9IFNsb3RQb3NpdGlvbiB7IGxh
c3RTbG90UG9zaXRpb24uY29sdW1uICsgMSwgbGFzdFNsb3RQb3NpdGlvbi5yb3cgfTsKLQotICAg
ICAgICAvLyBQaWNrIHRoZSBuZXh0IGF2YWlsYWJsZSBzbG90IGJ5IGF2b2lkaW5nIHJvdyBhbmQg
Y29sdW1uIHNwYW5uZXJzLgotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaWYg
KCFtX3Nsb3RNYXAuY29udGFpbnMoaW5pdGlhbFNsb3RQb3NpdGlvbikpCi0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICArK2luaXRpYWxTbG90UG9zaXRpb24uY29sdW1uOwotICAg
ICAgICB9Ci0gICAgfQotICAgIGF1dG8gY2VsbCA9IG1ha2VVbmlxdWU8Q2VsbD4oY2VsbEJveCwg
aW5pdGlhbFNsb3RQb3NpdGlvbiwgQ2VsbFNwYW4geyBjb2x1bW5TcGFuLCByb3dTcGFuIH0pOwot
ICAgIC8vIFJvdyBhbmQgY29sdW1uIHNwYW5uZXJzIGNyZWF0ZSBhZGRpdGlvbmFsIHNsb3RzLgot
ICAgIGZvciAoc2l6ZV90IHJvdyA9IDA7IHJvdyA8IHJvd1NwYW47ICsrcm93KSB7Ci0gICAgICAg
IGZvciAoYXV0byBjb2x1bW4gPSBjZWxsLT5zdGFydENvbHVtbigpOyBjb2x1bW4gPCBjZWxsLT5l
bmRDb2x1bW4oKTsgKytjb2x1bW4pIHsKLSAgICAgICAgICAgIGF1dG8gcG9zaXRpb24gPSBTbG90
UG9zaXRpb24geyBjb2x1bW4sIGNlbGwtPnN0YXJ0Um93KCkgKyByb3cgfTsKLSAgICAgICAgICAg
IEFTU0VSVCghbV9zbG90TWFwLmNvbnRhaW5zKHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAvLyBU
aGlzIHNsb3QgaXMgc3Bhbm5lZCBieSBhIGNlbGwgYXQgdGhlIGluaXRpYWwgc2xvdyBwb3NpdGlv
bi4KLSAgICAgICAgICAgIGF1dG8gaXNDb2x1bW5TcGFubmVkID0gY29sdW1uICE9IGNlbGwtPnN0
YXJ0Q29sdW1uKCk7Ci0gICAgICAgICAgICBhdXRvIGlzUm93U3Bhbm5lZCA9ICEhcm93OwotICAg
ICAgICAgICAgbV9zbG90TWFwLmFkZChwb3NpdGlvbiwgbWFrZVVuaXF1ZTxTbG90PigqY2VsbCwg
aXNDb2x1bW5TcGFubmVkLCBpc1Jvd1NwYW5uZWQpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAv
LyBJbml0aWFsaXplIGNvbHVtbnMvcm93cyBpZiBuZWVkZWQuCi0gICAgYXV0byBtaXNzaW5nTnVt
YmVyT2ZDb2x1bW5zID0gc3RkOjptYXg8aW50PigwLCBpbml0aWFsU2xvdFBvc2l0aW9uLmNvbHVt
biArIGNvbHVtblNwYW4gLSBtX2NvbHVtbnMuc2l6ZSgpKTsKLSAgICBmb3IgKGF1dG8gY29sdW1u
ID0gMDsgY29sdW1uIDwgbWlzc2luZ051bWJlck9mQ29sdW1uczsgKytjb2x1bW4pCi0gICAgICAg
IG1fY29sdW1ucy5hZGRBbm9ueW1vdXNDb2x1bW4oKTsKLQotICAgIGlmIChjZWxsLT5pc0ZpeGVk
V2lkdGgoKSkgewotICAgICAgICBmb3IgKGF1dG8gY29sdW1uID0gY2VsbC0+c3RhcnRDb2x1bW4o
KTsgY29sdW1uIDwgY2VsbC0+ZW5kQ29sdW1uKCk7ICsrY29sdW1uKQotICAgICAgICAgICAgbV9j
b2x1bW5zLmxpc3QoKVtjb2x1bW5dLnNldEhhc0ZpeGVkV2lkdGhDZWxsKCk7Ci0gICAgfQotCi0g
ICAgaWYgKGlzSW5OZXdSb3cpCi0gICAgICAgIG1fcm93cy5hZGRSb3coY2VsbEJveC5wYXJlbnQo
KSk7Ci0KLSAgICBtX2NlbGxzLmFkZChXVEZNb3ZlKGNlbGwpKTsKLX0KLQotdm9pZCBUYWJsZUdy
aWQ6Omluc2VydENlbGwoY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94LCBjb25zdCBDb250YWlu
ZXJCb3gmIGJlZm9yZSkKLXsKLSAgICBVTlVTRURfUEFSQU0oY2VsbEJveCk7Ci0gICAgVU5VU0VE
X1BBUkFNKGJlZm9yZSk7Ci19Ci0KLXZvaWQgVGFibGVHcmlkOjpyZW1vdmVDZWxsKGNvbnN0IENv
bnRhaW5lckJveCYgY2VsbEJveCkKLXsKLSAgICBVTlVTRURfUEFSQU0oY2VsbEJveCk7Ci19Ci0K
LX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9y
bWF0dGluZy9UYWJsZUdyaWQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRp
bmcvVGFibGVHcmlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNWEzZjQ0YmY2
MjIxY2U0NjUyNTk0MDkxM2VjZTEwYjA2YWFjZWYuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGlu
Zy9UYWJsZUdyaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
LSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0g
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8K
LQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkK
LQotI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiTGF5b3V0VW5pdHMu
aCIKLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4K
LSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotI2luY2x1ZGUgPHd0Zi9MaXN0SGFz
aFNldC5oPgotI2luY2x1ZGUgPHd0Zi9XZWFrUHRyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsK
LW5hbWVzcGFjZSBMYXlvdXQgewotY2xhc3MgQm94OwotY2xhc3MgQ29udGFpbmVyQm94OwotCi1j
bGFzcyBUYWJsZUdyaWQgewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVHcmlkKTsK
LXB1YmxpYzoKLSAgICBUYWJsZUdyaWQoKTsKLQotICAgIHZvaWQgYXBwZW5kQ2VsbChjb25zdCBD
b250YWluZXJCb3gmKTsKLSAgICB2b2lkIGluc2VydENlbGwoY29uc3QgQ29udGFpbmVyQm94Jiwg
Y29uc3QgQ29udGFpbmVyQm94JiBiZWZvcmUpOwotICAgIHZvaWQgcmVtb3ZlQ2VsbChjb25zdCBD
b250YWluZXJCb3gmKTsKLQotICAgIHZvaWQgc2V0SG9yaXpvbnRhbFNwYWNpbmcoTGF5b3V0VW5p
dCBob3Jpem9udGFsU3BhY2luZykgeyBtX2hvcml6b250YWxTcGFjaW5nID0gaG9yaXpvbnRhbFNw
YWNpbmc7IH0KLSAgICBMYXlvdXRVbml0IGhvcml6b250YWxTcGFjaW5nKCkgY29uc3QgeyByZXR1
cm4gbV9ob3Jpem9udGFsU3BhY2luZzsgfQotCi0gICAgdm9pZCBzZXRWZXJ0aWNhbFNwYWNpbmco
TGF5b3V0VW5pdCB2ZXJ0aWNhbFNwYWNpbmcpIHsgbV92ZXJ0aWNhbFNwYWNpbmcgPSB2ZXJ0aWNh
bFNwYWNpbmc7IH0KLSAgICBMYXlvdXRVbml0IHZlcnRpY2FsU3BhY2luZygpIGNvbnN0IHsgcmV0
dXJuIG1fdmVydGljYWxTcGFjaW5nOyB9Ci0KLSAgICB2b2lkIHNldENvbGxhcHNlZEJvcmRlcihj
b25zdCBFZGdlcyYgY29sbGFwc2VkQm9yZGVyKSB7IG1fY29sbGFwc2VkQm9yZGVyID0gY29sbGFw
c2VkQm9yZGVyOyB9Ci0gICAgT3B0aW9uYWw8RWRnZXM+IGNvbGxhcHNlZEJvcmRlcigpIGNvbnN0
IHsgcmV0dXJuIG1fY29sbGFwc2VkQm9yZGVyOyB9Ci0KLSAgICB2b2lkIHNldFdpZHRoQ29uc3Ry
YWludHMoRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cykgeyBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBpbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzOyB9Ci0gICAgT3B0aW9uYWw8Rm9ybWF0dGluZ0NvbnRleHQ6
OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM+IHdpZHRoQ29uc3RyYWludHMoKSBjb25zdCB7IHJl
dHVybiBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7IH0KLQotICAgIGJvb2wgaXNFbXB0eSgp
IGNvbnN0IHsgcmV0dXJuIG1fc2xvdE1hcC5pc0VtcHR5KCk7IH0KLSAgICAvLyBDb2x1bW4gcmVw
cmVzZW50cyBhIHZlcnRpY2FsIHNldCBvZiBzbG90cyBpbiB0aGUgZ3JpZC4gQSBjb2x1bW4gaGFz
IGhvcml6b250YWwgcG9zaXRpb24gYW5kIHdpZHRoLgotICAgIGNsYXNzIENvbHVtbiB7Ci0gICAg
cHVibGljOgotICAgICAgICBDb2x1bW4oY29uc3QgQ29udGFpbmVyQm94Kik7Ci0KLSAgICAgICAg
dm9pZCBzZXRMb2dpY2FsTGVmdChMYXlvdXRVbml0KTsKLSAgICAgICAgTGF5b3V0VW5pdCBsb2dp
Y2FsTGVmdCgpIGNvbnN0OwotICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0
IHsgcmV0dXJuIGxvZ2ljYWxMZWZ0KCkgKyBsb2dpY2FsV2lkdGgoKTsgfQotICAgICAgICB2b2lk
IHNldExvZ2ljYWxXaWR0aChMYXlvdXRVbml0KTsKLSAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2Fs
V2lkdGgoKSBjb25zdDsKLQotICAgICAgICBib29sIGlzRml4ZWRXaWR0aCgpIGNvbnN0OwotCi0g
ICAgICAgIHZvaWQgc2V0SGFzRml4ZWRXaWR0aENlbGwoKSB7IG1faGFzRml4ZWRXaWR0aENlbGwg
PSB0cnVlOyB9Ci0gICAgICAgIGNvbnN0IENvbnRhaW5lckJveCogYm94KCkgY29uc3QgeyByZXR1
cm4gbV9sYXlvdXRCb3guZ2V0KCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgaGFz
Rml4ZWRXaWR0aENlbGwoKSBjb25zdCB7IHJldHVybiBtX2hhc0ZpeGVkV2lkdGhDZWxsOyB9Ci0K
LSAgICAgICAgTGF5b3V0VW5pdCBtX2NvbXB1dGVkTG9naWNhbFdpZHRoOwotICAgICAgICBMYXlv
dXRVbml0IG1fY29tcHV0ZWRMb2dpY2FsTGVmdDsKLSAgICAgICAgV2Vha1B0cjxjb25zdCBDb250
YWluZXJCb3g+IG1fbGF5b3V0Qm94OwotICAgICAgICBib29sIG1faGFzRml4ZWRXaWR0aENlbGwg
eyBmYWxzZSB9OwotCi0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICAgICAgYm9vbCBtX2hhc0NvbXB1
dGVkV2lkdGggeyBmYWxzZSB9OwotICAgICAgICBib29sIG1faGFzQ29tcHV0ZWRMZWZ0IHsgZmFs
c2UgfTsKLSNlbmRpZgotICAgIH07Ci0KLSAgICBjbGFzcyBDb2x1bW5zIHsKLSAgICBwdWJsaWM6
Ci0gICAgICAgIHVzaW5nIENvbHVtbkxpc3QgPSBWZWN0b3I8Q29sdW1uPjsKLSAgICAgICAgQ29s
dW1uTGlzdCYgbGlzdCgpIHsgcmV0dXJuIG1fY29sdW1uTGlzdDsgfQotICAgICAgICBjb25zdCBD
b2x1bW5MaXN0JiBsaXN0KCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0OyB9Ci0gICAgICAg
IHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0LnNpemUoKTsgfQotCi0g
ICAgICAgIHZvaWQgYWRkQ29sdW1uKGNvbnN0IENvbnRhaW5lckJveCYpOwotICAgICAgICB2b2lk
IGFkZEFub255bW91c0NvbHVtbigpOwotCi0gICAgICAgIExheW91dFVuaXQgbG9naWNhbFdpZHRo
KCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0Lmxhc3QoKS5sb2dpY2FsUmlnaHQoKSAtIG1f
Y29sdW1uTGlzdC5maXJzdCgpLmxvZ2ljYWxMZWZ0KCk7IH0KLSAgICAgICAgYm9vbCBoYXNGaXhl
ZENvbHVtbnNPbmx5KCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBDb2x1bW5MaXN0
IG1fY29sdW1uTGlzdDsKLSAgICB9OwotCi0gICAgY2xhc3MgUm93IHsKLSAgICBwdWJsaWM6Ci0g
ICAgICAgIFJvdyhjb25zdCBDb250YWluZXJCb3gmKTsKLQotICAgICAgICB2b2lkIHNldExvZ2lj
YWxUb3AoTGF5b3V0VW5pdCBsb2dpY2FsVG9wKSB7IG1fbG9naWNhbFRvcCA9IGxvZ2ljYWxUb3A7
IH0KLSAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbV9sb2dp
Y2FsVG9wOyB9Ci0gICAgICAgIExheW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0IHsgcmV0
dXJuIGxvZ2ljYWxUb3AoKSArIGxvZ2ljYWxIZWlnaHQoKTsgfQotCi0gICAgICAgIHZvaWQgc2V0
TG9naWNhbEhlaWdodChMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQpIHsgbV9sb2dpY2FsSGVpZ2h0
ID0gbG9naWNhbEhlaWdodDsgfQotICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQoKSBj
b25zdCB7IHJldHVybiBtX2xvZ2ljYWxIZWlnaHQ7IH0KLQotICAgICAgICB2b2lkIHNldEJhc2Vs
aW5lKElubGluZUxheW91dFVuaXQgYmFzZWxpbmUpIHsgbV9iYXNlbGluZSA9IGJhc2VsaW5lOyB9
Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgYmFzZWxpbmUoKSBjb25zdCB7IHJldHVybiBtX2Jh
c2VsaW5lOyB9Ci0KLSAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25zdCB7IHJl
dHVybiAqbV9sYXlvdXRCb3guZ2V0KCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIExheW91
dFVuaXQgbV9sb2dpY2FsVG9wOwotICAgICAgICBMYXlvdXRVbml0IG1fbG9naWNhbEhlaWdodDsK
LSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OwotICAgICAgICBXZWFr
UHRyPGNvbnN0IENvbnRhaW5lckJveD4gbV9sYXlvdXRCb3g7Ci0gICAgfTsKLQotICAgIGNsYXNz
IFJvd3MgewotICAgIHB1YmxpYzoKLSAgICAgICAgdXNpbmcgUm93TGlzdCA9IFZlY3RvcjxSb3c+
OwotICAgICAgICBSb3dMaXN0JiBsaXN0KCkgeyByZXR1cm4gbV9yb3dMaXN0OyB9Ci0gICAgICAg
IGNvbnN0IFJvd0xpc3QmIGxpc3QoKSBjb25zdCB7IHJldHVybiBtX3Jvd0xpc3Q7IH0KLQotICAg
ICAgICB2b2lkIGFkZFJvdyhjb25zdCBDb250YWluZXJCb3gmKTsKLQotICAgICAgICBzaXplX3Qg
c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcm93TGlzdC5zaXplKCk7IH0KLQotICAgIHByaXZhdGU6
Ci0gICAgICAgIFJvd0xpc3QgbV9yb3dMaXN0OwotICAgIH07Ci0KLSAgICAvLyBDZWxsIHJlcHJl
c2VudHMgYSA8dGQ+IG9yIDx0aD4uIEl0IGNhbiBzcGFuIG11bHRpcGxlIHNsb3RzIGluIHRoZSBn
cmlkLgotICAgIGNsYXNzIENlbGwgOiBwdWJsaWMgQ2FuTWFrZVdlYWtQdHI8Q2VsbD4gewotICAg
ICAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lOTElORShDZWxsKTsKLSAgICBwdWJsaWM6Ci0g
ICAgICAgIENlbGwoY29uc3QgQ29udGFpbmVyQm94JiwgU2xvdFBvc2l0aW9uLCBDZWxsU3Bhbik7
Ci0KLSAgICAgICAgc2l6ZV90IHN0YXJ0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlv
bi5jb2x1bW47IH0KLSAgICAgICAgc2l6ZV90IGVuZENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1f
cG9zaXRpb24uY29sdW1uICsgbV9zcGFuLmNvbHVtbjsgfQotCi0gICAgICAgIHNpemVfdCBzdGFy
dFJvdygpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb24ucm93OyB9Ci0gICAgICAgIHNpemVfdCBl
bmRSb3coKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aW9uLnJvdyArIG1fc3Bhbi5yb3c7IH0KLQot
ICAgICAgICBzaXplX3QgY29sdW1uU3BhbigpIGNvbnN0IHsgcmV0dXJuIG1fc3Bhbi5jb2x1bW47
IH0KLSAgICAgICAgc2l6ZV90IHJvd1NwYW4oKSBjb25zdCB7IHJldHVybiBtX3NwYW4ucm93OyB9
Ci0KLSAgICAgICAgU2xvdFBvc2l0aW9uIHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9wb3Np
dGlvbjsgfQotICAgICAgICBDZWxsU3BhbiBzcGFuKCkgY29uc3QgeyByZXR1cm4gbV9zcGFuOyB9
Ci0KLSAgICAgICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKSB7
IG1fYmFzZWxpbmUgPSBiYXNlbGluZTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJhc2Vs
aW5lKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlbGluZTsgfQotCi0gICAgICAgIGJvb2wgaXNGaXhl
ZFdpZHRoKCkgY29uc3Q7Ci0KLSAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25z
dCB7IHJldHVybiAqbV9sYXlvdXRCb3guZ2V0KCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAg
IFdlYWtQdHI8Y29uc3QgQ29udGFpbmVyQm94PiBtX2xheW91dEJveDsKLSAgICAgICAgU2xvdFBv
c2l0aW9uIG1fcG9zaXRpb247Ci0gICAgICAgIENlbGxTcGFuIG1fc3BhbjsKLSAgICAgICAgSW5s
aW5lTGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OwotICAgIH07Ci0KLSAgICBjbGFzcyBTbG90
IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFdURl9NQUtFX1NUUlVDVF9GQVNUX0FMTE9DQVRFRDsK
LSAgICAgICAgU2xvdCgpID0gZGVmYXVsdDsKLSAgICAgICAgU2xvdChDZWxsJiwgYm9vbCBpc0Nv
bHVtblNwYW5uZWQsIGJvb2wgaXNSb3dTcGFubmVkKTsKLQotICAgICAgICBjb25zdCBDZWxsJiBj
ZWxsKCkgY29uc3QgeyByZXR1cm4gKm1fY2VsbDsgfQotICAgICAgICBDZWxsJiBjZWxsKCkgeyBy
ZXR1cm4gKm1fY2VsbDsgfQotCi0gICAgICAgIGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzJiB3aWR0aENvbnN0cmFpbnRzKCkgY29uc3QgeyByZXR1cm4g
bV93aWR0aENvbnN0cmFpbnRzOyB9Ci0gICAgICAgIHZvaWQgc2V0V2lkdGhDb25zdHJhaW50cyhj
b25zdCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgd2lkdGhD
b25zdHJhaW50cykgeyBtX3dpZHRoQ29uc3RyYWludHMgPSB3aWR0aENvbnN0cmFpbnRzOyB9Ci0K
LSAgICAgICAgLy8gSW5pdGlhbCBzbG90IHBvc2l0aW9uIGZvciBhIHNwYW5uaW5nIGNlbGwuCi0g
ICAgICAgIC8vIDx0ZD48L3RkPjx0ZCBjb2xzcGFuPTI+PC90ZD4gWzEsIDBdIHNsb3QgaGFzIGNv
bHVtbiBzcGFuIG9mIDIuCi0gICAgICAgIGJvb2wgaGFzQ29sdW1uU3BhbigpIGNvbnN0IHsgcmV0
dXJuIG1fY2VsbC0+Y29sdW1uU3BhbigpID4gMSAmJiAhaXNDb2x1bW5TcGFubmVkKCk7IH0KLSAg
ICAgICAgYm9vbCBoYXNSb3dTcGFuKCkgY29uc3QgeyByZXR1cm4gbV9jZWxsLT5yb3dTcGFuKCkg
PiAxICYmICFpc1Jvd1NwYW5uZWQoKTsgfQotCi0gICAgICAgIC8vIE5vbi1pbml0aWFsIHNwYW5u
ZWQgc2xvdC4KLSAgICAgICAgLy8gPHRkPjwvdGQ+PHRkIGNvbHNwYW49Mj48L3RkPiBbMiwgMF0g
c2xvdCBpcyBjb2x1bW4gc3Bhbm5lZCBieSBbMSwgMF0uCi0gICAgICAgIC8vIDx0ZD48L3RkPjx0
ZD48L3RkPjx0ZD48L3RkPgotICAgICAgICBib29sIGlzQ29sdW1uU3Bhbm5lZCgpIGNvbnN0IHsg
cmV0dXJuIG1faXNDb2x1bW5TcGFubmVkOyB9Ci0gICAgICAgIGJvb2wgaXNSb3dTcGFubmVkKCkg
Y29uc3QgeyByZXR1cm4gbV9pc1Jvd1NwYW5uZWQ7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAg
IFdlYWtQdHI8Q2VsbD4gbV9jZWxsOwotICAgICAgICBib29sIG1faXNDb2x1bW5TcGFubmVkIHsg
ZmFsc2UgfTsKLSAgICAgICAgYm9vbCBtX2lzUm93U3Bhbm5lZCB7IGZhbHNlIH07Ci0gICAgICAg
IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIG1fd2lkdGhDb25z
dHJhaW50czsKLSAgICB9OwotCi0gICAgY29uc3QgQ29sdW1ucyYgY29sdW1ucygpIGNvbnN0IHsg
cmV0dXJuIG1fY29sdW1uczsgfQotICAgIENvbHVtbnMmIGNvbHVtbnMoKSB7IHJldHVybiBtX2Nv
bHVtbnM7IH0KLQotICAgIGNvbnN0IFJvd3MmIHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3M7
IH0KLSAgICBSb3dzJiByb3dzKCkgeyByZXR1cm4gbV9yb3dzOyB9Ci0KLSAgICB1c2luZyBDZWxs
cyA9IFdURjo6TGlzdEhhc2hTZXQ8c3RkOjp1bmlxdWVfcHRyPENlbGw+PjsKLSAgICBDZWxscyYg
Y2VsbHMoKSB7IHJldHVybiBtX2NlbGxzOyB9Ci0KLSAgICBTbG90KiBzbG90KFNsb3RQb3NpdGlv
bik7Ci0gICAgY29uc3QgU2xvdCogc2xvdChTbG90UG9zaXRpb24gcG9zaXRpb24pIGNvbnN0IHsg
cmV0dXJuIG1fc2xvdE1hcC5nZXQocG9zaXRpb24pOyB9Ci0gICAgYm9vbCBpc1NwYW5uZWQoU2xv
dFBvc2l0aW9uKTsKLQotcHJpdmF0ZToKLSAgICB1c2luZyBTbG90TWFwID0gV1RGOjpIYXNoTWFw
PFNsb3RQb3NpdGlvbiwgc3RkOjp1bmlxdWVfcHRyPFNsb3Q+PjsKLQotICAgIENvbHVtbnMgbV9j
b2x1bW5zOwotICAgIFJvd3MgbV9yb3dzOwotICAgIENlbGxzIG1fY2VsbHM7Ci0gICAgU2xvdE1h
cCBtX3Nsb3RNYXA7Ci0KLSAgICBMYXlvdXRVbml0IG1faG9yaXpvbnRhbFNwYWNpbmc7Ci0gICAg
TGF5b3V0VW5pdCBtX3ZlcnRpY2FsU3BhY2luZzsKLSAgICBPcHRpb25hbDxGb3JtYXR0aW5nQ29u
dGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cz4gbV9pbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzOwotICAgIE9wdGlvbmFsPEVkZ2VzPiBtX2NvbGxhcHNlZEJvcmRlcjsKLX07Ci0KLX0KLX0K
LQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0
aW5nL1RhYmxlTGF5b3V0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRp
bmcvVGFibGVMYXlvdXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM1MmM1
YTE3ZjhjMGIzZDNkMjQ0ZTkyNWE3ZWYyNDgxOThhOGQzLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1h
dHRpbmcvVGFibGVMYXlvdXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgot
ICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5n
Q29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNp
bmNsdWRlICJMYXlvdXRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgotCi1u
YW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotLy8gaHR0cHM6Ly93d3cu
dzMub3JnL1RSL2Nzcy10YWJsZXMtMy8jdGFibGUtbGF5b3V0LWFsZ29yaXRobQotVGFibGVGb3Jt
YXR0aW5nQ29udGV4dDo6VGFibGVMYXlvdXQ6OlRhYmxlTGF5b3V0KGNvbnN0IFRhYmxlRm9ybWF0
dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0LCBjb25zdCBUYWJsZUdyaWQmIGdyaWQpCi0g
ICAgOiBtX2Zvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0KQotICAgICwgbV9ncmlk
KGdyaWQpCi17Ci19Ci0KLXN0cnVjdCBDb2x1bW5TcGFuIHsKLSAgICBzdGF0aWMgc2l6ZV90IGhh
c1NwYW4oY29uc3QgVGFibGVHcmlkOjpTbG90JiBzbG90KSB7IHJldHVybiBzbG90Lmhhc0NvbHVt
blNwYW4oKTsgfQotICAgIHN0YXRpYyBzaXplX3QgaXNTcGFubmVkKGNvbnN0IFRhYmxlR3JpZDo6
U2xvdCYgc2xvdCkgeyByZXR1cm4gc2xvdC5pc0NvbHVtblNwYW5uZWQoKTsgfQotCi0gICAgc3Rh
dGljIHNpemVfdCBzcGFuQ291bnQoY29uc3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVy
biBjZWxsLmNvbHVtblNwYW4oKTsgfQotICAgIHN0YXRpYyBzaXplX3Qgc3RhcnRTcGFuKGNvbnN0
IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5zdGFydENvbHVtbigpOyB9Ci0g
ICAgc3RhdGljIHNpemVfdCBlbmRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyBy
ZXR1cm4gY2VsbC5lbmRDb2x1bW4oKTsgfQotCi0gICAgc3RhdGljIHNpemVfdCBpbmRleChzaXpl
X3QgY29sdW1uSW5kZXgsIHNpemVfdCAvKnJvd0luZGV4Ki8pIHsgcmV0dXJuIGNvbHVtbkluZGV4
OyB9Ci0gICAgc3RhdGljIHNpemVfdCBzaXplKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1
cm4gZ3JpZC5jb2x1bW5zKCkuc2l6ZSgpOyB9Ci0KLSAgICBzdGF0aWMgTGF5b3V0VW5pdCBzcGFj
aW5nKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5ob3Jpem9udGFsU3BhY2lu
ZygpOyB9Ci19OwotCi1zdHJ1Y3QgUm93U3BhbiB7Ci0gICAgc3RhdGljIHNpemVfdCBoYXNTcGFu
KGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCkgeyByZXR1cm4gc2xvdC5oYXNSb3dTcGFuKCk7
IH0KLSAgICBzdGF0aWMgc2l6ZV90IGlzU3Bhbm5lZChjb25zdCBUYWJsZUdyaWQ6OlNsb3QmIHNs
b3QpIHsgcmV0dXJuIHNsb3QuaXNSb3dTcGFubmVkKCk7IH0KLQotICAgIHN0YXRpYyBzaXplX3Qg
c3BhbkNvdW50KGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5yb3dT
cGFuKCk7IH0KLSAgICBzdGF0aWMgc2l6ZV90IHN0YXJ0U3Bhbihjb25zdCBUYWJsZUdyaWQ6OkNl
bGwmIGNlbGwpIHsgcmV0dXJuIGNlbGwuc3RhcnRSb3coKTsgfQotICAgIHN0YXRpYyBzaXplX3Qg
ZW5kU3Bhbihjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJuIGNlbGwuZW5kUm93
KCk7IH0KLQotICAgIHN0YXRpYyBzaXplX3QgaW5kZXgoc2l6ZV90IC8qY29sdW1uSW5kZXgqLywg
c2l6ZV90IHJvd0luZGV4KSB7IHJldHVybiByb3dJbmRleDsgfQotICAgIHN0YXRpYyBzaXplX3Qg
c2l6ZShjb25zdCBUYWJsZUdyaWQmIGdyaWQpIHsgcmV0dXJuIGdyaWQucm93cygpLnNpemUoKTsg
fQotCi0gICAgc3RhdGljIExheW91dFVuaXQgc3BhY2luZyhjb25zdCBUYWJsZUdyaWQmIGdyaWQp
IHsgcmV0dXJuIGdyaWQudmVydGljYWxTcGFjaW5nKCk7IH0KLX07Ci0KLXN0cnVjdCBHcmlkU3Bh
Y2UgewotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICF2YWx1ZTsgfQotCi0gICAg
Ly8gSW5pdGlhbCB3aWR0aC9oZWlnaHQgZm9yIGNvbHVtbi9yb3cgd2Ugc3RhcnQgdGhlIGRpc3Ry
aWJ1dGlvbiB3aWR0aCAodXN1YWxseSBhIG1pbnVtdW0gd2lkdGgpLgotICAgIGZsb2F0IHZhbHVl
IHsgMCB9OwotICAgIC8vIFRoZSBiYXNlIHRvIGNvbXB1dGUgdGhlIGRpc3RyaWJ1dGlvbiByYXRp
by4gSXQgbm9ybWFsbHkgbWF0Y2hlcyB0aGUgW3ZhbHVlXSBidXQgaW4gc29tZSBjYXNlcyB3ZSB1
c2UgdGhlIG1heGltdW0gdmFsdWUgdG8gZGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UuIAotICAg
IGZsb2F0IGRpc3RyaWJ1dGlvbkJhc2UgeyAwIH07Ci19OwotCi1pbmxpbmUgc3RhdGljIEdyaWRT
cGFjZSBtYXgoY29uc3QgR3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCi17Ci0gICAg
cmV0dXJuIHsgc3RkOjptYXgoYS52YWx1ZSwgYi52YWx1ZSksIHN0ZDo6bWF4KGEuZGlzdHJpYnV0
aW9uQmFzZSwgYi5kaXN0cmlidXRpb25CYXNlKSB9OwotfQotCi1pbmxpbmUgc3RhdGljIEdyaWRT
cGFjZSYgb3BlcmF0b3ItKEdyaWRTcGFjZSYgYSwgY29uc3QgR3JpZFNwYWNlJiBiKQotewotICAg
IGEudmFsdWUgPSBzdGQ6Om1heCgwLjBmLCBhLnZhbHVlIC0gYi52YWx1ZSk7Ci0gICAgYS5kaXN0
cmlidXRpb25CYXNlID0gc3RkOjptYXgoMC4wZiwgYS5kaXN0cmlidXRpb25CYXNlIC0gYi5kaXN0
cmlidXRpb25CYXNlKTsKLSAgICByZXR1cm4gYTsKLX0KLQotaW5saW5lIHN0YXRpYyBHcmlkU3Bh
Y2UmIG9wZXJhdG9yKz0oR3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCi17Ci0gICAg
YS52YWx1ZSArPSBiLnZhbHVlOwotICAgIGEuZGlzdHJpYnV0aW9uQmFzZSArPSBiLmRpc3RyaWJ1
dGlvbkJhc2U7Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLWlubGluZSBzdGF0aWMgR3JpZFNwYWNlJiBv
cGVyYXRvci09KEdyaWRTcGFjZSYgYSwgY29uc3QgR3JpZFNwYWNlJiBiKQotewotICAgIHJldHVy
biBhIC0gYjsKLX0KLQotaW5saW5lIHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJhdG9yLyhHcmlkU3Bh
Y2UmIGEsIHVuc2lnbmVkIHZhbHVlKQotewotICAgIGEudmFsdWUgLz0gdmFsdWU7Ci0gICAgYS5k
aXN0cmlidXRpb25CYXNlIC89IHZhbHVlOwotICAgIHJldHVybiBhOwotfQotCi10ZW1wbGF0ZSA8
dHlwZW5hbWUgU3BhblR5cGU+Ci1zdGF0aWMgVmVjdG9yPExheW91dFVuaXQ+IGRpc3RyaWJ1dGVB
dmFpbGFibGVTcGFjZShjb25zdCBUYWJsZUdyaWQmIGdyaWQsIExheW91dFVuaXQgYXZhaWxhYmxl
U3BhY2UsIGNvbnN0IFdURjo6RnVuY3Rpb248R3JpZFNwYWNlKGNvbnN0IFRhYmxlR3JpZDo6U2xv
dCYsIHNpemVfdCk+JiBzbG90U3BhY2UpCi17Ci0gICAgc3RydWN0IFJlc29sdmVkSXRlbSB7Ci0g
ICAgICAgIEdyaWRTcGFjZSBzbG90U3BhY2U7Ci0gICAgICAgIGJvb2wgaXNGaXhlZCB7IGZhbHNl
IH07Ci0gICAgfTsKLQotICAgIGF1dG8mIGNvbHVtbnMgPSBncmlkLmNvbHVtbnMoKTsKLSAgICBh
dXRvJiByb3dzID0gZ3JpZC5yb3dzKCk7Ci0gICAgLy8gMS4gQ29sbGVjdCB0aGUgbm9uLXNwYW5u
aW5nIHNwYWNlcyBmaXJzdC4gVGhleSBhcmUgdXNlZCBmb3IgdGhlIGZpbmFsIGRpc3RyaWJ1dGlv
biBhcyB3ZWxsIGFzIGZvciBkaXN0cmlidXRpbmcgdGhlIHNwYW5uaW5nIHNwYWNlLgotICAgIFZl
Y3RvcjxPcHRpb25hbDxSZXNvbHZlZEl0ZW0+PiByZXNvbHZlZEl0ZW1zKFNwYW5UeXBlOjpzaXpl
KGdyaWQpKTsKLSAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwg
Y29sdW1ucy5zaXplKCk7ICsrY29sdW1uSW5kZXgpIHsKLSAgICAgICAgZm9yIChzaXplX3Qgcm93
SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7Ci0gICAgICAg
ICAgICBhdXRvJiBzbG90ID0gKmdyaWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsK
LSAgICAgICAgICAgIGlmIChTcGFuVHlwZTo6aGFzU3BhbihzbG90KSB8fCBTcGFuVHlwZTo6aXNT
cGFubmVkKHNsb3QpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYXV0
byBpbmRleCA9IFNwYW5UeXBlOjppbmRleChjb2x1bW5JbmRleCwgcm93SW5kZXgpOwotICAgICAg
ICAgICAgaWYgKCFyZXNvbHZlZEl0ZW1zW2luZGV4XSkKLSAgICAgICAgICAgICAgICByZXNvbHZl
ZEl0ZW1zW2luZGV4XSA9IFJlc29sdmVkSXRlbSB7IH07Ci0gICAgICAgICAgICByZXNvbHZlZEl0
ZW1zW2luZGV4XS0+c2xvdFNwYWNlID0gbWF4KHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90U3Bh
Y2UsIHNsb3RTcGFjZShzbG90LCBpbmRleCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8g
Mi4gQ29sbGVjdCB0aGUgc3Bhbm5pbmcgY2VsbHMuCi0gICAgc3RydWN0IFNwYW5uaW5nQ2VsbCB7
Ci0gICAgICAgIFNsb3RQb3NpdGlvbiBwb3NpdGlvbjsKLSAgICAgICAgR3JpZFNwYWNlIHVucmVz
b2x2ZWRTcGFjZTsKLSAgICB9OwotICAgIFZlY3RvcjxTcGFubmluZ0NlbGw+IHNwYW5uaW5nQ2Vs
bHM7Ci0gICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgp
OyArK3Jvd0luZGV4KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29s
dW1uSW5kZXggPCBjb2x1bW5zLnNpemUoKTsgKytjb2x1bW5JbmRleCkgewotICAgICAgICAgICAg
YXV0byYgc2xvdCA9ICpncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAg
ICAgICAgICBpZiAoU3BhblR5cGU6Omhhc1NwYW4oc2xvdCkpCi0gICAgICAgICAgICAgICAgc3Bh
bm5pbmdDZWxscy5hcHBlbmQoeyB7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9LCBzbG90U3BhY2Uo
c2xvdCwgU3BhblR5cGU6OmluZGV4KGNvbHVtbkluZGV4LCByb3dJbmRleCkpIH0pOwotICAgICAg
ICB9Ci0gICAgfQotICAgIC8vIFdlIG5lZWQgdGhlc2Ugc3Bhbm5pbmcgY2VsbHMgaW4gdGhlIG9y
ZGVyIG9mIHRoZSBudW1iZXIgb2YgY29sdW1ucy9yb3dzIHRoZXkgc3BhbiBzbyB0aGF0Ci0gICAg
Ly8gd2UgY2FuIHJlc29sdmUgb3ZlcmxhcHBpbmcgc3BhbnMgc3RhcnRpbmcgd2l0aCB0aGUgc2hv
cnRlciBvbmVzIGUuZy4KLSAgICAvLyA8dGQgY29sc3Bhbj00PiNhPC90ZD48dGQ+I2I8L3RkPgot
ICAgIC8vIDx0ZCBjb2xzcGFuPTI+I2M8L3RkPjx0ZCBjb2xzcGFuPTM+I2Q8L3RkPgotICAgIHN0
ZDo6c29ydChzcGFubmluZ0NlbGxzLmJlZ2luKCksIHNwYW5uaW5nQ2VsbHMuZW5kKCksIFsmXSAo
YXV0byYgYSwgYXV0byYgYikgewotICAgICAgICByZXR1cm4gU3BhblR5cGU6OnNwYW5Db3VudChn
cmlkLnNsb3QoYS5wb3NpdGlvbiktPmNlbGwoKSkgPCBTcGFuVHlwZTo6c3BhbkNvdW50KGdyaWQu
c2xvdChiLnBvc2l0aW9uKS0+Y2VsbCgpKTsKLSAgICB9KTsKLQotICAgIC8vIDMuIERpc3RyaWJ1
dGUgdGhlIHNwYW5uaW5nIGNlbGxzJyBtaW1pbXVtIHNwYWNlIGFjcm9zcyB0aGUgY29sdW1ucy9y
b3dzIHVzaW5nIHRoZSBub24tc3Bhbm5pbmcgc3BhY2VzLgotICAgIC8vIGUuZy4gWyAxIF1bIDUg
XVsgMSBdCi0gICAgLy8gICAgICBbICAgIDkgICBdWyAxIF0KLSAgICAvLyBUaGUgaW5pdGlhbCB3
aWR0aHMgYXJlOiBbIDIgXVsgNyBdWyAxIF0KLSAgICBmb3IgKGF1dG8gc3Bhbm5pbmdDZWxsIDog
c3Bhbm5pbmdDZWxscykgewotICAgICAgICBhdXRvJiBjZWxsID0gZ3JpZC5zbG90KHNwYW5uaW5n
Q2VsbC5wb3NpdGlvbiktPmNlbGwoKTsKLSAgICAgICAgYXV0byB1bnJlc29sdmVkU3Bhbm5pbmdT
cGFjZSA9IHNwYW5uaW5nQ2VsbC51bnJlc29sdmVkU3BhY2U7Ci0gICAgICAgIGlmICghcmVzb2x2
ZWRJdGVtc1tTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpXSB8fCAhcmVzb2x2ZWRJdGVtc1tTcGFu
VHlwZTo6ZW5kU3BhbihjZWxsKSAtIDFdKSB7Ci0gICAgICAgICAgICAvLyA8dGQgY29sc3Bhbj00
PiNhPC90ZD48dGQ+I2I8L3RkPgotICAgICAgICAgICAgLy8gPHRkIGNvbHNwYW49Mj4jYzwvdGQ+
PHRkIGNvbHNwYW49Mz4jZDwvdGQ+Ci0gICAgICAgICAgICAvLyBVbnJlc29sdmVkIGNvbHVtbnMg
YXJlOiAxIDIgMyA0Ci0gICAgICAgICAgICAvLyAxLiBUYWtlIGNvbHNwYW49MiAoc2hvcnRlc3Qg
c3BhbikgYW5kIHJlc29sdmUgY29sdW1uIDEgYW5kIDIKLSAgICAgICAgICAgIC8vIDIuIFRha2Ug
Y29sc3Bhbj0zIGFuZCByZXNvbHZlIGNvbHVtbiAzIGFuZCA0ICg1IGlzIHJlc29sdmVkIGJlY2F1
c2UgaXQgYWxyZWFkeSBoYXMgYSBub24tc3Bhbm5pbmcgY2VsbCkuCi0gICAgICAgICAgICAvLyAz
LiBjb2xzcGFuPTQgbmVlZHMgbm8gcmVzb2x2aW5nIGJlY2F1c2UgYWxsIHRoZSBzcGFubmVkIGNv
bHVtbnMgKDEgMiAzIDQpIGhhdmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkLgotICAgICAgICAgICAg
YXV0byB1bnJlc29sdmVkQ29sdW1uQ291bnQgPSBjZWxsLmNvbHVtblNwYW4oKTsKLSAgICAgICAg
ICAgIGZvciAoYXV0byBzcGFuSW5kZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpOyBzcGFu
SW5kZXggPCBTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5kZXgpIHsKLSAgICAgICAg
ICAgICAgICBpZiAoIXJlc29sdmVkSXRlbXNbc3BhbkluZGV4XSkKLSAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHVucmVzb2x2ZWRDb2x1bW5Db3Vu
dCk7Ci0gICAgICAgICAgICAgICAgLS11bnJlc29sdmVkQ29sdW1uQ291bnQ7Ci0gICAgICAgICAg
ICAgICAgdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UgLT0gcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhd
LT5zbG90U3BhY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBU1NFUlQodW5yZXNvbHZl
ZENvbHVtbkNvdW50KTsKLSAgICAgICAgICAgIGF1dG8gZXF1YWxTcGFjZUZvclNwYW5uZWRDb2x1
bW5zID0gdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UgLyB1bnJlc29sdmVkQ29sdW1uQ291bnQ7Ci0g
ICAgICAgICAgICBmb3IgKGF1dG8gc3BhbkluZGV4ID0gU3BhblR5cGU6OnN0YXJ0U3BhbihjZWxs
KTsgc3BhbkluZGV4IDwgU3BhblR5cGU6OmVuZFNwYW4oY2VsbCk7ICsrc3BhbkluZGV4KSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XSkKLSAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRJdGVtc1tzcGFuSW5k
ZXhdID0gUmVzb2x2ZWRJdGVtIHsgZXF1YWxTcGFjZUZvclNwYW5uZWRDb2x1bW5zLCBmYWxzZSB9
OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gMS4gQ29s
bGVjdCB0aGUgbm9uLXNwYW5pbmcgcmVzb2x2ZWQgc3BhY2VzLgotICAgICAgICAgICAgLy8gMi4g
RGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UgYW1vbmcgdGhlIHNwYW5uZWQgY29sdW1ucy9yb3dz
IGJhc2VkIG9uIHRoZSByZXNvbHZlZCBzcGFjZSB2YWx1ZXMuCi0gICAgICAgICAgICAvLyBlLmcu
IHNwYW5uaW5nIHdpZHRoOiBbICAgOSAgIF0uIFJlc29sdmVkIHdpZHRocyBmb3IgdGhlIHNwYW5u
ZWQgY29sdW1uczogWyAxIF0gWyAyIF0KLSAgICAgICAgICAgIC8vIE5ldyByZXNvbHZlZCB3aWR0
aHM6IFsgMyBdIFsgNiBdLgotICAgICAgICAgICAgYXV0byByZXNvbHZlZFNwYW5uaW5nU3BhY2Ug
PSBHcmlkU3BhY2UgeyB9OwotICAgICAgICAgICAgZm9yIChhdXRvIHNwYW5JbmRleCA9IFNwYW5U
eXBlOjpzdGFydFNwYW4oY2VsbCk7IHNwYW5JbmRleCA8IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwp
OyArK3NwYW5JbmRleCkKLSAgICAgICAgICAgICAgICByZXNvbHZlZFNwYW5uaW5nU3BhY2UgKz0g
cmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2U7Ci0gICAgICAgICAgICBpZiAocmVz
b2x2ZWRTcGFubmluZ1NwYWNlLnZhbHVlID49IHVucmVzb2x2ZWRTcGFubmluZ1NwYWNlLnZhbHVl
KSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNwYW5uaW5nIGNlbGwgZml0cyB0aGUgc3Bhbm5l
ZCBjb2x1bW5zL3Jvd3MganVzdCBmaW5lLiBOb3RoaW5nIHRvIGRpc3RyaWJ1dGUuCi0gICAgICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIHNwYWNp
bmcgPSBTcGFuVHlwZTo6c3BhY2luZyhncmlkKSAqIChTcGFuVHlwZTo6c3BhbkNvdW50KGNlbGwp
IC0gMSk7Ci0gICAgICAgICAgICBhdXRvIHNwYWNlVG9EaXN0cmlidXRlID0gdW5yZXNvbHZlZFNw
YW5uaW5nU3BhY2UgLSBHcmlkU3BhY2UgeyBzcGFjaW5nLCBzcGFjaW5nIH0gLSByZXNvbHZlZFNw
YW5uaW5nU3BhY2U7IAotICAgICAgICAgICAgaWYgKCFzcGFjZVRvRGlzdHJpYnV0ZS5pc0VtcHR5
KCkpIHsKLSAgICAgICAgICAgICAgICBhdXRvIGRpc3RyaWJ1dGlvblJhdGlvID0gc3BhY2VUb0Rp
c3RyaWJ1dGUuZGlzdHJpYnV0aW9uQmFzZSAvIHJlc29sdmVkU3Bhbm5pbmdTcGFjZS5kaXN0cmli
dXRpb25CYXNlOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byBzcGFuSW5kZXggPSBTcGFuVHlw
ZTo6c3RhcnRTcGFuKGNlbGwpOyBzcGFuSW5kZXggPCBTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsg
KytzcGFuSW5kZXgpCi0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkSXRlbXNbc3BhbkluZGV4
XS0+c2xvdFNwYWNlICs9IEdyaWRTcGFjZSB7IHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xv
dFNwYWNlLnZhbHVlICogZGlzdHJpYnV0aW9uUmF0aW8sIHJlc29sdmVkSXRlbXNbc3BhbkluZGV4
XS0+c2xvdFNwYWNlLmRpc3RyaWJ1dGlvbkJhc2UgKiBkaXN0cmlidXRpb25SYXRpb307Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gNC4gRGlzdHJpYnV0ZSB0aGUgZXh0
cmEgc3BhY2UgdXNpbmcgdGhlIGZpbmFsIHJlc29sdmVkIHdpZHRocy4KLSNpZiBBU1NFUlRfRU5B
QkxFRAotICAgIC8vIFdlIGhhdmUgdG8gaGF2ZSBhbGwgdGhlIHNwYWNlcyByZXNvbHZlZCBhdCB0
aGlzIHBvaW50LgotICAgIGZvciAoYXV0byYgcmVzb2x2ZWRJdGVtIDogcmVzb2x2ZWRJdGVtcykK
LSAgICAgICAgQVNTRVJUKHJlc29sdmVkSXRlbSk7Ci0jZW5kaWYKLSAgICAvLyBGaXhlZCBzaXpl
IGNlbGxzIGRvbid0IHBhcnRpY2lwYXRlIGluIGF2YWlsYWJsZSBzcGFjZSBkaXN0cmlidXRpb24u
Ci0gICAgYXV0byBhZGp1c3RhYmxlZFNwYWNlID0gR3JpZFNwYWNlIHsgfTsKLSAgICBmb3IgKGF1
dG8mIHJlc29sdmVkSXRlbSA6IHJlc29sdmVkSXRlbXMpIHsKLSAgICAgICAgaWYgKHJlc29sdmVk
SXRlbS0+aXNGaXhlZCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBhZGp1c3RhYmxl
ZFNwYWNlICs9IHJlc29sdmVkSXRlbS0+c2xvdFNwYWNlOwotICAgIH0KLQotICAgIFZlY3RvcjxM
YXlvdXRVbml0PiBkaXN0cmlidXRlZFNwYWNlcyhyZXNvbHZlZEl0ZW1zLnNpemUoKSk7Ci0gICAg
ZmxvYXQgc3BhY2VUb0Rpc3RyaWJ1dGUgPSBhdmFpbGFibGVTcGFjZSAtIGFkanVzdGFibGVkU3Bh
Y2UudmFsdWUgLSAoKHJlc29sdmVkSXRlbXMuc2l6ZSgpICsgMSkgKiBTcGFuVHlwZTo6c3BhY2lu
ZyhncmlkKSk7Ci0gICAgLy8gRXNzZW50aWFsbHkgdGhlIHJlbWFpbmluZyBzcGFjZSB0byBkaXN0
cmlidXRlIHNob3VsZCBuZXZlciBiZSBuZWdhdGl2ZS4gTGF5b3V0VW5pdDo6ZXBzaWxvbigpIGlz
IHJlcXVpcmVkIHRvIGNvbXBlbnNhdGUgZm9yIExheW91dFVuaXQncyBsb3cgcHJlY2lzaW9uLgot
ICAgIEFTU0VSVChzcGFjZVRvRGlzdHJpYnV0ZSA+PSAtTGF5b3V0VW5pdDo6ZXBzaWxvbigpICog
cmVzb2x2ZWRJdGVtcy5zaXplKCkpOwotICAgIC8vIERpc3RyaWJ1dGUgdGhlIGV4dHJhIHNwYWNl
IGJhc2VkIG9uIHRoZSByZXNvbHZlZCBzcGFjZXMuCi0gICAgYXV0byBkaXN0cmlidXRpb25SYXRp
byA9IHNwYWNlVG9EaXN0cmlidXRlIC8gYWRqdXN0YWJsZWRTcGFjZS5kaXN0cmlidXRpb25CYXNl
OwotICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCByZXNvbHZlZEl0ZW1zLnNpemUo
KTsgKytpbmRleCkgewotICAgICAgICBhdXRvIHNsb3RTcGFjZSA9IHJlc29sdmVkSXRlbXNbaW5k
ZXhdLT5zbG90U3BhY2UudmFsdWU7Ci0gICAgICAgIGF1dG8gbmVlZHNTcGFjZURpc3RyaWJ1dGlv
biA9IHNwYWNlVG9EaXN0cmlidXRlICYmICFyZXNvbHZlZEl0ZW1zW2luZGV4XS0+aXNGaXhlZDsK
LSAgICAgICAgZGlzdHJpYnV0ZWRTcGFjZXNbaW5kZXhdID0gTGF5b3V0VW5pdCB7IHNsb3RTcGFj
ZSB9OwotICAgICAgICBpZiAoIW5lZWRzU3BhY2VEaXN0cmlidXRpb24pCi0gICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgZGlzdHJpYnV0ZWRTcGFjZXNbaW5kZXhdICs9IExheW91dFVuaXQg
eyByZXNvbHZlZEl0ZW1zW2luZGV4XS0+c2xvdFNwYWNlLmRpc3RyaWJ1dGlvbkJhc2UgKiBkaXN0
cmlidXRpb25SYXRpbyB9OwotICAgIH0KLSAgICByZXR1cm4gZGlzdHJpYnV0ZWRTcGFjZXM7Ci19
Ci0KLVRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlTGF5b3V0OjpEaXN0cmlidXRlZFNwYWNl
cyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dDo6ZGlzdHJpYnV0ZWRIb3Jpem9u
dGFsU3BhY2UoTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpCi17Ci0gICAgZW51
bSBjbGFzcyBDb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UgeyBNaW5pbXVtV2lkdGgsIE1heGltdW1X
aWR0aCB9OwotICAgIGF1dG8gY29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlID0gYXZhaWxhYmxlSG9y
aXpvbnRhbFNwYWNlID49IG1fZ3JpZC53aWR0aENvbnN0cmFpbnRzKCktPm1heGltdW0gPyBDb2x1
bW5XaWR0aEJhbGFuY2luZ0Jhc2U6Ok1heGltdW1XaWR0aCA6IENvbHVtbldpZHRoQmFsYW5jaW5n
QmFzZTo6TWluaW11bVdpZHRoOwotICAgIHJldHVybiBkaXN0cmlidXRlQXZhaWxhYmxlU3BhY2U8
Q29sdW1uU3Bhbj4obV9ncmlkLCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UsIFsmXSAoY29uc3Qg
VGFibGVHcmlkOjpTbG90JiBzbG90LCBzaXplX3QgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgYXV0
byYgY29sdW1uID0gbV9ncmlkLmNvbHVtbnMoKS5saXN0KClbY29sdW1uSW5kZXhdOwotICAgICAg
ICBhdXRvIGNvbHVtbkJveEZpeGVkV2lkdGggPSBjb2x1bW4uYm94KCkgPyBjb2x1bW4uYm94KCkt
PmNvbHVtbldpZHRoKCkudmFsdWVPcigwX2x1KSA6IDBfbHU7Ci0gICAgICAgIGF1dG8gbWluaW11
bVdpZHRoID0gc3RkOjptYXg8ZmxvYXQ+KHNsb3Qud2lkdGhDb25zdHJhaW50cygpLm1pbmltdW0s
IGNvbHVtbkJveEZpeGVkV2lkdGgpOwotICAgICAgICBhdXRvIG1heGltdW1XaWR0aCA9IHN0ZDo6
bWF4PGZsb2F0PihzbG90LndpZHRoQ29uc3RyYWludHMoKS5tYXhpbXVtLCBjb2x1bW5Cb3hGaXhl
ZFdpZHRoKTsKLQotICAgICAgICBpZiAoY29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlID09IENvbHVt
bldpZHRoQmFsYW5jaW5nQmFzZTo6TWluaW11bVdpZHRoKSB7Ci0gICAgICAgICAgICBBU1NFUlQo
bWF4aW11bVdpZHRoID49IG1pbmltdW1XaWR0aCk7Ci0gICAgICAgICAgICByZXR1cm4gR3JpZFNw
YWNlIHsgbWluaW11bVdpZHRoLCBtYXhpbXVtV2lkdGggLSBtaW5pbXVtV2lkdGggfTsKLSAgICAg
ICAgfQotICAgICAgICAvLyBXaGVuIHRoZSBjb2x1bW4gaGFzIGEgZml4ZWQgd2lkdGggY2VsbCwg
dGhlIG1heGltdW0gd2lkdGggYmFsYW5jaW5nIGlzIGJhc2VkIG9uIHRoZSBtaW5pbXVtIHdpZHRo
LgotICAgICAgICBpZiAoY29sdW1uLmlzRml4ZWRXaWR0aCgpKQotICAgICAgICAgICAgcmV0dXJu
IEdyaWRTcGFjZSB7IG1pbmltdW1XaWR0aCwgbWF4aW11bVdpZHRoIH07Ci0gICAgICAgIHJldHVy
biBHcmlkU3BhY2UgeyBtYXhpbXVtV2lkdGgsIG1heGltdW1XaWR0aCB9OwotICAgIH0pOwotfQot
Ci1UYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dDo6RGlzdHJpYnV0ZWRTcGFjZXMg
VGFibGVGb3JtYXR0aW5nQ29udGV4dDo6VGFibGVMYXlvdXQ6OmRpc3RyaWJ1dGVkVmVydGljYWxT
cGFjZShPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKQotewotICAg
IGF1dG8mIHJvd3MgPSBtX2dyaWQucm93cygpOwotICAgIGF1dG8mIGNvbHVtbnMgPSBtX2dyaWQu
Y29sdW1ucygpOwotCi0gICAgVmVjdG9yPExheW91dFVuaXQ+IHJvd0hlaWdodChyb3dzLnNpemUo
KSk7Ci0gICAgYXV0byB0YWJsZVVzZWRIZWlnaHQgPSBMYXlvdXRVbml0IHsgfTsKLSAgICAvLyAy
LiBDb2xsZWN0IGluaXRpYWwsIGJhc2VsaW5lIGFsaWduZWQgcm93IGhlaWdodHMuCi0gICAgZm9y
IChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4
KSB7Ci0gICAgICAgIGF1dG8gbWF4aW11bUNvbHVtbkFzY2VudCA9IElubGluZUxheW91dFVuaXQg
eyB9OwotICAgICAgICBhdXRvIG1heGltdW1Db2x1bW5EZXNjZW50ID0gSW5saW5lTGF5b3V0VW5p
dCB7IH07Ci0gICAgICAgIC8vIEluaXRpYWwgbWluaW11bSBoZWlnaHQgaXMgdGhlIGNvbXB1dGVk
IGhlaWdodCBpZiBhdmFpbGFibGUgPHRyIHN0eWxlPSJoZWlnaHQ6IDEwMHB4Ij48dGQ+PC90ZD48
L3RyPgotICAgICAgICByb3dIZWlnaHRbcm93SW5kZXhdID0gZm9ybWF0dGluZ0NvbnRleHQoKS5n
ZW9tZXRyeSgpLmNvbXB1dGVkSGVpZ2h0KHJvd3MubGlzdCgpW3Jvd0luZGV4XS5ib3goKSwgYXZh
aWxhYmxlVmVydGljYWxTcGFjZSkudmFsdWVPcigwX2x1KTsKLSAgICAgICAgZm9yIChzaXplX3Qg
Y29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IGNvbHVtbnMuc2l6ZSgpOyArK2NvbHVtbklu
ZGV4KSB7Ci0gICAgICAgICAgICBhdXRvJiBzbG90ID0gKm1fZ3JpZC5zbG90KHsgY29sdW1uSW5k
ZXgsIHJvd0luZGV4IH0pOwotICAgICAgICAgICAgaWYgKHNsb3QuaXNSb3dTcGFubmVkKCkpCi0g
ICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoc2xvdC5oYXNSb3dTcGFu
KCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAvLyBUaGUgbWluaW11
bSBoZWlnaHQgb2YgYSByb3cgKHdpdGhvdXQgc3Bhbm5pbmctcmVsYXRlZCBoZWlnaHQgZGlzdHJp
YnV0aW9uKSBpcyBkZWZpbmVkIGFzIHRoZSBoZWlnaHQgb2YgYW4gaHlwb3RoZXRpY2FsCi0gICAg
ICAgICAgICAvLyBsaW5lYm94IGNvbnRhaW5pbmcgdGhlIGNlbGxzIG9yaWdpbmF0aW5nIGluIHRo
ZSByb3cuCi0gICAgICAgICAgICBhdXRvJiBjZWxsID0gc2xvdC5jZWxsKCk7Ci0gICAgICAgICAg
ICBhdXRvJiBjZWxsQm94ID0gY2VsbC5ib3goKTsKLSAgICAgICAgICAgIGF1dG8gaGVpZ2h0ID0g
Zm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChjZWxsQm94KS5ib3JkZXJCb3hIZWln
aHQoKTsKLSAgICAgICAgICAgIGlmIChjZWxsQm94LnN0eWxlKCkudmVydGljYWxBbGlnbigpID09
IFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lKSB7Ci0gICAgICAgICAgICAgICAgbWF4aW11bUNvbHVt
bkFzY2VudCA9IHN0ZDo6bWF4KG1heGltdW1Db2x1bW5Bc2NlbnQsIGNlbGwuYmFzZWxpbmUoKSk7
Ci0gICAgICAgICAgICAgICAgbWF4aW11bUNvbHVtbkRlc2NlbnQgPSBzdGQ6Om1heChtYXhpbXVt
Q29sdW1uRGVzY2VudCwgaGVpZ2h0IC0gY2VsbC5iYXNlbGluZSgpKTsKLSAgICAgICAgICAgICAg
ICByb3dIZWlnaHRbcm93SW5kZXhdID0gc3RkOjptYXgocm93SGVpZ2h0W3Jvd0luZGV4XSwgTGF5
b3V0VW5pdCB7IG1heGltdW1Db2x1bW5Bc2NlbnQgKyBtYXhpbXVtQ29sdW1uRGVzY2VudCB9KTsK
LSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJvd0hlaWdodFtyb3dJbmRleF0g
PSBzdGQ6Om1heChyb3dIZWlnaHRbcm93SW5kZXhdLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAg
ICAgIHRhYmxlVXNlZEhlaWdodCArPSByb3dIZWlnaHRbcm93SW5kZXhdOwotICAgIH0KLSAgICAv
LyBGSVhNRTogQ29sbGVjdCBzcGFubmluZyByb3cgbWF4aW11bSBoZWlnaHRzLgotCi0gICAgdGFi
bGVVc2VkSGVpZ2h0ICs9IChyb3dzLnNpemUoKSArIDEpICogbV9ncmlkLnZlcnRpY2FsU3BhY2lu
ZygpOwotICAgIGF1dG8gYXZhaWxhYmxlU3BhY2UgPSBzdGQ6Om1heChhdmFpbGFibGVWZXJ0aWNh
bFNwYWNlLnZhbHVlT3IoMF9sdSksIHRhYmxlVXNlZEhlaWdodCk7Ci0gICAgLy8gRGlzdHJpYnV0
ZSBleHRyYSBzcGFjZSBpZiB0aGUgdGFibGUgaXMgc3VwcG9zZWQgdG8gYmUgdGFsbGVyIHRoYW4g
dGhlIHN1bSBvZiB0aGUgcm93IGhlaWdodHMuCi0gICAgcmV0dXJuIGRpc3RyaWJ1dGVBdmFpbGFi
bGVTcGFjZTxSb3dTcGFuPihtX2dyaWQsIGF2YWlsYWJsZVNwYWNlLCBbJl0gKGNvbnN0IFRhYmxl
R3JpZDo6U2xvdCYgc2xvdCwgc2l6ZV90IHJvd0luZGV4KSB7Ci0gICAgICAgIGlmIChzbG90Lmhh
c1Jvd1NwYW4oKSkKLSAgICAgICAgICAgIHJldHVybiBHcmlkU3BhY2UgeyBmb3JtYXR0aW5nQ29u
dGV4dCgpLmdlb21ldHJ5Rm9yQm94KHNsb3QuY2VsbCgpLmJveCgpKS5ib3JkZXJCb3hIZWlnaHQo
KSwgZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChzbG90LmNlbGwoKS5ib3goKSku
Ym9yZGVyQm94SGVpZ2h0KCkgfTsKLSAgICAgICAgYXV0byYgcm93cyA9IG1fZ3JpZC5yb3dzKCk7
Ci0gICAgICAgIGF1dG8gY29tcHV0ZWRSb3dIZWlnaHQgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdl
b21ldHJ5KCkuY29tcHV0ZWRIZWlnaHQocm93cy5saXN0KClbcm93SW5kZXhdLmJveCgpLCB7IH0p
OwotICAgICAgICBhdXRvIGhlaWdodCA9IHN0ZDo6bWF4PGZsb2F0Pihyb3dIZWlnaHRbcm93SW5k
ZXhdLCBjb21wdXRlZFJvd0hlaWdodC52YWx1ZU9yKDBfbHUpKTsKLSAgICAgICAgcmV0dXJuIEdy
aWRTcGFjZSB7IGhlaWdodCwgaGVpZ2h0IH07Ci0gICAgfSk7Ci19Ci0KLX0KLX0KLQotI2VuZGlm
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>427500</attachid>
            <date>2021-05-01 09:23:56 -0700</date>
            <delta_ts>2021-05-01 10:15:57 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-225270-20210501092355.patch</filename>
            <type>text/plain</type>
            <size>1296808</size>
            <attacher name="alan">zalan</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc2ODczCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjk3NGJhNTg4ODg3ZGRh
NWI1ODllOGZiM2I1YTQwZWU1ZWUwMzgxYi4uMjFlZjJiNjRjYTkwNDA0Yzc0YmM4NzI5MTk3NjVj
ZjQ3MmI3MmEzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDIxLTA1LTAxICBaYWxh
biBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CisKKyAgICAgICAgW0xGQ10gTW92ZSBmb3JtYXR0
aW5nIGNvbnRleHRzIHRvIGxheW91dC9mb3JtYXR0aW5nQ29udGV4dHMgZGlyZWN0b3J5CisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMjUyNzAKKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIENNYWtlTGlzdHMu
dHh0OgorICAgICAgICAqIFNvdXJjZXMudHh0OgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvajoKKwogMjAyMS0wNS0wMSAgWmFsYW4gQnVqdGFzICA8emFsYW5AYXBw
bGUuY29tPgogCiAgICAgICAgIFtSZW5kZXJUcmVlQnVpbGRlcl0gUmVzZXQgdGhlICJjaGlsZHJl
biBpbmxpbmUiIHN0YXRlIHdoZW4gbWVyZ2luZyBhbm9ueW1vdXMgdGFibGUgYm94ZXMKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNvcmUvQ01h
a2VMaXN0cy50eHQKaW5kZXggNGE0NWEyODg3OWM0YTc3YmYxNDMwMTZmMWMzNThmNGU1NWI2N2Y3
MC4uMDQ5OTUwNmRhZDRiMDA0ZTkzMTJmNTc2NDUyMDkyYjA5NjllNzhmNyAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VM
aXN0cy50eHQKQEAgLTEwMSwxNiArMTAxLDE2IEBAIHNldChXZWJDb3JlX1BSSVZBVEVfSU5DTFVE
RV9ESVJFQ1RPUklFUwogICAgICIke1dFQkNPUkVfRElSfS9pbnNwZWN0b3IvYWdlbnRzL3BhZ2Ui
CiAgICAgIiR7V0VCQ09SRV9ESVJ9L2luc3BlY3Rvci9hZ2VudHMvd29ya2VyIgogICAgICIke1dF
QkNPUkVfRElSfS9sYXlvdXQiCi0gICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9ibG9ja2Zvcm1h
dHRpbmciCi0gICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3
cmFwcGVyIgotICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvZmxleGZvcm1hdHRpbmciCisgICAg
IiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5n
IgorICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9y
bWF0dGluZy90YWJsZXdyYXBwZXIiCisgICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmciCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9m
bG9hdHMiCi0gICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9pbmxpbmVmb3JtYXR0aW5nIgotICAg
ICIke1dFQkNPUkVfRElSfS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy90ZXh0IgorICAgICIke1dF
QkNPUkVfRElSfS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmciCisg
ICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0
dGluZy90ZXh0IgogICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvaW50ZWdyYXRpb24iCiAgICAg
IiR7V0VCQ09SRV9ESVJ9L2xheW91dC9pbnZhbGlkYXRpb24iCiAgICAgIiR7V0VCQ09SRV9ESVJ9
L2xheW91dC9sYXlvdXR0cmVlIgotICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvdGFibGVmb3Jt
YXR0aW5nIgorICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3Rh
YmxlZm9ybWF0dGluZyIKICAgICAiJHtXRUJDT1JFX0RJUn0vbG9hZGVyIgogICAgICIke1dFQkNP
UkVfRElSfS9sb2FkZXIvYXBwY2FjaGUiCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xvYWRlci9hcmNo
aXZlIgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvU291cmNlcy50eHQgYi9Tb3VyY2UvV2Vi
Q29yZS9Tb3VyY2VzLnR4dAppbmRleCA4Njk4ZDU2NTM2OWNlYjZjYzI0OGNkMjc1OWVjMjU5ZjA1
OTkyNWNiLi4yZDkwNjE0OTNhNGYyNTA3Y2FhNGRmN2NkODc1MmZiMmEyNjI5YWJlIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9Tb3VyY2VzLnR4dAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Tb3Vy
Y2VzLnR4dApAQCAtMTUwOCw0MCArMTUwOCw0MCBAQCBpbnNwZWN0b3IvYWdlbnRzL3dvcmtlci9X
b3JrZXJET01EZWJ1Z2dlckFnZW50LmNwcAogaW5zcGVjdG9yL2FnZW50cy93b3JrZXIvV29ya2Vy
RGVidWdnZXJBZ2VudC5jcHAKIGluc3BlY3Rvci9hZ2VudHMvd29ya2VyL1dvcmtlck5ldHdvcmtB
Z2VudC5jcHAKIGluc3BlY3Rvci9hZ2VudHMvd29ya2VyL1dvcmtlclJ1bnRpbWVBZ2VudC5jcHAK
LWxheW91dC9Gb3JtYXR0aW5nQ29udGV4dC5jcHAKLWxheW91dC9Gb3JtYXR0aW5nQ29udGV4dEdl
b21ldHJ5LmNwcAotbGF5b3V0L0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcAorbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9Gb3JtYXR0aW5nQ29udGV4dC5jcHAKK2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKK2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCiBsYXlvdXQvRm9ybWF0dGluZ1N0
YXRlLmNwcAogbGF5b3V0L0xheW91dENvbnRleHQuY3BwCiBsYXlvdXQvTGF5b3V0UGhhc2UuY3Bw
CiBsYXlvdXQvTGF5b3V0U3RhdGUuY3BwCiBsYXlvdXQvTGF5b3V0VW5pdHMuY3BwCiBsYXlvdXQv
VmVyaWZpY2F0aW9uLmNwcAotbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdD
b250ZXh0LmNwcAotbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0
R2VvbWV0cnkuY3BwCi1sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRl
eHRRdWlya3MuY3BwCi1sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRl
LmNwcAotbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja01hcmdpbkNvbGxhcHNlLmNwcAotbGF5
b3V0L2Jsb2NrZm9ybWF0dGluZy9QcmVjb21wdXRlZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCi1s
YXlvdXQvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0LmNwcAotbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFi
bGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKLWxheW91dC9mbGV4Zm9y
bWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuY3BwCi1sYXlvdXQvZmxleGZvcm1hdHRpbmcv
RmxleEZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCi1sYXlvdXQvZmxleGZvcm1hdHRpbmcv
RmxleEZvcm1hdHRpbmdTdGF0ZS5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tm
b3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3Bw
CitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRp
bmdDb250ZXh0UXVpcmtzLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1h
dHRpbmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2Jsb2NrZm9ybWF0dGluZy9CbG9ja01hcmdpbkNvbGxhcHNlLmNwcAorbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvUHJlY29tcHV0ZWRCbG9ja01hcmdpbkNvbGxhcHNl
LmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFw
cGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
ZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmNwcAorbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5j
cHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRp
bmdTdGF0ZS5jcHAKIGxheW91dC9mbG9hdHMvRmxvYXRBdm9pZGVyLmNwcAogbGF5b3V0L2Zsb2F0
cy9GbG9hdGluZ0NvbnRleHQuY3BwCiBsYXlvdXQvZmxvYXRzL0Zsb2F0aW5nU3RhdGUuY3BwCi1s
YXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5jcHAKLWxheW91dC9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmNwcAotbGF5b3V0L2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKLWxheW91dC9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcAotbGF5b3V0
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmNwcAotbGF5b3V0L2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lSXRlbS5jcHAKLWxheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZUxpbmUuY3BwCi1sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94LmNwcAotbGF5
b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxkZXIuY3BwCi1sYXlvdXQvaW5saW5l
Zm9ybWF0dGluZy9JbmxpbmVUZXh0SXRlbS5jcHAKLWxheW91dC9pbmxpbmVmb3JtYXR0aW5nL3Rl
eHQvVGV4dFV0aWwuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRp
bmcvSW5saW5lQ29udGVudEJyZWFrZXIuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRHZW9t
ZXRyeS5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuY3BwCitsYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lSXRlbS5jcHAKK2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lLmNwcAorbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwCitsYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxkZXIu
Y3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4
dEl0ZW0uY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvdGV4
dC9UZXh0VXRpbC5jcHAKIGxheW91dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbkJveFRy
ZWUuY3BwCiBsYXlvdXQvaW50ZWdyYXRpb24vTGF5b3V0SW50ZWdyYXRpb25Db3ZlcmFnZS5jcHAK
IGxheW91dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbklubGluZUNvbnRlbnRCdWlsZGVy
LmNwcApAQCAtMTU2MCwxMiArMTU2MCwxMiBAQCBsYXlvdXQvbGF5b3V0dHJlZS9MYXlvdXRJbmxp
bmVUZXh0Qm94LmNwcAogbGF5b3V0L2xheW91dHRyZWUvTGF5b3V0TGluZUJyZWFrQm94LmNwcAog
bGF5b3V0L2xheW91dHRyZWUvTGF5b3V0UmVwbGFjZWRCb3guY3BwCiBsYXlvdXQvbGF5b3V0dHJl
ZS9MYXlvdXRUcmVlQnVpbGRlci5jcHAKLWxheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3Jt
YXR0aW5nQ29udGV4dC5jcHAKLWxheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5n
Q29udGV4dEdlb21ldHJ5LmNwcAotbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRp
bmdDb250ZXh0UXVpcmtzLmNwcAotbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRp
bmdTdGF0ZS5jcHAKLWxheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmNwcAotbGF5b3V0
L3RhYmxlZm9ybWF0dGluZy9UYWJsZUxheW91dC5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2Vv
bWV0cnkuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJs
ZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90
YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuY3BwCitsYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuY3BwCitsYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUxheW91dC5jcHAKIGxvYWRlci9Qcml2YXRl
Q2xpY2tNZWFzdXJlbWVudC5jcHAKIGxvYWRlci9BcHBsaWNhdGlvbk1hbmlmZXN0TG9hZGVyLmNw
cAogbG9hZGVyL0NhbnZhc0FjdGl2aXR5UmVjb3JkLmNwcApkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvU291cmNlL1dlYkNvcmUv
V2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IDZjZmY0ZTk5ZGViNGUzMDM1
OGEyZTQ1NmI1ZGQ1MGIyYzBhMzUwNjAuLjY2ZDRmZGY1ZjM0Nzg5NThlNzg5YzMwMzEyZTM2MzAz
MmRkZTIyNDcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oKQEAgLTE4MTc5LDE4ICsxODE3OSwxMSBAQAogCQkxMTVDRkE2NjIwOEFGNzIw
MDAxRTY5OTEgLyogbGF5b3V0ICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJl
biA9ICgKLQkJCQkxMTVDRkE5OTIwOEJDMDlBMDAxRTY5OTEgLyogYmxvY2tmb3JtYXR0aW5nICov
LAotCQkJCTZGQjdEMkQ1MjUwRkQ3QjUwMDAyMDdBQSAvKiBmbGV4Zm9ybWF0dGluZyAqLywKIAkJ
CQk2RkNGQzA1NTIxMkRBQ0MyMDA3Njk1RDIgLyogZmxvYXRzICovLAotCQkJCTExNUNGQTlBMjA4
QkMxNDAwMDFFNjk5MSAvKiBpbmxpbmVmb3JtYXR0aW5nICovLAorCQkJCTZGODQ0RjdGMjYzRDkx
NjEwMEY5MTM3MCAvKiBmb3JtYXR0aW5nQ29udGV4dHMgKi8sCiAJCQkJRTRGQjRCMUUyMzk1MzU2
RjAwM0MzMzZBIC8qIGludGVncmF0aW9uICovLAogCQkJCTZGOTVERTRBMjM3Qjg4MzAwMEU1MTdF
MSAvKiBpbnZhbGlkYXRpb24gKi8sCiAJCQkJMTE1Q0ZBOTAyMDhCOTQ0MTAwMUU2OTkxIC8qIGxh
eW91dHRyZWUgKi8sCi0JCQkJNkZDNUNBOTEyMkUzNTkzMzAwQjEzRTExIC8qIHRhYmxlZm9ybWF0
dGluZyAqLywKLQkJCQkxMTVDRkE2OTIwOEFGN0QwMDAxRTY5OTEgLyogRm9ybWF0dGluZ0NvbnRl
eHQuY3BwICovLAotCQkJCTExNUNGQTY4MjA4QUY3RDAwMDFFNjk5MSAvKiBGb3JtYXR0aW5nQ29u
dGV4dC5oICovLAotCQkJCTZGQkI4NjA1MjBCNDY0QjYwMERBRDkzOCAvKiBGb3JtYXR0aW5nQ29u
dGV4dEdlb21ldHJ5LmNwcCAqLywKLQkJCQk2RjhGNDYwMTIxQjAzQkI0MDA0MUFDM0EgLyogRm9y
bWF0dGluZ0NvbnRleHRRdWlya3MuY3BwICovLAogCQkJCTExNUNGQTc1MjA4QUZFMzAwMDFFNjk5
MSAvKiBGb3JtYXR0aW5nU3RhdGUuY3BwICovLAogCQkJCTExNUNGQTc0MjA4QUZFMzAwMDFFNjk5
MSAvKiBGb3JtYXR0aW5nU3RhdGUuaCAqLywKIAkJCQk2RjI2QkI2OTIzMzQzRTVBMDAyRjJCRUEg
LyogTGF5b3V0Q29udGV4dC5jcHAgKi8sCkBAIC0yMjYwMSw2ICsyMjU5NCwyMSBAQAogCQkJcGF0
aCA9IGFuZ2xlOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKIAkJfTsKKwkJNkY4NDRGN0Yy
NjNEOTE2MTAwRjkxMzcwIC8qIGZvcm1hdHRpbmdDb250ZXh0cyAqLyA9IHsKKwkJCWlzYSA9IFBC
WEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMTE1Q0ZBOTkyMDhCQzA5QTAwMUU2OTkxIC8q
IGJsb2NrZm9ybWF0dGluZyAqLywKKwkJCQk2RkI3RDJENTI1MEZEN0I1MDAwMjA3QUEgLyogZmxl
eGZvcm1hdHRpbmcgKi8sCisJCQkJMTE1Q0ZBOUEyMDhCQzE0MDAwMUU2OTkxIC8qIGlubGluZWZv
cm1hdHRpbmcgKi8sCisJCQkJNkZDNUNBOTEyMkUzNTkzMzAwQjEzRTExIC8qIHRhYmxlZm9ybWF0
dGluZyAqLywKKwkJCQkxMTVDRkE2OTIwOEFGN0QwMDAxRTY5OTEgLyogRm9ybWF0dGluZ0NvbnRl
eHQuY3BwICovLAorCQkJCTExNUNGQTY4MjA4QUY3RDAwMDFFNjk5MSAvKiBGb3JtYXR0aW5nQ29u
dGV4dC5oICovLAorCQkJCTZGQkI4NjA1MjBCNDY0QjYwMERBRDkzOCAvKiBGb3JtYXR0aW5nQ29u
dGV4dEdlb21ldHJ5LmNwcCAqLywKKwkJCQk2RjhGNDYwMTIxQjAzQkI0MDA0MUFDM0EgLyogRm9y
bWF0dGluZ0NvbnRleHRRdWlya3MuY3BwICovLAorCQkJKTsKKwkJCXBhdGggPSBmb3JtYXR0aW5n
Q29udGV4dHM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OwogCQk2Rjk1REU0QTIz
N0I4ODMwMDBFNTE3RTEgLyogaW52YWxpZGF0aW9uICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7
CiAJCQljaGlsZHJlbiA9ICgKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3Jt
YXR0aW5nQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRm9ybWF0dGluZ0NvbnRl
eHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODU3ZGJhMmM3ZDY1Mjk2MGM0
MTFmYWJjYTM1NzU4Njk1YmExMTI4Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dC5jcHAK
KysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAx
OCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExB
WU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUuaCIK
LSNpbmNsdWRlICJJbnZhbGlkYXRpb25TdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgot
I2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVy
Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dERlc2Nl
bmRhbnRJdGVyYXRvci5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2su
aCIKLSNpbmNsdWRlICJMYXlvdXRSZXBsYWNlZEJveC5oIgotI2luY2x1ZGUgIkxheW91dFN0YXRl
LmgiCi0jaW5jbHVkZSAiTG9nZ2luZy5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVz
Lmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvVGV4dFN0cmVhbS5oPgotCi1uYW1lc3BhY2UgV2ViQ29y
ZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEZv
cm1hdHRpbmdDb250ZXh0KTsKLQotRm9ybWF0dGluZ0NvbnRleHQ6OkZvcm1hdHRpbmdDb250ZXh0
KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBGb3JtYXR0aW5nU3Rh
dGUmIGZvcm1hdHRpbmdTdGF0ZSkKLSAgICA6IG1fcm9vdChtYWtlV2Vha1B0cihmb3JtYXR0aW5n
Q29udGV4dFJvb3QpKQotICAgICwgbV9mb3JtYXR0aW5nU3RhdGUoZm9ybWF0dGluZ1N0YXRlKQot
ewotICAgIEFTU0VSVChmb3JtYXR0aW5nQ29udGV4dFJvb3QuaGFzQ2hpbGQoKSk7Ci0jaWZuZGVm
IE5ERUJVRwotICAgIGxheW91dFN0YXRlKCkucmVnaXN0ZXJGb3JtYXR0aW5nQ29udGV4dCgqdGhp
cyk7Ci0jZW5kaWYKLX0KLQotRm9ybWF0dGluZ0NvbnRleHQ6On5Gb3JtYXR0aW5nQ29udGV4dCgp
Ci17Ci0jaWZuZGVmIE5ERUJVRwotICAgIGxheW91dFN0YXRlKCkuZGVyZWdpc3RlckZvcm1hdHRp
bmdDb250ZXh0KCp0aGlzKTsKLSNlbmRpZgotfQotCi1MYXlvdXRTdGF0ZSYgRm9ybWF0dGluZ0Nv
bnRleHQ6OmxheW91dFN0YXRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9mb3JtYXR0aW5nU3Rh
dGUubGF5b3V0U3RhdGUoKTsKLX0KLQotdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZU91
dE9mRmxvd0hvcml6b250YWxHZW9tZXRyeShjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29u
c3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBBU1NFUlQo
bGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKLSAgICBhdXRvIGNvbXB1dGUgPSBb
Jl0oT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZFdpZHRoKSB7Ci0gICAgICAgIHJldHVybiBnZW9t
ZXRyeSgpLm91dE9mRmxvd0hvcml6b250YWxHZW9tZXRyeShsYXlvdXRCb3gsIGNvbnN0cmFpbnRz
Lmhvcml6b250YWwsIGNvbnN0cmFpbnRzLnZlcnRpY2FsLCB7IHVzZWRXaWR0aCwgeyB9IH0pOwot
ICAgIH07Ci0KLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gY29uc3RyYWludHMuaG9y
aXpvbnRhbC5sb2dpY2FsV2lkdGg7Ci0gICAgYXV0byBob3Jpem9udGFsR2VvbWV0cnkgPSBjb21w
dXRlKHsgfSk7Ci0gICAgaWYgKGF1dG8gbWF4V2lkdGggPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWF4
V2lkdGgobGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tXaWR0aCkpIHsKLSAgICAgICAgYXV0byBt
YXhIb3Jpem9udGFsR2VvbWV0cnkgPSBjb21wdXRlKG1heFdpZHRoKTsKLSAgICAgICAgaWYgKGhv
cml6b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoID4gbWF4
SG9yaXpvbnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCi0g
ICAgICAgICAgICBob3Jpem9udGFsR2VvbWV0cnkgPSBtYXhIb3Jpem9udGFsR2VvbWV0cnk7Ci0g
ICAgfQotCi0gICAgaWYgKGF1dG8gbWluV2lkdGggPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluV2lk
dGgobGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tXaWR0aCkpIHsKLSAgICAgICAgYXV0byBtaW5I
b3Jpem9udGFsR2VvbWV0cnkgPSBjb21wdXRlKG1pbldpZHRoKTsKLSAgICAgICAgaWYgKGhvcml6
b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoIDwgbWluSG9y
aXpvbnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCi0gICAg
ICAgICAgICBob3Jpem9udGFsR2VvbWV0cnkgPSBtaW5Ib3Jpem9udGFsR2VvbWV0cnk7Ci0gICAg
fQotCi0gICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRy
eShsYXlvdXRCb3gpOwotICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxMZWZ0KGhvcml6b250YWxH
ZW9tZXRyeS5sZWZ0ICsgaG9yaXpvbnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi51
c2VkTWFyZ2luLnN0YXJ0KTsKLSAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoaG9y
aXpvbnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOwotICAg
IGF1dG8mIHVzZWRIb3Jpem9udGFsTWFyZ2luID0gaG9yaXpvbnRhbEdlb21ldHJ5LmNvbnRlbnRX
aWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luOwotICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxN
YXJnaW4oeyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCwgdXNlZEhvcml6b250YWxNYXJnaW4u
ZW5kIH0pOwotfQotCi12b2lkIEZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlT3V0T2ZGbG93VmVy
dGljYWxHZW9tZXRyeShjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29uc3RyYWludHNGb3JP
dXRPZkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94Lmlz
T3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKLSAgICBhdXRvIGNvbXB1dGUgPSBbJl0oT3B0aW9uYWw8
TGF5b3V0VW5pdD4gdXNlZEhlaWdodCkgewotICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5vdXRP
ZkZsb3dWZXJ0aWNhbEdlb21ldHJ5KGxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwg
Y29uc3RyYWludHMudmVydGljYWwsIHsgdXNlZEhlaWdodCB9KTsKLSAgICB9OwotCi0gICAgYXV0
byBjb250YWluaW5nQmxvY2tIZWlnaHQgPSAqY29uc3RyYWludHMudmVydGljYWwubG9naWNhbEhl
aWdodDsKLSAgICBhdXRvIHZlcnRpY2FsR2VvbWV0cnkgPSBjb21wdXRlKHsgfSk7Ci0gICAgaWYg
KGF1dG8gbWF4SGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1heEhlaWdodChsYXlvdXRCb3gs
IGNvbnRhaW5pbmdCbG9ja0hlaWdodCkpIHsKLSAgICAgICAgYXV0byBtYXhWZXJ0aWNhbEdlb21l
dHJ5ID0gY29tcHV0ZShtYXhIZWlnaHQpOwotICAgICAgICBpZiAodmVydGljYWxHZW9tZXRyeS5j
b250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPiBtYXhWZXJ0aWNhbEdlb21ldHJ5
LmNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCkKLSAgICAgICAgICAgIHZlcnRp
Y2FsR2VvbWV0cnkgPSBtYXhWZXJ0aWNhbEdlb21ldHJ5OwotICAgIH0KLQotICAgIGlmIChhdXRv
IG1pbkhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNaW5IZWlnaHQobGF5b3V0Qm94LCBjb250
YWluaW5nQmxvY2tIZWlnaHQpKSB7Ci0gICAgICAgIGF1dG8gbWluVmVydGljYWxHZW9tZXRyeSA9
IGNvbXB1dGUobWluSGVpZ2h0KTsKLSAgICAgICAgaWYgKHZlcnRpY2FsR2VvbWV0cnkuY29udGVu
dEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0IDwgbWluVmVydGljYWxHZW9tZXRyeS5jb250
ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpCi0gICAgICAgICAgICB2ZXJ0aWNhbEdl
b21ldHJ5ID0gbWluVmVydGljYWxHZW9tZXRyeTsKLSAgICB9Ci0KLSAgICBhdXRvJiBib3hHZW9t
ZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgYXV0
byBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiA9IHZlcnRpY2FsR2VvbWV0cnkuY29udGVudEhl
aWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW47Ci0gICAgYm94R2VvbWV0cnkuc2V0TG9n
aWNhbFRvcCh2ZXJ0aWNhbEdlb21ldHJ5LnRvcCArIG5vbkNvbGxhcHNlZFZlcnRpY2FsTWFyZ2lu
LmJlZm9yZSk7Ci0gICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodCh2ZXJ0aWNhbEdl
b21ldHJ5LmNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCk7Ci0gICAgLy8gTWFy
Z2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgotICAg
IGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgbm9uQ29sbGFwc2VkVmVydGljYWxNYXJn
aW4uYmVmb3JlLCBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciB9KTsKLX0KLQotdm9p
ZCBGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoY29uc3QgQm94JiBs
YXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFp
bnQpCi17Ci0gICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9t
ZXRyeShsYXlvdXRCb3gpOwotICAgIGJveEdlb21ldHJ5LnNldEJvcmRlcihnZW9tZXRyeSgpLmNv
bXB1dGVkQm9yZGVyKGxheW91dEJveCkpOwotICAgIGJveEdlb21ldHJ5LnNldFBhZGRpbmcoZ2Vv
bWV0cnkoKS5jb21wdXRlZFBhZGRpbmcobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludC5s
b2dpY2FsV2lkdGgpKTsKLX0KLQotdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0T3V0T2ZG
bG93Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYgaW52YWxpZGF0aW9uU3RhdGUsIGNvbnN0IENv
bnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgTE9HX1dJ
VEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIlN0YXJ0OiBsYXlv
dXQgb3V0LW9mLWZsb3cgY29udGVudCAtPiBjb250ZXh0OiAiIDw8ICZsYXlvdXRTdGF0ZSgpIDw8
ICIgcm9vdDogIiA8PCAmcm9vdCgpKTsKLQotICAgIGNvbGxlY3RPdXRPZkZsb3dEZXNjZW5kYW50
c0lmTmVlZGVkKCk7Ci0KLSAgICBhdXRvIGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94ID0gWyZdIChj
b25zdCBhdXRvJiBvdXRPZkZsb3dCb3gpIHsKLSAgICAgICAgYXV0byYgY29udGFpbmluZ0Jsb2Nr
ID0gb3V0T2ZGbG93Qm94LmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICByZXR1cm4gJmNvbnRh
aW5pbmdCbG9jayA9PSAmcm9vdCgpID8gY29uc3RyYWludHMgOiBnZW9tZXRyeSgpLmNvbnN0cmFp
bnRzRm9yT3V0T2ZGbG93Q29udGVudChjb250YWluaW5nQmxvY2spOwotICAgIH07Ci0KLSAgICBm
b3IgKGF1dG8mIG91dE9mRmxvd0JveCA6IGZvcm1hdHRpbmdTdGF0ZSgpLm91dE9mRmxvd0JveGVz
KCkpIHsKLSAgICAgICAgQVNTRVJUKG91dE9mRmxvd0JveC0+ZXN0YWJsaXNoZXNGb3JtYXR0aW5n
Q29udGV4dCgpKTsKLSAgICAgICAgaWYgKCFpbnZhbGlkYXRpb25TdGF0ZS5uZWVkc0xheW91dCgq
b3V0T2ZGbG93Qm94KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGF1dG8gY29u
dGFpbmluZ0Jsb2NrQ29uc3RyYWludHMgPSBjb25zdHJhaW50c0ZvckxheW91dEJveCgqb3V0T2ZG
bG93Qm94KTsKLSAgICAgICAgYXV0byBob3Jpem9udGFsQ29uc3RyYWludHNGb3JCb3JkZXJBbmRQ
YWRkaW5nID0gSG9yaXpvbnRhbENvbnN0cmFpbnRzIHsgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWlu
dHMuaG9yaXpvbnRhbC5sb2dpY2FsTGVmdCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuYm9y
ZGVyQW5kUGFkZGluZ0NvbnN0cmFpbnRzIH07Ci0gICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRk
aW5nKCpvdXRPZkZsb3dCb3gsIGhvcml6b250YWxDb25zdHJhaW50c0ZvckJvcmRlckFuZFBhZGRp
bmcpOwotCi0gICAgICAgIGNvbXB1dGVPdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkoKm91dE9m
Rmxvd0JveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMpOwotICAgICAgICBhdXRvIG91dE9m
Rmxvd0JveEhhc0NvbnRlbnQgPSBpczxDb250YWluZXJCb3g+KCpvdXRPZkZsb3dCb3gpICYmIGRv
d25jYXN0PENvbnRhaW5lckJveD4oKm91dE9mRmxvd0JveCkuaGFzQ2hpbGQoKTsKLSAgICAgICAg
aWYgKG91dE9mRmxvd0JveEhhc0NvbnRlbnQpIHsKLSAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5l
ckJveCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4oKm91dE9mRmxvd0JveCk7Ci0gICAgICAgICAg
ICBhdXRvIGZvcm1hdHRpbmdDb250ZXh0ID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGlu
Z0NvbnRleHQoY29udGFpbmVyQm94LCBsYXlvdXRTdGF0ZSgpKTsKLSAgICAgICAgICAgIGlmIChj
b250YWluZXJCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCi0gICAgICAgICAgICAgICAg
Zm9ybWF0dGluZ0NvbnRleHQtPmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUs
IGdlb21ldHJ5KCkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KGNvbnRhaW5lckJveCkpOwot
ICAgICAgICAgICAgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoY29udGFpbmVyQm94
LCBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyk7Ci0gICAgICAgICAgICBmb3JtYXR0aW5nQ29u
dGV4dC0+bGF5b3V0T3V0T2ZGbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnko
KS5jb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7Ci0gICAgICAg
IH0gZWxzZQotICAgICAgICAgICAgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoKm91
dE9mRmxvd0JveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMpOwotICAgIH0KLSAgICBMT0df
V0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiRW5kOiBsYXlv
dXQgb3V0LW9mLWZsb3cgY29udGVudCAtPiBjb250ZXh0OiAiIDw8ICZsYXlvdXRTdGF0ZSgpIDw8
ICIgcm9vdDogIiA8PCAmcm9vdCgpKTsKLX0KLQotY29uc3QgQm94R2VvbWV0cnkmIEZvcm1hdHRp
bmdDb250ZXh0OjpnZW9tZXRyeUZvckJveChjb25zdCBCb3gmIGxheW91dEJveCwgT3B0aW9uYWw8
RXNjYXBlUmVhc29uPiBlc2NhcGVSZWFzb24pIGNvbnN0Ci17Ci0gICAgVU5VU0VEX1BBUkFNKGVz
Y2FwZVJlYXNvbik7Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICBhdXRvIGlzT2tUb0FjY2Vzc0Jv
eEdlb21ldHJ5ID0gWyZdIHsKLSAgICAgICAgaWYgKCFpczxJbml0aWFsQ29udGFpbmluZ0Jsb2Nr
PihsYXlvdXRCb3gpICYmICZsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCkgPT0gJnJv
b3QoKSkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbm9uLWVzY2FwZSBjYXNlIG9mIGFj
Y2Vzc2luZyBhIGJveCdzIGdlb21ldHJ5IGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgc2FtZSBmb3Jt
YXR0aW5nIGNvbnRleHQuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0g
ICAgICAgIGlmICghZXNjYXBlUmVhc29uKSB7Ci0gICAgICAgICAgICAvLyBBbnkgZ2VvbWV0cnkg
YWNjZXNzIG91dHNpZGUgb2YgdGhlIGZvcm1hdHRpbmcgY29udGV4dCB3aXRob3V0IGEgdmFsaWQg
cmVhc29uIGlzIGNvbnNpZGVyZWQgYW4gZXNjYXBlLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29u
OjpEb2N1bWVudEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaykgewotICAgICAgICAgICAgQVNT
RVJUKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGlz
PEluaXRpYWxDb250YWluaW5nQmxvY2s+KGxheW91dEJveCk7Ci0gICAgICAgIH0KLQotICAgICAg
ICBpZiAoKmVzY2FwZVJlYXNvbiA9PSBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdw
b3J0UXVpcmspIHsKLSAgICAgICAgICAgIEFTU0VSVChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9k
ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihsYXlv
dXRCb3gpIHx8IGxheW91dEJveC5pc0RvY3VtZW50Qm94KCk7Ci0KLSAgICAgICAgfQotCi0gICAg
ICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNvbjo6VGFibGVRdWlya05lZWRzR2Vv
bWV0cnlGcm9tRXN0YWJsaXNoZWRGb3JtYXR0aW5nQ29udGV4dCkgewotICAgICAgICAgICAgLy8g
VGhpcyBpcyB0aGUgY2FzZSB3aGVuIHRoZSB0YWJsZSBmb3JtYXR0aW5nIHJvb3QgY29sbGVjdHMg
Z2VvbWV0cnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgY2VsbCdzCi0gICAgICAgICAgICAvLyBmb3Jt
YXR0aW5nIGNvbnRleHQgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgd2lkdGgvaGVpZ2h0LiBzZWUg
c2hvdWxkSWdub3JlQ2hpbGRDb250ZW50VmVydGljYWxNYXJnaW4KLSAgICAgICAgICAgIEFTU0VS
VChyb290KCkuZXN0YWJsaXNoZXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkpOwotICAgICAgICAg
ICAgcmV0dXJuICZsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCkuZm9ybWF0dGluZ0Nv
bnRleHRSb290KCkgPT0gJnJvb3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgqZXNjYXBl
UmVhc29uID09IEVzY2FwZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRyeSkg
ewotICAgICAgICAgICAgLy8gV2hlbiBjb21wdXRpbmcgdGhlIHN0YXRpYyBwb3NpdGlvbiBvZiBh
biBvdXQtb2YtZmxvdyBib3gsIHdlIG5lZWQgdG8gZ2F0aGVyIHNpYmxpbmcvcGFyZW50IGdlb21l
dHJ5IGluZm9ybWF0aW9uCi0gICAgICAgICAgICAvLyBhcyBpZiB0aGUgb3V0LW9mLWZsb3cgYm94
IHdhcyBhIHNpbXBsZSBpbmZsb3cgYm94LgotICAgICAgICAgICAgLy8gTm93IHNpbmNlIHRoZSBv
dXQtb2YtZmxvdyBhbmQgdGhlIHNpYmxpbmcvcGFyZW50IGJveGVzIGNvdWxkIHZlcnkgd2VsbCBi
ZSBpbiBkaWZmZXJlbnQgY29udGFpbmluZyBibG9jayBzdWJ0cmVlcwotICAgICAgICAgICAgLy8g
dGhlIGZvcm1hdHRpbmcgY29udGV4dCB0aGV5IGxpdmUgaW4gY291bGQgYWxzbyBiZSB2ZXJ5IGRp
ZmZlcmVudC4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpGbG9hdEJveElzQWx3YXlzUmVsYXRp
dmVUb0Zsb2F0U3RhdGVSb290KSB7Ci0gICAgICAgICAgICAvLyBGbG9hdCBib3ggdG9wL2xlZnQg
dmFsdWVzIGFyZSBtYXBwZWQgcmVsYXRpdmUgdG8gdGhlIEZsb2F0U3RhdGUncyByb290LiBJbmxp
bmUgZm9ybWF0dGluZyBjb250ZXh0cyhBKSBpbmhlcml0IGZsb2F0cyBmcm9tIHBhcmVudAotICAg
ICAgICAgICAgLy8gYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cyhCKS4gRmxvYXRzIGluIHRoZXNl
IGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHRzKEEpIG5lZWQgdG8gYmUgbWFwcGVkIHRvIHRoZSBw
YXJlbnQsIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dChCKS4KLSAgICAgICAgICAgIGF1dG8mIGZv
cm1hdHRpbmdDb250ZXh0Um9vdCA9IGxheW91dEJveC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsK
LSAgICAgICAgICAgIHJldHVybiAmZm9ybWF0dGluZ0NvbnRleHRSb290ID09ICZyb290KCkgfHwg
JmZvcm1hdHRpbmdDb250ZXh0Um9vdCA9PSAmcm9vdCgpLmZvcm1hdHRpbmdDb250ZXh0Um9vdCgp
OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29u
OjpGaW5kRml4ZWRIZWlnaHRBbmNlc3RvclF1aXJrKSB7Ci0gICAgICAgICAgICBBU1NFUlQobGF5
b3V0U3RhdGUoKS5pblF1aXJrc01vZGUoKSk7Ci0gICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJz
dCBjb250YWluaW5nIGJsb2NrIHdpdGggZml4ZWQgaGVpZ2h0IHF1aXJrLiBTZWUgUXVpcmtzOjpo
ZWlnaHRWYWx1ZU9mTmVhcmVzdENvbnRhaW5pbmdCbG9ja1dpdGhGaXhlZEhlaWdodC4KLSAgICAg
ICAgICAgIC8vIFRoaXMgaXMgb25seSB0byBjaGVjayBpZiB0aGUgdGFyZ2V0Rm9ybWF0dGluZ1Jv
b3QgaXMgYW4gYW5jZXN0b3IgZm9ybWF0dGluZyByb290LgotICAgICAgICAgICAgaWYgKGlzPElu
aXRpYWxDb250YWluaW5nQmxvY2s+KGxheW91dEJveCkpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7Ci0gICAgICAgICAgICBhdXRvJiB0YXJnZXRGb3JtYXR0aW5nUm9vdCA9IGxheW91dEJv
eC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKLSAgICAgICAgICAgIGF1dG8qIGFuY2VzdG9yRm9y
bWF0dGluZ0NvbnRleHRSb290ID0gJnJvb3QoKS5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKLSAg
ICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCZ0YXJnZXRGb3Jt
YXR0aW5nUm9vdCA9PSBhbmNlc3RvckZvcm1hdHRpbmdDb250ZXh0Um9vdCkKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgYW5jZXN0b3JGb3JtYXR0aW5n
Q29udGV4dFJvb3QgPSAmYW5jZXN0b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QtPmZvcm1hdHRpbmdD
b250ZXh0Um9vdCgpOwotICAgICAgICAgICAgICAgIGlmIChpczxJbml0aWFsQ29udGFpbmluZ0Js
b2NrPigqYW5jZXN0b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QpKQotICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgfQotCi0gICAgICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNvbjo6
VGFibGVOZWVkc0FjY2Vzc1RvVGFibGVXcmFwcGVyKSB7Ci0gICAgICAgICAgICAvLyBUYWJsZXMg
YXJlIHdyYXBwZWQgaW4gYSAyIGxldmVsIGZvcm1hdHRpbmcgY29udGV4dCBzdHJ1Y3R1cmUuIEEg
PHRhYmxlPiBlbGVtZW50IGluaXRpYXRlcyBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBmb3Ig
aXRzIHByaW5jaXBhbCB0YWJsZSBib3gKLSAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBjYXB0aW9u
IGFuZCB0aGUgdGFibGUgY29udGVudCBsaXZlLiBJdCBhbHNvIGluaXRpYXRlcyBhIHRhYmxlIHdy
YXBwZXIgYm94IHdoaWNoIGVzdGFibGlzaGVzIHRoZSB0YWJsZSBmb3JtYXR0aW5nIGNvbnRleHQu
Ci0gICAgICAgICAgICAvLyBJbiBtYW55IGNhc2VzIHRoZSBURkMgbmVlZHMgYWNjZXNzIHRvIHRo
ZSBwYXJlbnQgKGdlbmVyYXRlZCkgQkZDLgotICAgICAgICAgICAgcmV0dXJuICZsYXlvdXRCb3gg
PT0gJnJvb3QoKS5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKLSAgICAgICAgfQotCi0gICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfTsKLSNl
bmRpZgotICAgIEFTU0VSVChpc09rVG9BY2Nlc3NCb3hHZW9tZXRyeSgpKTsKLSAgICBBU1NFUlQo
bGF5b3V0U3RhdGUoKS5oYXNCb3hHZW9tZXRyeShsYXlvdXRCb3gpKTsKLSAgICByZXR1cm4gbGF5
b3V0U3RhdGUoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwotfQotCi12b2lkIEZvcm1hdHRp
bmdDb250ZXh0Ojpjb2xsZWN0T3V0T2ZGbG93RGVzY2VuZGFudHNJZk5lZWRlZCgpCi17Ci0gICAg
aWYgKCFmb3JtYXR0aW5nU3RhdGUoKS5vdXRPZkZsb3dCb3hlcygpLmlzRW1wdHkoKSkKLSAgICAg
ICAgcmV0dXJuOwotICAgIGF1dG8mIHJvb3QgPSB0aGlzLT5yb290KCk7Ci0gICAgaWYgKCFyb290
Lmhhc0NoaWxkKCkpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoIXJvb3QuaXNQb3NpdGlvbmVk
KCkgJiYgIWlzPEluaXRpYWxDb250YWluaW5nQmxvY2s+KHJvb3QpKQotICAgICAgICByZXR1cm47
Ci0gICAgLy8gQ29sbGVjdCB0aGUgb3V0LW9mLWZsb3cgZGVzY2VuZGFudHMgYXQgdGhlIGZvcm1h
dHRpbmcgcm9vdCBsZXZlbCAoYXMgb3Bwb3NlZCB0byBhdCB0aGUgY29udGFpbmluZyBibG9jayBs
ZXZlbCwgdGhvdWdoIHRoZXkgbWlnaHQgYmUgdGhlIHNhbWUpLgotICAgIC8vIEZJWE1FOiBUdXJu
IHRoaXMgaW50byBhIHJlZ2lzdGVyLXNlbGYgYXMgYm94ZXMgYXJlIGJlaW5nIGluc2VydGVkLgot
ICAgIGZvciAoYXV0byYgZGVzY2VuZGFudCA6IGRlc2NlbmRhbnRzT2ZUeXBlPEJveD4ocm9vdCkp
IHsKLSAgICAgICAgaWYgKCFkZXNjZW5kYW50LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmICgmZGVzY2VuZGFudC5mb3JtYXR0aW5nQ29u
dGV4dFJvb3QoKSAhPSAmcm9vdCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBmb3Jt
YXR0aW5nU3RhdGUoKS5hZGRPdXRPZkZsb3dCb3goZGVzY2VuZGFudCk7Ci0gICAgfQotfQotCi0j
aWZuZGVmIE5ERUJVRwotdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6dmFsaWRhdGVHZW9tZXRyeUNv
bnN0cmFpbnRzQWZ0ZXJMYXlvdXQoKSBjb25zdAotewotICAgIGF1dG8mIGZvcm1hdHRpbmdDb250
ZXh0Um9vdCA9IHJvb3QoKTsKLSAgICAvLyBGSVhNRTogYWRkIGEgZGVzY2VuZGFudHNPZlR5cGU8
PiBmbGF2b3IgdGhhdCBzdG9wcyBhdCBuZXN0ZWQgZm9ybWF0dGluZyBjb250ZXh0cwotICAgIGZv
ciAoYXV0byYgbGF5b3V0Qm94IDogZGVzY2VuZGFudHNPZlR5cGU8Qm94Pihmb3JtYXR0aW5nQ29u
dGV4dFJvb3QpKSB7Ci0gICAgICAgIGlmICgmbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9v
dCgpICE9ICZmb3JtYXR0aW5nQ29udGV4dFJvb3QpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrR2VvbWV0cnkgPSBnZW9tZXRyeUZvckJveChsYXlv
dXRCb3guY29udGFpbmluZ0Jsb2NrKCkpOwotICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGdl
b21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0KLSAgICAgICAgLy8gMTAuMy4zIEJsb2NrLWxldmVs
LCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cKLSAgICAgICAgLy8gMTAuMy43
IEFic29sdXRlbHkgcG9zaXRpb25lZCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzCi0gICAgICAgIGlm
ICgobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpIHx8IGxheW91dEJveC5pc091dE9mRmxvd1Bv
c2l0aW9uZWQoKSkgJiYgIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpIHsKLSAgICAgICAgICAg
IC8vIG1hcmdpbi1sZWZ0ICsgYm9yZGVyLWxlZnQtd2lkdGggKyBwYWRkaW5nLWxlZnQgKyB3aWR0
aCArIHBhZGRpbmctcmlnaHQgKyBib3JkZXItcmlnaHQtd2lkdGggKyBtYXJnaW4tcmlnaHQgPSB3
aWR0aCBvZiBjb250YWluaW5nIGJsb2NrCi0gICAgICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9j
a1dpZHRoID0gY29udGFpbmluZ0Jsb2NrR2VvbWV0cnkuY29udGVudEJveFdpZHRoKCk7Ci0gICAg
ICAgICAgICBBU1NFUlQoYm94R2VvbWV0cnkuaG9yaXpvbnRhbE1hcmdpbkJvcmRlckFuZFBhZGRp
bmcoKSArIGJveEdlb21ldHJ5LmNvbnRlbnRCb3hXaWR0aCgpID09IGNvbnRhaW5pbmdCbG9ja1dp
ZHRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDEwLjYuNCBBYnNvbHV0ZWx5IHBvc2l0aW9u
ZWQsIG5vbi1yZXBsYWNlZCBlbGVtZW50cwotICAgICAgICBpZiAobGF5b3V0Qm94LmlzT3V0T2ZG
bG93UG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKSB7Ci0gICAgICAg
ICAgICAvLyB0b3AgKyBtYXJnaW4tdG9wICsgYm9yZGVyLXRvcC13aWR0aCArIHBhZGRpbmctdG9w
ICsgaGVpZ2h0ICsgcGFkZGluZy1ib3R0b20gKyBib3JkZXItYm90dG9tLXdpZHRoICsgbWFyZ2lu
LWJvdHRvbSArIGJvdHRvbSA9IGhlaWdodCBvZiBjb250YWluaW5nIGJsb2NrCi0gICAgICAgICAg
ICBhdXRvIGNvbnRhaW5pbmdCbG9ja0hlaWdodCA9IGNvbnRhaW5pbmdCbG9ja0dlb21ldHJ5LmNv
bnRlbnRCb3hIZWlnaHQoKTsKLSAgICAgICAgICAgIEFTU0VSVChCb3hHZW9tZXRyeTo6Ym9yZGVy
Qm94VG9wKGJveEdlb21ldHJ5KSArIGJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpICsgYm94R2Vv
bWV0cnkuYm9yZGVyVG9wKCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKSAr
IGJveEdlb21ldHJ5LmNvbnRlbnRCb3hIZWlnaHQoKQotICAgICAgICAgICAgICAgICsgYm94R2Vv
bWV0cnkucGFkZGluZ0JvdHRvbSgpLnZhbHVlT3IoMCkgKyBib3hHZW9tZXRyeS5ib3JkZXJCb3R0
b20oKSArIGJveEdlb21ldHJ5Lm1hcmdpbkFmdGVyKCkgPT0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0
KTsKLSAgICAgICAgfQotICAgIH0KLX0KLSNlbmRpZgotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdDb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDcxMTAyNTU4OGVjNGEwM2Q5ZTM1YTBhYzkzMGE3NzZjNjIzZjg0NDQuLjAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L0Zvcm1hdHRpbmdDb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAot
LyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5H
X0NPTlRFWFQpCi0KLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJM
YXlvdXRVbml0LmgiCi0jaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKLSNpbmNsdWRlIDx3dGYvSXNv
TWFsbG9jLmg+Ci0jaW5jbHVkZSA8d3RmL1dlYWtQdHIuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUg
ewotCi1jbGFzcyBMYXlvdXRTaXplOwotc3RydWN0IExlbmd0aDsKLQotbmFtZXNwYWNlIExheW91
dCB7Ci0KLWNsYXNzIEJveEdlb21ldHJ5OwotY2xhc3MgUmVwbGFjZWRCb3g7Ci1zdHJ1Y3QgQ29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luOwotc3RydWN0IENvbXB1dGVkVmVydGljYWxNYXJnaW47Ci1j
bGFzcyBDb250YWluZXJCb3g7Ci1zdHJ1Y3QgQ29udGVudEhlaWdodEFuZE1hcmdpbjsKLXN0cnVj
dCBDb250ZW50V2lkdGhBbmRNYXJnaW47Ci1zdHJ1Y3QgRWRnZXM7Ci1jbGFzcyBGb3JtYXR0aW5n
U3RhdGU7Ci1zdHJ1Y3QgSG9yaXpvbnRhbEdlb21ldHJ5OwotY2xhc3MgSW52YWxpZGF0aW9uU3Rh
dGU7Ci1jbGFzcyBMYXlvdXRTdGF0ZTsKLXN0cnVjdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVl
czsKLXN0cnVjdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXM7Ci1zdHJ1Y3QgVmVydGljYWxHZW9t
ZXRyeTsKLQotY2xhc3MgRm9ybWF0dGluZ0NvbnRleHQgewotICAgIFdURl9NQUtFX0lTT19BTExP
Q0FURUQoRm9ybWF0dGluZ0NvbnRleHQpOwotcHVibGljOgotICAgIEZvcm1hdHRpbmdDb250ZXh0
KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBGb3JtYXR0aW5nU3Rh
dGUmKTsKLSAgICB2aXJ0dWFsIH5Gb3JtYXR0aW5nQ29udGV4dCgpOwotCi0gICAgc3RydWN0IENv
bnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCB7Ci0gICAgICAgIEhvcml6b250YWxDb25zdHJhaW50
cyBob3Jpem9udGFsOwotICAgICAgICBWZXJ0aWNhbENvbnN0cmFpbnRzIHZlcnRpY2FsOwotICAg
IH07Ci0gICAgdmlydHVhbCB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3Rh
dGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSA9IDA7Ci0KLSAgICBzdHJ1
Y3QgQ29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50IHsKLSAgICAgICAgSG9yaXpvbnRhbENv
bnN0cmFpbnRzIGhvcml6b250YWw7Ci0gICAgICAgIFZlcnRpY2FsQ29uc3RyYWludHMgdmVydGlj
YWw7Ci0gICAgICAgIC8vIEJvcmRlcnMgYW5kIHBhZGRpbmcgYXJlIHJlc29sdmVkIGFnYWluc3Qg
dGhlIGNvbnRhaW5pbmcgYmxvY2sncyBjb250ZW50IGJveCBhcyBpZiB0aGUgYm94IHdhcyBhbiBp
bi1mbG93IGJveC4KLSAgICAgICAgTGF5b3V0VW5pdCBib3JkZXJBbmRQYWRkaW5nQ29uc3RyYWlu
dHM7Ci0gICAgfTsKLSAgICB2b2lkIGxheW91dE91dE9mRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9u
U3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQmKTsKLQotICAgIHN0
cnVjdCBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsKLSAgICAgICAgdm9pZCBleHBhbmQoTGF5
b3V0VW5pdCBob3Jpem9udGFsVmFsdWUpOwotICAgICAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzJiBvcGVyYXRvcis9KGNvbnN0IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmKTsKLSAgICAg
ICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3BlcmF0b3IrPShMYXlvdXRVbml0KTsKLSAg
ICAgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3BlcmF0b3ItPShjb25zdCBJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzJik7Ci0gICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMm
IG9wZXJhdG9yLT0oTGF5b3V0VW5pdCk7Ci0KLSAgICAgICAgTGF5b3V0VW5pdCBtaW5pbXVtOwot
ICAgICAgICBMYXlvdXRVbml0IG1heGltdW07Ci0gICAgfTsKLSAgICB2aXJ0dWFsIEludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgPSAw
OwotICAgIHZpcnR1YWwgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0ID0gMDsK
LQotICAgIGJvb2wgaXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9v
dCgpLmVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpOyB9Ci0gICAgYm9vbCBpc0lu
bGluZUZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFibGlzaGVz
SW5saW5lRm9ybWF0dGluZ0NvbnRleHQoKTsgfQotICAgIGJvb2wgaXNUYWJsZUZvcm1hdHRpbmdD
b250ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFibGlzaGVzVGFibGVGb3JtYXR0aW5n
Q29udGV4dCgpOyB9Ci0gICAgYm9vbCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQoKSBjb25zdCB7IHJldHVybiBpc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSAmJiByb290KCku
aXNUYWJsZVdyYXBwZXJCb3goKTsgfQotICAgIGJvb2wgaXNGbGV4Rm9ybWF0dGluZ0NvbnRleHQo
KSBjb25zdCB7IHJldHVybiByb290KCkuZXN0YWJsaXNoZXNGbGV4Rm9ybWF0dGluZ0NvbnRleHQo
KTsgfQotCi0gICAgZW51bSBjbGFzcyBFc2NhcGVSZWFzb24gewotICAgICAgICBUYWJsZVF1aXJr
TmVlZHNHZW9tZXRyeUZyb21Fc3RhYmxpc2hlZEZvcm1hdHRpbmdDb250ZXh0LAotICAgICAgICBP
dXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5LAotICAgICAgICBGbG9hdEJveElzQWx3YXlz
UmVsYXRpdmVUb0Zsb2F0U3RhdGVSb290LAotICAgICAgICBGaW5kRml4ZWRIZWlnaHRBbmNlc3Rv
clF1aXJrLAotICAgICAgICBEb2N1bWVudEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaywKLSAg
ICAgICAgQm9keVN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaywKLSAgICAgICAgVGFibGVOZWVkc0Fj
Y2Vzc1RvVGFibGVXcmFwcGVyCi0gICAgfTsKLSAgICBjb25zdCBCb3hHZW9tZXRyeSYgZ2VvbWV0
cnlGb3JCb3goY29uc3QgQm94JiwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiA9IFdURjo6bnVsbG9w
dCkgY29uc3Q7Ci0gICAgY29uc3QgQ29udGFpbmVyQm94JiByb290KCkgY29uc3QgeyByZXR1cm4g
Km1fcm9vdDsgfQotCi0gICAgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgY29uc3Q7Ci0KLXBy
b3RlY3RlZDoKLSAgICB1c2luZyBMYXlvdXRRdWV1ZSA9IFZlY3Rvcjxjb25zdCBCb3gqPjsKLQot
ICAgIGNvbnN0IEZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKCkgY29uc3QgeyByZXR1
cm4gbV9mb3JtYXR0aW5nU3RhdGU7IH0KLSAgICBGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdT
dGF0ZSgpIHsgcmV0dXJuIG1fZm9ybWF0dGluZ1N0YXRlOyB9Ci0KLSAgICB2b2lkIGNvbXB1dGVC
b3JkZXJBbmRQYWRkaW5nKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYp
OwotCi0jaWZuZGVmIE5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZUdlb21ldHJ5Q29u
c3RyYWludHNBZnRlckxheW91dCgpIGNvbnN0OwotI2VuZGlmCi0KLSAgICAvLyBUaGlzIGNsYXNz
IGltcGxlbWVudHMgZ2VuZXJpYyBwb3NpdGlvbmluZyBhbmQgc2l6aW5nLgotICAgIGNsYXNzIEdl
b21ldHJ5IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFZlcnRpY2FsR2VvbWV0cnkgb3V0T2ZGbG93
VmVydGljYWxHZW9tZXRyeShjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMm
LCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFs
dWVzJikgY29uc3Q7Ci0gICAgICAgIEhvcml6b250YWxHZW9tZXRyeSBvdXRPZkZsb3dIb3Jpem9u
dGFsR2VvbWV0cnkoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29u
c3QgVmVydGljYWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVz
Jik7Ci0KLSAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBmbG9hdGluZ0NvbnRlbnRIZWln
aHRBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29u
c3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7Ci0gICAgICAgIENvbnRlbnRXaWR0
aEFuZE1hcmdpbiBmbG9hdGluZ0NvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVl
cyYpOwotCi0gICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5saW5lUmVwbGFjZWRDb250
ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiwgT3B0aW9uYWw8VmVydGljYWxDb25zdHJhaW50cz4sIGNvbnN0IE92ZXJyaWRk
ZW5WZXJ0aWNhbFZhbHVlcyYpIGNvbnN0OwotICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4g
aW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmLCBj
b25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBPcHRpb25hbDxWZXJ0aWNhbENvbnN0cmFpbnRz
PiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKLQotICAgICAgICBMYXlvdXRT
aXplIGluRmxvd1Bvc2l0aW9uZWRQb3NpdGlvbk9mZnNldChjb25zdCBCb3gmLCBjb25zdCBIb3Jp
em9udGFsQ29uc3RyYWludHMmKSBjb25zdDsKLQotICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFy
Z2luIGNvbXBsaWNhdGVkQ2FzZXMoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7Ci0gICAgICAgIExh
eW91dFVuaXQgc2hyaW5rVG9GaXRXaWR0aChjb25zdCBCb3gmLCBMYXlvdXRVbml0IGF2YWlsYWJs
ZVdpZHRoKTsKLQotICAgICAgICBFZGdlcyBjb21wdXRlZEJvcmRlcihjb25zdCBCb3gmKSBjb25z
dDsKLSAgICAgICAgT3B0aW9uYWw8RWRnZXM+IGNvbXB1dGVkUGFkZGluZyhjb25zdCBCb3gmLCBM
YXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSBjb25zdDsKLQotICAgICAgICBDb21wdXRl
ZEhvcml6b250YWxNYXJnaW4gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKGNvbnN0IEJveCYsIGNv
bnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpIGNvbnN0OwotICAgICAgICBDb21wdXRlZFZlcnRp
Y2FsTWFyZ2luIGNvbXB1dGVkVmVydGljYWxNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJikgY29uc3Q7Ci0KLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4g
Y29tcHV0ZWRWYWx1ZShjb25zdCBMZW5ndGgmIGdlb21ldHJ5UHJvcGVydHksIExheW91dFVuaXQg
Y29udGFpbmluZ0Jsb2NrV2lkdGgpIGNvbnN0OwotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0
PiBmaXhlZFZhbHVlKGNvbnN0IExlbmd0aCYgZ2VvbWV0cnlQcm9wZXJ0eSkgY29uc3Q7Ci0KLSAg
ICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRNaW5IZWlnaHQoY29uc3QgQm94Jiwg
T3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RGOjpudWxsb3B0
KSBjb25zdDsKLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRNYXhIZWlnaHQo
Y29uc3QgQm94JiwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0g
V1RGOjpudWxsb3B0KSBjb25zdDsKLQotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21w
dXRlZE1pbldpZHRoKGNvbnN0IEJveCYsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgp
OwotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZE1heFdpZHRoKGNvbnN0IEJv
eCYsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotCi0gICAgICAgIEZvcm1hdHRp
bmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbnN0cmFpbkJ5TWluTWF4V2lk
dGgoY29uc3QgQm94JiwgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cykgY29uc3Q7Ci0KLSAgICAg
ICAgTGF5b3V0VW5pdCBjb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KGNvbnN0
IENvbnRhaW5lckJveCYpIGNvbnN0OwotCi0gICAgICAgIENvbnN0cmFpbnRzRm9yT3V0T2ZGbG93
Q29udGVudCBjb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29uc3QgQ29udGFpbmVyQm94
Jik7Ci0gICAgICAgIENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBjb25zdHJhaW50c0Zvcklu
Rmxvd0NvbnRlbnQoY29uc3QgQ29udGFpbmVyQm94JiwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiA9
IFdURjo6bnVsbG9wdCk7Ci0KLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRI
ZWlnaHQoY29uc3QgQm94JiwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVp
Z2h0ID0gV1RGOjpudWxsb3B0KSBjb25zdDsKLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4g
Y29tcHV0ZWRXaWR0aChjb25zdCBCb3gmLCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRo
KTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgZnJpZW5kIGNsYXNzIEZvcm1hdHRpbmdDb250
ZXh0OwotICAgICAgICBHZW9tZXRyeShjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0gICAg
ICAgIGNvbnN0IExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9y
bWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQotICAgICAgICBMYXlvdXRTdGF0ZSYgbGF5
b3V0U3RhdGUoKSB7IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0LmxheW91dFN0YXRlKCk7IH0K
LSAgICAgICAgY29uc3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29u
c3QgeyByZXR1cm4gbV9mb3JtYXR0aW5nQ29udGV4dDsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAg
ICAgVmVydGljYWxHZW9tZXRyeSBvdXRPZkZsb3dSZXBsYWNlZFZlcnRpY2FsR2VvbWV0cnkoY29u
c3QgUmVwbGFjZWRCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBWZXJ0
aWNhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7
Ci0gICAgICAgIEhvcml6b250YWxHZW9tZXRyeSBvdXRPZkZsb3dSZXBsYWNlZEhvcml6b250YWxH
ZW9tZXRyeShjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYs
IGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZh
bHVlcyYpOwotCi0gICAgICAgIFZlcnRpY2FsR2VvbWV0cnkgb3V0T2ZGbG93Tm9uUmVwbGFjZWRW
ZXJ0aWNhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVy
dGljYWxWYWx1ZXMmKSBjb25zdDsKLSAgICAgICAgSG9yaXpvbnRhbEdlb21ldHJ5IG91dE9mRmxv
d05vblJlcGxhY2VkSG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0
IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVz
Jik7Ci0KLSAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBmbG9hdGluZ1JlcGxhY2VkQ29u
dGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpIGNvbnN0OwotICAg
ICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRXaWR0aEFu
ZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYs
IGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0KLSAgICAgICAgQ29udGVudFdp
ZHRoQW5kTWFyZ2luIGZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29u
c3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhv
cml6b250YWxWYWx1ZXMmKTsKLQotICAgICAgICBMYXlvdXRVbml0IHN0YXRpY1ZlcnRpY2FsUG9z
aXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYsIGNvbnN0IFZlcnRpY2FsQ29u
c3RyYWludHMmKSBjb25zdDsKLSAgICAgICAgTGF5b3V0VW5pdCBzdGF0aWNIb3Jpem9udGFsUG9z
aXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYpIGNvbnN0OwotCi0gICAgICAgIGVudW0gY2xhc3MgSGVpZ2h0VHlwZSB7IE1p
biwgTWF4LCBOb3JtYWwgfTsKLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRI
ZWlnaHRWYWx1ZShjb25zdCBCb3gmLCBIZWlnaHRUeXBlLCBPcHRpb25hbDxMYXlvdXRVbml0PiBj
b250YWluaW5nQmxvY2tIZWlnaHQpIGNvbnN0OwotCi0gICAgICAgIGVudW0gY2xhc3MgV2lkdGhU
eXBlIHsgTWluLCBNYXgsIE5vcm1hbCB9OwotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBj
b21wdXRlZFdpZHRoVmFsdWUoY29uc3QgQm94JiwgV2lkdGhUeXBlLCBMYXlvdXRVbml0IGNvbnRh
aW5pbmdCbG9ja1dpZHRoKTsKLQotICAgICAgICBjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgbV9m
b3JtYXR0aW5nQ29udGV4dDsKLSAgICB9OwotICAgIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRy
eSBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlzKTsgfQotCi0gICAgY2xh
c3MgUXVpcmtzIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFF1aXJrcyhjb25zdCBGb3JtYXR0aW5n
Q29udGV4dCYpOwotCi0gICAgICAgIExheW91dFVuaXQgaGVpZ2h0VmFsdWVPZk5lYXJlc3RDb250
YWluaW5nQmxvY2tXaXRoRml4ZWRIZWlnaHQoY29uc3QgQm94Jik7Ci0KLSAgICBwcm90ZWN0ZWQ6
Ci0gICAgICAgIGNvbnN0IExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJu
IG1fZm9ybWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQotICAgICAgICBMYXlvdXRTdGF0
ZSYgbGF5b3V0U3RhdGUoKSB7IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0LmxheW91dFN0YXRl
KCk7IH0KLSAgICAgICAgY29uc3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0
KCkgY29uc3QgeyByZXR1cm4gbV9mb3JtYXR0aW5nQ29udGV4dDsgfQotCi0gICAgICAgIGNvbnN0
IEZvcm1hdHRpbmdDb250ZXh0JiBtX2Zvcm1hdHRpbmdDb250ZXh0OwotICAgIH07Ci0gICAgRm9y
bWF0dGluZ0NvbnRleHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRo
aXMpOyB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBjb2xsZWN0T3V0T2ZGbG93RGVzY2VuZGFudHNJ
Zk5lZWRlZCgpOwotICAgIHZvaWQgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoY29u
c3QgQm94JiwgY29uc3QgQ29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50Jik7Ci0gICAgdm9p
ZCBjb21wdXRlT3V0T2ZGbG93SG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0IEJveCYsIGNvbnN0IENv
bnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCYpOwotCi0gICAgV2Vha1B0cjxjb25zdCBDb250
YWluZXJCb3g+IG1fcm9vdDsKLSAgICBGb3JtYXR0aW5nU3RhdGUmIG1fZm9ybWF0dGluZ1N0YXRl
OwotfTsKLQotaW5saW5lIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6R2VvbWV0cnkoY29u
c3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KQotICAgIDogbV9mb3JtYXR0
aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dCkKLXsKLX0KLQotaW5saW5lIEZvcm1hdHRpbmdD
b250ZXh0OjpRdWlya3M6OlF1aXJrcyhjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGlu
Z0NvbnRleHQpCi0gICAgOiBtX2Zvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0KQot
ewotfQotCi1pbmxpbmUgdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25z
dHJhaW50czo6ZXhwYW5kKExheW91dFVuaXQgaG9yaXpvbnRhbFZhbHVlKQotewotICAgIG1pbmlt
dW0gKz0gaG9yaXpvbnRhbFZhbHVlOwotICAgIG1heGltdW0gKz0gaG9yaXpvbnRhbFZhbHVlOwot
fQotCi1pbmxpbmUgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMm
IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOjpvcGVyYXRvcis9
KGNvbnN0IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIG90aGVyKQotewotICAgIG1pbmltdW0g
Kz0gb3RoZXIubWluaW11bTsKLSAgICBtYXhpbXVtICs9IG90aGVyLm1heGltdW07Ci0gICAgcmV0
dXJuICp0aGlzOwotfQotCi1pbmxpbmUgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMmIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
OjpvcGVyYXRvcis9KExheW91dFVuaXQgdmFsdWUpCi17Ci0gICAgZXhwYW5kKHZhbHVlKTsKLSAg
ICByZXR1cm4gKnRoaXM7Ci19Ci0KLWlubGluZSBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2lj
V2lkdGhDb25zdHJhaW50cyYgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHM6Om9wZXJhdG9yLT0oY29uc3QgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3RoZXIp
Ci17Ci0gICAgbWluaW11bSAtPSBvdGhlci5taW5pbXVtOwotICAgIG1heGltdW0gLT0gb3RoZXIu
bWF4aW11bTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLWlubGluZSBGb3JtYXR0aW5nQ29udGV4
dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHM6Om9wZXJhdG9yLT0oTGF5b3V0VW5pdCB2YWx1ZSkKLXsKLSAgICBl
eHBhbmQoLXZhbHVlKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLX0KLX0KLQotI2RlZmluZSBT
UEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoVG9WYWx1ZVR5
cGVOYW1lLCBwcmVkaWNhdGUpIFwKLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfQkVHSU4oV2ViQ29y
ZTo6TGF5b3V0OjpUb1ZhbHVlVHlwZU5hbWUpIFwKLSAgICBzdGF0aWMgYm9vbCBpc1R5cGUoY29u
c3QgV2ViQ29yZTo6TGF5b3V0OjpGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQp
IHsgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0LnByZWRpY2F0ZTsgfSBcCi1TUEVDSUFMSVpFX1RZ
UEVfVFJBSVRTX0VORCgpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0
L0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCA5ZWIxOTY1N2I4YmU3MTk5YWEzZmZjMjA2ZjU3MjFhNzJjZDYyYzgxLi4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9Gb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNjUg
KzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0g
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
LSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
Ci0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
LSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0g
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJGb3Jt
YXR0aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQp
Ci0KLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkZsZXhGb3Jt
YXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJGbG9hdGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJG
bG9hdGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5j
bHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5n
QmxvY2suaCIKLSNpbmNsdWRlICJMYXlvdXRSZXBsYWNlZEJveC5oIgotI2luY2x1ZGUgIkxvZ2dp
bmcuaCIKLSNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdTdGF0ZS5oIgotCi1uYW1lc3BhY2UgV2Vi
Q29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotc3RhdGljIGlubGluZSBib29sIGlzSGVpZ2h0
QXV0byhjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICAvLyAxMC41IENvbnRlbnQgaGVpZ2h0
OiB0aGUgJ2hlaWdodCcgcHJvcGVydHkKLSAgICAvLwotICAgIC8vIFRoZSBwZXJjZW50YWdlIGlz
IGNhbGN1bGF0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBoZWlnaHQgb2YgdGhlIGdlbmVyYXRlZCBi
b3gncyBjb250YWluaW5nIGJsb2NrLgotICAgIC8vIElmIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRh
aW5pbmcgYmxvY2sgaXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5IChpLmUuLCBpdCBkZXBlbmRz
IG9uIGNvbnRlbnQgaGVpZ2h0KSwKLSAgICAvLyBhbmQgdGhpcyBlbGVtZW50IGlzIG5vdCBhYnNv
bHV0ZWx5IHBvc2l0aW9uZWQsIHRoZSB1c2VkIGhlaWdodCBpcyBjYWxjdWxhdGVkIGFzIGlmICdh
dXRvJyB3YXMgc3BlY2lmaWVkLgotCi0gICAgYXV0byBoZWlnaHQgPSBsYXlvdXRCb3guc3R5bGUo
KS5sb2dpY2FsSGVpZ2h0KCk7Ci0gICAgaWYgKGhlaWdodC5pc0F1dG8oKSkKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0KLSAgICBpZiAoaGVpZ2h0LmlzUGVyY2VudCgpKSB7Ci0gICAgICAgIGlmIChs
YXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICAgICAgcmV0dXJuICFsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkuc3R5bGUo
KS5sb2dpY2FsSGVpZ2h0KCkuaXNGaXhlZCgpOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsK
LX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpj
b21wdXRlZEhlaWdodFZhbHVlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBIZWlnaHRUeXBlIGhlaWdo
dFR5cGUsIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbnRhaW5pbmdCbG9ja0hlaWdodCkgY29uc3QK
LXsKLSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIGF1dG8gaGVpZ2h0
ID0gaGVpZ2h0VHlwZSA9PSBIZWlnaHRUeXBlOjpOb3JtYWwgPyBzdHlsZS5sb2dpY2FsSGVpZ2h0
KCkgOiBoZWlnaHRUeXBlID09IEhlaWdodFR5cGU6Ok1pbiA/IHN0eWxlLmxvZ2ljYWxNaW5IZWln
aHQoKSA6IHN0eWxlLmxvZ2ljYWxNYXhIZWlnaHQoKTsKLSAgICBpZiAoaGVpZ2h0LmlzVW5kZWZp
bmVkKCkgfHwgaGVpZ2h0LmlzQXV0bygpIHx8IGhlaWdodC5pc01heENvbnRlbnQoKSB8fCBoZWln
aHQuaXNNaW5Db250ZW50KCkgfHwgaGVpZ2h0LmlzRml0Q29udGVudCgpKQotICAgICAgICByZXR1
cm4geyB9OwotCi0gICAgaWYgKGhlaWdodC5pc0ZpeGVkKCkpCi0gICAgICAgIHJldHVybiBMYXlv
dXRVbml0IHsgaGVpZ2h0LnZhbHVlKCkgfTsKLQotICAgIGlmICghY29udGFpbmluZ0Jsb2NrSGVp
Z2h0KSB7Ci0gICAgICAgIGlmIChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpKQotICAgICAg
ICAgICAgY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3Mo
KS5oZWlnaHRWYWx1ZU9mTmVhcmVzdENvbnRhaW5pbmdCbG9ja1dpdGhGaXhlZEhlaWdodChsYXlv
dXRCb3gpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGF1dG8gbm9uQW5vbnltb3VzQ29u
dGFpbmluZ0Jsb2NrTG9naWNhbEhlaWdodCA9IFsmXSB7Ci0gICAgICAgICAgICAgICAgLy8gV2hl
biB0aGUgYmxvY2sgbGV2ZWwgYm94IGlzIGEgZGlyZWN0IGNoaWxkIG9mIGFuIGlubGluZSBsZXZl
bCBib3ggKDxzcGFuPjxkaXY+PC9kaXY+PC9zcGFuPikgYW5kIHdlIHdyYXAgaXQgaW50byBhIGNv
bnRpbnVhdGlvbiwKLSAgICAgICAgICAgICAgICAvLyB0aGUgY29udGFpbmluZyBibG9jayAoYW5v
bnltb3VzIHdyYXBwZXIpIGlzIG5vdCB0aGUgYm94IHdlIG5lZWQgdG8gY2hlY2sgZm9yIGZpeGVk
IGhlaWdodC4KLSAgICAgICAgICAgICAgICBhdXRvJiBpbml0aWFsQ29udGFpbmluZ0Jsb2NrID0g
bGF5b3V0Qm94LmluaXRpYWxDb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgICAgICBmb3Ig
KGF1dG8qIGNvbnRhaW5pbmdCbG9jayA9ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7IGNv
bnRhaW5pbmdCbG9jayAhPSAmaW5pdGlhbENvbnRhaW5pbmdCbG9jazsgY29udGFpbmluZ0Jsb2Nr
ID0gJmNvbnRhaW5pbmdCbG9jay0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKGNvbnRhaW5pbmdCbG9jay0+aXNBbm9ueW1vdXMoKSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmlu
Z0Jsb2NrLT5zdHlsZSgpLmxvZ2ljYWxIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgcmV0dXJuIGluaXRpYWxDb250YWluaW5nQmxvY2suc3R5bGUoKS5sb2dpY2Fs
SGVpZ2h0KCk7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgY29udGFpbmluZ0Jsb2NrSGVp
Z2h0ID0gZml4ZWRWYWx1ZShub25Bbm9ueW1vdXNDb250YWluaW5nQmxvY2tMb2dpY2FsSGVpZ2h0
KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFjb250YWluaW5nQmxvY2tIZWlnaHQp
Ci0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICByZXR1cm4gdmFsdWVGb3JMZW5ndGgoaGVpZ2h0
LCAqY29udGFpbmluZ0Jsb2NrSGVpZ2h0KTsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZEhlaWdodChjb25zdCBCb3gmIGxheW91
dEJveCwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSBjb25zdAot
ewotICAgIGlmIChhdXRvIGhlaWdodCA9IGNvbXB1dGVkSGVpZ2h0VmFsdWUobGF5b3V0Qm94LCBI
ZWlnaHRUeXBlOjpOb3JtYWwsIGNvbnRhaW5pbmdCbG9ja0hlaWdodCkpIHsKLSAgICAgICAgaWYg
KGxheW91dEJveC5zdHlsZSgpLmJveFNpemluZygpID09IEJveFNpemluZzo6Q29udGVudEJveCkK
LSAgICAgICAgICAgIHJldHVybiBoZWlnaHQ7Ci0gICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0g
Zm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwotICAgICAgICBy
ZXR1cm4gKmhlaWdodCAtIChib3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgYm94R2VvbWV0
cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKSk7Ci0gICAgfQotICAgIHJldHVybiB7IH07
Ci19Ci0KLU9wdGlvbmFsPExheW91dFVuaXQ+IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6
Y29tcHV0ZWRXaWR0aFZhbHVlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBXaWR0aFR5cGUgd2lkdGhU
eXBlLCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKQotewotICAgIC8vIEFwcGxpZXMg
dG86IGFsbCBlbGVtZW50cyBleGNlcHQgbm9uLXJlcGxhY2VkIGlubGluZXMgKG91dC1vZi1mbG93
IGNoZWNrIGlzIHJlcXVpcmVkIGZvciBwb3NpdGlvbmVkIDxicj4gYXMgZm9yIHNvbWUgcmVhc29u
IHdlIGRvbid0IGJsb2NraWZ5IHRoZW0pLgotICAgIEFTU0VSVCghbGF5b3V0Qm94LmlzSW5saW5l
Qm94KCkgfHwgbGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKLQotICAgIGF1dG8g
d2lkdGggPSBbJl0gewotICAgICAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwot
ICAgICAgICBzd2l0Y2ggKHdpZHRoVHlwZSkgewotICAgICAgICBjYXNlIFdpZHRoVHlwZTo6Tm9y
bWFsOgotICAgICAgICAgICAgcmV0dXJuIHN0eWxlLmxvZ2ljYWxXaWR0aCgpOwotICAgICAgICBj
YXNlIFdpZHRoVHlwZTo6TWluOgotICAgICAgICAgICAgcmV0dXJuIHN0eWxlLmxvZ2ljYWxNaW5X
aWR0aCgpOwotICAgICAgICBjYXNlIFdpZHRoVHlwZTo6TWF4OgotICAgICAgICAgICAgcmV0dXJu
IHN0eWxlLmxvZ2ljYWxNYXhXaWR0aCgpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gc3R5bGUubG9naWNhbFdpZHRoKCk7Ci0gICAgfSgp
OwotICAgIGlmIChhdXRvIGNvbXB1dGVkVmFsdWUgPSB0aGlzLT5jb21wdXRlZFZhbHVlKHdpZHRo
LCBjb250YWluaW5nQmxvY2tXaWR0aCkpCi0gICAgICAgIHJldHVybiBjb21wdXRlZFZhbHVlOwot
Ci0gICAgaWYgKHdpZHRoLmlzTWluQ29udGVudCgpIHx8IHdpZHRoLmlzTWF4Q29udGVudCgpIHx8
IHdpZHRoLmlzRml0Q29udGVudCgpKSB7Ci0gICAgICAgIGlmICghaXM8Q29udGFpbmVyQm94Pihs
YXlvdXRCb3gpKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgYXV0byYgY29udGFp
bmVyQm94ID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpOwotICAgICAgICAvLyBG
SVhNRTogQ29uc2lkZXIgc3BsaXR0aW5nIHVwIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJh
aW50cyBzbyB0aGF0IHdlIGNvdWxkIGNvbXB1dGVkIHRoZSBtaW4gYW5kIG1heCB2YWx1ZXMgc2Vw
YXJhdGVseS4KLSAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gWyZdIHsK
LSAgICAgICAgICAgIGlmICghY29udGFpbmVyQm94Lmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgp
KQotICAgICAgICAgICAgICAgIHJldHVybiBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgMF9s
dSwgY29udGFpbmluZ0Jsb2NrV2lkdGggfTsKLSAgICAgICAgICAgIEFTU0VSVChjb250YWluZXJC
b3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKLSAgICAgICAgICAgIGF1dG8mIGZv
cm1hdHRpbmdTdGF0ZSA9IGxheW91dFN0YXRlKCkuZW5zdXJlRm9ybWF0dGluZ1N0YXRlKGNvbnRh
aW5lckJveCk7Ci0gICAgICAgICAgICBpZiAoYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
ID0gZm9ybWF0dGluZ1N0YXRlLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4gKmludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Ci0gICAgICAgICAgICBy
ZXR1cm4gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmVyQm94
LCBsYXlvdXRTdGF0ZSgpKS0+Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0g
ICAgICAgIH0oKTsKLSAgICAgICAgaWYgKHdpZHRoLmlzTWluQ29udGVudCgpKQotICAgICAgICAg
ICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bTsKLSAgICAgICAgaWYg
KHdpZHRoLmlzTWF4Q29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMubWF4aW11bTsKLSAgICAgICAgQVNTRVJUKHdpZHRoLmlzRml0Q29udGVudCgp
KTsKLSAgICAgICAgLy8gSWYgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiBhIGdpdmVuIGF4aXMgaXMg
ZGVmaW5pdGUsIGVxdWFsIHRvIG1pbihtYXgtY29udGVudCBzaXplLAotICAgICAgICAvLyBtYXgo
bWluLWNvbnRlbnQgc2l6ZSwgc3RyZXRjaC1maXQgc2l6ZSkpLiBPdGhlcndpc2UsIGVxdWFsIHRv
IHRoZSBtYXgtY29udGVudCBzaXplIGluIHRoYXQgYXhpcy4KLSAgICAgICAgLy8gRklYTUU6IFdl
IGRvbid0IHlldCBoYXZlIGluZGVmaW5pdGUgYXZhaWxhYmxlIHNpemUuCi0gICAgICAgIHJldHVy
biBzdGQ6Om1pbihpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIHN0ZDo6bWF4KGlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpKTsK
LSAgICB9Ci0gICAgcmV0dXJuIHsgfTsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0
dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZFdpZHRoKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKQotewotICAgIGlmIChhdXRvIGNvbXB1
dGVkV2lkdGggPSBjb21wdXRlZFdpZHRoVmFsdWUobGF5b3V0Qm94LCBXaWR0aFR5cGU6Ok5vcm1h
bCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpKSB7Ci0gICAgICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0
Qm94LnN0eWxlKCk7Ci0gICAgICAgIC8vIE5vbi1xdWFudGl0YXRpdmUgdmFsdWVzIHN1Y2ggYXMg
YXV0byBhbmQgbWluLWNvbnRlbnQgYXJlIG5vdCBpbmZsdWVuY2VkIGJ5IHRoZSBib3gtc2l6aW5n
IHByb3BlcnR5LgotICAgICAgICBpZiAoc3R5bGUuYm94U2l6aW5nKCkgPT0gQm94U2l6aW5nOjpD
b250ZW50Qm94IHx8IHN0eWxlLndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKLSAgICAgICAg
ICAgIHJldHVybiBjb21wdXRlZFdpZHRoOwotICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZv
cm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKLSAgICAgICAgcmV0
dXJuICpjb21wdXRlZFdpZHRoIC0gKGJveEdlb21ldHJ5Lmhvcml6b250YWxCb3JkZXIoKSArIGJv
eEdlb21ldHJ5Lmhvcml6b250YWxQYWRkaW5nKCkudmFsdWVPcigwKSk7Ci0gICAgfQotICAgIHJl
dHVybiB7IH07Ci19Ci0KLUxheW91dFVuaXQgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpj
b250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KGNvbnN0IENvbnRhaW5lckJveCYg
Zm9ybWF0dGluZ0NvbnRleHRSb290KSBjb25zdAotewotICAgIEFTU0VSVChmb3JtYXR0aW5nQ29u
dGV4dFJvb3QuZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKLSAgICBBU1NFUlQoaXNI
ZWlnaHRBdXRvKGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgfHwgZm9ybWF0dGluZ0NvbnRleHRSb290
LmVzdGFibGlzaGVzVGFibGVGb3JtYXR0aW5nQ29udGV4dCgpIHx8IGZvcm1hdHRpbmdDb250ZXh0
Um9vdC5pc1RhYmxlQ2VsbCgpKTsKLSAgICBhdXRvIHVzZWRDb250ZW50SGVpZ2h0ID0gTGF5b3V0
VW5pdCB7IH07IAotICAgIGF1dG8gaGFzQ29udGVudCA9IGZvcm1hdHRpbmdDb250ZXh0Um9vdC5o
YXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsKLSAgICAvLyBUaGUgdXNlZCBoZWlnaHQgb2YgdGhl
IGNvbnRhaW5tZW50IGJveCBpcyBkZXRlcm1pbmVkIGFzIGlmIHBlcmZvcm1pbmcgYSBub3JtYWwg
bGF5b3V0IG9mIHRoZSBib3gsIGV4Y2VwdCB0aGF0IGl0IGlzIHRyZWF0ZWQgYXMgaGF2aW5nIG5v
IGNvbnRlbnQuCi0gICAgYXV0byBzaG91bGRJZ25vcmVDb250ZW50ID0gZm9ybWF0dGluZ0NvbnRl
eHRSb290LmlzU2l6ZUNvbnRhaW5tZW50Qm94KCk7Ci0gICAgaWYgKGhhc0NvbnRlbnQgJiYgIXNo
b3VsZElnbm9yZUNvbnRlbnQpCi0gICAgICAgIHVzZWRDb250ZW50SGVpZ2h0ID0gTGF5b3V0Q29u
dGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHRSb290LCBjb25z
dF9jYXN0PExheW91dFN0YXRlJj4obGF5b3V0U3RhdGUoKSkpLT51c2VkQ29udGVudEhlaWdodCgp
OwotICAgIHJldHVybiB1c2VkQ29udGVudEhlaWdodDsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5p
dD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZFZhbHVlKGNvbnN0IExlbmd0
aCYgZ2VvbWV0cnlQcm9wZXJ0eSwgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCkgY29u
c3QKLXsKLSAgICAvLyAgSW4gZ2VuZXJhbCwgdGhlIGNvbXB1dGVkIHZhbHVlIHJlc29sdmVzIHRo
ZSBzcGVjaWZpZWQgdmFsdWUgYXMgZmFyIGFzIHBvc3NpYmxlIHdpdGhvdXQgbGF5aW5nIG91dCB0
aGUgY29udGVudC4KLSAgICBpZiAoZ2VvbWV0cnlQcm9wZXJ0eS5pc0ZpeGVkKCkgfHwgZ2VvbWV0
cnlQcm9wZXJ0eS5pc1BlcmNlbnQoKSB8fCBnZW9tZXRyeVByb3BlcnR5LmlzQ2FsY3VsYXRlZCgp
KQotICAgICAgICByZXR1cm4gdmFsdWVGb3JMZW5ndGgoZ2VvbWV0cnlQcm9wZXJ0eSwgY29udGFp
bmluZ0Jsb2NrV2lkdGgpOwotICAgIHJldHVybiB7IH07Ci19Ci0KLU9wdGlvbmFsPExheW91dFVu
aXQ+IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Zml4ZWRWYWx1ZShjb25zdCBMZW5ndGgm
IGdlb21ldHJ5UHJvcGVydHkpIGNvbnN0Ci17Ci0gICAgaWYgKCFnZW9tZXRyeVByb3BlcnR5Lmlz
Rml4ZWQoKSkKLSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICByZXR1cm4gTGF5b3V0VW5pdCB7IGdl
b21ldHJ5UHJvcGVydHkudmFsdWUoKSB9OwotfQotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIv
Q1NTMjIvdmlzdWRldC5odG1sI21pbi1tYXgtaGVpZ2h0cwotLy8gU3BlY2lmaWVzIGEgcGVyY2Vu
dGFnZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIHVzZWQgdmFsdWUuIFRoZSBwZXJjZW50YWdlIGlzIGNh
bGN1bGF0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBoZWlnaHQgb2YgdGhlIGdlbmVyYXRlZCBib3gn
cyBjb250YWluaW5nIGJsb2NrLgotLy8gSWYgdGhlIGhlaWdodCBvZiB0aGUgY29udGFpbmluZyBi
bG9jayBpcyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHkgKGkuZS4sIGl0IGRlcGVuZHMgb24gY29u
dGVudCBoZWlnaHQpLCBhbmQgdGhpcyBlbGVtZW50IGlzIG5vdCBhYnNvbHV0ZWx5IHBvc2l0aW9u
ZWQsCi0vLyB0aGUgcGVyY2VudGFnZSB2YWx1ZSBpcyB0cmVhdGVkIGFzICcwJyAoZm9yICdtaW4t
aGVpZ2h0Jykgb3IgJ25vbmUnIChmb3IgJ21heC1oZWlnaHQnKS4KLU9wdGlvbmFsPExheW91dFVu
aXQ+IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRNYXhIZWlnaHQoY29uc3Qg
Qm94JiBsYXlvdXRCb3gsIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbnRhaW5pbmdCbG9ja0hlaWdo
dCkgY29uc3QKLXsKLSAgICByZXR1cm4gY29tcHV0ZWRIZWlnaHRWYWx1ZShsYXlvdXRCb3gsIEhl
aWdodFR5cGU6Ok1heCwgY29udGFpbmluZ0Jsb2NrSGVpZ2h0KTsKLX0KLQotT3B0aW9uYWw8TGF5
b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZE1pbkhlaWdodChj
b25zdCBCb3gmIGxheW91dEJveCwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2Nr
SGVpZ2h0KSBjb25zdAotewotICAgIHJldHVybiBjb21wdXRlZEhlaWdodFZhbHVlKGxheW91dEJv
eCwgSGVpZ2h0VHlwZTo6TWluLCBjb250YWluaW5nQmxvY2tIZWlnaHQpOwotfQotCi1PcHRpb25h
bDxMYXlvdXRVbml0PiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkTWluV2lk
dGgoY29uc3QgQm94JiBsYXlvdXRCb3gsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgp
Ci17Ci0gICAgcmV0dXJuIGNvbXB1dGVkV2lkdGhWYWx1ZShsYXlvdXRCb3gsIFdpZHRoVHlwZTo6
TWluLCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci19Ci0KLU9wdGlvbmFsPExheW91dFVuaXQ+IEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRNYXhXaWR0aChjb25zdCBCb3gmIGxh
eW91dEJveCwgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCkKLXsKLSAgICByZXR1cm4g
Y29tcHV0ZWRXaWR0aFZhbHVlKGxheW91dEJveCwgV2lkdGhUeXBlOjpNYXgsIGNvbnRhaW5pbmdC
bG9ja1dpZHRoKTsKLX0KLQotTGF5b3V0VW5pdCBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6
OnN0YXRpY1ZlcnRpY2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYg
bGF5b3V0Qm94LCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRz
KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkp
OwotCi0gICAgLy8gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIHNlY3Rpb24gYW5kIHRoZSBuZXh0
LCB0aGUgdGVybSAic3RhdGljIHBvc2l0aW9uIiAob2YgYW4gZWxlbWVudCkgcmVmZXJzLCByb3Vn
aGx5LCB0byB0aGUgcG9zaXRpb24gYW4gZWxlbWVudCB3b3VsZCBoYXZlCi0gICAgLy8gaGFkIGlu
IHRoZSBub3JtYWwgZmxvdy4gTW9yZSBwcmVjaXNlbHksIHRoZSBzdGF0aWMgcG9zaXRpb24gZm9y
ICd0b3AnIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSB0b3AgZWRnZSBvZiB0aGUgY29udGFpbmlu
ZyBibG9jayB0byB0aGUgdG9wIG1hcmdpbgotICAgIC8vIGVkZ2Ugb2YgYSBoeXBvdGhldGljYWwg
Ym94IHRoYXQgd291bGQgaGF2ZSBiZWVuIHRoZSBmaXJzdCBib3ggb2YgdGhlIGVsZW1lbnQgaWYg
aXRzIHNwZWNpZmllZCAncG9zaXRpb24nIHZhbHVlIGhhZCBiZWVuICdzdGF0aWMnIGFuZCBpdHMg
c3BlY2lmaWVkCi0gICAgLy8gJ2Zsb2F0JyBoYWQgYmVlbiAnbm9uZScgYW5kIGl0cyBzcGVjaWZp
ZWQgJ2NsZWFyJyBoYWQgYmVlbiAnbm9uZScuIChOb3RlIHRoYXQgZHVlIHRvIHRoZSBydWxlcyBp
biBzZWN0aW9uIDkuNyB0aGlzIG1pZ2h0IHJlcXVpcmUgYWxzbyBhc3N1bWluZyBhIGRpZmZlcmVu
dAotICAgIC8vIGNvbXB1dGVkIHZhbHVlIGZvciAnZGlzcGxheScuKSBUaGUgdmFsdWUgaXMgbmVn
YXRpdmUgaWYgdGhlIGh5cG90aGV0aWNhbCBib3ggaXMgYWJvdmUgdGhlIGNvbnRhaW5pbmcgYmxv
Y2suCi0KLSAgICAvLyBTdGFydCB3aXRoIHRoaXMgYm94J3MgYm9yZGVyIGJveCBvZmZzZXQgZnJv
bSB0aGUgcGFyZW50J3MgYm9yZGVyIGJveC4KLSAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9
IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7Ci0gICAgTGF5b3V0VW5pdCB0b3A7Ci0gICAgaWYg
KGxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSAmJiBsYXlvdXRCb3gucHJldmlvdXNJ
bkZsb3dTaWJsaW5nKCktPmlzQmxvY2tMZXZlbEJveCgpKSB7Ci0gICAgICAgIC8vIEFkZCBzaWJs
aW5nIG9mZnNldAotICAgICAgICBhdXRvJiBwcmV2aW91c0luRmxvd1NpYmxpbmcgPSAqbGF5b3V0
Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpOwotICAgICAgICBhdXRvJiBwcmV2aW91c0luRmxv
d0JveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gocHJldmlvdXNJ
bkZsb3dTaWJsaW5nLCBFc2NhcGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0
cnkpOwotICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSBkb3duY2FzdDxCbG9ja0Zvcm1h
dHRpbmdTdGF0ZT4obGF5b3V0U3RhdGUoKS5mb3JtYXR0aW5nU3RhdGVGb3JCb3gocHJldmlvdXNJ
bkZsb3dTaWJsaW5nKSk7Ci0gICAgICAgIGF1dG8gdXNlZFZlcnRpY2FsTWFyZ2luRm9yUHJldmlv
dXNCb3ggPSBmb3JtYXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKHByZXZpb3VzSW5GbG93
U2libGluZyk7Ci0KLSAgICAgICAgdG9wICs9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KHBy
ZXZpb3VzSW5GbG93Qm94R2VvbWV0cnkpLmJvdHRvbSgpICsgdXNlZFZlcnRpY2FsTWFyZ2luRm9y
UHJldmlvdXNCb3gubm9uQ29sbGFwc2VkVmFsdWVzLmFmdGVyOwotICAgIH0gZWxzZQotICAgICAg
ICB0b3AgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gucGFyZW50
KCksIEVzY2FwZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRyeSkuY29udGVu
dEJveFRvcCgpOwotCi0gICAgLy8gUmVzb2x2ZSB0b3AgYWxsIHRoZSB3YXkgdXAgdG8gdGhlIGNv
bnRhaW5pbmcgYmxvY2suCi0gICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gbGF5b3V0Qm94LmNv
bnRhaW5pbmdCbG9jaygpOwotICAgIC8vIFN0YXJ0IHdpdGggdGhlIHBhcmVudCBzaW5jZSB3ZSBw
cmV0ZW5kIHRoYXQgdGhpcyBib3ggaXMgbm9ybWFsIGZsb3cuCi0gICAgZm9yIChhdXRvKiBhbmNl
c3RvciA9ICZsYXlvdXRCb3gucGFyZW50KCk7IGFuY2VzdG9yICE9ICZjb250YWluaW5nQmxvY2s7
IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkgewotICAgICAgICBhdXRv
JiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KCphbmNlc3Rv
ciwgRXNjYXBlUmVhc29uOjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5KTsKLSAgICAg
ICAgLy8gQm94R2VvbWV0cnk6OnRvcCBpcyB0aGUgYm9yZGVyIGJveCB0b3AgcG9zaXRpb24gaW4g
aXRzIGNvbnRhaW5pbmcgYmxvY2sncyBjb29yZGluYXRlIHN5c3RlbS4KLSAgICAgICAgdG9wICs9
IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hUb3AoYm94R2VvbWV0cnkpOwotICAgICAgICBBU1NFUlQo
IWFuY2VzdG9yLT5pc1Bvc2l0aW9uZWQoKSB8fCBsYXlvdXRCb3guaXNGaXhlZFBvc2l0aW9uZWQo
KSk7Ci0gICAgfQotICAgIC8vIE1vdmUgdGhlIHN0YXRpYyBwb3NpdGlvbiByZWxhdGl2ZSB0byB0
aGUgcGFkZGluZyBib3guIFRoaXMgaXMgdmVyeSBzcGVjaWZpYyB0byBhYm9sdXRlbHkgcG9zaXRp
b25lZCBib3hlcy4KLSAgICByZXR1cm4gdG9wIC0gdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2Fs
VG9wOwotfQotCi1MYXlvdXRVbml0IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6c3RhdGlj
SG9yaXpvbnRhbFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChjb25zdCBCb3gmIGxheW91
dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMp
IGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7
Ci0gICAgLy8gU2VlIHN0YXRpY1ZlcnRpY2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVk
IGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc3RhdGljIHBvc2l0aW9uLgotCi0gICAgLy8gU3Rh
cnQgd2l0aCB0aGlzIGJveCdzIGJvcmRlciBib3ggb2Zmc2V0IGZyb20gdGhlIHBhcmVudCdzIGJv
cmRlciBib3guCi0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5n
Q29udGV4dCgpOwotICAgIGF1dG8gbGVmdCA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9y
Qm94KGxheW91dEJveC5wYXJlbnQoKSwgRXNjYXBlUmVhc29uOjpPdXRPZkZsb3dCb3hOZWVkc0lu
Rmxvd0dlb21ldHJ5KS5jb250ZW50Qm94TGVmdCgpOwotCi0gICAgLy8gUmVzb2x2ZSBsZWZ0IGFs
bCB0aGUgd2F5IHVwIHRvIHRoZSBjb250YWluaW5nIGJsb2NrLgotICAgIGF1dG8mIGNvbnRhaW5p
bmdCbG9jayA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsKLSAgICAvLyBTdGFydCB3aXRo
IHRoZSBwYXJlbnQgc2luY2Ugd2UgcHJldGVuZCB0aGF0IHRoaXMgYm94IGlzIG5vcm1hbCBmbG93
LgotICAgIGZvciAoYXV0byogYW5jZXN0b3IgPSAmbGF5b3V0Qm94LnBhcmVudCgpOyBhbmNlc3Rv
ciAhPSAmY29udGFpbmluZ0Jsb2NrOyBhbmNlc3RvciA9ICZhbmNlc3Rvci0+Y29udGFpbmluZ0Js
b2NrKCkpIHsKLSAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5n
ZW9tZXRyeUZvckJveCgqYW5jZXN0b3IsIEVzY2FwZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJ
bkZsb3dHZW9tZXRyeSk7Ci0gICAgICAgIC8vIEJveEdlb21ldHJ5OjpsZWZ0IGlzIHRoZSBib3Jk
ZXIgYm94IGxlZnQgcG9zaXRpb24gaW4gaXRzIGNvbnRhaW5pbmcgYmxvY2sncyBjb29yZGluYXRl
IHN5c3RlbS4KLSAgICAgICAgbGVmdCArPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94TGVmdChib3hH
ZW9tZXRyeSk7Ci0gICAgICAgIEFTU0VSVCghYW5jZXN0b3ItPmlzUG9zaXRpb25lZCgpIHx8IGxh
eW91dEJveC5pc0ZpeGVkUG9zaXRpb25lZCgpKTsKLSAgICB9Ci0gICAgLy8gTW92ZSB0aGUgc3Rh
dGljIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBwYWRkaW5nIGJveC4gVGhpcyBpcyB2ZXJ5IHNw
ZWNpZmljIHRvIGFib2x1dGVseSBwb3NpdGlvbmVkIGJveGVzLgotICAgIHJldHVybiBsZWZ0IC0g
aG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxMZWZ0OwotfQotCi1MYXlvdXRVbml0IEZvcm1h
dHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6c2hyaW5rVG9GaXRXaWR0aChjb25zdCBCb3gmIGZvcm1h
dHRpbmdDb250ZXh0Um9vdCwgTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCkKLXsKLSAgICBMT0df
V0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1dpZHRoXSAt
PiBzaHJpbmsgdG8gZml0IC0+IHVuc3VwcG9ydGVkIC0+IHdpZHRoKCIgPDwgTGF5b3V0VW5pdCB7
IH0gPDwgInB4KSBsYXlvdXRCb3g6ICIgPDwgJmZvcm1hdHRpbmdDb250ZXh0Um9vdCA8PCAiKSIp
OwotICAgIEFTU0VSVChmb3JtYXR0aW5nQ29udGV4dFJvb3QuZXN0YWJsaXNoZXNGb3JtYXR0aW5n
Q29udGV4dCgpKTsKLQotICAgIC8vIENhbGN1bGF0aW9uIG9mIHRoZSBzaHJpbmstdG8tZml0IHdp
ZHRoIGlzIHNpbWlsYXIgdG8gY2FsY3VsYXRpbmcgdGhlIHdpZHRoIG9mIGEgdGFibGUgY2VsbCB1
c2luZyB0aGUgYXV0b21hdGljIHRhYmxlIGxheW91dCBhbGdvcml0aG0uCi0gICAgLy8gUm91Z2hs
eTogY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgd2lkdGggYnkgZm9ybWF0dGluZyB0aGUgY29udGVu
dCB3aXRob3V0IGJyZWFraW5nIGxpbmVzIG90aGVyIHRoYW4gd2hlcmUgZXhwbGljaXQgbGluZSBi
cmVha3Mgb2NjdXIsCi0gICAgLy8gYW5kIGFsc28gY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgbWlu
aW11bSB3aWR0aCwgZS5nLiwgYnkgdHJ5aW5nIGFsbCBwb3NzaWJsZSBsaW5lIGJyZWFrcy4gQ1NT
IDIuMiBkb2VzIG5vdCBkZWZpbmUgdGhlIGV4YWN0IGFsZ29yaXRobS4KLSAgICAvLyBUaGlyZGx5
LCBmaW5kIHRoZSBhdmFpbGFibGUgd2lkdGg6IGluIHRoaXMgY2FzZSwgdGhpcyBpcyB0aGUgd2lk
dGggb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgbWludXMgdGhlIHVzZWQgdmFsdWVzIG9mICdtYXJn
aW4tbGVmdCcsICdib3JkZXItbGVmdC13aWR0aCcsCi0gICAgLy8gJ3BhZGRpbmctbGVmdCcsICdw
YWRkaW5nLXJpZ2h0JywgJ2JvcmRlci1yaWdodC13aWR0aCcsICdtYXJnaW4tcmlnaHQnLCBhbmQg
dGhlIHdpZHRocyBvZiBhbnkgcmVsZXZhbnQgc2Nyb2xsIGJhcnMuCi0KLSAgICAvLyBUaGVuIHRo
ZSBzaHJpbmstdG8tZml0IHdpZHRoIGlzOiBtaW4obWF4KHByZWZlcnJlZCBtaW5pbXVtIHdpZHRo
LCBhdmFpbGFibGUgd2lkdGgpLCBwcmVmZXJyZWQgd2lkdGgpLgotICAgIGF1dG8gaW50cmluc2lj
V2lkdGhDb25zdHJhaW50cyA9IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9OwotICAgIGF1
dG8gaGFzQ29udGVudCA9IGlzPENvbnRhaW5lckJveD4oZm9ybWF0dGluZ0NvbnRleHRSb290KSAm
JiBkb3duY2FzdDxDb250YWluZXJCb3g+KGZvcm1hdHRpbmdDb250ZXh0Um9vdCkuaGFzSW5GbG93
T3JGbG9hdGluZ0NoaWxkKCk7Ci0gICAgLy8gVGhlIHVzZWQgd2lkdGggb2YgdGhlIGNvbnRhaW5t
ZW50IGJveCBpcyBkZXRlcm1pbmVkIGFzIGlmIHBlcmZvcm1pbmcgYSBub3JtYWwgbGF5b3V0IG9m
IHRoZSBib3gsIGV4Y2VwdCB0aGF0IGl0IGlzIHRyZWF0ZWQgYXMgaGF2aW5nIG5vIGNvbnRlbnQu
Ci0gICAgYXV0byBzaG91bGRJZ25vcmVDb250ZW50ID0gZm9ybWF0dGluZ0NvbnRleHRSb290Lmlz
U2l6ZUNvbnRhaW5tZW50Qm94KCk7ICAKLSAgICBpZiAoaGFzQ29udGVudCAmJiAhc2hvdWxkSWdu
b3JlQ29udGVudCkgewotICAgICAgICBhdXRvJiByb290ID0gZG93bmNhc3Q8Q29udGFpbmVyQm94
Pihmb3JtYXR0aW5nQ29udGV4dFJvb3QpOwotICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGVG
b3JSb290ID0gbGF5b3V0U3RhdGUoKS5lbnN1cmVGb3JtYXR0aW5nU3RhdGUocm9vdCk7Ci0gICAg
ICAgIGF1dG8gcHJlY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gZm9ybWF0dGlu
Z1N0YXRlRm9yUm9vdC5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGlmICgh
cHJlY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKQotICAgICAgICAgICAgaW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250
ZXh0KHJvb3QsIGxheW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50
cyA9ICpwcmVjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Ci0gICAgfQotICAgIHJl
dHVybiBzdGQ6Om1pbihzdGQ6Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0s
IGF2YWlsYWJsZVdpZHRoKSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtKTsKLX0K
LQotVmVydGljYWxHZW9tZXRyeSBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Om91dE9mRmxv
d05vblJlcGxhY2VkVmVydGljYWxHZW9tZXRyeShjb25zdCBDb250YWluZXJCb3gmIGxheW91dEJv
eCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNv
bnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJy
aWRkZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewot
ICAgIEFTU0VSVChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWxheW91dEJv
eC5pc1JlcGxhY2VkQm94KCkpOwotICAgIEFTU0VSVCh2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2lj
YWxIZWlnaHQpOwotCi0gICAgLy8gMTAuNi40IEFic29sdXRlbHkgcG9zaXRpb25lZCwgbm9uLXJl
cGxhY2VkIGVsZW1lbnRzCi0gICAgLy8KLSAgICAvLyBGb3IgYWJzb2x1dGVseSBwb3NpdGlvbmVk
IGVsZW1lbnRzLCB0aGUgdXNlZCB2YWx1ZXMgb2YgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbnMgbXVz
dCBzYXRpc2Z5IHRoaXMgY29uc3RyYWludDoKLSAgICAvLyAndG9wJyArICdtYXJnaW4tdG9wJyAr
ICdib3JkZXItdG9wLXdpZHRoJyArICdwYWRkaW5nLXRvcCcgKyAnaGVpZ2h0JyArICdwYWRkaW5n
LWJvdHRvbScgKyAnYm9yZGVyLWJvdHRvbS13aWR0aCcgKyAnbWFyZ2luLWJvdHRvbScgKyAnYm90
dG9tJwotICAgIC8vID0gaGVpZ2h0IG9mIGNvbnRhaW5pbmcgYmxvY2sKLQotICAgIC8vIElmIGFs
bCB0aHJlZSBvZiAndG9wJywgJ2hlaWdodCcsIGFuZCAnYm90dG9tJyBhcmUgYXV0bywgc2V0ICd0
b3AnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb24gYW5kIGFwcGx5IHJ1bGUgbnVtYmVyIHRocmVlIGJl
bG93LgotCi0gICAgLy8gSWYgbm9uZSBvZiB0aGUgdGhyZWUgYXJlICdhdXRvJzogSWYgYm90aCAn
bWFyZ2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyBhcmUgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1
YXRpb24gdW5kZXIgdGhlIGV4dHJhCi0gICAgLy8gY29uc3RyYWludCB0aGF0IHRoZSB0d28gbWFy
Z2lucyBnZXQgZXF1YWwgdmFsdWVzLiBJZiBvbmUgb2YgJ21hcmdpbi10b3AnIG9yICdtYXJnaW4t
Ym90dG9tJyBpcyAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiBmb3IgdGhhdCB2YWx1ZS4KLSAg
ICAvLyBJZiB0aGUgdmFsdWVzIGFyZSBvdmVyLWNvbnN0cmFpbmVkLCBpZ25vcmUgdGhlIHZhbHVl
IGZvciAnYm90dG9tJyBhbmQgc29sdmUgZm9yIHRoYXQgdmFsdWUuCi0KLSAgICAvLyBPdGhlcndp
c2UsIHBpY2sgdGhlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHNpeCBydWxlcyB0aGF0IGFwcGxpZXMu
Ci0KLSAgICAvLyAxLiAndG9wJyBhbmQgJ2hlaWdodCcgYXJlICdhdXRvJyBhbmQgJ2JvdHRvbScg
aXMgbm90ICdhdXRvJywgdGhlbiB0aGUgaGVpZ2h0IGlzIGJhc2VkIG9uIHRoZSBjb250ZW50IHBl
ciAxMC42LjcsCi0gICAgLy8gICAgIHNldCAnYXV0bycgdmFsdWVzIGZvciAnbWFyZ2luLXRvcCcg
YW5kICdtYXJnaW4tYm90dG9tJyB0byAwLCBhbmQgc29sdmUgZm9yICd0b3AnCi0gICAgLy8gMi4g
J3RvcCcgYW5kICdib3R0b20nIGFyZSAnYXV0bycgYW5kICdoZWlnaHQnIGlzIG5vdCAnYXV0bycs
IHRoZW4gc2V0ICd0b3AnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb24sIHNldCAnYXV0bycgdmFsdWVz
IGZvcgotICAgIC8vICAgICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAsIGFu
ZCBzb2x2ZSBmb3IgJ2JvdHRvbScKLSAgICAvLyAzLiAnaGVpZ2h0JyBhbmQgJ2JvdHRvbScgYXJl
ICdhdXRvJyBhbmQgJ3RvcCcgaXMgbm90ICdhdXRvJywgdGhlbiB0aGUgaGVpZ2h0IGlzIGJhc2Vk
IG9uIHRoZSBjb250ZW50IHBlciAxMC42LjcsIHNldCAnYXV0bycKLSAgICAvLyAgICAgdmFsdWVz
IGZvciAnbWFyZ2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyB0byAwLCBhbmQgc29sdmUgZm9y
ICdib3R0b20nCi0gICAgLy8gNC4gJ3RvcCcgaXMgJ2F1dG8nLCAnaGVpZ2h0JyBhbmQgJ2JvdHRv
bScgYXJlIG5vdCAnYXV0bycsIHRoZW4gc2V0ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tdG9w
JyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAsIGFuZCBzb2x2ZSBmb3IgJ3RvcCcKLSAgICAvLyA1
LiAnaGVpZ2h0JyBpcyAnYXV0bycsICd0b3AnIGFuZCAnYm90dG9tJyBhcmUgbm90ICdhdXRvJywg
dGhlbiAnYXV0bycgdmFsdWVzIGZvciAnbWFyZ2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyBh
cmUgc2V0IHRvIDAgYW5kIHNvbHZlIGZvciAnaGVpZ2h0JwotICAgIC8vIDYuICdib3R0b20nIGlz
ICdhdXRvJywgJ3RvcCcgYW5kICdoZWlnaHQnIGFyZSBub3QgJ2F1dG8nLCB0aGVuIHNldCAnYXV0
bycgdmFsdWVzIGZvciAnbWFyZ2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyB0byAwIGFuZCBz
b2x2ZSBmb3IgJ2JvdHRvbScKLQotICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+
Zm9ybWF0dGluZ0NvbnRleHQoKTsKLSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgp
OwotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JC
b3gobGF5b3V0Qm94KTsKLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja0hlaWdodCA9ICp2ZXJ0aWNh
bENvbnN0cmFpbnRzLmxvZ2ljYWxIZWlnaHQ7Ci0gICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0
aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7Ci0KLSAgICBhdXRvIHRvcCA9
IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbFRvcCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7
Ci0gICAgYXV0byBib3R0b20gPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxCb3R0b20oKSwg
Y29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgIGF1dG8gaGVpZ2h0ID0gb3ZlcnJpZGRlblZlcnRp
Y2FsVmFsdWVzLmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQudmFsdWUo
KSA6IGNvbXB1dGVkSGVpZ2h0KGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrSGVpZ2h0KTsKLSAg
ICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRWZXJ0aWNh
bE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgVXNlZFZlcnRp
Y2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgdXNlZFZlcnRpY2FsTWFyZ2luOyAKLSAgICBh
dXRvIHBhZGRpbmdUb3AgPSBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKTsKLSAg
ICBhdXRvIHBhZGRpbmdCb3R0b20gPSBib3hHZW9tZXRyeS5wYWRkaW5nQm90dG9tKCkudmFsdWVP
cigwKTsKLSAgICBhdXRvIGJvcmRlclRvcCA9IGJveEdlb21ldHJ5LmJvcmRlclRvcCgpOwotICAg
IGF1dG8gYm9yZGVyQm90dG9tID0gYm94R2VvbWV0cnkuYm9yZGVyQm90dG9tKCk7Ci0KLSAgICBp
ZiAoIXRvcCAmJiAhaGVpZ2h0ICYmICFib3R0b20pCi0gICAgICAgIHRvcCA9IHN0YXRpY1ZlcnRp
Y2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGxheW91dEJveCwgdmVydGljYWxDb25z
dHJhaW50cyk7Ci0KLSAgICBpZiAodG9wICYmIGhlaWdodCAmJiBib3R0b20pIHsKLSAgICAgICAg
aWYgKCFjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSAmJiAhY29tcHV0ZWRWZXJ0aWNhbE1h
cmdpbi5hZnRlcikgewotICAgICAgICAgICAgYXV0byBtYXJnaW5CZWZvcmVBbmRBZnRlciA9IGNv
bnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpo
ZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKmJvdHRvbSk7Ci0gICAgICAg
ICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7IG1hcmdpbkJlZm9yZUFuZEFmdGVyIC8gMiwgbWFy
Z2luQmVmb3JlQW5kQWZ0ZXIgLyAyIH07Ci0gICAgICAgIH0gZWxzZSBpZiAoIWNvbXB1dGVkVmVy
dGljYWxNYXJnaW4uYmVmb3JlKSB7Ci0gICAgICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4uYWZ0
ZXIgPSAqY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlcjsKLSAgICAgICAgICAgIHVzZWRWZXJ0
aWNhbE1hcmdpbi5iZWZvcmUgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIGJvcmRl
clRvcCArIHBhZGRpbmdUb3AgKyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRv
bSArIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciArICpib3R0b20pOwotICAgICAgICB9IGVsc2Ug
aWYgKCFjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyKSB7Ci0gICAgICAgICAgICB1c2VkVmVy
dGljYWxNYXJnaW4uYmVmb3JlID0gKmNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlOwotICAg
ICAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0
IC0gKCp0b3AgKyB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGlu
Z1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKmJvdHRvbSk7
Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luID0geyAqY29t
cHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUsICpjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVy
IH07Ci0gICAgICAgIC8vIE92ZXItY29uc3RyYWluZWQ/Ci0gICAgICAgIGF1dG8gYm94SGVpZ2h0
ID0gKnRvcCArIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5n
VG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVydGlj
YWxNYXJnaW4uYWZ0ZXIgKyAqYm90dG9tOwotICAgICAgICBpZiAoYm94SGVpZ2h0ICE9IGNvbnRh
aW5pbmdCbG9ja0hlaWdodCkKLSAgICAgICAgICAgIGJvdHRvbSA9IGNvbnRhaW5pbmdCbG9ja0hl
aWdodCAtICgqdG9wICsgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBh
ZGRpbmdUb3AgKyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRW
ZXJ0aWNhbE1hcmdpbi5hZnRlcik7Ci0gICAgfQotCi0gICAgaWYgKCF0b3AgJiYgIWhlaWdodCAm
JiBib3R0b20pIHsKLSAgICAgICAgLy8gIzEKLSAgICAgICAgaGVpZ2h0ID0gY29udGVudEhlaWdo
dEZvckZvcm1hdHRpbmdDb250ZXh0Um9vdChsYXlvdXRCb3gpOwotICAgICAgICB1c2VkVmVydGlj
YWxNYXJnaW4gPSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNv
bXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OwotICAgICAgICB0b3AgPSBj
b250YWluaW5nQmxvY2tIZWlnaHQgLSAodXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRl
clRvcCArIHBhZGRpbmdUb3AgKyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRv
bSArIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciArICpib3R0b20pOyAKLSAgICB9Ci0KLSAgICBp
ZiAoIXRvcCAmJiAhYm90dG9tICYmIGhlaWdodCkgewotICAgICAgICAvLyAjMgotICAgICAgICB0
b3AgPSBzdGF0aWNWZXJ0aWNhbFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChsYXlvdXRC
b3gsIHZlcnRpY2FsQ29uc3RyYWludHMpOwotICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7
IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGlj
YWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OwotICAgICAgICBib3R0b20gPSBjb250YWluaW5n
QmxvY2tIZWlnaHQgLSAoKnRvcCArIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJU
b3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20g
KyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIpOwotICAgIH0KLQotICAgIGlmICghaGVpZ2h0ICYm
ICFib3R0b20gJiYgdG9wKSB7Ci0gICAgICAgIC8vICMzCi0gICAgICAgIGhlaWdodCA9IGNvbnRl
bnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QobGF5b3V0Qm94KTsKLSAgICAgICAgdXNl
ZFZlcnRpY2FsTWFyZ2luID0geyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9y
KDApLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKLSAgICAgICAg
Ym90dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyB1c2VkVmVydGljYWxNYXJn
aW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90
dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyKTsKLSAgICB9Ci0K
LSAgICBpZiAoIXRvcCAmJiBoZWlnaHQgJiYgYm90dG9tKSB7Ci0gICAgICAgIC8vICM0Ci0gICAg
ICAgIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUu
dmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07Ci0g
ICAgICAgIHRvcCA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICh1c2VkVmVydGljYWxNYXJnaW4u
YmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9t
ICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7Ci0g
ICAgfQotCi0gICAgaWYgKCFoZWlnaHQgJiYgdG9wICYmIGJvdHRvbSkgewotICAgICAgICAvLyAj
NQotICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4u
YmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigw
KSB9OwotICAgICAgICBoZWlnaHQgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIHVz
ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgcGFkZGlu
Z0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciArICpib3R0
b20pOwotICAgIH0KLQotICAgIGlmICghYm90dG9tICYmIHRvcCAmJiBoZWlnaHQpIHsKLSAgICAg
ICAgLy8gIzYKLSAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luID0geyBjb21wdXRlZFZlcnRpY2Fs
TWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZh
bHVlT3IoMCkgfTsKLSAgICAgICAgYm90dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0
b3AgKyB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCAr
ICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2FsTWFy
Z2luLmFmdGVyKTsKLSAgICB9Ci0KLSAgICBBU1NFUlQodG9wKTsKLSAgICBBU1NFUlQoYm90dG9t
KTsKLSAgICBBU1NFUlQoaGVpZ2h0KTsKLQotICAgIC8vIEZvciBvdXQtb2YtZmxvdyBlbGVtZW50
cyB0aGUgY29udGFpbmluZyBibG9jayBpcyBmb3JtZWQgYnkgdGhlIHBhZGRpbmcgZWRnZSBvZiB0
aGUgYW5jZXN0b3IuCi0gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcG9zaXRpb25lZCB2YWx1ZSBp
cyBpbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIHBhZGRpbmcgYm94LiBMZXQncyBjb252
ZXJ0IGl0IHRvIGJvcmRlciBib3ggY29vcmRpbmF0ZSBzeXN0ZW0uCi0gICAgYXV0byBjb250YWlu
aW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlID0gdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2Fs
VG9wOwotICAgICp0b3AgKz0gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZTsKLSAg
ICAqYm90dG9tICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7Ci0KLSAgICBM
T0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1Bvc2l0
aW9uXVtIZWlnaHRdW01hcmdpbl0gLT4gb3V0LW9mLWZsb3cgbm9uLXJlcGxhY2VkIC0+IHRvcCgi
IDw8ICp0b3AgPDwgInB4KSBib3R0b20oIiAgPDwgKmJvdHRvbSA8PCAicHgpIGhlaWdodCgiIDw8
ICpoZWlnaHQgPDwgInB4KSBtYXJnaW4oIiA8PCB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlIDw8
ICJweCwgIiAgPDwgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyIDw8ICJweCkgbGF5b3V0Qm94KCIg
PDwgJmxheW91dEJveCA8PCAiKSIpOwotICAgIHJldHVybiB7ICp0b3AsICpib3R0b20sIHsgKmhl
aWdodCwgdXNlZFZlcnRpY2FsTWFyZ2luIH0gfTsKLX0KLQotSG9yaXpvbnRhbEdlb21ldHJ5IEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93Tm9uUmVwbGFjZWRIb3Jpem9udGFs
R2VvbWV0cnkoY29uc3QgQ29udGFpbmVyQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpv
bnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGxh
eW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRC
b3goKSk7Ci0gICAgCi0gICAgLy8gMTAuMy43IEFic29sdXRlbHkgcG9zaXRpb25lZCwgbm9uLXJl
cGxhY2VkIGVsZW1lbnRzCi0gICAgLy8KLSAgICAvLyAnbGVmdCcgKyAnbWFyZ2luLWxlZnQnICsg
J2JvcmRlci1sZWZ0LXdpZHRoJyArICdwYWRkaW5nLWxlZnQnICsgJ3dpZHRoJyArICdwYWRkaW5n
LXJpZ2h0JyArICdib3JkZXItcmlnaHQtd2lkdGgnICsgJ21hcmdpbi1yaWdodCcgKyAncmlnaHQn
Ci0gICAgLy8gPSB3aWR0aCBvZiBjb250YWluaW5nIGJsb2NrCi0KLSAgICAvLyBJZiBhbGwgdGhy
ZWUgb2YgJ2xlZnQnLCAnd2lkdGgnLCBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nOiBGaXJzdCBzZXQg
YW55ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIHRv
IDAuCi0gICAgLy8gVGhlbiwgaWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVt
ZW50IGVzdGFibGlzaGluZyB0aGUgc3RhdGljLXBvc2l0aW9uIGNvbnRhaW5pbmcgYmxvY2sgaXMg
J2x0cicgc2V0ICdsZWZ0JyB0byB0aGUgc3RhdGljCi0gICAgLy8gcG9zaXRpb24gYW5kIGFwcGx5
IHJ1bGUgbnVtYmVyIHRocmVlIGJlbG93OyBvdGhlcndpc2UsIHNldCAncmlnaHQnIHRvIHRoZSBz
dGF0aWMgcG9zaXRpb24gYW5kIGFwcGx5IHJ1bGUgbnVtYmVyIG9uZSBiZWxvdy4KLSAgICAvLwot
ICAgIC8vIElmIG5vbmUgb2YgdGhlIHRocmVlIGlzICdhdXRvJzogSWYgYm90aCAnbWFyZ2luLWxl
ZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyBhcmUgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5k
ZXIgdGhlIGV4dHJhIGNvbnN0cmFpbnQgdGhhdCB0aGUgdHdvIG1hcmdpbnMgZ2V0IGVxdWFsIHZh
bHVlcywKLSAgICAvLyB1bmxlc3MgdGhpcyB3b3VsZCBtYWtlIHRoZW0gbmVnYXRpdmUsIGluIHdo
aWNoIGNhc2Ugd2hlbiBkaXJlY3Rpb24gb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicg
KCdydGwnKSwgc2V0ICdtYXJnaW4tbGVmdCcgKCdtYXJnaW4tcmlnaHQnKSB0byB6ZXJvIGFuZAot
ICAgIC8vIHNvbHZlIGZvciAnbWFyZ2luLXJpZ2h0JyAoJ21hcmdpbi1sZWZ0JykuIElmIG9uZSBv
ZiAnbWFyZ2luLWxlZnQnIG9yICdtYXJnaW4tcmlnaHQnIGlzICdhdXRvJywgc29sdmUgdGhlIGVx
dWF0aW9uIGZvciB0aGF0IHZhbHVlLgotICAgIC8vIElmIHRoZSB2YWx1ZXMgYXJlIG92ZXItY29u
c3RyYWluZWQsIGlnbm9yZSB0aGUgdmFsdWUgZm9yICdsZWZ0JyAoaW4gY2FzZSB0aGUgJ2RpcmVj
dGlvbicgcHJvcGVydHkgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ3J0bCcpIG9yICdyaWdo
dCcKLSAgICAvLyAoaW4gY2FzZSAnZGlyZWN0aW9uJyBpcyAnbHRyJykgYW5kIHNvbHZlIGZvciB0
aGF0IHZhbHVlLgotICAgIC8vCi0gICAgLy8gT3RoZXJ3aXNlLCBzZXQgJ2F1dG8nIHZhbHVlcyBm
b3IgJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgdG8gMCwgYW5kIHBpY2sgdGhlIG9u
ZSBvZiB0aGUgZm9sbG93aW5nIHNpeCBydWxlcyB0aGF0IGFwcGxpZXMuCi0gICAgLy8KLSAgICAv
LyAxLiAnbGVmdCcgYW5kICd3aWR0aCcgYXJlICdhdXRvJyBhbmQgJ3JpZ2h0JyBpcyBub3QgJ2F1
dG8nLCB0aGVuIHRoZSB3aWR0aCBpcyBzaHJpbmstdG8tZml0LiBUaGVuIHNvbHZlIGZvciAnbGVm
dCcKLSAgICAvLyAyLiAnbGVmdCcgYW5kICdyaWdodCcgYXJlICdhdXRvJyBhbmQgJ3dpZHRoJyBp
cyBub3QgJ2F1dG8nLCB0aGVuIGlmIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgZWxl
bWVudCBlc3RhYmxpc2hpbmcgdGhlIHN0YXRpYy1wb3NpdGlvbiAKLSAgICAvLyAgICBjb250YWlu
aW5nIGJsb2NrIGlzICdsdHInIHNldCAnbGVmdCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbiwgb3Ro
ZXJ3aXNlIHNldCAncmlnaHQnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb24uCi0gICAgLy8gICAgVGhl
biBzb2x2ZSBmb3IgJ2xlZnQnIChpZiAnZGlyZWN0aW9uIGlzICdydGwnKSBvciAncmlnaHQnIChp
ZiAnZGlyZWN0aW9uJyBpcyAnbHRyJykuCi0gICAgLy8gMy4gJ3dpZHRoJyBhbmQgJ3JpZ2h0JyBh
cmUgJ2F1dG8nIGFuZCAnbGVmdCcgaXMgbm90ICdhdXRvJywgdGhlbiB0aGUgd2lkdGggaXMgc2hy
aW5rLXRvLWZpdCAuIFRoZW4gc29sdmUgZm9yICdyaWdodCcKLSAgICAvLyA0LiAnbGVmdCcgaXMg
J2F1dG8nLCAnd2lkdGgnIGFuZCAncmlnaHQnIGFyZSBub3QgJ2F1dG8nLCB0aGVuIHNvbHZlIGZv
ciAnbGVmdCcKLSAgICAvLyA1LiAnd2lkdGgnIGlzICdhdXRvJywgJ2xlZnQnIGFuZCAncmlnaHQn
IGFyZSBub3QgJ2F1dG8nLCB0aGVuIHNvbHZlIGZvciAnd2lkdGgnCi0gICAgLy8gNi4gJ3JpZ2h0
JyBpcyAnYXV0bycsICdsZWZ0JyBhbmQgJ3dpZHRoJyBhcmUgbm90ICdhdXRvJywgdGhlbiBzb2x2
ZSBmb3IgJ3JpZ2h0JwotCi0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3Jt
YXR0aW5nQ29udGV4dCgpOwotICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0g
ICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChs
YXlvdXRCb3gpOwotICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29u
c3RyYWludHMubG9naWNhbFdpZHRoOwotICAgIGF1dG8gaXNMZWZ0VG9SaWdodERpcmVjdGlvbiA9
IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rp
b24oKTsKLSAgICAKLSAgICBhdXRvIGxlZnQgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxM
ZWZ0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLSAgICBhdXRvIHJpZ2h0ID0gY29tcHV0ZWRW
YWx1ZShzdHlsZS5sb2dpY2FsUmlnaHQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgIGF1
dG8gd2lkdGggPSBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0aCA/IG92ZXJyaWRkZW5I
b3Jpem9udGFsVmFsdWVzLndpZHRoIDogY29tcHV0ZWRXaWR0aChsYXlvdXRCb3gsIGNvbnRhaW5p
bmdCbG9ja1dpZHRoKTsKLSAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21l
dHJ5Ojpjb21wdXRlZEhvcml6b250YWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3Ry
YWludHMpOwotICAgIFVzZWRIb3Jpem9udGFsTWFyZ2luIHVzZWRIb3Jpem9udGFsTWFyZ2luOwot
ICAgIGF1dG8gcGFkZGluZ0xlZnQgPSBib3hHZW9tZXRyeS5wYWRkaW5nTGVmdCgpLnZhbHVlT3Io
MCk7Ci0gICAgYXV0byBwYWRkaW5nUmlnaHQgPSBib3hHZW9tZXRyeS5wYWRkaW5nUmlnaHQoKS52
YWx1ZU9yKDApOwotICAgIGF1dG8gYm9yZGVyTGVmdCA9IGJveEdlb21ldHJ5LmJvcmRlckxlZnQo
KTsKLSAgICBhdXRvIGJvcmRlclJpZ2h0ID0gYm94R2VvbWV0cnkuYm9yZGVyUmlnaHQoKTsKLSAg
ICBpZiAoIWxlZnQgJiYgIXdpZHRoICYmICFyaWdodCkgewotICAgICAgICAvLyBJZiBhbGwgdGhy
ZWUgb2YgJ2xlZnQnLCAnd2lkdGgnLCBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nOiBGaXJzdCBzZXQg
YW55ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIHRv
IDAuCi0gICAgICAgIC8vIFRoZW4sIGlmIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUg
ZWxlbWVudCBlc3RhYmxpc2hpbmcgdGhlIHN0YXRpYy1wb3NpdGlvbiBjb250YWluaW5nIGJsb2Nr
IGlzICdsdHInIHNldCAnbGVmdCcgdG8gdGhlIHN0YXRpYwotICAgICAgICAvLyBwb3NpdGlvbiBh
bmQgYXBwbHkgcnVsZSBudW1iZXIgdGhyZWUgYmVsb3c7IG90aGVyd2lzZSwgc2V0ICdyaWdodCcg
dG8gdGhlIHN0YXRpYyBwb3NpdGlvbiBhbmQgYXBwbHkgcnVsZSBudW1iZXIgb25lIGJlbG93Lgot
ICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigw
KSB9OwotCi0gICAgICAgIGF1dG8gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uID0gc3RhdGljSG9y
aXpvbnRhbFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChsYXlvdXRCb3gsIGhvcml6b250
YWxDb25zdHJhaW50cyk7Ci0gICAgICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKQotICAg
ICAgICAgICAgbGVmdCA9IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbjsKLSAgICAgICAgZWxzZQot
ICAgICAgICAgICAgcmlnaHQgPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb247Ci0gICAgfSBlbHNl
IGlmIChsZWZ0ICYmIHdpZHRoICYmIHJpZ2h0KSB7Ci0gICAgICAgIC8vIElmIG5vbmUgb2YgdGhl
IHRocmVlIGlzICdhdXRvJzogSWYgYm90aCAnbWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0
JyBhcmUgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4dHJhIGNvbnN0cmFp
bnQgdGhhdCB0aGUgdHdvIG1hcmdpbnMgZ2V0IGVxdWFsIHZhbHVlcywKLSAgICAgICAgLy8gdW5s
ZXNzIHRoaXMgd291bGQgbWFrZSB0aGVtIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIHdoZW4gZGly
ZWN0aW9uIG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGlzICdsdHInICgncnRsJyksIHNldCAnbWFy
Z2luLWxlZnQnICgnbWFyZ2luLXJpZ2h0JykgdG8gemVybyBhbmQKLSAgICAgICAgLy8gc29sdmUg
Zm9yICdtYXJnaW4tcmlnaHQnICgnbWFyZ2luLWxlZnQnKS4gSWYgb25lIG9mICdtYXJnaW4tbGVm
dCcgb3IgJ21hcmdpbi1yaWdodCcgaXMgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gZm9yIHRo
YXQgdmFsdWUuCi0gICAgICAgIC8vIElmIHRoZSB2YWx1ZXMgYXJlIG92ZXItY29uc3RyYWluZWQs
IGlnbm9yZSB0aGUgdmFsdWUgZm9yICdsZWZ0JyAoaW4gY2FzZSB0aGUgJ2RpcmVjdGlvbicgcHJv
cGVydHkgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ3J0bCcpIG9yICdyaWdodCcKLSAgICAg
ICAgLy8gKGluIGNhc2UgJ2RpcmVjdGlvbicgaXMgJ2x0cicpIGFuZCBzb2x2ZSBmb3IgdGhhdCB2
YWx1ZS4KLSAgICAgICAgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgJiYgIWNv
bXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKLSAgICAgICAgICAgIGF1dG8gbWFyZ2luU3Rh
cnRBbmRFbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBw
YWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnJpZ2h0
KTsKLSAgICAgICAgICAgIGlmIChtYXJnaW5TdGFydEFuZEVuZCA+PSAwKQotICAgICAgICAgICAg
ICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyBtYXJnaW5TdGFydEFuZEVuZCAvIDIsIG1hcmdp
blN0YXJ0QW5kRW5kIC8gMiB9OwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAg
aWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlZEhv
cml6b250YWxNYXJnaW4uc3RhcnQgPSAwX2x1OwotICAgICAgICAgICAgICAgICAgICB1c2VkSG9y
aXpvbnRhbE1hcmdpbi5lbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIHVzZWRI
b3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRo
ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqcmlnaHQpOwotICAgICAgICAgICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9
IDBfbHU7Ci0gICAgICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0g
Y29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQg
KyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFy
Z2luLmVuZCArICpyaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAg
ICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQpIHsKLSAgICAg
ICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uZW5kOwotICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSBjb250YWlu
aW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0
aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5k
ICsgKnJpZ2h0KTsKLSAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LmVuZCkgewotICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSAqY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0OwotICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJn
aW4uZW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1h
cmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdS
aWdodCArIGJvcmRlclJpZ2h0ICsgKnJpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0
YXJ0LCAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCB9OwotICAgICAgICAgICAgLy8gT3Zl
cmNvbnN0cmFpbmVkPyBJZ25vcmUgcmlnaHQgKGxlZnQpLgotICAgICAgICAgICAgaWYgKGlzTGVm
dFRvUmlnaHREaXJlY3Rpb24pCi0gICAgICAgICAgICAgICAgcmlnaHQgPSBjb250YWluaW5nQmxv
Y2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArICpsZWZ0ICsgYm9yZGVyTGVm
dCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1
c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgIGxlZnQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5z
dGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCAr
IGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKLSAgICAg
ICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE90aGVyd2lzZSwgc2V0ICdhdXRvJyB2YWx1
ZXMgZm9yICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIHRvIDAsIGFuZCBwaWNrIHRo
ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzaXggcnVsZXMgdGhhdCBhcHBsaWVzLgotICAgICAgICB1
c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZh
bHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OwotICAg
IH0KLQotICAgIGlmICghbGVmdCAmJiAhd2lkdGggJiYgcmlnaHQpIHsKLSAgICAgICAgLy8gIzEK
LSAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgd2lkdGggYnkgc29sdmluZyBmb3Ig
J3dpZHRoJyBhZnRlciBzZXR0aW5nICdsZWZ0JyAoaW4gY2FzZSAxKSB0byAwCi0gICAgICAgIGxl
ZnQgPSBMYXlvdXRVbml0IHsgMCB9OwotICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gY29u
dGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAr
IGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsg
dXNlZEhvcml6b250YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKLSAgICAgICAgd2lkdGggPSBzaHJp
bmtUb0ZpdFdpZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpOwotICAgICAgICBsZWZ0ID0g
Y29udGFpbmluZ0Jsb2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3Jk
ZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgICsgYm9yZGVyUmln
aHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOwotICAgIH0gZWxzZSBpZiAo
IWxlZnQgJiYgIXJpZ2h0ICYmIHdpZHRoKSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIGF1dG8g
c3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uRm9yT3V0
T2ZGbG93UG9zaXRpb25lZChsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAg
ICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBsZWZ0ID0gc3Rh
dGljSG9yaXpvbnRhbFBvc2l0aW9uOwotICAgICAgICAgICAgcmlnaHQgPSBjb250YWluaW5nQmxv
Y2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVm
dCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1
c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
cmlnaHQgPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb247Ci0gICAgICAgICAgICBsZWZ0ID0gY29u
dGFpbmluZ0Jsb2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJM
ZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCAr
IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7Ci0gICAgICAgIH0KLSAgICB9IGVs
c2UgaWYgKCF3aWR0aCAmJiAhcmlnaHQgJiYgbGVmdCkgewotICAgICAgICAvLyAjMwotICAgICAg
ICAvLyBDYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSB3aWR0aCBieSBzb2x2aW5nIGZvciAnd2lkdGgn
IGFmdGVyIHNldHRpbmcgJ3JpZ2h0JyAoaW4gY2FzZSAzKSB0byAwCi0gICAgICAgIHJpZ2h0ID0g
TGF5b3V0VW5pdCB7IDAgfTsKLSAgICAgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGNvbnRhaW5p
bmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3Jk
ZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRI
b3Jpem9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7Ci0gICAgICAgIHdpZHRoID0gc2hyaW5rVG9G
aXRXaWR0aChsYXlvdXRCb3gsIGF2YWlsYWJsZVdpZHRoKTsKLSAgICAgICAgcmlnaHQgPSBjb250
YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsg
Ym9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVy
UmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAgIH0gZWxzZSBpZiAoIWxlZnQg
JiYgd2lkdGggJiYgcmlnaHQpIHsKLSAgICAgICAgLy8gIzQKLSAgICAgICAgbGVmdCA9IGNvbnRh
aW5pbmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVm
dCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1
c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOwotICAgIH0gZWxzZSBpZiAoIXdpZHRo
ICYmIGxlZnQgJiYgcmlnaHQpIHsKLSAgICAgICAgLy8gIzUKLSAgICAgICAgd2lkdGggPSBjb250
YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsg
Ym9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1
c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOwotICAgIH0gZWxzZSBpZiAoIXJpZ2h0
ICYmIGxlZnQgJiYgd2lkdGgpIHsKLSAgICAgICAgLy8gIzYKLSAgICAgICAgcmlnaHQgPSBjb250
YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsg
Ym9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVy
UmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAgIH0KLQotICAgIEFTU0VSVChs
ZWZ0KTsKLSAgICBBU1NFUlQocmlnaHQpOwotICAgIEFTU0VSVCh3aWR0aCk7Ci0KLSAgICAvLyBG
b3Igb3V0LW9mLWZsb3cgZWxlbWVudHMgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgZm9ybWVkIGJ5
IHRoZSBwYWRkaW5nIGVkZ2Ugb2YgdGhlIGFuY2VzdG9yLgotICAgIC8vIEF0IHRoaXMgcG9pbnQg
dGhlIHBvc2l0aW9uZWQgdmFsdWUgaXMgaW4gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBw
YWRkaW5nIGJveC4gTGV0J3MgY29udmVydCBpdCB0byBib3JkZXIgYm94IGNvb3JkaW5hdGUgc3lz
dGVtLgotICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZSA9IGhvcml6
b250YWxDb25zdHJhaW50cy5sb2dpY2FsTGVmdDsKLSAgICAqbGVmdCArPSBjb250YWluaW5nQmxv
Y2tQYWRkaW5nVmVydGljYWxFZGdlOwotICAgICpyaWdodCArPSBjb250YWluaW5nQmxvY2tQYWRk
aW5nVmVydGljYWxFZGdlOwotCi0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0
TGF5b3V0LCBzdHJlYW0gPDwgIltQb3NpdGlvbl1bV2lkdGhdW01hcmdpbl0gLT4gb3V0LW9mLWZs
b3cgbm9uLXJlcGxhY2VkIC0+IGxlZnQoIiA8PCAqbGVmdCA8PCAicHgpIHJpZ2h0KCIgIDw8ICpy
aWdodCA8PCAicHgpIHdpZHRoKCIgPDwgKndpZHRoIDw8ICJweCkgbWFyZ2luKCIgPDwgdXNlZEhv
cml6b250YWxNYXJnaW4uc3RhcnQgPDwgInB4LCAiICA8PCB1c2VkSG9yaXpvbnRhbE1hcmdpbi5l
bmQgPDwgInB4KSBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7Ci0gICAgcmV0dXJu
IHsgKmxlZnQsICpyaWdodCwgeyAqd2lkdGgsIHVzZWRIb3Jpem9udGFsTWFyZ2luIH0gfTsKLX0K
LQotVmVydGljYWxHZW9tZXRyeSBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Om91dE9mRmxv
d1JlcGxhY2VkVmVydGljYWxHZW9tZXRyeShjb25zdCBSZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25z
dCBWZXJ0aWNhbENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlk
ZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgY29uc3QKLXsKLSAg
ICBBU1NFUlQocmVwbGFjZWRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOwotICAgIEFTU0VS
VCh2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxIZWlnaHQpOwotCi0gICAgLy8gMTAuNi41IEFi
c29sdXRlbHkgcG9zaXRpb25lZCwgcmVwbGFjZWQgZWxlbWVudHMKLSAgICAvLwotICAgIC8vIFRo
ZSB1c2VkIHZhbHVlIG9mICdoZWlnaHQnIGlzIGRldGVybWluZWQgYXMgZm9yIGlubGluZSByZXBs
YWNlZCBlbGVtZW50cy4KLSAgICAvLyBJZiAnbWFyZ2luLXRvcCcgb3IgJ21hcmdpbi1ib3R0b20n
IGlzIHNwZWNpZmllZCBhcyAnYXV0bycgaXRzIHVzZWQgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0
aGUgcnVsZXMgYmVsb3cuCi0gICAgLy8gMS4gSWYgYm90aCAndG9wJyBhbmQgJ2JvdHRvbScgaGF2
ZSB0aGUgdmFsdWUgJ2F1dG8nLCByZXBsYWNlICd0b3AnIHdpdGggdGhlIGVsZW1lbnQncyBzdGF0
aWMgcG9zaXRpb24uCi0gICAgLy8gMi4gSWYgJ2JvdHRvbScgaXMgJ2F1dG8nLCByZXBsYWNlIGFu
eSAnYXV0bycgb24gJ21hcmdpbi10b3AnIG9yICdtYXJnaW4tYm90dG9tJyB3aXRoICcwJy4KLSAg
ICAvLyAzLiBJZiBhdCB0aGlzIHBvaW50IGJvdGggJ21hcmdpbi10b3AnIGFuZCAnbWFyZ2luLWJv
dHRvbScgYXJlIHN0aWxsICdhdXRvJywgc29sdmUgdGhlIGVxdWF0aW9uIHVuZGVyIHRoZSBleHRy
YSBjb25zdHJhaW50IHRoYXQgdGhlIHR3byBtYXJnaW5zIG11c3QgZ2V0IGVxdWFsIHZhbHVlcy4K
LSAgICAvLyA0LiBJZiBhdCB0aGlzIHBvaW50IHRoZXJlIGlzIG9ubHkgb25lICdhdXRvJyBsZWZ0
LCBzb2x2ZSB0aGUgZXF1YXRpb24gZm9yIHRoYXQgdmFsdWUuCi0gICAgLy8gNS4gSWYgYXQgdGhp
cyBwb2ludCB0aGUgdmFsdWVzIGFyZSBvdmVyLWNvbnN0cmFpbmVkLCBpZ25vcmUgdGhlIHZhbHVl
IGZvciAnYm90dG9tJyBhbmQgc29sdmUgZm9yIHRoYXQgdmFsdWUuCi0KLSAgICBhdXRvJiBmb3Jt
YXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7Ci0gICAgYXV0byYgc3R5
bGUgPSByZXBsYWNlZEJveC5zdHlsZSgpOwotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0
dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gocmVwbGFjZWRCb3gpOwotICAgIGF1dG8gY29udGFp
bmluZ0Jsb2NrSGVpZ2h0ID0gKnZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbEhlaWdodDsKLSAg
ICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2lj
YWxXaWR0aDsKLQotICAgIGF1dG8gdG9wID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2FsVG9w
KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLSAgICBhdXRvIGJvdHRvbSA9IGNvbXB1dGVkVmFs
dWUoc3R5bGUubG9naWNhbEJvdHRvbSgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0gICAgYXV0
byBoZWlnaHQgPSBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4ocmVwbGFjZWRC
b3gsIGhvcml6b250YWxDb25zdHJhaW50cywgdmVydGljYWxDb25zdHJhaW50cywgb3ZlcnJpZGRl
blZlcnRpY2FsVmFsdWVzKS5jb250ZW50SGVpZ2h0OwotICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNh
bE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKHJlcGxhY2VkQm94LCBo
b3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRNYXJn
aW5CZWZvcmUgPSBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZTsKLSAgICBPcHRpb25hbDxM
YXlvdXRVbml0PiB1c2VkTWFyZ2luQWZ0ZXIgPSBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVy
OwotICAgIGF1dG8gcGFkZGluZ1RvcCA9IGJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9y
KDApOwotICAgIGF1dG8gcGFkZGluZ0JvdHRvbSA9IGJveEdlb21ldHJ5LnBhZGRpbmdCb3R0b20o
KS52YWx1ZU9yKDApOwotICAgIGF1dG8gYm9yZGVyVG9wID0gYm94R2VvbWV0cnkuYm9yZGVyVG9w
KCk7Ci0gICAgYXV0byBib3JkZXJCb3R0b20gPSBib3hHZW9tZXRyeS5ib3JkZXJCb3R0b20oKTsK
LQotICAgIGlmICghdG9wICYmICFib3R0b20pIHsKLSAgICAgICAgLy8gIzEKLSAgICAgICAgdG9w
ID0gc3RhdGljVmVydGljYWxQb3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQocmVwbGFjZWRC
b3gsIHZlcnRpY2FsQ29uc3RyYWludHMpOwotICAgIH0KLQotICAgIGlmICghYm90dG9tKSB7Ci0g
ICAgICAgIC8vICMyCi0gICAgICAgIHVzZWRNYXJnaW5CZWZvcmUgPSBjb21wdXRlZFZlcnRpY2Fs
TWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApOwotICAgICAgICB1c2VkTWFyZ2luQWZ0ZXIgPSB1c2Vk
TWFyZ2luQmVmb3JlOwotICAgIH0KLQotICAgIGlmICghdXNlZE1hcmdpbkJlZm9yZSAmJiAhdXNl
ZE1hcmdpbkFmdGVyKSB7Ci0gICAgICAgIC8vICMzCi0gICAgICAgIGF1dG8gbWFyZ2luQmVmb3Jl
QW5kQWZ0ZXIgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIGJvcmRlclRvcCArIHBh
ZGRpbmdUb3AgKyBoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKmJvdHRv
bSk7Ci0gICAgICAgIHVzZWRNYXJnaW5CZWZvcmUgPSBtYXJnaW5CZWZvcmVBbmRBZnRlciAvIDI7
Ci0gICAgICAgIHVzZWRNYXJnaW5BZnRlciA9IHVzZWRNYXJnaW5CZWZvcmU7Ci0gICAgfQotCi0g
ICAgLy8gIzQKLSAgICBpZiAoIXRvcCkKLSAgICAgICAgdG9wID0gY29udGFpbmluZ0Jsb2NrSGVp
Z2h0IC0gKCp1c2VkTWFyZ2luQmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdo
dCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyICsgKmJv
dHRvbSk7Ci0KLSAgICBpZiAoIWJvdHRvbSkKLSAgICAgICAgYm90dG9tID0gY29udGFpbmluZ0Js
b2NrSGVpZ2h0IC0gKCp0b3AgKyAqdXNlZE1hcmdpbkJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRp
bmdUb3AgKyBoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKnVzZWRNYXJn
aW5BZnRlcik7Ci0KLSAgICBpZiAoIXVzZWRNYXJnaW5CZWZvcmUpCi0gICAgICAgIHVzZWRNYXJn
aW5CZWZvcmUgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIGJvcmRlclRvcCArIHBh
ZGRpbmdUb3AgKyBoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKnVzZWRN
YXJnaW5BZnRlciArICpib3R0b20pOwotCi0gICAgaWYgKCF1c2VkTWFyZ2luQWZ0ZXIpCi0gICAg
ICAgIHVzZWRNYXJnaW5BZnRlciA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgKnVz
ZWRNYXJnaW5CZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgaGVpZ2h0ICsgcGFkZGlu
Z0JvdHRvbSArIGJvcmRlckJvdHRvbSArICpib3R0b20pOwotCi0gICAgLy8gIzUKLSAgICBhdXRv
IGJveEhlaWdodCA9ICp0b3AgKyAqdXNlZE1hcmdpbkJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRp
bmdUb3AgKyBoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKnVzZWRNYXJn
aW5BZnRlciArICpib3R0b207Ci0gICAgaWYgKGJveEhlaWdodCA+IGNvbnRhaW5pbmdCbG9ja0hl
aWdodCkKLSAgICAgICAgYm90dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyAq
dXNlZE1hcmdpbkJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBoZWlnaHQgKyBwYWRk
aW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKnVzZWRNYXJnaW5BZnRlcik7IAotCi0gICAgLy8g
Rm9yIG91dC1vZi1mbG93IGVsZW1lbnRzIHRoZSBjb250YWluaW5nIGJsb2NrIGlzIGZvcm1lZCBi
eSB0aGUgcGFkZGluZyBlZGdlIG9mIHRoZSBhbmNlc3Rvci4KLSAgICAvLyBBdCB0aGlzIHBvaW50
IHRoZSBwb3NpdGlvbmVkIHZhbHVlIGlzIGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUg
cGFkZGluZyBib3guIExldCdzIGNvbnZlcnQgaXQgdG8gYm9yZGVyIGJveCBjb29yZGluYXRlIHN5
c3RlbS4KLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2UgPSB2ZXJ0
aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7Ci0gICAgKnRvcCArPSBjb250YWluaW5nQmxvY2tQ
YWRkaW5nVmVydGljYWxFZGdlOwotICAgICpib3R0b20gKz0gY29udGFpbmluZ0Jsb2NrUGFkZGlu
Z1ZlcnRpY2FsRWRnZTsKLQotICAgIEFTU0VSVCh0b3ApOwotICAgIEFTU0VSVChib3R0b20pOwot
ICAgIEFTU0VSVCh1c2VkTWFyZ2luQmVmb3JlKTsKLSAgICBBU1NFUlQodXNlZE1hcmdpbkFmdGVy
KTsKLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8
PCAiW1Bvc2l0aW9uXVtIZWlnaHRdW01hcmdpbl0gLT4gb3V0LW9mLWZsb3cgcmVwbGFjZWQgLT4g
dG9wKCIgPDwgKnRvcCA8PCAicHgpIGJvdHRvbSgiICA8PCAqYm90dG9tIDw8ICJweCkgaGVpZ2h0
KCIgPDwgaGVpZ2h0IDw8ICJweCkgbWFyZ2luKCIgPDwgKnVzZWRNYXJnaW5CZWZvcmUgPDwgInB4
LCAiICA8PCAqdXNlZE1hcmdpbkFmdGVyIDw8ICJweCkgbGF5b3V0Qm94KCIgPDwgJnJlcGxhY2Vk
Qm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIHsgKnRvcCwgKmJvdHRvbSwgeyBoZWlnaHQsIHsgKnVz
ZWRNYXJnaW5CZWZvcmUsICp1c2VkTWFyZ2luQWZ0ZXIgfSB9IH07Ci19Ci0KLUhvcml6b250YWxH
ZW9tZXRyeSBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Om91dE9mRmxvd1JlcGxhY2VkSG9y
aXpvbnRhbEdlb21ldHJ5KGNvbnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRpY2Fs
Q29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9u
dGFsVmFsdWVzJiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKLXsKLSAgICBBU1NFUlQocmVw
bGFjZWRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOwotCi0gICAgLy8gMTAuMy44IEFic29s
dXRlbHkgcG9zaXRpb25lZCwgcmVwbGFjZWQgZWxlbWVudHMKLSAgICAvLyBJbiB0aGlzIGNhc2Us
IHNlY3Rpb24gMTAuMy43IGFwcGxpZXMgdXAgdGhyb3VnaCBhbmQgaW5jbHVkaW5nIHRoZSBjb25z
dHJhaW50IGVxdWF0aW9uLCBidXQgdGhlIHJlc3Qgb2Ygc2VjdGlvbiAxMC4zLjcgaXMgcmVwbGFj
ZWQgYnkgdGhlIGZvbGxvd2luZyBydWxlczoKLSAgICAvLwotICAgIC8vIFRoZSB1c2VkIHZhbHVl
IG9mICd3aWR0aCcgaXMgZGV0ZXJtaW5lZCBhcyBmb3IgaW5saW5lIHJlcGxhY2VkIGVsZW1lbnRz
LiBJZiAnbWFyZ2luLWxlZnQnIG9yICdtYXJnaW4tcmlnaHQnIGlzIHNwZWNpZmllZCBhcyAnYXV0
bycgaXRzIHVzZWQgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcnVsZXMgYmVsb3cuCi0gICAg
Ly8gMS4gSWYgYm90aCAnbGVmdCcgYW5kICdyaWdodCcgaGF2ZSB0aGUgdmFsdWUgJ2F1dG8nLCB0
aGVuIGlmIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgZWxlbWVudCBlc3RhYmxpc2hp
bmcgdGhlIHN0YXRpYy1wb3NpdGlvbiBjb250YWluaW5nIGJsb2NrIGlzICdsdHInLAotICAgIC8v
ICAgc2V0ICdsZWZ0JyB0byB0aGUgc3RhdGljIHBvc2l0aW9uOyBlbHNlIGlmICdkaXJlY3Rpb24n
IGlzICdydGwnLCBzZXQgJ3JpZ2h0JyB0byB0aGUgc3RhdGljIHBvc2l0aW9uLgotICAgIC8vIDIu
IElmICdsZWZ0JyBvciAncmlnaHQnIGFyZSAnYXV0bycsIHJlcGxhY2UgYW55ICdhdXRvJyBvbiAn
bWFyZ2luLWxlZnQnIG9yICdtYXJnaW4tcmlnaHQnIHdpdGggJzAnLgotICAgIC8vIDMuIElmIGF0
IHRoaXMgcG9pbnQgYm90aCAnbWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyBhcmUgc3Rp
bGwgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4dHJhIGNvbnN0cmFpbnQg
dGhhdCB0aGUgdHdvIG1hcmdpbnMgbXVzdCBnZXQgZXF1YWwgdmFsdWVzLAotICAgIC8vICAgdW5s
ZXNzIHRoaXMgd291bGQgbWFrZSB0aGVtIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIHdoZW4gdGhl
IGRpcmVjdGlvbiBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAnbHRyJyAoJ3J0bCcpLCBzZXQg
J21hcmdpbi1sZWZ0JyAoJ21hcmdpbi1yaWdodCcpIHRvIHplcm8gYW5kCi0gICAgLy8gICBzb2x2
ZSBmb3IgJ21hcmdpbi1yaWdodCcgKCdtYXJnaW4tbGVmdCcpLgotICAgIC8vIDQuIElmIGF0IHRo
aXMgcG9pbnQgdGhlcmUgaXMgYW4gJ2F1dG8nIGxlZnQsIHNvbHZlIHRoZSBlcXVhdGlvbiBmb3Ig
dGhhdCB2YWx1ZS4KLSAgICAvLyA1LiBJZiBhdCB0aGlzIHBvaW50IHRoZSB2YWx1ZXMgYXJlIG92
ZXItY29uc3RyYWluZWQsIGlnbm9yZSB0aGUgdmFsdWUgZm9yIGVpdGhlciAnbGVmdCcgKGluIGNh
c2UgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGlzICdy
dGwnKSBvcgotICAgIC8vICAgJ3JpZ2h0JyAoaW4gY2FzZSAnZGlyZWN0aW9uJyBpcyAnbHRyJykg
YW5kIHNvbHZlIGZvciB0aGF0IHZhbHVlLgotCi0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQg
PSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgpOwotICAgIGF1dG8mIHN0eWxlID0gcmVwbGFjZWRC
b3guc3R5bGUoKTsKLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdl
b21ldHJ5Rm9yQm94KHJlcGxhY2VkQm94KTsKLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRo
ID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAgICBhdXRvIGlzTGVmdFRv
UmlnaHREaXJlY3Rpb24gPSByZXBsYWNlZEJveC5jb250YWluaW5nQmxvY2soKS5zdHlsZSgpLmlz
TGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKLQotICAgIGF1dG8gbGVmdCA9IGNvbXB1dGVkVmFsdWUo
c3R5bGUubG9naWNhbExlZnQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgIGF1dG8gcmln
aHQgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxSaWdodCgpLCBjb250YWluaW5nQmxvY2tX
aWR0aCk7Ci0gICAgYXV0byBjb21wdXRlZEhvcml6b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMp
OwotICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRNYXJnaW5TdGFydCA9IGNvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbi5zdGFydDsKLSAgICBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkTWFyZ2lu
RW5kID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZDsKLSAgICBhdXRvIHdpZHRoID0gaW5s
aW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxD
b25zdHJhaW50cywgdmVydGljYWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMpLmNvbnRlbnRXaWR0aDsKLSAgICBhdXRvIHBhZGRpbmdMZWZ0ID0gYm94R2VvbWV0cnkucGFk
ZGluZ0xlZnQoKS52YWx1ZU9yKDApOwotICAgIGF1dG8gcGFkZGluZ1JpZ2h0ID0gYm94R2VvbWV0
cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVPcigwKTsKLSAgICBhdXRvIGJvcmRlckxlZnQgPSBib3hH
ZW9tZXRyeS5ib3JkZXJMZWZ0KCk7Ci0gICAgYXV0byBib3JkZXJSaWdodCA9IGJveEdlb21ldHJ5
LmJvcmRlclJpZ2h0KCk7Ci0KLSAgICBpZiAoIWxlZnQgJiYgIXJpZ2h0KSB7Ci0gICAgICAgIC8v
ICMxCi0gICAgICAgIGF1dG8gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uID0gc3RhdGljSG9yaXpv
bnRhbFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChyZXBsYWNlZEJveCwgaG9yaXpvbnRh
bENvbnN0cmFpbnRzKTsKLSAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pCi0gICAg
ICAgICAgICBsZWZ0ID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uOwotICAgICAgICBlbHNlCi0g
ICAgICAgICAgICByaWdodCA9IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbjsKLSAgICB9Ci0KLSAg
ICBpZiAoIWxlZnQgfHwgIXJpZ2h0KSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIHVzZWRNYXJn
aW5TdGFydCA9IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDApOwotICAg
ICAgICB1c2VkTWFyZ2luRW5kID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9y
KDApOwotICAgIH0KLQotICAgIGlmICghdXNlZE1hcmdpblN0YXJ0ICYmICF1c2VkTWFyZ2luRW5k
KSB7Ci0gICAgICAgIC8vICMzCi0gICAgICAgIGF1dG8gbWFyZ2luU3RhcnRBbmRFbmQgPSBjb250
YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdp
ZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqcmlnaHQpOwotICAgICAgICBpZiAo
bWFyZ2luU3RhcnRBbmRFbmQgPj0gMCkgewotICAgICAgICAgICAgdXNlZE1hcmdpblN0YXJ0ID0g
bWFyZ2luU3RhcnRBbmRFbmQgLyAyOwotICAgICAgICAgICAgdXNlZE1hcmdpbkVuZCA9IHVzZWRN
YXJnaW5TdGFydDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdXNlZE1hcmdpblN0YXJ0ID0gMF9sdTsK
LSAgICAgICAgICAgICAgICB1c2VkTWFyZ2luRW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAo
KmxlZnQgKyAqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lk
dGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICpyaWdodCk7Ci0gICAgICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgICAgIHVzZWRNYXJnaW5FbmQgPSAwX2x1OwotICAgICAgICAg
ICAgICAgIHVzZWRNYXJnaW5TdGFydCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsg
Ym9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJS
aWdodCArICp1c2VkTWFyZ2luRW5kICsgKnJpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgIH0KLQotICAgIC8vICM0Ci0gICAgaWYgKCFsZWZ0KQotICAgICAgICBsZWZ0ID0gY29u
dGFpbmluZ0Jsb2NrV2lkdGggLSAoKnVzZWRNYXJnaW5TdGFydCArIGJvcmRlckxlZnQgKyBwYWRk
aW5nTGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNlZE1hcmdp
bkVuZCArICpyaWdodCk7Ci0KLSAgICBpZiAoIXJpZ2h0KQotICAgICAgICByaWdodCA9IGNvbnRh
aW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgKnVzZWRNYXJnaW5TdGFydCArIGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNl
ZE1hcmdpbkVuZCk7Ci0KLSAgICBpZiAoIXVzZWRNYXJnaW5TdGFydCkKLSAgICAgICAgdXNlZE1h
cmdpblN0YXJ0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyBib3JkZXJMZWZ0ICsg
cGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnVzZWRN
YXJnaW5FbmQgKyAqcmlnaHQpOwotCi0gICAgaWYgKCF1c2VkTWFyZ2luRW5kKQotICAgICAgICB1
c2VkTWFyZ2luRW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyAqdXNlZE1hcmdp
blN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQg
KyBib3JkZXJSaWdodCArICpyaWdodCk7Ci0KLSAgICBhdXRvIGJveFdpZHRoID0gKCpsZWZ0ICsg
KnVzZWRNYXJnaW5TdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFk
ZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNlZE1hcmdpbkVuZCArICpyaWdodCk7Ci0gICAg
aWYgKGJveFdpZHRoID4gY29udGFpbmluZ0Jsb2NrV2lkdGgpIHsKLSAgICAgICAgLy8gIzUgT3Zl
ci1jb25zdHJhaW5lZD8KLSAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pCi0gICAg
ICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgKnVzZWRNYXJn
aW5TdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0
ICsgYm9yZGVyUmlnaHQgKyAqdXNlZE1hcmdpbkVuZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAg
ICAgIGxlZnQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqdXNlZE1hcmdpblN0YXJ0ICsgYm9y
ZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdo
dCArICp1c2VkTWFyZ2luRW5kICsgKnJpZ2h0KTsKLSAgICB9Ci0KLSAgICBBU1NFUlQobGVmdCk7
Ci0gICAgQVNTRVJUKHJpZ2h0KTsKLSAgICBBU1NFUlQodXNlZE1hcmdpblN0YXJ0KTsKLSAgICBB
U1NFUlQodXNlZE1hcmdpbkVuZCk7Ci0KLSAgICAvLyBGb3Igb3V0LW9mLWZsb3cgZWxlbWVudHMg
dGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgZm9ybWVkIGJ5IHRoZSBwYWRkaW5nIGVkZ2Ugb2YgdGhl
IGFuY2VzdG9yLgotICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBvc2l0aW9uZWQgdmFsdWUgaXMg
aW4gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBwYWRkaW5nIGJveC4gTGV0J3MgY29udmVy
dCBpdCB0byBib3JkZXIgYm94IGNvb3JkaW5hdGUgc3lzdGVtLgotICAgIGF1dG8gY29udGFpbmlu
Z0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZSA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2Fs
TGVmdDsKLSAgICAqbGVmdCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOwot
ICAgICpyaWdodCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOwotCi0gICAg
TE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltQb3Np
dGlvbl1bV2lkdGhdW01hcmdpbl0gLT4gb3V0LW9mLWZsb3cgcmVwbGFjZWQgLT4gbGVmdCgiIDw8
ICpsZWZ0IDw8ICJweCkgcmlnaHQoIiAgPDwgKnJpZ2h0IDw8ICJweCkgd2lkdGgoIiA8PCB3aWR0
aCA8PCAicHgpIG1hcmdpbigiIDw8ICp1c2VkTWFyZ2luU3RhcnQgPDwgInB4LCAiICA8PCAqdXNl
ZE1hcmdpbkVuZCA8PCAicHgpIGxheW91dEJveCgiIDw8ICZyZXBsYWNlZEJveCA8PCAiKSIpOwot
ICAgIHJldHVybiB7ICpsZWZ0LCAqcmlnaHQsIHsgd2lkdGgsIHsgKnVzZWRNYXJnaW5TdGFydCwg
KnVzZWRNYXJnaW5FbmQgfSB9IH07Ci19Ci0KLUNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gRm9ybWF0
dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wbGljYXRlZENhc2VzKGNvbnN0IEJveCYgbGF5b3V0
Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywg
Y29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMp
IGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKLSAgICAv
LyBUT0RPOiBVc2UgY29tcGxpY2F0ZWQtY2FzZSBmb3IgZG9jdW1lbnQgcmVuZGVyZXIgZm9yIG5v
dyAoc2VlIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbkZsb3dIZWlnaHRBbmRN
YXJnaW4pLgotICAgIEFTU0VSVCgobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpICYmIGxheW91
dEJveC5pc0luRmxvdygpICYmICFsYXlvdXRCb3guaXNPdmVyZmxvd1Zpc2libGUoKSkgfHwgbGF5
b3V0Qm94LmlzSW5saW5lQmxvY2tCb3goKSB8fCBsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9u
ZWQoKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpIHx8IGxheW91dEJveC5pc1RhYmxlQm94
KCkpOwotCi0gICAgLy8gMTAuNi42IENvbXBsaWNhdGVkIGNhc2VzCi0gICAgLy8KLSAgICAvLyBC
bG9jay1sZXZlbCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93IHdoZW4gJ292
ZXJmbG93JyBkb2VzIG5vdCBjb21wdXRlIHRvICd2aXNpYmxlJyAoZXhjZXB0IGlmIHRoZSAnb3Zl
cmZsb3cnIHByb3BlcnR5J3MgdmFsdWUgaGFzIGJlZW4gcHJvcGFnYXRlZCB0byB0aGUgdmlld3Bv
cnQpLgotICAgIC8vICdJbmxpbmUtYmxvY2snLCBub24tcmVwbGFjZWQgZWxlbWVudHMuCi0gICAg
Ly8gRmxvYXRpbmcsIG5vbi1yZXBsYWNlZCBlbGVtZW50cy4KLSAgICAvLwotICAgIC8vIDEuIElm
ICdtYXJnaW4tdG9wJywgb3IgJ21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHRoZWlyIHVzZWQg
dmFsdWUgaXMgMC4KLSAgICAvLyAyLiBJZiAnaGVpZ2h0JyBpcyAnYXV0bycsIHRoZSBoZWlnaHQg
ZGVwZW5kcyBvbiB0aGUgZWxlbWVudCdzIGRlc2NlbmRhbnRzIHBlciAxMC42LjcuCi0KLSAgICBh
dXRvIGhlaWdodCA9IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQgPyBvdmVycmlkZGVu
VmVydGljYWxWYWx1ZXMuaGVpZ2h0LnZhbHVlKCkgOiBjb21wdXRlZEhlaWdodChsYXlvdXRCb3gp
OwotICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZFZl
cnRpY2FsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAvLyAj
MQotICAgIGF1dG8gdXNlZFZlcnRpY2FsTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25D
b2xsYXBzZWRWYWx1ZXMgeyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDAp
LCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsgCi0gICAgLy8gIzIK
LSAgICBpZiAoIWhlaWdodCkgewotICAgICAgICBBU1NFUlQoaXNIZWlnaHRBdXRvKGxheW91dEJv
eCkpOwotICAgICAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSB8fCAhZG93bmNh
c3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQot
ICAgICAgICAgICAgaGVpZ2h0ID0gMF9sdTsKLSAgICAgICAgZWxzZSBpZiAobGF5b3V0Qm94Lmlz
RG9jdW1lbnRCb3goKSAmJiAhbGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQo
KSkgewotICAgICAgICAgICAgYXV0byYgZG9jdW1lbnRCb3ggPSBkb3duY2FzdDxDb250YWluZXJC
b3g+KGxheW91dEJveCk7Ci0gICAgICAgICAgICBhdXRvIHRvcCA9IEJveEdlb21ldHJ5OjptYXJn
aW5Cb3hSZWN0KGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goKmRvY3VtZW50Qm94
LmZpcnN0SW5GbG93Q2hpbGQoKSkpLnRvcCgpOwotICAgICAgICAgICAgYXV0byBib3R0b20gPSBC
b3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9y
Qm94KCpkb2N1bWVudEJveC5sYXN0SW5GbG93Q2hpbGQoKSkpLmJvdHRvbSgpOwotICAgICAgICAg
ICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgKHF1aXJrPykgYmVoYXZpb3Igc2luY2UgdGhlIGRvY3Vt
ZW50IGJveCBpcyBub3QgYSBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdCBhbmQKLSAgICAgICAgICAg
IC8vIGFsbCB0aGUgZmxvYXQgYm94ZXMgZW5kIHVwIGF0IHRoZSBJQ0IgbGV2ZWwuCi0gICAgICAg
ICAgICBhdXRvJiBpbml0aWFsQ29udGFpbmluZ0Jsb2NrID0gZG9jdW1lbnRCb3guZm9ybWF0dGlu
Z0NvbnRleHRSb290KCk7Ci0gICAgICAgICAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0
aW5nQ29udGV4dCB7IGZvcm1hdHRpbmdDb250ZXh0KCksIGxheW91dFN0YXRlKCkuZXN0YWJsaXNo
ZWRGb3JtYXR0aW5nU3RhdGUoaW5pdGlhbENvbnRhaW5pbmdCbG9jaykuZmxvYXRpbmdTdGF0ZSgp
IH07Ci0gICAgICAgICAgICBpZiAoYXV0byBmbG9hdEJvdHRvbSA9IGZsb2F0aW5nQ29udGV4dC5i
b3R0b20oKSkgewotICAgICAgICAgICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4PExheW91dFVuaXQ+
KCpmbG9hdEJvdHRvbSwgYm90dG9tKTsKLSAgICAgICAgICAgICAgICBhdXRvIGZsb2F0VG9wID0g
ZmxvYXRpbmdDb250ZXh0LnRvcCgpOwotICAgICAgICAgICAgICAgIEFTU0VSVChmbG9hdFRvcCk7
Ci0gICAgICAgICAgICAgICAgdG9wID0gc3RkOjptaW48TGF5b3V0VW5pdD4oKmZsb2F0VG9wLCB0
b3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGVpZ2h0ID0gYm90dG9tIC0gdG9wOwot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQVNTRVJUKGxheW91dEJveC5lc3RhYmxpc2hl
c0Zvcm1hdHRpbmdDb250ZXh0KCkpOwotICAgICAgICAgICAgaGVpZ2h0ID0gY29udGVudEhlaWdo
dEZvckZvcm1hdHRpbmdDb250ZXh0Um9vdChkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJv
eCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQVNTRVJUKGhlaWdodCk7Ci0KLSAgICBMT0df
V0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW0hlaWdodF1b
TWFyZ2luXSAtPiBmbG9hdGluZyBub24tcmVwbGFjZWQgLT4gaGVpZ2h0KCIgPDwgKmhlaWdodCA8
PCAicHgpIG1hcmdpbigiIDw8IHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPDwgInB4LCAiIDw8
IHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciA8PCAicHgpIC0+IGxheW91dEJveCgiIDw8ICZsYXlv
dXRCb3ggPDwgIikiKTsKLSAgICByZXR1cm4gQ29udGVudEhlaWdodEFuZE1hcmdpbiB7ICpoZWln
aHQsIHVzZWRWZXJ0aWNhbE1hcmdpbiB9OwotfQotCi1Db250ZW50V2lkdGhBbmRNYXJnaW4gRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpmbG9hdGluZ05vblJlcGxhY2VkQ29udGVudFdpZHRo
QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3gu
aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSk7Ci0K
LSAgICAvLyAxMC4zLjUgRmxvYXRpbmcsIG5vbi1yZXBsYWNlZCBlbGVtZW50cwotICAgIC8vCi0g
ICAgLy8gMS4gSWYgJ21hcmdpbi1sZWZ0Jywgb3IgJ21hcmdpbi1yaWdodCcgYXJlIGNvbXB1dGVk
IGFzICdhdXRvJywgdGhlaXIgdXNlZCB2YWx1ZSBpcyAnMCcuCi0gICAgLy8gMi4gSWYgJ3dpZHRo
JyBpcyBjb21wdXRlZCBhcyAnYXV0bycsIHRoZSB1c2VkIHZhbHVlIGlzIHRoZSAic2hyaW5rLXRv
LWZpdCIgd2lkdGguCi0KLSAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21l
dHJ5Ojpjb21wdXRlZEhvcml6b250YWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3Ry
YWludHMpOwotCi0gICAgLy8gIzEKLSAgICBhdXRvIHVzZWRIb3Jpem9udGFsbE1hcmdpbiA9IFVz
ZWRIb3Jpem9udGFsTWFyZ2luIHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVl
T3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OwotICAgIC8v
ICMyCi0gICAgYXV0byB3aWR0aCA9IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoID8g
b3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGggOiBjb21wdXRlZFdpZHRoKGxheW91dEJv
eCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aCk7Ci0gICAgaWYgKCF3aWR0aCkK
LSAgICAgICAgd2lkdGggPSBzaHJpbmtUb0ZpdFdpZHRoKGxheW91dEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLmxvZ2ljYWxXaWR0aCk7Ci0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGlu
Z0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1dpZHRoXVtNYXJnaW5dIC0+IGZsb2F0aW5nIG5v
bi1yZXBsYWNlZCAtPiB3aWR0aCgiIDw8ICp3aWR0aCA8PCAicHgpIG1hcmdpbigiIDw8IHVzZWRI
b3Jpem9udGFsbE1hcmdpbi5zdGFydCA8PCAicHgsICIgPDwgdXNlZEhvcml6b250YWxsTWFyZ2lu
LmVuZCA8PCAicHgpIC0+IGxheW91dEJveCgiIDw8ICZsYXlvdXRCb3ggPDwgIikiKTsKLSAgICBy
ZXR1cm4gQ29udGVudFdpZHRoQW5kTWFyZ2luIHsgKndpZHRoLCB1c2VkSG9yaXpvbnRhbGxNYXJn
aW4gfTsKLX0KLQotQ29udGVudEhlaWdodEFuZE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnk6OmZsb2F0aW5nUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IFJlcGxh
Y2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9u
dGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRl
blZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAgIEFTU0VSVChyZXBsYWNlZEJveC5pc0Zsb2F0
aW5nUG9zaXRpb25lZCgpKTsKLQotICAgIC8vIDEwLjYuMiBJbmxpbmUgcmVwbGFjZWQgZWxlbWVu
dHMsIGJsb2NrLWxldmVsIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93LCAnaW5saW5l
LWJsb2NrJwotICAgIC8vIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93IGFuZCBmbG9h
dGluZyByZXBsYWNlZCBlbGVtZW50cwotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29u
dGV4dExheW91dCwgc3RyZWFtIDw8ICJbSGVpZ2h0XVtNYXJnaW5dIC0+IGZsb2F0aW5nIHJlcGxh
Y2VkIC0+IHJlZGlyZWN0ZWQgdG8gaW5saW5lIHJlcGxhY2VkIik7Ci0gICAgcmV0dXJuIGlubGlu
ZVJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCB7IH0sIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci19Ci0KLUNvbnRlbnRX
aWR0aEFuZE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZsb2F0aW5nUmVwbGFj
ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBj
b25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3Qg
T3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQot
ewotICAgIEFTU0VSVChyZXBsYWNlZEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKTsKLQotICAg
IC8vIDEwLjMuNiBGbG9hdGluZywgcmVwbGFjZWQgZWxlbWVudHMKLSAgICAvLwotICAgIC8vIDEu
IElmICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgYXJlIGNvbXB1dGVkIGFzICdhdXRv
JywgdGhlaXIgdXNlZCB2YWx1ZSBpcyAnMCcuCi0gICAgLy8gMi4gVGhlIHVzZWQgdmFsdWUgb2Yg
J3dpZHRoJyBpcyBkZXRlcm1pbmVkIGFzIGZvciBpbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMuCi0g
ICAgYXV0byBjb21wdXRlZEhvcml6b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRIb3Jp
em9udGFsTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotCi0gICAg
TE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltIZWln
aHRdW01hcmdpbl0gLT4gZmxvYXRpbmcgcmVwbGFjZWQgLT4gcmVkaXJlY3RlZCB0byBpbmxpbmUg
cmVwbGFjZWQiKTsKLSAgICBhdXRvIHVzZWRNYXJnaW4gPSBVc2VkSG9yaXpvbnRhbE1hcmdpbiB7
IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDApLCBjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMCkgfTsKLSAgICByZXR1cm4gaW5saW5lUmVwbGFjZWRD
b250ZW50V2lkdGhBbmRNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywg
eyB9LCB7IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoLCB1c2VkTWFyZ2luIH0pOwot
fQotCi1WZXJ0aWNhbEdlb21ldHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZG
bG93VmVydGljYWxHZW9tZXRyeShjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRpY2FsQ29uc3Ry
YWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVl
cyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRC
b3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOwotCi0gICAgaWYgKCFsYXlvdXRCb3guaXNSZXBs
YWNlZEJveCgpKQotICAgICAgICByZXR1cm4gb3V0T2ZGbG93Tm9uUmVwbGFjZWRWZXJ0aWNhbEdl
b21ldHJ5KGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0
cmFpbnRzLCB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwot
ICAgIHJldHVybiBvdXRPZkZsb3dSZXBsYWNlZFZlcnRpY2FsR2VvbWV0cnkoZG93bmNhc3Q8UmVw
bGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgdmVydGljYWxDb25z
dHJhaW50cywgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKLX0KLQotSG9yaXpvbnRhbEdlb21l
dHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93SG9yaXpvbnRhbEdlb21l
dHJ5KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhv
cml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVydGljYWxD
b25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5I
b3Jpem9udGFsVmFsdWVzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3Np
dGlvbmVkKCkpOwotCi0gICAgaWYgKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQotICAgICAg
ICByZXR1cm4gb3V0T2ZGbG93Tm9uUmVwbGFjZWRIb3Jpem9udGFsR2VvbWV0cnkoZG93bmNhc3Q8
Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRk
ZW5Ib3Jpem9udGFsVmFsdWVzKTsKLSAgICByZXR1cm4gb3V0T2ZGbG93UmVwbGFjZWRIb3Jpem9u
dGFsR2VvbWV0cnkoZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxD
b25zdHJhaW50cywgdmVydGljYWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMpOwotfQotCi1Db250ZW50SGVpZ2h0QW5kTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeTo6ZmxvYXRpbmdDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29u
c3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNv
bnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKTsKLQot
ICAgIGlmICghbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgcmV0dXJuIGNvbXBs
aWNhdGVkQ2FzZXMobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5W
ZXJ0aWNhbFZhbHVlcyk7Ci0gICAgcmV0dXJuIGZsb2F0aW5nUmVwbGFjZWRDb250ZW50SGVpZ2h0
QW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29u
c3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci19Ci0KLUNvbnRlbnRXaWR0aEFu
ZE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZsb2F0aW5nQ29udGVudFdpZHRo
QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3gu
aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7Ci0KLSAgICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2Vk
Qm94KCkpCi0gICAgICAgIHJldHVybiBmbG9hdGluZ05vblJlcGxhY2VkQ29udGVudFdpZHRoQW5k
TWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpv
bnRhbFZhbHVlcyk7Ci0gICAgcmV0dXJuIGZsb2F0aW5nUmVwbGFjZWRDb250ZW50V2lkdGhBbmRN
YXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJh
aW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOwotfQotCi1Db250ZW50SGVpZ2h0QW5k
TWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5saW5lUmVwbGFjZWRDb250ZW50
SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIE9wdGlvbmFsPFZlcnRp
Y2FsQ29uc3RyYWludHM+IHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0
aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAgIC8vIDEw
LjYuMiBJbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMsIGJsb2NrLWxldmVsIHJlcGxhY2VkIGVsZW1l
bnRzIGluIG5vcm1hbCBmbG93LCAnaW5saW5lLWJsb2NrJyByZXBsYWNlZCBlbGVtZW50cyBpbiBu
b3JtYWwgZmxvdyBhbmQgZmxvYXRpbmcgcmVwbGFjZWQgZWxlbWVudHMKLSAgICAvLwotICAgIC8v
IDEuIElmICdtYXJnaW4tdG9wJywgb3IgJ21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHRoZWly
IHVzZWQgdmFsdWUgaXMgMC4KLSAgICAvLyAyLiBJZiAnaGVpZ2h0JyBhbmQgJ3dpZHRoJyBib3Ro
IGhhdmUgY29tcHV0ZWQgdmFsdWVzIG9mICdhdXRvJyBhbmQgdGhlIGVsZW1lbnQgYWxzbyBoYXMg
YW4gaW50cmluc2ljIGhlaWdodCwgdGhlbiB0aGF0IGludHJpbnNpYyBoZWlnaHQgaXMgdGhlIHVz
ZWQgdmFsdWUgb2YgJ2hlaWdodCcuCi0gICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiAnaGVpZ2h0JyBo
YXMgYSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycsIGFuZCB0aGUgZWxlbWVudCBoYXMgYW4gaW50
cmluc2ljIHJhdGlvIHRoZW4gdGhlIHVzZWQgdmFsdWUgb2YgJ2hlaWdodCcgaXM6Ci0gICAgLy8g
ICAgKHVzZWQgd2lkdGgpIC8gKGludHJpbnNpYyByYXRpbykKLSAgICAvLyA0LiBPdGhlcndpc2Us
IGlmICdoZWlnaHQnIGhhcyBhIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJywgYW5kIHRoZSBlbGVt
ZW50IGhhcyBhbiBpbnRyaW5zaWMgaGVpZ2h0LCB0aGVuIHRoYXQgaW50cmluc2ljIGhlaWdodCBp
cyB0aGUgdXNlZCB2YWx1ZSBvZiAnaGVpZ2h0Jy4KLSAgICAvLyA1LiBPdGhlcndpc2UsIGlmICdo
ZWlnaHQnIGhhcyBhIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJywgYnV0IG5vbmUgb2YgdGhlIGNv
bmRpdGlvbnMgYWJvdmUgYXJlIG1ldCwgdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnaGVpZ2h0JyBt
dXN0IGJlIHNldCB0bwotICAgIC8vICAgIHRoZSBoZWlnaHQgb2YgdGhlIGxhcmdlc3QgcmVjdGFu
Z2xlIHRoYXQgaGFzIGEgMjoxIHJhdGlvLCBoYXMgYSBoZWlnaHQgbm90IGdyZWF0ZXIgdGhhbiAx
NTBweCwgYW5kIGhhcyBhIHdpZHRoIG5vdCBncmVhdGVyIHRoYW4gdGhlIGRldmljZSB3aWR0aC4K
LQotICAgIC8vICMxCi0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0
aW5nQ29udGV4dCgpOwotICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5
Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMpOwotICAgIGF1dG8gdXNlZFZlcnRpY2FsTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpO
b25Db2xsYXBzZWRWYWx1ZXMgeyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9y
KDApLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKLSAgICBhdXRv
JiBzdHlsZSA9IHJlcGxhY2VkQm94LnN0eWxlKCk7Ci0KLSAgICBhdXRvIGhlaWdodCA9IG92ZXJy
aWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQgPyBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVp
Z2h0LnZhbHVlKCkgOiBjb21wdXRlZEhlaWdodChyZXBsYWNlZEJveCwgdmVydGljYWxDb25zdHJh
aW50cyA/IHZlcnRpY2FsQ29uc3RyYWludHMtPmxvZ2ljYWxIZWlnaHQgOiBXVEY6Om51bGxvcHQp
OwotICAgIGF1dG8gaGVpZ2h0SXNBdXRvID0gIW92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWln
aHQgJiYgaXNIZWlnaHRBdXRvKHJlcGxhY2VkQm94KTsKLSAgICBhdXRvIHdpZHRoSXNBdXRvID0g
c3R5bGUubG9naWNhbFdpZHRoKCkuaXNBdXRvKCk7Ci0KLSAgICBpZiAoaGVpZ2h0SXNBdXRvICYm
IHdpZHRoSXNBdXRvICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY0hlaWdodCgpKSB7Ci0gICAg
ICAgIC8vICMyCi0gICAgICAgIGhlaWdodCA9IHJlcGxhY2VkQm94LmludHJpbnNpY0hlaWdodCgp
OwotICAgIH0gZWxzZSBpZiAoaGVpZ2h0SXNBdXRvICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNp
Y1JhdGlvKCkpIHsKLSAgICAgICAgLy8gIzMKLSAgICAgICAgYXV0byB1c2VkV2lkdGggPSBmb3Jt
YXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChyZXBsYWNlZEJveCkuY29udGVudEJveFdpZHRo
KCk7Ci0gICAgICAgIGhlaWdodCA9IHVzZWRXaWR0aCAvIHJlcGxhY2VkQm94LmludHJpbnNpY1Jh
dGlvKCk7Ci0gICAgfSBlbHNlIGlmIChoZWlnaHRJc0F1dG8gJiYgcmVwbGFjZWRCb3guaGFzSW50
cmluc2ljSGVpZ2h0KCkpIHsKLSAgICAgICAgLy8gIzQKLSAgICAgICAgaGVpZ2h0ID0gcmVwbGFj
ZWRCb3guaW50cmluc2ljSGVpZ2h0KCk7Ci0gICAgfSBlbHNlIGlmIChoZWlnaHRJc0F1dG8pIHsK
LSAgICAgICAgLy8gIzUKLSAgICAgICAgaGVpZ2h0ID0geyAxNTAgfTsKLSAgICB9Ci0KLSAgICBB
U1NFUlQoaGVpZ2h0KTsKLQotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExh
eW91dCwgc3RyZWFtIDw8ICJbSGVpZ2h0XVtNYXJnaW5dIC0+IGluZmxvdyByZXBsYWNlZCAtPiBo
ZWlnaHQoIiA8PCAqaGVpZ2h0IDw8ICJweCkgbWFyZ2luKCIgPDwgdXNlZFZlcnRpY2FsTWFyZ2lu
LmJlZm9yZSA8PCAicHgsICIgPDwgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyIDw8ICJweCkgLT4g
bGF5b3V0Qm94KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIHsgKmhlaWdo
dCwgdXNlZFZlcnRpY2FsTWFyZ2luIH07Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFy
Z2luKGNvbnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0
cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIE9wdGlvbmFsPFZlcnRpY2FsQ29uc3RyYWlu
dHM+IHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVz
JiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKLXsKLSAgICAvLyAxMC4zLjIgSW5saW5lLCBy
ZXBsYWNlZCBlbGVtZW50cwotICAgIC8vCi0gICAgLy8gQSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0
bycgZm9yICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgYmVjb21lcyBhIHVzZWQgdmFs
dWUgb2YgJzAnLgotICAgIC8vCi0gICAgLy8gMS4gSWYgJ2hlaWdodCcgYW5kICd3aWR0aCcgYm90
aCBoYXZlIGNvbXB1dGVkIHZhbHVlcyBvZiAnYXV0bycgYW5kIHRoZSBlbGVtZW50IGFsc28gaGFz
IGFuIGludHJpbnNpYyB3aWR0aCwgdGhlbiB0aGF0IGludHJpbnNpYyB3aWR0aCBpcyB0aGUgdXNl
ZCB2YWx1ZSBvZiAnd2lkdGgnLgotICAgIC8vCi0gICAgLy8gMi4gSWYgJ2hlaWdodCcgYW5kICd3
aWR0aCcgYm90aCBoYXZlIGNvbXB1dGVkIHZhbHVlcyBvZiAnYXV0bycgYW5kIHRoZSBlbGVtZW50
IGhhcyBubyBpbnRyaW5zaWMgd2lkdGgsIGJ1dCBkb2VzIGhhdmUgYW4gaW50cmluc2ljIGhlaWdo
dCBhbmQgaW50cmluc2ljIHJhdGlvOwotICAgIC8vICAgIG9yIGlmICd3aWR0aCcgaGFzIGEgY29t
cHV0ZWQgdmFsdWUgb2YgJ2F1dG8nLCAnaGVpZ2h0JyBoYXMgc29tZSBvdGhlciBjb21wdXRlZCB2
YWx1ZSwgYW5kIHRoZSBlbGVtZW50IGRvZXMgaGF2ZSBhbiBpbnRyaW5zaWMgcmF0aW87Ci0gICAg
Ly8gICAgdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgnIGlzOiAodXNlZCBoZWlnaHQpICog
KGludHJpbnNpYyByYXRpbykKLSAgICAvLwotICAgIC8vIDMuIElmICdoZWlnaHQnIGFuZCAnd2lk
dGgnIGJvdGggaGF2ZSBjb21wdXRlZCB2YWx1ZXMgb2YgJ2F1dG8nIGFuZCB0aGUgZWxlbWVudCBo
YXMgYW4gaW50cmluc2ljIHJhdGlvIGJ1dCBubyBpbnRyaW5zaWMgaGVpZ2h0IG9yIHdpZHRoLAot
ICAgIC8vICAgIHRoZW4gdGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBpcyB1bmRlZmluZWQgaW4g
Q1NTIDIuMi4gSG93ZXZlciwgaXQgaXMgc3VnZ2VzdGVkIHRoYXQsIGlmIHRoZSBjb250YWluaW5n
IGJsb2NrJ3Mgd2lkdGggZG9lcyBub3QgaXRzZWxmIGRlcGVuZCBvbiB0aGUgcmVwbGFjZWQKLSAg
ICAvLyAgICBlbGVtZW50J3Mgd2lkdGgsIHRoZW4gdGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBp
cyBjYWxjdWxhdGVkIGZyb20gdGhlIGNvbnN0cmFpbnQgZXF1YXRpb24gdXNlZCBmb3IgYmxvY2st
bGV2ZWwsIG5vbi1yZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdy4KLSAgICAvLwotICAg
IC8vIDQuIE90aGVyd2lzZSwgaWYgJ3dpZHRoJyBoYXMgYSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0
bycsIGFuZCB0aGUgZWxlbWVudCBoYXMgYW4gaW50cmluc2ljIHdpZHRoLCB0aGVuIHRoYXQgaW50
cmluc2ljIHdpZHRoIGlzIHRoZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcuCi0gICAgLy8KLSAgICAv
LyA1LiBPdGhlcndpc2UsIGlmICd3aWR0aCcgaGFzIGEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8n
LCBidXQgbm9uZSBvZiB0aGUgY29uZGl0aW9ucyBhYm92ZSBhcmUgbWV0LCB0aGVuIHRoZSB1c2Vk
IHZhbHVlIG9mICd3aWR0aCcgYmVjb21lcyAzMDBweC4KLSAgICAvLyAgICBJZiAzMDBweCBpcyB0
b28gd2lkZSB0byBmaXQgdGhlIGRldmljZSwgVUFzIHNob3VsZCB1c2UgdGhlIHdpZHRoIG9mIHRo
ZSBsYXJnZXN0IHJlY3RhbmdsZSB0aGF0IGhhcyBhIDI6MSByYXRpbyBhbmQgZml0cyB0aGUgZGV2
aWNlIGluc3RlYWQuCi0KLSAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21l
dHJ5Ojpjb21wdXRlZEhvcml6b250YWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cyk7Ci0KLSAgICBhdXRvIHVzZWRNYXJnaW5TdGFydCA9IFsmXSB7Ci0gICAgICAgIGlm
IChvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy5tYXJnaW4pCi0gICAgICAgICAgICByZXR1cm4g
b3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMubWFyZ2luLT5zdGFydDsKLSAgICAgICAgcmV0dXJu
IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDBfbHUpOwotICAgIH07Ci0K
LSAgICBhdXRvIHVzZWRNYXJnaW5FbmQgPSBbJl0gewotICAgICAgICBpZiAob3ZlcnJpZGRlbkhv
cml6b250YWxWYWx1ZXMubWFyZ2luKQotICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzLm1hcmdpbi0+ZW5kOwotICAgICAgICByZXR1cm4gY29tcHV0ZWRIb3Jpem9u
dGFsTWFyZ2luLmVuZC52YWx1ZU9yKDBfbHUpOwotICAgIH07Ci0KLSAgICBhdXRvIHdpZHRoID0g
b3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGggPyBvdmVycmlkZGVuSG9yaXpvbnRhbFZh
bHVlcy53aWR0aCA6IGNvbXB1dGVkV2lkdGgocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJh
aW50cy5sb2dpY2FsV2lkdGgpOwotICAgIGF1dG8gaGVpZ2h0SXNBdXRvID0gaXNIZWlnaHRBdXRv
KHJlcGxhY2VkQm94KTsKLSAgICBhdXRvIGhlaWdodCA9IGNvbXB1dGVkSGVpZ2h0KHJlcGxhY2Vk
Qm94LCB2ZXJ0aWNhbENvbnN0cmFpbnRzID8gdmVydGljYWxDb25zdHJhaW50cy0+bG9naWNhbEhl
aWdodCA6IFdURjo6bnVsbG9wdCk7Ci0KLSAgICBpZiAoIXdpZHRoICYmIGhlaWdodElzQXV0byAm
JiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNXaWR0aCgpKSB7Ci0gICAgICAgIC8vICMxCi0gICAg
ICAgIHdpZHRoID0gcmVwbGFjZWRCb3guaW50cmluc2ljV2lkdGgoKTsKLSAgICB9IGVsc2UgaWYg
KCghd2lkdGggJiYgaGVpZ2h0SXNBdXRvICYmICFyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNXaWR0
aCgpICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY0hlaWdodCgpICYmIHJlcGxhY2VkQm94Lmhh
c0ludHJpbnNpY1JhdGlvKCkpCi0gICAgICAgIHx8ICghd2lkdGggJiYgaGVpZ2h0ICYmIHJlcGxh
Y2VkQm94Lmhhc0ludHJpbnNpY1JhdGlvKCkpKSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIHdp
ZHRoID0gaGVpZ2h0LnZhbHVlT3IocmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkpICog
cmVwbGFjZWRCb3guaW50cmluc2ljUmF0aW8oKTsKLSAgICB9IGVsc2UgaWYgKCF3aWR0aCAmJiBo
ZWlnaHRJc0F1dG8gJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljUmF0aW8oKSAmJiAhcmVwbGFj
ZWRCb3guaGFzSW50cmluc2ljV2lkdGgoKSAmJiAhcmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVp
Z2h0KCkpIHsKLSAgICAgICAgLy8gIzMKLSAgICAgICAgLy8gRklYTUU6IHVuZGVmaW5lZCBidXQg
c3VyZWx5IGRvYWJsZS4KLSAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKLSAg
ICB9IGVsc2UgaWYgKCF3aWR0aCAmJiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNXaWR0aCgpKSB7
Ci0gICAgICAgIC8vICM0Ci0gICAgICAgIHdpZHRoID0gcmVwbGFjZWRCb3guaW50cmluc2ljV2lk
dGgoKTsKLSAgICB9IGVsc2UgaWYgKCF3aWR0aCkgewotICAgICAgICAvLyAjNQotICAgICAgICB3
aWR0aCA9IHsgMzAwIH07Ci0gICAgfQotCi0gICAgQVNTRVJUKHdpZHRoKTsKLQotICAgIExPR19X
SVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbV2lkdGhdW01h
cmdpbl0gLT4gaW5mbG93IHJlcGxhY2VkIC0+IHdpZHRoKCIgPDwgKndpZHRoIDw8ICJweCkgbWFy
Z2luKCIgPDwgdXNlZE1hcmdpblN0YXJ0KCkgPDwgInB4LCAiIDw8IHVzZWRNYXJnaW5FbmQoKSA8
PCAicHgpIC0+IGxheW91dEJveCgiIDw8ICZyZXBsYWNlZEJveCA8PCAiKSIpOwotICAgIHJldHVy
biB7ICp3aWR0aCwgeyB1c2VkTWFyZ2luU3RhcnQoKSwgdXNlZE1hcmdpbkVuZCgpIH0gfTsKLX0K
LQotTGF5b3V0U2l6ZSBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd1Bvc2l0aW9u
ZWRQb3NpdGlvbk9mZnNldChjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxh
eW91dEJveC5pc0luRmxvd1Bvc2l0aW9uZWQoKSk7Ci0KLSAgICAvLyA5LjQuMyBSZWxhdGl2ZSBw
b3NpdGlvbmluZwotICAgIC8vCi0gICAgLy8gVGhlICd0b3AnIGFuZCAnYm90dG9tJyBwcm9wZXJ0
aWVzIG1vdmUgcmVsYXRpdmVseSBwb3NpdGlvbmVkIGVsZW1lbnQocykgdXAgb3IgZG93biB3aXRo
b3V0IGNoYW5naW5nIHRoZWlyIHNpemUuCi0gICAgLy8gVG9wJyBtb3ZlcyB0aGUgYm94ZXMgZG93
biwgYW5kICdib3R0b20nIG1vdmVzIHRoZW0gdXAuIFNpbmNlIGJveGVzIGFyZSBub3Qgc3BsaXQg
b3Igc3RyZXRjaGVkIGFzIGEgcmVzdWx0IG9mICd0b3AnIG9yICdib3R0b20nLCB0aGUgdXNlZCB2
YWx1ZXMgYXJlIGFsd2F5czogdG9wID0gLWJvdHRvbS4KLSAgICAvLwotICAgIC8vIDEuIElmIGJv
dGggYXJlICdhdXRvJywgdGhlaXIgdXNlZCB2YWx1ZXMgYXJlIGJvdGggJzAnLgotICAgIC8vIDIu
IElmIG9uZSBvZiB0aGVtIGlzICdhdXRvJywgaXQgYmVjb21lcyB0aGUgbmVnYXRpdmUgb2YgdGhl
IG90aGVyLgotICAgIC8vIDMuIElmIG5laXRoZXIgaXMgJ2F1dG8nLCAnYm90dG9tJyBpcyBpZ25v
cmVkIChpLmUuLCB0aGUgdXNlZCB2YWx1ZSBvZiAnYm90dG9tJyB3aWxsIGJlIG1pbnVzIHRoZSB2
YWx1ZSBvZiAndG9wJykuCi0KLSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwot
ICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9n
aWNhbFdpZHRoOwotCi0gICAgYXV0byB0b3AgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxU
b3AoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgIGF1dG8gYm90dG9tID0gY29tcHV0ZWRW
YWx1ZShzdHlsZS5sb2dpY2FsQm90dG9tKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLQotICAg
IGlmICghdG9wICYmICFib3R0b20pIHsKLSAgICAgICAgLy8gIzEKLSAgICAgICAgdG9wID0gYm90
dG9tID0geyAwIH07Ci0gICAgfSBlbHNlIGlmICghdG9wKSB7Ci0gICAgICAgIC8vICMyCi0gICAg
ICAgIHRvcCA9IC0qYm90dG9tOwotICAgIH0gZWxzZSBpZiAoIWJvdHRvbSkgewotICAgICAgICAv
LyAjMwotICAgICAgICBib3R0b20gPSAtKnRvcDsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyAj
NAotICAgICAgICBib3R0b20gPSBXVEY6Om51bGxvcHQ7Ci0gICAgfQotCi0gICAgLy8gRm9yIHJl
bGF0aXZlbHkgcG9zaXRpb25lZCBlbGVtZW50cywgJ2xlZnQnIGFuZCAncmlnaHQnIG1vdmUgdGhl
IGJveChlcykgaG9yaXpvbnRhbGx5LCB3aXRob3V0IGNoYW5naW5nIHRoZWlyIHNpemUuCi0gICAg
Ly8gJ0xlZnQnIG1vdmVzIHRoZSBib3hlcyB0byB0aGUgcmlnaHQsIGFuZCAncmlnaHQnIG1vdmVz
IHRoZW0gdG8gdGhlIGxlZnQuCi0gICAgLy8gU2luY2UgYm94ZXMgYXJlIG5vdCBzcGxpdCBvciBz
dHJldGNoZWQgYXMgYSByZXN1bHQgb2YgJ2xlZnQnIG9yICdyaWdodCcsIHRoZSB1c2VkIHZhbHVl
cyBhcmUgYWx3YXlzOiBsZWZ0ID0gLXJpZ2h0LgotICAgIC8vCi0gICAgLy8gMS4gSWYgYm90aCAn
bGVmdCcgYW5kICdyaWdodCcgYXJlICdhdXRvJyAodGhlaXIgaW5pdGlhbCB2YWx1ZXMpLCB0aGUg
dXNlZCB2YWx1ZXMgYXJlICcwJyAoaS5lLiwgdGhlIGJveGVzIHN0YXkgaW4gdGhlaXIgb3JpZ2lu
YWwgcG9zaXRpb24pLgotICAgIC8vIDIuIElmICdsZWZ0JyBpcyAnYXV0bycsIGl0cyB1c2VkIHZh
bHVlIGlzIG1pbnVzIHRoZSB2YWx1ZSBvZiAncmlnaHQnIChpLmUuLCB0aGUgYm94ZXMgbW92ZSB0
byB0aGUgbGVmdCBieSB0aGUgdmFsdWUgb2YgJ3JpZ2h0JykuCi0gICAgLy8gMy4gSWYgJ3JpZ2h0
JyBpcyBzcGVjaWZpZWQgYXMgJ2F1dG8nLCBpdHMgdXNlZCB2YWx1ZSBpcyBtaW51cyB0aGUgdmFs
dWUgb2YgJ2xlZnQnLgotICAgIC8vIDQuIElmIG5laXRoZXIgJ2xlZnQnIG5vciAncmlnaHQnIGlz
ICdhdXRvJywgdGhlIHBvc2l0aW9uIGlzIG92ZXItY29uc3RyYWluZWQsIGFuZCBvbmUgb2YgdGhl
bSBoYXMgdG8gYmUgaWdub3JlZC4KLSAgICAvLyAgICBJZiB0aGUgJ2RpcmVjdGlvbicgcHJvcGVy
dHkgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicsIHRoZSB2YWx1ZSBvZiAnbGVmdCcg
d2lucyBhbmQgJ3JpZ2h0JyBiZWNvbWVzIC0nbGVmdCcuCi0gICAgLy8gICAgSWYgJ2RpcmVjdGlv
bicgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ3J0bCcsICdyaWdodCcgd2lucyBhbmQgJ2xl
ZnQnIGlzIGlnbm9yZWQuCi0KLSAgICBhdXRvIGxlZnQgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxv
Z2ljYWxMZWZ0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLSAgICBhdXRvIHJpZ2h0ID0gY29t
cHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2FsUmlnaHQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwot
Ci0gICAgaWYgKCFsZWZ0ICYmICFyaWdodCkgewotICAgICAgICAvLyAjMQotICAgICAgICBsZWZ0
ID0gcmlnaHQgPSB7IDAgfTsKLSAgICB9IGVsc2UgaWYgKCFsZWZ0KSB7Ci0gICAgICAgIC8vICMy
Ci0gICAgICAgIGxlZnQgPSAtKnJpZ2h0OwotICAgIH0gZWxzZSBpZiAoIXJpZ2h0KSB7Ci0gICAg
ICAgIC8vICMzCi0gICAgICAgIHJpZ2h0ID0gLSpsZWZ0OwotICAgIH0gZWxzZSB7Ci0gICAgICAg
IC8vICM0Ci0gICAgICAgIGF1dG8gaXNMZWZ0VG9SaWdodERpcmVjdGlvbiA9IGxheW91dEJveC5j
b250YWluaW5nQmxvY2soKS5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKLSAgICAg
ICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pCi0gICAgICAgICAgICByaWdodCA9IC0qbGVm
dDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGVmdCA9IFdURjo6bnVsbG9wdDsKLSAgICB9
Ci0KLSAgICBBU1NFUlQoIWJvdHRvbSB8fCAqdG9wID09IC0qYm90dG9tKTsKLSAgICBBU1NFUlQo
IWxlZnQgfHwgKmxlZnQgPT0gLSpyaWdodCk7Ci0KLSAgICBhdXRvIHRvcFBvc2l0aW9uT2Zmc2V0
ID0gKnRvcDsKLSAgICBhdXRvIGxlZnRQb3NpdGlvbk9mZnNldCA9IGxlZnQudmFsdWVPcigtKnJp
Z2h0KTsKLQotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3Ry
ZWFtIDw8ICJbUG9zaXRpb25dIC0+IHBvc2l0aW9uZWQgaW5mbG93IC0+IHRvcCBvZmZzZXQoIiA8
PCB0b3BQb3NpdGlvbk9mZnNldCA8PCAicHgpIGxlZnQgb2Zmc2V0KCIgPDwgbGVmdFBvc2l0aW9u
T2Zmc2V0IDw8ICJweCkgbGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIpOwotICAgIHJl
dHVybiB7IGxlZnRQb3NpdGlvbk9mZnNldCwgdG9wUG9zaXRpb25PZmZzZXQgfTsKLX0KLQotaW5s
aW5lIHN0YXRpYyBXcml0aW5nTW9kZSB1c2VkV3JpdGluZ01vZGUoY29uc3QgQm94JiBsYXlvdXRC
b3gpCi17Ci0gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy13cml0aW5nLW1vZGVzLTQv
I2xvZ2ljYWwtZGlyZWN0aW9uLWxheW91dAotICAgIC8vIEZsb3ctcmVsYXRpdmUgZGlyZWN0aW9u
cyBhcmUgY2FsY3VsYXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHdyaXRpbmcgbW9kZSBvZiB0aGUg
Y29udGFpbmluZyBibG9jayBvZiB0aGUgYm94LgotICAgIC8vIEZvciBpbmxpbmUtbGV2ZWwgYm94
ZXMsIHRoZSB3cml0aW5nIG1vZGUgb2YgdGhlIHBhcmVudCBib3ggaXMgdXNlZCBpbnN0ZWFkLgot
ICAgIHJldHVybiBsYXlvdXRCb3guaXNJbmxpbmVMZXZlbEJveCgpID8gbGF5b3V0Qm94LnBhcmVu
dCgpLnN0eWxlKCkud3JpdGluZ01vZGUoKSA6IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5z
dHlsZSgpLndyaXRpbmdNb2RlKCk7Ci19Ci0KLUVkZ2VzIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeTo6Y29tcHV0ZWRCb3JkZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAg
YXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9y
bWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW0JvcmRlcl0gLT4gbGF5b3V0Qm94OiAi
IDw8ICZsYXlvdXRCb3gpOwotICAgIHJldHVybiB7Ci0gICAgICAgIHsgTGF5b3V0VW5pdChzdHls
ZS5ib3JkZXJMZWZ0V2lkdGgoKSksIExheW91dFVuaXQoc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCgp
KSB9LAotICAgICAgICB7IExheW91dFVuaXQoc3R5bGUuYm9yZGVyVG9wV2lkdGgoKSksIExheW91
dFVuaXQoc3R5bGUuYm9yZGVyQm90dG9tV2lkdGgoKSkgfQotICAgIH07Ci19Ci0KLU9wdGlvbmFs
PEVkZ2VzPiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkUGFkZGluZyhjb25z
dCBCb3gmIGxheW91dEJveCwgY29uc3QgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCkg
Y29uc3QKLXsKLSAgICBpZiAoIWxheW91dEJveC5pc1BhZGRpbmdBcHBsaWNhYmxlKCkpCi0gICAg
ICAgIHJldHVybiBXVEY6Om51bGxvcHQ7Ci0KLSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5z
dHlsZSgpOwotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3Ry
ZWFtIDw8ICJbUGFkZGluZ10gLT4gbGF5b3V0Qm94OiAiIDw8ICZsYXlvdXRCb3gpOwotICAgIHJl
dHVybiBFZGdlcyB7Ci0gICAgICAgIHsgdmFsdWVGb3JMZW5ndGgoc3R5bGUucGFkZGluZ0xlZnQo
KSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpLCB2YWx1ZUZvckxlbmd0aChzdHlsZS5wYWRkaW5nUmln
aHQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpIH0sCi0gICAgICAgIHsgdmFsdWVGb3JMZW5ndGgo
c3R5bGUucGFkZGluZ1RvcCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCksIHZhbHVlRm9yTGVuZ3Ro
KHN0eWxlLnBhZGRpbmdCb3R0b20oKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpIH0KLSAgICB9Owot
fQotCi1Db21wdXRlZEhvcml6b250YWxNYXJnaW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5
Ojpjb21wdXRlZEhvcml6b250YWxNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSBjb25zdAotewotICAg
IGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAgYXV0byBjb250YWluaW5nQmxv
Y2tXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7Ci0gICAgaWYgKGlz
SG9yaXpvbnRhbFdyaXRpbmdNb2RlKHVzZWRXcml0aW5nTW9kZShsYXlvdXRCb3gpKSkKLSAgICAg
ICAgcmV0dXJuIHsgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5MZWZ0KCksIGNvbnRhaW5pbmdC
bG9ja1dpZHRoKSwgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5SaWdodCgpLCBjb250YWluaW5n
QmxvY2tXaWR0aCkgfTsKLSAgICByZXR1cm4geyBjb21wdXRlZFZhbHVlKHN0eWxlLm1hcmdpblRv
cCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCksIGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luQm90
dG9tKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSB9OwotfQotCi1Db21wdXRlZFZlcnRpY2FsTWFy
Z2luIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihj
b25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9u
dGFsQ29uc3RyYWludHMpIGNvbnN0Ci17Ci0gICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5
bGUoKTsKLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFp
bnRzLmxvZ2ljYWxXaWR0aDsKLSAgICBpZiAoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUodXNlZFdy
aXRpbmdNb2RlKGxheW91dEJveCkpKQotICAgICAgICByZXR1cm4geyBjb21wdXRlZFZhbHVlKHN0
eWxlLm1hcmdpblRvcCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCksIGNvbXB1dGVkVmFsdWUoc3R5
bGUubWFyZ2luQm90dG9tKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSB9OwotICAgIHJldHVybiB7
IGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luTGVmdCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCks
IGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luUmlnaHQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgp
IH07Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29uc3RyYWluQnlNaW5NYXhXaWR0aChjb25zdCBC
b3gmIGxheW91dEJveCwgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNXaWR0aCkg
Y29uc3QKLXsKLSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIGF1dG8g
bWluV2lkdGggPSBmaXhlZFZhbHVlKHN0eWxlLmxvZ2ljYWxNaW5XaWR0aCgpKTsKLSAgICBhdXRv
IG1heFdpZHRoID0gZml4ZWRWYWx1ZShzdHlsZS5sb2dpY2FsTWF4V2lkdGgoKSk7Ci0gICAgaWYg
KCFtaW5XaWR0aCAmJiAhbWF4V2lkdGgpCi0gICAgICAgIHJldHVybiBpbnRyaW5zaWNXaWR0aDsK
LQotICAgIGlmIChtYXhXaWR0aCkgewotICAgICAgICBpbnRyaW5zaWNXaWR0aC5taW5pbXVtID0g
c3RkOjptaW4oKm1heFdpZHRoLCBpbnRyaW5zaWNXaWR0aC5taW5pbXVtKTsKLSAgICAgICAgaW50
cmluc2ljV2lkdGgubWF4aW11bSA9IHN0ZDo6bWluKCptYXhXaWR0aCwgaW50cmluc2ljV2lkdGgu
bWF4aW11bSk7Ci0gICAgfQotCi0gICAgaWYgKG1pbldpZHRoKSB7Ci0gICAgICAgIGludHJpbnNp
Y1dpZHRoLm1pbmltdW0gPSBzdGQ6Om1heCgqbWluV2lkdGgsIGludHJpbnNpY1dpZHRoLm1pbmlt
dW0pOwotICAgICAgICBpbnRyaW5zaWNXaWR0aC5tYXhpbXVtID0gc3RkOjptYXgoKm1pbldpZHRo
LCBpbnRyaW5zaWNXaWR0aC5tYXhpbXVtKTsKLSAgICB9Ci0KLSAgICBBU1NFUlQoaW50cmluc2lj
V2lkdGgubWluaW11bSA8PSBpbnRyaW5zaWNXaWR0aC5tYXhpbXVtKTsKLSAgICByZXR1cm4gaW50
cmluc2ljV2lkdGg7Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpDb25zdHJhaW50c0Zvck91dE9m
Rmxvd0NvbnRlbnQgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb25zdHJhaW50c0Zvck91
dE9mRmxvd0NvbnRlbnQoY29uc3QgQ29udGFpbmVyQm94JiBjb250YWluZXJCb3gpCi17Ci0gICAg
YXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGNv
bnRhaW5lckJveCk7Ci0gICAgcmV0dXJuIHsKLSAgICAgICAgeyBib3hHZW9tZXRyeS5wYWRkaW5n
Qm94TGVmdCgpLCBib3hHZW9tZXRyeS5wYWRkaW5nQm94V2lkdGgoKSB9LAotICAgICAgICB7IGJv
eEdlb21ldHJ5LnBhZGRpbmdCb3hUb3AoKSwgYm94R2VvbWV0cnkucGFkZGluZ0JveEhlaWdodCgp
IH0sCi0gICAgICAgIGJveEdlb21ldHJ5LmNvbnRlbnRCb3hXaWR0aCgpIH07Ci19Ci0KLUZvcm1h
dHRpbmdDb250ZXh0OjpDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQgRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5Ojpjb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29uc3QgQ29udGFpbmVy
Qm94JiBjb250YWluZXJCb3gsIE9wdGlvbmFsPEVzY2FwZVJlYXNvbj4gZXNjYXBlUmVhc29uKQot
ewotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZv
ckJveChjb250YWluZXJCb3gsIGVzY2FwZVJlYXNvbik7Ci0gICAgcmV0dXJuIHsgeyBib3hHZW9t
ZXRyeS5jb250ZW50Qm94TGVmdCgpLCBib3hHZW9tZXRyeS5jb250ZW50Qm94V2lkdGgoKSB9LCB7
IGJveEdlb21ldHJ5LmNvbnRlbnRCb3hUb3AoKSwgY29tcHV0ZWRIZWlnaHQoY29udGFpbmVyQm94
KSB9IH07Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9G
b3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDgyMTFiMGRjNjMwY2EyMzk3YmFiMzg0Zjk4MDgzMDMxOTFmMmJkMGEuLjAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zv
cm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAK
LS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0Nv
bnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5j
bHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNs
dWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3Jl
IHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1MYXlvdXRVbml0IEZvcm1hdHRpbmdDb250ZXh0OjpR
dWlya3M6OmhlaWdodFZhbHVlT2ZOZWFyZXN0Q29udGFpbmluZ0Jsb2NrV2l0aEZpeGVkSGVpZ2h0
KGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAgIC8vIEluIHF1aXJrcyBtb2RlLCB3ZSBnbyBh
bmQgdHJhdmVycyB0aGUgY29udGFpbmluZyBibG9jayBjaGFpbiB0byBmaW5kIGEgYmxvY2sgbGV2
ZWwgYm94IHdpdGggZml4ZWQgaGVpZ2h0IHZhbHVlLCBldmVuIGlmIGl0IG1lYW5zIGxlYXZpbmcK
LSAgICAvLyB0aGUgY3VycmVudCBmb3JtYXR0aW5nIGNvbnRleHQuIEZJWE1FOiBzdXJlbHkgd2Ug
bmVlZCB0byBkbyBzb21lIHRyaWNrcyBoZXJlIHdoZW4gYmxvY2sgZGlyZWN0aW9uIHN1cHBvcnQg
aXMgYWRkZWQuCi0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5n
Q29udGV4dCgpOwotICAgIGF1dG8qIGNvbnRhaW5pbmdCbG9jayA9ICZsYXlvdXRCb3guY29udGFp
bmluZ0Jsb2NrKCk7Ci0gICAgTGF5b3V0VW5pdCBib2R5QW5kRG9jdW1lbnRWZXJ0aWNhbE1hcmdp
blBhZGRpbmdBbmRCb3JkZXI7Ci0gICAgd2hpbGUgKGNvbnRhaW5pbmdCbG9jaykgewotICAgICAg
ICBhdXRvIGNvbnRhaW5pbmdCbG9ja0hlaWdodCA9IGNvbnRhaW5pbmdCbG9jay0+c3R5bGUoKS5s
b2dpY2FsSGVpZ2h0KCk7Ci0gICAgICAgIGlmIChjb250YWluaW5nQmxvY2tIZWlnaHQuaXNGaXhl
ZCgpKQotICAgICAgICAgICAgcmV0dXJuIExheW91dFVuaXQoY29udGFpbmluZ0Jsb2NrSGVpZ2h0
LnZhbHVlKCkgLSBib2R5QW5kRG9jdW1lbnRWZXJ0aWNhbE1hcmdpblBhZGRpbmdBbmRCb3JkZXIp
OwotCi0gICAgICAgIC8vIElmIHRoZSBvbmx5IGZpeGVkIHZhbHVlIGJveCB3ZSBmaW5kIGlzIHRo
ZSBJQ0IsIHRoZW4gaWdub3JlIHRoZSBib2R5IGFuZCB0aGUgZG9jdW1lbnQgKHZlcnRpY2FsKSBt
YXJnaW4sIHBhZGRpbmcgYW5kIGJvcmRlci4gU28gbXVjaCBxdWlya2luZXNzLgotICAgICAgICAv
LyAtYW5kIGl0J3MgdG90YWxseSBpbnNhbmUgYmVjYXVzZSBub3cgd2UgZnJlZWx5IHRyYXZlbCBh
Y3Jvc3MgZm9ybWF0dGluZyBjb250ZXh0IGJvdW5kYXJpZXMgYW5kIGNvbXB1dGVkIG1hcmdpbnMg
YXJlIG5vbmV4aXN0ZW50LgotICAgICAgICBpZiAoY29udGFpbmluZ0Jsb2NrLT5pc0JvZHlCb3go
KSB8fCBjb250YWluaW5nQmxvY2stPmlzRG9jdW1lbnRCb3goKSkgewotCi0gICAgICAgICAgICBh
dXRvIGdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnkoKTsKLSAgICAgICAgICAg
IGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRzID0gZ2VvbWV0cnkuY29uc3RyYWludHNGb3JJbkZs
b3dDb250ZW50KGNvbnRhaW5pbmdCbG9jay0+Y29udGFpbmluZ0Jsb2NrKCksIEZvcm1hdHRpbmdD
b250ZXh0OjpFc2NhcGVSZWFzb246OkZpbmRGaXhlZEhlaWdodEFuY2VzdG9yUXVpcmspLmhvcml6
b250YWw7Ci0gICAgICAgICAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gZ2VvbWV0cnkuY29tcHV0
ZWRWZXJ0aWNhbE1hcmdpbigqY29udGFpbmluZ0Jsb2NrLCBob3Jpem9udGFsQ29uc3RyYWludHMp
OwotCi0gICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdl
b21ldHJ5Rm9yQm94KCpjb250YWluaW5nQmxvY2ssIEZvcm1hdHRpbmdDb250ZXh0OjpFc2NhcGVS
ZWFzb246OkZpbmRGaXhlZEhlaWdodEFuY2VzdG9yUXVpcmspOwotICAgICAgICAgICAgYXV0byB2
ZXJ0aWNhbFBhZGRpbmcgPSBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKSArIGJv
eEdlb21ldHJ5LnBhZGRpbmdCb3R0b20oKS52YWx1ZU9yKDApOwotICAgICAgICAgICAgYXV0byB2
ZXJ0aWNhbEJvcmRlciA9IGJveEdlb21ldHJ5LmJvcmRlclRvcCgpICsgYm94R2VvbWV0cnkuYm9y
ZGVyQm90dG9tKCk7Ci0gICAgICAgICAgICBib2R5QW5kRG9jdW1lbnRWZXJ0aWNhbE1hcmdpblBh
ZGRpbmdBbmRCb3JkZXIgKz0gdmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCkgKyB2ZXJ0
aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApICsgdmVydGljYWxQYWRkaW5nICsgdmVydGljYWxC
b3JkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXM8SW5pdGlhbENvbnRhaW5pbmdCbG9j
az4oKmNvbnRhaW5pbmdCbG9jaykpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY29udGFp
bmluZ0Jsb2NrID0gJmNvbnRhaW5pbmdCbG9jay0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgfQot
ICAgIC8vIEluaXRpYWwgY29udGFpbmluZyBibG9jayBoYXMgdG8gaGF2ZSBhIGhlaWdodC4KLSAg
ICByZXR1cm4gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LmluaXRp
YWxDb250YWluaW5nQmxvY2soKSwgRm9ybWF0dGluZ0NvbnRleHQ6OkVzY2FwZVJlYXNvbjo6Rmlu
ZEZpeGVkSGVpZ2h0QW5jZXN0b3JRdWlyaykuY29udGVudEJveCgpLmhlaWdodCgpIC0gYm9keUFu
ZERvY3VtZW50VmVydGljYWxNYXJnaW5QYWRkaW5nQW5kQm9yZGVyOwotfQotCi19Ci19Ci0KLSNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9C
bG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zv
cm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDBmNTU1ZjgxOTM4MWU3M2FmM2UxOWMwMmYzOGIwZmNmM2JkMTIwNGIuLjAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcAorKysgL2Rl
di9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAot
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
Ci0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwot
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICog
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5o
IgotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUu
aCIKLSNpbmNsdWRlICJGbG9hdGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJGbG9hdGluZ1N0YXRl
LmgiCi0jaW5jbHVkZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIKLSNpbmNsdWRlICJMYXlvdXRCb3gu
aCIKLSNpbmNsdWRlICJMYXlvdXRDaGlsZEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29u
dGFpbmVyQm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91
dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKLSNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgotI2lu
Y2x1ZGUgIkxvZ2dpbmcuaCIKLSNpbmNsdWRlICJUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0LmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KLSNpbmNsdWRlIDx3
dGYvdGV4dC9UZXh0U3RyZWFtLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dCk7Ci0KLUJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OkJsb2NrRm9ybWF0dGluZ0NvbnRleHQo
Y29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGlu
Z1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCi0gICAgOiBGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0
aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKLXsKLX0KLQotdm9pZCBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0OjpsYXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiBpbnZh
bGlkYXRpb25TdGF0ZSwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJh
aW50cykKLXsKLSAgICAvLyA5LjQuMSBCbG9jayBmb3JtYXR0aW5nIGNvbnRleHRzCi0gICAgLy8g
SW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGJveGVzIGFyZSBsYWlkIG91dCBvbmUgYWZ0
ZXIgdGhlIG90aGVyLCB2ZXJ0aWNhbGx5LCBiZWdpbm5pbmcgYXQgdGhlIHRvcCBvZiBhIGNvbnRh
aW5pbmcgYmxvY2suCi0gICAgLy8gVGhlIHZlcnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNp
YmxpbmcgYm94ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgJ21hcmdpbicgcHJvcGVydGllcy4KLSAg
ICAvLyBWZXJ0aWNhbCBtYXJnaW5zIGJldHdlZW4gYWRqYWNlbnQgYmxvY2stbGV2ZWwgYm94ZXMg
aW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgY29sbGFwc2UuCi0gICAgTE9HX1dJVEhfU1RS
RUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltTdGFydF0gLT4gYmxvY2sg
Zm9ybWF0dGluZyBjb250ZXh0IC0+IGZvcm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIiki
KTsKLSAgICBhdXRvJiBmb3JtYXR0aW5nUm9vdCA9IHJvb3QoKTsKLSAgICBBU1NFUlQoZm9ybWF0
dGluZ1Jvb3QuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpOwotICAgIGF1dG8mIGZsb2F0aW5n
U3RhdGUgPSBmb3JtYXR0aW5nU3RhdGUoKS5mbG9hdGluZ1N0YXRlKCk7Ci0gICAgYXV0byBmbG9h
dGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhpcywgZmxvYXRpbmdTdGF0ZSB9Owot
Ci0gICAgTGF5b3V0UXVldWUgbGF5b3V0UXVldWU7Ci0gICAgZW51bSBjbGFzcyBMYXlvdXREaXJl
Y3Rpb24geyBDaGlsZCwgU2libGluZyB9OwotICAgIGF1dG8gYXBwZW5kTmV4dFRvTGF5b3V0UXVl
dWUgPSBbJl0gKGNvbnN0IGF1dG8mIGxheW91dEJveCwgYXV0byBkaXJlY3Rpb24pIHsKLSAgICAg
ICAgaWYgKGRpcmVjdGlvbiA9PSBMYXlvdXREaXJlY3Rpb246OkNoaWxkKSB7Ci0gICAgICAgICAg
ICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkKLSAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGF1dG8qIGNoaWxkID0gZG93bmNhc3Q8Q29udGFp
bmVyQm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7IGNoaWxkOyBj
aGlsZCA9IGNoaWxkLT5uZXh0SW5GbG93T3JGbG9hdGluZ1NpYmxpbmcoKSkgewotICAgICAgICAg
ICAgICAgIGlmICghaW52YWxpZGF0aW9uU3RhdGUubmVlZHNMYXlvdXQoKmNoaWxkKSkKLSAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgbGF5b3V0UXVldWUuYXBw
ZW5kKGNoaWxkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkaXJl
Y3Rpb24gPT0gTGF5b3V0RGlyZWN0aW9uOjpTaWJsaW5nKSB7Ci0gICAgICAgICAgICBmb3IgKGF1
dG8qIG5leHRTaWJsaW5nID0gbGF5b3V0Qm94Lm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygp
OyBuZXh0U2libGluZzsgbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy0+bmV4dEluRmxvd09yRmxv
YXRpbmdTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWludmFsaWRhdGlvblN0YXRl
Lm5lZWRzTGF5b3V0KCpuZXh0U2libGluZykpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAgICAgICAgIGxheW91dFF1ZXVlLmFwcGVuZChuZXh0U2libGluZyk7Ci0gICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9OwotCi0gICAgYXV0byBjb25zdHJhaW50c0ZvckxheW91
dEJveCA9IFsmXSAoY29uc3QgYXV0byYgbGF5b3V0Qm94KSB7Ci0gICAgICAgIGF1dG8mIGNvbnRh
aW5pbmdCbG9jayA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgcmV0dXJu
ICZjb250YWluaW5nQmxvY2sgPT0gJmZvcm1hdHRpbmdSb290ID8gY29uc3RyYWludHMgOiBnZW9t
ZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb250YWluaW5nQmxvY2spOwotICAg
IH07Ci0KLSAgICAvLyBUaGlzIGlzIGEgcG9zdC1vcmRlciB0cmVlIHRyYXZlcnNhbCBsYXlvdXQu
Ci0gICAgLy8gVGhlIHJvb3QgY29udGFpbmVyIGxheW91dCBpcyBkb25lIGluIHRoZSBmb3JtYXR0
aW5nIGNvbnRleHQgaXQgbGl2ZXMgaW4sIG5vdCB0aGF0IG9uZSBpdCBjcmVhdGVzLCBzbyBsZXQn
cyBzdGFydCB3aXRoIHRoZSBmaXJzdCBjaGlsZC4KLSAgICBhcHBlbmROZXh0VG9MYXlvdXRRdWV1
ZShmb3JtYXR0aW5nUm9vdCwgTGF5b3V0RGlyZWN0aW9uOjpDaGlsZCk7Ci0gICAgLy8gMS4gR28g
YWxsIHRoZSB3YXkgZG93biB0byB0aGUgbGVhZiBub2RlCi0gICAgLy8gMi4gQ29tcHV0ZSBzdGF0
aWMgcG9zaXRpb24gYW5kIHdpZHRoIGFzIHdlIHRyYXZlcnNlIGRvd24KLSAgICAvLyAzLiBBcyB3
ZSBjbGltYiBiYWNrIG9uIHRoZSB0cmVlLCBjb21wdXRlIGhlaWdodCBhbmQgZmluaWFsaXplIHBv
c2l0aW9uCi0gICAgLy8gKEFueSBzdWJ0cmVlcyB3aXRoIG5ldyBmb3JtYXR0aW5nIGNvbnRleHRz
IG5lZWQgdG8gbGF5b3V0IHN5bmNocm9ub3VzbHkpCi0gICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5p
c0VtcHR5KCkpIHsKLSAgICAgICAgLy8gVHJhdmVyc2UgZG93biBvbiB0aGUgZGVzY2VuZGFudHMg
YW5kIGNvbXB1dGUgd2lkdGgvc3RhdGljIHBvc2l0aW9uIHVudGlsIHdlIGZpbmQgYSBsZWFmIG5v
ZGUuCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3gg
PSAqbGF5b3V0UXVldWUubGFzdCgpOwotICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tD
b25zdHJhaW50cyA9IGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0KLSAgICAg
ICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2Nr
Q29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICBjb21wdXRlU3RhdGljVmVydGlj
YWxQb3NpdGlvbihsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLnZlcnRpY2Fs
KTsKLSAgICAgICAgICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbihmbG9hdGluZ0NvbnRleHQsIGxh
eW91dEJveCwgeyBjb25zdHJhaW50cywgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMgfSk7Ci0g
ICAgICAgICAgICBjb21wdXRlU3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgY29u
dGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICBjb21wdXRl
UG9zaXRpb25Ub0F2b2lkRmxvYXRzKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCB7IGNvbnN0
cmFpbnRzLCBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyB9KTsKLQotICAgICAgICAgICAgaWYg
KGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpIHsKLSAgICAgICAgICAg
ICAgICBpZiAoaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkgewotICAgICAgICAg
ICAgICAgICAgICBhdXRvJiBjb250YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxh
eW91dEJveCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJCb3guZXN0YWJsaXNo
ZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAv
LyBJRkNzIGluaGVyaXQgZmxvYXRzIGZyb20gcGFyZW50IEZDcy4gV2UgbmVlZCBmaW5hbCB2ZXJ0
aWNhbCBwb3NpdGlvbiB0byBmaW5kIGludHJ1ZGluZyBmbG9hdHMuCi0gICAgICAgICAgICAgICAg
ICAgICAgICBwcmVjb21wdXRlVmVydGljYWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhjb250
YWluZXJCb3gsIHsgY29uc3RyYWludHMsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzIH0pOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIExheW91dCB0aGUg
aW5mbG93IGRlc2NlbmRhbnRzIG9mIHRoaXMgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QuCi0gICAg
ICAgICAgICAgICAgICAgIGF1dG8gZm9ybWF0dGluZ0NvbnRleHQgPSBMYXlvdXRDb250ZXh0Ojpj
cmVhdGVGb3JtYXR0aW5nQ29udGV4dChjb250YWluZXJCb3gsIGxheW91dFN0YXRlKCkpOwotICAg
ICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyQm94LmlzVGFibGVXcmFwcGVyQm94KCkpCi0g
ICAgICAgICAgICAgICAgICAgICAgICBkb3duY2FzdDxUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0PigqZm9ybWF0dGluZ0NvbnRleHQpLnNldEhvcml6b250YWxDb25zdHJhaW50c0ln
bm9yaW5nRmxvYXRzKGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmhvcml6b250YWwpOwotICAg
ICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nQ29udGV4dC0+bGF5b3V0SW5GbG93Q29udGVudChp
bnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQo
Y29udGFpbmVyQm94KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhcHBlbmROZXh0VG9MYXlvdXRRdWV1
ZShsYXlvdXRCb3gsIExheW91dERpcmVjdGlvbjo6Q2hpbGQpKQotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xpbWIgYmFjayBvbiB0aGUgYW5jZXN0b3Jz
IGFuZCBjb21wdXRlIGhlaWdodC9maW5hbCBwb3NpdGlvbi4KLSAgICAgICAgd2hpbGUgKCFsYXlv
dXRRdWV1ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9ICpsYXlv
dXRRdWV1ZS50YWtlTGFzdCgpOwotICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25z
dHJhaW50cyA9IGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0KLSAgICAgICAg
ICAgIC8vIEFsbCBpbmZsb3cgZGVzY2VuZGFudHMgKGlmIHRoZXJlIGFyZSBhbnkpIGFyZSBsYWlk
IG91dCBieSBub3cuIExldCdzIGNvbXB1dGUgdGhlIGJveCdzIGhlaWdodCBhbmQgdmVydGljYWwg
bWFyZ2luLgotICAgICAgICAgICAgY29tcHV0ZUhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGNv
bnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzKTsKLSAgICAgICAgICAgIGlmIChsYXlvdXRCb3guaXNG
bG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgICAgICBmbG9hdGluZ1N0YXRlLmFwcGVu
ZChmbG9hdGluZ0NvbnRleHQudG9GbG9hdEl0ZW0obGF5b3V0Qm94KSk7Ci0gICAgICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG5v
dyB0aGF0IHdlJ3ZlIGdvdCBmaW5hbCBtYXJnaW4gdmFsdWVzIGZvciBub24tZmxvYXQgYXZvaWRl
ciBib3hlcy4KLSAgICAgICAgICAgICAgICAvLyBGbG9hdCBhdm9pZGVycyBoYXZlIHByZS1jb21w
dXRlZCB2ZXJ0aWNhbCBwb3NpdGlvbnMgd2hlbiBmbG9hdHMgYXJlIHByZXNlbnQuCi0gICAgICAg
ICAgICAgICAgaWYgKCFsYXlvdXRCb3guaXNGbG9hdEF2b2lkZXIoKSB8fCBmbG9hdGluZ0NvbnRl
eHQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0
ZSA9IHRoaXMtPmZvcm1hdHRpbmdTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBhdXRvJiBi
b3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAg
ICAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRp
b25XaXRoTWFyZ2luKGxheW91dEJveCwgZm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdp
bihsYXlvdXRCb3gpLCBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cy52ZXJ0aWNhbCkpOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dG8gZXN0YWJsaXNo
ZXNGb3JtYXR0aW5nQ29udGV4dCA9IGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250
ZXh0KCk7IAotICAgICAgICAgICAgaWYgKGVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQpIHsK
LSAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBjb21wdXRlZCB0aGUgYm94J3MgaGVpZ2h0
LCB3ZSBjYW4gbGF5b3V0IHRoZSBvdXQtb2YtZmxvdyBkZXNjZW5kYW50cy4KLSAgICAgICAgICAg
ICAgICBpZiAoaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KS5oYXNDaGlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8m
IGNvbnRhaW5lckJveCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKLSAgICAg
ICAgICAgICAgICAgICAgTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY29u
dGFpbmVyQm94LCBsYXlvdXRTdGF0ZSgpKS0+bGF5b3V0T3V0T2ZGbG93Q29udGVudChpbnZhbGlk
YXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5jb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29u
dGFpbmVyQm94KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgaWYgKCFlc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0ICYmIGlzPENvbnRhaW5lckJveD4o
bGF5b3V0Qm94KSkKLSAgICAgICAgICAgICAgICBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJl
bihkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCksIGNvbnRhaW5pbmdCbG9ja0NvbnN0
cmFpbnRzLmhvcml6b250YWwpOwotCi0gICAgICAgICAgICBpZiAoYXBwZW5kTmV4dFRvTGF5b3V0
UXVldWUobGF5b3V0Qm94LCBMYXlvdXREaXJlY3Rpb246OlNpYmxpbmcpKQotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIFBsYWNlIHRoZSBpbmZsb3cgcG9z
aXRpb25lZCBjaGlsZHJlbi4KLSAgICBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihmb3Jt
YXR0aW5nUm9vdCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgTE9HX1dJVEhfU1RSRUFN
KEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltFbmRdIC0+IGJsb2NrIGZvcm1h
dHRpbmcgY29udGV4dCAtPiBmb3JtYXR0aW5nIHJvb3QoIiA8PCAmcm9vdCgpIDw8ICIpIik7Ci19
Ci0KLUxheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQo
KSBjb25zdAotewotICAgIC8vIDEwLjYuNyAnQXV0bycgaGVpZ2h0cyBmb3IgYmxvY2sgZm9ybWF0
dGluZyBjb250ZXh0IHJvb3RzCi0KLSAgICAvLyBJZiBpdCBoYXMgYmxvY2stbGV2ZWwgY2hpbGRy
ZW4sIHRoZSBoZWlnaHQgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHRvcCBtYXJnaW4tZWRn
ZSBvZiB0aGUgdG9wbW9zdCBibG9jay1sZXZlbAotICAgIC8vIGNoaWxkIGJveCBhbmQgdGhlIGJv
dHRvbSBtYXJnaW4tZWRnZSBvZiB0aGUgYm90dG9tbW9zdCBibG9jay1sZXZlbCBjaGlsZCBib3gu
Ci0KLSAgICAvLyBJbiBhZGRpdGlvbiwgaWYgdGhlIGVsZW1lbnQgaGFzIGFueSBmbG9hdGluZyBk
ZXNjZW5kYW50cyB3aG9zZSBib3R0b20gbWFyZ2luIGVkZ2UgaXMgYmVsb3cgdGhlIGVsZW1lbnQn
cyBib3R0b20gY29udGVudCBlZGdlLAotICAgIC8vIHRoZW4gdGhlIGhlaWdodCBpcyBpbmNyZWFz
ZWQgdG8gaW5jbHVkZSB0aG9zZSBlZGdlcy4gT25seSBmbG9hdHMgdGhhdCBwYXJ0aWNpcGF0ZSBp
biB0aGlzIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBhcmUgdGFrZW4KLSAgICAvLyBpbnRvIGFj
Y291bnQsIGUuZy4sIGZsb2F0cyBpbnNpZGUgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGRlc2NlbmRh
bnRzIG9yIG90aGVyIGZsb2F0cyBhcmUgbm90LgotICAgIGF1dG8gdG9wID0gT3B0aW9uYWw8TGF5
b3V0VW5pdD4geyB9OwotICAgIGF1dG8gYm90dG9tID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9
OwotICAgIGlmIChyb290KCkuaGFzSW5GbG93Q2hpbGQoKSkgewotICAgICAgICB0b3AgPSBCb3hH
ZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9tZXRyeUZvckJveCgqcm9vdCgpLmZpcnN0SW5GbG93
Q2hpbGQoKSkpLnRvcCgpOwotICAgICAgICBib3R0b20gPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94
UmVjdChnZW9tZXRyeUZvckJveCgqcm9vdCgpLmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7
Ci0gICAgfQotCi0gICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyAq
dGhpcywgZm9ybWF0dGluZ1N0YXRlKCkuZmxvYXRpbmdTdGF0ZSgpIH07Ci0gICAgaWYgKGF1dG8g
ZmxvYXRUb3AgPSBmbG9hdGluZ0NvbnRleHQudG9wKCkpIHsKLSAgICAgICAgdG9wID0gc3RkOjpt
aW4oKmZsb2F0VG9wLCB0b3AudmFsdWVPcigqZmxvYXRUb3ApKTsKLSAgICAgICAgYXV0byBmbG9h
dEJvdHRvbSA9ICpmbG9hdGluZ0NvbnRleHQuYm90dG9tKCk7Ci0gICAgICAgIGJvdHRvbSA9IHN0
ZDo6bWF4KGZsb2F0Qm90dG9tLCBib3R0b20udmFsdWVPcihmbG9hdEJvdHRvbSkpOwotICAgIH0K
LSAgICByZXR1cm4gKmJvdHRvbSAtICp0b3A7Ci19Ci0KLU9wdGlvbmFsPExheW91dFVuaXQ+IEJs
b2NrRm9ybWF0dGluZ0NvbnRleHQ6OnVzZWRBdmFpbGFibGVXaWR0aEZvckZsb2F0QXZvaWRlcihj
b25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRC
b3gsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQotewotICAgIC8vIE5v
cm1hbGx5IHRoZSBhdmFpbGFibGUgd2lkdGggZm9yIGFuIGluLWZsb3cgYmxvY2sgbGV2ZWwgYm94
IGlzIHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmluZyBibG9jaydzIGNvbnRlbnQgYm94LgotICAg
IC8vIEhvd2V2ZXIgKGFuZCBjYW4ndCBmaW5kIGl0IGFueXdoZXJlIGluIHRoZSBzcGVjKSBub24t
ZmxvYXRpbmcgcG9zaXRpb25lZCBmbG9hdCBhdm9pZGVyIGJsb2NrIGxldmVsIGJveGVzIGFyZSBj
b25zdHJhaW5lZCBieSBleGlzdGluZyBmbG9hdHMuCi0gICAgQVNTRVJUKGxheW91dEJveC5pc0Zs
b2F0QXZvaWRlcigpKTsKLSAgICBpZiAoZmxvYXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKLSAgICAg
ICAgcmV0dXJuIHsgfTsKLSAgICAvLyBGbG9hdCBjbGVhciBwdXNoZXMgdGhlIGJsb2NrIGxldmVs
IGJveCBlaXRoZXIgYmVsb3cgdGhlIGZsb2F0cywgb3IganVzdCBvbmUgc2lkZSBiZWxvdyBidXQg
dGhlIG90aGVyIHNpZGUgY291bGQgb3ZlcmxhcC4KLSAgICAvLyBXaGF0IGl0IG1lYW5zIGlzIHRo
YXQgdGhlIHVzZWQgYXZhaWxhYmxlIHdpZHRoIGFsd2F5cyBtYXRjaGVzIHRoZSBjb250YWluaW5n
IGJsb2NrJ3MgY29uc3RyYWludC4KLSAgICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkK
LSAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgIEFTU0VSVChsYXlvdXRCb3guZXN0YWJsaXNoZXNG
b3JtYXR0aW5nQ29udGV4dCgpKTsKLSAgICAvLyBWZXJ0aWNhbCBzdGF0aWMgcG9zaXRpb24gaXMg
bm90IGNvbXB1dGVkIHlldCBmb3IgdGhpcyBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdCwgc28gbGV0
J3MganVzdCBwcmUtY29tcHV0ZSBpdCBmb3Igbm93LgotICAgIHByZWNvbXB1dGVWZXJ0aWNhbFBv
c2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGxheW91dEJveCwgY29uc3RyYWludHNQYWlyKTsKLQot
ICAgIGF1dG8gbG9naWNhbFRvcEluRm9ybWF0dGluZ0NvbnRleHRSb290Q29vcmRpbmF0ZSA9IFsm
XSAoYXV0byYgZmxvYXRBdm9pZGVyKSB7Ci0gICAgICAgIGF1dG8gdG9wID0gQm94R2VvbWV0cnk6
OmJvcmRlckJveFRvcChnZW9tZXRyeUZvckJveChmbG9hdEF2b2lkZXIpKTsKLSAgICAgICAgZm9y
IChhdXRvKiBhbmNlc3RvciA9ICZmbG9hdEF2b2lkZXIuY29udGFpbmluZ0Jsb2NrKCk7IGFuY2Vz
dG9yICE9ICZyb290KCk7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkK
LSAgICAgICAgICAgIHRvcCArPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94VG9wKGdlb21ldHJ5Rm9y
Qm94KCphbmNlc3RvcikpOwotICAgICAgICByZXR1cm4gdG9wOwotICAgIH07Ci0KLSAgICBhdXRv
IGZsb2F0Q29uc3RyYWludHNJbkNvbnRhaW5pbmdCbG9ja0Nvb3JkaW5hdGUgPSBbJl0gKGF1dG8g
ZmxvYXRDb25zdHJhaW50cykgewotICAgICAgICBpZiAoIWZsb2F0Q29uc3RyYWludHMubGVmdCAm
JiAhZmxvYXRDb25zdHJhaW50cy5yaWdodCkKLSAgICAgICAgICAgIHJldHVybiBGbG9hdGluZ0Nv
bnRleHQ6OkNvbnN0cmFpbnRzIHsgfTsKLSAgICAgICAgYXV0byBvZmZzZXQgPSBMYXlvdXRTaXpl
IHsgfTsKLSAgICAgICAgZm9yIChhdXRvKiBhbmNlc3RvciA9ICZsYXlvdXRCb3guY29udGFpbmlu
Z0Jsb2NrKCk7IGFuY2VzdG9yICE9ICZyb290KCk7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250
YWluaW5nQmxvY2soKSkKLSAgICAgICAgICAgIG9mZnNldCArPSB0b0xheW91dFNpemUoQm94R2Vv
bWV0cnk6OmJvcmRlckJveFRvcExlZnQoZ2VvbWV0cnlGb3JCb3goKmFuY2VzdG9yKSkpOwotICAg
ICAgICBpZiAoZmxvYXRDb25zdHJhaW50cy5sZWZ0KQotICAgICAgICAgICAgZmxvYXRDb25zdHJh
aW50cy5sZWZ0ID0gUG9pbnRJbkNvbnRleHRSb290IHsgKmZsb2F0Q29uc3RyYWludHMubGVmdCAt
IG9mZnNldCB9OwotICAgICAgICBpZiAoZmxvYXRDb25zdHJhaW50cy5yaWdodCkKLSAgICAgICAg
ICAgIGZsb2F0Q29uc3RyYWludHMucmlnaHQgPSBQb2ludEluQ29udGV4dFJvb3QgeyAqZmxvYXRD
b25zdHJhaW50cy5yaWdodCAtIG9mZnNldCB9OwotICAgICAgICByZXR1cm4gZmxvYXRDb25zdHJh
aW50czsKLSAgICB9OwotCi0gICAgLy8gRklYTUU6IENoZWNrIGlmIHRoZSBub24teWV0LWNvbXB1
dGVkIGhlaWdodCBhZmZlY3RzIHRoaXMgY29tcHV0YXRpb24gLSBhbmQgd2hldGhlciB3ZSBoYXZl
IHRvIHJlc29sdmUgaXQgYXQgYSBsYXRlciBwb2ludC4KLSAgICBhdXRvIGxvZ2ljYWxUb3AgPSBs
b2dpY2FsVG9wSW5Gb3JtYXR0aW5nQ29udGV4dFJvb3RDb29yZGluYXRlKGxheW91dEJveCk7Ci0g
ICAgYXV0byBjb25zdHJhaW50cyA9IGZsb2F0Q29uc3RyYWludHNJbkNvbnRhaW5pbmdCbG9ja0Nv
b3JkaW5hdGUoZmxvYXRpbmdDb250ZXh0LmNvbnN0cmFpbnRzKGxvZ2ljYWxUb3AsIGxvZ2ljYWxU
b3ApKTsKLSAgICBpZiAoIWNvbnN0cmFpbnRzLmxlZnQgJiYgIWNvbnN0cmFpbnRzLnJpZ2h0KQot
ICAgICAgICByZXR1cm4geyB9OwotICAgIC8vIFNocmluayB0aGUgYXZhaWxhYmxlIHNwYWNlIGlm
IHRoZSBmbG9hdHMgYXJlIGFjdHVhbGx5IGludHJ1ZGluZyBhdCB0aGlzIHZlcnRpY2FsIHBvc2l0
aW9uLgotICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBjb25zdHJhaW50c1BhaXIuY29udGFpbmlu
Z0Jsb2NrLmhvcml6b250YWwubG9naWNhbFdpZHRoOwotICAgIGlmIChjb25zdHJhaW50cy5sZWZ0
KQotICAgICAgICBhdmFpbGFibGVXaWR0aCAtPSBjb25zdHJhaW50cy5sZWZ0LT54OwotICAgIGlm
IChjb25zdHJhaW50cy5yaWdodCkKLSAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3RkOjptYXgo
MF9sdSwgY29uc3RyYWludHNQYWlyLmNvbnRhaW5pbmdCbG9jay5ob3Jpem9udGFsLmxvZ2ljYWxS
aWdodCgpIC0gY29uc3RyYWludHMucmlnaHQtPngpOwotICAgIHJldHVybiBhdmFpbGFibGVXaWR0
aDsKLX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpwbGFjZUluRmxvd1Bvc2l0aW9u
ZWRDaGlsZHJlbihjb25zdCBDb250YWluZXJCb3gmIGNvbnRhaW5lckJveCwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCi17Ci0gICAgTE9HX1dJVEhf
U1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIlN0YXJ0OiBtb3ZlIGlu
LWZsb3cgcG9zaXRpb25lZCBjaGlsZHJlbiAtPiBwYXJlbnQ6ICIgPDwgJmNvbnRhaW5lckJveCk7
Ci0gICAgZm9yIChhdXRvJiBjaGlsZEJveCA6IGNoaWxkcmVuT2ZUeXBlPEJveD4oY29udGFpbmVy
Qm94KSkgewotICAgICAgICBpZiAoIWNoaWxkQm94LmlzSW5GbG93UG9zaXRpb25lZCgpKQotICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGF1dG8gcG9zaXRpb25PZmZzZXQgPSBnZW9tZXRy
eSgpLmluRmxvd1Bvc2l0aW9uZWRQb3NpdGlvbk9mZnNldChjaGlsZEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzKTsKLSAgICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoY2hpbGRC
b3gpLm1vdmUocG9zaXRpb25PZmZzZXQpOwotICAgIH0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9y
bWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiRW5kOiBtb3ZlIGluLWZsb3cgcG9zaXRp
b25lZCBjaGlsZHJlbiAtPiBwYXJlbnQ6ICIgPDwgJmNvbnRhaW5lckJveCk7Ci19Ci0KLXZvaWQg
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZVN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29u
c3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29u
c3RyYWludHMpCi17Ci0gICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94
KS5zZXRMb2dpY2FsVG9wKGdlb21ldHJ5KCkuc3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRC
b3gsIHZlcnRpY2FsQ29uc3RyYWludHMpKTsKLX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0Ojpjb21wdXRlU3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKLXsK
LSAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxM
ZWZ0KGdlb21ldHJ5KCkuc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgaG9yaXpv
bnRhbENvbnN0cmFpbnRzKSk7Ci19Ci0KLXZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6cHJl
Y29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMoY29uc3QgQm94JiBsYXlv
dXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQotewotICAgIC8v
IEluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgd2hldGhlciBhIGJveCBzaG91bGQgYXZvaWQgYSBmbG9h
dCwgd2UgbmVlZCB0byBrbm93IHRoZSBmaW5hbCBwb3NpdGlvbnMgb2YgYm90aCAoaWdub3JlIHJl
bGF0aXZlIHBvc2l0aW9uaW5nIGZvciBub3cpLgotICAgIC8vIEluIGJsb2NrIGZvcm1hdHRpbmcg
Y29udGV4dCB0aGUgZmluYWwgcG9zaXRpb24gZm9yIGEgbm9ybWFsIGZsb3cgYm94IGluY2x1ZGVz
Ci0gICAgLy8gMS4gdGhlIHN0YXRpYyBwb3NpdGlvbiBhbmQKLSAgICAvLyAyLiB0aGUgY29ycmVz
cG9uZGluZyAobm9uKWNvbGxhcHNlZCBtYXJnaW5zLgotICAgIC8vIE5vdyB0aGUgdmVydGljYWwg
bWFyZ2lucyBhcmUgY29tcHV0ZWQgd2hlbiBhbGwgdGhlIGRlc2NlbmRhbnRzIGFyZSBmaW5hbGl6
ZWQsIGJlY2F1c2UgdGhlIG1hcmdpbiB2YWx1ZXMgbWlnaHQgYmUgZGVwZW5kaW5nIG9uIHRoZSBo
ZWlnaHQgb2YgdGhlIGJveAotICAgIC8vIChhbmQgdGhlIGhlaWdodCBtaWdodCBiZSBiYXNlZCBv
biB0aGUgY29udGVudCkuCi0gICAgLy8gU28gd2hlbiB3ZSBnZXQgdG8gdGhlIHBvaW50IHdoZXJl
IHdlIGludGVyc2VjdCB0aGUgYm94IHdpdGggdGhlIGZsb2F0IHRvIGRlY2lkZSBpZiB0aGUgYm94
IG5lZWRzIHRvIG1vdmUsIHdlIGRvbid0IHlldCBoYXZlIHRoZSBmaW5hbCB2ZXJ0aWNhbCBwb3Np
dGlvbi4KLSAgICAvLwotICAgIC8vIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCBhcyBsb25nIGFzIHdl
IGRvbid0IGNyb3NzIHRoZSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgYm91bmRhcnksIHdlIHNo
b3VsZCBiZSBhYmxlIHRvIHByZS1jb21wdXRlIHRoZSBmaW5hbCB0b3AgcG9zaXRpb24uCi0gICAg
Ly8gRklYTUU6IHdlIGN1cnJlbnRseSBkb24ndCBhY2NvdW50IGZvciB0aGUgImNsZWFyIiBwcm9w
ZXJ0eSB3aGVuIGNvbXB1dGluZyB0aGUgZmluYWwgcG9zaXRpb24gZm9yIGFuIGFuY2VzdG9yLgot
ICAgIGZvciAoYXV0byogYW5jZXN0b3IgPSAmbGF5b3V0Qm94OyBhbmNlc3RvciAmJiBhbmNlc3Rv
ciAhPSAmcm9vdCgpOyBhbmNlc3RvciA9ICZhbmNlc3Rvci0+Y29udGFpbmluZ0Jsb2NrKCkpIHsK
LSAgICAgICAgYXV0byBjb25zdHJhaW50c0ZvckFuY2VzdG9yID0gWyZdIHsKLSAgICAgICAgICAg
IGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKTsKLSAg
ICAgICAgICAgIHJldHVybiAmY29udGFpbmluZ0Jsb2NrID09ICZyb290KCkgPyBjb25zdHJhaW50
c1BhaXIuZm9ybWF0dGluZ0NvbnRleHRSb290IDogZ2VvbWV0cnkoKS5jb25zdHJhaW50c0Zvcklu
Rmxvd0NvbnRlbnQoY29udGFpbmluZ0Jsb2NrKTsKLSAgICAgICAgfSgpOwotCi0gICAgICAgIGF1
dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5KCkuY29tcHV0ZWRWZXJ0aWNhbE1h
cmdpbigqYW5jZXN0b3IsIGNvbnN0cmFpbnRzRm9yQW5jZXN0b3IuaG9yaXpvbnRhbCk7Ci0gICAg
ICAgIGF1dG8gdXNlZE5vbkNvbGxhcHNlZE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9u
Q29sbGFwc2VkVmFsdWVzIHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigw
KSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07Ci0gICAgICAgIGF1
dG8gcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUgPSBtYXJnaW5Db2xsYXBzZSgpLnByZWNvbXB1dGVk
TWFyZ2luQmVmb3JlKCphbmNlc3RvciwgdXNlZE5vbkNvbGxhcHNlZE1hcmdpbik7Ci0KLSAgICAg
ICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSgqYW5j
ZXN0b3IpOwotICAgICAgICBhdXRvIG5vbkNvbGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1h
cmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUubm9uQ29s
bGFwc2VkVmFsdWUsIHsgfSB9OwotICAgICAgICBhdXRvIGNvbGxhcHNlZFZhbHVlcyA9IFVzZWRW
ZXJ0aWNhbE1hcmdpbjo6Q29sbGFwc2VkVmFsdWVzIHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUu
Y29sbGFwc2VkVmFsdWUsIHsgfSwgZmFsc2UgfTsKLSAgICAgICAgYXV0byB2ZXJ0aWNhbE1hcmdp
biA9IFVzZWRWZXJ0aWNhbE1hcmdpbiB7IG5vbkNvbGxhcHNlZFZhbHVlcywgY29sbGFwc2VkVmFs
dWVzLCB7IHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlLnBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW5C
ZWZvcmUsIHsgfSB9IH07Ci0KLSAgICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0VXNlZFZlcnRp
Y2FsTWFyZ2luKCphbmNlc3RvciwgdmVydGljYWxNYXJnaW4pOwotICAgICAgICBib3hHZW9tZXRy
eS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiksIG1hcmdp
bkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsKLSAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNh
bFRvcCh2ZXJ0aWNhbFBvc2l0aW9uV2l0aE1hcmdpbigqYW5jZXN0b3IsIHZlcnRpY2FsTWFyZ2lu
LCBjb25zdHJhaW50c0ZvckFuY2VzdG9yLnZlcnRpY2FsKSk7Ci0jaWYgQVNTRVJUX0VOQUJMRUQK
LSAgICAgICAgc2V0UHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoKmFuY2VzdG9yLCBwcmVjb21wdXRl
ZE1hcmdpbkJlZm9yZSk7Ci0gICAgICAgIGJveEdlb21ldHJ5LnNldEhhc1ByZWNvbXB1dGVkTWFy
Z2luQmVmb3JlKCk7Ci0jZW5kaWYKLSAgICB9Ci19Ci0KLXZvaWQgQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6Y29tcHV0ZVBvc2l0aW9uVG9Bdm9pZEZsb2F0cyhjb25zdCBGbG9hdGluZ0NvbnRleHQm
IGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRz
UGFpciYgY29uc3RyYWludHNQYWlyKQotewotICAgIGlmICghbGF5b3V0Qm94LmlzRmxvYXRBdm9p
ZGVyKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAvLyBJbiBvcmRlciB0byBwb3NpdGlvbiBhIGZs
b2F0IGF2b2lkZXIgd2UgbmVlZCB0byBrbm93IGl0cyB2ZXJ0aWNhbCBwb3NpdGlvbiByZWxhdGl2
ZSB0byBpdHMgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QgKGFuZCBub3QganVzdCBpdHMgY29udGFp
bmluZyBibG9jayksCi0gICAgLy8gYmVjYXVzZSBhbGwgdGhlIGFscmVhZHktcGxhY2VkIGZsb2F0
cyAoZmxvYXRzIHRoYXQgd2UgYXJlIHRyeWluZyB0byBhdm9pZCBoZXJlKSBpbiB0aGlzIEJGQyBt
aWdodCBiZWxvbmcKLSAgICAvLyB0byBhIGRpZmZlcmVudCBzZXQgb2YgY29udGFpbmluZyBibG9j
a3MgKGJ1dCB0aGV5IGFsbCBkZXNjZW5kYW50cyBvZiB0aGUgQkZDIHJvb3QpLgotICAgIC8vIEhv
d2V2ZXIgYWNjb3JkaW5nIHRvIHRoZSBCRkMgcnVsZXMsIGF0IHRoaXMgcG9pbnQgb2YgdGhlIGxh
eW91dCBmbG93IHdlIGRvbid0IHlldCBoYXZlIGNvbXB1dGVkIHZlcnRpY2FsIHBvc2l0aW9ucyBm
b3IgdGhlIGFuY2VzdG9ycy4KLSAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVk
KCkpIHsKLSAgICAgICAgcHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3Rv
cnMobGF5b3V0Qm94LCBjb25zdHJhaW50c1BhaXIpOwotICAgICAgICBmb3JtYXR0aW5nU3RhdGUo
KS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nQ29udGV4
dC5wb3NpdGlvbkZvckZsb2F0KGxheW91dEJveCwgY29uc3RyYWludHNQYWlyLmNvbnRhaW5pbmdC
bG9jay5ob3Jpem9udGFsKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gTm9uLWZs
b2F0IHBvc2l0aW9uZWQgZmxvYXQgYXZvaWRlcnMgKGZvcm1hdHRpbmcgY29udGV4dCByb290cyBh
bmQgY2xlYXIgYm94ZXMpIHNob3VsZCBiZSBmaW5lIHVubGVzcyB0aGVyZSBhcmUgZmxvYXRzIGlu
IHRoaXMgY29udGV4dC4KLSAgICBpZiAoZmxvYXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKLSAgICAg
ICAgcmV0dXJuOwotICAgIHByZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0
b3JzKGxheW91dEJveCwgY29uc3RyYWludHNQYWlyKTsKLSAgICBpZiAobGF5b3V0Qm94Lmhhc0Zs
b2F0Q2xlYXIoKSkKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxv
YXRDbGVhcihmbG9hdGluZ0NvbnRleHQsIGxheW91dEJveCk7Ci0KLSAgICBBU1NFUlQobGF5b3V0
Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7Ci0gICAgZm9ybWF0dGluZ1N0YXRl
KCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRMb2dpY2FsVG9wTGVmdChmbG9hdGluZ0NvbnRl
eHQucG9zaXRpb25Gb3JOb25GbG9hdGluZ0Zsb2F0QXZvaWRlcihsYXlvdXRCb3gsIGNvbnN0cmFp
bnRzUGFpci5jb250YWluaW5nQmxvY2suaG9yaXpvbnRhbCkpOwotfQotCi12b2lkIEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihjb25z
dCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gp
Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5oYXNGbG9hdENsZWFyKCkpOwotICAgIGlmIChmbG9h
dGluZ0NvbnRleHQuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgYXV0byB2ZXJ0aWNh
bFBvc2l0aW9uQW5kQ2xlYXJhbmNlID0gZmxvYXRpbmdDb250ZXh0LnZlcnRpY2FsUG9zaXRpb25X
aXRoQ2xlYXJhbmNlKGxheW91dEJveCk7Ci0gICAgaWYgKCF2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xl
YXJhbmNlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1h
dHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgQVNTRVJUKHZlcnRpY2Fs
UG9zaXRpb25BbmRDbGVhcmFuY2UtPnBvc2l0aW9uID49IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hU
b3AoYm94R2VvbWV0cnkpKTsKLSAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2Fs
UG9zaXRpb25BbmRDbGVhcmFuY2UtPnBvc2l0aW9uKTsKLSAgICBpZiAodmVydGljYWxQb3NpdGlv
bkFuZENsZWFyYW5jZS0+Y2xlYXJhbmNlKQotICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRI
YXNDbGVhcmFuY2UobGF5b3V0Qm94KTsKLSAgICAvLyBGSVhNRTogUmVzZXQgdGhlIG1hcmdpbiB2
YWx1ZXMgb24gdGhlIGFuY2VzdG9ycy9wcmV2aW91cyBzaWJsaW5ncyBub3cgdGhhdCB0aGUgZmxv
YXQgYXZvaWRlciB3aXRoIGNsZWFyYW5jZSBkb2VzIG5vdCBtYXJnaW4gY29sbGFwc2UgYW55bW9y
ZS4KLX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlV2lkdGhBbmRNYXJn
aW4oY29uc3QgRmxvYXRpbmdDb250ZXh0JiBmbG9hdGluZ0NvbnRleHQsIGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBjb25zdCBDb25zdHJhaW50c1BhaXImIGNvbnN0cmFpbnRzUGFpcikKLXsKLSAgICBh
dXRvIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9
OwotICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdEF2b2lkZXIoKSkgewotICAgICAgICAvLyBGbG9h
dCBhdm9pZGVycycgYXZhaWxhYmxlIHdpZHRoIG1pZ2h0IGJlIHNocnVuayBieSBleGlzdGluZyBm
bG9hdHMgaW4gdGhlIGNvbnRleHQuCi0gICAgICAgIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVy
ID0gdXNlZEF2YWlsYWJsZVdpZHRoRm9yRmxvYXRBdm9pZGVyKGZsb2F0aW5nQ29udGV4dCwgbGF5
b3V0Qm94LCBjb25zdHJhaW50c1BhaXIpOwotICAgIH0KLSAgICBhdXRvIGNvbnRlbnRXaWR0aEFu
ZE1hcmdpbiA9IGdlb21ldHJ5KCkuY29tcHV0ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0
Qm94LCBjb25zdHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250YWwsIGF2YWlsYWJs
ZVdpZHRoRmxvYXRBdm9pZGVyKTsKLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdT
dGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgYm94R2VvbWV0cnkuc2V0Q29udGVu
dEJveFdpZHRoKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOwotICAgIGJveEdl
b21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1h
cmdpbi5zdGFydCwgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIH0pOwotfQot
Ci12b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29u
c3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29u
c3RyYWludHMpCi17Ci0gICAgYXV0byBjb21wdXRlID0gWyZdKE9wdGlvbmFsPExheW91dFVuaXQ+
IHVzZWRIZWlnaHQpIC0+IENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gewotICAgICAgICBpZiAobGF5
b3V0Qm94LmlzSW5GbG93KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbkZsb3dD
b250ZW50SGVpZ2h0QW5kTWFyZ2luKGxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwg
eyB1c2VkSGVpZ2h0IH0pOwotCi0gICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0
aW9uZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmZsb2F0aW5nQ29udGVudEhl
aWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIHsgdXNlZEhl
aWdodCB9KTsKLQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJu
IHsgfTsKLSAgICB9OwotCi0gICAgYXV0byBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0
ZSh7IH0pOwotICAgIGlmIChhdXRvIG1heEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhI
ZWlnaHQobGF5b3V0Qm94KSkgewotICAgICAgICBpZiAoY29udGVudEhlaWdodEFuZE1hcmdpbi5j
b250ZW50SGVpZ2h0ID4gKm1heEhlaWdodCkgewotICAgICAgICAgICAgYXV0byBtYXhIZWlnaHRB
bmRNYXJnaW4gPSBjb21wdXRlKG1heEhlaWdodCk7Ci0gICAgICAgICAgICAvLyBVc2VkIGhlaWdo
dCBzaG91bGQgcmVtYWluIHRoZSBzYW1lLgotICAgICAgICAgICAgQVNTRVJUKChsYXlvdXRTdGF0
ZSgpLmluUXVpcmtzTW9kZSgpICYmIChsYXlvdXRCb3guaXNCb2R5Qm94KCkgfHwgbGF5b3V0Qm94
LmlzRG9jdW1lbnRCb3goKSkpIHx8IG1heEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID09
ICptYXhIZWlnaHQpOwotICAgICAgICAgICAgY29udGVudEhlaWdodEFuZE1hcmdpbiA9IHsgKm1h
eEhlaWdodCwgbWF4SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbiB9OwotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgaWYgKGF1dG8gbWluSGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRl
ZE1pbkhlaWdodChsYXlvdXRCb3gpKSB7Ci0gICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFy
Z2luLmNvbnRlbnRIZWlnaHQgPCAqbWluSGVpZ2h0KSB7Ci0gICAgICAgICAgICBhdXRvIG1pbkhl
aWdodEFuZE1hcmdpbiA9IGNvbXB1dGUobWluSGVpZ2h0KTsKLSAgICAgICAgICAgIC8vIFVzZWQg
aGVpZ2h0IHNob3VsZCByZW1haW4gdGhlIHNhbWUuCi0gICAgICAgICAgICBBU1NFUlQoKGxheW91
dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkgJiYgKGxheW91dEJveC5pc0JvZHlCb3goKSB8fCBsYXlv
dXRCb3guaXNEb2N1bWVudEJveCgpKSkgfHwgbWluSGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWln
aHQgPT0gKm1pbkhlaWdodCk7Ci0gICAgICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0g
eyAqbWluSGVpZ2h0LCBtaW5IZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAxLiBDb21wdXRlIGNvbGxhcHNlZCBtYXJnaW5zLgot
ICAgIC8vIDIuIEFkanVzdCB2ZXJ0aWNhbCBwb3NpdGlvbiB1c2luZyB0aGUgY29sbGFwc2VkIHZh
bHVlcy4KLSAgICAvLyAzLiBBZGp1c3QgcHJldmlvdXMgaW4tZmxvdyBzaWJsaW5nIG1hcmdpbiBh
ZnRlciB1c2luZyB0aGlzIG1hcmdpbi4KLSAgICBhdXRvIG1hcmdpbkNvbGxhcHNlID0gdGhpcy0+
bWFyZ2luQ29sbGFwc2UoKTsKLSAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gbWFyZ2luQ29sbGFw
c2UuY29sbGFwc2VkVmVydGljYWxWYWx1ZXMobGF5b3V0Qm94LCBjb250ZW50SGVpZ2h0QW5kTWFy
Z2luLm5vbkNvbGxhcHNlZE1hcmdpbik7Ci0gICAgLy8gQ2FjaGUgdGhlIGNvbXB1dGVkIHBvc2l0
aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWUgcGFpci4KLSAgICBmb3JtYXR0aW5nU3RhdGUo
KS5zZXRVc2VkVmVydGljYWxNYXJnaW4obGF5b3V0Qm94LCB2ZXJ0aWNhbE1hcmdpbik7Ci0KLSNp
ZiBBU1NFUlRfRU5BQkxFRAotICAgIGlmIChoYXNQcmVjb21wdXRlZE1hcmdpbkJlZm9yZShsYXlv
dXRCb3gpICYmIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGxheW91dEJveCkudXNlZFZhbHVlKCkg
IT0gbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKSkgewotICAgICAgICAvLyBXaGVuIHRoZSBw
cmUtY29tcHV0ZWQgbWFyZ2luIHR1cm5zIG91dCB0byBiZSBpbmNvcnJlY3QsIHdlIG5lZWQgdG8g
cmUtbGF5b3V0IHRoaXMgc3VidHJlZSB3aXRoIHRoZSBjb3JyZWN0IG1hcmdpbiB2YWx1ZXMuCi0g
ICAgICAgIC8vIDxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0Ij48L2Rpdj4KLSAgICAgICAgLy8gPGRp
dj4KLSAgICAgICAgLy8gICA8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOiAyMDBweCI+PC9kaXY+
Ci0gICAgICAgIC8vIDwvZGl2PgotICAgICAgICAvLyBUaGUgZmxvYXQgYm94IHRyaWdnZXJzIG1h
cmdpbiBiZWZvcmUgY29tcHV0YXRpb24gb24gdGhlIGFuY2VzdG9yIGNoYWluIHRvIGJlIGFibGUg
dG8gaW50ZXJzZWN0IHdpdGggb3RoZXIgZmxvYXRzIGluIHRoZSBzYW1lIGZsb2F0aW5nIGNvbnRl
eHQuCi0gICAgICAgIC8vIEhvd2V2ZXIgaW4gc29tZSBjYXNlcyB0aGUgcGFyZW50IG1hcmdpbi10
b3AgY29sbGFwc2VzIHdpdGggc29tZSBuZXh0IHNpYmxpbmdzIChuZXBoZXdzKSBhbmQgdGhlcmUn
cyBubyB3YXkgdG8gYmUgYWJsZSB0byBwcm9wZXJseQotICAgICAgICAvLyBhY2NvdW50IGZvciB0
aGF0IHdpdGhvdXQgbGF5aW5nIG91dCBldmVyeSBub2RlIGluIHRoZSBGQyAoaW4gdGhlIGV4YW1w
bGUsIHRoZSBtYXJnaW4tYm90dG9tIHB1c2hlcyBkb3duIHRoZSBmbG9hdCkuCi0gICAgICAgIEFT
U0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci0gICAgfQotI2VuZGlmCi0gICAgYXV0byYgYm94
R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAg
IGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoY29udGVudEhlaWdodEFuZE1hcmdpbi5j
b250ZW50SGVpZ2h0KTsKLSAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdp
bkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsK
LSAgICAvLyBBZGp1c3QgdGhlIHByZXZpb3VzIHNpYmxpbmcncyBtYXJnaW4gYm90dG9tIG5vdyB0
aGF0IHRoaXMgYm94J3MgdmVydGljYWwgbWFyZ2luIGlzIGNvbXB1dGVkLgotICAgIE1hcmdpbkNv
bGxhcHNlOjp1cGRhdGVNYXJnaW5BZnRlckZvclByZXZpb3VzU2libGluZygqdGhpcywgbWFyZ2lu
Q29sbGFwc2UsIGxheW91dEJveCk7Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2lj
V2lkdGhDb25zdHJhaW50cygpCi17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+
Zm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgQVNTRVJUKCFmb3JtYXR0aW5nU3RhdGUuaW50cmluc2lj
V2lkdGhDb25zdHJhaW50cygpKTsKLSAgICAvLyBWaXNpdCB0aGUgaW4tZmxvdyBkZXNjZW5kYW50
cyBhbmQgY29tcHV0ZSB0aGVpciBtaW4vbWF4IGludHJpbnNpYyB3aWR0aCBpZiBuZWVkZWQuCi0g
ICAgLy8gMS4gR28gYWxsIHRoZSB3YXkgZG93biB0byB0aGUgbGVhZiBub2RlCi0gICAgLy8gMi4g
Q2hlY2sgaWYgYWN0dWFsbHkgbmVlZCB0byB2aXNpdCBhbGwgdGhlIGJveGVzIGFzIHdlIHRyYXZl
cnNlIGRvd24gKGFscmVhZHkgY29tcHV0ZWQsIGNvbnRhaW5lcidzIG1pbi9tYXggZG9lcyBub3Qg
ZGVwZW5kIG9uIGRlc2NlbmRhbnRzIGV0YykKLSAgICAvLyAzLiBBcyB3ZSBjbGltYiBiYWNrIG9u
IHRoZSB0cmVlLCBjb21wdXRlIG1pbi9tYXggaW50cmluc2ljIHdpZHRoCi0gICAgLy8gKEFueSBz
dWJ0cmVlcyB3aXRoIG5ldyBmb3JtYXR0aW5nIGNvbnRleHRzIG5lZWQgdG8gbGF5b3V0IHN5bmNo
cm9ub3VzbHkpCi0gICAgVmVjdG9yPGNvbnN0IEJveCo+IHF1ZXVlOwotICAgIGlmIChyb290KCku
aGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCi0gICAgICAgIHF1ZXVlLmFwcGVuZChyb290KCku
Zmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7Ci0KLSAgICBJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzIGNvbnN0cmFpbnRzOwotICAgIGF1dG8gbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dp
ZHRoID0gTGF5b3V0VW5pdCB7IH07Ci0gICAgYXV0byBjdXJyZW50SG9yaXpvbnRhbFN0YWNraW5n
V2lkdGggPSBMYXlvdXRVbml0IHsgfTsKLSAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgewot
ICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0
byBkZWFsIHdpdGggZGVzY2VuZGFudCBjb250ZW50LgotICAgICAgICAgICAgYXV0byYgbGF5b3V0
Qm94ID0gKnF1ZXVlLmxhc3QoKTsKLSAgICAgICAgICAgIC8vIEZsb2F0IGF2b2lkZXJzIGFyZSBh
bGwgZXN0YWJsaXNoIGEgbmV3IGZvcm1hdHRpbmcgY29udGV4dC4gTm8gbmVlZCB0byBsb29rIGlu
c2lkZSB0aGVtLgotICAgICAgICAgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpICYm
ICFsYXlvdXRCb3guaGFzRmxvYXRDbGVhcigpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgLy8gTm9uLWZsb2F0aW5nIGJsb2NrIGxldmVsIGJveGVzIHJlc2V0IHRoZSBjdXJy
ZW50IGhvcml6b250YWwgZmxvYXQgc3RhY2tpbmcuCi0gICAgICAgICAgICAvLyBTUEVDOiBUaGlz
IGlzIGEgYml0IG9kZCBhcyBmbG9hdGluZyBwb3NpdGlvbmluZyBpcyBhIGZvcm1hdHRpbmcgY29u
dGV4dCBsZXZlbCBjb25jZXB0OgotICAgICAgICAgICAgLy8gZS5nLgotICAgICAgICAgICAgLy8g
PGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiAxMHB4OyI+PC9kaXY+Ci0gICAgICAgICAg
ICAvLyA8ZGl2PjwvZGl2PgotICAgICAgICAgICAgLy8gPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7
IHdpZHRoOiA0MHB4OyI+PC9kaXY+Ci0gICAgICAgICAgICAvLyAuLi53aWxsIHByb2R1Y2UgYSBt
YXggd2lkdGggb2YgNDBweCB3aGljaCBtYWtlcyB0aGUgZmxvYXRzIHZlcnRpY2FsbHkgc3RhY2tl
ZC4KLSAgICAgICAgICAgIC8vIFZlcnRpY2FsbHkgc3RhY2tlZCBmbG9hdHMgbWFrZXMgbWUgdGhp
bmsgd2UgaGF2ZW4ndCBtYW5hZ2VkIHRvIHByb3ZpZGUgdGhlIG1heGltdW0gcHJlZmVycmVkIHdp
ZHRoIGZvciB0aGUgY29udGVudC4KLSAgICAgICAgICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tp
bmdXaWR0aCA9IHN0ZDo6bWF4KGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11
bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsKLSAgICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFs
U3RhY2tpbmdXaWR0aCA9IHsgfTsKLSAgICAgICAgICAgIC8vIEFscmVhZHkgaGFzIGNvbXB1dGVk
IGludHJpbnNpYyBjb25zdHJhaW50cy4KLSAgICAgICAgICAgIGlmIChmb3JtYXR0aW5nU3RhdGUu
aW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChsYXlvdXRCb3gpKQotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgLy8gQm94IHdpdGggZml4ZWQgd2lkdGggZGVmaW5lcyB0
aGVpciBkZXNjZW5kYW50IGNvbnRlbnQgaW50cmluc2ljIHdpZHRoLgotICAgICAgICAgICAgaWYg
KGxheW91dEJveC5zdHlsZSgpLndpZHRoKCkuaXNGaXhlZCgpKQotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgLy8gTm9uLWZsb2F0IGF2b2lkZXIgZm9ybWF0dGluZyBjb250ZXh0
IHJvb3RzIGFyZSBvcGFxdWUgdG8gaW50cmluc2ljIHdpZHRoIGNvbXB1dGF0aW9uLgotICAgICAg
ICAgICAgaWYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpCi0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvLyBObyByZWxldmFudCBjaGlsZCBjb250
ZW50LgotICAgICAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRv
d25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQo
KSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChkb3du
Y2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQo
KSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ29tcHV0ZSBtaW4vbWF4IGludHJpbnNpYyB3aWR0
aCBib3R0b20gdXAgaWYgbmVlZGVkLgotICAgICAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkg
ewotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKnF1ZXVlLnRha2VMYXN0KCk7Ci0gICAg
ICAgICAgICBhdXRvIGRlc2RlbmRhbnRDb25zdHJhaW50cyA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGxheW91dEJveCk7Ci0gICAgICAgICAgICBpZiAo
IWRlc2RlbmRhbnRDb25zdHJhaW50cykgewotICAgICAgICAgICAgICAgIGRlc2RlbmRhbnRDb25z
dHJhaW50cyA9IGdlb21ldHJ5KCkuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhsYXlvdXRCb3gp
OwotICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzRm9yQm94KGxheW91dEJveCwgKmRlc2RlbmRhbnRDb25zdHJhaW50cyk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBjb25zdHJhaW50cy5taW5pbXVtID0gc3RkOjptYXgoY29uc3Ry
YWludHMubWluaW11bSwgZGVzZGVuZGFudENvbnN0cmFpbnRzLT5taW5pbXVtKTsKLSAgICAgICAg
ICAgIGF1dG8gd2lsbFN0YWNrSG9yaXpvbnRhbGx5ID0gbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVy
KCkgJiYgIWxheW91dEJveC5oYXNGbG9hdENsZWFyKCk7Ci0gICAgICAgICAgICBpZiAod2lsbFN0
YWNrSG9yaXpvbnRhbGx5KQotICAgICAgICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tp
bmdXaWR0aCArPSBkZXNkZW5kYW50Q29uc3RyYWludHMtPm1heGltdW07Ci0gICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgY29uc3RyYWludHMubWF4aW11bSA9IHN0ZDo6bWF4KGNvbnN0
cmFpbnRzLm1heGltdW0sIGRlc2RlbmRhbnRDb25zdHJhaW50cy0+bWF4aW11bSk7Ci0gICAgICAg
ICAgICAvLyBNb3ZlIG92ZXIgdG8gdGhlIG5leHQgc2libGluZyBvciB0YWtlIHRoZSBuZXh0IGJv
eCBpbiB0aGUgcXVldWUuCi0gICAgICAgICAgICBpZiAoYXV0byogbmV4dFNpYmxpbmcgPSBsYXlv
dXRCb3gubmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBx
dWV1ZS5hcHBlbmQobmV4dFNpYmxpbmcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdX
aWR0aCA9IHN0ZDo6bWF4KGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhv
cml6b250YWxTdGFja2luZ1dpZHRoKTsKLSAgICBjb25zdHJhaW50cy5tYXhpbXVtID0gc3RkOjpt
YXgoY29uc3RyYWludHMubWF4aW11bSwgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsK
LSAgICBmb3JtYXR0aW5nU3RhdGUuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25zdHJh
aW50cyk7Ci0gICAgcmV0dXJuIGNvbnN0cmFpbnRzOwotfQotCi1MYXlvdXRVbml0IEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6OnZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBjb25zdCBVc2VkVmVydGljYWxNYXJnaW4mIHZlcnRpY2FsTWFyZ2luLCAgY29uc3Qg
VmVydGljYWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cykgY29uc3QKLXsKLSAgICBB
U1NFUlQoIWxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7Ci0gICAgLy8gTm93IHRo
YXQgd2UndmUgY29tcHV0ZWQgdGhlIGZpbmFsIG1hcmdpbiBiZWZvcmUsIGxldCdzIHNoaWZ0IHRo
ZSBib3gncyB2ZXJ0aWNhbCBwb3NpdGlvbiBpZiBuZWVkZWQuCi0gICAgLy8gMS4gQ2hlY2sgaWYg
dGhlIGJveCBoYXMgY2xlYXJhbmNlLiBJZiBzbywgd2UndmUgYWxyZWFkeSBwcmVjb21wdXRlZC9m
aW5hbGl6ZWQgdGhlIHRvcCB2YWx1ZSBhbmQgdmVydGljYWwgbWFyZ2luIGRvZXMgbm90IGltcGFj
dCBpdCBhbnltb3JlLgotICAgIC8vIDIuIENoZWNrIGlmIHRoZSBtYXJnaW4gYmVmb3JlIGNvbGxh
cHNlcyB3aXRoIHRoZSBwcmV2aW91cyBib3gncyBtYXJnaW4gYWZ0ZXIuIGlmIG5vdCAtPiByZXR1
cm4gcHJldmlvdXMgYm94J3MgYm90dG9tIGluY2x1ZGluZyBtYXJnaW4gYWZ0ZXIgKyBtYXJnaW5C
ZWZvcmUKLSAgICAvLyAzLiBDaGVjayBpZiB0aGUgcHJldmlvdXMgYm94J3MgbWFyZ2lucyBjb2xs
YXBzZSB0aHJvdWdoLiBJZiBub3QgLT4gcmV0dXJuIHByZXZpb3VzIGJveCcgYm90dG9tIGV4Y2x1
ZGluZyBtYXJnaW4gYWZ0ZXIgKyBtYXJnaW5CZWZvcmUgKHRoZXkgYXJlIHN1cHBvc2VkIHRvIGJl
IGVxdWFsKQotICAgIC8vIDQuIEdvIHRvIHByZXZpb3VzIGJveCBhbmQgc3RhcnQgZnJvbSBzdGVw
ICMxIHVudGlsIHdlIGhpdCB0aGUgcGFyZW50IGJveC4KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9
IGdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0gICAgaWYgKGZvcm1hdHRpbmdTdGF0ZSgpLmhh
c0NsZWFyYW5jZShsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gQm94R2VvbWV0cnk6OmJvcmRl
ckJveFRvcChib3hHZW9tZXRyeSk7Ci0KLSAgICBhdXRvKiBjdXJyZW50TGF5b3V0Qm94ID0gJmxh
eW91dEJveDsKLSAgICB3aGlsZSAoY3VycmVudExheW91dEJveCkgewotICAgICAgICBpZiAoIWN1
cnJlbnRMYXlvdXRCb3gtPnByZXZpb3VzSW5GbG93U2libGluZygpKQotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9ICpjdXJyZW50TGF5b3V0
Qm94LT5wcmV2aW91c0luRmxvd1NpYmxpbmcoKTsKLSAgICAgICAgaWYgKCFtYXJnaW5Db2xsYXBz
ZSgpLm1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcigq
Y3VycmVudExheW91dEJveCkpIHsKLSAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0
cnkgPSBnZW9tZXRyeUZvckJveChwcmV2aW91c0luRmxvd1NpYmxpbmcpOwotICAgICAgICAgICAg
cmV0dXJuIEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJv
dHRvbSgpICsgbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKTsKLSAgICAgICAgfQotCi0gICAg
ICAgIGlmICghbWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5zQ29sbGFwc2VUaHJvdWdoKHByZXZpb3Vz
SW5GbG93U2libGluZykpIHsKLSAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkg
PSBnZW9tZXRyeUZvckJveChwcmV2aW91c0luRmxvd1NpYmxpbmcpOwotICAgICAgICAgICAgcmV0
dXJuIEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRv
bSgpICsgbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKTsKLSAgICAgICAgfQotICAgICAgICBj
dXJyZW50TGF5b3V0Qm94ID0gJnByZXZpb3VzSW5GbG93U2libGluZzsKLSAgICB9Ci0KLSAgICBh
dXRvIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgPSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxv
Z2ljYWxUb3A7Ci0gICAgLy8gQWRqdXN0IHZlcnRpY2FsIHBvc2l0aW9uIGRlcGVuZGluZyB3aGV0
aGVyIHRoaXMgYm94IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYWRqb2lucyB3aXRoIGl0cyBwYXJl
bnQuCi0gICAgYXV0byBkaXJlY3RseUFkam9pbnNQYXJlbnQgPSAhbGF5b3V0Qm94LnByZXZpb3Vz
SW5GbG93U2libGluZygpOwotICAgIGlmIChkaXJlY3RseUFkam9pbnNQYXJlbnQpIHsKLSAgICAg
ICAgLy8gSWYgdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgb2YgYSBib3ggYXJlIGFkam9pbmlu
ZywgdGhlbiBpdCBpcyBwb3NzaWJsZSBmb3IgbWFyZ2lucyB0byBjb2xsYXBzZSB0aHJvdWdoIGl0
LgotICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBk
ZXBlbmRzIG9uIGl0cyByZWxhdGlvbnNoaXAgd2l0aCB0aGUgb3RoZXIgZWxlbWVudHMgd2hvc2Ug
bWFyZ2lucyBhcmUgYmVpbmcgY29sbGFwc2VkLgotICAgICAgICBpZiAodmVydGljYWxNYXJnaW4u
Y29sbGFwc2VkVmFsdWVzLmlzQ29sbGFwc2VkVGhyb3VnaCkgewotICAgICAgICAgICAgLy8gSWYg
dGhlIGVsZW1lbnQncyBtYXJnaW5zIGFyZSBjb2xsYXBzZWQgd2l0aCBpdHMgcGFyZW50J3MgdG9w
IG1hcmdpbiwgdGhlIHRvcCBib3JkZXIgZWRnZSBvZiB0aGUgYm94IGlzIGRlZmluZWQgdG8gYmUg
dGhlIHNhbWUgYXMgdGhlIHBhcmVudCdzLgotICAgICAgICAgICAgaWYgKG1hcmdpbkNvbGxhcHNl
KCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXlvdXRCb3gp
KQotICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluaW5nQmxvY2tDb250ZW50Qm94VG9wOwot
ICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBlaXRoZXIgdGhlIGVsZW1lbnQncyBwYXJlbnQgaXMg
bm90IHRha2luZyBwYXJ0IGluIHRoZSBtYXJnaW4gY29sbGFwc2luZywgb3Igb25seSB0aGUgcGFy
ZW50J3MgYm90dG9tIG1hcmdpbiBpcyBpbnZvbHZlZC4KLSAgICAgICAgICAgIC8vIFRoZSBwb3Np
dGlvbiBvZiB0aGUgZWxlbWVudCdzIHRvcCBib3JkZXIgZWRnZSBpcyB0aGUgc2FtZSBhcyBpdCB3
b3VsZCBoYXZlIGJlZW4gaWYgdGhlIGVsZW1lbnQgaGFkIGEgbm9uLXplcm8gYm90dG9tIGJvcmRl
ci4KLSAgICAgICAgICAgIGF1dG8gYmVmb3JlTWFyZ2luV2l0aEJvdHRvbUJvcmRlciA9IG1hcmdp
bkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlSWdub3JpbmdDb2xsYXBzaW5nVGhyb3VnaChsYXlvdXRC
b3gsIHZlcnRpY2FsTWFyZ2luLm5vbkNvbGxhcHNlZFZhbHVlcyk7Ci0gICAgICAgICAgICByZXR1
cm4gY29udGFpbmluZ0Jsb2NrQ29udGVudEJveFRvcCArIGJlZm9yZU1hcmdpbldpdGhCb3R0b21C
b3JkZXI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm9uLWNvbGxhcHNlZCB0aHJvdWdoIGJveCB2
ZXJ0aWNhbCBwb3NpdGlvbiBkZXBlbmRpbmcgd2hldGhlciB0aGUgbWFyZ2luIGNvbGxhcHNlcy4K
LSAgICAgICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBh
cmVudE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQotICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5p
bmdCbG9ja0NvbnRlbnRCb3hUb3A7Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0Nv
bnRlbnRCb3hUb3AgKyBtYXJnaW5CZWZvcmUodmVydGljYWxNYXJnaW4pOwotICAgIH0KLSAgICAv
LyBBdCB0aGlzIHBvaW50IHRoaXMgYm94IGluZGlyZWN0bHkgKHZpYSBjb2xsYXBzZWQgdGhyb3Vn
aCBwcmV2aW91cyBpbi1mbG93IHNpYmxpbmdzKSBhZGpvaW5zIHRoZSBwYXJlbnQuIExldCdzIGNo
ZWNrIGlmIGl0IG1hcmdpbiBjb2xsYXBzZXMgd2l0aCB0aGUgcGFyZW50LgotICAgIGF1dG8mIGNv
bnRhaW5pbmdCbG9jayA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsKLSAgICBBU1NFUlQo
Y29udGFpbmluZ0Jsb2NrLmZpcnN0SW5GbG93Q2hpbGQoKSk7Ci0gICAgQVNTRVJUKGNvbnRhaW5p
bmdCbG9jay5maXJzdEluRmxvd0NoaWxkKCkgIT0gJmxheW91dEJveCk7Ci0gICAgaWYgKG1hcmdp
bkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZSgq
Y29udGFpbmluZ0Jsb2NrLmZpcnN0SW5GbG93Q2hpbGQoKSkpCi0gICAgICAgIHJldHVybiBjb250
YWluaW5nQmxvY2tDb250ZW50Qm94VG9wOwotCi0gICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0Nv
bnRlbnRCb3hUb3AgKyBtYXJnaW5CZWZvcmUodmVydGljYWxNYXJnaW4pOwotfQotCi19Ci19Ci0K
LSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGlu
Zy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tm
b3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggNjNkOTk2OTNlODdjZDBiMGYxMzJlYWM3MTM2OTBlMGI3MDUyZTEyOS4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuaAorKysgL2Rldi9u
dWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0g
KiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICog
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBF
TkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkJsb2NrRm9ybWF0
dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlIDx3
dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLQotbmFtZXNwYWNlIFdl
YkNvcmUgewotCi1jbGFzcyBMYXlvdXRVbml0OwotCi1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xh
c3MgQm94OwotY2xhc3MgRmxvYXRpbmdDb250ZXh0OwotCi0vLyBUaGlzIGNsYXNzIGltcGxlbWVu
dHMgdGhlIGxheW91dCBsb2dpYyBmb3IgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cy4KLS8vIGh0
dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi92aXN1cmVuLmh0bWwjYmxvY2stZm9ybWF0dGluZwot
Y2xhc3MgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dCB7
Ci0gICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KTsKLXB1
YmxpYzoKLSAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9y
bWF0dGluZ0NvbnRleHRSb290LCBCbG9ja0Zvcm1hdHRpbmdTdGF0ZSYpOwotCi0gICAgdm9pZCBs
YXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNG
b3JJbkZsb3dDb250ZW50Jikgb3ZlcnJpZGU7Ci0gICAgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhl
aWdodCgpIGNvbnN0IG92ZXJyaWRlOwotCi1wcm90ZWN0ZWQ6Ci0gICAgc3RydWN0IENvbnN0cmFp
bnRzUGFpciB7Ci0gICAgICAgIENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBmb3JtYXR0aW5n
Q29udGV4dFJvb3Q7Ci0gICAgICAgIENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBjb250YWlu
aW5nQmxvY2s7Ci0gICAgfTsKLSAgICB2b2lkIHBsYWNlSW5GbG93UG9zaXRpb25lZENoaWxkcmVu
KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOwotCi0g
ICAgdm9pZCBjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3QgRmxvYXRpbmdDb250ZXh0JiwgY29u
c3QgQm94JiwgY29uc3QgQ29uc3RyYWludHNQYWlyJik7Ci0gICAgdm9pZCBjb21wdXRlSGVpZ2h0
QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYp
OwotCi0gICAgdm9pZCBjb21wdXRlU3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGNvbnN0IEJveCYs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOwotICAgIHZvaWQgY29tcHV0ZVN0YXRpY1Zl
cnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYpOwot
ICAgIHZvaWQgY29tcHV0ZVBvc2l0aW9uVG9Bdm9pZEZsb2F0cyhjb25zdCBGbG9hdGluZ0NvbnRl
eHQmLCBjb25zdCBCb3gmLCBjb25zdCBDb25zdHJhaW50c1BhaXImKTsKLSAgICB2b2lkIGNvbXB1
dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBj
b25zdCBCb3gmKTsKLQotICAgIHZvaWQgcHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hB
bmRBbmNlc3RvcnMoY29uc3QgQm94JiwgY29uc3QgQ29uc3RyYWludHNQYWlyJik7Ci0KLSAgICBJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cygpIG92ZXJyaWRlOwotCi0gICAgTGF5b3V0VW5pdCB2ZXJ0aWNhbFBvc2l0aW9uV2l0aE1hcmdp
bihjb25zdCBCb3gmLCBjb25zdCBVc2VkVmVydGljYWxNYXJnaW4mLCBjb25zdCBWZXJ0aWNhbENv
bnN0cmFpbnRzJikgY29uc3Q7Ci0KLSAgICAvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgcG9zaXRp
b25pbmcgYW5kIHNpemluZyBmb3IgYm94ZXMgcGFydGljaXBhdGluZyBpbiBhIGJsb2NrIGZvcm1h
dHRpbmcgY29udGV4dC4KLSAgICBjbGFzcyBHZW9tZXRyeSA6IHB1YmxpYyBGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnkgewotICAgIHB1YmxpYzoKLSAgICAgICAgR2VvbWV0cnkoY29uc3QgQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0gICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4g
aW5GbG93Q29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFs
Q29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKTsKLSAgICAgICAg
Q29udGVudFdpZHRoQW5kTWFyZ2luIGluRmxvd0NvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBC
b3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpv
bnRhbFZhbHVlcyYpOwotCi0gICAgICAgIFBvaW50IHN0YXRpY1Bvc2l0aW9uKGNvbnN0IEJveCYs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMm
KSBjb25zdDsKLSAgICAgICAgTGF5b3V0VW5pdCBzdGF0aWNWZXJ0aWNhbFBvc2l0aW9uKGNvbnN0
IEJveCYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmKSBjb25zdDsKLSAgICAgICAgTGF5b3V0
VW5pdCBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJikgY29uc3Q7Ci0KLSAgICAgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0IEJveCYpOwotCi0gICAgICAgIENvbnRl
bnRXaWR0aEFuZE1hcmdpbiBjb21wdXRlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gm
LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFp
bGFibGVXaWR0aEZsb2F0QXZvaWRlcik7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBDb250ZW50
SGVpZ2h0QW5kTWFyZ2luIGluRmxvd05vblJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihj
b25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVu
VmVydGljYWxWYWx1ZXMmKTsKLSAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGluRmxvd05v
blJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0gICAg
ICAgIENvbnRlbnRXaWR0aEFuZE1hcmdpbiBpbkZsb3dSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1h
cmdpbihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNv
bnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0KLSAgICAgICAgY29uc3QgQmxvY2tG
b3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3du
Y2FzdDxCbG9ja0Zvcm1hdHRpbmdDb250ZXh0PihGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6
OmZvcm1hdHRpbmdDb250ZXh0KCkpOyB9Ci0gICAgfTsKLSAgICBCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlzKTsg
fQotCi0gICAgLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIG1hcmdpbiBjb2xsYXBzaW5nIGZvciBi
bG9jayBmb3JtYXR0aW5nIGNvbnRleHQuCi0gICAgY2xhc3MgTWFyZ2luQ29sbGFwc2UgewotICAg
IHB1YmxpYzoKLSAgICAgICAgVXNlZFZlcnRpY2FsTWFyZ2luIGNvbGxhcHNlZFZlcnRpY2FsVmFs
dWVzKGNvbnN0IEJveCYsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsK
LQotICAgICAgICBQcmVjb21wdXRlZE1hcmdpbkJlZm9yZSBwcmVjb21wdXRlZE1hcmdpbkJlZm9y
ZShjb25zdCBCb3gmLCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyk7Ci0g
ICAgICAgIExheW91dFVuaXQgbWFyZ2luQmVmb3JlSWdub3JpbmdDb2xsYXBzaW5nVGhyb3VnaChj
b25zdCBCb3gmLCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyk7Ci0gICAg
ICAgIHN0YXRpYyB2b2lkIHVwZGF0ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nKEJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQmLCBjb25zdCBNYXJnaW5Db2xsYXBzZSYsIGNvbnN0IEJveCYpOwot
Ci0gICAgICAgIGJvb2wgbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9y
ZShjb25zdCBCb3gmKSBjb25zdDsKLSAgICAgICAgYm9vbCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNX
aXRoRmlyc3RJbkZsb3dDaGlsZE1hcmdpbkJlZm9yZShjb25zdCBCb3gmKSBjb25zdDsKLSAgICAg
ICAgYm9vbCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3Qg
Qm94JikgY29uc3Q7Ci0gICAgICAgIGJvb2wgbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZp
b3VzU2libGluZ01hcmdpbkFmdGVyKGNvbnN0IEJveCYpIGNvbnN0OwotCi0gICAgICAgIGJvb2wg
bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94JikgY29u
c3Q7Ci0gICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoTGFzdEluRmxvd0NoaWxk
TWFyZ2luQWZ0ZXIoY29uc3QgQm94JikgY29uc3Q7Ci0gICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJD
b2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OwotICAgICAg
ICBib29sIG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aE5leHRTaWJsaW5nTWFyZ2luQmVmb3JlKGNv
bnN0IEJveCYpIGNvbnN0OwotICAgICAgICBib29sIG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNp
YmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGNvbnN0IEJveCYpIGNvbnN0OwotCi0gICAg
ICAgIGJvb2wgbWFyZ2luc0NvbGxhcHNlVGhyb3VnaChjb25zdCBCb3gmKSBjb25zdDsKLQotICAg
IHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Owot
ICAgICAgICBNYXJnaW5Db2xsYXBzZShjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Jik7Ci0K
LSAgICAgICAgZW51bSBjbGFzcyBNYXJnaW5UeXBlIHsgQmVmb3JlLCBBZnRlciB9OwotICAgICAg
ICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcG9z
aXRpdmVOZWdhdGl2ZVZhbHVlcyhjb25zdCBCb3gmLCBNYXJnaW5UeXBlKSBjb25zdDsKLSAgICAg
ICAgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHBv
c2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUoY29uc3QgQm94JiwgVXNlZFZlcnRpY2FsTWFyZ2lu
OjpOb25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0OwotICAgICAgICBVc2VkVmVydGljYWxNYXJnaW46
OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkFm
dGVyKGNvbnN0IEJveCYsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKSBj
b25zdDsKLQotICAgICAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQ
YWlyOjpWYWx1ZXMgcHJlY29tcHV0ZWRQb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGNvbnN0
IEJveCYsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdDsKLSAg
ICAgICAgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVz
IHByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZVZhbHVlcyhjb25zdCBCb3gmKSBjb25zdDsKLQot
ICAgICAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1
ZXMgY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKFVzZWRWZXJ0aWNhbE1hcmdpbjo6
UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcywgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3Np
dGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzKSBjb25zdDsKLSAgICAgICAgT3B0aW9uYWw8TGF5
b3V0VW5pdD4gbWFyZ2luVmFsdWUoVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0
aXZlUGFpcjo6VmFsdWVzKSBjb25zdDsKLQotICAgICAgICBib29sIGhhc0NsZWFyYW5jZShjb25z
dCBCb3gmKSBjb25zdDsKLQotICAgICAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSB7IHJl
dHVybiBtX2Jsb2NrRm9ybWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQotICAgICAgICBj
b25zdCBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2Jsb2NrRm9y
bWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQotICAgICAgICBjb25zdCBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tG
b3JtYXR0aW5nQ29udGV4dDsgfQotCi0gICAgICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQmIG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4dDsKLSAgICB9OwotICAgIE1hcmdpbkNvbGxhcHNl
IG1hcmdpbkNvbGxhcHNlKCkgY29uc3QgeyByZXR1cm4gTWFyZ2luQ29sbGFwc2UoKnRoaXMpOyB9
Ci0KLSAgICBjbGFzcyBRdWlya3MgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyB7
Ci0gICAgcHVibGljOgotICAgICAgICBRdWlya3MoY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dCYpOwotCi0gICAgICAgIGJvb2wgbmVlZHNTdHJldGNoaW5nKGNvbnN0IEJveCYpIGNvbnN0Owot
ICAgICAgICBMYXlvdXRVbml0IHN0cmV0Y2hlZEluRmxvd0hlaWdodChjb25zdCBCb3gmLCBDb250
ZW50SGVpZ2h0QW5kTWFyZ2luKTsKLQotICAgICAgICBib29sIHNob3VsZElnbm9yZUNvbGxhcHNl
ZFF1aXJrTWFyZ2luKGNvbnN0IEJveCYpIGNvbnN0OwotICAgICAgICBib29sIHNob3VsZENvbGxh
cHNlTWFyZ2luQmVmb3JlV2l0aFBhcmVudE1hcmdpbkJlZm9yZShjb25zdCBCb3gmKSBjb25zdDsK
LSAgICAgICAgYm9vbCBzaG91bGRDb2xsYXBzZU1hcmdpbkFmdGVyV2l0aFBhcmVudE1hcmdpbkFm
dGVyKGNvbnN0IEJveCYpIGNvbnN0OwotCi0gICAgICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8QmxvY2tG
b3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6Zm9ybWF0dGluZ0Nv
bnRleHQoKSk7IH0KLSAgICAgICAgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2Vv
bWV0cnkoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCk7IH0K
LQotICAgIH07Ci0gICAgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzIHF1aXJrcygpIGNv
bnN0IHsgcmV0dXJuIFF1aXJrcygqdGhpcyk7IH0KLQotICAgIE9wdGlvbmFsPExheW91dFVuaXQ+
IHVzZWRBdmFpbGFibGVXaWR0aEZvckZsb2F0QXZvaWRlcihjb25zdCBGbG9hdGluZ0NvbnRleHQm
LCBjb25zdCBCb3gmLCBjb25zdCBDb25zdHJhaW50c1BhaXImKTsKLQotICAgIGNvbnN0IEJsb2Nr
Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBkb3duY2Fz
dDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0
ZSgpKTsgfQotICAgIEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJl
dHVybiBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZv
cm1hdHRpbmdTdGF0ZSgpKTsgfQotCi0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICB2b2lkIHNldFBy
ZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBQcmVjb21w
dXRlZE1hcmdpbkJlZm9yZSYgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUpIHsgbV9wcmVjb21wdXRl
ZE1hcmdpbkJlZm9yZUxpc3Quc2V0KCZsYXlvdXRCb3gsIHByZWNvbXB1dGVkTWFyZ2luQmVmb3Jl
KTsgfQotICAgIFByZWNvbXB1dGVkTWFyZ2luQmVmb3JlIHByZWNvbXB1dGVkTWFyZ2luQmVmb3Jl
KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdCB7IHJldHVybiBtX3ByZWNvbXB1dGVkTWFyZ2lu
QmVmb3JlTGlzdC5nZXQoJmxheW91dEJveCk7IH0KLSAgICBib29sIGhhc1ByZWNvbXB1dGVkTWFy
Z2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdCB7IHJldHVybiBtX3ByZWNvbXB1
dGVkTWFyZ2luQmVmb3JlTGlzdC5jb250YWlucygmbGF5b3V0Qm94KTsgfQotI2VuZGlmCi1wcml2
YXRlOgotICAgIEhhc2hNYXA8Y29uc3QgQm94KiwgUHJlY29tcHV0ZWRNYXJnaW5CZWZvcmU+IG1f
cHJlY29tcHV0ZWRNYXJnaW5CZWZvcmVMaXN0OwotfTsKLQotaW5saW5lIEJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5OjpHZW9tZXRyeShjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
JiBibG9ja0Zvcm1hdHRpbmdDb250ZXh0KQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5KGJsb2NrRm9ybWF0dGluZ0NvbnRleHQpCi17Ci19Ci0KLWlubGluZSBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpRdWlya3M6OlF1aXJrcyhjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBi
bG9ja0Zvcm1hdHRpbmdDb250ZXh0KQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyhi
bG9ja0Zvcm1hdHRpbmdDb250ZXh0KQotewotfQotCi1pbmxpbmUgQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6TWFyZ2luQ29sbGFwc2U6Ok1hcmdpbkNvbGxhcHNlKGNvbnN0IEJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQmIGJsb2NrRm9ybWF0dGluZ0NvbnRleHQpCi0gICAgOiBtX2Jsb2NrRm9ybWF0dGlu
Z0NvbnRleHQoYmxvY2tGb3JtYXR0aW5nQ29udGV4dCkKLXsKLX0KLQotfQotfQotCi1TUEVDSUFM
SVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoQmxvY2tGb3JtYXR0aW5n
Q29udGV4dCwgaXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdD
b250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGlu
Zy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwYTFhMmI0MTZjNjdkZTVmMjQ1ZDUyYzE1ZGI2MzQzNThkY2NiNWIxLi4wMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNw
cAorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAy
MDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUg
ImNvbmZpZy5oIgotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVO
QUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0
aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIklu
bGluZUZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0j
aW5jbHVkZSAiTGF5b3V0Q2hpbGRJdGVyYXRvci5oIgotI2luY2x1ZGUgIkxheW91dENvbnRleHQu
aCIKLSNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCi0jaW5jbHVkZSAi
TGF5b3V0UmVwbGFjZWRCb3guaCIKLSNpbmNsdWRlICJMb2dnaW5nLmgiCi0jaW5jbHVkZSA8d3Rm
L3RleHQvVGV4dFN0cmVhbS5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5
b3V0IHsKLQotQ29udGVudEhlaWdodEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpH
ZW9tZXRyeTo6aW5GbG93Tm9uUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJv
eCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25z
dHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGlj
YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpICYmICFsYXlvdXRC
b3guaXNSZXBsYWNlZEJveCgpKTsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3ZlcmZsb3dWaXNp
YmxlKCkpOwotCi0gICAgYXV0byBjb21wdXRlID0gWyZdKGNvbnN0IGF1dG8mIG92ZXJyaWRkZW5W
ZXJ0aWNhbFZhbHVlcykgLT4gQ29udGVudEhlaWdodEFuZE1hcmdpbiB7Ci0KLSAgICAgICAgLy8g
MTAuNi4zIEJsb2NrLWxldmVsIG5vbi1yZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdyB3
aGVuICdvdmVyZmxvdycgY29tcHV0ZXMgdG8gJ3Zpc2libGUnCi0gICAgICAgIC8vCi0gICAgICAg
IC8vIElmICdtYXJnaW4tdG9wJywgb3IgJ21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHRoZWly
IHVzZWQgdmFsdWUgaXMgMC4KLSAgICAgICAgLy8gSWYgJ2hlaWdodCcgaXMgJ2F1dG8nLCB0aGUg
aGVpZ2h0IGRlcGVuZHMgb24gd2hldGhlciB0aGUgZWxlbWVudCBoYXMgYW55IGJsb2NrLWxldmVs
IGNoaWxkcmVuIGFuZCB3aGV0aGVyIGl0IGhhcyBwYWRkaW5nIG9yIGJvcmRlcnM6Ci0gICAgICAg
IC8vIFRoZSBlbGVtZW50J3MgaGVpZ2h0IGlzIHRoZSBkaXN0YW5jZSBmcm9tIGl0cyB0b3AgY29u
dGVudCBlZGdlIHRvIHRoZSBmaXJzdCBhcHBsaWNhYmxlIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAg
ICAgIC8vIDEuIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgbGFzdCBsaW5lIGJveCwgaWYgdGhlIGJv
eCBlc3RhYmxpc2hlcyBhIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgd2l0aCBvbmUgb3IgbW9y
ZSBsaW5lcwotICAgICAgICAvLyAyLiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGJvdHRvbSAocG9z
c2libHkgY29sbGFwc2VkKSBtYXJnaW4gb2YgaXRzIGxhc3QgaW4tZmxvdyBjaGlsZCwgaWYgdGhl
IGNoaWxkJ3MgYm90dG9tIG1hcmdpbgotICAgICAgICAvLyAgICBkb2VzIG5vdCBjb2xsYXBzZSB3
aXRoIHRoZSBlbGVtZW50J3MgYm90dG9tIG1hcmdpbgotICAgICAgICAvLyAzLiB0aGUgYm90dG9t
IGJvcmRlciBlZGdlIG9mIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgd2hvc2UgdG9wIG1hcmdpbiBk
b2Vzbid0IGNvbGxhcHNlIHdpdGggdGhlIGVsZW1lbnQncyBib3R0b20gbWFyZ2luCi0gICAgICAg
IC8vIDQuIHplcm8sIG90aGVyd2lzZQotICAgICAgICAvLyBPbmx5IGNoaWxkcmVuIGluIHRoZSBu
b3JtYWwgZmxvdyBhcmUgdGFrZW4gaW50byBhY2NvdW50IChpLmUuLCBmbG9hdGluZyBib3hlcyBh
bmQgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJveGVzIGFyZSBpZ25vcmVkLAotICAgICAgICAvLyBh
bmQgcmVsYXRpdmVseSBwb3NpdGlvbmVkIGJveGVzIGFyZSBjb25zaWRlcmVkIHdpdGhvdXQgdGhl
aXIgb2Zmc2V0KS4gTm90ZSB0aGF0IHRoZSBjaGlsZCBib3ggbWF5IGJlIGFuIGFub255bW91cyBi
bG9jayBib3guCi0KLSAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4
dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0gICAgICAgIGF1dG8gY29tcHV0ZWRWZXJ0
aWNhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCwg
aG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgYXV0byBub25Db2xsYXBzZWRNYXJnaW4g
PSBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB7IGNvbXB1dGVkVmVydGlj
YWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIu
dmFsdWVPcigwKSB9OyAKLSAgICAgICAgYXV0byBib3JkZXJBbmRQYWRkaW5nVG9wID0gYm94R2Vv
bWV0cnkuYm9yZGVyVG9wKCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKTsK
LSAgICAgICAgYXV0byBoZWlnaHQgPSBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVpZ2h0ID8g
b3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodC52YWx1ZSgpIDogY29tcHV0ZWRIZWlnaHQo
bGF5b3V0Qm94KTsKLQotICAgICAgICBpZiAoaGVpZ2h0KQotICAgICAgICAgICAgcmV0dXJuIHsg
KmhlaWdodCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0KLSAgICAgICAgaWYgKCFpczxDb250YWlu
ZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5o
YXNJbkZsb3dDaGlsZCgpKQotICAgICAgICAgICAgcmV0dXJuIHsgMCwgbm9uQ29sbGFwc2VkTWFy
Z2luIH07Ci0KLSAgICAgICAgLy8gMS4gdGhlIGJvdHRvbSBlZGdlIG9mIHRoZSBsYXN0IGxpbmUg
Ym94LCBpZiB0aGUgYm94IGVzdGFibGlzaGVzIGEgaW5saW5lIGZvcm1hdHRpbmcgY29udGV4dCB3
aXRoIG9uZSBvciBtb3JlIGxpbmVzCi0gICAgICAgIGF1dG8mIGxheW91dENvbnRhaW5lciA9IGRv
d25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKLSAgICAgICAgaWYgKGxheW91dENvbnRh
aW5lci5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpIHsKLSAgICAgICAgICAg
IGF1dG8mIGlubGluZUZvcm1hdHRpbmdTdGF0ZSA9IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRJ
bmxpbmVGb3JtYXR0aW5nU3RhdGUobGF5b3V0Q29udGFpbmVyKTsKLSAgICAgICAgICAgIGF1dG8m
IGxpbmVzID0gaW5saW5lRm9ybWF0dGluZ1N0YXRlLmxpbmVzKCk7Ci0gICAgICAgICAgICAvLyBF
dmVuIGVtcHR5IGNvbnRhaW5lcnMgZ2VuZXJhdGUgb25lIGxpbmUuIAotICAgICAgICAgICAgQVNT
RVJUKCFsaW5lcy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgcmV0dXJuIHsgdG9MYXlvdXRVbml0
KGxpbmVzLmxhc3QoKS5saW5lQm94TG9naWNhbFJlY3QoKS5ib3R0b20oKSArIGlubGluZUZvcm1h
dHRpbmdTdGF0ZS5jbGVhckdhcEFmdGVyTGFzdExpbmUoKSkgLSBib3JkZXJBbmRQYWRkaW5nVG9w
LCBub25Db2xsYXBzZWRNYXJnaW4gfTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDIuIHRoZSBi
b3R0b20gZWRnZSBvZiB0aGUgYm90dG9tIChwb3NzaWJseSBjb2xsYXBzZWQpIG1hcmdpbiBvZiBp
dHMgbGFzdCBpbi1mbG93IGNoaWxkLCBpZiB0aGUgY2hpbGQncyBib3R0b20gbWFyZ2luLi4uCi0g
ICAgICAgIGF1dG8mIGxhc3RJbkZsb3dDaGlsZCA9ICpsYXlvdXRDb250YWluZXIubGFzdEluRmxv
d0NoaWxkKCk7Ci0gICAgICAgIGlmICghZm9ybWF0dGluZ0NvbnRleHQoKS5tYXJnaW5Db2xsYXBz
ZSgpLm1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKGxhc3RJbkZsb3dD
aGlsZCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGxhc3RJbkZsb3dCb3hHZW9tZXRyeSA9IGZvcm1h
dHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGFzdEluRmxvd0NoaWxkKTsKLSAgICAgICAg
ICAgIGF1dG8gYm90dG9tRWRnZU9mQm90dG9tTWFyZ2luID0gQm94R2VvbWV0cnk6OmJvcmRlckJv
eFJlY3QobGFzdEluRmxvd0JveEdlb21ldHJ5KS5ib3R0b20oKSArIGxhc3RJbkZsb3dCb3hHZW9t
ZXRyeS5tYXJnaW5BZnRlcigpOwotICAgICAgICAgICAgcmV0dXJuIHsgYm90dG9tRWRnZU9mQm90
dG9tTWFyZ2luIC0gYm9yZGVyQW5kUGFkZGluZ1RvcCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0g
ICAgICAgIH0KLQotICAgICAgICAvLyAzLiB0aGUgYm90dG9tIGJvcmRlciBlZGdlIG9mIHRoZSBs
YXN0IGluLWZsb3cgY2hpbGQgd2hvc2UgdG9wIG1hcmdpbiBkb2Vzbid0IGNvbGxhcHNlIHdpdGgg
dGhlIGVsZW1lbnQncyBib3R0b20gbWFyZ2luCi0gICAgICAgIGF1dG8qIGluRmxvd0NoaWxkID0g
Jmxhc3RJbkZsb3dDaGlsZDsKLSAgICAgICAgd2hpbGUgKGluRmxvd0NoaWxkICYmIGZvcm1hdHRp
bmdDb250ZXh0KCkubWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFy
ZW50TWFyZ2luQWZ0ZXIoKmluRmxvd0NoaWxkKSkKLSAgICAgICAgICAgIGluRmxvd0NoaWxkID0g
aW5GbG93Q2hpbGQtPnByZXZpb3VzSW5GbG93U2libGluZygpOwotICAgICAgICBpZiAoaW5GbG93
Q2hpbGQpIHsKLSAgICAgICAgICAgIGF1dG8mIGluRmxvd0JveEdlb21ldHJ5ID0gZm9ybWF0dGlu
Z0NvbnRleHQoKS5nZW9tZXRyeUZvckJveCgqaW5GbG93Q2hpbGQpOwotICAgICAgICAgICAgcmV0
dXJuIHsgQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChpbkZsb3dCb3hHZW9tZXRyeSkgKyBpbkZs
b3dCb3hHZW9tZXRyeS5ib3JkZXJCb3goKS5oZWlnaHQoKSAtIGJvcmRlckFuZFBhZGRpbmdUb3As
IG5vbkNvbGxhcHNlZE1hcmdpbiB9OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gNC4gemVybywg
b3RoZXJ3aXNlCi0gICAgICAgIHJldHVybiB7IDAsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OwotICAg
IH07Ci0KLSAgICAvLyAxMC42LjcgJ0F1dG8nIGhlaWdodHMgZm9yIGJsb2NrLWxldmVsIGZvcm1h
dHRpbmcgY29udGV4dCBib3hlcy4KLSAgICBhdXRvIGlzQXV0b0hlaWdodCA9ICFvdmVycmlkZGVu
VmVydGljYWxWYWx1ZXMuaGVpZ2h0ICYmICFjb21wdXRlZEhlaWdodChsYXlvdXRCb3gpOwotICAg
IGlmIChpc0F1dG9IZWlnaHQgJiYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250
ZXh0KCkgJiYgIWxheW91dEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkp
KQotICAgICAgICByZXR1cm4gY29tcHV0ZSggT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzIHsgY29u
dGVudEhlaWdodEZvckZvcm1hdHRpbmdDb250ZXh0Um9vdChkb3duY2FzdDxDb250YWluZXJCb3g+
KGxheW91dEJveCkpIH0pOwotICAgIHJldHVybiBjb21wdXRlKG92ZXJyaWRkZW5WZXJ0aWNhbFZh
bHVlcyk7Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeTo6aW5GbG93Tm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3Qg
Qm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhv
cml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpKTsKLQot
ICAgIGF1dG8gY29tcHV0ZSA9IFsmXSgpIHsKLQotICAgICAgICAvLyAxMC4zLjMgQmxvY2stbGV2
ZWwsIG5vbi1yZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdwotICAgICAgICAvLwotICAg
ICAgICAvLyBUaGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIG11c3QgaG9sZCBhbW9uZyB0aGUgdXNl
ZCB2YWx1ZXMgb2YgdGhlIG90aGVyIHByb3BlcnRpZXM6Ci0gICAgICAgIC8vICdtYXJnaW4tbGVm
dCcgKyAnYm9yZGVyLWxlZnQtd2lkdGgnICsgJ3BhZGRpbmctbGVmdCcgKyAnd2lkdGgnICsgJ3Bh
ZGRpbmctcmlnaHQnICsgJ2JvcmRlci1yaWdodC13aWR0aCcgKyAnbWFyZ2luLXJpZ2h0JyA9IHdp
ZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKLSAgICAgICAgLy8KLSAgICAgICAgLy8gMS4gSWYgJ3dp
ZHRoJyBpcyBub3QgJ2F1dG8nIGFuZCAnYm9yZGVyLWxlZnQtd2lkdGgnICsgJ3BhZGRpbmctbGVm
dCcgKyAnd2lkdGgnICsgJ3BhZGRpbmctcmlnaHQnICsgJ2JvcmRlci1yaWdodC13aWR0aCcgCi0g
ICAgICAgIC8vICAgIChwbHVzIGFueSBvZiAnbWFyZ2luLWxlZnQnIG9yICdtYXJnaW4tcmlnaHQn
IHRoYXQgYXJlIG5vdCAnYXV0bycpIGlzIGxhcmdlciB0aGFuIHRoZSB3aWR0aCBvZiB0aGUgY29u
dGFpbmluZyBibG9jaywgdGhlbgotICAgICAgICAvLyAgICBhbnkgJ2F1dG8nIHZhbHVlcyBmb3Ig
J21hcmdpbi1sZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBhcmUsIGZvciB0aGUgZm9sbG93aW5nIHJ1
bGVzLCB0cmVhdGVkIGFzIHplcm8uCi0gICAgICAgIC8vCi0gICAgICAgIC8vIDIuIElmIGFsbCBv
ZiB0aGUgYWJvdmUgaGF2ZSBhIGNvbXB1dGVkIHZhbHVlIG90aGVyIHRoYW4gJ2F1dG8nLCB0aGUg
dmFsdWVzIGFyZSBzYWlkIHRvIGJlICJvdmVyLWNvbnN0cmFpbmVkIiBhbmQgb25lIG9mIHRoZSB1
c2VkIHZhbHVlcyB3aWxsCi0gICAgICAgIC8vICAgIGhhdmUgdG8gYmUgZGlmZmVyZW50IGZyb20g
aXRzIGNvbXB1dGVkIHZhbHVlLiBJZiB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGNv
bnRhaW5pbmcgYmxvY2sgaGFzIHRoZSB2YWx1ZSAnbHRyJywgdGhlIHNwZWNpZmllZCB2YWx1ZQot
ICAgICAgICAvLyAgICBvZiAnbWFyZ2luLXJpZ2h0JyBpcyBpZ25vcmVkIGFuZCB0aGUgdmFsdWUg
aXMgY2FsY3VsYXRlZCBzbyBhcyB0byBtYWtlIHRoZSBlcXVhbGl0eSB0cnVlLiBJZiB0aGUgdmFs
dWUgb2YgJ2RpcmVjdGlvbicgaXMgJ3J0bCcsCi0gICAgICAgIC8vICAgIHRoaXMgaGFwcGVucyB0
byAnbWFyZ2luLWxlZnQnIGluc3RlYWQuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIDMuIElmIHRo
ZXJlIGlzIGV4YWN0bHkgb25lIHZhbHVlIHNwZWNpZmllZCBhcyAnYXV0bycsIGl0cyB1c2VkIHZh
bHVlIGZvbGxvd3MgZnJvbSB0aGUgZXF1YWxpdHkuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIDQu
IElmICd3aWR0aCcgaXMgc2V0IHRvICdhdXRvJywgYW55IG90aGVyICdhdXRvJyB2YWx1ZXMgYmVj
b21lICcwJyBhbmQgJ3dpZHRoJyBmb2xsb3dzIGZyb20gdGhlIHJlc3VsdGluZyBlcXVhbGl0eS4K
LSAgICAgICAgLy8KLSAgICAgICAgLy8gNS4gSWYgYm90aCAnbWFyZ2luLWxlZnQnIGFuZCAnbWFy
Z2luLXJpZ2h0JyBhcmUgJ2F1dG8nLCB0aGVpciB1c2VkIHZhbHVlcyBhcmUgZXF1YWwuIFRoaXMg
aG9yaXpvbnRhbGx5IGNlbnRlcnMgdGhlIGVsZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoZQotICAg
ICAgICAvLyAgICBlZGdlcyBvZiB0aGUgY29udGFpbmluZyBibG9jay4KLQotICAgICAgICBhdXRv
IGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0
aDsKLSAgICAgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrU3R5bGUgPSBsYXlvdXRCb3guY29udGFp
bmluZ0Jsb2NrKCkuc3R5bGUoKTsKLSAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0
aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0KLSAgICAgICAgYXV0byB3
aWR0aCA9IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoID8gb3ZlcnJpZGRlbkhvcml6
b250YWxWYWx1ZXMud2lkdGggOiBjb21wdXRlZFdpZHRoKGxheW91dEJveCwgY29udGFpbmluZ0Js
b2NrV2lkdGgpOwotICAgICAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21l
dHJ5Ojpjb21wdXRlZEhvcml6b250YWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3Ry
YWludHMpOwotICAgICAgICBVc2VkSG9yaXpvbnRhbE1hcmdpbiB1c2VkSG9yaXpvbnRhbE1hcmdp
bjsKLSAgICAgICAgYXV0byBib3JkZXJMZWZ0ID0gYm94R2VvbWV0cnkuYm9yZGVyTGVmdCgpOwot
ICAgICAgICBhdXRvIGJvcmRlclJpZ2h0ID0gYm94R2VvbWV0cnkuYm9yZGVyUmlnaHQoKTsKLSAg
ICAgICAgYXV0byBwYWRkaW5nTGVmdCA9IGJveEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCkudmFsdWVP
cigwKTsKLSAgICAgICAgYXV0byBwYWRkaW5nUmlnaHQgPSBib3hHZW9tZXRyeS5wYWRkaW5nUmln
aHQoKS52YWx1ZU9yKDApOwotCi0gICAgICAgIC8vICMxCi0gICAgICAgIGlmICh3aWR0aCkgewot
ICAgICAgICAgICAgYXV0byBob3Jpem9udGFsU3BhY2VGb3JNYXJnaW4gPSBjb250YWluaW5nQmxv
Y2tXaWR0aCAtIChjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSArIGJv
cmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJp
Z2h0ICsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApKTsKLSAgICAgICAg
ICAgIGlmIChob3Jpem9udGFsU3BhY2VGb3JNYXJnaW4gPCAwKQotICAgICAgICAgICAgICAgIHVz
ZWRIb3Jpem9udGFsTWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFs
dWVPcigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07Ci0gICAg
ICAgIH0KLQotICAgICAgICAvLyAjMgotICAgICAgICBpZiAod2lkdGggJiYgY29tcHV0ZWRIb3Jp
em9udGFsTWFyZ2luLnN0YXJ0ICYmIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKLSAg
ICAgICAgICAgIGlmIChjb250YWluaW5nQmxvY2tTdHlsZS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
KCkpIHsKLSAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9ICpjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQ7Ci0gICAgICAgICAgICAgICAgdXNlZEhvcml6b250
YWxNYXJnaW4uZW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJn
aW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmln
aHQgKyBib3JkZXJSaWdodCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAg
IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5k
OwotICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gY29udGFpbmlu
Z0Jsb2NrV2lkdGggLSAoYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGlu
Z1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIzMKLSAgICAgICAgaWYgKCFjb21wdXRl
ZEhvcml6b250YWxNYXJnaW4uc3RhcnQgJiYgd2lkdGggJiYgY29tcHV0ZWRIb3Jpem9udGFsTWFy
Z2luLmVuZCkgewotICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gKmNvbXB1
dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQ7Ci0gICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdp
bi5zdGFydCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKGJvcmRlckxlZnQgKyBwYWRkaW5nTGVm
dCAgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFs
TWFyZ2luLmVuZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LnN0YXJ0ICYmICF3aWR0aCAmJiBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7Ci0gICAg
ICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdp
bi5zdGFydCwgKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQgfTsKLSAgICAgICAgICAgIHdp
ZHRoID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQg
KyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCAr
IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29tcHV0ZWRI
b3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmIHdpZHRoICYmICFjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uZW5kKSB7Ci0gICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9ICpjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQ7Ci0gICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1h
cmdpbi5lbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5z
dGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCAr
IGJvcmRlclJpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vICM0Ci0gICAgICAgIGlmICgh
d2lkdGgpIHsKLSAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyBjb21wdXRlZEhv
cml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LmVuZC52YWx1ZU9yKDApIH07Ci0gICAgICAgICAgICB3aWR0aCA9IGNvbnRhaW5pbmdCbG9ja1dp
ZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdM
ZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5l
bmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIzUKLSAgICAgICAgaWYgKCFjb21wdXRlZEhv
cml6b250YWxNYXJnaW4uc3RhcnQgJiYgIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsK
LSAgICAgICAgICAgIGF1dG8gaG9yaXpvbnRhbFNwYWNlRm9yTWFyZ2luID0gY29udGFpbmluZ0Js
b2NrV2lkdGggLSAoYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICArICp3aWR0aCArIHBhZGRpbmdS
aWdodCArIGJvcmRlclJpZ2h0KTsKLSAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luID0g
eyBob3Jpem9udGFsU3BhY2VGb3JNYXJnaW4gLyAyLCBob3Jpem9udGFsU3BhY2VGb3JNYXJnaW4g
LyAyIH07Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIHNob3VsZEFwcGx5Q2VudGVyQWxpZ25G
b3JCbG9ja0NvbnRlbnQgPSBjb250YWluaW5nQmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBUZXh0
QWxpZ25Nb2RlOjpXZWJLaXRDZW50ZXIgJiYgKGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFy
dCB8fCBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKTsKLSAgICAgICAgaWYgKHNob3VsZEFw
cGx5Q2VudGVyQWxpZ25Gb3JCbG9ja0NvbnRlbnQpIHsKLSAgICAgICAgICAgIGF1dG8gYm9yZGVy
Qm94V2lkdGggPSAoYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICArICp3aWR0aCArIHBhZGRpbmdS
aWdodCArIGJvcmRlclJpZ2h0KTsKLSAgICAgICAgICAgIGF1dG8gbWFyZ2luU3RhcnQgPSBjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKTsKLSAgICAgICAgICAgIGF1dG8g
bWFyZ2luRW5kID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApOwotICAg
ICAgICAgICAgYXV0byBjZW50ZXJlZExvZ2ljYWxMZWZ0Rm9yTWFyZ2luQm94ID0gc3RkOjptYXgo
KGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gYm9yZGVyQm94V2lkdGggLSBtYXJnaW5TdGFydCAtIG1h
cmdpbkVuZCkgLyAyLCAwX2x1KTsKLSAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0
YXJ0ID0gY2VudGVyZWRMb2dpY2FsTGVmdEZvck1hcmdpbkJveCArIG1hcmdpblN0YXJ0OwotICAg
ICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGgg
LSBib3JkZXJCb3hXaWR0aCAtIG1hcmdpblN0YXJ0ICsgbWFyZ2luRW5kOwotICAgICAgICB9Ci0g
ICAgICAgIEFTU0VSVCh3aWR0aCk7Ci0KLSAgICAgICAgcmV0dXJuIENvbnRlbnRXaWR0aEFuZE1h
cmdpbiB7ICp3aWR0aCwgdXNlZEhvcml6b250YWxNYXJnaW4gfTsKLSAgICB9OwotCi0gICAgYXV0
byBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBjb21wdXRlKCk7Ci0gICAgTE9HX1dJVEhfU1RSRUFN
KEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltXaWR0aF1bTWFyZ2luXSAtPiBp
bmZsb3cgbm9uLXJlcGxhY2VkIC0+IHdpZHRoKCIgPDwgY29udGVudFdpZHRoQW5kTWFyZ2luLmNv
bnRlbnRXaWR0aCA8PCAicHgpIG1hcmdpbigiIDw8IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2Vk
TWFyZ2luLnN0YXJ0IDw8ICJweCwgIiA8PCBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdp
bi5lbmQgPDwgInB4KSAtPiBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7Ci0gICAg
cmV0dXJuIGNvbnRlbnRXaWR0aEFuZE1hcmdpbjsKLX0KLQotQ29udGVudFdpZHRoQW5kTWFyZ2lu
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbkZsb3dSZXBsYWNlZENvbnRlbnRX
aWR0aEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVu
SG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNT
RVJUKHJlcGxhY2VkQm94LmlzSW5GbG93KCkpOwotCi0gICAgLy8gMTAuMy40IEJsb2NrLWxldmVs
LCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdwotICAgIC8vCi0gICAgLy8gMS4gVGhl
IHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBpcyBkZXRlcm1pbmVkIGFzIGZvciBpbmxpbmUgcmVwbGFj
ZWQgZWxlbWVudHMuCi0gICAgLy8gMi4gVGhlbiB0aGUgcnVsZXMgZm9yIG5vbi1yZXBsYWNlZCBi
bG9jay1sZXZlbCBlbGVtZW50cyBhcmUgYXBwbGllZCB0byBkZXRlcm1pbmUgdGhlIG1hcmdpbnMu
Ci0KLSAgICAvLyAjMQotICAgIGF1dG8gdXNlZFdpZHRoID0gaW5saW5lUmVwbGFjZWRDb250ZW50
V2lkdGhBbmRNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBv
dmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykuY29udGVudFdpZHRoOwotICAgIC8vICMyCi0gICAg
YXV0byBub25SZXBsYWNlZFdpZHRoQW5kTWFyZ2luID0gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50
V2lkdGhBbmRNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgT3ZlcnJp
ZGRlbkhvcml6b250YWxWYWx1ZXMgeyB1c2VkV2lkdGgsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFs
dWVzLm1hcmdpbiB9KTsKLQotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExh
eW91dCwgc3RyZWFtIDw8ICJbV2lkdGhdW01hcmdpbl0gLT4gaW5mbG93IHJlcGxhY2VkIC0+IHdp
ZHRoKCIgPDwgdXNlZFdpZHRoICA8PCAicHgpIG1hcmdpbigiIDw8IG5vblJlcGxhY2VkV2lkdGhB
bmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCA8PCAicHgsICIgPDwgbm9uUmVwbGFjZWRXaWR0aEFu
ZE1hcmdpbi51c2VkTWFyZ2luLmVuZCA8PCAicHgpIC0+IGxheW91dEJveCgiIDw8ICZyZXBsYWNl
ZEJveCA8PCAiKSIpOwotICAgIHJldHVybiB7IHVzZWRXaWR0aCwgbm9uUmVwbGFjZWRXaWR0aEFu
ZE1hcmdpbi51c2VkTWFyZ2luIH07Ci19Ci0KLUxheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6OnN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRC
b3gsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpIGNvbnN0
Ci17Ci0gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIyL3Zpc3VyZW4uaHRtbCNibG9j
ay1mb3JtYXR0aW5nCi0gICAgLy8gSW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGJveGVz
IGFyZSBsYWlkIG91dCBvbmUgYWZ0ZXIgdGhlIG90aGVyLCB2ZXJ0aWNhbGx5LCBiZWdpbm5pbmcg
YXQgdGhlIHRvcCBvZiBhIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgLy8gVGhlIHZlcnRpY2FsIGRp
c3RhbmNlIGJldHdlZW4gdHdvIHNpYmxpbmcgYm94ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgJ21h
cmdpbicgcHJvcGVydGllcy4KLSAgICAvLyBWZXJ0aWNhbCBtYXJnaW5zIGJldHdlZW4gYWRqYWNl
bnQgYmxvY2stbGV2ZWwgYm94ZXMgaW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgY29sbGFw
c2UuCi0gICAgaWYgKGF1dG8qIHByZXZpb3VzSW5GbG93U2libGluZyA9IGxheW91dEJveC5wcmV2
aW91c0luRmxvd1NpYmxpbmcoKSkgewotICAgICAgICBhdXRvJiBwcmV2aW91c0luRmxvd0JveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveCgqcHJldmlvdXNJbkZs
b3dTaWJsaW5nKTsKLSAgICAgICAgcmV0dXJuIEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KHBy
ZXZpb3VzSW5GbG93Qm94R2VvbWV0cnkpLmJvdHRvbSgpICsgcHJldmlvdXNJbkZsb3dCb3hHZW9t
ZXRyeS5tYXJnaW5BZnRlcigpOwotICAgIH0KLSAgICByZXR1cm4gdmVydGljYWxDb25zdHJhaW50
cy5sb2dpY2FsVG9wOwotfQotCi1MYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5OjpzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNv
bnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSBjb25zdAot
ewotICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi92aXN1cmVuLmh0bWwjYmxvY2st
Zm9ybWF0dGluZwotICAgIC8vIEluIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0LCBlYWNoIGJv
eCdzIGxlZnQgb3V0ZXIgZWRnZSB0b3VjaGVzIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNvbnRhaW5p
bmcgYmxvY2sgKGZvciByaWdodC10by1sZWZ0IGZvcm1hdHRpbmcsIHJpZ2h0IGVkZ2VzIHRvdWNo
KS4KLSAgICByZXR1cm4gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxMZWZ0ICsgZm9ybWF0
dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpLm1hcmdpblN0YXJ0KCk7Ci19
Ci0KLVBvaW50IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNQb3NpdGlv
bihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jp
em9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29u
c3RyYWludHMpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHsgc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9u
KGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSwgc3RhdGljVmVydGljYWxQb3NpdGlv
bihsYXlvdXRCb3gsIHZlcnRpY2FsQ29uc3RyYWludHMpIH07Ci19Ci0KLUNvbnRlbnRIZWlnaHRB
bmRNYXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd0NvbnRlbnRI
ZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxW
YWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94
LmlzSW5GbG93KCkpOwotCi0gICAgLy8gMTAuNi4yIElubGluZSByZXBsYWNlZCBlbGVtZW50cywg
YmxvY2stbGV2ZWwgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3csICdpbmxpbmUtYmxv
Y2snCi0gICAgLy8gcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZsb2F0aW5n
IHJlcGxhY2VkIGVsZW1lbnRzCi0gICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0g
ICAgICAgIHJldHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oZG93bmNh
c3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBv
dmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwotCi0gICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBj
b250ZW50SGVpZ2h0QW5kTWFyZ2luOwotICAgIGlmIChsYXlvdXRCb3guaXNPdmVyZmxvd1Zpc2li
bGUoKSAmJiAhbGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSkgewotICAgICAgICAvLyBUT0RPOiBG
aWd1cmUgb3V0IHRoZSBjYXNlIGZvciB0aGUgZG9jdW1lbnQgZWxlbWVudC4gTGV0J3MganVzdCBj
b21wbGljYXRlZC1jYXNlIGl0IGZvciBub3cuCi0gICAgICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJn
aW4gPSBpbkZsb3dOb25SZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4obGF5b3V0Qm94LCBo
b3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgLy8gMTAuNi42IENvbXBsaWNhdGVkIGNhc2VzCi0gICAgICAgIC8vIEJs
b2NrLWxldmVsLCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgd2hlbiAnb3Zl
cmZsb3cnIGRvZXMgbm90IGNvbXB1dGUgdG8gJ3Zpc2libGUnIChleGNlcHQgaWYgdGhlICdvdmVy
ZmxvdycgcHJvcGVydHkncyB2YWx1ZSBoYXMgYmVlbiBwcm9wYWdhdGVkIHRvIHRoZSB2aWV3cG9y
dCkuCi0gICAgICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gPSBjb21wbGljYXRlZENhc2VzKGxh
eW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMp
OwotICAgIH0KLQotICAgIGF1dG8gcXVpcmtzID0gZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3Mo
KTsKLSAgICBpZiAoIXF1aXJrcy5uZWVkc1N0cmV0Y2hpbmcobGF5b3V0Qm94KSkKLSAgICAgICAg
cmV0dXJuIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW47Ci0KLSAgICBjb250ZW50SGVpZ2h0QW5kTWFy
Z2luLmNvbnRlbnRIZWlnaHQgPSBxdWlya3Muc3RyZXRjaGVkSW5GbG93SGVpZ2h0KGxheW91dEJv
eCwgY29udGVudEhlaWdodEFuZE1hcmdpbik7Ci0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0
dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW0hlaWdodF1bTWFyZ2luXSAtPiBpbmZsb3cg
bm9uLXJlcGxhY2VkIC0+IHN0cmVjaGVkIHRvIHZpZXdwb3J0IC0+IGhlaWdodCgiIDw8IGNvbnRl
bnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCA8PCAicHgpIG1hcmdpbigiIDw8IGNvbnRl
bnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSA8PCAicHgsICIgPDwg
Y29udGVudEhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIgPDwgInB4KSAt
PiBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIGNvbnRlbnRI
ZWlnaHRBbmRNYXJnaW47Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93Q29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJv
eCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25z
dHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7Ci0KLSAg
ICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0gICAgICAgIHJldHVybiBpbkZsb3dO
b25SZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOwotICAgIHJldHVybiBpbkZsb3dS
ZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0
Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyk7
Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeTo6Y29tcHV0ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBPcHRp
b25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVXaWR0aEZsb2F0QXZvaWRlcikKLXsKLSAgICBhdXRv
IGNvbXB1dGUgPSBbJl0gKGF1dG8gY29uc3RyYWludHNGb3JXaWR0aCwgT3B0aW9uYWw8TGF5b3V0
VW5pdD4gdXNlZFdpZHRoKSB7Ci0gICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0
aW9uZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBmbG9hdGluZ0NvbnRlbnRXaWR0aEFuZE1hcmdp
bihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzRm9yV2lkdGgsIHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0K
LSAgICAgICAgaWYgKGxheW91dEJveC5pc0luRmxvdygpKQotICAgICAgICAgICAgcmV0dXJuIGlu
Rmxvd0NvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzRm9yV2lkdGgs
IHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0g
ICAgICAgIHJldHVybiBDb250ZW50V2lkdGhBbmRNYXJnaW4geyB9OwotICAgIH07Ci0KLSAgICBh
dXRvIGhvcml6b250YWxDb25zdHJhaW50c0ZvcldpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRz
OwotICAgIGlmIChsYXlvdXRCb3guc3R5bGUoKS5sb2dpY2FsV2lkdGgoKS5pc0F1dG8oKSAmJiBh
dmFpbGFibGVXaWR0aEZsb2F0QXZvaWRlcikgewotICAgICAgICAvLyBXaGlsZSB0aGUgbm9uLWF1
dG8gd2lkdGggdmFsdWVzIHNob3VsZCBhbGwgYmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgY29udGFp
bmluZyBibG9jaydzIHdpZHRoLCB3aGVuCi0gICAgICAgIC8vIHRoZSB3aWR0aCBpcyBhdXRvIHRo
ZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFjZSBpcyBzaHJ1bmsgYnkgbmVpZ2hib3JpbmcgZmxv
YXRzLgotICAgICAgICBob3Jpem9udGFsQ29uc3RyYWludHNGb3JXaWR0aC5sb2dpY2FsV2lkdGgg
PSAqYXZhaWxhYmxlV2lkdGhGbG9hdEF2b2lkZXI7Ci0gICAgfQotICAgIGF1dG8gY29udGVudFdp
ZHRoQW5kTWFyZ2luID0gY29tcHV0ZShob3Jpem9udGFsQ29uc3RyYWludHNGb3JXaWR0aCwgeyB9
KTsKLSAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2lj
YWxXaWR0aDsKLSAgICBpZiAoYXV0byBtYXhXaWR0aCA9IGNvbXB1dGVkTWF4V2lkdGgobGF5b3V0
Qm94LCBhdmFpbGFibGVXaWR0aCkpIHsKLSAgICAgICAgYXV0byBtYXhXaWR0aEFuZE1hcmdpbiA9
IGNvbXB1dGUoaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBtYXhXaWR0aCk7Ci0gICAgICAgIGlmIChj
b250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoID4gbWF4V2lkdGhBbmRNYXJnaW4uY29u
dGVudFdpZHRoKQotICAgICAgICAgICAgY29udGVudFdpZHRoQW5kTWFyZ2luID0gbWF4V2lkdGhB
bmRNYXJnaW47Ci0gICAgfQotCi0gICAgYXV0byBtaW5XaWR0aCA9IGNvbXB1dGVkTWluV2lkdGgo
bGF5b3V0Qm94LCBhdmFpbGFibGVXaWR0aCkudmFsdWVPcigwKTsKLSAgICBhdXRvIG1pbldpZHRo
QW5kTWFyZ2luID0gY29tcHV0ZShob3Jpem9udGFsQ29uc3RyYWludHMsIG1pbldpZHRoKTsKLSAg
ICBpZiAoY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA8IG1pbldpZHRoQW5kTWFy
Z2luLmNvbnRlbnRXaWR0aCkKLSAgICAgICAgY29udGVudFdpZHRoQW5kTWFyZ2luID0gbWluV2lk
dGhBbmRNYXJnaW47Ci0gICAgcmV0dXJuIGNvbnRlbnRXaWR0aEFuZE1hcmdpbjsKLX0KLQotRm9y
bWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgQmxvY2tGb3JtYXR0aW5n
Q29udGV4dDo6R2VvbWV0cnk6OmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3QgQm94JiBs
YXlvdXRCb3gpCi17Ci0gICAgYXV0byBmaXhlZE1hcmdpbkJvcmRlckFuZFBhZGRpbmcgPSBbJl0o
YXV0byYgbGF5b3V0Qm94KSB7Ci0gICAgICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxl
KCk7Ci0gICAgICAgIHJldHVybiBmaXhlZFZhbHVlKHN0eWxlLm1hcmdpblN0YXJ0KCkpLnZhbHVl
T3IoMCkKLSAgICAgICAgICAgICsgTGF5b3V0VW5pdCB7IHN0eWxlLmJvcmRlckxlZnRXaWR0aCgp
IH0KLSAgICAgICAgICAgICsgZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nTGVmdCgpKS52YWx1ZU9y
KDApCi0gICAgICAgICAgICArIGZpeGVkVmFsdWUoc3R5bGUucGFkZGluZ1JpZ2h0KCkpLnZhbHVl
T3IoMCkKLSAgICAgICAgICAgICsgTGF5b3V0VW5pdCB7IHN0eWxlLmJvcmRlclJpZ2h0V2lkdGgo
KSB9Ci0gICAgICAgICAgICArIGZpeGVkVmFsdWUoc3R5bGUubWFyZ2luRW5kKCkpLnZhbHVlT3Io
MCk7Ci0gICAgfTsKLQotICAgIGF1dG8gY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
ID0gWyZdKCkgLT4gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7Ci0gICAgICAgIGF1dG8gbG9n
aWNhbFdpZHRoID0gbGF5b3V0Qm94LnN0eWxlKCkubG9naWNhbFdpZHRoKCk7Ci0gICAgICAgIC8v
IE1pbmltdW0vbWF4aW11bSB3aWR0aCBjYW4ndCBiZSBkZXBlbmRpbmcgb24gdGhlIGNvbnRhaW5p
bmcgYmxvY2sncyB3aWR0aC4KLSAgICAgICAgYXV0byBuZWVkc1Jlc29sdmVkQ29udGFpbmluZ0Js
b2NrV2lkdGggPSBsb2dpY2FsV2lkdGguaXNDYWxjdWxhdGVkKCkgfHwgbG9naWNhbFdpZHRoLmlz
UGVyY2VudCgpIHx8IGxvZ2ljYWxXaWR0aC5pc1JlbGF0aXZlKCk7Ci0gICAgICAgIGlmIChuZWVk
c1Jlc29sdmVkQ29udGFpbmluZ0Jsb2NrV2lkdGgpCi0gICAgICAgICAgICByZXR1cm4geyB9Owot
Ci0gICAgICAgIGlmIChhdXRvIHdpZHRoID0gZml4ZWRWYWx1ZShsb2dpY2FsV2lkdGgpKQotICAg
ICAgICAgICAgcmV0dXJuIHsgKndpZHRoLCAqd2lkdGggfTsKLQotICAgICAgICBpZiAobGF5b3V0
Qm94LmlzUmVwbGFjZWRCb3goKSkgewotICAgICAgICAgICAgYXV0byYgcmVwbGFjZWRCb3ggPSBk
b3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KTsKLSAgICAgICAgICAgIGlmIChyZXBsYWNl
ZEJveC5oYXNJbnRyaW5zaWNXaWR0aCgpKSB7Ci0gICAgICAgICAgICAgICAgYXV0byByZXBsYWNl
ZFdpZHRoID0gcmVwbGFjZWRCb3guaW50cmluc2ljV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4geyByZXBsYWNlZFdpZHRoLCByZXBsYWNlZFdpZHRoIH07Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpczxDb250
YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94
KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0K
LSAgICAgICAgaWYgKGxheW91dEJveC5pc1NpemVDb250YWlubWVudEJveCgpKSB7Ci0gICAgICAg
ICAgICAvLyBUaGUgaW50cmluc2ljIHNpemVzIG9mIHRoZSBzaXplIGNvbnRhaW5tZW50IGJveCBh
cmUgZGV0ZXJtaW5lZCBhcyBpZiB0aGUgZWxlbWVudCBoYWQgbm8gY29udGVudCwKLSAgICAgICAg
ICAgIC8vIGZvbGxvd2luZyB0aGUgc2FtZSBsb2dpYyBhcyB3aGVuIHNpemluZyBhcyBpZiBlbXB0
eS4KLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGF5
b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSkgewotICAgICAgICAgICAgYXV0
byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0
dGluZ0NvbnRleHQoZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLCBsYXlvdXRTdGF0
ZSgpKS0+Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgICAgICBp
ZiAobG9naWNhbFdpZHRoLmlzTWluQ29udGVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiB7
IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgaW50cmluc2ljV2lkdGhDb25zdHJh
aW50cy5taW5pbXVtIH07Ci0gICAgICAgICAgICBpZiAobG9naWNhbFdpZHRoLmlzTWF4Q29udGVu
dCgpKQotICAgICAgICAgICAgICAgIHJldHVybiB7IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMu
bWF4aW11bSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtIH07Ci0gICAgICAgICAg
ICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKLSAgICAgICAgfQotCi0gICAgICAg
IGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IEludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMgeyB9OwotICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSBsYXlvdXRTdGF0ZSgpLmZv
cm1hdHRpbmdTdGF0ZUZvckJveChsYXlvdXRCb3gpOwotICAgICAgICBmb3IgKGF1dG8mIGNoaWxk
IDogY2hpbGRyZW5PZlR5cGU8Qm94Pihkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkp
KSB7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgfHwgKGNo
aWxkLmlzRmxvYXRBdm9pZGVyKCkgJiYgIWNoaWxkLmhhc0Zsb2F0Q2xlYXIoKSkpCi0gICAgICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBhdXRvIGNoaWxkSW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9y
Qm94KGNoaWxkKTsKLSAgICAgICAgICAgIEFTU0VSVChjaGlsZEludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMpOwotCi0gICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0g
PSBzdGQ6Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0sIGNoaWxkSW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cy0+bWluaW11bSk7Ci0gICAgICAgICAgICBpbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzLm1heGltdW0gPSBzdGQ6Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
Lm1heGltdW0sIGNoaWxkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cy0+bWF4aW11bSk7Ci0gICAg
ICAgIH0KLSAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Ci0gICAgfTsK
LSAgICAvLyBGSVhNRSBDaGVjayBmb3IgYm94LXNpemluZzogYm9yZGVyLWJveDsKLSAgICBhdXRv
IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBjb25zdHJhaW5CeU1pbk1heFdpZHRoKGxheW91
dEJveCwgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkpOwotICAgIGludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMuZXhwYW5kKGZpeGVkTWFyZ2luQm9yZGVyQW5kUGFkZGluZyhsYXlv
dXRCb3gpKTsKLSAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKLX0KLQotfQot
fQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1h
dHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIwODg0MjAzZGM4NmE2NzM2YWJjOGViZGFm
MmE1ZWYxZDU4NmFlLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5n
Q29udGV4dFF1aXJrcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
Ci0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgot
ICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1
ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5j
bHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3gu
aCIKLSNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCi0jaW5jbHVkZSAi
TGF5b3V0U3RhdGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7
Ci0KLXN0YXRpYyBib29sIGlzUXVpcmtDb250YWluZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17
Ci0gICAgcmV0dXJuIGxheW91dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVu
dEJveCgpIHx8IGxheW91dEJveC5pc1RhYmxlQ2VsbCgpOwotfQotCi1ib29sIEJsb2NrRm9ybWF0
dGluZ0NvbnRleHQ6OlF1aXJrczo6bmVlZHNTdHJldGNoaW5nKGNvbnN0IEJveCYgbGF5b3V0Qm94
KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7Ci0gICAgLy8gSW4g
cXVpcmtzIG1vZGUsIGluLWZsb3cgYm9keSBhbmQgaHRtbCBzdHJldGNoIHRvIHRoZSBpbml0aWFs
IGNvbnRhaW5pbmcgYmxvY2sgKGhlaWdodDogYXV0byBvbmx5KS4KLSAgICBpZiAoIWxheW91dFN0
YXRlKCkuaW5RdWlya3NNb2RlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICgh
bGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSAmJiAhbGF5b3V0Qm94LmlzQm9keUJveCgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gbGF5b3V0Qm94LnN0eWxlKCkubG9naWNh
bEhlaWdodCgpLmlzQXV0bygpOwotfQotCi1MYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6OlF1aXJrczo6c3RyZXRjaGVkSW5GbG93SGVpZ2h0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBD
b250ZW50SGVpZ2h0QW5kTWFyZ2luIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4pCi17Ci0gICAgQVNT
RVJUKG5lZWRzU3RyZXRjaGluZyhsYXlvdXRCb3gpKTsKLSAgICBhdXRvJiBmb3JtYXR0aW5nQ29u
dGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7Ci0gICAgYXV0byBub25Db2xsYXBzZWRW
ZXJ0aWNhbE1hcmdpbiA9IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2lu
LmJlZm9yZSArIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmFmdGVy
OwotCi0gICAgaWYgKGxheW91dEJveC5pc0RvY3VtZW50Qm94KCkpIHsKLSAgICAgICAgLy8gTGV0
J3Mgc3RyZXRjaCB0aGUgaW5mbG93IGRvY3VtZW50IGJveCg8aHRtbD4pIHRvIHRoZSBoZWlnaHQg
b2YgdGhlIGluaXRpYWwgY29udGFpbmluZyBibG9jayAodmlldykuCi0gICAgICAgIGF1dG8gZG9j
dW1lbnRCb3hDb250ZW50SGVpZ2h0ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3go
bGF5b3V0Qm94LmluaXRpYWxDb250YWluaW5nQmxvY2soKSwgRXNjYXBlUmVhc29uOjpEb2N1bWVu
dEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaykuY29udGVudEJveEhlaWdodCgpOwotICAgICAg
ICAvLyBEb2N1bWVudCBib3gncyBvd24gdmVydGljYWwgbWFyZ2luL2JvcmRlci9wYWRkaW5nIHZh
bHVlcyBhbHdheXMgc2hyaW5rIHRoZSBjb250ZW50IGhlaWdodC4KLSAgICAgICAgYXV0byYgZG9j
dW1lbnRCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91
dEJveCk7Ci0gICAgICAgIGRvY3VtZW50Qm94Q29udGVudEhlaWdodCAtPSBub25Db2xsYXBzZWRW
ZXJ0aWNhbE1hcmdpbiArIGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRv
Y3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKLSAgICAgICAg
cmV0dXJuIHN0ZDo6bWF4KGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCwgIGRv
Y3VtZW50Qm94Q29udGVudEhlaWdodCk7Ci0gICAgfQotCi0gICAgLy8gSGVyZSBpcyB0aGUgcXVp
cmt5IHBhcnQgZm9yIGJvZHkgYm94IHdoZW4gaXQgc3RyZXRjaGVzIGFsbCB0aGUgd2F5IHRvIHRo
ZSBJQ0IgZXZlbiB3aGVuIHRoZSBkb2N1bWVudCBib3ggZG9lcyBub3QgKGUuZy4gb3V0LW9mLWZs
b3cgcG9zaXRpb25lZCkuCi0gICAgQVNTRVJUKGxheW91dEJveC5pc0JvZHlCb3goKSk7Ci0gICAg
YXV0byYgaW5pdGlhbENvbnRhaW5pbmdCbG9jayA9IGxheW91dEJveC5pbml0aWFsQ29udGFpbmlu
Z0Jsb2NrKCk7Ci0gICAgYXV0byYgaW5pdGlhbENvbnRhaW5pbmdCbG9ja0dlb21ldHJ5ID0gZm9y
bWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goaW5pdGlhbENvbnRhaW5pbmdCbG9jaywgRXNj
YXBlUmVhc29uOjpCb2R5U3RyZXRjaGVzVG9WaWV3cG9ydFF1aXJrKTsKLSAgICAvLyBTdGFydCB0
aGUgY29udGVudCBoZWlnaHQgd2l0aCB0aGUgSUNCLgotICAgIGF1dG8gYm9keUJveENvbnRlbnRI
ZWlnaHQgPSBpbml0aWFsQ29udGFpbmluZ0Jsb2NrR2VvbWV0cnkuY29udGVudEJveEhlaWdodCgp
OwotICAgIC8vIEJvZHkgYm94J3Mgb3duIGJvcmRlciBhbmQgcGFkZGluZyBzaHJpbmsgdGhlIGNv
bnRlbnQgaGVpZ2h0LgotICAgIGF1dG8mIGJvZHlCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250
ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0gICAgYm9keUJveENvbnRlbnRIZWlnaHQg
LT0gYm9keUJveEdlb21ldHJ5LnZlcnRpY2FsQm9yZGVyKCkgKyBib2R5Qm94R2VvbWV0cnkudmVy
dGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKLSAgICAvLyBCb2R5IGJveCBuZXZlciBjb2xsYXBz
ZXMgaXRzIHZlcnRpY2FsIG1hcmdpbnMgd2l0aCB0aGUgZG9jdW1lbnQgYm94IGJ1dCBpdCBtaWdo
dCBjb2xsYXBzZSBpdHMgbWFyZ2luIHdpdGggaXRzIGRlc2NlbmRhbnRzLgotICAgIGF1dG8gbm9u
Q29sbGFwc2VkTWFyZ2luID0gY29udGVudEhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJn
aW47Ci0gICAgYXV0byBjb2xsYXBzZWRNYXJnaW4gPSBmb3JtYXR0aW5nQ29udGV4dC5tYXJnaW5D
b2xsYXBzZSgpLmNvbGxhcHNlZFZlcnRpY2FsVmFsdWVzKGxheW91dEJveCwgbm9uQ29sbGFwc2Vk
TWFyZ2luKS5jb2xsYXBzZWRWYWx1ZXM7Ci0gICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBj
b2xsYXBzZWRNYXJnaW4uYmVmb3JlLnZhbHVlT3Iobm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSk7
Ci0gICAgdXNlZFZlcnRpY2FsTWFyZ2luICs9IGNvbGxhcHNlZE1hcmdpbi5pc0NvbGxhcHNlZFRo
cm91Z2ggPyBub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIgOiBjb2xsYXBzZWRNYXJnaW4uYWZ0ZXIu
dmFsdWVPcihub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIpOwotICAgIGJvZHlCb3hDb250ZW50SGVp
Z2h0IC09IHVzZWRWZXJ0aWNhbE1hcmdpbjsKLSAgICAvLyBEb2N1bWVudCBib3gncyBwYWRkaW5n
IGFuZCBib3JkZXIgYWxzbyBzaHJpbmsgdGhlIGJvZHkgYm94J3MgY29udGVudCBoZWlnaHQuCi0g
ICAgYXV0byYgZG9jdW1lbnRCb3ggPSBsYXlvdXRCb3gucGFyZW50KCk7Ci0gICAgYXV0byYgZG9j
dW1lbnRCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGRvY3Vt
ZW50Qm94LCBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspOwotICAg
IGJvZHlCb3hDb250ZW50SGVpZ2h0IC09IGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxCb3Jk
ZXIoKSArIGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsK
LSAgICAvLyBIb3dldmVyIHRoZSBub24taW4tZmxvdyBkb2N1bWVudCBib3gncyB2ZXJ0aWNhbCBt
YXJnaW5zIGFyZSBpZ25vcmVkLiBUaGV5IGRvbid0IGFmZmVjdCB0aGUgYm9keSBib3gncyBjb250
ZW50IGhlaWdodC4KLSAgICBpZiAoZG9jdW1lbnRCb3guaXNJbkZsb3coKSkgewotICAgICAgICBh
dXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2VvbWV0cnkoKTsKLSAgICAgICAgYXV0byBwcmVjb21wdXRl
RG9jdW1lbnRCb3hWZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkVmVydGljYWxNYXJn
aW4oZG9jdW1lbnRCb3gsIGdlb21ldHJ5LmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChpbml0
aWFsQ29udGFpbmluZ0Jsb2NrLCBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0
UXVpcmspLmhvcml6b250YWwpOwotICAgICAgICBib2R5Qm94Q29udGVudEhlaWdodCAtPSBwcmVj
b21wdXRlRG9jdW1lbnRCb3hWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSArIHByZWNv
bXB1dGVEb2N1bWVudEJveFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCk7Ci0gICAgfQot
ICAgIHJldHVybiBzdGQ6Om1heChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQs
ICBib2R5Qm94Q29udGVudEhlaWdodCk7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6UXVpcmtzOjpzaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihjb25zdCBCb3gmIGxh
eW91dEJveCkgY29uc3QKLXsKLSAgICByZXR1cm4gbGF5b3V0U3RhdGUoKS5pblF1aXJrc01vZGUo
KSAmJiBpc1F1aXJrQ29udGFpbmVyKGxheW91dEJveCk7Ci19Ci0KLWVudW0gY2xhc3MgVmVydGlj
YWxNYXJnaW4geyBCZWZvcmUsIEFmdGVyIH07Ci1zdGF0aWMgaW5saW5lIGJvb2wgaGFzUXVpcmtN
YXJnaW5Ub0NvbGxhcHNlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBWZXJ0aWNhbE1hcmdpbiB2ZXJ0
aWNhbE1hcmdpbikKLXsKLSAgICBpZiAoIWxheW91dEJveC5pc0luRmxvdygpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICBy
ZXR1cm4gKHZlcnRpY2FsTWFyZ2luID09IFZlcnRpY2FsTWFyZ2luOjpCZWZvcmUgJiYgc3R5bGUu
aGFzTWFyZ2luQmVmb3JlUXVpcmsoKSkgfHwgKHZlcnRpY2FsTWFyZ2luID09IFZlcnRpY2FsTWFy
Z2luOjpBZnRlciAmJiBzdHlsZS5oYXNNYXJnaW5BZnRlclF1aXJrKCkpOwotfQotCi1ib29sIEJs
b2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6c2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVX
aXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAg
IHJldHVybiBsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpICYmIGhhc1F1aXJrTWFyZ2luVG9D
b2xsYXBzZShsYXlvdXRCb3gsIFZlcnRpY2FsTWFyZ2luOjpCZWZvcmUpICYmIGlzUXVpcmtDb250
YWluZXIobGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpKTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0OjpRdWlya3M6OnNob3VsZENvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoUGFyZW50
TWFyZ2luQWZ0ZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGxh
eW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkgJiYgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGxh
eW91dEJveCwgVmVydGljYWxNYXJnaW46OkFmdGVyKSAmJiBpc1F1aXJrQ29udGFpbmVyKGxheW91
dEJveC5jb250YWluaW5nQmxvY2soKSk7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0
YXRlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3Jt
YXR0aW5nU3RhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzRhNTBmZjY5
MTNhZDEyYTA4ZDUyZTM5MDI3NTkxMDc3ZjIzMzViLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRp
bmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBA
QAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJCbG9ja0Zvcm1h
dHRpbmdTdGF0ZS5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0K
LSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7
Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEJsb2Nr
Rm9ybWF0dGluZ1N0YXRlKTsKLQotQmxvY2tGb3JtYXR0aW5nU3RhdGU6OkJsb2NrRm9ybWF0dGlu
Z1N0YXRlKFJlZjxGbG9hdGluZ1N0YXRlPiYmIGZsb2F0aW5nU3RhdGUsIExheW91dFN0YXRlJiBs
YXlvdXRTdGF0ZSkKLSAgICA6IEZvcm1hdHRpbmdTdGF0ZShXVEZNb3ZlKGZsb2F0aW5nU3RhdGUp
LCBUeXBlOjpCbG9jaywgbGF5b3V0U3RhdGUpCi17Ci19Ci0KLUJsb2NrRm9ybWF0dGluZ1N0YXRl
Ojp+QmxvY2tGb3JtYXR0aW5nU3RhdGUoKQotewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5n
U3RhdGUuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3Jt
YXR0aW5nU3RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU2Y2Q2MTlkZDMx
NmY1OWIzZjQwOWJmMzVkNzA5NmQ5ZmI3YzhiMS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5n
L0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0v
KgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
LSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdf
Q09OVEVYVCkKLQotI2luY2x1ZGUgIkZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgPHd0Zi9J
c29NYWxsb2MuaD4KLSNpbmNsdWRlIDx3dGYvV2Vha0hhc2hTZXQuaD4KLQotbmFtZXNwYWNlIFdl
YkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLS8vIEJsb2NrRm9ybWF0dGluZ1N0YXRlIGhv
bGRzIHRoZSBzdGF0ZSBmb3IgYSBwYXJ0aWN1bGFyIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCB0
cmVlLgotY2xhc3MgQmxvY2tGb3JtYXR0aW5nU3RhdGUgOiBwdWJsaWMgRm9ybWF0dGluZ1N0YXRl
IHsKLSAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKEJsb2NrRm9ybWF0dGluZ1N0YXRlKTsKLXB1
YmxpYzoKLSAgICBCbG9ja0Zvcm1hdHRpbmdTdGF0ZShSZWY8RmxvYXRpbmdTdGF0ZT4mJiwgTGF5
b3V0U3RhdGUmKTsKLSAgICB+QmxvY2tGb3JtYXR0aW5nU3RhdGUoKTsKLQotICAgIHZvaWQgc2V0
VXNlZFZlcnRpY2FsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBVc2VkVmVydGlj
YWxNYXJnaW4mIHVzZWRWZXJ0aWNhbE1hcmdpbikgeyBtX3VzZWRWZXJ0aWNhbE1hcmdpbnMuc2V0
KCZsYXlvdXRCb3gsIHVzZWRWZXJ0aWNhbE1hcmdpbik7IH0KLSAgICBVc2VkVmVydGljYWxNYXJn
aW4gdXNlZFZlcnRpY2FsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdCB7IHJldHVy
biBtX3VzZWRWZXJ0aWNhbE1hcmdpbnMuZ2V0KCZsYXlvdXRCb3gpOyB9Ci0gICAgYm9vbCBoYXNV
c2VkVmVydGljYWxNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1f
dXNlZFZlcnRpY2FsTWFyZ2lucy5jb250YWlucygmbGF5b3V0Qm94KTsgfQotCi0gICAgdm9pZCBz
ZXRIYXNDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIHsgbV9jbGVhcmFuY2VTZXQuYWRk
KGxheW91dEJveCk7IH0KLSAgICB2b2lkIGNsZWFySGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYgbGF5
b3V0Qm94KSB7IG1fY2xlYXJhbmNlU2V0LnJlbW92ZShsYXlvdXRCb3gpOyB9Ci0gICAgYm9vbCBo
YXNDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fY2xlYXJh
bmNlU2V0LmNvbnRhaW5zKGxheW91dEJveCk7IH0KLQotcHJpdmF0ZToKLSAgICBIYXNoTWFwPGNv
bnN0IEJveCosIFVzZWRWZXJ0aWNhbE1hcmdpbj4gbV91c2VkVmVydGljYWxNYXJnaW5zOwotICAg
IFdlYWtIYXNoU2V0PGNvbnN0IEJveD4gbV9jbGVhcmFuY2VTZXQ7Ci19OwotCi19Ci19Ci0KLVNQ
RUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUoQmxvY2tGb3JtYXR0
aW5nU3RhdGUsIGlzQmxvY2tGb3JtYXR0aW5nU3RhdGUoKSkKLQotI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrTWFyZ2luQ29sbGFw
c2UuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja01hcmdp
bkNvbGxhcHNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmZDViYmUyMmEx
YWI5MmU4NTFkODUwZGUwZjRhNmFkMTg3MTBkYi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5n
L0Jsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjA3ICswLDAgQEAK
LS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0
aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0K
LSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkZsb2F0aW5nU3Rh
dGUuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJMYXlv
dXRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJMYXlv
dXRVbml0LmgiCi0jaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUg
ewotbmFtZXNwYWNlIExheW91dCB7Ci0KLXN0YXRpYyBib29sIGhhc0JvcmRlcihjb25zdCBCb3Jk
ZXJWYWx1ZSYgYm9yZGVyVmFsdWUpCi17Ci0gICAgaWYgKGJvcmRlclZhbHVlLnN0eWxlKCkgPT0g
Qm9yZGVyU3R5bGU6Ok5vbmUgfHwgYm9yZGVyVmFsdWUuc3R5bGUoKSA9PSBCb3JkZXJTdHlsZTo6
SGlkZGVuKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuICEhYm9yZGVyVmFsdWUu
d2lkdGgoKTsKLX0KLQotc3RhdGljIGJvb2wgaGFzUGFkZGluZyhjb25zdCBMZW5ndGgmIHBhZGRp
bmdWYWx1ZSkKLXsKLSAgICAvLyBGSVhNRTogQ2hlY2sgaWYgcGVyY2VudCB2YWx1ZSBuZWVkcyB0
byBiZSByZXNvbHZlZC4KLSAgICByZXR1cm4gIXBhZGRpbmdWYWx1ZS5pc1plcm8oKTsKLX0KLQot
c3RhdGljIGJvb2wgaGFzQm9yZGVyQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAg
IHJldHVybiBoYXNCb3JkZXIobGF5b3V0Qm94LnN0eWxlKCkuYm9yZGVyQmVmb3JlKCkpOwotfQot
Ci1zdGF0aWMgYm9vbCBoYXNCb3JkZXJBZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAg
ICByZXR1cm4gaGFzQm9yZGVyKGxheW91dEJveC5zdHlsZSgpLmJvcmRlckFmdGVyKCkpOwotfQot
Ci1zdGF0aWMgYm9vbCBoYXNQYWRkaW5nQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewot
ICAgIHJldHVybiBoYXNQYWRkaW5nKGxheW91dEJveC5zdHlsZSgpLnBhZGRpbmdCZWZvcmUoKSk7
Ci19Ci0KLXN0YXRpYyBib29sIGhhc1BhZGRpbmdBZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkK
LXsKLSAgICByZXR1cm4gaGFzUGFkZGluZyhsYXlvdXRCb3guc3R5bGUoKS5wYWRkaW5nQWZ0ZXIo
KSk7Ci19Ci0KLXN0YXRpYyBib29sIGVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dChj
b25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICAvLyBXZWJLaXQgdHJlYXRzIHRoZSBkb2N1bWVu
dCBlbGVtZW50IHJlbmRlcmVyIGFzIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QuIEl0
IHByb2JhYmx5IG9ubHkgaW1wYWN0cyBtYXJnaW4gY29sbGFwc2luZywgc28gbGV0J3Mgbm90IGRv
Ci0gICAgLy8gYSBsYXlvdXQgd2lkZSBxdWlyayBvbiB0aGlzIGZvciBub3cuCi0gICAgaWYgKGxh
eW91dEJveC5pc0RvY3VtZW50Qm94KCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVy
biBsYXlvdXRCb3guZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCk7Ci19Ci0KLWJv
b2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Omhhc0NsZWFyYW5jZShj
b25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAgICBpZiAoIWxheW91dEJveC5oYXNGbG9h
dENsZWFyKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAvLyBGSVhNRTogcHJlY29tcHV0
ZWRWZXJ0aWNhbFBvc2l0aW9uRm9yRm9ybWF0dGluZ1Jvb3QgbG9naWMgZW5kcyB1cCBjYWxsaW5n
IGludG8gdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBsYXlvdXRCb3ggKGZpcnN0IGluZmxvdyBjaGls
ZCkgaGFzCi0gICAgLy8gbm90IGJlZW4gbGFpZCBvdXQuCi0gICAgcmV0dXJuIGZvcm1hdHRpbmdD
b250ZXh0KCkuZm9ybWF0dGluZ1N0YXRlKCkuaGFzQ2xlYXJhbmNlKGxheW91dEJveCk7Ci19Ci0K
LWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9y
ZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkgY29u
c3QKLXsKLSAgICAvLyAxLiBUaGlzIGlzIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgYW5kIGl0cyBt
YXJnaW5zIGNvbGxhcHNlIHRocm91Z2ggYW5kIHRoZSBtYXJnaW4gYWZ0ZXIgY29sbGFwc2VzIHdp
dGggcGFyZW50J3MgbWFyZ2luIGFmdGVyIG9yCi0gICAgLy8gMi4gVGhpcyBib3gncyBtYXJnaW4g
YWZ0ZXIgY29sbGFwc2VzIHdpdGggdGhlIG5leHQgc2libGluZydzIG1hcmdpbiBiZWZvcmUgYW5k
IHRoYXQgc2libGluZyBjb2xsYXBzZXMgdGhyb3VnaCBhbmQKLSAgICAvLyB3ZSBjYW4gZ2V0IHRv
IHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgbGlrZSB0aGF0LgotICAgIGF1dG8qIGxhc3RJbkZsb3dD
aGlsZCA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5sYXN0SW5GbG93Q2hpbGQoKTsKLSAg
ICBmb3IgKGF1dG8qIGN1cnJlbnRCb3ggPSAmbGF5b3V0Qm94OyBjdXJyZW50Qm94OyBjdXJyZW50
Qm94ID0gY3VycmVudEJveC0+bmV4dEluRmxvd1NpYmxpbmcoKSkgewotICAgICAgICBpZiAoIW1h
cmdpbnNDb2xsYXBzZVRocm91Z2goKmN1cnJlbnRCb3gpKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICBpZiAoY3VycmVudEJveCA9PSBsYXN0SW5GbG93Q2hpbGQpCi0gICAgICAg
ICAgICByZXR1cm4gbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoKmN1
cnJlbnRCb3gpOyAKLSAgICAgICAgaWYgKCFtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhOZXh0U2li
bGluZ01hcmdpbkJlZm9yZSgqY3VycmVudEJveCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVm
b3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCkg
Y29uc3QKLXsKLSAgICAvLyBUaGUgZmlyc3QgaW5mbG93IGNoaWxkIGNvdWxkIHByb3BhZ2F0ZSBp
dHMgdG9wIG1hcmdpbiB0byBwYXJlbnQuCi0gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NT
UzIxL2JveC5odG1sI2NvbGxhcHNpbmctbWFyZ2lucwotICAgIEFTU0VSVChsYXlvdXRCb3guaXNC
bG9ja0xldmVsQm94KCkpOwotCi0gICAgaWYgKGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCku
c2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxheW91dEJv
eCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gTWFyZ2lucyBiZXR3ZWVuIGEgZmxv
YXRlZCBib3ggYW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxhcHNlLgotICAgIGlmIChsYXlv
dXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgLy8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxh
cHNlLgotICAgIGlmIChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIC8vIE1hcmdpbnMgb2YgaW5saW5lLWJsb2NrIGJveGVzIGRv
IG5vdCBjb2xsYXBzZS4KLSAgICBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxvY2tCb3goKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gT25seSB0aGUgZmlyc3QgaW5sZmxvdyBjaGls
ZCBjb2xsYXBzZXMgd2l0aCBwYXJlbnQuCi0gICAgaWYgKGxheW91dEJveC5wcmV2aW91c0luRmxv
d1NpYmxpbmcoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXV0byYgY29udGFpbmlu
Z0Jsb2NrID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOwotICAgIC8vIE1hcmdpbnMgb2Yg
ZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8g
bm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJlbgotICAgIGlmIChlc3RhYmxp
c2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmluZ0Jsb2NrKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgaWYgKGhhc0JvcmRlckJlZm9yZShjb250YWluaW5nQmxvY2spKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShjb250YWlu
aW5nQmxvY2spKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyAuLi5hbmQgdGhlIGNo
aWxkIGhhcyBubyBjbGVhcmFuY2UuCi0gICAgaWYgKGhhc0NsZWFyYW5jZShsYXlvdXRCb3gpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFwc2Vz
V2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25z
dAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwotCi0gICAgaWYg
KCFsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9ICpsYXlvdXRCb3gucHJldmlv
dXNJbkZsb3dTaWJsaW5nKCk7Ci0gICAgLy8gTWFyZ2lucyBiZXR3ZWVuIGEgZmxvYXRlZCBib3gg
YW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxhcHNlLgotICAgIGlmIChsYXlvdXRCb3guaXNG
bG9hdGluZ1Bvc2l0aW9uZWQoKSB8fCBwcmV2aW91c0luRmxvd1NpYmxpbmcuaXNGbG9hdGluZ1Bv
c2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gTWFyZ2lucyBvZiBh
YnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgotICAgIGlmICgobGF5
b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guc3R5bGUoKS50b3Ao
KS5pc0F1dG8oKSkKLSAgICAgICAgfHwgKHByZXZpb3VzSW5GbG93U2libGluZy5pc091dE9mRmxv
d1Bvc2l0aW9uZWQoKSAmJiAhcHJldmlvdXNJbkZsb3dTaWJsaW5nLnN0eWxlKCkuYm90dG9tKCku
aXNBdXRvKCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIG9mIGlu
bGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCi0gICAgaWYgKGxheW91dEJveC5pc0lu
bGluZUJsb2NrQm94KCkgfHwgcHJldmlvdXNJbkZsb3dTaWJsaW5nLmlzSW5saW5lQmxvY2tCb3go
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2Yg
YW4gaW4tZmxvdyBibG9jay1sZXZlbCBlbGVtZW50IGFsd2F5cyBjb2xsYXBzZXMgd2l0aCB0aGUg
dG9wIG1hcmdpbiBvZgotICAgIC8vIGl0cyBuZXh0IGluLWZsb3cgYmxvY2stbGV2ZWwgc2libGlu
ZywgdW5sZXNzIHRoYXQgc2libGluZyBoYXMgY2xlYXJhbmNlLgotICAgIGlmIChoYXNDbGVhcmFu
Y2UobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdp
bkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxkTWFyZ2luQmVmb3JlKGNvbnN0IEJv
eCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVs
Qm94KCkpOwotICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJs
b2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxv
dyBjaGlsZHJlbi4KLSAgICBpZiAoZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGxh
eW91dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIFRoZSB0b3AgbWFyZ2lu
IG9mIGFuIGluLWZsb3cgYmxvY2sgZWxlbWVudCBjb2xsYXBzZXMgd2l0aCBpdHMgZmlyc3QgaW4t
ZmxvdyBibG9jay1sZXZlbAotICAgIC8vIGNoaWxkJ3MgdG9wIG1hcmdpbiBpZiB0aGUgZWxlbWVu
dCBoYXMgbm8gdG9wIGJvcmRlci4uLgotICAgIGlmIChoYXNCb3JkZXJCZWZvcmUobGF5b3V0Qm94
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gLi4ubm8gdG9wIHBhZGRpbmcKLSAg
ICBpZiAoaGFzUGFkZGluZ0JlZm9yZShsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSB8fCAhZG93bmNhc3Q8Q29u
dGFpbmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxvd0NoaWxkKCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIGF1dG8mIGZpcnN0SW5GbG93Q2hpbGQgPSAqZG93bmNhc3Q8Q29udGFpbmVy
Qm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93Q2hpbGQoKTsKLSAgICBpZiAoIWZpcnN0SW5GbG93
Q2hpbGQuaXNCbG9ja0xldmVsQm94KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8v
IC4uLmFuZCB0aGUgY2hpbGQgaGFzIG5vIGNsZWFyYW5jZS4KLSAgICBpZiAoaGFzQ2xlYXJhbmNl
KGZpcnN0SW5GbG93Q2hpbGQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJn
aW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCi0gICAgaWYgKGZpcnN0
SW5GbG93Q2hpbGQuaXNJbmxpbmVCbG9ja0JveCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJn
aW5Db2xsYXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoU2libGluZ01hcmdpbkJlZm9yZVdp
dGhDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhl
IHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgb2YgYW4gZWxlbWVudCB3aXRoIGNsZWFyYW5jZSBhcmUg
YWRqb2luaW5nLCBpdHMgbWFyZ2lucyBjb2xsYXBzZSB3aXRoIHRoZSBhZGpvaW5pbmcgbWFyZ2lu
cwotICAgIC8vIG9mIGZvbGxvd2luZyBzaWJsaW5ncyBidXQgdGhhdCByZXN1bHRpbmcgbWFyZ2lu
IGRvZXMgbm90IGNvbGxhcHNlIHdpdGggdGhlIGJvdHRvbSBtYXJnaW4gb2YgdGhlIHBhcmVudCBi
bG9jay4KLSAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2gobGF5b3V0Qm94KSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yIChhdXRvKiBwcmV2aW91c1NpYmxpbmcgPSBsYXlv
dXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7IHByZXZpb3VzU2libGluZzsgcHJldmlvdXNT
aWJsaW5nID0gcHJldmlvdXNTaWJsaW5nLT5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkgewotICAg
ICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKnByZXZpb3VzU2libGluZykpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChoYXNDbGVhcmFuY2UoKnByZXZpb3Vz
U2libGluZykpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjpt
YXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlv
dXRCb3gpIGNvbnN0Ci17Ci0gICAgLy8gMS4gVGhpcyBpcyB0aGUgZmlyc3QgaW4tZmxvdyBjaGls
ZCBhbmQgaXRzIG1hcmdpbnMgY29sbGFwc2UgdGhyb3VnaCBhbmQgdGhlIG1hcmdpbiBiZWZvcmUg
Y29sbGFwc2VzIHdpdGggcGFyZW50J3MgbWFyZ2luIGJlZm9yZSBvcgotICAgIC8vIDIuIFRoaXMg
Ym94J3MgbWFyZ2luIGJlZm9yZSBjb2xsYXBzZXMgd2l0aCB0aGUgcHJldmlvdXMgc2libGluZydz
IG1hcmdpbiBhZnRlciBhbmQgdGhhdCBzaWJsaW5nIGNvbGxhcHNlcyB0aHJvdWdoIGFuZAotICAg
IC8vIHdlIGNhbiBnZXQgdG8gdGhlIGZpcnN0IGluLWZsb3cgY2hpbGQgbGlrZSB0aGF0LgotICAg
IGF1dG8qIGZpcnN0SW5GbG93Q2hpbGQgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkuZmly
c3RJbkZsb3dDaGlsZCgpOwotICAgIGZvciAoYXV0byogY3VycmVudEJveCA9ICZsYXlvdXRCb3g7
IGN1cnJlbnRCb3g7IGN1cnJlbnRCb3ggPSBjdXJyZW50Qm94LT5wcmV2aW91c0luRmxvd1NpYmxp
bmcoKSkgewotICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKmN1cnJlbnRCb3gp
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoY3VycmVudEJveCA9PSBm
aXJzdEluRmxvd0NoaWxkKQotICAgICAgICAgICAgcmV0dXJuIG1hcmdpbkJlZm9yZUNvbGxhcHNl
c1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUoKmN1cnJlbnRCb3gpOyAKLSAgICAgICAgaWYgKCFtYXJn
aW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5nTWFyZ2luQWZ0ZXIoKmN1cnJlbnRC
b3gpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdp
bkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRC
b3guaXNCbG9ja0xldmVsQm94KCkpOwotCi0gICAgaWYgKGZvcm1hdHRpbmdDb250ZXh0KCkucXVp
cmtzKCkuc2hvdWxkQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhQYXJlbnRNYXJnaW5BZnRlcihsYXlv
dXRCb3gpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIE1hcmdpbnMgYmV0d2VlbiBh
IGZsb2F0ZWQgYm94IGFuZCBhbnkgb3RoZXIgYm94IGRvIG5vdCBjb2xsYXBzZS4KLSAgICBpZiAo
bGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIC8vIE1hcmdpbnMgb2YgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJveGVzIGRvIG5vdCBj
b2xsYXBzZS4KLSAgICBpZiAobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hl
cyBkbyBub3QgY29sbGFwc2UuCi0gICAgaWYgKGxheW91dEJveC5pc0lubGluZUJsb2NrQm94KCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIE9ubHkgdGhlIGxhc3QgaW5sZmxvdyBj
aGlsZCBjb2xsYXBzZXMgd2l0aCBwYXJlbnQuCi0gICAgaWYgKGxheW91dEJveC5uZXh0SW5GbG93
U2libGluZygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBhdXRvJiBjb250YWluaW5n
QmxvY2sgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgLy8gTWFyZ2lucyBvZiBl
bGVtZW50cyB0aGF0IGVzdGFibGlzaCBuZXcgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cyBkbyBu
b3QgY29sbGFwc2Ugd2l0aCB0aGVpciBpbi1mbG93IGNoaWxkcmVuLgotICAgIGlmIChlc3RhYmxp
c2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmluZ0Jsb2NrKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9j
ayBib3ggd2l0aCBhICdoZWlnaHQnIG9mICdhdXRvJyBjb2xsYXBzZXMgd2l0aCBpdHMgbGFzdCBp
bi1mbG93IGJsb2NrLWxldmVsIGNoaWxkJ3MgYm90dG9tIG1hcmdpbiwgaWY6Ci0gICAgaWYgKCFj
b250YWluaW5nQmxvY2suc3R5bGUoKS5oZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIHBhZGRpbmcsIGFuZAotICAg
IGlmIChoYXNQYWRkaW5nQWZ0ZXIoY29udGFpbmluZ0Jsb2NrKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIGJvcmRlciwgYW5kCi0gICAgaWYg
KGhhc0JvcmRlckFmdGVyKGNvbnRhaW5pbmdCbG9jaykpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIC8vIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4gbmVpdGhlciBjb2xsYXBzZXMgd2l0
aCBhIHRvcCBtYXJnaW4gdGhhdCBoYXMgY2xlYXJhbmNlLi4uCi0gICAgaWYgKG1hcmdpbkFmdGVy
Q29sbGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGxheW91dEJveCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIG5vciAoaWYgdGhlIGJveCdzIG1pbi1o
ZWlnaHQgaXMgbm9uLXplcm8pIHdpdGggdGhlIGJveCdzIHRvcCBtYXJnaW4uCi0gICAgYXV0byBj
b21wdXRlZE1pbkhlaWdodCA9IGNvbnRhaW5pbmdCbG9jay5zdHlsZSgpLmxvZ2ljYWxNaW5IZWln
aHQoKTsKLSAgICBpZiAoIWNvbXB1dGVkTWluSGVpZ2h0LmlzQXV0bygpICYmIGNvbXB1dGVkTWlu
SGVpZ2h0LnZhbHVlKCkgJiYgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVm
b3JlKGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVl
OwotfQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJn
aW5BZnRlckNvbGxhcHNlc1dpdGhMYXN0SW5GbG93Q2hpbGRNYXJnaW5BZnRlcihjb25zdCBCb3gm
IGxheW91dEJveCkgY29uc3QKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJv
eCgpKTsKLQotICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJs
b2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxv
dyBjaGlsZHJlbi4KLSAgICBpZiAoZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGxh
eW91dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghaXM8Q29udGFpbmVy
Qm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFz
SW5GbG93Q2hpbGQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXV0byYgbGFzdElu
Rmxvd0NoaWxkID0gKmRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5sYXN0SW5GbG93
Q2hpbGQoKTsKLSAgICBpZiAoIWxhc3RJbkZsb3dDaGlsZC5pc0Jsb2NrTGV2ZWxCb3goKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4t
ZmxvdyBibG9jayBib3ggd2l0aCBhICdoZWlnaHQnIG9mICdhdXRvJyBjb2xsYXBzZXMgd2l0aCBp
dHMgbGFzdCBpbi1mbG93IGJsb2NrLWxldmVsIGNoaWxkJ3MgYm90dG9tIG1hcmdpbiwgaWY6Ci0g
ICAgaWYgKCFsYXlvdXRCb3guc3R5bGUoKS5oZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIHBhZGRpbmcsIGFuZAot
ICAgIGlmIChoYXNQYWRkaW5nQWZ0ZXIobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIGJvcmRlciwgYW5kCi0gICAgaWYgKGhh
c0JvcmRlckFmdGVyKGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8v
IHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4gbmVpdGhlciBjb2xsYXBzZXMgd2l0aCBhIHRvcCBt
YXJnaW4gdGhhdCBoYXMgY2xlYXJhbmNlLi4uCi0gICAgaWYgKG1hcmdpbkFmdGVyQ29sbGFwc2Vz
V2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGxhc3RJbkZsb3dDaGlsZCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIG5vciAoaWYgdGhlIGJveCdzIG1pbi1oZWln
aHQgaXMgbm9uLXplcm8pIHdpdGggdGhlIGJveCdzIHRvcCBtYXJnaW4uCi0gICAgYXV0byBjb21w
dXRlZE1pbkhlaWdodCA9IGxheW91dEJveC5zdHlsZSgpLmxvZ2ljYWxNaW5IZWlnaHQoKTsKLSAg
ICBpZiAoIWNvbXB1dGVkTWluSGVpZ2h0LmlzQXV0bygpICYmIGNvbXB1dGVkTWluSGVpZ2h0LnZh
bHVlKCkKLSAgICAgICAgJiYgKG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJl
Zm9yZShsYXN0SW5GbG93Q2hpbGQpIHx8IGhhc0NsZWFyYW5jZShsYXN0SW5GbG93Q2hpbGQpKSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gTWFyZ2lucyBvZiBpbmxpbmUtYmxvY2sg
Ym94ZXMgZG8gbm90IGNvbGxhcHNlLgotICAgIGlmIChsYXN0SW5GbG93Q2hpbGQuaXNJbmxpbmVC
bG9ja0JveCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBUaGlzIGlzIGEgcXVp
cmsgYmVoYXZpb3I6IFdoZW4gdGhlIG1hcmdpbiBhZnRlciBvZiB0aGUgbGFzdCBpbmZsb3cgY2hp
bGQgKG9yIGEgcHJldmlvdXMgc2libGluZyB3aXRoIGNvbGxhcHNlZCB0aHJvdWdoIG1hcmdpbnMp
Ci0gICAgLy8gY29sbGFwc2VzIHdpdGggYSBxdWlyayBwYXJlbnQncyB0aGUgbWFyZ2luIGJlZm9y
ZSwgdGhlbiB0aGUgc2FtZSBtYXJnaW4gYWZ0ZXIgZG9lcyBub3QgY29sbGFwc2VzIHdpdGggdGhl
IHBhcmVudCdzIG1hcmdpbiBhZnRlci4KLSAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHQoKS5xdWly
a3MoKS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihsYXlvdXRCb3gpICYmIG1hcmdp
bkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXN0SW5GbG93Q2hpbGQpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNX
aXRoTmV4dFNpYmxpbmdNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17
Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7Ci0KLSAgICBpZiAoIWxh
eW91dEJveC5uZXh0SW5GbG93U2libGluZygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICByZXR1cm4gbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFm
dGVyKCpsYXlvdXRCb3gubmV4dEluRmxvd1NpYmxpbmcoKSk7Ci19Ci0KLWJvb2wgQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbnNDb2xsYXBzZVRocm91Z2goY29u
c3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2Nr
TGV2ZWxCb3goKSk7Ci0KLSAgICAvLyBBIGJveCdzIG93biBtYXJnaW5zIGNvbGxhcHNlIGlmIHRo
ZSAnbWluLWhlaWdodCcgcHJvcGVydHkgaXMgemVybywgYW5kIGl0IGhhcyBuZWl0aGVyIHRvcCBv
ciBib3R0b20gYm9yZGVycyBub3IgdG9wIG9yIGJvdHRvbSBwYWRkaW5nLAotICAgIC8vIGFuZCBp
dCBoYXMgYSAnaGVpZ2h0JyBvZiBlaXRoZXIgMCBvciAnYXV0bycsIGFuZCBpdCBkb2VzIG5vdCBj
b250YWluIGEgbGluZSBib3gsIGFuZCBhbGwgb2YgaXRzIGluLWZsb3cgY2hpbGRyZW4ncyBtYXJn
aW5zIChpZiBhbnkpIGNvbGxhcHNlLgotICAgIGlmIChoYXNCb3JkZXJCZWZvcmUobGF5b3V0Qm94
KSB8fCBoYXNCb3JkZXJBZnRlcihsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShsYXlvdXRCb3gpIHx8IGhhc1BhZGRpbmdBZnRlcihs
YXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIGFyZSBu
b3QgYWRqb2luaW5nIHdoZW4gdGhlIGJveCBoYXMgY2xlYXJhbmNlLgotICAgIGlmIChoYXNDbGVh
cmFuY2UobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXV0byYgc3R5
bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICBhdXRvIGNvbXB1dGVkSGVpZ2h0VmFsdWVJc1pl
cm8gPSBzdHlsZS5oZWlnaHQoKS5pc0ZpeGVkKCkgJiYgIXN0eWxlLmhlaWdodCgpLnZhbHVlKCk7
Ci0gICAgaWYgKCEoc3R5bGUuaGVpZ2h0KCkuaXNBdXRvKCkgfHwgY29tcHV0ZWRIZWlnaHRWYWx1
ZUlzWmVybykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIEZJWE1FOiBDaGVjayBm
b3IgY29tcHV0ZWQgMCBoZWlnaHQuCi0gICAgaWYgKCFzdHlsZS5taW5IZWlnaHQoKS5pc0F1dG8o
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gRklYTUU6IEJsb2NrIHJlcGxhY2Vk
IGJveGVzIGNsZWFybHkgZG9uJ3QgY29sbGFwc2UgdGhyb3VnaCB0aGVpciBtYXJnaW5zLCBidXQg
SSBjb3VsZG4ndCBmaW5kIGl0IGluIHRoZSBzcGVjIHlldCAoYW5kIG5vLCBpdCdzIG5vdCBhIHF1
aXJrKS4KLSAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkpCi0gICAgICAg
IHJldHVybiB0cnVlOwotCi0gICAgaWYgKCFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJv
eCkuaGFzSW5GbG93Q2hpbGQoKSkKLSAgICAgICAgcmV0dXJuICFlc3RhYmxpc2hlc0Jsb2NrRm9y
bWF0dGluZ0NvbnRleHQobGF5b3V0Qm94KTsKLQotICAgIGlmIChsYXlvdXRCb3guZXN0YWJsaXNo
ZXNGb3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAgICAgIGlmIChsYXlvdXRCb3guZXN0YWJsaXNo
ZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICBhdXRvJiBsYXlvdXRT
dGF0ZSA9IHRoaXMtPmxheW91dFN0YXRlKCk7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBnZXQgaGVy
ZSB0aHJvdWdoIG1hcmdpbiBlc3RpbWF0aW9uLCB3ZSBkb24ndCBuZWNlc3NhcmlseSBoYXZlIGFu
IGFjdHVhbCBzdGF0ZSBmb3IgdGhpcyBsYXlvdXQgYm94IHNpbmNlCi0gICAgICAgICAgICAvLyB3
ZSBoYXZlbid0IHN0YXJ0ZWQgbGF5aW5nIGl0IG91dCB5ZXQuCi0gICAgICAgICAgICBhdXRvJiBj
b250YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7Ci0gICAgICAg
ICAgICBpZiAoIWxheW91dFN0YXRlLmhhc0lubGluZUZvcm1hdHRpbmdTdGF0ZShjb250YWluZXJC
b3gpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgYXV0byBp
c0NvbnNpZGVyZWRFbXB0eSA9IFsmXSB7Ci0gICAgICAgICAgICAgICAgYXV0byYgaW5saW5lRm9y
bWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUuZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3Rh
dGUoY29udGFpbmVyQm94KTsKLSAgICAgICAgICAgICAgICBpZiAoIWlubGluZUZvcm1hdHRpbmdT
dGF0ZS5saW5lcygpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICAgICAgICAgIC8vIEFueSBmbG9hdCBib3ggaW4gdGhpcyBmb3JtYXR0aW5nIGNv
bnRleHQgcHJldmVudHMgY29sbGFwc2luZyB0aHJvdWdoLgotICAgICAgICAgICAgICAgIGF1dG8m
IGZsb2F0cyA9IGlubGluZUZvcm1hdHRpbmdTdGF0ZS5mbG9hdGluZ1N0YXRlKCkuZmxvYXRzKCk7
Ci0gICAgICAgICAgICAgICAgZm9yIChhdXRvJiBmbG9hdEl0ZW0gOiBmbG9hdHMpIHsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKGZsb2F0SXRlbS5pc0luRm9ybWF0dGluZ0NvbnRleHRPZihjb250
YWluZXJCb3gpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH07
Ci0gICAgICAgICAgICByZXR1cm4gaXNDb25zaWRlcmVkRW1wdHkoKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIEEgcm9vdCBvZiBhIG5vbi1pbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0ICh0YWJs
ZSwgZmxleCBldGMpIHdpdGggaW5mbG93IGRlc2NlbmRhbnRzIHNob3VsZCBub3QgY29sbGFwc2Ug
dGhyb3VnaC4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoYXV0byog
aW5mbG93Q2hpbGQgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZs
b3dPckZsb2F0aW5nQ2hpbGQoKTsgaW5mbG93Q2hpbGQ7IGluZmxvd0NoaWxkID0gaW5mbG93Q2hp
bGQtPm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7Ci0gICAgICAgIGlmIChlc3RhYmxp
c2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKmluZmxvd0NoaWxkKSkKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCFtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKCppbmZsb3dD
aGlsZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVl
OwotfQotCi1Vc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1
ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OmNvbXB1dGVkUG9zaXRp
dmVBbmROZWdhdGl2ZU1hcmdpbihVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRp
dmVQYWlyOjpWYWx1ZXMgYSwgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZl
UGFpcjo6VmFsdWVzIGIpIGNvbnN0Ci17Ci0gICAgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2
ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIGNvbXB1dGVkVmFsdWVzOwotICAgIGlmIChhLnBvc2l0
aXZlICYmIGIucG9zaXRpdmUpCi0gICAgICAgIGNvbXB1dGVkVmFsdWVzLnBvc2l0aXZlID0gc3Rk
OjptYXgoKmEucG9zaXRpdmUsICpiLnBvc2l0aXZlKTsKLSAgICBlbHNlCi0gICAgICAgIGNvbXB1
dGVkVmFsdWVzLnBvc2l0aXZlID0gYS5wb3NpdGl2ZSA/IGEucG9zaXRpdmUgOiBiLnBvc2l0aXZl
OwotCi0gICAgaWYgKGEubmVnYXRpdmUgJiYgYi5uZWdhdGl2ZSkKLSAgICAgICAgY29tcHV0ZWRW
YWx1ZXMubmVnYXRpdmUgPSBzdGQ6Om1pbigqYS5uZWdhdGl2ZSwgKmIubmVnYXRpdmUpOwotICAg
IGVsc2UKLSAgICAgICAgY29tcHV0ZWRWYWx1ZXMubmVnYXRpdmUgPSBhLm5lZ2F0aXZlID8gYS5u
ZWdhdGl2ZSA6IGIubmVnYXRpdmU7Ci0KLSAgICBpZiAoYS5pc05vblplcm8oKSAmJiBiLmlzTm9u
WmVybygpKQotICAgICAgICBjb21wdXRlZFZhbHVlcy5pc1F1aXJrID0gYS5pc1F1aXJrIHx8IGIu
aXNRdWlyazsKLSAgICBlbHNlIGlmIChhLmlzTm9uWmVybygpKQotICAgICAgICBjb21wdXRlZFZh
bHVlcy5pc1F1aXJrID0gYS5pc1F1aXJrOwotICAgIGVsc2UKLSAgICAgICAgY29tcHV0ZWRWYWx1
ZXMuaXNRdWlyayA9IGIuaXNRdWlyazsKLQotICAgIHJldHVybiBjb21wdXRlZFZhbHVlczsKLX0K
LQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29s
bGFwc2U6Om1hcmdpblZhbHVlKFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2
ZVBhaXI6OlZhbHVlcyBtYXJnaW5WYWx1ZXMpIGNvbnN0Ci17Ci0gICAgLy8gV2hlbiB0d28gb3Ig
bW9yZSBtYXJnaW5zIGNvbGxhcHNlLCB0aGUgcmVzdWx0aW5nIG1hcmdpbiB3aWR0aCBpcyB0aGUg
bWF4aW11bSBvZiB0aGUgY29sbGFwc2luZyBtYXJnaW5zJyB3aWR0aHMuCi0gICAgLy8gSW4gdGhl
IGNhc2Ugb2YgbmVnYXRpdmUgbWFyZ2lucywgdGhlIG1heGltdW0gb2YgdGhlIGFic29sdXRlIHZh
bHVlcyBvZiB0aGUgbmVnYXRpdmUgYWRqb2luaW5nIG1hcmdpbnMgaXMgZGVkdWN0ZWQgZnJvbSB0
aGUgbWF4aW11bQotICAgIC8vIG9mIHRoZSBwb3NpdGl2ZSBhZGpvaW5pbmcgbWFyZ2lucy4gSWYg
dGhlcmUgYXJlIG5vIHBvc2l0aXZlIG1hcmdpbnMsIHRoZSBtYXhpbXVtIG9mIHRoZSBhYnNvbHV0
ZSB2YWx1ZXMgb2YgdGhlIGFkam9pbmluZyBtYXJnaW5zIGlzIGRlZHVjdGVkIGZyb20gemVyby4K
LSAgICBpZiAoIW1hcmdpblZhbHVlcy5uZWdhdGl2ZSkKLSAgICAgICAgcmV0dXJuIG1hcmdpblZh
bHVlcy5wb3NpdGl2ZTsKLQotICAgIGlmICghbWFyZ2luVmFsdWVzLnBvc2l0aXZlKQotICAgICAg
ICByZXR1cm4gbWFyZ2luVmFsdWVzLm5lZ2F0aXZlOwotCi0gICAgcmV0dXJuICptYXJnaW5WYWx1
ZXMucG9zaXRpdmUgKyAqbWFyZ2luVmFsdWVzLm5lZ2F0aXZlOwotfQotCi12b2lkIEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjp1cGRhdGVNYXJnaW5BZnRlckZvclByZXZp
b3VzU2libGluZyhCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBibG9ja0Zvcm1hdHRpbmdDb250ZXh0
LCBjb25zdCBNYXJnaW5Db2xsYXBzZSYgbWFyZ2luQ29sbGFwc2UsIGNvbnN0IEJveCYgbGF5b3V0
Qm94KQotewotICAgIC8vIDEuIEdldCB0aGUgbWFyZ2luIGJlZm9yZSB2YWx1ZSBmcm9tIHRoZSBu
ZXh0IGluLWZsb3cgc2libGluZy4gVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGlzIGJveCdzIG1hcmdp
biBhZnRlciB2YWx1ZSBub3cgc2luY2UgdGhleSBhcmUgY29sbGFwc2VkLgotICAgIC8vIDIuIFVw
ZGF0ZSB0aGUgY29sbGFwc2VkIG1hcmdpbiBhZnRlciB2YWx1ZSBhcyB3ZWxsIGFzIHRoZSBwb3Np
dGl2ZS9uZWdhdGl2ZSBjYWNoZS4KLSAgICAvLyAzLiBDaGVjayBpZiB0aGUgYm94J3MgbWFyZ2lu
cyBjb2xsYXBzZSB0aHJvdWdoLgotICAgIC8vIDQuIElmIHNvLCB1cGRhdGUgdGhlIHBvc2l0aXZl
L25lZ2F0aXZlIGNhY2hlLgotICAgIC8vIDUuIEluIGNhc2Ugb2YgY29sbGFwc2VkIHRocm91Z2gg
bWFyZ2lucyBjaGVjayBpZiB0aGUgYmVmb3JlIG1hcmdpbiBjb2xsYXBlcyB3aXRoIHRoZSBwcmV2
aW91cyBpbmZsb3cgc2libGluZydzIGFmdGVyIG1hcmdpbi4KLSAgICAvLyA2LiBJZiBzbywganVt
cCB0byAjMi4KLSAgICAvLyA3LiBObyBuZWVkIHRvIHByb3BhZ2F0ZSB0byBwYXJlbnQgYmVjYXVz
ZSBpdHMgbWFyZ2luIGlzIG5vdCBjb21wdXRlZCB5ZXQgKHByZS1jb21wdXRlZCBhdCBtb3N0KS4K
LSAgICBhdXRvKiBjdXJyZW50Qm94ID0gJmxheW91dEJveDsKLSAgICBhdXRvJiBibG9ja0Zvcm1h
dHRpbmdTdGF0ZSA9IGJsb2NrRm9ybWF0dGluZ0NvbnRleHQuZm9ybWF0dGluZ1N0YXRlKCk7Ci0g
ICAgd2hpbGUgKG1hcmdpbkNvbGxhcHNlLm1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91
c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVudEJveCkpIHsKLSAgICAgICAgYXV0byYgcHJldmlv
dXNTaWJsaW5nID0gKmN1cnJlbnRCb3gtPnByZXZpb3VzSW5GbG93U2libGluZygpOwotICAgICAg
ICBhdXRvIHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luID0gYmxvY2tGb3JtYXR0aW5nU3Rh
dGUudXNlZFZlcnRpY2FsTWFyZ2luKHByZXZpb3VzU2libGluZyk7Ci0KLSAgICAgICAgYXV0byBj
b2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkJlZm9yZSA9IHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFy
Z2luLmNvbGxhcHNlZFZhbHVlcy5iZWZvcmU7Ci0gICAgICAgIGF1dG8gY29sbGFwc2VkVmVydGlj
YWxNYXJnaW5BZnRlciA9IGJsb2NrRm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goKmN1
cnJlbnRCb3gpLm1hcmdpbkJlZm9yZSgpOwotCi0gICAgICAgIGF1dG8gbWFyZ2luc0NvbGxhcHNl
VGhyb3VnaCA9IG1hcmdpbkNvbGxhcHNlLm1hcmdpbnNDb2xsYXBzZVRocm91Z2gocHJldmlvdXNT
aWJsaW5nKTsKLSAgICAgICAgaWYgKG1hcmdpbnNDb2xsYXBzZVRocm91Z2gpCi0gICAgICAgICAg
ICBjb2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkJlZm9yZSA9IGNvbGxhcHNlZFZlcnRpY2FsTWFyZ2lu
QWZ0ZXI7Ci0KLSAgICAgICAgLy8gVXBkYXRlIHBvc2l0aXZlL25lZ2F0aXZlIGNhY2hlLgotICAg
ICAgICBhdXRvIHByZXZpb3VzU2libGluZ1Bvc2l0aXZlTmVnYXRpdmVNYXJnaW4gPSBibG9ja0Zv
cm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNTaWJsaW5nKS5wb3NpdGl2
ZUFuZE5lZ2F0aXZlVmFsdWVzOwotICAgICAgICBhdXRvIHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5C
ZWZvcmUgPSBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4oKmN1cnJlbnRC
b3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlOwotCi0gICAgICAgIGF1dG8gYWRq
dXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbiA9IHByZXZpb3VzU2libGluZ1ZlcnRp
Y2FsTWFyZ2luOwotICAgICAgICBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2lu
LnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0ZXIgPSBtYXJnaW5Db2xsYXBzZS5jb21wdXRl
ZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4ocG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSwg
cHJldmlvdXNTaWJsaW5nUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbi5hZnRlcik7Ci0gICAgICAgIGlm
IChtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKSB7Ci0gICAgICAgICAgICBhZGp1c3RlZFByZXZpb3Vz
U2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlID0g
bWFyZ2luQ29sbGFwc2UuY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKHByZXZpb3Vz
U2libGluZ1Bvc2l0aXZlTmVnYXRpdmVNYXJnaW4uYmVmb3JlLCBhZGp1c3RlZFByZXZpb3VzU2li
bGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0ZXIpOwotICAg
ICAgICAgICAgYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbi5wb3NpdGl2ZUFu
ZE5lZ2F0aXZlVmFsdWVzLmFmdGVyID0gYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1h
cmdpbi5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmJlZm9yZTsKLSAgICAgICAgfQotICAgICAg
ICBibG9ja0Zvcm1hdHRpbmdTdGF0ZS5zZXRVc2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNTaWJs
aW5nLCBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luKTsKLQotICAgICAgICBp
ZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2gpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAg
ICBjdXJyZW50Qm94ID0gJnByZXZpb3VzU2libGluZzsKLSAgICB9Ci19Ci0KLVVzZWRWZXJ0aWNh
bE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdhdGl2ZVZhbHVlcyhjb25zdCBCb3gm
IGxheW91dEJveCwgTWFyZ2luVHlwZSBtYXJnaW5UeXBlKSBjb25zdAotewotICAgIGF1dG8mIGZv
cm1hdHRpbmdTdGF0ZSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZm9ybWF0dGluZ1N0YXRlKCk7Ci0g
ICAgLy8gQnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUgaW4gQkZDIGxheW91dCB0byBnYXRoZXIgcG9z
aXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZm9yIGVpdGhlciBhIHByZXZpb3VzIHNp
Ymxpbmcgb3IgYSBjaGlsZCBib3gsCi0gICAgLy8gd2UgbXVzaCBoYXZlIGNvbXB1dGVkIGFuZCBj
YWNoZWQgdGhvc2UgdmFsdWVzLgotICAgIEFTU0VSVChmb3JtYXR0aW5nU3RhdGUuaGFzVXNlZFZl
cnRpY2FsTWFyZ2luKGxheW91dEJveCkpOwotICAgIGF1dG8gcG9zaXRpdmVBbmROZWdhdGl2ZVZl
cnRpY2FsTWFyZ2luID0gZm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRC
b3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXM7Ci0gICAgcmV0dXJuIG1hcmdpblR5cGUgPT0g
TWFyZ2luVHlwZTo6QmVmb3JlID8gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJl
Zm9yZSA6IHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5hZnRlcjsgCi19Ci0KLVVz
ZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJl
Zm9yZShjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBz
ZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAotewotICAgIGF1dG8gZmlyc3RDaGls
ZENvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9z
aXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7Ci0gICAgICAgIGlmICghbWFyZ2luQmVmb3Jl
Q29sbGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJnaW5CZWZvcmUobGF5b3V0Qm94KSkKLSAg
ICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIHJldHVybiBwb3NpdGl2ZU5lZ2F0aXZlVmFs
dWVzKCpkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dDaGlsZCgp
LCBNYXJnaW5UeXBlOjpCZWZvcmUpOwotICAgIH07Ci0KLSAgICBhdXRvIHByZXZpb3VTaWJsaW5n
Q29sbGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0
aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgewotICAgICAgICBpZiAoIW1hcmdpbkJlZm9yZUNv
bGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcihsYXlvdXRCb3gpKQotICAgICAg
ICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgcmV0dXJuIHBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMo
KmxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSwgTWFyZ2luVHlwZTo6QWZ0ZXIpOwot
ICAgIH07Ci0KLSAgICAvLyAxLiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2
YWx1ZXMgZnJvbSBmaXJzdCBjaGlsZCBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcuCi0gICAgLy8g
Mi4gR2F0aGVyIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWVzIGZyb20gcHJldmlv
dXMgaW5mbG93IHNpYmxpbmcgaWYgbWFyZ2lucyBhcmUgYWRqb2luaW5nLgotICAgIC8vIDMuIENv
bXB1dGUgbWluL21heCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgY29sbGFwc2VkIG1hcmdpbiB2YWx1
ZXMgdXNpbmcgbm9uLWNvbGxwYXNlZCBjb21wdXRlZCBtYXJnaW4gYmVmb3JlLgotICAgIGF1dG8g
Y29sbGFwc2VkTWFyZ2luQmVmb3JlID0gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2lu
KGZpcnN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5CZWZvcmUoKSwgcHJldmlvdVNpYmxpbmdDb2xsYXBz
ZWRNYXJnaW5BZnRlcigpKTsKLSAgICBpZiAoY29sbGFwc2VkTWFyZ2luQmVmb3JlLmlzUXVpcmsg
JiYgZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWly
a01hcmdpbihsYXlvdXRCb3gpKQotICAgICAgICBjb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSB7IH07
Ci0KLSAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1
ZXMgbm9uQ29sbGFwc2VkQmVmb3JlOwotICAgIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3Jl
ID4gMCkKLSAgICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0geyBub25Db2xsYXBzZWRWYWx1ZXMu
YmVmb3JlLCB7IH0sIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkgfTsK
LSAgICBlbHNlIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlIDwgMCkKLSAgICAgICAgbm9u
Q29sbGFwc2VkQmVmb3JlID0geyB7IH0sIG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUsIGxheW91
dEJveC5zdHlsZSgpLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkgfTsKLQotICAgIHJldHVybiBjb21w
dXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4oY29sbGFwc2VkTWFyZ2luQmVmb3JlLCBub25D
b2xsYXBzZWRCZWZvcmUpOwotfQotCi1Vc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVn
YXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6
OnBvc2l0aXZlTmVnYXRpdmVNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZl
cnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25z
dAotewotICAgIGF1dG8gbGFzdENoaWxkQ29sbGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBV
c2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgewotICAg
ICAgICBpZiAoIW1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFm
dGVyKGxheW91dEJveCkpCi0gICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICByZXR1cm4g
cG9zaXRpdmVOZWdhdGl2ZVZhbHVlcygqZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gp
Lmxhc3RJbkZsb3dDaGlsZCgpLCBNYXJnaW5UeXBlOjpBZnRlcik7Ci0gICAgfTsKLQotICAgIC8v
IFdlIGRvbid0IGtub3cgeWV0IHRoZSBtYXJnaW4gYmVmb3JlIHZhbHVlIG9mIHRoZSBuZXh0IHNp
YmxpbmcuIExldCdzIGp1c3QgcHJldGVuZCBpdCBkb2VzIG5vdCBoYXZlIG9uZSBhbmQgCi0gICAg
Ly8gdXBkYXRlIGl0IGxhdGVyIHdoZW4gd2UgY29tcHV0ZSB0aGUgbmV4dCBzaWJsaW5nJ3MgbWFy
Z2luIGJlZm9yZS4gU2VlIHVwZGF0ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nLgotICAg
IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBub25D
b2xsYXBzZWRBZnRlcjsKLSAgICBpZiAobm9uQ29sbGFwc2VkVmFsdWVzLmFmdGVyID4gMCkKLSAg
ICAgICAgbm9uQ29sbGFwc2VkQWZ0ZXIgPSB7IG5vbkNvbGxhcHNlZFZhbHVlcy5hZnRlciwgeyB9
LCBsYXlvdXRCb3guc3R5bGUoKS5oYXNNYXJnaW5BZnRlclF1aXJrKCkgfTsKLSAgICBlbHNlIGlm
IChub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIgPCAwKQotICAgICAgICBub25Db2xsYXBzZWRBZnRl
ciA9IHsgeyB9LCBub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIsIGxheW91dEJveC5zdHlsZSgpLmhh
c01hcmdpbkFmdGVyUXVpcmsoKSB9OwotCi0gICAgcmV0dXJuIGNvbXB1dGVkUG9zaXRpdmVBbmRO
ZWdhdGl2ZU1hcmdpbihsYXN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5BZnRlcigpLCBub25Db2xsYXBz
ZWRBZnRlcik7Ci19Ci0KLUxheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2lu
Q29sbGFwc2U6Om1hcmdpbkJlZm9yZUlnbm9yaW5nQ29sbGFwc2luZ1Rocm91Z2goY29uc3QgQm94
JiBsYXlvdXRCb3gsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIG5vbkNv
bGxhcHNlZFZhbHVlcykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgp
KTsKLSAgICByZXR1cm4gbWFyZ2luVmFsdWUocG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShs
YXlvdXRCb3gsIG5vbkNvbGxhcHNlZFZhbHVlcykpLnZhbHVlT3Iobm9uQ29sbGFwc2VkVmFsdWVz
LmJlZm9yZSk7Ci19Ci0KLVVzZWRWZXJ0aWNhbE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpNYXJnaW5Db2xsYXBzZTo6Y29sbGFwc2VkVmVydGljYWxWYWx1ZXMoY29uc3QgQm94JiBsYXlv
dXRCb3gsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIG5vbkNvbGxhcHNl
ZFZhbHVlcykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLSAg
ICAvLyAxLiBHZXQgbWluL21heCBtYXJnaW4gdG9wIHZhbHVlcyBmcm9tIHRoZSBmaXJzdCBpbi1m
bG93IGNoaWxkIGlmIHdlIGFyZSBjb2xsYXBzaW5nIG1hcmdpbiB0b3Agd2l0aCBpdC4KLSAgICAv
LyAyLiBHZXQgbWluL21heCBtYXJnaW4gdG9wIHZhbHVlcyBmcm9tIHRoZSBwcmV2aW91cyBpbi1m
bG93IHNpYmxpbmcsIGlmIHdlIGFyZSBjb2xsYXBzaW5nIG1hcmdpbiB0b3Agd2l0aCBpdC4KLSAg
ICAvLyAzLiBHZXQgdGhpcyBsYXlvdXQgYm94J3MgY29tcHV0ZWQgbWFyZ2luIHRvcCB2YWx1ZS4K
LSAgICAvLyA0LiBVcGRhdGUgdGhlIG1pbi9tYXggdmFsdWUgYW5kIGNvbXB1dGUgdGhlIGZpbmFs
IG1hcmdpbi4KLSAgICBhdXRvIHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbiA9IFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXIgeyB0aGlzLT5wb3NpdGl2
ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGxheW91dEJveCwgbm9uQ29sbGFwc2VkVmFsdWVzKSwgdGhp
cy0+cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkFmdGVyKGxheW91dEJveCwgbm9uQ29sbGFwc2VkVmFs
dWVzKSB9OwotCi0gICAgYXV0byBtYXJnaW5zQ29sbGFwc2VUaHJvdWdoID0gdGhpcy0+bWFyZ2lu
c0NvbGxhcHNlVGhyb3VnaChsYXlvdXRCb3gpOwotICAgIGlmIChtYXJnaW5zQ29sbGFwc2VUaHJv
dWdoKSB7Ci0gICAgICAgIHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5iZWZvcmUg
PSBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4ocG9zaXRpdmVBbmROZWdhdGl2ZVZl
cnRpY2FsTWFyZ2luLmJlZm9yZSwgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFm
dGVyKTsKLSAgICAgICAgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyID0g
cG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZTsKLSAgICB9Ci0KLSAgICBh
dXRvIGhhc0NvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhG
aXJzdEluRmxvd0NoaWxkTWFyZ2luQmVmb3JlKGxheW91dEJveCkgfHwgbWFyZ2luQmVmb3JlQ29s
bGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGxheW91dEJveCk7Ci0gICAgYXV0
byBoYXNDb2xsYXBzZWRNYXJnaW5BZnRlciA9IG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aExhc3RJ
bkZsb3dDaGlsZE1hcmdpbkFmdGVyKGxheW91dEJveCk7Ci0gICAgYXV0byB1c2VkVmVydGljYWxN
YXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW4geyBub25Db2xsYXBzZWRWYWx1ZXMsIHsgfSwgcG9z
aXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luIH07Ci0KLSAgICBpZiAoKGhhc0NvbGxhcHNl
ZE1hcmdpbkJlZm9yZSAmJiBoYXNDb2xsYXBzZWRNYXJnaW5BZnRlcikgfHwgbWFyZ2luc0NvbGxh
cHNlVGhyb3VnaCkKLSAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luLmNvbGxhcHNlZFZhbHVlcyA9
IHsgbWFyZ2luVmFsdWUocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSks
IG1hcmdpblZhbHVlKHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5hZnRlciksIG1h
cmdpbnNDb2xsYXBzZVRocm91Z2ggfTsKLSAgICBlbHNlIGlmIChoYXNDb2xsYXBzZWRNYXJnaW5C
ZWZvcmUpCi0gICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1ZXMgPSB7IG1h
cmdpblZhbHVlKHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5iZWZvcmUpLCB7IH0s
IGZhbHNlIH07Ci0gICAgZWxzZSBpZiAoaGFzQ29sbGFwc2VkTWFyZ2luQWZ0ZXIpCi0gICAgICAg
IHVzZWRWZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1ZXMgPSB7IHsgfSwgbWFyZ2luVmFsdWUo
cG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyKSwgZmFsc2UgfTsKLSAgICBy
ZXR1cm4gdXNlZFZlcnRpY2FsTWFyZ2luOwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvUHJlY29tcHV0ZWRCbG9ja01h
cmdpbkNvbGxhcHNlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcv
UHJlY29tcHV0ZWRCbG9ja01hcmdpbkNvbGxhcHNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggZGVmYjNkNTU0ZmU2OGRlNDI3MzFmZjhlMmQ0YjIwZWFiZjY1OWVjMi4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvYmxvY2tmb3JtYXR0aW5nL1ByZWNvbXB1dGVkQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAK
KysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAy
MCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFC
TEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGlu
Z1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGFp
bmVyQm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKLSNpbmNsdWRlICJMYXlvdXRVbml0
LmgiCi0jaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFt
ZXNwYWNlIExheW91dCB7Ci0KLVVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2
ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cHJl
Y29tcHV0ZWRQb3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25z
dAotewotICAgIGF1dG8mIGJsb2NrRm9ybWF0dGluZ1N0YXRlID0gZG93bmNhc3Q8QmxvY2tGb3Jt
YXR0aW5nU3RhdGU+KGxheW91dFN0YXRlKCkuZm9ybWF0dGluZ1N0YXRlRm9yQm94KGxheW91dEJv
eCkpOwotICAgIGlmIChibG9ja0Zvcm1hdHRpbmdTdGF0ZS5oYXNVc2VkVmVydGljYWxNYXJnaW4o
bGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGJsb2NrRm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0
aWNhbE1hcmdpbihsYXlvdXRCb3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlOwot
Ci0gICAgYXV0byBnZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnkoKTsKLSAg
ICBhdXRvIGhvcml6b250YWxDb25zdHJhaW50cyA9IGdlb21ldHJ5LmNvbnN0cmFpbnRzRm9ySW5G
bG93Q29udGVudChsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkpLmhvcml6b250YWw7Ci0gICAg
YXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gZ2VvbWV0cnkuY29tcHV0ZWRWZXJ0aWNhbE1h
cmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgYXV0byBub25Db2xs
YXBzZWRNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB7IGNv
bXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxN
YXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OwotICAgIHJldHVybiBwcmVjb21wdXRlZFBvc2l0aXZl
TmVnYXRpdmVNYXJnaW5CZWZvcmUobGF5b3V0Qm94LCBub25Db2xsYXBzZWRNYXJnaW4pOwotfQot
Ci1Vc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OnByZWNvbXB1dGVkUG9zaXRpdmVO
ZWdhdGl2ZU1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFy
Z2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAotewotICAg
IGF1dG8gZmlyc3RDaGlsZENvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IFsmXSgpIC0+IFVzZWRWZXJ0
aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7Ci0gICAgICAgIGlm
ICghbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJnaW5CZWZvcmUo
bGF5b3V0Qm94KSkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIHJldHVybiBwcmVj
b21wdXRlZFBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMoKmRvd25jYXN0PENvbnRhaW5lckJveD4obGF5
b3V0Qm94KS5maXJzdEluRmxvd0NoaWxkKCkpOwotICAgIH07Ci0KLSAgICBhdXRvIHByZXZpb3VT
aWJsaW5nQ29sbGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGljYWxNYXJnaW46
OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgewotICAgICAgICBpZiAoIW1hcmdpbkJl
Zm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcihsYXlvdXRCb3gpKQot
ICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgYXV0byYgcHJldmlvdXNJbkZsb3dTaWJs
aW5nID0gKmxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKTsKLSAgICAgICAgYXV0byYg
YmxvY2tGb3JtYXR0aW5nU3RhdGUgPSBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4obGF5
b3V0U3RhdGUoKS5mb3JtYXR0aW5nU3RhdGVGb3JCb3gocHJldmlvdXNJbkZsb3dTaWJsaW5nKSk7
Ci0gICAgICAgIHJldHVybiBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4o
cHJldmlvdXNJbkZsb3dTaWJsaW5nKS5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmFmdGVyOwot
ICAgIH07Ci0KLSAgICAvLyAxLiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2
YWx1ZXMgZnJvbSBmaXJzdCBjaGlsZCBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcuCi0gICAgLy8g
Mi4gR2F0aGVyIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWVzIGZyb20gcHJldmlv
dXMgaW5mbG93IHNpYmxpbmcgaWYgbWFyZ2lucyBhcmUgYWRqb2luaW5nLgotICAgIC8vIDMuIENv
bXB1dGUgbWluL21heCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgY29sbGFwc2VkIG1hcmdpbiB2YWx1
ZXMgdXNpbmcgbm9uLWNvbGxwYXNlZCBjb21wdXRlZCBtYXJnaW4gYmVmb3JlLgotICAgIGF1dG8g
Y29sbGFwc2VkTWFyZ2luQmVmb3JlID0gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2lu
KGZpcnN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5CZWZvcmUoKSwgcHJldmlvdVNpYmxpbmdDb2xsYXBz
ZWRNYXJnaW5BZnRlcigpKTsKLSAgICBpZiAoY29sbGFwc2VkTWFyZ2luQmVmb3JlLmlzUXVpcmsg
JiYgZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWly
a01hcmdpbihsYXlvdXRCb3gpKQotICAgICAgICBjb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSB7IH07
Ci0KLSAgICBhdXRvIG5vbkNvbGxhcHNlZEJlZm9yZSA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9z
aXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7IH07Ci0gICAgaWYgKG5vbkNvbGxhcHNlZFZh
bHVlcy5iZWZvcmUgPiAwKQotICAgICAgICBub25Db2xsYXBzZWRCZWZvcmUgPSB7IG5vbkNvbGxh
cHNlZFZhbHVlcy5iZWZvcmUsIHsgfSwgbGF5b3V0Qm94LnN0eWxlKCkuaGFzTWFyZ2luQmVmb3Jl
UXVpcmsoKSB9OwotICAgIGVsc2UgaWYgKG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUgPCAwKQot
ICAgICAgICBub25Db2xsYXBzZWRCZWZvcmUgPSB7IHsgfSwgbm9uQ29sbGFwc2VkVmFsdWVzLmJl
Zm9yZSwgbGF5b3V0Qm94LnN0eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSB9OwotCi0gICAg
cmV0dXJuIGNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihjb2xsYXBzZWRNYXJnaW5C
ZWZvcmUsIG5vbkNvbGxhcHNlZEJlZm9yZSk7Ci19Ci0KLVByZWNvbXB1dGVkTWFyZ2luQmVmb3Jl
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjpwcmVjb21wdXRlZE1hcmdp
bkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xs
YXBzZWRWYWx1ZXMgdXNlZE5vbkNvbGxhcHNlZE1hcmdpbikKLXsKLSAgICBBU1NFUlQobGF5b3V0
Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLSAgICAvLyBEb24ndCBwcmUtY29tcHV0ZSB2ZXJ0aWNh
bCBtYXJnaW5zIGZvciBvdXQgb2YgZmxvdyBib3hlcy4KLSAgICBBU1NFUlQobGF5b3V0Qm94Lmlz
SW5GbG93KCkgfHwgbGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOwotICAgIEFTU0VS
VCghbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSk7Ci0KLSAgICBhdXRvIHBvc2l0aXZlTmVnYXRp
dmVNYXJnaW5CZWZvcmUgPSBwcmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUo
bGF5b3V0Qm94LCB1c2VkTm9uQ29sbGFwc2VkTWFyZ2luKTsKLSAgICBhdXRvIGNvbGxhcHNlZE1h
cmdpbkJlZm9yZSA9IG1hcmdpblZhbHVlKHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUpOwot
ICAgIHJldHVybiB7IHVzZWROb25Db2xsYXBzZWRNYXJnaW4uYmVmb3JlLCBjb2xsYXBzZWRNYXJn
aW5CZWZvcmUsIHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUgfTsKLX0KLQotfQotfQotI2Vu
ZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL3Rh
Ymxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBl
ckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCBhYzZkZjY1Y2E0YmI3MTM2MDRlYWI3MDAxNmNmN2RlZjFjMjJmMDRkLi4wMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9i
bG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoK
LSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0j
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5n
Q29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNp
bmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkludmFsaWRhdGlvblN0
YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRD
aGlsZEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxh
eW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKLSNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdD
b250ZXh0LmgiCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIKLQotbmFtZXNwYWNl
IFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLVdURl9NQUtFX0lTT19BTExPQ0FURURf
SU1QTChUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KTsKLQotVGFibGVXcmFwcGVy
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6VGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4
dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgQmxvY2tGb3JtYXR0
aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSkKLSAgICA6IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQo
Zm9ybWF0dGluZ0NvbnRleHRSb290LCBmb3JtYXR0aW5nU3RhdGUpCi17Ci19Ci0KLXZvaWQgVGFi
bGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0SW5GbG93Q29udGVudChJbnZh
bGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3Ry
YWludHMpCi17Ci0gICAgLy8gVGhlIHRhYmxlIGdlbmVyYXRlcyBhIHByaW5jaXBhbCBibG9jayBj
b250YWluZXIgYm94IGNhbGxlZCB0aGUgdGFibGUgd3JhcHBlciBib3ggdGhhdCBjb250YWlucyB0
aGUgdGFibGUgYm94IGl0c2VsZiBhbmQgYW55IGNhcHRpb24gYm94ZXMKLSAgICAvLyAoaW4gZG9j
dW1lbnQgb3JkZXIpLiBUaGUgdGFibGUgYm94IGlzIGEgYmxvY2stbGV2ZWwgYm94IHRoYXQgY29u
dGFpbnMgdGhlIHRhYmxlJ3MgaW50ZXJuYWwgdGFibGUgYm94ZXMuCi0gICAgLy8gVGhlIGNhcHRp
b24gYm94ZXMgYXJlIHByaW5jaXBhbCBibG9jay1sZXZlbCBib3hlcyB0aGF0IHJldGFpbiB0aGVp
ciBvd24gY29udGVudCwgcGFkZGluZywgbWFyZ2luLCBhbmQgYm9yZGVyIGFyZWFzLCBhbmQgYXJl
IHJlbmRlcmVkCi0gICAgLy8gYXMgbm9ybWFsIGJsb2NrIGJveGVzIGluc2lkZSB0aGUgdGFibGUg
d3JhcHBlciBib3guIFdoZXRoZXIgdGhlIGNhcHRpb24gYm94ZXMgYXJlIHBsYWNlZCBiZWZvcmUg
b3IgYWZ0ZXIgdGhlIHRhYmxlIGJveCBpcyBkZWNpZGVkIGJ5Ci0gICAgLy8gdGhlICdjYXB0aW9u
LXNpZGUnIHByb3BlcnR5LCBhcyBkZXNjcmliZWQgYmVsb3cuCi0gICAgZm9yIChhdXRvJiBjaGls
ZCA6IGNoaWxkcmVuT2ZUeXBlPENvbnRhaW5lckJveD4ocm9vdCgpKSkgewotICAgICAgICBpZiAo
Y2hpbGQuaXNUYWJsZUJveCgpKQotICAgICAgICAgICAgbGF5b3V0VGFibGVCb3goY2hpbGQsIGNv
bnN0cmFpbnRzKTsKLSAgICAgICAgZWxzZSBpZiAoY2hpbGQuaXNUYWJsZUNhcHRpb24oKSkKLSAg
ICAgICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIH0KLX0KLQotdm9pZCBUYWJsZVdy
YXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRUYWJsZUJveChjb25zdCBDb250YWlu
ZXJCb3gmIHRhYmxlQm94LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0
cmFpbnRzKQotewotICAgIGxheW91dFN0YXRlKCkuZW5zdXJlVGFibGVGb3JtYXR0aW5nU3RhdGUo
dGFibGVCb3gpOwotCi0gICAgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmdGb3JUYWJsZUJveCh0YWJs
ZUJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgY29tcHV0ZVN0YXRpY1ZlcnRpY2Fs
UG9zaXRpb24odGFibGVCb3gsIGNvbnN0cmFpbnRzLnZlcnRpY2FsKTsKLSAgICBjb21wdXRlV2lk
dGhBbmRNYXJnaW5Gb3JUYWJsZUJveCh0YWJsZUJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7
Ci0gICAgY29tcHV0ZVN0YXRpY0hvcml6b250YWxQb3NpdGlvbih0YWJsZUJveCwgY29uc3RyYWlu
dHMuaG9yaXpvbnRhbCk7Ci0KLSAgICBpZiAodGFibGVCb3guaGFzQ2hpbGQoKSkgewotICAgICAg
ICBhdXRvIGludmFsaWRhdGlvblN0YXRlID0gSW52YWxpZGF0aW9uU3RhdGUgeyB9OwotICAgICAg
ICBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dCh0YWJsZUJveCwgbGF5b3V0
U3RhdGUoKSktPmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGdlb21ldHJ5
KCkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KHRhYmxlQm94KSk7Ci0gICAgfQotCi0gICAg
Y29tcHV0ZUhlaWdodEFuZE1hcmdpbkZvclRhYmxlQm94KHRhYmxlQm94LCBjb25zdHJhaW50cyk7
Ci19Ci0KLXZvaWQgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUJv
cmRlckFuZFBhZGRpbmdGb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBj
b25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKLXsKLSAg
ICBBU1NFUlQodGFibGVCb3guaXNUYWJsZUJveCgpKTsKLSAgICBpZiAoIXRhYmxlQm94Lmhhc0No
aWxkKCkgfHwgdGFibGVCb3guc3R5bGUoKS5ib3JkZXJDb2xsYXBzZSgpID09IEJvcmRlckNvbGxh
cHNlOjpTZXBhcmF0ZSkgewotICAgICAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRl
Qm9yZGVyQW5kUGFkZGluZyh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBVQXMgbXVzdCBjb21wdXRlIGFuIGluaXRpYWwgbGVm
dCBhbmQgcmlnaHQgYm9yZGVyIHdpZHRoIGZvciB0aGUgdGFibGUgYnkgZXhhbWluaW5nCi0gICAg
Ly8gdGhlIGZpcnN0IGFuZCBsYXN0IGNlbGxzIGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIHRhYmxl
LgotICAgIC8vIFRoZSBsZWZ0IGJvcmRlciB3aWR0aCBvZiB0aGUgdGFibGUgaXMgaGFsZiBvZiB0
aGUgZmlyc3QgY2VsbCdzIGNvbGxhcHNlZCBsZWZ0IGJvcmRlciwKLSAgICAvLyBhbmQgdGhlIHJp
Z2h0IGJvcmRlciB3aWR0aCBvZiB0aGUgdGFibGUgaXMgaGFsZiBvZiB0aGUgbGFzdCBjZWxsJ3Mg
Y29sbGFwc2VkIHJpZ2h0IGJvcmRlci4KLSAgICAvLyBUaGUgdG9wIGJvcmRlciB3aWR0aCBvZiB0
aGUgdGFibGUgaXMgY29tcHV0ZWQgYnkgZXhhbWluaW5nIGFsbCBjZWxscyB3aG8gY29sbGFwc2Ug
dGhlaXIgdG9wCi0gICAgLy8gYm9yZGVycyB3aXRoIHRoZSB0b3AgYm9yZGVyIG9mIHRoZSB0YWJs
ZS4gVGhlIHRvcCBib3JkZXIgd2lkdGggb2YgdGhlIHRhYmxlIGlzIGVxdWFsIHRvIGhhbGYgb2Yg
dGhlCi0gICAgLy8gbWF4aW11bSBjb2xsYXBzZWQgdG9wIGJvcmRlci4gVGhlIGJvdHRvbSBib3Jk
ZXIgd2lkdGggaXMgY29tcHV0ZWQgYnkgZXhhbWluaW5nIGFsbCBjZWxscyB3aG9zZSBib3R0b20g
Ym9yZGVycyBjb2xsYXBzZQotICAgIC8vIHdpdGggdGhlIGJvdHRvbSBvZiB0aGUgdGFibGUuIFRo
ZSBib3R0b20gYm9yZGVyIHdpZHRoIGlzIGVxdWFsIHRvIGhhbGYgb2YgdGhlIG1heGltdW0gY29s
bGFwc2VkIGJvdHRvbSBib3JkZXIuCi0gICAgYXV0byYgZ3JpZCA9IGxheW91dFN0YXRlKCkuZXN0
YWJsaXNoZWRUYWJsZUZvcm1hdHRpbmdTdGF0ZSh0YWJsZUJveCkudGFibGVHcmlkKCk7Ci0gICAg
YXV0byB0YWJsZUJvcmRlciA9IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIodGFibGVCb3gpOwot
Ci0gICAgYXV0byYgZmlyc3RDb2x1bW5GaXJzdFJvd0JveCA9IGdyaWQuc2xvdCh7IDAgLCAwIH0p
LT5jZWxsKCkuYm94KCk7Ci0gICAgYXV0byBsZWZ0Qm9yZGVyID0gc3RkOjptYXgodGFibGVCb3Jk
ZXIuaG9yaXpvbnRhbC5sZWZ0LCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKGZpcnN0Q29sdW1u
Rmlyc3RSb3dCb3gpLmhvcml6b250YWwubGVmdCk7Ci0KLSAgICBhdXRvJiBsYXN0Q29sdW1uRmly
c3RSb3cgPSBncmlkLnNsb3QoeyBncmlkLmNvbHVtbnMoKS5zaXplKCkgLSAxLCAwIH0pLT5jZWxs
KCkuYm94KCk7Ci0gICAgYXV0byByaWdodEJvcmRlciA9IHN0ZDo6bWF4KHRhYmxlQm9yZGVyLmhv
cml6b250YWwucmlnaHQsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIobGFzdENvbHVtbkZpcnN0
Um93KS5ob3Jpem9udGFsLnJpZ2h0KTsKLQotICAgIGF1dG8gdG9wQm9yZGVyID0gdGFibGVCb3Jk
ZXIudmVydGljYWwudG9wOwotICAgIGF1dG8gYm90dG9tQm9yZGVyID0gdGFibGVCb3JkZXIudmVy
dGljYWwuYm90dG9tOwotICAgIGF1dG8gbGFzdFJvd0luZGV4ID0gZ3JpZC5yb3dzKCkuc2l6ZSgp
IC0gMTsKLSAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgZ3Jp
ZC5jb2x1bW5zKCkuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7Ci0gICAgICAgIGF1dG8mIGJveElu
Rmlyc3RSb3ggPSBncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgMCB9KS0+Y2VsbCgpLmJveCgpOwot
ICAgICAgICBhdXRvJiBib3hJbkxhc3RSb3cgPSBncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgbGFz
dFJvd0luZGV4IH0pLT5jZWxsKCkuYm94KCk7Ci0KLSAgICAgICAgdG9wQm9yZGVyID0gc3RkOjpt
YXgodG9wQm9yZGVyLCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKGJveEluRmlyc3RSb3gpLnZl
cnRpY2FsLnRvcCk7Ci0gICAgICAgIGJvdHRvbUJvcmRlciA9IHN0ZDo6bWF4KGJvdHRvbUJvcmRl
ciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihib3hJbkxhc3RSb3cpLnZlcnRpY2FsLmJvdHRv
bSk7Ci0gICAgfQotCi0gICAgdG9wQm9yZGVyID0gc3RkOjptYXgodG9wQm9yZGVyLCBnZW9tZXRy
eSgpLmNvbXB1dGVkQm9yZGVyKCp0YWJsZUJveC5maXJzdENoaWxkKCkpLnZlcnRpY2FsLnRvcCk7
Ci0gICAgZm9yIChhdXRvJiBzZWN0aW9uIDogY2hpbGRyZW5PZlR5cGU8Q29udGFpbmVyQm94Pih0
YWJsZUJveCkpIHsKLSAgICAgICAgYXV0byBob3JpenRvbmFsQm9yZGVyID0gZ2VvbWV0cnkoKS5j
b21wdXRlZEJvcmRlcihzZWN0aW9uKS5ob3Jpem9udGFsOwotICAgICAgICBsZWZ0Qm9yZGVyID0g
c3RkOjptYXgobGVmdEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5sZWZ0KTsKLSAgICAgICAgcmln
aHRCb3JkZXIgPSBzdGQ6Om1heChyaWdodEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5yaWdodCk7
Ci0gICAgfQotICAgIGJvdHRvbUJvcmRlciA9IHN0ZDo6bWF4KGJvdHRvbUJvcmRlciwgZ2VvbWV0
cnkoKS5jb21wdXRlZEJvcmRlcigqdGFibGVCb3gubGFzdENoaWxkKCkpLnZlcnRpY2FsLmJvdHRv
bSk7Ci0KLSAgICBhdXRvJiByb3dzID0gZ3JpZC5yb3dzKCkubGlzdCgpOwotICAgIHRvcEJvcmRl
ciA9IHN0ZDo6bWF4KHRvcEJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihyb3dzLmZp
cnN0KCkuYm94KCkpLnZlcnRpY2FsLnRvcCk7Ci0gICAgZm9yIChhdXRvJiByb3cgOiByb3dzKSB7
Ci0gICAgICAgIGF1dG8gaG9yaXp0b25hbEJvcmRlciA9IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3Jk
ZXIocm93LmJveCgpKS5ob3Jpem9udGFsOwotICAgICAgICBsZWZ0Qm9yZGVyID0gc3RkOjptYXgo
bGVmdEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5sZWZ0KTsKLSAgICAgICAgcmlnaHRCb3JkZXIg
PSBzdGQ6Om1heChyaWdodEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5yaWdodCk7Ci0gICAgfQot
ICAgIGJvdHRvbUJvcmRlciA9IHN0ZDo6bWF4KGJvdHRvbUJvcmRlciwgZ2VvbWV0cnkoKS5jb21w
dXRlZEJvcmRlcihyb3dzLmxhc3QoKS5ib3goKSkudmVydGljYWwuYm90dG9tKTsKLQotICAgIGF1
dG8gY29sbGFwc2VkQm9yZGVyID0gRWRnZXMgeyB7IGxlZnRCb3JkZXIsIHJpZ2h0Qm9yZGVyIH0s
IHsgdG9wQm9yZGVyLCBib3R0b21Cb3JkZXIgfSB9OwotICAgIGdyaWQuc2V0Q29sbGFwc2VkQm9y
ZGVyKGNvbGxhcHNlZEJvcmRlcik7Ci0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRp
bmdTdGF0ZSgpLmJveEdlb21ldHJ5KHRhYmxlQm94KTsKLSAgICBib3hHZW9tZXRyeS5zZXRCb3Jk
ZXIoY29sbGFwc2VkQm9yZGVyIC8gMik7Ci0gICAgYm94R2VvbWV0cnkuc2V0UGFkZGluZyhnZW9t
ZXRyeSgpLmNvbXB1dGVkUGFkZGluZyh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxv
Z2ljYWxXaWR0aCkpOwotfQotCi12b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6OmNvbXB1dGVXaWR0aEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYg
dGFibGVCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFp
bnRzKQotewotICAgIEFTU0VSVCh0YWJsZUJveC5pc1RhYmxlQm94KCkpOwotICAgIC8vIFRoaXMg
aXMgYSBzcGVjaWFsIHRhYmxlICJmaXQtY29udGVudCBzaXplIiBiZWhhdmlvciBoYW5kbGluZy4g
Tm90IGluIHRoZSBzcGVjIHRob3VnaC4KLSAgICAvLyBUYWJsZSByZXR1cm5zIGl0cyBmaW5hbCB3
aWR0aCBhcyBtaW4vbWF4LiBVc2UgdGhpcyBmaW5hbCB3aWR0aCB2YWx1ZSB0byBjb21wdXRlZCBo
b3Jpem9udGFsIG1hcmdpbnMgZXRjLgotICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZUZvclRhYmxl
Qm94ID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZFRhYmxlRm9ybWF0dGluZ1N0YXRlKHRhYmxl
Qm94KTsKLSAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzIHsgfTsKLSAgICBpZiAoYXV0byBwcmVjb21wdXRlZEludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMgPSBmb3JtYXR0aW5nU3RhdGVGb3JUYWJsZUJveC5pbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzKCkpCi0gICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSAqcHJlY29t
cHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOwotICAgIGVsc2UgewotICAgICAgICBpZiAo
dGFibGVCb3guaGFzQ2hpbGQoKSkKLSAgICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dCh0YWJsZUJveCwgbGF5
b3V0U3RhdGUoKSktPmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOwotICAgICAg
ICBmb3JtYXR0aW5nU3RhdGVGb3JUYWJsZUJveC5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMpOwotICAgIH0KLQotICAgIGF1dG8gYXZhaWxhYmxl
SG9yaXpvbnRhbFNwYWNlID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAg
ICAvLyAxLiBUaGUgdGFibGUgZ2VuZXJhdGVzIGEgcHJpbmNpcGFsIGJsb2NrIGNvbnRhaW5lciBi
b3ggY2FsbGVkIHRoZSB0YWJsZSB3cmFwcGVyIGJveCB0aGF0IGNvbnRhaW5zIHRoZSB0YWJsZSBi
b3ggaXRzZWxmIGFuZCBhbnkgY2FwdGlvbiBib3hlcy4KLSAgICAvLyAyLiBUaGUgdGFibGUgd3Jh
cHBlciBib3ggZXN0YWJsaXNoZXMgYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGFuZCB0aGUg
dGFibGUgYm94IGVzdGFibGlzaGVzIGEgdGFibGUgZm9ybWF0dGluZyBjb250ZXh0LgotICAgIC8v
IDMuIFRoZSBjb21wdXRlZCB2YWx1ZXMgb2YgcHJvcGVydGllcyAncG9zaXRpb24nLCAnZmxvYXQn
LCAnbWFyZ2luLSonLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsIGFuZCAnbGVmdCcgb24KLSAg
ICAvLyAgICB0aGUgdGFibGUgZWxlbWVudCBhcmUgdXNlZCBvbiB0aGUgdGFibGUgd3JhcHBlciBi
b3ggYW5kIG5vdCB0aGUgdGFibGUgYm94OyBhbGwgb3RoZXIgdmFsdWVzIG9mIG5vbi1pbmhlcml0
YWJsZQotICAgIC8vICAgIHByb3BlcnRpZXMgYXJlIHVzZWQgb24gdGhlIHRhYmxlIGJveCBhbmQg
bm90IHRoZSB0YWJsZSB3cmFwcGVyIGJveC4KLSAgICAvLyA0LiBJbiBhIGJsb2NrIGZvcm1hdHRp
bmcgY29udGV4dCwgZWFjaCBib3gncyBsZWZ0IG91dGVyIGVkZ2UgdG91Y2hlcyB0aGUgbGVmdCBl
ZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrLgotICAgIC8vICAgIFRoaXMgaXMgdHJ1ZSBldmVu
IGluIHRoZSBwcmVzZW5jZSBvZiBmbG9hdHMsIHVubGVzcyB0aGUgYm94IGVzdGFibGlzaGVzIGEg
bmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCAoaW4gd2hpY2ggY2FzZSB0aGUKLSAgICAvLyAg
ICBib3ggaXRzZWxmIG1heSBiZWNvbWUgbmFycm93ZXIgZHVlIHRvIHRoZSBmbG9hdHMpCi0gICAg
Ly8KLSAgICAvLyBOb3cgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBjYXNlOgotICAgIC8vIDxkaXYg
c3R5bGU9ImRpc3BsYXk6IGJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KLSAgICAvLyAgICAgPGRpdiBz
dHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiAxMDBweDsiPjwvZGl2PgotICAgIC8vICAgICAgICAg
PGRpdiBzdHlsZT0iZGlzcGxheTogdGFibGU7IHdpZHRoOiAxMCU7Ij48L2Rpdj4KLSAgICAvLyAg
ICAgPC9kaXY+Ci0gICAgLy8gPC9kaXY+Ci0gICAgLy8gMS4gV2UgY3JlYXRlIGEgdGFibGUgd3Jh
cHBlciBib3ggdG8gd3JhcCB0aGUgImRpc3BsYXk6IHRhYmxlIiBibG9jayBsZXZlbCBib3ggKCMx
KS4KLSAgICAvLyAyLiBUaGUgdGFibGUgd3JhcHBlciBib3gncyB3aWR0aCBwcm9wZXJ0eSBpcyBz
ZXQgdG8gYXV0byAoIzMpLgotICAgIC8vIDMuIFNpbmNlIGl0IGVzdGFibGlzaGVzIGEgbmV3IGJs
b2NrIGZvcm1hdHRpbmcgY29udGV4dCwgdGhlIGF2YWlsYWJsZSBob3Jpem9udGFsIHNwYWNlIGdl
dHMgc2hydW5rIGJ5IHRoZSBmbG9hdCAoIzQpCi0gICAgLy8gNC4gVGhlIHRhYmxlIHdyYXBwZXIg
Ym94J3MgdXNlZCB3aWR0aCBjb21wdXRlcyB0byA1MDBweCAtIDEwMHB4IC0+IDQwMHB4OwotICAg
IC8vCi0gICAgLy8gTm93IHdlIGFyZSBpbnNpZGUgdGhlIEJGQyBlc3RhYmxpc2hlZCBieSB0aGUg
dGFibGUgd3JhcHBlciBib3ggYW5kIHRyeSB0byByZXNvbHZlIHRoZSB0YWJsZSdzIHdpZHRoIC0+
ICUxMC4KLSAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIG5vcm1hbCBCRkMgcnVsZXMsIGl0IHNob3Vs
ZCBjb21wdXRlIHRvIDEwJSBvZiB0aGUgY29udGFpbmluZyBibG9jaydzIGxvZ2ljYWwgd2lkdGg6
IDQwMHB4IC0+IDQwcHguCi0gICAgLy8gSG93ZXZlciBpbiBwcmFjdGljZSBpdCBjb21wdXRlcyB0
byA1MHB4ICgxMCUgb2YgNTAwcHgpLgotICAgIC8vIFNpbWlsYXIgc2V0dXAgd2l0aCBub24tdGFi
bGUgY29udGVudCB3b3VsZCByZXNvbHZlIHRoZSBpbm5lciBibG9jayBsZXZlbCBib3gncyB3aWR0
aCB0byA0MHB4OwotICAgIC8vIFRoaXMgbmVlZHMgY2xhcmlmaWNhdGlvbiBpbiB0aGUgc3BlYy4K
LSAgICBhdXRvIGhvcml6b250YWxDb25zdHJhaW50Rm9yUmVzb2x2aW5nV2lkdGggPSBtX2hvcml6
b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxvYXRzLmxvZ2ljYWxXaWR0aDsKLSAgICBhdXRvIGdl
b21ldHJ5ID0gdGhpcy0+Z2VvbWV0cnkoKTsKLSAgICBhdXRvIGNvbXB1dGVkV2lkdGggPSBnZW9t
ZXRyeS5jb21wdXRlZFdpZHRoKHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29s
dmluZ1dpZHRoKTsKLSAgICBhdXRvIGNvbXB1dGVkTWF4V2lkdGggPSBnZW9tZXRyeS5jb21wdXRl
ZE1heFdpZHRoKHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRo
KTsKLSAgICBhdXRvIGNvbXB1dGVkTWluV2lkdGggPSBnZW9tZXRyeS5jb21wdXRlZE1pbldpZHRo
KHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRoKTsKLSAgICAv
LyBVc2UgdGhlIGdlbmVyaWMgc2hyaW5rLXRvLWZpdC13aWR0aCBsb2dpYyBhcyB0aGUgaW5pdGlh
bCB3aWR0aCBmb3IgdGhlIHRhYmxlLgotICAgIGF1dG8gdXNlZFdpZHRoID0gc3RkOjptaW4oc3Rk
OjptYXgoaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtLCBhdmFpbGFibGVIb3Jpem9u
dGFsU3BhY2UpLCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0pOwotICAgIGlmIChj
b21wdXRlZFdpZHRoIHx8IGNvbXB1dGVkTWluV2lkdGggfHwgY29tcHV0ZWRNYXhXaWR0aCkgewot
ICAgICAgICBpZiAoY29tcHV0ZWRXaWR0aCkgewotICAgICAgICAgICAgLy8gTm9ybWFsaXplIHRo
ZSBjb21wdXRlZCB3aWR0aCB2YWx1ZSBmaXJzdC4KLSAgICAgICAgICAgIGlmIChjb21wdXRlZE1h
eFdpZHRoICYmICpjb21wdXRlZFdpZHRoID4gKmNvbXB1dGVkTWF4V2lkdGgpCi0gICAgICAgICAg
ICAgICAgY29tcHV0ZWRXaWR0aCA9IGNvbXB1dGVkTWF4V2lkdGg7Ci0gICAgICAgICAgICBpZiAo
Y29tcHV0ZWRNaW5XaWR0aCAmJiAqY29tcHV0ZWRXaWR0aCA8ICpjb21wdXRlZE1pbldpZHRoKQot
ICAgICAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggPSBjb21wdXRlZE1pbldpZHRoOwotICAgICAg
ICAgICAgdXNlZFdpZHRoID0gKmNvbXB1dGVkV2lkdGggPCBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzLm1pbmltdW0gPyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0gOiAqY29tcHV0
ZWRXaWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21wdXRlZE1heFdpZHRoICYmICpj
b21wdXRlZE1heFdpZHRoIDwgdXNlZFdpZHRoKQotICAgICAgICAgICAgdXNlZFdpZHRoID0gaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtOwotICAgICAgICBpZiAoY29tcHV0ZWRNaW5X
aWR0aCAmJiAqY29tcHV0ZWRNaW5XaWR0aCA+IHVzZWRXaWR0aCkKLSAgICAgICAgICAgIHVzZWRX
aWR0aCA9ICpjb21wdXRlZE1pbldpZHRoOwotICAgIH0KLQotICAgIGF1dG8gY29udGVudFdpZHRo
QW5kTWFyZ2luID0gZ2VvbWV0cnkuaW5GbG93Q29udGVudFdpZHRoQW5kTWFyZ2luKHRhYmxlQm94
LCBob3Jpem9udGFsQ29uc3RyYWludHMsIE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzIHsgdXNl
ZFdpZHRoLCB7IH0gfSk7Ci0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0
ZSgpLmJveEdlb21ldHJ5KHRhYmxlQm94KTsKLSAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94
V2lkdGgoY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCk7Ci0gICAgYm94R2VvbWV0
cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2lu
LnN0YXJ0LCBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgfSk7Ci19Ci0KLXZv
aWQgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUhlaWdodEFuZE1h
cmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gsIGNvbnN0IENvbnN0
cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgQVNTRVJUKHRhYmxl
Qm94LmlzVGFibGVCb3goKSk7Ci0gICAgLy8gVGFibGUgaXMgYSBzcGVjaWFsIEJGQyBjb250ZW50
LiBJdHMgaGVpZ2h0IGlzIG1haW5seSBkcml2ZW4gYnkgdGhlIGNvbnRlbnQuIENvbXB1dGVkIGhl
aWdodCwgbWluLWhlaWdodCBhbmQgbWF4LWhlaWdodCBhcmUgYWxsCi0gICAgLy8gYWxyZWFkeSBi
ZWVuIHRha2VuIGludG8gYWNjb3VudCBkdXJpbmcgdGhlIFRGQyBsYXlvdXQuCi0gICAgYXV0byBo
ZWlnaHRBbmRNYXJnaW4gPSBnZW9tZXRyeSgpLmluRmxvd0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4o
dGFibGVCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIHsgcXVpcmtzKCkub3ZlcnJpZGRlblRh
YmxlSGVpZ2h0KHRhYmxlQm94KSB9KTsKLQotICAgIGF1dG8gbWFyZ2luQ29sbGFwc2UgPSB0aGlz
LT5tYXJnaW5Db2xsYXBzZSgpOwotICAgIGF1dG8gdmVydGljYWxNYXJnaW4gPSBtYXJnaW5Db2xs
YXBzZS5jb2xsYXBzZWRWZXJ0aWNhbFZhbHVlcyh0YWJsZUJveCwgaGVpZ2h0QW5kTWFyZ2luLm5v
bkNvbGxhcHNlZE1hcmdpbik7Ci0gICAgLy8gQ2FjaGUgdGhlIGNvbXB1dGVkIHBvc2l0aXZlIGFu
ZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWUgcGFpci4KLSAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRV
c2VkVmVydGljYWxNYXJnaW4odGFibGVCb3gsIHZlcnRpY2FsTWFyZ2luKTsKLQotICAgIGF1dG8m
IGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkodGFibGVCb3gpOwot
ICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3AodmVydGljYWxQb3NpdGlvbldpdGhNYXJnaW4o
dGFibGVCb3gsIHZlcnRpY2FsTWFyZ2luLCBjb25zdHJhaW50cy52ZXJ0aWNhbCkpOwotICAgIGJv
eEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoaGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWln
aHQpOwotICAgIGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgbWFyZ2luQmVmb3JlKHZl
cnRpY2FsTWFyZ2luKSwgbWFyZ2luQWZ0ZXIodmVydGljYWxNYXJnaW4pIH0pOwotICAgIC8vIEFk
anVzdCB0aGUgcHJldmlvdXMgc2libGluZydzIG1hcmdpbiBib3R0b20gbm93IHRoYXQgdGhpcyBi
b3gncyB2ZXJ0aWNhbCBtYXJnaW4gaXMgY29tcHV0ZWQuCi0gICAgTWFyZ2luQ29sbGFwc2U6OnVw
ZGF0ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nKCp0aGlzLCBtYXJnaW5Db2xsYXBzZSwg
dGFibGVCb3gpOwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tG
b3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGlu
Zy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oCmRlbGV0
ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGVhMTU3Y2M1MjE2Zjg4NGZkMjg5ODM0YTNjODY2
OTUzNzQyN2E1Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxl
V3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICsw
LDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0g
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAot
ICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0g
KiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICog
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9S
TUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgot
I2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNw
YWNlIExheW91dCB7Ci0KLS8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgc3BlY2lhbCBibG9j
ayBmb3JtYXR0aW5nIGNvbnRleHQgbGF5b3V0IGxvZ2ljIGZvciB0aGUgdGFibGUgd3JhcHBlci4K
LS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi90YWJsZXMuaHRtbCNtb2RlbAotY2xhc3Mg
VGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCBmaW5hbCA6IHB1YmxpYyBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0IHsKLSAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKFRhYmxlV3JhcHBl
ckJsb2NrRm9ybWF0dGluZ0NvbnRleHQpOwotcHVibGljOgotICAgIFRhYmxlV3JhcHBlckJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJv
b3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJik7Ci0KLSAgICB2b2lkIGxheW91dEluRmxvd0NvbnRl
bnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQm
KSBmaW5hbDsKLQotICAgIHZvaWQgc2V0SG9yaXpvbnRhbENvbnN0cmFpbnRzSWdub3JpbmdGbG9h
dHMoY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIHsg
bV9ob3Jpem9udGFsQ29uc3RyYWludHNJZ25vcmluZ0Zsb2F0cyA9IGhvcml6b250YWxDb25zdHJh
aW50czsgfQotCi1wcml2YXRlOgotICAgIGNsYXNzIFF1aXJrcyA6IHB1YmxpYyBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0OjpRdWlya3MgewotICAgIHB1YmxpYzoKLSAgICAgICAgUXVpcmtzKGNvbnN0
IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsKLQotICAgICAgICBPcHRpb25h
bDxMYXlvdXRVbml0PiBvdmVycmlkZGVuVGFibGVIZWlnaHQoY29uc3QgQ29udGFpbmVyQm94JiB0
YWJsZUJveCkgY29uc3Q7Ci0gICAgfTsKLSAgICBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4gUXVpcmtzKCp0aGlzKTsgfQot
Ci0gICAgdm9pZCBsYXlvdXRUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBj
b25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsKLQotICAgIHZvaWQgY29tcHV0ZUJv
cmRlckFuZFBhZGRpbmdGb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmLCBjb25zdCBIb3Jp
em9udGFsQ29uc3RyYWludHMmKTsKLSAgICB2b2lkIGNvbXB1dGVXaWR0aEFuZE1hcmdpbkZvclRh
YmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYp
OwotICAgIHZvaWQgY29tcHV0ZUhlaWdodEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRh
aW5lckJveCYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOwotCi1wcml2YXRl
OgotICAgIEhvcml6b250YWxDb25zdHJhaW50cyBtX2hvcml6b250YWxDb25zdHJhaW50c0lnbm9y
aW5nRmxvYXRzOwotfTsKLQotaW5saW5lIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6OlF1aXJrczo6UXVpcmtzKGNvbnN0IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQmIGZvcm1hdHRpbmdDb250ZXh0KQotICAgIDogQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVp
cmtzKGZvcm1hdHRpbmdDb250ZXh0KQotewotfQotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9U
UkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0LCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSkKLQotI2Vu
ZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL3Rh
Ymxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxl
V3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCBlYWRhOTJlZDI4Zjc5N2YzYjgyNmIwZmI5MTU0MjVlYjc4OWJiOTk1Li4w
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBA
QAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJUYWJsZVdyYXBw
ZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJ
TkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkxheW91dFN0YXRlLmgiCi0KLW5hbWVzcGFjZSBXZWJD
b3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1PcHRpb25hbDxMYXlvdXRVbml0PiBUYWJsZVdy
YXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6Om92ZXJyaWRkZW5UYWJsZUhlaWdo
dChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KSBjb25zdAotewotICAgIGlmIChsYXlvdXRT
dGF0ZSgpLmluUXVpcmtzTW9kZSgpKSB7Ci0gICAgICAgIC8vIEluIHF1aXJrcyBtb2RlIGFsd2F5
cyB1c2UgdGhlIGNvbnRlbnQgaGVpZ2h0LiBOb3RlIHRoYXQgdGhlIHRhYmxlcyB3aXRoIGNvbnRl
bnQgdGFrZSBjb21wdXRlZCB2YWx1ZXMgaW50byBhY2NvdW50LgotICAgICAgICByZXR1cm4gZ2Vv
bWV0cnkoKS5jb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KHRhYmxlQm94KTsK
LSAgICB9Ci0gICAgcmV0dXJuIHRhYmxlQm94Lmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpID8g
Z2VvbWV0cnkoKS5jb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KHRhYmxlQm94
KSA6IE9wdGlvbmFsPExheW91dFVuaXQ+IHsgfTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGlu
Z0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhG
b3JtYXR0aW5nQ29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNTdm
ZDY5OTA0Mjg2OTdlODVkMTcxZjZkM2FjOGQ1ODdhY2FjZjguLjAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3Jt
YXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMg
KzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0g
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
LSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
Ci0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
LSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0g
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJGbGV4
Rm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQotCi0jaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIklubGlu
ZVJlY3QuaCIKLSNpbmNsdWRlICJJbnZhbGlkYXRpb25TdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91
dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q2hpbGRJdGVyYXRvci5oIgotI2luY2x1
ZGUgIkxheW91dENvbnRleHQuaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgot
Ci1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNP
X0FMTE9DQVRFRF9JTVBMKEZsZXhGb3JtYXR0aW5nQ29udGV4dCk7Ci0KLUZsZXhGb3JtYXR0aW5n
Q29udGV4dDo6RmxleEZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0
dGluZ0NvbnRleHRSb290LCBGbGV4Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCi0g
ICAgOiBGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdT
dGF0ZSkKLXsKLX0KLQotdm9pZCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dEluRmxvd0Nv
bnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRl
bnQmIGNvbnN0cmFpbnRzKQotewotICAgIGNvbXB1dGVJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
Rm9yRmxleEl0ZW1zKCk7Ci0gICAgc2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0cmFpbnRzKTsK
LX0KLQotTGF5b3V0VW5pdCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OnVzZWRDb250ZW50SGVpZ2h0
KCkgY29uc3QKLXsKLSAgICBhdXRvJiBsaW5lcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmxpbmVzKCk7
Ci0gICAgcmV0dXJuIExheW91dFVuaXQgeyBsaW5lcy5sYXN0KCkuYm90dG9tKCkgLSBsaW5lcy5m
aXJzdCgpLnRvcCgpIH07Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzIEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzKCkKLXsKLSAgICByZXR1cm4geyB9OwotfQotCi12b2lkIEZsZXhGb3JtYXR0aW5n
Q29udGV4dDo6c2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93
Q29udGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhp
cy0+Zm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgYXV0byBnZW9tZXRyeSA9IHRoaXMtPmdlb21ldHJ5
KCk7Ci0gICAgYXV0byBmbGV4SXRlbU1haW5BeGlzU3RhcnQgPSBjb25zdHJhaW50cy5ob3Jpem9u
dGFsLmxvZ2ljYWxMZWZ0OwotICAgIGF1dG8gZmxleEl0ZW1NYWluQXhpc0VuZCA9IGZsZXhJdGVt
TWFpbkF4aXNTdGFydDsKLSAgICBhdXRvIGZsZXhJdGVtQ3Jvc0F4aXNTdGFydCA9IGNvbnN0cmFp
bnRzLnZlcnRpY2FsLmxvZ2ljYWxUb3A7Ci0gICAgYXV0byBmbGV4SXRlbUNyb3NBeGlzRW5kID0g
ZmxleEl0ZW1Dcm9zQXhpc1N0YXJ0OwotICAgIGZvciAoYXV0byYgZmxleEl0ZW0gOiBjaGlsZHJl
bk9mVHlwZTxDb250YWluZXJCb3g+KHJvb3QoKSkpIHsKLSAgICAgICAgQVNTRVJUKGZsZXhJdGVt
LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlz
IGlzIGp1c3QgYSBzaW1wbGUsIGxldCdzIGxheW91dCB0aGUgZmxleCBpdGVtcyBhbmQgcGxhY2Ug
dGhlbSBuZXh0IHRvIGVhY2ggb3RoZXIgc2V0dXAuCi0gICAgICAgIGF1dG8gaW50cmluc2ljV2lk
dGhzID0gZm9ybWF0dGluZ1N0YXRlLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goZmxl
eEl0ZW0pOwotICAgICAgICBhdXRvIGZsZXhJdGVtTG9naWNhbFdpZHRoID0gc3RkOjptaW4oc3Rk
OjptYXgoaW50cmluc2ljV2lkdGhzLT5taW5pbXVtLCBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxv
Z2ljYWxXaWR0aCksIGludHJpbnNpY1dpZHRocy0+bWF4aW11bSk7Ci0gICAgICAgIGF1dG8gZmxl
eEl0ZW1Db25zdHJhaW50cyA9IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCB7IHsgeyB9LCBm
bGV4SXRlbUxvZ2ljYWxXaWR0aCB9LCB7IH0gfTsKLQotICAgICAgICBhdXRvIGludmFsaWRhdGlv
blN0YXRlID0gSW52YWxpZGF0aW9uU3RhdGUgeyB9OwotICAgICAgICBMYXlvdXRDb250ZXh0Ojpj
cmVhdGVGb3JtYXR0aW5nQ29udGV4dChmbGV4SXRlbSwgbGF5b3V0U3RhdGUoKSktPmxheW91dElu
Rmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGZsZXhJdGVtQ29uc3RyYWludHMpOwotCi0g
ICAgICAgIGF1dG8gY29tcHV0ZUZsZXhJdGVtR2VvbWV0cnkgPSBbJl0gewotICAgICAgICAgICAg
YXV0byYgZmxleEl0ZW1HZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShmbGV4
SXRlbSk7Ci0KLSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQo
TGF5b3V0UG9pbnQgeyBmbGV4SXRlbU1haW5BeGlzRW5kLCBmbGV4SXRlbUNyb3NBeGlzU3RhcnQg
fSk7Ci0KLSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0Qm9yZGVyKGdlb21ldHJ5LmNv
bXB1dGVkQm9yZGVyKGZsZXhJdGVtKSk7Ci0gICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNl
dFBhZGRpbmcoZ2VvbWV0cnkuY29tcHV0ZWRQYWRkaW5nKGZsZXhJdGVtLCBjb25zdHJhaW50cy5o
b3Jpem9udGFsLmxvZ2ljYWxXaWR0aCkpOwotCi0gICAgICAgICAgICBhdXRvIGNvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihmbGV4SXRl
bSwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5
LnNldEhvcml6b250YWxNYXJnaW4oeyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFs
dWVPcigwX2x1KSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDBfbHUpIH0p
OwotCi0gICAgICAgICAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBnZW9tZXRyeS5j
b21wdXRlZFZlcnRpY2FsTWFyZ2luKGZsZXhJdGVtLCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsK
LSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyBjb21wdXRl
ZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDBfbHUpLCBjb21wdXRlZFZlcnRpY2FsTWFy
Z2luLmFmdGVyLnZhbHVlT3IoMF9sdSkgfSk7Ci0KLSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0
cnkuc2V0Q29udGVudEJveEhlaWdodChnZW9tZXRyeS5jb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGlu
Z0NvbnRleHRSb290KGZsZXhJdGVtKSk7Ci0gICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNl
dENvbnRlbnRCb3hXaWR0aChmbGV4SXRlbUxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgICAgICBmbGV4
SXRlbU1haW5BeGlzRW5kPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChmbGV4SXRlbUdlb21l
dHJ5KS5yaWdodCgpOwotICAgICAgICAgICAgZmxleEl0ZW1Dcm9zQXhpc0VuZCA9IHN0ZDo6bWF4
KGZsZXhJdGVtQ3Jvc0F4aXNFbmQsIEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGZsZXhJdGVt
R2VvbWV0cnkpLmJvdHRvbSgpKTsKLSAgICAgICAgfTsKLSAgICAgICAgY29tcHV0ZUZsZXhJdGVt
R2VvbWV0cnkoKTsKLSAgICB9Ci0gICAgYXV0byBmbGV4TGluZSA9IElubGluZVJlY3QgeyBmbGV4
SXRlbUNyb3NBeGlzU3RhcnQsIGZsZXhJdGVtTWFpbkF4aXNTdGFydCwgZmxleEl0ZW1NYWluQXhp
c0VuZCAtIGZsZXhJdGVtTWFpbkF4aXNTdGFydCwgZmxleEl0ZW1Dcm9zQXhpc0VuZCAtIGZsZXhJ
dGVtQ3Jvc0F4aXNTdGFydCB9OwotICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lKGZsZXhMaW5l
KTsKLX0KLQotdm9pZCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzRm9yRmxleEl0ZW1zKCkKLXsKLSAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUg
PSB0aGlzLT5mb3JtYXR0aW5nU3RhdGUoKTsKLSAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2Vv
bWV0cnkoKTsKLSAgICBmb3IgKGF1dG8mIGZsZXhJdGVtIDogY2hpbGRyZW5PZlR5cGU8Q29udGFp
bmVyQm94Pihyb290KCkpKSB7Ci0gICAgICAgIGlmIChmb3JtYXR0aW5nU3RhdGUuaW50cmluc2lj
V2lkdGhDb25zdHJhaW50c0ZvckJveChmbGV4SXRlbSkpCi0gICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgZm9ybWF0dGluZ1N0YXRlLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JC
b3goZmxleEl0ZW0sIGdlb21ldHJ5LmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoZmxleEl0ZW0p
KTsKLSAgICB9Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmgKZGVs
ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTBlNDA2OWZmZDEwMjk2ODhjYzUxNmNmZDk1
OTBjY2M5MzY1MmIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0t
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29u
dGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
QykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFn
bWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNs
dWRlICJGbGV4Rm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQu
aCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKLS8vIFRoaXMgY2xh
c3MgaW1wbGVtZW50cyB0aGUgbGF5b3V0IGxvZ2ljIGZvciBmbGV4IGZvcm1hdHRpbmcgY29udGV4
dHMuCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWZsZXhib3gtMS8KLWNsYXNzIEZsZXhG
b3JtYXR0aW5nQ29udGV4dCBmaW5hbCA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dCB7Ci0gICAg
V1RGX01BS0VfSVNPX0FMTE9DQVRFRChGbGV4Rm9ybWF0dGluZ0NvbnRleHQpOwotcHVibGljOgot
ICAgIEZsZXhGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdD
b250ZXh0Um9vdCwgRmxleEZvcm1hdHRpbmdTdGF0ZSYpOwotICAgIHZvaWQgbGF5b3V0SW5GbG93
Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29u
dGVudCYpIG92ZXJyaWRlOwotICAgIExheW91dFVuaXQgdXNlZENvbnRlbnRIZWlnaHQoKSBjb25z
dCBvdmVycmlkZTsKLQotICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhp
cyBjbGFzcyBpbXBsZW1lbnRzIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcgZm9yIGZsZXggaXRlbXMu
Ci0gICAgY2xhc3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5
IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEdlb21ldHJ5KGNvbnN0IEZsZXhGb3JtYXR0aW5nQ29u
dGV4dCYpOwotCi0gICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cyhjb25zdCBDb250YWluZXJCb3gmKTsKLQotICAgIHByaXZhdGU6Ci0gICAg
ICAgIGNvbnN0IEZsZXhGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25z
dCB7IHJldHVybiBkb3duY2FzdDxGbGV4Rm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeTo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KLSAgICB9OwotICAgIEZsZXhG
b3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBHZW9t
ZXRyeSgqdGhpcyk7IH0KLQotICAgIHZvaWQgc2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0IENv
bnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOwotICAgIHZvaWQgY29tcHV0ZUludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHNGb3JGbGV4SXRlbXMoKTsKLQotICAgIGNvbnN0IEZsZXhGb3JtYXR0aW5n
U3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEZsZXhGb3Jt
YXR0aW5nU3RhdGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KLSAg
ICBGbGV4Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3duY2Fz
dDxGbGV4Rm9ybWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRl
KCkpOyB9Ci19OwotCi1pbmxpbmUgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6R2Vv
bWV0cnkoY29uc3QgRmxleEZvcm1hdHRpbmdDb250ZXh0JiBmbGV4Rm9ybWF0dGluZ0NvbnRleHQp
Ci0gICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkoZmxleEZvcm1hdHRpbmdDb250ZXh0
KQotewotfQotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJ
TkdfQ09OVEVYVChGbGV4Rm9ybWF0dGluZ0NvbnRleHQsIGlzRmxleEZvcm1hdHRpbmdDb250ZXh0
KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3Jt
YXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjN2M4ZGQwOTgwOWQxZDBiNTg0YWJmZjc4
ZGQxNzkxYmZmNDY4OTguLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5n
Q29udGV4dEdlb21ldHJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
LSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdDb250
ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1
ZGUgIkZsZXhGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5o
IgotI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFt
ZXNwYWNlIExheW91dCB7Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzIEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMoY29uc3QgQ29udGFpbmVyQm94JiBmbGV4SXRlbSkKLXsKLSAgICBhdXRvIGZpeGVk
TWFyZ2luQm9yZGVyQW5kUGFkZGluZyA9IFsmXShhdXRvJiBsYXlvdXRCb3gpIHsKLSAgICAgICAg
YXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICAgICAgcmV0dXJuIGZpeGVkVmFs
dWUoc3R5bGUubWFyZ2luU3RhcnQoKSkudmFsdWVPcigwKQotICAgICAgICAgICAgKyBMYXlvdXRV
bml0IHsgc3R5bGUuYm9yZGVyTGVmdFdpZHRoKCkgfQotICAgICAgICAgICAgKyBmaXhlZFZhbHVl
KHN0eWxlLnBhZGRpbmdMZWZ0KCkpLnZhbHVlT3IoMCkKLSAgICAgICAgICAgICsgZml4ZWRWYWx1
ZShzdHlsZS5wYWRkaW5nUmlnaHQoKSkudmFsdWVPcigwKQotICAgICAgICAgICAgKyBMYXlvdXRV
bml0IHsgc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCgpIH0KLSAgICAgICAgICAgICsgZml4ZWRWYWx1
ZShzdHlsZS5tYXJnaW5FbmQoKSkudmFsdWVPcigwKTsKLSAgICB9OwotCi0gICAgYXV0byBjb21w
dXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBbJl0oKSAtPiBJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzIHsKLSAgICAgICAgYXV0byBsb2dpY2FsV2lkdGggPSBmbGV4SXRlbS5zdHlsZSgp
LmxvZ2ljYWxXaWR0aCgpOwotICAgICAgICAvLyBNaW5pbXVtL21heGltdW0gd2lkdGggY2FuJ3Qg
YmUgZGVwZW5kaW5nIG9uIHRoZSBjb250YWluaW5nIGJsb2NrJ3Mgd2lkdGguCi0gICAgICAgIGF1
dG8gbmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRoID0gbG9naWNhbFdpZHRoLmlzQ2Fs
Y3VsYXRlZCgpIHx8IGxvZ2ljYWxXaWR0aC5pc1BlcmNlbnQoKSB8fCBsb2dpY2FsV2lkdGguaXNS
ZWxhdGl2ZSgpOwotICAgICAgICBpZiAobmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRo
KQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgICAgICBpZiAoYXV0byB3aWR0aCA9IGZp
eGVkVmFsdWUobG9naWNhbFdpZHRoKSkKLSAgICAgICAgICAgIHJldHVybiB7ICp3aWR0aCwgKndp
ZHRoIH07Ci0KLSAgICAgICAgQVNTRVJUKGZsZXhJdGVtLmVzdGFibGlzaGVzRm9ybWF0dGluZ0Nv
bnRleHQoKSk7Ci0gICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IExheW91
dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGZsZXhJdGVtLCBsYXlvdXRTdGF0ZSgp
KS0+Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGlmIChsb2dp
Y2FsV2lkdGguaXNNaW5Db250ZW50KCkpCi0gICAgICAgICAgICByZXR1cm4geyBpbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzLm1pbmltdW0sIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11
bSB9OwotICAgICAgICBpZiAobG9naWNhbFdpZHRoLmlzTWF4Q29udGVudCgpKQotICAgICAgICAg
ICAgcmV0dXJuIHsgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtLCBpbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzLm1heGltdW0gfTsKLSAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRo
Q29uc3RyYWludHM7Ci0gICAgfTsKLSAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMg
PSBjb25zdHJhaW5CeU1pbk1heFdpZHRoKGZsZXhJdGVtLCBjb21wdXRlZEludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMoKSk7Ci0gICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQoZml4
ZWRNYXJnaW5Cb3JkZXJBbmRQYWRkaW5nKGZsZXhJdGVtKSk7Ci0gICAgcmV0dXJuIGludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHM7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0
ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWZjODVhMDM4NTJkMzM1MjYx
Mzg0MGYzMTIyYzczM2M1NGZhYTAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3Jt
YXR0aW5nU3RhdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0g
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQot
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJGbGV4Rm9ybWF0dGluZ1N0YXRlLmgi
Ci0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgPHd0
Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoRmxleEZvcm1hdHRpbmdTdGF0
ZSk7Ci0KLUZsZXhGb3JtYXR0aW5nU3RhdGU6OkZsZXhGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0
aW5nU3RhdGU+JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQotICAg
IDogRm9ybWF0dGluZ1N0YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OkZsZXgsIGxh
eW91dFN0YXRlKQotewotfQotCi1GbGV4Rm9ybWF0dGluZ1N0YXRlOjp+RmxleEZvcm1hdHRpbmdT
dGF0ZSgpCi17Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3RhdGUuaCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ1N0YXRlLmgKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjNiOWRhMmE1YjhkYzI3MDIwODc5NGE0ODM2NTQ0MTYw
OWUzYTMuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3RhdGUuaAor
KysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
Ci0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
LSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UK
LQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiRm9y
bWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiSW5saW5lUmVjdC5oIgotI2luY2x1ZGUgPHd0Zi9J
c29NYWxsb2MuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0K
LWNsYXNzIEZsZXhGb3JtYXR0aW5nU3RhdGUgOiBwdWJsaWMgRm9ybWF0dGluZ1N0YXRlIHsKLSAg
ICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKEZsZXhGb3JtYXR0aW5nU3RhdGUpOwotcHVibGljOgot
ICAgIEZsZXhGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRl
Jik7Ci0gICAgfkZsZXhGb3JtYXR0aW5nU3RhdGUoKTsKLQotICAgIGNvbnN0IGF1dG8mIGxpbmVz
KCkgY29uc3QgeyByZXR1cm4gbV9saW5lczsgfQotICAgIHZvaWQgYWRkTGluZShjb25zdCBJbmxp
bmVSZWN0JiBsaW5lKSB7IG1fbGluZXMuYXBwZW5kKGxpbmUpOyB9Ci0KLXByaXZhdGU6Ci0gICAg
VmVjdG9yPElubGluZVJlY3Q+IG1fbGluZXM7Ci19OwotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQ
RV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUoRmxleEZvcm1hdHRpbmdTdGF0ZSwgaXNG
bGV4Rm9ybWF0dGluZ1N0YXRlKCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9Gb3JtYXR0aW5nQ29udGV4dC5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL0Zvcm1hdHRpbmdDb250ZXh0LmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi45ODU3ZGJhMmM3ZDY1Mjk2MGM0MTFmYWJjYTM1NzU4Njk1YmExMTI4Ci0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9Gb3JtYXR0aW5nQ29udGV4dC5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lm
IEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRm9ybWF0dGlu
Z1N0YXRlLmgiCisjaW5jbHVkZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlv
dXRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91
dENvbnRhaW5lckJveC5oIgorI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKKyNpbmNsdWRlICJM
YXlvdXREZXNjZW5kYW50SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFp
bmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiTGF5b3V0UmVwbGFjZWRCb3guaCIKKyNpbmNsdWRlICJM
YXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFs
bG9jSW5saW5lcy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FU
RURfSU1QTChGb3JtYXR0aW5nQ29udGV4dCk7CisKK0Zvcm1hdHRpbmdDb250ZXh0OjpGb3JtYXR0
aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgRm9y
bWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCisgICAgOiBtX3Jvb3QobWFrZVdlYWtQdHIo
Zm9ybWF0dGluZ0NvbnRleHRSb290KSkKKyAgICAsIG1fZm9ybWF0dGluZ1N0YXRlKGZvcm1hdHRp
bmdTdGF0ZSkKK3sKKyAgICBBU1NFUlQoZm9ybWF0dGluZ0NvbnRleHRSb290Lmhhc0NoaWxkKCkp
OworI2lmbmRlZiBOREVCVUcKKyAgICBsYXlvdXRTdGF0ZSgpLnJlZ2lzdGVyRm9ybWF0dGluZ0Nv
bnRleHQoKnRoaXMpOworI2VuZGlmCit9CisKK0Zvcm1hdHRpbmdDb250ZXh0Ojp+Rm9ybWF0dGlu
Z0NvbnRleHQoKQoreworI2lmbmRlZiBOREVCVUcKKyAgICBsYXlvdXRTdGF0ZSgpLmRlcmVnaXN0
ZXJGb3JtYXR0aW5nQ29udGV4dCgqdGhpcyk7CisjZW5kaWYKK30KKworTGF5b3V0U3RhdGUmIEZv
cm1hdHRpbmdDb250ZXh0OjpsYXlvdXRTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZm9y
bWF0dGluZ1N0YXRlLmxheW91dFN0YXRlKCk7Cit9CisKK3ZvaWQgRm9ybWF0dGluZ0NvbnRleHQ6
OmNvbXB1dGVPdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkoY29uc3QgQm94JiBsYXlvdXRCb3gs
IGNvbnN0IENvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCYgY29uc3RyYWludHMpCit7Cisg
ICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisgICAgYXV0byBj
b21wdXRlID0gWyZdKE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRXaWR0aCkgeworICAgICAgICBy
ZXR1cm4gZ2VvbWV0cnkoKS5vdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkobGF5b3V0Qm94LCBj
b25zdHJhaW50cy5ob3Jpem9udGFsLCBjb25zdHJhaW50cy52ZXJ0aWNhbCwgeyB1c2VkV2lkdGgs
IHsgfSB9KTsKKyAgICB9OworCisgICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGNvbnN0
cmFpbnRzLmhvcml6b250YWwubG9naWNhbFdpZHRoOworICAgIGF1dG8gaG9yaXpvbnRhbEdlb21l
dHJ5ID0gY29tcHV0ZSh7IH0pOworICAgIGlmIChhdXRvIG1heFdpZHRoID0gZ2VvbWV0cnkoKS5j
b21wdXRlZE1heFdpZHRoKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpKSB7CisgICAg
ICAgIGF1dG8gbWF4SG9yaXpvbnRhbEdlb21ldHJ5ID0gY29tcHV0ZShtYXhXaWR0aCk7CisgICAg
ICAgIGlmIChob3Jpem9udGFsR2VvbWV0cnkuY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRX
aWR0aCA+IG1heEhvcml6b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVu
dFdpZHRoKQorICAgICAgICAgICAgaG9yaXpvbnRhbEdlb21ldHJ5ID0gbWF4SG9yaXpvbnRhbEdl
b21ldHJ5OworICAgIH0KKworICAgIGlmIChhdXRvIG1pbldpZHRoID0gZ2VvbWV0cnkoKS5jb21w
dXRlZE1pbldpZHRoKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpKSB7CisgICAgICAg
IGF1dG8gbWluSG9yaXpvbnRhbEdlb21ldHJ5ID0gY29tcHV0ZShtaW5XaWR0aCk7CisgICAgICAg
IGlmIChob3Jpem9udGFsR2VvbWV0cnkuY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0
aCA8IG1pbkhvcml6b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdp
ZHRoKQorICAgICAgICAgICAgaG9yaXpvbnRhbEdlb21ldHJ5ID0gbWluSG9yaXpvbnRhbEdlb21l
dHJ5OworICAgIH0KKworICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCku
Ym94R2VvbWV0cnkobGF5b3V0Qm94KTsKKyAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsTGVmdCho
b3Jpem9udGFsR2VvbWV0cnkubGVmdCArIGhvcml6b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhB
bmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCk7CisgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJv
eFdpZHRoKGhvcml6b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdp
ZHRoKTsKKyAgICBhdXRvJiB1c2VkSG9yaXpvbnRhbE1hcmdpbiA9IGhvcml6b250YWxHZW9tZXRy
eS5jb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbjsKKyAgICBib3hHZW9tZXRyeS5zZXRI
b3Jpem9udGFsTWFyZ2luKHsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQsIHVzZWRIb3Jpem9u
dGFsTWFyZ2luLmVuZCB9KTsKK30KKwordm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZU91
dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0
cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgQVNTRVJUKGxh
eW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisgICAgYXV0byBjb21wdXRlID0gWyZd
KE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRIZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIGdlb21l
dHJ5KCkub3V0T2ZGbG93VmVydGljYWxHZW9tZXRyeShsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhv
cml6b250YWwsIGNvbnN0cmFpbnRzLnZlcnRpY2FsLCB7IHVzZWRIZWlnaHQgfSk7CisgICAgfTsK
KworICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gKmNvbnN0cmFpbnRzLnZlcnRpY2Fs
LmxvZ2ljYWxIZWlnaHQ7CisgICAgYXV0byB2ZXJ0aWNhbEdlb21ldHJ5ID0gY29tcHV0ZSh7IH0p
OworICAgIGlmIChhdXRvIG1heEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQo
bGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tIZWlnaHQpKSB7CisgICAgICAgIGF1dG8gbWF4VmVy
dGljYWxHZW9tZXRyeSA9IGNvbXB1dGUobWF4SGVpZ2h0KTsKKyAgICAgICAgaWYgKHZlcnRpY2Fs
R2VvbWV0cnkuY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID4gbWF4VmVydGlj
YWxHZW9tZXRyeS5jb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpCisgICAgICAg
ICAgICB2ZXJ0aWNhbEdlb21ldHJ5ID0gbWF4VmVydGljYWxHZW9tZXRyeTsKKyAgICB9CisKKyAg
ICBpZiAoYXV0byBtaW5IZWlnaHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluSGVpZ2h0KGxheW91
dEJveCwgY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSkgeworICAgICAgICBhdXRvIG1pblZlcnRpY2Fs
R2VvbWV0cnkgPSBjb21wdXRlKG1pbkhlaWdodCk7CisgICAgICAgIGlmICh2ZXJ0aWNhbEdlb21l
dHJ5LmNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCA8IG1pblZlcnRpY2FsR2Vv
bWV0cnkuY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KQorICAgICAgICAgICAg
dmVydGljYWxHZW9tZXRyeSA9IG1pblZlcnRpY2FsR2VvbWV0cnk7CisgICAgfQorCisgICAgYXV0
byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gp
OworICAgIGF1dG8gbm9uQ29sbGFwc2VkVmVydGljYWxNYXJnaW4gPSB2ZXJ0aWNhbEdlb21ldHJ5
LmNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luOworICAgIGJveEdlb21l
dHJ5LnNldExvZ2ljYWxUb3AodmVydGljYWxHZW9tZXRyeS50b3AgKyBub25Db2xsYXBzZWRWZXJ0
aWNhbE1hcmdpbi5iZWZvcmUpOworICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQo
dmVydGljYWxHZW9tZXRyeS5jb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpOwor
ICAgIC8vIE1hcmdpbnMgb2YgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJveGVzIGRvIG5vdCBjb2xs
YXBzZS4KKyAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG5vbkNvbGxhcHNlZFZl
cnRpY2FsTWFyZ2luLmJlZm9yZSwgbm9uQ29sbGFwc2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgfSk7
Cit9CisKK3ZvaWQgRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKGNv
bnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250
YWxDb25zdHJhaW50KQoreworICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRl
KCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsKKyAgICBib3hHZW9tZXRyeS5zZXRCb3JkZXIoZ2Vv
bWV0cnkoKS5jb21wdXRlZEJvcmRlcihsYXlvdXRCb3gpKTsKKyAgICBib3hHZW9tZXRyeS5zZXRQ
YWRkaW5nKGdlb21ldHJ5KCkuY29tcHV0ZWRQYWRkaW5nKGxheW91dEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnQubG9naWNhbFdpZHRoKSk7Cit9CisKK3ZvaWQgRm9ybWF0dGluZ0NvbnRleHQ6Omxh
eW91dE91dE9mRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmIGludmFsaWRhdGlvblN0YXRl
LCBjb25zdCBDb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQorewor
ICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJT
dGFydDogbGF5b3V0IG91dC1vZi1mbG93IGNvbnRlbnQgLT4gY29udGV4dDogIiA8PCAmbGF5b3V0
U3RhdGUoKSA8PCAiIHJvb3Q6ICIgPDwgJnJvb3QoKSk7CisKKyAgICBjb2xsZWN0T3V0T2ZGbG93
RGVzY2VuZGFudHNJZk5lZWRlZCgpOworCisgICAgYXV0byBjb25zdHJhaW50c0ZvckxheW91dEJv
eCA9IFsmXSAoY29uc3QgYXV0byYgb3V0T2ZGbG93Qm94KSB7CisgICAgICAgIGF1dG8mIGNvbnRh
aW5pbmdCbG9jayA9IG91dE9mRmxvd0JveC5jb250YWluaW5nQmxvY2soKTsKKyAgICAgICAgcmV0
dXJuICZjb250YWluaW5nQmxvY2sgPT0gJnJvb3QoKSA/IGNvbnN0cmFpbnRzIDogZ2VvbWV0cnko
KS5jb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29udGFpbmluZ0Jsb2NrKTsKKyAgICB9
OworCisgICAgZm9yIChhdXRvJiBvdXRPZkZsb3dCb3ggOiBmb3JtYXR0aW5nU3RhdGUoKS5vdXRP
ZkZsb3dCb3hlcygpKSB7CisgICAgICAgIEFTU0VSVChvdXRPZkZsb3dCb3gtPmVzdGFibGlzaGVz
Rm9ybWF0dGluZ0NvbnRleHQoKSk7CisgICAgICAgIGlmICghaW52YWxpZGF0aW9uU3RhdGUubmVl
ZHNMYXlvdXQoKm91dE9mRmxvd0JveCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICBhdXRvIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzID0gY29uc3RyYWludHNGb3JMYXlvdXRC
b3goKm91dE9mRmxvd0JveCk7CisgICAgICAgIGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRzRm9y
Qm9yZGVyQW5kUGFkZGluZyA9IEhvcml6b250YWxDb25zdHJhaW50cyB7IGNvbnRhaW5pbmdCbG9j
a0NvbnN0cmFpbnRzLmhvcml6b250YWwubG9naWNhbExlZnQsIGNvbnRhaW5pbmdCbG9ja0NvbnN0
cmFpbnRzLmJvcmRlckFuZFBhZGRpbmdDb25zdHJhaW50cyB9OworICAgICAgICBjb21wdXRlQm9y
ZGVyQW5kUGFkZGluZygqb3V0T2ZGbG93Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHNGb3JCb3Jk
ZXJBbmRQYWRkaW5nKTsKKworICAgICAgICBjb21wdXRlT3V0T2ZGbG93SG9yaXpvbnRhbEdlb21l
dHJ5KCpvdXRPZkZsb3dCb3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzKTsKKyAgICAgICAg
YXV0byBvdXRPZkZsb3dCb3hIYXNDb250ZW50ID0gaXM8Q29udGFpbmVyQm94Pigqb3V0T2ZGbG93
Qm94KSAmJiBkb3duY2FzdDxDb250YWluZXJCb3g+KCpvdXRPZkZsb3dCb3gpLmhhc0NoaWxkKCk7
CisgICAgICAgIGlmIChvdXRPZkZsb3dCb3hIYXNDb250ZW50KSB7CisgICAgICAgICAgICBhdXRv
JiBjb250YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KCpvdXRPZkZsb3dCb3gpOwor
ICAgICAgICAgICAgYXV0byBmb3JtYXR0aW5nQ29udGV4dCA9IExheW91dENvbnRleHQ6OmNyZWF0
ZUZvcm1hdHRpbmdDb250ZXh0KGNvbnRhaW5lckJveCwgbGF5b3V0U3RhdGUoKSk7CisgICAgICAg
ICAgICBpZiAoY29udGFpbmVyQm94Lmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQorICAgICAg
ICAgICAgICAgIGZvcm1hdHRpbmdDb250ZXh0LT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRh
dGlvblN0YXRlLCBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb250YWlu
ZXJCb3gpKTsKKyAgICAgICAgICAgIGNvbXB1dGVPdXRPZkZsb3dWZXJ0aWNhbEdlb21ldHJ5KGNv
bnRhaW5lckJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMpOworICAgICAgICAgICAgZm9y
bWF0dGluZ0NvbnRleHQtPmxheW91dE91dE9mRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUs
IGdlb21ldHJ5KCkuY29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50KGNvbnRhaW5lckJveCkp
OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGNvbXB1dGVPdXRPZkZsb3dWZXJ0aWNhbEdl
b21ldHJ5KCpvdXRPZkZsb3dCb3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzKTsKKyAgICB9
CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwg
IkVuZDogbGF5b3V0IG91dC1vZi1mbG93IGNvbnRlbnQgLT4gY29udGV4dDogIiA8PCAmbGF5b3V0
U3RhdGUoKSA8PCAiIHJvb3Q6ICIgPDwgJnJvb3QoKSk7Cit9CisKK2NvbnN0IEJveEdlb21ldHJ5
JiBGb3JtYXR0aW5nQ29udGV4dDo6Z2VvbWV0cnlGb3JCb3goY29uc3QgQm94JiBsYXlvdXRCb3gs
IE9wdGlvbmFsPEVzY2FwZVJlYXNvbj4gZXNjYXBlUmVhc29uKSBjb25zdAoreworICAgIFVOVVNF
RF9QQVJBTShlc2NhcGVSZWFzb24pOworI2lmIEFTU0VSVF9FTkFCTEVECisgICAgYXV0byBpc09r
VG9BY2Nlc3NCb3hHZW9tZXRyeSA9IFsmXSB7CisgICAgICAgIGlmICghaXM8SW5pdGlhbENvbnRh
aW5pbmdCbG9jaz4obGF5b3V0Qm94KSAmJiAmbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9v
dCgpID09ICZyb290KCkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG5vbi1lc2NhcGUg
Y2FzZSBvZiBhY2Nlc3NpbmcgYSBib3gncyBnZW9tZXRyeSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhl
IHNhbWUgZm9ybWF0dGluZyBjb250ZXh0LgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIH0KKworICAgICAgICBpZiAoIWVzY2FwZVJlYXNvbikgeworICAgICAgICAgICAgLy8gQW55
IGdlb21ldHJ5IGFjY2VzcyBvdXRzaWRlIG9mIHRoZSBmb3JtYXR0aW5nIGNvbnRleHQgd2l0aG91
dCBhIHZhbGlkIHJlYXNvbiBpcyBjb25zaWRlcmVkIGFuIGVzY2FwZS4KKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVz
Y2FwZVJlYXNvbjo6RG9jdW1lbnRCb3hTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspIHsKKyAgICAg
ICAgICAgIEFTU0VSVChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpKTsKKyAgICAgICAgICAg
IHJldHVybiBpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihsYXlvdXRCb3gpOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpCb2R5U3RyZXRj
aGVzVG9WaWV3cG9ydFF1aXJrKSB7CisgICAgICAgICAgICBBU1NFUlQobGF5b3V0U3RhdGUoKS5p
blF1aXJrc01vZGUoKSk7CisgICAgICAgICAgICByZXR1cm4gaXM8SW5pdGlhbENvbnRhaW5pbmdC
bG9jaz4obGF5b3V0Qm94KSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpOworCisgICAgICAg
IH0KKworICAgICAgICBpZiAoKmVzY2FwZVJlYXNvbiA9PSBFc2NhcGVSZWFzb246OlRhYmxlUXVp
cmtOZWVkc0dlb21ldHJ5RnJvbUVzdGFibGlzaGVkRm9ybWF0dGluZ0NvbnRleHQpIHsKKyAgICAg
ICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiB0aGUgdGFibGUgZm9ybWF0dGluZyByb290
IGNvbGxlY3RzIGdlb21ldHJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIGNlbGwncworICAgICAgICAg
ICAgLy8gZm9ybWF0dGluZyBjb250ZXh0IHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdpZHRoL2hl
aWdodC4gc2VlIHNob3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luCisgICAgICAg
ICAgICBBU1NFUlQocm9vdCgpLmVzdGFibGlzaGVzVGFibGVGb3JtYXR0aW5nQ29udGV4dCgpKTsK
KyAgICAgICAgICAgIHJldHVybiAmbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpLmZv
cm1hdHRpbmdDb250ZXh0Um9vdCgpID09ICZyb290KCk7CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoKmVzY2FwZVJlYXNvbiA9PSBFc2NhcGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93
R2VvbWV0cnkpIHsKKyAgICAgICAgICAgIC8vIFdoZW4gY29tcHV0aW5nIHRoZSBzdGF0aWMgcG9z
aXRpb24gb2YgYW4gb3V0LW9mLWZsb3cgYm94LCB3ZSBuZWVkIHRvIGdhdGhlciBzaWJsaW5nL3Bh
cmVudCBnZW9tZXRyeSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgLy8gYXMgaWYgdGhlIG91dC1v
Zi1mbG93IGJveCB3YXMgYSBzaW1wbGUgaW5mbG93IGJveC4KKyAgICAgICAgICAgIC8vIE5vdyBz
aW5jZSB0aGUgb3V0LW9mLWZsb3cgYW5kIHRoZSBzaWJsaW5nL3BhcmVudCBib3hlcyBjb3VsZCB2
ZXJ5IHdlbGwgYmUgaW4gZGlmZmVyZW50IGNvbnRhaW5pbmcgYmxvY2sgc3VidHJlZXMKKyAgICAg
ICAgICAgIC8vIHRoZSBmb3JtYXR0aW5nIGNvbnRleHQgdGhleSBsaXZlIGluIGNvdWxkIGFsc28g
YmUgdmVyeSBkaWZmZXJlbnQuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQor
CisgICAgICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNvbjo6RmxvYXRCb3hJc0Fs
d2F5c1JlbGF0aXZlVG9GbG9hdFN0YXRlUm9vdCkgeworICAgICAgICAgICAgLy8gRmxvYXQgYm94
IHRvcC9sZWZ0IHZhbHVlcyBhcmUgbWFwcGVkIHJlbGF0aXZlIHRvIHRoZSBGbG9hdFN0YXRlJ3Mg
cm9vdC4gSW5saW5lIGZvcm1hdHRpbmcgY29udGV4dHMoQSkgaW5oZXJpdCBmbG9hdHMgZnJvbSBw
YXJlbnQKKyAgICAgICAgICAgIC8vIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMoQikuIEZsb2F0
cyBpbiB0aGVzZSBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0cyhBKSBuZWVkIHRvIGJlIG1hcHBl
ZCB0byB0aGUgcGFyZW50LCBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQoQikuCisgICAgICAgICAg
ICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dFJvb3QgPSBsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRl
eHRSb290KCk7CisgICAgICAgICAgICByZXR1cm4gJmZvcm1hdHRpbmdDb250ZXh0Um9vdCA9PSAm
cm9vdCgpIHx8ICZmb3JtYXR0aW5nQ29udGV4dFJvb3QgPT0gJnJvb3QoKS5mb3JtYXR0aW5nQ29u
dGV4dFJvb3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVz
Y2FwZVJlYXNvbjo6RmluZEZpeGVkSGVpZ2h0QW5jZXN0b3JRdWlyaykgeworICAgICAgICAgICAg
QVNTRVJUKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpOworICAgICAgICAgICAgLy8gRmlu
ZCB0aGUgZmlyc3QgY29udGFpbmluZyBibG9jayB3aXRoIGZpeGVkIGhlaWdodCBxdWlyay4gU2Vl
IFF1aXJrczo6aGVpZ2h0VmFsdWVPZk5lYXJlc3RDb250YWluaW5nQmxvY2tXaXRoRml4ZWRIZWln
aHQuCisgICAgICAgICAgICAvLyBUaGlzIGlzIG9ubHkgdG8gY2hlY2sgaWYgdGhlIHRhcmdldEZv
cm1hdHRpbmdSb290IGlzIGFuIGFuY2VzdG9yIGZvcm1hdHRpbmcgcm9vdC4KKyAgICAgICAgICAg
IGlmIChpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihsYXlvdXRCb3gpKQorICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgYXV0byYgdGFyZ2V0Rm9ybWF0dGluZ1Jvb3Qg
PSBsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCk7CisgICAgICAgICAgICBhdXRvKiBh
bmNlc3RvckZvcm1hdHRpbmdDb250ZXh0Um9vdCA9ICZyb290KCkuZm9ybWF0dGluZ0NvbnRleHRS
b290KCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGlmICgm
dGFyZ2V0Rm9ybWF0dGluZ1Jvb3QgPT0gYW5jZXN0b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QpCisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGFuY2VzdG9y
Rm9ybWF0dGluZ0NvbnRleHRSb290ID0gJmFuY2VzdG9yRm9ybWF0dGluZ0NvbnRleHRSb290LT5m
b3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXM8SW5pdGlhbENv
bnRhaW5pbmdCbG9jaz4oKmFuY2VzdG9yRm9ybWF0dGluZ0NvbnRleHRSb290KSkKKyAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmVzY2FwZVJlYXNvbiA9PSBFc2Nh
cGVSZWFzb246OlRhYmxlTmVlZHNBY2Nlc3NUb1RhYmxlV3JhcHBlcikgeworICAgICAgICAgICAg
Ly8gVGFibGVzIGFyZSB3cmFwcGVkIGluIGEgMiBsZXZlbCBmb3JtYXR0aW5nIGNvbnRleHQgc3Ry
dWN0dXJlLiBBIDx0YWJsZT4gZWxlbWVudCBpbml0aWF0ZXMgYSBibG9jayBmb3JtYXR0aW5nIGNv
bnRleHQgZm9yIGl0cyBwcmluY2lwYWwgdGFibGUgYm94CisgICAgICAgICAgICAvLyB3aGVyZSB0
aGUgY2FwdGlvbiBhbmQgdGhlIHRhYmxlIGNvbnRlbnQgbGl2ZS4gSXQgYWxzbyBpbml0aWF0ZXMg
YSB0YWJsZSB3cmFwcGVyIGJveCB3aGljaCBlc3RhYmxpc2hlcyB0aGUgdGFibGUgZm9ybWF0dGlu
ZyBjb250ZXh0LgorICAgICAgICAgICAgLy8gSW4gbWFueSBjYXNlcyB0aGUgVEZDIG5lZWRzIGFj
Y2VzcyB0byB0aGUgcGFyZW50IChnZW5lcmF0ZWQpIEJGQy4KKyAgICAgICAgICAgIHJldHVybiAm
bGF5b3V0Qm94ID09ICZyb290KCkuZm9ybWF0dGluZ0NvbnRleHRSb290KCk7CisgICAgICAgIH0K
KworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH07CisjZW5kaWYKKyAgICBBU1NFUlQoaXNPa1RvQWNjZXNzQm94R2VvbWV0cnkoKSk7Cisg
ICAgQVNTRVJUKGxheW91dFN0YXRlKCkuaGFzQm94R2VvbWV0cnkobGF5b3V0Qm94KSk7CisgICAg
cmV0dXJuIGxheW91dFN0YXRlKCkuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKK30KKwordm9p
ZCBGb3JtYXR0aW5nQ29udGV4dDo6Y29sbGVjdE91dE9mRmxvd0Rlc2NlbmRhbnRzSWZOZWVkZWQo
KQoreworICAgIGlmICghZm9ybWF0dGluZ1N0YXRlKCkub3V0T2ZGbG93Qm94ZXMoKS5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybjsKKyAgICBhdXRvJiByb290ID0gdGhpcy0+cm9vdCgpOworICAg
IGlmICghcm9vdC5oYXNDaGlsZCgpKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFyb290Lmlz
UG9zaXRpb25lZCgpICYmICFpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihyb290KSkKKyAgICAg
ICAgcmV0dXJuOworICAgIC8vIENvbGxlY3QgdGhlIG91dC1vZi1mbG93IGRlc2NlbmRhbnRzIGF0
IHRoZSBmb3JtYXR0aW5nIHJvb3QgbGV2ZWwgKGFzIG9wcG9zZWQgdG8gYXQgdGhlIGNvbnRhaW5p
bmcgYmxvY2sgbGV2ZWwsIHRob3VnaCB0aGV5IG1pZ2h0IGJlIHRoZSBzYW1lKS4KKyAgICAvLyBG
SVhNRTogVHVybiB0aGlzIGludG8gYSByZWdpc3Rlci1zZWxmIGFzIGJveGVzIGFyZSBiZWluZyBp
bnNlcnRlZC4KKyAgICBmb3IgKGF1dG8mIGRlc2NlbmRhbnQgOiBkZXNjZW5kYW50c09mVHlwZTxC
b3g+KHJvb3QpKSB7CisgICAgICAgIGlmICghZGVzY2VuZGFudC5pc091dE9mRmxvd1Bvc2l0aW9u
ZWQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoJmRlc2NlbmRhbnQuZm9y
bWF0dGluZ0NvbnRleHRSb290KCkgIT0gJnJvb3QpCisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuYWRkT3V0T2ZGbG93Qm94KGRlc2NlbmRhbnQpOworICAg
IH0KK30KKworI2lmbmRlZiBOREVCVUcKK3ZvaWQgRm9ybWF0dGluZ0NvbnRleHQ6OnZhbGlkYXRl
R2VvbWV0cnlDb25zdHJhaW50c0FmdGVyTGF5b3V0KCkgY29uc3QKK3sKKyAgICBhdXRvJiBmb3Jt
YXR0aW5nQ29udGV4dFJvb3QgPSByb290KCk7CisgICAgLy8gRklYTUU6IGFkZCBhIGRlc2NlbmRh
bnRzT2ZUeXBlPD4gZmxhdm9yIHRoYXQgc3RvcHMgYXQgbmVzdGVkIGZvcm1hdHRpbmcgY29udGV4
dHMKKyAgICBmb3IgKGF1dG8mIGxheW91dEJveCA6IGRlc2NlbmRhbnRzT2ZUeXBlPEJveD4oZm9y
bWF0dGluZ0NvbnRleHRSb290KSkgeworICAgICAgICBpZiAoJmxheW91dEJveC5mb3JtYXR0aW5n
Q29udGV4dFJvb3QoKSAhPSAmZm9ybWF0dGluZ0NvbnRleHRSb290KQorICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9ja0dlb21ldHJ5ID0gZ2VvbWV0cnlG
b3JCb3gobGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpKTsKKyAgICAgICAgYXV0byYgYm94R2Vv
bWV0cnkgPSBnZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOworCisgICAgICAgIC8vIDEwLjMuMyBC
bG9jay1sZXZlbCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93CisgICAgICAg
IC8vIDEwLjMuNyBBYnNvbHV0ZWx5IHBvc2l0aW9uZWQsIG5vbi1yZXBsYWNlZCBlbGVtZW50cwor
ICAgICAgICBpZiAoKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSB8fCBsYXlvdXRCb3guaXNP
dXRPZkZsb3dQb3NpdGlvbmVkKCkpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKSB7Cisg
ICAgICAgICAgICAvLyBtYXJnaW4tbGVmdCArIGJvcmRlci1sZWZ0LXdpZHRoICsgcGFkZGluZy1s
ZWZ0ICsgd2lkdGggKyBwYWRkaW5nLXJpZ2h0ICsgYm9yZGVyLXJpZ2h0LXdpZHRoICsgbWFyZ2lu
LXJpZ2h0ID0gd2lkdGggb2YgY29udGFpbmluZyBibG9jaworICAgICAgICAgICAgYXV0byBjb250
YWluaW5nQmxvY2tXaWR0aCA9IGNvbnRhaW5pbmdCbG9ja0dlb21ldHJ5LmNvbnRlbnRCb3hXaWR0
aCgpOworICAgICAgICAgICAgQVNTRVJUKGJveEdlb21ldHJ5Lmhvcml6b250YWxNYXJnaW5Cb3Jk
ZXJBbmRQYWRkaW5nKCkgKyBib3hHZW9tZXRyeS5jb250ZW50Qm94V2lkdGgoKSA9PSBjb250YWlu
aW5nQmxvY2tXaWR0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLyAxMC42LjQgQWJzb2x1dGVs
eSBwb3NpdGlvbmVkLCBub24tcmVwbGFjZWQgZWxlbWVudHMKKyAgICAgICAgaWYgKGxheW91dEJv
eC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkg
eworICAgICAgICAgICAgLy8gdG9wICsgbWFyZ2luLXRvcCArIGJvcmRlci10b3Atd2lkdGggKyBw
YWRkaW5nLXRvcCArIGhlaWdodCArIHBhZGRpbmctYm90dG9tICsgYm9yZGVyLWJvdHRvbS13aWR0
aCArIG1hcmdpbi1ib3R0b20gKyBib3R0b20gPSBoZWlnaHQgb2YgY29udGFpbmluZyBibG9jawor
ICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBjb250YWluaW5nQmxvY2tH
ZW9tZXRyeS5jb250ZW50Qm94SGVpZ2h0KCk7CisgICAgICAgICAgICBBU1NFUlQoQm94R2VvbWV0
cnk6OmJvcmRlckJveFRvcChib3hHZW9tZXRyeSkgKyBib3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUo
KSArIGJveEdlb21ldHJ5LmJvcmRlclRvcCgpICsgYm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZh
bHVlT3IoMCkgKyBib3hHZW9tZXRyeS5jb250ZW50Qm94SGVpZ2h0KCkKKyAgICAgICAgICAgICAg
ICArIGJveEdlb21ldHJ5LnBhZGRpbmdCb3R0b20oKS52YWx1ZU9yKDApICsgYm94R2VvbWV0cnku
Ym9yZGVyQm90dG9tKCkgKyBib3hHZW9tZXRyeS5tYXJnaW5BZnRlcigpID09IGNvbnRhaW5pbmdC
bG9ja0hlaWdodCk7CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKworfQorfQorI2VuZGlm
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL0Zv
cm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL0Zvcm1hdHRpbmdDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNzExMDI1NTg4ZWM0YTAzZDllMzVh
MGFjOTMwYTc3NmM2MjNmODQ0NAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHQuaApAQCAtMCwwICsxLDI3
MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAq
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JN
QVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNs
dWRlICJMYXlvdXRVbml0LmgiCisjaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKKyNpbmNsdWRlIDx3
dGYvSXNvTWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL1dlYWtQdHIuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBMYXlvdXRTaXplOworc3RydWN0IExlbmd0aDsKKworbmFtZXNwYWNl
IExheW91dCB7CisKK2NsYXNzIEJveEdlb21ldHJ5OworY2xhc3MgUmVwbGFjZWRCb3g7CitzdHJ1
Y3QgQ29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luOworc3RydWN0IENvbXB1dGVkVmVydGljYWxNYXJn
aW47CitjbGFzcyBDb250YWluZXJCb3g7CitzdHJ1Y3QgQ29udGVudEhlaWdodEFuZE1hcmdpbjsK
K3N0cnVjdCBDb250ZW50V2lkdGhBbmRNYXJnaW47CitzdHJ1Y3QgRWRnZXM7CitjbGFzcyBGb3Jt
YXR0aW5nU3RhdGU7CitzdHJ1Y3QgSG9yaXpvbnRhbEdlb21ldHJ5OworY2xhc3MgSW52YWxpZGF0
aW9uU3RhdGU7CitjbGFzcyBMYXlvdXRTdGF0ZTsKK3N0cnVjdCBPdmVycmlkZGVuSG9yaXpvbnRh
bFZhbHVlczsKK3N0cnVjdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXM7CitzdHJ1Y3QgVmVydGlj
YWxHZW9tZXRyeTsKKworY2xhc3MgRm9ybWF0dGluZ0NvbnRleHQgeworICAgIFdURl9NQUtFX0lT
T19BTExPQ0FURUQoRm9ybWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAgIEZvcm1hdHRpbmdD
b250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBGb3JtYXR0
aW5nU3RhdGUmKTsKKyAgICB2aXJ0dWFsIH5Gb3JtYXR0aW5nQ29udGV4dCgpOworCisgICAgc3Ry
dWN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCB7CisgICAgICAgIEhvcml6b250YWxDb25z
dHJhaW50cyBob3Jpem9udGFsOworICAgICAgICBWZXJ0aWNhbENvbnN0cmFpbnRzIHZlcnRpY2Fs
OworICAgIH07CisgICAgdmlydHVhbCB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0
aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSA9IDA7CisKKyAg
ICBzdHJ1Y3QgQ29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50IHsKKyAgICAgICAgSG9yaXpv
bnRhbENvbnN0cmFpbnRzIGhvcml6b250YWw7CisgICAgICAgIFZlcnRpY2FsQ29uc3RyYWludHMg
dmVydGljYWw7CisgICAgICAgIC8vIEJvcmRlcnMgYW5kIHBhZGRpbmcgYXJlIHJlc29sdmVkIGFn
YWluc3QgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBjb250ZW50IGJveCBhcyBpZiB0aGUgYm94IHdh
cyBhbiBpbi1mbG93IGJveC4KKyAgICAgICAgTGF5b3V0VW5pdCBib3JkZXJBbmRQYWRkaW5nQ29u
c3RyYWludHM7CisgICAgfTsKKyAgICB2b2lkIGxheW91dE91dE9mRmxvd0NvbnRlbnQoSW52YWxp
ZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQmKTsKKwor
ICAgIHN0cnVjdCBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsKKyAgICAgICAgdm9pZCBleHBh
bmQoTGF5b3V0VW5pdCBob3Jpem9udGFsVmFsdWUpOworICAgICAgICBJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzJiBvcGVyYXRvcis9KGNvbnN0IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmKTsK
KyAgICAgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3BlcmF0b3IrPShMYXlvdXRVbml0
KTsKKyAgICAgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3BlcmF0b3ItPShjb25zdCBJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzJik7CisgICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMmIG9wZXJhdG9yLT0oTGF5b3V0VW5pdCk7CisKKyAgICAgICAgTGF5b3V0VW5pdCBtaW5p
bXVtOworICAgICAgICBMYXlvdXRVbml0IG1heGltdW07CisgICAgfTsKKyAgICB2aXJ0dWFsIElu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
KCkgPSAwOworICAgIHZpcnR1YWwgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0
ID0gMDsKKworICAgIGJvb2wgaXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1
cm4gcm9vdCgpLmVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpOyB9CisgICAgYm9v
bCBpc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFi
bGlzaGVzSW5saW5lRm9ybWF0dGluZ0NvbnRleHQoKTsgfQorICAgIGJvb2wgaXNUYWJsZUZvcm1h
dHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFibGlzaGVzVGFibGVGb3Jt
YXR0aW5nQ29udGV4dCgpOyB9CisgICAgYm9vbCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBpc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSAmJiBy
b290KCkuaXNUYWJsZVdyYXBwZXJCb3goKTsgfQorICAgIGJvb2wgaXNGbGV4Rm9ybWF0dGluZ0Nv
bnRleHQoKSBjb25zdCB7IHJldHVybiByb290KCkuZXN0YWJsaXNoZXNGbGV4Rm9ybWF0dGluZ0Nv
bnRleHQoKTsgfQorCisgICAgZW51bSBjbGFzcyBFc2NhcGVSZWFzb24geworICAgICAgICBUYWJs
ZVF1aXJrTmVlZHNHZW9tZXRyeUZyb21Fc3RhYmxpc2hlZEZvcm1hdHRpbmdDb250ZXh0LAorICAg
ICAgICBPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5LAorICAgICAgICBGbG9hdEJveElz
QWx3YXlzUmVsYXRpdmVUb0Zsb2F0U3RhdGVSb290LAorICAgICAgICBGaW5kRml4ZWRIZWlnaHRB
bmNlc3RvclF1aXJrLAorICAgICAgICBEb2N1bWVudEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWly
aywKKyAgICAgICAgQm9keVN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaywKKyAgICAgICAgVGFibGVO
ZWVkc0FjY2Vzc1RvVGFibGVXcmFwcGVyCisgICAgfTsKKyAgICBjb25zdCBCb3hHZW9tZXRyeSYg
Z2VvbWV0cnlGb3JCb3goY29uc3QgQm94JiwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiA9IFdURjo6
bnVsbG9wdCkgY29uc3Q7CisgICAgY29uc3QgQ29udGFpbmVyQm94JiByb290KCkgY29uc3QgeyBy
ZXR1cm4gKm1fcm9vdDsgfQorCisgICAgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgY29uc3Q7
CisKK3Byb3RlY3RlZDoKKyAgICB1c2luZyBMYXlvdXRRdWV1ZSA9IFZlY3Rvcjxjb25zdCBCb3gq
PjsKKworICAgIGNvbnN0IEZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKCkgY29uc3Qg
eyByZXR1cm4gbV9mb3JtYXR0aW5nU3RhdGU7IH0KKyAgICBGb3JtYXR0aW5nU3RhdGUmIGZvcm1h
dHRpbmdTdGF0ZSgpIHsgcmV0dXJuIG1fZm9ybWF0dGluZ1N0YXRlOyB9CisKKyAgICB2b2lkIGNv
bXB1dGVCb3JkZXJBbmRQYWRkaW5nKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYpOworCisjaWZuZGVmIE5ERUJVRworICAgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZUdlb21l
dHJ5Q29uc3RyYWludHNBZnRlckxheW91dCgpIGNvbnN0OworI2VuZGlmCisKKyAgICAvLyBUaGlz
IGNsYXNzIGltcGxlbWVudHMgZ2VuZXJpYyBwb3NpdGlvbmluZyBhbmQgc2l6aW5nLgorICAgIGNs
YXNzIEdlb21ldHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFZlcnRpY2FsR2VvbWV0cnkgb3V0
T2ZGbG93VmVydGljYWxHZW9tZXRyeShjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRp
Y2FsVmFsdWVzJikgY29uc3Q7CisgICAgICAgIEhvcml6b250YWxHZW9tZXRyeSBvdXRPZkZsb3dI
b3Jpem9udGFsR2VvbWV0cnkoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFs
VmFsdWVzJik7CisKKyAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBmbG9hdGluZ0NvbnRl
bnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7CisgICAgICAgIENvbnRl
bnRXaWR0aEFuZE1hcmdpbiBmbG9hdGluZ0NvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gm
LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRh
bFZhbHVlcyYpOworCisgICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5saW5lUmVwbGFj
ZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJiwgT3B0aW9uYWw8VmVydGljYWxDb25zdHJhaW50cz4sIGNvbnN0IE92
ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpIGNvbnN0OworICAgICAgICBDb250ZW50V2lkdGhBbmRN
YXJnaW4gaW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRC
b3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBPcHRpb25hbDxWZXJ0aWNhbENvbnN0
cmFpbnRzPiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKworICAgICAgICBM
YXlvdXRTaXplIGluRmxvd1Bvc2l0aW9uZWRQb3NpdGlvbk9mZnNldChjb25zdCBCb3gmLCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmKSBjb25zdDsKKworICAgICAgICBDb250ZW50SGVpZ2h0
QW5kTWFyZ2luIGNvbXBsaWNhdGVkQ2FzZXMoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7CisgICAg
ICAgIExheW91dFVuaXQgc2hyaW5rVG9GaXRXaWR0aChjb25zdCBCb3gmLCBMYXlvdXRVbml0IGF2
YWlsYWJsZVdpZHRoKTsKKworICAgICAgICBFZGdlcyBjb21wdXRlZEJvcmRlcihjb25zdCBCb3gm
KSBjb25zdDsKKyAgICAgICAgT3B0aW9uYWw8RWRnZXM+IGNvbXB1dGVkUGFkZGluZyhjb25zdCBC
b3gmLCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSBjb25zdDsKKworICAgICAgICBD
b21wdXRlZEhvcml6b250YWxNYXJnaW4gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKGNvbnN0IEJv
eCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpIGNvbnN0OworICAgICAgICBDb21wdXRl
ZFZlcnRpY2FsTWFyZ2luIGNvbXB1dGVkVmVydGljYWxNYXJnaW4oY29uc3QgQm94JiwgY29uc3Qg
SG9yaXpvbnRhbENvbnN0cmFpbnRzJikgY29uc3Q7CisKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0
VW5pdD4gY29tcHV0ZWRWYWx1ZShjb25zdCBMZW5ndGgmIGdlb21ldHJ5UHJvcGVydHksIExheW91
dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpIGNvbnN0OworICAgICAgICBPcHRpb25hbDxMYXlv
dXRVbml0PiBmaXhlZFZhbHVlKGNvbnN0IExlbmd0aCYgZ2VvbWV0cnlQcm9wZXJ0eSkgY29uc3Q7
CisKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRNaW5IZWlnaHQoY29uc3Qg
Qm94JiwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RGOjpu
dWxsb3B0KSBjb25zdDsKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRNYXhI
ZWlnaHQoY29uc3QgQm94JiwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVp
Z2h0ID0gV1RGOjpudWxsb3B0KSBjb25zdDsKKworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0
PiBjb21wdXRlZE1pbldpZHRoKGNvbnN0IEJveCYsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2Nr
V2lkdGgpOworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZE1heFdpZHRoKGNv
bnN0IEJveCYsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworCisgICAgICAgIEZv
cm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbnN0cmFpbkJ5TWlu
TWF4V2lkdGgoY29uc3QgQm94JiwgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cykgY29uc3Q7CisK
KyAgICAgICAgTGF5b3V0VW5pdCBjb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290
KGNvbnN0IENvbnRhaW5lckJveCYpIGNvbnN0OworCisgICAgICAgIENvbnN0cmFpbnRzRm9yT3V0
T2ZGbG93Q29udGVudCBjb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29uc3QgQ29udGFp
bmVyQm94Jik7CisgICAgICAgIENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBjb25zdHJhaW50
c0ZvckluRmxvd0NvbnRlbnQoY29uc3QgQ29udGFpbmVyQm94JiwgT3B0aW9uYWw8RXNjYXBlUmVh
c29uPiA9IFdURjo6bnVsbG9wdCk7CisKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29t
cHV0ZWRIZWlnaHQoY29uc3QgQm94JiwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Js
b2NrSGVpZ2h0ID0gV1RGOjpudWxsb3B0KSBjb25zdDsKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0
VW5pdD4gY29tcHV0ZWRXaWR0aChjb25zdCBCb3gmLCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9j
a1dpZHRoKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgZnJpZW5kIGNsYXNzIEZvcm1hdHRp
bmdDb250ZXh0OworICAgICAgICBHZW9tZXRyeShjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYpOwor
CisgICAgICAgIGNvbnN0IExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJu
IG1fZm9ybWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQorICAgICAgICBMYXlvdXRTdGF0
ZSYgbGF5b3V0U3RhdGUoKSB7IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0LmxheW91dFN0YXRl
KCk7IH0KKyAgICAgICAgY29uc3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0
KCkgY29uc3QgeyByZXR1cm4gbV9mb3JtYXR0aW5nQ29udGV4dDsgfQorCisgICAgcHJpdmF0ZToK
KyAgICAgICAgVmVydGljYWxHZW9tZXRyeSBvdXRPZkZsb3dSZXBsYWNlZFZlcnRpY2FsR2VvbWV0
cnkoY29uc3QgUmVwbGFjZWRCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25z
dCBWZXJ0aWNhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikg
Y29uc3Q7CisgICAgICAgIEhvcml6b250YWxHZW9tZXRyeSBvdXRPZkZsb3dSZXBsYWNlZEhvcml6
b250YWxHZW9tZXRyeShjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpv
bnRhbFZhbHVlcyYpOworCisgICAgICAgIFZlcnRpY2FsR2VvbWV0cnkgb3V0T2ZGbG93Tm9uUmVw
bGFjZWRWZXJ0aWNhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlk
ZGVuVmVydGljYWxWYWx1ZXMmKSBjb25zdDsKKyAgICAgICAgSG9yaXpvbnRhbEdlb21ldHJ5IG91
dE9mRmxvd05vblJlcGxhY2VkSG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFs
VmFsdWVzJik7CisKKyAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBmbG9hdGluZ1JlcGxh
Y2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpIGNvbnN0
OworICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRX
aWR0aEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7CisKKyAgICAgICAgQ29u
dGVudFdpZHRoQW5kTWFyZ2luIGZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJn
aW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJp
ZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKworICAgICAgICBMYXlvdXRVbml0IHN0YXRpY1ZlcnRp
Y2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYsIGNvbnN0IFZlcnRp
Y2FsQ29uc3RyYWludHMmKSBjb25zdDsKKyAgICAgICAgTGF5b3V0VW5pdCBzdGF0aWNIb3Jpem9u
dGFsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYpIGNvbnN0OworCisgICAgICAgIGVudW0gY2xhc3MgSGVpZ2h0VHlw
ZSB7IE1pbiwgTWF4LCBOb3JtYWwgfTsKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29t
cHV0ZWRIZWlnaHRWYWx1ZShjb25zdCBCb3gmLCBIZWlnaHRUeXBlLCBPcHRpb25hbDxMYXlvdXRV
bml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQpIGNvbnN0OworCisgICAgICAgIGVudW0gY2xhc3Mg
V2lkdGhUeXBlIHsgTWluLCBNYXgsIE5vcm1hbCB9OworICAgICAgICBPcHRpb25hbDxMYXlvdXRV
bml0PiBjb21wdXRlZFdpZHRoVmFsdWUoY29uc3QgQm94JiwgV2lkdGhUeXBlLCBMYXlvdXRVbml0
IGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKworICAgICAgICBjb25zdCBGb3JtYXR0aW5nQ29udGV4
dCYgbV9mb3JtYXR0aW5nQ29udGV4dDsKKyAgICB9OworICAgIEZvcm1hdHRpbmdDb250ZXh0OjpH
ZW9tZXRyeSBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlzKTsgfQorCisg
ICAgY2xhc3MgUXVpcmtzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFF1aXJrcyhjb25zdCBGb3Jt
YXR0aW5nQ29udGV4dCYpOworCisgICAgICAgIExheW91dFVuaXQgaGVpZ2h0VmFsdWVPZk5lYXJl
c3RDb250YWluaW5nQmxvY2tXaXRoRml4ZWRIZWlnaHQoY29uc3QgQm94Jik7CisKKyAgICBwcm90
ZWN0ZWQ6CisgICAgICAgIGNvbnN0IExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQorICAgICAgICBMYXlv
dXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSB7IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0LmxheW91
dFN0YXRlKCk7IH0KKyAgICAgICAgY29uc3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdD
b250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9mb3JtYXR0aW5nQ29udGV4dDsgfQorCisgICAgICAg
IGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0JiBtX2Zvcm1hdHRpbmdDb250ZXh0OworICAgIH07Cisg
ICAgRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWly
a3MoKnRoaXMpOyB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBjb2xsZWN0T3V0T2ZGbG93RGVzY2Vu
ZGFudHNJZk5lZWRlZCgpOworICAgIHZvaWQgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0
cnkoY29uc3QgQm94JiwgY29uc3QgQ29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50Jik7Cisg
ICAgdm9pZCBjb21wdXRlT3V0T2ZGbG93SG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0IEJveCYsIGNv
bnN0IENvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCYpOworCisgICAgV2Vha1B0cjxjb25z
dCBDb250YWluZXJCb3g+IG1fcm9vdDsKKyAgICBGb3JtYXR0aW5nU3RhdGUmIG1fZm9ybWF0dGlu
Z1N0YXRlOworfTsKKworaW5saW5lIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6R2VvbWV0
cnkoY29uc3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KQorICAgIDogbV9m
b3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworaW5saW5lIEZvcm1h
dHRpbmdDb250ZXh0OjpRdWlya3M6OlF1aXJrcyhjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgZm9y
bWF0dGluZ0NvbnRleHQpCisgICAgOiBtX2Zvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250
ZXh0KQoreworfQorCitpbmxpbmUgdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lk
dGhDb25zdHJhaW50czo6ZXhwYW5kKExheW91dFVuaXQgaG9yaXpvbnRhbFZhbHVlKQoreworICAg
IG1pbmltdW0gKz0gaG9yaXpvbnRhbFZhbHVlOworICAgIG1heGltdW0gKz0gaG9yaXpvbnRhbFZh
bHVlOworfQorCitpbmxpbmUgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMmIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOjpvcGVy
YXRvcis9KGNvbnN0IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIG90aGVyKQoreworICAgIG1p
bmltdW0gKz0gb3RoZXIubWluaW11bTsKKyAgICBtYXhpbXVtICs9IG90aGVyLm1heGltdW07Cisg
ICAgcmV0dXJuICp0aGlzOworfQorCitpbmxpbmUgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMmIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzOjpvcGVyYXRvcis9KExheW91dFVuaXQgdmFsdWUpCit7CisgICAgZXhwYW5kKHZhbHVl
KTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2lubGluZSBGb3JtYXR0aW5nQ29udGV4dDo6SW50
cmluc2ljV2lkdGhDb25zdHJhaW50cyYgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRo
Q29uc3RyYWludHM6Om9wZXJhdG9yLT0oY29uc3QgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYg
b3RoZXIpCit7CisgICAgbWluaW11bSAtPSBvdGhlci5taW5pbXVtOworICAgIG1heGltdW0gLT0g
b3RoZXIubWF4aW11bTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2lubGluZSBGb3JtYXR0aW5n
Q29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgRm9ybWF0dGluZ0NvbnRleHQ6Oklu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHM6Om9wZXJhdG9yLT0oTGF5b3V0VW5pdCB2YWx1ZSkKK3sK
KyAgICBleHBhbmQoLXZhbHVlKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK30KK30KKworI2Rl
ZmluZSBTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoVG9W
YWx1ZVR5cGVOYW1lLCBwcmVkaWNhdGUpIFwKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfQkVHSU4o
V2ViQ29yZTo6TGF5b3V0OjpUb1ZhbHVlVHlwZU5hbWUpIFwKKyAgICBzdGF0aWMgYm9vbCBpc1R5
cGUoY29uc3QgV2ViQ29yZTo6TGF5b3V0OjpGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0Nv
bnRleHQpIHsgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0LnByZWRpY2F0ZTsgfSBcCitTUEVDSUFM
SVpFX1RZUEVfVFJBSVRTX0VORCgpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9Gb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNw
cCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGluZ0Nv
bnRleHRHZW9tZXRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOWViMTk2NTdiOGJlNzE5OWFhM2ZmYzIwNmY1
NzIxYTcyY2Q2MmM4MQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKQEAgLTAsMCAr
MSwxMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4K
KyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZv
cm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKKworI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiRmxleEZv
cm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUg
IkZsb2F0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKKyNp
bmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRhaW5p
bmdCbG9jay5oIgorI2luY2x1ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCisjaW5jbHVkZSAiTG9n
Z2luZy5oIgorI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitzdGF0aWMgaW5saW5lIGJvb2wgaXNIZWln
aHRBdXRvKGNvbnN0IEJveCYgbGF5b3V0Qm94KQoreworICAgIC8vIDEwLjUgQ29udGVudCBoZWln
aHQ6IHRoZSAnaGVpZ2h0JyBwcm9wZXJ0eQorICAgIC8vCisgICAgLy8gVGhlIHBlcmNlbnRhZ2Ug
aXMgY2FsY3VsYXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGhlaWdodCBvZiB0aGUgZ2VuZXJhdGVk
IGJveCdzIGNvbnRhaW5pbmcgYmxvY2suCisgICAgLy8gSWYgdGhlIGhlaWdodCBvZiB0aGUgY29u
dGFpbmluZyBibG9jayBpcyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHkgKGkuZS4sIGl0IGRlcGVu
ZHMgb24gY29udGVudCBoZWlnaHQpLAorICAgIC8vIGFuZCB0aGlzIGVsZW1lbnQgaXMgbm90IGFi
c29sdXRlbHkgcG9zaXRpb25lZCwgdGhlIHVzZWQgaGVpZ2h0IGlzIGNhbGN1bGF0ZWQgYXMgaWYg
J2F1dG8nIHdhcyBzcGVjaWZpZWQuCisKKyAgICBhdXRvIGhlaWdodCA9IGxheW91dEJveC5zdHls
ZSgpLmxvZ2ljYWxIZWlnaHQoKTsKKyAgICBpZiAoaGVpZ2h0LmlzQXV0bygpKQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKworICAgIGlmIChoZWlnaHQuaXNQZXJjZW50KCkpIHsKKyAgICAgICAgaWYg
KGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgICAgICByZXR1cm4gIWxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5zdHls
ZSgpLmxvZ2ljYWxIZWlnaHQoKS5pc0ZpeGVkKCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNl
OworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6
OmNvbXB1dGVkSGVpZ2h0VmFsdWUoY29uc3QgQm94JiBsYXlvdXRCb3gsIEhlaWdodFR5cGUgaGVp
Z2h0VHlwZSwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSBjb25z
dAoreworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgYXV0byBoZWln
aHQgPSBoZWlnaHRUeXBlID09IEhlaWdodFR5cGU6Ok5vcm1hbCA/IHN0eWxlLmxvZ2ljYWxIZWln
aHQoKSA6IGhlaWdodFR5cGUgPT0gSGVpZ2h0VHlwZTo6TWluID8gc3R5bGUubG9naWNhbE1pbkhl
aWdodCgpIDogc3R5bGUubG9naWNhbE1heEhlaWdodCgpOworICAgIGlmIChoZWlnaHQuaXNVbmRl
ZmluZWQoKSB8fCBoZWlnaHQuaXNBdXRvKCkgfHwgaGVpZ2h0LmlzTWF4Q29udGVudCgpIHx8IGhl
aWdodC5pc01pbkNvbnRlbnQoKSB8fCBoZWlnaHQuaXNGaXRDb250ZW50KCkpCisgICAgICAgIHJl
dHVybiB7IH07CisKKyAgICBpZiAoaGVpZ2h0LmlzRml4ZWQoKSkKKyAgICAgICAgcmV0dXJuIExh
eW91dFVuaXQgeyBoZWlnaHQudmFsdWUoKSB9OworCisgICAgaWYgKCFjb250YWluaW5nQmxvY2tI
ZWlnaHQpIHsKKyAgICAgICAgaWYgKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpCisgICAg
ICAgICAgICBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJr
cygpLmhlaWdodFZhbHVlT2ZOZWFyZXN0Q29udGFpbmluZ0Jsb2NrV2l0aEZpeGVkSGVpZ2h0KGxh
eW91dEJveCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXV0byBub25Bbm9ueW1vdXND
b250YWluaW5nQmxvY2tMb2dpY2FsSGVpZ2h0ID0gWyZdIHsKKyAgICAgICAgICAgICAgICAvLyBX
aGVuIHRoZSBibG9jayBsZXZlbCBib3ggaXMgYSBkaXJlY3QgY2hpbGQgb2YgYW4gaW5saW5lIGxl
dmVsIGJveCAoPHNwYW4+PGRpdj48L2Rpdj48L3NwYW4+KSBhbmQgd2Ugd3JhcCBpdCBpbnRvIGEg
Y29udGludWF0aW9uLAorICAgICAgICAgICAgICAgIC8vIHRoZSBjb250YWluaW5nIGJsb2NrIChh
bm9ueW1vdXMgd3JhcHBlcikgaXMgbm90IHRoZSBib3ggd2UgbmVlZCB0byBjaGVjayBmb3IgZml4
ZWQgaGVpZ2h0LgorICAgICAgICAgICAgICAgIGF1dG8mIGluaXRpYWxDb250YWluaW5nQmxvY2sg
PSBsYXlvdXRCb3guaW5pdGlhbENvbnRhaW5pbmdCbG9jaygpOworICAgICAgICAgICAgICAgIGZv
ciAoYXV0byogY29udGFpbmluZ0Jsb2NrID0gJmxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsg
Y29udGFpbmluZ0Jsb2NrICE9ICZpbml0aWFsQ29udGFpbmluZ0Jsb2NrOyBjb250YWluaW5nQmxv
Y2sgPSAmY29udGFpbmluZ0Jsb2NrLT5jb250YWluaW5nQmxvY2soKSkgeworICAgICAgICAgICAg
ICAgICAgICBpZiAoY29udGFpbmluZ0Jsb2NrLT5pc0Fub255bW91cygpKQorICAgICAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWlu
aW5nQmxvY2stPnN0eWxlKCkubG9naWNhbEhlaWdodCgpOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICByZXR1cm4gaW5pdGlhbENvbnRhaW5pbmdCbG9jay5zdHlsZSgpLmxvZ2lj
YWxIZWlnaHQoKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjb250YWluaW5nQmxvY2tI
ZWlnaHQgPSBmaXhlZFZhbHVlKG5vbkFub255bW91c0NvbnRhaW5pbmdCbG9ja0xvZ2ljYWxIZWln
aHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWNvbnRhaW5pbmdCbG9ja0hlaWdo
dCkKKyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIHJldHVybiB2YWx1ZUZvckxlbmd0aChoZWln
aHQsICpjb250YWluaW5nQmxvY2tIZWlnaHQpOworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBG
b3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkSGVpZ2h0KGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQpIGNvbnN0
Cit7CisgICAgaWYgKGF1dG8gaGVpZ2h0ID0gY29tcHV0ZWRIZWlnaHRWYWx1ZShsYXlvdXRCb3gs
IEhlaWdodFR5cGU6Ok5vcm1hbCwgY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSkgeworICAgICAgICBp
ZiAobGF5b3V0Qm94LnN0eWxlKCkuYm94U2l6aW5nKCkgPT0gQm94U2l6aW5nOjpDb250ZW50Qm94
KQorICAgICAgICAgICAgcmV0dXJuIGhlaWdodDsKKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkg
PSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAgICAg
IHJldHVybiAqaGVpZ2h0IC0gKGJveEdlb21ldHJ5LnZlcnRpY2FsQm9yZGVyKCkgKyBib3hHZW9t
ZXRyeS52ZXJ0aWNhbFBhZGRpbmcoKS52YWx1ZU9yKDApKTsKKyAgICB9CisgICAgcmV0dXJuIHsg
fTsKK30KKworT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5
Ojpjb21wdXRlZFdpZHRoVmFsdWUoY29uc3QgQm94JiBsYXlvdXRCb3gsIFdpZHRoVHlwZSB3aWR0
aFR5cGUsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpCit7CisgICAgLy8gQXBwbGll
cyB0bzogYWxsIGVsZW1lbnRzIGV4Y2VwdCBub24tcmVwbGFjZWQgaW5saW5lcyAob3V0LW9mLWZs
b3cgY2hlY2sgaXMgcmVxdWlyZWQgZm9yIHBvc2l0aW9uZWQgPGJyPiBhcyBmb3Igc29tZSByZWFz
b24gd2UgZG9uJ3QgYmxvY2tpZnkgdGhlbSkuCisgICAgQVNTRVJUKCFsYXlvdXRCb3guaXNJbmxp
bmVCb3goKSB8fCBsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOworCisgICAgYXV0
byB3aWR0aCA9IFsmXSB7CisgICAgICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7
CisgICAgICAgIHN3aXRjaCAod2lkdGhUeXBlKSB7CisgICAgICAgIGNhc2UgV2lkdGhUeXBlOjpO
b3JtYWw6CisgICAgICAgICAgICByZXR1cm4gc3R5bGUubG9naWNhbFdpZHRoKCk7CisgICAgICAg
IGNhc2UgV2lkdGhUeXBlOjpNaW46CisgICAgICAgICAgICByZXR1cm4gc3R5bGUubG9naWNhbE1p
bldpZHRoKCk7CisgICAgICAgIGNhc2UgV2lkdGhUeXBlOjpNYXg6CisgICAgICAgICAgICByZXR1
cm4gc3R5bGUubG9naWNhbE1heFdpZHRoKCk7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBzdHlsZS5sb2dpY2FsV2lkdGgoKTsKKyAgICB9
KCk7CisgICAgaWYgKGF1dG8gY29tcHV0ZWRWYWx1ZSA9IHRoaXMtPmNvbXB1dGVkVmFsdWUod2lk
dGgsIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSkKKyAgICAgICAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7
CisKKyAgICBpZiAod2lkdGguaXNNaW5Db250ZW50KCkgfHwgd2lkdGguaXNNYXhDb250ZW50KCkg
fHwgd2lkdGguaXNGaXRDb250ZW50KCkpIHsKKyAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+
KGxheW91dEJveCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICBhdXRvJiBjb250
YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7CisgICAgICAgIC8v
IEZJWE1FOiBDb25zaWRlciBzcGxpdHRpbmcgdXAgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzIHNvIHRoYXQgd2UgY291bGQgY29tcHV0ZWQgdGhlIG1pbiBhbmQgbWF4IHZhbHVlcyBz
ZXBhcmF0ZWx5LgorICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBbJl0g
eworICAgICAgICAgICAgaWYgKCFjb250YWluZXJCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxk
KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyAw
X2x1LCBjb250YWluaW5nQmxvY2tXaWR0aCB9OworICAgICAgICAgICAgQVNTRVJUKGNvbnRhaW5l
ckJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOworICAgICAgICAgICAgYXV0byYg
Zm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUoKS5lbnN1cmVGb3JtYXR0aW5nU3RhdGUoY29u
dGFpbmVyQm94KTsKKyAgICAgICAgICAgIGlmIChhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMgPSBmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpKQorICAgICAg
ICAgICAgICAgIHJldHVybiAqaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKKyAgICAgICAgICAg
IHJldHVybiBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjb250YWluZXJC
b3gsIGxheW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsK
KyAgICAgICAgfSgpOworICAgICAgICBpZiAod2lkdGguaXNNaW5Db250ZW50KCkpCisgICAgICAg
ICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtOworICAgICAgICBp
ZiAod2lkdGguaXNNYXhDb250ZW50KCkpCisgICAgICAgICAgICByZXR1cm4gaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cy5tYXhpbXVtOworICAgICAgICBBU1NFUlQod2lkdGguaXNGaXRDb250ZW50
KCkpOworICAgICAgICAvLyBJZiB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIGEgZ2l2ZW4gYXhpcyBp
cyBkZWZpbml0ZSwgZXF1YWwgdG8gbWluKG1heC1jb250ZW50IHNpemUsCisgICAgICAgIC8vIG1h
eChtaW4tY29udGVudCBzaXplLCBzdHJldGNoLWZpdCBzaXplKSkuIE90aGVyd2lzZSwgZXF1YWwg
dG8gdGhlIG1heC1jb250ZW50IHNpemUgaW4gdGhhdCBheGlzLgorICAgICAgICAvLyBGSVhNRTog
V2UgZG9uJ3QgeWV0IGhhdmUgaW5kZWZpbml0ZSBhdmFpbGFibGUgc2l6ZS4KKyAgICAgICAgcmV0
dXJuIHN0ZDo6bWluKGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSwgc3RkOjptYXgo
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtLCBjb250YWluaW5nQmxvY2tXaWR0aCkp
OworICAgIH0KKyAgICByZXR1cm4geyB9OworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkV2lkdGgoY29uc3QgQm94JiBsYXlvdXRC
b3gsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpCit7CisgICAgaWYgKGF1dG8gY29t
cHV0ZWRXaWR0aCA9IGNvbXB1dGVkV2lkdGhWYWx1ZShsYXlvdXRCb3gsIFdpZHRoVHlwZTo6Tm9y
bWFsLCBjb250YWluaW5nQmxvY2tXaWR0aCkpIHsKKyAgICAgICAgYXV0byYgc3R5bGUgPSBsYXlv
dXRCb3guc3R5bGUoKTsKKyAgICAgICAgLy8gTm9uLXF1YW50aXRhdGl2ZSB2YWx1ZXMgc3VjaCBh
cyBhdXRvIGFuZCBtaW4tY29udGVudCBhcmUgbm90IGluZmx1ZW5jZWQgYnkgdGhlIGJveC1zaXpp
bmcgcHJvcGVydHkuCisgICAgICAgIGlmIChzdHlsZS5ib3hTaXppbmcoKSA9PSBCb3hTaXppbmc6
OkNvbnRlbnRCb3ggfHwgc3R5bGUud2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQorICAgICAg
ICAgICAgcmV0dXJuIGNvbXB1dGVkV2lkdGg7CisgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0g
Zm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOworICAgICAgICBy
ZXR1cm4gKmNvbXB1dGVkV2lkdGggLSAoYm94R2VvbWV0cnkuaG9yaXpvbnRhbEJvcmRlcigpICsg
Ym94R2VvbWV0cnkuaG9yaXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDApKTsKKyAgICB9CisgICAg
cmV0dXJuIHsgfTsKK30KKworTGF5b3V0VW5pdCBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6
OmNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QoY29uc3QgQ29udGFpbmVyQm94
JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpIGNvbnN0Cit7CisgICAgQVNTRVJUKGZvcm1hdHRpbmdD
b250ZXh0Um9vdC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOworICAgIEFTU0VSVChp
c0hlaWdodEF1dG8oZm9ybWF0dGluZ0NvbnRleHRSb290KSB8fCBmb3JtYXR0aW5nQ29udGV4dFJv
b3QuZXN0YWJsaXNoZXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkgfHwgZm9ybWF0dGluZ0NvbnRl
eHRSb290LmlzVGFibGVDZWxsKCkpOworICAgIGF1dG8gdXNlZENvbnRlbnRIZWlnaHQgPSBMYXlv
dXRVbml0IHsgfTsgCisgICAgYXV0byBoYXNDb250ZW50ID0gZm9ybWF0dGluZ0NvbnRleHRSb290
Lmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpOworICAgIC8vIFRoZSB1c2VkIGhlaWdodCBvZiB0
aGUgY29udGFpbm1lbnQgYm94IGlzIGRldGVybWluZWQgYXMgaWYgcGVyZm9ybWluZyBhIG5vcm1h
bCBsYXlvdXQgb2YgdGhlIGJveCwgZXhjZXB0IHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBoYXZpbmcg
bm8gY29udGVudC4KKyAgICBhdXRvIHNob3VsZElnbm9yZUNvbnRlbnQgPSBmb3JtYXR0aW5nQ29u
dGV4dFJvb3QuaXNTaXplQ29udGFpbm1lbnRCb3goKTsKKyAgICBpZiAoaGFzQ29udGVudCAmJiAh
c2hvdWxkSWdub3JlQ29udGVudCkKKyAgICAgICAgdXNlZENvbnRlbnRIZWlnaHQgPSBMYXlvdXRD
b250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGNv
bnN0X2Nhc3Q8TGF5b3V0U3RhdGUmPihsYXlvdXRTdGF0ZSgpKSktPnVzZWRDb250ZW50SGVpZ2h0
KCk7CisgICAgcmV0dXJuIHVzZWRDb250ZW50SGVpZ2h0OworfQorCitPcHRpb25hbDxMYXlvdXRV
bml0PiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkVmFsdWUoY29uc3QgTGVu
Z3RoJiBnZW9tZXRyeVByb3BlcnR5LCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSBj
b25zdAoreworICAgIC8vICBJbiBnZW5lcmFsLCB0aGUgY29tcHV0ZWQgdmFsdWUgcmVzb2x2ZXMg
dGhlIHNwZWNpZmllZCB2YWx1ZSBhcyBmYXIgYXMgcG9zc2libGUgd2l0aG91dCBsYXlpbmcgb3V0
IHRoZSBjb250ZW50LgorICAgIGlmIChnZW9tZXRyeVByb3BlcnR5LmlzRml4ZWQoKSB8fCBnZW9t
ZXRyeVByb3BlcnR5LmlzUGVyY2VudCgpIHx8IGdlb21ldHJ5UHJvcGVydHkuaXNDYWxjdWxhdGVk
KCkpCisgICAgICAgIHJldHVybiB2YWx1ZUZvckxlbmd0aChnZW9tZXRyeVByb3BlcnR5LCBjb250
YWluaW5nQmxvY2tXaWR0aCk7CisgICAgcmV0dXJuIHsgfTsKK30KKworT3B0aW9uYWw8TGF5b3V0
VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpmaXhlZFZhbHVlKGNvbnN0IExlbmd0
aCYgZ2VvbWV0cnlQcm9wZXJ0eSkgY29uc3QKK3sKKyAgICBpZiAoIWdlb21ldHJ5UHJvcGVydHku
aXNGaXhlZCgpKQorICAgICAgICByZXR1cm4geyB9OworICAgIHJldHVybiBMYXlvdXRVbml0IHsg
Z2VvbWV0cnlQcm9wZXJ0eS52YWx1ZSgpIH07Cit9CisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9U
Ui9DU1MyMi92aXN1ZGV0Lmh0bWwjbWluLW1heC1oZWlnaHRzCisvLyBTcGVjaWZpZXMgYSBwZXJj
ZW50YWdlIGZvciBkZXRlcm1pbmluZyB0aGUgdXNlZCB2YWx1ZS4gVGhlIHBlcmNlbnRhZ2UgaXMg
Y2FsY3VsYXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGhlaWdodCBvZiB0aGUgZ2VuZXJhdGVkIGJv
eCdzIGNvbnRhaW5pbmcgYmxvY2suCisvLyBJZiB0aGUgaGVpZ2h0IG9mIHRoZSBjb250YWluaW5n
IGJsb2NrIGlzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSAoaS5lLiwgaXQgZGVwZW5kcyBvbiBj
b250ZW50IGhlaWdodCksIGFuZCB0aGlzIGVsZW1lbnQgaXMgbm90IGFic29sdXRlbHkgcG9zaXRp
b25lZCwKKy8vIHRoZSBwZXJjZW50YWdlIHZhbHVlIGlzIHRyZWF0ZWQgYXMgJzAnIChmb3IgJ21p
bi1oZWlnaHQnKSBvciAnbm9uZScgKGZvciAnbWF4LWhlaWdodCcpLgorT3B0aW9uYWw8TGF5b3V0
VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZE1heEhlaWdodChjb25z
dCBCb3gmIGxheW91dEJveCwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVp
Z2h0KSBjb25zdAoreworICAgIHJldHVybiBjb21wdXRlZEhlaWdodFZhbHVlKGxheW91dEJveCwg
SGVpZ2h0VHlwZTo6TWF4LCBjb250YWluaW5nQmxvY2tIZWlnaHQpOworfQorCitPcHRpb25hbDxM
YXlvdXRVbml0PiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkTWluSGVpZ2h0
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxv
Y2tIZWlnaHQpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbXB1dGVkSGVpZ2h0VmFsdWUobGF5b3V0
Qm94LCBIZWlnaHRUeXBlOjpNaW4sIGNvbnRhaW5pbmdCbG9ja0hlaWdodCk7Cit9CisKK09wdGlv
bmFsPExheW91dFVuaXQ+IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRNaW5X
aWR0aChjb25zdCBCb3gmIGxheW91dEJveCwgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0
aCkKK3sKKyAgICByZXR1cm4gY29tcHV0ZWRXaWR0aFZhbHVlKGxheW91dEJveCwgV2lkdGhUeXBl
OjpNaW4sIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKK30KKworT3B0aW9uYWw8TGF5b3V0VW5pdD4g
Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZE1heFdpZHRoKGNvbnN0IEJveCYg
bGF5b3V0Qm94LCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKQoreworICAgIHJldHVy
biBjb21wdXRlZFdpZHRoVmFsdWUobGF5b3V0Qm94LCBXaWR0aFR5cGU6Ok1heCwgY29udGFpbmlu
Z0Jsb2NrV2lkdGgpOworfQorCitMYXlvdXRVbml0IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRy
eTo6c3RhdGljVmVydGljYWxQb3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQoY29uc3QgQm94
JiBsYXlvdXRCb3gsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWlu
dHMpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQo
KSk7CisKKyAgICAvLyBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgc2VjdGlvbiBhbmQgdGhlIG5l
eHQsIHRoZSB0ZXJtICJzdGF0aWMgcG9zaXRpb24iIChvZiBhbiBlbGVtZW50KSByZWZlcnMsIHJv
dWdobHksIHRvIHRoZSBwb3NpdGlvbiBhbiBlbGVtZW50IHdvdWxkIGhhdmUKKyAgICAvLyBoYWQg
aW4gdGhlIG5vcm1hbCBmbG93LiBNb3JlIHByZWNpc2VseSwgdGhlIHN0YXRpYyBwb3NpdGlvbiBm
b3IgJ3RvcCcgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHRvcCBlZGdlIG9mIHRoZSBjb250YWlu
aW5nIGJsb2NrIHRvIHRoZSB0b3AgbWFyZ2luCisgICAgLy8gZWRnZSBvZiBhIGh5cG90aGV0aWNh
bCBib3ggdGhhdCB3b3VsZCBoYXZlIGJlZW4gdGhlIGZpcnN0IGJveCBvZiB0aGUgZWxlbWVudCBp
ZiBpdHMgc3BlY2lmaWVkICdwb3NpdGlvbicgdmFsdWUgaGFkIGJlZW4gJ3N0YXRpYycgYW5kIGl0
cyBzcGVjaWZpZWQKKyAgICAvLyAnZmxvYXQnIGhhZCBiZWVuICdub25lJyBhbmQgaXRzIHNwZWNp
ZmllZCAnY2xlYXInIGhhZCBiZWVuICdub25lJy4gKE5vdGUgdGhhdCBkdWUgdG8gdGhlIHJ1bGVz
IGluIHNlY3Rpb24gOS43IHRoaXMgbWlnaHQgcmVxdWlyZSBhbHNvIGFzc3VtaW5nIGEgZGlmZmVy
ZW50CisgICAgLy8gY29tcHV0ZWQgdmFsdWUgZm9yICdkaXNwbGF5Jy4pIFRoZSB2YWx1ZSBpcyBu
ZWdhdGl2ZSBpZiB0aGUgaHlwb3RoZXRpY2FsIGJveCBpcyBhYm92ZSB0aGUgY29udGFpbmluZyBi
bG9jay4KKworICAgIC8vIFN0YXJ0IHdpdGggdGhpcyBib3gncyBib3JkZXIgYm94IG9mZnNldCBm
cm9tIHRoZSBwYXJlbnQncyBib3JkZXIgYm94LgorICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0
ID0gdGhpcy0+Zm9ybWF0dGluZ0NvbnRleHQoKTsKKyAgICBMYXlvdXRVbml0IHRvcDsKKyAgICBp
ZiAobGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpICYmIGxheW91dEJveC5wcmV2aW91
c0luRmxvd1NpYmxpbmcoKS0+aXNCbG9ja0xldmVsQm94KCkpIHsKKyAgICAgICAgLy8gQWRkIHNp
Ymxpbmcgb2Zmc2V0CisgICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9ICpsYXlv
dXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7CisgICAgICAgIGF1dG8mIHByZXZpb3VzSW5G
bG93Qm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChwcmV2aW91
c0luRmxvd1NpYmxpbmcsIEVzY2FwZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9t
ZXRyeSk7CisgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IGRvd25jYXN0PEJsb2NrRm9y
bWF0dGluZ1N0YXRlPihsYXlvdXRTdGF0ZSgpLmZvcm1hdHRpbmdTdGF0ZUZvckJveChwcmV2aW91
c0luRmxvd1NpYmxpbmcpKTsKKyAgICAgICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW5Gb3JQcmV2
aW91c0JveCA9IGZvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNJbkZs
b3dTaWJsaW5nKTsKKworICAgICAgICB0b3AgKz0gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3Qo
cHJldmlvdXNJbkZsb3dCb3hHZW9tZXRyeSkuYm90dG9tKCkgKyB1c2VkVmVydGljYWxNYXJnaW5G
b3JQcmV2aW91c0JveC5ub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXI7CisgICAgfSBlbHNlCisgICAg
ICAgIHRvcCA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveC5wYXJl
bnQoKSwgRXNjYXBlUmVhc29uOjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5KS5jb250
ZW50Qm94VG9wKCk7CisKKyAgICAvLyBSZXNvbHZlIHRvcCBhbGwgdGhlIHdheSB1cCB0byB0aGUg
Y29udGFpbmluZyBibG9jay4KKyAgICBhdXRvJiBjb250YWluaW5nQmxvY2sgPSBsYXlvdXRCb3gu
Y29udGFpbmluZ0Jsb2NrKCk7CisgICAgLy8gU3RhcnQgd2l0aCB0aGUgcGFyZW50IHNpbmNlIHdl
IHByZXRlbmQgdGhhdCB0aGlzIGJveCBpcyBub3JtYWwgZmxvdy4KKyAgICBmb3IgKGF1dG8qIGFu
Y2VzdG9yID0gJmxheW91dEJveC5wYXJlbnQoKTsgYW5jZXN0b3IgIT0gJmNvbnRhaW5pbmdCbG9j
azsgYW5jZXN0b3IgPSAmYW5jZXN0b3ItPmNvbnRhaW5pbmdCbG9jaygpKSB7CisgICAgICAgIGF1
dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goKmFuY2Vz
dG9yLCBFc2NhcGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0cnkpOworICAg
ICAgICAvLyBCb3hHZW9tZXRyeTo6dG9wIGlzIHRoZSBib3JkZXIgYm94IHRvcCBwb3NpdGlvbiBp
biBpdHMgY29udGFpbmluZyBibG9jaydzIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAgICB0b3Ag
Kz0gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChib3hHZW9tZXRyeSk7CisgICAgICAgIEFTU0VS
VCghYW5jZXN0b3ItPmlzUG9zaXRpb25lZCgpIHx8IGxheW91dEJveC5pc0ZpeGVkUG9zaXRpb25l
ZCgpKTsKKyAgICB9CisgICAgLy8gTW92ZSB0aGUgc3RhdGljIHBvc2l0aW9uIHJlbGF0aXZlIHRv
IHRoZSBwYWRkaW5nIGJveC4gVGhpcyBpcyB2ZXJ5IHNwZWNpZmljIHRvIGFib2x1dGVseSBwb3Np
dGlvbmVkIGJveGVzLgorICAgIHJldHVybiB0b3AgLSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2lj
YWxUb3A7Cit9CisKK0xheW91dFVuaXQgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0
aWNIb3Jpem9udGFsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50
cykgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgp
KTsKKyAgICAvLyBTZWUgc3RhdGljVmVydGljYWxQb3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9u
ZWQgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzdGF0aWMgcG9zaXRpb24uCisKKyAgICAvLyBT
dGFydCB3aXRoIHRoaXMgYm94J3MgYm9yZGVyIGJveCBvZmZzZXQgZnJvbSB0aGUgcGFyZW50J3Mg
Ym9yZGVyIGJveC4KKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRp
bmdDb250ZXh0KCk7CisgICAgYXV0byBsZWZ0ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlG
b3JCb3gobGF5b3V0Qm94LnBhcmVudCgpLCBFc2NhcGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRz
SW5GbG93R2VvbWV0cnkpLmNvbnRlbnRCb3hMZWZ0KCk7CisKKyAgICAvLyBSZXNvbHZlIGxlZnQg
YWxsIHRoZSB3YXkgdXAgdG8gdGhlIGNvbnRhaW5pbmcgYmxvY2suCisgICAgYXV0byYgY29udGFp
bmluZ0Jsb2NrID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOworICAgIC8vIFN0YXJ0IHdp
dGggdGhlIHBhcmVudCBzaW5jZSB3ZSBwcmV0ZW5kIHRoYXQgdGhpcyBib3ggaXMgbm9ybWFsIGZs
b3cuCisgICAgZm9yIChhdXRvKiBhbmNlc3RvciA9ICZsYXlvdXRCb3gucGFyZW50KCk7IGFuY2Vz
dG9yICE9ICZjb250YWluaW5nQmxvY2s7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5n
QmxvY2soKSkgeworICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0
Lmdlb21ldHJ5Rm9yQm94KCphbmNlc3RvciwgRXNjYXBlUmVhc29uOjpPdXRPZkZsb3dCb3hOZWVk
c0luRmxvd0dlb21ldHJ5KTsKKyAgICAgICAgLy8gQm94R2VvbWV0cnk6OmxlZnQgaXMgdGhlIGJv
cmRlciBib3ggbGVmdCBwb3NpdGlvbiBpbiBpdHMgY29udGFpbmluZyBibG9jaydzIGNvb3JkaW5h
dGUgc3lzdGVtLgorICAgICAgICBsZWZ0ICs9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hMZWZ0KGJv
eEdlb21ldHJ5KTsKKyAgICAgICAgQVNTRVJUKCFhbmNlc3Rvci0+aXNQb3NpdGlvbmVkKCkgfHwg
bGF5b3V0Qm94LmlzRml4ZWRQb3NpdGlvbmVkKCkpOworICAgIH0KKyAgICAvLyBNb3ZlIHRoZSBz
dGF0aWMgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHBhZGRpbmcgYm94LiBUaGlzIGlzIHZlcnkg
c3BlY2lmaWMgdG8gYWJvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMuCisgICAgcmV0dXJuIGxlZnQg
LSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbExlZnQ7Cit9CisKK0xheW91dFVuaXQgRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzaHJpbmtUb0ZpdFdpZHRoKGNvbnN0IEJveCYgZm9y
bWF0dGluZ0NvbnRleHRSb290LCBMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKQoreworICAgIExP
R19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbV2lkdGhd
IC0+IHNocmluayB0byBmaXQgLT4gdW5zdXBwb3J0ZWQgLT4gd2lkdGgoIiA8PCBMYXlvdXRVbml0
IHsgfSA8PCAicHgpIGxheW91dEJveDogIiA8PCAmZm9ybWF0dGluZ0NvbnRleHRSb290IDw8ICIp
Iik7CisgICAgQVNTRVJUKGZvcm1hdHRpbmdDb250ZXh0Um9vdC5lc3RhYmxpc2hlc0Zvcm1hdHRp
bmdDb250ZXh0KCkpOworCisgICAgLy8gQ2FsY3VsYXRpb24gb2YgdGhlIHNocmluay10by1maXQg
d2lkdGggaXMgc2ltaWxhciB0byBjYWxjdWxhdGluZyB0aGUgd2lkdGggb2YgYSB0YWJsZSBjZWxs
IHVzaW5nIHRoZSBhdXRvbWF0aWMgdGFibGUgbGF5b3V0IGFsZ29yaXRobS4KKyAgICAvLyBSb3Vn
aGx5OiBjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCB3aWR0aCBieSBmb3JtYXR0aW5nIHRoZSBjb250
ZW50IHdpdGhvdXQgYnJlYWtpbmcgbGluZXMgb3RoZXIgdGhhbiB3aGVyZSBleHBsaWNpdCBsaW5l
IGJyZWFrcyBvY2N1ciwKKyAgICAvLyBhbmQgYWxzbyBjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBt
aW5pbXVtIHdpZHRoLCBlLmcuLCBieSB0cnlpbmcgYWxsIHBvc3NpYmxlIGxpbmUgYnJlYWtzLiBD
U1MgMi4yIGRvZXMgbm90IGRlZmluZSB0aGUgZXhhY3QgYWxnb3JpdGhtLgorICAgIC8vIFRoaXJk
bHksIGZpbmQgdGhlIGF2YWlsYWJsZSB3aWR0aDogaW4gdGhpcyBjYXNlLCB0aGlzIGlzIHRoZSB3
aWR0aCBvZiB0aGUgY29udGFpbmluZyBibG9jayBtaW51cyB0aGUgdXNlZCB2YWx1ZXMgb2YgJ21h
cmdpbi1sZWZ0JywgJ2JvcmRlci1sZWZ0LXdpZHRoJywKKyAgICAvLyAncGFkZGluZy1sZWZ0Jywg
J3BhZGRpbmctcmlnaHQnLCAnYm9yZGVyLXJpZ2h0LXdpZHRoJywgJ21hcmdpbi1yaWdodCcsIGFu
ZCB0aGUgd2lkdGhzIG9mIGFueSByZWxldmFudCBzY3JvbGwgYmFycy4KKworICAgIC8vIFRoZW4g
dGhlIHNocmluay10by1maXQgd2lkdGggaXM6IG1pbihtYXgocHJlZmVycmVkIG1pbmltdW0gd2lk
dGgsIGF2YWlsYWJsZSB3aWR0aCksIHByZWZlcnJlZCB3aWR0aCkuCisgICAgYXV0byBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07CisgICAg
YXV0byBoYXNDb250ZW50ID0gaXM8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3Qp
ICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4oZm9ybWF0dGluZ0NvbnRleHRSb290KS5oYXNJbkZs
b3dPckZsb2F0aW5nQ2hpbGQoKTsKKyAgICAvLyBUaGUgdXNlZCB3aWR0aCBvZiB0aGUgY29udGFp
bm1lbnQgYm94IGlzIGRldGVybWluZWQgYXMgaWYgcGVyZm9ybWluZyBhIG5vcm1hbCBsYXlvdXQg
b2YgdGhlIGJveCwgZXhjZXB0IHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBoYXZpbmcgbm8gY29udGVu
dC4KKyAgICBhdXRvIHNob3VsZElnbm9yZUNvbnRlbnQgPSBmb3JtYXR0aW5nQ29udGV4dFJvb3Qu
aXNTaXplQ29udGFpbm1lbnRCb3goKTsgIAorICAgIGlmIChoYXNDb250ZW50ICYmICFzaG91bGRJ
Z25vcmVDb250ZW50KSB7CisgICAgICAgIGF1dG8mIHJvb3QgPSBkb3duY2FzdDxDb250YWluZXJC
b3g+KGZvcm1hdHRpbmdDb250ZXh0Um9vdCk7CisgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0
ZUZvclJvb3QgPSBsYXlvdXRTdGF0ZSgpLmVuc3VyZUZvcm1hdHRpbmdTdGF0ZShyb290KTsKKyAg
ICAgICAgYXV0byBwcmVjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBmb3JtYXR0
aW5nU3RhdGVGb3JSb290LmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKKyAgICAgICAgaWYg
KCFwcmVjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMpCisgICAgICAgICAgICBpbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0Nv
bnRleHQocm9vdCwgbGF5b3V0U3RhdGUoKSktPmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJh
aW50cygpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzID0gKnByZWNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKKyAgICB9CisgICAg
cmV0dXJuIHN0ZDo6bWluKHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11
bSwgYXZhaWxhYmxlV2lkdGgpLCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0pOwor
fQorCitWZXJ0aWNhbEdlb21ldHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZG
bG93Tm9uUmVwbGFjZWRWZXJ0aWNhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYgbGF5b3V0
Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywg
Y29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3Zl
cnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Cit7
CisgICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhbGF5b3V0
Qm94LmlzUmVwbGFjZWRCb3goKSk7CisgICAgQVNTRVJUKHZlcnRpY2FsQ29uc3RyYWludHMubG9n
aWNhbEhlaWdodCk7CisKKyAgICAvLyAxMC42LjQgQWJzb2x1dGVseSBwb3NpdGlvbmVkLCBub24t
cmVwbGFjZWQgZWxlbWVudHMKKyAgICAvLworICAgIC8vIEZvciBhYnNvbHV0ZWx5IHBvc2l0aW9u
ZWQgZWxlbWVudHMsIHRoZSB1c2VkIHZhbHVlcyBvZiB0aGUgdmVydGljYWwgZGltZW5zaW9ucyBt
dXN0IHNhdGlzZnkgdGhpcyBjb25zdHJhaW50OgorICAgIC8vICd0b3AnICsgJ21hcmdpbi10b3An
ICsgJ2JvcmRlci10b3Atd2lkdGgnICsgJ3BhZGRpbmctdG9wJyArICdoZWlnaHQnICsgJ3BhZGRp
bmctYm90dG9tJyArICdib3JkZXItYm90dG9tLXdpZHRoJyArICdtYXJnaW4tYm90dG9tJyArICdi
b3R0b20nCisgICAgLy8gPSBoZWlnaHQgb2YgY29udGFpbmluZyBibG9jaworCisgICAgLy8gSWYg
YWxsIHRocmVlIG9mICd0b3AnLCAnaGVpZ2h0JywgYW5kICdib3R0b20nIGFyZSBhdXRvLCBzZXQg
J3RvcCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbiBhbmQgYXBwbHkgcnVsZSBudW1iZXIgdGhyZWUg
YmVsb3cuCisKKyAgICAvLyBJZiBub25lIG9mIHRoZSB0aHJlZSBhcmUgJ2F1dG8nOiBJZiBib3Ro
ICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHNvbHZlIHRoZSBl
cXVhdGlvbiB1bmRlciB0aGUgZXh0cmEKKyAgICAvLyBjb25zdHJhaW50IHRoYXQgdGhlIHR3byBt
YXJnaW5zIGdldCBlcXVhbCB2YWx1ZXMuIElmIG9uZSBvZiAnbWFyZ2luLXRvcCcgb3IgJ21hcmdp
bi1ib3R0b20nIGlzICdhdXRvJywgc29sdmUgdGhlIGVxdWF0aW9uIGZvciB0aGF0IHZhbHVlLgor
ICAgIC8vIElmIHRoZSB2YWx1ZXMgYXJlIG92ZXItY29uc3RyYWluZWQsIGlnbm9yZSB0aGUgdmFs
dWUgZm9yICdib3R0b20nIGFuZCBzb2x2ZSBmb3IgdGhhdCB2YWx1ZS4KKworICAgIC8vIE90aGVy
d2lzZSwgcGljayB0aGUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc2l4IHJ1bGVzIHRoYXQgYXBwbGll
cy4KKworICAgIC8vIDEuICd0b3AnIGFuZCAnaGVpZ2h0JyBhcmUgJ2F1dG8nIGFuZCAnYm90dG9t
JyBpcyBub3QgJ2F1dG8nLCB0aGVuIHRoZSBoZWlnaHQgaXMgYmFzZWQgb24gdGhlIGNvbnRlbnQg
cGVyIDEwLjYuNywKKyAgICAvLyAgICAgc2V0ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tdG9w
JyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAsIGFuZCBzb2x2ZSBmb3IgJ3RvcCcKKyAgICAvLyAy
LiAndG9wJyBhbmQgJ2JvdHRvbScgYXJlICdhdXRvJyBhbmQgJ2hlaWdodCcgaXMgbm90ICdhdXRv
JywgdGhlbiBzZXQgJ3RvcCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbiwgc2V0ICdhdXRvJyB2YWx1
ZXMgZm9yCisgICAgLy8gICAgJ21hcmdpbi10b3AnIGFuZCAnbWFyZ2luLWJvdHRvbScgdG8gMCwg
YW5kIHNvbHZlIGZvciAnYm90dG9tJworICAgIC8vIDMuICdoZWlnaHQnIGFuZCAnYm90dG9tJyBh
cmUgJ2F1dG8nIGFuZCAndG9wJyBpcyBub3QgJ2F1dG8nLCB0aGVuIHRoZSBoZWlnaHQgaXMgYmFz
ZWQgb24gdGhlIGNvbnRlbnQgcGVyIDEwLjYuNywgc2V0ICdhdXRvJworICAgIC8vICAgICB2YWx1
ZXMgZm9yICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAsIGFuZCBzb2x2ZSBm
b3IgJ2JvdHRvbScKKyAgICAvLyA0LiAndG9wJyBpcyAnYXV0bycsICdoZWlnaHQnIGFuZCAnYm90
dG9tJyBhcmUgbm90ICdhdXRvJywgdGhlbiBzZXQgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi10
b3AnIGFuZCAnbWFyZ2luLWJvdHRvbScgdG8gMCwgYW5kIHNvbHZlIGZvciAndG9wJworICAgIC8v
IDUuICdoZWlnaHQnIGlzICdhdXRvJywgJ3RvcCcgYW5kICdib3R0b20nIGFyZSBub3QgJ2F1dG8n
LCB0aGVuICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20n
IGFyZSBzZXQgdG8gMCBhbmQgc29sdmUgZm9yICdoZWlnaHQnCisgICAgLy8gNi4gJ2JvdHRvbScg
aXMgJ2F1dG8nLCAndG9wJyBhbmQgJ2hlaWdodCcgYXJlIG5vdCAnYXV0bycsIHRoZW4gc2V0ICdh
dXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAgYW5k
IHNvbHZlIGZvciAnYm90dG9tJworCisgICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlz
LT5mb3JtYXR0aW5nQ29udGV4dCgpOworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxl
KCk7CisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZv
ckJveChsYXlvdXRCb3gpOworICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gKnZlcnRp
Y2FsQ29uc3RyYWludHMubG9naWNhbEhlaWdodDsKKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dp
ZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKKworICAgIGF1dG8gdG9w
ID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2FsVG9wKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRo
KTsKKyAgICBhdXRvIGJvdHRvbSA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbEJvdHRvbSgp
LCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisgICAgYXV0byBoZWlnaHQgPSBvdmVycmlkZGVuVmVy
dGljYWxWYWx1ZXMuaGVpZ2h0ID8gb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodC52YWx1
ZSgpIDogY29tcHV0ZWRIZWlnaHQobGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tIZWlnaHQpOwor
ICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZFZlcnRp
Y2FsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICBVc2VkVmVy
dGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB1c2VkVmVydGljYWxNYXJnaW47IAorICAg
IGF1dG8gcGFkZGluZ1RvcCA9IGJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKDApOwor
ICAgIGF1dG8gcGFkZGluZ0JvdHRvbSA9IGJveEdlb21ldHJ5LnBhZGRpbmdCb3R0b20oKS52YWx1
ZU9yKDApOworICAgIGF1dG8gYm9yZGVyVG9wID0gYm94R2VvbWV0cnkuYm9yZGVyVG9wKCk7Cisg
ICAgYXV0byBib3JkZXJCb3R0b20gPSBib3hHZW9tZXRyeS5ib3JkZXJCb3R0b20oKTsKKworICAg
IGlmICghdG9wICYmICFoZWlnaHQgJiYgIWJvdHRvbSkKKyAgICAgICAgdG9wID0gc3RhdGljVmVy
dGljYWxQb3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQobGF5b3V0Qm94LCB2ZXJ0aWNhbENv
bnN0cmFpbnRzKTsKKworICAgIGlmICh0b3AgJiYgaGVpZ2h0ICYmIGJvdHRvbSkgeworICAgICAg
ICBpZiAoIWNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlICYmICFjb21wdXRlZFZlcnRpY2Fs
TWFyZ2luLmFmdGVyKSB7CisgICAgICAgICAgICBhdXRvIG1hcmdpbkJlZm9yZUFuZEFmdGVyID0g
Y29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsg
KmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqYm90dG9tKTsKKyAgICAg
ICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IHsgbWFyZ2luQmVmb3JlQW5kQWZ0ZXIgLyAyLCBt
YXJnaW5CZWZvcmVBbmRBZnRlciAvIDIgfTsKKyAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWRW
ZXJ0aWNhbE1hcmdpbi5iZWZvcmUpIHsKKyAgICAgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5h
ZnRlciA9ICpjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyOworICAgICAgICAgICAgdXNlZFZl
cnRpY2FsTWFyZ2luLmJlZm9yZSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9y
ZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90
dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7CisgICAgICAgIH0gZWxz
ZSBpZiAoIWNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIpIHsKKyAgICAgICAgICAgIHVzZWRW
ZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPSAqY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmU7Cisg
ICAgICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgPSBjb250YWluaW5nQmxvY2tIZWln
aHQgLSAoKnRvcCArIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRk
aW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqYm90dG9t
KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7ICpj
b21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSwgKmNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0
ZXIgfTsKKyAgICAgICAgLy8gT3Zlci1jb25zdHJhaW5lZD8KKyAgICAgICAgYXV0byBib3hIZWln
aHQgPSAqdG9wICsgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRp
bmdUb3AgKyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0
aWNhbE1hcmdpbi5hZnRlciArICpib3R0b207CisgICAgICAgIGlmIChib3hIZWlnaHQgIT0gY29u
dGFpbmluZ0Jsb2NrSGVpZ2h0KQorICAgICAgICAgICAgYm90dG9tID0gY29udGFpbmluZ0Jsb2Nr
SGVpZ2h0IC0gKCp0b3AgKyB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsg
cGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNl
ZFZlcnRpY2FsTWFyZ2luLmFmdGVyKTsKKyAgICB9CisKKyAgICBpZiAoIXRvcCAmJiAhaGVpZ2h0
ICYmIGJvdHRvbSkgeworICAgICAgICAvLyAjMQorICAgICAgICBoZWlnaHQgPSBjb250ZW50SGVp
Z2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KGxheW91dEJveCk7CisgICAgICAgIHVzZWRWZXJ0
aWNhbE1hcmdpbiA9IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwg
Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgICAgIHRvcCA9
IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICh1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9y
ZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90
dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7IAorICAgIH0KKworICAg
IGlmICghdG9wICYmICFib3R0b20gJiYgaGVpZ2h0KSB7CisgICAgICAgIC8vICMyCisgICAgICAg
IHRvcCA9IHN0YXRpY1ZlcnRpY2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGxheW91
dEJveCwgdmVydGljYWxDb25zdHJhaW50cyk7CisgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbiA9
IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0
aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgICAgIGJvdHRvbSA9IGNvbnRhaW5p
bmdCbG9ja0hlaWdodCAtICgqdG9wICsgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRl
clRvcCArIHBhZGRpbmdUb3AgKyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRv
bSArIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlcik7CisgICAgfQorCisgICAgaWYgKCFoZWlnaHQg
JiYgIWJvdHRvbSAmJiB0b3ApIHsKKyAgICAgICAgLy8gIzMKKyAgICAgICAgaGVpZ2h0ID0gY29u
dGVudEhlaWdodEZvckZvcm1hdHRpbmdDb250ZXh0Um9vdChsYXlvdXRCb3gpOworICAgICAgICB1
c2VkVmVydGljYWxNYXJnaW4gPSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVl
T3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OworICAgICAg
ICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIHVzZWRWZXJ0aWNhbE1h
cmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdC
b3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIpOworICAgIH0K
KworICAgIGlmICghdG9wICYmIGhlaWdodCAmJiBib3R0b20pIHsKKyAgICAgICAgLy8gIzQKKyAg
ICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luID0geyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9y
ZS52YWx1ZU9yKDApLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsK
KyAgICAgICAgdG9wID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKHVzZWRWZXJ0aWNhbE1hcmdp
bi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0
b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgKyAqYm90dG9tKTsK
KyAgICB9CisKKyAgICBpZiAoIWhlaWdodCAmJiB0b3AgJiYgYm90dG9tKSB7CisgICAgICAgIC8v
ICM1CisgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdp
bi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9y
KDApIH07CisgICAgICAgIGhlaWdodCA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsg
dXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBwYWRk
aW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyICsgKmJv
dHRvbSk7CisgICAgfQorCisgICAgaWYgKCFib3R0b20gJiYgdG9wICYmIGhlaWdodCkgeworICAg
ICAgICAvLyAjNgorICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7IGNvbXB1dGVkVmVydGlj
YWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIu
dmFsdWVPcigwKSB9OworICAgICAgICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAo
KnRvcCArIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9w
ICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVydGljYWxN
YXJnaW4uYWZ0ZXIpOworICAgIH0KKworICAgIEFTU0VSVCh0b3ApOworICAgIEFTU0VSVChib3R0
b20pOworICAgIEFTU0VSVChoZWlnaHQpOworCisgICAgLy8gRm9yIG91dC1vZi1mbG93IGVsZW1l
bnRzIHRoZSBjb250YWluaW5nIGJsb2NrIGlzIGZvcm1lZCBieSB0aGUgcGFkZGluZyBlZGdlIG9m
IHRoZSBhbmNlc3Rvci4KKyAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwb3NpdGlvbmVkIHZhbHVl
IGlzIGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgcGFkZGluZyBib3guIExldCdzIGNv
bnZlcnQgaXQgdG8gYm9yZGVyIGJveCBjb29yZGluYXRlIHN5c3RlbS4KKyAgICBhdXRvIGNvbnRh
aW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2UgPSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2lj
YWxUb3A7CisgICAgKnRvcCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOwor
ICAgICpib3R0b20gKz0gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZTsKKworICAg
IExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbUG9z
aXRpb25dW0hlaWdodF1bTWFyZ2luXSAtPiBvdXQtb2YtZmxvdyBub24tcmVwbGFjZWQgLT4gdG9w
KCIgPDwgKnRvcCA8PCAicHgpIGJvdHRvbSgiICA8PCAqYm90dG9tIDw8ICJweCkgaGVpZ2h0KCIg
PDwgKmhlaWdodCA8PCAicHgpIG1hcmdpbigiIDw8IHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUg
PDwgInB4LCAiICA8PCB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgPDwgInB4KSBsYXlvdXRCb3go
IiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7CisgICAgcmV0dXJuIHsgKnRvcCwgKmJvdHRvbSwgeyAq
aGVpZ2h0LCB1c2VkVmVydGljYWxNYXJnaW4gfSB9OworfQorCitIb3Jpem9udGFsR2VvbWV0cnkg
Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dOb25SZXBsYWNlZEhvcml6b250
YWxHZW9tZXRyeShjb25zdCBDb250YWluZXJCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzJiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKK3sKKyAgICBBU1NFUlQo
bGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guaXNSZXBsYWNl
ZEJveCgpKTsKKyAgICAKKyAgICAvLyAxMC4zLjcgQWJzb2x1dGVseSBwb3NpdGlvbmVkLCBub24t
cmVwbGFjZWQgZWxlbWVudHMKKyAgICAvLworICAgIC8vICdsZWZ0JyArICdtYXJnaW4tbGVmdCcg
KyAnYm9yZGVyLWxlZnQtd2lkdGgnICsgJ3BhZGRpbmctbGVmdCcgKyAnd2lkdGgnICsgJ3BhZGRp
bmctcmlnaHQnICsgJ2JvcmRlci1yaWdodC13aWR0aCcgKyAnbWFyZ2luLXJpZ2h0JyArICdyaWdo
dCcKKyAgICAvLyA9IHdpZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKKworICAgIC8vIElmIGFsbCB0
aHJlZSBvZiAnbGVmdCcsICd3aWR0aCcsIGFuZCAncmlnaHQnIGFyZSAnYXV0byc6IEZpcnN0IHNl
dCBhbnkgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcg
dG8gMC4KKyAgICAvLyBUaGVuLCBpZiB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGVs
ZW1lbnQgZXN0YWJsaXNoaW5nIHRoZSBzdGF0aWMtcG9zaXRpb24gY29udGFpbmluZyBibG9jayBp
cyAnbHRyJyBzZXQgJ2xlZnQnIHRvIHRoZSBzdGF0aWMKKyAgICAvLyBwb3NpdGlvbiBhbmQgYXBw
bHkgcnVsZSBudW1iZXIgdGhyZWUgYmVsb3c7IG90aGVyd2lzZSwgc2V0ICdyaWdodCcgdG8gdGhl
IHN0YXRpYyBwb3NpdGlvbiBhbmQgYXBwbHkgcnVsZSBudW1iZXIgb25lIGJlbG93LgorICAgIC8v
CisgICAgLy8gSWYgbm9uZSBvZiB0aGUgdGhyZWUgaXMgJ2F1dG8nOiBJZiBib3RoICdtYXJnaW4t
bGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIGFyZSAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiB1
bmRlciB0aGUgZXh0cmEgY29uc3RyYWludCB0aGF0IHRoZSB0d28gbWFyZ2lucyBnZXQgZXF1YWwg
dmFsdWVzLAorICAgIC8vIHVubGVzcyB0aGlzIHdvdWxkIG1ha2UgdGhlbSBuZWdhdGl2ZSwgaW4g
d2hpY2ggY2FzZSB3aGVuIGRpcmVjdGlvbiBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAnbHRy
JyAoJ3J0bCcpLCBzZXQgJ21hcmdpbi1sZWZ0JyAoJ21hcmdpbi1yaWdodCcpIHRvIHplcm8gYW5k
CisgICAgLy8gc29sdmUgZm9yICdtYXJnaW4tcmlnaHQnICgnbWFyZ2luLWxlZnQnKS4gSWYgb25l
IG9mICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgaXMgJ2F1dG8nLCBzb2x2ZSB0aGUg
ZXF1YXRpb24gZm9yIHRoYXQgdmFsdWUuCisgICAgLy8gSWYgdGhlIHZhbHVlcyBhcmUgb3Zlci1j
b25zdHJhaW5lZCwgaWdub3JlIHRoZSB2YWx1ZSBmb3IgJ2xlZnQnIChpbiBjYXNlIHRoZSAnZGly
ZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAncnRsJykgb3IgJ3Jp
Z2h0JworICAgIC8vIChpbiBjYXNlICdkaXJlY3Rpb24nIGlzICdsdHInKSBhbmQgc29sdmUgZm9y
IHRoYXQgdmFsdWUuCisgICAgLy8KKyAgICAvLyBPdGhlcndpc2UsIHNldCAnYXV0bycgdmFsdWVz
IGZvciAnbWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyB0byAwLCBhbmQgcGljayB0aGUg
b25lIG9mIHRoZSBmb2xsb3dpbmcgc2l4IHJ1bGVzIHRoYXQgYXBwbGllcy4KKyAgICAvLworICAg
IC8vIDEuICdsZWZ0JyBhbmQgJ3dpZHRoJyBhcmUgJ2F1dG8nIGFuZCAncmlnaHQnIGlzIG5vdCAn
YXV0bycsIHRoZW4gdGhlIHdpZHRoIGlzIHNocmluay10by1maXQuIFRoZW4gc29sdmUgZm9yICds
ZWZ0JworICAgIC8vIDIuICdsZWZ0JyBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nIGFuZCAnd2lkdGgn
IGlzIG5vdCAnYXV0bycsIHRoZW4gaWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBl
bGVtZW50IGVzdGFibGlzaGluZyB0aGUgc3RhdGljLXBvc2l0aW9uIAorICAgIC8vICAgIGNvbnRh
aW5pbmcgYmxvY2sgaXMgJ2x0cicgc2V0ICdsZWZ0JyB0byB0aGUgc3RhdGljIHBvc2l0aW9uLCBv
dGhlcndpc2Ugc2V0ICdyaWdodCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbi4KKyAgICAvLyAgICBU
aGVuIHNvbHZlIGZvciAnbGVmdCcgKGlmICdkaXJlY3Rpb24gaXMgJ3J0bCcpIG9yICdyaWdodCcg
KGlmICdkaXJlY3Rpb24nIGlzICdsdHInKS4KKyAgICAvLyAzLiAnd2lkdGgnIGFuZCAncmlnaHQn
IGFyZSAnYXV0bycgYW5kICdsZWZ0JyBpcyBub3QgJ2F1dG8nLCB0aGVuIHRoZSB3aWR0aCBpcyBz
aHJpbmstdG8tZml0IC4gVGhlbiBzb2x2ZSBmb3IgJ3JpZ2h0JworICAgIC8vIDQuICdsZWZ0JyBp
cyAnYXV0bycsICd3aWR0aCcgYW5kICdyaWdodCcgYXJlIG5vdCAnYXV0bycsIHRoZW4gc29sdmUg
Zm9yICdsZWZ0JworICAgIC8vIDUuICd3aWR0aCcgaXMgJ2F1dG8nLCAnbGVmdCcgYW5kICdyaWdo
dCcgYXJlIG5vdCAnYXV0bycsIHRoZW4gc29sdmUgZm9yICd3aWR0aCcKKyAgICAvLyA2LiAncmln
aHQnIGlzICdhdXRvJywgJ2xlZnQnIGFuZCAnd2lkdGgnIGFyZSBub3QgJ2F1dG8nLCB0aGVuIHNv
bHZlIGZvciAncmlnaHQnCisKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZv
cm1hdHRpbmdDb250ZXh0KCk7CisgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsK
KyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94
KGxheW91dEJveCk7CisgICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250YWxD
b25zdHJhaW50cy5sb2dpY2FsV2lkdGg7CisgICAgYXV0byBpc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
ID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVj
dGlvbigpOworICAgIAorICAgIGF1dG8gbGVmdCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNh
bExlZnQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworICAgIGF1dG8gcmlnaHQgPSBjb21wdXRl
ZFZhbHVlKHN0eWxlLmxvZ2ljYWxSaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisgICAg
YXV0byB3aWR0aCA9IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoID8gb3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMud2lkdGggOiBjb21wdXRlZFdpZHRoKGxheW91dEJveCwgY29udGFp
bmluZ0Jsb2NrV2lkdGgpOworICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2Vv
bWV0cnk6OmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cyk7CisgICAgVXNlZEhvcml6b250YWxNYXJnaW4gdXNlZEhvcml6b250YWxNYXJnaW47
CisgICAgYXV0byBwYWRkaW5nTGVmdCA9IGJveEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCkudmFsdWVP
cigwKTsKKyAgICBhdXRvIHBhZGRpbmdSaWdodCA9IGJveEdlb21ldHJ5LnBhZGRpbmdSaWdodCgp
LnZhbHVlT3IoMCk7CisgICAgYXV0byBib3JkZXJMZWZ0ID0gYm94R2VvbWV0cnkuYm9yZGVyTGVm
dCgpOworICAgIGF1dG8gYm9yZGVyUmlnaHQgPSBib3hHZW9tZXRyeS5ib3JkZXJSaWdodCgpOwor
ICAgIGlmICghbGVmdCAmJiAhd2lkdGggJiYgIXJpZ2h0KSB7CisgICAgICAgIC8vIElmIGFsbCB0
aHJlZSBvZiAnbGVmdCcsICd3aWR0aCcsIGFuZCAncmlnaHQnIGFyZSAnYXV0byc6IEZpcnN0IHNl
dCBhbnkgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcg
dG8gMC4KKyAgICAgICAgLy8gVGhlbiwgaWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRo
ZSBlbGVtZW50IGVzdGFibGlzaGluZyB0aGUgc3RhdGljLXBvc2l0aW9uIGNvbnRhaW5pbmcgYmxv
Y2sgaXMgJ2x0cicgc2V0ICdsZWZ0JyB0byB0aGUgc3RhdGljCisgICAgICAgIC8vIHBvc2l0aW9u
IGFuZCBhcHBseSBydWxlIG51bWJlciB0aHJlZSBiZWxvdzsgb3RoZXJ3aXNlLCBzZXQgJ3JpZ2h0
JyB0byB0aGUgc3RhdGljIHBvc2l0aW9uIGFuZCBhcHBseSBydWxlIG51bWJlciBvbmUgYmVsb3cu
CisgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uc3RhcnQudmFsdWVPcigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9y
KDApIH07CisKKyAgICAgICAgYXV0byBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24gPSBzdGF0aWNI
b3Jpem9udGFsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGxheW91dEJveCwgaG9yaXpv
bnRhbENvbnN0cmFpbnRzKTsKKyAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pCisg
ICAgICAgICAgICBsZWZ0ID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uOworICAgICAgICBlbHNl
CisgICAgICAgICAgICByaWdodCA9IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbjsKKyAgICB9IGVs
c2UgaWYgKGxlZnQgJiYgd2lkdGggJiYgcmlnaHQpIHsKKyAgICAgICAgLy8gSWYgbm9uZSBvZiB0
aGUgdGhyZWUgaXMgJ2F1dG8nOiBJZiBib3RoICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmln
aHQnIGFyZSAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0aGUgZXh0cmEgY29uc3Ry
YWludCB0aGF0IHRoZSB0d28gbWFyZ2lucyBnZXQgZXF1YWwgdmFsdWVzLAorICAgICAgICAvLyB1
bmxlc3MgdGhpcyB3b3VsZCBtYWtlIHRoZW0gbmVnYXRpdmUsIGluIHdoaWNoIGNhc2Ugd2hlbiBk
aXJlY3Rpb24gb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicgKCdydGwnKSwgc2V0ICdt
YXJnaW4tbGVmdCcgKCdtYXJnaW4tcmlnaHQnKSB0byB6ZXJvIGFuZAorICAgICAgICAvLyBzb2x2
ZSBmb3IgJ21hcmdpbi1yaWdodCcgKCdtYXJnaW4tbGVmdCcpLiBJZiBvbmUgb2YgJ21hcmdpbi1s
ZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBpcyAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiBmb3Ig
dGhhdCB2YWx1ZS4KKyAgICAgICAgLy8gSWYgdGhlIHZhbHVlcyBhcmUgb3Zlci1jb25zdHJhaW5l
ZCwgaWdub3JlIHRoZSB2YWx1ZSBmb3IgJ2xlZnQnIChpbiBjYXNlIHRoZSAnZGlyZWN0aW9uJyBw
cm9wZXJ0eSBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAncnRsJykgb3IgJ3JpZ2h0JworICAg
ICAgICAvLyAoaW4gY2FzZSAnZGlyZWN0aW9uJyBpcyAnbHRyJykgYW5kIHNvbHZlIGZvciB0aGF0
IHZhbHVlLgorICAgICAgICBpZiAoIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiAh
Y29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgeworICAgICAgICAgICAgYXV0byBtYXJnaW5T
dGFydEFuZEVuZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCAr
IHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqcmln
aHQpOworICAgICAgICAgICAgaWYgKG1hcmdpblN0YXJ0QW5kRW5kID49IDApCisgICAgICAgICAg
ICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4gPSB7IG1hcmdpblN0YXJ0QW5kRW5kIC8gMiwgbWFy
Z2luU3RhcnRBbmRFbmQgLyAyIH07CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAg
ICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICB1c2Vk
SG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IDBfbHU7CisgICAgICAgICAgICAgICAgICAgIHVzZWRI
b3Jpem9udGFsTWFyZ2luLmVuZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNl
ZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lk
dGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICpyaWdodCk7CisgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5k
ID0gMF9sdTsKKyAgICAgICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQg
PSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVm
dCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxN
YXJnaW4uZW5kICsgKnJpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0gZWxzZSBpZiAoIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCkgeworICAg
ICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gKmNvbXB1dGVkSG9yaXpvbnRhbE1h
cmdpbi5lbmQ7CisgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNvbnRh
aW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndp
ZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5l
bmQgKyAqcmlnaHQpOworICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uZW5kKSB7CisgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9ICpjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQ7CisgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1h
cmdpbi5lbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFs
TWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGlu
Z1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqcmlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4gPSB7ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4u
c3RhcnQsICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kIH07CisgICAgICAgICAgICAvLyBP
dmVyY29uc3RyYWluZWQ/IElnbm9yZSByaWdodCAobGVmdCkuCisgICAgICAgICAgICBpZiAoaXNM
ZWZ0VG9SaWdodERpcmVjdGlvbikKKyAgICAgICAgICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdC
bG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgKmxlZnQgKyBib3JkZXJM
ZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCAr
IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgbGVmdCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2lu
LnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0
ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOworICAg
ICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgJ2F1dG8nIHZh
bHVlcyBmb3IgJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgdG8gMCwgYW5kIHBpY2sg
dGhlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHNpeCBydWxlcyB0aGF0IGFwcGxpZXMuCisgICAgICAg
IHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQu
dmFsdWVPcigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07Cisg
ICAgfQorCisgICAgaWYgKCFsZWZ0ICYmICF3aWR0aCAmJiByaWdodCkgeworICAgICAgICAvLyAj
MQorICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSB3aWR0aCBieSBzb2x2aW5nIGZv
ciAnd2lkdGgnIGFmdGVyIHNldHRpbmcgJ2xlZnQnIChpbiBjYXNlIDEpIHRvIDAKKyAgICAgICAg
bGVmdCA9IExheW91dFVuaXQgeyAwIH07CisgICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBj
b250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0
ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQg
KyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOworICAgICAgICB3aWR0aCA9IHNo
cmlua1RvRml0V2lkdGgobGF5b3V0Qm94LCBhdmFpbGFibGVXaWR0aCk7CisgICAgICAgIGxlZnQg
PSBjb250YWluaW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJv
cmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCAgKyBib3JkZXJS
aWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7CisgICAgfSBlbHNlIGlm
ICghbGVmdCAmJiAhcmlnaHQgJiYgd2lkdGgpIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAgYXV0
byBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24gPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb25Gb3JP
dXRPZkZsb3dQb3NpdGlvbmVkKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAg
ICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pIHsKKyAgICAgICAgICAgIGxlZnQgPSBz
dGF0aWNIb3Jpem9udGFsUG9zaXRpb247CisgICAgICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdC
bG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJM
ZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCAr
IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICByaWdodCA9IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbjsKKyAgICAgICAgICAgIGxlZnQgPSBj
b250YWluaW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRl
ckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0
ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKKyAgICAgICAgfQorICAgIH0g
ZWxzZSBpZiAoIXdpZHRoICYmICFyaWdodCAmJiBsZWZ0KSB7CisgICAgICAgIC8vICMzCisgICAg
ICAgIC8vIENhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIHdpZHRoIGJ5IHNvbHZpbmcgZm9yICd3aWR0
aCcgYWZ0ZXIgc2V0dGluZyAncmlnaHQnIChpbiBjYXNlIDMpIHRvIDAKKyAgICAgICAgcmlnaHQg
PSBMYXlvdXRVbml0IHsgMCB9OworICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gY29udGFp
bmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJv
cmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNl
ZEhvcml6b250YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKKyAgICAgICAgd2lkdGggPSBzaHJpbmtU
b0ZpdFdpZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpOworICAgICAgICByaWdodCA9IGNv
bnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQg
KyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3Jk
ZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7CisgICAgfSBlbHNlIGlmICghbGVm
dCAmJiB3aWR0aCAmJiByaWdodCkgeworICAgICAgICAvLyAjNAorICAgICAgICBsZWZ0ID0gY29u
dGFpbmluZ0Jsb2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJM
ZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCAr
IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7CisgICAgfSBlbHNlIGlmICghd2lk
dGggJiYgbGVmdCAmJiByaWdodCkgeworICAgICAgICAvLyAjNQorICAgICAgICB3aWR0aCA9IGNv
bnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQg
KyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCAr
IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7CisgICAgfSBlbHNlIGlmICghcmln
aHQgJiYgbGVmdCAmJiB3aWR0aCkgeworICAgICAgICAvLyAjNgorICAgICAgICByaWdodCA9IGNv
bnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQg
KyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3Jk
ZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7CisgICAgfQorCisgICAgQVNTRVJU
KGxlZnQpOworICAgIEFTU0VSVChyaWdodCk7CisgICAgQVNTRVJUKHdpZHRoKTsKKworICAgIC8v
IEZvciBvdXQtb2YtZmxvdyBlbGVtZW50cyB0aGUgY29udGFpbmluZyBibG9jayBpcyBmb3JtZWQg
YnkgdGhlIHBhZGRpbmcgZWRnZSBvZiB0aGUgYW5jZXN0b3IuCisgICAgLy8gQXQgdGhpcyBwb2lu
dCB0aGUgcG9zaXRpb25lZCB2YWx1ZSBpcyBpbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhl
IHBhZGRpbmcgYm94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBib3ggY29vcmRpbmF0ZSBz
eXN0ZW0uCisgICAgYXV0byBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlID0gaG9y
aXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxMZWZ0OworICAgICpsZWZ0ICs9IGNvbnRhaW5pbmdC
bG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7CisgICAgKnJpZ2h0ICs9IGNvbnRhaW5pbmdCbG9ja1Bh
ZGRpbmdWZXJ0aWNhbEVkZ2U7CisKKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRl
eHRMYXlvdXQsIHN0cmVhbSA8PCAiW1Bvc2l0aW9uXVtXaWR0aF1bTWFyZ2luXSAtPiBvdXQtb2Yt
ZmxvdyBub24tcmVwbGFjZWQgLT4gbGVmdCgiIDw8ICpsZWZ0IDw8ICJweCkgcmlnaHQoIiAgPDwg
KnJpZ2h0IDw8ICJweCkgd2lkdGgoIiA8PCAqd2lkdGggPDwgInB4KSBtYXJnaW4oIiA8PCB1c2Vk
SG9yaXpvbnRhbE1hcmdpbi5zdGFydCA8PCAicHgsICIgIDw8IHVzZWRIb3Jpem9udGFsTWFyZ2lu
LmVuZCA8PCAicHgpIGxheW91dEJveCgiIDw8ICZsYXlvdXRCb3ggPDwgIikiKTsKKyAgICByZXR1
cm4geyAqbGVmdCwgKnJpZ2h0LCB7ICp3aWR0aCwgdXNlZEhvcml6b250YWxNYXJnaW4gfSB9Owor
fQorCitWZXJ0aWNhbEdlb21ldHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZG
bG93UmVwbGFjZWRWZXJ0aWNhbEdlb21ldHJ5KGNvbnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJv
eCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNv
bnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJy
aWRkZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAorewor
ICAgIEFTU0VSVChyZXBsYWNlZEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisgICAgQVNT
RVJUKHZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbEhlaWdodCk7CisKKyAgICAvLyAxMC42LjUg
QWJzb2x1dGVseSBwb3NpdGlvbmVkLCByZXBsYWNlZCBlbGVtZW50cworICAgIC8vCisgICAgLy8g
VGhlIHVzZWQgdmFsdWUgb2YgJ2hlaWdodCcgaXMgZGV0ZXJtaW5lZCBhcyBmb3IgaW5saW5lIHJl
cGxhY2VkIGVsZW1lbnRzLgorICAgIC8vIElmICdtYXJnaW4tdG9wJyBvciAnbWFyZ2luLWJvdHRv
bScgaXMgc3BlY2lmaWVkIGFzICdhdXRvJyBpdHMgdXNlZCB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5
IHRoZSBydWxlcyBiZWxvdy4KKyAgICAvLyAxLiBJZiBib3RoICd0b3AnIGFuZCAnYm90dG9tJyBo
YXZlIHRoZSB2YWx1ZSAnYXV0bycsIHJlcGxhY2UgJ3RvcCcgd2l0aCB0aGUgZWxlbWVudCdzIHN0
YXRpYyBwb3NpdGlvbi4KKyAgICAvLyAyLiBJZiAnYm90dG9tJyBpcyAnYXV0bycsIHJlcGxhY2Ug
YW55ICdhdXRvJyBvbiAnbWFyZ2luLXRvcCcgb3IgJ21hcmdpbi1ib3R0b20nIHdpdGggJzAnLgor
ICAgIC8vIDMuIElmIGF0IHRoaXMgcG9pbnQgYm90aCAnbWFyZ2luLXRvcCcgYW5kICdtYXJnaW4t
Ym90dG9tJyBhcmUgc3RpbGwgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4
dHJhIGNvbnN0cmFpbnQgdGhhdCB0aGUgdHdvIG1hcmdpbnMgbXVzdCBnZXQgZXF1YWwgdmFsdWVz
LgorICAgIC8vIDQuIElmIGF0IHRoaXMgcG9pbnQgdGhlcmUgaXMgb25seSBvbmUgJ2F1dG8nIGxl
ZnQsIHNvbHZlIHRoZSBlcXVhdGlvbiBmb3IgdGhhdCB2YWx1ZS4KKyAgICAvLyA1LiBJZiBhdCB0
aGlzIHBvaW50IHRoZSB2YWx1ZXMgYXJlIG92ZXItY29uc3RyYWluZWQsIGlnbm9yZSB0aGUgdmFs
dWUgZm9yICdib3R0b20nIGFuZCBzb2x2ZSBmb3IgdGhhdCB2YWx1ZS4KKworICAgIGF1dG8mIGZv
cm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9ybWF0dGluZ0NvbnRleHQoKTsKKyAgICBhdXRvJiBz
dHlsZSA9IHJlcGxhY2VkQm94LnN0eWxlKCk7CisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3Jt
YXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChyZXBsYWNlZEJveCk7CisgICAgYXV0byBjb250
YWluaW5nQmxvY2tIZWlnaHQgPSAqdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2FsSGVpZ2h0Owor
ICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9n
aWNhbFdpZHRoOworCisgICAgYXV0byB0b3AgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxU
b3AoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworICAgIGF1dG8gYm90dG9tID0gY29tcHV0ZWRW
YWx1ZShzdHlsZS5sb2dpY2FsQm90dG9tKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKyAgICBh
dXRvIGhlaWdodCA9IGlubGluZVJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihyZXBsYWNl
ZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlk
ZGVuVmVydGljYWxWYWx1ZXMpLmNvbnRlbnRIZWlnaHQ7CisgICAgYXV0byBjb21wdXRlZFZlcnRp
Y2FsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVkVmVydGljYWxNYXJnaW4ocmVwbGFjZWRCb3gs
IGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZE1h
cmdpbkJlZm9yZSA9IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlOworICAgIE9wdGlvbmFs
PExheW91dFVuaXQ+IHVzZWRNYXJnaW5BZnRlciA9IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0
ZXI7CisgICAgYXV0byBwYWRkaW5nVG9wID0gYm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVl
T3IoMCk7CisgICAgYXV0byBwYWRkaW5nQm90dG9tID0gYm94R2VvbWV0cnkucGFkZGluZ0JvdHRv
bSgpLnZhbHVlT3IoMCk7CisgICAgYXV0byBib3JkZXJUb3AgPSBib3hHZW9tZXRyeS5ib3JkZXJU
b3AoKTsKKyAgICBhdXRvIGJvcmRlckJvdHRvbSA9IGJveEdlb21ldHJ5LmJvcmRlckJvdHRvbSgp
OworCisgICAgaWYgKCF0b3AgJiYgIWJvdHRvbSkgeworICAgICAgICAvLyAjMQorICAgICAgICB0
b3AgPSBzdGF0aWNWZXJ0aWNhbFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChyZXBsYWNl
ZEJveCwgdmVydGljYWxDb25zdHJhaW50cyk7CisgICAgfQorCisgICAgaWYgKCFib3R0b20pIHsK
KyAgICAgICAgLy8gIzIKKyAgICAgICAgdXNlZE1hcmdpbkJlZm9yZSA9IGNvbXB1dGVkVmVydGlj
YWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCk7CisgICAgICAgIHVzZWRNYXJnaW5BZnRlciA9IHVz
ZWRNYXJnaW5CZWZvcmU7CisgICAgfQorCisgICAgaWYgKCF1c2VkTWFyZ2luQmVmb3JlICYmICF1
c2VkTWFyZ2luQWZ0ZXIpIHsKKyAgICAgICAgLy8gIzMKKyAgICAgICAgYXV0byBtYXJnaW5CZWZv
cmVBbmRBZnRlciA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsg
cGFkZGluZ1RvcCArIGhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqYm90
dG9tKTsKKyAgICAgICAgdXNlZE1hcmdpbkJlZm9yZSA9IG1hcmdpbkJlZm9yZUFuZEFmdGVyIC8g
MjsKKyAgICAgICAgdXNlZE1hcmdpbkFmdGVyID0gdXNlZE1hcmdpbkJlZm9yZTsKKyAgICB9CisK
KyAgICAvLyAjNAorICAgIGlmICghdG9wKQorICAgICAgICB0b3AgPSBjb250YWluaW5nQmxvY2tI
ZWlnaHQgLSAoKnVzZWRNYXJnaW5CZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgaGVp
Z2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArICp1c2VkTWFyZ2luQWZ0ZXIgKyAq
Ym90dG9tKTsKKworICAgIGlmICghYm90dG9tKQorICAgICAgICBib3R0b20gPSBjb250YWluaW5n
QmxvY2tIZWlnaHQgLSAoKnRvcCArICp1c2VkTWFyZ2luQmVmb3JlICsgYm9yZGVyVG9wICsgcGFk
ZGluZ1RvcCArIGhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1h
cmdpbkFmdGVyKTsKKworICAgIGlmICghdXNlZE1hcmdpbkJlZm9yZSkKKyAgICAgICAgdXNlZE1h
cmdpbkJlZm9yZSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsg
cGFkZGluZ1RvcCArIGhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNl
ZE1hcmdpbkFmdGVyICsgKmJvdHRvbSk7CisKKyAgICBpZiAoIXVzZWRNYXJnaW5BZnRlcikKKyAg
ICAgICAgdXNlZE1hcmdpbkFmdGVyID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyAq
dXNlZE1hcmdpbkJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBoZWlnaHQgKyBwYWRk
aW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKmJvdHRvbSk7CisKKyAgICAvLyAjNQorICAgIGF1
dG8gYm94SGVpZ2h0ID0gKnRvcCArICp1c2VkTWFyZ2luQmVmb3JlICsgYm9yZGVyVG9wICsgcGFk
ZGluZ1RvcCArIGhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1h
cmdpbkFmdGVyICsgKmJvdHRvbTsKKyAgICBpZiAoYm94SGVpZ2h0ID4gY29udGFpbmluZ0Jsb2Nr
SGVpZ2h0KQorICAgICAgICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCAr
ICp1c2VkTWFyZ2luQmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdodCArIHBh
ZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyKTsgCisKKyAgICAv
LyBGb3Igb3V0LW9mLWZsb3cgZWxlbWVudHMgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgZm9ybWVk
IGJ5IHRoZSBwYWRkaW5nIGVkZ2Ugb2YgdGhlIGFuY2VzdG9yLgorICAgIC8vIEF0IHRoaXMgcG9p
bnQgdGhlIHBvc2l0aW9uZWQgdmFsdWUgaXMgaW4gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRo
ZSBwYWRkaW5nIGJveC4gTGV0J3MgY29udmVydCBpdCB0byBib3JkZXIgYm94IGNvb3JkaW5hdGUg
c3lzdGVtLgorICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZSA9IHZl
cnRpY2FsQ29uc3RyYWludHMubG9naWNhbFRvcDsKKyAgICAqdG9wICs9IGNvbnRhaW5pbmdCbG9j
a1BhZGRpbmdWZXJ0aWNhbEVkZ2U7CisgICAgKmJvdHRvbSArPSBjb250YWluaW5nQmxvY2tQYWRk
aW5nVmVydGljYWxFZGdlOworCisgICAgQVNTRVJUKHRvcCk7CisgICAgQVNTRVJUKGJvdHRvbSk7
CisgICAgQVNTRVJUKHVzZWRNYXJnaW5CZWZvcmUpOworICAgIEFTU0VSVCh1c2VkTWFyZ2luQWZ0
ZXIpOworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFt
IDw8ICJbUG9zaXRpb25dW0hlaWdodF1bTWFyZ2luXSAtPiBvdXQtb2YtZmxvdyByZXBsYWNlZCAt
PiB0b3AoIiA8PCAqdG9wIDw8ICJweCkgYm90dG9tKCIgIDw8ICpib3R0b20gPDwgInB4KSBoZWln
aHQoIiA8PCBoZWlnaHQgPDwgInB4KSBtYXJnaW4oIiA8PCAqdXNlZE1hcmdpbkJlZm9yZSA8PCAi
cHgsICIgIDw8ICp1c2VkTWFyZ2luQWZ0ZXIgPDwgInB4KSBsYXlvdXRCb3goIiA8PCAmcmVwbGFj
ZWRCb3ggPDwgIikiKTsKKyAgICByZXR1cm4geyAqdG9wLCAqYm90dG9tLCB7IGhlaWdodCwgeyAq
dXNlZE1hcmdpbkJlZm9yZSwgKnVzZWRNYXJnaW5BZnRlciB9IH0gfTsKK30KKworSG9yaXpvbnRh
bEdlb21ldHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93UmVwbGFjZWRI
b3Jpem9udGFsR2VvbWV0cnkoY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBI
b3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVydGlj
YWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6
b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQoreworICAgIEFTU0VSVChy
ZXBsYWNlZEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisKKyAgICAvLyAxMC4zLjggQWJz
b2x1dGVseSBwb3NpdGlvbmVkLCByZXBsYWNlZCBlbGVtZW50cworICAgIC8vIEluIHRoaXMgY2Fz
ZSwgc2VjdGlvbiAxMC4zLjcgYXBwbGllcyB1cCB0aHJvdWdoIGFuZCBpbmNsdWRpbmcgdGhlIGNv
bnN0cmFpbnQgZXF1YXRpb24sIGJ1dCB0aGUgcmVzdCBvZiBzZWN0aW9uIDEwLjMuNyBpcyByZXBs
YWNlZCBieSB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICAgIC8vCisgICAgLy8gVGhlIHVzZWQgdmFs
dWUgb2YgJ3dpZHRoJyBpcyBkZXRlcm1pbmVkIGFzIGZvciBpbmxpbmUgcmVwbGFjZWQgZWxlbWVu
dHMuIElmICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgaXMgc3BlY2lmaWVkIGFzICdh
dXRvJyBpdHMgdXNlZCB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBydWxlcyBiZWxvdy4KKyAg
ICAvLyAxLiBJZiBib3RoICdsZWZ0JyBhbmQgJ3JpZ2h0JyBoYXZlIHRoZSB2YWx1ZSAnYXV0bycs
IHRoZW4gaWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGVzdGFibGlz
aGluZyB0aGUgc3RhdGljLXBvc2l0aW9uIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicsCisgICAg
Ly8gICBzZXQgJ2xlZnQnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb247IGVsc2UgaWYgJ2RpcmVjdGlv
bicgaXMgJ3J0bCcsIHNldCAncmlnaHQnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb24uCisgICAgLy8g
Mi4gSWYgJ2xlZnQnIG9yICdyaWdodCcgYXJlICdhdXRvJywgcmVwbGFjZSBhbnkgJ2F1dG8nIG9u
ICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgd2l0aCAnMCcuCisgICAgLy8gMy4gSWYg
YXQgdGhpcyBwb2ludCBib3RoICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIGFyZSBz
dGlsbCAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0aGUgZXh0cmEgY29uc3RyYWlu
dCB0aGF0IHRoZSB0d28gbWFyZ2lucyBtdXN0IGdldCBlcXVhbCB2YWx1ZXMsCisgICAgLy8gICB1
bmxlc3MgdGhpcyB3b3VsZCBtYWtlIHRoZW0gbmVnYXRpdmUsIGluIHdoaWNoIGNhc2Ugd2hlbiB0
aGUgZGlyZWN0aW9uIG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGlzICdsdHInICgncnRsJyksIHNl
dCAnbWFyZ2luLWxlZnQnICgnbWFyZ2luLXJpZ2h0JykgdG8gemVybyBhbmQKKyAgICAvLyAgIHNv
bHZlIGZvciAnbWFyZ2luLXJpZ2h0JyAoJ21hcmdpbi1sZWZ0JykuCisgICAgLy8gNC4gSWYgYXQg
dGhpcyBwb2ludCB0aGVyZSBpcyBhbiAnYXV0bycgbGVmdCwgc29sdmUgdGhlIGVxdWF0aW9uIGZv
ciB0aGF0IHZhbHVlLgorICAgIC8vIDUuIElmIGF0IHRoaXMgcG9pbnQgdGhlIHZhbHVlcyBhcmUg
b3Zlci1jb25zdHJhaW5lZCwgaWdub3JlIHRoZSB2YWx1ZSBmb3IgZWl0aGVyICdsZWZ0JyAoaW4g
Y2FzZSB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMg
J3J0bCcpIG9yCisgICAgLy8gICAncmlnaHQnIChpbiBjYXNlICdkaXJlY3Rpb24nIGlzICdsdHIn
KSBhbmQgc29sdmUgZm9yIHRoYXQgdmFsdWUuCisKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4
dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7CisgICAgYXV0byYgc3R5bGUgPSByZXBsYWNl
ZEJveC5zdHlsZSgpOworICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQu
Z2VvbWV0cnlGb3JCb3gocmVwbGFjZWRCb3gpOworICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lk
dGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoOworICAgIGF1dG8gaXNMZWZ0
VG9SaWdodERpcmVjdGlvbiA9IHJlcGxhY2VkQm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCku
aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOworCisgICAgYXV0byBsZWZ0ID0gY29tcHV0ZWRWYWx1
ZShzdHlsZS5sb2dpY2FsTGVmdCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisgICAgYXV0byBy
aWdodCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbFJpZ2h0KCksIGNvbnRhaW5pbmdCbG9j
a1dpZHRoKTsKKyAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpj
b21wdXRlZEhvcml6b250YWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50
cyk7CisgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZE1hcmdpblN0YXJ0ID0gY29tcHV0ZWRI
b3Jpem9udGFsTWFyZ2luLnN0YXJ0OworICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRNYXJn
aW5FbmQgPSBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kOworICAgIGF1dG8gd2lkdGggPSBp
bmxpbmVSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRh
bENvbnN0cmFpbnRzLCB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZh
bHVlcykuY29udGVudFdpZHRoOworICAgIGF1dG8gcGFkZGluZ0xlZnQgPSBib3hHZW9tZXRyeS5w
YWRkaW5nTGVmdCgpLnZhbHVlT3IoMCk7CisgICAgYXV0byBwYWRkaW5nUmlnaHQgPSBib3hHZW9t
ZXRyeS5wYWRkaW5nUmlnaHQoKS52YWx1ZU9yKDApOworICAgIGF1dG8gYm9yZGVyTGVmdCA9IGJv
eEdlb21ldHJ5LmJvcmRlckxlZnQoKTsKKyAgICBhdXRvIGJvcmRlclJpZ2h0ID0gYm94R2VvbWV0
cnkuYm9yZGVyUmlnaHQoKTsKKworICAgIGlmICghbGVmdCAmJiAhcmlnaHQpIHsKKyAgICAgICAg
Ly8gIzEKKyAgICAgICAgYXV0byBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24gPSBzdGF0aWNIb3Jp
em9udGFsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKHJlcGxhY2VkQm94LCBob3Jpem9u
dGFsQ29uc3RyYWludHMpOworICAgICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikKKyAg
ICAgICAgICAgIGxlZnQgPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb247CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIHJpZ2h0ID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uOworICAgIH0KKwor
ICAgIGlmICghbGVmdCB8fCAhcmlnaHQpIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAgdXNlZE1h
cmdpblN0YXJ0ID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCk7Cisg
ICAgICAgIHVzZWRNYXJnaW5FbmQgPSBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVl
T3IoMCk7CisgICAgfQorCisgICAgaWYgKCF1c2VkTWFyZ2luU3RhcnQgJiYgIXVzZWRNYXJnaW5F
bmQpIHsKKyAgICAgICAgLy8gIzMKKyAgICAgICAgYXV0byBtYXJnaW5TdGFydEFuZEVuZCA9IGNv
bnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsg
d2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICpyaWdodCk7CisgICAgICAgIGlm
IChtYXJnaW5TdGFydEFuZEVuZCA+PSAwKSB7CisgICAgICAgICAgICB1c2VkTWFyZ2luU3RhcnQg
PSBtYXJnaW5TdGFydEFuZEVuZCAvIDI7CisgICAgICAgICAgICB1c2VkTWFyZ2luRW5kID0gdXNl
ZE1hcmdpblN0YXJ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGlzTGVmdFRv
UmlnaHREaXJlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICB1c2VkTWFyZ2luU3RhcnQgPSAwX2x1
OworICAgICAgICAgICAgICAgIHVzZWRNYXJnaW5FbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAt
ICgqbGVmdCArICp1c2VkTWFyZ2luU3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3
aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnJpZ2h0KTsKKyAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXNlZE1hcmdpbkVuZCA9IDBfbHU7CisgICAgICAg
ICAgICAgICAgdXNlZE1hcmdpblN0YXJ0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQg
KyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRl
clJpZ2h0ICsgKnVzZWRNYXJnaW5FbmQgKyAqcmlnaHQpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorCisgICAgLy8gIzQKKyAgICBpZiAoIWxlZnQpCisgICAgICAgIGxlZnQgPSBj
b250YWluaW5nQmxvY2tXaWR0aCAtICgqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBh
ZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFy
Z2luRW5kICsgKnJpZ2h0KTsKKworICAgIGlmICghcmlnaHQpCisgICAgICAgIHJpZ2h0ID0gY29u
dGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyAqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVm
dCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1
c2VkTWFyZ2luRW5kKTsKKworICAgIGlmICghdXNlZE1hcmdpblN0YXJ0KQorICAgICAgICB1c2Vk
TWFyZ2luU3RhcnQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNl
ZE1hcmdpbkVuZCArICpyaWdodCk7CisKKyAgICBpZiAoIXVzZWRNYXJnaW5FbmQpCisgICAgICAg
IHVzZWRNYXJnaW5FbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArICp1c2VkTWFy
Z2luU3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdo
dCArIGJvcmRlclJpZ2h0ICsgKnJpZ2h0KTsKKworICAgIGF1dG8gYm94V2lkdGggPSAoKmxlZnQg
KyAqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBw
YWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFyZ2luRW5kICsgKnJpZ2h0KTsKKyAg
ICBpZiAoYm94V2lkdGggPiBjb250YWluaW5nQmxvY2tXaWR0aCkgeworICAgICAgICAvLyAjNSBP
dmVyLWNvbnN0cmFpbmVkPworICAgICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikKKyAg
ICAgICAgICAgIHJpZ2h0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyAqdXNlZE1h
cmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmln
aHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFyZ2luRW5kKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgbGVmdCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCp1c2VkTWFyZ2luU3RhcnQgKyBi
b3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJp
Z2h0ICsgKnVzZWRNYXJnaW5FbmQgKyAqcmlnaHQpOworICAgIH0KKworICAgIEFTU0VSVChsZWZ0
KTsKKyAgICBBU1NFUlQocmlnaHQpOworICAgIEFTU0VSVCh1c2VkTWFyZ2luU3RhcnQpOworICAg
IEFTU0VSVCh1c2VkTWFyZ2luRW5kKTsKKworICAgIC8vIEZvciBvdXQtb2YtZmxvdyBlbGVtZW50
cyB0aGUgY29udGFpbmluZyBibG9jayBpcyBmb3JtZWQgYnkgdGhlIHBhZGRpbmcgZWRnZSBvZiB0
aGUgYW5jZXN0b3IuCisgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcG9zaXRpb25lZCB2YWx1ZSBp
cyBpbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIHBhZGRpbmcgYm94LiBMZXQncyBjb252
ZXJ0IGl0IHRvIGJvcmRlciBib3ggY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAgYXV0byBjb250YWlu
aW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2lj
YWxMZWZ0OworICAgICpsZWZ0ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7
CisgICAgKnJpZ2h0ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7CisKKyAg
ICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1Bv
c2l0aW9uXVtXaWR0aF1bTWFyZ2luXSAtPiBvdXQtb2YtZmxvdyByZXBsYWNlZCAtPiBsZWZ0KCIg
PDwgKmxlZnQgPDwgInB4KSByaWdodCgiICA8PCAqcmlnaHQgPDwgInB4KSB3aWR0aCgiIDw8IHdp
ZHRoIDw8ICJweCkgbWFyZ2luKCIgPDwgKnVzZWRNYXJnaW5TdGFydCA8PCAicHgsICIgIDw8ICp1
c2VkTWFyZ2luRW5kIDw8ICJweCkgbGF5b3V0Qm94KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIpIik7
CisgICAgcmV0dXJuIHsgKmxlZnQsICpyaWdodCwgeyB3aWR0aCwgeyAqdXNlZE1hcmdpblN0YXJ0
LCAqdXNlZE1hcmdpbkVuZCB9IH0gfTsKK30KKworQ29udGVudEhlaWdodEFuZE1hcmdpbiBGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXBsaWNhdGVkQ2FzZXMoY29uc3QgQm94JiBsYXlv
dXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRz
LCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVl
cykgY29uc3QKK3sKKyAgICBBU1NFUlQoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpOworICAg
IC8vIFRPRE86IFVzZSBjb21wbGljYXRlZC1jYXNlIGZvciBkb2N1bWVudCByZW5kZXJlciBmb3Ig
bm93IChzZWUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd0hlaWdodEFu
ZE1hcmdpbikuCisgICAgQVNTRVJUKChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkgJiYgbGF5
b3V0Qm94LmlzSW5GbG93KCkgJiYgIWxheW91dEJveC5pc092ZXJmbG93VmlzaWJsZSgpKSB8fCBs
YXlvdXRCb3guaXNJbmxpbmVCbG9ja0JveCgpIHx8IGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRp
b25lZCgpIHx8IGxheW91dEJveC5pc0RvY3VtZW50Qm94KCkgfHwgbGF5b3V0Qm94LmlzVGFibGVC
b3goKSk7CisKKyAgICAvLyAxMC42LjYgQ29tcGxpY2F0ZWQgY2FzZXMKKyAgICAvLworICAgIC8v
IEJsb2NrLWxldmVsLCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgd2hlbiAn
b3ZlcmZsb3cnIGRvZXMgbm90IGNvbXB1dGUgdG8gJ3Zpc2libGUnIChleGNlcHQgaWYgdGhlICdv
dmVyZmxvdycgcHJvcGVydHkncyB2YWx1ZSBoYXMgYmVlbiBwcm9wYWdhdGVkIHRvIHRoZSB2aWV3
cG9ydCkuCisgICAgLy8gJ0lubGluZS1ibG9jaycsIG5vbi1yZXBsYWNlZCBlbGVtZW50cy4KKyAg
ICAvLyBGbG9hdGluZywgbm9uLXJlcGxhY2VkIGVsZW1lbnRzLgorICAgIC8vCisgICAgLy8gMS4g
SWYgJ21hcmdpbi10b3AnLCBvciAnbWFyZ2luLWJvdHRvbScgYXJlICdhdXRvJywgdGhlaXIgdXNl
ZCB2YWx1ZSBpcyAwLgorICAgIC8vIDIuIElmICdoZWlnaHQnIGlzICdhdXRvJywgdGhlIGhlaWdo
dCBkZXBlbmRzIG9uIHRoZSBlbGVtZW50J3MgZGVzY2VuZGFudHMgcGVyIDEwLjYuNy4KKworICAg
IGF1dG8gaGVpZ2h0ID0gb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCA/IG92ZXJyaWRk
ZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQudmFsdWUoKSA6IGNvbXB1dGVkSGVpZ2h0KGxheW91dEJv
eCk7CisgICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVk
VmVydGljYWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgIC8v
ICMxCisgICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW46Ok5v
bkNvbGxhcHNlZFZhbHVlcyB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3Io
MCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OyAKKyAgICAvLyAj
MgorICAgIGlmICghaGVpZ2h0KSB7CisgICAgICAgIEFTU0VSVChpc0hlaWdodEF1dG8obGF5b3V0
Qm94KSk7CisgICAgICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3du
Y2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkp
CisgICAgICAgICAgICBoZWlnaHQgPSAwX2x1OworICAgICAgICBlbHNlIGlmIChsYXlvdXRCb3gu
aXNEb2N1bWVudEJveCgpICYmICFsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4
dCgpKSB7CisgICAgICAgICAgICBhdXRvJiBkb2N1bWVudEJveCA9IGRvd25jYXN0PENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KTsKKyAgICAgICAgICAgIGF1dG8gdG9wID0gQm94R2VvbWV0cnk6Om1h
cmdpbkJveFJlY3QoZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveCgqZG9jdW1lbnRC
b3guZmlyc3RJbkZsb3dDaGlsZCgpKSkudG9wKCk7CisgICAgICAgICAgICBhdXRvIGJvdHRvbSA9
IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlG
b3JCb3goKmRvY3VtZW50Qm94Lmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7CisgICAgICAg
ICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCAocXVpcms/KSBiZWhhdmlvciBzaW5jZSB0aGUgZG9j
dW1lbnQgYm94IGlzIG5vdCBhIGZvcm1hdHRpbmcgY29udGV4dCByb290IGFuZAorICAgICAgICAg
ICAgLy8gYWxsIHRoZSBmbG9hdCBib3hlcyBlbmQgdXAgYXQgdGhlIElDQiBsZXZlbC4KKyAgICAg
ICAgICAgIGF1dG8mIGluaXRpYWxDb250YWluaW5nQmxvY2sgPSBkb2N1bWVudEJveC5mb3JtYXR0
aW5nQ29udGV4dFJvb3QoKTsKKyAgICAgICAgICAgIGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxv
YXRpbmdDb250ZXh0IHsgZm9ybWF0dGluZ0NvbnRleHQoKSwgbGF5b3V0U3RhdGUoKS5lc3RhYmxp
c2hlZEZvcm1hdHRpbmdTdGF0ZShpbml0aWFsQ29udGFpbmluZ0Jsb2NrKS5mbG9hdGluZ1N0YXRl
KCkgfTsKKyAgICAgICAgICAgIGlmIChhdXRvIGZsb2F0Qm90dG9tID0gZmxvYXRpbmdDb250ZXh0
LmJvdHRvbSgpKSB7CisgICAgICAgICAgICAgICAgYm90dG9tID0gc3RkOjptYXg8TGF5b3V0VW5p
dD4oKmZsb2F0Qm90dG9tLCBib3R0b20pOworICAgICAgICAgICAgICAgIGF1dG8gZmxvYXRUb3Ag
PSBmbG9hdGluZ0NvbnRleHQudG9wKCk7CisgICAgICAgICAgICAgICAgQVNTRVJUKGZsb2F0VG9w
KTsKKyAgICAgICAgICAgICAgICB0b3AgPSBzdGQ6Om1pbjxMYXlvdXRVbml0PigqZmxvYXRUb3As
IHRvcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoZWlnaHQgPSBib3R0b20gLSB0b3A7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlQobGF5b3V0Qm94LmVzdGFibGlz
aGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7CisgICAgICAgICAgICBoZWlnaHQgPSBjb250ZW50SGVp
Z2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0
Qm94KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlQoaGVpZ2h0KTsKKworICAgIExP
R19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbSGVpZ2h0
XVtNYXJnaW5dIC0+IGZsb2F0aW5nIG5vbi1yZXBsYWNlZCAtPiBoZWlnaHQoIiA8PCAqaGVpZ2h0
IDw8ICJweCkgbWFyZ2luKCIgPDwgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSA8PCAicHgsICIg
PDwgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJmxh
eW91dEJveCA8PCAiKSIpOworICAgIHJldHVybiBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIHsgKmhl
aWdodCwgdXNlZFZlcnRpY2FsTWFyZ2luIH07Cit9CisKK0NvbnRlbnRXaWR0aEFuZE1hcmdpbiBG
b3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lk
dGhBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZh
bHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGxheW91dEJv
eC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsK
KworICAgIC8vIDEwLjMuNSBGbG9hdGluZywgbm9uLXJlcGxhY2VkIGVsZW1lbnRzCisgICAgLy8K
KyAgICAvLyAxLiBJZiAnbWFyZ2luLWxlZnQnLCBvciAnbWFyZ2luLXJpZ2h0JyBhcmUgY29tcHV0
ZWQgYXMgJ2F1dG8nLCB0aGVpciB1c2VkIHZhbHVlIGlzICcwJy4KKyAgICAvLyAyLiBJZiAnd2lk
dGgnIGlzIGNvbXB1dGVkIGFzICdhdXRvJywgdGhlIHVzZWQgdmFsdWUgaXMgdGhlICJzaHJpbmst
dG8tZml0IiB3aWR0aC4KKworICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2Vv
bWV0cnk6OmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cyk7CisKKyAgICAvLyAjMQorICAgIGF1dG8gdXNlZEhvcml6b250YWxsTWFyZ2luID0g
VXNlZEhvcml6b250YWxNYXJnaW4geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFs
dWVPcigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07CisgICAg
Ly8gIzIKKyAgICBhdXRvIHdpZHRoID0gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGgg
PyBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0aCA6IGNvbXB1dGVkV2lkdGgobGF5b3V0
Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoKTsKKyAgICBpZiAoIXdpZHRo
KQorICAgICAgICB3aWR0aCA9IHNocmlua1RvRml0V2lkdGgobGF5b3V0Qm94LCBob3Jpem9udGFs
Q29uc3RyYWludHMubG9naWNhbFdpZHRoKTsKKworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0
aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbV2lkdGhdW01hcmdpbl0gLT4gZmxvYXRpbmcg
bm9uLXJlcGxhY2VkIC0+IHdpZHRoKCIgPDwgKndpZHRoIDw8ICJweCkgbWFyZ2luKCIgPDwgdXNl
ZEhvcml6b250YWxsTWFyZ2luLnN0YXJ0IDw8ICJweCwgIiA8PCB1c2VkSG9yaXpvbnRhbGxNYXJn
aW4uZW5kIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIpOworICAg
IHJldHVybiBDb250ZW50V2lkdGhBbmRNYXJnaW4geyAqd2lkdGgsIHVzZWRIb3Jpem9udGFsbE1h
cmdpbiB9OworfQorCitDb250ZW50SGVpZ2h0QW5kTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpH
ZW9tZXRyeTo6ZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgUmVw
bGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6
b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlk
ZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Cit7CisgICAgQVNTRVJUKHJlcGxhY2VkQm94LmlzRmxv
YXRpbmdQb3NpdGlvbmVkKCkpOworCisgICAgLy8gMTAuNi4yIElubGluZSByZXBsYWNlZCBlbGVt
ZW50cywgYmxvY2stbGV2ZWwgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3csICdpbmxp
bmUtYmxvY2snCisgICAgLy8gcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZs
b2F0aW5nIHJlcGxhY2VkIGVsZW1lbnRzCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdD
b250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltIZWlnaHRdW01hcmdpbl0gLT4gZmxvYXRpbmcgcmVw
bGFjZWQgLT4gcmVkaXJlY3RlZCB0byBpbmxpbmUgcmVwbGFjZWQiKTsKKyAgICByZXR1cm4gaW5s
aW5lUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFs
Q29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKK30KKworQ29udGVu
dFdpZHRoQW5kTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6ZmxvYXRpbmdSZXBs
YWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25z
dCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMp
Cit7CisgICAgQVNTRVJUKHJlcGxhY2VkQm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOworCisg
ICAgLy8gMTAuMy42IEZsb2F0aW5nLCByZXBsYWNlZCBlbGVtZW50cworICAgIC8vCisgICAgLy8g
MS4gSWYgJ21hcmdpbi1sZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBhcmUgY29tcHV0ZWQgYXMgJ2F1
dG8nLCB0aGVpciB1c2VkIHZhbHVlIGlzICcwJy4KKyAgICAvLyAyLiBUaGUgdXNlZCB2YWx1ZSBv
ZiAnd2lkdGgnIGlzIGRldGVybWluZWQgYXMgZm9yIGlubGluZSByZXBsYWNlZCBlbGVtZW50cy4K
KyAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhv
cml6b250YWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisKKyAg
ICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW0hl
aWdodF1bTWFyZ2luXSAtPiBmbG9hdGluZyByZXBsYWNlZCAtPiByZWRpcmVjdGVkIHRvIGlubGlu
ZSByZXBsYWNlZCIpOworICAgIGF1dG8gdXNlZE1hcmdpbiA9IFVzZWRIb3Jpem9udGFsTWFyZ2lu
IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OworICAgIHJldHVybiBpbmxpbmVSZXBsYWNl
ZENvbnRlbnRXaWR0aEFuZE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
LCB7IH0sIHsgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGgsIHVzZWRNYXJnaW4gfSk7
Cit9CisKK1ZlcnRpY2FsR2VvbWV0cnkgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpvdXRP
ZkZsb3dWZXJ0aWNhbEdlb21ldHJ5KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVydGljYWxDb25z
dHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFs
dWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91
dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisKKyAgICBpZiAoIWxheW91dEJveC5pc1Jl
cGxhY2VkQm94KCkpCisgICAgICAgIHJldHVybiBvdXRPZkZsb3dOb25SZXBsYWNlZFZlcnRpY2Fs
R2VvbWV0cnkoZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29u
c3RyYWludHMsIHZlcnRpY2FsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7
CisgICAgcmV0dXJuIG91dE9mRmxvd1JlcGxhY2VkVmVydGljYWxHZW9tZXRyeShkb3duY2FzdDxS
ZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB2ZXJ0aWNhbENv
bnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworfQorCitIb3Jpem9udGFsR2Vv
bWV0cnkgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dIb3Jpem9udGFsR2Vv
bWV0cnkoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYg
aG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiB2ZXJ0aWNh
bENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bv
c2l0aW9uZWQoKSk7CisKKyAgICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCisgICAg
ICAgIHJldHVybiBvdXRPZkZsb3dOb25SZXBsYWNlZEhvcml6b250YWxHZW9tZXRyeShkb3duY2Fz
dDxDb250YWluZXJCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJp
ZGRlbkhvcml6b250YWxWYWx1ZXMpOworICAgIHJldHVybiBvdXRPZkZsb3dSZXBsYWNlZEhvcml6
b250YWxHZW9tZXRyeShkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRh
bENvbnN0cmFpbnRzLCB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZh
bHVlcyk7Cit9CisKK0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5OjpmbG9hdGluZ0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRC
b3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBj
b25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykg
Y29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOwor
CisgICAgaWYgKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQorICAgICAgICByZXR1cm4gY29t
cGxpY2F0ZWRDYXNlcyhsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRl
blZlcnRpY2FsVmFsdWVzKTsKKyAgICByZXR1cm4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRIZWln
aHRBbmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxD
b25zdHJhaW50cywgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKK30KKworQ29udGVudFdpZHRo
QW5kTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6ZmxvYXRpbmdDb250ZW50V2lk
dGhBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZh
bHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGxheW91dEJv
eC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKTsKKworICAgIGlmICghbGF5b3V0Qm94LmlzUmVwbGFj
ZWRCb3goKSkKKyAgICAgICAgcmV0dXJuIGZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhB
bmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzKTsKKyAgICByZXR1cm4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRXaWR0aEFu
ZE1hcmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0
cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyk7Cit9CisKK0NvbnRlbnRIZWlnaHRB
bmRNYXJnaW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbmxpbmVSZXBsYWNlZENvbnRl
bnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBI
b3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgT3B0aW9uYWw8VmVy
dGljYWxDb25zdHJhaW50cz4gdmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZl
cnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Cit7CisgICAgLy8g
MTAuNi4yIElubGluZSByZXBsYWNlZCBlbGVtZW50cywgYmxvY2stbGV2ZWwgcmVwbGFjZWQgZWxl
bWVudHMgaW4gbm9ybWFsIGZsb3csICdpbmxpbmUtYmxvY2snIHJlcGxhY2VkIGVsZW1lbnRzIGlu
IG5vcm1hbCBmbG93IGFuZCBmbG9hdGluZyByZXBsYWNlZCBlbGVtZW50cworICAgIC8vCisgICAg
Ly8gMS4gSWYgJ21hcmdpbi10b3AnLCBvciAnbWFyZ2luLWJvdHRvbScgYXJlICdhdXRvJywgdGhl
aXIgdXNlZCB2YWx1ZSBpcyAwLgorICAgIC8vIDIuIElmICdoZWlnaHQnIGFuZCAnd2lkdGgnIGJv
dGggaGF2ZSBjb21wdXRlZCB2YWx1ZXMgb2YgJ2F1dG8nIGFuZCB0aGUgZWxlbWVudCBhbHNvIGhh
cyBhbiBpbnRyaW5zaWMgaGVpZ2h0LCB0aGVuIHRoYXQgaW50cmluc2ljIGhlaWdodCBpcyB0aGUg
dXNlZCB2YWx1ZSBvZiAnaGVpZ2h0Jy4KKyAgICAvLyAzLiBPdGhlcndpc2UsIGlmICdoZWlnaHQn
IGhhcyBhIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJywgYW5kIHRoZSBlbGVtZW50IGhhcyBhbiBp
bnRyaW5zaWMgcmF0aW8gdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnaGVpZ2h0JyBpczoKKyAgICAv
LyAgICAodXNlZCB3aWR0aCkgLyAoaW50cmluc2ljIHJhdGlvKQorICAgIC8vIDQuIE90aGVyd2lz
ZSwgaWYgJ2hlaWdodCcgaGFzIGEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8nLCBhbmQgdGhlIGVs
ZW1lbnQgaGFzIGFuIGludHJpbnNpYyBoZWlnaHQsIHRoZW4gdGhhdCBpbnRyaW5zaWMgaGVpZ2h0
IGlzIHRoZSB1c2VkIHZhbHVlIG9mICdoZWlnaHQnLgorICAgIC8vIDUuIE90aGVyd2lzZSwgaWYg
J2hlaWdodCcgaGFzIGEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8nLCBidXQgbm9uZSBvZiB0aGUg
Y29uZGl0aW9ucyBhYm92ZSBhcmUgbWV0LCB0aGVuIHRoZSB1c2VkIHZhbHVlIG9mICdoZWlnaHQn
IG11c3QgYmUgc2V0IHRvCisgICAgLy8gICAgdGhlIGhlaWdodCBvZiB0aGUgbGFyZ2VzdCByZWN0
YW5nbGUgdGhhdCBoYXMgYSAyOjEgcmF0aW8sIGhhcyBhIGhlaWdodCBub3QgZ3JlYXRlciB0aGFu
IDE1MHB4LCBhbmQgaGFzIGEgd2lkdGggbm90IGdyZWF0ZXIgdGhhbiB0aGUgZGV2aWNlIHdpZHRo
LgorCisgICAgLy8gIzEKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1h
dHRpbmdDb250ZXh0KCk7CisgICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gR2VvbWV0
cnk6OmNvbXB1dGVkVmVydGljYWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJh
aW50cyk7CisgICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW46
Ok5vbkNvbGxhcHNlZFZhbHVlcyB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVl
T3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OworICAgIGF1
dG8mIHN0eWxlID0gcmVwbGFjZWRCb3guc3R5bGUoKTsKKworICAgIGF1dG8gaGVpZ2h0ID0gb3Zl
cnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5o
ZWlnaHQudmFsdWUoKSA6IGNvbXB1dGVkSGVpZ2h0KHJlcGxhY2VkQm94LCB2ZXJ0aWNhbENvbnN0
cmFpbnRzID8gdmVydGljYWxDb25zdHJhaW50cy0+bG9naWNhbEhlaWdodCA6IFdURjo6bnVsbG9w
dCk7CisgICAgYXV0byBoZWlnaHRJc0F1dG8gPSAhb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhl
aWdodCAmJiBpc0hlaWdodEF1dG8ocmVwbGFjZWRCb3gpOworICAgIGF1dG8gd2lkdGhJc0F1dG8g
PSBzdHlsZS5sb2dpY2FsV2lkdGgoKS5pc0F1dG8oKTsKKworICAgIGlmIChoZWlnaHRJc0F1dG8g
JiYgd2lkdGhJc0F1dG8gJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkpIHsKKyAg
ICAgICAgLy8gIzIKKyAgICAgICAgaGVpZ2h0ID0gcmVwbGFjZWRCb3guaW50cmluc2ljSGVpZ2h0
KCk7CisgICAgfSBlbHNlIGlmIChoZWlnaHRJc0F1dG8gJiYgcmVwbGFjZWRCb3guaGFzSW50cmlu
c2ljUmF0aW8oKSkgeworICAgICAgICAvLyAjMworICAgICAgICBhdXRvIHVzZWRXaWR0aCA9IGZv
cm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KHJlcGxhY2VkQm94KS5jb250ZW50Qm94V2lk
dGgoKTsKKyAgICAgICAgaGVpZ2h0ID0gdXNlZFdpZHRoIC8gcmVwbGFjZWRCb3guaW50cmluc2lj
UmF0aW8oKTsKKyAgICB9IGVsc2UgaWYgKGhlaWdodElzQXV0byAmJiByZXBsYWNlZEJveC5oYXNJ
bnRyaW5zaWNIZWlnaHQoKSkgeworICAgICAgICAvLyAjNAorICAgICAgICBoZWlnaHQgPSByZXBs
YWNlZEJveC5pbnRyaW5zaWNIZWlnaHQoKTsKKyAgICB9IGVsc2UgaWYgKGhlaWdodElzQXV0bykg
eworICAgICAgICAvLyAjNQorICAgICAgICBoZWlnaHQgPSB7IDE1MCB9OworICAgIH0KKworICAg
IEFTU0VSVChoZWlnaHQpOworCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0
TGF5b3V0LCBzdHJlYW0gPDwgIltIZWlnaHRdW01hcmdpbl0gLT4gaW5mbG93IHJlcGxhY2VkIC0+
IGhlaWdodCgiIDw8ICpoZWlnaHQgPDwgInB4KSBtYXJnaW4oIiA8PCB1c2VkVmVydGljYWxNYXJn
aW4uYmVmb3JlIDw8ICJweCwgIiA8PCB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgPDwgInB4KSAt
PiBsYXlvdXRCb3goIiA8PCAmcmVwbGFjZWRCb3ggPDwgIikiKTsKKyAgICByZXR1cm4geyAqaGVp
Z2h0LCB1c2VkVmVydGljYWxNYXJnaW4gfTsKK30KKworQ29udGVudFdpZHRoQW5kTWFyZ2luIEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRN
YXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29u
c3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgT3B0aW9uYWw8VmVydGljYWxDb25zdHJh
aW50cz4gdmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQoreworICAgIC8vIDEwLjMuMiBJbmxpbmUs
IHJlcGxhY2VkIGVsZW1lbnRzCisgICAgLy8KKyAgICAvLyBBIGNvbXB1dGVkIHZhbHVlIG9mICdh
dXRvJyBmb3IgJ21hcmdpbi1sZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBiZWNvbWVzIGEgdXNlZCB2
YWx1ZSBvZiAnMCcuCisgICAgLy8KKyAgICAvLyAxLiBJZiAnaGVpZ2h0JyBhbmQgJ3dpZHRoJyBi
b3RoIGhhdmUgY29tcHV0ZWQgdmFsdWVzIG9mICdhdXRvJyBhbmQgdGhlIGVsZW1lbnQgYWxzbyBo
YXMgYW4gaW50cmluc2ljIHdpZHRoLCB0aGVuIHRoYXQgaW50cmluc2ljIHdpZHRoIGlzIHRoZSB1
c2VkIHZhbHVlIG9mICd3aWR0aCcuCisgICAgLy8KKyAgICAvLyAyLiBJZiAnaGVpZ2h0JyBhbmQg
J3dpZHRoJyBib3RoIGhhdmUgY29tcHV0ZWQgdmFsdWVzIG9mICdhdXRvJyBhbmQgdGhlIGVsZW1l
bnQgaGFzIG5vIGludHJpbnNpYyB3aWR0aCwgYnV0IGRvZXMgaGF2ZSBhbiBpbnRyaW5zaWMgaGVp
Z2h0IGFuZCBpbnRyaW5zaWMgcmF0aW87CisgICAgLy8gICAgb3IgaWYgJ3dpZHRoJyBoYXMgYSBj
b21wdXRlZCB2YWx1ZSBvZiAnYXV0bycsICdoZWlnaHQnIGhhcyBzb21lIG90aGVyIGNvbXB1dGVk
IHZhbHVlLCBhbmQgdGhlIGVsZW1lbnQgZG9lcyBoYXZlIGFuIGludHJpbnNpYyByYXRpbzsKKyAg
ICAvLyAgICB0aGVuIHRoZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcgaXM6ICh1c2VkIGhlaWdodCkg
KiAoaW50cmluc2ljIHJhdGlvKQorICAgIC8vCisgICAgLy8gMy4gSWYgJ2hlaWdodCcgYW5kICd3
aWR0aCcgYm90aCBoYXZlIGNvbXB1dGVkIHZhbHVlcyBvZiAnYXV0bycgYW5kIHRoZSBlbGVtZW50
IGhhcyBhbiBpbnRyaW5zaWMgcmF0aW8gYnV0IG5vIGludHJpbnNpYyBoZWlnaHQgb3Igd2lkdGgs
CisgICAgLy8gICAgdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgnIGlzIHVuZGVmaW5lZCBp
biBDU1MgMi4yLiBIb3dldmVyLCBpdCBpcyBzdWdnZXN0ZWQgdGhhdCwgaWYgdGhlIGNvbnRhaW5p
bmcgYmxvY2sncyB3aWR0aCBkb2VzIG5vdCBpdHNlbGYgZGVwZW5kIG9uIHRoZSByZXBsYWNlZAor
ICAgIC8vICAgIGVsZW1lbnQncyB3aWR0aCwgdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgn
IGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgY29uc3RyYWludCBlcXVhdGlvbiB1c2VkIGZvciBibG9j
ay1sZXZlbCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93LgorICAgIC8vCisg
ICAgLy8gNC4gT3RoZXJ3aXNlLCBpZiAnd2lkdGgnIGhhcyBhIGNvbXB1dGVkIHZhbHVlIG9mICdh
dXRvJywgYW5kIHRoZSBlbGVtZW50IGhhcyBhbiBpbnRyaW5zaWMgd2lkdGgsIHRoZW4gdGhhdCBp
bnRyaW5zaWMgd2lkdGggaXMgdGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJy4KKyAgICAvLworICAg
IC8vIDUuIE90aGVyd2lzZSwgaWYgJ3dpZHRoJyBoYXMgYSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0
bycsIGJ1dCBub25lIG9mIHRoZSBjb25kaXRpb25zIGFib3ZlIGFyZSBtZXQsIHRoZW4gdGhlIHVz
ZWQgdmFsdWUgb2YgJ3dpZHRoJyBiZWNvbWVzIDMwMHB4LgorICAgIC8vICAgIElmIDMwMHB4IGlz
IHRvbyB3aWRlIHRvIGZpdCB0aGUgZGV2aWNlLCBVQXMgc2hvdWxkIHVzZSB0aGUgd2lkdGggb2Yg
dGhlIGxhcmdlc3QgcmVjdGFuZ2xlIHRoYXQgaGFzIGEgMjoxIHJhdGlvIGFuZCBmaXRzIHRoZSBk
ZXZpY2UgaW5zdGVhZC4KKworICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2Vv
bWV0cnk6OmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzKTsKKworICAgIGF1dG8gdXNlZE1hcmdpblN0YXJ0ID0gWyZdIHsKKyAgICAgICAg
aWYgKG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLm1hcmdpbikKKyAgICAgICAgICAgIHJldHVy
biBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy5tYXJnaW4tPnN0YXJ0OworICAgICAgICByZXR1
cm4gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMF9sdSk7CisgICAgfTsK
KworICAgIGF1dG8gdXNlZE1hcmdpbkVuZCA9IFsmXSB7CisgICAgICAgIGlmIChvdmVycmlkZGVu
SG9yaXpvbnRhbFZhbHVlcy5tYXJnaW4pCisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGRlbkhv
cml6b250YWxWYWx1ZXMubWFyZ2luLT5lbmQ7CisgICAgICAgIHJldHVybiBjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMF9sdSk7CisgICAgfTsKKworICAgIGF1dG8gd2lkdGgg
PSBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0aCA/IG92ZXJyaWRkZW5Ib3Jpem9udGFs
VmFsdWVzLndpZHRoIDogY29tcHV0ZWRXaWR0aChyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0
cmFpbnRzLmxvZ2ljYWxXaWR0aCk7CisgICAgYXV0byBoZWlnaHRJc0F1dG8gPSBpc0hlaWdodEF1
dG8ocmVwbGFjZWRCb3gpOworICAgIGF1dG8gaGVpZ2h0ID0gY29tcHV0ZWRIZWlnaHQocmVwbGFj
ZWRCb3gsIHZlcnRpY2FsQ29uc3RyYWludHMgPyB2ZXJ0aWNhbENvbnN0cmFpbnRzLT5sb2dpY2Fs
SGVpZ2h0IDogV1RGOjpudWxsb3B0KTsKKworICAgIGlmICghd2lkdGggJiYgaGVpZ2h0SXNBdXRv
ICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1dpZHRoKCkpIHsKKyAgICAgICAgLy8gIzEKKyAg
ICAgICAgd2lkdGggPSByZXBsYWNlZEJveC5pbnRyaW5zaWNXaWR0aCgpOworICAgIH0gZWxzZSBp
ZiAoKCF3aWR0aCAmJiBoZWlnaHRJc0F1dG8gJiYgIXJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1dp
ZHRoKCkgJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkgJiYgcmVwbGFjZWRCb3gu
aGFzSW50cmluc2ljUmF0aW8oKSkKKyAgICAgICAgfHwgKCF3aWR0aCAmJiBoZWlnaHQgJiYgcmVw
bGFjZWRCb3guaGFzSW50cmluc2ljUmF0aW8oKSkpIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAg
d2lkdGggPSBoZWlnaHQudmFsdWVPcihyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNIZWlnaHQoKSkg
KiByZXBsYWNlZEJveC5pbnRyaW5zaWNSYXRpbygpOworICAgIH0gZWxzZSBpZiAoIXdpZHRoICYm
IGhlaWdodElzQXV0byAmJiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNSYXRpbygpICYmICFyZXBs
YWNlZEJveC5oYXNJbnRyaW5zaWNXaWR0aCgpICYmICFyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNI
ZWlnaHQoKSkgeworICAgICAgICAvLyAjMworICAgICAgICAvLyBGSVhNRTogdW5kZWZpbmVkIGJ1
dCBzdXJlbHkgZG9hYmxlLgorICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOwor
ICAgIH0gZWxzZSBpZiAoIXdpZHRoICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1dpZHRoKCkp
IHsKKyAgICAgICAgLy8gIzQKKyAgICAgICAgd2lkdGggPSByZXBsYWNlZEJveC5pbnRyaW5zaWNX
aWR0aCgpOworICAgIH0gZWxzZSBpZiAoIXdpZHRoKSB7CisgICAgICAgIC8vICM1CisgICAgICAg
IHdpZHRoID0geyAzMDAgfTsKKyAgICB9CisKKyAgICBBU1NFUlQod2lkdGgpOworCisgICAgTE9H
X1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltXaWR0aF1b
TWFyZ2luXSAtPiBpbmZsb3cgcmVwbGFjZWQgLT4gd2lkdGgoIiA8PCAqd2lkdGggPDwgInB4KSBt
YXJnaW4oIiA8PCB1c2VkTWFyZ2luU3RhcnQoKSA8PCAicHgsICIgPDwgdXNlZE1hcmdpbkVuZCgp
IDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIpIik7CisgICAgcmV0
dXJuIHsgKndpZHRoLCB7IHVzZWRNYXJnaW5TdGFydCgpLCB1c2VkTWFyZ2luRW5kKCkgfSB9Owor
fQorCitMYXlvdXRTaXplIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93UG9zaXRp
b25lZFBvc2l0aW9uT2Zmc2V0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFs
Q29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICBBU1NFUlQo
bGF5b3V0Qm94LmlzSW5GbG93UG9zaXRpb25lZCgpKTsKKworICAgIC8vIDkuNC4zIFJlbGF0aXZl
IHBvc2l0aW9uaW5nCisgICAgLy8KKyAgICAvLyBUaGUgJ3RvcCcgYW5kICdib3R0b20nIHByb3Bl
cnRpZXMgbW92ZSByZWxhdGl2ZWx5IHBvc2l0aW9uZWQgZWxlbWVudChzKSB1cCBvciBkb3duIHdp
dGhvdXQgY2hhbmdpbmcgdGhlaXIgc2l6ZS4KKyAgICAvLyBUb3AnIG1vdmVzIHRoZSBib3hlcyBk
b3duLCBhbmQgJ2JvdHRvbScgbW92ZXMgdGhlbSB1cC4gU2luY2UgYm94ZXMgYXJlIG5vdCBzcGxp
dCBvciBzdHJldGNoZWQgYXMgYSByZXN1bHQgb2YgJ3RvcCcgb3IgJ2JvdHRvbScsIHRoZSB1c2Vk
IHZhbHVlcyBhcmUgYWx3YXlzOiB0b3AgPSAtYm90dG9tLgorICAgIC8vCisgICAgLy8gMS4gSWYg
Ym90aCBhcmUgJ2F1dG8nLCB0aGVpciB1c2VkIHZhbHVlcyBhcmUgYm90aCAnMCcuCisgICAgLy8g
Mi4gSWYgb25lIG9mIHRoZW0gaXMgJ2F1dG8nLCBpdCBiZWNvbWVzIHRoZSBuZWdhdGl2ZSBvZiB0
aGUgb3RoZXIuCisgICAgLy8gMy4gSWYgbmVpdGhlciBpcyAnYXV0bycsICdib3R0b20nIGlzIGln
bm9yZWQgKGkuZS4sIHRoZSB1c2VkIHZhbHVlIG9mICdib3R0b20nIHdpbGwgYmUgbWludXMgdGhl
IHZhbHVlIG9mICd0b3AnKS4KKworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7
CisgICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5s
b2dpY2FsV2lkdGg7CisKKyAgICBhdXRvIHRvcCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNh
bFRvcCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisgICAgYXV0byBib3R0b20gPSBjb21wdXRl
ZFZhbHVlKHN0eWxlLmxvZ2ljYWxCb3R0b20oKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworCisg
ICAgaWYgKCF0b3AgJiYgIWJvdHRvbSkgeworICAgICAgICAvLyAjMQorICAgICAgICB0b3AgPSBi
b3R0b20gPSB7IDAgfTsKKyAgICB9IGVsc2UgaWYgKCF0b3ApIHsKKyAgICAgICAgLy8gIzIKKyAg
ICAgICAgdG9wID0gLSpib3R0b207CisgICAgfSBlbHNlIGlmICghYm90dG9tKSB7CisgICAgICAg
IC8vICMzCisgICAgICAgIGJvdHRvbSA9IC0qdG9wOworICAgIH0gZWxzZSB7CisgICAgICAgIC8v
ICM0CisgICAgICAgIGJvdHRvbSA9IFdURjo6bnVsbG9wdDsKKyAgICB9CisKKyAgICAvLyBGb3Ig
cmVsYXRpdmVseSBwb3NpdGlvbmVkIGVsZW1lbnRzLCAnbGVmdCcgYW5kICdyaWdodCcgbW92ZSB0
aGUgYm94KGVzKSBob3Jpem9udGFsbHksIHdpdGhvdXQgY2hhbmdpbmcgdGhlaXIgc2l6ZS4KKyAg
ICAvLyAnTGVmdCcgbW92ZXMgdGhlIGJveGVzIHRvIHRoZSByaWdodCwgYW5kICdyaWdodCcgbW92
ZXMgdGhlbSB0byB0aGUgbGVmdC4KKyAgICAvLyBTaW5jZSBib3hlcyBhcmUgbm90IHNwbGl0IG9y
IHN0cmV0Y2hlZCBhcyBhIHJlc3VsdCBvZiAnbGVmdCcgb3IgJ3JpZ2h0JywgdGhlIHVzZWQgdmFs
dWVzIGFyZSBhbHdheXM6IGxlZnQgPSAtcmlnaHQuCisgICAgLy8KKyAgICAvLyAxLiBJZiBib3Ro
ICdsZWZ0JyBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nICh0aGVpciBpbml0aWFsIHZhbHVlcyksIHRo
ZSB1c2VkIHZhbHVlcyBhcmUgJzAnIChpLmUuLCB0aGUgYm94ZXMgc3RheSBpbiB0aGVpciBvcmln
aW5hbCBwb3NpdGlvbikuCisgICAgLy8gMi4gSWYgJ2xlZnQnIGlzICdhdXRvJywgaXRzIHVzZWQg
dmFsdWUgaXMgbWludXMgdGhlIHZhbHVlIG9mICdyaWdodCcgKGkuZS4sIHRoZSBib3hlcyBtb3Zl
IHRvIHRoZSBsZWZ0IGJ5IHRoZSB2YWx1ZSBvZiAncmlnaHQnKS4KKyAgICAvLyAzLiBJZiAncmln
aHQnIGlzIHNwZWNpZmllZCBhcyAnYXV0bycsIGl0cyB1c2VkIHZhbHVlIGlzIG1pbnVzIHRoZSB2
YWx1ZSBvZiAnbGVmdCcuCisgICAgLy8gNC4gSWYgbmVpdGhlciAnbGVmdCcgbm9yICdyaWdodCcg
aXMgJ2F1dG8nLCB0aGUgcG9zaXRpb24gaXMgb3Zlci1jb25zdHJhaW5lZCwgYW5kIG9uZSBvZiB0
aGVtIGhhcyB0byBiZSBpZ25vcmVkLgorICAgIC8vICAgIElmIHRoZSAnZGlyZWN0aW9uJyBwcm9w
ZXJ0eSBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAnbHRyJywgdGhlIHZhbHVlIG9mICdsZWZ0
JyB3aW5zIGFuZCAncmlnaHQnIGJlY29tZXMgLSdsZWZ0Jy4KKyAgICAvLyAgICBJZiAnZGlyZWN0
aW9uJyBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAncnRsJywgJ3JpZ2h0JyB3aW5zIGFuZCAn
bGVmdCcgaXMgaWdub3JlZC4KKworICAgIGF1dG8gbGVmdCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUu
bG9naWNhbExlZnQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworICAgIGF1dG8gcmlnaHQgPSBj
b21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxSaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7
CisKKyAgICBpZiAoIWxlZnQgJiYgIXJpZ2h0KSB7CisgICAgICAgIC8vICMxCisgICAgICAgIGxl
ZnQgPSByaWdodCA9IHsgMCB9OworICAgIH0gZWxzZSBpZiAoIWxlZnQpIHsKKyAgICAgICAgLy8g
IzIKKyAgICAgICAgbGVmdCA9IC0qcmlnaHQ7CisgICAgfSBlbHNlIGlmICghcmlnaHQpIHsKKyAg
ICAgICAgLy8gIzMKKyAgICAgICAgcmlnaHQgPSAtKmxlZnQ7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgLy8gIzQKKyAgICAgICAgYXV0byBpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uID0gbGF5b3V0Qm94
LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOworICAg
ICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikKKyAgICAgICAgICAgIHJpZ2h0ID0gLSps
ZWZ0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBsZWZ0ID0gV1RGOjpudWxsb3B0OworICAg
IH0KKworICAgIEFTU0VSVCghYm90dG9tIHx8ICp0b3AgPT0gLSpib3R0b20pOworICAgIEFTU0VS
VCghbGVmdCB8fCAqbGVmdCA9PSAtKnJpZ2h0KTsKKworICAgIGF1dG8gdG9wUG9zaXRpb25PZmZz
ZXQgPSAqdG9wOworICAgIGF1dG8gbGVmdFBvc2l0aW9uT2Zmc2V0ID0gbGVmdC52YWx1ZU9yKC0q
cmlnaHQpOworCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBz
dHJlYW0gPDwgIltQb3NpdGlvbl0gLT4gcG9zaXRpb25lZCBpbmZsb3cgLT4gdG9wIG9mZnNldCgi
IDw8IHRvcFBvc2l0aW9uT2Zmc2V0IDw8ICJweCkgbGVmdCBvZmZzZXQoIiA8PCBsZWZ0UG9zaXRp
b25PZmZzZXQgPDwgInB4KSBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7CisgICAg
cmV0dXJuIHsgbGVmdFBvc2l0aW9uT2Zmc2V0LCB0b3BQb3NpdGlvbk9mZnNldCB9OworfQorCitp
bmxpbmUgc3RhdGljIFdyaXRpbmdNb2RlIHVzZWRXcml0aW5nTW9kZShjb25zdCBCb3gmIGxheW91
dEJveCkKK3sKKyAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXdyaXRpbmctbW9kZXMt
NC8jbG9naWNhbC1kaXJlY3Rpb24tbGF5b3V0CisgICAgLy8gRmxvdy1yZWxhdGl2ZSBkaXJlY3Rp
b25zIGFyZSBjYWxjdWxhdGVkIHdpdGggcmVzcGVjdCB0byB0aGUgd3JpdGluZyBtb2RlIG9mIHRo
ZSBjb250YWluaW5nIGJsb2NrIG9mIHRoZSBib3guCisgICAgLy8gRm9yIGlubGluZS1sZXZlbCBi
b3hlcywgdGhlIHdyaXRpbmcgbW9kZSBvZiB0aGUgcGFyZW50IGJveCBpcyB1c2VkIGluc3RlYWQu
CisgICAgcmV0dXJuIGxheW91dEJveC5pc0lubGluZUxldmVsQm94KCkgPyBsYXlvdXRCb3gucGFy
ZW50KCkuc3R5bGUoKS53cml0aW5nTW9kZSgpIDogbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygp
LnN0eWxlKCkud3JpdGluZ01vZGUoKTsKK30KKworRWRnZXMgRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5Ojpjb21wdXRlZEJvcmRlcihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAg
ICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOworICAgIExPR19XSVRIX1NUUkVBTShG
b3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbQm9yZGVyXSAtPiBsYXlvdXRCb3g6
ICIgPDwgJmxheW91dEJveCk7CisgICAgcmV0dXJuIHsKKyAgICAgICAgeyBMYXlvdXRVbml0KHN0
eWxlLmJvcmRlckxlZnRXaWR0aCgpKSwgTGF5b3V0VW5pdChzdHlsZS5ib3JkZXJSaWdodFdpZHRo
KCkpIH0sCisgICAgICAgIHsgTGF5b3V0VW5pdChzdHlsZS5ib3JkZXJUb3BXaWR0aCgpKSwgTGF5
b3V0VW5pdChzdHlsZS5ib3JkZXJCb3R0b21XaWR0aCgpKSB9CisgICAgfTsKK30KKworT3B0aW9u
YWw8RWRnZXM+IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRQYWRkaW5nKGNv
bnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRo
KSBjb25zdAoreworICAgIGlmICghbGF5b3V0Qm94LmlzUGFkZGluZ0FwcGxpY2FibGUoKSkKKyAg
ICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKKworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94
LnN0eWxlKCk7CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBz
dHJlYW0gPDwgIltQYWRkaW5nXSAtPiBsYXlvdXRCb3g6ICIgPDwgJmxheW91dEJveCk7CisgICAg
cmV0dXJuIEVkZ2VzIHsKKyAgICAgICAgeyB2YWx1ZUZvckxlbmd0aChzdHlsZS5wYWRkaW5nTGVm
dCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCksIHZhbHVlRm9yTGVuZ3RoKHN0eWxlLnBhZGRpbmdS
aWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCkgfSwKKyAgICAgICAgeyB2YWx1ZUZvckxlbmd0
aChzdHlsZS5wYWRkaW5nVG9wKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgdmFsdWVGb3JMZW5n
dGgoc3R5bGUucGFkZGluZ0JvdHRvbSgpLCBjb250YWluaW5nQmxvY2tXaWR0aCkgfQorICAgIH07
Cit9CisKK0NvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0
cnk6OmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3Qg
SG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIGNvbnN0Cit7Cisg
ICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICBhdXRvIGNvbnRhaW5pbmdC
bG9ja1dpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKKyAgICBpZiAo
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUodXNlZFdyaXRpbmdNb2RlKGxheW91dEJveCkpKQorICAg
ICAgICByZXR1cm4geyBjb21wdXRlZFZhbHVlKHN0eWxlLm1hcmdpbkxlZnQoKSwgY29udGFpbmlu
Z0Jsb2NrV2lkdGgpLCBjb21wdXRlZFZhbHVlKHN0eWxlLm1hcmdpblJpZ2h0KCksIGNvbnRhaW5p
bmdCbG9ja1dpZHRoKSB9OworICAgIHJldHVybiB7IGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2lu
VG9wKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5C
b3R0b20oKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpIH07Cit9CisKK0NvbXB1dGVkVmVydGljYWxN
YXJnaW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2lu
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6
b250YWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5z
dHlsZSgpOworICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3Ry
YWludHMubG9naWNhbFdpZHRoOworICAgIGlmIChpc0hvcml6b250YWxXcml0aW5nTW9kZSh1c2Vk
V3JpdGluZ01vZGUobGF5b3V0Qm94KSkpCisgICAgICAgIHJldHVybiB7IGNvbXB1dGVkVmFsdWUo
c3R5bGUubWFyZ2luVG9wKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgY29tcHV0ZWRWYWx1ZShz
dHlsZS5tYXJnaW5Cb3R0b20oKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpIH07CisgICAgcmV0dXJu
IHsgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5MZWZ0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRo
KSwgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5SaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0
aCkgfTsKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMg
Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb25zdHJhaW5CeU1pbk1heFdpZHRoKGNvbnN0
IEJveCYgbGF5b3V0Qm94LCBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGludHJpbnNpY1dpZHRo
KSBjb25zdAoreworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgYXV0
byBtaW5XaWR0aCA9IGZpeGVkVmFsdWUoc3R5bGUubG9naWNhbE1pbldpZHRoKCkpOworICAgIGF1
dG8gbWF4V2lkdGggPSBmaXhlZFZhbHVlKHN0eWxlLmxvZ2ljYWxNYXhXaWR0aCgpKTsKKyAgICBp
ZiAoIW1pbldpZHRoICYmICFtYXhXaWR0aCkKKyAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRo
OworCisgICAgaWYgKG1heFdpZHRoKSB7CisgICAgICAgIGludHJpbnNpY1dpZHRoLm1pbmltdW0g
PSBzdGQ6Om1pbigqbWF4V2lkdGgsIGludHJpbnNpY1dpZHRoLm1pbmltdW0pOworICAgICAgICBp
bnRyaW5zaWNXaWR0aC5tYXhpbXVtID0gc3RkOjptaW4oKm1heFdpZHRoLCBpbnRyaW5zaWNXaWR0
aC5tYXhpbXVtKTsKKyAgICB9CisKKyAgICBpZiAobWluV2lkdGgpIHsKKyAgICAgICAgaW50cmlu
c2ljV2lkdGgubWluaW11bSA9IHN0ZDo6bWF4KCptaW5XaWR0aCwgaW50cmluc2ljV2lkdGgubWlu
aW11bSk7CisgICAgICAgIGludHJpbnNpY1dpZHRoLm1heGltdW0gPSBzdGQ6Om1heCgqbWluV2lk
dGgsIGludHJpbnNpY1dpZHRoLm1heGltdW0pOworICAgIH0KKworICAgIEFTU0VSVChpbnRyaW5z
aWNXaWR0aC5taW5pbXVtIDw9IGludHJpbnNpY1dpZHRoLm1heGltdW0pOworICAgIHJldHVybiBp
bnRyaW5zaWNXaWR0aDsKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkNvbnN0cmFpbnRzRm9yT3V0
T2ZGbG93Q29udGVudCBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbnN0cmFpbnRzRm9y
T3V0T2ZGbG93Q29udGVudChjb25zdCBDb250YWluZXJCb3gmIGNvbnRhaW5lckJveCkKK3sKKyAg
ICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3go
Y29udGFpbmVyQm94KTsKKyAgICByZXR1cm4geworICAgICAgICB7IGJveEdlb21ldHJ5LnBhZGRp
bmdCb3hMZWZ0KCksIGJveEdlb21ldHJ5LnBhZGRpbmdCb3hXaWR0aCgpIH0sCisgICAgICAgIHsg
Ym94R2VvbWV0cnkucGFkZGluZ0JveFRvcCgpLCBib3hHZW9tZXRyeS5wYWRkaW5nQm94SGVpZ2h0
KCkgfSwKKyAgICAgICAgYm94R2VvbWV0cnkuY29udGVudEJveFdpZHRoKCkgfTsKK30KKworRm9y
bWF0dGluZ0NvbnRleHQ6OkNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6OmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb25zdCBDb250YWlu
ZXJCb3gmIGNvbnRhaW5lckJveCwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiBlc2NhcGVSZWFzb24p
Cit7CisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5
Rm9yQm94KGNvbnRhaW5lckJveCwgZXNjYXBlUmVhc29uKTsKKyAgICByZXR1cm4geyB7IGJveEdl
b21ldHJ5LmNvbnRlbnRCb3hMZWZ0KCksIGJveEdlb21ldHJ5LmNvbnRlbnRCb3hXaWR0aCgpIH0s
IHsgYm94R2VvbWV0cnkuY29udGVudEJveFRvcCgpLCBjb21wdXRlZEhlaWdodChjb250YWluZXJC
b3gpIH0gfTsKK30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHRR
dWlya3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjgyMTFiMGRjNjMwY2EyMzk3YmFiMzg0Zjk4MDgzMDMxOTFm
MmJkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApAQCAtMCwwICsxLDc1IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250
ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1
ZGUgIkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVk
ZSAiTGF5b3V0SW5pdGlhbENvbnRhaW5pbmdCbG9jay5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CituYW1lc3BhY2UgTGF5b3V0IHsKKworTGF5b3V0VW5pdCBGb3JtYXR0aW5nQ29udGV4dDo6UXVp
cmtzOjpoZWlnaHRWYWx1ZU9mTmVhcmVzdENvbnRhaW5pbmdCbG9ja1dpdGhGaXhlZEhlaWdodChj
b25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICAvLyBJbiBxdWlya3MgbW9kZSwgd2UgZ28gYW5k
IHRyYXZlcnMgdGhlIGNvbnRhaW5pbmcgYmxvY2sgY2hhaW4gdG8gZmluZCBhIGJsb2NrIGxldmVs
IGJveCB3aXRoIGZpeGVkIGhlaWdodCB2YWx1ZSwgZXZlbiBpZiBpdCBtZWFucyBsZWF2aW5nCisg
ICAgLy8gdGhlIGN1cnJlbnQgZm9ybWF0dGluZyBjb250ZXh0LiBGSVhNRTogc3VyZWx5IHdlIG5l
ZWQgdG8gZG8gc29tZSB0cmlja3MgaGVyZSB3aGVuIGJsb2NrIGRpcmVjdGlvbiBzdXBwb3J0IGlz
IGFkZGVkLgorICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9ybWF0dGluZ0Nv
bnRleHQoKTsKKyAgICBhdXRvKiBjb250YWluaW5nQmxvY2sgPSAmbGF5b3V0Qm94LmNvbnRhaW5p
bmdCbG9jaygpOworICAgIExheW91dFVuaXQgYm9keUFuZERvY3VtZW50VmVydGljYWxNYXJnaW5Q
YWRkaW5nQW5kQm9yZGVyOworICAgIHdoaWxlIChjb250YWluaW5nQmxvY2spIHsKKyAgICAgICAg
YXV0byBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBjb250YWluaW5nQmxvY2stPnN0eWxlKCkubG9n
aWNhbEhlaWdodCgpOworICAgICAgICBpZiAoY29udGFpbmluZ0Jsb2NrSGVpZ2h0LmlzRml4ZWQo
KSkKKyAgICAgICAgICAgIHJldHVybiBMYXlvdXRVbml0KGNvbnRhaW5pbmdCbG9ja0hlaWdodC52
YWx1ZSgpIC0gYm9keUFuZERvY3VtZW50VmVydGljYWxNYXJnaW5QYWRkaW5nQW5kQm9yZGVyKTsK
KworICAgICAgICAvLyBJZiB0aGUgb25seSBmaXhlZCB2YWx1ZSBib3ggd2UgZmluZCBpcyB0aGUg
SUNCLCB0aGVuIGlnbm9yZSB0aGUgYm9keSBhbmQgdGhlIGRvY3VtZW50ICh2ZXJ0aWNhbCkgbWFy
Z2luLCBwYWRkaW5nIGFuZCBib3JkZXIuIFNvIG11Y2ggcXVpcmtpbmVzcy4KKyAgICAgICAgLy8g
LWFuZCBpdCdzIHRvdGFsbHkgaW5zYW5lIGJlY2F1c2Ugbm93IHdlIGZyZWVseSB0cmF2ZWwgYWNy
b3NzIGZvcm1hdHRpbmcgY29udGV4dCBib3VuZGFyaWVzIGFuZCBjb21wdXRlZCBtYXJnaW5zIGFy
ZSBub25leGlzdGVudC4KKyAgICAgICAgaWYgKGNvbnRhaW5pbmdCbG9jay0+aXNCb2R5Qm94KCkg
fHwgY29udGFpbmluZ0Jsb2NrLT5pc0RvY3VtZW50Qm94KCkpIHsKKworICAgICAgICAgICAgYXV0
byBnZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5KCk7CisgICAgICAgICAgICBh
dXRvIGhvcml6b250YWxDb25zdHJhaW50cyA9IGdlb21ldHJ5LmNvbnN0cmFpbnRzRm9ySW5GbG93
Q29udGVudChjb250YWluaW5nQmxvY2stPmNvbnRhaW5pbmdCbG9jaygpLCBGb3JtYXR0aW5nQ29u
dGV4dDo6RXNjYXBlUmVhc29uOjpGaW5kRml4ZWRIZWlnaHRBbmNlc3RvclF1aXJrKS5ob3Jpem9u
dGFsOworICAgICAgICAgICAgYXV0byB2ZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVk
VmVydGljYWxNYXJnaW4oKmNvbnRhaW5pbmdCbG9jaywgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsK
KworICAgICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9t
ZXRyeUZvckJveCgqY29udGFpbmluZ0Jsb2NrLCBGb3JtYXR0aW5nQ29udGV4dDo6RXNjYXBlUmVh
c29uOjpGaW5kRml4ZWRIZWlnaHRBbmNlc3RvclF1aXJrKTsKKyAgICAgICAgICAgIGF1dG8gdmVy
dGljYWxQYWRkaW5nID0gYm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCkgKyBib3hH
ZW9tZXRyeS5wYWRkaW5nQm90dG9tKCkudmFsdWVPcigwKTsKKyAgICAgICAgICAgIGF1dG8gdmVy
dGljYWxCb3JkZXIgPSBib3hHZW9tZXRyeS5ib3JkZXJUb3AoKSArIGJveEdlb21ldHJ5LmJvcmRl
ckJvdHRvbSgpOworICAgICAgICAgICAgYm9keUFuZERvY3VtZW50VmVydGljYWxNYXJnaW5QYWRk
aW5nQW5kQm9yZGVyICs9IHZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApICsgdmVydGlj
YWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSArIHZlcnRpY2FsUGFkZGluZyArIHZlcnRpY2FsQm9y
ZGVyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzPEluaXRpYWxDb250YWluaW5nQmxvY2s+
KCpjb250YWluaW5nQmxvY2spKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNvbnRhaW5p
bmdCbG9jayA9ICZjb250YWluaW5nQmxvY2stPmNvbnRhaW5pbmdCbG9jaygpOworICAgIH0KKyAg
ICAvLyBJbml0aWFsIGNvbnRhaW5pbmcgYmxvY2sgaGFzIHRvIGhhdmUgYSBoZWlnaHQuCisgICAg
cmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveC5pbml0aWFs
Q29udGFpbmluZ0Jsb2NrKCksIEZvcm1hdHRpbmdDb250ZXh0OjpFc2NhcGVSZWFzb246OkZpbmRG
aXhlZEhlaWdodEFuY2VzdG9yUXVpcmspLmNvbnRlbnRCb3goKS5oZWlnaHQoKSAtIGJvZHlBbmRE
b2N1bWVudFZlcnRpY2FsTWFyZ2luUGFkZGluZ0FuZEJvcmRlcjsKK30KKworfQorfQorCisjZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
YmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0
aW5nQ29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGY1NTVmODE5MzgxZTczYWYzZTE5YzAyZjM4YjBm
Y2YzYmQxMjA0YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3Bw
CkBAIC0wLDAgKzEsNTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9S
TUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNp
bmNsdWRlICJGbG9hdGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJGbG9hdGluZ1N0YXRlLmgiCisj
aW5jbHVkZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNp
bmNsdWRlICJMYXlvdXRDaGlsZEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVy
Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgorI2luY2x1ZGUgIkxheW91dEluaXRp
YWxDb250YWluaW5nQmxvY2suaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUg
IkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
LmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKyNpbmNsdWRlIDx3dGYvdGV4
dC9UZXh0U3RyZWFtLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQg
eworCitXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCk7
CisKK0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OkJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3Qg
Q29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRl
JiBmb3JtYXR0aW5nU3RhdGUpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29u
dGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKK3sKK30KKwordm9pZCBCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0OjpsYXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiBpbnZhbGlkYXRp
b25TdGF0ZSwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykK
K3sKKyAgICAvLyA5LjQuMSBCbG9jayBmb3JtYXR0aW5nIGNvbnRleHRzCisgICAgLy8gSW4gYSBi
bG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGJveGVzIGFyZSBsYWlkIG91dCBvbmUgYWZ0ZXIgdGhl
IG90aGVyLCB2ZXJ0aWNhbGx5LCBiZWdpbm5pbmcgYXQgdGhlIHRvcCBvZiBhIGNvbnRhaW5pbmcg
YmxvY2suCisgICAgLy8gVGhlIHZlcnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNpYmxpbmcg
Ym94ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgJ21hcmdpbicgcHJvcGVydGllcy4KKyAgICAvLyBW
ZXJ0aWNhbCBtYXJnaW5zIGJldHdlZW4gYWRqYWNlbnQgYmxvY2stbGV2ZWwgYm94ZXMgaW4gYSBi
bG9jayBmb3JtYXR0aW5nIGNvbnRleHQgY29sbGFwc2UuCisgICAgTE9HX1dJVEhfU1RSRUFNKEZv
cm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltTdGFydF0gLT4gYmxvY2sgZm9ybWF0
dGluZyBjb250ZXh0IC0+IGZvcm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKKyAg
ICBhdXRvJiBmb3JtYXR0aW5nUm9vdCA9IHJvb3QoKTsKKyAgICBBU1NFUlQoZm9ybWF0dGluZ1Jv
b3QuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpOworICAgIGF1dG8mIGZsb2F0aW5nU3RhdGUg
PSBmb3JtYXR0aW5nU3RhdGUoKS5mbG9hdGluZ1N0YXRlKCk7CisgICAgYXV0byBmbG9hdGluZ0Nv
bnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhpcywgZmxvYXRpbmdTdGF0ZSB9OworCisgICAg
TGF5b3V0UXVldWUgbGF5b3V0UXVldWU7CisgICAgZW51bSBjbGFzcyBMYXlvdXREaXJlY3Rpb24g
eyBDaGlsZCwgU2libGluZyB9OworICAgIGF1dG8gYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUgPSBb
Jl0gKGNvbnN0IGF1dG8mIGxheW91dEJveCwgYXV0byBkaXJlY3Rpb24pIHsKKyAgICAgICAgaWYg
KGRpcmVjdGlvbiA9PSBMYXlvdXREaXJlY3Rpb246OkNoaWxkKSB7CisgICAgICAgICAgICBpZiAo
IWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgICAgICBmb3IgKGF1dG8qIGNoaWxkID0gZG93bmNhc3Q8Q29udGFpbmVyQm94
PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7IGNoaWxkOyBjaGlsZCA9
IGNoaWxkLT5uZXh0SW5GbG93T3JGbG9hdGluZ1NpYmxpbmcoKSkgeworICAgICAgICAgICAgICAg
IGlmICghaW52YWxpZGF0aW9uU3RhdGUubmVlZHNMYXlvdXQoKmNoaWxkKSkKKyAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgbGF5b3V0UXVldWUuYXBwZW5kKGNo
aWxkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaXJlY3Rpb24g
PT0gTGF5b3V0RGlyZWN0aW9uOjpTaWJsaW5nKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8qIG5l
eHRTaWJsaW5nID0gbGF5b3V0Qm94Lm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpOyBuZXh0
U2libGluZzsgbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy0+bmV4dEluRmxvd09yRmxvYXRpbmdT
aWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWludmFsaWRhdGlvblN0YXRlLm5lZWRz
TGF5b3V0KCpuZXh0U2libGluZykpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICAgICAgICAgIGxheW91dFF1ZXVlLmFwcGVuZChuZXh0U2libGluZyk7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9OworCisgICAgYXV0byBjb25zdHJhaW50c0ZvckxheW91dEJveCA9
IFsmXSAoY29uc3QgYXV0byYgbGF5b3V0Qm94KSB7CisgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdC
bG9jayA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsKKyAgICAgICAgcmV0dXJuICZjb250
YWluaW5nQmxvY2sgPT0gJmZvcm1hdHRpbmdSb290ID8gY29uc3RyYWludHMgOiBnZW9tZXRyeSgp
LmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb250YWluaW5nQmxvY2spOworICAgIH07CisK
KyAgICAvLyBUaGlzIGlzIGEgcG9zdC1vcmRlciB0cmVlIHRyYXZlcnNhbCBsYXlvdXQuCisgICAg
Ly8gVGhlIHJvb3QgY29udGFpbmVyIGxheW91dCBpcyBkb25lIGluIHRoZSBmb3JtYXR0aW5nIGNv
bnRleHQgaXQgbGl2ZXMgaW4sIG5vdCB0aGF0IG9uZSBpdCBjcmVhdGVzLCBzbyBsZXQncyBzdGFy
dCB3aXRoIHRoZSBmaXJzdCBjaGlsZC4KKyAgICBhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShmb3Jt
YXR0aW5nUm9vdCwgTGF5b3V0RGlyZWN0aW9uOjpDaGlsZCk7CisgICAgLy8gMS4gR28gYWxsIHRo
ZSB3YXkgZG93biB0byB0aGUgbGVhZiBub2RlCisgICAgLy8gMi4gQ29tcHV0ZSBzdGF0aWMgcG9z
aXRpb24gYW5kIHdpZHRoIGFzIHdlIHRyYXZlcnNlIGRvd24KKyAgICAvLyAzLiBBcyB3ZSBjbGlt
YiBiYWNrIG9uIHRoZSB0cmVlLCBjb21wdXRlIGhlaWdodCBhbmQgZmluaWFsaXplIHBvc2l0aW9u
CisgICAgLy8gKEFueSBzdWJ0cmVlcyB3aXRoIG5ldyBmb3JtYXR0aW5nIGNvbnRleHRzIG5lZWQg
dG8gbGF5b3V0IHN5bmNocm9ub3VzbHkpCisgICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5
KCkpIHsKKyAgICAgICAgLy8gVHJhdmVyc2UgZG93biBvbiB0aGUgZGVzY2VuZGFudHMgYW5kIGNv
bXB1dGUgd2lkdGgvc3RhdGljIHBvc2l0aW9uIHVudGlsIHdlIGZpbmQgYSBsZWFmIG5vZGUuCisg
ICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSAqbGF5
b3V0UXVldWUubGFzdCgpOworICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25zdHJh
aW50cyA9IGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94KGxheW91dEJveCk7CisKKyAgICAgICAgICAg
IGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3Ry
YWludHMuaG9yaXpvbnRhbCk7CisgICAgICAgICAgICBjb21wdXRlU3RhdGljVmVydGljYWxQb3Np
dGlvbihsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLnZlcnRpY2FsKTsKKyAg
ICAgICAgICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbihmbG9hdGluZ0NvbnRleHQsIGxheW91dEJv
eCwgeyBjb25zdHJhaW50cywgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMgfSk7CisgICAgICAg
ICAgICBjb21wdXRlU3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgY29udGFpbmlu
Z0Jsb2NrQ29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAgICAgICAgICBjb21wdXRlUG9zaXRp
b25Ub0F2b2lkRmxvYXRzKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCB7IGNvbnN0cmFpbnRz
LCBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyB9KTsKKworICAgICAgICAgICAgaWYgKGxheW91
dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBp
ZiAoaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4o
bGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkgeworICAgICAgICAgICAgICAg
ICAgICBhdXRvJiBjb250YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJv
eCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJCb3guZXN0YWJsaXNoZXNJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJRkNz
IGluaGVyaXQgZmxvYXRzIGZyb20gcGFyZW50IEZDcy4gV2UgbmVlZCBmaW5hbCB2ZXJ0aWNhbCBw
b3NpdGlvbiB0byBmaW5kIGludHJ1ZGluZyBmbG9hdHMuCisgICAgICAgICAgICAgICAgICAgICAg
ICBwcmVjb21wdXRlVmVydGljYWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhjb250YWluZXJC
b3gsIHsgY29uc3RyYWludHMsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzIH0pOworICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIExheW91dCB0aGUgaW5mbG93
IGRlc2NlbmRhbnRzIG9mIHRoaXMgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QuCisgICAgICAgICAg
ICAgICAgICAgIGF1dG8gZm9ybWF0dGluZ0NvbnRleHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVG
b3JtYXR0aW5nQ29udGV4dChjb250YWluZXJCb3gsIGxheW91dFN0YXRlKCkpOworICAgICAgICAg
ICAgICAgICAgICBpZiAoY29udGFpbmVyQm94LmlzVGFibGVXcmFwcGVyQm94KCkpCisgICAgICAg
ICAgICAgICAgICAgICAgICBkb3duY2FzdDxUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0PigqZm9ybWF0dGluZ0NvbnRleHQpLnNldEhvcml6b250YWxDb25zdHJhaW50c0lnbm9yaW5n
RmxvYXRzKGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAg
ICAgICAgICAgICBmb3JtYXR0aW5nQ29udGV4dC0+bGF5b3V0SW5GbG93Q29udGVudChpbnZhbGlk
YXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29udGFp
bmVyQm94KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShsYXlv
dXRCb3gsIExheW91dERpcmVjdGlvbjo6Q2hpbGQpKQorICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xpbWIgYmFjayBvbiB0aGUgYW5jZXN0b3JzIGFuZCBj
b21wdXRlIGhlaWdodC9maW5hbCBwb3NpdGlvbi4KKyAgICAgICAgd2hpbGUgKCFsYXlvdXRRdWV1
ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9ICpsYXlvdXRRdWV1
ZS50YWtlTGFzdCgpOworICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50
cyA9IGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94KGxheW91dEJveCk7CisKKyAgICAgICAgICAgIC8v
IEFsbCBpbmZsb3cgZGVzY2VuZGFudHMgKGlmIHRoZXJlIGFyZSBhbnkpIGFyZSBsYWlkIG91dCBi
eSBub3cuIExldCdzIGNvbXB1dGUgdGhlIGJveCdzIGhlaWdodCBhbmQgdmVydGljYWwgbWFyZ2lu
LgorICAgICAgICAgICAgY29tcHV0ZUhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnRhaW5p
bmdCbG9ja0NvbnN0cmFpbnRzKTsKKyAgICAgICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGlu
Z1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgICAgICBmbG9hdGluZ1N0YXRlLmFwcGVuZChmbG9h
dGluZ0NvbnRleHQudG9GbG9hdEl0ZW0obGF5b3V0Qm94KSk7CisgICAgICAgICAgICBlbHNlIHsK
KyAgICAgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG5vdyB0aGF0
IHdlJ3ZlIGdvdCBmaW5hbCBtYXJnaW4gdmFsdWVzIGZvciBub24tZmxvYXQgYXZvaWRlciBib3hl
cy4KKyAgICAgICAgICAgICAgICAvLyBGbG9hdCBhdm9pZGVycyBoYXZlIHByZS1jb21wdXRlZCB2
ZXJ0aWNhbCBwb3NpdGlvbnMgd2hlbiBmbG9hdHMgYXJlIHByZXNlbnQuCisgICAgICAgICAgICAg
ICAgaWYgKCFsYXlvdXRCb3guaXNGbG9hdEF2b2lkZXIoKSB8fCBmbG9hdGluZ0NvbnRleHQuaXNF
bXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRo
aXMtPmZvcm1hdHRpbmdTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBhdXRvJiBib3hHZW9t
ZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOworICAgICAgICAg
ICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25XaXRo
TWFyZ2luKGxheW91dEJveCwgZm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlv
dXRCb3gpLCBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cy52ZXJ0aWNhbCkpOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gZXN0YWJsaXNoZXNGb3Jt
YXR0aW5nQ29udGV4dCA9IGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCk7
IAorICAgICAgICAgICAgaWYgKGVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQpIHsKKyAgICAg
ICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBjb21wdXRlZCB0aGUgYm94J3MgaGVpZ2h0LCB3ZSBj
YW4gbGF5b3V0IHRoZSBvdXQtb2YtZmxvdyBkZXNjZW5kYW50cy4KKyAgICAgICAgICAgICAgICBp
ZiAoaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4o
bGF5b3V0Qm94KS5oYXNDaGlsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGNvbnRh
aW5lckJveCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKKyAgICAgICAgICAg
ICAgICAgICAgTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmVy
Qm94LCBsYXlvdXRTdGF0ZSgpKS0+bGF5b3V0T3V0T2ZGbG93Q29udGVudChpbnZhbGlkYXRpb25T
dGF0ZSwgZ2VvbWV0cnkoKS5jb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29udGFpbmVy
Qm94KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYg
KCFlc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0ICYmIGlzPENvbnRhaW5lckJveD4obGF5b3V0
Qm94KSkKKyAgICAgICAgICAgICAgICBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihkb3du
Y2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCksIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRz
Lmhvcml6b250YWwpOworCisgICAgICAgICAgICBpZiAoYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUo
bGF5b3V0Qm94LCBMYXlvdXREaXJlY3Rpb246OlNpYmxpbmcpKQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgfQorICAgIC8vIFBsYWNlIHRoZSBpbmZsb3cgcG9zaXRpb25l
ZCBjaGlsZHJlbi4KKyAgICBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihmb3JtYXR0aW5n
Um9vdCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1h
dHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltFbmRdIC0+IGJsb2NrIGZvcm1hdHRpbmcg
Y29udGV4dCAtPiBmb3JtYXR0aW5nIHJvb3QoIiA8PCAmcm9vdCgpIDw8ICIpIik7Cit9CisKK0xh
eW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25z
dAoreworICAgIC8vIDEwLjYuNyAnQXV0bycgaGVpZ2h0cyBmb3IgYmxvY2sgZm9ybWF0dGluZyBj
b250ZXh0IHJvb3RzCisKKyAgICAvLyBJZiBpdCBoYXMgYmxvY2stbGV2ZWwgY2hpbGRyZW4sIHRo
ZSBoZWlnaHQgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHRvcCBtYXJnaW4tZWRnZSBvZiB0
aGUgdG9wbW9zdCBibG9jay1sZXZlbAorICAgIC8vIGNoaWxkIGJveCBhbmQgdGhlIGJvdHRvbSBt
YXJnaW4tZWRnZSBvZiB0aGUgYm90dG9tbW9zdCBibG9jay1sZXZlbCBjaGlsZCBib3guCisKKyAg
ICAvLyBJbiBhZGRpdGlvbiwgaWYgdGhlIGVsZW1lbnQgaGFzIGFueSBmbG9hdGluZyBkZXNjZW5k
YW50cyB3aG9zZSBib3R0b20gbWFyZ2luIGVkZ2UgaXMgYmVsb3cgdGhlIGVsZW1lbnQncyBib3R0
b20gY29udGVudCBlZGdlLAorICAgIC8vIHRoZW4gdGhlIGhlaWdodCBpcyBpbmNyZWFzZWQgdG8g
aW5jbHVkZSB0aG9zZSBlZGdlcy4gT25seSBmbG9hdHMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiB0aGlz
IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBhcmUgdGFrZW4KKyAgICAvLyBpbnRvIGFjY291bnQs
IGUuZy4sIGZsb2F0cyBpbnNpZGUgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGRlc2NlbmRhbnRzIG9y
IG90aGVyIGZsb2F0cyBhcmUgbm90LgorICAgIGF1dG8gdG9wID0gT3B0aW9uYWw8TGF5b3V0VW5p
dD4geyB9OworICAgIGF1dG8gYm90dG9tID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OworICAg
IGlmIChyb290KCkuaGFzSW5GbG93Q2hpbGQoKSkgeworICAgICAgICB0b3AgPSBCb3hHZW9tZXRy
eTo6bWFyZ2luQm94UmVjdChnZW9tZXRyeUZvckJveCgqcm9vdCgpLmZpcnN0SW5GbG93Q2hpbGQo
KSkpLnRvcCgpOworICAgICAgICBib3R0b20gPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChn
ZW9tZXRyeUZvckJveCgqcm9vdCgpLmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7CisgICAg
fQorCisgICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhpcywg
Zm9ybWF0dGluZ1N0YXRlKCkuZmxvYXRpbmdTdGF0ZSgpIH07CisgICAgaWYgKGF1dG8gZmxvYXRU
b3AgPSBmbG9hdGluZ0NvbnRleHQudG9wKCkpIHsKKyAgICAgICAgdG9wID0gc3RkOjptaW4oKmZs
b2F0VG9wLCB0b3AudmFsdWVPcigqZmxvYXRUb3ApKTsKKyAgICAgICAgYXV0byBmbG9hdEJvdHRv
bSA9ICpmbG9hdGluZ0NvbnRleHQuYm90dG9tKCk7CisgICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4
KGZsb2F0Qm90dG9tLCBib3R0b20udmFsdWVPcihmbG9hdEJvdHRvbSkpOworICAgIH0KKyAgICBy
ZXR1cm4gKmJvdHRvbSAtICp0b3A7Cit9CisKK09wdGlvbmFsPExheW91dFVuaXQ+IEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6OnVzZWRBdmFpbGFibGVXaWR0aEZvckZsb2F0QXZvaWRlcihjb25zdCBG
bG9hdGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNv
bnN0IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQoreworICAgIC8vIE5vcm1hbGx5
IHRoZSBhdmFpbGFibGUgd2lkdGggZm9yIGFuIGluLWZsb3cgYmxvY2sgbGV2ZWwgYm94IGlzIHRo
ZSB3aWR0aCBvZiB0aGUgY29udGFpbmluZyBibG9jaydzIGNvbnRlbnQgYm94LgorICAgIC8vIEhv
d2V2ZXIgKGFuZCBjYW4ndCBmaW5kIGl0IGFueXdoZXJlIGluIHRoZSBzcGVjKSBub24tZmxvYXRp
bmcgcG9zaXRpb25lZCBmbG9hdCBhdm9pZGVyIGJsb2NrIGxldmVsIGJveGVzIGFyZSBjb25zdHJh
aW5lZCBieSBleGlzdGluZyBmbG9hdHMuCisgICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0QXZv
aWRlcigpKTsKKyAgICBpZiAoZmxvYXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuIHsgfTsKKyAgICAvLyBGbG9hdCBjbGVhciBwdXNoZXMgdGhlIGJsb2NrIGxldmVsIGJveCBl
aXRoZXIgYmVsb3cgdGhlIGZsb2F0cywgb3IganVzdCBvbmUgc2lkZSBiZWxvdyBidXQgdGhlIG90
aGVyIHNpZGUgY291bGQgb3ZlcmxhcC4KKyAgICAvLyBXaGF0IGl0IG1lYW5zIGlzIHRoYXQgdGhl
IHVzZWQgYXZhaWxhYmxlIHdpZHRoIGFsd2F5cyBtYXRjaGVzIHRoZSBjb250YWluaW5nIGJsb2Nr
J3MgY29uc3RyYWludC4KKyAgICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKKyAgICAg
ICAgcmV0dXJuIHsgfTsKKworICAgIEFTU0VSVChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0
aW5nQ29udGV4dCgpKTsKKyAgICAvLyBWZXJ0aWNhbCBzdGF0aWMgcG9zaXRpb24gaXMgbm90IGNv
bXB1dGVkIHlldCBmb3IgdGhpcyBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdCwgc28gbGV0J3MganVz
dCBwcmUtY29tcHV0ZSBpdCBmb3Igbm93LgorICAgIHByZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9u
Rm9yQm94QW5kQW5jZXN0b3JzKGxheW91dEJveCwgY29uc3RyYWludHNQYWlyKTsKKworICAgIGF1
dG8gbG9naWNhbFRvcEluRm9ybWF0dGluZ0NvbnRleHRSb290Q29vcmRpbmF0ZSA9IFsmXSAoYXV0
byYgZmxvYXRBdm9pZGVyKSB7CisgICAgICAgIGF1dG8gdG9wID0gQm94R2VvbWV0cnk6OmJvcmRl
ckJveFRvcChnZW9tZXRyeUZvckJveChmbG9hdEF2b2lkZXIpKTsKKyAgICAgICAgZm9yIChhdXRv
KiBhbmNlc3RvciA9ICZmbG9hdEF2b2lkZXIuY29udGFpbmluZ0Jsb2NrKCk7IGFuY2VzdG9yICE9
ICZyb290KCk7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkKKyAgICAg
ICAgICAgIHRvcCArPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94VG9wKGdlb21ldHJ5Rm9yQm94KCph
bmNlc3RvcikpOworICAgICAgICByZXR1cm4gdG9wOworICAgIH07CisKKyAgICBhdXRvIGZsb2F0
Q29uc3RyYWludHNJbkNvbnRhaW5pbmdCbG9ja0Nvb3JkaW5hdGUgPSBbJl0gKGF1dG8gZmxvYXRD
b25zdHJhaW50cykgeworICAgICAgICBpZiAoIWZsb2F0Q29uc3RyYWludHMubGVmdCAmJiAhZmxv
YXRDb25zdHJhaW50cy5yaWdodCkKKyAgICAgICAgICAgIHJldHVybiBGbG9hdGluZ0NvbnRleHQ6
OkNvbnN0cmFpbnRzIHsgfTsKKyAgICAgICAgYXV0byBvZmZzZXQgPSBMYXlvdXRTaXplIHsgfTsK
KyAgICAgICAgZm9yIChhdXRvKiBhbmNlc3RvciA9ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2Nr
KCk7IGFuY2VzdG9yICE9ICZyb290KCk7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5n
QmxvY2soKSkKKyAgICAgICAgICAgIG9mZnNldCArPSB0b0xheW91dFNpemUoQm94R2VvbWV0cnk6
OmJvcmRlckJveFRvcExlZnQoZ2VvbWV0cnlGb3JCb3goKmFuY2VzdG9yKSkpOworICAgICAgICBp
ZiAoZmxvYXRDb25zdHJhaW50cy5sZWZ0KQorICAgICAgICAgICAgZmxvYXRDb25zdHJhaW50cy5s
ZWZ0ID0gUG9pbnRJbkNvbnRleHRSb290IHsgKmZsb2F0Q29uc3RyYWludHMubGVmdCAtIG9mZnNl
dCB9OworICAgICAgICBpZiAoZmxvYXRDb25zdHJhaW50cy5yaWdodCkKKyAgICAgICAgICAgIGZs
b2F0Q29uc3RyYWludHMucmlnaHQgPSBQb2ludEluQ29udGV4dFJvb3QgeyAqZmxvYXRDb25zdHJh
aW50cy5yaWdodCAtIG9mZnNldCB9OworICAgICAgICByZXR1cm4gZmxvYXRDb25zdHJhaW50czsK
KyAgICB9OworCisgICAgLy8gRklYTUU6IENoZWNrIGlmIHRoZSBub24teWV0LWNvbXB1dGVkIGhl
aWdodCBhZmZlY3RzIHRoaXMgY29tcHV0YXRpb24gLSBhbmQgd2hldGhlciB3ZSBoYXZlIHRvIHJl
c29sdmUgaXQgYXQgYSBsYXRlciBwb2ludC4KKyAgICBhdXRvIGxvZ2ljYWxUb3AgPSBsb2dpY2Fs
VG9wSW5Gb3JtYXR0aW5nQ29udGV4dFJvb3RDb29yZGluYXRlKGxheW91dEJveCk7CisgICAgYXV0
byBjb25zdHJhaW50cyA9IGZsb2F0Q29uc3RyYWludHNJbkNvbnRhaW5pbmdCbG9ja0Nvb3JkaW5h
dGUoZmxvYXRpbmdDb250ZXh0LmNvbnN0cmFpbnRzKGxvZ2ljYWxUb3AsIGxvZ2ljYWxUb3ApKTsK
KyAgICBpZiAoIWNvbnN0cmFpbnRzLmxlZnQgJiYgIWNvbnN0cmFpbnRzLnJpZ2h0KQorICAgICAg
ICByZXR1cm4geyB9OworICAgIC8vIFNocmluayB0aGUgYXZhaWxhYmxlIHNwYWNlIGlmIHRoZSBm
bG9hdHMgYXJlIGFjdHVhbGx5IGludHJ1ZGluZyBhdCB0aGlzIHZlcnRpY2FsIHBvc2l0aW9uLgor
ICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBjb25zdHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2Nr
Lmhvcml6b250YWwubG9naWNhbFdpZHRoOworICAgIGlmIChjb25zdHJhaW50cy5sZWZ0KQorICAg
ICAgICBhdmFpbGFibGVXaWR0aCAtPSBjb25zdHJhaW50cy5sZWZ0LT54OworICAgIGlmIChjb25z
dHJhaW50cy5yaWdodCkKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3RkOjptYXgoMF9sdSwg
Y29uc3RyYWludHNQYWlyLmNvbnRhaW5pbmdCbG9jay5ob3Jpem9udGFsLmxvZ2ljYWxSaWdodCgp
IC0gY29uc3RyYWludHMucmlnaHQtPngpOworICAgIHJldHVybiBhdmFpbGFibGVXaWR0aDsKK30K
Kwordm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGls
ZHJlbihjb25zdCBDb250YWluZXJCb3gmIGNvbnRhaW5lckJveCwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCit7CisgICAgTE9HX1dJVEhfU1RSRUFN
KEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIlN0YXJ0OiBtb3ZlIGluLWZsb3cg
cG9zaXRpb25lZCBjaGlsZHJlbiAtPiBwYXJlbnQ6ICIgPDwgJmNvbnRhaW5lckJveCk7CisgICAg
Zm9yIChhdXRvJiBjaGlsZEJveCA6IGNoaWxkcmVuT2ZUeXBlPEJveD4oY29udGFpbmVyQm94KSkg
eworICAgICAgICBpZiAoIWNoaWxkQm94LmlzSW5GbG93UG9zaXRpb25lZCgpKQorICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgIGF1dG8gcG9zaXRpb25PZmZzZXQgPSBnZW9tZXRyeSgpLmlu
Rmxvd1Bvc2l0aW9uZWRQb3NpdGlvbk9mZnNldChjaGlsZEJveCwgaG9yaXpvbnRhbENvbnN0cmFp
bnRzKTsKKyAgICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoY2hpbGRCb3gpLm1v
dmUocG9zaXRpb25PZmZzZXQpOworICAgIH0KKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGlu
Z0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiRW5kOiBtb3ZlIGluLWZsb3cgcG9zaXRpb25lZCBj
aGlsZHJlbiAtPiBwYXJlbnQ6ICIgPDwgJmNvbnRhaW5lckJveCk7Cit9CisKK3ZvaWQgQmxvY2tG
b3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZVN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94
JiBsYXlvdXRCb3gsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWlu
dHMpCit7CisgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRM
b2dpY2FsVG9wKGdlb21ldHJ5KCkuc3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIHZl
cnRpY2FsQ29uc3RyYWludHMpKTsKK30KKwordm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpj
b21wdXRlU3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBm
b3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxMZWZ0KGdl
b21ldHJ5KCkuc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzKSk7Cit9CisKK3ZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6cHJlY29tcHV0
ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMoY29uc3QgQm94JiBsYXlvdXRCb3gs
IGNvbnN0IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQoreworICAgIC8vIEluIG9y
ZGVyIHRvIGZpZ3VyZSBvdXQgd2hldGhlciBhIGJveCBzaG91bGQgYXZvaWQgYSBmbG9hdCwgd2Ug
bmVlZCB0byBrbm93IHRoZSBmaW5hbCBwb3NpdGlvbnMgb2YgYm90aCAoaWdub3JlIHJlbGF0aXZl
IHBvc2l0aW9uaW5nIGZvciBub3cpLgorICAgIC8vIEluIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4
dCB0aGUgZmluYWwgcG9zaXRpb24gZm9yIGEgbm9ybWFsIGZsb3cgYm94IGluY2x1ZGVzCisgICAg
Ly8gMS4gdGhlIHN0YXRpYyBwb3NpdGlvbiBhbmQKKyAgICAvLyAyLiB0aGUgY29ycmVzcG9uZGlu
ZyAobm9uKWNvbGxhcHNlZCBtYXJnaW5zLgorICAgIC8vIE5vdyB0aGUgdmVydGljYWwgbWFyZ2lu
cyBhcmUgY29tcHV0ZWQgd2hlbiBhbGwgdGhlIGRlc2NlbmRhbnRzIGFyZSBmaW5hbGl6ZWQsIGJl
Y2F1c2UgdGhlIG1hcmdpbiB2YWx1ZXMgbWlnaHQgYmUgZGVwZW5kaW5nIG9uIHRoZSBoZWlnaHQg
b2YgdGhlIGJveAorICAgIC8vIChhbmQgdGhlIGhlaWdodCBtaWdodCBiZSBiYXNlZCBvbiB0aGUg
Y29udGVudCkuCisgICAgLy8gU28gd2hlbiB3ZSBnZXQgdG8gdGhlIHBvaW50IHdoZXJlIHdlIGlu
dGVyc2VjdCB0aGUgYm94IHdpdGggdGhlIGZsb2F0IHRvIGRlY2lkZSBpZiB0aGUgYm94IG5lZWRz
IHRvIG1vdmUsIHdlIGRvbid0IHlldCBoYXZlIHRoZSBmaW5hbCB2ZXJ0aWNhbCBwb3NpdGlvbi4K
KyAgICAvLworICAgIC8vIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCBhcyBsb25nIGFzIHdlIGRvbid0
IGNyb3NzIHRoZSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgYm91bmRhcnksIHdlIHNob3VsZCBi
ZSBhYmxlIHRvIHByZS1jb21wdXRlIHRoZSBmaW5hbCB0b3AgcG9zaXRpb24uCisgICAgLy8gRklY
TUU6IHdlIGN1cnJlbnRseSBkb24ndCBhY2NvdW50IGZvciB0aGUgImNsZWFyIiBwcm9wZXJ0eSB3
aGVuIGNvbXB1dGluZyB0aGUgZmluYWwgcG9zaXRpb24gZm9yIGFuIGFuY2VzdG9yLgorICAgIGZv
ciAoYXV0byogYW5jZXN0b3IgPSAmbGF5b3V0Qm94OyBhbmNlc3RvciAmJiBhbmNlc3RvciAhPSAm
cm9vdCgpOyBhbmNlc3RvciA9ICZhbmNlc3Rvci0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKKyAgICAg
ICAgYXV0byBjb25zdHJhaW50c0ZvckFuY2VzdG9yID0gWyZdIHsKKyAgICAgICAgICAgIGF1dG8m
IGNvbnRhaW5pbmdCbG9jayA9IGFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKTsKKyAgICAgICAg
ICAgIHJldHVybiAmY29udGFpbmluZ0Jsb2NrID09ICZyb290KCkgPyBjb25zdHJhaW50c1BhaXIu
Zm9ybWF0dGluZ0NvbnRleHRSb290IDogZ2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0Nv
bnRlbnQoY29udGFpbmluZ0Jsb2NrKTsKKyAgICAgICAgfSgpOworCisgICAgICAgIGF1dG8gY29t
cHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5KCkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbigq
YW5jZXN0b3IsIGNvbnN0cmFpbnRzRm9yQW5jZXN0b3IuaG9yaXpvbnRhbCk7CisgICAgICAgIGF1
dG8gdXNlZE5vbkNvbGxhcHNlZE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFw
c2VkVmFsdWVzIHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29t
cHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgICAgIGF1dG8gcHJl
Y29tcHV0ZWRNYXJnaW5CZWZvcmUgPSBtYXJnaW5Db2xsYXBzZSgpLnByZWNvbXB1dGVkTWFyZ2lu
QmVmb3JlKCphbmNlc3RvciwgdXNlZE5vbkNvbGxhcHNlZE1hcmdpbik7CisKKyAgICAgICAgYXV0
byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSgqYW5jZXN0b3Ip
OworICAgICAgICBhdXRvIG5vbkNvbGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6
Tm9uQ29sbGFwc2VkVmFsdWVzIHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUubm9uQ29sbGFwc2Vk
VmFsdWUsIHsgfSB9OworICAgICAgICBhdXRvIGNvbGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNh
bE1hcmdpbjo6Q29sbGFwc2VkVmFsdWVzIHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUuY29sbGFw
c2VkVmFsdWUsIHsgfSwgZmFsc2UgfTsKKyAgICAgICAgYXV0byB2ZXJ0aWNhbE1hcmdpbiA9IFVz
ZWRWZXJ0aWNhbE1hcmdpbiB7IG5vbkNvbGxhcHNlZFZhbHVlcywgY29sbGFwc2VkVmFsdWVzLCB7
IHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlLnBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW5CZWZvcmUs
IHsgfSB9IH07CisKKyAgICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0VXNlZFZlcnRpY2FsTWFy
Z2luKCphbmNlc3RvciwgdmVydGljYWxNYXJnaW4pOworICAgICAgICBib3hHZW9tZXRyeS5zZXRW
ZXJ0aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVy
KHZlcnRpY2FsTWFyZ2luKSB9KTsKKyAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcCh2
ZXJ0aWNhbFBvc2l0aW9uV2l0aE1hcmdpbigqYW5jZXN0b3IsIHZlcnRpY2FsTWFyZ2luLCBjb25z
dHJhaW50c0ZvckFuY2VzdG9yLnZlcnRpY2FsKSk7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICAg
ICAgc2V0UHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoKmFuY2VzdG9yLCBwcmVjb21wdXRlZE1hcmdp
bkJlZm9yZSk7CisgICAgICAgIGJveEdlb21ldHJ5LnNldEhhc1ByZWNvbXB1dGVkTWFyZ2luQmVm
b3JlKCk7CisjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6
Y29tcHV0ZVBvc2l0aW9uVG9Bdm9pZEZsb2F0cyhjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0
aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYg
Y29uc3RyYWludHNQYWlyKQoreworICAgIGlmICghbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkp
CisgICAgICAgIHJldHVybjsKKyAgICAvLyBJbiBvcmRlciB0byBwb3NpdGlvbiBhIGZsb2F0IGF2
b2lkZXIgd2UgbmVlZCB0byBrbm93IGl0cyB2ZXJ0aWNhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byBp
dHMgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QgKGFuZCBub3QganVzdCBpdHMgY29udGFpbmluZyBi
bG9jayksCisgICAgLy8gYmVjYXVzZSBhbGwgdGhlIGFscmVhZHktcGxhY2VkIGZsb2F0cyAoZmxv
YXRzIHRoYXQgd2UgYXJlIHRyeWluZyB0byBhdm9pZCBoZXJlKSBpbiB0aGlzIEJGQyBtaWdodCBi
ZWxvbmcKKyAgICAvLyB0byBhIGRpZmZlcmVudCBzZXQgb2YgY29udGFpbmluZyBibG9ja3MgKGJ1
dCB0aGV5IGFsbCBkZXNjZW5kYW50cyBvZiB0aGUgQkZDIHJvb3QpLgorICAgIC8vIEhvd2V2ZXIg
YWNjb3JkaW5nIHRvIHRoZSBCRkMgcnVsZXMsIGF0IHRoaXMgcG9pbnQgb2YgdGhlIGxheW91dCBm
bG93IHdlIGRvbid0IHlldCBoYXZlIGNvbXB1dGVkIHZlcnRpY2FsIHBvc2l0aW9ucyBmb3IgdGhl
IGFuY2VzdG9ycy4KKyAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpIHsK
KyAgICAgICAgcHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMobGF5
b3V0Qm94LCBjb25zdHJhaW50c1BhaXIpOworICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hH
ZW9tZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nQ29udGV4dC5wb3Np
dGlvbkZvckZsb2F0KGxheW91dEJveCwgY29uc3RyYWludHNQYWlyLmNvbnRhaW5pbmdCbG9jay5o
b3Jpem9udGFsKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gTm9uLWZsb2F0IHBv
c2l0aW9uZWQgZmxvYXQgYXZvaWRlcnMgKGZvcm1hdHRpbmcgY29udGV4dCByb290cyBhbmQgY2xl
YXIgYm94ZXMpIHNob3VsZCBiZSBmaW5lIHVubGVzcyB0aGVyZSBhcmUgZmxvYXRzIGluIHRoaXMg
Y29udGV4dC4KKyAgICBpZiAoZmxvYXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuOworICAgIHByZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGxh
eW91dEJveCwgY29uc3RyYWludHNQYWlyKTsKKyAgICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xl
YXIoKSkKKyAgICAgICAgcmV0dXJuIGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVh
cihmbG9hdGluZ0NvbnRleHQsIGxheW91dEJveCk7CisKKyAgICBBU1NFUlQobGF5b3V0Qm94LmVz
dGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7CisgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94
R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRMb2dpY2FsVG9wTGVmdChmbG9hdGluZ0NvbnRleHQucG9z
aXRpb25Gb3JOb25GbG9hdGluZ0Zsb2F0QXZvaWRlcihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzUGFp
ci5jb250YWluaW5nQmxvY2suaG9yaXpvbnRhbCkpOworfQorCit2b2lkIEJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ6OmNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihjb25zdCBGbG9h
dGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gpCit7Cisg
ICAgQVNTRVJUKGxheW91dEJveC5oYXNGbG9hdENsZWFyKCkpOworICAgIGlmIChmbG9hdGluZ0Nv
bnRleHQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisgICAgYXV0byB2ZXJ0aWNhbFBvc2l0
aW9uQW5kQ2xlYXJhbmNlID0gZmxvYXRpbmdDb250ZXh0LnZlcnRpY2FsUG9zaXRpb25XaXRoQ2xl
YXJhbmNlKGxheW91dEJveCk7CisgICAgaWYgKCF2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJhbmNl
KQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdT
dGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7CisgICAgQVNTRVJUKHZlcnRpY2FsUG9zaXRp
b25BbmRDbGVhcmFuY2UtPnBvc2l0aW9uID49IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hUb3AoYm94
R2VvbWV0cnkpKTsKKyAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRp
b25BbmRDbGVhcmFuY2UtPnBvc2l0aW9uKTsKKyAgICBpZiAodmVydGljYWxQb3NpdGlvbkFuZENs
ZWFyYW5jZS0+Y2xlYXJhbmNlKQorICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRIYXNDbGVh
cmFuY2UobGF5b3V0Qm94KTsKKyAgICAvLyBGSVhNRTogUmVzZXQgdGhlIG1hcmdpbiB2YWx1ZXMg
b24gdGhlIGFuY2VzdG9ycy9wcmV2aW91cyBzaWJsaW5ncyBub3cgdGhhdCB0aGUgZmxvYXQgYXZv
aWRlciB3aXRoIGNsZWFyYW5jZSBkb2VzIG5vdCBtYXJnaW4gY29sbGFwc2UgYW55bW9yZS4KK30K
Kwordm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29u
c3QgRmxvYXRpbmdDb250ZXh0JiBmbG9hdGluZ0NvbnRleHQsIGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBjb25zdCBDb25zdHJhaW50c1BhaXImIGNvbnN0cmFpbnRzUGFpcikKK3sKKyAgICBhdXRvIGF2
YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OworICAg
IGlmIChsYXlvdXRCb3guaXNGbG9hdEF2b2lkZXIoKSkgeworICAgICAgICAvLyBGbG9hdCBhdm9p
ZGVycycgYXZhaWxhYmxlIHdpZHRoIG1pZ2h0IGJlIHNocnVuayBieSBleGlzdGluZyBmbG9hdHMg
aW4gdGhlIGNvbnRleHQuCisgICAgICAgIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyID0gdXNl
ZEF2YWlsYWJsZVdpZHRoRm9yRmxvYXRBdm9pZGVyKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94
LCBjb25zdHJhaW50c1BhaXIpOworICAgIH0KKyAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdp
biA9IGdlb21ldHJ5KCkuY29tcHV0ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBj
b25zdHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250YWwsIGF2YWlsYWJsZVdpZHRo
RmxvYXRBdm9pZGVyKTsKKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgp
LmJveEdlb21ldHJ5KGxheW91dEJveCk7CisgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdp
ZHRoKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOworICAgIGJveEdlb21ldHJ5
LnNldEhvcml6b250YWxNYXJnaW4oeyBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5z
dGFydCwgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIH0pOworfQorCit2b2lk
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94
JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWlu
dHMpCit7CisgICAgYXV0byBjb21wdXRlID0gWyZdKE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRI
ZWlnaHQpIC0+IENvbnRlbnRIZWlnaHRBbmRNYXJnaW4geworICAgICAgICBpZiAobGF5b3V0Qm94
LmlzSW5GbG93KCkpCisgICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbkZsb3dDb250ZW50
SGVpZ2h0QW5kTWFyZ2luKGxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwgeyB1c2Vk
SGVpZ2h0IH0pOworCisgICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQo
KSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmZsb2F0aW5nQ29udGVudEhlaWdodEFu
ZE1hcmdpbihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIHsgdXNlZEhlaWdodCB9
KTsKKworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIHsgfTsK
KyAgICB9OworCisgICAgYXV0byBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZSh7IH0p
OworICAgIGlmIChhdXRvIG1heEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQo
bGF5b3V0Qm94KSkgeworICAgICAgICBpZiAoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50
SGVpZ2h0ID4gKm1heEhlaWdodCkgeworICAgICAgICAgICAgYXV0byBtYXhIZWlnaHRBbmRNYXJn
aW4gPSBjb21wdXRlKG1heEhlaWdodCk7CisgICAgICAgICAgICAvLyBVc2VkIGhlaWdodCBzaG91
bGQgcmVtYWluIHRoZSBzYW1lLgorICAgICAgICAgICAgQVNTRVJUKChsYXlvdXRTdGF0ZSgpLmlu
UXVpcmtzTW9kZSgpICYmIChsYXlvdXRCb3guaXNCb2R5Qm94KCkgfHwgbGF5b3V0Qm94LmlzRG9j
dW1lbnRCb3goKSkpIHx8IG1heEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID09ICptYXhI
ZWlnaHQpOworICAgICAgICAgICAgY29udGVudEhlaWdodEFuZE1hcmdpbiA9IHsgKm1heEhlaWdo
dCwgbWF4SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbiB9OworICAgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKGF1dG8gbWluSGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbkhl
aWdodChsYXlvdXRCb3gpKSB7CisgICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNv
bnRlbnRIZWlnaHQgPCAqbWluSGVpZ2h0KSB7CisgICAgICAgICAgICBhdXRvIG1pbkhlaWdodEFu
ZE1hcmdpbiA9IGNvbXB1dGUobWluSGVpZ2h0KTsKKyAgICAgICAgICAgIC8vIFVzZWQgaGVpZ2h0
IHNob3VsZCByZW1haW4gdGhlIHNhbWUuCisgICAgICAgICAgICBBU1NFUlQoKGxheW91dFN0YXRl
KCkuaW5RdWlya3NNb2RlKCkgJiYgKGxheW91dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3gu
aXNEb2N1bWVudEJveCgpKSkgfHwgbWluSGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPT0g
Km1pbkhlaWdodCk7CisgICAgICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0geyAqbWlu
SGVpZ2h0LCBtaW5IZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luIH07CisgICAgICAg
IH0KKyAgICB9CisKKyAgICAvLyAxLiBDb21wdXRlIGNvbGxhcHNlZCBtYXJnaW5zLgorICAgIC8v
IDIuIEFkanVzdCB2ZXJ0aWNhbCBwb3NpdGlvbiB1c2luZyB0aGUgY29sbGFwc2VkIHZhbHVlcy4K
KyAgICAvLyAzLiBBZGp1c3QgcHJldmlvdXMgaW4tZmxvdyBzaWJsaW5nIG1hcmdpbiBhZnRlciB1
c2luZyB0aGlzIG1hcmdpbi4KKyAgICBhdXRvIG1hcmdpbkNvbGxhcHNlID0gdGhpcy0+bWFyZ2lu
Q29sbGFwc2UoKTsKKyAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gbWFyZ2luQ29sbGFwc2UuY29s
bGFwc2VkVmVydGljYWxWYWx1ZXMobGF5b3V0Qm94LCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5v
bkNvbGxhcHNlZE1hcmdpbik7CisgICAgLy8gQ2FjaGUgdGhlIGNvbXB1dGVkIHBvc2l0aXZlIGFu
ZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWUgcGFpci4KKyAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRV
c2VkVmVydGljYWxNYXJnaW4obGF5b3V0Qm94LCB2ZXJ0aWNhbE1hcmdpbik7CisKKyNpZiBBU1NF
UlRfRU5BQkxFRAorICAgIGlmIChoYXNQcmVjb21wdXRlZE1hcmdpbkJlZm9yZShsYXlvdXRCb3gp
ICYmIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGxheW91dEJveCkudXNlZFZhbHVlKCkgIT0gbWFy
Z2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKSkgeworICAgICAgICAvLyBXaGVuIHRoZSBwcmUtY29t
cHV0ZWQgbWFyZ2luIHR1cm5zIG91dCB0byBiZSBpbmNvcnJlY3QsIHdlIG5lZWQgdG8gcmUtbGF5
b3V0IHRoaXMgc3VidHJlZSB3aXRoIHRoZSBjb3JyZWN0IG1hcmdpbiB2YWx1ZXMuCisgICAgICAg
IC8vIDxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0Ij48L2Rpdj4KKyAgICAgICAgLy8gPGRpdj4KKyAg
ICAgICAgLy8gICA8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOiAyMDBweCI+PC9kaXY+CisgICAg
ICAgIC8vIDwvZGl2PgorICAgICAgICAvLyBUaGUgZmxvYXQgYm94IHRyaWdnZXJzIG1hcmdpbiBi
ZWZvcmUgY29tcHV0YXRpb24gb24gdGhlIGFuY2VzdG9yIGNoYWluIHRvIGJlIGFibGUgdG8gaW50
ZXJzZWN0IHdpdGggb3RoZXIgZmxvYXRzIGluIHRoZSBzYW1lIGZsb2F0aW5nIGNvbnRleHQuCisg
ICAgICAgIC8vIEhvd2V2ZXIgaW4gc29tZSBjYXNlcyB0aGUgcGFyZW50IG1hcmdpbi10b3AgY29s
bGFwc2VzIHdpdGggc29tZSBuZXh0IHNpYmxpbmdzIChuZXBoZXdzKSBhbmQgdGhlcmUncyBubyB3
YXkgdG8gYmUgYWJsZSB0byBwcm9wZXJseQorICAgICAgICAvLyBhY2NvdW50IGZvciB0aGF0IHdp
dGhvdXQgbGF5aW5nIG91dCBldmVyeSBub2RlIGluIHRoZSBGQyAoaW4gdGhlIGV4YW1wbGUsIHRo
ZSBtYXJnaW4tYm90dG9tIHB1c2hlcyBkb3duIHRoZSBmbG9hdCkuCisgICAgICAgIEFTU0VSVF9O
T1RfSU1QTEVNRU5URURfWUVUKCk7CisgICAgfQorI2VuZGlmCisgICAgYXV0byYgYm94R2VvbWV0
cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOworICAgIGJveEdl
b21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50
SGVpZ2h0KTsKKyAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9y
ZSh2ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsKKyAgICAv
LyBBZGp1c3QgdGhlIHByZXZpb3VzIHNpYmxpbmcncyBtYXJnaW4gYm90dG9tIG5vdyB0aGF0IHRo
aXMgYm94J3MgdmVydGljYWwgbWFyZ2luIGlzIGNvbXB1dGVkLgorICAgIE1hcmdpbkNvbGxhcHNl
Ojp1cGRhdGVNYXJnaW5BZnRlckZvclByZXZpb3VzU2libGluZygqdGhpcywgbWFyZ2luQ29sbGFw
c2UsIGxheW91dEJveCk7Cit9CisKK0Zvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhD
b25zdHJhaW50cygpCit7CisgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0
dGluZ1N0YXRlKCk7CisgICAgQVNTRVJUKCFmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhD
b25zdHJhaW50cygpKTsKKyAgICAvLyBWaXNpdCB0aGUgaW4tZmxvdyBkZXNjZW5kYW50cyBhbmQg
Y29tcHV0ZSB0aGVpciBtaW4vbWF4IGludHJpbnNpYyB3aWR0aCBpZiBuZWVkZWQuCisgICAgLy8g
MS4gR28gYWxsIHRoZSB3YXkgZG93biB0byB0aGUgbGVhZiBub2RlCisgICAgLy8gMi4gQ2hlY2sg
aWYgYWN0dWFsbHkgbmVlZCB0byB2aXNpdCBhbGwgdGhlIGJveGVzIGFzIHdlIHRyYXZlcnNlIGRv
d24gKGFscmVhZHkgY29tcHV0ZWQsIGNvbnRhaW5lcidzIG1pbi9tYXggZG9lcyBub3QgZGVwZW5k
IG9uIGRlc2NlbmRhbnRzIGV0YykKKyAgICAvLyAzLiBBcyB3ZSBjbGltYiBiYWNrIG9uIHRoZSB0
cmVlLCBjb21wdXRlIG1pbi9tYXggaW50cmluc2ljIHdpZHRoCisgICAgLy8gKEFueSBzdWJ0cmVl
cyB3aXRoIG5ldyBmb3JtYXR0aW5nIGNvbnRleHRzIG5lZWQgdG8gbGF5b3V0IHN5bmNocm9ub3Vz
bHkpCisgICAgVmVjdG9yPGNvbnN0IEJveCo+IHF1ZXVlOworICAgIGlmIChyb290KCkuaGFzSW5G
bG93T3JGbG9hdGluZ0NoaWxkKCkpCisgICAgICAgIHF1ZXVlLmFwcGVuZChyb290KCkuZmlyc3RJ
bkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7CisKKyAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
IGNvbnN0cmFpbnRzOworICAgIGF1dG8gbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoID0g
TGF5b3V0VW5pdCB7IH07CisgICAgYXV0byBjdXJyZW50SG9yaXpvbnRhbFN0YWNraW5nV2lkdGgg
PSBMYXlvdXRVbml0IHsgfTsKKyAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAg
ICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBkZWFs
IHdpdGggZGVzY2VuZGFudCBjb250ZW50LgorICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0g
KnF1ZXVlLmxhc3QoKTsKKyAgICAgICAgICAgIC8vIEZsb2F0IGF2b2lkZXJzIGFyZSBhbGwgZXN0
YWJsaXNoIGEgbmV3IGZvcm1hdHRpbmcgY29udGV4dC4gTm8gbmVlZCB0byBsb29rIGluc2lkZSB0
aGVtLgorICAgICAgICAgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpICYmICFsYXlv
dXRCb3guaGFzRmxvYXRDbGVhcigpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgLy8gTm9uLWZsb2F0aW5nIGJsb2NrIGxldmVsIGJveGVzIHJlc2V0IHRoZSBjdXJyZW50IGhv
cml6b250YWwgZmxvYXQgc3RhY2tpbmcuCisgICAgICAgICAgICAvLyBTUEVDOiBUaGlzIGlzIGEg
Yml0IG9kZCBhcyBmbG9hdGluZyBwb3NpdGlvbmluZyBpcyBhIGZvcm1hdHRpbmcgY29udGV4dCBs
ZXZlbCBjb25jZXB0OgorICAgICAgICAgICAgLy8gZS5nLgorICAgICAgICAgICAgLy8gPGRpdiBz
dHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiAxMHB4OyI+PC9kaXY+CisgICAgICAgICAgICAvLyA8
ZGl2PjwvZGl2PgorICAgICAgICAgICAgLy8gPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRo
OiA0MHB4OyI+PC9kaXY+CisgICAgICAgICAgICAvLyAuLi53aWxsIHByb2R1Y2UgYSBtYXggd2lk
dGggb2YgNDBweCB3aGljaCBtYWtlcyB0aGUgZmxvYXRzIHZlcnRpY2FsbHkgc3RhY2tlZC4KKyAg
ICAgICAgICAgIC8vIFZlcnRpY2FsbHkgc3RhY2tlZCBmbG9hdHMgbWFrZXMgbWUgdGhpbmsgd2Ug
aGF2ZW4ndCBtYW5hZ2VkIHRvIHByb3ZpZGUgdGhlIG1heGltdW0gcHJlZmVycmVkIHdpZHRoIGZv
ciB0aGUgY29udGVudC4KKyAgICAgICAgICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0
aCA9IHN0ZDo6bWF4KGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6
b250YWxTdGFja2luZ1dpZHRoKTsKKyAgICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tp
bmdXaWR0aCA9IHsgfTsKKyAgICAgICAgICAgIC8vIEFscmVhZHkgaGFzIGNvbXB1dGVkIGludHJp
bnNpYyBjb25zdHJhaW50cy4KKyAgICAgICAgICAgIGlmIChmb3JtYXR0aW5nU3RhdGUuaW50cmlu
c2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChsYXlvdXRCb3gpKQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgLy8gQm94IHdpdGggZml4ZWQgd2lkdGggZGVmaW5lcyB0aGVpciBk
ZXNjZW5kYW50IGNvbnRlbnQgaW50cmluc2ljIHdpZHRoLgorICAgICAgICAgICAgaWYgKGxheW91
dEJveC5zdHlsZSgpLndpZHRoKCkuaXNGaXhlZCgpKQorICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgLy8gTm9uLWZsb2F0IGF2b2lkZXIgZm9ybWF0dGluZyBjb250ZXh0IHJvb3Rz
IGFyZSBvcGFxdWUgdG8gaW50cmluc2ljIHdpZHRoIGNvbXB1dGF0aW9uLgorICAgICAgICAgICAg
aWYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpCisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBObyByZWxldmFudCBjaGlsZCBjb250ZW50Lgor
ICAgICAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0
PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChkb3duY2FzdDxD
b250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7Cisg
ICAgICAgIH0KKyAgICAgICAgLy8gQ29tcHV0ZSBtaW4vbWF4IGludHJpbnNpYyB3aWR0aCBib3R0
b20gdXAgaWYgbmVlZGVkLgorICAgICAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgeworICAg
ICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKnF1ZXVlLnRha2VMYXN0KCk7CisgICAgICAgICAg
ICBhdXRvIGRlc2RlbmRhbnRDb25zdHJhaW50cyA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzRm9yQm94KGxheW91dEJveCk7CisgICAgICAgICAgICBpZiAoIWRlc2Rl
bmRhbnRDb25zdHJhaW50cykgeworICAgICAgICAgICAgICAgIGRlc2RlbmRhbnRDb25zdHJhaW50
cyA9IGdlb21ldHJ5KCkuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhsYXlvdXRCb3gpOworICAg
ICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
Rm9yQm94KGxheW91dEJveCwgKmRlc2RlbmRhbnRDb25zdHJhaW50cyk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBjb25zdHJhaW50cy5taW5pbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMu
bWluaW11bSwgZGVzZGVuZGFudENvbnN0cmFpbnRzLT5taW5pbXVtKTsKKyAgICAgICAgICAgIGF1
dG8gd2lsbFN0YWNrSG9yaXpvbnRhbGx5ID0gbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkgJiYg
IWxheW91dEJveC5oYXNGbG9hdENsZWFyKCk7CisgICAgICAgICAgICBpZiAod2lsbFN0YWNrSG9y
aXpvbnRhbGx5KQorICAgICAgICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0
aCArPSBkZXNkZW5kYW50Q29uc3RyYWludHMtPm1heGltdW07CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgY29uc3RyYWludHMubWF4aW11bSA9IHN0ZDo6bWF4KGNvbnN0cmFpbnRz
Lm1heGltdW0sIGRlc2RlbmRhbnRDb25zdHJhaW50cy0+bWF4aW11bSk7CisgICAgICAgICAgICAv
LyBNb3ZlIG92ZXIgdG8gdGhlIG5leHQgc2libGluZyBvciB0YWtlIHRoZSBuZXh0IGJveCBpbiB0
aGUgcXVldWUuCisgICAgICAgICAgICBpZiAoYXV0byogbmV4dFNpYmxpbmcgPSBsYXlvdXRCb3gu
bmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS5h
cHBlbmQobmV4dFNpYmxpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9
IHN0ZDo6bWF4KGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250
YWxTdGFja2luZ1dpZHRoKTsKKyAgICBjb25zdHJhaW50cy5tYXhpbXVtID0gc3RkOjptYXgoY29u
c3RyYWludHMubWF4aW11bSwgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsKKyAgICBm
b3JtYXR0aW5nU3RhdGUuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25zdHJhaW50cyk7
CisgICAgcmV0dXJuIGNvbnN0cmFpbnRzOworfQorCitMYXlvdXRVbml0IEJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ6OnZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBjb25zdCBVc2VkVmVydGljYWxNYXJnaW4mIHZlcnRpY2FsTWFyZ2luLCAgY29uc3QgVmVydGlj
YWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICBBU1NFUlQo
IWxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisgICAgLy8gTm93IHRoYXQgd2Un
dmUgY29tcHV0ZWQgdGhlIGZpbmFsIG1hcmdpbiBiZWZvcmUsIGxldCdzIHNoaWZ0IHRoZSBib3gn
cyB2ZXJ0aWNhbCBwb3NpdGlvbiBpZiBuZWVkZWQuCisgICAgLy8gMS4gQ2hlY2sgaWYgdGhlIGJv
eCBoYXMgY2xlYXJhbmNlLiBJZiBzbywgd2UndmUgYWxyZWFkeSBwcmVjb21wdXRlZC9maW5hbGl6
ZWQgdGhlIHRvcCB2YWx1ZSBhbmQgdmVydGljYWwgbWFyZ2luIGRvZXMgbm90IGltcGFjdCBpdCBh
bnltb3JlLgorICAgIC8vIDIuIENoZWNrIGlmIHRoZSBtYXJnaW4gYmVmb3JlIGNvbGxhcHNlcyB3
aXRoIHRoZSBwcmV2aW91cyBib3gncyBtYXJnaW4gYWZ0ZXIuIGlmIG5vdCAtPiByZXR1cm4gcHJl
dmlvdXMgYm94J3MgYm90dG9tIGluY2x1ZGluZyBtYXJnaW4gYWZ0ZXIgKyBtYXJnaW5CZWZvcmUK
KyAgICAvLyAzLiBDaGVjayBpZiB0aGUgcHJldmlvdXMgYm94J3MgbWFyZ2lucyBjb2xsYXBzZSB0
aHJvdWdoLiBJZiBub3QgLT4gcmV0dXJuIHByZXZpb3VzIGJveCcgYm90dG9tIGV4Y2x1ZGluZyBt
YXJnaW4gYWZ0ZXIgKyBtYXJnaW5CZWZvcmUgKHRoZXkgYXJlIHN1cHBvc2VkIHRvIGJlIGVxdWFs
KQorICAgIC8vIDQuIEdvIHRvIHByZXZpb3VzIGJveCBhbmQgc3RhcnQgZnJvbSBzdGVwICMxIHVu
dGlsIHdlIGhpdCB0aGUgcGFyZW50IGJveC4KKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGdlb21l
dHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAgaWYgKGZvcm1hdHRpbmdTdGF0ZSgpLmhhc0NsZWFy
YW5jZShsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gQm94R2VvbWV0cnk6OmJvcmRlckJveFRv
cChib3hHZW9tZXRyeSk7CisKKyAgICBhdXRvKiBjdXJyZW50TGF5b3V0Qm94ID0gJmxheW91dEJv
eDsKKyAgICB3aGlsZSAoY3VycmVudExheW91dEJveCkgeworICAgICAgICBpZiAoIWN1cnJlbnRM
YXlvdXRCb3gtPnByZXZpb3VzSW5GbG93U2libGluZygpKQorICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9ICpjdXJyZW50TGF5b3V0Qm94LT5w
cmV2aW91c0luRmxvd1NpYmxpbmcoKTsKKyAgICAgICAgaWYgKCFtYXJnaW5Db2xsYXBzZSgpLm1h
cmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVu
dExheW91dEJveCkpIHsKKyAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBn
ZW9tZXRyeUZvckJveChwcmV2aW91c0luRmxvd1NpYmxpbmcpOworICAgICAgICAgICAgcmV0dXJu
IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgp
ICsgbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIGlm
ICghbWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5zQ29sbGFwc2VUaHJvdWdoKHByZXZpb3VzSW5GbG93
U2libGluZykpIHsKKyAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9t
ZXRyeUZvckJveChwcmV2aW91c0luRmxvd1NpYmxpbmcpOworICAgICAgICAgICAgcmV0dXJuIEJv
eEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsg
bWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50
TGF5b3V0Qm94ID0gJnByZXZpb3VzSW5GbG93U2libGluZzsKKyAgICB9CisKKyAgICBhdXRvIGNv
bnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgPSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxU
b3A7CisgICAgLy8gQWRqdXN0IHZlcnRpY2FsIHBvc2l0aW9uIGRlcGVuZGluZyB3aGV0aGVyIHRo
aXMgYm94IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYWRqb2lucyB3aXRoIGl0cyBwYXJlbnQuCisg
ICAgYXV0byBkaXJlY3RseUFkam9pbnNQYXJlbnQgPSAhbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93
U2libGluZygpOworICAgIGlmIChkaXJlY3RseUFkam9pbnNQYXJlbnQpIHsKKyAgICAgICAgLy8g
SWYgdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgb2YgYSBib3ggYXJlIGFkam9pbmluZywgdGhl
biBpdCBpcyBwb3NzaWJsZSBmb3IgbWFyZ2lucyB0byBjb2xsYXBzZSB0aHJvdWdoIGl0LgorICAg
ICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBkZXBlbmRz
IG9uIGl0cyByZWxhdGlvbnNoaXAgd2l0aCB0aGUgb3RoZXIgZWxlbWVudHMgd2hvc2UgbWFyZ2lu
cyBhcmUgYmVpbmcgY29sbGFwc2VkLgorICAgICAgICBpZiAodmVydGljYWxNYXJnaW4uY29sbGFw
c2VkVmFsdWVzLmlzQ29sbGFwc2VkVGhyb3VnaCkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGVs
ZW1lbnQncyBtYXJnaW5zIGFyZSBjb2xsYXBzZWQgd2l0aCBpdHMgcGFyZW50J3MgdG9wIG1hcmdp
biwgdGhlIHRvcCBib3JkZXIgZWRnZSBvZiB0aGUgYm94IGlzIGRlZmluZWQgdG8gYmUgdGhlIHNh
bWUgYXMgdGhlIHBhcmVudCdzLgorICAgICAgICAgICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFy
Z2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBjb250YWluaW5nQmxvY2tDb250ZW50Qm94VG9wOworICAgICAg
ICAgICAgLy8gT3RoZXJ3aXNlLCBlaXRoZXIgdGhlIGVsZW1lbnQncyBwYXJlbnQgaXMgbm90IHRh
a2luZyBwYXJ0IGluIHRoZSBtYXJnaW4gY29sbGFwc2luZywgb3Igb25seSB0aGUgcGFyZW50J3Mg
Ym90dG9tIG1hcmdpbiBpcyBpbnZvbHZlZC4KKyAgICAgICAgICAgIC8vIFRoZSBwb3NpdGlvbiBv
ZiB0aGUgZWxlbWVudCdzIHRvcCBib3JkZXIgZWRnZSBpcyB0aGUgc2FtZSBhcyBpdCB3b3VsZCBo
YXZlIGJlZW4gaWYgdGhlIGVsZW1lbnQgaGFkIGEgbm9uLXplcm8gYm90dG9tIGJvcmRlci4KKyAg
ICAgICAgICAgIGF1dG8gYmVmb3JlTWFyZ2luV2l0aEJvdHRvbUJvcmRlciA9IG1hcmdpbkNvbGxh
cHNlKCkubWFyZ2luQmVmb3JlSWdub3JpbmdDb2xsYXBzaW5nVGhyb3VnaChsYXlvdXRCb3gsIHZl
cnRpY2FsTWFyZ2luLm5vbkNvbGxhcHNlZFZhbHVlcyk7CisgICAgICAgICAgICByZXR1cm4gY29u
dGFpbmluZ0Jsb2NrQ29udGVudEJveFRvcCArIGJlZm9yZU1hcmdpbldpdGhCb3R0b21Cb3JkZXI7
CisgICAgICAgIH0KKyAgICAgICAgLy8gTm9uLWNvbGxhcHNlZCB0aHJvdWdoIGJveCB2ZXJ0aWNh
bCBwb3NpdGlvbiBkZXBlbmRpbmcgd2hldGhlciB0aGUgbWFyZ2luIGNvbGxhcHNlcy4KKyAgICAg
ICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1h
cmdpbkJlZm9yZShsYXlvdXRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9j
a0NvbnRlbnRCb3hUb3A7CisKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRC
b3hUb3AgKyBtYXJnaW5CZWZvcmUodmVydGljYWxNYXJnaW4pOworICAgIH0KKyAgICAvLyBBdCB0
aGlzIHBvaW50IHRoaXMgYm94IGluZGlyZWN0bHkgKHZpYSBjb2xsYXBzZWQgdGhyb3VnaCBwcmV2
aW91cyBpbi1mbG93IHNpYmxpbmdzKSBhZGpvaW5zIHRoZSBwYXJlbnQuIExldCdzIGNoZWNrIGlm
IGl0IG1hcmdpbiBjb2xsYXBzZXMgd2l0aCB0aGUgcGFyZW50LgorICAgIGF1dG8mIGNvbnRhaW5p
bmdCbG9jayA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsKKyAgICBBU1NFUlQoY29udGFp
bmluZ0Jsb2NrLmZpcnN0SW5GbG93Q2hpbGQoKSk7CisgICAgQVNTRVJUKGNvbnRhaW5pbmdCbG9j
ay5maXJzdEluRmxvd0NoaWxkKCkgIT0gJmxheW91dEJveCk7CisgICAgaWYgKG1hcmdpbkNvbGxh
cHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZSgqY29udGFp
bmluZ0Jsb2NrLmZpcnN0SW5GbG93Q2hpbGQoKSkpCisgICAgICAgIHJldHVybiBjb250YWluaW5n
QmxvY2tDb250ZW50Qm94VG9wOworCisgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRC
b3hUb3AgKyBtYXJnaW5CZWZvcmUodmVydGljYWxNYXJnaW4pOworfQorCit9Cit9CisKKyNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9i
bG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5n
Q29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjYzZDk5NjkzZTg3Y2QwYjBmMTMyZWFjNzEzNjkwZTBiNzA1
MmUxMjkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgKQEAgLTAs
MCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUu
aCIKKyNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFw
Lmg+CisjaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K2NsYXNzIExheW91dFVuaXQ7CisKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBCb3g7Citj
bGFzcyBGbG9hdGluZ0NvbnRleHQ7CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbGF5
b3V0IGxvZ2ljIGZvciBibG9jayBmb3JtYXR0aW5nIGNvbnRleHRzLgorLy8gaHR0cHM6Ly93d3cu
dzMub3JnL1RSL0NTUzIyL3Zpc3VyZW4uaHRtbCNibG9jay1mb3JtYXR0aW5nCitjbGFzcyBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0IHsKKyAgICBXVEZf
TUFLRV9JU09fQUxMT0NBVEVEKEJsb2NrRm9ybWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAg
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29u
dGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJik7CisKKyAgICB2b2lkIGxheW91dEluRmxv
d0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0Nv
bnRlbnQmKSBvdmVycmlkZTsKKyAgICBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29u
c3Qgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzdHJ1Y3QgQ29uc3RyYWludHNQYWlyIHsK
KyAgICAgICAgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IGZvcm1hdHRpbmdDb250ZXh0Um9v
dDsKKyAgICAgICAgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IGNvbnRhaW5pbmdCbG9jazsK
KyAgICB9OworICAgIHZvaWQgcGxhY2VJbkZsb3dQb3NpdGlvbmVkQ2hpbGRyZW4oY29uc3QgQ29u
dGFpbmVyQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7CisKKyAgICB2b2lkIGNv
bXB1dGVXaWR0aEFuZE1hcmdpbihjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBCb3gmLCBj
b25zdCBDb25zdHJhaW50c1BhaXImKTsKKyAgICB2b2lkIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW4o
Y29uc3QgQm94JiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jik7CisKKyAgICB2
b2lkIGNvbXB1dGVTdGF0aWNIb3Jpem9udGFsUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJik7CisgICAgdm9pZCBjb21wdXRlU3RhdGljVmVydGljYWxQb3Np
dGlvbihjb25zdCBCb3gmLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJik7CisgICAgdm9pZCBj
b21wdXRlUG9zaXRpb25Ub0F2b2lkRmxvYXRzKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0
IEJveCYsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYpOworICAgIHZvaWQgY29tcHV0ZVZlcnRpY2Fs
UG9zaXRpb25Gb3JGbG9hdENsZWFyKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0IEJveCYp
OworCisgICAgdm9pZCBwcmVjb21wdXRlVmVydGljYWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9y
cyhjb25zdCBCb3gmLCBjb25zdCBDb25zdHJhaW50c1BhaXImKTsKKworICAgIEludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJp
ZGU7CisKKyAgICBMYXlvdXRVbml0IHZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGNvbnN0IEJv
eCYsIGNvbnN0IFVzZWRWZXJ0aWNhbE1hcmdpbiYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMm
KSBjb25zdDsKKworICAgIC8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBwb3NpdGlvbmluZyBhbmQg
c2l6aW5nIGZvciBib3hlcyBwYXJ0aWNpcGF0aW5nIGluIGEgYmxvY2sgZm9ybWF0dGluZyBjb250
ZXh0LgorICAgIGNsYXNzIEdlb21ldHJ5IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeSB7CisgICAgcHVibGljOgorICAgICAgICBHZW9tZXRyeShjb25zdCBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0Jik7CisKKyAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBpbkZsb3dDb250
ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpOworICAgICAgICBDb250ZW50V2lk
dGhBbmRNYXJnaW4gaW5GbG93Q29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0
IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVz
Jik7CisKKyAgICAgICAgUG9pbnQgc3RhdGljUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYpIGNvbnN0Owor
ICAgICAgICBMYXlvdXRVbml0IHN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiwgY29u
c3QgVmVydGljYWxDb25zdHJhaW50cyYpIGNvbnN0OworICAgICAgICBMYXlvdXRVbml0IHN0YXRp
Y0hvcml6b250YWxQb3NpdGlvbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmKSBjb25zdDsKKworICAgICAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMoY29uc3QgQm94Jik7CisKKyAgICAgICAgQ29udGVudFdpZHRoQW5k
TWFyZ2luIGNvbXB1dGVkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYsIE9wdGlvbmFsPExheW91dFVuaXQ+IGF2YWlsYWJsZVdpZHRo
RmxvYXRBdm9pZGVyKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIENvbnRlbnRIZWlnaHRBbmRN
YXJnaW4gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZh
bHVlcyYpOworICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gaW5GbG93Tm9uUmVwbGFjZWRD
b250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKyAgICAgICAgQ29udGVu
dFdpZHRoQW5kTWFyZ2luIGluRmxvd1JlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0
IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJp
ZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKworICAgICAgICBjb25zdCBCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Zm9ybWF0dGlu
Z0NvbnRleHQoKSk7IH0KKyAgICB9OworICAgIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMpOyB9CisKKyAgICAv
LyBUaGlzIGNsYXNzIGltcGxlbWVudHMgbWFyZ2luIGNvbGxhcHNpbmcgZm9yIGJsb2NrIGZvcm1h
dHRpbmcgY29udGV4dC4KKyAgICBjbGFzcyBNYXJnaW5Db2xsYXBzZSB7CisgICAgcHVibGljOgor
ICAgICAgICBVc2VkVmVydGljYWxNYXJnaW4gY29sbGFwc2VkVmVydGljYWxWYWx1ZXMoY29uc3Qg
Qm94JiwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpOworCisgICAgICAg
IFByZWNvbXB1dGVkTWFyZ2luQmVmb3JlIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJv
eCYsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsKKyAgICAgICAgTGF5
b3V0VW5pdCBtYXJnaW5CZWZvcmVJZ25vcmluZ0NvbGxhcHNpbmdUaHJvdWdoKGNvbnN0IEJveCYs
IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsKKyAgICAgICAgc3RhdGlj
IHZvaWQgdXBkYXRlTWFyZ2luQWZ0ZXJGb3JQcmV2aW91c1NpYmxpbmcoQmxvY2tGb3JtYXR0aW5n
Q29udGV4dCYsIGNvbnN0IE1hcmdpbkNvbGxhcHNlJiwgY29uc3QgQm94Jik7CisKKyAgICAgICAg
Ym9vbCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJv
eCYpIGNvbnN0OworICAgICAgICBib29sIG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdElu
Rmxvd0NoaWxkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OworICAgICAgICBib29sIG1h
cmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmKSBjb25z
dDsKKyAgICAgICAgYm9vbCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5n
TWFyZ2luQWZ0ZXIoY29uc3QgQm94JikgY29uc3Q7CisKKyAgICAgICAgYm9vbCBtYXJnaW5BZnRl
ckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmKSBjb25zdDsKKyAgICAg
ICAgYm9vbCBtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhMYXN0SW5GbG93Q2hpbGRNYXJnaW5BZnRl
cihjb25zdCBCb3gmKSBjb25zdDsKKyAgICAgICAgYm9vbCBtYXJnaW5BZnRlckNvbGxhcHNlc1dp
dGhQYXJlbnRNYXJnaW5CZWZvcmUoY29uc3QgQm94JikgY29uc3Q7CisgICAgICAgIGJvb2wgbWFy
Z2luQWZ0ZXJDb2xsYXBzZXNXaXRoTmV4dFNpYmxpbmdNYXJnaW5CZWZvcmUoY29uc3QgQm94Jikg
Y29uc3Q7CisgICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoU2libGluZ01hcmdp
bkJlZm9yZVdpdGhDbGVhcmFuY2UoY29uc3QgQm94JikgY29uc3Q7CisKKyAgICAgICAgYm9vbCBt
YXJnaW5zQ29sbGFwc2VUaHJvdWdoKGNvbnN0IEJveCYpIGNvbnN0OworCisgICAgcHJpdmF0ZToK
KyAgICAgICAgZnJpZW5kIGNsYXNzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ7CisgICAgICAgIE1h
cmdpbkNvbGxhcHNlKGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsKKworICAgICAgICBl
bnVtIGNsYXNzIE1hcmdpblR5cGUgeyBCZWZvcmUsIEFmdGVyIH07CisgICAgICAgIFVzZWRWZXJ0
aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBwb3NpdGl2ZU5lZ2F0
aXZlVmFsdWVzKGNvbnN0IEJveCYsIE1hcmdpblR5cGUpIGNvbnN0OworICAgICAgICBVc2VkVmVy
dGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcG9zaXRpdmVOZWdh
dGl2ZU1hcmdpbkJlZm9yZShjb25zdCBCb3gmLCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxh
cHNlZFZhbHVlcykgY29uc3Q7CisgICAgICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVB
bmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBwb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQWZ0ZXIoY29uc3Qg
Qm94JiwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0OworCisg
ICAgICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVl
cyBwcmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUoY29uc3QgQm94JiwgVXNl
ZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0OworICAgICAgICBVc2Vk
VmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcHJlY29tcHV0
ZWRQb3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKGNvbnN0IEJveCYpIGNvbnN0OworCisgICAgICAgIFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBjb21wdXRl
ZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4oVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFu
ZE5lZ2F0aXZlUGFpcjo6VmFsdWVzLCBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVn
YXRpdmVQYWlyOjpWYWx1ZXMpIGNvbnN0OworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBt
YXJnaW5WYWx1ZShVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpW
YWx1ZXMpIGNvbnN0OworCisgICAgICAgIGJvb2wgaGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYpIGNv
bnN0OworCisgICAgICAgIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIHsgcmV0dXJuIG1fYmxv
Y2tGb3JtYXR0aW5nQ29udGV4dC5sYXlvdXRTdGF0ZSgpOyB9CisgICAgICAgIGNvbnN0IExheW91
dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tGb3JtYXR0aW5nQ29u
dGV4dC5sYXlvdXRTdGF0ZSgpOyB9CisgICAgICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja0Zvcm1hdHRpbmdD
b250ZXh0OyB9CisKKyAgICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgbV9ibG9j
a0Zvcm1hdHRpbmdDb250ZXh0OworICAgIH07CisgICAgTWFyZ2luQ29sbGFwc2UgbWFyZ2luQ29s
bGFwc2UoKSBjb25zdCB7IHJldHVybiBNYXJnaW5Db2xsYXBzZSgqdGhpcyk7IH0KKworICAgIGNs
YXNzIFF1aXJrcyA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzIHsKKyAgICBwdWJs
aWM6CisgICAgICAgIFF1aXJrcyhjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Jik7CisKKyAg
ICAgICAgYm9vbCBuZWVkc1N0cmV0Y2hpbmcoY29uc3QgQm94JikgY29uc3Q7CisgICAgICAgIExh
eW91dFVuaXQgc3RyZXRjaGVkSW5GbG93SGVpZ2h0KGNvbnN0IEJveCYsIENvbnRlbnRIZWlnaHRB
bmRNYXJnaW4pOworCisgICAgICAgIGJvb2wgc2hvdWxkSWdub3JlQ29sbGFwc2VkUXVpcmtNYXJn
aW4oY29uc3QgQm94JikgY29uc3Q7CisgICAgICAgIGJvb2wgc2hvdWxkQ29sbGFwc2VNYXJnaW5C
ZWZvcmVXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OworICAgICAgICBi
b29sIHNob3VsZENvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3Qg
Qm94JikgY29uc3Q7CisKKyAgICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgZm9y
bWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0PihGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpmb3JtYXR0aW5nQ29udGV4dCgpKTsg
fQorICAgICAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgpIGNv
bnN0IHsgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnkoKTsgfQorCisgICAgfTsK
KyAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1
cm4gUXVpcmtzKCp0aGlzKTsgfQorCisgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZEF2YWls
YWJsZVdpZHRoRm9yRmxvYXRBdm9pZGVyKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0IEJv
eCYsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYpOworCisgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5n
U3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEJsb2NrRm9y
bWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9Cisg
ICAgQmxvY2tGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIGRvd25j
YXN0PEJsb2NrRm9ybWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0
YXRlKCkpOyB9CisKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIHZvaWQgc2V0UHJlY29tcHV0ZWRN
YXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IFByZWNvbXB1dGVkTWFyZ2lu
QmVmb3JlJiBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZSkgeyBtX3ByZWNvbXB1dGVkTWFyZ2luQmVm
b3JlTGlzdC5zZXQoJmxheW91dEJveCwgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUpOyB9CisgICAg
UHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoY29uc3QgQm94
JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmVMaXN0
LmdldCgmbGF5b3V0Qm94KTsgfQorICAgIGJvb2wgaGFzUHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUo
Y29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fcHJlY29tcHV0ZWRNYXJnaW5C
ZWZvcmVMaXN0LmNvbnRhaW5zKCZsYXlvdXRCb3gpOyB9CisjZW5kaWYKK3ByaXZhdGU6CisgICAg
SGFzaE1hcDxjb25zdCBCb3gqLCBQcmVjb21wdXRlZE1hcmdpbkJlZm9yZT4gbV9wcmVjb21wdXRl
ZE1hcmdpbkJlZm9yZUxpc3Q7Cit9OworCitpbmxpbmUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6
R2VvbWV0cnk6Okdlb21ldHJ5KGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2NrRm9y
bWF0dGluZ0NvbnRleHQpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkoYmxvY2tG
b3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworaW5saW5lIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
OlF1aXJrczo6UXVpcmtzKGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2NrRm9ybWF0
dGluZ0NvbnRleHQpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzKGJsb2NrRm9ybWF0
dGluZ0NvbnRleHQpCit7Cit9CisKK2lubGluZSBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJn
aW5Db2xsYXBzZTo6TWFyZ2luQ29sbGFwc2UoY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYg
YmxvY2tGb3JtYXR0aW5nQ29udGV4dCkKKyAgICA6IG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4dChi
bG9ja0Zvcm1hdHRpbmdDb250ZXh0KQoreworfQorCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9U
UkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LCBp
c0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zv
cm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dEdlb21l
dHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi4wYTFhMmI0MTZjNjdkZTVmMjQ1ZDUyYzE1ZGI2MzQzNThkY2Ni
NWIxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNw
cApAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZP
Uk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCisj
aW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5n
U3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91
dENoaWxkSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSAi
TGF5b3V0SW5pdGlhbENvbnRhaW5pbmdCbG9jay5oIgorI2luY2x1ZGUgIkxheW91dFJlcGxhY2Vk
Qm94LmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJl
YW0uaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0NvbnRl
bnRIZWlnaHRBbmRNYXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxv
d05vblJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwg
Y29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0
IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKQorewor
ICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRC
b3goKSk7CisgICAgQVNTRVJUKGxheW91dEJveC5pc092ZXJmbG93VmlzaWJsZSgpKTsKKworICAg
IGF1dG8gY29tcHV0ZSA9IFsmXShjb25zdCBhdXRvJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMp
IC0+IENvbnRlbnRIZWlnaHRBbmRNYXJnaW4geworCisgICAgICAgIC8vIDEwLjYuMyBCbG9jay1s
ZXZlbCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgd2hlbiAnb3ZlcmZsb3cn
IGNvbXB1dGVzIHRvICd2aXNpYmxlJworICAgICAgICAvLworICAgICAgICAvLyBJZiAnbWFyZ2lu
LXRvcCcsIG9yICdtYXJnaW4tYm90dG9tJyBhcmUgJ2F1dG8nLCB0aGVpciB1c2VkIHZhbHVlIGlz
IDAuCisgICAgICAgIC8vIElmICdoZWlnaHQnIGlzICdhdXRvJywgdGhlIGhlaWdodCBkZXBlbmRz
IG9uIHdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIGFueSBibG9jay1sZXZlbCBjaGlsZHJlbiBhbmQg
d2hldGhlciBpdCBoYXMgcGFkZGluZyBvciBib3JkZXJzOgorICAgICAgICAvLyBUaGUgZWxlbWVu
dCdzIGhlaWdodCBpcyB0aGUgZGlzdGFuY2UgZnJvbSBpdHMgdG9wIGNvbnRlbnQgZWRnZSB0byB0
aGUgZmlyc3QgYXBwbGljYWJsZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAvLyAxLiB0aGUg
Ym90dG9tIGVkZ2Ugb2YgdGhlIGxhc3QgbGluZSBib3gsIGlmIHRoZSBib3ggZXN0YWJsaXNoZXMg
YSBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0IHdpdGggb25lIG9yIG1vcmUgbGluZXMKKyAgICAg
ICAgLy8gMi4gdGhlIGJvdHRvbSBlZGdlIG9mIHRoZSBib3R0b20gKHBvc3NpYmx5IGNvbGxhcHNl
ZCkgbWFyZ2luIG9mIGl0cyBsYXN0IGluLWZsb3cgY2hpbGQsIGlmIHRoZSBjaGlsZCdzIGJvdHRv
bSBtYXJnaW4KKyAgICAgICAgLy8gICAgZG9lcyBub3QgY29sbGFwc2Ugd2l0aCB0aGUgZWxlbWVu
dCdzIGJvdHRvbSBtYXJnaW4KKyAgICAgICAgLy8gMy4gdGhlIGJvdHRvbSBib3JkZXIgZWRnZSBv
ZiB0aGUgbGFzdCBpbi1mbG93IGNoaWxkIHdob3NlIHRvcCBtYXJnaW4gZG9lc24ndCBjb2xsYXBz
ZSB3aXRoIHRoZSBlbGVtZW50J3MgYm90dG9tIG1hcmdpbgorICAgICAgICAvLyA0LiB6ZXJvLCBv
dGhlcndpc2UKKyAgICAgICAgLy8gT25seSBjaGlsZHJlbiBpbiB0aGUgbm9ybWFsIGZsb3cgYXJl
IHRha2VuIGludG8gYWNjb3VudCAoaS5lLiwgZmxvYXRpbmcgYm94ZXMgYW5kIGFic29sdXRlbHkg
cG9zaXRpb25lZCBib3hlcyBhcmUgaWdub3JlZCwKKyAgICAgICAgLy8gYW5kIHJlbGF0aXZlbHkg
cG9zaXRpb25lZCBib3hlcyBhcmUgY29uc2lkZXJlZCB3aXRob3V0IHRoZWlyIG9mZnNldCkuIE5v
dGUgdGhhdCB0aGUgY2hpbGQgYm94IG1heSBiZSBhbiBhbm9ueW1vdXMgYmxvY2sgYm94LgorCisg
ICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZv
ckJveChsYXlvdXRCb3gpOworICAgICAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBH
ZW9tZXRyeTo6Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cyk7CisgICAgICAgIGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0gVXNlZFZlcnRpY2Fs
TWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgeyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9y
ZS52YWx1ZU9yKDApLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsg
CisgICAgICAgIGF1dG8gYm9yZGVyQW5kUGFkZGluZ1RvcCA9IGJveEdlb21ldHJ5LmJvcmRlclRv
cCgpICsgYm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCk7CisgICAgICAgIGF1dG8g
aGVpZ2h0ID0gb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0
aWNhbFZhbHVlcy5oZWlnaHQudmFsdWUoKSA6IGNvbXB1dGVkSGVpZ2h0KGxheW91dEJveCk7CisK
KyAgICAgICAgaWYgKGhlaWdodCkKKyAgICAgICAgICAgIHJldHVybiB7ICpoZWlnaHQsIG5vbkNv
bGxhcHNlZE1hcmdpbiB9OworCisgICAgICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRC
b3gpIHx8ICFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQo
KSkKKyAgICAgICAgICAgIHJldHVybiB7IDAsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OworCisgICAg
ICAgIC8vIDEuIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgbGFzdCBsaW5lIGJveCwgaWYgdGhlIGJv
eCBlc3RhYmxpc2hlcyBhIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgd2l0aCBvbmUgb3IgbW9y
ZSBsaW5lcworICAgICAgICBhdXRvJiBsYXlvdXRDb250YWluZXIgPSBkb3duY2FzdDxDb250YWlu
ZXJCb3g+KGxheW91dEJveCk7CisgICAgICAgIGlmIChsYXlvdXRDb250YWluZXIuZXN0YWJsaXNo
ZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7CisgICAgICAgICAgICBhdXRvJiBpbmxpbmVG
b3JtYXR0aW5nU3RhdGUgPSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkSW5saW5lRm9ybWF0dGlu
Z1N0YXRlKGxheW91dENvbnRhaW5lcik7CisgICAgICAgICAgICBhdXRvJiBsaW5lcyA9IGlubGlu
ZUZvcm1hdHRpbmdTdGF0ZS5saW5lcygpOworICAgICAgICAgICAgLy8gRXZlbiBlbXB0eSBjb250
YWluZXJzIGdlbmVyYXRlIG9uZSBsaW5lLiAKKyAgICAgICAgICAgIEFTU0VSVCghbGluZXMuaXNF
bXB0eSgpKTsKKyAgICAgICAgICAgIHJldHVybiB7IHRvTGF5b3V0VW5pdChsaW5lcy5sYXN0KCku
bGluZUJveExvZ2ljYWxSZWN0KCkuYm90dG9tKCkgKyBpbmxpbmVGb3JtYXR0aW5nU3RhdGUuY2xl
YXJHYXBBZnRlckxhc3RMaW5lKCkpIC0gYm9yZGVyQW5kUGFkZGluZ1RvcCwgbm9uQ29sbGFwc2Vk
TWFyZ2luIH07CisgICAgICAgIH0KKworICAgICAgICAvLyAyLiB0aGUgYm90dG9tIGVkZ2Ugb2Yg
dGhlIGJvdHRvbSAocG9zc2libHkgY29sbGFwc2VkKSBtYXJnaW4gb2YgaXRzIGxhc3QgaW4tZmxv
dyBjaGlsZCwgaWYgdGhlIGNoaWxkJ3MgYm90dG9tIG1hcmdpbi4uLgorICAgICAgICBhdXRvJiBs
YXN0SW5GbG93Q2hpbGQgPSAqbGF5b3V0Q29udGFpbmVyLmxhc3RJbkZsb3dDaGlsZCgpOworICAg
ICAgICBpZiAoIWZvcm1hdHRpbmdDb250ZXh0KCkubWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5BZnRl
ckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihsYXN0SW5GbG93Q2hpbGQpKSB7CisgICAg
ICAgICAgICBhdXRvJiBsYXN0SW5GbG93Qm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgp
Lmdlb21ldHJ5Rm9yQm94KGxhc3RJbkZsb3dDaGlsZCk7CisgICAgICAgICAgICBhdXRvIGJvdHRv
bUVkZ2VPZkJvdHRvbU1hcmdpbiA9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGxhc3RJbkZs
b3dCb3hHZW9tZXRyeSkuYm90dG9tKCkgKyBsYXN0SW5GbG93Qm94R2VvbWV0cnkubWFyZ2luQWZ0
ZXIoKTsKKyAgICAgICAgICAgIHJldHVybiB7IGJvdHRvbUVkZ2VPZkJvdHRvbU1hcmdpbiAtIGJv
cmRlckFuZFBhZGRpbmdUb3AsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OworICAgICAgICB9CisKKyAg
ICAgICAgLy8gMy4gdGhlIGJvdHRvbSBib3JkZXIgZWRnZSBvZiB0aGUgbGFzdCBpbi1mbG93IGNo
aWxkIHdob3NlIHRvcCBtYXJnaW4gZG9lc24ndCBjb2xsYXBzZSB3aXRoIHRoZSBlbGVtZW50J3Mg
Ym90dG9tIG1hcmdpbgorICAgICAgICBhdXRvKiBpbkZsb3dDaGlsZCA9ICZsYXN0SW5GbG93Q2hp
bGQ7CisgICAgICAgIHdoaWxlIChpbkZsb3dDaGlsZCAmJiBmb3JtYXR0aW5nQ29udGV4dCgpLm1h
cmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVy
KCppbkZsb3dDaGlsZCkpCisgICAgICAgICAgICBpbkZsb3dDaGlsZCA9IGluRmxvd0NoaWxkLT5w
cmV2aW91c0luRmxvd1NpYmxpbmcoKTsKKyAgICAgICAgaWYgKGluRmxvd0NoaWxkKSB7CisgICAg
ICAgICAgICBhdXRvJiBpbkZsb3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2Vv
bWV0cnlGb3JCb3goKmluRmxvd0NoaWxkKTsKKyAgICAgICAgICAgIHJldHVybiB7IEJveEdlb21l
dHJ5Ojpib3JkZXJCb3hUb3AoaW5GbG93Qm94R2VvbWV0cnkpICsgaW5GbG93Qm94R2VvbWV0cnku
Ym9yZGVyQm94KCkuaGVpZ2h0KCkgLSBib3JkZXJBbmRQYWRkaW5nVG9wLCBub25Db2xsYXBzZWRN
YXJnaW4gfTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDQuIHplcm8sIG90aGVyd2lzZQorICAg
ICAgICByZXR1cm4geyAwLCBub25Db2xsYXBzZWRNYXJnaW4gfTsKKyAgICB9OworCisgICAgLy8g
MTAuNi43ICdBdXRvJyBoZWlnaHRzIGZvciBibG9jay1sZXZlbCBmb3JtYXR0aW5nIGNvbnRleHQg
Ym94ZXMuCisgICAgYXV0byBpc0F1dG9IZWlnaHQgPSAhb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVz
LmhlaWdodCAmJiAhY29tcHV0ZWRIZWlnaHQobGF5b3V0Qm94KTsKKyAgICBpZiAoaXNBdXRvSGVp
Z2h0ICYmIChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpICYmICFsYXlv
dXRCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSkKKyAgICAgICAgcmV0
dXJuIGNvbXB1dGUoIE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyB7IGNvbnRlbnRIZWlnaHRGb3JG
b3JtYXR0aW5nQ29udGV4dFJvb3QoZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpKSB9
KTsKKyAgICByZXR1cm4gY29tcHV0ZShvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworfQorCitD
b250ZW50V2lkdGhBbmRNYXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Omlu
Rmxvd05vblJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29u
c3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVz
KQoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7CisKKyAgICBhdXRvIGNvbXB1
dGUgPSBbJl0oKSB7CisKKyAgICAgICAgLy8gMTAuMy4zIEJsb2NrLWxldmVsLCBub24tcmVwbGFj
ZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGZv
bGxvd2luZyBjb25zdHJhaW50cyBtdXN0IGhvbGQgYW1vbmcgdGhlIHVzZWQgdmFsdWVzIG9mIHRo
ZSBvdGhlciBwcm9wZXJ0aWVzOgorICAgICAgICAvLyAnbWFyZ2luLWxlZnQnICsgJ2JvcmRlci1s
ZWZ0LXdpZHRoJyArICdwYWRkaW5nLWxlZnQnICsgJ3dpZHRoJyArICdwYWRkaW5nLXJpZ2h0JyAr
ICdib3JkZXItcmlnaHQtd2lkdGgnICsgJ21hcmdpbi1yaWdodCcgPSB3aWR0aCBvZiBjb250YWlu
aW5nIGJsb2NrCisgICAgICAgIC8vCisgICAgICAgIC8vIDEuIElmICd3aWR0aCcgaXMgbm90ICdh
dXRvJyBhbmQgJ2JvcmRlci1sZWZ0LXdpZHRoJyArICdwYWRkaW5nLWxlZnQnICsgJ3dpZHRoJyAr
ICdwYWRkaW5nLXJpZ2h0JyArICdib3JkZXItcmlnaHQtd2lkdGgnIAorICAgICAgICAvLyAgICAo
cGx1cyBhbnkgb2YgJ21hcmdpbi1sZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyB0aGF0IGFyZSBub3Qg
J2F1dG8nKSBpcyBsYXJnZXIgdGhhbiB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2ss
IHRoZW4KKyAgICAgICAgLy8gICAgYW55ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tbGVmdCcg
b3IgJ21hcmdpbi1yaWdodCcgYXJlLCBmb3IgdGhlIGZvbGxvd2luZyBydWxlcywgdHJlYXRlZCBh
cyB6ZXJvLgorICAgICAgICAvLworICAgICAgICAvLyAyLiBJZiBhbGwgb2YgdGhlIGFib3ZlIGhh
dmUgYSBjb21wdXRlZCB2YWx1ZSBvdGhlciB0aGFuICdhdXRvJywgdGhlIHZhbHVlcyBhcmUgc2Fp
ZCB0byBiZSAib3Zlci1jb25zdHJhaW5lZCIgYW5kIG9uZSBvZiB0aGUgdXNlZCB2YWx1ZXMgd2ls
bAorICAgICAgICAvLyAgICBoYXZlIHRvIGJlIGRpZmZlcmVudCBmcm9tIGl0cyBjb21wdXRlZCB2
YWx1ZS4gSWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBjb250YWluaW5nIGJsb2Nr
IGhhcyB0aGUgdmFsdWUgJ2x0cicsIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAgICAgICAgLy8gICAg
b2YgJ21hcmdpbi1yaWdodCcgaXMgaWdub3JlZCBhbmQgdGhlIHZhbHVlIGlzIGNhbGN1bGF0ZWQg
c28gYXMgdG8gbWFrZSB0aGUgZXF1YWxpdHkgdHJ1ZS4gSWYgdGhlIHZhbHVlIG9mICdkaXJlY3Rp
b24nIGlzICdydGwnLAorICAgICAgICAvLyAgICB0aGlzIGhhcHBlbnMgdG8gJ21hcmdpbi1sZWZ0
JyBpbnN0ZWFkLgorICAgICAgICAvLworICAgICAgICAvLyAzLiBJZiB0aGVyZSBpcyBleGFjdGx5
IG9uZSB2YWx1ZSBzcGVjaWZpZWQgYXMgJ2F1dG8nLCBpdHMgdXNlZCB2YWx1ZSBmb2xsb3dzIGZy
b20gdGhlIGVxdWFsaXR5LgorICAgICAgICAvLworICAgICAgICAvLyA0LiBJZiAnd2lkdGgnIGlz
IHNldCB0byAnYXV0bycsIGFueSBvdGhlciAnYXV0bycgdmFsdWVzIGJlY29tZSAnMCcgYW5kICd3
aWR0aCcgZm9sbG93cyBmcm9tIHRoZSByZXN1bHRpbmcgZXF1YWxpdHkuCisgICAgICAgIC8vCisg
ICAgICAgIC8vIDUuIElmIGJvdGggJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgYXJl
ICdhdXRvJywgdGhlaXIgdXNlZCB2YWx1ZXMgYXJlIGVxdWFsLiBUaGlzIGhvcml6b250YWxseSBj
ZW50ZXJzIHRoZSBlbGVtZW50IHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICAgICAgLy8gICAgZWRn
ZXMgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2suCisKKyAgICAgICAgYXV0byBjb250YWluaW5nQmxv
Y2tXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7CisgICAgICAgIGF1
dG8mIGNvbnRhaW5pbmdCbG9ja1N0eWxlID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLnN0
eWxlKCk7CisgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5n
ZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOworCisgICAgICAgIGF1dG8gd2lkdGggPSBvdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0aCA/IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndp
ZHRoIDogY29tcHV0ZWRXaWR0aChsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKyAg
ICAgICAgYXV0byBjb21wdXRlZEhvcml6b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRI
b3Jpem9udGFsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICAg
ICAgVXNlZEhvcml6b250YWxNYXJnaW4gdXNlZEhvcml6b250YWxNYXJnaW47CisgICAgICAgIGF1
dG8gYm9yZGVyTGVmdCA9IGJveEdlb21ldHJ5LmJvcmRlckxlZnQoKTsKKyAgICAgICAgYXV0byBi
b3JkZXJSaWdodCA9IGJveEdlb21ldHJ5LmJvcmRlclJpZ2h0KCk7CisgICAgICAgIGF1dG8gcGFk
ZGluZ0xlZnQgPSBib3hHZW9tZXRyeS5wYWRkaW5nTGVmdCgpLnZhbHVlT3IoMCk7CisgICAgICAg
IGF1dG8gcGFkZGluZ1JpZ2h0ID0gYm94R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVPcigw
KTsKKworICAgICAgICAvLyAjMQorICAgICAgICBpZiAod2lkdGgpIHsKKyAgICAgICAgICAgIGF1
dG8gaG9yaXpvbnRhbFNwYWNlRm9yTWFyZ2luID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCkgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIGNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSk7CisgICAgICAgICAgICBpZiAoaG9yaXpv
bnRhbFNwYWNlRm9yTWFyZ2luIDwgMCkKKyAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1h
cmdpbiA9IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1
dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OworICAgICAgICB9CisKKyAgICAg
ICAgLy8gIzIKKyAgICAgICAgaWYgKHdpZHRoICYmIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5z
dGFydCAmJiBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7CisgICAgICAgICAgICBpZiAo
Y29udGFpbmluZ0Jsb2NrU3R5bGUuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSB7CisgICAgICAg
ICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSAqY29tcHV0ZWRIb3Jpem9udGFs
TWFyZ2luLnN0YXJ0OworICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9
IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9y
ZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmln
aHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRh
bE1hcmdpbi5lbmQgPSAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZDsKKyAgICAgICAgICAg
ICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0g
KGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRl
clJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorCisgICAgICAgIC8vICMzCisgICAgICAgIGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFy
Z2luLnN0YXJ0ICYmIHdpZHRoICYmIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKKyAg
ICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9ICpjb21wdXRlZEhvcml6b250YWxN
YXJnaW4uZW5kOworICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSBjb250
YWluaW5nQmxvY2tXaWR0aCAtIChib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgICsgKndpZHRoICsg
cGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwor
ICAgICAgICB9IGVsc2UgaWYgKGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiAhd2lk
dGggJiYgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgeworICAgICAgICAgICAgdXNlZEhv
cml6b250YWxNYXJnaW4gPSB7ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQsICpjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uZW5kIH07CisgICAgICAgICAgICB3aWR0aCA9IGNvbnRhaW5p
bmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCAr
IHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRh
bE1hcmdpbi5lbmQpOworICAgICAgICB9IGVsc2UgaWYgKGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdp
bi5zdGFydCAmJiB3aWR0aCAmJiAhY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgeworICAg
ICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSAqY29tcHV0ZWRIb3Jpem9udGFs
TWFyZ2luLnN0YXJ0OworICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gY29u
dGFpbmluZ0Jsb2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJM
ZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7
CisgICAgICAgIH0KKworICAgICAgICAvLyAjNAorICAgICAgICBpZiAoIXdpZHRoKSB7CisgICAg
ICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigw
KSB9OworICAgICAgICAgICAgd2lkdGggPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICh1c2VkSG9y
aXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHBhZGRpbmdS
aWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kKTsKKyAgICAgICAg
fQorCisgICAgICAgIC8vICM1CisgICAgICAgIGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LnN0YXJ0ICYmICFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7CisgICAgICAgICAgICBh
dXRvIGhvcml6b250YWxTcGFjZUZvck1hcmdpbiA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKGJv
cmRlckxlZnQgKyBwYWRkaW5nTGVmdCAgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJS
aWdodCk7CisgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgaG9yaXpvbnRhbFNw
YWNlRm9yTWFyZ2luIC8gMiwgaG9yaXpvbnRhbFNwYWNlRm9yTWFyZ2luIC8gMiB9OworICAgICAg
ICB9CisKKyAgICAgICAgYXV0byBzaG91bGRBcHBseUNlbnRlckFsaWduRm9yQmxvY2tDb250ZW50
ID0gY29udGFpbmluZ0Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gVGV4dEFsaWduTW9kZTo6V2Vi
S2l0Q2VudGVyICYmIChjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgfHwgY29tcHV0ZWRI
b3Jpem9udGFsTWFyZ2luLmVuZCk7CisgICAgICAgIGlmIChzaG91bGRBcHBseUNlbnRlckFsaWdu
Rm9yQmxvY2tDb250ZW50KSB7CisgICAgICAgICAgICBhdXRvIGJvcmRlckJveFdpZHRoID0gKGJv
cmRlckxlZnQgKyBwYWRkaW5nTGVmdCAgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJS
aWdodCk7CisgICAgICAgICAgICBhdXRvIG1hcmdpblN0YXJ0ID0gY29tcHV0ZWRIb3Jpem9udGFs
TWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCk7CisgICAgICAgICAgICBhdXRvIG1hcmdpbkVuZCA9IGNv
bXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKTsKKyAgICAgICAgICAgIGF1dG8g
Y2VudGVyZWRMb2dpY2FsTGVmdEZvck1hcmdpbkJveCA9IHN0ZDo6bWF4KChjb250YWluaW5nQmxv
Y2tXaWR0aCAtIGJvcmRlckJveFdpZHRoIC0gbWFyZ2luU3RhcnQgLSBtYXJnaW5FbmQpIC8gMiwg
MF9sdSk7CisgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNlbnRlcmVk
TG9naWNhbExlZnRGb3JNYXJnaW5Cb3ggKyBtYXJnaW5TdGFydDsKKyAgICAgICAgICAgIHVzZWRI
b3Jpem9udGFsTWFyZ2luLmVuZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gYm9yZGVyQm94V2lk
dGggLSBtYXJnaW5TdGFydCArIG1hcmdpbkVuZDsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlQo
d2lkdGgpOworCisgICAgICAgIHJldHVybiBDb250ZW50V2lkdGhBbmRNYXJnaW4geyAqd2lkdGgs
IHVzZWRIb3Jpem9udGFsTWFyZ2luIH07CisgICAgfTsKKworICAgIGF1dG8gY29udGVudFdpZHRo
QW5kTWFyZ2luID0gY29tcHV0ZSgpOworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29u
dGV4dExheW91dCwgc3RyZWFtIDw8ICJbV2lkdGhdW01hcmdpbl0gLT4gaW5mbG93IG5vbi1yZXBs
YWNlZCAtPiB3aWR0aCgiIDw8IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGggPDwg
InB4KSBtYXJnaW4oIiA8PCBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCA8
PCAicHgsICIgPDwgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIDw8ICJweCkg
LT4gbGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIpOworICAgIHJldHVybiBjb250ZW50
V2lkdGhBbmRNYXJnaW47Cit9CisKK0NvbnRlbnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93UmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4o
Y29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQoreworICAgIEFTU0VSVChyZXBsYWNlZEJv
eC5pc0luRmxvdygpKTsKKworICAgIC8vIDEwLjMuNCBCbG9jay1sZXZlbCwgcmVwbGFjZWQgZWxl
bWVudHMgaW4gbm9ybWFsIGZsb3cKKyAgICAvLworICAgIC8vIDEuIFRoZSB1c2VkIHZhbHVlIG9m
ICd3aWR0aCcgaXMgZGV0ZXJtaW5lZCBhcyBmb3IgaW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLgor
ICAgIC8vIDIuIFRoZW4gdGhlIHJ1bGVzIGZvciBub24tcmVwbGFjZWQgYmxvY2stbGV2ZWwgZWxl
bWVudHMgYXJlIGFwcGxpZWQgdG8gZGV0ZXJtaW5lIHRoZSBtYXJnaW5zLgorCisgICAgLy8gIzEK
KyAgICBhdXRvIHVzZWRXaWR0aCA9IGlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2lu
KHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlbkhvcml6
b250YWxWYWx1ZXMpLmNvbnRlbnRXaWR0aDsKKyAgICAvLyAjMgorICAgIGF1dG8gbm9uUmVwbGFj
ZWRXaWR0aEFuZE1hcmdpbiA9IGluRmxvd05vblJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2lu
KHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIE92ZXJyaWRkZW5Ib3Jpem9udGFs
VmFsdWVzIHsgdXNlZFdpZHRoLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy5tYXJnaW4gfSk7
CisKKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8
PCAiW1dpZHRoXVtNYXJnaW5dIC0+IGluZmxvdyByZXBsYWNlZCAtPiB3aWR0aCgiIDw8IHVzZWRX
aWR0aCAgPDwgInB4KSBtYXJnaW4oIiA8PCBub25SZXBsYWNlZFdpZHRoQW5kTWFyZ2luLnVzZWRN
YXJnaW4uc3RhcnQgPDwgInB4LCAiIDw8IG5vblJlcGxhY2VkV2lkdGhBbmRNYXJnaW4udXNlZE1h
cmdpbi5lbmQgPDwgInB4KSAtPiBsYXlvdXRCb3goIiA8PCAmcmVwbGFjZWRCb3ggPDwgIikiKTsK
KyAgICByZXR1cm4geyB1c2VkV2lkdGgsIG5vblJlcGxhY2VkV2lkdGhBbmRNYXJnaW4udXNlZE1h
cmdpbiB9OworfQorCitMYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5
OjpzdGF0aWNWZXJ0aWNhbFBvc2l0aW9uKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBWZXJ0
aWNhbENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzKSBjb25zdAoreworICAgIC8vIGh0
dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi92aXN1cmVuLmh0bWwjYmxvY2stZm9ybWF0dGluZwor
ICAgIC8vIEluIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0LCBib3hlcyBhcmUgbGFpZCBvdXQg
b25lIGFmdGVyIHRoZSBvdGhlciwgdmVydGljYWxseSwgYmVnaW5uaW5nIGF0IHRoZSB0b3Agb2Yg
YSBjb250YWluaW5nIGJsb2NrLgorICAgIC8vIFRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSBiZXR3ZWVu
IHR3byBzaWJsaW5nIGJveGVzIGlzIGRldGVybWluZWQgYnkgdGhlICdtYXJnaW4nIHByb3BlcnRp
ZXMuCisgICAgLy8gVmVydGljYWwgbWFyZ2lucyBiZXR3ZWVuIGFkamFjZW50IGJsb2NrLWxldmVs
IGJveGVzIGluIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IGNvbGxhcHNlLgorICAgIGlmIChh
dXRvKiBwcmV2aW91c0luRmxvd1NpYmxpbmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJs
aW5nKCkpIHsKKyAgICAgICAgYXV0byYgcHJldmlvdXNJbkZsb3dCb3hHZW9tZXRyeSA9IGZvcm1h
dHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goKnByZXZpb3VzSW5GbG93U2libGluZyk7Cisg
ICAgICAgIHJldHVybiBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChwcmV2aW91c0luRmxvd0Jv
eEdlb21ldHJ5KS5ib3R0b20oKSArIHByZXZpb3VzSW5GbG93Qm94R2VvbWV0cnkubWFyZ2luQWZ0
ZXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbFRvcDsK
K30KKworTGF5b3V0VW5pdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6c3RhdGlj
SG9yaXpvbnRhbFBvc2l0aW9uKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFs
Q29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICAvLyBodHRw
czovL3d3dy53My5vcmcvVFIvQ1NTMjIvdmlzdXJlbi5odG1sI2Jsb2NrLWZvcm1hdHRpbmcKKyAg
ICAvLyBJbiBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCwgZWFjaCBib3gncyBsZWZ0IG91dGVy
IGVkZ2UgdG91Y2hlcyB0aGUgbGVmdCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrIChmb3Ig
cmlnaHQtdG8tbGVmdCBmb3JtYXR0aW5nLCByaWdodCBlZGdlcyB0b3VjaCkuCisgICAgcmV0dXJu
IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsTGVmdCArIGZvcm1hdHRpbmdDb250ZXh0KCku
Z2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KS5tYXJnaW5TdGFydCgpOworfQorCitQb2ludCBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6c3RhdGljUG9zaXRpb24oY29uc3QgQm94JiBs
YXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzKSBjb25z
dAoreworICAgIHJldHVybiB7IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbihsYXlvdXRCb3gsIGhv
cml6b250YWxDb25zdHJhaW50cyksIHN0YXRpY1ZlcnRpY2FsUG9zaXRpb24obGF5b3V0Qm94LCB2
ZXJ0aWNhbENvbnN0cmFpbnRzKSB9OworfQorCitDb250ZW50SGVpZ2h0QW5kTWFyZ2luIEJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbkZsb3dDb250ZW50SGVpZ2h0QW5kTWFyZ2lu
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6
b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlk
ZGVuVmVydGljYWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpKTsK
KworICAgIC8vIDEwLjYuMiBJbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMsIGJsb2NrLWxldmVsIHJl
cGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93LCAnaW5saW5lLWJsb2NrJworICAgIC8vIHJl
cGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93IGFuZCBmbG9hdGluZyByZXBsYWNlZCBlbGVt
ZW50cworICAgIGlmIChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQorICAgICAgICByZXR1cm4g
aW5saW5lUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94
PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlblZlcnRp
Y2FsVmFsdWVzKTsKKworICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gY29udGVudEhlaWdodEFu
ZE1hcmdpbjsKKyAgICBpZiAobGF5b3V0Qm94LmlzT3ZlcmZsb3dWaXNpYmxlKCkgJiYgIWxheW91
dEJveC5pc0RvY3VtZW50Qm94KCkpIHsKKyAgICAgICAgLy8gVE9ETzogRmlndXJlIG91dCB0aGUg
Y2FzZSBmb3IgdGhlIGRvY3VtZW50IGVsZW1lbnQuIExldCdzIGp1c3QgY29tcGxpY2F0ZWQtY2Fz
ZSBpdCBmb3Igbm93LgorICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gaW5GbG93Tm9u
UmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0
cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAg
IC8vIDEwLjYuNiBDb21wbGljYXRlZCBjYXNlcworICAgICAgICAvLyBCbG9jay1sZXZlbCwgbm9u
LXJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93IHdoZW4gJ292ZXJmbG93JyBkb2VzIG5v
dCBjb21wdXRlIHRvICd2aXNpYmxlJyAoZXhjZXB0IGlmIHRoZSAnb3ZlcmZsb3cnIHByb3BlcnR5
J3MgdmFsdWUgaGFzIGJlZW4gcHJvcGFnYXRlZCB0byB0aGUgdmlld3BvcnQpLgorICAgICAgICBj
b250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29tcGxpY2F0ZWRDYXNlcyhsYXlvdXRCb3gsIGhvcml6
b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKKyAgICB9CisKKyAg
ICBhdXRvIHF1aXJrcyA9IGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCk7CisgICAgaWYgKCFx
dWlya3MubmVlZHNTdHJldGNoaW5nKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBjb250ZW50
SGVpZ2h0QW5kTWFyZ2luOworCisgICAgY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVp
Z2h0ID0gcXVpcmtzLnN0cmV0Y2hlZEluRmxvd0hlaWdodChsYXlvdXRCb3gsIGNvbnRlbnRIZWln
aHRBbmRNYXJnaW4pOworCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5
b3V0LCBzdHJlYW0gPDwgIltIZWlnaHRdW01hcmdpbl0gLT4gaW5mbG93IG5vbi1yZXBsYWNlZCAt
PiBzdHJlY2hlZCB0byB2aWV3cG9ydCAtPiBoZWlnaHQoIiA8PCBjb250ZW50SGVpZ2h0QW5kTWFy
Z2luLmNvbnRlbnRIZWlnaHQgPDwgInB4KSBtYXJnaW4oIiA8PCBjb250ZW50SGVpZ2h0QW5kTWFy
Z2luLm5vbkNvbGxhcHNlZE1hcmdpbi5iZWZvcmUgPDwgInB4LCAiIDw8IGNvbnRlbnRIZWlnaHRB
bmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmFmdGVyIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIg
PDwgJmxheW91dEJveCA8PCAiKSIpOworICAgIHJldHVybiBjb250ZW50SGVpZ2h0QW5kTWFyZ2lu
OworfQorCitDb250ZW50V2lkdGhBbmRNYXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnk6OmluRmxvd0NvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwg
Y29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0
IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykK
K3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5GbG93KCkpOworCisgICAgaWYgKCFsYXlvdXRC
b3guaXNSZXBsYWNlZEJveCgpKQorICAgICAgICByZXR1cm4gaW5GbG93Tm9uUmVwbGFjZWRDb250
ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJy
aWRkZW5Ib3Jpem9udGFsVmFsdWVzKTsKKyAgICByZXR1cm4gaW5GbG93UmVwbGFjZWRDb250ZW50
V2lkdGhBbmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250
YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOworfQorCitDb250ZW50
V2lkdGhBbmRNYXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVk
Q29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgT3B0aW9uYWw8TGF5b3V0VW5p
dD4gYXZhaWxhYmxlV2lkdGhGbG9hdEF2b2lkZXIpCit7CisgICAgYXV0byBjb21wdXRlID0gWyZd
IChhdXRvIGNvbnN0cmFpbnRzRm9yV2lkdGgsIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRXaWR0
aCkgeworICAgICAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCisgICAg
ICAgICAgICByZXR1cm4gZmxvYXRpbmdDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBj
b25zdHJhaW50c0ZvcldpZHRoLCB7IHVzZWRXaWR0aCwgeyB9IH0pOworCisgICAgICAgIGlmIChs
YXlvdXRCb3guaXNJbkZsb3coKSkKKyAgICAgICAgICAgIHJldHVybiBpbkZsb3dDb250ZW50V2lk
dGhBbmRNYXJnaW4obGF5b3V0Qm94LCBjb25zdHJhaW50c0ZvcldpZHRoLCB7IHVzZWRXaWR0aCwg
eyB9IH0pOworCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4g
Q29udGVudFdpZHRoQW5kTWFyZ2luIHsgfTsKKyAgICB9OworCisgICAgYXV0byBob3Jpem9udGFs
Q29uc3RyYWludHNGb3JXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50czsKKyAgICBpZiAobGF5
b3V0Qm94LnN0eWxlKCkubG9naWNhbFdpZHRoKCkuaXNBdXRvKCkgJiYgYXZhaWxhYmxlV2lkdGhG
bG9hdEF2b2lkZXIpIHsKKyAgICAgICAgLy8gV2hpbGUgdGhlIG5vbi1hdXRvIHdpZHRoIHZhbHVl
cyBzaG91bGQgYWxsIGJlIHJlc29sdmVkIGFnYWluc3QgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3
aWR0aCwgd2hlbgorICAgICAgICAvLyB0aGUgd2lkdGggaXMgYXV0byB0aGUgYXZhaWxhYmxlIGhv
cml6b250YWwgc3BhY2UgaXMgc2hydW5rIGJ5IG5laWdoYm9yaW5nIGZsb2F0cy4KKyAgICAgICAg
aG9yaXpvbnRhbENvbnN0cmFpbnRzRm9yV2lkdGgubG9naWNhbFdpZHRoID0gKmF2YWlsYWJsZVdp
ZHRoRmxvYXRBdm9pZGVyOworICAgIH0KKyAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9
IGNvbXB1dGUoaG9yaXpvbnRhbENvbnN0cmFpbnRzRm9yV2lkdGgsIHsgfSk7CisgICAgYXV0byBh
dmFpbGFibGVXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7CisgICAg
aWYgKGF1dG8gbWF4V2lkdGggPSBjb21wdXRlZE1heFdpZHRoKGxheW91dEJveCwgYXZhaWxhYmxl
V2lkdGgpKSB7CisgICAgICAgIGF1dG8gbWF4V2lkdGhBbmRNYXJnaW4gPSBjb21wdXRlKGhvcml6
b250YWxDb25zdHJhaW50cywgbWF4V2lkdGgpOworICAgICAgICBpZiAoY29udGVudFdpZHRoQW5k
TWFyZ2luLmNvbnRlbnRXaWR0aCA+IG1heFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkKKyAg
ICAgICAgICAgIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IG1heFdpZHRoQW5kTWFyZ2luOworICAg
IH0KKworICAgIGF1dG8gbWluV2lkdGggPSBjb21wdXRlZE1pbldpZHRoKGxheW91dEJveCwgYXZh
aWxhYmxlV2lkdGgpLnZhbHVlT3IoMCk7CisgICAgYXV0byBtaW5XaWR0aEFuZE1hcmdpbiA9IGNv
bXB1dGUoaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBtaW5XaWR0aCk7CisgICAgaWYgKGNvbnRlbnRX
aWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGggPCBtaW5XaWR0aEFuZE1hcmdpbi5jb250ZW50V2lk
dGgpCisgICAgICAgIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IG1pbldpZHRoQW5kTWFyZ2luOwor
ICAgIHJldHVybiBjb250ZW50V2lkdGhBbmRNYXJnaW47Cit9CisKK0Zvcm1hdHRpbmdDb250ZXh0
OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5OjppbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0IEJveCYgbGF5b3V0Qm94KQorewor
ICAgIGF1dG8gZml4ZWRNYXJnaW5Cb3JkZXJBbmRQYWRkaW5nID0gWyZdKGF1dG8mIGxheW91dEJv
eCkgeworICAgICAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOworICAgICAgICBy
ZXR1cm4gZml4ZWRWYWx1ZShzdHlsZS5tYXJnaW5TdGFydCgpKS52YWx1ZU9yKDApCisgICAgICAg
ICAgICArIExheW91dFVuaXQgeyBzdHlsZS5ib3JkZXJMZWZ0V2lkdGgoKSB9CisgICAgICAgICAg
ICArIGZpeGVkVmFsdWUoc3R5bGUucGFkZGluZ0xlZnQoKSkudmFsdWVPcigwKQorICAgICAgICAg
ICAgKyBmaXhlZFZhbHVlKHN0eWxlLnBhZGRpbmdSaWdodCgpKS52YWx1ZU9yKDApCisgICAgICAg
ICAgICArIExheW91dFVuaXQgeyBzdHlsZS5ib3JkZXJSaWdodFdpZHRoKCkgfQorICAgICAgICAg
ICAgKyBmaXhlZFZhbHVlKHN0eWxlLm1hcmdpbkVuZCgpKS52YWx1ZU9yKDApOworICAgIH07CisK
KyAgICBhdXRvIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IFsmXSgpIC0+IElu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeworICAgICAgICBhdXRvIGxvZ2ljYWxXaWR0aCA9IGxh
eW91dEJveC5zdHlsZSgpLmxvZ2ljYWxXaWR0aCgpOworICAgICAgICAvLyBNaW5pbXVtL21heGlt
dW0gd2lkdGggY2FuJ3QgYmUgZGVwZW5kaW5nIG9uIHRoZSBjb250YWluaW5nIGJsb2NrJ3Mgd2lk
dGguCisgICAgICAgIGF1dG8gbmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRoID0gbG9n
aWNhbFdpZHRoLmlzQ2FsY3VsYXRlZCgpIHx8IGxvZ2ljYWxXaWR0aC5pc1BlcmNlbnQoKSB8fCBs
b2dpY2FsV2lkdGguaXNSZWxhdGl2ZSgpOworICAgICAgICBpZiAobmVlZHNSZXNvbHZlZENvbnRh
aW5pbmdCbG9ja1dpZHRoKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKworICAgICAgICBpZiAo
YXV0byB3aWR0aCA9IGZpeGVkVmFsdWUobG9naWNhbFdpZHRoKSkKKyAgICAgICAgICAgIHJldHVy
biB7ICp3aWR0aCwgKndpZHRoIH07CisKKyAgICAgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2Vk
Qm94KCkpIHsKKyAgICAgICAgICAgIGF1dG8mIHJlcGxhY2VkQm94ID0gZG93bmNhc3Q8UmVwbGFj
ZWRCb3g+KGxheW91dEJveCk7CisgICAgICAgICAgICBpZiAocmVwbGFjZWRCb3guaGFzSW50cmlu
c2ljV2lkdGgoKSkgeworICAgICAgICAgICAgICAgIGF1dG8gcmVwbGFjZWRXaWR0aCA9IHJlcGxh
Y2VkQm94LmludHJpbnNpY1dpZHRoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVwbGFj
ZWRXaWR0aCwgcmVwbGFjZWRXaWR0aCB9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0
dXJuIHsgfTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlv
dXRCb3gpIHx8ICFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93T3JG
bG9hdGluZ0NoaWxkKCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworCisgICAgICAgIGlmIChs
YXlvdXRCb3guaXNTaXplQ29udGFpbm1lbnRCb3goKSkgeworICAgICAgICAgICAgLy8gVGhlIGlu
dHJpbnNpYyBzaXplcyBvZiB0aGUgc2l6ZSBjb250YWlubWVudCBib3ggYXJlIGRldGVybWluZWQg
YXMgaWYgdGhlIGVsZW1lbnQgaGFkIG5vIGNvbnRlbnQsCisgICAgICAgICAgICAvLyBmb2xsb3dp
bmcgdGhlIHNhbWUgbG9naWMgYXMgd2hlbiBzaXppbmcgYXMgaWYgZW1wdHkuCisgICAgICAgICAg
ICByZXR1cm4geyB9OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxheW91dEJveC5lc3RhYmxp
c2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgICAgIGF1dG8gaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGRv
d25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KSwgbGF5b3V0U3RhdGUoKSktPmNvbXB1dGVk
SW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOworICAgICAgICAgICAgaWYgKGxvZ2ljYWxXaWR0
aC5pc01pbkNvbnRlbnQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4geyBpbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzLm1pbmltdW0sIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSB9
OworICAgICAgICAgICAgaWYgKGxvZ2ljYWxXaWR0aC5pc01heENvbnRlbnQoKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4geyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIGludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSB9OworICAgICAgICAgICAgcmV0dXJuIGludHJp
bnNpY1dpZHRoQ29uc3RyYWludHM7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMgPSBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKKyAgICAg
ICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUoKS5mb3JtYXR0aW5nU3RhdGVG
b3JCb3gobGF5b3V0Qm94KTsKKyAgICAgICAgZm9yIChhdXRvJiBjaGlsZCA6IGNoaWxkcmVuT2ZU
eXBlPEJveD4oZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpKSkgeworICAgICAgICAg
ICAgaWYgKGNoaWxkLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpIHx8IChjaGlsZC5pc0Zsb2F0QXZv
aWRlcigpICYmICFjaGlsZC5oYXNGbG9hdENsZWFyKCkpKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgYXV0byBjaGlsZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBm
b3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChjaGlsZCk7Cisg
ICAgICAgICAgICBBU1NFUlQoY2hpbGRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKTsKKworICAg
ICAgICAgICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtID0gc3RkOjptYXgoaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtLCBjaGlsZEludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMtPm1pbmltdW0pOworICAgICAgICAgICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5t
YXhpbXVtID0gc3RkOjptYXgoaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtLCBjaGls
ZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMtPm1heGltdW0pOworICAgICAgICB9CisgICAgICAg
IHJldHVybiBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOworICAgIH07CisgICAgLy8gRklYTUUg
Q2hlY2sgZm9yIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgYXV0byBpbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzID0gY29uc3RyYWluQnlNaW5NYXhXaWR0aChsYXlvdXRCb3gsIGNvbXB1dGVk
SW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpKTsKKyAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzLmV4cGFuZChmaXhlZE1hcmdpbkJvcmRlckFuZFBhZGRpbmcobGF5b3V0Qm94KSk7CisgICAg
cmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Cit9CisKK30KK30KKworI2VuZGlmCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2Nr
Zm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0
dGluZ0NvbnRleHRRdWlya3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjcxYjA4ODQyMDNkYzg2YTY3MzZhYmM4
ZWJkYWYyYTVlZjFkNTg2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250
ZXh0UXVpcmtzLmNwcApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
OCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFC
TEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGlu
Z1N0YXRlLmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94R2Vv
bWV0cnkuaCIKKyNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNsdWRlICJMYXlv
dXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3N0YXRpYyBib29sIGlz
UXVpcmtDb250YWluZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgcmV0dXJuIGxheW91
dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpIHx8IGxheW91dEJv
eC5pc1RhYmxlQ2VsbCgpOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJr
czo6bmVlZHNTdHJldGNoaW5nKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIEFT
U0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7CisgICAgLy8gSW4gcXVpcmtzIG1vZGUsIGluLWZs
b3cgYm9keSBhbmQgaHRtbCBzdHJldGNoIHRvIHRoZSBpbml0aWFsIGNvbnRhaW5pbmcgYmxvY2sg
KGhlaWdodDogYXV0byBvbmx5KS4KKyAgICBpZiAoIWxheW91dFN0YXRlKCkuaW5RdWlya3NNb2Rl
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghbGF5b3V0Qm94LmlzRG9jdW1l
bnRCb3goKSAmJiAhbGF5b3V0Qm94LmlzQm9keUJveCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICByZXR1cm4gbGF5b3V0Qm94LnN0eWxlKCkubG9naWNhbEhlaWdodCgpLmlzQXV0bygp
OworfQorCitMYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6c3RyZXRj
aGVkSW5GbG93SGVpZ2h0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBDb250ZW50SGVpZ2h0QW5kTWFy
Z2luIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4pCit7CisgICAgQVNTRVJUKG5lZWRzU3RyZXRjaGlu
ZyhsYXlvdXRCb3gpKTsKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1h
dHRpbmdDb250ZXh0KCk7CisgICAgYXV0byBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiA9IGNv
bnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSArIGNvbnRlbnRI
ZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmFmdGVyOworCisgICAgaWYgKGxheW91
dEJveC5pc0RvY3VtZW50Qm94KCkpIHsKKyAgICAgICAgLy8gTGV0J3Mgc3RyZXRjaCB0aGUgaW5m
bG93IGRvY3VtZW50IGJveCg8aHRtbD4pIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGluaXRpYWwgY29u
dGFpbmluZyBibG9jayAodmlldykuCisgICAgICAgIGF1dG8gZG9jdW1lbnRCb3hDb250ZW50SGVp
Z2h0ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LmluaXRpYWxD
b250YWluaW5nQmxvY2soKSwgRXNjYXBlUmVhc29uOjpEb2N1bWVudEJveFN0cmV0Y2hlc1RvVmll
d3BvcnRRdWlyaykuY29udGVudEJveEhlaWdodCgpOworICAgICAgICAvLyBEb2N1bWVudCBib3gn
cyBvd24gdmVydGljYWwgbWFyZ2luL2JvcmRlci9wYWRkaW5nIHZhbHVlcyBhbHdheXMgc2hyaW5r
IHRoZSBjb250ZW50IGhlaWdodC4KKyAgICAgICAgYXV0byYgZG9jdW1lbnRCb3hHZW9tZXRyeSA9
IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAgICAgIGRv
Y3VtZW50Qm94Q29udGVudEhlaWdodCAtPSBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiArIGRv
Y3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50Qm94R2VvbWV0cnku
dmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KGNv
bnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCwgIGRvY3VtZW50Qm94Q29udGVudEhl
aWdodCk7CisgICAgfQorCisgICAgLy8gSGVyZSBpcyB0aGUgcXVpcmt5IHBhcnQgZm9yIGJvZHkg
Ym94IHdoZW4gaXQgc3RyZXRjaGVzIGFsbCB0aGUgd2F5IHRvIHRoZSBJQ0IgZXZlbiB3aGVuIHRo
ZSBkb2N1bWVudCBib3ggZG9lcyBub3QgKGUuZy4gb3V0LW9mLWZsb3cgcG9zaXRpb25lZCkuCisg
ICAgQVNTRVJUKGxheW91dEJveC5pc0JvZHlCb3goKSk7CisgICAgYXV0byYgaW5pdGlhbENvbnRh
aW5pbmdCbG9jayA9IGxheW91dEJveC5pbml0aWFsQ29udGFpbmluZ0Jsb2NrKCk7CisgICAgYXV0
byYgaW5pdGlhbENvbnRhaW5pbmdCbG9ja0dlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2Vv
bWV0cnlGb3JCb3goaW5pdGlhbENvbnRhaW5pbmdCbG9jaywgRXNjYXBlUmVhc29uOjpCb2R5U3Ry
ZXRjaGVzVG9WaWV3cG9ydFF1aXJrKTsKKyAgICAvLyBTdGFydCB0aGUgY29udGVudCBoZWlnaHQg
d2l0aCB0aGUgSUNCLgorICAgIGF1dG8gYm9keUJveENvbnRlbnRIZWlnaHQgPSBpbml0aWFsQ29u
dGFpbmluZ0Jsb2NrR2VvbWV0cnkuY29udGVudEJveEhlaWdodCgpOworICAgIC8vIEJvZHkgYm94
J3Mgb3duIGJvcmRlciBhbmQgcGFkZGluZyBzaHJpbmsgdGhlIGNvbnRlbnQgaGVpZ2h0LgorICAg
IGF1dG8mIGJvZHlCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94
KGxheW91dEJveCk7CisgICAgYm9keUJveENvbnRlbnRIZWlnaHQgLT0gYm9keUJveEdlb21ldHJ5
LnZlcnRpY2FsQm9yZGVyKCkgKyBib2R5Qm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFs
dWVPcigwKTsKKyAgICAvLyBCb2R5IGJveCBuZXZlciBjb2xsYXBzZXMgaXRzIHZlcnRpY2FsIG1h
cmdpbnMgd2l0aCB0aGUgZG9jdW1lbnQgYm94IGJ1dCBpdCBtaWdodCBjb2xsYXBzZSBpdHMgbWFy
Z2luIHdpdGggaXRzIGRlc2NlbmRhbnRzLgorICAgIGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0g
Y29udGVudEhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW47CisgICAgYXV0byBjb2xs
YXBzZWRNYXJnaW4gPSBmb3JtYXR0aW5nQ29udGV4dC5tYXJnaW5Db2xsYXBzZSgpLmNvbGxhcHNl
ZFZlcnRpY2FsVmFsdWVzKGxheW91dEJveCwgbm9uQ29sbGFwc2VkTWFyZ2luKS5jb2xsYXBzZWRW
YWx1ZXM7CisgICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBjb2xsYXBzZWRNYXJnaW4uYmVm
b3JlLnZhbHVlT3Iobm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSk7CisgICAgdXNlZFZlcnRpY2Fs
TWFyZ2luICs9IGNvbGxhcHNlZE1hcmdpbi5pc0NvbGxhcHNlZFRocm91Z2ggPyBub25Db2xsYXBz
ZWRNYXJnaW4uYWZ0ZXIgOiBjb2xsYXBzZWRNYXJnaW4uYWZ0ZXIudmFsdWVPcihub25Db2xsYXBz
ZWRNYXJnaW4uYWZ0ZXIpOworICAgIGJvZHlCb3hDb250ZW50SGVpZ2h0IC09IHVzZWRWZXJ0aWNh
bE1hcmdpbjsKKyAgICAvLyBEb2N1bWVudCBib3gncyBwYWRkaW5nIGFuZCBib3JkZXIgYWxzbyBz
aHJpbmsgdGhlIGJvZHkgYm94J3MgY29udGVudCBoZWlnaHQuCisgICAgYXV0byYgZG9jdW1lbnRC
b3ggPSBsYXlvdXRCb3gucGFyZW50KCk7CisgICAgYXV0byYgZG9jdW1lbnRCb3hHZW9tZXRyeSA9
IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGRvY3VtZW50Qm94LCBFc2NhcGVSZWFz
b246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspOworICAgIGJvZHlCb3hDb250ZW50SGVp
Z2h0IC09IGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50Qm94
R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKKyAgICAvLyBIb3dldmVyIHRo
ZSBub24taW4tZmxvdyBkb2N1bWVudCBib3gncyB2ZXJ0aWNhbCBtYXJnaW5zIGFyZSBpZ25vcmVk
LiBUaGV5IGRvbid0IGFmZmVjdCB0aGUgYm9keSBib3gncyBjb250ZW50IGhlaWdodC4KKyAgICBp
ZiAoZG9jdW1lbnRCb3guaXNJbkZsb3coKSkgeworICAgICAgICBhdXRvIGdlb21ldHJ5ID0gdGhp
cy0+Z2VvbWV0cnkoKTsKKyAgICAgICAgYXV0byBwcmVjb21wdXRlRG9jdW1lbnRCb3hWZXJ0aWNh
bE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkVmVydGljYWxNYXJnaW4oZG9jdW1lbnRCb3gsIGdl
b21ldHJ5LmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChpbml0aWFsQ29udGFpbmluZ0Jsb2Nr
LCBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspLmhvcml6b250YWwp
OworICAgICAgICBib2R5Qm94Q29udGVudEhlaWdodCAtPSBwcmVjb21wdXRlRG9jdW1lbnRCb3hW
ZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSArIHByZWNvbXB1dGVEb2N1bWVudEJveFZl
cnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCk7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1h
eChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQsICBib2R5Qm94Q29udGVudEhl
aWdodCk7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpzaG91bGRJ
Z25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbGF5b3V0U3RhdGUoKS5pblF1aXJrc01vZGUoKSAmJiBpc1F1aXJrQ29udGFp
bmVyKGxheW91dEJveCk7Cit9CisKK2VudW0gY2xhc3MgVmVydGljYWxNYXJnaW4geyBCZWZvcmUs
IEFmdGVyIH07CitzdGF0aWMgaW5saW5lIGJvb2wgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGNv
bnN0IEJveCYgbGF5b3V0Qm94LCBWZXJ0aWNhbE1hcmdpbiB2ZXJ0aWNhbE1hcmdpbikKK3sKKyAg
ICBpZiAoIWxheW91dEJveC5pc0luRmxvdygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
YXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICByZXR1cm4gKHZlcnRpY2FsTWFy
Z2luID09IFZlcnRpY2FsTWFyZ2luOjpCZWZvcmUgJiYgc3R5bGUuaGFzTWFyZ2luQmVmb3JlUXVp
cmsoKSkgfHwgKHZlcnRpY2FsTWFyZ2luID09IFZlcnRpY2FsTWFyZ2luOjpBZnRlciAmJiBzdHls
ZS5oYXNNYXJnaW5BZnRlclF1aXJrKCkpOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6OlF1aXJrczo6c2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50TWFyZ2luQmVm
b3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIHJldHVybiBsYXlvdXRTdGF0
ZSgpLmluUXVpcmtzTW9kZSgpICYmIGhhc1F1aXJrTWFyZ2luVG9Db2xsYXBzZShsYXlvdXRCb3gs
IFZlcnRpY2FsTWFyZ2luOjpCZWZvcmUpICYmIGlzUXVpcmtDb250YWluZXIobGF5b3V0Qm94LmNv
bnRhaW5pbmdCbG9jaygpKTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWly
a3M6OnNob3VsZENvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3Qg
Qm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxheW91dFN0YXRlKCkuaW5RdWly
a3NNb2RlKCkgJiYgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGxheW91dEJveCwgVmVydGljYWxN
YXJnaW46OkFmdGVyKSAmJiBpc1F1aXJrQ29udGFpbmVyKGxheW91dEJveC5jb250YWluaW5nQmxv
Y2soKSk7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdT
dGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2Nr
Zm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjc0YTUwZmY2
OTEzYWQxMmEwOGQ1MmUzOTAyNzU5MTA3N2YyMzM1YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2Nr
Rm9ybWF0dGluZ1N0YXRlLmNwcApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCisKKyNpZiBF
TkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgPHd0Zi9Jc29NYWxs
b2NJbmxpbmVzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgewor
CitXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoQmxvY2tGb3JtYXR0aW5nU3RhdGUpOworCitC
bG9ja0Zvcm1hdHRpbmdTdGF0ZTo6QmxvY2tGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3Rh
dGU+JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQorICAgIDogRm9y
bWF0dGluZ1N0YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OkJsb2NrLCBsYXlvdXRT
dGF0ZSkKK3sKK30KKworQmxvY2tGb3JtYXR0aW5nU3RhdGU6On5CbG9ja0Zvcm1hdHRpbmdTdGF0
ZSgpCit7Cit9CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3Rh
dGUuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3Jt
YXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMWU2Y2Q2MTlkZDMxNmY1
OWIzZjQwOWJmMzVkNzA5NmQ5ZmI3YzhiMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0
dGluZ1N0YXRlLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
KyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgor
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQor
CisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGb3Jt
YXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+CisjaW5jbHVkZSA8d3Rm
L1dlYWtIYXNoU2V0Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQg
eworCisvLyBCbG9ja0Zvcm1hdHRpbmdTdGF0ZSBob2xkcyB0aGUgc3RhdGUgZm9yIGEgcGFydGlj
dWxhciBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgdHJlZS4KK2NsYXNzIEJsb2NrRm9ybWF0dGlu
Z1N0YXRlIDogcHVibGljIEZvcm1hdHRpbmdTdGF0ZSB7CisgICAgV1RGX01BS0VfSVNPX0FMTE9D
QVRFRChCbG9ja0Zvcm1hdHRpbmdTdGF0ZSk7CitwdWJsaWM6CisgICAgQmxvY2tGb3JtYXR0aW5n
U3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRlJik7CisgICAgfkJsb2NrRm9y
bWF0dGluZ1N0YXRlKCk7CisKKyAgICB2b2lkIHNldFVzZWRWZXJ0aWNhbE1hcmdpbihjb25zdCBC
b3gmIGxheW91dEJveCwgY29uc3QgVXNlZFZlcnRpY2FsTWFyZ2luJiB1c2VkVmVydGljYWxNYXJn
aW4pIHsgbV91c2VkVmVydGljYWxNYXJnaW5zLnNldCgmbGF5b3V0Qm94LCB1c2VkVmVydGljYWxN
YXJnaW4pOyB9CisgICAgVXNlZFZlcnRpY2FsTWFyZ2luIHVzZWRWZXJ0aWNhbE1hcmdpbihjb25z
dCBCb3gmIGxheW91dEJveCkgY29uc3QgeyByZXR1cm4gbV91c2VkVmVydGljYWxNYXJnaW5zLmdl
dCgmbGF5b3V0Qm94KTsgfQorICAgIGJvb2wgaGFzVXNlZFZlcnRpY2FsTWFyZ2luKGNvbnN0IEJv
eCYgbGF5b3V0Qm94KSBjb25zdCB7IHJldHVybiBtX3VzZWRWZXJ0aWNhbE1hcmdpbnMuY29udGFp
bnMoJmxheW91dEJveCk7IH0KKworICAgIHZvaWQgc2V0SGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYg
bGF5b3V0Qm94KSB7IG1fY2xlYXJhbmNlU2V0LmFkZChsYXlvdXRCb3gpOyB9CisgICAgdm9pZCBj
bGVhckhhc0NsZWFyYW5jZShjb25zdCBCb3gmIGxheW91dEJveCkgeyBtX2NsZWFyYW5jZVNldC5y
ZW1vdmUobGF5b3V0Qm94KTsgfQorICAgIGJvb2wgaGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYgbGF5
b3V0Qm94KSBjb25zdCB7IHJldHVybiBtX2NsZWFyYW5jZVNldC5jb250YWlucyhsYXlvdXRCb3gp
OyB9CisKK3ByaXZhdGU6CisgICAgSGFzaE1hcDxjb25zdCBCb3gqLCBVc2VkVmVydGljYWxNYXJn
aW4+IG1fdXNlZFZlcnRpY2FsTWFyZ2luczsKKyAgICBXZWFrSGFzaFNldDxjb25zdCBCb3g+IG1f
Y2xlYXJhbmNlU2V0OworfTsKKworfQorfQorCitTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9V
VF9GT1JNQVRUSU5HX1NUQVRFKEJsb2NrRm9ybWF0dGluZ1N0YXRlLCBpc0Jsb2NrRm9ybWF0dGlu
Z1N0YXRlKCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGlu
Zy9CbG9ja01hcmdpbkNvbGxhcHNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mMWZkNWJiZTIyYTFhYjkyZTg1
MWQ4NTBkZTBmNGE2YWQxODcxMGRiCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tNYXJnaW5Db2xs
YXBzZS5jcHAKQEAgLTAsMCArMSw2MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
CisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisg
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExB
WU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0
ZS5oIgorI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0
aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRDb250
YWluZXJCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRVbml0LmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5
bGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3N0YXRp
YyBib29sIGhhc0JvcmRlcihjb25zdCBCb3JkZXJWYWx1ZSYgYm9yZGVyVmFsdWUpCit7CisgICAg
aWYgKGJvcmRlclZhbHVlLnN0eWxlKCkgPT0gQm9yZGVyU3R5bGU6Ok5vbmUgfHwgYm9yZGVyVmFs
dWUuc3R5bGUoKSA9PSBCb3JkZXJTdHlsZTo6SGlkZGVuKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgcmV0dXJuICEhYm9yZGVyVmFsdWUud2lkdGgoKTsKK30KKworc3RhdGljIGJvb2wgaGFz
UGFkZGluZyhjb25zdCBMZW5ndGgmIHBhZGRpbmdWYWx1ZSkKK3sKKyAgICAvLyBGSVhNRTogQ2hl
Y2sgaWYgcGVyY2VudCB2YWx1ZSBuZWVkcyB0byBiZSByZXNvbHZlZC4KKyAgICByZXR1cm4gIXBh
ZGRpbmdWYWx1ZS5pc1plcm8oKTsKK30KKworc3RhdGljIGJvb2wgaGFzQm9yZGVyQmVmb3JlKGNv
bnN0IEJveCYgbGF5b3V0Qm94KQoreworICAgIHJldHVybiBoYXNCb3JkZXIobGF5b3V0Qm94LnN0
eWxlKCkuYm9yZGVyQmVmb3JlKCkpOworfQorCitzdGF0aWMgYm9vbCBoYXNCb3JkZXJBZnRlcihj
b25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICByZXR1cm4gaGFzQm9yZGVyKGxheW91dEJveC5z
dHlsZSgpLmJvcmRlckFmdGVyKCkpOworfQorCitzdGF0aWMgYm9vbCBoYXNQYWRkaW5nQmVmb3Jl
KGNvbnN0IEJveCYgbGF5b3V0Qm94KQoreworICAgIHJldHVybiBoYXNQYWRkaW5nKGxheW91dEJv
eC5zdHlsZSgpLnBhZGRpbmdCZWZvcmUoKSk7Cit9CisKK3N0YXRpYyBib29sIGhhc1BhZGRpbmdB
ZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICByZXR1cm4gaGFzUGFkZGluZyhsYXlv
dXRCb3guc3R5bGUoKS5wYWRkaW5nQWZ0ZXIoKSk7Cit9CisKK3N0YXRpYyBib29sIGVzdGFibGlz
aGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dChjb25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICAv
LyBXZWJLaXQgdHJlYXRzIHRoZSBkb2N1bWVudCBlbGVtZW50IHJlbmRlcmVyIGFzIGEgYmxvY2sg
Zm9ybWF0dGluZyBjb250ZXh0IHJvb3QuIEl0IHByb2JhYmx5IG9ubHkgaW1wYWN0cyBtYXJnaW4g
Y29sbGFwc2luZywgc28gbGV0J3Mgbm90IGRvCisgICAgLy8gYSBsYXlvdXQgd2lkZSBxdWlyayBv
biB0aGlzIGZvciBub3cuCisgICAgaWYgKGxheW91dEJveC5pc0RvY3VtZW50Qm94KCkpCisgICAg
ICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBsYXlvdXRCb3guZXN0YWJsaXNoZXNCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0KCk7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFy
Z2luQ29sbGFwc2U6Omhhc0NsZWFyYW5jZShjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sK
KyAgICBpZiAoIWxheW91dEJveC5oYXNGbG9hdENsZWFyKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAvLyBGSVhNRTogcHJlY29tcHV0ZWRWZXJ0aWNhbFBvc2l0aW9uRm9yRm9ybWF0dGlu
Z1Jvb3QgbG9naWMgZW5kcyB1cCBjYWxsaW5nIGludG8gdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBs
YXlvdXRCb3ggKGZpcnN0IGluZmxvdyBjaGlsZCkgaGFzCisgICAgLy8gbm90IGJlZW4gbGFpZCBv
dXQuCisgICAgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkuZm9ybWF0dGluZ1N0YXRlKCkuaGFz
Q2xlYXJhbmNlKGxheW91dEJveCk7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6
TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRl
cihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICAvLyAxLiBUaGlzIGlzIHRoZSBs
YXN0IGluLWZsb3cgY2hpbGQgYW5kIGl0cyBtYXJnaW5zIGNvbGxhcHNlIHRocm91Z2ggYW5kIHRo
ZSBtYXJnaW4gYWZ0ZXIgY29sbGFwc2VzIHdpdGggcGFyZW50J3MgbWFyZ2luIGFmdGVyIG9yCisg
ICAgLy8gMi4gVGhpcyBib3gncyBtYXJnaW4gYWZ0ZXIgY29sbGFwc2VzIHdpdGggdGhlIG5leHQg
c2libGluZydzIG1hcmdpbiBiZWZvcmUgYW5kIHRoYXQgc2libGluZyBjb2xsYXBzZXMgdGhyb3Vn
aCBhbmQKKyAgICAvLyB3ZSBjYW4gZ2V0IHRvIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgbGlrZSB0
aGF0LgorICAgIGF1dG8qIGxhc3RJbkZsb3dDaGlsZCA9IGxheW91dEJveC5jb250YWluaW5nQmxv
Y2soKS5sYXN0SW5GbG93Q2hpbGQoKTsKKyAgICBmb3IgKGF1dG8qIGN1cnJlbnRCb3ggPSAmbGF5
b3V0Qm94OyBjdXJyZW50Qm94OyBjdXJyZW50Qm94ID0gY3VycmVudEJveC0+bmV4dEluRmxvd1Np
YmxpbmcoKSkgeworICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKmN1cnJlbnRC
b3gpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoY3VycmVudEJveCA9
PSBsYXN0SW5GbG93Q2hpbGQpCisgICAgICAgICAgICByZXR1cm4gbWFyZ2luQWZ0ZXJDb2xsYXBz
ZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoKmN1cnJlbnRCb3gpOyAKKyAgICAgICAgaWYgKCFtYXJn
aW5BZnRlckNvbGxhcHNlc1dpdGhOZXh0U2libGluZ01hcmdpbkJlZm9yZSgqY3VycmVudEJveCkp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJl
Zm9yZShjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICAvLyBUaGUgZmlyc3QgaW5m
bG93IGNoaWxkIGNvdWxkIHByb3BhZ2F0ZSBpdHMgdG9wIG1hcmdpbiB0byBwYXJlbnQuCisgICAg
Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIxL2JveC5odG1sI2NvbGxhcHNpbmctbWFyZ2lu
cworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworCisgICAgaWYgKGZv
cm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRo
UGFyZW50TWFyZ2luQmVmb3JlKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisg
ICAgLy8gTWFyZ2lucyBiZXR3ZWVuIGEgZmxvYXRlZCBib3ggYW5kIGFueSBvdGhlciBib3ggZG8g
bm90IGNvbGxhcHNlLgorICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5IHBv
c2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgorICAgIGlmIChsYXlvdXRCb3guaXNPdXRP
ZkZsb3dQb3NpdGlvbmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE1hcmdp
bnMgb2YgaW5saW5lLWJsb2NrIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KKyAgICBpZiAobGF5b3V0
Qm94LmlzSW5saW5lQmxvY2tCb3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8g
T25seSB0aGUgZmlyc3QgaW5sZmxvdyBjaGlsZCBjb2xsYXBzZXMgd2l0aCBwYXJlbnQuCisgICAg
aWYgKGxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdC
bG9jaygpOworICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJs
b2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxv
dyBjaGlsZHJlbgorICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29u
dGFpbmluZ0Jsb2NrKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGhhc0JvcmRl
ckJlZm9yZShjb250YWluaW5nQmxvY2spKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBp
ZiAoaGFzUGFkZGluZ0JlZm9yZShjb250YWluaW5nQmxvY2spKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAvLyAuLi5hbmQgdGhlIGNoaWxkIGhhcyBubyBjbGVhcmFuY2UuCisgICAgaWYg
KGhhc0NsZWFyYW5jZShsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xs
YXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVy
KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNC
bG9ja0xldmVsQm94KCkpOworCisgICAgaWYgKCFsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJs
aW5nKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8mIHByZXZpb3VzSW5GbG93
U2libGluZyA9ICpsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7CisgICAgLy8gTWFy
Z2lucyBiZXR3ZWVuIGEgZmxvYXRlZCBib3ggYW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxh
cHNlLgorICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSB8fCBwcmV2aW91
c0luRmxvd1NpYmxpbmcuaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgLy8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8g
bm90IGNvbGxhcHNlLgorICAgIGlmICgobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgp
ICYmICFsYXlvdXRCb3guc3R5bGUoKS50b3AoKS5pc0F1dG8oKSkKKyAgICAgICAgfHwgKHByZXZp
b3VzSW5GbG93U2libGluZy5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhcHJldmlvdXNJbkZs
b3dTaWJsaW5nLnN0eWxlKCkuYm90dG9tKCkuaXNBdXRvKCkpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFw
c2UuCisgICAgaWYgKGxheW91dEJveC5pc0lubGluZUJsb2NrQm94KCkgfHwgcHJldmlvdXNJbkZs
b3dTaWJsaW5nLmlzSW5saW5lQmxvY2tCb3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jay1sZXZlbCBlbGVtZW50
IGFsd2F5cyBjb2xsYXBzZXMgd2l0aCB0aGUgdG9wIG1hcmdpbiBvZgorICAgIC8vIGl0cyBuZXh0
IGluLWZsb3cgYmxvY2stbGV2ZWwgc2libGluZywgdW5sZXNzIHRoYXQgc2libGluZyBoYXMgY2xl
YXJhbmNlLgorICAgIGlmIChoYXNDbGVhcmFuY2UobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxv
d0NoaWxkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIEFT
U0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworICAgIC8vIE1hcmdpbnMgb2YgZWxl
bWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90
IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJlbi4KKyAgICBpZiAoZXN0YWJsaXNo
ZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIC8vIFRoZSB0b3AgbWFyZ2luIG9mIGFuIGluLWZsb3cgYmxvY2sgZWxlbWVudCBj
b2xsYXBzZXMgd2l0aCBpdHMgZmlyc3QgaW4tZmxvdyBibG9jay1sZXZlbAorICAgIC8vIGNoaWxk
J3MgdG9wIG1hcmdpbiBpZiB0aGUgZWxlbWVudCBoYXMgbm8gdG9wIGJvcmRlci4uLgorICAgIGlm
IChoYXNCb3JkZXJCZWZvcmUobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gLi4ubm8gdG9wIHBhZGRpbmcKKyAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShsYXlvdXRC
b3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWlzPENvbnRhaW5lckJveD4o
bGF5b3V0Qm94KSB8fCAhZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxv
d0NoaWxkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8mIGZpcnN0SW5GbG93
Q2hpbGQgPSAqZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93Q2hp
bGQoKTsKKyAgICBpZiAoIWZpcnN0SW5GbG93Q2hpbGQuaXNCbG9ja0xldmVsQm94KCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIC4uLmFuZCB0aGUgY2hpbGQgaGFzIG5vIGNsZWFy
YW5jZS4KKyAgICBpZiAoaGFzQ2xlYXJhbmNlKGZpcnN0SW5GbG93Q2hpbGQpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBu
b3QgY29sbGFwc2UuCisgICAgaWYgKGZpcnN0SW5GbG93Q2hpbGQuaXNJbmxpbmVCbG9ja0JveCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBz
ZXNXaXRoU2libGluZ01hcmdpbkJlZm9yZVdpdGhDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRC
b3gpIGNvbnN0Cit7CisgICAgLy8gSWYgdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgb2YgYW4g
ZWxlbWVudCB3aXRoIGNsZWFyYW5jZSBhcmUgYWRqb2luaW5nLCBpdHMgbWFyZ2lucyBjb2xsYXBz
ZSB3aXRoIHRoZSBhZGpvaW5pbmcgbWFyZ2lucworICAgIC8vIG9mIGZvbGxvd2luZyBzaWJsaW5n
cyBidXQgdGhhdCByZXN1bHRpbmcgbWFyZ2luIGRvZXMgbm90IGNvbGxhcHNlIHdpdGggdGhlIGJv
dHRvbSBtYXJnaW4gb2YgdGhlIHBhcmVudCBibG9jay4KKyAgICBpZiAoIW1hcmdpbnNDb2xsYXBz
ZVRocm91Z2gobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChh
dXRvKiBwcmV2aW91c1NpYmxpbmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7
IHByZXZpb3VzU2libGluZzsgcHJldmlvdXNTaWJsaW5nID0gcHJldmlvdXNTaWJsaW5nLT5wcmV2
aW91c0luRmxvd1NpYmxpbmcoKSkgeworICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91
Z2goKnByZXZpb3VzU2libGluZykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IGlmIChoYXNDbGVhcmFuY2UoKnByZXZpb3VzU2libGluZykpCisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRN
YXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgLy8gMS4gVGhp
cyBpcyB0aGUgZmlyc3QgaW4tZmxvdyBjaGlsZCBhbmQgaXRzIG1hcmdpbnMgY29sbGFwc2UgdGhy
b3VnaCBhbmQgdGhlIG1hcmdpbiBiZWZvcmUgY29sbGFwc2VzIHdpdGggcGFyZW50J3MgbWFyZ2lu
IGJlZm9yZSBvcgorICAgIC8vIDIuIFRoaXMgYm94J3MgbWFyZ2luIGJlZm9yZSBjb2xsYXBzZXMg
d2l0aCB0aGUgcHJldmlvdXMgc2libGluZydzIG1hcmdpbiBhZnRlciBhbmQgdGhhdCBzaWJsaW5n
IGNvbGxhcHNlcyB0aHJvdWdoIGFuZAorICAgIC8vIHdlIGNhbiBnZXQgdG8gdGhlIGZpcnN0IGlu
LWZsb3cgY2hpbGQgbGlrZSB0aGF0LgorICAgIGF1dG8qIGZpcnN0SW5GbG93Q2hpbGQgPSBsYXlv
dXRCb3guY29udGFpbmluZ0Jsb2NrKCkuZmlyc3RJbkZsb3dDaGlsZCgpOworICAgIGZvciAoYXV0
byogY3VycmVudEJveCA9ICZsYXlvdXRCb3g7IGN1cnJlbnRCb3g7IGN1cnJlbnRCb3ggPSBjdXJy
ZW50Qm94LT5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkgeworICAgICAgICBpZiAoIW1hcmdpbnND
b2xsYXBzZVRocm91Z2goKmN1cnJlbnRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBpZiAoY3VycmVudEJveCA9PSBmaXJzdEluRmxvd0NoaWxkKQorICAgICAgICAgICAg
cmV0dXJuIG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUoKmN1cnJl
bnRCb3gpOyAKKyAgICAgICAgaWYgKCFtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNT
aWJsaW5nTWFyZ2luQWZ0ZXIoKmN1cnJlbnRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkFm
dGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBj
b25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworCisgICAg
aWYgKGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkQ29sbGFwc2VNYXJnaW5BZnRl
cldpdGhQYXJlbnRNYXJnaW5BZnRlcihsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIC8vIE1hcmdpbnMgYmV0d2VlbiBhIGZsb2F0ZWQgYm94IGFuZCBhbnkgb3RoZXIgYm94
IGRvIG5vdCBjb2xsYXBzZS4KKyAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVk
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE1hcmdpbnMgb2YgYWJzb2x1dGVs
eSBwb3NpdGlvbmVkIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KKyAgICBpZiAobGF5b3V0Qm94Lmlz
T3V0T2ZGbG93UG9zaXRpb25lZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBN
YXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCisgICAgaWYgKGxh
eW91dEJveC5pc0lubGluZUJsb2NrQm94KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIE9ubHkgdGhlIGxhc3QgaW5sZmxvdyBjaGlsZCBjb2xsYXBzZXMgd2l0aCBwYXJlbnQuCisg
ICAgaWYgKGxheW91dEJveC5uZXh0SW5GbG93U2libGluZygpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBhdXRvJiBjb250YWluaW5nQmxvY2sgPSBsYXlvdXRCb3guY29udGFpbmluZ0Js
b2NrKCk7CisgICAgLy8gTWFyZ2lucyBvZiBlbGVtZW50cyB0aGF0IGVzdGFibGlzaCBuZXcgYmxv
Y2sgZm9ybWF0dGluZyBjb250ZXh0cyBkbyBub3QgY29sbGFwc2Ugd2l0aCB0aGVpciBpbi1mbG93
IGNoaWxkcmVuLgorICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29u
dGFpbmluZ0Jsb2NrKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlIGJvdHRv
bSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jayBib3ggd2l0aCBhICdoZWlnaHQnIG9mICdhdXRv
JyBjb2xsYXBzZXMgd2l0aCBpdHMgbGFzdCBpbi1mbG93IGJsb2NrLWxldmVsIGNoaWxkJ3MgYm90
dG9tIG1hcmdpbiwgaWY6CisgICAgaWYgKCFjb250YWluaW5nQmxvY2suc3R5bGUoKS5oZWlnaHQo
KS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGJveCBoYXMg
bm8gYm90dG9tIHBhZGRpbmcsIGFuZAorICAgIGlmIChoYXNQYWRkaW5nQWZ0ZXIoY29udGFpbmlu
Z0Jsb2NrKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGJveCBoYXMgbm8g
Ym90dG9tIGJvcmRlciwgYW5kCisgICAgaWYgKGhhc0JvcmRlckFmdGVyKGNvbnRhaW5pbmdCbG9j
aykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIHRoZSBjaGlsZCdzIGJvdHRvbSBt
YXJnaW4gbmVpdGhlciBjb2xsYXBzZXMgd2l0aCBhIHRvcCBtYXJnaW4gdGhhdCBoYXMgY2xlYXJh
bmNlLi4uCisgICAgaWYgKG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5CZWZv
cmVXaXRoQ2xlYXJhbmNlKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIG5vciAoaWYgdGhlIGJveCdzIG1pbi1oZWlnaHQgaXMgbm9uLXplcm8pIHdpdGggdGhlIGJv
eCdzIHRvcCBtYXJnaW4uCisgICAgYXV0byBjb21wdXRlZE1pbkhlaWdodCA9IGNvbnRhaW5pbmdC
bG9jay5zdHlsZSgpLmxvZ2ljYWxNaW5IZWlnaHQoKTsKKyAgICBpZiAoIWNvbXB1dGVkTWluSGVp
Z2h0LmlzQXV0bygpICYmIGNvbXB1dGVkTWluSGVpZ2h0LnZhbHVlKCkgJiYgbWFyZ2luQWZ0ZXJD
b2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxheW91dEJveCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhMYXN0SW5GbG93
Q2hpbGRNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBBU1NF
UlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKKworICAgIC8vIE1hcmdpbnMgb2YgZWxl
bWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90
IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJlbi4KKyAgICBpZiAoZXN0YWJsaXNo
ZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxD
b250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgYXV0byYgbGFzdEluRmxvd0NoaWxkID0gKmRvd25jYXN0PENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KS5sYXN0SW5GbG93Q2hpbGQoKTsKKyAgICBpZiAoIWxhc3RJbkZsb3dD
aGlsZC5pc0Jsb2NrTGV2ZWxCb3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8g
VGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jayBib3ggd2l0aCBhICdoZWlnaHQn
IG9mICdhdXRvJyBjb2xsYXBzZXMgd2l0aCBpdHMgbGFzdCBpbi1mbG93IGJsb2NrLWxldmVsIGNo
aWxkJ3MgYm90dG9tIG1hcmdpbiwgaWY6CisgICAgaWYgKCFsYXlvdXRCb3guc3R5bGUoKS5oZWln
aHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGJveCBo
YXMgbm8gYm90dG9tIHBhZGRpbmcsIGFuZAorICAgIGlmIChoYXNQYWRkaW5nQWZ0ZXIobGF5b3V0
Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90
dG9tIGJvcmRlciwgYW5kCisgICAgaWYgKGhhc0JvcmRlckFmdGVyKGxheW91dEJveCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4gbmVp
dGhlciBjb2xsYXBzZXMgd2l0aCBhIHRvcCBtYXJnaW4gdGhhdCBoYXMgY2xlYXJhbmNlLi4uCisg
ICAgaWYgKG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xl
YXJhbmNlKGxhc3RJbkZsb3dDaGlsZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8v
IG5vciAoaWYgdGhlIGJveCdzIG1pbi1oZWlnaHQgaXMgbm9uLXplcm8pIHdpdGggdGhlIGJveCdz
IHRvcCBtYXJnaW4uCisgICAgYXV0byBjb21wdXRlZE1pbkhlaWdodCA9IGxheW91dEJveC5zdHls
ZSgpLmxvZ2ljYWxNaW5IZWlnaHQoKTsKKyAgICBpZiAoIWNvbXB1dGVkTWluSGVpZ2h0LmlzQXV0
bygpICYmIGNvbXB1dGVkTWluSGVpZ2h0LnZhbHVlKCkKKyAgICAgICAgJiYgKG1hcmdpbkFmdGVy
Q29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXN0SW5GbG93Q2hpbGQpIHx8IGhhc0Ns
ZWFyYW5jZShsYXN0SW5GbG93Q2hpbGQpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Ly8gTWFyZ2lucyBvZiBpbmxpbmUtYmxvY2sgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgorICAgIGlm
IChsYXN0SW5GbG93Q2hpbGQuaXNJbmxpbmVCbG9ja0JveCgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAvLyBUaGlzIGlzIGEgcXVpcmsgYmVoYXZpb3I6IFdoZW4gdGhlIG1hcmdpbiBh
ZnRlciBvZiB0aGUgbGFzdCBpbmZsb3cgY2hpbGQgKG9yIGEgcHJldmlvdXMgc2libGluZyB3aXRo
IGNvbGxhcHNlZCB0aHJvdWdoIG1hcmdpbnMpCisgICAgLy8gY29sbGFwc2VzIHdpdGggYSBxdWly
ayBwYXJlbnQncyB0aGUgbWFyZ2luIGJlZm9yZSwgdGhlbiB0aGUgc2FtZSBtYXJnaW4gYWZ0ZXIg
ZG9lcyBub3QgY29sbGFwc2VzIHdpdGggdGhlIHBhcmVudCdzIG1hcmdpbiBhZnRlci4KKyAgICBp
ZiAoZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWly
a01hcmdpbihsYXlvdXRCb3gpICYmIG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdp
bkJlZm9yZShsYXN0SW5GbG93Q2hpbGQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xs
YXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoTmV4dFNpYmxpbmdNYXJnaW5CZWZvcmUoY29u
c3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2Nr
TGV2ZWxCb3goKSk7CisKKyAgICBpZiAoIWxheW91dEJveC5uZXh0SW5GbG93U2libGluZygpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gbWFyZ2luQmVmb3JlQ29sbGFwc2Vz
V2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKCpsYXlvdXRCb3gubmV4dEluRmxvd1NpYmxp
bmcoKSk7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6
Om1hcmdpbnNDb2xsYXBzZVRocm91Z2goY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7Cisg
ICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7CisKKyAgICAvLyBBIGJveCdz
IG93biBtYXJnaW5zIGNvbGxhcHNlIGlmIHRoZSAnbWluLWhlaWdodCcgcHJvcGVydHkgaXMgemVy
bywgYW5kIGl0IGhhcyBuZWl0aGVyIHRvcCBvciBib3R0b20gYm9yZGVycyBub3IgdG9wIG9yIGJv
dHRvbSBwYWRkaW5nLAorICAgIC8vIGFuZCBpdCBoYXMgYSAnaGVpZ2h0JyBvZiBlaXRoZXIgMCBv
ciAnYXV0bycsIGFuZCBpdCBkb2VzIG5vdCBjb250YWluIGEgbGluZSBib3gsIGFuZCBhbGwgb2Yg
aXRzIGluLWZsb3cgY2hpbGRyZW4ncyBtYXJnaW5zIChpZiBhbnkpIGNvbGxhcHNlLgorICAgIGlm
IChoYXNCb3JkZXJCZWZvcmUobGF5b3V0Qm94KSB8fCBoYXNCb3JkZXJBZnRlcihsYXlvdXRCb3gp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShsYXlv
dXRCb3gpIHx8IGhhc1BhZGRpbmdBZnRlcihsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAvLyBNYXJnaW5zIGFyZSBub3QgYWRqb2luaW5nIHdoZW4gdGhlIGJveCBoYXMg
Y2xlYXJhbmNlLgorICAgIGlmIChoYXNDbGVhcmFuY2UobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICBh
dXRvIGNvbXB1dGVkSGVpZ2h0VmFsdWVJc1plcm8gPSBzdHlsZS5oZWlnaHQoKS5pc0ZpeGVkKCkg
JiYgIXN0eWxlLmhlaWdodCgpLnZhbHVlKCk7CisgICAgaWYgKCEoc3R5bGUuaGVpZ2h0KCkuaXNB
dXRvKCkgfHwgY29tcHV0ZWRIZWlnaHRWYWx1ZUlzWmVybykpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIC8vIEZJWE1FOiBDaGVjayBmb3IgY29tcHV0ZWQgMCBoZWlnaHQuCisgICAgaWYg
KCFzdHlsZS5taW5IZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gRklYTUU6IEJsb2NrIHJlcGxhY2VkIGJveGVzIGNsZWFybHkgZG9uJ3QgY29sbGFwc2Ug
dGhyb3VnaCB0aGVpciBtYXJnaW5zLCBidXQgSSBjb3VsZG4ndCBmaW5kIGl0IGluIHRoZSBzcGVj
IHlldCAoYW5kIG5vLCBpdCdzIG5vdCBhIHF1aXJrKS4KKyAgICBpZiAobGF5b3V0Qm94LmlzUmVw
bGFjZWRCb3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFpczxDb250YWlu
ZXJCb3g+KGxheW91dEJveCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFkb3du
Y2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKKyAgICAgICAg
cmV0dXJuICFlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQobGF5b3V0Qm94KTsKKwor
ICAgIGlmIChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKSB7CisgICAg
ICAgIGlmIChsYXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7
CisgICAgICAgICAgICBhdXRvJiBsYXlvdXRTdGF0ZSA9IHRoaXMtPmxheW91dFN0YXRlKCk7Cisg
ICAgICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB0aHJvdWdoIG1hcmdpbiBlc3RpbWF0aW9uLCB3
ZSBkb24ndCBuZWNlc3NhcmlseSBoYXZlIGFuIGFjdHVhbCBzdGF0ZSBmb3IgdGhpcyBsYXlvdXQg
Ym94IHNpbmNlCisgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHN0YXJ0ZWQgbGF5aW5nIGl0IG91
dCB5ZXQuCisgICAgICAgICAgICBhdXRvJiBjb250YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWlu
ZXJCb3g+KGxheW91dEJveCk7CisgICAgICAgICAgICBpZiAoIWxheW91dFN0YXRlLmhhc0lubGlu
ZUZvcm1hdHRpbmdTdGF0ZShjb250YWluZXJCb3gpKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgICAgICAgICAgYXV0byBpc0NvbnNpZGVyZWRFbXB0eSA9IFsmXSB7CisgICAg
ICAgICAgICAgICAgYXV0byYgaW5saW5lRm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUuZXN0
YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUoY29udGFpbmVyQm94KTsKKyAgICAgICAgICAg
ICAgICBpZiAoIWlubGluZUZvcm1hdHRpbmdTdGF0ZS5saW5lcygpLmlzRW1wdHkoKSkKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIC8vIEFueSBmbG9h
dCBib3ggaW4gdGhpcyBmb3JtYXR0aW5nIGNvbnRleHQgcHJldmVudHMgY29sbGFwc2luZyB0aHJv
dWdoLgorICAgICAgICAgICAgICAgIGF1dG8mIGZsb2F0cyA9IGlubGluZUZvcm1hdHRpbmdTdGF0
ZS5mbG9hdGluZ1N0YXRlKCkuZmxvYXRzKCk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBm
bG9hdEl0ZW0gOiBmbG9hdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZsb2F0SXRlbS5p
c0luRm9ybWF0dGluZ0NvbnRleHRPZihjb250YWluZXJCb3gpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICByZXR1cm4gaXNDb25zaWRl
cmVkRW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEEgcm9vdCBvZiBhIG5vbi1pbmxp
bmUgZm9ybWF0dGluZyBjb250ZXh0ICh0YWJsZSwgZmxleCBldGMpIHdpdGggaW5mbG93IGRlc2Nl
bmRhbnRzIHNob3VsZCBub3QgY29sbGFwc2UgdGhyb3VnaC4KKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIGZvciAoYXV0byogaW5mbG93Q2hpbGQgPSBkb3duY2FzdDxDb250YWlu
ZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsgaW5mbG93Q2hp
bGQ7IGluZmxvd0NoaWxkID0gaW5mbG93Q2hpbGQtPm5leHRJbkZsb3dPckZsb2F0aW5nU2libGlu
ZygpKSB7CisgICAgICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKmlu
Zmxvd0NoaWxkKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtYXJn
aW5zQ29sbGFwc2VUaHJvdWdoKCppbmZsb3dDaGlsZCkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitVc2VkVmVydGljYWxNYXJnaW46OlBv
c2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFy
Z2luQ29sbGFwc2U6OmNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihVc2VkVmVydGlj
YWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgYSwgVXNlZFZlcnRpY2Fs
TWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIGIpIGNvbnN0Cit7CisgICAg
VXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIGNvbXB1
dGVkVmFsdWVzOworICAgIGlmIChhLnBvc2l0aXZlICYmIGIucG9zaXRpdmUpCisgICAgICAgIGNv
bXB1dGVkVmFsdWVzLnBvc2l0aXZlID0gc3RkOjptYXgoKmEucG9zaXRpdmUsICpiLnBvc2l0aXZl
KTsKKyAgICBlbHNlCisgICAgICAgIGNvbXB1dGVkVmFsdWVzLnBvc2l0aXZlID0gYS5wb3NpdGl2
ZSA/IGEucG9zaXRpdmUgOiBiLnBvc2l0aXZlOworCisgICAgaWYgKGEubmVnYXRpdmUgJiYgYi5u
ZWdhdGl2ZSkKKyAgICAgICAgY29tcHV0ZWRWYWx1ZXMubmVnYXRpdmUgPSBzdGQ6Om1pbigqYS5u
ZWdhdGl2ZSwgKmIubmVnYXRpdmUpOworICAgIGVsc2UKKyAgICAgICAgY29tcHV0ZWRWYWx1ZXMu
bmVnYXRpdmUgPSBhLm5lZ2F0aXZlID8gYS5uZWdhdGl2ZSA6IGIubmVnYXRpdmU7CisKKyAgICBp
ZiAoYS5pc05vblplcm8oKSAmJiBiLmlzTm9uWmVybygpKQorICAgICAgICBjb21wdXRlZFZhbHVl
cy5pc1F1aXJrID0gYS5pc1F1aXJrIHx8IGIuaXNRdWlyazsKKyAgICBlbHNlIGlmIChhLmlzTm9u
WmVybygpKQorICAgICAgICBjb21wdXRlZFZhbHVlcy5pc1F1aXJrID0gYS5pc1F1aXJrOworICAg
IGVsc2UKKyAgICAgICAgY29tcHV0ZWRWYWx1ZXMuaXNRdWlyayA9IGIuaXNRdWlyazsKKworICAg
IHJldHVybiBjb21wdXRlZFZhbHVlczsKK30KKworT3B0aW9uYWw8TGF5b3V0VW5pdD4gQmxvY2tG
b3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpblZhbHVlKFVzZWRWZXJ0aWNh
bE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBtYXJnaW5WYWx1ZXMpIGNv
bnN0Cit7CisgICAgLy8gV2hlbiB0d28gb3IgbW9yZSBtYXJnaW5zIGNvbGxhcHNlLCB0aGUgcmVz
dWx0aW5nIG1hcmdpbiB3aWR0aCBpcyB0aGUgbWF4aW11bSBvZiB0aGUgY29sbGFwc2luZyBtYXJn
aW5zJyB3aWR0aHMuCisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgbmVnYXRpdmUgbWFyZ2lucywgdGhl
IG1heGltdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgbmVnYXRpdmUgYWRqb2luaW5n
IG1hcmdpbnMgaXMgZGVkdWN0ZWQgZnJvbSB0aGUgbWF4aW11bQorICAgIC8vIG9mIHRoZSBwb3Np
dGl2ZSBhZGpvaW5pbmcgbWFyZ2lucy4gSWYgdGhlcmUgYXJlIG5vIHBvc2l0aXZlIG1hcmdpbnMs
IHRoZSBtYXhpbXVtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGFkam9pbmluZyBtYXJn
aW5zIGlzIGRlZHVjdGVkIGZyb20gemVyby4KKyAgICBpZiAoIW1hcmdpblZhbHVlcy5uZWdhdGl2
ZSkKKyAgICAgICAgcmV0dXJuIG1hcmdpblZhbHVlcy5wb3NpdGl2ZTsKKworICAgIGlmICghbWFy
Z2luVmFsdWVzLnBvc2l0aXZlKQorICAgICAgICByZXR1cm4gbWFyZ2luVmFsdWVzLm5lZ2F0aXZl
OworCisgICAgcmV0dXJuICptYXJnaW5WYWx1ZXMucG9zaXRpdmUgKyAqbWFyZ2luVmFsdWVzLm5l
Z2F0aXZlOworfQorCit2b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNl
Ojp1cGRhdGVNYXJnaW5BZnRlckZvclByZXZpb3VzU2libGluZyhCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0JiBibG9ja0Zvcm1hdHRpbmdDb250ZXh0LCBjb25zdCBNYXJnaW5Db2xsYXBzZSYgbWFyZ2lu
Q29sbGFwc2UsIGNvbnN0IEJveCYgbGF5b3V0Qm94KQoreworICAgIC8vIDEuIEdldCB0aGUgbWFy
Z2luIGJlZm9yZSB2YWx1ZSBmcm9tIHRoZSBuZXh0IGluLWZsb3cgc2libGluZy4gVGhpcyBpcyB0
aGUgc2FtZSBhcyB0aGlzIGJveCdzIG1hcmdpbiBhZnRlciB2YWx1ZSBub3cgc2luY2UgdGhleSBh
cmUgY29sbGFwc2VkLgorICAgIC8vIDIuIFVwZGF0ZSB0aGUgY29sbGFwc2VkIG1hcmdpbiBhZnRl
ciB2YWx1ZSBhcyB3ZWxsIGFzIHRoZSBwb3NpdGl2ZS9uZWdhdGl2ZSBjYWNoZS4KKyAgICAvLyAz
LiBDaGVjayBpZiB0aGUgYm94J3MgbWFyZ2lucyBjb2xsYXBzZSB0aHJvdWdoLgorICAgIC8vIDQu
IElmIHNvLCB1cGRhdGUgdGhlIHBvc2l0aXZlL25lZ2F0aXZlIGNhY2hlLgorICAgIC8vIDUuIElu
IGNhc2Ugb2YgY29sbGFwc2VkIHRocm91Z2ggbWFyZ2lucyBjaGVjayBpZiB0aGUgYmVmb3JlIG1h
cmdpbiBjb2xsYXBlcyB3aXRoIHRoZSBwcmV2aW91cyBpbmZsb3cgc2libGluZydzIGFmdGVyIG1h
cmdpbi4KKyAgICAvLyA2LiBJZiBzbywganVtcCB0byAjMi4KKyAgICAvLyA3LiBObyBuZWVkIHRv
IHByb3BhZ2F0ZSB0byBwYXJlbnQgYmVjYXVzZSBpdHMgbWFyZ2luIGlzIG5vdCBjb21wdXRlZCB5
ZXQgKHByZS1jb21wdXRlZCBhdCBtb3N0KS4KKyAgICBhdXRvKiBjdXJyZW50Qm94ID0gJmxheW91
dEJveDsKKyAgICBhdXRvJiBibG9ja0Zvcm1hdHRpbmdTdGF0ZSA9IGJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQuZm9ybWF0dGluZ1N0YXRlKCk7CisgICAgd2hpbGUgKG1hcmdpbkNvbGxhcHNlLm1hcmdp
bkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVudEJv
eCkpIHsKKyAgICAgICAgYXV0byYgcHJldmlvdXNTaWJsaW5nID0gKmN1cnJlbnRCb3gtPnByZXZp
b3VzSW5GbG93U2libGluZygpOworICAgICAgICBhdXRvIHByZXZpb3VzU2libGluZ1ZlcnRpY2Fs
TWFyZ2luID0gYmxvY2tGb3JtYXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKHByZXZpb3Vz
U2libGluZyk7CisKKyAgICAgICAgYXV0byBjb2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkJlZm9yZSA9
IHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLmNvbGxhcHNlZFZhbHVlcy5iZWZvcmU7Cisg
ICAgICAgIGF1dG8gY29sbGFwc2VkVmVydGljYWxNYXJnaW5BZnRlciA9IGJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goKmN1cnJlbnRCb3gpLm1hcmdpbkJlZm9yZSgpOworCisg
ICAgICAgIGF1dG8gbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCA9IG1hcmdpbkNvbGxhcHNlLm1hcmdp
bnNDb2xsYXBzZVRocm91Z2gocHJldmlvdXNTaWJsaW5nKTsKKyAgICAgICAgaWYgKG1hcmdpbnND
b2xsYXBzZVRocm91Z2gpCisgICAgICAgICAgICBjb2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkJlZm9y
ZSA9IGNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luQWZ0ZXI7CisKKyAgICAgICAgLy8gVXBkYXRlIHBv
c2l0aXZlL25lZ2F0aXZlIGNhY2hlLgorICAgICAgICBhdXRvIHByZXZpb3VzU2libGluZ1Bvc2l0
aXZlTmVnYXRpdmVNYXJnaW4gPSBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJn
aW4ocHJldmlvdXNTaWJsaW5nKS5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzOworICAgICAgICBh
dXRvIHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUgPSBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51
c2VkVmVydGljYWxNYXJnaW4oKmN1cnJlbnRCb3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMu
YmVmb3JlOworCisgICAgICAgIGF1dG8gYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1h
cmdpbiA9IHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luOworICAgICAgICBhZGp1c3RlZFBy
ZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0
ZXIgPSBtYXJnaW5Db2xsYXBzZS5jb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4ocG9z
aXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSwgcHJldmlvdXNTaWJsaW5nUG9zaXRpdmVOZWdhdGl2
ZU1hcmdpbi5hZnRlcik7CisgICAgICAgIGlmIChtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKSB7Cisg
ICAgICAgICAgICBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZl
QW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlID0gbWFyZ2luQ29sbGFwc2UuY29tcHV0ZWRQb3NpdGl2
ZUFuZE5lZ2F0aXZlTWFyZ2luKHByZXZpb3VzU2libGluZ1Bvc2l0aXZlTmVnYXRpdmVNYXJnaW4u
YmVmb3JlLCBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5k
TmVnYXRpdmVWYWx1ZXMuYWZ0ZXIpOworICAgICAgICAgICAgYWRqdXN0ZWRQcmV2aW91c1NpYmxp
bmdWZXJ0aWNhbE1hcmdpbi5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmFmdGVyID0gYWRqdXN0
ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbi5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVz
LmJlZm9yZTsKKyAgICAgICAgfQorICAgICAgICBibG9ja0Zvcm1hdHRpbmdTdGF0ZS5zZXRVc2Vk
VmVydGljYWxNYXJnaW4ocHJldmlvdXNTaWJsaW5nLCBhZGp1c3RlZFByZXZpb3VzU2libGluZ1Zl
cnRpY2FsTWFyZ2luKTsKKworICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2gpCisg
ICAgICAgICAgICBicmVhazsKKworICAgICAgICBjdXJyZW50Qm94ID0gJnByZXZpb3VzU2libGlu
ZzsKKyAgICB9Cit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBh
aXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9zaXRp
dmVOZWdhdGl2ZVZhbHVlcyhjb25zdCBCb3gmIGxheW91dEJveCwgTWFyZ2luVHlwZSBtYXJnaW5U
eXBlKSBjb25zdAoreworICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IGZvcm1hdHRpbmdDb250
ZXh0KCkuZm9ybWF0dGluZ1N0YXRlKCk7CisgICAgLy8gQnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUg
aW4gQkZDIGxheW91dCB0byBnYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1
ZXMgZm9yIGVpdGhlciBhIHByZXZpb3VzIHNpYmxpbmcgb3IgYSBjaGlsZCBib3gsCisgICAgLy8g
d2UgbXVzaCBoYXZlIGNvbXB1dGVkIGFuZCBjYWNoZWQgdGhvc2UgdmFsdWVzLgorICAgIEFTU0VS
VChmb3JtYXR0aW5nU3RhdGUuaGFzVXNlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCkpOworICAg
IGF1dG8gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luID0gZm9ybWF0dGluZ1N0YXRl
LnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXM7
CisgICAgcmV0dXJuIG1hcmdpblR5cGUgPT0gTWFyZ2luVHlwZTo6QmVmb3JlID8gcG9zaXRpdmVB
bmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSA6IHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0
aWNhbE1hcmdpbi5hZnRlcjsgCit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmRO
ZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBz
ZTo6cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCwgVXNl
ZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBj
b25zdAoreworICAgIGF1dG8gZmlyc3RDaGlsZENvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IFsmXSgp
IC0+IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7
CisgICAgICAgIGlmICghbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRN
YXJnaW5CZWZvcmUobGF5b3V0Qm94KSkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAg
IHJldHVybiBwb3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKCpkb3duY2FzdDxDb250YWluZXJCb3g+KGxh
eW91dEJveCkuZmlyc3RJbkZsb3dDaGlsZCgpLCBNYXJnaW5UeXBlOjpCZWZvcmUpOworICAgIH07
CisKKyAgICBhdXRvIHByZXZpb3VTaWJsaW5nQ29sbGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAt
PiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgewor
ICAgICAgICBpZiAoIW1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJn
aW5BZnRlcihsYXlvdXRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgcmV0
dXJuIHBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMoKmxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxp
bmcoKSwgTWFyZ2luVHlwZTo6QWZ0ZXIpOworICAgIH07CisKKyAgICAvLyAxLiBHYXRoZXIgcG9z
aXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZnJvbSBmaXJzdCBjaGlsZCBpZiBtYXJn
aW5zIGFyZSBhZGpvaW5pbmcuCisgICAgLy8gMi4gR2F0aGVyIHBvc2l0aXZlIGFuZCBuZWdhdGl2
ZSBtYXJnaW4gdmFsdWVzIGZyb20gcHJldmlvdXMgaW5mbG93IHNpYmxpbmcgaWYgbWFyZ2lucyBh
cmUgYWRqb2luaW5nLgorICAgIC8vIDMuIENvbXB1dGUgbWluL21heCBwb3NpdGl2ZSBhbmQgbmVn
YXRpdmUgY29sbGFwc2VkIG1hcmdpbiB2YWx1ZXMgdXNpbmcgbm9uLWNvbGxwYXNlZCBjb21wdXRl
ZCBtYXJnaW4gYmVmb3JlLgorICAgIGF1dG8gY29sbGFwc2VkTWFyZ2luQmVmb3JlID0gY29tcHV0
ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKGZpcnN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5CZWZv
cmUoKSwgcHJldmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5BZnRlcigpKTsKKyAgICBpZiAoY29s
bGFwc2VkTWFyZ2luQmVmb3JlLmlzUXVpcmsgJiYgZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3Mo
KS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihsYXlvdXRCb3gpKQorICAgICAgICBj
b2xsYXBzZWRNYXJnaW5CZWZvcmUgPSB7IH07CisKKyAgICBVc2VkVmVydGljYWxNYXJnaW46OlBv
c2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgbm9uQ29sbGFwc2VkQmVmb3JlOworICAgIGlm
IChub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlID4gMCkKKyAgICAgICAgbm9uQ29sbGFwc2VkQmVm
b3JlID0geyBub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlLCB7IH0sIGxheW91dEJveC5zdHlsZSgp
Lmhhc01hcmdpbkJlZm9yZVF1aXJrKCkgfTsKKyAgICBlbHNlIGlmIChub25Db2xsYXBzZWRWYWx1
ZXMuYmVmb3JlIDwgMCkKKyAgICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0geyB7IH0sIG5vbkNv
bGxhcHNlZFZhbHVlcy5iZWZvcmUsIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkJlZm9yZVF1
aXJrKCkgfTsKKworICAgIHJldHVybiBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4o
Y29sbGFwc2VkTWFyZ2luQmVmb3JlLCBub25Db2xsYXBzZWRCZWZvcmUpOworfQorCitVc2VkVmVy
dGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OnBvc2l0aXZlTmVnYXRpdmVNYXJnaW5BZnRlcihj
b25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1
ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAoreworICAgIGF1dG8gbGFzdENoaWxkQ29sbGFw
c2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5k
TmVnYXRpdmVQYWlyOjpWYWx1ZXMgeworICAgICAgICBpZiAoIW1hcmdpbkFmdGVyQ29sbGFwc2Vz
V2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFmdGVyKGxheW91dEJveCkpCisgICAgICAgICAgICBy
ZXR1cm4geyB9OworICAgICAgICByZXR1cm4gcG9zaXRpdmVOZWdhdGl2ZVZhbHVlcygqZG93bmNh
c3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmxhc3RJbkZsb3dDaGlsZCgpLCBNYXJnaW5UeXBl
OjpBZnRlcik7CisgICAgfTsKKworICAgIC8vIFdlIGRvbid0IGtub3cgeWV0IHRoZSBtYXJnaW4g
YmVmb3JlIHZhbHVlIG9mIHRoZSBuZXh0IHNpYmxpbmcuIExldCdzIGp1c3QgcHJldGVuZCBpdCBk
b2VzIG5vdCBoYXZlIG9uZSBhbmQgCisgICAgLy8gdXBkYXRlIGl0IGxhdGVyIHdoZW4gd2UgY29t
cHV0ZSB0aGUgbmV4dCBzaWJsaW5nJ3MgbWFyZ2luIGJlZm9yZS4gU2VlIHVwZGF0ZU1hcmdpbkFm
dGVyRm9yUHJldmlvdXNTaWJsaW5nLgorICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVB
bmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBub25Db2xsYXBzZWRBZnRlcjsKKyAgICBpZiAobm9uQ29s
bGFwc2VkVmFsdWVzLmFmdGVyID4gMCkKKyAgICAgICAgbm9uQ29sbGFwc2VkQWZ0ZXIgPSB7IG5v
bkNvbGxhcHNlZFZhbHVlcy5hZnRlciwgeyB9LCBsYXlvdXRCb3guc3R5bGUoKS5oYXNNYXJnaW5B
ZnRlclF1aXJrKCkgfTsKKyAgICBlbHNlIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIgPCAw
KQorICAgICAgICBub25Db2xsYXBzZWRBZnRlciA9IHsgeyB9LCBub25Db2xsYXBzZWRWYWx1ZXMu
YWZ0ZXIsIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkFmdGVyUXVpcmsoKSB9OworCisgICAg
cmV0dXJuIGNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihsYXN0Q2hpbGRDb2xsYXBz
ZWRNYXJnaW5BZnRlcigpLCBub25Db2xsYXBzZWRBZnRlcik7Cit9CisKK0xheW91dFVuaXQgQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUlnbm9yaW5n
Q29sbGFwc2luZ1Rocm91Z2goY29uc3QgQm94JiBsYXlvdXRCb3gsIFVzZWRWZXJ0aWNhbE1hcmdp
bjo6Tm9uQ29sbGFwc2VkVmFsdWVzIG5vbkNvbGxhcHNlZFZhbHVlcykKK3sKKyAgICBBU1NFUlQo
bGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKKyAgICByZXR1cm4gbWFyZ2luVmFsdWUocG9z
aXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gsIG5vbkNvbGxhcHNlZFZhbHVlcykp
LnZhbHVlT3Iobm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSk7Cit9CisKK1VzZWRWZXJ0aWNhbE1h
cmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6Y29sbGFwc2VkVmVy
dGljYWxWYWx1ZXMoY29uc3QgQm94JiBsYXlvdXRCb3gsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9u
Q29sbGFwc2VkVmFsdWVzIG5vbkNvbGxhcHNlZFZhbHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0
Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKKyAgICAvLyAxLiBHZXQgbWluL21heCBtYXJnaW4gdG9w
IHZhbHVlcyBmcm9tIHRoZSBmaXJzdCBpbi1mbG93IGNoaWxkIGlmIHdlIGFyZSBjb2xsYXBzaW5n
IG1hcmdpbiB0b3Agd2l0aCBpdC4KKyAgICAvLyAyLiBHZXQgbWluL21heCBtYXJnaW4gdG9wIHZh
bHVlcyBmcm9tIHRoZSBwcmV2aW91cyBpbi1mbG93IHNpYmxpbmcsIGlmIHdlIGFyZSBjb2xsYXBz
aW5nIG1hcmdpbiB0b3Agd2l0aCBpdC4KKyAgICAvLyAzLiBHZXQgdGhpcyBsYXlvdXQgYm94J3Mg
Y29tcHV0ZWQgbWFyZ2luIHRvcCB2YWx1ZS4KKyAgICAvLyA0LiBVcGRhdGUgdGhlIG1pbi9tYXgg
dmFsdWUgYW5kIGNvbXB1dGUgdGhlIGZpbmFsIG1hcmdpbi4KKyAgICBhdXRvIHBvc2l0aXZlQW5k
TmVnYXRpdmVWZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmRO
ZWdhdGl2ZVBhaXIgeyB0aGlzLT5wb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGxheW91dEJv
eCwgbm9uQ29sbGFwc2VkVmFsdWVzKSwgdGhpcy0+cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkFmdGVy
KGxheW91dEJveCwgbm9uQ29sbGFwc2VkVmFsdWVzKSB9OworCisgICAgYXV0byBtYXJnaW5zQ29s
bGFwc2VUaHJvdWdoID0gdGhpcy0+bWFyZ2luc0NvbGxhcHNlVGhyb3VnaChsYXlvdXRCb3gpOwor
ICAgIGlmIChtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKSB7CisgICAgICAgIHBvc2l0aXZlQW5kTmVn
YXRpdmVWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPSBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVN
YXJnaW4ocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSwgcG9zaXRpdmVB
bmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyKTsKKyAgICAgICAgcG9zaXRpdmVBbmROZWdh
dGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyID0gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFy
Z2luLmJlZm9yZTsKKyAgICB9CisKKyAgICBhdXRvIGhhc0NvbGxhcHNlZE1hcmdpbkJlZm9yZSA9
IG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxkTWFyZ2luQmVmb3JlKGxh
eW91dEJveCkgfHwgbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdp
bkFmdGVyKGxheW91dEJveCk7CisgICAgYXV0byBoYXNDb2xsYXBzZWRNYXJnaW5BZnRlciA9IG1h
cmdpbkFmdGVyQ29sbGFwc2VzV2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFmdGVyKGxheW91dEJv
eCk7CisgICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW4geyBu
b25Db2xsYXBzZWRWYWx1ZXMsIHsgfSwgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2lu
IH07CisKKyAgICBpZiAoKGhhc0NvbGxhcHNlZE1hcmdpbkJlZm9yZSAmJiBoYXNDb2xsYXBzZWRN
YXJnaW5BZnRlcikgfHwgbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCkKKyAgICAgICAgdXNlZFZlcnRp
Y2FsTWFyZ2luLmNvbGxhcHNlZFZhbHVlcyA9IHsgbWFyZ2luVmFsdWUocG9zaXRpdmVBbmROZWdh
dGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSksIG1hcmdpblZhbHVlKHBvc2l0aXZlQW5kTmVnYXRp
dmVWZXJ0aWNhbE1hcmdpbi5hZnRlciksIG1hcmdpbnNDb2xsYXBzZVRocm91Z2ggfTsKKyAgICBl
bHNlIGlmIChoYXNDb2xsYXBzZWRNYXJnaW5CZWZvcmUpCisgICAgICAgIHVzZWRWZXJ0aWNhbE1h
cmdpbi5jb2xsYXBzZWRWYWx1ZXMgPSB7IG1hcmdpblZhbHVlKHBvc2l0aXZlQW5kTmVnYXRpdmVW
ZXJ0aWNhbE1hcmdpbi5iZWZvcmUpLCB7IH0sIGZhbHNlIH07CisgICAgZWxzZSBpZiAoaGFzQ29s
bGFwc2VkTWFyZ2luQWZ0ZXIpCisgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRW
YWx1ZXMgPSB7IHsgfSwgbWFyZ2luVmFsdWUocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFy
Z2luLmFmdGVyKSwgZmFsc2UgfTsKKyAgICByZXR1cm4gdXNlZFZlcnRpY2FsTWFyZ2luOworfQor
Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL1ByZWNvbXB1dGVkQmxvY2tNYXJnaW5Db2xsYXBz
ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9y
bWF0dGluZy9QcmVjb21wdXRlZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRl
ZmIzZDU1NGZlNjhkZTQyNzMxZmY4ZTJkNGIyMGVhYmY2NTllYzIKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGlu
Zy9QcmVjb21wdXRlZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCkBAIC0wLDAgKzEsMTAwIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisj
aW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIK
KyNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5o
IgorI2luY2x1ZGUgIkxheW91dFVuaXQuaCIKKyNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworVXNlZFZlcnRpY2FsTWFy
Z2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6Ok1hcmdpbkNvbGxhcHNlOjpwcmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMoY29u
c3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgYXV0byYgYmxvY2tGb3JtYXR0aW5nU3Rh
dGUgPSBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4obGF5b3V0U3RhdGUoKS5mb3JtYXR0
aW5nU3RhdGVGb3JCb3gobGF5b3V0Qm94KSk7CisgICAgaWYgKGJsb2NrRm9ybWF0dGluZ1N0YXRl
Lmhhc1VzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gYmxvY2tG
b3JtYXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCkucG9zaXRpdmVBbmRO
ZWdhdGl2ZVZhbHVlcy5iZWZvcmU7CisKKyAgICBhdXRvIGdlb21ldHJ5ID0gZm9ybWF0dGluZ0Nv
bnRleHQoKS5nZW9tZXRyeSgpOworICAgIGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRzID0gZ2Vv
bWV0cnkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KGxheW91dEJveC5jb250YWluaW5nQmxv
Y2soKSkuaG9yaXpvbnRhbDsKKyAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBnZW9t
ZXRyeS5jb21wdXRlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFp
bnRzKTsKKyAgICBhdXRvIG5vbkNvbGxhcHNlZE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6
Tm9uQ29sbGFwc2VkVmFsdWVzIHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVP
cigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgcmV0
dXJuIHByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gsIG5v
bkNvbGxhcHNlZE1hcmdpbik7Cit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmRO
ZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBz
ZTo6cHJlY29tcHV0ZWRQb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyBub25Db2xsYXBz
ZWRWYWx1ZXMpIGNvbnN0Cit7CisgICAgYXV0byBmaXJzdENoaWxkQ29sbGFwc2VkTWFyZ2luQmVm
b3JlID0gWyZdKCkgLT4gVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFp
cjo6VmFsdWVzIHsKKyAgICAgICAgaWYgKCFtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoRmlyc3RJ
bkZsb3dDaGlsZE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIHsg
fTsKKyAgICAgICAgcmV0dXJuIHByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZVZhbHVlcygqZG93
bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93Q2hpbGQoKSk7CisgICAg
fTsKKworICAgIGF1dG8gcHJldmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5BZnRlciA9IFsmXSgp
IC0+IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7
CisgICAgICAgIGlmICghbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01h
cmdpbkFmdGVyKGxheW91dEJveCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICBh
dXRvJiBwcmV2aW91c0luRmxvd1NpYmxpbmcgPSAqbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2li
bGluZygpOworICAgICAgICBhdXRvJiBibG9ja0Zvcm1hdHRpbmdTdGF0ZSA9IGRvd25jYXN0PEJs
b2NrRm9ybWF0dGluZ1N0YXRlPihsYXlvdXRTdGF0ZSgpLmZvcm1hdHRpbmdTdGF0ZUZvckJveChw
cmV2aW91c0luRmxvd1NpYmxpbmcpKTsKKyAgICAgICAgcmV0dXJuIGJsb2NrRm9ybWF0dGluZ1N0
YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihwcmV2aW91c0luRmxvd1NpYmxpbmcpLnBvc2l0aXZlQW5k
TmVnYXRpdmVWYWx1ZXMuYWZ0ZXI7CisgICAgfTsKKworICAgIC8vIDEuIEdhdGhlciBwb3NpdGl2
ZSBhbmQgbmVnYXRpdmUgbWFyZ2luIHZhbHVlcyBmcm9tIGZpcnN0IGNoaWxkIGlmIG1hcmdpbnMg
YXJlIGFkam9pbmluZy4KKyAgICAvLyAyLiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1h
cmdpbiB2YWx1ZXMgZnJvbSBwcmV2aW91cyBpbmZsb3cgc2libGluZyBpZiBtYXJnaW5zIGFyZSBh
ZGpvaW5pbmcuCisgICAgLy8gMy4gQ29tcHV0ZSBtaW4vbWF4IHBvc2l0aXZlIGFuZCBuZWdhdGl2
ZSBjb2xsYXBzZWQgbWFyZ2luIHZhbHVlcyB1c2luZyBub24tY29sbHBhc2VkIGNvbXB1dGVkIG1h
cmdpbiBiZWZvcmUuCisgICAgYXV0byBjb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSBjb21wdXRlZFBv
c2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4oZmlyc3RDaGlsZENvbGxhcHNlZE1hcmdpbkJlZm9yZSgp
LCBwcmV2aW91U2libGluZ0NvbGxhcHNlZE1hcmdpbkFmdGVyKCkpOworICAgIGlmIChjb2xsYXBz
ZWRNYXJnaW5CZWZvcmUuaXNRdWlyayAmJiBmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJrcygpLnNo
b3VsZElnbm9yZUNvbGxhcHNlZFF1aXJrTWFyZ2luKGxheW91dEJveCkpCisgICAgICAgIGNvbGxh
cHNlZE1hcmdpbkJlZm9yZSA9IHsgfTsKKworICAgIGF1dG8gbm9uQ29sbGFwc2VkQmVmb3JlID0g
VXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHsgfTsK
KyAgICBpZiAobm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSA+IDApCisgICAgICAgIG5vbkNvbGxh
cHNlZEJlZm9yZSA9IHsgbm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSwgeyB9LCBsYXlvdXRCb3gu
c3R5bGUoKS5oYXNNYXJnaW5CZWZvcmVRdWlyaygpIH07CisgICAgZWxzZSBpZiAobm9uQ29sbGFw
c2VkVmFsdWVzLmJlZm9yZSA8IDApCisgICAgICAgIG5vbkNvbGxhcHNlZEJlZm9yZSA9IHsgeyB9
LCBub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlLCBsYXlvdXRCb3guc3R5bGUoKS5oYXNNYXJnaW5C
ZWZvcmVRdWlyaygpIH07CisKKyAgICByZXR1cm4gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZl
TWFyZ2luKGNvbGxhcHNlZE1hcmdpbkJlZm9yZSwgbm9uQ29sbGFwc2VkQmVmb3JlKTsKK30KKwor
UHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29s
bGFwc2U6OnByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBVc2Vk
VmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB1c2VkTm9uQ29sbGFwc2VkTWFyZ2lu
KQoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworICAgIC8vIERv
bid0IHByZS1jb21wdXRlIHZlcnRpY2FsIG1hcmdpbnMgZm9yIG91dCBvZiBmbG93IGJveGVzLgor
ICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSB8fCBsYXlvdXRCb3guaXNGbG9hdGluZ1Bv
c2l0aW9uZWQoKSk7CisgICAgQVNTRVJUKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKKwor
ICAgIGF1dG8gcG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IHByZWNvbXB1dGVkUG9zaXRp
dmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gsIHVzZWROb25Db2xsYXBzZWRNYXJnaW4p
OworICAgIGF1dG8gY29sbGFwc2VkTWFyZ2luQmVmb3JlID0gbWFyZ2luVmFsdWUocG9zaXRpdmVO
ZWdhdGl2ZU1hcmdpbkJlZm9yZSk7CisgICAgcmV0dXJuIHsgdXNlZE5vbkNvbGxhcHNlZE1hcmdp
bi5iZWZvcmUsIGNvbGxhcHNlZE1hcmdpbkJlZm9yZSwgcG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJl
Zm9yZSB9OworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJs
ZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdy
YXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hYzZkZjY1Y2E0YmI3
MTM2MDRlYWI3MDAxNmNmN2RlZjFjMjJmMDRkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFw
cGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCkBAIC0wLDAgKzEsMjM4
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRhYmxlV3Jh
cHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNs
dWRlICJJbnZhbGlkYXRpb25TdGF0ZS5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5Lmgi
CisjaW5jbHVkZSAiTGF5b3V0Q2hpbGRJdGVyYXRvci5oIgorI2luY2x1ZGUgIkxheW91dENvbnRl
eHQuaCIKKyNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVk
ZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0
YXRlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZf
TUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4
dCk7CisKK1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlV3JhcHBlckJs
b2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4
dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCisgICAgOiBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgZm9ybWF0dGluZ1N0YXRl
KQoreworfQorCit2b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmxheW91
dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0Zvcklu
Rmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAgIC8vIFRoZSB0YWJsZSBnZW5lcmF0ZXMg
YSBwcmluY2lwYWwgYmxvY2sgY29udGFpbmVyIGJveCBjYWxsZWQgdGhlIHRhYmxlIHdyYXBwZXIg
Ym94IHRoYXQgY29udGFpbnMgdGhlIHRhYmxlIGJveCBpdHNlbGYgYW5kIGFueSBjYXB0aW9uIGJv
eGVzCisgICAgLy8gKGluIGRvY3VtZW50IG9yZGVyKS4gVGhlIHRhYmxlIGJveCBpcyBhIGJsb2Nr
LWxldmVsIGJveCB0aGF0IGNvbnRhaW5zIHRoZSB0YWJsZSdzIGludGVybmFsIHRhYmxlIGJveGVz
LgorICAgIC8vIFRoZSBjYXB0aW9uIGJveGVzIGFyZSBwcmluY2lwYWwgYmxvY2stbGV2ZWwgYm94
ZXMgdGhhdCByZXRhaW4gdGhlaXIgb3duIGNvbnRlbnQsIHBhZGRpbmcsIG1hcmdpbiwgYW5kIGJv
cmRlciBhcmVhcywgYW5kIGFyZSByZW5kZXJlZAorICAgIC8vIGFzIG5vcm1hbCBibG9jayBib3hl
cyBpbnNpZGUgdGhlIHRhYmxlIHdyYXBwZXIgYm94LiBXaGV0aGVyIHRoZSBjYXB0aW9uIGJveGVz
IGFyZSBwbGFjZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSB0YWJsZSBib3ggaXMgZGVjaWRlZCBieQor
ICAgIC8vIHRoZSAnY2FwdGlvbi1zaWRlJyBwcm9wZXJ0eSwgYXMgZGVzY3JpYmVkIGJlbG93Lgor
ICAgIGZvciAoYXV0byYgY2hpbGQgOiBjaGlsZHJlbk9mVHlwZTxDb250YWluZXJCb3g+KHJvb3Qo
KSkpIHsKKyAgICAgICAgaWYgKGNoaWxkLmlzVGFibGVCb3goKSkKKyAgICAgICAgICAgIGxheW91
dFRhYmxlQm94KGNoaWxkLCBjb25zdHJhaW50cyk7CisgICAgICAgIGVsc2UgaWYgKGNoaWxkLmlz
VGFibGVDYXB0aW9uKCkpCisgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgp
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9
Cit9CisKK3ZvaWQgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0VGFi
bGVCb3goY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCwgY29uc3QgQ29uc3RyYWludHNGb3JJ
bkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKK3sKKyAgICBsYXlvdXRTdGF0ZSgpLmVuc3VyZVRh
YmxlRm9ybWF0dGluZ1N0YXRlKHRhYmxlQm94KTsKKworICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRk
aW5nRm9yVGFibGVCb3godGFibGVCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgIGNv
bXB1dGVTdGF0aWNWZXJ0aWNhbFBvc2l0aW9uKHRhYmxlQm94LCBjb25zdHJhaW50cy52ZXJ0aWNh
bCk7CisgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luRm9yVGFibGVCb3godGFibGVCb3gsIGNvbnN0
cmFpbnRzLmhvcml6b250YWwpOworICAgIGNvbXB1dGVTdGF0aWNIb3Jpem9udGFsUG9zaXRpb24o
dGFibGVCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworCisgICAgaWYgKHRhYmxlQm94Lmhh
c0NoaWxkKCkpIHsKKyAgICAgICAgYXV0byBpbnZhbGlkYXRpb25TdGF0ZSA9IEludmFsaWRhdGlv
blN0YXRlIHsgfTsKKyAgICAgICAgTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRl
eHQodGFibGVCb3gsIGxheW91dFN0YXRlKCkpLT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRh
dGlvblN0YXRlLCBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCh0YWJsZUJv
eCkpOworICAgIH0KKworICAgIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW5Gb3JUYWJsZUJveCh0YWJs
ZUJveCwgY29uc3RyYWludHMpOworfQorCit2b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ6OmNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nRm9yVGFibGVCb3goY29uc3QgQ29udGFp
bmVyQm94JiB0YWJsZUJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFs
Q29uc3RyYWludHMpCit7CisgICAgQVNTRVJUKHRhYmxlQm94LmlzVGFibGVCb3goKSk7CisgICAg
aWYgKCF0YWJsZUJveC5oYXNDaGlsZCgpIHx8IHRhYmxlQm94LnN0eWxlKCkuYm9yZGVyQ29sbGFw
c2UoKSA9PSBCb3JkZXJDb2xsYXBzZTo6U2VwYXJhdGUpIHsKKyAgICAgICAgQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmcodGFibGVCb3gsIGhvcml6b250YWxD
b25zdHJhaW50cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gVUFzIG11c3QgY29t
cHV0ZSBhbiBpbml0aWFsIGxlZnQgYW5kIHJpZ2h0IGJvcmRlciB3aWR0aCBmb3IgdGhlIHRhYmxl
IGJ5IGV4YW1pbmluZworICAgIC8vIHRoZSBmaXJzdCBhbmQgbGFzdCBjZWxscyBpbiB0aGUgZmly
c3Qgcm93IG9mIHRoZSB0YWJsZS4KKyAgICAvLyBUaGUgbGVmdCBib3JkZXIgd2lkdGggb2YgdGhl
IHRhYmxlIGlzIGhhbGYgb2YgdGhlIGZpcnN0IGNlbGwncyBjb2xsYXBzZWQgbGVmdCBib3JkZXIs
CisgICAgLy8gYW5kIHRoZSByaWdodCBib3JkZXIgd2lkdGggb2YgdGhlIHRhYmxlIGlzIGhhbGYg
b2YgdGhlIGxhc3QgY2VsbCdzIGNvbGxhcHNlZCByaWdodCBib3JkZXIuCisgICAgLy8gVGhlIHRv
cCBib3JkZXIgd2lkdGggb2YgdGhlIHRhYmxlIGlzIGNvbXB1dGVkIGJ5IGV4YW1pbmluZyBhbGwg
Y2VsbHMgd2hvIGNvbGxhcHNlIHRoZWlyIHRvcAorICAgIC8vIGJvcmRlcnMgd2l0aCB0aGUgdG9w
IGJvcmRlciBvZiB0aGUgdGFibGUuIFRoZSB0b3AgYm9yZGVyIHdpZHRoIG9mIHRoZSB0YWJsZSBp
cyBlcXVhbCB0byBoYWxmIG9mIHRoZQorICAgIC8vIG1heGltdW0gY29sbGFwc2VkIHRvcCBib3Jk
ZXIuIFRoZSBib3R0b20gYm9yZGVyIHdpZHRoIGlzIGNvbXB1dGVkIGJ5IGV4YW1pbmluZyBhbGwg
Y2VsbHMgd2hvc2UgYm90dG9tIGJvcmRlcnMgY29sbGFwc2UKKyAgICAvLyB3aXRoIHRoZSBib3R0
b20gb2YgdGhlIHRhYmxlLiBUaGUgYm90dG9tIGJvcmRlciB3aWR0aCBpcyBlcXVhbCB0byBoYWxm
IG9mIHRoZSBtYXhpbXVtIGNvbGxhcHNlZCBib3R0b20gYm9yZGVyLgorICAgIGF1dG8mIGdyaWQg
PSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkVGFibGVGb3JtYXR0aW5nU3RhdGUodGFibGVCb3gp
LnRhYmxlR3JpZCgpOworICAgIGF1dG8gdGFibGVCb3JkZXIgPSBnZW9tZXRyeSgpLmNvbXB1dGVk
Qm9yZGVyKHRhYmxlQm94KTsKKworICAgIGF1dG8mIGZpcnN0Q29sdW1uRmlyc3RSb3dCb3ggPSBn
cmlkLnNsb3QoeyAwICwgMCB9KS0+Y2VsbCgpLmJveCgpOworICAgIGF1dG8gbGVmdEJvcmRlciA9
IHN0ZDo6bWF4KHRhYmxlQm9yZGVyLmhvcml6b250YWwubGVmdCwgZ2VvbWV0cnkoKS5jb21wdXRl
ZEJvcmRlcihmaXJzdENvbHVtbkZpcnN0Um93Qm94KS5ob3Jpem9udGFsLmxlZnQpOworCisgICAg
YXV0byYgbGFzdENvbHVtbkZpcnN0Um93ID0gZ3JpZC5zbG90KHsgZ3JpZC5jb2x1bW5zKCkuc2l6
ZSgpIC0gMSwgMCB9KS0+Y2VsbCgpLmJveCgpOworICAgIGF1dG8gcmlnaHRCb3JkZXIgPSBzdGQ6
Om1heCh0YWJsZUJvcmRlci5ob3Jpem9udGFsLnJpZ2h0LCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9y
ZGVyKGxhc3RDb2x1bW5GaXJzdFJvdykuaG9yaXpvbnRhbC5yaWdodCk7CisKKyAgICBhdXRvIHRv
cEJvcmRlciA9IHRhYmxlQm9yZGVyLnZlcnRpY2FsLnRvcDsKKyAgICBhdXRvIGJvdHRvbUJvcmRl
ciA9IHRhYmxlQm9yZGVyLnZlcnRpY2FsLmJvdHRvbTsKKyAgICBhdXRvIGxhc3RSb3dJbmRleCA9
IGdyaWQucm93cygpLnNpemUoKSAtIDE7CisgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAw
OyBjb2x1bW5JbmRleCA8IGdyaWQuY29sdW1ucygpLnNpemUoKTsgKytjb2x1bW5JbmRleCkgewor
ICAgICAgICBhdXRvJiBib3hJbkZpcnN0Um94ID0gZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIDAg
fSktPmNlbGwoKS5ib3goKTsKKyAgICAgICAgYXV0byYgYm94SW5MYXN0Um93ID0gZ3JpZC5zbG90
KHsgY29sdW1uSW5kZXgsIGxhc3RSb3dJbmRleCB9KS0+Y2VsbCgpLmJveCgpOworCisgICAgICAg
IHRvcEJvcmRlciA9IHN0ZDo6bWF4KHRvcEJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRl
cihib3hJbkZpcnN0Um94KS52ZXJ0aWNhbC50b3ApOworICAgICAgICBib3R0b21Cb3JkZXIgPSBz
dGQ6Om1heChib3R0b21Cb3JkZXIsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIoYm94SW5MYXN0
Um93KS52ZXJ0aWNhbC5ib3R0b20pOworICAgIH0KKworICAgIHRvcEJvcmRlciA9IHN0ZDo6bWF4
KHRvcEJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcigqdGFibGVCb3guZmlyc3RDaGls
ZCgpKS52ZXJ0aWNhbC50b3ApOworICAgIGZvciAoYXV0byYgc2VjdGlvbiA6IGNoaWxkcmVuT2ZU
eXBlPENvbnRhaW5lckJveD4odGFibGVCb3gpKSB7CisgICAgICAgIGF1dG8gaG9yaXp0b25hbEJv
cmRlciA9IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIoc2VjdGlvbikuaG9yaXpvbnRhbDsKKyAg
ICAgICAgbGVmdEJvcmRlciA9IHN0ZDo6bWF4KGxlZnRCb3JkZXIsIGhvcml6dG9uYWxCb3JkZXIu
bGVmdCk7CisgICAgICAgIHJpZ2h0Qm9yZGVyID0gc3RkOjptYXgocmlnaHRCb3JkZXIsIGhvcml6
dG9uYWxCb3JkZXIucmlnaHQpOworICAgIH0KKyAgICBib3R0b21Cb3JkZXIgPSBzdGQ6Om1heChi
b3R0b21Cb3JkZXIsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIoKnRhYmxlQm94Lmxhc3RDaGls
ZCgpKS52ZXJ0aWNhbC5ib3R0b20pOworCisgICAgYXV0byYgcm93cyA9IGdyaWQucm93cygpLmxp
c3QoKTsKKyAgICB0b3BCb3JkZXIgPSBzdGQ6Om1heCh0b3BCb3JkZXIsIGdlb21ldHJ5KCkuY29t
cHV0ZWRCb3JkZXIocm93cy5maXJzdCgpLmJveCgpKS52ZXJ0aWNhbC50b3ApOworICAgIGZvciAo
YXV0byYgcm93IDogcm93cykgeworICAgICAgICBhdXRvIGhvcml6dG9uYWxCb3JkZXIgPSBnZW9t
ZXRyeSgpLmNvbXB1dGVkQm9yZGVyKHJvdy5ib3goKSkuaG9yaXpvbnRhbDsKKyAgICAgICAgbGVm
dEJvcmRlciA9IHN0ZDo6bWF4KGxlZnRCb3JkZXIsIGhvcml6dG9uYWxCb3JkZXIubGVmdCk7Cisg
ICAgICAgIHJpZ2h0Qm9yZGVyID0gc3RkOjptYXgocmlnaHRCb3JkZXIsIGhvcml6dG9uYWxCb3Jk
ZXIucmlnaHQpOworICAgIH0KKyAgICBib3R0b21Cb3JkZXIgPSBzdGQ6Om1heChib3R0b21Cb3Jk
ZXIsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIocm93cy5sYXN0KCkuYm94KCkpLnZlcnRpY2Fs
LmJvdHRvbSk7CisKKyAgICBhdXRvIGNvbGxhcHNlZEJvcmRlciA9IEVkZ2VzIHsgeyBsZWZ0Qm9y
ZGVyLCByaWdodEJvcmRlciB9LCB7IHRvcEJvcmRlciwgYm90dG9tQm9yZGVyIH0gfTsKKyAgICBn
cmlkLnNldENvbGxhcHNlZEJvcmRlcihjb2xsYXBzZWRCb3JkZXIpOworCisgICAgYXV0byYgYm94
R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSh0YWJsZUJveCk7CisgICAg
Ym94R2VvbWV0cnkuc2V0Qm9yZGVyKGNvbGxhcHNlZEJvcmRlciAvIDIpOworICAgIGJveEdlb21l
dHJ5LnNldFBhZGRpbmcoZ2VvbWV0cnkoKS5jb21wdXRlZFBhZGRpbmcodGFibGVCb3gsIGhvcml6
b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpKTsKK30KKwordm9pZCBUYWJsZVdyYXBwZXJC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlV2lkdGhBbmRNYXJnaW5Gb3JUYWJsZUJveChj
b25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMm
IGhvcml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBBU1NFUlQodGFibGVCb3guaXNUYWJsZUJv
eCgpKTsKKyAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCB0YWJsZSAiZml0LWNvbnRlbnQgc2l6ZSIg
YmVoYXZpb3IgaGFuZGxpbmcuIE5vdCBpbiB0aGUgc3BlYyB0aG91Z2guCisgICAgLy8gVGFibGUg
cmV0dXJucyBpdHMgZmluYWwgd2lkdGggYXMgbWluL21heC4gVXNlIHRoaXMgZmluYWwgd2lkdGgg
dmFsdWUgdG8gY29tcHV0ZWQgaG9yaXpvbnRhbCBtYXJnaW5zIGV0Yy4KKyAgICBhdXRvJiBmb3Jt
YXR0aW5nU3RhdGVGb3JUYWJsZUJveCA9IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRUYWJsZUZv
cm1hdHRpbmdTdGF0ZSh0YWJsZUJveCk7CisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07CisgICAgaWYgKGF1dG8gcHJlY29t
cHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gZm9ybWF0dGluZ1N0YXRlRm9yVGFibGVC
b3guaW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpKQorICAgICAgICBpbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzID0gKnByZWNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKKyAgICBl
bHNlIHsKKyAgICAgICAgaWYgKHRhYmxlQm94Lmhhc0NoaWxkKCkpCisgICAgICAgICAgICBpbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0Nv
bnRleHQodGFibGVCb3gsIGxheW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMoKTsKKyAgICAgICAgZm9ybWF0dGluZ1N0YXRlRm9yVGFibGVCb3guc2V0SW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyhpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKTsKKyAgICB9CisK
KyAgICBhdXRvIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSA9IGhvcml6b250YWxDb25zdHJhaW50
cy5sb2dpY2FsV2lkdGg7CisgICAgLy8gMS4gVGhlIHRhYmxlIGdlbmVyYXRlcyBhIHByaW5jaXBh
bCBibG9jayBjb250YWluZXIgYm94IGNhbGxlZCB0aGUgdGFibGUgd3JhcHBlciBib3ggdGhhdCBj
b250YWlucyB0aGUgdGFibGUgYm94IGl0c2VsZiBhbmQgYW55IGNhcHRpb24gYm94ZXMuCisgICAg
Ly8gMi4gVGhlIHRhYmxlIHdyYXBwZXIgYm94IGVzdGFibGlzaGVzIGEgYmxvY2sgZm9ybWF0dGlu
ZyBjb250ZXh0LCBhbmQgdGhlIHRhYmxlIGJveCBlc3RhYmxpc2hlcyBhIHRhYmxlIGZvcm1hdHRp
bmcgY29udGV4dC4KKyAgICAvLyAzLiBUaGUgY29tcHV0ZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMg
J3Bvc2l0aW9uJywgJ2Zsb2F0JywgJ21hcmdpbi0qJywgJ3RvcCcsICdyaWdodCcsICdib3R0b20n
LCBhbmQgJ2xlZnQnIG9uCisgICAgLy8gICAgdGhlIHRhYmxlIGVsZW1lbnQgYXJlIHVzZWQgb24g
dGhlIHRhYmxlIHdyYXBwZXIgYm94IGFuZCBub3QgdGhlIHRhYmxlIGJveDsgYWxsIG90aGVyIHZh
bHVlcyBvZiBub24taW5oZXJpdGFibGUKKyAgICAvLyAgICBwcm9wZXJ0aWVzIGFyZSB1c2VkIG9u
IHRoZSB0YWJsZSBib3ggYW5kIG5vdCB0aGUgdGFibGUgd3JhcHBlciBib3guCisgICAgLy8gNC4g
SW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGVhY2ggYm94J3MgbGVmdCBvdXRlciBlZGdl
IHRvdWNoZXMgdGhlIGxlZnQgZWRnZSBvZiB0aGUgY29udGFpbmluZyBibG9jay4KKyAgICAvLyAg
ICBUaGlzIGlzIHRydWUgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgZmxvYXRzLCB1bmxlc3MgdGhl
IGJveCBlc3RhYmxpc2hlcyBhIG5ldyBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgKGluIHdoaWNo
IGNhc2UgdGhlCisgICAgLy8gICAgYm94IGl0c2VsZiBtYXkgYmVjb21lIG5hcnJvd2VyIGR1ZSB0
byB0aGUgZmxvYXRzKQorICAgIC8vCisgICAgLy8gTm93IGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcg
Y2FzZToKKyAgICAvLyA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBibG9jazsgd2lkdGg6IDUwMHB4OyI+
CisgICAgLy8gICAgIDxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0OyB3aWR0aDogMTAwcHg7Ij48L2Rp
dj4KKyAgICAvLyAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IHRhYmxlOyB3aWR0aDogMTAl
OyI+PC9kaXY+CisgICAgLy8gICAgIDwvZGl2PgorICAgIC8vIDwvZGl2PgorICAgIC8vIDEuIFdl
IGNyZWF0ZSBhIHRhYmxlIHdyYXBwZXIgYm94IHRvIHdyYXAgdGhlICJkaXNwbGF5OiB0YWJsZSIg
YmxvY2sgbGV2ZWwgYm94ICgjMSkuCisgICAgLy8gMi4gVGhlIHRhYmxlIHdyYXBwZXIgYm94J3Mg
d2lkdGggcHJvcGVydHkgaXMgc2V0IHRvIGF1dG8gKCMzKS4KKyAgICAvLyAzLiBTaW5jZSBpdCBl
c3RhYmxpc2hlcyBhIG5ldyBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIHRoZSBhdmFpbGFibGUg
aG9yaXpvbnRhbCBzcGFjZSBnZXRzIHNocnVuayBieSB0aGUgZmxvYXQgKCM0KQorICAgIC8vIDQu
IFRoZSB0YWJsZSB3cmFwcGVyIGJveCdzIHVzZWQgd2lkdGggY29tcHV0ZXMgdG8gNTAwcHggLSAx
MDBweCAtPiA0MDBweDsKKyAgICAvLworICAgIC8vIE5vdyB3ZSBhcmUgaW5zaWRlIHRoZSBCRkMg
ZXN0YWJsaXNoZWQgYnkgdGhlIHRhYmxlIHdyYXBwZXIgYm94IGFuZCB0cnkgdG8gcmVzb2x2ZSB0
aGUgdGFibGUncyB3aWR0aCAtPiAlMTAuCisgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBub3JtYWwg
QkZDIHJ1bGVzLCBpdCBzaG91bGQgY29tcHV0ZSB0byAxMCUgb2YgdGhlIGNvbnRhaW5pbmcgYmxv
Y2sncyBsb2dpY2FsIHdpZHRoOiA0MDBweCAtPiA0MHB4LgorICAgIC8vIEhvd2V2ZXIgaW4gcHJh
Y3RpY2UgaXQgY29tcHV0ZXMgdG8gNTBweCAoMTAlIG9mIDUwMHB4KS4KKyAgICAvLyBTaW1pbGFy
IHNldHVwIHdpdGggbm9uLXRhYmxlIGNvbnRlbnQgd291bGQgcmVzb2x2ZSB0aGUgaW5uZXIgYmxv
Y2sgbGV2ZWwgYm94J3Mgd2lkdGggdG8gNDBweDsKKyAgICAvLyBUaGlzIG5lZWRzIGNsYXJpZmlj
YXRpb24gaW4gdGhlIHNwZWMuCisgICAgYXV0byBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29s
dmluZ1dpZHRoID0gbV9ob3Jpem9udGFsQ29uc3RyYWludHNJZ25vcmluZ0Zsb2F0cy5sb2dpY2Fs
V2lkdGg7CisgICAgYXV0byBnZW9tZXRyeSA9IHRoaXMtPmdlb21ldHJ5KCk7CisgICAgYXV0byBj
b21wdXRlZFdpZHRoID0gZ2VvbWV0cnkuY29tcHV0ZWRXaWR0aCh0YWJsZUJveCwgaG9yaXpvbnRh
bENvbnN0cmFpbnRGb3JSZXNvbHZpbmdXaWR0aCk7CisgICAgYXV0byBjb21wdXRlZE1heFdpZHRo
ID0gZ2VvbWV0cnkuY29tcHV0ZWRNYXhXaWR0aCh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFp
bnRGb3JSZXNvbHZpbmdXaWR0aCk7CisgICAgYXV0byBjb21wdXRlZE1pbldpZHRoID0gZ2VvbWV0
cnkuY29tcHV0ZWRNaW5XaWR0aCh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRGb3JSZXNv
bHZpbmdXaWR0aCk7CisgICAgLy8gVXNlIHRoZSBnZW5lcmljIHNocmluay10by1maXQtd2lkdGgg
bG9naWMgYXMgdGhlIGluaXRpYWwgd2lkdGggZm9yIHRoZSB0YWJsZS4KKyAgICBhdXRvIHVzZWRX
aWR0aCA9IHN0ZDo6bWluKHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11
bSwgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5t
YXhpbXVtKTsKKyAgICBpZiAoY29tcHV0ZWRXaWR0aCB8fCBjb21wdXRlZE1pbldpZHRoIHx8IGNv
bXB1dGVkTWF4V2lkdGgpIHsKKyAgICAgICAgaWYgKGNvbXB1dGVkV2lkdGgpIHsKKyAgICAgICAg
ICAgIC8vIE5vcm1hbGl6ZSB0aGUgY29tcHV0ZWQgd2lkdGggdmFsdWUgZmlyc3QuCisgICAgICAg
ICAgICBpZiAoY29tcHV0ZWRNYXhXaWR0aCAmJiAqY29tcHV0ZWRXaWR0aCA+ICpjb21wdXRlZE1h
eFdpZHRoKQorICAgICAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggPSBjb21wdXRlZE1heFdpZHRo
OworICAgICAgICAgICAgaWYgKGNvbXB1dGVkTWluV2lkdGggJiYgKmNvbXB1dGVkV2lkdGggPCAq
Y29tcHV0ZWRNaW5XaWR0aCkKKyAgICAgICAgICAgICAgICBjb21wdXRlZFdpZHRoID0gY29tcHV0
ZWRNaW5XaWR0aDsKKyAgICAgICAgICAgIHVzZWRXaWR0aCA9ICpjb21wdXRlZFdpZHRoIDwgaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtID8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50
cy5taW5pbXVtIDogKmNvbXB1dGVkV2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29t
cHV0ZWRNYXhXaWR0aCAmJiAqY29tcHV0ZWRNYXhXaWR0aCA8IHVzZWRXaWR0aCkKKyAgICAgICAg
ICAgIHVzZWRXaWR0aCA9IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bTsKKyAgICAg
ICAgaWYgKGNvbXB1dGVkTWluV2lkdGggJiYgKmNvbXB1dGVkTWluV2lkdGggPiB1c2VkV2lkdGgp
CisgICAgICAgICAgICB1c2VkV2lkdGggPSAqY29tcHV0ZWRNaW5XaWR0aDsKKyAgICB9CisKKyAg
ICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGdlb21ldHJ5LmluRmxvd0NvbnRlbnRXaWR0
aEFuZE1hcmdpbih0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBPdmVycmlkZGVuSG9y
aXpvbnRhbFZhbHVlcyB7IHVzZWRXaWR0aCwgeyB9IH0pOworCisgICAgYXV0byYgYm94R2VvbWV0
cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSh0YWJsZUJveCk7CisgICAgYm94R2Vv
bWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lk
dGgpOworICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyBjb250ZW50V2lkdGhB
bmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCwgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJn
aW4uZW5kIH0pOworfQorCit2b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
OmNvbXB1dGVIZWlnaHRBbmRNYXJnaW5Gb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRh
YmxlQm94LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQor
eworICAgIEFTU0VSVCh0YWJsZUJveC5pc1RhYmxlQm94KCkpOworICAgIC8vIFRhYmxlIGlzIGEg
c3BlY2lhbCBCRkMgY29udGVudC4gSXRzIGhlaWdodCBpcyBtYWlubHkgZHJpdmVuIGJ5IHRoZSBj
b250ZW50LiBDb21wdXRlZCBoZWlnaHQsIG1pbi1oZWlnaHQgYW5kIG1heC1oZWlnaHQgYXJlIGFs
bAorICAgIC8vIGFscmVhZHkgYmVlbiB0YWtlbiBpbnRvIGFjY291bnQgZHVyaW5nIHRoZSBURkMg
bGF5b3V0LgorICAgIGF1dG8gaGVpZ2h0QW5kTWFyZ2luID0gZ2VvbWV0cnkoKS5pbkZsb3dDb250
ZW50SGVpZ2h0QW5kTWFyZ2luKHRhYmxlQm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFsLCB7IHF1
aXJrcygpLm92ZXJyaWRkZW5UYWJsZUhlaWdodCh0YWJsZUJveCkgfSk7CisKKyAgICBhdXRvIG1h
cmdpbkNvbGxhcHNlID0gdGhpcy0+bWFyZ2luQ29sbGFwc2UoKTsKKyAgICBhdXRvIHZlcnRpY2Fs
TWFyZ2luID0gbWFyZ2luQ29sbGFwc2UuY29sbGFwc2VkVmVydGljYWxWYWx1ZXModGFibGVCb3gs
IGhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW4pOworICAgIC8vIENhY2hlIHRoZSBj
b21wdXRlZCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgbWFyZ2luIHZhbHVlIHBhaXIuCisgICAgZm9y
bWF0dGluZ1N0YXRlKCkuc2V0VXNlZFZlcnRpY2FsTWFyZ2luKHRhYmxlQm94LCB2ZXJ0aWNhbE1h
cmdpbik7CisKKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdl
b21ldHJ5KHRhYmxlQm94KTsKKyAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2Fs
UG9zaXRpb25XaXRoTWFyZ2luKHRhYmxlQm94LCB2ZXJ0aWNhbE1hcmdpbiwgY29uc3RyYWludHMu
dmVydGljYWwpKTsKKyAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGhlaWdodEFu
ZE1hcmdpbi5jb250ZW50SGVpZ2h0KTsKKyAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdp
bih7IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFy
Z2luKSB9KTsKKyAgICAvLyBBZGp1c3QgdGhlIHByZXZpb3VzIHNpYmxpbmcncyBtYXJnaW4gYm90
dG9tIG5vdyB0aGF0IHRoaXMgYm94J3MgdmVydGljYWwgbWFyZ2luIGlzIGNvbXB1dGVkLgorICAg
IE1hcmdpbkNvbGxhcHNlOjp1cGRhdGVNYXJnaW5BZnRlckZvclByZXZpb3VzU2libGluZygqdGhp
cywgbWFyZ2luQ29sbGFwc2UsIHRhYmxlQm94KTsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3Jt
YXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Lmgg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGlu
Zy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjBkZWExNTdjYzUyMTZmODg0ZmQyODk4MzRhM2M4NjY5NTM3NDI3YTUKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2Nr
Zm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4
dC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVO
QUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0
aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0
aGUgc3BlY2lhbCBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgbGF5b3V0IGxvZ2ljIGZvciB0aGUg
dGFibGUgd3JhcHBlci4KKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi90YWJsZXMuaHRt
bCNtb2RlbAorY2xhc3MgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCBmaW5hbCA6
IHB1YmxpYyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NB
VEVEKFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAgIFRh
YmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3Jt
YXR0aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJik7CisKKyAgICB2b2lkIGxh
eW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0Zv
ckluRmxvd0NvbnRlbnQmKSBmaW5hbDsKKworICAgIHZvaWQgc2V0SG9yaXpvbnRhbENvbnN0cmFp
bnRzSWdub3JpbmdGbG9hdHMoY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFs
Q29uc3RyYWludHMpIHsgbV9ob3Jpem9udGFsQ29uc3RyYWludHNJZ25vcmluZ0Zsb2F0cyA9IGhv
cml6b250YWxDb25zdHJhaW50czsgfQorCitwcml2YXRlOgorICAgIGNsYXNzIFF1aXJrcyA6IHB1
YmxpYyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgeworICAgIHB1YmxpYzoKKyAgICAg
ICAgUXVpcmtzKGNvbnN0IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsKKwor
ICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBvdmVycmlkZGVuVGFibGVIZWlnaHQoY29uc3Qg
Q29udGFpbmVyQm94JiB0YWJsZUJveCkgY29uc3Q7CisgICAgfTsKKyAgICBUYWJsZVdyYXBwZXJC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4gUXVp
cmtzKCp0aGlzKTsgfQorCisgICAgdm9pZCBsYXlvdXRUYWJsZUJveChjb25zdCBDb250YWluZXJC
b3gmIHRhYmxlQm94LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsKKworICAg
IHZvaWQgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmdGb3JUYWJsZUJveChjb25zdCBDb250YWluZXJC
b3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmKTsKKyAgICB2b2lkIGNvbXB1dGVXaWR0
aEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYpOworICAgIHZvaWQgY29tcHV0ZUhlaWdodEFuZE1hcmdpbkZvclRhYmxl
Qm94KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVu
dCYpOworCitwcml2YXRlOgorICAgIEhvcml6b250YWxDb25zdHJhaW50cyBtX2hvcml6b250YWxD
b25zdHJhaW50c0lnbm9yaW5nRmxvYXRzOworfTsKKworaW5saW5lIFRhYmxlV3JhcHBlckJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6UXVpcmtzKGNvbnN0IFRhYmxlV3JhcHBlckJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KQorICAgIDogQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6UXVpcmtzKGZvcm1hdHRpbmdDb250ZXh0KQoreworfQorCit9Cit9CisKK1NQ
RUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChUYWJsZVdyYXBw
ZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQoKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVy
QmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFw
cGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZWFkYTkyZWQy
OGY3OTdmM2I4MjZiMGZiOTE1NDI1ZWI3ODliYjk5NQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxl
d3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApAQCAt
MCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IlRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK09wdGlvbmFsPExheW91dFVu
aXQ+IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6b3ZlcnJpZGRl
blRhYmxlSGVpZ2h0KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gpIGNvbnN0Cit7CisgICAg
aWYgKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpIHsKKyAgICAgICAgLy8gSW4gcXVpcmtz
IG1vZGUgYWx3YXlzIHVzZSB0aGUgY29udGVudCBoZWlnaHQuIE5vdGUgdGhhdCB0aGUgdGFibGVz
IHdpdGggY29udGVudCB0YWtlIGNvbXB1dGVkIHZhbHVlcyBpbnRvIGFjY291bnQuCisgICAgICAg
IHJldHVybiBnZW9tZXRyeSgpLmNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3Qo
dGFibGVCb3gpOworICAgIH0KKyAgICByZXR1cm4gdGFibGVCb3guaGFzSW5GbG93T3JGbG9hdGlu
Z0NoaWxkKCkgPyBnZW9tZXRyeSgpLmNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJv
b3QodGFibGVCb3gpIDogT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OworfQorCit9Cit9CisKKyNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGlu
Z0NvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjMxNTdmZDY5OTA0Mjg2OTdlODVkMTcxZjZkM2FjOGQ1
ODdhY2FjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5jcHAKQEAg
LTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiRmxleEZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJ
TkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsZXhGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRl
ICJJbmxpbmVSZWN0LmgiCisjaW5jbHVkZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIKKyNpbmNsdWRl
ICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENoaWxkSXRlcmF0b3IuaCIK
KyNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGlu
ZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK1dURl9N
QUtFX0lTT19BTExPQ0FURURfSU1QTChGbGV4Rm9ybWF0dGluZ0NvbnRleHQpOworCitGbGV4Rm9y
bWF0dGluZ0NvbnRleHQ6OkZsZXhGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gm
IGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgRmxleEZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0
YXRlKQorICAgIDogRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHRSb290LCBmb3Jt
YXR0aW5nU3RhdGUpCit7Cit9CisKK3ZvaWQgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRJ
bkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZs
b3dDb250ZW50JiBjb25zdHJhaW50cykKK3sKKyAgICBjb21wdXRlSW50cmluc2ljV2lkdGhDb25z
dHJhaW50c0ZvckZsZXhJdGVtcygpOworICAgIHNpemVBbmRQbGFjZUZsZXhJdGVtcyhjb25zdHJh
aW50cyk7Cit9CisKK0xheW91dFVuaXQgRmxleEZvcm1hdHRpbmdDb250ZXh0Ojp1c2VkQ29udGVu
dEhlaWdodCgpIGNvbnN0Cit7CisgICAgYXV0byYgbGluZXMgPSBmb3JtYXR0aW5nU3RhdGUoKS5s
aW5lcygpOworICAgIHJldHVybiBMYXlvdXRVbml0IHsgbGluZXMubGFzdCgpLmJvdHRvbSgpIC0g
bGluZXMuZmlyc3QoKS50b3AoKSB9OworfQorCitGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2lj
V2lkdGhDb25zdHJhaW50cyBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2lj
V2lkdGhDb25zdHJhaW50cygpCit7CisgICAgcmV0dXJuIHsgfTsKK30KKwordm9pZCBGbGV4Rm9y
bWF0dGluZ0NvbnRleHQ6OnNpemVBbmRQbGFjZUZsZXhJdGVtcyhjb25zdCBDb25zdHJhaW50c0Zv
ckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0
ZSA9IHRoaXMtPmZvcm1hdHRpbmdTdGF0ZSgpOworICAgIGF1dG8gZ2VvbWV0cnkgPSB0aGlzLT5n
ZW9tZXRyeSgpOworICAgIGF1dG8gZmxleEl0ZW1NYWluQXhpc1N0YXJ0ID0gY29uc3RyYWludHMu
aG9yaXpvbnRhbC5sb2dpY2FsTGVmdDsKKyAgICBhdXRvIGZsZXhJdGVtTWFpbkF4aXNFbmQgPSBm
bGV4SXRlbU1haW5BeGlzU3RhcnQ7CisgICAgYXV0byBmbGV4SXRlbUNyb3NBeGlzU3RhcnQgPSBj
b25zdHJhaW50cy52ZXJ0aWNhbC5sb2dpY2FsVG9wOworICAgIGF1dG8gZmxleEl0ZW1Dcm9zQXhp
c0VuZCA9IGZsZXhJdGVtQ3Jvc0F4aXNTdGFydDsKKyAgICBmb3IgKGF1dG8mIGZsZXhJdGVtIDog
Y2hpbGRyZW5PZlR5cGU8Q29udGFpbmVyQm94Pihyb290KCkpKSB7CisgICAgICAgIEFTU0VSVChm
bGV4SXRlbS5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOworICAgICAgICAvLyBGSVhN
RTogVGhpcyBpcyBqdXN0IGEgc2ltcGxlLCBsZXQncyBsYXlvdXQgdGhlIGZsZXggaXRlbXMgYW5k
IHBsYWNlIHRoZW0gbmV4dCB0byBlYWNoIG90aGVyIHNldHVwLgorICAgICAgICBhdXRvIGludHJp
bnNpY1dpZHRocyA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9y
Qm94KGZsZXhJdGVtKTsKKyAgICAgICAgYXV0byBmbGV4SXRlbUxvZ2ljYWxXaWR0aCA9IHN0ZDo6
bWluKHN0ZDo6bWF4KGludHJpbnNpY1dpZHRocy0+bWluaW11bSwgY29uc3RyYWludHMuaG9yaXpv
bnRhbC5sb2dpY2FsV2lkdGgpLCBpbnRyaW5zaWNXaWR0aHMtPm1heGltdW0pOworICAgICAgICBh
dXRvIGZsZXhJdGVtQ29uc3RyYWludHMgPSBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQgeyB7
IHsgfSwgZmxleEl0ZW1Mb2dpY2FsV2lkdGggfSwgeyB9IH07CisKKyAgICAgICAgYXV0byBpbnZh
bGlkYXRpb25TdGF0ZSA9IEludmFsaWRhdGlvblN0YXRlIHsgfTsKKyAgICAgICAgTGF5b3V0Q29u
dGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZmxleEl0ZW0sIGxheW91dFN0YXRlKCkpLT5s
YXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBmbGV4SXRlbUNvbnN0cmFpbnRz
KTsKKworICAgICAgICBhdXRvIGNvbXB1dGVGbGV4SXRlbUdlb21ldHJ5ID0gWyZdIHsKKyAgICAg
ICAgICAgIGF1dG8mIGZsZXhJdGVtR2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0
cnkoZmxleEl0ZW0pOworCisgICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldExvZ2ljYWxU
b3BMZWZ0KExheW91dFBvaW50IHsgZmxleEl0ZW1NYWluQXhpc0VuZCwgZmxleEl0ZW1Dcm9zQXhp
c1N0YXJ0IH0pOworCisgICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldEJvcmRlcihnZW9t
ZXRyeS5jb21wdXRlZEJvcmRlcihmbGV4SXRlbSkpOworICAgICAgICAgICAgZmxleEl0ZW1HZW9t
ZXRyeS5zZXRQYWRkaW5nKGdlb21ldHJ5LmNvbXB1dGVkUGFkZGluZyhmbGV4SXRlbSwgY29uc3Ry
YWludHMuaG9yaXpvbnRhbC5sb2dpY2FsV2lkdGgpKTsKKworICAgICAgICAgICAgYXV0byBjb21w
dXRlZEhvcml6b250YWxNYXJnaW4gPSBnZW9tZXRyeS5jb21wdXRlZEhvcml6b250YWxNYXJnaW4o
ZmxleEl0ZW0sIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAgICAgZmxleEl0ZW1H
ZW9tZXRyeS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0
YXJ0LnZhbHVlT3IoMF9sdSksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigw
X2x1KSB9KTsKKworICAgICAgICAgICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gZ2Vv
bWV0cnkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihmbGV4SXRlbSwgY29uc3RyYWludHMuaG9yaXpv
bnRhbCk7CisgICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsg
Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwX2x1KSwgY29tcHV0ZWRWZXJ0
aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDBfbHUpIH0pOworCisgICAgICAgICAgICBmbGV4SXRl
bUdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoZ2VvbWV0cnkuY29udGVudEhlaWdodEZvckZv
cm1hdHRpbmdDb250ZXh0Um9vdChmbGV4SXRlbSkpOworICAgICAgICAgICAgZmxleEl0ZW1HZW9t
ZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoZmxleEl0ZW1Mb2dpY2FsV2lkdGgpOworICAgICAgICAg
ICAgZmxleEl0ZW1NYWluQXhpc0VuZD0gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QoZmxleEl0
ZW1HZW9tZXRyeSkucmlnaHQoKTsKKyAgICAgICAgICAgIGZsZXhJdGVtQ3Jvc0F4aXNFbmQgPSBz
dGQ6Om1heChmbGV4SXRlbUNyb3NBeGlzRW5kLCBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChm
bGV4SXRlbUdlb21ldHJ5KS5ib3R0b20oKSk7CisgICAgICAgIH07CisgICAgICAgIGNvbXB1dGVG
bGV4SXRlbUdlb21ldHJ5KCk7CisgICAgfQorICAgIGF1dG8gZmxleExpbmUgPSBJbmxpbmVSZWN0
IHsgZmxleEl0ZW1Dcm9zQXhpc1N0YXJ0LCBmbGV4SXRlbU1haW5BeGlzU3RhcnQsIGZsZXhJdGVt
TWFpbkF4aXNFbmQgLSBmbGV4SXRlbU1haW5BeGlzU3RhcnQsIGZsZXhJdGVtQ3Jvc0F4aXNFbmQg
LSBmbGV4SXRlbUNyb3NBeGlzU3RhcnQgfTsKKyAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZShm
bGV4TGluZSk7Cit9CisKK3ZvaWQgRmxleEZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlSW50cmlu
c2ljV2lkdGhDb25zdHJhaW50c0ZvckZsZXhJdGVtcygpCit7CisgICAgYXV0byYgZm9ybWF0dGlu
Z1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7CisgICAgYXV0byBnZW9tZXRyeSA9IHRo
aXMtPmdlb21ldHJ5KCk7CisgICAgZm9yIChhdXRvJiBmbGV4SXRlbSA6IGNoaWxkcmVuT2ZUeXBl
PENvbnRhaW5lckJveD4ocm9vdCgpKSkgeworICAgICAgICBpZiAoZm9ybWF0dGluZ1N0YXRlLmlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goZmxleEl0ZW0pKQorICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzRm9yQm94KGZsZXhJdGVtLCBnZW9tZXRyeS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGZs
ZXhJdGVtKSk7CisgICAgfQorfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9y
bWF0dGluZ0NvbnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODFh
MGU0MDY5ZmZkMTAyOTY4OGNjNTE2Y2ZkOTU5MGNjYzkzNjUyYgotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcv
RmxleEZvcm1hdHRpbmdDb250ZXh0LmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNw
cmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNp
bmNsdWRlICJGbGV4Rm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRl
eHQuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKKy8vIFRoaXMg
Y2xhc3MgaW1wbGVtZW50cyB0aGUgbGF5b3V0IGxvZ2ljIGZvciBmbGV4IGZvcm1hdHRpbmcgY29u
dGV4dHMuCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWZsZXhib3gtMS8KK2NsYXNzIEZs
ZXhGb3JtYXR0aW5nQ29udGV4dCBmaW5hbCA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dCB7Cisg
ICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChGbGV4Rm9ybWF0dGluZ0NvbnRleHQpOworcHVibGlj
OgorICAgIEZsZXhGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRp
bmdDb250ZXh0Um9vdCwgRmxleEZvcm1hdHRpbmdTdGF0ZSYpOworICAgIHZvaWQgbGF5b3V0SW5G
bG93Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93
Q29udGVudCYpIG92ZXJyaWRlOworICAgIExheW91dFVuaXQgdXNlZENvbnRlbnRIZWlnaHQoKSBj
b25zdCBvdmVycmlkZTsKKworICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgLy8g
VGhpcyBjbGFzcyBpbXBsZW1lbnRzIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcgZm9yIGZsZXggaXRl
bXMuCisgICAgY2xhc3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEdlb21ldHJ5KGNvbnN0IEZsZXhGb3JtYXR0aW5n
Q29udGV4dCYpOworCisgICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2lj
V2lkdGhDb25zdHJhaW50cyhjb25zdCBDb250YWluZXJCb3gmKTsKKworICAgIHByaXZhdGU6Cisg
ICAgICAgIGNvbnN0IEZsZXhGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBj
b25zdCB7IHJldHVybiBkb3duY2FzdDxGbGV4Rm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdD
b250ZXh0OjpHZW9tZXRyeTo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KKyAgICB9OworICAgIEZs
ZXhGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBH
ZW9tZXRyeSgqdGhpcyk7IH0KKworICAgIHZvaWQgc2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0
IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOworICAgIHZvaWQgY29tcHV0ZUludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHNGb3JGbGV4SXRlbXMoKTsKKworICAgIGNvbnN0IEZsZXhGb3JtYXR0
aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEZsZXhG
b3JtYXR0aW5nU3RhdGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0K
KyAgICBGbGV4Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3du
Y2FzdDxGbGV4Rm9ybWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0
YXRlKCkpOyB9Cit9OworCitpbmxpbmUgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6
R2VvbWV0cnkoY29uc3QgRmxleEZvcm1hdHRpbmdDb250ZXh0JiBmbGV4Rm9ybWF0dGluZ0NvbnRl
eHQpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkoZmxleEZvcm1hdHRpbmdDb250
ZXh0KQoreworfQorCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1B
VFRJTkdfQ09OVEVYVChGbGV4Rm9ybWF0dGluZ0NvbnRleHQsIGlzRmxleEZvcm1hdHRpbmdDb250
ZXh0KCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRy
eS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3Jt
YXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYzdj
OGRkMDk4MDlkMWQwYjU4NGFiZmY3OGRkMTc5MWJmZjQ2ODk4Ci0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9G
bGV4Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
CisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGbGV4Rm9ybWF0dGluZ0NvbnRl
eHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVk
ZSAiRmxleEZvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0Lmgi
CisjaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1l
c3BhY2UgTGF5b3V0IHsKKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW50cmluc2ljV2lkdGhDb25z
dHJhaW50cyhjb25zdCBDb250YWluZXJCb3gmIGZsZXhJdGVtKQoreworICAgIGF1dG8gZml4ZWRN
YXJnaW5Cb3JkZXJBbmRQYWRkaW5nID0gWyZdKGF1dG8mIGxheW91dEJveCkgeworICAgICAgICBh
dXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOworICAgICAgICByZXR1cm4gZml4ZWRWYWx1
ZShzdHlsZS5tYXJnaW5TdGFydCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIExheW91dFVu
aXQgeyBzdHlsZS5ib3JkZXJMZWZ0V2lkdGgoKSB9CisgICAgICAgICAgICArIGZpeGVkVmFsdWUo
c3R5bGUucGFkZGluZ0xlZnQoKSkudmFsdWVPcigwKQorICAgICAgICAgICAgKyBmaXhlZFZhbHVl
KHN0eWxlLnBhZGRpbmdSaWdodCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIExheW91dFVu
aXQgeyBzdHlsZS5ib3JkZXJSaWdodFdpZHRoKCkgfQorICAgICAgICAgICAgKyBmaXhlZFZhbHVl
KHN0eWxlLm1hcmdpbkVuZCgpKS52YWx1ZU9yKDApOworICAgIH07CisKKyAgICBhdXRvIGNvbXB1
dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IFsmXSgpIC0+IEludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMgeworICAgICAgICBhdXRvIGxvZ2ljYWxXaWR0aCA9IGZsZXhJdGVtLnN0eWxlKCku
bG9naWNhbFdpZHRoKCk7CisgICAgICAgIC8vIE1pbmltdW0vbWF4aW11bSB3aWR0aCBjYW4ndCBi
ZSBkZXBlbmRpbmcgb24gdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0aC4KKyAgICAgICAgYXV0
byBuZWVkc1Jlc29sdmVkQ29udGFpbmluZ0Jsb2NrV2lkdGggPSBsb2dpY2FsV2lkdGguaXNDYWxj
dWxhdGVkKCkgfHwgbG9naWNhbFdpZHRoLmlzUGVyY2VudCgpIHx8IGxvZ2ljYWxXaWR0aC5pc1Jl
bGF0aXZlKCk7CisgICAgICAgIGlmIChuZWVkc1Jlc29sdmVkQ29udGFpbmluZ0Jsb2NrV2lkdGgp
CisgICAgICAgICAgICByZXR1cm4geyB9OworCisgICAgICAgIGlmIChhdXRvIHdpZHRoID0gZml4
ZWRWYWx1ZShsb2dpY2FsV2lkdGgpKQorICAgICAgICAgICAgcmV0dXJuIHsgKndpZHRoLCAqd2lk
dGggfTsKKworICAgICAgICBBU1NFUlQoZmxleEl0ZW0uZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29u
dGV4dCgpKTsKKyAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gTGF5b3V0
Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZmxleEl0ZW0sIGxheW91dFN0YXRlKCkp
LT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKKyAgICAgICAgaWYgKGxvZ2lj
YWxXaWR0aC5pc01pbkNvbnRlbnQoKSkKKyAgICAgICAgICAgIHJldHVybiB7IGludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMubWluaW11bSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVt
IH07CisgICAgICAgIGlmIChsb2dpY2FsV2lkdGguaXNNYXhDb250ZW50KCkpCisgICAgICAgICAg
ICByZXR1cm4geyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIGludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMubWF4aW11bSB9OworICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhD
b25zdHJhaW50czsKKyAgICB9OworICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9
IGNvbnN0cmFpbkJ5TWluTWF4V2lkdGgoZmxleEl0ZW0sIGNvbXB1dGVkSW50cmluc2ljV2lkdGhD
b25zdHJhaW50cygpKTsKKyAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLmV4cGFuZChmaXhl
ZE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoZmxleEl0ZW0pKTsKKyAgICByZXR1cm4gaW50cmluc2lj
V2lkdGhDb25zdHJhaW50czsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZv
cm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQ1
OWZjODVhMDM4NTJkMzM1MjYxMzg0MGYzMTIyYzczM2M1NGZhYTAKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5n
L0ZsZXhGb3JtYXR0aW5nU3RhdGUuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdTdGF0ZS5oIgorCisj
aWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlIDx3dGYvSXNv
TWFsbG9jSW5saW5lcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0
IHsKKworV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEZsZXhGb3JtYXR0aW5nU3RhdGUpOwor
CitGbGV4Rm9ybWF0dGluZ1N0YXRlOjpGbGV4Rm9ybWF0dGluZ1N0YXRlKFJlZjxGbG9hdGluZ1N0
YXRlPiYmIGZsb2F0aW5nU3RhdGUsIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKKyAgICA6IEZv
cm1hdHRpbmdTdGF0ZShXVEZNb3ZlKGZsb2F0aW5nU3RhdGUpLCBUeXBlOjpGbGV4LCBsYXlvdXRT
dGF0ZSkKK3sKK30KKworRmxleEZvcm1hdHRpbmdTdGF0ZTo6fkZsZXhGb3JtYXR0aW5nU3RhdGUo
KQoreworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5o
IGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGlu
Zy9GbGV4Rm9ybWF0dGluZ1N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTA2M2I5ZGEyYTViOGRjMjcwMjA4
Nzk0YTQ4MzY1NDQxNjA5ZTNhMwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0
ZS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVO
QUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRm9ybWF0dGluZ1N0
YXRlLmgiCisjaW5jbHVkZSAiSW5saW5lUmVjdC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2Mu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIEZs
ZXhGb3JtYXR0aW5nU3RhdGUgOiBwdWJsaWMgRm9ybWF0dGluZ1N0YXRlIHsKKyAgICBXVEZfTUFL
RV9JU09fQUxMT0NBVEVEKEZsZXhGb3JtYXR0aW5nU3RhdGUpOworcHVibGljOgorICAgIEZsZXhG
b3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRlJik7CisgICAg
fkZsZXhGb3JtYXR0aW5nU3RhdGUoKTsKKworICAgIGNvbnN0IGF1dG8mIGxpbmVzKCkgY29uc3Qg
eyByZXR1cm4gbV9saW5lczsgfQorICAgIHZvaWQgYWRkTGluZShjb25zdCBJbmxpbmVSZWN0JiBs
aW5lKSB7IG1fbGluZXMuYXBwZW5kKGxpbmUpOyB9CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPElu
bGluZVJlY3Q+IG1fbGluZXM7Cit9OworCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNf
TEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUoRmxleEZvcm1hdHRpbmdTdGF0ZSwgaXNGbGV4Rm9ybWF0
dGluZ1N0YXRlKCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2Vy
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9y
bWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTQwYTZkYTlmOWMx
NGYwMTQ0NTFmYWRhMjQ2ZmIwZWJjZDEyZDJiOAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVD
b250ZW50QnJlYWtlci5jcHAKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5saW5lQ29udGVudEJyZWFrZXIuaCIKKworI2lmIEVO
QUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRm9udENhc2NhZGUu
aCIKKyNpbmNsdWRlICJIeXBoZW5hdGlvbi5oIgorI2luY2x1ZGUgIklubGluZUl0ZW0uaCIKKyNp
bmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5o
IgorI2luY2x1ZGUgIlRleHRVdGlsLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFj
ZSBMYXlvdXQgeworCisKKyNpZiBBU1NFUlRfRU5BQkxFRAorc3RhdGljIGlubGluZSBib29sIGhh
c1RyYWlsaW5nVGV4dENvbnRlbnQoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVv
dXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkKK3sKKyAgICBmb3IgKGF1dG8mIHJ1biA6IFdU
Rjo6bWFrZVJldmVyc2VkUmFuZ2UoY29udGludW91c0NvbnRlbnQucnVucygpKSkgeworICAgICAg
ICBhdXRvJiBpbmxpbmVJdGVtID0gcnVuLmlubGluZUl0ZW07CisgICAgICAgIGlmIChpbmxpbmVJ
dGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcmV0dXJuIGlubGluZUl0ZW0uaXNUZXh0KCk7
CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGJv
b2wgaGFzTGVhZGluZ1RleHRDb250ZW50KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250
aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQpCit7CisgICAgZm9yIChhdXRvJiBydW4g
OiBjb250aW51b3VzQ29udGVudC5ydW5zKCkpIHsKKyAgICAgICAgYXV0byYgaW5saW5lSXRlbSA9
IHJ1bi5pbmxpbmVJdGVtOworICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0
KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQorICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgIHJldHVybiBpbmxpbmVJdGVtLmlzVGV4dCgpOworICAgIH0KKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNUZXh0UnVuKGNvbnN0IElubGluZUNv
bnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQpCit7Cisg
ICAgLy8gPHNwYW4+dGV4dDwvc3Bhbj4gaXMgY29uc2lkZXJlZCBhIHRleHQgcnVuIGV2ZW4gd2l0
aCB0aGUgW2lubGluZSBib3ggc3RhcnRdW2lubGluZSBib3ggZW5kXSBpbmxpbmUgaXRlbXMuCisg
ICAgLy8gQmFzZWQgb24gc3RhbmRhcmRzIGNvbW1pdCBib3VuZGFyeSBydWxlcyBpdCB3b3VsZCBi
ZSBlbm91Z2ggdG8gY2hlY2sgdGhlIGZpcnN0IGlubGluZSBpdGVtLCBidXQgZHVlIHRvIHRoZSB0
YWJsZSBxdWlyaywgd2UgY2FuIGhhdmUKKyAgICAvLyBpbWFnZSBhbmQgdGV4dCBuZXh0IHRvIGVh
Y2ggb3RoZXIgaW5zaWRlIGEgY29udGludW91cyBzZXQgb2YgcnVucyAoc2VlIElubGluZUZvcm1h
dHRpbmdDb250ZXh0OjpRdWlya3M6Omhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdlKS4KKyAg
ICBmb3IgKGF1dG8mIHJ1biA6IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKSkgeworICAgICAgICBp
ZiAocnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNWaXN1YWxs
eUVtcHR5V2hpdGVzcGFjZUNvbnRlbnQoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRp
bnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkKK3sKKyAgICAvLyBbPHNwYW4+PC9zcGFu
PiBdIFs8c3Bhbj4gPC9zcGFuPl0gWyA8c3BhbiBzdHlsZT0icGFkZGluZzogMHB4OyI+PC9zcGFu
Pl0gYXJlIGFsbCBjb25zaWRlcmVkIHZpc3VhbGx5IGVtcHR5IHdoaXRlc3BhY2UgY29udGVudC4K
KyAgICAvLyBbPHNwYW4gc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIHJlZCI+PC9zcGFuPiBdIHdo
aWxlIHRoaXMgaXMgd2hpdGVzcGFjZSBjb250ZW50IG9ubHksIGl0IGlzIG5vdCBjb25zaWRlcmVk
IHZpc3VhbGx5IGVtcHR5LgorICAgIC8vIER1ZSB0byBjb21taXQgYm91bmRhcnkgcnVsZXMsIHdl
IGp1c3QgbmVlZCB0byBjaGVjayB0aGUgZmlyc3Qgbm9uLXR5cGVsZXNzIGlubGluZSBpdGVtIChj
YW4ndCBoYXZlIGJvdGggW2ltZ10gYW5kIFt0ZXh0XSkKKyAgICBmb3IgKGF1dG8mIHJ1biA6IGNv
bnRpbnVvdXNDb250ZW50LnJ1bnMoKSkgeworICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gcnVu
LmlubGluZUl0ZW07CisgICAgICAgIC8vIEZJWE1FOiBjaGVjayBmb3IgcGFkZGluZyBib3JkZXIg
ZXRjLgorICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5l
SXRlbS5pc0lubGluZUJveEVuZCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJl
dHVybiBpbmxpbmVJdGVtLmlzVGV4dCgpICYmIGRvd25jYXN0PElubGluZVRleHRJdGVtPihpbmxp
bmVJdGVtKS5pc1doaXRlc3BhY2UoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitz
dGF0aWMgaW5saW5lIGJvb2wgaXNOb25Db250ZW50UnVuc09ubHkoY29uc3QgSW5saW5lQ29udGVu
dEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkKK3sKKyAgICAv
LyA8c3Bhbj48L3NwYW4+IDwtIG5vbiBjb250ZW50IHJ1bnMuCisgICAgZm9yIChhdXRvJiBydW4g
OiBjb250aW51b3VzQ29udGVudC5ydW5zKCkpIHsKKyAgICAgICAgYXV0byYgaW5saW5lSXRlbSA9
IHJ1bi5pbmxpbmVJdGVtOworICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0
KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQorICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0
YXRpYyBpbmxpbmUgT3B0aW9uYWw8c2l6ZV90PiBmaXJzdFRleHRSdW5JbmRleChjb25zdCBJbmxp
bmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250ZW50KQor
eworICAgIGF1dG8mIHJ1bnMgPSBjb250aW51b3VzQ29udGVudC5ydW5zKCk7CisgICAgZm9yIChz
aXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJ1bnMuc2l6ZSgpOyArK2luZGV4KSB7CisgICAgICAg
IGlmIChydW5zW2luZGV4XS5pbmxpbmVJdGVtLmlzVGV4dCgpKQorICAgICAgICAgICAgcmV0dXJu
IGluZGV4OworICAgIH0KKyAgICByZXR1cm4geyB9OworfQorCitib29sIElubGluZUNvbnRlbnRC
cmVha2VyOjppc1dyYXBwaW5nQWxsb3dlZChjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQor
eworICAgIGF1dG8mIHN0eWxlVG9Vc2UgPSBpbmxpbmVJdGVtLmlzQm94KCkgPyBpbmxpbmVJdGVt
LmxheW91dEJveCgpLnBhcmVudCgpLnN0eWxlKCkgOiBpbmxpbmVJdGVtLmxheW91dEJveCgpLnN0
eWxlKCk7IAorICAgIC8vIERvIG5vdCB0cnkgdG8gd3JhcCBvdmVyZmxvd24gJ3ByZScgYW5kICdu
by13cmFwJyBjb250ZW50IHRvIG5leHQgbGluZS4KKyAgICByZXR1cm4gc3R5bGVUb1VzZS53aGl0
ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6UHJlICYmIHN0eWxlVG9Vc2Uud2hpdGVTcGFjZSgpICE9
IFdoaXRlU3BhY2U6Ok5vV3JhcDsKK30KKworYm9vbCBJbmxpbmVDb250ZW50QnJlYWtlcjo6c2hv
dWxkS2VlcEVuZE9mTGluZVdoaXRlc3BhY2UoY29uc3QgQ29udGludW91c0NvbnRlbnQmIGNvbnRp
bnVvdXNDb250ZW50KSBjb25zdAoreworICAgIC8vIEdyYWIgdGhlIHN0eWxlIGFuZCBjaGVjayBm
b3Igd2hpdGUtc3BhY2UgcHJvcGVydHkgdG8gZGVjaWRlIHdoZXRoZXIgd2Ugc2hvdWxkIGxldCB0
aGlzIHdoaXRlc3BhY2UgY29udGVudCBvdmVyZmxvdyB0aGUgY3VycmVudCBsaW5lLgorICAgIC8v
IE5vdGUgdGhhdCB0aGUgImtlZXAiIGluIHRoaXMgY29udGV4dCBtZWFucyB3ZSBsZXQgdGhlIHdo
aXRlc3BhY2UgY29udGVudCBzaXQgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAvLyBJdCBtaWdo
dCB2ZXJ5IHdlbGwgZ2V0IGNvbGxhcHNlZCB3aGVuIHdlIGNsb3NlIHRoZSBsaW5lIChub3JtYWwv
bm93cmFwL3ByZS1saW5lKS4KKyAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10
ZXh0LTMvI3doaXRlLXNwYWNlLXByb3BlcnR5CisgICAgYXV0byB3aGl0ZXNwYWNlID0gY29udGlu
dW91c0NvbnRlbnQucnVucygpWypmaXJzdFRleHRSdW5JbmRleChjb250aW51b3VzQ29udGVudCld
LmlubGluZUl0ZW0uc3R5bGUoKS53aGl0ZVNwYWNlKCk7CisgICAgcmV0dXJuIHdoaXRlc3BhY2Ug
PT0gV2hpdGVTcGFjZTo6Tm9ybWFsIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6Tm9XcmFw
IHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlV3JhcCB8fCB3aGl0ZXNwYWNlID09IFdo
aXRlU3BhY2U6OlByZUxpbmU7Cit9CisKK0lubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQgSW5s
aW5lQ29udGVudEJyZWFrZXI6OnByb2Nlc3NJbmxpbmVDb250ZW50KGNvbnN0IENvbnRpbnVvdXND
b250ZW50JiBjYW5kaWRhdGVDb250ZW50LCBjb25zdCBMaW5lU3RhdHVzJiBsaW5lU3RhdHVzKQor
eworICAgIEFTU0VSVCghc3RkOjppc25hbihsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKSk7Cisg
ICAgYXV0byBwcm9jZXNzQ2FuZGlkYXRlQ29udGVudCA9IFsmXSB7CisgICAgICAgIGlmIChjYW5k
aWRhdGVDb250ZW50LmxvZ2ljYWxXaWR0aCgpIDw9IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGgp
CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246OktlZXAgfTsKKyNp
ZiBVU0VfRkxPQVRfQVNfSU5MSU5FX0xBWU9VVF9VTklUCisgICAgICAgIC8vIFByZWZlcnJlZCB3
aWR0aCBjb21wdXRhdGlvbiBzdW1zIHVwIGZsb2F0cyB3aGlsZSBsaW5lIGJyZWFrZXIgc3VidHJh
Y3RzIHRoZW0uIFRoaXMgY2FuIGxlYWQgdG8gZXBzaWxvbi1zY2FsZSBkaWZmZXJlbmNlcy4KKyAg
ICAgICAgaWYgKFdURjo6YXJlRXNzZW50aWFsbHlFcXVhbChjYW5kaWRhdGVDb250ZW50LmxvZ2lj
YWxXaWR0aCgpLCBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKSkKKyAgICAgICAgICAgIHJldHVy
biBSZXN1bHQgeyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCB9OworI2VuZGlmCisgICAgICAgIHJldHVy
biBwcm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50KGNhbmRpZGF0ZUNvbnRlbnQsIGxpbmVTdGF0dXMp
OworICAgIH07CisKKyAgICBhdXRvIHJlc3VsdCA9IHByb2Nlc3NDYW5kaWRhdGVDb250ZW50KCk7
CisgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gUmVzdWx0OjpBY3Rpb246OldyYXAgJiYgbGluZVN0
YXR1cy50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCAmJiBoYXNMZWFkaW5nVGV4dENvbnRlbnQoY2Fu
ZGlkYXRlQ29udGVudCkpIHsKKyAgICAgICAgLy8gQSB0cmFpbGluZyBzb2Z0IGh5cGhlbiB3aXRo
IGEgd3JhcHBlZCB0ZXh0IGNvbnRlbnQgdHVybnMgaW50byBhIHZpc2libGUgaHlwaGVuLgorICAg
ICAgICAvLyBMZXQncyBjaGVjayBpZiB0aGVyZSdzIGVub3VnaCBzcGFjZSBmb3IgdGhlIGh5cGhl
biBjaGFyYWN0ZXIuCisgICAgICAgIGF1dG8gaHlwaGVuT3ZlcmZsb3dzID0gKmxpbmVTdGF0dXMu
dHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPiBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoOworICAg
ICAgICBhdXRvIGFjdGlvbiA9IGh5cGhlbk92ZXJmbG93cyA/IFJlc3VsdDo6QWN0aW9uOjpSZXZl
cnRUb0xhc3ROb25PdmVyZmxvd2luZ1dyYXBPcHBvcnR1bml0eSA6IFJlc3VsdDo6QWN0aW9uOjpX
cmFwV2l0aEh5cGhlbjsKKyAgICAgICAgcmVzdWx0ID0geyBhY3Rpb24sIElzRW5kT2ZMaW5lOjpZ
ZXMgfTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IE92ZXJmbG93aW5n
VGV4dENvbnRlbnQgeworICAgIHNpemVfdCBydW5JbmRleCB7IDAgfTsgLy8gT3ZlcmZsb3dpbmcg
cnVuIGluZGV4LiBUaGVyZSdzIGFsd2F5cyBhbiBvdmVyZmxvd2luZyBydW4uCisgICAgc3RydWN0
IEJyZWFraW5nUG9zaXRpb24geworICAgICAgICBzaXplX3QgcnVuSW5kZXggeyAwIH07CisgICAg
ICAgIHN0cnVjdCBUcmFpbGluZ0NvbnRlbnQgeworICAgICAgICAgICAgLy8gVHJhaWxpbmcgY29u
dGVudCBpcyBlaXRoZXIgdGhlIHJ1bidzIGxlZnQgc2lkZSAod2hlbiB3ZSBicmVhayB0aGUgcnVu
IHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlKSBvciB0aGUgcHJldmlvdXMgcnVuLgorICAgICAgICAg
ICAgLy8gU29tZXRpbWVzIHRoZSBicmVha2luZyBwb3NpdGlvbiBpcyBhdCB0aGUgdmVyeSBiZWdp
bm5pbmcgb2YgdGhlIGZpcnN0IHJ1biwgc28gdGhlcmUncyBubyB0cmFpbGluZyBydW4gYXQgYWxs
LgorICAgICAgICAgICAgYm9vbCBvdmVyZmxvd3MgeyBmYWxzZSB9OworICAgICAgICAgICAgT3B0
aW9uYWw8SW5saW5lQ29udGVudEJyZWFrZXI6OlBhcnRpYWxSdW4+IHBhcnRpYWxSdW4geyB9Owor
ICAgICAgICB9OworICAgICAgICBPcHRpb25hbDxUcmFpbGluZ0NvbnRlbnQ+IHRyYWlsaW5nQ29u
dGVudCB7IH07CisgICAgfTsKKyAgICBPcHRpb25hbDxCcmVha2luZ1Bvc2l0aW9uPiBicmVha2lu
Z1Bvc2l0aW9uIHsgfTsgLy8gV2hlcmUgd2UgYWN0dWFsbHkgYnJlYWsgdGhpcyBvdmVyZmxvd2lu
ZyBjb250ZW50LgorfTsKKworSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdCBJbmxpbmVDb250
ZW50QnJlYWtlcjo6cHJvY2Vzc092ZXJmbG93aW5nQ29udGVudChjb25zdCBDb250aW51b3VzQ29u
dGVudCYgb3ZlcmZsb3dDb250ZW50LCBjb25zdCBMaW5lU3RhdHVzJiBsaW5lU3RhdHVzKSBjb25z
dAoreworICAgIGF1dG8gY29udGludW91c0NvbnRlbnQgPSBDb250aW51b3VzQ29udGVudCB7IG92
ZXJmbG93Q29udGVudCB9OworICAgIEFTU0VSVCghY29udGludW91c0NvbnRlbnQucnVucygpLmlz
RW1wdHkoKSk7CisKKyAgICBBU1NFUlQoY29udGludW91c0NvbnRlbnQubG9naWNhbFdpZHRoKCkg
PiBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKTsKKyAgICBpZiAoY29udGludW91c0NvbnRlbnQu
aGFzVHJhaWxpbmdDb2xsYXBzaWJsZUNvbnRlbnQoKSkgeworICAgICAgICBBU1NFUlQoaGFzVHJh
aWxpbmdUZXh0Q29udGVudChvdmVyZmxvd0NvbnRlbnQpKTsKKyAgICAgICAgLy8gRmlyc3QgY2hl
Y2sgaWYgdGhlIGNvbnRlbnQgZml0cyB3aXRob3V0IHRoZSB0cmFpbGluZyBjb2xsYXBzaWJsZSBw
YXJ0LgorICAgICAgICBpZiAoY29udGludW91c0NvbnRlbnQubm9uQ29sbGFwc2libGVMb2dpY2Fs
V2lkdGgoKSA8PSBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKQorICAgICAgICAgICAgcmV0dXJu
IHsgUmVzdWx0OjpBY3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpObyB9OworICAgICAgICAvLyBO
b3cgY2hlY2sgaWYgd2UgY2FuIHRyaW0gdGhlIGxpbmUgdG9vLgorICAgICAgICBpZiAobGluZVN0
YXR1cy5oYXNGdWxseUNvbGxhcHNpYmxlVHJhaWxpbmdSdW4gJiYgY29udGludW91c0NvbnRlbnQu
aXNGdWxseUNvbGxhcHNpYmxlKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgbmV3IGNvbnRl
bnQgaXMgZnVsbHkgY29sbGFwc2libGUsIGl0IHNob3VsZCBzdXJlbHkgZml0LgorICAgICAgICAg
ICAgcmV0dXJuIHsgUmVzdWx0OjpBY3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpObyB9OworICAg
ICAgICB9CisgICAgfSBlbHNlIGlmIChsaW5lU3RhdHVzLmNvbGxhcHNpYmxlV2lkdGggJiYgaXNO
b25Db250ZW50UnVuc09ubHkoY29udGludW91c0NvbnRlbnQpKSB7CisgICAgICAgIC8vIExldCdz
IHNlZSBpZiB0aGUgbm9uLWNvbnRlbnQgcnVucyBmaXQgd2hlbiB0aGUgbGluZSBoYXMgdHJhaWxp
bmcgY29sbGFwc2libGUgY29udGVudC4KKyAgICAgICAgLy8gInRleHQgY29udGVudCA8c3BhbiBz
dHlsZT0icGFkZGluZzogMXB4Ij48L3NwYW4+IiA8LSB0aGUgPHNwYW4+PC9zcGFuPiBydW5zIGNv
dWxkIGZpdCBhZnRlciBjb2xsYXBzaW5nIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICAg
ICBpZiAoY29udGludW91c0NvbnRlbnQubG9naWNhbFdpZHRoKCkgPD0gbGluZVN0YXR1cy5hdmFp
bGFibGVXaWR0aCArIGxpbmVTdGF0dXMuY29sbGFwc2libGVXaWR0aCkKKyAgICAgICAgICAgIHJl
dHVybiB7IFJlc3VsdDo6QWN0aW9uOjpLZWVwIH07CisgICAgfQorICAgIGlmIChpc1Zpc3VhbGx5
RW1wdHlXaGl0ZXNwYWNlQ29udGVudChjb250aW51b3VzQ29udGVudCkgJiYgc2hvdWxkS2VlcEVu
ZE9mTGluZVdoaXRlc3BhY2UoY29udGludW91c0NvbnRlbnQpKSB7CisgICAgICAgIC8vIFRoaXMg
b3ZlcmZsb3dpbmcgY29udGVudCBhcHBhcmVudGx5IGZhbGxzIGludG8gdGhlIHJlbW92ZS9oYW5n
IGVuZC1vZi1saW5lLXNwYWNlcyBjYXRlZ29yeS4KKyAgICAgICAgLy8gc2VlIGh0dHBzOi8vd3d3
LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eSBtYXRyaXgKKyAgICAg
ICAgcmV0dXJuIHsgUmVzdWx0OjpBY3Rpb246OktlZXAgfTsKKyAgICB9CisKKyAgICBzaXplX3Qg
b3ZlcmZsb3dpbmdSdW5JbmRleCA9IDA7CisgICAgaWYgKGhhc1RleHRSdW4oY29udGludW91c0Nv
bnRlbnQpKSB7CisgICAgICAgIGF1dG8gdHJ5QnJlYWtpbmdDb250ZW50V2l0aFRleHQgPSBbJl0o
KSAtPiBPcHRpb25hbDxSZXN1bHQ+IHsKKyAgICAgICAgICAgIC8vIDEuIFRoaXMgdGV4dCBjb250
ZW50IGlzIG5vdCBicmVha2FibGUuCisgICAgICAgICAgICAvLyAyLiBUaGlzIGJyZWFrYWJsZSB0
ZXh0IGNvbnRlbnQgZG9lcyBub3QgZml0IGF0IGFsbC4gTm90IGV2ZW4gdGhlIGZpcnN0IGdseXBo
LiBUaGlzIGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UuCisgICAgICAgICAgICAvLyAzLiBXZSBjYW4g
YnJlYWsgdGhlIGNvbnRlbnQgYnV0IGl0IHN0aWxsIG92ZXJmbG93cy4KKyAgICAgICAgICAgIC8v
IDQuIE1hbmFnZWQgdG8gYnJlYWsgdGhlIGNvbnRlbnQgYmVmb3JlIHRoZSBvdmVyZmxvdyBwb2lu
dC4KKyAgICAgICAgICAgIGF1dG8gb3ZlcmZsb3dpbmdDb250ZW50ID0gcHJvY2Vzc092ZXJmbG93
aW5nQ29udGVudFdpdGhUZXh0KGNvbnRpbnVvdXNDb250ZW50LCBsaW5lU3RhdHVzKTsKKyAgICAg
ICAgICAgIG92ZXJmbG93aW5nUnVuSW5kZXggPSBvdmVyZmxvd2luZ0NvbnRlbnQucnVuSW5kZXg7
CisgICAgICAgICAgICBpZiAoIW92ZXJmbG93aW5nQ29udGVudC5icmVha2luZ1Bvc2l0aW9uKQor
ICAgICAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgICAgICBhdXRvIHRyYWlsaW5nQ29u
dGVudCA9IG92ZXJmbG93aW5nQ29udGVudC5icmVha2luZ1Bvc2l0aW9uLT50cmFpbGluZ0NvbnRl
bnQ7CisgICAgICAgICAgICBpZiAoIXRyYWlsaW5nQ29udGVudCkgeworICAgICAgICAgICAgICAg
IC8vIFdlIHRyaWVkIHRvIGJyZWFrIHRoZSBjb250ZW50IGJ1dCB0aGUgYXZhaWxhYmxlIHNwYWNl
IGNhbid0IGV2ZW4gYWNjb21tb2RhdGUgdGhlIGZpcnN0IGdseXBoLgorICAgICAgICAgICAgICAg
IC8vIDEuIFdyYXAgdGhlIGNvbnRlbnQgb3ZlciB0byB0aGUgbmV4dCBsaW5lIHdoZW4gd2UndmUg
Z290IGNvbnRlbnQgb24gdGhlIGxpbmUgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICAvLyAyLiBL
ZWVwIHRoZSBmaXJzdCBnbHlwaCBvbiB0aGUgZW1wdHkgbGluZSAob3Iga2VlcCB0aGUgd2hvbGUg
cnVuIGlmIGl0IGhhcyBvbmx5IG9uZSBnbHlwaC9jb21wbGV0ZWx5IGVtcHR5KS4KKyAgICAgICAg
ICAgICAgICBpZiAobGluZVN0YXR1cy5oYXNDb250ZW50KQorICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246OldyYXAsIElzRW5kT2ZMaW5lOjpZZXMgfTsK
KyAgICAgICAgICAgICAgICBhdXRvIGxlYWRpbmdUZXh0UnVuSW5kZXggPSAqZmlyc3RUZXh0UnVu
SW5kZXgoY29udGludW91c0NvbnRlbnQpOworICAgICAgICAgICAgICAgIGF1dG8mIGlubGluZVRl
eHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGNvbnRpbnVvdXNDb250ZW50LnJ1bnMo
KVtsZWFkaW5nVGV4dFJ1bkluZGV4XS5pbmxpbmVJdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAo
aW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IFJlc3VsdCB7IFJlc3VsdDo6QWN0aW9uOjpLZWVwLCBJc0VuZE9mTGluZTo6WWVzIH07CisgICAg
ICAgICAgICAgICAgYXV0byBmaXJzdENoYXJhY3RlcldpZHRoID0gVGV4dFV0aWw6OndpZHRoKGlu
bGluZVRleHRJdGVtLCBpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBpbmxpbmVUZXh0SXRlbS5zdGFy
dCgpICsgMSwgbGluZVN0YXR1cy5jb250ZW50TG9naWNhbFJpZ2h0KTsKKyAgICAgICAgICAgICAg
ICBhdXRvIGZpcnN0Q2hhcmFjdGVyUnVuID0gUGFydGlhbFJ1biB7IDEsIGZpcnN0Q2hhcmFjdGVy
V2lkdGggfTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246
OkJyZWFrLCBJc0VuZE9mTGluZTo6WWVzLCBSZXN1bHQ6OlBhcnRpYWxUcmFpbGluZ0NvbnRlbnQg
eyBsZWFkaW5nVGV4dFJ1bkluZGV4LCBmaXJzdENoYXJhY3RlclJ1biB9IH07CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiAodHJhaWxpbmdDb250ZW50LT5vdmVyZmxvd3MgJiYgbGluZVN0
YXR1cy5oYXNDb250ZW50KSB7CisgICAgICAgICAgICAgICAgLy8gV2UgbWFuYWdlZCB0byBicmVh
ayBhIHJ1biB3aXRoIG92ZXJmbG93IGJ1dCB0aGUgbGluZSBhbHJlYWR5IGhhcyBjb250ZW50LiBM
ZXQncyB3cmFwIGl0IHRvIHRoZSBuZXh0IGxpbmUuCisgICAgICAgICAgICAgICAgcmV0dXJuIFJl
c3VsdCB7IFJlc3VsdDo6QWN0aW9uOjpXcmFwLCBJc0VuZE9mTGluZTo6WWVzIH07CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICAvLyBFaXRoZXIgd2UgbWFuYWdlZCB0byBicmVhayB3aXRoIG5v
IG92ZXJmbG93IG9yIHRoZSBsaW5lIGlzIGVtcHR5LgorICAgICAgICAgICAgYXV0byB0cmFpbGlu
Z1BhcnRpYWxDb250ZW50ID0gUmVzdWx0OjpQYXJ0aWFsVHJhaWxpbmdDb250ZW50IHsgb3ZlcmZs
b3dpbmdDb250ZW50LmJyZWFraW5nUG9zaXRpb24tPnJ1bkluZGV4LCB0cmFpbGluZ0NvbnRlbnQt
PnBhcnRpYWxSdW4gfTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6OkFjdGlv
bjo6QnJlYWssIElzRW5kT2ZMaW5lOjpZZXMsIHRyYWlsaW5nUGFydGlhbENvbnRlbnQgfTsKKyAg
ICAgICAgfTsKKyAgICAgICAgaWYgKGF1dG8gcmVzdWx0ID0gdHJ5QnJlYWtpbmdDb250ZW50V2l0
aFRleHQoKSkKKyAgICAgICAgICAgIHJldHVybiAqcmVzdWx0OworICAgIH0gZWxzZSBpZiAoY29u
dGludW91c0NvbnRlbnQucnVucygpLnNpemUoKSA+IDEpIHsKKyAgICAgICAgLy8gRklYTUU6IEFk
ZCBzdXBwb3J0IGZvciB2YXJpb3VzIGNvbnRlbnQuCisgICAgICAgIGF1dG8mIHJ1bnMgPSBjb250
aW51b3VzQ29udGVudC5ydW5zKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcnVu
cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKHJ1bnNbaV0uaW5saW5lSXRlbS5pc0Jv
eCgpKSB7CisgICAgICAgICAgICAgICAgb3ZlcmZsb3dpbmdSdW5JbmRleCA9IGk7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAv
LyBJZiB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gYnJlYWsgdGhpcyBvdmVyZmxvd2luZyBjb250ZW50
LCB3ZSBzdGlsbCBuZWVkIHRvIGRlY2lkZSB3aGV0aGVyIGtlZXAgaXQgb3Igd3JhcCBpdCB0byB0
aGUgbmV4dCBsaW5lLgorICAgIGlmICghbGluZVN0YXR1cy5oYXNDb250ZW50KQorICAgICAgICBy
ZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCwgSXNFbmRPZkxpbmU6Ok5vIH07CisgICAgLy8g
Tm93IGVpdGhlciB3cmFwIHRoaXMgY29udGVudCBvdmVyIHRvIHRoZSBuZXh0IGxpbmUgb3IgcmV2
ZXJ0IGJhY2sgdG8gYW4gZWFybGllciB3cmFwcGluZyBvcHBvcnR1bml0eSwgb3Igbm90IHdyYXAg
YXQgYWxsLgorICAgIGF1dG8gc2hvdWxkV3JhcFVuYnJlYWthYmxlQ29udGVudFRvTmV4dExpbmUg
PSBbJl0geworICAgICAgICAvLyBUaGUgaW5kaXZpZHVhbCBydW5zIGluIHRoaXMgY29udGludW91
cyBjb250ZW50IGRvbid0IGJyZWFrLCBsZXQncyBjaGVjayBpZiB3ZSBhcmUgYWxsb3dlZCB0byB3
cmFwIHRoaXMgY29udGVudCB0byBuZXh0IGxpbmUgKGUuZy4gcHJlIHdvdWxkIHByZXZlbnQgdXMg
ZnJvbSB3cmFwcGluZykuCisgICAgICAgIC8vIFBhcmVudCBzdHlsZSBkcml2ZXMgdGhlIHdyYXBw
aW5nIGJlaGF2aW9yIGhlcmUuCisgICAgICAgIC8vIGUuZy4gPGRpdiBzdHlsZT0id2hpdGUtc3Bh
Y2U6IG5vd3JhcCI+c29tZSB0ZXh0PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3
aGl0ZS1zcGFjZTogcHJlLXdyYXAiPjwvZGl2PjwvZGl2Pi4KKyAgICAgICAgLy8gV2hpbGUgdGhl
IGlubGluZS1ibG9jayBoYXMgcHJlLXdyYXAgd2hpY2ggYWxsb3dzIHdyYXBwaW5nLCB0aGUgY29u
dGVudCBsaXZlcyBpbiBhIG5vd3JhcCBjb250ZXh0LgorICAgICAgICByZXR1cm4gaXNXcmFwcGlu
Z0FsbG93ZWQoY29udGludW91c0NvbnRlbnQucnVucygpW292ZXJmbG93aW5nUnVuSW5kZXhdLmlu
bGluZUl0ZW0pOworICAgIH07CisgICAgaWYgKHNob3VsZFdyYXBVbmJyZWFrYWJsZUNvbnRlbnRU
b05leHRMaW5lKCkpCisgICAgICAgIHJldHVybiB7IFJlc3VsdDo6QWN0aW9uOjpXcmFwLCBJc0Vu
ZE9mTGluZTo6WWVzIH07CisgICAgaWYgKGxpbmVTdGF0dXMuaGFzV3JhcE9wcG9ydHVuaXR5QXRQ
cmV2aW91c1Bvc2l0aW9uKQorICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6UmV2ZXJ0
VG9MYXN0V3JhcE9wcG9ydHVuaXR5LCBJc0VuZE9mTGluZTo6WWVzIH07CisgICAgcmV0dXJuIHsg
UmVzdWx0OjpBY3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpObyB9OworfQorCitPdmVyZmxvd2lu
Z1RleHRDb250ZW50IElubGluZUNvbnRlbnRCcmVha2VyOjpwcm9jZXNzT3ZlcmZsb3dpbmdDb250
ZW50V2l0aFRleHQoY29uc3QgQ29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250ZW50LCBj
b25zdCBMaW5lU3RhdHVzJiBsaW5lU3RhdHVzKSBjb25zdAoreworICAgIGF1dG8mIHJ1bnMgPSBj
b250aW51b3VzQ29udGVudC5ydW5zKCk7CisgICAgQVNTRVJUKCFydW5zLmlzRW1wdHkoKSk7CisK
KyAgICBhdXRvIGlzQnJlYWthYmxlUnVuID0gW10gKGF1dG8mIHJ1bikgeworICAgICAgICBBU1NF
UlQocnVuLmlubGluZUl0ZW0uaXNUZXh0KCkgfHwgcnVuLmlubGluZUl0ZW0uaXNJbmxpbmVCb3hT
dGFydCgpIHx8IHJ1bi5pbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkgfHwgcnVuLmlubGluZUl0
ZW0ubGF5b3V0Qm94KCkuaXNJbWFnZSgpKTsKKyAgICAgICAgaWYgKCFydW4uaW5saW5lSXRlbS5p
c1RleHQoKSkgeworICAgICAgICAgICAgLy8gQ2FuJ3QgYnJlYWsgaG9yaXpvbnRhbCBzcGFjaW5n
IC0+IGUuZy4gPHNwYW4gc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEwMHB4OyI+dGV4dGNvbnRlbnQ8
L3NwYW4+LCBpZiB0aGUgW2lubGluZSBib3ggZW5kXSBpcyB0aGUgb3ZlcmZsb3duIGlubGluZSBp
dGVtCisgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlJ3MgYW5vdGhlciBp
bmxpbmUgaXRlbSBiZXlvbmQgdGhlIFtpbmxpbmUgYm94IGVuZF0gdG8gc3BsaXQuCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyB0
ZXh0IHJ1biBuZWVkcyB0byBzdGF5IG9uIHRoZSBjdXJyZW50IGxpbmUuICAKKyAgICAgICAgcmV0
dXJuIGlzV3JhcHBpbmdBbGxvd2VkKHJ1bi5pbmxpbmVJdGVtKTsKKyAgICB9OworCisgICAgYXV0
byBmaW5kVHJhaWxpbmdSdW5JbmRleCA9IFsmXSAoYXV0byBicmVha2FibGVSdW5JbmRleCkgLT4g
T3B0aW9uYWw8c2l6ZV90PiB7CisgICAgICAgIC8vIFdoZW4gdGhlIGJyZWFraW5nIHBvc2l0aW9u
IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJ1biwgdGhlIHRyYWlsaW5nIHJ1biBpcyB0aGUg
cHJldmlvdXMgb25lLgorICAgICAgICBpZiAoIWJyZWFrYWJsZVJ1bkluZGV4KQorICAgICAgICAg
ICAgcmV0dXJuIHsgfTsKKyAgICAgICAgLy8gVHJ5IG5vdCBicmVhayBjb250ZW50IGF0IGlubGlu
ZSBib3ggYm91bmRhcnkKKyAgICAgICAgLy8gZS5nLiA8c3Bhbj5maXRzPC9zcGFuPjxzcGFuPm92
ZXJmbG93czwvc3Bhbj4KKyAgICAgICAgLy8gd2hlbiB0aGUgdGV4dCAib3ZlcmZsb3dzIiBjb21w
bGV0ZWx5IG92ZXJmbG93cywgbGV0J3MgYnJlYWsgdGhlIGNvbnRlbnQgcmlnaHQgYmVmb3JlIHRo
ZSAnPHNwYW4+Jy4KKyAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBzdWJzZXF1ZW50
IGVtcHR5IGlubGluZSBib3hlcyBlLmcuCisgICAgICAgIGF1dG8gdHJhaWxpbmdDYW5kaWRhdGVJ
bmRleCA9IGJyZWFrYWJsZVJ1bkluZGV4IC0gMTsKKyAgICAgICAgYXV0byBpc0F0SW5saW5lQm94
ID0gcnVuc1t0cmFpbGluZ0NhbmRpZGF0ZUluZGV4XS5pbmxpbmVJdGVtLmlzSW5saW5lQm94U3Rh
cnQoKTsKKyAgICAgICAgcmV0dXJuICFpc0F0SW5saW5lQm94ID8gdHJhaWxpbmdDYW5kaWRhdGVJ
bmRleCA6IHRyYWlsaW5nQ2FuZGlkYXRlSW5kZXggPyBtYWtlT3B0aW9uYWwodHJhaWxpbmdDYW5k
aWRhdGVJbmRleCAtIDEpIDogV1RGOjpudWxsb3B0OworICAgIH07CisKKyAgICAvLyBDaGVjayB3
aGVyZSB0aGUgb3ZlcmZsb3cgb2NjdXJzIGFuZCB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUg
dG8gZmlndXJlIG91dCB0aGUgYnJlYWtpbmcgYmVoYXZpb3VyLgorICAgIC8vIDxzcGFuIHN0eWxl
PSJ3b3JkLWJyZWFrOiBub3JtYWwiPmZpcnN0PC9zcGFuPjxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFr
OiBicmVhay1hbGwiPnNlY29uZDwvc3Bhbj48c3BhbiBzdHlsZT0id29yZC1icmVhazogbm9ybWFs
Ij50aGlyZDwvc3Bhbj4KKworICAgIC8vIEZpcnN0IGZpbmQgdGhlIG92ZXJmbG93aW5nIHJ1bi4g
CisgICAgYXV0byBhY2N1bXVsYXRlZENvbnRlbnRXaWR0aCA9IElubGluZUxheW91dFVuaXQgeyB9
OworICAgIGF1dG8gb3ZlcmZsb3dpbmdSdW5JbmRleCA9IHJ1bnMuc2l6ZSgpOyAKKyAgICBmb3Ig
KHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAg
ICAgYXV0byBydW5Mb2dpY2FsV2lkdGggPSBydW5zW2luZGV4XS5sb2dpY2FsV2lkdGg7CisgICAg
ICAgIGlmIChhY2N1bXVsYXRlZENvbnRlbnRXaWR0aCArIHJ1bkxvZ2ljYWxXaWR0aCAgPiBsaW5l
U3RhdHVzLmF2YWlsYWJsZVdpZHRoKSB7CisgICAgICAgICAgICBvdmVyZmxvd2luZ1J1bkluZGV4
ID0gaW5kZXg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhY2N1bXVs
YXRlZENvbnRlbnRXaWR0aCArPSBydW5Mb2dpY2FsV2lkdGg7CisgICAgfQorICAgIC8vIFdlIGhh
dmUgdG8gaGF2ZSBhbiBvdmVyZmxvd2luZyBydW4uCisgICAgUkVMRUFTRV9BU1NFUlQob3ZlcmZs
b3dpbmdSdW5JbmRleCA8IHJ1bnMuc2l6ZSgpKTsKKworICAgIGF1dG8gdHJ5QnJlYWtpbmdPdmVy
Zmxvd2luZ1J1biA9IFsmXSgpIC0+IE9wdGlvbmFsPE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJy
ZWFraW5nUG9zaXRpb24+IHsKKyAgICAgICAgYXV0byBvdmVyZmxvd2luZ1J1biA9IHJ1bnNbb3Zl
cmZsb3dpbmdSdW5JbmRleF07CisgICAgICAgIGlmICghaXNCcmVha2FibGVSdW4ob3ZlcmZsb3dp
bmdSdW4pKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgaWYgKGF1dG8gcGFydGlh
bFJ1biA9IHRyeUJyZWFraW5nVGV4dFJ1bihvdmVyZmxvd2luZ1J1biwgbGluZVN0YXR1cy5jb250
ZW50TG9naWNhbFJpZ2h0ICsgYWNjdW11bGF0ZWRDb250ZW50V2lkdGgsIHN0ZDo6bWF4KDAuMGYs
IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGggLSBhY2N1bXVsYXRlZENvbnRlbnRXaWR0aCksIGxp
bmVTdGF0dXMuaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSkgeworICAgICAg
ICAgICAgaWYgKHBhcnRpYWxSdW4tPmxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gT3Zl
cmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IG92ZXJmbG93aW5nUnVuSW5k
ZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb246OlRyYWlsaW5nQ29u
dGVudCB7IGZhbHNlLCBwYXJ0aWFsUnVuIH0gfTsKKyAgICAgICAgICAgIC8vIFdoZW4gdGhlIGJy
ZWFraW5nIHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJ1biwgdGhlIHRyYWls
aW5nIHJ1biBpcyB0aGUgcHJldmlvdXMgb25lLgorICAgICAgICAgICAgaWYgKGF1dG8gdHJhaWxp
bmdSdW5JbmRleCA9IGZpbmRUcmFpbGluZ1J1bkluZGV4KG92ZXJmbG93aW5nUnVuSW5kZXgpKQor
ICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bv
c2l0aW9uIHsgKnRyYWlsaW5nUnVuSW5kZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFr
aW5nUG9zaXRpb246OlRyYWlsaW5nQ29udGVudCB7IH0gfTsKKyAgICAgICAgICAgIC8vIFNvbWV0
aW1lcyB3ZSBjYW4ndCBhY2NvbW1vZGF0ZSBldmVuIHRoZSB2ZXJ5IGZpcnN0IGNoYXJhY3Rlci4g
CisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB3aGVuIHRo
ZXJlJ3Mgbm8gYnJlYWthYmxlIHJ1biBpbiB0aGlzIHNldC4KKyAgICAgICAgICAgIHJldHVybiBP
dmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgfTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4geyB9OworICAgIH07CisgICAgLy8gQ2hlY2sgaWYgd2UgYWN0dWFsbHkg
YnJlYWsgdGhpcyBydW4uCisgICAgaWYgKGF1dG8gYnJlYWtpbmdQb3NpdGlvbiA9IHRyeUJyZWFr
aW5nT3ZlcmZsb3dpbmdSdW4oKSkKKyAgICAgICAgcmV0dXJuIHsgb3ZlcmZsb3dpbmdSdW5JbmRl
eCwgYnJlYWtpbmdQb3NpdGlvbiB9OworCisgICAgYXV0byB0cnlCcmVha2luZ1ByZXZpb3VzTm9u
T3ZlcmZsb3dpbmdSdW5zID0gWyZdKCkgLT4gT3B0aW9uYWw8T3ZlcmZsb3dpbmdUZXh0Q29udGVu
dDo6QnJlYWtpbmdQb3NpdGlvbj4geworICAgICAgICBhdXRvIHByZXZpb3VzQ29udGVudFdpZHRo
ID0gYWNjdW11bGF0ZWRDb250ZW50V2lkdGg7CisgICAgICAgIGZvciAoYXV0byBpbmRleCA9IG92
ZXJmbG93aW5nUnVuSW5kZXg7IGluZGV4LS07KSB7CisgICAgICAgICAgICBhdXRvJiBydW4gPSBy
dW5zW2luZGV4XTsKKyAgICAgICAgICAgIHByZXZpb3VzQ29udGVudFdpZHRoIC09IHJ1bi5sb2dp
Y2FsV2lkdGg7CisgICAgICAgICAgICBpZiAoIWlzQnJlYWthYmxlUnVuKHJ1bikpCisgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBBU1NFUlQocnVuLmlubGluZUl0ZW0uaXNU
ZXh0KCkpOworICAgICAgICAgICAgaWYgKGF1dG8gcGFydGlhbFJ1biA9IHRyeUJyZWFraW5nVGV4
dFJ1bihydW4sIGxpbmVTdGF0dXMuY29udGVudExvZ2ljYWxSaWdodCArIHByZXZpb3VzQ29udGVu
dFdpZHRoLCB7IH0sIGxpbmVTdGF0dXMuaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0
aW9uKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgdGhpcyBydW4gZml0cywgc28gaWYg
YnJlYWtpbmcgaXMgYWxsb3dlZCBvbiB0aGUgcnVuLCBpdCBzaG91bGQgcmV0dXJuIGEgbm9uLWVt
cHR5IGxlZnQtc2lkZQorICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0J3MgZWl0aGVyIGF0IGh5
cGhlbiBwb3NpdGlvbiBvciB0aGUgZW50aXJlIHJ1biBpcyByZXR1cm5lZC4KKyAgICAgICAgICAg
ICAgICBBU1NFUlQocGFydGlhbFJ1bi0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBhdXRvIHJ1
bklzRnVsbHlBY2NvbW1vZGF0ZWQgPSBwYXJ0aWFsUnVuLT5sZW5ndGggPT0gZG93bmNhc3Q8SW5s
aW5lVGV4dEl0ZW0+KHJ1bi5pbmxpbmVJdGVtKS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IGluZGV4LCBP
dmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uOjpUcmFpbGluZ0NvbnRlbnQg
eyBmYWxzZSwgcnVuSXNGdWxseUFjY29tbW9kYXRlZCA/IFdURjo6bnVsbG9wdCA6IHBhcnRpYWxS
dW4gfSB9OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB7IH07Cisg
ICAgfTsKKyAgICAvLyBXZSBkaWQgbm90IG1hbmFnZSB0byBicmVhayB0aGUgcnVuIHRoYXQgYWN0
dWFsbHkgb3ZlcmZsb3dzIHRoZSBsaW5lLgorICAgIC8vIExldCdzIHRyeSB0byBmaW5kIGEgcHJl
dmlvdXMgYnJlYWtpbmcgcG9zaXRpb24gc3RhcnRpbmcgZnJvbSB0aGUgb3ZlcmZsb3dpbmcgcnVu
LiBJdCBzdXJlbHkgZml0cy4KKyAgICBpZiAoYXV0byBicmVha2luZ1Bvc2l0aW9uID0gdHJ5QnJl
YWtpbmdQcmV2aW91c05vbk92ZXJmbG93aW5nUnVucygpKQorICAgICAgICByZXR1cm4geyBvdmVy
Zmxvd2luZ1J1bkluZGV4LCBicmVha2luZ1Bvc2l0aW9uIH07CisKKyAgICBhdXRvIHRyeUJyZWFr
aW5nTmV4dE92ZXJmbG93aW5nUnVucyA9IFsmXSgpIC0+IE9wdGlvbmFsPE92ZXJmbG93aW5nVGV4
dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb24+IHsKKyAgICAgICAgYXV0byBuZXh0Q29udGVudFdp
ZHRoID0gYWNjdW11bGF0ZWRDb250ZW50V2lkdGggKyBydW5zW292ZXJmbG93aW5nUnVuSW5kZXhd
LmxvZ2ljYWxXaWR0aDsKKyAgICAgICAgZm9yIChhdXRvIGluZGV4ID0gb3ZlcmZsb3dpbmdSdW5J
bmRleCArIDE7IGluZGV4IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGF1
dG8mIHJ1biA9IHJ1bnNbaW5kZXhdOworICAgICAgICAgICAgaWYgKGlzQnJlYWthYmxlUnVuKHJ1
bikpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQocnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpOwor
ICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGlzIHJ1biBkb2VzIG5vdCBmaXQgdGhl
IGF2YWlsYWJsZSBzcGFjZS4gSWYgd2UgY2FuIGJyZWFrIGl0IGF0IGFueSBwb3NpdGlvbiwgbGV0
J3MganVzdCB1c2UgdGhlIHN0YXJ0IG9mIHRoZSBydW4uCisgICAgICAgICAgICAgICAgaWYgKHdv
cmRCcmVha0JlaGF2aW9yKHJ1bi5pbmxpbmVJdGVtLnN0eWxlKCksIGxpbmVTdGF0dXMuaGFzV3Jh
cE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSA9PSBXb3JkQnJlYWtSdWxlOjpBdEFyYml0
cmFyeVBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgYmUgb24gYW4g
aW5saW5lIGJveCBib3VuZGFyeS4gTGV0J3MgZ28gYmFjayB0byB0aGUgcnVuIGluIGZyb250IG9m
IHRoZSBpbmxpbmUgYm94IHN0YXJ0IHJ1bi4KKyAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiA8
c3Bhbj51bmJyZWFrYWJsZV9hbmRfb3ZlcmZsb3c8c3BhbiBzdHlsZT0id29yZC1icmVhazogYnJl
YWstYWxsIj5icmVha2FibGU8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBh
dCAiYnJlYWthYmxlIiwgPHNwYW4+IGlzIGF0IGluZGV4IC0gMSBhbmQgdGhlIHRyYWlsaW5nIHJ1
biBpcyBhdCBpbmRleCAtIDIuCisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChydW5zW2luZGV4
IC0gMV0uaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkpOworICAgICAgICAgICAgICAgICAg
ICBhdXRvIHRyYWlsaW5nUnVuSW5kZXggPSBmaW5kVHJhaWxpbmdSdW5JbmRleChpbmRleCk7Cisg
ICAgICAgICAgICAgICAgICAgIGlmICghdHJhaWxpbmdSdW5JbmRleCkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gVGhpcyBjb250aW51b3VzIGNvbnRlbnQgZGlkIG5vdCBmaXQgZnJvbSB0
aGUgZ2V0LWdvLiBObyB0cmFpbGluZyBydW4uCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IH07CisgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gQXQgd29yc3Qgd2UgYXJlIGJh
Y2sgdG8gdGhlIG92ZXJmbG93aW5nIHJ1biwgbGlrZSBpbiB0aGUgZXhhbXBsZSBhYm92ZS4KKyAg
ICAgICAgICAgICAgICAgICAgQVNTRVJUKCp0cmFpbGluZ1J1bkluZGV4ID49IG92ZXJmbG93aW5n
UnVuSW5kZXgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3ZlcmZsb3dpbmdUZXh0Q29u
dGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7ICp0cmFpbGluZ1J1bkluZGV4LCBPdmVyZmxvd2luZ1Rl
eHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uOjpUcmFpbGluZ0NvbnRlbnQgeyB0cnVlIH0gfTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGF1dG8gcGFydGlhbFJ1biA9
IHRyeUJyZWFraW5nVGV4dFJ1bihydW4sIGxpbmVTdGF0dXMuY29udGVudExvZ2ljYWxSaWdodCAr
IG5leHRDb250ZW50V2lkdGgsIHsgfSwgbGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFBy
ZXZpb3VzUG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChwYXJ0aWFsUnVu
LT5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYW5hZ2VkIHRvIGJyZWFrIHRo
aXMgdGV4dCBydW4gbWlkIGNvbnRlbnQuIEl0IGhhcyB0byBiZSBhIGh5cGhlbiBicmVhay4KKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5n
UG9zaXRpb24geyBpbmRleCwgT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlv
bjo6VHJhaWxpbmdDb250ZW50IHsgdHJ1ZSwgcGFydGlhbFJ1biB9IH07CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dENvbnRlbnRXaWR0aCArPSBydW4u
bG9naWNhbFdpZHRoOworICAgICAgICB9CisgICAgICAgIHJldHVybiB7IH07CisgICAgfTsKKyAg
ICAvLyBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB0aGVyZSdzIG5vIGJyZWFrYWJsZSBydW4g
YWxsIHRoZSB3YXkgdG8gdGhlIG92ZXJmbG93aW5nIHJ1bi4KKyAgICAvLyBOb3cgd2UgbmVlZCB0
byBjaGVjayBpZiBhbnkgcnVuIGFmdGVyIHRoZSBvdmVyZmxvd2luZyBjb250ZW50IGNhbiBicmVh
ay4KKyAgICAvLyBlLmcuIDxzcGFuPnRoaXNfY29udGVudF9vdmVyZmxvd3NfYnV0X25vdF9icmVh
a2FibGU8c3Bhbj48c3BhbiBzdHlsZT0id29yZC1icmVhazogYnJlYWstYWxsIj5idXRfdGhpc19p
c19icmVha2FibGU8L3NwYW4+CisgICAgaWYgKGF1dG8gYnJlYWtpbmdQb3NpdGlvbiA9IHRyeUJy
ZWFraW5nTmV4dE92ZXJmbG93aW5nUnVucygpKQorICAgICAgICByZXR1cm4geyBvdmVyZmxvd2lu
Z1J1bkluZGV4LCBicmVha2luZ1Bvc2l0aW9uIH07CisKKyAgICAvLyBHaXZlIHVwLCB0aGVyZSdz
IG5vIGJyZWFrYWJsZSBydW4gaW4gaGVyZS4KKyAgICByZXR1cm4geyBvdmVyZmxvd2luZ1J1bklu
ZGV4IH07Cit9CisKK09wdGlvblNldDxJbmxpbmVDb250ZW50QnJlYWtlcjo6V29yZEJyZWFrUnVs
ZT4gSW5saW5lQ29udGVudEJyZWFrZXI6OndvcmRCcmVha0JlaGF2aW9yKGNvbnN0IFJlbmRlclN0
eWxlJiBzdHlsZSwgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pIGNv
bnN0Cit7CisgICAgLy8gRGlzcmVnYXJkIGFueSBwcm9oaWJpdGlvbiBhZ2FpbnN0IGxpbmUgYnJl
YWtzIG1hbmRhdGVkIGJ5IHRoZSB3b3JkLWJyZWFrIHByb3BlcnR5LgorICAgIC8vIFRoZSBkaWZm
ZXJlbnQgd3JhcHBpbmcgb3Bwb3J0dW5pdGllcyBtdXN0IG5vdCBiZSBwcmlvcml0aXplZC4gSHlw
aGVuYXRpb24gaXMgbm90IGFwcGxpZWQuCisgICAgaWYgKHN0eWxlLmxpbmVCcmVhaygpID09IExp
bmVCcmVhazo6QW55d2hlcmUpCisgICAgICAgIHJldHVybiB7IFdvcmRCcmVha1J1bGU6OkF0QXJi
aXRyYXJ5UG9zaXRpb24gfTsKKyAgICAvLyBCcmVha2luZyBpcyBhbGxvd2VkIHdpdGhpbiDigJx3
b3Jkc+KAnS4KKyAgICBpZiAoc3R5bGUud29yZEJyZWFrKCkgPT0gV29yZEJyZWFrOjpCcmVha0Fs
bCkKKyAgICAgICAgcmV0dXJuIHsgV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbiB9
OworICAgIC8vIEJyZWFraW5nIGlzIGZvcmJpZGRlbiB3aXRoaW4g4oCcd29yZHPigJ0uCisgICAg
aWYgKHN0eWxlLndvcmRCcmVhaygpID09IFdvcmRCcmVhazo6S2VlcEFsbCkKKyAgICAgICAgcmV0
dXJuIHsgfTsKKworICAgIGF1dG8gYnJlYWtSdWxlcyA9IE9wdGlvblNldDxXb3JkQnJlYWtSdWxl
PiB7IH07CisgICAgYXV0byBoeXBoZW5hdGlvbklzQWxsb3dlZCA9ICFuX2h5cGhlbmF0aW9uSXNE
aXNhYmxlZCAmJiBzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVuczo6QXV0byAmJiBjYW5IeXBoZW5h
dGUoc3R5bGUuY29tcHV0ZWRMb2NhbGUoKSk7CisgICAgaWYgKGh5cGhlbmF0aW9uSXNBbGxvd2Vk
KQorICAgICAgICBicmVha1J1bGVzLmFkZCh7IFdvcmRCcmVha1J1bGU6OkF0SHlwaGVuYXRpb25P
cHBvcnR1bml0aWVzIH0pOworICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IGNv
bnRlbnQsIHRoZSB3b3JkLWJyZWFrIHByb3BlcnR5IGFsc28gc3VwcG9ydHMgYSBkZXByZWNhdGVk
IGJyZWFrLXdvcmQga2V5d29yZC4KKyAgICAvLyBXaGVuIHNwZWNpZmllZCwgdGhpcyBoYXMgdGhl
IHNhbWUgZWZmZWN0IGFzIHdvcmQtYnJlYWs6IG5vcm1hbCBhbmQgb3ZlcmZsb3ctd3JhcDogYW55
d2hlcmUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgb3ZlcmZsb3ctd3Jh
cCBwcm9wZXJ0eS4KKyAgICBpZiAoc3R5bGUud29yZEJyZWFrKCkgPT0gV29yZEJyZWFrOjpCcmVh
a1dvcmQgJiYgIWhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgeworICAgICAg
ICBicmVha1J1bGVzLmFkZCh7IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRpb24gfSk7
CisgICAgICAgIHJldHVybiBicmVha1J1bGVzOworICAgIH0KKyAgICAvLyBPdmVyZmxvd1dyYXA6
OkJyZWFrOiBBbiBvdGhlcndpc2UgdW5icmVha2FibGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBt
YXkgYmUgYnJva2VuIGF0IGFuIGFyYml0cmFyeSBwb2ludCBpZiB0aGVyZSBhcmUgbm8gb3RoZXJ3
aXNlLWFjY2VwdGFibGUgYnJlYWsgcG9pbnRzIGluIHRoZSBsaW5lLgorICAgIGlmIChzdHlsZS5v
dmVyZmxvd1dyYXAoKSA9PSBPdmVyZmxvd1dyYXA6OkJyZWFrICYmICFoYXNXcmFwT3Bwb3J0dW5p
dHlBdFByZXZpb3VzUG9zaXRpb24pIHsKKyAgICAgICAgYnJlYWtSdWxlcy5hZGQoeyBXb3JkQnJl
YWtSdWxlOjpBdEFyYml0cmFyeVBvc2l0aW9uIH0pOworICAgICAgICByZXR1cm4gYnJlYWtSdWxl
czsKKyAgICB9CisgICAgcmV0dXJuIGJyZWFrUnVsZXM7Cit9CisKK09wdGlvbmFsPElubGluZUNv
bnRlbnRCcmVha2VyOjpQYXJ0aWFsUnVuPiBJbmxpbmVDb250ZW50QnJlYWtlcjo6dHJ5QnJlYWtp
bmdUZXh0UnVuKGNvbnN0IENvbnRpbnVvdXNDb250ZW50OjpSdW4mIG92ZXJmbG93aW5nUnVuLCBJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBh
dmFpbGFibGVXaWR0aCwgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24p
IGNvbnN0Cit7CisgICAgQVNTRVJUKG92ZXJmbG93aW5nUnVuLmlubGluZUl0ZW0uaXNUZXh0KCkp
OworICAgIGF1dG8mIGlubGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KG92
ZXJmbG93aW5nUnVuLmlubGluZUl0ZW0pOworICAgIGF1dG8mIHN0eWxlID0gaW5saW5lVGV4dEl0
ZW0uc3R5bGUoKTsKKyAgICBhdXRvIGF2YWlsYWJsZVNwYWNlSXNJbmZpbml0ZSA9ICFhdmFpbGFi
bGVXaWR0aC5oYXNWYWx1ZSgpOworCisgICAgYXV0byBicmVha1J1bGVzID0gd29yZEJyZWFrQmVo
YXZpb3Ioc3R5bGUsIGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbik7CisgICAg
aWYgKGJyZWFrUnVsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4geyB9OworCisgICAgaWYg
KGJyZWFrUnVsZXMuY29udGFpbnMoV29yZEJyZWFrUnVsZTo6QXRIeXBoZW5hdGlvbk9wcG9ydHVu
aXRpZXMpKSB7CisgICAgICAgIGF1dG8gdHJ5QnJlYWtpbmdBdEh5cGhlbmF0aW9uT3Bwb3J0dW5p
dHkgPSBbJl0oKSAtPiBPcHRpb25hbDxQYXJ0aWFsUnVuPiB7CisgICAgICAgICAgICAvLyBGaW5k
IHRoZSBoeXBoZW4gcG9zaXRpb24gYXMgZm9sbG93czoKKyAgICAgICAgICAgIC8vIDEuIFNwbGl0
IHRoZSB0ZXh0IGJ5IHRha2luZyB0aGUgaHlwaGVuIHdpZHRoIGludG8gYWNjb3VudAorICAgICAg
ICAgICAgLy8gMi4gRmluZCB0aGUgbGFzdCBoeXBoZW4gcG9zaXRpb24gYmVmb3JlIHRoZSBzcGxp
dCBwb3NpdGlvbgorICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVTcGFjZUlzSW5maW5pdGUgJiYg
ISphdmFpbGFibGVXaWR0aCkgeworICAgICAgICAgICAgICAgIC8vIFdlIHdvbid0IGJlIGFibGUg
dG8gZmluZCBoeXBoZW4gbG9jYXRpb24gd2hlbiB0aGVyZSdzIG5vIGF2YWlsYWJsZSBzcGFjZS4K
KyAgICAgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICAgICAgfQorICAgICAgICAgICAg
YXV0byBydW5MZW5ndGggPSBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKTsKKyAgICAgICAgICAgIHVu
c2lnbmVkIGxpbWl0QmVmb3JlID0gc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpID09IFJl
bmRlclN0eWxlOjppbml0aWFsSHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpID8gMCA6IHN0eWxlLmh5
cGhlbmF0aW9uTGltaXRCZWZvcmUoKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxpbWl0QWZ0ZXIg
PSBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QWZ0ZXIoKSA9PSBSZW5kZXJTdHlsZTo6aW5pdGlhbEh5
cGhlbmF0aW9uTGltaXRBZnRlcigpID8gMCA6IHN0eWxlLmh5cGhlbmF0aW9uTGltaXRBZnRlcigp
OworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBydW4gY2FuIGFjY29tbW9kYXRlIHRoZSBi
ZWZvcmUvYWZ0ZXIgbGltaXRzIGF0IGFsbCBiZWZvcmUgc3RhcnQgbWVhc3VyaW5nIHRleHQuCisg
ICAgICAgICAgICBpZiAobGltaXRCZWZvcmUgPj0gcnVuTGVuZ3RoIHx8IGxpbWl0QWZ0ZXIgPj0g
cnVuTGVuZ3RoIHx8IGxpbWl0QmVmb3JlICsgbGltaXRBZnRlciA+IHJ1bkxlbmd0aCkKKyAgICAg
ICAgICAgICAgICByZXR1cm4geyB9OworCisgICAgICAgICAgICB1bnNpZ25lZCBsZWZ0U2lkZUxl
bmd0aCA9IHJ1bkxlbmd0aDsKKyAgICAgICAgICAgIGF1dG8mIGZvbnRDYXNjYWRlID0gc3R5bGUu
Zm9udENhc2NhZGUoKTsKKyAgICAgICAgICAgIGF1dG8gaHlwaGVuV2lkdGggPSBJbmxpbmVMYXlv
dXRVbml0IHsgZm9udENhc2NhZGUud2lkdGgoVGV4dFJ1biB7IFN0cmluZ1ZpZXcgeyBzdHlsZS5o
eXBoZW5TdHJpbmcoKSB9IH0pIH07CisgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZVNwYWNlSXNJ
bmZpbml0ZSkgeworICAgICAgICAgICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGhFeGNsdWRpbmdI
eXBoZW4gPSAqYXZhaWxhYmxlV2lkdGggLSBoeXBoZW5XaWR0aDsKKyAgICAgICAgICAgICAgICBp
ZiAoYXZhaWxhYmxlV2lkdGhFeGNsdWRpbmdIeXBoZW4gPD0gMCB8fCAhZW5vdWdoV2lkdGhGb3JI
eXBoZW5hdGlvbihhdmFpbGFibGVXaWR0aEV4Y2x1ZGluZ0h5cGhlbiwgZm9udENhc2NhZGUucGl4
ZWxTaXplKCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICAgICAg
ICAgIGxlZnRTaWRlTGVuZ3RoID0gVGV4dFV0aWw6OnNwbGl0KGlubGluZVRleHRJdGVtLCBvdmVy
Zmxvd2luZ1J1bi5sb2dpY2FsV2lkdGgsIGF2YWlsYWJsZVdpZHRoRXhjbHVkaW5nSHlwaGVuLCBs
b2dpY2FsTGVmdCkubGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlZnRT
aWRlTGVuZ3RoIDwgbGltaXRCZWZvcmUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAg
ICAgICAgICAgIC8vIEFkanVzdCBiZWZvcmUgaW5kZXggdG8gYWNjb21tb2RhdGUgdGhlIGxpbWl0
LWFmdGVyIHZhbHVlIChpdCdzIHRoZSBsYXN0IHBvdGVudGlhbCBoeXBoZW4gbG9jYXRpb24gaW4g
dGhpcyBydW4pLgorICAgICAgICAgICAgYXV0byBoeXBoZW5CZWZvcmUgPSBzdGQ6Om1pbihsZWZ0
U2lkZUxlbmd0aCwgcnVuTGVuZ3RoIC0gbGltaXRBZnRlcikgKyAxOworICAgICAgICAgICAgdW5z
aWduZWQgaHlwaGVuTG9jYXRpb24gPSBsYXN0SHlwaGVuTG9jYXRpb24oU3RyaW5nVmlldyhpbmxp
bmVUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpKS5zdWJzdHJpbmcoaW5saW5lVGV4
dEl0ZW0uc3RhcnQoKSwgaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpLCBoeXBoZW5CZWZvcmUsIHN0
eWxlLmNvbXB1dGVkTG9jYWxlKCkpOworICAgICAgICAgICAgaWYgKCFoeXBoZW5Mb2NhdGlvbiB8
fCBoeXBoZW5Mb2NhdGlvbiA8IGxpbWl0QmVmb3JlKQorICAgICAgICAgICAgICAgIHJldHVybiB7
IH07CisgICAgICAgICAgICAvLyBoeXBoZW5Mb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgc3Rh
cnQgb2YgdGhpcyBJbmxpbmVJdGVtVGV4dC4KKyAgICAgICAgICAgIEFTU0VSVChpbmxpbmVUZXh0
SXRlbS5zdGFydCgpICsgaHlwaGVuTG9jYXRpb24gPCBpbmxpbmVUZXh0SXRlbS5lbmQoKSk7Cisg
ICAgICAgICAgICBhdXRvIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoV2l0aEh5cGhlbiA9IFRleHRV
dGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwgaW5saW5l
VGV4dEl0ZW0uc3RhcnQoKSArIGh5cGhlbkxvY2F0aW9uLCBsb2dpY2FsTGVmdCk7CisgICAgICAg
ICAgICByZXR1cm4gUGFydGlhbFJ1biB7IGh5cGhlbkxvY2F0aW9uLCB0cmFpbGluZ1BhcnRpYWxS
dW5XaWR0aFdpdGhIeXBoZW4sIGh5cGhlbldpZHRoIH07CisgICAgICAgIH07CisgICAgICAgIGlm
IChhdXRvIHBhcnRpYWxSdW4gPSB0cnlCcmVha2luZ0F0SHlwaGVuYXRpb25PcHBvcnR1bml0eSgp
KQorICAgICAgICAgICAgcmV0dXJuIHBhcnRpYWxSdW47CisgICAgfQorCisgICAgaWYgKGJyZWFr
UnVsZXMuY29udGFpbnMoV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbikpIHsKKyAg
ICAgICAgYXV0byB0cnlCcmVha2luZ0F0QXJiaXRyYXJ5UG9zaXRpb24gPSBbJl0oKSAtPiBQYXJ0
aWFsUnVuIHsKKyAgICAgICAgICAgIGlmICghaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpIHsKKyAg
ICAgICAgICAgICAgICAvLyBFbXB0eSB0ZXh0IHJ1bnMgbWF5IGJlIGJyZWFrYWJsZSBiYXNlZCBv
biBzdHlsZSwgYnV0IGluIHByYWN0aWNlIHdlIGNhbid0IHJlYWxseSBzcGxpdCB0aGVtIGFueSBm
dXJ0aGVyLgorICAgICAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAoYXZhaWxhYmxlU3BhY2VJc0luZmluaXRlKSB7CisgICAgICAgICAgICAgICAg
Ly8gV2hlbiB0aGUgcnVuIGNhbiBiZSBzcGxpdCBhdCBhcmJpdHJhcnkgcG9zaXRpb24gbGV0J3Mg
anVzdCByZXR1cm4gdGhlIGVudGlyZSBydW4gd2hlbiBpdCBpcyBpbnRlbmRlZCB0byBmaXQgb24g
dGhlIGxpbmUuCisgICAgICAgICAgICAgICAgQVNTRVJUKGlubGluZVRleHRJdGVtLmxlbmd0aCgp
KTsKKyAgICAgICAgICAgICAgICBhdXRvIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoID0gVGV4dFV0
aWw6OndpZHRoKGlubGluZVRleHRJdGVtLCBsb2dpY2FsTGVmdCk7CisgICAgICAgICAgICAgICAg
cmV0dXJuIHsgaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCksIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRo
IH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoISphdmFpbGFibGVXaWR0aCkgewor
ICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgY2FzZXMgd2hlbiB0aGVyZSdzIG5vIHJv
b20gYXQgYWxsLiBUaGUgY29udGVudCBpcyBicmVha2FibGUgYnV0IHdlIGRvbid0IGhhdmUgc3Bh
Y2UgZm9yIGl0LgorICAgICAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBhdXRvIHNwbGl0RGF0YSA9IFRleHRVdGlsOjpzcGxpdChpbmxpbmVUZXh0SXRl
bSwgb3ZlcmZsb3dpbmdSdW4ubG9naWNhbFdpZHRoLCAqYXZhaWxhYmxlV2lkdGgsIGxvZ2ljYWxM
ZWZ0KTsKKyAgICAgICAgICAgIHJldHVybiB7IHNwbGl0RGF0YS5sZW5ndGgsIHNwbGl0RGF0YS5s
b2dpY2FsV2lkdGggfTsKKyAgICAgICAgfTsKKyAgICAgICAgLy8gV2l0aCBhcmJpdHJhcnkgYnJl
YWtpbmcgdGhlcmUncyBhbHdheXMgYSB2YWxpZCBicmVha2luZyBwb3NpdGlvbiAoZXZlbiBpZiBp
dCBpcyBiZWZvcmUgdGhlIGZpcnN0IHBvc2l0aW9uKS4KKyAgICAgICAgcmV0dXJuIHRyeUJyZWFr
aW5nQXRBcmJpdHJhcnlQb3NpdGlvbigpOworICAgIH0KKyAgICByZXR1cm4geyB9OworfQorCit2
b2lkIElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudDo6YXBwZW5kKGNvbnN0
IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoLCBP
cHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBjb2xsYXBzaWJsZVdpZHRoKQoreworICAgIG1fcnVu
cy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGggfSk7CisgICAgbV9sb2dpY2FsV2lk
dGggPSBjbGFtcFRvPElubGluZUxheW91dFVuaXQ+KG1fbG9naWNhbFdpZHRoICsgbG9naWNhbFdp
ZHRoKTsKKyAgICBpZiAoIWNvbGxhcHNpYmxlV2lkdGgpIHsKKyAgICAgICAgbV9jb2xsYXBzaWJs
ZUxvZ2ljYWxXaWR0aCA9IHsgfTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKmNv
bGxhcHNpYmxlV2lkdGggPT0gbG9naWNhbFdpZHRoKSB7CisgICAgICAgIC8vIEZ1bGx5IGNvbGxh
cHNpYmxlIHJ1bi4KKyAgICAgICAgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCArPSBsb2dpY2Fs
V2lkdGg7CisgICAgICAgIEFTU0VSVChtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoIDw9IG1fbG9n
aWNhbFdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBQYXJ0aWFsbHkgY29s
bGFwc2libGUgcnVuLgorICAgIG1fY29sbGFwc2libGVMb2dpY2FsV2lkdGggPSAqY29sbGFwc2li
bGVXaWR0aDsKKyAgICBBU1NFUlQobV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCA8PSBtX2xvZ2lj
YWxXaWR0aCk7Cit9CisKK3ZvaWQgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250
ZW50OjpyZXNldCgpCit7CisgICAgbV9sb2dpY2FsV2lkdGggPSB7IH07CisgICAgbV9jb2xsYXBz
aWJsZUxvZ2ljYWxXaWR0aCA9IHsgfTsKKyAgICBtX3J1bnMuY2xlYXIoKTsKK30KKworfQorfQor
I2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lQ29udGVudEJyZWFrZXIuaCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250
ZW50QnJlYWtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjVkMmQ0ZDZjZThjMTg5MzFkNWZlOGI1MGEzNzMwMWQ0
YWNhOGU3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lQ29udGVudEJyZWFrZXIuaApAQCAt
MCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExB
WU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFJlbmRlclN0eWxlOworCituYW1lc3BhY2UgTGF5
b3V0IHsKKworY2xhc3MgSW5saW5lSXRlbTsKK3N0cnVjdCBPdmVyZmxvd2luZ1RleHRDb250ZW50
OworCitjbGFzcyBJbmxpbmVDb250ZW50QnJlYWtlciB7CitwdWJsaWM6CisgICAgc3RydWN0IFBh
cnRpYWxSdW4geworICAgICAgICBzaXplX3QgbGVuZ3RoIHsgMCB9OworICAgICAgICBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5
b3V0VW5pdD4gaHlwaGVuV2lkdGggeyB9OworICAgIH07CisgICAgZW51bSBjbGFzcyBJc0VuZE9m
TGluZSB7IE5vLCBZZXMgfTsKKyAgICBzdHJ1Y3QgUmVzdWx0IHsKKyAgICAgICAgZW51bSBjbGFz
cyBBY3Rpb24geworICAgICAgICAgICAgS2VlcCwgLy8gS2VlcCBjb250ZW50IG9uIHRoZSBjdXJy
ZW50IGxpbmUuCisgICAgICAgICAgICBCcmVhaywgLy8gUGFydGlhbCBjb250ZW50IGlzIG9uIHRo
ZSBjdXJyZW50IGxpbmUuCisgICAgICAgICAgICBXcmFwLCAvLyBDb250ZW50IGlzIHdyYXBwZWQg
dG8gdGhlIG5leHQgbGluZS4KKyAgICAgICAgICAgIFdyYXBXaXRoSHlwaGVuLCAvLyBDb250ZW50
IGlzIHdyYXBwZWQgdG8gdGhlIG5leHQgbGluZSBhbmQgdGhlIGN1cnJlbnQgbGluZSBlbmRzIHdp
dGggYSB2aXNpYmxlIGh5cGhlbi4KKyAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGNvbnRlbnQg
b3ZlcmZsb3dzIGFuZCBjYW4ndCBnZXQgYnJva2VuIHVwIGludG8gc21hbGxlciBiaXRzLgorICAg
ICAgICAgICAgUmV2ZXJ0VG9MYXN0V3JhcE9wcG9ydHVuaXR5LCAvLyBUaGUgY29udGVudCBuZWVk
cyB0byBiZSByZXZlcnRlZCBiYWNrIHRvIHRoZSBsYXN0IHdyYXAgb3Bwb3J0dW5pdHkuCisgICAg
ICAgICAgICBSZXZlcnRUb0xhc3ROb25PdmVyZmxvd2luZ1dyYXBPcHBvcnR1bml0eSAvLyBUaGUg
Y29udGVudCBuZWVkcyB0byBiZSByZXZlcnRlZCBiYWNrIHRvIGEgd3JhcCBvcHBvcnR1bml0eSB0
aGF0IHN0aWxsIGZpdHMgdGhlIGxpbmUuCisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBQYXJ0
aWFsVHJhaWxpbmdDb250ZW50IHsKKyAgICAgICAgICAgIHNpemVfdCB0cmFpbGluZ1J1bkluZGV4
IHsgMCB9OworICAgICAgICAgICAgT3B0aW9uYWw8UGFydGlhbFJ1bj4gcGFydGlhbFJ1bjsgLy8g
bnVsbG9wdCBwYXJ0aWFsIHJ1biBtZWFucyB0aGUgdHJhaWxpbmcgcnVuIGlzIGEgY29tcGxldGUg
cnVuLgorICAgICAgICB9OworICAgICAgICBBY3Rpb24gYWN0aW9uIHsgQWN0aW9uOjpLZWVwIH07
CisgICAgICAgIElzRW5kT2ZMaW5lIGlzRW5kT2ZMaW5lIHsgSXNFbmRPZkxpbmU6Ok5vIH07Cisg
ICAgICAgIE9wdGlvbmFsPFBhcnRpYWxUcmFpbGluZ0NvbnRlbnQ+IHBhcnRpYWxUcmFpbGluZ0Nv
bnRlbnQgeyB9OworICAgICAgICBjb25zdCBJbmxpbmVJdGVtKiBsYXN0V3JhcE9wcG9ydHVuaXR5
SXRlbSB7IG51bGxwdHIgfTsKKyAgICB9OworCisgICAgLy8gVGhpcyBzdHJ1Y3QgcmVwcmVzZW50
cyB0aGUgYW1vdW50IG9mIGNvbnRpbnVvdXMgY29udGVudCBjb21taXR0ZWQgdG8gY29udGVudCBi
cmVha2luZyBhdCBhIHRpbWUgKG5vIGluLWJldHdlZW4gd3JhcCBvcHBvcnR1bml0aWVzKS4KKyAg
ICAvLyBlLmcuCisgICAgLy8gPGRpdj50ZXh0IGNvbnRlbnQgPHNwYW4+c3BhbjE8L3NwYW4+YmV0
d2VlbjxzcGFuPnNwYW4yPC9zcGFuPjwvZGl2PgorICAgIC8vIFt0ZXh0XVsgXVtjb250ZW50XVsg
XVtpbmxpbmUgYm94IHN0YXJ0XVtzcGFuMV1baW5saW5lIGJveCBlbmRdW2JldHdlZW5dW2lubGlu
ZSBib3ggc3RhcnRdW3NwYW4yXVtpbmxpbmUgYm94IGVuZF0KKyAgICAvLyBjb250aW51b3VzIGNh
bmRpZGF0ZSBjb250ZW50IGF0IGEgdGltZToKKyAgICAvLyAxLiBbdGV4dF0KKyAgICAvLyAyLiBb
IF0KKyAgICAvLyAzLiBbY29udGVudF0KKyAgICAvLyA0LiBbIF0KKyAgICAvLyA1LiBbaW5saW5l
IGJveCBzdGFydF1bc3BhbjFdW2lubGluZSBib3ggZW5kXVtiZXR3ZWVuXVtpbmxpbmUgYm94IHN0
YXJ0XVtzcGFuMl1baW5saW5lIGJveCBlbmRdCisgICAgLy8gc2VlIGh0dHBzOi8vZHJhZnRzLmNz
c3dnLm9yZy9jc3MtdGV4dC0zLyNsaW5lLWJyZWFrLWRldGFpbHMKKyAgICBzdHJ1Y3QgQ29udGlu
dW91c0NvbnRlbnQgeworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNv
bnN0IHsgcmV0dXJuIG1fbG9naWNhbFdpZHRoOyB9CisgICAgICAgIElubGluZUxheW91dFVuaXQg
Y29sbGFwc2libGVMb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2NvbGxhcHNpYmxlTG9n
aWNhbFdpZHRoOyB9CisgICAgICAgIElubGluZUxheW91dFVuaXQgbm9uQ29sbGFwc2libGVMb2dp
Y2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsV2lkdGgoKSAtIGNvbGxhcHNpYmxlTG9n
aWNhbFdpZHRoKCk7IH0KKyAgICAgICAgYm9vbCBoYXNUcmFpbGluZ0NvbGxhcHNpYmxlQ29udGVu
dCgpIGNvbnN0IHsgcmV0dXJuICEhY29sbGFwc2libGVMb2dpY2FsV2lkdGgoKTsgfQorICAgICAg
ICBib29sIGlzRnVsbHlDb2xsYXBzaWJsZSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxXaWR0aCgp
ID09IGNvbGxhcHNpYmxlTG9naWNhbFdpZHRoKCk7IH0KKworICAgICAgICB2b2lkIGFwcGVuZChj
b25zdCBJbmxpbmVJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgsIE9wdGlvbmFs
PElubGluZUxheW91dFVuaXQ+IGNvbGxhcHNpYmxlV2lkdGgpOworICAgICAgICB2b2lkIHJlc2V0
KCk7CisKKyAgICAgICAgc3RydWN0IFJ1biB7CisgICAgICAgICAgICBSdW4oY29uc3QgSW5saW5l
SXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICAgICAgICAgIFJ1bihj
b25zdCBSdW4mKTsKKyAgICAgICAgICAgIFJ1biYgb3BlcmF0b3I9KGNvbnN0IFJ1biYpOworCisg
ICAgICAgICAgICBjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtOworICAgICAgICAgICAgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGggeyAwIH07CisgICAgICAgIH07CisgICAgICAgIHVz
aW5nIFJ1bkxpc3QgPSBWZWN0b3I8UnVuLCAzPjsKKyAgICAgICAgY29uc3QgUnVuTGlzdCYgcnVu
cygpIGNvbnN0IHsgcmV0dXJuIG1fcnVuczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUnVu
TGlzdCBtX3J1bnM7CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9sb2dpY2FsV2lkdGggeyAw
IH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCB7
IDAgfTsKKyAgICB9OworCisgICAgc3RydWN0IExpbmVTdGF0dXMgeworICAgICAgICBJbmxpbmVM
YXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsUmlnaHQgeyAwIH07CisgICAgICAgIElubGluZUxheW91
dFVuaXQgYXZhaWxhYmxlV2lkdGggeyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgY29s
bGFwc2libGVXaWR0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4g
dHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGg7CisgICAgICAgIGJvb2wgaGFzRnVsbHlDb2xsYXBzaWJs
ZVRyYWlsaW5nUnVuIHsgZmFsc2UgfTsKKyAgICAgICAgYm9vbCBoYXNDb250ZW50IHsgZmFsc2Ug
fTsKKyAgICAgICAgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24geyBm
YWxzZSB9OworICAgIH07CisgICAgUmVzdWx0IHByb2Nlc3NJbmxpbmVDb250ZW50KGNvbnN0IENv
bnRpbnVvdXNDb250ZW50JiwgY29uc3QgTGluZVN0YXR1cyYpOworICAgIHZvaWQgc2V0SHlwaGVu
YXRpb25EaXNhYmxlZCgpIHsgbl9oeXBoZW5hdGlvbklzRGlzYWJsZWQgPSB0cnVlOyB9CisKKyAg
ICBzdGF0aWMgYm9vbCBpc1dyYXBwaW5nQWxsb3dlZChjb25zdCBJbmxpbmVJdGVtJik7CisKK3By
aXZhdGU6CisgICAgUmVzdWx0IHByb2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnQoY29uc3QgQ29udGlu
dW91c0NvbnRlbnQmLCBjb25zdCBMaW5lU3RhdHVzJikgY29uc3Q7CisgICAgT3ZlcmZsb3dpbmdU
ZXh0Q29udGVudCBwcm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50V2l0aFRleHQoY29uc3QgQ29udGlu
dW91c0NvbnRlbnQmLCBjb25zdCBMaW5lU3RhdHVzJikgY29uc3Q7CisgICAgT3B0aW9uYWw8UGFy
dGlhbFJ1bj4gdHJ5QnJlYWtpbmdUZXh0UnVuKGNvbnN0IENvbnRpbnVvdXNDb250ZW50OjpSdW4m
IG92ZXJmbG93UnVuLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBPcHRpb25hbDxJbmxp
bmVMYXlvdXRVbml0PiBhdmFpbGFibGVXaWR0aCwgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFBy
ZXZpb3VzUG9zaXRpb24pIGNvbnN0OworCisgICAgZW51bSBjbGFzcyBXb3JkQnJlYWtSdWxlIHsK
KyAgICAgICAgQXRBcmJpdHJhcnlQb3NpdGlvbiAgICAgICAgPSAxIDw8IDAsCisgICAgICAgIEF0
SHlwaGVuYXRpb25PcHBvcnR1bml0aWVzID0gMSA8PCAxCisgICAgfTsKKyAgICBPcHRpb25TZXQ8
V29yZEJyZWFrUnVsZT4gd29yZEJyZWFrQmVoYXZpb3IoY29uc3QgUmVuZGVyU3R5bGUmLCBib29s
IGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3Q7CisgICAgYm9vbCBz
aG91bGRLZWVwRW5kT2ZMaW5lV2hpdGVzcGFjZShjb25zdCBDb250aW51b3VzQ29udGVudCYpIGNv
bnN0OworCisgICAgYm9vbCBuX2h5cGhlbmF0aW9uSXNEaXNhYmxlZCB7IGZhbHNlIH07Cit9Owor
CitpbmxpbmUgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50OjpSdW46OlJ1
bihjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxX
aWR0aCkKKyAgICA6IGlubGluZUl0ZW0oaW5saW5lSXRlbSkKKyAgICAsIGxvZ2ljYWxXaWR0aChs
b2dpY2FsV2lkdGgpCit7Cit9CisKK2lubGluZSBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGlu
dW91c0NvbnRlbnQ6OlJ1bjo6UnVuKGNvbnN0IFJ1biYgb3RoZXIpCisgICAgOiBpbmxpbmVJdGVt
KG90aGVyLmlubGluZUl0ZW0pCisgICAgLCBsb2dpY2FsV2lkdGgob3RoZXIubG9naWNhbFdpZHRo
KQoreworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmE1MWVh
ZmZjZGEzZWVjYzQzZTIxNWQxZDk2NDYxMDZjMGNjNWE5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcv
SW5saW5lRm9ybWF0dGluZ0NvbnRleHQuY3BwCkBAIC0wLDAgKzEsNjExIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisg
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0
LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUg
IkZsb2F0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisjaW5jbHVkZSAi
SW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgorI2lu
Y2x1ZGUgIklubGluZUxpbmVSdW4uaCIKKyNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgorI2lu
Y2x1ZGUgIkludmFsaWRhdGlvblN0YXRlLmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5j
bHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgor
I2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKKyNpbmNsdWRlICJMYXlv
dXRJbmxpbmVUZXh0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0TGluZUJyZWFrQm94LmgiCisjaW5j
bHVkZSAiTGF5b3V0UmVwbGFjZWRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2lu
Y2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmgiCisj
aW5jbHVkZSAiVGV4dFV0aWwuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
bmFtZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCk7CisKK0lubGluZUZvcm1hdHRpbmdDb250ZXh0OjpJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwg
SW5saW5lRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCisgICAgOiBGb3JtYXR0aW5n
Q29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKK3sKK30KKwor
c3RhdGljIGlubGluZSBjb25zdCBCb3gqIG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KGNvbnN0
IEJveCYgbGF5b3V0Qm94LCBjb25zdCBDb250YWluZXJCb3gmIHN0YXlXaXRoaW4pCit7CisgICAg
Ly8gQXRvbWljIGlubGluZS1sZXZlbCBib3hlcyBhbmQgZmxvYXRzIGFyZSBvcGFxdWUgYm94ZXMg
bWVhbmluZyB0aGF0IHRoZXkgYXJlCisgICAgLy8gcmVzcG9uc2libGUgZm9yIHRoZWlyIG93biBj
b250ZW50IChkbyBub3QgbmVlZCB0byBkZXNjZW5kIGludG8gdGhlaXIgc3VidHJlZXMpLgorICAg
IC8vIE9ubHkgaW5saW5lIGJveGVzIG1heSBoYXZlIHJlbGV2YW50IGRlc2NlbmRhbnQgY29udGVu
dC4KKyAgICBpZiAobGF5b3V0Qm94LmlzSW5saW5lQm94KCkpIHsKKyAgICAgICAgaWYgKGlzPENv
bnRhaW5lckJveD4obGF5b3V0Qm94KSAmJiBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJv
eCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpIHsKKyAgICAgICAgICAgIC8vIEFub255bW91
cyBpbmxpbmUgdGV4dCBib3hlcy9saW5lIGJyZWFrcyBjYW4ndCBoYXZlIGRlc2NlbmRhbnQgY29u
dGVudCBieSBkZWZpbml0aW9uLgorICAgICAgICAgICAgQVNTRVJUKCFsYXlvdXRCb3guaXNJbmxp
bmVUZXh0Qm94KCkgJiYgIWxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKTsKKyAgICAgICAgICAg
IHJldHVybiBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZs
b2F0aW5nQ2hpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byogbmV4dElu
UHJlT3JkZXIgPSAmbGF5b3V0Qm94OyBuZXh0SW5QcmVPcmRlciAmJiBuZXh0SW5QcmVPcmRlciAh
PSAmc3RheVdpdGhpbjsgbmV4dEluUHJlT3JkZXIgPSAmbmV4dEluUHJlT3JkZXItPnBhcmVudCgp
KSB7CisgICAgICAgIGlmIChhdXRvKiBuZXh0U2libGluZyA9IG5leHRJblByZU9yZGVyLT5uZXh0
SW5GbG93T3JGbG9hdGluZ1NpYmxpbmcoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXh0U2libGlu
ZzsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQ6OmxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmIGludmFsaWRh
dGlvblN0YXRlLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRz
KQoreworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFt
IDw8ICJbU3RhcnRdIC0+IGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgLT4gZm9ybWF0dGluZyBy
b290KCIgPDwgJnJvb3QoKSA8PCAiKSIpOworICAgIEFTU0VSVChyb290KCkuaGFzSW5GbG93T3JG
bG9hdGluZ0NoaWxkKCkpOworCisgICAgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShpbnZhbGlk
YXRpb25TdGF0ZSk7CisgICAgYXV0byogbGF5b3V0Qm94ID0gcm9vdCgpLmZpcnN0SW5GbG93T3JG
bG9hdGluZ0NoaWxkKCk7CisgICAgLy8gMS4gVmlzaXQgZWFjaCBpbmxpbmUgYm94IGFuZCBwYXJ0
aWFsbHkgY29tcHV0ZSB0aGVpciBnZW9tZXRyeSAobWFyZ2lucywgcGFkZGluZyBhbmQgYm9yZGVy
cykuCisgICAgLy8gMi4gQ29sbGVjdCB0aGUgaW5saW5lIGl0ZW1zIChmbGF0dGVuIHRoZSB0aGUg
bGF5b3V0IHRyZWUpIGFuZCBwbGFjZSB0aGVtIG9uIGxpbmVzIGluIGJpZGlyZWN0aW9uYWwgb3Jk
ZXIuIAorICAgIHdoaWxlIChsYXlvdXRCb3gpIHsKKyAgICAgICAgQVNTRVJUKGxheW91dEJveC0+
aXNJbmxpbmVMZXZlbEJveCgpIHx8IGxheW91dEJveC0+aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7
CisKKyAgICAgICAgaWYgKGxheW91dEJveC0+aXNBdG9taWNJbmxpbmVMZXZlbEJveCgpIHx8IGxh
eW91dEJveC0+aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkgeworICAgICAgICAgICAgLy8gSW5saW5l
LWJsb2NrcywgaW5saW5lLXRhYmxlcyBhbmQgcmVwbGFjZWQgZWxlbWVudHMgKGltZywgdmlkZW8p
IGNhbiBiZSBzaXplZCBidXQgbm90IHlldCBwb3NpdGlvbmVkLgorICAgICAgICAgICAgaWYgKGlz
PENvbnRhaW5lckJveD4obGF5b3V0Qm94KSAmJiBsYXlvdXRCb3gtPmVzdGFibGlzaGVzRm9ybWF0
dGluZ0NvbnRleHQoKSkgeworICAgICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3gtPmlzSW5s
aW5lQmxvY2tCb3goKSB8fCBsYXlvdXRCb3gtPmlzSW5saW5lVGFibGVCb3goKSB8fCBsYXlvdXRC
b3gtPmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOworICAgICAgICAgICAgICAgIGF1dG8mIGZvcm1h
dHRpbmdSb290ID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PigqbGF5b3V0Qm94KTsKKyAgICAgICAg
ICAgICAgICBjb21wdXRlQm9yZGVyQW5kUGFkZGluZyhmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWlu
dHMuaG9yaXpvbnRhbCk7CisgICAgICAgICAgICAgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKGZv
cm1hdHRpbmdSb290LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKKworICAgICAgICAgICAgICAg
IGlmIChmb3JtYXR0aW5nUm9vdC5oYXNDaGlsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1
dG8gZm9ybWF0dGluZ0NvbnRleHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29u
dGV4dChmb3JtYXR0aW5nUm9vdCwgbGF5b3V0U3RhdGUoKSk7CisgICAgICAgICAgICAgICAgICAg
IGlmIChmb3JtYXR0aW5nUm9vdC5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdDb250ZXh0LT5sYXlvdXRJbkZsb3dDb250ZW50KGlu
dmFsaWRhdGlvblN0YXRlLCBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChm
b3JtYXR0aW5nUm9vdCkpOworICAgICAgICAgICAgICAgICAgICBjb21wdXRlSGVpZ2h0QW5kTWFy
Z2luKGZvcm1hdHRpbmdSb290LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKKyAgICAgICAgICAg
ICAgICAgICAgZm9ybWF0dGluZ0NvbnRleHQtPmxheW91dE91dE9mRmxvd0NvbnRlbnQoaW52YWxp
ZGF0aW9uU3RhdGUsIGdlb21ldHJ5KCkuY29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50KGZv
cm1hdHRpbmdSb290KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAg
ICAgIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzLmhv
cml6b250YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBSZXBs
YWNlZCBhbmQgb3RoZXIgdHlwZSBvZiBsZWFmIGF0b21pYyBpbmxpbmUgYm94ZXMuCisgICAgICAg
ICAgICAgICAgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoKmxheW91dEJveCwgY29uc3RyYWludHMu
aG9yaXpvbnRhbCk7CisgICAgICAgICAgICAgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKCpsYXlv
dXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAgICAgICAgIGNvbXB1dGVI
ZWlnaHRBbmRNYXJnaW4oKmxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LT5pc0xpbmVCcmVha0JveCgp
KSB7CisgICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJv
eEdlb21ldHJ5KCpsYXlvdXRCb3gpOworICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0SG9yaXpv
bnRhbE1hcmdpbih7IH0pOworICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Qm9yZGVyKHsgfSk7
CisgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRQYWRkaW5nKHsgfSk7CisgICAgICAgICAgICBi
b3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoeyB9KTsKKyAgICAgICAgICAgIGJveEdlb21l
dHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7CisgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94
LT5pc0lubGluZUJveCgpKSB7CisgICAgICAgICAgICAvLyBUZXh0IHdyYXBwZXIgYm94ZXMgKGFu
b255bW91cyBpbmxpbmUgbGV2ZWwgYm94ZXMpIGRvbid0IGhhdmUgYm94IGdlb21ldHJpZXMgKHRo
ZXkgb25seSBnZW5lcmF0ZSBydW5zKS4KKyAgICAgICAgICAgIGlmICghbGF5b3V0Qm94LT5pc0lu
bGluZVRleHRCb3goKSkgeworICAgICAgICAgICAgICAgIC8vIElubGluZSBib3hlcyAoPHNwYW4+
KSBjYW4ndCBnZXQgc2l6ZWQvcG9zaXRpb25lZCB5ZXQuIEF0IHRoaXMgcG9pbnQgd2UgY2FuIG9u
bHkgY29tcHV0ZSB0aGVpciBtYXJnaW5zLCBib3JkZXJzIGFuZCBwYWRkaW5nLgorICAgICAgICAg
ICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhv
cml6b250YWwpOworICAgICAgICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsTWFyZ2luKCpsYXlv
dXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAgICAgICAgIGZvcm1hdHRp
bmdTdGF0ZSgpLmJveEdlb21ldHJ5KCpsYXlvdXRCb3gpLnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7
CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisKKyAgICAgICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlv
dXQoKmxheW91dEJveCwgcm9vdCgpKTsKKyAgICB9CisKKyAgICBjb2xsZWN0SW5saW5lQ29udGVu
dElmTmVlZGVkKCk7CisKKyAgICBhdXRvJiBpbmxpbmVJdGVtcyA9IGZvcm1hdHRpbmdTdGF0ZSgp
LmlubGluZUl0ZW1zKCk7CisgICAgbGluZUxheW91dChpbmxpbmVJdGVtcywgeyAwLCBpbmxpbmVJ
dGVtcy5zaXplKCkgfSwgY29uc3RyYWludHMpOworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0
aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbRW5kXSAtPiBpbmxpbmUgZm9ybWF0dGluZyBj
b250ZXh0IC0+IGZvcm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKK30KKwordm9p
ZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6bGluZUxheW91dEZvckludGVyZ3JhdGlvbihJbnZh
bGlkYXRpb25TdGF0ZSYgaW52YWxpZGF0aW9uU3RhdGUsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5G
bG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0
ZShpbnZhbGlkYXRpb25TdGF0ZSk7CisgICAgY29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgp
OworICAgIGF1dG8mIGlubGluZUl0ZW1zID0gZm9ybWF0dGluZ1N0YXRlKCkuaW5saW5lSXRlbXMo
KTsKKyAgICBsaW5lTGF5b3V0KGlubGluZUl0ZW1zLCB7IDAsIGlubGluZUl0ZW1zLnNpemUoKSB9
LCBjb25zdHJhaW50cyk7Cit9CisKK0xheW91dFVuaXQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6
OnVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3QKK3sKKyAgICAvLyAxMC42LjcgJ0F1dG8nIGhlaWdo
dHMgZm9yIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCByb290cworCisgICAgLy8gSWYgaXQgb25s
eSBoYXMgaW5saW5lLWxldmVsIGNoaWxkcmVuLCB0aGUgaGVpZ2h0IGlzIHRoZSBkaXN0YW5jZSBi
ZXR3ZWVuIHRoZSB0b3Agb2YgdGhlIHRvcG1vc3QgbGluZSBib3ggYW5kIHRoZSBib3R0b20gb2Yg
dGhlIGJvdHRvbW1vc3QgbGluZSBib3guCisKKyAgICAvLyBJbiBhZGRpdGlvbiwgaWYgdGhlIGVs
ZW1lbnQgaGFzIGFueSBmbG9hdGluZyBkZXNjZW5kYW50cyB3aG9zZSBib3R0b20gbWFyZ2luIGVk
Z2UgaXMgYmVsb3cgdGhlIGVsZW1lbnQncyBib3R0b20gY29udGVudCBlZGdlLAorICAgIC8vIHRo
ZW4gdGhlIGhlaWdodCBpcyBpbmNyZWFzZWQgdG8gaW5jbHVkZSB0aG9zZSBlZGdlcy4gT25seSBm
bG9hdHMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiB0aGlzIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBh
cmUgdGFrZW4KKyAgICAvLyBpbnRvIGFjY291bnQsIGUuZy4sIGZsb2F0cyBpbnNpZGUgYWJzb2x1
dGVseSBwb3NpdGlvbmVkIGRlc2NlbmRhbnRzIG9yIG90aGVyIGZsb2F0cyBhcmUgbm90LgorICAg
IGF1dG8mIGxpbmVzID0gZm9ybWF0dGluZ1N0YXRlKCkubGluZXMoKTsKKyAgICAvLyBFdmVuIGVt
cHR5IGNvbnRlbnQgZ2VuZXJhdGVzIGEgbGluZS4KKyAgICBBU1NFUlQoIWxpbmVzLmlzRW1wdHko
KSk7CisgICAgYXV0byB0b3AgPSBMYXlvdXRVbml0IHsgbGluZXMuZmlyc3QoKS5saW5lQm94TG9n
aWNhbFJlY3QoKS50b3AoKSB9OworICAgIGF1dG8gYm90dG9tID0gTGF5b3V0VW5pdCB7IGxpbmVz
Lmxhc3QoKS5saW5lQm94TG9naWNhbFJlY3QoKS5ib3R0b20oKSArIGZvcm1hdHRpbmdTdGF0ZSgp
LmNsZWFyR2FwQWZ0ZXJMYXN0TGluZSgpIH07CisKKyAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9
IEZsb2F0aW5nQ29udGV4dCB7ICp0aGlzLCBmb3JtYXR0aW5nU3RhdGUoKS5mbG9hdGluZ1N0YXRl
KCkgfTsKKyAgICBpZiAoYXV0byBmbG9hdEJvdHRvbSA9IGZsb2F0aW5nQ29udGV4dC5ib3R0b20o
KSkgeworICAgICAgICBib3R0b20gPSBzdGQ6Om1heCgqZmxvYXRCb3R0b20sIGJvdHRvbSk7Cisg
ICAgICAgIHRvcCA9IHN0ZDo6bWluKCpmbG9hdGluZ0NvbnRleHQudG9wKCksIHRvcCk7CisgICAg
fQorICAgIHJldHVybiBib3R0b20gLSB0b3A7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQ6OmxpbmVMYXlvdXQoSW5saW5lSXRlbXMmIGlubGluZUl0ZW1zLCBMaW5lQnVpbGRlcjo6
SW5saW5lSXRlbVJhbmdlIG5lZWRzTGF5b3V0UmFuZ2UsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5G
bG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0g
dGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7CisgICAgZm9ybWF0dGluZ1N0YXRlLmxpbmVSdW5zKCku
cmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShmb3JtYXR0aW5nU3RhdGUuaW5saW5lSXRlbXMoKS5zaXpl
KCkpOworICAgIElubGluZUxheW91dFVuaXQgbGluZUxvZ2ljYWxUb3AgPSBjb25zdHJhaW50cy52
ZXJ0aWNhbC5sb2dpY2FsVG9wOworICAgIHN0cnVjdCBQcmV2aW91c0xpbmUgeworICAgICAgICBM
aW5lQnVpbGRlcjo6SW5saW5lSXRlbVJhbmdlIHJhbmdlOworICAgICAgICBzaXplX3Qgb3ZlcmZs
b3dDb250ZW50TGVuZ3RoIHsgMCB9OworICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0
PiBvdmVyZmxvd0xvZ2ljYWxXaWR0aDsKKyAgICB9OworICAgIE9wdGlvbmFsPFByZXZpb3VzTGlu
ZT4gcHJldmlvdXNMaW5lOworICAgIGF1dG8mIGZsb2F0aW5nU3RhdGUgPSBmb3JtYXR0aW5nU3Rh
dGUuZmxvYXRpbmdTdGF0ZSgpOworICAgIGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRpbmdD
b250ZXh0IHsgKnRoaXMsIGZsb2F0aW5nU3RhdGUgfTsKKyAgICBhdXRvIGlzRmlyc3RMaW5lID0g
Zm9ybWF0dGluZ1N0YXRlLmxpbmVzKCkuaXNFbXB0eSgpOworCisgICAgYXV0byBsaW5lQnVpbGRl
ciA9IExpbmVCdWlsZGVyIHsgKnRoaXMsIGZsb2F0aW5nU3RhdGUsIGNvbnN0cmFpbnRzLmhvcml6
b250YWwsIGlubGluZUl0ZW1zIH07CisgICAgd2hpbGUgKCFuZWVkc0xheW91dFJhbmdlLmlzRW1w
dHkoKSkgeworICAgICAgICAvLyBUdXJuIHByZXZpb3VzIGxpbmUncyBvdmVyZmxvdyBjb250ZW50
IGxlbmd0aCBpbnRvIHRoZSBuZXh0IGxpbmUncyBsZWFkaW5nIGNvbnRlbnQgcGFydGlhbCBsZW5n
dGguCisgICAgICAgIC8vICJzcFs8LWxpbmUgYnJlYWstPl1saXRfY29udGVudCIgLT4gb3ZlcmZs
b3cgbGVuZ3RoOiAxMSAtPiBsZWFkaW5nIHBhcnRpYWwgY29udGVudCBsZW5ndGg6IDExLgorICAg
ICAgICBhdXRvIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCA9IHByZXZpb3VzTGluZSA/IHBy
ZXZpb3VzTGluZS0+b3ZlcmZsb3dDb250ZW50TGVuZ3RoIDogMDsKKyAgICAgICAgYXV0byBsZWFk
aW5nTG9naWNhbFdpZHRoID0gcHJldmlvdXNMaW5lID8gcHJldmlvdXNMaW5lLT5vdmVyZmxvd0xv
Z2ljYWxXaWR0aCA6IFdURjo6bnVsbG9wdDsKKyAgICAgICAgYXV0byBpbml0aWFsTGluZUNvbnN0
cmFpbnRzID0gSW5saW5lUmVjdCB7IGxpbmVMb2dpY2FsVG9wLCBjb25zdHJhaW50cy5ob3Jpem9u
dGFsLmxvZ2ljYWxMZWZ0LCBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxXaWR0aCwgcXVp
cmtzKCkuaW5pdGlhbExpbmVIZWlnaHQoKSB9OworICAgICAgICBhdXRvIGxpbmVDb250ZW50ID0g
bGluZUJ1aWxkZXIubGF5b3V0SW5saW5lQ29udGVudChuZWVkc0xheW91dFJhbmdlLCBwYXJ0aWFs
TGVhZGluZ0NvbnRlbnRMZW5ndGgsIGxlYWRpbmdMb2dpY2FsV2lkdGgsIGluaXRpYWxMaW5lQ29u
c3RyYWludHMsIGlzRmlyc3RMaW5lKTsKKyAgICAgICAgYXV0byBsaW5lTG9naWNhbFJlY3QgPSBj
b21wdXRlR2VvbWV0cnlGb3JMaW5lQ29udGVudChsaW5lQ29udGVudCwgY29uc3RyYWludHMuaG9y
aXpvbnRhbCk7CisKKyAgICAgICAgYXV0byBsaW5lQ29udGVudFJhbmdlID0gbGluZUNvbnRlbnQu
aW5saW5lSXRlbVJhbmdlOworICAgICAgICBpZiAoIWxpbmVDb250ZW50UmFuZ2UuaXNFbXB0eSgp
KSB7CisgICAgICAgICAgICBBU1NFUlQobmVlZHNMYXlvdXRSYW5nZS5zdGFydCA8IGxpbmVDb250
ZW50UmFuZ2UuZW5kKTsKKyAgICAgICAgICAgIGlzRmlyc3RMaW5lID0gZmFsc2U7CisgICAgICAg
ICAgICBsaW5lTG9naWNhbFRvcCA9IGdlb21ldHJ5KCkubG9naWNhbFRvcEZvck5leHRMaW5lKGxp
bmVDb250ZW50LCBsaW5lTG9naWNhbFJlY3QuYm90dG9tKCksIGZsb2F0aW5nQ29udGV4dCk7Cisg
ICAgICAgICAgICBpZiAobGluZUNvbnRlbnQuaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KSB7
CisgICAgICAgICAgICAgICAgLy8gVGhlIGZpbmFsIGNvbnRlbnQgaGVpZ2h0IG9mIHRoaXMgaW5s
aW5lIGZvcm1hdHRpbmcgY29udGV4dCBzaG91bGQgaW5jbHVkZSB0aGUgY2xlYXJlZCBmbG9hdHMg
YXMgd2VsbC4KKyAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuc2V0Q2xlYXJHYXBBZnRl
ckxhc3RMaW5lKGxpbmVMb2dpY2FsVG9wIC0gbGluZUxvZ2ljYWxSZWN0LmJvdHRvbSgpKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFdoZW4gdGhlIHRyYWlsaW5nIGNvbnRlbnQgaXMg
cGFydGlhbCwgd2UgbmVlZCB0byByZXVzZSB0aGUgbGFzdCBJbmxpbmVUZXh0SXRlbS4KKyAgICAg
ICAgICAgIGF1dG8gbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPSBsaW5lQ29udGVu
dC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoOworICAgICAgICAgICAgaWYgKGxhc3RJbmxp
bmVJdGVtTmVlZHNQYXJ0aWFsTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgYXV0byBsaW5lTGF5
b3V0SGFzQWR2YW5jZWQgPSAhcHJldmlvdXNMaW5lCisgICAgICAgICAgICAgICAgICAgIHx8IGxp
bmVDb250ZW50UmFuZ2UuZW5kID4gcHJldmlvdXNMaW5lLT5yYW5nZS5lbmQKKyAgICAgICAgICAg
ICAgICAgICAgfHwgKHByZXZpb3VzTGluZS0+b3ZlcmZsb3dDb250ZW50TGVuZ3RoICYmIHByZXZp
b3VzTGluZS0+b3ZlcmZsb3dDb250ZW50TGVuZ3RoID4gbGluZUNvbnRlbnQucGFydGlhbFRyYWls
aW5nQ29udGVudExlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFsaW5lTGF5b3V0SGFzQWR2
YW5jZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAg
ICAgICAgICAgICAgICAgIC8vIE1vdmUgb3ZlciB0byB0aGUgbmV4dCBydW4gaWYgd2UgYXJlIHN0
dWNrIG9uIHRoaXMgcGFydGlhbCBjb250ZW50ICh3aGVuIHRoZSBvdmVyZmxvdyBjb250ZW50IGxl
bmd0aCByZW1haW5zIHRoZSBzYW1lKS4KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2VydGFp
bmx5IGxvc2Ugc29tZSBjb250ZW50LCBidXQgd2Ugd291bGQgYmUgYnVzeSBsb29waW5nIG90aGVy
d2lzZS4KKyAgICAgICAgICAgICAgICAgICAgbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlv
dXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBuZWVkc0xheW91dFJhbmdlLnN0YXJ0ID0gbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlv
dXQgPyBsaW5lQ29udGVudFJhbmdlLmVuZCAtIDEgOiBsaW5lQ29udGVudFJhbmdlLmVuZDsKKyAg
ICAgICAgICAgIHByZXZpb3VzTGluZSA9IFByZXZpb3VzTGluZSB7IGxpbmVDb250ZW50UmFuZ2Us
IGxpbmVDb250ZW50LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgsIGxpbmVDb250ZW50Lm92
ZXJmbG93TG9naWNhbFdpZHRoIH07CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQor
ICAgICAgICAvLyBGbG9hdHMgcHJldmVudGVkIHVzIHBsYWNpbmcgYW55IGNvbnRlbnQgb24gdGhl
IGxpbmUuCisgICAgICAgIEFTU0VSVChsaW5lQ29udGVudC5ydW5zLmlzRW1wdHkoKSk7CisgICAg
ICAgIEFTU0VSVChsaW5lQ29udGVudC5oYXNJbnRydXNpdmVGbG9hdCk7CisgICAgICAgIC8vIE1v
dmUgdGhlIG5leHQgbGluZSBiZWxvdyB0aGUgaW50cnVzaXZlIGZsb2F0LgorICAgICAgICBhdXRv
IGZsb2F0Q29uc3RyYWludHMgPSBmbG9hdGluZ0NvbnRleHQuY29uc3RyYWludHModG9MYXlvdXRV
bml0KGxpbmVMb2dpY2FsVG9wKSwgdG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmVjdC5ib3R0b20o
KSkpOworICAgICAgICBBU1NFUlQoZmxvYXRDb25zdHJhaW50cy5sZWZ0IHx8IGZsb2F0Q29uc3Ry
YWludHMucmlnaHQpOworICAgICAgICBzdGF0aWMgYXV0byBpbmlmaXRlUG9pbnQgPSBQb2ludElu
Q29udGV4dFJvb3Q6Om1heCgpOworICAgICAgICAvLyBJbiBjYXNlIG9mIGxlZnQgYW5kIHJpZ2h0
IGNvbnN0cmFpbnRzLCB3ZSBuZWVkIHRvIHBpY2sgdGhlIG9uZSB0aGF0J3MgY2xvc2VyIHRvIHRo
ZSBjdXJyZW50IGxpbmUuCisgICAgICAgIGxpbmVMb2dpY2FsVG9wID0gc3RkOjptaW4oZmxvYXRD
b25zdHJhaW50cy5sZWZ0LnZhbHVlT3IoaW5pZml0ZVBvaW50KS55LCBmbG9hdENvbnN0cmFpbnRz
LnJpZ2h0LnZhbHVlT3IoaW5pZml0ZVBvaW50KS55KTsKKyAgICAgICAgQVNTRVJUKGxpbmVMb2dp
Y2FsVG9wIDwgaW5pZml0ZVBvaW50LnkpOworICAgIH0KK30KKworRm9ybWF0dGluZ0NvbnRleHQ6
OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1
dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpCit7CisgICAgYXV0byYgbGF5b3V0U3RhdGUg
PSB0aGlzLT5sYXlvdXRTdGF0ZSgpOworICAgIEFTU0VSVCghZm9ybWF0dGluZ1N0YXRlKCkuaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cygpKTsKKworICAgIGlmICghcm9vdCgpLmhhc0luRmxvd09y
RmxvYXRpbmdDaGlsZCgpKSB7CisgICAgICAgIGF1dG8gY29uc3RyYWludHMgPSBnZW9tZXRyeSgp
LmNvbnN0cmFpbkJ5TWluTWF4V2lkdGgocm9vdCgpLCB7IH0pOworICAgICAgICBmb3JtYXR0aW5n
U3RhdGUoKS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKTsKKyAgICAg
ICAgcmV0dXJuIGNvbnN0cmFpbnRzOworICAgIH0KKworICAgIFZlY3Rvcjxjb25zdCBCb3gqPiBm
b3JtYXR0aW5nQ29udGV4dFJvb3RMaXN0OworICAgIGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRz
ID0gSG9yaXpvbnRhbENvbnN0cmFpbnRzIHsgMF9sdSwgMF9sdSB9OworICAgIGF1dG8qIGxheW91
dEJveCA9IHJvb3QoKS5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpOworICAgIC8vIEluIG9y
ZGVyIHRvIGNvbXB1dGUgdGhlIG1heC9taW4gd2lkdGhzLCB3ZSBuZWVkIHRvIGNvbXB1dGUgbWFy
Z2lucywgYm9yZGVycyBhbmQgcGFkZGluZyBmb3IgY2VydGFpbiBpbmxpbmUgYm94ZXMgZmlyc3Qu
CisgICAgd2hpbGUgKGxheW91dEJveCkgeworICAgICAgICBpZiAobGF5b3V0Qm94LT5pc0lubGlu
ZVRleHRCb3goKSkgeworICAgICAgICAgICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94
VG9MYXlvdXQoKmxheW91dEJveCwgcm9vdCgpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICB9CisgICAgICAgIGlmIChsYXlvdXRCb3gtPmlzUmVwbGFjZWRCb3goKSkgeworICAgICAg
ICAgICAgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0
cmFpbnRzKTsKKyAgICAgICAgICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbigqbGF5b3V0Qm94LCBo
b3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAgICB9IGVsc2UgaWYgKGxheW91dEJveC0+aXNG
bG9hdGluZ1Bvc2l0aW9uZWQoKSB8fCBsYXlvdXRCb3gtPmlzQXRvbWljSW5saW5lTGV2ZWxCb3go
KSkgeworICAgICAgICAgICAgQVNTRVJUKGxheW91dEJveC0+ZXN0YWJsaXNoZXNGb3JtYXR0aW5n
Q29udGV4dCgpKTsKKyAgICAgICAgICAgIGZvcm1hdHRpbmdDb250ZXh0Um9vdExpc3QuYXBwZW5k
KGxheW91dEJveCk7CisKKyAgICAgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpsYXlv
dXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgICAgICAgICBjb21wdXRlSG9yaXpv
bnRhbE1hcmdpbigqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAgICAg
ICAgY29tcHV0ZUludHJpbnNpY1dpZHRoRm9yRm9ybWF0dGluZ1Jvb3QoKmxheW91dEJveCk7Cisg
ICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LT5pc0lubGluZUJveCgpKSB7CisgICAgICAgICAg
ICBjb21wdXRlQm9yZGVyQW5kUGFkZGluZygqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMpOworICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxNYXJnaW4oKmxheW91dEJveCwgaG9y
aXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICAgICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9M
YXlvdXQoKmxheW91dEJveCwgcm9vdCgpKTsKKyAgICB9CisKKyAgICBjb2xsZWN0SW5saW5lQ29u
dGVudElmTmVlZGVkKCk7CisKKyAgICBhdXRvIG1heGltdW1MaW5lV2lkdGggPSBbJl0oYXV0byBh
dmFpbGFibGVXaWR0aCkgeworICAgICAgICAvLyBTd2l0Y2ggdG8gdGhlIG1pbi9tYXggZm9ybWF0
dGluZyByb290IHdpZHRoIHZhbHVlcyBiZWZvcmUgZm9ybWF0dGluZyB0aGUgbGluZXMuCisgICAg
ICAgIGZvciAoYXV0byogZm9ybWF0dGluZ1Jvb3QgOiBmb3JtYXR0aW5nQ29udGV4dFJvb3RMaXN0
KSB7CisgICAgICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRocyA9IGxheW91dFN0YXRlLmZvcm1h
dHRpbmdTdGF0ZUZvckJveCgqZm9ybWF0dGluZ1Jvb3QpLmludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHNGb3JCb3goKmZvcm1hdHRpbmdSb290KTsKKyAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5
ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoKmZvcm1hdHRpbmdSb290KTsKKyAgICAg
ICAgICAgIGF1dG8gY29udGVudFdpZHRoID0gKGF2YWlsYWJsZVdpZHRoID8gaW50cmluc2ljV2lk
dGhzLT5tYXhpbXVtIDogaW50cmluc2ljV2lkdGhzLT5taW5pbXVtKSAtIGJveEdlb21ldHJ5Lmhv
cml6b250YWxNYXJnaW5Cb3JkZXJBbmRQYWRkaW5nKCk7CisgICAgICAgICAgICBib3hHZW9tZXRy
eS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudFdpZHRoKTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gY29tcHV0ZWRJbnRyaW5zaWNXaWR0aEZvckNvbnN0cmFpbnQoYXZhaWxhYmxlV2lkdGgp
OworICAgIH07CisKKyAgICBhdXRvIG1pbmltdW1Db250ZW50V2lkdGggPSBjZWlsZWRMYXlvdXRV
bml0KG1heGltdW1MaW5lV2lkdGgoMCkpOworICAgIGF1dG8gbWF4aW11bUNvbnRlbnRXaWR0aCA9
IGNlaWxlZExheW91dFVuaXQobWF4aW11bUxpbmVXaWR0aChtYXhJbmxpbmVMYXlvdXRVbml0KCkp
KTsKKyAgICBhdXRvIGNvbnN0cmFpbnRzID0gZ2VvbWV0cnkoKS5jb25zdHJhaW5CeU1pbk1heFdp
ZHRoKHJvb3QoKSwgeyBtaW5pbXVtQ29udGVudFdpZHRoLCBtYXhpbXVtQ29udGVudFdpZHRoIH0p
OworICAgIGZvcm1hdHRpbmdTdGF0ZSgpLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29u
c3RyYWludHMpOworICAgIHJldHVybiBjb25zdHJhaW50czsKK30KKworSW5saW5lTGF5b3V0VW5p
dCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aEZvckNvbnN0
cmFpbnQoSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCkgY29uc3QKK3sKKyAgICBhdXRv
JiBpbmxpbmVJdGVtcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmlubGluZUl0ZW1zKCk7CisgICAgYXV0
byBsaW5lQnVpbGRlciA9IExpbmVCdWlsZGVyIHsgKnRoaXMsIGlubGluZUl0ZW1zIH07CisgICAg
YXV0byBsYXlvdXRSYW5nZSA9IExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UgeyAwICwgaW5s
aW5lSXRlbXMuc2l6ZSgpIH07CisgICAgYXV0byBtYXhpbXVtTGluZVdpZHRoID0gSW5saW5lTGF5
b3V0VW5pdCB7IH07CisgICAgYXV0byBtYXhpbXVtRmxvYXRXaWR0aCA9IExheW91dFVuaXQgeyB9
OworICAgIHdoaWxlICghbGF5b3V0UmFuZ2UuaXNFbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaW50
cmluc2ljQ29udGVudCA9IGxpbmVCdWlsZGVyLmNvbXB1dGVkSW50cmluc2ljV2lkdGgobGF5b3V0
UmFuZ2UsIGF2YWlsYWJsZVdpZHRoKTsKKyAgICAgICAgbGF5b3V0UmFuZ2Uuc3RhcnQgPSBpbnRy
aW5zaWNDb250ZW50LmlubGluZUl0ZW1SYW5nZS5lbmQ7CisgICAgICAgIG1heGltdW1MaW5lV2lk
dGggPSBzdGQ6Om1heChtYXhpbXVtTGluZVdpZHRoLCBpbnRyaW5zaWNDb250ZW50LmxvZ2ljYWxX
aWR0aCk7CisgICAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3IgY2xlYXIuCisgICAgICAg
IGZvciAoYXV0byogZmxvYXRCb3ggOiBpbnRyaW5zaWNDb250ZW50LmZsb2F0cykKKyAgICAgICAg
ICAgIG1heGltdW1GbG9hdFdpZHRoICs9IGdlb21ldHJ5Rm9yQm94KCpmbG9hdEJveCkubWFyZ2lu
Qm94V2lkdGgoKTsKKyAgICB9CisgICAgcmV0dXJuIG1heGltdW1MaW5lV2lkdGggKyBtYXhpbXVt
RmxvYXRXaWR0aDsKK30KKwordm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUlu
dHJpbnNpY1dpZHRoRm9yRm9ybWF0dGluZ1Jvb3QoY29uc3QgQm94JiBmb3JtYXR0aW5nUm9vdCkK
K3sKKyAgICBBU1NFUlQoZm9ybWF0dGluZ1Jvb3QuZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4
dCgpKTsKKyAgICBhdXRvIGNvbnN0cmFpbnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7
IH07CisgICAgaWYgKGF1dG8gZml4ZWRXaWR0aCA9IGdlb21ldHJ5KCkuZml4ZWRWYWx1ZShmb3Jt
YXR0aW5nUm9vdC5zdHlsZSgpLmxvZ2ljYWxXaWR0aCgpKSkKKyAgICAgICAgY29uc3RyYWludHMg
PSB7ICpmaXhlZFdpZHRoLCAqZml4ZWRXaWR0aCB9OworICAgIGVsc2UgeworICAgICAgICBhdXRv
IGhhc0luZmxvd09yRmxvYXRpbmdDb250ZW50ID0gaXM8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5n
Um9vdCkgJiYgZG93bmNhc3Q8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nUm9vdCkuaGFzSW5GbG93
T3JGbG9hdGluZ0NoaWxkKCk7CisgICAgICAgIC8vIFRoZSBpbnRyaW5zaWMgc2l6ZXMgb2YgdGhl
IHNpemUgY29udGFpbm1lbnQgYm94IGFyZSBkZXRlcm1pbmVkIGFzIGlmIHRoZSBlbGVtZW50IGhh
ZCBubyBjb250ZW50LgorICAgICAgICBhdXRvIHNob3VsZElnbm9yZUNoaWxkQ29udGVudCA9IGZv
cm1hdHRpbmdSb290LmlzU2l6ZUNvbnRhaW5tZW50Qm94KCk7CisgICAgICAgIGlmIChoYXNJbmZs
b3dPckZsb2F0aW5nQ29udGVudCAmJiAhc2hvdWxkSWdub3JlQ2hpbGRDb250ZW50KQorICAgICAg
ICAgICAgY29uc3RyYWludHMgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4
dChkb3duY2FzdDxDb250YWluZXJCb3g+KGZvcm1hdHRpbmdSb290KSwgbGF5b3V0U3RhdGUoKSkt
PmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOworICAgIH0KKyAgICBjb25zdHJh
aW50cyA9IGdlb21ldHJ5KCkuY29uc3RyYWluQnlNaW5NYXhXaWR0aChmb3JtYXR0aW5nUm9vdCwg
Y29uc3RyYWludHMpOworICAgIGNvbnN0cmFpbnRzLmV4cGFuZChnZW9tZXRyeUZvckJveChmb3Jt
YXR0aW5nUm9vdCkuaG9yaXpvbnRhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKSk7CisgICAgZm9y
bWF0dGluZ1N0YXRlKCkuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChmb3JtYXR0
aW5nUm9vdCwgY29uc3RyYWludHMpOworfQorCit2b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0
Ojpjb21wdXRlSG9yaXpvbnRhbE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCit7CisgICAgYXV0byBj
b21wdXRlZEhvcml6b250YWxNYXJnaW4gPSBnZW9tZXRyeSgpLmNvbXB1dGVkSG9yaXpvbnRhbE1h
cmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgZm9ybWF0dGluZ1N0
YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1h
cmdpbi5lbmQudmFsdWVPcigwKSB9KTsKK30KKwordm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dDo6Y29tcHV0ZVdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jp
em9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBhdXRvIGNv
bXB1dGUgPSBbJl0oT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZFdpZHRoKSB7CisgICAgICAgIGlm
IChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBn
ZW9tZXRyeSgpLmZsb2F0aW5nQ29udGVudFdpZHRoQW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpv
bnRhbENvbnN0cmFpbnRzLCB7IHVzZWRXaWR0aCwgeyB9IH0pOworICAgICAgICBpZiAobGF5b3V0
Qm94LmlzSW5saW5lQmxvY2tCb3goKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlu
bGluZUJsb2NrQ29udGVudFdpZHRoQW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0
cmFpbnRzLCB7IHVzZWRXaWR0aCwgeyB9IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVw
bGFjZWRCb3goKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZVJlcGxhY2Vk
Q29udGVudFdpZHRoQW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBo
b3Jpem9udGFsQ29uc3RyYWludHMsIHsgfSwgeyB1c2VkV2lkdGgsIHsgfSB9KTsKKyAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBDb250ZW50V2lkdGhBbmRNYXJn
aW4geyB9OworICAgIH07CisKKyAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGNvbXB1
dGUoeyB9KTsKKworICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWlu
dHMubG9naWNhbFdpZHRoOworICAgIGlmIChhdXRvIG1heFdpZHRoID0gZ2VvbWV0cnkoKS5jb21w
dXRlZE1heFdpZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpKSB7CisgICAgICAgIGF1dG8g
bWF4V2lkdGhBbmRNYXJnaW4gPSBjb21wdXRlKG1heFdpZHRoKTsKKyAgICAgICAgaWYgKGNvbnRl
bnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGggPiBtYXhXaWR0aEFuZE1hcmdpbi5jb250ZW50
V2lkdGgpCisgICAgICAgICAgICBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBtYXhXaWR0aEFuZE1h
cmdpbjsKKyAgICB9CisKKyAgICBhdXRvIG1pbldpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1p
bldpZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpLnZhbHVlT3IoMCk7CisgICAgYXV0byBt
aW5XaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUobWluV2lkdGgpOworICAgIGlmIChjb250ZW50V2lk
dGhBbmRNYXJnaW4uY29udGVudFdpZHRoIDwgbWluV2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRo
KQorICAgICAgICBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBtaW5XaWR0aEFuZE1hcmdpbjsKKwor
ICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5
b3V0Qm94KTsKKyAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudFdpZHRo
QW5kTWFyZ2luLmNvbnRlbnRXaWR0aCk7CisgICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1h
cmdpbih7IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0LCBjb250ZW50V2lk
dGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgfSk7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQ6OmNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNv
bnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQoreworICAg
IGF1dG8gY29tcHV0ZSA9IFsmXShPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkSGVpZ2h0KSB7Cisg
ICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAg
IHJldHVybiBnZW9tZXRyeSgpLmZsb2F0aW5nQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRC
b3gsIGhvcml6b250YWxDb25zdHJhaW50cywgeyB1c2VkSGVpZ2h0IH0pOworICAgICAgICBpZiAo
bGF5b3V0Qm94LmlzSW5saW5lQmxvY2tCb3goKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRy
eSgpLmlubGluZUJsb2NrQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250
YWxDb25zdHJhaW50cywgeyB1c2VkSGVpZ2h0IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94Lmlz
UmVwbGFjZWRCb3goKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZVJlcGxh
Y2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94
KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IH0sIHsgdXNlZEhlaWdodCB9KTsKKyAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBDb250ZW50SGVpZ2h0QW5kTWFy
Z2luIHsgfTsKKyAgICB9OworCisgICAgYXV0byBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29t
cHV0ZSh7IH0pOworICAgIGlmIChhdXRvIG1heEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRN
YXhIZWlnaHQobGF5b3V0Qm94KSkgeworICAgICAgICBhdXRvIG1heEhlaWdodEFuZE1hcmdpbiA9
IGNvbXB1dGUobWF4SGVpZ2h0KTsKKyAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4u
Y29udGVudEhlaWdodCA+IG1heEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KQorICAgICAg
ICAgICAgY29udGVudEhlaWdodEFuZE1hcmdpbiA9IG1heEhlaWdodEFuZE1hcmdpbjsKKyAgICB9
CisKKyAgICBpZiAoYXV0byBtaW5IZWlnaHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluSGVpZ2h0
KGxheW91dEJveCkpIHsKKyAgICAgICAgYXV0byBtaW5IZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRl
KG1pbkhlaWdodCk7CisgICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRI
ZWlnaHQgPCBtaW5IZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCkKKyAgICAgICAgICAgIGNv
bnRlbnRIZWlnaHRBbmRNYXJnaW4gPSBtaW5IZWlnaHRBbmRNYXJnaW47CisgICAgfQorICAgIGF1
dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94
KTsKKyAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGNvbnRlbnRIZWlnaHRBbmRN
YXJnaW4uY29udGVudEhlaWdodCk7CisgICAgYm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4o
eyBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbi5iZWZvcmUsIGNvbnRl
bnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmFmdGVyIH0pOworfQorCit2b2lk
IElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCkK
K3sKKyAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5nU3RhdGUoKTsK
KyAgICBpZiAoIWZvcm1hdHRpbmdTdGF0ZS5pbmxpbmVJdGVtcygpLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuOworICAgIC8vIFRyYXZlcnNlIHRoZSB0cmVlIGFuZCBjcmVhdGUgaW5saW5lIGl0
ZW1zIG91dCBvZiBpbmxpbmUgYm94ZXMgYW5kIGxlYWYgbm9kZXMuIFRoaXMgZXNzZW50aWFsbHkg
dHVybnMgdGhlIHRyZWUgaW5saW5lIHN0cnVjdHVyZSBpbnRvIGEgZmxhdCBvbmUuCisgICAgLy8g
PHNwYW4+dGV4dDxzcGFuPjwvc3Bhbj48aW1nPjwvc3Bhbj4gLT4gW0lubGluZUJveFN0YXJ0XVtJ
bmxpbmVMZXZlbEJveF1bSW5saW5lQm94U3RhcnRdW0lubGluZUJveEVuZF1bSW5saW5lTGV2ZWxC
b3hdW0lubGluZUJveEVuZF0KKyAgICBBU1NFUlQocm9vdCgpLmhhc0luRmxvd09yRmxvYXRpbmdD
aGlsZCgpKTsKKyAgICBMYXlvdXRRdWV1ZSBsYXlvdXRRdWV1ZTsKKyAgICBsYXlvdXRRdWV1ZS5h
cHBlbmQocm9vdCgpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpOworICAgIHdoaWxlICgh
bGF5b3V0UXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAg
ICAgICBhdXRvJiBsYXlvdXRCb3ggPSAqbGF5b3V0UXVldWUubGFzdCgpOworICAgICAgICAgICAg
YXV0byBpc0JveFdpdGhJbmxpbmVDb250ZW50ID0gbGF5b3V0Qm94LmlzSW5saW5lQm94KCkgJiYg
IWxheW91dEJveC5pc0lubGluZVRleHRCb3goKSAmJiAhbGF5b3V0Qm94LmlzTGluZUJyZWFrQm94
KCk7CisgICAgICAgICAgICBpZiAoIWlzQm94V2l0aElubGluZUNvbnRlbnQpCisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzdGFydCBvZiBhbiBpbmxp
bmUgYm94IChlLmcuIDxzcGFuPikuCisgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkSW5s
aW5lSXRlbSh7IGxheW91dEJveCwgSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94U3RhcnQgfSk7
CisgICAgICAgICAgICBhdXRvJiBpbmxpbmVCb3hXaXRoSW5saW5lQ29udGVudCA9IGRvd25jYXN0
PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKKyAgICAgICAgICAgIGlmICghaW5saW5lQm94V2l0
aElubGluZUNvbnRlbnQuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBsYXlvdXRRdWV1ZS5hcHBlbmQoaW5saW5lQm94V2l0aElu
bGluZUNvbnRlbnQuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7CisgICAgICAgIH0KKwor
ICAgICAgICB3aGlsZSAoIWxheW91dFF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXV0
byYgbGF5b3V0Qm94ID0gKmxheW91dFF1ZXVlLnRha2VMYXN0KCk7CisgICAgICAgICAgICBpZiAo
aXM8TGluZUJyZWFrQm94PihsYXlvdXRCb3gpKSB7CisgICAgICAgICAgICAgICAgYXV0byYgbGlu
ZUJyZWFrQm94ID0gZG93bmNhc3Q8TGluZUJyZWFrQm94PihsYXlvdXRCb3gpOworICAgICAgICAg
ICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRJbmxpbmVJdGVtKHsgbGF5b3V0Qm94LCBsaW5lQnJl
YWtCb3guaXNPcHRpb25hbCgpID8gSW5saW5lSXRlbTo6VHlwZTo6V29yZEJyZWFrT3Bwb3J0dW5p
dHkgOiBJbmxpbmVJdGVtOjpUeXBlOjpIYXJkTGluZUJyZWFrIH0pOworICAgICAgICAgICAgfSBl
bHNlIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgICAg
ICBmb3JtYXR0aW5nU3RhdGUuYWRkSW5saW5lSXRlbSh7IGxheW91dEJveCwgSW5saW5lSXRlbTo6
VHlwZTo6RmxvYXQgfSk7CisgICAgICAgICAgICBlbHNlIGlmIChsYXlvdXRCb3guaXNBdG9taWNJ
bmxpbmVMZXZlbEJveCgpKQorICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRJbmxp
bmVJdGVtKHsgbGF5b3V0Qm94LCBJbmxpbmVJdGVtOjpUeXBlOjpCb3ggfSk7CisgICAgICAgICAg
ICBlbHNlIGlmIChsYXlvdXRCb3guaXNJbmxpbmVUZXh0Qm94KCkpIHsKKyAgICAgICAgICAgICAg
ICBJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlQW5kQXBwZW5kVGV4dEl0ZW1zKGZvcm1hdHRpbmdTdGF0
ZS5pbmxpbmVJdGVtcygpLCBkb3duY2FzdDxJbmxpbmVUZXh0Qm94PihsYXlvdXRCb3gpKTsKKyAg
ICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LmlzSW5saW5lQm94KCkpCisgICAgICAgICAg
ICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZElubGluZUl0ZW0oeyBsYXlvdXRCb3gsIElubGluZUl0
ZW06OlR5cGU6OklubGluZUJveEVuZCB9KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKworICAgICAgICAgICAgaWYgKGF1dG8qIG5leHRT
aWJsaW5nID0gbGF5b3V0Qm94Lm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7CisgICAg
ICAgICAgICAgICAgbGF5b3V0UXVldWUuYXBwZW5kKG5leHRTaWJsaW5nKTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworSW5saW5l
UmVjdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUdlb21ldHJ5Rm9yTGluZUNvbnRl
bnQoY29uc3QgTGluZUJ1aWxkZXI6OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCit7CisgICAgYXV0byYg
Zm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7CisgICAgYXV0byBnZW9t
ZXRyeSA9IHRoaXMtPmdlb21ldHJ5KCk7CisKKyAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZUJv
eChnZW9tZXRyeS5saW5lQm94Rm9yTGluZUNvbnRlbnQobGluZUNvbnRlbnQpKTsKKyAgICBjb25z
dCBhdXRvJiBsaW5lQm94ID0gZm9ybWF0dGluZ1N0YXRlLmxpbmVCb3hlcygpLmxhc3QoKTsKKyAg
ICBhdXRvIGxpbmVJbmRleCA9IGZvcm1hdHRpbmdTdGF0ZS5saW5lcygpLnNpemUoKTsKKyAgICBh
dXRvJiBsaW5lQm94TG9naWNhbFJlY3QgPSBsaW5lQm94LmxvZ2ljYWxSZWN0KCk7CisgICAgaWYg
KCFsaW5lQm94Lmhhc0NvbnRlbnQoKSkgeworICAgICAgICAvLyBGYXN0IHBhdGggZm9yIGxpbmVz
IHdpdGggbm8gY29udGVudCBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2Rp
dj4gb3IgPHNwYW4+PGRpdj48L2Rpdj48L3NwYW4+IHdoZXJlIHdlIGNvbnN0cnVjdCBlbXB0eSBw
cmUgYW5kIHBvc3QgYmxvY2tzLgorICAgICAgICBBU1NFUlQoIWxpbmVCb3guY29udGVudExvZ2lj
YWxXaWR0aCgpICYmICFsaW5lQm94TG9naWNhbFJlY3QuaGVpZ2h0KCkpOworICAgICAgICBhdXRv
IHVwZGF0ZUlubGluZUJveGVzR2VvbWV0cnlJZkFwcGxpY2FibGUgPSBbJl0geworICAgICAgICAg
ICAgaWYgKCFsaW5lQm94Lmhhc0lubGluZUJveCgpKQorICAgICAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgICAgIFZlY3Rvcjxjb25zdCBCb3gqPiBsYXlvdXRCb3hMaXN0OworICAgICAgICAg
ICAgLy8gQ29sbGVjdCB0aGUgZW1wdHkgaW5saW5lIGJveGVzIHRoYXQgc2hvd2VkIHVwIGZpcnN0
IG9uIHRoaXMgbGluZS4KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBhbiBpbmxpbmUgYm94IGVu
ZCBvbiBhbiBlbXB0eSBsaW5lIGRvZXMgbm90IG1ha2UgdGhlIGlubGluZSBib3ggdGFsbGVyLgor
ICAgICAgICAgICAgLy8gKGUuZy4gPGRpdj50ZXh0PHNwYW4+PGJyPjwvc3Bhbj48L2Rpdj4pIDwt
IHRoZSA8c3Bhbj4gaW5saW5lIGJveCBpcyBhcyB0YWxsIGFzIHRoZSBsaW5lIGV2ZW4gdGhvdWdo
IHRoZSA8L3NwYW4+IGlzIGFmdGVyIGEgPGJyPiBzbyB0ZWNobmljYWxseSBpcyBvbiB0aGUgZm9s
bG93aW5nIChlbXB0eSlsaW5lLgorICAgICAgICAgICAgZm9yIChhdXRvJiBsaW5lUnVuIDogbGlu
ZUNvbnRlbnQucnVucykgeworICAgICAgICAgICAgICAgIGlmIChsaW5lUnVuLmlzSW5saW5lQm94
U3RhcnQoKSkKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0Qm94TGlzdC5hcHBlbmQoJmxpbmVS
dW4ubGF5b3V0Qm94KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChhdXRvKiBs
YXlvdXRCb3ggOiBsYXlvdXRCb3hMaXN0KSB7CisgICAgICAgICAgICAgICAgYXV0byYgYm94R2Vv
bWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkoKmxheW91dEJveCk7CisgICAgICAg
ICAgICAgICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsSGVpZ2h0ID0gTGF5b3V0VW5pdDo6ZnJvbUZs
b2F0Q2VpbChsaW5lQm94LmxvZ2ljYWxCb3JkZXJCb3hGb3JJbmxpbmVCb3goKmxheW91dEJveCwg
Ym94R2VvbWV0cnkpLmhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRD
b250ZW50Qm94SGVpZ2h0KGlubGluZUJveExvZ2ljYWxIZWlnaHQpOworICAgICAgICAgICAgICAg
IGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aCh7IH0pOworICAgICAgICAgICAgICAgIGJv
eEdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KHRvTGF5b3V0UG9pbnQobGluZUJveExvZ2ljYWxS
ZWN0LnRvcExlZnQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB1cGRh
dGVJbmxpbmVCb3hlc0dlb21ldHJ5SWZBcHBsaWNhYmxlKCk7CisgICAgICAgIGZvcm1hdHRpbmdT
dGF0ZS5hZGRMaW5lKHsgbGluZUJveExvZ2ljYWxSZWN0LCB7IHsgfSwgeyB9IH0sIHsgfSwgeyB9
LCB7IH0gfSk7CisgICAgICAgIHJldHVybiBsaW5lQm94TG9naWNhbFJlY3Q7CisgICAgfQorCisg
ICAgYXV0byByb290SW5saW5lQm94TG9naWNhbFJlY3QgPSBsaW5lQm94LmxvZ2ljYWxSZWN0Rm9y
Um9vdElubGluZUJveCgpOworICAgIGF1dG8gZW5jbG9zaW5nVG9wQW5kQm90dG9tID0gSW5saW5l
TGluZUdlb21ldHJ5OjpFbmNsb3NpbmdUb3BBbmRCb3R0b20geyByb290SW5saW5lQm94TG9naWNh
bFJlY3QudG9wKCksIHJvb3RJbmxpbmVCb3hMb2dpY2FsUmVjdC5ib3R0b20oKSB9OworICAgIEhh
c2hTZXQ8Y29uc3QgQm94Kj4gaW5saW5lQm94U3RhcnRTZXQ7CisgICAgSGFzaFNldDxjb25zdCBC
b3gqPiBpbmxpbmVCb3hFbmRTZXQ7CisKKyAgICBhdXRvIGNvbnN0cnVjdExpbmVSdW5zQW5kVXBk
YXRlQm94R2VvbWV0cnkgPSBbJl0geworICAgICAgICAvLyBDcmVhdGUgdGhlIGlubGluZSBydW5z
IG9uIHRoZSBjdXJyZW50IGxpbmUuIFRoaXMgaXMgbW9zdGx5IHRleHQgYW5kIGF0b21pYyBpbmxp
bmUgcnVucy4KKyAgICAgICAgZm9yIChhdXRvJiBsaW5lUnVuIDogbGluZUNvbnRlbnQucnVucykg
eworICAgICAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBub3QgbmVlZCB0byBjb25zdHJ1Y3Qg
YSBsaW5lIHJ1biBmb3IgPGJyPi4KKyAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9IGxpbmVS
dW4ubGF5b3V0Qm94KCk7CisgICAgICAgICAgICBpZiAobGluZVJ1bi5pc1RleHQoKSkgeworICAg
ICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlv
dXRCb3gsIGxpbmVCb3gubG9naWNhbFJlY3RGb3JUZXh0UnVuKGxpbmVSdW4pLCBsaW5lUnVuLmV4
cGFuc2lvbigpLCBsaW5lUnVuLnRleHRDb250ZW50KCkgfSk7CisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZVJ1bi5pc0xpbmVCcmVh
aygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKSB7
CisgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgaGFyZCBsaW5lYnJlYWtzIGhhdmUgYXNzb2Np
YXRlZCBsYXlvdXQgYm94ZXMuCisgICAgICAgICAgICAgICAgICAgIGF1dG8gbGluZUJyZWFrQm94
UmVjdCA9IGxpbmVCb3gubG9naWNhbFJlY3RGb3JMaW5lQnJlYWtCb3gobGF5b3V0Qm94KTsKKyAg
ICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBsaW5lSW5kZXgs
IGxheW91dEJveCwgbGluZUJyZWFrQm94UmVjdCwgbGluZVJ1bi5leHBhbnNpb24oKSwgeyB9IH0p
OworCisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0
YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7CisgICAgICAgICAgICAgICAgICAgIGxpbmVCcmVh
a0JveFJlY3QubW92ZUJ5KGxpbmVCb3hMb2dpY2FsUmVjdC50b3BMZWZ0KCkpOworICAgICAgICAg
ICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVmdCh0b0xheW91dFBvaW50KGxp
bmVCcmVha0JveFJlY3QudG9wTGVmdCgpKSk7CisgICAgICAgICAgICAgICAgICAgIGJveEdlb21l
dHJ5LnNldENvbnRlbnRCb3hIZWlnaHQodG9MYXlvdXRVbml0KGxpbmVCcmVha0JveFJlY3QuaGVp
Z2h0KCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgCisgICAgICAgICAgICAgICAgICAgIGZv
cm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gsIGxpbmVCb3gu
bG9naWNhbFJlY3RGb3JUZXh0UnVuKGxpbmVSdW4pLCBsaW5lUnVuLmV4cGFuc2lvbigpLCBsaW5l
UnVuLnRleHRDb250ZW50KCkgfSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBpZiAobGluZVJ1bi5pc0JveCgpKSB7CisgICAgICAgICAgICAg
ICAgQVNTRVJUKGxheW91dEJveC5pc0F0b21pY0lubGluZUxldmVsQm94KCkpOworICAgICAgICAg
ICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxh
eW91dEJveCk7CisgICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsQm9yZGVyQm94ID0gbGluZUJv
eC5sb2dpY2FsQm9yZGVyQm94Rm9yQXRvbWljSW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94LCBib3hH
ZW9tZXRyeSk7CisgICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBs
aW5lSW5kZXgsIGxheW91dEJveCwgbG9naWNhbEJvcmRlckJveCwgbGluZVJ1bi5leHBhbnNpb24o
KSwgeyB9IH0pOworCisgICAgICAgICAgICAgICAgYXV0byBib3JkZXJCb3hMb2dpY2FsVG9wTGVm
dCA9IGxvZ2ljYWxCb3JkZXJCb3gudG9wTGVmdCgpOworICAgICAgICAgICAgICAgIC8vIE5vdGUg
dGhhdCBpbmxpbmUgYm94ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBsaW5lIGFuZCB0aGVpciB0b3Ag
cG9zaXRpb24gY2FuIGJlIG5lZ2F0aXZlLgorICAgICAgICAgICAgICAgIGJvcmRlckJveExvZ2lj
YWxUb3BMZWZ0Lm1vdmVCeShsaW5lQm94TG9naWNhbFJlY3QudG9wTGVmdCgpKTsKKyAgICAgICAg
ICAgICAgICBpZiAobGF5b3V0Qm94LmlzSW5GbG93UG9zaXRpb25lZCgpKQorICAgICAgICAgICAg
ICAgICAgICBib3JkZXJCb3hMb2dpY2FsVG9wTGVmdCArPSBnZW9tZXRyeS5pbkZsb3dQb3NpdGlv
bmVkUG9zaXRpb25PZmZzZXQobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAg
ICAgICAgICAgICAgIC8vIEF0b21pYyBpbmxpbmUgYm94ZXMgYXJlIGFsbCBzZXQuIFRoZWlyIG1h
cmdpbi9ib3JkZXIvY29udGVudCBib3ggZ2VvbWV0cmllcyBhcmUgYWxyZWFkeSBjb21wdXRlZC4g
V2UganVzdCBoYXZlIHRvIHBvc2l0aW9uIHRoZW0gaGVyZS4KKyAgICAgICAgICAgICAgICBib3hH
ZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVmdCh0b0xheW91dFBvaW50KGJvcmRlckJveExvZ2ljYWxU
b3BMZWZ0KSk7CisKKyAgICAgICAgICAgICAgICBhdXRvIGJvcmRlckJveFRvcCA9IGJvcmRlckJv
eExvZ2ljYWxUb3BMZWZ0LnkoKTsKKyAgICAgICAgICAgICAgICBhdXRvIGJvcmRlckJveEJvdHRv
bSA9IGJvcmRlckJveFRvcCArIGJveEdlb21ldHJ5LmJvcmRlckJveEhlaWdodCgpOworICAgICAg
ICAgICAgICAgIGVuY2xvc2luZ1RvcEFuZEJvdHRvbS50b3AgPSBzdGQ6Om1pbihlbmNsb3NpbmdU
b3BBbmRCb3R0b20udG9wLCBib3JkZXJCb3hUb3ApOworICAgICAgICAgICAgICAgIGVuY2xvc2lu
Z1RvcEFuZEJvdHRvbS5ib3R0b20gPSBzdGQ6Om1heChlbmNsb3NpbmdUb3BBbmRCb3R0b20uYm90
dG9tLCBib3JkZXJCb3hCb3R0b20pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgaWYgKGxpbmVSdW4uaXNJbmxpbmVCb3hTdGFydCgpKSB7Cisg
ICAgICAgICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUuYm94R2Vv
bWV0cnkobGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxS
ZWN0ID0gbGluZUJveC5sb2dpY2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KGxheW91dEJveCwgYm94
R2VvbWV0cnkpOworICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsg
bGluZUluZGV4LCBsYXlvdXRCb3gsIGlubGluZUJveExvZ2ljYWxSZWN0LCBsaW5lUnVuLmV4cGFu
c2lvbigpLCB7IH0gfSk7CisgICAgICAgICAgICAgICAgaW5saW5lQm94U3RhcnRTZXQuYWRkKCZs
YXlvdXRCb3gpOworICAgICAgICAgICAgICAgIGVuY2xvc2luZ1RvcEFuZEJvdHRvbS50b3AgPSBz
dGQ6Om1pbihlbmNsb3NpbmdUb3BBbmRCb3R0b20udG9wLCBpbmxpbmVCb3hMb2dpY2FsUmVjdC50
b3AoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAobGluZVJ1bi5pc0lubGluZUJveEVuZCgpKSB7CisgICAgICAgICAgICAgICAgaW5s
aW5lQm94RW5kU2V0LmFkZCgmbGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICBpZiAoIWlubGlu
ZUJveFN0YXJ0U2V0LmNvbnRhaW5zKCZsYXlvdXRCb3gpKSB7CisgICAgICAgICAgICAgICAgICAg
IC8vIEFuIGlubGluZSBib3ggY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMuIFVzZSB0aGUgW2lubGlu
ZSBib3ggZW5kXSBzaWduYWwgdG8gaW5jbHVkZSBpdCBpbiB0aGUgZW5jbG9zaW5nIGdlb21ldHJ5
CisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgd2hlbiBpdCBzdGFydHMgYXQgYSBwcmV2aW91
cyBsaW5lLgorICAgICAgICAgICAgICAgICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxSZWN0ID0g
bGluZUJveC5sb2dpY2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KGxheW91dEJveCwgZm9ybWF0dGlu
Z1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCkpOworICAgICAgICAgICAgICAgICAgICBlbmNs
b3NpbmdUb3BBbmRCb3R0b20uYm90dG9tID0gc3RkOjptYXgoZW5jbG9zaW5nVG9wQW5kQm90dG9t
LmJvdHRvbSwgaW5saW5lQm94TG9naWNhbFJlY3QuYm90dG9tKCkpOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IEFTU0VSVChsaW5lUnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7CisgICAgICAgIH0KKyAg
ICB9OworICAgIGNvbnN0cnVjdExpbmVSdW5zQW5kVXBkYXRlQm94R2VvbWV0cnkoKTsKKworICAg
IGF1dG8gdXBkYXRlQm94R2VvbWV0cnlGb3JJbmxpbmVCb3hlcyA9IFsmXSB7CisgICAgICAgIC8v
IEZJWE1FOiBXZSBtYXkgd2FudCB0byBrZWVwIGFyb3VuZCBhbiBpbmxpbmUgYm94IG9ubHkgc2V0
LgorICAgICAgICBpZiAoIWxpbmVCb3guaGFzSW5saW5lQm94KCkpCisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIC8vIEdyYWIgdGhlIGlubGluZSBib3hlcyAoZXZlbiB0aG9zZSB0aGF0IGRv
bid0IGhhdmUgYXNzb2NpYXRlZCBsYXlvdXQgYm94ZXMgb24gdGhlIGN1cnJlbnQgbGluZSBkdWUg
dG8gbGluZSB3cmFwcGluZykKKyAgICAgICAgLy8gYW5kIHVwZGF0ZSB0aGVpciBnZW9tZXRyaWVz
LgorICAgICAgICBmb3IgKGF1dG8mIGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5s
aW5lTGV2ZWxCb3hlcygpKSB7CisgICAgICAgICAgICBpZiAoIWlubGluZUxldmVsQm94LmlzSW5s
aW5lQm94KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhdXRvJiBs
YXlvdXRCb3ggPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKKyAgICAgICAgICAgIGF1dG8m
IGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7Cisg
ICAgICAgICAgICAvLyBJbmxpbmUgYm94ZXMgbWF5IG9yIG1heSBub3QgYmUgd3JhcHBlZCBhbmQg
aGF2ZSBydW5zIG9uIG11bHRpcGxlIGxpbmVzIChlLmcuIDxzcGFuPmZpcnN0IGxpbmU8YnI+c2Vj
b25kIGxpbmU8YnI+dGhpcmQgbGluZTwvc3Bhbj4pCisgICAgICAgICAgICBhdXRvIGlubGluZUJv
eEJvcmRlckJveCA9IGxpbmVCb3gubG9naWNhbEJvcmRlckJveEZvcklubGluZUJveChsYXlvdXRC
b3gsIGJveEdlb21ldHJ5KTsKKyAgICAgICAgICAgIGF1dG8gaW5saW5lQm94U2l6ZSA9IExheW91
dFNpemUgeyBMYXlvdXRVbml0Ojpmcm9tRmxvYXRDZWlsKGlubGluZUJveEJvcmRlckJveC53aWR0
aCgpKSwgTGF5b3V0VW5pdDo6ZnJvbUZsb2F0Q2VpbChpbmxpbmVCb3hCb3JkZXJCb3guaGVpZ2h0
KCkpIH07CisgICAgICAgICAgICBhdXRvIGxvZ2ljYWxSZWN0ID0gUmVjdCB7IExheW91dFBvaW50
IHsgaW5saW5lQm94Qm9yZGVyQm94LnRvcExlZnQoKSB9LCBpbmxpbmVCb3hTaXplIH07CisgICAg
ICAgICAgICBsb2dpY2FsUmVjdC5tb3ZlQnkoTGF5b3V0UG9pbnQgeyBsaW5lQm94TG9naWNhbFJl
Y3QudG9wTGVmdCgpIH0pOworICAgICAgICAgICAgaWYgKGlubGluZUJveFN0YXJ0U2V0LmNvbnRh
aW5zKCZsYXlvdXRCb3gpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpbmxpbmUgYm94IHNo
b3dlZCB1cCBmaXJzdCBvbiB0aGlzIGxpbmUuCisgICAgICAgICAgICAgICAgYm94R2VvbWV0cnku
c2V0TG9naWNhbFRvcExlZnQobG9naWNhbFJlY3QudG9wTGVmdCgpKTsKKyAgICAgICAgICAgICAg
ICBhdXRvIGNvbnRlbnRCb3hIZWlnaHQgPSBsb2dpY2FsUmVjdC5oZWlnaHQoKSAtIChib3hHZW9t
ZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgYm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFs
dWVPcigwX2x1KSk7CisgICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhl
aWdodChjb250ZW50Qm94SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBhdXRvIGNvbnRlbnRCb3hX
aWR0aCA9IGxvZ2ljYWxSZWN0LndpZHRoKCkgLSAoYm94R2VvbWV0cnkuaG9yaXpvbnRhbEJvcmRl
cigpICsgYm94R2VvbWV0cnkuaG9yaXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKTsKKyAg
ICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudEJveFdp
ZHRoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIC8vIE1pZGRsZSBvciBlbmQgb2YgdGhlIGlubGluZSBib3guIExldCdzIHN0cmV0Y2ggdGhl
IGJveCBhcyBuZWVkZWQuCisgICAgICAgICAgICBhdXRvIGVuY2xvc2luZ0JvcmRlckJveFJlY3Qg
PSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChib3hHZW9tZXRyeSk7CisgICAgICAgICAgICBl
bmNsb3NpbmdCb3JkZXJCb3hSZWN0LmV4cGFuZFRvQ29udGFpbihsb2dpY2FsUmVjdCk7CisgICAg
ICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsTGVmdChlbmNsb3NpbmdCb3JkZXJCb3hSZWN0
LmxlZnQoKSk7CisKKyAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQo
ZW5jbG9zaW5nQm9yZGVyQm94UmVjdC5oZWlnaHQoKSAtIChib3hHZW9tZXRyeS52ZXJ0aWNhbEJv
cmRlcigpICsgYm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KSkpOwor
ICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGVuY2xvc2luZ0JvcmRl
ckJveFJlY3Qud2lkdGgoKSAtIChib3hHZW9tZXRyeS5ob3Jpem9udGFsQm9yZGVyKCkgKyBib3hH
ZW9tZXRyeS5ob3Jpem9udGFsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpKTsKKyAgICAgICAgfQor
ICAgIH07CisgICAgdXBkYXRlQm94R2VvbWV0cnlGb3JJbmxpbmVCb3hlcygpOworCisgICAgYXV0
byBjb25zdHJ1Y3RMaW5lR2VvbWV0cnkgPSBbJl0geworICAgICAgICBmb3JtYXR0aW5nU3RhdGUu
YWRkTGluZSh7IGxpbmVCb3hMb2dpY2FsUmVjdCwgZW5jbG9zaW5nVG9wQW5kQm90dG9tLCBsaW5l
Qm94LmFsaWdubWVudEJhc2VsaW5lKCksIHJvb3RJbmxpbmVCb3hMb2dpY2FsUmVjdC5sZWZ0KCks
IGxpbmVDb250ZW50LmNvbnRlbnRMb2dpY2FsV2lkdGggfSk7CisgICAgfTsKKyAgICBjb25zdHJ1
Y3RMaW5lR2VvbWV0cnkoKTsKKworICAgIHJldHVybiBsaW5lQm94TG9naWNhbFJlY3Q7Cit9CisK
K3ZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmludmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUo
Y29uc3QgSW52YWxpZGF0aW9uU3RhdGUmKQoreworICAgIC8vIEZpbmQgb3V0IHdoYXQgd2UgbmVl
ZCB0byBpbnZhbGlkYXRlLiBUaGlzIGlzIHdoZXJlIHdlIGFkZCBzb21lIHNtYXJ0cyB0byBkbyBw
YXJ0aWFsIGxpbmUgbGF5b3V0LgorICAgIC8vIEZvciBub3cgbGV0J3MganVzdCBjbGVhciB0aGUg
cnVucy4KKyAgICBmb3JtYXR0aW5nU3RhdGUoKS5jbGVhckxpbmVBbmRSdW5zKCk7CisgICAgLy8g
RklYTUU6IFRoaXMgaXMgYWxzbyB3aGVyZSB3ZSB3b3VsZCBkZWxldGUgaW5saW5lIGl0ZW1zIGlm
IHRoZWlyIGNvbnRlbnQgY2hhbmdlZC4KK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uYWQ3ZWM5NzIzN2MxZTg4ZDc4ODYwMjY3YTE4MDdlMjA0OGFmNDMyZQotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oCkBAIC0wLDAgKzEsMTE5
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1B
VFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVk
ZSAiSW5saW5lTGluZUJ1aWxkZXIuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBJbmxpbmVGb3Jt
YXR0aW5nU3RhdGU7CitjbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKK2NsYXNzIExpbmVCb3g7CisK
Ky8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbGF5b3V0IGxvZ2ljIGZvciBpbmxpbmUgZm9y
bWF0dGluZyBjb250ZXh0cy4KKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi92aXN1cmVu
Lmh0bWwjaW5saW5lLWZvcm1hdHRpbmcKK2NsYXNzIElubGluZUZvcm1hdHRpbmdDb250ZXh0IGZp
bmFsIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NB
VEVEKElubGluZUZvcm1hdHRpbmdDb250ZXh0KTsKK3B1YmxpYzoKKyAgICBJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgSW5s
aW5lRm9ybWF0dGluZ1N0YXRlJik7CisgICAgdm9pZCBsYXlvdXRJbkZsb3dDb250ZW50KEludmFs
aWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jikgb3ZlcnJp
ZGU7CisgICAgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0IG92ZXJyaWRlOwor
CisgICAgY2xhc3MgUXVpcmtzIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3Mgewor
ICAgIHB1YmxpYzoKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBpbml0aWFsTGluZUhlaWdodCgp
IGNvbnN0OworICAgICAgICBib29sIGhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdlKCkgY29u
c3Q7CisgICAgICAgIGJvb2wgaW5saW5lTGV2ZWxCb3hBZmZlY3RzTGluZUJveChjb25zdCBMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveCYsIGNvbnN0IExpbmVCb3gmKSBjb25zdDsKKworICAgIHByaXZh
dGU6CisgICAgICAgIGZyaWVuZCBjbGFzcyBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKKyAgICAg
ICAgUXVpcmtzKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Jik7CisKKyAgICAgICAgY29u
c3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyBy
ZXR1cm4gZG93bmNhc3Q8SW5saW5lRm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0
OjpRdWlya3M6OmZvcm1hdHRpbmdDb250ZXh0KCkpOyB9CisKKyAgICB9OworICAgIElubGluZUZv
cm1hdHRpbmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4gUXVpcmtzKCp0
aGlzKTsgfQorCisgICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3Rh
dGUoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxJbmxpbmVGb3JtYXR0aW5nU3RhdGU+KEZvcm1h
dHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KKyAgICBJbmxpbmVGb3JtYXR0aW5n
U3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIGRvd25jYXN0PElubGluZUZvcm1hdHRp
bmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQorCisgICAg
dm9pZCBsaW5lTGF5b3V0Rm9ySW50ZXJncmF0aW9uKEludmFsaWRhdGlvblN0YXRlJiwgY29uc3Qg
Q29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jik7CisKK3ByaXZhdGU6CisgICAgSW50cmluc2lj
V2lkdGhDb25zdHJhaW50cyBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSBvdmVy
cmlkZTsKKworICAgIGNsYXNzIEdlb21ldHJ5IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpH
ZW9tZXRyeSB7CisgICAgcHVibGljOgorICAgICAgICBMaW5lQm94IGxpbmVCb3hGb3JMaW5lQ29u
dGVudChjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmKTsKKyAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsVG9wRm9yTmV4dExpbmUoY29uc3QgTGluZUJ1aWxkZXI6OkxpbmVDb250
ZW50JiwgSW5saW5lTGF5b3V0VW5pdCBwcmV2aW91c0xpbmVMb2dpY2FsQm90dG9tLCBjb25zdCBG
bG9hdGluZ0NvbnRleHQmKSBjb25zdDsKKworICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2lu
IGlubGluZUJsb2NrQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jp
em9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKSBjb25z
dDsKKyAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGlubGluZUJsb2NrQ29udGVudFdpZHRo
QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0
IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7CisKKyAgICBwcml2YXRlOgorICAgICAgICBm
cmllbmQgY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7CisgICAgICAgIEdlb21ldHJ5KGNv
bnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Jik7CisKKyAgICAgICAgY29uc3QgSW5saW5lRm9y
bWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNh
c3Q8SW5saW5lRm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6
Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KKworICAgIH07CisgICAgSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMp
OyB9CisKKyAgICB2b2lkIGxpbmVMYXlvdXQoSW5saW5lSXRlbXMmLCBMaW5lQnVpbGRlcjo6SW5s
aW5lSXRlbVJhbmdlLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsKKworICAg
IHZvaWQgY29tcHV0ZUludHJpbnNpY1dpZHRoRm9yRm9ybWF0dGluZ1Jvb3QoY29uc3QgQm94Jik7
CisgICAgSW5saW5lTGF5b3V0VW5pdCBjb21wdXRlZEludHJpbnNpY1dpZHRoRm9yQ29uc3RyYWlu
dChJbmxpbmVMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKSBjb25zdDsKKworICAgIHZvaWQgY29t
cHV0ZUhvcml6b250YWxNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJik7CisgICAgdm9pZCBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0
IEhvcml6b250YWxDb25zdHJhaW50cyYpOworICAgIHZvaWQgY29tcHV0ZVdpZHRoQW5kTWFyZ2lu
KGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOworCisgICAgdm9pZCBj
b2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCk7CisgICAgSW5saW5lUmVjdCBjb21wdXRlR2Vv
bWV0cnlGb3JMaW5lQ29udGVudChjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmLCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmKTsKKyAgICB2b2lkIGludmFsaWRhdGVGb3JtYXR0aW5n
U3RhdGUoY29uc3QgSW52YWxpZGF0aW9uU3RhdGUmKTsKK307CisKK2lubGluZSBJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Okdlb21ldHJ5KGNvbnN0IElubGluZUZvcm1hdHRpbmdD
b250ZXh0JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICA6IEZvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeShpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworaW5saW5lIElubGlu
ZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OlF1aXJrcyhjb25zdCBJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCYgaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4
dDo6UXVpcmtzKGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQoreworfQorCit9Cit9CisKK1NQRUNJ
QUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCwgaXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKQorCisjZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9y
bWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iMjRlNzg4MzMzODBmYjRjYzIw
NTEzNTlhMzZiNTA0OTU0OWI5YWQwCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRp
bmdDb250ZXh0R2VvbWV0cnkuY3BwCkBAIC0wLDAgKzEsNzI3IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCisK
KyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsb2F0
aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAi
SW5saW5lTGluZUJveC5oIgorI2luY2x1ZGUgIkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91
dENvbnRhaW5lckJveC5oIgorI2luY2x1ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCisjaW5jbHVk
ZSAiTGVuZ3RoRnVuY3Rpb25zLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBM
YXlvdXQgeworCitjbGFzcyBMaW5lQm94QnVpbGRlciB7CitwdWJsaWM6CisgICAgTGluZUJveEJ1
aWxkZXIoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmKTsKKyAgICBMaW5lQm94IGJ1aWxk
KGNvbnN0IExpbmVCdWlsZGVyOjpMaW5lQ29udGVudCYpOworCitwcml2YXRlOgorICAgIHN0cnVj
dCBTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQgeworICAgICAgICBTaW1wbGlmaWVkVmVydGlj
YWxBbGlnbm1lbnQoY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gp
OworCisgICAgICAgIHN0YXRpYyBib29sIGNhblVzZVNpbXBsaWZpZWRBbGlnbm1lbnQoY29uc3Qg
TGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gsIGNvbnN0IExpbmVCb3g6Oklu
bGluZUxldmVsQm94JiwgT3B0aW9uYWw8Y29uc3QgQm94R2VvbWV0cnk+IGlubGluZUxldmVsQm94
R2VvbWV0cnkpOworCisgICAgICAgIHZvaWQgYWxpZ24oTGluZUJveDo6SW5saW5lTGV2ZWxCb3gm
KTsKKworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHJvb3RJbmxpbmVCb3hMb2dpY2FsVG9wKCkg
Y29uc3QgeyByZXR1cm4gbV9yb290SW5saW5lQm94TG9naWNhbFRvcDsgfQorICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IGxpbmVCb3hIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hMb2dp
Y2FsQm90dG9tIC0gbV9saW5lQm94TG9naWNhbFRvcDsgfQorCisgICAgICAgIHZvaWQgc2V0RW5h
YmxlZChib29sIGVuYWJsZWQpIHsgbV9pc0VuYWJsZWQgPSBlbmFibGVkOyB9CisgICAgICAgIGJv
b2wgaXNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbV9pc0VuYWJsZWQ7IH0KKworICAgIHByaXZh
dGU6CisgICAgICAgIHZvaWQgYWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94Jik7
CisKKyAgICAgICAgY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIG1fcm9vdElubGluZUJv
eDsKKyAgICAgICAgYm9vbCBtX2lzRW5hYmxlZCB7IHRydWUgfTsKKyAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCBtX2xpbmVCb3hMb2dpY2FsVG9wIHsgMCB9OworICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IG1fbGluZUJveExvZ2ljYWxCb3R0b20geyAwIH07CisgICAgICAgIElubGluZUxheW91dFVu
aXQgbV9yb290SW5saW5lQm94TG9naWNhbFRvcCB7IDAgfTsKKyAgICB9OworCisgICAgdm9pZCBz
ZXRWZXJ0aWNhbEdlb21ldHJ5Rm9ySW5saW5lQm94KExpbmVCb3g6OklubGluZUxldmVsQm94Jikg
Y29uc3Q7CisgICAgdm9pZCBjb25zdHJ1Y3RBbmRBbGlnbklubGluZUxldmVsQm94ZXMoTGluZUJv
eCYsIGNvbnN0IExpbmU6OlJ1bkxpc3QmKTsKKyAgICB2b2lkIGNvbXB1dGVMaW5lQm94SGVpZ2h0
QW5kQWxpZ25JbmxpbmVMZXZlbEJveGVzVmVydGljYWxseShMaW5lQm94Jik7CisKKyAgICBjb25z
dCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJl
dHVybiBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0OyB9CisgICAgY29uc3QgQm94JiByb290Qm94
KCkgY29uc3QgeyByZXR1cm4gZm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCk7IH0KKyAgICBMYXlv
dXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgp
LmxheW91dFN0YXRlKCk7IH0KKworICAgIGJvb2wgaXNSb290TGF5b3V0Qm94KGNvbnN0IENvbnRh
aW5lckJveCYgY29udGFpbmVyQm94KSBjb25zdCB7IHJldHVybiAmY29udGFpbmVyQm94ID09ICZy
b290Qm94KCk7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dCYgbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKK307CisKK3N0cnVjdCBIYW5naW5nVHJhaWxp
bmdXaGl0ZXNwYWNlQ29udGVudCB7CitwdWJsaWM6CisgICAgdm9pZCByZXNldCgpOworCisgICAg
SW5saW5lTGF5b3V0VW5pdCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fd2lkdGg7IH0KKyAgICBi
b29sIGlzQ29uZGl0aW9uYWwoKSBjb25zdCB7IHJldHVybiBtX2lzQ29uZGl0aW9uYWw7IH0KKwor
ICAgIHZvaWQgc2V0SXNDb25kaXRpb25hbCgpIHsgbV9pc0NvbmRpdGlvbmFsID0gdHJ1ZTsgfQor
ICAgIHZvaWQgZXhwYW5kKElubGluZUxheW91dFVuaXQgd2lkdGgpIHsgbV93aWR0aCArPSB3aWR0
aDsgfQorCitwcml2YXRlOgorICAgIGJvb2wgbV9pc0NvbmRpdGlvbmFsIHsgZmFsc2UgfTsKKyAg
ICBJbmxpbmVMYXlvdXRVbml0IG1fd2lkdGggeyAwIH07Cit9OworCit2b2lkIEhhbmdpbmdUcmFp
bGluZ1doaXRlc3BhY2VDb250ZW50OjpyZXNldCgpCit7CisgICAgbV9pc0NvbmRpdGlvbmFsID0g
ZmFsc2U7CisgICAgbV93aWR0aCA9ICAwOworfQorCitzdGF0aWMgSGFuZ2luZ1RyYWlsaW5nV2hp
dGVzcGFjZUNvbnRlbnQgY29sbGVjdEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50KGNv
bnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnMsIGJvb2wgaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50
KQoreworICAgIGF1dG8gaGFuZ2luZ0NvbnRlbnQgPSBIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNl
Q29udGVudCB7IH07CisgICAgaWYgKGlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudCkKKyAgICAg
ICAgaGFuZ2luZ0NvbnRlbnQuc2V0SXNDb25kaXRpb25hbCgpOworICAgIGZvciAoYXV0byYgcnVu
IDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShydW5zKSkgeworICAgICAgICBpZiAocnVuLmlzSW5s
aW5lQm94U3RhcnQoKSB8fCBydW4uaXNJbmxpbmVCb3hFbmQoKSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICBpZiAocnVuLmlzTGluZUJyZWFrKCkpIHsKKyAgICAgICAgICAgIGhhbmdp
bmdDb250ZW50LnNldElzQ29uZGl0aW9uYWwoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICB9CisgICAgICAgIGlmICghcnVuLmhhc1RyYWlsaW5nV2hpdGVzcGFjZSgpKQorICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBwcmVzZXJ2ZWQgb3Ig
aHVuZyB3aGl0ZXNwYWNlLgorICAgICAgICBpZiAocnVuLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9
IFdoaXRlU3BhY2U6OlByZVdyYXApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gVGhp
cyBpcyBlaXRoZXIgYSBub3JtYWwgb3IgY29uZGl0aW9uYWxseSBoYW5naW5nIHRyYWlsaW5nIHdo
aXRlc3BhY2UuCisgICAgICAgIGhhbmdpbmdDb250ZW50LmV4cGFuZChydW4udHJhaWxpbmdXaGl0
ZXNwYWNlV2lkdGgoKSk7CisgICAgfQorICAgIHJldHVybiBoYW5naW5nQ29udGVudDsKK30KKwor
c3RhdGljIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGhvcml6b250YWxBbGlnbm1lbnRPZmZz
ZXQoY29uc3QgTGluZTo6UnVuTGlzdCYgcnVucywgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24sIElu
bGluZUxheW91dFVuaXQgbGluZUxvZ2ljYWxXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50
TG9naWNhbFdpZHRoLCBib29sIGlzTGFzdExpbmUpCit7CisgICAgYXV0byBhdmFpbGFibGVXaWR0
aCA9IGxpbmVMb2dpY2FsV2lkdGggLSBjb250ZW50TG9naWNhbFdpZHRoOworICAgIGF1dG8gaGFu
Z2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQgPSBjb2xsZWN0SGFuZ2luZ1RyYWlsaW5nV2hp
dGVzcGFjZUNvbnRlbnQocnVucywgaXNMYXN0TGluZSk7CisgICAgYXZhaWxhYmxlV2lkdGggKz0g
aGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQud2lkdGgoKTsKKyAgICBpZiAoYXZhaWxh
YmxlV2lkdGggPD0gMCkKKyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIGF1dG8gY29tcHV0ZWRI
b3Jpem9udGFsQWxpZ25tZW50ID0gWyZdIHsKKyAgICAgICAgaWYgKHRleHRBbGlnbiAhPSBUZXh0
QWxpZ25Nb2RlOjpKdXN0aWZ5KQorICAgICAgICAgICAgcmV0dXJuIHRleHRBbGlnbjsKKyAgICAg
ICAgLy8gVGV4dCBpcyBqdXN0aWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBtZXRob2Qgc3BlY2lmaWVk
IGJ5IHRoZSB0ZXh0LWp1c3RpZnkgcHJvcGVydHksCisgICAgICAgIC8vIGluIG9yZGVyIHRvIGV4
YWN0bHkgZmlsbCB0aGUgbGluZSBib3guIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRl
eHQtYWxpZ24tbGFzdCwKKyAgICAgICAgLy8gdGhlIGxhc3QgbGluZSBiZWZvcmUgYSBmb3JjZWQg
YnJlYWsgb3IgdGhlIGVuZCBvZiB0aGUgYmxvY2sgaXMgc3RhcnQtYWxpZ25lZC4KKyAgICAgICAg
aWYgKGlzTGFzdExpbmUgfHwgKCFydW5zLmlzRW1wdHkoKSAmJiBydW5zLmxhc3QoKS5pc0xpbmVC
cmVhaygpKSkKKyAgICAgICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpTdGFydDsKKyAgICAg
ICAgcmV0dXJuIFRleHRBbGlnbk1vZGU6Okp1c3RpZnk7CisgICAgfTsKKworICAgIHN3aXRjaCAo
Y29tcHV0ZWRIb3Jpem9udGFsQWxpZ25tZW50KCkpIHsKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6
OkxlZnQ6CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRMZWZ0OgorICAgIGNhc2UgVGV4
dEFsaWduTW9kZTo6U3RhcnQ6CisgICAgICAgIHJldHVybiB7IH07CisgICAgY2FzZSBUZXh0QWxp
Z25Nb2RlOjpSaWdodDoKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0OgorICAg
IGNhc2UgVGV4dEFsaWduTW9kZTo6RW5kOgorICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7
CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpDZW50ZXI6CisgICAgY2FzZSBUZXh0QWxpZ25Nb2Rl
OjpXZWJLaXRDZW50ZXI6CisgICAgICAgIHJldHVybiBhdmFpbGFibGVXaWR0aCAvIDI7CisgICAg
Y2FzZSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5OgorICAgICAgICAvLyBUZXh0QWxpZ25Nb2RlOjpK
dXN0aWZ5IGlzIGEgcnVuIGFsaWdubWVudCAoYW5kIHdlIG9ubHkgZG8gaW5saW5lIGJveCBhbGln
bm1lbnQgaGVyZSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICBkZWZhdWx0OgorICAgICAgICBB
U1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOworICAgICAgICByZXR1cm4geyB9OworICAgIH0K
KyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4geyB9OworfQorCitMaW5lQm94
QnVpbGRlcjo6TGluZUJveEJ1aWxkZXIoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlu
bGluZUZvcm1hdHRpbmdDb250ZXh0KQorICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChp
bmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworTGluZUJveCBMaW5lQm94QnVpbGRlcjo6
YnVpbGQoY29uc3QgTGluZUJ1aWxkZXI6OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCkKK3sKKyAg
ICBhdXRvJiBydW5zID0gbGluZUNvbnRlbnQucnVuczsKKyAgICBhdXRvIGxpbmVMb2dpY2FsV2lk
dGggPSBsaW5lQ29udGVudC5saW5lTG9naWNhbFdpZHRoOworICAgIGF1dG8gY29udGVudExvZ2lj
YWxXaWR0aCA9IGxpbmVDb250ZW50LmNvbnRlbnRMb2dpY2FsV2lkdGg7CisgICAgYXV0byBob3Jp
em9udGFsQWxpZ25tZW50T2Zmc2V0ID0gTGF5b3V0Ojpob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0
KHJ1bnMsIHJvb3RCb3goKS5zdHlsZSgpLnRleHRBbGlnbigpLCBsaW5lTG9naWNhbFdpZHRoLCBj
b250ZW50TG9naWNhbFdpZHRoLCBsaW5lQ29udGVudC5pc0xhc3RMaW5lV2l0aElubGluZUNvbnRl
bnQpOworICAgIGF1dG8gbGluZUJveCA9IExpbmVCb3ggeyByb290Qm94KCksIGxpbmVDb250ZW50
LmxvZ2ljYWxUb3BMZWZ0LCBsaW5lTG9naWNhbFdpZHRoLCBob3Jpem9udGFsQWxpZ25tZW50T2Zm
c2V0LnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCB7IH0pLCBjb250ZW50TG9naWNhbFdpZHRoLCBs
aW5lQ29udGVudC5ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQgfTsKKyAgICBjb25zdHJ1
Y3RBbmRBbGlnbklubGluZUxldmVsQm94ZXMobGluZUJveCwgcnVucyk7CisgICAgcmV0dXJuIGxp
bmVCb3g7Cit9CisKK3ZvaWQgTGluZUJveEJ1aWxkZXI6OnNldFZlcnRpY2FsR2VvbWV0cnlGb3JJ
bmxpbmVCb3goTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94KSBjb25zdAor
eworICAgIEFTU0VSVChpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpIHx8IGlubGluZUxldmVs
Qm94LmlzTGluZUJyZWFrQm94KCkpOworICAgIGF1dG8mIGZvbnRNZXRyaWNzID0gaW5saW5lTGV2
ZWxCb3guc3R5bGUoKS5mb250TWV0cmljcygpOworICAgIElubGluZUxheW91dFVuaXQgYXNjZW50
ID0gZm9udE1ldHJpY3MuYXNjZW50KCk7CisgICAgSW5saW5lTGF5b3V0VW5pdCBkZXNjZW50ID0g
Zm9udE1ldHJpY3MuZGVzY2VudCgpOworICAgIGF1dG8gbG9naWNhbEhlaWdodCA9IGFzY2VudCAr
IGRlc2NlbnQ7CisgICAgLy8gV2UgbmVlZCBmbG9vci9jZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlv
dXQgaW50ZWdyYWwgcG9zaXRpb25pbmcuCisgICAgaW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUo
Zmxvb3JmKGFzY2VudCkpOworICAgIGlubGluZUxldmVsQm94LnNldERlc2NlbnQoY2VpbChkZXNj
ZW50KSk7CisgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0
KTsKKworICAgIC8vIEZJWE1FOiBBZGp1c3QgbGF5b3V0IGJvdW5kcyB3aXRoIGZhbGxiYWNrIGZv
bnQgd2hlbiBhcHBsaWNhYmxlLgorICAgIGF1dG8mIHN0eWxlID0gaW5saW5lTGV2ZWxCb3gubGF5
b3V0Qm94KCkuc3R5bGUoKTsKKyAgICBhdXRvIGxpbmVIZWlnaHQgPSBzdHlsZS5saW5lSGVpZ2h0
KCk7CisgICAgaWYgKGxpbmVIZWlnaHQuaXNOZWdhdGl2ZSgpKSB7CisgICAgICAgIC8vIElmIGxp
bmUtaGVpZ2h0IGNvbXB1dGVzIHRvIG5vcm1hbCBhbmQgZWl0aGVyIHRleHQtZWRnZSBpcyBsZWFk
aW5nIG9yIHRoaXMgaXMgdGhlIHJvb3QgaW5saW5lIGJveCwKKyAgICAgICAgLy8gdGhlIGZvbnTi
gJlzIGxpbmUgZ2FwIG1ldHJpYyBtYXkgYWxzbyBiZSBpbmNvcnBvcmF0ZWQgaW50byBBIGFuZCBE
IGJ5IGFkZGluZyBoYWxmIHRvIGVhY2ggc2lkZSBhcyBoYWxmLWxlYWRpbmcuCisgICAgICAgIC8v
IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2lubGluZS1oZWlnaHQKKyAgICAg
ICAgLy8gU2luY2UgdGV4dC1lZGdlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IGFuZCB0aGUgaW5pdGlh
bCB2YWx1ZSBpcyBsZWFkaW5nLCB3ZSBzaG91bGQganVzdCBhcHBseSBpdCB0bworICAgICAgICAv
LyBhbGwgaW5saW5lIGJveGVzLgorICAgICAgICBhdXRvIGhhbGZMaW5lR2FwID0gKGZvbnRNZXRy
aWNzLmxpbmVTcGFjaW5nKCkgLSBsb2dpY2FsSGVpZ2h0KSAvIDI7CisgICAgICAgIGFzY2VudCAr
PSBoYWxmTGluZUdhcDsKKyAgICAgICAgZGVzY2VudCArPSBoYWxmTGluZUdhcDsKKyAgICB9IGVs
c2UgeworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxpbmVIZWlnaHQgPSBzdHlsZS5jb21wdXRl
ZExpbmVIZWlnaHQoKTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBoYWxmTGVhZGluZyA9IChs
aW5lSGVpZ2h0IC0gKGFzY2VudCArIGRlc2NlbnQpKSAvIDI7CisgICAgICAgIGFzY2VudCArPSBo
YWxmTGVhZGluZzsKKyAgICAgICAgZGVzY2VudCArPSBoYWxmTGVhZGluZzsKKyAgICB9CisgICAg
Ly8gV2UgbmVlZCBmbG9vci9jZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlvdXQgaW50ZWdyYWwgcG9z
aXRpb25pbmcuCisgICAgaW5saW5lTGV2ZWxCb3guc2V0TGF5b3V0Qm91bmRzKExpbmVCb3g6Oklu
bGluZUxldmVsQm94OjpMYXlvdXRCb3VuZHMgeyBmbG9vcmYoYXNjZW50KSwgY2VpbChkZXNjZW50
KSB9KTsKK30KKwordm9pZCBMaW5lQm94QnVpbGRlcjo6Y29uc3RydWN0QW5kQWxpZ25JbmxpbmVM
ZXZlbEJveGVzKExpbmVCb3gmIGxpbmVCb3gsIGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnMpCit7
CisgICAgYXV0byYgcm9vdElubGluZUJveCA9IGxpbmVCb3gucm9vdElubGluZUJveCgpOworICAg
IHNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3gocm9vdElubGluZUJveCk7CisKKyAgICBh
dXRvIHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudCA9IFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdu
bWVudCB7IHJvb3RJbmxpbmVCb3ggfTsKKyAgICAvLyBGSVhNRTogQWRkIGZhc3QgcGF0aCBzdXBw
b3J0IGZvciBsaW5lLWhlaWdodCBjb250ZW50LgorICAgIHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdu
bWVudC5zZXRFbmFibGVkKGxheW91dFN0YXRlKCkuaW5TdGFuZGFyZHNNb2RlKCkgJiYgcm9vdEJv
eCgpLnN0eWxlKCkubGluZUhlaWdodCgpLmlzTmVnYXRpdmUoKSk7CisKKyAgICBhdXRvIHNpbXBs
aWZpZWRBbGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUgPSBbJl0oYXV0byYgaW5saW5lTGV2ZWxC
b3gsIE9wdGlvbmFsPGNvbnN0IEJveEdlb21ldHJ5PiBib3hHZW9tZXRyeSkgeworICAgICAgICBp
ZiAoIXNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5pc0VuYWJsZWQoKSkKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgaWYgKCFTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OmNhblVz
ZVNpbXBsaWZpZWRBbGlnbm1lbnQocm9vdElubGluZUJveCwgaW5saW5lTGV2ZWxCb3gsIGJveEdl
b21ldHJ5KSkgeworICAgICAgICAgICAgc2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50LnNldEVu
YWJsZWQoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNp
bXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5hbGlnbihpbmxpbmVMZXZlbEJveCk7CisgICAgfTsK
KworICAgIGF1dG8gY3JlYXRlV3JhcHBlZElubGluZUJveGVzID0gWyZdIHsKKyAgICAgICAgaWYg
KHJ1bnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBBbiBpbmxp
bmUgYm94IG1heSBub3QgbmVjZXNzYXJpbHkgc3RhcnQgb24gdGhlIGN1cnJlbnQgbGluZToKKyAg
ICAgICAgLy8gPHNwYW4gaWQ9b3V0ZXI+bGluZSBicmVhazxicj50aGlzIGNvbnRlbnQncyBwYXJl
bnQgaW5saW5lIGJveCgnb3V0ZXInKSA8c3BhbiBpZD1pbm5lcj5zdGFydHMgb24gdGhlIHByZXZp
b3VzIGxpbmU8L3NwYW4+PC9zcGFuPgorICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0
aGF0IHRoZXJlJ3MgYW4gTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggZm9yIGV2ZXJ5IGlubGluZSBi
b3ggdGhhdCdzIHByZXNlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgLy8gSW4gbmVz
dGluZyBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIExpbmVCb3g6OklubGluZUxldmVsQm94ZXMgZm9y
IHRoZSBpbmxpbmUgYm94IGFuY2VzdG9ycy4KKyAgICAgICAgLy8gV2Ugb25seSBoYXZlIHRvIGRv
IGl0IG9uIHRoZSBmaXJzdCBydW4gYXMgYW55IHN1YnNlcXVlbnQgaW5saW5lIGNvbnRlbnQgaXMg
ZWl0aGVyIGF0IHRoZSBzYW1lL2hpZ2hlciBuZXN0aW5nIGxldmVsIG9yCisgICAgICAgIC8vIG5l
c3RlZCB3aXRoIGEgW2lubGluZSBib3ggc3RhcnRdIHJ1bi4KKyAgICAgICAgYXV0byYgZmlyc3RS
dW4gPSBydW5zWzBdOworICAgICAgICBhdXRvJiBmaXJzdFJ1blBhcmVudExheW91dEJveCA9IGZp
cnN0UnVuLmxheW91dEJveCgpLnBhcmVudCgpOworICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGlz
IHRoZSBmb3JtYXR0aW5nIHJvb3QsIHdlIGNhbiBzdG9wIGhlcmUuIFRoaXMgaXMgcm9vdCBpbmxp
bmUgYm94IGNvbnRlbnQsIHRoZXJlJ3Mgbm8gbmVzdGluZyBpbmxpbmUgYm94IGZyb20gdGhlIHBy
ZXZpb3VzIGxpbmUocykKKyAgICAgICAgLy8gdW5sZXNzIHRoZSBpbmxpbmUgYm94IGNsb3Npbmcg
aXMgZm9yY2VkIG92ZXIgdG8gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgLy8gZS5nLgorICAg
ICAgICAvLyA8c3Bhbj5ub3JtYWxseSB0aGUgaW5saW5lIGJveCBjbG9zaW5nIGZvcm1zIGEgY29u
dGludW91cyBjb250ZW50PC9zcGFuPgorICAgICAgICAvLyA8c3Bhbj51bmxlc3MgaXQncyBmb3Jj
ZWQgdG8gdGhlIG5leHQgbGluZTxicj48L3NwYW4+CisgICAgICAgIGF1dG8gZmlyc3RSdW5OZWVk
c0lubGluZUJveCA9IGZpcnN0UnVuLmlzSW5saW5lQm94RW5kKCk7CisgICAgICAgIGlmICghZmly
c3RSdW5OZWVkc0lubGluZUJveCAmJiBpc1Jvb3RMYXlvdXRCb3goZmlyc3RSdW5QYXJlbnRMYXlv
dXRCb3gpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBWZWN0b3I8Y29uc3QgQm94Kj4g
bGF5b3V0Qm94ZXNXaXRob3V0SW5saW5lQm94ZXM7CisgICAgICAgIGlmIChmaXJzdFJ1bk5lZWRz
SW5saW5lQm94KQorICAgICAgICAgICAgbGF5b3V0Qm94ZXNXaXRob3V0SW5saW5lQm94ZXMuYXBw
ZW5kKCZmaXJzdFJ1bi5sYXlvdXRCb3goKSk7CisgICAgICAgIGF1dG8qIGFuY2VzdG9yID0gJmZp
cnN0UnVuUGFyZW50TGF5b3V0Qm94OworICAgICAgICB3aGlsZSAoIWlzUm9vdExheW91dEJveCgq
YW5jZXN0b3IpKSB7CisgICAgICAgICAgICBsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVCb3hlcy5h
cHBlbmQoYW5jZXN0b3IpOworICAgICAgICAgICAgYW5jZXN0b3IgPSAmYW5jZXN0b3ItPnBhcmVu
dCgpOworICAgICAgICB9CisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgbWlzc2luZyBMaW5lQm94
OjpJbmxpbmVCb3hlcyBzdGFydGluZyB3aXRoIHRoZSB0b3Btb3N0IGxheW91dCBib3guCisgICAg
ICAgIGZvciAoYXV0byogbGF5b3V0Qm94IDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShsYXlvdXRC
b3hlc1dpdGhvdXRJbmxpbmVCb3hlcykpIHsKKyAgICAgICAgICAgIGF1dG8gaW5saW5lQm94ID0g
TGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUlubGluZUJveCgqbGF5b3V0Qm94LCByb290
SW5saW5lQm94LmxvZ2ljYWxMZWZ0KCksIGxpbmVCb3guY29udGVudExvZ2ljYWxXaWR0aCgpKTsK
KyAgICAgICAgICAgIHNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3goaW5saW5lQm94KTsK
KyAgICAgICAgICAgIHNpbXBsaWZpZWRBbGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUoaW5saW5l
Qm94LCB7IH0pOworICAgICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChXVEZNb3Zl
KGlubGluZUJveCkpOworICAgICAgICB9CisgICAgfTsKKyAgICBjcmVhdGVXcmFwcGVkSW5saW5l
Qm94ZXMoKTsKKworICAgIGF1dG8gbGluZUhhc0NvbnRlbnQgPSBmYWxzZTsKKyAgICBmb3IgKGF1
dG8mIHJ1biA6IHJ1bnMpIHsKKyAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gcnVuLmxheW91dEJv
eCgpOworICAgICAgICBhdXRvIHJ1bkhhc0NvbnRlbnQgPSBbJl0gKCkgLT4gYm9vbCB7CisgICAg
ICAgICAgICBBU1NFUlQoIWxpbmVIYXNDb250ZW50KTsKKyAgICAgICAgICAgIGlmIChydW4uaXNU
ZXh0KCkgfHwgcnVuLmlzQm94KCkgfHwgcnVuLmlzU29mdExpbmVCcmVhaygpIHx8IHJ1bi5pc0hh
cmRMaW5lQnJlYWsoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAg
IGF1dG8mIGlubGluZUJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZv
ckJveChsYXlvdXRCb3gpOworICAgICAgICAgICAgLy8gRXZlbiBuZWdhdGl2ZSBob3Jpem9udGFs
IG1hcmdpbiBtYWtlcyB0aGUgbGluZSAiY29udGVudGZ1bCIuCisgICAgICAgICAgICBpZiAocnVu
LmlzSW5saW5lQm94U3RhcnQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5saW5lQm94R2Vv
bWV0cnkubWFyZ2luU3RhcnQoKSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCkgfHwg
aW5saW5lQm94R2VvbWV0cnkucGFkZGluZ0xlZnQoKS52YWx1ZU9yKDBfbHUpOworICAgICAgICAg
ICAgaWYgKHJ1bi5pc0lubGluZUJveEVuZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmxp
bmVCb3hHZW9tZXRyeS5tYXJnaW5FbmQoKSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJSaWdo
dCgpIHx8IGlubGluZUJveEdlb21ldHJ5LnBhZGRpbmdSaWdodCgpLnZhbHVlT3IoMF9sdSk7Cisg
ICAgICAgICAgICBpZiAocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9OworICAgICAgICBsaW5lSGFzQ29udGVu
dCA9IGxpbmVIYXNDb250ZW50IHx8IHJ1bkhhc0NvbnRlbnQoKTsKKyAgICAgICAgYXV0byBsb2dp
Y2FsTGVmdCA9IHJvb3RJbmxpbmVCb3gubG9naWNhbExlZnQoKSArIHJ1bi5sb2dpY2FsTGVmdCgp
OworICAgICAgICBpZiAocnVuLmlzQm94KCkpIHsKKyAgICAgICAgICAgIGF1dG8mIGlubGluZUxl
dmVsQm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91
dEJveCk7CisgICAgICAgICAgICBhdXRvIG1hcmdpbkJveEhlaWdodCA9IGlubGluZUxldmVsQm94
R2VvbWV0cnkubWFyZ2luQm94SGVpZ2h0KCk7CisgICAgICAgICAgICBhdXRvIGFzY2VudCA9IElu
bGluZUxheW91dFVuaXQgeyB9OworICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlKCkuc2hvdWxk
Tm90U3ludGhlc2l6ZUlubGluZUJsb2NrQmFzZWxpbmUoKSkgeworICAgICAgICAgICAgICAgIC8v
IEludGVncmF0aW9uIGNvZGVwYXRoIGNvbnN0cnVjdHMgcmVwbGFjZWQgYm94ZXMgZm9yIGlubGlu
ZS1ibG9jayBjb250ZW50LgorICAgICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3guaXNSZXBs
YWNlZEJveCgpKTsKKyAgICAgICAgICAgICAgICBhc2NlbnQgPSAqZG93bmNhc3Q8UmVwbGFjZWRC
b3g+KGxheW91dEJveCkuYmFzZWxpbmUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0
Qm94LmlzSW5saW5lQmxvY2tCb3goKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlbGlu
ZSBvZiBhbiAnaW5saW5lLWJsb2NrJyBpcyB0aGUgYmFzZWxpbmUgb2YgaXRzIGxhc3QgbGluZSBi
b3ggaW4gdGhlIG5vcm1hbCBmbG93LCB1bmxlc3MgaXQgaGFzIGVpdGhlciBubyBpbi1mbG93IGxp
bmUgYm94ZXMgb3IKKyAgICAgICAgICAgICAgICAvLyBpZiBpdHMgJ292ZXJmbG93JyBwcm9wZXJ0
eSBoYXMgYSBjb21wdXRlZCB2YWx1ZSBvdGhlciB0aGFuICd2aXNpYmxlJywgaW4gd2hpY2ggY2Fz
ZSB0aGUgYmFzZWxpbmUgaXMgdGhlIGJvdHRvbSBtYXJnaW4gZWRnZS4KKyAgICAgICAgICAgICAg
ICBhdXRvIHN5bnRoZXNpemVCYXNlbGluZSA9ICFsYXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCgpIHx8ICFsYXlvdXRCb3guc3R5bGUoKS5pc092ZXJmbG93VmlzaWJs
ZSgpOworICAgICAgICAgICAgICAgIGlmIChzeW50aGVzaXplQmFzZWxpbmUpCisgICAgICAgICAg
ICAgICAgICAgIGFzY2VudCA9IG1hcmdpbkJveEhlaWdodDsKKyAgICAgICAgICAgICAgICBlbHNl
IHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3Rh
dGUoKS5lc3RhYmxpc2hlZElubGluZUZvcm1hdHRpbmdTdGF0ZShkb3duY2FzdDxDb250YWluZXJC
b3g+KGxheW91dEJveCkpOworICAgICAgICAgICAgICAgICAgICBhdXRvJiBsYXN0TGluZSA9IGZv
cm1hdHRpbmdTdGF0ZS5saW5lcygpLmxhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBp
bmxpbmVCbG9ja0Jhc2VsaW5lID0gbGFzdExpbmUubGluZUJveExvZ2ljYWxSZWN0KCkudG9wKCkg
KyBsYXN0TGluZS5iYXNlbGluZSgpOworICAgICAgICAgICAgICAgICAgICBhc2NlbnQgPSBpbmxp
bmVMZXZlbEJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpICsgaW5saW5lTGV2ZWxCb3hHZW9tZXRy
eS5ib3JkZXJUb3AoKSArIGlubGluZUxldmVsQm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVl
T3IoMCkgKyBpbmxpbmVCbG9ja0Jhc2VsaW5lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKKyAgICAgICAgICAgICAg
ICBhc2NlbnQgPSBkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KS5iYXNlbGluZSgpLnZh
bHVlT3IobWFyZ2luQm94SGVpZ2h0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICBhc2NlbnQgPSBtYXJnaW5Cb3hIZWlnaHQ7CisgICAgICAgICAgICBsb2dpY2FsTGVmdCArPSBz
dGQ6Om1heCgwX2x1LCBpbmxpbmVMZXZlbEJveEdlb21ldHJ5Lm1hcmdpblN0YXJ0KCkpOworICAg
ICAgICAgICAgYXV0byBhdG9taWNJbmxpbmVMZXZlbEJveCA9IExpbmVCb3g6OklubGluZUxldmVs
Qm94OjpjcmVhdGVBdG9taWNJbmxpbmVMZXZlbEJveChsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCB7
IGlubGluZUxldmVsQm94R2VvbWV0cnkuYm9yZGVyQm94V2lkdGgoKSwgbWFyZ2luQm94SGVpZ2h0
IH0pOworICAgICAgICAgICAgYXRvbWljSW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUoYXNjZW50
KTsKKyAgICAgICAgICAgIGF0b21pY0lubGluZUxldmVsQm94LnNldExheW91dEJvdW5kcyhMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveDo6TGF5b3V0Qm91bmRzIHsgYXNjZW50LCBtYXJnaW5Cb3hIZWln
aHQgLSBhc2NlbnQgfSk7CisgICAgICAgICAgICBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNhbGx5SWZB
cHBsaWNhYmxlKGF0b21pY0lubGluZUxldmVsQm94LCBpbmxpbmVMZXZlbEJveEdlb21ldHJ5KTsK
KyAgICAgICAgICAgIGxpbmVCb3guYWRkSW5saW5lTGV2ZWxCb3goV1RGTW92ZShhdG9taWNJbmxp
bmVMZXZlbEJveCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAg
aWYgKHJ1bi5pc0lubGluZUJveFN0YXJ0KCkpIHsKKyAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9p
bnQgd2UgZG9uJ3Qga25vdyB5ZXQgaG93IHdpZGUgdGhpcyBpbmxpbmUgYm94IGlzLiBMZXQncyBh
c3N1bWUgaXQncyBhcyBsb25nIGFzIHRoZSBsaW5lIGlzCisgICAgICAgICAgICAvLyBhbmQgYWRq
dXN0IGl0IGxhdGVyIGlmIHdlIGNvbWUgYWNyb3NzIGFuIGlubGluZUJveEVuZCBydW4gKHNlZSBi
ZWxvdykuCisgICAgICAgICAgICBhdXRvIGluaXRpYWxMb2dpY2FsV2lkdGggPSBsaW5lQm94LmNv
bnRlbnRMb2dpY2FsV2lkdGgoKSAtIHJ1bi5sb2dpY2FsTGVmdCgpOworICAgICAgICAgICAgQVNT
RVJUKGluaXRpYWxMb2dpY2FsV2lkdGggPj0gMCk7CisgICAgICAgICAgICAvLyBJbmxpbmUgYm94
IHJ1biBpcyBiYXNlZCBvbiBtYXJnaW4gYm94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBi
b3guCisgICAgICAgICAgICBhdXRvIG1hcmdpblN0YXJ0ID0gc3RkOjptYXgoMF9sdSwgZm9ybWF0
dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpLm1hcmdpblN0YXJ0KCkpOwor
ICAgICAgICAgICAgbG9naWNhbExlZnQgKz0gbWFyZ2luU3RhcnQ7CisgICAgICAgICAgICBpbml0
aWFsTG9naWNhbFdpZHRoIC09IG1hcmdpblN0YXJ0OworICAgICAgICAgICAgYXV0byBpbmxpbmVC
b3ggPSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlSW5saW5lQm94KGxheW91dEJveCwg
bG9naWNhbExlZnQsIGluaXRpYWxMb2dpY2FsV2lkdGgpOworICAgICAgICAgICAgc2V0VmVydGlj
YWxHZW9tZXRyeUZvcklubGluZUJveChpbmxpbmVCb3gpOworICAgICAgICAgICAgc2ltcGxpZmll
ZEFsaWduVmVydGljYWxseUlmQXBwbGljYWJsZShpbmxpbmVCb3gsIHsgfSk7CisgICAgICAgICAg
ICBsaW5lQm94LmFkZElubGluZUxldmVsQm94KFdURk1vdmUoaW5saW5lQm94KSk7CisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94RW5k
KCkpIHsKKyAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgbG9naWNhbCB3aWR0aCB3aGVuIHRoZSBp
bmxpbmUgYm94IGNsb3NlcyBvbiB0aGlzIGxpbmUuCisgICAgICAgICAgICBhdXRvJiBpbmxpbmVC
b3ggPSBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7CisgICAg
ICAgICAgICBBU1NFUlQoaW5saW5lQm94LmlzSW5saW5lQm94KCkpOworICAgICAgICAgICAgLy8g
SW5saW5lIGJveCBydW4gaXMgYmFzZWQgb24gbWFyZ2luIGJveC4gTGV0J3MgY29udmVydCBpdCB0
byBib3JkZXIgYm94LgorICAgICAgICAgICAgYXV0byBtYXJnaW5FbmQgPSBzdGQ6Om1heCgwX2x1
LCBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCkubWFyZ2luRW5k
KCkpOworICAgICAgICAgICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmlnaHQgPSBsb2dpY2FsTGVm
dCArIHJ1bi5sb2dpY2FsV2lkdGgoKSAtIG1hcmdpbkVuZDsKKyAgICAgICAgICAgIGlubGluZUJv
eC5zZXRMb2dpY2FsV2lkdGgoaW5saW5lQm94TG9naWNhbFJpZ2h0IC0gaW5saW5lQm94LmxvZ2lj
YWxMZWZ0KCkpOworICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGlj
YWJsZShpbmxpbmVCb3gsIHsgfSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQor
ICAgICAgICBpZiAocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc1NvZnRMaW5lQnJlYWsoKSkgeworICAg
ICAgICAgICAgLy8gRklYTUU6IEFkanVzdCBub24tZW1wdHkgaW5saW5lIGJveCBoZWlnaHQgd2hl
biBnbHlwaHMgZnJvbSB0aGUgbm9uLXByaW1hcnkgZm9udCBzdHJldGNoIHRoZSBib3guCisgICAg
ICAgICAgICBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJl
bnQoKSkuc2V0SGFzQ29udGVudCgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0K
KyAgICAgICAgaWYgKHJ1bi5pc0hhcmRMaW5lQnJlYWsoKSkgeworICAgICAgICAgICAgYXV0byBs
aW5lQnJlYWtCb3ggPSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlTGluZUJyZWFrQm94
KGxheW91dEJveCwgbG9naWNhbExlZnQpOworICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRy
eUZvcklubGluZUJveChsaW5lQnJlYWtCb3gpOworICAgICAgICAgICAgc2ltcGxpZmllZEFsaWdu
VmVydGljYWxseUlmQXBwbGljYWJsZShsaW5lQnJlYWtCb3gsIHsgfSk7CisgICAgICAgICAgICBs
aW5lQm94LmFkZElubGluZUxldmVsQm94KFdURk1vdmUobGluZUJyZWFrQm94KSk7CisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVuLmlzV29yZEJyZWFrT3Bw
b3J0dW5pdHkoKSkgeworICAgICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlR2VuZXJpY0lubGluZUxldmVsQm94KGxheW91dEJv
eCwgbG9naWNhbExlZnQpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIGxpbmVCb3guc2V0SGFzQ29u
dGVudChsaW5lSGFzQ29udGVudCk7CisgICAgaWYgKHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVu
dC5pc0VuYWJsZWQoKSB8fCAhbGluZUhhc0NvbnRlbnQpIHsKKyAgICAgICAgLy8gV2Ugc2hvdWxk
IGFsd2F5cyBiZSBhYmxlIHRvIGV4ZXJjaXNlIHRoZSBmYXN0IHBhdGggd2hlbiB0aGUgbGluZSBo
YXMgbm8gY29udGVudCBhdCBhbGwsIGV2ZW4gaW4gbm9uLXN0YW5kYXJkcyBtb2RlIG9yIHdpdGgg
bGluZS1oZWlnaHQgc2V0LgorICAgICAgICByb290SW5saW5lQm94LnNldExvZ2ljYWxUb3AobGlu
ZUhhc0NvbnRlbnQgPyBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQucm9vdElubGluZUJveExv
Z2ljYWxUb3AoKSA6IC1yb290SW5saW5lQm94LmJhc2VsaW5lKCkpOworICAgICAgICBsaW5lQm94
LnNldExvZ2ljYWxIZWlnaHQobGluZUhhc0NvbnRlbnQgPyBzaW1wbGlmaWVkVmVydGljYWxBbGln
bm1lbnQubGluZUJveEhlaWdodCgpIDogSW5saW5lTGF5b3V0VW5pdCgpKTsKKyAgICB9IGVsc2UK
KyAgICAgICAgY29tcHV0ZUxpbmVCb3hIZWlnaHRBbmRBbGlnbklubGluZUxldmVsQm94ZXNWZXJ0
aWNhbGx5KGxpbmVCb3gpOworfQorCit2b2lkIExpbmVCb3hCdWlsZGVyOjpjb21wdXRlTGluZUJv
eEhlaWdodEFuZEFsaWduSW5saW5lTGV2ZWxCb3hlc1ZlcnRpY2FsbHkoTGluZUJveCYgbGluZUJv
eCkKK3sKKyAgICBBU1NFUlQobGluZUJveC5oYXNDb250ZW50KCkpOworICAgIC8vIFRoaXMgZnVu
Y3Rpb24gKHBhcnRpYWxseSkgaW1wbGVtZW50czoKKyAgICAvLyAyLjIuIExheW91dCBXaXRoaW4g
TGluZSBCb3hlcworICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xp
bmUtbGF5b3V0CisgICAgLy8gMS4gQ29tcHV0ZSB0aGUgbGluZSBib3ggaGVpZ2h0IHVzaW5nIHRo
ZSBsYXlvdXQgYm91bmRzIGdlb21ldHJ5LiBUaGlzIGhlaWdodCBjb21wdXRhdGlvbiBzdHJpY3Rs
eSB1c2VzIGxheW91dCBib3VuZHMgYW5kIG5vdCBub3JtYWwgaW5saW5lIGxldmVsIGJveCBnZW9t
ZXRyaWVzLgorICAgIC8vIDIuIENvbXB1dGUgdGhlIGJhc2VsaW5lL2xvZ2ljYWwgdG9wIHBvc2l0
aW9uIG9mIHRoZSByb290IGlubGluZSBib3guIEFsaWduZWQgYm94ZXMgcHVzaCB0aGUgcm9vdCBp
bmxpbmUgYm94IGFyb3VuZCBpbnNpZGUgdGhlIGxpbmUgYm94LgorICAgIC8vIDMuIEZpbmFsbHkg
YWxpZ24gdGhlIGlubGluZSBsZXZlbCBib3hlcyB1c2luZyAobW9zdGx5KSBub3JtYWwgaW5saW5l
IGxldmVsIGJveCBnZW9tZXRyaWVzLgorICAgIGF1dG8gcXVpcmtzID0gZm9ybWF0dGluZ0NvbnRl
eHQoKS5xdWlya3MoKTsKKyAgICBhdXRvJiByb290SW5saW5lQm94ID0gbGluZUJveC5yb290SW5s
aW5lQm94KCk7CisKKyAgICBhdXRvIGNvbXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCA9IFsmXSB7
CisgICAgICAgIC8vIExpbmUgYm94IGhlaWdodCBjb21wdXRhdGlvbiBpcyBiYXNlZCBvbiB0aGUg
bGF5b3V0IGJvdW5kcyBvZiB0aGUgaW5saW5lIGJveGVzIGFuZCBub3QgdGhlaXIgbG9naWNhbCAo
YXNjZW50L2Rlc2NlbnQpIGRpbWVuc2lvbnMuCisgICAgICAgIHN0cnVjdCBBYnNvbHV0ZVRvcEFu
ZEJvdHRvbSB7CisgICAgICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHRvcCB7IDAgfTsKKyAgICAg
ICAgICAgIElubGluZUxheW91dFVuaXQgYm90dG9tIHsgMCB9OworICAgICAgICB9OworICAgICAg
ICBIYXNoTWFwPGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94KiwgQWJzb2x1dGVUb3BBbmRC
b3R0b20+IGlubGluZUxldmVsQm94QWJzb2x1dGVUb3BBbmRCb3R0b21NYXA7CisKKyAgICAgICAg
YXV0byBtaW5pbXVtTG9naWNhbFRvcCA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsK
KyAgICAgICAgYXV0byBtYXhpbXVtTG9naWNhbEJvdHRvbSA9IE9wdGlvbmFsPElubGluZUxheW91
dFVuaXQ+IHsgfTsKKyAgICAgICAgaWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5l
Qm94KHJvb3RJbmxpbmVCb3gsIGxpbmVCb3gpKSB7CisgICAgICAgICAgICBtaW5pbXVtTG9naWNh
bFRvcCA9IElubGluZUxheW91dFVuaXQgeyB9OworICAgICAgICAgICAgbWF4aW11bUxvZ2ljYWxC
b3R0b20gPSByb290SW5saW5lQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpOworICAgICAgICAg
ICAgaW5saW5lTGV2ZWxCb3hBYnNvbHV0ZVRvcEFuZEJvdHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVC
b3gsIEFic29sdXRlVG9wQW5kQm90dG9tIHsgKm1pbmltdW1Mb2dpY2FsVG9wLCAqbWF4aW11bUxv
Z2ljYWxCb3R0b20gfSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgaW5saW5lTGV2ZWxC
b3hBYnNvbHV0ZVRvcEFuZEJvdHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVCb3gsIEFic29sdXRlVG9w
QW5kQm90dG9tIHsgfSk7CisKKyAgICAgICAgVmVjdG9yPExpbmVCb3g6OklubGluZUxldmVsQm94
Kj4gbGluZUJveFJlbGF0aXZlSW5saW5lTGV2ZWxCb3hlczsKKyAgICAgICAgZm9yIChhdXRvJiBp
bmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgeworICAg
ICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7Cisg
ICAgICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3guaGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50
KCkpIHsKKyAgICAgICAgICAgICAgICBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveGVzLmFw
cGVuZCgmaW5saW5lTGV2ZWxCb3gpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgYXV0byYgcGFyZW50SW5saW5lQm94ID0gbGluZUJveC5pbmxp
bmVMZXZlbEJveEZvckxheW91dEJveChsYXlvdXRCb3gucGFyZW50KCkpOworICAgICAgICAgICAg
Ly8gTG9naWNhbCB0b3AgaXMgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBpbmxpbmUgYm94J3MgbGF5
b3V0IGJvdW5kcy4KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGxvZ2ljYWwgdG9wIGlz
IG5vdCB0aGUgZmluYWwgbG9naWNhbCB0b3Agb2YgdGhlIGlubGluZSBsZXZlbCBib3guCisgICAg
ICAgICAgICAvLyBUaGlzIGlzIHRoZSBsb2dpY2FsIHRvcCBpbiB0aGUgY29udGV4dCBvZiB0aGUg
bGF5b3V0IGJvdW5kcyBnZW9tZXRyeSB3aGljaCBtYXkgYmUgdmVyeSBkaWZmZXJlbnQgZnJvbSB0
aGUgaW5saW5lIGJveCdzIG5vcm1hbCBnZW9tZXRyeS4KKyAgICAgICAgICAgIGF1dG8gbG9naWNh
bFRvcCA9IElubGluZUxheW91dFVuaXQgeyB9OworICAgICAgICAgICAgc3dpdGNoIChpbmxpbmVM
ZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKKyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGln
bjo6QmFzZWxpbmU6IHsKKyAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9t
UGFyZW50QmFzZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Cisg
ICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMo
KS5hc2NlbnQgLSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFs
aWduOjpNaWRkbGU6IHsKKyAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9t
UGFyZW50QmFzZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSAv
IDIgKyBwYXJlbnRJbmxpbmVCb3guc3R5bGUoKS5mb250TWV0cmljcygpLnhIZWlnaHQoKSAvIDI7
CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3Vu
ZHMoKS5hc2NlbnQgLSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBWZXJ0aWNh
bEFsaWduOjpCYXNlbGluZU1pZGRsZTogeworICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRv
cE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygp
LmhlaWdodCgpIC8gMjsKKyAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5l
Qm94LmxheW91dEJvdW5kcygpLmFzY2VudCAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFz
ZWxpbmU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBjYXNlIFZlcnRpY2FsQWxpZ246Okxlbmd0aDogeworICAgICAgICAgICAgICAgIGF1dG8mIHN0
eWxlID0gaW5saW5lTGV2ZWxCb3guc3R5bGUoKTsKKyAgICAgICAgICAgICAgICBhdXRvIGxvZ2lj
YWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBmbG9hdFZhbHVlRm9yTGVuZ3RoKHN0eWxl
LnZlcnRpY2FsQWxpZ25MZW5ndGgoKSwgc3R5bGUuY29tcHV0ZWRMaW5lSGVpZ2h0KCkpICsgaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OworICAgICAgICAgICAgICAgIGxvZ2lj
YWxUb3AgPSBwYXJlbnRJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbG9naWNhbFRv
cE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VGV4dFRvcDogeworICAg
ICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0ZXh0LXRvcCBhbGlnbnMgd2l0aCB0aGUgaW5saW5l
IGJveCdzIGZvbnQgbWV0cmljcyB0b3AgKGFzY2VudCkgYW5kIG5vdCB0aGUgbGF5b3V0IGJvdW5k
cyB0b3AuCisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlv
dXRCb3VuZHMoKS5hc2NlbnQgLSBwYXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVmVydGljYWxB
bGlnbjo6VGV4dEJvdHRvbTogeworICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0ZXh0LWJv
dHRvbSBhbGlnbnMgd2l0aCB0aGUgaW5saW5lIGJveCdzIGZvbnQgbWV0cmljcyBib3R0b20gKGRl
c2NlbnQpIGFuZCBub3QgdGhlIGxheW91dCBib3VuZHMgYm90dG9tLgorICAgICAgICAgICAgICAg
IGF1dG8gcGFyZW50SW5saW5lQm94TGF5b3V0Qm91bmRzID0gcGFyZW50SW5saW5lQm94LmxheW91
dEJvdW5kcygpOworICAgICAgICAgICAgICAgIGF1dG8gcGFyZW50SW5saW5lQm94TG9naWNhbEJv
dHRvbSA9IHBhcmVudElubGluZUJveExheW91dEJvdW5kcy5oZWlnaHQoKSAtIHBhcmVudElubGlu
ZUJveExheW91dEJvdW5kcy5kZXNjZW50ICsgcGFyZW50SW5saW5lQm94LmRlc2NlbnQoKS52YWx1
ZU9yKElubGluZUxheW91dFVuaXQoKSk7CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBh
cmVudElubGluZUJveExvZ2ljYWxCb3R0b20gLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMo
KS5oZWlnaHQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9Z
RVQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGF1dG8gcGFyZW50SW5saW5lQm94QWJzb2x1dGVUb3BBbmRCb3R0b20gPSBpbmxpbmVMZXZlbEJv
eEFic29sdXRlVG9wQW5kQm90dG9tTWFwLmdldCgmcGFyZW50SW5saW5lQm94KTsKKyAgICAgICAg
ICAgIGF1dG8gYWJzb2x1dGVMb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94QWJzb2x1dGVUb3BB
bmRCb3R0b20udG9wICsgbG9naWNhbFRvcDsKKyAgICAgICAgICAgIGF1dG8gYWJzb2x1dGVMb2dp
Y2FsQm90dG9tID0gYWJzb2x1dGVMb2dpY2FsVG9wICsgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91
bmRzKCkuaGVpZ2h0KCk7CisgICAgICAgICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9wQW5k
Qm90dG9tTWFwLmFkZCgmaW5saW5lTGV2ZWxCb3gsIEFic29sdXRlVG9wQW5kQm90dG9tIHsgYWJz
b2x1dGVMb2dpY2FsVG9wLCBhYnNvbHV0ZUxvZ2ljYWxCb3R0b20gfSk7CisgICAgICAgICAgICAv
LyBTdHJldGNoIHRoZSBtaW4vbWF4IGFic29sdXRlIHZhbHVlcyBpZiBhcHBsaWNhYmxlLgorICAg
ICAgICAgICAgaWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGlubGluZUxl
dmVsQm94LCBsaW5lQm94KSkgeworICAgICAgICAgICAgICAgIG1pbmltdW1Mb2dpY2FsVG9wID0g
c3RkOjptaW4obWluaW11bUxvZ2ljYWxUb3AudmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxUb3ApLCBh
YnNvbHV0ZUxvZ2ljYWxUb3ApOworICAgICAgICAgICAgICAgIG1heGltdW1Mb2dpY2FsQm90dG9t
ID0gc3RkOjptYXgobWF4aW11bUxvZ2ljYWxCb3R0b20udmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxC
b3R0b20pLCBhYnNvbHV0ZUxvZ2ljYWxCb3R0b20pOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIC8vIFRoZSBsaW5lIGJveCBoZWlnaHQgY29tcHV0YXRpb24gaXMgYXMgZm9sbG93
czoKKyAgICAgICAgLy8gMS4gU3RyZXRjaCB0aGUgbGluZSBib3ggd2l0aCB0aGUgbm9uLWxpbmUt
Ym94IHJlbGF0aXZlIGFsaWduZWQgaW5saW5lIGJveCBhYnNvbHV0ZSB0b3AgYW5kIGJvdHRvbSB2
YWx1ZXMuCisgICAgICAgIC8vIDIuIENoZWNrIGlmIHRoZSBsaW5lIGJveCByZWxhdGl2ZSBhbGln
bmVkIGlubGluZSBib3hlcyAodG9wLCBib3R0b20gZXRjKSBoYXZlIGVub3VnaCByb29tIGFuZCBz
dHJldGNoIHRoZSBsaW5lIGJveCBmdXJ0aGVyIGlmIG5lZWRlZC4KKyAgICAgICAgYXV0byBsaW5l
Qm94TG9naWNhbEhlaWdodCA9IG1heGltdW1Mb2dpY2FsQm90dG9tLnZhbHVlT3IoSW5saW5lTGF5
b3V0VW5pdCgpKSAtIG1pbmltdW1Mb2dpY2FsVG9wLnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCgp
KTsKKyAgICAgICAgZm9yIChhdXRvKiBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveCA6IGxp
bmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94ZXMpIHsKKyAgICAgICAgICAgIGlmICghcXVpcmtz
LmlubGluZUxldmVsQm94QWZmZWN0c0xpbmVCb3goKmxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVs
Qm94LCBsaW5lQm94KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGxp
bmVCb3hMb2dpY2FsSGVpZ2h0ID0gc3RkOjptYXgobGluZUJveExvZ2ljYWxIZWlnaHQsIGxpbmVC
b3hSZWxhdGl2ZUlubGluZUxldmVsQm94LT5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSk7CisgICAg
ICAgIH0KKyAgICAgICAgbGluZUJveC5zZXRMb2dpY2FsSGVpZ2h0KGxpbmVCb3hMb2dpY2FsSGVp
Z2h0KTsKKyAgICB9OworICAgIGNvbXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCgpOworCisgICAg
YXV0byBjb21wdXRlUm9vdElubGluZUJveFZlcnRpY2FsUG9zaXRpb24gPSBbJl0geworICAgICAg
ICBIYXNoTWFwPGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94KiwgSW5saW5lTGF5b3V0VW5p
dD4gaW5saW5lTGV2ZWxCb3hBYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0TWFwOworICAgICAgICBpbmxp
bmVMZXZlbEJveEFic29sdXRlQmFzZWxpbmVPZmZzZXRNYXAuYWRkKCZyb290SW5saW5lQm94LCBJ
bmxpbmVMYXlvdXRVbml0IHsgfSk7CisKKyAgICAgICAgYXV0byBtYXhpbXVtVG9wT2Zmc2V0RnJv
bVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsK
KyAgICAgICAgaWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KHJvb3RJbmxp
bmVCb3gsIGxpbmVCb3gpKQorICAgICAgICAgICAgbWF4aW11bVRvcE9mZnNldEZyb21Sb290SW5s
aW5lQm94QmFzZWxpbmUgPSByb290SW5saW5lQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKKwor
ICAgICAgICBmb3IgKGF1dG8mIGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5l
TGV2ZWxCb3hlcygpKSB7CisgICAgICAgICAgICBhdXRvIGFic29sdXRlQmFzZWxpbmVPZmZzZXQg
PSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKKyAgICAgICAgICAgIGlmICghaW5saW5lTGV2ZWxCb3gu
aGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvJiBs
YXlvdXRCb3ggPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKKyAgICAgICAgICAgICAgICBh
dXRvJiBwYXJlbnRJbmxpbmVCb3ggPSBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94
KGxheW91dEJveC5wYXJlbnQoKSk7CisgICAgICAgICAgICAgICAgYXV0byBiYXNlbGluZU9mZnNl
dEZyb21QYXJlbnRCYXNlbGluZSA9IElubGluZUxheW91dFVuaXQgeyB9OworCisgICAgICAgICAg
ICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKKyAgICAgICAg
ICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lOgorICAgICAgICAgICAgICAgICAg
ICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHsgfTsKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6
IHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJh
c2VsaW5lID0gKGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpIC8gMiArIHBh
cmVudElubGluZUJveC5zdHlsZSgpLmZvbnRNZXRyaWNzKCkueEhlaWdodCgpIC8gMik7CisgICAg
ICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gbG9naWNh
bFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5k
cygpLmFzY2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmVNaWRkbGU6IHsK
KyAgICAgICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2Vs
aW5lID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCkgLyAyOworICAgICAg
ICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxU
b3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMo
KS5hc2NlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Okxlbmd0aDogeworICAgICAgICAg
ICAgICAgICAgICBhdXRvJiBzdHlsZSA9IGlubGluZUxldmVsQm94LnN0eWxlKCk7CisgICAgICAg
ICAgICAgICAgICAgIGF1dG8gdmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5n
dGgoc3R5bGUudmVydGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQo
KSk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRC
YXNlbGluZSA9IHZlcnRpY2FsQWxpZ25PZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgp
OworICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9
IGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5iYXNl
bGluZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpUZXh0VG9wOgorICAgICAgICAgICAg
ICAgICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHBhcmVudElubGluZUJv
eC5iYXNlbGluZSgpIC0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246OlRleHRCb3R0b206CisgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBh
cmVudEJhc2VsaW5lID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtICpw
YXJlbnRJbmxpbmVCb3guZGVzY2VudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lN
UExFTUVOVEVEX1lFVCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgYWJzb2x1dGVCYXNlbGluZU9mZnNldCA9IGlubGluZUxl
dmVsQm94QWJzb2x1dGVCYXNlbGluZU9mZnNldE1hcC5nZXQoJnBhcmVudElubGluZUJveCkgKyBi
YXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKKyAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsK
KyAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRvcDogeworICAgICAgICAgICAg
ICAgICAgICBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0ID0gcm9vdElubGluZUJveC5sYXlvdXRCb3Vu
ZHMoKS5hc2NlbnQgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBjYXNlIFZlcnRpY2FsQWxpZ246OkJvdHRvbTogeworICAgICAgICAgICAgICAgICAgICBhYnNv
bHV0ZUJhc2VsaW5lT2Zmc2V0ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2Vu
dCAtIHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudDsKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6
CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGlubGluZUxldmVsQm94QWJzb2x1dGVCYXNlbGluZU9mZnNldE1hcC5hZGQo
JmlubGluZUxldmVsQm94LCBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0KTsKKyAgICAgICAgICAgIGF1
dG8gYWZmZWN0c1Jvb3RJbmxpbmVCb3hWZXJ0aWNhbFBvc2l0aW9uID0gcXVpcmtzLmlubGluZUxl
dmVsQm94QWZmZWN0c0xpbmVCb3goaW5saW5lTGV2ZWxCb3gsIGxpbmVCb3gpOworICAgICAgICAg
ICAgaWYgKGFmZmVjdHNSb290SW5saW5lQm94VmVydGljYWxQb3NpdGlvbikgeworICAgICAgICAg
ICAgICAgIGF1dG8gdG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IGFic29sdXRl
QmFzZWxpbmVPZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Cisg
ICAgICAgICAgICAgICAgaWYgKG1heGltdW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2Vs
aW5lKQorICAgICAgICAgICAgICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVC
b3hCYXNlbGluZSA9IHN0ZDo6bWF4KCptYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hC
YXNlbGluZSwgdG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSk7CisgICAgICAgICAg
ICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpcyBxdWlyayBtb2Rl
IGFuZCB0aGUgcm9vdCBpbmxpbmUgYm94IGhhcyBubyBjb250ZW50LiBUaGUgcm9vdCBpbmxpbmUg
Ym94J3MgYmFzZWxpbmUgaXMgYW5jaG9yZWQgYXQgMC4KKyAgICAgICAgICAgICAgICAgICAgLy8g
SG93ZXZlciBuZWdhdGl2ZSBhc2NlbnQgKGUuZyBuZWdhdGl2ZSB0b3AgbWFyZ2luKSBjYW4gInB1
c2giIHRoZSByb290IGlubGluZSBib3ggdXB3YXJkcyBhbmQgaGF2ZSBhIG5lZ2F0aXZlIHZhbHVl
LgorICAgICAgICAgICAgICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hC
YXNlbGluZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudCA+PSAwCisgICAg
ICAgICAgICAgICAgICAgICAgICA/IHN0ZDo6bWF4KDAuMGYsIHRvcE9mZnNldEZyb21Sb290SW5s
aW5lQm94QmFzZWxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IHRvcE9mZnNldEZyb21S
b290SW5saW5lQm94QmFzZWxpbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgICAgIGF1dG8gcm9vdElubGluZUJveExvZ2ljYWxUb3AgPSBtYXhpbXVt
VG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZS52YWx1ZU9yKDAuZikgLSByb290SW5s
aW5lQm94LmJhc2VsaW5lKCk7CisgICAgICAgIHJvb3RJbmxpbmVCb3guc2V0TG9naWNhbFRvcChy
b290SW5saW5lQm94TG9naWNhbFRvcCk7CisgICAgfTsKKyAgICBjb21wdXRlUm9vdElubGluZUJv
eFZlcnRpY2FsUG9zaXRpb24oKTsKKworICAgIGF1dG8gYWxpZ25JbmxpbmVMZXZlbEJveGVzID0g
WyZdIHsKKyAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9v
dElubGluZUxldmVsQm94ZXMoKSkgeworICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7CisgICAgICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVC
b3ggPSBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQo
KSk7CisgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3AgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsK
KyAgICAgICAgICAgIHN3aXRjaCAoaW5saW5lTGV2ZWxCb3gudmVydGljYWxBbGlnbigpKSB7Cisg
ICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lOgorICAgICAgICAgICAgICAg
IGxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94
LmJhc2VsaW5lKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246Ok1pZGRsZTogeworICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9m
ZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IChpbmxpbmVMZXZlbEJveC5sb2dpY2FsSGVpZ2h0KCkg
LyAyICsgcGFyZW50SW5saW5lQm94LnN0eWxlKCkuZm9udE1ldHJpY3MoKS54SGVpZ2h0KCkgLyAy
KTsKKyAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmJhc2VsaW5l
KCkgLSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpC
YXNlbGluZU1pZGRsZTogeworICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZSA9IGlubGluZUxldmVsQm94LmxvZ2ljYWxIZWlnaHQoKSAvIDI7Cisg
ICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0g
bG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6TGVuZ3Ro
OiB7CisgICAgICAgICAgICAgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVMZXZlbEJveC5zdHlsZSgp
OworICAgICAgICAgICAgICAgIGF1dG8gdmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVG
b3JMZW5ndGgoc3R5bGUudmVydGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVI
ZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVu
dEJhc2VsaW5lID0gdmVydGljYWxBbGlnbk9mZnNldCArIGlubGluZUxldmVsQm94LmJhc2VsaW5l
KCk7CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGlu
ZSgpIC0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCAodGV4dCl0
b3AvYm90dG9tIGFsaWduIHRoZWlyIGxheW91dCBib3VuZHMuCisgICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246OlRleHRUb3A6CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGlu
ZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5l
KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246OlRleHRCb3R0b206CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGlu
ZUJveC5sb2dpY2FsSGVpZ2h0KCkgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5kZXNj
ZW50IC0gaW5saW5lTGV2ZWxCb3guYmFzZWxpbmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VG9wOgorICAgICAgICAgICAgICAgIC8v
IE5vdGUgdGhhdCB0aGlzIGxvZ2ljYWwgdG9wIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgcGFyZW50
IGlubGluZSBib3guCisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94
LmxheW91dEJvdW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJvdHRv
bToKKyAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBsb2dpY2FsIHRvcCBpcyBub3Qg
cmVsYXRpdmUgdG8gdGhlIHBhcmVudCBpbmxpbmUgYm94LgorICAgICAgICAgICAgICAgIGxvZ2lj
YWxUb3AgPSBsaW5lQm94LmxvZ2ljYWxIZWlnaHQoKSAtIGlubGluZUxldmVsQm94LmxheW91dEJv
dW5kcygpLmRlc2NlbnQgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBU1NFUlRf
Tk9UX0lNUExFTUVOVEVEX1lFVCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChsb2dpY2FsVG9w
KTsKKyAgICAgICAgfQorICAgIH07CisgICAgYWxpZ25JbmxpbmVMZXZlbEJveGVzKCk7Cit9CisK
K0xpbmVCb3hCdWlsZGVyOjpTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OlNpbXBsaWZpZWRW
ZXJ0aWNhbEFsaWdubWVudChjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgcm9vdElubGlu
ZUJveCkKKyAgICA6IG1fcm9vdElubGluZUJveChyb290SW5saW5lQm94KQoreworICAgIGFkanVz
dChyb290SW5saW5lQm94KTsKK30KKworYm9vbCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmllZFZl
cnRpY2FsQWxpZ25tZW50OjpjYW5Vc2VTaW1wbGlmaWVkQWxpZ25tZW50KGNvbnN0IExpbmVCb3g6
OklubGluZUxldmVsQm94JiByb290SW5saW5lQm94LCBjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveCYgaW5saW5lTGV2ZWxCb3gsIE9wdGlvbmFsPGNvbnN0IEJveEdlb21ldHJ5PiBpbmxpbmVM
ZXZlbEJveEdlb21ldHJ5KQoreworICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0F0b21pY0lubGlu
ZUxldmVsQm94KCkpIHsKKyAgICAgICAgQVNTRVJUKGlubGluZUxldmVsQm94R2VvbWV0cnkpOwor
ICAgICAgICAvLyBCYXNlbGluZSBhbGlnbmVkLCBub24tc3RyZXRjaHkgZGlyZWN0IGNoaWxkcmVu
IGFyZSBjb25zaWRlcmVkIHRvIGJlIHNpbXBsZSBmb3Igbm93LgorICAgICAgICBhdXRvJiBsYXlv
dXRCb3ggPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKKyAgICAgICAgcmV0dXJuICZsYXlv
dXRCb3gucGFyZW50KCkgPT0gJnJvb3RJbmxpbmVCb3gubGF5b3V0Qm94KCkKKyAgICAgICAgICAg
ICYmIGxheW91dEJveC5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKSA9PSBWZXJ0aWNhbEFsaWduOjpC
YXNlbGluZQorICAgICAgICAgICAgJiYgIWlubGluZUxldmVsQm94R2VvbWV0cnktPm1hcmdpbkJl
Zm9yZSgpCisgICAgICAgICAgICAmJiAhaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQWZ0
ZXIoKQorICAgICAgICAgICAgJiYgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQm94SGVp
Z2h0KCkgPD0gcm9vdElubGluZUJveC5iYXNlbGluZSgpOworICAgIH0KKyAgICBpZiAoaW5saW5l
TGV2ZWxCb3guaXNMaW5lQnJlYWtCb3goKSkgeworICAgICAgICAvLyBCYXNlbGluZSBhbGlnbmVk
LCBub24tc3RyZXRjaHkgbGluZSBicmVha3MgZS5nLiA8ZGl2PjxzcGFuPjxicj48L3NwYW4+PC9k
aXY+IGJ1dCBub3QgPGRpdj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMDBweDsiPjxicj48L3Nw
YW4+PC9kaXY+LgorICAgICAgICByZXR1cm4gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5
bGUoKS52ZXJ0aWNhbEFsaWduKCkgPT0gVmVydGljYWxBbGlnbjo6QmFzZWxpbmUgJiYgaW5saW5l
TGV2ZWxCb3guYmFzZWxpbmUoKSA8PSByb290SW5saW5lQm94LmJhc2VsaW5lKCk7CisgICAgfQor
ICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpKSB7CisgICAgICAgIC8vIEJhc2Vs
aW5lIGFsaWduZWQsIG5vbi1zdHJldGNoeSBpbmxpbmUgYm94ZXMgZS5nLiA8ZGl2PjxzcGFuPjwv
c3Bhbj48L2Rpdj4gYnV0IG5vdCA8ZGl2PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwMHB4OyI+
PC9zcGFuPjwvZGl2Pi4KKyAgICAgICAgcmV0dXJuIGlubGluZUxldmVsQm94LmxheW91dEJveCgp
LnN0eWxlKCkudmVydGljYWxBbGlnbigpID09IFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lICYmIGlu
bGluZUxldmVsQm94LmxheW91dEJvdW5kcygpID09IHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRz
KCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBMaW5lQm94QnVpbGRlcjo6
U2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50OjphbGlnbihMaW5lQm94OjpJbmxpbmVMZXZlbEJv
eCYgaW5saW5lTGV2ZWxCb3gpCit7CisgICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5s
aW5lTGV2ZWxCb3goKSB8fCBpbmxpbmVMZXZlbEJveC5pc0xpbmVCcmVha0JveCgpIHx8IGlubGlu
ZUxldmVsQm94LmlzSW5saW5lQm94KCkpIHsKKyAgICAgICAgLy8gT25seSBiYXNlbGluZSBhbGln
bm1lbnQgZm9yIG5vdy4KKyAgICAgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChtX3Jv
b3RJbmxpbmVCb3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCkpOworICAg
ICAgICBhZGp1c3QoaW5saW5lTGV2ZWxCb3gpOworICAgICAgICByZXR1cm47CisgICAgfQorICAg
IEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Cit9CisKK3ZvaWQgTGluZUJveEJ1aWxkZXI6
OlNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudDo6YWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGlu
ZUxldmVsQm94JiBpbmxpbmVMZXZlbEJveCkKK3sKKyAgICBhdXRvIGxheW91dEJvdW5kc0xvZ2lj
YWxUb3AgPSBtX3Jvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gaW5saW5lTGV2
ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OworICAgIG1fbGluZUJveExvZ2ljYWxUb3AgPSBz
dGQ6Om1pbihtX2xpbmVCb3hMb2dpY2FsVG9wLCBsYXlvdXRCb3VuZHNMb2dpY2FsVG9wKTsKKyAg
ICBtX2xpbmVCb3hMb2dpY2FsQm90dG9tID0gc3RkOjptYXgobV9saW5lQm94TG9naWNhbEJvdHRv
bSwgbGF5b3V0Qm91bmRzTG9naWNhbFRvcCArIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygp
LmhlaWdodCgpKTsKKyAgICBtX3Jvb3RJbmxpbmVCb3hMb2dpY2FsVG9wID0gc3RkOjptYXgobV9y
b290SW5saW5lQm94TG9naWNhbFRvcCwgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNj
ZW50IC0gbV9yb290SW5saW5lQm94LmJhc2VsaW5lKCkpOworfQorCitMaW5lQm94IElubGluZUZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6bGluZUJveEZvckxpbmVDb250ZW50KGNvbnN0IExp
bmVCdWlsZGVyOjpMaW5lQ29udGVudCYgbGluZUNvbnRlbnQpCit7CisgICAgcmV0dXJuIExpbmVC
b3hCdWlsZGVyKGZvcm1hdHRpbmdDb250ZXh0KCkpLmJ1aWxkKGxpbmVDb250ZW50KTsKK30KKwor
SW5saW5lTGF5b3V0VW5pdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmxvZ2lj
YWxUb3BGb3JOZXh0TGluZShjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250
ZW50LCBJbmxpbmVMYXlvdXRVbml0IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIGNvbnN0IEZs
b2F0aW5nQ29udGV4dCYgZmxvYXRpbmdDb250ZXh0KSBjb25zdAoreworICAgIC8vIE5vcm1hbGx5
IHRoZSBuZXh0IGxpbmUncyBsb2dpY2FsIHRvcCBpcyB0aGUgcHJldmlvdXMgbGluZSdzIGxvZ2lj
YWwgYm90dG9tLCBidXQgd2hlbiB0aGUgbGluZSBlbmRzCisgICAgLy8gd2l0aCB0aGUgY2xlYXIg
cHJvcGVydHkgc2V0LCB0aGUgbmV4dCBsaW5lIG5lZWRzIHRvIGNsZWFyIHRoZSBleGlzdGluZyBm
bG9hdHMuCisgICAgaWYgKGxpbmVDb250ZW50LnJ1bnMuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4gcHJldmlvdXNMaW5lTG9naWNhbEJvdHRvbTsKKyAgICBhdXRvJiBsYXN0UnVuTGF5b3V0Qm94
ID0gbGluZUNvbnRlbnQucnVucy5sYXN0KCkubGF5b3V0Qm94KCk7IAorICAgIGlmIChsYXN0UnVu
TGF5b3V0Qm94LnN0eWxlKCkuY2xlYXIoKSA9PSBDbGVhcjo6Tm9uZSkKKyAgICAgICAgcmV0dXJu
IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b207CisgICAgYXV0byBwb3NpdGlvbldpdGhDbGVhcmFu
Y2UgPSBmbG9hdGluZ0NvbnRleHQudmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UobGFzdFJ1
bkxheW91dEJveCk7CisgICAgaWYgKCFwb3NpdGlvbldpdGhDbGVhcmFuY2UpCisgICAgICAgIHJl
dHVybiBwcmV2aW91c0xpbmVMb2dpY2FsQm90dG9tOworICAgIHJldHVybiBzdGQ6Om1heChwcmV2
aW91c0xpbmVMb2dpY2FsQm90dG9tLCBJbmxpbmVMYXlvdXRVbml0KHBvc2l0aW9uV2l0aENsZWFy
YW5jZS0+cG9zaXRpb24pKTsKK30KKworQ29udGVudFdpZHRoQW5kTWFyZ2luIElubGluZUZvcm1h
dHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRNYXJnaW4o
Y29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZh
bHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGZvcm1hdHRp
bmdDb250ZXh0Um9vdC5pc0luRmxvdygpKTsKKworICAgIC8vIDEwLjMuMTAgJ0lubGluZS1ibG9j
aycsIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93CisKKyAgICAvLyBFeGFjdGx5IGFz
IGlubGluZSByZXBsYWNlZCBlbGVtZW50cy4KKyAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHRSb290
LmlzUmVwbGFjZWRCb3goKSkKKyAgICAgICAgcmV0dXJuIGlubGluZVJlcGxhY2VkQ29udGVudFdp
ZHRoQW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3Qp
LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMp
OworCisgICAgLy8gMTAuMy45ICdJbmxpbmUtYmxvY2snLCBub24tcmVwbGFjZWQgZWxlbWVudHMg
aW4gbm9ybWFsIGZsb3cKKworICAgIC8vIElmICd3aWR0aCcgaXMgJ2F1dG8nLCB0aGUgdXNlZCB2
YWx1ZSBpcyB0aGUgc2hyaW5rLXRvLWZpdCB3aWR0aCBhcyBmb3IgZmxvYXRpbmcgZWxlbWVudHMu
CisgICAgLy8gQSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycgZm9yICdtYXJnaW4tbGVmdCcgb3Ig
J21hcmdpbi1yaWdodCcgYmVjb21lcyBhIHVzZWQgdmFsdWUgb2YgJzAnLgorICAgIC8vICMxCisg
ICAgYXV0byB3aWR0aCA9IGNvbXB1dGVkVmFsdWUoZm9ybWF0dGluZ0NvbnRleHRSb290LnN0eWxl
KCkubG9naWNhbFdpZHRoKCksIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOwor
ICAgIGlmICghd2lkdGgpCisgICAgICAgIHdpZHRoID0gc2hyaW5rVG9GaXRXaWR0aChmb3JtYXR0
aW5nQ29udGV4dFJvb3QsIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOworCisg
ICAgLy8gIzIKKyAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpj
b21wdXRlZEhvcml6b250YWxNYXJnaW4oZm9ybWF0dGluZ0NvbnRleHRSb290LCBob3Jpem9udGFs
Q29uc3RyYWludHMpOworCisgICAgcmV0dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7ICp3aWR0
aCwgeyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwX2x1KSwgY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDBfbHUpIH0gfTsKK30KKworQ29udGVudEhl
aWdodEFuZE1hcmdpbiBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmlubGluZUJs
b2NrQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRk
ZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAoreworICAg
IEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7CisKKyAgICAvLyAxMC42LjIgSW5saW5lIHJl
cGxhY2VkIGVsZW1lbnRzLCBibG9jay1sZXZlbCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwg
ZmxvdywgJ2lubGluZS1ibG9jaycgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5k
IGZsb2F0aW5nIHJlcGxhY2VkIGVsZW1lbnRzCisgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2Vk
Qm94KCkpCisgICAgICAgIHJldHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJn
aW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50
cywgeyB9LCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworCisgICAgLy8gMTAuNi42IENvbXBs
aWNhdGVkIGNhc2VzCisgICAgLy8gLSAnSW5saW5lLWJsb2NrJywgbm9uLXJlcGxhY2VkIGVsZW1l
bnRzLgorICAgIHJldHVybiBjb21wbGljYXRlZENhc2VzKGxheW91dEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworfQorCit9Cit9CisKKyNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTFiZTY1ZGFkNWNjNWY1
NmIyOWViMDcwM2U2Y2RjOTQzOTBhYzJhNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaCIK
KworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiTGF5
b3V0Qm94R2VvbWV0cnkuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91
dCB7CisKK0lubGluZUxheW91dFVuaXQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6
aW5pdGlhbExpbmVIZWlnaHQoKSBjb25zdAoreworICAgIC8vIE5lZ2F0aXZlIGxpbmVIZWlnaHQg
dmFsdWUgbWVhbnMgdGhlIGxpbmUtaGVpZ2h0IGlzIG5vdCBzZXQKKyAgICBhdXRvJiByb290ID0g
Zm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCk7CisgICAgaWYgKGxheW91dFN0YXRlKCkuaW5TdGFu
ZGFyZHNNb2RlKCkgfHwgIXJvb3Quc3R5bGUoKS5saW5lSGVpZ2h0KCkuaXNOZWdhdGl2ZSgpKQor
ICAgICAgICByZXR1cm4gcm9vdC5zdHlsZSgpLmNvbXB1dGVkTGluZUhlaWdodCgpOworICAgIHJl
dHVybiByb290LnN0eWxlKCkuZm9udE1ldHJpY3MoKS5mbG9hdEhlaWdodCgpOworfQorCitib29s
IElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OmlubGluZUxldmVsQm94QWZmZWN0c0xp
bmVCb3goY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94LCBjb25z
dCBMaW5lQm94JiBsaW5lQm94KSBjb25zdAoreworICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0xp
bmVCcmVha0JveCgpKSB7CisgICAgICAgIGlmIChsYXlvdXRTdGF0ZSgpLmluU3RhbmRhcmRzTW9k
ZSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIC8vIEluIHF1aXJrcyBtb2Rl
IGxpbmVicmVhayBib3hlcyAoPGJyPikgc3RvcCBhZmZlY3RpbmcgdGhlIGxpbmUgYm94IHdoZW4g
KGFzc3VtZSA8YnI+IGlzIG5lc3RlZCBlLmcuIDxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwMHB4
Ij48YnI+PC9zcGFuPikKKyAgICAgICAgLy8gMS4gdGhlIHJvb3QgaW5saW5lIGJveCBoYXMgY29u
dGVudCA8ZGl2PmNvbnRlbnQ8YnI+L2Rpdj4KKyAgICAgICAgLy8gMi4gdGhlcmUncyBhdCBsZWFz
dCBvbmUgYXRvbWljIGlubGluZSBsZXZlbCBib3ggb24gdGhlIGxpbmUgZS5nIDxkaXY+PGltZz48
YnI+PC9kaXY+IG9yIDxkaXY+PHNwYW4+PGltZz48L3NwYW4+PGJyPjwvZGl2PgorICAgICAgICAv
LyAzLiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBpbmxpbmUgYm94IHdpdGggY29udGVudCBlLmcuIDxk
aXY+PHNwYW4+Y29udGVudDwvc3Bhbj48YnI+PC9kaXY+CisgICAgICAgIGlmIChsaW5lQm94LnJv
b3RJbmxpbmVCb3goKS5oYXNDb250ZW50KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIGlmIChsaW5lQm94Lmhhc0F0b21pY0lubGluZUxldmVsQm94KCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgZWl0aGVyIGhhdmUg
b25seSB0aGUgPGJyPiBvbiB0aGUgbGluZSBvciBpbmxpbmUgYm94ZXMgd2l0aCBvciB3aXRob3V0
IGNvbnRlbnQuCisgICAgICAgIGF1dG8mIGlubGluZUxldmVsQm94ZXMgPSBsaW5lQm94Lm5vblJv
b3RJbmxpbmVMZXZlbEJveGVzKCk7CisgICAgICAgIEFTU0VSVCghaW5saW5lTGV2ZWxCb3hlcy5p
c0VtcHR5KCkpOworICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3hlcy5zaXplKCkgPT0gMSkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBmb3IgKGF1dG8mIGlubGluZUxldmVsQm94
IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hlcygpKSB7CisgICAgICAgICAgICAvLyBG
aWx0ZXIgb3V0IGVtcHR5IGlubGluZSBib3hlcyBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFu
Pjwvc3Bhbj48YnI+PC9kaXY+CisgICAgICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNJbmxp
bmVCb3goKSAmJiBpbmxpbmVMZXZlbEJveC5oYXNDb250ZW50KCkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAg
ICBpZiAoaW5saW5lTGV2ZWxCb3guaXNJbmxpbmVCb3goKSkgeworICAgICAgICAvLyBJbmxpbmUg
Ym94ZXMgKGUuZy4gcm9vdCBpbmxpbmUgYm94IG9yIDxzcGFuPikgYWZmZWN0cyBsaW5lIGJveGVz
IGVpdGhlciB0aHJvdWdoIHRoZSBzdHJ1dCBvciBhY3R1YWwgY29udGVudC4KKyAgICAgICAgYXV0
byBpbmxpbmVCb3hIYXNJbWFnaW5hcnlTdHJ1dCA9IGxheW91dFN0YXRlKCkuaW5TdGFuZGFyZHNN
b2RlKCk7CisgICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5oYXNDb250ZW50KCkgfHwgaW5saW5l
Qm94SGFzSW1hZ2luYXJ5U3RydXQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
aWYgKGlubGluZUxldmVsQm94LmlzUm9vdElubGluZUJveCgpKSB7CisgICAgICAgICAgICBhdXRv
IHNob3VsZFJvb3RJbmxpbmVCb3hXaXRoTm9Db250ZW50U3RyZXRjaExpbmVCb3ggPSBbJl0gewor
ICAgICAgICAgICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKS5zdHlsZSgpLmxp
bmVIZWlnaHQoKS5pc05lZ2F0aXZlKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgICAgICAgICAvLyBUaGUgcm9vdCBpbmxpbmUgYm94IHdpdGggbm9uLWluaXRp
YWwgbGluZSBoZWlnaHQgdmFsdWUgc3RyZXRjaGVzIHRoZSBsaW5lIGJveCBldmVuIHdoZW4gcm9v
dCBoYXMgbm8gY29udGVudAorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGVyZSdzIGF0IGxlYXN0
IG9uZSBpbmxpbmUgYm94IHdpdGggY29udGVudC4KKyAgICAgICAgICAgICAgICAvLyBlLmcuIDxk
aXYgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxMDBweDsiPjxzcGFuPmNvbnRlbnQ8L3NwYW4+PC9kaXY+
CisgICAgICAgICAgICAgICAgaWYgKCFsaW5lQm94Lmhhc0lubGluZUJveCgpKQorICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBpbmxp
bmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgeworICAgICAg
ICAgICAgICAgICAgICBpZiAoIWlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkpCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlubGlu
ZUxldmVsQm94Lmhhc0NvbnRlbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgICAgICB9OworICAgICAgICAgICAgcmV0dXJuIHNob3VsZFJvb3RJbmxpbmVCb3hXaXRo
Tm9Db250ZW50U3RyZXRjaExpbmVCb3goKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOb24tcm9v
dCBpbmxpbmUgYm94ZXMgKGUuZy4gPHNwYW4+KS4KKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkg
PSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGlubGluZUxldmVsQm94LmxheW91
dEJveCgpKTsKKyAgICAgICAgaWYgKGJveEdlb21ldHJ5Lmhvcml6b250YWxCb3JkZXIoKSB8fCBi
b3hHZW9tZXRyeS5ob3Jpem9udGFsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpIHsKKyAgICAgICAg
ICAgIC8vIEhvcml6b250YWwgYm9yZGVyIGFuZCBwYWRkaW5nIG1ha2UgdGhlIGlubGluZSBib3gg
c3RyZXRjaCB0aGUgbGluZSAoZS5nLiA8c3BhbiBzdHlsZT0icGFkZGluZzogMTBweDsiPjwvc3Bh
bj4pLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKyAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNBdG9taWNJbmxpbmVMZXZl
bEJveCgpKSB7CisgICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWln
aHQoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAvLyBXaGlsZSBpbiBwcmFj
dGljZSB3aGVuIHRoZSBuZWdhdGl2ZSB2ZXJ0aWNhbCBtYXJnaW4gbWFrZXMgdGhlIGxheW91dCBi
b3VuZHMgZW1wdHkgKGUuZzogaGVpZ2h0OiAxMDBweDsgbWFyZ2luLXRvcDogLTEwMHB4OyksIGFu
ZCB0aGlzIGlubGluZQorICAgICAgICAvLyBsZXZlbCBib3ggY29udHJpYnV0ZXMgMHB4IHRvIHRo
ZSBsaW5lIGJveCBoZWlnaHQsIGl0IHN0aWxsIG5lZWRzIHRvIGJlIHRha2VuIGludG8gYWNjb3Vu
dCB3aGlsZSBjb21wdXRpbmcgbGluZSBib3ggZ2VvbWV0cmllcy4KKyAgICAgICAgYXV0byYgYm94
R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGlubGluZUxldmVs
Qm94LmxheW91dEJveCgpKTsKKyAgICAgICAgcmV0dXJuIGJveEdlb21ldHJ5Lm1hcmdpbkJlZm9y
ZSgpIHx8IGJveEdlb21ldHJ5Lm1hcmdpbkFmdGVyKCk7CisgICAgfQorICAgIHJldHVybiBmYWxz
ZTsKK30KKworYm9vbCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpoYXNTb2Z0V3Jh
cE9wcG9ydHVuaXR5QXRJbWFnZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICFmb3JtYXR0aW5nQ29u
dGV4dCgpLnJvb3QoKS5pc1RhYmxlQ2VsbCgpOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRl
LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi44N2I2Yzk1YzE1NDVkNjQ1Y2RiZDRiMDU0NmFlYzE4NmNmM2NjZjVk
Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250
ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAKQEAgLTAsMCAr
MSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
KyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisg
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbmxp
bmVGb3JtYXR0aW5nU3RhdGUuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQorCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1Q
TChJbmxpbmVGb3JtYXR0aW5nU3RhdGUpOworCitJbmxpbmVGb3JtYXR0aW5nU3RhdGU6OklubGlu
ZUZvcm1hdHRpbmdTdGF0ZShSZWY8RmxvYXRpbmdTdGF0ZT4mJiBmbG9hdGluZ1N0YXRlLCBMYXlv
dXRTdGF0ZSYgbGF5b3V0U3RhdGUpCisgICAgOiBGb3JtYXR0aW5nU3RhdGUoV1RGTW92ZShmbG9h
dGluZ1N0YXRlKSwgVHlwZTo6SW5saW5lLCBsYXlvdXRTdGF0ZSkKK3sKK30KKworSW5saW5lRm9y
bWF0dGluZ1N0YXRlOjp+SW5saW5lRm9ybWF0dGluZ1N0YXRlKCkKK3sKK30KKworfQorfQorI2Vu
ZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmggYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0
dGluZ1N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMzYzYjE2MDM2ODRlNTk0MDA3YTA4MjdiYzk0Y2I5N2I0
YmEwMTc0ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuaApAQCAt
MCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExB
WU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUuaCIK
KyNpbmNsdWRlICJJbmxpbmVJdGVtLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgorI2lu
Y2x1ZGUgIklubGluZUxpbmVHZW9tZXRyeS5oIgorI2luY2x1ZGUgIklubGluZUxpbmVSdW4uaCIK
KyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVz
cGFjZSBMYXlvdXQgeworCit1c2luZyBJbmxpbmVJdGVtcyA9IFZlY3RvcjxJbmxpbmVJdGVtPjsK
K3VzaW5nIElubGluZUxpbmVzID0gVmVjdG9yPElubGluZUxpbmVHZW9tZXRyeT47Cit1c2luZyBJ
bmxpbmVMaW5lQm94ZXMgPSBWZWN0b3I8TGluZUJveD47Cit1c2luZyBJbmxpbmVMaW5lUnVucyA9
IFZlY3RvcjxMaW5lUnVuPjsKKworLy8gSW5saW5lRm9ybWF0dGluZ1N0YXRlIGhvbGRzIHRoZSBz
dGF0ZSBmb3IgYSBwYXJ0aWN1bGFyIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgdHJlZS4KK2Ns
YXNzIElubGluZUZvcm1hdHRpbmdTdGF0ZSA6IHB1YmxpYyBGb3JtYXR0aW5nU3RhdGUgeworICAg
IFdURl9NQUtFX0lTT19BTExPQ0FURUQoSW5saW5lRm9ybWF0dGluZ1N0YXRlKTsKK3B1YmxpYzoK
KyAgICBJbmxpbmVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0
YXRlJik7CisgICAgfklubGluZUZvcm1hdHRpbmdTdGF0ZSgpOworCisgICAgSW5saW5lSXRlbXMm
IGlubGluZUl0ZW1zKCkgeyByZXR1cm4gbV9pbmxpbmVJdGVtczsgfQorICAgIGNvbnN0IElubGlu
ZUl0ZW1zJiBpbmxpbmVJdGVtcygpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lSXRlbXM7IH0KKyAg
ICB2b2lkIGFkZElubGluZUl0ZW0oSW5saW5lSXRlbSYmIGlubGluZUl0ZW0pIHsgbV9pbmxpbmVJ
dGVtcy5hcHBlbmQoV1RGTW92ZShpbmxpbmVJdGVtKSk7IH0KKworICAgIGNvbnN0IElubGluZUxp
bmVzJiBsaW5lcygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZXM7IH0KKyAgICBJbmxpbmVMaW5lcyYg
bGluZXMoKSB7IHJldHVybiBtX2xpbmVzOyB9CisgICAgdm9pZCBhZGRMaW5lKGNvbnN0IElubGlu
ZUxpbmVHZW9tZXRyeSYgbGluZSkgeyBtX2xpbmVzLmFwcGVuZChsaW5lKTsgfQorCisgICAgY29u
c3QgSW5saW5lTGluZUJveGVzJiBsaW5lQm94ZXMoKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hl
czsgfQorICAgIHZvaWQgYWRkTGluZUJveChMaW5lQm94JiYgbGluZUJveCkgeyBtX2xpbmVCb3hl
cy5hcHBlbmQoV1RGTW92ZShsaW5lQm94KSk7IH0KKworICAgIGNvbnN0IElubGluZUxpbmVSdW5z
JiBsaW5lUnVucygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZVJ1bnM7IH0KKyAgICBJbmxpbmVMaW5l
UnVucyYgbGluZVJ1bnMoKSB7IHJldHVybiBtX2xpbmVSdW5zOyB9CisgICAgdm9pZCBhZGRMaW5l
UnVuKExpbmVSdW4mJiBydW4pIHsgbV9saW5lUnVucy5hcHBlbmQoV1RGTW92ZShydW4pKTsgfQor
CisgICAgdm9pZCBzZXRDbGVhckdhcEFmdGVyTGFzdExpbmUoSW5saW5lTGF5b3V0VW5pdCB2ZXJ0
aWNhbEdhcCk7CisgICAgSW5saW5lTGF5b3V0VW5pdCBjbGVhckdhcEFmdGVyTGFzdExpbmUoKSBj
b25zdCB7IHJldHVybiBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZTsgfQorCisgICAgdm9pZCBjbGVh
ckxpbmVBbmRSdW5zKCk7CisgICAgdm9pZCBzaHJpbmtUb0ZpdCgpOworCitwcml2YXRlOgorICAg
IC8vIENhY2hlYWJsZSBpbnB1dCB0byBsaW5lIGxheW91dC4KKyAgICBJbmxpbmVJdGVtcyBtX2lu
bGluZUl0ZW1zOworICAgIElubGluZUxpbmVzIG1fbGluZXM7CisgICAgSW5saW5lTGluZUJveGVz
IG1fbGluZUJveGVzOworICAgIElubGluZUxpbmVSdW5zIG1fbGluZVJ1bnM7CisgICAgSW5saW5l
TGF5b3V0VW5pdCBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZSB7IDAgfTsKK307CisKK2lubGluZSB2
b2lkIElubGluZUZvcm1hdHRpbmdTdGF0ZTo6c2V0Q2xlYXJHYXBBZnRlckxhc3RMaW5lKElubGlu
ZUxheW91dFVuaXQgdmVydGljYWxHYXApCit7CisgICAgQVNTRVJUKHZlcnRpY2FsR2FwID49IDAp
OworICAgIG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lID0gdmVydGljYWxHYXA7Cit9CisKK2lubGlu
ZSB2b2lkIElubGluZUZvcm1hdHRpbmdTdGF0ZTo6Y2xlYXJMaW5lQW5kUnVucygpCit7CisgICAg
bV9saW5lcy5jbGVhcigpOworICAgIG1fbGluZUJveGVzLmNsZWFyKCk7CisgICAgbV9saW5lUnVu
cy5jbGVhcigpOworICAgIG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lID0geyB9OworfQorCitpbmxp
bmUgdm9pZCBJbmxpbmVGb3JtYXR0aW5nU3RhdGU6OnNocmlua1RvRml0KCkKK3sKKyAgICBtX2lu
bGluZUl0ZW1zLnNocmlua1RvRml0KCk7CisgICAgbV9saW5lcy5zaHJpbmtUb0ZpdCgpOworICAg
IG1fbGluZUJveGVzLnNocmlua1RvRml0KCk7CisgICAgbV9saW5lUnVucy5zaHJpbmtUb0ZpdCgp
OworfQorCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdf
U1RBVEUoSW5saW5lRm9ybWF0dGluZ1N0YXRlLCBpc0lubGluZUZvcm1hdHRpbmdTdGF0ZSgpKQor
CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi4wNjA2ZjE4NDliNWE5YTYxODQ5YTIwZWJkNDE5NjVhNmFkZDhlYzg2Ci0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZUl0ZW0uY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgor
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
KyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5saW5lSXRlbS5oIgorCisjaW5j
bHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19D
T05URVhUKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworc3Ry
dWN0IFNhbWVTaXplQXNJbmxpbmVJdGVtIHsKKyAgICB2b2lkKiBsYXlvdXRCb3g7CisgICAgdWlu
dDhfdCBlbnVtMTsKKyAgICB1aW50OF90IGVudW0yOworICAgIGJvb2wgd2lkdGhCb29sOworICAg
IGJvb2wgc29mdEh5cGhlbkJvb2w7CisgICAgYm9vbCBpc1dvcmRTZXBhcmF0b3I7CisgICAgSW5s
aW5lTGF5b3V0VW5pdCB3aWR0aDsKKyAgICB1bnNpZ25lZCBzdGFydDsKKyAgICB1bnNpZ25lZCBs
ZW5ndGg7Cit9OworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihJbmxpbmVJdGVtKSA9PSBzaXplb2Yo
U2FtZVNpemVBc0lubGluZUl0ZW0pLCAiIik7CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5n
L0lubGluZUl0ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzJhZTI0YTYxMjY4NDU4
ODc0YzcyMDk5NDM4MmJhYjgyOTFkZGM0ZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVt
LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5B
QkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIK
KyNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3Bh
Y2UgTGF5b3V0IHsKKworY2xhc3MgSW5saW5lSXRlbSB7CitwdWJsaWM6CisgICAgZW51bSBjbGFz
cyBUeXBlIDogdWludDhfdCB7IFRleHQsIEhhcmRMaW5lQnJlYWssIFNvZnRMaW5lQnJlYWssIFdv
cmRCcmVha09wcG9ydHVuaXR5LCBCb3gsIEZsb2F0LCBJbmxpbmVCb3hTdGFydCwgSW5saW5lQm94
RW5kIH07CisgICAgSW5saW5lSXRlbShjb25zdCBCb3gmIGxheW91dEJveCwgVHlwZSk7CisKKyAg
ICBUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KKyAgICBjb25zdCBCb3gmIGxh
eW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQorICAgIGNvbnN0IFJlbmRl
clN0eWxlJiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIGxheW91dEJveCgpLnN0eWxlKCk7IH0KKwor
ICAgIGJvb2wgaXNUZXh0KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OlRleHQ7IH0K
KyAgICBib29sIGlzQm94KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OkJveDsgfQor
ICAgIGJvb2wgaXNGbG9hdCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBUeXBlOjpGbG9hdDsg
fQorICAgIGJvb2wgaXNMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiBpc1NvZnRMaW5lQnJlYWso
KSB8fCBpc0hhcmRMaW5lQnJlYWsoKTsgfQorICAgIGJvb2wgaXNXb3JkQnJlYWtPcHBvcnR1bml0
eSgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBUeXBlOjpXb3JkQnJlYWtPcHBvcnR1bml0eTsg
fQorICAgIGJvb2wgaXNTb2Z0TGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5
cGU6OlNvZnRMaW5lQnJlYWs7IH0KKyAgICBib29sIGlzSGFyZExpbmVCcmVhaygpIGNvbnN0IHsg
cmV0dXJuIHR5cGUoKSA9PSBUeXBlOjpIYXJkTGluZUJyZWFrOyB9CisgICAgYm9vbCBpc0lubGlu
ZUJveFN0YXJ0KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OklubGluZUJveFN0YXJ0
OyB9CisgICAgYm9vbCBpc0lubGluZUJveEVuZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBU
eXBlOjpJbmxpbmVCb3hFbmQ7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBCb3gqIG1fbGF5b3V0
Qm94IHsgbnVsbHB0ciB9OworICAgIFR5cGUgbV90eXBlIHsgfTsKKworcHJvdGVjdGVkOgorICAg
IC8vIEZvciBJbmxpbmVUZXh0SXRlbQorICAgIGVudW0gY2xhc3MgVGV4dEl0ZW1UeXBlICA6IHVp
bnQ4X3QgeyBVbmRlZmluZWQsIFdoaXRlc3BhY2UsIE5vbldoaXRlc3BhY2UgfTsKKyAgICBUZXh0
SXRlbVR5cGUgbV90ZXh0SXRlbVR5cGUgeyBUZXh0SXRlbVR5cGU6OlVuZGVmaW5lZCB9OworICAg
IGJvb2wgbV9oYXNXaWR0aCB7IGZhbHNlIH07CisgICAgYm9vbCBtX2hhc1RyYWlsaW5nU29mdEh5
cGhlbiB7IGZhbHNlIH07CisgICAgYm9vbCBtX2lzV29yZFNlcGFyYXRvciB7IGZhbHNlIH07Cisg
ICAgSW5saW5lTGF5b3V0VW5pdCBtX3dpZHRoIHsgfTsKKyAgICB1bnNpZ25lZCBtX2xlbmd0aCB7
IDAgfTsKKworICAgIC8vIEZvciBJbmxpbmVUZXh0SXRlbSBhbmQgSW5saW5lU29mdExpbmVCcmVh
a0l0ZW0KKyAgICB1bnNpZ25lZCBtX3N0YXJ0T3JQb3NpdGlvbiB7IDAgfTsKK307CisKK2lubGlu
ZSBJbmxpbmVJdGVtOjpJbmxpbmVJdGVtKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBUeXBlIHR5cGUp
CisgICAgOiBtX2xheW91dEJveCgmbGF5b3V0Qm94KQorICAgICwgbV90eXBlKHR5cGUpCit7Cit9
CisKKyNkZWZpbmUgU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19JTkxJTkVfSVRFTShUb1ZhbHVlVHlw
ZU5hbWUsIHByZWRpY2F0ZSkgXAorU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19CRUdJTihXZWJDb3Jl
OjpMYXlvdXQ6OlRvVmFsdWVUeXBlTmFtZSkgXAorICAgIHN0YXRpYyBib29sIGlzVHlwZShjb25z
dCBXZWJDb3JlOjpMYXlvdXQ6OklubGluZUl0ZW0mIGlubGluZUl0ZW0pIHsgcmV0dXJuIGlubGlu
ZUl0ZW0ucHJlZGljYXRlOyB9IFwKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfRU5EKCkKKworfQor
fQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uNWIzMzViYzQwZWVmYzljMjgzM2Q0ZDEzN2I0YTU4NDc4NzA3NTJmYwotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lLmNwcApAQCAtMCwwICsxLDUzOSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
CisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbmxpbmVMaW5lLmgiCisKKyNp
ZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZvbnRDYXNj
YWRlLmgiCisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJJ
bmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5Lmgi
CisjaW5jbHVkZSAiUnVudGltZUVuYWJsZWRGZWF0dXJlcy5oIgorI2luY2x1ZGUgIlRleHRGbGFn
cy5oIgorI2luY2x1ZGUgIlRleHRVdGlsLmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGlu
ZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0xpbmU6
OkxpbmUoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1hdHRpbmdDb250
ZXh0KQorICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dCkKKyAgICAsIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KG1fcnVucykKK3sKK30KKwor
TGluZTo6fkxpbmUoKQoreworfQorCit2b2lkIExpbmU6OmluaXRpYWxpemUoKQoreworICAgIG1f
bm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50ID0gMDsKKyAgICBtX2NvbnRlbnRMb2dpY2Fs
V2lkdGggPSB7IH07CisgICAgbV9ydW5zLmNsZWFyKCk7CisgICAgbV90cmFpbGluZ1NvZnRIeXBo
ZW5XaWR0aCA9IHsgfTsKKyAgICBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudC5yZXNldCgpOwor
fQorCit2b2lkIExpbmU6OnJlbW92ZUNvbGxhcHNpYmxlQ29udGVudChJbmxpbmVMYXlvdXRVbml0
IGV4dHJhSG9yaXpvbnRhbFNwYWNlKQoreworICAgIHJlbW92ZVRyYWlsaW5nVHJpbW1hYmxlQ29u
dGVudCgpOworICAgIHZpc3VhbGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KGV4dHJh
SG9yaXpvbnRhbFNwYWNlKTsKK30KKwordm9pZCBMaW5lOjphcHBseVJ1bkV4cGFuc2lvbihJbmxp
bmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKQoreworICAgIEFTU0VSVChmb3JtYXR0
aW5nQ29udGV4dCgpLnJvb3QoKS5zdHlsZSgpLnRleHRBbGlnbigpID09IFRleHRBbGlnbk1vZGU6
Okp1c3RpZnkpOworICAgIC8vIFRleHQgaXMganVzdGlmaWVkIGFjY29yZGluZyB0byB0aGUgbWV0
aG9kIHNwZWNpZmllZCBieSB0aGUgdGV4dC1qdXN0aWZ5IHByb3BlcnR5LAorICAgIC8vIGluIG9y
ZGVyIHRvIGV4YWN0bHkgZmlsbCB0aGUgbGluZSBib3guIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lm
aWVkIGJ5IHRleHQtYWxpZ24tbGFzdCwKKyAgICAvLyB0aGUgbGFzdCBsaW5lIGJlZm9yZSBhIGZv
cmNlZCBicmVhayBvciB0aGUgZW5kIG9mIHRoZSBibG9jayBpcyBzdGFydC1hbGlnbmVkLgorICAg
IGlmIChtX3J1bnMuaXNFbXB0eSgpIHx8IG1fcnVucy5sYXN0KCkuaXNMaW5lQnJlYWsoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgYXV0byBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50ID0gMDsK
KyAgICBSdW4qIGxhc3RSdW5XaXRoQ29udGVudCA9IG51bGxwdHI7CisgICAgLy8gQ29sbGVjdCBh
bmQgZGlzdHJpYnV0ZSB0aGUgZXhwYW5zaW9uIG9wcG9ydHVuaXRpZXMuCisgICAgZm9yIChhdXRv
JiBydW4gOiBtX3J1bnMpIHsKKyAgICAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCArPSBy
dW4uZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCgpOworICAgICAgICBpZiAocnVuLmlzVGV4dCgp
IHx8IHJ1bi5pc0JveCgpKQorICAgICAgICAgICAgbGFzdFJ1bldpdGhDb250ZW50ID0gJnJ1bjsK
KyAgICB9CisgICAgLy8gTmVlZCB0byBmaXggdXAgdGhlIGxhc3QgcnVuJ3MgdHJhaWxpbmcgZXhw
YW5zaW9uLgorICAgIGlmIChsYXN0UnVuV2l0aENvbnRlbnQgJiYgbGFzdFJ1bldpdGhDb250ZW50
LT5oYXNFeHBhbnNpb25PcHBvcnR1bml0eSgpKSB7CisgICAgICAgIC8vIFR1cm4gb2ZmIHRoZSB0
cmFpbGluZyBiaXRzIGZpcnN0IGFuZCBhZGQgdGhlIGZvcmJpZCB0cmFpbGluZyBleHBhbnNpb24u
CisgICAgICAgIGF1dG8gbGVhZGluZ0V4cGFuc2lvbiA9IGxhc3RSdW5XaXRoQ29udGVudC0+ZXhw
YW5zaW9uQmVoYXZpb3IoKSAmIExlZnRFeHBhbnNpb25NYXNrOworICAgICAgICBsYXN0UnVuV2l0
aENvbnRlbnQtPnNldEV4cGFuc2lvbkJlaGF2aW9yKGxlYWRpbmdFeHBhbnNpb24gfCBGb3JiaWRS
aWdodEV4cGFuc2lvbik7CisgICAgfQorICAgIC8vIEFueXRoaW5nIHRvIGRpc3RyaWJ1dGU/Cisg
ICAgaWYgKCFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50IHx8ICFleHRyYUhvcml6b250YWxTcGFj
ZSkKKyAgICAgICAgcmV0dXJuOworICAgIC8vIERpc3RyaWJ1dGUgdGhlIGV4dHJhIHNwYWNlLgor
ICAgIGF1dG8gZXhwYW5zaW9uVG9EaXN0cmlidXRlID0gZXh0cmFIb3Jpem9udGFsU3BhY2UgLyBl
eHBhbnNpb25PcHBvcnR1bml0eUNvdW50OworICAgIGF1dG8gYWNjdW11bGF0ZWRFeHBhbnNpb24g
PSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKKyAgICBmb3IgKGF1dG8mIHJ1biA6IG1fcnVucykgewor
ICAgICAgICAvLyBFeHBhbmQgYW5kIG1vdmUgcnVucyBieSB0aGUgYWNjdW11bGF0ZWQgZXhwYW5z
aW9uLgorICAgICAgICBydW4ubW92ZUhvcml6b250YWxseShhY2N1bXVsYXRlZEV4cGFuc2lvbik7
CisgICAgICAgIGlmICghcnVuLmhhc0V4cGFuc2lvbk9wcG9ydHVuaXR5KCkpCisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgQVNTRVJUKHJ1bi5leHBhbnNpb25PcHBvcnR1bml0eUNvdW50
KCkpOworICAgICAgICBhdXRvIGNvbXB1dGVkRXhwYW5zaW9uID0gZXhwYW5zaW9uVG9EaXN0cmli
dXRlICogcnVuLmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQoKTsKKyAgICAgICAgLy8gRklYTUU6
IENoZWNrIHdoeSB3ZSBuZWVkIHRvIHNldCBib3RoLgorICAgICAgICBydW4uc2V0SG9yaXpvbnRh
bEV4cGFuc2lvbihjb21wdXRlZEV4cGFuc2lvbik7CisgICAgICAgIHJ1bi5zaHJpbmtIb3Jpem9u
dGFsbHkoLWNvbXB1dGVkRXhwYW5zaW9uKTsKKyAgICAgICAgYWNjdW11bGF0ZWRFeHBhbnNpb24g
Kz0gY29tcHV0ZWRFeHBhbnNpb247CisgICAgfQorICAgIC8vIENvbnRlbnQgZ3Jvd3MgYXMgcnVu
cyBleHBhbmQuCisgICAgbV9jb250ZW50TG9naWNhbFdpZHRoICs9IGFjY3VtdWxhdGVkRXhwYW5z
aW9uOworfQorCit2b2lkIExpbmU6OnJlbW92ZVRyYWlsaW5nVHJpbW1hYmxlQ29udGVudCgpCit7
CisgICAgaWYgKG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmlzRW1wdHkoKSB8fCBtX3J1bnMu
aXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDb21wbGV4IGxpbmUgbGF5b3V0
IHF1aXJrOiBrZWVwIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGFyb3VuZCB3aGVuIGl0IGlzIGZv
bGxvd2VkIGJ5IGEgbGluZSBicmVhaywgdW5sZXNzIHRoZSBjb250ZW50IG92ZXJmbG93cyB0aGUg
bGluZS4KKyAgICBpZiAoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c2hhcmVkRmVhdHVyZXMoKS5s
YXlvdXRGb3JtYXR0aW5nQ29udGV4dEludGVncmF0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgIGF1
dG8gaXNUZXh0QWxpZ25SaWdodCA9IFsmXSB7CisgICAgICAgICAgICBhdXRvIHRleHRBbGlnbiA9
IGZvcm1hdHRpbmdDb250ZXh0KCkucm9vdCgpLnN0eWxlKCkudGV4dEFsaWduKCk7CisgICAgICAg
ICAgICByZXR1cm4gdGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6OlJpZ2h0CisgICAgICAgICAg
ICAgICAgfHwgdGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0CisgICAgICAg
ICAgICAgICAgfHwgdGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6OkVuZDsKKyAgICAgICAgICAg
IH0oKTsKKworICAgICAgICBpZiAobV9ydW5zLmxhc3QoKS5pc0xpbmVCcmVhaygpICYmICFpc1Rl
eHRBbGlnblJpZ2h0KSB7CisgICAgICAgICAgICBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudC5y
ZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbV9j
b250ZW50TG9naWNhbFdpZHRoIC09IG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlbW92ZSgp
OworfQorCit2b2lkIExpbmU6OnZpc3VhbGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50
KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFsU3BhY2UpCit7CisgICAgQVNTRVJUKG1f
dHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmlzRW1wdHkoKSk7CisgICAgLy8gSWYgd2hpdGUtc3Bh
Y2UgaXMgc2V0IHRvIHByZS13cmFwLCB0aGUgVUEgbXVzdAorICAgIC8vIC4uLgorICAgIC8vIEl0
IG1heSBhbHNvIHZpc3VhbGx5IGNvbGxhcHNlIHRoZSBjaGFyYWN0ZXIgYWR2YW5jZSB3aWR0aHMg
b2YgYW55IHRoYXQgd291bGQgb3RoZXJ3aXNlIG92ZXJmbG93LgorICAgIGF1dG8gb3ZlcmZsb3dX
aWR0aCA9IC1leHRyYUhvcml6b250YWxTcGFjZTsKKyAgICBpZiAob3ZlcmZsb3dXaWR0aCA8PSAw
KQorICAgICAgICByZXR1cm47CisgICAgLy8gTGV0J3MganVzdCBmaW5kIHRoZSB0cmFpbGluZyBw
cmUtd3JhcCB3aGl0ZXNwYWNlIGNvbnRlbnQgZm9yIG5vdyAoZS5nIGNoZWNrIGlmIHRoZXJlIGFy
ZSBtdWx0aXBsZSB0cmFpbGluZyBydW5zIHdpdGgKKyAgICAvLyBkaWZmZXJlbnQgc2V0IG9mIHdo
aXRlLXNwYWNlIHZhbHVlcyBhbmQgZGVjaWRlIGlmIHRoZSBpbi1iZXR3ZWVuIHByZS13cmFwIGNv
bnRlbnQgc2hvdWxkIGJlIGNvbGxhcHNlZCBhcyB3ZWxsLikKKyAgICBJbmxpbmVMYXlvdXRVbml0
IHRyaW1tZWRDb250ZW50V2lkdGggPSAwOworICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjptYWtl
UmV2ZXJzZWRSYW5nZShtX3J1bnMpKSB7CisgICAgICAgIGlmIChydW4uc3R5bGUoKS53aGl0ZVNw
YWNlKCkgIT0gV2hpdGVTcGFjZTo6UHJlV3JhcCkgeworICAgICAgICAgICAgLy8gV2UgYXJlIG9u
bHkgaW50ZXJlc3RlZCBpbiBwcmUtd3JhcCB0cmFpbGluZyBjb250ZW50LgorICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBwcmVXcmFwVmlzdWFsbHlDb2xsYXBzaWJs
ZUlubGluZUl0ZW0gPSBydW4uaXNJbmxpbmVCb3hTdGFydCgpIHx8IHJ1bi5pc0lubGluZUJveEVu
ZCgpIHx8IHJ1bi5oYXNUcmFpbGluZ1doaXRlc3BhY2UoKTsKKyAgICAgICAgaWYgKCFwcmVXcmFw
VmlzdWFsbHlDb2xsYXBzaWJsZUlubGluZUl0ZW0pCisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgQVNTRVJUKCFydW4uaGFzQ29sbGFwc2libGVUcmFpbGluZ1doaXRlc3BhY2UoKSk7CisgICAg
ICAgIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGggPSB7IH07CisgICAgICAgIGlmIChy
dW4uaXNUZXh0KCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgYWx3YXlzIGNv
bGxhcHNlIHRoZSBydW4gYXQgYSBnbHlwaCBib3VuZGFyeSBhcyB0aGUgc3BlYyBpbmRpY2F0ZXM6
ICJjb2xsYXBzZSB0aGUgY2hhcmFjdGVyIGFkdmFuY2Ugd2lkdGhzIG9mIGFueSB0aGF0IHdvdWxk
IG90aGVyd2lzZSBvdmVyZmxvdyIKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgdHJpbW1lZCB3aWR0
aCBzaG91bGQgYmUgY2FwcGVkIGF0IHN0ZDo6bWluKHJ1bi50cmFpbGluZ1doaXRlc3BhY2VXaWR0
aCgpLCBvdmVyZmxvd1dpZHRoKSBmb3IgdGV4dCBydW5zLiBCb3RoIEZGIGFuZCBDaHJvbWUgYWdy
ZWUuCisgICAgICAgICAgICB0cmltbWFibGVXaWR0aCA9IHJ1bi50cmFpbGluZ1doaXRlc3BhY2VX
aWR0aCgpOworICAgICAgICAgICAgcnVuLnZpc3VhbGx5Q29sbGFwc2VUcmFpbGluZ1doaXRlc3Bh
Y2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyaW1tYWJsZVdpZHRoID0gcnVu
LmxvZ2ljYWxXaWR0aCgpOworICAgICAgICAgICAgcnVuLnNocmlua0hvcml6b250YWxseSh0cmlt
bWFibGVXaWR0aCk7CisgICAgICAgIH0KKyAgICAgICAgdHJpbW1lZENvbnRlbnRXaWR0aCArPSB0
cmltbWFibGVXaWR0aDsKKyAgICAgICAgb3ZlcmZsb3dXaWR0aCAtPSB0cmltbWFibGVXaWR0aDsK
KyAgICAgICAgaWYgKG92ZXJmbG93V2lkdGggPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAg
IH0KKyAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggLT0gdHJpbW1lZENvbnRlbnRXaWR0aDsKK30K
Kwordm9pZCBMaW5lOjphcHBlbmQoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwgSW5saW5l
TGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7CisgICAgaWYgKGlubGluZUl0ZW0uaXNUZXh0KCkp
CisgICAgICAgIGFwcGVuZFRleHRDb250ZW50KGRvd25jYXN0PElubGluZVRleHRJdGVtPihpbmxp
bmVJdGVtKSwgbG9naWNhbFdpZHRoKTsKKyAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmlzTGluZUJy
ZWFrKCkpCisgICAgICAgIGFwcGVuZExpbmVCcmVhayhpbmxpbmVJdGVtKTsKKyAgICBlbHNlIGlm
IChpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkKKyAgICAgICAgYXBwZW5kV29y
ZEJyZWFrT3Bwb3J0dW5pdHkoaW5saW5lSXRlbSk7CisgICAgZWxzZSBpZiAoaW5saW5lSXRlbS5p
c0lubGluZUJveFN0YXJ0KCkpCisgICAgICAgIGFwcGVuZElubGluZUJveFN0YXJ0KGlubGluZUl0
ZW0sIGxvZ2ljYWxXaWR0aCk7CisgICAgZWxzZSBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveEVu
ZCgpKQorICAgICAgICBhcHBlbmRJbmxpbmVCb3hFbmQoaW5saW5lSXRlbSwgbG9naWNhbFdpZHRo
KTsKKyAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmxheW91dEJveCgpLmlzUmVwbGFjZWRCb3goKSkK
KyAgICAgICAgYXBwZW5kUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVtLCBsb2dpY2Fs
V2lkdGgpOworICAgIGVsc2UgaWYgKGlubGluZUl0ZW0uaXNCb3goKSkKKyAgICAgICAgYXBwZW5k
Tm9uUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgpOworICAg
IGVsc2UKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK3ZvaWQgTGluZTo6YXBw
ZW5kTm9uQnJlYWthYmxlU3BhY2UoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwgSW5saW5l
TGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7
CisgICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGxvZ2ljYWxMZWZ0LCBsb2dpY2FsV2lk
dGggfSk7CisgICAgbV9jb250ZW50TG9naWNhbFdpZHRoICs9IGxvZ2ljYWxXaWR0aDsKK30KKwor
dm9pZCBMaW5lOjphcHBlbmRJbmxpbmVCb3hTdGFydChjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJ
dGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKK3sKKyAgICAvLyBUaGlzIGlzIHJl
YWxseSBqdXN0IGEgcGxhY2Vob2xkZXIgdG8gbWFyayB0aGUgc3RhcnQgb2YgdGhlIGlubGluZSBi
b3ggPHNwYW4+LgorICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5n
ZW9tZXRyeUZvckJveChpbmxpbmVJdGVtLmxheW91dEJveCgpKTsKKyAgICBhdXRvIGFkanVzdGVk
UnVuU3RhcnQgPSBjb250ZW50TG9naWNhbFJpZ2h0KCkgKyBzdGQ6Om1pbihib3hHZW9tZXRyeS5t
YXJnaW5TdGFydCgpLCAwX2x1KTsKKyAgICArK21fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENv
dW50OworICAgIGFwcGVuZE5vbkJyZWFrYWJsZVNwYWNlKGlubGluZUl0ZW0sIGFkanVzdGVkUnVu
U3RhcnQsIGxvZ2ljYWxXaWR0aCk7Cit9CisKK3ZvaWQgTGluZTo6YXBwZW5kSW5saW5lQm94RW5k
KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdp
ZHRoKQoreworICAgIC8vIFRoaXMgaXMgcmVhbGx5IGp1c3QgYSBwbGFjZWhvbGRlciB0byBtYXJr
IHRoZSBlbmQgb2YgdGhlIGlubGluZSBib3ggPC9zcGFuPi4KKyAgICBhdXRvIHJlbW92ZVRyYWls
aW5nTGV0dGVyU3BhY2luZyA9IFsmXSB7CisgICAgICAgIGlmICghbV90cmltbWFibGVUcmFpbGlu
Z0NvbnRlbnQuaXNUcmFpbGluZ1J1blBhcnRpYWxseVRyaW1tYWJsZSgpKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggLT0gbV90cmltbWFibGVUcmFp
bGluZ0NvbnRlbnQucmVtb3ZlUGFydGlhbGx5VHJpbW1hYmxlQ29udGVudCgpOworICAgIH07Cisg
ICAgLy8gUHJldmVudCB0cmFpbGluZyBsZXR0ZXItc3BhY2luZyBmcm9tIHNwaWxsaW5nIG91dCBv
ZiB0aGUgaW5saW5lIGJveC4KKyAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRl
eHQtMy8jbGV0dGVyLXNwYWNpbmctcHJvcGVydHkgU2VlIGV4YW1wbGUgMjEuCisgICAgcmVtb3Zl
VHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7CisgICAgYXBwZW5kTm9uQnJlYWthYmxlU3BhY2UoaW5s
aW5lSXRlbSwgY29udGVudExvZ2ljYWxXaWR0aCgpLCBsb2dpY2FsV2lkdGgpOworfQorCit2b2lk
IExpbmU6OmFwcGVuZFRleHRDb250ZW50KGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0
SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7CisgICAgYXV0byYgc3R5bGUg
PSBpbmxpbmVUZXh0SXRlbS5zdHlsZSgpOworICAgIGF1dG8gd2lsbENvbGxhcHNlQ29tcGxldGVs
eSA9IFsmXSB7CisgICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc0VtcHR5Q29udGVudCgpKQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghaW5saW5lVGV4dEl0ZW0uaXNX
aGl0ZXNwYWNlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChJbmxp
bmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtKSkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxhc3Qg
aXRlbSBpcyBjb2xsYXBzZWQgYXMgd2VsbC4KKyAgICAgICAgZm9yIChhdXRvJiBydW4gOiBXVEY6
Om1ha2VSZXZlcnNlZFJhbmdlKG1fcnVucykpIHsKKyAgICAgICAgICAgIGlmIChydW4uaXNCb3go
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAvLyBodHRwczov
L2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jd2hpdGUtc3BhY2UtcGhhc2UtMQorICAgICAg
ICAgICAgLy8gQW55IGNvbGxhcHNpYmxlIHNwYWNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhbm90
aGVyIGNvbGxhcHNpYmxlIHNwYWNl4oCUZXZlbiBvbmUgb3V0c2lkZSB0aGUgYm91bmRhcnkgb2Yg
dGhlIGlubGluZSBjb250YWluaW5nIHRoYXQgc3BhY2UsCisgICAgICAgICAgICAvLyBwcm92aWRl
ZCBib3RoIHNwYWNlcyBhcmUgd2l0aGluIHRoZSBzYW1lIGlubGluZSBmb3JtYXR0aW5nIGNvbnRl
eHTigJRpcyBjb2xsYXBzZWQgdG8gaGF2ZSB6ZXJvIGFkdmFuY2Ugd2lkdGguCisgICAgICAgICAg
ICAvLyA6ICI8c3Bhbj4gIDwvc3Bhbj4gIiA8LSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSBjb2xs
YXBzZXMgY29tcGxldGVseS4KKyAgICAgICAgICAgIC8vIE5vdCB0aGF0IHdoZW4gdGhlIGlubGlu
ZSBib3ggaGFzIHByZXNlcnZlIHdoaXRlc3BhY2Ugc3R5bGUsICI8c3BhbiBzdHlsZT0id2hpdGUt
c3BhY2U6IHByZSI+ICA8L3NwYW4+ICIgPC0gdGhpcyB3aGl0ZXNwYWNlIHN0YXlzIGFyb3VuZC4K
KyAgICAgICAgICAgIGlmIChydW4uaXNUZXh0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJ1
bi5oYXNDb2xsYXBzaWJsZVRyYWlsaW5nV2hpdGVzcGFjZSgpOworICAgICAgICAgICAgQVNTRVJU
KHJ1bi5pc0lubGluZUJveFN0YXJ0KCkgfHwgcnVuLmlzSW5saW5lQm94RW5kKCkgfHwgcnVuLmlz
V29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTGVhZGluZyB3
aGl0ZXNwYWNlLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgaWYgKHdpbGxD
b2xsYXBzZUNvbXBsZXRlbHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byBuZWVkc05l
d1J1biA9IFsmXSB7CisgICAgICAgIGlmIChtX3J1bnMuaXNFbXB0eSgpKQorICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGF1dG8mIGxhc3RSdW4gPSBtX3J1bnMubGFzdCgpOworICAg
ICAgICBpZiAoJmxhc3RSdW4ubGF5b3V0Qm94KCkgIT0gJmlubGluZVRleHRJdGVtLmxheW91dEJv
eCgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghbGFzdFJ1bi5pc1Rl
eHQoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAobGFzdFJ1bi5oYXND
b2xsYXBzZWRUcmFpbGluZ1doaXRlc3BhY2UoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICBpZiAoaW5saW5lVGV4dEl0ZW0uaXNXb3JkU2VwYXJhdG9yKCkgJiYgc3R5bGUuZm9u
dENhc2NhZGUoKS53b3JkU3BhY2luZygpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9KCk7CisgICAgYXV0byBvbGRDb250ZW50TG9naWNhbFdp
ZHRoID0gY29udGVudExvZ2ljYWxXaWR0aCgpOworICAgIGlmIChuZWVkc05ld1J1bikgeworICAg
ICAgICAvLyBOb3RlLCBuZWdhdGl2ZSB3b3JkcyBzcGFjaW5nIG1heSBjYXVzZSBnbHlwaCBvdmVy
bGFwLgorICAgICAgICBhdXRvIHJ1bkxvZ2ljYWxMZWZ0ID0gY29udGVudExvZ2ljYWxSaWdodCgp
ICsgKGlubGluZVRleHRJdGVtLmlzV29yZFNlcGFyYXRvcigpID8gc3R5bGUuZm9udENhc2NhZGUo
KS53b3JkU3BhY2luZygpIDogMC4wZik7CisgICAgICAgIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVU
ZXh0SXRlbSwgcnVuTG9naWNhbExlZnQsIGxvZ2ljYWxXaWR0aCB9KTsKKyAgICAgICAgbV9jb250
ZW50TG9naWNhbFdpZHRoID0gc3RkOjptYXgob2xkQ29udGVudExvZ2ljYWxXaWR0aCwgcnVuTG9n
aWNhbExlZnQgKyBsb2dpY2FsV2lkdGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fcnVucy5s
YXN0KCkuZXhwYW5kKGlubGluZVRleHRJdGVtLCBsb2dpY2FsV2lkdGgpOworICAgICAgICAvLyBE
byBub3QgbGV0IG5lZ2F0aXZlIGxldHRlciBzcGFjaW5nIG1ha2UgdGhlIGNvbnRlbnQgc2hvcnRl
ciB0aGFuIGl0IGFscmVhZHkgaXMuCisgICAgICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCArPSBz
dGQ6Om1heCgwLjBmLCBsb2dpY2FsV2lkdGgpOworICAgIH0KKyAgICAvLyBTZXQgdGhlIHRyYWls
aW5nIHRyaW1tYWJsZSBjb250ZW50LgorICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3Bh
Y2UoKSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxp
bmVUZXh0SXRlbSkpIHsKKyAgICAgICAgbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuYWRkRnVs
bHlUcmltbWFibGVDb250ZW50KG1fcnVucy5zaXplKCkgLSAxLCBjb250ZW50TG9naWNhbFdpZHRo
KCkgLSBvbGRDb250ZW50TG9naWNhbFdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAg
ICAvLyBBbnkgbm9uLXdoaXRlc3BhY2UsIG5vLXRyaW1tYWJsZSBjb250ZW50IHJlc2V0cyB0aGUg
ZXhpc3RpbmcgdHJpbW1hYmxlLgorICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlc2V0
KCk7CisgICAgaWYgKCFmb3JtYXR0aW5nQ29udGV4dCgpLmxheW91dFN0YXRlKCkuc2hvdWxkSWdu
b3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgJiYgIWlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFj
ZSgpICYmIHN0eWxlLmxldHRlclNwYWNpbmcoKSA+IDApCisgICAgICAgIG1fdHJpbW1hYmxlVHJh
aWxpbmdDb250ZW50LmFkZFBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQobV9ydW5zLnNpemUoKSAt
IDEsIHN0eWxlLmxldHRlclNwYWNpbmcoKSk7CisgICAgbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0
aCA9IGlubGluZVRleHRJdGVtLmhhc1RyYWlsaW5nU29mdEh5cGhlbigpID8gbWFrZU9wdGlvbmFs
KHN0eWxlLmZvbnRDYXNjYWRlKCkud2lkdGgoVGV4dFJ1biB7IFN0cmluZ1ZpZXcgeyBzdHlsZS5o
eXBoZW5TdHJpbmcoKSB9IH0pKSA6IFdURjo6bnVsbG9wdDsKK30KKwordm9pZCBMaW5lOjphcHBl
bmROb25SZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0s
IElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKQoreworICAgIG1fdHJpbW1h
YmxlVHJhaWxpbmdDb250ZW50LnJlc2V0KCk7CisgICAgbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0
aCA9IHsgfTsKKyAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggKz0gbWFyZ2luQm94TG9naWNhbFdp
ZHRoOworICAgICsrbV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQ7CisgICAgYXV0byBt
YXJnaW5TdGFydCA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goaW5saW5lSXRl
bS5sYXlvdXRCb3goKSkubWFyZ2luU3RhcnQoKTsKKyAgICBpZiAobWFyZ2luU3RhcnQgPj0gMCkg
eworICAgICAgICBtX3J1bnMuYXBwZW5kKHsgaW5saW5lSXRlbSwgY29udGVudExvZ2ljYWxSaWdo
dCgpLCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGggfSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg
ICAgLy8gTmVnYXRpdmUgbWFyZ2luLXN0YXJ0IHB1bGxzIHRoZSBjb250ZW50IHRvIHRoZSBsb2dp
Y2FsIGxlZnQgZGlyZWN0aW9uLgorICAgIC8vIE5lZ2F0aXZlIG1hcmdpbiBhbHNvIHNxdWVlemVz
IHRoZSBtYXJnaW4gYm94LCB3ZSBuZWVkIHRvIHN0cmV0Y2ggaXQgdG8gbWFrZSBzdXJlIHRoZSBz
dWJzZXF1ZW50IGNvbnRlbnQgd29uJ3Qgb3ZlcmxhcC4KKyAgICAvLyBlLmcuIDxpbWcgc3R5bGU9
IndpZHRoOiAxMDBweDsgbWFyZ2luLWxlZnQ6IC0xMDBweDsiPiBwdWxscyB0aGUgcmVwbGFjZWQg
Ym94IHRvIC0xMDBweCB3aXRoIHRoZSBtYXJnaW4gYm94IHdpZHRoIG9mIDBweC4KKyAgICAvLyBJ
bnN0ZWFkIHdlIG5lZWQgdG8gcG9zaXRpb24gaXQgYXQgLTEwMHB4IGFuZCBzaXplIGl0IHRvIDEw
MHB4IHNvIHRoZSBzdWJzZXF1ZW50IGNvbnRlbnQgc3RhcnRzIGF0IDBweC4gCisgICAgbV9ydW5z
LmFwcGVuZCh7IGlubGluZUl0ZW0sIGNvbnRlbnRMb2dpY2FsUmlnaHQoKSArIG1hcmdpblN0YXJ0
LCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGggLSBtYXJnaW5TdGFydCB9KTsKK30KKwordm9pZCBMaW5l
OjphcHBlbmRSZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0
ZW0sIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKQoreworICAgIEFTU0VS
VChpbmxpbmVJdGVtLmxheW91dEJveCgpLmlzUmVwbGFjZWRCb3goKSk7CisgICAgLy8gRklYTUU6
IFN1cmVseSByZXBsYWNlZCBib3hlcyBiZWhhdmUgZGlmZmVyZW50bHkuCisgICAgYXBwZW5kTm9u
UmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVtLCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGgp
OworfQorCit2b2lkIExpbmU6OmFwcGVuZExpbmVCcmVhayhjb25zdCBJbmxpbmVJdGVtJiBpbmxp
bmVJdGVtKQoreworICAgIG1fdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPSB7IH07CisgICAgaWYg
KGlubGluZUl0ZW0uaXNIYXJkTGluZUJyZWFrKCkpIHsKKyAgICAgICAgKyttX25vblNwYW5uaW5n
SW5saW5lTGV2ZWxCb3hDb3VudDsKKyAgICAgICAgcmV0dXJuIG1fcnVucy5hcHBlbmQoeyBpbmxp
bmVJdGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIDBfbHUgfSk7CisgICAgfQorICAgIC8vIFNv
ZnQgbGluZSBicmVha3MgKHByZXNlcnZlZCBuZXcgbGluZSBjaGFyYWN0ZXJzKSByZXF1aXJlIGlu
bGluZSB0ZXh0IGJveGVzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCisgICAgQVNTRVJUKGlu
bGluZUl0ZW0uaXNTb2Z0TGluZUJyZWFrKCkpOworICAgIG1fcnVucy5hcHBlbmQoeyBkb3duY2Fz
dDxJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbT4oaW5saW5lSXRlbSksIGNvbnRlbnRMb2dpY2FsUmln
aHQoKSB9KTsKK30KKwordm9pZCBMaW5lOjphcHBlbmRXb3JkQnJlYWtPcHBvcnR1bml0eShjb25z
dCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQoreworICAgIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJ
dGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIDBfbHUgfSk7Cit9CisKK3ZvaWQgTGluZTo6YWRk
VHJhaWxpbmdIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBoeXBoZW5Mb2dpY2FsV2lkdGgpCit7Cisg
ICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKG1fcnVucykpIHsKKyAg
ICAgICAgaWYgKCFydW4uaXNUZXh0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
cnVuLnNldE5lZWRzSHlwaGVuKGh5cGhlbkxvZ2ljYWxXaWR0aCk7CisgICAgICAgIG1fY29udGVu
dExvZ2ljYWxXaWR0aCArPSBoeXBoZW5Mb2dpY2FsV2lkdGg7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK2NvbnN0IElubGluZUZvcm1hdHRp
bmdDb250ZXh0JiBMaW5lOjpmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Cit9CisKK0xpbmU6OlRyaW1tYWJsZVRyYWlsaW5n
Q29udGVudDo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KFJ1bkxpc3QmIHJ1bnMpCisgICAgOiBt
X3J1bnMocnVucykKK3sKK30KKwordm9pZCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6
OmFkZEZ1bGx5VHJpbW1hYmxlQ29udGVudChzaXplX3QgcnVuSW5kZXgsIElubGluZUxheW91dFVu
aXQgdHJpbW1hYmxlV2lkdGgpCit7CisgICAgLy8gQW55IHN1YnNlcXVlbnQgdHJpbW1hYmxlIHdo
aXRlc3BhY2Ugc2hvdWxkIGNvbGxhcHNlIHRvIHplcm8gYWR2YW5jZWQgd2lkdGggYW5kIGlnbm9y
ZWQgYXQgOjphcHBlbmRUZXh0Q29udGVudCgpLgorICAgIEFTU0VSVCghbV9oYXNGdWxseVRyaW1t
YWJsZUNvbnRlbnQpOworICAgIG1fZnVsbHlUcmltbWFibGVXaWR0aCA9IHRyaW1tYWJsZVdpZHRo
OworICAgIC8vIE5vdGUgdGhhdCBqdXN0IGJlY2F1c2UgdGhlIHRyaW1tYWJsZSB3aWR0aCBpcyAw
IChmb250LXNpemU6IDBweCksIGl0IGRvZXMgbm90IG1lYW4gd2UgZG9uJ3QgaGF2ZSBhIHRyaW1t
YWJsZSB0cmFpbGluZyBjb250ZW50LgorICAgIG1faGFzRnVsbHlUcmltbWFibGVDb250ZW50ID0g
dHJ1ZTsKKyAgICBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXggPSBtX2ZpcnN0VHJpbW1hYmxlUnVu
SW5kZXgudmFsdWVPcihydW5JbmRleCk7Cit9CisKK3ZvaWQgTGluZTo6VHJpbW1hYmxlVHJhaWxp
bmdDb250ZW50OjphZGRQYXJ0aWFsbHlUcmltbWFibGVDb250ZW50KHNpemVfdCBydW5JbmRleCwg
SW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVXaWR0aCkKK3sKKyAgICAvLyBEbyBub3QgYWRkIHRy
aW1tYWJsZSBsZXR0ZXIgc3BhY2luZyBhZnRlciBhIGZ1bGx5IHRyaW1tYWJsZSB3aGl0ZXNwYWNl
LgorICAgIEFTU0VSVCghbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4KTsKKyAgICBBU1NFUlQoIW1f
aGFzRnVsbHlUcmltbWFibGVDb250ZW50KTsKKyAgICBBU1NFUlQoIW1fcGFydGlhbGx5VHJpbW1h
YmxlV2lkdGgpOworICAgIEFTU0VSVCh0cmltbWFibGVXaWR0aCk7CisgICAgbV9wYXJ0aWFsbHlU
cmltbWFibGVXaWR0aCA9IHRyaW1tYWJsZVdpZHRoOworICAgIG1fZmlyc3RUcmltbWFibGVSdW5J
bmRleCA9IHJ1bkluZGV4OworfQorCitJbmxpbmVMYXlvdXRVbml0IExpbmU6OlRyaW1tYWJsZVRy
YWlsaW5nQ29udGVudDo6cmVtb3ZlKCkKK3sKKyAgICAvLyBSZW1vdmUgdHJpbW1hYmxlIHRyYWls
aW5nIGNvbnRlbnQgYW5kIG1vdmUgYWxsIHRoZSBzdWJzZXF1ZW50IHRyYWlsaW5nIHJ1bnMuCisg
ICAgLy8gPHNwYW4+IDwvc3Bhbj48c3Bhbj48L3NwYW4+CisgICAgLy8gW3RyYWlsaW5nIHdoaXRl
c3BhY2VdW2lubGluZSBib3ggZW5kXVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF0K
KyAgICAvLyBUcmltIHRoZSB3aGl0ZXNwYWNlIHJ1biBhbmQgbW92ZSB0aGUgdHJhaWxpbmcgaW5s
aW5lIGJveCBydW5zIHRvIHRoZSBsb2dpY2FsIGxlZnQuCisgICAgQVNTRVJUKCFpc0VtcHR5KCkp
OworICAgIGF1dG8mIHRyaW1tYWJsZVJ1biA9IG1fcnVuc1sqbV9maXJzdFRyaW1tYWJsZVJ1bklu
ZGV4XTsKKyAgICBBU1NFUlQodHJpbW1hYmxlUnVuLmlzVGV4dCgpKTsKKworICAgIGlmIChtX2hh
c0Z1bGx5VHJpbW1hYmxlQ29udGVudCkKKyAgICAgICAgdHJpbW1hYmxlUnVuLnJlbW92ZVRyYWls
aW5nV2hpdGVzcGFjZSgpOworICAgIGlmIChtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRoKQorICAg
ICAgICB0cmltbWFibGVSdW4ucmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7CisKKyAgICBh
dXRvIHRyaW1tYWJsZVdpZHRoID0gd2lkdGgoKTsKKyAgICAvLyBXaGVuIHRoZSB0cmltbWFibGUg
cnVuIGlzIGZvbGxvd2VkIGJ5IHNvbWUgbm9uLWNvbnRlbnQgcnVucywgd2UgbmVlZCB0byBhZGp1
c3QgdGhlaXIgaG9yaXpvbnRhbCBwb3NpdGlvbnMuCisgICAgLy8gZS5nLiA8ZGl2PnRleHQgaXMg
Zm9sbG93ZWQgYnkgdHJpbW1hYmxlIGNvbnRlbnQgICAgPHNwYW4+IDwvc3Bhbj48L2Rpdj4KKyAg
ICAvLyBXaGVuIHRoZSBbdGV4dC4uLl0gcnVuIGlzIHRyaW1tZWQgKHRyYWlsaW5nIHdoaXRlc3Bh
Y2UgaXMgcmVtb3ZlZCksIGJvdGggIjxzcGFuPiIgYW5kICI8L3NwYW4+IiBydW5zCisgICAgLy8g
bmVlZCB0byBiZSBtb3ZlZCBob3Jpem9udGFsbHkgdG8gY2F0Y2ggdXAgd2l0aCB0aGUgW3RleHQu
Li5dIHJ1bi4gTm90ZSB0aGF0IHRoZSB3aGl0ZXNwYWNlIGluc2lkZSB0aGUgPHNwYW4+IGRvZXMK
KyAgICAvLyBub3QgcHJvZHVjZSBhIHJ1biBzaW5jZSBpbiA6OmFwcGVuZFRleHQoKSB3ZSBzZWUg
aXQgYXMgYSBmdWxseSBjb2xsYXBzaWJsZSBydW4uCisgICAgZm9yIChhdXRvIGluZGV4ID0gKm1f
Zmlyc3RUcmltbWFibGVSdW5JbmRleCArIDE7IGluZGV4IDwgbV9ydW5zLnNpemUoKTsgKytpbmRl
eCkgeworICAgICAgICBhdXRvJiBydW4gPSBtX3J1bnNbaW5kZXhdOworICAgICAgICBBU1NFUlQo
cnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSB8fCBydW4uaXNJbmxpbmVCb3hTdGFydCgpIHx8
IHJ1bi5pc0lubGluZUJveEVuZCgpIHx8IHJ1bi5pc0xpbmVCcmVhaygpKTsKKyAgICAgICAgcnVu
Lm1vdmVIb3Jpem9udGFsbHkoLXRyaW1tYWJsZVdpZHRoKTsKKyAgICB9CisgICAgaWYgKCF0cmlt
bWFibGVSdW4udGV4dENvbnRlbnQoKS0+bGVuZ3RoKCkpIHsKKyAgICAgICAgLy8gVGhpcyB0cmlt
bWFibGUgcnVuIGlzIGZ1bGx5IGNvbGxhcHNlZCBub3cgKGUuZy4gPGRpdj48aW1nPiAgICA8c3Bh
bj48L3NwYW4+PC9kaXY+KS4KKyAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBrZWVwIGl0IGFy
b3VuZCBhbnltb3JlLgorICAgICAgICBtX3J1bnMucmVtb3ZlKCptX2ZpcnN0VHJpbW1hYmxlUnVu
SW5kZXgpOworICAgIH0KKyAgICByZXNldCgpOworICAgIHJldHVybiB0cmltbWFibGVXaWR0aDsK
K30KKworSW5saW5lTGF5b3V0VW5pdCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OnJl
bW92ZVBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQoKQoreworICAgIC8vIFBhcnRpYWxseSB0cmlt
bWFibGUgY29udGVudCBpcyBhbHdheXMgZ2F0ZWQgYnkgYSBmdWxseSB0cmltbWFibGUgY29udGVu
dC4KKyAgICAvLyBXZSBjYW4ndCBqdXN0IHRyaW0gc3BhY2luZyBpbiB0aGUgbWlkZGxlLgorICAg
IEFTU0VSVCghbV9mdWxseVRyaW1tYWJsZVdpZHRoKTsKKyAgICByZXR1cm4gcmVtb3ZlKCk7Cit9
CisKK0xpbmU6OlJ1bjo6UnVuKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxh
eW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQorICAg
IDogbV90eXBlKGlubGluZUl0ZW0udHlwZSgpKQorICAgICwgbV9sYXlvdXRCb3goJmlubGluZUl0
ZW0ubGF5b3V0Qm94KCkpCisgICAgLCBtX2xvZ2ljYWxMZWZ0KGxvZ2ljYWxMZWZ0KQorICAgICwg
bV9sb2dpY2FsV2lkdGgobG9naWNhbFdpZHRoKQoreworfQorCitMaW5lOjpSdW46OlJ1bihjb25z
dCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSYgc29mdExpbmVCcmVha0l0ZW0sIElubGluZUxheW91
dFVuaXQgbG9naWNhbExlZnQpCisgICAgOiBtX3R5cGUoc29mdExpbmVCcmVha0l0ZW0udHlwZSgp
KQorICAgICwgbV9sYXlvdXRCb3goJnNvZnRMaW5lQnJlYWtJdGVtLmxheW91dEJveCgpKQorICAg
ICwgbV9sb2dpY2FsTGVmdChsb2dpY2FsTGVmdCkKKyAgICAsIG1fdGV4dENvbnRlbnQoeyBzb2Z0
TGluZUJyZWFrSXRlbS5wb3NpdGlvbigpLCAxLCBzb2Z0TGluZUJyZWFrSXRlbS5pbmxpbmVUZXh0
Qm94KCkuY29udGVudCgpIH0pCit7Cit9CisKK0xpbmU6OlJ1bjo6UnVuKGNvbnN0IElubGluZVRl
eHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCisgICAgOiBtX3R5cGUoSW5saW5lSXRlbTo6VHlw
ZTo6VGV4dCkKKyAgICAsIG1fbGF5b3V0Qm94KCZpbmxpbmVUZXh0SXRlbS5sYXlvdXRCb3goKSkK
KyAgICAsIG1fbG9naWNhbExlZnQobG9naWNhbExlZnQpCisgICAgLCBtX2xvZ2ljYWxXaWR0aChs
b2dpY2FsV2lkdGgpCisgICAgLCBtX3doaXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9ydHVuaXR5KCFU
ZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtLmxheW91
dEJveCgpKSkKKyAgICAsIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSh0cmFpbGluZ1doaXRlc3Bh
Y2VUeXBlKGlubGluZVRleHRJdGVtKSkKKyAgICAsIG1fdGV4dENvbnRlbnQoeyBpbmxpbmVUZXh0
SXRlbS5zdGFydCgpLCBtX3RyYWlsaW5nV2hpdGVzcGFjZVR5cGUgPT0gVHJhaWxpbmdXaGl0ZXNw
YWNlOjpDb2xsYXBzZWQgPyAxIDogaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCksIGlubGluZVRleHRJ
dGVtLmlubGluZVRleHRCb3goKS5jb250ZW50KCkgfSkKK3sKKyAgICBpZiAobV90cmFpbGluZ1do
aXRlc3BhY2VUeXBlICE9IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSkgeworICAgICAgICBtX3Ry
YWlsaW5nV2hpdGVzcGFjZVdpZHRoID0gbG9naWNhbFdpZHRoOworICAgICAgICBpZiAobV93aGl0
ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1bml0eSkKKyAgICAgICAgICAgIG1fZXhwYW5zaW9uT3Bw
b3J0dW5pdHlDb3VudCA9IDE7CisgICAgfQorfQorCit2b2lkIExpbmU6OlJ1bjo6ZXhwYW5kKGNv
bnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dp
Y2FsV2lkdGgpCit7CisgICAgLy8gRklYTUU6IFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBleHBhbnNp
b24gbWVyZ2UuIFdlIHNob3VsZCBldmVudHVhbGx5IHN3aXRjaCBvdmVyIHRvIEZvbnRDYXNjYWRl
OjpleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LgorICAgIEFTU0VSVCghaGFzQ29sbGFwc2VkVHJh
aWxpbmdXaGl0ZXNwYWNlKCkpOworICAgIEFTU0VSVChpc1RleHQoKSAmJiBpbmxpbmVUZXh0SXRl
bS5pc1RleHQoKSk7CisgICAgQVNTRVJUKG1fbGF5b3V0Qm94ID09ICZpbmxpbmVUZXh0SXRlbS5s
YXlvdXRCb3goKSk7CisKKyAgICBtX2xvZ2ljYWxXaWR0aCArPSBsb2dpY2FsV2lkdGg7CisgICAg
bV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID0gdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZShpbmxpbmVU
ZXh0SXRlbSk7CisKKyAgICBpZiAobV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID09IFRyYWlsaW5n
V2hpdGVzcGFjZTo6Tm9uZSkgeworICAgICAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0g
eyB9OworICAgICAgICBzZXRFeHBhbnNpb25CZWhhdmlvcihBbGxvd0xlZnRFeHBhbnNpb24gfCBB
bGxvd1JpZ2h0RXhwYW5zaW9uKTsKKyAgICAgICAgbV90ZXh0Q29udGVudC0+ZXhwYW5kKGlubGlu
ZVRleHRJdGVtLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX3RyYWls
aW5nV2hpdGVzcGFjZVdpZHRoICs9IGxvZ2ljYWxXaWR0aDsKKyAgICBpZiAobV93aGl0ZXNwYWNl
SXNFeHBhbnNpb25PcHBvcnR1bml0eSkKKyAgICAgICAgKyttX2V4cGFuc2lvbk9wcG9ydHVuaXR5
Q291bnQ7CisgICAgc2V0RXhwYW5zaW9uQmVoYXZpb3IoRGVmYXVsdEV4cGFuc2lvbik7CisgICAg
bV90ZXh0Q29udGVudC0+ZXhwYW5kKG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9PSBUcmFpbGlu
Z1doaXRlc3BhY2U6OkNvbGxhcHNlZCA/IDEgOiBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSk7Cit9
CisKK2Jvb2wgTGluZTo6UnVuOjpoYXNUcmFpbGluZ0xldHRlclNwYWNpbmcoKSBjb25zdAorewor
ICAgIHJldHVybiAhaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkgJiYgc3R5bGUoKS5sZXR0ZXJTcGFj
aW5nKCkgPiAwOworfQorCitJbmxpbmVMYXlvdXRVbml0IExpbmU6OlJ1bjo6dHJhaWxpbmdMZXR0
ZXJTcGFjaW5nKCkgY29uc3QKK3sKKyAgICBpZiAoIWhhc1RyYWlsaW5nTGV0dGVyU3BhY2luZygp
KQorICAgICAgICByZXR1cm4geyB9OworICAgIHJldHVybiBJbmxpbmVMYXlvdXRVbml0IHsgc3R5
bGUoKS5sZXR0ZXJTcGFjaW5nKCkgfTsKK30KKwordm9pZCBMaW5lOjpSdW46OnJlbW92ZVRyYWls
aW5nTGV0dGVyU3BhY2luZygpCit7CisgICAgQVNTRVJUKGhhc1RyYWlsaW5nTGV0dGVyU3BhY2lu
ZygpKTsKKyAgICBzaHJpbmtIb3Jpem9udGFsbHkodHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkpOwor
ICAgIEFTU0VSVChsb2dpY2FsV2lkdGgoKSA+IDAgfHwgKCFsb2dpY2FsV2lkdGgoKSAmJiBzdHls
ZSgpLmxldHRlclNwYWNpbmcoKSA+PSBzdGF0aWNfY2FzdDxmbG9hdD4oaW50TWF4Rm9yTGF5b3V0
VW5pdCkpKTsKK30KKwordm9pZCBMaW5lOjpSdW46OnJlbW92ZVRyYWlsaW5nV2hpdGVzcGFjZSgp
Cit7CisgICAgLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0z
LyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eSBtYXRyaXgKKyAgICAvLyBUcmltbWFibGUgd2hpdGVzcGFj
ZSBpcyBhbHdheXMgY29sbGFwc2libGUgc28gdGhlIGxlbmd0aCBvZiB0aGUgdHJhaWxpbmcgdHJp
bW1hYmxlIHdoaXRlc3BhY2UgaXMgYWx3YXlzIDEgKG9yIG5vbi1leGlzdGVudCkuCisgICAgQVNT
RVJUKG1fdGV4dENvbnRlbnQtPmxlbmd0aCgpKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IHRyYWls
aW5nVHJpbW1hYmxlQ29udGVudExlbmd0aCA9IDE7CisgICAgbV90ZXh0Q29udGVudC0+c2hyaW5r
KHRyYWlsaW5nVHJpbW1hYmxlQ29udGVudExlbmd0aCk7CisgICAgdmlzdWFsbHlDb2xsYXBzZVRy
YWlsaW5nV2hpdGVzcGFjZSgpOworfQorCit2b2lkIExpbmU6OlJ1bjo6dmlzdWFsbHlDb2xsYXBz
ZVRyYWlsaW5nV2hpdGVzcGFjZSgpCit7CisgICAgLy8gVGhpcyBpcyBqdXN0IGEgdmlzdWFsIGFk
anVzdG1lbnQsIHRoZSB0ZXh0IGxlbmd0aCBzaG91bGQgcmVtYWluIHRoZSBzYW1lLgorICAgIHNo
cmlua0hvcml6b250YWxseShtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKTsKKyAgICBtX3RyYWls
aW5nV2hpdGVzcGFjZVdpZHRoID0geyB9OworICAgIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9
IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZTsKKworICAgIGlmIChtX3doaXRlc3BhY2VJc0V4cGFu
c2lvbk9wcG9ydHVuaXR5KSB7CisgICAgICAgIEFTU0VSVChtX2V4cGFuc2lvbk9wcG9ydHVuaXR5
Q291bnQpOworICAgICAgICBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQtLTsKKyAgICB9Cisg
ICAgc2V0RXhwYW5zaW9uQmVoYXZpb3IoQWxsb3dMZWZ0RXhwYW5zaW9uIHwgQWxsb3dSaWdodEV4
cGFuc2lvbik7Cit9CisKK3ZvaWQgTGluZTo6UnVuOjpzZXRFeHBhbnNpb25CZWhhdmlvcihFeHBh
bnNpb25CZWhhdmlvciBleHBhbnNpb25CZWhhdmlvcikKK3sKKyAgICBBU1NFUlQoaXNUZXh0KCkp
OworICAgIG1fZXhwYW5zaW9uLmJlaGF2aW9yID0gZXhwYW5zaW9uQmVoYXZpb3I7Cit9CisKK0V4
cGFuc2lvbkJlaGF2aW9yIExpbmU6OlJ1bjo6ZXhwYW5zaW9uQmVoYXZpb3IoKSBjb25zdAorewor
ICAgIEFTU0VSVChpc1RleHQoKSk7CisgICAgcmV0dXJuIG1fZXhwYW5zaW9uLmJlaGF2aW9yOwor
fQorCit2b2lkIExpbmU6OlJ1bjo6c2V0SG9yaXpvbnRhbEV4cGFuc2lvbihJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxFeHBhbnNpb24pCit7CisgICAgQVNTRVJUKGlzVGV4dCgpKTsKKyAgICBBU1NF
UlQoaGFzRXhwYW5zaW9uT3Bwb3J0dW5pdHkoKSk7CisgICAgbV9leHBhbnNpb24uaG9yaXpvbnRh
bEV4cGFuc2lvbiA9IGxvZ2ljYWxFeHBhbnNpb247Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZv
cm1hdHRpbmcvSW5saW5lTGluZS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mZTMzNTE5
NTIxYWE5ZTRmOTZhNzkzNGFlZDhjMDMyY2M5ZTc5M2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUxpbmUuaApAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
KyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgor
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQor
CisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxp
bmVJdGVtLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZVJ1bi5oIgorI2luY2x1ZGUgIklubGluZVRl
eHRJdGVtLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitj
bGFzcyBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKK2NsYXNzIElubGluZVNvZnRMaW5lQnJlYWtJ
dGVtOworCitjbGFzcyBMaW5lIHsKK3B1YmxpYzoKKyAgICBMaW5lKGNvbnN0IElubGluZUZvcm1h
dHRpbmdDb250ZXh0Jik7CisgICAgfkxpbmUoKTsKKworICAgIHZvaWQgaW5pdGlhbGl6ZSgpOwor
CisgICAgdm9pZCBhcHBlbmQoY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9n
aWNhbFdpZHRoKTsKKworICAgIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCgp
IGNvbnN0IHsgcmV0dXJuIG1fY29udGVudExvZ2ljYWxXaWR0aDsgfQorICAgIElubGluZUxheW91
dFVuaXQgY29udGVudExvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fcnVucy5pc0VtcHR5
KCkgPyAwLjBmIDogbV9ydW5zLmxhc3QoKS5sb2dpY2FsUmlnaHQoKTsgfQorICAgIHNpemVfdCBu
b25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQoKSBjb25zdCB7IHJldHVybiBtX25vblNwYW5u
aW5nSW5saW5lTGV2ZWxCb3hDb3VudDsgfQorCisgICAgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFi
bGVUcmFpbGluZ1dpZHRoKCkgY29uc3QgeyByZXR1cm4gbV90cmltbWFibGVUcmFpbGluZ0NvbnRl
bnQud2lkdGgoKTsgfQorICAgIGJvb2wgaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxlKCkgY29u
c3QgeyByZXR1cm4gbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuaXNUcmFpbGluZ1J1bkZ1bGx5
VHJpbW1hYmxlKCk7IH0KKworICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHRyYWlsaW5n
U29mdEh5cGhlbldpZHRoKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0
aDsgfQorICAgIHZvaWQgYWRkVHJhaWxpbmdIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBoeXBoZW5M
b2dpY2FsV2lkdGgpOworCisgICAgdm9pZCByZW1vdmVDb2xsYXBzaWJsZUNvbnRlbnQoSW5saW5l
TGF5b3V0VW5pdCBleHRyYUhvcml6b250YWxTcGFjZSk7CisgICAgdm9pZCBhcHBseVJ1bkV4cGFu
c2lvbihJbmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKTsKKworICAgIHN0cnVj
dCBSdW4geworICAgICAgICBib29sIGlzVGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJ
bmxpbmVJdGVtOjpUeXBlOjpUZXh0OyB9CisgICAgICAgIGJvb2wgaXNCb3goKSBjb25zdCB7IHJl
dHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6Qm94OyB9CisgICAgICAgIGJvb2wgaXNM
aW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiBpc0hhcmRMaW5lQnJlYWsoKSB8fCBpc1NvZnRMaW5l
QnJlYWsoKTsgfQorICAgICAgICBib29sIGlzU29mdExpbmVCcmVhaygpIGNvbnN0ICB7IHJldHVy
biBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6U29mdExpbmVCcmVhazsgfQorICAgICAgICBi
b29sIGlzSGFyZExpbmVCcmVhaygpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVt
OjpUeXBlOjpIYXJkTGluZUJyZWFrOyB9CisgICAgICAgIGJvb2wgaXNXb3JkQnJlYWtPcHBvcnR1
bml0eSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpUeXBlOjpXb3JkQnJl
YWtPcHBvcnR1bml0eTsgfQorICAgICAgICBib29sIGlzSW5saW5lQm94U3RhcnQoKSBjb25zdCB7
IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94U3RhcnQ7IH0KKyAg
ICAgICAgYm9vbCBpc0lubGluZUJveEVuZCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxp
bmVJdGVtOjpUeXBlOjpJbmxpbmVCb3hFbmQ7IH0KKworICAgICAgICBjb25zdCBCb3gmIGxheW91
dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQorICAgICAgICBjb25zdCBSZW5k
ZXJTdHlsZSYgc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJveC0+c3R5bGUoKTsgfQor
ICAgICAgICBjb25zdCBPcHRpb25hbDxMaW5lUnVuOjpUZXh0PiYgdGV4dENvbnRlbnQoKSBjb25z
dCB7IHJldHVybiBtX3RleHRDb250ZW50OyB9CisKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBs
b2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxXaWR0aDsgfQorICAgICAgICBJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsTGVm
dDsgfQorICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0
dXJuIGxvZ2ljYWxMZWZ0KCkgKyBsb2dpY2FsV2lkdGgoKTsgfQorCisgICAgICAgIGNvbnN0IExp
bmVSdW46OkV4cGFuc2lvbiYgZXhwYW5zaW9uKCkgY29uc3QgeyByZXR1cm4gbV9leHBhbnNpb247
IH0KKyAgICAgICAgYm9vbCBoYXNFeHBhbnNpb25PcHBvcnR1bml0eSgpIGNvbnN0IHsgcmV0dXJu
IG1fZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudDsgfQorICAgICAgICBFeHBhbnNpb25CZWhhdmlv
ciBleHBhbnNpb25CZWhhdmlvcigpIGNvbnN0OworICAgICAgICB1bnNpZ25lZCBleHBhbnNpb25P
cHBvcnR1bml0eUNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9leHBhbnNpb25PcHBvcnR1bml0eUNv
dW50OyB9CisKKyAgICAgICAgYm9vbCBoYXNUcmFpbGluZ1doaXRlc3BhY2UoKSBjb25zdCB7IHJl
dHVybiBtX3RyYWlsaW5nV2hpdGVzcGFjZVR5cGUgIT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25l
OyB9CisgICAgICAgIElubGluZUxheW91dFVuaXQgdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoKSBj
b25zdCB7IHJldHVybiBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoOyB9CisKKyAgICBwcml2YXRl
OgorICAgICAgICBmcmllbmQgY2xhc3MgTGluZTsKKworICAgICAgICBSdW4oY29uc3QgSW5saW5l
VGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0
IGxvZ2ljYWxXaWR0aCk7CisgICAgICAgIFJ1bihjb25zdCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRl
bSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQpOworICAgICAgICBSdW4oY29uc3QgSW5s
aW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQg
bG9naWNhbFdpZHRoKTsKKworICAgICAgICB2b2lkIGV4cGFuZChjb25zdCBJbmxpbmVUZXh0SXRl
bSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICAgICAgdm9pZCBtb3ZlSG9y
aXpvbnRhbGx5KElubGluZUxheW91dFVuaXQgb2Zmc2V0KSB7IG1fbG9naWNhbExlZnQgKz0gb2Zm
c2V0OyB9CisgICAgICAgIHZvaWQgc2hyaW5rSG9yaXpvbnRhbGx5KElubGluZUxheW91dFVuaXQg
d2lkdGgpIHsgbV9sb2dpY2FsV2lkdGggLT0gd2lkdGg7IH0KKyAgICAgICAgdm9pZCBzZXRFeHBh
bnNpb25CZWhhdmlvcihFeHBhbnNpb25CZWhhdmlvcik7CisgICAgICAgIHZvaWQgc2V0SG9yaXpv
bnRhbEV4cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxFeHBhbnNpb24pOworICAgICAg
ICB2b2lkIHNldE5lZWRzSHlwaGVuKElubGluZUxheW91dFVuaXQgaHlwaGVuTG9naWNhbFdpZHRo
KTsKKworICAgICAgICBlbnVtIGNsYXNzIFRyYWlsaW5nV2hpdGVzcGFjZSB7CisgICAgICAgICAg
ICBOb25lLAorICAgICAgICAgICAgTm90Q29sbGFwc2libGUsCisgICAgICAgICAgICBDb2xsYXBz
aWJsZSwKKyAgICAgICAgICAgIENvbGxhcHNlZAorICAgICAgICB9OworICAgICAgICBib29sIGhh
c0NvbGxhcHNpYmxlVHJhaWxpbmdXaGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGlu
Z1doaXRlc3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Q29sbGFwc2libGUgfHwgaGFz
Q29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCk7IH0KKyAgICAgICAgYm9vbCBoYXNDb2xsYXBz
ZWRUcmFpbGluZ1doaXRlc3BhY2UoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nV2hpdGVzcGFj
ZVR5cGUgPT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQ7IH0KKyAgICAgICAgVHJhaWxp
bmdXaGl0ZXNwYWNlIHRyYWlsaW5nV2hpdGVzcGFjZVR5cGUoY29uc3QgSW5saW5lVGV4dEl0ZW0m
KSBjb25zdDsKKyAgICAgICAgdm9pZCByZW1vdmVUcmFpbGluZ1doaXRlc3BhY2UoKTsKKyAgICAg
ICAgdm9pZCB2aXN1YWxseUNvbGxhcHNlVHJhaWxpbmdXaGl0ZXNwYWNlKCk7CisKKyAgICAgICAg
Ym9vbCBoYXNUcmFpbGluZ0xldHRlclNwYWNpbmcoKSBjb25zdDsKKyAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCB0cmFpbGluZ0xldHRlclNwYWNpbmcoKSBjb25zdDsKKyAgICAgICAgdm9pZCByZW1v
dmVUcmFpbGluZ0xldHRlclNwYWNpbmcoKTsKKworICAgICAgICBJbmxpbmVJdGVtOjpUeXBlIG1f
dHlwZSB7IElubGluZUl0ZW06OlR5cGU6OlRleHQgfTsKKyAgICAgICAgY29uc3QgQm94KiBtX2xh
eW91dEJveCB7IG51bGxwdHIgfTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2xvZ2ljYWxM
ZWZ0IHsgMCB9OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fbG9naWNhbFdpZHRoIHsgMCB9
OworICAgICAgICBib29sIG1fd2hpdGVzcGFjZUlzRXhwYW5zaW9uT3Bwb3J0dW5pdHkgeyBmYWxz
ZSB9OworICAgICAgICBUcmFpbGluZ1doaXRlc3BhY2UgbV90cmFpbGluZ1doaXRlc3BhY2VUeXBl
IHsgVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25lIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQg
bV90cmFpbGluZ1doaXRlc3BhY2VXaWR0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8TGluZVJ1
bjo6VGV4dD4gbV90ZXh0Q29udGVudDsKKyAgICAgICAgTGluZVJ1bjo6RXhwYW5zaW9uIG1fZXhw
YW5zaW9uOworICAgICAgICB1bnNpZ25lZCBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQgeyAw
IH07CisgICAgfTsKKyAgICB1c2luZyBSdW5MaXN0ID0gVmVjdG9yPFJ1biwgMTA+OworICAgIGNv
bnN0IFJ1bkxpc3QmIHJ1bnMoKSBjb25zdCB7IHJldHVybiBtX3J1bnM7IH0KKworcHJpdmF0ZToK
KyAgICB2b2lkIGFwcGVuZE5vbkJyZWFrYWJsZVNwYWNlKGNvbnN0IElubGluZUl0ZW0mLCBJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7
CisgICAgdm9pZCBhcHBlbmRUZXh0Q29udGVudChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIElubGlu
ZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICB2b2lkIGFwcGVuZE5vblJlcGxhY2VkSW5s
aW5lTGV2ZWxCb3goY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94
TG9naWNhbFdpZHRoKTsKKyAgICB2b2lkIGFwcGVuZFJlcGxhY2VkSW5saW5lTGV2ZWxCb3goY29u
c3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKTsK
KyAgICB2b2lkIGFwcGVuZElubGluZUJveFN0YXJ0KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7CisgICAgdm9pZCBhcHBlbmRJbmxpbmVCb3hFbmQoY29u
c3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICB2b2lk
IGFwcGVuZExpbmVCcmVhayhjb25zdCBJbmxpbmVJdGVtJik7CisgICAgdm9pZCBhcHBlbmRXb3Jk
QnJlYWtPcHBvcnR1bml0eShjb25zdCBJbmxpbmVJdGVtJik7CisKKyAgICB2b2lkIHJlbW92ZVRy
YWlsaW5nVHJpbW1hYmxlQ29udGVudCgpOworICAgIHZvaWQgdmlzdWFsbHlDb2xsYXBzZVByZVdy
YXBPdmVyZmxvd0NvbnRlbnQoSW5saW5lTGF5b3V0VW5pdCBleHRyYUhvcml6b250YWxTcGFjZSk7
CisKKyAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQo
KSBjb25zdDsKKworICAgIHN0cnVjdCBUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQgeworICAgICAg
ICBUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQoUnVuTGlzdCYpOworCisgICAgICAgIHZvaWQgYWRk
RnVsbHlUcmltbWFibGVDb250ZW50KHNpemVfdCBydW5JbmRleCwgSW5saW5lTGF5b3V0VW5pdCB0
cmltbWFibGVXaWR0aCk7CisgICAgICAgIHZvaWQgYWRkUGFydGlhbGx5VHJpbW1hYmxlQ29udGVu
dChzaXplX3QgcnVuSW5kZXgsIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpOworICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IHJlbW92ZSgpOworICAgICAgICBJbmxpbmVMYXlvdXRVbml0
IHJlbW92ZVBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQoKTsKKworICAgICAgICBJbmxpbmVMYXlv
dXRVbml0IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9mdWxseVRyaW1tYWJsZVdpZHRoICsgbV9w
YXJ0aWFsbHlUcmltbWFibGVXaWR0aDsgfQorICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7
IHJldHVybiAhbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4Lmhhc1ZhbHVlKCk7IH0KKyAgICAgICAg
Ym9vbCBpc1RyYWlsaW5nUnVuRnVsbHlUcmltbWFibGUoKSBjb25zdCB7IHJldHVybiBtX2hhc0Z1
bGx5VHJpbW1hYmxlQ29udGVudDsgfQorICAgICAgICBib29sIGlzVHJhaWxpbmdSdW5QYXJ0aWFs
bHlUcmltbWFibGUoKSBjb25zdCB7IHJldHVybiBtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRoOyB9
CisKKyAgICAgICAgdm9pZCByZXNldCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUnVuTGlz
dCYgbV9ydW5zOworICAgICAgICBPcHRpb25hbDxzaXplX3Q+IG1fZmlyc3RUcmltbWFibGVSdW5J
bmRleDsKKyAgICAgICAgYm9vbCBtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCB7IGZhbHNlIH07
CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9mdWxseVRyaW1tYWJsZVdpZHRoIHsgMCB9Owor
ICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGggeyAwIH07
CisgICAgfTsKKworICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBtX2lubGluZUZv
cm1hdHRpbmdDb250ZXh0OworICAgIFJ1bkxpc3QgbV9ydW5zOworICAgIFRyaW1tYWJsZVRyYWls
aW5nQ29udGVudCBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudDsKKyAgICBJbmxpbmVMYXlvdXRV
bml0IG1fY29udGVudExvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICBzaXplX3QgbV9ub25TcGFubmlu
Z0lubGluZUxldmVsQm94Q291bnQgeyAwIH07CisgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5p
dD4gbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCB7IDAgfTsKK307CisKK2lubGluZSB2b2lkIExp
bmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6cmVzZXQoKQoreworICAgIG1faGFzRnVsbHlU
cmltbWFibGVDb250ZW50ID0gZmFsc2U7CisgICAgbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4ID0g
eyB9OworICAgIG1fZnVsbHlUcmltbWFibGVXaWR0aCA9IHsgfTsKKyAgICBtX3BhcnRpYWxseVRy
aW1tYWJsZVdpZHRoID0geyB9OworfQorCitpbmxpbmUgTGluZTo6UnVuOjpUcmFpbGluZ1doaXRl
c3BhY2UgTGluZTo6UnVuOjp0cmFpbGluZ1doaXRlc3BhY2VUeXBlKGNvbnN0IElubGluZVRleHRJ
dGVtJiBpbmxpbmVUZXh0SXRlbSkgY29uc3QKK3sKKyAgICBpZiAoIWlubGluZVRleHRJdGVtLmlz
V2hpdGVzcGFjZSgpKQorICAgICAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25lOwor
ICAgIGlmIChJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGlu
ZVRleHRJdGVtKSkKKyAgICAgICAgcmV0dXJuIFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm90Q29sbGFw
c2libGU7CisgICAgaWYgKGlubGluZVRleHRJdGVtLmxlbmd0aCgpID09IDEpCisgICAgICAgIHJl
dHVybiBUcmFpbGluZ1doaXRlc3BhY2U6OkNvbGxhcHNpYmxlOworICAgIHJldHVybiBUcmFpbGlu
Z1doaXRlc3BhY2U6OkNvbGxhcHNlZDsKK30KKworaW5saW5lIHZvaWQgTGluZTo6UnVuOjpzZXRO
ZWVkc0h5cGhlbihJbmxpbmVMYXlvdXRVbml0IGh5cGhlbkxvZ2ljYWxXaWR0aCkKK3sKKyAgICBB
U1NFUlQobV90ZXh0Q29udGVudCk7CisgICAgbV90ZXh0Q29udGVudC0+c2V0TmVlZHNIeXBoZW4o
KTsKKyAgICBtX2xvZ2ljYWxXaWR0aCArPSBoeXBoZW5Mb2dpY2FsV2lkdGg7Cit9CisKK30KK30K
KyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250
ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3gu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLmVkMjEzYWUwMWNhYTM5NWE3OTg0MjExOGI5OTk3MjMxZThkMjBlMjkK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5jcHAKQEAgLTAsMCArMSwxNzQgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJv
eC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRl
ICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworTGluZUJveDo6SW5s
aW5lTGV2ZWxCb3g6OklubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIGxvZ2ljYWxTaXplLCBUeXBl
IHR5cGUpCisgICAgOiBtX2xheW91dEJveChtYWtlV2Vha1B0cihsYXlvdXRCb3gpKQorICAgICwg
bV9sb2dpY2FsUmVjdCh7IH0sIGxvZ2ljYWxMZWZ0LCBsb2dpY2FsU2l6ZS53aWR0aCgpLCBsb2dp
Y2FsU2l6ZS5oZWlnaHQoKSkKKyAgICAsIG1fdHlwZSh0eXBlKQoreworfQorCit2b2lkIExpbmVC
b3g6OklubGluZUxldmVsQm94OjpzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5l
KQoreworICAgIC8vIEZJWE1FOiBSZW1vdmUgbGVnYWN5IHJvdW5kaW5nLgorICAgIG1fYmFzZWxp
bmUgPSByb3VuZFRvSW50KGJhc2VsaW5lKTsKK30KKwordm9pZCBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveDo6c2V0RGVzY2VudChJbmxpbmVMYXlvdXRVbml0IGRlc2NlbnQpCit7CisgICAgLy8gRklY
TUU6IFJlbW92ZSBsZWdhY3kgcm91bmRpbmcuCisgICAgbV9kZXNjZW50ID0gcm91bmRUb0ludChk
ZXNjZW50KTsKK30KKwordm9pZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0TGF5b3V0Qm91
bmRzKGNvbnN0IExheW91dEJvdW5kcyYgbGF5b3V0Qm91bmRzKQoreworICAgIC8vIEZJWE1FOiBS
ZW1vdmUgbGVnYWN5IHJvdW5kaW5nLgorICAgIG1fbGF5b3V0Qm91bmRzID0geyBJbmxpbmVMYXlv
dXRVbml0KHJvdW5kVG9JbnQobGF5b3V0Qm91bmRzLmFzY2VudCkpLCBJbmxpbmVMYXlvdXRVbml0
KHJvdW5kVG9JbnQobGF5b3V0Qm91bmRzLmRlc2NlbnQpKSB9OworfQorCit2b2lkIExpbmVCb3g6
OklubGluZUxldmVsQm94OjpzZXRMb2dpY2FsVG9wKElubGluZUxheW91dFVuaXQgbG9naWNhbFRv
cCkKK3sKKyAgICAvLyBGSVhNRTogUmVtb3ZlIGxlZ2FjeSByb3VuZGluZy4KKyAgICBtX2xvZ2lj
YWxSZWN0LnNldFRvcChyb3VuZFRvSW50KGxvZ2ljYWxUb3ApKTsKK30KKwordm9pZCBMaW5lQm94
OjpJbmxpbmVMZXZlbEJveDo6c2V0TG9naWNhbEhlaWdodChJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxIZWlnaHQpCit7CisgICAgLy8gRklYTUU6IFJlbW92ZSBsZWdhY3kgcm91bmRpbmcuCisgICAg
bV9sb2dpY2FsUmVjdC5zZXRIZWlnaHQocm91bmRUb0ludChsb2dpY2FsSGVpZ2h0KSk7Cit9CisK
K3ZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldEhhc0NvbnRlbnQoKQoreworICAgIEFT
U0VSVChpc0lubGluZUJveCgpKTsKKyAgICBtX2hhc0NvbnRlbnQgPSB0cnVlOworfQorCitib29s
IExpbmVCb3g6OklubGluZUxldmVsQm94OjpoYXNMaW5lQm94UmVsYXRpdmVBbGlnbm1lbnQoKSBj
b25zdAoreworICAgIGF1dG8gdmVydGljYWxBbGlnbm1lbnQgPSBsYXlvdXRCb3goKS5zdHlsZSgp
LnZlcnRpY2FsQWxpZ24oKTsKKyAgICByZXR1cm4gdmVydGljYWxBbGlnbm1lbnQgPT0gVmVydGlj
YWxBbGlnbjo6VG9wIHx8IHZlcnRpY2FsQWxpZ25tZW50ID09IFZlcnRpY2FsQWxpZ246OkJvdHRv
bTsKK30KKworTGluZUJveDo6TGluZUJveChjb25zdCBCb3gmIHJvb3RMYXlvdXRCb3gsIGNvbnN0
IElubGluZUxheW91dFBvaW50JiBsb2dpY2FsVG9wbGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsaW5l
TG9naWNhbFdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCwgSW5saW5l
TGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoLCBzaXplX3Qgbm9uU3Bhbm5pbmdJbmxpbmVM
ZXZlbEJveENvdW50KQorICAgIDogbV9sb2dpY2FsUmVjdChsb2dpY2FsVG9wbGVmdCwgSW5saW5l
TGF5b3V0U2l6ZSB7IGxpbmVMb2dpY2FsV2lkdGgsIHsgfSB9KQorICAgICwgbV9jb250ZW50TG9n
aWNhbFdpZHRoKGNvbnRlbnRMb2dpY2FsV2lkdGgpCisgICAgLCBtX3Jvb3RJbmxpbmVCb3gocm9v
dExheW91dEJveCwgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgY29udGVu
dExvZ2ljYWxXaWR0aCwgeyB9IH0sIElubGluZUxldmVsQm94OjpUeXBlOjpSb290SW5saW5lQm94
KQoreworICAgIG1fbm9uUm9vdElubGluZUxldmVsQm94TGlzdC5yZXNlcnZlSW5pdGlhbENhcGFj
aXR5KG5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCk7CisgICAgbV9ub25Sb290SW5saW5l
TGV2ZWxCb3hNYXAucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShub25TcGFubmluZ0lubGluZUxldmVs
Qm94Q291bnQpOworfQorCit2b2lkIExpbmVCb3g6OmFkZElubGluZUxldmVsQm94KElubGluZUxl
dmVsQm94JiYgaW5saW5lTGV2ZWxCb3gpCit7CisgICAgbV9ib3hUeXBlcy5hZGQoaW5saW5lTGV2
ZWxCb3gudHlwZSgpKTsKKyAgICBtX25vblJvb3RJbmxpbmVMZXZlbEJveE1hcC5zZXQoJmlubGlu
ZUxldmVsQm94LmxheW91dEJveCgpLCBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Quc2l6ZSgp
KTsKKyAgICBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3QuYXBwZW5kKFdURk1vdmUoaW5saW5l
TGV2ZWxCb3gpKTsKK30KKworSW5saW5lUmVjdCBMaW5lQm94Ojpsb2dpY2FsUmVjdEZvclRleHRS
dW4oY29uc3QgTGluZTo6UnVuJiBydW4pIGNvbnN0Cit7CisgICAgQVNTRVJUKHJ1bi5pc1RleHQo
KSB8fCBydW4uaXNTb2Z0TGluZUJyZWFrKCkpOworICAgIGF1dG8qIHBhcmVudElubGluZUJveCA9
ICZpbmxpbmVMZXZlbEJveEZvckxheW91dEJveChydW4ubGF5b3V0Qm94KCkucGFyZW50KCkpOwor
ICAgIEFTU0VSVChwYXJlbnRJbmxpbmVCb3gtPmlzSW5saW5lQm94KCkpOworICAgIGF1dG8mIGZv
bnRNZXRyaWNzID0gcGFyZW50SW5saW5lQm94LT5zdHlsZSgpLmZvbnRNZXRyaWNzKCk7CisgICAg
YXV0byBydW5sb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LT5sb2dpY2FsVG9wKCkgKyBwYXJl
bnRJbmxpbmVCb3gtPmJhc2VsaW5lKCkgLSBmb250TWV0cmljcy5hc2NlbnQoKTsKKworICAgIHdo
aWxlIChwYXJlbnRJbmxpbmVCb3ggIT0gJm1fcm9vdElubGluZUJveCAmJiAhcGFyZW50SW5saW5l
Qm94LT5oYXNMaW5lQm94UmVsYXRpdmVBbGlnbm1lbnQoKSkgeworICAgICAgICBwYXJlbnRJbmxp
bmVCb3ggPSAmaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3gocGFyZW50SW5saW5lQm94LT5sYXlv
dXRCb3goKS5wYXJlbnQoKSk7CisgICAgICAgIEFTU0VSVChwYXJlbnRJbmxpbmVCb3gtPmlzSW5s
aW5lQm94KCkpOworICAgICAgICBydW5sb2dpY2FsVG9wICs9IHBhcmVudElubGluZUJveC0+bG9n
aWNhbFRvcCgpOworICAgIH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQgPSBm
b250TWV0cmljcy5oZWlnaHQoKTsKKyAgICByZXR1cm4geyBydW5sb2dpY2FsVG9wLCBtX3Jvb3RJ
bmxpbmVCb3gubG9naWNhbExlZnQoKSArIHJ1bi5sb2dpY2FsTGVmdCgpLCBydW4ubG9naWNhbFdp
ZHRoKCksIGxvZ2ljYWxIZWlnaHQgfTsKK30KKworSW5saW5lUmVjdCBMaW5lQm94Ojpsb2dpY2Fs
UmVjdEZvckxpbmVCcmVha0JveChjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBB
U1NFUlQobGF5b3V0Qm94LmlzTGluZUJyZWFrQm94KCkpOworICAgIHJldHVybiBsb2dpY2FsUmVj
dEZvcklubGluZUxldmVsQm94KGxheW91dEJveCk7Cit9CisKK0lubGluZVJlY3QgTGluZUJveDo6
bG9naWNhbFJlY3RGb3JJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QK
K3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5saW5lTGV2ZWxCb3goKSB8fCBsYXlvdXRCb3gu
aXNMaW5lQnJlYWtCb3goKSk7CisgICAgLy8gSW5saW5lIGxldmVsIGJveGVzIGFyZSByZWxhdGl2
ZSB0byB0aGVpciBwYXJlbnQgdW5sZXNzIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgbWFrZXMgdGhl
bSByZWxhdGl2ZSB0byB0aGUgbGluZSBib3ggKGUuZy4gdG9wLCBib3R0b20pLgorICAgIGF1dG8q
IGlubGluZUJveCA9ICZpbmxpbmVMZXZlbEJveEZvckxheW91dEJveChsYXlvdXRCb3gpOworICAg
IGF1dG8gaW5saW5lQm94TG9naWNhbFJlY3QgPSBpbmxpbmVCb3gtPmxvZ2ljYWxSZWN0KCk7Cisg
ICAgaWYgKGlubGluZUJveC0+aGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpCisgICAgICAg
IHJldHVybiBpbmxpbmVCb3hMb2dpY2FsUmVjdDsKKworICAgIC8vIEZhc3QgcGF0aCBmb3IgaW5s
aW5lIGxldmVsIGJveGVzIG9uIHRoZSByb290IGlubGluZSBib3ggKGUuZyA8ZGl2PjxpbWc+PC9k
aXY+KS4KKyAgICBpZiAoJmxheW91dEJveC5wYXJlbnQoKSA9PSAmbV9yb290SW5saW5lQm94Lmxh
eW91dEJveCgpKSB7CisgICAgICAgIGlubGluZUJveExvZ2ljYWxSZWN0Lm1vdmVWZXJ0aWNhbGx5
KG1fcm9vdElubGluZUJveC5sb2dpY2FsVG9wKCkpOworICAgICAgICByZXR1cm4gaW5saW5lQm94
TG9naWNhbFJlY3Q7CisgICAgfQorCisgICAgLy8gZS5nIDxkaXY+PHNwYW4+PGltZz48L3NwYW4+
PC9kaXY+CisgICAgYXV0byBpbmxpbmVCb3hBYnNvbHV0ZWxvZ2ljYWxUb3AgPSBpbmxpbmVCb3hM
b2dpY2FsUmVjdC50b3AoKTsKKyAgICB3aGlsZSAoaW5saW5lQm94ICE9ICZtX3Jvb3RJbmxpbmVC
b3ggJiYgIWlubGluZUJveC0+aGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpIHsKKyAgICAg
ICAgaW5saW5lQm94ID0gJmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGlubGluZUJveC0+bGF5
b3V0Qm94KCkucGFyZW50KCkpOworICAgICAgICBBU1NFUlQoaW5saW5lQm94LT5pc0lubGluZUJv
eCgpKTsKKyAgICAgICAgaW5saW5lQm94QWJzb2x1dGVsb2dpY2FsVG9wICs9IGlubGluZUJveC0+
bG9naWNhbFRvcCgpOworICAgIH0KKyAgICByZXR1cm4gSW5saW5lUmVjdCB7IGlubGluZUJveEFi
c29sdXRlbG9naWNhbFRvcCwgaW5saW5lQm94TG9naWNhbFJlY3QubGVmdCgpLCBpbmxpbmVCb3hM
b2dpY2FsUmVjdC53aWR0aCgpLCBpbmxpbmVCb3hMb2dpY2FsUmVjdC5oZWlnaHQoKSB9OworfQor
CitJbmxpbmVSZWN0IExpbmVCb3g6OmxvZ2ljYWxCb3JkZXJCb3hGb3JBdG9taWNJbmxpbmVMZXZl
bEJveChjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQm94R2VvbWV0cnkmIGJveEdlb21ldHJ5
KSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNBdG9taWNJbmxpbmVMZXZlbEJveCgp
KTsKKyAgICBhdXRvIGxvZ2ljYWxSZWN0ID0gbG9naWNhbFJlY3RGb3JJbmxpbmVMZXZlbEJveChs
YXlvdXRCb3gpOworICAgIC8vIElubGluZSBsZXZlbCBib3hlcyB1c2UgdGhlaXIgbWFyZ2luIGJv
eCBmb3IgdmVydGljYWwgYWxpZ25tZW50LiBMZXQncyBjb3ZlcnQgdGhlbSB0byBib3JkZXIgYm94
ZXMuCisgICAgbG9naWNhbFJlY3QubW92ZVZlcnRpY2FsbHkoYm94R2VvbWV0cnkubWFyZ2luQmVm
b3JlKCkpOworICAgIGF1dG8gdmVydGljYWxNYXJnaW4gPSBib3hHZW9tZXRyeS5tYXJnaW5CZWZv
cmUoKSArIGJveEdlb21ldHJ5Lm1hcmdpbkFmdGVyKCk7CisgICAgbG9naWNhbFJlY3QuZXhwYW5k
VmVydGljYWxseSgtdmVydGljYWxNYXJnaW4pOworICAgIHJldHVybiBsb2dpY2FsUmVjdDsKK30K
KworSW5saW5lUmVjdCBMaW5lQm94Ojpsb2dpY2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KGNvbnN0
IEJveCYgbGF5b3V0Qm94LCBjb25zdCBCb3hHZW9tZXRyeSYgYm94R2VvbWV0cnkpIGNvbnN0Cit7
CisgICAgYXV0byBsb2dpY2FsUmVjdCA9IGxvZ2ljYWxSZWN0Rm9ySW5saW5lTGV2ZWxCb3gobGF5
b3V0Qm94KTsKKyAgICAvLyBUaGlzIGxvZ2ljYWwgcmVjdCBpcyBhcyB0YWxsIGFzIHRoZSAidGV4
dCIgY29udGVudCBpcy4gTGV0J3MgYWRqdXN0IHdpdGggdmVydGljYWwgYm9yZGVyIGFuZCBwYWRk
aW5nLgorICAgIGF1dG8gdmVydGljYWxCb3JkZXJBbmRQYWRkaW5nID0gYm94R2VvbWV0cnkudmVy
dGljYWxCb3JkZXIoKSArIGJveEdlb21ldHJ5LnZlcnRpY2FsUGFkZGluZygpLnZhbHVlT3IoMF9s
dSk7CisgICAgbG9naWNhbFJlY3QuZXhwYW5kVmVydGljYWxseSh2ZXJ0aWNhbEJvcmRlckFuZFBh
ZGRpbmcpOworICAgIGxvZ2ljYWxSZWN0Lm1vdmVWZXJ0aWNhbGx5KC0oYm94R2VvbWV0cnkuYm9y
ZGVyVG9wKCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwX2x1KSkpOworICAg
IHJldHVybiBsb2dpY2FsUmVjdDsKK30KKworfSAvLyBuYW1lc3BhY2UgTGF5b3V0Cit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guaCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVMaW5lQm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNjkyZTk2NjM4MzhlZDMyYThkZGIxOWI1ZmVh
ZDI0Njk3OTlmMWMxMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94LmgKQEAgLTAs
MCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiSW5saW5lTGluZS5oIgorI2luY2x1
ZGUgIklubGluZVJlY3QuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorI2lu
Y2x1ZGUgPHd0Zi9VbmlxdWVSZWYuaD4KKyNpbmNsdWRlIDx3dGYvV2Vha1B0ci5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgQm94R2VvbWV0cnk7
CitjbGFzcyBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKK2NsYXNzIExpbmVCb3hCdWlsZGVyOwor
c3RydWN0IFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudDsKKworLy8gICBfX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gTGluZSBCb3gK
Ky8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0t
LS0tLQorLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAg
ICAgICAgICAgfAorLy8gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0t
LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0gUm9vdCBJbmxpbmUgQm94CisvLyB8fCAgIF9fX19f
ICAgIF9fXyAgICAgIF9fXyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisvLyB8fCAg
fCAgICAgICAgLyAgIFwgICAgLyAgIFwgICAgICAgICB8ICBJbmxpbmUgTGV2ZWwgQm94ICB8Cisv
LyB8fCAgfF9fX19fICB8ICAgICB8ICB8ICAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAg
ICB8ICAgIGFzY2VudAorLy8gfHwgIHwgICAgICAgfCAgICAgfCAgfCAgICAgfCAgICAgICAgfCAg
ICAgICAgICAgICAgICAgICAgfAorLy8gfHxfX3xfX19fX19fX1xfX18vX19fX1xfX18vX19fX19f
X19ffF9fX19fX19fX19fX19fX19fX19ffF9fX19fX18gYWxpZ25tZW50X2Jhc2VsaW5lCisvLyB8
fAorLy8gfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBkZXNjZW50CisvLyB8fF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXworLy8gfF9fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKy8vIFRoZSByZXN1bHRpbmcg
cmVjdGFuZ3VsYXIgYXJlYSB0aGF0IGNvbnRhaW5zIHRoZSBib3hlcyB0aGF0IGZvcm0gYSBzaW5n
bGUgbGluZSBvZiBpbmxpbmUtbGV2ZWwgY29udGVudCBpcyBjYWxsZWQgYSBsaW5lIGJveC4KKy8v
IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI21vZGVsCitjbGFzcyBMaW5lQm94
IHsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgSW5s
aW5lTGV2ZWxCb3ggeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGlu
ZUxldmVsQm94IGNyZWF0ZUlubGluZUJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxv
Z2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7CisgICAgICAgIHN0YXRp
YyBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBjcmVhdGVBdG9taWNJbmxpbmVMZXZlbEJveChjb25z
dCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplKTsK
KyAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGluZUxldmVsQm94IGNyZWF0ZUxpbmVCcmVha0Jv
eChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KTsKKyAgICAgICAgc3Rh
dGljIExpbmVCb3g6OklubGluZUxldmVsQm94IGNyZWF0ZUdlbmVyaWNJbmxpbmVMZXZlbEJveChj
b25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KTsKKworICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IGJhc2VsaW5lKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlbGluZTsgfQorICAg
ICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBkZXNjZW50KCkgY29uc3QgeyByZXR1cm4g
bV9kZXNjZW50OyB9CisgICAgICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWlu
bGluZS0zLyNsYXlvdXQtYm91bmRzCisgICAgICAgIHN0cnVjdCBMYXlvdXRCb3VuZHMgeworICAg
ICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBhc2NlbnQg
KyBkZXNjZW50OyB9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGF5b3V0Qm91
bmRzJiBvdGhlcikgY29uc3QgeyByZXR1cm4gYXNjZW50ID09IG90aGVyLmFzY2VudCAmJiBkZXNj
ZW50ID09IG90aGVyLmRlc2NlbnQ7IH0KKworICAgICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBh
c2NlbnQgeyAwIH07CisgICAgICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGRlc2NlbnQgeyAwIH07
CisgICAgICAgIH07CisgICAgICAgIExheW91dEJvdW5kcyBsYXlvdXRCb3VuZHMoKSBjb25zdCB7
IHJldHVybiBtX2xheW91dEJvdW5kczsgfQorCisgICAgICAgIGJvb2wgaGFzQ29udGVudCgpIGNv
bnN0IHsgcmV0dXJuIG1faGFzQ29udGVudDsgfQorICAgICAgICB2b2lkIHNldEhhc0NvbnRlbnQo
KTsKKworICAgICAgICBWZXJ0aWNhbEFsaWduIHZlcnRpY2FsQWxpZ24oKSBjb25zdCB7IHJldHVy
biBsYXlvdXRCb3goKS5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKTsgfQorICAgICAgICBjb25zdCBC
b3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQorICAgICAgICBj
b25zdCBSZW5kZXJTdHlsZSYgc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJveC0+c3R5
bGUoKTsgfQorCisgICAgICAgIGJvb2wgaXNJbmxpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX3R5
cGUgPT0gVHlwZTo6SW5saW5lQm94IHx8IG1fdHlwZSA9PSBUeXBlOjpSb290SW5saW5lQm94OyB9
CisgICAgICAgIGJvb2wgaXNSb290SW5saW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09
IFR5cGU6OlJvb3RJbmxpbmVCb3g7IH0KKyAgICAgICAgYm9vbCBpc0F0b21pY0lubGluZUxldmVs
Qm94KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IFR5cGU6OkF0b21pY0lubGluZUxldmVsQm94
OyB9CisgICAgICAgIGJvb2wgaXNMaW5lQnJlYWtCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUg
PT0gVHlwZTo6TGluZUJyZWFrQm94OyB9CisgICAgICAgIGJvb2wgaGFzTGluZUJveFJlbGF0aXZl
QWxpZ25tZW50KCkgY29uc3Q7CisKKyAgICAgICAgZW51bSBjbGFzcyBUeXBlIDogdWludDhfdCB7
CisgICAgICAgICAgICBJbmxpbmVCb3ggICAgICAgICAgICAgPSAxIDw8IDAsCisgICAgICAgICAg
ICBSb290SW5saW5lQm94ICAgICAgICAgPSAxIDw8IDEsCisgICAgICAgICAgICBBdG9taWNJbmxp
bmVMZXZlbEJveCAgPSAxIDw8IDIsCisgICAgICAgICAgICBMaW5lQnJlYWtCb3ggICAgICAgICAg
PSAxIDw8IDMsCisgICAgICAgICAgICBHZW5lcmljSW5saW5lTGV2ZWxCb3ggPSAxIDw8IDQKKyAg
ICAgICAgfTsKKyAgICAgICAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9CisK
KyAgICAgICAgSW5saW5lTGV2ZWxCb3goY29uc3QgQm94JiwgSW5saW5lTGF5b3V0VW5pdCBsb2dp
Y2FsTGVmdCwgSW5saW5lTGF5b3V0U2l6ZSwgVHlwZSk7CisgICAgICAgIElubGluZUxldmVsQm94
KCkgPSBkZWZhdWx0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBTaW1w
bGlmaWVkVmVydGljYWxBbGlnbm1lbnQ7CisgICAgICAgIGZyaWVuZCBjbGFzcyBMaW5lQm94QnVp
bGRlcjsKKyAgICAgICAgZnJpZW5kIGNsYXNzIExpbmVCb3g7CisKKyAgICAgICAgY29uc3QgSW5s
aW5lUmVjdCYgbG9naWNhbFJlY3QoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0OyB9Cisg
ICAgICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFRvcCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9n
aWNhbFJlY3QudG9wKCk7IH0KKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9t
KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5ib3R0b20oKTsgfQorICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5s
ZWZ0KCk7IH0KKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdCB7
IHJldHVybiBtX2xvZ2ljYWxSZWN0LndpZHRoKCk7IH0KKyAgICAgICAgSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5oZWlnaHQoKTsg
fQorCisgICAgICAgIHZvaWQgc2V0TG9naWNhbFdpZHRoKElubGluZUxheW91dFVuaXQgbG9naWNh
bFdpZHRoKSB7IG1fbG9naWNhbFJlY3Quc2V0V2lkdGgobG9naWNhbFdpZHRoKTsgfQorICAgICAg
ICB2b2lkIHNldExvZ2ljYWxIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCk7CisgICAgICAgIHZvaWQg
c2V0TG9naWNhbFRvcChJbmxpbmVMYXlvdXRVbml0KTsKKyAgICAgICAgdm9pZCBzZXRCYXNlbGlu
ZShJbmxpbmVMYXlvdXRVbml0KTsKKyAgICAgICAgdm9pZCBzZXREZXNjZW50KElubGluZUxheW91
dFVuaXQpOworICAgICAgICB2b2lkIHNldExheW91dEJvdW5kcyhjb25zdCBMYXlvdXRCb3VuZHMm
KTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFdlYWtQdHI8Y29uc3QgQm94PiBtX2xheW91dEJv
eDsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgbWFyZ2luIGFuZCBib3Jk
ZXIgYm94ZXMuIElubGluZSBsZXZlbCBib3hlcyBhcmUgdmVydGljYWxseSBhbGlnbmVkIHVzaW5n
IHRoZWlyIG1hcmdpbiBib3hlcy4KKyAgICAgICAgSW5saW5lUmVjdCBtX2xvZ2ljYWxSZWN0Owor
ICAgICAgICBMYXlvdXRCb3VuZHMgbV9sYXlvdXRCb3VuZHM7CisgICAgICAgIElubGluZUxheW91
dFVuaXQgbV9iYXNlbGluZSB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5p
dD4gbV9kZXNjZW50OworICAgICAgICBib29sIG1faGFzQ29udGVudCB7IGZhbHNlIH07CisgICAg
ICAgIFR5cGUgbV90eXBlIHsgVHlwZTo6SW5saW5lQm94IH07CisgICAgfTsKKworICAgIExpbmVC
b3goY29uc3QgQm94JiByb290TGF5b3V0Qm94LCBjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgbG9n
aWNhbFRvcExlZnQsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVM
YXlvdXRVbml0IGxpbmVMb2dpY2FsV2lkdGgsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2lj
YWxXaWR0aCwgc2l6ZV90IG5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCk7CisKKyAgICBj
b25zdCBJbmxpbmVSZWN0JiBsb2dpY2FsUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJl
Y3Q7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJu
IGxvZ2ljYWxTaXplKCkud2lkdGgoKTsgfQorICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbEhl
aWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxTaXplKCkuaGVpZ2h0KCk7IH0KKyAgICBJbmxp
bmVMYXlvdXRQb2ludCBsb2dpY2FsVG9wTGVmdCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0
KCkudG9wTGVmdCgpOyB9CisgICAgSW5saW5lTGF5b3V0U2l6ZSBsb2dpY2FsU2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkuc2l6ZSgpOyB9CisgICAgSW5saW5lTGF5b3V0VW5pdCBj
b250ZW50TG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50TG9naWNhbFdpZHRo
OyB9CisKKyAgICAvLyBOb3RlIHRoYXQgdGhlIGxpbmUgY2FuIGhhdmUgbWFueSBpbmxpbmUgYm94
ZXMgYW5kIGJlICJlbXB0eSIgdGhlIHNhbWUgdGltZSBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxz
cGFuPjwvc3Bhbj48L2Rpdj4KKyAgICBib29sIGhhc0NvbnRlbnQoKSBjb25zdCB7IHJldHVybiBt
X2hhc0NvbnRlbnQ7IH0KKyAgICBib29sIGhhc0lubGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1f
Ym94VHlwZXMuY29udGFpbnMoSW5saW5lTGV2ZWxCb3g6OlR5cGU6OklubGluZUJveCk7IH0KKyAg
ICBib29sIGhhc05vbklubGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYm94VHlwZXMuY29udGFp
bnNBbnkoeyBJbmxpbmVMZXZlbEJveDo6VHlwZTo6QXRvbWljSW5saW5lTGV2ZWxCb3gsIElubGlu
ZUxldmVsQm94OjpUeXBlOjpMaW5lQnJlYWtCb3gsIElubGluZUxldmVsQm94OjpUeXBlOjpHZW5l
cmljSW5saW5lTGV2ZWxCb3ggfSk7IH0KKyAgICBib29sIGhhc0F0b21pY0lubGluZUxldmVsQm94
KCkgY29uc3QgeyByZXR1cm4gbV9ib3hUeXBlcy5jb250YWlucyhJbmxpbmVMZXZlbEJveDo6VHlw
ZTo6QXRvbWljSW5saW5lTGV2ZWxCb3gpOyB9CisKKyAgICBjb25zdCBJbmxpbmVMZXZlbEJveCYg
aW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3goY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsg
cmV0dXJuIGNvbnN0X2Nhc3Q8TGluZUJveCY+KCp0aGlzKS5pbmxpbmVMZXZlbEJveEZvckxheW91
dEJveChsYXlvdXRCb3gpOyB9CisKKyAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9yVGV4dFJ1
bihjb25zdCBMaW5lOjpSdW4mKSBjb25zdDsKKyAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9y
TGluZUJyZWFrQm94KGNvbnN0IEJveCYpIGNvbnN0OworICAgIElubGluZVJlY3QgbG9naWNhbFJl
Y3RGb3JSb290SW5saW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV9yb290SW5saW5lQm94LmxvZ2lj
YWxSZWN0KCk7IH0KKyAgICBJbmxpbmVSZWN0IGxvZ2ljYWxCb3JkZXJCb3hGb3JBdG9taWNJbmxp
bmVMZXZlbEJveChjb25zdCBCb3gmLCBjb25zdCBCb3hHZW9tZXRyeSYpIGNvbnN0OworICAgIElu
bGluZVJlY3QgbG9naWNhbEJvcmRlckJveEZvcklubGluZUJveChjb25zdCBCb3gmLCBjb25zdCBC
b3hHZW9tZXRyeSYpIGNvbnN0OworCisgICAgY29uc3QgSW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxp
bmVCb3goKSBjb25zdCB7IHJldHVybiBtX3Jvb3RJbmxpbmVCb3g7IH0KKyAgICB1c2luZyBJbmxp
bmVMZXZlbEJveExpc3QgPSBWZWN0b3I8SW5saW5lTGV2ZWxCb3g+OworICAgIGNvbnN0IElubGlu
ZUxldmVsQm94TGlzdCYgbm9uUm9vdElubGluZUxldmVsQm94ZXMoKSBjb25zdCB7IHJldHVybiBt
X25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Q7IH0KKworICAgIElubGluZUxheW91dFVuaXQgYWxp
Z25tZW50QmFzZWxpbmUoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RJbmxpbmVCb3gubG9naWNhbFRv
cCgpICsgbV9yb290SW5saW5lQm94LmJhc2VsaW5lKCk7IH0KKworcHJpdmF0ZToKKyAgICBmcmll
bmQgY2xhc3MgTGluZUJveEJ1aWxkZXI7CisKKyAgICB2b2lkIHNldExvZ2ljYWxIZWlnaHQoSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KSB7IG1fbG9naWNhbFJlY3Quc2V0SGVpZ2h0KGxv
Z2ljYWxIZWlnaHQpOyB9CisKKyAgICB2b2lkIGFkZElubGluZUxldmVsQm94KElubGluZUxldmVs
Qm94JiYpOworICAgIElubGluZUxldmVsQm94TGlzdCYgbm9uUm9vdElubGluZUxldmVsQm94ZXMo
KSB7IHJldHVybiBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Q7IH0KKworICAgIElubGluZUxl
dmVsQm94JiByb290SW5saW5lQm94KCkgeyByZXR1cm4gbV9yb290SW5saW5lQm94OyB9CisKKyAg
ICBJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3goY29uc3QgQm94JiBs
YXlvdXRCb3gpIHsgcmV0dXJuICZsYXlvdXRCb3ggPT0gJm1fcm9vdElubGluZUJveC5sYXlvdXRC
b3goKSA/IG1fcm9vdElubGluZUJveCA6IG1fbm9uUm9vdElubGluZUxldmVsQm94TGlzdFttX25v
blJvb3RJbmxpbmVMZXZlbEJveE1hcC5nZXQoJmxheW91dEJveCldOyB9CisgICAgSW5saW5lUmVj
dCBsb2dpY2FsUmVjdEZvcklubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25z
dDsKKworICAgIHZvaWQgc2V0SGFzQ29udGVudChib29sIGhhc0NvbnRlbnQpIHsgbV9oYXNDb250
ZW50ID0gaGFzQ29udGVudDsgfQorCitwcml2YXRlOgorICAgIElubGluZVJlY3QgbV9sb2dpY2Fs
UmVjdDsKKyAgICBJbmxpbmVMYXlvdXRVbml0IG1fY29udGVudExvZ2ljYWxXaWR0aCB7IDAgfTsK
KyAgICBib29sIG1faGFzQ29udGVudCB7IGZhbHNlIH07CisgICAgT3B0aW9uU2V0PElubGluZUxl
dmVsQm94OjpUeXBlPiBtX2JveFR5cGVzOworCisgICAgSW5saW5lTGV2ZWxCb3ggbV9yb290SW5s
aW5lQm94OworICAgIElubGluZUxldmVsQm94TGlzdCBtX25vblJvb3RJbmxpbmVMZXZlbEJveExp
c3Q7CisKKyAgICBIYXNoTWFwPGNvbnN0IEJveCosIHNpemVfdD4gbV9ub25Sb290SW5saW5lTGV2
ZWxCb3hNYXA7Cit9OworCitpbmxpbmUgTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6
SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUF0b21pY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIGxv
Z2ljYWxTaXplKQoreworICAgIHJldHVybiBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCB7IGxheW91
dEJveCwgbG9naWNhbExlZnQsIGxvZ2ljYWxTaXplLCBUeXBlOjpBdG9taWNJbmxpbmVMZXZlbEJv
eCB9OworfQorCitpbmxpbmUgTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5l
TGV2ZWxCb3g6OmNyZWF0ZUlubGluZUJveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7Cisg
ICAgcmV0dXJuIExpbmVCb3g6OklubGluZUxldmVsQm94IHsgbGF5b3V0Qm94LCBsb2dpY2FsTGVm
dCwgSW5saW5lTGF5b3V0U2l6ZSB7IGxvZ2ljYWxXaWR0aCwgeyB9IH0sIFR5cGU6OklubGluZUJv
eCB9OworfQorCitpbmxpbmUgTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5l
TGV2ZWxCb3g6OmNyZWF0ZUxpbmVCcmVha0JveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5l
TGF5b3V0VW5pdCBsb2dpY2FsTGVmdCkKK3sKKyAgICByZXR1cm4gTGluZUJveDo6SW5saW5lTGV2
ZWxCb3ggeyBsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgfSwgVHlw
ZTo6TGluZUJyZWFrQm94IH07Cit9CisKK2lubGluZSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBM
aW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlR2VuZXJpY0lubGluZUxldmVsQm94KGNvbnN0
IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KQoreworICAgIHJl
dHVybiBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCB7IGxheW91dEJveCwgbG9naWNhbExlZnQsIElu
bGluZUxheW91dFNpemUgeyB9LCBUeXBlOjpHZW5lcmljSW5saW5lTGV2ZWxCb3ggfTsKK30KKwor
fQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5s
aW5lTGluZUJ1aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjZjNjI2ZWEwZWU1YTYzYTRhOTYyYjE1NWNl
NjEwNjUzMGZjZTIyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxkZXIuY3Bw
CkBAIC0wLDAgKzEsODU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIklubGluZUxpbmVCdWlsZGVyLmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJ
TkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIklu
bGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVk
ZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2luY2x1
ZGUgIlRleHRVdGlsLmgiCisjaW5jbHVkZSA8d3RmL3VuaWNvZGUvQ2hhcmFjdGVyTmFtZXMuaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3N0YXRpYyBpbmxp
bmUgYm9vbCBlbmRzV2l0aFNvZnRXcmFwT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5lVGV4dEl0ZW0m
IGN1cnJlbnRUZXh0SXRlbSwgY29uc3QgSW5saW5lVGV4dEl0ZW0mIG5leHRJbmxpbmVUZXh0SXRl
bSkKK3sKKyAgICBBU1NFUlQoIW5leHRJbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSk7Cisg
ICAgLy8gV2UgYXJlIGF0IHRoZSBwb3NpdGlvbiBhZnRlciBhIHdoaXRlc3BhY2UuCisgICAgaWYg
KGN1cnJlbnRUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgLy8gV2hlbiBib3RoIHRoZXNlIG5vbi13aGl0ZXNwYWNlIHJ1bnMgYmVsb25nIHRvIHRoZSBz
YW1lIGxheW91dCBib3gsIGl0J3MgZ3VhcmFudGVlZCB0aGF0CisgICAgLy8gdGhleSBhcmUgc3Bs
aXQgYXQgYSBzb2Z0IGJyZWFraW5nIG9wcG9ydHVuaXR5LiBTZWUgSW5saW5lVGV4dEl0ZW06Om1v
dmVUb05leHRCcmVha2FibGVQb3NpdGlvbi4KKyAgICBpZiAoJmN1cnJlbnRUZXh0SXRlbS5pbmxp
bmVUZXh0Qm94KCkgPT0gJm5leHRJbmxpbmVUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkpCisgICAg
ICAgIHJldHVybiB0cnVlOworICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGNvbGxlY3QgYXQgbGVhc3Qg
MyBhZGphY2VudCBjaGFyYWN0ZXJzIHRvIGJlIGFibGUgdG8gbWFrZSBhIGRlY2lzaW9uIHdoZXRo
ZXIgdGhlIHByZXZpb3VzIHRleHQgaXRlbSBlbmRzIHdpdGggYnJlYWtpbmcgb3Bwb3J0dW5pdHku
CisgICAgLy8gW2V4LV1bYW1wbGVdIDwtIHNlY29uZCB0byBsYXN0W3hdIGxhc3RbLV0gY3VycmVu
dFthXQorICAgIC8vIFdlIG5lZWQgYXQgbGVhc3QgMSBjaGFyYWN0ZXIgaW4gdGhlIGN1cnJlbnQg
aW5saW5lIHRleHQgaXRlbSBhbmQgMiBtb3JlIGZyb20gcHJldmlvdXMgaW5saW5lIGl0ZW1zLgor
ICAgIGF1dG8gcHJldmlvdXNDb250ZW50ID0gY3VycmVudFRleHRJdGVtLmlubGluZVRleHRCb3go
KS5jb250ZW50KCk7CisgICAgYXV0byBsaW5lQnJlYWtJdGVyYXRvciA9IExhenlMaW5lQnJlYWtJ
dGVyYXRvciB7IG5leHRJbmxpbmVUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpIH07
CisgICAgYXV0byBwcmV2aW91c0NvbnRlbnRMZW5ndGggPSBwcmV2aW91c0NvbnRlbnQubGVuZ3Ro
KCk7CisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBsb29rIGludG8gdGhlIGVudGlyZSB1bmNvbW1p
dHRlZCBjb250ZW50IGZvciBtb3JlIHRleHQgY29udGV4dC4KKyAgICBVQ2hhciBsYXN0Q2hhcmFj
dGVyID0gcHJldmlvdXNDb250ZW50TGVuZ3RoID8gcHJldmlvdXNDb250ZW50W3ByZXZpb3VzQ29u
dGVudExlbmd0aCAtIDFdIDogMDsKKyAgICBpZiAobGFzdENoYXJhY3RlciA9PSBzb2Z0SHlwaGVu
ICYmIGN1cnJlbnRUZXh0SXRlbS5zdHlsZSgpLmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpOb25lKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgVUNoYXIgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0g
cHJldmlvdXNDb250ZW50TGVuZ3RoID4gMSA/IHByZXZpb3VzQ29udGVudFtwcmV2aW91c0NvbnRl
bnRMZW5ndGggLSAyXSA6IDA7CisgICAgbGluZUJyZWFrSXRlcmF0b3Iuc2V0UHJpb3JDb250ZXh0
KGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rlcik7CisgICAgLy8gTm93IGNoZWNr
IGlmIHdlIGNhbiBicmVhayByaWdodCBhdCB0aGUgaW5saW5lIGl0ZW0gYm91bmRhcnkuCisgICAg
Ly8gV2l0aCB0aGUgW2V4LWFtcGxlXSwgZmluZE5leHRCcmVha2FibGVQb3NpdGlvbiBzaG91bGQg
cmV0dXJuIHRoZSBzdGFydFBvc2l0aW9uICgwKS4KKyAgICAvLyBGSVhNRTogQ2hlY2sgaWYgdGhl
cmUncyBhIG1vcmUgY29ycmVjdCB3YXkgb2YgZmluZGluZyBicmVha2luZyBvcHBvcnR1bml0aWVz
LgorICAgIHJldHVybiAhVGV4dFV0aWw6OmZpbmROZXh0QnJlYWthYmxlUG9zaXRpb24obGluZUJy
ZWFrSXRlcmF0b3IsIDAsIG5leHRJbmxpbmVUZXh0SXRlbS5zdHlsZSgpKTsKK30KKworc3RhdGlj
IGlubGluZSBib29sIGlzQXRTb2Z0V3JhcE9wcG9ydHVuaXR5KGNvbnN0IElubGluZUZvcm1hdHRp
bmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCwgY29uc3QgSW5saW5lSXRlbSYgY3Vy
cmVudCwgY29uc3QgSW5saW5lSXRlbSYgbmV4dCkKK3sKKyAgICAvLyAiaXMgYXQiIHNpbXBsZSBt
ZWFucyB0aGF0IHRoZXJlJ3MgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgcmlnaHQgYWZ0ZXIgdGhl
IFtjdXJyZW50XS4KKyAgICAvLyBbdGV4dF1bIF1bdGV4dF1baW5saW5lIGJveCBzdGFydF0uLi4g
KDxkaXY+dGV4dCBjb250ZW50PHNwYW4+Li48L2Rpdj4pCisgICAgLy8gc29mdCB3cmFwIGluZGV4
ZXM6IDAgYW5kIDEgZGVmaW5pdGVseSwgMiBkZXBlbmRzIG9uIHRoZSBjb250ZW50IGFmdGVyIHRo
ZSBbaW5saW5lIGJveCBzdGFydF0uCisKKyAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcv
Y3NzLXRleHQtMy8jbGluZS1icmVhay1kZXRhaWxzCisgICAgLy8gRmlndXJlIG91dCBpZiB0aGUg
bmV3IGluY29taW5nIGNvbnRlbnQgcHV0cyB0aGUgdW5jb21taXR0ZWQgY29udGVudCBvbiBhIHNv
ZnQgd3JhcCBvcHBvcnR1bml0eS4KKyAgICAvLyBlLmcuIFtpbmxpbmUgYm94IHN0YXJ0XVtwcmlv
cl9jb250aW51b3VzX2NvbnRlbnRdW2lubGluZSBib3ggZW5kXSAoPHNwYW4+cHJpb3JfY29udGlu
dW91c19jb250ZW50PC9zcGFuPikKKyAgICAvLyBBbiBpbmNvbWluZyA8aW1nPiBib3ggd291bGQg
ZW5hYmxlIHVzIHRvIGNvbW1pdCB0aGUgIjxzcGFuPnByaW9yX2NvbnRpbnVvdXNfY29udGVudDwv
c3Bhbj4iIGNvbnRlbnQKKyAgICAvLyBidXQgYW4gaW5jb21pbmcgdGV4dCBjb250ZW50IHdvdWxk
IG5vdCBuZWNlc3NhcmlseS4KKyAgICBBU1NFUlQoY3VycmVudC5pc1RleHQoKSB8fCBjdXJyZW50
LmlzQm94KCkgfHwgY3VycmVudC5pc0Zsb2F0KCkpOworICAgIEFTU0VSVChuZXh0LmlzVGV4dCgp
IHx8IG5leHQuaXNCb3goKSB8fCBuZXh0LmlzRmxvYXQoKSk7CisgICAgaWYgKGN1cnJlbnQuaXNU
ZXh0KCkgJiYgbmV4dC5pc1RleHQoKSkgeworICAgICAgICBhdXRvJiBjdXJyZW50SW5saW5lVGV4
dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4oY3VycmVudCk7CisgICAgICAgIGF1dG8m
IG5leHRJbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihuZXh0KTsKKyAg
ICAgICAgaWYgKGN1cnJlbnRJbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkgeworICAgICAg
ICAgICAgLy8gWyBdW3RleHRdIDogYWZ0ZXIgW3doaXRlc3BhY2VdIHBvc2l0aW9uIGlzIGEgc29m
dCB3cmFwIG9wcG9ydHVuaXR5LgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0K
KyAgICAgICAgaWYgKG5leHRJbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkgeworICAgICAg
ICAgICAgLy8gW3RleHRdWyBdICg8c3Bhbj50ZXh0PC9zcGFuPiApCisgICAgICAgICAgICAvLyB3
aGl0ZS1zcGFjZTogYnJlYWstc3BhY2VzOiBsaW5lIGJyZWFraW5nIG9wcG9ydHVuaXR5IGV4aXN0
cyBhZnRlciBldmVyeSBwcmVzZXJ2ZWQgd2hpdGUgc3BhY2UgY2hhcmFjdGVyLCBidXQgbm90IGJl
Zm9yZS4KKyAgICAgICAgICAgIHJldHVybiBuZXh0SW5saW5lVGV4dEl0ZW0uc3R5bGUoKS53aGl0
ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6QnJlYWtTcGFjZXM7CisgICAgICAgIH0KKyAgICAgICAg
aWYgKGN1cnJlbnQuc3R5bGUoKS5saW5lQnJlYWsoKSA9PSBMaW5lQnJlYWs6OkFueXdoZXJlIHx8
IG5leHQuc3R5bGUoKS5saW5lQnJlYWsoKSA9PSBMaW5lQnJlYWs6OkFueXdoZXJlKSB7CisgICAg
ICAgICAgICAvLyBUaGVyZSBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBhcm91bmQgZXZlcnkg
dHlwb2dyYXBoaWMgY2hhcmFjdGVyIHVuaXQsIGluY2x1ZGluZyBhcm91bmQgYW55IHB1bmN0dWF0
aW9uIGNoYXJhY3RlcgorICAgICAgICAgICAgLy8gb3IgcHJlc2VydmVkIHdoaXRlIHNwYWNlcywg
b3IgaW4gdGhlIG1pZGRsZSBvZiB3b3Jkcy4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICB9CisgICAgICAgIC8vIEJvdGggY3VycmVudCBhbmQgbmV4dCBpdGVtcyBhcmUgbm9uLXdo
aXRlc3BhY2UgdGV4dC4KKyAgICAgICAgLy8gW3RleHRdW3RleHRdIDogaXMgYSBjb250aW51b3Vz
IGNvbnRlbnQuCisgICAgICAgIC8vIFt0ZXh0LV1bdGV4dF0gOiBhZnRlciBbaHlwaGVuXSBwb3Np
dGlvbiBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eS4KKyAgICAgICAgcmV0dXJuIGVuZHNXaXRo
U29mdFdyYXBPcHBvcnR1bml0eShjdXJyZW50SW5saW5lVGV4dEl0ZW0sIG5leHRJbmxpbmVUZXh0
SXRlbSk7CisgICAgfQorICAgIGlmIChjdXJyZW50LmlzRmxvYXQoKSB8fCBuZXh0LmlzRmxvYXQo
KSkgeworICAgICAgICAvLyBXaGlsZSBmbG9hdHMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBpbmxpbmUg
Y29udGVudCBhbmQgdGhleSBhcmUgbm90IHN1cHBvc2VkIHRvIGludHJvZHVjZSBzb2Z0IHdyYXAg
b3Bwb3J0dW5pdGllcywKKyAgICAgICAgLy8gZS5nLiBbdGV4dF1bZmxvYXQgYm94XVtmbG9hdCBi
b3hdW3RleHRdW2Zsb2F0IGJveF1bdGV4dF0gaXMgZXNzZW50aWFsbHkganVzdCBbdGV4dF1bdGV4
dF1bdGV4dF0KKyAgICAgICAgLy8gZmlndXJpbmcgb3V0IHdoZXRoZXIgYSBmbG9hdCAob3Igc2V0
IG9mIGZsb2F0cykgc2hvdWxkIHN0YXkgb24gdGhlIGxpbmUgb3Igbm90IChhbmQgaGFuZGxlIHBv
dGVudGlhbGx5IG91dCBvZiBvcmRlciBpbmxpbmUgaXRlbXMpCisgICAgICAgIC8vIGJyaW5ncyBp
biB1bm5lY2Vzc2FyeSBjb21wbGV4aXR5LgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cisg
ICAgaWYgKGN1cnJlbnQuaXNCb3goKSB8fCBuZXh0LmlzQm94KCkpIHsKKyAgICAgICAgYXV0byBp
c0ltYWdlQ29udGVudCA9IGN1cnJlbnQubGF5b3V0Qm94KCkuaXNJbWFnZSgpIHx8IG5leHQubGF5
b3V0Qm94KCkuaXNJbWFnZSgpOworICAgICAgICBpZiAoaXNJbWFnZUNvbnRlbnQpCisgICAgICAg
ICAgICByZXR1cm4gaW5saW5lRm9ybWF0dGluZ0NvbnRleHQucXVpcmtzKCkuaGFzU29mdFdyYXBP
cHBvcnR1bml0eUF0SW1hZ2UoKTsKKyAgICAgICAgLy8gW3RleHRdW2lubGluZSBib3ggc3RhcnRd
W2lubGluZSBib3ggZW5kXVtpbmxpbmUgYm94XSAodGV4dDxzcGFuPjwvc3Bhbj48aW1nPikgOiB0
aGVyZSdzIGEgc29mdCB3cmFwIG9wcG9ydHVuaXR5IGJldHdlZW4gdGhlIFt0ZXh0XSBhbmQgW2lt
Z10uCisgICAgICAgIC8vIFRoZSBsaW5lIGJyZWFraW5nIGJlaGF2aW9yIG9mIGEgcmVwbGFjZWQg
ZWxlbWVudCBvciBvdGhlciBhdG9taWMgaW5saW5lIGlzIGVxdWl2YWxlbnQgdG8gYW4gaWRlb2dy
YXBoaWMgY2hhcmFjdGVyLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0cnVjdCBMaW5lQ2FuZGlk
YXRlIHsKKyAgICBMaW5lQ2FuZGlkYXRlKGJvb2wgaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5n
KTsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHN0cnVjdCBJbmxpbmVDb250ZW50IHsKKyAg
ICAgICAgSW5saW5lQ29udGVudChib29sIGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZyk7CisK
KyAgICAgICAgY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50JiBj
b250aW51b3VzQ29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGludW91c0NvbnRlbnQ7IH0K
KyAgICAgICAgY29uc3QgSW5saW5lSXRlbSogdHJhaWxpbmdMaW5lQnJlYWsoKSBjb25zdCB7IHJl
dHVybiBtX3RyYWlsaW5nTGluZUJyZWFrOyB9CisgICAgICAgIGNvbnN0IElubGluZUl0ZW0qIHRy
YWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nV29y
ZEJyZWFrT3Bwb3J0dW5pdHk7IH0KKworICAgICAgICB2b2lkIGFwcGVuZElubGluZUl0ZW0oY29u
c3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICAgICAg
dm9pZCBhcHBlbmRUcmFpbGluZ0xpbmVCcmVhayhjb25zdCBJbmxpbmVJdGVtJiBsaW5lQnJlYWtJ
dGVtKSB7IG1fdHJhaWxpbmdMaW5lQnJlYWsgPSAmbGluZUJyZWFrSXRlbTsgfQorICAgICAgICB2
b2lkIGFwcGVuZHRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5lSXRlbSYg
d29yZEJyZWFrSXRlbSkgeyBtX3RyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkgPSAmd29yZEJy
ZWFrSXRlbTsgfQorICAgICAgICB2b2lkIHJlc2V0KCk7CisgICAgICAgIGJvb2wgaXNFbXB0eSgp
IGNvbnN0IHsgcmV0dXJuIG1fY29udGludW91c0NvbnRlbnQucnVucygpLmlzRW1wdHkoKSAmJiAh
dHJhaWxpbmdXb3JkQnJlYWtPcHBvcnR1bml0eSgpICYmICF0cmFpbGluZ0xpbmVCcmVhaygpOyB9
CisgICAgICAgIGJvb2wgaGFzSW5saW5lTGV2ZWxCb3goKSBjb25zdCB7IHJldHVybiBtX2hhc0lu
bGluZUxldmVsQm94OyB9CisKKyAgICAgICAgdm9pZCBzZXRIYXNUcmFpbGluZ1NvZnRXcmFwT3Bw
b3J0dW5pdHkoYm9vbCBoYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkpIHsgbV9oYXNUcmFp
bGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkgPSBoYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHk7
IH0KKyAgICAgICAgYm9vbCBoYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoKSBjb25zdCB7
IHJldHVybiBtX2hhc1RyYWlsaW5nU29mdFdyYXBPcHBvcnR1bml0eTsgfQorCisgICAgcHJpdmF0
ZToKKyAgICAgICAgYm9vbCBtX2lnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZyB7IGZhbHNlIH07
CisKKyAgICAgICAgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50IG1fY29u
dGludW91c0NvbnRlbnQ7CisgICAgICAgIGNvbnN0IElubGluZUl0ZW0qIG1fdHJhaWxpbmdMaW5l
QnJlYWsgeyBudWxscHRyIH07CisgICAgICAgIGNvbnN0IElubGluZUl0ZW0qIG1fdHJhaWxpbmdX
b3JkQnJlYWtPcHBvcnR1bml0eSB7IG51bGxwdHIgfTsKKyAgICAgICAgYm9vbCBtX2hhc0lubGlu
ZUxldmVsQm94IHsgZmFsc2UgfTsKKyAgICAgICAgYm9vbCBtX2hhc1RyYWlsaW5nU29mdFdyYXBP
cHBvcnR1bml0eSB7IGZhbHNlIH07CisgICAgfTsKKworICAgIC8vIENhbmRpZGF0ZSBjb250ZW50
IGlzIGEgY29sbGVjdGlvbiBvZiBpbmxpbmUgY29udGVudCBvciBhIGZsb2F0IGJveC4KKyAgICBJ
bmxpbmVDb250ZW50IGlubGluZUNvbnRlbnQ7CisgICAgY29uc3QgSW5saW5lSXRlbSogZmxvYXRJ
dGVtIHsgbnVsbHB0ciB9OworfTsKKworTGluZUNhbmRpZGF0ZTo6TGluZUNhbmRpZGF0ZShib29s
IGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKKyAgICA6IGlubGluZUNvbnRlbnQoaWdub3Jl
VHJhaWxpbmdMZXR0ZXJTcGFjaW5nKQoreworfQorCitMaW5lQ2FuZGlkYXRlOjpJbmxpbmVDb250
ZW50OjpJbmxpbmVDb250ZW50KGJvb2wgaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKQorICAg
IDogbV9pZ25vcmVUcmFpbGluZ0xldHRlclNwYWNpbmcoaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFj
aW5nKQoreworfQorCitpbmxpbmUgdm9pZCBMaW5lQ2FuZGlkYXRlOjpJbmxpbmVDb250ZW50Ojph
cHBlbmRJbmxpbmVJdGVtKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91
dFVuaXQgbG9naWNhbFdpZHRoKQoreworICAgIEFTU0VSVChpbmxpbmVJdGVtLmlzVGV4dCgpIHx8
IGlubGluZUl0ZW0uaXNCb3goKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBp
bmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpOworICAgIGF1dG8gY29sbGFwc2libGVXaWR0aCA9
IFsmXSgpIC0+IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsKKyAgICAgICAgaWYgKCFpbmxp
bmVJdGVtLmlzVGV4dCgpKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgYXV0byYg
aW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSk7Cisg
ICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4dEl0
ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpIHsKKyAgICAg
ICAgICAgIC8vIEZ1bGx5IGNvbGxhcHNpYmxlIHRyYWlsaW5nIGNvbnRlbnQuCisgICAgICAgICAg
ICByZXR1cm4gbG9naWNhbFdpZHRoOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIGZvciBw
YXJ0aWFsbHkgY29sbGFwc2libGUgY29udGVudC4KKyAgICAgICAgaWYgKG1faWdub3JlVHJhaWxp
bmdMZXR0ZXJTcGFjaW5nKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgYXV0byBs
ZXR0ZXJTcGFjaW5nID0gaW5saW5lSXRlbS5zdHlsZSgpLmxldHRlclNwYWNpbmcoKTsKKyAgICAg
ICAgaWYgKGxldHRlclNwYWNpbmcgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAg
ICAgIEFTU0VSVChsb2dpY2FsV2lkdGggPiBsZXR0ZXJTcGFjaW5nKTsKKyAgICAgICAgcmV0dXJu
IGxldHRlclNwYWNpbmc7CisgICAgfTsKKyAgICBtX2NvbnRpbnVvdXNDb250ZW50LmFwcGVuZChp
bmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgsIGNvbGxhcHNpYmxlV2lkdGgoKSk7CisgICAgbV9oYXNJ
bmxpbmVMZXZlbEJveCA9IG1faGFzSW5saW5lTGV2ZWxCb3ggfHwgaW5saW5lSXRlbS5pc0JveCgp
IHx8IGlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpOworfQorCitpbmxpbmUgdm9pZCBMaW5l
Q2FuZGlkYXRlOjpJbmxpbmVDb250ZW50OjpyZXNldCgpCit7CisgICAgbV9jb250aW51b3VzQ29u
dGVudC5yZXNldCgpOworICAgIG1fdHJhaWxpbmdMaW5lQnJlYWsgPSB7IH07CisgICAgbV90cmFp
bGluZ1dvcmRCcmVha09wcG9ydHVuaXR5ID0geyB9OworICAgIG1faGFzSW5saW5lTGV2ZWxCb3gg
PSBmYWxzZTsKK30KKworaW5saW5lIHZvaWQgTGluZUNhbmRpZGF0ZTo6cmVzZXQoKQoreworICAg
IGZsb2F0SXRlbSA9IG51bGxwdHI7CisgICAgaW5saW5lQ29udGVudC5yZXNldCgpOworfQorCitJ
bmxpbmVMYXlvdXRVbml0IExpbmVCdWlsZGVyOjppbmxpbmVJdGVtV2lkdGgoY29uc3QgSW5saW5l
SXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpIGNv
bnN0Cit7CisgICAgaWYgKGlzPElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKSkgeworICAgICAg
ICBhdXRvJiBpbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihpbmxpbmVJ
dGVtKTsKKyAgICAgICAgaWYgKGF1dG8gY29udGVudFdpZHRoID0gaW5saW5lVGV4dEl0ZW0ud2lk
dGgoKSkKKyAgICAgICAgICAgIHJldHVybiAqY29udGVudFdpZHRoOworICAgICAgICBpZiAoIWlu
bGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpIHx8IElubGluZVRleHRJdGVtOjpzaG91bGRQcmVz
ZXJ2ZVNwYWNlc0FuZFRhYnMoaW5saW5lVGV4dEl0ZW0pKQorICAgICAgICAgICAgcmV0dXJuIFRl
eHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgY29udGVudExvZ2ljYWxMZWZ0KTsKKyAgICAg
ICAgcmV0dXJuIFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4dEl0ZW0u
c3RhcnQoKSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSArIDEsIGNvbnRlbnRMb2dpY2FsTGVmdCk7
CisgICAgfQorCisgICAgaWYgKGlubGluZUl0ZW0uaXNMaW5lQnJlYWsoKSB8fCBpbmxpbmVJdGVt
LmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIGF1
dG8mIGxheW91dEJveCA9IGlubGluZUl0ZW0ubGF5b3V0Qm94KCk7CisgICAgYXV0byYgYm94R2Vv
bWV0cnkgPSBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJv
eCk7CisKKyAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCisgICAgICAg
IHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5Cb3hXaWR0aCgpOworCisgICAgaWYgKGxheW91dEJv
eC5pc1JlcGxhY2VkQm94KCkpCisgICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5Cb3hX
aWR0aCgpOworCisgICAgaWYgKGlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpKQorICAgICAg
ICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luU3RhcnQoKSArIGJveEdlb21ldHJ5LmJvcmRlckxl
ZnQoKSArIGJveEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCkudmFsdWVPcigwKTsKKworICAgIGlmIChp
bmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpCisgICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5t
YXJnaW5FbmQoKSArIGJveEdlb21ldHJ5LmJvcmRlclJpZ2h0KCkgKyBib3hHZW9tZXRyeS5wYWRk
aW5nUmlnaHQoKS52YWx1ZU9yKDApOworCisgICAgLy8gTm9uLXJlcGxhY2VkIGlubGluZSBib3gg
KGUuZy4gaW5saW5lLWJsb2NrKQorICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5Cb3hXaWR0
aCgpOworfQorCitMaW5lQnVpbGRlcjo6TGluZUJ1aWxkZXIoSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQmIGlubGluZUZvcm1hdHRpbmdDb250ZXh0LCBGbG9hdGluZ1N0YXRlJiBmbG9hdGluZ1N0YXRl
LCBIb3Jpem9udGFsQ29uc3RyYWludHMgcm9vdEhvcml6b250YWxDb25zdHJhaW50cywgY29uc3Qg
SW5saW5lSXRlbXMmIGlubGluZUl0ZW1zKQorICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4
dChpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1faW5saW5lRm9ybWF0dGluZ1N0YXRl
KCZpbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5mb3JtYXR0aW5nU3RhdGUoKSkKKyAgICAsIG1fZmxv
YXRpbmdTdGF0ZSgmZmxvYXRpbmdTdGF0ZSkKKyAgICAsIG1fcm9vdEhvcml6b250YWxDb25zdHJh
aW50cyhyb290SG9yaXpvbnRhbENvbnN0cmFpbnRzKQorICAgICwgbV9saW5lKGlubGluZUZvcm1h
dHRpbmdDb250ZXh0KQorICAgICwgbV9pbmxpbmVJdGVtcyhpbmxpbmVJdGVtcykKK3sKK30KKwor
TGluZUJ1aWxkZXI6OkxpbmVCdWlsZGVyKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBp
bmxpbmVGb3JtYXR0aW5nQ29udGV4dCwgY29uc3QgSW5saW5lSXRlbXMmIGlubGluZUl0ZW1zKQor
ICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkK
KyAgICAsIG1fbGluZShpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1faW5saW5lSXRl
bXMoaW5saW5lSXRlbXMpCit7Cit9CisKK0xpbmVCdWlsZGVyOjpMaW5lQ29udGVudCBMaW5lQnVp
bGRlcjo6bGF5b3V0SW5saW5lQ29udGVudChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5
b3V0UmFuZ2UsIHNpemVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElu
bGluZUxheW91dFVuaXQ+IG92ZXJmbG93TG9naWNhbFdpZHRoLCBjb25zdCBJbmxpbmVSZWN0JiBp
bml0aWFsTGluZUxvZ2ljYWxSZWN0LCBib29sIGlzRmlyc3RMaW5lKQoreworICAgIGluaXRpYWxp
emUoaW5pdGlhbENvbnN0cmFpbnRzRm9yTGluZShpbml0aWFsTGluZUxvZ2ljYWxSZWN0LCBpc0Zp
cnN0TGluZSkpOworCisgICAgYXV0byBjb21taXR0ZWRDb250ZW50ID0gcGxhY2VJbmxpbmVDb250
ZW50KG5lZWRzTGF5b3V0UmFuZ2UsIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCwgb3ZlcmZs
b3dMb2dpY2FsV2lkdGgpOworICAgIGF1dG8gY29tbWl0dGVkUmFuZ2UgPSBjbG9zZShuZWVkc0xh
eW91dFJhbmdlLCBjb21taXR0ZWRDb250ZW50KTsKKworICAgIGF1dG8gaXNMYXN0TGluZSA9IGlz
TGFzdExpbmVXaXRoSW5saW5lQ29udGVudChjb21taXR0ZWRSYW5nZSwgbmVlZHNMYXlvdXRSYW5n
ZS5lbmQsIGNvbW1pdHRlZENvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCk7Cisg
ICAgcmV0dXJuIExpbmVDb250ZW50IHsgY29tbWl0dGVkUmFuZ2UsIGNvbW1pdHRlZENvbnRlbnQu
cGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCwgY29tbWl0dGVkQ29udGVudC5vdmVyZmxvd0xv
Z2ljYWxXaWR0aCwgbV9mbG9hdHMsIG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0CisgICAg
ICAgICwgbV9saW5lTG9naWNhbFJlY3QudG9wTGVmdCgpCisgICAgICAgICwgbV9saW5lTG9naWNh
bFJlY3Qud2lkdGgoKQorICAgICAgICAsIG1fbGluZS5jb250ZW50TG9naWNhbFdpZHRoKCkKKyAg
ICAgICAgLCBpc0xhc3RMaW5lCisgICAgICAgICwgbV9saW5lLm5vblNwYW5uaW5nSW5saW5lTGV2
ZWxCb3hDb3VudCgpCisgICAgICAgICwgbV9saW5lLnJ1bnMoKX07Cit9CisKK0xpbmVCdWlsZGVy
OjpJbnRyaW5zaWNDb250ZW50IExpbmVCdWlsZGVyOjpjb21wdXRlZEludHJpbnNpY1dpZHRoKGNv
bnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgSW5saW5lTGF5b3V0VW5pdCBh
dmFpbGFibGVXaWR0aCkKK3sKKyAgICBpbml0aWFsaXplKHsgeyB7IH0sIHsgYXZhaWxhYmxlV2lk
dGgsIG1heElubGluZUxheW91dFVuaXQoKSB9IH0sIGZhbHNlIH0pOworICAgIGF1dG8gY29tbWl0
dGVkQ29udGVudCA9IHBsYWNlSW5saW5lQ29udGVudChuZWVkc0xheW91dFJhbmdlLCB7IH0sIHsg
fSk7CisgICAgYXV0byBjb21taXR0ZWRSYW5nZSA9IGNsb3NlKG5lZWRzTGF5b3V0UmFuZ2UsIGNv
bW1pdHRlZENvbnRlbnQpOworICAgIHJldHVybiB7IGNvbW1pdHRlZFJhbmdlLCBtX2xpbmUuY29u
dGVudExvZ2ljYWxXaWR0aCgpLCBtX2Zsb2F0cyB9OworfQorCit2b2lkIExpbmVCdWlsZGVyOjpp
bml0aWFsaXplKGNvbnN0IFVzZWRDb25zdHJhaW50cyYgbGluZUNvbnN0cmFpbnRzKQoreworICAg
IG1fZmxvYXRzLmNsZWFyKCk7CisgICAgbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtID0geyB9Owor
ICAgIG1fd3JhcE9wcG9ydHVuaXR5TGlzdC5jbGVhcigpOworCisgICAgbV9saW5lLmluaXRpYWxp
emUoKTsKKyAgICBtX2xpbmVMb2dpY2FsUmVjdCA9IGxpbmVDb25zdHJhaW50cy5sb2dpY2FsUmVj
dDsKKyAgICBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IGxpbmVDb25zdHJhaW50cy5p
c0NvbnN0cmFpbmVkQnlGbG9hdDsKK30KKworTGluZUJ1aWxkZXI6OkNvbW1pdHRlZENvbnRlbnQg
TGluZUJ1aWxkZXI6OnBsYWNlSW5saW5lQ29udGVudChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5l
ZWRzTGF5b3V0UmFuZ2UsIHNpemVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlv
bmFsPElubGluZUxheW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgpCit7CisgICAgYXV0byBs
aW5lQ2FuZGlkYXRlID0gTGluZUNhbmRpZGF0ZSB7IGxheW91dFN0YXRlKCkuc2hvdWxkSWdub3Jl
VHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgfTsKKyAgICBhdXRvIGlubGluZUNvbnRlbnRCcmVha2Vy
ID0gSW5saW5lQ29udGVudEJyZWFrZXIgeyB9OworCisgICAgYXV0byBjdXJyZW50SXRlbUluZGV4
ID0gbmVlZHNMYXlvdXRSYW5nZS5zdGFydDsKKyAgICBzaXplX3QgY29tbWl0dGVkSW5saW5lSXRl
bUNvdW50ID0gMDsKKyAgICB3aGlsZSAoY3VycmVudEl0ZW1JbmRleCA8IG5lZWRzTGF5b3V0UmFu
Z2UuZW5kKSB7CisgICAgICAgIC8vIDEuIENvbGxlY3QgdGhlIHNldCBvZiBydW5zIHRoYXQgd2Ug
Y2FuIGNvbW1pdCB0byB0aGUgbGluZSBhcyBvbmUgZW50aXR5IGUuZy4gPHNwYW4+dGV4dF9hbmRf
c3Bhbl9zdGFydF9zcGFuX2VuZDwvc3Bhbj4uCisgICAgICAgIC8vIDIuIEFwcGx5IGZsb2F0cyBh
bmQgc2hyaW5rIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFjZSBlLmcuIDxzcGFuPmludHJ1
XzxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0Ij48L2Rpdj5zaXZlX2Zsb2F0PC9zcGFuPi4KKyAgICAg
ICAgLy8gMy4gQ2hlY2sgaWYgdGhlIGNvbnRlbnQgZml0cyB0aGUgbGluZSBhbmQgY29tbWl0IHRo
ZSBjb250ZW50IGFjY29yZGluZ2x5IChmdWxsLCBwYXJ0aWFsIG9yIG5vdCBjb21taXQgYXQgYWxs
KS4KKyAgICAgICAgLy8gNC4gUmV0dXJuIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5l
IGVpdGhlciBieSBub3QgYmVpbmcgYWJsZSB0byBmaXQgbW9yZSBjb250ZW50IG9yIGJlY2F1c2Ug
b2YgYW4gZXhwbGljaXQgbGluZSBicmVhay4KKyAgICAgICAgY2FuZGlkYXRlQ29udGVudEZvckxp
bmUobGluZUNhbmRpZGF0ZSwgY3VycmVudEl0ZW1JbmRleCwgbmVlZHNMYXlvdXRSYW5nZSwgcGFy
dGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBzdGQ6OmV4Y2hhbmdlKGxlYWRpbmdMb2dpY2FsV2lk
dGgsIFdURjo6bnVsbG9wdCksIG1fbGluZS5jb250ZW50TG9naWNhbFJpZ2h0KCkpOworICAgICAg
ICAvLyBOb3cgY2hlY2sgaWYgd2UgY2FuIHB1dCB0aGlzIGNvbnRlbnQgb24gdGhlIGN1cnJlbnQg
bGluZS4KKyAgICAgICAgYXV0byByZXN1bHQgPSBSZXN1bHQgeyB9OworICAgICAgICBpZiAobGlu
ZUNhbmRpZGF0ZS5mbG9hdEl0ZW0pIHsKKyAgICAgICAgICAgIEFTU0VSVChsaW5lQ2FuZGlkYXRl
LmlubGluZUNvbnRlbnQuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGhhbmRsZUZsb2F0Q29udGVu
dCgqbGluZUNhbmRpZGF0ZS5mbG9hdEl0ZW0pOworICAgICAgICAgICAgLy8gRmxvYXRzIG5ldmVy
IHRlcm1pbmF0ZSB0aGUgbGluZS4KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXN1bHQg
PSBoYW5kbGVJbmxpbmVDb250ZW50KGlubGluZUNvbnRlbnRCcmVha2VyLCBuZWVkc0xheW91dFJh
bmdlLCBsaW5lQ2FuZGlkYXRlKTsKKyAgICAgICAgYXV0byBpc0VuZE9mTGluZSA9IHJlc3VsdC5p
c0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllczsKKyAg
ICAgICAgaWYgKCFyZXN1bHQuY29tbWl0dGVkQ291bnQuaXNSZXZlcnQpIHsKKyAgICAgICAgICAg
IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCArPSByZXN1bHQuY29tbWl0dGVkQ291bnQudmFsdWU7
CisgICAgICAgICAgICBhdXRvJiBpbmxpbmVDb250ZW50ID0gbGluZUNhbmRpZGF0ZS5pbmxpbmVD
b250ZW50OworICAgICAgICAgICAgYXV0byBpbmxpbmVDb250ZW50SXNGdWxseUNvbW1pdHRlZCA9
IGlubGluZUNvbnRlbnQuY29udGludW91c0NvbnRlbnQoKS5ydW5zKCkuc2l6ZSgpID09IHJlc3Vs
dC5jb21taXR0ZWRDb3VudC52YWx1ZSAmJiAhcmVzdWx0LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRM
ZW5ndGg7CisgICAgICAgICAgICBpZiAoaW5saW5lQ29udGVudElzRnVsbHlDb21taXR0ZWQpIHsK
KyAgICAgICAgICAgICAgICBpZiAoYXV0byogd29yZEJyZWFrT3Bwb3J0dW5pdHkgPSBpbmxpbmVD
b250ZW50LnRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkgeworICAgICAgICAgICAgICAg
ICAgICAvLyA8d2JyPiBuZWVkcyB0byBiZSBvbiB0aGUgbGluZSBhcyBhbiBlbXB0eSBydW4gc28g
dGhhdCB3ZSBjYW4gY29uc3RydWN0IGFuIGlubGluZSBib3ggYW5kIGNvbXB1dGUgYmFzaWMgZ2Vv
bWV0cnkuCisgICAgICAgICAgICAgICAgICAgICsrY29tbWl0dGVkSW5saW5lSXRlbUNvdW50Owor
ICAgICAgICAgICAgICAgICAgICBtX2xpbmUuYXBwZW5kKCp3b3JkQnJlYWtPcHBvcnR1bml0eSwg
eyB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlubGluZUNvbnRl
bnQudHJhaWxpbmdMaW5lQnJlYWsoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGdWxseSBj
b21taXR0ZWQgKG9yIGVtcHR5KSBjb250ZW50IGZvbGxvd2VkIGJ5IGEgbGluZSBicmVhayBtZWFu
cyAiZW5kIG9mIGxpbmUiLgorICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyB3aWxs
IHB1dCB0aGUgbGluZSBicmVhayBib3ggYXQgdGhlIGVuZCBvZiB0aGUgbGluZSB3aGlsZSBpbiBj
YXNlIG9mIHNvbWUgaW5saW5lIGJveGVzLCB0aGUgbGluZSBicmVhaworICAgICAgICAgICAgICAg
ICAgICAvLyBjb3VsZCB2ZXJ5IHdlbGwgYmUgYXQgYW4gZWFybGllciBwb3NpdGlvbi4gVGhpcyBo
YXMgbm8gdmlzdWFsIGltcGxpY2F0aW9ucyBhdCB0aGlzIHBvaW50IHRob3VnaCAob25seSBnZW9t
ZXRyeSBjb3JyZWN0bmVzcyBvbiB0aGUgbGluZSBicmVhayBib3gpLgorICAgICAgICAgICAgICAg
ICAgICAvLyBlLmcuIDxzcGFuIHN0eWxlPSJib3JkZXItcmlnaHQ6IDEwcHggc29saWQgZ3JlZW4i
PnRleHQ8YnI+PC9zcGFuPiB3aGVyZSB0aGUgPGJyPidzIGhvcml6b250YWwgcG9zaXRpb24gaXMg
YmVmb3JlIHRoZSByaWdodCBib3JkZXIgYW5kIG5vdCBhZnRlci4KKyAgICAgICAgICAgICAgICAg
ICAgbV9saW5lLmFwcGVuZCgqaW5saW5lQ29udGVudC50cmFpbGluZ0xpbmVCcmVhaygpLCB7IH0p
OworICAgICAgICAgICAgICAgICAgICArK2NvbW1pdHRlZElubGluZUl0ZW1Db3VudDsKKyAgICAg
ICAgICAgICAgICAgICAgaXNFbmRPZkxpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBjb21taXR0ZWRJbmxpbmVJ
dGVtQ291bnQgPSByZXN1bHQuY29tbWl0dGVkQ291bnQudmFsdWU7CisKKyAgICAgICAgaWYgKGlz
RW5kT2ZMaW5lKSB7CisgICAgICAgICAgICAvLyBXZSBjYW4ndCBwbGFjZSBhbnkgbW9yZSBpdGVt
cyBvbiB0aGUgY3VycmVudCBsaW5lLgorICAgICAgICAgICAgcmV0dXJuIHsgY29tbWl0dGVkSW5s
aW5lSXRlbUNvdW50LCByZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCwgcmVzdWx0
Lm92ZXJmbG93TG9naWNhbFdpZHRoIH07CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudEl0ZW1J
bmRleCA9IG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQgKyBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQg
KyBtX2Zsb2F0cy5zaXplKCk7CisgICAgICAgIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCA9
IHsgfTsKKyAgICB9CisgICAgLy8gTG9va3MgbGlrZSB3ZSd2ZSBydW4gb3V0IG9mIHJ1bnMuCisg
ICAgcmV0dXJuIHsgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50LCB7IH0gfTsKK30KKworTGluZUJ1
aWxkZXI6OklubGluZUl0ZW1SYW5nZSBMaW5lQnVpbGRlcjo6Y2xvc2UoY29uc3QgSW5saW5lSXRl
bVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBjb25zdCBDb21taXR0ZWRDb250ZW50JiBjb21taXR0
ZWRDb250ZW50KQoreworICAgIEFTU0VSVChjb21taXR0ZWRDb250ZW50LmlubGluZUl0ZW1Db3Vu
dCB8fCAhbV9mbG9hdHMuaXNFbXB0eSgpIHx8IG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0
KTsKKyAgICBhdXRvIG51bWJlck9mQ29tbWl0dGVkSXRlbXMgPSBjb21taXR0ZWRDb250ZW50Lmlu
bGluZUl0ZW1Db3VudCArIG1fZmxvYXRzLnNpemUoKTsKKyAgICBhdXRvIHRyYWlsaW5nSW5saW5l
SXRlbUluZGV4ID0gbmVlZHNMYXlvdXRSYW5nZS5zdGFydCArIG51bWJlck9mQ29tbWl0dGVkSXRl
bXMgLSAxOworICAgIGF1dG8gbGluZVJhbmdlID0gSW5saW5lSXRlbVJhbmdlIHsgbmVlZHNMYXlv
dXRSYW5nZS5zdGFydCwgdHJhaWxpbmdJbmxpbmVJdGVtSW5kZXggKyAxIH07CisgICAgQVNTRVJU
KGxpbmVSYW5nZS5lbmQgPD0gbmVlZHNMYXlvdXRSYW5nZS5lbmQpOworICAgIGlmICghY29tbWl0
dGVkQ29udGVudC5pbmxpbmVJdGVtQ291bnQpIHsKKyAgICAgICAgLy8gTGluZSBpcyBlbXB0eSwg
d2Ugb25seSBtYW5hZ2VkIHRvIHBsYWNlIGZsb2F0IGJveGVzLgorICAgICAgICByZXR1cm4gbGlu
ZVJhbmdlOworICAgIH0KKyAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gbV9saW5lTG9naWNhbFJl
Y3Qud2lkdGgoKSAtIG1fbGluZS5jb250ZW50TG9naWNhbFJpZ2h0KCk7CisgICAgbV9saW5lLnJl
bW92ZUNvbGxhcHNpYmxlQ29udGVudChhdmFpbGFibGVXaWR0aCk7CisgICAgYXV0byBob3Jpem9u
dGFsQWxpZ25tZW50ID0gcm9vdCgpLnN0eWxlKCkudGV4dEFsaWduKCk7CisgICAgYXV0byBydW5z
RXhwYW5kSG9yaXpvbnRhbGx5ID0gaG9yaXpvbnRhbEFsaWdubWVudCA9PSBUZXh0QWxpZ25Nb2Rl
OjpKdXN0aWZ5ICYmICFpc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQobGluZVJhbmdlLCBuZWVk
c0xheW91dFJhbmdlLmVuZCwgY29tbWl0dGVkQ29udGVudC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50
TGVuZ3RoKTsKKyAgICBpZiAocnVuc0V4cGFuZEhvcml6b250YWxseSkKKyAgICAgICAgbV9saW5l
LmFwcGx5UnVuRXhwYW5zaW9uKG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkgLSBtX2xpbmUuY29u
dGVudExvZ2ljYWxSaWdodCgpKTsKKyAgICBhdXRvIGxpbmVFbmRzV2l0aEh5cGhlbiA9IGZhbHNl
OworICAgIGlmICghbV9saW5lLnJ1bnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgYXV0byYgbGFz
dFRleHRDb250ZW50ID0gbV9saW5lLnJ1bnMoKS5sYXN0KCkudGV4dENvbnRlbnQoKTsKKyAgICAg
ICAgbGluZUVuZHNXaXRoSHlwaGVuID0gbGFzdFRleHRDb250ZW50ICYmIGxhc3RUZXh0Q29udGVu
dC0+bmVlZHNIeXBoZW4oKTsKKyAgICB9CisgICAgbV9zdWNjZXNzaXZlSHlwaGVuYXRlZExpbmVD
b3VudCA9IGxpbmVFbmRzV2l0aEh5cGhlbiA/IG1fc3VjY2Vzc2l2ZUh5cGhlbmF0ZWRMaW5lQ291
bnQgKyAxIDogMDsKKyAgICByZXR1cm4gbGluZVJhbmdlOworfQorCitPcHRpb25hbDxIb3Jpem9u
dGFsQ29uc3RyYWludHM+IExpbmVCdWlsZGVyOjpmbG9hdENvbnN0cmFpbnRzKGNvbnN0IElubGlu
ZVJlY3QmIGxpbmVMb2dpY2FsUmVjdCkgY29uc3QKK3sKKyAgICBhdXRvKiBmbG9hdGluZ1N0YXRl
ID0gdGhpcy0+ZmxvYXRpbmdTdGF0ZSgpOworICAgIGlmICghZmxvYXRpbmdTdGF0ZSB8fCBmbG9h
dGluZ1N0YXRlLT5mbG9hdHMoKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB7IH07CisKKyAg
ICAvLyBDaGVjayBmb3IgaW50cnVkaW5nIGZsb2F0cyBhbmQgYWRqdXN0IGxvZ2ljYWwgbGVmdC9h
dmFpbGFibGUgd2lkdGggZm9yIHRoaXMgbGluZSBhY2NvcmRpbmdseS4KKyAgICBhdXRvIGZsb2F0
aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7IGZvcm1hdHRpbmdDb250ZXh0KCksICpmbG9h
dGluZ1N0YXRlIH07CisgICAgYXV0byBjb25zdHJhaW50cyA9IGZsb2F0aW5nQ29udGV4dC5jb25z
dHJhaW50cyh0b0xheW91dFVuaXQobGluZUxvZ2ljYWxSZWN0LnRvcCgpKSwgdG9MYXlvdXRVbml0
KGxpbmVMb2dpY2FsUmVjdC5ib3R0b20oKSkpOworICAgIC8vIENoZWNrIGlmIHRoZXNlIHZhbHVl
cyBhY3R1YWxseSBjb25zdHJhaW4gdGhlIGxpbmUuCisgICAgaWYgKGNvbnN0cmFpbnRzLmxlZnQg
JiYgY29uc3RyYWludHMubGVmdC0+eCA8PSBsaW5lTG9naWNhbFJlY3QubGVmdCgpKQorICAgICAg
ICBjb25zdHJhaW50cy5sZWZ0ID0geyB9OworCisgICAgaWYgKGNvbnN0cmFpbnRzLnJpZ2h0ICYm
IGNvbnN0cmFpbnRzLnJpZ2h0LT54ID49IGxpbmVMb2dpY2FsUmVjdC5yaWdodCgpKQorICAgICAg
ICBjb25zdHJhaW50cy5yaWdodCA9IHsgfTsKKworICAgIGlmICghY29uc3RyYWludHMubGVmdCAm
JiAhY29uc3RyYWludHMucmlnaHQpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICBhdXRvIGxp
bmVMb2dpY2FsTGVmdCA9IGxpbmVMb2dpY2FsUmVjdC5sZWZ0KCk7CisgICAgYXV0byBsaW5lTG9n
aWNhbFJpZ2h0ID0gbGluZUxvZ2ljYWxSZWN0LnJpZ2h0KCk7CisgICAgaWYgKGNvbnN0cmFpbnRz
LmxlZnQgJiYgY29uc3RyYWludHMucmlnaHQpIHsKKyAgICAgICAgbGluZUxvZ2ljYWxSaWdodCA9
IGNvbnN0cmFpbnRzLnJpZ2h0LT54OworICAgICAgICBsaW5lTG9naWNhbExlZnQgPSBjb25zdHJh
aW50cy5sZWZ0LT54OworICAgIH0gZWxzZSBpZiAoY29uc3RyYWludHMubGVmdCkgeworICAgICAg
ICBBU1NFUlQoY29uc3RyYWludHMubGVmdC0+eCA+PSBsaW5lTG9naWNhbExlZnQpOworICAgICAg
ICBsaW5lTG9naWNhbExlZnQgPSBjb25zdHJhaW50cy5sZWZ0LT54OworICAgIH0gZWxzZSBpZiAo
Y29uc3RyYWludHMucmlnaHQpIHsKKyAgICAgICAgLy8gUmlnaHQgZmxvYXQgYm94ZXMgbWF5IG92
ZXJmbG93IHRoZSBjb250YWluaW5nIGJsb2NrIG9uIHRoZSBsZWZ0LgorICAgICAgICBsaW5lTG9n
aWNhbFJpZ2h0ID0gc3RkOjptYXg8SW5saW5lTGF5b3V0VW5pdD4obGluZUxvZ2ljYWxMZWZ0LCBj
b25zdHJhaW50cy5yaWdodC0+eCk7CisgICAgfQorICAgIHJldHVybiBIb3Jpem9udGFsQ29uc3Ry
YWludHMgeyB0b0xheW91dFVuaXQobGluZUxvZ2ljYWxMZWZ0KSwgdG9MYXlvdXRVbml0KGxpbmVM
b2dpY2FsUmlnaHQgLSBsaW5lTG9naWNhbExlZnQpIH07Cit9CisKK0xpbmVCdWlsZGVyOjpVc2Vk
Q29uc3RyYWludHMgTGluZUJ1aWxkZXI6OmluaXRpYWxDb25zdHJhaW50c0ZvckxpbmUoY29uc3Qg
SW5saW5lUmVjdCYgaW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgYm9vbCBpc0ZpcnN0TGluZSkgY29u
c3QKK3sKKyAgICBhdXRvIGxpbmVMb2dpY2FsTGVmdCA9IGluaXRpYWxMaW5lTG9naWNhbFJlY3Qu
bGVmdCgpOworICAgIGF1dG8gbGluZUxvZ2ljYWxSaWdodCA9IGluaXRpYWxMaW5lTG9naWNhbFJl
Y3QucmlnaHQoKTsKKyAgICBhdXRvIGxpbmVJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IGZhbHNlOwor
CisgICAgaWYgKGF1dG8gbGluZUNvbnN0cmFpbnRzID0gZmxvYXRDb25zdHJhaW50cyhpbml0aWFs
TGluZUxvZ2ljYWxSZWN0KSkgeworICAgICAgICBsaW5lTG9naWNhbExlZnQgPSBsaW5lQ29uc3Ry
YWludHMtPmxvZ2ljYWxMZWZ0OworICAgICAgICBsaW5lTG9naWNhbFJpZ2h0ID0gbGluZUNvbnN0
cmFpbnRzLT5sb2dpY2FsUmlnaHQoKTsKKyAgICAgICAgbGluZUlzQ29uc3RyYWluZWRCeUZsb2F0
ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBhdXRvIGNvbXB1dGVkVGV4dEluZGVudCA9IFsmXSgpIC0+
IElubGluZUxheW91dFVuaXQgeworICAgICAgICAvLyB0ZXh0LWluZGVudCBwcm9wZXJ0eSBzcGVj
aWZpZXMgdGhlIGluZGVudGF0aW9uIGFwcGxpZWQgdG8gbGluZXMgb2YgaW5saW5lIGNvbnRlbnQg
aW4gYSBibG9jay4KKyAgICAgICAgLy8gVGhlIGluZGVudCBpcyB0cmVhdGVkIGFzIGEgbWFyZ2lu
IGFwcGxpZWQgdG8gdGhlIHN0YXJ0IGVkZ2Ugb2YgdGhlIGxpbmUgYm94LgorICAgICAgICAvLyBV
bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgb25seSBsaW5lcyB0aGF0IGFyZSB0aGUgZmlyc3Qg
Zm9ybWF0dGVkIGxpbmUgb2YgYW4gZWxlbWVudCBhcmUgYWZmZWN0ZWQuCisgICAgICAgIC8vIEZv
ciBleGFtcGxlLCB0aGUgZmlyc3QgbGluZSBvZiBhbiBhbm9ueW1vdXMgYmxvY2sgYm94IGlzIG9u
bHkgYWZmZWN0ZWQgaWYgaXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJlbnQgZWxlbWVu
dC4KKyAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBlYWNoLWxpbmUuCisgICAgICAg
IC8vIFtJbnRlZ3JhdGlvbl0gcm9vdCgpLT5wYXJlbnQoKSB3b3VsZCBub3JtYWxseSBwcm9kdWNl
IGEgdmFsaWQgbGF5b3V0IGJveC4KKyAgICAgICAgYXV0byYgcm9vdCA9IHRoaXMtPnJvb3QoKTsK
KyAgICAgICAgYXV0byBpc0Zvcm1hdHRpbmdDb250ZXh0Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVu
dCA9ICFyb290LmlzQW5vbnltb3VzKCk7CisgICAgICAgIGlmIChyb290LmlzQW5vbnltb3VzKCkp
IHsKKyAgICAgICAgICAgIC8vIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRoZSBlYWNo
LWxpbmUgYW5kL29yIGhhbmdpbmcga2V5d29yZHMsIG9ubHkgbGluZXMgdGhhdCBhcmUgdGhlIGZp
cnN0IGZvcm1hdHRlZCBsaW5lCisgICAgICAgICAgICAvLyBvZiBhbiBlbGVtZW50IGFyZSBhZmZl
Y3RlZC4KKyAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCB0aGUgZmlyc3QgbGluZSBvZiBhbiBh
bm9ueW1vdXMgYmxvY2sgYm94IGlzIG9ubHkgYWZmZWN0ZWQgaWYgaXQgaXMgdGhlIGZpcnN0IGNo
aWxkIG9mIGl0cyBwYXJlbnQgZWxlbWVudC4KKyAgICAgICAgICAgIGF1dG8gaXNJbnRlZ3JhdGVk
Um9vdEJveEZpcnN0Q2hpbGQgPSBsYXlvdXRTdGF0ZSgpLmlzSW50ZWdyYXRlZFJvb3RCb3hGaXJz
dENoaWxkKCk7CisgICAgICAgICAgICBpZiAoaXNJbnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQg
PT0gTGF5b3V0U3RhdGU6OklzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkOjpOb3RBcHBsaWNh
YmxlKQorICAgICAgICAgICAgICAgIGlzRm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9U
ZXh0SW5kZW50ID0gcm9vdC5wYXJlbnQoKS5maXJzdEluRmxvd0NoaWxkKCkgPT0gJnJvb3Q7Cisg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaXNGb3JtYXR0aW5nQ29udGV4dFJvb3RD
YW5kaWRhdGVUb1RleHRJbmRlbnQgPSBpc0ludGVncmF0ZWRSb290Qm94Rmlyc3RDaGlsZCA9PSBM
YXlvdXRTdGF0ZTo6SXNJbnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQ6OlllczsKKyAgICAgICAg
fQorICAgICAgICBpZiAoIWlzRm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9UZXh0SW5k
ZW50KQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgYXV0byBpbnZlcnRMaW5lUmFu
Z2UgPSByb290LnN0eWxlKCkudGV4dEluZGVudFR5cGUoKSA9PSBUZXh0SW5kZW50VHlwZTo6SGFu
Z2luZzsKKyAgICAgICAgLy8gdGV4dC1pbmRlbnQ6IGhhbmdpbmcgaW52ZXJ0cyB3aGljaCBsaW5l
cyBhcmUgYWZmZWN0ZWQuCisgICAgICAgIC8vIGludmVydGVkIGxpbmUgcmFuZ2UgLT4gYWxsIHRo
ZSBsaW5lcyBleGNlcHQgdGhlIGZpcnN0IG9uZS4KKyAgICAgICAgLy8gIWludmVydGVkIGxpbmUg
cmFuZ2UgLT4gZmlyc3QgbGluZSBnZXRzIHRoZSBpbmRlbnQuCisgICAgICAgIGF1dG8gc2hvdWxk
SW5kZW50ID0gaW52ZXJ0TGluZVJhbmdlICE9IGlzRmlyc3RMaW5lOworICAgICAgICBpZiAoIXNo
b3VsZEluZGVudCkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisKKyAgICAgICAgYXV0byB0ZXh0
SW5kZW50ID0gcm9vdC5zdHlsZSgpLnRleHRJbmRlbnQoKTsKKyAgICAgICAgaWYgKHRleHRJbmRl
bnQgPT0gUmVuZGVyU3R5bGU6OmluaXRpYWxUZXh0SW5kZW50KCkpCisgICAgICAgICAgICByZXR1
cm4geyB9OworICAgICAgICByZXR1cm4geyBtaW5pbXVtVmFsdWVGb3JMZW5ndGgodGV4dEluZGVu
dCwgaW5pdGlhbExpbmVMb2dpY2FsUmVjdC53aWR0aCgpKSB9OworICAgIH07CisgICAgbGluZUxv
Z2ljYWxMZWZ0ICs9IGNvbXB1dGVkVGV4dEluZGVudCgpOworICAgIHJldHVybiBVc2VkQ29uc3Ry
YWludHMgeyB7IGluaXRpYWxMaW5lTG9naWNhbFJlY3QudG9wKCksIGxpbmVMb2dpY2FsTGVmdCwg
bGluZUxvZ2ljYWxSaWdodCAtIGxpbmVMb2dpY2FsTGVmdCwgaW5pdGlhbExpbmVMb2dpY2FsUmVj
dC5oZWlnaHQoKSB9LCBsaW5lSXNDb25zdHJhaW5lZEJ5RmxvYXQgfTsKK30KKwordm9pZCBMaW5l
QnVpbGRlcjo6Y2FuZGlkYXRlQ29udGVudEZvckxpbmUoTGluZUNhbmRpZGF0ZSYgbGluZUNhbmRp
ZGF0ZSwgc2l6ZV90IGN1cnJlbnRJbmxpbmVJdGVtSW5kZXgsIGNvbnN0IElubGluZUl0ZW1SYW5n
ZSYgbGF5b3V0UmFuZ2UsIHNpemVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlv
bmFsPElubGluZUxheW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgsIElubGluZUxheW91dFVu
aXQgY3VycmVudExvZ2ljYWxSaWdodCkKK3sKKyAgICBBU1NFUlQoY3VycmVudElubGluZUl0ZW1J
bmRleCA8IGxheW91dFJhbmdlLmVuZCk7CisgICAgbGluZUNhbmRpZGF0ZS5yZXNldCgpOworICAg
IC8vIDEuIFNpbXBseSBhZGQgYW55IG92ZXJmbG93IGNvbnRlbnQgZnJvbSB0aGUgcHJldmlvdXMg
bGluZSB0byB0aGUgY2FuZGlkYXRlIGNvbnRlbnQuIEl0J3MgYWx3YXlzIGEgdGV4dCBjb250ZW50
LgorICAgIC8vIDIuIEZpbmQgdGhlIG5leHQgc29mdCB3cmFwIHBvc2l0aW9uIG9yIGV4cGxpY2l0
IGxpbmUgYnJlYWsuCisgICAgLy8gMy4gQ29sbGVjdCBmbG9hdHMgYmV0d2VlbiB0aGUgaW5saW5l
IGNvbnRlbnQuCisgICAgYXV0byBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggPSBuZXh0V3JhcE9w
cG9ydHVuaXR5KGN1cnJlbnRJbmxpbmVJdGVtSW5kZXgsIGxheW91dFJhbmdlKTsKKyAgICAvLyBz
b2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggPT0gbGF5b3V0UmFuZ2UuZW5kIG1lYW5zIHdlIGRvbid0
IGhhdmUgYW55IHdyYXAgb3Bwb3J0dW5pdHkgaW4gdGhpcyBjb250ZW50LgorICAgIEFTU0VSVChz
b2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggPD0gbGF5b3V0UmFuZ2UuZW5kKTsKKworICAgIGlmIChw
YXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgpIHsKKyAgICAgICAgLy8gSGFuZGxlIGxlYWRpbmcg
cGFydGlhbCBjb250ZW50IGZpcnN0IChvdmVyZmxvd2luZyB0ZXh0IGZyb20gdGhlIHByZXZpb3Vz
IGxpbmUpLgorICAgICAgICAvLyBDb25zdHJ1Y3QgYSBwYXJ0aWFsIGxlYWRpbmcgaW5saW5lIGl0
ZW0uCisgICAgICAgIG1fcGFydGlhbExlYWRpbmdUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRl
eHRJdGVtPihtX2lubGluZUl0ZW1zW2N1cnJlbnRJbmxpbmVJdGVtSW5kZXhdKS5yaWdodChwYXJ0
aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgpOworICAgICAgICBhdXRvIGl0ZW1XaWR0aCA9IGxlYWRp
bmdMb2dpY2FsV2lkdGggPyAqc3RkOjpleGNoYW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6
Om51bGxvcHQpIDogaW5saW5lSXRlbVdpZHRoKCptX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0sIGN1
cnJlbnRMb2dpY2FsUmlnaHQpOworICAgICAgICBsaW5lQ2FuZGlkYXRlLmlubGluZUNvbnRlbnQu
YXBwZW5kSW5saW5lSXRlbSgqbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtLCBpdGVtV2lkdGgpOwor
ICAgICAgICBjdXJyZW50TG9naWNhbFJpZ2h0ICs9IGl0ZW1XaWR0aDsKKyAgICAgICAgKytjdXJy
ZW50SW5saW5lSXRlbUluZGV4OworICAgIH0KKworICAgIGZvciAoYXV0byBpbmRleCA9IGN1cnJl
bnRJbmxpbmVJdGVtSW5kZXg7IGluZGV4IDwgc29mdFdyYXBPcHBvcnR1bml0eUluZGV4OyArK2lu
ZGV4KSB7CisgICAgICAgIGF1dG8mIGlubGluZUl0ZW0gPSBtX2lubGluZUl0ZW1zW2luZGV4XTsK
KyAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNGbG9hdCgpKSB7CisgICAgICAgICAgICBsaW5lQ2Fu
ZGlkYXRlLmZsb2F0SXRlbSA9ICZpbmxpbmVJdGVtOworICAgICAgICAgICAgLy8gVGhpcyBpcyBh
IHNvZnQgd3JhcCBvcHBvcnR1bml0eSwgbXVzdCBiZSB0aGUgb25seSBpdGVtIGluIHRoZSBsaXN0
LgorICAgICAgICAgICAgQVNTRVJUKGN1cnJlbnRJbmxpbmVJdGVtSW5kZXggKyAxID09IHNvZnRX
cmFwT3Bwb3J0dW5pdHlJbmRleCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQor
ICAgICAgICBpZiAoaW5saW5lSXRlbS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94
U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkgfHwgaW5saW5lSXRlbS5pc0Jv
eCgpKSB7CisgICAgICAgICAgICBBU1NFUlQoIWxlYWRpbmdMb2dpY2FsV2lkdGggfHwgaW5saW5l
SXRlbS5pc1RleHQoKSk7CisgICAgICAgICAgICBhdXRvIGxvZ2ljYWxXaWR0aCA9IGxlYWRpbmdM
b2dpY2FsV2lkdGggPyAqc3RkOjpleGNoYW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6Om51
bGxvcHQpIDogaW5saW5lSXRlbVdpZHRoKGlubGluZUl0ZW0sIGN1cnJlbnRMb2dpY2FsUmlnaHQp
OworICAgICAgICAgICAgbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmFwcGVuZElubGluZUl0
ZW0oaW5saW5lSXRlbSwgbG9naWNhbFdpZHRoKTsKKyAgICAgICAgICAgIGN1cnJlbnRMb2dpY2Fs
UmlnaHQgKz0gbG9naWNhbFdpZHRoOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0K
KyAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNMaW5lQnJlYWsoKSB8fCBpbmxpbmVJdGVtLmlzV29y
ZEJyZWFrT3Bwb3J0dW5pdHkoKSkgeworICAgICAgICAgICAgLy8gU2luY2UgYm90aCA8YnI+IGFu
ZCA8d2JyPiBhcmUgZXhwbGljaXQgd29yZCBicmVhayBvcHBvcnR1bml0aWVzIHRoZXkgaGF2ZSB0
byBiZSB0cmFpbGluZyBpdGVtcyBpbiB0aGlzIGNhbmRpZGF0ZSBydW4gbGlzdCB1bmxlc3MgdGhl
eSBhcmUgZW1iZWRkZWQgaW4gaW5saW5lIGJveGVzLgorICAgICAgICAgICAgLy8gZS5nLiA8c3Bh
bj48d2JyPjwvc3Bhbj4KKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgICAgICAgICAgZm9yIChhdXRv
IGkgPSBpbmRleCArIDE7IGkgPCBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXg7ICsraSkKKyAgICAg
ICAgICAgICAgICBBU1NFUlQobV9pbmxpbmVJdGVtc1tpXS5pc0lubGluZUJveEVuZCgpKTsKKyNl
bmRpZgorICAgICAgICAgICAgaW5saW5lSXRlbS5pc0xpbmVCcmVhaygpID8gbGluZUNhbmRpZGF0
ZS5pbmxpbmVDb250ZW50LmFwcGVuZFRyYWlsaW5nTGluZUJyZWFrKGlubGluZUl0ZW0pIDogbGlu
ZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmFwcGVuZHRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5p
dHkoaW5saW5lSXRlbSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgYXV0byBpbmxpbmVDb250ZW50RW5k
c0luU29mdFdyYXBPcHBvcnR1bml0eSA9IFsmXSB7CisgICAgICAgIGlmICghc29mdFdyYXBPcHBv
cnR1bml0eUluZGV4IHx8IHNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCA9PSBsYXlvdXRSYW5nZS5l
bmQpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgY2FuZGlkYXRlIGlubGluZSBjb250ZW50IGVuZHMg
YmVjYXVzZSB0aGUgZW50aXJlIGNvbnRlbnQgZW5kcyBhbmQgbm90IGJlY2F1c2UgdGhlcmUncyBh
IHNvZnQgd3JhcCBvcHBvcnR1bml0eS4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgICAgICBpZiAobV9pbmxpbmVJdGVtc1tzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXgg
LSAxXS5pc0Zsb2F0KCkpIHsKKyAgICAgICAgICAgIC8vIFdoaWxlIHdlIHN0b3AgYXQgZmxvYXRz
LCB0aGV5IGFyZSBub3QgY29uc2lkZXJlZCByZWFsIHNvZnQgd3JhcCBvcHBvcnR1bml0aWVzLiAK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBTZWUgaHR0
cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10ZXh0LTMvI2xpbmUtYnJlYWstZGV0YWlscworICAgICAg
ICBhdXRvJiB0cmFpbGluZ0lubGluZUl0ZW0gPSBtX2lubGluZUl0ZW1zW3NvZnRXcmFwT3Bwb3J0
dW5pdHlJbmRleCAtIDFdOworICAgICAgICBpZiAodHJhaWxpbmdJbmxpbmVJdGVtLmlzQm94KCkg
fHwgdHJhaWxpbmdJbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkgfHwgdHJhaWxpbmdJbmxpbmVJdGVt
LmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSB8fCB0cmFpbGluZ0lubGluZUl0ZW0uaXNJbmxpbmVC
b3hFbmQoKSkgeworICAgICAgICAgICAgLy8gRm9yIFdlYi1jb21wYXRpYmlsaXR5IHRoZXJlIGlz
IGEgc29mdCB3cmFwIG9wcG9ydHVuaXR5IGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCByZXBsYWNlZCBl
bGVtZW50IG9yIG90aGVyIGF0b21pYyBpbmxpbmUuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgfQorICAgICAgICBpZiAodHJhaWxpbmdJbmxpbmVJdGVtLmlzVGV4dCgpKSB7Cisg
ICAgICAgICAgICBhdXRvJiBpbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVt
Pih0cmFpbGluZ0lubGluZUl0ZW0pOworICAgICAgICAgICAgaWYgKGlubGluZVRleHRJdGVtLmlz
V2hpdGVzcGFjZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAg
Ly8gTm93IGluIGNhc2Ugb2Ygbm9uLXdoaXRlc3BhY2UgdHJhaWxpbmcgY29udGVudCwgd2UgbmVl
ZCB0byBjaGVjayBpZiB0aGUgYWN0dWFsIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBiZWxvbmdzIHRv
IHRoZSBuZXh0IHNldC4KKyAgICAgICAgICAgIC8vIGUuZy4gInRoaXNfaXNfdGhlX3RyYWlsaW5n
X3J1bjxzcGFuPiA8LWJ1dF90aGlzX3NwYWNlX2hlcmVfaXNfdGhlX3NvZnRfd3JhcF9vcHBvcnR1
bml0eSIKKyAgICAgICAgICAgIC8vIFdoZW4gdGhlcmUncyBhbiBpbmxpbmUgYm94IHN0YXJ0KDxz
cGFuPikvZW5kKDwvc3Bhbj4pIGJldHdlZW4gdGhlIHRyYWlsaW5nIGFuZCB0aGUgKG5leHQpbGVh
ZGluZyBydW4sIHdoaWxlIHdlIGJyZWFrIGJlZm9yZSB0aGUgaW5saW5lIGJveCBzdGFydCAoPHNw
YW4+KQorICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzb2Z0IHdyYXAgcG9zaXRpb24gaXMgYWZ0
ZXIgdGhlIGlubGluZSBib3ggc3RhcnQgKDxzcGFuPikgYnV0IGluIHRlcm1zIG9mIGxpbmUgYnJl
YWtpbmcgY29udGludWl0eSB0aGUgaW5saW5lIGJveCBzdGFydCAoPHNwYW4+KSBhbmQgdGhlIHdo
aXRlc3BhY2UgcnVuIGJlbG9uZyB0b2dldGhlci4KKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJU
KGxheW91dFJhbmdlLmVuZCA8PSBtX2lubGluZUl0ZW1zLnNpemUoKSk7CisgICAgICAgICAgICBm
b3IgKGF1dG8gaW5kZXggPSBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXg7IGluZGV4IDwgbGF5b3V0
UmFuZ2UuZW5kOyArK2luZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKG1faW5saW5lSXRlbXNb
aW5kZXhdLmlzSW5saW5lQm94U3RhcnQoKSB8fCBtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGlu
ZUJveEVuZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAg
ICAvLyBGSVhNRTogQ2hlY2sgaWYgW25vbi13aGl0ZXNwYWNlXVtpbmxpbmUtYm94XVtuby13aGl0
ZXNwYWNlXSBjb250ZW50IGhhcyBydWxlcyBhYm91dCBpdC4KKyAgICAgICAgICAgICAgICAvLyBG
b3Igbm93IGxldCdzIHNheSB0aGUgc29mdCB3cmFwIHBvc2l0aW9uIGJlbG9uZ3MgdG8gdGhlIG5l
eHQgc2V0IG9mIHJ1bnMgd2hlbiBbbm9uLXdoaXRlc3BhY2VdW2lubGluZS1ib3hdW3doaXRlc3Bh
Y2VdLCBbbm9uLXdoaXRlc3BhY2VdW2lubGluZS1ib3hdW2JveF0gZXRjLgorICAgICAgICAgICAg
ICAgIHJldHVybiBtX2lubGluZUl0ZW1zW2luZGV4XS5pc1RleHQoKSAmJiAhZG93bmNhc3Q8SW5s
aW5lVGV4dEl0ZW0+KG1faW5saW5lSXRlbXNbaW5kZXhdKS5pc1doaXRlc3BhY2UoKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworICAgIGxp
bmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5zZXRIYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5p
dHkoaW5saW5lQ29udGVudEVuZHNJblNvZnRXcmFwT3Bwb3J0dW5pdHkoKSk7Cit9CisKK3NpemVf
dCBMaW5lQnVpbGRlcjo6bmV4dFdyYXBPcHBvcnR1bml0eShzaXplX3Qgc3RhcnRJbmRleCwgY29u
c3QgTGluZUJ1aWxkZXI6OklubGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFuZ2UpIGNvbnN0Cit7Cisg
ICAgLy8gMS4gRmluZCB0aGUgc3RhcnQgY2FuZGlkYXRlIGJ5IHNraXBwaW5nIGxlYWRpbmcgbm9u
LWNvbnRlbnQgaXRlbXMgZS5nICI8c3Bhbj48c3Bhbj5zdGFydCIuIE9wcG9ydHVuaXR5IGlzIGFm
dGVyICI8c3Bhbj48c3Bhbj4iLgorICAgIC8vIDIuIEZpbmQgdGhlIGVuZCBjYW5kaWRhdGUgYnkg
c2tpcHBpbmcgbm9uLWNvbnRlbnQgaXRlbXMgaW5iZXR3ZWVuIGUuZy4gIjxzcGFuPjxzcGFuPnN0
YXJ0PC9zcGFuPmVuZCIuIE9wcG9ydHVuaXR5IGlzIGFmdGVyICI8L3NwYW4+Ii4KKyAgICAvLyAz
LiBDaGVjayBpZiB0aGVyZSdzIGEgc29mdCB3cmFwIG9wcG9ydHVuaXR5IGJldHdlZW4gdGhlIDIg
Y2FuZGlkYXRlIGlubGluZSBpdGVtcyBhbmQgcmVwZWF0LgorICAgIC8vIDQuIEFueSBmb3JjZSBs
aW5lIGJyZWFrL2V4cGxpY2l0IHdyYXAgY29udGVudCBpbmJldHdlZW4gaXMgY29uc2lkZXJlZCBh
cyB3cmFwIG9wcG9ydHVuaXR5LgorCisgICAgLy8gW2V4LV1baW5saW5lIGJveCBzdGFydF1baW5s
aW5lIGJveCBlbmRdW2Zsb2F0XVthbXBsZV0gKGV4LTxzcGFuPjwvc3Bhbj48ZGl2IHN0eWxlPSJm
bG9hdDpsZWZ0Ij48L2Rpdj5hbXBsZSkuIFdyYXAgaW5kZXggaXMgYXQgW2V4LV0uCisgICAgLy8g
W2V4XVtpbmxpbmUgYm94IHN0YXJ0XVthbXAtXVtpbmxpbmUgYm94IHN0YXJ0XVtsZV0gKGV4PHNw
YW4+YW1wLTxzcGFuPmFtcGxlKS4gV3JhcCBpbmRleCBpcyBhdCBbYW1wLV0uCisgICAgLy8gW2V4
LV1baW5saW5lIGJveCBzdGFydF1bbGluZSBicmVha11bYW1wbGVdIChleC08c3Bhbj48YnI+YW1w
bGUpLiBXcmFwIGluZGV4IGlzIGFmdGVyIFticl0uCisgICAgYXV0byBwcmV2aW91c0lubGluZUl0
ZW1JbmRleCA9IE9wdGlvbmFsPHNpemVfdD4geyB9OworICAgIGZvciAoYXV0byBpbmRleCA9IHN0
YXJ0SW5kZXg7IGluZGV4IDwgbGF5b3V0UmFuZ2UuZW5kOyArK2luZGV4KSB7CisgICAgICAgIGF1
dG8mIGlubGluZUl0ZW0gPSBtX2lubGluZUl0ZW1zW2luZGV4XTsKKyAgICAgICAgaWYgKGlubGlu
ZUl0ZW0uaXNMaW5lQnJlYWsoKSB8fCBpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHko
KSkgeworICAgICAgICAgICAgLy8gV2UgYWx3YXlzIHN0b3AgYXQgZXhwbGljaXQgd3JhcHBpbmcg
b3Bwb3J0dW5pdGllcyBlLmcuIDxicj4uIEhvd2V2ZXIgdGhlIHdyYXAgcG9zaXRpb24gbWF5IGJl
IGF0IGxhdGVyIHBvc2l0aW9uLgorICAgICAgICAgICAgLy8gZS5nLiA8c3Bhbj48c3Bhbj48YnI+
PC9zcGFuPjwvc3Bhbj4gPC0gd3JhcCBwb3NpdGlvbiBpcyBhZnRlciB0aGUgc2Vjb25kIDwvc3Bh
bj4KKyAgICAgICAgICAgIC8vIGJ1dCBpbiBjYXNlIG9mIDxzcGFuPjxicj48c3Bhbj48L3NwYW4+
PC9zcGFuPiA8LSB3cmFwIHBvc2l0aW9uIGlzIHJpZ2h0IGFmdGVyIDxicj4uCisgICAgICAgICAg
ICBmb3IgKCsraW5kZXg7IGluZGV4IDwgbGF5b3V0UmFuZ2UuZW5kICYmIG1faW5saW5lSXRlbXNb
aW5kZXhdLmlzSW5saW5lQm94RW5kKCk7ICsraW5kZXgpIHsgfQorICAgICAgICAgICAgcmV0dXJu
IGluZGV4OworICAgICAgICB9CisgICAgICAgIGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3Rh
cnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpIHsKKyAgICAgICAgICAgIC8vIE5l
ZWQgdG8gc2VlIHdoYXQgY29tZXMgbmV4dCB0byBkZWNpZGUuCisgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlQoaW5saW5lSXRlbS5pc1RleHQoKSB8fCBpbmxp
bmVJdGVtLmlzQm94KCkgfHwgaW5saW5lSXRlbS5pc0Zsb2F0KCkpOworICAgICAgICBpZiAoIXBy
ZXZpb3VzSW5saW5lSXRlbUluZGV4KSB7CisgICAgICAgICAgICBwcmV2aW91c0lubGluZUl0ZW1J
bmRleCA9IGluZGV4OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAg
Ly8gQXQgdGhpcyBwb2ludCBwcmV2aW91cyBhbmQgY3VycmVudCBpdGVtcyBhcmUgbm90IG5lY2Vz
c2FyaWx5IGFkamFjZW50IGl0ZW1zIGUuZyAicHJldmlvdXM8c3Bhbj5jdXJyZW50PC9zcGFuPiIK
KyAgICAgICAgYXV0byYgcHJldmlvdXNJdGVtID0gbV9pbmxpbmVJdGVtc1sqcHJldmlvdXNJbmxp
bmVJdGVtSW5kZXhdOworICAgICAgICBhdXRvJiBjdXJyZW50SXRlbSA9IG1faW5saW5lSXRlbXNb
aW5kZXhdOworICAgICAgICBpZiAoaXNBdFNvZnRXcmFwT3Bwb3J0dW5pdHkobV9pbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dCwgcHJldmlvdXNJdGVtLCBjdXJyZW50SXRlbSkpIHsKKyAgICAgICAgICAg
IGlmICgqcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggKyAxID09IGluZGV4ICYmICghcHJldmlvdXNJ
dGVtLmlzVGV4dCgpIHx8ICFjdXJyZW50SXRlbS5pc1RleHQoKSkpIHsKKyAgICAgICAgICAgICAg
ICAvLyBXZSBvbmx5IGtub3cgdGhlIGV4YWN0IHNvZnQgd3JhcCBvcHBvcnR1bml0eSBpbmRleCB3
aGVuIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBpdGVtcyBhcmUgbmV4dCB0byBlYWNoIG90aGVy
LgorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIC8vIFRoZXJlJ3MgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgYmV0d2VlbiAncHJldmlvdXNJ
bmxpbmVJdGVtSW5kZXgnIGFuZCAnaW5kZXgnLgorICAgICAgICAgICAgLy8gTm93IGZvcndhcmQt
ZmluZCBmcm9tIHRoZSBzdGFydCBwb3NpdGlvbiB0byBzZWUgd2hlcmUgd2UgY2FuIGFjdHVhbGx5
IHdyYXAuCisgICAgICAgICAgICAvLyBbZXgtXVthbXBsZV0gdnMuIFtleC1dW2lubGluZSBib3gg
c3RhcnRdW2lubGluZSBib3ggZW5kXVthbXBsZV0KKyAgICAgICAgICAgIC8vIHdoZXJlIFtleC1d
IGlzIHN0YXJ0Q29udGVudCBhbmQgW2FtcGxlXSBpcyB0aGUgbmV4dENvbnRlbnQuCisgICAgICAg
ICAgICBmb3IgKGF1dG8gY2FuZGlkYXRlSW5kZXggPSAqcHJldmlvdXNJbmxpbmVJdGVtSW5kZXgg
KyAxOyBjYW5kaWRhdGVJbmRleCA8IGluZGV4OyArK2NhbmRpZGF0ZUluZGV4KSB7CisgICAgICAg
ICAgICAgICAgaWYgKG1faW5saW5lSXRlbXNbY2FuZGlkYXRlSW5kZXhdLmlzSW5saW5lQm94U3Rh
cnQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgY29udGVudCBhbmQgW2lubGlu
ZSBib3ggc3RhcnRdIGFuZCBbaW5saW5lIGJveCBlbmRdIGZvcm0gdW5icmVha2FibGUgY29udGVu
dC4KKyAgICAgICAgICAgICAgICAgICAgLy8gZXgtPHNwYW4+PC9zcGFuPmFtcGxlICA6IHdyYXAg
b3Bwb3J0dW5pdHkgaXMgYWZ0ZXIgImV4LSIuCisgICAgICAgICAgICAgICAgICAgIC8vIGV4LTwv
c3Bhbj48L3NwYW4+YW1wbGUgOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC08L3NwYW4+
PC9zcGFuPiIuCisgICAgICAgICAgICAgICAgICAgIC8vIGV4LTwvc3Bhbj48c3Bhbj5hbXBsZTwv
c3Bhbj4gOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC08L3NwYW4+Ii4KKyAgICAgICAg
ICAgICAgICAgICAgLy8gZXgtPHNwYW4+PHNwYW4+YW1wbGU8L3NwYW4+PC9zcGFuPiA6IHdyYXAg
b3Bwb3J0dW5pdHkgaXMgYWZ0ZXIgImV4LSIuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBj
YW5kaWRhdGVJbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgcHJldmlvdXNJbmxpbmVJdGVt
SW5kZXggPSBpbmRleDsKKyAgICB9CisgICAgcmV0dXJuIGxheW91dFJhbmdlLmVuZDsKK30KKwor
dm9pZCBMaW5lQnVpbGRlcjo6aGFuZGxlRmxvYXRDb250ZW50KGNvbnN0IElubGluZUl0ZW0mIGZs
b2F0SXRlbSkKK3sKKyAgICBhdXRvJiBmbG9hdEJveCA9IGZsb2F0SXRlbS5sYXlvdXRCb3goKTsK
KyAgICBtX2Zsb2F0cy5hcHBlbmQoJmZsb2F0Qm94KTsKKworICAgIGF1dG8qIGZsb2F0aW5nU3Rh
dGUgPSB0aGlzLT5mbG9hdGluZ1N0YXRlKCk7CisgICAgaWYgKCFmbG9hdGluZ1N0YXRlKQorICAg
ICAgICByZXR1cm47CisKKyAgICBBU1NFUlQoZm9ybWF0dGluZ1N0YXRlKCkpOworICAgIGF1dG8m
IGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCktPmJveEdlb21ldHJ5KGZsb2F0Qm94KTsK
KyAgICAvLyBTZXQgc3RhdGljIHBvc2l0aW9uIGZpcnN0LgorICAgIGJveEdlb21ldHJ5LnNldExv
Z2ljYWxUb3BMZWZ0KExheW91dFBvaW50IHsgbV9saW5lTG9naWNhbFJlY3QudG9wTGVmdCgpIH0p
OworICAgIC8vIEZsb2F0IGl0LgorICAgIEFTU0VSVChtX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWlu
dHMpOworICAgIGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250ZXh0IHsgZm9ybWF0
dGluZ0NvbnRleHQoKSwgKmZsb2F0aW5nU3RhdGUgfTsKKyAgICBhdXRvIGZsb2F0aW5nUG9zaXRp
b24gPSBmbG9hdGluZ0NvbnRleHQucG9zaXRpb25Gb3JGbG9hdChmbG9hdEJveCwgKm1fcm9vdEhv
cml6b250YWxDb25zdHJhaW50cyk7CisgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQo
ZmxvYXRpbmdQb3NpdGlvbik7CisgICAgZmxvYXRpbmdTdGF0ZS0+YXBwZW5kKGZsb2F0aW5nQ29u
dGV4dC50b0Zsb2F0SXRlbShmbG9hdEJveCkpOworICAgIC8vIENoZWNrIGlmIHRoaXMgZmxvYXQg
c2hyaW5rcyB0aGUgbGluZSAodGhleSBkb24ndCBnZXQgcG9zaXRpb25lZCBoaWdoZXIgdGhhbiB0
aGUgbGluZSkuCisgICAgaWYgKGZsb2F0aW5nUG9zaXRpb24ueSgpID4gbV9saW5lTG9naWNhbFJl
Y3QuYm90dG9tKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY29udGVudElzQ29uc3RyYWlu
ZWRCeUZsb2F0ID0gdHJ1ZTsKKyAgICBhdXRvIGZsb2F0Qm94V2lkdGggPSBpbmxpbmVJdGVtV2lk
dGgoZmxvYXRJdGVtLCB7IH0pOworICAgIGlmIChmbG9hdEJveC5pc0xlZnRGbG9hdGluZ1Bvc2l0
aW9uZWQoKSkKKyAgICAgICAgbV9saW5lTG9naWNhbFJlY3Quc2V0TGVmdChtX2xpbmVMb2dpY2Fs
UmVjdC5sZWZ0KCkgKyBmbG9hdEJveFdpZHRoKTsgICAgCisgICAgbV9saW5lTG9naWNhbFJlY3Qu
ZXhwYW5kSG9yaXpvbnRhbGx5KC1mbG9hdEJveFdpZHRoKTsKK30KKworTGluZUJ1aWxkZXI6OlJl
c3VsdCBMaW5lQnVpbGRlcjo6aGFuZGxlSW5saW5lQ29udGVudChJbmxpbmVDb250ZW50QnJlYWtl
ciYgaW5saW5lQ29udGVudEJyZWFrZXIsIGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFu
Z2UsIGNvbnN0IExpbmVDYW5kaWRhdGUmIGxpbmVDYW5kaWRhdGUpCit7CisgICAgYXV0byYgaW5s
aW5lQ29udGVudCA9IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudDsKKyAgICBpZiAoaW5saW5l
Q29udGVudC5jb250aW51b3VzQ29udGVudCgpLnJ1bnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAg
QVNTRVJUKGlubGluZUNvbnRlbnQudHJhaWxpbmdMaW5lQnJlYWsoKSB8fCBpbmxpbmVDb250ZW50
LnRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7CisgICAgICAgIHJldHVybiB7IGlubGlu
ZUNvbnRlbnQudHJhaWxpbmdMaW5lQnJlYWsoKSA/IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0Vu
ZE9mTGluZTo6WWVzIDogSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9Owor
ICAgIH0KKyAgICBhdXRvIHNob3VsZERpc2FibGVIeXBoZW5hdGlvbiA9IFsmXSB7CisgICAgICAg
IGF1dG8mIHN0eWxlID0gcm9vdCgpLnN0eWxlKCk7CisgICAgICAgIHVuc2lnbmVkIGxpbWl0TGlu
ZXMgPSBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMoKSA9PSBSZW5kZXJTdHlsZTo6aW5pdGlh
bEh5cGhlbmF0aW9uTGltaXRMaW5lcygpID8gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46
Om1heCgpIDogc3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCk7CisgICAgICAgIHJldHVybiBt
X3N1Y2Nlc3NpdmVIeXBoZW5hdGVkTGluZUNvdW50ID49IGxpbWl0TGluZXM7CisgICAgfTsKKyAg
ICBpZiAoc2hvdWxkRGlzYWJsZUh5cGhlbmF0aW9uKCkpCisgICAgICAgIGlubGluZUNvbnRlbnRC
cmVha2VyLnNldEh5cGhlbmF0aW9uRGlzYWJsZWQoKTsKKworICAgIGF1dG8mIGNvbnRpbnVvdXNJ
bmxpbmVDb250ZW50ID0gbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmNvbnRpbnVvdXNDb250
ZW50KCk7CisgICAgYXV0byBsaW5lTG9naWNhbFJlY3RGb3JDYW5kaWRhdGVDb250ZW50ID0gWyZd
IHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBjb250ZW50IHdvdWxkIHN0cmV0
Y2ggdGhlIGxpbmUgYW5kIHdoZXRoZXIgYWRkaXRpb25hbCBmbG9hdHMgYXJlIGdldHRpbmcgaW4g
dGhlIHdheS4KKyAgICAgICAgaWYgKCFmbG9hdGluZ1N0YXRlKCkgfHwgIWlubGluZUNvbnRlbnQu
aGFzSW5saW5lTGV2ZWxCb3goKSkKKyAgICAgICAgICAgIHJldHVybiBtX2xpbmVMb2dpY2FsUmVj
dDsKKyAgICAgICAgYXV0byBtYXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQgPSBtX2xpbmVMb2dpY2Fs
UmVjdC5oZWlnaHQoKTsKKyAgICAgICAgZm9yIChhdXRvJiBydW4gOiBjb250aW51b3VzSW5saW5l
Q29udGVudC5ydW5zKCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3Ig
aW5saW5lIGJveGVzIHRvby4KKyAgICAgICAgICAgIGlmICghcnVuLmlubGluZUl0ZW0uaXNCb3go
KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG1heGltdW1MaW5lTG9n
aWNhbEhlaWdodCA9IHN0ZDo6bWF4KG1heGltdW1MaW5lTG9naWNhbEhlaWdodCwgSW5saW5lTGF5
b3V0VW5pdCB7IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gocnVuLmlubGluZUl0
ZW0ubGF5b3V0Qm94KCkpLm1hcmdpbkJveEhlaWdodCgpIH0pOworICAgICAgICB9CisgICAgICAg
IGlmIChtYXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQgPT0gbV9saW5lTG9naWNhbFJlY3QuaGVpZ2h0
KCkpCisgICAgICAgICAgICByZXR1cm4gbV9saW5lTG9naWNhbFJlY3Q7CisgICAgICAgIGF1dG8g
YWRqdXN0ZWRMaW5lTG9naWNhbFJlY3QgPSBJbmxpbmVSZWN0IHsgbV9saW5lTG9naWNhbFJlY3Qu
dG9wKCksIG1fbGluZUxvZ2ljYWxSZWN0LmxlZnQoKSwgbV9saW5lTG9naWNhbFJlY3Qud2lkdGgo
KSwgbWF4aW11bUxpbmVMb2dpY2FsSGVpZ2h0IH07CisgICAgICAgIGlmIChhdXRvIGhvcml6b250
YWxDb25zdHJhaW50cyA9IGZsb2F0Q29uc3RyYWludHMoYWRqdXN0ZWRMaW5lTG9naWNhbFJlY3Qp
KSB7CisgICAgICAgICAgICBhZGp1c3RlZExpbmVMb2dpY2FsUmVjdC5zZXRMZWZ0KGhvcml6b250
YWxDb25zdHJhaW50cy0+bG9naWNhbExlZnQpOworICAgICAgICAgICAgYWRqdXN0ZWRMaW5lTG9n
aWNhbFJlY3Quc2V0V2lkdGgoaG9yaXpvbnRhbENvbnN0cmFpbnRzLT5sb2dpY2FsV2lkdGgpOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGp1c3RlZExpbmVMb2dpY2FsUmVjdDsKKyAgICB9
KCk7CisgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IFsmXSB7CisgICAgICAgIGF1dG8gYXZhaWxh
YmxlV2lkdGhGb3JDb250ZW50ID0gbGluZUxvZ2ljYWxSZWN0Rm9yQ2FuZGlkYXRlQ29udGVudC53
aWR0aCgpIC0gbV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKTsKKyAgICAgICAgcmV0dXJuIHN0
ZDo6aXNuYW4oYXZhaWxhYmxlV2lkdGhGb3JDb250ZW50KSA/IG1heElubGluZUxheW91dFVuaXQo
KSA6IGF2YWlsYWJsZVdpZHRoRm9yQ29udGVudDsKKyAgICB9KCk7CisgICAgLy8gV2hpbGUgdGhl
IGZsb2F0cyBhcmUgbm90IGNvbnNpZGVyZWQgdG8gYmUgb24gdGhlIGxpbmUsIHRoZXkgbWFrZSB0
aGUgbGluZSBjb250ZW50ZnVsIGZvciBsaW5lIGJyZWFraW5nLgorICAgIGF1dG8gbGluZUhhc0Nv
bnRlbnQgPSAhbV9saW5lLnJ1bnMoKS5pc0VtcHR5KCkgfHwgbV9jb250ZW50SXNDb25zdHJhaW5l
ZEJ5RmxvYXQ7CisgICAgYXV0byBsaW5lU3RhdHVzID0gSW5saW5lQ29udGVudEJyZWFrZXI6Okxp
bmVTdGF0dXMgeyBtX2xpbmUuY29udGVudExvZ2ljYWxSaWdodCgpLCBhdmFpbGFibGVXaWR0aCwg
bV9saW5lLnRyaW1tYWJsZVRyYWlsaW5nV2lkdGgoKSwgbV9saW5lLnRyYWlsaW5nU29mdEh5cGhl
bldpZHRoKCksIG1fbGluZS5pc1RyYWlsaW5nUnVuRnVsbHlUcmltbWFibGUoKSwgbGluZUhhc0Nv
bnRlbnQsICFtX3dyYXBPcHBvcnR1bml0eUxpc3QuaXNFbXB0eSgpIH07CisgICAgYXV0byByZXN1
bHQgPSBpbmxpbmVDb250ZW50QnJlYWtlci5wcm9jZXNzSW5saW5lQ29udGVudChjb250aW51b3Vz
SW5saW5lQ29udGVudCwgbGluZVN0YXR1cyk7CisgICAgYXV0byYgY2FuZGlkYXRlUnVucyA9IGNv
bnRpbnVvdXNJbmxpbmVDb250ZW50LnJ1bnMoKTsKKyAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJ
bmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rpb246OktlZXApIHsKKyAgICAgICAgLy8g
VGhpcyBjb250aW51b3VzIGNvbnRlbnQgY2FuIGJlIGZ1bGx5IHBsYWNlZCBvbiB0aGUgY3VycmVu
dCBsaW5lLgorICAgICAgICBtX2xpbmVMb2dpY2FsUmVjdCA9IGxpbmVMb2dpY2FsUmVjdEZvckNh
bmRpZGF0ZUNvbnRlbnQ7CisgICAgICAgIGZvciAoYXV0byYgcnVuIDogY2FuZGlkYXRlUnVucykK
KyAgICAgICAgICAgIG1fbGluZS5hcHBlbmQocnVuLmlubGluZUl0ZW0sIHJ1bi5sb2dpY2FsV2lk
dGgpOworICAgICAgICBpZiAobGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50Lmhhc1RyYWlsaW5n
U29mdFdyYXBPcHBvcnR1bml0eSgpKSB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUg
YWxsb3dlZCB0byB3cmFwIGF0IHRoaXMgcG9zaXRpb24uCisgICAgICAgICAgICBhdXRvJiB0cmFp
bGluZ0l0ZW0gPSBjYW5kaWRhdGVSdW5zLmxhc3QoKS5pbmxpbmVJdGVtOworICAgICAgICAgICAg
Ly8gRklYTUU6IFRoZXJlIG11c3QgYmUgYSB3YXkgdG8gZGVjaWRlIGlmIHRoZSB0cmFpbGluZyBy
dW4gYWN0dWFsbHkgZW5kZWQgdXAgb24gdGhlIGxpbmUuCisgICAgICAgICAgICAvLyBMZXQncyBq
dXN0IGRlYWwgd2l0aCBjb2xsYXBzZWQgbGVhZGluZyB3aGl0ZXNwYWNlIGZvciBub3cuCisgICAg
ICAgICAgICBpZiAoIW1fbGluZS5ydW5zKCkuaXNFbXB0eSgpICYmIElubGluZUNvbnRlbnRCcmVh
a2VyOjppc1dyYXBwaW5nQWxsb3dlZCh0cmFpbGluZ0l0ZW0pKQorICAgICAgICAgICAgICAgIG1f
d3JhcE9wcG9ydHVuaXR5TGlzdC5hcHBlbmQoJnRyYWlsaW5nSXRlbSk7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIHsgcmVzdWx0LmlzRW5kT2ZMaW5lLCB7IGNhbmRpZGF0ZVJ1bnMuc2l6ZSgp
LCBmYWxzZSB9IH07CisgICAgfQorCisgICAgYXV0byBlbGlnaWJsZU92ZXJmbG93V2lkdGhBc0xl
YWRpbmcgPSBbJl0gKCkgLT4gT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geworICAgICAgICAv
LyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIG90aGVyIHR5cGVzIG9mIGNvbnRpbnVvdXMgY29udGVu
dC4KKyAgICAgICAgQVNTRVJUKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6
OlJlc3VsdDo6QWN0aW9uOjpXcmFwIHx8IHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJy
ZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpCcmVhayk7CisgICAgICAgIGlmIChjYW5kaWRhdGVSdW5z
LnNpemUoKSAhPSAxIHx8ICFjYW5kaWRhdGVSdW5zLmZpcnN0KCkuaW5saW5lSXRlbS5pc1RleHQo
KSkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgIGF1dG8mIGlubGluZVRleHRJdGVt
ID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGNhbmRpZGF0ZVJ1bnMuZmlyc3QoKS5pbmxpbmVJ
dGVtKTsKKyAgICAgICAgaWYgKGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpKQorICAgICAg
ICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29u
dGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpXcmFwKQorICAgICAgICAgICAgcmV0dXJuIGNh
bmRpZGF0ZVJ1bnMuZmlyc3QoKS5sb2dpY2FsV2lkdGg7CisgICAgICAgIGlmIChyZXN1bHQuYWN0
aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6QnJlYWsgJiYgcmVz
dWx0LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnQtPnBhcnRpYWxSdW4pCisgICAgICAgICAgICByZXR1
cm4gY2FuZGlkYXRlUnVucy5maXJzdCgpLmxvZ2ljYWxXaWR0aCAtIHJlc3VsdC5wYXJ0aWFsVHJh
aWxpbmdDb250ZW50LT5wYXJ0aWFsUnVuLT5sb2dpY2FsV2lkdGg7CisgICAgICAgIHJldHVybiB7
IH07CisgICAgfTsKKworICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVh
a2VyOjpSZXN1bHQ6OkFjdGlvbjo6V3JhcCkgeworICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5k
T2ZMaW5lID09IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKKyAgICAg
ICAgLy8gVGhpcyBjb250aW51b3VzIGNvbnRlbnQgY2FuJ3QgYmUgcGxhY2VkIG9uIHRoZSBjdXJy
ZW50IGxpbmUuIE5vdGhpbmcgdG8gY29tbWl0IGF0IHRoaXMgdGltZS4KKyAgICAgICAgcmV0dXJu
IHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgfSwgeyB9LCBlbGln
aWJsZU92ZXJmbG93V2lkdGhBc0xlYWRpbmcoKSB9OworICAgIH0KKyAgICBpZiAocmVzdWx0LmFj
dGlvbiA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rpb246OldyYXBXaXRoSHlw
aGVuKSB7CisgICAgICAgIEFTU0VSVChyZXN1bHQuaXNFbmRPZkxpbmUgPT0gSW5saW5lQ29udGVu
dEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMpOworICAgICAgICAvLyBUaGlzIGNvbnRpbnVvdXMg
Y29udGVudCBjYW4ndCBiZSBwbGFjZWQgb24gdGhlIGN1cnJlbnQgbGluZSwgbm90aGluZyB0byBj
b21taXQuCisgICAgICAgIC8vIEhvd2V2ZXIgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUg
Y3VycmVudCBsaW5lIGdhaW5zIGEgdHJhaWxpbmcgaHlwaGVuLgorICAgICAgICBBU1NFUlQobV9s
aW5lLnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCkpOworICAgICAgICBtX2xpbmUuYWRkVHJhaWxp
bmdIeXBoZW4oKm1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpKTsKKyAgICAgICAgcmV0
dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMgfTsKKyAgICB9Cisg
ICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0
aW9uOjpSZXZlcnRUb0xhc3RXcmFwT3Bwb3J0dW5pdHkpIHsKKyAgICAgICAgQVNTRVJUKHJlc3Vs
dC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olllcyk7
CisgICAgICAgIC8vIE5vdCBvbmx5IHRoaXMgY29udGVudCBjYW4ndCBiZSBwbGFjZWQgb24gdGhl
IGN1cnJlbnQgbGluZSwgYnV0IHdlIGV2ZW4gbmVlZCB0byByZXZlcnQgdGhlIGxpbmUgYmFjayB0
byBhbiBlYXJsaWVyIHBvc2l0aW9uLgorICAgICAgICBBU1NFUlQoIW1fd3JhcE9wcG9ydHVuaXR5
TGlzdC5pc0VtcHR5KCkpOworICAgICAgICByZXR1cm4geyBJbmxpbmVDb250ZW50QnJlYWtlcjo6
SXNFbmRPZkxpbmU6OlllcywgeyByZWJ1aWxkTGluZShsYXlvdXRSYW5nZSwgKm1fd3JhcE9wcG9y
dHVuaXR5TGlzdC5sYXN0KCkpLCB0cnVlIH0gfTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5hY3Rp
b24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xhc3RO
b25PdmVyZmxvd2luZ1dyYXBPcHBvcnR1bml0eSkgeworICAgICAgICBBU1NFUlQocmVzdWx0Lmlz
RW5kT2ZMaW5lID09IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKKyAg
ICAgICAgQVNTRVJUKCFtX3dyYXBPcHBvcnR1bml0eUxpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAg
cmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgcmVidWls
ZExpbmVGb3JUcmFpbGluZ1NvZnRIeXBoZW4obGF5b3V0UmFuZ2UpLCB0cnVlIH0gfTsKKyAgICB9
CisgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6
QWN0aW9uOjpCcmVhaykgeworICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09IElu
bGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKKyAgICAgICAgLy8gQ29tbWl0
IHRoZSBjb21iaW5hdGlvbiBvZiBmdWxsIGFuZCBwYXJ0aWFsIGNvbnRlbnQgb24gdGhlIGN1cnJl
bnQgbGluZS4KKyAgICAgICAgQVNTRVJUKHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50KTsK
KyAgICAgICAgY29tbWl0UGFydGlhbENvbnRlbnQoY2FuZGlkYXRlUnVucywgKnJlc3VsdC5wYXJ0
aWFsVHJhaWxpbmdDb250ZW50KTsKKyAgICAgICAgLy8gV2hlbiBicmVha2luZyBtdWx0aXBsZSBy
dW5zIDxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay1hbGwiPnRleHQ8L3NwYW4+PHNwYW4+
Y29udGVudDwvc3Bhbj4sIHdlIG1pZ2h0IGVuZCB1cCBicmVha2luZyB0aGVtIGF0IHJ1biBib3Vu
ZGFyeS4KKyAgICAgICAgLy8gSXQgc2ltcGx5IG1lYW5zIHdlIGRvbid0IHJlYWxseSBoYXZlIGEg
cGFydGlhbCBydW4uIFBhcnRpYWwgY29udGVudCB5ZXMsIGJ1dCBub3QgcGFydGlhbCBydW4uCisg
ICAgICAgIGF1dG8gdHJhaWxpbmdSdW5JbmRleCA9IHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250
ZW50LT50cmFpbGluZ1J1bkluZGV4OworICAgICAgICBhdXRvIGNvbW1pdHRlZElubGluZUl0ZW1D
b3VudCA9IHRyYWlsaW5nUnVuSW5kZXggKyAxOworICAgICAgICBpZiAoIXJlc3VsdC5wYXJ0aWFs
VHJhaWxpbmdDb250ZW50LT5wYXJ0aWFsUnVuKQorICAgICAgICAgICAgcmV0dXJuIHsgSW5saW5l
Q29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgY29tbWl0dGVkSW5saW5lSXRlbUNv
dW50LCBmYWxzZSB9IH07CisKKyAgICAgICAgYXV0byBwYXJ0aWFsUnVuID0gKnJlc3VsdC5wYXJ0
aWFsVHJhaWxpbmdDb250ZW50LT5wYXJ0aWFsUnVuOworICAgICAgICBhdXRvJiB0cmFpbGluZ0lu
bGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGNhbmRpZGF0ZVJ1bnNbdHJh
aWxpbmdSdW5JbmRleF0uaW5saW5lSXRlbSk7CisgICAgICAgIEFTU0VSVChwYXJ0aWFsUnVuLmxl
bmd0aCA8IHRyYWlsaW5nSW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpOworICAgICAgICBhdXRvIG92
ZXJmbG93TGVuZ3RoID0gdHJhaWxpbmdJbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSAtIHBhcnRpYWxS
dW4ubGVuZ3RoOworICAgICAgICByZXR1cm4geyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRP
ZkxpbmU6OlllcywgeyBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQsIGZhbHNlIH0sIG92ZXJmbG93
TGVuZ3RoLCBlbGlnaWJsZU92ZXJmbG93V2lkdGhBc0xlYWRpbmcoKSB9OworICAgIH0KKyAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4geyBJbmxpbmVDb250ZW50QnJlYWtlcjo6
SXNFbmRPZkxpbmU6Ok5vIH07Cit9CisKK3ZvaWQgTGluZUJ1aWxkZXI6OmNvbW1pdFBhcnRpYWxD
b250ZW50KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudDo6UnVu
TGlzdCYgcnVucywgY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6UGFydGlhbFRy
YWlsaW5nQ29udGVudCYgcGFydGlhbFRyYWlsaW5nQ29udGVudCkKK3sKKyAgICBmb3IgKHNpemVf
dCBpbmRleCA9IDA7IGluZGV4IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgYXV0
byYgcnVuID0gcnVuc1tpbmRleF07CisgICAgICAgIGlmIChwYXJ0aWFsVHJhaWxpbmdDb250ZW50
LnRyYWlsaW5nUnVuSW5kZXggPT0gaW5kZXgpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQg
Y29tbWl0IHBhcnRpYWwgdHJhaWxpbmcgaXRlbS4KKyAgICAgICAgICAgIGlmIChhdXRvIHBhcnRp
YWxSdW4gPSBwYXJ0aWFsVHJhaWxpbmdDb250ZW50LnBhcnRpYWxSdW4pIHsKKyAgICAgICAgICAg
ICAgICBBU1NFUlQocnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpOworICAgICAgICAgICAgICAgIGF1
dG8mIHRyYWlsaW5nSW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4ocnVu
c1twYXJ0aWFsVHJhaWxpbmdDb250ZW50LnRyYWlsaW5nUnVuSW5kZXhdLmlubGluZUl0ZW0pOwor
ICAgICAgICAgICAgICAgIGF1dG8gcGFydGlhbFRyYWlsaW5nVGV4dEl0ZW0gPSB0cmFpbGluZ0lu
bGluZVRleHRJdGVtLmxlZnQocGFydGlhbFJ1bi0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBt
X2xpbmUuYXBwZW5kKHBhcnRpYWxUcmFpbGluZ1RleHRJdGVtLCBwYXJ0aWFsUnVuLT5sb2dpY2Fs
V2lkdGgpOworICAgICAgICAgICAgICAgIGlmIChhdXRvIGh5cGhlbldpZHRoID0gcGFydGlhbFJ1
bi0+aHlwaGVuV2lkdGgpCisgICAgICAgICAgICAgICAgICAgIG1fbGluZS5hZGRUcmFpbGluZ0h5
cGhlbigqaHlwaGVuV2lkdGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIC8vIFRoZSBwYXJ0aWFsIHJ1biBpcyB0aGUgbGFzdCBjb250ZW50IHRv
IGNvbW1pdC4KKyAgICAgICAgICAgIG1fbGluZS5hcHBlbmQocnVuLmlubGluZUl0ZW0sIHJ1bi5s
b2dpY2FsV2lkdGgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1f
bGluZS5hcHBlbmQocnVuLmlubGluZUl0ZW0sIHJ1bi5sb2dpY2FsV2lkdGgpOworICAgIH0KK30K
Kworc2l6ZV90IExpbmVCdWlsZGVyOjpyZWJ1aWxkTGluZShjb25zdCBJbmxpbmVJdGVtUmFuZ2Um
IGxheW91dFJhbmdlLCBjb25zdCBJbmxpbmVJdGVtJiBsYXN0SW5saW5lSXRlbVRvQWRkKQorewor
ICAgIEFTU0VSVCghbV93cmFwT3Bwb3J0dW5pdHlMaXN0LmlzRW1wdHkoKSk7CisgICAgLy8gV2Ug
bWlnaHQgYWxyZWFkeSBoYXZlIGFkZGVkIGZsb2F0cy4gVGhleSBzaHJpbmsgdGhlIGF2YWlsYWJs
ZSBob3Jpem9udGFsIHNwYWNlIGZvciB0aGUgbGluZS4KKyAgICAvLyBMZXQncyBqdXN0IHJldXNl
IHdoYXQgdGhlIGxpbmUgaGFzIGF0IHRoaXMgcG9pbnQuCisgICAgbV9saW5lLmluaXRpYWxpemUo
KTsKKyAgICBhdXRvIGN1cnJlbnRJdGVtSW5kZXggPSBsYXlvdXRSYW5nZS5zdGFydDsKKyAgICBp
ZiAobV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtKSB7CisgICAgICAgIG1fbGluZS5hcHBlbmQoKm1f
cGFydGlhbExlYWRpbmdUZXh0SXRlbSwgaW5saW5lSXRlbVdpZHRoKCptX3BhcnRpYWxMZWFkaW5n
VGV4dEl0ZW0sIHsgfSkpOworICAgICAgICBpZiAoJm1fcGFydGlhbExlYWRpbmdUZXh0SXRlbS52
YWx1ZSgpID09ICZsYXN0SW5saW5lSXRlbVRvQWRkKQorICAgICAgICAgICAgcmV0dXJuIDE7Cisg
ICAgICAgICsrY3VycmVudEl0ZW1JbmRleDsKKyAgICB9CisgICAgZm9yICg7IGN1cnJlbnRJdGVt
SW5kZXggPCBsYXlvdXRSYW5nZS5lbmQ7ICsrY3VycmVudEl0ZW1JbmRleCkgeworICAgICAgICBh
dXRvJiBpbmxpbmVJdGVtID0gbV9pbmxpbmVJdGVtc1tjdXJyZW50SXRlbUluZGV4XTsKKyAgICAg
ICAgbV9saW5lLmFwcGVuZChpbmxpbmVJdGVtLCBpbmxpbmVJdGVtV2lkdGgoaW5saW5lSXRlbSwg
bV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKSkpOworICAgICAgICBpZiAoJmlubGluZUl0ZW0g
PT0gJmxhc3RJbmxpbmVJdGVtVG9BZGQpCisgICAgICAgICAgICByZXR1cm4gY3VycmVudEl0ZW1J
bmRleCAtIGxheW91dFJhbmdlLnN0YXJ0ICsgMTsKKyAgICB9CisgICAgcmV0dXJuIGxheW91dFJh
bmdlLnNpemUoKTsKK30KKworc2l6ZV90IExpbmVCdWlsZGVyOjpyZWJ1aWxkTGluZUZvclRyYWls
aW5nU29mdEh5cGhlbihjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlKQoreworICAg
IEFTU0VSVCghbV93cmFwT3Bwb3J0dW5pdHlMaXN0LmlzRW1wdHkoKSk7CisgICAgLy8gUmV2ZXJ0
IGFsbCB0aGUgd2F5IGJhY2sgdG8gYSB3cmFwIG9wcG9ydHVuaXR5IHdoZW4gZWl0aGVyIGEgc29m
dCBoeXBoZW4gZml0cyBvciBubyBoeXBoZW4gaXMgcmVxdWlyZWQuCisgICAgZm9yIChhdXRvIGkg
PSBtX3dyYXBPcHBvcnR1bml0eUxpc3Quc2l6ZSgpOyBpLS0gPiAxOykgeworICAgICAgICBhdXRv
JiBzb2Z0V3JhcE9wcG9ydHVuaXR5SXRlbSA9ICptX3dyYXBPcHBvcnR1bml0eUxpc3RbaV07Cisg
ICAgICAgIC8vIEZJWE1FOiBJZiB0aGlzIHR1cm5zIG91dCB0byBiZSBhIHBlcmYgaXNzdWUsIHdl
IGNvdWxkIGFsc28gdHJhdmVyc2UgdGhlIHdyYXAgbGlzdCBhbmQga2VlcCBhZGRpbmcgdGhlIGl0
ZW1zCisgICAgICAgIC8vIHdoaWxlIHdhdGNoaW5nIHRoZSBhdmFpbGFibGUgd2lkdGggdmVyeSBj
bG9zZWx5LgorICAgICAgICBhdXRvIGNvbW1pdHRlZENvdW50ID0gcmVidWlsZExpbmUobGF5b3V0
UmFuZ2UsIHNvZnRXcmFwT3Bwb3J0dW5pdHlJdGVtKTsKKyAgICAgICAgYXV0byBhdmFpbGFibGVX
aWR0aCA9IG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkgLSBtX2xpbmUuY29udGVudExvZ2ljYWxS
aWdodCgpOworICAgICAgICBhdXRvIHRyYWlsaW5nU29mdEh5cGhlbldpZHRoID0gbV9saW5lLnRy
YWlsaW5nU29mdEh5cGhlbldpZHRoKCk7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpbGlu
ZyBoeXBoZW4gbm93IGZpdHMgdGhlIGxpbmUgKG9yIHdlIGRvbid0IG5lZWQgaHloZW4gYW55bW9y
ZSkuCisgICAgICAgIGlmICghdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggfHwgdHJhaWxpbmdTb2Z0
SHlwaGVuV2lkdGggPD0gYXZhaWxhYmxlV2lkdGgpIHsKKyAgICAgICAgICAgIGlmICh0cmFpbGlu
Z1NvZnRIeXBoZW5XaWR0aCkKKyAgICAgICAgICAgICAgICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBo
ZW4oKnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKTsKKyAgICAgICAgICAgIHJldHVybiBjb21taXR0
ZWRDb3VudDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBIYXZlIGF0IGxlYXN0IHNvbWUgY29u
dGVudCBvbiB0aGUgbGluZS4KKyAgICBhdXRvIGNvbW1pdHRlZENvdW50ID0gcmVidWlsZExpbmUo
bGF5b3V0UmFuZ2UsICptX3dyYXBPcHBvcnR1bml0eUxpc3QuZmlyc3QoKSk7CisgICAgaWYgKGF1
dG8gdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPSBtX2xpbmUudHJhaWxpbmdTb2Z0SHlwaGVuV2lk
dGgoKSkKKyAgICAgICAgbV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCp0cmFpbGluZ1NvZnRIeXBo
ZW5XaWR0aCk7CisgICAgcmV0dXJuIGNvbW1pdHRlZENvdW50OworfQorCitib29sIExpbmVCdWls
ZGVyOjppc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBs
aW5lUmFuZ2UsIHNpemVfdCBsYXN0SW5saW5lSXRlbUluZGV4LCBib29sIGhhc1BhcnRpYWxUcmFp
bGluZ0NvbnRlbnQpIGNvbnN0Cit7CisgICAgaWYgKGhhc1BhcnRpYWxUcmFpbGluZ0NvbnRlbnQp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAobGluZVJhbmdlLmVuZCA9PSBsYXN0SW5s
aW5lSXRlbUluZGV4KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBPbWl0IGZsb2F0cyB0
byBzZWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBsaW5lIHdpdGggaW5saW5lIGNvbnRlbnQuCisgICAg
Zm9yIChhdXRvIGkgPSBsYXN0SW5saW5lSXRlbUluZGV4OyBpLS07KSB7CisgICAgICAgIGlmICgh
bV9pbmxpbmVJdGVtc1tpXS5pc0Zsb2F0KCkpCisgICAgICAgICAgICByZXR1cm4gaSA9PSBsaW5l
UmFuZ2UuZW5kIC0gMTsKKyAgICB9CisgICAgLy8gVGhlcmUgaGFzIHRvIGJlIGF0IGxlYXN0IG9u
ZSBub24tZmxvYXQgaXRlbS4KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK2NvbnN0IENvbnRhaW5lckJveCYgTGluZUJ1aWxkZXI6OnJvb3QoKSBjb25z
dAoreworICAgIHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKTsKK30KKworY29uc3Qg
TGF5b3V0U3RhdGUmIExpbmVCdWlsZGVyOjpsYXlvdXRTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkubGF5b3V0U3RhdGUoKTsKK30KKworfQorfQorCisjZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5oIGIvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCdWlsZGVy
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uMGUyMTcxNTA1ZWZmYjQyZmRmMGIzMjE2NDNiMzQzZDhjNTVmY2FlZgot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5oCkBAIC0wLDAgKzEsMTM2IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJ
TkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIklubGluZUNvbnRlbnRCcmVha2VyLmgiCisjaW5jbHVk
ZSAiSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZS5oIgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgRmxvYXRpbmdD
b250ZXh0Oworc3RydWN0IExpbmVDYW5kaWRhdGU7CisKK2NsYXNzIExpbmVCdWlsZGVyIHsKK3B1
YmxpYzoKKyAgICBMaW5lQnVpbGRlcihJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYsIEZsb2F0aW5n
U3RhdGUmLCBIb3Jpem9udGFsQ29uc3RyYWludHMgcm9vdEhvcml6b250YWxDb25zdHJhaW50cywg
Y29uc3QgSW5saW5lSXRlbXMmKTsKKyAgICBMaW5lQnVpbGRlcihjb25zdCBJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCYsIGNvbnN0IElubGluZUl0ZW1zJik7CisKKyAgICBzdHJ1Y3QgSW5saW5lSXRl
bVJhbmdlIHsKKyAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gc3RhcnQgPT0g
ZW5kOyB9CisgICAgICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gZW5kIC0gc3RhcnQ7
IH0KKyAgICAgICAgc2l6ZV90IHN0YXJ0IHsgMCB9OworICAgICAgICBzaXplX3QgZW5kIHsgMCB9
OworICAgIH07CisgICAgdXNpbmcgRmxvYXRMaXN0ID0gVmVjdG9yPGNvbnN0IEJveCo+OworICAg
IHN0cnVjdCBMaW5lQ29udGVudCB7CisgICAgICAgIElubGluZUl0ZW1SYW5nZSBpbmxpbmVJdGVt
UmFuZ2U7CisgICAgICAgIHNpemVfdCBwYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoIHsgMCB9
OworICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxvd0xvZ2ljYWxXaWR0
aDsKKyAgICAgICAgY29uc3QgRmxvYXRMaXN0JiBmbG9hdHM7CisgICAgICAgIGJvb2wgaGFzSW50
cnVzaXZlRmxvYXQgeyBmYWxzZSB9OworICAgICAgICBJbmxpbmVMYXlvdXRQb2ludCBsb2dpY2Fs
VG9wTGVmdDsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsaW5lTG9naWNhbFdpZHRoOworICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGg7CisgICAgICAgIGJvb2wg
aXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50IHsgdHJ1ZSB9OworICAgICAgICBzaXplX3Qgbm9u
U3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50IHsgMCB9OworICAgICAgICBjb25zdCBMaW5lOjpS
dW5MaXN0JiBydW5zOworICAgIH07CisgICAgTGluZUNvbnRlbnQgbGF5b3V0SW5saW5lQ29udGVu
dChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmLCBzaXplX3QgcGFydGlhbExlYWRpbmdDb250ZW50TGVu
Z3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBsZWFkaW5nTG9naWNhbFdpZHRoLCBjb25z
dCBJbmxpbmVSZWN0JiBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LCBib29sIGlzRmlyc3RMaW5lKTsK
KworICAgIHN0cnVjdCBJbnRyaW5zaWNDb250ZW50IHsKKyAgICAgICAgSW5saW5lSXRlbVJhbmdl
IGlubGluZUl0ZW1SYW5nZTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgg
eyAwIH07CisgICAgICAgIGNvbnN0IEZsb2F0TGlzdCYgZmxvYXRzOworICAgIH07CisgICAgSW50
cmluc2ljQ29udGVudCBjb21wdXRlZEludHJpbnNpY1dpZHRoKGNvbnN0IElubGluZUl0ZW1SYW5n
ZSYsIElubGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgpOworCitwcml2YXRlOgorICAgIHZv
aWQgY2FuZGlkYXRlQ29udGVudEZvckxpbmUoTGluZUNhbmRpZGF0ZSYsIHNpemVfdCBpbmxpbmVJ
dGVtSW5kZXgsIGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgc2l6ZV90
IG92ZXJmbG93TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBsZWFkaW5nTG9naWNh
bFdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGN1cnJlbnRMb2dpY2FsUmlnaHQpOworICAgIHNpemVf
dCBuZXh0V3JhcE9wcG9ydHVuaXR5KHNpemVfdCBzdGFydEluZGV4LCBjb25zdCBMaW5lQnVpbGRl
cjo6SW5saW5lSXRlbVJhbmdlJiBsYXlvdXRSYW5nZSkgY29uc3Q7CisKKyAgICBzdHJ1Y3QgUmVz
dWx0IHsKKyAgICAgICAgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lIGlzRW5kT2ZM
aW5lIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9OworICAgICAgICBz
dHJ1Y3QgQ29tbWl0dGVkQ29udGVudENvdW50IHsKKyAgICAgICAgICAgIHNpemVfdCB2YWx1ZSB7
IDAgfTsKKyAgICAgICAgICAgIGJvb2wgaXNSZXZlcnQgeyBmYWxzZSB9OworICAgICAgICB9Owor
ICAgICAgICBDb21taXR0ZWRDb250ZW50Q291bnQgY29tbWl0dGVkQ291bnQgeyB9OworICAgICAg
ICBzaXplX3QgcGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCB7IDAgfTsKKyAgICAgICAgT3B0
aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gb3ZlcmZsb3dMb2dpY2FsV2lkdGggeyB9OworICAgIH07
CisgICAgc3RydWN0IFVzZWRDb25zdHJhaW50cyB7CisgICAgICAgIElubGluZVJlY3QgbG9naWNh
bFJlY3Q7CisgICAgICAgIGJvb2wgaXNDb25zdHJhaW5lZEJ5RmxvYXQgeyBmYWxzZSB9OworICAg
IH07CisgICAgVXNlZENvbnN0cmFpbnRzIGluaXRpYWxDb25zdHJhaW50c0ZvckxpbmUoY29uc3Qg
SW5saW5lUmVjdCYgaW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgYm9vbCBpc0ZpcnN0TGluZSkgY29u
c3Q7CisgICAgT3B0aW9uYWw8SG9yaXpvbnRhbENvbnN0cmFpbnRzPiBmbG9hdENvbnN0cmFpbnRz
KGNvbnN0IElubGluZVJlY3QmIGxpbmVMb2dpY2FsUmVjdCkgY29uc3Q7CisKKyAgICB2b2lkIGhh
bmRsZUZsb2F0Q29udGVudChjb25zdCBJbmxpbmVJdGVtJik7CisgICAgUmVzdWx0IGhhbmRsZUlu
bGluZUNvbnRlbnQoSW5saW5lQ29udGVudEJyZWFrZXImLCBjb25zdCBJbmxpbmVJdGVtUmFuZ2Um
IG5lZWRzTGF5b3V0UmFuZ2UsIGNvbnN0IExpbmVDYW5kaWRhdGUmKTsKKyAgICBzaXplX3QgcmVi
dWlsZExpbmUoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBjb25zdCBJ
bmxpbmVJdGVtJiBsYXN0SW5saW5lSXRlbVRvQWRkKTsKKyAgICBzaXplX3QgcmVidWlsZExpbmVG
b3JUcmFpbGluZ1NvZnRIeXBoZW4oY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsYXlvdXRSYW5nZSk7
CisgICAgdm9pZCBjb21taXRQYXJ0aWFsQ29udGVudChjb25zdCBJbmxpbmVDb250ZW50QnJlYWtl
cjo6Q29udGludW91c0NvbnRlbnQ6OlJ1bkxpc3QmLCBjb25zdCBJbmxpbmVDb250ZW50QnJlYWtl
cjo6UmVzdWx0OjpQYXJ0aWFsVHJhaWxpbmdDb250ZW50Jik7CisgICAgdm9pZCBpbml0aWFsaXpl
KGNvbnN0IFVzZWRDb25zdHJhaW50cyYpOworICAgIHN0cnVjdCBDb21taXR0ZWRDb250ZW50IHsK
KyAgICAgICAgc2l6ZV90IGlubGluZUl0ZW1Db3VudCB7IDAgfTsKKyAgICAgICAgc2l6ZV90IHBh
cnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGggeyAwIH07CisgICAgICAgIE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+IG92ZXJmbG93TG9naWNhbFdpZHRoIHsgfTsKKyAgICB9OworICAgIENvbW1p
dHRlZENvbnRlbnQgcGxhY2VJbmxpbmVDb250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5nZSYsIHNp
emVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91dFVu
aXQ+IG92ZXJmbG93TG9naWNhbFdpZHRoKTsKKyAgICBJbmxpbmVJdGVtUmFuZ2UgY2xvc2UoY29u
c3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBjb25zdCBDb21taXR0ZWRDb250
ZW50Jik7CisKKyAgICBJbmxpbmVMYXlvdXRVbml0IGlubGluZUl0ZW1XaWR0aChjb25zdCBJbmxp
bmVJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpIGNvbnN0OworICAg
IGJvb2wgaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5nZSYg
bGluZVJhbmdlLCBzaXplX3QgbGFzdElubGluZUl0ZW1JbmRleCwgYm9vbCBoYXNQYXJ0aWFsVHJh
aWxpbmdDb250ZW50KSBjb25zdDsKKworICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0
JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQ7IH0KKyAgICBJbmxpbmVGb3JtYXR0aW5nU3RhdGUqIGZvcm1hdHRpbmdTdGF0ZSgpIHsg
cmV0dXJuIG1faW5saW5lRm9ybWF0dGluZ1N0YXRlOyB9CisgICAgRmxvYXRpbmdTdGF0ZSogZmxv
YXRpbmdTdGF0ZSgpIHsgcmV0dXJuIG1fZmxvYXRpbmdTdGF0ZTsgfQorICAgIGNvbnN0IEZsb2F0
aW5nU3RhdGUqIGZsb2F0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nU3RhdGU7
IH0KKyAgICBjb25zdCBDb250YWluZXJCb3gmIHJvb3QoKSBjb25zdDsKKyAgICBjb25zdCBMYXlv
dXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSBjb25zdDsKKworICAgIGNvbnN0IElubGluZUZvcm1hdHRp
bmdDb250ZXh0JiBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0OworICAgIElubGluZUZvcm1hdHRp
bmdTdGF0ZSogbV9pbmxpbmVGb3JtYXR0aW5nU3RhdGUgeyBudWxscHRyIH07CisgICAgRmxvYXRp
bmdTdGF0ZSogbV9mbG9hdGluZ1N0YXRlIHsgbnVsbHB0ciB9OworICAgIE9wdGlvbmFsPEhvcml6
b250YWxDb25zdHJhaW50cz4gbV9yb290SG9yaXpvbnRhbENvbnN0cmFpbnRzOworCisgICAgTGlu
ZSBtX2xpbmU7CisgICAgSW5saW5lUmVjdCBtX2xpbmVMb2dpY2FsUmVjdDsKKyAgICBjb25zdCBJ
bmxpbmVJdGVtcyYgbV9pbmxpbmVJdGVtczsKKyAgICBGbG9hdExpc3QgbV9mbG9hdHM7CisgICAg
T3B0aW9uYWw8SW5saW5lVGV4dEl0ZW0+IG1fcGFydGlhbExlYWRpbmdUZXh0SXRlbTsKKyAgICBW
ZWN0b3I8Y29uc3QgSW5saW5lSXRlbSo+IG1fd3JhcE9wcG9ydHVuaXR5TGlzdDsKKyAgICB1bnNp
Z25lZCBtX3N1Y2Nlc3NpdmVIeXBoZW5hdGVkTGluZUNvdW50IHsgMCB9OworICAgIGJvb2wgbV9j
b250ZW50SXNDb25zdHJhaW5lZEJ5RmxvYXQgeyBmYWxzZSB9OworfTsKKworfQorfQorI2VuZGlm
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUdlb21ldHJ5LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUdlb21ldHJ5
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uZDZhMmM1OGEwNzZlNDljMmNkM2M5ZTJmOTJhYjM2ZDAzZjI3MjllNQot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lR2VvbWV0cnkuaApAQCAtMCwwICsxLDgwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJ
TkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIklubGluZVJlY3QuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIElubGluZUxpbmVHZW9tZXRyeSB7Cisg
ICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgc3RydWN0IEVuY2xvc2lu
Z1RvcEFuZEJvdHRvbSB7CisgICAgICAgIC8vIFRoaXMgdmFsdWVzIGVuY2xvc2VzIHRoZSByb290
IGlubGluZSBib3ggYW5kIGFueSBvdGhlciBpbmxpbmUgbGV2ZWwgYm94J3MgYm9yZGVyIGJveC4K
KyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB0b3AgeyAwIH07CisgICAgICAgIElubGluZUxheW91
dFVuaXQgYm90dG9tIHsgMCB9OworICAgIH07CisgICAgSW5saW5lTGluZUdlb21ldHJ5KGNvbnN0
IElubGluZVJlY3QmIGxpbmVCb3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tLCBJ
bmxpbmVMYXlvdXRVbml0IGFsaWdtZW50QmFzZWxpbmUsIElubGluZUxheW91dFVuaXQgY29udGVu
dExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgpOworCisg
ICAgY29uc3QgSW5saW5lUmVjdCYgbGluZUJveExvZ2ljYWxSZWN0KCkgY29uc3QgeyByZXR1cm4g
bV9saW5lQm94TG9naWNhbFJlY3Q7IH0KKworICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBlbmNs
b3NpbmdUb3BBbmRCb3R0b20oKSBjb25zdCB7IHJldHVybiBtX2VuY2xvc2luZ1RvcEFuZEJvdHRv
bTsgfQorCisgICAgSW5saW5lTGF5b3V0VW5pdCBiYXNlbGluZSgpIGNvbnN0IHsgcmV0dXJuIG1f
YWxpZ21lbnRCYXNlbGluZTsgfQorCisgICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNh
bExlZnQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRMb2dpY2FsTGVmdDsgfQorICAgIElubGlu
ZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVu
dExvZ2ljYWxXaWR0aDsgfQorCisgICAgdm9pZCBtb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRV
bml0IG9mZnNldCkgeyBtX2xpbmVCb3hMb2dpY2FsUmVjdC5tb3ZlVmVydGljYWxseShvZmZzZXQp
OyB9CisKK3ByaXZhdGU6CisgICAgLy8gVGhpcyBpcyBsaW5lIGJveCBnZW9tZXRyeSAoc2VlIGh0
dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xpbmUtYm94KS4KKyAgICBJbmxpbmVS
ZWN0IG1fbGluZUJveExvZ2ljYWxSZWN0OworICAgIC8vIEVuY2xvc2luZyB0b3AgYW5kIGJvdHRv
bSBpbmNsdWRlcyBhbGwgaW5saW5lIGxldmVsIGJveGVzIChib3JkZXIgYm94KSB2ZXJ0aWNhbGx5
LgorICAgIC8vIFdoaWxlIHRoZSBsaW5lIGJveCB1c3VhbGx5IGVuY2xvc2UgdGhlbSBhcyB3ZWxs
LCBpdHMgdmVydGljYWwgZ2VvbWV0cnkgaXMgYmFzZWQgb24KKyAgICAvLyB0aGUgbGF5b3V0IGJv
dW5kcyBvZiB0aGUgaW5saW5lIGxldmVsIGJveGVzIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgd2hl
biBsaW5lLWhlaWdodCBpcyBwcmVzZW50LgorICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBtX2Vu
Y2xvc2luZ1RvcEFuZEJvdHRvbTsKKyAgICBJbmxpbmVMYXlvdXRVbml0IG1fYWxpZ21lbnRCYXNl
bGluZSB7IDAgfTsKKyAgICBJbmxpbmVMYXlvdXRVbml0IG1fY29udGVudExvZ2ljYWxMZWZ0IHsg
MCB9OworICAgIElubGluZUxheW91dFVuaXQgbV9jb250ZW50TG9naWNhbFdpZHRoIHsgMCB9Owor
fTsKKworaW5saW5lIElubGluZUxpbmVHZW9tZXRyeTo6SW5saW5lTGluZUdlb21ldHJ5KGNvbnN0
IElubGluZVJlY3QmIGxpbmVCb3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tIGVu
Y2xvc2luZ1RvcEFuZEJvdHRvbSwgSW5saW5lTGF5b3V0VW5pdCBhbGlnbWVudEJhc2VsaW5lLCBJ
bmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBjb250
ZW50TG9naWNhbFdpZHRoKQorICAgIDogbV9saW5lQm94TG9naWNhbFJlY3QobGluZUJveExvZ2lj
YWxSZWN0KQorICAgICwgbV9lbmNsb3NpbmdUb3BBbmRCb3R0b20oZW5jbG9zaW5nVG9wQW5kQm90
dG9tKQorICAgICwgbV9hbGlnbWVudEJhc2VsaW5lKGFsaWdtZW50QmFzZWxpbmUpCisgICAgLCBt
X2NvbnRlbnRMb2dpY2FsTGVmdChjb250ZW50TG9naWNhbExlZnQpCisgICAgLCBtX2NvbnRlbnRM
b2dpY2FsV2lkdGgoY29udGVudExvZ2ljYWxXaWR0aCkKK3sKK30KKworfQorfQorCisjZW5kaWYK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5s
aW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lUnVuLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZVJ1bi5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjBiMGVlMTRkZWQwYmUyY2NkNTJkMzQzM2IwODg0NTQ2YzFmMGQyYjIKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZv
cm1hdHRpbmcvSW5saW5lTGluZVJ1bi5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKwor
I2luY2x1ZGUgIklubGluZVJlY3QuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRl
ICJUZXh0RmxhZ3MuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7
CisKK3N0cnVjdCBMaW5lUnVuIHsKKyAgICBXVEZfTUFLRV9TVFJVQ1RfRkFTVF9BTExPQ0FURUQ7
CisgICAgc3RydWN0IFRleHQgeworICAgICAgICBXVEZfTUFLRV9TVFJVQ1RfRkFTVF9BTExPQ0FU
RUQ7CisgICAgcHVibGljOgorICAgICAgICBUZXh0KHNpemVfdCBwb3NpdGlvbiwgc2l6ZV90IGxl
bmd0aCwgY29uc3QgU3RyaW5nJik7CisKKyAgICAgICAgc2l6ZV90IHN0YXJ0KCkgY29uc3QgeyBy
ZXR1cm4gbV9zdGFydDsgfQorICAgICAgICBzaXplX3QgZW5kKCkgY29uc3QgeyByZXR1cm4gc3Rh
cnQoKSArIGxlbmd0aCgpOyB9CisgICAgICAgIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7IHJldHVy
biBtX2xlbmd0aDsgfQorICAgICAgICBTdHJpbmcgY29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1f
Y29udGVudFN0cmluZzsgfQorCisgICAgICAgIGJvb2wgbmVlZHNIeXBoZW4oKSBjb25zdCB7IHJl
dHVybiBtX25lZWRzSHlwaGVuOyB9CisgICAgICAgIHZvaWQgc2V0TmVlZHNIeXBoZW4oKSB7IG1f
bmVlZHNIeXBoZW4gPSB0cnVlOyB9CisKKyAgICAgICAgdm9pZCBleHBhbmQoc2l6ZV90IGRlbHRh
KSB7IG1fbGVuZ3RoICs9IGRlbHRhOyB9CisgICAgICAgIHZvaWQgc2hyaW5rKHNpemVfdCBkZWx0
YSkgeyBtX2xlbmd0aCAtPSBkZWx0YTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc2l6ZV90
IG1fc3RhcnQgeyAwIH07CisgICAgICAgIHNpemVfdCBtX2xlbmd0aCB7IDAgfTsKKyAgICAgICAg
Ym9vbCBtX25lZWRzSHlwaGVuIHsgZmFsc2UgfTsKKyAgICAgICAgU3RyaW5nIG1fY29udGVudFN0
cmluZzsKKyAgICB9OworCisgICAgc3RydWN0IEV4cGFuc2lvbjsKKyAgICBMaW5lUnVuKHNpemVf
dCBsaW5lSW5kZXgsIGNvbnN0IEJveCYsIGNvbnN0IElubGluZVJlY3QmLCBFeHBhbnNpb24sIE9w
dGlvbmFsPFRleHQ+ID0gV1RGOjpudWxsb3B0KTsKKworICAgIGNvbnN0IElubGluZVJlY3QmIGxv
Z2ljYWxSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdDsgfQorCisgICAgSW5saW5l
TGF5b3V0VW5pdCBsb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS50b3Ao
KTsgfQorICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJu
IGxvZ2ljYWxSZWN0KCkuYm90dG9tKCk7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxM
ZWZ0KCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS5sZWZ0KCk7IH0KKyAgICBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkucmln
aHQoKTsgfQorCisgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJl
dHVybiBsb2dpY2FsUmVjdCgpLndpZHRoKCk7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxIZWlnaHQoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVjdCgpLmhlaWdodCgpOyB9CisKKyAg
ICB2b2lkIG1vdmVWZXJ0aWNhbGx5KElubGluZUxheW91dFVuaXQgb2Zmc2V0KSB7IG1fbG9naWNh
bFJlY3QubW92ZVZlcnRpY2FsbHkob2Zmc2V0KTsgfQorICAgIE9wdGlvbmFsPFRleHQ+JiB0ZXh0
KCkgeyByZXR1cm4gbV90ZXh0OyB9CisgICAgY29uc3QgT3B0aW9uYWw8VGV4dD4mIHRleHQoKSBj
b25zdCB7IHJldHVybiBtX3RleHQ7IH0KKworICAgIHN0cnVjdCBFeHBhbnNpb24geworICAgICAg
ICBFeHBhbnNpb25CZWhhdmlvciBiZWhhdmlvciB7IERlZmF1bHRFeHBhbnNpb24gfTsKKyAgICAg
ICAgSW5saW5lTGF5b3V0VW5pdCBob3Jpem9udGFsRXhwYW5zaW9uIHsgMCB9OworICAgIH07Cisg
ICAgRXhwYW5zaW9uIGV4cGFuc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fZXhwYW5zaW9uOyB9CisK
KyAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsg
fQorICAgIHNpemVfdCBsaW5lSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2xpbmVJbmRleDsgfQor
Citwcml2YXRlOgorICAgIGNvbnN0IHNpemVfdCBtX2xpbmVJbmRleDsKKyAgICBXZWFrUHRyPGNv
bnN0IExheW91dDo6Qm94PiBtX2xheW91dEJveDsKKyAgICBJbmxpbmVSZWN0IG1fbG9naWNhbFJl
Y3Q7CisgICAgRXhwYW5zaW9uIG1fZXhwYW5zaW9uOworICAgIE9wdGlvbmFsPFRleHQ+IG1fdGV4
dDsKK307CisKK2lubGluZSBMaW5lUnVuOjpMaW5lUnVuKHNpemVfdCBsaW5lSW5kZXgsIGNvbnN0
IExheW91dDo6Qm94JiBsYXlvdXRCb3gsIGNvbnN0IElubGluZVJlY3QmIGxvZ2ljYWxSZWN0LCBF
eHBhbnNpb24gZXhwYW5zaW9uLCBPcHRpb25hbDxUZXh0PiB0ZXh0KQorICAgIDogbV9saW5lSW5k
ZXgobGluZUluZGV4KQorICAgICwgbV9sYXlvdXRCb3gobWFrZVdlYWtQdHIobGF5b3V0Qm94KSkK
KyAgICAsIG1fbG9naWNhbFJlY3QobG9naWNhbFJlY3QpCisgICAgLCBtX2V4cGFuc2lvbihleHBh
bnNpb24pCisgICAgLCBtX3RleHQodGV4dCkKK3sKK30KKworaW5saW5lIExpbmVSdW46OlRleHQ6
OlRleHQoc2l6ZV90IHN0YXJ0LCBzaXplX3QgbGVuZ3RoLCBjb25zdCBTdHJpbmcmIGNvbnRlbnRT
dHJpbmcpCisgICAgOiBtX3N0YXJ0KHN0YXJ0KQorICAgICwgbV9sZW5ndGgobGVuZ3RoKQorICAg
ICwgbV9jb250ZW50U3RyaW5nKGNvbnRlbnRTdHJpbmcpCit7Cit9CisKK30KK30KKyNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxp
bmVmb3JtYXR0aW5nL0lubGluZVJlY3QuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVSZWN0LmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYWNk
MDlhYjFlNzEwMWFhNmVjZjQzM2QyNjQwMDRmZmU4ZmI3YThjNAotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVSZWN0LmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9u
Y2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAi
TGF5b3V0VW5pdHMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7
CisKK2NsYXNzIElubGluZVJlY3QgeworcHVibGljOgorICAgIElubGluZVJlY3QoKSA9IGRlZmF1
bHQ7CisgICAgSW5saW5lUmVjdChJbmxpbmVMYXlvdXRVbml0IHRvcCwgSW5saW5lTGF5b3V0VW5p
dCBsZWZ0LCBJbmxpbmVMYXlvdXRVbml0IHdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCk7
CisgICAgSW5saW5lUmVjdChjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgdG9wTGVmdCwgSW5saW5l
TGF5b3V0VW5pdCB3aWR0aCwgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQpOworICAgIElubGluZVJl
Y3QoY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIHRvcExlZnQsIGNvbnN0IElubGluZUxheW91dFNp
emUmKTsKKyAgICAKKyAgICBJbmxpbmVMYXlvdXRVbml0IHRvcCgpIGNvbnN0OworICAgIElubGlu
ZUxheW91dFVuaXQgbGVmdCgpIGNvbnN0OworICAgIElubGluZUxheW91dFBvaW50IHRvcExlZnQo
KSBjb25zdDsKKworICAgIElubGluZUxheW91dFVuaXQgYm90dG9tKCkgY29uc3Q7CisgICAgSW5s
aW5lTGF5b3V0VW5pdCByaWdodCgpIGNvbnN0OyAgICAgICAgCisKKyAgICBJbmxpbmVMYXlvdXRV
bml0IHdpZHRoKCkgY29uc3Q7CisgICAgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQoKSBjb25zdDsK
KyAgICBJbmxpbmVMYXlvdXRTaXplIHNpemUoKSBjb25zdDsKKworICAgIHZvaWQgc2V0VG9wKElu
bGluZUxheW91dFVuaXQpOworICAgIHZvaWQgc2V0Qm90dG9tKElubGluZUxheW91dFVuaXQpOwor
ICAgIHZvaWQgc2V0TGVmdChJbmxpbmVMYXlvdXRVbml0KTsKKyAgICB2b2lkIHNldFRvcExlZnQo
Y29uc3QgSW5saW5lTGF5b3V0UG9pbnQmKTsKKyAgICB2b2lkIHNldFdpZHRoKElubGluZUxheW91
dFVuaXQpOworICAgIHZvaWQgc2V0SGVpZ2h0KElubGluZUxheW91dFVuaXQpOworCisgICAgdm9p
ZCBtb3ZlSG9yaXpvbnRhbGx5KElubGluZUxheW91dFVuaXQpOworICAgIHZvaWQgbW92ZVZlcnRp
Y2FsbHkoSW5saW5lTGF5b3V0VW5pdCk7CisgICAgdm9pZCBtb3ZlQnkoSW5saW5lTGF5b3V0UG9p
bnQpOworCisgICAgdm9pZCBleHBhbmQoT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4sIE9wdGlv
bmFsPElubGluZUxheW91dFVuaXQ+KTsKKyAgICB2b2lkIGV4cGFuZFRvQ29udGFpbihjb25zdCBJ
bmxpbmVSZWN0Jik7CisgICAgdm9pZCBleHBhbmRIb3Jpem9udGFsbHkoSW5saW5lTGF5b3V0VW5p
dCBkZWx0YSkgeyBleHBhbmQoZGVsdGEsIHsgfSk7IH0KKyAgICB2b2lkIGV4cGFuZFZlcnRpY2Fs
bHkoSW5saW5lTGF5b3V0VW5pdCBkZWx0YSkgeyBleHBhbmQoeyB9LCBkZWx0YSk7IH0KKyAgICB2
b2lkIGV4cGFuZFZlcnRpY2FsbHlUb0NvbnRhaW4oY29uc3QgSW5saW5lUmVjdCYpOworICAgIHZv
aWQgaW5mbGF0ZShJbmxpbmVMYXlvdXRVbml0KTsKKworICAgIG9wZXJhdG9yIElubGluZUxheW91
dFJlY3QoKSBjb25zdDsKKworcHJpdmF0ZToKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIHZvaWQg
aW52YWxpZGF0ZVRvcCgpIHsgbV9oYXNWYWxpZFRvcCA9IGZhbHNlOyB9CisgICAgdm9pZCBpbnZh
bGlkYXRlTGVmdCgpIHsgbV9oYXNWYWxpZExlZnQgPSBmYWxzZTsgfQorICAgIHZvaWQgaW52YWxp
ZGF0ZVdpZHRoKCkgeyBtX2hhc1ZhbGlkV2lkdGggPSBmYWxzZTsgfQorICAgIHZvaWQgaW52YWxp
ZGF0ZUhlaWdodCgpIHsgbV9oYXNWYWxpZEhlaWdodCA9IGZhbHNlOyB9CisgICAgdm9pZCBpbnZh
bGlkYXRlUG9zaXRpb24oKTsKKworICAgIGJvb2wgaGFzVmFsaWRQb3NpdGlvbigpIGNvbnN0IHsg
cmV0dXJuIG1faGFzVmFsaWRUb3AgJiYgbV9oYXNWYWxpZExlZnQ7IH0KKyAgICBib29sIGhhc1Zh
bGlkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faGFzVmFsaWRXaWR0aCAmJiBtX2hhc1ZhbGlkSGVp
Z2h0OyB9CisgICAgYm9vbCBoYXNWYWxpZEdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gaGFzVmFs
aWRQb3NpdGlvbigpICYmIGhhc1ZhbGlkU2l6ZSgpOyB9CisKKyAgICB2b2lkIHNldEhhc1ZhbGlk
UG9zaXRpb24oKTsKKyAgICB2b2lkIHNldEhhc1ZhbGlkU2l6ZSgpOworCisgICAgYm9vbCBtX2hh
c1ZhbGlkVG9wIHsgZmFsc2UgfTsKKyAgICBib29sIG1faGFzVmFsaWRMZWZ0IHsgZmFsc2UgfTsK
KyAgICBib29sIG1faGFzVmFsaWRXaWR0aCB7IGZhbHNlIH07CisgICAgYm9vbCBtX2hhc1ZhbGlk
SGVpZ2h0IHsgZmFsc2UgfTsKKyNlbmRpZiAvLyBBU1NFUlRfRU5BQkxFRAorICAgIElubGluZUxh
eW91dFJlY3QgbV9yZWN0OworfTsKKworaW5saW5lIElubGluZVJlY3Q6OklubGluZVJlY3QoSW5s
aW5lTGF5b3V0VW5pdCB0b3AsIElubGluZUxheW91dFVuaXQgbGVmdCwgSW5saW5lTGF5b3V0VW5p
dCB3aWR0aCwgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQpCisgICAgOiBtX3JlY3QobGVmdCwgdG9w
LCB3aWR0aCwgaGVpZ2h0KQoreworI2lmIEFTU0VSVF9FTkFCTEVECisgICAgbV9oYXNWYWxpZFRv
cCA9IHRydWU7CisgICAgbV9oYXNWYWxpZExlZnQgPSB0cnVlOworICAgIG1faGFzVmFsaWRXaWR0
aCA9IHRydWU7CisgICAgbV9oYXNWYWxpZEhlaWdodCA9IHRydWU7CisjZW5kaWYKK30KKworaW5s
aW5lIElubGluZVJlY3Q6OklubGluZVJlY3QoY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIHRvcExl
ZnQsIElubGluZUxheW91dFVuaXQgd2lkdGgsIElubGluZUxheW91dFVuaXQgaGVpZ2h0KQorICAg
IDogSW5saW5lUmVjdCh0b3BMZWZ0LnkoKSwgdG9wTGVmdC54KCksIHdpZHRoLCBoZWlnaHQpCit7
Cit9CisKK2lubGluZSBJbmxpbmVSZWN0OjpJbmxpbmVSZWN0KGNvbnN0IElubGluZUxheW91dFBv
aW50JiB0b3BMZWZ0LCBjb25zdCBJbmxpbmVMYXlvdXRTaXplJiBzaXplKQorICAgIDogSW5saW5l
UmVjdCh0b3BMZWZ0LnkoKSwgdG9wTGVmdC54KCksIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQo
KSkKK3sKK30KKworI2lmIEFTU0VSVF9FTkFCTEVECitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0Ojpp
bnZhbGlkYXRlUG9zaXRpb24oKQoreworICAgIGludmFsaWRhdGVUb3AoKTsKKyAgICBpbnZhbGlk
YXRlTGVmdCgpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRIYXNWYWxpZFBvc2l0
aW9uKCkKK3sKKyAgICBtX2hhc1ZhbGlkVG9wID0gdHJ1ZTsKKyAgICBtX2hhc1ZhbGlkTGVmdCA9
IHRydWU7Cit9CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6OnNldEhhc1ZhbGlkU2l6ZSgpCit7
CisgICAgbV9oYXNWYWxpZFdpZHRoID0gdHJ1ZTsKKyAgICBtX2hhc1ZhbGlkSGVpZ2h0ID0gdHJ1
ZTsKK30KKyNlbmRpZiAvLyBBU1NFUlRfRU5BQkxFRAorCitpbmxpbmUgSW5saW5lTGF5b3V0VW5p
dCBJbmxpbmVSZWN0Ojp0b3AoKSBjb25zdAoreworICAgIEFTU0VSVChtX2hhc1ZhbGlkVG9wKTsK
KyAgICByZXR1cm4gbV9yZWN0LnkoKTsKK30KKworaW5saW5lIElubGluZUxheW91dFVuaXQgSW5s
aW5lUmVjdDo6bGVmdCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1faGFzVmFsaWRMZWZ0KTsKKyAg
ICByZXR1cm4gbV9yZWN0LngoKTsKK30KKworaW5saW5lIElubGluZUxheW91dFVuaXQgSW5saW5l
UmVjdDo6Ym90dG9tKCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV9oYXNWYWxpZFRvcCAmJiBtX2hh
c1ZhbGlkSGVpZ2h0KTsKKyAgICByZXR1cm4gbV9yZWN0Lm1heFkoKTsKK30KKworaW5saW5lIElu
bGluZUxheW91dFVuaXQgSW5saW5lUmVjdDo6cmlnaHQoKSBjb25zdAoreworICAgIEFTU0VSVCht
X2hhc1ZhbGlkTGVmdCAmJiBtX2hhc1ZhbGlkV2lkdGgpOworICAgIHJldHVybiBtX3JlY3QubWF4
WCgpOworfQorCitpbmxpbmUgSW5saW5lTGF5b3V0UG9pbnQgSW5saW5lUmVjdDo6dG9wTGVmdCgp
IGNvbnN0Cit7CisgICAgQVNTRVJUKGhhc1ZhbGlkUG9zaXRpb24oKSk7CisgICAgcmV0dXJuIG1f
cmVjdC5taW5YTWluWUNvcm5lcigpOworfQorCitpbmxpbmUgSW5saW5lTGF5b3V0U2l6ZSBJbmxp
bmVSZWN0OjpzaXplKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaGFzVmFsaWRTaXplKCkpOworICAg
IHJldHVybiBtX3JlY3Quc2l6ZSgpOworfQorCitpbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxp
bmVSZWN0Ojp3aWR0aCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1faGFzVmFsaWRXaWR0aCk7Cisg
ICAgcmV0dXJuIG1fcmVjdC53aWR0aCgpOworfQorCitpbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJ
bmxpbmVSZWN0OjpoZWlnaHQoKSBjb25zdAoreworICAgIEFTU0VSVChtX2hhc1ZhbGlkSGVpZ2h0
KTsKKyAgICByZXR1cm4gbV9yZWN0LmhlaWdodCgpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVS
ZWN0OjpzZXRUb3BMZWZ0KGNvbnN0IElubGluZUxheW91dFBvaW50JiB0b3BMZWZ0KQoreworI2lm
IEFTU0VSVF9FTkFCTEVECisgICAgc2V0SGFzVmFsaWRQb3NpdGlvbigpOworI2VuZGlmCisgICAg
bV9yZWN0LnNldExvY2F0aW9uKHRvcExlZnQpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0
OjpzZXRUb3AoSW5saW5lTGF5b3V0VW5pdCB0b3ApCit7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAg
ICBtX2hhc1ZhbGlkVG9wID0gdHJ1ZTsKKyNlbmRpZgorICAgIG1fcmVjdC5zZXRZKHRvcCk7Cit9
CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6OnNldEJvdHRvbShJbmxpbmVMYXlvdXRVbml0IGJv
dHRvbSkKK3sKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIG1faGFzVmFsaWRUb3AgPSB0cnVlOwor
ICAgIG1faGFzVmFsaWRIZWlnaHQgPSB0cnVlOworI2VuZGlmCisgICAgbV9yZWN0LnNoaWZ0TWF4
WUVkZ2VUbyhib3R0b20pOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRMZWZ0KElu
bGluZUxheW91dFVuaXQgbGVmdCkKK3sKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIG1faGFzVmFs
aWRMZWZ0ID0gdHJ1ZTsKKyNlbmRpZgorICAgIG1fcmVjdC5zZXRYKGxlZnQpOworfQorCitpbmxp
bmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRXaWR0aChJbmxpbmVMYXlvdXRVbml0IHdpZHRoKQorewor
I2lmIEFTU0VSVF9FTkFCTEVECisgICAgbV9oYXNWYWxpZFdpZHRoID0gdHJ1ZTsKKyNlbmRpZgor
ICAgIG1fcmVjdC5zZXRXaWR0aCh3aWR0aCk7Cit9CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6
OnNldEhlaWdodChJbmxpbmVMYXlvdXRVbml0IGhlaWdodCkKK3sKKyNpZiBBU1NFUlRfRU5BQkxF
RAorICAgIG1faGFzVmFsaWRIZWlnaHQgPSB0cnVlOworI2VuZGlmCisgICAgbV9yZWN0LnNldEhl
aWdodChoZWlnaHQpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0Ojptb3ZlSG9yaXpvbnRh
bGx5KElubGluZUxheW91dFVuaXQgb2Zmc2V0KQoreworICAgIEFTU0VSVChtX2hhc1ZhbGlkTGVm
dCk7CisgICAgbV9yZWN0Lm1vdmUoSW5saW5lTGF5b3V0U2l6ZSB7IG9mZnNldCwgMCB9KTsKK30K
KworaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6bW92ZVZlcnRpY2FsbHkoSW5saW5lTGF5b3V0VW5p
dCBvZmZzZXQpCit7CisgICAgQVNTRVJUKG1faGFzVmFsaWRUb3ApOworICAgIG1fcmVjdC5tb3Zl
KElubGluZUxheW91dFNpemUgeyAwLCBvZmZzZXQgfSk7Cit9CisKK2lubGluZSB2b2lkIElubGlu
ZVJlY3Q6Om1vdmVCeShJbmxpbmVMYXlvdXRQb2ludCBvZmZzZXQpCit7CisgICAgQVNTRVJUKG1f
aGFzVmFsaWRUb3ApOworICAgIEFTU0VSVChtX2hhc1ZhbGlkTGVmdCk7CisgICAgbV9yZWN0Lm1v
dmVCeShvZmZzZXQpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpleHBhbmQoT3B0aW9u
YWw8SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGhl
aWdodCkKK3sKKyAgICBBU1NFUlQoIXdpZHRoIHx8IG1faGFzVmFsaWRXaWR0aCk7CisgICAgQVNT
RVJUKCFoZWlnaHQgfHwgbV9oYXNWYWxpZEhlaWdodCk7CisgICAgbV9yZWN0LmV4cGFuZCh3aWR0
aC52YWx1ZU9yKDApLCBoZWlnaHQudmFsdWVPcigwKSk7Cit9CisKK2lubGluZSB2b2lkIElubGlu
ZVJlY3Q6OmV4cGFuZFRvQ29udGFpbihjb25zdCBJbmxpbmVSZWN0JiBvdGhlcikKK3sKKyNpZiBB
U1NFUlRfRU5BQkxFRAorICAgIG1faGFzVmFsaWRUb3AgPSB0cnVlOworICAgIG1faGFzVmFsaWRM
ZWZ0ID0gdHJ1ZTsKKyAgICBtX2hhc1ZhbGlkV2lkdGggPSB0cnVlOworICAgIG1faGFzVmFsaWRI
ZWlnaHQgPSB0cnVlOworI2VuZGlmCisgICAgbV9yZWN0LnVuaXRlRXZlbklmRW1wdHkob3RoZXIp
OworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpleHBhbmRWZXJ0aWNhbGx5VG9Db250YWlu
KGNvbnN0IElubGluZVJlY3QmIG90aGVyKQoreworICAgIGF1dG8gY29udGFpblRvcCA9IHN0ZDo6
bWluKHRvcCgpLCBvdGhlci50b3AoKSk7CisgICAgYXV0byBjb250YWluQm90dG9tID0gc3RkOjpt
YXgoYm90dG9tKCksIG90aGVyLmJvdHRvbSgpKTsKKyAgICBzZXRUb3AoY29udGFpblRvcCk7Cisg
ICAgc2V0Qm90dG9tKGNvbnRhaW5Cb3R0b20pOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0
OjppbmZsYXRlKElubGluZUxheW91dFVuaXQgaW5mbGF0ZSkKK3sKKyAgICBBU1NFUlQoaGFzVmFs
aWRHZW9tZXRyeSgpKTsKKyAgICBtX3JlY3QuaW5mbGF0ZShpbmZsYXRlKTsKK30KKworaW5saW5l
IElubGluZVJlY3Q6Om9wZXJhdG9yIElubGluZUxheW91dFJlY3QoKSBjb25zdAoreworICAgIEFT
U0VSVChoYXNWYWxpZEdlb21ldHJ5KCkpOyAKKyAgICByZXR1cm4gbV9yZWN0OworfQorCit9Cit9
CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZVNvZnRMaW5lQnJlYWtJdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOWVhMDZmYmNkZDE3ODI0MmJhYjU0NzNh
OTRhMTNhYzMwYmM3OTcwYgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVTb2Z0TGluZUJyZWFr
SXRlbS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
KyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisg
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lm
IEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiSW5saW5lSXRl
bS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3Mg
SW5saW5lU29mdExpbmVCcmVha0l0ZW0gOiBwdWJsaWMgSW5saW5lSXRlbSB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIElubGluZVNvZnRMaW5lQnJlYWtJdGVtIGNyZWF0ZVNvZnRMaW5lQnJlYWtJdGVt
KGNvbnN0IElubGluZVRleHRCb3gmLCB1bnNpZ25lZCBwb3NpdGlvbik7CisKKyAgICB1bnNpZ25l
ZCBwb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRPclBvc2l0aW9uOyB9CisgICAgY29u
c3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0
PElubGluZVRleHRCb3g+KGxheW91dEJveCgpKTsgfQorCisgICAgSW5saW5lU29mdExpbmVCcmVh
a0l0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHBvc2l0aW9uKTsKK307CisKK2lu
bGluZSBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbTo6Y3Jl
YXRlU29mdExpbmVCcmVha0l0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwg
dW5zaWduZWQgcG9zaXRpb24pCit7CisgICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgcG9zaXRp
b24gfTsKK30KKworaW5saW5lIElubGluZVNvZnRMaW5lQnJlYWtJdGVtOjpJbmxpbmVTb2Z0TGlu
ZUJyZWFrSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBw
b3NpdGlvbikKKyAgICA6IElubGluZUl0ZW0oaW5saW5lVGV4dEJveCwgVHlwZTo6U29mdExpbmVC
cmVhaykKK3sKKyAgICBtX3N0YXJ0T3JQb3NpdGlvbiA9IHBvc2l0aW9uOworfQorCit9Cit9CisK
K1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfSU5MSU5FX0lURU0oSW5saW5lU29mdExpbmVCcmVha0l0
ZW0sIGlzU29mdExpbmVCcmVhaygpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVUZXh0
SXRlbS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjljNzM3YWYwYmRiYTk1
YTVmNDA1ZWNiNDk0NWZjY2QxOWNkOGJjMzkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4
dEl0ZW0uY3BwCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwor
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisg
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZP
Uk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisjaW5jbHVkZSAi
SW5saW5lU29mdExpbmVCcmVha0l0ZW0uaCIKKyNpbmNsdWRlICJUZXh0VXRpbC5oIgorI2luY2x1
ZGUgPHd0Zi91bmljb2RlL0NoYXJhY3Rlck5hbWVzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K25hbWVzcGFjZSBMYXlvdXQgeworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihJbmxpbmVJdGVtKSA9
PSBzaXplb2YoSW5saW5lVGV4dEl0ZW0pLCAiIik7CisKK3N0cnVjdCBXaGl0ZXNwYWNlQ29udGVu
dCB7CisgICAgc2l6ZV90IGxlbmd0aCB7IDAgfTsKKyAgICBib29sIGlzV29yZFNlcGFyYXRvciB7
IHRydWUgfTsKK307CitzdGF0aWMgT3B0aW9uYWw8V2hpdGVzcGFjZUNvbnRlbnQ+IG1vdmVUb05l
eHROb25XaGl0ZXNwYWNlUG9zaXRpb24oY29uc3QgU3RyaW5nVmlldyYgdGV4dENvbnRlbnQsIHNp
emVfdCBzdGFydFBvc2l0aW9uLCBib29sIHByZXNlcnZlTmV3bGluZSwgYm9vbCBwcmVzZXJ2ZVRh
YikKK3sKKyAgICBhdXRvIGhhc1dvcmRTZXBhcmF0b3JDaGFyYWN0ZXIgPSBmYWxzZTsKKyAgICBh
dXRvIGlzV2hpdGVzcGFjZUNoYXJhY3RlciA9IFsmXShhdXRvIGNoYXJhY3RlcikgeworICAgICAg
ICAvLyB3aGl0ZSBzcGFjZSBwcm9jZXNzaW5nIGluIENTUyBhZmZlY3RzIG9ubHkgdGhlIGRvY3Vt
ZW50IHdoaXRlIHNwYWNlIGNoYXJhY3RlcnM6IHNwYWNlcyAoVSswMDIwKSwgdGFicyAoVSswMDA5
KSwgYW5kIHNlZ21lbnQgYnJlYWtzLgorICAgICAgICBhdXRvIGlzVHJlYXRlZEFzU3BhY2VDaGFy
YWN0ZXIgPSBjaGFyYWN0ZXIgPT0gc3BhY2UgfHwgKGNoYXJhY3RlciA9PSBuZXdsaW5lQ2hhcmFj
dGVyICYmICFwcmVzZXJ2ZU5ld2xpbmUpIHx8IChjaGFyYWN0ZXIgPT0gdGFiQ2hhcmFjdGVyICYm
ICFwcmVzZXJ2ZVRhYik7CisgICAgICAgIGhhc1dvcmRTZXBhcmF0b3JDaGFyYWN0ZXIgPSBoYXNX
b3JkU2VwYXJhdG9yQ2hhcmFjdGVyIHx8IGlzVHJlYXRlZEFzU3BhY2VDaGFyYWN0ZXI7CisgICAg
ICAgIHJldHVybiBpc1RyZWF0ZWRBc1NwYWNlQ2hhcmFjdGVyIHx8IGNoYXJhY3RlciA9PSB0YWJD
aGFyYWN0ZXI7CisgICAgfTsKKyAgICBhdXRvIG5leHROb25XaGl0ZVNwYWNlUG9zaXRpb24gPSBz
dGFydFBvc2l0aW9uOworICAgIHdoaWxlIChuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uIDwgdGV4
dENvbnRlbnQubGVuZ3RoKCkgJiYgaXNXaGl0ZXNwYWNlQ2hhcmFjdGVyKHRleHRDb250ZW50W25l
eHROb25XaGl0ZVNwYWNlUG9zaXRpb25dKSkKKyAgICAgICAgKytuZXh0Tm9uV2hpdGVTcGFjZVBv
c2l0aW9uOworICAgIHJldHVybiBuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uID09IHN0YXJ0UG9z
aXRpb24gPyBXVEY6Om51bGxvcHQgOiBtYWtlT3B0aW9uYWwoV2hpdGVzcGFjZUNvbnRlbnQgeyBu
ZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiwgaGFzV29yZFNlcGFyYXRv
ckNoYXJhY3RlciB9KTsKK30KKworc3RhdGljIHVuc2lnbmVkIG1vdmVUb05leHRCcmVha2FibGVQ
b3NpdGlvbih1bnNpZ25lZCBzdGFydFBvc2l0aW9uLCBMYXp5TGluZUJyZWFrSXRlcmF0b3ImIGxp
bmVCcmVha0l0ZXJhdG9yLCBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUpCit7CisgICAgYXV0byB0
ZXh0TGVuZ3RoID0gbGluZUJyZWFrSXRlcmF0b3Iuc3RyaW5nVmlldygpLmxlbmd0aCgpOworICAg
IGF1dG8gc3RhcnRQb3NpdGlvbkZvck5leHRCcmVha2FibGVQb3NpdGlvbiA9IHN0YXJ0UG9zaXRp
b247CisgICAgd2hpbGUgKHN0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb24gPCB0
ZXh0TGVuZ3RoKSB7CisgICAgICAgIGF1dG8gbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gVGV4dFV0
aWw6OmZpbmROZXh0QnJlYWthYmxlUG9zaXRpb24obGluZUJyZWFrSXRlcmF0b3IsIHN0YXJ0UG9z
aXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb24sIHN0eWxlKTsKKyAgICAgICAgLy8gT2Z0ZW50
aW1lcyB0aGUgbmV4dCBicmVha2FibGUgcG9zaXRpb24gY29tZXMgYmFjayBhcyB0aGUgc3RhcnQg
cG9zaXRpb24gKG1vc3Qgbm90YWJseSBoeXBoZW5zKS4KKyAgICAgICAgaWYgKG5leHRCcmVha2Fi
bGVQb3NpdGlvbiAhPSBzdGFydFBvc2l0aW9uKQorICAgICAgICAgICAgcmV0dXJuIG5leHRCcmVh
a2FibGVQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb247CisgICAgICAgICsrc3RhcnRQb3NpdGlvbkZv
ck5leHRCcmVha2FibGVQb3NpdGlvbjsKKyAgICB9CisgICAgcmV0dXJuIHRleHRMZW5ndGggLSBz
dGFydFBvc2l0aW9uOworfQorCit2b2lkIElubGluZVRleHRJdGVtOjpjcmVhdGVBbmRBcHBlbmRU
ZXh0SXRlbXMoSW5saW5lSXRlbXMmIGlubGluZUNvbnRlbnQsIGNvbnN0IElubGluZVRleHRCb3gm
IGlubGluZVRleHRCb3gpCit7CisgICAgYXV0byB0ZXh0ID0gaW5saW5lVGV4dEJveC5jb250ZW50
KCk7CisgICAgaWYgKCF0ZXh0Lmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gaW5saW5lQ29udGVu
dC5hcHBlbmQoSW5saW5lVGV4dEl0ZW06OmNyZWF0ZUVtcHR5SXRlbShpbmxpbmVUZXh0Qm94KSk7
CisKKyAgICBhdXRvJiBzdHlsZSA9IGlubGluZVRleHRCb3guc3R5bGUoKTsKKyAgICBhdXRvJiBm
b250ID0gc3R5bGUuZm9udENhc2NhZGUoKTsKKyAgICBhdXRvIHdoaXRlc3BhY2VDb250ZW50SXNU
cmVhdGVkQXNTaW5nbGVTcGFjZSA9ICFUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRU
YWJzKGlubGluZVRleHRCb3gpOworICAgIGF1dG8gc2hvdWxkUHJlc2VydmVOZXdsaW5lID0gVGV4
dFV0aWw6OnNob3VsZFByZXNlcnZlTmV3bGluZShpbmxpbmVUZXh0Qm94KTsKKyAgICBhdXRvIGxp
bmVCcmVha0l0ZXJhdG9yID0gTGF6eUxpbmVCcmVha0l0ZXJhdG9yIHsgdGV4dCwgc3R5bGUuY29t
cHV0ZWRMb2NhbGUoKSwgVGV4dFV0aWw6OmxpbmVCcmVha0l0ZXJhdG9yTW9kZShzdHlsZS5saW5l
QnJlYWsoKSkgfTsKKyAgICB1bnNpZ25lZCBjdXJyZW50UG9zaXRpb24gPSAwOworCisgICAgYXV0
byBpbmxpbmVJdGVtV2lkdGggPSBbJl0oYXV0byBzdGFydFBvc2l0aW9uLCBhdXRvIGxlbmd0aCkg
LT4gT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geworICAgICAgICBpZiAoIWlubGluZVRleHRC
b3guY2FuVXNlU2ltcGxpZmllZENvbnRlbnRNZWFzdXJpbmcoKSkKKyAgICAgICAgICAgIHJldHVy
biB7IH07CisgICAgICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEJveCwgc3Rh
cnRQb3NpdGlvbiwgc3RhcnRQb3NpdGlvbiArIGxlbmd0aCwgeyB9KTsKKyAgICB9OworCisgICAg
d2hpbGUgKGN1cnJlbnRQb3NpdGlvbiA8IHRleHQubGVuZ3RoKCkpIHsKKyAgICAgICAgYXV0byBp
c1NlZ21lbnRCcmVha0NhbmRpZGF0ZSA9IFtdKGF1dG8gY2hhcmFjdGVyKSB7CisgICAgICAgICAg
ICByZXR1cm4gY2hhcmFjdGVyID09ICdcbic7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gU2Vn
bWVudCBicmVha3Mgd2l0aCBwcmVzZXJ2ZSBuZXcgbGluZSBzdHlsZSAod2hpdGUtc3BhY2U6IHBy
ZSwgcHJlLXdyYXAsIGJyZWFrLXNwYWNlcyBhbmQgcHJlLWxpbmUpIGNvbXB1dGUgdG8gZm9yY2Vk
IGxpbmUgYnJlYWsuCisgICAgICAgIGlmIChpc1NlZ21lbnRCcmVha0NhbmRpZGF0ZSh0ZXh0W2N1
cnJlbnRQb3NpdGlvbl0pICYmIHNob3VsZFByZXNlcnZlTmV3bGluZSkgeworICAgICAgICAgICAg
aW5saW5lQ29udGVudC5hcHBlbmQoSW5saW5lU29mdExpbmVCcmVha0l0ZW06OmNyZWF0ZVNvZnRM
aW5lQnJlYWtJdGVtKGlubGluZVRleHRCb3gsIGN1cnJlbnRQb3NpdGlvbikpOworICAgICAgICAg
ICAgKytjdXJyZW50UG9zaXRpb247CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQor
CisgICAgICAgIGlmIChhdXRvIHdoaXRlc3BhY2VDb250ZW50ID0gbW92ZVRvTmV4dE5vbldoaXRl
c3BhY2VQb3NpdGlvbih0ZXh0LCBjdXJyZW50UG9zaXRpb24sIHNob3VsZFByZXNlcnZlTmV3bGlu
ZSwgIXdoaXRlc3BhY2VDb250ZW50SXNUcmVhdGVkQXNTaW5nbGVTcGFjZSkpIHsKKyAgICAgICAg
ICAgIEFTU0VSVCh3aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGF1dG8g
YXBwZW5kV2hpdGVzcGFjZUl0ZW0gPSBbJl0gKGF1dG8gc3RhcnRQb3NpdGlvbiwgYXV0byBpdGVt
TGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXV0byBzaW1wbGVTaW5nbGVXaGl0ZXNwYWNlQ29u
dGVudCA9IGlubGluZVRleHRCb3guY2FuVXNlU2ltcGxpZmllZENvbnRlbnRNZWFzdXJpbmcoKSAm
JiAoaXRlbUxlbmd0aCA9PSAxIHx8IHdoaXRlc3BhY2VDb250ZW50SXNUcmVhdGVkQXNTaW5nbGVT
cGFjZSk7CisgICAgICAgICAgICAgICAgYXV0byB3aWR0aCA9IHNpbXBsZVNpbmdsZVdoaXRlc3Bh
Y2VDb250ZW50ID8gbWFrZU9wdGlvbmFsKElubGluZUxheW91dFVuaXQgeyBmb250LnNwYWNlV2lk
dGgoKSB9KSA6IGlubGluZUl0ZW1XaWR0aChzdGFydFBvc2l0aW9uLCBpdGVtTGVuZ3RoKTsKKyAg
ICAgICAgICAgICAgICBpbmxpbmVDb250ZW50LmFwcGVuZChJbmxpbmVUZXh0SXRlbTo6Y3JlYXRl
V2hpdGVzcGFjZUl0ZW0oaW5saW5lVGV4dEJveCwgc3RhcnRQb3NpdGlvbiwgaXRlbUxlbmd0aCwg
d2hpdGVzcGFjZUNvbnRlbnQtPmlzV29yZFNlcGFyYXRvciwgd2lkdGgpKTsKKyAgICAgICAgICAg
IH07CisgICAgICAgICAgICBpZiAoc3R5bGUud2hpdGVTcGFjZSgpID09IFdoaXRlU3BhY2U6OkJy
ZWFrU3BhY2VzKSB7CisgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nz
cy10ZXh0LTMvI3doaXRlLXNwYWNlLXBoYXNlLTEKKyAgICAgICAgICAgICAgICAvLyBGb3IgYnJl
YWstc3BhY2VzLCBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBleGlzdHMgYWZ0ZXIgZXZlcnkgc3Bh
Y2UgYW5kIGV2ZXJ5IHRhYi4KKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogaWYgdGhpcyB0dXJu
cyBvdXQgdG8gYmUgYSBwZXJmIGhpdCB3aXRoIHRvbyBtYW55IGluZGl2aWR1YWwgd2hpdGVzcGFj
ZSBpbmxpbmUgaXRlbXMsIHdlIHNob3VsZCB0cmFuc2l0aW9uIHRoaXMgbG9naWMgdG8gbGluZSBi
cmVha2luZy4KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdoaXRlc3Bh
Y2VDb250ZW50LT5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kV2hpdGVz
cGFjZUl0ZW0oY3VycmVudFBvc2l0aW9uICsgaSwgMSk7CisgICAgICAgICAgICB9IGVsc2UKKyAg
ICAgICAgICAgICAgICBhcHBlbmRXaGl0ZXNwYWNlSXRlbShjdXJyZW50UG9zaXRpb24sIHdoaXRl
c3BhY2VDb250ZW50LT5sZW5ndGgpOworICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uICs9IHdo
aXRlc3BhY2VDb250ZW50LT5sZW5ndGg7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
fQorCisgICAgICAgIGF1dG8gaGFzVHJhaWxpbmdTb2Z0SHlwaGVuID0gZmFsc2U7CisgICAgICAg
IGF1dG8gaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjsKKyAg
ICAgICAgYXV0byBpc0F0U29mdEh5cGhlbiA9IFsmXShhdXRvIHBvc2l0aW9uKSB7CisgICAgICAg
ICAgICByZXR1cm4gdGV4dFtwb3NpdGlvbl0gPT0gc29mdEh5cGhlbjsKKyAgICAgICAgfTsKKyAg
ICAgICAgaWYgKHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpOb25lKSB7CisgICAgICAgICAg
ICAvLyBMZXQncyBtZXJnZSBjYW5kaWRhdGUgSW5saW5lVGV4dEl0ZW1zIHNlcGFyYXRlZCBieSBz
b2Z0IGh5cGhlbiB3aGVuIHRoZSBzdHlsZSBzYXlzIHNvLgorICAgICAgICAgICAgd2hpbGUgKGN1
cnJlbnRQb3NpdGlvbiA8IHRleHQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIG5v
bldoaXRlU3BhY2VMZW5ndGggPSBtb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24oY3VycmVudFBv
c2l0aW9uLCBsaW5lQnJlYWtJdGVyYXRvciwgc3R5bGUpOworICAgICAgICAgICAgICAgIEFTU0VS
VChub25XaGl0ZVNwYWNlTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24g
Kz0gbm9uV2hpdGVTcGFjZUxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQXRTb2Z0SHlw
aGVuKGN1cnJlbnRQb3NpdGlvbiAtIDEpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF1dG8gbm9uV2hpdGVT
cGFjZUxlbmd0aCA9IG1vdmVUb05leHRCcmVha2FibGVQb3NpdGlvbihpbml0aWFsTm9uV2hpdGVz
cGFjZVBvc2l0aW9uLCBsaW5lQnJlYWtJdGVyYXRvciwgc3R5bGUpOworICAgICAgICAgICAgQVNT
RVJUKG5vbldoaXRlU3BhY2VMZW5ndGgpOworICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uICs9
IG5vbldoaXRlU3BhY2VMZW5ndGg7CisgICAgICAgICAgICBoYXNUcmFpbGluZ1NvZnRIeXBoZW4g
PSBpc0F0U29mdEh5cGhlbihjdXJyZW50UG9zaXRpb24gLSAxKTsKKyAgICAgICAgfQorICAgICAg
ICBBU1NFUlQoaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiA8IGN1cnJlbnRQb3NpdGlvbik7
CisgICAgICAgIEFTU0VSVF9JTVBMSUVTKHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpOb25l
LCAhaGFzVHJhaWxpbmdTb2Z0SHlwaGVuKTsKKyAgICAgICAgYXV0byBsZW5ndGggPSBjdXJyZW50
UG9zaXRpb24gLSBpbml0aWFsTm9uV2hpdGVzcGFjZVBvc2l0aW9uOworICAgICAgICBpbmxpbmVD
b250ZW50LmFwcGVuZChJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlTm9uV2hpdGVzcGFjZUl0ZW0oaW5s
aW5lVGV4dEJveCwgaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiwgbGVuZ3RoLCBoYXNUcmFp
bGluZ1NvZnRIeXBoZW4sIGlubGluZUl0ZW1XaWR0aChpbml0aWFsTm9uV2hpdGVzcGFjZVBvc2l0
aW9uLCBsZW5ndGgpKSk7CisgICAgfQorfQorCitib29sIElubGluZVRleHRJdGVtOjppc0VtcHR5
Q29udGVudCgpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBjaGVjayBmb3IgbW9y
ZSB6ZXJvIHdpZHRoIGNvbnRlbnQgYW5kIG5vdCBqdXN0IFUrMjAwQi4KKyAgICByZXR1cm4gIW1f
bGVuZ3RoIHx8IChtX2xlbmd0aCA9PSAxICYmIGlubGluZVRleHRCb3goKS5jb250ZW50KClbc3Rh
cnQoKV0gPT0gemVyb1dpZHRoU3BhY2UpOyAKK30KKworYm9vbCBJbmxpbmVUZXh0SXRlbTo6c2hv
dWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0
SXRlbSkKK3sKKyAgICBBU1NFUlQoaW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpOworICAg
IHJldHVybiBUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJ
dGVtLmxheW91dEJveCgpKTsKK30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5l
VGV4dEl0ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5s
aW5lZm9ybWF0dGluZy9JbmxpbmVUZXh0SXRlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjUyZGM5OGRjZjA2YTE5
YWEwNWZjNGFhMGFhMjRkOTgzYTViN2NkMTUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4
dEl0ZW0uaApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMK
KyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAq
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICog
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisj
aWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVJ
dGVtLmgiCisjaW5jbHVkZSAiTGF5b3V0SW5saW5lVGV4dEJveC5oIgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKwordXNpbmcgSW5saW5lSXRlbXMgPSBWZWN0b3I8
SW5saW5lSXRlbT47CisKK2NsYXNzIElubGluZVRleHRJdGVtIDogcHVibGljIElubGluZUl0ZW0g
eworcHVibGljOgorICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUFuZEFwcGVuZFRleHRJdGVtcyhJbmxp
bmVJdGVtcyYsIGNvbnN0IElubGluZVRleHRCb3gmKTsKKworICAgIHVuc2lnbmVkIHN0YXJ0KCkg
Y29uc3QgeyByZXR1cm4gbV9zdGFydE9yUG9zaXRpb247IH0KKyAgICB1bnNpZ25lZCBlbmQoKSBj
b25zdCB7IHJldHVybiBzdGFydCgpICsgbGVuZ3RoKCk7IH0KKyAgICB1bnNpZ25lZCBsZW5ndGgo
KSBjb25zdCB7IHJldHVybiBtX2xlbmd0aDsgfQorCisgICAgYm9vbCBpc1doaXRlc3BhY2UoKSBj
b25zdCB7IHJldHVybiBtX3RleHRJdGVtVHlwZSA9PSBUZXh0SXRlbVR5cGU6OldoaXRlc3BhY2U7
IH0KKyAgICBib29sIGlzV29yZFNlcGFyYXRvcigpIGNvbnN0IHsgcmV0dXJuIG1faXNXb3JkU2Vw
YXJhdG9yOyB9CisgICAgYm9vbCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4oKSBjb25zdCB7IHJldHVy
biBtX2hhc1RyYWlsaW5nU29mdEh5cGhlbjsgfQorICAgIE9wdGlvbmFsPElubGluZUxheW91dFVu
aXQ+IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9oYXNXaWR0aCA/IG1ha2VPcHRpb25hbChtX3dp
ZHRoKSA6IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsgfQorICAgIGJvb2wgaXNFbXB0
eUNvbnRlbnQoKSBjb25zdDsKKworICAgIGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRC
b3goKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxJbmxpbmVUZXh0Qm94PihsYXlvdXRCb3goKSk7
IH0KKworICAgIElubGluZVRleHRJdGVtIGxlZnQodW5zaWduZWQgbGVuZ3RoKSBjb25zdDsKKyAg
ICBJbmxpbmVUZXh0SXRlbSByaWdodCh1bnNpZ25lZCBsZW5ndGgpIGNvbnN0OworCisgICAgc3Rh
dGljIGJvb2wgc2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGNvbnN0IElubGluZVRleHRJdGVt
Jik7CisKK3ByaXZhdGU6CisgICAgdXNpbmcgSW5saW5lSXRlbTo6VGV4dEl0ZW1UeXBlOworCisg
ICAgSW5saW5lVGV4dEl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHN0YXJ0LCB1
bnNpZ25lZCBsZW5ndGgsIGJvb2wgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBib29sIGlzV29yZFNl
cGFyYXRvciwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgsIFRleHRJdGVtVHlwZSk7
CisgICAgZXhwbGljaXQgSW5saW5lVGV4dEl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYpOworCisg
ICAgc3RhdGljIElubGluZVRleHRJdGVtIGNyZWF0ZVdoaXRlc3BhY2VJdGVtKGNvbnN0IElubGlu
ZVRleHRCb3gmLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGlzV29yZFNl
cGFyYXRvciwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgpOworICAgIHN0YXRpYyBJ
bmxpbmVUZXh0SXRlbSBjcmVhdGVOb25XaGl0ZXNwYWNlSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94
JiwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBoYXNUcmFpbGluZ1NvZnRI
eXBoZW4sIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRoKTsKKyAgICBzdGF0aWMgSW5s
aW5lVGV4dEl0ZW0gY3JlYXRlRW1wdHlJdGVtKGNvbnN0IElubGluZVRleHRCb3gmKTsKK307CisK
K2lubGluZSBJbmxpbmVUZXh0SXRlbSBJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlV2hpdGVzcGFjZUl0
ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgc3RhcnQsIHVu
c2lnbmVkIGxlbmd0aCwgYm9vbCBpc1dvcmRTZXBhcmF0b3IsIE9wdGlvbmFsPElubGluZUxheW91
dFVuaXQ+IHdpZHRoKQoreworICAgIHJldHVybiB7IGlubGluZVRleHRCb3gsIHN0YXJ0LCBsZW5n
dGgsIGZhbHNlLCBpc1dvcmRTZXBhcmF0b3IsIHdpZHRoLCBUZXh0SXRlbVR5cGU6OldoaXRlc3Bh
Y2UgfTsKK30KKworaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpjcmVhdGVO
b25XaGl0ZXNwYWNlSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNp
Z25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGhhc1RyYWlsaW5nU29mdEh5cGhlbiwg
T3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgpCit7CisgICAgLy8gRklYTUU6IFVzZSB0
aGUgZm9sbG93aW5nIGxpc3Qgb2Ygbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBzZXQgdGhl
ICJpc1dvcmRTZXBhcmF0b3IiIGJpdDogbm9CcmVha1NwYWNlLCBldGhpb3BpY1dvcmRzcGFjZSwg
YWVnZWFuV29yZFNlcGFyYXRvckxpbmUgYWVnZWFuV29yZFNlcGFyYXRvckRvdCB1Z2FyaXRpY1dv
cmREaXZpZGVyLgorICAgIHJldHVybiB7IGlubGluZVRleHRCb3gsIHN0YXJ0LCBsZW5ndGgsIGhh
c1RyYWlsaW5nU29mdEh5cGhlbiwgZmFsc2UsIHdpZHRoLCBUZXh0SXRlbVR5cGU6Ok5vbldoaXRl
c3BhY2UgfTsKK30KKworaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpjcmVh
dGVFbXB0eUl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCkKK3sKKyAgICBy
ZXR1cm4gSW5saW5lVGV4dEl0ZW0geyBpbmxpbmVUZXh0Qm94IH07Cit9CisKK2lubGluZSBJbmxp
bmVUZXh0SXRlbTo6SW5saW5lVGV4dEl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4
dEJveCwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBoYXNUcmFpbGluZ1Nv
ZnRIeXBoZW4sIGJvb2wgaXNXb3JkU2VwYXJhdG9yLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0
PiB3aWR0aCwgVGV4dEl0ZW1UeXBlIHRleHRJdGVtVHlwZSkKKyAgICA6IElubGluZUl0ZW0oaW5s
aW5lVGV4dEJveCwgVHlwZTo6VGV4dCkKK3sKKyAgICBtX3N0YXJ0T3JQb3NpdGlvbiA9IHN0YXJ0
OworICAgIG1fbGVuZ3RoID0gbGVuZ3RoOworICAgIG1faGFzV2lkdGggPSAhIXdpZHRoOworICAg
IG1faGFzVHJhaWxpbmdTb2Z0SHlwaGVuID0gaGFzVHJhaWxpbmdTb2Z0SHlwaGVuOworICAgIG1f
aXNXb3JkU2VwYXJhdG9yID0gaXNXb3JkU2VwYXJhdG9yOworICAgIG1fd2lkdGggPSB3aWR0aC52
YWx1ZU9yKDApOworICAgIG1fdGV4dEl0ZW1UeXBlID0gdGV4dEl0ZW1UeXBlOworfQorCitpbmxp
bmUgSW5saW5lVGV4dEl0ZW06OklubGluZVRleHRJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlu
bGluZVRleHRCb3gpCisgICAgOiBJbmxpbmVJdGVtKGlubGluZVRleHRCb3gsIFR5cGU6OlRleHQp
Cit7Cit9CisKK2lubGluZSBJbmxpbmVUZXh0SXRlbSBJbmxpbmVUZXh0SXRlbTo6bGVmdCh1bnNp
Z25lZCBsZW5ndGgpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlQobGVuZ3RoIDw9IHRoaXMt
Pmxlbmd0aCgpKTsKKyAgICBBU1NFUlQobV90ZXh0SXRlbVR5cGUgIT0gVGV4dEl0ZW1UeXBlOjpV
bmRlZmluZWQpOworICAgIEFTU0VSVChsZW5ndGgpOworICAgIHJldHVybiB7IGlubGluZVRleHRC
b3goKSwgc3RhcnQoKSwgbGVuZ3RoLCBmYWxzZSwgaXNXb3JkU2VwYXJhdG9yKCksIFdURjo6bnVs
bG9wdCwgbV90ZXh0SXRlbVR5cGUgfTsKK30KKworaW5saW5lIElubGluZVRleHRJdGVtIElubGlu
ZVRleHRJdGVtOjpyaWdodCh1bnNpZ25lZCBsZW5ndGgpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9B
U1NFUlQobGVuZ3RoIDw9IHRoaXMtPmxlbmd0aCgpKTsKKyAgICBBU1NFUlQobV90ZXh0SXRlbVR5
cGUgIT0gVGV4dEl0ZW1UeXBlOjpVbmRlZmluZWQpOworICAgIEFTU0VSVChsZW5ndGgpOworICAg
IHJldHVybiB7IGlubGluZVRleHRCb3goKSwgZW5kKCkgLSBsZW5ndGgsIGxlbmd0aCwgaGFzVHJh
aWxpbmdTb2Z0SHlwaGVuKCksIGlzV29yZFNlcGFyYXRvcigpLCBXVEY6Om51bGxvcHQsIG1fdGV4
dEl0ZW1UeXBlIH07Cit9CisKK30KK30KKworU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19JTkxJTkVf
SVRFTShJbmxpbmVUZXh0SXRlbSwgaXNUZXh0KCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL3Rl
eHQvVGV4dFV0aWwuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjdlNTc1YmNl
NzI4NTNhOGM5ZGJmMzYyZjRmYzliMTk5NzZhYjI1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvdGV4
dC9UZXh0VXRpbC5jcHAKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiVGV4dFV0aWwuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9S
TUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQnJlYWtMaW5lcy5oIgorI2luY2x1ZGUgIkZv
bnRDYXNjYWRlLmgiCisjaW5jbHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIKKyNpbmNsdWRlICJMYXlv
dXRJbmxpbmVUZXh0Qm94LmgiCisjaW5jbHVkZSAiUmVuZGVyQm94LmgiCisjaW5jbHVkZSAiUmVu
ZGVyU3R5bGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisK
K0lubGluZUxheW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiBp
bmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpCit7Cisg
ICAgcmV0dXJuIFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4dEl0ZW0u
c3RhcnQoKSwgaW5saW5lVGV4dEl0ZW0uZW5kKCksIGNvbnRlbnRMb2dpY2FsTGVmdCk7Cit9CisK
K0lubGluZUxheW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiBp
bmxpbmVUZXh0SXRlbSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91dFVu
aXQgY29udGVudExvZ2ljYWxMZWZ0KQoreworICAgIFJFTEVBU0VfQVNTRVJUKGZyb20gPj0gaW5s
aW5lVGV4dEl0ZW0uc3RhcnQoKSk7CisgICAgUkVMRUFTRV9BU1NFUlQodG8gPD0gaW5saW5lVGV4
dEl0ZW0uZW5kKCkpOworICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAh
SW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRl
bSkpIHsKKyAgICAgICAgYXV0byBzcGFjZVdpZHRoID0gaW5saW5lVGV4dEl0ZW0uc3R5bGUoKS5m
b250Q2FzY2FkZSgpLnNwYWNlV2lkdGgoKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6aXNuYW4oc3Bh
Y2VXaWR0aCkgPyAwLjBmIDogc3RkOjppc2luZihzcGFjZVdpZHRoKSA/IG1heElubGluZUxheW91
dFVuaXQoKSA6IHNwYWNlV2lkdGg7CisgICAgfQorICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgo
aW5saW5lVGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpLCBmcm9tLCB0bywgY29udGVudExvZ2ljYWxM
ZWZ0KTsKK30KKworSW5saW5lTGF5b3V0VW5pdCBUZXh0VXRpbDo6d2lkdGgoY29uc3QgSW5saW5l
VGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGlu
ZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KQoreworICAgIGlmIChmcm9tID09IHRvKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIGF1dG8mIHN0eWxlID0gaW5saW5lVGV4dEJveC5zdHls
ZSgpOworICAgIGF1dG8mIGZvbnQgPSBzdHlsZS5mb250Q2FzY2FkZSgpOworICAgIGF1dG8gdGV4
dCA9IGlubGluZVRleHRCb3guY29udGVudCgpOworICAgIEFTU0VSVCh0byA8PSB0ZXh0Lmxlbmd0
aCgpKTsKKyAgICBhdXRvIGhhc0tlcm5pbmdPckxpZ2F0dXJlcyA9IGZvbnQuZW5hYmxlS2Vybmlu
ZygpIHx8IGZvbnQucmVxdWlyZXNTaGFwaW5nKCk7CisgICAgYXV0byBtZWFzdXJlV2l0aEVuZFNw
YWNlID0gaGFzS2VybmluZ09yTGlnYXR1cmVzICYmIHRvIDwgdGV4dC5sZW5ndGgoKSAmJiB0ZXh0
W3RvXSA9PSAnICc7CisgICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2UpCisgICAgICAgICsrdG87
CisgICAgZmxvYXQgd2lkdGggPSAwOworICAgIGlmIChpbmxpbmVUZXh0Qm94LmNhblVzZVNpbXBs
aWZpZWRDb250ZW50TWVhc3VyaW5nKCkpCisgICAgICAgIHdpZHRoID0gZm9udC53aWR0aEZvclNp
bXBsZVRleHQoU3RyaW5nVmlldyh0ZXh0KS5zdWJzdHJpbmcoZnJvbSwgdG8gLSBmcm9tKSk7Cisg
ICAgZWxzZSB7CisgICAgICAgIGF1dG8gdGFiV2lkdGggPSBzdHlsZS5jb2xsYXBzZVdoaXRlU3Bh
Y2UoKSA/IFRhYlNpemUoMCkgOiBzdHlsZS50YWJTaXplKCk7CisgICAgICAgIFdlYkNvcmU6OlRl
eHRSdW4gcnVuKFN0cmluZ1ZpZXcodGV4dCkuc3Vic3RyaW5nKGZyb20sIHRvIC0gZnJvbSksIGNv
bnRlbnRMb2dpY2FsTGVmdCk7CisgICAgICAgIGlmICh0YWJXaWR0aCkKKyAgICAgICAgICAgIHJ1
bi5zZXRUYWJTaXplKHRydWUsIHRhYldpZHRoKTsKKyAgICAgICAgd2lkdGggPSBmb250LndpZHRo
KHJ1bik7CisgICAgfQorCisgICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2UpCisgICAgICAgIHdp
ZHRoIC09IChmb250LnNwYWNlV2lkdGgoKSArIGZvbnQud29yZFNwYWNpbmcoKSk7CisKKyAgICBy
ZXR1cm4gc3RkOjppc25hbih3aWR0aCkgPyAwLjBmIDogc3RkOjppc2luZih3aWR0aCkgPyBtYXhJ
bmxpbmVMYXlvdXRVbml0KCkgOiB3aWR0aDsKK30KKworVGV4dFV0aWw6OlNwbGl0RGF0YSBUZXh0
VXRpbDo6c3BsaXQoY29uc3QgSW5saW5lVGV4dEl0ZW0mIGlubGluZVRleHRJdGVtLCBJbmxpbmVM
YXlvdXRVbml0IHRleHRXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCwgSW5s
aW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpCit7CisgICAgQVNTRVJUKGF2YWlsYWJs
ZVdpZHRoID49IDApOworICAgIGF1dG8gc3RhcnRQb3NpdGlvbiA9IGlubGluZVRleHRJdGVtLnN0
YXJ0KCk7CisgICAgYXV0byBsZW5ndGggPSBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKTsKKyAgICBB
U1NFUlQobGVuZ3RoKTsKKworICAgIGF1dG8gbGVmdCA9IHN0YXJ0UG9zaXRpb247CisgICAgLy8g
UGF0aG9sb2dpY2FsIGNhc2Ugb2YgKGV4dHJlbWVseSlsb25nIHN0cmluZyBhbmQgbmFycm93IGxp
bmVzLgorICAgIC8vIEFkanVzdCB0aGUgcmFuZ2Ugc28gdGhhdCB3ZSBjYW4gcGljayBhIHJlYXNv
bmFibGUgbWlkcG9pbnQuCisgICAgSW5saW5lTGF5b3V0VW5pdCBhdmVyYWdlQ2hhcmFjdGVyV2lk
dGggPSB0ZXh0V2lkdGggLyBsZW5ndGg7CisgICAgdW5zaWduZWQgb2Zmc2V0ID0gdG9MYXlvdXRV
bml0KDIgKiBhdmFpbGFibGVXaWR0aCAvIGF2ZXJhZ2VDaGFyYWN0ZXJXaWR0aCkudG9VbnNpZ25l
ZCgpOworICAgIGF1dG8gcmlnaHQgPSBzdGQ6Om1pbjx1bnNpZ25lZD4obGVmdCArIG9mZnNldCwg
KHN0YXJ0UG9zaXRpb24gKyBsZW5ndGggLSAxKSk7CisgICAgLy8gUHJlc2VydmUgdGhlIGxlZnQg
d2lkdGggZm9yIHRoZSBmaW5hbCBzcGxpdCBwb3NpdGlvbiBzbyB0aGF0IHdlIGRvbid0IG5lZWQg
dG8gcmVtZWFzdXJlIHRoZSBsZWZ0IHNpZGUgYWdhaW4uCisgICAgSW5saW5lTGF5b3V0VW5pdCBs
ZWZ0U2lkZVdpZHRoID0gMDsKKyAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7CisgICAgICAgIGF1
dG8gbWlkZGxlID0gKGxlZnQgKyByaWdodCkgLyAyOworICAgICAgICBhdXRvIHdpZHRoID0gVGV4
dFV0aWw6OndpZHRoKGlubGluZVRleHRJdGVtLCBzdGFydFBvc2l0aW9uLCBtaWRkbGUgKyAxLCBj
b250ZW50TG9naWNhbExlZnQpOworICAgICAgICBpZiAod2lkdGggPCBhdmFpbGFibGVXaWR0aCkg
eworICAgICAgICAgICAgbGVmdCA9IG1pZGRsZSArIDE7CisgICAgICAgICAgICBsZWZ0U2lkZVdp
ZHRoID0gd2lkdGg7CisgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPiBhdmFpbGFibGVXaWR0aCkK
KyAgICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
IHJpZ2h0ID0gbWlkZGxlICsgMTsKKyAgICAgICAgICAgIGxlZnRTaWRlV2lkdGggPSB3aWR0aDsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB7IHN0YXJ0
UG9zaXRpb24sIHJpZ2h0IC0gc3RhcnRQb3NpdGlvbiwgbGVmdFNpZGVXaWR0aCB9OworfQorCit1
bnNpZ25lZCBUZXh0VXRpbDo6ZmluZE5leHRCcmVha2FibGVQb3NpdGlvbihMYXp5TGluZUJyZWFr
SXRlcmF0b3ImIGxpbmVCcmVha0l0ZXJhdG9yLCB1bnNpZ25lZCBzdGFydFBvc2l0aW9uLCBjb25z
dCBSZW5kZXJTdHlsZSYgc3R5bGUpCit7CisgICAgYXV0byBrZWVwQWxsV29yZHNGb3JDSksgPSBz
dHlsZS53b3JkQnJlYWsoKSA9PSBXb3JkQnJlYWs6OktlZXBBbGw7CisgICAgYXV0byBicmVha05C
U1AgPSBzdHlsZS5hdXRvV3JhcCgpICYmIHN0eWxlLm5ic3BNb2RlKCkgPT0gTkJTUE1vZGU6OlNw
YWNlOworCisgICAgaWYgKGtlZXBBbGxXb3Jkc0ZvckNKSykgeworICAgICAgICBpZiAoYnJlYWtO
QlNQKQorICAgICAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbktlZXBpbmdBbGxX
b3JkcyhsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7CisgICAgICAgIHJldHVybiBu
ZXh0QnJlYWthYmxlUG9zaXRpb25LZWVwaW5nQWxsV29yZHNJZ25vcmluZ05CU1AobGluZUJyZWFr
SXRlcmF0b3IsIHN0YXJ0UG9zaXRpb24pOworICAgIH0KKworICAgIGlmIChsaW5lQnJlYWtJdGVy
YXRvci5tb2RlKCkgPT0gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpEZWZhdWx0KSB7CisgICAgICAg
IGlmIChicmVha05CU1ApCisgICAgICAgICAgICByZXR1cm4gV2ViQ29yZTo6bmV4dEJyZWFrYWJs
ZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9uKTsKKyAgICAgICAgcmV0
dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbklnbm9yaW5nTkJTUChsaW5lQnJlYWtJdGVyYXRvciwg
c3RhcnRQb3NpdGlvbik7CisgICAgfQorCisgICAgaWYgKGJyZWFrTkJTUCkKKyAgICAgICAgcmV0
dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbldpdGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJdGVyYXRv
ciwgc3RhcnRQb3NpdGlvbik7CisgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbklnbm9y
aW5nTkJTUFdpdGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7
Cit9CisKK2Jvb2wgVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhjb25zdCBC
b3gmIGxheW91dEJveCkKK3sKKyAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXRleHQt
My8jd2hpdGUtc3BhY2UtcHJvcGVydHkKKyAgICBhdXRvIHdoaXRlc3BhY2UgPSBsYXlvdXRCb3gu
c3R5bGUoKS53aGl0ZVNwYWNlKCk7CisgICAgcmV0dXJuIHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFj
ZTo6UHJlIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlV3JhcCB8fCB3aGl0ZXNwYWNl
ID09IFdoaXRlU3BhY2U6OkJyZWFrU3BhY2VzOworfQorCitib29sIFRleHRVdGlsOjpzaG91bGRQ
cmVzZXJ2ZU5ld2xpbmUoY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgYXV0byB3aGl0ZXNw
YWNlID0gbGF5b3V0Qm94LnN0eWxlKCkud2hpdGVTcGFjZSgpOworICAgIC8vIGh0dHBzOi8vd3d3
LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eQorICAgIHJldHVybiB3
aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZSB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6
OlByZVdyYXAgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpCcmVha1NwYWNlcyB8fCB3aGl0
ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZUxpbmU7IAorfQorCitMaW5lQnJlYWtJdGVyYXRvck1v
ZGUgVGV4dFV0aWw6OmxpbmVCcmVha0l0ZXJhdG9yTW9kZShMaW5lQnJlYWsgbGluZUJyZWFrKQor
eworICAgIHN3aXRjaCAobGluZUJyZWFrKSB7CisgICAgY2FzZSBMaW5lQnJlYWs6OkF1dG86Cisg
ICAgY2FzZSBMaW5lQnJlYWs6OkFmdGVyV2hpdGVTcGFjZToKKyAgICBjYXNlIExpbmVCcmVhazo6
QW55d2hlcmU6CisgICAgICAgIHJldHVybiBMaW5lQnJlYWtJdGVyYXRvck1vZGU6OkRlZmF1bHQ7
CisgICAgY2FzZSBMaW5lQnJlYWs6Okxvb3NlOgorICAgICAgICByZXR1cm4gTGluZUJyZWFrSXRl
cmF0b3JNb2RlOjpMb29zZTsKKyAgICBjYXNlIExpbmVCcmVhazo6Tm9ybWFsOgorICAgICAgICBy
ZXR1cm4gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpOb3JtYWw7CisgICAgY2FzZSBMaW5lQnJlYWs6
OlN0cmljdDoKKyAgICAgICAgcmV0dXJuIExpbmVCcmVha0l0ZXJhdG9yTW9kZTo6U3RyaWN0Owor
ICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gTGluZUJyZWFrSXRl
cmF0b3JNb2RlOjpEZWZhdWx0OworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy90ZXh0
L1RleHRVdGlsLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lu
bGluZWZvcm1hdHRpbmcvdGV4dC9UZXh0VXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFmNTg0ZmE3OTgxYmQ0
MzgzY2Y0M2UyM2E0YmZhZWI4MjBjZTMyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvdGV4dC9UZXh0
VXRpbC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
KyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisg
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lm
IEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiSW5saW5lSXRl
bS5oIgorI2luY2x1ZGUgIkxheW91dFVuaXRzLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvVGV4dEJy
ZWFrSXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSZW5kZXJTdHls
ZTsKKworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIElubGluZVRleHRCb3g7CitjbGFzcyBJ
bmxpbmVUZXh0SXRlbTsKKworY2xhc3MgVGV4dFV0aWwgeworcHVibGljOgorICAgIHN0YXRpYyBJ
bmxpbmVMYXlvdXRVbml0IHdpZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0
VW5pdCBjb250ZW50TG9naWNhbExlZnQpOworICAgIHN0YXRpYyBJbmxpbmVMYXlvdXRVbml0IHdp
ZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElu
bGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KTsKKyAgICBzdGF0aWMgSW5saW5lTGF5
b3V0VW5pdCB3aWR0aChjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWduZWQgZnJvbSwgdW5zaWdu
ZWQgdG8sIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KTsKKworICAgIHN0cnVj
dCBTcGxpdERhdGEgeworICAgICAgICB1bnNpZ25lZCBzdGFydCB7IDAgfTsKKyAgICAgICAgdW5z
aWduZWQgbGVuZ3RoIHsgMCB9OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0
aCB7IDAgfTsKKyAgICB9OworICAgIHN0YXRpYyBTcGxpdERhdGEgc3BsaXQoY29uc3QgSW5saW5l
VGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IHRleHRXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBh
dmFpbGFibGVXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpOworCisg
ICAgc3RhdGljIHVuc2lnbmVkIGZpbmROZXh0QnJlYWthYmxlUG9zaXRpb24oTGF6eUxpbmVCcmVh
a0l0ZXJhdG9yJiwgdW5zaWduZWQgc3RhcnRQb3NpdGlvbiwgY29uc3QgUmVuZGVyU3R5bGUmKTsK
KyAgICBzdGF0aWMgTGluZUJyZWFrSXRlcmF0b3JNb2RlIGxpbmVCcmVha0l0ZXJhdG9yTW9kZShM
aW5lQnJlYWspOworCisgICAgc3RhdGljIGJvb2wgc2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJz
KGNvbnN0IEJveCYpOworICAgIHN0YXRpYyBib29sIHNob3VsZFByZXNlcnZlTmV3bGluZShjb25z
dCBCb3gmKTsKK307CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5n
Q29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3Rh
YmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45MDJh
ZjdjNWVkODhkNTA0Y2FjNDI1YTEzNTIxMDA4YjZlNThiOWFjCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcv
VGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAKQEAgLTAsMCArMSw1MjAgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAq
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5o
IgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJC
bG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIKKyNpbmNs
dWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbnZhbGlkYXRpb25TdGF0
ZS5oIgorI2luY2x1ZGUgIkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5
LmgiCisjaW5jbHVkZSAiTGF5b3V0Q2hpbGRJdGVyYXRvci5oIgorI2luY2x1ZGUgIkxheW91dENv
bnRleHQuaCIKKyNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5j
bHVkZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5s
aW5lcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworV1RG
X01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKFRhYmxlRm9ybWF0dGluZ0NvbnRleHQpOworCisvLyBo
dHRwczovL3d3dy53My5vcmcvVFIvY3NzLXRhYmxlcy0zLyN0YWJsZS1sYXlvdXQtYWxnb3JpdGht
CitUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENv
bnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBUYWJsZUZvcm1hdHRpbmdTdGF0ZSYg
Zm9ybWF0dGluZ1N0YXRlKQorICAgIDogRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRl
eHRSb290LCBmb3JtYXR0aW5nU3RhdGUpCit7Cit9CisKK3ZvaWQgVGFibGVGb3JtYXR0aW5nQ29u
dGV4dDo6bGF5b3V0SW5GbG93Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0
cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgYXV0byBhdmFpbGFi
bGVIb3Jpem9udGFsU3BhY2UgPSBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxXaWR0aDsK
KyAgICBhdXRvIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UgPSBjb25zdHJhaW50cy52ZXJ0aWNhbC5s
b2dpY2FsSGVpZ2h0OworICAgIC8vIDEuIENvbXB1dGUgd2lkdGggYW5kIGhlaWdodCBmb3IgdGhl
IGdyaWQuCisgICAgY29tcHV0ZUFuZERpc3RyaWJ1dGVFeHRyYVNwYWNlKGF2YWlsYWJsZUhvcml6
b250YWxTcGFjZSwgYXZhaWxhYmxlVmVydGljYWxTcGFjZSk7CisgICAgLy8gMi4gRmluYWxpemUg
Y2VsbHMuCisgICAgc2V0VXNlZEdlb21ldHJ5Rm9yQ2VsbHMoYXZhaWxhYmxlSG9yaXpvbnRhbFNw
YWNlKTsKKyAgICAvLyAzLiBGaW5hbGl6ZSByb3dzLgorICAgIHNldFVzZWRHZW9tZXRyeUZvclJv
d3MoYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKKyAgICAvLyA0LiBGaW5hbGl6ZSBzZWN0aW9u
cy4KKyAgICBzZXRVc2VkR2VvbWV0cnlGb3JTZWN0aW9ucyhjb25zdHJhaW50cyk7Cit9CisKK0xh
eW91dFVuaXQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25z
dAoreworICAgIC8vIFRhYmxlIGhhcyB0byBoYXZlIHNvbWUgc2VjdGlvbiBjb250ZW50LCBhdCBs
ZWFzdCBvbmUgPHRib2R5Pi4KKyAgICBhdXRvIHRvcCA9IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hS
ZWN0KGdlb21ldHJ5Rm9yQm94KCpyb290KCkuZmlyc3RJbkZsb3dDaGlsZCgpKSkudG9wKCk7Cisg
ICAgYXV0byBib3R0b20gPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9tZXRyeUZvckJv
eCgqcm9vdCgpLmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7CisgICAgcmV0dXJuIGJvdHRv
bSAtIHRvcDsKK30KKwordm9pZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpzZXRVc2VkR2VvbWV0
cnlGb3JDZWxscyhMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSkKK3sKKyAgICBh
dXRvJiBncmlkID0gZm9ybWF0dGluZ1N0YXRlKCkudGFibGVHcmlkKCk7CisgICAgYXV0byYgY29s
dW1uTGlzdCA9IGdyaWQuY29sdW1ucygpLmxpc3QoKTsKKyAgICBhdXRvJiByb3dMaXN0ID0gZ3Jp
ZC5yb3dzKCkubGlzdCgpOworICAgIC8vIEZpbmFsIHRhYmxlIGNlbGwgbGF5b3V0LiBBdCB0aGlz
IHBvaW50IGFsbCBwZXJjZW50YWdlIHZhbHVlcyBjYW4gYmUgcmVzb2x2ZWQuCisgICAgYXV0byBz
ZWN0aW9uT2Zmc2V0ID0gTGF5b3V0VW5pdCB7IH07CisgICAgYXV0byogY3VycmVudFNlY3Rpb24g
PSAmcm93TGlzdC5maXJzdCgpLmJveCgpLnBhcmVudCgpOworICAgIGZvciAoYXV0byYgY2VsbCA6
IGdyaWQuY2VsbHMoKSkgeworICAgICAgICBhdXRvJiBjZWxsQm94ID0gY2VsbC0+Ym94KCk7Cisg
ICAgICAgIGF1dG8mIGNlbGxCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21l
dHJ5KGNlbGxCb3gpOworICAgICAgICBhdXRvJiBzZWN0aW9uID0gcm93TGlzdFtjZWxsLT5zdGFy
dFJvdygpXS5ib3goKS5wYXJlbnQoKTsKKyAgICAgICAgaWYgKCZzZWN0aW9uICE9IGN1cnJlbnRT
ZWN0aW9uKSB7CisgICAgICAgICAgICBjdXJyZW50U2VjdGlvbiA9ICZzZWN0aW9uOworICAgICAg
ICAgICAgLy8gV2hpbGUgdGhlIGdyaWQgaXMgYSBjb250aW51b3VzIGZsb3cgb2Ygcm93cywgaW4g
dGhlIGRpc3BsYXkgdHJlZSB0aGV5IGFyZSByZWxhdGl2ZSB0byB0aGVpciBzZWN0aW9ucy4KKyAg
ICAgICAgICAgIHNlY3Rpb25PZmZzZXQgPSByb3dMaXN0W2NlbGwtPnN0YXJ0Um93KCldLmxvZ2lj
YWxUb3AoKTsKKyAgICAgICAgfQorICAgICAgICBjZWxsQm94R2VvbWV0cnkuc2V0TG9naWNhbFRv
cChyb3dMaXN0W2NlbGwtPnN0YXJ0Um93KCldLmxvZ2ljYWxUb3AoKSAtIHNlY3Rpb25PZmZzZXQp
OworICAgICAgICBjZWxsQm94R2VvbWV0cnkuc2V0TG9naWNhbExlZnQoY29sdW1uTGlzdFtjZWxs
LT5zdGFydENvbHVtbigpXS5sb2dpY2FsTGVmdCgpKTsKKyAgICAgICAgYXV0byBhdmFpbGFibGVW
ZXJ0aWNhbFNwYWNlID0gcm93TGlzdFtjZWxsLT5zdGFydFJvdygpXS5sb2dpY2FsSGVpZ2h0KCk7
CisgICAgICAgIGZvciAoc2l6ZV90IHJvd0luZGV4ID0gY2VsbC0+c3RhcnRSb3coKSArIDE7IHJv
d0luZGV4IDwgY2VsbC0+ZW5kUm93KCk7ICsrcm93SW5kZXgpCisgICAgICAgICAgICBhdmFpbGFi
bGVWZXJ0aWNhbFNwYWNlICs9IHJvd0xpc3Rbcm93SW5kZXhdLmxvZ2ljYWxIZWlnaHQoKTsKKyAg
ICAgICAgYXZhaWxhYmxlVmVydGljYWxTcGFjZSArPSAoY2VsbC0+cm93U3BhbigpIC0gMSkgKiBn
cmlkLnZlcnRpY2FsU3BhY2luZygpOworICAgICAgICBsYXlvdXRDZWxsKCpjZWxsLCBhdmFpbGFi
bGVIb3Jpem9udGFsU3BhY2UsIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpOworICAgICAgICAvLyBG
SVhNRTogRmluZCBvdXQgaWYgaXQgaXMgb2sgdG8gdXNlIHRoZSByZWd1bGFyIHBhZGRpbmcgaGVy
ZSB0byBhbGlnbiB0aGUgY29udGVudCBib3ggaW5zaWRlIGEgdGFsbCBjZWxsIG9yIHdlIG5lZWQg
dG8gCisgICAgICAgIC8vIHVzZSBzb21lIGtpbmQgb2YgaW50cmluc2ljIHBhZGRpbmcgc2ltaWxh
ciB0byBSZW5kZXJUYWJsZUNlbGwuCisgICAgICAgIGF1dG8gcGFkZGluZ1RvcCA9IGNlbGxCb3hH
ZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcihMYXlvdXRVbml0IHsgfSk7CisgICAgICAgIGF1
dG8gcGFkZGluZ0JvdHRvbSA9IGNlbGxCb3hHZW9tZXRyeS5wYWRkaW5nQm90dG9tKCkudmFsdWVP
cihMYXlvdXRVbml0IHsgfSk7CisgICAgICAgIGF1dG8gaW50cmluc2ljUGFkZGluZ1RvcCA9IExh
eW91dFVuaXQgeyB9OworICAgICAgICBhdXRvIGludHJpbnNpY1BhZGRpbmdCb3R0b20gPSBMYXlv
dXRVbml0IHsgfTsKKworICAgICAgICBzd2l0Y2ggKGNlbGxCb3guc3R5bGUoKS52ZXJ0aWNhbEFs
aWduKCkpIHsKKyAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6IHsKKyAgICAgICAg
ICAgIGF1dG8gaW50cmluc2ljVmVydGljYWxQYWRkaW5nID0gc3RkOjptYXgoMF9sdSwgYXZhaWxh
YmxlVmVydGljYWxTcGFjZSAtIGNlbGxCb3hHZW9tZXRyeS52ZXJ0aWNhbE1hcmdpbkJvcmRlckFu
ZFBhZGRpbmcoKSAtIGNlbGxCb3hHZW9tZXRyeS5jb250ZW50Qm94SGVpZ2h0KCkpOworICAgICAg
ICAgICAgaW50cmluc2ljUGFkZGluZ1RvcCA9IGludHJpbnNpY1ZlcnRpY2FsUGFkZGluZyAvIDI7
CisgICAgICAgICAgICBpbnRyaW5zaWNQYWRkaW5nQm90dG9tID0gaW50cmluc2ljVmVydGljYWxQ
YWRkaW5nIC8gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Ug
VmVydGljYWxBbGlnbjo6QmFzZWxpbmU6IHsKKyAgICAgICAgICAgIGF1dG8gcm93QmFzZWxpbmUg
PSBMYXlvdXRVbml0IHsgcm93TGlzdFtjZWxsLT5zdGFydFJvdygpXS5iYXNlbGluZSgpIH07Cisg
ICAgICAgICAgICBhdXRvIGNlbGxCYXNlbGluZSA9IExheW91dFVuaXQgeyBjZWxsLT5iYXNlbGlu
ZSgpIH07CisgICAgICAgICAgICBpbnRyaW5zaWNQYWRkaW5nVG9wID0gc3RkOjptYXgoMF9sdSwg
cm93QmFzZWxpbmUgLSBjZWxsQmFzZWxpbmUgLSBjZWxsQm94R2VvbWV0cnkuYm9yZGVyVG9wKCkp
OworICAgICAgICAgICAgaW50cmluc2ljUGFkZGluZ0JvdHRvbSA9IHN0ZDo6bWF4KDBfbHUsIGF2
YWlsYWJsZVZlcnRpY2FsU3BhY2UgLSBjZWxsQm94R2VvbWV0cnkudmVydGljYWxNYXJnaW5Cb3Jk
ZXJBbmRQYWRkaW5nKCkgLSBpbnRyaW5zaWNQYWRkaW5nVG9wIC0gY2VsbEJveEdlb21ldHJ5LmNv
bnRlbnRCb3hIZWlnaHQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAg
ICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpbnRyaW5zaWNQYWRkaW5n
VG9wICYmIGNlbGxCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpIHsKKyAgICAgICAgICAg
IGF1dG8gYWRqdXN0Q2VsbENvbnRlbnRXaXRoSW5zdHJpbnNpY1BhZGRpbmdCZWZvcmUgPSBbJl0g
eworICAgICAgICAgICAgICAgIC8vIENoaWxkIGJveGVzIChhbmQgcnVucykgYXJlIGFsd2F5cyBp
biB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBib3JkZXIg
Ym94LgorICAgICAgICAgICAgICAgIC8vIFRoZSBjb250ZW50IGJveCAod2hlcmUgdGhlIGNoaWxk
IGNvbnRlbnQgbGl2ZXMpIGlzIGluc2lkZSB0aGUgcGFkZGluZyBib3gsIHdoaWNoIGlzIGluc2lk
ZSB0aGUgYm9yZGVyIGJveC4KKyAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBjb21wdXRl
IHRoZSBjaGlsZCBib3ggdG9wL2xlZnQgcG9zaXRpb24sIHdlIG5lZWQgdG8ga25vdyBib3RoIHRo
ZSBwYWRkaW5nIGFuZCB0aGUgYm9yZGVyIG9mZnNldHMuICAKKyAgICAgICAgICAgICAgICAvLyBO
b3JtYWxseSBieSB0aGUgdGltZSB3ZSBzdGFydCBwb3NpdGlvbmluZyB0aGUgY2hpbGQgY29udGVu
dCwgd2UgYWxyZWFkeSBoYXZlIGNvbXB1dGVkIGJvcmRlcnMgYW5kIHBhZGRpbmcgZm9yIHRoZSBj
b250YWluaW5nIGJsb2NrLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZGlmZmVyZW50IHdp
dGggdGFibGUgY2VsbHMgd2hlcmUgdGhlIGZpbmFsIHBhZGRpbmcgb2Zmc2V0IGRlcGVuZHMgb24g
dGhlIGNvbnRlbnQgaGVpZ2h0IGFzIHdlIHVzZQorICAgICAgICAgICAgICAgIC8vIHRoZSBwYWRk
aW5nIGJveCB0byB2ZXJ0aWNhbGx5IGFsaWduIHRoZSB0YWJsZSBjZWxsIGNvbnRlbnQuCisgICAg
ICAgICAgICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxp
c2hlZEZvcm1hdHRpbmdTdGF0ZShjZWxsQm94KTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8q
IGNoaWxkID0gY2VsbEJveC5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpOyBjaGlsZDsgY2hp
bGQgPSBjaGlsZC0+bmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKGNoaWxkLT5pc0lubGluZVRleHRCb3goKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYm94
R2VvbWV0cnkoKmNoaWxkKS5tb3ZlVmVydGljYWxseShpbnRyaW5zaWNQYWRkaW5nVG9wKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNlbGxCb3guZXN0YWJsaXNoZXNJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGlu
bGluZUZvcm1hdHRpbmdTdGF0ZWUgPSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkSW5saW5lRm9y
bWF0dGluZ1N0YXRlKGNlbGxCb3gpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHJ1
biA6IGlubGluZUZvcm1hdHRpbmdTdGF0ZWUubGluZVJ1bnMoKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHJ1bi5tb3ZlVmVydGljYWxseShpbnRyaW5zaWNQYWRkaW5nVG9wKTsKKyAgICAgICAg
ICAgICAgICAgICAgZm9yIChhdXRvJiBsaW5lIDogaW5saW5lRm9ybWF0dGluZ1N0YXRlZS5saW5l
cygpKQorICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5tb3ZlVmVydGljYWxseShpbnRyaW5z
aWNQYWRkaW5nVG9wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAg
ICAgICAgYWRqdXN0Q2VsbENvbnRlbnRXaXRoSW5zdHJpbnNpY1BhZGRpbmdCZWZvcmUoKTsKKyAg
ICAgICAgfQorICAgICAgICBjZWxsQm94R2VvbWV0cnkuc2V0VmVydGljYWxQYWRkaW5nKHsgcGFk
ZGluZ1RvcCArIGludHJpbnNpY1BhZGRpbmdUb3AsIHBhZGRpbmdCb3R0b20gKyBpbnRyaW5zaWNQ
YWRkaW5nQm90dG9tIH0pOworICAgIH0KK30KKwordm9pZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0
OjpzZXRVc2VkR2VvbWV0cnlGb3JSb3dzKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNw
YWNlKQoreworICAgIGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsK
KyAgICBhdXRvJiByb3dzID0gZ3JpZC5yb3dzKCkubGlzdCgpOworCisgICAgYXV0byByb3dMb2dp
Y2FsVG9wID0gZ3JpZC52ZXJ0aWNhbFNwYWNpbmcoKTsKKyAgICBjb25zdCBDb250YWluZXJCb3gq
IHByZXZpb3VzUm93ID0gbnVsbHB0cjsKKyAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJv
d0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAgICAgICAgYXV0byYgcm93ID0g
cm93c1tyb3dJbmRleF07CisgICAgICAgIGF1dG8mIHJvd0JveCA9IHJvdy5ib3goKTsKKyAgICAg
ICAgYXV0byYgcm93Qm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShy
b3dCb3gpOworCisgICAgICAgIHJvd0JveEdlb21ldHJ5LnNldFBhZGRpbmcoZ2VvbWV0cnkoKS5j
b21wdXRlZFBhZGRpbmcocm93Qm94LCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpKTsKKyAgICAg
ICAgLy8gSW50ZXJuYWwgdGFibGUgZWxlbWVudHMgZG8gbm90IGhhdmUgbWFyZ2lucy4KKyAgICAg
ICAgcm93Qm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IH0pOworICAgICAgICByb3dC
b3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IH0pOworCisgICAgICAgIGF1dG8gY29tcHV0
ZWRSb3dCb3JkZXIgPSBbJl0geworICAgICAgICAgICAgYXV0byBib3JkZXIgPSBnZW9tZXRyeSgp
LmNvbXB1dGVkQm9yZGVyKHJvd0JveCk7CisgICAgICAgICAgICBpZiAoIWdyaWQuY29sbGFwc2Vk
Qm9yZGVyKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGJvcmRlcjsKKyAgICAgICAgICAgIC8v
IEJvcmRlciBjb2xsYXBzaW5nIGRlbGVnYXRlcyBib3JkZXJzIHRvIHRhYmxlL2NlbGxzLgorICAg
ICAgICAgICAgYm9yZGVyLmhvcml6b250YWwgPSB7IH07CisgICAgICAgICAgICBpZiAoIXJvd0lu
ZGV4KQorICAgICAgICAgICAgICAgIGJvcmRlci52ZXJ0aWNhbC50b3AgPSB7IH07CisgICAgICAg
ICAgICBpZiAocm93SW5kZXggPT0gcm93cy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgIGJv
cmRlci52ZXJ0aWNhbC5ib3R0b20gPSB7IH07CisgICAgICAgICAgICByZXR1cm4gYm9yZGVyOwor
ICAgICAgICB9KCk7CisgICAgICAgIGlmIChjb21wdXRlZFJvd0JvcmRlci5oZWlnaHQoKSA+IHJv
dy5sb2dpY2FsSGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGFuIG9k
ZCBxdWlyayB3aGVuIHRoZSByb3cgYm9yZGVyIG92ZXJmbG93cyB0aGUgcm93LgorICAgICAgICAg
ICAgLy8gV2UgZG9uJ3QgcGFpbnQgcm93IGJvcmRlcnMgc28gaXQgZG9lcyBub3QgbWF0dGVyIHRv
byBtdWNoLCBidXQgaWYgd2UgZG9uJ3QKKyAgICAgICAgICAgIC8vIHNldCB0aGlzIGZha2UgYm9y
ZGVyIHZhbHVlLCB0aGFuIHdlIGVpdGhlciBlbmQgdXAgd2l0aCBhIG5lZ2F0aXZlIGNvbnRlbnQg
Ym94CisgICAgICAgICAgICAvLyBvciB3aXRoIGEgd2lkZSBmcmFtZSBib3guCisgICAgICAgICAg
ICAvLyBJZiBpdCBoYXBwZW5zIHRvIGNhdXNlIGlzc3VlcyBpbiB0aGUgZGlzcGxheSB0cmVlLCB3
ZSBjb3VsZCBhbHNvIGNvbnNpZGVyCisgICAgICAgICAgICAvLyBhIHNwZWNpYWwgZnJhbWUgYm94
IG92ZXJyaWRlLCB3aGVyZSBwYWRkaW5nIGJveCArIGJvcmRlciAhPSBmcmFtZSBib3guCisgICAg
ICAgICAgICBjb21wdXRlZFJvd0JvcmRlci52ZXJ0aWNhbC50b3AgPSB7IH07CisgICAgICAgICAg
ICBjb21wdXRlZFJvd0JvcmRlci52ZXJ0aWNhbC5ib3R0b20gPSB7IH07CisgICAgICAgIH0KKyAg
ICAgICAgcm93Qm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodChyb3cubG9naWNhbEhlaWdo
dCgpIC0gY29tcHV0ZWRSb3dCb3JkZXIuaGVpZ2h0KCkpOworCisgICAgICAgIGF1dG8gcm93TG9n
aWNhbFdpZHRoID0gZ3JpZC5jb2x1bW5zKCkubG9naWNhbFdpZHRoKCkgKyAyICogZ3JpZC5ob3Jp
em9udGFsU3BhY2luZygpOworICAgICAgICBpZiAoY29tcHV0ZWRSb3dCb3JkZXIud2lkdGgoKSA+
IHJvd0xvZ2ljYWxXaWR0aCkgeworICAgICAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdmUuCisg
ICAgICAgICAgICBjb21wdXRlZFJvd0JvcmRlci5ob3Jpem9udGFsLmxlZnQgPSB7IH07CisgICAg
ICAgICAgICBjb21wdXRlZFJvd0JvcmRlci5ob3Jpem9udGFsLnJpZ2h0ID0geyB9OworICAgICAg
ICB9CisgICAgICAgIHJvd0JveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChyb3dMb2dpY2Fs
V2lkdGggLSBjb21wdXRlZFJvd0JvcmRlci53aWR0aCgpKTsKKyAgICAgICAgcm93Qm94R2VvbWV0
cnkuc2V0Qm9yZGVyKGNvbXB1dGVkUm93Qm9yZGVyKTsKKworICAgICAgICBpZiAocHJldmlvdXNS
b3cgJiYgJnByZXZpb3VzUm93LT5wYXJlbnQoKSAhPSAmcm93Qm94LnBhcmVudCgpKSB7CisgICAg
ICAgICAgICAvLyBUaGlzIHJvdyBpcyBpbiBhIGRpZmZlcmVudCBzZWN0aW9uLgorICAgICAgICAg
ICAgcm93TG9naWNhbFRvcCA9IHsgfTsKKyAgICAgICAgfQorICAgICAgICByb3dCb3hHZW9tZXRy
eS5zZXRMb2dpY2FsVG9wKHJvd0xvZ2ljYWxUb3ApOworICAgICAgICByb3dCb3hHZW9tZXRyeS5z
ZXRMb2dpY2FsTGVmdCh7IH0pOworCisgICAgICAgIHJvd0xvZ2ljYWxUb3AgKz0gcm93LmxvZ2lj
YWxIZWlnaHQoKSArIGdyaWQudmVydGljYWxTcGFjaW5nKCk7CisgICAgICAgIHByZXZpb3VzUm93
ID0gJnJvd0JveDsKKyAgICB9CisKKyAgICBhdXRvJiBjb2x1bW5zID0gZ3JpZC5jb2x1bW5zKCk7
CisgICAgVmVjdG9yPElubGluZUxheW91dFVuaXQ+IHJvd0Jhc2VsaW5lcyhyb3dzLnNpemUoKSwg
MCk7CisgICAgLy8gTm93IHRoYXQgY2VsbHMgYXJlIGxhaWQgb3V0LCBsZXQncyBjb21wdXRlIHRo
ZSByb3cgYmFzZWxpbmVzLgorICAgIGZvciAoc2l6ZV90IHJvd0luZGV4ID0gMDsgcm93SW5kZXgg
PCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkgeworICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW5J
bmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29sdW1uSW5kZXgpIHsK
KyAgICAgICAgICAgIGF1dG8mIHNsb3QgPSAqZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0lu
ZGV4IH0pOworICAgICAgICAgICAgaWYgKHNsb3QuaXNSb3dTcGFubmVkKCkpCisgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoc2xvdC5oYXNSb3dTcGFuKCkpCisgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhdXRvJiBjZWxsID0gc2xvdC5jZWxs
KCk7CisgICAgICAgICAgICByb3dCYXNlbGluZXNbcm93SW5kZXhdID0gc3RkOjptYXgocm93QmFz
ZWxpbmVzW3Jvd0luZGV4XSwgY2VsbC5iYXNlbGluZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93
SW5kZXgpCisgICAgICAgIHJvd3Nbcm93SW5kZXhdLnNldEJhc2VsaW5lKHJvd0Jhc2VsaW5lc1ty
b3dJbmRleF0pOworfQorCit2b2lkIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OnNldFVzZWRHZW9t
ZXRyeUZvclNlY3Rpb25zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3Ry
YWludHMpCit7CisgICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgp
OworICAgIGF1dG8mIHRhYmxlQm94ID0gcm9vdCgpOworICAgIGF1dG8gc2VjdGlvbldpZHRoID0g
Z3JpZC5jb2x1bW5zKCkubG9naWNhbFdpZHRoKCkgKyAyICogZ3JpZC5ob3Jpem9udGFsU3BhY2lu
ZygpOworICAgIGF1dG8gbG9naWNhbFRvcCA9IGNvbnN0cmFpbnRzLnZlcnRpY2FsLmxvZ2ljYWxU
b3A7CisgICAgYXV0byB2ZXJ0aWNhbFNwYWNpbmcgPSBncmlkLnZlcnRpY2FsU3BhY2luZygpOwor
ICAgIGF1dG8gcGFkZGluZ0JlZm9yZSA9IE9wdGlvbmFsPExheW91dFVuaXQ+IHsgdmVydGljYWxT
cGFjaW5nIH07CisgICAgYXV0byBwYWRkaW5nQWZ0ZXIgPSB2ZXJ0aWNhbFNwYWNpbmc7CisgICAg
Zm9yIChhdXRvJiBzZWN0aW9uQm94IDogY2hpbGRyZW5PZlR5cGU8Q29udGFpbmVyQm94Pih0YWJs
ZUJveCkpIHsKKyAgICAgICAgYXV0byYgc2VjdGlvbkJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0
YXRlKCkuYm94R2VvbWV0cnkoc2VjdGlvbkJveCk7CisgICAgICAgIC8vIFNlY3Rpb24gYm9yZGVy
cyBhcmUgZWl0aGVyIGNvbGxhcHNlZCBvciBpZ25vcmVkLgorICAgICAgICBzZWN0aW9uQm94R2Vv
bWV0cnkuc2V0Qm9yZGVyKHsgfSk7CisgICAgICAgIC8vIFVzZSBmYWtlIHZlcnRpY2FsIHBhZGRp
bmcgdG8gc3BhY2Ugb3V0IHRoZSBzZWN0aW9ucy4KKyAgICAgICAgc2VjdGlvbkJveEdlb21ldHJ5
LnNldFBhZGRpbmcoRWRnZXMgeyB7IH0sIHsgcGFkZGluZ0JlZm9yZS52YWx1ZU9yKDBfbHUpLCBw
YWRkaW5nQWZ0ZXIgfSB9KTsKKyAgICAgICAgcGFkZGluZ0JlZm9yZSA9IFdURjo6bnVsbG9wdDsK
KyAgICAgICAgLy8gSW50ZXJuYWwgdGFibGUgZWxlbWVudHMgZG8gbm90IGhhdmUgbWFyZ2lucy4K
KyAgICAgICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyB9KTsKKyAg
ICAgICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7CisKKyAgICAg
ICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChzZWN0aW9uV2lkdGgpOwor
ICAgICAgICBhdXRvIHNlY3Rpb25Db250ZW50SGVpZ2h0ID0gTGF5b3V0VW5pdCB7IH07CisgICAg
ICAgIHNpemVfdCByb3dDb3VudCA9IDA7CisgICAgICAgIGZvciAoYXV0byYgcm93Qm94IDogY2hp
bGRyZW5PZlR5cGU8Q29udGFpbmVyQm94PihzZWN0aW9uQm94KSkgeworICAgICAgICAgICAgc2Vj
dGlvbkNvbnRlbnRIZWlnaHQgKz0gZ2VvbWV0cnlGb3JCb3gocm93Qm94KS5ib3JkZXJCb3hIZWln
aHQoKTsKKyAgICAgICAgICAgICsrcm93Q291bnQ7CisgICAgICAgIH0KKyAgICAgICAgc2VjdGlv
bkNvbnRlbnRIZWlnaHQgKz0gdmVydGljYWxTcGFjaW5nICogKHJvd0NvdW50IC0gMSk7CisgICAg
ICAgIHNlY3Rpb25Cb3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KHNlY3Rpb25Db250ZW50
SGVpZ2h0KTsKKyAgICAgICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldExvZ2ljYWxMZWZ0KGNvbnN0
cmFpbnRzLmhvcml6b250YWwubG9naWNhbExlZnQpOworICAgICAgICBzZWN0aW9uQm94R2VvbWV0
cnkuc2V0TG9naWNhbFRvcChsb2dpY2FsVG9wKTsKKworICAgICAgICBsb2dpY2FsVG9wICs9IHNl
Y3Rpb25Cb3hHZW9tZXRyeS5ib3JkZXJCb3hIZWlnaHQoKTsKKyAgICB9Cit9CisKK3ZvaWQgVGFi
bGVGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0Q2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNl
bGwsIExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRV
bml0PiB1c2VkQ2VsbEhlaWdodCkKK3sKKyAgICBBU1NFUlQoY2VsbC5ib3goKS5lc3RhYmxpc2hl
c0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSk7CisKKyAgICBhdXRvJiBncmlkID0gZm9ybWF0dGlu
Z1N0YXRlKCkudGFibGVHcmlkKCk7CisgICAgYXV0byYgY2VsbEJveCA9IGNlbGwuYm94KCk7Cisg
ICAgYXV0byYgY2VsbEJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnko
Y2VsbEJveCk7CisKKyAgICBjZWxsQm94R2VvbWV0cnkuc2V0Qm9yZGVyKGdlb21ldHJ5KCkuY29t
cHV0ZWRDZWxsQm9yZGVyKGNlbGwpKTsKKyAgICBjZWxsQm94R2VvbWV0cnkuc2V0UGFkZGluZyhn
ZW9tZXRyeSgpLmNvbXB1dGVkUGFkZGluZyhjZWxsQm94LCBhdmFpbGFibGVIb3Jpem9udGFsU3Bh
Y2UpKTsKKyAgICAvLyBJbnRlcm5hbCB0YWJsZSBlbGVtZW50cyBkbyBub3QgaGF2ZSBtYXJnaW5z
LgorICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgfSk7CisgICAgY2Vs
bEJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7CisKKyAgICBhdXRvIGF2YWlsYWJs
ZVNwYWNlRm9yQ29udGVudCA9IFsmXSB7CisgICAgICAgIGF1dG8mIGNvbHVtbkxpc3QgPSBncmlk
LmNvbHVtbnMoKS5saXN0KCk7CisgICAgICAgIGF1dG8gbG9naWNhbFdpZHRoID0gTGF5b3V0VW5p
dCB7IH07CisgICAgICAgIGZvciAoYXV0byBjb2x1bW5JbmRleCA9IGNlbGwuc3RhcnRDb2x1bW4o
KTsgY29sdW1uSW5kZXggPCBjZWxsLmVuZENvbHVtbigpOyArK2NvbHVtbkluZGV4KQorICAgICAg
ICAgICAgbG9naWNhbFdpZHRoICs9IGNvbHVtbkxpc3QuYXQoY29sdW1uSW5kZXgpLmxvZ2ljYWxX
aWR0aCgpOworICAgICAgICAvLyBObyBjb2x1bW4gc3BhY2luZyB3aGVuIHNwYW5uaW5nLgorICAg
ICAgICBsb2dpY2FsV2lkdGggKz0gKGNlbGwuY29sdW1uU3BhbigpIC0gMSkgKiBncmlkLmhvcml6
b250YWxTcGFjaW5nKCk7CisgICAgICAgIHJldHVybiBsb2dpY2FsV2lkdGggLSBjZWxsQm94R2Vv
bWV0cnkuaG9yaXpvbnRhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKTsKKyAgICB9KCk7CisgICAg
Y2VsbEJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChhdmFpbGFibGVTcGFjZUZvckNvbnRl
bnQpOworCisgICAgaWYgKGNlbGxCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpIHsKKyAg
ICAgICAgYXV0byBjb25zdHJhaW50c0ZvckNlbGxDb250ZW50ID0gZ2VvbWV0cnkoKS5jb25zdHJh
aW50c0ZvckluRmxvd0NvbnRlbnQoY2VsbEJveCk7CisgICAgICAgIGNvbnN0cmFpbnRzRm9yQ2Vs
bENvbnRlbnQudmVydGljYWwubG9naWNhbEhlaWdodCA9IHVzZWRDZWxsSGVpZ2h0OworICAgICAg
ICBhdXRvIGludmFsaWRhdGlvblN0YXRlID0gSW52YWxpZGF0aW9uU3RhdGUgeyB9OworICAgICAg
ICAvLyBGSVhNRTogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgcGFydCBvZiB0aGUgaW52YWxpZGF0
aW9uIHN0YXRlIHRvIGluZGljYXRlIHdoZW4gd2UgcmUtbGF5b3V0IHRoZSBjZWxsCisgICAgICAg
IC8vIG11bHRpcGxlIHRpbWVzIGFzIHBhcnQgb2YgdGhlIG11bHRpLXBhc3MgdGFibGUgYWxnb3Jp
dGhtLgorICAgICAgICBhdXRvJiBmbG9hdGluZ1N0YXRlRm9yQ2VsbENvbnRlbnQgPSBsYXlvdXRT
dGF0ZSgpLmVuc3VyZUJsb2NrRm9ybWF0dGluZ1N0YXRlKGNlbGxCb3gpLmZsb2F0aW5nU3RhdGUo
KTsKKyAgICAgICAgZmxvYXRpbmdTdGF0ZUZvckNlbGxDb250ZW50LmNsZWFyKCk7CisgICAgICAg
IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGNlbGxCb3gsIGxheW91dFN0
YXRlKCkpLT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBjb25zdHJhaW50
c0ZvckNlbGxDb250ZW50KTsKKyAgICB9CisgICAgY2VsbEJveEdlb21ldHJ5LnNldENvbnRlbnRC
b3hIZWlnaHQoZ2VvbWV0cnkoKS5jZWxsSGVpZ2goY2VsbEJveCkpOworfQorCitGb3JtYXR0aW5n
Q29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0
Ojpjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKQoreworICAgIEFTU0VSVCghcm9v
dCgpLmlzU2l6ZUNvbnRhaW5tZW50Qm94KCkpOworICAgIC8vIFRhYmxlcyBoYXZlIGEgc2xpZ2h0
eSBkaWZmZXJlbnQgY29uY2VwdCBvZiBzaHJpbmsgdG8gZml0LiBJdCdzIHJlYWxseSBvbmx5IGRp
ZmZlcmVudCB3aXRoIG5vbi1hdXRvICJ3aWR0aCIgdmFsdWVzLCB3aGVyZQorICAgIC8vIGEgZ2Vu
ZXJpYyBzaHJpbmstdG8gZml0IGJsb2NrIGxldmVsIGJveCBsaWtlIGEgZmxvYXQgYm94IHdvdWxk
IGJlIGp1c3Qgc2l6ZWQgdG8gdGhlIGNvbXB1dGVkIHZhbHVlIG9mICJ3aWR0aCIsIHRhYmxlcwor
ICAgIC8vIGNhbiBhY3R1YWxseSBiZSBzdHJlY2hlZCB3YXkgb3Zlci4KKyAgICBhdXRvJiBncmlk
ID0gZm9ybWF0dGluZ1N0YXRlKCkudGFibGVHcmlkKCk7CisgICAgaWYgKGF1dG8gY29tcHV0ZWRX
aWR0aENvbnN0cmFpbnRzID0gZ3JpZC53aWR0aENvbnN0cmFpbnRzKCkpCisgICAgICAgIHJldHVy
biAqY29tcHV0ZWRXaWR0aENvbnN0cmFpbnRzOworCisgICAgLy8gQ29tcHV0ZSB0aGUgbWluaW11
bS9tYXhpbXVtIHdpZHRoIG9mIGVhY2ggY29sdW1uLgorICAgIGF1dG8gY29tcHV0ZWRXaWR0aENv
bnN0cmFpbnRzID0gY29tcHV0ZWRQcmVmZXJyZWRXaWR0aEZvckNvbHVtbnMoKTsKKyAgICBncmlk
LnNldFdpZHRoQ29uc3RyYWludHMoY29tcHV0ZWRXaWR0aENvbnN0cmFpbnRzKTsKKyAgICByZXR1
cm4gY29tcHV0ZWRXaWR0aENvbnN0cmFpbnRzOworfQorCitVbmlxdWVSZWY8VGFibGVHcmlkPiBU
YWJsZUZvcm1hdHRpbmdDb250ZXh0OjplbnN1cmVUYWJsZUdyaWQoY29uc3QgQ29udGFpbmVyQm94
JiB0YWJsZUJveCkKK3sKKyAgICBhdXRvIHRhYmxlR3JpZCA9IG1ha2VVbmlxdWVSZWY8VGFibGVH
cmlkPigpOworICAgIGF1dG8mIHRhYmxlU3R5bGUgPSB0YWJsZUJveC5zdHlsZSgpOworICAgIGF1
dG8gc2hvdWxkQXBwbHlCb3JkZXJTcGFjaW5nID0gdGFibGVTdHlsZS5ib3JkZXJDb2xsYXBzZSgp
ID09IEJvcmRlckNvbGxhcHNlOjpTZXBhcmF0ZTsKKyAgICB0YWJsZUdyaWQtPnNldEhvcml6b250
YWxTcGFjaW5nKExheW91dFVuaXQgeyBzaG91bGRBcHBseUJvcmRlclNwYWNpbmcgPyB0YWJsZVN0
eWxlLmhvcml6b250YWxCb3JkZXJTcGFjaW5nKCkgOiAwIH0pOworICAgIHRhYmxlR3JpZC0+c2V0
VmVydGljYWxTcGFjaW5nKExheW91dFVuaXQgeyBzaG91bGRBcHBseUJvcmRlclNwYWNpbmcgPyB0
YWJsZVN0eWxlLnZlcnRpY2FsQm9yZGVyU3BhY2luZygpIDogMCB9KTsKKworICAgIGF1dG8qIGZp
cnN0Q2hpbGQgPSB0YWJsZUJveC5maXJzdENoaWxkKCk7CisgICAgaWYgKCFmaXJzdENoaWxkKSB7
CisgICAgICAgIC8vIFRoZSByYXJlIGNhc2Ugb2YgZW1wdHkgdGFibGUuCisgICAgICAgIHJldHVy
biB0YWJsZUdyaWQ7CisgICAgfQorCisgICAgY29uc3QgQm94KiB0YWJsZUNhcHRpb24gPSBudWxs
cHRyOworICAgIGNvbnN0IEJveCogY29sZ3JvdXAgPSBudWxscHRyOworICAgIC8vIFRhYmxlIGNh
cHRpb24gaXMgYW4gb3B0aW9uYWwgZWxlbWVudDsgaWYgdXNlZCwgaXQgaXMgYWx3YXlzIHRoZSBm
aXJzdCBjaGlsZCBvZiBhIDx0YWJsZT4uCisgICAgaWYgKGZpcnN0Q2hpbGQtPmlzVGFibGVDYXB0
aW9uKCkpCisgICAgICAgIHRhYmxlQ2FwdGlvbiA9IGZpcnN0Q2hpbGQ7CisgICAgLy8gVGhlIDxj
b2xncm91cD4gbXVzdCBhcHBlYXIgYWZ0ZXIgYW55IG9wdGlvbmFsIDxjYXB0aW9uPiBlbGVtZW50
IGJ1dCBiZWZvcmUgYW55IDx0aGVhZD4sIDx0aD4sIDx0Ym9keT4sIDx0Zm9vdD4gYW5kIDx0cj4g
ZWxlbWVudC4KKyAgICBhdXRvKiBjb2xncm91cENhbmRpZGF0ZSA9IGZpcnN0Q2hpbGQ7CisgICAg
aWYgKHRhYmxlQ2FwdGlvbikKKyAgICAgICAgY29sZ3JvdXBDYW5kaWRhdGUgPSB0YWJsZUNhcHRp
b24tPm5leHRTaWJsaW5nKCk7CisgICAgaWYgKGNvbGdyb3VwQ2FuZGlkYXRlLT5pc1RhYmxlQ29s
dW1uR3JvdXAoKSkKKyAgICAgICAgY29sZ3JvdXAgPSBjb2xncm91cENhbmRpZGF0ZTsKKworICAg
IGlmIChjb2xncm91cCkgeworICAgICAgICBhdXRvJiBjb2x1bW5zID0gdGFibGVHcmlkLT5jb2x1
bW5zKCk7CisgICAgICAgIGZvciAoYXV0byogY29sdW1uID0gZG93bmNhc3Q8Q29udGFpbmVyQm94
PigqY29sZ3JvdXApLmZpcnN0Q2hpbGQoKTsgY29sdW1uOyBjb2x1bW4gPSBjb2x1bW4tPm5leHRT
aWJsaW5nKCkpIHsKKyAgICAgICAgICAgIEFTU0VSVChjb2x1bW4tPmlzVGFibGVDb2x1bW4oKSk7
CisgICAgICAgICAgICBhdXRvIGNvbHVtblNwYW5Db3VudCA9IGNvbHVtbi0+Y29sdW1uU3Bhbigp
OworICAgICAgICAgICAgQVNTRVJUKGNvbHVtblNwYW5Db3VudCA+IDApOworICAgICAgICAgICAg
d2hpbGUgKGNvbHVtblNwYW5Db3VudC0tKQorICAgICAgICAgICAgICAgIGNvbHVtbnMuYWRkQ29s
dW1uKGRvd25jYXN0PENvbnRhaW5lckJveD4oKmNvbHVtbikpOworICAgICAgICB9CisgICAgfQor
CisgICAgYXV0byogZmlyc3RTZWN0aW9uID0gY29sZ3JvdXAgPyBjb2xncm91cC0+bmV4dFNpYmxp
bmcoKSA6IHRhYmxlQ2FwdGlvbiA/IHRhYmxlQ2FwdGlvbi0+bmV4dFNpYmxpbmcoKSA6IGZpcnN0
Q2hpbGQ7CisgICAgZm9yIChhdXRvKiBzZWN0aW9uID0gZmlyc3RTZWN0aW9uOyBzZWN0aW9uOyBz
ZWN0aW9uID0gc2VjdGlvbi0+bmV4dFNpYmxpbmcoKSkgeworICAgICAgICBBU1NFUlQoc2VjdGlv
bi0+aXNUYWJsZUhlYWRlcigpIHx8IHNlY3Rpb24tPmlzVGFibGVCb2R5KCkgfHwgc2VjdGlvbi0+
aXNUYWJsZUZvb3RlcigpKTsKKyAgICAgICAgZm9yIChhdXRvKiByb3cgPSBkb3duY2FzdDxDb250
YWluZXJCb3g+KCpzZWN0aW9uKS5maXJzdENoaWxkKCk7IHJvdzsgcm93ID0gcm93LT5uZXh0U2li
bGluZygpKSB7CisgICAgICAgICAgICBBU1NFUlQocm93LT5pc1RhYmxlUm93KCkpOworICAgICAg
ICAgICAgZm9yIChhdXRvKiBjZWxsID0gZG93bmNhc3Q8Q29udGFpbmVyQm94Pigqcm93KS5maXJz
dENoaWxkKCk7IGNlbGw7IGNlbGwgPSBjZWxsLT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAg
ICAgICAgQVNTRVJUKGNlbGwtPmlzVGFibGVDZWxsKCkpOworICAgICAgICAgICAgICAgIHRhYmxl
R3JpZC0+YXBwZW5kQ2VsbChkb3duY2FzdDxDb250YWluZXJCb3g+KCpjZWxsKSk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRhYmxlR3JpZDsKK30KKworRm9y
bWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgVGFibGVGb3JtYXR0aW5n
Q29udGV4dDo6Y29tcHV0ZWRQcmVmZXJyZWRXaWR0aEZvckNvbHVtbnMoKQoreworICAgIGF1dG8m
IGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1hdHRpbmdTdGF0ZSgpOworICAgIGF1dG8mIGdy
aWQgPSBmb3JtYXR0aW5nU3RhdGUudGFibGVHcmlkKCk7CisgICAgQVNTRVJUKCFncmlkLndpZHRo
Q29uc3RyYWludHMoKSk7CisKKyAgICAvLyBDb2x1bW4gcHJlZmVycmVkIHdpZHRoIGNvbXB1dGF0
aW9uIGFzIGZvbGxvd3M6CisgICAgLy8gMS4gQ29sbGVjdCBlYWNoIGNlbGxzJyB3aWR0aCBjb25z
dHJhaW50cworICAgIC8vIDIuIENvbGxlY3QgZml4ZWQgY29sdW1uIHdpZHRocyBzZXQgYnkgPGNv
bGdyb3VwPidzIGFuZCA8Y29sPnMKKyAgICAvLyAzLiBGaW5kIHRoZSBtaW4vbWF4IHdpZHRoIGZv
ciBlYWNoIGNvbHVtbnMgdXNpbmcgdGhlIGNlbGwgY29uc3RyYWludHMgYW5kIHRoZSA8Y29sPiBm
aXhlZCB3aWR0aHMgYnV0IGlnbm9yZSBjb2x1bW4gc3BhbnMuCisgICAgLy8gNC4gRGlzdHJpYnV0
ZSBjb2x1bW4gc3Bhbm5pbmcgY2VsbHMgbWluL21heCB3aWR0aHMuCisgICAgLy8gNS4gQWRkIHRo
ZW0gYWxsIHVwIGFuZCByZXR1cm4gdGhlIGNvbXB1dGVkIG1pbi9tYXggd2lkdGhzLgorICAgIGZv
ciAoYXV0byYgY2VsbCA6IGdyaWQuY2VsbHMoKSkgeworICAgICAgICBhdXRvJiBjZWxsQm94ID0g
Y2VsbC0+Ym94KCk7CisgICAgICAgIEFTU0VSVChjZWxsQm94LmVzdGFibGlzaGVzQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dCgpKTsKKworICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRoID0gZm9ybWF0
dGluZ1N0YXRlLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goY2VsbEJveCk7CisgICAg
ICAgIGlmICghaW50cmluc2ljV2lkdGgpIHsKKyAgICAgICAgICAgIGludHJpbnNpY1dpZHRoID0g
Z2VvbWV0cnkoKS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQ2VsbCgqY2VsbCk7CisgICAg
ICAgICAgICBmb3JtYXR0aW5nU3RhdGUuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJv
eChjZWxsQm94LCAqaW50cmluc2ljV2lkdGgpOworICAgICAgICB9CisgICAgICAgIC8vIFNwYW5u
ZXIgY2VsbHMgcHV0IHRoZWlyIGludHJpbnNpYyB3aWR0aHMgb24gdGhlIGluaXRpYWwgc2xvdHMu
CisgICAgICAgIGdyaWQuc2xvdChjZWxsLT5wb3NpdGlvbigpKS0+c2V0V2lkdGhDb25zdHJhaW50
cygqaW50cmluc2ljV2lkdGgpOworICAgIH0KKworICAgIC8vIDIuIENvbGxlY3QgdGhlIGZpeGVk
IHdpZHRoIDxjb2w+cy4KKyAgICBhdXRvJiBjb2x1bW5MaXN0ID0gZ3JpZC5jb2x1bW5zKCkubGlz
dCgpOworICAgIFZlY3RvcjxPcHRpb25hbDxMYXlvdXRVbml0Pj4gZml4ZWRXaWR0aENvbHVtbnM7
CisgICAgZm9yIChhdXRvJiBjb2x1bW4gOiBjb2x1bW5MaXN0KSB7CisgICAgICAgIGF1dG8gZml4
ZWRXaWR0aCA9IFsmXSAoKSAtPiBPcHRpb25hbDxMYXlvdXRVbml0PiB7CisgICAgICAgICAgICBh
dXRvKiBjb2x1bW5Cb3ggPSBjb2x1bW4uYm94KCk7CisgICAgICAgICAgICBpZiAoIWNvbHVtbkJv
eCkgeworICAgICAgICAgICAgICAgIC8vIEFub3lubW91cyBjb2x1bW5zIGRvbid0IGhhdmUgYXNz
b2NpYXRlZCBsYXlvdXQgYm94ZXMgYW5kIGNhbid0IGhhdmUgZml4ZWQgY29sIHNpemUuCisgICAg
ICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChh
dXRvIHdpZHRoID0gY29sdW1uQm94LT5jb2x1bW5XaWR0aCgpKQorICAgICAgICAgICAgICAgIHJl
dHVybiB3aWR0aDsKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmNvbXB1dGVkQ29sdW1u
V2lkdGgoKmNvbHVtbkJveCk7CisgICAgICAgIH07CisgICAgICAgIGZpeGVkV2lkdGhDb2x1bW5z
LmFwcGVuZChmaXhlZFdpZHRoKCkpOworICAgIH0KKworICAgIFZlY3RvcjxGb3JtYXR0aW5nQ29u
dGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cz4gY29sdW1uSW50cmluc2ljV2lkdGhzKGNv
bHVtbkxpc3Quc2l6ZSgpKTsKKyAgICAvLyAzLiBDb2xsZWN0IGhlIG1pbi9tYXggd2lkdGggZm9y
IGVhY2ggY29sdW1uIGJ1dCBpZ25vcmUgY29sdW1uIHNwYW5zIGZvciBub3cuCisgICAgVmVjdG9y
PFNsb3RQb3NpdGlvbj4gc3Bhbm5pbmdDZWxsUG9zaXRpb25MaXN0OworICAgIHNpemVfdCBudW1i
ZXJPZkFjdHVhbENvbHVtbnMgPSAwOworICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsg
Y29sdW1uSW5kZXggPCBjb2x1bW5MaXN0LnNpemUoKTsgKytjb2x1bW5JbmRleCkgeworICAgICAg
ICBhdXRvIGNvbHVtbkhhc05vblNwYW5uZWRDZWxsID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6
ZV90IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCBncmlkLnJvd3MoKS5zaXplKCk7ICsrcm93SW5k
ZXgpIHsKKyAgICAgICAgICAgIGF1dG8mIHNsb3QgPSAqZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgs
IHJvd0luZGV4IH0pOworICAgICAgICAgICAgaWYgKHNsb3QuaXNDb2x1bW5TcGFubmVkKCkpCisg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjb2x1bW5IYXNOb25TcGFubmVk
Q2VsbCA9IHRydWU7CisgICAgICAgICAgICBpZiAoc2xvdC5oYXNDb2x1bW5TcGFuKCkpIHsKKyAg
ICAgICAgICAgICAgICBzcGFubmluZ0NlbGxQb3NpdGlvbkxpc3QuYXBwZW5kKHsgY29sdW1uSW5k
ZXgsIHJvd0luZGV4IH0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgYXV0byBjb2x1bW5GaXhlZFdpZHRoID0gZml4ZWRXaWR0aENvbHVtbnNb
Y29sdW1uSW5kZXhdOworICAgICAgICAgICAgYXV0byB3aWR0aENvbnN0cmFpbnRzID0gIWNvbHVt
bkZpeGVkV2lkdGggPyBzbG90LndpZHRoQ29uc3RyYWludHMoKSA6IEZvcm1hdHRpbmdDb250ZXh0
OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgKmNvbHVtbkZpeGVkV2lkdGgsICpjb2x1bW5G
aXhlZFdpZHRoIH07CisgICAgICAgICAgICBjb2x1bW5JbnRyaW5zaWNXaWR0aHNbY29sdW1uSW5k
ZXhdLm1pbmltdW0gPSBzdGQ6Om1heCh3aWR0aENvbnN0cmFpbnRzLm1pbmltdW0sIGNvbHVtbklu
dHJpbnNpY1dpZHRoc1tjb2x1bW5JbmRleF0ubWluaW11bSk7CisgICAgICAgICAgICBjb2x1bW5J
bnRyaW5zaWNXaWR0aHNbY29sdW1uSW5kZXhdLm1heGltdW0gPSBzdGQ6Om1heCh3aWR0aENvbnN0
cmFpbnRzLm1heGltdW0sIGNvbHVtbkludHJpbnNpY1dpZHRoc1tjb2x1bW5JbmRleF0ubWF4aW11
bSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbHVtbkhhc05vblNwYW5uZWRDZWxsKQorICAg
ICAgICAgICAgKytudW1iZXJPZkFjdHVhbENvbHVtbnM7CisgICAgfQorCisgICAgLy8gNC4gRGlz
dHJpYnV0ZSB0aGUgc3Bhbm5pbmcgbWluL21heCB3aWR0aHMuCisgICAgZm9yIChhdXRvIHNwYW5u
aW5nQ2VsbFBvc2l0aW9uIDogc3Bhbm5pbmdDZWxsUG9zaXRpb25MaXN0KSB7CisgICAgICAgIGF1
dG8mIHNsb3QgPSAqZ3JpZC5zbG90KHNwYW5uaW5nQ2VsbFBvc2l0aW9uKTsKKyAgICAgICAgYXV0
byYgY2VsbCA9IHNsb3QuY2VsbCgpOworICAgICAgICBBU1NFUlQoc2xvdC5oYXNDb2x1bW5TcGFu
KCkpOworICAgICAgICBhdXRvIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUgPSBzbG90Lndp
ZHRoQ29uc3RyYWludHMoKTsKKyAgICAgICAgZm9yIChzaXplX3QgY29sdW1uU3BhbkluZGV4ID0g
Y2VsbC5zdGFydENvbHVtbigpOyBjb2x1bW5TcGFuSW5kZXggPCBjZWxsLmVuZENvbHVtbigpOyAr
K2NvbHVtblNwYW5JbmRleCkKKyAgICAgICAgICAgIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1
dGUgLT0gY29sdW1uSW50cmluc2ljV2lkdGhzW2NvbHVtblNwYW5JbmRleF07CisgICAgICAgIC8v
IDx0YWJsZSBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDUwcHgiPjx0cj48dGQgY29sc3Bhbj0yPmxv
bmcgbG9uZyB0ZXh0PC90ZD48L3RyPjx0cj48dGQ+bG88L3RkPjx0ZD54dDwvdGQ+PHRyPjwvdGFi
bGU+CisgICAgICAgIC8vIFtsb25nIGxvbmcgdGV4dF0KKyAgICAgICAgLy8gW2xvXSAgICAgICAg
W3h0XQorICAgICAgICAvLyBXaGlsZSBpdCBsb29rcyBsaWtlIHRoZSBzcGFubmluZyBjZWxsIGhh
cyB0byBkaXN0cmlidXRlIGFsbCBpdHMgc3Bhbm5pbmcgd2lkdGgsIHRoZSBib3JkZXItc3BhY2lu
ZyB0YWtlcyBtb3N0IG9mIHRoZSBzcGFjZSBhbmQKKyAgICAgICAgLy8gbm8gZGlzdHJpYnV0aW9u
IGlzIG5lZWRlZCBhdCBhbGwuCisgICAgICAgIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUg
LT0gKGNlbGwuY29sdW1uU3BhbigpIC0gMSkgKiBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7Cisg
ICAgICAgIC8vIEZJWE1FOiBDaGVjayBpZiBmaXhlZCB3aWR0aCBjb2x1bW5zIHNob3VsZCBiZSBz
a2lwcGVkIGhlcmUuCisgICAgICAgIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWluaW11
bSA9IHN0ZDo6bWF4KExheW91dFVuaXQgeyB9LCB3aWR0aENvbnN0cmFpbnRzVG9EaXN0cmlidXRl
Lm1pbmltdW0gLyBjZWxsLmNvbHVtblNwYW4oKSk7CisgICAgICAgIHdpZHRoQ29uc3RyYWludHNU
b0Rpc3RyaWJ1dGUubWF4aW11bSA9IHN0ZDo6bWF4KExheW91dFVuaXQgeyB9LCB3aWR0aENvbnN0
cmFpbnRzVG9EaXN0cmlidXRlLm1heGltdW0gLyBjZWxsLmNvbHVtblNwYW4oKSk7CisgICAgICAg
IGlmICh3aWR0aENvbnN0cmFpbnRzVG9EaXN0cmlidXRlLm1pbmltdW0gfHwgd2lkdGhDb25zdHJh
aW50c1RvRGlzdHJpYnV0ZS5tYXhpbXVtKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBjb2x1
bW5TcGFuSW5kZXggPSBjZWxsLnN0YXJ0Q29sdW1uKCk7IGNvbHVtblNwYW5JbmRleCA8IGNlbGwu
ZW5kQ29sdW1uKCk7ICsrY29sdW1uU3BhbkluZGV4KQorICAgICAgICAgICAgICAgIGNvbHVtbklu
dHJpbnNpY1dpZHRoc1tjb2x1bW5TcGFuSW5kZXhdICs9IHdpZHRoQ29uc3RyYWludHNUb0Rpc3Ry
aWJ1dGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyA1LiBUaGUgZmluYWwgdGFibGUgbWlu
L21heCB3aWR0aHMgaXMganVzdCB0aGUgYWNjdW11bGF0ZWQgY29sdW1uIGNvbnN0cmFpbnRzLgor
ICAgIGF1dG8gdGFibGVXaWR0aENvbnN0cmFpbnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cyB7IH07CisgICAgZm9yIChhdXRvJiBjb2x1bW5JbnRyaW5zaWNXaWR0aCA6IGNvbHVtbkludHJp
bnNpY1dpZHRocykKKyAgICAgICAgdGFibGVXaWR0aENvbnN0cmFpbnRzICs9IGNvbHVtbkludHJp
bnNpY1dpZHRoOworICAgIC8vIEV4YXBhbmQgdGhlIHByZWZlcnJlZCB3aWR0aCB3aXRoIGxlYWRp
bmcgYW5kIHRyYWlsaW5nIGNlbGwgc3BhY2luZyAobm90ZSB0aGF0IGNvbHVtbiBzcGFubmVycyBj
b3VudCBhcyBvbmUgY2VsbCkuCisgICAgdGFibGVXaWR0aENvbnN0cmFpbnRzICs9IChudW1iZXJP
ZkFjdHVhbENvbHVtbnMgKyAxKSAqIGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKKyAgICByZXR1
cm4gdGFibGVXaWR0aENvbnN0cmFpbnRzOworfQorCit2b2lkIFRhYmxlRm9ybWF0dGluZ0NvbnRl
eHQ6OmNvbXB1dGVBbmREaXN0cmlidXRlRXh0cmFTcGFjZShMYXlvdXRVbml0IGF2YWlsYWJsZUhv
cml6b250YWxTcGFjZSwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlVmVydGljYWxTcGFj
ZSkKK3sKKyAgICAvLyBDb21wdXRlIGFuZCBiYWxhbmNlIHRoZSBjb2x1bW4gYW5kIHJvdyBzcGFj
ZXMuCisgICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpOworICAg
IGF1dG8mIGNvbHVtbnMgPSBncmlkLmNvbHVtbnMoKS5saXN0KCk7CisgICAgYXV0byB0YWJsZUxh
eW91dCA9IHRoaXMtPnRhYmxlTGF5b3V0KCk7CisKKyAgICAvLyBDb2x1bW5zIGZpcnN0LgorICAg
IGF1dG8gZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2VzID0gdGFibGVMYXlvdXQuZGlzdHJpYnV0
ZWRIb3Jpem9udGFsU3BhY2UoYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKKyAgICBBU1NFUlQo
ZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2VzLnNpemUoKSA9PSBjb2x1bW5zLnNpemUoKSk7Cisg
ICAgYXV0byBjb2x1bW5Mb2dpY2FsTGVmdCA9IGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKKyAg
ICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXpl
KCk7ICsrY29sdW1uSW5kZXgpIHsKKyAgICAgICAgYXV0byYgY29sdW1uID0gY29sdW1uc1tjb2x1
bW5JbmRleF07CisgICAgICAgIGNvbHVtbi5zZXRMb2dpY2FsTGVmdChjb2x1bW5Mb2dpY2FsTGVm
dCk7CisgICAgICAgIGNvbHVtbi5zZXRMb2dpY2FsV2lkdGgoZGlzdHJpYnV0ZWRIb3Jpem9udGFs
U3BhY2VzW2NvbHVtbkluZGV4XSk7CisgICAgICAgIGNvbHVtbkxvZ2ljYWxMZWZ0ICs9IGRpc3Ry
aWJ1dGVkSG9yaXpvbnRhbFNwYWNlc1tjb2x1bW5JbmRleF0gKyBncmlkLmhvcml6b250YWxTcGFj
aW5nKCk7CisgICAgfQorCisgICAgLy8gUm93cyBzZWNvbmQuCisgICAgYXV0byYgcm93cyA9IGdy
aWQucm93cygpLmxpc3QoKTsKKyAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4
IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAgICAgICAgZm9yIChzaXplX3QgY29sdW1u
SW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IGNvbHVtbnMuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7
CisgICAgICAgICAgICBhdXRvJiBzbG90ID0gKmdyaWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJ
bmRleCB9KTsKKyAgICAgICAgICAgIGlmIChzbG90LmlzUm93U3Bhbm5lZCgpKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGF5b3V0Q2VsbChzbG90LmNlbGwoKSwgYXZh
aWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKKyAgICAgICAgICAgIGlmIChzbG90Lmhhc1Jvd1NwYW4o
KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIFRoZSBtaW5pbXVt
IGhlaWdodCBvZiBhIHJvdyAod2l0aG91dCBzcGFubmluZy1yZWxhdGVkIGhlaWdodCBkaXN0cmli
dXRpb24pIGlzIGRlZmluZWQgYXMgdGhlIGhlaWdodCBvZiBhbiBoeXBvdGhldGljYWwKKyAgICAg
ICAgICAgIC8vIGxpbmVib3ggY29udGFpbmluZyB0aGUgY2VsbHMgb3JpZ2luYXRpbmcgaW4gdGhl
IHJvdy4KKyAgICAgICAgICAgIGF1dG8mIGNlbGwgPSBzbG90LmNlbGwoKTsKKyAgICAgICAgICAg
IGNlbGwuc2V0QmFzZWxpbmUoZ2VvbWV0cnkoKS51c2VkQmFzZWxpbmVGb3JDZWxsKGNlbGwuYm94
KCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gZGlzdHJpYnV0ZWRWZXJ0aWNhbFNw
YWNlcyA9IHRhYmxlTGF5b3V0LmRpc3RyaWJ1dGVkVmVydGljYWxTcGFjZShhdmFpbGFibGVWZXJ0
aWNhbFNwYWNlKTsKKyAgICBBU1NFUlQoZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNlcy5zaXplKCkg
PT0gcm93cy5zaXplKCkpOworICAgIGF1dG8gcm93TG9naWNhbFRvcCA9IGdyaWQudmVydGljYWxT
cGFjaW5nKCk7CisgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Mu
c2l6ZSgpOyArK3Jvd0luZGV4KSB7CisgICAgICAgIGF1dG8mIHJvdyA9IHJvd3Nbcm93SW5kZXhd
OworICAgICAgICByb3cuc2V0TG9naWNhbEhlaWdodChkaXN0cmlidXRlZFZlcnRpY2FsU3BhY2Vz
W3Jvd0luZGV4XSk7CisgICAgICAgIHJvdy5zZXRMb2dpY2FsVG9wKHJvd0xvZ2ljYWxUb3ApOwor
ICAgICAgICByb3dMb2dpY2FsVG9wICs9IGRpc3RyaWJ1dGVkVmVydGljYWxTcGFjZXNbcm93SW5k
ZXhdICsgZ3JpZC52ZXJ0aWNhbFNwYWNpbmcoKTsKKyAgICB9Cit9CisKK30KK30KKworI2VuZGlm
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3Rh
YmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdD
b250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uMWYzMGRlMTM1NDU2NjU1ODFlYjk0OWEyN2I4MGRmNGUxMjIy
NWU2ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQuaApAQCAtMCww
ICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
CisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9V
VF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgor
I2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiVGFibGVHcmlkLmgi
CisjaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYuaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIEludmFs
aWRhdGlvblN0YXRlOworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBsYXlvdXQgbG9naWMg
Zm9yIHRhYmxlIGZvcm1hdHRpbmcgY29udGV4dHMuCisvLyBodHRwczovL3d3dy53My5vcmcvVFIv
Q1NTMjIvdGFibGVzLmh0bWwKK2NsYXNzIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQgZmluYWwgOiBw
dWJsaWMgRm9ybWF0dGluZ0NvbnRleHQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFi
bGVGb3JtYXR0aW5nQ29udGV4dCk7CitwdWJsaWM6CisgICAgVGFibGVGb3JtYXR0aW5nQ29udGV4
dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgVGFibGVGb3JtYXR0
aW5nU3RhdGUmKTsKKyAgICB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3Rh
dGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSBvdmVycmlkZTsKKyAgICBM
YXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzdGF0
aWMgVW5pcXVlUmVmPFRhYmxlR3JpZD4gZW5zdXJlVGFibGVHcmlkKGNvbnN0IENvbnRhaW5lckJv
eCYgdGFibGVCb3gpOworCitwcml2YXRlOgorICAgIGNsYXNzIFRhYmxlTGF5b3V0IHsKKyAgICBw
dWJsaWM6CisgICAgICAgIFRhYmxlTGF5b3V0KGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQm
LCBjb25zdCBUYWJsZUdyaWQmKTsKKworICAgICAgICB1c2luZyBEaXN0cmlidXRlZFNwYWNlcyA9
IFZlY3RvcjxMYXlvdXRVbml0PjsKKyAgICAgICAgRGlzdHJpYnV0ZWRTcGFjZXMgZGlzdHJpYnV0
ZWRIb3Jpem9udGFsU3BhY2UoTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwor
ICAgICAgICBEaXN0cmlidXRlZFNwYWNlcyBkaXN0cmlidXRlZFZlcnRpY2FsU3BhY2UoT3B0aW9u
YWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlVmVydGljYWxTcGFjZSk7CisKKyAgICBwcml2YXRlOgor
ICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgp
IGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRleHQ7IH0KKworICAgICAgICBjb25zdCBU
YWJsZUZvcm1hdHRpbmdDb250ZXh0JiBtX2Zvcm1hdHRpbmdDb250ZXh0OworICAgICAgICBjb25z
dCBUYWJsZUdyaWQmIG1fZ3JpZDsKKyAgICB9OworCisgICAgY2xhc3MgR2VvbWV0cnkgOiBwdWJs
aWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIExh
eW91dFVuaXQgY2VsbEhlaWdoKGNvbnN0IENvbnRhaW5lckJveCYpIGNvbnN0OworICAgICAgICBF
ZGdlcyBjb21wdXRlZENlbGxCb3JkZXIoY29uc3QgVGFibGVHcmlkOjpDZWxsJikgY29uc3Q7Cisg
ICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbXB1dGVkQ29sdW1uV2lkdGgoY29uc3QgQ29u
dGFpbmVyQm94JiBjb2x1bW5Cb3gpOworICAgICAgICBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQ2VsbChjb25z
dCBUYWJsZUdyaWQ6OkNlbGwmKTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB1c2VkQmFzZWxp
bmVGb3JDZWxsKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCk7CisKKyAgICBwcml2YXRlOgor
ICAgICAgICBmcmllbmQgY2xhc3MgVGFibGVGb3JtYXR0aW5nQ29udGV4dDsKKyAgICAgICAgR2Vv
bWV0cnkoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYsIGNvbnN0IFRhYmxlR3JpZCYpOwor
CisgICAgICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0
KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8VGFibGVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0
dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpmb3JtYXR0aW5nQ29udGV4dCgpKTsgfQorICAgICAgICBj
b25zdCBUYWJsZUdyaWQmIG1fZ3JpZDsKKyAgICB9OworICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMsIGZv
cm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpKTsgfQorCisgICAgY2xhc3MgUXVpcmtzIDogcHVi
bGljIEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgeworICAgIHB1YmxpYzoKKyAgICAgICAgUXVp
cmtzKGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmKTsKKworICAgICAgICBib29sIHNob3Vs
ZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luKGNvbnN0IENvbnRhaW5lckJveCYpIGNv
bnN0OworCisgICAgICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdD
b250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8VGFibGVGb3JtYXR0aW5nQ29udGV4dD4o
Rm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KKyAgICAg
ICAgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJl
dHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCk7IH0KKyAgICB9OworICAgIFRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3Mo
KnRoaXMpOyB9CisKKyAgICBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dCB0YWJs
ZUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIFRhYmxlTGF5b3V0KCp0aGlzLCBmb3JtYXR0aW5nU3Rh
dGUoKS50YWJsZUdyaWQoKSk7IH0KKworICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29t
cHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBsYXlv
dXRDZWxsKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYsIExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpv
bnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkQ2VsbEhlaWdodCA9IFdURjo6bnVs
bG9wdCk7CisgICAgdm9pZCBzZXRVc2VkR2VvbWV0cnlGb3JDZWxscyhMYXlvdXRVbml0IGF2YWls
YWJsZUhvcml6b250YWxTcGFjZSk7CisgICAgdm9pZCBzZXRVc2VkR2VvbWV0cnlGb3JSb3dzKExh
eW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKKyAgICB2b2lkIHNldFVzZWRHZW9t
ZXRyeUZvclNlY3Rpb25zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOworCisg
ICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBjb21wdXRlZFByZWZlcnJlZFdpZHRoRm9yQ29s
dW1ucygpOworICAgIHZvaWQgY29tcHV0ZUFuZERpc3RyaWJ1dGVFeHRyYVNwYWNlKExheW91dFVu
aXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFi
bGVWZXJ0aWNhbFNwYWNlKTsKKworICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3Jt
YXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxUYWJsZUZvcm1hdHRpbmdTdGF0
ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQorICAgIFRhYmxlRm9y
bWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3duY2FzdDxUYWJsZUZv
cm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQor
fTsKKworaW5saW5lIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpHZW9tZXRyeShj
b25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiB0YWJsZUZvcm1hdHRpbmdDb250ZXh0LCBjb25z
dCBUYWJsZUdyaWQmIGdyaWQpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkodGFi
bGVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1fZ3JpZChncmlkKQoreworfQorCitpbmxpbmUg
VGFibGVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpRdWlya3MoY29uc3QgVGFibGVGb3JtYXR0
aW5nQ29udGV4dCYgdGFibGVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICA6IEZvcm1hdHRpbmdDb250
ZXh0OjpRdWlya3ModGFibGVGb3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworfQorfQorCitTUEVD
SUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoVGFibGVGb3JtYXR0
aW5nQ29udGV4dCwgaXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkpCisKKyNlbmRpZgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1h
dHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGlu
Z0NvbnRleHRHZW9tZXRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZDczMjM5MjY5NGY2ZTdhODI0MjljMjBh
NWU2MTA5ODQwZTJhZWRjOAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRl
eHRHZW9tZXRyeS5jcHAKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYgRU5B
QkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0
aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxh
eW91dENvbnRleHQuaCIKKyNpbmNsdWRlICJMYXlvdXREZXNjZW5kYW50SXRlcmF0b3IuaCIKKyNp
bmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiVGFibGVG
b3JtYXR0aW5nU3RhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91
dCB7CisKK0xheW91dFVuaXQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNlbGxI
ZWlnaChjb25zdCBDb250YWluZXJCb3gmIGNlbGxCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGNl
bGxCb3guaXNJbkZsb3coKSk7CisgICAgYXV0byBjb250ZW50SGVpZ2h0ID0gTGF5b3V0VW5pdCB7
IH07CisgICAgaWYgKGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkSWdub3JlQ2hp
bGRDb250ZW50VmVydGljYWxNYXJnaW4oY2VsbEJveCkpIHsKKyAgICAgICAgQVNTRVJUKGNlbGxC
b3guZmlyc3RJbkZsb3dDaGlsZCgpKTsKKyAgICAgICAgYXV0byBmb3JtYXR0aW5nQ29udGV4dCA9
IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7CisgICAgICAgIGF1dG8mIGZpcnN0SW5GbG93Q2hp
bGQgPSAqY2VsbEJveC5maXJzdEluRmxvd0NoaWxkKCk7CisgICAgICAgIGF1dG8mIGxhc3RJbkZs
b3dDaGlsZCA9ICpjZWxsQm94Lmxhc3RJbkZsb3dDaGlsZCgpOworICAgICAgICBhdXRvJiBmaXJz
dEluRmxvd0NoaWxkR2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChm
aXJzdEluRmxvd0NoaWxkLCBFc2NhcGVSZWFzb246OlRhYmxlUXVpcmtOZWVkc0dlb21ldHJ5RnJv
bUVzdGFibGlzaGVkRm9ybWF0dGluZ0NvbnRleHQpOworICAgICAgICBhdXRvJiBsYXN0SW5GbG93
Q2hpbGRHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxhc3RJbkZs
b3dDaGlsZCwgRXNjYXBlUmVhc29uOjpUYWJsZVF1aXJrTmVlZHNHZW9tZXRyeUZyb21Fc3RhYmxp
c2hlZEZvcm1hdHRpbmdDb250ZXh0KTsKKworICAgICAgICBhdXRvIHRvcCA9IGZpcnN0SW5GbG93
Q2hpbGQuc3R5bGUoKS5oYXNNYXJnaW5CZWZvcmVRdWlyaygpID8gQm94R2VvbWV0cnk6OmJvcmRl
ckJveFJlY3QoZmlyc3RJbkZsb3dDaGlsZEdlb21ldHJ5KS50b3AoKSA6IEJveEdlb21ldHJ5Ojpt
YXJnaW5Cb3hSZWN0KGZpcnN0SW5GbG93Q2hpbGRHZW9tZXRyeSkudG9wKCk7CisgICAgICAgIGF1
dG8gYm90dG9tID0gbGFzdEluRmxvd0NoaWxkLnN0eWxlKCkuaGFzTWFyZ2luQWZ0ZXJRdWlyaygp
ID8gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QobGFzdEluRmxvd0NoaWxkR2VvbWV0cnkpLmJv
dHRvbSgpIDogQm94R2VvbWV0cnk6Om1hcmdpbkJveFJlY3QobGFzdEluRmxvd0NoaWxkR2VvbWV0
cnkpLmJvdHRvbSgpOworICAgICAgICBjb250ZW50SGVpZ2h0ID0gYm90dG9tIC0gdG9wOworICAg
IH0gZWxzZQorICAgICAgICBjb250ZW50SGVpZ2h0ID0gY29udGVudEhlaWdodEZvckZvcm1hdHRp
bmdDb250ZXh0Um9vdChjZWxsQm94KTsKKyAgICByZXR1cm4gc3RkOjptYXgoY29tcHV0ZWRIZWln
aHQoY2VsbEJveCkudmFsdWVPcigwX2x1KSwgY29udGVudEhlaWdodCk7Cit9CisKK0VkZ2VzIFRh
YmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZENlbGxCb3JkZXIoY29uc3Qg
VGFibGVHcmlkOjpDZWxsJiBjZWxsKSBjb25zdAoreworICAgIGF1dG8mIGNlbGxCb3ggPSBjZWxs
LmJveCgpOworICAgIGF1dG8gYm9yZGVyID0gY29tcHV0ZWRCb3JkZXIoY2VsbEJveCk7CisgICAg
YXV0byBjb2xsYXBzZWRCb3JkZXIgPSBtX2dyaWQuY29sbGFwc2VkQm9yZGVyKCk7CisgICAgaWYg
KCFjb2xsYXBzZWRCb3JkZXIpCisgICAgICAgIHJldHVybiBib3JkZXI7CisKKyAgICAvLyBXZSBt
aWdodCB3YW50IHRvIGNhY2hlIHRoZXNlIGNvbGxhcHNlZCBib3JkZXJzIG9uIHRoZSBncmlkLgor
ICAgIGF1dG8gY2VsbFBvc2l0aW9uID0gY2VsbC5wb3NpdGlvbigpOworICAgIC8vIENvbGxhcHNl
ZCBib3JkZXIgbGVmdCBmcm9tIHRhYmxlIGFuZCBhZGphY2VudCBjZWxscy4KKyAgICBpZiAoIWNl
bGxQb3NpdGlvbi5jb2x1bW4pCisgICAgICAgIGJvcmRlci5ob3Jpem9udGFsLmxlZnQgPSBjb2xs
YXBzZWRCb3JkZXItPmhvcml6b250YWwubGVmdCAvIDI7CisgICAgZWxzZSB7CisgICAgICAgIGF1
dG8gYWRqYWNlbnRCb3JkZXJSaWdodCA9IGNvbXB1dGVkQm9yZGVyKG1fZ3JpZC5zbG90KHsgY2Vs
bFBvc2l0aW9uLmNvbHVtbiAtIDEsIGNlbGxQb3NpdGlvbi5yb3cgfSktPmNlbGwoKS5ib3goKSku
aG9yaXpvbnRhbC5yaWdodDsKKyAgICAgICAgYm9yZGVyLmhvcml6b250YWwubGVmdCA9IHN0ZDo6
bWF4KGJvcmRlci5ob3Jpem9udGFsLmxlZnQsIGFkamFjZW50Qm9yZGVyUmlnaHQpIC8gMjsKKyAg
ICB9CisgICAgLy8gQ29sbGFwc2VkIGJvcmRlciByaWdodCBmcm9tIHRhYmxlIGFuZCBhZGphY2Vu
dCBjZWxscy4KKyAgICBpZiAoY2VsbFBvc2l0aW9uLmNvbHVtbiA9PSBtX2dyaWQuY29sdW1ucygp
LnNpemUoKSAtIDEpCisgICAgICAgIGJvcmRlci5ob3Jpem9udGFsLnJpZ2h0ID0gY29sbGFwc2Vk
Qm9yZGVyLT5ob3Jpem9udGFsLnJpZ2h0IC8gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgYXV0byBh
ZGphY2VudEJvcmRlckxlZnQgPSBjb21wdXRlZEJvcmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3Np
dGlvbi5jb2x1bW4gKyAxLCBjZWxsUG9zaXRpb24ucm93IH0pLT5jZWxsKCkuYm94KCkpLmhvcml6
b250YWwubGVmdDsKKyAgICAgICAgYm9yZGVyLmhvcml6b250YWwucmlnaHQgPSBzdGQ6Om1heChi
b3JkZXIuaG9yaXpvbnRhbC5yaWdodCwgYWRqYWNlbnRCb3JkZXJMZWZ0KSAvIDI7CisgICAgfQor
ICAgIC8vIENvbGxhcHNlZCBib3JkZXIgdG9wIGZyb20gdGFibGUsIHJvdyBhbmQgYWRqYWNlbnQg
Y2VsbHMuCisgICAgYXV0byYgcm93cyA9IG1fZ3JpZC5yb3dzKCkubGlzdCgpOworICAgIGlmICgh
Y2VsbFBvc2l0aW9uLnJvdykKKyAgICAgICAgYm9yZGVyLnZlcnRpY2FsLnRvcCA9IGNvbGxhcHNl
ZEJvcmRlci0+dmVydGljYWwudG9wIC8gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgYXV0byBhZGph
Y2VudEJvcmRlckJvdHRvbSA9IGNvbXB1dGVkQm9yZGVyKG1fZ3JpZC5zbG90KHsgY2VsbFBvc2l0
aW9uLmNvbHVtbiwgY2VsbFBvc2l0aW9uLnJvdyAtIDEgfSktPmNlbGwoKS5ib3goKSkudmVydGlj
YWwuYm90dG9tOworICAgICAgICBhdXRvIGFkamFjZW50Um93Qm90dG9tID0gY29tcHV0ZWRCb3Jk
ZXIocm93c1tjZWxsUG9zaXRpb24ucm93IC0gMV0uYm94KCkpLnZlcnRpY2FsLmJvdHRvbTsKKyAg
ICAgICAgYXV0byBhZGphY2VudENvbGxhcHNlZEJvcmRlciA9IHN0ZDo6bWF4KGFkamFjZW50Qm9y
ZGVyQm90dG9tLCBhZGphY2VudFJvd0JvdHRvbSk7CisgICAgICAgIGJvcmRlci52ZXJ0aWNhbC50
b3AgPSBzdGQ6Om1heChib3JkZXIudmVydGljYWwudG9wLCBhZGphY2VudENvbGxhcHNlZEJvcmRl
cikgLyAyOworICAgIH0KKyAgICAvLyBDb2xsYXBzZWQgYm9yZGVyIGJvdHRvbSBmcm9tIHRhYmxl
LCByb3cgYW5kIGFkamFjZW50IGNlbGxzLgorICAgIGlmIChjZWxsUG9zaXRpb24ucm93ID09IG1f
Z3JpZC5yb3dzKCkuc2l6ZSgpIC0gMSkKKyAgICAgICAgYm9yZGVyLnZlcnRpY2FsLmJvdHRvbSA9
IGNvbGxhcHNlZEJvcmRlci0+dmVydGljYWwuYm90dG9tIC8gMjsKKyAgICBlbHNlIHsKKyAgICAg
ICAgYXV0byBhZGphY2VudEJvcmRlclRvcCA9IGNvbXB1dGVkQm9yZGVyKG1fZ3JpZC5zbG90KHsg
Y2VsbFBvc2l0aW9uLmNvbHVtbiwgY2VsbFBvc2l0aW9uLnJvdyArIDEgfSktPmNlbGwoKS5ib3go
KSkudmVydGljYWwudG9wOworICAgICAgICBhdXRvIGFkamFjZW50Um93VG9wID0gY29tcHV0ZWRC
b3JkZXIocm93c1tjZWxsUG9zaXRpb24ucm93ICsgMV0uYm94KCkpLnZlcnRpY2FsLnRvcDsKKyAg
ICAgICAgYXV0byBhZGphY2VudENvbGxhcHNlZEJvcmRlciA9IHN0ZDo6bWF4KGFkamFjZW50Qm9y
ZGVyVG9wLCBhZGphY2VudFJvd1RvcCk7CisgICAgICAgIGJvcmRlci52ZXJ0aWNhbC5ib3R0b20g
PSBzdGQ6Om1heChib3JkZXIudmVydGljYWwuYm90dG9tLCBhZGphY2VudENvbGxhcHNlZEJvcmRl
cikgLyAyOworICAgIH0KKyAgICByZXR1cm4gYm9yZGVyOworfQorCitPcHRpb25hbDxMYXlvdXRV
bml0PiBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRDb2x1bW5XaWR0
aChjb25zdCBDb250YWluZXJCb3gmIGNvbHVtbkJveCkKK3sKKyAgICAvLyBDaGVjayBib3RoIHN0
eWxlIGFuZCA8Y29sPidzIHdpZHRoIGF0dHJpYnV0ZS4KKyAgICAvLyBGSVhNRTogRmlndXJlIG91
dCB3aGF0IHRvIGRvIHdpdGggY2FsY3VsYXRlZCB2YWx1ZXMsIGxpa2UgPGNvbCBzdHlsZT0id2lk
dGg6IDEwJSI+LgorICAgIGlmIChhdXRvIGNvbXB1dGVkV2lkdGhWYWx1ZSA9IGNvbXB1dGVkV2lk
dGgoY29sdW1uQm94LCB7IH0pKQorICAgICAgICByZXR1cm4gY29tcHV0ZWRXaWR0aFZhbHVlOwor
ICAgIHJldHVybiBjb2x1bW5Cb3guY29sdW1uV2lkdGgoKTsKK30KKworRm9ybWF0dGluZ0NvbnRl
eHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnk6OmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JDZWxsKGNvbnN0IFRhYmxlR3JpZDo6
Q2VsbCYgY2VsbCkKK3sKKyAgICBhdXRvJiBjZWxsQm94ID0gY2VsbC5ib3goKTsKKyAgICBhdXRv
JiBzdHlsZSA9IGNlbGxCb3guc3R5bGUoKTsKKworICAgIGF1dG8gY29tcHV0ZWRJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzID0gWyZdKCkgLT4gRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMgeworICAgICAgICAvLyBFdmVuIGZpeGVkIHdpZHRoIGNlbGxzIGV4cGFu
ZCB0byB0aGVpciBtaW5pbXVtIGNvbnRlbnQgd2lkdGgKKyAgICAgICAgLy8gPHRkIHN0eWxlPSJ3
aWR0aDogMTBweCI+dGVzdF9jb250ZW50PC90ZD4gd2lsbCBzaXplIHRvIG1heChtaW5pbXVtIGNv
bnRlbnQgd2lkdGgsIGNvbXB1dGVkIHdpZHRoKS4KKyAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzID0gRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMgeyB9OworICAgICAgICBpZiAoY2VsbEJveC5oYXNDaGlsZCgpKQorICAgICAgICAgICAgaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdD
b250ZXh0KGNlbGxCb3gsIGxheW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMoKTsKKyAgICAgICAgaWYgKGF1dG8gZml4ZWRXaWR0aCA9IGZpeGVkVmFsdWUoc3R5
bGUubG9naWNhbFdpZHRoKCkpKQorICAgICAgICAgICAgcmV0dXJuIHsgc3RkOjptYXgoaW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtLCAqZml4ZWRXaWR0aCksIHN0ZDo6bWF4KGludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgKmZpeGVkV2lkdGgpIH07CisgICAgICAgIHJl
dHVybiBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOworICAgIH07CisgICAgLy8gRklYTUUgQ2hl
Y2sgZm9yIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzID0gY29uc3RyYWluQnlNaW5NYXhXaWR0aChjZWxsQm94LCBjb21wdXRlZEludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMoKSk7CisgICAgLy8gRXhwYW5kIHdpdGggYm9yZGVyCisgICAg
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQoY29tcHV0ZWRDZWxsQm9yZGVyKGNlbGwp
LndpZHRoKCkpOworICAgIC8vIHBhZGRpbmcKKyAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
LmV4cGFuZChmaXhlZFZhbHVlKHN0eWxlLnBhZGRpbmdMZWZ0KCkpLnZhbHVlT3IoMCkgKyBmaXhl
ZFZhbHVlKHN0eWxlLnBhZGRpbmdSaWdodCgpKS52YWx1ZU9yKDApKTsKKyAgICAvLyBhbmQgbWFy
Z2luCisgICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQoZml4ZWRWYWx1ZShzdHls
ZS5tYXJnaW5TdGFydCgpKS52YWx1ZU9yKDApICsgZml4ZWRWYWx1ZShzdHlsZS5tYXJnaW5FbmQo
KSkudmFsdWVPcigwKSk7CisgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Cit9
CisKKworSW5saW5lTGF5b3V0VW5pdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6
dXNlZEJhc2VsaW5lRm9yQ2VsbChjb25zdCBDb250YWluZXJCb3gmIGNlbGxCb3gpCit7CisgICAg
Ly8gVGhlIGJhc2VsaW5lIG9mIGEgY2VsbCBpcyBkZWZpbmVkIGFzIHRoZSBiYXNlbGluZSBvZiB0
aGUgZmlyc3QgaW4tZmxvdyBsaW5lIGJveCBpbiB0aGUgY2VsbCwKKyAgICAvLyBvciB0aGUgZmly
c3QgaW4tZmxvdyB0YWJsZS1yb3cgaW4gdGhlIGNlbGwsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4K
KyAgICAvLyBJZiB0aGVyZSBpcyBubyBzdWNoIGxpbmUgYm94LCB0aGUgYmFzZWxpbmUgaXMgdGhl
IGJvdHRvbSBvZiBjb250ZW50IGVkZ2Ugb2YgdGhlIGNlbGwgYm94LgorICAgIGlmIChjZWxsQm94
LmVzdGFibGlzaGVzSW5saW5lRm9ybWF0dGluZ0NvbnRleHQoKSkKKyAgICAgICAgcmV0dXJuIGxh
eW91dFN0YXRlKCkuZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUoY2VsbEJveCkubGlu
ZXMoKVswXS5iYXNlbGluZSgpOworICAgIGZvciAoYXV0byYgY2VsbERlc2NlbmRhbnQgOiBkZXNj
ZW5kYW50c09mVHlwZTxDb250YWluZXJCb3g+KGNlbGxCb3gpKSB7CisgICAgICAgIGlmIChjZWxs
RGVzY2VuZGFudC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpIHsKKyAgICAg
ICAgICAgIGF1dG8mIGlubGluZUZvcm1hdHRpbmdTdGF0ZUZvckNlbGwgPSBsYXlvdXRTdGF0ZSgp
LmVzdGFibGlzaGVkSW5saW5lRm9ybWF0dGluZ1N0YXRlKGNlbGxEZXNjZW5kYW50KTsKKyAgICAg
ICAgICAgIGlmICghaW5saW5lRm9ybWF0dGluZ1N0YXRlRm9yQ2VsbC5saW5lcygpLmlzRW1wdHko
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5saW5lRm9ybWF0dGluZ1N0YXRlRm9yQ2VsbC5s
aW5lcygpWzBdLmJhc2VsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNlbGxEZXNjZW5k
YW50LmVzdGFibGlzaGVzVGFibGVGb3JtYXR0aW5nQ29udGV4dCgpKQorICAgICAgICAgICAgcmV0
dXJuIGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRUYWJsZUZvcm1hdHRpbmdTdGF0ZShjZWxsRGVz
Y2VuZGFudCkudGFibGVHcmlkKCkucm93cygpLmxpc3QoKVswXS5iYXNlbGluZSgpOworICAgIH0K
KyAgICByZXR1cm4gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChjZWxsQm94KS5j
b250ZW50Qm94Qm90dG9tKCk7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJs
ZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRRdWly
a3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLmI2NGE2MmRmZjA3MTRhZDY4ZmE3ODk2ODVmYmJiMjEzNzRmZjE1
MzIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApA
QCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIlRhYmxlRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQorCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0
Q29udGFpbmVyQm94LmgiCisjaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2Jvb2wgVGFibGVGb3JtYXR0aW5nQ29udGV4
dDo6UXVpcmtzOjpzaG91bGRJZ25vcmVDaGlsZENvbnRlbnRWZXJ0aWNhbE1hcmdpbihjb25zdCBD
b250YWluZXJCb3gmIGNlbGxCb3gpIGNvbnN0Cit7CisgICAgLy8gTm9ybWFsbHkgQkZDIHJvb3Qg
Y29udGVudCBoZWlnaHQgdGFrZXMgdGhlIG1hcmdpbiBib3ggb2YgdGhlIGNoaWxkIGNvbnRlbnQg
YXMgdmVydGljYWwgbWFyZ2lucyBkb24ndCBjb2xsYXBzZSB3aXRoIEJGQyByb290cywKKyAgICAv
LyBidXQgdGFibGUgY2VsbCBib3hlcyBkbyBjb2xsYXBzZSB0aGVpciAobm9uLWV4aXN0aW5nKSBt
YXJnaW5zIHdpdGggY2hpbGQgcXVpcmsgbWFyZ2lucyAoc28gbXVjaCBxdWlyayksIHNvIGhlcmUg
d2UgY2hlY2sKKyAgICAvLyBpZiB0aGUgY29udGVudCBoZWlnaHQgc2hvdWxkIGluY2x1ZGUgbWFy
Z2lucyBvciBub3QuCisgICAgLy8gZS5nIDx0YWJsZT48dHI+PHRkPjxwPnRleHQgY29udGVudDwv
dGQ+PC90cj48L3RhYmxlPiA8LSA8cD4ncyBxdWlyayBtYXJnaW4gY29sbGFwc2VzIHdpdGggdGhl
IDx0ZD4gc28gaXRzIGNvbnRlbnQKKyAgICAvLyBoZWlnaHQgc2hvdWxkIG5vdCBpbmNsdWRlIHZl
cnRpY2FsIG1hcmdpbnMuCisgICAgaWYgKCFsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGNlbGxCb3guZXN0YWJsaXNoZXNJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFjZWxs
Qm94Lmhhc0luRmxvd0NoaWxkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4g
Y2VsbEJveC5maXJzdEluRmxvd0NoaWxkKCktPnN0eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmso
KSB8fCBjZWxsQm94Lmxhc3RJbkZsb3dDaGlsZCgpLT5zdHlsZSgpLmhhc01hcmdpbkFmdGVyUXVp
cmsoKTsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0
YXRlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVm
b3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xMzEwZWY1ZTEz
MjYwZDFhMzFmYjFkOWU4NmUyYzZiNjIzYTY1OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVG
b3JtYXR0aW5nU3RhdGUuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIKKworI2lmIEVO
QUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0
aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxMT0NB
VEVEX0lNUEwoVGFibGVGb3JtYXR0aW5nU3RhdGUpOworCitUYWJsZUZvcm1hdHRpbmdTdGF0ZTo6
VGFibGVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYgZmxvYXRpbmdTdGF0ZSwg
TGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KQor
ICAgIDogRm9ybWF0dGluZ1N0YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OlRhYmxl
LCBsYXlvdXRTdGF0ZSkKKyAgICAsIG1fdGFibGVHcmlkKFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6
OmVuc3VyZVRhYmxlR3JpZCh0YWJsZUJveCkpCit7Cit9CisKK1RhYmxlRm9ybWF0dGluZ1N0YXRl
Ojp+VGFibGVGb3JtYXR0aW5nU3RhdGUoKQoreworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0
aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjdkMWU0YWYwYjk2YWNjNGQzNDM0NWFhOWNmNmQ4M2Y3OGQ1M2M3NmYKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxl
Zm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQorCisjaW5jbHVkZSAiRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiVGFibGVHcmlk
LmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKKy8vIFRhYmxl
Rm9ybWF0dGluZ1N0YXRlIGhvbGRzIHRoZSBzdGF0ZSBmb3IgYSBwYXJ0aWN1bGFyIHRhYmxlIGZv
cm1hdHRpbmcgY29udGV4dCB0cmVlLgorY2xhc3MgVGFibGVGb3JtYXR0aW5nU3RhdGUgOiBwdWJs
aWMgRm9ybWF0dGluZ1N0YXRlIHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKFRhYmxlRm9y
bWF0dGluZ1N0YXRlKTsKK3B1YmxpYzoKKyAgICBUYWJsZUZvcm1hdHRpbmdTdGF0ZShSZWY8Rmxv
YXRpbmdTdGF0ZT4mJiwgTGF5b3V0U3RhdGUmLCBjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94
KTsKKyAgICB+VGFibGVGb3JtYXR0aW5nU3RhdGUoKTsKKworICAgIFRhYmxlR3JpZCYgdGFibGVH
cmlkKCkgeyByZXR1cm4gbV90YWJsZUdyaWQ7IH0KKyAgICBjb25zdCBUYWJsZUdyaWQmIHRhYmxl
R3JpZCgpIGNvbnN0IHsgcmV0dXJuIG1fdGFibGVHcmlkOyB9CisKK3ByaXZhdGU6CisgICAgVW5p
cXVlUmVmPFRhYmxlR3JpZD4gbV90YWJsZUdyaWQ7Cit9OworCit9Cit9CisKK1NQRUNJQUxJWkVf
VFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUoVGFibGVGb3JtYXR0aW5nU3RhdGUs
IGlzVGFibGVGb3JtYXR0aW5nU3RhdGUoKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUdy
aWQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZv
cm1hdHRpbmcvVGFibGVHcmlkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zYzQxZDhkMDhhNTI1ZTc1NmFiY2Rj
YjFhMjE1YzlmNDY1NmFjZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmNwcApAQCAt
MCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJUYWJsZUdyaWQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQor
CisjaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworbmFtZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChUYWJs
ZUdyaWQpOworCitUYWJsZUdyaWQ6OkNvbHVtbjo6Q29sdW1uKGNvbnN0IENvbnRhaW5lckJveCog
Y29sdW1uQm94KQorICAgIDogbV9sYXlvdXRCb3gobWFrZVdlYWtQdHIoY29sdW1uQm94KSkKK3sK
K30KKwordm9pZCBUYWJsZUdyaWQ6OkNvbHVtbjo6c2V0TG9naWNhbFdpZHRoKExheW91dFVuaXQg
Y29tcHV0ZWRMb2dpY2FsV2lkdGgpCit7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICBtX2hhc0Nv
bXB1dGVkV2lkdGggPSB0cnVlOworI2VuZGlmCisgICAgbV9jb21wdXRlZExvZ2ljYWxXaWR0aCA9
IGNvbXB1dGVkTG9naWNhbFdpZHRoOworfQorCitMYXlvdXRVbml0IFRhYmxlR3JpZDo6Q29sdW1u
Ojpsb2dpY2FsV2lkdGgoKSBjb25zdAoreworICAgIEFTU0VSVChtX2hhc0NvbXB1dGVkV2lkdGgp
OworICAgIHJldHVybiBtX2NvbXB1dGVkTG9naWNhbFdpZHRoOworfQorCit2b2lkIFRhYmxlR3Jp
ZDo6Q29sdW1uOjpzZXRMb2dpY2FsTGVmdChMYXlvdXRVbml0IGNvbXB1dGVkTG9naWNhbExlZnQp
Cit7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICBtX2hhc0NvbXB1dGVkTGVmdCA9IHRydWU7Cisj
ZW5kaWYKKyAgICBtX2NvbXB1dGVkTG9naWNhbExlZnQgPSBjb21wdXRlZExvZ2ljYWxMZWZ0Owor
fQorCitMYXlvdXRVbml0IFRhYmxlR3JpZDo6Q29sdW1uOjpsb2dpY2FsTGVmdCgpIGNvbnN0Cit7
CisgICAgQVNTRVJUKG1faGFzQ29tcHV0ZWRMZWZ0KTsKKyAgICByZXR1cm4gbV9jb21wdXRlZExv
Z2ljYWxMZWZ0OworfQorCitib29sIFRhYmxlR3JpZDo6Q29sdW1uOjppc0ZpeGVkV2lkdGgoKSBj
b25zdAoreworICAgIHJldHVybiBoYXNGaXhlZFdpZHRoQ2VsbCgpIHx8IChib3goKSAmJiBib3go
KS0+Y29sdW1uV2lkdGgoKSk7Cit9CisKK3ZvaWQgVGFibGVHcmlkOjpDb2x1bW5zOjphZGRDb2x1
bW4oY29uc3QgQ29udGFpbmVyQm94JiBjb2x1bW5Cb3gpCit7CisgICAgbV9jb2x1bW5MaXN0LmFw
cGVuZCh7ICZjb2x1bW5Cb3ggfSk7Cit9CisKK3ZvaWQgVGFibGVHcmlkOjpDb2x1bW5zOjphZGRB
bm9ueW1vdXNDb2x1bW4oKQoreworICAgIG1fY29sdW1uTGlzdC5hcHBlbmQoeyBudWxscHRyIH0p
OworfQorCitib29sIFRhYmxlR3JpZDo6Q29sdW1uczo6aGFzRml4ZWRDb2x1bW5zT25seSgpIGNv
bnN0Cit7CisgICAgZm9yIChhdXRvJiBjb2x1bW4gOiBtX2NvbHVtbkxpc3QpIHsKKyAgICAgICAg
aWYgKCFjb2x1bW4uaXNGaXhlZFdpZHRoKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRhYmxlR3JpZDo6Um93czo6YWRkUm93
KGNvbnN0IENvbnRhaW5lckJveCYgcm93Qm94KQoreworICAgIG1fcm93TGlzdC5hcHBlbmQoeyBy
b3dCb3ggfSk7Cit9CisKK1RhYmxlR3JpZDo6Um93OjpSb3coY29uc3QgQ29udGFpbmVyQm94JiBy
b3dCb3gpCisgICAgOiBtX2xheW91dEJveChtYWtlV2Vha1B0cihyb3dCb3gpKQoreworfQorCitU
YWJsZUdyaWQ6OkNlbGw6OkNlbGwoY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94LCBTbG90UG9z
aXRpb24gcG9zaXRpb24sIENlbGxTcGFuIHNwYW4pCisgICAgOiBtX2xheW91dEJveChtYWtlV2Vh
a1B0cihjZWxsQm94KSkKKyAgICAsIG1fcG9zaXRpb24ocG9zaXRpb24pCisgICAgLCBtX3NwYW4o
c3BhbikKK3sKK30KKworYm9vbCBUYWJsZUdyaWQ6OkNlbGw6OmlzRml4ZWRXaWR0aCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGJveCgpLnN0eWxlKCkubG9naWNhbFdpZHRoKCkuaXNGaXhlZCgpOwor
fQorCitUYWJsZUdyaWQ6OlNsb3Q6OlNsb3QoQ2VsbCYgY2VsbCwgYm9vbCBpc0NvbHVtblNwYW5u
ZWQsIGJvb2wgaXNSb3dTcGFubmVkKQorICAgIDogbV9jZWxsKG1ha2VXZWFrUHRyKGNlbGwpKQor
ICAgICwgbV9pc0NvbHVtblNwYW5uZWQoaXNDb2x1bW5TcGFubmVkKQorICAgICwgbV9pc1Jvd1Nw
YW5uZWQoaXNSb3dTcGFubmVkKQoreworfQorCitUYWJsZUdyaWQ6OlRhYmxlR3JpZCgpCit7Cit9
CisKK1RhYmxlR3JpZDo6U2xvdCogVGFibGVHcmlkOjpzbG90KFNsb3RQb3NpdGlvbiBwb3NpdGlv
bikKK3sKKyAgICByZXR1cm4gbV9zbG90TWFwLmdldChwb3NpdGlvbik7Cit9CisKK3ZvaWQgVGFi
bGVHcmlkOjphcHBlbmRDZWxsKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCkKK3sKKyAgICBh
dXRvIHJvd1NwYW4gPSBjZWxsQm94LnJvd1NwYW4oKTsKKyAgICBhdXRvIGNvbHVtblNwYW4gPSBj
ZWxsQm94LmNvbHVtblNwYW4oKTsKKyAgICBhdXRvIGlzSW5OZXdSb3cgPSAhY2VsbEJveC5wcmV2
aW91c1NpYmxpbmcoKTsKKyAgICBhdXRvIGluaXRpYWxTbG90UG9zaXRpb24gPSBTbG90UG9zaXRp
b24geyB9OworCisgICAgaWYgKCFtX2NlbGxzLmlzRW1wdHkoKSkgeworICAgICAgICBhdXRvJiBs
YXN0Q2VsbCA9IG1fY2VsbHMubGFzdCgpOworICAgICAgICBhdXRvIGxhc3RTbG90UG9zaXRpb24g
PSBsYXN0Q2VsbC0+cG9zaXRpb24oKTsKKyAgICAgICAgLy8gRmlyc3QgdGFibGUgY2VsbCBpbiB0
aGlzIHJvdz8KKyAgICAgICAgaWYgKGlzSW5OZXdSb3cpCisgICAgICAgICAgICBpbml0aWFsU2xv
dFBvc2l0aW9uID0gU2xvdFBvc2l0aW9uIHsgMCwgbGFzdFNsb3RQb3NpdGlvbi5yb3cgKyAxIH07
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluaXRpYWxTbG90UG9zaXRpb24gPSBTbG90UG9z
aXRpb24geyBsYXN0U2xvdFBvc2l0aW9uLmNvbHVtbiArIDEsIGxhc3RTbG90UG9zaXRpb24ucm93
IH07CisKKyAgICAgICAgLy8gUGljayB0aGUgbmV4dCBhdmFpbGFibGUgc2xvdCBieSBhdm9pZGlu
ZyByb3cgYW5kIGNvbHVtbiBzcGFubmVycy4KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAg
ICAgICAgIGlmICghbV9zbG90TWFwLmNvbnRhaW5zKGluaXRpYWxTbG90UG9zaXRpb24pKQorICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKytpbml0aWFsU2xvdFBvc2l0aW9uLmNv
bHVtbjsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdXRvIGNlbGwgPSBtYWtlVW5pcXVlPENlbGw+
KGNlbGxCb3gsIGluaXRpYWxTbG90UG9zaXRpb24sIENlbGxTcGFuIHsgY29sdW1uU3Bhbiwgcm93
U3BhbiB9KTsKKyAgICAvLyBSb3cgYW5kIGNvbHVtbiBzcGFubmVycyBjcmVhdGUgYWRkaXRpb25h
bCBzbG90cy4KKyAgICBmb3IgKHNpemVfdCByb3cgPSAwOyByb3cgPCByb3dTcGFuOyArK3Jvdykg
eworICAgICAgICBmb3IgKGF1dG8gY29sdW1uID0gY2VsbC0+c3RhcnRDb2x1bW4oKTsgY29sdW1u
IDwgY2VsbC0+ZW5kQ29sdW1uKCk7ICsrY29sdW1uKSB7CisgICAgICAgICAgICBhdXRvIHBvc2l0
aW9uID0gU2xvdFBvc2l0aW9uIHsgY29sdW1uLCBjZWxsLT5zdGFydFJvdygpICsgcm93IH07Cisg
ICAgICAgICAgICBBU1NFUlQoIW1fc2xvdE1hcC5jb250YWlucyhwb3NpdGlvbikpOworICAgICAg
ICAgICAgLy8gVGhpcyBzbG90IGlzIHNwYW5uZWQgYnkgYSBjZWxsIGF0IHRoZSBpbml0aWFsIHNs
b3cgcG9zaXRpb24uCisgICAgICAgICAgICBhdXRvIGlzQ29sdW1uU3Bhbm5lZCA9IGNvbHVtbiAh
PSBjZWxsLT5zdGFydENvbHVtbigpOworICAgICAgICAgICAgYXV0byBpc1Jvd1NwYW5uZWQgPSAh
IXJvdzsKKyAgICAgICAgICAgIG1fc2xvdE1hcC5hZGQocG9zaXRpb24sIG1ha2VVbmlxdWU8U2xv
dD4oKmNlbGwsIGlzQ29sdW1uU3Bhbm5lZCwgaXNSb3dTcGFubmVkKSk7CisgICAgICAgIH0KKyAg
ICB9CisgICAgLy8gSW5pdGlhbGl6ZSBjb2x1bW5zL3Jvd3MgaWYgbmVlZGVkLgorICAgIGF1dG8g
bWlzc2luZ051bWJlck9mQ29sdW1ucyA9IHN0ZDo6bWF4PGludD4oMCwgaW5pdGlhbFNsb3RQb3Np
dGlvbi5jb2x1bW4gKyBjb2x1bW5TcGFuIC0gbV9jb2x1bW5zLnNpemUoKSk7CisgICAgZm9yIChh
dXRvIGNvbHVtbiA9IDA7IGNvbHVtbiA8IG1pc3NpbmdOdW1iZXJPZkNvbHVtbnM7ICsrY29sdW1u
KQorICAgICAgICBtX2NvbHVtbnMuYWRkQW5vbnltb3VzQ29sdW1uKCk7CisKKyAgICBpZiAoY2Vs
bC0+aXNGaXhlZFdpZHRoKCkpIHsKKyAgICAgICAgZm9yIChhdXRvIGNvbHVtbiA9IGNlbGwtPnN0
YXJ0Q29sdW1uKCk7IGNvbHVtbiA8IGNlbGwtPmVuZENvbHVtbigpOyArK2NvbHVtbikKKyAgICAg
ICAgICAgIG1fY29sdW1ucy5saXN0KClbY29sdW1uXS5zZXRIYXNGaXhlZFdpZHRoQ2VsbCgpOwor
ICAgIH0KKworICAgIGlmIChpc0luTmV3Um93KQorICAgICAgICBtX3Jvd3MuYWRkUm93KGNlbGxC
b3gucGFyZW50KCkpOworCisgICAgbV9jZWxscy5hZGQoV1RGTW92ZShjZWxsKSk7Cit9CisKK3Zv
aWQgVGFibGVHcmlkOjppbnNlcnRDZWxsKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCwgY29u
c3QgQ29udGFpbmVyQm94JiBiZWZvcmUpCit7CisgICAgVU5VU0VEX1BBUkFNKGNlbGxCb3gpOwor
ICAgIFVOVVNFRF9QQVJBTShiZWZvcmUpOworfQorCit2b2lkIFRhYmxlR3JpZDo6cmVtb3ZlQ2Vs
bChjb25zdCBDb250YWluZXJCb3gmIGNlbGxCb3gpCit7CisgICAgVU5VU0VEX1BBUkFNKGNlbGxC
b3gpOworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlR3JpZC5oIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVH
cmlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uNjI1YTNmNDRiZjYyMjFjZTQ2NTI1OTQwOTEzZWNlMTBiMDZhYWNl
ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlR3JpZC5oCkBAIC0wLDAgKzEsMjQxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09O
VEVYVCkKKworI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0
VW5pdHMuaCIKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxs
b2MuaD4KKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorI2luY2x1ZGUgPHd0Zi9M
aXN0SGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9XZWFrUHRyLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworY2xhc3MgQm94OworY2xhc3MgQ29udGFpbmVyQm94
OworCitjbGFzcyBUYWJsZUdyaWQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVH
cmlkKTsKK3B1YmxpYzoKKyAgICBUYWJsZUdyaWQoKTsKKworICAgIHZvaWQgYXBwZW5kQ2VsbChj
b25zdCBDb250YWluZXJCb3gmKTsKKyAgICB2b2lkIGluc2VydENlbGwoY29uc3QgQ29udGFpbmVy
Qm94JiwgY29uc3QgQ29udGFpbmVyQm94JiBiZWZvcmUpOworICAgIHZvaWQgcmVtb3ZlQ2VsbChj
b25zdCBDb250YWluZXJCb3gmKTsKKworICAgIHZvaWQgc2V0SG9yaXpvbnRhbFNwYWNpbmcoTGF5
b3V0VW5pdCBob3Jpem9udGFsU3BhY2luZykgeyBtX2hvcml6b250YWxTcGFjaW5nID0gaG9yaXpv
bnRhbFNwYWNpbmc7IH0KKyAgICBMYXlvdXRVbml0IGhvcml6b250YWxTcGFjaW5nKCkgY29uc3Qg
eyByZXR1cm4gbV9ob3Jpem9udGFsU3BhY2luZzsgfQorCisgICAgdm9pZCBzZXRWZXJ0aWNhbFNw
YWNpbmcoTGF5b3V0VW5pdCB2ZXJ0aWNhbFNwYWNpbmcpIHsgbV92ZXJ0aWNhbFNwYWNpbmcgPSB2
ZXJ0aWNhbFNwYWNpbmc7IH0KKyAgICBMYXlvdXRVbml0IHZlcnRpY2FsU3BhY2luZygpIGNvbnN0
IHsgcmV0dXJuIG1fdmVydGljYWxTcGFjaW5nOyB9CisKKyAgICB2b2lkIHNldENvbGxhcHNlZEJv
cmRlcihjb25zdCBFZGdlcyYgY29sbGFwc2VkQm9yZGVyKSB7IG1fY29sbGFwc2VkQm9yZGVyID0g
Y29sbGFwc2VkQm9yZGVyOyB9CisgICAgT3B0aW9uYWw8RWRnZXM+IGNvbGxhcHNlZEJvcmRlcigp
IGNvbnN0IHsgcmV0dXJuIG1fY29sbGFwc2VkQm9yZGVyOyB9CisKKyAgICB2b2lkIHNldFdpZHRo
Q29uc3RyYWludHMoRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMg
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cykgeyBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHMg
PSBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOyB9CisgICAgT3B0aW9uYWw8Rm9ybWF0dGluZ0Nv
bnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM+IHdpZHRoQ29uc3RyYWludHMoKSBjb25z
dCB7IHJldHVybiBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7IH0KKworICAgIGJvb2wgaXNF
bXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fc2xvdE1hcC5pc0VtcHR5KCk7IH0KKyAgICAvLyBDb2x1
bW4gcmVwcmVzZW50cyBhIHZlcnRpY2FsIHNldCBvZiBzbG90cyBpbiB0aGUgZ3JpZC4gQSBjb2x1
bW4gaGFzIGhvcml6b250YWwgcG9zaXRpb24gYW5kIHdpZHRoLgorICAgIGNsYXNzIENvbHVtbiB7
CisgICAgcHVibGljOgorICAgICAgICBDb2x1bW4oY29uc3QgQ29udGFpbmVyQm94Kik7CisKKyAg
ICAgICAgdm9pZCBzZXRMb2dpY2FsTGVmdChMYXlvdXRVbml0KTsKKyAgICAgICAgTGF5b3V0VW5p
dCBsb2dpY2FsTGVmdCgpIGNvbnN0OworICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxSaWdodCgp
IGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxMZWZ0KCkgKyBsb2dpY2FsV2lkdGgoKTsgfQorICAgICAg
ICB2b2lkIHNldExvZ2ljYWxXaWR0aChMYXlvdXRVbml0KTsKKyAgICAgICAgTGF5b3V0VW5pdCBs
b2dpY2FsV2lkdGgoKSBjb25zdDsKKworICAgICAgICBib29sIGlzRml4ZWRXaWR0aCgpIGNvbnN0
OworCisgICAgICAgIHZvaWQgc2V0SGFzRml4ZWRXaWR0aENlbGwoKSB7IG1faGFzRml4ZWRXaWR0
aENlbGwgPSB0cnVlOyB9CisgICAgICAgIGNvbnN0IENvbnRhaW5lckJveCogYm94KCkgY29uc3Qg
eyByZXR1cm4gbV9sYXlvdXRCb3guZ2V0KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGJv
b2wgaGFzRml4ZWRXaWR0aENlbGwoKSBjb25zdCB7IHJldHVybiBtX2hhc0ZpeGVkV2lkdGhDZWxs
OyB9CisKKyAgICAgICAgTGF5b3V0VW5pdCBtX2NvbXB1dGVkTG9naWNhbFdpZHRoOworICAgICAg
ICBMYXlvdXRVbml0IG1fY29tcHV0ZWRMb2dpY2FsTGVmdDsKKyAgICAgICAgV2Vha1B0cjxjb25z
dCBDb250YWluZXJCb3g+IG1fbGF5b3V0Qm94OworICAgICAgICBib29sIG1faGFzRml4ZWRXaWR0
aENlbGwgeyBmYWxzZSB9OworCisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICAgICAgYm9vbCBtX2hh
c0NvbXB1dGVkV2lkdGggeyBmYWxzZSB9OworICAgICAgICBib29sIG1faGFzQ29tcHV0ZWRMZWZ0
IHsgZmFsc2UgfTsKKyNlbmRpZgorICAgIH07CisKKyAgICBjbGFzcyBDb2x1bW5zIHsKKyAgICBw
dWJsaWM6CisgICAgICAgIHVzaW5nIENvbHVtbkxpc3QgPSBWZWN0b3I8Q29sdW1uPjsKKyAgICAg
ICAgQ29sdW1uTGlzdCYgbGlzdCgpIHsgcmV0dXJuIG1fY29sdW1uTGlzdDsgfQorICAgICAgICBj
b25zdCBDb2x1bW5MaXN0JiBsaXN0KCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0OyB9Cisg
ICAgICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0LnNpemUoKTsg
fQorCisgICAgICAgIHZvaWQgYWRkQ29sdW1uKGNvbnN0IENvbnRhaW5lckJveCYpOworICAgICAg
ICB2b2lkIGFkZEFub255bW91c0NvbHVtbigpOworCisgICAgICAgIExheW91dFVuaXQgbG9naWNh
bFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0Lmxhc3QoKS5sb2dpY2FsUmlnaHQo
KSAtIG1fY29sdW1uTGlzdC5maXJzdCgpLmxvZ2ljYWxMZWZ0KCk7IH0KKyAgICAgICAgYm9vbCBo
YXNGaXhlZENvbHVtbnNPbmx5KCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBDb2x1
bW5MaXN0IG1fY29sdW1uTGlzdDsKKyAgICB9OworCisgICAgY2xhc3MgUm93IHsKKyAgICBwdWJs
aWM6CisgICAgICAgIFJvdyhjb25zdCBDb250YWluZXJCb3gmKTsKKworICAgICAgICB2b2lkIHNl
dExvZ2ljYWxUb3AoTGF5b3V0VW5pdCBsb2dpY2FsVG9wKSB7IG1fbG9naWNhbFRvcCA9IGxvZ2lj
YWxUb3A7IH0KKyAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4g
bV9sb2dpY2FsVG9wOyB9CisgICAgICAgIExheW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0
IHsgcmV0dXJuIGxvZ2ljYWxUb3AoKSArIGxvZ2ljYWxIZWlnaHQoKTsgfQorCisgICAgICAgIHZv
aWQgc2V0TG9naWNhbEhlaWdodChMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQpIHsgbV9sb2dpY2Fs
SGVpZ2h0ID0gbG9naWNhbEhlaWdodDsgfQorICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxIZWln
aHQoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxIZWlnaHQ7IH0KKworICAgICAgICB2b2lkIHNl
dEJhc2VsaW5lKElubGluZUxheW91dFVuaXQgYmFzZWxpbmUpIHsgbV9iYXNlbGluZSA9IGJhc2Vs
aW5lOyB9CisgICAgICAgIElubGluZUxheW91dFVuaXQgYmFzZWxpbmUoKSBjb25zdCB7IHJldHVy
biBtX2Jhc2VsaW5lOyB9CisKKyAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25z
dCB7IHJldHVybiAqbV9sYXlvdXRCb3guZ2V0KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAg
IExheW91dFVuaXQgbV9sb2dpY2FsVG9wOworICAgICAgICBMYXlvdXRVbml0IG1fbG9naWNhbEhl
aWdodDsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OworICAgICAg
ICBXZWFrUHRyPGNvbnN0IENvbnRhaW5lckJveD4gbV9sYXlvdXRCb3g7CisgICAgfTsKKworICAg
IGNsYXNzIFJvd3MgeworICAgIHB1YmxpYzoKKyAgICAgICAgdXNpbmcgUm93TGlzdCA9IFZlY3Rv
cjxSb3c+OworICAgICAgICBSb3dMaXN0JiBsaXN0KCkgeyByZXR1cm4gbV9yb3dMaXN0OyB9Cisg
ICAgICAgIGNvbnN0IFJvd0xpc3QmIGxpc3QoKSBjb25zdCB7IHJldHVybiBtX3Jvd0xpc3Q7IH0K
KworICAgICAgICB2b2lkIGFkZFJvdyhjb25zdCBDb250YWluZXJCb3gmKTsKKworICAgICAgICBz
aXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcm93TGlzdC5zaXplKCk7IH0KKworICAgIHBy
aXZhdGU6CisgICAgICAgIFJvd0xpc3QgbV9yb3dMaXN0OworICAgIH07CisKKyAgICAvLyBDZWxs
IHJlcHJlc2VudHMgYSA8dGQ+IG9yIDx0aD4uIEl0IGNhbiBzcGFuIG11bHRpcGxlIHNsb3RzIGlu
IHRoZSBncmlkLgorICAgIGNsYXNzIENlbGwgOiBwdWJsaWMgQ2FuTWFrZVdlYWtQdHI8Q2VsbD4g
eworICAgICAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lOTElORShDZWxsKTsKKyAgICBwdWJs
aWM6CisgICAgICAgIENlbGwoY29uc3QgQ29udGFpbmVyQm94JiwgU2xvdFBvc2l0aW9uLCBDZWxs
U3Bhbik7CisKKyAgICAgICAgc2l6ZV90IHN0YXJ0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9w
b3NpdGlvbi5jb2x1bW47IH0KKyAgICAgICAgc2l6ZV90IGVuZENvbHVtbigpIGNvbnN0IHsgcmV0
dXJuIG1fcG9zaXRpb24uY29sdW1uICsgbV9zcGFuLmNvbHVtbjsgfQorCisgICAgICAgIHNpemVf
dCBzdGFydFJvdygpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb24ucm93OyB9CisgICAgICAgIHNp
emVfdCBlbmRSb3coKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aW9uLnJvdyArIG1fc3Bhbi5yb3c7
IH0KKworICAgICAgICBzaXplX3QgY29sdW1uU3BhbigpIGNvbnN0IHsgcmV0dXJuIG1fc3Bhbi5j
b2x1bW47IH0KKyAgICAgICAgc2l6ZV90IHJvd1NwYW4oKSBjb25zdCB7IHJldHVybiBtX3NwYW4u
cm93OyB9CisKKyAgICAgICAgU2xvdFBvc2l0aW9uIHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4g
bV9wb3NpdGlvbjsgfQorICAgICAgICBDZWxsU3BhbiBzcGFuKCkgY29uc3QgeyByZXR1cm4gbV9z
cGFuOyB9CisKKyAgICAgICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0IGJhc2Vs
aW5lKSB7IG1fYmFzZWxpbmUgPSBiYXNlbGluZTsgfQorICAgICAgICBJbmxpbmVMYXlvdXRVbml0
IGJhc2VsaW5lKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlbGluZTsgfQorCisgICAgICAgIGJvb2wg
aXNGaXhlZFdpZHRoKCkgY29uc3Q7CisKKyAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3go
KSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRCb3guZ2V0KCk7IH0KKworICAgIHByaXZhdGU6Cisg
ICAgICAgIFdlYWtQdHI8Y29uc3QgQ29udGFpbmVyQm94PiBtX2xheW91dEJveDsKKyAgICAgICAg
U2xvdFBvc2l0aW9uIG1fcG9zaXRpb247CisgICAgICAgIENlbGxTcGFuIG1fc3BhbjsKKyAgICAg
ICAgSW5saW5lTGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OworICAgIH07CisKKyAgICBjbGFz
cyBTbG90IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFdURl9NQUtFX1NUUlVDVF9GQVNUX0FMTE9D
QVRFRDsKKyAgICAgICAgU2xvdCgpID0gZGVmYXVsdDsKKyAgICAgICAgU2xvdChDZWxsJiwgYm9v
bCBpc0NvbHVtblNwYW5uZWQsIGJvb2wgaXNSb3dTcGFubmVkKTsKKworICAgICAgICBjb25zdCBD
ZWxsJiBjZWxsKCkgY29uc3QgeyByZXR1cm4gKm1fY2VsbDsgfQorICAgICAgICBDZWxsJiBjZWxs
KCkgeyByZXR1cm4gKm1fY2VsbDsgfQorCisgICAgICAgIGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0
OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzJiB3aWR0aENvbnN0cmFpbnRzKCkgY29uc3QgeyBy
ZXR1cm4gbV93aWR0aENvbnN0cmFpbnRzOyB9CisgICAgICAgIHZvaWQgc2V0V2lkdGhDb25zdHJh
aW50cyhjb25zdCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYg
d2lkdGhDb25zdHJhaW50cykgeyBtX3dpZHRoQ29uc3RyYWludHMgPSB3aWR0aENvbnN0cmFpbnRz
OyB9CisKKyAgICAgICAgLy8gSW5pdGlhbCBzbG90IHBvc2l0aW9uIGZvciBhIHNwYW5uaW5nIGNl
bGwuCisgICAgICAgIC8vIDx0ZD48L3RkPjx0ZCBjb2xzcGFuPTI+PC90ZD4gWzEsIDBdIHNsb3Qg
aGFzIGNvbHVtbiBzcGFuIG9mIDIuCisgICAgICAgIGJvb2wgaGFzQ29sdW1uU3BhbigpIGNvbnN0
IHsgcmV0dXJuIG1fY2VsbC0+Y29sdW1uU3BhbigpID4gMSAmJiAhaXNDb2x1bW5TcGFubmVkKCk7
IH0KKyAgICAgICAgYm9vbCBoYXNSb3dTcGFuKCkgY29uc3QgeyByZXR1cm4gbV9jZWxsLT5yb3dT
cGFuKCkgPiAxICYmICFpc1Jvd1NwYW5uZWQoKTsgfQorCisgICAgICAgIC8vIE5vbi1pbml0aWFs
IHNwYW5uZWQgc2xvdC4KKyAgICAgICAgLy8gPHRkPjwvdGQ+PHRkIGNvbHNwYW49Mj48L3RkPiBb
MiwgMF0gc2xvdCBpcyBjb2x1bW4gc3Bhbm5lZCBieSBbMSwgMF0uCisgICAgICAgIC8vIDx0ZD48
L3RkPjx0ZD48L3RkPjx0ZD48L3RkPgorICAgICAgICBib29sIGlzQ29sdW1uU3Bhbm5lZCgpIGNv
bnN0IHsgcmV0dXJuIG1faXNDb2x1bW5TcGFubmVkOyB9CisgICAgICAgIGJvb2wgaXNSb3dTcGFu
bmVkKCkgY29uc3QgeyByZXR1cm4gbV9pc1Jvd1NwYW5uZWQ7IH0KKworICAgIHByaXZhdGU6Cisg
ICAgICAgIFdlYWtQdHI8Q2VsbD4gbV9jZWxsOworICAgICAgICBib29sIG1faXNDb2x1bW5TcGFu
bmVkIHsgZmFsc2UgfTsKKyAgICAgICAgYm9vbCBtX2lzUm93U3Bhbm5lZCB7IGZhbHNlIH07Cisg
ICAgICAgIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIG1fd2lk
dGhDb25zdHJhaW50czsKKyAgICB9OworCisgICAgY29uc3QgQ29sdW1ucyYgY29sdW1ucygpIGNv
bnN0IHsgcmV0dXJuIG1fY29sdW1uczsgfQorICAgIENvbHVtbnMmIGNvbHVtbnMoKSB7IHJldHVy
biBtX2NvbHVtbnM7IH0KKworICAgIGNvbnN0IFJvd3MmIHJvd3MoKSBjb25zdCB7IHJldHVybiBt
X3Jvd3M7IH0KKyAgICBSb3dzJiByb3dzKCkgeyByZXR1cm4gbV9yb3dzOyB9CisKKyAgICB1c2lu
ZyBDZWxscyA9IFdURjo6TGlzdEhhc2hTZXQ8c3RkOjp1bmlxdWVfcHRyPENlbGw+PjsKKyAgICBD
ZWxscyYgY2VsbHMoKSB7IHJldHVybiBtX2NlbGxzOyB9CisKKyAgICBTbG90KiBzbG90KFNsb3RQ
b3NpdGlvbik7CisgICAgY29uc3QgU2xvdCogc2xvdChTbG90UG9zaXRpb24gcG9zaXRpb24pIGNv
bnN0IHsgcmV0dXJuIG1fc2xvdE1hcC5nZXQocG9zaXRpb24pOyB9CisgICAgYm9vbCBpc1NwYW5u
ZWQoU2xvdFBvc2l0aW9uKTsKKworcHJpdmF0ZToKKyAgICB1c2luZyBTbG90TWFwID0gV1RGOjpI
YXNoTWFwPFNsb3RQb3NpdGlvbiwgc3RkOjp1bmlxdWVfcHRyPFNsb3Q+PjsKKworICAgIENvbHVt
bnMgbV9jb2x1bW5zOworICAgIFJvd3MgbV9yb3dzOworICAgIENlbGxzIG1fY2VsbHM7CisgICAg
U2xvdE1hcCBtX3Nsb3RNYXA7CisKKyAgICBMYXlvdXRVbml0IG1faG9yaXpvbnRhbFNwYWNpbmc7
CisgICAgTGF5b3V0VW5pdCBtX3ZlcnRpY2FsU3BhY2luZzsKKyAgICBPcHRpb25hbDxGb3JtYXR0
aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cz4gbV9pbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzOworICAgIE9wdGlvbmFsPEVkZ2VzPiBtX2NvbGxhcHNlZEJvcmRlcjsKK307CisK
K30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUxheW91dC5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUxheW91
dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uMjMzNTJjNWExN2Y4YzBiM2QzZDI0NGU5MjVhN2VmMjQ4MTk4YThk
MwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlTGF5b3V0LmNwcApAQCAtMCwwICsxLDMxMCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJUYWJsZUZvcm1hdHRp
bmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKwor
I2luY2x1ZGUgIkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCisvLyBodHRwczovL3d3
dy53My5vcmcvVFIvY3NzLXRhYmxlcy0zLyN0YWJsZS1sYXlvdXQtYWxnb3JpdGhtCitUYWJsZUZv
cm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dDo6VGFibGVMYXlvdXQoY29uc3QgVGFibGVGb3Jt
YXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQsIGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkK
KyAgICA6IG1fZm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHQpCisgICAgLCBtX2dy
aWQoZ3JpZCkKK3sKK30KKworc3RydWN0IENvbHVtblNwYW4geworICAgIHN0YXRpYyBzaXplX3Qg
aGFzU3Bhbihjb25zdCBUYWJsZUdyaWQ6OlNsb3QmIHNsb3QpIHsgcmV0dXJuIHNsb3QuaGFzQ29s
dW1uU3BhbigpOyB9CisgICAgc3RhdGljIHNpemVfdCBpc1NwYW5uZWQoY29uc3QgVGFibGVHcmlk
OjpTbG90JiBzbG90KSB7IHJldHVybiBzbG90LmlzQ29sdW1uU3Bhbm5lZCgpOyB9CisKKyAgICBz
dGF0aWMgc2l6ZV90IHNwYW5Db3VudChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0
dXJuIGNlbGwuY29sdW1uU3BhbigpOyB9CisgICAgc3RhdGljIHNpemVfdCBzdGFydFNwYW4oY29u
c3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBjZWxsLnN0YXJ0Q29sdW1uKCk7IH0K
KyAgICBzdGF0aWMgc2l6ZV90IGVuZFNwYW4oY29uc3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7
IHJldHVybiBjZWxsLmVuZENvbHVtbigpOyB9CisKKyAgICBzdGF0aWMgc2l6ZV90IGluZGV4KHNp
emVfdCBjb2x1bW5JbmRleCwgc2l6ZV90IC8qcm93SW5kZXgqLykgeyByZXR1cm4gY29sdW1uSW5k
ZXg7IH0KKyAgICBzdGF0aWMgc2l6ZV90IHNpemUoY29uc3QgVGFibGVHcmlkJiBncmlkKSB7IHJl
dHVybiBncmlkLmNvbHVtbnMoKS5zaXplKCk7IH0KKworICAgIHN0YXRpYyBMYXlvdXRVbml0IHNw
YWNpbmcoY29uc3QgVGFibGVHcmlkJiBncmlkKSB7IHJldHVybiBncmlkLmhvcml6b250YWxTcGFj
aW5nKCk7IH0KK307CisKK3N0cnVjdCBSb3dTcGFuIHsKKyAgICBzdGF0aWMgc2l6ZV90IGhhc1Nw
YW4oY29uc3QgVGFibGVHcmlkOjpTbG90JiBzbG90KSB7IHJldHVybiBzbG90Lmhhc1Jvd1NwYW4o
KTsgfQorICAgIHN0YXRpYyBzaXplX3QgaXNTcGFubmVkKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYg
c2xvdCkgeyByZXR1cm4gc2xvdC5pc1Jvd1NwYW5uZWQoKTsgfQorCisgICAgc3RhdGljIHNpemVf
dCBzcGFuQ291bnQoY29uc3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBjZWxsLnJv
d1NwYW4oKTsgfQorICAgIHN0YXRpYyBzaXplX3Qgc3RhcnRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6
Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5zdGFydFJvdygpOyB9CisgICAgc3RhdGljIHNpemVf
dCBlbmRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5lbmRS
b3coKTsgfQorCisgICAgc3RhdGljIHNpemVfdCBpbmRleChzaXplX3QgLypjb2x1bW5JbmRleCov
LCBzaXplX3Qgcm93SW5kZXgpIHsgcmV0dXJuIHJvd0luZGV4OyB9CisgICAgc3RhdGljIHNpemVf
dCBzaXplKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5yb3dzKCkuc2l6ZSgp
OyB9CisKKyAgICBzdGF0aWMgTGF5b3V0VW5pdCBzcGFjaW5nKGNvbnN0IFRhYmxlR3JpZCYgZ3Jp
ZCkgeyByZXR1cm4gZ3JpZC52ZXJ0aWNhbFNwYWNpbmcoKTsgfQorfTsKKworc3RydWN0IEdyaWRT
cGFjZSB7CisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIXZhbHVlOyB9CisKKyAg
ICAvLyBJbml0aWFsIHdpZHRoL2hlaWdodCBmb3IgY29sdW1uL3JvdyB3ZSBzdGFydCB0aGUgZGlz
dHJpYnV0aW9uIHdpZHRoICh1c3VhbGx5IGEgbWludW11bSB3aWR0aCkuCisgICAgZmxvYXQgdmFs
dWUgeyAwIH07CisgICAgLy8gVGhlIGJhc2UgdG8gY29tcHV0ZSB0aGUgZGlzdHJpYnV0aW9uIHJh
dGlvLiBJdCBub3JtYWxseSBtYXRjaGVzIHRoZSBbdmFsdWVdIGJ1dCBpbiBzb21lIGNhc2VzIHdl
IHVzZSB0aGUgbWF4aW11bSB2YWx1ZSB0byBkaXN0cmlidXRlIHRoZSBleHRyYSBzcGFjZS4gCisg
ICAgZmxvYXQgZGlzdHJpYnV0aW9uQmFzZSB7IDAgfTsKK307CisKK2lubGluZSBzdGF0aWMgR3Jp
ZFNwYWNlIG1heChjb25zdCBHcmlkU3BhY2UmIGEsIGNvbnN0IEdyaWRTcGFjZSYgYikKK3sKKyAg
ICByZXR1cm4geyBzdGQ6Om1heChhLnZhbHVlLCBiLnZhbHVlKSwgc3RkOjptYXgoYS5kaXN0cmli
dXRpb25CYXNlLCBiLmRpc3RyaWJ1dGlvbkJhc2UpIH07Cit9CisKK2lubGluZSBzdGF0aWMgR3Jp
ZFNwYWNlJiBvcGVyYXRvci0oR3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCit7Cisg
ICAgYS52YWx1ZSA9IHN0ZDo6bWF4KDAuMGYsIGEudmFsdWUgLSBiLnZhbHVlKTsKKyAgICBhLmRp
c3RyaWJ1dGlvbkJhc2UgPSBzdGQ6Om1heCgwLjBmLCBhLmRpc3RyaWJ1dGlvbkJhc2UgLSBiLmRp
c3RyaWJ1dGlvbkJhc2UpOworICAgIHJldHVybiBhOworfQorCitpbmxpbmUgc3RhdGljIEdyaWRT
cGFjZSYgb3BlcmF0b3IrPShHcmlkU3BhY2UmIGEsIGNvbnN0IEdyaWRTcGFjZSYgYikKK3sKKyAg
ICBhLnZhbHVlICs9IGIudmFsdWU7CisgICAgYS5kaXN0cmlidXRpb25CYXNlICs9IGIuZGlzdHJp
YnV0aW9uQmFzZTsKKyAgICByZXR1cm4gYTsKK30KKworaW5saW5lIHN0YXRpYyBHcmlkU3BhY2Um
IG9wZXJhdG9yLT0oR3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCit7CisgICAgcmV0
dXJuIGEgLSBiOworfQorCitpbmxpbmUgc3RhdGljIEdyaWRTcGFjZSYgb3BlcmF0b3IvKEdyaWRT
cGFjZSYgYSwgdW5zaWduZWQgdmFsdWUpCit7CisgICAgYS52YWx1ZSAvPSB2YWx1ZTsKKyAgICBh
LmRpc3RyaWJ1dGlvbkJhc2UgLz0gdmFsdWU7CisgICAgcmV0dXJuIGE7Cit9CisKK3RlbXBsYXRl
IDx0eXBlbmFtZSBTcGFuVHlwZT4KK3N0YXRpYyBWZWN0b3I8TGF5b3V0VW5pdD4gZGlzdHJpYnV0
ZUF2YWlsYWJsZVNwYWNlKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCwgTGF5b3V0VW5pdCBhdmFpbGFi
bGVTcGFjZSwgY29uc3QgV1RGOjpGdW5jdGlvbjxHcmlkU3BhY2UoY29uc3QgVGFibGVHcmlkOjpT
bG90Jiwgc2l6ZV90KT4mIHNsb3RTcGFjZSkKK3sKKyAgICBzdHJ1Y3QgUmVzb2x2ZWRJdGVtIHsK
KyAgICAgICAgR3JpZFNwYWNlIHNsb3RTcGFjZTsKKyAgICAgICAgYm9vbCBpc0ZpeGVkIHsgZmFs
c2UgfTsKKyAgICB9OworCisgICAgYXV0byYgY29sdW1ucyA9IGdyaWQuY29sdW1ucygpOworICAg
IGF1dG8mIHJvd3MgPSBncmlkLnJvd3MoKTsKKyAgICAvLyAxLiBDb2xsZWN0IHRoZSBub24tc3Bh
bm5pbmcgc3BhY2VzIGZpcnN0LiBUaGV5IGFyZSB1c2VkIGZvciB0aGUgZmluYWwgZGlzdHJpYnV0
aW9uIGFzIHdlbGwgYXMgZm9yIGRpc3RyaWJ1dGluZyB0aGUgc3Bhbm5pbmcgc3BhY2UuCisgICAg
VmVjdG9yPE9wdGlvbmFsPFJlc29sdmVkSXRlbT4+IHJlc29sdmVkSXRlbXMoU3BhblR5cGU6OnNp
emUoZ3JpZCkpOworICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXgg
PCBjb2x1bW5zLnNpemUoKTsgKytjb2x1bW5JbmRleCkgeworICAgICAgICBmb3IgKHNpemVfdCBy
b3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAgICAg
ICAgICAgIGF1dG8mIHNsb3QgPSAqZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0p
OworICAgICAgICAgICAgaWYgKFNwYW5UeXBlOjpoYXNTcGFuKHNsb3QpIHx8IFNwYW5UeXBlOjpp
c1NwYW5uZWQoc2xvdCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBh
dXRvIGluZGV4ID0gU3BhblR5cGU6OmluZGV4KGNvbHVtbkluZGV4LCByb3dJbmRleCk7CisgICAg
ICAgICAgICBpZiAoIXJlc29sdmVkSXRlbXNbaW5kZXhdKQorICAgICAgICAgICAgICAgIHJlc29s
dmVkSXRlbXNbaW5kZXhdID0gUmVzb2x2ZWRJdGVtIHsgfTsKKyAgICAgICAgICAgIHJlc29sdmVk
SXRlbXNbaW5kZXhdLT5zbG90U3BhY2UgPSBtYXgocmVzb2x2ZWRJdGVtc1tpbmRleF0tPnNsb3RT
cGFjZSwgc2xvdFNwYWNlKHNsb3QsIGluZGV4KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAv
LyAyLiBDb2xsZWN0IHRoZSBzcGFubmluZyBjZWxscy4KKyAgICBzdHJ1Y3QgU3Bhbm5pbmdDZWxs
IHsKKyAgICAgICAgU2xvdFBvc2l0aW9uIHBvc2l0aW9uOworICAgICAgICBHcmlkU3BhY2UgdW5y
ZXNvbHZlZFNwYWNlOworICAgIH07CisgICAgVmVjdG9yPFNwYW5uaW5nQ2VsbD4gc3Bhbm5pbmdD
ZWxsczsKKyAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXpl
KCk7ICsrcm93SW5kZXgpIHsKKyAgICAgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBj
b2x1bW5JbmRleCA8IGNvbHVtbnMuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7CisgICAgICAgICAg
ICBhdXRvJiBzbG90ID0gKmdyaWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsKKyAg
ICAgICAgICAgIGlmIChTcGFuVHlwZTo6aGFzU3BhbihzbG90KSkKKyAgICAgICAgICAgICAgICBz
cGFubmluZ0NlbGxzLmFwcGVuZCh7IHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0sIHNsb3RTcGFj
ZShzbG90LCBTcGFuVHlwZTo6aW5kZXgoY29sdW1uSW5kZXgsIHJvd0luZGV4KSkgfSk7CisgICAg
ICAgIH0KKyAgICB9CisgICAgLy8gV2UgbmVlZCB0aGVzZSBzcGFubmluZyBjZWxscyBpbiB0aGUg
b3JkZXIgb2YgdGhlIG51bWJlciBvZiBjb2x1bW5zL3Jvd3MgdGhleSBzcGFuIHNvIHRoYXQKKyAg
ICAvLyB3ZSBjYW4gcmVzb2x2ZSBvdmVybGFwcGluZyBzcGFucyBzdGFydGluZyB3aXRoIHRoZSBz
aG9ydGVyIG9uZXMgZS5nLgorICAgIC8vIDx0ZCBjb2xzcGFuPTQ+I2E8L3RkPjx0ZD4jYjwvdGQ+
CisgICAgLy8gPHRkIGNvbHNwYW49Mj4jYzwvdGQ+PHRkIGNvbHNwYW49Mz4jZDwvdGQ+CisgICAg
c3RkOjpzb3J0KHNwYW5uaW5nQ2VsbHMuYmVnaW4oKSwgc3Bhbm5pbmdDZWxscy5lbmQoKSwgWyZd
IChhdXRvJiBhLCBhdXRvJiBiKSB7CisgICAgICAgIHJldHVybiBTcGFuVHlwZTo6c3BhbkNvdW50
KGdyaWQuc2xvdChhLnBvc2l0aW9uKS0+Y2VsbCgpKSA8IFNwYW5UeXBlOjpzcGFuQ291bnQoZ3Jp
ZC5zbG90KGIucG9zaXRpb24pLT5jZWxsKCkpOworICAgIH0pOworCisgICAgLy8gMy4gRGlzdHJp
YnV0ZSB0aGUgc3Bhbm5pbmcgY2VsbHMnIG1pbWltdW0gc3BhY2UgYWNyb3NzIHRoZSBjb2x1bW5z
L3Jvd3MgdXNpbmcgdGhlIG5vbi1zcGFubmluZyBzcGFjZXMuCisgICAgLy8gZS5nLiBbIDEgXVsg
NSBdWyAxIF0KKyAgICAvLyAgICAgIFsgICAgOSAgIF1bIDEgXQorICAgIC8vIFRoZSBpbml0aWFs
IHdpZHRocyBhcmU6IFsgMiBdWyA3IF1bIDEgXQorICAgIGZvciAoYXV0byBzcGFubmluZ0NlbGwg
OiBzcGFubmluZ0NlbGxzKSB7CisgICAgICAgIGF1dG8mIGNlbGwgPSBncmlkLnNsb3Qoc3Bhbm5p
bmdDZWxsLnBvc2l0aW9uKS0+Y2VsbCgpOworICAgICAgICBhdXRvIHVucmVzb2x2ZWRTcGFubmlu
Z1NwYWNlID0gc3Bhbm5pbmdDZWxsLnVucmVzb2x2ZWRTcGFjZTsKKyAgICAgICAgaWYgKCFyZXNv
bHZlZEl0ZW1zW1NwYW5UeXBlOjpzdGFydFNwYW4oY2VsbCldIHx8ICFyZXNvbHZlZEl0ZW1zW1Nw
YW5UeXBlOjplbmRTcGFuKGNlbGwpIC0gMV0pIHsKKyAgICAgICAgICAgIC8vIDx0ZCBjb2xzcGFu
PTQ+I2E8L3RkPjx0ZD4jYjwvdGQ+CisgICAgICAgICAgICAvLyA8dGQgY29sc3Bhbj0yPiNjPC90
ZD48dGQgY29sc3Bhbj0zPiNkPC90ZD4KKyAgICAgICAgICAgIC8vIFVucmVzb2x2ZWQgY29sdW1u
cyBhcmU6IDEgMiAzIDQKKyAgICAgICAgICAgIC8vIDEuIFRha2UgY29sc3Bhbj0yIChzaG9ydGVz
dCBzcGFuKSBhbmQgcmVzb2x2ZSBjb2x1bW4gMSBhbmQgMgorICAgICAgICAgICAgLy8gMi4gVGFr
ZSBjb2xzcGFuPTMgYW5kIHJlc29sdmUgY29sdW1uIDMgYW5kIDQgKDUgaXMgcmVzb2x2ZWQgYmVj
YXVzZSBpdCBhbHJlYWR5IGhhcyBhIG5vbi1zcGFubmluZyBjZWxsKS4KKyAgICAgICAgICAgIC8v
IDMuIGNvbHNwYW49NCBuZWVkcyBubyByZXNvbHZpbmcgYmVjYXVzZSBhbGwgdGhlIHNwYW5uZWQg
Y29sdW1ucyAoMSAyIDMgNCkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuCisgICAgICAgICAg
ICBhdXRvIHVucmVzb2x2ZWRDb2x1bW5Db3VudCA9IGNlbGwuY29sdW1uU3BhbigpOworICAgICAg
ICAgICAgZm9yIChhdXRvIHNwYW5JbmRleCA9IFNwYW5UeXBlOjpzdGFydFNwYW4oY2VsbCk7IHNw
YW5JbmRleCA8IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwpOyArK3NwYW5JbmRleCkgeworICAgICAg
ICAgICAgICAgIGlmICghcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdKQorICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBBU1NFUlQodW5yZXNvbHZlZENvbHVtbkNv
dW50KTsKKyAgICAgICAgICAgICAgICAtLXVucmVzb2x2ZWRDb2x1bW5Db3VudDsKKyAgICAgICAg
ICAgICAgICB1bnJlc29sdmVkU3Bhbm5pbmdTcGFjZSAtPSByZXNvbHZlZEl0ZW1zW3NwYW5JbmRl
eF0tPnNsb3RTcGFjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVCh1bnJlc29s
dmVkQ29sdW1uQ291bnQpOworICAgICAgICAgICAgYXV0byBlcXVhbFNwYWNlRm9yU3Bhbm5lZENv
bHVtbnMgPSB1bnJlc29sdmVkU3Bhbm5pbmdTcGFjZSAvIHVucmVzb2x2ZWRDb2x1bW5Db3VudDsK
KyAgICAgICAgICAgIGZvciAoYXV0byBzcGFuSW5kZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNl
bGwpOyBzcGFuSW5kZXggPCBTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5kZXgpIHsK
KyAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdKQorICAgICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1zW3NwYW5J
bmRleF0gPSBSZXNvbHZlZEl0ZW0geyBlcXVhbFNwYWNlRm9yU3Bhbm5lZENvbHVtbnMsIGZhbHNl
IH07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyAxLiBD
b2xsZWN0IHRoZSBub24tc3BhbmluZyByZXNvbHZlZCBzcGFjZXMuCisgICAgICAgICAgICAvLyAy
LiBEaXN0cmlidXRlIHRoZSBleHRyYSBzcGFjZSBhbW9uZyB0aGUgc3Bhbm5lZCBjb2x1bW5zL3Jv
d3MgYmFzZWQgb24gdGhlIHJlc29sdmVkIHNwYWNlIHZhbHVlcy4KKyAgICAgICAgICAgIC8vIGUu
Zy4gc3Bhbm5pbmcgd2lkdGg6IFsgICA5ICAgXS4gUmVzb2x2ZWQgd2lkdGhzIGZvciB0aGUgc3Bh
bm5lZCBjb2x1bW5zOiBbIDEgXSBbIDIgXQorICAgICAgICAgICAgLy8gTmV3IHJlc29sdmVkIHdp
ZHRoczogWyAzIF0gWyA2IF0uCisgICAgICAgICAgICBhdXRvIHJlc29sdmVkU3Bhbm5pbmdTcGFj
ZSA9IEdyaWRTcGFjZSB7IH07CisgICAgICAgICAgICBmb3IgKGF1dG8gc3BhbkluZGV4ID0gU3Bh
blR5cGU6OnN0YXJ0U3BhbihjZWxsKTsgc3BhbkluZGV4IDwgU3BhblR5cGU6OmVuZFNwYW4oY2Vs
bCk7ICsrc3BhbkluZGV4KQorICAgICAgICAgICAgICAgIHJlc29sdmVkU3Bhbm5pbmdTcGFjZSAr
PSByZXNvbHZlZEl0ZW1zW3NwYW5JbmRleF0tPnNsb3RTcGFjZTsKKyAgICAgICAgICAgIGlmIChy
ZXNvbHZlZFNwYW5uaW5nU3BhY2UudmFsdWUgPj0gdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UudmFs
dWUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgc3Bhbm5pbmcgY2VsbCBmaXRzIHRoZSBzcGFu
bmVkIGNvbHVtbnMvcm93cyBqdXN0IGZpbmUuIE5vdGhpbmcgdG8gZGlzdHJpYnV0ZS4KKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gc3Bh
Y2luZyA9IFNwYW5UeXBlOjpzcGFjaW5nKGdyaWQpICogKFNwYW5UeXBlOjpzcGFuQ291bnQoY2Vs
bCkgLSAxKTsKKyAgICAgICAgICAgIGF1dG8gc3BhY2VUb0Rpc3RyaWJ1dGUgPSB1bnJlc29sdmVk
U3Bhbm5pbmdTcGFjZSAtIEdyaWRTcGFjZSB7IHNwYWNpbmcsIHNwYWNpbmcgfSAtIHJlc29sdmVk
U3Bhbm5pbmdTcGFjZTsgCisgICAgICAgICAgICBpZiAoIXNwYWNlVG9EaXN0cmlidXRlLmlzRW1w
dHkoKSkgeworICAgICAgICAgICAgICAgIGF1dG8gZGlzdHJpYnV0aW9uUmF0aW8gPSBzcGFjZVRv
RGlzdHJpYnV0ZS5kaXN0cmlidXRpb25CYXNlIC8gcmVzb2x2ZWRTcGFubmluZ1NwYWNlLmRpc3Ry
aWJ1dGlvbkJhc2U7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIHNwYW5JbmRleCA9IFNwYW5U
eXBlOjpzdGFydFNwYW4oY2VsbCk7IHNwYW5JbmRleCA8IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwp
OyArK3NwYW5JbmRleCkKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRJdGVtc1tzcGFuSW5k
ZXhdLT5zbG90U3BhY2UgKz0gR3JpZFNwYWNlIHsgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5z
bG90U3BhY2UudmFsdWUgKiBkaXN0cmlidXRpb25SYXRpbywgcmVzb2x2ZWRJdGVtc1tzcGFuSW5k
ZXhdLT5zbG90U3BhY2UuZGlzdHJpYnV0aW9uQmFzZSAqIGRpc3RyaWJ1dGlvblJhdGlvfTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyA0LiBEaXN0cmlidXRlIHRoZSBl
eHRyYSBzcGFjZSB1c2luZyB0aGUgZmluYWwgcmVzb2x2ZWQgd2lkdGhzLgorI2lmIEFTU0VSVF9F
TkFCTEVECisgICAgLy8gV2UgaGF2ZSB0byBoYXZlIGFsbCB0aGUgc3BhY2VzIHJlc29sdmVkIGF0
IHRoaXMgcG9pbnQuCisgICAgZm9yIChhdXRvJiByZXNvbHZlZEl0ZW0gOiByZXNvbHZlZEl0ZW1z
KQorICAgICAgICBBU1NFUlQocmVzb2x2ZWRJdGVtKTsKKyNlbmRpZgorICAgIC8vIEZpeGVkIHNp
emUgY2VsbHMgZG9uJ3QgcGFydGljaXBhdGUgaW4gYXZhaWxhYmxlIHNwYWNlIGRpc3RyaWJ1dGlv
bi4KKyAgICBhdXRvIGFkanVzdGFibGVkU3BhY2UgPSBHcmlkU3BhY2UgeyB9OworICAgIGZvciAo
YXV0byYgcmVzb2x2ZWRJdGVtIDogcmVzb2x2ZWRJdGVtcykgeworICAgICAgICBpZiAocmVzb2x2
ZWRJdGVtLT5pc0ZpeGVkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGFkanVzdGFi
bGVkU3BhY2UgKz0gcmVzb2x2ZWRJdGVtLT5zbG90U3BhY2U7CisgICAgfQorCisgICAgVmVjdG9y
PExheW91dFVuaXQ+IGRpc3RyaWJ1dGVkU3BhY2VzKHJlc29sdmVkSXRlbXMuc2l6ZSgpKTsKKyAg
ICBmbG9hdCBzcGFjZVRvRGlzdHJpYnV0ZSA9IGF2YWlsYWJsZVNwYWNlIC0gYWRqdXN0YWJsZWRT
cGFjZS52YWx1ZSAtICgocmVzb2x2ZWRJdGVtcy5zaXplKCkgKyAxKSAqIFNwYW5UeXBlOjpzcGFj
aW5nKGdyaWQpKTsKKyAgICAvLyBFc3NlbnRpYWxseSB0aGUgcmVtYWluaW5nIHNwYWNlIHRvIGRp
c3RyaWJ1dGUgc2hvdWxkIG5ldmVyIGJlIG5lZ2F0aXZlLiBMYXlvdXRVbml0OjplcHNpbG9uKCkg
aXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IgTGF5b3V0VW5pdCdzIGxvdyBwcmVjaXNpb24u
CisgICAgQVNTRVJUKHNwYWNlVG9EaXN0cmlidXRlID49IC1MYXlvdXRVbml0OjplcHNpbG9uKCkg
KiByZXNvbHZlZEl0ZW1zLnNpemUoKSk7CisgICAgLy8gRGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3Bh
Y2UgYmFzZWQgb24gdGhlIHJlc29sdmVkIHNwYWNlcy4KKyAgICBhdXRvIGRpc3RyaWJ1dGlvblJh
dGlvID0gc3BhY2VUb0Rpc3RyaWJ1dGUgLyBhZGp1c3RhYmxlZFNwYWNlLmRpc3RyaWJ1dGlvbkJh
c2U7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJlc29sdmVkSXRlbXMuc2l6
ZSgpOyArK2luZGV4KSB7CisgICAgICAgIGF1dG8gc2xvdFNwYWNlID0gcmVzb2x2ZWRJdGVtc1tp
bmRleF0tPnNsb3RTcGFjZS52YWx1ZTsKKyAgICAgICAgYXV0byBuZWVkc1NwYWNlRGlzdHJpYnV0
aW9uID0gc3BhY2VUb0Rpc3RyaWJ1dGUgJiYgIXJlc29sdmVkSXRlbXNbaW5kZXhdLT5pc0ZpeGVk
OworICAgICAgICBkaXN0cmlidXRlZFNwYWNlc1tpbmRleF0gPSBMYXlvdXRVbml0IHsgc2xvdFNw
YWNlIH07CisgICAgICAgIGlmICghbmVlZHNTcGFjZURpc3RyaWJ1dGlvbikKKyAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICBkaXN0cmlidXRlZFNwYWNlc1tpbmRleF0gKz0gTGF5b3V0VW5p
dCB7IHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90U3BhY2UuZGlzdHJpYnV0aW9uQmFzZSAqIGRp
c3RyaWJ1dGlvblJhdGlvIH07CisgICAgfQorICAgIHJldHVybiBkaXN0cmlidXRlZFNwYWNlczsK
K30KKworVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6VGFibGVMYXlvdXQ6OkRpc3RyaWJ1dGVkU3Bh
Y2VzIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlTGF5b3V0OjpkaXN0cmlidXRlZEhvcml6
b250YWxTcGFjZShMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSkKK3sKKyAgICBl
bnVtIGNsYXNzIENvbHVtbldpZHRoQmFsYW5jaW5nQmFzZSB7IE1pbmltdW1XaWR0aCwgTWF4aW11
bVdpZHRoIH07CisgICAgYXV0byBjb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UgPSBhdmFpbGFibGVI
b3Jpem9udGFsU3BhY2UgPj0gbV9ncmlkLndpZHRoQ29uc3RyYWludHMoKS0+bWF4aW11bSA/IENv
bHVtbldpZHRoQmFsYW5jaW5nQmFzZTo6TWF4aW11bVdpZHRoIDogQ29sdW1uV2lkdGhCYWxhbmNp
bmdCYXNlOjpNaW5pbXVtV2lkdGg7CisgICAgcmV0dXJuIGRpc3RyaWJ1dGVBdmFpbGFibGVTcGFj
ZTxDb2x1bW5TcGFuPihtX2dyaWQsIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSwgWyZdIChjb25z
dCBUYWJsZUdyaWQ6OlNsb3QmIHNsb3QsIHNpemVfdCBjb2x1bW5JbmRleCkgeworICAgICAgICBh
dXRvJiBjb2x1bW4gPSBtX2dyaWQuY29sdW1ucygpLmxpc3QoKVtjb2x1bW5JbmRleF07CisgICAg
ICAgIGF1dG8gY29sdW1uQm94Rml4ZWRXaWR0aCA9IGNvbHVtbi5ib3goKSA/IGNvbHVtbi5ib3go
KS0+Y29sdW1uV2lkdGgoKS52YWx1ZU9yKDBfbHUpIDogMF9sdTsKKyAgICAgICAgYXV0byBtaW5p
bXVtV2lkdGggPSBzdGQ6Om1heDxmbG9hdD4oc2xvdC53aWR0aENvbnN0cmFpbnRzKCkubWluaW11
bSwgY29sdW1uQm94Rml4ZWRXaWR0aCk7CisgICAgICAgIGF1dG8gbWF4aW11bVdpZHRoID0gc3Rk
OjptYXg8ZmxvYXQ+KHNsb3Qud2lkdGhDb25zdHJhaW50cygpLm1heGltdW0sIGNvbHVtbkJveEZp
eGVkV2lkdGgpOworCisgICAgICAgIGlmIChjb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UgPT0gQ29s
dW1uV2lkdGhCYWxhbmNpbmdCYXNlOjpNaW5pbXVtV2lkdGgpIHsKKyAgICAgICAgICAgIEFTU0VS
VChtYXhpbXVtV2lkdGggPj0gbWluaW11bVdpZHRoKTsKKyAgICAgICAgICAgIHJldHVybiBHcmlk
U3BhY2UgeyBtaW5pbXVtV2lkdGgsIG1heGltdW1XaWR0aCAtIG1pbmltdW1XaWR0aCB9OworICAg
ICAgICB9CisgICAgICAgIC8vIFdoZW4gdGhlIGNvbHVtbiBoYXMgYSBmaXhlZCB3aWR0aCBjZWxs
LCB0aGUgbWF4aW11bSB3aWR0aCBiYWxhbmNpbmcgaXMgYmFzZWQgb24gdGhlIG1pbmltdW0gd2lk
dGguCisgICAgICAgIGlmIChjb2x1bW4uaXNGaXhlZFdpZHRoKCkpCisgICAgICAgICAgICByZXR1
cm4gR3JpZFNwYWNlIHsgbWluaW11bVdpZHRoLCBtYXhpbXVtV2lkdGggfTsKKyAgICAgICAgcmV0
dXJuIEdyaWRTcGFjZSB7IG1heGltdW1XaWR0aCwgbWF4aW11bVdpZHRoIH07CisgICAgfSk7Cit9
CisKK1RhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlTGF5b3V0OjpEaXN0cmlidXRlZFNwYWNl
cyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dDo6ZGlzdHJpYnV0ZWRWZXJ0aWNh
bFNwYWNlKE9wdGlvbmFsPExheW91dFVuaXQ+IGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpCit7Cisg
ICAgYXV0byYgcm93cyA9IG1fZ3JpZC5yb3dzKCk7CisgICAgYXV0byYgY29sdW1ucyA9IG1fZ3Jp
ZC5jb2x1bW5zKCk7CisKKyAgICBWZWN0b3I8TGF5b3V0VW5pdD4gcm93SGVpZ2h0KHJvd3Muc2l6
ZSgpKTsKKyAgICBhdXRvIHRhYmxlVXNlZEhlaWdodCA9IExheW91dFVuaXQgeyB9OworICAgIC8v
IDIuIENvbGxlY3QgaW5pdGlhbCwgYmFzZWxpbmUgYWxpZ25lZCByb3cgaGVpZ2h0cy4KKyAgICBm
b3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5k
ZXgpIHsKKyAgICAgICAgYXV0byBtYXhpbXVtQ29sdW1uQXNjZW50ID0gSW5saW5lTGF5b3V0VW5p
dCB7IH07CisgICAgICAgIGF1dG8gbWF4aW11bUNvbHVtbkRlc2NlbnQgPSBJbmxpbmVMYXlvdXRV
bml0IHsgfTsKKyAgICAgICAgLy8gSW5pdGlhbCBtaW5pbXVtIGhlaWdodCBpcyB0aGUgY29tcHV0
ZWQgaGVpZ2h0IGlmIGF2YWlsYWJsZSA8dHIgc3R5bGU9ImhlaWdodDogMTAwcHgiPjx0ZD48L3Rk
PjwvdHI+CisgICAgICAgIHJvd0hlaWdodFtyb3dJbmRleF0gPSBmb3JtYXR0aW5nQ29udGV4dCgp
Lmdlb21ldHJ5KCkuY29tcHV0ZWRIZWlnaHQocm93cy5saXN0KClbcm93SW5kZXhdLmJveCgpLCBh
dmFpbGFibGVWZXJ0aWNhbFNwYWNlKS52YWx1ZU9yKDBfbHUpOworICAgICAgICBmb3IgKHNpemVf
dCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29sdW1u
SW5kZXgpIHsKKyAgICAgICAgICAgIGF1dG8mIHNsb3QgPSAqbV9ncmlkLnNsb3QoeyBjb2x1bW5J
bmRleCwgcm93SW5kZXggfSk7CisgICAgICAgICAgICBpZiAoc2xvdC5pc1Jvd1NwYW5uZWQoKSkK
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChzbG90Lmhhc1Jvd1Nw
YW4oKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIFRoZSBtaW5p
bXVtIGhlaWdodCBvZiBhIHJvdyAod2l0aG91dCBzcGFubmluZy1yZWxhdGVkIGhlaWdodCBkaXN0
cmlidXRpb24pIGlzIGRlZmluZWQgYXMgdGhlIGhlaWdodCBvZiBhbiBoeXBvdGhldGljYWwKKyAg
ICAgICAgICAgIC8vIGxpbmVib3ggY29udGFpbmluZyB0aGUgY2VsbHMgb3JpZ2luYXRpbmcgaW4g
dGhlIHJvdy4KKyAgICAgICAgICAgIGF1dG8mIGNlbGwgPSBzbG90LmNlbGwoKTsKKyAgICAgICAg
ICAgIGF1dG8mIGNlbGxCb3ggPSBjZWxsLmJveCgpOworICAgICAgICAgICAgYXV0byBoZWlnaHQg
PSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGNlbGxCb3gpLmJvcmRlckJveEhl
aWdodCgpOworICAgICAgICAgICAgaWYgKGNlbGxCb3guc3R5bGUoKS52ZXJ0aWNhbEFsaWduKCkg
PT0gVmVydGljYWxBbGlnbjo6QmFzZWxpbmUpIHsKKyAgICAgICAgICAgICAgICBtYXhpbXVtQ29s
dW1uQXNjZW50ID0gc3RkOjptYXgobWF4aW11bUNvbHVtbkFzY2VudCwgY2VsbC5iYXNlbGluZSgp
KTsKKyAgICAgICAgICAgICAgICBtYXhpbXVtQ29sdW1uRGVzY2VudCA9IHN0ZDo6bWF4KG1heGlt
dW1Db2x1bW5EZXNjZW50LCBoZWlnaHQgLSBjZWxsLmJhc2VsaW5lKCkpOworICAgICAgICAgICAg
ICAgIHJvd0hlaWdodFtyb3dJbmRleF0gPSBzdGQ6Om1heChyb3dIZWlnaHRbcm93SW5kZXhdLCBM
YXlvdXRVbml0IHsgbWF4aW11bUNvbHVtbkFzY2VudCArIG1heGltdW1Db2x1bW5EZXNjZW50IH0p
OworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcm93SGVpZ2h0W3Jvd0luZGV4
XSA9IHN0ZDo6bWF4KHJvd0hlaWdodFtyb3dJbmRleF0sIGhlaWdodCk7CisgICAgICAgIH0KKyAg
ICAgICAgdGFibGVVc2VkSGVpZ2h0ICs9IHJvd0hlaWdodFtyb3dJbmRleF07CisgICAgfQorICAg
IC8vIEZJWE1FOiBDb2xsZWN0IHNwYW5uaW5nIHJvdyBtYXhpbXVtIGhlaWdodHMuCisKKyAgICB0
YWJsZVVzZWRIZWlnaHQgKz0gKHJvd3Muc2l6ZSgpICsgMSkgKiBtX2dyaWQudmVydGljYWxTcGFj
aW5nKCk7CisgICAgYXV0byBhdmFpbGFibGVTcGFjZSA9IHN0ZDo6bWF4KGF2YWlsYWJsZVZlcnRp
Y2FsU3BhY2UudmFsdWVPcigwX2x1KSwgdGFibGVVc2VkSGVpZ2h0KTsKKyAgICAvLyBEaXN0cmli
dXRlIGV4dHJhIHNwYWNlIGlmIHRoZSB0YWJsZSBpcyBzdXBwb3NlZCB0byBiZSB0YWxsZXIgdGhh
biB0aGUgc3VtIG9mIHRoZSByb3cgaGVpZ2h0cy4KKyAgICByZXR1cm4gZGlzdHJpYnV0ZUF2YWls
YWJsZVNwYWNlPFJvd1NwYW4+KG1fZ3JpZCwgYXZhaWxhYmxlU3BhY2UsIFsmXSAoY29uc3QgVGFi
bGVHcmlkOjpTbG90JiBzbG90LCBzaXplX3Qgcm93SW5kZXgpIHsKKyAgICAgICAgaWYgKHNsb3Qu
aGFzUm93U3BhbigpKQorICAgICAgICAgICAgcmV0dXJuIEdyaWRTcGFjZSB7IGZvcm1hdHRpbmdD
b250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goc2xvdC5jZWxsKCkuYm94KCkpLmJvcmRlckJveEhlaWdo
dCgpLCBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KHNsb3QuY2VsbCgpLmJveCgp
KS5ib3JkZXJCb3hIZWlnaHQoKSB9OworICAgICAgICBhdXRvJiByb3dzID0gbV9ncmlkLnJvd3Mo
KTsKKyAgICAgICAgYXV0byBjb21wdXRlZFJvd0hlaWdodCA9IGZvcm1hdHRpbmdDb250ZXh0KCku
Z2VvbWV0cnkoKS5jb21wdXRlZEhlaWdodChyb3dzLmxpc3QoKVtyb3dJbmRleF0uYm94KCksIHsg
fSk7CisgICAgICAgIGF1dG8gaGVpZ2h0ID0gc3RkOjptYXg8ZmxvYXQ+KHJvd0hlaWdodFtyb3dJ
bmRleF0sIGNvbXB1dGVkUm93SGVpZ2h0LnZhbHVlT3IoMF9sdSkpOworICAgICAgICByZXR1cm4g
R3JpZFNwYWNlIHsgaGVpZ2h0LCBoZWlnaHQgfTsKKyAgICB9KTsKK30KKworfQorfQorCisjZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUNvbnRlbnRCcmVha2VyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggOTQwYTZkYTlmOWMxNGYwMTQ0NTFmYWRhMjQ2ZmIwZWJjZDEyZDJiOC4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5jcHAKKysrIC9kZXYvbnVs
bApAQCAtMSw1MzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAq
IGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNp
bmNsdWRlICJJbmxpbmVDb250ZW50QnJlYWtlci5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JN
QVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgotI2luY2x1ZGUgIkh5
cGhlbmF0aW9uLmgiCi0jaW5jbHVkZSAiSW5saW5lSXRlbS5oIgotI2luY2x1ZGUgIklubGluZVRl
eHRJdGVtLmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCi0jaW5jbHVkZSAiVGV4
dFV0aWwuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLQot
I2lmIEFTU0VSVF9FTkFCTEVECi1zdGF0aWMgaW5saW5lIGJvb2wgaGFzVHJhaWxpbmdUZXh0Q29u
dGVudChjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQmIGNvbnRp
bnVvdXNDb250ZW50KQotewotICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJzZWRS
YW5nZShjb250aW51b3VzQ29udGVudC5ydW5zKCkpKSB7Ci0gICAgICAgIGF1dG8mIGlubGluZUl0
ZW0gPSBydW4uaW5saW5lSXRlbTsKLSAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNJbmxpbmVCb3hT
dGFydCgpIHx8IGlubGluZUl0ZW0uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAgICAgICAgIGNvbnRp
bnVlOwotICAgICAgICByZXR1cm4gaW5saW5lSXRlbS5pc1RleHQoKTsKLSAgICB9Ci0gICAgcmV0
dXJuIGZhbHNlOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgYm9vbCBoYXNMZWFkaW5nVGV4
dENvbnRlbnQoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50JiBj
b250aW51b3VzQ29udGVudCkKLXsKLSAgICBmb3IgKGF1dG8mIHJ1biA6IGNvbnRpbnVvdXNDb250
ZW50LnJ1bnMoKSkgewotICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gcnVuLmlubGluZUl0ZW07
Ci0gICAgICAgIGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVt
LmlzSW5saW5lQm94RW5kKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcmV0dXJu
IGlubGluZUl0ZW0uaXNUZXh0KCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3Rh
dGljIGlubGluZSBib29sIGhhc1RleHRSdW4oY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNv
bnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkKLXsKLSAgICAvLyA8c3Bhbj50ZXh0
PC9zcGFuPiBpcyBjb25zaWRlcmVkIGEgdGV4dCBydW4gZXZlbiB3aXRoIHRoZSBbaW5saW5lIGJv
eCBzdGFydF1baW5saW5lIGJveCBlbmRdIGlubGluZSBpdGVtcy4KLSAgICAvLyBCYXNlZCBvbiBz
dGFuZGFyZHMgY29tbWl0IGJvdW5kYXJ5IHJ1bGVzIGl0IHdvdWxkIGJlIGVub3VnaCB0byBjaGVj
ayB0aGUgZmlyc3QgaW5saW5lIGl0ZW0sIGJ1dCBkdWUgdG8gdGhlIHRhYmxlIHF1aXJrLCB3ZSBj
YW4gaGF2ZQotICAgIC8vIGltYWdlIGFuZCB0ZXh0IG5leHQgdG8gZWFjaCBvdGhlciBpbnNpZGUg
YSBjb250aW51b3VzIHNldCBvZiBydW5zIChzZWUgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1
aXJrczo6aGFzU29mdFdyYXBPcHBvcnR1bml0eUF0SW1hZ2UpLgotICAgIGZvciAoYXV0byYgcnVu
IDogY29udGludW91c0NvbnRlbnQucnVucygpKSB7Ci0gICAgICAgIGlmIChydW4uaW5saW5lSXRl
bS5pc1RleHQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1Zpc3VhbGx5RW1wdHlXaGl0ZXNwYWNl
Q29udGVudChjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQmIGNv
bnRpbnVvdXNDb250ZW50KQotewotICAgIC8vIFs8c3Bhbj48L3NwYW4+IF0gWzxzcGFuPiA8L3Nw
YW4+XSBbIDxzcGFuIHN0eWxlPSJwYWRkaW5nOiAwcHg7Ij48L3NwYW4+XSBhcmUgYWxsIGNvbnNp
ZGVyZWQgdmlzdWFsbHkgZW1wdHkgd2hpdGVzcGFjZSBjb250ZW50LgotICAgIC8vIFs8c3BhbiBz
dHlsZT0iYm9yZGVyOiAxcHggc29saWQgcmVkIj48L3NwYW4+IF0gd2hpbGUgdGhpcyBpcyB3aGl0
ZXNwYWNlIGNvbnRlbnQgb25seSwgaXQgaXMgbm90IGNvbnNpZGVyZWQgdmlzdWFsbHkgZW1wdHku
Ci0gICAgLy8gRHVlIHRvIGNvbW1pdCBib3VuZGFyeSBydWxlcywgd2UganVzdCBuZWVkIHRvIGNo
ZWNrIHRoZSBmaXJzdCBub24tdHlwZWxlc3MgaW5saW5lIGl0ZW0gKGNhbid0IGhhdmUgYm90aCBb
aW1nXSBhbmQgW3RleHRdKQotICAgIGZvciAoYXV0byYgcnVuIDogY29udGludW91c0NvbnRlbnQu
cnVucygpKSB7Ci0gICAgICAgIGF1dG8mIGlubGluZUl0ZW0gPSBydW4uaW5saW5lSXRlbTsKLSAg
ICAgICAgLy8gRklYTUU6IGNoZWNrIGZvciBwYWRkaW5nIGJvcmRlciBldGMuCi0gICAgICAgIGlm
IChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94
RW5kKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcmV0dXJuIGlubGluZUl0ZW0u
aXNUZXh0KCkgJiYgZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGlubGluZUl0ZW0pLmlzV2hpdGVz
cGFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9v
bCBpc05vbkNvbnRlbnRSdW5zT25seShjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGlu
dW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250ZW50KQotewotICAgIC8vIDxzcGFuPjwvc3Bhbj4g
PC0gbm9uIGNvbnRlbnQgcnVucy4KLSAgICBmb3IgKGF1dG8mIHJ1biA6IGNvbnRpbnVvdXNDb250
ZW50LnJ1bnMoKSkgewotICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gcnVuLmlubGluZUl0ZW07
Ci0gICAgICAgIGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVt
LmlzSW5saW5lQm94RW5kKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSBPcHRp
b25hbDxzaXplX3Q+IGZpcnN0VGV4dFJ1bkluZGV4KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2Vy
OjpDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQpCi17Ci0gICAgYXV0byYgcnVu
cyA9IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKTsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7
IGluZGV4IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsKLSAgICAgICAgaWYgKHJ1bnNbaW5kZXhd
LmlubGluZUl0ZW0uaXNUZXh0KCkpCi0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQot
ICAgIHJldHVybiB7IH07Ci19Ci0KLWJvb2wgSW5saW5lQ29udGVudEJyZWFrZXI6OmlzV3JhcHBp
bmdBbGxvd2VkKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0pCi17Ci0gICAgYXV0byYgc3R5
bGVUb1VzZSA9IGlubGluZUl0ZW0uaXNCb3goKSA/IGlubGluZUl0ZW0ubGF5b3V0Qm94KCkucGFy
ZW50KCkuc3R5bGUoKSA6IGlubGluZUl0ZW0ubGF5b3V0Qm94KCkuc3R5bGUoKTsgCi0gICAgLy8g
RG8gbm90IHRyeSB0byB3cmFwIG92ZXJmbG93biAncHJlJyBhbmQgJ25vLXdyYXAnIGNvbnRlbnQg
dG8gbmV4dCBsaW5lLgotICAgIHJldHVybiBzdHlsZVRvVXNlLndoaXRlU3BhY2UoKSAhPSBXaGl0
ZVNwYWNlOjpQcmUgJiYgc3R5bGVUb1VzZS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6Tm9X
cmFwOwotfQotCi1ib29sIElubGluZUNvbnRlbnRCcmVha2VyOjpzaG91bGRLZWVwRW5kT2ZMaW5l
V2hpdGVzcGFjZShjb25zdCBDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQpIGNv
bnN0Ci17Ci0gICAgLy8gR3JhYiB0aGUgc3R5bGUgYW5kIGNoZWNrIGZvciB3aGl0ZS1zcGFjZSBw
cm9wZXJ0eSB0byBkZWNpZGUgd2hldGhlciB3ZSBzaG91bGQgbGV0IHRoaXMgd2hpdGVzcGFjZSBj
b250ZW50IG92ZXJmbG93IHRoZSBjdXJyZW50IGxpbmUuCi0gICAgLy8gTm90ZSB0aGF0IHRoZSAi
a2VlcCIgaW4gdGhpcyBjb250ZXh0IG1lYW5zIHdlIGxldCB0aGUgd2hpdGVzcGFjZSBjb250ZW50
IHNpdCBvbiB0aGUgY3VycmVudCBsaW5lLgotICAgIC8vIEl0IG1pZ2h0IHZlcnkgd2VsbCBnZXQg
Y29sbGFwc2VkIHdoZW4gd2UgY2xvc2UgdGhlIGxpbmUgKG5vcm1hbC9ub3dyYXAvcHJlLWxpbmUp
LgotICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXRleHQtMy8jd2hpdGUtc3Bh
Y2UtcHJvcGVydHkKLSAgICBhdXRvIHdoaXRlc3BhY2UgPSBjb250aW51b3VzQ29udGVudC5ydW5z
KClbKmZpcnN0VGV4dFJ1bkluZGV4KGNvbnRpbnVvdXNDb250ZW50KV0uaW5saW5lSXRlbS5zdHls
ZSgpLndoaXRlU3BhY2UoKTsKLSAgICByZXR1cm4gd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpO
b3JtYWwgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpOb1dyYXAgfHwgd2hpdGVzcGFjZSA9
PSBXaGl0ZVNwYWNlOjpQcmVXcmFwIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlTGlu
ZTsKLX0KLQotSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdCBJbmxpbmVDb250ZW50QnJlYWtl
cjo6cHJvY2Vzc0lubGluZUNvbnRlbnQoY29uc3QgQ29udGludW91c0NvbnRlbnQmIGNhbmRpZGF0
ZUNvbnRlbnQsIGNvbnN0IExpbmVTdGF0dXMmIGxpbmVTdGF0dXMpCi17Ci0gICAgQVNTRVJUKCFz
dGQ6OmlzbmFuKGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGgpKTsKLSAgICBhdXRvIHByb2Nlc3ND
YW5kaWRhdGVDb250ZW50ID0gWyZdIHsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZUNvbnRlbnQubG9n
aWNhbFdpZHRoKCkgPD0gbGluZVN0YXR1cy5hdmFpbGFibGVXaWR0aCkKLSAgICAgICAgICAgIHJl
dHVybiBSZXN1bHQgeyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCB9OwotI2lmIFVTRV9GTE9BVF9BU19J
TkxJTkVfTEFZT1VUX1VOSVQKLSAgICAgICAgLy8gUHJlZmVycmVkIHdpZHRoIGNvbXB1dGF0aW9u
IHN1bXMgdXAgZmxvYXRzIHdoaWxlIGxpbmUgYnJlYWtlciBzdWJ0cmFjdHMgdGhlbS4gVGhpcyBj
YW4gbGVhZCB0byBlcHNpbG9uLXNjYWxlIGRpZmZlcmVuY2VzLgotICAgICAgICBpZiAoV1RGOjph
cmVFc3NlbnRpYWxseUVxdWFsKGNhbmRpZGF0ZUNvbnRlbnQubG9naWNhbFdpZHRoKCksIGxpbmVT
dGF0dXMuYXZhaWxhYmxlV2lkdGgpKQotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdCB7IFJlc3Vs
dDo6QWN0aW9uOjpLZWVwIH07Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NPdmVyZmxv
d2luZ0NvbnRlbnQoY2FuZGlkYXRlQ29udGVudCwgbGluZVN0YXR1cyk7Ci0gICAgfTsKLQotICAg
IGF1dG8gcmVzdWx0ID0gcHJvY2Vzc0NhbmRpZGF0ZUNvbnRlbnQoKTsKLSAgICBpZiAocmVzdWx0
LmFjdGlvbiA9PSBSZXN1bHQ6OkFjdGlvbjo6V3JhcCAmJiBsaW5lU3RhdHVzLnRyYWlsaW5nU29m
dEh5cGhlbldpZHRoICYmIGhhc0xlYWRpbmdUZXh0Q29udGVudChjYW5kaWRhdGVDb250ZW50KSkg
ewotICAgICAgICAvLyBBIHRyYWlsaW5nIHNvZnQgaHlwaGVuIHdpdGggYSB3cmFwcGVkIHRleHQg
Y29udGVudCB0dXJucyBpbnRvIGEgdmlzaWJsZSBoeXBoZW4uCi0gICAgICAgIC8vIExldCdzIGNo
ZWNrIGlmIHRoZXJlJ3MgZW5vdWdoIHNwYWNlIGZvciB0aGUgaHlwaGVuIGNoYXJhY3Rlci4KLSAg
ICAgICAgYXV0byBoeXBoZW5PdmVyZmxvd3MgPSAqbGluZVN0YXR1cy50cmFpbGluZ1NvZnRIeXBo
ZW5XaWR0aCA+IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGg7Ci0gICAgICAgIGF1dG8gYWN0aW9u
ID0gaHlwaGVuT3ZlcmZsb3dzID8gUmVzdWx0OjpBY3Rpb246OlJldmVydFRvTGFzdE5vbk92ZXJm
bG93aW5nV3JhcE9wcG9ydHVuaXR5IDogUmVzdWx0OjpBY3Rpb246OldyYXBXaXRoSHlwaGVuOwot
ICAgICAgICByZXN1bHQgPSB7IGFjdGlvbiwgSXNFbmRPZkxpbmU6OlllcyB9OwotICAgIH0KLSAg
ICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJ1Y3QgT3ZlcmZsb3dpbmdUZXh0Q29udGVudCB7Ci0g
ICAgc2l6ZV90IHJ1bkluZGV4IHsgMCB9OyAvLyBPdmVyZmxvd2luZyBydW4gaW5kZXguIFRoZXJl
J3MgYWx3YXlzIGFuIG92ZXJmbG93aW5nIHJ1bi4KLSAgICBzdHJ1Y3QgQnJlYWtpbmdQb3NpdGlv
biB7Ci0gICAgICAgIHNpemVfdCBydW5JbmRleCB7IDAgfTsKLSAgICAgICAgc3RydWN0IFRyYWls
aW5nQ29udGVudCB7Ci0gICAgICAgICAgICAvLyBUcmFpbGluZyBjb250ZW50IGlzIGVpdGhlciB0
aGUgcnVuJ3MgbGVmdCBzaWRlICh3aGVuIHdlIGJyZWFrIHRoZSBydW4gc29tZXdoZXJlIGluIHRo
ZSBtaWRkbGUpIG9yIHRoZSBwcmV2aW91cyBydW4uCi0gICAgICAgICAgICAvLyBTb21ldGltZXMg
dGhlIGJyZWFraW5nIHBvc2l0aW9uIGlzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgZmly
c3QgcnVuLCBzbyB0aGVyZSdzIG5vIHRyYWlsaW5nIHJ1biBhdCBhbGwuCi0gICAgICAgICAgICBi
b29sIG92ZXJmbG93cyB7IGZhbHNlIH07Ci0gICAgICAgICAgICBPcHRpb25hbDxJbmxpbmVDb250
ZW50QnJlYWtlcjo6UGFydGlhbFJ1bj4gcGFydGlhbFJ1biB7IH07Ci0gICAgICAgIH07Ci0gICAg
ICAgIE9wdGlvbmFsPFRyYWlsaW5nQ29udGVudD4gdHJhaWxpbmdDb250ZW50IHsgfTsKLSAgICB9
OwotICAgIE9wdGlvbmFsPEJyZWFraW5nUG9zaXRpb24+IGJyZWFraW5nUG9zaXRpb24geyB9OyAv
LyBXaGVyZSB3ZSBhY3R1YWxseSBicmVhayB0aGlzIG92ZXJmbG93aW5nIGNvbnRlbnQuCi19Owot
Ci1JbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0IElubGluZUNvbnRlbnRCcmVha2VyOjpwcm9j
ZXNzT3ZlcmZsb3dpbmdDb250ZW50KGNvbnN0IENvbnRpbnVvdXNDb250ZW50JiBvdmVyZmxvd0Nv
bnRlbnQsIGNvbnN0IExpbmVTdGF0dXMmIGxpbmVTdGF0dXMpIGNvbnN0Ci17Ci0gICAgYXV0byBj
b250aW51b3VzQ29udGVudCA9IENvbnRpbnVvdXNDb250ZW50IHsgb3ZlcmZsb3dDb250ZW50IH07
Ci0gICAgQVNTRVJUKCFjb250aW51b3VzQ29udGVudC5ydW5zKCkuaXNFbXB0eSgpKTsKLQotICAg
IEFTU0VSVChjb250aW51b3VzQ29udGVudC5sb2dpY2FsV2lkdGgoKSA+IGxpbmVTdGF0dXMuYXZh
aWxhYmxlV2lkdGgpOwotICAgIGlmIChjb250aW51b3VzQ29udGVudC5oYXNUcmFpbGluZ0NvbGxh
cHNpYmxlQ29udGVudCgpKSB7Ci0gICAgICAgIEFTU0VSVChoYXNUcmFpbGluZ1RleHRDb250ZW50
KG92ZXJmbG93Q29udGVudCkpOwotICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgY29udGVu
dCBmaXRzIHdpdGhvdXQgdGhlIHRyYWlsaW5nIGNvbGxhcHNpYmxlIHBhcnQuCi0gICAgICAgIGlm
IChjb250aW51b3VzQ29udGVudC5ub25Db2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCgpIDw9IGxpbmVT
dGF0dXMuYXZhaWxhYmxlV2lkdGgpCi0gICAgICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlv
bjo6S2VlcCwgSXNFbmRPZkxpbmU6Ok5vIH07Ci0gICAgICAgIC8vIE5vdyBjaGVjayBpZiB3ZSBj
YW4gdHJpbSB0aGUgbGluZSB0b28uCi0gICAgICAgIGlmIChsaW5lU3RhdHVzLmhhc0Z1bGx5Q29s
bGFwc2libGVUcmFpbGluZ1J1biAmJiBjb250aW51b3VzQ29udGVudC5pc0Z1bGx5Q29sbGFwc2li
bGUoKSkgewotICAgICAgICAgICAgLy8gSWYgdGhpcyBuZXcgY29udGVudCBpcyBmdWxseSBjb2xs
YXBzaWJsZSwgaXQgc2hvdWxkIHN1cmVseSBmaXQuCi0gICAgICAgICAgICByZXR1cm4geyBSZXN1
bHQ6OkFjdGlvbjo6S2VlcCwgSXNFbmRPZkxpbmU6Ok5vIH07Ci0gICAgICAgIH0KLSAgICB9IGVs
c2UgaWYgKGxpbmVTdGF0dXMuY29sbGFwc2libGVXaWR0aCAmJiBpc05vbkNvbnRlbnRSdW5zT25s
eShjb250aW51b3VzQ29udGVudCkpIHsKLSAgICAgICAgLy8gTGV0J3Mgc2VlIGlmIHRoZSBub24t
Y29udGVudCBydW5zIGZpdCB3aGVuIHRoZSBsaW5lIGhhcyB0cmFpbGluZyBjb2xsYXBzaWJsZSBj
b250ZW50LgotICAgICAgICAvLyAidGV4dCBjb250ZW50IDxzcGFuIHN0eWxlPSJwYWRkaW5nOiAx
cHgiPjwvc3Bhbj4iIDwtIHRoZSA8c3Bhbj48L3NwYW4+IHJ1bnMgY291bGQgZml0IGFmdGVyIGNv
bGxhcHNpbmcgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UuCi0gICAgICAgIGlmIChjb250aW51b3Vz
Q29udGVudC5sb2dpY2FsV2lkdGgoKSA8PSBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoICsgbGlu
ZVN0YXR1cy5jb2xsYXBzaWJsZVdpZHRoKQotICAgICAgICAgICAgcmV0dXJuIHsgUmVzdWx0OjpB
Y3Rpb246OktlZXAgfTsKLSAgICB9Ci0gICAgaWYgKGlzVmlzdWFsbHlFbXB0eVdoaXRlc3BhY2VD
b250ZW50KGNvbnRpbnVvdXNDb250ZW50KSAmJiBzaG91bGRLZWVwRW5kT2ZMaW5lV2hpdGVzcGFj
ZShjb250aW51b3VzQ29udGVudCkpIHsKLSAgICAgICAgLy8gVGhpcyBvdmVyZmxvd2luZyBjb250
ZW50IGFwcGFyZW50bHkgZmFsbHMgaW50byB0aGUgcmVtb3ZlL2hhbmcgZW5kLW9mLWxpbmUtc3Bh
Y2VzIGNhdGVnb3J5LgotICAgICAgICAvLyBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10
ZXh0LTMvI3doaXRlLXNwYWNlLXByb3BlcnR5IG1hdHJpeAotICAgICAgICByZXR1cm4geyBSZXN1
bHQ6OkFjdGlvbjo6S2VlcCB9OwotICAgIH0KLQotICAgIHNpemVfdCBvdmVyZmxvd2luZ1J1bklu
ZGV4ID0gMDsKLSAgICBpZiAoaGFzVGV4dFJ1bihjb250aW51b3VzQ29udGVudCkpIHsKLSAgICAg
ICAgYXV0byB0cnlCcmVha2luZ0NvbnRlbnRXaXRoVGV4dCA9IFsmXSgpIC0+IE9wdGlvbmFsPFJl
c3VsdD4gewotICAgICAgICAgICAgLy8gMS4gVGhpcyB0ZXh0IGNvbnRlbnQgaXMgbm90IGJyZWFr
YWJsZS4KLSAgICAgICAgICAgIC8vIDIuIFRoaXMgYnJlYWthYmxlIHRleHQgY29udGVudCBkb2Vz
IG5vdCBmaXQgYXQgYWxsLiBOb3QgZXZlbiB0aGUgZmlyc3QgZ2x5cGguIFRoaXMgaXMgYSB2ZXJ5
IHNwZWNpYWwgY2FzZS4KLSAgICAgICAgICAgIC8vIDMuIFdlIGNhbiBicmVhayB0aGUgY29udGVu
dCBidXQgaXQgc3RpbGwgb3ZlcmZsb3dzLgotICAgICAgICAgICAgLy8gNC4gTWFuYWdlZCB0byBi
cmVhayB0aGUgY29udGVudCBiZWZvcmUgdGhlIG92ZXJmbG93IHBvaW50LgotICAgICAgICAgICAg
YXV0byBvdmVyZmxvd2luZ0NvbnRlbnQgPSBwcm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50V2l0aFRl
eHQoY29udGludW91c0NvbnRlbnQsIGxpbmVTdGF0dXMpOwotICAgICAgICAgICAgb3ZlcmZsb3dp
bmdSdW5JbmRleCA9IG92ZXJmbG93aW5nQ29udGVudC5ydW5JbmRleDsKLSAgICAgICAgICAgIGlm
ICghb3ZlcmZsb3dpbmdDb250ZW50LmJyZWFraW5nUG9zaXRpb24pCi0gICAgICAgICAgICAgICAg
cmV0dXJuIHsgfTsKLSAgICAgICAgICAgIGF1dG8gdHJhaWxpbmdDb250ZW50ID0gb3ZlcmZsb3dp
bmdDb250ZW50LmJyZWFraW5nUG9zaXRpb24tPnRyYWlsaW5nQ29udGVudDsKLSAgICAgICAgICAg
IGlmICghdHJhaWxpbmdDb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgdHJpZWQgdG8g
YnJlYWsgdGhlIGNvbnRlbnQgYnV0IHRoZSBhdmFpbGFibGUgc3BhY2UgY2FuJ3QgZXZlbiBhY2Nv
bW1vZGF0ZSB0aGUgZmlyc3QgZ2x5cGguCi0gICAgICAgICAgICAgICAgLy8gMS4gV3JhcCB0aGUg
Y29udGVudCBvdmVyIHRvIHRoZSBuZXh0IGxpbmUgd2hlbiB3ZSd2ZSBnb3QgY29udGVudCBvbiB0
aGUgbGluZSBhbHJlYWR5LgotICAgICAgICAgICAgICAgIC8vIDIuIEtlZXAgdGhlIGZpcnN0IGds
eXBoIG9uIHRoZSBlbXB0eSBsaW5lIChvciBrZWVwIHRoZSB3aG9sZSBydW4gaWYgaXQgaGFzIG9u
bHkgb25lIGdseXBoL2NvbXBsZXRlbHkgZW1wdHkpLgotICAgICAgICAgICAgICAgIGlmIChsaW5l
U3RhdHVzLmhhc0NvbnRlbnQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBS
ZXN1bHQ6OkFjdGlvbjo6V3JhcCwgSXNFbmRPZkxpbmU6OlllcyB9OwotICAgICAgICAgICAgICAg
IGF1dG8gbGVhZGluZ1RleHRSdW5JbmRleCA9ICpmaXJzdFRleHRSdW5JbmRleChjb250aW51b3Vz
Q29udGVudCk7Ci0gICAgICAgICAgICAgICAgYXV0byYgaW5saW5lVGV4dEl0ZW0gPSBkb3duY2Fz
dDxJbmxpbmVUZXh0SXRlbT4oY29udGludW91c0NvbnRlbnQucnVucygpW2xlYWRpbmdUZXh0UnVu
SW5kZXhdLmlubGluZUl0ZW0pOwotICAgICAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5s
ZW5ndGgoKSA8PSAxKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0
OjpBY3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpZZXMgfTsKLSAgICAgICAgICAgICAgICBhdXRv
IGZpcnN0Q2hhcmFjdGVyV2lkdGggPSBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0sIGlu
bGluZVRleHRJdGVtLnN0YXJ0KCksIGlubGluZVRleHRJdGVtLnN0YXJ0KCkgKyAxLCBsaW5lU3Rh
dHVzLmNvbnRlbnRMb2dpY2FsUmlnaHQpOwotICAgICAgICAgICAgICAgIGF1dG8gZmlyc3RDaGFy
YWN0ZXJSdW4gPSBQYXJ0aWFsUnVuIHsgMSwgZmlyc3RDaGFyYWN0ZXJXaWR0aCB9OwotICAgICAg
ICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6OkFjdGlvbjo6QnJlYWssIElzRW5kT2ZM
aW5lOjpZZXMsIFJlc3VsdDo6UGFydGlhbFRyYWlsaW5nQ29udGVudCB7IGxlYWRpbmdUZXh0UnVu
SW5kZXgsIGZpcnN0Q2hhcmFjdGVyUnVuIH0gfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGlmICh0cmFpbGluZ0NvbnRlbnQtPm92ZXJmbG93cyAmJiBsaW5lU3RhdHVzLmhhc0NvbnRlbnQp
IHsKLSAgICAgICAgICAgICAgICAvLyBXZSBtYW5hZ2VkIHRvIGJyZWFrIGEgcnVuIHdpdGggb3Zl
cmZsb3cgYnV0IHRoZSBsaW5lIGFscmVhZHkgaGFzIGNvbnRlbnQuIExldCdzIHdyYXAgaXQgdG8g
dGhlIG5leHQgbGluZS4KLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpB
Y3Rpb246OldyYXAsIElzRW5kT2ZMaW5lOjpZZXMgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIC8vIEVpdGhlciB3ZSBtYW5hZ2VkIHRvIGJyZWFrIHdpdGggbm8gb3ZlcmZsb3cgb3IgdGhl
IGxpbmUgaXMgZW1wdHkuCi0gICAgICAgICAgICBhdXRvIHRyYWlsaW5nUGFydGlhbENvbnRlbnQg
PSBSZXN1bHQ6OlBhcnRpYWxUcmFpbGluZ0NvbnRlbnQgeyBvdmVyZmxvd2luZ0NvbnRlbnQuYnJl
YWtpbmdQb3NpdGlvbi0+cnVuSW5kZXgsIHRyYWlsaW5nQ29udGVudC0+cGFydGlhbFJ1biB9Owot
ICAgICAgICAgICAgcmV0dXJuIFJlc3VsdCB7IFJlc3VsdDo6QWN0aW9uOjpCcmVhaywgSXNFbmRP
ZkxpbmU6OlllcywgdHJhaWxpbmdQYXJ0aWFsQ29udGVudCB9OwotICAgICAgICB9OwotICAgICAg
ICBpZiAoYXV0byByZXN1bHQgPSB0cnlCcmVha2luZ0NvbnRlbnRXaXRoVGV4dCgpKQotICAgICAg
ICAgICAgcmV0dXJuICpyZXN1bHQ7Ci0gICAgfSBlbHNlIGlmIChjb250aW51b3VzQ29udGVudC5y
dW5zKCkuc2l6ZSgpID4gMSkgewotICAgICAgICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIHZh
cmlvdXMgY29udGVudC4KLSAgICAgICAgYXV0byYgcnVucyA9IGNvbnRpbnVvdXNDb250ZW50LnJ1
bnMoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBydW5zLnNpemUoKTsgKytpKSB7
Ci0gICAgICAgICAgICBpZiAocnVuc1tpXS5pbmxpbmVJdGVtLmlzQm94KCkpIHsKLSAgICAgICAg
ICAgICAgICBvdmVyZmxvd2luZ1J1bkluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHdlIGFyZSBub3Qg
YWxsb3dlZCB0byBicmVhayB0aGlzIG92ZXJmbG93aW5nIGNvbnRlbnQsIHdlIHN0aWxsIG5lZWQg
dG8gZGVjaWRlIHdoZXRoZXIga2VlcCBpdCBvciB3cmFwIGl0IHRvIHRoZSBuZXh0IGxpbmUuCi0g
ICAgaWYgKCFsaW5lU3RhdHVzLmhhc0NvbnRlbnQpCi0gICAgICAgIHJldHVybiB7IFJlc3VsdDo6
QWN0aW9uOjpLZWVwLCBJc0VuZE9mTGluZTo6Tm8gfTsKLSAgICAvLyBOb3cgZWl0aGVyIHdyYXAg
dGhpcyBjb250ZW50IG92ZXIgdG8gdGhlIG5leHQgbGluZSBvciByZXZlcnQgYmFjayB0byBhbiBl
YXJsaWVyIHdyYXBwaW5nIG9wcG9ydHVuaXR5LCBvciBub3Qgd3JhcCBhdCBhbGwuCi0gICAgYXV0
byBzaG91bGRXcmFwVW5icmVha2FibGVDb250ZW50VG9OZXh0TGluZSA9IFsmXSB7Ci0gICAgICAg
IC8vIFRoZSBpbmRpdmlkdWFsIHJ1bnMgaW4gdGhpcyBjb250aW51b3VzIGNvbnRlbnQgZG9uJ3Qg
YnJlYWssIGxldCdzIGNoZWNrIGlmIHdlIGFyZSBhbGxvd2VkIHRvIHdyYXAgdGhpcyBjb250ZW50
IHRvIG5leHQgbGluZSAoZS5nLiBwcmUgd291bGQgcHJldmVudCB1cyBmcm9tIHdyYXBwaW5nKS4K
LSAgICAgICAgLy8gUGFyZW50IHN0eWxlIGRyaXZlcyB0aGUgd3JhcHBpbmcgYmVoYXZpb3IgaGVy
ZS4KLSAgICAgICAgLy8gZS5nLiA8ZGl2IHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwIj5zb21l
IHRleHQ8ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBwcmUt
d3JhcCI+PC9kaXY+PC9kaXY+LgotICAgICAgICAvLyBXaGlsZSB0aGUgaW5saW5lLWJsb2NrIGhh
cyBwcmUtd3JhcCB3aGljaCBhbGxvd3Mgd3JhcHBpbmcsIHRoZSBjb250ZW50IGxpdmVzIGluIGEg
bm93cmFwIGNvbnRleHQuCi0gICAgICAgIHJldHVybiBpc1dyYXBwaW5nQWxsb3dlZChjb250aW51
b3VzQ29udGVudC5ydW5zKClbb3ZlcmZsb3dpbmdSdW5JbmRleF0uaW5saW5lSXRlbSk7Ci0gICAg
fTsKLSAgICBpZiAoc2hvdWxkV3JhcFVuYnJlYWthYmxlQ29udGVudFRvTmV4dExpbmUoKSkKLSAg
ICAgICAgcmV0dXJuIHsgUmVzdWx0OjpBY3Rpb246OldyYXAsIElzRW5kT2ZMaW5lOjpZZXMgfTsK
LSAgICBpZiAobGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24p
Ci0gICAgICAgIHJldHVybiB7IFJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xhc3RXcmFwT3Bwb3J0
dW5pdHksIElzRW5kT2ZMaW5lOjpZZXMgfTsKLSAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6
S2VlcCwgSXNFbmRPZkxpbmU6Ok5vIH07Ci19Ci0KLU92ZXJmbG93aW5nVGV4dENvbnRlbnQgSW5s
aW5lQ29udGVudEJyZWFrZXI6OnByb2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnRXaXRoVGV4dChjb25z
dCBDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQsIGNvbnN0IExpbmVTdGF0dXMm
IGxpbmVTdGF0dXMpIGNvbnN0Ci17Ci0gICAgYXV0byYgcnVucyA9IGNvbnRpbnVvdXNDb250ZW50
LnJ1bnMoKTsKLSAgICBBU1NFUlQoIXJ1bnMuaXNFbXB0eSgpKTsKLQotICAgIGF1dG8gaXNCcmVh
a2FibGVSdW4gPSBbXSAoYXV0byYgcnVuKSB7Ci0gICAgICAgIEFTU0VSVChydW4uaW5saW5lSXRl
bS5pc1RleHQoKSB8fCBydW4uaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgcnVuLmlu
bGluZUl0ZW0uaXNJbmxpbmVCb3hFbmQoKSB8fCBydW4uaW5saW5lSXRlbS5sYXlvdXRCb3goKS5p
c0ltYWdlKCkpOwotICAgICAgICBpZiAoIXJ1bi5pbmxpbmVJdGVtLmlzVGV4dCgpKSB7Ci0gICAg
ICAgICAgICAvLyBDYW4ndCBicmVhayBob3Jpem9udGFsIHNwYWNpbmcgLT4gZS5nLiA8c3BhbiBz
dHlsZT0icGFkZGluZy1yaWdodDogMTAwcHg7Ij50ZXh0Y29udGVudDwvc3Bhbj4sIGlmIHRoZSBb
aW5saW5lIGJveCBlbmRdIGlzIHRoZSBvdmVyZmxvd24gaW5saW5lIGl0ZW0KLSAgICAgICAgICAg
IC8vIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUncyBhbm90aGVyIGlubGluZSBpdGVtIGJleW9u
ZCB0aGUgW2lubGluZSBib3ggZW5kXSB0byBzcGxpdC4KLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHRleHQgcnVuIG5lZWRzIHRv
IHN0YXkgb24gdGhlIGN1cnJlbnQgbGluZS4gIAotICAgICAgICByZXR1cm4gaXNXcmFwcGluZ0Fs
bG93ZWQocnVuLmlubGluZUl0ZW0pOwotICAgIH07Ci0KLSAgICBhdXRvIGZpbmRUcmFpbGluZ1J1
bkluZGV4ID0gWyZdIChhdXRvIGJyZWFrYWJsZVJ1bkluZGV4KSAtPiBPcHRpb25hbDxzaXplX3Q+
IHsKLSAgICAgICAgLy8gV2hlbiB0aGUgYnJlYWtpbmcgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lu
bmluZyBvZiB0aGUgcnVuLCB0aGUgdHJhaWxpbmcgcnVuIGlzIHRoZSBwcmV2aW91cyBvbmUuCi0g
ICAgICAgIGlmICghYnJlYWthYmxlUnVuSW5kZXgpCi0gICAgICAgICAgICByZXR1cm4geyB9Owot
ICAgICAgICAvLyBUcnkgbm90IGJyZWFrIGNvbnRlbnQgYXQgaW5saW5lIGJveCBib3VuZGFyeQot
ICAgICAgICAvLyBlLmcuIDxzcGFuPmZpdHM8L3NwYW4+PHNwYW4+b3ZlcmZsb3dzPC9zcGFuPgot
ICAgICAgICAvLyB3aGVuIHRoZSB0ZXh0ICJvdmVyZmxvd3MiIGNvbXBsZXRlbHkgb3ZlcmZsb3dz
LCBsZXQncyBicmVhayB0aGUgY29udGVudCByaWdodCBiZWZvcmUgdGhlICc8c3Bhbj4nLgotICAg
ICAgICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIHN1YnNlcXVlbnQgZW1wdHkgaW5saW5lIGJv
eGVzIGUuZy4KLSAgICAgICAgYXV0byB0cmFpbGluZ0NhbmRpZGF0ZUluZGV4ID0gYnJlYWthYmxl
UnVuSW5kZXggLSAxOwotICAgICAgICBhdXRvIGlzQXRJbmxpbmVCb3ggPSBydW5zW3RyYWlsaW5n
Q2FuZGlkYXRlSW5kZXhdLmlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpOwotICAgICAgICBy
ZXR1cm4gIWlzQXRJbmxpbmVCb3ggPyB0cmFpbGluZ0NhbmRpZGF0ZUluZGV4IDogdHJhaWxpbmdD
YW5kaWRhdGVJbmRleCA/IG1ha2VPcHRpb25hbCh0cmFpbGluZ0NhbmRpZGF0ZUluZGV4IC0gMSkg
OiBXVEY6Om51bGxvcHQ7Ci0gICAgfTsKLQotICAgIC8vIENoZWNrIHdoZXJlIHRoZSBvdmVyZmxv
dyBvY2N1cnMgYW5kIHVzZSB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSB0byBmaWd1cmUgb3V0IHRo
ZSBicmVha2luZyBiZWhhdmlvdXIuCi0gICAgLy8gPHNwYW4gc3R5bGU9IndvcmQtYnJlYWs6IG5v
cm1hbCI+Zmlyc3Q8L3NwYW4+PHNwYW4gc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLWFsbCI+c2Vj
b25kPC9zcGFuPjxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBub3JtYWwiPnRoaXJkPC9zcGFuPgot
Ci0gICAgLy8gRmlyc3QgZmluZCB0aGUgb3ZlcmZsb3dpbmcgcnVuLiAKLSAgICBhdXRvIGFjY3Vt
dWxhdGVkQ29udGVudFdpZHRoID0gSW5saW5lTGF5b3V0VW5pdCB7IH07Ci0gICAgYXV0byBvdmVy
Zmxvd2luZ1J1bkluZGV4ID0gcnVucy5zaXplKCk7IAotICAgIGZvciAoc2l6ZV90IGluZGV4ID0g
MDsgaW5kZXggPCBydW5zLnNpemUoKTsgKytpbmRleCkgewotICAgICAgICBhdXRvIHJ1bkxvZ2lj
YWxXaWR0aCA9IHJ1bnNbaW5kZXhdLmxvZ2ljYWxXaWR0aDsKLSAgICAgICAgaWYgKGFjY3VtdWxh
dGVkQ29udGVudFdpZHRoICsgcnVuTG9naWNhbFdpZHRoICA+IGxpbmVTdGF0dXMuYXZhaWxhYmxl
V2lkdGgpIHsKLSAgICAgICAgICAgIG92ZXJmbG93aW5nUnVuSW5kZXggPSBpbmRleDsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGFjY3VtdWxhdGVkQ29udGVudFdpZHRo
ICs9IHJ1bkxvZ2ljYWxXaWR0aDsKLSAgICB9Ci0gICAgLy8gV2UgaGF2ZSB0byBoYXZlIGFuIG92
ZXJmbG93aW5nIHJ1bi4KLSAgICBSRUxFQVNFX0FTU0VSVChvdmVyZmxvd2luZ1J1bkluZGV4IDwg
cnVucy5zaXplKCkpOwotCi0gICAgYXV0byB0cnlCcmVha2luZ092ZXJmbG93aW5nUnVuID0gWyZd
KCkgLT4gT3B0aW9uYWw8T3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbj4g
ewotICAgICAgICBhdXRvIG92ZXJmbG93aW5nUnVuID0gcnVuc1tvdmVyZmxvd2luZ1J1bkluZGV4
XTsKLSAgICAgICAgaWYgKCFpc0JyZWFrYWJsZVJ1bihvdmVyZmxvd2luZ1J1bikpCi0gICAgICAg
ICAgICByZXR1cm4geyB9OwotICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gdHJ5QnJlYWtp
bmdUZXh0UnVuKG92ZXJmbG93aW5nUnVuLCBsaW5lU3RhdHVzLmNvbnRlbnRMb2dpY2FsUmlnaHQg
KyBhY2N1bXVsYXRlZENvbnRlbnRXaWR0aCwgc3RkOjptYXgoMC4wZiwgbGluZVN0YXR1cy5hdmFp
bGFibGVXaWR0aCAtIGFjY3VtdWxhdGVkQ29udGVudFdpZHRoKSwgbGluZVN0YXR1cy5oYXNXcmFw
T3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICBpZiAocGFydGlh
bFJ1bi0+bGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250
ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgb3ZlcmZsb3dpbmdSdW5JbmRleCwgT3ZlcmZsb3dpbmdU
ZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbjo6VHJhaWxpbmdDb250ZW50IHsgZmFsc2UsIHBh
cnRpYWxSdW4gfSB9OwotICAgICAgICAgICAgLy8gV2hlbiB0aGUgYnJlYWtpbmcgcG9zaXRpb24g
aXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcnVuLCB0aGUgdHJhaWxpbmcgcnVuIGlzIHRoZSBw
cmV2aW91cyBvbmUuCi0gICAgICAgICAgICBpZiAoYXV0byB0cmFpbGluZ1J1bkluZGV4ID0gZmlu
ZFRyYWlsaW5nUnVuSW5kZXgob3ZlcmZsb3dpbmdSdW5JbmRleCkpCi0gICAgICAgICAgICAgICAg
cmV0dXJuIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb24geyAqdHJhaWxp
bmdSdW5JbmRleCwgT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbjo6VHJh
aWxpbmdDb250ZW50IHsgfSB9OwotICAgICAgICAgICAgLy8gU29tZXRpbWVzIHdlIGNhbid0IGFj
Y29tbW9kYXRlIGV2ZW4gdGhlIHZlcnkgZmlyc3QgY2hhcmFjdGVyLiAKLSAgICAgICAgICAgIC8v
IE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHdoZW4gdGhlcmUncyBubyBicmVha2Fi
bGUgcnVuIGluIHRoaXMgc2V0LgotICAgICAgICAgICAgcmV0dXJuIE92ZXJmbG93aW5nVGV4dENv
bnRlbnQ6OkJyZWFraW5nUG9zaXRpb24geyB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB7
IH07Ci0gICAgfTsKLSAgICAvLyBDaGVjayBpZiB3ZSBhY3R1YWxseSBicmVhayB0aGlzIHJ1bi4K
LSAgICBpZiAoYXV0byBicmVha2luZ1Bvc2l0aW9uID0gdHJ5QnJlYWtpbmdPdmVyZmxvd2luZ1J1
bigpKQotICAgICAgICByZXR1cm4geyBvdmVyZmxvd2luZ1J1bkluZGV4LCBicmVha2luZ1Bvc2l0
aW9uIH07Ci0KLSAgICBhdXRvIHRyeUJyZWFraW5nUHJldmlvdXNOb25PdmVyZmxvd2luZ1J1bnMg
PSBbJl0oKSAtPiBPcHRpb25hbDxPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0
aW9uPiB7Ci0gICAgICAgIGF1dG8gcHJldmlvdXNDb250ZW50V2lkdGggPSBhY2N1bXVsYXRlZENv
bnRlbnRXaWR0aDsKLSAgICAgICAgZm9yIChhdXRvIGluZGV4ID0gb3ZlcmZsb3dpbmdSdW5JbmRl
eDsgaW5kZXgtLTspIHsKLSAgICAgICAgICAgIGF1dG8mIHJ1biA9IHJ1bnNbaW5kZXhdOwotICAg
ICAgICAgICAgcHJldmlvdXNDb250ZW50V2lkdGggLT0gcnVuLmxvZ2ljYWxXaWR0aDsKLSAgICAg
ICAgICAgIGlmICghaXNCcmVha2FibGVSdW4ocnVuKSkKLSAgICAgICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgICAgIEFTU0VSVChydW4uaW5saW5lSXRlbS5pc1RleHQoKSk7Ci0gICAgICAg
ICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gdHJ5QnJlYWtpbmdUZXh0UnVuKHJ1biwgbGluZVN0
YXR1cy5jb250ZW50TG9naWNhbFJpZ2h0ICsgcHJldmlvdXNDb250ZW50V2lkdGgsIHsgfSwgbGlu
ZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pKSB7Ci0gICAgICAg
ICAgICAgICAgLy8gV2Uga25vdyB0aGlzIHJ1biBmaXRzLCBzbyBpZiBicmVha2luZyBpcyBhbGxv
d2VkIG9uIHRoZSBydW4sIGl0IHNob3VsZCByZXR1cm4gYSBub24tZW1wdHkgbGVmdC1zaWRlCi0g
ICAgICAgICAgICAgICAgLy8gc2luY2UgaXQncyBlaXRoZXIgYXQgaHlwaGVuIHBvc2l0aW9uIG9y
IHRoZSBlbnRpcmUgcnVuIGlzIHJldHVybmVkLgotICAgICAgICAgICAgICAgIEFTU0VSVChwYXJ0
aWFsUnVuLT5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGF1dG8gcnVuSXNGdWxseUFjY29tbW9k
YXRlZCA9IHBhcnRpYWxSdW4tPmxlbmd0aCA9PSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4ocnVu
LmlubGluZUl0ZW0pLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2lu
Z1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgaW5kZXgsIE92ZXJmbG93aW5nVGV4dENv
bnRlbnQ6OkJyZWFraW5nUG9zaXRpb246OlRyYWlsaW5nQ29udGVudCB7IGZhbHNlLCBydW5Jc0Z1
bGx5QWNjb21tb2RhdGVkID8gV1RGOjpudWxsb3B0IDogcGFydGlhbFJ1biB9IH07Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICB9OwotICAgIC8vIFdl
IGRpZCBub3QgbWFuYWdlIHRvIGJyZWFrIHRoZSBydW4gdGhhdCBhY3R1YWxseSBvdmVyZmxvd3Mg
dGhlIGxpbmUuCi0gICAgLy8gTGV0J3MgdHJ5IHRvIGZpbmQgYSBwcmV2aW91cyBicmVha2luZyBw
b3NpdGlvbiBzdGFydGluZyBmcm9tIHRoZSBvdmVyZmxvd2luZyBydW4uIEl0IHN1cmVseSBmaXRz
LgotICAgIGlmIChhdXRvIGJyZWFraW5nUG9zaXRpb24gPSB0cnlCcmVha2luZ1ByZXZpb3VzTm9u
T3ZlcmZsb3dpbmdSdW5zKCkpCi0gICAgICAgIHJldHVybiB7IG92ZXJmbG93aW5nUnVuSW5kZXgs
IGJyZWFraW5nUG9zaXRpb24gfTsKLQotICAgIGF1dG8gdHJ5QnJlYWtpbmdOZXh0T3ZlcmZsb3dp
bmdSdW5zID0gWyZdKCkgLT4gT3B0aW9uYWw8T3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtp
bmdQb3NpdGlvbj4gewotICAgICAgICBhdXRvIG5leHRDb250ZW50V2lkdGggPSBhY2N1bXVsYXRl
ZENvbnRlbnRXaWR0aCArIHJ1bnNbb3ZlcmZsb3dpbmdSdW5JbmRleF0ubG9naWNhbFdpZHRoOwot
ICAgICAgICBmb3IgKGF1dG8gaW5kZXggPSBvdmVyZmxvd2luZ1J1bkluZGV4ICsgMTsgaW5kZXgg
PCBydW5zLnNpemUoKTsgKytpbmRleCkgewotICAgICAgICAgICAgYXV0byYgcnVuID0gcnVuc1tp
bmRleF07Ci0gICAgICAgICAgICBpZiAoaXNCcmVha2FibGVSdW4ocnVuKSkgewotICAgICAgICAg
ICAgICAgIEFTU0VSVChydW4uaW5saW5lSXRlbS5pc1RleHQoKSk7Ci0gICAgICAgICAgICAgICAg
Ly8gV2Uga25vdyB0aGF0IHRoaXMgcnVuIGRvZXMgbm90IGZpdCB0aGUgYXZhaWxhYmxlIHNwYWNl
LiBJZiB3ZSBjYW4gYnJlYWsgaXQgYXQgYW55IHBvc2l0aW9uLCBsZXQncyBqdXN0IHVzZSB0aGUg
c3RhcnQgb2YgdGhlIHJ1bi4KLSAgICAgICAgICAgICAgICBpZiAod29yZEJyZWFrQmVoYXZpb3Io
cnVuLmlubGluZUl0ZW0uc3R5bGUoKSwgbGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFBy
ZXZpb3VzUG9zaXRpb24pID09IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRpb24pIHsK
LSAgICAgICAgICAgICAgICAgICAgLy8gV2UgbXVzdCBiZSBvbiBhbiBpbmxpbmUgYm94IGJvdW5k
YXJ5LiBMZXQncyBnbyBiYWNrIHRvIHRoZSBydW4gaW4gZnJvbnQgb2YgdGhlIGlubGluZSBib3gg
c3RhcnQgcnVuLgotICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIDxzcGFuPnVuYnJlYWthYmxl
X2FuZF9vdmVyZmxvdzxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay1hbGwiPmJyZWFrYWJs
ZTwvc3Bhbj4KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGF0ICJicmVha2FibGUiLCA8
c3Bhbj4gaXMgYXQgaW5kZXggLSAxIGFuZCB0aGUgdHJhaWxpbmcgcnVuIGlzIGF0IGluZGV4IC0g
Mi4KLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHJ1bnNbaW5kZXggLSAxXS5pbmxpbmVJdGVt
LmlzSW5saW5lQm94U3RhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8gdHJhaWxpbmdS
dW5JbmRleCA9IGZpbmRUcmFpbGluZ1J1bkluZGV4KGluZGV4KTsKLSAgICAgICAgICAgICAgICAg
ICAgaWYgKCF0cmFpbGluZ1J1bkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBU
aGlzIGNvbnRpbnVvdXMgY29udGVudCBkaWQgbm90IGZpdCBmcm9tIHRoZSBnZXQtZ28uIE5vIHRy
YWlsaW5nIHJ1bi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1Rl
eHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgfTsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICAvLyBBdCB3b3JzdCB3ZSBhcmUgYmFjayB0byB0aGUgb3ZlcmZs
b3dpbmcgcnVuLCBsaWtlIGluIHRoZSBleGFtcGxlIGFib3ZlLgotICAgICAgICAgICAgICAgICAg
ICBBU1NFUlQoKnRyYWlsaW5nUnVuSW5kZXggPj0gb3ZlcmZsb3dpbmdSdW5JbmRleCk7Ci0gICAg
ICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bv
c2l0aW9uIHsgKnRyYWlsaW5nUnVuSW5kZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFr
aW5nUG9zaXRpb246OlRyYWlsaW5nQ29udGVudCB7IHRydWUgfSB9OwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gdHJ5QnJlYWtpbmdUZXh0
UnVuKHJ1biwgbGluZVN0YXR1cy5jb250ZW50TG9naWNhbFJpZ2h0ICsgbmV4dENvbnRlbnRXaWR0
aCwgeyB9LCBsaW5lU3RhdHVzLmhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikp
IHsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHBhcnRpYWxSdW4tPmxlbmd0aCk7Ci0gICAg
ICAgICAgICAgICAgICAgIC8vIFdlIG1hbmFnZWQgdG8gYnJlYWsgdGhpcyB0ZXh0IHJ1biBtaWQg
Y29udGVudC4gSXQgaGFzIHRvIGJlIGEgaHlwaGVuIGJyZWFrLgotICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IGluZGV4
LCBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uOjpUcmFpbGluZ0NvbnRl
bnQgeyB0cnVlLCBwYXJ0aWFsUnVuIH0gfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBuZXh0Q29udGVudFdpZHRoICs9IHJ1bi5sb2dpY2FsV2lkdGg7Ci0g
ICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICB9OwotICAgIC8vIEF0IHRoaXMgcG9p
bnQgd2Uga25vdyB0aGF0IHRoZXJlJ3Mgbm8gYnJlYWthYmxlIHJ1biBhbGwgdGhlIHdheSB0byB0
aGUgb3ZlcmZsb3dpbmcgcnVuLgotICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGFueSBy
dW4gYWZ0ZXIgdGhlIG92ZXJmbG93aW5nIGNvbnRlbnQgY2FuIGJyZWFrLgotICAgIC8vIGUuZy4g
PHNwYW4+dGhpc19jb250ZW50X292ZXJmbG93c19idXRfbm90X2JyZWFrYWJsZTxzcGFuPjxzcGFu
IHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay1hbGwiPmJ1dF90aGlzX2lzX2JyZWFrYWJsZTwvc3Bh
bj4KLSAgICBpZiAoYXV0byBicmVha2luZ1Bvc2l0aW9uID0gdHJ5QnJlYWtpbmdOZXh0T3ZlcmZs
b3dpbmdSdW5zKCkpCi0gICAgICAgIHJldHVybiB7IG92ZXJmbG93aW5nUnVuSW5kZXgsIGJyZWFr
aW5nUG9zaXRpb24gfTsKLQotICAgIC8vIEdpdmUgdXAsIHRoZXJlJ3Mgbm8gYnJlYWthYmxlIHJ1
biBpbiBoZXJlLgotICAgIHJldHVybiB7IG92ZXJmbG93aW5nUnVuSW5kZXggfTsKLX0KLQotT3B0
aW9uU2V0PElubGluZUNvbnRlbnRCcmVha2VyOjpXb3JkQnJlYWtSdWxlPiBJbmxpbmVDb250ZW50
QnJlYWtlcjo6d29yZEJyZWFrQmVoYXZpb3IoY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlLCBib29s
IGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3QKLXsKLSAgICAvLyBE
aXNyZWdhcmQgYW55IHByb2hpYml0aW9uIGFnYWluc3QgbGluZSBicmVha3MgbWFuZGF0ZWQgYnkg
dGhlIHdvcmQtYnJlYWsgcHJvcGVydHkuCi0gICAgLy8gVGhlIGRpZmZlcmVudCB3cmFwcGluZyBv
cHBvcnR1bml0aWVzIG11c3Qgbm90IGJlIHByaW9yaXRpemVkLiBIeXBoZW5hdGlvbiBpcyBub3Qg
YXBwbGllZC4KLSAgICBpZiAoc3R5bGUubGluZUJyZWFrKCkgPT0gTGluZUJyZWFrOjpBbnl3aGVy
ZSkKLSAgICAgICAgcmV0dXJuIHsgV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbiB9
OwotICAgIC8vIEJyZWFraW5nIGlzIGFsbG93ZWQgd2l0aGluIOKAnHdvcmRz4oCdLgotICAgIGlm
IChzdHlsZS53b3JkQnJlYWsoKSA9PSBXb3JkQnJlYWs6OkJyZWFrQWxsKQotICAgICAgICByZXR1
cm4geyBXb3JkQnJlYWtSdWxlOjpBdEFyYml0cmFyeVBvc2l0aW9uIH07Ci0gICAgLy8gQnJlYWtp
bmcgaXMgZm9yYmlkZGVuIHdpdGhpbiDigJx3b3Jkc+KAnS4KLSAgICBpZiAoc3R5bGUud29yZEJy
ZWFrKCkgPT0gV29yZEJyZWFrOjpLZWVwQWxsKQotICAgICAgICByZXR1cm4geyB9OwotCi0gICAg
YXV0byBicmVha1J1bGVzID0gT3B0aW9uU2V0PFdvcmRCcmVha1J1bGU+IHsgfTsKLSAgICBhdXRv
IGh5cGhlbmF0aW9uSXNBbGxvd2VkID0gIW5faHlwaGVuYXRpb25Jc0Rpc2FibGVkICYmIHN0eWxl
Lmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpBdXRvICYmIGNhbkh5cGhlbmF0ZShzdHlsZS5jb21wdXRl
ZExvY2FsZSgpKTsKLSAgICBpZiAoaHlwaGVuYXRpb25Jc0FsbG93ZWQpCi0gICAgICAgIGJyZWFr
UnVsZXMuYWRkKHsgV29yZEJyZWFrUnVsZTo6QXRIeXBoZW5hdGlvbk9wcG9ydHVuaXRpZXMgfSk7
Ci0gICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgY29udGVudCwgdGhlIHdvcmQt
YnJlYWsgcHJvcGVydHkgYWxzbyBzdXBwb3J0cyBhIGRlcHJlY2F0ZWQgYnJlYWstd29yZCBrZXl3
b3JkLgotICAgIC8vIFdoZW4gc3BlY2lmaWVkLCB0aGlzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMg
d29yZC1icmVhazogbm9ybWFsIGFuZCBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZSwgcmVnYXJkbGVz
cyBvZiB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBvdmVyZmxvdy13cmFwIHByb3BlcnR5LgotICAg
IGlmIChzdHlsZS53b3JkQnJlYWsoKSA9PSBXb3JkQnJlYWs6OkJyZWFrV29yZCAmJiAhaGFzV3Jh
cE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSB7Ci0gICAgICAgIGJyZWFrUnVsZXMuYWRk
KHsgV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbiB9KTsKLSAgICAgICAgcmV0dXJu
IGJyZWFrUnVsZXM7Ci0gICAgfQotICAgIC8vIE92ZXJmbG93V3JhcDo6QnJlYWs6IEFuIG90aGVy
d2lzZSB1bmJyZWFrYWJsZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIG1heSBiZSBicm9rZW4gYXQg
YW4gYXJiaXRyYXJ5IHBvaW50IGlmIHRoZXJlIGFyZSBubyBvdGhlcndpc2UtYWNjZXB0YWJsZSBi
cmVhayBwb2ludHMgaW4gdGhlIGxpbmUuCi0gICAgaWYgKHN0eWxlLm92ZXJmbG93V3JhcCgpID09
IE92ZXJmbG93V3JhcDo6QnJlYWsgJiYgIWhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3Np
dGlvbikgewotICAgICAgICBicmVha1J1bGVzLmFkZCh7IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRy
YXJ5UG9zaXRpb24gfSk7Ci0gICAgICAgIHJldHVybiBicmVha1J1bGVzOwotICAgIH0KLSAgICBy
ZXR1cm4gYnJlYWtSdWxlczsKLX0KLQotT3B0aW9uYWw8SW5saW5lQ29udGVudEJyZWFrZXI6OlBh
cnRpYWxSdW4+IElubGluZUNvbnRlbnRCcmVha2VyOjp0cnlCcmVha2luZ1RleHRSdW4oY29uc3Qg
Q29udGludW91c0NvbnRlbnQ6OlJ1biYgb3ZlcmZsb3dpbmdSdW4sIElubGluZUxheW91dFVuaXQg
bG9naWNhbExlZnQsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGF2YWlsYWJsZVdpZHRoLCBi
b29sIGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3QKLXsKLSAgICBB
U1NFUlQob3ZlcmZsb3dpbmdSdW4uaW5saW5lSXRlbS5pc1RleHQoKSk7Ci0gICAgYXV0byYgaW5s
aW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4ob3ZlcmZsb3dpbmdSdW4uaW5s
aW5lSXRlbSk7Ci0gICAgYXV0byYgc3R5bGUgPSBpbmxpbmVUZXh0SXRlbS5zdHlsZSgpOwotICAg
IGF1dG8gYXZhaWxhYmxlU3BhY2VJc0luZmluaXRlID0gIWF2YWlsYWJsZVdpZHRoLmhhc1ZhbHVl
KCk7Ci0KLSAgICBhdXRvIGJyZWFrUnVsZXMgPSB3b3JkQnJlYWtCZWhhdmlvcihzdHlsZSwgaGFz
V3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKTsKLSAgICBpZiAoYnJlYWtSdWxlcy5p
c0VtcHR5KCkpCi0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICBpZiAoYnJlYWtSdWxlcy5jb250
YWlucyhXb3JkQnJlYWtSdWxlOjpBdEh5cGhlbmF0aW9uT3Bwb3J0dW5pdGllcykpIHsKLSAgICAg
ICAgYXV0byB0cnlCcmVha2luZ0F0SHlwaGVuYXRpb25PcHBvcnR1bml0eSA9IFsmXSgpIC0+IE9w
dGlvbmFsPFBhcnRpYWxSdW4+IHsKLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIGh5cGhlbiBwb3Np
dGlvbiBhcyBmb2xsb3dzOgotICAgICAgICAgICAgLy8gMS4gU3BsaXQgdGhlIHRleHQgYnkgdGFr
aW5nIHRoZSBoeXBoZW4gd2lkdGggaW50byBhY2NvdW50Ci0gICAgICAgICAgICAvLyAyLiBGaW5k
IHRoZSBsYXN0IGh5cGhlbiBwb3NpdGlvbiBiZWZvcmUgdGhlIHNwbGl0IHBvc2l0aW9uCi0gICAg
ICAgICAgICBpZiAoIWF2YWlsYWJsZVNwYWNlSXNJbmZpbml0ZSAmJiAhKmF2YWlsYWJsZVdpZHRo
KSB7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugd29uJ3QgYmUgYWJsZSB0byBmaW5kIGh5cGhlbiBs
b2NhdGlvbiB3aGVuIHRoZXJlJ3Mgbm8gYXZhaWxhYmxlIHNwYWNlLgotICAgICAgICAgICAgICAg
IHJldHVybiB7IH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIHJ1bkxlbmd0aCA9
IGlubGluZVRleHRJdGVtLmxlbmd0aCgpOwotICAgICAgICAgICAgdW5zaWduZWQgbGltaXRCZWZv
cmUgPSBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCkgPT0gUmVuZGVyU3R5bGU6OmluaXRp
YWxIeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCkgPyAwIDogc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJl
Zm9yZSgpOwotICAgICAgICAgICAgdW5zaWduZWQgbGltaXRBZnRlciA9IHN0eWxlLmh5cGhlbmF0
aW9uTGltaXRBZnRlcigpID09IFJlbmRlclN0eWxlOjppbml0aWFsSHlwaGVuYXRpb25MaW1pdEFm
dGVyKCkgPyAwIDogc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCk7Ci0gICAgICAgICAgICAv
LyBDaGVjayBpZiB0aGlzIHJ1biBjYW4gYWNjb21tb2RhdGUgdGhlIGJlZm9yZS9hZnRlciBsaW1p
dHMgYXQgYWxsIGJlZm9yZSBzdGFydCBtZWFzdXJpbmcgdGV4dC4KLSAgICAgICAgICAgIGlmIChs
aW1pdEJlZm9yZSA+PSBydW5MZW5ndGggfHwgbGltaXRBZnRlciA+PSBydW5MZW5ndGggfHwgbGlt
aXRCZWZvcmUgKyBsaW1pdEFmdGVyID4gcnVuTGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVy
biB7IH07Ci0KLSAgICAgICAgICAgIHVuc2lnbmVkIGxlZnRTaWRlTGVuZ3RoID0gcnVuTGVuZ3Ro
OwotICAgICAgICAgICAgYXV0byYgZm9udENhc2NhZGUgPSBzdHlsZS5mb250Q2FzY2FkZSgpOwot
ICAgICAgICAgICAgYXV0byBoeXBoZW5XaWR0aCA9IElubGluZUxheW91dFVuaXQgeyBmb250Q2Fz
Y2FkZS53aWR0aChUZXh0UnVuIHsgU3RyaW5nVmlldyB7IHN0eWxlLmh5cGhlblN0cmluZygpIH0g
fSkgfTsKLSAgICAgICAgICAgIGlmICghYXZhaWxhYmxlU3BhY2VJc0luZmluaXRlKSB7Ci0gICAg
ICAgICAgICAgICAgYXV0byBhdmFpbGFibGVXaWR0aEV4Y2x1ZGluZ0h5cGhlbiA9ICphdmFpbGFi
bGVXaWR0aCAtIGh5cGhlbldpZHRoOwotICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVXaWR0
aEV4Y2x1ZGluZ0h5cGhlbiA8PSAwIHx8ICFlbm91Z2hXaWR0aEZvckh5cGhlbmF0aW9uKGF2YWls
YWJsZVdpZHRoRXhjbHVkaW5nSHlwaGVuLCBmb250Q2FzY2FkZS5waXhlbFNpemUoKSkpCi0gICAg
ICAgICAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgICAgICAgICAgbGVmdFNpZGVMZW5n
dGggPSBUZXh0VXRpbDo6c3BsaXQoaW5saW5lVGV4dEl0ZW0sIG92ZXJmbG93aW5nUnVuLmxvZ2lj
YWxXaWR0aCwgYXZhaWxhYmxlV2lkdGhFeGNsdWRpbmdIeXBoZW4sIGxvZ2ljYWxMZWZ0KS5sZW5n
dGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGVmdFNpZGVMZW5ndGggPCBsaW1p
dEJlZm9yZSkKLSAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAgICAgLy8gQWRq
dXN0IGJlZm9yZSBpbmRleCB0byBhY2NvbW1vZGF0ZSB0aGUgbGltaXQtYWZ0ZXIgdmFsdWUgKGl0
J3MgdGhlIGxhc3QgcG90ZW50aWFsIGh5cGhlbiBsb2NhdGlvbiBpbiB0aGlzIHJ1bikuCi0gICAg
ICAgICAgICBhdXRvIGh5cGhlbkJlZm9yZSA9IHN0ZDo6bWluKGxlZnRTaWRlTGVuZ3RoLCBydW5M
ZW5ndGggLSBsaW1pdEFmdGVyKSArIDE7Ci0gICAgICAgICAgICB1bnNpZ25lZCBoeXBoZW5Mb2Nh
dGlvbiA9IGxhc3RIeXBoZW5Mb2NhdGlvbihTdHJpbmdWaWV3KGlubGluZVRleHRJdGVtLmlubGlu
ZVRleHRCb3goKS5jb250ZW50KCkpLnN1YnN0cmluZyhpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBp
bmxpbmVUZXh0SXRlbS5sZW5ndGgoKSksIGh5cGhlbkJlZm9yZSwgc3R5bGUuY29tcHV0ZWRMb2Nh
bGUoKSk7Ci0gICAgICAgICAgICBpZiAoIWh5cGhlbkxvY2F0aW9uIHx8IGh5cGhlbkxvY2F0aW9u
IDwgbGltaXRCZWZvcmUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgICAg
IC8vIGh5cGhlbkxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGlzIElubGlu
ZUl0ZW1UZXh0LgotICAgICAgICAgICAgQVNTRVJUKGlubGluZVRleHRJdGVtLnN0YXJ0KCkgKyBo
eXBoZW5Mb2NhdGlvbiA8IGlubGluZVRleHRJdGVtLmVuZCgpKTsKLSAgICAgICAgICAgIGF1dG8g
dHJhaWxpbmdQYXJ0aWFsUnVuV2lkdGhXaXRoSHlwaGVuID0gVGV4dFV0aWw6OndpZHRoKGlubGlu
ZVRleHRJdGVtLCBpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBpbmxpbmVUZXh0SXRlbS5zdGFydCgp
ICsgaHlwaGVuTG9jYXRpb24sIGxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgICAgIHJldHVybiBQYXJ0
aWFsUnVuIHsgaHlwaGVuTG9jYXRpb24sIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoV2l0aEh5cGhl
biwgaHlwaGVuV2lkdGggfTsKLSAgICAgICAgfTsKLSAgICAgICAgaWYgKGF1dG8gcGFydGlhbFJ1
biA9IHRyeUJyZWFraW5nQXRIeXBoZW5hdGlvbk9wcG9ydHVuaXR5KCkpCi0gICAgICAgICAgICBy
ZXR1cm4gcGFydGlhbFJ1bjsKLSAgICB9Ci0KLSAgICBpZiAoYnJlYWtSdWxlcy5jb250YWlucyhX
b3JkQnJlYWtSdWxlOjpBdEFyYml0cmFyeVBvc2l0aW9uKSkgewotICAgICAgICBhdXRvIHRyeUJy
ZWFraW5nQXRBcmJpdHJhcnlQb3NpdGlvbiA9IFsmXSgpIC0+IFBhcnRpYWxSdW4gewotICAgICAg
ICAgICAgaWYgKCFpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIC8v
IEVtcHR5IHRleHQgcnVucyBtYXkgYmUgYnJlYWthYmxlIGJhc2VkIG9uIHN0eWxlLCBidXQgaW4g
cHJhY3RpY2Ugd2UgY2FuJ3QgcmVhbGx5IHNwbGl0IHRoZW0gYW55IGZ1cnRoZXIuCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdmFp
bGFibGVTcGFjZUlzSW5maW5pdGUpIHsKLSAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBydW4g
Y2FuIGJlIHNwbGl0IGF0IGFyYml0cmFyeSBwb3NpdGlvbiBsZXQncyBqdXN0IHJldHVybiB0aGUg
ZW50aXJlIHJ1biB3aGVuIGl0IGlzIGludGVuZGVkIHRvIGZpdCBvbiB0aGUgbGluZS4KLSAgICAg
ICAgICAgICAgICBBU1NFUlQoaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpOwotICAgICAgICAgICAg
ICAgIGF1dG8gdHJhaWxpbmdQYXJ0aWFsUnVuV2lkdGggPSBUZXh0VXRpbDo6d2lkdGgoaW5saW5l
VGV4dEl0ZW0sIGxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4geyBpbmxpbmVU
ZXh0SXRlbS5sZW5ndGgoKSwgdHJhaWxpbmdQYXJ0aWFsUnVuV2lkdGggfTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGlmICghKmF2YWlsYWJsZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAg
Ly8gRmFzdCBwYXRoIGZvciBjYXNlcyB3aGVuIHRoZXJlJ3Mgbm8gcm9vbSBhdCBhbGwuIFRoZSBj
b250ZW50IGlzIGJyZWFrYWJsZSBidXQgd2UgZG9uJ3QgaGF2ZSBzcGFjZSBmb3IgaXQuCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dG8g
c3BsaXREYXRhID0gVGV4dFV0aWw6OnNwbGl0KGlubGluZVRleHRJdGVtLCBvdmVyZmxvd2luZ1J1
bi5sb2dpY2FsV2lkdGgsICphdmFpbGFibGVXaWR0aCwgbG9naWNhbExlZnQpOwotICAgICAgICAg
ICAgcmV0dXJuIHsgc3BsaXREYXRhLmxlbmd0aCwgc3BsaXREYXRhLmxvZ2ljYWxXaWR0aCB9Owot
ICAgICAgICB9OwotICAgICAgICAvLyBXaXRoIGFyYml0cmFyeSBicmVha2luZyB0aGVyZSdzIGFs
d2F5cyBhIHZhbGlkIGJyZWFraW5nIHBvc2l0aW9uIChldmVuIGlmIGl0IGlzIGJlZm9yZSB0aGUg
Zmlyc3QgcG9zaXRpb24pLgotICAgICAgICByZXR1cm4gdHJ5QnJlYWtpbmdBdEFyYml0cmFyeVBv
c2l0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiB7IH07Ci19Ci0KLXZvaWQgSW5saW5lQ29udGVu
dEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50OjphcHBlbmQoY29uc3QgSW5saW5lSXRlbSYgaW5s
aW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgsIE9wdGlvbmFsPElubGluZUxh
eW91dFVuaXQ+IGNvbGxhcHNpYmxlV2lkdGgpCi17Ci0gICAgbV9ydW5zLmFwcGVuZCh7IGlubGlu
ZUl0ZW0sIGxvZ2ljYWxXaWR0aCB9KTsKLSAgICBtX2xvZ2ljYWxXaWR0aCA9IGNsYW1wVG88SW5s
aW5lTGF5b3V0VW5pdD4obV9sb2dpY2FsV2lkdGggKyBsb2dpY2FsV2lkdGgpOwotICAgIGlmICgh
Y29sbGFwc2libGVXaWR0aCkgewotICAgICAgICBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoID0g
eyB9OwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgqY29sbGFwc2libGVXaWR0aCA9
PSBsb2dpY2FsV2lkdGgpIHsKLSAgICAgICAgLy8gRnVsbHkgY29sbGFwc2libGUgcnVuLgotICAg
ICAgICBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoICs9IGxvZ2ljYWxXaWR0aDsKLSAgICAgICAg
QVNTRVJUKG1fY29sbGFwc2libGVMb2dpY2FsV2lkdGggPD0gbV9sb2dpY2FsV2lkdGgpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIFBhcnRpYWxseSBjb2xsYXBzaWJsZSBydW4uCi0g
ICAgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCA9ICpjb2xsYXBzaWJsZVdpZHRoOwotICAgIEFT
U0VSVChtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoIDw9IG1fbG9naWNhbFdpZHRoKTsKLX0KLQot
dm9pZCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OnJlc2V0KCkKLXsK
LSAgICBtX2xvZ2ljYWxXaWR0aCA9IHsgfTsKLSAgICBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRo
ID0geyB9OwotICAgIG1fcnVucy5jbGVhcigpOwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRlbnRC
cmVha2VyLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVD
b250ZW50QnJlYWtlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDJkNGQ2Y2U4
YzE4OTMxZDVmZThiNTBhMzczMDFkNGFjYThlN2Q5Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0
aW5nL0lubGluZUNvbnRlbnRCcmVha2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBA
QAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRU
SU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgotCi1uYW1lc3BhY2UgV2Vi
Q29yZSB7Ci0KLWNsYXNzIFJlbmRlclN0eWxlOwotCi1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xh
c3MgSW5saW5lSXRlbTsKLXN0cnVjdCBPdmVyZmxvd2luZ1RleHRDb250ZW50OwotCi1jbGFzcyBJ
bmxpbmVDb250ZW50QnJlYWtlciB7Ci1wdWJsaWM6Ci0gICAgc3RydWN0IFBhcnRpYWxSdW4gewot
ICAgICAgICBzaXplX3QgbGVuZ3RoIHsgMCB9OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxv
Z2ljYWxXaWR0aCB7IDAgfTsKLSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gaHlw
aGVuV2lkdGggeyB9OwotICAgIH07Ci0gICAgZW51bSBjbGFzcyBJc0VuZE9mTGluZSB7IE5vLCBZ
ZXMgfTsKLSAgICBzdHJ1Y3QgUmVzdWx0IHsKLSAgICAgICAgZW51bSBjbGFzcyBBY3Rpb24gewot
ICAgICAgICAgICAgS2VlcCwgLy8gS2VlcCBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCi0g
ICAgICAgICAgICBCcmVhaywgLy8gUGFydGlhbCBjb250ZW50IGlzIG9uIHRoZSBjdXJyZW50IGxp
bmUuCi0gICAgICAgICAgICBXcmFwLCAvLyBDb250ZW50IGlzIHdyYXBwZWQgdG8gdGhlIG5leHQg
bGluZS4KLSAgICAgICAgICAgIFdyYXBXaXRoSHlwaGVuLCAvLyBDb250ZW50IGlzIHdyYXBwZWQg
dG8gdGhlIG5leHQgbGluZSBhbmQgdGhlIGN1cnJlbnQgbGluZSBlbmRzIHdpdGggYSB2aXNpYmxl
IGh5cGhlbi4KLSAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGNvbnRlbnQgb3ZlcmZsb3dzIGFu
ZCBjYW4ndCBnZXQgYnJva2VuIHVwIGludG8gc21hbGxlciBiaXRzLgotICAgICAgICAgICAgUmV2
ZXJ0VG9MYXN0V3JhcE9wcG9ydHVuaXR5LCAvLyBUaGUgY29udGVudCBuZWVkcyB0byBiZSByZXZl
cnRlZCBiYWNrIHRvIHRoZSBsYXN0IHdyYXAgb3Bwb3J0dW5pdHkuCi0gICAgICAgICAgICBSZXZl
cnRUb0xhc3ROb25PdmVyZmxvd2luZ1dyYXBPcHBvcnR1bml0eSAvLyBUaGUgY29udGVudCBuZWVk
cyB0byBiZSByZXZlcnRlZCBiYWNrIHRvIGEgd3JhcCBvcHBvcnR1bml0eSB0aGF0IHN0aWxsIGZp
dHMgdGhlIGxpbmUuCi0gICAgICAgIH07Ci0gICAgICAgIHN0cnVjdCBQYXJ0aWFsVHJhaWxpbmdD
b250ZW50IHsKLSAgICAgICAgICAgIHNpemVfdCB0cmFpbGluZ1J1bkluZGV4IHsgMCB9OwotICAg
ICAgICAgICAgT3B0aW9uYWw8UGFydGlhbFJ1bj4gcGFydGlhbFJ1bjsgLy8gbnVsbG9wdCBwYXJ0
aWFsIHJ1biBtZWFucyB0aGUgdHJhaWxpbmcgcnVuIGlzIGEgY29tcGxldGUgcnVuLgotICAgICAg
ICB9OwotICAgICAgICBBY3Rpb24gYWN0aW9uIHsgQWN0aW9uOjpLZWVwIH07Ci0gICAgICAgIElz
RW5kT2ZMaW5lIGlzRW5kT2ZMaW5lIHsgSXNFbmRPZkxpbmU6Ok5vIH07Ci0gICAgICAgIE9wdGlv
bmFsPFBhcnRpYWxUcmFpbGluZ0NvbnRlbnQ+IHBhcnRpYWxUcmFpbGluZ0NvbnRlbnQgeyB9Owot
ICAgICAgICBjb25zdCBJbmxpbmVJdGVtKiBsYXN0V3JhcE9wcG9ydHVuaXR5SXRlbSB7IG51bGxw
dHIgfTsKLSAgICB9OwotCi0gICAgLy8gVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyB0aGUgYW1vdW50
IG9mIGNvbnRpbnVvdXMgY29udGVudCBjb21taXR0ZWQgdG8gY29udGVudCBicmVha2luZyBhdCBh
IHRpbWUgKG5vIGluLWJldHdlZW4gd3JhcCBvcHBvcnR1bml0aWVzKS4KLSAgICAvLyBlLmcuCi0g
ICAgLy8gPGRpdj50ZXh0IGNvbnRlbnQgPHNwYW4+c3BhbjE8L3NwYW4+YmV0d2VlbjxzcGFuPnNw
YW4yPC9zcGFuPjwvZGl2PgotICAgIC8vIFt0ZXh0XVsgXVtjb250ZW50XVsgXVtpbmxpbmUgYm94
IHN0YXJ0XVtzcGFuMV1baW5saW5lIGJveCBlbmRdW2JldHdlZW5dW2lubGluZSBib3ggc3RhcnRd
W3NwYW4yXVtpbmxpbmUgYm94IGVuZF0KLSAgICAvLyBjb250aW51b3VzIGNhbmRpZGF0ZSBjb250
ZW50IGF0IGEgdGltZToKLSAgICAvLyAxLiBbdGV4dF0KLSAgICAvLyAyLiBbIF0KLSAgICAvLyAz
LiBbY29udGVudF0KLSAgICAvLyA0LiBbIF0KLSAgICAvLyA1LiBbaW5saW5lIGJveCBzdGFydF1b
c3BhbjFdW2lubGluZSBib3ggZW5kXVtiZXR3ZWVuXVtpbmxpbmUgYm94IHN0YXJ0XVtzcGFuMl1b
aW5saW5lIGJveCBlbmRdCi0gICAgLy8gc2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3Mt
dGV4dC0zLyNsaW5lLWJyZWFrLWRldGFpbHMKLSAgICBzdHJ1Y3QgQ29udGludW91c0NvbnRlbnQg
ewotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJu
IG1fbG9naWNhbFdpZHRoOyB9Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgY29sbGFwc2libGVM
b2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoOyB9
Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbm9uQ29sbGFwc2libGVMb2dpY2FsV2lkdGgoKSBj
b25zdCB7IHJldHVybiBsb2dpY2FsV2lkdGgoKSAtIGNvbGxhcHNpYmxlTG9naWNhbFdpZHRoKCk7
IH0KLSAgICAgICAgYm9vbCBoYXNUcmFpbGluZ0NvbGxhcHNpYmxlQ29udGVudCgpIGNvbnN0IHsg
cmV0dXJuICEhY29sbGFwc2libGVMb2dpY2FsV2lkdGgoKTsgfQotICAgICAgICBib29sIGlzRnVs
bHlDb2xsYXBzaWJsZSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxXaWR0aCgpID09IGNvbGxhcHNp
YmxlTG9naWNhbFdpZHRoKCk7IH0KLQotICAgICAgICB2b2lkIGFwcGVuZChjb25zdCBJbmxpbmVJ
dGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgsIE9wdGlvbmFsPElubGluZUxheW91
dFVuaXQ+IGNvbGxhcHNpYmxlV2lkdGgpOwotICAgICAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICAg
ICAgc3RydWN0IFJ1biB7Ci0gICAgICAgICAgICBSdW4oY29uc3QgSW5saW5lSXRlbSYsIElubGlu
ZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKLSAgICAgICAgICAgIFJ1bihjb25zdCBSdW4mKTsK
LSAgICAgICAgICAgIFJ1biYgb3BlcmF0b3I9KGNvbnN0IFJ1biYpOwotCi0gICAgICAgICAgICBj
b25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtOwotICAgICAgICAgICAgSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsV2lkdGggeyAwIH07Ci0gICAgICAgIH07Ci0gICAgICAgIHVzaW5nIFJ1bkxpc3Qg
PSBWZWN0b3I8UnVuLCAzPjsKLSAgICAgICAgY29uc3QgUnVuTGlzdCYgcnVucygpIGNvbnN0IHsg
cmV0dXJuIG1fcnVuczsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgUnVuTGlzdCBtX3J1bnM7
Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbV9sb2dpY2FsV2lkdGggeyAwIH07Ci0gICAgICAg
IElubGluZUxheW91dFVuaXQgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICB9
OwotCi0gICAgc3RydWN0IExpbmVTdGF0dXMgewotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGNv
bnRlbnRMb2dpY2FsUmlnaHQgeyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgYXZhaWxh
YmxlV2lkdGggeyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgY29sbGFwc2libGVXaWR0
aCB7IDAgfTsKLSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gdHJhaWxpbmdTb2Z0
SHlwaGVuV2lkdGg7Ci0gICAgICAgIGJvb2wgaGFzRnVsbHlDb2xsYXBzaWJsZVRyYWlsaW5nUnVu
IHsgZmFsc2UgfTsKLSAgICAgICAgYm9vbCBoYXNDb250ZW50IHsgZmFsc2UgfTsKLSAgICAgICAg
Ym9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24geyBmYWxzZSB9OwotICAg
IH07Ci0gICAgUmVzdWx0IHByb2Nlc3NJbmxpbmVDb250ZW50KGNvbnN0IENvbnRpbnVvdXNDb250
ZW50JiwgY29uc3QgTGluZVN0YXR1cyYpOwotICAgIHZvaWQgc2V0SHlwaGVuYXRpb25EaXNhYmxl
ZCgpIHsgbl9oeXBoZW5hdGlvbklzRGlzYWJsZWQgPSB0cnVlOyB9Ci0KLSAgICBzdGF0aWMgYm9v
bCBpc1dyYXBwaW5nQWxsb3dlZChjb25zdCBJbmxpbmVJdGVtJik7Ci0KLXByaXZhdGU6Ci0gICAg
UmVzdWx0IHByb2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnQoY29uc3QgQ29udGludW91c0NvbnRlbnQm
LCBjb25zdCBMaW5lU3RhdHVzJikgY29uc3Q7Ci0gICAgT3ZlcmZsb3dpbmdUZXh0Q29udGVudCBw
cm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50V2l0aFRleHQoY29uc3QgQ29udGludW91c0NvbnRlbnQm
LCBjb25zdCBMaW5lU3RhdHVzJikgY29uc3Q7Ci0gICAgT3B0aW9uYWw8UGFydGlhbFJ1bj4gdHJ5
QnJlYWtpbmdUZXh0UnVuKGNvbnN0IENvbnRpbnVvdXNDb250ZW50OjpSdW4mIG92ZXJmbG93UnVu
LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0
PiBhdmFpbGFibGVXaWR0aCwgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRp
b24pIGNvbnN0OwotCi0gICAgZW51bSBjbGFzcyBXb3JkQnJlYWtSdWxlIHsKLSAgICAgICAgQXRB
cmJpdHJhcnlQb3NpdGlvbiAgICAgICAgPSAxIDw8IDAsCi0gICAgICAgIEF0SHlwaGVuYXRpb25P
cHBvcnR1bml0aWVzID0gMSA8PCAxCi0gICAgfTsKLSAgICBPcHRpb25TZXQ8V29yZEJyZWFrUnVs
ZT4gd29yZEJyZWFrQmVoYXZpb3IoY29uc3QgUmVuZGVyU3R5bGUmLCBib29sIGhhc1dyYXBPcHBv
cnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3Q7Ci0gICAgYm9vbCBzaG91bGRLZWVwRW5k
T2ZMaW5lV2hpdGVzcGFjZShjb25zdCBDb250aW51b3VzQ29udGVudCYpIGNvbnN0OwotCi0gICAg
Ym9vbCBuX2h5cGhlbmF0aW9uSXNEaXNhYmxlZCB7IGZhbHNlIH07Ci19OwotCi1pbmxpbmUgSW5s
aW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50OjpSdW46OlJ1bihjb25zdCBJbmxp
bmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKLSAgICA6
IGlubGluZUl0ZW0oaW5saW5lSXRlbSkKLSAgICAsIGxvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGgp
Ci17Ci19Ci0KLWlubGluZSBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6
OlJ1bjo6UnVuKGNvbnN0IFJ1biYgb3RoZXIpCi0gICAgOiBpbmxpbmVJdGVtKG90aGVyLmlubGlu
ZUl0ZW0pCi0gICAgLCBsb2dpY2FsV2lkdGgob3RoZXIubG9naWNhbFdpZHRoKQotewotfQotCi19
Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmNwcApkZWxldGVkIGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxZWFmZmNkYTNlZWNjNDNlMjE1ZDFkOTY0NjEwNmMwY2M1
YTk3Mi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4
dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
QykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNs
dWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0j
aWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGbG9hdGlu
Z0NvbnRleHQuaCIKLSNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgotI2luY2x1ZGUgIklubGluZUZv
cm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIklubGluZUxpbmVCb3guaCIKLSNpbmNsdWRlICJJ
bmxpbmVMaW5lUnVuLmgiCi0jaW5jbHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIKLSNpbmNsdWRlICJJ
bnZhbGlkYXRpb25TdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxh
eW91dENvbnRhaW5lckJveC5oIgotI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKLSNpbmNsdWRl
ICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCi0jaW5jbHVkZSAiTGF5b3V0SW5saW5l
VGV4dEJveC5oIgotI2luY2x1ZGUgIkxheW91dExpbmVCcmVha0JveC5oIgotI2luY2x1ZGUgIkxh
eW91dFJlcGxhY2VkQm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKLSNpbmNsdWRlICJM
b2dnaW5nLmgiCi0jaW5jbHVkZSAiUnVudGltZUVuYWJsZWRGZWF0dXJlcy5oIgotI2luY2x1ZGUg
IlRleHRVdGlsLmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KLSNpbmNsdWRl
IDx3dGYvdGV4dC9UZXh0U3RyZWFtLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFj
ZSBMYXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQpOwotCi1JbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6SW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIElubGluZUZv
cm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQo
Zm9ybWF0dGluZ0NvbnRleHRSb290LCBmb3JtYXR0aW5nU3RhdGUpCi17Ci19Ci0KLXN0YXRpYyBp
bmxpbmUgY29uc3QgQm94KiBuZXh0SW5saW5lTGV2ZWxCb3hUb0xheW91dChjb25zdCBCb3gmIGxh
eW91dEJveCwgY29uc3QgQ29udGFpbmVyQm94JiBzdGF5V2l0aGluKQotewotICAgIC8vIEF0b21p
YyBpbmxpbmUtbGV2ZWwgYm94ZXMgYW5kIGZsb2F0cyBhcmUgb3BhcXVlIGJveGVzIG1lYW5pbmcg
dGhhdCB0aGV5IGFyZQotICAgIC8vIHJlc3BvbnNpYmxlIGZvciB0aGVpciBvd24gY29udGVudCAo
ZG8gbm90IG5lZWQgdG8gZGVzY2VuZCBpbnRvIHRoZWlyIHN1YnRyZWVzKS4KLSAgICAvLyBPbmx5
IGlubGluZSBib3hlcyBtYXkgaGF2ZSByZWxldmFudCBkZXNjZW5kYW50IGNvbnRlbnQuCi0gICAg
aWYgKGxheW91dEJveC5pc0lubGluZUJveCgpKSB7Ci0gICAgICAgIGlmIChpczxDb250YWluZXJC
b3g+KGxheW91dEJveCkgJiYgZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmhhc0lu
Rmxvd09yRmxvYXRpbmdDaGlsZCgpKSB7Ci0gICAgICAgICAgICAvLyBBbm9ueW1vdXMgaW5saW5l
IHRleHQgYm94ZXMvbGluZSBicmVha3MgY2FuJ3QgaGF2ZSBkZXNjZW5kYW50IGNvbnRlbnQgYnkg
ZGVmaW5pdGlvbi4KLSAgICAgICAgICAgIEFTU0VSVCghbGF5b3V0Qm94LmlzSW5saW5lVGV4dEJv
eCgpICYmICFsYXlvdXRCb3guaXNMaW5lQnJlYWtCb3goKSk7Ci0gICAgICAgICAgICByZXR1cm4g
ZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0No
aWxkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8qIG5leHRJblByZU9yZGVy
ID0gJmxheW91dEJveDsgbmV4dEluUHJlT3JkZXIgJiYgbmV4dEluUHJlT3JkZXIgIT0gJnN0YXlX
aXRoaW47IG5leHRJblByZU9yZGVyID0gJm5leHRJblByZU9yZGVyLT5wYXJlbnQoKSkgewotICAg
ICAgICBpZiAoYXV0byogbmV4dFNpYmxpbmcgPSBuZXh0SW5QcmVPcmRlci0+bmV4dEluRmxvd09y
RmxvYXRpbmdTaWJsaW5nKCkpCi0gICAgICAgICAgICByZXR1cm4gbmV4dFNpYmxpbmc7Ci0gICAg
fQotICAgIHJldHVybiBudWxscHRyOwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0
OjpsYXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiBpbnZhbGlkYXRpb25TdGF0
ZSwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAg
ICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1N0
YXJ0XSAtPiBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0IC0+IGZvcm1hdHRpbmcgcm9vdCgiIDw8
ICZyb290KCkgPDwgIikiKTsKLSAgICBBU1NFUlQocm9vdCgpLmhhc0luRmxvd09yRmxvYXRpbmdD
aGlsZCgpKTsKLQotICAgIGludmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoaW52YWxpZGF0aW9uU3Rh
dGUpOwotICAgIGF1dG8qIGxheW91dEJveCA9IHJvb3QoKS5maXJzdEluRmxvd09yRmxvYXRpbmdD
aGlsZCgpOwotICAgIC8vIDEuIFZpc2l0IGVhY2ggaW5saW5lIGJveCBhbmQgcGFydGlhbGx5IGNv
bXB1dGUgdGhlaXIgZ2VvbWV0cnkgKG1hcmdpbnMsIHBhZGRpbmcgYW5kIGJvcmRlcnMpLgotICAg
IC8vIDIuIENvbGxlY3QgdGhlIGlubGluZSBpdGVtcyAoZmxhdHRlbiB0aGUgdGhlIGxheW91dCB0
cmVlKSBhbmQgcGxhY2UgdGhlbSBvbiBsaW5lcyBpbiBiaWRpcmVjdGlvbmFsIG9yZGVyLiAKLSAg
ICB3aGlsZSAobGF5b3V0Qm94KSB7Ci0gICAgICAgIEFTU0VSVChsYXlvdXRCb3gtPmlzSW5saW5l
TGV2ZWxCb3goKSB8fCBsYXlvdXRCb3gtPmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOwotCi0gICAg
ICAgIGlmIChsYXlvdXRCb3gtPmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSB8fCBsYXlvdXRCb3gt
PmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgICAgIC8vIElubGluZS1ibG9ja3Ms
IGlubGluZS10YWJsZXMgYW5kIHJlcGxhY2VkIGVsZW1lbnRzIChpbWcsIHZpZGVvKSBjYW4gYmUg
c2l6ZWQgYnV0IG5vdCB5ZXQgcG9zaXRpb25lZC4KLSAgICAgICAgICAgIGlmIChpczxDb250YWlu
ZXJCb3g+KGxheW91dEJveCkgJiYgbGF5b3V0Qm94LT5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250
ZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQobGF5b3V0Qm94LT5pc0lubGluZUJsb2Nr
Qm94KCkgfHwgbGF5b3V0Qm94LT5pc0lubGluZVRhYmxlQm94KCkgfHwgbGF5b3V0Qm94LT5pc0Zs
b2F0aW5nUG9zaXRpb25lZCgpKTsKLSAgICAgICAgICAgICAgICBhdXRvJiBmb3JtYXR0aW5nUm9v
dCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4oKmxheW91dEJveCk7Ci0gICAgICAgICAgICAgICAg
Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzLmhvcml6
b250YWwpOwotICAgICAgICAgICAgICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbihmb3JtYXR0aW5n
Um9vdCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm9y
bWF0dGluZ1Jvb3QuaGFzQ2hpbGQoKSkgewotICAgICAgICAgICAgICAgICAgICBhdXRvIGZvcm1h
dHRpbmdDb250ZXh0ID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZm9y
bWF0dGluZ1Jvb3QsIGxheW91dFN0YXRlKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZm9y
bWF0dGluZ1Jvb3QuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCi0gICAgICAgICAgICAgICAg
ICAgICAgICBmb3JtYXR0aW5nQ29udGV4dC0+bGF5b3V0SW5GbG93Q29udGVudChpbnZhbGlkYXRp
b25TdGF0ZSwgZ2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoZm9ybWF0dGlu
Z1Jvb3QpKTsKLSAgICAgICAgICAgICAgICAgICAgY29tcHV0ZUhlaWdodEFuZE1hcmdpbihmb3Jt
YXR0aW5nUm9vdCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICAgICAgICAg
IGZvcm1hdHRpbmdDb250ZXh0LT5sYXlvdXRPdXRPZkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0
YXRlLCBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudChmb3JtYXR0aW5n
Um9vdCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBjb21w
dXRlSGVpZ2h0QW5kTWFyZ2luKGZvcm1hdHRpbmdSb290LCBjb25zdHJhaW50cy5ob3Jpem9udGFs
KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVwbGFjZWQgYW5k
IG90aGVyIHR5cGUgb2YgbGVhZiBhdG9taWMgaW5saW5lIGJveGVzLgotICAgICAgICAgICAgICAg
IGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250
YWwpOwotICAgICAgICAgICAgICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbigqbGF5b3V0Qm94LCBj
b25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICAgICAgICAgICAgICBjb21wdXRlSGVpZ2h0QW5k
TWFyZ2luKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwotICAgICAgICAgICAg
fQotICAgICAgICB9IGVsc2UgaWYgKGxheW91dEJveC0+aXNMaW5lQnJlYWtCb3goKSkgewotICAg
ICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRy
eSgqbGF5b3V0Qm94KTsKLSAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJn
aW4oeyB9KTsKLSAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldEJvcmRlcih7IH0pOwotICAgICAg
ICAgICAgYm94R2VvbWV0cnkuc2V0UGFkZGluZyh7IH0pOwotICAgICAgICAgICAgYm94R2VvbWV0
cnkuc2V0Q29udGVudEJveFdpZHRoKHsgfSk7Ci0gICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRW
ZXJ0aWNhbE1hcmdpbih7IH0pOwotICAgICAgICB9IGVsc2UgaWYgKGxheW91dEJveC0+aXNJbmxp
bmVCb3goKSkgewotICAgICAgICAgICAgLy8gVGV4dCB3cmFwcGVyIGJveGVzIChhbm9ueW1vdXMg
aW5saW5lIGxldmVsIGJveGVzKSBkb24ndCBoYXZlIGJveCBnZW9tZXRyaWVzICh0aGV5IG9ubHkg
Z2VuZXJhdGUgcnVucykuCi0gICAgICAgICAgICBpZiAoIWxheW91dEJveC0+aXNJbmxpbmVUZXh0
Qm94KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJbmxpbmUgYm94ZXMgKDxzcGFuPikgY2FuJ3Qg
Z2V0IHNpemVkL3Bvc2l0aW9uZWQgeWV0LiBBdCB0aGlzIHBvaW50IHdlIGNhbiBvbmx5IGNvbXB1
dGUgdGhlaXIgbWFyZ2lucywgYm9yZGVycyBhbmQgcGFkZGluZy4KLSAgICAgICAgICAgICAgICBj
b21wdXRlQm9yZGVyQW5kUGFkZGluZygqbGF5b3V0Qm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFs
KTsKLSAgICAgICAgICAgICAgICBjb21wdXRlSG9yaXpvbnRhbE1hcmdpbigqbGF5b3V0Qm94LCBj
b25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUo
KS5ib3hHZW9tZXRyeSgqbGF5b3V0Qm94KS5zZXRWZXJ0aWNhbE1hcmdpbih7IH0pOwotICAgICAg
ICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OwotCi0gICAgICAgIGxheW91dEJveCA9IG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KCpsYXlv
dXRCb3gsIHJvb3QoKSk7Ci0gICAgfQotCi0gICAgY29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRl
ZCgpOwotCi0gICAgYXV0byYgaW5saW5lSXRlbXMgPSBmb3JtYXR0aW5nU3RhdGUoKS5pbmxpbmVJ
dGVtcygpOwotICAgIGxpbmVMYXlvdXQoaW5saW5lSXRlbXMsIHsgMCwgaW5saW5lSXRlbXMuc2l6
ZSgpIH0sIGNvbnN0cmFpbnRzKTsKLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRl
eHRMYXlvdXQsIHN0cmVhbSA8PCAiW0VuZF0gLT4gaW5saW5lIGZvcm1hdHRpbmcgY29udGV4dCAt
PiBmb3JtYXR0aW5nIHJvb3QoIiA8PCAmcm9vdCgpIDw8ICIpIik7Ci19Ci0KLXZvaWQgSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQ6OmxpbmVMYXlvdXRGb3JJbnRlcmdyYXRpb24oSW52YWxpZGF0aW9u
U3RhdGUmIGludmFsaWRhdGlvblN0YXRlLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRl
bnQmIGNvbnN0cmFpbnRzKQotewotICAgIGludmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoaW52YWxp
ZGF0aW9uU3RhdGUpOwotICAgIGNvbGxlY3RJbmxpbmVDb250ZW50SWZOZWVkZWQoKTsKLSAgICBh
dXRvJiBpbmxpbmVJdGVtcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmlubGluZUl0ZW1zKCk7Ci0gICAg
bGluZUxheW91dChpbmxpbmVJdGVtcywgeyAwLCBpbmxpbmVJdGVtcy5zaXplKCkgfSwgY29uc3Ry
YWludHMpOwotfQotCi1MYXlvdXRVbml0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojp1c2VkQ29u
dGVudEhlaWdodCgpIGNvbnN0Ci17Ci0gICAgLy8gMTAuNi43ICdBdXRvJyBoZWlnaHRzIGZvciBi
bG9jayBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdHMKLQotICAgIC8vIElmIGl0IG9ubHkgaGFzIGlu
bGluZS1sZXZlbCBjaGlsZHJlbiwgdGhlIGhlaWdodCBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0
aGUgdG9wIG9mIHRoZSB0b3Btb3N0IGxpbmUgYm94IGFuZCB0aGUgYm90dG9tIG9mIHRoZSBib3R0
b21tb3N0IGxpbmUgYm94LgotCi0gICAgLy8gSW4gYWRkaXRpb24sIGlmIHRoZSBlbGVtZW50IGhh
cyBhbnkgZmxvYXRpbmcgZGVzY2VuZGFudHMgd2hvc2UgYm90dG9tIG1hcmdpbiBlZGdlIGlzIGJl
bG93IHRoZSBlbGVtZW50J3MgYm90dG9tIGNvbnRlbnQgZWRnZSwKLSAgICAvLyB0aGVuIHRoZSBo
ZWlnaHQgaXMgaW5jcmVhc2VkIHRvIGluY2x1ZGUgdGhvc2UgZWRnZXMuIE9ubHkgZmxvYXRzIHRo
YXQgcGFydGljaXBhdGUgaW4gdGhpcyBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgYXJlIHRha2Vu
Ci0gICAgLy8gaW50byBhY2NvdW50LCBlLmcuLCBmbG9hdHMgaW5zaWRlIGFic29sdXRlbHkgcG9z
aXRpb25lZCBkZXNjZW5kYW50cyBvciBvdGhlciBmbG9hdHMgYXJlIG5vdC4KLSAgICBhdXRvJiBs
aW5lcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmxpbmVzKCk7Ci0gICAgLy8gRXZlbiBlbXB0eSBjb250
ZW50IGdlbmVyYXRlcyBhIGxpbmUuCi0gICAgQVNTRVJUKCFsaW5lcy5pc0VtcHR5KCkpOwotICAg
IGF1dG8gdG9wID0gTGF5b3V0VW5pdCB7IGxpbmVzLmZpcnN0KCkubGluZUJveExvZ2ljYWxSZWN0
KCkudG9wKCkgfTsKLSAgICBhdXRvIGJvdHRvbSA9IExheW91dFVuaXQgeyBsaW5lcy5sYXN0KCku
bGluZUJveExvZ2ljYWxSZWN0KCkuYm90dG9tKCkgKyBmb3JtYXR0aW5nU3RhdGUoKS5jbGVhckdh
cEFmdGVyTGFzdExpbmUoKSB9OwotCi0gICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGlu
Z0NvbnRleHQgeyAqdGhpcywgZm9ybWF0dGluZ1N0YXRlKCkuZmxvYXRpbmdTdGF0ZSgpIH07Ci0g
ICAgaWYgKGF1dG8gZmxvYXRCb3R0b20gPSBmbG9hdGluZ0NvbnRleHQuYm90dG9tKCkpIHsKLSAg
ICAgICAgYm90dG9tID0gc3RkOjptYXgoKmZsb2F0Qm90dG9tLCBib3R0b20pOwotICAgICAgICB0
b3AgPSBzdGQ6Om1pbigqZmxvYXRpbmdDb250ZXh0LnRvcCgpLCB0b3ApOwotICAgIH0KLSAgICBy
ZXR1cm4gYm90dG9tIC0gdG9wOwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojps
aW5lTGF5b3V0KElubGluZUl0ZW1zJiBpbmxpbmVJdGVtcywgTGluZUJ1aWxkZXI6OklubGluZUl0
ZW1SYW5nZSBuZWVkc0xheW91dFJhbmdlLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRl
bnQmIGNvbnN0cmFpbnRzKQotewotICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZv
cm1hdHRpbmdTdGF0ZSgpOwotICAgIGZvcm1hdHRpbmdTdGF0ZS5saW5lUnVucygpLnJlc2VydmVJ
bml0aWFsQ2FwYWNpdHkoZm9ybWF0dGluZ1N0YXRlLmlubGluZUl0ZW1zKCkuc2l6ZSgpKTsKLSAg
ICBJbmxpbmVMYXlvdXRVbml0IGxpbmVMb2dpY2FsVG9wID0gY29uc3RyYWludHMudmVydGljYWwu
bG9naWNhbFRvcDsKLSAgICBzdHJ1Y3QgUHJldmlvdXNMaW5lIHsKLSAgICAgICAgTGluZUJ1aWxk
ZXI6OklubGluZUl0ZW1SYW5nZSByYW5nZTsKLSAgICAgICAgc2l6ZV90IG92ZXJmbG93Q29udGVu
dExlbmd0aCB7IDAgfTsKLSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gb3ZlcmZs
b3dMb2dpY2FsV2lkdGg7Ci0gICAgfTsKLSAgICBPcHRpb25hbDxQcmV2aW91c0xpbmU+IHByZXZp
b3VzTGluZTsKLSAgICBhdXRvJiBmbG9hdGluZ1N0YXRlID0gZm9ybWF0dGluZ1N0YXRlLmZsb2F0
aW5nU3RhdGUoKTsKLSAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7
ICp0aGlzLCBmbG9hdGluZ1N0YXRlIH07Ci0gICAgYXV0byBpc0ZpcnN0TGluZSA9IGZvcm1hdHRp
bmdTdGF0ZS5saW5lcygpLmlzRW1wdHkoKTsKLQotICAgIGF1dG8gbGluZUJ1aWxkZXIgPSBMaW5l
QnVpbGRlciB7ICp0aGlzLCBmbG9hdGluZ1N0YXRlLCBjb25zdHJhaW50cy5ob3Jpem9udGFsLCBp
bmxpbmVJdGVtcyB9OwotICAgIHdoaWxlICghbmVlZHNMYXlvdXRSYW5nZS5pc0VtcHR5KCkpIHsK
LSAgICAgICAgLy8gVHVybiBwcmV2aW91cyBsaW5lJ3Mgb3ZlcmZsb3cgY29udGVudCBsZW5ndGgg
aW50byB0aGUgbmV4dCBsaW5lJ3MgbGVhZGluZyBjb250ZW50IHBhcnRpYWwgbGVuZ3RoLgotICAg
ICAgICAvLyAic3BbPC1saW5lIGJyZWFrLT5dbGl0X2NvbnRlbnQiIC0+IG92ZXJmbG93IGxlbmd0
aDogMTEgLT4gbGVhZGluZyBwYXJ0aWFsIGNvbnRlbnQgbGVuZ3RoOiAxMS4KLSAgICAgICAgYXV0
byBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGggPSBwcmV2aW91c0xpbmUgPyBwcmV2aW91c0xp
bmUtPm92ZXJmbG93Q29udGVudExlbmd0aCA6IDA7Ci0gICAgICAgIGF1dG8gbGVhZGluZ0xvZ2lj
YWxXaWR0aCA9IHByZXZpb3VzTGluZSA/IHByZXZpb3VzTGluZS0+b3ZlcmZsb3dMb2dpY2FsV2lk
dGggOiBXVEY6Om51bGxvcHQ7Ci0gICAgICAgIGF1dG8gaW5pdGlhbExpbmVDb25zdHJhaW50cyA9
IElubGluZVJlY3QgeyBsaW5lTG9naWNhbFRvcCwgY29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dp
Y2FsTGVmdCwgY29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dpY2FsV2lkdGgsIHF1aXJrcygpLmlu
aXRpYWxMaW5lSGVpZ2h0KCkgfTsKLSAgICAgICAgYXV0byBsaW5lQ29udGVudCA9IGxpbmVCdWls
ZGVyLmxheW91dElubGluZUNvbnRlbnQobmVlZHNMYXlvdXRSYW5nZSwgcGFydGlhbExlYWRpbmdD
b250ZW50TGVuZ3RoLCBsZWFkaW5nTG9naWNhbFdpZHRoLCBpbml0aWFsTGluZUNvbnN0cmFpbnRz
LCBpc0ZpcnN0TGluZSk7Ci0gICAgICAgIGF1dG8gbGluZUxvZ2ljYWxSZWN0ID0gY29tcHV0ZUdl
b21ldHJ5Rm9yTGluZUNvbnRlbnQobGluZUNvbnRlbnQsIGNvbnN0cmFpbnRzLmhvcml6b250YWwp
OwotCi0gICAgICAgIGF1dG8gbGluZUNvbnRlbnRSYW5nZSA9IGxpbmVDb250ZW50LmlubGluZUl0
ZW1SYW5nZTsKLSAgICAgICAgaWYgKCFsaW5lQ29udGVudFJhbmdlLmlzRW1wdHkoKSkgewotICAg
ICAgICAgICAgQVNTRVJUKG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQgPCBsaW5lQ29udGVudFJhbmdl
LmVuZCk7Ci0gICAgICAgICAgICBpc0ZpcnN0TGluZSA9IGZhbHNlOwotICAgICAgICAgICAgbGlu
ZUxvZ2ljYWxUb3AgPSBnZW9tZXRyeSgpLmxvZ2ljYWxUb3BGb3JOZXh0TGluZShsaW5lQ29udGVu
dCwgbGluZUxvZ2ljYWxSZWN0LmJvdHRvbSgpLCBmbG9hdGluZ0NvbnRleHQpOwotICAgICAgICAg
ICAgaWYgKGxpbmVDb250ZW50LmlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudCkgewotICAgICAg
ICAgICAgICAgIC8vIFRoZSBmaW5hbCBjb250ZW50IGhlaWdodCBvZiB0aGlzIGlubGluZSBmb3Jt
YXR0aW5nIGNvbnRleHQgc2hvdWxkIGluY2x1ZGUgdGhlIGNsZWFyZWQgZmxvYXRzIGFzIHdlbGwu
Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLnNldENsZWFyR2FwQWZ0ZXJMYXN0TGlu
ZShsaW5lTG9naWNhbFRvcCAtIGxpbmVMb2dpY2FsUmVjdC5ib3R0b20oKSk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAvLyBXaGVuIHRoZSB0cmFpbGluZyBjb250ZW50IGlzIHBhcnRpYWws
IHdlIG5lZWQgdG8gcmV1c2UgdGhlIGxhc3QgSW5saW5lVGV4dEl0ZW0uCi0gICAgICAgICAgICBh
dXRvIGxhc3RJbmxpbmVJdGVtTmVlZHNQYXJ0aWFsTGF5b3V0ID0gbGluZUNvbnRlbnQucGFydGlh
bFRyYWlsaW5nQ29udGVudExlbmd0aDsKLSAgICAgICAgICAgIGlmIChsYXN0SW5saW5lSXRlbU5l
ZWRzUGFydGlhbExheW91dCkgewotICAgICAgICAgICAgICAgIGF1dG8gbGluZUxheW91dEhhc0Fk
dmFuY2VkID0gIXByZXZpb3VzTGluZQotICAgICAgICAgICAgICAgICAgICB8fCBsaW5lQ29udGVu
dFJhbmdlLmVuZCA+IHByZXZpb3VzTGluZS0+cmFuZ2UuZW5kCi0gICAgICAgICAgICAgICAgICAg
IHx8IChwcmV2aW91c0xpbmUtPm92ZXJmbG93Q29udGVudExlbmd0aCAmJiBwcmV2aW91c0xpbmUt
Pm92ZXJmbG93Q29udGVudExlbmd0aCA+IGxpbmVDb250ZW50LnBhcnRpYWxUcmFpbGluZ0NvbnRl
bnRMZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmICghbGluZUxheW91dEhhc0FkdmFuY2VkKSB7
Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAg
ICAgICAgICAvLyBNb3ZlIG92ZXIgdG8gdGhlIG5leHQgcnVuIGlmIHdlIGFyZSBzdHVjayBvbiB0
aGlzIHBhcnRpYWwgY29udGVudCAod2hlbiB0aGUgb3ZlcmZsb3cgY29udGVudCBsZW5ndGggcmVt
YWlucyB0aGUgc2FtZSkuCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNlcnRhaW5seSBsb3Nl
IHNvbWUgY29udGVudCwgYnV0IHdlIHdvdWxkIGJlIGJ1c3kgbG9vcGluZyBvdGhlcndpc2UuCi0g
ICAgICAgICAgICAgICAgICAgIGxhc3RJbmxpbmVJdGVtTmVlZHNQYXJ0aWFsTGF5b3V0ID0gZmFs
c2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmVlZHNM
YXlvdXRSYW5nZS5zdGFydCA9IGxhc3RJbmxpbmVJdGVtTmVlZHNQYXJ0aWFsTGF5b3V0ID8gbGlu
ZUNvbnRlbnRSYW5nZS5lbmQgLSAxIDogbGluZUNvbnRlbnRSYW5nZS5lbmQ7Ci0gICAgICAgICAg
ICBwcmV2aW91c0xpbmUgPSBQcmV2aW91c0xpbmUgeyBsaW5lQ29udGVudFJhbmdlLCBsaW5lQ29u
dGVudC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoLCBsaW5lQ29udGVudC5vdmVyZmxvd0xv
Z2ljYWxXaWR0aCB9OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAg
Ly8gRmxvYXRzIHByZXZlbnRlZCB1cyBwbGFjaW5nIGFueSBjb250ZW50IG9uIHRoZSBsaW5lLgot
ICAgICAgICBBU1NFUlQobGluZUNvbnRlbnQucnVucy5pc0VtcHR5KCkpOwotICAgICAgICBBU1NF
UlQobGluZUNvbnRlbnQuaGFzSW50cnVzaXZlRmxvYXQpOwotICAgICAgICAvLyBNb3ZlIHRoZSBu
ZXh0IGxpbmUgYmVsb3cgdGhlIGludHJ1c2l2ZSBmbG9hdC4KLSAgICAgICAgYXV0byBmbG9hdENv
bnN0cmFpbnRzID0gZmxvYXRpbmdDb250ZXh0LmNvbnN0cmFpbnRzKHRvTGF5b3V0VW5pdChsaW5l
TG9naWNhbFRvcCksIHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFJlY3QuYm90dG9tKCkpKTsKLSAg
ICAgICAgQVNTRVJUKGZsb2F0Q29uc3RyYWludHMubGVmdCB8fCBmbG9hdENvbnN0cmFpbnRzLnJp
Z2h0KTsKLSAgICAgICAgc3RhdGljIGF1dG8gaW5pZml0ZVBvaW50ID0gUG9pbnRJbkNvbnRleHRS
b290OjptYXgoKTsKLSAgICAgICAgLy8gSW4gY2FzZSBvZiBsZWZ0IGFuZCByaWdodCBjb25zdHJh
aW50cywgd2UgbmVlZCB0byBwaWNrIHRoZSBvbmUgdGhhdCdzIGNsb3NlciB0byB0aGUgY3VycmVu
dCBsaW5lLgotICAgICAgICBsaW5lTG9naWNhbFRvcCA9IHN0ZDo6bWluKGZsb2F0Q29uc3RyYWlu
dHMubGVmdC52YWx1ZU9yKGluaWZpdGVQb2ludCkueSwgZmxvYXRDb25zdHJhaW50cy5yaWdodC52
YWx1ZU9yKGluaWZpdGVQb2ludCkueSk7Ci0gICAgICAgIEFTU0VSVChsaW5lTG9naWNhbFRvcCA8
IGluaWZpdGVQb2ludC55KTsKLSAgICB9Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzIElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlZEludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMoKQotewotICAgIGF1dG8mIGxheW91dFN0YXRlID0gdGhpcy0+
bGF5b3V0U3RhdGUoKTsKLSAgICBBU1NFUlQoIWZvcm1hdHRpbmdTdGF0ZSgpLmludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMoKSk7Ci0KLSAgICBpZiAoIXJvb3QoKS5oYXNJbkZsb3dPckZsb2F0aW5n
Q2hpbGQoKSkgewotICAgICAgICBhdXRvIGNvbnN0cmFpbnRzID0gZ2VvbWV0cnkoKS5jb25zdHJh
aW5CeU1pbk1heFdpZHRoKHJvb3QoKSwgeyB9KTsKLSAgICAgICAgZm9ybWF0dGluZ1N0YXRlKCku
c2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25zdHJhaW50cyk7Ci0gICAgICAgIHJldHVy
biBjb25zdHJhaW50czsKLSAgICB9Ci0KLSAgICBWZWN0b3I8Y29uc3QgQm94Kj4gZm9ybWF0dGlu
Z0NvbnRleHRSb290TGlzdDsKLSAgICBhdXRvIGhvcml6b250YWxDb25zdHJhaW50cyA9IEhvcml6
b250YWxDb25zdHJhaW50cyB7IDBfbHUsIDBfbHUgfTsKLSAgICBhdXRvKiBsYXlvdXRCb3ggPSBy
b290KCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsKLSAgICAvLyBJbiBvcmRlciB0byBj
b21wdXRlIHRoZSBtYXgvbWluIHdpZHRocywgd2UgbmVlZCB0byBjb21wdXRlIG1hcmdpbnMsIGJv
cmRlcnMgYW5kIHBhZGRpbmcgZm9yIGNlcnRhaW4gaW5saW5lIGJveGVzIGZpcnN0LgotICAgIHdo
aWxlIChsYXlvdXRCb3gpIHsKLSAgICAgICAgaWYgKGxheW91dEJveC0+aXNJbmxpbmVUZXh0Qm94
KCkpIHsKLSAgICAgICAgICAgIGxheW91dEJveCA9IG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0
KCpsYXlvdXRCb3gsIHJvb3QoKSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQot
ICAgICAgICBpZiAobGF5b3V0Qm94LT5pc1JlcGxhY2VkQm94KCkpIHsKLSAgICAgICAgICAgIGNv
bXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7
Ci0gICAgICAgICAgICBjb21wdXRlV2lkdGhBbmRNYXJnaW4oKmxheW91dEJveCwgaG9yaXpvbnRh
bENvbnN0cmFpbnRzKTsKLSAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRCb3gtPmlzRmxvYXRpbmdQ
b3NpdGlvbmVkKCkgfHwgbGF5b3V0Qm94LT5pc0F0b21pY0lubGluZUxldmVsQm94KCkpIHsKLSAg
ICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3gtPmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQo
KSk7Ci0gICAgICAgICAgICBmb3JtYXR0aW5nQ29udGV4dFJvb3RMaXN0LmFwcGVuZChsYXlvdXRC
b3gpOwotCi0gICAgICAgICAgICBjb21wdXRlQm9yZGVyQW5kUGFkZGluZygqbGF5b3V0Qm94LCBo
b3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxNYXJn
aW4oKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgICAgIGNvbXB1
dGVJbnRyaW5zaWNXaWR0aEZvckZvcm1hdHRpbmdSb290KCpsYXlvdXRCb3gpOwotICAgICAgICB9
IGVsc2UgaWYgKGxheW91dEJveC0+aXNJbmxpbmVCb3goKSkgewotICAgICAgICAgICAgY29tcHV0
ZUJvcmRlckFuZFBhZGRpbmcoKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAg
ICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsTWFyZ2luKCpsYXlvdXRCb3gsIGhvcml6b250YWxD
b25zdHJhaW50cyk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7Ci0gICAgICAgIGxheW91dEJveCA9IG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KCps
YXlvdXRCb3gsIHJvb3QoKSk7Ci0gICAgfQotCi0gICAgY29sbGVjdElubGluZUNvbnRlbnRJZk5l
ZWRlZCgpOwotCi0gICAgYXV0byBtYXhpbXVtTGluZVdpZHRoID0gWyZdKGF1dG8gYXZhaWxhYmxl
V2lkdGgpIHsKLSAgICAgICAgLy8gU3dpdGNoIHRvIHRoZSBtaW4vbWF4IGZvcm1hdHRpbmcgcm9v
dCB3aWR0aCB2YWx1ZXMgYmVmb3JlIGZvcm1hdHRpbmcgdGhlIGxpbmVzLgotICAgICAgICBmb3Ig
KGF1dG8qIGZvcm1hdHRpbmdSb290IDogZm9ybWF0dGluZ0NvbnRleHRSb290TGlzdCkgewotICAg
ICAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aHMgPSBsYXlvdXRTdGF0ZS5mb3JtYXR0aW5nU3Rh
dGVGb3JCb3goKmZvcm1hdHRpbmdSb290KS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94
KCpmb3JtYXR0aW5nUm9vdCk7Ci0gICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1h
dHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KCpmb3JtYXR0aW5nUm9vdCk7Ci0gICAgICAgICAgICBh
dXRvIGNvbnRlbnRXaWR0aCA9IChhdmFpbGFibGVXaWR0aCA/IGludHJpbnNpY1dpZHRocy0+bWF4
aW11bSA6IGludHJpbnNpY1dpZHRocy0+bWluaW11bSkgLSBib3hHZW9tZXRyeS5ob3Jpem9udGFs
TWFyZ2luQm9yZGVyQW5kUGFkZGluZygpOwotICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29u
dGVudEJveFdpZHRoKGNvbnRlbnRXaWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNv
bXB1dGVkSW50cmluc2ljV2lkdGhGb3JDb25zdHJhaW50KGF2YWlsYWJsZVdpZHRoKTsKLSAgICB9
OwotCi0gICAgYXV0byBtaW5pbXVtQ29udGVudFdpZHRoID0gY2VpbGVkTGF5b3V0VW5pdChtYXhp
bXVtTGluZVdpZHRoKDApKTsKLSAgICBhdXRvIG1heGltdW1Db250ZW50V2lkdGggPSBjZWlsZWRM
YXlvdXRVbml0KG1heGltdW1MaW5lV2lkdGgobWF4SW5saW5lTGF5b3V0VW5pdCgpKSk7Ci0gICAg
YXV0byBjb25zdHJhaW50cyA9IGdlb21ldHJ5KCkuY29uc3RyYWluQnlNaW5NYXhXaWR0aChyb290
KCksIHsgbWluaW11bUNvbnRlbnRXaWR0aCwgbWF4aW11bUNvbnRlbnRXaWR0aCB9KTsKLSAgICBm
b3JtYXR0aW5nU3RhdGUoKS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0cmFpbnRz
KTsKLSAgICByZXR1cm4gY29uc3RyYWludHM7Ci19Ci0KLUlubGluZUxheW91dFVuaXQgSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhGb3JDb25zdHJhaW50KElu
bGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgpIGNvbnN0Ci17Ci0gICAgYXV0byYgaW5saW5l
SXRlbXMgPSBmb3JtYXR0aW5nU3RhdGUoKS5pbmxpbmVJdGVtcygpOwotICAgIGF1dG8gbGluZUJ1
aWxkZXIgPSBMaW5lQnVpbGRlciB7ICp0aGlzLCBpbmxpbmVJdGVtcyB9OwotICAgIGF1dG8gbGF5
b3V0UmFuZ2UgPSBMaW5lQnVpbGRlcjo6SW5saW5lSXRlbVJhbmdlIHsgMCAsIGlubGluZUl0ZW1z
LnNpemUoKSB9OwotICAgIGF1dG8gbWF4aW11bUxpbmVXaWR0aCA9IElubGluZUxheW91dFVuaXQg
eyB9OwotICAgIGF1dG8gbWF4aW11bUZsb2F0V2lkdGggPSBMYXlvdXRVbml0IHsgfTsKLSAgICB3
aGlsZSAoIWxheW91dFJhbmdlLmlzRW1wdHkoKSkgewotICAgICAgICBhdXRvIGludHJpbnNpY0Nv
bnRlbnQgPSBsaW5lQnVpbGRlci5jb21wdXRlZEludHJpbnNpY1dpZHRoKGxheW91dFJhbmdlLCBh
dmFpbGFibGVXaWR0aCk7Ci0gICAgICAgIGxheW91dFJhbmdlLnN0YXJ0ID0gaW50cmluc2ljQ29u
dGVudC5pbmxpbmVJdGVtUmFuZ2UuZW5kOwotICAgICAgICBtYXhpbXVtTGluZVdpZHRoID0gc3Rk
OjptYXgobWF4aW11bUxpbmVXaWR0aCwgaW50cmluc2ljQ29udGVudC5sb2dpY2FsV2lkdGgpOwot
ICAgICAgICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIGNsZWFyLgotICAgICAgICBmb3IgKGF1
dG8qIGZsb2F0Qm94IDogaW50cmluc2ljQ29udGVudC5mbG9hdHMpCi0gICAgICAgICAgICBtYXhp
bXVtRmxvYXRXaWR0aCArPSBnZW9tZXRyeUZvckJveCgqZmxvYXRCb3gpLm1hcmdpbkJveFdpZHRo
KCk7Ci0gICAgfQotICAgIHJldHVybiBtYXhpbXVtTGluZVdpZHRoICsgbWF4aW11bUZsb2F0V2lk
dGg7Ci19Ci0KLXZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVJbnRyaW5zaWNX
aWR0aEZvckZvcm1hdHRpbmdSb290KGNvbnN0IEJveCYgZm9ybWF0dGluZ1Jvb3QpCi17Ci0gICAg
QVNTRVJUKGZvcm1hdHRpbmdSb290LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7Ci0g
ICAgYXV0byBjb25zdHJhaW50cyA9IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9OwotICAg
IGlmIChhdXRvIGZpeGVkV2lkdGggPSBnZW9tZXRyeSgpLmZpeGVkVmFsdWUoZm9ybWF0dGluZ1Jv
b3Quc3R5bGUoKS5sb2dpY2FsV2lkdGgoKSkpCi0gICAgICAgIGNvbnN0cmFpbnRzID0geyAqZml4
ZWRXaWR0aCwgKmZpeGVkV2lkdGggfTsKLSAgICBlbHNlIHsKLSAgICAgICAgYXV0byBoYXNJbmZs
b3dPckZsb2F0aW5nQ29udGVudCA9IGlzPENvbnRhaW5lckJveD4oZm9ybWF0dGluZ1Jvb3QpICYm
IGRvd25jYXN0PENvbnRhaW5lckJveD4oZm9ybWF0dGluZ1Jvb3QpLmhhc0luRmxvd09yRmxvYXRp
bmdDaGlsZCgpOwotICAgICAgICAvLyBUaGUgaW50cmluc2ljIHNpemVzIG9mIHRoZSBzaXplIGNv
bnRhaW5tZW50IGJveCBhcmUgZGV0ZXJtaW5lZCBhcyBpZiB0aGUgZWxlbWVudCBoYWQgbm8gY29u
dGVudC4KLSAgICAgICAgYXV0byBzaG91bGRJZ25vcmVDaGlsZENvbnRlbnQgPSBmb3JtYXR0aW5n
Um9vdC5pc1NpemVDb250YWlubWVudEJveCgpOwotICAgICAgICBpZiAoaGFzSW5mbG93T3JGbG9h
dGluZ0NvbnRlbnQgJiYgIXNob3VsZElnbm9yZUNoaWxkQ29udGVudCkKLSAgICAgICAgICAgIGNv
bnN0cmFpbnRzID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZG93bmNh
c3Q8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nUm9vdCksIGxheW91dFN0YXRlKCkpLT5jb21wdXRl
ZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKLSAgICB9Ci0gICAgY29uc3RyYWludHMgPSBn
ZW9tZXRyeSgpLmNvbnN0cmFpbkJ5TWluTWF4V2lkdGgoZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFp
bnRzKTsKLSAgICBjb25zdHJhaW50cy5leHBhbmQoZ2VvbWV0cnlGb3JCb3goZm9ybWF0dGluZ1Jv
b3QpLmhvcml6b250YWxNYXJnaW5Cb3JkZXJBbmRQYWRkaW5nKCkpOwotICAgIGZvcm1hdHRpbmdT
dGF0ZSgpLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goZm9ybWF0dGluZ1Jvb3Qs
IGNvbnN0cmFpbnRzKTsKLX0KLQotdm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0
ZUhvcml6b250YWxNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQotewotICAgIGF1dG8gY29tcHV0ZWRI
b3Jpem9udGFsTWFyZ2luID0gZ2VvbWV0cnkoKS5jb21wdXRlZEhvcml6b250YWxNYXJnaW4obGF5
b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgIGZvcm1hdHRpbmdTdGF0ZSgpLmJv
eEdlb21ldHJ5KGxheW91dEJveCkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IGNvbXB1dGVkSG9yaXpv
bnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDApLCBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5k
LnZhbHVlT3IoMCkgfSk7Ci19Ci0KLXZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1
dGVXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCi17Ci0gICAgYXV0byBjb21wdXRlID0g
WyZdKE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRXaWR0aCkgewotICAgICAgICBpZiAobGF5b3V0
Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnko
KS5mbG9hdGluZ0NvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cywgeyB1c2VkV2lkdGgsIHsgfSB9KTsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc0lu
bGluZUJsb2NrQm94KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbmxpbmVCbG9j
a0NvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywg
eyB1c2VkV2lkdGgsIHsgfSB9KTsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94
KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbmxpbmVSZXBsYWNlZENvbnRlbnRX
aWR0aEFuZE1hcmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRh
bENvbnN0cmFpbnRzLCB7IH0sIHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0gICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gQ29udGVudFdpZHRoQW5kTWFyZ2luIHsgfTsK
LSAgICB9OwotCi0gICAgYXV0byBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBjb21wdXRlKHsgfSk7
Ci0KLSAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2lj
YWxXaWR0aDsKLSAgICBpZiAoYXV0byBtYXhXaWR0aCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhX
aWR0aChsYXlvdXRCb3gsIGF2YWlsYWJsZVdpZHRoKSkgewotICAgICAgICBhdXRvIG1heFdpZHRo
QW5kTWFyZ2luID0gY29tcHV0ZShtYXhXaWR0aCk7Ci0gICAgICAgIGlmIChjb250ZW50V2lkdGhB
bmRNYXJnaW4uY29udGVudFdpZHRoID4gbWF4V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQot
ICAgICAgICAgICAgY29udGVudFdpZHRoQW5kTWFyZ2luID0gbWF4V2lkdGhBbmRNYXJnaW47Ci0g
ICAgfQotCi0gICAgYXV0byBtaW5XaWR0aCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNaW5XaWR0aChs
YXlvdXRCb3gsIGF2YWlsYWJsZVdpZHRoKS52YWx1ZU9yKDApOwotICAgIGF1dG8gbWluV2lkdGhB
bmRNYXJnaW4gPSBjb21wdXRlKG1pbldpZHRoKTsKLSAgICBpZiAoY29udGVudFdpZHRoQW5kTWFy
Z2luLmNvbnRlbnRXaWR0aCA8IG1pbldpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkKLSAgICAg
ICAgY29udGVudFdpZHRoQW5kTWFyZ2luID0gbWluV2lkdGhBbmRNYXJnaW47Ci0KLSAgICBhdXRv
JiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7
Ci0gICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGNvbnRlbnRXaWR0aEFuZE1hcmdp
bi5jb250ZW50V2lkdGgpOwotICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyBj
b250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCwgY29udGVudFdpZHRoQW5kTWFy
Z2luLnVzZWRNYXJnaW4uZW5kIH0pOwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0
Ojpjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jp
em9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKLXsKLSAgICBhdXRvIGNv
bXB1dGUgPSBbJl0oT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZEhlaWdodCkgewotICAgICAgICBp
ZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICByZXR1cm4g
Z2VvbWV0cnkoKS5mbG9hdGluZ0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4obGF5b3V0Qm94LCBob3Jp
em9udGFsQ29uc3RyYWludHMsIHsgdXNlZEhlaWdodCB9KTsKLSAgICAgICAgaWYgKGxheW91dEJv
eC5pc0lubGluZUJsb2NrQm94KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbmxp
bmVCbG9ja0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3Ry
YWludHMsIHsgdXNlZEhlaWdodCB9KTsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2Vk
Qm94KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbmxpbmVSZXBsYWNlZENvbnRl
bnRIZWlnaHRBbmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6
b250YWxDb25zdHJhaW50cywgeyB9LCB7IHVzZWRIZWlnaHQgfSk7Ci0gICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gQ29udGVudEhlaWdodEFuZE1hcmdpbiB7IH07
Ci0gICAgfTsKLQotICAgIGF1dG8gY29udGVudEhlaWdodEFuZE1hcmdpbiA9IGNvbXB1dGUoeyB9
KTsKLSAgICBpZiAoYXV0byBtYXhIZWlnaHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWF4SGVpZ2h0
KGxheW91dEJveCkpIHsKLSAgICAgICAgYXV0byBtYXhIZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRl
KG1heEhlaWdodCk7Ci0gICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRI
ZWlnaHQgPiBtYXhIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCkKLSAgICAgICAgICAgIGNv
bnRlbnRIZWlnaHRBbmRNYXJnaW4gPSBtYXhIZWlnaHRBbmRNYXJnaW47Ci0gICAgfQotCi0gICAg
aWYgKGF1dG8gbWluSGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbkhlaWdodChsYXlvdXRC
b3gpKSB7Ci0gICAgICAgIGF1dG8gbWluSGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZShtaW5IZWln
aHQpOwotICAgICAgICBpZiAoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0IDwg
bWluSGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpCi0gICAgICAgICAgICBjb250ZW50SGVp
Z2h0QW5kTWFyZ2luID0gbWluSGVpZ2h0QW5kTWFyZ2luOwotICAgIH0KLSAgICBhdXRvJiBib3hH
ZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAg
Ym94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNv
bnRlbnRIZWlnaHQpOwotICAgIGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgY29udGVu
dEhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW4uYmVmb3JlLCBjb250ZW50SGVpZ2h0
QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbi5hZnRlciB9KTsKLX0KLQotdm9pZCBJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dDo6Y29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgpCi17Ci0gICAg
YXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgaWYg
KCFmb3JtYXR0aW5nU3RhdGUuaW5saW5lSXRlbXMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
bjsKLSAgICAvLyBUcmF2ZXJzZSB0aGUgdHJlZSBhbmQgY3JlYXRlIGlubGluZSBpdGVtcyBvdXQg
b2YgaW5saW5lIGJveGVzIGFuZCBsZWFmIG5vZGVzLiBUaGlzIGVzc2VudGlhbGx5IHR1cm5zIHRo
ZSB0cmVlIGlubGluZSBzdHJ1Y3R1cmUgaW50byBhIGZsYXQgb25lLgotICAgIC8vIDxzcGFuPnRl
eHQ8c3Bhbj48L3NwYW4+PGltZz48L3NwYW4+IC0+IFtJbmxpbmVCb3hTdGFydF1bSW5saW5lTGV2
ZWxCb3hdW0lubGluZUJveFN0YXJ0XVtJbmxpbmVCb3hFbmRdW0lubGluZUxldmVsQm94XVtJbmxp
bmVCb3hFbmRdCi0gICAgQVNTRVJUKHJvb3QoKS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7
Ci0gICAgTGF5b3V0UXVldWUgbGF5b3V0UXVldWU7Ci0gICAgbGF5b3V0UXVldWUuYXBwZW5kKHJv
b3QoKS5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpKTsKLSAgICB3aGlsZSAoIWxheW91dFF1
ZXVlLmlzRW1wdHkoKSkgewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgYXV0
byYgbGF5b3V0Qm94ID0gKmxheW91dFF1ZXVlLmxhc3QoKTsKLSAgICAgICAgICAgIGF1dG8gaXNC
b3hXaXRoSW5saW5lQ29udGVudCA9IGxheW91dEJveC5pc0lubGluZUJveCgpICYmICFsYXlvdXRC
b3guaXNJbmxpbmVUZXh0Qm94KCkgJiYgIWxheW91dEJveC5pc0xpbmVCcmVha0JveCgpOwotICAg
ICAgICAgICAgaWYgKCFpc0JveFdpdGhJbmxpbmVDb250ZW50KQotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhcnQgb2YgYW4gaW5saW5lIGJveCAo
ZS5nLiA8c3Bhbj4pLgotICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZElubGluZUl0ZW0o
eyBsYXlvdXRCb3gsIElubGluZUl0ZW06OlR5cGU6OklubGluZUJveFN0YXJ0IH0pOwotICAgICAg
ICAgICAgYXV0byYgaW5saW5lQm94V2l0aElubGluZUNvbnRlbnQgPSBkb3duY2FzdDxDb250YWlu
ZXJCb3g+KGxheW91dEJveCk7Ci0gICAgICAgICAgICBpZiAoIWlubGluZUJveFdpdGhJbmxpbmVD
b250ZW50Lmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgbGF5b3V0UXVldWUuYXBwZW5kKGlubGluZUJveFdpdGhJbmxpbmVDb250
ZW50LmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAg
d2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGxheW91
dEJveCA9ICpsYXlvdXRRdWV1ZS50YWtlTGFzdCgpOwotICAgICAgICAgICAgaWYgKGlzPExpbmVC
cmVha0JveD4obGF5b3V0Qm94KSkgewotICAgICAgICAgICAgICAgIGF1dG8mIGxpbmVCcmVha0Jv
eCA9IGRvd25jYXN0PExpbmVCcmVha0JveD4obGF5b3V0Qm94KTsKLSAgICAgICAgICAgICAgICBm
b3JtYXR0aW5nU3RhdGUuYWRkSW5saW5lSXRlbSh7IGxheW91dEJveCwgbGluZUJyZWFrQm94Lmlz
T3B0aW9uYWwoKSA/IElubGluZUl0ZW06OlR5cGU6OldvcmRCcmVha09wcG9ydHVuaXR5IDogSW5s
aW5lSXRlbTo6VHlwZTo6SGFyZExpbmVCcmVhayB9KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAo
bGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICAgICAgZm9ybWF0
dGluZ1N0YXRlLmFkZElubGluZUl0ZW0oeyBsYXlvdXRCb3gsIElubGluZUl0ZW06OlR5cGU6OkZs
b2F0IH0pOwotICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0Qm94LmlzQXRvbWljSW5saW5lTGV2
ZWxCb3goKSkKLSAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkSW5saW5lSXRlbSh7
IGxheW91dEJveCwgSW5saW5lSXRlbTo6VHlwZTo6Qm94IH0pOwotICAgICAgICAgICAgZWxzZSBp
ZiAobGF5b3V0Qm94LmlzSW5saW5lVGV4dEJveCgpKSB7Ci0gICAgICAgICAgICAgICAgSW5saW5l
VGV4dEl0ZW06OmNyZWF0ZUFuZEFwcGVuZFRleHRJdGVtcyhmb3JtYXR0aW5nU3RhdGUuaW5saW5l
SXRlbXMoKSwgZG93bmNhc3Q8SW5saW5lVGV4dEJveD4obGF5b3V0Qm94KSk7Ci0gICAgICAgICAg
ICB9IGVsc2UgaWYgKGxheW91dEJveC5pc0lubGluZUJveCgpKQotICAgICAgICAgICAgICAgIGZv
cm1hdHRpbmdTdGF0ZS5hZGRJbmxpbmVJdGVtKHsgbGF5b3V0Qm94LCBJbmxpbmVJdGVtOjpUeXBl
OjpJbmxpbmVCb3hFbmQgfSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci0KLSAgICAgICAgICAgIGlmIChhdXRvKiBuZXh0U2libGluZyA9
IGxheW91dEJveC5uZXh0SW5GbG93T3JGbG9hdGluZ1NpYmxpbmcoKSkgewotICAgICAgICAgICAg
ICAgIGxheW91dFF1ZXVlLmFwcGVuZChuZXh0U2libGluZyk7Ci0gICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLUlubGluZVJlY3QgSW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVHZW9tZXRyeUZvckxpbmVDb250ZW50KGNvbnN0
IExpbmVCdWlsZGVyOjpMaW5lQ29udGVudCYgbGluZUNvbnRlbnQsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQotewotICAgIGF1dG8mIGZvcm1hdHRp
bmdTdGF0ZSA9IHRoaXMtPmZvcm1hdHRpbmdTdGF0ZSgpOwotICAgIGF1dG8gZ2VvbWV0cnkgPSB0
aGlzLT5nZW9tZXRyeSgpOwotCi0gICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVCb3goZ2VvbWV0
cnkubGluZUJveEZvckxpbmVDb250ZW50KGxpbmVDb250ZW50KSk7Ci0gICAgY29uc3QgYXV0byYg
bGluZUJveCA9IGZvcm1hdHRpbmdTdGF0ZS5saW5lQm94ZXMoKS5sYXN0KCk7Ci0gICAgYXV0byBs
aW5lSW5kZXggPSBmb3JtYXR0aW5nU3RhdGUubGluZXMoKS5zaXplKCk7Ci0gICAgYXV0byYgbGlu
ZUJveExvZ2ljYWxSZWN0ID0gbGluZUJveC5sb2dpY2FsUmVjdCgpOwotICAgIGlmICghbGluZUJv
eC5oYXNDb250ZW50KCkpIHsKLSAgICAgICAgLy8gRmFzdCBwYXRoIGZvciBsaW5lcyB3aXRoIG5v
IGNvbnRlbnQgZS5nLiA8ZGl2PjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PC9kaXY+IG9yIDxz
cGFuPjxkaXY+PC9kaXY+PC9zcGFuPiB3aGVyZSB3ZSBjb25zdHJ1Y3QgZW1wdHkgcHJlIGFuZCBw
b3N0IGJsb2Nrcy4KLSAgICAgICAgQVNTRVJUKCFsaW5lQm94LmNvbnRlbnRMb2dpY2FsV2lkdGgo
KSAmJiAhbGluZUJveExvZ2ljYWxSZWN0LmhlaWdodCgpKTsKLSAgICAgICAgYXV0byB1cGRhdGVJ
bmxpbmVCb3hlc0dlb21ldHJ5SWZBcHBsaWNhYmxlID0gWyZdIHsKLSAgICAgICAgICAgIGlmICgh
bGluZUJveC5oYXNJbmxpbmVCb3goKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
ICAgICBWZWN0b3I8Y29uc3QgQm94Kj4gbGF5b3V0Qm94TGlzdDsKLSAgICAgICAgICAgIC8vIENv
bGxlY3QgdGhlIGVtcHR5IGlubGluZSBib3hlcyB0aGF0IHNob3dlZCB1cCBmaXJzdCBvbiB0aGlz
IGxpbmUuCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgYW4gaW5saW5lIGJveCBlbmQgb24gYW4g
ZW1wdHkgbGluZSBkb2VzIG5vdCBtYWtlIHRoZSBpbmxpbmUgYm94IHRhbGxlci4KLSAgICAgICAg
ICAgIC8vIChlLmcuIDxkaXY+dGV4dDxzcGFuPjxicj48L3NwYW4+PC9kaXY+KSA8LSB0aGUgPHNw
YW4+IGlubGluZSBib3ggaXMgYXMgdGFsbCBhcyB0aGUgbGluZSBldmVuIHRob3VnaCB0aGUgPC9z
cGFuPiBpcyBhZnRlciBhIDxicj4gc28gdGVjaG5pY2FsbHkgaXMgb24gdGhlIGZvbGxvd2luZyAo
ZW1wdHkpbGluZS4KLSAgICAgICAgICAgIGZvciAoYXV0byYgbGluZVJ1biA6IGxpbmVDb250ZW50
LnJ1bnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobGluZVJ1bi5pc0lubGluZUJveFN0YXJ0KCkp
Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dEJveExpc3QuYXBwZW5kKCZsaW5lUnVuLmxheW91
dEJveCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoYXV0byogbGF5b3V0Qm94
IDogbGF5b3V0Qm94TGlzdCkgewotICAgICAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0g
Zm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KCpsYXlvdXRCb3gpOwotICAgICAgICAgICAgICAg
IGF1dG8gaW5saW5lQm94TG9naWNhbEhlaWdodCA9IExheW91dFVuaXQ6OmZyb21GbG9hdENlaWwo
bGluZUJveC5sb2dpY2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KCpsYXlvdXRCb3gsIGJveEdlb21l
dHJ5KS5oZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJv
eEhlaWdodChpbmxpbmVCb3hMb2dpY2FsSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBib3hHZW9t
ZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoeyB9KTsKLSAgICAgICAgICAgICAgICBib3hHZW9tZXRy
eS5zZXRMb2dpY2FsVG9wTGVmdCh0b0xheW91dFBvaW50KGxpbmVCb3hMb2dpY2FsUmVjdC50b3BM
ZWZ0KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgdXBkYXRlSW5saW5l
Qm94ZXNHZW9tZXRyeUlmQXBwbGljYWJsZSgpOwotICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRk
TGluZSh7IGxpbmVCb3hMb2dpY2FsUmVjdCwgeyB7IH0sIHsgfSB9LCB7IH0sIHsgfSwgeyB9IH0p
OwotICAgICAgICByZXR1cm4gbGluZUJveExvZ2ljYWxSZWN0OwotICAgIH0KLQotICAgIGF1dG8g
cm9vdElubGluZUJveExvZ2ljYWxSZWN0ID0gbGluZUJveC5sb2dpY2FsUmVjdEZvclJvb3RJbmxp
bmVCb3goKTsKLSAgICBhdXRvIGVuY2xvc2luZ1RvcEFuZEJvdHRvbSA9IElubGluZUxpbmVHZW9t
ZXRyeTo6RW5jbG9zaW5nVG9wQW5kQm90dG9tIHsgcm9vdElubGluZUJveExvZ2ljYWxSZWN0LnRv
cCgpLCByb290SW5saW5lQm94TG9naWNhbFJlY3QuYm90dG9tKCkgfTsKLSAgICBIYXNoU2V0PGNv
bnN0IEJveCo+IGlubGluZUJveFN0YXJ0U2V0OwotICAgIEhhc2hTZXQ8Y29uc3QgQm94Kj4gaW5s
aW5lQm94RW5kU2V0OwotCi0gICAgYXV0byBjb25zdHJ1Y3RMaW5lUnVuc0FuZFVwZGF0ZUJveEdl
b21ldHJ5ID0gWyZdIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBpbmxpbmUgcnVucyBvbiB0aGUg
Y3VycmVudCBsaW5lLiBUaGlzIGlzIG1vc3RseSB0ZXh0IGFuZCBhdG9taWMgaW5saW5lIHJ1bnMu
Ci0gICAgICAgIGZvciAoYXV0byYgbGluZVJ1biA6IGxpbmVDb250ZW50LnJ1bnMpIHsKLSAgICAg
ICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgbm90IG5lZWQgdG8gY29uc3RydWN0IGEgbGluZSBy
dW4gZm9yIDxicj4uCi0gICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBsaW5lUnVuLmxheW91
dEJveCgpOwotICAgICAgICAgICAgaWYgKGxpbmVSdW4uaXNUZXh0KCkpIHsKLSAgICAgICAgICAg
ICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZVJ1bih7IGxpbmVJbmRleCwgbGF5b3V0Qm94LCBs
aW5lQm94LmxvZ2ljYWxSZWN0Rm9yVGV4dFJ1bihsaW5lUnVuKSwgbGluZVJ1bi5leHBhbnNpb24o
KSwgbGluZVJ1bi50ZXh0Q29udGVudCgpIH0pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmVSdW4uaXNMaW5lQnJlYWsoKSkgewot
ICAgICAgICAgICAgICAgIGlmIChsYXlvdXRCb3guaXNMaW5lQnJlYWtCb3goKSkgewotICAgICAg
ICAgICAgICAgICAgICAvLyBPbmx5IGhhcmQgbGluZWJyZWFrcyBoYXZlIGFzc29jaWF0ZWQgbGF5
b3V0IGJveGVzLgotICAgICAgICAgICAgICAgICAgICBhdXRvIGxpbmVCcmVha0JveFJlY3QgPSBs
aW5lQm94LmxvZ2ljYWxSZWN0Rm9yTGluZUJyZWFrQm94KGxheW91dEJveCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRC
b3gsIGxpbmVCcmVha0JveFJlY3QsIGxpbmVSdW4uZXhwYW5zaW9uKCksIHsgfSB9KTsKLQotICAg
ICAgICAgICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hH
ZW9tZXRyeShsYXlvdXRCb3gpOwotICAgICAgICAgICAgICAgICAgICBsaW5lQnJlYWtCb3hSZWN0
Lm1vdmVCeShsaW5lQm94TG9naWNhbFJlY3QudG9wTGVmdCgpKTsKLSAgICAgICAgICAgICAgICAg
ICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQodG9MYXlvdXRQb2ludChsaW5lQnJlYWtC
b3hSZWN0LnRvcExlZnQoKSkpOwotICAgICAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRD
b250ZW50Qm94SGVpZ2h0KHRvTGF5b3V0VW5pdChsaW5lQnJlYWtCb3hSZWN0LmhlaWdodCgpKSk7
Ci0gICAgICAgICAgICAgICAgfSBlbHNlIAotICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5n
U3RhdGUuYWRkTGluZVJ1bih7IGxpbmVJbmRleCwgbGF5b3V0Qm94LCBsaW5lQm94LmxvZ2ljYWxS
ZWN0Rm9yVGV4dFJ1bihsaW5lUnVuKSwgbGluZVJ1bi5leHBhbnNpb24oKSwgbGluZVJ1bi50ZXh0
Q29udGVudCgpIH0pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgaWYgKGxpbmVSdW4uaXNCb3goKSkgewotICAgICAgICAgICAgICAgIEFTU0VS
VChsYXlvdXRCb3guaXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKTsKLSAgICAgICAgICAgICAgICBh
dXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gp
OwotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbEJvcmRlckJveCA9IGxpbmVCb3gubG9naWNh
bEJvcmRlckJveEZvckF0b21pY0lubGluZUxldmVsQm94KGxheW91dEJveCwgYm94R2VvbWV0cnkp
OwotICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4
LCBsYXlvdXRCb3gsIGxvZ2ljYWxCb3JkZXJCb3gsIGxpbmVSdW4uZXhwYW5zaW9uKCksIHsgfSB9
KTsKLQotICAgICAgICAgICAgICAgIGF1dG8gYm9yZGVyQm94TG9naWNhbFRvcExlZnQgPSBsb2dp
Y2FsQm9yZGVyQm94LnRvcExlZnQoKTsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgaW5s
aW5lIGJveGVzIGFyZSByZWxhdGl2ZSB0byB0aGUgbGluZSBhbmQgdGhlaXIgdG9wIHBvc2l0aW9u
IGNhbiBiZSBuZWdhdGl2ZS4KLSAgICAgICAgICAgICAgICBib3JkZXJCb3hMb2dpY2FsVG9wTGVm
dC5tb3ZlQnkobGluZUJveExvZ2ljYWxSZWN0LnRvcExlZnQoKSk7Ci0gICAgICAgICAgICAgICAg
aWYgKGxheW91dEJveC5pc0luRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgICAgICAgICAg
Ym9yZGVyQm94TG9naWNhbFRvcExlZnQgKz0gZ2VvbWV0cnkuaW5GbG93UG9zaXRpb25lZFBvc2l0
aW9uT2Zmc2V0KGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgICAg
ICAgICAvLyBBdG9taWMgaW5saW5lIGJveGVzIGFyZSBhbGwgc2V0LiBUaGVpciBtYXJnaW4vYm9y
ZGVyL2NvbnRlbnQgYm94IGdlb21ldHJpZXMgYXJlIGFscmVhZHkgY29tcHV0ZWQuIFdlIGp1c3Qg
aGF2ZSB0byBwb3NpdGlvbiB0aGVtIGhlcmUuCi0gICAgICAgICAgICAgICAgYm94R2VvbWV0cnku
c2V0TG9naWNhbFRvcExlZnQodG9MYXlvdXRQb2ludChib3JkZXJCb3hMb2dpY2FsVG9wTGVmdCkp
OwotCi0gICAgICAgICAgICAgICAgYXV0byBib3JkZXJCb3hUb3AgPSBib3JkZXJCb3hMb2dpY2Fs
VG9wTGVmdC55KCk7Ci0gICAgICAgICAgICAgICAgYXV0byBib3JkZXJCb3hCb3R0b20gPSBib3Jk
ZXJCb3hUb3AgKyBib3hHZW9tZXRyeS5ib3JkZXJCb3hIZWlnaHQoKTsKLSAgICAgICAgICAgICAg
ICBlbmNsb3NpbmdUb3BBbmRCb3R0b20udG9wID0gc3RkOjptaW4oZW5jbG9zaW5nVG9wQW5kQm90
dG9tLnRvcCwgYm9yZGVyQm94VG9wKTsKLSAgICAgICAgICAgICAgICBlbmNsb3NpbmdUb3BBbmRC
b3R0b20uYm90dG9tID0gc3RkOjptYXgoZW5jbG9zaW5nVG9wQW5kQm90dG9tLmJvdHRvbSwgYm9y
ZGVyQm94Qm90dG9tKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGlmIChsaW5lUnVuLmlzSW5saW5lQm94U3RhcnQoKSkgewotICAgICAgICAg
ICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxh
eW91dEJveCk7Ci0gICAgICAgICAgICAgICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmVjdCA9IGxp
bmVCb3gubG9naWNhbEJvcmRlckJveEZvcklubGluZUJveChsYXlvdXRCb3gsIGJveEdlb21ldHJ5
KTsKLSAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZVJ1bih7IGxpbmVJbmRl
eCwgbGF5b3V0Qm94LCBpbmxpbmVCb3hMb2dpY2FsUmVjdCwgbGluZVJ1bi5leHBhbnNpb24oKSwg
eyB9IH0pOwotICAgICAgICAgICAgICAgIGlubGluZUJveFN0YXJ0U2V0LmFkZCgmbGF5b3V0Qm94
KTsKLSAgICAgICAgICAgICAgICBlbmNsb3NpbmdUb3BBbmRCb3R0b20udG9wID0gc3RkOjptaW4o
ZW5jbG9zaW5nVG9wQW5kQm90dG9tLnRvcCwgaW5saW5lQm94TG9naWNhbFJlY3QudG9wKCkpOwot
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYg
KGxpbmVSdW4uaXNJbmxpbmVCb3hFbmQoKSkgewotICAgICAgICAgICAgICAgIGlubGluZUJveEVu
ZFNldC5hZGQoJmxheW91dEJveCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbmxpbmVCb3hTdGFy
dFNldC5jb250YWlucygmbGF5b3V0Qm94KSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBbiBp
bmxpbmUgYm94IGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzLiBVc2UgdGhlIFtpbmxpbmUgYm94IGVu
ZF0gc2lnbmFsIHRvIGluY2x1ZGUgaXQgaW4gdGhlIGVuY2xvc2luZyBnZW9tZXRyeQotICAgICAg
ICAgICAgICAgICAgICAvLyBvbmx5IHdoZW4gaXQgc3RhcnRzIGF0IGEgcHJldmlvdXMgbGluZS4K
LSAgICAgICAgICAgICAgICAgICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmVjdCA9IGxpbmVCb3gu
bG9naWNhbEJvcmRlckJveEZvcklubGluZUJveChsYXlvdXRCb3gsIGZvcm1hdHRpbmdTdGF0ZS5i
b3hHZW9tZXRyeShsYXlvdXRCb3gpKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nVG9w
QW5kQm90dG9tLmJvdHRvbSA9IHN0ZDo6bWF4KGVuY2xvc2luZ1RvcEFuZEJvdHRvbS5ib3R0b20s
IGlubGluZUJveExvZ2ljYWxSZWN0LmJvdHRvbSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBU1NFUlQo
bGluZVJ1bi5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkpOwotICAgICAgICB9Ci0gICAgfTsKLSAg
ICBjb25zdHJ1Y3RMaW5lUnVuc0FuZFVwZGF0ZUJveEdlb21ldHJ5KCk7Ci0KLSAgICBhdXRvIHVw
ZGF0ZUJveEdlb21ldHJ5Rm9ySW5saW5lQm94ZXMgPSBbJl0gewotICAgICAgICAvLyBGSVhNRTog
V2UgbWF5IHdhbnQgdG8ga2VlcCBhcm91bmQgYW4gaW5saW5lIGJveCBvbmx5IHNldC4KLSAgICAg
ICAgaWYgKCFsaW5lQm94Lmhhc0lubGluZUJveCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICAvLyBHcmFiIHRoZSBpbmxpbmUgYm94ZXMgKGV2ZW4gdGhvc2UgdGhhdCBkb24ndCBoYXZl
IGFzc29jaWF0ZWQgbGF5b3V0IGJveGVzIG9uIHRoZSBjdXJyZW50IGxpbmUgZHVlIHRvIGxpbmUg
d3JhcHBpbmcpCi0gICAgICAgIC8vIGFuZCB1cGRhdGUgdGhlaXIgZ2VvbWV0cmllcy4KLSAgICAg
ICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVs
Qm94ZXMoKSkgewotICAgICAgICAgICAgaWYgKCFpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgp
KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94
ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7Ci0gICAgICAgICAgICBhdXRvJiBib3hHZW9t
ZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAgICAgICAg
ICAgLy8gSW5saW5lIGJveGVzIG1heSBvciBtYXkgbm90IGJlIHdyYXBwZWQgYW5kIGhhdmUgcnVu
cyBvbiBtdWx0aXBsZSBsaW5lcyAoZS5nLiA8c3Bhbj5maXJzdCBsaW5lPGJyPnNlY29uZCBsaW5l
PGJyPnRoaXJkIGxpbmU8L3NwYW4+KQotICAgICAgICAgICAgYXV0byBpbmxpbmVCb3hCb3JkZXJC
b3ggPSBsaW5lQm94LmxvZ2ljYWxCb3JkZXJCb3hGb3JJbmxpbmVCb3gobGF5b3V0Qm94LCBib3hH
ZW9tZXRyeSk7Ci0gICAgICAgICAgICBhdXRvIGlubGluZUJveFNpemUgPSBMYXlvdXRTaXplIHsg
TGF5b3V0VW5pdDo6ZnJvbUZsb2F0Q2VpbChpbmxpbmVCb3hCb3JkZXJCb3gud2lkdGgoKSksIExh
eW91dFVuaXQ6OmZyb21GbG9hdENlaWwoaW5saW5lQm94Qm9yZGVyQm94LmhlaWdodCgpKSB9Owot
ICAgICAgICAgICAgYXV0byBsb2dpY2FsUmVjdCA9IFJlY3QgeyBMYXlvdXRQb2ludCB7IGlubGlu
ZUJveEJvcmRlckJveC50b3BMZWZ0KCkgfSwgaW5saW5lQm94U2l6ZSB9OwotICAgICAgICAgICAg
bG9naWNhbFJlY3QubW92ZUJ5KExheW91dFBvaW50IHsgbGluZUJveExvZ2ljYWxSZWN0LnRvcExl
ZnQoKSB9KTsKLSAgICAgICAgICAgIGlmIChpbmxpbmVCb3hTdGFydFNldC5jb250YWlucygmbGF5
b3V0Qm94KSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaW5saW5lIGJveCBzaG93ZWQgdXAg
Zmlyc3Qgb24gdGhpcyBsaW5lLgotICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldExvZ2lj
YWxUb3BMZWZ0KGxvZ2ljYWxSZWN0LnRvcExlZnQoKSk7Ci0gICAgICAgICAgICAgICAgYXV0byBj
b250ZW50Qm94SGVpZ2h0ID0gbG9naWNhbFJlY3QuaGVpZ2h0KCkgLSAoYm94R2VvbWV0cnkudmVy
dGljYWxCb3JkZXIoKSArIGJveEdlb21ldHJ5LnZlcnRpY2FsUGFkZGluZygpLnZhbHVlT3IoMF9s
dSkpOwotICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoY29u
dGVudEJveEhlaWdodCk7Ci0gICAgICAgICAgICAgICAgYXV0byBjb250ZW50Qm94V2lkdGggPSBs
b2dpY2FsUmVjdC53aWR0aCgpIC0gKGJveEdlb21ldHJ5Lmhvcml6b250YWxCb3JkZXIoKSArIGJv
eEdlb21ldHJ5Lmhvcml6b250YWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KSk7Ci0gICAgICAgICAg
ICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGNvbnRlbnRCb3hXaWR0aCk7Ci0g
ICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBN
aWRkbGUgb3IgZW5kIG9mIHRoZSBpbmxpbmUgYm94LiBMZXQncyBzdHJldGNoIHRoZSBib3ggYXMg
bmVlZGVkLgotICAgICAgICAgICAgYXV0byBlbmNsb3NpbmdCb3JkZXJCb3hSZWN0ID0gQm94R2Vv
bWV0cnk6OmJvcmRlckJveFJlY3QoYm94R2VvbWV0cnkpOwotICAgICAgICAgICAgZW5jbG9zaW5n
Qm9yZGVyQm94UmVjdC5leHBhbmRUb0NvbnRhaW4obG9naWNhbFJlY3QpOwotICAgICAgICAgICAg
Ym94R2VvbWV0cnkuc2V0TG9naWNhbExlZnQoZW5jbG9zaW5nQm9yZGVyQm94UmVjdC5sZWZ0KCkp
OwotCi0gICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGVuY2xvc2lu
Z0JvcmRlckJveFJlY3QuaGVpZ2h0KCkgLSAoYm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSAr
IGJveEdlb21ldHJ5LnZlcnRpY2FsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpKTsKLSAgICAgICAg
ICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChlbmNsb3NpbmdCb3JkZXJCb3hSZWN0
LndpZHRoKCkgLSAoYm94R2VvbWV0cnkuaG9yaXpvbnRhbEJvcmRlcigpICsgYm94R2VvbWV0cnku
aG9yaXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKSk7Ci0gICAgICAgIH0KLSAgICB9Owot
ICAgIHVwZGF0ZUJveEdlb21ldHJ5Rm9ySW5saW5lQm94ZXMoKTsKLQotICAgIGF1dG8gY29uc3Ry
dWN0TGluZUdlb21ldHJ5ID0gWyZdIHsKLSAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmUo
eyBsaW5lQm94TG9naWNhbFJlY3QsIGVuY2xvc2luZ1RvcEFuZEJvdHRvbSwgbGluZUJveC5hbGln
bm1lbnRCYXNlbGluZSgpLCByb290SW5saW5lQm94TG9naWNhbFJlY3QubGVmdCgpLCBsaW5lQ29u
dGVudC5jb250ZW50TG9naWNhbFdpZHRoIH0pOwotICAgIH07Ci0gICAgY29uc3RydWN0TGluZUdl
b21ldHJ5KCk7Ci0KLSAgICByZXR1cm4gbGluZUJveExvZ2ljYWxSZWN0OwotfQotCi12b2lkIElu
bGluZUZvcm1hdHRpbmdDb250ZXh0OjppbnZhbGlkYXRlRm9ybWF0dGluZ1N0YXRlKGNvbnN0IElu
dmFsaWRhdGlvblN0YXRlJikKLXsKLSAgICAvLyBGaW5kIG91dCB3aGF0IHdlIG5lZWQgdG8gaW52
YWxpZGF0ZS4gVGhpcyBpcyB3aGVyZSB3ZSBhZGQgc29tZSBzbWFydHMgdG8gZG8gcGFydGlhbCBs
aW5lIGxheW91dC4KLSAgICAvLyBGb3Igbm93IGxldCdzIGp1c3QgY2xlYXIgdGhlIHJ1bnMuCi0g
ICAgZm9ybWF0dGluZ1N0YXRlKCkuY2xlYXJMaW5lQW5kUnVucygpOwotICAgIC8vIEZJWE1FOiBU
aGlzIGlzIGFsc28gd2hlcmUgd2Ugd291bGQgZGVsZXRlIGlubGluZSBpdGVtcyBpZiB0aGVpciBj
b250ZW50IGNoYW5nZWQuCi19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5o
IGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3ZWM5NzIzN2MxZTg4
ZDc4ODYwMjY3YTE4MDdlMjA0OGFmNDMyZS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9J
bmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAK
LS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElO
R19DT05URVhUKQotCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJJ
bmxpbmVMaW5lQnVpbGRlci5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLQotbmFtZXNw
YWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIElubGluZUZvcm1hdHRp
bmdTdGF0ZTsKLWNsYXNzIEludmFsaWRhdGlvblN0YXRlOwotY2xhc3MgTGluZUJveDsKLQotLy8g
VGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBsYXlvdXQgbG9naWMgZm9yIGlubGluZSBmb3JtYXR0
aW5nIGNvbnRleHRzLgotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIyL3Zpc3VyZW4uaHRt
bCNpbmxpbmUtZm9ybWF0dGluZwotY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQgZmluYWwg
OiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQgewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQo
SW5saW5lRm9ybWF0dGluZ0NvbnRleHQpOwotcHVibGljOgotICAgIElubGluZUZvcm1hdHRpbmdD
b250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBJbmxpbmVG
b3JtYXR0aW5nU3RhdGUmKTsKLSAgICB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0
aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSBvdmVycmlkZTsK
LSAgICBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAg
ICBjbGFzcyBRdWlya3MgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyB7Ci0gICAg
cHVibGljOgotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGluaXRpYWxMaW5lSGVpZ2h0KCkgY29u
c3Q7Ci0gICAgICAgIGJvb2wgaGFzU29mdFdyYXBPcHBvcnR1bml0eUF0SW1hZ2UoKSBjb25zdDsK
LSAgICAgICAgYm9vbCBpbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGNvbnN0IExpbmVCb3g6
OklubGluZUxldmVsQm94JiwgY29uc3QgTGluZUJveCYpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToK
LSAgICAgICAgZnJpZW5kIGNsYXNzIElubGluZUZvcm1hdHRpbmdDb250ZXh0OwotICAgICAgICBR
dWlya3MoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmKTsKLQotICAgICAgICBjb25zdCBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVy
biBkb3duY2FzdDxJbmxpbmVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6OlF1
aXJrczo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KLQotICAgIH07Ci0gICAgSW5saW5lRm9ybWF0
dGluZ0NvbnRleHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMp
OyB9Ci0KLSAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgp
IGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PElubGluZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGlu
Z0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQotICAgIElubGluZUZvcm1hdHRpbmdTdGF0
ZSYgZm9ybWF0dGluZ1N0YXRlKCkgeyByZXR1cm4gZG93bmNhc3Q8SW5saW5lRm9ybWF0dGluZ1N0
YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9Ci0KLSAgICB2b2lk
IGxpbmVMYXlvdXRGb3JJbnRlcmdyYXRpb24oSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25z
dHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsKLQotcHJpdmF0ZToKLSAgICBJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpIG92ZXJyaWRl
OwotCi0gICAgY2xhc3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIExpbmVCb3ggbGluZUJveEZvckxpbmVDb250ZW50
KGNvbnN0IExpbmVCdWlsZGVyOjpMaW5lQ29udGVudCYpOwotICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxUb3BGb3JOZXh0TGluZShjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQm
LCBJbmxpbmVMYXlvdXRVbml0IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIGNvbnN0IEZsb2F0
aW5nQ29udGV4dCYpIGNvbnN0OwotCi0gICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5s
aW5lQmxvY2tDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpIGNvbnN0Owot
ICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gaW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRN
YXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3Zl
cnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVu
ZCBjbGFzcyBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKLSAgICAgICAgR2VvbWV0cnkoY29uc3Qg
SW5saW5lRm9ybWF0dGluZ0NvbnRleHQmKTsKLQotICAgICAgICBjb25zdCBJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpmb3Jt
YXR0aW5nQ29udGV4dCgpKTsgfQotCi0gICAgfTsKLSAgICBJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBHZW9tZXRyeSgqdGhpcyk7IH0K
LQotICAgIHZvaWQgbGluZUxheW91dChJbmxpbmVJdGVtcyYsIExpbmVCdWlsZGVyOjpJbmxpbmVJ
dGVtUmFuZ2UsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOwotCi0gICAgdm9p
ZCBjb21wdXRlSW50cmluc2ljV2lkdGhGb3JGb3JtYXR0aW5nUm9vdChjb25zdCBCb3gmKTsKLSAg
ICBJbmxpbmVMYXlvdXRVbml0IGNvbXB1dGVkSW50cmluc2ljV2lkdGhGb3JDb25zdHJhaW50KElu
bGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgpIGNvbnN0OwotCi0gICAgdm9pZCBjb21wdXRl
SG9yaXpvbnRhbE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMm
KTsKLSAgICB2b2lkIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJik7Ci0gICAgdm9pZCBjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29u
c3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7Ci0KLSAgICB2b2lkIGNvbGxl
Y3RJbmxpbmVDb250ZW50SWZOZWVkZWQoKTsKLSAgICBJbmxpbmVSZWN0IGNvbXB1dGVHZW9tZXRy
eUZvckxpbmVDb250ZW50KGNvbnN0IExpbmVCdWlsZGVyOjpMaW5lQ29udGVudCYsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYpOwotICAgIHZvaWQgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0
ZShjb25zdCBJbnZhbGlkYXRpb25TdGF0ZSYpOwotfTsKLQotaW5saW5lIElubGluZUZvcm1hdHRp
bmdDb250ZXh0OjpHZW9tZXRyeTo6R2VvbWV0cnkoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQmIGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5KGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQotewotfQotCi1pbmxpbmUgSW5saW5lRm9y
bWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6UXVpcmtzKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250
ZXh0JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICA6IEZvcm1hdHRpbmdDb250ZXh0OjpR
dWlya3MoaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCi17Ci19Ci0KLX0KLX0KLQotU1BFQ0lBTEla
RV9UWVBFX1RSQUlUU19MQVlPVVRfRk9STUFUVElOR19DT05URVhUKElubGluZUZvcm1hdHRpbmdD
b250ZXh0LCBpc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHRHZW9tZXRyeS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0
dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggYjI0ZTc4ODMzMzgwZmI0Y2MyMDUxMzU5YTM2YjUwNDk1NDliOWFkMC4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dEdlb21l
dHJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0
IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0g
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0g
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lu
Y2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCi0K
LSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZsb2F0
aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAi
SW5saW5lTGluZUJveC5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91
dENvbnRhaW5lckJveC5oIgotI2luY2x1ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCi0jaW5jbHVk
ZSAiTGVuZ3RoRnVuY3Rpb25zLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1jbGFzcyBMaW5lQm94QnVpbGRlciB7Ci1wdWJsaWM6Ci0gICAgTGluZUJveEJ1
aWxkZXIoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmKTsKLSAgICBMaW5lQm94IGJ1aWxk
KGNvbnN0IExpbmVCdWlsZGVyOjpMaW5lQ29udGVudCYpOwotCi1wcml2YXRlOgotICAgIHN0cnVj
dCBTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQgewotICAgICAgICBTaW1wbGlmaWVkVmVydGlj
YWxBbGlnbm1lbnQoY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gp
OwotCi0gICAgICAgIHN0YXRpYyBib29sIGNhblVzZVNpbXBsaWZpZWRBbGlnbm1lbnQoY29uc3Qg
TGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gsIGNvbnN0IExpbmVCb3g6Oklu
bGluZUxldmVsQm94JiwgT3B0aW9uYWw8Y29uc3QgQm94R2VvbWV0cnk+IGlubGluZUxldmVsQm94
R2VvbWV0cnkpOwotCi0gICAgICAgIHZvaWQgYWxpZ24oTGluZUJveDo6SW5saW5lTGV2ZWxCb3gm
KTsKLQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHJvb3RJbmxpbmVCb3hMb2dpY2FsVG9wKCkg
Y29uc3QgeyByZXR1cm4gbV9yb290SW5saW5lQm94TG9naWNhbFRvcDsgfQotICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IGxpbmVCb3hIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hMb2dp
Y2FsQm90dG9tIC0gbV9saW5lQm94TG9naWNhbFRvcDsgfQotCi0gICAgICAgIHZvaWQgc2V0RW5h
YmxlZChib29sIGVuYWJsZWQpIHsgbV9pc0VuYWJsZWQgPSBlbmFibGVkOyB9Ci0gICAgICAgIGJv
b2wgaXNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbV9pc0VuYWJsZWQ7IH0KLQotICAgIHByaXZh
dGU6Ci0gICAgICAgIHZvaWQgYWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94Jik7
Ci0KLSAgICAgICAgY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIG1fcm9vdElubGluZUJv
eDsKLSAgICAgICAgYm9vbCBtX2lzRW5hYmxlZCB7IHRydWUgfTsKLSAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCBtX2xpbmVCb3hMb2dpY2FsVG9wIHsgMCB9OwotICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IG1fbGluZUJveExvZ2ljYWxCb3R0b20geyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVu
aXQgbV9yb290SW5saW5lQm94TG9naWNhbFRvcCB7IDAgfTsKLSAgICB9OwotCi0gICAgdm9pZCBz
ZXRWZXJ0aWNhbEdlb21ldHJ5Rm9ySW5saW5lQm94KExpbmVCb3g6OklubGluZUxldmVsQm94Jikg
Y29uc3Q7Ci0gICAgdm9pZCBjb25zdHJ1Y3RBbmRBbGlnbklubGluZUxldmVsQm94ZXMoTGluZUJv
eCYsIGNvbnN0IExpbmU6OlJ1bkxpc3QmKTsKLSAgICB2b2lkIGNvbXB1dGVMaW5lQm94SGVpZ2h0
QW5kQWxpZ25JbmxpbmVMZXZlbEJveGVzVmVydGljYWxseShMaW5lQm94Jik7Ci0KLSAgICBjb25z
dCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJl
dHVybiBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0OyB9Ci0gICAgY29uc3QgQm94JiByb290Qm94
KCkgY29uc3QgeyByZXR1cm4gZm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCk7IH0KLSAgICBMYXlv
dXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgp
LmxheW91dFN0YXRlKCk7IH0KLQotICAgIGJvb2wgaXNSb290TGF5b3V0Qm94KGNvbnN0IENvbnRh
aW5lckJveCYgY29udGFpbmVyQm94KSBjb25zdCB7IHJldHVybiAmY29udGFpbmVyQm94ID09ICZy
b290Qm94KCk7IH0KLQotcHJpdmF0ZToKLSAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dCYgbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKLX07Ci0KLXN0cnVjdCBIYW5naW5nVHJhaWxp
bmdXaGl0ZXNwYWNlQ29udGVudCB7Ci1wdWJsaWM6Ci0gICAgdm9pZCByZXNldCgpOwotCi0gICAg
SW5saW5lTGF5b3V0VW5pdCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fd2lkdGg7IH0KLSAgICBi
b29sIGlzQ29uZGl0aW9uYWwoKSBjb25zdCB7IHJldHVybiBtX2lzQ29uZGl0aW9uYWw7IH0KLQot
ICAgIHZvaWQgc2V0SXNDb25kaXRpb25hbCgpIHsgbV9pc0NvbmRpdGlvbmFsID0gdHJ1ZTsgfQot
ICAgIHZvaWQgZXhwYW5kKElubGluZUxheW91dFVuaXQgd2lkdGgpIHsgbV93aWR0aCArPSB3aWR0
aDsgfQotCi1wcml2YXRlOgotICAgIGJvb2wgbV9pc0NvbmRpdGlvbmFsIHsgZmFsc2UgfTsKLSAg
ICBJbmxpbmVMYXlvdXRVbml0IG1fd2lkdGggeyAwIH07Ci19OwotCi12b2lkIEhhbmdpbmdUcmFp
bGluZ1doaXRlc3BhY2VDb250ZW50OjpyZXNldCgpCi17Ci0gICAgbV9pc0NvbmRpdGlvbmFsID0g
ZmFsc2U7Ci0gICAgbV93aWR0aCA9ICAwOwotfQotCi1zdGF0aWMgSGFuZ2luZ1RyYWlsaW5nV2hp
dGVzcGFjZUNvbnRlbnQgY29sbGVjdEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50KGNv
bnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnMsIGJvb2wgaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50
KQotewotICAgIGF1dG8gaGFuZ2luZ0NvbnRlbnQgPSBIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNl
Q29udGVudCB7IH07Ci0gICAgaWYgKGlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudCkKLSAgICAg
ICAgaGFuZ2luZ0NvbnRlbnQuc2V0SXNDb25kaXRpb25hbCgpOwotICAgIGZvciAoYXV0byYgcnVu
IDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShydW5zKSkgewotICAgICAgICBpZiAocnVuLmlzSW5s
aW5lQm94U3RhcnQoKSB8fCBydW4uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAgICAgICAgIGNvbnRp
bnVlOwotICAgICAgICBpZiAocnVuLmlzTGluZUJyZWFrKCkpIHsKLSAgICAgICAgICAgIGhhbmdp
bmdDb250ZW50LnNldElzQ29uZGl0aW9uYWwoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICB9Ci0gICAgICAgIGlmICghcnVuLmhhc1RyYWlsaW5nV2hpdGVzcGFjZSgpKQotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBwcmVzZXJ2ZWQgb3Ig
aHVuZyB3aGl0ZXNwYWNlLgotICAgICAgICBpZiAocnVuLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9
IFdoaXRlU3BhY2U6OlByZVdyYXApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLy8gVGhp
cyBpcyBlaXRoZXIgYSBub3JtYWwgb3IgY29uZGl0aW9uYWxseSBoYW5naW5nIHRyYWlsaW5nIHdo
aXRlc3BhY2UuCi0gICAgICAgIGhhbmdpbmdDb250ZW50LmV4cGFuZChydW4udHJhaWxpbmdXaGl0
ZXNwYWNlV2lkdGgoKSk7Ci0gICAgfQotICAgIHJldHVybiBoYW5naW5nQ29udGVudDsKLX0KLQot
c3RhdGljIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGhvcml6b250YWxBbGlnbm1lbnRPZmZz
ZXQoY29uc3QgTGluZTo6UnVuTGlzdCYgcnVucywgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24sIElu
bGluZUxheW91dFVuaXQgbGluZUxvZ2ljYWxXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50
TG9naWNhbFdpZHRoLCBib29sIGlzTGFzdExpbmUpCi17Ci0gICAgYXV0byBhdmFpbGFibGVXaWR0
aCA9IGxpbmVMb2dpY2FsV2lkdGggLSBjb250ZW50TG9naWNhbFdpZHRoOwotICAgIGF1dG8gaGFu
Z2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQgPSBjb2xsZWN0SGFuZ2luZ1RyYWlsaW5nV2hp
dGVzcGFjZUNvbnRlbnQocnVucywgaXNMYXN0TGluZSk7Ci0gICAgYXZhaWxhYmxlV2lkdGggKz0g
aGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQud2lkdGgoKTsKLSAgICBpZiAoYXZhaWxh
YmxlV2lkdGggPD0gMCkKLSAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgIGF1dG8gY29tcHV0ZWRI
b3Jpem9udGFsQWxpZ25tZW50ID0gWyZdIHsKLSAgICAgICAgaWYgKHRleHRBbGlnbiAhPSBUZXh0
QWxpZ25Nb2RlOjpKdXN0aWZ5KQotICAgICAgICAgICAgcmV0dXJuIHRleHRBbGlnbjsKLSAgICAg
ICAgLy8gVGV4dCBpcyBqdXN0aWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBtZXRob2Qgc3BlY2lmaWVk
IGJ5IHRoZSB0ZXh0LWp1c3RpZnkgcHJvcGVydHksCi0gICAgICAgIC8vIGluIG9yZGVyIHRvIGV4
YWN0bHkgZmlsbCB0aGUgbGluZSBib3guIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRl
eHQtYWxpZ24tbGFzdCwKLSAgICAgICAgLy8gdGhlIGxhc3QgbGluZSBiZWZvcmUgYSBmb3JjZWQg
YnJlYWsgb3IgdGhlIGVuZCBvZiB0aGUgYmxvY2sgaXMgc3RhcnQtYWxpZ25lZC4KLSAgICAgICAg
aWYgKGlzTGFzdExpbmUgfHwgKCFydW5zLmlzRW1wdHkoKSAmJiBydW5zLmxhc3QoKS5pc0xpbmVC
cmVhaygpKSkKLSAgICAgICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpTdGFydDsKLSAgICAg
ICAgcmV0dXJuIFRleHRBbGlnbk1vZGU6Okp1c3RpZnk7Ci0gICAgfTsKLQotICAgIHN3aXRjaCAo
Y29tcHV0ZWRIb3Jpem9udGFsQWxpZ25tZW50KCkpIHsKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6
OkxlZnQ6Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRMZWZ0OgotICAgIGNhc2UgVGV4
dEFsaWduTW9kZTo6U3RhcnQ6Ci0gICAgICAgIHJldHVybiB7IH07Ci0gICAgY2FzZSBUZXh0QWxp
Z25Nb2RlOjpSaWdodDoKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0OgotICAg
IGNhc2UgVGV4dEFsaWduTW9kZTo6RW5kOgotICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7
Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpDZW50ZXI6Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2Rl
OjpXZWJLaXRDZW50ZXI6Ci0gICAgICAgIHJldHVybiBhdmFpbGFibGVXaWR0aCAvIDI7Ci0gICAg
Y2FzZSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5OgotICAgICAgICAvLyBUZXh0QWxpZ25Nb2RlOjpK
dXN0aWZ5IGlzIGEgcnVuIGFsaWdubWVudCAoYW5kIHdlIG9ubHkgZG8gaW5saW5lIGJveCBhbGln
bm1lbnQgaGVyZSkKLSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICBkZWZhdWx0OgotICAgICAgICBB
U1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOwotICAgICAgICByZXR1cm4geyB9OwotICAgIH0K
LSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4geyB9OwotfQotCi1MaW5lQm94
QnVpbGRlcjo6TGluZUJveEJ1aWxkZXIoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlu
bGluZUZvcm1hdHRpbmdDb250ZXh0KQotICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChp
bmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLXsKLX0KLQotTGluZUJveCBMaW5lQm94QnVpbGRlcjo6
YnVpbGQoY29uc3QgTGluZUJ1aWxkZXI6OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCkKLXsKLSAg
ICBhdXRvJiBydW5zID0gbGluZUNvbnRlbnQucnVuczsKLSAgICBhdXRvIGxpbmVMb2dpY2FsV2lk
dGggPSBsaW5lQ29udGVudC5saW5lTG9naWNhbFdpZHRoOwotICAgIGF1dG8gY29udGVudExvZ2lj
YWxXaWR0aCA9IGxpbmVDb250ZW50LmNvbnRlbnRMb2dpY2FsV2lkdGg7Ci0gICAgYXV0byBob3Jp
em9udGFsQWxpZ25tZW50T2Zmc2V0ID0gTGF5b3V0Ojpob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0
KHJ1bnMsIHJvb3RCb3goKS5zdHlsZSgpLnRleHRBbGlnbigpLCBsaW5lTG9naWNhbFdpZHRoLCBj
b250ZW50TG9naWNhbFdpZHRoLCBsaW5lQ29udGVudC5pc0xhc3RMaW5lV2l0aElubGluZUNvbnRl
bnQpOwotICAgIGF1dG8gbGluZUJveCA9IExpbmVCb3ggeyByb290Qm94KCksIGxpbmVDb250ZW50
LmxvZ2ljYWxUb3BMZWZ0LCBsaW5lTG9naWNhbFdpZHRoLCBob3Jpem9udGFsQWxpZ25tZW50T2Zm
c2V0LnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCB7IH0pLCBjb250ZW50TG9naWNhbFdpZHRoLCBs
aW5lQ29udGVudC5ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQgfTsKLSAgICBjb25zdHJ1
Y3RBbmRBbGlnbklubGluZUxldmVsQm94ZXMobGluZUJveCwgcnVucyk7Ci0gICAgcmV0dXJuIGxp
bmVCb3g7Ci19Ci0KLXZvaWQgTGluZUJveEJ1aWxkZXI6OnNldFZlcnRpY2FsR2VvbWV0cnlGb3JJ
bmxpbmVCb3goTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94KSBjb25zdAot
ewotICAgIEFTU0VSVChpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpIHx8IGlubGluZUxldmVs
Qm94LmlzTGluZUJyZWFrQm94KCkpOwotICAgIGF1dG8mIGZvbnRNZXRyaWNzID0gaW5saW5lTGV2
ZWxCb3guc3R5bGUoKS5mb250TWV0cmljcygpOwotICAgIElubGluZUxheW91dFVuaXQgYXNjZW50
ID0gZm9udE1ldHJpY3MuYXNjZW50KCk7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBkZXNjZW50ID0g
Zm9udE1ldHJpY3MuZGVzY2VudCgpOwotICAgIGF1dG8gbG9naWNhbEhlaWdodCA9IGFzY2VudCAr
IGRlc2NlbnQ7Ci0gICAgLy8gV2UgbmVlZCBmbG9vci9jZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlv
dXQgaW50ZWdyYWwgcG9zaXRpb25pbmcuCi0gICAgaW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUo
Zmxvb3JmKGFzY2VudCkpOwotICAgIGlubGluZUxldmVsQm94LnNldERlc2NlbnQoY2VpbChkZXNj
ZW50KSk7Ci0gICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0
KTsKLQotICAgIC8vIEZJWE1FOiBBZGp1c3QgbGF5b3V0IGJvdW5kcyB3aXRoIGZhbGxiYWNrIGZv
bnQgd2hlbiBhcHBsaWNhYmxlLgotICAgIGF1dG8mIHN0eWxlID0gaW5saW5lTGV2ZWxCb3gubGF5
b3V0Qm94KCkuc3R5bGUoKTsKLSAgICBhdXRvIGxpbmVIZWlnaHQgPSBzdHlsZS5saW5lSGVpZ2h0
KCk7Ci0gICAgaWYgKGxpbmVIZWlnaHQuaXNOZWdhdGl2ZSgpKSB7Ci0gICAgICAgIC8vIElmIGxp
bmUtaGVpZ2h0IGNvbXB1dGVzIHRvIG5vcm1hbCBhbmQgZWl0aGVyIHRleHQtZWRnZSBpcyBsZWFk
aW5nIG9yIHRoaXMgaXMgdGhlIHJvb3QgaW5saW5lIGJveCwKLSAgICAgICAgLy8gdGhlIGZvbnTi
gJlzIGxpbmUgZ2FwIG1ldHJpYyBtYXkgYWxzbyBiZSBpbmNvcnBvcmF0ZWQgaW50byBBIGFuZCBE
IGJ5IGFkZGluZyBoYWxmIHRvIGVhY2ggc2lkZSBhcyBoYWxmLWxlYWRpbmcuCi0gICAgICAgIC8v
IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2lubGluZS1oZWlnaHQKLSAgICAg
ICAgLy8gU2luY2UgdGV4dC1lZGdlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IGFuZCB0aGUgaW5pdGlh
bCB2YWx1ZSBpcyBsZWFkaW5nLCB3ZSBzaG91bGQganVzdCBhcHBseSBpdCB0bwotICAgICAgICAv
LyBhbGwgaW5saW5lIGJveGVzLgotICAgICAgICBhdXRvIGhhbGZMaW5lR2FwID0gKGZvbnRNZXRy
aWNzLmxpbmVTcGFjaW5nKCkgLSBsb2dpY2FsSGVpZ2h0KSAvIDI7Ci0gICAgICAgIGFzY2VudCAr
PSBoYWxmTGluZUdhcDsKLSAgICAgICAgZGVzY2VudCArPSBoYWxmTGluZUdhcDsKLSAgICB9IGVs
c2UgewotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxpbmVIZWlnaHQgPSBzdHlsZS5jb21wdXRl
ZExpbmVIZWlnaHQoKTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBoYWxmTGVhZGluZyA9IChs
aW5lSGVpZ2h0IC0gKGFzY2VudCArIGRlc2NlbnQpKSAvIDI7Ci0gICAgICAgIGFzY2VudCArPSBo
YWxmTGVhZGluZzsKLSAgICAgICAgZGVzY2VudCArPSBoYWxmTGVhZGluZzsKLSAgICB9Ci0gICAg
Ly8gV2UgbmVlZCBmbG9vci9jZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlvdXQgaW50ZWdyYWwgcG9z
aXRpb25pbmcuCi0gICAgaW5saW5lTGV2ZWxCb3guc2V0TGF5b3V0Qm91bmRzKExpbmVCb3g6Oklu
bGluZUxldmVsQm94OjpMYXlvdXRCb3VuZHMgeyBmbG9vcmYoYXNjZW50KSwgY2VpbChkZXNjZW50
KSB9KTsKLX0KLQotdm9pZCBMaW5lQm94QnVpbGRlcjo6Y29uc3RydWN0QW5kQWxpZ25JbmxpbmVM
ZXZlbEJveGVzKExpbmVCb3gmIGxpbmVCb3gsIGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnMpCi17
Ci0gICAgYXV0byYgcm9vdElubGluZUJveCA9IGxpbmVCb3gucm9vdElubGluZUJveCgpOwotICAg
IHNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3gocm9vdElubGluZUJveCk7Ci0KLSAgICBh
dXRvIHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudCA9IFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdu
bWVudCB7IHJvb3RJbmxpbmVCb3ggfTsKLSAgICAvLyBGSVhNRTogQWRkIGZhc3QgcGF0aCBzdXBw
b3J0IGZvciBsaW5lLWhlaWdodCBjb250ZW50LgotICAgIHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdu
bWVudC5zZXRFbmFibGVkKGxheW91dFN0YXRlKCkuaW5TdGFuZGFyZHNNb2RlKCkgJiYgcm9vdEJv
eCgpLnN0eWxlKCkubGluZUhlaWdodCgpLmlzTmVnYXRpdmUoKSk7Ci0KLSAgICBhdXRvIHNpbXBs
aWZpZWRBbGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUgPSBbJl0oYXV0byYgaW5saW5lTGV2ZWxC
b3gsIE9wdGlvbmFsPGNvbnN0IEJveEdlb21ldHJ5PiBib3hHZW9tZXRyeSkgewotICAgICAgICBp
ZiAoIXNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5pc0VuYWJsZWQoKSkKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgaWYgKCFTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OmNhblVz
ZVNpbXBsaWZpZWRBbGlnbm1lbnQocm9vdElubGluZUJveCwgaW5saW5lTGV2ZWxCb3gsIGJveEdl
b21ldHJ5KSkgewotICAgICAgICAgICAgc2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50LnNldEVu
YWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNp
bXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5hbGlnbihpbmxpbmVMZXZlbEJveCk7Ci0gICAgfTsK
LQotICAgIGF1dG8gY3JlYXRlV3JhcHBlZElubGluZUJveGVzID0gWyZdIHsKLSAgICAgICAgaWYg
KHJ1bnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvLyBBbiBpbmxp
bmUgYm94IG1heSBub3QgbmVjZXNzYXJpbHkgc3RhcnQgb24gdGhlIGN1cnJlbnQgbGluZToKLSAg
ICAgICAgLy8gPHNwYW4gaWQ9b3V0ZXI+bGluZSBicmVhazxicj50aGlzIGNvbnRlbnQncyBwYXJl
bnQgaW5saW5lIGJveCgnb3V0ZXInKSA8c3BhbiBpZD1pbm5lcj5zdGFydHMgb24gdGhlIHByZXZp
b3VzIGxpbmU8L3NwYW4+PC9zcGFuPgotICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0
aGF0IHRoZXJlJ3MgYW4gTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggZm9yIGV2ZXJ5IGlubGluZSBi
b3ggdGhhdCdzIHByZXNlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAgLy8gSW4gbmVz
dGluZyBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIExpbmVCb3g6OklubGluZUxldmVsQm94ZXMgZm9y
IHRoZSBpbmxpbmUgYm94IGFuY2VzdG9ycy4KLSAgICAgICAgLy8gV2Ugb25seSBoYXZlIHRvIGRv
IGl0IG9uIHRoZSBmaXJzdCBydW4gYXMgYW55IHN1YnNlcXVlbnQgaW5saW5lIGNvbnRlbnQgaXMg
ZWl0aGVyIGF0IHRoZSBzYW1lL2hpZ2hlciBuZXN0aW5nIGxldmVsIG9yCi0gICAgICAgIC8vIG5l
c3RlZCB3aXRoIGEgW2lubGluZSBib3ggc3RhcnRdIHJ1bi4KLSAgICAgICAgYXV0byYgZmlyc3RS
dW4gPSBydW5zWzBdOwotICAgICAgICBhdXRvJiBmaXJzdFJ1blBhcmVudExheW91dEJveCA9IGZp
cnN0UnVuLmxheW91dEJveCgpLnBhcmVudCgpOwotICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGlz
IHRoZSBmb3JtYXR0aW5nIHJvb3QsIHdlIGNhbiBzdG9wIGhlcmUuIFRoaXMgaXMgcm9vdCBpbmxp
bmUgYm94IGNvbnRlbnQsIHRoZXJlJ3Mgbm8gbmVzdGluZyBpbmxpbmUgYm94IGZyb20gdGhlIHBy
ZXZpb3VzIGxpbmUocykKLSAgICAgICAgLy8gdW5sZXNzIHRoZSBpbmxpbmUgYm94IGNsb3Npbmcg
aXMgZm9yY2VkIG92ZXIgdG8gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAgLy8gZS5nLgotICAg
ICAgICAvLyA8c3Bhbj5ub3JtYWxseSB0aGUgaW5saW5lIGJveCBjbG9zaW5nIGZvcm1zIGEgY29u
dGludW91cyBjb250ZW50PC9zcGFuPgotICAgICAgICAvLyA8c3Bhbj51bmxlc3MgaXQncyBmb3Jj
ZWQgdG8gdGhlIG5leHQgbGluZTxicj48L3NwYW4+Ci0gICAgICAgIGF1dG8gZmlyc3RSdW5OZWVk
c0lubGluZUJveCA9IGZpcnN0UnVuLmlzSW5saW5lQm94RW5kKCk7Ci0gICAgICAgIGlmICghZmly
c3RSdW5OZWVkc0lubGluZUJveCAmJiBpc1Jvb3RMYXlvdXRCb3goZmlyc3RSdW5QYXJlbnRMYXlv
dXRCb3gpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBWZWN0b3I8Y29uc3QgQm94Kj4g
bGF5b3V0Qm94ZXNXaXRob3V0SW5saW5lQm94ZXM7Ci0gICAgICAgIGlmIChmaXJzdFJ1bk5lZWRz
SW5saW5lQm94KQotICAgICAgICAgICAgbGF5b3V0Qm94ZXNXaXRob3V0SW5saW5lQm94ZXMuYXBw
ZW5kKCZmaXJzdFJ1bi5sYXlvdXRCb3goKSk7Ci0gICAgICAgIGF1dG8qIGFuY2VzdG9yID0gJmZp
cnN0UnVuUGFyZW50TGF5b3V0Qm94OwotICAgICAgICB3aGlsZSAoIWlzUm9vdExheW91dEJveCgq
YW5jZXN0b3IpKSB7Ci0gICAgICAgICAgICBsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVCb3hlcy5h
cHBlbmQoYW5jZXN0b3IpOwotICAgICAgICAgICAgYW5jZXN0b3IgPSAmYW5jZXN0b3ItPnBhcmVu
dCgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgbWlzc2luZyBMaW5lQm94
OjpJbmxpbmVCb3hlcyBzdGFydGluZyB3aXRoIHRoZSB0b3Btb3N0IGxheW91dCBib3guCi0gICAg
ICAgIGZvciAoYXV0byogbGF5b3V0Qm94IDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShsYXlvdXRC
b3hlc1dpdGhvdXRJbmxpbmVCb3hlcykpIHsKLSAgICAgICAgICAgIGF1dG8gaW5saW5lQm94ID0g
TGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUlubGluZUJveCgqbGF5b3V0Qm94LCByb290
SW5saW5lQm94LmxvZ2ljYWxMZWZ0KCksIGxpbmVCb3guY29udGVudExvZ2ljYWxXaWR0aCgpKTsK
LSAgICAgICAgICAgIHNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3goaW5saW5lQm94KTsK
LSAgICAgICAgICAgIHNpbXBsaWZpZWRBbGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUoaW5saW5l
Qm94LCB7IH0pOwotICAgICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChXVEZNb3Zl
KGlubGluZUJveCkpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBjcmVhdGVXcmFwcGVkSW5saW5l
Qm94ZXMoKTsKLQotICAgIGF1dG8gbGluZUhhc0NvbnRlbnQgPSBmYWxzZTsKLSAgICBmb3IgKGF1
dG8mIHJ1biA6IHJ1bnMpIHsKLSAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gcnVuLmxheW91dEJv
eCgpOwotICAgICAgICBhdXRvIHJ1bkhhc0NvbnRlbnQgPSBbJl0gKCkgLT4gYm9vbCB7Ci0gICAg
ICAgICAgICBBU1NFUlQoIWxpbmVIYXNDb250ZW50KTsKLSAgICAgICAgICAgIGlmIChydW4uaXNU
ZXh0KCkgfHwgcnVuLmlzQm94KCkgfHwgcnVuLmlzU29mdExpbmVCcmVhaygpIHx8IHJ1bi5pc0hh
cmRMaW5lQnJlYWsoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAg
IGF1dG8mIGlubGluZUJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZv
ckJveChsYXlvdXRCb3gpOwotICAgICAgICAgICAgLy8gRXZlbiBuZWdhdGl2ZSBob3Jpem9udGFs
IG1hcmdpbiBtYWtlcyB0aGUgbGluZSAiY29udGVudGZ1bCIuCi0gICAgICAgICAgICBpZiAocnVu
LmlzSW5saW5lQm94U3RhcnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5saW5lQm94R2Vv
bWV0cnkubWFyZ2luU3RhcnQoKSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCkgfHwg
aW5saW5lQm94R2VvbWV0cnkucGFkZGluZ0xlZnQoKS52YWx1ZU9yKDBfbHUpOwotICAgICAgICAg
ICAgaWYgKHJ1bi5pc0lubGluZUJveEVuZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBpbmxp
bmVCb3hHZW9tZXRyeS5tYXJnaW5FbmQoKSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJSaWdo
dCgpIHx8IGlubGluZUJveEdlb21ldHJ5LnBhZGRpbmdSaWdodCgpLnZhbHVlT3IoMF9sdSk7Ci0g
ICAgICAgICAgICBpZiAocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkKLSAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9OwotICAgICAgICBsaW5lSGFzQ29udGVu
dCA9IGxpbmVIYXNDb250ZW50IHx8IHJ1bkhhc0NvbnRlbnQoKTsKLSAgICAgICAgYXV0byBsb2dp
Y2FsTGVmdCA9IHJvb3RJbmxpbmVCb3gubG9naWNhbExlZnQoKSArIHJ1bi5sb2dpY2FsTGVmdCgp
OwotICAgICAgICBpZiAocnVuLmlzQm94KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGlubGluZUxl
dmVsQm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91
dEJveCk7Ci0gICAgICAgICAgICBhdXRvIG1hcmdpbkJveEhlaWdodCA9IGlubGluZUxldmVsQm94
R2VvbWV0cnkubWFyZ2luQm94SGVpZ2h0KCk7Ci0gICAgICAgICAgICBhdXRvIGFzY2VudCA9IElu
bGluZUxheW91dFVuaXQgeyB9OwotICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlKCkuc2hvdWxk
Tm90U3ludGhlc2l6ZUlubGluZUJsb2NrQmFzZWxpbmUoKSkgewotICAgICAgICAgICAgICAgIC8v
IEludGVncmF0aW9uIGNvZGVwYXRoIGNvbnN0cnVjdHMgcmVwbGFjZWQgYm94ZXMgZm9yIGlubGlu
ZS1ibG9jayBjb250ZW50LgotICAgICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3guaXNSZXBs
YWNlZEJveCgpKTsKLSAgICAgICAgICAgICAgICBhc2NlbnQgPSAqZG93bmNhc3Q8UmVwbGFjZWRC
b3g+KGxheW91dEJveCkuYmFzZWxpbmUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0
Qm94LmlzSW5saW5lQmxvY2tCb3goKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlbGlu
ZSBvZiBhbiAnaW5saW5lLWJsb2NrJyBpcyB0aGUgYmFzZWxpbmUgb2YgaXRzIGxhc3QgbGluZSBi
b3ggaW4gdGhlIG5vcm1hbCBmbG93LCB1bmxlc3MgaXQgaGFzIGVpdGhlciBubyBpbi1mbG93IGxp
bmUgYm94ZXMgb3IKLSAgICAgICAgICAgICAgICAvLyBpZiBpdHMgJ292ZXJmbG93JyBwcm9wZXJ0
eSBoYXMgYSBjb21wdXRlZCB2YWx1ZSBvdGhlciB0aGFuICd2aXNpYmxlJywgaW4gd2hpY2ggY2Fz
ZSB0aGUgYmFzZWxpbmUgaXMgdGhlIGJvdHRvbSBtYXJnaW4gZWRnZS4KLSAgICAgICAgICAgICAg
ICBhdXRvIHN5bnRoZXNpemVCYXNlbGluZSA9ICFsYXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCgpIHx8ICFsYXlvdXRCb3guc3R5bGUoKS5pc092ZXJmbG93VmlzaWJs
ZSgpOwotICAgICAgICAgICAgICAgIGlmIChzeW50aGVzaXplQmFzZWxpbmUpCi0gICAgICAgICAg
ICAgICAgICAgIGFzY2VudCA9IG1hcmdpbkJveEhlaWdodDsKLSAgICAgICAgICAgICAgICBlbHNl
IHsKLSAgICAgICAgICAgICAgICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3Rh
dGUoKS5lc3RhYmxpc2hlZElubGluZUZvcm1hdHRpbmdTdGF0ZShkb3duY2FzdDxDb250YWluZXJC
b3g+KGxheW91dEJveCkpOwotICAgICAgICAgICAgICAgICAgICBhdXRvJiBsYXN0TGluZSA9IGZv
cm1hdHRpbmdTdGF0ZS5saW5lcygpLmxhc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBp
bmxpbmVCbG9ja0Jhc2VsaW5lID0gbGFzdExpbmUubGluZUJveExvZ2ljYWxSZWN0KCkudG9wKCkg
KyBsYXN0TGluZS5iYXNlbGluZSgpOwotICAgICAgICAgICAgICAgICAgICBhc2NlbnQgPSBpbmxp
bmVMZXZlbEJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpICsgaW5saW5lTGV2ZWxCb3hHZW9tZXRy
eS5ib3JkZXJUb3AoKSArIGlubGluZUxldmVsQm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVl
T3IoMCkgKyBpbmxpbmVCbG9ja0Jhc2VsaW5lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgICAgICAg
ICBhc2NlbnQgPSBkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KS5iYXNlbGluZSgpLnZh
bHVlT3IobWFyZ2luQm94SGVpZ2h0KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg
ICBhc2NlbnQgPSBtYXJnaW5Cb3hIZWlnaHQ7Ci0gICAgICAgICAgICBsb2dpY2FsTGVmdCArPSBz
dGQ6Om1heCgwX2x1LCBpbmxpbmVMZXZlbEJveEdlb21ldHJ5Lm1hcmdpblN0YXJ0KCkpOwotICAg
ICAgICAgICAgYXV0byBhdG9taWNJbmxpbmVMZXZlbEJveCA9IExpbmVCb3g6OklubGluZUxldmVs
Qm94OjpjcmVhdGVBdG9taWNJbmxpbmVMZXZlbEJveChsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCB7
IGlubGluZUxldmVsQm94R2VvbWV0cnkuYm9yZGVyQm94V2lkdGgoKSwgbWFyZ2luQm94SGVpZ2h0
IH0pOwotICAgICAgICAgICAgYXRvbWljSW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUoYXNjZW50
KTsKLSAgICAgICAgICAgIGF0b21pY0lubGluZUxldmVsQm94LnNldExheW91dEJvdW5kcyhMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveDo6TGF5b3V0Qm91bmRzIHsgYXNjZW50LCBtYXJnaW5Cb3hIZWln
aHQgLSBhc2NlbnQgfSk7Ci0gICAgICAgICAgICBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNhbGx5SWZB
cHBsaWNhYmxlKGF0b21pY0lubGluZUxldmVsQm94LCBpbmxpbmVMZXZlbEJveEdlb21ldHJ5KTsK
LSAgICAgICAgICAgIGxpbmVCb3guYWRkSW5saW5lTGV2ZWxCb3goV1RGTW92ZShhdG9taWNJbmxp
bmVMZXZlbEJveCkpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAg
aWYgKHJ1bi5pc0lubGluZUJveFN0YXJ0KCkpIHsKLSAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9p
bnQgd2UgZG9uJ3Qga25vdyB5ZXQgaG93IHdpZGUgdGhpcyBpbmxpbmUgYm94IGlzLiBMZXQncyBh
c3N1bWUgaXQncyBhcyBsb25nIGFzIHRoZSBsaW5lIGlzCi0gICAgICAgICAgICAvLyBhbmQgYWRq
dXN0IGl0IGxhdGVyIGlmIHdlIGNvbWUgYWNyb3NzIGFuIGlubGluZUJveEVuZCBydW4gKHNlZSBi
ZWxvdykuCi0gICAgICAgICAgICBhdXRvIGluaXRpYWxMb2dpY2FsV2lkdGggPSBsaW5lQm94LmNv
bnRlbnRMb2dpY2FsV2lkdGgoKSAtIHJ1bi5sb2dpY2FsTGVmdCgpOwotICAgICAgICAgICAgQVNT
RVJUKGluaXRpYWxMb2dpY2FsV2lkdGggPj0gMCk7Ci0gICAgICAgICAgICAvLyBJbmxpbmUgYm94
IHJ1biBpcyBiYXNlZCBvbiBtYXJnaW4gYm94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBi
b3guCi0gICAgICAgICAgICBhdXRvIG1hcmdpblN0YXJ0ID0gc3RkOjptYXgoMF9sdSwgZm9ybWF0
dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpLm1hcmdpblN0YXJ0KCkpOwot
ICAgICAgICAgICAgbG9naWNhbExlZnQgKz0gbWFyZ2luU3RhcnQ7Ci0gICAgICAgICAgICBpbml0
aWFsTG9naWNhbFdpZHRoIC09IG1hcmdpblN0YXJ0OwotICAgICAgICAgICAgYXV0byBpbmxpbmVC
b3ggPSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlSW5saW5lQm94KGxheW91dEJveCwg
bG9naWNhbExlZnQsIGluaXRpYWxMb2dpY2FsV2lkdGgpOwotICAgICAgICAgICAgc2V0VmVydGlj
YWxHZW9tZXRyeUZvcklubGluZUJveChpbmxpbmVCb3gpOwotICAgICAgICAgICAgc2ltcGxpZmll
ZEFsaWduVmVydGljYWxseUlmQXBwbGljYWJsZShpbmxpbmVCb3gsIHsgfSk7Ci0gICAgICAgICAg
ICBsaW5lQm94LmFkZElubGluZUxldmVsQm94KFdURk1vdmUoaW5saW5lQm94KSk7Ci0gICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94RW5k
KCkpIHsKLSAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgbG9naWNhbCB3aWR0aCB3aGVuIHRoZSBp
bmxpbmUgYm94IGNsb3NlcyBvbiB0aGlzIGxpbmUuCi0gICAgICAgICAgICBhdXRvJiBpbmxpbmVC
b3ggPSBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0gICAg
ICAgICAgICBBU1NFUlQoaW5saW5lQm94LmlzSW5saW5lQm94KCkpOwotICAgICAgICAgICAgLy8g
SW5saW5lIGJveCBydW4gaXMgYmFzZWQgb24gbWFyZ2luIGJveC4gTGV0J3MgY29udmVydCBpdCB0
byBib3JkZXIgYm94LgotICAgICAgICAgICAgYXV0byBtYXJnaW5FbmQgPSBzdGQ6Om1heCgwX2x1
LCBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCkubWFyZ2luRW5k
KCkpOwotICAgICAgICAgICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmlnaHQgPSBsb2dpY2FsTGVm
dCArIHJ1bi5sb2dpY2FsV2lkdGgoKSAtIG1hcmdpbkVuZDsKLSAgICAgICAgICAgIGlubGluZUJv
eC5zZXRMb2dpY2FsV2lkdGgoaW5saW5lQm94TG9naWNhbFJpZ2h0IC0gaW5saW5lQm94LmxvZ2lj
YWxMZWZ0KCkpOwotICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGlj
YWJsZShpbmxpbmVCb3gsIHsgfSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQot
ICAgICAgICBpZiAocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc1NvZnRMaW5lQnJlYWsoKSkgewotICAg
ICAgICAgICAgLy8gRklYTUU6IEFkanVzdCBub24tZW1wdHkgaW5saW5lIGJveCBoZWlnaHQgd2hl
biBnbHlwaHMgZnJvbSB0aGUgbm9uLXByaW1hcnkgZm9udCBzdHJldGNoIHRoZSBib3guCi0gICAg
ICAgICAgICBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJl
bnQoKSkuc2V0SGFzQ29udGVudCgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0K
LSAgICAgICAgaWYgKHJ1bi5pc0hhcmRMaW5lQnJlYWsoKSkgewotICAgICAgICAgICAgYXV0byBs
aW5lQnJlYWtCb3ggPSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlTGluZUJyZWFrQm94
KGxheW91dEJveCwgbG9naWNhbExlZnQpOwotICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRy
eUZvcklubGluZUJveChsaW5lQnJlYWtCb3gpOwotICAgICAgICAgICAgc2ltcGxpZmllZEFsaWdu
VmVydGljYWxseUlmQXBwbGljYWJsZShsaW5lQnJlYWtCb3gsIHsgfSk7Ci0gICAgICAgICAgICBs
aW5lQm94LmFkZElubGluZUxldmVsQm94KFdURk1vdmUobGluZUJyZWFrQm94KSk7Ci0gICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnVuLmlzV29yZEJyZWFrT3Bw
b3J0dW5pdHkoKSkgewotICAgICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlR2VuZXJpY0lubGluZUxldmVsQm94KGxheW91dEJv
eCwgbG9naWNhbExlZnQpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIH0KLQotICAgIGxpbmVCb3guc2V0SGFzQ29u
dGVudChsaW5lSGFzQ29udGVudCk7Ci0gICAgaWYgKHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVu
dC5pc0VuYWJsZWQoKSB8fCAhbGluZUhhc0NvbnRlbnQpIHsKLSAgICAgICAgLy8gV2Ugc2hvdWxk
IGFsd2F5cyBiZSBhYmxlIHRvIGV4ZXJjaXNlIHRoZSBmYXN0IHBhdGggd2hlbiB0aGUgbGluZSBo
YXMgbm8gY29udGVudCBhdCBhbGwsIGV2ZW4gaW4gbm9uLXN0YW5kYXJkcyBtb2RlIG9yIHdpdGgg
bGluZS1oZWlnaHQgc2V0LgotICAgICAgICByb290SW5saW5lQm94LnNldExvZ2ljYWxUb3AobGlu
ZUhhc0NvbnRlbnQgPyBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQucm9vdElubGluZUJveExv
Z2ljYWxUb3AoKSA6IC1yb290SW5saW5lQm94LmJhc2VsaW5lKCkpOwotICAgICAgICBsaW5lQm94
LnNldExvZ2ljYWxIZWlnaHQobGluZUhhc0NvbnRlbnQgPyBzaW1wbGlmaWVkVmVydGljYWxBbGln
bm1lbnQubGluZUJveEhlaWdodCgpIDogSW5saW5lTGF5b3V0VW5pdCgpKTsKLSAgICB9IGVsc2UK
LSAgICAgICAgY29tcHV0ZUxpbmVCb3hIZWlnaHRBbmRBbGlnbklubGluZUxldmVsQm94ZXNWZXJ0
aWNhbGx5KGxpbmVCb3gpOwotfQotCi12b2lkIExpbmVCb3hCdWlsZGVyOjpjb21wdXRlTGluZUJv
eEhlaWdodEFuZEFsaWduSW5saW5lTGV2ZWxCb3hlc1ZlcnRpY2FsbHkoTGluZUJveCYgbGluZUJv
eCkKLXsKLSAgICBBU1NFUlQobGluZUJveC5oYXNDb250ZW50KCkpOwotICAgIC8vIFRoaXMgZnVu
Y3Rpb24gKHBhcnRpYWxseSkgaW1wbGVtZW50czoKLSAgICAvLyAyLjIuIExheW91dCBXaXRoaW4g
TGluZSBCb3hlcwotICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xp
bmUtbGF5b3V0Ci0gICAgLy8gMS4gQ29tcHV0ZSB0aGUgbGluZSBib3ggaGVpZ2h0IHVzaW5nIHRo
ZSBsYXlvdXQgYm91bmRzIGdlb21ldHJ5LiBUaGlzIGhlaWdodCBjb21wdXRhdGlvbiBzdHJpY3Rs
eSB1c2VzIGxheW91dCBib3VuZHMgYW5kIG5vdCBub3JtYWwgaW5saW5lIGxldmVsIGJveCBnZW9t
ZXRyaWVzLgotICAgIC8vIDIuIENvbXB1dGUgdGhlIGJhc2VsaW5lL2xvZ2ljYWwgdG9wIHBvc2l0
aW9uIG9mIHRoZSByb290IGlubGluZSBib3guIEFsaWduZWQgYm94ZXMgcHVzaCB0aGUgcm9vdCBp
bmxpbmUgYm94IGFyb3VuZCBpbnNpZGUgdGhlIGxpbmUgYm94LgotICAgIC8vIDMuIEZpbmFsbHkg
YWxpZ24gdGhlIGlubGluZSBsZXZlbCBib3hlcyB1c2luZyAobW9zdGx5KSBub3JtYWwgaW5saW5l
IGxldmVsIGJveCBnZW9tZXRyaWVzLgotICAgIGF1dG8gcXVpcmtzID0gZm9ybWF0dGluZ0NvbnRl
eHQoKS5xdWlya3MoKTsKLSAgICBhdXRvJiByb290SW5saW5lQm94ID0gbGluZUJveC5yb290SW5s
aW5lQm94KCk7Ci0KLSAgICBhdXRvIGNvbXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCA9IFsmXSB7
Ci0gICAgICAgIC8vIExpbmUgYm94IGhlaWdodCBjb21wdXRhdGlvbiBpcyBiYXNlZCBvbiB0aGUg
bGF5b3V0IGJvdW5kcyBvZiB0aGUgaW5saW5lIGJveGVzIGFuZCBub3QgdGhlaXIgbG9naWNhbCAo
YXNjZW50L2Rlc2NlbnQpIGRpbWVuc2lvbnMuCi0gICAgICAgIHN0cnVjdCBBYnNvbHV0ZVRvcEFu
ZEJvdHRvbSB7Ci0gICAgICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHRvcCB7IDAgfTsKLSAgICAg
ICAgICAgIElubGluZUxheW91dFVuaXQgYm90dG9tIHsgMCB9OwotICAgICAgICB9OwotICAgICAg
ICBIYXNoTWFwPGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94KiwgQWJzb2x1dGVUb3BBbmRC
b3R0b20+IGlubGluZUxldmVsQm94QWJzb2x1dGVUb3BBbmRCb3R0b21NYXA7Ci0KLSAgICAgICAg
YXV0byBtaW5pbXVtTG9naWNhbFRvcCA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsK
LSAgICAgICAgYXV0byBtYXhpbXVtTG9naWNhbEJvdHRvbSA9IE9wdGlvbmFsPElubGluZUxheW91
dFVuaXQ+IHsgfTsKLSAgICAgICAgaWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5l
Qm94KHJvb3RJbmxpbmVCb3gsIGxpbmVCb3gpKSB7Ci0gICAgICAgICAgICBtaW5pbXVtTG9naWNh
bFRvcCA9IElubGluZUxheW91dFVuaXQgeyB9OwotICAgICAgICAgICAgbWF4aW11bUxvZ2ljYWxC
b3R0b20gPSByb290SW5saW5lQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpOwotICAgICAgICAg
ICAgaW5saW5lTGV2ZWxCb3hBYnNvbHV0ZVRvcEFuZEJvdHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVC
b3gsIEFic29sdXRlVG9wQW5kQm90dG9tIHsgKm1pbmltdW1Mb2dpY2FsVG9wLCAqbWF4aW11bUxv
Z2ljYWxCb3R0b20gfSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaW5saW5lTGV2ZWxC
b3hBYnNvbHV0ZVRvcEFuZEJvdHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVCb3gsIEFic29sdXRlVG9w
QW5kQm90dG9tIHsgfSk7Ci0KLSAgICAgICAgVmVjdG9yPExpbmVCb3g6OklubGluZUxldmVsQm94
Kj4gbGluZUJveFJlbGF0aXZlSW5saW5lTGV2ZWxCb3hlczsKLSAgICAgICAgZm9yIChhdXRvJiBp
bmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgewotICAg
ICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7Ci0g
ICAgICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3guaGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50
KCkpIHsKLSAgICAgICAgICAgICAgICBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveGVzLmFw
cGVuZCgmaW5saW5lTGV2ZWxCb3gpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgYXV0byYgcGFyZW50SW5saW5lQm94ID0gbGluZUJveC5pbmxp
bmVMZXZlbEJveEZvckxheW91dEJveChsYXlvdXRCb3gucGFyZW50KCkpOwotICAgICAgICAgICAg
Ly8gTG9naWNhbCB0b3AgaXMgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBpbmxpbmUgYm94J3MgbGF5
b3V0IGJvdW5kcy4KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGxvZ2ljYWwgdG9wIGlz
IG5vdCB0aGUgZmluYWwgbG9naWNhbCB0b3Agb2YgdGhlIGlubGluZSBsZXZlbCBib3guCi0gICAg
ICAgICAgICAvLyBUaGlzIGlzIHRoZSBsb2dpY2FsIHRvcCBpbiB0aGUgY29udGV4dCBvZiB0aGUg
bGF5b3V0IGJvdW5kcyBnZW9tZXRyeSB3aGljaCBtYXkgYmUgdmVyeSBkaWZmZXJlbnQgZnJvbSB0
aGUgaW5saW5lIGJveCdzIG5vcm1hbCBnZW9tZXRyeS4KLSAgICAgICAgICAgIGF1dG8gbG9naWNh
bFRvcCA9IElubGluZUxheW91dFVuaXQgeyB9OwotICAgICAgICAgICAgc3dpdGNoIChpbmxpbmVM
ZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKLSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGln
bjo6QmFzZWxpbmU6IHsKLSAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9t
UGFyZW50QmFzZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0g
ICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMo
KS5hc2NlbnQgLSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFs
aWduOjpNaWRkbGU6IHsKLSAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9t
UGFyZW50QmFzZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSAv
IDIgKyBwYXJlbnRJbmxpbmVCb3guc3R5bGUoKS5mb250TWV0cmljcygpLnhIZWlnaHQoKSAvIDI7
Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3Vu
ZHMoKS5hc2NlbnQgLSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNh
bEFsaWduOjpCYXNlbGluZU1pZGRsZTogewotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRv
cE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygp
LmhlaWdodCgpIC8gMjsKLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5l
Qm94LmxheW91dEJvdW5kcygpLmFzY2VudCAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFz
ZWxpbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBjYXNlIFZlcnRpY2FsQWxpZ246Okxlbmd0aDogewotICAgICAgICAgICAgICAgIGF1dG8mIHN0
eWxlID0gaW5saW5lTGV2ZWxCb3guc3R5bGUoKTsKLSAgICAgICAgICAgICAgICBhdXRvIGxvZ2lj
YWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBmbG9hdFZhbHVlRm9yTGVuZ3RoKHN0eWxl
LnZlcnRpY2FsQWxpZ25MZW5ndGgoKSwgc3R5bGUuY29tcHV0ZWRMaW5lSGVpZ2h0KCkpICsgaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OwotICAgICAgICAgICAgICAgIGxvZ2lj
YWxUb3AgPSBwYXJlbnRJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbG9naWNhbFRv
cE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VGV4dFRvcDogewotICAg
ICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0ZXh0LXRvcCBhbGlnbnMgd2l0aCB0aGUgaW5saW5l
IGJveCdzIGZvbnQgbWV0cmljcyB0b3AgKGFzY2VudCkgYW5kIG5vdCB0aGUgbGF5b3V0IGJvdW5k
cyB0b3AuCi0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlv
dXRCb3VuZHMoKS5hc2NlbnQgLSBwYXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKTsKLSAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgVmVydGljYWxB
bGlnbjo6VGV4dEJvdHRvbTogewotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0ZXh0LWJv
dHRvbSBhbGlnbnMgd2l0aCB0aGUgaW5saW5lIGJveCdzIGZvbnQgbWV0cmljcyBib3R0b20gKGRl
c2NlbnQpIGFuZCBub3QgdGhlIGxheW91dCBib3VuZHMgYm90dG9tLgotICAgICAgICAgICAgICAg
IGF1dG8gcGFyZW50SW5saW5lQm94TGF5b3V0Qm91bmRzID0gcGFyZW50SW5saW5lQm94LmxheW91
dEJvdW5kcygpOwotICAgICAgICAgICAgICAgIGF1dG8gcGFyZW50SW5saW5lQm94TG9naWNhbEJv
dHRvbSA9IHBhcmVudElubGluZUJveExheW91dEJvdW5kcy5oZWlnaHQoKSAtIHBhcmVudElubGlu
ZUJveExheW91dEJvdW5kcy5kZXNjZW50ICsgcGFyZW50SW5saW5lQm94LmRlc2NlbnQoKS52YWx1
ZU9yKElubGluZUxheW91dFVuaXQoKSk7Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBh
cmVudElubGluZUJveExvZ2ljYWxCb3R0b20gLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMo
KS5oZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9Z
RVQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGF1dG8gcGFyZW50SW5saW5lQm94QWJzb2x1dGVUb3BBbmRCb3R0b20gPSBpbmxpbmVMZXZlbEJv
eEFic29sdXRlVG9wQW5kQm90dG9tTWFwLmdldCgmcGFyZW50SW5saW5lQm94KTsKLSAgICAgICAg
ICAgIGF1dG8gYWJzb2x1dGVMb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94QWJzb2x1dGVUb3BB
bmRCb3R0b20udG9wICsgbG9naWNhbFRvcDsKLSAgICAgICAgICAgIGF1dG8gYWJzb2x1dGVMb2dp
Y2FsQm90dG9tID0gYWJzb2x1dGVMb2dpY2FsVG9wICsgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91
bmRzKCkuaGVpZ2h0KCk7Ci0gICAgICAgICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9wQW5k
Qm90dG9tTWFwLmFkZCgmaW5saW5lTGV2ZWxCb3gsIEFic29sdXRlVG9wQW5kQm90dG9tIHsgYWJz
b2x1dGVMb2dpY2FsVG9wLCBhYnNvbHV0ZUxvZ2ljYWxCb3R0b20gfSk7Ci0gICAgICAgICAgICAv
LyBTdHJldGNoIHRoZSBtaW4vbWF4IGFic29sdXRlIHZhbHVlcyBpZiBhcHBsaWNhYmxlLgotICAg
ICAgICAgICAgaWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGlubGluZUxl
dmVsQm94LCBsaW5lQm94KSkgewotICAgICAgICAgICAgICAgIG1pbmltdW1Mb2dpY2FsVG9wID0g
c3RkOjptaW4obWluaW11bUxvZ2ljYWxUb3AudmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxUb3ApLCBh
YnNvbHV0ZUxvZ2ljYWxUb3ApOwotICAgICAgICAgICAgICAgIG1heGltdW1Mb2dpY2FsQm90dG9t
ID0gc3RkOjptYXgobWF4aW11bUxvZ2ljYWxCb3R0b20udmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxC
b3R0b20pLCBhYnNvbHV0ZUxvZ2ljYWxCb3R0b20pOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgICAgIC8vIFRoZSBsaW5lIGJveCBoZWlnaHQgY29tcHV0YXRpb24gaXMgYXMgZm9sbG93
czoKLSAgICAgICAgLy8gMS4gU3RyZXRjaCB0aGUgbGluZSBib3ggd2l0aCB0aGUgbm9uLWxpbmUt
Ym94IHJlbGF0aXZlIGFsaWduZWQgaW5saW5lIGJveCBhYnNvbHV0ZSB0b3AgYW5kIGJvdHRvbSB2
YWx1ZXMuCi0gICAgICAgIC8vIDIuIENoZWNrIGlmIHRoZSBsaW5lIGJveCByZWxhdGl2ZSBhbGln
bmVkIGlubGluZSBib3hlcyAodG9wLCBib3R0b20gZXRjKSBoYXZlIGVub3VnaCByb29tIGFuZCBz
dHJldGNoIHRoZSBsaW5lIGJveCBmdXJ0aGVyIGlmIG5lZWRlZC4KLSAgICAgICAgYXV0byBsaW5l
Qm94TG9naWNhbEhlaWdodCA9IG1heGltdW1Mb2dpY2FsQm90dG9tLnZhbHVlT3IoSW5saW5lTGF5
b3V0VW5pdCgpKSAtIG1pbmltdW1Mb2dpY2FsVG9wLnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCgp
KTsKLSAgICAgICAgZm9yIChhdXRvKiBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveCA6IGxp
bmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94ZXMpIHsKLSAgICAgICAgICAgIGlmICghcXVpcmtz
LmlubGluZUxldmVsQm94QWZmZWN0c0xpbmVCb3goKmxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVs
Qm94LCBsaW5lQm94KSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGxp
bmVCb3hMb2dpY2FsSGVpZ2h0ID0gc3RkOjptYXgobGluZUJveExvZ2ljYWxIZWlnaHQsIGxpbmVC
b3hSZWxhdGl2ZUlubGluZUxldmVsQm94LT5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSk7Ci0gICAg
ICAgIH0KLSAgICAgICAgbGluZUJveC5zZXRMb2dpY2FsSGVpZ2h0KGxpbmVCb3hMb2dpY2FsSGVp
Z2h0KTsKLSAgICB9OwotICAgIGNvbXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCgpOwotCi0gICAg
YXV0byBjb21wdXRlUm9vdElubGluZUJveFZlcnRpY2FsUG9zaXRpb24gPSBbJl0gewotICAgICAg
ICBIYXNoTWFwPGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94KiwgSW5saW5lTGF5b3V0VW5p
dD4gaW5saW5lTGV2ZWxCb3hBYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0TWFwOwotICAgICAgICBpbmxp
bmVMZXZlbEJveEFic29sdXRlQmFzZWxpbmVPZmZzZXRNYXAuYWRkKCZyb290SW5saW5lQm94LCBJ
bmxpbmVMYXlvdXRVbml0IHsgfSk7Ci0KLSAgICAgICAgYXV0byBtYXhpbXVtVG9wT2Zmc2V0RnJv
bVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsK
LSAgICAgICAgaWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KHJvb3RJbmxp
bmVCb3gsIGxpbmVCb3gpKQotICAgICAgICAgICAgbWF4aW11bVRvcE9mZnNldEZyb21Sb290SW5s
aW5lQm94QmFzZWxpbmUgPSByb290SW5saW5lQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKLQot
ICAgICAgICBmb3IgKGF1dG8mIGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5l
TGV2ZWxCb3hlcygpKSB7Ci0gICAgICAgICAgICBhdXRvIGFic29sdXRlQmFzZWxpbmVPZmZzZXQg
PSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAgICAgICAgICAgIGlmICghaW5saW5lTGV2ZWxCb3gu
aGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpIHsKLSAgICAgICAgICAgICAgICBhdXRvJiBs
YXlvdXRCb3ggPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKLSAgICAgICAgICAgICAgICBh
dXRvJiBwYXJlbnRJbmxpbmVCb3ggPSBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94
KGxheW91dEJveC5wYXJlbnQoKSk7Ci0gICAgICAgICAgICAgICAgYXV0byBiYXNlbGluZU9mZnNl
dEZyb21QYXJlbnRCYXNlbGluZSA9IElubGluZUxheW91dFVuaXQgeyB9OwotCi0gICAgICAgICAg
ICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKLSAgICAgICAg
ICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lOgotICAgICAgICAgICAgICAgICAg
ICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHsgfTsKLSAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6
IHsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJh
c2VsaW5lID0gKGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpIC8gMiArIHBh
cmVudElubGluZUJveC5zdHlsZSgpLmZvbnRNZXRyaWNzKCkueEhlaWdodCgpIC8gMik7Ci0gICAg
ICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gbG9naWNh
bFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5k
cygpLmFzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmVNaWRkbGU6IHsK
LSAgICAgICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2Vs
aW5lID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCkgLyAyOwotICAgICAg
ICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxU
b3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMo
KS5hc2NlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Okxlbmd0aDogewotICAgICAgICAg
ICAgICAgICAgICBhdXRvJiBzdHlsZSA9IGlubGluZUxldmVsQm94LnN0eWxlKCk7Ci0gICAgICAg
ICAgICAgICAgICAgIGF1dG8gdmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5n
dGgoc3R5bGUudmVydGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQo
KSk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRC
YXNlbGluZSA9IHZlcnRpY2FsQWxpZ25PZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgp
OwotICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9
IGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5iYXNl
bGluZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpUZXh0VG9wOgotICAgICAgICAgICAg
ICAgICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHBhcmVudElubGluZUJv
eC5iYXNlbGluZSgpIC0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OwotICAg
ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246OlRleHRCb3R0b206Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBh
cmVudEJhc2VsaW5lID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtICpw
YXJlbnRJbmxpbmVCb3guZGVzY2VudCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lN
UExFTUVOVEVEX1lFVCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgYWJzb2x1dGVCYXNlbGluZU9mZnNldCA9IGlubGluZUxl
dmVsQm94QWJzb2x1dGVCYXNlbGluZU9mZnNldE1hcC5nZXQoJnBhcmVudElubGluZUJveCkgKyBi
YXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsK
LSAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRvcDogewotICAgICAgICAgICAg
ICAgICAgICBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0ID0gcm9vdElubGluZUJveC5sYXlvdXRCb3Vu
ZHMoKS5hc2NlbnQgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0gICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICBjYXNlIFZlcnRpY2FsQWxpZ246OkJvdHRvbTogewotICAgICAgICAgICAgICAgICAgICBhYnNv
bHV0ZUJhc2VsaW5lT2Zmc2V0ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2Vu
dCAtIHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudDsKLSAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6
Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGlubGluZUxldmVsQm94QWJzb2x1dGVCYXNlbGluZU9mZnNldE1hcC5hZGQo
JmlubGluZUxldmVsQm94LCBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0KTsKLSAgICAgICAgICAgIGF1
dG8gYWZmZWN0c1Jvb3RJbmxpbmVCb3hWZXJ0aWNhbFBvc2l0aW9uID0gcXVpcmtzLmlubGluZUxl
dmVsQm94QWZmZWN0c0xpbmVCb3goaW5saW5lTGV2ZWxCb3gsIGxpbmVCb3gpOwotICAgICAgICAg
ICAgaWYgKGFmZmVjdHNSb290SW5saW5lQm94VmVydGljYWxQb3NpdGlvbikgewotICAgICAgICAg
ICAgICAgIGF1dG8gdG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IGFic29sdXRl
QmFzZWxpbmVPZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0g
ICAgICAgICAgICAgICAgaWYgKG1heGltdW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2Vs
aW5lKQotICAgICAgICAgICAgICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVC
b3hCYXNlbGluZSA9IHN0ZDo6bWF4KCptYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hC
YXNlbGluZSwgdG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSk7Ci0gICAgICAgICAg
ICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpcyBxdWlyayBtb2Rl
IGFuZCB0aGUgcm9vdCBpbmxpbmUgYm94IGhhcyBubyBjb250ZW50LiBUaGUgcm9vdCBpbmxpbmUg
Ym94J3MgYmFzZWxpbmUgaXMgYW5jaG9yZWQgYXQgMC4KLSAgICAgICAgICAgICAgICAgICAgLy8g
SG93ZXZlciBuZWdhdGl2ZSBhc2NlbnQgKGUuZyBuZWdhdGl2ZSB0b3AgbWFyZ2luKSBjYW4gInB1
c2giIHRoZSByb290IGlubGluZSBib3ggdXB3YXJkcyBhbmQgaGF2ZSBhIG5lZ2F0aXZlIHZhbHVl
LgotICAgICAgICAgICAgICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hC
YXNlbGluZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudCA+PSAwCi0gICAg
ICAgICAgICAgICAgICAgICAgICA/IHN0ZDo6bWF4KDAuMGYsIHRvcE9mZnNldEZyb21Sb290SW5s
aW5lQm94QmFzZWxpbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHRvcE9mZnNldEZyb21S
b290SW5saW5lQm94QmFzZWxpbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgICAgIGF1dG8gcm9vdElubGluZUJveExvZ2ljYWxUb3AgPSBtYXhpbXVt
VG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZS52YWx1ZU9yKDAuZikgLSByb290SW5s
aW5lQm94LmJhc2VsaW5lKCk7Ci0gICAgICAgIHJvb3RJbmxpbmVCb3guc2V0TG9naWNhbFRvcChy
b290SW5saW5lQm94TG9naWNhbFRvcCk7Ci0gICAgfTsKLSAgICBjb21wdXRlUm9vdElubGluZUJv
eFZlcnRpY2FsUG9zaXRpb24oKTsKLQotICAgIGF1dG8gYWxpZ25JbmxpbmVMZXZlbEJveGVzID0g
WyZdIHsKLSAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9v
dElubGluZUxldmVsQm94ZXMoKSkgewotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7Ci0gICAgICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVC
b3ggPSBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQo
KSk7Ci0gICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3AgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsK
LSAgICAgICAgICAgIHN3aXRjaCAoaW5saW5lTGV2ZWxCb3gudmVydGljYWxBbGlnbigpKSB7Ci0g
ICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lOgotICAgICAgICAgICAgICAg
IGxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94
LmJhc2VsaW5lKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246Ok1pZGRsZTogewotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9m
ZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IChpbmxpbmVMZXZlbEJveC5sb2dpY2FsSGVpZ2h0KCkg
LyAyICsgcGFyZW50SW5saW5lQm94LnN0eWxlKCkuZm9udE1ldHJpY3MoKS54SGVpZ2h0KCkgLyAy
KTsKLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmJhc2VsaW5l
KCkgLSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpC
YXNlbGluZU1pZGRsZTogewotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZSA9IGlubGluZUxldmVsQm94LmxvZ2ljYWxIZWlnaHQoKSAvIDI7Ci0g
ICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0g
bG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6TGVuZ3Ro
OiB7Ci0gICAgICAgICAgICAgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVMZXZlbEJveC5zdHlsZSgp
OwotICAgICAgICAgICAgICAgIGF1dG8gdmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVG
b3JMZW5ndGgoc3R5bGUudmVydGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVI
ZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVu
dEJhc2VsaW5lID0gdmVydGljYWxBbGlnbk9mZnNldCArIGlubGluZUxldmVsQm94LmJhc2VsaW5l
KCk7Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGlu
ZSgpIC0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCAodGV4dCl0
b3AvYm90dG9tIGFsaWduIHRoZWlyIGxheW91dCBib3VuZHMuCi0gICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246OlRleHRUb3A6Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGlu
ZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5l
KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246OlRleHRCb3R0b206Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGlu
ZUJveC5sb2dpY2FsSGVpZ2h0KCkgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5kZXNj
ZW50IC0gaW5saW5lTGV2ZWxCb3guYmFzZWxpbmUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VG9wOgotICAgICAgICAgICAgICAgIC8v
IE5vdGUgdGhhdCB0aGlzIGxvZ2ljYWwgdG9wIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgcGFyZW50
IGlubGluZSBib3guCi0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94
LmxheW91dEJvdW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7Ci0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJvdHRv
bToKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBsb2dpY2FsIHRvcCBpcyBub3Qg
cmVsYXRpdmUgdG8gdGhlIHBhcmVudCBpbmxpbmUgYm94LgotICAgICAgICAgICAgICAgIGxvZ2lj
YWxUb3AgPSBsaW5lQm94LmxvZ2ljYWxIZWlnaHQoKSAtIGlubGluZUxldmVsQm94LmxheW91dEJv
dW5kcygpLmRlc2NlbnQgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOwotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBU1NFUlRf
Tk9UX0lNUExFTUVOVEVEX1lFVCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChsb2dpY2FsVG9w
KTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgYWxpZ25JbmxpbmVMZXZlbEJveGVzKCk7Ci19Ci0K
LUxpbmVCb3hCdWlsZGVyOjpTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OlNpbXBsaWZpZWRW
ZXJ0aWNhbEFsaWdubWVudChjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgcm9vdElubGlu
ZUJveCkKLSAgICA6IG1fcm9vdElubGluZUJveChyb290SW5saW5lQm94KQotewotICAgIGFkanVz
dChyb290SW5saW5lQm94KTsKLX0KLQotYm9vbCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmllZFZl
cnRpY2FsQWxpZ25tZW50OjpjYW5Vc2VTaW1wbGlmaWVkQWxpZ25tZW50KGNvbnN0IExpbmVCb3g6
OklubGluZUxldmVsQm94JiByb290SW5saW5lQm94LCBjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveCYgaW5saW5lTGV2ZWxCb3gsIE9wdGlvbmFsPGNvbnN0IEJveEdlb21ldHJ5PiBpbmxpbmVM
ZXZlbEJveEdlb21ldHJ5KQotewotICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0F0b21pY0lubGlu
ZUxldmVsQm94KCkpIHsKLSAgICAgICAgQVNTRVJUKGlubGluZUxldmVsQm94R2VvbWV0cnkpOwot
ICAgICAgICAvLyBCYXNlbGluZSBhbGlnbmVkLCBub24tc3RyZXRjaHkgZGlyZWN0IGNoaWxkcmVu
IGFyZSBjb25zaWRlcmVkIHRvIGJlIHNpbXBsZSBmb3Igbm93LgotICAgICAgICBhdXRvJiBsYXlv
dXRCb3ggPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKLSAgICAgICAgcmV0dXJuICZsYXlv
dXRCb3gucGFyZW50KCkgPT0gJnJvb3RJbmxpbmVCb3gubGF5b3V0Qm94KCkKLSAgICAgICAgICAg
ICYmIGxheW91dEJveC5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKSA9PSBWZXJ0aWNhbEFsaWduOjpC
YXNlbGluZQotICAgICAgICAgICAgJiYgIWlubGluZUxldmVsQm94R2VvbWV0cnktPm1hcmdpbkJl
Zm9yZSgpCi0gICAgICAgICAgICAmJiAhaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQWZ0
ZXIoKQotICAgICAgICAgICAgJiYgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQm94SGVp
Z2h0KCkgPD0gcm9vdElubGluZUJveC5iYXNlbGluZSgpOwotICAgIH0KLSAgICBpZiAoaW5saW5l
TGV2ZWxCb3guaXNMaW5lQnJlYWtCb3goKSkgewotICAgICAgICAvLyBCYXNlbGluZSBhbGlnbmVk
LCBub24tc3RyZXRjaHkgbGluZSBicmVha3MgZS5nLiA8ZGl2PjxzcGFuPjxicj48L3NwYW4+PC9k
aXY+IGJ1dCBub3QgPGRpdj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMDBweDsiPjxicj48L3Nw
YW4+PC9kaXY+LgotICAgICAgICByZXR1cm4gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5
bGUoKS52ZXJ0aWNhbEFsaWduKCkgPT0gVmVydGljYWxBbGlnbjo6QmFzZWxpbmUgJiYgaW5saW5l
TGV2ZWxCb3guYmFzZWxpbmUoKSA8PSByb290SW5saW5lQm94LmJhc2VsaW5lKCk7Ci0gICAgfQot
ICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpKSB7Ci0gICAgICAgIC8vIEJhc2Vs
aW5lIGFsaWduZWQsIG5vbi1zdHJldGNoeSBpbmxpbmUgYm94ZXMgZS5nLiA8ZGl2PjxzcGFuPjwv
c3Bhbj48L2Rpdj4gYnV0IG5vdCA8ZGl2PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwMHB4OyI+
PC9zcGFuPjwvZGl2Pi4KLSAgICAgICAgcmV0dXJuIGlubGluZUxldmVsQm94LmxheW91dEJveCgp
LnN0eWxlKCkudmVydGljYWxBbGlnbigpID09IFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lICYmIGlu
bGluZUxldmVsQm94LmxheW91dEJvdW5kcygpID09IHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRz
KCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBMaW5lQm94QnVpbGRlcjo6
U2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50OjphbGlnbihMaW5lQm94OjpJbmxpbmVMZXZlbEJv
eCYgaW5saW5lTGV2ZWxCb3gpCi17Ci0gICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5s
aW5lTGV2ZWxCb3goKSB8fCBpbmxpbmVMZXZlbEJveC5pc0xpbmVCcmVha0JveCgpIHx8IGlubGlu
ZUxldmVsQm94LmlzSW5saW5lQm94KCkpIHsKLSAgICAgICAgLy8gT25seSBiYXNlbGluZSBhbGln
bm1lbnQgZm9yIG5vdy4KLSAgICAgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChtX3Jv
b3RJbmxpbmVCb3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCkpOwotICAg
ICAgICBhZGp1c3QoaW5saW5lTGV2ZWxCb3gpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAg
IEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci19Ci0KLXZvaWQgTGluZUJveEJ1aWxkZXI6
OlNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudDo6YWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGlu
ZUxldmVsQm94JiBpbmxpbmVMZXZlbEJveCkKLXsKLSAgICBhdXRvIGxheW91dEJvdW5kc0xvZ2lj
YWxUb3AgPSBtX3Jvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gaW5saW5lTGV2
ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OwotICAgIG1fbGluZUJveExvZ2ljYWxUb3AgPSBz
dGQ6Om1pbihtX2xpbmVCb3hMb2dpY2FsVG9wLCBsYXlvdXRCb3VuZHNMb2dpY2FsVG9wKTsKLSAg
ICBtX2xpbmVCb3hMb2dpY2FsQm90dG9tID0gc3RkOjptYXgobV9saW5lQm94TG9naWNhbEJvdHRv
bSwgbGF5b3V0Qm91bmRzTG9naWNhbFRvcCArIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygp
LmhlaWdodCgpKTsKLSAgICBtX3Jvb3RJbmxpbmVCb3hMb2dpY2FsVG9wID0gc3RkOjptYXgobV9y
b290SW5saW5lQm94TG9naWNhbFRvcCwgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNj
ZW50IC0gbV9yb290SW5saW5lQm94LmJhc2VsaW5lKCkpOwotfQotCi1MaW5lQm94IElubGluZUZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6bGluZUJveEZvckxpbmVDb250ZW50KGNvbnN0IExp
bmVCdWlsZGVyOjpMaW5lQ29udGVudCYgbGluZUNvbnRlbnQpCi17Ci0gICAgcmV0dXJuIExpbmVC
b3hCdWlsZGVyKGZvcm1hdHRpbmdDb250ZXh0KCkpLmJ1aWxkKGxpbmVDb250ZW50KTsKLX0KLQot
SW5saW5lTGF5b3V0VW5pdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmxvZ2lj
YWxUb3BGb3JOZXh0TGluZShjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250
ZW50LCBJbmxpbmVMYXlvdXRVbml0IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIGNvbnN0IEZs
b2F0aW5nQ29udGV4dCYgZmxvYXRpbmdDb250ZXh0KSBjb25zdAotewotICAgIC8vIE5vcm1hbGx5
IHRoZSBuZXh0IGxpbmUncyBsb2dpY2FsIHRvcCBpcyB0aGUgcHJldmlvdXMgbGluZSdzIGxvZ2lj
YWwgYm90dG9tLCBidXQgd2hlbiB0aGUgbGluZSBlbmRzCi0gICAgLy8gd2l0aCB0aGUgY2xlYXIg
cHJvcGVydHkgc2V0LCB0aGUgbmV4dCBsaW5lIG5lZWRzIHRvIGNsZWFyIHRoZSBleGlzdGluZyBm
bG9hdHMuCi0gICAgaWYgKGxpbmVDb250ZW50LnJ1bnMuaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm4gcHJldmlvdXNMaW5lTG9naWNhbEJvdHRvbTsKLSAgICBhdXRvJiBsYXN0UnVuTGF5b3V0Qm94
ID0gbGluZUNvbnRlbnQucnVucy5sYXN0KCkubGF5b3V0Qm94KCk7IAotICAgIGlmIChsYXN0UnVu
TGF5b3V0Qm94LnN0eWxlKCkuY2xlYXIoKSA9PSBDbGVhcjo6Tm9uZSkKLSAgICAgICAgcmV0dXJu
IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b207Ci0gICAgYXV0byBwb3NpdGlvbldpdGhDbGVhcmFu
Y2UgPSBmbG9hdGluZ0NvbnRleHQudmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UobGFzdFJ1
bkxheW91dEJveCk7Ci0gICAgaWYgKCFwb3NpdGlvbldpdGhDbGVhcmFuY2UpCi0gICAgICAgIHJl
dHVybiBwcmV2aW91c0xpbmVMb2dpY2FsQm90dG9tOwotICAgIHJldHVybiBzdGQ6Om1heChwcmV2
aW91c0xpbmVMb2dpY2FsQm90dG9tLCBJbmxpbmVMYXlvdXRVbml0KHBvc2l0aW9uV2l0aENsZWFy
YW5jZS0+cG9zaXRpb24pKTsKLX0KLQotQ29udGVudFdpZHRoQW5kTWFyZ2luIElubGluZUZvcm1h
dHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRNYXJnaW4o
Y29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZh
bHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGZvcm1hdHRp
bmdDb250ZXh0Um9vdC5pc0luRmxvdygpKTsKLQotICAgIC8vIDEwLjMuMTAgJ0lubGluZS1ibG9j
aycsIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93Ci0KLSAgICAvLyBFeGFjdGx5IGFz
IGlubGluZSByZXBsYWNlZCBlbGVtZW50cy4KLSAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHRSb290
LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgcmV0dXJuIGlubGluZVJlcGxhY2VkQ29udGVudFdp
ZHRoQW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3Qp
LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMp
OwotCi0gICAgLy8gMTAuMy45ICdJbmxpbmUtYmxvY2snLCBub24tcmVwbGFjZWQgZWxlbWVudHMg
aW4gbm9ybWFsIGZsb3cKLQotICAgIC8vIElmICd3aWR0aCcgaXMgJ2F1dG8nLCB0aGUgdXNlZCB2
YWx1ZSBpcyB0aGUgc2hyaW5rLXRvLWZpdCB3aWR0aCBhcyBmb3IgZmxvYXRpbmcgZWxlbWVudHMu
Ci0gICAgLy8gQSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycgZm9yICdtYXJnaW4tbGVmdCcgb3Ig
J21hcmdpbi1yaWdodCcgYmVjb21lcyBhIHVzZWQgdmFsdWUgb2YgJzAnLgotICAgIC8vICMxCi0g
ICAgYXV0byB3aWR0aCA9IGNvbXB1dGVkVmFsdWUoZm9ybWF0dGluZ0NvbnRleHRSb290LnN0eWxl
KCkubG9naWNhbFdpZHRoKCksIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOwot
ICAgIGlmICghd2lkdGgpCi0gICAgICAgIHdpZHRoID0gc2hyaW5rVG9GaXRXaWR0aChmb3JtYXR0
aW5nQ29udGV4dFJvb3QsIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOwotCi0g
ICAgLy8gIzIKLSAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpj
b21wdXRlZEhvcml6b250YWxNYXJnaW4oZm9ybWF0dGluZ0NvbnRleHRSb290LCBob3Jpem9udGFs
Q29uc3RyYWludHMpOwotCi0gICAgcmV0dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7ICp3aWR0
aCwgeyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwX2x1KSwgY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDBfbHUpIH0gfTsKLX0KLQotQ29udGVudEhl
aWdodEFuZE1hcmdpbiBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmlubGluZUJs
b2NrQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRk
ZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAg
IEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7Ci0KLSAgICAvLyAxMC42LjIgSW5saW5lIHJl
cGxhY2VkIGVsZW1lbnRzLCBibG9jay1sZXZlbCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwg
ZmxvdywgJ2lubGluZS1ibG9jaycgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5k
IGZsb2F0aW5nIHJlcGxhY2VkIGVsZW1lbnRzCi0gICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2Vk
Qm94KCkpCi0gICAgICAgIHJldHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJn
aW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50
cywgeyB9LCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwotCi0gICAgLy8gMTAuNi42IENvbXBs
aWNhdGVkIGNhc2VzCi0gICAgLy8gLSAnSW5saW5lLWJsb2NrJywgbm9uLXJlcGxhY2VkIGVsZW1l
bnRzLgotICAgIHJldHVybiBjb21wbGljYXRlZENhc2VzKGxheW91dEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwotfQotCi19Ci19Ci0KLSNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5s
aW5lRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWJlNjVkYWQ1Y2M1ZjU2YjI5ZWIwNzAzZTZjZGM5NDM5
MGFjMmE3Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250
ZXh0UXVpcmtzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
LSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0g
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0
LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUg
IkxheW91dEJveEdlb21ldHJ5LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1JbmxpbmVMYXlvdXRVbml0IElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpRdWly
a3M6OmluaXRpYWxMaW5lSGVpZ2h0KCkgY29uc3QKLXsKLSAgICAvLyBOZWdhdGl2ZSBsaW5lSGVp
Z2h0IHZhbHVlIG1lYW5zIHRoZSBsaW5lLWhlaWdodCBpcyBub3Qgc2V0Ci0gICAgYXV0byYgcm9v
dCA9IGZvcm1hdHRpbmdDb250ZXh0KCkucm9vdCgpOwotICAgIGlmIChsYXlvdXRTdGF0ZSgpLmlu
U3RhbmRhcmRzTW9kZSgpIHx8ICFyb290LnN0eWxlKCkubGluZUhlaWdodCgpLmlzTmVnYXRpdmUo
KSkKLSAgICAgICAgcmV0dXJuIHJvb3Quc3R5bGUoKS5jb21wdXRlZExpbmVIZWlnaHQoKTsKLSAg
ICByZXR1cm4gcm9vdC5zdHlsZSgpLmZvbnRNZXRyaWNzKCkuZmxvYXRIZWlnaHQoKTsKLX0KLQot
Ym9vbCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjppbmxpbmVMZXZlbEJveEFmZmVj
dHNMaW5lQm94KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiBpbmxpbmVMZXZlbEJveCwg
Y29uc3QgTGluZUJveCYgbGluZUJveCkgY29uc3QKLXsKLSAgICBpZiAoaW5saW5lTGV2ZWxCb3gu
aXNMaW5lQnJlYWtCb3goKSkgewotICAgICAgICBpZiAobGF5b3V0U3RhdGUoKS5pblN0YW5kYXJk
c01vZGUoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAvLyBJbiBxdWlya3Mg
bW9kZSBsaW5lYnJlYWsgYm94ZXMgKDxicj4pIHN0b3AgYWZmZWN0aW5nIHRoZSBsaW5lIGJveCB3
aGVuIChhc3N1bWUgPGJyPiBpcyBuZXN0ZWQgZS5nLiA8c3BhbiBzdHlsZT0iZm9udC1zaXplOiAx
MDBweCI+PGJyPjwvc3Bhbj4pCi0gICAgICAgIC8vIDEuIHRoZSByb290IGlubGluZSBib3ggaGFz
IGNvbnRlbnQgPGRpdj5jb250ZW50PGJyPi9kaXY+Ci0gICAgICAgIC8vIDIuIHRoZXJlJ3MgYXQg
bGVhc3Qgb25lIGF0b21pYyBpbmxpbmUgbGV2ZWwgYm94IG9uIHRoZSBsaW5lIGUuZyA8ZGl2Pjxp
bWc+PGJyPjwvZGl2PiBvciA8ZGl2PjxzcGFuPjxpbWc+PC9zcGFuPjxicj48L2Rpdj4KLSAgICAg
ICAgLy8gMy4gdGhlcmUncyBhdCBsZWFzdCBvbmUgaW5saW5lIGJveCB3aXRoIGNvbnRlbnQgZS5n
LiA8ZGl2PjxzcGFuPmNvbnRlbnQ8L3NwYW4+PGJyPjwvZGl2PgotICAgICAgICBpZiAobGluZUJv
eC5yb290SW5saW5lQm94KCkuaGFzQ29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICBpZiAobGluZUJveC5oYXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGVpdGhlciBo
YXZlIG9ubHkgdGhlIDxicj4gb24gdGhlIGxpbmUgb3IgaW5saW5lIGJveGVzIHdpdGggb3Igd2l0
aG91dCBjb250ZW50LgotICAgICAgICBhdXRvJiBpbmxpbmVMZXZlbEJveGVzID0gbGluZUJveC5u
b25Sb290SW5saW5lTGV2ZWxCb3hlcygpOwotICAgICAgICBBU1NFUlQoIWlubGluZUxldmVsQm94
ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgaWYgKGlubGluZUxldmVsQm94ZXMuc2l6ZSgpID09IDEp
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZl
bEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgewotICAgICAgICAgICAg
Ly8gRmlsdGVyIG91dCBlbXB0eSBpbmxpbmUgYm94ZXMgZS5nLiA8ZGl2PjxzcGFuPjwvc3Bhbj48
c3Bhbj48L3NwYW4+PGJyPjwvZGl2PgotICAgICAgICAgICAgaWYgKGlubGluZUxldmVsQm94Lmlz
SW5saW5lQm94KCkgJiYgaW5saW5lTGV2ZWxCb3guaGFzQ29udGVudCgpKQotICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9
Ci0gICAgaWYgKGlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkpIHsKLSAgICAgICAgLy8gSW5s
aW5lIGJveGVzIChlLmcuIHJvb3QgaW5saW5lIGJveCBvciA8c3Bhbj4pIGFmZmVjdHMgbGluZSBi
b3hlcyBlaXRoZXIgdGhyb3VnaCB0aGUgc3RydXQgb3IgYWN0dWFsIGNvbnRlbnQuCi0gICAgICAg
IGF1dG8gaW5saW5lQm94SGFzSW1hZ2luYXJ5U3RydXQgPSBsYXlvdXRTdGF0ZSgpLmluU3RhbmRh
cmRzTW9kZSgpOwotICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3guaGFzQ29udGVudCgpIHx8IGlu
bGluZUJveEhhc0ltYWdpbmFyeVN0cnV0KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
ICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc1Jvb3RJbmxpbmVCb3goKSkgewotICAgICAgICAgICAg
YXV0byBzaG91bGRSb290SW5saW5lQm94V2l0aE5vQ29udGVudFN0cmV0Y2hMaW5lQm94ID0gWyZd
IHsKLSAgICAgICAgICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5bGUo
KS5saW5lSGVpZ2h0KCkuaXNOZWdhdGl2ZSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHJvb3QgaW5saW5lIGJveCB3aXRoIG5vbi1p
bml0aWFsIGxpbmUgaGVpZ2h0IHZhbHVlIHN0cmV0Y2hlcyB0aGUgbGluZSBib3ggZXZlbiB3aGVu
IHJvb3QgaGFzIG5vIGNvbnRlbnQKLSAgICAgICAgICAgICAgICAvLyBidXQgdGhlcmUncyBhdCBs
ZWFzdCBvbmUgaW5saW5lIGJveCB3aXRoIGNvbnRlbnQuCi0gICAgICAgICAgICAgICAgLy8gZS5n
LiA8ZGl2IHN0eWxlPSJsaW5lLWhlaWdodDogMTAwcHg7Ij48c3Bhbj5jb250ZW50PC9zcGFuPjwv
ZGl2PgotICAgICAgICAgICAgICAgIGlmICghbGluZUJveC5oYXNJbmxpbmVCb3goKSkKLSAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byYg
aW5saW5lTGV2ZWxCb3ggOiBsaW5lQm94Lm5vblJvb3RJbmxpbmVMZXZlbEJveGVzKCkpIHsKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKCFpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChp
bmxpbmVMZXZlbEJveC5oYXNDb250ZW50KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHJldHVybiBzaG91bGRSb290SW5saW5lQm94
V2l0aE5vQ29udGVudFN0cmV0Y2hMaW5lQm94KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm9u
LXJvb3QgaW5saW5lIGJveGVzIChlLmcuIDxzcGFuPikuCi0gICAgICAgIGF1dG8mIGJveEdlb21l
dHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVMZXZlbEJveC5s
YXlvdXRCb3goKSk7Ci0gICAgICAgIGlmIChib3hHZW9tZXRyeS5ob3Jpem9udGFsQm9yZGVyKCkg
fHwgYm94R2VvbWV0cnkuaG9yaXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKSB7Ci0gICAg
ICAgICAgICAvLyBIb3Jpem9udGFsIGJvcmRlciBhbmQgcGFkZGluZyBtYWtlIHRoZSBpbmxpbmUg
Ym94IHN0cmV0Y2ggdGhlIGxpbmUgKGUuZy4gPHNwYW4gc3R5bGU9InBhZGRpbmc6IDEwcHg7Ij48
L3NwYW4+KS4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5saW5l
TGV2ZWxCb3goKSkgewotICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCku
aGVpZ2h0KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgLy8gV2hpbGUgaW4g
cHJhY3RpY2Ugd2hlbiB0aGUgbmVnYXRpdmUgdmVydGljYWwgbWFyZ2luIG1ha2VzIHRoZSBsYXlv
dXQgYm91bmRzIGVtcHR5IChlLmc6IGhlaWdodDogMTAwcHg7IG1hcmdpbi10b3A6IC0xMDBweDsp
LCBhbmQgdGhpcyBpbmxpbmUKLSAgICAgICAgLy8gbGV2ZWwgYm94IGNvbnRyaWJ1dGVzIDBweCB0
byB0aGUgbGluZSBib3ggaGVpZ2h0LCBpdCBzdGlsbCBuZWVkcyB0byBiZSB0YWtlbiBpbnRvIGFj
Y291bnQgd2hpbGUgY29tcHV0aW5nIGxpbmUgYm94IGdlb21ldHJpZXMuCi0gICAgICAgIGF1dG8m
IGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVM
ZXZlbEJveC5sYXlvdXRCb3goKSk7Ci0gICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5C
ZWZvcmUoKSB8fCBib3hHZW9tZXRyeS5tYXJnaW5BZnRlcigpOwotICAgIH0KLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KLWJvb2wgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6aGFzU29m
dFdyYXBPcHBvcnR1bml0eUF0SW1hZ2UoKSBjb25zdAotewotICAgIHJldHVybiAhZm9ybWF0dGlu
Z0NvbnRleHQoKS5yb290KCkuaXNUYWJsZUNlbGwoKTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZv
cm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCA4N2I2Yzk1YzE1NDVkNjQ1Y2RiZDRiMDU0NmFlYzE4NmNmM2NjZjVkLi4wMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAKKysrIC9kZXYvbnVsbApA
QCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1
ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRU
SU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1uYW1l
c3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9D
QVRFRF9JTVBMKElubGluZUZvcm1hdHRpbmdTdGF0ZSk7Ci0KLUlubGluZUZvcm1hdHRpbmdTdGF0
ZTo6SW5saW5lRm9ybWF0dGluZ1N0YXRlKFJlZjxGbG9hdGluZ1N0YXRlPiYmIGZsb2F0aW5nU3Rh
dGUsIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKLSAgICA6IEZvcm1hdHRpbmdTdGF0ZShXVEZN
b3ZlKGZsb2F0aW5nU3RhdGUpLCBUeXBlOjpJbmxpbmUsIGxheW91dFN0YXRlKQotewotfQotCi1J
bmxpbmVGb3JtYXR0aW5nU3RhdGU6On5JbmxpbmVGb3JtYXR0aW5nU3RhdGUoKQotewotfQotCi19
Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDM2M2IxNjAzNjg0ZTU5NDAwN2EwODI3YmM5NGNiOTdiNGJhMDE3NGYuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgKKysrIC9k
ZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMK
LSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAq
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICog
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0j
aWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb3JtYXR0
aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJJbmxpbmVJdGVtLmgiCi0jaW5jbHVkZSAiSW5saW5lTGlu
ZUJveC5oIgotI2luY2x1ZGUgIklubGluZUxpbmVHZW9tZXRyeS5oIgotI2luY2x1ZGUgIklubGlu
ZUxpbmVSdW4uaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+Ci0KLW5hbWVzcGFjZSBXZWJD
b3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi11c2luZyBJbmxpbmVJdGVtcyA9IFZlY3RvcjxJ
bmxpbmVJdGVtPjsKLXVzaW5nIElubGluZUxpbmVzID0gVmVjdG9yPElubGluZUxpbmVHZW9tZXRy
eT47Ci11c2luZyBJbmxpbmVMaW5lQm94ZXMgPSBWZWN0b3I8TGluZUJveD47Ci11c2luZyBJbmxp
bmVMaW5lUnVucyA9IFZlY3RvcjxMaW5lUnVuPjsKLQotLy8gSW5saW5lRm9ybWF0dGluZ1N0YXRl
IGhvbGRzIHRoZSBzdGF0ZSBmb3IgYSBwYXJ0aWN1bGFyIGlubGluZSBmb3JtYXR0aW5nIGNvbnRl
eHQgdHJlZS4KLWNsYXNzIElubGluZUZvcm1hdHRpbmdTdGF0ZSA6IHB1YmxpYyBGb3JtYXR0aW5n
U3RhdGUgewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoSW5saW5lRm9ybWF0dGluZ1N0YXRl
KTsKLXB1YmxpYzoKLSAgICBJbmxpbmVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+
JiYsIExheW91dFN0YXRlJik7Ci0gICAgfklubGluZUZvcm1hdHRpbmdTdGF0ZSgpOwotCi0gICAg
SW5saW5lSXRlbXMmIGlubGluZUl0ZW1zKCkgeyByZXR1cm4gbV9pbmxpbmVJdGVtczsgfQotICAg
IGNvbnN0IElubGluZUl0ZW1zJiBpbmxpbmVJdGVtcygpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5l
SXRlbXM7IH0KLSAgICB2b2lkIGFkZElubGluZUl0ZW0oSW5saW5lSXRlbSYmIGlubGluZUl0ZW0p
IHsgbV9pbmxpbmVJdGVtcy5hcHBlbmQoV1RGTW92ZShpbmxpbmVJdGVtKSk7IH0KLQotICAgIGNv
bnN0IElubGluZUxpbmVzJiBsaW5lcygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZXM7IH0KLSAgICBJ
bmxpbmVMaW5lcyYgbGluZXMoKSB7IHJldHVybiBtX2xpbmVzOyB9Ci0gICAgdm9pZCBhZGRMaW5l
KGNvbnN0IElubGluZUxpbmVHZW9tZXRyeSYgbGluZSkgeyBtX2xpbmVzLmFwcGVuZChsaW5lKTsg
fQotCi0gICAgY29uc3QgSW5saW5lTGluZUJveGVzJiBsaW5lQm94ZXMoKSBjb25zdCB7IHJldHVy
biBtX2xpbmVCb3hlczsgfQotICAgIHZvaWQgYWRkTGluZUJveChMaW5lQm94JiYgbGluZUJveCkg
eyBtX2xpbmVCb3hlcy5hcHBlbmQoV1RGTW92ZShsaW5lQm94KSk7IH0KLQotICAgIGNvbnN0IElu
bGluZUxpbmVSdW5zJiBsaW5lUnVucygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZVJ1bnM7IH0KLSAg
ICBJbmxpbmVMaW5lUnVucyYgbGluZVJ1bnMoKSB7IHJldHVybiBtX2xpbmVSdW5zOyB9Ci0gICAg
dm9pZCBhZGRMaW5lUnVuKExpbmVSdW4mJiBydW4pIHsgbV9saW5lUnVucy5hcHBlbmQoV1RGTW92
ZShydW4pKTsgfQotCi0gICAgdm9pZCBzZXRDbGVhckdhcEFmdGVyTGFzdExpbmUoSW5saW5lTGF5
b3V0VW5pdCB2ZXJ0aWNhbEdhcCk7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBjbGVhckdhcEFmdGVy
TGFzdExpbmUoKSBjb25zdCB7IHJldHVybiBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZTsgfQotCi0g
ICAgdm9pZCBjbGVhckxpbmVBbmRSdW5zKCk7Ci0gICAgdm9pZCBzaHJpbmtUb0ZpdCgpOwotCi1w
cml2YXRlOgotICAgIC8vIENhY2hlYWJsZSBpbnB1dCB0byBsaW5lIGxheW91dC4KLSAgICBJbmxp
bmVJdGVtcyBtX2lubGluZUl0ZW1zOwotICAgIElubGluZUxpbmVzIG1fbGluZXM7Ci0gICAgSW5s
aW5lTGluZUJveGVzIG1fbGluZUJveGVzOwotICAgIElubGluZUxpbmVSdW5zIG1fbGluZVJ1bnM7
Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZSB7IDAgfTsKLX07
Ci0KLWlubGluZSB2b2lkIElubGluZUZvcm1hdHRpbmdTdGF0ZTo6c2V0Q2xlYXJHYXBBZnRlckxh
c3RMaW5lKElubGluZUxheW91dFVuaXQgdmVydGljYWxHYXApCi17Ci0gICAgQVNTRVJUKHZlcnRp
Y2FsR2FwID49IDApOwotICAgIG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lID0gdmVydGljYWxHYXA7
Ci19Ci0KLWlubGluZSB2b2lkIElubGluZUZvcm1hdHRpbmdTdGF0ZTo6Y2xlYXJMaW5lQW5kUnVu
cygpCi17Ci0gICAgbV9saW5lcy5jbGVhcigpOwotICAgIG1fbGluZUJveGVzLmNsZWFyKCk7Ci0g
ICAgbV9saW5lUnVucy5jbGVhcigpOwotICAgIG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lID0geyB9
OwotfQotCi1pbmxpbmUgdm9pZCBJbmxpbmVGb3JtYXR0aW5nU3RhdGU6OnNocmlua1RvRml0KCkK
LXsKLSAgICBtX2lubGluZUl0ZW1zLnNocmlua1RvRml0KCk7Ci0gICAgbV9saW5lcy5zaHJpbmtU
b0ZpdCgpOwotICAgIG1fbGluZUJveGVzLnNocmlua1RvRml0KCk7Ci0gICAgbV9saW5lUnVucy5z
aHJpbmtUb0ZpdCgpOwotfQotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VU
X0ZPUk1BVFRJTkdfU1RBVEUoSW5saW5lRm9ybWF0dGluZ1N0YXRlLCBpc0lubGluZUZvcm1hdHRp
bmdTdGF0ZSgpKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZUl0ZW0uY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lSXRlbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDA2MDZmMTg0OWI1YTlhNjE4NDlhMjBlYmQ0MTk2NWE2YWRkOGVjODYuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lSXRlbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MiAr
MCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgot
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGlu
ZUl0ZW0uaCIKLQotI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgiCi0KLSNpZiBFTkFCTEUoTEFZ
T1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNl
IExheW91dCB7Ci0KLXN0cnVjdCBTYW1lU2l6ZUFzSW5saW5lSXRlbSB7Ci0gICAgdm9pZCogbGF5
b3V0Qm94OwotICAgIHVpbnQ4X3QgZW51bTE7Ci0gICAgdWludDhfdCBlbnVtMjsKLSAgICBib29s
IHdpZHRoQm9vbDsKLSAgICBib29sIHNvZnRIeXBoZW5Cb29sOwotICAgIGJvb2wgaXNXb3JkU2Vw
YXJhdG9yOwotICAgIElubGluZUxheW91dFVuaXQgd2lkdGg7Ci0gICAgdW5zaWduZWQgc3RhcnQ7
Ci0gICAgdW5zaWduZWQgbGVuZ3RoOwotfTsKLQotc3RhdGljX2Fzc2VydChzaXplb2YoSW5saW5l
SXRlbSkgPT0gc2l6ZW9mKFNhbWVTaXplQXNJbmxpbmVJdGVtKSwgIiIpOwotCi19Ci19Ci0jZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUl0ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZUl0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhZTI0YTYxMjY4NDU4ODc0
YzcyMDk5NDM4MmJhYjgyOTFkZGM0ZC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVJdGVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0
IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0g
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0g
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3By
YWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2lu
Y2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dFVuaXRzLmgiCi0KLW5hbWVzcGFj
ZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBJbmxpbmVJdGVtIHsKLXB1
YmxpYzoKLSAgICBlbnVtIGNsYXNzIFR5cGUgOiB1aW50OF90IHsgVGV4dCwgSGFyZExpbmVCcmVh
aywgU29mdExpbmVCcmVhaywgV29yZEJyZWFrT3Bwb3J0dW5pdHksIEJveCwgRmxvYXQsIElubGlu
ZUJveFN0YXJ0LCBJbmxpbmVCb3hFbmQgfTsKLSAgICBJbmxpbmVJdGVtKGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBUeXBlKTsKLQotICAgIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsg
fQotICAgIGNvbnN0IEJveCYgbGF5b3V0Qm94KCkgY29uc3QgeyByZXR1cm4gKm1fbGF5b3V0Qm94
OyB9Ci0gICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbGF5b3V0
Qm94KCkuc3R5bGUoKTsgfQotCi0gICAgYm9vbCBpc1RleHQoKSBjb25zdCB7IHJldHVybiB0eXBl
KCkgPT0gVHlwZTo6VGV4dDsgfQotICAgIGJvb2wgaXNCb3goKSBjb25zdCB7IHJldHVybiB0eXBl
KCkgPT0gVHlwZTo6Qm94OyB9Ci0gICAgYm9vbCBpc0Zsb2F0KCkgY29uc3QgeyByZXR1cm4gdHlw
ZSgpID09IFR5cGU6OkZsb2F0OyB9Ci0gICAgYm9vbCBpc0xpbmVCcmVhaygpIGNvbnN0IHsgcmV0
dXJuIGlzU29mdExpbmVCcmVhaygpIHx8IGlzSGFyZExpbmVCcmVhaygpOyB9Ci0gICAgYm9vbCBp
c1dvcmRCcmVha09wcG9ydHVuaXR5KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6Oldv
cmRCcmVha09wcG9ydHVuaXR5OyB9Ci0gICAgYm9vbCBpc1NvZnRMaW5lQnJlYWsoKSBjb25zdCB7
IHJldHVybiB0eXBlKCkgPT0gVHlwZTo6U29mdExpbmVCcmVhazsgfQotICAgIGJvb2wgaXNIYXJk
TGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OkhhcmRMaW5lQnJlYWs7
IH0KLSAgICBib29sIGlzSW5saW5lQm94U3RhcnQoKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0g
VHlwZTo6SW5saW5lQm94U3RhcnQ7IH0KLSAgICBib29sIGlzSW5saW5lQm94RW5kKCkgY29uc3Qg
eyByZXR1cm4gdHlwZSgpID09IFR5cGU6OklubGluZUJveEVuZDsgfQotCi1wcml2YXRlOgotICAg
IGNvbnN0IEJveCogbV9sYXlvdXRCb3ggeyBudWxscHRyIH07Ci0gICAgVHlwZSBtX3R5cGUgeyB9
OwotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gRm9yIElubGluZVRleHRJdGVtCi0gICAgZW51bSBjbGFz
cyBUZXh0SXRlbVR5cGUgIDogdWludDhfdCB7IFVuZGVmaW5lZCwgV2hpdGVzcGFjZSwgTm9uV2hp
dGVzcGFjZSB9OwotICAgIFRleHRJdGVtVHlwZSBtX3RleHRJdGVtVHlwZSB7IFRleHRJdGVtVHlw
ZTo6VW5kZWZpbmVkIH07Ci0gICAgYm9vbCBtX2hhc1dpZHRoIHsgZmFsc2UgfTsKLSAgICBib29s
IG1faGFzVHJhaWxpbmdTb2Z0SHlwaGVuIHsgZmFsc2UgfTsKLSAgICBib29sIG1faXNXb3JkU2Vw
YXJhdG9yIHsgZmFsc2UgfTsKLSAgICBJbmxpbmVMYXlvdXRVbml0IG1fd2lkdGggeyB9OwotICAg
IHVuc2lnbmVkIG1fbGVuZ3RoIHsgMCB9OwotCi0gICAgLy8gRm9yIElubGluZVRleHRJdGVtIGFu
ZCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbQotICAgIHVuc2lnbmVkIG1fc3RhcnRPclBvc2l0aW9u
IHsgMCB9OwotfTsKLQotaW5saW5lIElubGluZUl0ZW06OklubGluZUl0ZW0oY29uc3QgQm94JiBs
YXlvdXRCb3gsIFR5cGUgdHlwZSkKLSAgICA6IG1fbGF5b3V0Qm94KCZsYXlvdXRCb3gpCi0gICAg
LCBtX3R5cGUodHlwZSkKLXsKLX0KLQotI2RlZmluZSBTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0lO
TElORV9JVEVNKFRvVmFsdWVUeXBlTmFtZSwgcHJlZGljYXRlKSBcCi1TUEVDSUFMSVpFX1RZUEVf
VFJBSVRTX0JFR0lOKFdlYkNvcmU6OkxheW91dDo6VG9WYWx1ZVR5cGVOYW1lKSBcCi0gICAgc3Rh
dGljIGJvb2wgaXNUeXBlKGNvbnN0IFdlYkNvcmU6OkxheW91dDo6SW5saW5lSXRlbSYgaW5saW5l
SXRlbSkgeyByZXR1cm4gaW5saW5lSXRlbS5wcmVkaWNhdGU7IH0gXAotU1BFQ0lBTElaRV9UWVBF
X1RSQUlUU19FTkQoKQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUuY3BwIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDViMzM1YmM0MGVlZmM5YzI4MzNkNGQxMzdiNGE1ODQ3ODcwNzUyZmMuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAKKysrIC9kZXYvbnVsbApA
QCAtMSw1MzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFy
ZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNs
dWRlICJJbmxpbmVMaW5lLmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKLQotI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCi0jaW5jbHVkZSAiSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQuaCIKLSNpbmNsdWRlICJJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oIgotI2luY2x1
ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAiUnVudGltZUVuYWJsZWRGZWF0dXJl
cy5oIgotI2luY2x1ZGUgIlRleHRGbGFncy5oIgotI2luY2x1ZGUgIlRleHRVdGlsLmgiCi0jaW5j
bHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFt
ZXNwYWNlIExheW91dCB7Ci0KLUxpbmU6OkxpbmUoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQmIGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQotICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dChpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICAsIG1fdHJpbW1hYmxlVHJhaWxpbmdD
b250ZW50KG1fcnVucykKLXsKLX0KLQotTGluZTo6fkxpbmUoKQotewotfQotCi12b2lkIExpbmU6
OmluaXRpYWxpemUoKQotewotICAgIG1fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50ID0g
MDsKLSAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggPSB7IH07Ci0gICAgbV9ydW5zLmNsZWFyKCk7
Ci0gICAgbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IHsgfTsKLSAgICBtX3RyaW1tYWJsZVRy
YWlsaW5nQ29udGVudC5yZXNldCgpOwotfQotCi12b2lkIExpbmU6OnJlbW92ZUNvbGxhcHNpYmxl
Q29udGVudChJbmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKQotewotICAgIHJl
bW92ZVRyYWlsaW5nVHJpbW1hYmxlQ29udGVudCgpOwotICAgIHZpc3VhbGx5Q29sbGFwc2VQcmVX
cmFwT3ZlcmZsb3dDb250ZW50KGV4dHJhSG9yaXpvbnRhbFNwYWNlKTsKLX0KLQotdm9pZCBMaW5l
OjphcHBseVJ1bkV4cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNl
KQotewotICAgIEFTU0VSVChmb3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKS5zdHlsZSgpLnRleHRB
bGlnbigpID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkpOwotICAgIC8vIFRleHQgaXMganVzdGlm
aWVkIGFjY29yZGluZyB0byB0aGUgbWV0aG9kIHNwZWNpZmllZCBieSB0aGUgdGV4dC1qdXN0aWZ5
IHByb3BlcnR5LAotICAgIC8vIGluIG9yZGVyIHRvIGV4YWN0bHkgZmlsbCB0aGUgbGluZSBib3gu
IFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRleHQtYWxpZ24tbGFzdCwKLSAgICAvLyB0
aGUgbGFzdCBsaW5lIGJlZm9yZSBhIGZvcmNlZCBicmVhayBvciB0aGUgZW5kIG9mIHRoZSBibG9j
ayBpcyBzdGFydC1hbGlnbmVkLgotICAgIGlmIChtX3J1bnMuaXNFbXB0eSgpIHx8IG1fcnVucy5s
YXN0KCkuaXNMaW5lQnJlYWsoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYXV0byBleHBhbnNp
b25PcHBvcnR1bml0eUNvdW50ID0gMDsKLSAgICBSdW4qIGxhc3RSdW5XaXRoQ29udGVudCA9IG51
bGxwdHI7Ci0gICAgLy8gQ29sbGVjdCBhbmQgZGlzdHJpYnV0ZSB0aGUgZXhwYW5zaW9uIG9wcG9y
dHVuaXRpZXMuCi0gICAgZm9yIChhdXRvJiBydW4gOiBtX3J1bnMpIHsKLSAgICAgICAgZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudCArPSBydW4uZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCgpOwot
ICAgICAgICBpZiAocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc0JveCgpKQotICAgICAgICAgICAgbGFz
dFJ1bldpdGhDb250ZW50ID0gJnJ1bjsKLSAgICB9Ci0gICAgLy8gTmVlZCB0byBmaXggdXAgdGhl
IGxhc3QgcnVuJ3MgdHJhaWxpbmcgZXhwYW5zaW9uLgotICAgIGlmIChsYXN0UnVuV2l0aENvbnRl
bnQgJiYgbGFzdFJ1bldpdGhDb250ZW50LT5oYXNFeHBhbnNpb25PcHBvcnR1bml0eSgpKSB7Ci0g
ICAgICAgIC8vIFR1cm4gb2ZmIHRoZSB0cmFpbGluZyBiaXRzIGZpcnN0IGFuZCBhZGQgdGhlIGZv
cmJpZCB0cmFpbGluZyBleHBhbnNpb24uCi0gICAgICAgIGF1dG8gbGVhZGluZ0V4cGFuc2lvbiA9
IGxhc3RSdW5XaXRoQ29udGVudC0+ZXhwYW5zaW9uQmVoYXZpb3IoKSAmIExlZnRFeHBhbnNpb25N
YXNrOwotICAgICAgICBsYXN0UnVuV2l0aENvbnRlbnQtPnNldEV4cGFuc2lvbkJlaGF2aW9yKGxl
YWRpbmdFeHBhbnNpb24gfCBGb3JiaWRSaWdodEV4cGFuc2lvbik7Ci0gICAgfQotICAgIC8vIEFu
eXRoaW5nIHRvIGRpc3RyaWJ1dGU/Ci0gICAgaWYgKCFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50
IHx8ICFleHRyYUhvcml6b250YWxTcGFjZSkKLSAgICAgICAgcmV0dXJuOwotICAgIC8vIERpc3Ry
aWJ1dGUgdGhlIGV4dHJhIHNwYWNlLgotICAgIGF1dG8gZXhwYW5zaW9uVG9EaXN0cmlidXRlID0g
ZXh0cmFIb3Jpem9udGFsU3BhY2UgLyBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50OwotICAgIGF1
dG8gYWNjdW11bGF0ZWRFeHBhbnNpb24gPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAgICBmb3Ig
KGF1dG8mIHJ1biA6IG1fcnVucykgewotICAgICAgICAvLyBFeHBhbmQgYW5kIG1vdmUgcnVucyBi
eSB0aGUgYWNjdW11bGF0ZWQgZXhwYW5zaW9uLgotICAgICAgICBydW4ubW92ZUhvcml6b250YWxs
eShhY2N1bXVsYXRlZEV4cGFuc2lvbik7Ci0gICAgICAgIGlmICghcnVuLmhhc0V4cGFuc2lvbk9w
cG9ydHVuaXR5KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgQVNTRVJUKHJ1bi5l
eHBhbnNpb25PcHBvcnR1bml0eUNvdW50KCkpOwotICAgICAgICBhdXRvIGNvbXB1dGVkRXhwYW5z
aW9uID0gZXhwYW5zaW9uVG9EaXN0cmlidXRlICogcnVuLmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQoKTsKLSAgICAgICAgLy8gRklYTUU6IENoZWNrIHdoeSB3ZSBuZWVkIHRvIHNldCBib3RoLgot
ICAgICAgICBydW4uc2V0SG9yaXpvbnRhbEV4cGFuc2lvbihjb21wdXRlZEV4cGFuc2lvbik7Ci0g
ICAgICAgIHJ1bi5zaHJpbmtIb3Jpem9udGFsbHkoLWNvbXB1dGVkRXhwYW5zaW9uKTsKLSAgICAg
ICAgYWNjdW11bGF0ZWRFeHBhbnNpb24gKz0gY29tcHV0ZWRFeHBhbnNpb247Ci0gICAgfQotICAg
IC8vIENvbnRlbnQgZ3Jvd3MgYXMgcnVucyBleHBhbmQuCi0gICAgbV9jb250ZW50TG9naWNhbFdp
ZHRoICs9IGFjY3VtdWxhdGVkRXhwYW5zaW9uOwotfQotCi12b2lkIExpbmU6OnJlbW92ZVRyYWls
aW5nVHJpbW1hYmxlQ29udGVudCgpCi17Ci0gICAgaWYgKG1fdHJpbW1hYmxlVHJhaWxpbmdDb250
ZW50LmlzRW1wdHkoKSB8fCBtX3J1bnMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICAvLyBDb21wbGV4IGxpbmUgbGF5b3V0IHF1aXJrOiBrZWVwIHRoZSB0cmFpbGluZyB3aGl0ZXNw
YWNlIGFyb3VuZCB3aGVuIGl0IGlzIGZvbGxvd2VkIGJ5IGEgbGluZSBicmVhaywgdW5sZXNzIHRo
ZSBjb250ZW50IG92ZXJmbG93cyB0aGUgbGluZS4KLSAgICBpZiAoUnVudGltZUVuYWJsZWRGZWF0
dXJlczo6c2hhcmVkRmVhdHVyZXMoKS5sYXlvdXRGb3JtYXR0aW5nQ29udGV4dEludGVncmF0aW9u
RW5hYmxlZCgpKSB7Ci0gICAgICAgIGF1dG8gaXNUZXh0QWxpZ25SaWdodCA9IFsmXSB7Ci0gICAg
ICAgICAgICBhdXRvIHRleHRBbGlnbiA9IGZvcm1hdHRpbmdDb250ZXh0KCkucm9vdCgpLnN0eWxl
KCkudGV4dEFsaWduKCk7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dEFsaWduID09IFRleHRBbGln
bk1vZGU6OlJpZ2h0Ci0gICAgICAgICAgICAgICAgfHwgdGV4dEFsaWduID09IFRleHRBbGlnbk1v
ZGU6OldlYktpdFJpZ2h0Ci0gICAgICAgICAgICAgICAgfHwgdGV4dEFsaWduID09IFRleHRBbGln
bk1vZGU6OkVuZDsKLSAgICAgICAgICAgIH0oKTsKLQotICAgICAgICBpZiAobV9ydW5zLmxhc3Qo
KS5pc0xpbmVCcmVhaygpICYmICFpc1RleHRBbGlnblJpZ2h0KSB7Ci0gICAgICAgICAgICBtX3Ry
aW1tYWJsZVRyYWlsaW5nQ29udGVudC5yZXNldCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgbV9jb250ZW50TG9naWNhbFdpZHRoIC09IG1fdHJpbW1hYmxl
VHJhaWxpbmdDb250ZW50LnJlbW92ZSgpOwotfQotCi12b2lkIExpbmU6OnZpc3VhbGx5Q29sbGFw
c2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFs
U3BhY2UpCi17Ci0gICAgQVNTRVJUKG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmlzRW1wdHko
KSk7Ci0gICAgLy8gSWYgd2hpdGUtc3BhY2UgaXMgc2V0IHRvIHByZS13cmFwLCB0aGUgVUEgbXVz
dAotICAgIC8vIC4uLgotICAgIC8vIEl0IG1heSBhbHNvIHZpc3VhbGx5IGNvbGxhcHNlIHRoZSBj
aGFyYWN0ZXIgYWR2YW5jZSB3aWR0aHMgb2YgYW55IHRoYXQgd291bGQgb3RoZXJ3aXNlIG92ZXJm
bG93LgotICAgIGF1dG8gb3ZlcmZsb3dXaWR0aCA9IC1leHRyYUhvcml6b250YWxTcGFjZTsKLSAg
ICBpZiAob3ZlcmZsb3dXaWR0aCA8PSAwKQotICAgICAgICByZXR1cm47Ci0gICAgLy8gTGV0J3Mg
anVzdCBmaW5kIHRoZSB0cmFpbGluZyBwcmUtd3JhcCB3aGl0ZXNwYWNlIGNvbnRlbnQgZm9yIG5v
dyAoZS5nIGNoZWNrIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB0cmFpbGluZyBydW5zIHdpdGgKLSAg
ICAvLyBkaWZmZXJlbnQgc2V0IG9mIHdoaXRlLXNwYWNlIHZhbHVlcyBhbmQgZGVjaWRlIGlmIHRo
ZSBpbi1iZXR3ZWVuIHByZS13cmFwIGNvbnRlbnQgc2hvdWxkIGJlIGNvbGxhcHNlZCBhcyB3ZWxs
LikKLSAgICBJbmxpbmVMYXlvdXRVbml0IHRyaW1tZWRDb250ZW50V2lkdGggPSAwOwotICAgIGZv
ciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShtX3J1bnMpKSB7Ci0gICAgICAg
IGlmIChydW4uc3R5bGUoKS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6UHJlV3JhcCkgewot
ICAgICAgICAgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBwcmUtd3JhcCB0cmFpbGlu
ZyBjb250ZW50LgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYXV0byBw
cmVXcmFwVmlzdWFsbHlDb2xsYXBzaWJsZUlubGluZUl0ZW0gPSBydW4uaXNJbmxpbmVCb3hTdGFy
dCgpIHx8IHJ1bi5pc0lubGluZUJveEVuZCgpIHx8IHJ1bi5oYXNUcmFpbGluZ1doaXRlc3BhY2Uo
KTsKLSAgICAgICAgaWYgKCFwcmVXcmFwVmlzdWFsbHlDb2xsYXBzaWJsZUlubGluZUl0ZW0pCi0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgQVNTRVJUKCFydW4uaGFzQ29sbGFwc2libGVUcmFp
bGluZ1doaXRlc3BhY2UoKSk7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lk
dGggPSB7IH07Ci0gICAgICAgIGlmIChydW4uaXNUZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIEZJ
WE1FOiBXZSBzaG91bGQgYWx3YXlzIGNvbGxhcHNlIHRoZSBydW4gYXQgYSBnbHlwaCBib3VuZGFy
eSBhcyB0aGUgc3BlYyBpbmRpY2F0ZXM6ICJjb2xsYXBzZSB0aGUgY2hhcmFjdGVyIGFkdmFuY2Ug
d2lkdGhzIG9mIGFueSB0aGF0IHdvdWxkIG90aGVyd2lzZSBvdmVyZmxvdyIKLSAgICAgICAgICAg
IC8vIGFuZCB0aGUgdHJpbW1lZCB3aWR0aCBzaG91bGQgYmUgY2FwcGVkIGF0IHN0ZDo6bWluKHJ1
bi50cmFpbGluZ1doaXRlc3BhY2VXaWR0aCgpLCBvdmVyZmxvd1dpZHRoKSBmb3IgdGV4dCBydW5z
LiBCb3RoIEZGIGFuZCBDaHJvbWUgYWdyZWUuCi0gICAgICAgICAgICB0cmltbWFibGVXaWR0aCA9
IHJ1bi50cmFpbGluZ1doaXRlc3BhY2VXaWR0aCgpOwotICAgICAgICAgICAgcnVuLnZpc3VhbGx5
Q29sbGFwc2VUcmFpbGluZ1doaXRlc3BhY2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgIHRyaW1tYWJsZVdpZHRoID0gcnVuLmxvZ2ljYWxXaWR0aCgpOwotICAgICAgICAgICAgcnVu
LnNocmlua0hvcml6b250YWxseSh0cmltbWFibGVXaWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAg
dHJpbW1lZENvbnRlbnRXaWR0aCArPSB0cmltbWFibGVXaWR0aDsKLSAgICAgICAgb3ZlcmZsb3dX
aWR0aCAtPSB0cmltbWFibGVXaWR0aDsKLSAgICAgICAgaWYgKG92ZXJmbG93V2lkdGggPD0gMCkK
LSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggLT0g
dHJpbW1lZENvbnRlbnRXaWR0aDsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmQoY29uc3QgSW5saW5l
SXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAg
aWYgKGlubGluZUl0ZW0uaXNUZXh0KCkpCi0gICAgICAgIGFwcGVuZFRleHRDb250ZW50KGRvd25j
YXN0PElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKSwgbG9naWNhbFdpZHRoKTsKLSAgICBlbHNl
IGlmIChpbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkpCi0gICAgICAgIGFwcGVuZExpbmVCcmVhayhp
bmxpbmVJdGVtKTsKLSAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5p
dHkoKSkKLSAgICAgICAgYXBwZW5kV29yZEJyZWFrT3Bwb3J0dW5pdHkoaW5saW5lSXRlbSk7Ci0g
ICAgZWxzZSBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkpCi0gICAgICAgIGFwcGVu
ZElubGluZUJveFN0YXJ0KGlubGluZUl0ZW0sIGxvZ2ljYWxXaWR0aCk7Ci0gICAgZWxzZSBpZiAo
aW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQotICAgICAgICBhcHBlbmRJbmxpbmVCb3hFbmQo
aW5saW5lSXRlbSwgbG9naWNhbFdpZHRoKTsKLSAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmxheW91
dEJveCgpLmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgYXBwZW5kUmVwbGFjZWRJbmxpbmVMZXZl
bEJveChpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgpOwotICAgIGVsc2UgaWYgKGlubGluZUl0ZW0u
aXNCb3goKSkKLSAgICAgICAgYXBwZW5kTm9uUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJ
dGVtLCBsb2dpY2FsV2lkdGgpOwotICAgIGVsc2UKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7Ci19Ci0KLXZvaWQgTGluZTo6YXBwZW5kTm9uQnJlYWthYmxlU3BhY2UoY29uc3QgSW5saW5l
SXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0s
IGxvZ2ljYWxMZWZ0LCBsb2dpY2FsV2lkdGggfSk7Ci0gICAgbV9jb250ZW50TG9naWNhbFdpZHRo
ICs9IGxvZ2ljYWxXaWR0aDsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmRJbmxpbmVCb3hTdGFydChj
b25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0
aCkKLXsKLSAgICAvLyBUaGlzIGlzIHJlYWxseSBqdXN0IGEgcGxhY2Vob2xkZXIgdG8gbWFyayB0
aGUgc3RhcnQgb2YgdGhlIGlubGluZSBib3ggPHNwYW4+LgotICAgIGF1dG8mIGJveEdlb21ldHJ5
ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVJdGVtLmxheW91dEJv
eCgpKTsKLSAgICBhdXRvIGFkanVzdGVkUnVuU3RhcnQgPSBjb250ZW50TG9naWNhbFJpZ2h0KCkg
KyBzdGQ6Om1pbihib3hHZW9tZXRyeS5tYXJnaW5TdGFydCgpLCAwX2x1KTsKLSAgICArK21fbm9u
U3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50OwotICAgIGFwcGVuZE5vbkJyZWFrYWJsZVNwYWNl
KGlubGluZUl0ZW0sIGFkanVzdGVkUnVuU3RhcnQsIGxvZ2ljYWxXaWR0aCk7Ci19Ci0KLXZvaWQg
TGluZTo6YXBwZW5kSW5saW5lQm94RW5kKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElu
bGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQotewotICAgIC8vIFRoaXMgaXMgcmVhbGx5IGp1
c3QgYSBwbGFjZWhvbGRlciB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGlubGluZSBib3ggPC9zcGFu
Pi4KLSAgICBhdXRvIHJlbW92ZVRyYWlsaW5nTGV0dGVyU3BhY2luZyA9IFsmXSB7Ci0gICAgICAg
IGlmICghbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuaXNUcmFpbGluZ1J1blBhcnRpYWxseVRy
aW1tYWJsZSgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX2NvbnRlbnRMb2dpY2Fs
V2lkdGggLT0gbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQucmVtb3ZlUGFydGlhbGx5VHJpbW1h
YmxlQ29udGVudCgpOwotICAgIH07Ci0gICAgLy8gUHJldmVudCB0cmFpbGluZyBsZXR0ZXItc3Bh
Y2luZyBmcm9tIHNwaWxsaW5nIG91dCBvZiB0aGUgaW5saW5lIGJveC4KLSAgICAvLyBodHRwczov
L2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jbGV0dGVyLXNwYWNpbmctcHJvcGVydHkgU2Vl
IGV4YW1wbGUgMjEuCi0gICAgcmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7Ci0gICAgYXBw
ZW5kTm9uQnJlYWthYmxlU3BhY2UoaW5saW5lSXRlbSwgY29udGVudExvZ2ljYWxXaWR0aCgpLCBs
b2dpY2FsV2lkdGgpOwotfQotCi12b2lkIExpbmU6OmFwcGVuZFRleHRDb250ZW50KGNvbnN0IElu
bGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lk
dGgpCi17Ci0gICAgYXV0byYgc3R5bGUgPSBpbmxpbmVUZXh0SXRlbS5zdHlsZSgpOwotICAgIGF1
dG8gd2lsbENvbGxhcHNlQ29tcGxldGVseSA9IFsmXSB7Ci0gICAgICAgIGlmIChpbmxpbmVUZXh0
SXRlbS5pc0VtcHR5Q29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAg
IGlmICghaW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpCi0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgIGlmIChJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNB
bmRUYWJzKGlubGluZVRleHRJdGVtKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgLy8gQ2hlY2sgaWYgdGhlIGxhc3QgaXRlbSBpcyBjb2xsYXBzZWQgYXMgd2VsbC4KLSAgICAg
ICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKG1fcnVucykpIHsKLSAg
ICAgICAgICAgIGlmIChydW4uaXNCb3goKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgICAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jd2hp
dGUtc3BhY2UtcGhhc2UtMQotICAgICAgICAgICAgLy8gQW55IGNvbGxhcHNpYmxlIHNwYWNlIGlt
bWVkaWF0ZWx5IGZvbGxvd2luZyBhbm90aGVyIGNvbGxhcHNpYmxlIHNwYWNl4oCUZXZlbiBvbmUg
b3V0c2lkZSB0aGUgYm91bmRhcnkgb2YgdGhlIGlubGluZSBjb250YWluaW5nIHRoYXQgc3BhY2Us
Ci0gICAgICAgICAgICAvLyBwcm92aWRlZCBib3RoIHNwYWNlcyBhcmUgd2l0aGluIHRoZSBzYW1l
IGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHTigJRpcyBjb2xsYXBzZWQgdG8gaGF2ZSB6ZXJvIGFk
dmFuY2Ugd2lkdGguCi0gICAgICAgICAgICAvLyA6ICI8c3Bhbj4gIDwvc3Bhbj4gIiA8LSB0aGUg
dHJhaWxpbmcgd2hpdGVzcGFjZSBjb2xsYXBzZXMgY29tcGxldGVseS4KLSAgICAgICAgICAgIC8v
IE5vdCB0aGF0IHdoZW4gdGhlIGlubGluZSBib3ggaGFzIHByZXNlcnZlIHdoaXRlc3BhY2Ugc3R5
bGUsICI8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IHByZSI+ICA8L3NwYW4+ICIgPC0gdGhpcyB3
aGl0ZXNwYWNlIHN0YXlzIGFyb3VuZC4KLSAgICAgICAgICAgIGlmIChydW4uaXNUZXh0KCkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIHJ1bi5oYXNDb2xsYXBzaWJsZVRyYWlsaW5nV2hpdGVzcGFj
ZSgpOwotICAgICAgICAgICAgQVNTRVJUKHJ1bi5pc0lubGluZUJveFN0YXJ0KCkgfHwgcnVuLmlz
SW5saW5lQm94RW5kKCkgfHwgcnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7Ci0gICAgICAg
IH0KLSAgICAgICAgLy8gTGVhZGluZyB3aGl0ZXNwYWNlLgotICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICB9OwotCi0gICAgaWYgKHdpbGxDb2xsYXBzZUNvbXBsZXRlbHkoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgYXV0byBuZWVkc05ld1J1biA9IFsmXSB7Ci0gICAgICAgIGlmIChtX3J1bnMu
aXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGF1dG8mIGxhc3RS
dW4gPSBtX3J1bnMubGFzdCgpOwotICAgICAgICBpZiAoJmxhc3RSdW4ubGF5b3V0Qm94KCkgIT0g
JmlubGluZVRleHRJdGVtLmxheW91dEJveCgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgICAgIGlmICghbGFzdFJ1bi5pc1RleHQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwot
ICAgICAgICBpZiAobGFzdFJ1bi5oYXNDb2xsYXBzZWRUcmFpbGluZ1doaXRlc3BhY2UoKSkKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoaW5saW5lVGV4dEl0ZW0uaXNXb3Jk
U2VwYXJhdG9yKCkgJiYgc3R5bGUuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpKQotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9KCk7Ci0gICAg
YXV0byBvbGRDb250ZW50TG9naWNhbFdpZHRoID0gY29udGVudExvZ2ljYWxXaWR0aCgpOwotICAg
IGlmIChuZWVkc05ld1J1bikgewotICAgICAgICAvLyBOb3RlLCBuZWdhdGl2ZSB3b3JkcyBzcGFj
aW5nIG1heSBjYXVzZSBnbHlwaCBvdmVybGFwLgotICAgICAgICBhdXRvIHJ1bkxvZ2ljYWxMZWZ0
ID0gY29udGVudExvZ2ljYWxSaWdodCgpICsgKGlubGluZVRleHRJdGVtLmlzV29yZFNlcGFyYXRv
cigpID8gc3R5bGUuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpIDogMC4wZik7Ci0gICAgICAg
IG1fcnVucy5hcHBlbmQoeyBpbmxpbmVUZXh0SXRlbSwgcnVuTG9naWNhbExlZnQsIGxvZ2ljYWxX
aWR0aCB9KTsKLSAgICAgICAgbV9jb250ZW50TG9naWNhbFdpZHRoID0gc3RkOjptYXgob2xkQ29u
dGVudExvZ2ljYWxXaWR0aCwgcnVuTG9naWNhbExlZnQgKyBsb2dpY2FsV2lkdGgpOwotICAgIH0g
ZWxzZSB7Ci0gICAgICAgIG1fcnVucy5sYXN0KCkuZXhwYW5kKGlubGluZVRleHRJdGVtLCBsb2dp
Y2FsV2lkdGgpOwotICAgICAgICAvLyBEbyBub3QgbGV0IG5lZ2F0aXZlIGxldHRlciBzcGFjaW5n
IG1ha2UgdGhlIGNvbnRlbnQgc2hvcnRlciB0aGFuIGl0IGFscmVhZHkgaXMuCi0gICAgICAgIG1f
Y29udGVudExvZ2ljYWxXaWR0aCArPSBzdGQ6Om1heCgwLjBmLCBsb2dpY2FsV2lkdGgpOwotICAg
IH0KLSAgICAvLyBTZXQgdGhlIHRyYWlsaW5nIHRyaW1tYWJsZSBjb250ZW50LgotICAgIGlmIChp
bmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFBy
ZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpIHsKLSAgICAgICAgbV90cmltbWFi
bGVUcmFpbGluZ0NvbnRlbnQuYWRkRnVsbHlUcmltbWFibGVDb250ZW50KG1fcnVucy5zaXplKCkg
LSAxLCBjb250ZW50TG9naWNhbFdpZHRoKCkgLSBvbGRDb250ZW50TG9naWNhbFdpZHRoKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBBbnkgbm9uLXdoaXRlc3BhY2UsIG5vLXRyaW1t
YWJsZSBjb250ZW50IHJlc2V0cyB0aGUgZXhpc3RpbmcgdHJpbW1hYmxlLgotICAgIG1fdHJpbW1h
YmxlVHJhaWxpbmdDb250ZW50LnJlc2V0KCk7Ci0gICAgaWYgKCFmb3JtYXR0aW5nQ29udGV4dCgp
LmxheW91dFN0YXRlKCkuc2hvdWxkSWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgJiYgIWlu
bGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpICYmIHN0eWxlLmxldHRlclNwYWNpbmcoKSA+IDAp
Ci0gICAgICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmFkZFBhcnRpYWxseVRyaW1tYWJs
ZUNvbnRlbnQobV9ydW5zLnNpemUoKSAtIDEsIHN0eWxlLmxldHRlclNwYWNpbmcoKSk7Ci0gICAg
bV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IGlubGluZVRleHRJdGVtLmhhc1RyYWlsaW5nU29m
dEh5cGhlbigpID8gbWFrZU9wdGlvbmFsKHN0eWxlLmZvbnRDYXNjYWRlKCkud2lkdGgoVGV4dFJ1
biB7IFN0cmluZ1ZpZXcgeyBzdHlsZS5oeXBoZW5TdHJpbmcoKSB9IH0pKSA6IFdURjo6bnVsbG9w
dDsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmROb25SZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0
IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNh
bFdpZHRoKQotewotICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlc2V0KCk7Ci0gICAg
bV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IHsgfTsKLSAgICBtX2NvbnRlbnRMb2dpY2FsV2lk
dGggKz0gbWFyZ2luQm94TG9naWNhbFdpZHRoOwotICAgICsrbV9ub25TcGFubmluZ0lubGluZUxl
dmVsQm94Q291bnQ7Ci0gICAgYXV0byBtYXJnaW5TdGFydCA9IGZvcm1hdHRpbmdDb250ZXh0KCku
Z2VvbWV0cnlGb3JCb3goaW5saW5lSXRlbS5sYXlvdXRCb3goKSkubWFyZ2luU3RhcnQoKTsKLSAg
ICBpZiAobWFyZ2luU3RhcnQgPj0gMCkgewotICAgICAgICBtX3J1bnMuYXBwZW5kKHsgaW5saW5l
SXRlbSwgY29udGVudExvZ2ljYWxSaWdodCgpLCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGggfSk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gTmVnYXRpdmUgbWFyZ2luLXN0YXJ0IHB1bGxz
IHRoZSBjb250ZW50IHRvIHRoZSBsb2dpY2FsIGxlZnQgZGlyZWN0aW9uLgotICAgIC8vIE5lZ2F0
aXZlIG1hcmdpbiBhbHNvIHNxdWVlemVzIHRoZSBtYXJnaW4gYm94LCB3ZSBuZWVkIHRvIHN0cmV0
Y2ggaXQgdG8gbWFrZSBzdXJlIHRoZSBzdWJzZXF1ZW50IGNvbnRlbnQgd29uJ3Qgb3ZlcmxhcC4K
LSAgICAvLyBlLmcuIDxpbWcgc3R5bGU9IndpZHRoOiAxMDBweDsgbWFyZ2luLWxlZnQ6IC0xMDBw
eDsiPiBwdWxscyB0aGUgcmVwbGFjZWQgYm94IHRvIC0xMDBweCB3aXRoIHRoZSBtYXJnaW4gYm94
IHdpZHRoIG9mIDBweC4KLSAgICAvLyBJbnN0ZWFkIHdlIG5lZWQgdG8gcG9zaXRpb24gaXQgYXQg
LTEwMHB4IGFuZCBzaXplIGl0IHRvIDEwMHB4IHNvIHRoZSBzdWJzZXF1ZW50IGNvbnRlbnQgc3Rh
cnRzIGF0IDBweC4gCi0gICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGNvbnRlbnRMb2dp
Y2FsUmlnaHQoKSArIG1hcmdpblN0YXJ0LCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGggLSBtYXJnaW5T
dGFydCB9KTsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmRSZXBsYWNlZElubGluZUxldmVsQm94KGNv
bnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9n
aWNhbFdpZHRoKQotewotICAgIEFTU0VSVChpbmxpbmVJdGVtLmxheW91dEJveCgpLmlzUmVwbGFj
ZWRCb3goKSk7Ci0gICAgLy8gRklYTUU6IFN1cmVseSByZXBsYWNlZCBib3hlcyBiZWhhdmUgZGlm
ZmVyZW50bHkuCi0gICAgYXBwZW5kTm9uUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVt
LCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGgpOwotfQotCi12b2lkIExpbmU6OmFwcGVuZExpbmVCcmVh
ayhjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQotewotICAgIG1fdHJhaWxpbmdTb2Z0SHlw
aGVuV2lkdGggPSB7IH07Ci0gICAgaWYgKGlubGluZUl0ZW0uaXNIYXJkTGluZUJyZWFrKCkpIHsK
LSAgICAgICAgKyttX25vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudDsKLSAgICAgICAgcmV0
dXJuIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIDBf
bHUgfSk7Ci0gICAgfQotICAgIC8vIFNvZnQgbGluZSBicmVha3MgKHByZXNlcnZlZCBuZXcgbGlu
ZSBjaGFyYWN0ZXJzKSByZXF1aXJlIGlubGluZSB0ZXh0IGJveGVzIGZvciBjb21wYXRpYmlsaXR5
IHJlYXNvbnMuCi0gICAgQVNTRVJUKGlubGluZUl0ZW0uaXNTb2Z0TGluZUJyZWFrKCkpOwotICAg
IG1fcnVucy5hcHBlbmQoeyBkb3duY2FzdDxJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbT4oaW5saW5l
SXRlbSksIGNvbnRlbnRMb2dpY2FsUmlnaHQoKSB9KTsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmRX
b3JkQnJlYWtPcHBvcnR1bml0eShjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQotewotICAg
IG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIDBfbHUg
fSk7Ci19Ci0KLXZvaWQgTGluZTo6YWRkVHJhaWxpbmdIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBo
eXBoZW5Mb2dpY2FsV2lkdGgpCi17Ci0gICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZl
cnNlZFJhbmdlKG1fcnVucykpIHsKLSAgICAgICAgaWYgKCFydW4uaXNUZXh0KCkpCi0gICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgcnVuLnNldE5lZWRzSHlwaGVuKGh5cGhlbkxvZ2ljYWxX
aWR0aCk7Ci0gICAgICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCArPSBoeXBoZW5Mb2dpY2FsV2lk
dGg7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci19
Ci0KLWNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBMaW5lOjpmb3JtYXR0aW5nQ29udGV4
dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Ci19Ci0K
LUxpbmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50
KFJ1bkxpc3QmIHJ1bnMpCi0gICAgOiBtX3J1bnMocnVucykKLXsKLX0KLQotdm9pZCBMaW5lOjpU
cmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OmFkZEZ1bGx5VHJpbW1hYmxlQ29udGVudChzaXplX3Qg
cnVuSW5kZXgsIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpCi17Ci0gICAgLy8gQW55
IHN1YnNlcXVlbnQgdHJpbW1hYmxlIHdoaXRlc3BhY2Ugc2hvdWxkIGNvbGxhcHNlIHRvIHplcm8g
YWR2YW5jZWQgd2lkdGggYW5kIGlnbm9yZWQgYXQgOjphcHBlbmRUZXh0Q29udGVudCgpLgotICAg
IEFTU0VSVCghbV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQpOwotICAgIG1fZnVsbHlUcmltbWFi
bGVXaWR0aCA9IHRyaW1tYWJsZVdpZHRoOwotICAgIC8vIE5vdGUgdGhhdCBqdXN0IGJlY2F1c2Ug
dGhlIHRyaW1tYWJsZSB3aWR0aCBpcyAwIChmb250LXNpemU6IDBweCksIGl0IGRvZXMgbm90IG1l
YW4gd2UgZG9uJ3QgaGF2ZSBhIHRyaW1tYWJsZSB0cmFpbGluZyBjb250ZW50LgotICAgIG1faGFz
RnVsbHlUcmltbWFibGVDb250ZW50ID0gdHJ1ZTsKLSAgICBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5k
ZXggPSBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXgudmFsdWVPcihydW5JbmRleCk7Ci19Ci0KLXZv
aWQgTGluZTo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50OjphZGRQYXJ0aWFsbHlUcmltbWFibGVD
b250ZW50KHNpemVfdCBydW5JbmRleCwgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVXaWR0aCkK
LXsKLSAgICAvLyBEbyBub3QgYWRkIHRyaW1tYWJsZSBsZXR0ZXIgc3BhY2luZyBhZnRlciBhIGZ1
bGx5IHRyaW1tYWJsZSB3aGl0ZXNwYWNlLgotICAgIEFTU0VSVCghbV9maXJzdFRyaW1tYWJsZVJ1
bkluZGV4KTsKLSAgICBBU1NFUlQoIW1faGFzRnVsbHlUcmltbWFibGVDb250ZW50KTsKLSAgICBB
U1NFUlQoIW1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGgpOwotICAgIEFTU0VSVCh0cmltbWFibGVX
aWR0aCk7Ci0gICAgbV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aCA9IHRyaW1tYWJsZVdpZHRoOwot
ICAgIG1fZmlyc3RUcmltbWFibGVSdW5JbmRleCA9IHJ1bkluZGV4OwotfQotCi1JbmxpbmVMYXlv
dXRVbml0IExpbmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6cmVtb3ZlKCkKLXsKLSAgICAv
LyBSZW1vdmUgdHJpbW1hYmxlIHRyYWlsaW5nIGNvbnRlbnQgYW5kIG1vdmUgYWxsIHRoZSBzdWJz
ZXF1ZW50IHRyYWlsaW5nIHJ1bnMuCi0gICAgLy8gPHNwYW4+IDwvc3Bhbj48c3Bhbj48L3NwYW4+
Ci0gICAgLy8gW3RyYWlsaW5nIHdoaXRlc3BhY2VdW2lubGluZSBib3ggZW5kXVtpbmxpbmUgYm94
IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF0KLSAgICAvLyBUcmltIHRoZSB3aGl0ZXNwYWNlIHJ1biBh
bmQgbW92ZSB0aGUgdHJhaWxpbmcgaW5saW5lIGJveCBydW5zIHRvIHRoZSBsb2dpY2FsIGxlZnQu
Ci0gICAgQVNTRVJUKCFpc0VtcHR5KCkpOwotICAgIGF1dG8mIHRyaW1tYWJsZVJ1biA9IG1fcnVu
c1sqbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4XTsKLSAgICBBU1NFUlQodHJpbW1hYmxlUnVuLmlz
VGV4dCgpKTsKLQotICAgIGlmIChtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCkKLSAgICAgICAg
dHJpbW1hYmxlUnVuLnJlbW92ZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwotICAgIGlmIChtX3BhcnRp
YWxseVRyaW1tYWJsZVdpZHRoKQotICAgICAgICB0cmltbWFibGVSdW4ucmVtb3ZlVHJhaWxpbmdM
ZXR0ZXJTcGFjaW5nKCk7Ci0KLSAgICBhdXRvIHRyaW1tYWJsZVdpZHRoID0gd2lkdGgoKTsKLSAg
ICAvLyBXaGVuIHRoZSB0cmltbWFibGUgcnVuIGlzIGZvbGxvd2VkIGJ5IHNvbWUgbm9uLWNvbnRl
bnQgcnVucywgd2UgbmVlZCB0byBhZGp1c3QgdGhlaXIgaG9yaXpvbnRhbCBwb3NpdGlvbnMuCi0g
ICAgLy8gZS5nLiA8ZGl2PnRleHQgaXMgZm9sbG93ZWQgYnkgdHJpbW1hYmxlIGNvbnRlbnQgICAg
PHNwYW4+IDwvc3Bhbj48L2Rpdj4KLSAgICAvLyBXaGVuIHRoZSBbdGV4dC4uLl0gcnVuIGlzIHRy
aW1tZWQgKHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCksIGJvdGggIjxzcGFuPiIgYW5k
ICI8L3NwYW4+IiBydW5zCi0gICAgLy8gbmVlZCB0byBiZSBtb3ZlZCBob3Jpem9udGFsbHkgdG8g
Y2F0Y2ggdXAgd2l0aCB0aGUgW3RleHQuLi5dIHJ1bi4gTm90ZSB0aGF0IHRoZSB3aGl0ZXNwYWNl
IGluc2lkZSB0aGUgPHNwYW4+IGRvZXMKLSAgICAvLyBub3QgcHJvZHVjZSBhIHJ1biBzaW5jZSBp
biA6OmFwcGVuZFRleHQoKSB3ZSBzZWUgaXQgYXMgYSBmdWxseSBjb2xsYXBzaWJsZSBydW4uCi0g
ICAgZm9yIChhdXRvIGluZGV4ID0gKm1fZmlyc3RUcmltbWFibGVSdW5JbmRleCArIDE7IGluZGV4
IDwgbV9ydW5zLnNpemUoKTsgKytpbmRleCkgewotICAgICAgICBhdXRvJiBydW4gPSBtX3J1bnNb
aW5kZXhdOwotICAgICAgICBBU1NFUlQocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSB8fCBy
dW4uaXNJbmxpbmVCb3hTdGFydCgpIHx8IHJ1bi5pc0lubGluZUJveEVuZCgpIHx8IHJ1bi5pc0xp
bmVCcmVhaygpKTsKLSAgICAgICAgcnVuLm1vdmVIb3Jpem9udGFsbHkoLXRyaW1tYWJsZVdpZHRo
KTsKLSAgICB9Ci0gICAgaWYgKCF0cmltbWFibGVSdW4udGV4dENvbnRlbnQoKS0+bGVuZ3RoKCkp
IHsKLSAgICAgICAgLy8gVGhpcyB0cmltbWFibGUgcnVuIGlzIGZ1bGx5IGNvbGxhcHNlZCBub3cg
KGUuZy4gPGRpdj48aW1nPiAgICA8c3Bhbj48L3NwYW4+PC9kaXY+KS4KLSAgICAgICAgLy8gV2Ug
ZG9uJ3QgbmVlZCB0byBrZWVwIGl0IGFyb3VuZCBhbnltb3JlLgotICAgICAgICBtX3J1bnMucmVt
b3ZlKCptX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXgpOwotICAgIH0KLSAgICByZXNldCgpOwotICAg
IHJldHVybiB0cmltbWFibGVXaWR0aDsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBMaW5lOjpUcmlt
bWFibGVUcmFpbGluZ0NvbnRlbnQ6OnJlbW92ZVBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQoKQot
ewotICAgIC8vIFBhcnRpYWxseSB0cmltbWFibGUgY29udGVudCBpcyBhbHdheXMgZ2F0ZWQgYnkg
YSBmdWxseSB0cmltbWFibGUgY29udGVudC4KLSAgICAvLyBXZSBjYW4ndCBqdXN0IHRyaW0gc3Bh
Y2luZyBpbiB0aGUgbWlkZGxlLgotICAgIEFTU0VSVCghbV9mdWxseVRyaW1tYWJsZVdpZHRoKTsK
LSAgICByZXR1cm4gcmVtb3ZlKCk7Ci19Ci0KLUxpbmU6OlJ1bjo6UnVuKGNvbnN0IElubGluZUl0
ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91
dFVuaXQgbG9naWNhbFdpZHRoKQotICAgIDogbV90eXBlKGlubGluZUl0ZW0udHlwZSgpKQotICAg
ICwgbV9sYXlvdXRCb3goJmlubGluZUl0ZW0ubGF5b3V0Qm94KCkpCi0gICAgLCBtX2xvZ2ljYWxM
ZWZ0KGxvZ2ljYWxMZWZ0KQotICAgICwgbV9sb2dpY2FsV2lkdGgobG9naWNhbFdpZHRoKQotewot
fQotCi1MaW5lOjpSdW46OlJ1bihjb25zdCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSYgc29mdExp
bmVCcmVha0l0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQpCi0gICAgOiBtX3R5cGUo
c29mdExpbmVCcmVha0l0ZW0udHlwZSgpKQotICAgICwgbV9sYXlvdXRCb3goJnNvZnRMaW5lQnJl
YWtJdGVtLmxheW91dEJveCgpKQotICAgICwgbV9sb2dpY2FsTGVmdChsb2dpY2FsTGVmdCkKLSAg
ICAsIG1fdGV4dENvbnRlbnQoeyBzb2Z0TGluZUJyZWFrSXRlbS5wb3NpdGlvbigpLCAxLCBzb2Z0
TGluZUJyZWFrSXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpIH0pCi17Ci19Ci0KLUxpbmU6
OlJ1bjo6UnVuKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi0gICAg
OiBtX3R5cGUoSW5saW5lSXRlbTo6VHlwZTo6VGV4dCkKLSAgICAsIG1fbGF5b3V0Qm94KCZpbmxp
bmVUZXh0SXRlbS5sYXlvdXRCb3goKSkKLSAgICAsIG1fbG9naWNhbExlZnQobG9naWNhbExlZnQp
Ci0gICAgLCBtX2xvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGgpCi0gICAgLCBtX3doaXRlc3BhY2VJ
c0V4cGFuc2lvbk9wcG9ydHVuaXR5KCFUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRU
YWJzKGlubGluZVRleHRJdGVtLmxheW91dEJveCgpKSkKLSAgICAsIG1fdHJhaWxpbmdXaGl0ZXNw
YWNlVHlwZSh0cmFpbGluZ1doaXRlc3BhY2VUeXBlKGlubGluZVRleHRJdGVtKSkKLSAgICAsIG1f
dGV4dENvbnRlbnQoeyBpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBtX3RyYWlsaW5nV2hpdGVzcGFj
ZVR5cGUgPT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQgPyAxIDogaW5saW5lVGV4dEl0
ZW0ubGVuZ3RoKCksIGlubGluZVRleHRJdGVtLmlubGluZVRleHRCb3goKS5jb250ZW50KCkgfSkK
LXsKLSAgICBpZiAobV90cmFpbGluZ1doaXRlc3BhY2VUeXBlICE9IFRyYWlsaW5nV2hpdGVzcGFj
ZTo6Tm9uZSkgewotICAgICAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0gbG9naWNhbFdp
ZHRoOwotICAgICAgICBpZiAobV93aGl0ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1bml0eSkKLSAg
ICAgICAgICAgIG1fZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCA9IDE7Ci0gICAgfQotfQotCi12
b2lkIExpbmU6OlJ1bjo6ZXhwYW5kKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRl
bSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMg
aXMgYSB2ZXJ5IHNpbXBsZSBleHBhbnNpb24gbWVyZ2UuIFdlIHNob3VsZCBldmVudHVhbGx5IHN3
aXRjaCBvdmVyIHRvIEZvbnRDYXNjYWRlOjpleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LgotICAg
IEFTU0VSVCghaGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCkpOwotICAgIEFTU0VSVChp
c1RleHQoKSAmJiBpbmxpbmVUZXh0SXRlbS5pc1RleHQoKSk7Ci0gICAgQVNTRVJUKG1fbGF5b3V0
Qm94ID09ICZpbmxpbmVUZXh0SXRlbS5sYXlvdXRCb3goKSk7Ci0KLSAgICBtX2xvZ2ljYWxXaWR0
aCArPSBsb2dpY2FsV2lkdGg7Ci0gICAgbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID0gdHJhaWxp
bmdXaGl0ZXNwYWNlVHlwZShpbmxpbmVUZXh0SXRlbSk7Ci0KLSAgICBpZiAobV90cmFpbGluZ1do
aXRlc3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSkgewotICAgICAgICBtX3Ry
YWlsaW5nV2hpdGVzcGFjZVdpZHRoID0geyB9OwotICAgICAgICBzZXRFeHBhbnNpb25CZWhhdmlv
cihBbGxvd0xlZnRFeHBhbnNpb24gfCBBbGxvd1JpZ2h0RXhwYW5zaW9uKTsKLSAgICAgICAgbV90
ZXh0Q29udGVudC0+ZXhwYW5kKGlubGluZVRleHRJdGVtLmxlbmd0aCgpKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoICs9IGxvZ2ljYWxXaWR0
aDsKLSAgICBpZiAobV93aGl0ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1bml0eSkKLSAgICAgICAg
KyttX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7Ci0gICAgc2V0RXhwYW5zaW9uQmVoYXZpb3Io
RGVmYXVsdEV4cGFuc2lvbik7Ci0gICAgbV90ZXh0Q29udGVudC0+ZXhwYW5kKG1fdHJhaWxpbmdX
aGl0ZXNwYWNlVHlwZSA9PSBUcmFpbGluZ1doaXRlc3BhY2U6OkNvbGxhcHNlZCA/IDEgOiBpbmxp
bmVUZXh0SXRlbS5sZW5ndGgoKSk7Ci19Ci0KLWJvb2wgTGluZTo6UnVuOjpoYXNUcmFpbGluZ0xl
dHRlclNwYWNpbmcoKSBjb25zdAotewotICAgIHJldHVybiAhaGFzVHJhaWxpbmdXaGl0ZXNwYWNl
KCkgJiYgc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCkgPiAwOwotfQotCi1JbmxpbmVMYXlvdXRVbml0
IExpbmU6OlJ1bjo6dHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgY29uc3QKLXsKLSAgICBpZiAoIWhh
c1RyYWlsaW5nTGV0dGVyU3BhY2luZygpKQotICAgICAgICByZXR1cm4geyB9OwotICAgIHJldHVy
biBJbmxpbmVMYXlvdXRVbml0IHsgc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCkgfTsKLX0KLQotdm9p
ZCBMaW5lOjpSdW46OnJlbW92ZVRyYWlsaW5nTGV0dGVyU3BhY2luZygpCi17Ci0gICAgQVNTRVJU
KGhhc1RyYWlsaW5nTGV0dGVyU3BhY2luZygpKTsKLSAgICBzaHJpbmtIb3Jpem9udGFsbHkodHJh
aWxpbmdMZXR0ZXJTcGFjaW5nKCkpOwotICAgIEFTU0VSVChsb2dpY2FsV2lkdGgoKSA+IDAgfHwg
KCFsb2dpY2FsV2lkdGgoKSAmJiBzdHlsZSgpLmxldHRlclNwYWNpbmcoKSA+PSBzdGF0aWNfY2Fz
dDxmbG9hdD4oaW50TWF4Rm9yTGF5b3V0VW5pdCkpKTsKLX0KLQotdm9pZCBMaW5lOjpSdW46OnJl
bW92ZVRyYWlsaW5nV2hpdGVzcGFjZSgpCi17Ci0gICAgLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8v
d3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eSBtYXRyaXgKLSAg
ICAvLyBUcmltbWFibGUgd2hpdGVzcGFjZSBpcyBhbHdheXMgY29sbGFwc2libGUgc28gdGhlIGxl
bmd0aCBvZiB0aGUgdHJhaWxpbmcgdHJpbW1hYmxlIHdoaXRlc3BhY2UgaXMgYWx3YXlzIDEgKG9y
IG5vbi1leGlzdGVudCkuCi0gICAgQVNTRVJUKG1fdGV4dENvbnRlbnQtPmxlbmd0aCgpKTsKLSAg
ICBjb25zdGV4cHIgc2l6ZV90IHRyYWlsaW5nVHJpbW1hYmxlQ29udGVudExlbmd0aCA9IDE7Ci0g
ICAgbV90ZXh0Q29udGVudC0+c2hyaW5rKHRyYWlsaW5nVHJpbW1hYmxlQ29udGVudExlbmd0aCk7
Ci0gICAgdmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwotfQotCi12b2lkIExp
bmU6OlJ1bjo6dmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgpCi17Ci0gICAgLy8g
VGhpcyBpcyBqdXN0IGEgdmlzdWFsIGFkanVzdG1lbnQsIHRoZSB0ZXh0IGxlbmd0aCBzaG91bGQg
cmVtYWluIHRoZSBzYW1lLgotICAgIHNocmlua0hvcml6b250YWxseShtX3RyYWlsaW5nV2hpdGVz
cGFjZVdpZHRoKTsKLSAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0geyB9OwotICAgIG1f
dHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZTsKLQotICAg
IGlmIChtX3doaXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9ydHVuaXR5KSB7Ci0gICAgICAgIEFTU0VS
VChtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpOwotICAgICAgICBtX2V4cGFuc2lvbk9wcG9y
dHVuaXR5Q291bnQtLTsKLSAgICB9Ci0gICAgc2V0RXhwYW5zaW9uQmVoYXZpb3IoQWxsb3dMZWZ0
RXhwYW5zaW9uIHwgQWxsb3dSaWdodEV4cGFuc2lvbik7Ci19Ci0KLXZvaWQgTGluZTo6UnVuOjpz
ZXRFeHBhbnNpb25CZWhhdmlvcihFeHBhbnNpb25CZWhhdmlvciBleHBhbnNpb25CZWhhdmlvcikK
LXsKLSAgICBBU1NFUlQoaXNUZXh0KCkpOwotICAgIG1fZXhwYW5zaW9uLmJlaGF2aW9yID0gZXhw
YW5zaW9uQmVoYXZpb3I7Ci19Ci0KLUV4cGFuc2lvbkJlaGF2aW9yIExpbmU6OlJ1bjo6ZXhwYW5z
aW9uQmVoYXZpb3IoKSBjb25zdAotewotICAgIEFTU0VSVChpc1RleHQoKSk7Ci0gICAgcmV0dXJu
IG1fZXhwYW5zaW9uLmJlaGF2aW9yOwotfQotCi12b2lkIExpbmU6OlJ1bjo6c2V0SG9yaXpvbnRh
bEV4cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxFeHBhbnNpb24pCi17Ci0gICAgQVNT
RVJUKGlzVGV4dCgpKTsKLSAgICBBU1NFUlQoaGFzRXhwYW5zaW9uT3Bwb3J0dW5pdHkoKSk7Ci0g
ICAgbV9leHBhbnNpb24uaG9yaXpvbnRhbEV4cGFuc2lvbiA9IGxvZ2ljYWxFeHBhbnNpb247Ci19
Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5s
aW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5l
Zm9ybWF0dGluZy9JbmxpbmVMaW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZl
MzM1MTk1MjFhYTllNGY5NmE3OTM0YWVkOGMwMzJjYzllNzkzZjUuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lTGluZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAK
LS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElO
R19DT05URVhUKQotCi0jaW5jbHVkZSAiSW5saW5lSXRlbS5oIgotI2luY2x1ZGUgIklubGluZUxp
bmVSdW4uaCIKLSNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgotCi1uYW1lc3BhY2UgV2ViQ29y
ZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7
Ci1jbGFzcyBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbTsKLQotY2xhc3MgTGluZSB7Ci1wdWJsaWM6
Ci0gICAgTGluZShjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYpOwotICAgIH5MaW5lKCk7
Ci0KLSAgICB2b2lkIGluaXRpYWxpemUoKTsKLQotICAgIHZvaWQgYXBwZW5kKGNvbnN0IElubGlu
ZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0KLSAgICBJbmxpbmVMYXlv
dXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRMb2dp
Y2FsV2lkdGg7IH0KLSAgICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsUmlnaHQoKSBj
b25zdCB7IHJldHVybiBtX3J1bnMuaXNFbXB0eSgpID8gMC4wZiA6IG1fcnVucy5sYXN0KCkubG9n
aWNhbFJpZ2h0KCk7IH0KLSAgICBzaXplX3Qgbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50
KCkgY29uc3QgeyByZXR1cm4gbV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQ7IH0KLQot
ICAgIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlVHJhaWxpbmdXaWR0aCgpIGNvbnN0IHsgcmV0
dXJuIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LndpZHRoKCk7IH0KLSAgICBib29sIGlzVHJh
aWxpbmdSdW5GdWxseVRyaW1tYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHJpbW1hYmxlVHJhaWxp
bmdDb250ZW50LmlzVHJhaWxpbmdSdW5GdWxseVRyaW1tYWJsZSgpOyB9Ci0KLSAgICBPcHRpb25h
bDxJbmxpbmVMYXlvdXRVbml0PiB0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpIGNvbnN0IHsgcmV0
dXJuIG1fdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGg7IH0KLSAgICB2b2lkIGFkZFRyYWlsaW5nSHlw
aGVuKElubGluZUxheW91dFVuaXQgaHlwaGVuTG9naWNhbFdpZHRoKTsKLQotICAgIHZvaWQgcmVt
b3ZlQ29sbGFwc2libGVDb250ZW50KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFsU3Bh
Y2UpOwotICAgIHZvaWQgYXBwbHlSdW5FeHBhbnNpb24oSW5saW5lTGF5b3V0VW5pdCBleHRyYUhv
cml6b250YWxTcGFjZSk7Ci0KLSAgICBzdHJ1Y3QgUnVuIHsKLSAgICAgICAgYm9vbCBpc1RleHQo
KSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6VGV4dDsgfQotICAg
ICAgICBib29sIGlzQm94KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5
cGU6OkJveDsgfQotICAgICAgICBib29sIGlzTGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gaXNI
YXJkTGluZUJyZWFrKCkgfHwgaXNTb2Z0TGluZUJyZWFrKCk7IH0KLSAgICAgICAgYm9vbCBpc1Nv
ZnRMaW5lQnJlYWsoKSBjb25zdCAgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5cGU6
OlNvZnRMaW5lQnJlYWs7IH0KLSAgICAgICAgYm9vbCBpc0hhcmRMaW5lQnJlYWsoKSBjb25zdCB7
IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6SGFyZExpbmVCcmVhazsgfQotICAg
ICAgICBib29sIGlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX3R5cGUg
PT0gSW5saW5lSXRlbTo6VHlwZTo6V29yZEJyZWFrT3Bwb3J0dW5pdHk7IH0KLSAgICAgICAgYm9v
bCBpc0lubGluZUJveFN0YXJ0KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06
OlR5cGU6OklubGluZUJveFN0YXJ0OyB9Ci0gICAgICAgIGJvb2wgaXNJbmxpbmVCb3hFbmQoKSBj
b25zdCB7IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94RW5kOyB9
Ci0KLSAgICAgICAgY29uc3QgQm94JiBsYXlvdXRCb3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlv
dXRCb3g7IH0KLSAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKCkgY29uc3QgeyByZXR1
cm4gbV9sYXlvdXRCb3gtPnN0eWxlKCk7IH0KLSAgICAgICAgY29uc3QgT3B0aW9uYWw8TGluZVJ1
bjo6VGV4dD4mIHRleHRDb250ZW50KCkgY29uc3QgeyByZXR1cm4gbV90ZXh0Q29udGVudDsgfQot
Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4g
bV9sb2dpY2FsV2lkdGg7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgp
IGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbExlZnQ7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsUmlnaHQoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsTGVmdCgpICsgbG9naWNhbFdp
ZHRoKCk7IH0KLQotICAgICAgICBjb25zdCBMaW5lUnVuOjpFeHBhbnNpb24mIGV4cGFuc2lvbigp
IGNvbnN0IHsgcmV0dXJuIG1fZXhwYW5zaW9uOyB9Ci0gICAgICAgIGJvb2wgaGFzRXhwYW5zaW9u
T3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7
IH0KLSAgICAgICAgRXhwYW5zaW9uQmVoYXZpb3IgZXhwYW5zaW9uQmVoYXZpb3IoKSBjb25zdDsK
LSAgICAgICAgdW5zaWduZWQgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCgpIGNvbnN0IHsgcmV0
dXJuIG1fZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudDsgfQotCi0gICAgICAgIGJvb2wgaGFzVHJh
aWxpbmdXaGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3BhY2VUeXBl
ICE9IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0
IHRyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRl
c3BhY2VXaWR0aDsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNsYXNzIExpbmU7
Ci0KLSAgICAgICAgUnVuKGNvbnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBs
b2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOwotICAgICAgICBSdW4o
Y29uc3QgSW5saW5lU29mdExpbmVCcmVha0l0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxM
ZWZ0KTsKLSAgICAgICAgUnVuKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxv
Z2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0KLSAgICAgICAgdm9p
ZCBleHBhbmQoY29uc3QgSW5saW5lVGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxX
aWR0aCk7Ci0gICAgICAgIHZvaWQgbW92ZUhvcml6b250YWxseShJbmxpbmVMYXlvdXRVbml0IG9m
ZnNldCkgeyBtX2xvZ2ljYWxMZWZ0ICs9IG9mZnNldDsgfQotICAgICAgICB2b2lkIHNocmlua0hv
cml6b250YWxseShJbmxpbmVMYXlvdXRVbml0IHdpZHRoKSB7IG1fbG9naWNhbFdpZHRoIC09IHdp
ZHRoOyB9Ci0gICAgICAgIHZvaWQgc2V0RXhwYW5zaW9uQmVoYXZpb3IoRXhwYW5zaW9uQmVoYXZp
b3IpOwotICAgICAgICB2b2lkIHNldEhvcml6b250YWxFeHBhbnNpb24oSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsRXhwYW5zaW9uKTsKLSAgICAgICAgdm9pZCBzZXROZWVkc0h5cGhlbihJbmxpbmVM
YXlvdXRVbml0IGh5cGhlbkxvZ2ljYWxXaWR0aCk7Ci0KLSAgICAgICAgZW51bSBjbGFzcyBUcmFp
bGluZ1doaXRlc3BhY2UgewotICAgICAgICAgICAgTm9uZSwKLSAgICAgICAgICAgIE5vdENvbGxh
cHNpYmxlLAotICAgICAgICAgICAgQ29sbGFwc2libGUsCi0gICAgICAgICAgICBDb2xsYXBzZWQK
LSAgICAgICAgfTsKLSAgICAgICAgYm9vbCBoYXNDb2xsYXBzaWJsZVRyYWlsaW5nV2hpdGVzcGFj
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9PSBUcmFpbGluZ1do
aXRlc3BhY2U6OkNvbGxhcHNpYmxlIHx8IGhhc0NvbGxhcHNlZFRyYWlsaW5nV2hpdGVzcGFjZSgp
OyB9Ci0gICAgICAgIGJvb2wgaGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCkgY29uc3Qg
eyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6
Q29sbGFwc2VkOyB9Ci0gICAgICAgIFRyYWlsaW5nV2hpdGVzcGFjZSB0cmFpbGluZ1doaXRlc3Bh
Y2VUeXBlKGNvbnN0IElubGluZVRleHRJdGVtJikgY29uc3Q7Ci0gICAgICAgIHZvaWQgcmVtb3Zl
VHJhaWxpbmdXaGl0ZXNwYWNlKCk7Ci0gICAgICAgIHZvaWQgdmlzdWFsbHlDb2xsYXBzZVRyYWls
aW5nV2hpdGVzcGFjZSgpOwotCi0gICAgICAgIGJvb2wgaGFzVHJhaWxpbmdMZXR0ZXJTcGFjaW5n
KCkgY29uc3Q7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgdHJhaWxpbmdMZXR0ZXJTcGFjaW5n
KCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgcmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7Ci0K
LSAgICAgICAgSW5saW5lSXRlbTo6VHlwZSBtX3R5cGUgeyBJbmxpbmVJdGVtOjpUeXBlOjpUZXh0
IH07Ci0gICAgICAgIGNvbnN0IEJveCogbV9sYXlvdXRCb3ggeyBudWxscHRyIH07Ci0gICAgICAg
IElubGluZUxheW91dFVuaXQgbV9sb2dpY2FsTGVmdCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCBtX2xvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICAgICAgYm9vbCBtX3doaXRlc3BhY2VJ
c0V4cGFuc2lvbk9wcG9ydHVuaXR5IHsgZmFsc2UgfTsKLSAgICAgICAgVHJhaWxpbmdXaGl0ZXNw
YWNlIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSB7IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSB9
OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGggeyAw
IH07Ci0gICAgICAgIE9wdGlvbmFsPExpbmVSdW46OlRleHQ+IG1fdGV4dENvbnRlbnQ7Ci0gICAg
ICAgIExpbmVSdW46OkV4cGFuc2lvbiBtX2V4cGFuc2lvbjsKLSAgICAgICAgdW5zaWduZWQgbV9l
eHBhbnNpb25PcHBvcnR1bml0eUNvdW50IHsgMCB9OwotICAgIH07Ci0gICAgdXNpbmcgUnVuTGlz
dCA9IFZlY3RvcjxSdW4sIDEwPjsKLSAgICBjb25zdCBSdW5MaXN0JiBydW5zKCkgY29uc3QgeyBy
ZXR1cm4gbV9ydW5zOyB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBhcHBlbmROb25CcmVha2FibGVT
cGFjZShjb25zdCBJbmxpbmVJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOwotICAgIHZvaWQgYXBwZW5kVGV4dENvbnRlbnQo
Y29uc3QgSW5saW5lVGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0g
ICAgdm9pZCBhcHBlbmROb25SZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0m
LCBJbmxpbmVMYXlvdXRVbml0IG1hcmdpbkJveExvZ2ljYWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBl
bmRSZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRV
bml0IG1hcmdpbkJveExvZ2ljYWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBlbmRJbmxpbmVCb3hTdGFy
dChjb25zdCBJbmxpbmVJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOwotICAg
IHZvaWQgYXBwZW5kSW5saW5lQm94RW5kKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBlbmRMaW5lQnJlYWsoY29uc3QgSW5saW5l
SXRlbSYpOwotICAgIHZvaWQgYXBwZW5kV29yZEJyZWFrT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5l
SXRlbSYpOwotCi0gICAgdm9pZCByZW1vdmVUcmFpbGluZ1RyaW1tYWJsZUNvbnRlbnQoKTsKLSAg
ICB2b2lkIHZpc3VhbGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KElubGluZUxheW91
dFVuaXQgZXh0cmFIb3Jpem9udGFsU3BhY2UpOwotCi0gICAgY29uc3QgSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3Q7Ci0KLSAgICBzdHJ1Y3QgVHJpbW1h
YmxlVHJhaWxpbmdDb250ZW50IHsKLSAgICAgICAgVHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KFJ1
bkxpc3QmKTsKLQotICAgICAgICB2b2lkIGFkZEZ1bGx5VHJpbW1hYmxlQ29udGVudChzaXplX3Qg
cnVuSW5kZXgsIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpOwotICAgICAgICB2b2lk
IGFkZFBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQoc2l6ZV90IHJ1bkluZGV4LCBJbmxpbmVMYXlv
dXRVbml0IHRyaW1tYWJsZVdpZHRoKTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCByZW1vdmUo
KTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCByZW1vdmVQYXJ0aWFsbHlUcmltbWFibGVDb250
ZW50KCk7Ci0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJu
IG1fZnVsbHlUcmltbWFibGVXaWR0aCArIG1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGg7IH0KLSAg
ICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIW1fZmlyc3RUcmltbWFibGVSdW5J
bmRleC5oYXNWYWx1ZSgpOyB9Ci0gICAgICAgIGJvb2wgaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1h
YmxlKCkgY29uc3QgeyByZXR1cm4gbV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQ7IH0KLSAgICAg
ICAgYm9vbCBpc1RyYWlsaW5nUnVuUGFydGlhbGx5VHJpbW1hYmxlKCkgY29uc3QgeyByZXR1cm4g
bV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aDsgfQotCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLQot
ICAgIHByaXZhdGU6Ci0gICAgICAgIFJ1bkxpc3QmIG1fcnVuczsKLSAgICAgICAgT3B0aW9uYWw8
c2l6ZV90PiBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXg7Ci0gICAgICAgIGJvb2wgbV9oYXNGdWxs
eVRyaW1tYWJsZUNvbnRlbnQgeyBmYWxzZSB9OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1f
ZnVsbHlUcmltbWFibGVXaWR0aCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX3Bh
cnRpYWxseVRyaW1tYWJsZVdpZHRoIHsgMCB9OwotICAgIH07Ci0KLSAgICBjb25zdCBJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCYgbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKLSAgICBSdW5MaXN0
IG1fcnVuczsKLSAgICBUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQgbV90cmltbWFibGVUcmFpbGlu
Z0NvbnRlbnQ7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBtX2NvbnRlbnRMb2dpY2FsV2lkdGggeyAw
IH07Ci0gICAgc2l6ZV90IG1fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50IHsgMCB9Owot
ICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IG1fdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgg
eyAwIH07Ci19OwotCi1pbmxpbmUgdm9pZCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6
OnJlc2V0KCkKLXsKLSAgICBtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCA9IGZhbHNlOwotICAg
IG1fZmlyc3RUcmltbWFibGVSdW5JbmRleCA9IHsgfTsKLSAgICBtX2Z1bGx5VHJpbW1hYmxlV2lk
dGggPSB7IH07Ci0gICAgbV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aCA9IHsgfTsKLX0KLQotaW5s
aW5lIExpbmU6OlJ1bjo6VHJhaWxpbmdXaGl0ZXNwYWNlIExpbmU6OlJ1bjo6dHJhaWxpbmdXaGl0
ZXNwYWNlVHlwZShjb25zdCBJbmxpbmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0ZW0pIGNvbnN0Ci17
Ci0gICAgaWYgKCFpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKLSAgICAgICAgcmV0dXJu
IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZTsKLSAgICBpZiAoSW5saW5lVGV4dEl0ZW06OnNob3Vs
ZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpCi0gICAgICAgIHJldHVybiBU
cmFpbGluZ1doaXRlc3BhY2U6Ok5vdENvbGxhcHNpYmxlOwotICAgIGlmIChpbmxpbmVUZXh0SXRl
bS5sZW5ndGgoKSA9PSAxKQotICAgICAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xs
YXBzaWJsZTsKLSAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQ7Ci19Ci0K
LWlubGluZSB2b2lkIExpbmU6OlJ1bjo6c2V0TmVlZHNIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBo
eXBoZW5Mb2dpY2FsV2lkdGgpCi17Ci0gICAgQVNTRVJUKG1fdGV4dENvbnRlbnQpOwotICAgIG1f
dGV4dENvbnRlbnQtPnNldE5lZWRzSHlwaGVuKCk7Ci0gICAgbV9sb2dpY2FsV2lkdGggKz0gaHlw
aGVuTG9naWNhbFdpZHRoOwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5jcHAKZGVsZXRl
ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjEzYWUwMWNhYTM5NWE3OTg0MjExOGI5OTk3MjMx
ZThkMjBlMjkuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5jcHAK
KysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAy
MCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5lQm94LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VU
X0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0j
aW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi1MaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6SW5saW5lTGV2ZWxC
b3goY29uc3QgQm94JiBsYXlvdXRCb3gsIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElu
bGluZUxheW91dFNpemUgbG9naWNhbFNpemUsIFR5cGUgdHlwZSkKLSAgICA6IG1fbGF5b3V0Qm94
KG1ha2VXZWFrUHRyKGxheW91dEJveCkpCi0gICAgLCBtX2xvZ2ljYWxSZWN0KHsgfSwgbG9naWNh
bExlZnQsIGxvZ2ljYWxTaXplLndpZHRoKCksIGxvZ2ljYWxTaXplLmhlaWdodCgpKQotICAgICwg
bV90eXBlKHR5cGUpCi17Ci19Ci0KLXZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldEJh
c2VsaW5lKElubGluZUxheW91dFVuaXQgYmFzZWxpbmUpCi17Ci0gICAgLy8gRklYTUU6IFJlbW92
ZSBsZWdhY3kgcm91bmRpbmcuCi0gICAgbV9iYXNlbGluZSA9IHJvdW5kVG9JbnQoYmFzZWxpbmUp
OwotfQotCi12b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94OjpzZXREZXNjZW50KElubGluZUxh
eW91dFVuaXQgZGVzY2VudCkKLXsKLSAgICAvLyBGSVhNRTogUmVtb3ZlIGxlZ2FjeSByb3VuZGlu
Zy4KLSAgICBtX2Rlc2NlbnQgPSByb3VuZFRvSW50KGRlc2NlbnQpOwotfQotCi12b2lkIExpbmVC
b3g6OklubGluZUxldmVsQm94OjpzZXRMYXlvdXRCb3VuZHMoY29uc3QgTGF5b3V0Qm91bmRzJiBs
YXlvdXRCb3VuZHMpCi17Ci0gICAgLy8gRklYTUU6IFJlbW92ZSBsZWdhY3kgcm91bmRpbmcuCi0g
ICAgbV9sYXlvdXRCb3VuZHMgPSB7IElubGluZUxheW91dFVuaXQocm91bmRUb0ludChsYXlvdXRC
b3VuZHMuYXNjZW50KSksIElubGluZUxheW91dFVuaXQocm91bmRUb0ludChsYXlvdXRCb3VuZHMu
ZGVzY2VudCkpIH07Ci19Ci0KLXZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldExvZ2lj
YWxUb3AoSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsVG9wKQotewotICAgIC8vIEZJWE1FOiBSZW1v
dmUgbGVnYWN5IHJvdW5kaW5nLgotICAgIG1fbG9naWNhbFJlY3Quc2V0VG9wKHJvdW5kVG9JbnQo
bG9naWNhbFRvcCkpOwotfQotCi12b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94OjpzZXRMb2dp
Y2FsSGVpZ2h0KElubGluZUxheW91dFVuaXQgbG9naWNhbEhlaWdodCkKLXsKLSAgICAvLyBGSVhN
RTogUmVtb3ZlIGxlZ2FjeSByb3VuZGluZy4KLSAgICBtX2xvZ2ljYWxSZWN0LnNldEhlaWdodChy
b3VuZFRvSW50KGxvZ2ljYWxIZWlnaHQpKTsKLX0KLQotdm9pZCBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveDo6c2V0SGFzQ29udGVudCgpCi17Ci0gICAgQVNTRVJUKGlzSW5saW5lQm94KCkpOwotICAg
IG1faGFzQ29udGVudCA9IHRydWU7Ci19Ci0KLWJvb2wgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6
Omhhc0xpbmVCb3hSZWxhdGl2ZUFsaWdubWVudCgpIGNvbnN0Ci17Ci0gICAgYXV0byB2ZXJ0aWNh
bEFsaWdubWVudCA9IGxheW91dEJveCgpLnN0eWxlKCkudmVydGljYWxBbGlnbigpOwotICAgIHJl
dHVybiB2ZXJ0aWNhbEFsaWdubWVudCA9PSBWZXJ0aWNhbEFsaWduOjpUb3AgfHwgdmVydGljYWxB
bGlnbm1lbnQgPT0gVmVydGljYWxBbGlnbjo6Qm90dG9tOwotfQotCi1MaW5lQm94OjpMaW5lQm94
KGNvbnN0IEJveCYgcm9vdExheW91dEJveCwgY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIGxvZ2lj
YWxUb3BsZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxpbmVMb2dpY2FsV2lkdGgsIElubGluZUxheW91
dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2Fs
V2lkdGgsIHNpemVfdCBub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQpCi0gICAgOiBtX2xv
Z2ljYWxSZWN0KGxvZ2ljYWxUb3BsZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgbGluZUxvZ2ljYWxX
aWR0aCwgeyB9IH0pCi0gICAgLCBtX2NvbnRlbnRMb2dpY2FsV2lkdGgoY29udGVudExvZ2ljYWxX
aWR0aCkKLSAgICAsIG1fcm9vdElubGluZUJveChyb290TGF5b3V0Qm94LCBjb250ZW50TG9naWNh
bExlZnQsIElubGluZUxheW91dFNpemUgeyBjb250ZW50TG9naWNhbFdpZHRoLCB7IH0gfSwgSW5s
aW5lTGV2ZWxCb3g6OlR5cGU6OlJvb3RJbmxpbmVCb3gpCi17Ci0gICAgbV9ub25Sb290SW5saW5l
TGV2ZWxCb3hMaXN0LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobm9uU3Bhbm5pbmdJbmxpbmVMZXZl
bEJveENvdW50KTsKLSAgICBtX25vblJvb3RJbmxpbmVMZXZlbEJveE1hcC5yZXNlcnZlSW5pdGlh
bENhcGFjaXR5KG5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCk7Ci19Ci0KLXZvaWQgTGlu
ZUJveDo6YWRkSW5saW5lTGV2ZWxCb3goSW5saW5lTGV2ZWxCb3gmJiBpbmxpbmVMZXZlbEJveCkK
LXsKLSAgICBtX2JveFR5cGVzLmFkZChpbmxpbmVMZXZlbEJveC50eXBlKCkpOwotICAgIG1fbm9u
Um9vdElubGluZUxldmVsQm94TWFwLnNldCgmaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCksIG1f
bm9uUm9vdElubGluZUxldmVsQm94TGlzdC5zaXplKCkpOwotICAgIG1fbm9uUm9vdElubGluZUxl
dmVsQm94TGlzdC5hcHBlbmQoV1RGTW92ZShpbmxpbmVMZXZlbEJveCkpOwotfQotCi1JbmxpbmVS
ZWN0IExpbmVCb3g6OmxvZ2ljYWxSZWN0Rm9yVGV4dFJ1bihjb25zdCBMaW5lOjpSdW4mIHJ1bikg
Y29uc3QKLXsKLSAgICBBU1NFUlQocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc1NvZnRMaW5lQnJlYWso
KSk7Ci0gICAgYXV0byogcGFyZW50SW5saW5lQm94ID0gJmlubGluZUxldmVsQm94Rm9yTGF5b3V0
Qm94KHJ1bi5sYXlvdXRCb3goKS5wYXJlbnQoKSk7Ci0gICAgQVNTRVJUKHBhcmVudElubGluZUJv
eC0+aXNJbmxpbmVCb3goKSk7Ci0gICAgYXV0byYgZm9udE1ldHJpY3MgPSBwYXJlbnRJbmxpbmVC
b3gtPnN0eWxlKCkuZm9udE1ldHJpY3MoKTsKLSAgICBhdXRvIHJ1bmxvZ2ljYWxUb3AgPSBwYXJl
bnRJbmxpbmVCb3gtPmxvZ2ljYWxUb3AoKSArIHBhcmVudElubGluZUJveC0+YmFzZWxpbmUoKSAt
IGZvbnRNZXRyaWNzLmFzY2VudCgpOwotCi0gICAgd2hpbGUgKHBhcmVudElubGluZUJveCAhPSAm
bV9yb290SW5saW5lQm94ICYmICFwYXJlbnRJbmxpbmVCb3gtPmhhc0xpbmVCb3hSZWxhdGl2ZUFs
aWdubWVudCgpKSB7Ci0gICAgICAgIHBhcmVudElubGluZUJveCA9ICZpbmxpbmVMZXZlbEJveEZv
ckxheW91dEJveChwYXJlbnRJbmxpbmVCb3gtPmxheW91dEJveCgpLnBhcmVudCgpKTsKLSAgICAg
ICAgQVNTRVJUKHBhcmVudElubGluZUJveC0+aXNJbmxpbmVCb3goKSk7Ci0gICAgICAgIHJ1bmxv
Z2ljYWxUb3AgKz0gcGFyZW50SW5saW5lQm94LT5sb2dpY2FsVG9wKCk7Ci0gICAgfQotICAgIElu
bGluZUxheW91dFVuaXQgbG9naWNhbEhlaWdodCA9IGZvbnRNZXRyaWNzLmhlaWdodCgpOwotICAg
IHJldHVybiB7IHJ1bmxvZ2ljYWxUb3AsIG1fcm9vdElubGluZUJveC5sb2dpY2FsTGVmdCgpICsg
cnVuLmxvZ2ljYWxMZWZ0KCksIHJ1bi5sb2dpY2FsV2lkdGgoKSwgbG9naWNhbEhlaWdodCB9Owot
fQotCi1JbmxpbmVSZWN0IExpbmVCb3g6OmxvZ2ljYWxSZWN0Rm9yTGluZUJyZWFrQm94KGNvbnN0
IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNMaW5lQnJl
YWtCb3goKSk7Ci0gICAgcmV0dXJuIGxvZ2ljYWxSZWN0Rm9ySW5saW5lTGV2ZWxCb3gobGF5b3V0
Qm94KTsKLX0KLQotSW5saW5lUmVjdCBMaW5lQm94Ojpsb2dpY2FsUmVjdEZvcklubGluZUxldmVs
Qm94KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3gu
aXNJbmxpbmVMZXZlbEJveCgpIHx8IGxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKTsKLSAgICAv
LyBJbmxpbmUgbGV2ZWwgYm94ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZWlyIHBhcmVudCB1bmxlc3Mg
dGhlIHZlcnRpY2FsIGFsaWdubWVudCBtYWtlcyB0aGVtIHJlbGF0aXZlIHRvIHRoZSBsaW5lIGJv
eCAoZS5nLiB0b3AsIGJvdHRvbSkuCi0gICAgYXV0byogaW5saW5lQm94ID0gJmlubGluZUxldmVs
Qm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0gICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmVj
dCA9IGlubGluZUJveC0+bG9naWNhbFJlY3QoKTsKLSAgICBpZiAoaW5saW5lQm94LT5oYXNMaW5l
Qm94UmVsYXRpdmVBbGlnbm1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGlubGluZUJveExvZ2ljYWxS
ZWN0OwotCi0gICAgLy8gRmFzdCBwYXRoIGZvciBpbmxpbmUgbGV2ZWwgYm94ZXMgb24gdGhlIHJv
b3QgaW5saW5lIGJveCAoZS5nIDxkaXY+PGltZz48L2Rpdj4pLgotICAgIGlmICgmbGF5b3V0Qm94
LnBhcmVudCgpID09ICZtX3Jvb3RJbmxpbmVCb3gubGF5b3V0Qm94KCkpIHsKLSAgICAgICAgaW5s
aW5lQm94TG9naWNhbFJlY3QubW92ZVZlcnRpY2FsbHkobV9yb290SW5saW5lQm94LmxvZ2ljYWxU
b3AoKSk7Ci0gICAgICAgIHJldHVybiBpbmxpbmVCb3hMb2dpY2FsUmVjdDsKLSAgICB9Ci0KLSAg
ICAvLyBlLmcgPGRpdj48c3Bhbj48aW1nPjwvc3Bhbj48L2Rpdj4KLSAgICBhdXRvIGlubGluZUJv
eEFic29sdXRlbG9naWNhbFRvcCA9IGlubGluZUJveExvZ2ljYWxSZWN0LnRvcCgpOwotICAgIHdo
aWxlIChpbmxpbmVCb3ggIT0gJm1fcm9vdElubGluZUJveCAmJiAhaW5saW5lQm94LT5oYXNMaW5l
Qm94UmVsYXRpdmVBbGlnbm1lbnQoKSkgewotICAgICAgICBpbmxpbmVCb3ggPSAmaW5saW5lTGV2
ZWxCb3hGb3JMYXlvdXRCb3goaW5saW5lQm94LT5sYXlvdXRCb3goKS5wYXJlbnQoKSk7Ci0gICAg
ICAgIEFTU0VSVChpbmxpbmVCb3gtPmlzSW5saW5lQm94KCkpOwotICAgICAgICBpbmxpbmVCb3hB
YnNvbHV0ZWxvZ2ljYWxUb3AgKz0gaW5saW5lQm94LT5sb2dpY2FsVG9wKCk7Ci0gICAgfQotICAg
IHJldHVybiBJbmxpbmVSZWN0IHsgaW5saW5lQm94QWJzb2x1dGVsb2dpY2FsVG9wLCBpbmxpbmVC
b3hMb2dpY2FsUmVjdC5sZWZ0KCksIGlubGluZUJveExvZ2ljYWxSZWN0LndpZHRoKCksIGlubGlu
ZUJveExvZ2ljYWxSZWN0LmhlaWdodCgpIH07Ci19Ci0KLUlubGluZVJlY3QgTGluZUJveDo6bG9n
aWNhbEJvcmRlckJveEZvckF0b21pY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBjb25zdCBCb3hHZW9tZXRyeSYgYm94R2VvbWV0cnkpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxh
eW91dEJveC5pc0F0b21pY0lubGluZUxldmVsQm94KCkpOwotICAgIGF1dG8gbG9naWNhbFJlY3Qg
PSBsb2dpY2FsUmVjdEZvcklubGluZUxldmVsQm94KGxheW91dEJveCk7Ci0gICAgLy8gSW5saW5l
IGxldmVsIGJveGVzIHVzZSB0aGVpciBtYXJnaW4gYm94IGZvciB2ZXJ0aWNhbCBhbGlnbm1lbnQu
IExldCdzIGNvdmVydCB0aGVtIHRvIGJvcmRlciBib3hlcy4KLSAgICBsb2dpY2FsUmVjdC5tb3Zl
VmVydGljYWxseShib3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUoKSk7Ci0gICAgYXV0byB2ZXJ0aWNh
bE1hcmdpbiA9IGJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpICsgYm94R2VvbWV0cnkubWFyZ2lu
QWZ0ZXIoKTsKLSAgICBsb2dpY2FsUmVjdC5leHBhbmRWZXJ0aWNhbGx5KC12ZXJ0aWNhbE1hcmdp
bik7Ci0gICAgcmV0dXJuIGxvZ2ljYWxSZWN0OwotfQotCi1JbmxpbmVSZWN0IExpbmVCb3g6Omxv
Z2ljYWxCb3JkZXJCb3hGb3JJbmxpbmVCb3goY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEJv
eEdlb21ldHJ5JiBib3hHZW9tZXRyeSkgY29uc3QKLXsKLSAgICBhdXRvIGxvZ2ljYWxSZWN0ID0g
bG9naWNhbFJlY3RGb3JJbmxpbmVMZXZlbEJveChsYXlvdXRCb3gpOwotICAgIC8vIFRoaXMgbG9n
aWNhbCByZWN0IGlzIGFzIHRhbGwgYXMgdGhlICJ0ZXh0IiBjb250ZW50IGlzLiBMZXQncyBhZGp1
c3Qgd2l0aCB2ZXJ0aWNhbCBib3JkZXIgYW5kIHBhZGRpbmcuCi0gICAgYXV0byB2ZXJ0aWNhbEJv
cmRlckFuZFBhZGRpbmcgPSBib3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgYm94R2VvbWV0
cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KTsKLSAgICBsb2dpY2FsUmVjdC5leHBh
bmRWZXJ0aWNhbGx5KHZlcnRpY2FsQm9yZGVyQW5kUGFkZGluZyk7Ci0gICAgbG9naWNhbFJlY3Qu
bW92ZVZlcnRpY2FsbHkoLShib3hHZW9tZXRyeS5ib3JkZXJUb3AoKSArIGJveEdlb21ldHJ5LnBh
ZGRpbmdUb3AoKS52YWx1ZU9yKDBfbHUpKSk7Ci0gICAgcmV0dXJuIGxvZ2ljYWxSZWN0OwotfQot
Ci19IC8vIG5hbWVzcGFjZSBMYXlvdXQKLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKLQotI2VuZGlm
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVMaW5lQm94LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVMaW5lQm94LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MmU5NjYzODM4ZWQz
MmE4ZGRiMTliNWZlYWQyNDY5Nzk5ZjFjMTAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcv
SW5saW5lTGluZUJveC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgot
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
LSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhU
KQotCi0jaW5jbHVkZSAiSW5saW5lTGluZS5oIgotI2luY2x1ZGUgIklubGluZVJlY3QuaCIKLSNp
bmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotI2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYu
aD4KLSNpbmNsdWRlIDx3dGYvV2Vha1B0ci5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1l
c3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgQm94R2VvbWV0cnk7Ci1jbGFzcyBJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dDsKLWNsYXNzIExpbmVCb3hCdWlsZGVyOwotc3RydWN0IFNpbXBsaWZpZWRWZXJ0
aWNhbEFsaWdubWVudDsKLQotLy8gICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX18gTGluZSBCb3gKLS8vIHwgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gfCAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAotLy8gfCAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0t
LS0tLS0gUm9vdCBJbmxpbmUgQm94Ci0vLyB8fCAgIF9fX19fICAgIF9fXyAgICAgIF9fXyAgICAg
ICAgICB8ICAgICAgICAgICAgICAgICAgICB8Ci0vLyB8fCAgfCAgICAgICAgLyAgIFwgICAgLyAg
IFwgICAgICAgICB8ICBJbmxpbmUgTGV2ZWwgQm94ICB8Ci0vLyB8fCAgfF9fX19fICB8ICAgICB8
ICB8ICAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgIGFzY2VudAotLy8gfHwg
IHwgICAgICAgfCAgICAgfCAgfCAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAot
Ly8gfHxfX3xfX19fX19fX1xfX18vX19fX1xfX18vX19fX19fX19ffF9fX19fX19fX19fX19fX19f
X19ffF9fX19fX18gYWxpZ25tZW50X2Jhc2VsaW5lCi0vLyB8fAotLy8gfHwgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW50Ci0vLyB8fF9f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fXwotLy8gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18KLS8vIFRoZSByZXN1bHRpbmcgcmVjdGFuZ3VsYXIgYXJlYSB0aGF0
IGNvbnRhaW5zIHRoZSBib3hlcyB0aGF0IGZvcm0gYSBzaW5nbGUgbGluZSBvZiBpbmxpbmUtbGV2
ZWwgY29udGVudCBpcyBjYWxsZWQgYSBsaW5lIGJveC4KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9U
Ui9jc3MtaW5saW5lLTMvI21vZGVsCi1jbGFzcyBMaW5lQm94IHsKLSAgICBXVEZfTUFLRV9GQVNU
X0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBzdHJ1Y3QgSW5saW5lTGV2ZWxCb3ggewotICAgIHB1
YmxpYzoKLSAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGluZUxldmVsQm94IGNyZWF0ZUlubGlu
ZUJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIHN0YXRpYyBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveCBjcmVhdGVBdG9taWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplKTsKLSAgICAgICAgc3RhdGljIExpbmVC
b3g6OklubGluZUxldmVsQm94IGNyZWF0ZUxpbmVCcmVha0JveChjb25zdCBCb3gmLCBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGluZUxl
dmVsQm94IGNyZWF0ZUdlbmVyaWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxMZWZ0KTsKLQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5l
KCkgY29uc3QgeyByZXR1cm4gbV9iYXNlbGluZTsgfQotICAgICAgICBPcHRpb25hbDxJbmxpbmVM
YXlvdXRVbml0PiBkZXNjZW50KCkgY29uc3QgeyByZXR1cm4gbV9kZXNjZW50OyB9Ci0gICAgICAg
IC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWlubGluZS0zLyNsYXlvdXQtYm91bmRz
Ci0gICAgICAgIHN0cnVjdCBMYXlvdXRCb3VuZHMgewotICAgICAgICAgICAgSW5saW5lTGF5b3V0
VW5pdCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBhc2NlbnQgKyBkZXNjZW50OyB9Ci0gICAgICAg
ICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGF5b3V0Qm91bmRzJiBvdGhlcikgY29uc3QgeyBy
ZXR1cm4gYXNjZW50ID09IG90aGVyLmFzY2VudCAmJiBkZXNjZW50ID09IG90aGVyLmRlc2NlbnQ7
IH0KLQotICAgICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBhc2NlbnQgeyAwIH07Ci0gICAgICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IGRlc2NlbnQgeyAwIH07Ci0gICAgICAgIH07Ci0gICAgICAg
IExheW91dEJvdW5kcyBsYXlvdXRCb3VuZHMoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJvdW5k
czsgfQotCi0gICAgICAgIGJvb2wgaGFzQ29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzQ29u
dGVudDsgfQotICAgICAgICB2b2lkIHNldEhhc0NvbnRlbnQoKTsKLQotICAgICAgICBWZXJ0aWNh
bEFsaWduIHZlcnRpY2FsQWxpZ24oKSBjb25zdCB7IHJldHVybiBsYXlvdXRCb3goKS5zdHlsZSgp
LnZlcnRpY2FsQWxpZ24oKTsgfQotICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0
IHsgcmV0dXJuICptX2xheW91dEJveDsgfQotICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5
bGUoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJveC0+c3R5bGUoKTsgfQotCi0gICAgICAgIGJv
b2wgaXNJbmxpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gVHlwZTo6SW5saW5lQm94
IHx8IG1fdHlwZSA9PSBUeXBlOjpSb290SW5saW5lQm94OyB9Ci0gICAgICAgIGJvb2wgaXNSb290
SW5saW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IFR5cGU6OlJvb3RJbmxpbmVCb3g7
IH0KLSAgICAgICAgYm9vbCBpc0F0b21pY0lubGluZUxldmVsQm94KCkgY29uc3QgeyByZXR1cm4g
bV90eXBlID09IFR5cGU6OkF0b21pY0lubGluZUxldmVsQm94OyB9Ci0gICAgICAgIGJvb2wgaXNM
aW5lQnJlYWtCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gVHlwZTo6TGluZUJyZWFrQm94
OyB9Ci0gICAgICAgIGJvb2wgaGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkgY29uc3Q7Ci0K
LSAgICAgICAgZW51bSBjbGFzcyBUeXBlIDogdWludDhfdCB7Ci0gICAgICAgICAgICBJbmxpbmVC
b3ggICAgICAgICAgICAgPSAxIDw8IDAsCi0gICAgICAgICAgICBSb290SW5saW5lQm94ICAgICAg
ICAgPSAxIDw8IDEsCi0gICAgICAgICAgICBBdG9taWNJbmxpbmVMZXZlbEJveCAgPSAxIDw8IDIs
Ci0gICAgICAgICAgICBMaW5lQnJlYWtCb3ggICAgICAgICAgPSAxIDw8IDMsCi0gICAgICAgICAg
ICBHZW5lcmljSW5saW5lTGV2ZWxCb3ggPSAxIDw8IDQKLSAgICAgICAgfTsKLSAgICAgICAgVHlw
ZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9Ci0KLSAgICAgICAgSW5saW5lTGV2ZWxC
b3goY29uc3QgQm94JiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0
U2l6ZSwgVHlwZSk7Ci0gICAgICAgIElubGluZUxldmVsQm94KCkgPSBkZWZhdWx0OwotCi0gICAg
cHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIHN0cnVjdCBTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1l
bnQ7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBMaW5lQm94QnVpbGRlcjsKLSAgICAgICAgZnJpZW5k
IGNsYXNzIExpbmVCb3g7Ci0KLSAgICAgICAgY29uc3QgSW5saW5lUmVjdCYgbG9naWNhbFJlY3Qo
KSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0OyB9Ci0gICAgICAgIElubGluZUxheW91dFVu
aXQgbG9naWNhbFRvcCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3QudG9wKCk7IH0KLSAg
ICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tKCkgY29uc3QgeyByZXR1cm4gbV9s
b2dpY2FsUmVjdC5ib3R0b20oKTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxM
ZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5sZWZ0KCk7IH0KLSAgICAgICAgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0
LndpZHRoKCk7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KCkgY29u
c3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5oZWlnaHQoKTsgfQotCi0gICAgICAgIHZvaWQgc2V0
TG9naWNhbFdpZHRoKElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKSB7IG1fbG9naWNhbFJl
Y3Quc2V0V2lkdGgobG9naWNhbFdpZHRoKTsgfQotICAgICAgICB2b2lkIHNldExvZ2ljYWxIZWln
aHQoSW5saW5lTGF5b3V0VW5pdCk7Ci0gICAgICAgIHZvaWQgc2V0TG9naWNhbFRvcChJbmxpbmVM
YXlvdXRVbml0KTsKLSAgICAgICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0KTsK
LSAgICAgICAgdm9pZCBzZXREZXNjZW50KElubGluZUxheW91dFVuaXQpOwotICAgICAgICB2b2lk
IHNldExheW91dEJvdW5kcyhjb25zdCBMYXlvdXRCb3VuZHMmKTsKLQotICAgIHByaXZhdGU6Ci0g
ICAgICAgIFdlYWtQdHI8Y29uc3QgQm94PiBtX2xheW91dEJveDsKLSAgICAgICAgLy8gVGhpcyBp
cyB0aGUgY29tYmluYXRpb24gb2YgbWFyZ2luIGFuZCBib3JkZXIgYm94ZXMuIElubGluZSBsZXZl
bCBib3hlcyBhcmUgdmVydGljYWxseSBhbGlnbmVkIHVzaW5nIHRoZWlyIG1hcmdpbiBib3hlcy4K
LSAgICAgICAgSW5saW5lUmVjdCBtX2xvZ2ljYWxSZWN0OwotICAgICAgICBMYXlvdXRCb3VuZHMg
bV9sYXlvdXRCb3VuZHM7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbV9iYXNlbGluZSB7IDAg
fTsKLSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gbV9kZXNjZW50OwotICAgICAg
ICBib29sIG1faGFzQ29udGVudCB7IGZhbHNlIH07Ci0gICAgICAgIFR5cGUgbV90eXBlIHsgVHlw
ZTo6SW5saW5lQm94IH07Ci0gICAgfTsKLQotICAgIExpbmVCb3goY29uc3QgQm94JiByb290TGF5
b3V0Qm94LCBjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgbG9naWNhbFRvcExlZnQsIElubGluZUxh
eW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxpbmVMb2dpY2Fs
V2lkdGgsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCwgc2l6ZV90IG5vblNw
YW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCk7Ci0KLSAgICBjb25zdCBJbmxpbmVSZWN0JiBsb2dp
Y2FsUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3Q7IH0KLSAgICBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxTaXplKCkud2lkdGgo
KTsgfQotICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbEhlaWdodCgpIGNvbnN0IHsgcmV0dXJu
IGxvZ2ljYWxTaXplKCkuaGVpZ2h0KCk7IH0KLSAgICBJbmxpbmVMYXlvdXRQb2ludCBsb2dpY2Fs
VG9wTGVmdCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkudG9wTGVmdCgpOyB9Ci0gICAg
SW5saW5lTGF5b3V0U2l6ZSBsb2dpY2FsU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0
KCkuc2l6ZSgpOyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoKCkg
Y29uc3QgeyByZXR1cm4gbV9jb250ZW50TG9naWNhbFdpZHRoOyB9Ci0KLSAgICAvLyBOb3RlIHRo
YXQgdGhlIGxpbmUgY2FuIGhhdmUgbWFueSBpbmxpbmUgYm94ZXMgYW5kIGJlICJlbXB0eSIgdGhl
IHNhbWUgdGltZSBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2Rpdj4KLSAg
ICBib29sIGhhc0NvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX2hhc0NvbnRlbnQ7IH0KLSAgICBi
b29sIGhhc0lubGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYm94VHlwZXMuY29udGFpbnMoSW5s
aW5lTGV2ZWxCb3g6OlR5cGU6OklubGluZUJveCk7IH0KLSAgICBib29sIGhhc05vbklubGluZUJv
eCgpIGNvbnN0IHsgcmV0dXJuIG1fYm94VHlwZXMuY29udGFpbnNBbnkoeyBJbmxpbmVMZXZlbEJv
eDo6VHlwZTo6QXRvbWljSW5saW5lTGV2ZWxCb3gsIElubGluZUxldmVsQm94OjpUeXBlOjpMaW5l
QnJlYWtCb3gsIElubGluZUxldmVsQm94OjpUeXBlOjpHZW5lcmljSW5saW5lTGV2ZWxCb3ggfSk7
IH0KLSAgICBib29sIGhhc0F0b21pY0lubGluZUxldmVsQm94KCkgY29uc3QgeyByZXR1cm4gbV9i
b3hUeXBlcy5jb250YWlucyhJbmxpbmVMZXZlbEJveDo6VHlwZTo6QXRvbWljSW5saW5lTGV2ZWxC
b3gpOyB9Ci0KLSAgICBjb25zdCBJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3hGb3JMYXlv
dXRCb3goY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8TGlu
ZUJveCY+KCp0aGlzKS5pbmxpbmVMZXZlbEJveEZvckxheW91dEJveChsYXlvdXRCb3gpOyB9Ci0K
LSAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9yVGV4dFJ1bihjb25zdCBMaW5lOjpSdW4mKSBj
b25zdDsKLSAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9yTGluZUJyZWFrQm94KGNvbnN0IEJv
eCYpIGNvbnN0OwotICAgIElubGluZVJlY3QgbG9naWNhbFJlY3RGb3JSb290SW5saW5lQm94KCkg
Y29uc3QgeyByZXR1cm4gbV9yb290SW5saW5lQm94LmxvZ2ljYWxSZWN0KCk7IH0KLSAgICBJbmxp
bmVSZWN0IGxvZ2ljYWxCb3JkZXJCb3hGb3JBdG9taWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gm
LCBjb25zdCBCb3hHZW9tZXRyeSYpIGNvbnN0OwotICAgIElubGluZVJlY3QgbG9naWNhbEJvcmRl
ckJveEZvcklubGluZUJveChjb25zdCBCb3gmLCBjb25zdCBCb3hHZW9tZXRyeSYpIGNvbnN0Owot
Ci0gICAgY29uc3QgSW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3goKSBjb25zdCB7IHJldHVy
biBtX3Jvb3RJbmxpbmVCb3g7IH0KLSAgICB1c2luZyBJbmxpbmVMZXZlbEJveExpc3QgPSBWZWN0
b3I8SW5saW5lTGV2ZWxCb3g+OwotICAgIGNvbnN0IElubGluZUxldmVsQm94TGlzdCYgbm9uUm9v
dElubGluZUxldmVsQm94ZXMoKSBjb25zdCB7IHJldHVybiBtX25vblJvb3RJbmxpbmVMZXZlbEJv
eExpc3Q7IH0KLQotICAgIElubGluZUxheW91dFVuaXQgYWxpZ25tZW50QmFzZWxpbmUoKSBjb25z
dCB7IHJldHVybiBtX3Jvb3RJbmxpbmVCb3gubG9naWNhbFRvcCgpICsgbV9yb290SW5saW5lQm94
LmJhc2VsaW5lKCk7IH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgTGluZUJveEJ1aWxk
ZXI7Ci0KLSAgICB2b2lkIHNldExvZ2ljYWxIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
SGVpZ2h0KSB7IG1fbG9naWNhbFJlY3Quc2V0SGVpZ2h0KGxvZ2ljYWxIZWlnaHQpOyB9Ci0KLSAg
ICB2b2lkIGFkZElubGluZUxldmVsQm94KElubGluZUxldmVsQm94JiYpOwotICAgIElubGluZUxl
dmVsQm94TGlzdCYgbm9uUm9vdElubGluZUxldmVsQm94ZXMoKSB7IHJldHVybiBtX25vblJvb3RJ
bmxpbmVMZXZlbEJveExpc3Q7IH0KLQotICAgIElubGluZUxldmVsQm94JiByb290SW5saW5lQm94
KCkgeyByZXR1cm4gbV9yb290SW5saW5lQm94OyB9Ci0KLSAgICBJbmxpbmVMZXZlbEJveCYgaW5s
aW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3goY29uc3QgQm94JiBsYXlvdXRCb3gpIHsgcmV0dXJuICZs
YXlvdXRCb3ggPT0gJm1fcm9vdElubGluZUJveC5sYXlvdXRCb3goKSA/IG1fcm9vdElubGluZUJv
eCA6IG1fbm9uUm9vdElubGluZUxldmVsQm94TGlzdFttX25vblJvb3RJbmxpbmVMZXZlbEJveE1h
cC5nZXQoJmxheW91dEJveCldOyB9Ci0gICAgSW5saW5lUmVjdCBsb2dpY2FsUmVjdEZvcklubGlu
ZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdDsKLQotICAgIHZvaWQgc2V0SGFz
Q29udGVudChib29sIGhhc0NvbnRlbnQpIHsgbV9oYXNDb250ZW50ID0gaGFzQ29udGVudDsgfQot
Ci1wcml2YXRlOgotICAgIElubGluZVJlY3QgbV9sb2dpY2FsUmVjdDsKLSAgICBJbmxpbmVMYXlv
dXRVbml0IG1fY29udGVudExvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICBib29sIG1faGFzQ29udGVu
dCB7IGZhbHNlIH07Ci0gICAgT3B0aW9uU2V0PElubGluZUxldmVsQm94OjpUeXBlPiBtX2JveFR5
cGVzOwotCi0gICAgSW5saW5lTGV2ZWxCb3ggbV9yb290SW5saW5lQm94OwotICAgIElubGluZUxl
dmVsQm94TGlzdCBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Q7Ci0KLSAgICBIYXNoTWFwPGNv
bnN0IEJveCosIHNpemVfdD4gbV9ub25Sb290SW5saW5lTGV2ZWxCb3hNYXA7Ci19OwotCi1pbmxp
bmUgTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0
ZUF0b21pY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIGxvZ2ljYWxTaXplKQotewotICAgIHJl
dHVybiBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCB7IGxheW91dEJveCwgbG9naWNhbExlZnQsIGxv
Z2ljYWxTaXplLCBUeXBlOjpBdG9taWNJbmxpbmVMZXZlbEJveCB9OwotfQotCi1pbmxpbmUgTGlu
ZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUlubGlu
ZUJveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwg
SW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgcmV0dXJuIExpbmVCb3g6Oklu
bGluZUxldmVsQm94IHsgbGF5b3V0Qm94LCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0U2l6ZSB7
IGxvZ2ljYWxXaWR0aCwgeyB9IH0sIFR5cGU6OklubGluZUJveCB9OwotfQotCi1pbmxpbmUgTGlu
ZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUxpbmVC
cmVha0JveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVm
dCkKLXsKLSAgICByZXR1cm4gTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggeyBsYXlvdXRCb3gsIGxv
Z2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgfSwgVHlwZTo6TGluZUJyZWFrQm94IH07Ci19
Ci0KLWlubGluZSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBMaW5lQm94OjpJbmxpbmVMZXZlbEJv
eDo6Y3JlYXRlR2VuZXJpY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KQotewotICAgIHJldHVybiBMaW5lQm94OjpJbmxpbmVM
ZXZlbEJveCB7IGxheW91dEJveCwgbG9naWNhbExlZnQsIElubGluZUxheW91dFNpemUgeyB9LCBU
eXBlOjpHZW5lcmljSW5saW5lTGV2ZWxCb3ggfTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVC
dWlsZGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZUxpbmVCdWlsZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2MjZlYTBl
ZTVhNjNhNGE5NjJiMTU1Y2U2MTA2NTMwZmNlMjJmMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0
dGluZy9JbmxpbmVMaW5lQnVpbGRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NTcgKzAsMCBA
QAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5l
QnVpbGRlci5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNp
bmNsdWRlICJGbG9hdGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dEJveEdlb21l
dHJ5LmgiCi0jaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKLSNpbmNsdWRlICJUZXh0VXRpbC5oIgot
I2luY2x1ZGUgPHd0Zi91bmljb2RlL0NoYXJhY3Rlck5hbWVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJD
b3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1zdGF0aWMgaW5saW5lIGJvb2wgZW5kc1dpdGhT
b2Z0V3JhcE9wcG9ydHVuaXR5KGNvbnN0IElubGluZVRleHRJdGVtJiBjdXJyZW50VGV4dEl0ZW0s
IGNvbnN0IElubGluZVRleHRJdGVtJiBuZXh0SW5saW5lVGV4dEl0ZW0pCi17Ci0gICAgQVNTRVJU
KCFuZXh0SW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpOwotICAgIC8vIFdlIGFyZSBhdCB0
aGUgcG9zaXRpb24gYWZ0ZXIgYSB3aGl0ZXNwYWNlLgotICAgIGlmIChjdXJyZW50VGV4dEl0ZW0u
aXNXaGl0ZXNwYWNlKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIC8vIFdoZW4gYm90aCB0
aGVzZSBub24td2hpdGVzcGFjZSBydW5zIGJlbG9uZyB0byB0aGUgc2FtZSBsYXlvdXQgYm94LCBp
dCdzIGd1YXJhbnRlZWQgdGhhdAotICAgIC8vIHRoZXkgYXJlIHNwbGl0IGF0IGEgc29mdCBicmVh
a2luZyBvcHBvcnR1bml0eS4gU2VlIElubGluZVRleHRJdGVtOjptb3ZlVG9OZXh0QnJlYWthYmxl
UG9zaXRpb24uCi0gICAgaWYgKCZjdXJyZW50VGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpID09ICZu
ZXh0SW5saW5lVGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICAvLyBOb3cgd2UgbmVlZCB0byBjb2xsZWN0IGF0IGxlYXN0IDMgYWRqYWNlbnQgY2hhcmFj
dGVycyB0byBiZSBhYmxlIHRvIG1ha2UgYSBkZWNpc2lvbiB3aGV0aGVyIHRoZSBwcmV2aW91cyB0
ZXh0IGl0ZW0gZW5kcyB3aXRoIGJyZWFraW5nIG9wcG9ydHVuaXR5LgotICAgIC8vIFtleC1dW2Ft
cGxlXSA8LSBzZWNvbmQgdG8gbGFzdFt4XSBsYXN0Wy1dIGN1cnJlbnRbYV0KLSAgICAvLyBXZSBu
ZWVkIGF0IGxlYXN0IDEgY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IGlubGluZSB0ZXh0IGl0ZW0g
YW5kIDIgbW9yZSBmcm9tIHByZXZpb3VzIGlubGluZSBpdGVtcy4KLSAgICBhdXRvIHByZXZpb3Vz
Q29udGVudCA9IGN1cnJlbnRUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpOwotICAg
IGF1dG8gbGluZUJyZWFrSXRlcmF0b3IgPSBMYXp5TGluZUJyZWFrSXRlcmF0b3IgeyBuZXh0SW5s
aW5lVGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpLmNvbnRlbnQoKSB9OwotICAgIGF1dG8gcHJldmlv
dXNDb250ZW50TGVuZ3RoID0gcHJldmlvdXNDb250ZW50Lmxlbmd0aCgpOwotICAgIC8vIEZJWE1F
OiBXZSBzaG91bGQgbG9vayBpbnRvIHRoZSBlbnRpcmUgdW5jb21taXR0ZWQgY29udGVudCBmb3Ig
bW9yZSB0ZXh0IGNvbnRleHQuCi0gICAgVUNoYXIgbGFzdENoYXJhY3RlciA9IHByZXZpb3VzQ29u
dGVudExlbmd0aCA/IHByZXZpb3VzQ29udGVudFtwcmV2aW91c0NvbnRlbnRMZW5ndGggLSAxXSA6
IDA7Ci0gICAgaWYgKGxhc3RDaGFyYWN0ZXIgPT0gc29mdEh5cGhlbiAmJiBjdXJyZW50VGV4dEl0
ZW0uc3R5bGUoKS5oeXBoZW5zKCkgPT0gSHlwaGVuczo6Tm9uZSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIFVDaGFyIHNlY29uZFRvTGFzdENoYXJhY3RlciA9IHByZXZpb3VzQ29udGVudExl
bmd0aCA+IDEgPyBwcmV2aW91c0NvbnRlbnRbcHJldmlvdXNDb250ZW50TGVuZ3RoIC0gMl0gOiAw
OwotICAgIGxpbmVCcmVha0l0ZXJhdG9yLnNldFByaW9yQ29udGV4dChsYXN0Q2hhcmFjdGVyLCBz
ZWNvbmRUb0xhc3RDaGFyYWN0ZXIpOwotICAgIC8vIE5vdyBjaGVjayBpZiB3ZSBjYW4gYnJlYWsg
cmlnaHQgYXQgdGhlIGlubGluZSBpdGVtIGJvdW5kYXJ5LgotICAgIC8vIFdpdGggdGhlIFtleC1h
bXBsZV0sIGZpbmROZXh0QnJlYWthYmxlUG9zaXRpb24gc2hvdWxkIHJldHVybiB0aGUgc3RhcnRQ
b3NpdGlvbiAoMCkuCi0gICAgLy8gRklYTUU6IENoZWNrIGlmIHRoZXJlJ3MgYSBtb3JlIGNvcnJl
Y3Qgd2F5IG9mIGZpbmRpbmcgYnJlYWtpbmcgb3Bwb3J0dW5pdGllcy4KLSAgICByZXR1cm4gIVRl
eHRVdGlsOjpmaW5kTmV4dEJyZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCAwLCBu
ZXh0SW5saW5lVGV4dEl0ZW0uc3R5bGUoKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0F0
U29mdFdyYXBPcHBvcnR1bml0eShjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQsIGNvbnN0IElubGluZUl0ZW0mIGN1cnJlbnQsIGNvbnN0IElubGlu
ZUl0ZW0mIG5leHQpCi17Ci0gICAgLy8gImlzIGF0IiBzaW1wbGUgbWVhbnMgdGhhdCB0aGVyZSdz
IGEgc29mdCB3cmFwIG9wcG9ydHVuaXR5IHJpZ2h0IGFmdGVyIHRoZSBbY3VycmVudF0uCi0gICAg
Ly8gW3RleHRdWyBdW3RleHRdW2lubGluZSBib3ggc3RhcnRdLi4uICg8ZGl2PnRleHQgY29udGVu
dDxzcGFuPi4uPC9kaXY+KQotICAgIC8vIHNvZnQgd3JhcCBpbmRleGVzOiAwIGFuZCAxIGRlZmlu
aXRlbHksIDIgZGVwZW5kcyBvbiB0aGUgY29udGVudCBhZnRlciB0aGUgW2lubGluZSBib3ggc3Rh
cnRdLgotCi0gICAgLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy10ZXh0LTMvI2xpbmUt
YnJlYWstZGV0YWlscwotICAgIC8vIEZpZ3VyZSBvdXQgaWYgdGhlIG5ldyBpbmNvbWluZyBjb250
ZW50IHB1dHMgdGhlIHVuY29tbWl0dGVkIGNvbnRlbnQgb24gYSBzb2Z0IHdyYXAgb3Bwb3J0dW5p
dHkuCi0gICAgLy8gZS5nLiBbaW5saW5lIGJveCBzdGFydF1bcHJpb3JfY29udGludW91c19jb250
ZW50XVtpbmxpbmUgYm94IGVuZF0gKDxzcGFuPnByaW9yX2NvbnRpbnVvdXNfY29udGVudDwvc3Bh
bj4pCi0gICAgLy8gQW4gaW5jb21pbmcgPGltZz4gYm94IHdvdWxkIGVuYWJsZSB1cyB0byBjb21t
aXQgdGhlICI8c3Bhbj5wcmlvcl9jb250aW51b3VzX2NvbnRlbnQ8L3NwYW4+IiBjb250ZW50Ci0g
ICAgLy8gYnV0IGFuIGluY29taW5nIHRleHQgY29udGVudCB3b3VsZCBub3QgbmVjZXNzYXJpbHku
Ci0gICAgQVNTRVJUKGN1cnJlbnQuaXNUZXh0KCkgfHwgY3VycmVudC5pc0JveCgpIHx8IGN1cnJl
bnQuaXNGbG9hdCgpKTsKLSAgICBBU1NFUlQobmV4dC5pc1RleHQoKSB8fCBuZXh0LmlzQm94KCkg
fHwgbmV4dC5pc0Zsb2F0KCkpOwotICAgIGlmIChjdXJyZW50LmlzVGV4dCgpICYmIG5leHQuaXNU
ZXh0KCkpIHsKLSAgICAgICAgYXV0byYgY3VycmVudElubGluZVRleHRJdGVtID0gZG93bmNhc3Q8
SW5saW5lVGV4dEl0ZW0+KGN1cnJlbnQpOwotICAgICAgICBhdXRvJiBuZXh0SW5saW5lVGV4dEl0
ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4obmV4dCk7Ci0gICAgICAgIGlmIChjdXJyZW50
SW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpIHsKLSAgICAgICAgICAgIC8vIFsgXVt0ZXh0
XSA6IGFmdGVyIFt3aGl0ZXNwYWNlXSBwb3NpdGlvbiBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0
eS4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZXh0
SW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpIHsKLSAgICAgICAgICAgIC8vIFt0ZXh0XVsg
XSAoPHNwYW4+dGV4dDwvc3Bhbj4gKQotICAgICAgICAgICAgLy8gd2hpdGUtc3BhY2U6IGJyZWFr
LXNwYWNlczogbGluZSBicmVha2luZyBvcHBvcnR1bml0eSBleGlzdHMgYWZ0ZXIgZXZlcnkgcHJl
c2VydmVkIHdoaXRlIHNwYWNlIGNoYXJhY3RlciwgYnV0IG5vdCBiZWZvcmUuCi0gICAgICAgICAg
ICByZXR1cm4gbmV4dElubGluZVRleHRJdGVtLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9IFdoaXRl
U3BhY2U6OkJyZWFrU3BhY2VzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50LnN0eWxl
KCkubGluZUJyZWFrKCkgPT0gTGluZUJyZWFrOjpBbnl3aGVyZSB8fCBuZXh0LnN0eWxlKCkubGlu
ZUJyZWFrKCkgPT0gTGluZUJyZWFrOjpBbnl3aGVyZSkgewotICAgICAgICAgICAgLy8gVGhlcmUg
aXMgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgYXJvdW5kIGV2ZXJ5IHR5cG9ncmFwaGljIGNoYXJh
Y3RlciB1bml0LCBpbmNsdWRpbmcgYXJvdW5kIGFueSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIKLSAg
ICAgICAgICAgIC8vIG9yIHByZXNlcnZlZCB3aGl0ZSBzcGFjZXMsIG9yIGluIHRoZSBtaWRkbGUg
b2Ygd29yZHMuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAv
LyBCb3RoIGN1cnJlbnQgYW5kIG5leHQgaXRlbXMgYXJlIG5vbi13aGl0ZXNwYWNlIHRleHQuCi0g
ICAgICAgIC8vIFt0ZXh0XVt0ZXh0XSA6IGlzIGEgY29udGludW91cyBjb250ZW50LgotICAgICAg
ICAvLyBbdGV4dC1dW3RleHRdIDogYWZ0ZXIgW2h5cGhlbl0gcG9zaXRpb24gaXMgYSBzb2Z0IHdy
YXAgb3Bwb3J0dW5pdHkuCi0gICAgICAgIHJldHVybiBlbmRzV2l0aFNvZnRXcmFwT3Bwb3J0dW5p
dHkoY3VycmVudElubGluZVRleHRJdGVtLCBuZXh0SW5saW5lVGV4dEl0ZW0pOwotICAgIH0KLSAg
ICBpZiAoY3VycmVudC5pc0Zsb2F0KCkgfHwgbmV4dC5pc0Zsb2F0KCkpIHsKLSAgICAgICAgLy8g
V2hpbGUgZmxvYXRzIGFyZSBub3QgcGFydCBvZiB0aGUgaW5saW5lIGNvbnRlbnQgYW5kIHRoZXkg
YXJlIG5vdCBzdXBwb3NlZCB0byBpbnRyb2R1Y2Ugc29mdCB3cmFwIG9wcG9ydHVuaXRpZXMsCi0g
ICAgICAgIC8vIGUuZy4gW3RleHRdW2Zsb2F0IGJveF1bZmxvYXQgYm94XVt0ZXh0XVtmbG9hdCBi
b3hdW3RleHRdIGlzIGVzc2VudGlhbGx5IGp1c3QgW3RleHRdW3RleHRdW3RleHRdCi0gICAgICAg
IC8vIGZpZ3VyaW5nIG91dCB3aGV0aGVyIGEgZmxvYXQgKG9yIHNldCBvZiBmbG9hdHMpIHNob3Vs
ZCBzdGF5IG9uIHRoZSBsaW5lIG9yIG5vdCAoYW5kIGhhbmRsZSBwb3RlbnRpYWxseSBvdXQgb2Yg
b3JkZXIgaW5saW5lIGl0ZW1zKQotICAgICAgICAvLyBicmluZ3MgaW4gdW5uZWNlc3NhcnkgY29t
cGxleGl0eS4KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChjdXJyZW50Lmlz
Qm94KCkgfHwgbmV4dC5pc0JveCgpKSB7Ci0gICAgICAgIGF1dG8gaXNJbWFnZUNvbnRlbnQgPSBj
dXJyZW50LmxheW91dEJveCgpLmlzSW1hZ2UoKSB8fCBuZXh0LmxheW91dEJveCgpLmlzSW1hZ2Uo
KTsKLSAgICAgICAgaWYgKGlzSW1hZ2VDb250ZW50KQotICAgICAgICAgICAgcmV0dXJuIGlubGlu
ZUZvcm1hdHRpbmdDb250ZXh0LnF1aXJrcygpLmhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdl
KCk7Ci0gICAgICAgIC8vIFt0ZXh0XVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF1b
aW5saW5lIGJveF0gKHRleHQ8c3Bhbj48L3NwYW4+PGltZz4pIDogdGhlcmUncyBhIHNvZnQgd3Jh
cCBvcHBvcnR1bml0eSBiZXR3ZWVuIHRoZSBbdGV4dF0gYW5kIFtpbWddLgotICAgICAgICAvLyBU
aGUgbGluZSBicmVha2luZyBiZWhhdmlvciBvZiBhIHJlcGxhY2VkIGVsZW1lbnQgb3Igb3RoZXIg
YXRvbWljIGlubGluZSBpcyBlcXVpdmFsZW50IHRvIGFuIGlkZW9ncmFwaGljIGNoYXJhY3Rlci4K
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwot
ICAgIHJldHVybiB0cnVlOwotfQotCi1zdHJ1Y3QgTGluZUNhbmRpZGF0ZSB7Ci0gICAgTGluZUNh
bmRpZGF0ZShib29sIGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZyk7Ci0KLSAgICB2b2lkIHJl
c2V0KCk7Ci0KLSAgICBzdHJ1Y3QgSW5saW5lQ29udGVudCB7Ci0gICAgICAgIElubGluZUNvbnRl
bnQoYm9vbCBpZ25vcmVUcmFpbGluZ0xldHRlclNwYWNpbmcpOwotCi0gICAgICAgIGNvbnN0IElu
bGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQo
KSBjb25zdCB7IHJldHVybiBtX2NvbnRpbnVvdXNDb250ZW50OyB9Ci0gICAgICAgIGNvbnN0IElu
bGluZUl0ZW0qIHRyYWlsaW5nTGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ0xp
bmVCcmVhazsgfQotICAgICAgICBjb25zdCBJbmxpbmVJdGVtKiB0cmFpbGluZ1dvcmRCcmVha09w
cG9ydHVuaXR5KCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5
OyB9Ci0KLSAgICAgICAgdm9pZCBhcHBlbmRJbmxpbmVJdGVtKGNvbnN0IElubGluZUl0ZW0mLCBJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIHZvaWQgYXBwZW5kVHJhaWxp
bmdMaW5lQnJlYWsoY29uc3QgSW5saW5lSXRlbSYgbGluZUJyZWFrSXRlbSkgeyBtX3RyYWlsaW5n
TGluZUJyZWFrID0gJmxpbmVCcmVha0l0ZW07IH0KLSAgICAgICAgdm9pZCBhcHBlbmR0cmFpbGlu
Z1dvcmRCcmVha09wcG9ydHVuaXR5KGNvbnN0IElubGluZUl0ZW0mIHdvcmRCcmVha0l0ZW0pIHsg
bV90cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5ID0gJndvcmRCcmVha0l0ZW07IH0KLSAgICAg
ICAgdm9pZCByZXNldCgpOwotICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBt
X2NvbnRpbnVvdXNDb250ZW50LnJ1bnMoKS5pc0VtcHR5KCkgJiYgIXRyYWlsaW5nV29yZEJyZWFr
T3Bwb3J0dW5pdHkoKSAmJiAhdHJhaWxpbmdMaW5lQnJlYWsoKTsgfQotICAgICAgICBib29sIGhh
c0lubGluZUxldmVsQm94KCkgY29uc3QgeyByZXR1cm4gbV9oYXNJbmxpbmVMZXZlbEJveDsgfQot
Ci0gICAgICAgIHZvaWQgc2V0SGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KGJvb2wgaGFz
VHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KSB7IG1faGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9y
dHVuaXR5ID0gaGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5OyB9Ci0gICAgICAgIGJvb2wg
aGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KCkgY29uc3QgeyByZXR1cm4gbV9oYXNUcmFp
bGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wg
bV9pZ25vcmVUcmFpbGluZ0xldHRlclNwYWNpbmcgeyBmYWxzZSB9OwotCi0gICAgICAgIElubGlu
ZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudCBtX2NvbnRpbnVvdXNDb250ZW50Owot
ICAgICAgICBjb25zdCBJbmxpbmVJdGVtKiBtX3RyYWlsaW5nTGluZUJyZWFrIHsgbnVsbHB0ciB9
OwotICAgICAgICBjb25zdCBJbmxpbmVJdGVtKiBtX3RyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5p
dHkgeyBudWxscHRyIH07Ci0gICAgICAgIGJvb2wgbV9oYXNJbmxpbmVMZXZlbEJveCB7IGZhbHNl
IH07Ci0gICAgICAgIGJvb2wgbV9oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkgeyBmYWxz
ZSB9OwotICAgIH07Ci0KLSAgICAvLyBDYW5kaWRhdGUgY29udGVudCBpcyBhIGNvbGxlY3Rpb24g
b2YgaW5saW5lIGNvbnRlbnQgb3IgYSBmbG9hdCBib3guCi0gICAgSW5saW5lQ29udGVudCBpbmxp
bmVDb250ZW50OwotICAgIGNvbnN0IElubGluZUl0ZW0qIGZsb2F0SXRlbSB7IG51bGxwdHIgfTsK
LX07Ci0KLUxpbmVDYW5kaWRhdGU6OkxpbmVDYW5kaWRhdGUoYm9vbCBpZ25vcmVUcmFpbGluZ0xl
dHRlclNwYWNpbmcpCi0gICAgOiBpbmxpbmVDb250ZW50KGlnbm9yZVRyYWlsaW5nTGV0dGVyU3Bh
Y2luZykKLXsKLX0KLQotTGluZUNhbmRpZGF0ZTo6SW5saW5lQ29udGVudDo6SW5saW5lQ29udGVu
dChib29sIGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKLSAgICA6IG1faWdub3JlVHJhaWxp
bmdMZXR0ZXJTcGFjaW5nKGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKLXsKLX0KLQotaW5s
aW5lIHZvaWQgTGluZUNhbmRpZGF0ZTo6SW5saW5lQ29udGVudDo6YXBwZW5kSW5saW5lSXRlbShj
b25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0
aCkKLXsKLSAgICBBU1NFUlQoaW5saW5lSXRlbS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlzQm94
KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGlu
ZUJveEVuZCgpKTsKLSAgICBhdXRvIGNvbGxhcHNpYmxlV2lkdGggPSBbJl0oKSAtPiBPcHRpb25h
bDxJbmxpbmVMYXlvdXRVbml0PiB7Ci0gICAgICAgIGlmICghaW5saW5lSXRlbS5pc1RleHQoKSkK
LSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIGF1dG8mIGlubGluZVRleHRJdGVtID0g
ZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGlubGluZUl0ZW0pOwotICAgICAgICBpZiAoaW5saW5l
VGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkgJiYgIUlubGluZVRleHRJdGVtOjpzaG91bGRQcmVzZXJ2
ZVNwYWNlc0FuZFRhYnMoaW5saW5lVGV4dEl0ZW0pKSB7Ci0gICAgICAgICAgICAvLyBGdWxseSBj
b2xsYXBzaWJsZSB0cmFpbGluZyBjb250ZW50LgotICAgICAgICAgICAgcmV0dXJuIGxvZ2ljYWxX
aWR0aDsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayBmb3IgcGFydGlhbGx5IGNvbGxhcHNp
YmxlIGNvbnRlbnQuCi0gICAgICAgIGlmIChtX2lnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykK
LSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIGF1dG8gbGV0dGVyU3BhY2luZyA9IGlu
bGluZUl0ZW0uc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCk7Ci0gICAgICAgIGlmIChsZXR0ZXJTcGFj
aW5nIDw9IDApCi0gICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICBBU1NFUlQobG9naWNh
bFdpZHRoID4gbGV0dGVyU3BhY2luZyk7Ci0gICAgICAgIHJldHVybiBsZXR0ZXJTcGFjaW5nOwot
ICAgIH07Ci0gICAgbV9jb250aW51b3VzQ29udGVudC5hcHBlbmQoaW5saW5lSXRlbSwgbG9naWNh
bFdpZHRoLCBjb2xsYXBzaWJsZVdpZHRoKCkpOwotICAgIG1faGFzSW5saW5lTGV2ZWxCb3ggPSBt
X2hhc0lubGluZUxldmVsQm94IHx8IGlubGluZUl0ZW0uaXNCb3goKSB8fCBpbmxpbmVJdGVtLmlz
SW5saW5lQm94U3RhcnQoKTsKLX0KLQotaW5saW5lIHZvaWQgTGluZUNhbmRpZGF0ZTo6SW5saW5l
Q29udGVudDo6cmVzZXQoKQotewotICAgIG1fY29udGludW91c0NvbnRlbnQucmVzZXQoKTsKLSAg
ICBtX3RyYWlsaW5nTGluZUJyZWFrID0geyB9OwotICAgIG1fdHJhaWxpbmdXb3JkQnJlYWtPcHBv
cnR1bml0eSA9IHsgfTsKLSAgICBtX2hhc0lubGluZUxldmVsQm94ID0gZmFsc2U7Ci19Ci0KLWlu
bGluZSB2b2lkIExpbmVDYW5kaWRhdGU6OnJlc2V0KCkKLXsKLSAgICBmbG9hdEl0ZW0gPSBudWxs
cHRyOwotICAgIGlubGluZUNvbnRlbnQucmVzZXQoKTsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBM
aW5lQnVpbGRlcjo6aW5saW5lSXRlbVdpZHRoKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0s
IElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KSBjb25zdAotewotICAgIGlmIChp
czxJbmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSkpIHsKLSAgICAgICAgYXV0byYgaW5saW5lVGV4
dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSk7Ci0gICAgICAgIGlm
IChhdXRvIGNvbnRlbnRXaWR0aCA9IGlubGluZVRleHRJdGVtLndpZHRoKCkpCi0gICAgICAgICAg
ICByZXR1cm4gKmNvbnRlbnRXaWR0aDsKLSAgICAgICAgaWYgKCFpbmxpbmVUZXh0SXRlbS5pc1do
aXRlc3BhY2UoKSB8fCBJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJz
KGlubGluZVRleHRJdGVtKSkKLSAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5s
aW5lVGV4dEl0ZW0sIGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0gICAgICAgIHJldHVybiBUZXh0VXRp
bDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0sIGlubGluZVRleHRJdGVtLnN0YXJ0KCksIGlubGluZVRl
eHRJdGVtLnN0YXJ0KCkgKyAxLCBjb250ZW50TG9naWNhbExlZnQpOwotICAgIH0KLQotICAgIGlm
IChpbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkgfHwgaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9y
dHVuaXR5KCkpCi0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICBhdXRvJiBsYXlvdXRCb3ggPSBp
bmxpbmVJdGVtLmxheW91dEJveCgpOwotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gbV9pbmxpbmVG
b3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwotCi0gICAgaWYgKGxh
eW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gYm94R2VvbWV0
cnkubWFyZ2luQm94V2lkdGgoKTsKLQotICAgIGlmIChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgp
KQotICAgICAgICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luQm94V2lkdGgoKTsKLQotICAgIGlm
IChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSkKLSAgICAgICAgcmV0dXJuIGJveEdlb21l
dHJ5Lm1hcmdpblN0YXJ0KCkgKyBib3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCkgKyBib3hHZW9tZXRy
eS5wYWRkaW5nTGVmdCgpLnZhbHVlT3IoMCk7Ci0KLSAgICBpZiAoaW5saW5lSXRlbS5pc0lubGlu
ZUJveEVuZCgpKQotICAgICAgICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luRW5kKCkgKyBib3hH
ZW9tZXRyeS5ib3JkZXJSaWdodCgpICsgYm94R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVP
cigwKTsKLQotICAgIC8vIE5vbi1yZXBsYWNlZCBpbmxpbmUgYm94IChlLmcuIGlubGluZS1ibG9j
aykKLSAgICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luQm94V2lkdGgoKTsKLX0KLQotTGluZUJ1
aWxkZXI6OkxpbmVCdWlsZGVyKElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCwgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSwgSG9yaXpvbnRhbENvbnN0
cmFpbnRzIHJvb3RIb3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IElubGluZUl0ZW1zJiBpbmxp
bmVJdGVtcykKLSAgICA6IG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQoaW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQpCi0gICAgLCBtX2lubGluZUZvcm1hdHRpbmdTdGF0ZSgmaW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQuZm9ybWF0dGluZ1N0YXRlKCkpCi0gICAgLCBtX2Zsb2F0aW5nU3RhdGUoJmZsb2F0
aW5nU3RhdGUpCi0gICAgLCBtX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHMocm9vdEhvcml6b250
YWxDb25zdHJhaW50cykKLSAgICAsIG1fbGluZShpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLSAg
ICAsIG1faW5saW5lSXRlbXMoaW5saW5lSXRlbXMpCi17Ci19Ci0KLUxpbmVCdWlsZGVyOjpMaW5l
QnVpbGRlcihjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQsIGNvbnN0IElubGluZUl0ZW1zJiBpbmxpbmVJdGVtcykKLSAgICA6IG1faW5saW5lRm9y
bWF0dGluZ0NvbnRleHQoaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCi0gICAgLCBtX2xpbmUoaW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQpCi0gICAgLCBtX2lubGluZUl0ZW1zKGlubGluZUl0ZW1zKQot
ewotfQotCi1MaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQgTGluZUJ1aWxkZXI6OmxheW91dElubGlu
ZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBzaXplX3Qg
cGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBv
dmVyZmxvd0xvZ2ljYWxXaWR0aCwgY29uc3QgSW5saW5lUmVjdCYgaW5pdGlhbExpbmVMb2dpY2Fs
UmVjdCwgYm9vbCBpc0ZpcnN0TGluZSkKLXsKLSAgICBpbml0aWFsaXplKGluaXRpYWxDb25zdHJh
aW50c0ZvckxpbmUoaW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgaXNGaXJzdExpbmUpKTsKLQotICAg
IGF1dG8gY29tbWl0dGVkQ29udGVudCA9IHBsYWNlSW5saW5lQ29udGVudChuZWVkc0xheW91dFJh
bmdlLCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIG92ZXJmbG93TG9naWNhbFdpZHRoKTsK
LSAgICBhdXRvIGNvbW1pdHRlZFJhbmdlID0gY2xvc2UobmVlZHNMYXlvdXRSYW5nZSwgY29tbWl0
dGVkQ29udGVudCk7Ci0KLSAgICBhdXRvIGlzTGFzdExpbmUgPSBpc0xhc3RMaW5lV2l0aElubGlu
ZUNvbnRlbnQoY29tbWl0dGVkUmFuZ2UsIG5lZWRzTGF5b3V0UmFuZ2UuZW5kLCBjb21taXR0ZWRD
b250ZW50LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgpOwotICAgIHJldHVybiBMaW5lQ29u
dGVudCB7IGNvbW1pdHRlZFJhbmdlLCBjb21taXR0ZWRDb250ZW50LnBhcnRpYWxUcmFpbGluZ0Nv
bnRlbnRMZW5ndGgsIGNvbW1pdHRlZENvbnRlbnQub3ZlcmZsb3dMb2dpY2FsV2lkdGgsIG1fZmxv
YXRzLCBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdAotICAgICAgICAsIG1fbGluZUxvZ2lj
YWxSZWN0LnRvcExlZnQoKQotICAgICAgICAsIG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkKLSAg
ICAgICAgLCBtX2xpbmUuY29udGVudExvZ2ljYWxXaWR0aCgpCi0gICAgICAgICwgaXNMYXN0TGlu
ZQotICAgICAgICAsIG1fbGluZS5ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQoKQotICAg
ICAgICAsIG1fbGluZS5ydW5zKCl9OwotfQotCi1MaW5lQnVpbGRlcjo6SW50cmluc2ljQ29udGVu
dCBMaW5lQnVpbGRlcjo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aChjb25zdCBJbmxpbmVJdGVtUmFu
Z2UmIG5lZWRzTGF5b3V0UmFuZ2UsIElubGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgpCi17
Ci0gICAgaW5pdGlhbGl6ZSh7IHsgeyB9LCB7IGF2YWlsYWJsZVdpZHRoLCBtYXhJbmxpbmVMYXlv
dXRVbml0KCkgfSB9LCBmYWxzZSB9KTsKLSAgICBhdXRvIGNvbW1pdHRlZENvbnRlbnQgPSBwbGFj
ZUlubGluZUNvbnRlbnQobmVlZHNMYXlvdXRSYW5nZSwgeyB9LCB7IH0pOwotICAgIGF1dG8gY29t
bWl0dGVkUmFuZ2UgPSBjbG9zZShuZWVkc0xheW91dFJhbmdlLCBjb21taXR0ZWRDb250ZW50KTsK
LSAgICByZXR1cm4geyBjb21taXR0ZWRSYW5nZSwgbV9saW5lLmNvbnRlbnRMb2dpY2FsV2lkdGgo
KSwgbV9mbG9hdHMgfTsKLX0KLQotdm9pZCBMaW5lQnVpbGRlcjo6aW5pdGlhbGl6ZShjb25zdCBV
c2VkQ29uc3RyYWludHMmIGxpbmVDb25zdHJhaW50cykKLXsKLSAgICBtX2Zsb2F0cy5jbGVhcigp
OwotICAgIG1fcGFydGlhbExlYWRpbmdUZXh0SXRlbSA9IHsgfTsKLSAgICBtX3dyYXBPcHBvcnR1
bml0eUxpc3QuY2xlYXIoKTsKLQotICAgIG1fbGluZS5pbml0aWFsaXplKCk7Ci0gICAgbV9saW5l
TG9naWNhbFJlY3QgPSBsaW5lQ29uc3RyYWludHMubG9naWNhbFJlY3Q7Ci0gICAgbV9jb250ZW50
SXNDb25zdHJhaW5lZEJ5RmxvYXQgPSBsaW5lQ29uc3RyYWludHMuaXNDb25zdHJhaW5lZEJ5Rmxv
YXQ7Ci19Ci0KLUxpbmVCdWlsZGVyOjpDb21taXR0ZWRDb250ZW50IExpbmVCdWlsZGVyOjpwbGFj
ZUlubGluZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBz
aXplX3QgcGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRV
bml0PiBsZWFkaW5nTG9naWNhbFdpZHRoKQotewotICAgIGF1dG8gbGluZUNhbmRpZGF0ZSA9IExp
bmVDYW5kaWRhdGUgeyBsYXlvdXRTdGF0ZSgpLnNob3VsZElnbm9yZVRyYWlsaW5nTGV0dGVyU3Bh
Y2luZygpIH07Ci0gICAgYXV0byBpbmxpbmVDb250ZW50QnJlYWtlciA9IElubGluZUNvbnRlbnRC
cmVha2VyIHsgfTsKLQotICAgIGF1dG8gY3VycmVudEl0ZW1JbmRleCA9IG5lZWRzTGF5b3V0UmFu
Z2Uuc3RhcnQ7Ci0gICAgc2l6ZV90IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCA9IDA7Ci0gICAg
d2hpbGUgKGN1cnJlbnRJdGVtSW5kZXggPCBuZWVkc0xheW91dFJhbmdlLmVuZCkgewotICAgICAg
ICAvLyAxLiBDb2xsZWN0IHRoZSBzZXQgb2YgcnVucyB0aGF0IHdlIGNhbiBjb21taXQgdG8gdGhl
IGxpbmUgYXMgb25lIGVudGl0eSBlLmcuIDxzcGFuPnRleHRfYW5kX3NwYW5fc3RhcnRfc3Bhbl9l
bmQ8L3NwYW4+LgotICAgICAgICAvLyAyLiBBcHBseSBmbG9hdHMgYW5kIHNocmluayB0aGUgYXZh
aWxhYmxlIGhvcml6b250YWwgc3BhY2UgZS5nLiA8c3Bhbj5pbnRydV88ZGl2IHN0eWxlPSJmbG9h
dDogbGVmdCI+PC9kaXY+c2l2ZV9mbG9hdDwvc3Bhbj4uCi0gICAgICAgIC8vIDMuIENoZWNrIGlm
IHRoZSBjb250ZW50IGZpdHMgdGhlIGxpbmUgYW5kIGNvbW1pdCB0aGUgY29udGVudCBhY2NvcmRp
bmdseSAoZnVsbCwgcGFydGlhbCBvciBub3QgY29tbWl0IGF0IGFsbCkuCi0gICAgICAgIC8vIDQu
IFJldHVybiBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBlaXRoZXIgYnkgbm90IGJl
aW5nIGFibGUgdG8gZml0IG1vcmUgY29udGVudCBvciBiZWNhdXNlIG9mIGFuIGV4cGxpY2l0IGxp
bmUgYnJlYWsuCi0gICAgICAgIGNhbmRpZGF0ZUNvbnRlbnRGb3JMaW5lKGxpbmVDYW5kaWRhdGUs
IGN1cnJlbnRJdGVtSW5kZXgsIG5lZWRzTGF5b3V0UmFuZ2UsIHBhcnRpYWxMZWFkaW5nQ29udGVu
dExlbmd0aCwgc3RkOjpleGNoYW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6Om51bGxvcHQp
LCBtX2xpbmUuY29udGVudExvZ2ljYWxSaWdodCgpKTsKLSAgICAgICAgLy8gTm93IGNoZWNrIGlm
IHdlIGNhbiBwdXQgdGhpcyBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAgIGF1
dG8gcmVzdWx0ID0gUmVzdWx0IHsgfTsKLSAgICAgICAgaWYgKGxpbmVDYW5kaWRhdGUuZmxvYXRJ
dGVtKSB7Ci0gICAgICAgICAgICBBU1NFUlQobGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50Lmlz
RW1wdHkoKSk7Ci0gICAgICAgICAgICBoYW5kbGVGbG9hdENvbnRlbnQoKmxpbmVDYW5kaWRhdGUu
ZmxvYXRJdGVtKTsKLSAgICAgICAgICAgIC8vIEZsb2F0cyBuZXZlciB0ZXJtaW5hdGUgdGhlIGxp
bmUuCi0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlSW5saW5lQ29u
dGVudChpbmxpbmVDb250ZW50QnJlYWtlciwgbmVlZHNMYXlvdXRSYW5nZSwgbGluZUNhbmRpZGF0
ZSk7Ci0gICAgICAgIGF1dG8gaXNFbmRPZkxpbmUgPSByZXN1bHQuaXNFbmRPZkxpbmUgPT0gSW5s
aW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXM7Ci0gICAgICAgIGlmICghcmVzdWx0
LmNvbW1pdHRlZENvdW50LmlzUmV2ZXJ0KSB7Ci0gICAgICAgICAgICBjb21taXR0ZWRJbmxpbmVJ
dGVtQ291bnQgKz0gcmVzdWx0LmNvbW1pdHRlZENvdW50LnZhbHVlOwotICAgICAgICAgICAgYXV0
byYgaW5saW5lQ29udGVudCA9IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudDsKLSAgICAgICAg
ICAgIGF1dG8gaW5saW5lQ29udGVudElzRnVsbHlDb21taXR0ZWQgPSBpbmxpbmVDb250ZW50LmNv
bnRpbnVvdXNDb250ZW50KCkucnVucygpLnNpemUoKSA9PSByZXN1bHQuY29tbWl0dGVkQ291bnQu
dmFsdWUgJiYgIXJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoOwotICAgICAgICAg
ICAgaWYgKGlubGluZUNvbnRlbnRJc0Z1bGx5Q29tbWl0dGVkKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKGF1dG8qIHdvcmRCcmVha09wcG9ydHVuaXR5ID0gaW5saW5lQ29udGVudC50cmFpbGluZ1dv
cmRCcmVha09wcG9ydHVuaXR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gPHdicj4gbmVl
ZHMgdG8gYmUgb24gdGhlIGxpbmUgYXMgYW4gZW1wdHkgcnVuIHNvIHRoYXQgd2UgY2FuIGNvbnN0
cnVjdCBhbiBpbmxpbmUgYm94IGFuZCBjb21wdXRlIGJhc2ljIGdlb21ldHJ5LgotICAgICAgICAg
ICAgICAgICAgICArK2NvbW1pdHRlZElubGluZUl0ZW1Db3VudDsKLSAgICAgICAgICAgICAgICAg
ICAgbV9saW5lLmFwcGVuZCgqd29yZEJyZWFrT3Bwb3J0dW5pdHksIHsgfSk7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpbmxpbmVDb250ZW50LnRyYWlsaW5nTGluZUJy
ZWFrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRnVsbHkgY29tbWl0dGVkIChvciBlbXB0
eSkgY29udGVudCBmb2xsb3dlZCBieSBhIGxpbmUgYnJlYWsgbWVhbnMgImVuZCBvZiBsaW5lIi4K
LSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgd2lsbCBwdXQgdGhlIGxpbmUgYnJl
YWsgYm94IGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgd2hpbGUgaW4gY2FzZSBvZiBzb21lIGlubGlu
ZSBib3hlcywgdGhlIGxpbmUgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgLy8gY291bGQgdmVy
eSB3ZWxsIGJlIGF0IGFuIGVhcmxpZXIgcG9zaXRpb24uIFRoaXMgaGFzIG5vIHZpc3VhbCBpbXBs
aWNhdGlvbnMgYXQgdGhpcyBwb2ludCB0aG91Z2ggKG9ubHkgZ2VvbWV0cnkgY29ycmVjdG5lc3Mg
b24gdGhlIGxpbmUgYnJlYWsgYm94KS4KLSAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiA8c3Bh
biBzdHlsZT0iYm9yZGVyLXJpZ2h0OiAxMHB4IHNvbGlkIGdyZWVuIj50ZXh0PGJyPjwvc3Bhbj4g
d2hlcmUgdGhlIDxicj4ncyBob3Jpem9udGFsIHBvc2l0aW9uIGlzIGJlZm9yZSB0aGUgcmlnaHQg
Ym9yZGVyIGFuZCBub3QgYWZ0ZXIuCi0gICAgICAgICAgICAgICAgICAgIG1fbGluZS5hcHBlbmQo
KmlubGluZUNvbnRlbnQudHJhaWxpbmdMaW5lQnJlYWsoKSwgeyB9KTsKLSAgICAgICAgICAgICAg
ICAgICAgKytjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlz
RW5kT2ZMaW5lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0gZWxzZQotICAgICAgICAgICAgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50ID0gcmVzdWx0
LmNvbW1pdHRlZENvdW50LnZhbHVlOwotCi0gICAgICAgIGlmIChpc0VuZE9mTGluZSkgewotICAg
ICAgICAgICAgLy8gV2UgY2FuJ3QgcGxhY2UgYW55IG1vcmUgaXRlbXMgb24gdGhlIGN1cnJlbnQg
bGluZS4KLSAgICAgICAgICAgIHJldHVybiB7IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCwgcmVz
dWx0LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgsIHJlc3VsdC5vdmVyZmxvd0xvZ2ljYWxX
aWR0aCB9OwotICAgICAgICB9Ci0gICAgICAgIGN1cnJlbnRJdGVtSW5kZXggPSBuZWVkc0xheW91
dFJhbmdlLnN0YXJ0ICsgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50ICsgbV9mbG9hdHMuc2l6ZSgp
OwotICAgICAgICBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGggPSB7IH07Ci0gICAgfQotICAg
IC8vIExvb2tzIGxpa2Ugd2UndmUgcnVuIG91dCBvZiBydW5zLgotICAgIHJldHVybiB7IGNvbW1p
dHRlZElubGluZUl0ZW1Db3VudCwgeyB9IH07Ci19Ci0KLUxpbmVCdWlsZGVyOjpJbmxpbmVJdGVt
UmFuZ2UgTGluZUJ1aWxkZXI6OmNsb3NlKGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlv
dXRSYW5nZSwgY29uc3QgQ29tbWl0dGVkQ29udGVudCYgY29tbWl0dGVkQ29udGVudCkKLXsKLSAg
ICBBU1NFUlQoY29tbWl0dGVkQ29udGVudC5pbmxpbmVJdGVtQ291bnQgfHwgIW1fZmxvYXRzLmlz
RW1wdHkoKSB8fCBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdCk7Ci0gICAgYXV0byBudW1i
ZXJPZkNvbW1pdHRlZEl0ZW1zID0gY29tbWl0dGVkQ29udGVudC5pbmxpbmVJdGVtQ291bnQgKyBt
X2Zsb2F0cy5zaXplKCk7Ci0gICAgYXV0byB0cmFpbGluZ0lubGluZUl0ZW1JbmRleCA9IG5lZWRz
TGF5b3V0UmFuZ2Uuc3RhcnQgKyBudW1iZXJPZkNvbW1pdHRlZEl0ZW1zIC0gMTsKLSAgICBhdXRv
IGxpbmVSYW5nZSA9IElubGluZUl0ZW1SYW5nZSB7IG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQsIHRy
YWlsaW5nSW5saW5lSXRlbUluZGV4ICsgMSB9OwotICAgIEFTU0VSVChsaW5lUmFuZ2UuZW5kIDw9
IG5lZWRzTGF5b3V0UmFuZ2UuZW5kKTsKLSAgICBpZiAoIWNvbW1pdHRlZENvbnRlbnQuaW5saW5l
SXRlbUNvdW50KSB7Ci0gICAgICAgIC8vIExpbmUgaXMgZW1wdHksIHdlIG9ubHkgbWFuYWdlZCB0
byBwbGFjZSBmbG9hdCBib3hlcy4KLSAgICAgICAgcmV0dXJuIGxpbmVSYW5nZTsKLSAgICB9Ci0g
ICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkgLSBtX2xp
bmUuY29udGVudExvZ2ljYWxSaWdodCgpOwotICAgIG1fbGluZS5yZW1vdmVDb2xsYXBzaWJsZUNv
bnRlbnQoYXZhaWxhYmxlV2lkdGgpOwotICAgIGF1dG8gaG9yaXpvbnRhbEFsaWdubWVudCA9IHJv
b3QoKS5zdHlsZSgpLnRleHRBbGlnbigpOwotICAgIGF1dG8gcnVuc0V4cGFuZEhvcml6b250YWxs
eSA9IGhvcml6b250YWxBbGlnbm1lbnQgPT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSAmJiAhaXNM
YXN0TGluZVdpdGhJbmxpbmVDb250ZW50KGxpbmVSYW5nZSwgbmVlZHNMYXlvdXRSYW5nZS5lbmQs
IGNvbW1pdHRlZENvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCk7Ci0gICAgaWYg
KHJ1bnNFeHBhbmRIb3Jpem9udGFsbHkpCi0gICAgICAgIG1fbGluZS5hcHBseVJ1bkV4cGFuc2lv
bihtX2xpbmVMb2dpY2FsUmVjdC53aWR0aCgpIC0gbV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQo
KSk7Ci0gICAgYXV0byBsaW5lRW5kc1dpdGhIeXBoZW4gPSBmYWxzZTsKLSAgICBpZiAoIW1fbGlu
ZS5ydW5zKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGF1dG8mIGxhc3RUZXh0Q29udGVudCA9IG1f
bGluZS5ydW5zKCkubGFzdCgpLnRleHRDb250ZW50KCk7Ci0gICAgICAgIGxpbmVFbmRzV2l0aEh5
cGhlbiA9IGxhc3RUZXh0Q29udGVudCAmJiBsYXN0VGV4dENvbnRlbnQtPm5lZWRzSHlwaGVuKCk7
Ci0gICAgfQotICAgIG1fc3VjY2Vzc2l2ZUh5cGhlbmF0ZWRMaW5lQ291bnQgPSBsaW5lRW5kc1dp
dGhIeXBoZW4gPyBtX3N1Y2Nlc3NpdmVIeXBoZW5hdGVkTGluZUNvdW50ICsgMSA6IDA7Ci0gICAg
cmV0dXJuIGxpbmVSYW5nZTsKLX0KLQotT3B0aW9uYWw8SG9yaXpvbnRhbENvbnN0cmFpbnRzPiBM
aW5lQnVpbGRlcjo6ZmxvYXRDb25zdHJhaW50cyhjb25zdCBJbmxpbmVSZWN0JiBsaW5lTG9naWNh
bFJlY3QpIGNvbnN0Ci17Ci0gICAgYXV0byogZmxvYXRpbmdTdGF0ZSA9IHRoaXMtPmZsb2F0aW5n
U3RhdGUoKTsKLSAgICBpZiAoIWZsb2F0aW5nU3RhdGUgfHwgZmxvYXRpbmdTdGF0ZS0+ZmxvYXRz
KCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4geyB9OwotCi0gICAgLy8gQ2hlY2sgZm9yIGlu
dHJ1ZGluZyBmbG9hdHMgYW5kIGFkanVzdCBsb2dpY2FsIGxlZnQvYXZhaWxhYmxlIHdpZHRoIGZv
ciB0aGlzIGxpbmUgYWNjb3JkaW5nbHkuCi0gICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9h
dGluZ0NvbnRleHQgeyBmb3JtYXR0aW5nQ29udGV4dCgpLCAqZmxvYXRpbmdTdGF0ZSB9OwotICAg
IGF1dG8gY29uc3RyYWludHMgPSBmbG9hdGluZ0NvbnRleHQuY29uc3RyYWludHModG9MYXlvdXRV
bml0KGxpbmVMb2dpY2FsUmVjdC50b3AoKSksIHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFJlY3Qu
Ym90dG9tKCkpKTsKLSAgICAvLyBDaGVjayBpZiB0aGVzZSB2YWx1ZXMgYWN0dWFsbHkgY29uc3Ry
YWluIHRoZSBsaW5lLgotICAgIGlmIChjb25zdHJhaW50cy5sZWZ0ICYmIGNvbnN0cmFpbnRzLmxl
ZnQtPnggPD0gbGluZUxvZ2ljYWxSZWN0LmxlZnQoKSkKLSAgICAgICAgY29uc3RyYWludHMubGVm
dCA9IHsgfTsKLQotICAgIGlmIChjb25zdHJhaW50cy5yaWdodCAmJiBjb25zdHJhaW50cy5yaWdo
dC0+eCA+PSBsaW5lTG9naWNhbFJlY3QucmlnaHQoKSkKLSAgICAgICAgY29uc3RyYWludHMucmln
aHQgPSB7IH07Ci0KLSAgICBpZiAoIWNvbnN0cmFpbnRzLmxlZnQgJiYgIWNvbnN0cmFpbnRzLnJp
Z2h0KQotICAgICAgICByZXR1cm4geyB9OwotCi0gICAgYXV0byBsaW5lTG9naWNhbExlZnQgPSBs
aW5lTG9naWNhbFJlY3QubGVmdCgpOwotICAgIGF1dG8gbGluZUxvZ2ljYWxSaWdodCA9IGxpbmVM
b2dpY2FsUmVjdC5yaWdodCgpOwotICAgIGlmIChjb25zdHJhaW50cy5sZWZ0ICYmIGNvbnN0cmFp
bnRzLnJpZ2h0KSB7Ci0gICAgICAgIGxpbmVMb2dpY2FsUmlnaHQgPSBjb25zdHJhaW50cy5yaWdo
dC0+eDsKLSAgICAgICAgbGluZUxvZ2ljYWxMZWZ0ID0gY29uc3RyYWludHMubGVmdC0+eDsKLSAg
ICB9IGVsc2UgaWYgKGNvbnN0cmFpbnRzLmxlZnQpIHsKLSAgICAgICAgQVNTRVJUKGNvbnN0cmFp
bnRzLmxlZnQtPnggPj0gbGluZUxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgbGluZUxvZ2ljYWxMZWZ0
ID0gY29uc3RyYWludHMubGVmdC0+eDsKLSAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnRzLnJpZ2h0
KSB7Ci0gICAgICAgIC8vIFJpZ2h0IGZsb2F0IGJveGVzIG1heSBvdmVyZmxvdyB0aGUgY29udGFp
bmluZyBibG9jayBvbiB0aGUgbGVmdC4KLSAgICAgICAgbGluZUxvZ2ljYWxSaWdodCA9IHN0ZDo6
bWF4PElubGluZUxheW91dFVuaXQ+KGxpbmVMb2dpY2FsTGVmdCwgY29uc3RyYWludHMucmlnaHQt
PngpOwotICAgIH0KLSAgICByZXR1cm4gSG9yaXpvbnRhbENvbnN0cmFpbnRzIHsgdG9MYXlvdXRV
bml0KGxpbmVMb2dpY2FsTGVmdCksIHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFJpZ2h0IC0gbGlu
ZUxvZ2ljYWxMZWZ0KSB9OwotfQotCi1MaW5lQnVpbGRlcjo6VXNlZENvbnN0cmFpbnRzIExpbmVC
dWlsZGVyOjppbml0aWFsQ29uc3RyYWludHNGb3JMaW5lKGNvbnN0IElubGluZVJlY3QmIGluaXRp
YWxMaW5lTG9naWNhbFJlY3QsIGJvb2wgaXNGaXJzdExpbmUpIGNvbnN0Ci17Ci0gICAgYXV0byBs
aW5lTG9naWNhbExlZnQgPSBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LmxlZnQoKTsKLSAgICBhdXRv
IGxpbmVMb2dpY2FsUmlnaHQgPSBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LnJpZ2h0KCk7Ci0gICAg
YXV0byBsaW5lSXNDb25zdHJhaW5lZEJ5RmxvYXQgPSBmYWxzZTsKLQotICAgIGlmIChhdXRvIGxp
bmVDb25zdHJhaW50cyA9IGZsb2F0Q29uc3RyYWludHMoaW5pdGlhbExpbmVMb2dpY2FsUmVjdCkp
IHsKLSAgICAgICAgbGluZUxvZ2ljYWxMZWZ0ID0gbGluZUNvbnN0cmFpbnRzLT5sb2dpY2FsTGVm
dDsKLSAgICAgICAgbGluZUxvZ2ljYWxSaWdodCA9IGxpbmVDb25zdHJhaW50cy0+bG9naWNhbFJp
Z2h0KCk7Ci0gICAgICAgIGxpbmVJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IHRydWU7Ci0gICAgfQot
Ci0gICAgYXV0byBjb21wdXRlZFRleHRJbmRlbnQgPSBbJl0oKSAtPiBJbmxpbmVMYXlvdXRVbml0
IHsKLSAgICAgICAgLy8gdGV4dC1pbmRlbnQgcHJvcGVydHkgc3BlY2lmaWVzIHRoZSBpbmRlbnRh
dGlvbiBhcHBsaWVkIHRvIGxpbmVzIG9mIGlubGluZSBjb250ZW50IGluIGEgYmxvY2suCi0gICAg
ICAgIC8vIFRoZSBpbmRlbnQgaXMgdHJlYXRlZCBhcyBhIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBz
dGFydCBlZGdlIG9mIHRoZSBsaW5lIGJveC4KLSAgICAgICAgLy8gVW5sZXNzIG90aGVyd2lzZSBz
cGVjaWZpZWQsIG9ubHkgbGluZXMgdGhhdCBhcmUgdGhlIGZpcnN0IGZvcm1hdHRlZCBsaW5lIG9m
IGFuIGVsZW1lbnQgYXJlIGFmZmVjdGVkLgotICAgICAgICAvLyBGb3IgZXhhbXBsZSwgdGhlIGZp
cnN0IGxpbmUgb2YgYW4gYW5vbnltb3VzIGJsb2NrIGJveCBpcyBvbmx5IGFmZmVjdGVkIGlmIGl0
IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50IGVsZW1lbnQuCi0gICAgICAgIC8vIEZJ
WE1FOiBBZGQgc3VwcG9ydCBmb3IgZWFjaC1saW5lLgotICAgICAgICAvLyBbSW50ZWdyYXRpb25d
IHJvb3QoKS0+cGFyZW50KCkgd291bGQgbm9ybWFsbHkgcHJvZHVjZSBhIHZhbGlkIGxheW91dCBi
b3guCi0gICAgICAgIGF1dG8mIHJvb3QgPSB0aGlzLT5yb290KCk7Ci0gICAgICAgIGF1dG8gaXNG
b3JtYXR0aW5nQ29udGV4dFJvb3RDYW5kaWRhdGVUb1RleHRJbmRlbnQgPSAhcm9vdC5pc0Fub255
bW91cygpOwotICAgICAgICBpZiAocm9vdC5pc0Fub255bW91cygpKSB7Ci0gICAgICAgICAgICAv
LyBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBieSB0aGUgZWFjaC1saW5lIGFuZC9vciBoYW5n
aW5nIGtleXdvcmRzLCBvbmx5IGxpbmVzIHRoYXQgYXJlIHRoZSBmaXJzdCBmb3JtYXR0ZWQgbGlu
ZQotICAgICAgICAgICAgLy8gb2YgYW4gZWxlbWVudCBhcmUgYWZmZWN0ZWQuCi0gICAgICAgICAg
ICAvLyBGb3IgZXhhbXBsZSwgdGhlIGZpcnN0IGxpbmUgb2YgYW4gYW5vbnltb3VzIGJsb2NrIGJv
eCBpcyBvbmx5IGFmZmVjdGVkIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50
IGVsZW1lbnQuCi0gICAgICAgICAgICBhdXRvIGlzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxk
ID0gbGF5b3V0U3RhdGUoKS5pc0ludGVncmF0ZWRSb290Qm94Rmlyc3RDaGlsZCgpOwotICAgICAg
ICAgICAgaWYgKGlzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkID09IExheW91dFN0YXRlOjpJ
c0ludGVncmF0ZWRSb290Qm94Rmlyc3RDaGlsZDo6Tm90QXBwbGljYWJsZSkKLSAgICAgICAgICAg
ICAgICBpc0Zvcm1hdHRpbmdDb250ZXh0Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCA9IHJvb3Qu
cGFyZW50KCkuZmlyc3RJbkZsb3dDaGlsZCgpID09ICZyb290OwotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIGlzRm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9UZXh0SW5k
ZW50ID0gaXNJbnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQgPT0gTGF5b3V0U3RhdGU6OklzSW50
ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkOjpZZXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFp
c0Zvcm1hdHRpbmdDb250ZXh0Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCkKLSAgICAgICAgICAg
IHJldHVybiB7IH07Ci0gICAgICAgIGF1dG8gaW52ZXJ0TGluZVJhbmdlID0gcm9vdC5zdHlsZSgp
LnRleHRJbmRlbnRUeXBlKCkgPT0gVGV4dEluZGVudFR5cGU6Okhhbmdpbmc7Ci0gICAgICAgIC8v
IHRleHQtaW5kZW50OiBoYW5naW5nIGludmVydHMgd2hpY2ggbGluZXMgYXJlIGFmZmVjdGVkLgot
ICAgICAgICAvLyBpbnZlcnRlZCBsaW5lIHJhbmdlIC0+IGFsbCB0aGUgbGluZXMgZXhjZXB0IHRo
ZSBmaXJzdCBvbmUuCi0gICAgICAgIC8vICFpbnZlcnRlZCBsaW5lIHJhbmdlIC0+IGZpcnN0IGxp
bmUgZ2V0cyB0aGUgaW5kZW50LgotICAgICAgICBhdXRvIHNob3VsZEluZGVudCA9IGludmVydExp
bmVSYW5nZSAhPSBpc0ZpcnN0TGluZTsKLSAgICAgICAgaWYgKCFzaG91bGRJbmRlbnQpCi0gICAg
ICAgICAgICByZXR1cm4geyB9OwotCi0gICAgICAgIGF1dG8gdGV4dEluZGVudCA9IHJvb3Quc3R5
bGUoKS50ZXh0SW5kZW50KCk7Ci0gICAgICAgIGlmICh0ZXh0SW5kZW50ID09IFJlbmRlclN0eWxl
Ojppbml0aWFsVGV4dEluZGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAg
cmV0dXJuIHsgbWluaW11bVZhbHVlRm9yTGVuZ3RoKHRleHRJbmRlbnQsIGluaXRpYWxMaW5lTG9n
aWNhbFJlY3Qud2lkdGgoKSkgfTsKLSAgICB9OwotICAgIGxpbmVMb2dpY2FsTGVmdCArPSBjb21w
dXRlZFRleHRJbmRlbnQoKTsKLSAgICByZXR1cm4gVXNlZENvbnN0cmFpbnRzIHsgeyBpbml0aWFs
TGluZUxvZ2ljYWxSZWN0LnRvcCgpLCBsaW5lTG9naWNhbExlZnQsIGxpbmVMb2dpY2FsUmlnaHQg
LSBsaW5lTG9naWNhbExlZnQsIGluaXRpYWxMaW5lTG9naWNhbFJlY3QuaGVpZ2h0KCkgfSwgbGlu
ZUlzQ29uc3RyYWluZWRCeUZsb2F0IH07Ci19Ci0KLXZvaWQgTGluZUJ1aWxkZXI6OmNhbmRpZGF0
ZUNvbnRlbnRGb3JMaW5lKExpbmVDYW5kaWRhdGUmIGxpbmVDYW5kaWRhdGUsIHNpemVfdCBjdXJy
ZW50SW5saW5lSXRlbUluZGV4LCBjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBz
aXplX3QgcGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRV
bml0PiBsZWFkaW5nTG9naWNhbFdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGN1cnJlbnRMb2dpY2Fs
UmlnaHQpCi17Ci0gICAgQVNTRVJUKGN1cnJlbnRJbmxpbmVJdGVtSW5kZXggPCBsYXlvdXRSYW5n
ZS5lbmQpOwotICAgIGxpbmVDYW5kaWRhdGUucmVzZXQoKTsKLSAgICAvLyAxLiBTaW1wbHkgYWRk
IGFueSBvdmVyZmxvdyBjb250ZW50IGZyb20gdGhlIHByZXZpb3VzIGxpbmUgdG8gdGhlIGNhbmRp
ZGF0ZSBjb250ZW50LiBJdCdzIGFsd2F5cyBhIHRleHQgY29udGVudC4KLSAgICAvLyAyLiBGaW5k
IHRoZSBuZXh0IHNvZnQgd3JhcCBwb3NpdGlvbiBvciBleHBsaWNpdCBsaW5lIGJyZWFrLgotICAg
IC8vIDMuIENvbGxlY3QgZmxvYXRzIGJldHdlZW4gdGhlIGlubGluZSBjb250ZW50LgotICAgIGF1
dG8gc29mdFdyYXBPcHBvcnR1bml0eUluZGV4ID0gbmV4dFdyYXBPcHBvcnR1bml0eShjdXJyZW50
SW5saW5lSXRlbUluZGV4LCBsYXlvdXRSYW5nZSk7Ci0gICAgLy8gc29mdFdyYXBPcHBvcnR1bml0
eUluZGV4ID09IGxheW91dFJhbmdlLmVuZCBtZWFucyB3ZSBkb24ndCBoYXZlIGFueSB3cmFwIG9w
cG9ydHVuaXR5IGluIHRoaXMgY29udGVudC4KLSAgICBBU1NFUlQoc29mdFdyYXBPcHBvcnR1bml0
eUluZGV4IDw9IGxheW91dFJhbmdlLmVuZCk7Ci0KLSAgICBpZiAocGFydGlhbExlYWRpbmdDb250
ZW50TGVuZ3RoKSB7Ci0gICAgICAgIC8vIEhhbmRsZSBsZWFkaW5nIHBhcnRpYWwgY29udGVudCBm
aXJzdCAob3ZlcmZsb3dpbmcgdGV4dCBmcm9tIHRoZSBwcmV2aW91cyBsaW5lKS4KLSAgICAgICAg
Ly8gQ29uc3RydWN0IGEgcGFydGlhbCBsZWFkaW5nIGlubGluZSBpdGVtLgotICAgICAgICBtX3Bh
cnRpYWxMZWFkaW5nVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4obV9pbmxpbmVJ
dGVtc1tjdXJyZW50SW5saW5lSXRlbUluZGV4XSkucmlnaHQocGFydGlhbExlYWRpbmdDb250ZW50
TGVuZ3RoKTsKLSAgICAgICAgYXV0byBpdGVtV2lkdGggPSBsZWFkaW5nTG9naWNhbFdpZHRoID8g
KnN0ZDo6ZXhjaGFuZ2UobGVhZGluZ0xvZ2ljYWxXaWR0aCwgV1RGOjpudWxsb3B0KSA6IGlubGlu
ZUl0ZW1XaWR0aCgqbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtLCBjdXJyZW50TG9naWNhbFJpZ2h0
KTsKLSAgICAgICAgbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmFwcGVuZElubGluZUl0ZW0o
Km1fcGFydGlhbExlYWRpbmdUZXh0SXRlbSwgaXRlbVdpZHRoKTsKLSAgICAgICAgY3VycmVudExv
Z2ljYWxSaWdodCArPSBpdGVtV2lkdGg7Ci0gICAgICAgICsrY3VycmVudElubGluZUl0ZW1JbmRl
eDsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gaW5kZXggPSBjdXJyZW50SW5saW5lSXRlbUluZGV4
OyBpbmRleCA8IHNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleDsgKytpbmRleCkgewotICAgICAgICBh
dXRvJiBpbmxpbmVJdGVtID0gbV9pbmxpbmVJdGVtc1tpbmRleF07Ci0gICAgICAgIGlmIChpbmxp
bmVJdGVtLmlzRmxvYXQoKSkgewotICAgICAgICAgICAgbGluZUNhbmRpZGF0ZS5mbG9hdEl0ZW0g
PSAmaW5saW5lSXRlbTsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzb2Z0IHdyYXAgb3Bwb3J0
dW5pdHksIG11c3QgYmUgdGhlIG9ubHkgaXRlbSBpbiB0aGUgbGlzdC4KLSAgICAgICAgICAgIEFT
U0VSVChjdXJyZW50SW5saW5lSXRlbUluZGV4ICsgMSA9PSBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5k
ZXgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlubGlu
ZUl0ZW0uaXNUZXh0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5l
SXRlbS5pc0lubGluZUJveEVuZCgpIHx8IGlubGluZUl0ZW0uaXNCb3goKSkgewotICAgICAgICAg
ICAgQVNTRVJUKCFsZWFkaW5nTG9naWNhbFdpZHRoIHx8IGlubGluZUl0ZW0uaXNUZXh0KCkpOwot
ICAgICAgICAgICAgYXV0byBsb2dpY2FsV2lkdGggPSBsZWFkaW5nTG9naWNhbFdpZHRoID8gKnN0
ZDo6ZXhjaGFuZ2UobGVhZGluZ0xvZ2ljYWxXaWR0aCwgV1RGOjpudWxsb3B0KSA6IGlubGluZUl0
ZW1XaWR0aChpbmxpbmVJdGVtLCBjdXJyZW50TG9naWNhbFJpZ2h0KTsKLSAgICAgICAgICAgIGxp
bmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5hcHBlbmRJbmxpbmVJdGVtKGlubGluZUl0ZW0sIGxv
Z2ljYWxXaWR0aCk7Ci0gICAgICAgICAgICBjdXJyZW50TG9naWNhbFJpZ2h0ICs9IGxvZ2ljYWxX
aWR0aDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmxp
bmVJdGVtLmlzTGluZUJyZWFrKCkgfHwgaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5
KCkpIHsKLSAgICAgICAgICAgIC8vIFNpbmNlIGJvdGggPGJyPiBhbmQgPHdicj4gYXJlIGV4cGxp
Y2l0IHdvcmQgYnJlYWsgb3Bwb3J0dW5pdGllcyB0aGV5IGhhdmUgdG8gYmUgdHJhaWxpbmcgaXRl
bXMgaW4gdGhpcyBjYW5kaWRhdGUgcnVuIGxpc3QgdW5sZXNzIHRoZXkgYXJlIGVtYmVkZGVkIGlu
IGlubGluZSBib3hlcy4KLSAgICAgICAgICAgIC8vIGUuZy4gPHNwYW4+PHdicj48L3NwYW4+Ci0j
aWYgQVNTRVJUX0VOQUJMRUQKLSAgICAgICAgICAgIGZvciAoYXV0byBpID0gaW5kZXggKyAxOyBp
IDwgc29mdFdyYXBPcHBvcnR1bml0eUluZGV4OyArK2kpCi0gICAgICAgICAgICAgICAgQVNTRVJU
KG1faW5saW5lSXRlbXNbaV0uaXNJbmxpbmVCb3hFbmQoKSk7Ci0jZW5kaWYKLSAgICAgICAgICAg
IGlubGluZUl0ZW0uaXNMaW5lQnJlYWsoKSA/IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5h
cHBlbmRUcmFpbGluZ0xpbmVCcmVhayhpbmxpbmVJdGVtKSA6IGxpbmVDYW5kaWRhdGUuaW5saW5l
Q29udGVudC5hcHBlbmR0cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5KGlubGluZUl0ZW0pOwot
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7Ci0gICAgfQotICAgIGF1dG8gaW5saW5lQ29udGVudEVuZHNJblNvZnRXcmFwT3Bwb3J0
dW5pdHkgPSBbJl0gewotICAgICAgICBpZiAoIXNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCB8fCBz
b2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggPT0gbGF5b3V0UmFuZ2UuZW5kKSB7Ci0gICAgICAgICAg
ICAvLyBUaGlzIGNhbmRpZGF0ZSBpbmxpbmUgY29udGVudCBlbmRzIGJlY2F1c2UgdGhlIGVudGly
ZSBjb250ZW50IGVuZHMgYW5kIG5vdCBiZWNhdXNlIHRoZXJlJ3MgYSBzb2Z0IHdyYXAgb3Bwb3J0
dW5pdHkuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYg
KG1faW5saW5lSXRlbXNbc29mdFdyYXBPcHBvcnR1bml0eUluZGV4IC0gMV0uaXNGbG9hdCgpKSB7
Ci0gICAgICAgICAgICAvLyBXaGlsZSB3ZSBzdG9wIGF0IGZsb2F0cywgdGhleSBhcmUgbm90IGNv
bnNpZGVyZWQgcmVhbCBzb2Z0IHdyYXAgb3Bwb3J0dW5pdGllcy4gCi0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9U
Ui9jc3MtdGV4dC0zLyNsaW5lLWJyZWFrLWRldGFpbHMKLSAgICAgICAgYXV0byYgdHJhaWxpbmdJ
bmxpbmVJdGVtID0gbV9pbmxpbmVJdGVtc1tzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggLSAxXTsK
LSAgICAgICAgaWYgKHRyYWlsaW5nSW5saW5lSXRlbS5pc0JveCgpIHx8IHRyYWlsaW5nSW5saW5l
SXRlbS5pc0xpbmVCcmVhaygpIHx8IHRyYWlsaW5nSW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9y
dHVuaXR5KCkgfHwgdHJhaWxpbmdJbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpIHsKLSAgICAg
ICAgICAgIC8vIEZvciBXZWItY29tcGF0aWJpbGl0eSB0aGVyZSBpcyBhIHNvZnQgd3JhcCBvcHBv
cnR1bml0eSBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggcmVwbGFjZWQgZWxlbWVudCBvciBvdGhlciBh
dG9taWMgaW5saW5lLgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKHRyYWlsaW5nSW5saW5lSXRlbS5pc1RleHQoKSkgewotICAgICAgICAgICAgYXV0byYg
aW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4odHJhaWxpbmdJbmxpbmVJ
dGVtKTsKLSAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKLSAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIC8vIE5vdyBpbiBjYXNlIG9m
IG5vbi13aGl0ZXNwYWNlIHRyYWlsaW5nIGNvbnRlbnQsIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhl
IGFjdHVhbCBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgYmVsb25ncyB0byB0aGUgbmV4dCBzZXQuCi0g
ICAgICAgICAgICAvLyBlLmcuICJ0aGlzX2lzX3RoZV90cmFpbGluZ19ydW48c3Bhbj4gPC1idXRf
dGhpc19zcGFjZV9oZXJlX2lzX3RoZV9zb2Z0X3dyYXBfb3Bwb3J0dW5pdHkiCi0gICAgICAgICAg
ICAvLyBXaGVuIHRoZXJlJ3MgYW4gaW5saW5lIGJveCBzdGFydCg8c3Bhbj4pL2VuZCg8L3NwYW4+
KSBiZXR3ZWVuIHRoZSB0cmFpbGluZyBhbmQgdGhlIChuZXh0KWxlYWRpbmcgcnVuLCB3aGlsZSB3
ZSBicmVhayBiZWZvcmUgdGhlIGlubGluZSBib3ggc3RhcnQgKDxzcGFuPikKLSAgICAgICAgICAg
IC8vIHRoZSBhY3R1YWwgc29mdCB3cmFwIHBvc2l0aW9uIGlzIGFmdGVyIHRoZSBpbmxpbmUgYm94
IHN0YXJ0ICg8c3Bhbj4pIGJ1dCBpbiB0ZXJtcyBvZiBsaW5lIGJyZWFraW5nIGNvbnRpbnVpdHkg
dGhlIGlubGluZSBib3ggc3RhcnQgKDxzcGFuPikgYW5kIHRoZSB3aGl0ZXNwYWNlIHJ1biBiZWxv
bmcgdG9nZXRoZXIuCi0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChsYXlvdXRSYW5nZS5lbmQg
PD0gbV9pbmxpbmVJdGVtcy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChhdXRvIGluZGV4ID0g
c29mdFdyYXBPcHBvcnR1bml0eUluZGV4OyBpbmRleCA8IGxheW91dFJhbmdlLmVuZDsgKytpbmRl
eCkgewotICAgICAgICAgICAgICAgIGlmIChtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJv
eFN0YXJ0KCkgfHwgbV9pbmxpbmVJdGVtc1tpbmRleF0uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IENoZWNr
IGlmIFtub24td2hpdGVzcGFjZV1baW5saW5lLWJveF1bbm8td2hpdGVzcGFjZV0gY29udGVudCBo
YXMgcnVsZXMgYWJvdXQgaXQuCi0gICAgICAgICAgICAgICAgLy8gRm9yIG5vdyBsZXQncyBzYXkg
dGhlIHNvZnQgd3JhcCBwb3NpdGlvbiBiZWxvbmdzIHRvIHRoZSBuZXh0IHNldCBvZiBydW5zIHdo
ZW4gW25vbi13aGl0ZXNwYWNlXVtpbmxpbmUtYm94XVt3aGl0ZXNwYWNlXSwgW25vbi13aGl0ZXNw
YWNlXVtpbmxpbmUtYm94XVtib3hdIGV0Yy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbV9pbmxp
bmVJdGVtc1tpbmRleF0uaXNUZXh0KCkgJiYgIWRvd25jYXN0PElubGluZVRleHRJdGVtPihtX2lu
bGluZUl0ZW1zW2luZGV4XSkuaXNXaGl0ZXNwYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfTsKLSAgICBsaW5lQ2FuZGlkYXRlLmlubGlu
ZUNvbnRlbnQuc2V0SGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KGlubGluZUNvbnRlbnRF
bmRzSW5Tb2Z0V3JhcE9wcG9ydHVuaXR5KCkpOwotfQotCi1zaXplX3QgTGluZUJ1aWxkZXI6Om5l
eHRXcmFwT3Bwb3J0dW5pdHkoc2l6ZV90IHN0YXJ0SW5kZXgsIGNvbnN0IExpbmVCdWlsZGVyOjpJ
bmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlKSBjb25zdAotewotICAgIC8vIDEuIEZpbmQgdGhl
IHN0YXJ0IGNhbmRpZGF0ZSBieSBza2lwcGluZyBsZWFkaW5nIG5vbi1jb250ZW50IGl0ZW1zIGUu
ZyAiPHNwYW4+PHNwYW4+c3RhcnQiLiBPcHBvcnR1bml0eSBpcyBhZnRlciAiPHNwYW4+PHNwYW4+
Ii4KLSAgICAvLyAyLiBGaW5kIHRoZSBlbmQgY2FuZGlkYXRlIGJ5IHNraXBwaW5nIG5vbi1jb250
ZW50IGl0ZW1zIGluYmV0d2VlbiBlLmcuICI8c3Bhbj48c3Bhbj5zdGFydDwvc3Bhbj5lbmQiLiBP
cHBvcnR1bml0eSBpcyBhZnRlciAiPC9zcGFuPiIuCi0gICAgLy8gMy4gQ2hlY2sgaWYgdGhlcmUn
cyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBiZXR3ZWVuIHRoZSAyIGNhbmRpZGF0ZSBpbmxpbmUg
aXRlbXMgYW5kIHJlcGVhdC4KLSAgICAvLyA0LiBBbnkgZm9yY2UgbGluZSBicmVhay9leHBsaWNp
dCB3cmFwIGNvbnRlbnQgaW5iZXR3ZWVuIGlzIGNvbnNpZGVyZWQgYXMgd3JhcCBvcHBvcnR1bml0
eS4KLQotICAgIC8vIFtleC1dW2lubGluZSBib3ggc3RhcnRdW2lubGluZSBib3ggZW5kXVtmbG9h
dF1bYW1wbGVdIChleC08c3Bhbj48L3NwYW4+PGRpdiBzdHlsZT0iZmxvYXQ6bGVmdCI+PC9kaXY+
YW1wbGUpLiBXcmFwIGluZGV4IGlzIGF0IFtleC1dLgotICAgIC8vIFtleF1baW5saW5lIGJveCBz
dGFydF1bYW1wLV1baW5saW5lIGJveCBzdGFydF1bbGVdIChleDxzcGFuPmFtcC08c3Bhbj5hbXBs
ZSkuIFdyYXAgaW5kZXggaXMgYXQgW2FtcC1dLgotICAgIC8vIFtleC1dW2lubGluZSBib3ggc3Rh
cnRdW2xpbmUgYnJlYWtdW2FtcGxlXSAoZXgtPHNwYW4+PGJyPmFtcGxlKS4gV3JhcCBpbmRleCBp
cyBhZnRlciBbYnJdLgotICAgIGF1dG8gcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBPcHRpb25h
bDxzaXplX3Q+IHsgfTsKLSAgICBmb3IgKGF1dG8gaW5kZXggPSBzdGFydEluZGV4OyBpbmRleCA8
IGxheW91dFJhbmdlLmVuZDsgKytpbmRleCkgewotICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0g
bV9pbmxpbmVJdGVtc1tpbmRleF07Ci0gICAgICAgIGlmIChpbmxpbmVJdGVtLmlzTGluZUJyZWFr
KCkgfHwgaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkpIHsKLSAgICAgICAgICAg
IC8vIFdlIGFsd2F5cyBzdG9wIGF0IGV4cGxpY2l0IHdyYXBwaW5nIG9wcG9ydHVuaXRpZXMgZS5n
LiA8YnI+LiBIb3dldmVyIHRoZSB3cmFwIHBvc2l0aW9uIG1heSBiZSBhdCBsYXRlciBwb3NpdGlv
bi4KLSAgICAgICAgICAgIC8vIGUuZy4gPHNwYW4+PHNwYW4+PGJyPjwvc3Bhbj48L3NwYW4+IDwt
IHdyYXAgcG9zaXRpb24gaXMgYWZ0ZXIgdGhlIHNlY29uZCA8L3NwYW4+Ci0gICAgICAgICAgICAv
LyBidXQgaW4gY2FzZSBvZiA8c3Bhbj48YnI+PHNwYW4+PC9zcGFuPjwvc3Bhbj4gPC0gd3JhcCBw
b3NpdGlvbiBpcyByaWdodCBhZnRlciA8YnI+LgotICAgICAgICAgICAgZm9yICgrK2luZGV4OyBp
bmRleCA8IGxheW91dFJhbmdlLmVuZCAmJiBtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJv
eEVuZCgpOyArK2luZGV4KSB7IH0KLSAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAg
fQotICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRl
bS5pc0lubGluZUJveEVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBOZWVkIHRvIHNlZSB3aGF0IGNv
bWVzIG5leHQgdG8gZGVjaWRlLgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAg
ICAgICAgQVNTRVJUKGlubGluZUl0ZW0uaXNUZXh0KCkgfHwgaW5saW5lSXRlbS5pc0JveCgpIHx8
IGlubGluZUl0ZW0uaXNGbG9hdCgpKTsKLSAgICAgICAgaWYgKCFwcmV2aW91c0lubGluZUl0ZW1J
bmRleCkgewotICAgICAgICAgICAgcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBpbmRleDsKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQg
cHJldmlvdXMgYW5kIGN1cnJlbnQgaXRlbXMgYXJlIG5vdCBuZWNlc3NhcmlseSBhZGphY2VudCBp
dGVtcyBlLmcgInByZXZpb3VzPHNwYW4+Y3VycmVudDwvc3Bhbj4iCi0gICAgICAgIGF1dG8mIHBy
ZXZpb3VzSXRlbSA9IG1faW5saW5lSXRlbXNbKnByZXZpb3VzSW5saW5lSXRlbUluZGV4XTsKLSAg
ICAgICAgYXV0byYgY3VycmVudEl0ZW0gPSBtX2lubGluZUl0ZW1zW2luZGV4XTsKLSAgICAgICAg
aWYgKGlzQXRTb2Z0V3JhcE9wcG9ydHVuaXR5KG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQsIHBy
ZXZpb3VzSXRlbSwgY3VycmVudEl0ZW0pKSB7Ci0gICAgICAgICAgICBpZiAoKnByZXZpb3VzSW5s
aW5lSXRlbUluZGV4ICsgMSA9PSBpbmRleCAmJiAoIXByZXZpb3VzSXRlbS5pc1RleHQoKSB8fCAh
Y3VycmVudEl0ZW0uaXNUZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugb25seSBrbm93
IHRoZSBleGFjdCBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgaW5kZXggd2hlbiB0aGUgcHJldmlvdXMg
YW5kIGN1cnJlbnQgaXRlbXMgYXJlIG5leHQgdG8gZWFjaCBvdGhlci4KLSAgICAgICAgICAgICAg
ICByZXR1cm4gaW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGVyZSdzIGEg
c29mdCB3cmFwIG9wcG9ydHVuaXR5IGJldHdlZW4gJ3ByZXZpb3VzSW5saW5lSXRlbUluZGV4JyBh
bmQgJ2luZGV4Jy4KLSAgICAgICAgICAgIC8vIE5vdyBmb3J3YXJkLWZpbmQgZnJvbSB0aGUgc3Rh
cnQgcG9zaXRpb24gdG8gc2VlIHdoZXJlIHdlIGNhbiBhY3R1YWxseSB3cmFwLgotICAgICAgICAg
ICAgLy8gW2V4LV1bYW1wbGVdIHZzLiBbZXgtXVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94
IGVuZF1bYW1wbGVdCi0gICAgICAgICAgICAvLyB3aGVyZSBbZXgtXSBpcyBzdGFydENvbnRlbnQg
YW5kIFthbXBsZV0gaXMgdGhlIG5leHRDb250ZW50LgotICAgICAgICAgICAgZm9yIChhdXRvIGNh
bmRpZGF0ZUluZGV4ID0gKnByZXZpb3VzSW5saW5lSXRlbUluZGV4ICsgMTsgY2FuZGlkYXRlSW5k
ZXggPCBpbmRleDsgKytjYW5kaWRhdGVJbmRleCkgewotICAgICAgICAgICAgICAgIGlmIChtX2lu
bGluZUl0ZW1zW2NhbmRpZGF0ZUluZGV4XS5pc0lubGluZUJveFN0YXJ0KCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgLy8gaW5saW5lIGNvbnRlbnQgYW5kIFtpbmxpbmUgYm94IHN0YXJ0XSBhbmQg
W2lubGluZSBib3ggZW5kXSBmb3JtIHVuYnJlYWthYmxlIGNvbnRlbnQuCi0gICAgICAgICAgICAg
ICAgICAgIC8vIGV4LTxzcGFuPjwvc3Bhbj5hbXBsZSAgOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFm
dGVyICJleC0iLgotICAgICAgICAgICAgICAgICAgICAvLyBleC08L3NwYW4+PC9zcGFuPmFtcGxl
IDogd3JhcCBvcHBvcnR1bml0eSBpcyBhZnRlciAiZXgtPC9zcGFuPjwvc3Bhbj4iLgotICAgICAg
ICAgICAgICAgICAgICAvLyBleC08L3NwYW4+PHNwYW4+YW1wbGU8L3NwYW4+IDogd3JhcCBvcHBv
cnR1bml0eSBpcyBhZnRlciAiZXgtPC9zcGFuPiIuCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4
LTxzcGFuPjxzcGFuPmFtcGxlPC9zcGFuPjwvc3Bhbj4gOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFm
dGVyICJleC0iLgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlSW5kZXg7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluZGV4
OwotICAgICAgICB9Ci0gICAgICAgIHByZXZpb3VzSW5saW5lSXRlbUluZGV4ID0gaW5kZXg7Ci0g
ICAgfQotICAgIHJldHVybiBsYXlvdXRSYW5nZS5lbmQ7Ci19Ci0KLXZvaWQgTGluZUJ1aWxkZXI6
OmhhbmRsZUZsb2F0Q29udGVudChjb25zdCBJbmxpbmVJdGVtJiBmbG9hdEl0ZW0pCi17Ci0gICAg
YXV0byYgZmxvYXRCb3ggPSBmbG9hdEl0ZW0ubGF5b3V0Qm94KCk7Ci0gICAgbV9mbG9hdHMuYXBw
ZW5kKCZmbG9hdEJveCk7Ci0KLSAgICBhdXRvKiBmbG9hdGluZ1N0YXRlID0gdGhpcy0+ZmxvYXRp
bmdTdGF0ZSgpOwotICAgIGlmICghZmxvYXRpbmdTdGF0ZSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgQVNTRVJUKGZvcm1hdHRpbmdTdGF0ZSgpKTsKLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZv
cm1hdHRpbmdTdGF0ZSgpLT5ib3hHZW9tZXRyeShmbG9hdEJveCk7Ci0gICAgLy8gU2V0IHN0YXRp
YyBwb3NpdGlvbiBmaXJzdC4KLSAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVmdChMYXlv
dXRQb2ludCB7IG1fbGluZUxvZ2ljYWxSZWN0LnRvcExlZnQoKSB9KTsKLSAgICAvLyBGbG9hdCBp
dC4KLSAgICBBU1NFUlQobV9yb290SG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICBhdXRvIGZs
b2F0aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7IGZvcm1hdHRpbmdDb250ZXh0KCksICpm
bG9hdGluZ1N0YXRlIH07Ci0gICAgYXV0byBmbG9hdGluZ1Bvc2l0aW9uID0gZmxvYXRpbmdDb250
ZXh0LnBvc2l0aW9uRm9yRmxvYXQoZmxvYXRCb3gsICptX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWlu
dHMpOwotICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nUG9zaXRpb24p
OwotICAgIGZsb2F0aW5nU3RhdGUtPmFwcGVuZChmbG9hdGluZ0NvbnRleHQudG9GbG9hdEl0ZW0o
ZmxvYXRCb3gpKTsKLSAgICAvLyBDaGVjayBpZiB0aGlzIGZsb2F0IHNocmlua3MgdGhlIGxpbmUg
KHRoZXkgZG9uJ3QgZ2V0IHBvc2l0aW9uZWQgaGlnaGVyIHRoYW4gdGhlIGxpbmUpLgotICAgIGlm
IChmbG9hdGluZ1Bvc2l0aW9uLnkoKSA+IG1fbGluZUxvZ2ljYWxSZWN0LmJvdHRvbSgpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IHRydWU7
Ci0gICAgYXV0byBmbG9hdEJveFdpZHRoID0gaW5saW5lSXRlbVdpZHRoKGZsb2F0SXRlbSwgeyB9
KTsKLSAgICBpZiAoZmxvYXRCb3guaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAg
IG1fbGluZUxvZ2ljYWxSZWN0LnNldExlZnQobV9saW5lTG9naWNhbFJlY3QubGVmdCgpICsgZmxv
YXRCb3hXaWR0aCk7ICAgIAotICAgIG1fbGluZUxvZ2ljYWxSZWN0LmV4cGFuZEhvcml6b250YWxs
eSgtZmxvYXRCb3hXaWR0aCk7Ci19Ci0KLUxpbmVCdWlsZGVyOjpSZXN1bHQgTGluZUJ1aWxkZXI6
OmhhbmRsZUlubGluZUNvbnRlbnQoSW5saW5lQ29udGVudEJyZWFrZXImIGlubGluZUNvbnRlbnRC
cmVha2VyLCBjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBjb25zdCBMaW5lQ2Fu
ZGlkYXRlJiBsaW5lQ2FuZGlkYXRlKQotewotICAgIGF1dG8mIGlubGluZUNvbnRlbnQgPSBsaW5l
Q2FuZGlkYXRlLmlubGluZUNvbnRlbnQ7Ci0gICAgaWYgKGlubGluZUNvbnRlbnQuY29udGludW91
c0NvbnRlbnQoKS5ydW5zKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFTU0VSVChpbmxpbmVDb250
ZW50LnRyYWlsaW5nTGluZUJyZWFrKCkgfHwgaW5saW5lQ29udGVudC50cmFpbGluZ1dvcmRCcmVh
a09wcG9ydHVuaXR5KCkpOwotICAgICAgICByZXR1cm4geyBpbmxpbmVDb250ZW50LnRyYWlsaW5n
TGluZUJyZWFrKCkgPyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllcyA6IElu
bGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6Tm8gfTsKLSAgICB9Ci0gICAgYXV0byBz
aG91bGREaXNhYmxlSHlwaGVuYXRpb24gPSBbJl0gewotICAgICAgICBhdXRvJiBzdHlsZSA9IHJv
b3QoKS5zdHlsZSgpOwotICAgICAgICB1bnNpZ25lZCBsaW1pdExpbmVzID0gc3R5bGUuaHlwaGVu
YXRpb25MaW1pdExpbmVzKCkgPT0gUmVuZGVyU3R5bGU6OmluaXRpYWxIeXBoZW5hdGlvbkxpbWl0
TGluZXMoKSA/IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSA6IHN0eWxlLmh5
cGhlbmF0aW9uTGltaXRMaW5lcygpOwotICAgICAgICByZXR1cm4gbV9zdWNjZXNzaXZlSHlwaGVu
YXRlZExpbmVDb3VudCA+PSBsaW1pdExpbmVzOwotICAgIH07Ci0gICAgaWYgKHNob3VsZERpc2Fi
bGVIeXBoZW5hdGlvbigpKQotICAgICAgICBpbmxpbmVDb250ZW50QnJlYWtlci5zZXRIeXBoZW5h
dGlvbkRpc2FibGVkKCk7Ci0KLSAgICBhdXRvJiBjb250aW51b3VzSW5saW5lQ29udGVudCA9IGxp
bmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5jb250aW51b3VzQ29udGVudCgpOwotICAgIGF1dG8g
bGluZUxvZ2ljYWxSZWN0Rm9yQ2FuZGlkYXRlQ29udGVudCA9IFsmXSB7Ci0gICAgICAgIC8vIENo
ZWNrIGlmIHRoZSBjYW5kaWRhdGUgY29udGVudCB3b3VsZCBzdHJldGNoIHRoZSBsaW5lIGFuZCB3
aGV0aGVyIGFkZGl0aW9uYWwgZmxvYXRzIGFyZSBnZXR0aW5nIGluIHRoZSB3YXkuCi0gICAgICAg
IGlmICghZmxvYXRpbmdTdGF0ZSgpIHx8ICFpbmxpbmVDb250ZW50Lmhhc0lubGluZUxldmVsQm94
KCkpCi0gICAgICAgICAgICByZXR1cm4gbV9saW5lTG9naWNhbFJlY3Q7Ci0gICAgICAgIGF1dG8g
bWF4aW11bUxpbmVMb2dpY2FsSGVpZ2h0ID0gbV9saW5lTG9naWNhbFJlY3QuaGVpZ2h0KCk7Ci0g
ICAgICAgIGZvciAoYXV0byYgcnVuIDogY29udGludW91c0lubGluZUNvbnRlbnQucnVucygpKSB7
Ci0gICAgICAgICAgICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIGlubGluZSBib3hlcyB0b28u
Ci0gICAgICAgICAgICBpZiAoIXJ1bi5pbmxpbmVJdGVtLmlzQm94KCkpCi0gICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICBtYXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQgPSBzdGQ6
Om1heChtYXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQsIElubGluZUxheW91dFVuaXQgeyBmb3JtYXR0
aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KHJ1bi5pbmxpbmVJdGVtLmxheW91dEJveCgpKS5t
YXJnaW5Cb3hIZWlnaHQoKSB9KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF4aW11bUxpbmVM
b2dpY2FsSGVpZ2h0ID09IG1fbGluZUxvZ2ljYWxSZWN0LmhlaWdodCgpKQotICAgICAgICAgICAg
cmV0dXJuIG1fbGluZUxvZ2ljYWxSZWN0OwotICAgICAgICBhdXRvIGFkanVzdGVkTGluZUxvZ2lj
YWxSZWN0ID0gSW5saW5lUmVjdCB7IG1fbGluZUxvZ2ljYWxSZWN0LnRvcCgpLCBtX2xpbmVMb2dp
Y2FsUmVjdC5sZWZ0KCksIG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCksIG1heGltdW1MaW5lTG9n
aWNhbEhlaWdodCB9OwotICAgICAgICBpZiAoYXV0byBob3Jpem9udGFsQ29uc3RyYWludHMgPSBm
bG9hdENvbnN0cmFpbnRzKGFkanVzdGVkTGluZUxvZ2ljYWxSZWN0KSkgewotICAgICAgICAgICAg
YWRqdXN0ZWRMaW5lTG9naWNhbFJlY3Quc2V0TGVmdChob3Jpem9udGFsQ29uc3RyYWludHMtPmxv
Z2ljYWxMZWZ0KTsKLSAgICAgICAgICAgIGFkanVzdGVkTGluZUxvZ2ljYWxSZWN0LnNldFdpZHRo
KGhvcml6b250YWxDb25zdHJhaW50cy0+bG9naWNhbFdpZHRoKTsKLSAgICAgICAgfQotICAgICAg
ICByZXR1cm4gYWRqdXN0ZWRMaW5lTG9naWNhbFJlY3Q7Ci0gICAgfSgpOwotICAgIGF1dG8gYXZh
aWxhYmxlV2lkdGggPSBbJl0gewotICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoRm9yQ29udGVu
dCA9IGxpbmVMb2dpY2FsUmVjdEZvckNhbmRpZGF0ZUNvbnRlbnQud2lkdGgoKSAtIG1fbGluZS5j
b250ZW50TG9naWNhbFJpZ2h0KCk7Ci0gICAgICAgIHJldHVybiBzdGQ6OmlzbmFuKGF2YWlsYWJs
ZVdpZHRoRm9yQ29udGVudCkgPyBtYXhJbmxpbmVMYXlvdXRVbml0KCkgOiBhdmFpbGFibGVXaWR0
aEZvckNvbnRlbnQ7Ci0gICAgfSgpOwotICAgIC8vIFdoaWxlIHRoZSBmbG9hdHMgYXJlIG5vdCBj
b25zaWRlcmVkIHRvIGJlIG9uIHRoZSBsaW5lLCB0aGV5IG1ha2UgdGhlIGxpbmUgY29udGVudGZ1
bCBmb3IgbGluZSBicmVha2luZy4KLSAgICBhdXRvIGxpbmVIYXNDb250ZW50ID0gIW1fbGluZS5y
dW5zKCkuaXNFbXB0eSgpIHx8IG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0OwotICAgIGF1
dG8gbGluZVN0YXR1cyA9IElubGluZUNvbnRlbnRCcmVha2VyOjpMaW5lU3RhdHVzIHsgbV9saW5l
LmNvbnRlbnRMb2dpY2FsUmlnaHQoKSwgYXZhaWxhYmxlV2lkdGgsIG1fbGluZS50cmltbWFibGVU
cmFpbGluZ1dpZHRoKCksIG1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpLCBtX2xpbmUu
aXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxlKCksIGxpbmVIYXNDb250ZW50LCAhbV93cmFwT3Bw
b3J0dW5pdHlMaXN0LmlzRW1wdHkoKSB9OwotICAgIGF1dG8gcmVzdWx0ID0gaW5saW5lQ29udGVu
dEJyZWFrZXIucHJvY2Vzc0lubGluZUNvbnRlbnQoY29udGludW91c0lubGluZUNvbnRlbnQsIGxp
bmVTdGF0dXMpOwotICAgIGF1dG8mIGNhbmRpZGF0ZVJ1bnMgPSBjb250aW51b3VzSW5saW5lQ29u
dGVudC5ydW5zKCk7Ci0gICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFr
ZXI6OlJlc3VsdDo6QWN0aW9uOjpLZWVwKSB7Ci0gICAgICAgIC8vIFRoaXMgY29udGludW91cyBj
b250ZW50IGNhbiBiZSBmdWxseSBwbGFjZWQgb24gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAg
bV9saW5lTG9naWNhbFJlY3QgPSBsaW5lTG9naWNhbFJlY3RGb3JDYW5kaWRhdGVDb250ZW50Owot
ICAgICAgICBmb3IgKGF1dG8mIHJ1biA6IGNhbmRpZGF0ZVJ1bnMpCi0gICAgICAgICAgICBtX2xp
bmUuYXBwZW5kKHJ1bi5pbmxpbmVJdGVtLCBydW4ubG9naWNhbFdpZHRoKTsKLSAgICAgICAgaWYg
KGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5p
dHkoKSkgewotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGFsbG93ZWQgdG8gd3JhcCBh
dCB0aGlzIHBvc2l0aW9uLgotICAgICAgICAgICAgYXV0byYgdHJhaWxpbmdJdGVtID0gY2FuZGlk
YXRlUnVucy5sYXN0KCkuaW5saW5lSXRlbTsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBUaGVyZSBt
dXN0IGJlIGEgd2F5IHRvIGRlY2lkZSBpZiB0aGUgdHJhaWxpbmcgcnVuIGFjdHVhbGx5IGVuZGVk
IHVwIG9uIHRoZSBsaW5lLgotICAgICAgICAgICAgLy8gTGV0J3MganVzdCBkZWFsIHdpdGggY29s
bGFwc2VkIGxlYWRpbmcgd2hpdGVzcGFjZSBmb3Igbm93LgotICAgICAgICAgICAgaWYgKCFtX2xp
bmUucnVucygpLmlzRW1wdHkoKSAmJiBJbmxpbmVDb250ZW50QnJlYWtlcjo6aXNXcmFwcGluZ0Fs
bG93ZWQodHJhaWxpbmdJdGVtKSkKLSAgICAgICAgICAgICAgICBtX3dyYXBPcHBvcnR1bml0eUxp
c3QuYXBwZW5kKCZ0cmFpbGluZ0l0ZW0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB7IHJl
c3VsdC5pc0VuZE9mTGluZSwgeyBjYW5kaWRhdGVSdW5zLnNpemUoKSwgZmFsc2UgfSB9OwotICAg
IH0KLQotICAgIGF1dG8gZWxpZ2libGVPdmVyZmxvd1dpZHRoQXNMZWFkaW5nID0gWyZdICgpIC0+
IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsKLSAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBw
b3J0IGZvciBvdGhlciB0eXBlcyBvZiBjb250aW51b3VzIGNvbnRlbnQuCi0gICAgICAgIEFTU0VS
VChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6
V3JhcCB8fCByZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFj
dGlvbjo6QnJlYWspOwotICAgICAgICBpZiAoY2FuZGlkYXRlUnVucy5zaXplKCkgIT0gMSB8fCAh
Y2FuZGlkYXRlUnVucy5maXJzdCgpLmlubGluZUl0ZW0uaXNUZXh0KCkpCi0gICAgICAgICAgICBy
ZXR1cm4geyB9OwotICAgICAgICBhdXRvJiBpbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGlu
ZVRleHRJdGVtPihjYW5kaWRhdGVSdW5zLmZpcnN0KCkuaW5saW5lSXRlbSk7Ci0gICAgICAgIGlm
IChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKLSAgICAgICAgICAgIHJldHVybiB7IH07
Ci0gICAgICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1
bHQ6OkFjdGlvbjo6V3JhcCkKLSAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVSdW5zLmZpcnN0
KCkubG9naWNhbFdpZHRoOwotICAgICAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250
ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rpb246OkJyZWFrICYmIHJlc3VsdC5wYXJ0aWFsVHJhaWxp
bmdDb250ZW50LT5wYXJ0aWFsUnVuKQotICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVJ1bnMu
Zmlyc3QoKS5sb2dpY2FsV2lkdGggLSByZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+cGFy
dGlhbFJ1bi0+bG9naWNhbFdpZHRoOwotICAgICAgICByZXR1cm4geyB9OwotICAgIH07Ci0KLSAg
ICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rp
b246OldyYXApIHsKLSAgICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVD
b250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olllcyk7Ci0gICAgICAgIC8vIFRoaXMgY29udGlu
dW91cyBjb250ZW50IGNhbid0IGJlIHBsYWNlZCBvbiB0aGUgY3VycmVudCBsaW5lLiBOb3RoaW5n
IHRvIGNvbW1pdCBhdCB0aGlzIHRpbWUuCi0gICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRC
cmVha2VyOjpJc0VuZE9mTGluZTo6WWVzLCB7IH0sIHsgfSwgZWxpZ2libGVPdmVyZmxvd1dpZHRo
QXNMZWFkaW5nKCkgfTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29u
dGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpXcmFwV2l0aEh5cGhlbikgewotICAgICAgICBB
U1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9m
TGluZTo6WWVzKTsKLSAgICAgICAgLy8gVGhpcyBjb250aW51b3VzIGNvbnRlbnQgY2FuJ3QgYmUg
cGxhY2VkIG9uIHRoZSBjdXJyZW50IGxpbmUsIG5vdGhpbmcgdG8gY29tbWl0LgotICAgICAgICAv
LyBIb3dldmVyIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGN1cnJlbnQgbGluZSBnYWlu
cyBhIHRyYWlsaW5nIGh5cGhlbi4KLSAgICAgICAgQVNTRVJUKG1fbGluZS50cmFpbGluZ1NvZnRI
eXBoZW5XaWR0aCgpKTsKLSAgICAgICAgbV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCptX2xpbmUu
dHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgoKSk7Ci0gICAgICAgIHJldHVybiB7IElubGluZUNvbnRl
bnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzIH07Ci0gICAgfQotICAgIGlmIChyZXN1bHQuYWN0
aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0
V3JhcE9wcG9ydHVuaXR5KSB7Ci0gICAgICAgIEFTU0VSVChyZXN1bHQuaXNFbmRPZkxpbmUgPT0g
SW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMpOwotICAgICAgICAvLyBOb3Qg
b25seSB0aGlzIGNvbnRlbnQgY2FuJ3QgYmUgcGxhY2VkIG9uIHRoZSBjdXJyZW50IGxpbmUsIGJ1
dCB3ZSBldmVuIG5lZWQgdG8gcmV2ZXJ0IHRoZSBsaW5lIGJhY2sgdG8gYW4gZWFybGllciBwb3Np
dGlvbi4KLSAgICAgICAgQVNTRVJUKCFtX3dyYXBPcHBvcnR1bml0eUxpc3QuaXNFbXB0eSgpKTsK
LSAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMs
IHsgcmVidWlsZExpbmUobGF5b3V0UmFuZ2UsICptX3dyYXBPcHBvcnR1bml0eUxpc3QubGFzdCgp
KSwgdHJ1ZSB9IH07Ci0gICAgfQotICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRl
bnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0Tm9uT3ZlcmZsb3dpbmdXcmFw
T3Bwb3J0dW5pdHkpIHsKLSAgICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxp
bmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olllcyk7Ci0gICAgICAgIEFTU0VSVCghbV93
cmFwT3Bwb3J0dW5pdHlMaXN0LmlzRW1wdHkoKSk7Ci0gICAgICAgIHJldHVybiB7IElubGluZUNv
bnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzLCB7IHJlYnVpbGRMaW5lRm9yVHJhaWxpbmdT
b2Z0SHlwaGVuKGxheW91dFJhbmdlKSwgdHJ1ZSB9IH07Ci0gICAgfQotICAgIGlmIChyZXN1bHQu
YWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6QnJlYWspIHsK
LSAgICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtl
cjo6SXNFbmRPZkxpbmU6Olllcyk7Ci0gICAgICAgIC8vIENvbW1pdCB0aGUgY29tYmluYXRpb24g
b2YgZnVsbCBhbmQgcGFydGlhbCBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAg
IEFTU0VSVChyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudCk7Ci0gICAgICAgIGNvbW1pdFBh
cnRpYWxDb250ZW50KGNhbmRpZGF0ZVJ1bnMsICpyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVu
dCk7Ci0gICAgICAgIC8vIFdoZW4gYnJlYWtpbmcgbXVsdGlwbGUgcnVucyA8c3BhbiBzdHlsZT0i
d29yZC1icmVhazogYnJlYWstYWxsIj50ZXh0PC9zcGFuPjxzcGFuPmNvbnRlbnQ8L3NwYW4+LCB3
ZSBtaWdodCBlbmQgdXAgYnJlYWtpbmcgdGhlbSBhdCBydW4gYm91bmRhcnkuCi0gICAgICAgIC8v
IEl0IHNpbXBseSBtZWFucyB3ZSBkb24ndCByZWFsbHkgaGF2ZSBhIHBhcnRpYWwgcnVuLiBQYXJ0
aWFsIGNvbnRlbnQgeWVzLCBidXQgbm90IHBhcnRpYWwgcnVuLgotICAgICAgICBhdXRvIHRyYWls
aW5nUnVuSW5kZXggPSByZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+dHJhaWxpbmdSdW5J
bmRleDsKLSAgICAgICAgYXV0byBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgPSB0cmFpbGluZ1J1
bkluZGV4ICsgMTsKLSAgICAgICAgaWYgKCFyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+
cGFydGlhbFJ1bikKLSAgICAgICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJ
c0VuZE9mTGluZTo6WWVzLCB7IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCwgZmFsc2UgfSB9Owot
Ci0gICAgICAgIGF1dG8gcGFydGlhbFJ1biA9ICpyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVu
dC0+cGFydGlhbFJ1bjsKLSAgICAgICAgYXV0byYgdHJhaWxpbmdJbmxpbmVUZXh0SXRlbSA9IGRv
d25jYXN0PElubGluZVRleHRJdGVtPihjYW5kaWRhdGVSdW5zW3RyYWlsaW5nUnVuSW5kZXhdLmlu
bGluZUl0ZW0pOwotICAgICAgICBBU1NFUlQocGFydGlhbFJ1bi5sZW5ndGggPCB0cmFpbGluZ0lu
bGluZVRleHRJdGVtLmxlbmd0aCgpKTsKLSAgICAgICAgYXV0byBvdmVyZmxvd0xlbmd0aCA9IHRy
YWlsaW5nSW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkgLSBwYXJ0aWFsUnVuLmxlbmd0aDsKLSAgICAg
ICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgY29t
bWl0dGVkSW5saW5lSXRlbUNvdW50LCBmYWxzZSB9LCBvdmVyZmxvd0xlbmd0aCwgZWxpZ2libGVP
dmVyZmxvd1dpZHRoQXNMZWFkaW5nKCkgfTsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7Ci0gICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9
OwotfQotCi12b2lkIExpbmVCdWlsZGVyOjpjb21taXRQYXJ0aWFsQ29udGVudChjb25zdCBJbmxp
bmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OlJ1bkxpc3QmIHJ1bnMsIGNvbnN0
IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OlBhcnRpYWxUcmFpbGluZ0NvbnRlbnQmIHBh
cnRpYWxUcmFpbGluZ0NvbnRlbnQpCi17Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRl
eCA8IHJ1bnMuc2l6ZSgpOyArK2luZGV4KSB7Ci0gICAgICAgIGF1dG8mIHJ1biA9IHJ1bnNbaW5k
ZXhdOwotICAgICAgICBpZiAocGFydGlhbFRyYWlsaW5nQ29udGVudC50cmFpbGluZ1J1bkluZGV4
ID09IGluZGV4KSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYW5kIGNvbW1pdCBwYXJ0aWFsIHRy
YWlsaW5nIGl0ZW0uCi0gICAgICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gcGFydGlhbFRy
YWlsaW5nQ29udGVudC5wYXJ0aWFsUnVuKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHJ1bi5p
bmxpbmVJdGVtLmlzVGV4dCgpKTsKLSAgICAgICAgICAgICAgICBhdXRvJiB0cmFpbGluZ0lubGlu
ZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KHJ1bnNbcGFydGlhbFRyYWlsaW5n
Q29udGVudC50cmFpbGluZ1J1bkluZGV4XS5pbmxpbmVJdGVtKTsKLSAgICAgICAgICAgICAgICBh
dXRvIHBhcnRpYWxUcmFpbGluZ1RleHRJdGVtID0gdHJhaWxpbmdJbmxpbmVUZXh0SXRlbS5sZWZ0
KHBhcnRpYWxSdW4tPmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbV9saW5lLmFwcGVuZChwYXJ0
aWFsVHJhaWxpbmdUZXh0SXRlbSwgcGFydGlhbFJ1bi0+bG9naWNhbFdpZHRoKTsKLSAgICAgICAg
ICAgICAgICBpZiAoYXV0byBoeXBoZW5XaWR0aCA9IHBhcnRpYWxSdW4tPmh5cGhlbldpZHRoKQot
ICAgICAgICAgICAgICAgICAgICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBoZW4oKmh5cGhlbldpZHRo
KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAv
LyBUaGUgcGFydGlhbCBydW4gaXMgdGhlIGxhc3QgY29udGVudCB0byBjb21taXQuCi0gICAgICAg
ICAgICBtX2xpbmUuYXBwZW5kKHJ1bi5pbmxpbmVJdGVtLCBydW4ubG9naWNhbFdpZHRoKTsKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtX2xpbmUuYXBwZW5kKHJ1bi5p
bmxpbmVJdGVtLCBydW4ubG9naWNhbFdpZHRoKTsKLSAgICB9Ci19Ci0KLXNpemVfdCBMaW5lQnVp
bGRlcjo6cmVidWlsZExpbmUoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsYXlvdXRSYW5nZSwgY29u
c3QgSW5saW5lSXRlbSYgbGFzdElubGluZUl0ZW1Ub0FkZCkKLXsKLSAgICBBU1NFUlQoIW1fd3Jh
cE9wcG9ydHVuaXR5TGlzdC5pc0VtcHR5KCkpOwotICAgIC8vIFdlIG1pZ2h0IGFscmVhZHkgaGF2
ZSBhZGRlZCBmbG9hdHMuIFRoZXkgc2hyaW5rIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFj
ZSBmb3IgdGhlIGxpbmUuCi0gICAgLy8gTGV0J3MganVzdCByZXVzZSB3aGF0IHRoZSBsaW5lIGhh
cyBhdCB0aGlzIHBvaW50LgotICAgIG1fbGluZS5pbml0aWFsaXplKCk7Ci0gICAgYXV0byBjdXJy
ZW50SXRlbUluZGV4ID0gbGF5b3V0UmFuZ2Uuc3RhcnQ7Ci0gICAgaWYgKG1fcGFydGlhbExlYWRp
bmdUZXh0SXRlbSkgewotICAgICAgICBtX2xpbmUuYXBwZW5kKCptX3BhcnRpYWxMZWFkaW5nVGV4
dEl0ZW0sIGlubGluZUl0ZW1XaWR0aCgqbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtLCB7IH0pKTsK
LSAgICAgICAgaWYgKCZtX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0udmFsdWUoKSA9PSAmbGFzdElu
bGluZUl0ZW1Ub0FkZCkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICArK2N1cnJlbnRJ
dGVtSW5kZXg7Ci0gICAgfQotICAgIGZvciAoOyBjdXJyZW50SXRlbUluZGV4IDwgbGF5b3V0UmFu
Z2UuZW5kOyArK2N1cnJlbnRJdGVtSW5kZXgpIHsKLSAgICAgICAgYXV0byYgaW5saW5lSXRlbSA9
IG1faW5saW5lSXRlbXNbY3VycmVudEl0ZW1JbmRleF07Ci0gICAgICAgIG1fbGluZS5hcHBlbmQo
aW5saW5lSXRlbSwgaW5saW5lSXRlbVdpZHRoKGlubGluZUl0ZW0sIG1fbGluZS5jb250ZW50TG9n
aWNhbFJpZ2h0KCkpKTsKLSAgICAgICAgaWYgKCZpbmxpbmVJdGVtID09ICZsYXN0SW5saW5lSXRl
bVRvQWRkKQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJdGVtSW5kZXggLSBsYXlvdXRSYW5n
ZS5zdGFydCArIDE7Ci0gICAgfQotICAgIHJldHVybiBsYXlvdXRSYW5nZS5zaXplKCk7Ci19Ci0K
LXNpemVfdCBMaW5lQnVpbGRlcjo6cmVidWlsZExpbmVGb3JUcmFpbGluZ1NvZnRIeXBoZW4oY29u
c3QgSW5saW5lSXRlbVJhbmdlJiBsYXlvdXRSYW5nZSkKLXsKLSAgICBBU1NFUlQoIW1fd3JhcE9w
cG9ydHVuaXR5TGlzdC5pc0VtcHR5KCkpOwotICAgIC8vIFJldmVydCBhbGwgdGhlIHdheSBiYWNr
IHRvIGEgd3JhcCBvcHBvcnR1bml0eSB3aGVuIGVpdGhlciBhIHNvZnQgaHlwaGVuIGZpdHMgb3Ig
bm8gaHlwaGVuIGlzIHJlcXVpcmVkLgotICAgIGZvciAoYXV0byBpID0gbV93cmFwT3Bwb3J0dW5p
dHlMaXN0LnNpemUoKTsgaS0tID4gMTspIHsKLSAgICAgICAgYXV0byYgc29mdFdyYXBPcHBvcnR1
bml0eUl0ZW0gPSAqbV93cmFwT3Bwb3J0dW5pdHlMaXN0W2ldOwotICAgICAgICAvLyBGSVhNRTog
SWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgYSBwZXJmIGlzc3VlLCB3ZSBjb3VsZCBhbHNvIHRyYXZl
cnNlIHRoZSB3cmFwIGxpc3QgYW5kIGtlZXAgYWRkaW5nIHRoZSBpdGVtcwotICAgICAgICAvLyB3
aGlsZSB3YXRjaGluZyB0aGUgYXZhaWxhYmxlIHdpZHRoIHZlcnkgY2xvc2VseS4KLSAgICAgICAg
YXV0byBjb21taXR0ZWRDb3VudCA9IHJlYnVpbGRMaW5lKGxheW91dFJhbmdlLCBzb2Z0V3JhcE9w
cG9ydHVuaXR5SXRlbSk7Ci0gICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBtX2xpbmVMb2dp
Y2FsUmVjdC53aWR0aCgpIC0gbV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKTsKLSAgICAgICAg
YXV0byB0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IG1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5X
aWR0aCgpOwotICAgICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaWxpbmcgaHlwaGVuIG5vdyBmaXRz
IHRoZSBsaW5lIChvciB3ZSBkb24ndCBuZWVkIGh5aGVuIGFueW1vcmUpLgotICAgICAgICBpZiAo
IXRyYWlsaW5nU29mdEh5cGhlbldpZHRoIHx8IHRyYWlsaW5nU29mdEh5cGhlbldpZHRoIDw9IGF2
YWlsYWJsZVdpZHRoKSB7Ci0gICAgICAgICAgICBpZiAodHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgp
Ci0gICAgICAgICAgICAgICAgbV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCp0cmFpbGluZ1NvZnRI
eXBoZW5XaWR0aCk7Ci0gICAgICAgICAgICByZXR1cm4gY29tbWl0dGVkQ291bnQ7Ci0gICAgICAg
IH0KLSAgICB9Ci0gICAgLy8gSGF2ZSBhdCBsZWFzdCBzb21lIGNvbnRlbnQgb24gdGhlIGxpbmUu
Ci0gICAgYXV0byBjb21taXR0ZWRDb3VudCA9IHJlYnVpbGRMaW5lKGxheW91dFJhbmdlLCAqbV93
cmFwT3Bwb3J0dW5pdHlMaXN0LmZpcnN0KCkpOwotICAgIGlmIChhdXRvIHRyYWlsaW5nU29mdEh5
cGhlbldpZHRoID0gbV9saW5lLnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCkpCi0gICAgICAgIG1f
bGluZS5hZGRUcmFpbGluZ0h5cGhlbigqdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgpOwotICAgIHJl
dHVybiBjb21taXR0ZWRDb3VudDsKLX0KLQotYm9vbCBMaW5lQnVpbGRlcjo6aXNMYXN0TGluZVdp
dGhJbmxpbmVDb250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGluZVJhbmdlLCBzaXplX3Qg
bGFzdElubGluZUl0ZW1JbmRleCwgYm9vbCBoYXNQYXJ0aWFsVHJhaWxpbmdDb250ZW50KSBjb25z
dAotewotICAgIGlmIChoYXNQYXJ0aWFsVHJhaWxpbmdDb250ZW50KQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgaWYgKGxpbmVSYW5nZS5lbmQgPT0gbGFzdElubGluZUl0ZW1JbmRleCkKLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgLy8gT21pdCBmbG9hdHMgdG8gc2VlIGlmIHRoaXMgaXMg
dGhlIGxhc3QgbGluZSB3aXRoIGlubGluZSBjb250ZW50LgotICAgIGZvciAoYXV0byBpID0gbGFz
dElubGluZUl0ZW1JbmRleDsgaS0tOykgewotICAgICAgICBpZiAoIW1faW5saW5lSXRlbXNbaV0u
aXNGbG9hdCgpKQotICAgICAgICAgICAgcmV0dXJuIGkgPT0gbGluZVJhbmdlLmVuZCAtIDE7Ci0g
ICAgfQotICAgIC8vIFRoZXJlIGhhcyB0byBiZSBhdCBsZWFzdCBvbmUgbm9uLWZsb2F0IGl0ZW0u
Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1jb25z
dCBDb250YWluZXJCb3gmIExpbmVCdWlsZGVyOjpyb290KCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Zm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCk7Ci19Ci0KLWNvbnN0IExheW91dFN0YXRlJiBMaW5l
QnVpbGRlcjo6bGF5b3V0U3RhdGUoKSBjb25zdAotewotICAgIHJldHVybiBmb3JtYXR0aW5nQ29u
dGV4dCgpLmxheW91dFN0YXRlKCk7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5o
IGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxk
ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyMTcxNTA1ZWZmYjQyZmRmMGIz
MjE2NDNiMzQzZDhjNTVmY2FlZi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVM
aW5lQnVpbGRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgot
ICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgot
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAq
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwot
Ci0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQot
Ci0jaW5jbHVkZSAiSW5saW5lQ29udGVudEJyZWFrZXIuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3Jt
YXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5lLmgiCi0KLW5hbWVzcGFjZSBXZWJD
b3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBGbG9hdGluZ0NvbnRleHQ7Ci1zdHJ1
Y3QgTGluZUNhbmRpZGF0ZTsKLQotY2xhc3MgTGluZUJ1aWxkZXIgewotcHVibGljOgotICAgIExp
bmVCdWlsZGVyKElubGluZUZvcm1hdHRpbmdDb250ZXh0JiwgRmxvYXRpbmdTdGF0ZSYsIEhvcml6
b250YWxDb25zdHJhaW50cyByb290SG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBJbmxpbmVJ
dGVtcyYpOwotICAgIExpbmVCdWlsZGVyKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Jiwg
Y29uc3QgSW5saW5lSXRlbXMmKTsKLQotICAgIHN0cnVjdCBJbmxpbmVJdGVtUmFuZ2UgewotICAg
ICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBzdGFydCA9PSBlbmQ7IH0KLSAgICAg
ICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBlbmQgLSBzdGFydDsgfQotICAgICAgICBz
aXplX3Qgc3RhcnQgeyAwIH07Ci0gICAgICAgIHNpemVfdCBlbmQgeyAwIH07Ci0gICAgfTsKLSAg
ICB1c2luZyBGbG9hdExpc3QgPSBWZWN0b3I8Y29uc3QgQm94Kj47Ci0gICAgc3RydWN0IExpbmVD
b250ZW50IHsKLSAgICAgICAgSW5saW5lSXRlbVJhbmdlIGlubGluZUl0ZW1SYW5nZTsKLSAgICAg
ICAgc2l6ZV90IHBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGggeyAwIH07Ci0gICAgICAgIE9w
dGlvbmFsPElubGluZUxheW91dFVuaXQ+IG92ZXJmbG93TG9naWNhbFdpZHRoOwotICAgICAgICBj
b25zdCBGbG9hdExpc3QmIGZsb2F0czsKLSAgICAgICAgYm9vbCBoYXNJbnRydXNpdmVGbG9hdCB7
IGZhbHNlIH07Ci0gICAgICAgIElubGluZUxheW91dFBvaW50IGxvZ2ljYWxUb3BMZWZ0OwotICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IGxpbmVMb2dpY2FsV2lkdGg7Ci0gICAgICAgIElubGluZUxh
eW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aDsKLSAgICAgICAgYm9vbCBpc0xhc3RMaW5lV2l0
aElubGluZUNvbnRlbnQgeyB0cnVlIH07Ci0gICAgICAgIHNpemVfdCBub25TcGFubmluZ0lubGlu
ZUxldmVsQm94Q291bnQgeyAwIH07Ci0gICAgICAgIGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnM7
Ci0gICAgfTsKLSAgICBMaW5lQ29udGVudCBsYXlvdXRJbmxpbmVDb250ZW50KGNvbnN0IElubGlu
ZUl0ZW1SYW5nZSYsIHNpemVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFs
PElubGluZUxheW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgsIGNvbnN0IElubGluZVJlY3Qm
IGluaXRpYWxMaW5lTG9naWNhbFJlY3QsIGJvb2wgaXNGaXJzdExpbmUpOwotCi0gICAgc3RydWN0
IEludHJpbnNpY0NvbnRlbnQgewotICAgICAgICBJbmxpbmVJdGVtUmFuZ2UgaW5saW5lSXRlbVJh
bmdlOwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICAg
ICAgY29uc3QgRmxvYXRMaXN0JiBmbG9hdHM7Ci0gICAgfTsKLSAgICBJbnRyaW5zaWNDb250ZW50
IGNvbXB1dGVkSW50cmluc2ljV2lkdGgoY29uc3QgSW5saW5lSXRlbVJhbmdlJiwgSW5saW5lTGF5
b3V0VW5pdCBhdmFpbGFibGVXaWR0aCk7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBjYW5kaWRhdGVD
b250ZW50Rm9yTGluZShMaW5lQ2FuZGlkYXRlJiwgc2l6ZV90IGlubGluZUl0ZW1JbmRleCwgY29u
c3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBzaXplX3Qgb3ZlcmZsb3dMZW5n
dGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgsIElubGlu
ZUxheW91dFVuaXQgY3VycmVudExvZ2ljYWxSaWdodCk7Ci0gICAgc2l6ZV90IG5leHRXcmFwT3Bw
b3J0dW5pdHkoc2l6ZV90IHN0YXJ0SW5kZXgsIGNvbnN0IExpbmVCdWlsZGVyOjpJbmxpbmVJdGVt
UmFuZ2UmIGxheW91dFJhbmdlKSBjb25zdDsKLQotICAgIHN0cnVjdCBSZXN1bHQgewotICAgICAg
ICBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmUgaXNFbmRPZkxpbmUgeyBJbmxpbmVD
b250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Ok5vIH07Ci0gICAgICAgIHN0cnVjdCBDb21taXR0
ZWRDb250ZW50Q291bnQgewotICAgICAgICAgICAgc2l6ZV90IHZhbHVlIHsgMCB9OwotICAgICAg
ICAgICAgYm9vbCBpc1JldmVydCB7IGZhbHNlIH07Ci0gICAgICAgIH07Ci0gICAgICAgIENvbW1p
dHRlZENvbnRlbnRDb3VudCBjb21taXR0ZWRDb3VudCB7IH07Ci0gICAgICAgIHNpemVfdCBwYXJ0
aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoIHsgMCB9OwotICAgICAgICBPcHRpb25hbDxJbmxpbmVM
YXlvdXRVbml0PiBvdmVyZmxvd0xvZ2ljYWxXaWR0aCB7IH07Ci0gICAgfTsKLSAgICBzdHJ1Y3Qg
VXNlZENvbnN0cmFpbnRzIHsKLSAgICAgICAgSW5saW5lUmVjdCBsb2dpY2FsUmVjdDsKLSAgICAg
ICAgYm9vbCBpc0NvbnN0cmFpbmVkQnlGbG9hdCB7IGZhbHNlIH07Ci0gICAgfTsKLSAgICBVc2Vk
Q29uc3RyYWludHMgaW5pdGlhbENvbnN0cmFpbnRzRm9yTGluZShjb25zdCBJbmxpbmVSZWN0JiBp
bml0aWFsTGluZUxvZ2ljYWxSZWN0LCBib29sIGlzRmlyc3RMaW5lKSBjb25zdDsKLSAgICBPcHRp
b25hbDxIb3Jpem9udGFsQ29uc3RyYWludHM+IGZsb2F0Q29uc3RyYWludHMoY29uc3QgSW5saW5l
UmVjdCYgbGluZUxvZ2ljYWxSZWN0KSBjb25zdDsKLQotICAgIHZvaWQgaGFuZGxlRmxvYXRDb250
ZW50KGNvbnN0IElubGluZUl0ZW0mKTsKLSAgICBSZXN1bHQgaGFuZGxlSW5saW5lQ29udGVudChJ
bmxpbmVDb250ZW50QnJlYWtlciYsIGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRS
YW5nZSwgY29uc3QgTGluZUNhbmRpZGF0ZSYpOwotICAgIHNpemVfdCByZWJ1aWxkTGluZShjb25z
dCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2UsIGNvbnN0IElubGluZUl0ZW0mIGxh
c3RJbmxpbmVJdGVtVG9BZGQpOwotICAgIHNpemVfdCByZWJ1aWxkTGluZUZvclRyYWlsaW5nU29m
dEh5cGhlbihjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlKTsKLSAgICB2b2lkIGNv
bW1pdFBhcnRpYWxDb250ZW50KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3Vz
Q29udGVudDo6UnVuTGlzdCYsIGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OlBh
cnRpYWxUcmFpbGluZ0NvbnRlbnQmKTsKLSAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVXNlZENv
bnN0cmFpbnRzJik7Ci0gICAgc3RydWN0IENvbW1pdHRlZENvbnRlbnQgewotICAgICAgICBzaXpl
X3QgaW5saW5lSXRlbUNvdW50IHsgMCB9OwotICAgICAgICBzaXplX3QgcGFydGlhbFRyYWlsaW5n
Q29udGVudExlbmd0aCB7IDAgfTsKLSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4g
b3ZlcmZsb3dMb2dpY2FsV2lkdGggeyB9OwotICAgIH07Ci0gICAgQ29tbWl0dGVkQ29udGVudCBw
bGFjZUlubGluZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiwgc2l6ZV90IHBhcnRpYWxM
ZWFkaW5nQ29udGVudExlbmd0aCwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gb3ZlcmZsb3dM
b2dpY2FsV2lkdGgpOwotICAgIElubGluZUl0ZW1SYW5nZSBjbG9zZShjb25zdCBJbmxpbmVJdGVt
UmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2UsIGNvbnN0IENvbW1pdHRlZENvbnRlbnQmKTsKLQotICAg
IElubGluZUxheW91dFVuaXQgaW5saW5lSXRlbVdpZHRoKGNvbnN0IElubGluZUl0ZW0mLCBJbmxp
bmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCkgY29uc3Q7Ci0gICAgYm9vbCBpc0xhc3RM
aW5lV2l0aElubGluZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsaW5lUmFuZ2UsIHNp
emVfdCBsYXN0SW5saW5lSXRlbUluZGV4LCBib29sIGhhc1BhcnRpYWxUcmFpbGluZ0NvbnRlbnQp
IGNvbnN0OwotCi0gICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdD
b250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsgfQotICAg
IElubGluZUZvcm1hdHRpbmdTdGF0ZSogZm9ybWF0dGluZ1N0YXRlKCkgeyByZXR1cm4gbV9pbmxp
bmVGb3JtYXR0aW5nU3RhdGU7IH0KLSAgICBGbG9hdGluZ1N0YXRlKiBmbG9hdGluZ1N0YXRlKCkg
eyByZXR1cm4gbV9mbG9hdGluZ1N0YXRlOyB9Ci0gICAgY29uc3QgRmxvYXRpbmdTdGF0ZSogZmxv
YXRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRpbmdTdGF0ZTsgfQotICAgIGNvbnN0
IENvbnRhaW5lckJveCYgcm9vdCgpIGNvbnN0OwotICAgIGNvbnN0IExheW91dFN0YXRlJiBsYXlv
dXRTdGF0ZSgpIGNvbnN0OwotCi0gICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIG1f
aW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Ci0gICAgSW5saW5lRm9ybWF0dGluZ1N0YXRlKiBtX2lu
bGluZUZvcm1hdHRpbmdTdGF0ZSB7IG51bGxwdHIgfTsKLSAgICBGbG9hdGluZ1N0YXRlKiBtX2Zs
b2F0aW5nU3RhdGUgeyBudWxscHRyIH07Ci0gICAgT3B0aW9uYWw8SG9yaXpvbnRhbENvbnN0cmFp
bnRzPiBtX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHM7Ci0KLSAgICBMaW5lIG1fbGluZTsKLSAg
ICBJbmxpbmVSZWN0IG1fbGluZUxvZ2ljYWxSZWN0OwotICAgIGNvbnN0IElubGluZUl0ZW1zJiBt
X2lubGluZUl0ZW1zOwotICAgIEZsb2F0TGlzdCBtX2Zsb2F0czsKLSAgICBPcHRpb25hbDxJbmxp
bmVUZXh0SXRlbT4gbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtOwotICAgIFZlY3Rvcjxjb25zdCBJ
bmxpbmVJdGVtKj4gbV93cmFwT3Bwb3J0dW5pdHlMaXN0OwotICAgIHVuc2lnbmVkIG1fc3VjY2Vz
c2l2ZUh5cGhlbmF0ZWRMaW5lQ291bnQgeyAwIH07Ci0gICAgYm9vbCBtX2NvbnRlbnRJc0NvbnN0
cmFpbmVkQnlGbG9hdCB7IGZhbHNlIH07Ci19OwotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVHZW9tZXRy
eS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUdl
b21ldHJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTJjNThhMDc2ZTQ5YzJj
ZDNjOWUyZjkyYWIzNmQwM2YyNzI5ZTUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5s
aW5lTGluZUdlb21ldHJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICog
Q29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0g
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
LSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
Ci0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0g
Ki8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKLQotI2luY2x1ZGUgIklubGluZVJlY3QuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFt
ZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIElubGluZUxpbmVHZW9tZXRyeSB7Ci0gICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgc3RydWN0IEVuY2xvc2luZ1RvcEFuZEJv
dHRvbSB7Ci0gICAgICAgIC8vIFRoaXMgdmFsdWVzIGVuY2xvc2VzIHRoZSByb290IGlubGluZSBi
b3ggYW5kIGFueSBvdGhlciBpbmxpbmUgbGV2ZWwgYm94J3MgYm9yZGVyIGJveC4KLSAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCB0b3AgeyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgYm90
dG9tIHsgMCB9OwotICAgIH07Ci0gICAgSW5saW5lTGluZUdlb21ldHJ5KGNvbnN0IElubGluZVJl
Y3QmIGxpbmVCb3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tLCBJbmxpbmVMYXlv
dXRVbml0IGFsaWdtZW50QmFzZWxpbmUsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxM
ZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgpOwotCi0gICAgY29uc3Qg
SW5saW5lUmVjdCYgbGluZUJveExvZ2ljYWxSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94
TG9naWNhbFJlY3Q7IH0KLQotICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBlbmNsb3NpbmdUb3BB
bmRCb3R0b20oKSBjb25zdCB7IHJldHVybiBtX2VuY2xvc2luZ1RvcEFuZEJvdHRvbTsgfQotCi0g
ICAgSW5saW5lTGF5b3V0VW5pdCBiYXNlbGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fYWxpZ21lbnRC
YXNlbGluZTsgfQotCi0gICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQoKSBj
b25zdCB7IHJldHVybiBtX2NvbnRlbnRMb2dpY2FsTGVmdDsgfQotICAgIElubGluZUxheW91dFVu
aXQgY29udGVudExvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudExvZ2ljYWxX
aWR0aDsgfQotCi0gICAgdm9pZCBtb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNl
dCkgeyBtX2xpbmVCb3hMb2dpY2FsUmVjdC5tb3ZlVmVydGljYWxseShvZmZzZXQpOyB9Ci0KLXBy
aXZhdGU6Ci0gICAgLy8gVGhpcyBpcyBsaW5lIGJveCBnZW9tZXRyeSAoc2VlIGh0dHBzOi8vd3d3
LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xpbmUtYm94KS4KLSAgICBJbmxpbmVSZWN0IG1fbGlu
ZUJveExvZ2ljYWxSZWN0OwotICAgIC8vIEVuY2xvc2luZyB0b3AgYW5kIGJvdHRvbSBpbmNsdWRl
cyBhbGwgaW5saW5lIGxldmVsIGJveGVzIChib3JkZXIgYm94KSB2ZXJ0aWNhbGx5LgotICAgIC8v
IFdoaWxlIHRoZSBsaW5lIGJveCB1c3VhbGx5IGVuY2xvc2UgdGhlbSBhcyB3ZWxsLCBpdHMgdmVy
dGljYWwgZ2VvbWV0cnkgaXMgYmFzZWQgb24KLSAgICAvLyB0aGUgbGF5b3V0IGJvdW5kcyBvZiB0
aGUgaW5saW5lIGxldmVsIGJveGVzIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgd2hlbiBsaW5lLWhl
aWdodCBpcyBwcmVzZW50LgotICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBtX2VuY2xvc2luZ1Rv
cEFuZEJvdHRvbTsKLSAgICBJbmxpbmVMYXlvdXRVbml0IG1fYWxpZ21lbnRCYXNlbGluZSB7IDAg
fTsKLSAgICBJbmxpbmVMYXlvdXRVbml0IG1fY29udGVudExvZ2ljYWxMZWZ0IHsgMCB9OwotICAg
IElubGluZUxheW91dFVuaXQgbV9jb250ZW50TG9naWNhbFdpZHRoIHsgMCB9OwotfTsKLQotaW5s
aW5lIElubGluZUxpbmVHZW9tZXRyeTo6SW5saW5lTGluZUdlb21ldHJ5KGNvbnN0IElubGluZVJl
Y3QmIGxpbmVCb3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tIGVuY2xvc2luZ1Rv
cEFuZEJvdHRvbSwgSW5saW5lTGF5b3V0VW5pdCBhbGlnbWVudEJhc2VsaW5lLCBJbmxpbmVMYXlv
dXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNh
bFdpZHRoKQotICAgIDogbV9saW5lQm94TG9naWNhbFJlY3QobGluZUJveExvZ2ljYWxSZWN0KQot
ICAgICwgbV9lbmNsb3NpbmdUb3BBbmRCb3R0b20oZW5jbG9zaW5nVG9wQW5kQm90dG9tKQotICAg
ICwgbV9hbGlnbWVudEJhc2VsaW5lKGFsaWdtZW50QmFzZWxpbmUpCi0gICAgLCBtX2NvbnRlbnRM
b2dpY2FsTGVmdChjb250ZW50TG9naWNhbExlZnQpCi0gICAgLCBtX2NvbnRlbnRMb2dpY2FsV2lk
dGgoY29udGVudExvZ2ljYWxXaWR0aCkKLXsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVSdW4u
aCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVSdW4u
aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwZWUxNGRlZDBiZTJjY2Q1MmQzNDMz
YjA4ODQ1NDZjMWYwZDJiMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5l
UnVuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
QykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFn
bWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNs
dWRlICJJbmxpbmVSZWN0LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiVGV4
dEZsYWdzLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1z
dHJ1Y3QgTGluZVJ1biB7Ci0gICAgV1RGX01BS0VfU1RSVUNUX0ZBU1RfQUxMT0NBVEVEOwotICAg
IHN0cnVjdCBUZXh0IHsKLSAgICAgICAgV1RGX01BS0VfU1RSVUNUX0ZBU1RfQUxMT0NBVEVEOwot
ICAgIHB1YmxpYzoKLSAgICAgICAgVGV4dChzaXplX3QgcG9zaXRpb24sIHNpemVfdCBsZW5ndGgs
IGNvbnN0IFN0cmluZyYpOwotCi0gICAgICAgIHNpemVfdCBzdGFydCgpIGNvbnN0IHsgcmV0dXJu
IG1fc3RhcnQ7IH0KLSAgICAgICAgc2l6ZV90IGVuZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0KCkg
KyBsZW5ndGgoKTsgfQotICAgICAgICBzaXplX3QgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9s
ZW5ndGg7IH0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRl
bnRTdHJpbmc7IH0KLQotICAgICAgICBib29sIG5lZWRzSHlwaGVuKCkgY29uc3QgeyByZXR1cm4g
bV9uZWVkc0h5cGhlbjsgfQotICAgICAgICB2b2lkIHNldE5lZWRzSHlwaGVuKCkgeyBtX25lZWRz
SHlwaGVuID0gdHJ1ZTsgfQotCi0gICAgICAgIHZvaWQgZXhwYW5kKHNpemVfdCBkZWx0YSkgeyBt
X2xlbmd0aCArPSBkZWx0YTsgfQotICAgICAgICB2b2lkIHNocmluayhzaXplX3QgZGVsdGEpIHsg
bV9sZW5ndGggLT0gZGVsdGE7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNpemVfdCBtX3N0
YXJ0IHsgMCB9OwotICAgICAgICBzaXplX3QgbV9sZW5ndGggeyAwIH07Ci0gICAgICAgIGJvb2wg
bV9uZWVkc0h5cGhlbiB7IGZhbHNlIH07Ci0gICAgICAgIFN0cmluZyBtX2NvbnRlbnRTdHJpbmc7
Ci0gICAgfTsKLQotICAgIHN0cnVjdCBFeHBhbnNpb247Ci0gICAgTGluZVJ1bihzaXplX3QgbGlu
ZUluZGV4LCBjb25zdCBCb3gmLCBjb25zdCBJbmxpbmVSZWN0JiwgRXhwYW5zaW9uLCBPcHRpb25h
bDxUZXh0PiA9IFdURjo6bnVsbG9wdCk7Ci0KLSAgICBjb25zdCBJbmxpbmVSZWN0JiBsb2dpY2Fs
UmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3Q7IH0KLQotICAgIElubGluZUxheW91
dFVuaXQgbG9naWNhbFRvcCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkudG9wKCk7IH0K
LSAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxCb3R0b20oKSBjb25zdCB7IHJldHVybiBsb2dp
Y2FsUmVjdCgpLmJvdHRvbSgpOyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgp
IGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkubGVmdCgpOyB9Ci0gICAgSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsUmlnaHQoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVjdCgpLnJpZ2h0KCk7
IH0KLQotICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4g
bG9naWNhbFJlY3QoKS53aWR0aCgpOyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVp
Z2h0KCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS5oZWlnaHQoKTsgfQotCi0gICAgdm9p
ZCBtb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkgeyBtX2xvZ2ljYWxSZWN0
Lm1vdmVWZXJ0aWNhbGx5KG9mZnNldCk7IH0KLSAgICBPcHRpb25hbDxUZXh0PiYgdGV4dCgpIHsg
cmV0dXJuIG1fdGV4dDsgfQotICAgIGNvbnN0IE9wdGlvbmFsPFRleHQ+JiB0ZXh0KCkgY29uc3Qg
eyByZXR1cm4gbV90ZXh0OyB9Ci0KLSAgICBzdHJ1Y3QgRXhwYW5zaW9uIHsKLSAgICAgICAgRXhw
YW5zaW9uQmVoYXZpb3IgYmVoYXZpb3IgeyBEZWZhdWx0RXhwYW5zaW9uIH07Ci0gICAgICAgIElu
bGluZUxheW91dFVuaXQgaG9yaXpvbnRhbEV4cGFuc2lvbiB7IDAgfTsKLSAgICB9OwotICAgIEV4
cGFuc2lvbiBleHBhbnNpb24oKSBjb25zdCB7IHJldHVybiBtX2V4cGFuc2lvbjsgfQotCi0gICAg
Y29uc3QgQm94JiBsYXlvdXRCb3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRCb3g7IH0KLSAg
ICBzaXplX3QgbGluZUluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9saW5lSW5kZXg7IH0KLQotcHJp
dmF0ZToKLSAgICBjb25zdCBzaXplX3QgbV9saW5lSW5kZXg7Ci0gICAgV2Vha1B0cjxjb25zdCBM
YXlvdXQ6OkJveD4gbV9sYXlvdXRCb3g7Ci0gICAgSW5saW5lUmVjdCBtX2xvZ2ljYWxSZWN0Owot
ICAgIEV4cGFuc2lvbiBtX2V4cGFuc2lvbjsKLSAgICBPcHRpb25hbDxUZXh0PiBtX3RleHQ7Ci19
OwotCi1pbmxpbmUgTGluZVJ1bjo6TGluZVJ1bihzaXplX3QgbGluZUluZGV4LCBjb25zdCBMYXlv
dXQ6OkJveCYgbGF5b3V0Qm94LCBjb25zdCBJbmxpbmVSZWN0JiBsb2dpY2FsUmVjdCwgRXhwYW5z
aW9uIGV4cGFuc2lvbiwgT3B0aW9uYWw8VGV4dD4gdGV4dCkKLSAgICA6IG1fbGluZUluZGV4KGxp
bmVJbmRleCkKLSAgICAsIG1fbGF5b3V0Qm94KG1ha2VXZWFrUHRyKGxheW91dEJveCkpCi0gICAg
LCBtX2xvZ2ljYWxSZWN0KGxvZ2ljYWxSZWN0KQotICAgICwgbV9leHBhbnNpb24oZXhwYW5zaW9u
KQotICAgICwgbV90ZXh0KHRleHQpCi17Ci19Ci0KLWlubGluZSBMaW5lUnVuOjpUZXh0OjpUZXh0
KHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbmd0aCwgY29uc3QgU3RyaW5nJiBjb250ZW50U3RyaW5n
KQotICAgIDogbV9zdGFydChzdGFydCkKLSAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKLSAgICAsIG1f
Y29udGVudFN0cmluZyhjb250ZW50U3RyaW5nKQotewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVJlY3Qu
aCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVJlY3QuaApk
ZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkMDlhYjFlNzEwMWFhNmVjZjQzM2QyNjQw
MDRmZmU4ZmI3YThjNC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVSZWN0LmgK
KysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAx
OSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25j
ZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJM
YXlvdXRVbml0cy5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsK
LQotY2xhc3MgSW5saW5lUmVjdCB7Ci1wdWJsaWM6Ci0gICAgSW5saW5lUmVjdCgpID0gZGVmYXVs
dDsKLSAgICBJbmxpbmVSZWN0KElubGluZUxheW91dFVuaXQgdG9wLCBJbmxpbmVMYXlvdXRVbml0
IGxlZnQsIElubGluZUxheW91dFVuaXQgd2lkdGgsIElubGluZUxheW91dFVuaXQgaGVpZ2h0KTsK
LSAgICBJbmxpbmVSZWN0KGNvbnN0IElubGluZUxheW91dFBvaW50JiB0b3BMZWZ0LCBJbmxpbmVM
YXlvdXRVbml0IHdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCk7Ci0gICAgSW5saW5lUmVj
dChjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgdG9wTGVmdCwgY29uc3QgSW5saW5lTGF5b3V0U2l6
ZSYpOwotICAgIAotICAgIElubGluZUxheW91dFVuaXQgdG9wKCkgY29uc3Q7Ci0gICAgSW5saW5l
TGF5b3V0VW5pdCBsZWZ0KCkgY29uc3Q7Ci0gICAgSW5saW5lTGF5b3V0UG9pbnQgdG9wTGVmdCgp
IGNvbnN0OwotCi0gICAgSW5saW5lTGF5b3V0VW5pdCBib3R0b20oKSBjb25zdDsKLSAgICBJbmxp
bmVMYXlvdXRVbml0IHJpZ2h0KCkgY29uc3Q7ICAgICAgICAKLQotICAgIElubGluZUxheW91dFVu
aXQgd2lkdGgoKSBjb25zdDsKLSAgICBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCgpIGNvbnN0Owot
ICAgIElubGluZUxheW91dFNpemUgc2l6ZSgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRUb3AoSW5s
aW5lTGF5b3V0VW5pdCk7Ci0gICAgdm9pZCBzZXRCb3R0b20oSW5saW5lTGF5b3V0VW5pdCk7Ci0g
ICAgdm9pZCBzZXRMZWZ0KElubGluZUxheW91dFVuaXQpOwotICAgIHZvaWQgc2V0VG9wTGVmdChj
b25zdCBJbmxpbmVMYXlvdXRQb2ludCYpOwotICAgIHZvaWQgc2V0V2lkdGgoSW5saW5lTGF5b3V0
VW5pdCk7Ci0gICAgdm9pZCBzZXRIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCk7Ci0KLSAgICB2b2lk
IG1vdmVIb3Jpem9udGFsbHkoSW5saW5lTGF5b3V0VW5pdCk7Ci0gICAgdm9pZCBtb3ZlVmVydGlj
YWxseShJbmxpbmVMYXlvdXRVbml0KTsKLSAgICB2b2lkIG1vdmVCeShJbmxpbmVMYXlvdXRQb2lu
dCk7Ci0KLSAgICB2b2lkIGV4cGFuZChPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiwgT3B0aW9u
YWw8SW5saW5lTGF5b3V0VW5pdD4pOwotICAgIHZvaWQgZXhwYW5kVG9Db250YWluKGNvbnN0IElu
bGluZVJlY3QmKTsKLSAgICB2b2lkIGV4cGFuZEhvcml6b250YWxseShJbmxpbmVMYXlvdXRVbml0
IGRlbHRhKSB7IGV4cGFuZChkZWx0YSwgeyB9KTsgfQotICAgIHZvaWQgZXhwYW5kVmVydGljYWxs
eShJbmxpbmVMYXlvdXRVbml0IGRlbHRhKSB7IGV4cGFuZCh7IH0sIGRlbHRhKTsgfQotICAgIHZv
aWQgZXhwYW5kVmVydGljYWxseVRvQ29udGFpbihjb25zdCBJbmxpbmVSZWN0Jik7Ci0gICAgdm9p
ZCBpbmZsYXRlKElubGluZUxheW91dFVuaXQpOwotCi0gICAgb3BlcmF0b3IgSW5saW5lTGF5b3V0
UmVjdCgpIGNvbnN0OwotCi1wcml2YXRlOgotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAgdm9pZCBp
bnZhbGlkYXRlVG9wKCkgeyBtX2hhc1ZhbGlkVG9wID0gZmFsc2U7IH0KLSAgICB2b2lkIGludmFs
aWRhdGVMZWZ0KCkgeyBtX2hhc1ZhbGlkTGVmdCA9IGZhbHNlOyB9Ci0gICAgdm9pZCBpbnZhbGlk
YXRlV2lkdGgoKSB7IG1faGFzVmFsaWRXaWR0aCA9IGZhbHNlOyB9Ci0gICAgdm9pZCBpbnZhbGlk
YXRlSGVpZ2h0KCkgeyBtX2hhc1ZhbGlkSGVpZ2h0ID0gZmFsc2U7IH0KLSAgICB2b2lkIGludmFs
aWRhdGVQb3NpdGlvbigpOwotCi0gICAgYm9vbCBoYXNWYWxpZFBvc2l0aW9uKCkgY29uc3QgeyBy
ZXR1cm4gbV9oYXNWYWxpZFRvcCAmJiBtX2hhc1ZhbGlkTGVmdDsgfQotICAgIGJvb2wgaGFzVmFs
aWRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9oYXNWYWxpZFdpZHRoICYmIG1faGFzVmFsaWRIZWln
aHQ7IH0KLSAgICBib29sIGhhc1ZhbGlkR2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBoYXNWYWxp
ZFBvc2l0aW9uKCkgJiYgaGFzVmFsaWRTaXplKCk7IH0KLQotICAgIHZvaWQgc2V0SGFzVmFsaWRQ
b3NpdGlvbigpOwotICAgIHZvaWQgc2V0SGFzVmFsaWRTaXplKCk7Ci0KLSAgICBib29sIG1faGFz
VmFsaWRUb3AgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9oYXNWYWxpZExlZnQgeyBmYWxzZSB9Owot
ICAgIGJvb2wgbV9oYXNWYWxpZFdpZHRoIHsgZmFsc2UgfTsKLSAgICBib29sIG1faGFzVmFsaWRI
ZWlnaHQgeyBmYWxzZSB9OwotI2VuZGlmIC8vIEFTU0VSVF9FTkFCTEVECi0gICAgSW5saW5lTGF5
b3V0UmVjdCBtX3JlY3Q7Ci19OwotCi1pbmxpbmUgSW5saW5lUmVjdDo6SW5saW5lUmVjdChJbmxp
bmVMYXlvdXRVbml0IHRvcCwgSW5saW5lTGF5b3V0VW5pdCBsZWZ0LCBJbmxpbmVMYXlvdXRVbml0
IHdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCkKLSAgICA6IG1fcmVjdChsZWZ0LCB0b3As
IHdpZHRoLCBoZWlnaHQpCi17Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICBtX2hhc1ZhbGlkVG9w
ID0gdHJ1ZTsKLSAgICBtX2hhc1ZhbGlkTGVmdCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZFdpZHRo
ID0gdHJ1ZTsKLSAgICBtX2hhc1ZhbGlkSGVpZ2h0ID0gdHJ1ZTsKLSNlbmRpZgotfQotCi1pbmxp
bmUgSW5saW5lUmVjdDo6SW5saW5lUmVjdChjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgdG9wTGVm
dCwgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCwgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQpCi0gICAg
OiBJbmxpbmVSZWN0KHRvcExlZnQueSgpLCB0b3BMZWZ0LngoKSwgd2lkdGgsIGhlaWdodCkKLXsK
LX0KLQotaW5saW5lIElubGluZVJlY3Q6OklubGluZVJlY3QoY29uc3QgSW5saW5lTGF5b3V0UG9p
bnQmIHRvcExlZnQsIGNvbnN0IElubGluZUxheW91dFNpemUmIHNpemUpCi0gICAgOiBJbmxpbmVS
ZWN0KHRvcExlZnQueSgpLCB0b3BMZWZ0LngoKSwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgp
KQotewotfQotCi0jaWYgQVNTRVJUX0VOQUJMRUQKLWlubGluZSB2b2lkIElubGluZVJlY3Q6Omlu
dmFsaWRhdGVQb3NpdGlvbigpCi17Ci0gICAgaW52YWxpZGF0ZVRvcCgpOwotICAgIGludmFsaWRh
dGVMZWZ0KCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OnNldEhhc1ZhbGlkUG9zaXRp
b24oKQotewotICAgIG1faGFzVmFsaWRUb3AgPSB0cnVlOwotICAgIG1faGFzVmFsaWRMZWZ0ID0g
dHJ1ZTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0SGFzVmFsaWRTaXplKCkKLXsK
LSAgICBtX2hhc1ZhbGlkV2lkdGggPSB0cnVlOwotICAgIG1faGFzVmFsaWRIZWlnaHQgPSB0cnVl
OwotfQotI2VuZGlmIC8vIEFTU0VSVF9FTkFCTEVECi0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0
IElubGluZVJlY3Q6OnRvcCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRUb3ApOwot
ICAgIHJldHVybiBtX3JlY3QueSgpOwotfQotCi1pbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxp
bmVSZWN0OjpsZWZ0KCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZExlZnQpOwotICAg
IHJldHVybiBtX3JlY3QueCgpOwotfQotCi1pbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVS
ZWN0Ojpib3R0b20oKSBjb25zdAotewotICAgIEFTU0VSVChtX2hhc1ZhbGlkVG9wICYmIG1faGFz
VmFsaWRIZWlnaHQpOwotICAgIHJldHVybiBtX3JlY3QubWF4WSgpOwotfQotCi1pbmxpbmUgSW5s
aW5lTGF5b3V0VW5pdCBJbmxpbmVSZWN0OjpyaWdodCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1f
aGFzVmFsaWRMZWZ0ICYmIG1faGFzVmFsaWRXaWR0aCk7Ci0gICAgcmV0dXJuIG1fcmVjdC5tYXhY
KCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRQb2ludCBJbmxpbmVSZWN0Ojp0b3BMZWZ0KCkg
Y29uc3QKLXsKLSAgICBBU1NFUlQoaGFzVmFsaWRQb3NpdGlvbigpKTsKLSAgICByZXR1cm4gbV9y
ZWN0Lm1pblhNaW5ZQ29ybmVyKCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRTaXplIElubGlu
ZVJlY3Q6OnNpemUoKSBjb25zdAotewotICAgIEFTU0VSVChoYXNWYWxpZFNpemUoKSk7Ci0gICAg
cmV0dXJuIG1fcmVjdC5zaXplKCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0IElubGlu
ZVJlY3Q6OndpZHRoKCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZFdpZHRoKTsKLSAg
ICByZXR1cm4gbV9yZWN0LndpZHRoKCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0IElu
bGluZVJlY3Q6OmhlaWdodCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRIZWlnaHQp
OwotICAgIHJldHVybiBtX3JlY3QuaGVpZ2h0KCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJl
Y3Q6OnNldFRvcExlZnQoY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIHRvcExlZnQpCi17Ci0jaWYg
QVNTRVJUX0VOQUJMRUQKLSAgICBzZXRIYXNWYWxpZFBvc2l0aW9uKCk7Ci0jZW5kaWYKLSAgICBt
X3JlY3Quc2V0TG9jYXRpb24odG9wTGVmdCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6
OnNldFRvcChJbmxpbmVMYXlvdXRVbml0IHRvcCkKLXsKLSNpZiBBU1NFUlRfRU5BQkxFRAotICAg
IG1faGFzVmFsaWRUb3AgPSB0cnVlOwotI2VuZGlmCi0gICAgbV9yZWN0LnNldFkodG9wKTsKLX0K
LQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0Qm90dG9tKElubGluZUxheW91dFVuaXQgYm90
dG9tKQotewotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7Ci0g
ICAgbV9oYXNWYWxpZEhlaWdodCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX3JlY3Quc2hpZnRNYXhZ
RWRnZVRvKGJvdHRvbSk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OnNldExlZnQoSW5s
aW5lTGF5b3V0VW5pdCBsZWZ0KQotewotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAgbV9oYXNWYWxp
ZExlZnQgPSB0cnVlOwotI2VuZGlmCi0gICAgbV9yZWN0LnNldFgobGVmdCk7Ci19Ci0KLWlubGlu
ZSB2b2lkIElubGluZVJlY3Q6OnNldFdpZHRoKElubGluZUxheW91dFVuaXQgd2lkdGgpCi17Ci0j
aWYgQVNTRVJUX0VOQUJMRUQKLSAgICBtX2hhc1ZhbGlkV2lkdGggPSB0cnVlOwotI2VuZGlmCi0g
ICAgbV9yZWN0LnNldFdpZHRoKHdpZHRoKTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6
c2V0SGVpZ2h0KElubGluZUxheW91dFVuaXQgaGVpZ2h0KQotewotI2lmIEFTU0VSVF9FTkFCTEVE
Ci0gICAgbV9oYXNWYWxpZEhlaWdodCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX3JlY3Quc2V0SGVp
Z2h0KGhlaWdodCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6Om1vdmVIb3Jpem9udGFs
bHkoSW5saW5lTGF5b3V0VW5pdCBvZmZzZXQpCi17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRMZWZ0
KTsKLSAgICBtX3JlY3QubW92ZShJbmxpbmVMYXlvdXRTaXplIHsgb2Zmc2V0LCAwIH0pOwotfQot
Ci1pbmxpbmUgdm9pZCBJbmxpbmVSZWN0Ojptb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0
IG9mZnNldCkKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZFRvcCk7Ci0gICAgbV9yZWN0Lm1vdmUo
SW5saW5lTGF5b3V0U2l6ZSB7IDAsIG9mZnNldCB9KTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5l
UmVjdDo6bW92ZUJ5KElubGluZUxheW91dFBvaW50IG9mZnNldCkKLXsKLSAgICBBU1NFUlQobV9o
YXNWYWxpZFRvcCk7Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRMZWZ0KTsKLSAgICBtX3JlY3QubW92
ZUJ5KG9mZnNldCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OmV4cGFuZChPcHRpb25h
bDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gaGVp
Z2h0KQotewotICAgIEFTU0VSVCghd2lkdGggfHwgbV9oYXNWYWxpZFdpZHRoKTsKLSAgICBBU1NF
UlQoIWhlaWdodCB8fCBtX2hhc1ZhbGlkSGVpZ2h0KTsKLSAgICBtX3JlY3QuZXhwYW5kKHdpZHRo
LnZhbHVlT3IoMCksIGhlaWdodC52YWx1ZU9yKDApKTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5l
UmVjdDo6ZXhwYW5kVG9Db250YWluKGNvbnN0IElubGluZVJlY3QmIG90aGVyKQotewotI2lmIEFT
U0VSVF9FTkFCTEVECi0gICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZExl
ZnQgPSB0cnVlOwotICAgIG1faGFzVmFsaWRXaWR0aCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZEhl
aWdodCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX3JlY3QudW5pdGVFdmVuSWZFbXB0eShvdGhlcik7
Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OmV4cGFuZFZlcnRpY2FsbHlUb0NvbnRhaW4o
Y29uc3QgSW5saW5lUmVjdCYgb3RoZXIpCi17Ci0gICAgYXV0byBjb250YWluVG9wID0gc3RkOjpt
aW4odG9wKCksIG90aGVyLnRvcCgpKTsKLSAgICBhdXRvIGNvbnRhaW5Cb3R0b20gPSBzdGQ6Om1h
eChib3R0b20oKSwgb3RoZXIuYm90dG9tKCkpOwotICAgIHNldFRvcChjb250YWluVG9wKTsKLSAg
ICBzZXRCb3R0b20oY29udGFpbkJvdHRvbSk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6
OmluZmxhdGUoSW5saW5lTGF5b3V0VW5pdCBpbmZsYXRlKQotewotICAgIEFTU0VSVChoYXNWYWxp
ZEdlb21ldHJ5KCkpOwotICAgIG1fcmVjdC5pbmZsYXRlKGluZmxhdGUpOwotfQotCi1pbmxpbmUg
SW5saW5lUmVjdDo6b3BlcmF0b3IgSW5saW5lTGF5b3V0UmVjdCgpIGNvbnN0Ci17Ci0gICAgQVNT
RVJUKGhhc1ZhbGlkR2VvbWV0cnkoKSk7IAotICAgIHJldHVybiBtX3JlY3Q7Ci19Ci0KLX0KLX0K
LSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRp
bmcvSW5saW5lU29mdExpbmVCcmVha0l0ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxp
bmVmb3JtYXR0aW5nL0lubGluZVNvZnRMaW5lQnJlYWtJdGVtLmgKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDllYTA2ZmJjZGQxNzgyNDJiYWI1NDczYTk0YTEzYWMzMGJjNzk3MGIuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lU29mdExpbmVCcmVha0l0ZW0uaAorKysg
L2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
Ci0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0g
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQot
I2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiSW5saW5l
SXRlbS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xh
c3MgSW5saW5lU29mdExpbmVCcmVha0l0ZW0gOiBwdWJsaWMgSW5saW5lSXRlbSB7Ci1wdWJsaWM6
Ci0gICAgc3RhdGljIElubGluZVNvZnRMaW5lQnJlYWtJdGVtIGNyZWF0ZVNvZnRMaW5lQnJlYWtJ
dGVtKGNvbnN0IElubGluZVRleHRCb3gmLCB1bnNpZ25lZCBwb3NpdGlvbik7Ci0KLSAgICB1bnNp
Z25lZCBwb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRPclBvc2l0aW9uOyB9Ci0gICAg
Y29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25j
YXN0PElubGluZVRleHRCb3g+KGxheW91dEJveCgpKTsgfQotCi0gICAgSW5saW5lU29mdExpbmVC
cmVha0l0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHBvc2l0aW9uKTsKLX07Ci0K
LWlubGluZSBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbTo6
Y3JlYXRlU29mdExpbmVCcmVha0l0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJv
eCwgdW5zaWduZWQgcG9zaXRpb24pCi17Ci0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgcG9z
aXRpb24gfTsKLX0KLQotaW5saW5lIElubGluZVNvZnRMaW5lQnJlYWtJdGVtOjpJbmxpbmVTb2Z0
TGluZUJyZWFrSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25l
ZCBwb3NpdGlvbikKLSAgICA6IElubGluZUl0ZW0oaW5saW5lVGV4dEJveCwgVHlwZTo6U29mdExp
bmVCcmVhaykKLXsKLSAgICBtX3N0YXJ0T3JQb3NpdGlvbiA9IHBvc2l0aW9uOwotfQotCi19Ci19
Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfSU5MSU5FX0lURU0oSW5saW5lU29mdExpbmVCcmVh
a0l0ZW0sIGlzU29mdExpbmVCcmVhaygpKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmNwcApkZWxl
dGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3MzdhZjBiZGJhOTVhNWY0MDVlY2I0OTQ1ZmNj
ZDE5Y2Q4YmMzOS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVUZXh0SXRlbS5j
cHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykg
MjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0g
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRl
ICJjb25maWcuaCIKLSNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgotCi0jaWYgRU5BQkxFKExB
WU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgotI2lu
Y2x1ZGUgIklubGluZVNvZnRMaW5lQnJlYWtJdGVtLmgiCi0jaW5jbHVkZSAiVGV4dFV0aWwuaCIK
LSNpbmNsdWRlIDx3dGYvdW5pY29kZS9DaGFyYWN0ZXJOYW1lcy5oPgotCi1uYW1lc3BhY2UgV2Vi
Q29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotc3RhdGljX2Fzc2VydChzaXplb2YoSW5saW5l
SXRlbSkgPT0gc2l6ZW9mKElubGluZVRleHRJdGVtKSwgIiIpOwotCi1zdHJ1Y3QgV2hpdGVzcGFj
ZUNvbnRlbnQgewotICAgIHNpemVfdCBsZW5ndGggeyAwIH07Ci0gICAgYm9vbCBpc1dvcmRTZXBh
cmF0b3IgeyB0cnVlIH07Ci19Owotc3RhdGljIE9wdGlvbmFsPFdoaXRlc3BhY2VDb250ZW50PiBt
b3ZlVG9OZXh0Tm9uV2hpdGVzcGFjZVBvc2l0aW9uKGNvbnN0IFN0cmluZ1ZpZXcmIHRleHRDb250
ZW50LCBzaXplX3Qgc3RhcnRQb3NpdGlvbiwgYm9vbCBwcmVzZXJ2ZU5ld2xpbmUsIGJvb2wgcHJl
c2VydmVUYWIpCi17Ci0gICAgYXV0byBoYXNXb3JkU2VwYXJhdG9yQ2hhcmFjdGVyID0gZmFsc2U7
Ci0gICAgYXV0byBpc1doaXRlc3BhY2VDaGFyYWN0ZXIgPSBbJl0oYXV0byBjaGFyYWN0ZXIpIHsK
LSAgICAgICAgLy8gd2hpdGUgc3BhY2UgcHJvY2Vzc2luZyBpbiBDU1MgYWZmZWN0cyBvbmx5IHRo
ZSBkb2N1bWVudCB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzOiBzcGFjZXMgKFUrMDAyMCksIHRhYnMg
KFUrMDAwOSksIGFuZCBzZWdtZW50IGJyZWFrcy4KLSAgICAgICAgYXV0byBpc1RyZWF0ZWRBc1Nw
YWNlQ2hhcmFjdGVyID0gY2hhcmFjdGVyID09IHNwYWNlIHx8IChjaGFyYWN0ZXIgPT0gbmV3bGlu
ZUNoYXJhY3RlciAmJiAhcHJlc2VydmVOZXdsaW5lKSB8fCAoY2hhcmFjdGVyID09IHRhYkNoYXJh
Y3RlciAmJiAhcHJlc2VydmVUYWIpOwotICAgICAgICBoYXNXb3JkU2VwYXJhdG9yQ2hhcmFjdGVy
ID0gaGFzV29yZFNlcGFyYXRvckNoYXJhY3RlciB8fCBpc1RyZWF0ZWRBc1NwYWNlQ2hhcmFjdGVy
OwotICAgICAgICByZXR1cm4gaXNUcmVhdGVkQXNTcGFjZUNoYXJhY3RlciB8fCBjaGFyYWN0ZXIg
PT0gdGFiQ2hhcmFjdGVyOwotICAgIH07Ci0gICAgYXV0byBuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0
aW9uID0gc3RhcnRQb3NpdGlvbjsKLSAgICB3aGlsZSAobmV4dE5vbldoaXRlU3BhY2VQb3NpdGlv
biA8IHRleHRDb250ZW50Lmxlbmd0aCgpICYmIGlzV2hpdGVzcGFjZUNoYXJhY3Rlcih0ZXh0Q29u
dGVudFtuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uXSkpCi0gICAgICAgICsrbmV4dE5vbldoaXRl
U3BhY2VQb3NpdGlvbjsKLSAgICByZXR1cm4gbmV4dE5vbldoaXRlU3BhY2VQb3NpdGlvbiA9PSBz
dGFydFBvc2l0aW9uID8gV1RGOjpudWxsb3B0IDogbWFrZU9wdGlvbmFsKFdoaXRlc3BhY2VDb250
ZW50IHsgbmV4dE5vbldoaXRlU3BhY2VQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24sIGhhc1dvcmRT
ZXBhcmF0b3JDaGFyYWN0ZXIgfSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBtb3ZlVG9OZXh0QnJl
YWthYmxlUG9zaXRpb24odW5zaWduZWQgc3RhcnRQb3NpdGlvbiwgTGF6eUxpbmVCcmVha0l0ZXJh
dG9yJiBsaW5lQnJlYWtJdGVyYXRvciwgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKQotewotICAg
IGF1dG8gdGV4dExlbmd0aCA9IGxpbmVCcmVha0l0ZXJhdG9yLnN0cmluZ1ZpZXcoKS5sZW5ndGgo
KTsKLSAgICBhdXRvIHN0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb24gPSBzdGFy
dFBvc2l0aW9uOwotICAgIHdoaWxlIChzdGFydFBvc2l0aW9uRm9yTmV4dEJyZWFrYWJsZVBvc2l0
aW9uIDwgdGV4dExlbmd0aCkgewotICAgICAgICBhdXRvIG5leHRCcmVha2FibGVQb3NpdGlvbiA9
IFRleHRVdGlsOjpmaW5kTmV4dEJyZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCBz
dGFydFBvc2l0aW9uRm9yTmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBzdHlsZSk7Ci0gICAgICAgIC8v
IE9mdGVudGltZXMgdGhlIG5leHQgYnJlYWthYmxlIHBvc2l0aW9uIGNvbWVzIGJhY2sgYXMgdGhl
IHN0YXJ0IHBvc2l0aW9uIChtb3N0IG5vdGFibHkgaHlwaGVucykuCi0gICAgICAgIGlmIChuZXh0
QnJlYWthYmxlUG9zaXRpb24gIT0gc3RhcnRQb3NpdGlvbikKLSAgICAgICAgICAgIHJldHVybiBu
ZXh0QnJlYWthYmxlUG9zaXRpb24gLSBzdGFydFBvc2l0aW9uOwotICAgICAgICArK3N0YXJ0UG9z
aXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb247Ci0gICAgfQotICAgIHJldHVybiB0ZXh0TGVu
Z3RoIC0gc3RhcnRQb3NpdGlvbjsKLX0KLQotdm9pZCBJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlQW5k
QXBwZW5kVGV4dEl0ZW1zKElubGluZUl0ZW1zJiBpbmxpbmVDb250ZW50LCBjb25zdCBJbmxpbmVU
ZXh0Qm94JiBpbmxpbmVUZXh0Qm94KQotewotICAgIGF1dG8gdGV4dCA9IGlubGluZVRleHRCb3gu
Y29udGVudCgpOwotICAgIGlmICghdGV4dC5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIGlubGlu
ZUNvbnRlbnQuYXBwZW5kKElubGluZVRleHRJdGVtOjpjcmVhdGVFbXB0eUl0ZW0oaW5saW5lVGV4
dEJveCkpOwotCi0gICAgYXV0byYgc3R5bGUgPSBpbmxpbmVUZXh0Qm94LnN0eWxlKCk7Ci0gICAg
YXV0byYgZm9udCA9IHN0eWxlLmZvbnRDYXNjYWRlKCk7Ci0gICAgYXV0byB3aGl0ZXNwYWNlQ29u
dGVudElzVHJlYXRlZEFzU2luZ2xlU3BhY2UgPSAhVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3Bh
Y2VzQW5kVGFicyhpbmxpbmVUZXh0Qm94KTsKLSAgICBhdXRvIHNob3VsZFByZXNlcnZlTmV3bGlu
ZSA9IFRleHRVdGlsOjpzaG91bGRQcmVzZXJ2ZU5ld2xpbmUoaW5saW5lVGV4dEJveCk7Ci0gICAg
YXV0byBsaW5lQnJlYWtJdGVyYXRvciA9IExhenlMaW5lQnJlYWtJdGVyYXRvciB7IHRleHQsIHN0
eWxlLmNvbXB1dGVkTG9jYWxlKCksIFRleHRVdGlsOjpsaW5lQnJlYWtJdGVyYXRvck1vZGUoc3R5
bGUubGluZUJyZWFrKCkpIH07Ci0gICAgdW5zaWduZWQgY3VycmVudFBvc2l0aW9uID0gMDsKLQot
ICAgIGF1dG8gaW5saW5lSXRlbVdpZHRoID0gWyZdKGF1dG8gc3RhcnRQb3NpdGlvbiwgYXV0byBs
ZW5ndGgpIC0+IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsKLSAgICAgICAgaWYgKCFpbmxp
bmVUZXh0Qm94LmNhblVzZVNpbXBsaWZpZWRDb250ZW50TWVhc3VyaW5nKCkpCi0gICAgICAgICAg
ICByZXR1cm4geyB9OwotICAgICAgICByZXR1cm4gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRC
b3gsIHN0YXJ0UG9zaXRpb24sIHN0YXJ0UG9zaXRpb24gKyBsZW5ndGgsIHsgfSk7Ci0gICAgfTsK
LQotICAgIHdoaWxlIChjdXJyZW50UG9zaXRpb24gPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAg
IGF1dG8gaXNTZWdtZW50QnJlYWtDYW5kaWRhdGUgPSBbXShhdXRvIGNoYXJhY3RlcikgewotICAg
ICAgICAgICAgcmV0dXJuIGNoYXJhY3RlciA9PSAnXG4nOwotICAgICAgICB9OwotCi0gICAgICAg
IC8vIFNlZ21lbnQgYnJlYWtzIHdpdGggcHJlc2VydmUgbmV3IGxpbmUgc3R5bGUgKHdoaXRlLXNw
YWNlOiBwcmUsIHByZS13cmFwLCBicmVhay1zcGFjZXMgYW5kIHByZS1saW5lKSBjb21wdXRlIHRv
IGZvcmNlZCBsaW5lIGJyZWFrLgotICAgICAgICBpZiAoaXNTZWdtZW50QnJlYWtDYW5kaWRhdGUo
dGV4dFtjdXJyZW50UG9zaXRpb25dKSAmJiBzaG91bGRQcmVzZXJ2ZU5ld2xpbmUpIHsKLSAgICAg
ICAgICAgIGlubGluZUNvbnRlbnQuYXBwZW5kKElubGluZVNvZnRMaW5lQnJlYWtJdGVtOjpjcmVh
dGVTb2Z0TGluZUJyZWFrSXRlbShpbmxpbmVUZXh0Qm94LCBjdXJyZW50UG9zaXRpb24pKTsKLSAg
ICAgICAgICAgICsrY3VycmVudFBvc2l0aW9uOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgIH0KLQotICAgICAgICBpZiAoYXV0byB3aGl0ZXNwYWNlQ29udGVudCA9IG1vdmVUb05leHRO
b25XaGl0ZXNwYWNlUG9zaXRpb24odGV4dCwgY3VycmVudFBvc2l0aW9uLCBzaG91bGRQcmVzZXJ2
ZU5ld2xpbmUsICF3aGl0ZXNwYWNlQ29udGVudElzVHJlYXRlZEFzU2luZ2xlU3BhY2UpKSB7Ci0g
ICAgICAgICAgICBBU1NFUlQod2hpdGVzcGFjZUNvbnRlbnQtPmxlbmd0aCk7Ci0gICAgICAgICAg
ICBhdXRvIGFwcGVuZFdoaXRlc3BhY2VJdGVtID0gWyZdIChhdXRvIHN0YXJ0UG9zaXRpb24sIGF1
dG8gaXRlbUxlbmd0aCkgewotICAgICAgICAgICAgICAgIGF1dG8gc2ltcGxlU2luZ2xlV2hpdGVz
cGFjZUNvbnRlbnQgPSBpbmxpbmVUZXh0Qm94LmNhblVzZVNpbXBsaWZpZWRDb250ZW50TWVhc3Vy
aW5nKCkgJiYgKGl0ZW1MZW5ndGggPT0gMSB8fCB3aGl0ZXNwYWNlQ29udGVudElzVHJlYXRlZEFz
U2luZ2xlU3BhY2UpOwotICAgICAgICAgICAgICAgIGF1dG8gd2lkdGggPSBzaW1wbGVTaW5nbGVX
aGl0ZXNwYWNlQ29udGVudCA/IG1ha2VPcHRpb25hbChJbmxpbmVMYXlvdXRVbml0IHsgZm9udC5z
cGFjZVdpZHRoKCkgfSkgOiBpbmxpbmVJdGVtV2lkdGgoc3RhcnRQb3NpdGlvbiwgaXRlbUxlbmd0
aCk7Ci0gICAgICAgICAgICAgICAgaW5saW5lQ29udGVudC5hcHBlbmQoSW5saW5lVGV4dEl0ZW06
OmNyZWF0ZVdoaXRlc3BhY2VJdGVtKGlubGluZVRleHRCb3gsIHN0YXJ0UG9zaXRpb24sIGl0ZW1M
ZW5ndGgsIHdoaXRlc3BhY2VDb250ZW50LT5pc1dvcmRTZXBhcmF0b3IsIHdpZHRoKSk7Ci0gICAg
ICAgICAgICB9OwotICAgICAgICAgICAgaWYgKHN0eWxlLndoaXRlU3BhY2UoKSA9PSBXaGl0ZVNw
YWNlOjpCcmVha1NwYWNlcykgewotICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9y
Zy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1waGFzZS0xCi0gICAgICAgICAgICAgICAgLy8g
Rm9yIGJyZWFrLXNwYWNlcywgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgZXhpc3RzIGFmdGVyIGV2
ZXJ5IHNwYWNlIGFuZCBldmVyeSB0YWIuCi0gICAgICAgICAgICAgICAgLy8gRklYTUU6IGlmIHRo
aXMgdHVybnMgb3V0IHRvIGJlIGEgcGVyZiBoaXQgd2l0aCB0b28gbWFueSBpbmRpdmlkdWFsIHdo
aXRlc3BhY2UgaW5saW5lIGl0ZW1zLCB3ZSBzaG91bGQgdHJhbnNpdGlvbiB0aGlzIGxvZ2ljIHRv
IGxpbmUgYnJlYWtpbmcuCi0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3
aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoOyArK2kpCi0gICAgICAgICAgICAgICAgICAgIGFwcGVu
ZFdoaXRlc3BhY2VJdGVtKGN1cnJlbnRQb3NpdGlvbiArIGksIDEpOwotICAgICAgICAgICAgfSBl
bHNlCi0gICAgICAgICAgICAgICAgYXBwZW5kV2hpdGVzcGFjZUl0ZW0oY3VycmVudFBvc2l0aW9u
LCB3aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoKTsKLSAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlv
biArPSB3aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoOwotICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgIH0KLQotICAgICAgICBhdXRvIGhhc1RyYWlsaW5nU29mdEh5cGhlbiA9IGZhbHNlOwot
ICAgICAgICBhdXRvIGluaXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRpb24gPSBjdXJyZW50UG9zaXRp
b247Ci0gICAgICAgIGF1dG8gaXNBdFNvZnRIeXBoZW4gPSBbJl0oYXV0byBwb3NpdGlvbikgewot
ICAgICAgICAgICAgcmV0dXJuIHRleHRbcG9zaXRpb25dID09IHNvZnRIeXBoZW47Ci0gICAgICAg
IH07Ci0gICAgICAgIGlmIChzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVuczo6Tm9uZSkgewotICAg
ICAgICAgICAgLy8gTGV0J3MgbWVyZ2UgY2FuZGlkYXRlIElubGluZVRleHRJdGVtcyBzZXBhcmF0
ZWQgYnkgc29mdCBoeXBoZW4gd2hlbiB0aGUgc3R5bGUgc2F5cyBzby4KLSAgICAgICAgICAgIHdo
aWxlIChjdXJyZW50UG9zaXRpb24gPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAg
YXV0byBub25XaGl0ZVNwYWNlTGVuZ3RoID0gbW92ZVRvTmV4dEJyZWFrYWJsZVBvc2l0aW9uKGN1
cnJlbnRQb3NpdGlvbiwgbGluZUJyZWFrSXRlcmF0b3IsIHN0eWxlKTsKLSAgICAgICAgICAgICAg
ICBBU1NFUlQobm9uV2hpdGVTcGFjZUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgY3VycmVudFBv
c2l0aW9uICs9IG5vbldoaXRlU3BhY2VMZW5ndGg7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0F0
U29mdEh5cGhlbihjdXJyZW50UG9zaXRpb24gLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdXRvIG5v
bldoaXRlU3BhY2VMZW5ndGggPSBtb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24oaW5pdGlhbE5v
bldoaXRlc3BhY2VQb3NpdGlvbiwgbGluZUJyZWFrSXRlcmF0b3IsIHN0eWxlKTsKLSAgICAgICAg
ICAgIEFTU0VSVChub25XaGl0ZVNwYWNlTGVuZ3RoKTsKLSAgICAgICAgICAgIGN1cnJlbnRQb3Np
dGlvbiArPSBub25XaGl0ZVNwYWNlTGVuZ3RoOwotICAgICAgICAgICAgaGFzVHJhaWxpbmdTb2Z0
SHlwaGVuID0gaXNBdFNvZnRIeXBoZW4oY3VycmVudFBvc2l0aW9uIC0gMSk7Ci0gICAgICAgIH0K
LSAgICAgICAgQVNTRVJUKGluaXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRpb24gPCBjdXJyZW50UG9z
aXRpb24pOwotICAgICAgICBBU1NFUlRfSU1QTElFUyhzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVu
czo6Tm9uZSwgIWhhc1RyYWlsaW5nU29mdEh5cGhlbik7Ci0gICAgICAgIGF1dG8gbGVuZ3RoID0g
Y3VycmVudFBvc2l0aW9uIC0gaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbjsKLSAgICAgICAg
aW5saW5lQ29udGVudC5hcHBlbmQoSW5saW5lVGV4dEl0ZW06OmNyZWF0ZU5vbldoaXRlc3BhY2VJ
dGVtKGlubGluZVRleHRCb3gsIGluaXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRpb24sIGxlbmd0aCwg
aGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBpbmxpbmVJdGVtV2lkdGgoaW5pdGlhbE5vbldoaXRlc3Bh
Y2VQb3NpdGlvbiwgbGVuZ3RoKSkpOwotICAgIH0KLX0KLQotYm9vbCBJbmxpbmVUZXh0SXRlbTo6
aXNFbXB0eUNvbnRlbnQoKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sg
Zm9yIG1vcmUgemVybyB3aWR0aCBjb250ZW50IGFuZCBub3QganVzdCBVKzIwMEIuCi0gICAgcmV0
dXJuICFtX2xlbmd0aCB8fCAobV9sZW5ndGggPT0gMSAmJiBpbmxpbmVUZXh0Qm94KCkuY29udGVu
dCgpW3N0YXJ0KCldID09IHplcm9XaWR0aFNwYWNlKTsgCi19Ci0KLWJvb2wgSW5saW5lVGV4dEl0
ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhjb25zdCBJbmxpbmVUZXh0SXRlbSYgaW5s
aW5lVGV4dEl0ZW0pCi17Ci0gICAgQVNTRVJUKGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgp
KTsKLSAgICByZXR1cm4gVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxp
bmVUZXh0SXRlbS5sYXlvdXRCb3goKSk7Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uaCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmgK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGM5OGRjZjA2YTE5YWEwNWZjNGFhMGFh
MjRkOTgzYTViN2NkMTUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0
ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
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
ZGUgIklubGluZUl0ZW0uaCIKLSNpbmNsdWRlICJMYXlvdXRJbmxpbmVUZXh0Qm94LmgiCi0KLW5h
bWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi11c2luZyBJbmxpbmVJdGVt
cyA9IFZlY3RvcjxJbmxpbmVJdGVtPjsKLQotY2xhc3MgSW5saW5lVGV4dEl0ZW0gOiBwdWJsaWMg
SW5saW5lSXRlbSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgY3JlYXRlQW5kQXBwZW5kVGV4
dEl0ZW1zKElubGluZUl0ZW1zJiwgY29uc3QgSW5saW5lVGV4dEJveCYpOwotCi0gICAgdW5zaWdu
ZWQgc3RhcnQoKSBjb25zdCB7IHJldHVybiBtX3N0YXJ0T3JQb3NpdGlvbjsgfQotICAgIHVuc2ln
bmVkIGVuZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0KCkgKyBsZW5ndGgoKTsgfQotICAgIHVuc2ln
bmVkIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbGVuZ3RoOyB9Ci0KLSAgICBib29sIGlzV2hp
dGVzcGFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGV4dEl0ZW1UeXBlID09IFRleHRJdGVtVHlwZTo6
V2hpdGVzcGFjZTsgfQotICAgIGJvb2wgaXNXb3JkU2VwYXJhdG9yKCkgY29uc3QgeyByZXR1cm4g
bV9pc1dvcmRTZXBhcmF0b3I7IH0KLSAgICBib29sIGhhc1RyYWlsaW5nU29mdEh5cGhlbigpIGNv
bnN0IHsgcmV0dXJuIG1faGFzVHJhaWxpbmdTb2Z0SHlwaGVuOyB9Ci0gICAgT3B0aW9uYWw8SW5s
aW5lTGF5b3V0VW5pdD4gd2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2hhc1dpZHRoID8gbWFrZU9w
dGlvbmFsKG1fd2lkdGgpIDogT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geyB9OyB9Ci0gICAg
Ym9vbCBpc0VtcHR5Q29udGVudCgpIGNvbnN0OwotCi0gICAgY29uc3QgSW5saW5lVGV4dEJveCYg
aW5saW5lVGV4dEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PElubGluZVRleHRCb3g+KGxh
eW91dEJveCgpKTsgfQotCi0gICAgSW5saW5lVGV4dEl0ZW0gbGVmdCh1bnNpZ25lZCBsZW5ndGgp
IGNvbnN0OwotICAgIElubGluZVRleHRJdGVtIHJpZ2h0KHVuc2lnbmVkIGxlbmd0aCkgY29uc3Q7
Ci0KLSAgICBzdGF0aWMgYm9vbCBzaG91bGRQcmVzZXJ2ZVNwYWNlc0FuZFRhYnMoY29uc3QgSW5s
aW5lVGV4dEl0ZW0mKTsKLQotcHJpdmF0ZToKLSAgICB1c2luZyBJbmxpbmVJdGVtOjpUZXh0SXRl
bVR5cGU7Ci0KLSAgICBJbmxpbmVUZXh0SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWdu
ZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIGJv
b2wgaXNXb3JkU2VwYXJhdG9yLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCwgVGV4
dEl0ZW1UeXBlKTsKLSAgICBleHBsaWNpdCBJbmxpbmVUZXh0SXRlbShjb25zdCBJbmxpbmVUZXh0
Qm94Jik7Ci0KLSAgICBzdGF0aWMgSW5saW5lVGV4dEl0ZW0gY3JlYXRlV2hpdGVzcGFjZUl0ZW0o
Y29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJv
b2wgaXNXb3JkU2VwYXJhdG9yLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCk7Ci0g
ICAgc3RhdGljIElubGluZVRleHRJdGVtIGNyZWF0ZU5vbldoaXRlc3BhY2VJdGVtKGNvbnN0IElu
bGluZVRleHRCb3gmLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGhhc1Ry
YWlsaW5nU29mdEh5cGhlbiwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgpOwotICAg
IHN0YXRpYyBJbmxpbmVUZXh0SXRlbSBjcmVhdGVFbXB0eUl0ZW0oY29uc3QgSW5saW5lVGV4dEJv
eCYpOwotfTsKLQotaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpjcmVhdGVX
aGl0ZXNwYWNlSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25l
ZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGlzV29yZFNlcGFyYXRvciwgT3B0aW9uYWw8
SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgpCi17Ci0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwg
c3RhcnQsIGxlbmd0aCwgZmFsc2UsIGlzV29yZFNlcGFyYXRvciwgd2lkdGgsIFRleHRJdGVtVHlw
ZTo6V2hpdGVzcGFjZSB9OwotfQotCi1pbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5saW5lVGV4dEl0
ZW06OmNyZWF0ZU5vbldoaXRlc3BhY2VJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRl
eHRCb3gsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wgaGFzVHJhaWxpbmdT
b2Z0SHlwaGVuLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCkKLXsKLSAgICAvLyBG
SVhNRTogVXNlIHRoZSBmb2xsb3dpbmcgbGlzdCBvZiBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJz
IHRvIHNldCB0aGUgImlzV29yZFNlcGFyYXRvciIgYml0OiBub0JyZWFrU3BhY2UsIGV0aGlvcGlj
V29yZHNwYWNlLCBhZWdlYW5Xb3JkU2VwYXJhdG9yTGluZSBhZWdlYW5Xb3JkU2VwYXJhdG9yRG90
IHVnYXJpdGljV29yZERpdmlkZXIuCi0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgc3RhcnQs
IGxlbmd0aCwgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBmYWxzZSwgd2lkdGgsIFRleHRJdGVtVHlw
ZTo6Tm9uV2hpdGVzcGFjZSB9OwotfQotCi1pbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5saW5lVGV4
dEl0ZW06OmNyZWF0ZUVtcHR5SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94
KQotewotICAgIHJldHVybiBJbmxpbmVUZXh0SXRlbSB7IGlubGluZVRleHRCb3ggfTsKLX0KLQot
aW5saW5lIElubGluZVRleHRJdGVtOjpJbmxpbmVUZXh0SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94
JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGhh
c1RyYWlsaW5nU29mdEh5cGhlbiwgYm9vbCBpc1dvcmRTZXBhcmF0b3IsIE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+IHdpZHRoLCBUZXh0SXRlbVR5cGUgdGV4dEl0ZW1UeXBlKQotICAgIDogSW5s
aW5lSXRlbShpbmxpbmVUZXh0Qm94LCBUeXBlOjpUZXh0KQotewotICAgIG1fc3RhcnRPclBvc2l0
aW9uID0gc3RhcnQ7Ci0gICAgbV9sZW5ndGggPSBsZW5ndGg7Ci0gICAgbV9oYXNXaWR0aCA9ICEh
d2lkdGg7Ci0gICAgbV9oYXNUcmFpbGluZ1NvZnRIeXBoZW4gPSBoYXNUcmFpbGluZ1NvZnRIeXBo
ZW47Ci0gICAgbV9pc1dvcmRTZXBhcmF0b3IgPSBpc1dvcmRTZXBhcmF0b3I7Ci0gICAgbV93aWR0
aCA9IHdpZHRoLnZhbHVlT3IoMCk7Ci0gICAgbV90ZXh0SXRlbVR5cGUgPSB0ZXh0SXRlbVR5cGU7
Ci19Ci0KLWlubGluZSBJbmxpbmVUZXh0SXRlbTo6SW5saW5lVGV4dEl0ZW0oY29uc3QgSW5saW5l
VGV4dEJveCYgaW5saW5lVGV4dEJveCkKLSAgICA6IElubGluZUl0ZW0oaW5saW5lVGV4dEJveCwg
VHlwZTo6VGV4dCkKLXsKLX0KLQotaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVt
OjpsZWZ0KHVuc2lnbmVkIGxlbmd0aCkgY29uc3QKLXsKLSAgICBSRUxFQVNFX0FTU0VSVChsZW5n
dGggPD0gdGhpcy0+bGVuZ3RoKCkpOwotICAgIEFTU0VSVChtX3RleHRJdGVtVHlwZSAhPSBUZXh0
SXRlbVR5cGU6OlVuZGVmaW5lZCk7Ci0gICAgQVNTRVJUKGxlbmd0aCk7Ci0gICAgcmV0dXJuIHsg
aW5saW5lVGV4dEJveCgpLCBzdGFydCgpLCBsZW5ndGgsIGZhbHNlLCBpc1dvcmRTZXBhcmF0b3Io
KSwgV1RGOjpudWxsb3B0LCBtX3RleHRJdGVtVHlwZSB9OwotfQotCi1pbmxpbmUgSW5saW5lVGV4
dEl0ZW0gSW5saW5lVGV4dEl0ZW06OnJpZ2h0KHVuc2lnbmVkIGxlbmd0aCkgY29uc3QKLXsKLSAg
ICBSRUxFQVNFX0FTU0VSVChsZW5ndGggPD0gdGhpcy0+bGVuZ3RoKCkpOwotICAgIEFTU0VSVCht
X3RleHRJdGVtVHlwZSAhPSBUZXh0SXRlbVR5cGU6OlVuZGVmaW5lZCk7Ci0gICAgQVNTRVJUKGxl
bmd0aCk7Ci0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCgpLCBlbmQoKSAtIGxlbmd0aCwgbGVu
Z3RoLCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4oKSwgaXNXb3JkU2VwYXJhdG9yKCksIFdURjo6bnVs
bG9wdCwgbV90ZXh0SXRlbVR5cGUgfTsKLX0KLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJB
SVRTX0lOTElORV9JVEVNKElubGluZVRleHRJdGVtLCBpc1RleHQoKSkKLQotI2VuZGlmCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRV
dGlsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4
dFV0aWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTU3NWJjZTcyODUzYThj
OWRiZjM2MmY0ZmM5YjE5OTc2YWIyNTIwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3Rl
eHQvVGV4dFV0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgot
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
LSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGV4dFV0aWwuaCIKLQotI2lmIEVO
QUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQnJlYWtMaW5lcy5o
IgotI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCi0jaW5jbHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIK
LSNpbmNsdWRlICJMYXlvdXRJbmxpbmVUZXh0Qm94LmgiCi0jaW5jbHVkZSAiUmVuZGVyQm94Lmgi
Ci0jaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNw
YWNlIExheW91dCB7Ci0KLUlubGluZUxheW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElu
bGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9n
aWNhbExlZnQpCi17Ci0gICAgcmV0dXJuIFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwg
aW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwgaW5saW5lVGV4dEl0ZW0uZW5kKCksIGNvbnRlbnRMb2dp
Y2FsTGVmdCk7Ci19Ci0KLUlubGluZUxheW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElu
bGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8s
IElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KQotewotICAgIFJFTEVBU0VfQVNT
RVJUKGZyb20gPj0gaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSk7Ci0gICAgUkVMRUFTRV9BU1NFUlQo
dG8gPD0gaW5saW5lVGV4dEl0ZW0uZW5kKCkpOwotICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1do
aXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFi
cyhpbmxpbmVUZXh0SXRlbSkpIHsKLSAgICAgICAgYXV0byBzcGFjZVdpZHRoID0gaW5saW5lVGV4
dEl0ZW0uc3R5bGUoKS5mb250Q2FzY2FkZSgpLnNwYWNlV2lkdGgoKTsKLSAgICAgICAgcmV0dXJu
IHN0ZDo6aXNuYW4oc3BhY2VXaWR0aCkgPyAwLjBmIDogc3RkOjppc2luZihzcGFjZVdpZHRoKSA/
IG1heElubGluZUxheW91dFVuaXQoKSA6IHNwYWNlV2lkdGg7Ci0gICAgfQotICAgIHJldHVybiBU
ZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpLCBmcm9tLCB0bywg
Y29udGVudExvZ2ljYWxMZWZ0KTsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBUZXh0VXRpbDo6d2lk
dGgoY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgZnJvbSwgdW5z
aWduZWQgdG8sIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KQotewotICAgIGlm
IChmcm9tID09IHRvKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGF1dG8mIHN0eWxlID0gaW5s
aW5lVGV4dEJveC5zdHlsZSgpOwotICAgIGF1dG8mIGZvbnQgPSBzdHlsZS5mb250Q2FzY2FkZSgp
OwotICAgIGF1dG8gdGV4dCA9IGlubGluZVRleHRCb3guY29udGVudCgpOwotICAgIEFTU0VSVCh0
byA8PSB0ZXh0Lmxlbmd0aCgpKTsKLSAgICBhdXRvIGhhc0tlcm5pbmdPckxpZ2F0dXJlcyA9IGZv
bnQuZW5hYmxlS2VybmluZygpIHx8IGZvbnQucmVxdWlyZXNTaGFwaW5nKCk7Ci0gICAgYXV0byBt
ZWFzdXJlV2l0aEVuZFNwYWNlID0gaGFzS2VybmluZ09yTGlnYXR1cmVzICYmIHRvIDwgdGV4dC5s
ZW5ndGgoKSAmJiB0ZXh0W3RvXSA9PSAnICc7Ci0gICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2Up
Ci0gICAgICAgICsrdG87Ci0gICAgZmxvYXQgd2lkdGggPSAwOwotICAgIGlmIChpbmxpbmVUZXh0
Qm94LmNhblVzZVNpbXBsaWZpZWRDb250ZW50TWVhc3VyaW5nKCkpCi0gICAgICAgIHdpZHRoID0g
Zm9udC53aWR0aEZvclNpbXBsZVRleHQoU3RyaW5nVmlldyh0ZXh0KS5zdWJzdHJpbmcoZnJvbSwg
dG8gLSBmcm9tKSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF1dG8gdGFiV2lkdGggPSBzdHlsZS5j
b2xsYXBzZVdoaXRlU3BhY2UoKSA/IFRhYlNpemUoMCkgOiBzdHlsZS50YWJTaXplKCk7Ci0gICAg
ICAgIFdlYkNvcmU6OlRleHRSdW4gcnVuKFN0cmluZ1ZpZXcodGV4dCkuc3Vic3RyaW5nKGZyb20s
IHRvIC0gZnJvbSksIGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0gICAgICAgIGlmICh0YWJXaWR0aCkK
LSAgICAgICAgICAgIHJ1bi5zZXRUYWJTaXplKHRydWUsIHRhYldpZHRoKTsKLSAgICAgICAgd2lk
dGggPSBmb250LndpZHRoKHJ1bik7Ci0gICAgfQotCi0gICAgaWYgKG1lYXN1cmVXaXRoRW5kU3Bh
Y2UpCi0gICAgICAgIHdpZHRoIC09IChmb250LnNwYWNlV2lkdGgoKSArIGZvbnQud29yZFNwYWNp
bmcoKSk7Ci0KLSAgICByZXR1cm4gc3RkOjppc25hbih3aWR0aCkgPyAwLjBmIDogc3RkOjppc2lu
Zih3aWR0aCkgPyBtYXhJbmxpbmVMYXlvdXRVbml0KCkgOiB3aWR0aDsKLX0KLQotVGV4dFV0aWw6
OlNwbGl0RGF0YSBUZXh0VXRpbDo6c3BsaXQoY29uc3QgSW5saW5lVGV4dEl0ZW0mIGlubGluZVRl
eHRJdGVtLCBJbmxpbmVMYXlvdXRVbml0IHRleHRXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBhdmFp
bGFibGVXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpCi17Ci0gICAg
QVNTRVJUKGF2YWlsYWJsZVdpZHRoID49IDApOwotICAgIGF1dG8gc3RhcnRQb3NpdGlvbiA9IGlu
bGluZVRleHRJdGVtLnN0YXJ0KCk7Ci0gICAgYXV0byBsZW5ndGggPSBpbmxpbmVUZXh0SXRlbS5s
ZW5ndGgoKTsKLSAgICBBU1NFUlQobGVuZ3RoKTsKLQotICAgIGF1dG8gbGVmdCA9IHN0YXJ0UG9z
aXRpb247Ci0gICAgLy8gUGF0aG9sb2dpY2FsIGNhc2Ugb2YgKGV4dHJlbWVseSlsb25nIHN0cmlu
ZyBhbmQgbmFycm93IGxpbmVzLgotICAgIC8vIEFkanVzdCB0aGUgcmFuZ2Ugc28gdGhhdCB3ZSBj
YW4gcGljayBhIHJlYXNvbmFibGUgbWlkcG9pbnQuCi0gICAgSW5saW5lTGF5b3V0VW5pdCBhdmVy
YWdlQ2hhcmFjdGVyV2lkdGggPSB0ZXh0V2lkdGggLyBsZW5ndGg7Ci0gICAgdW5zaWduZWQgb2Zm
c2V0ID0gdG9MYXlvdXRVbml0KDIgKiBhdmFpbGFibGVXaWR0aCAvIGF2ZXJhZ2VDaGFyYWN0ZXJX
aWR0aCkudG9VbnNpZ25lZCgpOwotICAgIGF1dG8gcmlnaHQgPSBzdGQ6Om1pbjx1bnNpZ25lZD4o
bGVmdCArIG9mZnNldCwgKHN0YXJ0UG9zaXRpb24gKyBsZW5ndGggLSAxKSk7Ci0gICAgLy8gUHJl
c2VydmUgdGhlIGxlZnQgd2lkdGggZm9yIHRoZSBmaW5hbCBzcGxpdCBwb3NpdGlvbiBzbyB0aGF0
IHdlIGRvbid0IG5lZWQgdG8gcmVtZWFzdXJlIHRoZSBsZWZ0IHNpZGUgYWdhaW4uCi0gICAgSW5s
aW5lTGF5b3V0VW5pdCBsZWZ0U2lkZVdpZHRoID0gMDsKLSAgICB3aGlsZSAobGVmdCA8IHJpZ2h0
KSB7Ci0gICAgICAgIGF1dG8gbWlkZGxlID0gKGxlZnQgKyByaWdodCkgLyAyOwotICAgICAgICBh
dXRvIHdpZHRoID0gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRJdGVtLCBzdGFydFBvc2l0aW9u
LCBtaWRkbGUgKyAxLCBjb250ZW50TG9naWNhbExlZnQpOwotICAgICAgICBpZiAod2lkdGggPCBh
dmFpbGFibGVXaWR0aCkgewotICAgICAgICAgICAgbGVmdCA9IG1pZGRsZSArIDE7Ci0gICAgICAg
ICAgICBsZWZ0U2lkZVdpZHRoID0gd2lkdGg7Ci0gICAgICAgIH0gZWxzZSBpZiAod2lkdGggPiBh
dmFpbGFibGVXaWR0aCkKLSAgICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlOwotICAgICAgICBlbHNl
IHsKLSAgICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlICsgMTsKLSAgICAgICAgICAgIGxlZnRTaWRl
V2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAg
IHJldHVybiB7IHN0YXJ0UG9zaXRpb24sIHJpZ2h0IC0gc3RhcnRQb3NpdGlvbiwgbGVmdFNpZGVX
aWR0aCB9OwotfQotCi11bnNpZ25lZCBUZXh0VXRpbDo6ZmluZE5leHRCcmVha2FibGVQb3NpdGlv
bihMYXp5TGluZUJyZWFrSXRlcmF0b3ImIGxpbmVCcmVha0l0ZXJhdG9yLCB1bnNpZ25lZCBzdGFy
dFBvc2l0aW9uLCBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUpCi17Ci0gICAgYXV0byBrZWVwQWxs
V29yZHNGb3JDSksgPSBzdHlsZS53b3JkQnJlYWsoKSA9PSBXb3JkQnJlYWs6OktlZXBBbGw7Ci0g
ICAgYXV0byBicmVha05CU1AgPSBzdHlsZS5hdXRvV3JhcCgpICYmIHN0eWxlLm5ic3BNb2RlKCkg
PT0gTkJTUE1vZGU6OlNwYWNlOwotCi0gICAgaWYgKGtlZXBBbGxXb3Jkc0ZvckNKSykgewotICAg
ICAgICBpZiAoYnJlYWtOQlNQKQotICAgICAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3Np
dGlvbktlZXBpbmdBbGxXb3JkcyhsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Ci0g
ICAgICAgIHJldHVybiBuZXh0QnJlYWthYmxlUG9zaXRpb25LZWVwaW5nQWxsV29yZHNJZ25vcmlu
Z05CU1AobGluZUJyZWFrSXRlcmF0b3IsIHN0YXJ0UG9zaXRpb24pOwotICAgIH0KLQotICAgIGlm
IChsaW5lQnJlYWtJdGVyYXRvci5tb2RlKCkgPT0gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpEZWZh
dWx0KSB7Ci0gICAgICAgIGlmIChicmVha05CU1ApCi0gICAgICAgICAgICByZXR1cm4gV2ViQ29y
ZTo6bmV4dEJyZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9u
KTsKLSAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbklnbm9yaW5nTkJTUChsaW5l
QnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Ci0gICAgfQotCi0gICAgaWYgKGJyZWFrTkJT
UCkKLSAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbldpdGhvdXRTaG9ydGN1dChs
aW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Ci0gICAgcmV0dXJuIG5leHRCcmVha2Fi
bGVQb3NpdGlvbklnbm9yaW5nTkJTUFdpdGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJdGVyYXRvciwg
c3RhcnRQb3NpdGlvbik7Ci19Ci0KLWJvb2wgVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2Vz
QW5kVGFicyhjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICAvLyBodHRwczovL3d3dy53My5v
cmcvVFIvY3NzLXRleHQtMy8jd2hpdGUtc3BhY2UtcHJvcGVydHkKLSAgICBhdXRvIHdoaXRlc3Bh
Y2UgPSBsYXlvdXRCb3guc3R5bGUoKS53aGl0ZVNwYWNlKCk7Ci0gICAgcmV0dXJuIHdoaXRlc3Bh
Y2UgPT0gV2hpdGVTcGFjZTo6UHJlIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlV3Jh
cCB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OkJyZWFrU3BhY2VzOwotfQotCi1ib29sIFRl
eHRVdGlsOjpzaG91bGRQcmVzZXJ2ZU5ld2xpbmUoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0g
ICAgYXV0byB3aGl0ZXNwYWNlID0gbGF5b3V0Qm94LnN0eWxlKCkud2hpdGVTcGFjZSgpOwotICAg
IC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0
eQotICAgIHJldHVybiB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZSB8fCB3aGl0ZXNwYWNl
ID09IFdoaXRlU3BhY2U6OlByZVdyYXAgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpCcmVh
a1NwYWNlcyB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZUxpbmU7IAotfQotCi1MaW5l
QnJlYWtJdGVyYXRvck1vZGUgVGV4dFV0aWw6OmxpbmVCcmVha0l0ZXJhdG9yTW9kZShMaW5lQnJl
YWsgbGluZUJyZWFrKQotewotICAgIHN3aXRjaCAobGluZUJyZWFrKSB7Ci0gICAgY2FzZSBMaW5l
QnJlYWs6OkF1dG86Ci0gICAgY2FzZSBMaW5lQnJlYWs6OkFmdGVyV2hpdGVTcGFjZToKLSAgICBj
YXNlIExpbmVCcmVhazo6QW55d2hlcmU6Ci0gICAgICAgIHJldHVybiBMaW5lQnJlYWtJdGVyYXRv
ck1vZGU6OkRlZmF1bHQ7Ci0gICAgY2FzZSBMaW5lQnJlYWs6Okxvb3NlOgotICAgICAgICByZXR1
cm4gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpMb29zZTsKLSAgICBjYXNlIExpbmVCcmVhazo6Tm9y
bWFsOgotICAgICAgICByZXR1cm4gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpOb3JtYWw7Ci0gICAg
Y2FzZSBMaW5lQnJlYWs6OlN0cmljdDoKLSAgICAgICAgcmV0dXJuIExpbmVCcmVha0l0ZXJhdG9y
TW9kZTo6U3RyaWN0OwotICAgIH0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1
cm4gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpEZWZhdWx0OwotfQotCi19Ci19Ci0jZW5kaWYKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4
dFV0aWwuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4
dFV0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1ODRmYTc5ODFiZDQzODNj
ZjQzZTIzYTRiZmFlYjgyMGNlMzJmMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy90ZXh0
L1RleHRVdGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
Ci0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAq
Ci0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQot
I3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQot
I2luY2x1ZGUgIklubGluZUl0ZW0uaCIKLSNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgotI2luY2x1
ZGUgPHd0Zi90ZXh0L1RleHRCcmVha0l0ZXJhdG9yLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsK
LQotY2xhc3MgUmVuZGVyU3R5bGU7Ci0KLW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBJbmxp
bmVUZXh0Qm94OwotY2xhc3MgSW5saW5lVGV4dEl0ZW07Ci0KLWNsYXNzIFRleHRVdGlsIHsKLXB1
YmxpYzoKLSAgICBzdGF0aWMgSW5saW5lTGF5b3V0VW5pdCB3aWR0aChjb25zdCBJbmxpbmVUZXh0
SXRlbSYsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KTsKLSAgICBzdGF0aWMg
SW5saW5lTGF5b3V0VW5pdCB3aWR0aChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIHVuc2lnbmVkIGZy
b20sIHVuc2lnbmVkIHRvLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0g
ICAgc3RhdGljIElubGluZUxheW91dFVuaXQgd2lkdGgoY29uc3QgSW5saW5lVGV4dEJveCYsIHVu
c2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2Fs
TGVmdCk7Ci0KLSAgICBzdHJ1Y3QgU3BsaXREYXRhIHsKLSAgICAgICAgdW5zaWduZWQgc3RhcnQg
eyAwIH07Ci0gICAgICAgIHVuc2lnbmVkIGxlbmd0aCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsV2lkdGggeyAwIH07Ci0gICAgfTsKLSAgICBzdGF0aWMgU3BsaXREYXRh
IHNwbGl0KGNvbnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCB0ZXh0V2lkdGgs
IElubGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgsIElubGluZUxheW91dFVuaXQgY29udGVu
dExvZ2ljYWxMZWZ0KTsKLQotICAgIHN0YXRpYyB1bnNpZ25lZCBmaW5kTmV4dEJyZWFrYWJsZVBv
c2l0aW9uKExhenlMaW5lQnJlYWtJdGVyYXRvciYsIHVuc2lnbmVkIHN0YXJ0UG9zaXRpb24sIGNv
bnN0IFJlbmRlclN0eWxlJik7Ci0gICAgc3RhdGljIExpbmVCcmVha0l0ZXJhdG9yTW9kZSBsaW5l
QnJlYWtJdGVyYXRvck1vZGUoTGluZUJyZWFrKTsKLQotICAgIHN0YXRpYyBib29sIHNob3VsZFBy
ZXNlcnZlU3BhY2VzQW5kVGFicyhjb25zdCBCb3gmKTsKLSAgICBzdGF0aWMgYm9vbCBzaG91bGRQ
cmVzZXJ2ZU5ld2xpbmUoY29uc3QgQm94Jik7Ci19OwotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5n
Q29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxl
Rm9ybWF0dGluZ0NvbnRleHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDJh
ZjdjNWVkODhkNTA0Y2FjNDI1YTEzNTIxMDA4YjZlNThiOWFjLi4wMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZv
cm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1
MjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6
Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
Ci0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJU
YWJsZUZvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdf
Q09OVEVYVCkKLQotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAi
RmxvYXRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgotI2lu
Y2x1ZGUgIkludmFsaWRhdGlvblN0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5j
bHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDaGlsZEl0ZXJhdG9y
LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxD
b250YWluaW5nQmxvY2suaCIKLSNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdTdGF0ZS5oIgotI2lu
Y2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoVGFibGVGb3Jt
YXR0aW5nQ29udGV4dCk7Ci0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGFibGVzLTMv
I3RhYmxlLWxheW91dC1hbGdvcml0aG0KLVRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlRm9y
bWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3Qs
IFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCi0gICAgOiBGb3JtYXR0aW5n
Q29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKLXsKLX0KLQot
dm9pZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRh
dGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50
cykKLXsKLSAgICBhdXRvIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSA9IGNvbnN0cmFpbnRzLmhv
cml6b250YWwubG9naWNhbFdpZHRoOwotICAgIGF1dG8gYXZhaWxhYmxlVmVydGljYWxTcGFjZSA9
IGNvbnN0cmFpbnRzLnZlcnRpY2FsLmxvZ2ljYWxIZWlnaHQ7Ci0gICAgLy8gMS4gQ29tcHV0ZSB3
aWR0aCBhbmQgaGVpZ2h0IGZvciB0aGUgZ3JpZC4KLSAgICBjb21wdXRlQW5kRGlzdHJpYnV0ZUV4
dHJhU3BhY2UoYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBhdmFpbGFibGVWZXJ0aWNhbFNwYWNl
KTsKLSAgICAvLyAyLiBGaW5hbGl6ZSBjZWxscy4KLSAgICBzZXRVc2VkR2VvbWV0cnlGb3JDZWxs
cyhhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAgIC8vIDMuIEZpbmFsaXplIHJvd3MuCi0g
ICAgc2V0VXNlZEdlb21ldHJ5Rm9yUm93cyhhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAg
IC8vIDQuIEZpbmFsaXplIHNlY3Rpb25zLgotICAgIHNldFVzZWRHZW9tZXRyeUZvclNlY3Rpb25z
KGNvbnN0cmFpbnRzKTsKLX0KLQotTGF5b3V0VW5pdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0Ojp1
c2VkQ29udGVudEhlaWdodCgpIGNvbnN0Ci17Ci0gICAgLy8gVGFibGUgaGFzIHRvIGhhdmUgc29t
ZSBzZWN0aW9uIGNvbnRlbnQsIGF0IGxlYXN0IG9uZSA8dGJvZHk+LgotICAgIGF1dG8gdG9wID0g
Qm94R2VvbWV0cnk6Om1hcmdpbkJveFJlY3QoZ2VvbWV0cnlGb3JCb3goKnJvb3QoKS5maXJzdElu
Rmxvd0NoaWxkKCkpKS50b3AoKTsKLSAgICBhdXRvIGJvdHRvbSA9IEJveEdlb21ldHJ5OjptYXJn
aW5Cb3hSZWN0KGdlb21ldHJ5Rm9yQm94KCpyb290KCkubGFzdEluRmxvd0NoaWxkKCkpKS5ib3R0
b20oKTsKLSAgICByZXR1cm4gYm90dG9tIC0gdG9wOwotfQotCi12b2lkIFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQ6OnNldFVzZWRHZW9tZXRyeUZvckNlbGxzKExheW91dFVuaXQgYXZhaWxhYmxlSG9y
aXpvbnRhbFNwYWNlKQotewotICAgIGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJs
ZUdyaWQoKTsKLSAgICBhdXRvJiBjb2x1bW5MaXN0ID0gZ3JpZC5jb2x1bW5zKCkubGlzdCgpOwot
ICAgIGF1dG8mIHJvd0xpc3QgPSBncmlkLnJvd3MoKS5saXN0KCk7Ci0gICAgLy8gRmluYWwgdGFi
bGUgY2VsbCBsYXlvdXQuIEF0IHRoaXMgcG9pbnQgYWxsIHBlcmNlbnRhZ2UgdmFsdWVzIGNhbiBi
ZSByZXNvbHZlZC4KLSAgICBhdXRvIHNlY3Rpb25PZmZzZXQgPSBMYXlvdXRVbml0IHsgfTsKLSAg
ICBhdXRvKiBjdXJyZW50U2VjdGlvbiA9ICZyb3dMaXN0LmZpcnN0KCkuYm94KCkucGFyZW50KCk7
Ci0gICAgZm9yIChhdXRvJiBjZWxsIDogZ3JpZC5jZWxscygpKSB7Ci0gICAgICAgIGF1dG8mIGNl
bGxCb3ggPSBjZWxsLT5ib3goKTsKLSAgICAgICAgYXV0byYgY2VsbEJveEdlb21ldHJ5ID0gZm9y
bWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoY2VsbEJveCk7Ci0gICAgICAgIGF1dG8mIHNlY3Rp
b24gPSByb3dMaXN0W2NlbGwtPnN0YXJ0Um93KCldLmJveCgpLnBhcmVudCgpOwotICAgICAgICBp
ZiAoJnNlY3Rpb24gIT0gY3VycmVudFNlY3Rpb24pIHsKLSAgICAgICAgICAgIGN1cnJlbnRTZWN0
aW9uID0gJnNlY3Rpb247Ci0gICAgICAgICAgICAvLyBXaGlsZSB0aGUgZ3JpZCBpcyBhIGNvbnRp
bnVvdXMgZmxvdyBvZiByb3dzLCBpbiB0aGUgZGlzcGxheSB0cmVlIHRoZXkgYXJlIHJlbGF0aXZl
IHRvIHRoZWlyIHNlY3Rpb25zLgotICAgICAgICAgICAgc2VjdGlvbk9mZnNldCA9IHJvd0xpc3Rb
Y2VsbC0+c3RhcnRSb3coKV0ubG9naWNhbFRvcCgpOwotICAgICAgICB9Ci0gICAgICAgIGNlbGxC
b3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHJvd0xpc3RbY2VsbC0+c3RhcnRSb3coKV0ubG9naWNh
bFRvcCgpIC0gc2VjdGlvbk9mZnNldCk7Ci0gICAgICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRMb2dp
Y2FsTGVmdChjb2x1bW5MaXN0W2NlbGwtPnN0YXJ0Q29sdW1uKCldLmxvZ2ljYWxMZWZ0KCkpOwot
ICAgICAgICBhdXRvIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UgPSByb3dMaXN0W2NlbGwtPnN0YXJ0
Um93KCldLmxvZ2ljYWxIZWlnaHQoKTsKLSAgICAgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSBj
ZWxsLT5zdGFydFJvdygpICsgMTsgcm93SW5kZXggPCBjZWxsLT5lbmRSb3coKTsgKytyb3dJbmRl
eCkKLSAgICAgICAgICAgIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UgKz0gcm93TGlzdFtyb3dJbmRl
eF0ubG9naWNhbEhlaWdodCgpOwotICAgICAgICBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlICs9IChj
ZWxsLT5yb3dTcGFuKCkgLSAxKSAqIGdyaWQudmVydGljYWxTcGFjaW5nKCk7Ci0gICAgICAgIGxh
eW91dENlbGwoKmNlbGwsIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSwgYXZhaWxhYmxlVmVydGlj
YWxTcGFjZSk7Ci0gICAgICAgIC8vIEZJWE1FOiBGaW5kIG91dCBpZiBpdCBpcyBvayB0byB1c2Ug
dGhlIHJlZ3VsYXIgcGFkZGluZyBoZXJlIHRvIGFsaWduIHRoZSBjb250ZW50IGJveCBpbnNpZGUg
YSB0YWxsIGNlbGwgb3Igd2UgbmVlZCB0byAKLSAgICAgICAgLy8gdXNlIHNvbWUga2luZCBvZiBp
bnRyaW5zaWMgcGFkZGluZyBzaW1pbGFyIHRvIFJlbmRlclRhYmxlQ2VsbC4KLSAgICAgICAgYXV0
byBwYWRkaW5nVG9wID0gY2VsbEJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKExheW91
dFVuaXQgeyB9KTsKLSAgICAgICAgYXV0byBwYWRkaW5nQm90dG9tID0gY2VsbEJveEdlb21ldHJ5
LnBhZGRpbmdCb3R0b20oKS52YWx1ZU9yKExheW91dFVuaXQgeyB9KTsKLSAgICAgICAgYXV0byBp
bnRyaW5zaWNQYWRkaW5nVG9wID0gTGF5b3V0VW5pdCB7IH07Ci0gICAgICAgIGF1dG8gaW50cmlu
c2ljUGFkZGluZ0JvdHRvbSA9IExheW91dFVuaXQgeyB9OwotCi0gICAgICAgIHN3aXRjaCAoY2Vs
bEJveC5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKSkgewotICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246Ok1pZGRsZTogewotICAgICAgICAgICAgYXV0byBpbnRyaW5zaWNWZXJ0aWNhbFBhZGRpbmcg
PSBzdGQ6Om1heCgwX2x1LCBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlIC0gY2VsbEJveEdlb21ldHJ5
LnZlcnRpY2FsTWFyZ2luQm9yZGVyQW5kUGFkZGluZygpIC0gY2VsbEJveEdlb21ldHJ5LmNvbnRl
bnRCb3hIZWlnaHQoKSk7Ci0gICAgICAgICAgICBpbnRyaW5zaWNQYWRkaW5nVG9wID0gaW50cmlu
c2ljVmVydGljYWxQYWRkaW5nIC8gMjsKLSAgICAgICAgICAgIGludHJpbnNpY1BhZGRpbmdCb3R0
b20gPSBpbnRyaW5zaWNWZXJ0aWNhbFBhZGRpbmcgLyAyOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZTogewotICAgICAg
ICAgICAgYXV0byByb3dCYXNlbGluZSA9IExheW91dFVuaXQgeyByb3dMaXN0W2NlbGwtPnN0YXJ0
Um93KCldLmJhc2VsaW5lKCkgfTsKLSAgICAgICAgICAgIGF1dG8gY2VsbEJhc2VsaW5lID0gTGF5
b3V0VW5pdCB7IGNlbGwtPmJhc2VsaW5lKCkgfTsKLSAgICAgICAgICAgIGludHJpbnNpY1BhZGRp
bmdUb3AgPSBzdGQ6Om1heCgwX2x1LCByb3dCYXNlbGluZSAtIGNlbGxCYXNlbGluZSAtIGNlbGxC
b3hHZW9tZXRyeS5ib3JkZXJUb3AoKSk7Ci0gICAgICAgICAgICBpbnRyaW5zaWNQYWRkaW5nQm90
dG9tID0gc3RkOjptYXgoMF9sdSwgYXZhaWxhYmxlVmVydGljYWxTcGFjZSAtIGNlbGxCb3hHZW9t
ZXRyeS52ZXJ0aWNhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKSAtIGludHJpbnNpY1BhZGRpbmdU
b3AgLSBjZWxsQm94R2VvbWV0cnkuY29udGVudEJveEhlaWdodCgpKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlRfTk9U
X0lNUExFTUVOVEVEX1lFVCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKGludHJpbnNpY1BhZGRpbmdUb3AgJiYgY2VsbEJveC5oYXNJbkZsb3dPckZsb2F0aW5n
Q2hpbGQoKSkgewotICAgICAgICAgICAgYXV0byBhZGp1c3RDZWxsQ29udGVudFdpdGhJbnN0cmlu
c2ljUGFkZGluZ0JlZm9yZSA9IFsmXSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hpbGQgYm94ZXMg
KGFuZCBydW5zKSBhcmUgYWx3YXlzIGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgY29u
dGFpbmluZyBibG9jaydzIGJvcmRlciBib3guCi0gICAgICAgICAgICAgICAgLy8gVGhlIGNvbnRl
bnQgYm94ICh3aGVyZSB0aGUgY2hpbGQgY29udGVudCBsaXZlcykgaXMgaW5zaWRlIHRoZSBwYWRk
aW5nIGJveCwgd2hpY2ggaXMgaW5zaWRlIHRoZSBib3JkZXIgYm94LgotICAgICAgICAgICAgICAg
IC8vIEluIG9yZGVyIHRvIGNvbXB1dGUgdGhlIGNoaWxkIGJveCB0b3AvbGVmdCBwb3NpdGlvbiwg
d2UgbmVlZCB0byBrbm93IGJvdGggdGhlIHBhZGRpbmcgYW5kIHRoZSBib3JkZXIgb2Zmc2V0cy4g
IAotICAgICAgICAgICAgICAgIC8vIE5vcm1hbGx5IGJ5IHRoZSB0aW1lIHdlIHN0YXJ0IHBvc2l0
aW9uaW5nIHRoZSBjaGlsZCBjb250ZW50LCB3ZSBhbHJlYWR5IGhhdmUgY29tcHV0ZWQgYm9yZGVy
cyBhbmQgcGFkZGluZyBmb3IgdGhlIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgICAgICAgICAgICAg
Ly8gVGhpcyBpcyBkaWZmZXJlbnQgd2l0aCB0YWJsZSBjZWxscyB3aGVyZSB0aGUgZmluYWwgcGFk
ZGluZyBvZmZzZXQgZGVwZW5kcyBvbiB0aGUgY29udGVudCBoZWlnaHQgYXMgd2UgdXNlCi0gICAg
ICAgICAgICAgICAgLy8gdGhlIHBhZGRpbmcgYm94IHRvIHZlcnRpY2FsbHkgYWxpZ24gdGhlIHRh
YmxlIGNlbGwgY29udGVudC4KLSAgICAgICAgICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUg
PSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkRm9ybWF0dGluZ1N0YXRlKGNlbGxCb3gpOwotICAg
ICAgICAgICAgICAgIGZvciAoYXV0byogY2hpbGQgPSBjZWxsQm94LmZpcnN0SW5GbG93T3JGbG9h
dGluZ0NoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0SW5GbG93T3JGbG9hdGluZ1Np
YmxpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzSW5saW5lVGV4dEJv
eCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAg
ICAgIGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeSgqY2hpbGQpLm1vdmVWZXJ0aWNhbGx5KGlu
dHJpbnNpY1BhZGRpbmdUb3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBp
ZiAoY2VsbEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgYXV0byYgaW5saW5lRm9ybWF0dGluZ1N0YXRlZSA9IGxheW91dFN0YXRl
KCkuZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUoY2VsbEJveCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGZvciAoYXV0byYgcnVuIDogaW5saW5lRm9ybWF0dGluZ1N0YXRlZS5saW5lUnVu
cygpKQotICAgICAgICAgICAgICAgICAgICAgICAgcnVuLm1vdmVWZXJ0aWNhbGx5KGludHJpbnNp
Y1BhZGRpbmdUb3ApOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGxpbmUgOiBpbmxp
bmVGb3JtYXR0aW5nU3RhdGVlLmxpbmVzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5l
Lm1vdmVWZXJ0aWNhbGx5KGludHJpbnNpY1BhZGRpbmdUb3ApOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBhZGp1c3RDZWxsQ29udGVudFdpdGhJbnN0cmlu
c2ljUGFkZGluZ0JlZm9yZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNlbGxCb3hHZW9tZXRyeS5z
ZXRWZXJ0aWNhbFBhZGRpbmcoeyBwYWRkaW5nVG9wICsgaW50cmluc2ljUGFkZGluZ1RvcCwgcGFk
ZGluZ0JvdHRvbSArIGludHJpbnNpY1BhZGRpbmdCb3R0b20gfSk7Ci0gICAgfQotfQotCi12b2lk
IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OnNldFVzZWRHZW9tZXRyeUZvclJvd3MoTGF5b3V0VW5p
dCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpCi17Ci0gICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRp
bmdTdGF0ZSgpLnRhYmxlR3JpZCgpOwotICAgIGF1dG8mIHJvd3MgPSBncmlkLnJvd3MoKS5saXN0
KCk7Ci0KLSAgICBhdXRvIHJvd0xvZ2ljYWxUb3AgPSBncmlkLnZlcnRpY2FsU3BhY2luZygpOwot
ICAgIGNvbnN0IENvbnRhaW5lckJveCogcHJldmlvdXNSb3cgPSBudWxscHRyOwotICAgIGZvciAo
c2l6ZV90IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkg
ewotICAgICAgICBhdXRvJiByb3cgPSByb3dzW3Jvd0luZGV4XTsKLSAgICAgICAgYXV0byYgcm93
Qm94ID0gcm93LmJveCgpOwotICAgICAgICBhdXRvJiByb3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRp
bmdTdGF0ZSgpLmJveEdlb21ldHJ5KHJvd0JveCk7Ci0KLSAgICAgICAgcm93Qm94R2VvbWV0cnku
c2V0UGFkZGluZyhnZW9tZXRyeSgpLmNvbXB1dGVkUGFkZGluZyhyb3dCb3gsIGF2YWlsYWJsZUhv
cml6b250YWxTcGFjZSkpOwotICAgICAgICAvLyBJbnRlcm5hbCB0YWJsZSBlbGVtZW50cyBkbyBu
b3QgaGF2ZSBtYXJnaW5zLgotICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRIb3Jpem9udGFsTWFy
Z2luKHsgfSk7Ci0gICAgICAgIHJvd0JveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7
Ci0KLSAgICAgICAgYXV0byBjb21wdXRlZFJvd0JvcmRlciA9IFsmXSB7Ci0gICAgICAgICAgICBh
dXRvIGJvcmRlciA9IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIocm93Qm94KTsKLSAgICAgICAg
ICAgIGlmICghZ3JpZC5jb2xsYXBzZWRCb3JkZXIoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
Ym9yZGVyOwotICAgICAgICAgICAgLy8gQm9yZGVyIGNvbGxhcHNpbmcgZGVsZWdhdGVzIGJvcmRl
cnMgdG8gdGFibGUvY2VsbHMuCi0gICAgICAgICAgICBib3JkZXIuaG9yaXpvbnRhbCA9IHsgfTsK
LSAgICAgICAgICAgIGlmICghcm93SW5kZXgpCi0gICAgICAgICAgICAgICAgYm9yZGVyLnZlcnRp
Y2FsLnRvcCA9IHsgfTsKLSAgICAgICAgICAgIGlmIChyb3dJbmRleCA9PSByb3dzLnNpemUoKSAt
IDEpCi0gICAgICAgICAgICAgICAgYm9yZGVyLnZlcnRpY2FsLmJvdHRvbSA9IHsgfTsKLSAgICAg
ICAgICAgIHJldHVybiBib3JkZXI7Ci0gICAgICAgIH0oKTsKLSAgICAgICAgaWYgKGNvbXB1dGVk
Um93Qm9yZGVyLmhlaWdodCgpID4gcm93LmxvZ2ljYWxIZWlnaHQoKSkgewotICAgICAgICAgICAg
Ly8gRklYTUU6IFRoaXMgaXMgYW4gb2RkIHF1aXJrIHdoZW4gdGhlIHJvdyBib3JkZXIgb3ZlcmZs
b3dzIHRoZSByb3cuCi0gICAgICAgICAgICAvLyBXZSBkb24ndCBwYWludCByb3cgYm9yZGVycyBz
byBpdCBkb2VzIG5vdCBtYXR0ZXIgdG9vIG11Y2gsIGJ1dCBpZiB3ZSBkb24ndAotICAgICAgICAg
ICAgLy8gc2V0IHRoaXMgZmFrZSBib3JkZXIgdmFsdWUsIHRoYW4gd2UgZWl0aGVyIGVuZCB1cCB3
aXRoIGEgbmVnYXRpdmUgY29udGVudCBib3gKLSAgICAgICAgICAgIC8vIG9yIHdpdGggYSB3aWRl
IGZyYW1lIGJveC4KLSAgICAgICAgICAgIC8vIElmIGl0IGhhcHBlbnMgdG8gY2F1c2UgaXNzdWVz
IGluIHRoZSBkaXNwbGF5IHRyZWUsIHdlIGNvdWxkIGFsc28gY29uc2lkZXIKLSAgICAgICAgICAg
IC8vIGEgc3BlY2lhbCBmcmFtZSBib3ggb3ZlcnJpZGUsIHdoZXJlIHBhZGRpbmcgYm94ICsgYm9y
ZGVyICE9IGZyYW1lIGJveC4KLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLnZlcnRpY2Fs
LnRvcCA9IHsgfTsKLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLnZlcnRpY2FsLmJvdHRv
bSA9IHsgfTsKLSAgICAgICAgfQotICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRDb250ZW50Qm94
SGVpZ2h0KHJvdy5sb2dpY2FsSGVpZ2h0KCkgLSBjb21wdXRlZFJvd0JvcmRlci5oZWlnaHQoKSk7
Ci0KLSAgICAgICAgYXV0byByb3dMb2dpY2FsV2lkdGggPSBncmlkLmNvbHVtbnMoKS5sb2dpY2Fs
V2lkdGgoKSArIDIgKiBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7Ci0gICAgICAgIGlmIChjb21w
dXRlZFJvd0JvcmRlci53aWR0aCgpID4gcm93TG9naWNhbFdpZHRoKSB7Ci0gICAgICAgICAgICAv
LyBTZWUgY29tbWVudCBhYm92ZS4KLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLmhvcml6
b250YWwubGVmdCA9IHsgfTsKLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLmhvcml6b250
YWwucmlnaHQgPSB7IH07Ci0gICAgICAgIH0KLSAgICAgICAgcm93Qm94R2VvbWV0cnkuc2V0Q29u
dGVudEJveFdpZHRoKHJvd0xvZ2ljYWxXaWR0aCAtIGNvbXB1dGVkUm93Qm9yZGVyLndpZHRoKCkp
OwotICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRCb3JkZXIoY29tcHV0ZWRSb3dCb3JkZXIpOwot
Ci0gICAgICAgIGlmIChwcmV2aW91c1JvdyAmJiAmcHJldmlvdXNSb3ctPnBhcmVudCgpICE9ICZy
b3dCb3gucGFyZW50KCkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgcm93IGlzIGluIGEgZGlmZmVy
ZW50IHNlY3Rpb24uCi0gICAgICAgICAgICByb3dMb2dpY2FsVG9wID0geyB9OwotICAgICAgICB9
Ci0gICAgICAgIHJvd0JveEdlb21ldHJ5LnNldExvZ2ljYWxUb3Aocm93TG9naWNhbFRvcCk7Ci0g
ICAgICAgIHJvd0JveEdlb21ldHJ5LnNldExvZ2ljYWxMZWZ0KHsgfSk7Ci0KLSAgICAgICAgcm93
TG9naWNhbFRvcCArPSByb3cubG9naWNhbEhlaWdodCgpICsgZ3JpZC52ZXJ0aWNhbFNwYWNpbmco
KTsKLSAgICAgICAgcHJldmlvdXNSb3cgPSAmcm93Qm94OwotICAgIH0KLQotICAgIGF1dG8mIGNv
bHVtbnMgPSBncmlkLmNvbHVtbnMoKTsKLSAgICBWZWN0b3I8SW5saW5lTGF5b3V0VW5pdD4gcm93
QmFzZWxpbmVzKHJvd3Muc2l6ZSgpLCAwKTsKLSAgICAvLyBOb3cgdGhhdCBjZWxscyBhcmUgbGFp
ZCBvdXQsIGxldCdzIGNvbXB1dGUgdGhlIHJvdyBiYXNlbGluZXMuCi0gICAgZm9yIChzaXplX3Qg
cm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7Ci0gICAg
ICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1bW5zLnNp
emUoKTsgKytjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgYXV0byYgc2xvdCA9ICpncmlkLnNs
b3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICBpZiAoc2xvdC5pc1Jv
d1NwYW5uZWQoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChz
bG90Lmhhc1Jvd1NwYW4oKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAg
IGF1dG8mIGNlbGwgPSBzbG90LmNlbGwoKTsKLSAgICAgICAgICAgIHJvd0Jhc2VsaW5lc1tyb3dJ
bmRleF0gPSBzdGQ6Om1heChyb3dCYXNlbGluZXNbcm93SW5kZXhdLCBjZWxsLmJhc2VsaW5lKCkp
OwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IHJvd0luZGV4ID0gMDsgcm93SW5k
ZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkKLSAgICAgICAgcm93c1tyb3dJbmRleF0uc2V0
QmFzZWxpbmUocm93QmFzZWxpbmVzW3Jvd0luZGV4XSk7Ci19Ci0KLXZvaWQgVGFibGVGb3JtYXR0
aW5nQ29udGV4dDo6c2V0VXNlZEdlb21ldHJ5Rm9yU2VjdGlvbnMoY29uc3QgQ29uc3RyYWludHNG
b3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBhdXRvJiBncmlkID0gZm9ybWF0
dGluZ1N0YXRlKCkudGFibGVHcmlkKCk7Ci0gICAgYXV0byYgdGFibGVCb3ggPSByb290KCk7Ci0g
ICAgYXV0byBzZWN0aW9uV2lkdGggPSBncmlkLmNvbHVtbnMoKS5sb2dpY2FsV2lkdGgoKSArIDIg
KiBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7Ci0gICAgYXV0byBsb2dpY2FsVG9wID0gY29uc3Ry
YWludHMudmVydGljYWwubG9naWNhbFRvcDsKLSAgICBhdXRvIHZlcnRpY2FsU3BhY2luZyA9IGdy
aWQudmVydGljYWxTcGFjaW5nKCk7Ci0gICAgYXV0byBwYWRkaW5nQmVmb3JlID0gT3B0aW9uYWw8
TGF5b3V0VW5pdD4geyB2ZXJ0aWNhbFNwYWNpbmcgfTsKLSAgICBhdXRvIHBhZGRpbmdBZnRlciA9
IHZlcnRpY2FsU3BhY2luZzsKLSAgICBmb3IgKGF1dG8mIHNlY3Rpb25Cb3ggOiBjaGlsZHJlbk9m
VHlwZTxDb250YWluZXJCb3g+KHRhYmxlQm94KSkgewotICAgICAgICBhdXRvJiBzZWN0aW9uQm94
R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShzZWN0aW9uQm94KTsKLSAg
ICAgICAgLy8gU2VjdGlvbiBib3JkZXJzIGFyZSBlaXRoZXIgY29sbGFwc2VkIG9yIGlnbm9yZWQu
Ci0gICAgICAgIHNlY3Rpb25Cb3hHZW9tZXRyeS5zZXRCb3JkZXIoeyB9KTsKLSAgICAgICAgLy8g
VXNlIGZha2UgdmVydGljYWwgcGFkZGluZyB0byBzcGFjZSBvdXQgdGhlIHNlY3Rpb25zLgotICAg
ICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0UGFkZGluZyhFZGdlcyB7IHsgfSwgeyBwYWRkaW5n
QmVmb3JlLnZhbHVlT3IoMF9sdSksIHBhZGRpbmdBZnRlciB9IH0pOwotICAgICAgICBwYWRkaW5n
QmVmb3JlID0gV1RGOjpudWxsb3B0OwotICAgICAgICAvLyBJbnRlcm5hbCB0YWJsZSBlbGVtZW50
cyBkbyBub3QgaGF2ZSBtYXJnaW5zLgotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0SG9y
aXpvbnRhbE1hcmdpbih7IH0pOwotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0VmVydGlj
YWxNYXJnaW4oeyB9KTsKLQotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0Q29udGVudEJv
eFdpZHRoKHNlY3Rpb25XaWR0aCk7Ci0gICAgICAgIGF1dG8gc2VjdGlvbkNvbnRlbnRIZWlnaHQg
PSBMYXlvdXRVbml0IHsgfTsKLSAgICAgICAgc2l6ZV90IHJvd0NvdW50ID0gMDsKLSAgICAgICAg
Zm9yIChhdXRvJiByb3dCb3ggOiBjaGlsZHJlbk9mVHlwZTxDb250YWluZXJCb3g+KHNlY3Rpb25C
b3gpKSB7Ci0gICAgICAgICAgICBzZWN0aW9uQ29udGVudEhlaWdodCArPSBnZW9tZXRyeUZvckJv
eChyb3dCb3gpLmJvcmRlckJveEhlaWdodCgpOwotICAgICAgICAgICAgKytyb3dDb3VudDsKLSAg
ICAgICAgfQotICAgICAgICBzZWN0aW9uQ29udGVudEhlaWdodCArPSB2ZXJ0aWNhbFNwYWNpbmcg
KiAocm93Q291bnQgLSAxKTsKLSAgICAgICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldENvbnRlbnRC
b3hIZWlnaHQoc2VjdGlvbkNvbnRlbnRIZWlnaHQpOwotICAgICAgICBzZWN0aW9uQm94R2VvbWV0
cnkuc2V0TG9naWNhbExlZnQoY29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dpY2FsTGVmdCk7Ci0g
ICAgICAgIHNlY3Rpb25Cb3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKGxvZ2ljYWxUb3ApOwotCi0g
ICAgICAgIGxvZ2ljYWxUb3AgKz0gc2VjdGlvbkJveEdlb21ldHJ5LmJvcmRlckJveEhlaWdodCgp
OwotICAgIH0KLX0KLQotdm9pZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRDZWxsKGNv
bnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCwgTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFs
U3BhY2UsIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRDZWxsSGVpZ2h0KQotewotICAgIEFTU0VS
VChjZWxsLmJveCgpLmVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpKTsKLQotICAg
IGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsKLSAgICBhdXRvJiBj
ZWxsQm94ID0gY2VsbC5ib3goKTsKLSAgICBhdXRvJiBjZWxsQm94R2VvbWV0cnkgPSBmb3JtYXR0
aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShjZWxsQm94KTsKLQotICAgIGNlbGxCb3hHZW9tZXRyeS5z
ZXRCb3JkZXIoZ2VvbWV0cnkoKS5jb21wdXRlZENlbGxCb3JkZXIoY2VsbCkpOwotICAgIGNlbGxC
b3hHZW9tZXRyeS5zZXRQYWRkaW5nKGdlb21ldHJ5KCkuY29tcHV0ZWRQYWRkaW5nKGNlbGxCb3gs
IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSkpOwotICAgIC8vIEludGVybmFsIHRhYmxlIGVsZW1l
bnRzIGRvIG5vdCBoYXZlIG1hcmdpbnMuCi0gICAgY2VsbEJveEdlb21ldHJ5LnNldEhvcml6b250
YWxNYXJnaW4oeyB9KTsKLSAgICBjZWxsQm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyB9
KTsKLQotICAgIGF1dG8gYXZhaWxhYmxlU3BhY2VGb3JDb250ZW50ID0gWyZdIHsKLSAgICAgICAg
YXV0byYgY29sdW1uTGlzdCA9IGdyaWQuY29sdW1ucygpLmxpc3QoKTsKLSAgICAgICAgYXV0byBs
b2dpY2FsV2lkdGggPSBMYXlvdXRVbml0IHsgfTsKLSAgICAgICAgZm9yIChhdXRvIGNvbHVtbklu
ZGV4ID0gY2VsbC5zdGFydENvbHVtbigpOyBjb2x1bW5JbmRleCA8IGNlbGwuZW5kQ29sdW1uKCk7
ICsrY29sdW1uSW5kZXgpCi0gICAgICAgICAgICBsb2dpY2FsV2lkdGggKz0gY29sdW1uTGlzdC5h
dChjb2x1bW5JbmRleCkubG9naWNhbFdpZHRoKCk7Ci0gICAgICAgIC8vIE5vIGNvbHVtbiBzcGFj
aW5nIHdoZW4gc3Bhbm5pbmcuCi0gICAgICAgIGxvZ2ljYWxXaWR0aCArPSAoY2VsbC5jb2x1bW5T
cGFuKCkgLSAxKSAqIGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKLSAgICAgICAgcmV0dXJuIGxv
Z2ljYWxXaWR0aCAtIGNlbGxCb3hHZW9tZXRyeS5ob3Jpem9udGFsTWFyZ2luQm9yZGVyQW5kUGFk
ZGluZygpOwotICAgIH0oKTsKLSAgICBjZWxsQm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRo
KGF2YWlsYWJsZVNwYWNlRm9yQ29udGVudCk7Ci0KLSAgICBpZiAoY2VsbEJveC5oYXNJbkZsb3dP
ckZsb2F0aW5nQ2hpbGQoKSkgewotICAgICAgICBhdXRvIGNvbnN0cmFpbnRzRm9yQ2VsbENvbnRl
bnQgPSBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjZWxsQm94KTsKLSAg
ICAgICAgY29uc3RyYWludHNGb3JDZWxsQ29udGVudC52ZXJ0aWNhbC5sb2dpY2FsSGVpZ2h0ID0g
dXNlZENlbGxIZWlnaHQ7Ci0gICAgICAgIGF1dG8gaW52YWxpZGF0aW9uU3RhdGUgPSBJbnZhbGlk
YXRpb25TdGF0ZSB7IH07Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBwcm9iYWJseSBi
ZSBwYXJ0IG9mIHRoZSBpbnZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgd2hlbiB3ZSByZS1s
YXlvdXQgdGhlIGNlbGwKLSAgICAgICAgLy8gbXVsdGlwbGUgdGltZXMgYXMgcGFydCBvZiB0aGUg
bXVsdGktcGFzcyB0YWJsZSBhbGdvcml0aG0uCi0gICAgICAgIGF1dG8mIGZsb2F0aW5nU3RhdGVG
b3JDZWxsQ29udGVudCA9IGxheW91dFN0YXRlKCkuZW5zdXJlQmxvY2tGb3JtYXR0aW5nU3RhdGUo
Y2VsbEJveCkuZmxvYXRpbmdTdGF0ZSgpOwotICAgICAgICBmbG9hdGluZ1N0YXRlRm9yQ2VsbENv
bnRlbnQuY2xlYXIoKTsKLSAgICAgICAgTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0Nv
bnRleHQoY2VsbEJveCwgbGF5b3V0U3RhdGUoKSktPmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxp
ZGF0aW9uU3RhdGUsIGNvbnN0cmFpbnRzRm9yQ2VsbENvbnRlbnQpOwotICAgIH0KLSAgICBjZWxs
Qm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodChnZW9tZXRyeSgpLmNlbGxIZWlnaChjZWxs
Qm94KSk7Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cygpCi17Ci0gICAgQVNTRVJUKCFyb290KCkuaXNTaXplQ29udGFpbm1lbnRCb3goKSk7Ci0gICAg
Ly8gVGFibGVzIGhhdmUgYSBzbGlnaHR5IGRpZmZlcmVudCBjb25jZXB0IG9mIHNocmluayB0byBm
aXQuIEl0J3MgcmVhbGx5IG9ubHkgZGlmZmVyZW50IHdpdGggbm9uLWF1dG8gIndpZHRoIiB2YWx1
ZXMsIHdoZXJlCi0gICAgLy8gYSBnZW5lcmljIHNocmluay10byBmaXQgYmxvY2sgbGV2ZWwgYm94
IGxpa2UgYSBmbG9hdCBib3ggd291bGQgYmUganVzdCBzaXplZCB0byB0aGUgY29tcHV0ZWQgdmFs
dWUgb2YgIndpZHRoIiwgdGFibGVzCi0gICAgLy8gY2FuIGFjdHVhbGx5IGJlIHN0cmVjaGVkIHdh
eSBvdmVyLgotICAgIGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsK
LSAgICBpZiAoYXV0byBjb21wdXRlZFdpZHRoQ29uc3RyYWludHMgPSBncmlkLndpZHRoQ29uc3Ry
YWludHMoKSkKLSAgICAgICAgcmV0dXJuICpjb21wdXRlZFdpZHRoQ29uc3RyYWludHM7Ci0KLSAg
ICAvLyBDb21wdXRlIHRoZSBtaW5pbXVtL21heGltdW0gd2lkdGggb2YgZWFjaCBjb2x1bW4uCi0g
ICAgYXV0byBjb21wdXRlZFdpZHRoQ29uc3RyYWludHMgPSBjb21wdXRlZFByZWZlcnJlZFdpZHRo
Rm9yQ29sdW1ucygpOwotICAgIGdyaWQuc2V0V2lkdGhDb25zdHJhaW50cyhjb21wdXRlZFdpZHRo
Q29uc3RyYWludHMpOwotICAgIHJldHVybiBjb21wdXRlZFdpZHRoQ29uc3RyYWludHM7Ci19Ci0K
LVVuaXF1ZVJlZjxUYWJsZUdyaWQ+IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmVuc3VyZVRhYmxl
R3JpZChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KQotewotICAgIGF1dG8gdGFibGVHcmlk
ID0gbWFrZVVuaXF1ZVJlZjxUYWJsZUdyaWQ+KCk7Ci0gICAgYXV0byYgdGFibGVTdHlsZSA9IHRh
YmxlQm94LnN0eWxlKCk7Ci0gICAgYXV0byBzaG91bGRBcHBseUJvcmRlclNwYWNpbmcgPSB0YWJs
ZVN0eWxlLmJvcmRlckNvbGxhcHNlKCkgPT0gQm9yZGVyQ29sbGFwc2U6OlNlcGFyYXRlOwotICAg
IHRhYmxlR3JpZC0+c2V0SG9yaXpvbnRhbFNwYWNpbmcoTGF5b3V0VW5pdCB7IHNob3VsZEFwcGx5
Qm9yZGVyU3BhY2luZyA/IHRhYmxlU3R5bGUuaG9yaXpvbnRhbEJvcmRlclNwYWNpbmcoKSA6IDAg
fSk7Ci0gICAgdGFibGVHcmlkLT5zZXRWZXJ0aWNhbFNwYWNpbmcoTGF5b3V0VW5pdCB7IHNob3Vs
ZEFwcGx5Qm9yZGVyU3BhY2luZyA/IHRhYmxlU3R5bGUudmVydGljYWxCb3JkZXJTcGFjaW5nKCkg
OiAwIH0pOwotCi0gICAgYXV0byogZmlyc3RDaGlsZCA9IHRhYmxlQm94LmZpcnN0Q2hpbGQoKTsK
LSAgICBpZiAoIWZpcnN0Q2hpbGQpIHsKLSAgICAgICAgLy8gVGhlIHJhcmUgY2FzZSBvZiBlbXB0
eSB0YWJsZS4KLSAgICAgICAgcmV0dXJuIHRhYmxlR3JpZDsKLSAgICB9Ci0KLSAgICBjb25zdCBC
b3gqIHRhYmxlQ2FwdGlvbiA9IG51bGxwdHI7Ci0gICAgY29uc3QgQm94KiBjb2xncm91cCA9IG51
bGxwdHI7Ci0gICAgLy8gVGFibGUgY2FwdGlvbiBpcyBhbiBvcHRpb25hbCBlbGVtZW50OyBpZiB1
c2VkLCBpdCBpcyBhbHdheXMgdGhlIGZpcnN0IGNoaWxkIG9mIGEgPHRhYmxlPi4KLSAgICBpZiAo
Zmlyc3RDaGlsZC0+aXNUYWJsZUNhcHRpb24oKSkKLSAgICAgICAgdGFibGVDYXB0aW9uID0gZmly
c3RDaGlsZDsKLSAgICAvLyBUaGUgPGNvbGdyb3VwPiBtdXN0IGFwcGVhciBhZnRlciBhbnkgb3B0
aW9uYWwgPGNhcHRpb24+IGVsZW1lbnQgYnV0IGJlZm9yZSBhbnkgPHRoZWFkPiwgPHRoPiwgPHRi
b2R5PiwgPHRmb290PiBhbmQgPHRyPiBlbGVtZW50LgotICAgIGF1dG8qIGNvbGdyb3VwQ2FuZGlk
YXRlID0gZmlyc3RDaGlsZDsKLSAgICBpZiAodGFibGVDYXB0aW9uKQotICAgICAgICBjb2xncm91
cENhbmRpZGF0ZSA9IHRhYmxlQ2FwdGlvbi0+bmV4dFNpYmxpbmcoKTsKLSAgICBpZiAoY29sZ3Jv
dXBDYW5kaWRhdGUtPmlzVGFibGVDb2x1bW5Hcm91cCgpKQotICAgICAgICBjb2xncm91cCA9IGNv
bGdyb3VwQ2FuZGlkYXRlOwotCi0gICAgaWYgKGNvbGdyb3VwKSB7Ci0gICAgICAgIGF1dG8mIGNv
bHVtbnMgPSB0YWJsZUdyaWQtPmNvbHVtbnMoKTsKLSAgICAgICAgZm9yIChhdXRvKiBjb2x1bW4g
PSBkb3duY2FzdDxDb250YWluZXJCb3g+KCpjb2xncm91cCkuZmlyc3RDaGlsZCgpOyBjb2x1bW47
IGNvbHVtbiA9IGNvbHVtbi0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgQVNTRVJUKGNv
bHVtbi0+aXNUYWJsZUNvbHVtbigpKTsKLSAgICAgICAgICAgIGF1dG8gY29sdW1uU3BhbkNvdW50
ID0gY29sdW1uLT5jb2x1bW5TcGFuKCk7Ci0gICAgICAgICAgICBBU1NFUlQoY29sdW1uU3BhbkNv
dW50ID4gMCk7Ci0gICAgICAgICAgICB3aGlsZSAoY29sdW1uU3BhbkNvdW50LS0pCi0gICAgICAg
ICAgICAgICAgY29sdW1ucy5hZGRDb2x1bW4oZG93bmNhc3Q8Q29udGFpbmVyQm94PigqY29sdW1u
KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhdXRvKiBmaXJzdFNlY3Rpb24gPSBjb2xncm91
cCA/IGNvbGdyb3VwLT5uZXh0U2libGluZygpIDogdGFibGVDYXB0aW9uID8gdGFibGVDYXB0aW9u
LT5uZXh0U2libGluZygpIDogZmlyc3RDaGlsZDsKLSAgICBmb3IgKGF1dG8qIHNlY3Rpb24gPSBm
aXJzdFNlY3Rpb247IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0U2libGluZygpKSB7
Ci0gICAgICAgIEFTU0VSVChzZWN0aW9uLT5pc1RhYmxlSGVhZGVyKCkgfHwgc2VjdGlvbi0+aXNU
YWJsZUJvZHkoKSB8fCBzZWN0aW9uLT5pc1RhYmxlRm9vdGVyKCkpOwotICAgICAgICBmb3IgKGF1
dG8qIHJvdyA9IGRvd25jYXN0PENvbnRhaW5lckJveD4oKnNlY3Rpb24pLmZpcnN0Q2hpbGQoKTsg
cm93OyByb3cgPSByb3ctPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIEFTU0VSVChyb3ct
PmlzVGFibGVSb3coKSk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8qIGNlbGwgPSBkb3duY2FzdDxD
b250YWluZXJCb3g+KCpyb3cpLmZpcnN0Q2hpbGQoKTsgY2VsbDsgY2VsbCA9IGNlbGwtPm5leHRT
aWJsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoY2VsbC0+aXNUYWJsZUNlbGwoKSk7
Ci0gICAgICAgICAgICAgICAgdGFibGVHcmlkLT5hcHBlbmRDZWxsKGRvd25jYXN0PENvbnRhaW5l
ckJveD4oKmNlbGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1
cm4gdGFibGVHcmlkOwotfQotCi1Gb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25z
dHJhaW50cyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlZFByZWZlcnJlZFdpZHRoRm9y
Q29sdW1ucygpCi17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGlu
Z1N0YXRlKCk7Ci0gICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZS50YWJsZUdyaWQoKTsK
LSAgICBBU1NFUlQoIWdyaWQud2lkdGhDb25zdHJhaW50cygpKTsKLQotICAgIC8vIENvbHVtbiBw
cmVmZXJyZWQgd2lkdGggY29tcHV0YXRpb24gYXMgZm9sbG93czoKLSAgICAvLyAxLiBDb2xsZWN0
IGVhY2ggY2VsbHMnIHdpZHRoIGNvbnN0cmFpbnRzCi0gICAgLy8gMi4gQ29sbGVjdCBmaXhlZCBj
b2x1bW4gd2lkdGhzIHNldCBieSA8Y29sZ3JvdXA+J3MgYW5kIDxjb2w+cwotICAgIC8vIDMuIEZp
bmQgdGhlIG1pbi9tYXggd2lkdGggZm9yIGVhY2ggY29sdW1ucyB1c2luZyB0aGUgY2VsbCBjb25z
dHJhaW50cyBhbmQgdGhlIDxjb2w+IGZpeGVkIHdpZHRocyBidXQgaWdub3JlIGNvbHVtbiBzcGFu
cy4KLSAgICAvLyA0LiBEaXN0cmlidXRlIGNvbHVtbiBzcGFubmluZyBjZWxscyBtaW4vbWF4IHdp
ZHRocy4KLSAgICAvLyA1LiBBZGQgdGhlbSBhbGwgdXAgYW5kIHJldHVybiB0aGUgY29tcHV0ZWQg
bWluL21heCB3aWR0aHMuCi0gICAgZm9yIChhdXRvJiBjZWxsIDogZ3JpZC5jZWxscygpKSB7Ci0g
ICAgICAgIGF1dG8mIGNlbGxCb3ggPSBjZWxsLT5ib3goKTsKLSAgICAgICAgQVNTRVJUKGNlbGxC
b3guZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCkpOwotCi0gICAgICAgIGF1dG8g
aW50cmluc2ljV2lkdGggPSBmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50
c0ZvckJveChjZWxsQm94KTsKLSAgICAgICAgaWYgKCFpbnRyaW5zaWNXaWR0aCkgewotICAgICAg
ICAgICAgaW50cmluc2ljV2lkdGggPSBnZW9tZXRyeSgpLmludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHNGb3JDZWxsKCpjZWxsKTsKLSAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5zZXRJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGNlbGxCb3gsICppbnRyaW5zaWNXaWR0aCk7Ci0gICAg
ICAgIH0KLSAgICAgICAgLy8gU3Bhbm5lciBjZWxscyBwdXQgdGhlaXIgaW50cmluc2ljIHdpZHRo
cyBvbiB0aGUgaW5pdGlhbCBzbG90cy4KLSAgICAgICAgZ3JpZC5zbG90KGNlbGwtPnBvc2l0aW9u
KCkpLT5zZXRXaWR0aENvbnN0cmFpbnRzKCppbnRyaW5zaWNXaWR0aCk7Ci0gICAgfQotCi0gICAg
Ly8gMi4gQ29sbGVjdCB0aGUgZml4ZWQgd2lkdGggPGNvbD5zLgotICAgIGF1dG8mIGNvbHVtbkxp
c3QgPSBncmlkLmNvbHVtbnMoKS5saXN0KCk7Ci0gICAgVmVjdG9yPE9wdGlvbmFsPExheW91dFVu
aXQ+PiBmaXhlZFdpZHRoQ29sdW1uczsKLSAgICBmb3IgKGF1dG8mIGNvbHVtbiA6IGNvbHVtbkxp
c3QpIHsKLSAgICAgICAgYXV0byBmaXhlZFdpZHRoID0gWyZdICgpIC0+IE9wdGlvbmFsPExheW91
dFVuaXQ+IHsKLSAgICAgICAgICAgIGF1dG8qIGNvbHVtbkJveCA9IGNvbHVtbi5ib3goKTsKLSAg
ICAgICAgICAgIGlmICghY29sdW1uQm94KSB7Ci0gICAgICAgICAgICAgICAgLy8gQW5veW5tb3Vz
IGNvbHVtbnMgZG9uJ3QgaGF2ZSBhc3NvY2lhdGVkIGxheW91dCBib3hlcyBhbmQgY2FuJ3QgaGF2
ZSBmaXhlZCBjb2wgc2l6ZS4KLSAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgaWYgKGF1dG8gd2lkdGggPSBjb2x1bW5Cb3gtPmNvbHVtbldpZHRo
KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdpZHRoOwotICAgICAgICAgICAgcmV0dXJuIGdl
b21ldHJ5KCkuY29tcHV0ZWRDb2x1bW5XaWR0aCgqY29sdW1uQm94KTsKLSAgICAgICAgfTsKLSAg
ICAgICAgZml4ZWRXaWR0aENvbHVtbnMuYXBwZW5kKGZpeGVkV2lkdGgoKSk7Ci0gICAgfQotCi0g
ICAgVmVjdG9yPEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzPiBj
b2x1bW5JbnRyaW5zaWNXaWR0aHMoY29sdW1uTGlzdC5zaXplKCkpOwotICAgIC8vIDMuIENvbGxl
Y3QgaGUgbWluL21heCB3aWR0aCBmb3IgZWFjaCBjb2x1bW4gYnV0IGlnbm9yZSBjb2x1bW4gc3Bh
bnMgZm9yIG5vdy4KLSAgICBWZWN0b3I8U2xvdFBvc2l0aW9uPiBzcGFubmluZ0NlbGxQb3NpdGlv
bkxpc3Q7Ci0gICAgc2l6ZV90IG51bWJlck9mQWN0dWFsQ29sdW1ucyA9IDA7Ci0gICAgZm9yIChz
aXplX3QgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IGNvbHVtbkxpc3Quc2l6ZSgpOyAr
K2NvbHVtbkluZGV4KSB7Ci0gICAgICAgIGF1dG8gY29sdW1uSGFzTm9uU3Bhbm5lZENlbGwgPSBm
YWxzZTsKLSAgICAgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IGdyaWQu
cm93cygpLnNpemUoKTsgKytyb3dJbmRleCkgewotICAgICAgICAgICAgYXV0byYgc2xvdCA9ICpn
cmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICBpZiAoc2xv
dC5pc0NvbHVtblNwYW5uZWQoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgIGNvbHVtbkhhc05vblNwYW5uZWRDZWxsID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChzbG90
Lmhhc0NvbHVtblNwYW4oKSkgewotICAgICAgICAgICAgICAgIHNwYW5uaW5nQ2VsbFBvc2l0aW9u
TGlzdC5hcHBlbmQoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIGNvbHVtbkZpeGVkV2lk
dGggPSBmaXhlZFdpZHRoQ29sdW1uc1tjb2x1bW5JbmRleF07Ci0gICAgICAgICAgICBhdXRvIHdp
ZHRoQ29uc3RyYWludHMgPSAhY29sdW1uRml4ZWRXaWR0aCA/IHNsb3Qud2lkdGhDb25zdHJhaW50
cygpIDogRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyAqY29s
dW1uRml4ZWRXaWR0aCwgKmNvbHVtbkZpeGVkV2lkdGggfTsKLSAgICAgICAgICAgIGNvbHVtbklu
dHJpbnNpY1dpZHRoc1tjb2x1bW5JbmRleF0ubWluaW11bSA9IHN0ZDo6bWF4KHdpZHRoQ29uc3Ry
YWludHMubWluaW11bSwgY29sdW1uSW50cmluc2ljV2lkdGhzW2NvbHVtbkluZGV4XS5taW5pbXVt
KTsKLSAgICAgICAgICAgIGNvbHVtbkludHJpbnNpY1dpZHRoc1tjb2x1bW5JbmRleF0ubWF4aW11
bSA9IHN0ZDo6bWF4KHdpZHRoQ29uc3RyYWludHMubWF4aW11bSwgY29sdW1uSW50cmluc2ljV2lk
dGhzW2NvbHVtbkluZGV4XS5tYXhpbXVtKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29sdW1u
SGFzTm9uU3Bhbm5lZENlbGwpCi0gICAgICAgICAgICArK251bWJlck9mQWN0dWFsQ29sdW1uczsK
LSAgICB9Ci0KLSAgICAvLyA0LiBEaXN0cmlidXRlIHRoZSBzcGFubmluZyBtaW4vbWF4IHdpZHRo
cy4KLSAgICBmb3IgKGF1dG8gc3Bhbm5pbmdDZWxsUG9zaXRpb24gOiBzcGFubmluZ0NlbGxQb3Np
dGlvbkxpc3QpIHsKLSAgICAgICAgYXV0byYgc2xvdCA9ICpncmlkLnNsb3Qoc3Bhbm5pbmdDZWxs
UG9zaXRpb24pOwotICAgICAgICBhdXRvJiBjZWxsID0gc2xvdC5jZWxsKCk7Ci0gICAgICAgIEFT
U0VSVChzbG90Lmhhc0NvbHVtblNwYW4oKSk7Ci0gICAgICAgIGF1dG8gd2lkdGhDb25zdHJhaW50
c1RvRGlzdHJpYnV0ZSA9IHNsb3Qud2lkdGhDb25zdHJhaW50cygpOwotICAgICAgICBmb3IgKHNp
emVfdCBjb2x1bW5TcGFuSW5kZXggPSBjZWxsLnN0YXJ0Q29sdW1uKCk7IGNvbHVtblNwYW5JbmRl
eCA8IGNlbGwuZW5kQ29sdW1uKCk7ICsrY29sdW1uU3BhbkluZGV4KQotICAgICAgICAgICAgd2lk
dGhDb25zdHJhaW50c1RvRGlzdHJpYnV0ZSAtPSBjb2x1bW5JbnRyaW5zaWNXaWR0aHNbY29sdW1u
U3BhbkluZGV4XTsKLSAgICAgICAgLy8gPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogNTBw
eCI+PHRyPjx0ZCBjb2xzcGFuPTI+bG9uZyBsb25nIHRleHQ8L3RkPjwvdHI+PHRyPjx0ZD5sbzwv
dGQ+PHRkPnh0PC90ZD48dHI+PC90YWJsZT4KLSAgICAgICAgLy8gW2xvbmcgbG9uZyB0ZXh0XQot
ICAgICAgICAvLyBbbG9dICAgICAgICBbeHRdCi0gICAgICAgIC8vIFdoaWxlIGl0IGxvb2tzIGxp
a2UgdGhlIHNwYW5uaW5nIGNlbGwgaGFzIHRvIGRpc3RyaWJ1dGUgYWxsIGl0cyBzcGFubmluZyB3
aWR0aCwgdGhlIGJvcmRlci1zcGFjaW5nIHRha2VzIG1vc3Qgb2YgdGhlIHNwYWNlIGFuZAotICAg
ICAgICAvLyBubyBkaXN0cmlidXRpb24gaXMgbmVlZGVkIGF0IGFsbC4KLSAgICAgICAgd2lkdGhD
b25zdHJhaW50c1RvRGlzdHJpYnV0ZSAtPSAoY2VsbC5jb2x1bW5TcGFuKCkgLSAxKSAqIGdyaWQu
aG9yaXpvbnRhbFNwYWNpbmcoKTsKLSAgICAgICAgLy8gRklYTUU6IENoZWNrIGlmIGZpeGVkIHdp
ZHRoIGNvbHVtbnMgc2hvdWxkIGJlIHNraXBwZWQgaGVyZS4KLSAgICAgICAgd2lkdGhDb25zdHJh
aW50c1RvRGlzdHJpYnV0ZS5taW5pbXVtID0gc3RkOjptYXgoTGF5b3V0VW5pdCB7IH0sIHdpZHRo
Q29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWluaW11bSAvIGNlbGwuY29sdW1uU3BhbigpKTsKLSAg
ICAgICAgd2lkdGhDb25zdHJhaW50c1RvRGlzdHJpYnV0ZS5tYXhpbXVtID0gc3RkOjptYXgoTGF5
b3V0VW5pdCB7IH0sIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWF4aW11bSAvIGNlbGwu
Y29sdW1uU3BhbigpKTsKLSAgICAgICAgaWYgKHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUu
bWluaW11bSB8fCB3aWR0aENvbnN0cmFpbnRzVG9EaXN0cmlidXRlLm1heGltdW0pIHsKLSAgICAg
ICAgICAgIGZvciAoc2l6ZV90IGNvbHVtblNwYW5JbmRleCA9IGNlbGwuc3RhcnRDb2x1bW4oKTsg
Y29sdW1uU3BhbkluZGV4IDwgY2VsbC5lbmRDb2x1bW4oKTsgKytjb2x1bW5TcGFuSW5kZXgpCi0g
ICAgICAgICAgICAgICAgY29sdW1uSW50cmluc2ljV2lkdGhzW2NvbHVtblNwYW5JbmRleF0gKz0g
d2lkdGhDb25zdHJhaW50c1RvRGlzdHJpYnV0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8v
IDUuIFRoZSBmaW5hbCB0YWJsZSBtaW4vbWF4IHdpZHRocyBpcyBqdXN0IHRoZSBhY2N1bXVsYXRl
ZCBjb2x1bW4gY29uc3RyYWludHMuCi0gICAgYXV0byB0YWJsZVdpZHRoQ29uc3RyYWludHMgPSBJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKLSAgICBmb3IgKGF1dG8mIGNvbHVtbkludHJp
bnNpY1dpZHRoIDogY29sdW1uSW50cmluc2ljV2lkdGhzKQotICAgICAgICB0YWJsZVdpZHRoQ29u
c3RyYWludHMgKz0gY29sdW1uSW50cmluc2ljV2lkdGg7Ci0gICAgLy8gRXhhcGFuZCB0aGUgcHJl
ZmVycmVkIHdpZHRoIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgY2VsbCBzcGFjaW5nIChub3Rl
IHRoYXQgY29sdW1uIHNwYW5uZXJzIGNvdW50IGFzIG9uZSBjZWxsKS4KLSAgICB0YWJsZVdpZHRo
Q29uc3RyYWludHMgKz0gKG51bWJlck9mQWN0dWFsQ29sdW1ucyArIDEpICogZ3JpZC5ob3Jpem9u
dGFsU3BhY2luZygpOwotICAgIHJldHVybiB0YWJsZVdpZHRoQ29uc3RyYWludHM7Ci19Ci0KLXZv
aWQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUFuZERpc3RyaWJ1dGVFeHRyYVNwYWNl
KExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0
PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKQotewotICAgIC8vIENvbXB1dGUgYW5kIGJhbGFuY2Ug
dGhlIGNvbHVtbiBhbmQgcm93IHNwYWNlcy4KLSAgICBhdXRvJiBncmlkID0gZm9ybWF0dGluZ1N0
YXRlKCkudGFibGVHcmlkKCk7Ci0gICAgYXV0byYgY29sdW1ucyA9IGdyaWQuY29sdW1ucygpLmxp
c3QoKTsKLSAgICBhdXRvIHRhYmxlTGF5b3V0ID0gdGhpcy0+dGFibGVMYXlvdXQoKTsKLQotICAg
IC8vIENvbHVtbnMgZmlyc3QuCi0gICAgYXV0byBkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZXMg
PSB0YWJsZUxheW91dC5kaXN0cmlidXRlZEhvcml6b250YWxTcGFjZShhdmFpbGFibGVIb3Jpem9u
dGFsU3BhY2UpOwotICAgIEFTU0VSVChkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZXMuc2l6ZSgp
ID09IGNvbHVtbnMuc2l6ZSgpKTsKLSAgICBhdXRvIGNvbHVtbkxvZ2ljYWxMZWZ0ID0gZ3JpZC5o
b3Jpem9udGFsU3BhY2luZygpOwotICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29s
dW1uSW5kZXggPCBjb2x1bW5zLnNpemUoKTsgKytjb2x1bW5JbmRleCkgewotICAgICAgICBhdXRv
JiBjb2x1bW4gPSBjb2x1bW5zW2NvbHVtbkluZGV4XTsKLSAgICAgICAgY29sdW1uLnNldExvZ2lj
YWxMZWZ0KGNvbHVtbkxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgY29sdW1uLnNldExvZ2ljYWxXaWR0
aChkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZXNbY29sdW1uSW5kZXhdKTsKLSAgICAgICAgY29s
dW1uTG9naWNhbExlZnQgKz0gZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2VzW2NvbHVtbkluZGV4
XSArIGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBSb3dzIHNlY29u
ZC4KLSAgICBhdXRvJiByb3dzID0gZ3JpZC5yb3dzKCkubGlzdCgpOwotICAgIGZvciAoc2l6ZV90
IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkgewotICAg
ICAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5z
aXplKCk7ICsrY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGF1dG8mIHNsb3QgPSAqZ3JpZC5z
bG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0pOwotICAgICAgICAgICAgaWYgKHNsb3QuaXNS
b3dTcGFubmVkKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBsYXlv
dXRDZWxsKHNsb3QuY2VsbCgpLCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAgICAgICAg
ICAgaWYgKHNsb3QuaGFzUm93U3BhbigpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICAgICAgLy8gVGhlIG1pbmltdW0gaGVpZ2h0IG9mIGEgcm93ICh3aXRob3V0IHNwYW5uaW5n
LXJlbGF0ZWQgaGVpZ2h0IGRpc3RyaWJ1dGlvbikgaXMgZGVmaW5lZCBhcyB0aGUgaGVpZ2h0IG9m
IGFuIGh5cG90aGV0aWNhbAotICAgICAgICAgICAgLy8gbGluZWJveCBjb250YWluaW5nIHRoZSBj
ZWxscyBvcmlnaW5hdGluZyBpbiB0aGUgcm93LgotICAgICAgICAgICAgYXV0byYgY2VsbCA9IHNs
b3QuY2VsbCgpOwotICAgICAgICAgICAgY2VsbC5zZXRCYXNlbGluZShnZW9tZXRyeSgpLnVzZWRC
YXNlbGluZUZvckNlbGwoY2VsbC5ib3goKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXV0
byBkaXN0cmlidXRlZFZlcnRpY2FsU3BhY2VzID0gdGFibGVMYXlvdXQuZGlzdHJpYnV0ZWRWZXJ0
aWNhbFNwYWNlKGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpOwotICAgIEFTU0VSVChkaXN0cmlidXRl
ZFZlcnRpY2FsU3BhY2VzLnNpemUoKSA9PSByb3dzLnNpemUoKSk7Ci0gICAgYXV0byByb3dMb2dp
Y2FsVG9wID0gZ3JpZC52ZXJ0aWNhbFNwYWNpbmcoKTsKLSAgICBmb3IgKHNpemVfdCByb3dJbmRl
eCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKLSAgICAgICAgYXV0
byYgcm93ID0gcm93c1tyb3dJbmRleF07Ci0gICAgICAgIHJvdy5zZXRMb2dpY2FsSGVpZ2h0KGRp
c3RyaWJ1dGVkVmVydGljYWxTcGFjZXNbcm93SW5kZXhdKTsKLSAgICAgICAgcm93LnNldExvZ2lj
YWxUb3Aocm93TG9naWNhbFRvcCk7Ci0gICAgICAgIHJvd0xvZ2ljYWxUb3AgKz0gZGlzdHJpYnV0
ZWRWZXJ0aWNhbFNwYWNlc1tyb3dJbmRleF0gKyBncmlkLnZlcnRpY2FsU3BhY2luZygpOwotICAg
IH0KLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNv
cmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgKZGVsZXRl
ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMzBkZTEzNTQ1NjY1NTgxZWI5NDlhMjdiODBkZjRl
MTIyMjVlNmYuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250
ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
QykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFn
bWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNs
dWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRl
LmgiCi0jaW5jbHVkZSAiVGFibGVHcmlkLmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgot
I2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNw
YWNlIExheW91dCB7Ci0KLWNsYXNzIEludmFsaWRhdGlvblN0YXRlOwotLy8gVGhpcyBjbGFzcyBp
bXBsZW1lbnRzIHRoZSBsYXlvdXQgbG9naWMgZm9yIHRhYmxlIGZvcm1hdHRpbmcgY29udGV4dHMu
Ci0vLyBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjIvdGFibGVzLmh0bWwKLWNsYXNzIFRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQgZmluYWwgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQgewotICAg
IFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVGb3JtYXR0aW5nQ29udGV4dCk7Ci1wdWJsaWM6
Ci0gICAgVGFibGVGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRp
bmdDb250ZXh0Um9vdCwgVGFibGVGb3JtYXR0aW5nU3RhdGUmKTsKLSAgICB2b2lkIGxheW91dElu
Rmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxv
d0NvbnRlbnQmKSBvdmVycmlkZTsKLSAgICBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkg
Y29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICBzdGF0aWMgVW5pcXVlUmVmPFRhYmxlR3JpZD4gZW5zdXJl
VGFibGVHcmlkKGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gpOwotCi1wcml2YXRlOgotICAg
IGNsYXNzIFRhYmxlTGF5b3V0IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFRhYmxlTGF5b3V0KGNv
bnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmLCBjb25zdCBUYWJsZUdyaWQmKTsKLQotICAgICAg
ICB1c2luZyBEaXN0cmlidXRlZFNwYWNlcyA9IFZlY3RvcjxMYXlvdXRVbml0PjsKLSAgICAgICAg
RGlzdHJpYnV0ZWRTcGFjZXMgZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2UoTGF5b3V0VW5pdCBh
dmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAgICAgICBEaXN0cmlidXRlZFNwYWNlcyBkaXN0
cmlidXRlZFZlcnRpY2FsU3BhY2UoT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlVmVydGlj
YWxTcGFjZSk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRpbmdD
b250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0dGluZ0Nv
bnRleHQ7IH0KLQotICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiBtX2Zvcm1h
dHRpbmdDb250ZXh0OwotICAgICAgICBjb25zdCBUYWJsZUdyaWQmIG1fZ3JpZDsKLSAgICB9Owot
Ci0gICAgY2xhc3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5
IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIExheW91dFVuaXQgY2VsbEhlaWdoKGNvbnN0IENvbnRh
aW5lckJveCYpIGNvbnN0OwotICAgICAgICBFZGdlcyBjb21wdXRlZENlbGxCb3JkZXIoY29uc3Qg
VGFibGVHcmlkOjpDZWxsJikgY29uc3Q7Ci0gICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGNv
bXB1dGVkQ29sdW1uV2lkdGgoY29uc3QgQ29udGFpbmVyQm94JiBjb2x1bW5Cb3gpOwotICAgICAg
ICBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzRm9yQ2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmKTsKLSAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCB1c2VkQmFzZWxpbmVGb3JDZWxsKGNvbnN0IENvbnRhaW5lckJveCYg
Y2VsbEJveCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgVGFibGVGb3Jt
YXR0aW5nQ29udGV4dDsKLSAgICAgICAgR2VvbWV0cnkoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29u
dGV4dCYsIGNvbnN0IFRhYmxlR3JpZCYpOwotCi0gICAgICAgIGNvbnN0IFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8VGFi
bGVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpmb3JtYXR0
aW5nQ29udGV4dCgpKTsgfQotICAgICAgICBjb25zdCBUYWJsZUdyaWQmIG1fZ3JpZDsKLSAgICB9
OwotICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29uc3Qg
eyByZXR1cm4gR2VvbWV0cnkoKnRoaXMsIGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpKTsg
fQotCi0gICAgY2xhc3MgUXVpcmtzIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3Mg
ewotICAgIHB1YmxpYzoKLSAgICAgICAgUXVpcmtzKGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRl
eHQmKTsKLQotICAgICAgICBib29sIHNob3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFy
Z2luKGNvbnN0IENvbnRhaW5lckJveCYpIGNvbnN0OwotCi0gICAgICAgIGNvbnN0IFRhYmxlRm9y
bWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNh
c3Q8VGFibGVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6Zm9y
bWF0dGluZ0NvbnRleHQoKSk7IH0KLSAgICAgICAgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21l
dHJ5KCk7IH0KLSAgICB9OwotICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyBxdWly
a3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9Ci0KLSAgICBUYWJsZUZvcm1hdHRp
bmdDb250ZXh0OjpUYWJsZUxheW91dCB0YWJsZUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIFRhYmxl
TGF5b3V0KCp0aGlzLCBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKSk7IH0KLQotICAgIElu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
KCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBsYXlvdXRDZWxsKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYs
IExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0
PiB1c2VkQ2VsbEhlaWdodCA9IFdURjo6bnVsbG9wdCk7Ci0gICAgdm9pZCBzZXRVc2VkR2VvbWV0
cnlGb3JDZWxscyhMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSk7Ci0gICAgdm9p
ZCBzZXRVc2VkR2VvbWV0cnlGb3JSb3dzKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNw
YWNlKTsKLSAgICB2b2lkIHNldFVzZWRHZW9tZXRyeUZvclNlY3Rpb25zKGNvbnN0IENvbnN0cmFp
bnRzRm9ySW5GbG93Q29udGVudCYpOwotCi0gICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBj
b21wdXRlZFByZWZlcnJlZFdpZHRoRm9yQ29sdW1ucygpOwotICAgIHZvaWQgY29tcHV0ZUFuZERp
c3RyaWJ1dGVFeHRyYVNwYWNlKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBP
cHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKTsKLQotICAgIGNvbnN0
IFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBk
b3duY2FzdDxUYWJsZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRp
bmdTdGF0ZSgpKTsgfQotICAgIFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUo
KSB7IHJldHVybiBkb3duY2FzdDxUYWJsZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRl
eHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQotfTsKLQotaW5saW5lIFRhYmxlRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5OjpHZW9tZXRyeShjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiB0
YWJsZUZvcm1hdHRpbmdDb250ZXh0LCBjb25zdCBUYWJsZUdyaWQmIGdyaWQpCi0gICAgOiBGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnkodGFibGVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICAsIG1f
Z3JpZChncmlkKQotewotfQotCi1pbmxpbmUgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtz
OjpRdWlya3MoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYgdGFibGVGb3JtYXR0aW5nQ29u
dGV4dCkKLSAgICA6IEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3ModGFibGVGb3JtYXR0aW5nQ29u
dGV4dCkKLXsKLX0KLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JN
QVRUSU5HX0NPTlRFWFQoVGFibGVGb3JtYXR0aW5nQ29udGV4dCwgaXNUYWJsZUZvcm1hdHRpbmdD
b250ZXh0KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3Rh
YmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2Vv
bWV0cnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzMyMzkyNjk0ZjZlN2E4
MjQyOWMyMGE1ZTYxMDk4NDBlMmFlZGM4Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFi
bGVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSAr
MCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgot
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQotCi0jaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5
b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCi0jaW5jbHVkZSAi
TGF5b3V0RGVzY2VuZGFudEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRh
aW5pbmdCbG9jay5oIgotI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCi0KLW5hbWVz
cGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1MYXlvdXRVbml0IFRhYmxlRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpjZWxsSGVpZ2goY29uc3QgQ29udGFpbmVyQm94JiBj
ZWxsQm94KSBjb25zdAotewotICAgIEFTU0VSVChjZWxsQm94LmlzSW5GbG93KCkpOwotICAgIGF1
dG8gY29udGVudEhlaWdodCA9IExheW91dFVuaXQgeyB9OwotICAgIGlmIChmb3JtYXR0aW5nQ29u
dGV4dCgpLnF1aXJrcygpLnNob3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luKGNl
bGxCb3gpKSB7Ci0gICAgICAgIEFTU0VSVChjZWxsQm94LmZpcnN0SW5GbG93Q2hpbGQoKSk7Ci0g
ICAgICAgIGF1dG8gZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgp
OwotICAgICAgICBhdXRvJiBmaXJzdEluRmxvd0NoaWxkID0gKmNlbGxCb3guZmlyc3RJbkZsb3dD
aGlsZCgpOwotICAgICAgICBhdXRvJiBsYXN0SW5GbG93Q2hpbGQgPSAqY2VsbEJveC5sYXN0SW5G
bG93Q2hpbGQoKTsKLSAgICAgICAgYXV0byYgZmlyc3RJbkZsb3dDaGlsZEdlb21ldHJ5ID0gZm9y
bWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goZmlyc3RJbkZsb3dDaGlsZCwgRXNjYXBlUmVh
c29uOjpUYWJsZVF1aXJrTmVlZHNHZW9tZXRyeUZyb21Fc3RhYmxpc2hlZEZvcm1hdHRpbmdDb250
ZXh0KTsKLSAgICAgICAgYXV0byYgbGFzdEluRmxvd0NoaWxkR2VvbWV0cnkgPSBmb3JtYXR0aW5n
Q29udGV4dC5nZW9tZXRyeUZvckJveChsYXN0SW5GbG93Q2hpbGQsIEVzY2FwZVJlYXNvbjo6VGFi
bGVRdWlya05lZWRzR2VvbWV0cnlGcm9tRXN0YWJsaXNoZWRGb3JtYXR0aW5nQ29udGV4dCk7Ci0K
LSAgICAgICAgYXV0byB0b3AgPSBmaXJzdEluRmxvd0NoaWxkLnN0eWxlKCkuaGFzTWFyZ2luQmVm
b3JlUXVpcmsoKSA/IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGZpcnN0SW5GbG93Q2hpbGRH
ZW9tZXRyeSkudG9wKCkgOiBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChmaXJzdEluRmxvd0No
aWxkR2VvbWV0cnkpLnRvcCgpOwotICAgICAgICBhdXRvIGJvdHRvbSA9IGxhc3RJbkZsb3dDaGls
ZC5zdHlsZSgpLmhhc01hcmdpbkFmdGVyUXVpcmsoKSA/IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hS
ZWN0KGxhc3RJbkZsb3dDaGlsZEdlb21ldHJ5KS5ib3R0b20oKSA6IEJveEdlb21ldHJ5OjptYXJn
aW5Cb3hSZWN0KGxhc3RJbkZsb3dDaGlsZEdlb21ldHJ5KS5ib3R0b20oKTsKLSAgICAgICAgY29u
dGVudEhlaWdodCA9IGJvdHRvbSAtIHRvcDsKLSAgICB9IGVsc2UKLSAgICAgICAgY29udGVudEhl
aWdodCA9IGNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QoY2VsbEJveCk7Ci0g
ICAgcmV0dXJuIHN0ZDo6bWF4KGNvbXB1dGVkSGVpZ2h0KGNlbGxCb3gpLnZhbHVlT3IoMF9sdSks
IGNvbnRlbnRIZWlnaHQpOwotfQotCi1FZGdlcyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeTo6Y29tcHV0ZWRDZWxsQm9yZGVyKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgY29u
c3QKLXsKLSAgICBhdXRvJiBjZWxsQm94ID0gY2VsbC5ib3goKTsKLSAgICBhdXRvIGJvcmRlciA9
IGNvbXB1dGVkQm9yZGVyKGNlbGxCb3gpOwotICAgIGF1dG8gY29sbGFwc2VkQm9yZGVyID0gbV9n
cmlkLmNvbGxhcHNlZEJvcmRlcigpOwotICAgIGlmICghY29sbGFwc2VkQm9yZGVyKQotICAgICAg
ICByZXR1cm4gYm9yZGVyOwotCi0gICAgLy8gV2UgbWlnaHQgd2FudCB0byBjYWNoZSB0aGVzZSBj
b2xsYXBzZWQgYm9yZGVycyBvbiB0aGUgZ3JpZC4KLSAgICBhdXRvIGNlbGxQb3NpdGlvbiA9IGNl
bGwucG9zaXRpb24oKTsKLSAgICAvLyBDb2xsYXBzZWQgYm9yZGVyIGxlZnQgZnJvbSB0YWJsZSBh
bmQgYWRqYWNlbnQgY2VsbHMuCi0gICAgaWYgKCFjZWxsUG9zaXRpb24uY29sdW1uKQotICAgICAg
ICBib3JkZXIuaG9yaXpvbnRhbC5sZWZ0ID0gY29sbGFwc2VkQm9yZGVyLT5ob3Jpem9udGFsLmxl
ZnQgLyAyOwotICAgIGVsc2UgewotICAgICAgICBhdXRvIGFkamFjZW50Qm9yZGVyUmlnaHQgPSBj
b21wdXRlZEJvcmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4gLSAxLCBjZWxs
UG9zaXRpb24ucm93IH0pLT5jZWxsKCkuYm94KCkpLmhvcml6b250YWwucmlnaHQ7Ci0gICAgICAg
IGJvcmRlci5ob3Jpem9udGFsLmxlZnQgPSBzdGQ6Om1heChib3JkZXIuaG9yaXpvbnRhbC5sZWZ0
LCBhZGphY2VudEJvcmRlclJpZ2h0KSAvIDI7Ci0gICAgfQotICAgIC8vIENvbGxhcHNlZCBib3Jk
ZXIgcmlnaHQgZnJvbSB0YWJsZSBhbmQgYWRqYWNlbnQgY2VsbHMuCi0gICAgaWYgKGNlbGxQb3Np
dGlvbi5jb2x1bW4gPT0gbV9ncmlkLmNvbHVtbnMoKS5zaXplKCkgLSAxKQotICAgICAgICBib3Jk
ZXIuaG9yaXpvbnRhbC5yaWdodCA9IGNvbGxhcHNlZEJvcmRlci0+aG9yaXpvbnRhbC5yaWdodCAv
IDI7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJMZWZ0ID0gY29tcHV0
ZWRCb3JkZXIobV9ncmlkLnNsb3QoeyBjZWxsUG9zaXRpb24uY29sdW1uICsgMSwgY2VsbFBvc2l0
aW9uLnJvdyB9KS0+Y2VsbCgpLmJveCgpKS5ob3Jpem9udGFsLmxlZnQ7Ci0gICAgICAgIGJvcmRl
ci5ob3Jpem9udGFsLnJpZ2h0ID0gc3RkOjptYXgoYm9yZGVyLmhvcml6b250YWwucmlnaHQsIGFk
amFjZW50Qm9yZGVyTGVmdCkgLyAyOwotICAgIH0KLSAgICAvLyBDb2xsYXBzZWQgYm9yZGVyIHRv
cCBmcm9tIHRhYmxlLCByb3cgYW5kIGFkamFjZW50IGNlbGxzLgotICAgIGF1dG8mIHJvd3MgPSBt
X2dyaWQucm93cygpLmxpc3QoKTsKLSAgICBpZiAoIWNlbGxQb3NpdGlvbi5yb3cpCi0gICAgICAg
IGJvcmRlci52ZXJ0aWNhbC50b3AgPSBjb2xsYXBzZWRCb3JkZXItPnZlcnRpY2FsLnRvcCAvIDI7
Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJCb3R0b20gPSBjb21wdXRl
ZEJvcmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4sIGNlbGxQb3NpdGlvbi5y
b3cgLSAxIH0pLT5jZWxsKCkuYm94KCkpLnZlcnRpY2FsLmJvdHRvbTsKLSAgICAgICAgYXV0byBh
ZGphY2VudFJvd0JvdHRvbSA9IGNvbXB1dGVkQm9yZGVyKHJvd3NbY2VsbFBvc2l0aW9uLnJvdyAt
IDFdLmJveCgpKS52ZXJ0aWNhbC5ib3R0b207Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRDb2xsYXBz
ZWRCb3JkZXIgPSBzdGQ6Om1heChhZGphY2VudEJvcmRlckJvdHRvbSwgYWRqYWNlbnRSb3dCb3R0
b20pOwotICAgICAgICBib3JkZXIudmVydGljYWwudG9wID0gc3RkOjptYXgoYm9yZGVyLnZlcnRp
Y2FsLnRvcCwgYWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIpIC8gMjsKLSAgICB9Ci0gICAgLy8gQ29s
bGFwc2VkIGJvcmRlciBib3R0b20gZnJvbSB0YWJsZSwgcm93IGFuZCBhZGphY2VudCBjZWxscy4K
LSAgICBpZiAoY2VsbFBvc2l0aW9uLnJvdyA9PSBtX2dyaWQucm93cygpLnNpemUoKSAtIDEpCi0g
ICAgICAgIGJvcmRlci52ZXJ0aWNhbC5ib3R0b20gPSBjb2xsYXBzZWRCb3JkZXItPnZlcnRpY2Fs
LmJvdHRvbSAvIDI7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJUb3Ag
PSBjb21wdXRlZEJvcmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4sIGNlbGxQ
b3NpdGlvbi5yb3cgKyAxIH0pLT5jZWxsKCkuYm94KCkpLnZlcnRpY2FsLnRvcDsKLSAgICAgICAg
YXV0byBhZGphY2VudFJvd1RvcCA9IGNvbXB1dGVkQm9yZGVyKHJvd3NbY2VsbFBvc2l0aW9uLnJv
dyArIDFdLmJveCgpKS52ZXJ0aWNhbC50b3A7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRDb2xsYXBz
ZWRCb3JkZXIgPSBzdGQ6Om1heChhZGphY2VudEJvcmRlclRvcCwgYWRqYWNlbnRSb3dUb3ApOwot
ICAgICAgICBib3JkZXIudmVydGljYWwuYm90dG9tID0gc3RkOjptYXgoYm9yZGVyLnZlcnRpY2Fs
LmJvdHRvbSwgYWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIpIC8gMjsKLSAgICB9Ci0gICAgcmV0dXJu
IGJvcmRlcjsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gVGFibGVGb3JtYXR0aW5nQ29udGV4
dDo6R2VvbWV0cnk6OmNvbXB1dGVkQ29sdW1uV2lkdGgoY29uc3QgQ29udGFpbmVyQm94JiBjb2x1
bW5Cb3gpCi17Ci0gICAgLy8gQ2hlY2sgYm90aCBzdHlsZSBhbmQgPGNvbD4ncyB3aWR0aCBhdHRy
aWJ1dGUuCi0gICAgLy8gRklYTUU6IEZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIGNhbGN1bGF0
ZWQgdmFsdWVzLCBsaWtlIDxjb2wgc3R5bGU9IndpZHRoOiAxMCUiPi4KLSAgICBpZiAoYXV0byBj
b21wdXRlZFdpZHRoVmFsdWUgPSBjb21wdXRlZFdpZHRoKGNvbHVtbkJveCwgeyB9KSkKLSAgICAg
ICAgcmV0dXJuIGNvbXB1dGVkV2lkdGhWYWx1ZTsKLSAgICByZXR1cm4gY29sdW1uQm94LmNvbHVt
bldpZHRoKCk7Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzRm9yQ2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpCi17Ci0gICAgYXV0byYg
Y2VsbEJveCA9IGNlbGwuYm94KCk7Ci0gICAgYXV0byYgc3R5bGUgPSBjZWxsQm94LnN0eWxlKCk7
Ci0KLSAgICBhdXRvIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IFsmXSgpIC0+
IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsKLSAgICAgICAg
Ly8gRXZlbiBmaXhlZCB3aWR0aCBjZWxscyBleHBhbmQgdG8gdGhlaXIgbWluaW11bSBjb250ZW50
IHdpZHRoCi0gICAgICAgIC8vIDx0ZCBzdHlsZT0id2lkdGg6IDEwcHgiPnRlc3RfY29udGVudDwv
dGQ+IHdpbGwgc2l6ZSB0byBtYXgobWluaW11bSBjb250ZW50IHdpZHRoLCBjb21wdXRlZCB3aWR0
aCkuCi0gICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IEZvcm1hdHRpbmdD
b250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKLSAgICAgICAgaWYgKGNlbGxC
b3guaGFzQ2hpbGQoKSkKLSAgICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBM
YXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjZWxsQm94LCBsYXlvdXRTdGF0
ZSgpKS0+Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGlmIChh
dXRvIGZpeGVkV2lkdGggPSBmaXhlZFZhbHVlKHN0eWxlLmxvZ2ljYWxXaWR0aCgpKSkKLSAgICAg
ICAgICAgIHJldHVybiB7IHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11
bSwgKmZpeGVkV2lkdGgpLCBzdGQ6Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmlt
dW0sICpmaXhlZFdpZHRoKSB9OwotICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJh
aW50czsKLSAgICB9OwotICAgIC8vIEZJWE1FIENoZWNrIGZvciBib3gtc2l6aW5nOiBib3JkZXIt
Ym94OwotICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGNvbnN0cmFpbkJ5TWlu
TWF4V2lkdGgoY2VsbEJveCwgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkpOwot
ICAgIC8vIEV4cGFuZCB3aXRoIGJvcmRlcgotICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMu
ZXhwYW5kKGNvbXB1dGVkQ2VsbEJvcmRlcihjZWxsKS53aWR0aCgpKTsKLSAgICAvLyBwYWRkaW5n
Ci0gICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQoZml4ZWRWYWx1ZShzdHlsZS5w
YWRkaW5nTGVmdCgpKS52YWx1ZU9yKDApICsgZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nUmlnaHQo
KSkudmFsdWVPcigwKSk7Ci0gICAgLy8gYW5kIG1hcmdpbgotICAgIGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMuZXhwYW5kKGZpeGVkVmFsdWUoc3R5bGUubWFyZ2luU3RhcnQoKSkudmFsdWVPcigw
KSArIGZpeGVkVmFsdWUoc3R5bGUubWFyZ2luRW5kKCkpLnZhbHVlT3IoMCkpOwotICAgIHJldHVy
biBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOwotfQotCi0KLUlubGluZUxheW91dFVuaXQgVGFi
bGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OnVzZWRCYXNlbGluZUZvckNlbGwoY29uc3Qg
Q29udGFpbmVyQm94JiBjZWxsQm94KQotewotICAgIC8vIFRoZSBiYXNlbGluZSBvZiBhIGNlbGwg
aXMgZGVmaW5lZCBhcyB0aGUgYmFzZWxpbmUgb2YgdGhlIGZpcnN0IGluLWZsb3cgbGluZSBib3gg
aW4gdGhlIGNlbGwsCi0gICAgLy8gb3IgdGhlIGZpcnN0IGluLWZsb3cgdGFibGUtcm93IGluIHRo
ZSBjZWxsLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCi0gICAgLy8gSWYgdGhlcmUgaXMgbm8gc3Vj
aCBsaW5lIGJveCwgdGhlIGJhc2VsaW5lIGlzIHRoZSBib3R0b20gb2YgY29udGVudCBlZGdlIG9m
IHRoZSBjZWxsIGJveC4KLSAgICBpZiAoY2VsbEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRp
bmdDb250ZXh0KCkpCi0gICAgICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkSW5s
aW5lRm9ybWF0dGluZ1N0YXRlKGNlbGxCb3gpLmxpbmVzKClbMF0uYmFzZWxpbmUoKTsKLSAgICBm
b3IgKGF1dG8mIGNlbGxEZXNjZW5kYW50IDogZGVzY2VuZGFudHNPZlR5cGU8Q29udGFpbmVyQm94
PihjZWxsQm94KSkgewotICAgICAgICBpZiAoY2VsbERlc2NlbmRhbnQuZXN0YWJsaXNoZXNJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICBhdXRvJiBpbmxpbmVGb3JtYXR0
aW5nU3RhdGVGb3JDZWxsID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZElubGluZUZvcm1hdHRp
bmdTdGF0ZShjZWxsRGVzY2VuZGFudCk7Ci0gICAgICAgICAgICBpZiAoIWlubGluZUZvcm1hdHRp
bmdTdGF0ZUZvckNlbGwubGluZXMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGlubGluZUZvcm1hdHRpbmdTdGF0ZUZvckNlbGwubGluZXMoKVswXS5iYXNlbGluZSgpOwotICAg
ICAgICB9Ci0gICAgICAgIGlmIChjZWxsRGVzY2VuZGFudC5lc3RhYmxpc2hlc1RhYmxlRm9ybWF0
dGluZ0NvbnRleHQoKSkKLSAgICAgICAgICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmVzdGFibGlz
aGVkVGFibGVGb3JtYXR0aW5nU3RhdGUoY2VsbERlc2NlbmRhbnQpLnRhYmxlR3JpZCgpLnJvd3Mo
KS5saXN0KClbMF0uYmFzZWxpbmUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1hdHRpbmdDb250
ZXh0KCkuZ2VvbWV0cnlGb3JCb3goY2VsbEJveCkuY29udGVudEJveEJvdHRvbSgpOwotfQotCi19
Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9y
bWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NGE2MmRmZjA3MTRhZDY4ZmE3ODk2ODVm
YmJiMjEzNzRmZjE1MzIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRp
bmdDb250ZXh0UXVpcmtzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
LSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29u
dGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNs
dWRlICJMYXlvdXRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNs
dWRlICJMYXlvdXRTdGF0ZS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5
b3V0IHsKLQotYm9vbCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OnNob3VsZElnbm9y
ZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCkg
Y29uc3QKLXsKLSAgICAvLyBOb3JtYWxseSBCRkMgcm9vdCBjb250ZW50IGhlaWdodCB0YWtlcyB0
aGUgbWFyZ2luIGJveCBvZiB0aGUgY2hpbGQgY29udGVudCBhcyB2ZXJ0aWNhbCBtYXJnaW5zIGRv
bid0IGNvbGxhcHNlIHdpdGggQkZDIHJvb3RzLAotICAgIC8vIGJ1dCB0YWJsZSBjZWxsIGJveGVz
IGRvIGNvbGxhcHNlIHRoZWlyIChub24tZXhpc3RpbmcpIG1hcmdpbnMgd2l0aCBjaGlsZCBxdWly
ayBtYXJnaW5zIChzbyBtdWNoIHF1aXJrKSwgc28gaGVyZSB3ZSBjaGVjawotICAgIC8vIGlmIHRo
ZSBjb250ZW50IGhlaWdodCBzaG91bGQgaW5jbHVkZSBtYXJnaW5zIG9yIG5vdC4KLSAgICAvLyBl
LmcgPHRhYmxlPjx0cj48dGQ+PHA+dGV4dCBjb250ZW50PC90ZD48L3RyPjwvdGFibGU+IDwtIDxw
PidzIHF1aXJrIG1hcmdpbiBjb2xsYXBzZXMgd2l0aCB0aGUgPHRkPiBzbyBpdHMgY29udGVudAot
ICAgIC8vIGhlaWdodCBzaG91bGQgbm90IGluY2x1ZGUgdmVydGljYWwgbWFyZ2lucy4KLSAgICBp
ZiAoIWxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBpZiAoY2VsbEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIWNlbGxCb3guaGFzSW5GbG93Q2hpbGQoKSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBjZWxsQm94LmZpcnN0SW5GbG93Q2hp
bGQoKS0+c3R5bGUoKS5oYXNNYXJnaW5CZWZvcmVRdWlyaygpIHx8IGNlbGxCb3gubGFzdEluRmxv
d0NoaWxkKCktPnN0eWxlKCkuaGFzTWFyZ2luQWZ0ZXJRdWlyaygpOwotfQotCi19Ci19Ci0KLSNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9U
YWJsZUZvcm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3Jt
YXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMTMxMGVmNWUxMzI2MGQxYTMxZmIxZDllODZlMmM2YjYyM2E2NTk4Ny4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcAorKysgL2Rldi9udWxs
CkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBh
cmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5j
bHVkZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgotI2lu
Y2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoVGFibGVGb3Jt
YXR0aW5nU3RhdGUpOwotCi1UYWJsZUZvcm1hdHRpbmdTdGF0ZTo6VGFibGVGb3JtYXR0aW5nU3Rh
dGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91
dFN0YXRlLCBjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KQotICAgIDogRm9ybWF0dGluZ1N0
YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OlRhYmxlLCBsYXlvdXRTdGF0ZSkKLSAg
ICAsIG1fdGFibGVHcmlkKFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmVuc3VyZVRhYmxlR3JpZCh0
YWJsZUJveCkpCi17Ci19Ci0KLVRhYmxlRm9ybWF0dGluZ1N0YXRlOjp+VGFibGVGb3JtYXR0aW5n
U3RhdGUoKQotewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuaCBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuaApkZWxl
dGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxZTRhZjBiOTZhY2M0ZDM0MzQ1YWE5Y2Y2ZDgz
Zjc4ZDUzYzc2Zi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0
YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdt
YSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1
ZGUgIkZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIlRhYmxlR3JpZC5oIgotI2luY2x1ZGUg
PHd0Zi9Jc29NYWxsb2MuaD4KLSNpbmNsdWRlIDx3dGYvVW5pcXVlUmVmLmg+Ci0KLW5hbWVzcGFj
ZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi0vLyBUYWJsZUZvcm1hdHRpbmdTdGF0
ZSBob2xkcyB0aGUgc3RhdGUgZm9yIGEgcGFydGljdWxhciB0YWJsZSBmb3JtYXR0aW5nIGNvbnRl
eHQgdHJlZS4KLWNsYXNzIFRhYmxlRm9ybWF0dGluZ1N0YXRlIDogcHVibGljIEZvcm1hdHRpbmdT
dGF0ZSB7Ci0gICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChUYWJsZUZvcm1hdHRpbmdTdGF0ZSk7
Ci1wdWJsaWM6Ci0gICAgVGFibGVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYs
IExheW91dFN0YXRlJiwgY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCk7Ci0gICAgflRhYmxl
Rm9ybWF0dGluZ1N0YXRlKCk7Ci0KLSAgICBUYWJsZUdyaWQmIHRhYmxlR3JpZCgpIHsgcmV0dXJu
IG1fdGFibGVHcmlkOyB9Ci0gICAgY29uc3QgVGFibGVHcmlkJiB0YWJsZUdyaWQoKSBjb25zdCB7
IHJldHVybiBtX3RhYmxlR3JpZDsgfQotCi1wcml2YXRlOgotICAgIFVuaXF1ZVJlZjxUYWJsZUdy
aWQ+IG1fdGFibGVHcmlkOwotfTsKLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xB
WU9VVF9GT1JNQVRUSU5HX1NUQVRFKFRhYmxlRm9ybWF0dGluZ1N0YXRlLCBpc1RhYmxlRm9ybWF0
dGluZ1N0YXRlKCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L3Rh
YmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAzYzQxZDhkMDhhNTI1ZTc1NmFiY2RjYjFhMjE1YzlmNDY1NmFjZmI2Li4wMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90
YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlRhYmxlR3Jp
ZC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRl
IDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3Bh
Y2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKFRhYmxlR3JpZCk7Ci0K
LVRhYmxlR3JpZDo6Q29sdW1uOjpDb2x1bW4oY29uc3QgQ29udGFpbmVyQm94KiBjb2x1bW5Cb3gp
Ci0gICAgOiBtX2xheW91dEJveChtYWtlV2Vha1B0cihjb2x1bW5Cb3gpKQotewotfQotCi12b2lk
IFRhYmxlR3JpZDo6Q29sdW1uOjpzZXRMb2dpY2FsV2lkdGgoTGF5b3V0VW5pdCBjb21wdXRlZExv
Z2ljYWxXaWR0aCkKLXsKLSNpZiBBU1NFUlRfRU5BQkxFRAotICAgIG1faGFzQ29tcHV0ZWRXaWR0
aCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX2NvbXB1dGVkTG9naWNhbFdpZHRoID0gY29tcHV0ZWRM
b2dpY2FsV2lkdGg7Ci19Ci0KLUxheW91dFVuaXQgVGFibGVHcmlkOjpDb2x1bW46OmxvZ2ljYWxX
aWR0aCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzQ29tcHV0ZWRXaWR0aCk7Ci0gICAgcmV0
dXJuIG1fY29tcHV0ZWRMb2dpY2FsV2lkdGg7Ci19Ci0KLXZvaWQgVGFibGVHcmlkOjpDb2x1bW46
OnNldExvZ2ljYWxMZWZ0KExheW91dFVuaXQgY29tcHV0ZWRMb2dpY2FsTGVmdCkKLXsKLSNpZiBB
U1NFUlRfRU5BQkxFRAotICAgIG1faGFzQ29tcHV0ZWRMZWZ0ID0gdHJ1ZTsKLSNlbmRpZgotICAg
IG1fY29tcHV0ZWRMb2dpY2FsTGVmdCA9IGNvbXB1dGVkTG9naWNhbExlZnQ7Ci19Ci0KLUxheW91
dFVuaXQgVGFibGVHcmlkOjpDb2x1bW46OmxvZ2ljYWxMZWZ0KCkgY29uc3QKLXsKLSAgICBBU1NF
UlQobV9oYXNDb21wdXRlZExlZnQpOwotICAgIHJldHVybiBtX2NvbXB1dGVkTG9naWNhbExlZnQ7
Ci19Ci0KLWJvb2wgVGFibGVHcmlkOjpDb2x1bW46OmlzRml4ZWRXaWR0aCgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGhhc0ZpeGVkV2lkdGhDZWxsKCkgfHwgKGJveCgpICYmIGJveCgpLT5jb2x1bW5X
aWR0aCgpKTsKLX0KLQotdm9pZCBUYWJsZUdyaWQ6OkNvbHVtbnM6OmFkZENvbHVtbihjb25zdCBD
b250YWluZXJCb3gmIGNvbHVtbkJveCkKLXsKLSAgICBtX2NvbHVtbkxpc3QuYXBwZW5kKHsgJmNv
bHVtbkJveCB9KTsKLX0KLQotdm9pZCBUYWJsZUdyaWQ6OkNvbHVtbnM6OmFkZEFub255bW91c0Nv
bHVtbigpCi17Ci0gICAgbV9jb2x1bW5MaXN0LmFwcGVuZCh7IG51bGxwdHIgfSk7Ci19Ci0KLWJv
b2wgVGFibGVHcmlkOjpDb2x1bW5zOjpoYXNGaXhlZENvbHVtbnNPbmx5KCkgY29uc3QKLXsKLSAg
ICBmb3IgKGF1dG8mIGNvbHVtbiA6IG1fY29sdW1uTGlzdCkgewotICAgICAgICBpZiAoIWNvbHVt
bi5pc0ZpeGVkV2lkdGgoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAg
cmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVGFibGVHcmlkOjpSb3dzOjphZGRSb3coY29uc3QgQ29u
dGFpbmVyQm94JiByb3dCb3gpCi17Ci0gICAgbV9yb3dMaXN0LmFwcGVuZCh7IHJvd0JveCB9KTsK
LX0KLQotVGFibGVHcmlkOjpSb3c6OlJvdyhjb25zdCBDb250YWluZXJCb3gmIHJvd0JveCkKLSAg
ICA6IG1fbGF5b3V0Qm94KG1ha2VXZWFrUHRyKHJvd0JveCkpCi17Ci19Ci0KLVRhYmxlR3JpZDo6
Q2VsbDo6Q2VsbChjb25zdCBDb250YWluZXJCb3gmIGNlbGxCb3gsIFNsb3RQb3NpdGlvbiBwb3Np
dGlvbiwgQ2VsbFNwYW4gc3BhbikKLSAgICA6IG1fbGF5b3V0Qm94KG1ha2VXZWFrUHRyKGNlbGxC
b3gpKQotICAgICwgbV9wb3NpdGlvbihwb3NpdGlvbikKLSAgICAsIG1fc3BhbihzcGFuKQotewot
fQotCi1ib29sIFRhYmxlR3JpZDo6Q2VsbDo6aXNGaXhlZFdpZHRoKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gYm94KCkuc3R5bGUoKS5sb2dpY2FsV2lkdGgoKS5pc0ZpeGVkKCk7Ci19Ci0KLVRhYmxl
R3JpZDo6U2xvdDo6U2xvdChDZWxsJiBjZWxsLCBib29sIGlzQ29sdW1uU3Bhbm5lZCwgYm9vbCBp
c1Jvd1NwYW5uZWQpCi0gICAgOiBtX2NlbGwobWFrZVdlYWtQdHIoY2VsbCkpCi0gICAgLCBtX2lz
Q29sdW1uU3Bhbm5lZChpc0NvbHVtblNwYW5uZWQpCi0gICAgLCBtX2lzUm93U3Bhbm5lZChpc1Jv
d1NwYW5uZWQpCi17Ci19Ci0KLVRhYmxlR3JpZDo6VGFibGVHcmlkKCkKLXsKLX0KLQotVGFibGVH
cmlkOjpTbG90KiBUYWJsZUdyaWQ6OnNsb3QoU2xvdFBvc2l0aW9uIHBvc2l0aW9uKQotewotICAg
IHJldHVybiBtX3Nsb3RNYXAuZ2V0KHBvc2l0aW9uKTsKLX0KLQotdm9pZCBUYWJsZUdyaWQ6OmFw
cGVuZENlbGwoY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94KQotewotICAgIGF1dG8gcm93U3Bh
biA9IGNlbGxCb3gucm93U3BhbigpOwotICAgIGF1dG8gY29sdW1uU3BhbiA9IGNlbGxCb3guY29s
dW1uU3BhbigpOwotICAgIGF1dG8gaXNJbk5ld1JvdyA9ICFjZWxsQm94LnByZXZpb3VzU2libGlu
ZygpOwotICAgIGF1dG8gaW5pdGlhbFNsb3RQb3NpdGlvbiA9IFNsb3RQb3NpdGlvbiB7IH07Ci0K
LSAgICBpZiAoIW1fY2VsbHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGF1dG8mIGxhc3RDZWxsID0g
bV9jZWxscy5sYXN0KCk7Ci0gICAgICAgIGF1dG8gbGFzdFNsb3RQb3NpdGlvbiA9IGxhc3RDZWxs
LT5wb3NpdGlvbigpOwotICAgICAgICAvLyBGaXJzdCB0YWJsZSBjZWxsIGluIHRoaXMgcm93Pwot
ICAgICAgICBpZiAoaXNJbk5ld1JvdykKLSAgICAgICAgICAgIGluaXRpYWxTbG90UG9zaXRpb24g
PSBTbG90UG9zaXRpb24geyAwLCBsYXN0U2xvdFBvc2l0aW9uLnJvdyArIDEgfTsKLSAgICAgICAg
ZWxzZQotICAgICAgICAgICAgaW5pdGlhbFNsb3RQb3NpdGlvbiA9IFNsb3RQb3NpdGlvbiB7IGxh
c3RTbG90UG9zaXRpb24uY29sdW1uICsgMSwgbGFzdFNsb3RQb3NpdGlvbi5yb3cgfTsKLQotICAg
ICAgICAvLyBQaWNrIHRoZSBuZXh0IGF2YWlsYWJsZSBzbG90IGJ5IGF2b2lkaW5nIHJvdyBhbmQg
Y29sdW1uIHNwYW5uZXJzLgotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaWYg
KCFtX3Nsb3RNYXAuY29udGFpbnMoaW5pdGlhbFNsb3RQb3NpdGlvbikpCi0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICArK2luaXRpYWxTbG90UG9zaXRpb24uY29sdW1uOwotICAg
ICAgICB9Ci0gICAgfQotICAgIGF1dG8gY2VsbCA9IG1ha2VVbmlxdWU8Q2VsbD4oY2VsbEJveCwg
aW5pdGlhbFNsb3RQb3NpdGlvbiwgQ2VsbFNwYW4geyBjb2x1bW5TcGFuLCByb3dTcGFuIH0pOwot
ICAgIC8vIFJvdyBhbmQgY29sdW1uIHNwYW5uZXJzIGNyZWF0ZSBhZGRpdGlvbmFsIHNsb3RzLgot
ICAgIGZvciAoc2l6ZV90IHJvdyA9IDA7IHJvdyA8IHJvd1NwYW47ICsrcm93KSB7Ci0gICAgICAg
IGZvciAoYXV0byBjb2x1bW4gPSBjZWxsLT5zdGFydENvbHVtbigpOyBjb2x1bW4gPCBjZWxsLT5l
bmRDb2x1bW4oKTsgKytjb2x1bW4pIHsKLSAgICAgICAgICAgIGF1dG8gcG9zaXRpb24gPSBTbG90
UG9zaXRpb24geyBjb2x1bW4sIGNlbGwtPnN0YXJ0Um93KCkgKyByb3cgfTsKLSAgICAgICAgICAg
IEFTU0VSVCghbV9zbG90TWFwLmNvbnRhaW5zKHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAvLyBU
aGlzIHNsb3QgaXMgc3Bhbm5lZCBieSBhIGNlbGwgYXQgdGhlIGluaXRpYWwgc2xvdyBwb3NpdGlv
bi4KLSAgICAgICAgICAgIGF1dG8gaXNDb2x1bW5TcGFubmVkID0gY29sdW1uICE9IGNlbGwtPnN0
YXJ0Q29sdW1uKCk7Ci0gICAgICAgICAgICBhdXRvIGlzUm93U3Bhbm5lZCA9ICEhcm93OwotICAg
ICAgICAgICAgbV9zbG90TWFwLmFkZChwb3NpdGlvbiwgbWFrZVVuaXF1ZTxTbG90PigqY2VsbCwg
aXNDb2x1bW5TcGFubmVkLCBpc1Jvd1NwYW5uZWQpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAv
LyBJbml0aWFsaXplIGNvbHVtbnMvcm93cyBpZiBuZWVkZWQuCi0gICAgYXV0byBtaXNzaW5nTnVt
YmVyT2ZDb2x1bW5zID0gc3RkOjptYXg8aW50PigwLCBpbml0aWFsU2xvdFBvc2l0aW9uLmNvbHVt
biArIGNvbHVtblNwYW4gLSBtX2NvbHVtbnMuc2l6ZSgpKTsKLSAgICBmb3IgKGF1dG8gY29sdW1u
ID0gMDsgY29sdW1uIDwgbWlzc2luZ051bWJlck9mQ29sdW1uczsgKytjb2x1bW4pCi0gICAgICAg
IG1fY29sdW1ucy5hZGRBbm9ueW1vdXNDb2x1bW4oKTsKLQotICAgIGlmIChjZWxsLT5pc0ZpeGVk
V2lkdGgoKSkgewotICAgICAgICBmb3IgKGF1dG8gY29sdW1uID0gY2VsbC0+c3RhcnRDb2x1bW4o
KTsgY29sdW1uIDwgY2VsbC0+ZW5kQ29sdW1uKCk7ICsrY29sdW1uKQotICAgICAgICAgICAgbV9j
b2x1bW5zLmxpc3QoKVtjb2x1bW5dLnNldEhhc0ZpeGVkV2lkdGhDZWxsKCk7Ci0gICAgfQotCi0g
ICAgaWYgKGlzSW5OZXdSb3cpCi0gICAgICAgIG1fcm93cy5hZGRSb3coY2VsbEJveC5wYXJlbnQo
KSk7Ci0KLSAgICBtX2NlbGxzLmFkZChXVEZNb3ZlKGNlbGwpKTsKLX0KLQotdm9pZCBUYWJsZUdy
aWQ6Omluc2VydENlbGwoY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94LCBjb25zdCBDb250YWlu
ZXJCb3gmIGJlZm9yZSkKLXsKLSAgICBVTlVTRURfUEFSQU0oY2VsbEJveCk7Ci0gICAgVU5VU0VE
X1BBUkFNKGJlZm9yZSk7Ci19Ci0KLXZvaWQgVGFibGVHcmlkOjpyZW1vdmVDZWxsKGNvbnN0IENv
bnRhaW5lckJveCYgY2VsbEJveCkKLXsKLSAgICBVTlVTRURfUEFSQU0oY2VsbEJveCk7Ci19Ci0K
LX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9y
bWF0dGluZy9UYWJsZUdyaWQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRp
bmcvVGFibGVHcmlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNWEzZjQ0YmY2
MjIxY2U0NjUyNTk0MDkxM2VjZTEwYjA2YWFjZWYuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGlu
Zy9UYWJsZUdyaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
LSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0g
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8K
LQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkK
LQotI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiTGF5b3V0VW5pdHMu
aCIKLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4K
LSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotI2luY2x1ZGUgPHd0Zi9MaXN0SGFz
aFNldC5oPgotI2luY2x1ZGUgPHd0Zi9XZWFrUHRyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsK
LW5hbWVzcGFjZSBMYXlvdXQgewotY2xhc3MgQm94OwotY2xhc3MgQ29udGFpbmVyQm94OwotCi1j
bGFzcyBUYWJsZUdyaWQgewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVHcmlkKTsK
LXB1YmxpYzoKLSAgICBUYWJsZUdyaWQoKTsKLQotICAgIHZvaWQgYXBwZW5kQ2VsbChjb25zdCBD
b250YWluZXJCb3gmKTsKLSAgICB2b2lkIGluc2VydENlbGwoY29uc3QgQ29udGFpbmVyQm94Jiwg
Y29uc3QgQ29udGFpbmVyQm94JiBiZWZvcmUpOwotICAgIHZvaWQgcmVtb3ZlQ2VsbChjb25zdCBD
b250YWluZXJCb3gmKTsKLQotICAgIHZvaWQgc2V0SG9yaXpvbnRhbFNwYWNpbmcoTGF5b3V0VW5p
dCBob3Jpem9udGFsU3BhY2luZykgeyBtX2hvcml6b250YWxTcGFjaW5nID0gaG9yaXpvbnRhbFNw
YWNpbmc7IH0KLSAgICBMYXlvdXRVbml0IGhvcml6b250YWxTcGFjaW5nKCkgY29uc3QgeyByZXR1
cm4gbV9ob3Jpem9udGFsU3BhY2luZzsgfQotCi0gICAgdm9pZCBzZXRWZXJ0aWNhbFNwYWNpbmco
TGF5b3V0VW5pdCB2ZXJ0aWNhbFNwYWNpbmcpIHsgbV92ZXJ0aWNhbFNwYWNpbmcgPSB2ZXJ0aWNh
bFNwYWNpbmc7IH0KLSAgICBMYXlvdXRVbml0IHZlcnRpY2FsU3BhY2luZygpIGNvbnN0IHsgcmV0
dXJuIG1fdmVydGljYWxTcGFjaW5nOyB9Ci0KLSAgICB2b2lkIHNldENvbGxhcHNlZEJvcmRlcihj
b25zdCBFZGdlcyYgY29sbGFwc2VkQm9yZGVyKSB7IG1fY29sbGFwc2VkQm9yZGVyID0gY29sbGFw
c2VkQm9yZGVyOyB9Ci0gICAgT3B0aW9uYWw8RWRnZXM+IGNvbGxhcHNlZEJvcmRlcigpIGNvbnN0
IHsgcmV0dXJuIG1fY29sbGFwc2VkQm9yZGVyOyB9Ci0KLSAgICB2b2lkIHNldFdpZHRoQ29uc3Ry
YWludHMoRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cykgeyBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBpbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzOyB9Ci0gICAgT3B0aW9uYWw8Rm9ybWF0dGluZ0NvbnRleHQ6
OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM+IHdpZHRoQ29uc3RyYWludHMoKSBjb25zdCB7IHJl
dHVybiBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7IH0KLQotICAgIGJvb2wgaXNFbXB0eSgp
IGNvbnN0IHsgcmV0dXJuIG1fc2xvdE1hcC5pc0VtcHR5KCk7IH0KLSAgICAvLyBDb2x1bW4gcmVw
cmVzZW50cyBhIHZlcnRpY2FsIHNldCBvZiBzbG90cyBpbiB0aGUgZ3JpZC4gQSBjb2x1bW4gaGFz
IGhvcml6b250YWwgcG9zaXRpb24gYW5kIHdpZHRoLgotICAgIGNsYXNzIENvbHVtbiB7Ci0gICAg
cHVibGljOgotICAgICAgICBDb2x1bW4oY29uc3QgQ29udGFpbmVyQm94Kik7Ci0KLSAgICAgICAg
dm9pZCBzZXRMb2dpY2FsTGVmdChMYXlvdXRVbml0KTsKLSAgICAgICAgTGF5b3V0VW5pdCBsb2dp
Y2FsTGVmdCgpIGNvbnN0OwotICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0
IHsgcmV0dXJuIGxvZ2ljYWxMZWZ0KCkgKyBsb2dpY2FsV2lkdGgoKTsgfQotICAgICAgICB2b2lk
IHNldExvZ2ljYWxXaWR0aChMYXlvdXRVbml0KTsKLSAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2Fs
V2lkdGgoKSBjb25zdDsKLQotICAgICAgICBib29sIGlzRml4ZWRXaWR0aCgpIGNvbnN0OwotCi0g
ICAgICAgIHZvaWQgc2V0SGFzRml4ZWRXaWR0aENlbGwoKSB7IG1faGFzRml4ZWRXaWR0aENlbGwg
PSB0cnVlOyB9Ci0gICAgICAgIGNvbnN0IENvbnRhaW5lckJveCogYm94KCkgY29uc3QgeyByZXR1
cm4gbV9sYXlvdXRCb3guZ2V0KCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgaGFz
Rml4ZWRXaWR0aENlbGwoKSBjb25zdCB7IHJldHVybiBtX2hhc0ZpeGVkV2lkdGhDZWxsOyB9Ci0K
LSAgICAgICAgTGF5b3V0VW5pdCBtX2NvbXB1dGVkTG9naWNhbFdpZHRoOwotICAgICAgICBMYXlv
dXRVbml0IG1fY29tcHV0ZWRMb2dpY2FsTGVmdDsKLSAgICAgICAgV2Vha1B0cjxjb25zdCBDb250
YWluZXJCb3g+IG1fbGF5b3V0Qm94OwotICAgICAgICBib29sIG1faGFzRml4ZWRXaWR0aENlbGwg
eyBmYWxzZSB9OwotCi0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICAgICAgYm9vbCBtX2hhc0NvbXB1
dGVkV2lkdGggeyBmYWxzZSB9OwotICAgICAgICBib29sIG1faGFzQ29tcHV0ZWRMZWZ0IHsgZmFs
c2UgfTsKLSNlbmRpZgotICAgIH07Ci0KLSAgICBjbGFzcyBDb2x1bW5zIHsKLSAgICBwdWJsaWM6
Ci0gICAgICAgIHVzaW5nIENvbHVtbkxpc3QgPSBWZWN0b3I8Q29sdW1uPjsKLSAgICAgICAgQ29s
dW1uTGlzdCYgbGlzdCgpIHsgcmV0dXJuIG1fY29sdW1uTGlzdDsgfQotICAgICAgICBjb25zdCBD
b2x1bW5MaXN0JiBsaXN0KCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0OyB9Ci0gICAgICAg
IHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0LnNpemUoKTsgfQotCi0g
ICAgICAgIHZvaWQgYWRkQ29sdW1uKGNvbnN0IENvbnRhaW5lckJveCYpOwotICAgICAgICB2b2lk
IGFkZEFub255bW91c0NvbHVtbigpOwotCi0gICAgICAgIExheW91dFVuaXQgbG9naWNhbFdpZHRo
KCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0Lmxhc3QoKS5sb2dpY2FsUmlnaHQoKSAtIG1f
Y29sdW1uTGlzdC5maXJzdCgpLmxvZ2ljYWxMZWZ0KCk7IH0KLSAgICAgICAgYm9vbCBoYXNGaXhl
ZENvbHVtbnNPbmx5KCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBDb2x1bW5MaXN0
IG1fY29sdW1uTGlzdDsKLSAgICB9OwotCi0gICAgY2xhc3MgUm93IHsKLSAgICBwdWJsaWM6Ci0g
ICAgICAgIFJvdyhjb25zdCBDb250YWluZXJCb3gmKTsKLQotICAgICAgICB2b2lkIHNldExvZ2lj
YWxUb3AoTGF5b3V0VW5pdCBsb2dpY2FsVG9wKSB7IG1fbG9naWNhbFRvcCA9IGxvZ2ljYWxUb3A7
IH0KLSAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbV9sb2dp
Y2FsVG9wOyB9Ci0gICAgICAgIExheW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0IHsgcmV0
dXJuIGxvZ2ljYWxUb3AoKSArIGxvZ2ljYWxIZWlnaHQoKTsgfQotCi0gICAgICAgIHZvaWQgc2V0
TG9naWNhbEhlaWdodChMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQpIHsgbV9sb2dpY2FsSGVpZ2h0
ID0gbG9naWNhbEhlaWdodDsgfQotICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQoKSBj
b25zdCB7IHJldHVybiBtX2xvZ2ljYWxIZWlnaHQ7IH0KLQotICAgICAgICB2b2lkIHNldEJhc2Vs
aW5lKElubGluZUxheW91dFVuaXQgYmFzZWxpbmUpIHsgbV9iYXNlbGluZSA9IGJhc2VsaW5lOyB9
Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgYmFzZWxpbmUoKSBjb25zdCB7IHJldHVybiBtX2Jh
c2VsaW5lOyB9Ci0KLSAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25zdCB7IHJl
dHVybiAqbV9sYXlvdXRCb3guZ2V0KCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIExheW91
dFVuaXQgbV9sb2dpY2FsVG9wOwotICAgICAgICBMYXlvdXRVbml0IG1fbG9naWNhbEhlaWdodDsK
LSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OwotICAgICAgICBXZWFr
UHRyPGNvbnN0IENvbnRhaW5lckJveD4gbV9sYXlvdXRCb3g7Ci0gICAgfTsKLQotICAgIGNsYXNz
IFJvd3MgewotICAgIHB1YmxpYzoKLSAgICAgICAgdXNpbmcgUm93TGlzdCA9IFZlY3RvcjxSb3c+
OwotICAgICAgICBSb3dMaXN0JiBsaXN0KCkgeyByZXR1cm4gbV9yb3dMaXN0OyB9Ci0gICAgICAg
IGNvbnN0IFJvd0xpc3QmIGxpc3QoKSBjb25zdCB7IHJldHVybiBtX3Jvd0xpc3Q7IH0KLQotICAg
ICAgICB2b2lkIGFkZFJvdyhjb25zdCBDb250YWluZXJCb3gmKTsKLQotICAgICAgICBzaXplX3Qg
c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcm93TGlzdC5zaXplKCk7IH0KLQotICAgIHByaXZhdGU6
Ci0gICAgICAgIFJvd0xpc3QgbV9yb3dMaXN0OwotICAgIH07Ci0KLSAgICAvLyBDZWxsIHJlcHJl
c2VudHMgYSA8dGQ+IG9yIDx0aD4uIEl0IGNhbiBzcGFuIG11bHRpcGxlIHNsb3RzIGluIHRoZSBn
cmlkLgotICAgIGNsYXNzIENlbGwgOiBwdWJsaWMgQ2FuTWFrZVdlYWtQdHI8Q2VsbD4gewotICAg
ICAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lOTElORShDZWxsKTsKLSAgICBwdWJsaWM6Ci0g
ICAgICAgIENlbGwoY29uc3QgQ29udGFpbmVyQm94JiwgU2xvdFBvc2l0aW9uLCBDZWxsU3Bhbik7
Ci0KLSAgICAgICAgc2l6ZV90IHN0YXJ0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlv
bi5jb2x1bW47IH0KLSAgICAgICAgc2l6ZV90IGVuZENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1f
cG9zaXRpb24uY29sdW1uICsgbV9zcGFuLmNvbHVtbjsgfQotCi0gICAgICAgIHNpemVfdCBzdGFy
dFJvdygpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb24ucm93OyB9Ci0gICAgICAgIHNpemVfdCBl
bmRSb3coKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aW9uLnJvdyArIG1fc3Bhbi5yb3c7IH0KLQot
ICAgICAgICBzaXplX3QgY29sdW1uU3BhbigpIGNvbnN0IHsgcmV0dXJuIG1fc3Bhbi5jb2x1bW47
IH0KLSAgICAgICAgc2l6ZV90IHJvd1NwYW4oKSBjb25zdCB7IHJldHVybiBtX3NwYW4ucm93OyB9
Ci0KLSAgICAgICAgU2xvdFBvc2l0aW9uIHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9wb3Np
dGlvbjsgfQotICAgICAgICBDZWxsU3BhbiBzcGFuKCkgY29uc3QgeyByZXR1cm4gbV9zcGFuOyB9
Ci0KLSAgICAgICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKSB7
IG1fYmFzZWxpbmUgPSBiYXNlbGluZTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJhc2Vs
aW5lKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlbGluZTsgfQotCi0gICAgICAgIGJvb2wgaXNGaXhl
ZFdpZHRoKCkgY29uc3Q7Ci0KLSAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25z
dCB7IHJldHVybiAqbV9sYXlvdXRCb3guZ2V0KCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAg
IFdlYWtQdHI8Y29uc3QgQ29udGFpbmVyQm94PiBtX2xheW91dEJveDsKLSAgICAgICAgU2xvdFBv
c2l0aW9uIG1fcG9zaXRpb247Ci0gICAgICAgIENlbGxTcGFuIG1fc3BhbjsKLSAgICAgICAgSW5s
aW5lTGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OwotICAgIH07Ci0KLSAgICBjbGFzcyBTbG90
IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFdURl9NQUtFX1NUUlVDVF9GQVNUX0FMTE9DQVRFRDsK
LSAgICAgICAgU2xvdCgpID0gZGVmYXVsdDsKLSAgICAgICAgU2xvdChDZWxsJiwgYm9vbCBpc0Nv
bHVtblNwYW5uZWQsIGJvb2wgaXNSb3dTcGFubmVkKTsKLQotICAgICAgICBjb25zdCBDZWxsJiBj
ZWxsKCkgY29uc3QgeyByZXR1cm4gKm1fY2VsbDsgfQotICAgICAgICBDZWxsJiBjZWxsKCkgeyBy
ZXR1cm4gKm1fY2VsbDsgfQotCi0gICAgICAgIGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzJiB3aWR0aENvbnN0cmFpbnRzKCkgY29uc3QgeyByZXR1cm4g
bV93aWR0aENvbnN0cmFpbnRzOyB9Ci0gICAgICAgIHZvaWQgc2V0V2lkdGhDb25zdHJhaW50cyhj
b25zdCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgd2lkdGhD
b25zdHJhaW50cykgeyBtX3dpZHRoQ29uc3RyYWludHMgPSB3aWR0aENvbnN0cmFpbnRzOyB9Ci0K
LSAgICAgICAgLy8gSW5pdGlhbCBzbG90IHBvc2l0aW9uIGZvciBhIHNwYW5uaW5nIGNlbGwuCi0g
ICAgICAgIC8vIDx0ZD48L3RkPjx0ZCBjb2xzcGFuPTI+PC90ZD4gWzEsIDBdIHNsb3QgaGFzIGNv
bHVtbiBzcGFuIG9mIDIuCi0gICAgICAgIGJvb2wgaGFzQ29sdW1uU3BhbigpIGNvbnN0IHsgcmV0
dXJuIG1fY2VsbC0+Y29sdW1uU3BhbigpID4gMSAmJiAhaXNDb2x1bW5TcGFubmVkKCk7IH0KLSAg
ICAgICAgYm9vbCBoYXNSb3dTcGFuKCkgY29uc3QgeyByZXR1cm4gbV9jZWxsLT5yb3dTcGFuKCkg
PiAxICYmICFpc1Jvd1NwYW5uZWQoKTsgfQotCi0gICAgICAgIC8vIE5vbi1pbml0aWFsIHNwYW5u
ZWQgc2xvdC4KLSAgICAgICAgLy8gPHRkPjwvdGQ+PHRkIGNvbHNwYW49Mj48L3RkPiBbMiwgMF0g
c2xvdCBpcyBjb2x1bW4gc3Bhbm5lZCBieSBbMSwgMF0uCi0gICAgICAgIC8vIDx0ZD48L3RkPjx0
ZD48L3RkPjx0ZD48L3RkPgotICAgICAgICBib29sIGlzQ29sdW1uU3Bhbm5lZCgpIGNvbnN0IHsg
cmV0dXJuIG1faXNDb2x1bW5TcGFubmVkOyB9Ci0gICAgICAgIGJvb2wgaXNSb3dTcGFubmVkKCkg
Y29uc3QgeyByZXR1cm4gbV9pc1Jvd1NwYW5uZWQ7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAg
IFdlYWtQdHI8Q2VsbD4gbV9jZWxsOwotICAgICAgICBib29sIG1faXNDb2x1bW5TcGFubmVkIHsg
ZmFsc2UgfTsKLSAgICAgICAgYm9vbCBtX2lzUm93U3Bhbm5lZCB7IGZhbHNlIH07Ci0gICAgICAg
IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIG1fd2lkdGhDb25z
dHJhaW50czsKLSAgICB9OwotCi0gICAgY29uc3QgQ29sdW1ucyYgY29sdW1ucygpIGNvbnN0IHsg
cmV0dXJuIG1fY29sdW1uczsgfQotICAgIENvbHVtbnMmIGNvbHVtbnMoKSB7IHJldHVybiBtX2Nv
bHVtbnM7IH0KLQotICAgIGNvbnN0IFJvd3MmIHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3M7
IH0KLSAgICBSb3dzJiByb3dzKCkgeyByZXR1cm4gbV9yb3dzOyB9Ci0KLSAgICB1c2luZyBDZWxs
cyA9IFdURjo6TGlzdEhhc2hTZXQ8c3RkOjp1bmlxdWVfcHRyPENlbGw+PjsKLSAgICBDZWxscyYg
Y2VsbHMoKSB7IHJldHVybiBtX2NlbGxzOyB9Ci0KLSAgICBTbG90KiBzbG90KFNsb3RQb3NpdGlv
bik7Ci0gICAgY29uc3QgU2xvdCogc2xvdChTbG90UG9zaXRpb24gcG9zaXRpb24pIGNvbnN0IHsg
cmV0dXJuIG1fc2xvdE1hcC5nZXQocG9zaXRpb24pOyB9Ci0gICAgYm9vbCBpc1NwYW5uZWQoU2xv
dFBvc2l0aW9uKTsKLQotcHJpdmF0ZToKLSAgICB1c2luZyBTbG90TWFwID0gV1RGOjpIYXNoTWFw
PFNsb3RQb3NpdGlvbiwgc3RkOjp1bmlxdWVfcHRyPFNsb3Q+PjsKLQotICAgIENvbHVtbnMgbV9j
b2x1bW5zOwotICAgIFJvd3MgbV9yb3dzOwotICAgIENlbGxzIG1fY2VsbHM7Ci0gICAgU2xvdE1h
cCBtX3Nsb3RNYXA7Ci0KLSAgICBMYXlvdXRVbml0IG1faG9yaXpvbnRhbFNwYWNpbmc7Ci0gICAg
TGF5b3V0VW5pdCBtX3ZlcnRpY2FsU3BhY2luZzsKLSAgICBPcHRpb25hbDxGb3JtYXR0aW5nQ29u
dGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cz4gbV9pbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzOwotICAgIE9wdGlvbmFsPEVkZ2VzPiBtX2NvbGxhcHNlZEJvcmRlcjsKLX07Ci0KLX0KLX0K
LQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0
aW5nL1RhYmxlTGF5b3V0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRp
bmcvVGFibGVMYXlvdXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM1MmM1
YTE3ZjhjMGIzZDNkMjQ0ZTkyNWE3ZWYyNDgxOThhOGQzLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1h
dHRpbmcvVGFibGVMYXlvdXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgot
ICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5n
Q29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNp
bmNsdWRlICJMYXlvdXRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgotCi1u
YW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotLy8gaHR0cHM6Ly93d3cu
dzMub3JnL1RSL2Nzcy10YWJsZXMtMy8jdGFibGUtbGF5b3V0LWFsZ29yaXRobQotVGFibGVGb3Jt
YXR0aW5nQ29udGV4dDo6VGFibGVMYXlvdXQ6OlRhYmxlTGF5b3V0KGNvbnN0IFRhYmxlRm9ybWF0
dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0LCBjb25zdCBUYWJsZUdyaWQmIGdyaWQpCi0g
ICAgOiBtX2Zvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0KQotICAgICwgbV9ncmlk
KGdyaWQpCi17Ci19Ci0KLXN0cnVjdCBDb2x1bW5TcGFuIHsKLSAgICBzdGF0aWMgc2l6ZV90IGhh
c1NwYW4oY29uc3QgVGFibGVHcmlkOjpTbG90JiBzbG90KSB7IHJldHVybiBzbG90Lmhhc0NvbHVt
blNwYW4oKTsgfQotICAgIHN0YXRpYyBzaXplX3QgaXNTcGFubmVkKGNvbnN0IFRhYmxlR3JpZDo6
U2xvdCYgc2xvdCkgeyByZXR1cm4gc2xvdC5pc0NvbHVtblNwYW5uZWQoKTsgfQotCi0gICAgc3Rh
dGljIHNpemVfdCBzcGFuQ291bnQoY29uc3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVy
biBjZWxsLmNvbHVtblNwYW4oKTsgfQotICAgIHN0YXRpYyBzaXplX3Qgc3RhcnRTcGFuKGNvbnN0
IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5zdGFydENvbHVtbigpOyB9Ci0g
ICAgc3RhdGljIHNpemVfdCBlbmRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyBy
ZXR1cm4gY2VsbC5lbmRDb2x1bW4oKTsgfQotCi0gICAgc3RhdGljIHNpemVfdCBpbmRleChzaXpl
X3QgY29sdW1uSW5kZXgsIHNpemVfdCAvKnJvd0luZGV4Ki8pIHsgcmV0dXJuIGNvbHVtbkluZGV4
OyB9Ci0gICAgc3RhdGljIHNpemVfdCBzaXplKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1
cm4gZ3JpZC5jb2x1bW5zKCkuc2l6ZSgpOyB9Ci0KLSAgICBzdGF0aWMgTGF5b3V0VW5pdCBzcGFj
aW5nKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5ob3Jpem9udGFsU3BhY2lu
ZygpOyB9Ci19OwotCi1zdHJ1Y3QgUm93U3BhbiB7Ci0gICAgc3RhdGljIHNpemVfdCBoYXNTcGFu
KGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCkgeyByZXR1cm4gc2xvdC5oYXNSb3dTcGFuKCk7
IH0KLSAgICBzdGF0aWMgc2l6ZV90IGlzU3Bhbm5lZChjb25zdCBUYWJsZUdyaWQ6OlNsb3QmIHNs
b3QpIHsgcmV0dXJuIHNsb3QuaXNSb3dTcGFubmVkKCk7IH0KLQotICAgIHN0YXRpYyBzaXplX3Qg
c3BhbkNvdW50KGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5yb3dT
cGFuKCk7IH0KLSAgICBzdGF0aWMgc2l6ZV90IHN0YXJ0U3Bhbihjb25zdCBUYWJsZUdyaWQ6OkNl
bGwmIGNlbGwpIHsgcmV0dXJuIGNlbGwuc3RhcnRSb3coKTsgfQotICAgIHN0YXRpYyBzaXplX3Qg
ZW5kU3Bhbihjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJuIGNlbGwuZW5kUm93
KCk7IH0KLQotICAgIHN0YXRpYyBzaXplX3QgaW5kZXgoc2l6ZV90IC8qY29sdW1uSW5kZXgqLywg
c2l6ZV90IHJvd0luZGV4KSB7IHJldHVybiByb3dJbmRleDsgfQotICAgIHN0YXRpYyBzaXplX3Qg
c2l6ZShjb25zdCBUYWJsZUdyaWQmIGdyaWQpIHsgcmV0dXJuIGdyaWQucm93cygpLnNpemUoKTsg
fQotCi0gICAgc3RhdGljIExheW91dFVuaXQgc3BhY2luZyhjb25zdCBUYWJsZUdyaWQmIGdyaWQp
IHsgcmV0dXJuIGdyaWQudmVydGljYWxTcGFjaW5nKCk7IH0KLX07Ci0KLXN0cnVjdCBHcmlkU3Bh
Y2UgewotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICF2YWx1ZTsgfQotCi0gICAg
Ly8gSW5pdGlhbCB3aWR0aC9oZWlnaHQgZm9yIGNvbHVtbi9yb3cgd2Ugc3RhcnQgdGhlIGRpc3Ry
aWJ1dGlvbiB3aWR0aCAodXN1YWxseSBhIG1pbnVtdW0gd2lkdGgpLgotICAgIGZsb2F0IHZhbHVl
IHsgMCB9OwotICAgIC8vIFRoZSBiYXNlIHRvIGNvbXB1dGUgdGhlIGRpc3RyaWJ1dGlvbiByYXRp
by4gSXQgbm9ybWFsbHkgbWF0Y2hlcyB0aGUgW3ZhbHVlXSBidXQgaW4gc29tZSBjYXNlcyB3ZSB1
c2UgdGhlIG1heGltdW0gdmFsdWUgdG8gZGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UuIAotICAg
IGZsb2F0IGRpc3RyaWJ1dGlvbkJhc2UgeyAwIH07Ci19OwotCi1pbmxpbmUgc3RhdGljIEdyaWRT
cGFjZSBtYXgoY29uc3QgR3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCi17Ci0gICAg
cmV0dXJuIHsgc3RkOjptYXgoYS52YWx1ZSwgYi52YWx1ZSksIHN0ZDo6bWF4KGEuZGlzdHJpYnV0
aW9uQmFzZSwgYi5kaXN0cmlidXRpb25CYXNlKSB9OwotfQotCi1pbmxpbmUgc3RhdGljIEdyaWRT
cGFjZSYgb3BlcmF0b3ItKEdyaWRTcGFjZSYgYSwgY29uc3QgR3JpZFNwYWNlJiBiKQotewotICAg
IGEudmFsdWUgPSBzdGQ6Om1heCgwLjBmLCBhLnZhbHVlIC0gYi52YWx1ZSk7Ci0gICAgYS5kaXN0
cmlidXRpb25CYXNlID0gc3RkOjptYXgoMC4wZiwgYS5kaXN0cmlidXRpb25CYXNlIC0gYi5kaXN0
cmlidXRpb25CYXNlKTsKLSAgICByZXR1cm4gYTsKLX0KLQotaW5saW5lIHN0YXRpYyBHcmlkU3Bh
Y2UmIG9wZXJhdG9yKz0oR3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCi17Ci0gICAg
YS52YWx1ZSArPSBiLnZhbHVlOwotICAgIGEuZGlzdHJpYnV0aW9uQmFzZSArPSBiLmRpc3RyaWJ1
dGlvbkJhc2U7Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLWlubGluZSBzdGF0aWMgR3JpZFNwYWNlJiBv
cGVyYXRvci09KEdyaWRTcGFjZSYgYSwgY29uc3QgR3JpZFNwYWNlJiBiKQotewotICAgIHJldHVy
biBhIC0gYjsKLX0KLQotaW5saW5lIHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJhdG9yLyhHcmlkU3Bh
Y2UmIGEsIHVuc2lnbmVkIHZhbHVlKQotewotICAgIGEudmFsdWUgLz0gdmFsdWU7Ci0gICAgYS5k
aXN0cmlidXRpb25CYXNlIC89IHZhbHVlOwotICAgIHJldHVybiBhOwotfQotCi10ZW1wbGF0ZSA8
dHlwZW5hbWUgU3BhblR5cGU+Ci1zdGF0aWMgVmVjdG9yPExheW91dFVuaXQ+IGRpc3RyaWJ1dGVB
dmFpbGFibGVTcGFjZShjb25zdCBUYWJsZUdyaWQmIGdyaWQsIExheW91dFVuaXQgYXZhaWxhYmxl
U3BhY2UsIGNvbnN0IFdURjo6RnVuY3Rpb248R3JpZFNwYWNlKGNvbnN0IFRhYmxlR3JpZDo6U2xv
dCYsIHNpemVfdCk+JiBzbG90U3BhY2UpCi17Ci0gICAgc3RydWN0IFJlc29sdmVkSXRlbSB7Ci0g
ICAgICAgIEdyaWRTcGFjZSBzbG90U3BhY2U7Ci0gICAgICAgIGJvb2wgaXNGaXhlZCB7IGZhbHNl
IH07Ci0gICAgfTsKLQotICAgIGF1dG8mIGNvbHVtbnMgPSBncmlkLmNvbHVtbnMoKTsKLSAgICBh
dXRvJiByb3dzID0gZ3JpZC5yb3dzKCk7Ci0gICAgLy8gMS4gQ29sbGVjdCB0aGUgbm9uLXNwYW5u
aW5nIHNwYWNlcyBmaXJzdC4gVGhleSBhcmUgdXNlZCBmb3IgdGhlIGZpbmFsIGRpc3RyaWJ1dGlv
biBhcyB3ZWxsIGFzIGZvciBkaXN0cmlidXRpbmcgdGhlIHNwYW5uaW5nIHNwYWNlLgotICAgIFZl
Y3RvcjxPcHRpb25hbDxSZXNvbHZlZEl0ZW0+PiByZXNvbHZlZEl0ZW1zKFNwYW5UeXBlOjpzaXpl
KGdyaWQpKTsKLSAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwg
Y29sdW1ucy5zaXplKCk7ICsrY29sdW1uSW5kZXgpIHsKLSAgICAgICAgZm9yIChzaXplX3Qgcm93
SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7Ci0gICAgICAg
ICAgICBhdXRvJiBzbG90ID0gKmdyaWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsK
LSAgICAgICAgICAgIGlmIChTcGFuVHlwZTo6aGFzU3BhbihzbG90KSB8fCBTcGFuVHlwZTo6aXNT
cGFubmVkKHNsb3QpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYXV0
byBpbmRleCA9IFNwYW5UeXBlOjppbmRleChjb2x1bW5JbmRleCwgcm93SW5kZXgpOwotICAgICAg
ICAgICAgaWYgKCFyZXNvbHZlZEl0ZW1zW2luZGV4XSkKLSAgICAgICAgICAgICAgICByZXNvbHZl
ZEl0ZW1zW2luZGV4XSA9IFJlc29sdmVkSXRlbSB7IH07Ci0gICAgICAgICAgICByZXNvbHZlZEl0
ZW1zW2luZGV4XS0+c2xvdFNwYWNlID0gbWF4KHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90U3Bh
Y2UsIHNsb3RTcGFjZShzbG90LCBpbmRleCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8g
Mi4gQ29sbGVjdCB0aGUgc3Bhbm5pbmcgY2VsbHMuCi0gICAgc3RydWN0IFNwYW5uaW5nQ2VsbCB7
Ci0gICAgICAgIFNsb3RQb3NpdGlvbiBwb3NpdGlvbjsKLSAgICAgICAgR3JpZFNwYWNlIHVucmVz
b2x2ZWRTcGFjZTsKLSAgICB9OwotICAgIFZlY3RvcjxTcGFubmluZ0NlbGw+IHNwYW5uaW5nQ2Vs
bHM7Ci0gICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgp
OyArK3Jvd0luZGV4KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29s
dW1uSW5kZXggPCBjb2x1bW5zLnNpemUoKTsgKytjb2x1bW5JbmRleCkgewotICAgICAgICAgICAg
YXV0byYgc2xvdCA9ICpncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAg
ICAgICAgICBpZiAoU3BhblR5cGU6Omhhc1NwYW4oc2xvdCkpCi0gICAgICAgICAgICAgICAgc3Bh
bm5pbmdDZWxscy5hcHBlbmQoeyB7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9LCBzbG90U3BhY2Uo
c2xvdCwgU3BhblR5cGU6OmluZGV4KGNvbHVtbkluZGV4LCByb3dJbmRleCkpIH0pOwotICAgICAg
ICB9Ci0gICAgfQotICAgIC8vIFdlIG5lZWQgdGhlc2Ugc3Bhbm5pbmcgY2VsbHMgaW4gdGhlIG9y
ZGVyIG9mIHRoZSBudW1iZXIgb2YgY29sdW1ucy9yb3dzIHRoZXkgc3BhbiBzbyB0aGF0Ci0gICAg
Ly8gd2UgY2FuIHJlc29sdmUgb3ZlcmxhcHBpbmcgc3BhbnMgc3RhcnRpbmcgd2l0aCB0aGUgc2hv
cnRlciBvbmVzIGUuZy4KLSAgICAvLyA8dGQgY29sc3Bhbj00PiNhPC90ZD48dGQ+I2I8L3RkPgot
ICAgIC8vIDx0ZCBjb2xzcGFuPTI+I2M8L3RkPjx0ZCBjb2xzcGFuPTM+I2Q8L3RkPgotICAgIHN0
ZDo6c29ydChzcGFubmluZ0NlbGxzLmJlZ2luKCksIHNwYW5uaW5nQ2VsbHMuZW5kKCksIFsmXSAo
YXV0byYgYSwgYXV0byYgYikgewotICAgICAgICByZXR1cm4gU3BhblR5cGU6OnNwYW5Db3VudChn
cmlkLnNsb3QoYS5wb3NpdGlvbiktPmNlbGwoKSkgPCBTcGFuVHlwZTo6c3BhbkNvdW50KGdyaWQu
c2xvdChiLnBvc2l0aW9uKS0+Y2VsbCgpKTsKLSAgICB9KTsKLQotICAgIC8vIDMuIERpc3RyaWJ1
dGUgdGhlIHNwYW5uaW5nIGNlbGxzJyBtaW1pbXVtIHNwYWNlIGFjcm9zcyB0aGUgY29sdW1ucy9y
b3dzIHVzaW5nIHRoZSBub24tc3Bhbm5pbmcgc3BhY2VzLgotICAgIC8vIGUuZy4gWyAxIF1bIDUg
XVsgMSBdCi0gICAgLy8gICAgICBbICAgIDkgICBdWyAxIF0KLSAgICAvLyBUaGUgaW5pdGlhbCB3
aWR0aHMgYXJlOiBbIDIgXVsgNyBdWyAxIF0KLSAgICBmb3IgKGF1dG8gc3Bhbm5pbmdDZWxsIDog
c3Bhbm5pbmdDZWxscykgewotICAgICAgICBhdXRvJiBjZWxsID0gZ3JpZC5zbG90KHNwYW5uaW5n
Q2VsbC5wb3NpdGlvbiktPmNlbGwoKTsKLSAgICAgICAgYXV0byB1bnJlc29sdmVkU3Bhbm5pbmdT
cGFjZSA9IHNwYW5uaW5nQ2VsbC51bnJlc29sdmVkU3BhY2U7Ci0gICAgICAgIGlmICghcmVzb2x2
ZWRJdGVtc1tTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpXSB8fCAhcmVzb2x2ZWRJdGVtc1tTcGFu
VHlwZTo6ZW5kU3BhbihjZWxsKSAtIDFdKSB7Ci0gICAgICAgICAgICAvLyA8dGQgY29sc3Bhbj00
PiNhPC90ZD48dGQ+I2I8L3RkPgotICAgICAgICAgICAgLy8gPHRkIGNvbHNwYW49Mj4jYzwvdGQ+
PHRkIGNvbHNwYW49Mz4jZDwvdGQ+Ci0gICAgICAgICAgICAvLyBVbnJlc29sdmVkIGNvbHVtbnMg
YXJlOiAxIDIgMyA0Ci0gICAgICAgICAgICAvLyAxLiBUYWtlIGNvbHNwYW49MiAoc2hvcnRlc3Qg
c3BhbikgYW5kIHJlc29sdmUgY29sdW1uIDEgYW5kIDIKLSAgICAgICAgICAgIC8vIDIuIFRha2Ug
Y29sc3Bhbj0zIGFuZCByZXNvbHZlIGNvbHVtbiAzIGFuZCA0ICg1IGlzIHJlc29sdmVkIGJlY2F1
c2UgaXQgYWxyZWFkeSBoYXMgYSBub24tc3Bhbm5pbmcgY2VsbCkuCi0gICAgICAgICAgICAvLyAz
LiBjb2xzcGFuPTQgbmVlZHMgbm8gcmVzb2x2aW5nIGJlY2F1c2UgYWxsIHRoZSBzcGFubmVkIGNv
bHVtbnMgKDEgMiAzIDQpIGhhdmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkLgotICAgICAgICAgICAg
YXV0byB1bnJlc29sdmVkQ29sdW1uQ291bnQgPSBjZWxsLmNvbHVtblNwYW4oKTsKLSAgICAgICAg
ICAgIGZvciAoYXV0byBzcGFuSW5kZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpOyBzcGFu
SW5kZXggPCBTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5kZXgpIHsKLSAgICAgICAg
ICAgICAgICBpZiAoIXJlc29sdmVkSXRlbXNbc3BhbkluZGV4XSkKLSAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHVucmVzb2x2ZWRDb2x1bW5Db3Vu
dCk7Ci0gICAgICAgICAgICAgICAgLS11bnJlc29sdmVkQ29sdW1uQ291bnQ7Ci0gICAgICAgICAg
ICAgICAgdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UgLT0gcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhd
LT5zbG90U3BhY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBU1NFUlQodW5yZXNvbHZl
ZENvbHVtbkNvdW50KTsKLSAgICAgICAgICAgIGF1dG8gZXF1YWxTcGFjZUZvclNwYW5uZWRDb2x1
bW5zID0gdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UgLyB1bnJlc29sdmVkQ29sdW1uQ291bnQ7Ci0g
ICAgICAgICAgICBmb3IgKGF1dG8gc3BhbkluZGV4ID0gU3BhblR5cGU6OnN0YXJ0U3BhbihjZWxs
KTsgc3BhbkluZGV4IDwgU3BhblR5cGU6OmVuZFNwYW4oY2VsbCk7ICsrc3BhbkluZGV4KSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XSkKLSAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRJdGVtc1tzcGFuSW5k
ZXhdID0gUmVzb2x2ZWRJdGVtIHsgZXF1YWxTcGFjZUZvclNwYW5uZWRDb2x1bW5zLCBmYWxzZSB9
OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gMS4gQ29s
bGVjdCB0aGUgbm9uLXNwYW5pbmcgcmVzb2x2ZWQgc3BhY2VzLgotICAgICAgICAgICAgLy8gMi4g
RGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UgYW1vbmcgdGhlIHNwYW5uZWQgY29sdW1ucy9yb3dz
IGJhc2VkIG9uIHRoZSByZXNvbHZlZCBzcGFjZSB2YWx1ZXMuCi0gICAgICAgICAgICAvLyBlLmcu
IHNwYW5uaW5nIHdpZHRoOiBbICAgOSAgIF0uIFJlc29sdmVkIHdpZHRocyBmb3IgdGhlIHNwYW5u
ZWQgY29sdW1uczogWyAxIF0gWyAyIF0KLSAgICAgICAgICAgIC8vIE5ldyByZXNvbHZlZCB3aWR0
aHM6IFsgMyBdIFsgNiBdLgotICAgICAgICAgICAgYXV0byByZXNvbHZlZFNwYW5uaW5nU3BhY2Ug
PSBHcmlkU3BhY2UgeyB9OwotICAgICAgICAgICAgZm9yIChhdXRvIHNwYW5JbmRleCA9IFNwYW5U
eXBlOjpzdGFydFNwYW4oY2VsbCk7IHNwYW5JbmRleCA8IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwp
OyArK3NwYW5JbmRleCkKLSAgICAgICAgICAgICAgICByZXNvbHZlZFNwYW5uaW5nU3BhY2UgKz0g
cmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2U7Ci0gICAgICAgICAgICBpZiAocmVz
b2x2ZWRTcGFubmluZ1NwYWNlLnZhbHVlID49IHVucmVzb2x2ZWRTcGFubmluZ1NwYWNlLnZhbHVl
KSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNwYW5uaW5nIGNlbGwgZml0cyB0aGUgc3Bhbm5l
ZCBjb2x1bW5zL3Jvd3MganVzdCBmaW5lLiBOb3RoaW5nIHRvIGRpc3RyaWJ1dGUuCi0gICAgICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIHNwYWNp
bmcgPSBTcGFuVHlwZTo6c3BhY2luZyhncmlkKSAqIChTcGFuVHlwZTo6c3BhbkNvdW50KGNlbGwp
IC0gMSk7Ci0gICAgICAgICAgICBhdXRvIHNwYWNlVG9EaXN0cmlidXRlID0gdW5yZXNvbHZlZFNw
YW5uaW5nU3BhY2UgLSBHcmlkU3BhY2UgeyBzcGFjaW5nLCBzcGFjaW5nIH0gLSByZXNvbHZlZFNw
YW5uaW5nU3BhY2U7IAotICAgICAgICAgICAgaWYgKCFzcGFjZVRvRGlzdHJpYnV0ZS5pc0VtcHR5
KCkpIHsKLSAgICAgICAgICAgICAgICBhdXRvIGRpc3RyaWJ1dGlvblJhdGlvID0gc3BhY2VUb0Rp
c3RyaWJ1dGUuZGlzdHJpYnV0aW9uQmFzZSAvIHJlc29sdmVkU3Bhbm5pbmdTcGFjZS5kaXN0cmli
dXRpb25CYXNlOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byBzcGFuSW5kZXggPSBTcGFuVHlw
ZTo6c3RhcnRTcGFuKGNlbGwpOyBzcGFuSW5kZXggPCBTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsg
KytzcGFuSW5kZXgpCi0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkSXRlbXNbc3BhbkluZGV4
XS0+c2xvdFNwYWNlICs9IEdyaWRTcGFjZSB7IHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xv
dFNwYWNlLnZhbHVlICogZGlzdHJpYnV0aW9uUmF0aW8sIHJlc29sdmVkSXRlbXNbc3BhbkluZGV4
XS0+c2xvdFNwYWNlLmRpc3RyaWJ1dGlvbkJhc2UgKiBkaXN0cmlidXRpb25SYXRpb307Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gNC4gRGlzdHJpYnV0ZSB0aGUgZXh0
cmEgc3BhY2UgdXNpbmcgdGhlIGZpbmFsIHJlc29sdmVkIHdpZHRocy4KLSNpZiBBU1NFUlRfRU5B
QkxFRAotICAgIC8vIFdlIGhhdmUgdG8gaGF2ZSBhbGwgdGhlIHNwYWNlcyByZXNvbHZlZCBhdCB0
aGlzIHBvaW50LgotICAgIGZvciAoYXV0byYgcmVzb2x2ZWRJdGVtIDogcmVzb2x2ZWRJdGVtcykK
LSAgICAgICAgQVNTRVJUKHJlc29sdmVkSXRlbSk7Ci0jZW5kaWYKLSAgICAvLyBGaXhlZCBzaXpl
IGNlbGxzIGRvbid0IHBhcnRpY2lwYXRlIGluIGF2YWlsYWJsZSBzcGFjZSBkaXN0cmlidXRpb24u
Ci0gICAgYXV0byBhZGp1c3RhYmxlZFNwYWNlID0gR3JpZFNwYWNlIHsgfTsKLSAgICBmb3IgKGF1
dG8mIHJlc29sdmVkSXRlbSA6IHJlc29sdmVkSXRlbXMpIHsKLSAgICAgICAgaWYgKHJlc29sdmVk
SXRlbS0+aXNGaXhlZCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBhZGp1c3RhYmxl
ZFNwYWNlICs9IHJlc29sdmVkSXRlbS0+c2xvdFNwYWNlOwotICAgIH0KLQotICAgIFZlY3RvcjxM
YXlvdXRVbml0PiBkaXN0cmlidXRlZFNwYWNlcyhyZXNvbHZlZEl0ZW1zLnNpemUoKSk7Ci0gICAg
ZmxvYXQgc3BhY2VUb0Rpc3RyaWJ1dGUgPSBhdmFpbGFibGVTcGFjZSAtIGFkanVzdGFibGVkU3Bh
Y2UudmFsdWUgLSAoKHJlc29sdmVkSXRlbXMuc2l6ZSgpICsgMSkgKiBTcGFuVHlwZTo6c3BhY2lu
ZyhncmlkKSk7Ci0gICAgLy8gRXNzZW50aWFsbHkgdGhlIHJlbWFpbmluZyBzcGFjZSB0byBkaXN0
cmlidXRlIHNob3VsZCBuZXZlciBiZSBuZWdhdGl2ZS4gTGF5b3V0VW5pdDo6ZXBzaWxvbigpIGlz
IHJlcXVpcmVkIHRvIGNvbXBlbnNhdGUgZm9yIExheW91dFVuaXQncyBsb3cgcHJlY2lzaW9uLgot
ICAgIEFTU0VSVChzcGFjZVRvRGlzdHJpYnV0ZSA+PSAtTGF5b3V0VW5pdDo6ZXBzaWxvbigpICog
cmVzb2x2ZWRJdGVtcy5zaXplKCkpOwotICAgIC8vIERpc3RyaWJ1dGUgdGhlIGV4dHJhIHNwYWNl
IGJhc2VkIG9uIHRoZSByZXNvbHZlZCBzcGFjZXMuCi0gICAgYXV0byBkaXN0cmlidXRpb25SYXRp
byA9IHNwYWNlVG9EaXN0cmlidXRlIC8gYWRqdXN0YWJsZWRTcGFjZS5kaXN0cmlidXRpb25CYXNl
OwotICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCByZXNvbHZlZEl0ZW1zLnNpemUo
KTsgKytpbmRleCkgewotICAgICAgICBhdXRvIHNsb3RTcGFjZSA9IHJlc29sdmVkSXRlbXNbaW5k
ZXhdLT5zbG90U3BhY2UudmFsdWU7Ci0gICAgICAgIGF1dG8gbmVlZHNTcGFjZURpc3RyaWJ1dGlv
biA9IHNwYWNlVG9EaXN0cmlidXRlICYmICFyZXNvbHZlZEl0ZW1zW2luZGV4XS0+aXNGaXhlZDsK
LSAgICAgICAgZGlzdHJpYnV0ZWRTcGFjZXNbaW5kZXhdID0gTGF5b3V0VW5pdCB7IHNsb3RTcGFj
ZSB9OwotICAgICAgICBpZiAoIW5lZWRzU3BhY2VEaXN0cmlidXRpb24pCi0gICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgZGlzdHJpYnV0ZWRTcGFjZXNbaW5kZXhdICs9IExheW91dFVuaXQg
eyByZXNvbHZlZEl0ZW1zW2luZGV4XS0+c2xvdFNwYWNlLmRpc3RyaWJ1dGlvbkJhc2UgKiBkaXN0
cmlidXRpb25SYXRpbyB9OwotICAgIH0KLSAgICByZXR1cm4gZGlzdHJpYnV0ZWRTcGFjZXM7Ci19
Ci0KLVRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlTGF5b3V0OjpEaXN0cmlidXRlZFNwYWNl
cyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dDo6ZGlzdHJpYnV0ZWRIb3Jpem9u
dGFsU3BhY2UoTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpCi17Ci0gICAgZW51
bSBjbGFzcyBDb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UgeyBNaW5pbXVtV2lkdGgsIE1heGltdW1X
aWR0aCB9OwotICAgIGF1dG8gY29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlID0gYXZhaWxhYmxlSG9y
aXpvbnRhbFNwYWNlID49IG1fZ3JpZC53aWR0aENvbnN0cmFpbnRzKCktPm1heGltdW0gPyBDb2x1
bW5XaWR0aEJhbGFuY2luZ0Jhc2U6Ok1heGltdW1XaWR0aCA6IENvbHVtbldpZHRoQmFsYW5jaW5n
QmFzZTo6TWluaW11bVdpZHRoOwotICAgIHJldHVybiBkaXN0cmlidXRlQXZhaWxhYmxlU3BhY2U8
Q29sdW1uU3Bhbj4obV9ncmlkLCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UsIFsmXSAoY29uc3Qg
VGFibGVHcmlkOjpTbG90JiBzbG90LCBzaXplX3QgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgYXV0
byYgY29sdW1uID0gbV9ncmlkLmNvbHVtbnMoKS5saXN0KClbY29sdW1uSW5kZXhdOwotICAgICAg
ICBhdXRvIGNvbHVtbkJveEZpeGVkV2lkdGggPSBjb2x1bW4uYm94KCkgPyBjb2x1bW4uYm94KCkt
PmNvbHVtbldpZHRoKCkudmFsdWVPcigwX2x1KSA6IDBfbHU7Ci0gICAgICAgIGF1dG8gbWluaW11
bVdpZHRoID0gc3RkOjptYXg8ZmxvYXQ+KHNsb3Qud2lkdGhDb25zdHJhaW50cygpLm1pbmltdW0s
IGNvbHVtbkJveEZpeGVkV2lkdGgpOwotICAgICAgICBhdXRvIG1heGltdW1XaWR0aCA9IHN0ZDo6
bWF4PGZsb2F0PihzbG90LndpZHRoQ29uc3RyYWludHMoKS5tYXhpbXVtLCBjb2x1bW5Cb3hGaXhl
ZFdpZHRoKTsKLQotICAgICAgICBpZiAoY29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlID09IENvbHVt
bldpZHRoQmFsYW5jaW5nQmFzZTo6TWluaW11bVdpZHRoKSB7Ci0gICAgICAgICAgICBBU1NFUlQo
bWF4aW11bVdpZHRoID49IG1pbmltdW1XaWR0aCk7Ci0gICAgICAgICAgICByZXR1cm4gR3JpZFNw
YWNlIHsgbWluaW11bVdpZHRoLCBtYXhpbXVtV2lkdGggLSBtaW5pbXVtV2lkdGggfTsKLSAgICAg
ICAgfQotICAgICAgICAvLyBXaGVuIHRoZSBjb2x1bW4gaGFzIGEgZml4ZWQgd2lkdGggY2VsbCwg
dGhlIG1heGltdW0gd2lkdGggYmFsYW5jaW5nIGlzIGJhc2VkIG9uIHRoZSBtaW5pbXVtIHdpZHRo
LgotICAgICAgICBpZiAoY29sdW1uLmlzRml4ZWRXaWR0aCgpKQotICAgICAgICAgICAgcmV0dXJu
IEdyaWRTcGFjZSB7IG1pbmltdW1XaWR0aCwgbWF4aW11bVdpZHRoIH07Ci0gICAgICAgIHJldHVy
biBHcmlkU3BhY2UgeyBtYXhpbXVtV2lkdGgsIG1heGltdW1XaWR0aCB9OwotICAgIH0pOwotfQot
Ci1UYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dDo6RGlzdHJpYnV0ZWRTcGFjZXMg
VGFibGVGb3JtYXR0aW5nQ29udGV4dDo6VGFibGVMYXlvdXQ6OmRpc3RyaWJ1dGVkVmVydGljYWxT
cGFjZShPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKQotewotICAg
IGF1dG8mIHJvd3MgPSBtX2dyaWQucm93cygpOwotICAgIGF1dG8mIGNvbHVtbnMgPSBtX2dyaWQu
Y29sdW1ucygpOwotCi0gICAgVmVjdG9yPExheW91dFVuaXQ+IHJvd0hlaWdodChyb3dzLnNpemUo
KSk7Ci0gICAgYXV0byB0YWJsZVVzZWRIZWlnaHQgPSBMYXlvdXRVbml0IHsgfTsKLSAgICAvLyAy
LiBDb2xsZWN0IGluaXRpYWwsIGJhc2VsaW5lIGFsaWduZWQgcm93IGhlaWdodHMuCi0gICAgZm9y
IChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4
KSB7Ci0gICAgICAgIGF1dG8gbWF4aW11bUNvbHVtbkFzY2VudCA9IElubGluZUxheW91dFVuaXQg
eyB9OwotICAgICAgICBhdXRvIG1heGltdW1Db2x1bW5EZXNjZW50ID0gSW5saW5lTGF5b3V0VW5p
dCB7IH07Ci0gICAgICAgIC8vIEluaXRpYWwgbWluaW11bSBoZWlnaHQgaXMgdGhlIGNvbXB1dGVk
IGhlaWdodCBpZiBhdmFpbGFibGUgPHRyIHN0eWxlPSJoZWlnaHQ6IDEwMHB4Ij48dGQ+PC90ZD48
L3RyPgotICAgICAgICByb3dIZWlnaHRbcm93SW5kZXhdID0gZm9ybWF0dGluZ0NvbnRleHQoKS5n
ZW9tZXRyeSgpLmNvbXB1dGVkSGVpZ2h0KHJvd3MubGlzdCgpW3Jvd0luZGV4XS5ib3goKSwgYXZh
aWxhYmxlVmVydGljYWxTcGFjZSkudmFsdWVPcigwX2x1KTsKLSAgICAgICAgZm9yIChzaXplX3Qg
Y29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IGNvbHVtbnMuc2l6ZSgpOyArK2NvbHVtbklu
ZGV4KSB7Ci0gICAgICAgICAgICBhdXRvJiBzbG90ID0gKm1fZ3JpZC5zbG90KHsgY29sdW1uSW5k
ZXgsIHJvd0luZGV4IH0pOwotICAgICAgICAgICAgaWYgKHNsb3QuaXNSb3dTcGFubmVkKCkpCi0g
ICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoc2xvdC5oYXNSb3dTcGFu
KCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAvLyBUaGUgbWluaW11
bSBoZWlnaHQgb2YgYSByb3cgKHdpdGhvdXQgc3Bhbm5pbmctcmVsYXRlZCBoZWlnaHQgZGlzdHJp
YnV0aW9uKSBpcyBkZWZpbmVkIGFzIHRoZSBoZWlnaHQgb2YgYW4gaHlwb3RoZXRpY2FsCi0gICAg
ICAgICAgICAvLyBsaW5lYm94IGNvbnRhaW5pbmcgdGhlIGNlbGxzIG9yaWdpbmF0aW5nIGluIHRo
ZSByb3cuCi0gICAgICAgICAgICBhdXRvJiBjZWxsID0gc2xvdC5jZWxsKCk7Ci0gICAgICAgICAg
ICBhdXRvJiBjZWxsQm94ID0gY2VsbC5ib3goKTsKLSAgICAgICAgICAgIGF1dG8gaGVpZ2h0ID0g
Zm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChjZWxsQm94KS5ib3JkZXJCb3hIZWln
aHQoKTsKLSAgICAgICAgICAgIGlmIChjZWxsQm94LnN0eWxlKCkudmVydGljYWxBbGlnbigpID09
IFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lKSB7Ci0gICAgICAgICAgICAgICAgbWF4aW11bUNvbHVt
bkFzY2VudCA9IHN0ZDo6bWF4KG1heGltdW1Db2x1bW5Bc2NlbnQsIGNlbGwuYmFzZWxpbmUoKSk7
Ci0gICAgICAgICAgICAgICAgbWF4aW11bUNvbHVtbkRlc2NlbnQgPSBzdGQ6Om1heChtYXhpbXVt
Q29sdW1uRGVzY2VudCwgaGVpZ2h0IC0gY2VsbC5iYXNlbGluZSgpKTsKLSAgICAgICAgICAgICAg
ICByb3dIZWlnaHRbcm93SW5kZXhdID0gc3RkOjptYXgocm93SGVpZ2h0W3Jvd0luZGV4XSwgTGF5
b3V0VW5pdCB7IG1heGltdW1Db2x1bW5Bc2NlbnQgKyBtYXhpbXVtQ29sdW1uRGVzY2VudCB9KTsK
LSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJvd0hlaWdodFtyb3dJbmRleF0g
PSBzdGQ6Om1heChyb3dIZWlnaHRbcm93SW5kZXhdLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAg
ICAgIHRhYmxlVXNlZEhlaWdodCArPSByb3dIZWlnaHRbcm93SW5kZXhdOwotICAgIH0KLSAgICAv
LyBGSVhNRTogQ29sbGVjdCBzcGFubmluZyByb3cgbWF4aW11bSBoZWlnaHRzLgotCi0gICAgdGFi
bGVVc2VkSGVpZ2h0ICs9IChyb3dzLnNpemUoKSArIDEpICogbV9ncmlkLnZlcnRpY2FsU3BhY2lu
ZygpOwotICAgIGF1dG8gYXZhaWxhYmxlU3BhY2UgPSBzdGQ6Om1heChhdmFpbGFibGVWZXJ0aWNh
bFNwYWNlLnZhbHVlT3IoMF9sdSksIHRhYmxlVXNlZEhlaWdodCk7Ci0gICAgLy8gRGlzdHJpYnV0
ZSBleHRyYSBzcGFjZSBpZiB0aGUgdGFibGUgaXMgc3VwcG9zZWQgdG8gYmUgdGFsbGVyIHRoYW4g
dGhlIHN1bSBvZiB0aGUgcm93IGhlaWdodHMuCi0gICAgcmV0dXJuIGRpc3RyaWJ1dGVBdmFpbGFi
bGVTcGFjZTxSb3dTcGFuPihtX2dyaWQsIGF2YWlsYWJsZVNwYWNlLCBbJl0gKGNvbnN0IFRhYmxl
R3JpZDo6U2xvdCYgc2xvdCwgc2l6ZV90IHJvd0luZGV4KSB7Ci0gICAgICAgIGlmIChzbG90Lmhh
c1Jvd1NwYW4oKSkKLSAgICAgICAgICAgIHJldHVybiBHcmlkU3BhY2UgeyBmb3JtYXR0aW5nQ29u
dGV4dCgpLmdlb21ldHJ5Rm9yQm94KHNsb3QuY2VsbCgpLmJveCgpKS5ib3JkZXJCb3hIZWlnaHQo
KSwgZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChzbG90LmNlbGwoKS5ib3goKSku
Ym9yZGVyQm94SGVpZ2h0KCkgfTsKLSAgICAgICAgYXV0byYgcm93cyA9IG1fZ3JpZC5yb3dzKCk7
Ci0gICAgICAgIGF1dG8gY29tcHV0ZWRSb3dIZWlnaHQgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdl
b21ldHJ5KCkuY29tcHV0ZWRIZWlnaHQocm93cy5saXN0KClbcm93SW5kZXhdLmJveCgpLCB7IH0p
OwotICAgICAgICBhdXRvIGhlaWdodCA9IHN0ZDo6bWF4PGZsb2F0Pihyb3dIZWlnaHRbcm93SW5k
ZXhdLCBjb21wdXRlZFJvd0hlaWdodC52YWx1ZU9yKDBfbHUpKTsKLSAgICAgICAgcmV0dXJuIEdy
aWRTcGFjZSB7IGhlaWdodCwgaGVpZ2h0IH07Ci0gICAgfSk7Ci19Ci0KLX0KLX0KLQotI2VuZGlm
Cg==
</data>
<flag name="commit-queue"
          id="448126"
          type_id="3"
          status="-"
          setter="ews-feeder"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>427503</attachid>
            <date>2021-05-01 09:38:10 -0700</date>
            <delta_ts>2021-05-01 09:46:00 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-225270-20210501093809.patch</filename>
            <type>text/plain</type>
            <size>1297369</size>
            <attacher name="alan">zalan</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc2ODczCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjk3NGJhNTg4ODg3ZGRh
NWI1ODllOGZiM2I1YTQwZWU1ZWUwMzgxYi4uYWVkYTU5ZmQ2OTg4NTkzNGYzZjYwZDU2MTczZTYy
NTQ1MDc3NzliZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDIxLTA1LTAxICBaYWxh
biBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CisKKyAgICAgICAgW0xGQ10gTW92ZSBmb3JtYXR0
aW5nIGNvbnRleHRzIHRvIGxheW91dC9mb3JtYXR0aW5nQ29udGV4dHMgZGlyZWN0b3J5CisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMjUyNzAKKworICAg
ICAgICBSZXZpZXdlZCBieSBBbnR0aSBLb2l2aXN0by4KKworICAgICAgICAqIENNYWtlTGlzdHMu
dHh0OgorICAgICAgICAqIFNvdXJjZXMudHh0OgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvajoKKwogMjAyMS0wNS0wMSAgWmFsYW4gQnVqdGFzICA8emFsYW5AYXBw
bGUuY29tPgogCiAgICAgICAgIFtSZW5kZXJUcmVlQnVpbGRlcl0gUmVzZXQgdGhlICJjaGlsZHJl
biBpbmxpbmUiIHN0YXRlIHdoZW4gbWVyZ2luZyBhbm9ueW1vdXMgdGFibGUgYm94ZXMKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNvcmUvQ01h
a2VMaXN0cy50eHQKaW5kZXggNGE0NWEyODg3OWM0YTc3YmYxNDMwMTZmMWMzNThmNGU1NWI2N2Y3
MC4uMDQ5OTUwNmRhZDRiMDA0ZTkzMTJmNTc2NDUyMDkyYjA5NjllNzhmNyAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VM
aXN0cy50eHQKQEAgLTEwMSwxNiArMTAxLDE2IEBAIHNldChXZWJDb3JlX1BSSVZBVEVfSU5DTFVE
RV9ESVJFQ1RPUklFUwogICAgICIke1dFQkNPUkVfRElSfS9pbnNwZWN0b3IvYWdlbnRzL3BhZ2Ui
CiAgICAgIiR7V0VCQ09SRV9ESVJ9L2luc3BlY3Rvci9hZ2VudHMvd29ya2VyIgogICAgICIke1dF
QkNPUkVfRElSfS9sYXlvdXQiCi0gICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9ibG9ja2Zvcm1h
dHRpbmciCi0gICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3
cmFwcGVyIgotICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvZmxleGZvcm1hdHRpbmciCisgICAg
IiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5n
IgorICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9y
bWF0dGluZy90YWJsZXdyYXBwZXIiCisgICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmciCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9m
bG9hdHMiCi0gICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9pbmxpbmVmb3JtYXR0aW5nIgotICAg
ICIke1dFQkNPUkVfRElSfS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy90ZXh0IgorICAgICIke1dF
QkNPUkVfRElSfS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmciCisg
ICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0
dGluZy90ZXh0IgogICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvaW50ZWdyYXRpb24iCiAgICAg
IiR7V0VCQ09SRV9ESVJ9L2xheW91dC9pbnZhbGlkYXRpb24iCiAgICAgIiR7V0VCQ09SRV9ESVJ9
L2xheW91dC9sYXlvdXR0cmVlIgotICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvdGFibGVmb3Jt
YXR0aW5nIgorICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3Rh
YmxlZm9ybWF0dGluZyIKICAgICAiJHtXRUJDT1JFX0RJUn0vbG9hZGVyIgogICAgICIke1dFQkNP
UkVfRElSfS9sb2FkZXIvYXBwY2FjaGUiCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xvYWRlci9hcmNo
aXZlIgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvSGVhZGVycy5jbWFrZSBiL1NvdXJjZS9X
ZWJDb3JlL0hlYWRlcnMuY21ha2UKaW5kZXggZmNlNzVjMDgwMjU5YWE2NjlhNjBhZjFhZTcxODNm
ZWQwYmFhN2ZlOS4uOTBkYWJiOTExM2I5MGQ3MmZkMDEyNDRkOTcwMTE5Y2E2ZTYyOThhMiAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvSGVhZGVycy5jbWFrZQorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9IZWFkZXJzLmNtYWtlCkBAIC03NTQsNyArNzU0LDcgQEAgc2V0KFdlYkNvcmVfUFJJVkFURV9G
UkFNRVdPUktfSEVBREVSUwogICAgIGxheW91dC9MYXlvdXRVbml0cy5oCiAgICAgbGF5b3V0L01h
cmdpblR5cGVzLmgKIAotICAgIGxheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVJlY3QuaAor
ICAgIGxheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVSZWN0
LmgKIAogICAgIGxheW91dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbklubGluZUNvbnRl
bnQuaAogICAgIGxheW91dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbkxpbmUuaApkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvU291cmNlcy50eHQgYi9Tb3VyY2UvV2ViQ29yZS9Tb3Vy
Y2VzLnR4dAppbmRleCA4Njk4ZDU2NTM2OWNlYjZjYzI0OGNkMjc1OWVjMjU5ZjA1OTkyNWNiLi4y
ZDkwNjE0OTNhNGYyNTA3Y2FhNGRmN2NkODc1MmZiMmEyNjI5YWJlIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9Tb3VyY2VzLnR4dAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Tb3VyY2VzLnR4dApA
QCAtMTUwOCw0MCArMTUwOCw0MCBAQCBpbnNwZWN0b3IvYWdlbnRzL3dvcmtlci9Xb3JrZXJET01E
ZWJ1Z2dlckFnZW50LmNwcAogaW5zcGVjdG9yL2FnZW50cy93b3JrZXIvV29ya2VyRGVidWdnZXJB
Z2VudC5jcHAKIGluc3BlY3Rvci9hZ2VudHMvd29ya2VyL1dvcmtlck5ldHdvcmtBZ2VudC5jcHAK
IGluc3BlY3Rvci9hZ2VudHMvd29ya2VyL1dvcmtlclJ1bnRpbWVBZ2VudC5jcHAKLWxheW91dC9G
b3JtYXR0aW5nQ29udGV4dC5jcHAKLWxheW91dC9Gb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNw
cAotbGF5b3V0L0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9Gb3JtYXR0aW5nQ29udGV4dC5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
Rm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCiBsYXlvdXQvRm9ybWF0dGluZ1N0YXRlLmNwcAog
bGF5b3V0L0xheW91dENvbnRleHQuY3BwCiBsYXlvdXQvTGF5b3V0UGhhc2UuY3BwCiBsYXlvdXQv
TGF5b3V0U3RhdGUuY3BwCiBsYXlvdXQvTGF5b3V0VW5pdHMuY3BwCiBsYXlvdXQvVmVyaWZpY2F0
aW9uLmNwcAotbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNw
cAotbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnku
Y3BwCi1sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3Mu
Y3BwCi1sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmNwcAotbGF5
b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja01hcmdpbkNvbGxhcHNlLmNwcAotbGF5b3V0L2Jsb2Nr
Zm9ybWF0dGluZy9QcmVjb21wdXRlZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCi1sYXlvdXQvYmxv
Y2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0LmNwcAotbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVy
QmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKLWxheW91dC9mbGV4Zm9ybWF0dGluZy9G
bGV4Rm9ybWF0dGluZ0NvbnRleHQuY3BwCi1sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1h
dHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCi1sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1h
dHRpbmdTdGF0ZS5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5n
L0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Js
b2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCitsYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0
UXVpcmtzLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxv
Y2tGb3JtYXR0aW5nU3RhdGUuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9y
bWF0dGluZy9CbG9ja01hcmdpbkNvbGxhcHNlLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9ibG9ja2Zvcm1hdHRpbmcvUHJlY29tcHV0ZWRCbG9ja01hcmdpbkNvbGxhcHNlLmNwcAorbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxl
V3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0
aW5nQ29udGV4dFF1aXJrcy5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1h
dHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKK2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5j
cHAKIGxheW91dC9mbG9hdHMvRmxvYXRBdm9pZGVyLmNwcAogbGF5b3V0L2Zsb2F0cy9GbG9hdGlu
Z0NvbnRleHQuY3BwCiBsYXlvdXQvZmxvYXRzL0Zsb2F0aW5nU3RhdGUuY3BwCi1sYXlvdXQvaW5s
aW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5jcHAKLWxheW91dC9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmNwcAotbGF5b3V0L2lubGluZWZvcm1hdHRp
bmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKLWxheW91dC9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcAotbGF5b3V0L2lubGluZWZv
cm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmNwcAotbGF5b3V0L2lubGluZWZvcm1hdHRp
bmcvSW5saW5lSXRlbS5jcHAKLWxheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUuY3Bw
Ci1sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94LmNwcAotbGF5b3V0L2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxkZXIuY3BwCi1sYXlvdXQvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVUZXh0SXRlbS5jcHAKLWxheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0
aWwuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5l
Q29udGVudEJyZWFrZXIuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1h
dHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAK
K2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0
aW5nQ29udGV4dFF1aXJrcy5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9y
bWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lSXRlbS5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwCitsYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxkZXIuY3BwCitsYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uY3Bw
CitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvdGV4dC9UZXh0VXRp
bC5jcHAKIGxheW91dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbkJveFRyZWUuY3BwCiBs
YXlvdXQvaW50ZWdyYXRpb24vTGF5b3V0SW50ZWdyYXRpb25Db3ZlcmFnZS5jcHAKIGxheW91dC9p
bnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbklubGluZUNvbnRlbnRCdWlsZGVyLmNwcApAQCAt
MTU2MCwxMiArMTU2MCwxMiBAQCBsYXlvdXQvbGF5b3V0dHJlZS9MYXlvdXRJbmxpbmVUZXh0Qm94
LmNwcAogbGF5b3V0L2xheW91dHRyZWUvTGF5b3V0TGluZUJyZWFrQm94LmNwcAogbGF5b3V0L2xh
eW91dHRyZWUvTGF5b3V0UmVwbGFjZWRCb3guY3BwCiBsYXlvdXQvbGF5b3V0dHJlZS9MYXlvdXRU
cmVlQnVpbGRlci5jcHAKLWxheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29u
dGV4dC5jcHAKLWxheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dEdl
b21ldHJ5LmNwcAotbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0
UXVpcmtzLmNwcAotbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5j
cHAKLWxheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmNwcAotbGF5b3V0L3RhYmxlZm9y
bWF0dGluZy9UYWJsZUxheW91dC5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVm
b3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3Bw
CitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRp
bmdDb250ZXh0UXVpcmtzLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1h
dHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L3RhYmxlZm9ybWF0dGluZy9UYWJsZUxheW91dC5jcHAKIGxvYWRlci9Qcml2YXRlQ2xpY2tNZWFz
dXJlbWVudC5jcHAKIGxvYWRlci9BcHBsaWNhdGlvbk1hbmlmZXN0TG9hZGVyLmNwcAogbG9hZGVy
L0NhbnZhc0FjdGl2aXR5UmVjb3JkLmNwcApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IDZjZmY0ZTk5ZGViNGUzMDM1OGEyZTQ1NmI1
ZGQ1MGIyYzBhMzUwNjAuLjY2ZDRmZGY1ZjM0Nzg5NThlNzg5YzMwMzEyZTM2MzAzMmRkZTIyNDcg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2oKQEAgLTE4MTc5LDE4ICsxODE3OSwxMSBAQAogCQkxMTVDRkE2NjIwOEFGNzIwMDAxRTY5OTEg
LyogbGF5b3V0ICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKLQkJ
CQkxMTVDRkE5OTIwOEJDMDlBMDAxRTY5OTEgLyogYmxvY2tmb3JtYXR0aW5nICovLAotCQkJCTZG
QjdEMkQ1MjUwRkQ3QjUwMDAyMDdBQSAvKiBmbGV4Zm9ybWF0dGluZyAqLywKIAkJCQk2RkNGQzA1
NTIxMkRBQ0MyMDA3Njk1RDIgLyogZmxvYXRzICovLAotCQkJCTExNUNGQTlBMjA4QkMxNDAwMDFF
Njk5MSAvKiBpbmxpbmVmb3JtYXR0aW5nICovLAorCQkJCTZGODQ0RjdGMjYzRDkxNjEwMEY5MTM3
MCAvKiBmb3JtYXR0aW5nQ29udGV4dHMgKi8sCiAJCQkJRTRGQjRCMUUyMzk1MzU2RjAwM0MzMzZB
IC8qIGludGVncmF0aW9uICovLAogCQkJCTZGOTVERTRBMjM3Qjg4MzAwMEU1MTdFMSAvKiBpbnZh
bGlkYXRpb24gKi8sCiAJCQkJMTE1Q0ZBOTAyMDhCOTQ0MTAwMUU2OTkxIC8qIGxheW91dHRyZWUg
Ki8sCi0JCQkJNkZDNUNBOTEyMkUzNTkzMzAwQjEzRTExIC8qIHRhYmxlZm9ybWF0dGluZyAqLywK
LQkJCQkxMTVDRkE2OTIwOEFGN0QwMDAxRTY5OTEgLyogRm9ybWF0dGluZ0NvbnRleHQuY3BwICov
LAotCQkJCTExNUNGQTY4MjA4QUY3RDAwMDFFNjk5MSAvKiBGb3JtYXR0aW5nQ29udGV4dC5oICov
LAotCQkJCTZGQkI4NjA1MjBCNDY0QjYwMERBRDkzOCAvKiBGb3JtYXR0aW5nQ29udGV4dEdlb21l
dHJ5LmNwcCAqLywKLQkJCQk2RjhGNDYwMTIxQjAzQkI0MDA0MUFDM0EgLyogRm9ybWF0dGluZ0Nv
bnRleHRRdWlya3MuY3BwICovLAogCQkJCTExNUNGQTc1MjA4QUZFMzAwMDFFNjk5MSAvKiBGb3Jt
YXR0aW5nU3RhdGUuY3BwICovLAogCQkJCTExNUNGQTc0MjA4QUZFMzAwMDFFNjk5MSAvKiBGb3Jt
YXR0aW5nU3RhdGUuaCAqLywKIAkJCQk2RjI2QkI2OTIzMzQzRTVBMDAyRjJCRUEgLyogTGF5b3V0
Q29udGV4dC5jcHAgKi8sCkBAIC0yMjYwMSw2ICsyMjU5NCwyMSBAQAogCQkJcGF0aCA9IGFuZ2xl
OwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKIAkJfTsKKwkJNkY4NDRGN0YyNjNEOTE2MTAw
RjkxMzcwIC8qIGZvcm1hdHRpbmdDb250ZXh0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOwor
CQkJY2hpbGRyZW4gPSAoCisJCQkJMTE1Q0ZBOTkyMDhCQzA5QTAwMUU2OTkxIC8qIGJsb2NrZm9y
bWF0dGluZyAqLywKKwkJCQk2RkI3RDJENTI1MEZEN0I1MDAwMjA3QUEgLyogZmxleGZvcm1hdHRp
bmcgKi8sCisJCQkJMTE1Q0ZBOUEyMDhCQzE0MDAwMUU2OTkxIC8qIGlubGluZWZvcm1hdHRpbmcg
Ki8sCisJCQkJNkZDNUNBOTEyMkUzNTkzMzAwQjEzRTExIC8qIHRhYmxlZm9ybWF0dGluZyAqLywK
KwkJCQkxMTVDRkE2OTIwOEFGN0QwMDAxRTY5OTEgLyogRm9ybWF0dGluZ0NvbnRleHQuY3BwICov
LAorCQkJCTExNUNGQTY4MjA4QUY3RDAwMDFFNjk5MSAvKiBGb3JtYXR0aW5nQ29udGV4dC5oICov
LAorCQkJCTZGQkI4NjA1MjBCNDY0QjYwMERBRDkzOCAvKiBGb3JtYXR0aW5nQ29udGV4dEdlb21l
dHJ5LmNwcCAqLywKKwkJCQk2RjhGNDYwMTIxQjAzQkI0MDA0MUFDM0EgLyogRm9ybWF0dGluZ0Nv
bnRleHRRdWlya3MuY3BwICovLAorCQkJKTsKKwkJCXBhdGggPSBmb3JtYXR0aW5nQ29udGV4dHM7
CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OwogCQk2Rjk1REU0QTIzN0I4ODMwMDBF
NTE3RTEgLyogaW52YWxpZGF0aW9uICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGls
ZHJlbiA9ICgKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29u
dGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRm9ybWF0dGluZ0NvbnRleHQuY3BwCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODU3ZGJhMmM3ZDY1Mjk2MGM0MTFmYWJjYTM1
NzU4Njk1YmExMTI4Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dC5jcHAKKysrIC9kZXYv
bnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwot
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIK
LSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JN
QVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRl
ICJJbnZhbGlkYXRpb25TdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUg
IkxheW91dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCi0j
aW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dERlc2NlbmRhbnRJdGVy
YXRvci5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKLSNpbmNs
dWRlICJMYXlvdXRSZXBsYWNlZEJveC5oIgotI2luY2x1ZGUgIkxheW91dFN0YXRlLmgiCi0jaW5j
bHVkZSAiTG9nZ2luZy5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0jaW5j
bHVkZSA8d3RmL3RleHQvVGV4dFN0cmVhbS5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1l
c3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEZvcm1hdHRpbmdD
b250ZXh0KTsKLQotRm9ybWF0dGluZ0NvbnRleHQ6OkZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENv
bnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBGb3JtYXR0aW5nU3RhdGUmIGZvcm1h
dHRpbmdTdGF0ZSkKLSAgICA6IG1fcm9vdChtYWtlV2Vha1B0cihmb3JtYXR0aW5nQ29udGV4dFJv
b3QpKQotICAgICwgbV9mb3JtYXR0aW5nU3RhdGUoZm9ybWF0dGluZ1N0YXRlKQotewotICAgIEFT
U0VSVChmb3JtYXR0aW5nQ29udGV4dFJvb3QuaGFzQ2hpbGQoKSk7Ci0jaWZuZGVmIE5ERUJVRwot
ICAgIGxheW91dFN0YXRlKCkucmVnaXN0ZXJGb3JtYXR0aW5nQ29udGV4dCgqdGhpcyk7Ci0jZW5k
aWYKLX0KLQotRm9ybWF0dGluZ0NvbnRleHQ6On5Gb3JtYXR0aW5nQ29udGV4dCgpCi17Ci0jaWZu
ZGVmIE5ERUJVRwotICAgIGxheW91dFN0YXRlKCkuZGVyZWdpc3RlckZvcm1hdHRpbmdDb250ZXh0
KCp0aGlzKTsKLSNlbmRpZgotfQotCi1MYXlvdXRTdGF0ZSYgRm9ybWF0dGluZ0NvbnRleHQ6Omxh
eW91dFN0YXRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9mb3JtYXR0aW5nU3RhdGUubGF5b3V0
U3RhdGUoKTsKLX0KLQotdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZU91dE9mRmxvd0hv
cml6b250YWxHZW9tZXRyeShjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29uc3RyYWludHNG
b3JPdXRPZkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94
LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKLSAgICBhdXRvIGNvbXB1dGUgPSBbJl0oT3B0aW9u
YWw8TGF5b3V0VW5pdD4gdXNlZFdpZHRoKSB7Ci0gICAgICAgIHJldHVybiBnZW9tZXRyeSgpLm91
dE9mRmxvd0hvcml6b250YWxHZW9tZXRyeShsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250
YWwsIGNvbnN0cmFpbnRzLnZlcnRpY2FsLCB7IHVzZWRXaWR0aCwgeyB9IH0pOwotICAgIH07Ci0K
LSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gY29uc3RyYWludHMuaG9yaXpvbnRhbC5s
b2dpY2FsV2lkdGg7Ci0gICAgYXV0byBob3Jpem9udGFsR2VvbWV0cnkgPSBjb21wdXRlKHsgfSk7
Ci0gICAgaWYgKGF1dG8gbWF4V2lkdGggPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWF4V2lkdGgobGF5
b3V0Qm94LCBjb250YWluaW5nQmxvY2tXaWR0aCkpIHsKLSAgICAgICAgYXV0byBtYXhIb3Jpem9u
dGFsR2VvbWV0cnkgPSBjb21wdXRlKG1heFdpZHRoKTsKLSAgICAgICAgaWYgKGhvcml6b250YWxH
ZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoID4gbWF4SG9yaXpvbnRh
bEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCi0gICAgICAgICAg
ICBob3Jpem9udGFsR2VvbWV0cnkgPSBtYXhIb3Jpem9udGFsR2VvbWV0cnk7Ci0gICAgfQotCi0g
ICAgaWYgKGF1dG8gbWluV2lkdGggPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluV2lkdGgobGF5b3V0
Qm94LCBjb250YWluaW5nQmxvY2tXaWR0aCkpIHsKLSAgICAgICAgYXV0byBtaW5Ib3Jpem9udGFs
R2VvbWV0cnkgPSBjb21wdXRlKG1pbldpZHRoKTsKLSAgICAgICAgaWYgKGhvcml6b250YWxHZW9t
ZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoIDwgbWluSG9yaXpvbnRhbEdl
b21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCi0gICAgICAgICAgICBo
b3Jpem9udGFsR2VvbWV0cnkgPSBtaW5Ib3Jpem9udGFsR2VvbWV0cnk7Ci0gICAgfQotCi0gICAg
YXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRC
b3gpOwotICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxMZWZ0KGhvcml6b250YWxHZW9tZXRyeS5s
ZWZ0ICsgaG9yaXpvbnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2lu
LnN0YXJ0KTsKLSAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoaG9yaXpvbnRhbEdl
b21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOwotICAgIGF1dG8mIHVz
ZWRIb3Jpem9udGFsTWFyZ2luID0gaG9yaXpvbnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1h
cmdpbi51c2VkTWFyZ2luOwotICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyB1
c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCwgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kIH0pOwot
fQotCi12b2lkIEZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlT3V0T2ZGbG93VmVydGljYWxHZW9t
ZXRyeShjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29uc3RyYWludHNGb3JPdXRPZkZsb3dD
b250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3V0T2ZGbG93
UG9zaXRpb25lZCgpKTsKLSAgICBhdXRvIGNvbXB1dGUgPSBbJl0oT3B0aW9uYWw8TGF5b3V0VW5p
dD4gdXNlZEhlaWdodCkgewotICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5vdXRPZkZsb3dWZXJ0
aWNhbEdlb21ldHJ5KGxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwgY29uc3RyYWlu
dHMudmVydGljYWwsIHsgdXNlZEhlaWdodCB9KTsKLSAgICB9OwotCi0gICAgYXV0byBjb250YWlu
aW5nQmxvY2tIZWlnaHQgPSAqY29uc3RyYWludHMudmVydGljYWwubG9naWNhbEhlaWdodDsKLSAg
ICBhdXRvIHZlcnRpY2FsR2VvbWV0cnkgPSBjb21wdXRlKHsgfSk7Ci0gICAgaWYgKGF1dG8gbWF4
SGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1heEhlaWdodChsYXlvdXRCb3gsIGNvbnRhaW5p
bmdCbG9ja0hlaWdodCkpIHsKLSAgICAgICAgYXV0byBtYXhWZXJ0aWNhbEdlb21ldHJ5ID0gY29t
cHV0ZShtYXhIZWlnaHQpOwotICAgICAgICBpZiAodmVydGljYWxHZW9tZXRyeS5jb250ZW50SGVp
Z2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPiBtYXhWZXJ0aWNhbEdlb21ldHJ5LmNvbnRlbnRI
ZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCkKLSAgICAgICAgICAgIHZlcnRpY2FsR2VvbWV0
cnkgPSBtYXhWZXJ0aWNhbEdlb21ldHJ5OwotICAgIH0KLQotICAgIGlmIChhdXRvIG1pbkhlaWdo
dCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNaW5IZWlnaHQobGF5b3V0Qm94LCBjb250YWluaW5nQmxv
Y2tIZWlnaHQpKSB7Ci0gICAgICAgIGF1dG8gbWluVmVydGljYWxHZW9tZXRyeSA9IGNvbXB1dGUo
bWluSGVpZ2h0KTsKLSAgICAgICAgaWYgKHZlcnRpY2FsR2VvbWV0cnkuY29udGVudEhlaWdodEFu
ZE1hcmdpbi5jb250ZW50SGVpZ2h0IDwgbWluVmVydGljYWxHZW9tZXRyeS5jb250ZW50SGVpZ2h0
QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpCi0gICAgICAgICAgICB2ZXJ0aWNhbEdlb21ldHJ5ID0g
bWluVmVydGljYWxHZW9tZXRyeTsKLSAgICB9Ci0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZv
cm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgYXV0byBub25Db2xs
YXBzZWRWZXJ0aWNhbE1hcmdpbiA9IHZlcnRpY2FsR2VvbWV0cnkuY29udGVudEhlaWdodEFuZE1h
cmdpbi5ub25Db2xsYXBzZWRNYXJnaW47Ci0gICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcCh2
ZXJ0aWNhbEdlb21ldHJ5LnRvcCArIG5vbkNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSk7
Ci0gICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodCh2ZXJ0aWNhbEdlb21ldHJ5LmNv
bnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCk7Ci0gICAgLy8gTWFyZ2lucyBvZiBh
YnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgotICAgIGJveEdlb21l
dHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgbm9uQ29sbGFwc2VkVmVydGljYWxNYXJnaW4uYmVmb3Jl
LCBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciB9KTsKLX0KLQotdm9pZCBGb3JtYXR0
aW5nQ29udGV4dDo6Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoY29uc3QgQm94JiBsYXlvdXRCb3gs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnQpCi17Ci0g
ICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlv
dXRCb3gpOwotICAgIGJveEdlb21ldHJ5LnNldEJvcmRlcihnZW9tZXRyeSgpLmNvbXB1dGVkQm9y
ZGVyKGxheW91dEJveCkpOwotICAgIGJveEdlb21ldHJ5LnNldFBhZGRpbmcoZ2VvbWV0cnkoKS5j
b21wdXRlZFBhZGRpbmcobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludC5sb2dpY2FsV2lk
dGgpKTsKLX0KLQotdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0T3V0T2ZGbG93Q29udGVu
dChJbnZhbGlkYXRpb25TdGF0ZSYgaW52YWxpZGF0aW9uU3RhdGUsIGNvbnN0IENvbnN0cmFpbnRz
Rm9yT3V0T2ZGbG93Q29udGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgTE9HX1dJVEhfU1RSRUFN
KEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIlN0YXJ0OiBsYXlvdXQgb3V0LW9m
LWZsb3cgY29udGVudCAtPiBjb250ZXh0OiAiIDw8ICZsYXlvdXRTdGF0ZSgpIDw8ICIgcm9vdDog
IiA8PCAmcm9vdCgpKTsKLQotICAgIGNvbGxlY3RPdXRPZkZsb3dEZXNjZW5kYW50c0lmTmVlZGVk
KCk7Ci0KLSAgICBhdXRvIGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94ID0gWyZdIChjb25zdCBhdXRv
JiBvdXRPZkZsb3dCb3gpIHsKLSAgICAgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gb3V0T2ZG
bG93Qm94LmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICByZXR1cm4gJmNvbnRhaW5pbmdCbG9j
ayA9PSAmcm9vdCgpID8gY29uc3RyYWludHMgOiBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9yT3V0
T2ZGbG93Q29udGVudChjb250YWluaW5nQmxvY2spOwotICAgIH07Ci0KLSAgICBmb3IgKGF1dG8m
IG91dE9mRmxvd0JveCA6IGZvcm1hdHRpbmdTdGF0ZSgpLm91dE9mRmxvd0JveGVzKCkpIHsKLSAg
ICAgICAgQVNTRVJUKG91dE9mRmxvd0JveC0+ZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgp
KTsKLSAgICAgICAgaWYgKCFpbnZhbGlkYXRpb25TdGF0ZS5uZWVkc0xheW91dCgqb3V0T2ZGbG93
Qm94KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGF1dG8gY29udGFpbmluZ0Js
b2NrQ29uc3RyYWludHMgPSBjb25zdHJhaW50c0ZvckxheW91dEJveCgqb3V0T2ZGbG93Qm94KTsK
LSAgICAgICAgYXV0byBob3Jpem9udGFsQ29uc3RyYWludHNGb3JCb3JkZXJBbmRQYWRkaW5nID0g
SG9yaXpvbnRhbENvbnN0cmFpbnRzIHsgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9yaXpv
bnRhbC5sb2dpY2FsTGVmdCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuYm9yZGVyQW5kUGFk
ZGluZ0NvbnN0cmFpbnRzIH07Ci0gICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpvdXRP
ZkZsb3dCb3gsIGhvcml6b250YWxDb25zdHJhaW50c0ZvckJvcmRlckFuZFBhZGRpbmcpOwotCi0g
ICAgICAgIGNvbXB1dGVPdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkoKm91dE9mRmxvd0JveCwg
Y29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMpOwotICAgICAgICBhdXRvIG91dE9mRmxvd0JveEhh
c0NvbnRlbnQgPSBpczxDb250YWluZXJCb3g+KCpvdXRPZkZsb3dCb3gpICYmIGRvd25jYXN0PENv
bnRhaW5lckJveD4oKm91dE9mRmxvd0JveCkuaGFzQ2hpbGQoKTsKLSAgICAgICAgaWYgKG91dE9m
Rmxvd0JveEhhc0NvbnRlbnQpIHsKLSAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5lckJveCA9IGRv
d25jYXN0PENvbnRhaW5lckJveD4oKm91dE9mRmxvd0JveCk7Ci0gICAgICAgICAgICBhdXRvIGZv
cm1hdHRpbmdDb250ZXh0ID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQo
Y29udGFpbmVyQm94LCBsYXlvdXRTdGF0ZSgpKTsKLSAgICAgICAgICAgIGlmIChjb250YWluZXJC
b3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCi0gICAgICAgICAgICAgICAgZm9ybWF0dGlu
Z0NvbnRleHQtPmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGdlb21ldHJ5
KCkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KGNvbnRhaW5lckJveCkpOwotICAgICAgICAg
ICAgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoY29udGFpbmVyQm94LCBjb250YWlu
aW5nQmxvY2tDb25zdHJhaW50cyk7Ci0gICAgICAgICAgICBmb3JtYXR0aW5nQ29udGV4dC0+bGF5
b3V0T3V0T2ZGbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5jb25zdHJh
aW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7Ci0gICAgICAgIH0gZWxzZQot
ICAgICAgICAgICAgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoKm91dE9mRmxvd0Jv
eCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMpOwotICAgIH0KLSAgICBMT0dfV0lUSF9TVFJF
QU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiRW5kOiBsYXlvdXQgb3V0LW9m
LWZsb3cgY29udGVudCAtPiBjb250ZXh0OiAiIDw8ICZsYXlvdXRTdGF0ZSgpIDw8ICIgcm9vdDog
IiA8PCAmcm9vdCgpKTsKLX0KLQotY29uc3QgQm94R2VvbWV0cnkmIEZvcm1hdHRpbmdDb250ZXh0
OjpnZW9tZXRyeUZvckJveChjb25zdCBCb3gmIGxheW91dEJveCwgT3B0aW9uYWw8RXNjYXBlUmVh
c29uPiBlc2NhcGVSZWFzb24pIGNvbnN0Ci17Ci0gICAgVU5VU0VEX1BBUkFNKGVzY2FwZVJlYXNv
bik7Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICBhdXRvIGlzT2tUb0FjY2Vzc0JveEdlb21ldHJ5
ID0gWyZdIHsKLSAgICAgICAgaWYgKCFpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihsYXlvdXRC
b3gpICYmICZsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCkgPT0gJnJvb3QoKSkgewot
ICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbm9uLWVzY2FwZSBjYXNlIG9mIGFjY2Vzc2luZyBh
IGJveCdzIGdlb21ldHJ5IGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgc2FtZSBmb3JtYXR0aW5nIGNv
bnRleHQuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlm
ICghZXNjYXBlUmVhc29uKSB7Ci0gICAgICAgICAgICAvLyBBbnkgZ2VvbWV0cnkgYWNjZXNzIG91
dHNpZGUgb2YgdGhlIGZvcm1hdHRpbmcgY29udGV4dCB3aXRob3V0IGEgdmFsaWQgcmVhc29uIGlz
IGNvbnNpZGVyZWQgYW4gZXNjYXBlLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICB9Ci0KLSAgICAgICAgaWYgKCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpEb2N1bWVu
dEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaykgewotICAgICAgICAgICAgQVNTRVJUKGxheW91
dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGlzPEluaXRpYWxD
b250YWluaW5nQmxvY2s+KGxheW91dEJveCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKmVz
Y2FwZVJlYXNvbiA9PSBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmsp
IHsKLSAgICAgICAgICAgIEFTU0VSVChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpKTsKLSAg
ICAgICAgICAgIHJldHVybiBpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihsYXlvdXRCb3gpIHx8
IGxheW91dEJveC5pc0RvY3VtZW50Qm94KCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgq
ZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNvbjo6VGFibGVRdWlya05lZWRzR2VvbWV0cnlGcm9t
RXN0YWJsaXNoZWRGb3JtYXR0aW5nQ29udGV4dCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyB0
aGUgY2FzZSB3aGVuIHRoZSB0YWJsZSBmb3JtYXR0aW5nIHJvb3QgY29sbGVjdHMgZ2VvbWV0cnkg
aW5mb3JtYXRpb24gZnJvbSB0aGUgY2VsbCdzCi0gICAgICAgICAgICAvLyBmb3JtYXR0aW5nIGNv
bnRleHQgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgd2lkdGgvaGVpZ2h0LiBzZWUgc2hvdWxkSWdu
b3JlQ2hpbGRDb250ZW50VmVydGljYWxNYXJnaW4KLSAgICAgICAgICAgIEFTU0VSVChyb290KCku
ZXN0YWJsaXNoZXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkpOwotICAgICAgICAgICAgcmV0dXJu
ICZsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCkuZm9ybWF0dGluZ0NvbnRleHRSb290
KCkgPT0gJnJvb3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgqZXNjYXBlUmVhc29uID09
IEVzY2FwZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRyeSkgewotICAgICAg
ICAgICAgLy8gV2hlbiBjb21wdXRpbmcgdGhlIHN0YXRpYyBwb3NpdGlvbiBvZiBhbiBvdXQtb2Yt
ZmxvdyBib3gsIHdlIG5lZWQgdG8gZ2F0aGVyIHNpYmxpbmcvcGFyZW50IGdlb21ldHJ5IGluZm9y
bWF0aW9uCi0gICAgICAgICAgICAvLyBhcyBpZiB0aGUgb3V0LW9mLWZsb3cgYm94IHdhcyBhIHNp
bXBsZSBpbmZsb3cgYm94LgotICAgICAgICAgICAgLy8gTm93IHNpbmNlIHRoZSBvdXQtb2YtZmxv
dyBhbmQgdGhlIHNpYmxpbmcvcGFyZW50IGJveGVzIGNvdWxkIHZlcnkgd2VsbCBiZSBpbiBkaWZm
ZXJlbnQgY29udGFpbmluZyBibG9jayBzdWJ0cmVlcwotICAgICAgICAgICAgLy8gdGhlIGZvcm1h
dHRpbmcgY29udGV4dCB0aGV5IGxpdmUgaW4gY291bGQgYWxzbyBiZSB2ZXJ5IGRpZmZlcmVudC4K
LSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCplc2Nh
cGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpGbG9hdEJveElzQWx3YXlzUmVsYXRpdmVUb0Zsb2F0
U3RhdGVSb290KSB7Ci0gICAgICAgICAgICAvLyBGbG9hdCBib3ggdG9wL2xlZnQgdmFsdWVzIGFy
ZSBtYXBwZWQgcmVsYXRpdmUgdG8gdGhlIEZsb2F0U3RhdGUncyByb290LiBJbmxpbmUgZm9ybWF0
dGluZyBjb250ZXh0cyhBKSBpbmhlcml0IGZsb2F0cyBmcm9tIHBhcmVudAotICAgICAgICAgICAg
Ly8gYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cyhCKS4gRmxvYXRzIGluIHRoZXNlIGlubGluZSBm
b3JtYXR0aW5nIGNvbnRleHRzKEEpIG5lZWQgdG8gYmUgbWFwcGVkIHRvIHRoZSBwYXJlbnQsIGJs
b2NrIGZvcm1hdHRpbmcgY29udGV4dChCKS4KLSAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdD
b250ZXh0Um9vdCA9IGxheW91dEJveC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKLSAgICAgICAg
ICAgIHJldHVybiAmZm9ybWF0dGluZ0NvbnRleHRSb290ID09ICZyb290KCkgfHwgJmZvcm1hdHRp
bmdDb250ZXh0Um9vdCA9PSAmcm9vdCgpLmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgaWYgKCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpGaW5kRml4
ZWRIZWlnaHRBbmNlc3RvclF1aXJrKSB7Ci0gICAgICAgICAgICBBU1NFUlQobGF5b3V0U3RhdGUo
KS5pblF1aXJrc01vZGUoKSk7Ci0gICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBjb250YWlu
aW5nIGJsb2NrIHdpdGggZml4ZWQgaGVpZ2h0IHF1aXJrLiBTZWUgUXVpcmtzOjpoZWlnaHRWYWx1
ZU9mTmVhcmVzdENvbnRhaW5pbmdCbG9ja1dpdGhGaXhlZEhlaWdodC4KLSAgICAgICAgICAgIC8v
IFRoaXMgaXMgb25seSB0byBjaGVjayBpZiB0aGUgdGFyZ2V0Rm9ybWF0dGluZ1Jvb3QgaXMgYW4g
YW5jZXN0b3IgZm9ybWF0dGluZyByb290LgotICAgICAgICAgICAgaWYgKGlzPEluaXRpYWxDb250
YWluaW5nQmxvY2s+KGxheW91dEJveCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgICAgICAgICBhdXRvJiB0YXJnZXRGb3JtYXR0aW5nUm9vdCA9IGxheW91dEJveC5mb3JtYXR0
aW5nQ29udGV4dFJvb3QoKTsKLSAgICAgICAgICAgIGF1dG8qIGFuY2VzdG9yRm9ybWF0dGluZ0Nv
bnRleHRSb290ID0gJnJvb3QoKS5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKLSAgICAgICAgICAg
IHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCZ0YXJnZXRGb3JtYXR0aW5nUm9v
dCA9PSBhbmNlc3RvckZvcm1hdHRpbmdDb250ZXh0Um9vdCkKLSAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgYW5jZXN0b3JGb3JtYXR0aW5nQ29udGV4dFJv
b3QgPSAmYW5jZXN0b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QtPmZvcm1hdHRpbmdDb250ZXh0Um9v
dCgpOwotICAgICAgICAgICAgICAgIGlmIChpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPigqYW5j
ZXN0b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
fQotCi0gICAgICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNvbjo6VGFibGVOZWVk
c0FjY2Vzc1RvVGFibGVXcmFwcGVyKSB7Ci0gICAgICAgICAgICAvLyBUYWJsZXMgYXJlIHdyYXBw
ZWQgaW4gYSAyIGxldmVsIGZvcm1hdHRpbmcgY29udGV4dCBzdHJ1Y3R1cmUuIEEgPHRhYmxlPiBl
bGVtZW50IGluaXRpYXRlcyBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBmb3IgaXRzIHByaW5j
aXBhbCB0YWJsZSBib3gKLSAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBjYXB0aW9uIGFuZCB0aGUg
dGFibGUgY29udGVudCBsaXZlLiBJdCBhbHNvIGluaXRpYXRlcyBhIHRhYmxlIHdyYXBwZXIgYm94
IHdoaWNoIGVzdGFibGlzaGVzIHRoZSB0YWJsZSBmb3JtYXR0aW5nIGNvbnRleHQuCi0gICAgICAg
ICAgICAvLyBJbiBtYW55IGNhc2VzIHRoZSBURkMgbmVlZHMgYWNjZXNzIHRvIHRoZSBwYXJlbnQg
KGdlbmVyYXRlZCkgQkZDLgotICAgICAgICAgICAgcmV0dXJuICZsYXlvdXRCb3ggPT0gJnJvb3Qo
KS5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfTsKLSNlbmRpZgotICAg
IEFTU0VSVChpc09rVG9BY2Nlc3NCb3hHZW9tZXRyeSgpKTsKLSAgICBBU1NFUlQobGF5b3V0U3Rh
dGUoKS5oYXNCb3hHZW9tZXRyeShsYXlvdXRCb3gpKTsKLSAgICByZXR1cm4gbGF5b3V0U3RhdGUo
KS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwotfQotCi12b2lkIEZvcm1hdHRpbmdDb250ZXh0
Ojpjb2xsZWN0T3V0T2ZGbG93RGVzY2VuZGFudHNJZk5lZWRlZCgpCi17Ci0gICAgaWYgKCFmb3Jt
YXR0aW5nU3RhdGUoKS5vdXRPZkZsb3dCb3hlcygpLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJu
OwotICAgIGF1dG8mIHJvb3QgPSB0aGlzLT5yb290KCk7Ci0gICAgaWYgKCFyb290Lmhhc0NoaWxk
KCkpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoIXJvb3QuaXNQb3NpdGlvbmVkKCkgJiYgIWlz
PEluaXRpYWxDb250YWluaW5nQmxvY2s+KHJvb3QpKQotICAgICAgICByZXR1cm47Ci0gICAgLy8g
Q29sbGVjdCB0aGUgb3V0LW9mLWZsb3cgZGVzY2VuZGFudHMgYXQgdGhlIGZvcm1hdHRpbmcgcm9v
dCBsZXZlbCAoYXMgb3Bwb3NlZCB0byBhdCB0aGUgY29udGFpbmluZyBibG9jayBsZXZlbCwgdGhv
dWdoIHRoZXkgbWlnaHQgYmUgdGhlIHNhbWUpLgotICAgIC8vIEZJWE1FOiBUdXJuIHRoaXMgaW50
byBhIHJlZ2lzdGVyLXNlbGYgYXMgYm94ZXMgYXJlIGJlaW5nIGluc2VydGVkLgotICAgIGZvciAo
YXV0byYgZGVzY2VuZGFudCA6IGRlc2NlbmRhbnRzT2ZUeXBlPEJveD4ocm9vdCkpIHsKLSAgICAg
ICAgaWYgKCFkZXNjZW5kYW50LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIGlmICgmZGVzY2VuZGFudC5mb3JtYXR0aW5nQ29udGV4dFJvb3Qo
KSAhPSAmcm9vdCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBmb3JtYXR0aW5nU3Rh
dGUoKS5hZGRPdXRPZkZsb3dCb3goZGVzY2VuZGFudCk7Ci0gICAgfQotfQotCi0jaWZuZGVmIE5E
RUJVRwotdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6dmFsaWRhdGVHZW9tZXRyeUNvbnN0cmFpbnRz
QWZ0ZXJMYXlvdXQoKSBjb25zdAotewotICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0Um9vdCA9
IHJvb3QoKTsKLSAgICAvLyBGSVhNRTogYWRkIGEgZGVzY2VuZGFudHNPZlR5cGU8PiBmbGF2b3Ig
dGhhdCBzdG9wcyBhdCBuZXN0ZWQgZm9ybWF0dGluZyBjb250ZXh0cwotICAgIGZvciAoYXV0byYg
bGF5b3V0Qm94IDogZGVzY2VuZGFudHNPZlR5cGU8Qm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3Qp
KSB7Ci0gICAgICAgIGlmICgmbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpICE9ICZm
b3JtYXR0aW5nQ29udGV4dFJvb3QpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgYXV0
byYgY29udGFpbmluZ0Jsb2NrR2VvbWV0cnkgPSBnZW9tZXRyeUZvckJveChsYXlvdXRCb3guY29u
dGFpbmluZ0Jsb2NrKCkpOwotICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGdlb21ldHJ5Rm9y
Qm94KGxheW91dEJveCk7Ci0KLSAgICAgICAgLy8gMTAuMy4zIEJsb2NrLWxldmVsLCBub24tcmVw
bGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cKLSAgICAgICAgLy8gMTAuMy43IEFic29sdXRl
bHkgcG9zaXRpb25lZCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzCi0gICAgICAgIGlmICgobGF5b3V0
Qm94LmlzQmxvY2tMZXZlbEJveCgpIHx8IGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQo
KSkgJiYgIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpIHsKLSAgICAgICAgICAgIC8vIG1hcmdp
bi1sZWZ0ICsgYm9yZGVyLWxlZnQtd2lkdGggKyBwYWRkaW5nLWxlZnQgKyB3aWR0aCArIHBhZGRp
bmctcmlnaHQgKyBib3JkZXItcmlnaHQtd2lkdGggKyBtYXJnaW4tcmlnaHQgPSB3aWR0aCBvZiBj
b250YWluaW5nIGJsb2NrCi0gICAgICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0g
Y29udGFpbmluZ0Jsb2NrR2VvbWV0cnkuY29udGVudEJveFdpZHRoKCk7Ci0gICAgICAgICAgICBB
U1NFUlQoYm94R2VvbWV0cnkuaG9yaXpvbnRhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKSArIGJv
eEdlb21ldHJ5LmNvbnRlbnRCb3hXaWR0aCgpID09IGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLSAg
ICAgICAgfQotCi0gICAgICAgIC8vIDEwLjYuNCBBYnNvbHV0ZWx5IHBvc2l0aW9uZWQsIG5vbi1y
ZXBsYWNlZCBlbGVtZW50cwotICAgICAgICBpZiAobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRp
b25lZCgpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKSB7Ci0gICAgICAgICAgICAvLyB0
b3AgKyBtYXJnaW4tdG9wICsgYm9yZGVyLXRvcC13aWR0aCArIHBhZGRpbmctdG9wICsgaGVpZ2h0
ICsgcGFkZGluZy1ib3R0b20gKyBib3JkZXItYm90dG9tLXdpZHRoICsgbWFyZ2luLWJvdHRvbSAr
IGJvdHRvbSA9IGhlaWdodCBvZiBjb250YWluaW5nIGJsb2NrCi0gICAgICAgICAgICBhdXRvIGNv
bnRhaW5pbmdCbG9ja0hlaWdodCA9IGNvbnRhaW5pbmdCbG9ja0dlb21ldHJ5LmNvbnRlbnRCb3hI
ZWlnaHQoKTsKLSAgICAgICAgICAgIEFTU0VSVChCb3hHZW9tZXRyeTo6Ym9yZGVyQm94VG9wKGJv
eEdlb21ldHJ5KSArIGJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpICsgYm94R2VvbWV0cnkuYm9y
ZGVyVG9wKCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKSArIGJveEdlb21l
dHJ5LmNvbnRlbnRCb3hIZWlnaHQoKQotICAgICAgICAgICAgICAgICsgYm94R2VvbWV0cnkucGFk
ZGluZ0JvdHRvbSgpLnZhbHVlT3IoMCkgKyBib3hHZW9tZXRyeS5ib3JkZXJCb3R0b20oKSArIGJv
eEdlb21ldHJ5Lm1hcmdpbkFmdGVyKCkgPT0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KTsKLSAgICAg
ICAgfQotICAgIH0KLX0KLSNlbmRpZgotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5
b3V0L0Zvcm1hdHRpbmdDb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcx
MTAyNTU4OGVjNGEwM2Q5ZTM1YTBhYzkzMGE3NzZjNjIzZjg0NDQuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1h
dHRpbmdDb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoKLSAqIENv
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
Ci0KLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRVbml0
LmgiCi0jaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+
Ci0jaW5jbHVkZSA8d3RmL1dlYWtQdHIuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1jbGFz
cyBMYXlvdXRTaXplOwotc3RydWN0IExlbmd0aDsKLQotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNs
YXNzIEJveEdlb21ldHJ5OwotY2xhc3MgUmVwbGFjZWRCb3g7Ci1zdHJ1Y3QgQ29tcHV0ZWRIb3Jp
em9udGFsTWFyZ2luOwotc3RydWN0IENvbXB1dGVkVmVydGljYWxNYXJnaW47Ci1jbGFzcyBDb250
YWluZXJCb3g7Ci1zdHJ1Y3QgQ29udGVudEhlaWdodEFuZE1hcmdpbjsKLXN0cnVjdCBDb250ZW50
V2lkdGhBbmRNYXJnaW47Ci1zdHJ1Y3QgRWRnZXM7Ci1jbGFzcyBGb3JtYXR0aW5nU3RhdGU7Ci1z
dHJ1Y3QgSG9yaXpvbnRhbEdlb21ldHJ5OwotY2xhc3MgSW52YWxpZGF0aW9uU3RhdGU7Ci1jbGFz
cyBMYXlvdXRTdGF0ZTsKLXN0cnVjdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlczsKLXN0cnVj
dCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXM7Ci1zdHJ1Y3QgVmVydGljYWxHZW9tZXRyeTsKLQot
Y2xhc3MgRm9ybWF0dGluZ0NvbnRleHQgewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoRm9y
bWF0dGluZ0NvbnRleHQpOwotcHVibGljOgotICAgIEZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENv
bnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBGb3JtYXR0aW5nU3RhdGUmKTsKLSAg
ICB2aXJ0dWFsIH5Gb3JtYXR0aW5nQ29udGV4dCgpOwotCi0gICAgc3RydWN0IENvbnN0cmFpbnRz
Rm9ySW5GbG93Q29udGVudCB7Ci0gICAgICAgIEhvcml6b250YWxDb25zdHJhaW50cyBob3Jpem9u
dGFsOwotICAgICAgICBWZXJ0aWNhbENvbnN0cmFpbnRzIHZlcnRpY2FsOwotICAgIH07Ci0gICAg
dmlydHVhbCB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25z
dCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSA9IDA7Ci0KLSAgICBzdHJ1Y3QgQ29uc3Ry
YWludHNGb3JPdXRPZkZsb3dDb250ZW50IHsKLSAgICAgICAgSG9yaXpvbnRhbENvbnN0cmFpbnRz
IGhvcml6b250YWw7Ci0gICAgICAgIFZlcnRpY2FsQ29uc3RyYWludHMgdmVydGljYWw7Ci0gICAg
ICAgIC8vIEJvcmRlcnMgYW5kIHBhZGRpbmcgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIGNvbnRh
aW5pbmcgYmxvY2sncyBjb250ZW50IGJveCBhcyBpZiB0aGUgYm94IHdhcyBhbiBpbi1mbG93IGJv
eC4KLSAgICAgICAgTGF5b3V0VW5pdCBib3JkZXJBbmRQYWRkaW5nQ29uc3RyYWludHM7Ci0gICAg
fTsKLSAgICB2b2lkIGxheW91dE91dE9mRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBj
b25zdCBDb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQmKTsKLQotICAgIHN0cnVjdCBJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzIHsKLSAgICAgICAgdm9pZCBleHBhbmQoTGF5b3V0VW5pdCBo
b3Jpem9udGFsVmFsdWUpOwotICAgICAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzJiBvcGVy
YXRvcis9KGNvbnN0IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmKTsKLSAgICAgICAgSW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyYgb3BlcmF0b3IrPShMYXlvdXRVbml0KTsKLSAgICAgICAgSW50
cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3BlcmF0b3ItPShjb25zdCBJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzJik7Ci0gICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIG9wZXJhdG9y
LT0oTGF5b3V0VW5pdCk7Ci0KLSAgICAgICAgTGF5b3V0VW5pdCBtaW5pbXVtOwotICAgICAgICBM
YXlvdXRVbml0IG1heGltdW07Ci0gICAgfTsKLSAgICB2aXJ0dWFsIEludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgPSAwOwotICAgIHZp
cnR1YWwgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0ID0gMDsKLQotICAgIGJv
b2wgaXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFi
bGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpOyB9Ci0gICAgYm9vbCBpc0lubGluZUZvcm1h
dHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFibGlzaGVzSW5saW5lRm9y
bWF0dGluZ0NvbnRleHQoKTsgfQotICAgIGJvb2wgaXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkg
Y29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFibGlzaGVzVGFibGVGb3JtYXR0aW5nQ29udGV4dCgp
OyB9Ci0gICAgYm9vbCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSBjb25z
dCB7IHJldHVybiBpc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSAmJiByb290KCkuaXNUYWJsZVdy
YXBwZXJCb3goKTsgfQotICAgIGJvb2wgaXNGbGV4Rm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7
IHJldHVybiByb290KCkuZXN0YWJsaXNoZXNGbGV4Rm9ybWF0dGluZ0NvbnRleHQoKTsgfQotCi0g
ICAgZW51bSBjbGFzcyBFc2NhcGVSZWFzb24gewotICAgICAgICBUYWJsZVF1aXJrTmVlZHNHZW9t
ZXRyeUZyb21Fc3RhYmxpc2hlZEZvcm1hdHRpbmdDb250ZXh0LAotICAgICAgICBPdXRPZkZsb3dC
b3hOZWVkc0luRmxvd0dlb21ldHJ5LAotICAgICAgICBGbG9hdEJveElzQWx3YXlzUmVsYXRpdmVU
b0Zsb2F0U3RhdGVSb290LAotICAgICAgICBGaW5kRml4ZWRIZWlnaHRBbmNlc3RvclF1aXJrLAot
ICAgICAgICBEb2N1bWVudEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaywKLSAgICAgICAgQm9k
eVN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaywKLSAgICAgICAgVGFibGVOZWVkc0FjY2Vzc1RvVGFi
bGVXcmFwcGVyCi0gICAgfTsKLSAgICBjb25zdCBCb3hHZW9tZXRyeSYgZ2VvbWV0cnlGb3JCb3go
Y29uc3QgQm94JiwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiA9IFdURjo6bnVsbG9wdCkgY29uc3Q7
Ci0gICAgY29uc3QgQ29udGFpbmVyQm94JiByb290KCkgY29uc3QgeyByZXR1cm4gKm1fcm9vdDsg
fQotCi0gICAgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoK
LSAgICB1c2luZyBMYXlvdXRRdWV1ZSA9IFZlY3Rvcjxjb25zdCBCb3gqPjsKLQotICAgIGNvbnN0
IEZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9mb3Jt
YXR0aW5nU3RhdGU7IH0KLSAgICBGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsg
cmV0dXJuIG1fZm9ybWF0dGluZ1N0YXRlOyB9Ci0KLSAgICB2b2lkIGNvbXB1dGVCb3JkZXJBbmRQ
YWRkaW5nKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOwotCi0jaWZu
ZGVmIE5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZUdlb21ldHJ5Q29uc3RyYWludHNB
ZnRlckxheW91dCgpIGNvbnN0OwotI2VuZGlmCi0KLSAgICAvLyBUaGlzIGNsYXNzIGltcGxlbWVu
dHMgZ2VuZXJpYyBwb3NpdGlvbmluZyBhbmQgc2l6aW5nLgotICAgIGNsYXNzIEdlb21ldHJ5IHsK
LSAgICBwdWJsaWM6Ci0gICAgICAgIFZlcnRpY2FsR2VvbWV0cnkgb3V0T2ZGbG93VmVydGljYWxH
ZW9tZXRyeShjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBW
ZXJ0aWNhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29u
c3Q7Ci0gICAgICAgIEhvcml6b250YWxHZW9tZXRyeSBvdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0
cnkoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgVmVydGlj
YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0KLSAg
ICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBmbG9hdGluZ0NvbnRlbnRIZWlnaHRBbmRNYXJn
aW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJp
ZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7Ci0gICAgICAgIENvbnRlbnRXaWR0aEFuZE1hcmdp
biBmbG9hdGluZ0NvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYpOwotCi0g
ICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5saW5lUmVwbGFjZWRDb250ZW50SGVpZ2h0
QW5kTWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiwgT3B0aW9uYWw8VmVydGljYWxDb25zdHJhaW50cz4sIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNh
bFZhbHVlcyYpIGNvbnN0OwotICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gaW5saW5lUmVw
bGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmLCBjb25zdCBIb3Jp
em9udGFsQ29uc3RyYWludHMmLCBPcHRpb25hbDxWZXJ0aWNhbENvbnN0cmFpbnRzPiwgY29uc3Qg
T3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKLQotICAgICAgICBMYXlvdXRTaXplIGluRmxv
d1Bvc2l0aW9uZWRQb3NpdGlvbk9mZnNldChjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29u
c3RyYWludHMmKSBjb25zdDsKLQotICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGNvbXBs
aWNhdGVkQ2FzZXMoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29u
c3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7Ci0gICAgICAgIExheW91dFVuaXQg
c2hyaW5rVG9GaXRXaWR0aChjb25zdCBCb3gmLCBMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKTsK
LQotICAgICAgICBFZGdlcyBjb21wdXRlZEJvcmRlcihjb25zdCBCb3gmKSBjb25zdDsKLSAgICAg
ICAgT3B0aW9uYWw8RWRnZXM+IGNvbXB1dGVkUGFkZGluZyhjb25zdCBCb3gmLCBMYXlvdXRVbml0
IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSBjb25zdDsKLQotICAgICAgICBDb21wdXRlZEhvcml6b250
YWxNYXJnaW4gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYpIGNvbnN0OwotICAgICAgICBDb21wdXRlZFZlcnRpY2FsTWFyZ2lu
IGNvbXB1dGVkVmVydGljYWxNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0
cmFpbnRzJikgY29uc3Q7Ci0KLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRW
YWx1ZShjb25zdCBMZW5ndGgmIGdlb21ldHJ5UHJvcGVydHksIExheW91dFVuaXQgY29udGFpbmlu
Z0Jsb2NrV2lkdGgpIGNvbnN0OwotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBmaXhlZFZh
bHVlKGNvbnN0IExlbmd0aCYgZ2VvbWV0cnlQcm9wZXJ0eSkgY29uc3Q7Ci0KLSAgICAgICAgT3B0
aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRNaW5IZWlnaHQoY29uc3QgQm94JiwgT3B0aW9uYWw8
TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RGOjpudWxsb3B0KSBjb25zdDsK
LSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRNYXhIZWlnaHQoY29uc3QgQm94
JiwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RGOjpudWxs
b3B0KSBjb25zdDsKLQotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZE1pbldp
ZHRoKGNvbnN0IEJveCYsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgICAg
ICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZE1heFdpZHRoKGNvbnN0IEJveCYsIExheW91
dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotCi0gICAgICAgIEZvcm1hdHRpbmdDb250ZXh0
OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbnN0cmFpbkJ5TWluTWF4V2lkdGgoY29uc3Qg
Qm94JiwgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cykgY29uc3Q7Ci0KLSAgICAgICAgTGF5b3V0
VW5pdCBjb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KGNvbnN0IENvbnRhaW5l
ckJveCYpIGNvbnN0OwotCi0gICAgICAgIENvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCBj
b25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29uc3QgQ29udGFpbmVyQm94Jik7Ci0gICAg
ICAgIENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBjb25zdHJhaW50c0ZvckluRmxvd0NvbnRl
bnQoY29uc3QgQ29udGFpbmVyQm94JiwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiA9IFdURjo6bnVs
bG9wdCk7Ci0KLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRIZWlnaHQoY29u
c3QgQm94JiwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RG
OjpudWxsb3B0KSBjb25zdDsKLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRX
aWR0aChjb25zdCBCb3gmLCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLQotICAg
IHByb3RlY3RlZDoKLSAgICAgICAgZnJpZW5kIGNsYXNzIEZvcm1hdHRpbmdDb250ZXh0OwotICAg
ICAgICBHZW9tZXRyeShjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0gICAgICAgIGNvbnN0
IExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0dGluZ0Nv
bnRleHQubGF5b3V0U3RhdGUoKTsgfQotICAgICAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUo
KSB7IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0LmxheW91dFN0YXRlKCk7IH0KLSAgICAgICAg
Y29uc3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1
cm4gbV9mb3JtYXR0aW5nQ29udGV4dDsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgVmVydGlj
YWxHZW9tZXRyeSBvdXRPZkZsb3dSZXBsYWNlZFZlcnRpY2FsR2VvbWV0cnkoY29uc3QgUmVwbGFj
ZWRCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBWZXJ0aWNhbENvbnN0
cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7Ci0gICAgICAg
IEhvcml6b250YWxHZW9tZXRyeSBvdXRPZkZsb3dSZXBsYWNlZEhvcml6b250YWxHZW9tZXRyeShj
b25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IFZl
cnRpY2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYpOwot
Ci0gICAgICAgIFZlcnRpY2FsR2VvbWV0cnkgb3V0T2ZGbG93Tm9uUmVwbGFjZWRWZXJ0aWNhbEdl
b21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYs
IGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1
ZXMmKSBjb25zdDsKLSAgICAgICAgSG9yaXpvbnRhbEdlb21ldHJ5IG91dE9mRmxvd05vblJlcGxh
Y2VkSG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0KLSAg
ICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBmbG9hdGluZ1JlcGxhY2VkQ29udGVudEhlaWdo
dEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpIGNvbnN0OwotICAgICAgICBDb250
ZW50V2lkdGhBbmRNYXJnaW4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihj
b25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92
ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0KLSAgICAgICAgQ29udGVudFdpZHRoQW5kTWFy
Z2luIGZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94Jiwg
Y29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxW
YWx1ZXMmKTsKLQotICAgICAgICBMYXlvdXRVbml0IHN0YXRpY1ZlcnRpY2FsUG9zaXRpb25Gb3JP
dXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMm
KSBjb25zdDsKLSAgICAgICAgTGF5b3V0VW5pdCBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb25Gb3JP
dXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYpIGNvbnN0OwotCi0gICAgICAgIGVudW0gY2xhc3MgSGVpZ2h0VHlwZSB7IE1pbiwgTWF4LCBO
b3JtYWwgfTsKLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRIZWlnaHRWYWx1
ZShjb25zdCBCb3gmLCBIZWlnaHRUeXBlLCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5n
QmxvY2tIZWlnaHQpIGNvbnN0OwotCi0gICAgICAgIGVudW0gY2xhc3MgV2lkdGhUeXBlIHsgTWlu
LCBNYXgsIE5vcm1hbCB9OwotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZFdp
ZHRoVmFsdWUoY29uc3QgQm94JiwgV2lkdGhUeXBlLCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9j
a1dpZHRoKTsKLQotICAgICAgICBjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgbV9mb3JtYXR0aW5n
Q29udGV4dDsKLSAgICB9OwotICAgIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSBnZW9tZXRy
eSgpIGNvbnN0IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlzKTsgfQotCi0gICAgY2xhc3MgUXVpcmtz
IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFF1aXJrcyhjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYp
OwotCi0gICAgICAgIExheW91dFVuaXQgaGVpZ2h0VmFsdWVPZk5lYXJlc3RDb250YWluaW5nQmxv
Y2tXaXRoRml4ZWRIZWlnaHQoY29uc3QgQm94Jik7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAg
IGNvbnN0IExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0
dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQotICAgICAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0
U3RhdGUoKSB7IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0LmxheW91dFN0YXRlKCk7IH0KLSAg
ICAgICAgY29uc3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3Qg
eyByZXR1cm4gbV9mb3JtYXR0aW5nQ29udGV4dDsgfQotCi0gICAgICAgIGNvbnN0IEZvcm1hdHRp
bmdDb250ZXh0JiBtX2Zvcm1hdHRpbmdDb250ZXh0OwotICAgIH07Ci0gICAgRm9ybWF0dGluZ0Nv
bnRleHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9Ci0K
LXByaXZhdGU6Ci0gICAgdm9pZCBjb2xsZWN0T3V0T2ZGbG93RGVzY2VuZGFudHNJZk5lZWRlZCgp
OwotICAgIHZvaWQgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoY29uc3QgQm94Jiwg
Y29uc3QgQ29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50Jik7Ci0gICAgdm9pZCBjb21wdXRl
T3V0T2ZGbG93SG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0IEJveCYsIGNvbnN0IENvbnN0cmFpbnRz
Rm9yT3V0T2ZGbG93Q29udGVudCYpOwotCi0gICAgV2Vha1B0cjxjb25zdCBDb250YWluZXJCb3g+
IG1fcm9vdDsKLSAgICBGb3JtYXR0aW5nU3RhdGUmIG1fZm9ybWF0dGluZ1N0YXRlOwotfTsKLQot
aW5saW5lIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6R2VvbWV0cnkoY29uc3QgRm9ybWF0
dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KQotICAgIDogbV9mb3JtYXR0aW5nQ29udGV4
dChmb3JtYXR0aW5nQ29udGV4dCkKLXsKLX0KLQotaW5saW5lIEZvcm1hdHRpbmdDb250ZXh0OjpR
dWlya3M6OlF1aXJrcyhjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQp
Ci0gICAgOiBtX2Zvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0KQotewotfQotCi1p
bmxpbmUgdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50czo6
ZXhwYW5kKExheW91dFVuaXQgaG9yaXpvbnRhbFZhbHVlKQotewotICAgIG1pbmltdW0gKz0gaG9y
aXpvbnRhbFZhbHVlOwotICAgIG1heGltdW0gKz0gaG9yaXpvbnRhbFZhbHVlOwotfQotCi1pbmxp
bmUgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIEZvcm1hdHRp
bmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOjpvcGVyYXRvcis9KGNvbnN0IElu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIG90aGVyKQotewotICAgIG1pbmltdW0gKz0gb3RoZXIu
bWluaW11bTsKLSAgICBtYXhpbXVtICs9IG90aGVyLm1heGltdW07Ci0gICAgcmV0dXJuICp0aGlz
OwotfQotCi1pbmxpbmUgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMmIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOjpvcGVyYXRv
cis9KExheW91dFVuaXQgdmFsdWUpCi17Ci0gICAgZXhwYW5kKHZhbHVlKTsKLSAgICByZXR1cm4g
KnRoaXM7Ci19Ci0KLWlubGluZSBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25z
dHJhaW50cyYgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM6Om9w
ZXJhdG9yLT0oY29uc3QgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3RoZXIpCi17Ci0gICAg
bWluaW11bSAtPSBvdGhlci5taW5pbXVtOwotICAgIG1heGltdW0gLT0gb3RoZXIubWF4aW11bTsK
LSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLWlubGluZSBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyYgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29u
c3RyYWludHM6Om9wZXJhdG9yLT0oTGF5b3V0VW5pdCB2YWx1ZSkKLXsKLSAgICBleHBhbmQoLXZh
bHVlKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLX0KLX0KLQotI2RlZmluZSBTUEVDSUFMSVpF
X1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoVG9WYWx1ZVR5cGVOYW1lLCBw
cmVkaWNhdGUpIFwKLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfQkVHSU4oV2ViQ29yZTo6TGF5b3V0
OjpUb1ZhbHVlVHlwZU5hbWUpIFwKLSAgICBzdGF0aWMgYm9vbCBpc1R5cGUoY29uc3QgV2ViQ29y
ZTo6TGF5b3V0OjpGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQpIHsgcmV0dXJu
IGZvcm1hdHRpbmdDb250ZXh0LnByZWRpY2F0ZTsgfSBcCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRT
X0VORCgpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1h
dHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1hdHRp
bmdDb250ZXh0R2VvbWV0cnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWIx
OTY1N2I4YmU3MTk5YWEzZmZjMjA2ZjU3MjFhNzJjZDYyYzgxLi4wMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0
aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNjUgKzAsMCBAQAot
LyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29u
dGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNs
dWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkZsZXhGb3JtYXR0aW5nU3Rh
dGUuaCIKLSNpbmNsdWRlICJGbG9hdGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJGbG9hdGluZ1N0
YXRlLmgiCi0jaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5
b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIK
LSNpbmNsdWRlICJMYXlvdXRSZXBsYWNlZEJveC5oIgotI2luY2x1ZGUgIkxvZ2dpbmcuaCIKLSNp
bmNsdWRlICJUYWJsZUZvcm1hdHRpbmdTdGF0ZS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1u
YW1lc3BhY2UgTGF5b3V0IHsKLQotc3RhdGljIGlubGluZSBib29sIGlzSGVpZ2h0QXV0byhjb25z
dCBCb3gmIGxheW91dEJveCkKLXsKLSAgICAvLyAxMC41IENvbnRlbnQgaGVpZ2h0OiB0aGUgJ2hl
aWdodCcgcHJvcGVydHkKLSAgICAvLwotICAgIC8vIFRoZSBwZXJjZW50YWdlIGlzIGNhbGN1bGF0
ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBoZWlnaHQgb2YgdGhlIGdlbmVyYXRlZCBib3gncyBjb250
YWluaW5nIGJsb2NrLgotICAgIC8vIElmIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRhaW5pbmcgYmxv
Y2sgaXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5IChpLmUuLCBpdCBkZXBlbmRzIG9uIGNvbnRl
bnQgaGVpZ2h0KSwKLSAgICAvLyBhbmQgdGhpcyBlbGVtZW50IGlzIG5vdCBhYnNvbHV0ZWx5IHBv
c2l0aW9uZWQsIHRoZSB1c2VkIGhlaWdodCBpcyBjYWxjdWxhdGVkIGFzIGlmICdhdXRvJyB3YXMg
c3BlY2lmaWVkLgotCi0gICAgYXV0byBoZWlnaHQgPSBsYXlvdXRCb3guc3R5bGUoKS5sb2dpY2Fs
SGVpZ2h0KCk7Ci0gICAgaWYgKGhlaWdodC5pc0F1dG8oKSkKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0KLSAgICBpZiAoaGVpZ2h0LmlzUGVyY2VudCgpKSB7Ci0gICAgICAgIGlmIChsYXlvdXRCb3gu
aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICAgICAgcmV0dXJuICFsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkuc3R5bGUoKS5sb2dpY2Fs
SGVpZ2h0KCkuaXNGaXhlZCgpOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotT3B0
aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZEhl
aWdodFZhbHVlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBIZWlnaHRUeXBlIGhlaWdodFR5cGUsIE9w
dGlvbmFsPExheW91dFVuaXQ+IGNvbnRhaW5pbmdCbG9ja0hlaWdodCkgY29uc3QKLXsKLSAgICBh
dXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIGF1dG8gaGVpZ2h0ID0gaGVpZ2h0
VHlwZSA9PSBIZWlnaHRUeXBlOjpOb3JtYWwgPyBzdHlsZS5sb2dpY2FsSGVpZ2h0KCkgOiBoZWln
aHRUeXBlID09IEhlaWdodFR5cGU6Ok1pbiA/IHN0eWxlLmxvZ2ljYWxNaW5IZWlnaHQoKSA6IHN0
eWxlLmxvZ2ljYWxNYXhIZWlnaHQoKTsKLSAgICBpZiAoaGVpZ2h0LmlzVW5kZWZpbmVkKCkgfHwg
aGVpZ2h0LmlzQXV0bygpIHx8IGhlaWdodC5pc01heENvbnRlbnQoKSB8fCBoZWlnaHQuaXNNaW5D
b250ZW50KCkgfHwgaGVpZ2h0LmlzRml0Q29udGVudCgpKQotICAgICAgICByZXR1cm4geyB9Owot
Ci0gICAgaWYgKGhlaWdodC5pc0ZpeGVkKCkpCi0gICAgICAgIHJldHVybiBMYXlvdXRVbml0IHsg
aGVpZ2h0LnZhbHVlKCkgfTsKLQotICAgIGlmICghY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSB7Ci0g
ICAgICAgIGlmIChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpKQotICAgICAgICAgICAgY29u
dGFpbmluZ0Jsb2NrSGVpZ2h0ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5oZWlnaHRW
YWx1ZU9mTmVhcmVzdENvbnRhaW5pbmdCbG9ja1dpdGhGaXhlZEhlaWdodChsYXlvdXRCb3gpOwot
ICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGF1dG8gbm9uQW5vbnltb3VzQ29udGFpbmluZ0Js
b2NrTG9naWNhbEhlaWdodCA9IFsmXSB7Ci0gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgYmxv
Y2sgbGV2ZWwgYm94IGlzIGEgZGlyZWN0IGNoaWxkIG9mIGFuIGlubGluZSBsZXZlbCBib3ggKDxz
cGFuPjxkaXY+PC9kaXY+PC9zcGFuPikgYW5kIHdlIHdyYXAgaXQgaW50byBhIGNvbnRpbnVhdGlv
biwKLSAgICAgICAgICAgICAgICAvLyB0aGUgY29udGFpbmluZyBibG9jayAoYW5vbnltb3VzIHdy
YXBwZXIpIGlzIG5vdCB0aGUgYm94IHdlIG5lZWQgdG8gY2hlY2sgZm9yIGZpeGVkIGhlaWdodC4K
LSAgICAgICAgICAgICAgICBhdXRvJiBpbml0aWFsQ29udGFpbmluZ0Jsb2NrID0gbGF5b3V0Qm94
LmluaXRpYWxDb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8qIGNv
bnRhaW5pbmdCbG9jayA9ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7IGNvbnRhaW5pbmdC
bG9jayAhPSAmaW5pdGlhbENvbnRhaW5pbmdCbG9jazsgY29udGFpbmluZ0Jsb2NrID0gJmNvbnRh
aW5pbmdCbG9jay0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KGNvbnRhaW5pbmdCbG9jay0+aXNBbm9ueW1vdXMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrLT5z
dHlsZSgpLmxvZ2ljYWxIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgcmV0dXJuIGluaXRpYWxDb250YWluaW5nQmxvY2suc3R5bGUoKS5sb2dpY2FsSGVpZ2h0KCk7
Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gZml4
ZWRWYWx1ZShub25Bbm9ueW1vdXNDb250YWluaW5nQmxvY2tMb2dpY2FsSGVpZ2h0KCkpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFjb250YWluaW5nQmxvY2tIZWlnaHQpCi0gICAgICAg
IHJldHVybiB7IH07Ci0KLSAgICByZXR1cm4gdmFsdWVGb3JMZW5ndGgoaGVpZ2h0LCAqY29udGFp
bmluZ0Jsb2NrSGVpZ2h0KTsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZEhlaWdodChjb25zdCBCb3gmIGxheW91dEJveCwgT3B0
aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSBjb25zdAotewotICAgIGlm
IChhdXRvIGhlaWdodCA9IGNvbXB1dGVkSGVpZ2h0VmFsdWUobGF5b3V0Qm94LCBIZWlnaHRUeXBl
OjpOb3JtYWwsIGNvbnRhaW5pbmdCbG9ja0hlaWdodCkpIHsKLSAgICAgICAgaWYgKGxheW91dEJv
eC5zdHlsZSgpLmJveFNpemluZygpID09IEJveFNpemluZzo6Q29udGVudEJveCkKLSAgICAgICAg
ICAgIHJldHVybiBoZWlnaHQ7Ci0gICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGlu
Z0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwotICAgICAgICByZXR1cm4gKmhl
aWdodCAtIChib3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgYm94R2VvbWV0cnkudmVydGlj
YWxQYWRkaW5nKCkudmFsdWVPcigwKSk7Ci0gICAgfQotICAgIHJldHVybiB7IH07Ci19Ci0KLU9w
dGlvbmFsPExheW91dFVuaXQ+IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRX
aWR0aFZhbHVlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBXaWR0aFR5cGUgd2lkdGhUeXBlLCBMYXlv
dXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKQotewotICAgIC8vIEFwcGxpZXMgdG86IGFsbCBl
bGVtZW50cyBleGNlcHQgbm9uLXJlcGxhY2VkIGlubGluZXMgKG91dC1vZi1mbG93IGNoZWNrIGlz
IHJlcXVpcmVkIGZvciBwb3NpdGlvbmVkIDxicj4gYXMgZm9yIHNvbWUgcmVhc29uIHdlIGRvbid0
IGJsb2NraWZ5IHRoZW0pLgotICAgIEFTU0VSVCghbGF5b3V0Qm94LmlzSW5saW5lQm94KCkgfHwg
bGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKLQotICAgIGF1dG8gd2lkdGggPSBb
Jl0gewotICAgICAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgICAgICBz
d2l0Y2ggKHdpZHRoVHlwZSkgewotICAgICAgICBjYXNlIFdpZHRoVHlwZTo6Tm9ybWFsOgotICAg
ICAgICAgICAgcmV0dXJuIHN0eWxlLmxvZ2ljYWxXaWR0aCgpOwotICAgICAgICBjYXNlIFdpZHRo
VHlwZTo6TWluOgotICAgICAgICAgICAgcmV0dXJuIHN0eWxlLmxvZ2ljYWxNaW5XaWR0aCgpOwot
ICAgICAgICBjYXNlIFdpZHRoVHlwZTo6TWF4OgotICAgICAgICAgICAgcmV0dXJuIHN0eWxlLmxv
Z2ljYWxNYXhXaWR0aCgpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OwotICAgICAgICByZXR1cm4gc3R5bGUubG9naWNhbFdpZHRoKCk7Ci0gICAgfSgpOwotICAgIGlm
IChhdXRvIGNvbXB1dGVkVmFsdWUgPSB0aGlzLT5jb21wdXRlZFZhbHVlKHdpZHRoLCBjb250YWlu
aW5nQmxvY2tXaWR0aCkpCi0gICAgICAgIHJldHVybiBjb21wdXRlZFZhbHVlOwotCi0gICAgaWYg
KHdpZHRoLmlzTWluQ29udGVudCgpIHx8IHdpZHRoLmlzTWF4Q29udGVudCgpIHx8IHdpZHRoLmlz
Rml0Q29udGVudCgpKSB7Ci0gICAgICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gp
KQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgYXV0byYgY29udGFpbmVyQm94ID0g
ZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpOwotICAgICAgICAvLyBGSVhNRTogQ29u
c2lkZXIgc3BsaXR0aW5nIHVwIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBzbyB0
aGF0IHdlIGNvdWxkIGNvbXB1dGVkIHRoZSBtaW4gYW5kIG1heCB2YWx1ZXMgc2VwYXJhdGVseS4K
LSAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gWyZdIHsKLSAgICAgICAg
ICAgIGlmICghY29udGFpbmVyQm94Lmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQotICAgICAg
ICAgICAgICAgIHJldHVybiBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgMF9sdSwgY29udGFp
bmluZ0Jsb2NrV2lkdGggfTsKLSAgICAgICAgICAgIEFTU0VSVChjb250YWluZXJCb3guZXN0YWJs
aXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKLSAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdT
dGF0ZSA9IGxheW91dFN0YXRlKCkuZW5zdXJlRm9ybWF0dGluZ1N0YXRlKGNvbnRhaW5lckJveCk7
Ci0gICAgICAgICAgICBpZiAoYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gZm9ybWF0
dGluZ1N0YXRlLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gKmludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Ci0gICAgICAgICAgICByZXR1cm4gTGF5
b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmVyQm94LCBsYXlvdXRT
dGF0ZSgpKS0+Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIH0o
KTsKLSAgICAgICAgaWYgKHdpZHRoLmlzTWluQ29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJu
IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bTsKLSAgICAgICAgaWYgKHdpZHRoLmlz
TWF4Q29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMubWF4aW11bTsKLSAgICAgICAgQVNTRVJUKHdpZHRoLmlzRml0Q29udGVudCgpKTsKLSAgICAg
ICAgLy8gSWYgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiBhIGdpdmVuIGF4aXMgaXMgZGVmaW5pdGUs
IGVxdWFsIHRvIG1pbihtYXgtY29udGVudCBzaXplLAotICAgICAgICAvLyBtYXgobWluLWNvbnRl
bnQgc2l6ZSwgc3RyZXRjaC1maXQgc2l6ZSkpLiBPdGhlcndpc2UsIGVxdWFsIHRvIHRoZSBtYXgt
Y29udGVudCBzaXplIGluIHRoYXQgYXhpcy4KLSAgICAgICAgLy8gRklYTUU6IFdlIGRvbid0IHll
dCBoYXZlIGluZGVmaW5pdGUgYXZhaWxhYmxlIHNpemUuCi0gICAgICAgIHJldHVybiBzdGQ6Om1p
bihpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIHN0ZDo6bWF4KGludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMubWluaW11bSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpKTsKLSAgICB9Ci0g
ICAgcmV0dXJuIHsgfTsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5Ojpjb21wdXRlZFdpZHRoKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBMYXlvdXRV
bml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKQotewotICAgIGlmIChhdXRvIGNvbXB1dGVkV2lkdGgg
PSBjb21wdXRlZFdpZHRoVmFsdWUobGF5b3V0Qm94LCBXaWR0aFR5cGU6Ok5vcm1hbCwgY29udGFp
bmluZ0Jsb2NrV2lkdGgpKSB7Ci0gICAgICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxl
KCk7Ci0gICAgICAgIC8vIE5vbi1xdWFudGl0YXRpdmUgdmFsdWVzIHN1Y2ggYXMgYXV0byBhbmQg
bWluLWNvbnRlbnQgYXJlIG5vdCBpbmZsdWVuY2VkIGJ5IHRoZSBib3gtc2l6aW5nIHByb3BlcnR5
LgotICAgICAgICBpZiAoc3R5bGUuYm94U2l6aW5nKCkgPT0gQm94U2l6aW5nOjpDb250ZW50Qm94
IHx8IHN0eWxlLndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKLSAgICAgICAgICAgIHJldHVy
biBjb21wdXRlZFdpZHRoOwotICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdD
b250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKLSAgICAgICAgcmV0dXJuICpjb21w
dXRlZFdpZHRoIC0gKGJveEdlb21ldHJ5Lmhvcml6b250YWxCb3JkZXIoKSArIGJveEdlb21ldHJ5
Lmhvcml6b250YWxQYWRkaW5nKCkudmFsdWVPcigwKSk7Ci0gICAgfQotICAgIHJldHVybiB7IH07
Ci19Ci0KLUxheW91dFVuaXQgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb250ZW50SGVp
Z2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGlu
Z0NvbnRleHRSb290KSBjb25zdAotewotICAgIEFTU0VSVChmb3JtYXR0aW5nQ29udGV4dFJvb3Qu
ZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKLSAgICBBU1NFUlQoaXNIZWlnaHRBdXRv
KGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgfHwgZm9ybWF0dGluZ0NvbnRleHRSb290LmVzdGFibGlz
aGVzVGFibGVGb3JtYXR0aW5nQ29udGV4dCgpIHx8IGZvcm1hdHRpbmdDb250ZXh0Um9vdC5pc1Rh
YmxlQ2VsbCgpKTsKLSAgICBhdXRvIHVzZWRDb250ZW50SGVpZ2h0ID0gTGF5b3V0VW5pdCB7IH07
IAotICAgIGF1dG8gaGFzQ29udGVudCA9IGZvcm1hdHRpbmdDb250ZXh0Um9vdC5oYXNJbkZsb3dP
ckZsb2F0aW5nQ2hpbGQoKTsKLSAgICAvLyBUaGUgdXNlZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5t
ZW50IGJveCBpcyBkZXRlcm1pbmVkIGFzIGlmIHBlcmZvcm1pbmcgYSBub3JtYWwgbGF5b3V0IG9m
IHRoZSBib3gsIGV4Y2VwdCB0aGF0IGl0IGlzIHRyZWF0ZWQgYXMgaGF2aW5nIG5vIGNvbnRlbnQu
Ci0gICAgYXV0byBzaG91bGRJZ25vcmVDb250ZW50ID0gZm9ybWF0dGluZ0NvbnRleHRSb290Lmlz
U2l6ZUNvbnRhaW5tZW50Qm94KCk7Ci0gICAgaWYgKGhhc0NvbnRlbnQgJiYgIXNob3VsZElnbm9y
ZUNvbnRlbnQpCi0gICAgICAgIHVzZWRDb250ZW50SGVpZ2h0ID0gTGF5b3V0Q29udGV4dDo6Y3Jl
YXRlRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHRSb290LCBjb25zdF9jYXN0PExh
eW91dFN0YXRlJj4obGF5b3V0U3RhdGUoKSkpLT51c2VkQ29udGVudEhlaWdodCgpOwotICAgIHJl
dHVybiB1c2VkQ29udGVudEhlaWdodDsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0
dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZFZhbHVlKGNvbnN0IExlbmd0aCYgZ2VvbWV0
cnlQcm9wZXJ0eSwgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCkgY29uc3QKLXsKLSAg
ICAvLyAgSW4gZ2VuZXJhbCwgdGhlIGNvbXB1dGVkIHZhbHVlIHJlc29sdmVzIHRoZSBzcGVjaWZp
ZWQgdmFsdWUgYXMgZmFyIGFzIHBvc3NpYmxlIHdpdGhvdXQgbGF5aW5nIG91dCB0aGUgY29udGVu
dC4KLSAgICBpZiAoZ2VvbWV0cnlQcm9wZXJ0eS5pc0ZpeGVkKCkgfHwgZ2VvbWV0cnlQcm9wZXJ0
eS5pc1BlcmNlbnQoKSB8fCBnZW9tZXRyeVByb3BlcnR5LmlzQ2FsY3VsYXRlZCgpKQotICAgICAg
ICByZXR1cm4gdmFsdWVGb3JMZW5ndGgoZ2VvbWV0cnlQcm9wZXJ0eSwgY29udGFpbmluZ0Jsb2Nr
V2lkdGgpOwotICAgIHJldHVybiB7IH07Ci19Ci0KLU9wdGlvbmFsPExheW91dFVuaXQ+IEZvcm1h
dHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Zml4ZWRWYWx1ZShjb25zdCBMZW5ndGgmIGdlb21ldHJ5
UHJvcGVydHkpIGNvbnN0Ci17Ci0gICAgaWYgKCFnZW9tZXRyeVByb3BlcnR5LmlzRml4ZWQoKSkK
LSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICByZXR1cm4gTGF5b3V0VW5pdCB7IGdlb21ldHJ5UHJv
cGVydHkudmFsdWUoKSB9OwotfQotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjIvdmlz
dWRldC5odG1sI21pbi1tYXgtaGVpZ2h0cwotLy8gU3BlY2lmaWVzIGEgcGVyY2VudGFnZSBmb3Ig
ZGV0ZXJtaW5pbmcgdGhlIHVzZWQgdmFsdWUuIFRoZSBwZXJjZW50YWdlIGlzIGNhbGN1bGF0ZWQg
d2l0aCByZXNwZWN0IHRvIHRoZSBoZWlnaHQgb2YgdGhlIGdlbmVyYXRlZCBib3gncyBjb250YWlu
aW5nIGJsb2NrLgotLy8gSWYgdGhlIGhlaWdodCBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyBu
b3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHkgKGkuZS4sIGl0IGRlcGVuZHMgb24gY29udGVudCBoZWln
aHQpLCBhbmQgdGhpcyBlbGVtZW50IGlzIG5vdCBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQsCi0vLyB0
aGUgcGVyY2VudGFnZSB2YWx1ZSBpcyB0cmVhdGVkIGFzICcwJyAoZm9yICdtaW4taGVpZ2h0Jykg
b3IgJ25vbmUnIChmb3IgJ21heC1oZWlnaHQnKS4KLU9wdGlvbmFsPExheW91dFVuaXQ+IEZvcm1h
dHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRNYXhIZWlnaHQoY29uc3QgQm94JiBsYXlv
dXRCb3gsIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbnRhaW5pbmdCbG9ja0hlaWdodCkgY29uc3QK
LXsKLSAgICByZXR1cm4gY29tcHV0ZWRIZWlnaHRWYWx1ZShsYXlvdXRCb3gsIEhlaWdodFR5cGU6
Ok1heCwgY29udGFpbmluZ0Jsb2NrSGVpZ2h0KTsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4g
Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZE1pbkhlaWdodChjb25zdCBCb3gm
IGxheW91dEJveCwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSBj
b25zdAotewotICAgIHJldHVybiBjb21wdXRlZEhlaWdodFZhbHVlKGxheW91dEJveCwgSGVpZ2h0
VHlwZTo6TWluLCBjb250YWluaW5nQmxvY2tIZWlnaHQpOwotfQotCi1PcHRpb25hbDxMYXlvdXRV
bml0PiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkTWluV2lkdGgoY29uc3Qg
Qm94JiBsYXlvdXRCb3gsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpCi17Ci0gICAg
cmV0dXJuIGNvbXB1dGVkV2lkdGhWYWx1ZShsYXlvdXRCb3gsIFdpZHRoVHlwZTo6TWluLCBjb250
YWluaW5nQmxvY2tXaWR0aCk7Ci19Ci0KLU9wdGlvbmFsPExheW91dFVuaXQ+IEZvcm1hdHRpbmdD
b250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRNYXhXaWR0aChjb25zdCBCb3gmIGxheW91dEJveCwg
TGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCkKLXsKLSAgICByZXR1cm4gY29tcHV0ZWRX
aWR0aFZhbHVlKGxheW91dEJveCwgV2lkdGhUeXBlOjpNYXgsIGNvbnRhaW5pbmdCbG9ja1dpZHRo
KTsKLX0KLQotTGF5b3V0VW5pdCBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OnN0YXRpY1Zl
cnRpY2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzKSBjb25zdAot
ewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOwotCi0gICAg
Ly8gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIHNlY3Rpb24gYW5kIHRoZSBuZXh0LCB0aGUgdGVy
bSAic3RhdGljIHBvc2l0aW9uIiAob2YgYW4gZWxlbWVudCkgcmVmZXJzLCByb3VnaGx5LCB0byB0
aGUgcG9zaXRpb24gYW4gZWxlbWVudCB3b3VsZCBoYXZlCi0gICAgLy8gaGFkIGluIHRoZSBub3Jt
YWwgZmxvdy4gTW9yZSBwcmVjaXNlbHksIHRoZSBzdGF0aWMgcG9zaXRpb24gZm9yICd0b3AnIGlz
IHRoZSBkaXN0YW5jZSBmcm9tIHRoZSB0b3AgZWRnZSBvZiB0aGUgY29udGFpbmluZyBibG9jayB0
byB0aGUgdG9wIG1hcmdpbgotICAgIC8vIGVkZ2Ugb2YgYSBoeXBvdGhldGljYWwgYm94IHRoYXQg
d291bGQgaGF2ZSBiZWVuIHRoZSBmaXJzdCBib3ggb2YgdGhlIGVsZW1lbnQgaWYgaXRzIHNwZWNp
ZmllZCAncG9zaXRpb24nIHZhbHVlIGhhZCBiZWVuICdzdGF0aWMnIGFuZCBpdHMgc3BlY2lmaWVk
Ci0gICAgLy8gJ2Zsb2F0JyBoYWQgYmVlbiAnbm9uZScgYW5kIGl0cyBzcGVjaWZpZWQgJ2NsZWFy
JyBoYWQgYmVlbiAnbm9uZScuIChOb3RlIHRoYXQgZHVlIHRvIHRoZSBydWxlcyBpbiBzZWN0aW9u
IDkuNyB0aGlzIG1pZ2h0IHJlcXVpcmUgYWxzbyBhc3N1bWluZyBhIGRpZmZlcmVudAotICAgIC8v
IGNvbXB1dGVkIHZhbHVlIGZvciAnZGlzcGxheScuKSBUaGUgdmFsdWUgaXMgbmVnYXRpdmUgaWYg
dGhlIGh5cG90aGV0aWNhbCBib3ggaXMgYWJvdmUgdGhlIGNvbnRhaW5pbmcgYmxvY2suCi0KLSAg
ICAvLyBTdGFydCB3aXRoIHRoaXMgYm94J3MgYm9yZGVyIGJveCBvZmZzZXQgZnJvbSB0aGUgcGFy
ZW50J3MgYm9yZGVyIGJveC4KLSAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZv
cm1hdHRpbmdDb250ZXh0KCk7Ci0gICAgTGF5b3V0VW5pdCB0b3A7Ci0gICAgaWYgKGxheW91dEJv
eC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSAmJiBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJs
aW5nKCktPmlzQmxvY2tMZXZlbEJveCgpKSB7Ci0gICAgICAgIC8vIEFkZCBzaWJsaW5nIG9mZnNl
dAotICAgICAgICBhdXRvJiBwcmV2aW91c0luRmxvd1NpYmxpbmcgPSAqbGF5b3V0Qm94LnByZXZp
b3VzSW5GbG93U2libGluZygpOwotICAgICAgICBhdXRvJiBwcmV2aW91c0luRmxvd0JveEdlb21l
dHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gocHJldmlvdXNJbkZsb3dTaWJs
aW5nLCBFc2NhcGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0cnkpOwotICAg
ICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0
ZT4obGF5b3V0U3RhdGUoKS5mb3JtYXR0aW5nU3RhdGVGb3JCb3gocHJldmlvdXNJbkZsb3dTaWJs
aW5nKSk7Ci0gICAgICAgIGF1dG8gdXNlZFZlcnRpY2FsTWFyZ2luRm9yUHJldmlvdXNCb3ggPSBm
b3JtYXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKHByZXZpb3VzSW5GbG93U2libGluZyk7
Ci0KLSAgICAgICAgdG9wICs9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KHByZXZpb3VzSW5G
bG93Qm94R2VvbWV0cnkpLmJvdHRvbSgpICsgdXNlZFZlcnRpY2FsTWFyZ2luRm9yUHJldmlvdXNC
b3gubm9uQ29sbGFwc2VkVmFsdWVzLmFmdGVyOwotICAgIH0gZWxzZQotICAgICAgICB0b3AgPSBm
b3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gucGFyZW50KCksIEVzY2Fw
ZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRyeSkuY29udGVudEJveFRvcCgp
OwotCi0gICAgLy8gUmVzb2x2ZSB0b3AgYWxsIHRoZSB3YXkgdXAgdG8gdGhlIGNvbnRhaW5pbmcg
YmxvY2suCi0gICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdC
bG9jaygpOwotICAgIC8vIFN0YXJ0IHdpdGggdGhlIHBhcmVudCBzaW5jZSB3ZSBwcmV0ZW5kIHRo
YXQgdGhpcyBib3ggaXMgbm9ybWFsIGZsb3cuCi0gICAgZm9yIChhdXRvKiBhbmNlc3RvciA9ICZs
YXlvdXRCb3gucGFyZW50KCk7IGFuY2VzdG9yICE9ICZjb250YWluaW5nQmxvY2s7IGFuY2VzdG9y
ID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkgewotICAgICAgICBhdXRvJiBib3hHZW9t
ZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KCphbmNlc3RvciwgRXNjYXBl
UmVhc29uOjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5KTsKLSAgICAgICAgLy8gQm94
R2VvbWV0cnk6OnRvcCBpcyB0aGUgYm9yZGVyIGJveCB0b3AgcG9zaXRpb24gaW4gaXRzIGNvbnRh
aW5pbmcgYmxvY2sncyBjb29yZGluYXRlIHN5c3RlbS4KLSAgICAgICAgdG9wICs9IEJveEdlb21l
dHJ5Ojpib3JkZXJCb3hUb3AoYm94R2VvbWV0cnkpOwotICAgICAgICBBU1NFUlQoIWFuY2VzdG9y
LT5pc1Bvc2l0aW9uZWQoKSB8fCBsYXlvdXRCb3guaXNGaXhlZFBvc2l0aW9uZWQoKSk7Ci0gICAg
fQotICAgIC8vIE1vdmUgdGhlIHN0YXRpYyBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgcGFkZGlu
ZyBib3guIFRoaXMgaXMgdmVyeSBzcGVjaWZpYyB0byBhYm9sdXRlbHkgcG9zaXRpb25lZCBib3hl
cy4KLSAgICByZXR1cm4gdG9wIC0gdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2FsVG9wOwotfQot
Ci1MYXlvdXRVbml0IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6c3RhdGljSG9yaXpvbnRh
bFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChjb25zdCBCb3gmIGxheW91dEJveCwgY29u
c3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIGNvbnN0Ci17
Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7Ci0gICAgLy8g
U2VlIHN0YXRpY1ZlcnRpY2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkIGZvciB0aGUg
ZGVmaW5pdGlvbiBvZiB0aGUgc3RhdGljIHBvc2l0aW9uLgotCi0gICAgLy8gU3RhcnQgd2l0aCB0
aGlzIGJveCdzIGJvcmRlciBib3ggb2Zmc2V0IGZyb20gdGhlIHBhcmVudCdzIGJvcmRlciBib3gu
Ci0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgp
OwotICAgIGF1dG8gbGVmdCA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91
dEJveC5wYXJlbnQoKSwgRXNjYXBlUmVhc29uOjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21l
dHJ5KS5jb250ZW50Qm94TGVmdCgpOwotCi0gICAgLy8gUmVzb2x2ZSBsZWZ0IGFsbCB0aGUgd2F5
IHVwIHRvIHRoZSBjb250YWluaW5nIGJsb2NrLgotICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9
IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsKLSAgICAvLyBTdGFydCB3aXRoIHRoZSBwYXJl
bnQgc2luY2Ugd2UgcHJldGVuZCB0aGF0IHRoaXMgYm94IGlzIG5vcm1hbCBmbG93LgotICAgIGZv
ciAoYXV0byogYW5jZXN0b3IgPSAmbGF5b3V0Qm94LnBhcmVudCgpOyBhbmNlc3RvciAhPSAmY29u
dGFpbmluZ0Jsb2NrOyBhbmNlc3RvciA9ICZhbmNlc3Rvci0+Y29udGFpbmluZ0Jsb2NrKCkpIHsK
LSAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZv
ckJveCgqYW5jZXN0b3IsIEVzY2FwZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9t
ZXRyeSk7Ci0gICAgICAgIC8vIEJveEdlb21ldHJ5OjpsZWZ0IGlzIHRoZSBib3JkZXIgYm94IGxl
ZnQgcG9zaXRpb24gaW4gaXRzIGNvbnRhaW5pbmcgYmxvY2sncyBjb29yZGluYXRlIHN5c3RlbS4K
LSAgICAgICAgbGVmdCArPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94TGVmdChib3hHZW9tZXRyeSk7
Ci0gICAgICAgIEFTU0VSVCghYW5jZXN0b3ItPmlzUG9zaXRpb25lZCgpIHx8IGxheW91dEJveC5p
c0ZpeGVkUG9zaXRpb25lZCgpKTsKLSAgICB9Ci0gICAgLy8gTW92ZSB0aGUgc3RhdGljIHBvc2l0
aW9uIHJlbGF0aXZlIHRvIHRoZSBwYWRkaW5nIGJveC4gVGhpcyBpcyB2ZXJ5IHNwZWNpZmljIHRv
IGFib2x1dGVseSBwb3NpdGlvbmVkIGJveGVzLgotICAgIHJldHVybiBsZWZ0IC0gaG9yaXpvbnRh
bENvbnN0cmFpbnRzLmxvZ2ljYWxMZWZ0OwotfQotCi1MYXlvdXRVbml0IEZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeTo6c2hyaW5rVG9GaXRXaWR0aChjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250
ZXh0Um9vdCwgTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCkKLXsKLSAgICBMT0dfV0lUSF9TVFJF
QU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1dpZHRoXSAtPiBzaHJpbmsg
dG8gZml0IC0+IHVuc3VwcG9ydGVkIC0+IHdpZHRoKCIgPDwgTGF5b3V0VW5pdCB7IH0gPDwgInB4
KSBsYXlvdXRCb3g6ICIgPDwgJmZvcm1hdHRpbmdDb250ZXh0Um9vdCA8PCAiKSIpOwotICAgIEFT
U0VSVChmb3JtYXR0aW5nQ29udGV4dFJvb3QuZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgp
KTsKLQotICAgIC8vIENhbGN1bGF0aW9uIG9mIHRoZSBzaHJpbmstdG8tZml0IHdpZHRoIGlzIHNp
bWlsYXIgdG8gY2FsY3VsYXRpbmcgdGhlIHdpZHRoIG9mIGEgdGFibGUgY2VsbCB1c2luZyB0aGUg
YXV0b21hdGljIHRhYmxlIGxheW91dCBhbGdvcml0aG0uCi0gICAgLy8gUm91Z2hseTogY2FsY3Vs
YXRlIHRoZSBwcmVmZXJyZWQgd2lkdGggYnkgZm9ybWF0dGluZyB0aGUgY29udGVudCB3aXRob3V0
IGJyZWFraW5nIGxpbmVzIG90aGVyIHRoYW4gd2hlcmUgZXhwbGljaXQgbGluZSBicmVha3Mgb2Nj
dXIsCi0gICAgLy8gYW5kIGFsc28gY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgbWluaW11bSB3aWR0
aCwgZS5nLiwgYnkgdHJ5aW5nIGFsbCBwb3NzaWJsZSBsaW5lIGJyZWFrcy4gQ1NTIDIuMiBkb2Vz
IG5vdCBkZWZpbmUgdGhlIGV4YWN0IGFsZ29yaXRobS4KLSAgICAvLyBUaGlyZGx5LCBmaW5kIHRo
ZSBhdmFpbGFibGUgd2lkdGg6IGluIHRoaXMgY2FzZSwgdGhpcyBpcyB0aGUgd2lkdGggb2YgdGhl
IGNvbnRhaW5pbmcgYmxvY2sgbWludXMgdGhlIHVzZWQgdmFsdWVzIG9mICdtYXJnaW4tbGVmdCcs
ICdib3JkZXItbGVmdC13aWR0aCcsCi0gICAgLy8gJ3BhZGRpbmctbGVmdCcsICdwYWRkaW5nLXJp
Z2h0JywgJ2JvcmRlci1yaWdodC13aWR0aCcsICdtYXJnaW4tcmlnaHQnLCBhbmQgdGhlIHdpZHRo
cyBvZiBhbnkgcmVsZXZhbnQgc2Nyb2xsIGJhcnMuCi0KLSAgICAvLyBUaGVuIHRoZSBzaHJpbmst
dG8tZml0IHdpZHRoIGlzOiBtaW4obWF4KHByZWZlcnJlZCBtaW5pbXVtIHdpZHRoLCBhdmFpbGFi
bGUgd2lkdGgpLCBwcmVmZXJyZWQgd2lkdGgpLgotICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25z
dHJhaW50cyA9IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9OwotICAgIGF1dG8gaGFzQ29u
dGVudCA9IGlzPENvbnRhaW5lckJveD4oZm9ybWF0dGluZ0NvbnRleHRSb290KSAmJiBkb3duY2Fz
dDxDb250YWluZXJCb3g+KGZvcm1hdHRpbmdDb250ZXh0Um9vdCkuaGFzSW5GbG93T3JGbG9hdGlu
Z0NoaWxkKCk7Ci0gICAgLy8gVGhlIHVzZWQgd2lkdGggb2YgdGhlIGNvbnRhaW5tZW50IGJveCBp
cyBkZXRlcm1pbmVkIGFzIGlmIHBlcmZvcm1pbmcgYSBub3JtYWwgbGF5b3V0IG9mIHRoZSBib3gs
IGV4Y2VwdCB0aGF0IGl0IGlzIHRyZWF0ZWQgYXMgaGF2aW5nIG5vIGNvbnRlbnQuCi0gICAgYXV0
byBzaG91bGRJZ25vcmVDb250ZW50ID0gZm9ybWF0dGluZ0NvbnRleHRSb290LmlzU2l6ZUNvbnRh
aW5tZW50Qm94KCk7ICAKLSAgICBpZiAoaGFzQ29udGVudCAmJiAhc2hvdWxkSWdub3JlQ29udGVu
dCkgewotICAgICAgICBhdXRvJiByb290ID0gZG93bmNhc3Q8Q29udGFpbmVyQm94Pihmb3JtYXR0
aW5nQ29udGV4dFJvb3QpOwotICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGVGb3JSb290ID0g
bGF5b3V0U3RhdGUoKS5lbnN1cmVGb3JtYXR0aW5nU3RhdGUocm9vdCk7Ci0gICAgICAgIGF1dG8g
cHJlY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gZm9ybWF0dGluZ1N0YXRlRm9y
Um9vdC5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGlmICghcHJlY29tcHV0
ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKQotICAgICAgICAgICAgaW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KHJvb3Qs
IGxheW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9ICpwcmVj
b21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Ci0gICAgfQotICAgIHJldHVybiBzdGQ6
Om1pbihzdGQ6Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0sIGF2YWlsYWJs
ZVdpZHRoKSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtKTsKLX0KLQotVmVydGlj
YWxHZW9tZXRyeSBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Om91dE9mRmxvd05vblJlcGxh
Y2VkVmVydGljYWxHZW9tZXRyeShjb25zdCBDb250YWluZXJCb3gmIGxheW91dEJveCwgY29uc3Qg
SG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRp
Y2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0
aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAgIEFTU0VS
VChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWxheW91dEJveC5pc1JlcGxh
Y2VkQm94KCkpOwotICAgIEFTU0VSVCh2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxIZWlnaHQp
OwotCi0gICAgLy8gMTAuNi40IEFic29sdXRlbHkgcG9zaXRpb25lZCwgbm9uLXJlcGxhY2VkIGVs
ZW1lbnRzCi0gICAgLy8KLSAgICAvLyBGb3IgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGVsZW1lbnRz
LCB0aGUgdXNlZCB2YWx1ZXMgb2YgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbnMgbXVzdCBzYXRpc2Z5
IHRoaXMgY29uc3RyYWludDoKLSAgICAvLyAndG9wJyArICdtYXJnaW4tdG9wJyArICdib3JkZXIt
dG9wLXdpZHRoJyArICdwYWRkaW5nLXRvcCcgKyAnaGVpZ2h0JyArICdwYWRkaW5nLWJvdHRvbScg
KyAnYm9yZGVyLWJvdHRvbS13aWR0aCcgKyAnbWFyZ2luLWJvdHRvbScgKyAnYm90dG9tJwotICAg
IC8vID0gaGVpZ2h0IG9mIGNvbnRhaW5pbmcgYmxvY2sKLQotICAgIC8vIElmIGFsbCB0aHJlZSBv
ZiAndG9wJywgJ2hlaWdodCcsIGFuZCAnYm90dG9tJyBhcmUgYXV0bywgc2V0ICd0b3AnIHRvIHRo
ZSBzdGF0aWMgcG9zaXRpb24gYW5kIGFwcGx5IHJ1bGUgbnVtYmVyIHRocmVlIGJlbG93LgotCi0g
ICAgLy8gSWYgbm9uZSBvZiB0aGUgdGhyZWUgYXJlICdhdXRvJzogSWYgYm90aCAnbWFyZ2luLXRv
cCcgYW5kICdtYXJnaW4tYm90dG9tJyBhcmUgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5k
ZXIgdGhlIGV4dHJhCi0gICAgLy8gY29uc3RyYWludCB0aGF0IHRoZSB0d28gbWFyZ2lucyBnZXQg
ZXF1YWwgdmFsdWVzLiBJZiBvbmUgb2YgJ21hcmdpbi10b3AnIG9yICdtYXJnaW4tYm90dG9tJyBp
cyAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiBmb3IgdGhhdCB2YWx1ZS4KLSAgICAvLyBJZiB0
aGUgdmFsdWVzIGFyZSBvdmVyLWNvbnN0cmFpbmVkLCBpZ25vcmUgdGhlIHZhbHVlIGZvciAnYm90
dG9tJyBhbmQgc29sdmUgZm9yIHRoYXQgdmFsdWUuCi0KLSAgICAvLyBPdGhlcndpc2UsIHBpY2sg
dGhlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHNpeCBydWxlcyB0aGF0IGFwcGxpZXMuCi0KLSAgICAv
LyAxLiAndG9wJyBhbmQgJ2hlaWdodCcgYXJlICdhdXRvJyBhbmQgJ2JvdHRvbScgaXMgbm90ICdh
dXRvJywgdGhlbiB0aGUgaGVpZ2h0IGlzIGJhc2VkIG9uIHRoZSBjb250ZW50IHBlciAxMC42Ljcs
Ci0gICAgLy8gICAgIHNldCAnYXV0bycgdmFsdWVzIGZvciAnbWFyZ2luLXRvcCcgYW5kICdtYXJn
aW4tYm90dG9tJyB0byAwLCBhbmQgc29sdmUgZm9yICd0b3AnCi0gICAgLy8gMi4gJ3RvcCcgYW5k
ICdib3R0b20nIGFyZSAnYXV0bycgYW5kICdoZWlnaHQnIGlzIG5vdCAnYXV0bycsIHRoZW4gc2V0
ICd0b3AnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb24sIHNldCAnYXV0bycgdmFsdWVzIGZvcgotICAg
IC8vICAgICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAsIGFuZCBzb2x2ZSBm
b3IgJ2JvdHRvbScKLSAgICAvLyAzLiAnaGVpZ2h0JyBhbmQgJ2JvdHRvbScgYXJlICdhdXRvJyBh
bmQgJ3RvcCcgaXMgbm90ICdhdXRvJywgdGhlbiB0aGUgaGVpZ2h0IGlzIGJhc2VkIG9uIHRoZSBj
b250ZW50IHBlciAxMC42LjcsIHNldCAnYXV0bycKLSAgICAvLyAgICAgdmFsdWVzIGZvciAnbWFy
Z2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyB0byAwLCBhbmQgc29sdmUgZm9yICdib3R0b20n
Ci0gICAgLy8gNC4gJ3RvcCcgaXMgJ2F1dG8nLCAnaGVpZ2h0JyBhbmQgJ2JvdHRvbScgYXJlIG5v
dCAnYXV0bycsIHRoZW4gc2V0ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tdG9wJyBhbmQgJ21h
cmdpbi1ib3R0b20nIHRvIDAsIGFuZCBzb2x2ZSBmb3IgJ3RvcCcKLSAgICAvLyA1LiAnaGVpZ2h0
JyBpcyAnYXV0bycsICd0b3AnIGFuZCAnYm90dG9tJyBhcmUgbm90ICdhdXRvJywgdGhlbiAnYXV0
bycgdmFsdWVzIGZvciAnbWFyZ2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyBhcmUgc2V0IHRv
IDAgYW5kIHNvbHZlIGZvciAnaGVpZ2h0JwotICAgIC8vIDYuICdib3R0b20nIGlzICdhdXRvJywg
J3RvcCcgYW5kICdoZWlnaHQnIGFyZSBub3QgJ2F1dG8nLCB0aGVuIHNldCAnYXV0bycgdmFsdWVz
IGZvciAnbWFyZ2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyB0byAwIGFuZCBzb2x2ZSBmb3Ig
J2JvdHRvbScKLQotICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9ybWF0dGlu
Z0NvbnRleHQoKTsKLSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIGF1
dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0
Qm94KTsKLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja0hlaWdodCA9ICp2ZXJ0aWNhbENvbnN0cmFp
bnRzLmxvZ2ljYWxIZWlnaHQ7Ci0gICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6
b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7Ci0KLSAgICBhdXRvIHRvcCA9IGNvbXB1dGVk
VmFsdWUoc3R5bGUubG9naWNhbFRvcCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0gICAgYXV0
byBib3R0b20gPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxCb3R0b20oKSwgY29udGFpbmlu
Z0Jsb2NrV2lkdGgpOwotICAgIGF1dG8gaGVpZ2h0ID0gb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVz
LmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQudmFsdWUoKSA6IGNvbXB1
dGVkSGVpZ2h0KGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrSGVpZ2h0KTsKLSAgICBhdXRvIGNv
bXB1dGVkVmVydGljYWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihs
YXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgVXNlZFZlcnRpY2FsTWFyZ2lu
OjpOb25Db2xsYXBzZWRWYWx1ZXMgdXNlZFZlcnRpY2FsTWFyZ2luOyAKLSAgICBhdXRvIHBhZGRp
bmdUb3AgPSBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKTsKLSAgICBhdXRvIHBh
ZGRpbmdCb3R0b20gPSBib3hHZW9tZXRyeS5wYWRkaW5nQm90dG9tKCkudmFsdWVPcigwKTsKLSAg
ICBhdXRvIGJvcmRlclRvcCA9IGJveEdlb21ldHJ5LmJvcmRlclRvcCgpOwotICAgIGF1dG8gYm9y
ZGVyQm90dG9tID0gYm94R2VvbWV0cnkuYm9yZGVyQm90dG9tKCk7Ci0KLSAgICBpZiAoIXRvcCAm
JiAhaGVpZ2h0ICYmICFib3R0b20pCi0gICAgICAgIHRvcCA9IHN0YXRpY1ZlcnRpY2FsUG9zaXRp
b25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGxheW91dEJveCwgdmVydGljYWxDb25zdHJhaW50cyk7
Ci0KLSAgICBpZiAodG9wICYmIGhlaWdodCAmJiBib3R0b20pIHsKLSAgICAgICAgaWYgKCFjb21w
dXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSAmJiAhY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRl
cikgewotICAgICAgICAgICAgYXV0byBtYXJnaW5CZWZvcmVBbmRBZnRlciA9IGNvbnRhaW5pbmdC
bG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWlnaHQgKyBw
YWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKmJvdHRvbSk7Ci0gICAgICAgICAgICB1c2Vk
VmVydGljYWxNYXJnaW4gPSB7IG1hcmdpbkJlZm9yZUFuZEFmdGVyIC8gMiwgbWFyZ2luQmVmb3Jl
QW5kQWZ0ZXIgLyAyIH07Ci0gICAgICAgIH0gZWxzZSBpZiAoIWNvbXB1dGVkVmVydGljYWxNYXJn
aW4uYmVmb3JlKSB7Ci0gICAgICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgPSAqY29t
cHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlcjsKLSAgICAgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdp
bi5iZWZvcmUgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIGJvcmRlclRvcCArIHBh
ZGRpbmdUb3AgKyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRW
ZXJ0aWNhbE1hcmdpbi5hZnRlciArICpib3R0b20pOwotICAgICAgICB9IGVsc2UgaWYgKCFjb21w
dXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyKSB7Ci0gICAgICAgICAgICB1c2VkVmVydGljYWxNYXJn
aW4uYmVmb3JlID0gKmNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlOwotICAgICAgICAgICAg
dXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3Ag
KyB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpo
ZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKmJvdHRvbSk7Ci0gICAgICAg
IH0gZWxzZQotICAgICAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luID0geyAqY29tcHV0ZWRWZXJ0
aWNhbE1hcmdpbi5iZWZvcmUsICpjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyIH07Ci0gICAg
ICAgIC8vIE92ZXItY29uc3RyYWluZWQ/Ci0gICAgICAgIGF1dG8gYm94SGVpZ2h0ID0gKnRvcCAr
IHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhl
aWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVydGljYWxNYXJnaW4u
YWZ0ZXIgKyAqYm90dG9tOwotICAgICAgICBpZiAoYm94SGVpZ2h0ICE9IGNvbnRhaW5pbmdCbG9j
a0hlaWdodCkKLSAgICAgICAgICAgIGJvdHRvbSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgq
dG9wICsgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3Ag
KyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0aWNhbE1h
cmdpbi5hZnRlcik7Ci0gICAgfQotCi0gICAgaWYgKCF0b3AgJiYgIWhlaWdodCAmJiBib3R0b20p
IHsKLSAgICAgICAgLy8gIzEKLSAgICAgICAgaGVpZ2h0ID0gY29udGVudEhlaWdodEZvckZvcm1h
dHRpbmdDb250ZXh0Um9vdChsYXlvdXRCb3gpOwotICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4g
PSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVy
dGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OwotICAgICAgICB0b3AgPSBjb250YWluaW5n
QmxvY2tIZWlnaHQgLSAodXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBh
ZGRpbmdUb3AgKyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRW
ZXJ0aWNhbE1hcmdpbi5hZnRlciArICpib3R0b20pOyAKLSAgICB9Ci0KLSAgICBpZiAoIXRvcCAm
JiAhYm90dG9tICYmIGhlaWdodCkgewotICAgICAgICAvLyAjMgotICAgICAgICB0b3AgPSBzdGF0
aWNWZXJ0aWNhbFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChsYXlvdXRCb3gsIHZlcnRp
Y2FsQ29uc3RyYWludHMpOwotICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7IGNvbXB1dGVk
VmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4u
YWZ0ZXIudmFsdWVPcigwKSB9OwotICAgICAgICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWln
aHQgLSAoKnRvcCArIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRk
aW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVy
dGljYWxNYXJnaW4uYWZ0ZXIpOwotICAgIH0KLQotICAgIGlmICghaGVpZ2h0ICYmICFib3R0b20g
JiYgdG9wKSB7Ci0gICAgICAgIC8vICMzCi0gICAgICAgIGhlaWdodCA9IGNvbnRlbnRIZWlnaHRG
b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QobGF5b3V0Qm94KTsKLSAgICAgICAgdXNlZFZlcnRpY2Fs
TWFyZ2luID0geyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21w
dXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKLSAgICAgICAgYm90dG9tID0g
Y29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3Jl
ICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9y
ZGVyQm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyKTsKLSAgICB9Ci0KLSAgICBpZiAo
IXRvcCAmJiBoZWlnaHQgJiYgYm90dG9tKSB7Ci0gICAgICAgIC8vICM0Ci0gICAgICAgIHVzZWRW
ZXJ0aWNhbE1hcmdpbiA9IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigw
KSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07Ci0gICAgICAgIHRv
cCA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICh1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsg
Ym9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVy
Qm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7Ci0gICAgfQotCi0g
ICAgaWYgKCFoZWlnaHQgJiYgdG9wICYmIGJvdHRvbSkgewotICAgICAgICAvLyAjNQotICAgICAg
ICB1c2VkVmVydGljYWxNYXJnaW4gPSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZh
bHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OwotICAg
ICAgICBoZWlnaHQgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIHVzZWRWZXJ0aWNh
bE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgcGFkZGluZ0JvdHRvbSAr
IGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciArICpib3R0b20pOwotICAg
IH0KLQotICAgIGlmICghYm90dG9tICYmIHRvcCAmJiBoZWlnaHQpIHsKLSAgICAgICAgLy8gIzYK
LSAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luID0geyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJl
Zm9yZS52YWx1ZU9yKDApLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkg
fTsKLSAgICAgICAgYm90dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyB1c2Vk
VmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWlnaHQg
KyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVy
KTsKLSAgICB9Ci0KLSAgICBBU1NFUlQodG9wKTsKLSAgICBBU1NFUlQoYm90dG9tKTsKLSAgICBB
U1NFUlQoaGVpZ2h0KTsKLQotICAgIC8vIEZvciBvdXQtb2YtZmxvdyBlbGVtZW50cyB0aGUgY29u
dGFpbmluZyBibG9jayBpcyBmb3JtZWQgYnkgdGhlIHBhZGRpbmcgZWRnZSBvZiB0aGUgYW5jZXN0
b3IuCi0gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcG9zaXRpb25lZCB2YWx1ZSBpcyBpbiB0aGUg
Y29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIHBhZGRpbmcgYm94LiBMZXQncyBjb252ZXJ0IGl0IHRv
IGJvcmRlciBib3ggY29vcmRpbmF0ZSBzeXN0ZW0uCi0gICAgYXV0byBjb250YWluaW5nQmxvY2tQ
YWRkaW5nVmVydGljYWxFZGdlID0gdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2FsVG9wOwotICAg
ICp0b3AgKz0gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZTsKLSAgICAqYm90dG9t
ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7Ci0KLSAgICBMT0dfV0lUSF9T
VFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1Bvc2l0aW9uXVtIZWln
aHRdW01hcmdpbl0gLT4gb3V0LW9mLWZsb3cgbm9uLXJlcGxhY2VkIC0+IHRvcCgiIDw8ICp0b3Ag
PDwgInB4KSBib3R0b20oIiAgPDwgKmJvdHRvbSA8PCAicHgpIGhlaWdodCgiIDw8ICpoZWlnaHQg
PDwgInB4KSBtYXJnaW4oIiA8PCB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlIDw8ICJweCwgIiAg
PDwgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyIDw8ICJweCkgbGF5b3V0Qm94KCIgPDwgJmxheW91
dEJveCA8PCAiKSIpOwotICAgIHJldHVybiB7ICp0b3AsICpib3R0b20sIHsgKmhlaWdodCwgdXNl
ZFZlcnRpY2FsTWFyZ2luIH0gfTsKLX0KLQotSG9yaXpvbnRhbEdlb21ldHJ5IEZvcm1hdHRpbmdD
b250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93Tm9uUmVwbGFjZWRIb3Jpem9udGFsR2VvbWV0cnko
Y29uc3QgQ29udGFpbmVyQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVl
cyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGxheW91dEJveC5p
c091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSk7Ci0g
ICAgCi0gICAgLy8gMTAuMy43IEFic29sdXRlbHkgcG9zaXRpb25lZCwgbm9uLXJlcGxhY2VkIGVs
ZW1lbnRzCi0gICAgLy8KLSAgICAvLyAnbGVmdCcgKyAnbWFyZ2luLWxlZnQnICsgJ2JvcmRlci1s
ZWZ0LXdpZHRoJyArICdwYWRkaW5nLWxlZnQnICsgJ3dpZHRoJyArICdwYWRkaW5nLXJpZ2h0JyAr
ICdib3JkZXItcmlnaHQtd2lkdGgnICsgJ21hcmdpbi1yaWdodCcgKyAncmlnaHQnCi0gICAgLy8g
PSB3aWR0aCBvZiBjb250YWluaW5nIGJsb2NrCi0KLSAgICAvLyBJZiBhbGwgdGhyZWUgb2YgJ2xl
ZnQnLCAnd2lkdGgnLCBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nOiBGaXJzdCBzZXQgYW55ICdhdXRv
JyB2YWx1ZXMgZm9yICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIHRvIDAuCi0gICAg
Ly8gVGhlbiwgaWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGVzdGFi
bGlzaGluZyB0aGUgc3RhdGljLXBvc2l0aW9uIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicgc2V0
ICdsZWZ0JyB0byB0aGUgc3RhdGljCi0gICAgLy8gcG9zaXRpb24gYW5kIGFwcGx5IHJ1bGUgbnVt
YmVyIHRocmVlIGJlbG93OyBvdGhlcndpc2UsIHNldCAncmlnaHQnIHRvIHRoZSBzdGF0aWMgcG9z
aXRpb24gYW5kIGFwcGx5IHJ1bGUgbnVtYmVyIG9uZSBiZWxvdy4KLSAgICAvLwotICAgIC8vIElm
IG5vbmUgb2YgdGhlIHRocmVlIGlzICdhdXRvJzogSWYgYm90aCAnbWFyZ2luLWxlZnQnIGFuZCAn
bWFyZ2luLXJpZ2h0JyBhcmUgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4
dHJhIGNvbnN0cmFpbnQgdGhhdCB0aGUgdHdvIG1hcmdpbnMgZ2V0IGVxdWFsIHZhbHVlcywKLSAg
ICAvLyB1bmxlc3MgdGhpcyB3b3VsZCBtYWtlIHRoZW0gbmVnYXRpdmUsIGluIHdoaWNoIGNhc2Ug
d2hlbiBkaXJlY3Rpb24gb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicgKCdydGwnKSwg
c2V0ICdtYXJnaW4tbGVmdCcgKCdtYXJnaW4tcmlnaHQnKSB0byB6ZXJvIGFuZAotICAgIC8vIHNv
bHZlIGZvciAnbWFyZ2luLXJpZ2h0JyAoJ21hcmdpbi1sZWZ0JykuIElmIG9uZSBvZiAnbWFyZ2lu
LWxlZnQnIG9yICdtYXJnaW4tcmlnaHQnIGlzICdhdXRvJywgc29sdmUgdGhlIGVxdWF0aW9uIGZv
ciB0aGF0IHZhbHVlLgotICAgIC8vIElmIHRoZSB2YWx1ZXMgYXJlIG92ZXItY29uc3RyYWluZWQs
IGlnbm9yZSB0aGUgdmFsdWUgZm9yICdsZWZ0JyAoaW4gY2FzZSB0aGUgJ2RpcmVjdGlvbicgcHJv
cGVydHkgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ3J0bCcpIG9yICdyaWdodCcKLSAgICAv
LyAoaW4gY2FzZSAnZGlyZWN0aW9uJyBpcyAnbHRyJykgYW5kIHNvbHZlIGZvciB0aGF0IHZhbHVl
LgotICAgIC8vCi0gICAgLy8gT3RoZXJ3aXNlLCBzZXQgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdp
bi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgdG8gMCwgYW5kIHBpY2sgdGhlIG9uZSBvZiB0aGUg
Zm9sbG93aW5nIHNpeCBydWxlcyB0aGF0IGFwcGxpZXMuCi0gICAgLy8KLSAgICAvLyAxLiAnbGVm
dCcgYW5kICd3aWR0aCcgYXJlICdhdXRvJyBhbmQgJ3JpZ2h0JyBpcyBub3QgJ2F1dG8nLCB0aGVu
IHRoZSB3aWR0aCBpcyBzaHJpbmstdG8tZml0LiBUaGVuIHNvbHZlIGZvciAnbGVmdCcKLSAgICAv
LyAyLiAnbGVmdCcgYW5kICdyaWdodCcgYXJlICdhdXRvJyBhbmQgJ3dpZHRoJyBpcyBub3QgJ2F1
dG8nLCB0aGVuIGlmIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgZWxlbWVudCBlc3Rh
Ymxpc2hpbmcgdGhlIHN0YXRpYy1wb3NpdGlvbiAKLSAgICAvLyAgICBjb250YWluaW5nIGJsb2Nr
IGlzICdsdHInIHNldCAnbGVmdCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbiwgb3RoZXJ3aXNlIHNl
dCAncmlnaHQnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb24uCi0gICAgLy8gICAgVGhlbiBzb2x2ZSBm
b3IgJ2xlZnQnIChpZiAnZGlyZWN0aW9uIGlzICdydGwnKSBvciAncmlnaHQnIChpZiAnZGlyZWN0
aW9uJyBpcyAnbHRyJykuCi0gICAgLy8gMy4gJ3dpZHRoJyBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8n
IGFuZCAnbGVmdCcgaXMgbm90ICdhdXRvJywgdGhlbiB0aGUgd2lkdGggaXMgc2hyaW5rLXRvLWZp
dCAuIFRoZW4gc29sdmUgZm9yICdyaWdodCcKLSAgICAvLyA0LiAnbGVmdCcgaXMgJ2F1dG8nLCAn
d2lkdGgnIGFuZCAncmlnaHQnIGFyZSBub3QgJ2F1dG8nLCB0aGVuIHNvbHZlIGZvciAnbGVmdCcK
LSAgICAvLyA1LiAnd2lkdGgnIGlzICdhdXRvJywgJ2xlZnQnIGFuZCAncmlnaHQnIGFyZSBub3Qg
J2F1dG8nLCB0aGVuIHNvbHZlIGZvciAnd2lkdGgnCi0gICAgLy8gNi4gJ3JpZ2h0JyBpcyAnYXV0
bycsICdsZWZ0JyBhbmQgJ3dpZHRoJyBhcmUgbm90ICdhdXRvJywgdGhlbiBzb2x2ZSBmb3IgJ3Jp
Z2h0JwotCi0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29u
dGV4dCgpOwotICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAgYXV0byYg
Ym94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gp
OwotICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMu
bG9naWNhbFdpZHRoOwotICAgIGF1dG8gaXNMZWZ0VG9SaWdodERpcmVjdGlvbiA9IGxheW91dEJv
eC5jb250YWluaW5nQmxvY2soKS5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKLSAg
ICAKLSAgICBhdXRvIGxlZnQgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxMZWZ0KCksIGNv
bnRhaW5pbmdCbG9ja1dpZHRoKTsKLSAgICBhdXRvIHJpZ2h0ID0gY29tcHV0ZWRWYWx1ZShzdHls
ZS5sb2dpY2FsUmlnaHQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgIGF1dG8gd2lkdGgg
PSBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0aCA/IG92ZXJyaWRkZW5Ib3Jpem9udGFs
VmFsdWVzLndpZHRoIDogY29tcHV0ZWRXaWR0aChsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja1dp
ZHRoKTsKLSAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21w
dXRlZEhvcml6b250YWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwot
ICAgIFVzZWRIb3Jpem9udGFsTWFyZ2luIHVzZWRIb3Jpem9udGFsTWFyZ2luOwotICAgIGF1dG8g
cGFkZGluZ0xlZnQgPSBib3hHZW9tZXRyeS5wYWRkaW5nTGVmdCgpLnZhbHVlT3IoMCk7Ci0gICAg
YXV0byBwYWRkaW5nUmlnaHQgPSBib3hHZW9tZXRyeS5wYWRkaW5nUmlnaHQoKS52YWx1ZU9yKDAp
OwotICAgIGF1dG8gYm9yZGVyTGVmdCA9IGJveEdlb21ldHJ5LmJvcmRlckxlZnQoKTsKLSAgICBh
dXRvIGJvcmRlclJpZ2h0ID0gYm94R2VvbWV0cnkuYm9yZGVyUmlnaHQoKTsKLSAgICBpZiAoIWxl
ZnQgJiYgIXdpZHRoICYmICFyaWdodCkgewotICAgICAgICAvLyBJZiBhbGwgdGhyZWUgb2YgJ2xl
ZnQnLCAnd2lkdGgnLCBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nOiBGaXJzdCBzZXQgYW55ICdhdXRv
JyB2YWx1ZXMgZm9yICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIHRvIDAuCi0gICAg
ICAgIC8vIFRoZW4sIGlmIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgZWxlbWVudCBl
c3RhYmxpc2hpbmcgdGhlIHN0YXRpYy1wb3NpdGlvbiBjb250YWluaW5nIGJsb2NrIGlzICdsdHIn
IHNldCAnbGVmdCcgdG8gdGhlIHN0YXRpYwotICAgICAgICAvLyBwb3NpdGlvbiBhbmQgYXBwbHkg
cnVsZSBudW1iZXIgdGhyZWUgYmVsb3c7IG90aGVyd2lzZSwgc2V0ICdyaWdodCcgdG8gdGhlIHN0
YXRpYyBwb3NpdGlvbiBhbmQgYXBwbHkgcnVsZSBudW1iZXIgb25lIGJlbG93LgotICAgICAgICB1
c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZh
bHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OwotCi0g
ICAgICAgIGF1dG8gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uID0gc3RhdGljSG9yaXpvbnRhbFBv
c2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJh
aW50cyk7Ci0gICAgICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKQotICAgICAgICAgICAg
bGVmdCA9IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbjsKLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgcmlnaHQgPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb247Ci0gICAgfSBlbHNlIGlmIChsZWZ0
ICYmIHdpZHRoICYmIHJpZ2h0KSB7Ci0gICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIHRocmVlIGlz
ICdhdXRvJzogSWYgYm90aCAnbWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyBhcmUgJ2F1
dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4dHJhIGNvbnN0cmFpbnQgdGhhdCB0
aGUgdHdvIG1hcmdpbnMgZ2V0IGVxdWFsIHZhbHVlcywKLSAgICAgICAgLy8gdW5sZXNzIHRoaXMg
d291bGQgbWFrZSB0aGVtIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIHdoZW4gZGlyZWN0aW9uIG9m
IHRoZSBjb250YWluaW5nIGJsb2NrIGlzICdsdHInICgncnRsJyksIHNldCAnbWFyZ2luLWxlZnQn
ICgnbWFyZ2luLXJpZ2h0JykgdG8gemVybyBhbmQKLSAgICAgICAgLy8gc29sdmUgZm9yICdtYXJn
aW4tcmlnaHQnICgnbWFyZ2luLWxlZnQnKS4gSWYgb25lIG9mICdtYXJnaW4tbGVmdCcgb3IgJ21h
cmdpbi1yaWdodCcgaXMgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gZm9yIHRoYXQgdmFsdWUu
Ci0gICAgICAgIC8vIElmIHRoZSB2YWx1ZXMgYXJlIG92ZXItY29uc3RyYWluZWQsIGlnbm9yZSB0
aGUgdmFsdWUgZm9yICdsZWZ0JyAoaW4gY2FzZSB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2Yg
dGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ3J0bCcpIG9yICdyaWdodCcKLSAgICAgICAgLy8gKGlu
IGNhc2UgJ2RpcmVjdGlvbicgaXMgJ2x0cicpIGFuZCBzb2x2ZSBmb3IgdGhhdCB2YWx1ZS4KLSAg
ICAgICAgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgJiYgIWNvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbi5lbmQpIHsKLSAgICAgICAgICAgIGF1dG8gbWFyZ2luU3RhcnRBbmRFbmQg
PSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVm
dCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnJpZ2h0KTsKLSAgICAg
ICAgICAgIGlmIChtYXJnaW5TdGFydEFuZEVuZCA+PSAwKQotICAgICAgICAgICAgICAgIHVzZWRI
b3Jpem9udGFsTWFyZ2luID0geyBtYXJnaW5TdGFydEFuZEVuZCAvIDIsIG1hcmdpblN0YXJ0QW5k
RW5kIC8gMiB9OwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzTGVm
dFRvUmlnaHREaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxN
YXJnaW4uc3RhcnQgPSAwX2x1OwotICAgICAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1h
cmdpbi5lbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFs
TWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGlu
Z1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqcmlnaHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9IDBfbHU7Ci0g
ICAgICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gY29udGFpbmlu
Z0Jsb2NrV2lkdGggLSAoKmxlZnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGgg
KyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCAr
ICpyaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVs
c2UgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQpIHsKLSAgICAgICAgICAgIHVz
ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kOwot
ICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSBjb250YWluaW5nQmxvY2tX
aWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRp
bmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kICsgKnJpZ2h0
KTsKLSAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgewot
ICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSAqY29tcHV0ZWRIb3Jpem9u
dGFsTWFyZ2luLnN0YXJ0OwotICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0g
Y29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFy
dCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJv
cmRlclJpZ2h0ICsgKnJpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVzZWRI
b3Jpem9udGFsTWFyZ2luID0geyAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LCAqY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCB9OwotICAgICAgICAgICAgLy8gT3ZlcmNvbnN0cmFp
bmVkPyBJZ25vcmUgcmlnaHQgKGxlZnQpLgotICAgICAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHRE
aXJlY3Rpb24pCi0gICAgICAgICAgICAgICAgcmlnaHQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAt
ICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArICpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRp
bmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpv
bnRhbE1hcmdpbi5lbmQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxlZnQg
PSBjb250YWluaW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJv
cmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJp
Z2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKLSAgICAgICAgfQotICAg
IH0gZWxzZSB7Ci0gICAgICAgIC8vIE90aGVyd2lzZSwgc2V0ICdhdXRvJyB2YWx1ZXMgZm9yICdt
YXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIHRvIDAsIGFuZCBwaWNrIHRoZSBvbmUgb2Yg
dGhlIGZvbGxvd2luZyBzaXggcnVsZXMgdGhhdCBhcHBsaWVzLgotICAgICAgICB1c2VkSG9yaXpv
bnRhbE1hcmdpbiA9IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCks
IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OwotICAgIH0KLQotICAg
IGlmICghbGVmdCAmJiAhd2lkdGggJiYgcmlnaHQpIHsKLSAgICAgICAgLy8gIzEKLSAgICAgICAg
Ly8gQ2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgd2lkdGggYnkgc29sdmluZyBmb3IgJ3dpZHRoJyBh
ZnRlciBzZXR0aW5nICdsZWZ0JyAoaW4gY2FzZSAxKSB0byAwCi0gICAgICAgIGxlZnQgPSBMYXlv
dXRVbml0IHsgMCB9OwotICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gY29udGFpbmluZ0Js
b2NrV2lkdGggLSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxl
ZnQgKyBwYWRkaW5nTGVmdCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6
b250YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKLSAgICAgICAgd2lkdGggPSBzaHJpbmtUb0ZpdFdp
ZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpOwotICAgICAgICBsZWZ0ID0gY29udGFpbmlu
Z0Jsb2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsg
cGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgICsgYm9yZGVyUmlnaHQgKyB1c2Vk
SG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOwotICAgIH0gZWxzZSBpZiAoIWxlZnQgJiYg
IXJpZ2h0ICYmIHdpZHRoKSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIGF1dG8gc3RhdGljSG9y
aXpvbnRhbFBvc2l0aW9uID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9z
aXRpb25lZChsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgICAgIGlmIChp
c0xlZnRUb1JpZ2h0RGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBsZWZ0ID0gc3RhdGljSG9yaXpv
bnRhbFBvc2l0aW9uOwotICAgICAgICAgICAgcmlnaHQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAt
ICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRp
bmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpv
bnRhbE1hcmdpbi5lbmQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmlnaHQgPSBz
dGF0aWNIb3Jpem9udGFsUG9zaXRpb247Ci0gICAgICAgICAgICBsZWZ0ID0gY29udGFpbmluZ0Js
b2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCF3
aWR0aCAmJiAhcmlnaHQgJiYgbGVmdCkgewotICAgICAgICAvLyAjMwotICAgICAgICAvLyBDYWxj
dWxhdGUgdGhlIGF2YWlsYWJsZSB3aWR0aCBieSBzb2x2aW5nIGZvciAnd2lkdGgnIGFmdGVyIHNl
dHRpbmcgJ3JpZ2h0JyAoaW4gY2FzZSAzKSB0byAwCi0gICAgICAgIHJpZ2h0ID0gTGF5b3V0VW5p
dCB7IDAgfTsKLSAgICAgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGNvbnRhaW5pbmdCbG9ja1dp
ZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsg
cGFkZGluZ0xlZnQgKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFs
TWFyZ2luLmVuZCArICpyaWdodCk7Ci0gICAgICAgIHdpZHRoID0gc2hyaW5rVG9GaXRXaWR0aChs
YXlvdXRCb3gsIGF2YWlsYWJsZVdpZHRoKTsKLSAgICAgICAgcmlnaHQgPSBjb250YWluaW5nQmxv
Y2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVm
dCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1
c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAgIH0gZWxzZSBpZiAoIWxlZnQgJiYgd2lkdGgg
JiYgcmlnaHQpIHsKLSAgICAgICAgLy8gIzQKLSAgICAgICAgbGVmdCA9IGNvbnRhaW5pbmdCbG9j
a1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRp
bmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpv
bnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOwotICAgIH0gZWxzZSBpZiAoIXdpZHRoICYmIGxlZnQg
JiYgcmlnaHQpIHsKLSAgICAgICAgLy8gIzUKLSAgICAgICAgd2lkdGggPSBjb250YWluaW5nQmxv
Y2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVm
dCArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpv
bnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOwotICAgIH0gZWxzZSBpZiAoIXJpZ2h0ICYmIGxlZnQg
JiYgd2lkdGgpIHsKLSAgICAgICAgLy8gIzYKLSAgICAgICAgcmlnaHQgPSBjb250YWluaW5nQmxv
Y2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVm
dCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1
c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAgIH0KLQotICAgIEFTU0VSVChsZWZ0KTsKLSAg
ICBBU1NFUlQocmlnaHQpOwotICAgIEFTU0VSVCh3aWR0aCk7Ci0KLSAgICAvLyBGb3Igb3V0LW9m
LWZsb3cgZWxlbWVudHMgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgZm9ybWVkIGJ5IHRoZSBwYWRk
aW5nIGVkZ2Ugb2YgdGhlIGFuY2VzdG9yLgotICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBvc2l0
aW9uZWQgdmFsdWUgaXMgaW4gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBwYWRkaW5nIGJv
eC4gTGV0J3MgY29udmVydCBpdCB0byBib3JkZXIgYm94IGNvb3JkaW5hdGUgc3lzdGVtLgotICAg
IGF1dG8gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZSA9IGhvcml6b250YWxDb25z
dHJhaW50cy5sb2dpY2FsTGVmdDsKLSAgICAqbGVmdCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5n
VmVydGljYWxFZGdlOwotICAgICpyaWdodCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGlj
YWxFZGdlOwotCi0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBz
dHJlYW0gPDwgIltQb3NpdGlvbl1bV2lkdGhdW01hcmdpbl0gLT4gb3V0LW9mLWZsb3cgbm9uLXJl
cGxhY2VkIC0+IGxlZnQoIiA8PCAqbGVmdCA8PCAicHgpIHJpZ2h0KCIgIDw8ICpyaWdodCA8PCAi
cHgpIHdpZHRoKCIgPDwgKndpZHRoIDw8ICJweCkgbWFyZ2luKCIgPDwgdXNlZEhvcml6b250YWxN
YXJnaW4uc3RhcnQgPDwgInB4LCAiICA8PCB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgPDwgInB4
KSBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIHsgKmxlZnQs
ICpyaWdodCwgeyAqd2lkdGgsIHVzZWRIb3Jpem9udGFsTWFyZ2luIH0gfTsKLX0KLQotVmVydGlj
YWxHZW9tZXRyeSBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Om91dE9mRmxvd1JlcGxhY2Vk
VmVydGljYWxHZW9tZXRyeShjb25zdCBSZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBWZXJ0aWNh
bENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuVmVydGlj
YWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgY29uc3QKLXsKLSAgICBBU1NFUlQo
cmVwbGFjZWRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOwotICAgIEFTU0VSVCh2ZXJ0aWNh
bENvbnN0cmFpbnRzLmxvZ2ljYWxIZWlnaHQpOwotCi0gICAgLy8gMTAuNi41IEFic29sdXRlbHkg
cG9zaXRpb25lZCwgcmVwbGFjZWQgZWxlbWVudHMKLSAgICAvLwotICAgIC8vIFRoZSB1c2VkIHZh
bHVlIG9mICdoZWlnaHQnIGlzIGRldGVybWluZWQgYXMgZm9yIGlubGluZSByZXBsYWNlZCBlbGVt
ZW50cy4KLSAgICAvLyBJZiAnbWFyZ2luLXRvcCcgb3IgJ21hcmdpbi1ib3R0b20nIGlzIHNwZWNp
ZmllZCBhcyAnYXV0bycgaXRzIHVzZWQgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcnVsZXMg
YmVsb3cuCi0gICAgLy8gMS4gSWYgYm90aCAndG9wJyBhbmQgJ2JvdHRvbScgaGF2ZSB0aGUgdmFs
dWUgJ2F1dG8nLCByZXBsYWNlICd0b3AnIHdpdGggdGhlIGVsZW1lbnQncyBzdGF0aWMgcG9zaXRp
b24uCi0gICAgLy8gMi4gSWYgJ2JvdHRvbScgaXMgJ2F1dG8nLCByZXBsYWNlIGFueSAnYXV0bycg
b24gJ21hcmdpbi10b3AnIG9yICdtYXJnaW4tYm90dG9tJyB3aXRoICcwJy4KLSAgICAvLyAzLiBJ
ZiBhdCB0aGlzIHBvaW50IGJvdGggJ21hcmdpbi10b3AnIGFuZCAnbWFyZ2luLWJvdHRvbScgYXJl
IHN0aWxsICdhdXRvJywgc29sdmUgdGhlIGVxdWF0aW9uIHVuZGVyIHRoZSBleHRyYSBjb25zdHJh
aW50IHRoYXQgdGhlIHR3byBtYXJnaW5zIG11c3QgZ2V0IGVxdWFsIHZhbHVlcy4KLSAgICAvLyA0
LiBJZiBhdCB0aGlzIHBvaW50IHRoZXJlIGlzIG9ubHkgb25lICdhdXRvJyBsZWZ0LCBzb2x2ZSB0
aGUgZXF1YXRpb24gZm9yIHRoYXQgdmFsdWUuCi0gICAgLy8gNS4gSWYgYXQgdGhpcyBwb2ludCB0
aGUgdmFsdWVzIGFyZSBvdmVyLWNvbnN0cmFpbmVkLCBpZ25vcmUgdGhlIHZhbHVlIGZvciAnYm90
dG9tJyBhbmQgc29sdmUgZm9yIHRoYXQgdmFsdWUuCi0KLSAgICBhdXRvJiBmb3JtYXR0aW5nQ29u
dGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7Ci0gICAgYXV0byYgc3R5bGUgPSByZXBs
YWNlZEJveC5zdHlsZSgpOwotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRl
eHQuZ2VvbWV0cnlGb3JCb3gocmVwbGFjZWRCb3gpOwotICAgIGF1dG8gY29udGFpbmluZ0Jsb2Nr
SGVpZ2h0ID0gKnZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbEhlaWdodDsKLSAgICBhdXRvIGNv
bnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsK
LQotICAgIGF1dG8gdG9wID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2FsVG9wKCksIGNvbnRh
aW5pbmdCbG9ja1dpZHRoKTsKLSAgICBhdXRvIGJvdHRvbSA9IGNvbXB1dGVkVmFsdWUoc3R5bGUu
bG9naWNhbEJvdHRvbSgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0gICAgYXV0byBoZWlnaHQg
PSBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6
b250YWxDb25zdHJhaW50cywgdmVydGljYWxDb25zdHJhaW50cywgb3ZlcnJpZGRlblZlcnRpY2Fs
VmFsdWVzKS5jb250ZW50SGVpZ2h0OwotICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9
IEdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFs
Q29uc3RyYWludHMpOwotICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRNYXJnaW5CZWZvcmUg
PSBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZTsKLSAgICBPcHRpb25hbDxMYXlvdXRVbml0
PiB1c2VkTWFyZ2luQWZ0ZXIgPSBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyOwotICAgIGF1
dG8gcGFkZGluZ1RvcCA9IGJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKDApOwotICAg
IGF1dG8gcGFkZGluZ0JvdHRvbSA9IGJveEdlb21ldHJ5LnBhZGRpbmdCb3R0b20oKS52YWx1ZU9y
KDApOwotICAgIGF1dG8gYm9yZGVyVG9wID0gYm94R2VvbWV0cnkuYm9yZGVyVG9wKCk7Ci0gICAg
YXV0byBib3JkZXJCb3R0b20gPSBib3hHZW9tZXRyeS5ib3JkZXJCb3R0b20oKTsKLQotICAgIGlm
ICghdG9wICYmICFib3R0b20pIHsKLSAgICAgICAgLy8gIzEKLSAgICAgICAgdG9wID0gc3RhdGlj
VmVydGljYWxQb3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQocmVwbGFjZWRCb3gsIHZlcnRp
Y2FsQ29uc3RyYWludHMpOwotICAgIH0KLQotICAgIGlmICghYm90dG9tKSB7Ci0gICAgICAgIC8v
ICMyCi0gICAgICAgIHVzZWRNYXJnaW5CZWZvcmUgPSBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJl
Zm9yZS52YWx1ZU9yKDApOwotICAgICAgICB1c2VkTWFyZ2luQWZ0ZXIgPSB1c2VkTWFyZ2luQmVm
b3JlOwotICAgIH0KLQotICAgIGlmICghdXNlZE1hcmdpbkJlZm9yZSAmJiAhdXNlZE1hcmdpbkFm
dGVyKSB7Ci0gICAgICAgIC8vICMzCi0gICAgICAgIGF1dG8gbWFyZ2luQmVmb3JlQW5kQWZ0ZXIg
PSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIGJvcmRlclRvcCArIHBhZGRpbmdUb3Ag
KyBoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKmJvdHRvbSk7Ci0gICAg
ICAgIHVzZWRNYXJnaW5CZWZvcmUgPSBtYXJnaW5CZWZvcmVBbmRBZnRlciAvIDI7Ci0gICAgICAg
IHVzZWRNYXJnaW5BZnRlciA9IHVzZWRNYXJnaW5CZWZvcmU7Ci0gICAgfQotCi0gICAgLy8gIzQK
LSAgICBpZiAoIXRvcCkKLSAgICAgICAgdG9wID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp1
c2VkTWFyZ2luQmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdodCArIHBhZGRp
bmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyICsgKmJvdHRvbSk7Ci0K
LSAgICBpZiAoIWJvdHRvbSkKLSAgICAgICAgYm90dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0
IC0gKCp0b3AgKyAqdXNlZE1hcmdpbkJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBo
ZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKnVzZWRNYXJnaW5BZnRlcik7
Ci0KLSAgICBpZiAoIXVzZWRNYXJnaW5CZWZvcmUpCi0gICAgICAgIHVzZWRNYXJnaW5CZWZvcmUg
PSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIGJvcmRlclRvcCArIHBhZGRpbmdUb3Ag
KyBoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKnVzZWRNYXJnaW5BZnRl
ciArICpib3R0b20pOwotCi0gICAgaWYgKCF1c2VkTWFyZ2luQWZ0ZXIpCi0gICAgICAgIHVzZWRN
YXJnaW5BZnRlciA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgKnVzZWRNYXJnaW5C
ZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSAr
IGJvcmRlckJvdHRvbSArICpib3R0b20pOwotCi0gICAgLy8gIzUKLSAgICBhdXRvIGJveEhlaWdo
dCA9ICp0b3AgKyAqdXNlZE1hcmdpbkJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBo
ZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKnVzZWRNYXJnaW5BZnRlciAr
ICpib3R0b207Ci0gICAgaWYgKGJveEhlaWdodCA+IGNvbnRhaW5pbmdCbG9ja0hlaWdodCkKLSAg
ICAgICAgYm90dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyAqdXNlZE1hcmdp
bkJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBoZWlnaHQgKyBwYWRkaW5nQm90dG9t
ICsgYm9yZGVyQm90dG9tICsgKnVzZWRNYXJnaW5BZnRlcik7IAotCi0gICAgLy8gRm9yIG91dC1v
Zi1mbG93IGVsZW1lbnRzIHRoZSBjb250YWluaW5nIGJsb2NrIGlzIGZvcm1lZCBieSB0aGUgcGFk
ZGluZyBlZGdlIG9mIHRoZSBhbmNlc3Rvci4KLSAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwb3Np
dGlvbmVkIHZhbHVlIGlzIGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgcGFkZGluZyBi
b3guIExldCdzIGNvbnZlcnQgaXQgdG8gYm9yZGVyIGJveCBjb29yZGluYXRlIHN5c3RlbS4KLSAg
ICBhdXRvIGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2UgPSB2ZXJ0aWNhbENvbnN0
cmFpbnRzLmxvZ2ljYWxUb3A7Ci0gICAgKnRvcCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVy
dGljYWxFZGdlOwotICAgICpib3R0b20gKz0gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2Fs
RWRnZTsKLQotICAgIEFTU0VSVCh0b3ApOwotICAgIEFTU0VSVChib3R0b20pOwotICAgIEFTU0VS
VCh1c2VkTWFyZ2luQmVmb3JlKTsKLSAgICBBU1NFUlQodXNlZE1hcmdpbkFmdGVyKTsKLSAgICBM
T0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1Bvc2l0
aW9uXVtIZWlnaHRdW01hcmdpbl0gLT4gb3V0LW9mLWZsb3cgcmVwbGFjZWQgLT4gdG9wKCIgPDwg
KnRvcCA8PCAicHgpIGJvdHRvbSgiICA8PCAqYm90dG9tIDw8ICJweCkgaGVpZ2h0KCIgPDwgaGVp
Z2h0IDw8ICJweCkgbWFyZ2luKCIgPDwgKnVzZWRNYXJnaW5CZWZvcmUgPDwgInB4LCAiICA8PCAq
dXNlZE1hcmdpbkFmdGVyIDw8ICJweCkgbGF5b3V0Qm94KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIp
Iik7Ci0gICAgcmV0dXJuIHsgKnRvcCwgKmJvdHRvbSwgeyBoZWlnaHQsIHsgKnVzZWRNYXJnaW5C
ZWZvcmUsICp1c2VkTWFyZ2luQWZ0ZXIgfSB9IH07Ci19Ci0KLUhvcml6b250YWxHZW9tZXRyeSBG
b3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Om91dE9mRmxvd1JlcGxhY2VkSG9yaXpvbnRhbEdl
b21ldHJ5KGNvbnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWlu
dHMmIHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVz
JiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKLXsKLSAgICBBU1NFUlQocmVwbGFjZWRCb3gu
aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOwotCi0gICAgLy8gMTAuMy44IEFic29sdXRlbHkgcG9z
aXRpb25lZCwgcmVwbGFjZWQgZWxlbWVudHMKLSAgICAvLyBJbiB0aGlzIGNhc2UsIHNlY3Rpb24g
MTAuMy43IGFwcGxpZXMgdXAgdGhyb3VnaCBhbmQgaW5jbHVkaW5nIHRoZSBjb25zdHJhaW50IGVx
dWF0aW9uLCBidXQgdGhlIHJlc3Qgb2Ygc2VjdGlvbiAxMC4zLjcgaXMgcmVwbGFjZWQgYnkgdGhl
IGZvbGxvd2luZyBydWxlczoKLSAgICAvLwotICAgIC8vIFRoZSB1c2VkIHZhbHVlIG9mICd3aWR0
aCcgaXMgZGV0ZXJtaW5lZCBhcyBmb3IgaW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLiBJZiAnbWFy
Z2luLWxlZnQnIG9yICdtYXJnaW4tcmlnaHQnIGlzIHNwZWNpZmllZCBhcyAnYXV0bycgaXRzIHVz
ZWQgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcnVsZXMgYmVsb3cuCi0gICAgLy8gMS4gSWYg
Ym90aCAnbGVmdCcgYW5kICdyaWdodCcgaGF2ZSB0aGUgdmFsdWUgJ2F1dG8nLCB0aGVuIGlmIHRo
ZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgZWxlbWVudCBlc3RhYmxpc2hpbmcgdGhlIHN0
YXRpYy1wb3NpdGlvbiBjb250YWluaW5nIGJsb2NrIGlzICdsdHInLAotICAgIC8vICAgc2V0ICds
ZWZ0JyB0byB0aGUgc3RhdGljIHBvc2l0aW9uOyBlbHNlIGlmICdkaXJlY3Rpb24nIGlzICdydGwn
LCBzZXQgJ3JpZ2h0JyB0byB0aGUgc3RhdGljIHBvc2l0aW9uLgotICAgIC8vIDIuIElmICdsZWZ0
JyBvciAncmlnaHQnIGFyZSAnYXV0bycsIHJlcGxhY2UgYW55ICdhdXRvJyBvbiAnbWFyZ2luLWxl
ZnQnIG9yICdtYXJnaW4tcmlnaHQnIHdpdGggJzAnLgotICAgIC8vIDMuIElmIGF0IHRoaXMgcG9p
bnQgYm90aCAnbWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyBhcmUgc3RpbGwgJ2F1dG8n
LCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4dHJhIGNvbnN0cmFpbnQgdGhhdCB0aGUg
dHdvIG1hcmdpbnMgbXVzdCBnZXQgZXF1YWwgdmFsdWVzLAotICAgIC8vICAgdW5sZXNzIHRoaXMg
d291bGQgbWFrZSB0aGVtIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIHdoZW4gdGhlIGRpcmVjdGlv
biBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAnbHRyJyAoJ3J0bCcpLCBzZXQgJ21hcmdpbi1s
ZWZ0JyAoJ21hcmdpbi1yaWdodCcpIHRvIHplcm8gYW5kCi0gICAgLy8gICBzb2x2ZSBmb3IgJ21h
cmdpbi1yaWdodCcgKCdtYXJnaW4tbGVmdCcpLgotICAgIC8vIDQuIElmIGF0IHRoaXMgcG9pbnQg
dGhlcmUgaXMgYW4gJ2F1dG8nIGxlZnQsIHNvbHZlIHRoZSBlcXVhdGlvbiBmb3IgdGhhdCB2YWx1
ZS4KLSAgICAvLyA1LiBJZiBhdCB0aGlzIHBvaW50IHRoZSB2YWx1ZXMgYXJlIG92ZXItY29uc3Ry
YWluZWQsIGlnbm9yZSB0aGUgdmFsdWUgZm9yIGVpdGhlciAnbGVmdCcgKGluIGNhc2UgdGhlICdk
aXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGlzICdydGwnKSBvcgot
ICAgIC8vICAgJ3JpZ2h0JyAoaW4gY2FzZSAnZGlyZWN0aW9uJyBpcyAnbHRyJykgYW5kIHNvbHZl
IGZvciB0aGF0IHZhbHVlLgotCi0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5m
b3JtYXR0aW5nQ29udGV4dCgpOwotICAgIGF1dG8mIHN0eWxlID0gcmVwbGFjZWRCb3guc3R5bGUo
KTsKLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9y
Qm94KHJlcGxhY2VkQm94KTsKLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpv
bnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAgICBhdXRvIGlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24gPSByZXBsYWNlZEJveC5jb250YWluaW5nQmxvY2soKS5zdHlsZSgpLmlzTGVmdFRvUmln
aHREaXJlY3Rpb24oKTsKLQotICAgIGF1dG8gbGVmdCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9n
aWNhbExlZnQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgIGF1dG8gcmlnaHQgPSBjb21w
dXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxSaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0g
ICAgYXV0byBjb21wdXRlZEhvcml6b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRIb3Jp
em9udGFsTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgIE9w
dGlvbmFsPExheW91dFVuaXQ+IHVzZWRNYXJnaW5TdGFydCA9IGNvbXB1dGVkSG9yaXpvbnRhbE1h
cmdpbi5zdGFydDsKLSAgICBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkTWFyZ2luRW5kID0gY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZDsKLSAgICBhdXRvIHdpZHRoID0gaW5saW5lUmVwbGFj
ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50
cywgdmVydGljYWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpLmNvbnRl
bnRXaWR0aDsKLSAgICBhdXRvIHBhZGRpbmdMZWZ0ID0gYm94R2VvbWV0cnkucGFkZGluZ0xlZnQo
KS52YWx1ZU9yKDApOwotICAgIGF1dG8gcGFkZGluZ1JpZ2h0ID0gYm94R2VvbWV0cnkucGFkZGlu
Z1JpZ2h0KCkudmFsdWVPcigwKTsKLSAgICBhdXRvIGJvcmRlckxlZnQgPSBib3hHZW9tZXRyeS5i
b3JkZXJMZWZ0KCk7Ci0gICAgYXV0byBib3JkZXJSaWdodCA9IGJveEdlb21ldHJ5LmJvcmRlclJp
Z2h0KCk7Ci0KLSAgICBpZiAoIWxlZnQgJiYgIXJpZ2h0KSB7Ci0gICAgICAgIC8vICMxCi0gICAg
ICAgIGF1dG8gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0
aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFp
bnRzKTsKLSAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pCi0gICAgICAgICAgICBs
ZWZ0ID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICByaWdodCA9IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbjsKLSAgICB9Ci0KLSAgICBpZiAoIWxl
ZnQgfHwgIXJpZ2h0KSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIHVzZWRNYXJnaW5TdGFydCA9
IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDApOwotICAgICAgICB1c2Vk
TWFyZ2luRW5kID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApOwotICAg
IH0KLQotICAgIGlmICghdXNlZE1hcmdpblN0YXJ0ICYmICF1c2VkTWFyZ2luRW5kKSB7Ci0gICAg
ICAgIC8vICMzCi0gICAgICAgIGF1dG8gbWFyZ2luU3RhcnRBbmRFbmQgPSBjb250YWluaW5nQmxv
Y2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFk
ZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqcmlnaHQpOwotICAgICAgICBpZiAobWFyZ2luU3Rh
cnRBbmRFbmQgPj0gMCkgewotICAgICAgICAgICAgdXNlZE1hcmdpblN0YXJ0ID0gbWFyZ2luU3Rh
cnRBbmRFbmQgLyAyOwotICAgICAgICAgICAgdXNlZE1hcmdpbkVuZCA9IHVzZWRNYXJnaW5TdGFy
dDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0
aW9uKSB7Ci0gICAgICAgICAgICAgICAgdXNlZE1hcmdpblN0YXJ0ID0gMF9sdTsKLSAgICAgICAg
ICAgICAgICB1c2VkTWFyZ2luRW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyAq
dXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRk
aW5nUmlnaHQgKyBib3JkZXJSaWdodCArICpyaWdodCk7Ci0gICAgICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgICAgIHVzZWRNYXJnaW5FbmQgPSAwX2x1OwotICAgICAgICAgICAgICAgIHVz
ZWRNYXJnaW5TdGFydCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVm
dCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1
c2VkTWFyZ2luRW5kICsgKnJpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0K
LQotICAgIC8vICM0Ci0gICAgaWYgKCFsZWZ0KQotICAgICAgICBsZWZ0ID0gY29udGFpbmluZ0Js
b2NrV2lkdGggLSAoKnVzZWRNYXJnaW5TdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCAr
IHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNlZE1hcmdpbkVuZCArICpy
aWdodCk7Ci0KLSAgICBpZiAoIXJpZ2h0KQotICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9j
a1dpZHRoIC0gKCpsZWZ0ICsgKnVzZWRNYXJnaW5TdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5n
TGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNlZE1hcmdpbkVu
ZCk7Ci0KLSAgICBpZiAoIXVzZWRNYXJnaW5TdGFydCkKLSAgICAgICAgdXNlZE1hcmdpblN0YXJ0
ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xl
ZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnVzZWRNYXJnaW5FbmQg
KyAqcmlnaHQpOwotCi0gICAgaWYgKCF1c2VkTWFyZ2luRW5kKQotICAgICAgICB1c2VkTWFyZ2lu
RW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyAqdXNlZE1hcmdpblN0YXJ0ICsg
Ym9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJS
aWdodCArICpyaWdodCk7Ci0KLSAgICBhdXRvIGJveFdpZHRoID0gKCpsZWZ0ICsgKnVzZWRNYXJn
aW5TdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0
ICsgYm9yZGVyUmlnaHQgKyAqdXNlZE1hcmdpbkVuZCArICpyaWdodCk7Ci0gICAgaWYgKGJveFdp
ZHRoID4gY29udGFpbmluZ0Jsb2NrV2lkdGgpIHsKLSAgICAgICAgLy8gIzUgT3Zlci1jb25zdHJh
aW5lZD8KLSAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pCi0gICAgICAgICAgICBy
aWdodCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgKnVzZWRNYXJnaW5TdGFydCAr
IGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVy
UmlnaHQgKyAqdXNlZE1hcmdpbkVuZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxlZnQg
PSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVmdCAr
IHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1c2Vk
TWFyZ2luRW5kICsgKnJpZ2h0KTsKLSAgICB9Ci0KLSAgICBBU1NFUlQobGVmdCk7Ci0gICAgQVNT
RVJUKHJpZ2h0KTsKLSAgICBBU1NFUlQodXNlZE1hcmdpblN0YXJ0KTsKLSAgICBBU1NFUlQodXNl
ZE1hcmdpbkVuZCk7Ci0KLSAgICAvLyBGb3Igb3V0LW9mLWZsb3cgZWxlbWVudHMgdGhlIGNvbnRh
aW5pbmcgYmxvY2sgaXMgZm9ybWVkIGJ5IHRoZSBwYWRkaW5nIGVkZ2Ugb2YgdGhlIGFuY2VzdG9y
LgotICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBvc2l0aW9uZWQgdmFsdWUgaXMgaW4gdGhlIGNv
b3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBwYWRkaW5nIGJveC4gTGV0J3MgY29udmVydCBpdCB0byBi
b3JkZXIgYm94IGNvb3JkaW5hdGUgc3lzdGVtLgotICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrUGFk
ZGluZ1ZlcnRpY2FsRWRnZSA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsTGVmdDsKLSAg
ICAqbGVmdCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOwotICAgICpyaWdo
dCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOwotCi0gICAgTE9HX1dJVEhf
U1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltQb3NpdGlvbl1bV2lk
dGhdW01hcmdpbl0gLT4gb3V0LW9mLWZsb3cgcmVwbGFjZWQgLT4gbGVmdCgiIDw8ICpsZWZ0IDw8
ICJweCkgcmlnaHQoIiAgPDwgKnJpZ2h0IDw8ICJweCkgd2lkdGgoIiA8PCB3aWR0aCA8PCAicHgp
IG1hcmdpbigiIDw8ICp1c2VkTWFyZ2luU3RhcnQgPDwgInB4LCAiICA8PCAqdXNlZE1hcmdpbkVu
ZCA8PCAicHgpIGxheW91dEJveCgiIDw8ICZyZXBsYWNlZEJveCA8PCAiKSIpOwotICAgIHJldHVy
biB7ICpsZWZ0LCAqcmlnaHQsIHsgd2lkdGgsIHsgKnVzZWRNYXJnaW5TdGFydCwgKnVzZWRNYXJn
aW5FbmQgfSB9IH07Ci19Ci0KLUNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5Ojpjb21wbGljYXRlZENhc2VzKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3Zl
cnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Ci17
Ci0gICAgQVNTRVJUKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKLSAgICAvLyBUT0RPOiBV
c2UgY29tcGxpY2F0ZWQtY2FzZSBmb3IgZG9jdW1lbnQgcmVuZGVyZXIgZm9yIG5vdyAoc2VlIEJs
b2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbkZsb3dIZWlnaHRBbmRNYXJnaW4pLgot
ICAgIEFTU0VSVCgobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpICYmIGxheW91dEJveC5pc0lu
RmxvdygpICYmICFsYXlvdXRCb3guaXNPdmVyZmxvd1Zpc2libGUoKSkgfHwgbGF5b3V0Qm94Lmlz
SW5saW5lQmxvY2tCb3goKSB8fCBsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSB8fCBs
YXlvdXRCb3guaXNEb2N1bWVudEJveCgpIHx8IGxheW91dEJveC5pc1RhYmxlQm94KCkpOwotCi0g
ICAgLy8gMTAuNi42IENvbXBsaWNhdGVkIGNhc2VzCi0gICAgLy8KLSAgICAvLyBCbG9jay1sZXZl
bCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93IHdoZW4gJ292ZXJmbG93JyBk
b2VzIG5vdCBjb21wdXRlIHRvICd2aXNpYmxlJyAoZXhjZXB0IGlmIHRoZSAnb3ZlcmZsb3cnIHBy
b3BlcnR5J3MgdmFsdWUgaGFzIGJlZW4gcHJvcGFnYXRlZCB0byB0aGUgdmlld3BvcnQpLgotICAg
IC8vICdJbmxpbmUtYmxvY2snLCBub24tcmVwbGFjZWQgZWxlbWVudHMuCi0gICAgLy8gRmxvYXRp
bmcsIG5vbi1yZXBsYWNlZCBlbGVtZW50cy4KLSAgICAvLwotICAgIC8vIDEuIElmICdtYXJnaW4t
dG9wJywgb3IgJ21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHRoZWlyIHVzZWQgdmFsdWUgaXMg
MC4KLSAgICAvLyAyLiBJZiAnaGVpZ2h0JyBpcyAnYXV0bycsIHRoZSBoZWlnaHQgZGVwZW5kcyBv
biB0aGUgZWxlbWVudCdzIGRlc2NlbmRhbnRzIHBlciAxMC42LjcuCi0KLSAgICBhdXRvIGhlaWdo
dCA9IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQgPyBvdmVycmlkZGVuVmVydGljYWxW
YWx1ZXMuaGVpZ2h0LnZhbHVlKCkgOiBjb21wdXRlZEhlaWdodChsYXlvdXRCb3gpOwotICAgIGF1
dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFy
Z2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAvLyAjMQotICAgIGF1
dG8gdXNlZFZlcnRpY2FsTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRW
YWx1ZXMgeyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21wdXRl
ZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsgCi0gICAgLy8gIzIKLSAgICBpZiAo
IWhlaWdodCkgewotICAgICAgICBBU1NFUlQoaXNIZWlnaHRBdXRvKGxheW91dEJveCkpOwotICAg
ICAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSB8fCAhZG93bmNhc3Q8Q29udGFp
bmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQotICAgICAgICAg
ICAgaGVpZ2h0ID0gMF9sdTsKLSAgICAgICAgZWxzZSBpZiAobGF5b3V0Qm94LmlzRG9jdW1lbnRC
b3goKSAmJiAhbGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSkgewotICAg
ICAgICAgICAgYXV0byYgZG9jdW1lbnRCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91
dEJveCk7Ci0gICAgICAgICAgICBhdXRvIHRvcCA9IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0
KGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goKmRvY3VtZW50Qm94LmZpcnN0SW5G
bG93Q2hpbGQoKSkpLnRvcCgpOwotICAgICAgICAgICAgYXV0byBib3R0b20gPSBCb3hHZW9tZXRy
eTo6bWFyZ2luQm94UmVjdChmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KCpkb2N1
bWVudEJveC5sYXN0SW5GbG93Q2hpbGQoKSkpLmJvdHRvbSgpOwotICAgICAgICAgICAgLy8gVGhp
cyBpcyBhIHNwZWNpYWwgKHF1aXJrPykgYmVoYXZpb3Igc2luY2UgdGhlIGRvY3VtZW50IGJveCBp
cyBub3QgYSBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdCBhbmQKLSAgICAgICAgICAgIC8vIGFsbCB0
aGUgZmxvYXQgYm94ZXMgZW5kIHVwIGF0IHRoZSBJQ0IgbGV2ZWwuCi0gICAgICAgICAgICBhdXRv
JiBpbml0aWFsQ29udGFpbmluZ0Jsb2NrID0gZG9jdW1lbnRCb3guZm9ybWF0dGluZ0NvbnRleHRS
b290KCk7Ci0gICAgICAgICAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4
dCB7IGZvcm1hdHRpbmdDb250ZXh0KCksIGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRGb3JtYXR0
aW5nU3RhdGUoaW5pdGlhbENvbnRhaW5pbmdCbG9jaykuZmxvYXRpbmdTdGF0ZSgpIH07Ci0gICAg
ICAgICAgICBpZiAoYXV0byBmbG9hdEJvdHRvbSA9IGZsb2F0aW5nQ29udGV4dC5ib3R0b20oKSkg
ewotICAgICAgICAgICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4PExheW91dFVuaXQ+KCpmbG9hdEJv
dHRvbSwgYm90dG9tKTsKLSAgICAgICAgICAgICAgICBhdXRvIGZsb2F0VG9wID0gZmxvYXRpbmdD
b250ZXh0LnRvcCgpOwotICAgICAgICAgICAgICAgIEFTU0VSVChmbG9hdFRvcCk7Ci0gICAgICAg
ICAgICAgICAgdG9wID0gc3RkOjptaW48TGF5b3V0VW5pdD4oKmZsb2F0VG9wLCB0b3ApOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgaGVpZ2h0ID0gYm90dG9tIC0gdG9wOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgQVNTRVJUKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRp
bmdDb250ZXh0KCkpOwotICAgICAgICAgICAgaGVpZ2h0ID0gY29udGVudEhlaWdodEZvckZvcm1h
dHRpbmdDb250ZXh0Um9vdChkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgQVNTRVJUKGhlaWdodCk7Ci0KLSAgICBMT0dfV0lUSF9TVFJF
QU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW0hlaWdodF1bTWFyZ2luXSAt
PiBmbG9hdGluZyBub24tcmVwbGFjZWQgLT4gaGVpZ2h0KCIgPDwgKmhlaWdodCA8PCAicHgpIG1h
cmdpbigiIDw8IHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPDwgInB4LCAiIDw8IHVzZWRWZXJ0
aWNhbE1hcmdpbi5hZnRlciA8PCAicHgpIC0+IGxheW91dEJveCgiIDw8ICZsYXlvdXRCb3ggPDwg
IikiKTsKLSAgICByZXR1cm4gQ29udGVudEhlaWdodEFuZE1hcmdpbiB7ICpoZWlnaHQsIHVzZWRW
ZXJ0aWNhbE1hcmdpbiB9OwotfQotCi1Db250ZW50V2lkdGhBbmRNYXJnaW4gRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5OjpmbG9hdGluZ05vblJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2lu
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6
b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJy
aWRkZW5Ib3Jpem9udGFsVmFsdWVzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNGbG9hdGlu
Z1Bvc2l0aW9uZWQoKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSk7Ci0KLSAgICAvLyAx
MC4zLjUgRmxvYXRpbmcsIG5vbi1yZXBsYWNlZCBlbGVtZW50cwotICAgIC8vCi0gICAgLy8gMS4g
SWYgJ21hcmdpbi1sZWZ0Jywgb3IgJ21hcmdpbi1yaWdodCcgYXJlIGNvbXB1dGVkIGFzICdhdXRv
JywgdGhlaXIgdXNlZCB2YWx1ZSBpcyAnMCcuCi0gICAgLy8gMi4gSWYgJ3dpZHRoJyBpcyBjb21w
dXRlZCBhcyAnYXV0bycsIHRoZSB1c2VkIHZhbHVlIGlzIHRoZSAic2hyaW5rLXRvLWZpdCIgd2lk
dGguCi0KLSAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21w
dXRlZEhvcml6b250YWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwot
Ci0gICAgLy8gIzEKLSAgICBhdXRvIHVzZWRIb3Jpem9udGFsbE1hcmdpbiA9IFVzZWRIb3Jpem9u
dGFsTWFyZ2luIHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNv
bXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OwotICAgIC8vICMyCi0gICAg
YXV0byB3aWR0aCA9IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoID8gb3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMud2lkdGggOiBjb21wdXRlZFdpZHRoKGxheW91dEJveCwgaG9yaXpv
bnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aCk7Ci0gICAgaWYgKCF3aWR0aCkKLSAgICAgICAg
d2lkdGggPSBzaHJpbmtUb0ZpdFdpZHRoKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
LmxvZ2ljYWxXaWR0aCk7Ci0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRM
YXlvdXQsIHN0cmVhbSA8PCAiW1dpZHRoXVtNYXJnaW5dIC0+IGZsb2F0aW5nIG5vbi1yZXBsYWNl
ZCAtPiB3aWR0aCgiIDw8ICp3aWR0aCA8PCAicHgpIG1hcmdpbigiIDw8IHVzZWRIb3Jpem9udGFs
bE1hcmdpbi5zdGFydCA8PCAicHgsICIgPDwgdXNlZEhvcml6b250YWxsTWFyZ2luLmVuZCA8PCAi
cHgpIC0+IGxheW91dEJveCgiIDw8ICZsYXlvdXRCb3ggPDwgIikiKTsKLSAgICByZXR1cm4gQ29u
dGVudFdpZHRoQW5kTWFyZ2luIHsgKndpZHRoLCB1c2VkSG9yaXpvbnRhbGxNYXJnaW4gfTsKLX0K
LQotQ29udGVudEhlaWdodEFuZE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZs
b2F0aW5nUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiBy
ZXBsYWNlZEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3Ry
YWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2Fs
VmFsdWVzKSBjb25zdAotewotICAgIEFTU0VSVChyZXBsYWNlZEJveC5pc0Zsb2F0aW5nUG9zaXRp
b25lZCgpKTsKLQotICAgIC8vIDEwLjYuMiBJbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMsIGJsb2Nr
LWxldmVsIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93LCAnaW5saW5lLWJsb2NrJwot
ICAgIC8vIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93IGFuZCBmbG9hdGluZyByZXBs
YWNlZCBlbGVtZW50cwotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91
dCwgc3RyZWFtIDw8ICJbSGVpZ2h0XVtNYXJnaW5dIC0+IGZsb2F0aW5nIHJlcGxhY2VkIC0+IHJl
ZGlyZWN0ZWQgdG8gaW5saW5lIHJlcGxhY2VkIik7Ci0gICAgcmV0dXJuIGlubGluZVJlcGxhY2Vk
Q29udGVudEhlaWdodEFuZE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
LCB7IH0sIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1h
cmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZsb2F0aW5nUmVwbGFjZWRDb250ZW50
V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jp
em9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQotewotICAgIEFT
U0VSVChyZXBsYWNlZEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKTsKLQotICAgIC8vIDEwLjMu
NiBGbG9hdGluZywgcmVwbGFjZWQgZWxlbWVudHMKLSAgICAvLwotICAgIC8vIDEuIElmICdtYXJn
aW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgYXJlIGNvbXB1dGVkIGFzICdhdXRvJywgdGhlaXIg
dXNlZCB2YWx1ZSBpcyAnMCcuCi0gICAgLy8gMi4gVGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBp
cyBkZXRlcm1pbmVkIGFzIGZvciBpbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMuCi0gICAgYXV0byBj
b21wdXRlZEhvcml6b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRIb3Jpem9udGFsTWFy
Z2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotCi0gICAgTE9HX1dJVEhf
U1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltIZWlnaHRdW01hcmdp
bl0gLT4gZmxvYXRpbmcgcmVwbGFjZWQgLT4gcmVkaXJlY3RlZCB0byBpbmxpbmUgcmVwbGFjZWQi
KTsKLSAgICBhdXRvIHVzZWRNYXJnaW4gPSBVc2VkSG9yaXpvbnRhbE1hcmdpbiB7IGNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDApLCBjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uZW5kLnZhbHVlT3IoMCkgfTsKLSAgICByZXR1cm4gaW5saW5lUmVwbGFjZWRDb250ZW50V2lk
dGhBbmRNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCB7IG92
ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoLCB1c2VkTWFyZ2luIH0pOwotfQotCi1WZXJ0
aWNhbEdlb21ldHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93VmVydGlj
YWxHZW9tZXRyeShjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZl
cnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJp
ZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNPdXRP
ZkZsb3dQb3NpdGlvbmVkKCkpOwotCi0gICAgaWYgKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgp
KQotICAgICAgICByZXR1cm4gb3V0T2ZGbG93Tm9uUmVwbGFjZWRWZXJ0aWNhbEdlb21ldHJ5KGRv
d25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB2
ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwotICAgIHJldHVy
biBvdXRPZkZsb3dSZXBsYWNlZFZlcnRpY2FsR2VvbWV0cnkoZG93bmNhc3Q8UmVwbGFjZWRCb3g+
KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgdmVydGljYWxDb25zdHJhaW50cywg
b3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKLX0KLQotSG9yaXpvbnRhbEdlb21ldHJ5IEZvcm1h
dHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93SG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0
IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxD
b25zdHJhaW50cywgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50
cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFs
VmFsdWVzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkp
OwotCi0gICAgaWYgKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQotICAgICAgICByZXR1cm4g
b3V0T2ZGbG93Tm9uUmVwbGFjZWRIb3Jpem9udGFsR2VvbWV0cnkoZG93bmNhc3Q8Q29udGFpbmVy
Qm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5Ib3Jpem9u
dGFsVmFsdWVzKTsKLSAgICByZXR1cm4gb3V0T2ZGbG93UmVwbGFjZWRIb3Jpem9udGFsR2VvbWV0
cnkoZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50
cywgdmVydGljYWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOwotfQot
Ci1Db250ZW50SGVpZ2h0QW5kTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Zmxv
YXRpbmdDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBI
b3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJp
ZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Ci17Ci0g
ICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKTsKLQotICAgIGlmICgh
bGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgcmV0dXJuIGNvbXBsaWNhdGVkQ2Fz
ZXMobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZh
bHVlcyk7Ci0gICAgcmV0dXJuIGZsb2F0aW5nUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2lu
KGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMs
IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBG
b3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZsb2F0aW5nQ29udGVudFdpZHRoQW5kTWFyZ2lu
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6
b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJy
aWRkZW5Ib3Jpem9udGFsVmFsdWVzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNGbG9hdGlu
Z1Bvc2l0aW9uZWQoKSk7Ci0KLSAgICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0g
ICAgICAgIHJldHVybiBmbG9hdGluZ05vblJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGxh
eW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVl
cyk7Ci0gICAgcmV0dXJuIGZsb2F0aW5nUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oZG93
bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgb3Zl
cnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOwotfQotCi1Db250ZW50SGVpZ2h0QW5kTWFyZ2luIEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5saW5lUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5k
TWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIE9wdGlvbmFsPFZlcnRpY2FsQ29uc3Ry
YWludHM+IHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVl
cyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAgIC8vIDEwLjYuMiBJbmxp
bmUgcmVwbGFjZWQgZWxlbWVudHMsIGJsb2NrLWxldmVsIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5v
cm1hbCBmbG93LCAnaW5saW5lLWJsb2NrJyByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxv
dyBhbmQgZmxvYXRpbmcgcmVwbGFjZWQgZWxlbWVudHMKLSAgICAvLwotICAgIC8vIDEuIElmICdt
YXJnaW4tdG9wJywgb3IgJ21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHRoZWlyIHVzZWQgdmFs
dWUgaXMgMC4KLSAgICAvLyAyLiBJZiAnaGVpZ2h0JyBhbmQgJ3dpZHRoJyBib3RoIGhhdmUgY29t
cHV0ZWQgdmFsdWVzIG9mICdhdXRvJyBhbmQgdGhlIGVsZW1lbnQgYWxzbyBoYXMgYW4gaW50cmlu
c2ljIGhlaWdodCwgdGhlbiB0aGF0IGludHJpbnNpYyBoZWlnaHQgaXMgdGhlIHVzZWQgdmFsdWUg
b2YgJ2hlaWdodCcuCi0gICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiAnaGVpZ2h0JyBoYXMgYSBjb21w
dXRlZCB2YWx1ZSBvZiAnYXV0bycsIGFuZCB0aGUgZWxlbWVudCBoYXMgYW4gaW50cmluc2ljIHJh
dGlvIHRoZW4gdGhlIHVzZWQgdmFsdWUgb2YgJ2hlaWdodCcgaXM6Ci0gICAgLy8gICAgKHVzZWQg
d2lkdGgpIC8gKGludHJpbnNpYyByYXRpbykKLSAgICAvLyA0LiBPdGhlcndpc2UsIGlmICdoZWln
aHQnIGhhcyBhIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJywgYW5kIHRoZSBlbGVtZW50IGhhcyBh
biBpbnRyaW5zaWMgaGVpZ2h0LCB0aGVuIHRoYXQgaW50cmluc2ljIGhlaWdodCBpcyB0aGUgdXNl
ZCB2YWx1ZSBvZiAnaGVpZ2h0Jy4KLSAgICAvLyA1LiBPdGhlcndpc2UsIGlmICdoZWlnaHQnIGhh
cyBhIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJywgYnV0IG5vbmUgb2YgdGhlIGNvbmRpdGlvbnMg
YWJvdmUgYXJlIG1ldCwgdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnaGVpZ2h0JyBtdXN0IGJlIHNl
dCB0bwotICAgIC8vICAgIHRoZSBoZWlnaHQgb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIHRoYXQg
aGFzIGEgMjoxIHJhdGlvLCBoYXMgYSBoZWlnaHQgbm90IGdyZWF0ZXIgdGhhbiAxNTBweCwgYW5k
IGhhcyBhIHdpZHRoIG5vdCBncmVhdGVyIHRoYW4gdGhlIGRldmljZSB3aWR0aC4KLQotICAgIC8v
ICMxCi0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4
dCgpOwotICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRl
ZFZlcnRpY2FsTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAg
IGF1dG8gdXNlZFZlcnRpY2FsTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBz
ZWRWYWx1ZXMgeyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21w
dXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKLSAgICBhdXRvJiBzdHlsZSA9
IHJlcGxhY2VkQm94LnN0eWxlKCk7Ci0KLSAgICBhdXRvIGhlaWdodCA9IG92ZXJyaWRkZW5WZXJ0
aWNhbFZhbHVlcy5oZWlnaHQgPyBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVpZ2h0LnZhbHVl
KCkgOiBjb21wdXRlZEhlaWdodChyZXBsYWNlZEJveCwgdmVydGljYWxDb25zdHJhaW50cyA/IHZl
cnRpY2FsQ29uc3RyYWludHMtPmxvZ2ljYWxIZWlnaHQgOiBXVEY6Om51bGxvcHQpOwotICAgIGF1
dG8gaGVpZ2h0SXNBdXRvID0gIW92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQgJiYgaXNI
ZWlnaHRBdXRvKHJlcGxhY2VkQm94KTsKLSAgICBhdXRvIHdpZHRoSXNBdXRvID0gc3R5bGUubG9n
aWNhbFdpZHRoKCkuaXNBdXRvKCk7Ci0KLSAgICBpZiAoaGVpZ2h0SXNBdXRvICYmIHdpZHRoSXNB
dXRvICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY0hlaWdodCgpKSB7Ci0gICAgICAgIC8vICMy
Ci0gICAgICAgIGhlaWdodCA9IHJlcGxhY2VkQm94LmludHJpbnNpY0hlaWdodCgpOwotICAgIH0g
ZWxzZSBpZiAoaGVpZ2h0SXNBdXRvICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1JhdGlvKCkp
IHsKLSAgICAgICAgLy8gIzMKLSAgICAgICAgYXV0byB1c2VkV2lkdGggPSBmb3JtYXR0aW5nQ29u
dGV4dC5nZW9tZXRyeUZvckJveChyZXBsYWNlZEJveCkuY29udGVudEJveFdpZHRoKCk7Ci0gICAg
ICAgIGhlaWdodCA9IHVzZWRXaWR0aCAvIHJlcGxhY2VkQm94LmludHJpbnNpY1JhdGlvKCk7Ci0g
ICAgfSBlbHNlIGlmIChoZWlnaHRJc0F1dG8gJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVp
Z2h0KCkpIHsKLSAgICAgICAgLy8gIzQKLSAgICAgICAgaGVpZ2h0ID0gcmVwbGFjZWRCb3guaW50
cmluc2ljSGVpZ2h0KCk7Ci0gICAgfSBlbHNlIGlmIChoZWlnaHRJc0F1dG8pIHsKLSAgICAgICAg
Ly8gIzUKLSAgICAgICAgaGVpZ2h0ID0geyAxNTAgfTsKLSAgICB9Ci0KLSAgICBBU1NFUlQoaGVp
Z2h0KTsKLQotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3Ry
ZWFtIDw8ICJbSGVpZ2h0XVtNYXJnaW5dIC0+IGluZmxvdyByZXBsYWNlZCAtPiBoZWlnaHQoIiA8
PCAqaGVpZ2h0IDw8ICJweCkgbWFyZ2luKCIgPDwgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSA8
PCAicHgsICIgPDwgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyIDw8ICJweCkgLT4gbGF5b3V0Qm94
KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIHsgKmhlaWdodCwgdXNlZFZl
cnRpY2FsTWFyZ2luIH07Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6OmlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0
IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBo
b3Jpem9udGFsQ29uc3RyYWludHMsIE9wdGlvbmFsPFZlcnRpY2FsQ29uc3RyYWludHM+IHZlcnRp
Y2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJiBvdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcykKLXsKLSAgICAvLyAxMC4zLjIgSW5saW5lLCByZXBsYWNlZCBl
bGVtZW50cwotICAgIC8vCi0gICAgLy8gQSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycgZm9yICdt
YXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgYmVjb21lcyBhIHVzZWQgdmFsdWUgb2YgJzAn
LgotICAgIC8vCi0gICAgLy8gMS4gSWYgJ2hlaWdodCcgYW5kICd3aWR0aCcgYm90aCBoYXZlIGNv
bXB1dGVkIHZhbHVlcyBvZiAnYXV0bycgYW5kIHRoZSBlbGVtZW50IGFsc28gaGFzIGFuIGludHJp
bnNpYyB3aWR0aCwgdGhlbiB0aGF0IGludHJpbnNpYyB3aWR0aCBpcyB0aGUgdXNlZCB2YWx1ZSBv
ZiAnd2lkdGgnLgotICAgIC8vCi0gICAgLy8gMi4gSWYgJ2hlaWdodCcgYW5kICd3aWR0aCcgYm90
aCBoYXZlIGNvbXB1dGVkIHZhbHVlcyBvZiAnYXV0bycgYW5kIHRoZSBlbGVtZW50IGhhcyBubyBp
bnRyaW5zaWMgd2lkdGgsIGJ1dCBkb2VzIGhhdmUgYW4gaW50cmluc2ljIGhlaWdodCBhbmQgaW50
cmluc2ljIHJhdGlvOwotICAgIC8vICAgIG9yIGlmICd3aWR0aCcgaGFzIGEgY29tcHV0ZWQgdmFs
dWUgb2YgJ2F1dG8nLCAnaGVpZ2h0JyBoYXMgc29tZSBvdGhlciBjb21wdXRlZCB2YWx1ZSwgYW5k
IHRoZSBlbGVtZW50IGRvZXMgaGF2ZSBhbiBpbnRyaW5zaWMgcmF0aW87Ci0gICAgLy8gICAgdGhl
biB0aGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgnIGlzOiAodXNlZCBoZWlnaHQpICogKGludHJpbnNp
YyByYXRpbykKLSAgICAvLwotICAgIC8vIDMuIElmICdoZWlnaHQnIGFuZCAnd2lkdGgnIGJvdGgg
aGF2ZSBjb21wdXRlZCB2YWx1ZXMgb2YgJ2F1dG8nIGFuZCB0aGUgZWxlbWVudCBoYXMgYW4gaW50
cmluc2ljIHJhdGlvIGJ1dCBubyBpbnRyaW5zaWMgaGVpZ2h0IG9yIHdpZHRoLAotICAgIC8vICAg
IHRoZW4gdGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBpcyB1bmRlZmluZWQgaW4gQ1NTIDIuMi4g
SG93ZXZlciwgaXQgaXMgc3VnZ2VzdGVkIHRoYXQsIGlmIHRoZSBjb250YWluaW5nIGJsb2NrJ3Mg
d2lkdGggZG9lcyBub3QgaXRzZWxmIGRlcGVuZCBvbiB0aGUgcmVwbGFjZWQKLSAgICAvLyAgICBl
bGVtZW50J3Mgd2lkdGgsIHRoZW4gdGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBpcyBjYWxjdWxh
dGVkIGZyb20gdGhlIGNvbnN0cmFpbnQgZXF1YXRpb24gdXNlZCBmb3IgYmxvY2stbGV2ZWwsIG5v
bi1yZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdy4KLSAgICAvLwotICAgIC8vIDQuIE90
aGVyd2lzZSwgaWYgJ3dpZHRoJyBoYXMgYSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycsIGFuZCB0
aGUgZWxlbWVudCBoYXMgYW4gaW50cmluc2ljIHdpZHRoLCB0aGVuIHRoYXQgaW50cmluc2ljIHdp
ZHRoIGlzIHRoZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcuCi0gICAgLy8KLSAgICAvLyA1LiBPdGhl
cndpc2UsIGlmICd3aWR0aCcgaGFzIGEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8nLCBidXQgbm9u
ZSBvZiB0aGUgY29uZGl0aW9ucyBhYm92ZSBhcmUgbWV0LCB0aGVuIHRoZSB1c2VkIHZhbHVlIG9m
ICd3aWR0aCcgYmVjb21lcyAzMDBweC4KLSAgICAvLyAgICBJZiAzMDBweCBpcyB0b28gd2lkZSB0
byBmaXQgdGhlIGRldmljZSwgVUFzIHNob3VsZCB1c2UgdGhlIHdpZHRoIG9mIHRoZSBsYXJnZXN0
IHJlY3RhbmdsZSB0aGF0IGhhcyBhIDI6MSByYXRpbyBhbmQgZml0cyB0aGUgZGV2aWNlIGluc3Rl
YWQuCi0KLSAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21w
dXRlZEhvcml6b250YWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7
Ci0KLSAgICBhdXRvIHVzZWRNYXJnaW5TdGFydCA9IFsmXSB7Ci0gICAgICAgIGlmIChvdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcy5tYXJnaW4pCi0gICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMubWFyZ2luLT5zdGFydDsKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDBfbHUpOwotICAgIH07Ci0KLSAgICBhdXRv
IHVzZWRNYXJnaW5FbmQgPSBbJl0gewotICAgICAgICBpZiAob3ZlcnJpZGRlbkhvcml6b250YWxW
YWx1ZXMubWFyZ2luKQotICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFs
dWVzLm1hcmdpbi0+ZW5kOwotICAgICAgICByZXR1cm4gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LmVuZC52YWx1ZU9yKDBfbHUpOwotICAgIH07Ci0KLSAgICBhdXRvIHdpZHRoID0gb3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMud2lkdGggPyBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0
aCA6IGNvbXB1dGVkV2lkdGgocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dp
Y2FsV2lkdGgpOwotICAgIGF1dG8gaGVpZ2h0SXNBdXRvID0gaXNIZWlnaHRBdXRvKHJlcGxhY2Vk
Qm94KTsKLSAgICBhdXRvIGhlaWdodCA9IGNvbXB1dGVkSGVpZ2h0KHJlcGxhY2VkQm94LCB2ZXJ0
aWNhbENvbnN0cmFpbnRzID8gdmVydGljYWxDb25zdHJhaW50cy0+bG9naWNhbEhlaWdodCA6IFdU
Rjo6bnVsbG9wdCk7Ci0KLSAgICBpZiAoIXdpZHRoICYmIGhlaWdodElzQXV0byAmJiByZXBsYWNl
ZEJveC5oYXNJbnRyaW5zaWNXaWR0aCgpKSB7Ci0gICAgICAgIC8vICMxCi0gICAgICAgIHdpZHRo
ID0gcmVwbGFjZWRCb3guaW50cmluc2ljV2lkdGgoKTsKLSAgICB9IGVsc2UgaWYgKCghd2lkdGgg
JiYgaGVpZ2h0SXNBdXRvICYmICFyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNXaWR0aCgpICYmIHJl
cGxhY2VkQm94Lmhhc0ludHJpbnNpY0hlaWdodCgpICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNp
Y1JhdGlvKCkpCi0gICAgICAgIHx8ICghd2lkdGggJiYgaGVpZ2h0ICYmIHJlcGxhY2VkQm94Lmhh
c0ludHJpbnNpY1JhdGlvKCkpKSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIHdpZHRoID0gaGVp
Z2h0LnZhbHVlT3IocmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkpICogcmVwbGFjZWRC
b3guaW50cmluc2ljUmF0aW8oKTsKLSAgICB9IGVsc2UgaWYgKCF3aWR0aCAmJiBoZWlnaHRJc0F1
dG8gJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljUmF0aW8oKSAmJiAhcmVwbGFjZWRCb3guaGFz
SW50cmluc2ljV2lkdGgoKSAmJiAhcmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkpIHsK
LSAgICAgICAgLy8gIzMKLSAgICAgICAgLy8gRklYTUU6IHVuZGVmaW5lZCBidXQgc3VyZWx5IGRv
YWJsZS4KLSAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKLSAgICB9IGVsc2Ug
aWYgKCF3aWR0aCAmJiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNXaWR0aCgpKSB7Ci0gICAgICAg
IC8vICM0Ci0gICAgICAgIHdpZHRoID0gcmVwbGFjZWRCb3guaW50cmluc2ljV2lkdGgoKTsKLSAg
ICB9IGVsc2UgaWYgKCF3aWR0aCkgewotICAgICAgICAvLyAjNQotICAgICAgICB3aWR0aCA9IHsg
MzAwIH07Ci0gICAgfQotCi0gICAgQVNTRVJUKHdpZHRoKTsKLQotICAgIExPR19XSVRIX1NUUkVB
TShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbV2lkdGhdW01hcmdpbl0gLT4g
aW5mbG93IHJlcGxhY2VkIC0+IHdpZHRoKCIgPDwgKndpZHRoIDw8ICJweCkgbWFyZ2luKCIgPDwg
dXNlZE1hcmdpblN0YXJ0KCkgPDwgInB4LCAiIDw8IHVzZWRNYXJnaW5FbmQoKSA8PCAicHgpIC0+
IGxheW91dEJveCgiIDw8ICZyZXBsYWNlZEJveCA8PCAiKSIpOwotICAgIHJldHVybiB7ICp3aWR0
aCwgeyB1c2VkTWFyZ2luU3RhcnQoKSwgdXNlZE1hcmdpbkVuZCgpIH0gfTsKLX0KLQotTGF5b3V0
U2l6ZSBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd1Bvc2l0aW9uZWRQb3NpdGlv
bk9mZnNldChjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiBob3Jpem9udGFsQ29uc3RyYWludHMpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5p
c0luRmxvd1Bvc2l0aW9uZWQoKSk7Ci0KLSAgICAvLyA5LjQuMyBSZWxhdGl2ZSBwb3NpdGlvbmlu
ZwotICAgIC8vCi0gICAgLy8gVGhlICd0b3AnIGFuZCAnYm90dG9tJyBwcm9wZXJ0aWVzIG1vdmUg
cmVsYXRpdmVseSBwb3NpdGlvbmVkIGVsZW1lbnQocykgdXAgb3IgZG93biB3aXRob3V0IGNoYW5n
aW5nIHRoZWlyIHNpemUuCi0gICAgLy8gVG9wJyBtb3ZlcyB0aGUgYm94ZXMgZG93biwgYW5kICdi
b3R0b20nIG1vdmVzIHRoZW0gdXAuIFNpbmNlIGJveGVzIGFyZSBub3Qgc3BsaXQgb3Igc3RyZXRj
aGVkIGFzIGEgcmVzdWx0IG9mICd0b3AnIG9yICdib3R0b20nLCB0aGUgdXNlZCB2YWx1ZXMgYXJl
IGFsd2F5czogdG9wID0gLWJvdHRvbS4KLSAgICAvLwotICAgIC8vIDEuIElmIGJvdGggYXJlICdh
dXRvJywgdGhlaXIgdXNlZCB2YWx1ZXMgYXJlIGJvdGggJzAnLgotICAgIC8vIDIuIElmIG9uZSBv
ZiB0aGVtIGlzICdhdXRvJywgaXQgYmVjb21lcyB0aGUgbmVnYXRpdmUgb2YgdGhlIG90aGVyLgot
ICAgIC8vIDMuIElmIG5laXRoZXIgaXMgJ2F1dG8nLCAnYm90dG9tJyBpcyBpZ25vcmVkIChpLmUu
LCB0aGUgdXNlZCB2YWx1ZSBvZiAnYm90dG9tJyB3aWxsIGJlIG1pbnVzIHRoZSB2YWx1ZSBvZiAn
dG9wJykuCi0KLSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIGF1dG8g
Y29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRo
OwotCi0gICAgYXV0byB0b3AgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxUb3AoKSwgY29u
dGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgIGF1dG8gYm90dG9tID0gY29tcHV0ZWRWYWx1ZShzdHls
ZS5sb2dpY2FsQm90dG9tKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLQotICAgIGlmICghdG9w
ICYmICFib3R0b20pIHsKLSAgICAgICAgLy8gIzEKLSAgICAgICAgdG9wID0gYm90dG9tID0geyAw
IH07Ci0gICAgfSBlbHNlIGlmICghdG9wKSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIHRvcCA9
IC0qYm90dG9tOwotICAgIH0gZWxzZSBpZiAoIWJvdHRvbSkgewotICAgICAgICAvLyAjMwotICAg
ICAgICBib3R0b20gPSAtKnRvcDsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyAjNAotICAgICAg
ICBib3R0b20gPSBXVEY6Om51bGxvcHQ7Ci0gICAgfQotCi0gICAgLy8gRm9yIHJlbGF0aXZlbHkg
cG9zaXRpb25lZCBlbGVtZW50cywgJ2xlZnQnIGFuZCAncmlnaHQnIG1vdmUgdGhlIGJveChlcykg
aG9yaXpvbnRhbGx5LCB3aXRob3V0IGNoYW5naW5nIHRoZWlyIHNpemUuCi0gICAgLy8gJ0xlZnQn
IG1vdmVzIHRoZSBib3hlcyB0byB0aGUgcmlnaHQsIGFuZCAncmlnaHQnIG1vdmVzIHRoZW0gdG8g
dGhlIGxlZnQuCi0gICAgLy8gU2luY2UgYm94ZXMgYXJlIG5vdCBzcGxpdCBvciBzdHJldGNoZWQg
YXMgYSByZXN1bHQgb2YgJ2xlZnQnIG9yICdyaWdodCcsIHRoZSB1c2VkIHZhbHVlcyBhcmUgYWx3
YXlzOiBsZWZ0ID0gLXJpZ2h0LgotICAgIC8vCi0gICAgLy8gMS4gSWYgYm90aCAnbGVmdCcgYW5k
ICdyaWdodCcgYXJlICdhdXRvJyAodGhlaXIgaW5pdGlhbCB2YWx1ZXMpLCB0aGUgdXNlZCB2YWx1
ZXMgYXJlICcwJyAoaS5lLiwgdGhlIGJveGVzIHN0YXkgaW4gdGhlaXIgb3JpZ2luYWwgcG9zaXRp
b24pLgotICAgIC8vIDIuIElmICdsZWZ0JyBpcyAnYXV0bycsIGl0cyB1c2VkIHZhbHVlIGlzIG1p
bnVzIHRoZSB2YWx1ZSBvZiAncmlnaHQnIChpLmUuLCB0aGUgYm94ZXMgbW92ZSB0byB0aGUgbGVm
dCBieSB0aGUgdmFsdWUgb2YgJ3JpZ2h0JykuCi0gICAgLy8gMy4gSWYgJ3JpZ2h0JyBpcyBzcGVj
aWZpZWQgYXMgJ2F1dG8nLCBpdHMgdXNlZCB2YWx1ZSBpcyBtaW51cyB0aGUgdmFsdWUgb2YgJ2xl
ZnQnLgotICAgIC8vIDQuIElmIG5laXRoZXIgJ2xlZnQnIG5vciAncmlnaHQnIGlzICdhdXRvJywg
dGhlIHBvc2l0aW9uIGlzIG92ZXItY29uc3RyYWluZWQsIGFuZCBvbmUgb2YgdGhlbSBoYXMgdG8g
YmUgaWdub3JlZC4KLSAgICAvLyAgICBJZiB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhl
IGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicsIHRoZSB2YWx1ZSBvZiAnbGVmdCcgd2lucyBhbmQg
J3JpZ2h0JyBiZWNvbWVzIC0nbGVmdCcuCi0gICAgLy8gICAgSWYgJ2RpcmVjdGlvbicgb2YgdGhl
IGNvbnRhaW5pbmcgYmxvY2sgaXMgJ3J0bCcsICdyaWdodCcgd2lucyBhbmQgJ2xlZnQnIGlzIGln
bm9yZWQuCi0KLSAgICBhdXRvIGxlZnQgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxMZWZ0
KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLSAgICBhdXRvIHJpZ2h0ID0gY29tcHV0ZWRWYWx1
ZShzdHlsZS5sb2dpY2FsUmlnaHQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotCi0gICAgaWYg
KCFsZWZ0ICYmICFyaWdodCkgewotICAgICAgICAvLyAjMQotICAgICAgICBsZWZ0ID0gcmlnaHQg
PSB7IDAgfTsKLSAgICB9IGVsc2UgaWYgKCFsZWZ0KSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAg
IGxlZnQgPSAtKnJpZ2h0OwotICAgIH0gZWxzZSBpZiAoIXJpZ2h0KSB7Ci0gICAgICAgIC8vICMz
Ci0gICAgICAgIHJpZ2h0ID0gLSpsZWZ0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vICM0Ci0g
ICAgICAgIGF1dG8gaXNMZWZ0VG9SaWdodERpcmVjdGlvbiA9IGxheW91dEJveC5jb250YWluaW5n
QmxvY2soKS5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKLSAgICAgICAgaWYgKGlz
TGVmdFRvUmlnaHREaXJlY3Rpb24pCi0gICAgICAgICAgICByaWdodCA9IC0qbGVmdDsKLSAgICAg
ICAgZWxzZQotICAgICAgICAgICAgbGVmdCA9IFdURjo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICBB
U1NFUlQoIWJvdHRvbSB8fCAqdG9wID09IC0qYm90dG9tKTsKLSAgICBBU1NFUlQoIWxlZnQgfHwg
KmxlZnQgPT0gLSpyaWdodCk7Ci0KLSAgICBhdXRvIHRvcFBvc2l0aW9uT2Zmc2V0ID0gKnRvcDsK
LSAgICBhdXRvIGxlZnRQb3NpdGlvbk9mZnNldCA9IGxlZnQudmFsdWVPcigtKnJpZ2h0KTsKLQot
ICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJb
UG9zaXRpb25dIC0+IHBvc2l0aW9uZWQgaW5mbG93IC0+IHRvcCBvZmZzZXQoIiA8PCB0b3BQb3Np
dGlvbk9mZnNldCA8PCAicHgpIGxlZnQgb2Zmc2V0KCIgPDwgbGVmdFBvc2l0aW9uT2Zmc2V0IDw8
ICJweCkgbGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIpOwotICAgIHJldHVybiB7IGxl
ZnRQb3NpdGlvbk9mZnNldCwgdG9wUG9zaXRpb25PZmZzZXQgfTsKLX0KLQotaW5saW5lIHN0YXRp
YyBXcml0aW5nTW9kZSB1c2VkV3JpdGluZ01vZGUoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0g
ICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy13cml0aW5nLW1vZGVzLTQvI2xvZ2ljYWwt
ZGlyZWN0aW9uLWxheW91dAotICAgIC8vIEZsb3ctcmVsYXRpdmUgZGlyZWN0aW9ucyBhcmUgY2Fs
Y3VsYXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHdyaXRpbmcgbW9kZSBvZiB0aGUgY29udGFpbmlu
ZyBibG9jayBvZiB0aGUgYm94LgotICAgIC8vIEZvciBpbmxpbmUtbGV2ZWwgYm94ZXMsIHRoZSB3
cml0aW5nIG1vZGUgb2YgdGhlIHBhcmVudCBib3ggaXMgdXNlZCBpbnN0ZWFkLgotICAgIHJldHVy
biBsYXlvdXRCb3guaXNJbmxpbmVMZXZlbEJveCgpID8gbGF5b3V0Qm94LnBhcmVudCgpLnN0eWxl
KCkud3JpdGluZ01vZGUoKSA6IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5zdHlsZSgpLndy
aXRpbmdNb2RlKCk7Ci19Ci0KLUVkZ2VzIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29t
cHV0ZWRCb3JkZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgYXV0byYgc3R5
bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0Nv
bnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW0JvcmRlcl0gLT4gbGF5b3V0Qm94OiAiIDw8ICZsYXlv
dXRCb3gpOwotICAgIHJldHVybiB7Ci0gICAgICAgIHsgTGF5b3V0VW5pdChzdHlsZS5ib3JkZXJM
ZWZ0V2lkdGgoKSksIExheW91dFVuaXQoc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCgpKSB9LAotICAg
ICAgICB7IExheW91dFVuaXQoc3R5bGUuYm9yZGVyVG9wV2lkdGgoKSksIExheW91dFVuaXQoc3R5
bGUuYm9yZGVyQm90dG9tV2lkdGgoKSkgfQotICAgIH07Ci19Ci0KLU9wdGlvbmFsPEVkZ2VzPiBG
b3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkUGFkZGluZyhjb25zdCBCb3gmIGxh
eW91dEJveCwgY29uc3QgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCkgY29uc3QKLXsK
LSAgICBpZiAoIWxheW91dEJveC5pc1BhZGRpbmdBcHBsaWNhYmxlKCkpCi0gICAgICAgIHJldHVy
biBXVEY6Om51bGxvcHQ7Ci0KLSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwot
ICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJb
UGFkZGluZ10gLT4gbGF5b3V0Qm94OiAiIDw8ICZsYXlvdXRCb3gpOwotICAgIHJldHVybiBFZGdl
cyB7Ci0gICAgICAgIHsgdmFsdWVGb3JMZW5ndGgoc3R5bGUucGFkZGluZ0xlZnQoKSwgY29udGFp
bmluZ0Jsb2NrV2lkdGgpLCB2YWx1ZUZvckxlbmd0aChzdHlsZS5wYWRkaW5nUmlnaHQoKSwgY29u
dGFpbmluZ0Jsb2NrV2lkdGgpIH0sCi0gICAgICAgIHsgdmFsdWVGb3JMZW5ndGgoc3R5bGUucGFk
ZGluZ1RvcCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCksIHZhbHVlRm9yTGVuZ3RoKHN0eWxlLnBh
ZGRpbmdCb3R0b20oKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpIH0KLSAgICB9OwotfQotCi1Db21w
dXRlZEhvcml6b250YWxNYXJnaW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRl
ZEhvcml6b250YWxNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSBjb25zdAotewotICAgIGF1dG8mIHN0
eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9
IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7Ci0gICAgaWYgKGlzSG9yaXpvbnRh
bFdyaXRpbmdNb2RlKHVzZWRXcml0aW5nTW9kZShsYXlvdXRCb3gpKSkKLSAgICAgICAgcmV0dXJu
IHsgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5MZWZ0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRo
KSwgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5SaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0
aCkgfTsKLSAgICByZXR1cm4geyBjb21wdXRlZFZhbHVlKHN0eWxlLm1hcmdpblRvcCgpLCBjb250
YWluaW5nQmxvY2tXaWR0aCksIGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luQm90dG9tKCksIGNv
bnRhaW5pbmdCbG9ja1dpZHRoKSB9OwotfQotCi1Db21wdXRlZFZlcnRpY2FsTWFyZ2luIEZvcm1h
dHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihjb25zdCBCb3gm
IGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3Ry
YWludHMpIGNvbnN0Ci17Ci0gICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAg
ICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2lj
YWxXaWR0aDsKLSAgICBpZiAoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUodXNlZFdyaXRpbmdNb2Rl
KGxheW91dEJveCkpKQotICAgICAgICByZXR1cm4geyBjb21wdXRlZFZhbHVlKHN0eWxlLm1hcmdp
blRvcCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCksIGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2lu
Qm90dG9tKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSB9OwotICAgIHJldHVybiB7IGNvbXB1dGVk
VmFsdWUoc3R5bGUubWFyZ2luTGVmdCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCksIGNvbXB1dGVk
VmFsdWUoc3R5bGUubWFyZ2luUmlnaHQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpIH07Ci19Ci0K
LUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIEZvcm1hdHRpbmdD
b250ZXh0OjpHZW9tZXRyeTo6Y29uc3RyYWluQnlNaW5NYXhXaWR0aChjb25zdCBCb3gmIGxheW91
dEJveCwgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNXaWR0aCkgY29uc3QKLXsK
LSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIGF1dG8gbWluV2lkdGgg
PSBmaXhlZFZhbHVlKHN0eWxlLmxvZ2ljYWxNaW5XaWR0aCgpKTsKLSAgICBhdXRvIG1heFdpZHRo
ID0gZml4ZWRWYWx1ZShzdHlsZS5sb2dpY2FsTWF4V2lkdGgoKSk7Ci0gICAgaWYgKCFtaW5XaWR0
aCAmJiAhbWF4V2lkdGgpCi0gICAgICAgIHJldHVybiBpbnRyaW5zaWNXaWR0aDsKLQotICAgIGlm
IChtYXhXaWR0aCkgewotICAgICAgICBpbnRyaW5zaWNXaWR0aC5taW5pbXVtID0gc3RkOjptaW4o
Km1heFdpZHRoLCBpbnRyaW5zaWNXaWR0aC5taW5pbXVtKTsKLSAgICAgICAgaW50cmluc2ljV2lk
dGgubWF4aW11bSA9IHN0ZDo6bWluKCptYXhXaWR0aCwgaW50cmluc2ljV2lkdGgubWF4aW11bSk7
Ci0gICAgfQotCi0gICAgaWYgKG1pbldpZHRoKSB7Ci0gICAgICAgIGludHJpbnNpY1dpZHRoLm1p
bmltdW0gPSBzdGQ6Om1heCgqbWluV2lkdGgsIGludHJpbnNpY1dpZHRoLm1pbmltdW0pOwotICAg
ICAgICBpbnRyaW5zaWNXaWR0aC5tYXhpbXVtID0gc3RkOjptYXgoKm1pbldpZHRoLCBpbnRyaW5z
aWNXaWR0aC5tYXhpbXVtKTsKLSAgICB9Ci0KLSAgICBBU1NFUlQoaW50cmluc2ljV2lkdGgubWlu
aW11bSA8PSBpbnRyaW5zaWNXaWR0aC5tYXhpbXVtKTsKLSAgICByZXR1cm4gaW50cmluc2ljV2lk
dGg7Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpDb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRl
bnQgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb25zdHJhaW50c0Zvck91dE9mRmxvd0Nv
bnRlbnQoY29uc3QgQ29udGFpbmVyQm94JiBjb250YWluZXJCb3gpCi17Ci0gICAgYXV0byYgYm94
R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGNvbnRhaW5lckJv
eCk7Ci0gICAgcmV0dXJuIHsKLSAgICAgICAgeyBib3hHZW9tZXRyeS5wYWRkaW5nQm94TGVmdCgp
LCBib3hHZW9tZXRyeS5wYWRkaW5nQm94V2lkdGgoKSB9LAotICAgICAgICB7IGJveEdlb21ldHJ5
LnBhZGRpbmdCb3hUb3AoKSwgYm94R2VvbWV0cnkucGFkZGluZ0JveEhlaWdodCgpIH0sCi0gICAg
ICAgIGJveEdlb21ldHJ5LmNvbnRlbnRCb3hXaWR0aCgpIH07Ci19Ci0KLUZvcm1hdHRpbmdDb250
ZXh0OjpDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5Ojpjb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29uc3QgQ29udGFpbmVyQm94JiBjb250
YWluZXJCb3gsIE9wdGlvbmFsPEVzY2FwZVJlYXNvbj4gZXNjYXBlUmVhc29uKQotewotICAgIGF1
dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChjb250
YWluZXJCb3gsIGVzY2FwZVJlYXNvbik7Ci0gICAgcmV0dXJuIHsgeyBib3hHZW9tZXRyeS5jb250
ZW50Qm94TGVmdCgpLCBib3hHZW9tZXRyeS5jb250ZW50Qm94V2lkdGgoKSB9LCB7IGJveEdlb21l
dHJ5LmNvbnRlbnRCb3hUb3AoKSwgY29tcHV0ZWRIZWlnaHQoY29udGFpbmVyQm94KSB9IH07Ci19
Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1h
dHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5n
Q29udGV4dFF1aXJrcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTFiMGRj
NjMwY2EyMzk3YmFiMzg0Zjk4MDgzMDMxOTFmMmJkMGEuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdD
b250ZXh0UXVpcmtzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgot
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
LSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIK
LQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiTGF5
b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlv
dXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVz
cGFjZSBMYXlvdXQgewotCi1MYXlvdXRVbml0IEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6Omhl
aWdodFZhbHVlT2ZOZWFyZXN0Q29udGFpbmluZ0Jsb2NrV2l0aEZpeGVkSGVpZ2h0KGNvbnN0IEJv
eCYgbGF5b3V0Qm94KQotewotICAgIC8vIEluIHF1aXJrcyBtb2RlLCB3ZSBnbyBhbmQgdHJhdmVy
cyB0aGUgY29udGFpbmluZyBibG9jayBjaGFpbiB0byBmaW5kIGEgYmxvY2sgbGV2ZWwgYm94IHdp
dGggZml4ZWQgaGVpZ2h0IHZhbHVlLCBldmVuIGlmIGl0IG1lYW5zIGxlYXZpbmcKLSAgICAvLyB0
aGUgY3VycmVudCBmb3JtYXR0aW5nIGNvbnRleHQuIEZJWE1FOiBzdXJlbHkgd2UgbmVlZCB0byBk
byBzb21lIHRyaWNrcyBoZXJlIHdoZW4gYmxvY2sgZGlyZWN0aW9uIHN1cHBvcnQgaXMgYWRkZWQu
Ci0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgp
OwotICAgIGF1dG8qIGNvbnRhaW5pbmdCbG9jayA9ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2Nr
KCk7Ci0gICAgTGF5b3V0VW5pdCBib2R5QW5kRG9jdW1lbnRWZXJ0aWNhbE1hcmdpblBhZGRpbmdB
bmRCb3JkZXI7Ci0gICAgd2hpbGUgKGNvbnRhaW5pbmdCbG9jaykgewotICAgICAgICBhdXRvIGNv
bnRhaW5pbmdCbG9ja0hlaWdodCA9IGNvbnRhaW5pbmdCbG9jay0+c3R5bGUoKS5sb2dpY2FsSGVp
Z2h0KCk7Ci0gICAgICAgIGlmIChjb250YWluaW5nQmxvY2tIZWlnaHQuaXNGaXhlZCgpKQotICAg
ICAgICAgICAgcmV0dXJuIExheW91dFVuaXQoY29udGFpbmluZ0Jsb2NrSGVpZ2h0LnZhbHVlKCkg
LSBib2R5QW5kRG9jdW1lbnRWZXJ0aWNhbE1hcmdpblBhZGRpbmdBbmRCb3JkZXIpOwotCi0gICAg
ICAgIC8vIElmIHRoZSBvbmx5IGZpeGVkIHZhbHVlIGJveCB3ZSBmaW5kIGlzIHRoZSBJQ0IsIHRo
ZW4gaWdub3JlIHRoZSBib2R5IGFuZCB0aGUgZG9jdW1lbnQgKHZlcnRpY2FsKSBtYXJnaW4sIHBh
ZGRpbmcgYW5kIGJvcmRlci4gU28gbXVjaCBxdWlya2luZXNzLgotICAgICAgICAvLyAtYW5kIGl0
J3MgdG90YWxseSBpbnNhbmUgYmVjYXVzZSBub3cgd2UgZnJlZWx5IHRyYXZlbCBhY3Jvc3MgZm9y
bWF0dGluZyBjb250ZXh0IGJvdW5kYXJpZXMgYW5kIGNvbXB1dGVkIG1hcmdpbnMgYXJlIG5vbmV4
aXN0ZW50LgotICAgICAgICBpZiAoY29udGFpbmluZ0Jsb2NrLT5pc0JvZHlCb3goKSB8fCBjb250
YWluaW5nQmxvY2stPmlzRG9jdW1lbnRCb3goKSkgewotCi0gICAgICAgICAgICBhdXRvIGdlb21l
dHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnkoKTsKLSAgICAgICAgICAgIGF1dG8gaG9y
aXpvbnRhbENvbnN0cmFpbnRzID0gZ2VvbWV0cnkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50
KGNvbnRhaW5pbmdCbG9jay0+Y29udGFpbmluZ0Jsb2NrKCksIEZvcm1hdHRpbmdDb250ZXh0OjpF
c2NhcGVSZWFzb246OkZpbmRGaXhlZEhlaWdodEFuY2VzdG9yUXVpcmspLmhvcml6b250YWw7Ci0g
ICAgICAgICAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gZ2VvbWV0cnkuY29tcHV0ZWRWZXJ0aWNh
bE1hcmdpbigqY29udGFpbmluZ0Jsb2NrLCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotCi0gICAg
ICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9y
Qm94KCpjb250YWluaW5nQmxvY2ssIEZvcm1hdHRpbmdDb250ZXh0OjpFc2NhcGVSZWFzb246OkZp
bmRGaXhlZEhlaWdodEFuY2VzdG9yUXVpcmspOwotICAgICAgICAgICAgYXV0byB2ZXJ0aWNhbFBh
ZGRpbmcgPSBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKSArIGJveEdlb21ldHJ5
LnBhZGRpbmdCb3R0b20oKS52YWx1ZU9yKDApOwotICAgICAgICAgICAgYXV0byB2ZXJ0aWNhbEJv
cmRlciA9IGJveEdlb21ldHJ5LmJvcmRlclRvcCgpICsgYm94R2VvbWV0cnkuYm9yZGVyQm90dG9t
KCk7Ci0gICAgICAgICAgICBib2R5QW5kRG9jdW1lbnRWZXJ0aWNhbE1hcmdpblBhZGRpbmdBbmRC
b3JkZXIgKz0gdmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCkgKyB2ZXJ0aWNhbE1hcmdp
bi5hZnRlci52YWx1ZU9yKDApICsgdmVydGljYWxQYWRkaW5nICsgdmVydGljYWxCb3JkZXI7Ci0g
ICAgICAgIH0KLQotICAgICAgICBpZiAoaXM8SW5pdGlhbENvbnRhaW5pbmdCbG9jaz4oKmNvbnRh
aW5pbmdCbG9jaykpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY29udGFpbmluZ0Jsb2Nr
ID0gJmNvbnRhaW5pbmdCbG9jay0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgfQotICAgIC8vIElu
aXRpYWwgY29udGFpbmluZyBibG9jayBoYXMgdG8gaGF2ZSBhIGhlaWdodC4KLSAgICByZXR1cm4g
Zm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LmluaXRpYWxDb250YWlu
aW5nQmxvY2soKSwgRm9ybWF0dGluZ0NvbnRleHQ6OkVzY2FwZVJlYXNvbjo6RmluZEZpeGVkSGVp
Z2h0QW5jZXN0b3JRdWlyaykuY29udGVudEJveCgpLmhlaWdodCgpIC0gYm9keUFuZERvY3VtZW50
VmVydGljYWxNYXJnaW5QYWRkaW5nQW5kQm9yZGVyOwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1h
dHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcv
QmxvY2tGb3JtYXR0aW5nQ29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDBmNTU1ZjgxOTM4MWU3M2FmM2UxOWMwMmYzOGIwZmNmM2JkMTIwNGIuLjAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Js
b2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcAorKysgL2Rldi9udWxsCkBA
IC0xLDU2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1
ZGUgIkJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNs
dWRlICJGbG9hdGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJGbG9hdGluZ1N0YXRlLmgiCi0jaW5j
bHVkZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIKLSNpbmNsdWRlICJMYXlvdXRCb3guaCIKLSNpbmNs
dWRlICJMYXlvdXRDaGlsZEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94
LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxD
b250YWluaW5nQmxvY2suaCIKLSNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgotI2luY2x1ZGUgIkxv
Z2dpbmcuaCIKLSNpbmNsdWRlICJUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Lmgi
Ci0jaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9U
ZXh0U3RyZWFtLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewot
Ci1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCk7Ci0K
LUJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OkJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29u
dGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBm
b3JtYXR0aW5nU3RhdGUpCi0gICAgOiBGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4
dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKLXsKLX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0OjpsYXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiBpbnZhbGlkYXRpb25T
dGF0ZSwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsK
LSAgICAvLyA5LjQuMSBCbG9jayBmb3JtYXR0aW5nIGNvbnRleHRzCi0gICAgLy8gSW4gYSBibG9j
ayBmb3JtYXR0aW5nIGNvbnRleHQsIGJveGVzIGFyZSBsYWlkIG91dCBvbmUgYWZ0ZXIgdGhlIG90
aGVyLCB2ZXJ0aWNhbGx5LCBiZWdpbm5pbmcgYXQgdGhlIHRvcCBvZiBhIGNvbnRhaW5pbmcgYmxv
Y2suCi0gICAgLy8gVGhlIHZlcnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNpYmxpbmcgYm94
ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgJ21hcmdpbicgcHJvcGVydGllcy4KLSAgICAvLyBWZXJ0
aWNhbCBtYXJnaW5zIGJldHdlZW4gYWRqYWNlbnQgYmxvY2stbGV2ZWwgYm94ZXMgaW4gYSBibG9j
ayBmb3JtYXR0aW5nIGNvbnRleHQgY29sbGFwc2UuCi0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1h
dHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltTdGFydF0gLT4gYmxvY2sgZm9ybWF0dGlu
ZyBjb250ZXh0IC0+IGZvcm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKLSAgICBh
dXRvJiBmb3JtYXR0aW5nUm9vdCA9IHJvb3QoKTsKLSAgICBBU1NFUlQoZm9ybWF0dGluZ1Jvb3Qu
aGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpOwotICAgIGF1dG8mIGZsb2F0aW5nU3RhdGUgPSBm
b3JtYXR0aW5nU3RhdGUoKS5mbG9hdGluZ1N0YXRlKCk7Ci0gICAgYXV0byBmbG9hdGluZ0NvbnRl
eHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhpcywgZmxvYXRpbmdTdGF0ZSB9OwotCi0gICAgTGF5
b3V0UXVldWUgbGF5b3V0UXVldWU7Ci0gICAgZW51bSBjbGFzcyBMYXlvdXREaXJlY3Rpb24geyBD
aGlsZCwgU2libGluZyB9OwotICAgIGF1dG8gYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUgPSBbJl0g
KGNvbnN0IGF1dG8mIGxheW91dEJveCwgYXV0byBkaXJlY3Rpb24pIHsKLSAgICAgICAgaWYgKGRp
cmVjdGlvbiA9PSBMYXlvdXREaXJlY3Rpb246OkNoaWxkKSB7Ci0gICAgICAgICAgICBpZiAoIWlz
PENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgICAgICBmb3IgKGF1dG8qIGNoaWxkID0gZG93bmNhc3Q8Q29udGFpbmVyQm94Pihs
YXlvdXRCb3gpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNo
aWxkLT5uZXh0SW5GbG93T3JGbG9hdGluZ1NpYmxpbmcoKSkgewotICAgICAgICAgICAgICAgIGlm
ICghaW52YWxpZGF0aW9uU3RhdGUubmVlZHNMYXlvdXQoKmNoaWxkKSkKLSAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgbGF5b3V0UXVldWUuYXBwZW5kKGNoaWxk
KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0g
TGF5b3V0RGlyZWN0aW9uOjpTaWJsaW5nKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8qIG5leHRT
aWJsaW5nID0gbGF5b3V0Qm94Lm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpOyBuZXh0U2li
bGluZzsgbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy0+bmV4dEluRmxvd09yRmxvYXRpbmdTaWJs
aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWludmFsaWRhdGlvblN0YXRlLm5lZWRzTGF5
b3V0KCpuZXh0U2libGluZykpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICAgICAgICAgIGxheW91dFF1ZXVlLmFwcGVuZChuZXh0U2libGluZyk7Ci0gICAgICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB9OwotCi0gICAgYXV0byBjb25zdHJhaW50c0ZvckxheW91dEJveCA9IFsm
XSAoY29uc3QgYXV0byYgbGF5b3V0Qm94KSB7Ci0gICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9j
ayA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgcmV0dXJuICZjb250YWlu
aW5nQmxvY2sgPT0gJmZvcm1hdHRpbmdSb290ID8gY29uc3RyYWludHMgOiBnZW9tZXRyeSgpLmNv
bnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb250YWluaW5nQmxvY2spOwotICAgIH07Ci0KLSAg
ICAvLyBUaGlzIGlzIGEgcG9zdC1vcmRlciB0cmVlIHRyYXZlcnNhbCBsYXlvdXQuCi0gICAgLy8g
VGhlIHJvb3QgY29udGFpbmVyIGxheW91dCBpcyBkb25lIGluIHRoZSBmb3JtYXR0aW5nIGNvbnRl
eHQgaXQgbGl2ZXMgaW4sIG5vdCB0aGF0IG9uZSBpdCBjcmVhdGVzLCBzbyBsZXQncyBzdGFydCB3
aXRoIHRoZSBmaXJzdCBjaGlsZC4KLSAgICBhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShmb3JtYXR0
aW5nUm9vdCwgTGF5b3V0RGlyZWN0aW9uOjpDaGlsZCk7Ci0gICAgLy8gMS4gR28gYWxsIHRoZSB3
YXkgZG93biB0byB0aGUgbGVhZiBub2RlCi0gICAgLy8gMi4gQ29tcHV0ZSBzdGF0aWMgcG9zaXRp
b24gYW5kIHdpZHRoIGFzIHdlIHRyYXZlcnNlIGRvd24KLSAgICAvLyAzLiBBcyB3ZSBjbGltYiBi
YWNrIG9uIHRoZSB0cmVlLCBjb21wdXRlIGhlaWdodCBhbmQgZmluaWFsaXplIHBvc2l0aW9uCi0g
ICAgLy8gKEFueSBzdWJ0cmVlcyB3aXRoIG5ldyBmb3JtYXR0aW5nIGNvbnRleHRzIG5lZWQgdG8g
bGF5b3V0IHN5bmNocm9ub3VzbHkpCi0gICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5KCkp
IHsKLSAgICAgICAgLy8gVHJhdmVyc2UgZG93biBvbiB0aGUgZGVzY2VuZGFudHMgYW5kIGNvbXB1
dGUgd2lkdGgvc3RhdGljIHBvc2l0aW9uIHVudGlsIHdlIGZpbmQgYSBsZWFmIG5vZGUuCi0gICAg
ICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSAqbGF5b3V0
UXVldWUubGFzdCgpOwotICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50
cyA9IGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0KLSAgICAgICAgICAgIGNv
bXB1dGVCb3JkZXJBbmRQYWRkaW5nKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWlu
dHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICBjb21wdXRlU3RhdGljVmVydGljYWxQb3NpdGlv
bihsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLnZlcnRpY2FsKTsKLSAgICAg
ICAgICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbihmbG9hdGluZ0NvbnRleHQsIGxheW91dEJveCwg
eyBjb25zdHJhaW50cywgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMgfSk7Ci0gICAgICAgICAg
ICBjb21wdXRlU3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgY29udGFpbmluZ0Js
b2NrQ29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICBjb21wdXRlUG9zaXRpb25U
b0F2b2lkRmxvYXRzKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCB7IGNvbnN0cmFpbnRzLCBj
b250YWluaW5nQmxvY2tDb25zdHJhaW50cyB9KTsKLQotICAgICAgICAgICAgaWYgKGxheW91dEJv
eC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAo
aXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5
b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkgewotICAgICAgICAgICAgICAgICAg
ICBhdXRvJiBjb250YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7
Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJCb3guZXN0YWJsaXNoZXNJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJRkNzIGlu
aGVyaXQgZmxvYXRzIGZyb20gcGFyZW50IEZDcy4gV2UgbmVlZCBmaW5hbCB2ZXJ0aWNhbCBwb3Np
dGlvbiB0byBmaW5kIGludHJ1ZGluZyBmbG9hdHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBw
cmVjb21wdXRlVmVydGljYWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhjb250YWluZXJCb3gs
IHsgY29uc3RyYWludHMsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzIH0pOwotICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIExheW91dCB0aGUgaW5mbG93IGRl
c2NlbmRhbnRzIG9mIHRoaXMgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QuCi0gICAgICAgICAgICAg
ICAgICAgIGF1dG8gZm9ybWF0dGluZ0NvbnRleHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3Jt
YXR0aW5nQ29udGV4dChjb250YWluZXJCb3gsIGxheW91dFN0YXRlKCkpOwotICAgICAgICAgICAg
ICAgICAgICBpZiAoY29udGFpbmVyQm94LmlzVGFibGVXcmFwcGVyQm94KCkpCi0gICAgICAgICAg
ICAgICAgICAgICAgICBkb3duY2FzdDxUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
PigqZm9ybWF0dGluZ0NvbnRleHQpLnNldEhvcml6b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxv
YXRzKGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmhvcml6b250YWwpOwotICAgICAgICAgICAg
ICAgICAgICBmb3JtYXR0aW5nQ29udGV4dC0+bGF5b3V0SW5GbG93Q29udGVudChpbnZhbGlkYXRp
b25TdGF0ZSwgZ2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29udGFpbmVy
Qm94KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgaWYgKCFhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShsYXlvdXRC
b3gsIExheW91dERpcmVjdGlvbjo6Q2hpbGQpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0KLSAgICAgICAgLy8gQ2xpbWIgYmFjayBvbiB0aGUgYW5jZXN0b3JzIGFuZCBjb21w
dXRlIGhlaWdodC9maW5hbCBwb3NpdGlvbi4KLSAgICAgICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5p
c0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9ICpsYXlvdXRRdWV1ZS50
YWtlTGFzdCgpOwotICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyA9
IGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0KLSAgICAgICAgICAgIC8vIEFs
bCBpbmZsb3cgZGVzY2VuZGFudHMgKGlmIHRoZXJlIGFyZSBhbnkpIGFyZSBsYWlkIG91dCBieSBu
b3cuIExldCdzIGNvbXB1dGUgdGhlIGJveCdzIGhlaWdodCBhbmQgdmVydGljYWwgbWFyZ2luLgot
ICAgICAgICAgICAgY29tcHV0ZUhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnRhaW5pbmdC
bG9ja0NvbnN0cmFpbnRzKTsKLSAgICAgICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bv
c2l0aW9uZWQoKSkKLSAgICAgICAgICAgICAgICBmbG9hdGluZ1N0YXRlLmFwcGVuZChmbG9hdGlu
Z0NvbnRleHQudG9GbG9hdEl0ZW0obGF5b3V0Qm94KSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAg
ICAgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG5vdyB0aGF0IHdl
J3ZlIGdvdCBmaW5hbCBtYXJnaW4gdmFsdWVzIGZvciBub24tZmxvYXQgYXZvaWRlciBib3hlcy4K
LSAgICAgICAgICAgICAgICAvLyBGbG9hdCBhdm9pZGVycyBoYXZlIHByZS1jb21wdXRlZCB2ZXJ0
aWNhbCBwb3NpdGlvbnMgd2hlbiBmbG9hdHMgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICAgICAg
aWYgKCFsYXlvdXRCb3guaXNGbG9hdEF2b2lkZXIoKSB8fCBmbG9hdGluZ0NvbnRleHQuaXNFbXB0
eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMt
PmZvcm1hdHRpbmdTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRy
eSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAgICAgICAgICAg
ICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25XaXRoTWFy
Z2luKGxheW91dEJveCwgZm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRC
b3gpLCBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cy52ZXJ0aWNhbCkpOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dG8gZXN0YWJsaXNoZXNGb3JtYXR0
aW5nQ29udGV4dCA9IGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCk7IAot
ICAgICAgICAgICAgaWYgKGVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQpIHsKLSAgICAgICAg
ICAgICAgICAvLyBOb3cgdGhhdCB3ZSBjb21wdXRlZCB0aGUgYm94J3MgaGVpZ2h0LCB3ZSBjYW4g
bGF5b3V0IHRoZSBvdXQtb2YtZmxvdyBkZXNjZW5kYW50cy4KLSAgICAgICAgICAgICAgICBpZiAo
aXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5
b3V0Qm94KS5oYXNDaGlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5l
ckJveCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKLSAgICAgICAgICAgICAg
ICAgICAgTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmVyQm94
LCBsYXlvdXRTdGF0ZSgpKS0+bGF5b3V0T3V0T2ZGbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0
ZSwgZ2VvbWV0cnkoKS5jb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29udGFpbmVyQm94
KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFl
c3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0ICYmIGlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94
KSkKLSAgICAgICAgICAgICAgICBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihkb3duY2Fz
dDxDb250YWluZXJCb3g+KGxheW91dEJveCksIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmhv
cml6b250YWwpOwotCi0gICAgICAgICAgICBpZiAoYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUobGF5
b3V0Qm94LCBMYXlvdXREaXJlY3Rpb246OlNpYmxpbmcpKQotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIFBsYWNlIHRoZSBpbmZsb3cgcG9zaXRpb25lZCBj
aGlsZHJlbi4KLSAgICBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihmb3JtYXR0aW5nUm9v
dCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRp
bmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltFbmRdIC0+IGJsb2NrIGZvcm1hdHRpbmcgY29u
dGV4dCAtPiBmb3JtYXR0aW5nIHJvb3QoIiA8PCAmcm9vdCgpIDw8ICIpIik7Ci19Ci0KLUxheW91
dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdAot
ewotICAgIC8vIDEwLjYuNyAnQXV0bycgaGVpZ2h0cyBmb3IgYmxvY2sgZm9ybWF0dGluZyBjb250
ZXh0IHJvb3RzCi0KLSAgICAvLyBJZiBpdCBoYXMgYmxvY2stbGV2ZWwgY2hpbGRyZW4sIHRoZSBo
ZWlnaHQgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHRvcCBtYXJnaW4tZWRnZSBvZiB0aGUg
dG9wbW9zdCBibG9jay1sZXZlbAotICAgIC8vIGNoaWxkIGJveCBhbmQgdGhlIGJvdHRvbSBtYXJn
aW4tZWRnZSBvZiB0aGUgYm90dG9tbW9zdCBibG9jay1sZXZlbCBjaGlsZCBib3guCi0KLSAgICAv
LyBJbiBhZGRpdGlvbiwgaWYgdGhlIGVsZW1lbnQgaGFzIGFueSBmbG9hdGluZyBkZXNjZW5kYW50
cyB3aG9zZSBib3R0b20gbWFyZ2luIGVkZ2UgaXMgYmVsb3cgdGhlIGVsZW1lbnQncyBib3R0b20g
Y29udGVudCBlZGdlLAotICAgIC8vIHRoZW4gdGhlIGhlaWdodCBpcyBpbmNyZWFzZWQgdG8gaW5j
bHVkZSB0aG9zZSBlZGdlcy4gT25seSBmbG9hdHMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiB0aGlzIGJs
b2NrIGZvcm1hdHRpbmcgY29udGV4dCBhcmUgdGFrZW4KLSAgICAvLyBpbnRvIGFjY291bnQsIGUu
Zy4sIGZsb2F0cyBpbnNpZGUgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGRlc2NlbmRhbnRzIG9yIG90
aGVyIGZsb2F0cyBhcmUgbm90LgotICAgIGF1dG8gdG9wID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4g
eyB9OwotICAgIGF1dG8gYm90dG9tID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OwotICAgIGlm
IChyb290KCkuaGFzSW5GbG93Q2hpbGQoKSkgewotICAgICAgICB0b3AgPSBCb3hHZW9tZXRyeTo6
bWFyZ2luQm94UmVjdChnZW9tZXRyeUZvckJveCgqcm9vdCgpLmZpcnN0SW5GbG93Q2hpbGQoKSkp
LnRvcCgpOwotICAgICAgICBib3R0b20gPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9t
ZXRyeUZvckJveCgqcm9vdCgpLmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7Ci0gICAgfQot
Ci0gICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhpcywgZm9y
bWF0dGluZ1N0YXRlKCkuZmxvYXRpbmdTdGF0ZSgpIH07Ci0gICAgaWYgKGF1dG8gZmxvYXRUb3Ag
PSBmbG9hdGluZ0NvbnRleHQudG9wKCkpIHsKLSAgICAgICAgdG9wID0gc3RkOjptaW4oKmZsb2F0
VG9wLCB0b3AudmFsdWVPcigqZmxvYXRUb3ApKTsKLSAgICAgICAgYXV0byBmbG9hdEJvdHRvbSA9
ICpmbG9hdGluZ0NvbnRleHQuYm90dG9tKCk7Ci0gICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4KGZs
b2F0Qm90dG9tLCBib3R0b20udmFsdWVPcihmbG9hdEJvdHRvbSkpOwotICAgIH0KLSAgICByZXR1
cm4gKmJvdHRvbSAtICp0b3A7Ci19Ci0KLU9wdGlvbmFsPExheW91dFVuaXQ+IEJsb2NrRm9ybWF0
dGluZ0NvbnRleHQ6OnVzZWRBdmFpbGFibGVXaWR0aEZvckZsb2F0QXZvaWRlcihjb25zdCBGbG9h
dGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0
IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQotewotICAgIC8vIE5vcm1hbGx5IHRo
ZSBhdmFpbGFibGUgd2lkdGggZm9yIGFuIGluLWZsb3cgYmxvY2sgbGV2ZWwgYm94IGlzIHRoZSB3
aWR0aCBvZiB0aGUgY29udGFpbmluZyBibG9jaydzIGNvbnRlbnQgYm94LgotICAgIC8vIEhvd2V2
ZXIgKGFuZCBjYW4ndCBmaW5kIGl0IGFueXdoZXJlIGluIHRoZSBzcGVjKSBub24tZmxvYXRpbmcg
cG9zaXRpb25lZCBmbG9hdCBhdm9pZGVyIGJsb2NrIGxldmVsIGJveGVzIGFyZSBjb25zdHJhaW5l
ZCBieSBleGlzdGluZyBmbG9hdHMuCi0gICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0QXZvaWRl
cigpKTsKLSAgICBpZiAoZmxvYXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJu
IHsgfTsKLSAgICAvLyBGbG9hdCBjbGVhciBwdXNoZXMgdGhlIGJsb2NrIGxldmVsIGJveCBlaXRo
ZXIgYmVsb3cgdGhlIGZsb2F0cywgb3IganVzdCBvbmUgc2lkZSBiZWxvdyBidXQgdGhlIG90aGVy
IHNpZGUgY291bGQgb3ZlcmxhcC4KLSAgICAvLyBXaGF0IGl0IG1lYW5zIGlzIHRoYXQgdGhlIHVz
ZWQgYXZhaWxhYmxlIHdpZHRoIGFsd2F5cyBtYXRjaGVzIHRoZSBjb250YWluaW5nIGJsb2NrJ3Mg
Y29uc3RyYWludC4KLSAgICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKLSAgICAgICAg
cmV0dXJuIHsgfTsKLQotICAgIEFTU0VSVChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5n
Q29udGV4dCgpKTsKLSAgICAvLyBWZXJ0aWNhbCBzdGF0aWMgcG9zaXRpb24gaXMgbm90IGNvbXB1
dGVkIHlldCBmb3IgdGhpcyBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdCwgc28gbGV0J3MganVzdCBw
cmUtY29tcHV0ZSBpdCBmb3Igbm93LgotICAgIHByZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9y
Qm94QW5kQW5jZXN0b3JzKGxheW91dEJveCwgY29uc3RyYWludHNQYWlyKTsKLQotICAgIGF1dG8g
bG9naWNhbFRvcEluRm9ybWF0dGluZ0NvbnRleHRSb290Q29vcmRpbmF0ZSA9IFsmXSAoYXV0byYg
ZmxvYXRBdm9pZGVyKSB7Ci0gICAgICAgIGF1dG8gdG9wID0gQm94R2VvbWV0cnk6OmJvcmRlckJv
eFRvcChnZW9tZXRyeUZvckJveChmbG9hdEF2b2lkZXIpKTsKLSAgICAgICAgZm9yIChhdXRvKiBh
bmNlc3RvciA9ICZmbG9hdEF2b2lkZXIuY29udGFpbmluZ0Jsb2NrKCk7IGFuY2VzdG9yICE9ICZy
b290KCk7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkKLSAgICAgICAg
ICAgIHRvcCArPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94VG9wKGdlb21ldHJ5Rm9yQm94KCphbmNl
c3RvcikpOwotICAgICAgICByZXR1cm4gdG9wOwotICAgIH07Ci0KLSAgICBhdXRvIGZsb2F0Q29u
c3RyYWludHNJbkNvbnRhaW5pbmdCbG9ja0Nvb3JkaW5hdGUgPSBbJl0gKGF1dG8gZmxvYXRDb25z
dHJhaW50cykgewotICAgICAgICBpZiAoIWZsb2F0Q29uc3RyYWludHMubGVmdCAmJiAhZmxvYXRD
b25zdHJhaW50cy5yaWdodCkKLSAgICAgICAgICAgIHJldHVybiBGbG9hdGluZ0NvbnRleHQ6OkNv
bnN0cmFpbnRzIHsgfTsKLSAgICAgICAgYXV0byBvZmZzZXQgPSBMYXlvdXRTaXplIHsgfTsKLSAg
ICAgICAgZm9yIChhdXRvKiBhbmNlc3RvciA9ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7
IGFuY2VzdG9yICE9ICZyb290KCk7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxv
Y2soKSkKLSAgICAgICAgICAgIG9mZnNldCArPSB0b0xheW91dFNpemUoQm94R2VvbWV0cnk6OmJv
cmRlckJveFRvcExlZnQoZ2VvbWV0cnlGb3JCb3goKmFuY2VzdG9yKSkpOwotICAgICAgICBpZiAo
ZmxvYXRDb25zdHJhaW50cy5sZWZ0KQotICAgICAgICAgICAgZmxvYXRDb25zdHJhaW50cy5sZWZ0
ID0gUG9pbnRJbkNvbnRleHRSb290IHsgKmZsb2F0Q29uc3RyYWludHMubGVmdCAtIG9mZnNldCB9
OwotICAgICAgICBpZiAoZmxvYXRDb25zdHJhaW50cy5yaWdodCkKLSAgICAgICAgICAgIGZsb2F0
Q29uc3RyYWludHMucmlnaHQgPSBQb2ludEluQ29udGV4dFJvb3QgeyAqZmxvYXRDb25zdHJhaW50
cy5yaWdodCAtIG9mZnNldCB9OwotICAgICAgICByZXR1cm4gZmxvYXRDb25zdHJhaW50czsKLSAg
ICB9OwotCi0gICAgLy8gRklYTUU6IENoZWNrIGlmIHRoZSBub24teWV0LWNvbXB1dGVkIGhlaWdo
dCBhZmZlY3RzIHRoaXMgY29tcHV0YXRpb24gLSBhbmQgd2hldGhlciB3ZSBoYXZlIHRvIHJlc29s
dmUgaXQgYXQgYSBsYXRlciBwb2ludC4KLSAgICBhdXRvIGxvZ2ljYWxUb3AgPSBsb2dpY2FsVG9w
SW5Gb3JtYXR0aW5nQ29udGV4dFJvb3RDb29yZGluYXRlKGxheW91dEJveCk7Ci0gICAgYXV0byBj
b25zdHJhaW50cyA9IGZsb2F0Q29uc3RyYWludHNJbkNvbnRhaW5pbmdCbG9ja0Nvb3JkaW5hdGUo
ZmxvYXRpbmdDb250ZXh0LmNvbnN0cmFpbnRzKGxvZ2ljYWxUb3AsIGxvZ2ljYWxUb3ApKTsKLSAg
ICBpZiAoIWNvbnN0cmFpbnRzLmxlZnQgJiYgIWNvbnN0cmFpbnRzLnJpZ2h0KQotICAgICAgICBy
ZXR1cm4geyB9OwotICAgIC8vIFNocmluayB0aGUgYXZhaWxhYmxlIHNwYWNlIGlmIHRoZSBmbG9h
dHMgYXJlIGFjdHVhbGx5IGludHJ1ZGluZyBhdCB0aGlzIHZlcnRpY2FsIHBvc2l0aW9uLgotICAg
IGF1dG8gYXZhaWxhYmxlV2lkdGggPSBjb25zdHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhv
cml6b250YWwubG9naWNhbFdpZHRoOwotICAgIGlmIChjb25zdHJhaW50cy5sZWZ0KQotICAgICAg
ICBhdmFpbGFibGVXaWR0aCAtPSBjb25zdHJhaW50cy5sZWZ0LT54OwotICAgIGlmIChjb25zdHJh
aW50cy5yaWdodCkKLSAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3RkOjptYXgoMF9sdSwgY29u
c3RyYWludHNQYWlyLmNvbnRhaW5pbmdCbG9jay5ob3Jpem9udGFsLmxvZ2ljYWxSaWdodCgpIC0g
Y29uc3RyYWludHMucmlnaHQtPngpOwotICAgIHJldHVybiBhdmFpbGFibGVXaWR0aDsKLX0KLQot
dm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJl
bihjb25zdCBDb250YWluZXJCb3gmIGNvbnRhaW5lckJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0
cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCi17Ci0gICAgTE9HX1dJVEhfU1RSRUFNKEZv
cm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIlN0YXJ0OiBtb3ZlIGluLWZsb3cgcG9z
aXRpb25lZCBjaGlsZHJlbiAtPiBwYXJlbnQ6ICIgPDwgJmNvbnRhaW5lckJveCk7Ci0gICAgZm9y
IChhdXRvJiBjaGlsZEJveCA6IGNoaWxkcmVuT2ZUeXBlPEJveD4oY29udGFpbmVyQm94KSkgewot
ICAgICAgICBpZiAoIWNoaWxkQm94LmlzSW5GbG93UG9zaXRpb25lZCgpKQotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIGF1dG8gcG9zaXRpb25PZmZzZXQgPSBnZW9tZXRyeSgpLmluRmxv
d1Bvc2l0aW9uZWRQb3NpdGlvbk9mZnNldChjaGlsZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
KTsKLSAgICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoY2hpbGRCb3gpLm1vdmUo
cG9zaXRpb25PZmZzZXQpOwotICAgIH0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0Nv
bnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiRW5kOiBtb3ZlIGluLWZsb3cgcG9zaXRpb25lZCBjaGls
ZHJlbiAtPiBwYXJlbnQ6ICIgPDwgJmNvbnRhaW5lckJveCk7Ci19Ci0KLXZvaWQgQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dDo6Y29tcHV0ZVN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiBs
YXlvdXRCb3gsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMp
Ci17Ci0gICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRMb2dp
Y2FsVG9wKGdlb21ldHJ5KCkuc3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIHZlcnRp
Y2FsQ29uc3RyYWludHMpKTsKLX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21w
dXRlU3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBI
b3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKLXsKLSAgICBmb3Jt
YXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxMZWZ0KGdlb21l
dHJ5KCkuc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0
cmFpbnRzKSk7Ci19Ci0KLXZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6cHJlY29tcHV0ZVZl
cnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNv
bnN0IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQotewotICAgIC8vIEluIG9yZGVy
IHRvIGZpZ3VyZSBvdXQgd2hldGhlciBhIGJveCBzaG91bGQgYXZvaWQgYSBmbG9hdCwgd2UgbmVl
ZCB0byBrbm93IHRoZSBmaW5hbCBwb3NpdGlvbnMgb2YgYm90aCAoaWdub3JlIHJlbGF0aXZlIHBv
c2l0aW9uaW5nIGZvciBub3cpLgotICAgIC8vIEluIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCB0
aGUgZmluYWwgcG9zaXRpb24gZm9yIGEgbm9ybWFsIGZsb3cgYm94IGluY2x1ZGVzCi0gICAgLy8g
MS4gdGhlIHN0YXRpYyBwb3NpdGlvbiBhbmQKLSAgICAvLyAyLiB0aGUgY29ycmVzcG9uZGluZyAo
bm9uKWNvbGxhcHNlZCBtYXJnaW5zLgotICAgIC8vIE5vdyB0aGUgdmVydGljYWwgbWFyZ2lucyBh
cmUgY29tcHV0ZWQgd2hlbiBhbGwgdGhlIGRlc2NlbmRhbnRzIGFyZSBmaW5hbGl6ZWQsIGJlY2F1
c2UgdGhlIG1hcmdpbiB2YWx1ZXMgbWlnaHQgYmUgZGVwZW5kaW5nIG9uIHRoZSBoZWlnaHQgb2Yg
dGhlIGJveAotICAgIC8vIChhbmQgdGhlIGhlaWdodCBtaWdodCBiZSBiYXNlZCBvbiB0aGUgY29u
dGVudCkuCi0gICAgLy8gU28gd2hlbiB3ZSBnZXQgdG8gdGhlIHBvaW50IHdoZXJlIHdlIGludGVy
c2VjdCB0aGUgYm94IHdpdGggdGhlIGZsb2F0IHRvIGRlY2lkZSBpZiB0aGUgYm94IG5lZWRzIHRv
IG1vdmUsIHdlIGRvbid0IHlldCBoYXZlIHRoZSBmaW5hbCB2ZXJ0aWNhbCBwb3NpdGlvbi4KLSAg
ICAvLwotICAgIC8vIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCBhcyBsb25nIGFzIHdlIGRvbid0IGNy
b3NzIHRoZSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgYm91bmRhcnksIHdlIHNob3VsZCBiZSBh
YmxlIHRvIHByZS1jb21wdXRlIHRoZSBmaW5hbCB0b3AgcG9zaXRpb24uCi0gICAgLy8gRklYTUU6
IHdlIGN1cnJlbnRseSBkb24ndCBhY2NvdW50IGZvciB0aGUgImNsZWFyIiBwcm9wZXJ0eSB3aGVu
IGNvbXB1dGluZyB0aGUgZmluYWwgcG9zaXRpb24gZm9yIGFuIGFuY2VzdG9yLgotICAgIGZvciAo
YXV0byogYW5jZXN0b3IgPSAmbGF5b3V0Qm94OyBhbmNlc3RvciAmJiBhbmNlc3RvciAhPSAmcm9v
dCgpOyBhbmNlc3RvciA9ICZhbmNlc3Rvci0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAgICAg
YXV0byBjb25zdHJhaW50c0ZvckFuY2VzdG9yID0gWyZdIHsKLSAgICAgICAgICAgIGF1dG8mIGNv
bnRhaW5pbmdCbG9jayA9IGFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAg
IHJldHVybiAmY29udGFpbmluZ0Jsb2NrID09ICZyb290KCkgPyBjb25zdHJhaW50c1BhaXIuZm9y
bWF0dGluZ0NvbnRleHRSb290IDogZ2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRl
bnQoY29udGFpbmluZ0Jsb2NrKTsKLSAgICAgICAgfSgpOwotCi0gICAgICAgIGF1dG8gY29tcHV0
ZWRWZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5KCkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbigqYW5j
ZXN0b3IsIGNvbnN0cmFpbnRzRm9yQW5jZXN0b3IuaG9yaXpvbnRhbCk7Ci0gICAgICAgIGF1dG8g
dXNlZE5vbkNvbGxhcHNlZE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2Vk
VmFsdWVzIHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0
ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07Ci0gICAgICAgIGF1dG8gcHJlY29t
cHV0ZWRNYXJnaW5CZWZvcmUgPSBtYXJnaW5Db2xsYXBzZSgpLnByZWNvbXB1dGVkTWFyZ2luQmVm
b3JlKCphbmNlc3RvciwgdXNlZE5vbkNvbGxhcHNlZE1hcmdpbik7Ci0KLSAgICAgICAgYXV0byYg
Ym94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSgqYW5jZXN0b3IpOwot
ICAgICAgICBhdXRvIG5vbkNvbGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9u
Q29sbGFwc2VkVmFsdWVzIHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUubm9uQ29sbGFwc2VkVmFs
dWUsIHsgfSB9OwotICAgICAgICBhdXRvIGNvbGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1h
cmdpbjo6Q29sbGFwc2VkVmFsdWVzIHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUuY29sbGFwc2Vk
VmFsdWUsIHsgfSwgZmFsc2UgfTsKLSAgICAgICAgYXV0byB2ZXJ0aWNhbE1hcmdpbiA9IFVzZWRW
ZXJ0aWNhbE1hcmdpbiB7IG5vbkNvbGxhcHNlZFZhbHVlcywgY29sbGFwc2VkVmFsdWVzLCB7IHBy
ZWNvbXB1dGVkTWFyZ2luQmVmb3JlLnBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW5CZWZvcmUsIHsg
fSB9IH07Ci0KLSAgICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0VXNlZFZlcnRpY2FsTWFyZ2lu
KCphbmNlc3RvciwgdmVydGljYWxNYXJnaW4pOwotICAgICAgICBib3hHZW9tZXRyeS5zZXRWZXJ0
aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVyKHZl
cnRpY2FsTWFyZ2luKSB9KTsKLSAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcCh2ZXJ0
aWNhbFBvc2l0aW9uV2l0aE1hcmdpbigqYW5jZXN0b3IsIHZlcnRpY2FsTWFyZ2luLCBjb25zdHJh
aW50c0ZvckFuY2VzdG9yLnZlcnRpY2FsKSk7Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICAgICAg
c2V0UHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoKmFuY2VzdG9yLCBwcmVjb21wdXRlZE1hcmdpbkJl
Zm9yZSk7Ci0gICAgICAgIGJveEdlb21ldHJ5LnNldEhhc1ByZWNvbXB1dGVkTWFyZ2luQmVmb3Jl
KCk7Ci0jZW5kaWYKLSAgICB9Ci19Ci0KLXZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29t
cHV0ZVBvc2l0aW9uVG9Bdm9pZEZsb2F0cyhjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0aW5n
Q29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYgY29u
c3RyYWludHNQYWlyKQotewotICAgIGlmICghbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkpCi0g
ICAgICAgIHJldHVybjsKLSAgICAvLyBJbiBvcmRlciB0byBwb3NpdGlvbiBhIGZsb2F0IGF2b2lk
ZXIgd2UgbmVlZCB0byBrbm93IGl0cyB2ZXJ0aWNhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byBpdHMg
Zm9ybWF0dGluZyBjb250ZXh0IHJvb3QgKGFuZCBub3QganVzdCBpdHMgY29udGFpbmluZyBibG9j
ayksCi0gICAgLy8gYmVjYXVzZSBhbGwgdGhlIGFscmVhZHktcGxhY2VkIGZsb2F0cyAoZmxvYXRz
IHRoYXQgd2UgYXJlIHRyeWluZyB0byBhdm9pZCBoZXJlKSBpbiB0aGlzIEJGQyBtaWdodCBiZWxv
bmcKLSAgICAvLyB0byBhIGRpZmZlcmVudCBzZXQgb2YgY29udGFpbmluZyBibG9ja3MgKGJ1dCB0
aGV5IGFsbCBkZXNjZW5kYW50cyBvZiB0aGUgQkZDIHJvb3QpLgotICAgIC8vIEhvd2V2ZXIgYWNj
b3JkaW5nIHRvIHRoZSBCRkMgcnVsZXMsIGF0IHRoaXMgcG9pbnQgb2YgdGhlIGxheW91dCBmbG93
IHdlIGRvbid0IHlldCBoYXZlIGNvbXB1dGVkIHZlcnRpY2FsIHBvc2l0aW9ucyBmb3IgdGhlIGFu
Y2VzdG9ycy4KLSAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpIHsKLSAg
ICAgICAgcHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMobGF5b3V0
Qm94LCBjb25zdHJhaW50c1BhaXIpOwotICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9t
ZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nQ29udGV4dC5wb3NpdGlv
bkZvckZsb2F0KGxheW91dEJveCwgY29uc3RyYWludHNQYWlyLmNvbnRhaW5pbmdCbG9jay5ob3Jp
em9udGFsKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gTm9uLWZsb2F0IHBvc2l0
aW9uZWQgZmxvYXQgYXZvaWRlcnMgKGZvcm1hdHRpbmcgY29udGV4dCByb290cyBhbmQgY2xlYXIg
Ym94ZXMpIHNob3VsZCBiZSBmaW5lIHVubGVzcyB0aGVyZSBhcmUgZmxvYXRzIGluIHRoaXMgY29u
dGV4dC4KLSAgICBpZiAoZmxvYXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJu
OwotICAgIHByZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGxheW91
dEJveCwgY29uc3RyYWludHNQYWlyKTsKLSAgICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIo
KSkKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihm
bG9hdGluZ0NvbnRleHQsIGxheW91dEJveCk7Ci0KLSAgICBBU1NFUlQobGF5b3V0Qm94LmVzdGFi
bGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7Ci0gICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2Vv
bWV0cnkobGF5b3V0Qm94KS5zZXRMb2dpY2FsVG9wTGVmdChmbG9hdGluZ0NvbnRleHQucG9zaXRp
b25Gb3JOb25GbG9hdGluZ0Zsb2F0QXZvaWRlcihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzUGFpci5j
b250YWluaW5nQmxvY2suaG9yaXpvbnRhbCkpOwotfQotCi12b2lkIEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6OmNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihjb25zdCBGbG9hdGlu
Z0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAg
QVNTRVJUKGxheW91dEJveC5oYXNGbG9hdENsZWFyKCkpOwotICAgIGlmIChmbG9hdGluZ0NvbnRl
eHQuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgYXV0byB2ZXJ0aWNhbFBvc2l0aW9u
QW5kQ2xlYXJhbmNlID0gZmxvYXRpbmdDb250ZXh0LnZlcnRpY2FsUG9zaXRpb25XaXRoQ2xlYXJh
bmNlKGxheW91dEJveCk7Ci0gICAgaWYgKCF2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJhbmNlKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0
ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgQVNTRVJUKHZlcnRpY2FsUG9zaXRpb25B
bmRDbGVhcmFuY2UtPnBvc2l0aW9uID49IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hUb3AoYm94R2Vv
bWV0cnkpKTsKLSAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25B
bmRDbGVhcmFuY2UtPnBvc2l0aW9uKTsKLSAgICBpZiAodmVydGljYWxQb3NpdGlvbkFuZENsZWFy
YW5jZS0+Y2xlYXJhbmNlKQotICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRIYXNDbGVhcmFu
Y2UobGF5b3V0Qm94KTsKLSAgICAvLyBGSVhNRTogUmVzZXQgdGhlIG1hcmdpbiB2YWx1ZXMgb24g
dGhlIGFuY2VzdG9ycy9wcmV2aW91cyBzaWJsaW5ncyBub3cgdGhhdCB0aGUgZmxvYXQgYXZvaWRl
ciB3aXRoIGNsZWFyYW5jZSBkb2VzIG5vdCBtYXJnaW4gY29sbGFwc2UgYW55bW9yZS4KLX0KLQot
dm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3Qg
RmxvYXRpbmdDb250ZXh0JiBmbG9hdGluZ0NvbnRleHQsIGNvbnN0IEJveCYgbGF5b3V0Qm94LCBj
b25zdCBDb25zdHJhaW50c1BhaXImIGNvbnN0cmFpbnRzUGFpcikKLXsKLSAgICBhdXRvIGF2YWls
YWJsZVdpZHRoRmxvYXRBdm9pZGVyID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OwotICAgIGlm
IChsYXlvdXRCb3guaXNGbG9hdEF2b2lkZXIoKSkgewotICAgICAgICAvLyBGbG9hdCBhdm9pZGVy
cycgYXZhaWxhYmxlIHdpZHRoIG1pZ2h0IGJlIHNocnVuayBieSBleGlzdGluZyBmbG9hdHMgaW4g
dGhlIGNvbnRleHQuCi0gICAgICAgIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyID0gdXNlZEF2
YWlsYWJsZVdpZHRoRm9yRmxvYXRBdm9pZGVyKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCBj
b25zdHJhaW50c1BhaXIpOwotICAgIH0KLSAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9
IGdlb21ldHJ5KCkuY29tcHV0ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBjb25z
dHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250YWwsIGF2YWlsYWJsZVdpZHRoRmxv
YXRBdm9pZGVyKTsKLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJv
eEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRo
KGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOwotICAgIGJveEdlb21ldHJ5LnNl
dEhvcml6b250YWxNYXJnaW4oeyBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFy
dCwgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIH0pOwotfQotCi12b2lkIEJs
b2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBs
YXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMp
Ci17Ci0gICAgYXV0byBjb21wdXRlID0gWyZdKE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRIZWln
aHQpIC0+IENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gewotICAgICAgICBpZiAobGF5b3V0Qm94Lmlz
SW5GbG93KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbkZsb3dDb250ZW50SGVp
Z2h0QW5kTWFyZ2luKGxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwgeyB1c2VkSGVp
Z2h0IH0pOwotCi0gICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkK
LSAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmZsb2F0aW5nQ29udGVudEhlaWdodEFuZE1h
cmdpbihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIHsgdXNlZEhlaWdodCB9KTsK
LQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIHsgfTsKLSAg
ICB9OwotCi0gICAgYXV0byBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZSh7IH0pOwot
ICAgIGlmIChhdXRvIG1heEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQobGF5
b3V0Qm94KSkgewotICAgICAgICBpZiAoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVp
Z2h0ID4gKm1heEhlaWdodCkgewotICAgICAgICAgICAgYXV0byBtYXhIZWlnaHRBbmRNYXJnaW4g
PSBjb21wdXRlKG1heEhlaWdodCk7Ci0gICAgICAgICAgICAvLyBVc2VkIGhlaWdodCBzaG91bGQg
cmVtYWluIHRoZSBzYW1lLgotICAgICAgICAgICAgQVNTRVJUKChsYXlvdXRTdGF0ZSgpLmluUXVp
cmtzTW9kZSgpICYmIChsYXlvdXRCb3guaXNCb2R5Qm94KCkgfHwgbGF5b3V0Qm94LmlzRG9jdW1l
bnRCb3goKSkpIHx8IG1heEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID09ICptYXhIZWln
aHQpOwotICAgICAgICAgICAgY29udGVudEhlaWdodEFuZE1hcmdpbiA9IHsgKm1heEhlaWdodCwg
bWF4SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbiB9OwotICAgICAgICB9Ci0gICAg
fQotCi0gICAgaWYgKGF1dG8gbWluSGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbkhlaWdo
dChsYXlvdXRCb3gpKSB7Ci0gICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRl
bnRIZWlnaHQgPCAqbWluSGVpZ2h0KSB7Ci0gICAgICAgICAgICBhdXRvIG1pbkhlaWdodEFuZE1h
cmdpbiA9IGNvbXB1dGUobWluSGVpZ2h0KTsKLSAgICAgICAgICAgIC8vIFVzZWQgaGVpZ2h0IHNo
b3VsZCByZW1haW4gdGhlIHNhbWUuCi0gICAgICAgICAgICBBU1NFUlQoKGxheW91dFN0YXRlKCku
aW5RdWlya3NNb2RlKCkgJiYgKGxheW91dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNE
b2N1bWVudEJveCgpKSkgfHwgbWluSGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPT0gKm1p
bkhlaWdodCk7Ci0gICAgICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0geyAqbWluSGVp
Z2h0LCBtaW5IZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICAvLyAxLiBDb21wdXRlIGNvbGxhcHNlZCBtYXJnaW5zLgotICAgIC8vIDIu
IEFkanVzdCB2ZXJ0aWNhbCBwb3NpdGlvbiB1c2luZyB0aGUgY29sbGFwc2VkIHZhbHVlcy4KLSAg
ICAvLyAzLiBBZGp1c3QgcHJldmlvdXMgaW4tZmxvdyBzaWJsaW5nIG1hcmdpbiBhZnRlciB1c2lu
ZyB0aGlzIG1hcmdpbi4KLSAgICBhdXRvIG1hcmdpbkNvbGxhcHNlID0gdGhpcy0+bWFyZ2luQ29s
bGFwc2UoKTsKLSAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gbWFyZ2luQ29sbGFwc2UuY29sbGFw
c2VkVmVydGljYWxWYWx1ZXMobGF5b3V0Qm94LCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNv
bGxhcHNlZE1hcmdpbik7Ci0gICAgLy8gQ2FjaGUgdGhlIGNvbXB1dGVkIHBvc2l0aXZlIGFuZCBu
ZWdhdGl2ZSBtYXJnaW4gdmFsdWUgcGFpci4KLSAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRVc2Vk
VmVydGljYWxNYXJnaW4obGF5b3V0Qm94LCB2ZXJ0aWNhbE1hcmdpbik7Ci0KLSNpZiBBU1NFUlRf
RU5BQkxFRAotICAgIGlmIChoYXNQcmVjb21wdXRlZE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpICYm
IHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGxheW91dEJveCkudXNlZFZhbHVlKCkgIT0gbWFyZ2lu
QmVmb3JlKHZlcnRpY2FsTWFyZ2luKSkgewotICAgICAgICAvLyBXaGVuIHRoZSBwcmUtY29tcHV0
ZWQgbWFyZ2luIHR1cm5zIG91dCB0byBiZSBpbmNvcnJlY3QsIHdlIG5lZWQgdG8gcmUtbGF5b3V0
IHRoaXMgc3VidHJlZSB3aXRoIHRoZSBjb3JyZWN0IG1hcmdpbiB2YWx1ZXMuCi0gICAgICAgIC8v
IDxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0Ij48L2Rpdj4KLSAgICAgICAgLy8gPGRpdj4KLSAgICAg
ICAgLy8gICA8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOiAyMDBweCI+PC9kaXY+Ci0gICAgICAg
IC8vIDwvZGl2PgotICAgICAgICAvLyBUaGUgZmxvYXQgYm94IHRyaWdnZXJzIG1hcmdpbiBiZWZv
cmUgY29tcHV0YXRpb24gb24gdGhlIGFuY2VzdG9yIGNoYWluIHRvIGJlIGFibGUgdG8gaW50ZXJz
ZWN0IHdpdGggb3RoZXIgZmxvYXRzIGluIHRoZSBzYW1lIGZsb2F0aW5nIGNvbnRleHQuCi0gICAg
ICAgIC8vIEhvd2V2ZXIgaW4gc29tZSBjYXNlcyB0aGUgcGFyZW50IG1hcmdpbi10b3AgY29sbGFw
c2VzIHdpdGggc29tZSBuZXh0IHNpYmxpbmdzIChuZXBoZXdzKSBhbmQgdGhlcmUncyBubyB3YXkg
dG8gYmUgYWJsZSB0byBwcm9wZXJseQotICAgICAgICAvLyBhY2NvdW50IGZvciB0aGF0IHdpdGhv
dXQgbGF5aW5nIG91dCBldmVyeSBub2RlIGluIHRoZSBGQyAoaW4gdGhlIGV4YW1wbGUsIHRoZSBt
YXJnaW4tYm90dG9tIHB1c2hlcyBkb3duIHRoZSBmbG9hdCkuCi0gICAgICAgIEFTU0VSVF9OT1Rf
SU1QTEVNRU5URURfWUVUKCk7Ci0gICAgfQotI2VuZGlmCi0gICAgYXV0byYgYm94R2VvbWV0cnkg
PSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAgIGJveEdlb21l
dHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVp
Z2h0KTsKLSAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9yZSh2
ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsKLSAgICAvLyBB
ZGp1c3QgdGhlIHByZXZpb3VzIHNpYmxpbmcncyBtYXJnaW4gYm90dG9tIG5vdyB0aGF0IHRoaXMg
Ym94J3MgdmVydGljYWwgbWFyZ2luIGlzIGNvbXB1dGVkLgotICAgIE1hcmdpbkNvbGxhcHNlOjp1
cGRhdGVNYXJnaW5BZnRlckZvclByZXZpb3VzU2libGluZygqdGhpcywgbWFyZ2luQ29sbGFwc2Us
IGxheW91dEJveCk7Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25z
dHJhaW50cygpCi17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGlu
Z1N0YXRlKCk7Ci0gICAgQVNTRVJUKCFmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25z
dHJhaW50cygpKTsKLSAgICAvLyBWaXNpdCB0aGUgaW4tZmxvdyBkZXNjZW5kYW50cyBhbmQgY29t
cHV0ZSB0aGVpciBtaW4vbWF4IGludHJpbnNpYyB3aWR0aCBpZiBuZWVkZWQuCi0gICAgLy8gMS4g
R28gYWxsIHRoZSB3YXkgZG93biB0byB0aGUgbGVhZiBub2RlCi0gICAgLy8gMi4gQ2hlY2sgaWYg
YWN0dWFsbHkgbmVlZCB0byB2aXNpdCBhbGwgdGhlIGJveGVzIGFzIHdlIHRyYXZlcnNlIGRvd24g
KGFscmVhZHkgY29tcHV0ZWQsIGNvbnRhaW5lcidzIG1pbi9tYXggZG9lcyBub3QgZGVwZW5kIG9u
IGRlc2NlbmRhbnRzIGV0YykKLSAgICAvLyAzLiBBcyB3ZSBjbGltYiBiYWNrIG9uIHRoZSB0cmVl
LCBjb21wdXRlIG1pbi9tYXggaW50cmluc2ljIHdpZHRoCi0gICAgLy8gKEFueSBzdWJ0cmVlcyB3
aXRoIG5ldyBmb3JtYXR0aW5nIGNvbnRleHRzIG5lZWQgdG8gbGF5b3V0IHN5bmNocm9ub3VzbHkp
Ci0gICAgVmVjdG9yPGNvbnN0IEJveCo+IHF1ZXVlOwotICAgIGlmIChyb290KCkuaGFzSW5GbG93
T3JGbG9hdGluZ0NoaWxkKCkpCi0gICAgICAgIHF1ZXVlLmFwcGVuZChyb290KCkuZmlyc3RJbkZs
b3dPckZsb2F0aW5nQ2hpbGQoKSk7Ci0KLSAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNv
bnN0cmFpbnRzOwotICAgIGF1dG8gbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoID0gTGF5
b3V0VW5pdCB7IH07Ci0gICAgYXV0byBjdXJyZW50SG9yaXpvbnRhbFN0YWNraW5nV2lkdGggPSBM
YXlvdXRVbml0IHsgfTsKLSAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgewotICAgICAgICB3
aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBkZWFsIHdp
dGggZGVzY2VuZGFudCBjb250ZW50LgotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKnF1
ZXVlLmxhc3QoKTsKLSAgICAgICAgICAgIC8vIEZsb2F0IGF2b2lkZXJzIGFyZSBhbGwgZXN0YWJs
aXNoIGEgbmV3IGZvcm1hdHRpbmcgY29udGV4dC4gTm8gbmVlZCB0byBsb29rIGluc2lkZSB0aGVt
LgotICAgICAgICAgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpICYmICFsYXlvdXRC
b3guaGFzRmxvYXRDbGVhcigpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
Ly8gTm9uLWZsb2F0aW5nIGJsb2NrIGxldmVsIGJveGVzIHJlc2V0IHRoZSBjdXJyZW50IGhvcml6
b250YWwgZmxvYXQgc3RhY2tpbmcuCi0gICAgICAgICAgICAvLyBTUEVDOiBUaGlzIGlzIGEgYml0
IG9kZCBhcyBmbG9hdGluZyBwb3NpdGlvbmluZyBpcyBhIGZvcm1hdHRpbmcgY29udGV4dCBsZXZl
bCBjb25jZXB0OgotICAgICAgICAgICAgLy8gZS5nLgotICAgICAgICAgICAgLy8gPGRpdiBzdHls
ZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiAxMHB4OyI+PC9kaXY+Ci0gICAgICAgICAgICAvLyA8ZGl2
PjwvZGl2PgotICAgICAgICAgICAgLy8gPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiA0
MHB4OyI+PC9kaXY+Ci0gICAgICAgICAgICAvLyAuLi53aWxsIHByb2R1Y2UgYSBtYXggd2lkdGgg
b2YgNDBweCB3aGljaCBtYWtlcyB0aGUgZmxvYXRzIHZlcnRpY2FsbHkgc3RhY2tlZC4KLSAgICAg
ICAgICAgIC8vIFZlcnRpY2FsbHkgc3RhY2tlZCBmbG9hdHMgbWFrZXMgbWUgdGhpbmsgd2UgaGF2
ZW4ndCBtYW5hZ2VkIHRvIHByb3ZpZGUgdGhlIG1heGltdW0gcHJlZmVycmVkIHdpZHRoIGZvciB0
aGUgY29udGVudC4KLSAgICAgICAgICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9
IHN0ZDo6bWF4KGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250
YWxTdGFja2luZ1dpZHRoKTsKLSAgICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdX
aWR0aCA9IHsgfTsKLSAgICAgICAgICAgIC8vIEFscmVhZHkgaGFzIGNvbXB1dGVkIGludHJpbnNp
YyBjb25zdHJhaW50cy4KLSAgICAgICAgICAgIGlmIChmb3JtYXR0aW5nU3RhdGUuaW50cmluc2lj
V2lkdGhDb25zdHJhaW50c0ZvckJveChsYXlvdXRCb3gpKQotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgLy8gQm94IHdpdGggZml4ZWQgd2lkdGggZGVmaW5lcyB0aGVpciBkZXNj
ZW5kYW50IGNvbnRlbnQgaW50cmluc2ljIHdpZHRoLgotICAgICAgICAgICAgaWYgKGxheW91dEJv
eC5zdHlsZSgpLndpZHRoKCkuaXNGaXhlZCgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgLy8gTm9uLWZsb2F0IGF2b2lkZXIgZm9ybWF0dGluZyBjb250ZXh0IHJvb3RzIGFy
ZSBvcGFxdWUgdG8gaW50cmluc2ljIHdpZHRoIGNvbXB1dGF0aW9uLgotICAgICAgICAgICAgaWYg
KGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpCi0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAvLyBObyByZWxldmFudCBjaGlsZCBjb250ZW50LgotICAg
ICAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENv
bnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChkb3duY2FzdDxDb250
YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7Ci0gICAg
ICAgIH0KLSAgICAgICAgLy8gQ29tcHV0ZSBtaW4vbWF4IGludHJpbnNpYyB3aWR0aCBib3R0b20g
dXAgaWYgbmVlZGVkLgotICAgICAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgewotICAgICAg
ICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKnF1ZXVlLnRha2VMYXN0KCk7Ci0gICAgICAgICAgICBh
dXRvIGRlc2RlbmRhbnRDb25zdHJhaW50cyA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzRm9yQm94KGxheW91dEJveCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2RlbmRh
bnRDb25zdHJhaW50cykgewotICAgICAgICAgICAgICAgIGRlc2RlbmRhbnRDb25zdHJhaW50cyA9
IGdlb21ldHJ5KCkuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhsYXlvdXRCb3gpOwotICAgICAg
ICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9y
Qm94KGxheW91dEJveCwgKmRlc2RlbmRhbnRDb25zdHJhaW50cyk7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBjb25zdHJhaW50cy5taW5pbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMubWlu
aW11bSwgZGVzZGVuZGFudENvbnN0cmFpbnRzLT5taW5pbXVtKTsKLSAgICAgICAgICAgIGF1dG8g
d2lsbFN0YWNrSG9yaXpvbnRhbGx5ID0gbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkgJiYgIWxh
eW91dEJveC5oYXNGbG9hdENsZWFyKCk7Ci0gICAgICAgICAgICBpZiAod2lsbFN0YWNrSG9yaXpv
bnRhbGx5KQotICAgICAgICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCAr
PSBkZXNkZW5kYW50Q29uc3RyYWludHMtPm1heGltdW07Ci0gICAgICAgICAgICBlbHNlCi0gICAg
ICAgICAgICAgICAgY29uc3RyYWludHMubWF4aW11bSA9IHN0ZDo6bWF4KGNvbnN0cmFpbnRzLm1h
eGltdW0sIGRlc2RlbmRhbnRDb25zdHJhaW50cy0+bWF4aW11bSk7Ci0gICAgICAgICAgICAvLyBN
b3ZlIG92ZXIgdG8gdGhlIG5leHQgc2libGluZyBvciB0YWtlIHRoZSBuZXh0IGJveCBpbiB0aGUg
cXVldWUuCi0gICAgICAgICAgICBpZiAoYXV0byogbmV4dFNpYmxpbmcgPSBsYXlvdXRCb3gubmV4
dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBxdWV1ZS5hcHBl
bmQobmV4dFNpYmxpbmcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgfQotICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHN0
ZDo6bWF4KGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250YWxT
dGFja2luZ1dpZHRoKTsKLSAgICBjb25zdHJhaW50cy5tYXhpbXVtID0gc3RkOjptYXgoY29uc3Ry
YWludHMubWF4aW11bSwgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsKLSAgICBmb3Jt
YXR0aW5nU3RhdGUuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25zdHJhaW50cyk7Ci0g
ICAgcmV0dXJuIGNvbnN0cmFpbnRzOwotfQotCi1MYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6OnZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBj
b25zdCBVc2VkVmVydGljYWxNYXJnaW4mIHZlcnRpY2FsTWFyZ2luLCAgY29uc3QgVmVydGljYWxD
b25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cykgY29uc3QKLXsKLSAgICBBU1NFUlQoIWxh
eW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7Ci0gICAgLy8gTm93IHRoYXQgd2UndmUg
Y29tcHV0ZWQgdGhlIGZpbmFsIG1hcmdpbiBiZWZvcmUsIGxldCdzIHNoaWZ0IHRoZSBib3gncyB2
ZXJ0aWNhbCBwb3NpdGlvbiBpZiBuZWVkZWQuCi0gICAgLy8gMS4gQ2hlY2sgaWYgdGhlIGJveCBo
YXMgY2xlYXJhbmNlLiBJZiBzbywgd2UndmUgYWxyZWFkeSBwcmVjb21wdXRlZC9maW5hbGl6ZWQg
dGhlIHRvcCB2YWx1ZSBhbmQgdmVydGljYWwgbWFyZ2luIGRvZXMgbm90IGltcGFjdCBpdCBhbnlt
b3JlLgotICAgIC8vIDIuIENoZWNrIGlmIHRoZSBtYXJnaW4gYmVmb3JlIGNvbGxhcHNlcyB3aXRo
IHRoZSBwcmV2aW91cyBib3gncyBtYXJnaW4gYWZ0ZXIuIGlmIG5vdCAtPiByZXR1cm4gcHJldmlv
dXMgYm94J3MgYm90dG9tIGluY2x1ZGluZyBtYXJnaW4gYWZ0ZXIgKyBtYXJnaW5CZWZvcmUKLSAg
ICAvLyAzLiBDaGVjayBpZiB0aGUgcHJldmlvdXMgYm94J3MgbWFyZ2lucyBjb2xsYXBzZSB0aHJv
dWdoLiBJZiBub3QgLT4gcmV0dXJuIHByZXZpb3VzIGJveCcgYm90dG9tIGV4Y2x1ZGluZyBtYXJn
aW4gYWZ0ZXIgKyBtYXJnaW5CZWZvcmUgKHRoZXkgYXJlIHN1cHBvc2VkIHRvIGJlIGVxdWFsKQot
ICAgIC8vIDQuIEdvIHRvIHByZXZpb3VzIGJveCBhbmQgc3RhcnQgZnJvbSBzdGVwICMxIHVudGls
IHdlIGhpdCB0aGUgcGFyZW50IGJveC4KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGdlb21ldHJ5
Rm9yQm94KGxheW91dEJveCk7Ci0gICAgaWYgKGZvcm1hdHRpbmdTdGF0ZSgpLmhhc0NsZWFyYW5j
ZShsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChi
b3hHZW9tZXRyeSk7Ci0KLSAgICBhdXRvKiBjdXJyZW50TGF5b3V0Qm94ID0gJmxheW91dEJveDsK
LSAgICB3aGlsZSAoY3VycmVudExheW91dEJveCkgewotICAgICAgICBpZiAoIWN1cnJlbnRMYXlv
dXRCb3gtPnByZXZpb3VzSW5GbG93U2libGluZygpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9ICpjdXJyZW50TGF5b3V0Qm94LT5wcmV2
aW91c0luRmxvd1NpYmxpbmcoKTsKLSAgICAgICAgaWYgKCFtYXJnaW5Db2xsYXBzZSgpLm1hcmdp
bkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVudExh
eW91dEJveCkpIHsKLSAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9t
ZXRyeUZvckJveChwcmV2aW91c0luRmxvd1NpYmxpbmcpOwotICAgICAgICAgICAgcmV0dXJuIEJv
eEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsg
bWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgh
bWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5zQ29sbGFwc2VUaHJvdWdoKHByZXZpb3VzSW5GbG93U2li
bGluZykpIHsKLSAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9tZXRy
eUZvckJveChwcmV2aW91c0luRmxvd1NpYmxpbmcpOwotICAgICAgICAgICAgcmV0dXJuIEJveEdl
b21ldHJ5Ojpib3JkZXJCb3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsgbWFy
Z2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKTsKLSAgICAgICAgfQotICAgICAgICBjdXJyZW50TGF5
b3V0Qm94ID0gJnByZXZpb3VzSW5GbG93U2libGluZzsKLSAgICB9Ci0KLSAgICBhdXRvIGNvbnRh
aW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgPSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7
Ci0gICAgLy8gQWRqdXN0IHZlcnRpY2FsIHBvc2l0aW9uIGRlcGVuZGluZyB3aGV0aGVyIHRoaXMg
Ym94IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYWRqb2lucyB3aXRoIGl0cyBwYXJlbnQuCi0gICAg
YXV0byBkaXJlY3RseUFkam9pbnNQYXJlbnQgPSAhbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2li
bGluZygpOwotICAgIGlmIChkaXJlY3RseUFkam9pbnNQYXJlbnQpIHsKLSAgICAgICAgLy8gSWYg
dGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgb2YgYSBib3ggYXJlIGFkam9pbmluZywgdGhlbiBp
dCBpcyBwb3NzaWJsZSBmb3IgbWFyZ2lucyB0byBjb2xsYXBzZSB0aHJvdWdoIGl0LgotICAgICAg
ICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBkZXBlbmRzIG9u
IGl0cyByZWxhdGlvbnNoaXAgd2l0aCB0aGUgb3RoZXIgZWxlbWVudHMgd2hvc2UgbWFyZ2lucyBh
cmUgYmVpbmcgY29sbGFwc2VkLgotICAgICAgICBpZiAodmVydGljYWxNYXJnaW4uY29sbGFwc2Vk
VmFsdWVzLmlzQ29sbGFwc2VkVGhyb3VnaCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1l
bnQncyBtYXJnaW5zIGFyZSBjb2xsYXBzZWQgd2l0aCBpdHMgcGFyZW50J3MgdG9wIG1hcmdpbiwg
dGhlIHRvcCBib3JkZXIgZWRnZSBvZiB0aGUgYm94IGlzIGRlZmluZWQgdG8gYmUgdGhlIHNhbWUg
YXMgdGhlIHBhcmVudCdzLgotICAgICAgICAgICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2lu
QmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQotICAgICAg
ICAgICAgICAgIHJldHVybiBjb250YWluaW5nQmxvY2tDb250ZW50Qm94VG9wOwotICAgICAgICAg
ICAgLy8gT3RoZXJ3aXNlLCBlaXRoZXIgdGhlIGVsZW1lbnQncyBwYXJlbnQgaXMgbm90IHRha2lu
ZyBwYXJ0IGluIHRoZSBtYXJnaW4gY29sbGFwc2luZywgb3Igb25seSB0aGUgcGFyZW50J3MgYm90
dG9tIG1hcmdpbiBpcyBpbnZvbHZlZC4KLSAgICAgICAgICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0
aGUgZWxlbWVudCdzIHRvcCBib3JkZXIgZWRnZSBpcyB0aGUgc2FtZSBhcyBpdCB3b3VsZCBoYXZl
IGJlZW4gaWYgdGhlIGVsZW1lbnQgaGFkIGEgbm9uLXplcm8gYm90dG9tIGJvcmRlci4KLSAgICAg
ICAgICAgIGF1dG8gYmVmb3JlTWFyZ2luV2l0aEJvdHRvbUJvcmRlciA9IG1hcmdpbkNvbGxhcHNl
KCkubWFyZ2luQmVmb3JlSWdub3JpbmdDb2xsYXBzaW5nVGhyb3VnaChsYXlvdXRCb3gsIHZlcnRp
Y2FsTWFyZ2luLm5vbkNvbGxhcHNlZFZhbHVlcyk7Ci0gICAgICAgICAgICByZXR1cm4gY29udGFp
bmluZ0Jsb2NrQ29udGVudEJveFRvcCArIGJlZm9yZU1hcmdpbldpdGhCb3R0b21Cb3JkZXI7Ci0g
ICAgICAgIH0KLSAgICAgICAgLy8gTm9uLWNvbGxhcHNlZCB0aHJvdWdoIGJveCB2ZXJ0aWNhbCBw
b3NpdGlvbiBkZXBlbmRpbmcgd2hldGhlciB0aGUgbWFyZ2luIGNvbGxhcHNlcy4KLSAgICAgICAg
aWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdp
bkJlZm9yZShsYXlvdXRCb3gpKQotICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0Nv
bnRlbnRCb3hUb3A7Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hU
b3AgKyBtYXJnaW5CZWZvcmUodmVydGljYWxNYXJnaW4pOwotICAgIH0KLSAgICAvLyBBdCB0aGlz
IHBvaW50IHRoaXMgYm94IGluZGlyZWN0bHkgKHZpYSBjb2xsYXBzZWQgdGhyb3VnaCBwcmV2aW91
cyBpbi1mbG93IHNpYmxpbmdzKSBhZGpvaW5zIHRoZSBwYXJlbnQuIExldCdzIGNoZWNrIGlmIGl0
IG1hcmdpbiBjb2xsYXBzZXMgd2l0aCB0aGUgcGFyZW50LgotICAgIGF1dG8mIGNvbnRhaW5pbmdC
bG9jayA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsKLSAgICBBU1NFUlQoY29udGFpbmlu
Z0Jsb2NrLmZpcnN0SW5GbG93Q2hpbGQoKSk7Ci0gICAgQVNTRVJUKGNvbnRhaW5pbmdCbG9jay5m
aXJzdEluRmxvd0NoaWxkKCkgIT0gJmxheW91dEJveCk7Ci0gICAgaWYgKG1hcmdpbkNvbGxhcHNl
KCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZSgqY29udGFpbmlu
Z0Jsb2NrLmZpcnN0SW5GbG93Q2hpbGQoKSkpCi0gICAgICAgIHJldHVybiBjb250YWluaW5nQmxv
Y2tDb250ZW50Qm94VG9wOwotCi0gICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hU
b3AgKyBtYXJnaW5CZWZvcmUodmVydGljYWxNYXJnaW4pOwotfQotCi19Ci19Ci0KLSNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zv
cm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5n
L0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
NjNkOTk2OTNlODdjZDBiMGYxMzJlYWM3MTM2OTBlMGI3MDUyZTEyOS4uMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxv
Y2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0x
LDE5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1l
dDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZ
T1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRl
LmgiCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlIDx3dGYvSGFzaE1h
cC5oPgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewot
Ci1jbGFzcyBMYXlvdXRVbml0OwotCi1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgQm94Owot
Y2xhc3MgRmxvYXRpbmdDb250ZXh0OwotCi0vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGxh
eW91dCBsb2dpYyBmb3IgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cy4KLS8vIGh0dHBzOi8vd3d3
LnczLm9yZy9UUi9DU1MyMi92aXN1cmVuLmh0bWwjYmxvY2stZm9ybWF0dGluZwotY2xhc3MgQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dCA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dCB7Ci0gICAgV1RG
X01BS0VfSVNPX0FMTE9DQVRFRChCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KTsKLXB1YmxpYzoKLSAg
ICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0Nv
bnRleHRSb290LCBCbG9ja0Zvcm1hdHRpbmdTdGF0ZSYpOwotCi0gICAgdm9pZCBsYXlvdXRJbkZs
b3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dD
b250ZW50Jikgb3ZlcnJpZGU7Ci0gICAgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNv
bnN0IG92ZXJyaWRlOwotCi1wcm90ZWN0ZWQ6Ci0gICAgc3RydWN0IENvbnN0cmFpbnRzUGFpciB7
Ci0gICAgICAgIENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBmb3JtYXR0aW5nQ29udGV4dFJv
b3Q7Ci0gICAgICAgIENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBjb250YWluaW5nQmxvY2s7
Ci0gICAgfTsKLSAgICB2b2lkIHBsYWNlSW5GbG93UG9zaXRpb25lZENoaWxkcmVuKGNvbnN0IENv
bnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOwotCi0gICAgdm9pZCBj
b21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3QgRmxvYXRpbmdDb250ZXh0JiwgY29uc3QgQm94Jiwg
Y29uc3QgQ29uc3RyYWludHNQYWlyJik7Ci0gICAgdm9pZCBjb21wdXRlSGVpZ2h0QW5kTWFyZ2lu
KGNvbnN0IEJveCYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOwotCi0gICAg
dm9pZCBjb21wdXRlU3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGNvbnN0IEJveCYsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYpOwotICAgIHZvaWQgY29tcHV0ZVN0YXRpY1ZlcnRpY2FsUG9z
aXRpb24oY29uc3QgQm94JiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYpOwotICAgIHZvaWQg
Y29tcHV0ZVBvc2l0aW9uVG9Bdm9pZEZsb2F0cyhjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25z
dCBCb3gmLCBjb25zdCBDb25zdHJhaW50c1BhaXImKTsKLSAgICB2b2lkIGNvbXB1dGVWZXJ0aWNh
bFBvc2l0aW9uRm9yRmxvYXRDbGVhcihjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBCb3gm
KTsKLQotICAgIHZvaWQgcHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3Rv
cnMoY29uc3QgQm94JiwgY29uc3QgQ29uc3RyYWludHNQYWlyJik7Ci0KLSAgICBJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpIG92ZXJy
aWRlOwotCi0gICAgTGF5b3V0VW5pdCB2ZXJ0aWNhbFBvc2l0aW9uV2l0aE1hcmdpbihjb25zdCBC
b3gmLCBjb25zdCBVc2VkVmVydGljYWxNYXJnaW4mLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRz
JikgY29uc3Q7Ci0KLSAgICAvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgcG9zaXRpb25pbmcgYW5k
IHNpemluZyBmb3IgYm94ZXMgcGFydGljaXBhdGluZyBpbiBhIGJsb2NrIGZvcm1hdHRpbmcgY29u
dGV4dC4KLSAgICBjbGFzcyBHZW9tZXRyeSA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnkgewotICAgIHB1YmxpYzoKLSAgICAgICAgR2VvbWV0cnkoY29uc3QgQmxvY2tGb3JtYXR0
aW5nQ29udGV4dCYpOwotCi0gICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5GbG93Q29u
dGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKTsKLSAgICAgICAgQ29udGVudFdp
ZHRoQW5kTWFyZ2luIGluRmxvd0NvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVl
cyYpOwotCi0gICAgICAgIFBvaW50IHN0YXRpY1Bvc2l0aW9uKGNvbnN0IEJveCYsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmKSBjb25zdDsK
LSAgICAgICAgTGF5b3V0VW5pdCBzdGF0aWNWZXJ0aWNhbFBvc2l0aW9uKGNvbnN0IEJveCYsIGNv
bnN0IFZlcnRpY2FsQ29uc3RyYWludHMmKSBjb25zdDsKLSAgICAgICAgTGF5b3V0VW5pdCBzdGF0
aWNIb3Jpem9udGFsUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJikgY29uc3Q7Ci0KLSAgICAgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0IEJveCYpOwotCi0gICAgICAgIENvbnRlbnRXaWR0aEFu
ZE1hcmdpbiBjb21wdXRlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBI
b3Jpem9udGFsQ29uc3RyYWludHMmLCBPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVXaWR0
aEZsb2F0QXZvaWRlcik7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBDb250ZW50SGVpZ2h0QW5k
TWFyZ2luIGluRmxvd05vblJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gm
LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxW
YWx1ZXMmKTsKLSAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGluRmxvd05vblJlcGxhY2Vk
Q29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0gICAgICAgIENvbnRl
bnRXaWR0aEFuZE1hcmdpbiBpbkZsb3dSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25z
dCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJy
aWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0KLSAgICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5n
Q29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0PihGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZvcm1hdHRp
bmdDb250ZXh0KCkpOyB9Ci0gICAgfTsKLSAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeSBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlzKTsgfQotCi0gICAg
Ly8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIG1hcmdpbiBjb2xsYXBzaW5nIGZvciBibG9jayBmb3Jt
YXR0aW5nIGNvbnRleHQuCi0gICAgY2xhc3MgTWFyZ2luQ29sbGFwc2UgewotICAgIHB1YmxpYzoK
LSAgICAgICAgVXNlZFZlcnRpY2FsTWFyZ2luIGNvbGxhcHNlZFZlcnRpY2FsVmFsdWVzKGNvbnN0
IEJveCYsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsKLQotICAgICAg
ICBQcmVjb21wdXRlZE1hcmdpbkJlZm9yZSBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZShjb25zdCBC
b3gmLCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyk7Ci0gICAgICAgIExh
eW91dFVuaXQgbWFyZ2luQmVmb3JlSWdub3JpbmdDb2xsYXBzaW5nVGhyb3VnaChjb25zdCBCb3gm
LCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyk7Ci0gICAgICAgIHN0YXRp
YyB2b2lkIHVwZGF0ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nKEJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQmLCBjb25zdCBNYXJnaW5Db2xsYXBzZSYsIGNvbnN0IEJveCYpOwotCi0gICAgICAg
IGJvb2wgbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShjb25zdCBC
b3gmKSBjb25zdDsKLSAgICAgICAgYm9vbCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoRmlyc3RJ
bkZsb3dDaGlsZE1hcmdpbkJlZm9yZShjb25zdCBCb3gmKSBjb25zdDsKLSAgICAgICAgYm9vbCBt
YXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94JikgY29u
c3Q7Ci0gICAgICAgIGJvb2wgbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGlu
Z01hcmdpbkFmdGVyKGNvbnN0IEJveCYpIGNvbnN0OwotCi0gICAgICAgIGJvb2wgbWFyZ2luQWZ0
ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94JikgY29uc3Q7Ci0gICAg
ICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoTGFzdEluRmxvd0NoaWxkTWFyZ2luQWZ0
ZXIoY29uc3QgQm94JikgY29uc3Q7Ci0gICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNX
aXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OwotICAgICAgICBib29sIG1h
cmdpbkFmdGVyQ29sbGFwc2VzV2l0aE5leHRTaWJsaW5nTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYp
IGNvbnN0OwotICAgICAgICBib29sIG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxpbmdNYXJn
aW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGNvbnN0IEJveCYpIGNvbnN0OwotCi0gICAgICAgIGJvb2wg
bWFyZ2luc0NvbGxhcHNlVGhyb3VnaChjb25zdCBCb3gmKSBjb25zdDsKLQotICAgIHByaXZhdGU6
Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OwotICAgICAgICBN
YXJnaW5Db2xsYXBzZShjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Jik7Ci0KLSAgICAgICAg
ZW51bSBjbGFzcyBNYXJnaW5UeXBlIHsgQmVmb3JlLCBBZnRlciB9OwotICAgICAgICBVc2VkVmVy
dGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcG9zaXRpdmVOZWdh
dGl2ZVZhbHVlcyhjb25zdCBCb3gmLCBNYXJnaW5UeXBlKSBjb25zdDsKLSAgICAgICAgVXNlZFZl
cnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHBvc2l0aXZlTmVn
YXRpdmVNYXJnaW5CZWZvcmUoY29uc3QgQm94JiwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xs
YXBzZWRWYWx1ZXMpIGNvbnN0OwotICAgICAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZl
QW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkFmdGVyKGNvbnN0
IEJveCYsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdDsKLQot
ICAgICAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1
ZXMgcHJlY29tcHV0ZWRQb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYsIFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdDsKLSAgICAgICAgVXNl
ZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHByZWNvbXB1
dGVkUG9zaXRpdmVOZWdhdGl2ZVZhbHVlcyhjb25zdCBCb3gmKSBjb25zdDsKLQotICAgICAgICBV
c2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgY29tcHV0
ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVB
bmROZWdhdGl2ZVBhaXI6OlZhbHVlcywgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5l
Z2F0aXZlUGFpcjo6VmFsdWVzKSBjb25zdDsKLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4g
bWFyZ2luVmFsdWUoVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6
VmFsdWVzKSBjb25zdDsKLQotICAgICAgICBib29sIGhhc0NsZWFyYW5jZShjb25zdCBCb3gmKSBj
b25zdDsKLQotICAgICAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSB7IHJldHVybiBtX2Js
b2NrRm9ybWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQotICAgICAgICBjb25zdCBMYXlv
dXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2Jsb2NrRm9ybWF0dGluZ0Nv
bnRleHQubGF5b3V0U3RhdGUoKTsgfQotICAgICAgICBjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tGb3JtYXR0aW5n
Q29udGV4dDsgfQotCi0gICAgICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIG1fYmxv
Y2tGb3JtYXR0aW5nQ29udGV4dDsKLSAgICB9OwotICAgIE1hcmdpbkNvbGxhcHNlIG1hcmdpbkNv
bGxhcHNlKCkgY29uc3QgeyByZXR1cm4gTWFyZ2luQ29sbGFwc2UoKnRoaXMpOyB9Ci0KLSAgICBj
bGFzcyBRdWlya3MgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyB7Ci0gICAgcHVi
bGljOgotICAgICAgICBRdWlya3MoY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0g
ICAgICAgIGJvb2wgbmVlZHNTdHJldGNoaW5nKGNvbnN0IEJveCYpIGNvbnN0OwotICAgICAgICBM
YXlvdXRVbml0IHN0cmV0Y2hlZEluRmxvd0hlaWdodChjb25zdCBCb3gmLCBDb250ZW50SGVpZ2h0
QW5kTWFyZ2luKTsKLQotICAgICAgICBib29sIHNob3VsZElnbm9yZUNvbGxhcHNlZFF1aXJrTWFy
Z2luKGNvbnN0IEJveCYpIGNvbnN0OwotICAgICAgICBib29sIHNob3VsZENvbGxhcHNlTWFyZ2lu
QmVmb3JlV2l0aFBhcmVudE1hcmdpbkJlZm9yZShjb25zdCBCb3gmKSBjb25zdDsKLSAgICAgICAg
Ym9vbCBzaG91bGRDb2xsYXBzZU1hcmdpbkFmdGVyV2l0aFBhcmVudE1hcmdpbkFmdGVyKGNvbnN0
IEJveCYpIGNvbnN0OwotCi0gICAgICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGZv
cm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8QmxvY2tGb3JtYXR0aW5n
Q29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7
IH0KLSAgICAgICAgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBj
b25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCk7IH0KLQotICAgIH07
Ci0gICAgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzIHF1aXJrcygpIGNvbnN0IHsgcmV0
dXJuIFF1aXJrcygqdGhpcyk7IH0KLQotICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRBdmFp
bGFibGVXaWR0aEZvckZsb2F0QXZvaWRlcihjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBC
b3gmLCBjb25zdCBDb25zdHJhaW50c1BhaXImKTsKLQotICAgIGNvbnN0IEJsb2NrRm9ybWF0dGlu
Z1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxCbG9ja0Zv
cm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQot
ICAgIEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3du
Y2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdT
dGF0ZSgpKTsgfQotCi0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICB2b2lkIHNldFByZWNvbXB1dGVk
TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBQcmVjb21wdXRlZE1hcmdp
bkJlZm9yZSYgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUpIHsgbV9wcmVjb21wdXRlZE1hcmdpbkJl
Zm9yZUxpc3Quc2V0KCZsYXlvdXRCb3gsIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKTsgfQotICAg
IFByZWNvbXB1dGVkTWFyZ2luQmVmb3JlIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJv
eCYgbGF5b3V0Qm94KSBjb25zdCB7IHJldHVybiBtX3ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlTGlz
dC5nZXQoJmxheW91dEJveCk7IH0KLSAgICBib29sIGhhc1ByZWNvbXB1dGVkTWFyZ2luQmVmb3Jl
KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdCB7IHJldHVybiBtX3ByZWNvbXB1dGVkTWFyZ2lu
QmVmb3JlTGlzdC5jb250YWlucygmbGF5b3V0Qm94KTsgfQotI2VuZGlmCi1wcml2YXRlOgotICAg
IEhhc2hNYXA8Y29uc3QgQm94KiwgUHJlY29tcHV0ZWRNYXJnaW5CZWZvcmU+IG1fcHJlY29tcHV0
ZWRNYXJnaW5CZWZvcmVMaXN0OwotfTsKLQotaW5saW5lIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
Okdlb21ldHJ5OjpHZW9tZXRyeShjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBibG9ja0Zv
cm1hdHRpbmdDb250ZXh0KQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5KGJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQpCi17Ci19Ci0KLWlubGluZSBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpRdWlya3M6OlF1aXJrcyhjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBibG9ja0Zvcm1h
dHRpbmdDb250ZXh0KQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyhibG9ja0Zvcm1h
dHRpbmdDb250ZXh0KQotewotfQotCi1pbmxpbmUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFy
Z2luQ29sbGFwc2U6Ok1hcmdpbkNvbGxhcHNlKGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQm
IGJsb2NrRm9ybWF0dGluZ0NvbnRleHQpCi0gICAgOiBtX2Jsb2NrRm9ybWF0dGluZ0NvbnRleHQo
YmxvY2tGb3JtYXR0aW5nQ29udGV4dCkKLXsKLX0KLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVf
VFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCwg
aXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2Vv
bWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zv
cm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwYTFhMmI0MTZjNjdkZTVmMjQ1ZDUyYzE1ZGI2MzQzNThkY2NiNWIxLi4wMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9i
bG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorKysgL2Rl
di9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAot
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
Ci0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwot
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICog
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5o
IgotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUu
aCIKLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIklubGluZUZvcm1h
dHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAi
TGF5b3V0Q2hpbGRJdGVyYXRvci5oIgotI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKLSNpbmNs
dWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCi0jaW5jbHVkZSAiTGF5b3V0UmVw
bGFjZWRCb3guaCIKLSNpbmNsdWRlICJMb2dnaW5nLmgiCi0jaW5jbHVkZSA8d3RmL3RleHQvVGV4
dFN0cmVhbS5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQot
Q29udGVudEhlaWdodEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6
aW5GbG93Tm9uUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0
Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywg
Y29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMp
Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpICYmICFsYXlvdXRCb3guaXNSZXBs
YWNlZEJveCgpKTsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3ZlcmZsb3dWaXNpYmxlKCkpOwot
Ci0gICAgYXV0byBjb21wdXRlID0gWyZdKGNvbnN0IGF1dG8mIG92ZXJyaWRkZW5WZXJ0aWNhbFZh
bHVlcykgLT4gQ29udGVudEhlaWdodEFuZE1hcmdpbiB7Ci0KLSAgICAgICAgLy8gMTAuNi4zIEJs
b2NrLWxldmVsIG5vbi1yZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdyB3aGVuICdvdmVy
ZmxvdycgY29tcHV0ZXMgdG8gJ3Zpc2libGUnCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElmICdt
YXJnaW4tdG9wJywgb3IgJ21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHRoZWlyIHVzZWQgdmFs
dWUgaXMgMC4KLSAgICAgICAgLy8gSWYgJ2hlaWdodCcgaXMgJ2F1dG8nLCB0aGUgaGVpZ2h0IGRl
cGVuZHMgb24gd2hldGhlciB0aGUgZWxlbWVudCBoYXMgYW55IGJsb2NrLWxldmVsIGNoaWxkcmVu
IGFuZCB3aGV0aGVyIGl0IGhhcyBwYWRkaW5nIG9yIGJvcmRlcnM6Ci0gICAgICAgIC8vIFRoZSBl
bGVtZW50J3MgaGVpZ2h0IGlzIHRoZSBkaXN0YW5jZSBmcm9tIGl0cyB0b3AgY29udGVudCBlZGdl
IHRvIHRoZSBmaXJzdCBhcHBsaWNhYmxlIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vIDEu
IHRoZSBib3R0b20gZWRnZSBvZiB0aGUgbGFzdCBsaW5lIGJveCwgaWYgdGhlIGJveCBlc3RhYmxp
c2hlcyBhIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgd2l0aCBvbmUgb3IgbW9yZSBsaW5lcwot
ICAgICAgICAvLyAyLiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGJvdHRvbSAocG9zc2libHkgY29s
bGFwc2VkKSBtYXJnaW4gb2YgaXRzIGxhc3QgaW4tZmxvdyBjaGlsZCwgaWYgdGhlIGNoaWxkJ3Mg
Ym90dG9tIG1hcmdpbgotICAgICAgICAvLyAgICBkb2VzIG5vdCBjb2xsYXBzZSB3aXRoIHRoZSBl
bGVtZW50J3MgYm90dG9tIG1hcmdpbgotICAgICAgICAvLyAzLiB0aGUgYm90dG9tIGJvcmRlciBl
ZGdlIG9mIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgd2hvc2UgdG9wIG1hcmdpbiBkb2Vzbid0IGNv
bGxhcHNlIHdpdGggdGhlIGVsZW1lbnQncyBib3R0b20gbWFyZ2luCi0gICAgICAgIC8vIDQuIHpl
cm8sIG90aGVyd2lzZQotICAgICAgICAvLyBPbmx5IGNoaWxkcmVuIGluIHRoZSBub3JtYWwgZmxv
dyBhcmUgdGFrZW4gaW50byBhY2NvdW50IChpLmUuLCBmbG9hdGluZyBib3hlcyBhbmQgYWJzb2x1
dGVseSBwb3NpdGlvbmVkIGJveGVzIGFyZSBpZ25vcmVkLAotICAgICAgICAvLyBhbmQgcmVsYXRp
dmVseSBwb3NpdGlvbmVkIGJveGVzIGFyZSBjb25zaWRlcmVkIHdpdGhvdXQgdGhlaXIgb2Zmc2V0
KS4gTm90ZSB0aGF0IHRoZSBjaGlsZCBib3ggbWF5IGJlIGFuIGFub255bW91cyBibG9jayBib3gu
Ci0KLSAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21l
dHJ5Rm9yQm94KGxheW91dEJveCk7Ci0gICAgICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdp
biA9IEdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRh
bENvbnN0cmFpbnRzKTsKLSAgICAgICAgYXV0byBub25Db2xsYXBzZWRNYXJnaW4gPSBVc2VkVmVy
dGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4u
YmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigw
KSB9OyAKLSAgICAgICAgYXV0byBib3JkZXJBbmRQYWRkaW5nVG9wID0gYm94R2VvbWV0cnkuYm9y
ZGVyVG9wKCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKTsKLSAgICAgICAg
YXV0byBoZWlnaHQgPSBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVpZ2h0ID8gb3ZlcnJpZGRl
blZlcnRpY2FsVmFsdWVzLmhlaWdodC52YWx1ZSgpIDogY29tcHV0ZWRIZWlnaHQobGF5b3V0Qm94
KTsKLQotICAgICAgICBpZiAoaGVpZ2h0KQotICAgICAgICAgICAgcmV0dXJuIHsgKmhlaWdodCwg
bm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0KLSAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxh
eW91dEJveCkgfHwgIWRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dD
aGlsZCgpKQotICAgICAgICAgICAgcmV0dXJuIHsgMCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0K
LSAgICAgICAgLy8gMS4gdGhlIGJvdHRvbSBlZGdlIG9mIHRoZSBsYXN0IGxpbmUgYm94LCBpZiB0
aGUgYm94IGVzdGFibGlzaGVzIGEgaW5saW5lIGZvcm1hdHRpbmcgY29udGV4dCB3aXRoIG9uZSBv
ciBtb3JlIGxpbmVzCi0gICAgICAgIGF1dG8mIGxheW91dENvbnRhaW5lciA9IGRvd25jYXN0PENv
bnRhaW5lckJveD4obGF5b3V0Qm94KTsKLSAgICAgICAgaWYgKGxheW91dENvbnRhaW5lci5lc3Rh
Ymxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGlu
bGluZUZvcm1hdHRpbmdTdGF0ZSA9IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRJbmxpbmVGb3Jt
YXR0aW5nU3RhdGUobGF5b3V0Q29udGFpbmVyKTsKLSAgICAgICAgICAgIGF1dG8mIGxpbmVzID0g
aW5saW5lRm9ybWF0dGluZ1N0YXRlLmxpbmVzKCk7Ci0gICAgICAgICAgICAvLyBFdmVuIGVtcHR5
IGNvbnRhaW5lcnMgZ2VuZXJhdGUgb25lIGxpbmUuIAotICAgICAgICAgICAgQVNTRVJUKCFsaW5l
cy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgcmV0dXJuIHsgdG9MYXlvdXRVbml0KGxpbmVzLmxh
c3QoKS5saW5lQm94TG9naWNhbFJlY3QoKS5ib3R0b20oKSArIGlubGluZUZvcm1hdHRpbmdTdGF0
ZS5jbGVhckdhcEFmdGVyTGFzdExpbmUoKSkgLSBib3JkZXJBbmRQYWRkaW5nVG9wLCBub25Db2xs
YXBzZWRNYXJnaW4gfTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDIuIHRoZSBib3R0b20gZWRn
ZSBvZiB0aGUgYm90dG9tIChwb3NzaWJseSBjb2xsYXBzZWQpIG1hcmdpbiBvZiBpdHMgbGFzdCBp
bi1mbG93IGNoaWxkLCBpZiB0aGUgY2hpbGQncyBib3R0b20gbWFyZ2luLi4uCi0gICAgICAgIGF1
dG8mIGxhc3RJbkZsb3dDaGlsZCA9ICpsYXlvdXRDb250YWluZXIubGFzdEluRmxvd0NoaWxkKCk7
Ci0gICAgICAgIGlmICghZm9ybWF0dGluZ0NvbnRleHQoKS5tYXJnaW5Db2xsYXBzZSgpLm1hcmdp
bkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKGxhc3RJbkZsb3dDaGlsZCkpIHsK
LSAgICAgICAgICAgIGF1dG8mIGxhc3RJbkZsb3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250
ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGFzdEluRmxvd0NoaWxkKTsKLSAgICAgICAgICAgIGF1dG8g
Ym90dG9tRWRnZU9mQm90dG9tTWFyZ2luID0gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QobGFz
dEluRmxvd0JveEdlb21ldHJ5KS5ib3R0b20oKSArIGxhc3RJbkZsb3dCb3hHZW9tZXRyeS5tYXJn
aW5BZnRlcigpOwotICAgICAgICAgICAgcmV0dXJuIHsgYm90dG9tRWRnZU9mQm90dG9tTWFyZ2lu
IC0gYm9yZGVyQW5kUGFkZGluZ1RvcCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0gICAgICAgIH0K
LQotICAgICAgICAvLyAzLiB0aGUgYm90dG9tIGJvcmRlciBlZGdlIG9mIHRoZSBsYXN0IGluLWZs
b3cgY2hpbGQgd2hvc2UgdG9wIG1hcmdpbiBkb2Vzbid0IGNvbGxhcHNlIHdpdGggdGhlIGVsZW1l
bnQncyBib3R0b20gbWFyZ2luCi0gICAgICAgIGF1dG8qIGluRmxvd0NoaWxkID0gJmxhc3RJbkZs
b3dDaGlsZDsKLSAgICAgICAgd2hpbGUgKGluRmxvd0NoaWxkICYmIGZvcm1hdHRpbmdDb250ZXh0
KCkubWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2lu
QWZ0ZXIoKmluRmxvd0NoaWxkKSkKLSAgICAgICAgICAgIGluRmxvd0NoaWxkID0gaW5GbG93Q2hp
bGQtPnByZXZpb3VzSW5GbG93U2libGluZygpOwotICAgICAgICBpZiAoaW5GbG93Q2hpbGQpIHsK
LSAgICAgICAgICAgIGF1dG8mIGluRmxvd0JveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQo
KS5nZW9tZXRyeUZvckJveCgqaW5GbG93Q2hpbGQpOwotICAgICAgICAgICAgcmV0dXJuIHsgQm94
R2VvbWV0cnk6OmJvcmRlckJveFRvcChpbkZsb3dCb3hHZW9tZXRyeSkgKyBpbkZsb3dCb3hHZW9t
ZXRyeS5ib3JkZXJCb3goKS5oZWlnaHQoKSAtIGJvcmRlckFuZFBhZGRpbmdUb3AsIG5vbkNvbGxh
cHNlZE1hcmdpbiB9OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gNC4gemVybywgb3RoZXJ3aXNl
Ci0gICAgICAgIHJldHVybiB7IDAsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OwotICAgIH07Ci0KLSAg
ICAvLyAxMC42LjcgJ0F1dG8nIGhlaWdodHMgZm9yIGJsb2NrLWxldmVsIGZvcm1hdHRpbmcgY29u
dGV4dCBib3hlcy4KLSAgICBhdXRvIGlzQXV0b0hlaWdodCA9ICFvdmVycmlkZGVuVmVydGljYWxW
YWx1ZXMuaGVpZ2h0ICYmICFjb21wdXRlZEhlaWdodChsYXlvdXRCb3gpOwotICAgIGlmIChpc0F1
dG9IZWlnaHQgJiYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkgJiYg
IWxheW91dEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpKQotICAgICAg
ICByZXR1cm4gY29tcHV0ZSggT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzIHsgY29udGVudEhlaWdo
dEZvckZvcm1hdHRpbmdDb250ZXh0Um9vdChkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJv
eCkpIH0pOwotICAgIHJldHVybiBjb21wdXRlKG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci19
Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRy
eTo6aW5GbG93Tm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlv
dXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRz
LCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxW
YWx1ZXMpCi17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpKTsKLQotICAgIGF1dG8g
Y29tcHV0ZSA9IFsmXSgpIHsKLQotICAgICAgICAvLyAxMC4zLjMgQmxvY2stbGV2ZWwsIG5vbi1y
ZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdwotICAgICAgICAvLwotICAgICAgICAvLyBU
aGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIG11c3QgaG9sZCBhbW9uZyB0aGUgdXNlZCB2YWx1ZXMg
b2YgdGhlIG90aGVyIHByb3BlcnRpZXM6Ci0gICAgICAgIC8vICdtYXJnaW4tbGVmdCcgKyAnYm9y
ZGVyLWxlZnQtd2lkdGgnICsgJ3BhZGRpbmctbGVmdCcgKyAnd2lkdGgnICsgJ3BhZGRpbmctcmln
aHQnICsgJ2JvcmRlci1yaWdodC13aWR0aCcgKyAnbWFyZ2luLXJpZ2h0JyA9IHdpZHRoIG9mIGNv
bnRhaW5pbmcgYmxvY2sKLSAgICAgICAgLy8KLSAgICAgICAgLy8gMS4gSWYgJ3dpZHRoJyBpcyBu
b3QgJ2F1dG8nIGFuZCAnYm9yZGVyLWxlZnQtd2lkdGgnICsgJ3BhZGRpbmctbGVmdCcgKyAnd2lk
dGgnICsgJ3BhZGRpbmctcmlnaHQnICsgJ2JvcmRlci1yaWdodC13aWR0aCcgCi0gICAgICAgIC8v
ICAgIChwbHVzIGFueSBvZiAnbWFyZ2luLWxlZnQnIG9yICdtYXJnaW4tcmlnaHQnIHRoYXQgYXJl
IG5vdCAnYXV0bycpIGlzIGxhcmdlciB0aGFuIHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmluZyBi
bG9jaywgdGhlbgotICAgICAgICAvLyAgICBhbnkgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi1s
ZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBhcmUsIGZvciB0aGUgZm9sbG93aW5nIHJ1bGVzLCB0cmVh
dGVkIGFzIHplcm8uCi0gICAgICAgIC8vCi0gICAgICAgIC8vIDIuIElmIGFsbCBvZiB0aGUgYWJv
dmUgaGF2ZSBhIGNvbXB1dGVkIHZhbHVlIG90aGVyIHRoYW4gJ2F1dG8nLCB0aGUgdmFsdWVzIGFy
ZSBzYWlkIHRvIGJlICJvdmVyLWNvbnN0cmFpbmVkIiBhbmQgb25lIG9mIHRoZSB1c2VkIHZhbHVl
cyB3aWxsCi0gICAgICAgIC8vICAgIGhhdmUgdG8gYmUgZGlmZmVyZW50IGZyb20gaXRzIGNvbXB1
dGVkIHZhbHVlLiBJZiB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGNvbnRhaW5pbmcg
YmxvY2sgaGFzIHRoZSB2YWx1ZSAnbHRyJywgdGhlIHNwZWNpZmllZCB2YWx1ZQotICAgICAgICAv
LyAgICBvZiAnbWFyZ2luLXJpZ2h0JyBpcyBpZ25vcmVkIGFuZCB0aGUgdmFsdWUgaXMgY2FsY3Vs
YXRlZCBzbyBhcyB0byBtYWtlIHRoZSBlcXVhbGl0eSB0cnVlLiBJZiB0aGUgdmFsdWUgb2YgJ2Rp
cmVjdGlvbicgaXMgJ3J0bCcsCi0gICAgICAgIC8vICAgIHRoaXMgaGFwcGVucyB0byAnbWFyZ2lu
LWxlZnQnIGluc3RlYWQuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIDMuIElmIHRoZXJlIGlzIGV4
YWN0bHkgb25lIHZhbHVlIHNwZWNpZmllZCBhcyAnYXV0bycsIGl0cyB1c2VkIHZhbHVlIGZvbGxv
d3MgZnJvbSB0aGUgZXF1YWxpdHkuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIDQuIElmICd3aWR0
aCcgaXMgc2V0IHRvICdhdXRvJywgYW55IG90aGVyICdhdXRvJyB2YWx1ZXMgYmVjb21lICcwJyBh
bmQgJ3dpZHRoJyBmb2xsb3dzIGZyb20gdGhlIHJlc3VsdGluZyBlcXVhbGl0eS4KLSAgICAgICAg
Ly8KLSAgICAgICAgLy8gNS4gSWYgYm90aCAnbWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0
JyBhcmUgJ2F1dG8nLCB0aGVpciB1c2VkIHZhbHVlcyBhcmUgZXF1YWwuIFRoaXMgaG9yaXpvbnRh
bGx5IGNlbnRlcnMgdGhlIGVsZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoZQotICAgICAgICAvLyAg
ICBlZGdlcyBvZiB0aGUgY29udGFpbmluZyBibG9jay4KLQotICAgICAgICBhdXRvIGNvbnRhaW5p
bmdCbG9ja1dpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAgICAg
ICAgYXV0byYgY29udGFpbmluZ0Jsb2NrU3R5bGUgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2Nr
KCkuc3R5bGUoKTsKLSAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4
dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0KLSAgICAgICAgYXV0byB3aWR0aCA9IG92
ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoID8gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMud2lkdGggOiBjb21wdXRlZFdpZHRoKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrV2lkdGgp
OwotICAgICAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21w
dXRlZEhvcml6b250YWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwot
ICAgICAgICBVc2VkSG9yaXpvbnRhbE1hcmdpbiB1c2VkSG9yaXpvbnRhbE1hcmdpbjsKLSAgICAg
ICAgYXV0byBib3JkZXJMZWZ0ID0gYm94R2VvbWV0cnkuYm9yZGVyTGVmdCgpOwotICAgICAgICBh
dXRvIGJvcmRlclJpZ2h0ID0gYm94R2VvbWV0cnkuYm9yZGVyUmlnaHQoKTsKLSAgICAgICAgYXV0
byBwYWRkaW5nTGVmdCA9IGJveEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCkudmFsdWVPcigwKTsKLSAg
ICAgICAgYXV0byBwYWRkaW5nUmlnaHQgPSBib3hHZW9tZXRyeS5wYWRkaW5nUmlnaHQoKS52YWx1
ZU9yKDApOwotCi0gICAgICAgIC8vICMxCi0gICAgICAgIGlmICh3aWR0aCkgewotICAgICAgICAg
ICAgYXV0byBob3Jpem9udGFsU3BhY2VGb3JNYXJnaW4gPSBjb250YWluaW5nQmxvY2tXaWR0aCAt
IChjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSArIGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApKTsKLSAgICAgICAgICAgIGlmICho
b3Jpem9udGFsU3BhY2VGb3JNYXJnaW4gPCAwKQotICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9u
dGFsTWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwg
Y29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07Ci0gICAgICAgIH0KLQot
ICAgICAgICAvLyAjMgotICAgICAgICBpZiAod2lkdGggJiYgY29tcHV0ZWRIb3Jpem9udGFsTWFy
Z2luLnN0YXJ0ICYmIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKLSAgICAgICAgICAg
IGlmIChjb250YWluaW5nQmxvY2tTdHlsZS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIHsKLSAg
ICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9ICpjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uc3RhcnQ7Ci0gICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4u
ZW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQg
KyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3Jk
ZXJSaWdodCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVzZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kOwotICAgICAg
ICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gY29udGFpbmluZ0Jsb2NrV2lk
dGggLSAoYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsg
Ym9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgLy8gIzMKLSAgICAgICAgaWYgKCFjb21wdXRlZEhvcml6b250
YWxNYXJnaW4uc3RhcnQgJiYgd2lkdGggJiYgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkg
ewotICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gKmNvbXB1dGVkSG9yaXpv
bnRhbE1hcmdpbi5lbmQ7Ci0gICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9
IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCAgKyAqd2lk
dGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVu
ZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYm
ICF3aWR0aCAmJiBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7Ci0gICAgICAgICAgICB1
c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCwg
KmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQgfTsKLSAgICAgICAgICAgIHdpZHRoID0gY29u
dGFpbmluZ0Jsb2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJM
ZWZ0ICsgcGFkZGluZ0xlZnQgKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29tcHV0ZWRIb3Jpem9udGFs
TWFyZ2luLnN0YXJ0ICYmIHdpZHRoICYmICFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7
Ci0gICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9ICpjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uc3RhcnQ7Ci0gICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQg
PSBjb250YWluaW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJv
cmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJp
Z2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vICM0Ci0gICAgICAgIGlmICghd2lkdGgpIHsK
LSAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxN
YXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1
ZU9yKDApIH07Ci0gICAgICAgICAgICB3aWR0aCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVz
ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgcGFk
ZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAg
ICAgICB9Ci0KLSAgICAgICAgLy8gIzUKLSAgICAgICAgaWYgKCFjb21wdXRlZEhvcml6b250YWxN
YXJnaW4uc3RhcnQgJiYgIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKLSAgICAgICAg
ICAgIGF1dG8gaG9yaXpvbnRhbFNwYWNlRm9yTWFyZ2luID0gY29udGFpbmluZ0Jsb2NrV2lkdGgg
LSAoYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJv
cmRlclJpZ2h0KTsKLSAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyBob3Jpem9u
dGFsU3BhY2VGb3JNYXJnaW4gLyAyLCBob3Jpem9udGFsU3BhY2VGb3JNYXJnaW4gLyAyIH07Ci0g
ICAgICAgIH0KLQotICAgICAgICBhdXRvIHNob3VsZEFwcGx5Q2VudGVyQWxpZ25Gb3JCbG9ja0Nv
bnRlbnQgPSBjb250YWluaW5nQmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBUZXh0QWxpZ25Nb2Rl
OjpXZWJLaXRDZW50ZXIgJiYgKGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCB8fCBjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uZW5kKTsKLSAgICAgICAgaWYgKHNob3VsZEFwcGx5Q2VudGVy
QWxpZ25Gb3JCbG9ja0NvbnRlbnQpIHsKLSAgICAgICAgICAgIGF1dG8gYm9yZGVyQm94V2lkdGgg
PSAoYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJv
cmRlclJpZ2h0KTsKLSAgICAgICAgICAgIGF1dG8gbWFyZ2luU3RhcnQgPSBjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKTsKLSAgICAgICAgICAgIGF1dG8gbWFyZ2luRW5k
ID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApOwotICAgICAgICAgICAg
YXV0byBjZW50ZXJlZExvZ2ljYWxMZWZ0Rm9yTWFyZ2luQm94ID0gc3RkOjptYXgoKGNvbnRhaW5p
bmdCbG9ja1dpZHRoIC0gYm9yZGVyQm94V2lkdGggLSBtYXJnaW5TdGFydCAtIG1hcmdpbkVuZCkg
LyAyLCAwX2x1KTsKLSAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gY2Vu
dGVyZWRMb2dpY2FsTGVmdEZvck1hcmdpbkJveCArIG1hcmdpblN0YXJ0OwotICAgICAgICAgICAg
dXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSBib3JkZXJC
b3hXaWR0aCAtIG1hcmdpblN0YXJ0ICsgbWFyZ2luRW5kOwotICAgICAgICB9Ci0gICAgICAgIEFT
U0VSVCh3aWR0aCk7Ci0KLSAgICAgICAgcmV0dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7ICp3
aWR0aCwgdXNlZEhvcml6b250YWxNYXJnaW4gfTsKLSAgICB9OwotCi0gICAgYXV0byBjb250ZW50
V2lkdGhBbmRNYXJnaW4gPSBjb21wdXRlKCk7Ci0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRp
bmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltXaWR0aF1bTWFyZ2luXSAtPiBpbmZsb3cgbm9u
LXJlcGxhY2VkIC0+IHdpZHRoKCIgPDwgY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0
aCA8PCAicHgpIG1hcmdpbigiIDw8IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0
YXJ0IDw8ICJweCwgIiA8PCBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgPDwg
InB4KSAtPiBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIGNv
bnRlbnRXaWR0aEFuZE1hcmdpbjsKLX0KLQotQ29udGVudFdpZHRoQW5kTWFyZ2luIEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbkZsb3dSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1h
cmdpbihjb25zdCBSZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRh
bFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKHJlcGxh
Y2VkQm94LmlzSW5GbG93KCkpOwotCi0gICAgLy8gMTAuMy40IEJsb2NrLWxldmVsLCByZXBsYWNl
ZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdwotICAgIC8vCi0gICAgLy8gMS4gVGhlIHVzZWQgdmFs
dWUgb2YgJ3dpZHRoJyBpcyBkZXRlcm1pbmVkIGFzIGZvciBpbmxpbmUgcmVwbGFjZWQgZWxlbWVu
dHMuCi0gICAgLy8gMi4gVGhlbiB0aGUgcnVsZXMgZm9yIG5vbi1yZXBsYWNlZCBibG9jay1sZXZl
bCBlbGVtZW50cyBhcmUgYXBwbGllZCB0byBkZXRlcm1pbmUgdGhlIG1hcmdpbnMuCi0KLSAgICAv
LyAjMQotICAgIGF1dG8gdXNlZFdpZHRoID0gaW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRN
YXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBvdmVycmlkZGVu
SG9yaXpvbnRhbFZhbHVlcykuY29udGVudFdpZHRoOwotICAgIC8vICMyCi0gICAgYXV0byBub25S
ZXBsYWNlZFdpZHRoQW5kTWFyZ2luID0gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRN
YXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgT3ZlcnJpZGRlbkhvcml6
b250YWxWYWx1ZXMgeyB1c2VkV2lkdGgsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLm1hcmdp
biB9KTsKLQotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3Ry
ZWFtIDw8ICJbV2lkdGhdW01hcmdpbl0gLT4gaW5mbG93IHJlcGxhY2VkIC0+IHdpZHRoKCIgPDwg
dXNlZFdpZHRoICA8PCAicHgpIG1hcmdpbigiIDw8IG5vblJlcGxhY2VkV2lkdGhBbmRNYXJnaW4u
dXNlZE1hcmdpbi5zdGFydCA8PCAicHgsICIgPDwgbm9uUmVwbGFjZWRXaWR0aEFuZE1hcmdpbi51
c2VkTWFyZ2luLmVuZCA8PCAicHgpIC0+IGxheW91dEJveCgiIDw8ICZyZXBsYWNlZEJveCA8PCAi
KSIpOwotICAgIHJldHVybiB7IHVzZWRXaWR0aCwgbm9uUmVwbGFjZWRXaWR0aEFuZE1hcmdpbi51
c2VkTWFyZ2luIH07Ci19Ci0KLUxheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnk6OnN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0
IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpIGNvbnN0Ci17Ci0gICAg
Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIyL3Zpc3VyZW4uaHRtbCNibG9jay1mb3JtYXR0
aW5nCi0gICAgLy8gSW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGJveGVzIGFyZSBsYWlk
IG91dCBvbmUgYWZ0ZXIgdGhlIG90aGVyLCB2ZXJ0aWNhbGx5LCBiZWdpbm5pbmcgYXQgdGhlIHRv
cCBvZiBhIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgLy8gVGhlIHZlcnRpY2FsIGRpc3RhbmNlIGJl
dHdlZW4gdHdvIHNpYmxpbmcgYm94ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgJ21hcmdpbicgcHJv
cGVydGllcy4KLSAgICAvLyBWZXJ0aWNhbCBtYXJnaW5zIGJldHdlZW4gYWRqYWNlbnQgYmxvY2st
bGV2ZWwgYm94ZXMgaW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgY29sbGFwc2UuCi0gICAg
aWYgKGF1dG8qIHByZXZpb3VzSW5GbG93U2libGluZyA9IGxheW91dEJveC5wcmV2aW91c0luRmxv
d1NpYmxpbmcoKSkgewotICAgICAgICBhdXRvJiBwcmV2aW91c0luRmxvd0JveEdlb21ldHJ5ID0g
Zm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveCgqcHJldmlvdXNJbkZsb3dTaWJsaW5n
KTsKLSAgICAgICAgcmV0dXJuIEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KHByZXZpb3VzSW5G
bG93Qm94R2VvbWV0cnkpLmJvdHRvbSgpICsgcHJldmlvdXNJbkZsb3dCb3hHZW9tZXRyeS5tYXJn
aW5BZnRlcigpOwotICAgIH0KLSAgICByZXR1cm4gdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2Fs
VG9wOwotfQotCi1MYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpz
dGF0aWNIb3Jpem9udGFsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSBjb25zdAotewotICAgIC8v
IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi92aXN1cmVuLmh0bWwjYmxvY2stZm9ybWF0dGlu
ZwotICAgIC8vIEluIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0LCBlYWNoIGJveCdzIGxlZnQg
b3V0ZXIgZWRnZSB0b3VjaGVzIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sg
KGZvciByaWdodC10by1sZWZ0IGZvcm1hdHRpbmcsIHJpZ2h0IGVkZ2VzIHRvdWNoKS4KLSAgICBy
ZXR1cm4gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxMZWZ0ICsgZm9ybWF0dGluZ0NvbnRl
eHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpLm1hcmdpblN0YXJ0KCk7Ci19Ci0KLVBvaW50
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNQb3NpdGlvbihjb25zdCBC
b3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29u
c3RyYWludHMsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIHsgc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJv
eCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSwgc3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRC
b3gsIHZlcnRpY2FsQ29uc3RyYWludHMpIH07Ci19Ci0KLUNvbnRlbnRIZWlnaHRBbmRNYXJnaW4g
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd0NvbnRlbnRIZWlnaHRBbmRN
YXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYg
aG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmIG92
ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5GbG93
KCkpOwotCi0gICAgLy8gMTAuNi4yIElubGluZSByZXBsYWNlZCBlbGVtZW50cywgYmxvY2stbGV2
ZWwgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3csICdpbmxpbmUtYmxvY2snCi0gICAg
Ly8gcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZsb2F0aW5nIHJlcGxhY2Vk
IGVsZW1lbnRzCi0gICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0gICAgICAgIHJl
dHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFj
ZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBvdmVycmlkZGVu
VmVydGljYWxWYWx1ZXMpOwotCi0gICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBjb250ZW50SGVp
Z2h0QW5kTWFyZ2luOwotICAgIGlmIChsYXlvdXRCb3guaXNPdmVyZmxvd1Zpc2libGUoKSAmJiAh
bGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSkgewotICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0
IHRoZSBjYXNlIGZvciB0aGUgZG9jdW1lbnQgZWxlbWVudC4gTGV0J3MganVzdCBjb21wbGljYXRl
ZC1jYXNlIGl0IGZvciBub3cuCi0gICAgICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gPSBpbkZs
b3dOb25SZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFs
Q29uc3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAg
ICAgICAgLy8gMTAuNi42IENvbXBsaWNhdGVkIGNhc2VzCi0gICAgICAgIC8vIEJsb2NrLWxldmVs
LCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgd2hlbiAnb3ZlcmZsb3cnIGRv
ZXMgbm90IGNvbXB1dGUgdG8gJ3Zpc2libGUnIChleGNlcHQgaWYgdGhlICdvdmVyZmxvdycgcHJv
cGVydHkncyB2YWx1ZSBoYXMgYmVlbiBwcm9wYWdhdGVkIHRvIHRoZSB2aWV3cG9ydCkuCi0gICAg
ICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gPSBjb21wbGljYXRlZENhc2VzKGxheW91dEJveCwg
aG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwotICAgIH0K
LQotICAgIGF1dG8gcXVpcmtzID0gZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKTsKLSAgICBp
ZiAoIXF1aXJrcy5uZWVkc1N0cmV0Y2hpbmcobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGNv
bnRlbnRIZWlnaHRBbmRNYXJnaW47Ci0KLSAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRl
bnRIZWlnaHQgPSBxdWlya3Muc3RyZXRjaGVkSW5GbG93SGVpZ2h0KGxheW91dEJveCwgY29udGVu
dEhlaWdodEFuZE1hcmdpbik7Ci0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRl
eHRMYXlvdXQsIHN0cmVhbSA8PCAiW0hlaWdodF1bTWFyZ2luXSAtPiBpbmZsb3cgbm9uLXJlcGxh
Y2VkIC0+IHN0cmVjaGVkIHRvIHZpZXdwb3J0IC0+IGhlaWdodCgiIDw8IGNvbnRlbnRIZWlnaHRB
bmRNYXJnaW4uY29udGVudEhlaWdodCA8PCAicHgpIG1hcmdpbigiIDw8IGNvbnRlbnRIZWlnaHRB
bmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSA8PCAicHgsICIgPDwgY29udGVudEhl
aWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIgPDwgInB4KSAtPiBsYXlvdXRC
b3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIGNvbnRlbnRIZWlnaHRBbmRN
YXJnaW47Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeTo6aW5GbG93Q29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0
Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywg
Y29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFs
dWVzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7Ci0KLSAgICBpZiAoIWxh
eW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0gICAgICAgIHJldHVybiBpbkZsb3dOb25SZXBsYWNl
ZENvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywg
b3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOwotICAgIHJldHVybiBpbkZsb3dSZXBsYWNlZENv
bnRlbnRXaWR0aEFuZE1hcmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9y
aXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyk7Ci19Ci0KLUNv
bnRlbnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29t
cHV0ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBPcHRpb25hbDxMYXlv
dXRVbml0PiBhdmFpbGFibGVXaWR0aEZsb2F0QXZvaWRlcikKLXsKLSAgICBhdXRvIGNvbXB1dGUg
PSBbJl0gKGF1dG8gY29uc3RyYWludHNGb3JXaWR0aCwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNl
ZFdpZHRoKSB7Ci0gICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkK
LSAgICAgICAgICAgIHJldHVybiBmbG9hdGluZ0NvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRC
b3gsIGNvbnN0cmFpbnRzRm9yV2lkdGgsIHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0KLSAgICAgICAg
aWYgKGxheW91dEJveC5pc0luRmxvdygpKQotICAgICAgICAgICAgcmV0dXJuIGluRmxvd0NvbnRl
bnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzRm9yV2lkdGgsIHsgdXNlZFdp
ZHRoLCB7IH0gfSk7Ci0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJl
dHVybiBDb250ZW50V2lkdGhBbmRNYXJnaW4geyB9OwotICAgIH07Ci0KLSAgICBhdXRvIGhvcml6
b250YWxDb25zdHJhaW50c0ZvcldpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzOwotICAgIGlm
IChsYXlvdXRCb3guc3R5bGUoKS5sb2dpY2FsV2lkdGgoKS5pc0F1dG8oKSAmJiBhdmFpbGFibGVX
aWR0aEZsb2F0QXZvaWRlcikgewotICAgICAgICAvLyBXaGlsZSB0aGUgbm9uLWF1dG8gd2lkdGgg
dmFsdWVzIHNob3VsZCBhbGwgYmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgY29udGFpbmluZyBibG9j
aydzIHdpZHRoLCB3aGVuCi0gICAgICAgIC8vIHRoZSB3aWR0aCBpcyBhdXRvIHRoZSBhdmFpbGFi
bGUgaG9yaXpvbnRhbCBzcGFjZSBpcyBzaHJ1bmsgYnkgbmVpZ2hib3JpbmcgZmxvYXRzLgotICAg
ICAgICBob3Jpem9udGFsQ29uc3RyYWludHNGb3JXaWR0aC5sb2dpY2FsV2lkdGggPSAqYXZhaWxh
YmxlV2lkdGhGbG9hdEF2b2lkZXI7Ci0gICAgfQotICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFy
Z2luID0gY29tcHV0ZShob3Jpem9udGFsQ29uc3RyYWludHNGb3JXaWR0aCwgeyB9KTsKLSAgICBh
dXRvIGF2YWlsYWJsZVdpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsK
LSAgICBpZiAoYXV0byBtYXhXaWR0aCA9IGNvbXB1dGVkTWF4V2lkdGgobGF5b3V0Qm94LCBhdmFp
bGFibGVXaWR0aCkpIHsKLSAgICAgICAgYXV0byBtYXhXaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUo
aG9yaXpvbnRhbENvbnN0cmFpbnRzLCBtYXhXaWR0aCk7Ci0gICAgICAgIGlmIChjb250ZW50V2lk
dGhBbmRNYXJnaW4uY29udGVudFdpZHRoID4gbWF4V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRo
KQotICAgICAgICAgICAgY29udGVudFdpZHRoQW5kTWFyZ2luID0gbWF4V2lkdGhBbmRNYXJnaW47
Ci0gICAgfQotCi0gICAgYXV0byBtaW5XaWR0aCA9IGNvbXB1dGVkTWluV2lkdGgobGF5b3V0Qm94
LCBhdmFpbGFibGVXaWR0aCkudmFsdWVPcigwKTsKLSAgICBhdXRvIG1pbldpZHRoQW5kTWFyZ2lu
ID0gY29tcHV0ZShob3Jpem9udGFsQ29uc3RyYWludHMsIG1pbldpZHRoKTsKLSAgICBpZiAoY29u
dGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA8IG1pbldpZHRoQW5kTWFyZ2luLmNvbnRl
bnRXaWR0aCkKLSAgICAgICAgY29udGVudFdpZHRoQW5kTWFyZ2luID0gbWluV2lkdGhBbmRNYXJn
aW47Ci0gICAgcmV0dXJuIGNvbnRlbnRXaWR0aEFuZE1hcmdpbjsKLX0KLQotRm9ybWF0dGluZ0Nv
bnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6
R2VvbWV0cnk6OmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3QgQm94JiBsYXlvdXRCb3gp
Ci17Ci0gICAgYXV0byBmaXhlZE1hcmdpbkJvcmRlckFuZFBhZGRpbmcgPSBbJl0oYXV0byYgbGF5
b3V0Qm94KSB7Ci0gICAgICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAg
ICAgIHJldHVybiBmaXhlZFZhbHVlKHN0eWxlLm1hcmdpblN0YXJ0KCkpLnZhbHVlT3IoMCkKLSAg
ICAgICAgICAgICsgTGF5b3V0VW5pdCB7IHN0eWxlLmJvcmRlckxlZnRXaWR0aCgpIH0KLSAgICAg
ICAgICAgICsgZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nTGVmdCgpKS52YWx1ZU9yKDApCi0gICAg
ICAgICAgICArIGZpeGVkVmFsdWUoc3R5bGUucGFkZGluZ1JpZ2h0KCkpLnZhbHVlT3IoMCkKLSAg
ICAgICAgICAgICsgTGF5b3V0VW5pdCB7IHN0eWxlLmJvcmRlclJpZ2h0V2lkdGgoKSB9Ci0gICAg
ICAgICAgICArIGZpeGVkVmFsdWUoc3R5bGUubWFyZ2luRW5kKCkpLnZhbHVlT3IoMCk7Ci0gICAg
fTsKLQotICAgIGF1dG8gY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gWyZdKCkg
LT4gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7Ci0gICAgICAgIGF1dG8gbG9naWNhbFdpZHRo
ID0gbGF5b3V0Qm94LnN0eWxlKCkubG9naWNhbFdpZHRoKCk7Ci0gICAgICAgIC8vIE1pbmltdW0v
bWF4aW11bSB3aWR0aCBjYW4ndCBiZSBkZXBlbmRpbmcgb24gdGhlIGNvbnRhaW5pbmcgYmxvY2sn
cyB3aWR0aC4KLSAgICAgICAgYXV0byBuZWVkc1Jlc29sdmVkQ29udGFpbmluZ0Jsb2NrV2lkdGgg
PSBsb2dpY2FsV2lkdGguaXNDYWxjdWxhdGVkKCkgfHwgbG9naWNhbFdpZHRoLmlzUGVyY2VudCgp
IHx8IGxvZ2ljYWxXaWR0aC5pc1JlbGF0aXZlKCk7Ci0gICAgICAgIGlmIChuZWVkc1Jlc29sdmVk
Q29udGFpbmluZ0Jsb2NrV2lkdGgpCi0gICAgICAgICAgICByZXR1cm4geyB9OwotCi0gICAgICAg
IGlmIChhdXRvIHdpZHRoID0gZml4ZWRWYWx1ZShsb2dpY2FsV2lkdGgpKQotICAgICAgICAgICAg
cmV0dXJuIHsgKndpZHRoLCAqd2lkdGggfTsKLQotICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVw
bGFjZWRCb3goKSkgewotICAgICAgICAgICAgYXV0byYgcmVwbGFjZWRCb3ggPSBkb3duY2FzdDxS
ZXBsYWNlZEJveD4obGF5b3V0Qm94KTsKLSAgICAgICAgICAgIGlmIChyZXBsYWNlZEJveC5oYXNJ
bnRyaW5zaWNXaWR0aCgpKSB7Ci0gICAgICAgICAgICAgICAgYXV0byByZXBsYWNlZFdpZHRoID0g
cmVwbGFjZWRCb3guaW50cmluc2ljV2lkdGgoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4geyBy
ZXBsYWNlZFdpZHRoLCByZXBsYWNlZFdpZHRoIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICByZXR1cm4geyB9OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+
KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZs
b3dPckZsb2F0aW5nQ2hpbGQoKSkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0KLSAgICAgICAg
aWYgKGxheW91dEJveC5pc1NpemVDb250YWlubWVudEJveCgpKSB7Ci0gICAgICAgICAgICAvLyBU
aGUgaW50cmluc2ljIHNpemVzIG9mIHRoZSBzaXplIGNvbnRhaW5tZW50IGJveCBhcmUgZGV0ZXJt
aW5lZCBhcyBpZiB0aGUgZWxlbWVudCBoYWQgbm8gY29udGVudCwKLSAgICAgICAgICAgIC8vIGZv
bGxvd2luZyB0aGUgc2FtZSBsb2dpYyBhcyB3aGVuIHNpemluZyBhcyBpZiBlbXB0eS4KLSAgICAg
ICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGF5b3V0Qm94LmVz
dGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSkgewotICAgICAgICAgICAgYXV0byBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRl
eHQoZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLCBsYXlvdXRTdGF0ZSgpKS0+Y29t
cHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgICAgICBpZiAobG9naWNh
bFdpZHRoLmlzTWluQ29udGVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiB7IGludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5p
bXVtIH07Ci0gICAgICAgICAgICBpZiAobG9naWNhbFdpZHRoLmlzTWF4Q29udGVudCgpKQotICAg
ICAgICAgICAgICAgIHJldHVybiB7IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSwg
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtIH07Ci0gICAgICAgICAgICByZXR1cm4g
aW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9Owot
ICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSBsYXlvdXRTdGF0ZSgpLmZvcm1hdHRpbmdT
dGF0ZUZvckJveChsYXlvdXRCb3gpOwotICAgICAgICBmb3IgKGF1dG8mIGNoaWxkIDogY2hpbGRy
ZW5PZlR5cGU8Qm94Pihkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkpKSB7Ci0gICAg
ICAgICAgICBpZiAoY2hpbGQuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgfHwgKGNoaWxkLmlzRmxv
YXRBdm9pZGVyKCkgJiYgIWNoaWxkLmhhc0Zsb2F0Q2xlYXIoKSkpCi0gICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICBhdXRvIGNoaWxkSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cyA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGNoaWxk
KTsKLSAgICAgICAgICAgIEFTU0VSVChjaGlsZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMpOwot
Ci0gICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0gPSBzdGQ6Om1h
eChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0sIGNoaWxkSW50cmluc2ljV2lkdGhD
b25zdHJhaW50cy0+bWluaW11bSk7Ci0gICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzLm1heGltdW0gPSBzdGQ6Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0s
IGNoaWxkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cy0+bWF4aW11bSk7Ci0gICAgICAgIH0KLSAg
ICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Ci0gICAgfTsKLSAgICAvLyBG
SVhNRSBDaGVjayBmb3IgYm94LXNpemluZzogYm9yZGVyLWJveDsKLSAgICBhdXRvIGludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMgPSBjb25zdHJhaW5CeU1pbk1heFdpZHRoKGxheW91dEJveCwgY29t
cHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkpOwotICAgIGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMuZXhwYW5kKGZpeGVkTWFyZ2luQm9yZGVyQW5kUGFkZGluZyhsYXlvdXRCb3gpKTsK
LSAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKLX0KLQotfQotfQotCi0jZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxv
Y2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCmRlbGV0ZWQgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCA3MWIwODg0MjAzZGM4NmE2NzM2YWJjOGViZGFmMmE1ZWYxZDU4
NmFlLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1
aXJrcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNp
bmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCi0K
LSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkJsb2Nr
Rm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5
b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNs
dWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCi0jaW5jbHVkZSAiTGF5b3V0U3Rh
dGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLXN0YXRp
YyBib29sIGlzUXVpcmtDb250YWluZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAgcmV0
dXJuIGxheW91dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpIHx8
IGxheW91dEJveC5pc1RhYmxlQ2VsbCgpOwotfQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6OlF1aXJrczo6bmVlZHNTdHJldGNoaW5nKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAot
ewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7Ci0gICAgLy8gSW4gcXVpcmtzIG1v
ZGUsIGluLWZsb3cgYm9keSBhbmQgaHRtbCBzdHJldGNoIHRvIHRoZSBpbml0aWFsIGNvbnRhaW5p
bmcgYmxvY2sgKGhlaWdodDogYXV0byBvbmx5KS4KLSAgICBpZiAoIWxheW91dFN0YXRlKCkuaW5R
dWlya3NNb2RlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghbGF5b3V0Qm94
LmlzRG9jdW1lbnRCb3goKSAmJiAhbGF5b3V0Qm94LmlzQm9keUJveCgpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gbGF5b3V0Qm94LnN0eWxlKCkubG9naWNhbEhlaWdodCgp
LmlzQXV0bygpOwotfQotCi1MYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJr
czo6c3RyZXRjaGVkSW5GbG93SGVpZ2h0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBDb250ZW50SGVp
Z2h0QW5kTWFyZ2luIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4pCi17Ci0gICAgQVNTRVJUKG5lZWRz
U3RyZXRjaGluZyhsYXlvdXRCb3gpKTsKLSAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRo
aXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7Ci0gICAgYXV0byBub25Db2xsYXBzZWRWZXJ0aWNhbE1h
cmdpbiA9IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSAr
IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmFmdGVyOwotCi0gICAg
aWYgKGxheW91dEJveC5pc0RvY3VtZW50Qm94KCkpIHsKLSAgICAgICAgLy8gTGV0J3Mgc3RyZXRj
aCB0aGUgaW5mbG93IGRvY3VtZW50IGJveCg8aHRtbD4pIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGlu
aXRpYWwgY29udGFpbmluZyBibG9jayAodmlldykuCi0gICAgICAgIGF1dG8gZG9jdW1lbnRCb3hD
b250ZW50SGVpZ2h0ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94
LmluaXRpYWxDb250YWluaW5nQmxvY2soKSwgRXNjYXBlUmVhc29uOjpEb2N1bWVudEJveFN0cmV0
Y2hlc1RvVmlld3BvcnRRdWlyaykuY29udGVudEJveEhlaWdodCgpOwotICAgICAgICAvLyBEb2N1
bWVudCBib3gncyBvd24gdmVydGljYWwgbWFyZ2luL2JvcmRlci9wYWRkaW5nIHZhbHVlcyBhbHdh
eXMgc2hyaW5rIHRoZSBjb250ZW50IGhlaWdodC4KLSAgICAgICAgYXV0byYgZG9jdW1lbnRCb3hH
ZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0g
ICAgICAgIGRvY3VtZW50Qm94Q29udGVudEhlaWdodCAtPSBub25Db2xsYXBzZWRWZXJ0aWNhbE1h
cmdpbiArIGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50Qm94
R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKLSAgICAgICAgcmV0dXJuIHN0
ZDo6bWF4KGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCwgIGRvY3VtZW50Qm94
Q29udGVudEhlaWdodCk7Ci0gICAgfQotCi0gICAgLy8gSGVyZSBpcyB0aGUgcXVpcmt5IHBhcnQg
Zm9yIGJvZHkgYm94IHdoZW4gaXQgc3RyZXRjaGVzIGFsbCB0aGUgd2F5IHRvIHRoZSBJQ0IgZXZl
biB3aGVuIHRoZSBkb2N1bWVudCBib3ggZG9lcyBub3QgKGUuZy4gb3V0LW9mLWZsb3cgcG9zaXRp
b25lZCkuCi0gICAgQVNTRVJUKGxheW91dEJveC5pc0JvZHlCb3goKSk7Ci0gICAgYXV0byYgaW5p
dGlhbENvbnRhaW5pbmdCbG9jayA9IGxheW91dEJveC5pbml0aWFsQ29udGFpbmluZ0Jsb2NrKCk7
Ci0gICAgYXV0byYgaW5pdGlhbENvbnRhaW5pbmdCbG9ja0dlb21ldHJ5ID0gZm9ybWF0dGluZ0Nv
bnRleHQuZ2VvbWV0cnlGb3JCb3goaW5pdGlhbENvbnRhaW5pbmdCbG9jaywgRXNjYXBlUmVhc29u
OjpCb2R5U3RyZXRjaGVzVG9WaWV3cG9ydFF1aXJrKTsKLSAgICAvLyBTdGFydCB0aGUgY29udGVu
dCBoZWlnaHQgd2l0aCB0aGUgSUNCLgotICAgIGF1dG8gYm9keUJveENvbnRlbnRIZWlnaHQgPSBp
bml0aWFsQ29udGFpbmluZ0Jsb2NrR2VvbWV0cnkuY29udGVudEJveEhlaWdodCgpOwotICAgIC8v
IEJvZHkgYm94J3Mgb3duIGJvcmRlciBhbmQgcGFkZGluZyBzaHJpbmsgdGhlIGNvbnRlbnQgaGVp
Z2h0LgotICAgIGF1dG8mIGJvZHlCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21l
dHJ5Rm9yQm94KGxheW91dEJveCk7Ci0gICAgYm9keUJveENvbnRlbnRIZWlnaHQgLT0gYm9keUJv
eEdlb21ldHJ5LnZlcnRpY2FsQm9yZGVyKCkgKyBib2R5Qm94R2VvbWV0cnkudmVydGljYWxQYWRk
aW5nKCkudmFsdWVPcigwKTsKLSAgICAvLyBCb2R5IGJveCBuZXZlciBjb2xsYXBzZXMgaXRzIHZl
cnRpY2FsIG1hcmdpbnMgd2l0aCB0aGUgZG9jdW1lbnQgYm94IGJ1dCBpdCBtaWdodCBjb2xsYXBz
ZSBpdHMgbWFyZ2luIHdpdGggaXRzIGRlc2NlbmRhbnRzLgotICAgIGF1dG8gbm9uQ29sbGFwc2Vk
TWFyZ2luID0gY29udGVudEhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW47Ci0gICAg
YXV0byBjb2xsYXBzZWRNYXJnaW4gPSBmb3JtYXR0aW5nQ29udGV4dC5tYXJnaW5Db2xsYXBzZSgp
LmNvbGxhcHNlZFZlcnRpY2FsVmFsdWVzKGxheW91dEJveCwgbm9uQ29sbGFwc2VkTWFyZ2luKS5j
b2xsYXBzZWRWYWx1ZXM7Ci0gICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBjb2xsYXBzZWRN
YXJnaW4uYmVmb3JlLnZhbHVlT3Iobm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSk7Ci0gICAgdXNl
ZFZlcnRpY2FsTWFyZ2luICs9IGNvbGxhcHNlZE1hcmdpbi5pc0NvbGxhcHNlZFRocm91Z2ggPyBu
b25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIgOiBjb2xsYXBzZWRNYXJnaW4uYWZ0ZXIudmFsdWVPcihu
b25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIpOwotICAgIGJvZHlCb3hDb250ZW50SGVpZ2h0IC09IHVz
ZWRWZXJ0aWNhbE1hcmdpbjsKLSAgICAvLyBEb2N1bWVudCBib3gncyBwYWRkaW5nIGFuZCBib3Jk
ZXIgYWxzbyBzaHJpbmsgdGhlIGJvZHkgYm94J3MgY29udGVudCBoZWlnaHQuCi0gICAgYXV0byYg
ZG9jdW1lbnRCb3ggPSBsYXlvdXRCb3gucGFyZW50KCk7Ci0gICAgYXV0byYgZG9jdW1lbnRCb3hH
ZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGRvY3VtZW50Qm94LCBF
c2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspOwotICAgIGJvZHlCb3hD
b250ZW50SGVpZ2h0IC09IGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRv
Y3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKLSAgICAvLyBI
b3dldmVyIHRoZSBub24taW4tZmxvdyBkb2N1bWVudCBib3gncyB2ZXJ0aWNhbCBtYXJnaW5zIGFy
ZSBpZ25vcmVkLiBUaGV5IGRvbid0IGFmZmVjdCB0aGUgYm9keSBib3gncyBjb250ZW50IGhlaWdo
dC4KLSAgICBpZiAoZG9jdW1lbnRCb3guaXNJbkZsb3coKSkgewotICAgICAgICBhdXRvIGdlb21l
dHJ5ID0gdGhpcy0+Z2VvbWV0cnkoKTsKLSAgICAgICAgYXV0byBwcmVjb21wdXRlRG9jdW1lbnRC
b3hWZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkVmVydGljYWxNYXJnaW4oZG9jdW1l
bnRCb3gsIGdlb21ldHJ5LmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChpbml0aWFsQ29udGFp
bmluZ0Jsb2NrLCBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspLmhv
cml6b250YWwpOwotICAgICAgICBib2R5Qm94Q29udGVudEhlaWdodCAtPSBwcmVjb21wdXRlRG9j
dW1lbnRCb3hWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSArIHByZWNvbXB1dGVEb2N1
bWVudEJveFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCk7Ci0gICAgfQotICAgIHJldHVy
biBzdGQ6Om1heChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQsICBib2R5Qm94
Q29udGVudEhlaWdodCk7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtz
OjpzaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gbGF5b3V0U3RhdGUoKS5pblF1aXJrc01vZGUoKSAmJiBpc1F1
aXJrQ29udGFpbmVyKGxheW91dEJveCk7Ci19Ci0KLWVudW0gY2xhc3MgVmVydGljYWxNYXJnaW4g
eyBCZWZvcmUsIEFmdGVyIH07Ci1zdGF0aWMgaW5saW5lIGJvb2wgaGFzUXVpcmtNYXJnaW5Ub0Nv
bGxhcHNlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBWZXJ0aWNhbE1hcmdpbiB2ZXJ0aWNhbE1hcmdp
bikKLXsKLSAgICBpZiAoIWxheW91dEJveC5pc0luRmxvdygpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICByZXR1cm4gKHZl
cnRpY2FsTWFyZ2luID09IFZlcnRpY2FsTWFyZ2luOjpCZWZvcmUgJiYgc3R5bGUuaGFzTWFyZ2lu
QmVmb3JlUXVpcmsoKSkgfHwgKHZlcnRpY2FsTWFyZ2luID09IFZlcnRpY2FsTWFyZ2luOjpBZnRl
ciAmJiBzdHlsZS5oYXNNYXJnaW5BZnRlclF1aXJrKCkpOwotfQotCi1ib29sIEJsb2NrRm9ybWF0
dGluZ0NvbnRleHQ6OlF1aXJrczo6c2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50
TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIHJldHVybiBs
YXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpICYmIGhhc1F1aXJrTWFyZ2luVG9Db2xsYXBzZShs
YXlvdXRCb3gsIFZlcnRpY2FsTWFyZ2luOjpCZWZvcmUpICYmIGlzUXVpcmtDb250YWluZXIobGF5
b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpKTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0OjpRdWlya3M6OnNob3VsZENvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoUGFyZW50TWFyZ2luQWZ0
ZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGxheW91dFN0YXRl
KCkuaW5RdWlya3NNb2RlKCkgJiYgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGxheW91dEJveCwg
VmVydGljYWxNYXJnaW46OkFmdGVyKSAmJiBpc1F1aXJrQ29udGFpbmVyKGxheW91dEJveC5jb250
YWluaW5nQmxvY2soKSk7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3Rh
dGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzRhNTBmZjY5MTNhZDEyYTA4
ZDUyZTM5MDI3NTkxMDc3ZjIzMzViLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tG
b3JtYXR0aW5nU3RhdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
Ci0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgot
ICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0
ZS5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRl
IDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3Bh
Y2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEJsb2NrRm9ybWF0dGlu
Z1N0YXRlKTsKLQotQmxvY2tGb3JtYXR0aW5nU3RhdGU6OkJsb2NrRm9ybWF0dGluZ1N0YXRlKFJl
ZjxGbG9hdGluZ1N0YXRlPiYmIGZsb2F0aW5nU3RhdGUsIExheW91dFN0YXRlJiBsYXlvdXRTdGF0
ZSkKLSAgICA6IEZvcm1hdHRpbmdTdGF0ZShXVEZNb3ZlKGZsb2F0aW5nU3RhdGUpLCBUeXBlOjpC
bG9jaywgbGF5b3V0U3RhdGUpCi17Ci19Ci0KLUJsb2NrRm9ybWF0dGluZ1N0YXRlOjp+QmxvY2tG
b3JtYXR0aW5nU3RhdGUoKQotewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3Rh
dGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU2Y2Q2MTlkZDMxNmY1OWIzZjQw
OWJmMzVkNzA5NmQ5ZmI3YzhiMS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9y
bWF0dGluZ1N0YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
LSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0g
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8K
LQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkK
LQotI2luY2x1ZGUgIkZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2Mu
aD4KLSNpbmNsdWRlIDx3dGYvV2Vha0hhc2hTZXQuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewot
bmFtZXNwYWNlIExheW91dCB7Ci0KLS8vIEJsb2NrRm9ybWF0dGluZ1N0YXRlIGhvbGRzIHRoZSBz
dGF0ZSBmb3IgYSBwYXJ0aWN1bGFyIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCB0cmVlLgotY2xh
c3MgQmxvY2tGb3JtYXR0aW5nU3RhdGUgOiBwdWJsaWMgRm9ybWF0dGluZ1N0YXRlIHsKLSAgICBX
VEZfTUFLRV9JU09fQUxMT0NBVEVEKEJsb2NrRm9ybWF0dGluZ1N0YXRlKTsKLXB1YmxpYzoKLSAg
ICBCbG9ja0Zvcm1hdHRpbmdTdGF0ZShSZWY8RmxvYXRpbmdTdGF0ZT4mJiwgTGF5b3V0U3RhdGUm
KTsKLSAgICB+QmxvY2tGb3JtYXR0aW5nU3RhdGUoKTsKLQotICAgIHZvaWQgc2V0VXNlZFZlcnRp
Y2FsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBVc2VkVmVydGljYWxNYXJnaW4m
IHVzZWRWZXJ0aWNhbE1hcmdpbikgeyBtX3VzZWRWZXJ0aWNhbE1hcmdpbnMuc2V0KCZsYXlvdXRC
b3gsIHVzZWRWZXJ0aWNhbE1hcmdpbik7IH0KLSAgICBVc2VkVmVydGljYWxNYXJnaW4gdXNlZFZl
cnRpY2FsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdCB7IHJldHVybiBtX3VzZWRW
ZXJ0aWNhbE1hcmdpbnMuZ2V0KCZsYXlvdXRCb3gpOyB9Ci0gICAgYm9vbCBoYXNVc2VkVmVydGlj
YWxNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fdXNlZFZlcnRp
Y2FsTWFyZ2lucy5jb250YWlucygmbGF5b3V0Qm94KTsgfQotCi0gICAgdm9pZCBzZXRIYXNDbGVh
cmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIHsgbV9jbGVhcmFuY2VTZXQuYWRkKGxheW91dEJv
eCk7IH0KLSAgICB2b2lkIGNsZWFySGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSB7
IG1fY2xlYXJhbmNlU2V0LnJlbW92ZShsYXlvdXRCb3gpOyB9Ci0gICAgYm9vbCBoYXNDbGVhcmFu
Y2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fY2xlYXJhbmNlU2V0LmNv
bnRhaW5zKGxheW91dEJveCk7IH0KLQotcHJpdmF0ZToKLSAgICBIYXNoTWFwPGNvbnN0IEJveCos
IFVzZWRWZXJ0aWNhbE1hcmdpbj4gbV91c2VkVmVydGljYWxNYXJnaW5zOwotICAgIFdlYWtIYXNo
U2V0PGNvbnN0IEJveD4gbV9jbGVhcmFuY2VTZXQ7Ci19OwotCi19Ci19Ci0KLVNQRUNJQUxJWkVf
VFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUoQmxvY2tGb3JtYXR0aW5nU3RhdGUs
IGlzQmxvY2tGb3JtYXR0aW5nU3RhdGUoKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrTWFyZ2luQ29sbGFwc2UuY3BwIGIv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja01hcmdpbkNvbGxhcHNl
LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmZDViYmUyMmExYWI5MmU4NTFk
ODUwZGUwZjRhNmFkMTg3MTBkYi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrTWFy
Z2luQ29sbGFwc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjA3ICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgot
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
LSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nQ29udGV4
dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRl
ICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIKLSNp
bmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJMYXlvdXRCb3guaCIK
LSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRVbml0Lmgi
Ci0jaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNw
YWNlIExheW91dCB7Ci0KLXN0YXRpYyBib29sIGhhc0JvcmRlcihjb25zdCBCb3JkZXJWYWx1ZSYg
Ym9yZGVyVmFsdWUpCi17Ci0gICAgaWYgKGJvcmRlclZhbHVlLnN0eWxlKCkgPT0gQm9yZGVyU3R5
bGU6Ok5vbmUgfHwgYm9yZGVyVmFsdWUuc3R5bGUoKSA9PSBCb3JkZXJTdHlsZTo6SGlkZGVuKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuICEhYm9yZGVyVmFsdWUud2lkdGgoKTsK
LX0KLQotc3RhdGljIGJvb2wgaGFzUGFkZGluZyhjb25zdCBMZW5ndGgmIHBhZGRpbmdWYWx1ZSkK
LXsKLSAgICAvLyBGSVhNRTogQ2hlY2sgaWYgcGVyY2VudCB2YWx1ZSBuZWVkcyB0byBiZSByZXNv
bHZlZC4KLSAgICByZXR1cm4gIXBhZGRpbmdWYWx1ZS5pc1plcm8oKTsKLX0KLQotc3RhdGljIGJv
b2wgaGFzQm9yZGVyQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAgIHJldHVybiBo
YXNCb3JkZXIobGF5b3V0Qm94LnN0eWxlKCkuYm9yZGVyQmVmb3JlKCkpOwotfQotCi1zdGF0aWMg
Ym9vbCBoYXNCb3JkZXJBZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICByZXR1cm4g
aGFzQm9yZGVyKGxheW91dEJveC5zdHlsZSgpLmJvcmRlckFmdGVyKCkpOwotfQotCi1zdGF0aWMg
Ym9vbCBoYXNQYWRkaW5nQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAgIHJldHVy
biBoYXNQYWRkaW5nKGxheW91dEJveC5zdHlsZSgpLnBhZGRpbmdCZWZvcmUoKSk7Ci19Ci0KLXN0
YXRpYyBib29sIGhhc1BhZGRpbmdBZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICBy
ZXR1cm4gaGFzUGFkZGluZyhsYXlvdXRCb3guc3R5bGUoKS5wYWRkaW5nQWZ0ZXIoKSk7Ci19Ci0K
LXN0YXRpYyBib29sIGVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dChjb25zdCBCb3gm
IGxheW91dEJveCkKLXsKLSAgICAvLyBXZWJLaXQgdHJlYXRzIHRoZSBkb2N1bWVudCBlbGVtZW50
IHJlbmRlcmVyIGFzIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QuIEl0IHByb2JhYmx5
IG9ubHkgaW1wYWN0cyBtYXJnaW4gY29sbGFwc2luZywgc28gbGV0J3Mgbm90IGRvCi0gICAgLy8g
YSBsYXlvdXQgd2lkZSBxdWlyayBvbiB0aGlzIGZvciBub3cuCi0gICAgaWYgKGxheW91dEJveC5p
c0RvY3VtZW50Qm94KCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBsYXlvdXRC
b3guZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCk7Ci19Ci0KLWJvb2wgQmxvY2tG
b3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Omhhc0NsZWFyYW5jZShjb25zdCBCb3gm
IGxheW91dEJveCkgY29uc3QKLXsKLSAgICBpZiAoIWxheW91dEJveC5oYXNGbG9hdENsZWFyKCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAvLyBGSVhNRTogcHJlY29tcHV0ZWRWZXJ0aWNh
bFBvc2l0aW9uRm9yRm9ybWF0dGluZ1Jvb3QgbG9naWMgZW5kcyB1cCBjYWxsaW5nIGludG8gdGhp
cyBmdW5jdGlvbiB3aGVuIHRoZSBsYXlvdXRCb3ggKGZpcnN0IGluZmxvdyBjaGlsZCkgaGFzCi0g
ICAgLy8gbm90IGJlZW4gbGFpZCBvdXQuCi0gICAgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCku
Zm9ybWF0dGluZ1N0YXRlKCkuaGFzQ2xlYXJhbmNlKGxheW91dEJveCk7Ci19Ci0KLWJvb2wgQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUNvbGxhcHNl
c1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAg
ICAvLyAxLiBUaGlzIGlzIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgYW5kIGl0cyBtYXJnaW5zIGNv
bGxhcHNlIHRocm91Z2ggYW5kIHRoZSBtYXJnaW4gYWZ0ZXIgY29sbGFwc2VzIHdpdGggcGFyZW50
J3MgbWFyZ2luIGFmdGVyIG9yCi0gICAgLy8gMi4gVGhpcyBib3gncyBtYXJnaW4gYWZ0ZXIgY29s
bGFwc2VzIHdpdGggdGhlIG5leHQgc2libGluZydzIG1hcmdpbiBiZWZvcmUgYW5kIHRoYXQgc2li
bGluZyBjb2xsYXBzZXMgdGhyb3VnaCBhbmQKLSAgICAvLyB3ZSBjYW4gZ2V0IHRvIHRoZSBsYXN0
IGluLWZsb3cgY2hpbGQgbGlrZSB0aGF0LgotICAgIGF1dG8qIGxhc3RJbkZsb3dDaGlsZCA9IGxh
eW91dEJveC5jb250YWluaW5nQmxvY2soKS5sYXN0SW5GbG93Q2hpbGQoKTsKLSAgICBmb3IgKGF1
dG8qIGN1cnJlbnRCb3ggPSAmbGF5b3V0Qm94OyBjdXJyZW50Qm94OyBjdXJyZW50Qm94ID0gY3Vy
cmVudEJveC0+bmV4dEluRmxvd1NpYmxpbmcoKSkgewotICAgICAgICBpZiAoIW1hcmdpbnNDb2xs
YXBzZVRocm91Z2goKmN1cnJlbnRCb3gpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICBpZiAoY3VycmVudEJveCA9PSBsYXN0SW5GbG93Q2hpbGQpCi0gICAgICAgICAgICByZXR1
cm4gbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoKmN1cnJlbnRCb3gp
OyAKLSAgICAgICAgaWYgKCFtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhOZXh0U2libGluZ01hcmdp
bkJlZm9yZSgqY3VycmVudEJveCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFw
c2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsK
LSAgICAvLyBUaGUgZmlyc3QgaW5mbG93IGNoaWxkIGNvdWxkIHByb3BhZ2F0ZSBpdHMgdG9wIG1h
cmdpbiB0byBwYXJlbnQuCi0gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIxL2JveC5o
dG1sI2NvbGxhcHNpbmctbWFyZ2lucwotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVs
Qm94KCkpOwotCi0gICAgaWYgKGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkQ29s
bGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxheW91dEJveCkpCi0gICAg
ICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gTWFyZ2lucyBiZXR3ZWVuIGEgZmxvYXRlZCBib3gg
YW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxhcHNlLgotICAgIGlmIChsYXlvdXRCb3guaXNG
bG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gTWFy
Z2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgotICAg
IGlmIChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIC8vIE1hcmdpbnMgb2YgaW5saW5lLWJsb2NrIGJveGVzIGRvIG5vdCBjb2xs
YXBzZS4KLSAgICBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxvY2tCb3goKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgLy8gT25seSB0aGUgZmlyc3QgaW5sZmxvdyBjaGlsZCBjb2xsYXBz
ZXMgd2l0aCBwYXJlbnQuCi0gICAgaWYgKGxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmco
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0g
bGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOwotICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMg
dGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxh
cHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJlbgotICAgIGlmIChlc3RhYmxpc2hlc0Jsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmluZ0Jsb2NrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgaWYgKGhhc0JvcmRlckJlZm9yZShjb250YWluaW5nQmxvY2spKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShjb250YWluaW5nQmxvY2sp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyAuLi5hbmQgdGhlIGNoaWxkIGhhcyBu
byBjbGVhcmFuY2UuCi0gICAgaWYgKGhhc0NsZWFyYW5jZShsYXlvdXRCb3gpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZp
b3VzU2libGluZ01hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAg
IEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwotCi0gICAgaWYgKCFsYXlvdXRC
b3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IGF1dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9ICpsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dT
aWJsaW5nKCk7Ci0gICAgLy8gTWFyZ2lucyBiZXR3ZWVuIGEgZmxvYXRlZCBib3ggYW5kIGFueSBv
dGhlciBib3ggZG8gbm90IGNvbGxhcHNlLgotICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bv
c2l0aW9uZWQoKSB8fCBwcmV2aW91c0luRmxvd1NpYmxpbmcuaXNGbG9hdGluZ1Bvc2l0aW9uZWQo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5
IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgotICAgIGlmICgobGF5b3V0Qm94Lmlz
T3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guc3R5bGUoKS50b3AoKS5pc0F1dG8o
KSkKLSAgICAgICAgfHwgKHByZXZpb3VzSW5GbG93U2libGluZy5pc091dE9mRmxvd1Bvc2l0aW9u
ZWQoKSAmJiAhcHJldmlvdXNJbkZsb3dTaWJsaW5nLnN0eWxlKCkuYm90dG9tKCkuaXNBdXRvKCkp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9j
ayBib3hlcyBkbyBub3QgY29sbGFwc2UuCi0gICAgaWYgKGxheW91dEJveC5pc0lubGluZUJsb2Nr
Qm94KCkgfHwgcHJldmlvdXNJbkZsb3dTaWJsaW5nLmlzSW5saW5lQmxvY2tCb3goKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxv
dyBibG9jay1sZXZlbCBlbGVtZW50IGFsd2F5cyBjb2xsYXBzZXMgd2l0aCB0aGUgdG9wIG1hcmdp
biBvZgotICAgIC8vIGl0cyBuZXh0IGluLWZsb3cgYmxvY2stbGV2ZWwgc2libGluZywgdW5sZXNz
IHRoYXQgc2libGluZyBoYXMgY2xlYXJhbmNlLgotICAgIGlmIChoYXNDbGVhcmFuY2UobGF5b3V0
Qm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJv
b2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUNv
bGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0
Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwot
ICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1h
dHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJl
bi4KLSAgICBpZiAoZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGxheW91dEJveCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIFRoZSB0b3AgbWFyZ2luIG9mIGFuIGlu
LWZsb3cgYmxvY2sgZWxlbWVudCBjb2xsYXBzZXMgd2l0aCBpdHMgZmlyc3QgaW4tZmxvdyBibG9j
ay1sZXZlbAotICAgIC8vIGNoaWxkJ3MgdG9wIG1hcmdpbiBpZiB0aGUgZWxlbWVudCBoYXMgbm8g
dG9wIGJvcmRlci4uLgotICAgIGlmIChoYXNCb3JkZXJCZWZvcmUobGF5b3V0Qm94KSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gLi4ubm8gdG9wIHBhZGRpbmcKLSAgICBpZiAoaGFz
UGFkZGluZ0JlZm9yZShsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBp
ZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSB8fCAhZG93bmNhc3Q8Q29udGFpbmVyQm94
PihsYXlvdXRCb3gpLmhhc0luRmxvd0NoaWxkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIGF1dG8mIGZpcnN0SW5GbG93Q2hpbGQgPSAqZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlv
dXRCb3gpLmZpcnN0SW5GbG93Q2hpbGQoKTsKLSAgICBpZiAoIWZpcnN0SW5GbG93Q2hpbGQuaXNC
bG9ja0xldmVsQm94KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIC4uLmFuZCB0
aGUgY2hpbGQgaGFzIG5vIGNsZWFyYW5jZS4KLSAgICBpZiAoaGFzQ2xlYXJhbmNlKGZpcnN0SW5G
bG93Q2hpbGQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIG9mIGlu
bGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCi0gICAgaWYgKGZpcnN0SW5GbG93Q2hp
bGQuaXNJbmxpbmVCbG9ja0JveCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBz
ZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoU2libGluZ01hcmdpbkJlZm9yZVdpdGhDbGVhcmFu
Y2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhlIHRvcCBhbmQg
Ym90dG9tIG1hcmdpbnMgb2YgYW4gZWxlbWVudCB3aXRoIGNsZWFyYW5jZSBhcmUgYWRqb2luaW5n
LCBpdHMgbWFyZ2lucyBjb2xsYXBzZSB3aXRoIHRoZSBhZGpvaW5pbmcgbWFyZ2lucwotICAgIC8v
IG9mIGZvbGxvd2luZyBzaWJsaW5ncyBidXQgdGhhdCByZXN1bHRpbmcgbWFyZ2luIGRvZXMgbm90
IGNvbGxhcHNlIHdpdGggdGhlIGJvdHRvbSBtYXJnaW4gb2YgdGhlIHBhcmVudCBibG9jay4KLSAg
ICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2gobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgZm9yIChhdXRvKiBwcmV2aW91c1NpYmxpbmcgPSBsYXlvdXRCb3gucHJl
dmlvdXNJbkZsb3dTaWJsaW5nKCk7IHByZXZpb3VzU2libGluZzsgcHJldmlvdXNTaWJsaW5nID0g
cHJldmlvdXNTaWJsaW5nLT5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkgewotICAgICAgICBpZiAo
IW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKnByZXZpb3VzU2libGluZykpCi0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChoYXNDbGVhcmFuY2UoKnByZXZpb3VzU2libGluZykp
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQot
Ci1ib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5BZnRl
ckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNv
bnN0Ci17Ci0gICAgLy8gMS4gVGhpcyBpcyB0aGUgZmlyc3QgaW4tZmxvdyBjaGlsZCBhbmQgaXRz
IG1hcmdpbnMgY29sbGFwc2UgdGhyb3VnaCBhbmQgdGhlIG1hcmdpbiBiZWZvcmUgY29sbGFwc2Vz
IHdpdGggcGFyZW50J3MgbWFyZ2luIGJlZm9yZSBvcgotICAgIC8vIDIuIFRoaXMgYm94J3MgbWFy
Z2luIGJlZm9yZSBjb2xsYXBzZXMgd2l0aCB0aGUgcHJldmlvdXMgc2libGluZydzIG1hcmdpbiBh
ZnRlciBhbmQgdGhhdCBzaWJsaW5nIGNvbGxhcHNlcyB0aHJvdWdoIGFuZAotICAgIC8vIHdlIGNh
biBnZXQgdG8gdGhlIGZpcnN0IGluLWZsb3cgY2hpbGQgbGlrZSB0aGF0LgotICAgIGF1dG8qIGZp
cnN0SW5GbG93Q2hpbGQgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkuZmlyc3RJbkZsb3dD
aGlsZCgpOwotICAgIGZvciAoYXV0byogY3VycmVudEJveCA9ICZsYXlvdXRCb3g7IGN1cnJlbnRC
b3g7IGN1cnJlbnRCb3ggPSBjdXJyZW50Qm94LT5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkgewot
ICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKmN1cnJlbnRCb3gpKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoY3VycmVudEJveCA9PSBmaXJzdEluRmxv
d0NoaWxkKQotICAgICAgICAgICAgcmV0dXJuIG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJl
bnRNYXJnaW5CZWZvcmUoKmN1cnJlbnRCb3gpOyAKLSAgICAgICAgaWYgKCFtYXJnaW5CZWZvcmVD
b2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5nTWFyZ2luQWZ0ZXIoKmN1cnJlbnRCb3gpKQotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFy
Z2luQ29sbGFwc2U6Om1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKGNv
bnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9j
a0xldmVsQm94KCkpOwotCi0gICAgaWYgKGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hv
dWxkQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhQYXJlbnRNYXJnaW5BZnRlcihsYXlvdXRCb3gpKQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIE1hcmdpbnMgYmV0d2VlbiBhIGZsb2F0ZWQg
Ym94IGFuZCBhbnkgb3RoZXIgYm94IGRvIG5vdCBjb2xsYXBzZS4KLSAgICBpZiAobGF5b3V0Qm94
LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8v
IE1hcmdpbnMgb2YgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4K
LSAgICBpZiAobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3Qg
Y29sbGFwc2UuCi0gICAgaWYgKGxheW91dEJveC5pc0lubGluZUJsb2NrQm94KCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIC8vIE9ubHkgdGhlIGxhc3QgaW5sZmxvdyBjaGlsZCBjb2xs
YXBzZXMgd2l0aCBwYXJlbnQuCi0gICAgaWYgKGxheW91dEJveC5uZXh0SW5GbG93U2libGluZygp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBhdXRvJiBjb250YWluaW5nQmxvY2sgPSBs
YXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgLy8gTWFyZ2lucyBvZiBlbGVtZW50cyB0
aGF0IGVzdGFibGlzaCBuZXcgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cyBkbyBub3QgY29sbGFw
c2Ugd2l0aCB0aGVpciBpbi1mbG93IGNoaWxkcmVuLgotICAgIGlmIChlc3RhYmxpc2hlc0Jsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmluZ0Jsb2NrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jayBib3ggd2l0
aCBhICdoZWlnaHQnIG9mICdhdXRvJyBjb2xsYXBzZXMgd2l0aCBpdHMgbGFzdCBpbi1mbG93IGJs
b2NrLWxldmVsIGNoaWxkJ3MgYm90dG9tIG1hcmdpbiwgaWY6Ci0gICAgaWYgKCFjb250YWluaW5n
QmxvY2suc3R5bGUoKS5oZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIHBhZGRpbmcsIGFuZAotICAgIGlmIChoYXNQ
YWRkaW5nQWZ0ZXIoY29udGFpbmluZ0Jsb2NrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIGJvcmRlciwgYW5kCi0gICAgaWYgKGhhc0JvcmRl
ckFmdGVyKGNvbnRhaW5pbmdCbG9jaykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8v
IHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4gbmVpdGhlciBjb2xsYXBzZXMgd2l0aCBhIHRvcCBt
YXJnaW4gdGhhdCBoYXMgY2xlYXJhbmNlLi4uCi0gICAgaWYgKG1hcmdpbkFmdGVyQ29sbGFwc2Vz
V2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGxheW91dEJveCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIC8vIG5vciAoaWYgdGhlIGJveCdzIG1pbi1oZWlnaHQgaXMg
bm9uLXplcm8pIHdpdGggdGhlIGJveCdzIHRvcCBtYXJnaW4uCi0gICAgYXV0byBjb21wdXRlZE1p
bkhlaWdodCA9IGNvbnRhaW5pbmdCbG9jay5zdHlsZSgpLmxvZ2ljYWxNaW5IZWlnaHQoKTsKLSAg
ICBpZiAoIWNvbXB1dGVkTWluSGVpZ2h0LmlzQXV0bygpICYmIGNvbXB1dGVkTWluSGVpZ2h0LnZh
bHVlKCkgJiYgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxheW91
dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1i
b29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5BZnRlckNv
bGxhcHNlc1dpdGhMYXN0SW5GbG93Q2hpbGRNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJv
eCkgY29uc3QKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLQot
ICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1h
dHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJl
bi4KLSAgICBpZiAoZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGxheW91dEJveCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlv
dXRCb3gpIHx8ICFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hp
bGQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXV0byYgbGFzdEluRmxvd0NoaWxk
ID0gKmRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5sYXN0SW5GbG93Q2hpbGQoKTsK
LSAgICBpZiAoIWxhc3RJbkZsb3dDaGlsZC5pc0Jsb2NrTGV2ZWxCb3goKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9j
ayBib3ggd2l0aCBhICdoZWlnaHQnIG9mICdhdXRvJyBjb2xsYXBzZXMgd2l0aCBpdHMgbGFzdCBp
bi1mbG93IGJsb2NrLWxldmVsIGNoaWxkJ3MgYm90dG9tIG1hcmdpbiwgaWY6Ci0gICAgaWYgKCFs
YXlvdXRCb3guc3R5bGUoKS5oZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIHBhZGRpbmcsIGFuZAotICAgIGlmICho
YXNQYWRkaW5nQWZ0ZXIobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
Ly8gdGhlIGJveCBoYXMgbm8gYm90dG9tIGJvcmRlciwgYW5kCi0gICAgaWYgKGhhc0JvcmRlckFm
dGVyKGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIHRoZSBjaGls
ZCdzIGJvdHRvbSBtYXJnaW4gbmVpdGhlciBjb2xsYXBzZXMgd2l0aCBhIHRvcCBtYXJnaW4gdGhh
dCBoYXMgY2xlYXJhbmNlLi4uCi0gICAgaWYgKG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxp
bmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGxhc3RJbkZsb3dDaGlsZCkpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIC8vIG5vciAoaWYgdGhlIGJveCdzIG1pbi1oZWlnaHQgaXMgbm9u
LXplcm8pIHdpdGggdGhlIGJveCdzIHRvcCBtYXJnaW4uCi0gICAgYXV0byBjb21wdXRlZE1pbkhl
aWdodCA9IGxheW91dEJveC5zdHlsZSgpLmxvZ2ljYWxNaW5IZWlnaHQoKTsKLSAgICBpZiAoIWNv
bXB1dGVkTWluSGVpZ2h0LmlzQXV0bygpICYmIGNvbXB1dGVkTWluSGVpZ2h0LnZhbHVlKCkKLSAg
ICAgICAgJiYgKG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXN0
SW5GbG93Q2hpbGQpIHx8IGhhc0NsZWFyYW5jZShsYXN0SW5GbG93Q2hpbGQpKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgLy8gTWFyZ2lucyBvZiBpbmxpbmUtYmxvY2sgYm94ZXMgZG8g
bm90IGNvbGxhcHNlLgotICAgIGlmIChsYXN0SW5GbG93Q2hpbGQuaXNJbmxpbmVCbG9ja0JveCgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBUaGlzIGlzIGEgcXVpcmsgYmVoYXZp
b3I6IFdoZW4gdGhlIG1hcmdpbiBhZnRlciBvZiB0aGUgbGFzdCBpbmZsb3cgY2hpbGQgKG9yIGEg
cHJldmlvdXMgc2libGluZyB3aXRoIGNvbGxhcHNlZCB0aHJvdWdoIG1hcmdpbnMpCi0gICAgLy8g
Y29sbGFwc2VzIHdpdGggYSBxdWlyayBwYXJlbnQncyB0aGUgbWFyZ2luIGJlZm9yZSwgdGhlbiB0
aGUgc2FtZSBtYXJnaW4gYWZ0ZXIgZG9lcyBub3QgY29sbGFwc2VzIHdpdGggdGhlIHBhcmVudCdz
IG1hcmdpbiBhZnRlci4KLSAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91
bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihsYXlvdXRCb3gpICYmIG1hcmdpbkFmdGVyQ29s
bGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXN0SW5GbG93Q2hpbGQpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoTmV4dFNp
YmxpbmdNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNT
RVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7Ci0KLSAgICBpZiAoIWxheW91dEJveC5u
ZXh0SW5GbG93U2libGluZygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4g
bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKCpsYXlv
dXRCb3gubmV4dEluRmxvd1NpYmxpbmcoKSk7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbnNDb2xsYXBzZVRocm91Z2goY29uc3QgQm94JiBs
YXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3go
KSk7Ci0KLSAgICAvLyBBIGJveCdzIG93biBtYXJnaW5zIGNvbGxhcHNlIGlmIHRoZSAnbWluLWhl
aWdodCcgcHJvcGVydHkgaXMgemVybywgYW5kIGl0IGhhcyBuZWl0aGVyIHRvcCBvciBib3R0b20g
Ym9yZGVycyBub3IgdG9wIG9yIGJvdHRvbSBwYWRkaW5nLAotICAgIC8vIGFuZCBpdCBoYXMgYSAn
aGVpZ2h0JyBvZiBlaXRoZXIgMCBvciAnYXV0bycsIGFuZCBpdCBkb2VzIG5vdCBjb250YWluIGEg
bGluZSBib3gsIGFuZCBhbGwgb2YgaXRzIGluLWZsb3cgY2hpbGRyZW4ncyBtYXJnaW5zIChpZiBh
bnkpIGNvbGxhcHNlLgotICAgIGlmIChoYXNCb3JkZXJCZWZvcmUobGF5b3V0Qm94KSB8fCBoYXNC
b3JkZXJBZnRlcihsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAo
aGFzUGFkZGluZ0JlZm9yZShsYXlvdXRCb3gpIHx8IGhhc1BhZGRpbmdBZnRlcihsYXlvdXRCb3gp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIGFyZSBub3QgYWRqb2lu
aW5nIHdoZW4gdGhlIGJveCBoYXMgY2xlYXJhbmNlLgotICAgIGlmIChoYXNDbGVhcmFuY2UobGF5
b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXV0byYgc3R5bGUgPSBsYXlv
dXRCb3guc3R5bGUoKTsKLSAgICBhdXRvIGNvbXB1dGVkSGVpZ2h0VmFsdWVJc1plcm8gPSBzdHls
ZS5oZWlnaHQoKS5pc0ZpeGVkKCkgJiYgIXN0eWxlLmhlaWdodCgpLnZhbHVlKCk7Ci0gICAgaWYg
KCEoc3R5bGUuaGVpZ2h0KCkuaXNBdXRvKCkgfHwgY29tcHV0ZWRIZWlnaHRWYWx1ZUlzWmVybykp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIEZJWE1FOiBDaGVjayBmb3IgY29tcHV0
ZWQgMCBoZWlnaHQuCi0gICAgaWYgKCFzdHlsZS5taW5IZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gRklYTUU6IEJsb2NrIHJlcGxhY2VkIGJveGVzIGNs
ZWFybHkgZG9uJ3QgY29sbGFwc2UgdGhyb3VnaCB0aGVpciBtYXJnaW5zLCBidXQgSSBjb3VsZG4n
dCBmaW5kIGl0IGluIHRoZSBzcGVjIHlldCAoYW5kIG5vLCBpdCdzIG5vdCBhIHF1aXJrKS4KLSAg
ICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiB0
cnVlOwotCi0gICAgaWYgKCFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5G
bG93Q2hpbGQoKSkKLSAgICAgICAgcmV0dXJuICFlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0Nv
bnRleHQobGF5b3V0Qm94KTsKLQotICAgIGlmIChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0
aW5nQ29udGV4dCgpKSB7Ci0gICAgICAgIGlmIChsYXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICBhdXRvJiBsYXlvdXRTdGF0ZSA9IHRo
aXMtPmxheW91dFN0YXRlKCk7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB0aHJvdWdo
IG1hcmdpbiBlc3RpbWF0aW9uLCB3ZSBkb24ndCBuZWNlc3NhcmlseSBoYXZlIGFuIGFjdHVhbCBz
dGF0ZSBmb3IgdGhpcyBsYXlvdXQgYm94IHNpbmNlCi0gICAgICAgICAgICAvLyB3ZSBoYXZlbid0
IHN0YXJ0ZWQgbGF5aW5nIGl0IG91dCB5ZXQuCi0gICAgICAgICAgICBhdXRvJiBjb250YWluZXJC
b3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7Ci0gICAgICAgICAgICBpZiAo
IWxheW91dFN0YXRlLmhhc0lubGluZUZvcm1hdHRpbmdTdGF0ZShjb250YWluZXJCb3gpKQotICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgYXV0byBpc0NvbnNpZGVy
ZWRFbXB0eSA9IFsmXSB7Ci0gICAgICAgICAgICAgICAgYXV0byYgaW5saW5lRm9ybWF0dGluZ1N0
YXRlID0gbGF5b3V0U3RhdGUuZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUoY29udGFp
bmVyQm94KTsKLSAgICAgICAgICAgICAgICBpZiAoIWlubGluZUZvcm1hdHRpbmdTdGF0ZS5saW5l
cygpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICAgICAgICAgIC8vIEFueSBmbG9hdCBib3ggaW4gdGhpcyBmb3JtYXR0aW5nIGNvbnRleHQgcHJl
dmVudHMgY29sbGFwc2luZyB0aHJvdWdoLgotICAgICAgICAgICAgICAgIGF1dG8mIGZsb2F0cyA9
IGlubGluZUZvcm1hdHRpbmdTdGF0ZS5mbG9hdGluZ1N0YXRlKCkuZmxvYXRzKCk7Ci0gICAgICAg
ICAgICAgICAgZm9yIChhdXRvJiBmbG9hdEl0ZW0gOiBmbG9hdHMpIHsKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKGZsb2F0SXRlbS5pc0luRm9ybWF0dGluZ0NvbnRleHRPZihjb250YWluZXJCb3gp
KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH07Ci0gICAgICAg
ICAgICByZXR1cm4gaXNDb25zaWRlcmVkRW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8v
IEEgcm9vdCBvZiBhIG5vbi1pbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0ICh0YWJsZSwgZmxleCBl
dGMpIHdpdGggaW5mbG93IGRlc2NlbmRhbnRzIHNob3VsZCBub3QgY29sbGFwc2UgdGhyb3VnaC4K
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoYXV0byogaW5mbG93Q2hp
bGQgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0
aW5nQ2hpbGQoKTsgaW5mbG93Q2hpbGQ7IGluZmxvd0NoaWxkID0gaW5mbG93Q2hpbGQtPm5leHRJ
bkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7Ci0gICAgICAgIGlmIChlc3RhYmxpc2hlc0Jsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQoKmluZmxvd0NoaWxkKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgaWYgKCFtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKCppbmZsb3dDaGlsZCkpCi0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1V
c2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tG
b3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OmNvbXB1dGVkUG9zaXRpdmVBbmROZWdh
dGl2ZU1hcmdpbihVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpW
YWx1ZXMgYSwgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFs
dWVzIGIpIGNvbnN0Ci17Ci0gICAgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0
aXZlUGFpcjo6VmFsdWVzIGNvbXB1dGVkVmFsdWVzOwotICAgIGlmIChhLnBvc2l0aXZlICYmIGIu
cG9zaXRpdmUpCi0gICAgICAgIGNvbXB1dGVkVmFsdWVzLnBvc2l0aXZlID0gc3RkOjptYXgoKmEu
cG9zaXRpdmUsICpiLnBvc2l0aXZlKTsKLSAgICBlbHNlCi0gICAgICAgIGNvbXB1dGVkVmFsdWVz
LnBvc2l0aXZlID0gYS5wb3NpdGl2ZSA/IGEucG9zaXRpdmUgOiBiLnBvc2l0aXZlOwotCi0gICAg
aWYgKGEubmVnYXRpdmUgJiYgYi5uZWdhdGl2ZSkKLSAgICAgICAgY29tcHV0ZWRWYWx1ZXMubmVn
YXRpdmUgPSBzdGQ6Om1pbigqYS5uZWdhdGl2ZSwgKmIubmVnYXRpdmUpOwotICAgIGVsc2UKLSAg
ICAgICAgY29tcHV0ZWRWYWx1ZXMubmVnYXRpdmUgPSBhLm5lZ2F0aXZlID8gYS5uZWdhdGl2ZSA6
IGIubmVnYXRpdmU7Ci0KLSAgICBpZiAoYS5pc05vblplcm8oKSAmJiBiLmlzTm9uWmVybygpKQot
ICAgICAgICBjb21wdXRlZFZhbHVlcy5pc1F1aXJrID0gYS5pc1F1aXJrIHx8IGIuaXNRdWlyazsK
LSAgICBlbHNlIGlmIChhLmlzTm9uWmVybygpKQotICAgICAgICBjb21wdXRlZFZhbHVlcy5pc1F1
aXJrID0gYS5pc1F1aXJrOwotICAgIGVsc2UKLSAgICAgICAgY29tcHV0ZWRWYWx1ZXMuaXNRdWly
ayA9IGIuaXNRdWlyazsKLQotICAgIHJldHVybiBjb21wdXRlZFZhbHVlczsKLX0KLQotT3B0aW9u
YWw8TGF5b3V0VW5pdD4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1h
cmdpblZhbHVlKFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZh
bHVlcyBtYXJnaW5WYWx1ZXMpIGNvbnN0Ci17Ci0gICAgLy8gV2hlbiB0d28gb3IgbW9yZSBtYXJn
aW5zIGNvbGxhcHNlLCB0aGUgcmVzdWx0aW5nIG1hcmdpbiB3aWR0aCBpcyB0aGUgbWF4aW11bSBv
ZiB0aGUgY29sbGFwc2luZyBtYXJnaW5zJyB3aWR0aHMuCi0gICAgLy8gSW4gdGhlIGNhc2Ugb2Yg
bmVnYXRpdmUgbWFyZ2lucywgdGhlIG1heGltdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0
aGUgbmVnYXRpdmUgYWRqb2luaW5nIG1hcmdpbnMgaXMgZGVkdWN0ZWQgZnJvbSB0aGUgbWF4aW11
bQotICAgIC8vIG9mIHRoZSBwb3NpdGl2ZSBhZGpvaW5pbmcgbWFyZ2lucy4gSWYgdGhlcmUgYXJl
IG5vIHBvc2l0aXZlIG1hcmdpbnMsIHRoZSBtYXhpbXVtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZXMg
b2YgdGhlIGFkam9pbmluZyBtYXJnaW5zIGlzIGRlZHVjdGVkIGZyb20gemVyby4KLSAgICBpZiAo
IW1hcmdpblZhbHVlcy5uZWdhdGl2ZSkKLSAgICAgICAgcmV0dXJuIG1hcmdpblZhbHVlcy5wb3Np
dGl2ZTsKLQotICAgIGlmICghbWFyZ2luVmFsdWVzLnBvc2l0aXZlKQotICAgICAgICByZXR1cm4g
bWFyZ2luVmFsdWVzLm5lZ2F0aXZlOwotCi0gICAgcmV0dXJuICptYXJnaW5WYWx1ZXMucG9zaXRp
dmUgKyAqbWFyZ2luVmFsdWVzLm5lZ2F0aXZlOwotfQotCi12b2lkIEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjp1cGRhdGVNYXJnaW5BZnRlckZvclByZXZpb3VzU2libGlu
ZyhCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBibG9ja0Zvcm1hdHRpbmdDb250ZXh0LCBjb25zdCBN
YXJnaW5Db2xsYXBzZSYgbWFyZ2luQ29sbGFwc2UsIGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewot
ICAgIC8vIDEuIEdldCB0aGUgbWFyZ2luIGJlZm9yZSB2YWx1ZSBmcm9tIHRoZSBuZXh0IGluLWZs
b3cgc2libGluZy4gVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGlzIGJveCdzIG1hcmdpbiBhZnRlciB2
YWx1ZSBub3cgc2luY2UgdGhleSBhcmUgY29sbGFwc2VkLgotICAgIC8vIDIuIFVwZGF0ZSB0aGUg
Y29sbGFwc2VkIG1hcmdpbiBhZnRlciB2YWx1ZSBhcyB3ZWxsIGFzIHRoZSBwb3NpdGl2ZS9uZWdh
dGl2ZSBjYWNoZS4KLSAgICAvLyAzLiBDaGVjayBpZiB0aGUgYm94J3MgbWFyZ2lucyBjb2xsYXBz
ZSB0aHJvdWdoLgotICAgIC8vIDQuIElmIHNvLCB1cGRhdGUgdGhlIHBvc2l0aXZlL25lZ2F0aXZl
IGNhY2hlLgotICAgIC8vIDUuIEluIGNhc2Ugb2YgY29sbGFwc2VkIHRocm91Z2ggbWFyZ2lucyBj
aGVjayBpZiB0aGUgYmVmb3JlIG1hcmdpbiBjb2xsYXBlcyB3aXRoIHRoZSBwcmV2aW91cyBpbmZs
b3cgc2libGluZydzIGFmdGVyIG1hcmdpbi4KLSAgICAvLyA2LiBJZiBzbywganVtcCB0byAjMi4K
LSAgICAvLyA3LiBObyBuZWVkIHRvIHByb3BhZ2F0ZSB0byBwYXJlbnQgYmVjYXVzZSBpdHMgbWFy
Z2luIGlzIG5vdCBjb21wdXRlZCB5ZXQgKHByZS1jb21wdXRlZCBhdCBtb3N0KS4KLSAgICBhdXRv
KiBjdXJyZW50Qm94ID0gJmxheW91dEJveDsKLSAgICBhdXRvJiBibG9ja0Zvcm1hdHRpbmdTdGF0
ZSA9IGJsb2NrRm9ybWF0dGluZ0NvbnRleHQuZm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgd2hpbGUg
KG1hcmdpbkNvbGxhcHNlLm1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdN
YXJnaW5BZnRlcigqY3VycmVudEJveCkpIHsKLSAgICAgICAgYXV0byYgcHJldmlvdXNTaWJsaW5n
ID0gKmN1cnJlbnRCb3gtPnByZXZpb3VzSW5GbG93U2libGluZygpOwotICAgICAgICBhdXRvIHBy
ZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luID0gYmxvY2tGb3JtYXR0aW5nU3RhdGUudXNlZFZl
cnRpY2FsTWFyZ2luKHByZXZpb3VzU2libGluZyk7Ci0KLSAgICAgICAgYXV0byBjb2xsYXBzZWRW
ZXJ0aWNhbE1hcmdpbkJlZm9yZSA9IHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLmNvbGxh
cHNlZFZhbHVlcy5iZWZvcmU7Ci0gICAgICAgIGF1dG8gY29sbGFwc2VkVmVydGljYWxNYXJnaW5B
ZnRlciA9IGJsb2NrRm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goKmN1cnJlbnRCb3gp
Lm1hcmdpbkJlZm9yZSgpOwotCi0gICAgICAgIGF1dG8gbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCA9
IG1hcmdpbkNvbGxhcHNlLm1hcmdpbnNDb2xsYXBzZVRocm91Z2gocHJldmlvdXNTaWJsaW5nKTsK
LSAgICAgICAgaWYgKG1hcmdpbnNDb2xsYXBzZVRocm91Z2gpCi0gICAgICAgICAgICBjb2xsYXBz
ZWRWZXJ0aWNhbE1hcmdpbkJlZm9yZSA9IGNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luQWZ0ZXI7Ci0K
LSAgICAgICAgLy8gVXBkYXRlIHBvc2l0aXZlL25lZ2F0aXZlIGNhY2hlLgotICAgICAgICBhdXRv
IHByZXZpb3VzU2libGluZ1Bvc2l0aXZlTmVnYXRpdmVNYXJnaW4gPSBibG9ja0Zvcm1hdHRpbmdT
dGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNTaWJsaW5nKS5wb3NpdGl2ZUFuZE5lZ2F0
aXZlVmFsdWVzOwotICAgICAgICBhdXRvIHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUgPSBi
bG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4oKmN1cnJlbnRCb3gpLnBvc2l0
aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlOwotCi0gICAgICAgIGF1dG8gYWRqdXN0ZWRQcmV2
aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbiA9IHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2lu
OwotICAgICAgICBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZl
QW5kTmVnYXRpdmVWYWx1ZXMuYWZ0ZXIgPSBtYXJnaW5Db2xsYXBzZS5jb21wdXRlZFBvc2l0aXZl
QW5kTmVnYXRpdmVNYXJnaW4ocG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSwgcHJldmlvdXNT
aWJsaW5nUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbi5hZnRlcik7Ci0gICAgICAgIGlmIChtYXJnaW5z
Q29sbGFwc2VUaHJvdWdoKSB7Ci0gICAgICAgICAgICBhZGp1c3RlZFByZXZpb3VzU2libGluZ1Zl
cnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlID0gbWFyZ2luQ29s
bGFwc2UuY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKHByZXZpb3VzU2libGluZ1Bv
c2l0aXZlTmVnYXRpdmVNYXJnaW4uYmVmb3JlLCBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRp
Y2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0ZXIpOwotICAgICAgICAgICAg
YWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbi5wb3NpdGl2ZUFuZE5lZ2F0aXZl
VmFsdWVzLmFmdGVyID0gYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbi5wb3Np
dGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmJlZm9yZTsKLSAgICAgICAgfQotICAgICAgICBibG9ja0Zv
cm1hdHRpbmdTdGF0ZS5zZXRVc2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNTaWJsaW5nLCBhZGp1
c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luKTsKLQotICAgICAgICBpZiAoIW1hcmdp
bnNDb2xsYXBzZVRocm91Z2gpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjdXJyZW50
Qm94ID0gJnByZXZpb3VzU2libGluZzsKLSAgICB9Ci19Ci0KLVVzZWRWZXJ0aWNhbE1hcmdpbjo6
UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpN
YXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdhdGl2ZVZhbHVlcyhjb25zdCBCb3gmIGxheW91dEJv
eCwgTWFyZ2luVHlwZSBtYXJnaW5UeXBlKSBjb25zdAotewotICAgIGF1dG8mIGZvcm1hdHRpbmdT
dGF0ZSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgLy8gQnkg
dGhlIHRpbWUgd2UgZ2V0IGhlcmUgaW4gQkZDIGxheW91dCB0byBnYXRoZXIgcG9zaXRpdmUgYW5k
IG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZm9yIGVpdGhlciBhIHByZXZpb3VzIHNpYmxpbmcgb3Ig
YSBjaGlsZCBib3gsCi0gICAgLy8gd2UgbXVzaCBoYXZlIGNvbXB1dGVkIGFuZCBjYWNoZWQgdGhv
c2UgdmFsdWVzLgotICAgIEFTU0VSVChmb3JtYXR0aW5nU3RhdGUuaGFzVXNlZFZlcnRpY2FsTWFy
Z2luKGxheW91dEJveCkpOwotICAgIGF1dG8gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFy
Z2luID0gZm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpLnBvc2l0
aXZlQW5kTmVnYXRpdmVWYWx1ZXM7Ci0gICAgcmV0dXJuIG1hcmdpblR5cGUgPT0gTWFyZ2luVHlw
ZTo6QmVmb3JlID8gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSA6IHBv
c2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5hZnRlcjsgCi19Ci0KLVVzZWRWZXJ0aWNh
bE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShjb25z
dCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMg
bm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAotewotICAgIGF1dG8gZmlyc3RDaGlsZENvbGxhcHNl
ZE1hcmdpbkJlZm9yZSA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmRO
ZWdhdGl2ZVBhaXI6OlZhbHVlcyB7Ci0gICAgICAgIGlmICghbWFyZ2luQmVmb3JlQ29sbGFwc2Vz
V2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJnaW5CZWZvcmUobGF5b3V0Qm94KSkKLSAgICAgICAgICAg
IHJldHVybiB7IH07Ci0gICAgICAgIHJldHVybiBwb3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKCpkb3du
Y2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dDaGlsZCgpLCBNYXJnaW5U
eXBlOjpCZWZvcmUpOwotICAgIH07Ci0KLSAgICBhdXRvIHByZXZpb3VTaWJsaW5nQ29sbGFwc2Vk
TWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVn
YXRpdmVQYWlyOjpWYWx1ZXMgewotICAgICAgICBpZiAoIW1hcmdpbkJlZm9yZUNvbGxhcHNlc1dp
dGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcihsYXlvdXRCb3gpKQotICAgICAgICAgICAgcmV0
dXJuIHsgfTsKLSAgICAgICAgcmV0dXJuIHBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMoKmxheW91dEJv
eC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSwgTWFyZ2luVHlwZTo6QWZ0ZXIpOwotICAgIH07Ci0K
LSAgICAvLyAxLiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZnJv
bSBmaXJzdCBjaGlsZCBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcuCi0gICAgLy8gMi4gR2F0aGVy
IHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWVzIGZyb20gcHJldmlvdXMgaW5mbG93
IHNpYmxpbmcgaWYgbWFyZ2lucyBhcmUgYWRqb2luaW5nLgotICAgIC8vIDMuIENvbXB1dGUgbWlu
L21heCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgY29sbGFwc2VkIG1hcmdpbiB2YWx1ZXMgdXNpbmcg
bm9uLWNvbGxwYXNlZCBjb21wdXRlZCBtYXJnaW4gYmVmb3JlLgotICAgIGF1dG8gY29sbGFwc2Vk
TWFyZ2luQmVmb3JlID0gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKGZpcnN0Q2hp
bGRDb2xsYXBzZWRNYXJnaW5CZWZvcmUoKSwgcHJldmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5B
ZnRlcigpKTsKLSAgICBpZiAoY29sbGFwc2VkTWFyZ2luQmVmb3JlLmlzUXVpcmsgJiYgZm9ybWF0
dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihs
YXlvdXRCb3gpKQotICAgICAgICBjb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSB7IH07Ci0KLSAgICBV
c2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgbm9uQ29s
bGFwc2VkQmVmb3JlOwotICAgIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlID4gMCkKLSAg
ICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0geyBub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlLCB7
IH0sIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkgfTsKLSAgICBlbHNl
IGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlIDwgMCkKLSAgICAgICAgbm9uQ29sbGFwc2Vk
QmVmb3JlID0geyB7IH0sIG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUsIGxheW91dEJveC5zdHls
ZSgpLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkgfTsKLQotICAgIHJldHVybiBjb21wdXRlZFBvc2l0
aXZlQW5kTmVnYXRpdmVNYXJnaW4oY29sbGFwc2VkTWFyZ2luQmVmb3JlLCBub25Db2xsYXBzZWRC
ZWZvcmUpOwotfQotCi1Vc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWly
OjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OnBvc2l0aXZl
TmVnYXRpdmVNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFy
Z2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAotewotICAg
IGF1dG8gbGFzdENoaWxkQ29sbGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGlj
YWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgewotICAgICAgICBpZiAo
IW1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFmdGVyKGxheW91
dEJveCkpCi0gICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICByZXR1cm4gcG9zaXRpdmVO
ZWdhdGl2ZVZhbHVlcygqZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmxhc3RJbkZs
b3dDaGlsZCgpLCBNYXJnaW5UeXBlOjpBZnRlcik7Ci0gICAgfTsKLQotICAgIC8vIFdlIGRvbid0
IGtub3cgeWV0IHRoZSBtYXJnaW4gYmVmb3JlIHZhbHVlIG9mIHRoZSBuZXh0IHNpYmxpbmcuIExl
dCdzIGp1c3QgcHJldGVuZCBpdCBkb2VzIG5vdCBoYXZlIG9uZSBhbmQgCi0gICAgLy8gdXBkYXRl
IGl0IGxhdGVyIHdoZW4gd2UgY29tcHV0ZSB0aGUgbmV4dCBzaWJsaW5nJ3MgbWFyZ2luIGJlZm9y
ZS4gU2VlIHVwZGF0ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nLgotICAgIFVzZWRWZXJ0
aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBub25Db2xsYXBzZWRB
ZnRlcjsKLSAgICBpZiAobm9uQ29sbGFwc2VkVmFsdWVzLmFmdGVyID4gMCkKLSAgICAgICAgbm9u
Q29sbGFwc2VkQWZ0ZXIgPSB7IG5vbkNvbGxhcHNlZFZhbHVlcy5hZnRlciwgeyB9LCBsYXlvdXRC
b3guc3R5bGUoKS5oYXNNYXJnaW5BZnRlclF1aXJrKCkgfTsKLSAgICBlbHNlIGlmIChub25Db2xs
YXBzZWRWYWx1ZXMuYWZ0ZXIgPCAwKQotICAgICAgICBub25Db2xsYXBzZWRBZnRlciA9IHsgeyB9
LCBub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIsIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkFm
dGVyUXVpcmsoKSB9OwotCi0gICAgcmV0dXJuIGNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1h
cmdpbihsYXN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5BZnRlcigpLCBub25Db2xsYXBzZWRBZnRlcik7
Ci19Ci0KLUxheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6
Om1hcmdpbkJlZm9yZUlnbm9yaW5nQ29sbGFwc2luZ1Rocm91Z2goY29uc3QgQm94JiBsYXlvdXRC
b3gsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIG5vbkNvbGxhcHNlZFZh
bHVlcykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLSAgICBy
ZXR1cm4gbWFyZ2luVmFsdWUocG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gs
IG5vbkNvbGxhcHNlZFZhbHVlcykpLnZhbHVlT3Iobm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSk7
Ci19Ci0KLVVzZWRWZXJ0aWNhbE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5D
b2xsYXBzZTo6Y29sbGFwc2VkVmVydGljYWxWYWx1ZXMoY29uc3QgQm94JiBsYXlvdXRCb3gsIFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIG5vbkNvbGxhcHNlZFZhbHVlcykK
LXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLSAgICAvLyAxLiBH
ZXQgbWluL21heCBtYXJnaW4gdG9wIHZhbHVlcyBmcm9tIHRoZSBmaXJzdCBpbi1mbG93IGNoaWxk
IGlmIHdlIGFyZSBjb2xsYXBzaW5nIG1hcmdpbiB0b3Agd2l0aCBpdC4KLSAgICAvLyAyLiBHZXQg
bWluL21heCBtYXJnaW4gdG9wIHZhbHVlcyBmcm9tIHRoZSBwcmV2aW91cyBpbi1mbG93IHNpYmxp
bmcsIGlmIHdlIGFyZSBjb2xsYXBzaW5nIG1hcmdpbiB0b3Agd2l0aCBpdC4KLSAgICAvLyAzLiBH
ZXQgdGhpcyBsYXlvdXQgYm94J3MgY29tcHV0ZWQgbWFyZ2luIHRvcCB2YWx1ZS4KLSAgICAvLyA0
LiBVcGRhdGUgdGhlIG1pbi9tYXggdmFsdWUgYW5kIGNvbXB1dGUgdGhlIGZpbmFsIG1hcmdpbi4K
LSAgICBhdXRvIHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNh
bE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXIgeyB0aGlzLT5wb3NpdGl2ZU5lZ2F0aXZl
TWFyZ2luQmVmb3JlKGxheW91dEJveCwgbm9uQ29sbGFwc2VkVmFsdWVzKSwgdGhpcy0+cG9zaXRp
dmVOZWdhdGl2ZU1hcmdpbkFmdGVyKGxheW91dEJveCwgbm9uQ29sbGFwc2VkVmFsdWVzKSB9Owot
Ci0gICAgYXV0byBtYXJnaW5zQ29sbGFwc2VUaHJvdWdoID0gdGhpcy0+bWFyZ2luc0NvbGxhcHNl
VGhyb3VnaChsYXlvdXRCb3gpOwotICAgIGlmIChtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKSB7Ci0g
ICAgICAgIHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPSBjb21wdXRl
ZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4ocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFy
Z2luLmJlZm9yZSwgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyKTsKLSAg
ICAgICAgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyID0gcG9zaXRpdmVB
bmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZTsKLSAgICB9Ci0KLSAgICBhdXRvIGhhc0Nv
bGxhcHNlZE1hcmdpbkJlZm9yZSA9IG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxv
d0NoaWxkTWFyZ2luQmVmb3JlKGxheW91dEJveCkgfHwgbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0
aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGxheW91dEJveCk7Ci0gICAgYXV0byBoYXNDb2xs
YXBzZWRNYXJnaW5BZnRlciA9IG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aExhc3RJbkZsb3dDaGls
ZE1hcmdpbkFmdGVyKGxheW91dEJveCk7Ci0gICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBV
c2VkVmVydGljYWxNYXJnaW4geyBub25Db2xsYXBzZWRWYWx1ZXMsIHsgfSwgcG9zaXRpdmVBbmRO
ZWdhdGl2ZVZlcnRpY2FsTWFyZ2luIH07Ci0KLSAgICBpZiAoKGhhc0NvbGxhcHNlZE1hcmdpbkJl
Zm9yZSAmJiBoYXNDb2xsYXBzZWRNYXJnaW5BZnRlcikgfHwgbWFyZ2luc0NvbGxhcHNlVGhyb3Vn
aCkKLSAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luLmNvbGxhcHNlZFZhbHVlcyA9IHsgbWFyZ2lu
VmFsdWUocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSksIG1hcmdpblZh
bHVlKHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5hZnRlciksIG1hcmdpbnNDb2xs
YXBzZVRocm91Z2ggfTsKLSAgICBlbHNlIGlmIChoYXNDb2xsYXBzZWRNYXJnaW5CZWZvcmUpCi0g
ICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1ZXMgPSB7IG1hcmdpblZhbHVl
KHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5iZWZvcmUpLCB7IH0sIGZhbHNlIH07
Ci0gICAgZWxzZSBpZiAoaGFzQ29sbGFwc2VkTWFyZ2luQWZ0ZXIpCi0gICAgICAgIHVzZWRWZXJ0
aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1ZXMgPSB7IHsgfSwgbWFyZ2luVmFsdWUocG9zaXRpdmVB
bmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyKSwgZmFsc2UgfTsKLSAgICByZXR1cm4gdXNl
ZFZlcnRpY2FsTWFyZ2luOwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvUHJlY29tcHV0ZWRCbG9ja01hcmdpbkNvbGxh
cHNlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvUHJlY29tcHV0
ZWRCbG9ja01hcmdpbkNvbGxhcHNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
ZGVmYjNkNTU0ZmU2OGRlNDI3MzFmZjhlMmQ0YjIwZWFiZjY1OWVjMi4uMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxv
Y2tmb3JtYXR0aW5nL1ByZWNvbXB1dGVkQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAKKysrIC9kZXYv
bnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwot
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIK
LSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VU
X0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgi
Ci0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94Lmgi
Ci0jaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKLSNpbmNsdWRlICJMYXlvdXRVbml0LmgiCi0jaW5j
bHVkZSAiUmVuZGVyU3R5bGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExh
eW91dCB7Ci0KLVVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZh
bHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cHJlY29tcHV0ZWRQ
b3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAg
IGF1dG8mIGJsb2NrRm9ybWF0dGluZ1N0YXRlID0gZG93bmNhc3Q8QmxvY2tGb3JtYXR0aW5nU3Rh
dGU+KGxheW91dFN0YXRlKCkuZm9ybWF0dGluZ1N0YXRlRm9yQm94KGxheW91dEJveCkpOwotICAg
IGlmIChibG9ja0Zvcm1hdHRpbmdTdGF0ZS5oYXNVc2VkVmVydGljYWxNYXJnaW4obGF5b3V0Qm94
KSkKLSAgICAgICAgcmV0dXJuIGJsb2NrRm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdp
bihsYXlvdXRCb3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlOwotCi0gICAgYXV0
byBnZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnkoKTsKLSAgICBhdXRvIGhv
cml6b250YWxDb25zdHJhaW50cyA9IGdlb21ldHJ5LmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVu
dChsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkpLmhvcml6b250YWw7Ci0gICAgYXV0byBjb21w
dXRlZFZlcnRpY2FsTWFyZ2luID0gZ2VvbWV0cnkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihsYXlv
dXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgYXV0byBub25Db2xsYXBzZWRNYXJn
aW4gPSBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB7IGNvbXB1dGVkVmVy
dGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0
ZXIudmFsdWVPcigwKSB9OwotICAgIHJldHVybiBwcmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVN
YXJnaW5CZWZvcmUobGF5b3V0Qm94LCBub25Db2xsYXBzZWRNYXJnaW4pOwotfQotCi1Vc2VkVmVy
dGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OnByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZU1h
cmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25D
b2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAotewotICAgIGF1dG8gZmly
c3RDaGlsZENvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1hcmdp
bjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7Ci0gICAgICAgIGlmICghbWFyZ2lu
QmVmb3JlQ29sbGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJnaW5CZWZvcmUobGF5b3V0Qm94
KSkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIHJldHVybiBwcmVjb21wdXRlZFBv
c2l0aXZlTmVnYXRpdmVWYWx1ZXMoKmRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5m
aXJzdEluRmxvd0NoaWxkKCkpOwotICAgIH07Ci0KLSAgICBhdXRvIHByZXZpb3VTaWJsaW5nQ29s
bGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZl
QW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgewotICAgICAgICBpZiAoIW1hcmdpbkJlZm9yZUNvbGxh
cHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcihsYXlvdXRCb3gpKQotICAgICAgICAg
ICAgcmV0dXJuIHsgfTsKLSAgICAgICAgYXV0byYgcHJldmlvdXNJbkZsb3dTaWJsaW5nID0gKmxh
eW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKTsKLSAgICAgICAgYXV0byYgYmxvY2tGb3Jt
YXR0aW5nU3RhdGUgPSBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4obGF5b3V0U3RhdGUo
KS5mb3JtYXR0aW5nU3RhdGVGb3JCb3gocHJldmlvdXNJbkZsb3dTaWJsaW5nKSk7Ci0gICAgICAg
IHJldHVybiBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNJ
bkZsb3dTaWJsaW5nKS5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmFmdGVyOwotICAgIH07Ci0K
LSAgICAvLyAxLiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZnJv
bSBmaXJzdCBjaGlsZCBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcuCi0gICAgLy8gMi4gR2F0aGVy
IHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWVzIGZyb20gcHJldmlvdXMgaW5mbG93
IHNpYmxpbmcgaWYgbWFyZ2lucyBhcmUgYWRqb2luaW5nLgotICAgIC8vIDMuIENvbXB1dGUgbWlu
L21heCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgY29sbGFwc2VkIG1hcmdpbiB2YWx1ZXMgdXNpbmcg
bm9uLWNvbGxwYXNlZCBjb21wdXRlZCBtYXJnaW4gYmVmb3JlLgotICAgIGF1dG8gY29sbGFwc2Vk
TWFyZ2luQmVmb3JlID0gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKGZpcnN0Q2hp
bGRDb2xsYXBzZWRNYXJnaW5CZWZvcmUoKSwgcHJldmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5B
ZnRlcigpKTsKLSAgICBpZiAoY29sbGFwc2VkTWFyZ2luQmVmb3JlLmlzUXVpcmsgJiYgZm9ybWF0
dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihs
YXlvdXRCb3gpKQotICAgICAgICBjb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSB7IH07Ci0KLSAgICBh
dXRvIG5vbkNvbGxhcHNlZEJlZm9yZSA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmRO
ZWdhdGl2ZVBhaXI6OlZhbHVlcyB7IH07Ci0gICAgaWYgKG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZv
cmUgPiAwKQotICAgICAgICBub25Db2xsYXBzZWRCZWZvcmUgPSB7IG5vbkNvbGxhcHNlZFZhbHVl
cy5iZWZvcmUsIHsgfSwgbGF5b3V0Qm94LnN0eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSB9
OwotICAgIGVsc2UgaWYgKG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUgPCAwKQotICAgICAgICBu
b25Db2xsYXBzZWRCZWZvcmUgPSB7IHsgfSwgbm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSwgbGF5
b3V0Qm94LnN0eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSB9OwotCi0gICAgcmV0dXJuIGNv
bXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihjb2xsYXBzZWRNYXJnaW5CZWZvcmUsIG5v
bkNvbGxhcHNlZEJlZm9yZSk7Ci19Ci0KLVByZWNvbXB1dGVkTWFyZ2luQmVmb3JlIEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjpwcmVjb21wdXRlZE1hcmdpbkJlZm9yZShj
b25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1
ZXMgdXNlZE5vbkNvbGxhcHNlZE1hcmdpbikKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxv
Y2tMZXZlbEJveCgpKTsKLSAgICAvLyBEb24ndCBwcmUtY29tcHV0ZSB2ZXJ0aWNhbCBtYXJnaW5z
IGZvciBvdXQgb2YgZmxvdyBib3hlcy4KLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5GbG93KCkg
fHwgbGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOwotICAgIEFTU0VSVCghbGF5b3V0
Qm94LmlzUmVwbGFjZWRCb3goKSk7Ci0KLSAgICBhdXRvIHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5C
ZWZvcmUgPSBwcmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUobGF5b3V0Qm94
LCB1c2VkTm9uQ29sbGFwc2VkTWFyZ2luKTsKLSAgICBhdXRvIGNvbGxhcHNlZE1hcmdpbkJlZm9y
ZSA9IG1hcmdpblZhbHVlKHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUpOwotICAgIHJldHVy
biB7IHVzZWROb25Db2xsYXBzZWRNYXJnaW4uYmVmb3JlLCBjb2xsYXBzZWRNYXJnaW5CZWZvcmUs
IHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUgfTsKLX0KLQotfQotfQotI2VuZGlmCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBl
ci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9y
bWF0dGluZ0NvbnRleHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzZkZjY1
Y2E0YmI3MTM2MDRlYWI3MDAxNmNmN2RlZjFjMjJmMDRkLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1h
dHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3Bw
CisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAi
Y29uZmlnLmgiCi0jaW5jbHVkZSAiVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5o
IgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJC
bG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkludmFsaWRhdGlvblN0YXRlLmgiCi0j
aW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDaGlsZEl0ZXJh
dG9yLmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRp
YWxDb250YWluaW5nQmxvY2suaCIKLSNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdDb250ZXh0Lmgi
Ci0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUg
ewotbmFtZXNwYWNlIExheW91dCB7Ci0KLVdURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChUYWJs
ZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KTsKLQotVGFibGVXcmFwcGVyQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dDo6VGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dChjb25zdCBD
b250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgQmxvY2tGb3JtYXR0aW5nU3RhdGUm
IGZvcm1hdHRpbmdTdGF0ZSkKLSAgICA6IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGlu
Z0NvbnRleHRSb290LCBmb3JtYXR0aW5nU3RhdGUpCi17Ci19Ci0KLXZvaWQgVGFibGVXcmFwcGVy
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0SW5GbG93Q29udGVudChJbnZhbGlkYXRpb25T
dGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCi17
Ci0gICAgLy8gVGhlIHRhYmxlIGdlbmVyYXRlcyBhIHByaW5jaXBhbCBibG9jayBjb250YWluZXIg
Ym94IGNhbGxlZCB0aGUgdGFibGUgd3JhcHBlciBib3ggdGhhdCBjb250YWlucyB0aGUgdGFibGUg
Ym94IGl0c2VsZiBhbmQgYW55IGNhcHRpb24gYm94ZXMKLSAgICAvLyAoaW4gZG9jdW1lbnQgb3Jk
ZXIpLiBUaGUgdGFibGUgYm94IGlzIGEgYmxvY2stbGV2ZWwgYm94IHRoYXQgY29udGFpbnMgdGhl
IHRhYmxlJ3MgaW50ZXJuYWwgdGFibGUgYm94ZXMuCi0gICAgLy8gVGhlIGNhcHRpb24gYm94ZXMg
YXJlIHByaW5jaXBhbCBibG9jay1sZXZlbCBib3hlcyB0aGF0IHJldGFpbiB0aGVpciBvd24gY29u
dGVudCwgcGFkZGluZywgbWFyZ2luLCBhbmQgYm9yZGVyIGFyZWFzLCBhbmQgYXJlIHJlbmRlcmVk
Ci0gICAgLy8gYXMgbm9ybWFsIGJsb2NrIGJveGVzIGluc2lkZSB0aGUgdGFibGUgd3JhcHBlciBi
b3guIFdoZXRoZXIgdGhlIGNhcHRpb24gYm94ZXMgYXJlIHBsYWNlZCBiZWZvcmUgb3IgYWZ0ZXIg
dGhlIHRhYmxlIGJveCBpcyBkZWNpZGVkIGJ5Ci0gICAgLy8gdGhlICdjYXB0aW9uLXNpZGUnIHBy
b3BlcnR5LCBhcyBkZXNjcmliZWQgYmVsb3cuCi0gICAgZm9yIChhdXRvJiBjaGlsZCA6IGNoaWxk
cmVuT2ZUeXBlPENvbnRhaW5lckJveD4ocm9vdCgpKSkgewotICAgICAgICBpZiAoY2hpbGQuaXNU
YWJsZUJveCgpKQotICAgICAgICAgICAgbGF5b3V0VGFibGVCb3goY2hpbGQsIGNvbnN0cmFpbnRz
KTsKLSAgICAgICAgZWxzZSBpZiAoY2hpbGQuaXNUYWJsZUNhcHRpb24oKSkKLSAgICAgICAgICAg
IEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIH0KLX0KLQotdm9pZCBUYWJsZVdyYXBwZXJCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRh
YmxlQm94LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQot
ewotICAgIGxheW91dFN0YXRlKCkuZW5zdXJlVGFibGVGb3JtYXR0aW5nU3RhdGUodGFibGVCb3gp
OwotCi0gICAgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmdGb3JUYWJsZUJveCh0YWJsZUJveCwgY29u
c3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgY29tcHV0ZVN0YXRpY1ZlcnRpY2FsUG9zaXRpb24o
dGFibGVCb3gsIGNvbnN0cmFpbnRzLnZlcnRpY2FsKTsKLSAgICBjb21wdXRlV2lkdGhBbmRNYXJn
aW5Gb3JUYWJsZUJveCh0YWJsZUJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgY29t
cHV0ZVN0YXRpY0hvcml6b250YWxQb3NpdGlvbih0YWJsZUJveCwgY29uc3RyYWludHMuaG9yaXpv
bnRhbCk7Ci0KLSAgICBpZiAodGFibGVCb3guaGFzQ2hpbGQoKSkgewotICAgICAgICBhdXRvIGlu
dmFsaWRhdGlvblN0YXRlID0gSW52YWxpZGF0aW9uU3RhdGUgeyB9OwotICAgICAgICBMYXlvdXRD
b250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dCh0YWJsZUJveCwgbGF5b3V0U3RhdGUoKSkt
PmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGdlb21ldHJ5KCkuY29uc3Ry
YWludHNGb3JJbkZsb3dDb250ZW50KHRhYmxlQm94KSk7Ci0gICAgfQotCi0gICAgY29tcHV0ZUhl
aWdodEFuZE1hcmdpbkZvclRhYmxlQm94KHRhYmxlQm94LCBjb25zdHJhaW50cyk7Ci19Ci0KLXZv
aWQgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUJvcmRlckFuZFBh
ZGRpbmdGb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBjb25zdCBIb3Jp
em9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKLXsKLSAgICBBU1NFUlQo
dGFibGVCb3guaXNUYWJsZUJveCgpKTsKLSAgICBpZiAoIXRhYmxlQm94Lmhhc0NoaWxkKCkgfHwg
dGFibGVCb3guc3R5bGUoKS5ib3JkZXJDb2xsYXBzZSgpID09IEJvcmRlckNvbGxhcHNlOjpTZXBh
cmF0ZSkgewotICAgICAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlQm9yZGVyQW5k
UGFkZGluZyh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLSAgICAvLyBVQXMgbXVzdCBjb21wdXRlIGFuIGluaXRpYWwgbGVmdCBhbmQgcmln
aHQgYm9yZGVyIHdpZHRoIGZvciB0aGUgdGFibGUgYnkgZXhhbWluaW5nCi0gICAgLy8gdGhlIGZp
cnN0IGFuZCBsYXN0IGNlbGxzIGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIHRhYmxlLgotICAgIC8v
IFRoZSBsZWZ0IGJvcmRlciB3aWR0aCBvZiB0aGUgdGFibGUgaXMgaGFsZiBvZiB0aGUgZmlyc3Qg
Y2VsbCdzIGNvbGxhcHNlZCBsZWZ0IGJvcmRlciwKLSAgICAvLyBhbmQgdGhlIHJpZ2h0IGJvcmRl
ciB3aWR0aCBvZiB0aGUgdGFibGUgaXMgaGFsZiBvZiB0aGUgbGFzdCBjZWxsJ3MgY29sbGFwc2Vk
IHJpZ2h0IGJvcmRlci4KLSAgICAvLyBUaGUgdG9wIGJvcmRlciB3aWR0aCBvZiB0aGUgdGFibGUg
aXMgY29tcHV0ZWQgYnkgZXhhbWluaW5nIGFsbCBjZWxscyB3aG8gY29sbGFwc2UgdGhlaXIgdG9w
Ci0gICAgLy8gYm9yZGVycyB3aXRoIHRoZSB0b3AgYm9yZGVyIG9mIHRoZSB0YWJsZS4gVGhlIHRv
cCBib3JkZXIgd2lkdGggb2YgdGhlIHRhYmxlIGlzIGVxdWFsIHRvIGhhbGYgb2YgdGhlCi0gICAg
Ly8gbWF4aW11bSBjb2xsYXBzZWQgdG9wIGJvcmRlci4gVGhlIGJvdHRvbSBib3JkZXIgd2lkdGgg
aXMgY29tcHV0ZWQgYnkgZXhhbWluaW5nIGFsbCBjZWxscyB3aG9zZSBib3R0b20gYm9yZGVycyBj
b2xsYXBzZQotICAgIC8vIHdpdGggdGhlIGJvdHRvbSBvZiB0aGUgdGFibGUuIFRoZSBib3R0b20g
Ym9yZGVyIHdpZHRoIGlzIGVxdWFsIHRvIGhhbGYgb2YgdGhlIG1heGltdW0gY29sbGFwc2VkIGJv
dHRvbSBib3JkZXIuCi0gICAgYXV0byYgZ3JpZCA9IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRU
YWJsZUZvcm1hdHRpbmdTdGF0ZSh0YWJsZUJveCkudGFibGVHcmlkKCk7Ci0gICAgYXV0byB0YWJs
ZUJvcmRlciA9IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIodGFibGVCb3gpOwotCi0gICAgYXV0
byYgZmlyc3RDb2x1bW5GaXJzdFJvd0JveCA9IGdyaWQuc2xvdCh7IDAgLCAwIH0pLT5jZWxsKCku
Ym94KCk7Ci0gICAgYXV0byBsZWZ0Qm9yZGVyID0gc3RkOjptYXgodGFibGVCb3JkZXIuaG9yaXpv
bnRhbC5sZWZ0LCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKGZpcnN0Q29sdW1uRmlyc3RSb3dC
b3gpLmhvcml6b250YWwubGVmdCk7Ci0KLSAgICBhdXRvJiBsYXN0Q29sdW1uRmlyc3RSb3cgPSBn
cmlkLnNsb3QoeyBncmlkLmNvbHVtbnMoKS5zaXplKCkgLSAxLCAwIH0pLT5jZWxsKCkuYm94KCk7
Ci0gICAgYXV0byByaWdodEJvcmRlciA9IHN0ZDo6bWF4KHRhYmxlQm9yZGVyLmhvcml6b250YWwu
cmlnaHQsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIobGFzdENvbHVtbkZpcnN0Um93KS5ob3Jp
em9udGFsLnJpZ2h0KTsKLQotICAgIGF1dG8gdG9wQm9yZGVyID0gdGFibGVCb3JkZXIudmVydGlj
YWwudG9wOwotICAgIGF1dG8gYm90dG9tQm9yZGVyID0gdGFibGVCb3JkZXIudmVydGljYWwuYm90
dG9tOwotICAgIGF1dG8gbGFzdFJvd0luZGV4ID0gZ3JpZC5yb3dzKCkuc2l6ZSgpIC0gMTsKLSAg
ICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgZ3JpZC5jb2x1bW5z
KCkuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7Ci0gICAgICAgIGF1dG8mIGJveEluRmlyc3RSb3gg
PSBncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgMCB9KS0+Y2VsbCgpLmJveCgpOwotICAgICAgICBh
dXRvJiBib3hJbkxhc3RSb3cgPSBncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgbGFzdFJvd0luZGV4
IH0pLT5jZWxsKCkuYm94KCk7Ci0KLSAgICAgICAgdG9wQm9yZGVyID0gc3RkOjptYXgodG9wQm9y
ZGVyLCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKGJveEluRmlyc3RSb3gpLnZlcnRpY2FsLnRv
cCk7Ci0gICAgICAgIGJvdHRvbUJvcmRlciA9IHN0ZDo6bWF4KGJvdHRvbUJvcmRlciwgZ2VvbWV0
cnkoKS5jb21wdXRlZEJvcmRlcihib3hJbkxhc3RSb3cpLnZlcnRpY2FsLmJvdHRvbSk7Ci0gICAg
fQotCi0gICAgdG9wQm9yZGVyID0gc3RkOjptYXgodG9wQm9yZGVyLCBnZW9tZXRyeSgpLmNvbXB1
dGVkQm9yZGVyKCp0YWJsZUJveC5maXJzdENoaWxkKCkpLnZlcnRpY2FsLnRvcCk7Ci0gICAgZm9y
IChhdXRvJiBzZWN0aW9uIDogY2hpbGRyZW5PZlR5cGU8Q29udGFpbmVyQm94Pih0YWJsZUJveCkp
IHsKLSAgICAgICAgYXV0byBob3JpenRvbmFsQm9yZGVyID0gZ2VvbWV0cnkoKS5jb21wdXRlZEJv
cmRlcihzZWN0aW9uKS5ob3Jpem9udGFsOwotICAgICAgICBsZWZ0Qm9yZGVyID0gc3RkOjptYXgo
bGVmdEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5sZWZ0KTsKLSAgICAgICAgcmlnaHRCb3JkZXIg
PSBzdGQ6Om1heChyaWdodEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5yaWdodCk7Ci0gICAgfQot
ICAgIGJvdHRvbUJvcmRlciA9IHN0ZDo6bWF4KGJvdHRvbUJvcmRlciwgZ2VvbWV0cnkoKS5jb21w
dXRlZEJvcmRlcigqdGFibGVCb3gubGFzdENoaWxkKCkpLnZlcnRpY2FsLmJvdHRvbSk7Ci0KLSAg
ICBhdXRvJiByb3dzID0gZ3JpZC5yb3dzKCkubGlzdCgpOwotICAgIHRvcEJvcmRlciA9IHN0ZDo6
bWF4KHRvcEJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihyb3dzLmZpcnN0KCkuYm94
KCkpLnZlcnRpY2FsLnRvcCk7Ci0gICAgZm9yIChhdXRvJiByb3cgOiByb3dzKSB7Ci0gICAgICAg
IGF1dG8gaG9yaXp0b25hbEJvcmRlciA9IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIocm93LmJv
eCgpKS5ob3Jpem9udGFsOwotICAgICAgICBsZWZ0Qm9yZGVyID0gc3RkOjptYXgobGVmdEJvcmRl
ciwgaG9yaXp0b25hbEJvcmRlci5sZWZ0KTsKLSAgICAgICAgcmlnaHRCb3JkZXIgPSBzdGQ6Om1h
eChyaWdodEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5yaWdodCk7Ci0gICAgfQotICAgIGJvdHRv
bUJvcmRlciA9IHN0ZDo6bWF4KGJvdHRvbUJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRl
cihyb3dzLmxhc3QoKS5ib3goKSkudmVydGljYWwuYm90dG9tKTsKLQotICAgIGF1dG8gY29sbGFw
c2VkQm9yZGVyID0gRWRnZXMgeyB7IGxlZnRCb3JkZXIsIHJpZ2h0Qm9yZGVyIH0sIHsgdG9wQm9y
ZGVyLCBib3R0b21Cb3JkZXIgfSB9OwotICAgIGdyaWQuc2V0Q29sbGFwc2VkQm9yZGVyKGNvbGxh
cHNlZEJvcmRlcik7Ci0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgp
LmJveEdlb21ldHJ5KHRhYmxlQm94KTsKLSAgICBib3hHZW9tZXRyeS5zZXRCb3JkZXIoY29sbGFw
c2VkQm9yZGVyIC8gMik7Ci0gICAgYm94R2VvbWV0cnkuc2V0UGFkZGluZyhnZW9tZXRyeSgpLmNv
bXB1dGVkUGFkZGluZyh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0
aCkpOwotfQotCi12b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1
dGVXaWR0aEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQotewot
ICAgIEFTU0VSVCh0YWJsZUJveC5pc1RhYmxlQm94KCkpOwotICAgIC8vIFRoaXMgaXMgYSBzcGVj
aWFsIHRhYmxlICJmaXQtY29udGVudCBzaXplIiBiZWhhdmlvciBoYW5kbGluZy4gTm90IGluIHRo
ZSBzcGVjIHRob3VnaC4KLSAgICAvLyBUYWJsZSByZXR1cm5zIGl0cyBmaW5hbCB3aWR0aCBhcyBt
aW4vbWF4LiBVc2UgdGhpcyBmaW5hbCB3aWR0aCB2YWx1ZSB0byBjb21wdXRlZCBob3Jpem9udGFs
IG1hcmdpbnMgZXRjLgotICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZUZvclRhYmxlQm94ID0gbGF5
b3V0U3RhdGUoKS5lc3RhYmxpc2hlZFRhYmxlRm9ybWF0dGluZ1N0YXRlKHRhYmxlQm94KTsKLSAg
ICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzIHsgfTsKLSAgICBpZiAoYXV0byBwcmVjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMgPSBmb3JtYXR0aW5nU3RhdGVGb3JUYWJsZUJveC5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
KCkpCi0gICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSAqcHJlY29tcHV0ZWRJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzOwotICAgIGVsc2UgewotICAgICAgICBpZiAodGFibGVCb3gu
aGFzQ2hpbGQoKSkKLSAgICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBMYXlv
dXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dCh0YWJsZUJveCwgbGF5b3V0U3RhdGUo
KSktPmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOwotICAgICAgICBmb3JtYXR0
aW5nU3RhdGVGb3JUYWJsZUJveC5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMpOwotICAgIH0KLQotICAgIGF1dG8gYXZhaWxhYmxlSG9yaXpvbnRh
bFNwYWNlID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAgICAvLyAxLiBU
aGUgdGFibGUgZ2VuZXJhdGVzIGEgcHJpbmNpcGFsIGJsb2NrIGNvbnRhaW5lciBib3ggY2FsbGVk
IHRoZSB0YWJsZSB3cmFwcGVyIGJveCB0aGF0IGNvbnRhaW5zIHRoZSB0YWJsZSBib3ggaXRzZWxm
IGFuZCBhbnkgY2FwdGlvbiBib3hlcy4KLSAgICAvLyAyLiBUaGUgdGFibGUgd3JhcHBlciBib3gg
ZXN0YWJsaXNoZXMgYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGFuZCB0aGUgdGFibGUgYm94
IGVzdGFibGlzaGVzIGEgdGFibGUgZm9ybWF0dGluZyBjb250ZXh0LgotICAgIC8vIDMuIFRoZSBj
b21wdXRlZCB2YWx1ZXMgb2YgcHJvcGVydGllcyAncG9zaXRpb24nLCAnZmxvYXQnLCAnbWFyZ2lu
LSonLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsIGFuZCAnbGVmdCcgb24KLSAgICAvLyAgICB0
aGUgdGFibGUgZWxlbWVudCBhcmUgdXNlZCBvbiB0aGUgdGFibGUgd3JhcHBlciBib3ggYW5kIG5v
dCB0aGUgdGFibGUgYm94OyBhbGwgb3RoZXIgdmFsdWVzIG9mIG5vbi1pbmhlcml0YWJsZQotICAg
IC8vICAgIHByb3BlcnRpZXMgYXJlIHVzZWQgb24gdGhlIHRhYmxlIGJveCBhbmQgbm90IHRoZSB0
YWJsZSB3cmFwcGVyIGJveC4KLSAgICAvLyA0LiBJbiBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4
dCwgZWFjaCBib3gncyBsZWZ0IG91dGVyIGVkZ2UgdG91Y2hlcyB0aGUgbGVmdCBlZGdlIG9mIHRo
ZSBjb250YWluaW5nIGJsb2NrLgotICAgIC8vICAgIFRoaXMgaXMgdHJ1ZSBldmVuIGluIHRoZSBw
cmVzZW5jZSBvZiBmbG9hdHMsIHVubGVzcyB0aGUgYm94IGVzdGFibGlzaGVzIGEgbmV3IGJsb2Nr
IGZvcm1hdHRpbmcgY29udGV4dCAoaW4gd2hpY2ggY2FzZSB0aGUKLSAgICAvLyAgICBib3ggaXRz
ZWxmIG1heSBiZWNvbWUgbmFycm93ZXIgZHVlIHRvIHRoZSBmbG9hdHMpCi0gICAgLy8KLSAgICAv
LyBOb3cgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBjYXNlOgotICAgIC8vIDxkaXYgc3R5bGU9ImRp
c3BsYXk6IGJsb2NrOyB3aWR0aDogNTAwcHg7Ij4KLSAgICAvLyAgICAgPGRpdiBzdHlsZT0iZmxv
YXQ6IGxlZnQ7IHdpZHRoOiAxMDBweDsiPjwvZGl2PgotICAgIC8vICAgICAgICAgPGRpdiBzdHls
ZT0iZGlzcGxheTogdGFibGU7IHdpZHRoOiAxMCU7Ij48L2Rpdj4KLSAgICAvLyAgICAgPC9kaXY+
Ci0gICAgLy8gPC9kaXY+Ci0gICAgLy8gMS4gV2UgY3JlYXRlIGEgdGFibGUgd3JhcHBlciBib3gg
dG8gd3JhcCB0aGUgImRpc3BsYXk6IHRhYmxlIiBibG9jayBsZXZlbCBib3ggKCMxKS4KLSAgICAv
LyAyLiBUaGUgdGFibGUgd3JhcHBlciBib3gncyB3aWR0aCBwcm9wZXJ0eSBpcyBzZXQgdG8gYXV0
byAoIzMpLgotICAgIC8vIDMuIFNpbmNlIGl0IGVzdGFibGlzaGVzIGEgbmV3IGJsb2NrIGZvcm1h
dHRpbmcgY29udGV4dCwgdGhlIGF2YWlsYWJsZSBob3Jpem9udGFsIHNwYWNlIGdldHMgc2hydW5r
IGJ5IHRoZSBmbG9hdCAoIzQpCi0gICAgLy8gNC4gVGhlIHRhYmxlIHdyYXBwZXIgYm94J3MgdXNl
ZCB3aWR0aCBjb21wdXRlcyB0byA1MDBweCAtIDEwMHB4IC0+IDQwMHB4OwotICAgIC8vCi0gICAg
Ly8gTm93IHdlIGFyZSBpbnNpZGUgdGhlIEJGQyBlc3RhYmxpc2hlZCBieSB0aGUgdGFibGUgd3Jh
cHBlciBib3ggYW5kIHRyeSB0byByZXNvbHZlIHRoZSB0YWJsZSdzIHdpZHRoIC0+ICUxMC4KLSAg
ICAvLyBBY2NvcmRpbmcgdG8gdGhlIG5vcm1hbCBCRkMgcnVsZXMsIGl0IHNob3VsZCBjb21wdXRl
IHRvIDEwJSBvZiB0aGUgY29udGFpbmluZyBibG9jaydzIGxvZ2ljYWwgd2lkdGg6IDQwMHB4IC0+
IDQwcHguCi0gICAgLy8gSG93ZXZlciBpbiBwcmFjdGljZSBpdCBjb21wdXRlcyB0byA1MHB4ICgx
MCUgb2YgNTAwcHgpLgotICAgIC8vIFNpbWlsYXIgc2V0dXAgd2l0aCBub24tdGFibGUgY29udGVu
dCB3b3VsZCByZXNvbHZlIHRoZSBpbm5lciBibG9jayBsZXZlbCBib3gncyB3aWR0aCB0byA0MHB4
OwotICAgIC8vIFRoaXMgbmVlZHMgY2xhcmlmaWNhdGlvbiBpbiB0aGUgc3BlYy4KLSAgICBhdXRv
IGhvcml6b250YWxDb25zdHJhaW50Rm9yUmVzb2x2aW5nV2lkdGggPSBtX2hvcml6b250YWxDb25z
dHJhaW50c0lnbm9yaW5nRmxvYXRzLmxvZ2ljYWxXaWR0aDsKLSAgICBhdXRvIGdlb21ldHJ5ID0g
dGhpcy0+Z2VvbWV0cnkoKTsKLSAgICBhdXRvIGNvbXB1dGVkV2lkdGggPSBnZW9tZXRyeS5jb21w
dXRlZFdpZHRoKHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRo
KTsKLSAgICBhdXRvIGNvbXB1dGVkTWF4V2lkdGggPSBnZW9tZXRyeS5jb21wdXRlZE1heFdpZHRo
KHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRoKTsKLSAgICBh
dXRvIGNvbXB1dGVkTWluV2lkdGggPSBnZW9tZXRyeS5jb21wdXRlZE1pbldpZHRoKHRhYmxlQm94
LCBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRoKTsKLSAgICAvLyBVc2UgdGhl
IGdlbmVyaWMgc2hyaW5rLXRvLWZpdC13aWR0aCBsb2dpYyBhcyB0aGUgaW5pdGlhbCB3aWR0aCBm
b3IgdGhlIHRhYmxlLgotICAgIGF1dG8gdXNlZFdpZHRoID0gc3RkOjptaW4oc3RkOjptYXgoaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtLCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2Up
LCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0pOwotICAgIGlmIChjb21wdXRlZFdp
ZHRoIHx8IGNvbXB1dGVkTWluV2lkdGggfHwgY29tcHV0ZWRNYXhXaWR0aCkgewotICAgICAgICBp
ZiAoY29tcHV0ZWRXaWR0aCkgewotICAgICAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBjb21wdXRl
ZCB3aWR0aCB2YWx1ZSBmaXJzdC4KLSAgICAgICAgICAgIGlmIChjb21wdXRlZE1heFdpZHRoICYm
ICpjb21wdXRlZFdpZHRoID4gKmNvbXB1dGVkTWF4V2lkdGgpCi0gICAgICAgICAgICAgICAgY29t
cHV0ZWRXaWR0aCA9IGNvbXB1dGVkTWF4V2lkdGg7Ci0gICAgICAgICAgICBpZiAoY29tcHV0ZWRN
aW5XaWR0aCAmJiAqY29tcHV0ZWRXaWR0aCA8ICpjb21wdXRlZE1pbldpZHRoKQotICAgICAgICAg
ICAgICAgIGNvbXB1dGVkV2lkdGggPSBjb21wdXRlZE1pbldpZHRoOwotICAgICAgICAgICAgdXNl
ZFdpZHRoID0gKmNvbXB1dGVkV2lkdGggPCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmlt
dW0gPyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0gOiAqY29tcHV0ZWRXaWR0aDsK
LSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21wdXRlZE1heFdpZHRoICYmICpjb21wdXRlZE1h
eFdpZHRoIDwgdXNlZFdpZHRoKQotICAgICAgICAgICAgdXNlZFdpZHRoID0gaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cy5taW5pbXVtOwotICAgICAgICBpZiAoY29tcHV0ZWRNaW5XaWR0aCAmJiAq
Y29tcHV0ZWRNaW5XaWR0aCA+IHVzZWRXaWR0aCkKLSAgICAgICAgICAgIHVzZWRXaWR0aCA9ICpj
b21wdXRlZE1pbldpZHRoOwotICAgIH0KLQotICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFyZ2lu
ID0gZ2VvbWV0cnkuaW5GbG93Q29udGVudFdpZHRoQW5kTWFyZ2luKHRhYmxlQm94LCBob3Jpem9u
dGFsQ29uc3RyYWludHMsIE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzIHsgdXNlZFdpZHRoLCB7
IH0gfSk7Ci0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdl
b21ldHJ5KHRhYmxlQm94KTsKLSAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29u
dGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCk7Ci0gICAgYm94R2VvbWV0cnkuc2V0SG9y
aXpvbnRhbE1hcmdpbih7IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0LCBj
b250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgfSk7Ci19Ci0KLXZvaWQgVGFibGVX
cmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUhlaWdodEFuZE1hcmdpbkZvclRh
YmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gsIGNvbnN0IENvbnN0cmFpbnRzRm9y
SW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgQVNTRVJUKHRhYmxlQm94LmlzVGFi
bGVCb3goKSk7Ci0gICAgLy8gVGFibGUgaXMgYSBzcGVjaWFsIEJGQyBjb250ZW50LiBJdHMgaGVp
Z2h0IGlzIG1haW5seSBkcml2ZW4gYnkgdGhlIGNvbnRlbnQuIENvbXB1dGVkIGhlaWdodCwgbWlu
LWhlaWdodCBhbmQgbWF4LWhlaWdodCBhcmUgYWxsCi0gICAgLy8gYWxyZWFkeSBiZWVuIHRha2Vu
IGludG8gYWNjb3VudCBkdXJpbmcgdGhlIFRGQyBsYXlvdXQuCi0gICAgYXV0byBoZWlnaHRBbmRN
YXJnaW4gPSBnZW9tZXRyeSgpLmluRmxvd0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4odGFibGVCb3gs
IGNvbnN0cmFpbnRzLmhvcml6b250YWwsIHsgcXVpcmtzKCkub3ZlcnJpZGRlblRhYmxlSGVpZ2h0
KHRhYmxlQm94KSB9KTsKLQotICAgIGF1dG8gbWFyZ2luQ29sbGFwc2UgPSB0aGlzLT5tYXJnaW5D
b2xsYXBzZSgpOwotICAgIGF1dG8gdmVydGljYWxNYXJnaW4gPSBtYXJnaW5Db2xsYXBzZS5jb2xs
YXBzZWRWZXJ0aWNhbFZhbHVlcyh0YWJsZUJveCwgaGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNl
ZE1hcmdpbik7Ci0gICAgLy8gQ2FjaGUgdGhlIGNvbXB1dGVkIHBvc2l0aXZlIGFuZCBuZWdhdGl2
ZSBtYXJnaW4gdmFsdWUgcGFpci4KLSAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRVc2VkVmVydGlj
YWxNYXJnaW4odGFibGVCb3gsIHZlcnRpY2FsTWFyZ2luKTsKLQotICAgIGF1dG8mIGJveEdlb21l
dHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkodGFibGVCb3gpOwotICAgIGJveEdl
b21ldHJ5LnNldExvZ2ljYWxUb3AodmVydGljYWxQb3NpdGlvbldpdGhNYXJnaW4odGFibGVCb3gs
IHZlcnRpY2FsTWFyZ2luLCBjb25zdHJhaW50cy52ZXJ0aWNhbCkpOwotICAgIGJveEdlb21ldHJ5
LnNldENvbnRlbnRCb3hIZWlnaHQoaGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpOwotICAg
IGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFy
Z2luKSwgbWFyZ2luQWZ0ZXIodmVydGljYWxNYXJnaW4pIH0pOwotICAgIC8vIEFkanVzdCB0aGUg
cHJldmlvdXMgc2libGluZydzIG1hcmdpbiBib3R0b20gbm93IHRoYXQgdGhpcyBib3gncyB2ZXJ0
aWNhbCBtYXJnaW4gaXMgY29tcHV0ZWQuCi0gICAgTWFyZ2luQ29sbGFwc2U6OnVwZGF0ZU1hcmdp
bkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nKCp0aGlzLCBtYXJnaW5Db2xsYXBzZSwgdGFibGVCb3gp
OwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5n
Q29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy90YWJsZXdy
YXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oCmRlbGV0ZWQgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwZGVhMTU3Y2M1MjE2Zjg4NGZkMjg5ODM0YTNjODY2OTUzNzQyN2E1
Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJs
b2NrRm9ybWF0dGluZ0NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgot
ICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19D
T05URVhUKQotCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUg
PHd0Zi9Jc29NYWxsb2MuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91
dCB7Ci0KLS8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgc3BlY2lhbCBibG9jayBmb3JtYXR0
aW5nIGNvbnRleHQgbGF5b3V0IGxvZ2ljIGZvciB0aGUgdGFibGUgd3JhcHBlci4KLS8vIGh0dHBz
Oi8vd3d3LnczLm9yZy9UUi9DU1MyMi90YWJsZXMuaHRtbCNtb2RlbAotY2xhc3MgVGFibGVXcmFw
cGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCBmaW5hbCA6IHB1YmxpYyBCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0IHsKLSAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKFRhYmxlV3JhcHBlckJsb2NrRm9y
bWF0dGluZ0NvbnRleHQpOwotcHVibGljOgotICAgIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEJsb2Nr
Rm9ybWF0dGluZ1N0YXRlJik7Ci0KLSAgICB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxp
ZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSBmaW5hbDsK
LQotICAgIHZvaWQgc2V0SG9yaXpvbnRhbENvbnN0cmFpbnRzSWdub3JpbmdGbG9hdHMoY29uc3Qg
SG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIHsgbV9ob3Jpem9u
dGFsQ29uc3RyYWludHNJZ25vcmluZ0Zsb2F0cyA9IGhvcml6b250YWxDb25zdHJhaW50czsgfQot
Ci1wcml2YXRlOgotICAgIGNsYXNzIFF1aXJrcyA6IHB1YmxpYyBCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0OjpRdWlya3MgewotICAgIHB1YmxpYzoKLSAgICAgICAgUXVpcmtzKGNvbnN0IFRhYmxlV3Jh
cHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsKLQotICAgICAgICBPcHRpb25hbDxMYXlvdXRV
bml0PiBvdmVycmlkZGVuVGFibGVIZWlnaHQoY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCkg
Y29uc3Q7Ci0gICAgfTsKLSAgICBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpR
dWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4gUXVpcmtzKCp0aGlzKTsgfQotCi0gICAgdm9p
ZCBsYXlvdXRUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBjb25zdCBDb25z
dHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsKLQotICAgIHZvaWQgY29tcHV0ZUJvcmRlckFuZFBh
ZGRpbmdGb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29u
c3RyYWludHMmKTsKLSAgICB2b2lkIGNvbXB1dGVXaWR0aEFuZE1hcmdpbkZvclRhYmxlQm94KGNv
bnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOwotICAgIHZv
aWQgY29tcHV0ZUhlaWdodEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYs
IGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOwotCi1wcml2YXRlOgotICAgIEhv
cml6b250YWxDb25zdHJhaW50cyBtX2hvcml6b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxvYXRz
OwotfTsKLQotaW5saW5lIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJr
czo6UXVpcmtzKGNvbnN0IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1h
dHRpbmdDb250ZXh0KQotICAgIDogQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzKGZvcm1h
dHRpbmdDb250ZXh0KQotewotfQotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZ
T1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
LCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSkKLQotI2VuZGlmCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBl
ci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJs
b2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCBlYWRhOTJlZDI4Zjc5N2YzYjgyNmIwZmI5MTU0MjVlYjc4OWJiOTk1Li4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGlu
Z0NvbnRleHRRdWlya3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
Ci0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgot
ICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJUYWJsZVdyYXBwZXJCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKLQotI2luY2x1ZGUgIkxheW91dFN0YXRlLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi1PcHRpb25hbDxMYXlvdXRVbml0PiBUYWJsZVdyYXBwZXJCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6Om92ZXJyaWRkZW5UYWJsZUhlaWdodChjb25zdCBD
b250YWluZXJCb3gmIHRhYmxlQm94KSBjb25zdAotewotICAgIGlmIChsYXlvdXRTdGF0ZSgpLmlu
UXVpcmtzTW9kZSgpKSB7Ci0gICAgICAgIC8vIEluIHF1aXJrcyBtb2RlIGFsd2F5cyB1c2UgdGhl
IGNvbnRlbnQgaGVpZ2h0LiBOb3RlIHRoYXQgdGhlIHRhYmxlcyB3aXRoIGNvbnRlbnQgdGFrZSBj
b21wdXRlZCB2YWx1ZXMgaW50byBhY2NvdW50LgotICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5j
b250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KHRhYmxlQm94KTsKLSAgICB9Ci0g
ICAgcmV0dXJuIHRhYmxlQm94Lmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpID8gZ2VvbWV0cnko
KS5jb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KHRhYmxlQm94KSA6IE9wdGlv
bmFsPExheW91dFVuaXQ+IHsgfTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQu
Y3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5n
Q29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNTdmZDY5OTA0Mjg2
OTdlODVkMTcxZjZkM2FjOGQ1ODdhY2FjZjguLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0Zs
ZXhGb3JtYXR0aW5nQ29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAot
LyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJGbGV4Rm9ybWF0dGlu
Z0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0j
aW5jbHVkZSAiRmxleEZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIklubGluZVJlY3QuaCIK
LSNpbmNsdWRlICJJbnZhbGlkYXRpb25TdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dEJveEdlb21l
dHJ5LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q2hpbGRJdGVyYXRvci5oIgotI2luY2x1ZGUgIkxheW91
dENvbnRleHQuaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3Bh
Y2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRF
RF9JTVBMKEZsZXhGb3JtYXR0aW5nQ29udGV4dCk7Ci0KLUZsZXhGb3JtYXR0aW5nQ29udGV4dDo6
RmxleEZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRl
eHRSb290LCBGbGV4Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCi0gICAgOiBGb3Jt
YXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKLXsK
LX0KLQotdm9pZCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dEluRmxvd0NvbnRlbnQoSW52
YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0
cmFpbnRzKQotewotICAgIGNvbXB1dGVJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yRmxleEl0
ZW1zKCk7Ci0gICAgc2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0cmFpbnRzKTsKLX0KLQotTGF5
b3V0VW5pdCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OnVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3QK
LXsKLSAgICBhdXRvJiBsaW5lcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmxpbmVzKCk7Ci0gICAgcmV0
dXJuIExheW91dFVuaXQgeyBsaW5lcy5sYXN0KCkuYm90dG9tKCkgLSBsaW5lcy5maXJzdCgpLnRv
cCgpIH07Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
IEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
KCkKLXsKLSAgICByZXR1cm4geyB9OwotfQotCi12b2lkIEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6
c2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYg
Y29uc3RyYWludHMpCi17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0
dGluZ1N0YXRlKCk7Ci0gICAgYXV0byBnZW9tZXRyeSA9IHRoaXMtPmdlb21ldHJ5KCk7Ci0gICAg
YXV0byBmbGV4SXRlbU1haW5BeGlzU3RhcnQgPSBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2lj
YWxMZWZ0OwotICAgIGF1dG8gZmxleEl0ZW1NYWluQXhpc0VuZCA9IGZsZXhJdGVtTWFpbkF4aXNT
dGFydDsKLSAgICBhdXRvIGZsZXhJdGVtQ3Jvc0F4aXNTdGFydCA9IGNvbnN0cmFpbnRzLnZlcnRp
Y2FsLmxvZ2ljYWxUb3A7Ci0gICAgYXV0byBmbGV4SXRlbUNyb3NBeGlzRW5kID0gZmxleEl0ZW1D
cm9zQXhpc1N0YXJ0OwotICAgIGZvciAoYXV0byYgZmxleEl0ZW0gOiBjaGlsZHJlbk9mVHlwZTxD
b250YWluZXJCb3g+KHJvb3QoKSkpIHsKLSAgICAgICAgQVNTRVJUKGZsZXhJdGVtLmVzdGFibGlz
aGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGp1c3Qg
YSBzaW1wbGUsIGxldCdzIGxheW91dCB0aGUgZmxleCBpdGVtcyBhbmQgcGxhY2UgdGhlbSBuZXh0
IHRvIGVhY2ggb3RoZXIgc2V0dXAuCi0gICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhzID0gZm9y
bWF0dGluZ1N0YXRlLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goZmxleEl0ZW0pOwot
ICAgICAgICBhdXRvIGZsZXhJdGVtTG9naWNhbFdpZHRoID0gc3RkOjptaW4oc3RkOjptYXgoaW50
cmluc2ljV2lkdGhzLT5taW5pbXVtLCBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxXaWR0
aCksIGludHJpbnNpY1dpZHRocy0+bWF4aW11bSk7Ci0gICAgICAgIGF1dG8gZmxleEl0ZW1Db25z
dHJhaW50cyA9IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCB7IHsgeyB9LCBmbGV4SXRlbUxv
Z2ljYWxXaWR0aCB9LCB7IH0gfTsKLQotICAgICAgICBhdXRvIGludmFsaWRhdGlvblN0YXRlID0g
SW52YWxpZGF0aW9uU3RhdGUgeyB9OwotICAgICAgICBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3Jt
YXR0aW5nQ29udGV4dChmbGV4SXRlbSwgbGF5b3V0U3RhdGUoKSktPmxheW91dEluRmxvd0NvbnRl
bnQoaW52YWxpZGF0aW9uU3RhdGUsIGZsZXhJdGVtQ29uc3RyYWludHMpOwotCi0gICAgICAgIGF1
dG8gY29tcHV0ZUZsZXhJdGVtR2VvbWV0cnkgPSBbJl0gewotICAgICAgICAgICAgYXV0byYgZmxl
eEl0ZW1HZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShmbGV4SXRlbSk7Ci0K
LSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQoTGF5b3V0UG9p
bnQgeyBmbGV4SXRlbU1haW5BeGlzRW5kLCBmbGV4SXRlbUNyb3NBeGlzU3RhcnQgfSk7Ci0KLSAg
ICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0Qm9yZGVyKGdlb21ldHJ5LmNvbXB1dGVkQm9y
ZGVyKGZsZXhJdGVtKSk7Ci0gICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldFBhZGRpbmco
Z2VvbWV0cnkuY29tcHV0ZWRQYWRkaW5nKGZsZXhJdGVtLCBjb25zdHJhaW50cy5ob3Jpem9udGFs
LmxvZ2ljYWxXaWR0aCkpOwotCi0gICAgICAgICAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1h
cmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihmbGV4SXRlbSwgY29uc3Ry
YWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldEhvcml6
b250YWxNYXJnaW4oeyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwX2x1
KSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDBfbHUpIH0pOwotCi0gICAg
ICAgICAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBnZW9tZXRyeS5jb21wdXRlZFZl
cnRpY2FsTWFyZ2luKGZsZXhJdGVtLCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICAgICAg
ICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyBjb21wdXRlZFZlcnRpY2Fs
TWFyZ2luLmJlZm9yZS52YWx1ZU9yKDBfbHUpLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVy
LnZhbHVlT3IoMF9sdSkgfSk7Ci0KLSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0Q29u
dGVudEJveEhlaWdodChnZW9tZXRyeS5jb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRS
b290KGZsZXhJdGVtKSk7Ci0gICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldENvbnRlbnRC
b3hXaWR0aChmbGV4SXRlbUxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgICAgICBmbGV4SXRlbU1haW5B
eGlzRW5kPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChmbGV4SXRlbUdlb21ldHJ5KS5yaWdo
dCgpOwotICAgICAgICAgICAgZmxleEl0ZW1Dcm9zQXhpc0VuZCA9IHN0ZDo6bWF4KGZsZXhJdGVt
Q3Jvc0F4aXNFbmQsIEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGZsZXhJdGVtR2VvbWV0cnkp
LmJvdHRvbSgpKTsKLSAgICAgICAgfTsKLSAgICAgICAgY29tcHV0ZUZsZXhJdGVtR2VvbWV0cnko
KTsKLSAgICB9Ci0gICAgYXV0byBmbGV4TGluZSA9IElubGluZVJlY3QgeyBmbGV4SXRlbUNyb3NB
eGlzU3RhcnQsIGZsZXhJdGVtTWFpbkF4aXNTdGFydCwgZmxleEl0ZW1NYWluQXhpc0VuZCAtIGZs
ZXhJdGVtTWFpbkF4aXNTdGFydCwgZmxleEl0ZW1Dcm9zQXhpc0VuZCAtIGZsZXhJdGVtQ3Jvc0F4
aXNTdGFydCB9OwotICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lKGZsZXhMaW5lKTsKLX0KLQot
dm9pZCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzRm9yRmxleEl0ZW1zKCkKLXsKLSAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlzLT5m
b3JtYXR0aW5nU3RhdGUoKTsKLSAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2VvbWV0cnkoKTsK
LSAgICBmb3IgKGF1dG8mIGZsZXhJdGVtIDogY2hpbGRyZW5PZlR5cGU8Q29udGFpbmVyQm94Pihy
b290KCkpKSB7Ci0gICAgICAgIGlmIChmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25z
dHJhaW50c0ZvckJveChmbGV4SXRlbSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
Zm9ybWF0dGluZ1N0YXRlLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goZmxleEl0
ZW0sIGdlb21ldHJ5LmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoZmxleEl0ZW0pKTsKLSAgICB9
Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
ZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmgKZGVsZXRlZCBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDgxYTBlNDA2OWZmZDEwMjk2ODhjYzUxNmNmZDk1OTBjY2M5MzY1
MmIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5oCisr
KyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
LSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgot
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQot
Ci0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGbGV4
Rm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNpbmNs
dWRlIDx3dGYvSXNvTWFsbG9jLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1jbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKLS8vIFRoaXMgY2xhc3MgaW1wbGVt
ZW50cyB0aGUgbGF5b3V0IGxvZ2ljIGZvciBmbGV4IGZvcm1hdHRpbmcgY29udGV4dHMuCi0vLyBo
dHRwczovL3d3dy53My5vcmcvVFIvY3NzLWZsZXhib3gtMS8KLWNsYXNzIEZsZXhGb3JtYXR0aW5n
Q29udGV4dCBmaW5hbCA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dCB7Ci0gICAgV1RGX01BS0Vf
SVNPX0FMTE9DQVRFRChGbGV4Rm9ybWF0dGluZ0NvbnRleHQpOwotcHVibGljOgotICAgIEZsZXhG
b3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9v
dCwgRmxleEZvcm1hdHRpbmdTdGF0ZSYpOwotICAgIHZvaWQgbGF5b3V0SW5GbG93Q29udGVudChJ
bnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpIG92
ZXJyaWRlOwotICAgIExheW91dFVuaXQgdXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdCBvdmVycmlk
ZTsKLQotICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzKCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhpcyBjbGFzcyBp
bXBsZW1lbnRzIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcgZm9yIGZsZXggaXRlbXMuCi0gICAgY2xh
c3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKLSAgICBw
dWJsaWM6Ci0gICAgICAgIEdlb21ldHJ5KGNvbnN0IEZsZXhGb3JtYXR0aW5nQ29udGV4dCYpOwot
Ci0gICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2ljV2lkdGhDb25zdHJh
aW50cyhjb25zdCBDb250YWluZXJCb3gmKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0
IEZsZXhGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVy
biBkb3duY2FzdDxGbGV4Rm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeTo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KLSAgICB9OwotICAgIEZsZXhGb3JtYXR0aW5n
Q29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBHZW9tZXRyeSgqdGhp
cyk7IH0KLQotICAgIHZvaWQgc2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0IENvbnN0cmFpbnRz
Rm9ySW5GbG93Q29udGVudCYpOwotICAgIHZvaWQgY29tcHV0ZUludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHNGb3JGbGV4SXRlbXMoKTsKLQotICAgIGNvbnN0IEZsZXhGb3JtYXR0aW5nU3RhdGUmIGZv
cm1hdHRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEZsZXhGb3JtYXR0aW5nU3Rh
dGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KLSAgICBGbGV4Rm9y
bWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3duY2FzdDxGbGV4Rm9y
bWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9Ci19
OwotCi1pbmxpbmUgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6R2VvbWV0cnkoY29u
c3QgRmxleEZvcm1hdHRpbmdDb250ZXh0JiBmbGV4Rm9ybWF0dGluZ0NvbnRleHQpCi0gICAgOiBG
b3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkoZmxleEZvcm1hdHRpbmdDb250ZXh0KQotewotfQot
Ci19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VChGbGV4Rm9ybWF0dGluZ0NvbnRleHQsIGlzRmxleEZvcm1hdHRpbmdDb250ZXh0KCkpCi0KLSNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0Zs
ZXhGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
bGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjN2M4ZGQwOTgwOWQxZDBiNTg0YWJmZjc4ZGQxNzkxYmZm
NDY4OTguLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dEdl
b21ldHJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoK
LSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0j
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdDb250ZXh0LmgiCi0K
LSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZsZXhG
b3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1
ZGUgIkxheW91dENvbnRleHQuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExh
eW91dCB7Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIEZs
ZXhGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMo
Y29uc3QgQ29udGFpbmVyQm94JiBmbGV4SXRlbSkKLXsKLSAgICBhdXRvIGZpeGVkTWFyZ2luQm9y
ZGVyQW5kUGFkZGluZyA9IFsmXShhdXRvJiBsYXlvdXRCb3gpIHsKLSAgICAgICAgYXV0byYgc3R5
bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICAgICAgcmV0dXJuIGZpeGVkVmFsdWUoc3R5bGUu
bWFyZ2luU3RhcnQoKSkudmFsdWVPcigwKQotICAgICAgICAgICAgKyBMYXlvdXRVbml0IHsgc3R5
bGUuYm9yZGVyTGVmdFdpZHRoKCkgfQotICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0eWxlLnBh
ZGRpbmdMZWZ0KCkpLnZhbHVlT3IoMCkKLSAgICAgICAgICAgICsgZml4ZWRWYWx1ZShzdHlsZS5w
YWRkaW5nUmlnaHQoKSkudmFsdWVPcigwKQotICAgICAgICAgICAgKyBMYXlvdXRVbml0IHsgc3R5
bGUuYm9yZGVyUmlnaHRXaWR0aCgpIH0KLSAgICAgICAgICAgICsgZml4ZWRWYWx1ZShzdHlsZS5t
YXJnaW5FbmQoKSkudmFsdWVPcigwKTsKLSAgICB9OwotCi0gICAgYXV0byBjb21wdXRlZEludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMgPSBbJl0oKSAtPiBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
IHsKLSAgICAgICAgYXV0byBsb2dpY2FsV2lkdGggPSBmbGV4SXRlbS5zdHlsZSgpLmxvZ2ljYWxX
aWR0aCgpOwotICAgICAgICAvLyBNaW5pbXVtL21heGltdW0gd2lkdGggY2FuJ3QgYmUgZGVwZW5k
aW5nIG9uIHRoZSBjb250YWluaW5nIGJsb2NrJ3Mgd2lkdGguCi0gICAgICAgIGF1dG8gbmVlZHNS
ZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRoID0gbG9naWNhbFdpZHRoLmlzQ2FsY3VsYXRlZCgp
IHx8IGxvZ2ljYWxXaWR0aC5pc1BlcmNlbnQoKSB8fCBsb2dpY2FsV2lkdGguaXNSZWxhdGl2ZSgp
OwotICAgICAgICBpZiAobmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRoKQotICAgICAg
ICAgICAgcmV0dXJuIHsgfTsKLQotICAgICAgICBpZiAoYXV0byB3aWR0aCA9IGZpeGVkVmFsdWUo
bG9naWNhbFdpZHRoKSkKLSAgICAgICAgICAgIHJldHVybiB7ICp3aWR0aCwgKndpZHRoIH07Ci0K
LSAgICAgICAgQVNTRVJUKGZsZXhJdGVtLmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7
Ci0gICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IExheW91dENvbnRleHQ6
OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGZsZXhJdGVtLCBsYXlvdXRTdGF0ZSgpKS0+Y29tcHV0
ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGlmIChsb2dpY2FsV2lkdGgu
aXNNaW5Db250ZW50KCkpCi0gICAgICAgICAgICByZXR1cm4geyBpbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzLm1pbmltdW0sIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSB9OwotICAg
ICAgICBpZiAobG9naWNhbFdpZHRoLmlzTWF4Q29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJu
IHsgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtLCBpbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzLm1heGltdW0gfTsKLSAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHM7Ci0gICAgfTsKLSAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBjb25zdHJh
aW5CeU1pbk1heFdpZHRoKGZsZXhJdGVtLCBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMoKSk7Ci0gICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQoZml4ZWRNYXJnaW5C
b3JkZXJBbmRQYWRkaW5nKGZsZXhJdGVtKSk7Ci0gICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHM7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5jcHAKZGVs
ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWZjODVhMDM4NTJkMzM1MjYxMzg0MGYzMTIy
YzczM2M1NGZhYTAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0t
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3Rh
dGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
QykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNs
dWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJGbGV4Rm9ybWF0dGluZ1N0YXRlLmgiCi0KLSNpZiBF
TkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgPHd0Zi9Jc29NYWxs
b2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewot
Ci1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoRmxleEZvcm1hdHRpbmdTdGF0ZSk7Ci0KLUZs
ZXhGb3JtYXR0aW5nU3RhdGU6OkZsZXhGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+
JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQotICAgIDogRm9ybWF0
dGluZ1N0YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OkZsZXgsIGxheW91dFN0YXRl
KQotewotfQotCi1GbGV4Rm9ybWF0dGluZ1N0YXRlOjp+RmxleEZvcm1hdHRpbmdTdGF0ZSgpCi17
Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zs
ZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3RhdGUuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ1N0YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IGEwNjNiOWRhMmE1YjhkYzI3MDIwODc5NGE0ODM2NTQ0MTYwOWUzYTMuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3RhdGUuaAorKysgL2Rldi9u
dWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0g
KiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVO
QUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiRm9ybWF0dGluZ1N0
YXRlLmgiCi0jaW5jbHVkZSAiSW5saW5lUmVjdC5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2Mu
aD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIEZs
ZXhGb3JtYXR0aW5nU3RhdGUgOiBwdWJsaWMgRm9ybWF0dGluZ1N0YXRlIHsKLSAgICBXVEZfTUFL
RV9JU09fQUxMT0NBVEVEKEZsZXhGb3JtYXR0aW5nU3RhdGUpOwotcHVibGljOgotICAgIEZsZXhG
b3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRlJik7Ci0gICAg
fkZsZXhGb3JtYXR0aW5nU3RhdGUoKTsKLQotICAgIGNvbnN0IGF1dG8mIGxpbmVzKCkgY29uc3Qg
eyByZXR1cm4gbV9saW5lczsgfQotICAgIHZvaWQgYWRkTGluZShjb25zdCBJbmxpbmVSZWN0JiBs
aW5lKSB7IG1fbGluZXMuYXBwZW5kKGxpbmUpOyB9Ci0KLXByaXZhdGU6Ci0gICAgVmVjdG9yPElu
bGluZVJlY3Q+IG1fbGluZXM7Ci19OwotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNf
TEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUoRmxleEZvcm1hdHRpbmdTdGF0ZSwgaXNGbGV4Rm9ybWF0
dGluZ1N0YXRlKCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9Gb3JtYXR0aW5nQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL0Zvcm1hdHRpbmdDb250ZXh0LmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi45ODU3ZGJhMmM3ZDY1Mjk2MGM0MTFmYWJjYTM1NzU4Njk1YmExMTI4Ci0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9Gb3JtYXR0
aW5nQ29udGV4dC5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShM
QVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRm9ybWF0dGluZ1N0YXRlLmgi
CisjaW5jbHVkZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIK
KyNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5l
ckJveC5oIgorI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKKyNpbmNsdWRlICJMYXlvdXREZXNj
ZW5kYW50SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2Nr
LmgiCisjaW5jbHVkZSAiTGF5b3V0UmVwbGFjZWRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0
ZS5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5l
cy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChG
b3JtYXR0aW5nQ29udGV4dCk7CisKK0Zvcm1hdHRpbmdDb250ZXh0OjpGb3JtYXR0aW5nQ29udGV4
dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgRm9ybWF0dGluZ1N0
YXRlJiBmb3JtYXR0aW5nU3RhdGUpCisgICAgOiBtX3Jvb3QobWFrZVdlYWtQdHIoZm9ybWF0dGlu
Z0NvbnRleHRSb290KSkKKyAgICAsIG1fZm9ybWF0dGluZ1N0YXRlKGZvcm1hdHRpbmdTdGF0ZSkK
K3sKKyAgICBBU1NFUlQoZm9ybWF0dGluZ0NvbnRleHRSb290Lmhhc0NoaWxkKCkpOworI2lmbmRl
ZiBOREVCVUcKKyAgICBsYXlvdXRTdGF0ZSgpLnJlZ2lzdGVyRm9ybWF0dGluZ0NvbnRleHQoKnRo
aXMpOworI2VuZGlmCit9CisKK0Zvcm1hdHRpbmdDb250ZXh0Ojp+Rm9ybWF0dGluZ0NvbnRleHQo
KQoreworI2lmbmRlZiBOREVCVUcKKyAgICBsYXlvdXRTdGF0ZSgpLmRlcmVnaXN0ZXJGb3JtYXR0
aW5nQ29udGV4dCgqdGhpcyk7CisjZW5kaWYKK30KKworTGF5b3V0U3RhdGUmIEZvcm1hdHRpbmdD
b250ZXh0OjpsYXlvdXRTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZm9ybWF0dGluZ1N0
YXRlLmxheW91dFN0YXRlKCk7Cit9CisKK3ZvaWQgRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVP
dXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENv
bnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgQVNTRVJU
KGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisgICAgYXV0byBjb21wdXRlID0g
WyZdKE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRXaWR0aCkgeworICAgICAgICByZXR1cm4gZ2Vv
bWV0cnkoKS5vdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkobGF5b3V0Qm94LCBjb25zdHJhaW50
cy5ob3Jpem9udGFsLCBjb25zdHJhaW50cy52ZXJ0aWNhbCwgeyB1c2VkV2lkdGgsIHsgfSB9KTsK
KyAgICB9OworCisgICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGNvbnN0cmFpbnRzLmhv
cml6b250YWwubG9naWNhbFdpZHRoOworICAgIGF1dG8gaG9yaXpvbnRhbEdlb21ldHJ5ID0gY29t
cHV0ZSh7IH0pOworICAgIGlmIChhdXRvIG1heFdpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1h
eFdpZHRoKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpKSB7CisgICAgICAgIGF1dG8g
bWF4SG9yaXpvbnRhbEdlb21ldHJ5ID0gY29tcHV0ZShtYXhXaWR0aCk7CisgICAgICAgIGlmICho
b3Jpem9udGFsR2VvbWV0cnkuY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA+IG1h
eEhvcml6b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQor
ICAgICAgICAgICAgaG9yaXpvbnRhbEdlb21ldHJ5ID0gbWF4SG9yaXpvbnRhbEdlb21ldHJ5Owor
ICAgIH0KKworICAgIGlmIChhdXRvIG1pbldpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbldp
ZHRoKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpKSB7CisgICAgICAgIGF1dG8gbWlu
SG9yaXpvbnRhbEdlb21ldHJ5ID0gY29tcHV0ZShtaW5XaWR0aCk7CisgICAgICAgIGlmIChob3Jp
em9udGFsR2VvbWV0cnkuY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA8IG1pbkhv
cml6b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQorICAg
ICAgICAgICAgaG9yaXpvbnRhbEdlb21ldHJ5ID0gbWluSG9yaXpvbnRhbEdlb21ldHJ5OworICAg
IH0KKworICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0
cnkobGF5b3V0Qm94KTsKKyAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsTGVmdChob3Jpem9udGFs
R2VvbWV0cnkubGVmdCArIGhvcml6b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4u
dXNlZE1hcmdpbi5zdGFydCk7CisgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGhv
cml6b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKTsKKyAg
ICBhdXRvJiB1c2VkSG9yaXpvbnRhbE1hcmdpbiA9IGhvcml6b250YWxHZW9tZXRyeS5jb250ZW50
V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbjsKKyAgICBib3hHZW9tZXRyeS5zZXRIb3Jpem9udGFs
TWFyZ2luKHsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQsIHVzZWRIb3Jpem9udGFsTWFyZ2lu
LmVuZCB9KTsKK30KKwordm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZU91dE9mRmxvd1Zl
cnRpY2FsR2VvbWV0cnkoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzRm9y
T3V0T2ZGbG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgQVNTRVJUKGxheW91dEJveC5p
c091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisgICAgYXV0byBjb21wdXRlID0gWyZdKE9wdGlvbmFs
PExheW91dFVuaXQ+IHVzZWRIZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCkub3V0
T2ZGbG93VmVydGljYWxHZW9tZXRyeShsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWws
IGNvbnN0cmFpbnRzLnZlcnRpY2FsLCB7IHVzZWRIZWlnaHQgfSk7CisgICAgfTsKKworICAgIGF1
dG8gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gKmNvbnN0cmFpbnRzLnZlcnRpY2FsLmxvZ2ljYWxI
ZWlnaHQ7CisgICAgYXV0byB2ZXJ0aWNhbEdlb21ldHJ5ID0gY29tcHV0ZSh7IH0pOworICAgIGlm
IChhdXRvIG1heEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQobGF5b3V0Qm94
LCBjb250YWluaW5nQmxvY2tIZWlnaHQpKSB7CisgICAgICAgIGF1dG8gbWF4VmVydGljYWxHZW9t
ZXRyeSA9IGNvbXB1dGUobWF4SGVpZ2h0KTsKKyAgICAgICAgaWYgKHZlcnRpY2FsR2VvbWV0cnku
Y29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID4gbWF4VmVydGljYWxHZW9tZXRy
eS5jb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpCisgICAgICAgICAgICB2ZXJ0
aWNhbEdlb21ldHJ5ID0gbWF4VmVydGljYWxHZW9tZXRyeTsKKyAgICB9CisKKyAgICBpZiAoYXV0
byBtaW5IZWlnaHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluSGVpZ2h0KGxheW91dEJveCwgY29u
dGFpbmluZ0Jsb2NrSGVpZ2h0KSkgeworICAgICAgICBhdXRvIG1pblZlcnRpY2FsR2VvbWV0cnkg
PSBjb21wdXRlKG1pbkhlaWdodCk7CisgICAgICAgIGlmICh2ZXJ0aWNhbEdlb21ldHJ5LmNvbnRl
bnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCA8IG1pblZlcnRpY2FsR2VvbWV0cnkuY29u
dGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KQorICAgICAgICAgICAgdmVydGljYWxH
ZW9tZXRyeSA9IG1pblZlcnRpY2FsR2VvbWV0cnk7CisgICAgfQorCisgICAgYXV0byYgYm94R2Vv
bWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOworICAgIGF1
dG8gbm9uQ29sbGFwc2VkVmVydGljYWxNYXJnaW4gPSB2ZXJ0aWNhbEdlb21ldHJ5LmNvbnRlbnRI
ZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luOworICAgIGJveEdlb21ldHJ5LnNldExv
Z2ljYWxUb3AodmVydGljYWxHZW9tZXRyeS50b3AgKyBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdp
bi5iZWZvcmUpOworICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQodmVydGljYWxH
ZW9tZXRyeS5jb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpOworICAgIC8vIE1h
cmdpbnMgb2YgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KKyAg
ICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG5vbkNvbGxhcHNlZFZlcnRpY2FsTWFy
Z2luLmJlZm9yZSwgbm9uQ29sbGFwc2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgfSk7Cit9CisKK3Zv
aWQgRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKGNvbnN0IEJveCYg
bGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJh
aW50KQoreworICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2Vv
bWV0cnkobGF5b3V0Qm94KTsKKyAgICBib3hHZW9tZXRyeS5zZXRCb3JkZXIoZ2VvbWV0cnkoKS5j
b21wdXRlZEJvcmRlcihsYXlvdXRCb3gpKTsKKyAgICBib3hHZW9tZXRyeS5zZXRQYWRkaW5nKGdl
b21ldHJ5KCkuY29tcHV0ZWRQYWRkaW5nKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnQu
bG9naWNhbFdpZHRoKSk7Cit9CisKK3ZvaWQgRm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dE91dE9m
Rmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmIGludmFsaWRhdGlvblN0YXRlLCBjb25zdCBD
b25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAgIExPR19X
SVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJTdGFydDogbGF5
b3V0IG91dC1vZi1mbG93IGNvbnRlbnQgLT4gY29udGV4dDogIiA8PCAmbGF5b3V0U3RhdGUoKSA8
PCAiIHJvb3Q6ICIgPDwgJnJvb3QoKSk7CisKKyAgICBjb2xsZWN0T3V0T2ZGbG93RGVzY2VuZGFu
dHNJZk5lZWRlZCgpOworCisgICAgYXV0byBjb25zdHJhaW50c0ZvckxheW91dEJveCA9IFsmXSAo
Y29uc3QgYXV0byYgb3V0T2ZGbG93Qm94KSB7CisgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9j
ayA9IG91dE9mRmxvd0JveC5jb250YWluaW5nQmxvY2soKTsKKyAgICAgICAgcmV0dXJuICZjb250
YWluaW5nQmxvY2sgPT0gJnJvb3QoKSA/IGNvbnN0cmFpbnRzIDogZ2VvbWV0cnkoKS5jb25zdHJh
aW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29udGFpbmluZ0Jsb2NrKTsKKyAgICB9OworCisgICAg
Zm9yIChhdXRvJiBvdXRPZkZsb3dCb3ggOiBmb3JtYXR0aW5nU3RhdGUoKS5vdXRPZkZsb3dCb3hl
cygpKSB7CisgICAgICAgIEFTU0VSVChvdXRPZkZsb3dCb3gtPmVzdGFibGlzaGVzRm9ybWF0dGlu
Z0NvbnRleHQoKSk7CisgICAgICAgIGlmICghaW52YWxpZGF0aW9uU3RhdGUubmVlZHNMYXlvdXQo
Km91dE9mRmxvd0JveCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBhdXRvIGNv
bnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzID0gY29uc3RyYWludHNGb3JMYXlvdXRCb3goKm91dE9m
Rmxvd0JveCk7CisgICAgICAgIGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRzRm9yQm9yZGVyQW5k
UGFkZGluZyA9IEhvcml6b250YWxDb25zdHJhaW50cyB7IGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFp
bnRzLmhvcml6b250YWwubG9naWNhbExlZnQsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmJv
cmRlckFuZFBhZGRpbmdDb25zdHJhaW50cyB9OworICAgICAgICBjb21wdXRlQm9yZGVyQW5kUGFk
ZGluZygqb3V0T2ZGbG93Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHNGb3JCb3JkZXJBbmRQYWRk
aW5nKTsKKworICAgICAgICBjb21wdXRlT3V0T2ZGbG93SG9yaXpvbnRhbEdlb21ldHJ5KCpvdXRP
ZkZsb3dCb3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzKTsKKyAgICAgICAgYXV0byBvdXRP
ZkZsb3dCb3hIYXNDb250ZW50ID0gaXM8Q29udGFpbmVyQm94Pigqb3V0T2ZGbG93Qm94KSAmJiBk
b3duY2FzdDxDb250YWluZXJCb3g+KCpvdXRPZkZsb3dCb3gpLmhhc0NoaWxkKCk7CisgICAgICAg
IGlmIChvdXRPZkZsb3dCb3hIYXNDb250ZW50KSB7CisgICAgICAgICAgICBhdXRvJiBjb250YWlu
ZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KCpvdXRPZkZsb3dCb3gpOworICAgICAgICAg
ICAgYXV0byBmb3JtYXR0aW5nQ29udGV4dCA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRp
bmdDb250ZXh0KGNvbnRhaW5lckJveCwgbGF5b3V0U3RhdGUoKSk7CisgICAgICAgICAgICBpZiAo
Y29udGFpbmVyQm94Lmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQorICAgICAgICAgICAgICAg
IGZvcm1hdHRpbmdDb250ZXh0LT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRl
LCBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb250YWluZXJCb3gpKTsK
KyAgICAgICAgICAgIGNvbXB1dGVPdXRPZkZsb3dWZXJ0aWNhbEdlb21ldHJ5KGNvbnRhaW5lckJv
eCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMpOworICAgICAgICAgICAgZm9ybWF0dGluZ0Nv
bnRleHQtPmxheW91dE91dE9mRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGdlb21ldHJ5
KCkuY29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50KGNvbnRhaW5lckJveCkpOworICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgIGNvbXB1dGVPdXRPZkZsb3dWZXJ0aWNhbEdlb21ldHJ5KCpv
dXRPZkZsb3dCb3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzKTsKKyAgICB9CisgICAgTE9H
X1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIkVuZDogbGF5
b3V0IG91dC1vZi1mbG93IGNvbnRlbnQgLT4gY29udGV4dDogIiA8PCAmbGF5b3V0U3RhdGUoKSA8
PCAiIHJvb3Q6ICIgPDwgJnJvb3QoKSk7Cit9CisKK2NvbnN0IEJveEdlb21ldHJ5JiBGb3JtYXR0
aW5nQ29udGV4dDo6Z2VvbWV0cnlGb3JCb3goY29uc3QgQm94JiBsYXlvdXRCb3gsIE9wdGlvbmFs
PEVzY2FwZVJlYXNvbj4gZXNjYXBlUmVhc29uKSBjb25zdAoreworICAgIFVOVVNFRF9QQVJBTShl
c2NhcGVSZWFzb24pOworI2lmIEFTU0VSVF9FTkFCTEVECisgICAgYXV0byBpc09rVG9BY2Nlc3NC
b3hHZW9tZXRyeSA9IFsmXSB7CisgICAgICAgIGlmICghaXM8SW5pdGlhbENvbnRhaW5pbmdCbG9j
az4obGF5b3V0Qm94KSAmJiAmbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpID09ICZy
b290KCkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG5vbi1lc2NhcGUgY2FzZSBvZiBh
Y2Nlc3NpbmcgYSBib3gncyBnZW9tZXRyeSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIHNhbWUgZm9y
bWF0dGluZyBjb250ZXh0LgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAoIWVzY2FwZVJlYXNvbikgeworICAgICAgICAgICAgLy8gQW55IGdlb21ldHJ5
IGFjY2VzcyBvdXRzaWRlIG9mIHRoZSBmb3JtYXR0aW5nIGNvbnRleHQgd2l0aG91dCBhIHZhbGlk
IHJlYXNvbiBpcyBjb25zaWRlcmVkIGFuIGVzY2FwZS4KKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNv
bjo6RG9jdW1lbnRCb3hTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspIHsKKyAgICAgICAgICAgIEFT
U0VSVChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBp
czxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihsYXlvdXRCb3gpOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpCb2R5U3RyZXRjaGVzVG9WaWV3
cG9ydFF1aXJrKSB7CisgICAgICAgICAgICBBU1NFUlQobGF5b3V0U3RhdGUoKS5pblF1aXJrc01v
ZGUoKSk7CisgICAgICAgICAgICByZXR1cm4gaXM8SW5pdGlhbENvbnRhaW5pbmdCbG9jaz4obGF5
b3V0Qm94KSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpOworCisgICAgICAgIH0KKworICAg
ICAgICBpZiAoKmVzY2FwZVJlYXNvbiA9PSBFc2NhcGVSZWFzb246OlRhYmxlUXVpcmtOZWVkc0dl
b21ldHJ5RnJvbUVzdGFibGlzaGVkRm9ybWF0dGluZ0NvbnRleHQpIHsKKyAgICAgICAgICAgIC8v
IFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiB0aGUgdGFibGUgZm9ybWF0dGluZyByb290IGNvbGxlY3Rz
IGdlb21ldHJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIGNlbGwncworICAgICAgICAgICAgLy8gZm9y
bWF0dGluZyBjb250ZXh0IHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdpZHRoL2hlaWdodC4gc2Vl
IHNob3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luCisgICAgICAgICAgICBBU1NF
UlQocm9vdCgpLmVzdGFibGlzaGVzVGFibGVGb3JtYXR0aW5nQ29udGV4dCgpKTsKKyAgICAgICAg
ICAgIHJldHVybiAmbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpLmZvcm1hdHRpbmdD
b250ZXh0Um9vdCgpID09ICZyb290KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmVzY2Fw
ZVJlYXNvbiA9PSBFc2NhcGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0cnkp
IHsKKyAgICAgICAgICAgIC8vIFdoZW4gY29tcHV0aW5nIHRoZSBzdGF0aWMgcG9zaXRpb24gb2Yg
YW4gb3V0LW9mLWZsb3cgYm94LCB3ZSBuZWVkIHRvIGdhdGhlciBzaWJsaW5nL3BhcmVudCBnZW9t
ZXRyeSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgLy8gYXMgaWYgdGhlIG91dC1vZi1mbG93IGJv
eCB3YXMgYSBzaW1wbGUgaW5mbG93IGJveC4KKyAgICAgICAgICAgIC8vIE5vdyBzaW5jZSB0aGUg
b3V0LW9mLWZsb3cgYW5kIHRoZSBzaWJsaW5nL3BhcmVudCBib3hlcyBjb3VsZCB2ZXJ5IHdlbGwg
YmUgaW4gZGlmZmVyZW50IGNvbnRhaW5pbmcgYmxvY2sgc3VidHJlZXMKKyAgICAgICAgICAgIC8v
IHRoZSBmb3JtYXR0aW5nIGNvbnRleHQgdGhleSBsaXZlIGluIGNvdWxkIGFsc28gYmUgdmVyeSBk
aWZmZXJlbnQuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAg
IGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNvbjo6RmxvYXRCb3hJc0Fsd2F5c1JlbGF0
aXZlVG9GbG9hdFN0YXRlUm9vdCkgeworICAgICAgICAgICAgLy8gRmxvYXQgYm94IHRvcC9sZWZ0
IHZhbHVlcyBhcmUgbWFwcGVkIHJlbGF0aXZlIHRvIHRoZSBGbG9hdFN0YXRlJ3Mgcm9vdC4gSW5s
aW5lIGZvcm1hdHRpbmcgY29udGV4dHMoQSkgaW5oZXJpdCBmbG9hdHMgZnJvbSBwYXJlbnQKKyAg
ICAgICAgICAgIC8vIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMoQikuIEZsb2F0cyBpbiB0aGVz
ZSBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0cyhBKSBuZWVkIHRvIGJlIG1hcHBlZCB0byB0aGUg
cGFyZW50LCBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQoQikuCisgICAgICAgICAgICBhdXRvJiBm
b3JtYXR0aW5nQ29udGV4dFJvb3QgPSBsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCk7
CisgICAgICAgICAgICByZXR1cm4gJmZvcm1hdHRpbmdDb250ZXh0Um9vdCA9PSAmcm9vdCgpIHx8
ICZmb3JtYXR0aW5nQ29udGV4dFJvb3QgPT0gJnJvb3QoKS5mb3JtYXR0aW5nQ29udGV4dFJvb3Qo
KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNv
bjo6RmluZEZpeGVkSGVpZ2h0QW5jZXN0b3JRdWlyaykgeworICAgICAgICAgICAgQVNTRVJUKGxh
eW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpOworICAgICAgICAgICAgLy8gRmluZCB0aGUgZmly
c3QgY29udGFpbmluZyBibG9jayB3aXRoIGZpeGVkIGhlaWdodCBxdWlyay4gU2VlIFF1aXJrczo6
aGVpZ2h0VmFsdWVPZk5lYXJlc3RDb250YWluaW5nQmxvY2tXaXRoRml4ZWRIZWlnaHQuCisgICAg
ICAgICAgICAvLyBUaGlzIGlzIG9ubHkgdG8gY2hlY2sgaWYgdGhlIHRhcmdldEZvcm1hdHRpbmdS
b290IGlzIGFuIGFuY2VzdG9yIGZvcm1hdHRpbmcgcm9vdC4KKyAgICAgICAgICAgIGlmIChpczxJ
bml0aWFsQ29udGFpbmluZ0Jsb2NrPihsYXlvdXRCb3gpKQorICAgICAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICAgICAgYXV0byYgdGFyZ2V0Rm9ybWF0dGluZ1Jvb3QgPSBsYXlvdXRC
b3guZm9ybWF0dGluZ0NvbnRleHRSb290KCk7CisgICAgICAgICAgICBhdXRvKiBhbmNlc3RvckZv
cm1hdHRpbmdDb250ZXh0Um9vdCA9ICZyb290KCkuZm9ybWF0dGluZ0NvbnRleHRSb290KCk7Cisg
ICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGlmICgmdGFyZ2V0Rm9y
bWF0dGluZ1Jvb3QgPT0gYW5jZXN0b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QpCisgICAgICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGFuY2VzdG9yRm9ybWF0dGlu
Z0NvbnRleHRSb290ID0gJmFuY2VzdG9yRm9ybWF0dGluZ0NvbnRleHRSb290LT5mb3JtYXR0aW5n
Q29udGV4dFJvb3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXM8SW5pdGlhbENvbnRhaW5pbmdC
bG9jaz4oKmFuY2VzdG9yRm9ybWF0dGluZ0NvbnRleHRSb290KSkKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmVzY2FwZVJlYXNvbiA9PSBFc2NhcGVSZWFzb246
OlRhYmxlTmVlZHNBY2Nlc3NUb1RhYmxlV3JhcHBlcikgeworICAgICAgICAgICAgLy8gVGFibGVz
IGFyZSB3cmFwcGVkIGluIGEgMiBsZXZlbCBmb3JtYXR0aW5nIGNvbnRleHQgc3RydWN0dXJlLiBB
IDx0YWJsZT4gZWxlbWVudCBpbml0aWF0ZXMgYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgZm9y
IGl0cyBwcmluY2lwYWwgdGFibGUgYm94CisgICAgICAgICAgICAvLyB3aGVyZSB0aGUgY2FwdGlv
biBhbmQgdGhlIHRhYmxlIGNvbnRlbnQgbGl2ZS4gSXQgYWxzbyBpbml0aWF0ZXMgYSB0YWJsZSB3
cmFwcGVyIGJveCB3aGljaCBlc3RhYmxpc2hlcyB0aGUgdGFibGUgZm9ybWF0dGluZyBjb250ZXh0
LgorICAgICAgICAgICAgLy8gSW4gbWFueSBjYXNlcyB0aGUgVEZDIG5lZWRzIGFjY2VzcyB0byB0
aGUgcGFyZW50IChnZW5lcmF0ZWQpIEJGQy4KKyAgICAgICAgICAgIHJldHVybiAmbGF5b3V0Qm94
ID09ICZyb290KCkuZm9ybWF0dGluZ0NvbnRleHRSb290KCk7CisgICAgICAgIH0KKworICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07Cisj
ZW5kaWYKKyAgICBBU1NFUlQoaXNPa1RvQWNjZXNzQm94R2VvbWV0cnkoKSk7CisgICAgQVNTRVJU
KGxheW91dFN0YXRlKCkuaGFzQm94R2VvbWV0cnkobGF5b3V0Qm94KSk7CisgICAgcmV0dXJuIGxh
eW91dFN0YXRlKCkuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKK30KKwordm9pZCBGb3JtYXR0
aW5nQ29udGV4dDo6Y29sbGVjdE91dE9mRmxvd0Rlc2NlbmRhbnRzSWZOZWVkZWQoKQoreworICAg
IGlmICghZm9ybWF0dGluZ1N0YXRlKCkub3V0T2ZGbG93Qm94ZXMoKS5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybjsKKyAgICBhdXRvJiByb290ID0gdGhpcy0+cm9vdCgpOworICAgIGlmICghcm9v
dC5oYXNDaGlsZCgpKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFyb290LmlzUG9zaXRpb25l
ZCgpICYmICFpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihyb290KSkKKyAgICAgICAgcmV0dXJu
OworICAgIC8vIENvbGxlY3QgdGhlIG91dC1vZi1mbG93IGRlc2NlbmRhbnRzIGF0IHRoZSBmb3Jt
YXR0aW5nIHJvb3QgbGV2ZWwgKGFzIG9wcG9zZWQgdG8gYXQgdGhlIGNvbnRhaW5pbmcgYmxvY2sg
bGV2ZWwsIHRob3VnaCB0aGV5IG1pZ2h0IGJlIHRoZSBzYW1lKS4KKyAgICAvLyBGSVhNRTogVHVy
biB0aGlzIGludG8gYSByZWdpc3Rlci1zZWxmIGFzIGJveGVzIGFyZSBiZWluZyBpbnNlcnRlZC4K
KyAgICBmb3IgKGF1dG8mIGRlc2NlbmRhbnQgOiBkZXNjZW5kYW50c09mVHlwZTxCb3g+KHJvb3Qp
KSB7CisgICAgICAgIGlmICghZGVzY2VuZGFudC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoJmRlc2NlbmRhbnQuZm9ybWF0dGluZ0Nv
bnRleHRSb290KCkgIT0gJnJvb3QpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9y
bWF0dGluZ1N0YXRlKCkuYWRkT3V0T2ZGbG93Qm94KGRlc2NlbmRhbnQpOworICAgIH0KK30KKwor
I2lmbmRlZiBOREVCVUcKK3ZvaWQgRm9ybWF0dGluZ0NvbnRleHQ6OnZhbGlkYXRlR2VvbWV0cnlD
b25zdHJhaW50c0FmdGVyTGF5b3V0KCkgY29uc3QKK3sKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29u
dGV4dFJvb3QgPSByb290KCk7CisgICAgLy8gRklYTUU6IGFkZCBhIGRlc2NlbmRhbnRzT2ZUeXBl
PD4gZmxhdm9yIHRoYXQgc3RvcHMgYXQgbmVzdGVkIGZvcm1hdHRpbmcgY29udGV4dHMKKyAgICBm
b3IgKGF1dG8mIGxheW91dEJveCA6IGRlc2NlbmRhbnRzT2ZUeXBlPEJveD4oZm9ybWF0dGluZ0Nv
bnRleHRSb290KSkgeworICAgICAgICBpZiAoJmxheW91dEJveC5mb3JtYXR0aW5nQ29udGV4dFJv
b3QoKSAhPSAmZm9ybWF0dGluZ0NvbnRleHRSb290KQorICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9ja0dlb21ldHJ5ID0gZ2VvbWV0cnlGb3JCb3gobGF5
b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpKTsKKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBn
ZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOworCisgICAgICAgIC8vIDEwLjMuMyBCbG9jay1sZXZl
bCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93CisgICAgICAgIC8vIDEwLjMu
NyBBYnNvbHV0ZWx5IHBvc2l0aW9uZWQsIG5vbi1yZXBsYWNlZCBlbGVtZW50cworICAgICAgICBp
ZiAoKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSB8fCBsYXlvdXRCb3guaXNPdXRPZkZsb3dQ
b3NpdGlvbmVkKCkpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKSB7CisgICAgICAgICAg
ICAvLyBtYXJnaW4tbGVmdCArIGJvcmRlci1sZWZ0LXdpZHRoICsgcGFkZGluZy1sZWZ0ICsgd2lk
dGggKyBwYWRkaW5nLXJpZ2h0ICsgYm9yZGVyLXJpZ2h0LXdpZHRoICsgbWFyZ2luLXJpZ2h0ID0g
d2lkdGggb2YgY29udGFpbmluZyBibG9jaworICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxv
Y2tXaWR0aCA9IGNvbnRhaW5pbmdCbG9ja0dlb21ldHJ5LmNvbnRlbnRCb3hXaWR0aCgpOworICAg
ICAgICAgICAgQVNTRVJUKGJveEdlb21ldHJ5Lmhvcml6b250YWxNYXJnaW5Cb3JkZXJBbmRQYWRk
aW5nKCkgKyBib3hHZW9tZXRyeS5jb250ZW50Qm94V2lkdGgoKSA9PSBjb250YWluaW5nQmxvY2tX
aWR0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLyAxMC42LjQgQWJzb2x1dGVseSBwb3NpdGlv
bmVkLCBub24tcmVwbGFjZWQgZWxlbWVudHMKKyAgICAgICAgaWYgKGxheW91dEJveC5pc091dE9m
Rmxvd1Bvc2l0aW9uZWQoKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkgeworICAgICAg
ICAgICAgLy8gdG9wICsgbWFyZ2luLXRvcCArIGJvcmRlci10b3Atd2lkdGggKyBwYWRkaW5nLXRv
cCArIGhlaWdodCArIHBhZGRpbmctYm90dG9tICsgYm9yZGVyLWJvdHRvbS13aWR0aCArIG1hcmdp
bi1ib3R0b20gKyBib3R0b20gPSBoZWlnaHQgb2YgY29udGFpbmluZyBibG9jaworICAgICAgICAg
ICAgYXV0byBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBjb250YWluaW5nQmxvY2tHZW9tZXRyeS5j
b250ZW50Qm94SGVpZ2h0KCk7CisgICAgICAgICAgICBBU1NFUlQoQm94R2VvbWV0cnk6OmJvcmRl
ckJveFRvcChib3hHZW9tZXRyeSkgKyBib3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUoKSArIGJveEdl
b21ldHJ5LmJvcmRlclRvcCgpICsgYm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCkg
KyBib3hHZW9tZXRyeS5jb250ZW50Qm94SGVpZ2h0KCkKKyAgICAgICAgICAgICAgICArIGJveEdl
b21ldHJ5LnBhZGRpbmdCb3R0b20oKS52YWx1ZU9yKDApICsgYm94R2VvbWV0cnkuYm9yZGVyQm90
dG9tKCkgKyBib3hHZW9tZXRyeS5tYXJnaW5BZnRlcigpID09IGNvbnRhaW5pbmdCbG9ja0hlaWdo
dCk7CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKworfQorfQorI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL0Zvcm1hdHRpbmdD
b250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL0Zvcm1h
dHRpbmdDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNzExMDI1NTg4ZWM0YTAzZDllMzVhMGFjOTMwYTc3
NmM2MjNmODQ0NAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHQuaApAQCAtMCwwICsxLDI3MyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NP
TlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNsdWRlICJMYXlv
dXRVbml0LmgiCisjaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFs
bG9jLmg+CisjaW5jbHVkZSA8d3RmL1dlYWtQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitjbGFzcyBMYXlvdXRTaXplOworc3RydWN0IExlbmd0aDsKKworbmFtZXNwYWNlIExheW91dCB7
CisKK2NsYXNzIEJveEdlb21ldHJ5OworY2xhc3MgUmVwbGFjZWRCb3g7CitzdHJ1Y3QgQ29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luOworc3RydWN0IENvbXB1dGVkVmVydGljYWxNYXJnaW47CitjbGFz
cyBDb250YWluZXJCb3g7CitzdHJ1Y3QgQ29udGVudEhlaWdodEFuZE1hcmdpbjsKK3N0cnVjdCBD
b250ZW50V2lkdGhBbmRNYXJnaW47CitzdHJ1Y3QgRWRnZXM7CitjbGFzcyBGb3JtYXR0aW5nU3Rh
dGU7CitzdHJ1Y3QgSG9yaXpvbnRhbEdlb21ldHJ5OworY2xhc3MgSW52YWxpZGF0aW9uU3RhdGU7
CitjbGFzcyBMYXlvdXRTdGF0ZTsKK3N0cnVjdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlczsK
K3N0cnVjdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXM7CitzdHJ1Y3QgVmVydGljYWxHZW9tZXRy
eTsKKworY2xhc3MgRm9ybWF0dGluZ0NvbnRleHQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FU
RUQoRm9ybWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAgIEZvcm1hdHRpbmdDb250ZXh0KGNv
bnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBGb3JtYXR0aW5nU3RhdGUm
KTsKKyAgICB2aXJ0dWFsIH5Gb3JtYXR0aW5nQ29udGV4dCgpOworCisgICAgc3RydWN0IENvbnN0
cmFpbnRzRm9ySW5GbG93Q29udGVudCB7CisgICAgICAgIEhvcml6b250YWxDb25zdHJhaW50cyBo
b3Jpem9udGFsOworICAgICAgICBWZXJ0aWNhbENvbnN0cmFpbnRzIHZlcnRpY2FsOworICAgIH07
CisgICAgdmlydHVhbCB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUm
LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSA9IDA7CisKKyAgICBzdHJ1Y3Qg
Q29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50IHsKKyAgICAgICAgSG9yaXpvbnRhbENvbnN0
cmFpbnRzIGhvcml6b250YWw7CisgICAgICAgIFZlcnRpY2FsQ29uc3RyYWludHMgdmVydGljYWw7
CisgICAgICAgIC8vIEJvcmRlcnMgYW5kIHBhZGRpbmcgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhl
IGNvbnRhaW5pbmcgYmxvY2sncyBjb250ZW50IGJveCBhcyBpZiB0aGUgYm94IHdhcyBhbiBpbi1m
bG93IGJveC4KKyAgICAgICAgTGF5b3V0VW5pdCBib3JkZXJBbmRQYWRkaW5nQ29uc3RyYWludHM7
CisgICAgfTsKKyAgICB2b2lkIGxheW91dE91dE9mRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3Rh
dGUmLCBjb25zdCBDb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQmKTsKKworICAgIHN0cnVj
dCBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsKKyAgICAgICAgdm9pZCBleHBhbmQoTGF5b3V0
VW5pdCBob3Jpem9udGFsVmFsdWUpOworICAgICAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
JiBvcGVyYXRvcis9KGNvbnN0IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmKTsKKyAgICAgICAg
SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3BlcmF0b3IrPShMYXlvdXRVbml0KTsKKyAgICAg
ICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3BlcmF0b3ItPShjb25zdCBJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzJik7CisgICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIG9w
ZXJhdG9yLT0oTGF5b3V0VW5pdCk7CisKKyAgICAgICAgTGF5b3V0VW5pdCBtaW5pbXVtOworICAg
ICAgICBMYXlvdXRVbml0IG1heGltdW07CisgICAgfTsKKyAgICB2aXJ0dWFsIEludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgPSAwOwor
ICAgIHZpcnR1YWwgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0ID0gMDsKKwor
ICAgIGJvb2wgaXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgp
LmVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpOyB9CisgICAgYm9vbCBpc0lubGlu
ZUZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFibGlzaGVzSW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQoKTsgfQorICAgIGJvb2wgaXNUYWJsZUZvcm1hdHRpbmdDb250
ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFibGlzaGVzVGFibGVGb3JtYXR0aW5nQ29u
dGV4dCgpOyB9CisgICAgYm9vbCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQo
KSBjb25zdCB7IHJldHVybiBpc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSAmJiByb290KCkuaXNU
YWJsZVdyYXBwZXJCb3goKTsgfQorICAgIGJvb2wgaXNGbGV4Rm9ybWF0dGluZ0NvbnRleHQoKSBj
b25zdCB7IHJldHVybiByb290KCkuZXN0YWJsaXNoZXNGbGV4Rm9ybWF0dGluZ0NvbnRleHQoKTsg
fQorCisgICAgZW51bSBjbGFzcyBFc2NhcGVSZWFzb24geworICAgICAgICBUYWJsZVF1aXJrTmVl
ZHNHZW9tZXRyeUZyb21Fc3RhYmxpc2hlZEZvcm1hdHRpbmdDb250ZXh0LAorICAgICAgICBPdXRP
ZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5LAorICAgICAgICBGbG9hdEJveElzQWx3YXlzUmVs
YXRpdmVUb0Zsb2F0U3RhdGVSb290LAorICAgICAgICBGaW5kRml4ZWRIZWlnaHRBbmNlc3RvclF1
aXJrLAorICAgICAgICBEb2N1bWVudEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaywKKyAgICAg
ICAgQm9keVN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaywKKyAgICAgICAgVGFibGVOZWVkc0FjY2Vz
c1RvVGFibGVXcmFwcGVyCisgICAgfTsKKyAgICBjb25zdCBCb3hHZW9tZXRyeSYgZ2VvbWV0cnlG
b3JCb3goY29uc3QgQm94JiwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiA9IFdURjo6bnVsbG9wdCkg
Y29uc3Q7CisgICAgY29uc3QgQ29udGFpbmVyQm94JiByb290KCkgY29uc3QgeyByZXR1cm4gKm1f
cm9vdDsgfQorCisgICAgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgY29uc3Q7CisKK3Byb3Rl
Y3RlZDoKKyAgICB1c2luZyBMYXlvdXRRdWV1ZSA9IFZlY3Rvcjxjb25zdCBCb3gqPjsKKworICAg
IGNvbnN0IEZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKCkgY29uc3QgeyByZXR1cm4g
bV9mb3JtYXR0aW5nU3RhdGU7IH0KKyAgICBGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0
ZSgpIHsgcmV0dXJuIG1fZm9ybWF0dGluZ1N0YXRlOyB9CisKKyAgICB2b2lkIGNvbXB1dGVCb3Jk
ZXJBbmRQYWRkaW5nKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOwor
CisjaWZuZGVmIE5ERUJVRworICAgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZUdlb21ldHJ5Q29uc3Ry
YWludHNBZnRlckxheW91dCgpIGNvbnN0OworI2VuZGlmCisKKyAgICAvLyBUaGlzIGNsYXNzIGlt
cGxlbWVudHMgZ2VuZXJpYyBwb3NpdGlvbmluZyBhbmQgc2l6aW5nLgorICAgIGNsYXNzIEdlb21l
dHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFZlcnRpY2FsR2VvbWV0cnkgb3V0T2ZGbG93VmVy
dGljYWxHZW9tZXRyeShjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBj
b25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVz
JikgY29uc3Q7CisgICAgICAgIEhvcml6b250YWxHZW9tZXRyeSBvdXRPZkZsb3dIb3Jpem9udGFs
R2VvbWV0cnkoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3Qg
VmVydGljYWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7
CisKKyAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBmbG9hdGluZ0NvbnRlbnRIZWlnaHRB
bmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3Qg
T3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7CisgICAgICAgIENvbnRlbnRXaWR0aEFu
ZE1hcmdpbiBmbG9hdGluZ0NvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBI
b3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYp
OworCisgICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5saW5lUmVwbGFjZWRDb250ZW50
SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0
cmFpbnRzJiwgT3B0aW9uYWw8VmVydGljYWxDb25zdHJhaW50cz4sIGNvbnN0IE92ZXJyaWRkZW5W
ZXJ0aWNhbFZhbHVlcyYpIGNvbnN0OworICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gaW5s
aW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmLCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBPcHRpb25hbDxWZXJ0aWNhbENvbnN0cmFpbnRzPiwg
Y29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKworICAgICAgICBMYXlvdXRTaXpl
IGluRmxvd1Bvc2l0aW9uZWRQb3NpdGlvbk9mZnNldChjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmKSBjb25zdDsKKworICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2lu
IGNvbXBsaWNhdGVkQ2FzZXMoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7CisgICAgICAgIExheW91
dFVuaXQgc2hyaW5rVG9GaXRXaWR0aChjb25zdCBCb3gmLCBMYXlvdXRVbml0IGF2YWlsYWJsZVdp
ZHRoKTsKKworICAgICAgICBFZGdlcyBjb21wdXRlZEJvcmRlcihjb25zdCBCb3gmKSBjb25zdDsK
KyAgICAgICAgT3B0aW9uYWw8RWRnZXM+IGNvbXB1dGVkUGFkZGluZyhjb25zdCBCb3gmLCBMYXlv
dXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSBjb25zdDsKKworICAgICAgICBDb21wdXRlZEhv
cml6b250YWxNYXJnaW4gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0
IEhvcml6b250YWxDb25zdHJhaW50cyYpIGNvbnN0OworICAgICAgICBDb21wdXRlZFZlcnRpY2Fs
TWFyZ2luIGNvbXB1dGVkVmVydGljYWxNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJikgY29uc3Q7CisKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29t
cHV0ZWRWYWx1ZShjb25zdCBMZW5ndGgmIGdlb21ldHJ5UHJvcGVydHksIExheW91dFVuaXQgY29u
dGFpbmluZ0Jsb2NrV2lkdGgpIGNvbnN0OworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBm
aXhlZFZhbHVlKGNvbnN0IExlbmd0aCYgZ2VvbWV0cnlQcm9wZXJ0eSkgY29uc3Q7CisKKyAgICAg
ICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRNaW5IZWlnaHQoY29uc3QgQm94JiwgT3B0
aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RGOjpudWxsb3B0KSBj
b25zdDsKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRNYXhIZWlnaHQoY29u
c3QgQm94JiwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RG
OjpudWxsb3B0KSBjb25zdDsKKworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRl
ZE1pbldpZHRoKGNvbnN0IEJveCYsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwor
ICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZE1heFdpZHRoKGNvbnN0IEJveCYs
IExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworCisgICAgICAgIEZvcm1hdHRpbmdD
b250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbnN0cmFpbkJ5TWluTWF4V2lkdGgo
Y29uc3QgQm94JiwgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cykgY29uc3Q7CisKKyAgICAgICAg
TGF5b3V0VW5pdCBjb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KGNvbnN0IENv
bnRhaW5lckJveCYpIGNvbnN0OworCisgICAgICAgIENvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29u
dGVudCBjb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29uc3QgQ29udGFpbmVyQm94Jik7
CisgICAgICAgIENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBjb25zdHJhaW50c0ZvckluRmxv
d0NvbnRlbnQoY29uc3QgQ29udGFpbmVyQm94JiwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiA9IFdU
Rjo6bnVsbG9wdCk7CisKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRIZWln
aHQoY29uc3QgQm94JiwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0
ID0gV1RGOjpudWxsb3B0KSBjb25zdDsKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29t
cHV0ZWRXaWR0aChjb25zdCBCb3gmLCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsK
KworICAgIHByb3RlY3RlZDoKKyAgICAgICAgZnJpZW5kIGNsYXNzIEZvcm1hdHRpbmdDb250ZXh0
OworICAgICAgICBHZW9tZXRyeShjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYpOworCisgICAgICAg
IGNvbnN0IExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0
dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQorICAgICAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0
U3RhdGUoKSB7IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0LmxheW91dFN0YXRlKCk7IH0KKyAg
ICAgICAgY29uc3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3Qg
eyByZXR1cm4gbV9mb3JtYXR0aW5nQ29udGV4dDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAg
VmVydGljYWxHZW9tZXRyeSBvdXRPZkZsb3dSZXBsYWNlZFZlcnRpY2FsR2VvbWV0cnkoY29uc3Qg
UmVwbGFjZWRCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBWZXJ0aWNh
bENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7Cisg
ICAgICAgIEhvcml6b250YWxHZW9tZXRyeSBvdXRPZkZsb3dSZXBsYWNlZEhvcml6b250YWxHZW9t
ZXRyeShjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNv
bnN0IFZlcnRpY2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVl
cyYpOworCisgICAgICAgIFZlcnRpY2FsR2VvbWV0cnkgb3V0T2ZGbG93Tm9uUmVwbGFjZWRWZXJ0
aWNhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGlj
YWxWYWx1ZXMmKSBjb25zdDsKKyAgICAgICAgSG9yaXpvbnRhbEdlb21ldHJ5IG91dE9mRmxvd05v
blJlcGxhY2VkSG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7
CisKKyAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBmbG9hdGluZ1JlcGxhY2VkQ29udGVu
dEhlaWdodEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpIGNvbnN0OworICAgICAg
ICBDb250ZW50V2lkdGhBbmRNYXJnaW4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1h
cmdpbihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNv
bnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7CisKKyAgICAgICAgQ29udGVudFdpZHRo
QW5kTWFyZ2luIGZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3Qg
Qm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6
b250YWxWYWx1ZXMmKTsKKworICAgICAgICBMYXlvdXRVbml0IHN0YXRpY1ZlcnRpY2FsUG9zaXRp
b25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYsIGNvbnN0IFZlcnRpY2FsQ29uc3Ry
YWludHMmKSBjb25zdDsKKyAgICAgICAgTGF5b3V0VW5pdCBzdGF0aWNIb3Jpem9udGFsUG9zaXRp
b25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYpIGNvbnN0OworCisgICAgICAgIGVudW0gY2xhc3MgSGVpZ2h0VHlwZSB7IE1pbiwg
TWF4LCBOb3JtYWwgfTsKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRIZWln
aHRWYWx1ZShjb25zdCBCb3gmLCBIZWlnaHRUeXBlLCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250
YWluaW5nQmxvY2tIZWlnaHQpIGNvbnN0OworCisgICAgICAgIGVudW0gY2xhc3MgV2lkdGhUeXBl
IHsgTWluLCBNYXgsIE5vcm1hbCB9OworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21w
dXRlZFdpZHRoVmFsdWUoY29uc3QgQm94JiwgV2lkdGhUeXBlLCBMYXlvdXRVbml0IGNvbnRhaW5p
bmdCbG9ja1dpZHRoKTsKKworICAgICAgICBjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgbV9mb3Jt
YXR0aW5nQ29udGV4dDsKKyAgICB9OworICAgIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSBn
ZW9tZXRyeSgpIGNvbnN0IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlzKTsgfQorCisgICAgY2xhc3Mg
UXVpcmtzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFF1aXJrcyhjb25zdCBGb3JtYXR0aW5nQ29u
dGV4dCYpOworCisgICAgICAgIExheW91dFVuaXQgaGVpZ2h0VmFsdWVPZk5lYXJlc3RDb250YWlu
aW5nQmxvY2tXaXRoRml4ZWRIZWlnaHQoY29uc3QgQm94Jik7CisKKyAgICBwcm90ZWN0ZWQ6Cisg
ICAgICAgIGNvbnN0IExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1f
Zm9ybWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQorICAgICAgICBMYXlvdXRTdGF0ZSYg
bGF5b3V0U3RhdGUoKSB7IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0LmxheW91dFN0YXRlKCk7
IH0KKyAgICAgICAgY29uc3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkg
Y29uc3QgeyByZXR1cm4gbV9mb3JtYXR0aW5nQ29udGV4dDsgfQorCisgICAgICAgIGNvbnN0IEZv
cm1hdHRpbmdDb250ZXh0JiBtX2Zvcm1hdHRpbmdDb250ZXh0OworICAgIH07CisgICAgRm9ybWF0
dGluZ0NvbnRleHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMp
OyB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBjb2xsZWN0T3V0T2ZGbG93RGVzY2VuZGFudHNJZk5l
ZWRlZCgpOworICAgIHZvaWQgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoY29uc3Qg
Qm94JiwgY29uc3QgQ29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50Jik7CisgICAgdm9pZCBj
b21wdXRlT3V0T2ZGbG93SG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0IEJveCYsIGNvbnN0IENvbnN0
cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCYpOworCisgICAgV2Vha1B0cjxjb25zdCBDb250YWlu
ZXJCb3g+IG1fcm9vdDsKKyAgICBGb3JtYXR0aW5nU3RhdGUmIG1fZm9ybWF0dGluZ1N0YXRlOwor
fTsKKworaW5saW5lIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6R2VvbWV0cnkoY29uc3Qg
Rm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KQorICAgIDogbV9mb3JtYXR0aW5n
Q29udGV4dChmb3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworaW5saW5lIEZvcm1hdHRpbmdDb250
ZXh0OjpRdWlya3M6OlF1aXJrcyhjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0Nv
bnRleHQpCisgICAgOiBtX2Zvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0KQorewor
fQorCitpbmxpbmUgdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJh
aW50czo6ZXhwYW5kKExheW91dFVuaXQgaG9yaXpvbnRhbFZhbHVlKQoreworICAgIG1pbmltdW0g
Kz0gaG9yaXpvbnRhbFZhbHVlOworICAgIG1heGltdW0gKz0gaG9yaXpvbnRhbFZhbHVlOworfQor
CitpbmxpbmUgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIEZv
cm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOjpvcGVyYXRvcis9KGNv
bnN0IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIG90aGVyKQoreworICAgIG1pbmltdW0gKz0g
b3RoZXIubWluaW11bTsKKyAgICBtYXhpbXVtICs9IG90aGVyLm1heGltdW07CisgICAgcmV0dXJu
ICp0aGlzOworfQorCitpbmxpbmUgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMmIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOjpv
cGVyYXRvcis9KExheW91dFVuaXQgdmFsdWUpCit7CisgICAgZXhwYW5kKHZhbHVlKTsKKyAgICBy
ZXR1cm4gKnRoaXM7Cit9CisKK2lubGluZSBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lk
dGhDb25zdHJhaW50cyYgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHM6Om9wZXJhdG9yLT0oY29uc3QgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3RoZXIpCit7
CisgICAgbWluaW11bSAtPSBvdGhlci5taW5pbXVtOworICAgIG1heGltdW0gLT0gb3RoZXIubWF4
aW11bTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2lubGluZSBGb3JtYXR0aW5nQ29udGV4dDo6
SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHM6Om9wZXJhdG9yLT0oTGF5b3V0VW5pdCB2YWx1ZSkKK3sKKyAgICBleHBh
bmQoLXZhbHVlKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK30KK30KKworI2RlZmluZSBTUEVD
SUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoVG9WYWx1ZVR5cGVO
YW1lLCBwcmVkaWNhdGUpIFwKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfQkVHSU4oV2ViQ29yZTo6
TGF5b3V0OjpUb1ZhbHVlVHlwZU5hbWUpIFwKKyAgICBzdGF0aWMgYm9vbCBpc1R5cGUoY29uc3Qg
V2ViQ29yZTo6TGF5b3V0OjpGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQpIHsg
cmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0LnByZWRpY2F0ZTsgfSBcCitTUEVDSUFMSVpFX1RZUEVf
VFJBSVRTX0VORCgpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9Gb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHRHZW9t
ZXRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uOWViMTk2NTdiOGJlNzE5OWFhM2ZmYzIwNmY1NzIxYTcyY2Q2
MmM4MQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKQEAgLTAsMCArMSwxMTY1IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvcm1hdHRpbmdD
b250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2lu
Y2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdT
dGF0ZS5oIgorI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIkZsb2F0aW5n
U3RhdGUuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJM
YXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRhaW5pbmdCbG9jay5o
IgorI2luY2x1ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgor
I2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K25hbWVzcGFjZSBMYXlvdXQgeworCitzdGF0aWMgaW5saW5lIGJvb2wgaXNIZWlnaHRBdXRvKGNv
bnN0IEJveCYgbGF5b3V0Qm94KQoreworICAgIC8vIDEwLjUgQ29udGVudCBoZWlnaHQ6IHRoZSAn
aGVpZ2h0JyBwcm9wZXJ0eQorICAgIC8vCisgICAgLy8gVGhlIHBlcmNlbnRhZ2UgaXMgY2FsY3Vs
YXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGhlaWdodCBvZiB0aGUgZ2VuZXJhdGVkIGJveCdzIGNv
bnRhaW5pbmcgYmxvY2suCisgICAgLy8gSWYgdGhlIGhlaWdodCBvZiB0aGUgY29udGFpbmluZyBi
bG9jayBpcyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHkgKGkuZS4sIGl0IGRlcGVuZHMgb24gY29u
dGVudCBoZWlnaHQpLAorICAgIC8vIGFuZCB0aGlzIGVsZW1lbnQgaXMgbm90IGFic29sdXRlbHkg
cG9zaXRpb25lZCwgdGhlIHVzZWQgaGVpZ2h0IGlzIGNhbGN1bGF0ZWQgYXMgaWYgJ2F1dG8nIHdh
cyBzcGVjaWZpZWQuCisKKyAgICBhdXRvIGhlaWdodCA9IGxheW91dEJveC5zdHlsZSgpLmxvZ2lj
YWxIZWlnaHQoKTsKKyAgICBpZiAoaGVpZ2h0LmlzQXV0bygpKQorICAgICAgICByZXR1cm4gdHJ1
ZTsKKworICAgIGlmIChoZWlnaHQuaXNQZXJjZW50KCkpIHsKKyAgICAgICAgaWYgKGxheW91dEJv
eC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgICAgICByZXR1cm4gIWxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5zdHlsZSgpLmxvZ2lj
YWxIZWlnaHQoKS5pc0ZpeGVkKCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitP
cHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVk
SGVpZ2h0VmFsdWUoY29uc3QgQm94JiBsYXlvdXRCb3gsIEhlaWdodFR5cGUgaGVpZ2h0VHlwZSwg
T3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSBjb25zdAoreworICAg
IGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgYXV0byBoZWlnaHQgPSBoZWln
aHRUeXBlID09IEhlaWdodFR5cGU6Ok5vcm1hbCA/IHN0eWxlLmxvZ2ljYWxIZWlnaHQoKSA6IGhl
aWdodFR5cGUgPT0gSGVpZ2h0VHlwZTo6TWluID8gc3R5bGUubG9naWNhbE1pbkhlaWdodCgpIDog
c3R5bGUubG9naWNhbE1heEhlaWdodCgpOworICAgIGlmIChoZWlnaHQuaXNVbmRlZmluZWQoKSB8
fCBoZWlnaHQuaXNBdXRvKCkgfHwgaGVpZ2h0LmlzTWF4Q29udGVudCgpIHx8IGhlaWdodC5pc01p
bkNvbnRlbnQoKSB8fCBoZWlnaHQuaXNGaXRDb250ZW50KCkpCisgICAgICAgIHJldHVybiB7IH07
CisKKyAgICBpZiAoaGVpZ2h0LmlzRml4ZWQoKSkKKyAgICAgICAgcmV0dXJuIExheW91dFVuaXQg
eyBoZWlnaHQudmFsdWUoKSB9OworCisgICAgaWYgKCFjb250YWluaW5nQmxvY2tIZWlnaHQpIHsK
KyAgICAgICAgaWYgKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpCisgICAgICAgICAgICBj
b250YWluaW5nQmxvY2tIZWlnaHQgPSBmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJrcygpLmhlaWdo
dFZhbHVlT2ZOZWFyZXN0Q29udGFpbmluZ0Jsb2NrV2l0aEZpeGVkSGVpZ2h0KGxheW91dEJveCk7
CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXV0byBub25Bbm9ueW1vdXNDb250YWluaW5n
QmxvY2tMb2dpY2FsSGVpZ2h0ID0gWyZdIHsKKyAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBi
bG9jayBsZXZlbCBib3ggaXMgYSBkaXJlY3QgY2hpbGQgb2YgYW4gaW5saW5lIGxldmVsIGJveCAo
PHNwYW4+PGRpdj48L2Rpdj48L3NwYW4+KSBhbmQgd2Ugd3JhcCBpdCBpbnRvIGEgY29udGludWF0
aW9uLAorICAgICAgICAgICAgICAgIC8vIHRoZSBjb250YWluaW5nIGJsb2NrIChhbm9ueW1vdXMg
d3JhcHBlcikgaXMgbm90IHRoZSBib3ggd2UgbmVlZCB0byBjaGVjayBmb3IgZml4ZWQgaGVpZ2h0
LgorICAgICAgICAgICAgICAgIGF1dG8mIGluaXRpYWxDb250YWluaW5nQmxvY2sgPSBsYXlvdXRC
b3guaW5pdGlhbENvbnRhaW5pbmdCbG9jaygpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byog
Y29udGFpbmluZ0Jsb2NrID0gJmxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsgY29udGFpbmlu
Z0Jsb2NrICE9ICZpbml0aWFsQ29udGFpbmluZ0Jsb2NrOyBjb250YWluaW5nQmxvY2sgPSAmY29u
dGFpbmluZ0Jsb2NrLT5jb250YWluaW5nQmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICBp
ZiAoY29udGFpbmluZ0Jsb2NrLT5pc0Fub255bW91cygpKQorICAgICAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluaW5nQmxvY2st
PnN0eWxlKCkubG9naWNhbEhlaWdodCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICByZXR1cm4gaW5pdGlhbENvbnRhaW5pbmdCbG9jay5zdHlsZSgpLmxvZ2ljYWxIZWlnaHQo
KTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBm
aXhlZFZhbHVlKG5vbkFub255bW91c0NvbnRhaW5pbmdCbG9ja0xvZ2ljYWxIZWlnaHQoKSk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWNvbnRhaW5pbmdCbG9ja0hlaWdodCkKKyAgICAg
ICAgcmV0dXJuIHsgfTsKKworICAgIHJldHVybiB2YWx1ZUZvckxlbmd0aChoZWlnaHQsICpjb250
YWluaW5nQmxvY2tIZWlnaHQpOworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0aW5n
Q29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkSGVpZ2h0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBP
cHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQpIGNvbnN0Cit7CisgICAg
aWYgKGF1dG8gaGVpZ2h0ID0gY29tcHV0ZWRIZWlnaHRWYWx1ZShsYXlvdXRCb3gsIEhlaWdodFR5
cGU6Ok5vcm1hbCwgY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSkgeworICAgICAgICBpZiAobGF5b3V0
Qm94LnN0eWxlKCkuYm94U2l6aW5nKCkgPT0gQm94U2l6aW5nOjpDb250ZW50Qm94KQorICAgICAg
ICAgICAgcmV0dXJuIGhlaWdodDsKKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0
aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAgICAgIHJldHVybiAq
aGVpZ2h0IC0gKGJveEdlb21ldHJ5LnZlcnRpY2FsQm9yZGVyKCkgKyBib3hHZW9tZXRyeS52ZXJ0
aWNhbFBhZGRpbmcoKS52YWx1ZU9yKDApKTsKKyAgICB9CisgICAgcmV0dXJuIHsgfTsKK30KKwor
T3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRl
ZFdpZHRoVmFsdWUoY29uc3QgQm94JiBsYXlvdXRCb3gsIFdpZHRoVHlwZSB3aWR0aFR5cGUsIExh
eW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpCit7CisgICAgLy8gQXBwbGllcyB0bzogYWxs
IGVsZW1lbnRzIGV4Y2VwdCBub24tcmVwbGFjZWQgaW5saW5lcyAob3V0LW9mLWZsb3cgY2hlY2sg
aXMgcmVxdWlyZWQgZm9yIHBvc2l0aW9uZWQgPGJyPiBhcyBmb3Igc29tZSByZWFzb24gd2UgZG9u
J3QgYmxvY2tpZnkgdGhlbSkuCisgICAgQVNTRVJUKCFsYXlvdXRCb3guaXNJbmxpbmVCb3goKSB8
fCBsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOworCisgICAgYXV0byB3aWR0aCA9
IFsmXSB7CisgICAgICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgICAg
IHN3aXRjaCAod2lkdGhUeXBlKSB7CisgICAgICAgIGNhc2UgV2lkdGhUeXBlOjpOb3JtYWw6Cisg
ICAgICAgICAgICByZXR1cm4gc3R5bGUubG9naWNhbFdpZHRoKCk7CisgICAgICAgIGNhc2UgV2lk
dGhUeXBlOjpNaW46CisgICAgICAgICAgICByZXR1cm4gc3R5bGUubG9naWNhbE1pbldpZHRoKCk7
CisgICAgICAgIGNhc2UgV2lkdGhUeXBlOjpNYXg6CisgICAgICAgICAgICByZXR1cm4gc3R5bGUu
bG9naWNhbE1heFdpZHRoKCk7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgICAgIHJldHVybiBzdHlsZS5sb2dpY2FsV2lkdGgoKTsKKyAgICB9KCk7CisgICAg
aWYgKGF1dG8gY29tcHV0ZWRWYWx1ZSA9IHRoaXMtPmNvbXB1dGVkVmFsdWUod2lkdGgsIGNvbnRh
aW5pbmdCbG9ja1dpZHRoKSkKKyAgICAgICAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7CisKKyAgICBp
ZiAod2lkdGguaXNNaW5Db250ZW50KCkgfHwgd2lkdGguaXNNYXhDb250ZW50KCkgfHwgd2lkdGgu
aXNGaXRDb250ZW50KCkpIHsKKyAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJv
eCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICBhdXRvJiBjb250YWluZXJCb3gg
PSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7CisgICAgICAgIC8vIEZJWE1FOiBD
b25zaWRlciBzcGxpdHRpbmcgdXAgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHNv
IHRoYXQgd2UgY291bGQgY29tcHV0ZWQgdGhlIG1pbiBhbmQgbWF4IHZhbHVlcyBzZXBhcmF0ZWx5
LgorICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBbJl0geworICAgICAg
ICAgICAgaWYgKCFjb250YWluZXJCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyAwX2x1LCBjb250
YWluaW5nQmxvY2tXaWR0aCB9OworICAgICAgICAgICAgQVNTRVJUKGNvbnRhaW5lckJveC5lc3Rh
Ymxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOworICAgICAgICAgICAgYXV0byYgZm9ybWF0dGlu
Z1N0YXRlID0gbGF5b3V0U3RhdGUoKS5lbnN1cmVGb3JtYXR0aW5nU3RhdGUoY29udGFpbmVyQm94
KTsKKyAgICAgICAgICAgIGlmIChhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBmb3Jt
YXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpKQorICAgICAgICAgICAgICAg
IHJldHVybiAqaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKKyAgICAgICAgICAgIHJldHVybiBM
YXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjb250YWluZXJCb3gsIGxheW91
dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKKyAgICAgICAg
fSgpOworICAgICAgICBpZiAod2lkdGguaXNNaW5Db250ZW50KCkpCisgICAgICAgICAgICByZXR1
cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtOworICAgICAgICBpZiAod2lkdGgu
aXNNYXhDb250ZW50KCkpCisgICAgICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJh
aW50cy5tYXhpbXVtOworICAgICAgICBBU1NFUlQod2lkdGguaXNGaXRDb250ZW50KCkpOworICAg
ICAgICAvLyBJZiB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIGEgZ2l2ZW4gYXhpcyBpcyBkZWZpbml0
ZSwgZXF1YWwgdG8gbWluKG1heC1jb250ZW50IHNpemUsCisgICAgICAgIC8vIG1heChtaW4tY29u
dGVudCBzaXplLCBzdHJldGNoLWZpdCBzaXplKSkuIE90aGVyd2lzZSwgZXF1YWwgdG8gdGhlIG1h
eC1jb250ZW50IHNpemUgaW4gdGhhdCBheGlzLgorICAgICAgICAvLyBGSVhNRTogV2UgZG9uJ3Qg
eWV0IGhhdmUgaW5kZWZpbml0ZSBhdmFpbGFibGUgc2l6ZS4KKyAgICAgICAgcmV0dXJuIHN0ZDo6
bWluKGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSwgc3RkOjptYXgoaW50cmluc2lj
V2lkdGhDb25zdHJhaW50cy5taW5pbXVtLCBjb250YWluaW5nQmxvY2tXaWR0aCkpOworICAgIH0K
KyAgICByZXR1cm4geyB9OworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkV2lkdGgoY29uc3QgQm94JiBsYXlvdXRCb3gsIExheW91
dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpCit7CisgICAgaWYgKGF1dG8gY29tcHV0ZWRXaWR0
aCA9IGNvbXB1dGVkV2lkdGhWYWx1ZShsYXlvdXRCb3gsIFdpZHRoVHlwZTo6Tm9ybWFsLCBjb250
YWluaW5nQmxvY2tXaWR0aCkpIHsKKyAgICAgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5
bGUoKTsKKyAgICAgICAgLy8gTm9uLXF1YW50aXRhdGl2ZSB2YWx1ZXMgc3VjaCBhcyBhdXRvIGFu
ZCBtaW4tY29udGVudCBhcmUgbm90IGluZmx1ZW5jZWQgYnkgdGhlIGJveC1zaXppbmcgcHJvcGVy
dHkuCisgICAgICAgIGlmIChzdHlsZS5ib3hTaXppbmcoKSA9PSBCb3hTaXppbmc6OkNvbnRlbnRC
b3ggfHwgc3R5bGUud2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQorICAgICAgICAgICAgcmV0
dXJuIGNvbXB1dGVkV2lkdGg7CisgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGlu
Z0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOworICAgICAgICByZXR1cm4gKmNv
bXB1dGVkV2lkdGggLSAoYm94R2VvbWV0cnkuaG9yaXpvbnRhbEJvcmRlcigpICsgYm94R2VvbWV0
cnkuaG9yaXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDApKTsKKyAgICB9CisgICAgcmV0dXJuIHsg
fTsKK30KKworTGF5b3V0VW5pdCBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbnRlbnRI
ZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0
aW5nQ29udGV4dFJvb3QpIGNvbnN0Cit7CisgICAgQVNTRVJUKGZvcm1hdHRpbmdDb250ZXh0Um9v
dC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOworICAgIEFTU0VSVChpc0hlaWdodEF1
dG8oZm9ybWF0dGluZ0NvbnRleHRSb290KSB8fCBmb3JtYXR0aW5nQ29udGV4dFJvb3QuZXN0YWJs
aXNoZXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkgfHwgZm9ybWF0dGluZ0NvbnRleHRSb290Lmlz
VGFibGVDZWxsKCkpOworICAgIGF1dG8gdXNlZENvbnRlbnRIZWlnaHQgPSBMYXlvdXRVbml0IHsg
fTsgCisgICAgYXV0byBoYXNDb250ZW50ID0gZm9ybWF0dGluZ0NvbnRleHRSb290Lmhhc0luRmxv
d09yRmxvYXRpbmdDaGlsZCgpOworICAgIC8vIFRoZSB1c2VkIGhlaWdodCBvZiB0aGUgY29udGFp
bm1lbnQgYm94IGlzIGRldGVybWluZWQgYXMgaWYgcGVyZm9ybWluZyBhIG5vcm1hbCBsYXlvdXQg
b2YgdGhlIGJveCwgZXhjZXB0IHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBoYXZpbmcgbm8gY29udGVu
dC4KKyAgICBhdXRvIHNob3VsZElnbm9yZUNvbnRlbnQgPSBmb3JtYXR0aW5nQ29udGV4dFJvb3Qu
aXNTaXplQ29udGFpbm1lbnRCb3goKTsKKyAgICBpZiAoaGFzQ29udGVudCAmJiAhc2hvdWxkSWdu
b3JlQ29udGVudCkKKyAgICAgICAgdXNlZENvbnRlbnRIZWlnaHQgPSBMYXlvdXRDb250ZXh0Ojpj
cmVhdGVGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGNvbnN0X2Nhc3Q8
TGF5b3V0U3RhdGUmPihsYXlvdXRTdGF0ZSgpKSktPnVzZWRDb250ZW50SGVpZ2h0KCk7CisgICAg
cmV0dXJuIHVzZWRDb250ZW50SGVpZ2h0OworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkVmFsdWUoY29uc3QgTGVuZ3RoJiBnZW9t
ZXRyeVByb3BlcnR5LCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSBjb25zdAorewor
ICAgIC8vICBJbiBnZW5lcmFsLCB0aGUgY29tcHV0ZWQgdmFsdWUgcmVzb2x2ZXMgdGhlIHNwZWNp
ZmllZCB2YWx1ZSBhcyBmYXIgYXMgcG9zc2libGUgd2l0aG91dCBsYXlpbmcgb3V0IHRoZSBjb250
ZW50LgorICAgIGlmIChnZW9tZXRyeVByb3BlcnR5LmlzRml4ZWQoKSB8fCBnZW9tZXRyeVByb3Bl
cnR5LmlzUGVyY2VudCgpIHx8IGdlb21ldHJ5UHJvcGVydHkuaXNDYWxjdWxhdGVkKCkpCisgICAg
ICAgIHJldHVybiB2YWx1ZUZvckxlbmd0aChnZW9tZXRyeVByb3BlcnR5LCBjb250YWluaW5nQmxv
Y2tXaWR0aCk7CisgICAgcmV0dXJuIHsgfTsKK30KKworT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpmaXhlZFZhbHVlKGNvbnN0IExlbmd0aCYgZ2VvbWV0
cnlQcm9wZXJ0eSkgY29uc3QKK3sKKyAgICBpZiAoIWdlb21ldHJ5UHJvcGVydHkuaXNGaXhlZCgp
KQorICAgICAgICByZXR1cm4geyB9OworICAgIHJldHVybiBMYXlvdXRVbml0IHsgZ2VvbWV0cnlQ
cm9wZXJ0eS52YWx1ZSgpIH07Cit9CisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi92
aXN1ZGV0Lmh0bWwjbWluLW1heC1oZWlnaHRzCisvLyBTcGVjaWZpZXMgYSBwZXJjZW50YWdlIGZv
ciBkZXRlcm1pbmluZyB0aGUgdXNlZCB2YWx1ZS4gVGhlIHBlcmNlbnRhZ2UgaXMgY2FsY3VsYXRl
ZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGhlaWdodCBvZiB0aGUgZ2VuZXJhdGVkIGJveCdzIGNvbnRh
aW5pbmcgYmxvY2suCisvLyBJZiB0aGUgaGVpZ2h0IG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGlz
IG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSAoaS5lLiwgaXQgZGVwZW5kcyBvbiBjb250ZW50IGhl
aWdodCksIGFuZCB0aGlzIGVsZW1lbnQgaXMgbm90IGFic29sdXRlbHkgcG9zaXRpb25lZCwKKy8v
IHRoZSBwZXJjZW50YWdlIHZhbHVlIGlzIHRyZWF0ZWQgYXMgJzAnIChmb3IgJ21pbi1oZWlnaHQn
KSBvciAnbm9uZScgKGZvciAnbWF4LWhlaWdodCcpLgorT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZE1heEhlaWdodChjb25zdCBCb3gmIGxh
eW91dEJveCwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSBjb25z
dAoreworICAgIHJldHVybiBjb21wdXRlZEhlaWdodFZhbHVlKGxheW91dEJveCwgSGVpZ2h0VHlw
ZTo6TWF4LCBjb250YWluaW5nQmxvY2tIZWlnaHQpOworfQorCitPcHRpb25hbDxMYXlvdXRVbml0
PiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkTWluSGVpZ2h0KGNvbnN0IEJv
eCYgbGF5b3V0Qm94LCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQp
IGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbXB1dGVkSGVpZ2h0VmFsdWUobGF5b3V0Qm94LCBIZWln
aHRUeXBlOjpNaW4sIGNvbnRhaW5pbmdCbG9ja0hlaWdodCk7Cit9CisKK09wdGlvbmFsPExheW91
dFVuaXQ+IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRNaW5XaWR0aChjb25z
dCBCb3gmIGxheW91dEJveCwgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCkKK3sKKyAg
ICByZXR1cm4gY29tcHV0ZWRXaWR0aFZhbHVlKGxheW91dEJveCwgV2lkdGhUeXBlOjpNaW4sIGNv
bnRhaW5pbmdCbG9ja1dpZHRoKTsKK30KKworT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZE1heFdpZHRoKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKQoreworICAgIHJldHVybiBjb21wdXRl
ZFdpZHRoVmFsdWUobGF5b3V0Qm94LCBXaWR0aFR5cGU6Ok1heCwgY29udGFpbmluZ0Jsb2NrV2lk
dGgpOworfQorCitMYXlvdXRVbml0IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6c3RhdGlj
VmVydGljYWxQb3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQoY29uc3QgQm94JiBsYXlvdXRC
b3gsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpIGNvbnN0
Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisKKyAg
ICAvLyBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgc2VjdGlvbiBhbmQgdGhlIG5leHQsIHRoZSB0
ZXJtICJzdGF0aWMgcG9zaXRpb24iIChvZiBhbiBlbGVtZW50KSByZWZlcnMsIHJvdWdobHksIHRv
IHRoZSBwb3NpdGlvbiBhbiBlbGVtZW50IHdvdWxkIGhhdmUKKyAgICAvLyBoYWQgaW4gdGhlIG5v
cm1hbCBmbG93LiBNb3JlIHByZWNpc2VseSwgdGhlIHN0YXRpYyBwb3NpdGlvbiBmb3IgJ3RvcCcg
aXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHRvcCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2Nr
IHRvIHRoZSB0b3AgbWFyZ2luCisgICAgLy8gZWRnZSBvZiBhIGh5cG90aGV0aWNhbCBib3ggdGhh
dCB3b3VsZCBoYXZlIGJlZW4gdGhlIGZpcnN0IGJveCBvZiB0aGUgZWxlbWVudCBpZiBpdHMgc3Bl
Y2lmaWVkICdwb3NpdGlvbicgdmFsdWUgaGFkIGJlZW4gJ3N0YXRpYycgYW5kIGl0cyBzcGVjaWZp
ZWQKKyAgICAvLyAnZmxvYXQnIGhhZCBiZWVuICdub25lJyBhbmQgaXRzIHNwZWNpZmllZCAnY2xl
YXInIGhhZCBiZWVuICdub25lJy4gKE5vdGUgdGhhdCBkdWUgdG8gdGhlIHJ1bGVzIGluIHNlY3Rp
b24gOS43IHRoaXMgbWlnaHQgcmVxdWlyZSBhbHNvIGFzc3VtaW5nIGEgZGlmZmVyZW50CisgICAg
Ly8gY29tcHV0ZWQgdmFsdWUgZm9yICdkaXNwbGF5Jy4pIFRoZSB2YWx1ZSBpcyBuZWdhdGl2ZSBp
ZiB0aGUgaHlwb3RoZXRpY2FsIGJveCBpcyBhYm92ZSB0aGUgY29udGFpbmluZyBibG9jay4KKwor
ICAgIC8vIFN0YXJ0IHdpdGggdGhpcyBib3gncyBib3JkZXIgYm94IG9mZnNldCBmcm9tIHRoZSBw
YXJlbnQncyBib3JkZXIgYm94LgorICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+
Zm9ybWF0dGluZ0NvbnRleHQoKTsKKyAgICBMYXlvdXRVbml0IHRvcDsKKyAgICBpZiAobGF5b3V0
Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpICYmIGxheW91dEJveC5wcmV2aW91c0luRmxvd1Np
YmxpbmcoKS0+aXNCbG9ja0xldmVsQm94KCkpIHsKKyAgICAgICAgLy8gQWRkIHNpYmxpbmcgb2Zm
c2V0CisgICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9ICpsYXlvdXRCb3gucHJl
dmlvdXNJbkZsb3dTaWJsaW5nKCk7CisgICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93Qm94R2Vv
bWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChwcmV2aW91c0luRmxvd1Np
YmxpbmcsIEVzY2FwZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRyeSk7Cisg
ICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IGRvd25jYXN0PEJsb2NrRm9ybWF0dGluZ1N0
YXRlPihsYXlvdXRTdGF0ZSgpLmZvcm1hdHRpbmdTdGF0ZUZvckJveChwcmV2aW91c0luRmxvd1Np
YmxpbmcpKTsKKyAgICAgICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW5Gb3JQcmV2aW91c0JveCA9
IGZvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNJbkZsb3dTaWJsaW5n
KTsKKworICAgICAgICB0b3AgKz0gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QocHJldmlvdXNJ
bkZsb3dCb3hHZW9tZXRyeSkuYm90dG9tKCkgKyB1c2VkVmVydGljYWxNYXJnaW5Gb3JQcmV2aW91
c0JveC5ub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXI7CisgICAgfSBlbHNlCisgICAgICAgIHRvcCA9
IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveC5wYXJlbnQoKSwgRXNj
YXBlUmVhc29uOjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5KS5jb250ZW50Qm94VG9w
KCk7CisKKyAgICAvLyBSZXNvbHZlIHRvcCBhbGwgdGhlIHdheSB1cCB0byB0aGUgY29udGFpbmlu
ZyBibG9jay4KKyAgICBhdXRvJiBjb250YWluaW5nQmxvY2sgPSBsYXlvdXRCb3guY29udGFpbmlu
Z0Jsb2NrKCk7CisgICAgLy8gU3RhcnQgd2l0aCB0aGUgcGFyZW50IHNpbmNlIHdlIHByZXRlbmQg
dGhhdCB0aGlzIGJveCBpcyBub3JtYWwgZmxvdy4KKyAgICBmb3IgKGF1dG8qIGFuY2VzdG9yID0g
JmxheW91dEJveC5wYXJlbnQoKTsgYW5jZXN0b3IgIT0gJmNvbnRhaW5pbmdCbG9jazsgYW5jZXN0
b3IgPSAmYW5jZXN0b3ItPmNvbnRhaW5pbmdCbG9jaygpKSB7CisgICAgICAgIGF1dG8mIGJveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goKmFuY2VzdG9yLCBFc2Nh
cGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0cnkpOworICAgICAgICAvLyBC
b3hHZW9tZXRyeTo6dG9wIGlzIHRoZSBib3JkZXIgYm94IHRvcCBwb3NpdGlvbiBpbiBpdHMgY29u
dGFpbmluZyBibG9jaydzIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAgICB0b3AgKz0gQm94R2Vv
bWV0cnk6OmJvcmRlckJveFRvcChib3hHZW9tZXRyeSk7CisgICAgICAgIEFTU0VSVCghYW5jZXN0
b3ItPmlzUG9zaXRpb25lZCgpIHx8IGxheW91dEJveC5pc0ZpeGVkUG9zaXRpb25lZCgpKTsKKyAg
ICB9CisgICAgLy8gTW92ZSB0aGUgc3RhdGljIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBwYWRk
aW5nIGJveC4gVGhpcyBpcyB2ZXJ5IHNwZWNpZmljIHRvIGFib2x1dGVseSBwb3NpdGlvbmVkIGJv
eGVzLgorICAgIHJldHVybiB0b3AgLSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7Cit9
CisKK0xheW91dFVuaXQgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNIb3Jpem9u
dGFsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBj
b25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykgY29uc3QK
K3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKKyAgICAv
LyBTZWUgc3RhdGljVmVydGljYWxQb3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQgZm9yIHRo
ZSBkZWZpbml0aW9uIG9mIHRoZSBzdGF0aWMgcG9zaXRpb24uCisKKyAgICAvLyBTdGFydCB3aXRo
IHRoaXMgYm94J3MgYm9yZGVyIGJveCBvZmZzZXQgZnJvbSB0aGUgcGFyZW50J3MgYm9yZGVyIGJv
eC4KKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0
KCk7CisgICAgYXV0byBsZWZ0ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5
b3V0Qm94LnBhcmVudCgpLCBFc2NhcGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2Vv
bWV0cnkpLmNvbnRlbnRCb3hMZWZ0KCk7CisKKyAgICAvLyBSZXNvbHZlIGxlZnQgYWxsIHRoZSB3
YXkgdXAgdG8gdGhlIGNvbnRhaW5pbmcgYmxvY2suCisgICAgYXV0byYgY29udGFpbmluZ0Jsb2Nr
ID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOworICAgIC8vIFN0YXJ0IHdpdGggdGhlIHBh
cmVudCBzaW5jZSB3ZSBwcmV0ZW5kIHRoYXQgdGhpcyBib3ggaXMgbm9ybWFsIGZsb3cuCisgICAg
Zm9yIChhdXRvKiBhbmNlc3RvciA9ICZsYXlvdXRCb3gucGFyZW50KCk7IGFuY2VzdG9yICE9ICZj
b250YWluaW5nQmxvY2s7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkg
eworICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5
Rm9yQm94KCphbmNlc3RvciwgRXNjYXBlUmVhc29uOjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dl
b21ldHJ5KTsKKyAgICAgICAgLy8gQm94R2VvbWV0cnk6OmxlZnQgaXMgdGhlIGJvcmRlciBib3gg
bGVmdCBwb3NpdGlvbiBpbiBpdHMgY29udGFpbmluZyBibG9jaydzIGNvb3JkaW5hdGUgc3lzdGVt
LgorICAgICAgICBsZWZ0ICs9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hMZWZ0KGJveEdlb21ldHJ5
KTsKKyAgICAgICAgQVNTRVJUKCFhbmNlc3Rvci0+aXNQb3NpdGlvbmVkKCkgfHwgbGF5b3V0Qm94
LmlzRml4ZWRQb3NpdGlvbmVkKCkpOworICAgIH0KKyAgICAvLyBNb3ZlIHRoZSBzdGF0aWMgcG9z
aXRpb24gcmVsYXRpdmUgdG8gdGhlIHBhZGRpbmcgYm94LiBUaGlzIGlzIHZlcnkgc3BlY2lmaWMg
dG8gYWJvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMuCisgICAgcmV0dXJuIGxlZnQgLSBob3Jpem9u
dGFsQ29uc3RyYWludHMubG9naWNhbExlZnQ7Cit9CisKK0xheW91dFVuaXQgRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5OjpzaHJpbmtUb0ZpdFdpZHRoKGNvbnN0IEJveCYgZm9ybWF0dGluZ0Nv
bnRleHRSb290LCBMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKQoreworICAgIExPR19XSVRIX1NU
UkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbV2lkdGhdIC0+IHNocmlu
ayB0byBmaXQgLT4gdW5zdXBwb3J0ZWQgLT4gd2lkdGgoIiA8PCBMYXlvdXRVbml0IHsgfSA8PCAi
cHgpIGxheW91dEJveDogIiA8PCAmZm9ybWF0dGluZ0NvbnRleHRSb290IDw8ICIpIik7CisgICAg
QVNTRVJUKGZvcm1hdHRpbmdDb250ZXh0Um9vdC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0
KCkpOworCisgICAgLy8gQ2FsY3VsYXRpb24gb2YgdGhlIHNocmluay10by1maXQgd2lkdGggaXMg
c2ltaWxhciB0byBjYWxjdWxhdGluZyB0aGUgd2lkdGggb2YgYSB0YWJsZSBjZWxsIHVzaW5nIHRo
ZSBhdXRvbWF0aWMgdGFibGUgbGF5b3V0IGFsZ29yaXRobS4KKyAgICAvLyBSb3VnaGx5OiBjYWxj
dWxhdGUgdGhlIHByZWZlcnJlZCB3aWR0aCBieSBmb3JtYXR0aW5nIHRoZSBjb250ZW50IHdpdGhv
dXQgYnJlYWtpbmcgbGluZXMgb3RoZXIgdGhhbiB3aGVyZSBleHBsaWNpdCBsaW5lIGJyZWFrcyBv
Y2N1ciwKKyAgICAvLyBhbmQgYWxzbyBjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBtaW5pbXVtIHdp
ZHRoLCBlLmcuLCBieSB0cnlpbmcgYWxsIHBvc3NpYmxlIGxpbmUgYnJlYWtzLiBDU1MgMi4yIGRv
ZXMgbm90IGRlZmluZSB0aGUgZXhhY3QgYWxnb3JpdGhtLgorICAgIC8vIFRoaXJkbHksIGZpbmQg
dGhlIGF2YWlsYWJsZSB3aWR0aDogaW4gdGhpcyBjYXNlLCB0aGlzIGlzIHRoZSB3aWR0aCBvZiB0
aGUgY29udGFpbmluZyBibG9jayBtaW51cyB0aGUgdXNlZCB2YWx1ZXMgb2YgJ21hcmdpbi1sZWZ0
JywgJ2JvcmRlci1sZWZ0LXdpZHRoJywKKyAgICAvLyAncGFkZGluZy1sZWZ0JywgJ3BhZGRpbmct
cmlnaHQnLCAnYm9yZGVyLXJpZ2h0LXdpZHRoJywgJ21hcmdpbi1yaWdodCcsIGFuZCB0aGUgd2lk
dGhzIG9mIGFueSByZWxldmFudCBzY3JvbGwgYmFycy4KKworICAgIC8vIFRoZW4gdGhlIHNocmlu
ay10by1maXQgd2lkdGggaXM6IG1pbihtYXgocHJlZmVycmVkIG1pbmltdW0gd2lkdGgsIGF2YWls
YWJsZSB3aWR0aCksIHByZWZlcnJlZCB3aWR0aCkuCisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07CisgICAgYXV0byBoYXND
b250ZW50ID0gaXM8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3QpICYmIGRvd25j
YXN0PENvbnRhaW5lckJveD4oZm9ybWF0dGluZ0NvbnRleHRSb290KS5oYXNJbkZsb3dPckZsb2F0
aW5nQ2hpbGQoKTsKKyAgICAvLyBUaGUgdXNlZCB3aWR0aCBvZiB0aGUgY29udGFpbm1lbnQgYm94
IGlzIGRldGVybWluZWQgYXMgaWYgcGVyZm9ybWluZyBhIG5vcm1hbCBsYXlvdXQgb2YgdGhlIGJv
eCwgZXhjZXB0IHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBoYXZpbmcgbm8gY29udGVudC4KKyAgICBh
dXRvIHNob3VsZElnbm9yZUNvbnRlbnQgPSBmb3JtYXR0aW5nQ29udGV4dFJvb3QuaXNTaXplQ29u
dGFpbm1lbnRCb3goKTsgIAorICAgIGlmIChoYXNDb250ZW50ICYmICFzaG91bGRJZ25vcmVDb250
ZW50KSB7CisgICAgICAgIGF1dG8mIHJvb3QgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGZvcm1h
dHRpbmdDb250ZXh0Um9vdCk7CisgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZUZvclJvb3Qg
PSBsYXlvdXRTdGF0ZSgpLmVuc3VyZUZvcm1hdHRpbmdTdGF0ZShyb290KTsKKyAgICAgICAgYXV0
byBwcmVjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBmb3JtYXR0aW5nU3RhdGVG
b3JSb290LmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKKyAgICAgICAgaWYgKCFwcmVjb21w
dXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMpCisgICAgICAgICAgICBpbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQocm9v
dCwgbGF5b3V0U3RhdGUoKSktPmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gKnBy
ZWNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKKyAgICB9CisgICAgcmV0dXJuIHN0
ZDo6bWluKHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgYXZhaWxh
YmxlV2lkdGgpLCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0pOworfQorCitWZXJ0
aWNhbEdlb21ldHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93Tm9uUmVw
bGFjZWRWZXJ0aWNhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYgbGF5b3V0Qm94LCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVy
dGljYWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZl
cnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Cit7CisgICAgQVNT
RVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhbGF5b3V0Qm94LmlzUmVw
bGFjZWRCb3goKSk7CisgICAgQVNTRVJUKHZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbEhlaWdo
dCk7CisKKyAgICAvLyAxMC42LjQgQWJzb2x1dGVseSBwb3NpdGlvbmVkLCBub24tcmVwbGFjZWQg
ZWxlbWVudHMKKyAgICAvLworICAgIC8vIEZvciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgZWxlbWVu
dHMsIHRoZSB1c2VkIHZhbHVlcyBvZiB0aGUgdmVydGljYWwgZGltZW5zaW9ucyBtdXN0IHNhdGlz
ZnkgdGhpcyBjb25zdHJhaW50OgorICAgIC8vICd0b3AnICsgJ21hcmdpbi10b3AnICsgJ2JvcmRl
ci10b3Atd2lkdGgnICsgJ3BhZGRpbmctdG9wJyArICdoZWlnaHQnICsgJ3BhZGRpbmctYm90dG9t
JyArICdib3JkZXItYm90dG9tLXdpZHRoJyArICdtYXJnaW4tYm90dG9tJyArICdib3R0b20nCisg
ICAgLy8gPSBoZWlnaHQgb2YgY29udGFpbmluZyBibG9jaworCisgICAgLy8gSWYgYWxsIHRocmVl
IG9mICd0b3AnLCAnaGVpZ2h0JywgYW5kICdib3R0b20nIGFyZSBhdXRvLCBzZXQgJ3RvcCcgdG8g
dGhlIHN0YXRpYyBwb3NpdGlvbiBhbmQgYXBwbHkgcnVsZSBudW1iZXIgdGhyZWUgYmVsb3cuCisK
KyAgICAvLyBJZiBub25lIG9mIHRoZSB0aHJlZSBhcmUgJ2F1dG8nOiBJZiBib3RoICdtYXJnaW4t
dG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiB1
bmRlciB0aGUgZXh0cmEKKyAgICAvLyBjb25zdHJhaW50IHRoYXQgdGhlIHR3byBtYXJnaW5zIGdl
dCBlcXVhbCB2YWx1ZXMuIElmIG9uZSBvZiAnbWFyZ2luLXRvcCcgb3IgJ21hcmdpbi1ib3R0b20n
IGlzICdhdXRvJywgc29sdmUgdGhlIGVxdWF0aW9uIGZvciB0aGF0IHZhbHVlLgorICAgIC8vIElm
IHRoZSB2YWx1ZXMgYXJlIG92ZXItY29uc3RyYWluZWQsIGlnbm9yZSB0aGUgdmFsdWUgZm9yICdi
b3R0b20nIGFuZCBzb2x2ZSBmb3IgdGhhdCB2YWx1ZS4KKworICAgIC8vIE90aGVyd2lzZSwgcGlj
ayB0aGUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc2l4IHJ1bGVzIHRoYXQgYXBwbGllcy4KKworICAg
IC8vIDEuICd0b3AnIGFuZCAnaGVpZ2h0JyBhcmUgJ2F1dG8nIGFuZCAnYm90dG9tJyBpcyBub3Qg
J2F1dG8nLCB0aGVuIHRoZSBoZWlnaHQgaXMgYmFzZWQgb24gdGhlIGNvbnRlbnQgcGVyIDEwLjYu
NywKKyAgICAvLyAgICAgc2V0ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tdG9wJyBhbmQgJ21h
cmdpbi1ib3R0b20nIHRvIDAsIGFuZCBzb2x2ZSBmb3IgJ3RvcCcKKyAgICAvLyAyLiAndG9wJyBh
bmQgJ2JvdHRvbScgYXJlICdhdXRvJyBhbmQgJ2hlaWdodCcgaXMgbm90ICdhdXRvJywgdGhlbiBz
ZXQgJ3RvcCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbiwgc2V0ICdhdXRvJyB2YWx1ZXMgZm9yCisg
ICAgLy8gICAgJ21hcmdpbi10b3AnIGFuZCAnbWFyZ2luLWJvdHRvbScgdG8gMCwgYW5kIHNvbHZl
IGZvciAnYm90dG9tJworICAgIC8vIDMuICdoZWlnaHQnIGFuZCAnYm90dG9tJyBhcmUgJ2F1dG8n
IGFuZCAndG9wJyBpcyBub3QgJ2F1dG8nLCB0aGVuIHRoZSBoZWlnaHQgaXMgYmFzZWQgb24gdGhl
IGNvbnRlbnQgcGVyIDEwLjYuNywgc2V0ICdhdXRvJworICAgIC8vICAgICB2YWx1ZXMgZm9yICdt
YXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAsIGFuZCBzb2x2ZSBmb3IgJ2JvdHRv
bScKKyAgICAvLyA0LiAndG9wJyBpcyAnYXV0bycsICdoZWlnaHQnIGFuZCAnYm90dG9tJyBhcmUg
bm90ICdhdXRvJywgdGhlbiBzZXQgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi10b3AnIGFuZCAn
bWFyZ2luLWJvdHRvbScgdG8gMCwgYW5kIHNvbHZlIGZvciAndG9wJworICAgIC8vIDUuICdoZWln
aHQnIGlzICdhdXRvJywgJ3RvcCcgYW5kICdib3R0b20nIGFyZSBub3QgJ2F1dG8nLCB0aGVuICdh
dXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIGFyZSBzZXQg
dG8gMCBhbmQgc29sdmUgZm9yICdoZWlnaHQnCisgICAgLy8gNi4gJ2JvdHRvbScgaXMgJ2F1dG8n
LCAndG9wJyBhbmQgJ2hlaWdodCcgYXJlIG5vdCAnYXV0bycsIHRoZW4gc2V0ICdhdXRvJyB2YWx1
ZXMgZm9yICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAgYW5kIHNvbHZlIGZv
ciAnYm90dG9tJworCisgICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0
aW5nQ29udGV4dCgpOworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAg
YXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlv
dXRCb3gpOworICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gKnZlcnRpY2FsQ29uc3Ry
YWludHMubG9naWNhbEhlaWdodDsKKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9y
aXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKKworICAgIGF1dG8gdG9wID0gY29tcHV0
ZWRWYWx1ZShzdHlsZS5sb2dpY2FsVG9wKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKyAgICBh
dXRvIGJvdHRvbSA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbEJvdHRvbSgpLCBjb250YWlu
aW5nQmxvY2tXaWR0aCk7CisgICAgYXV0byBoZWlnaHQgPSBvdmVycmlkZGVuVmVydGljYWxWYWx1
ZXMuaGVpZ2h0ID8gb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodC52YWx1ZSgpIDogY29t
cHV0ZWRIZWlnaHQobGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tIZWlnaHQpOworICAgIGF1dG8g
Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2lu
KGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICBVc2VkVmVydGljYWxNYXJn
aW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB1c2VkVmVydGljYWxNYXJnaW47IAorICAgIGF1dG8gcGFk
ZGluZ1RvcCA9IGJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKDApOworICAgIGF1dG8g
cGFkZGluZ0JvdHRvbSA9IGJveEdlb21ldHJ5LnBhZGRpbmdCb3R0b20oKS52YWx1ZU9yKDApOwor
ICAgIGF1dG8gYm9yZGVyVG9wID0gYm94R2VvbWV0cnkuYm9yZGVyVG9wKCk7CisgICAgYXV0byBi
b3JkZXJCb3R0b20gPSBib3hHZW9tZXRyeS5ib3JkZXJCb3R0b20oKTsKKworICAgIGlmICghdG9w
ICYmICFoZWlnaHQgJiYgIWJvdHRvbSkKKyAgICAgICAgdG9wID0gc3RhdGljVmVydGljYWxQb3Np
dGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQobGF5b3V0Qm94LCB2ZXJ0aWNhbENvbnN0cmFpbnRz
KTsKKworICAgIGlmICh0b3AgJiYgaGVpZ2h0ICYmIGJvdHRvbSkgeworICAgICAgICBpZiAoIWNv
bXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlICYmICFjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFm
dGVyKSB7CisgICAgICAgICAgICBhdXRvIG1hcmdpbkJlZm9yZUFuZEFmdGVyID0gY29udGFpbmlu
Z0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCAr
IHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqYm90dG9tKTsKKyAgICAgICAgICAgIHVz
ZWRWZXJ0aWNhbE1hcmdpbiA9IHsgbWFyZ2luQmVmb3JlQW5kQWZ0ZXIgLyAyLCBtYXJnaW5CZWZv
cmVBbmRBZnRlciAvIDIgfTsKKyAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWRWZXJ0aWNhbE1h
cmdpbi5iZWZvcmUpIHsKKyAgICAgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciA9ICpj
b21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyOworICAgICAgICAgICAgdXNlZFZlcnRpY2FsTWFy
Z2luLmJlZm9yZSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsg
cGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNl
ZFZlcnRpY2FsTWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7CisgICAgICAgIH0gZWxzZSBpZiAoIWNv
bXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIpIHsKKyAgICAgICAgICAgIHVzZWRWZXJ0aWNhbE1h
cmdpbi5iZWZvcmUgPSAqY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmU7CisgICAgICAgICAg
ICB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRv
cCArIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsg
KmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqYm90dG9tKTsKKyAgICAg
ICAgfSBlbHNlCisgICAgICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7ICpjb21wdXRlZFZl
cnRpY2FsTWFyZ2luLmJlZm9yZSwgKmNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIgfTsKKyAg
ICAgICAgLy8gT3Zlci1jb25zdHJhaW5lZD8KKyAgICAgICAgYXV0byBib3hIZWlnaHQgPSAqdG9w
ICsgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyAq
aGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0aWNhbE1hcmdp
bi5hZnRlciArICpib3R0b207CisgICAgICAgIGlmIChib3hIZWlnaHQgIT0gY29udGFpbmluZ0Js
b2NrSGVpZ2h0KQorICAgICAgICAgICAgYm90dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0g
KCp0b3AgKyB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1Rv
cCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2Fs
TWFyZ2luLmFmdGVyKTsKKyAgICB9CisKKyAgICBpZiAoIXRvcCAmJiAhaGVpZ2h0ICYmIGJvdHRv
bSkgeworICAgICAgICAvLyAjMQorICAgICAgICBoZWlnaHQgPSBjb250ZW50SGVpZ2h0Rm9yRm9y
bWF0dGluZ0NvbnRleHRSb290KGxheW91dEJveCk7CisgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdp
biA9IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRW
ZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgICAgIHRvcCA9IGNvbnRhaW5p
bmdCbG9ja0hlaWdodCAtICh1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsg
cGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNl
ZFZlcnRpY2FsTWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7IAorICAgIH0KKworICAgIGlmICghdG9w
ICYmICFib3R0b20gJiYgaGVpZ2h0KSB7CisgICAgICAgIC8vICMyCisgICAgICAgIHRvcCA9IHN0
YXRpY1ZlcnRpY2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGxheW91dEJveCwgdmVy
dGljYWxDb25zdHJhaW50cyk7CisgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IHsgY29tcHV0
ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdp
bi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgICAgIGJvdHRvbSA9IGNvbnRhaW5pbmdCbG9ja0hl
aWdodCAtICgqdG9wICsgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBh
ZGRpbmdUb3AgKyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRW
ZXJ0aWNhbE1hcmdpbi5hZnRlcik7CisgICAgfQorCisgICAgaWYgKCFoZWlnaHQgJiYgIWJvdHRv
bSAmJiB0b3ApIHsKKyAgICAgICAgLy8gIzMKKyAgICAgICAgaGVpZ2h0ID0gY29udGVudEhlaWdo
dEZvckZvcm1hdHRpbmdDb250ZXh0Um9vdChsYXlvdXRCb3gpOworICAgICAgICB1c2VkVmVydGlj
YWxNYXJnaW4gPSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNv
bXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OworICAgICAgICBib3R0b20g
PSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZv
cmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBi
b3JkZXJCb3R0b20gKyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIpOworICAgIH0KKworICAgIGlm
ICghdG9wICYmIGhlaWdodCAmJiBib3R0b20pIHsKKyAgICAgICAgLy8gIzQKKyAgICAgICAgdXNl
ZFZlcnRpY2FsTWFyZ2luID0geyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9y
KDApLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKKyAgICAgICAg
dG9wID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUg
KyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3Jk
ZXJCb3R0b20gKyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgKyAqYm90dG9tKTsKKyAgICB9CisK
KyAgICBpZiAoIWhlaWdodCAmJiB0b3AgJiYgYm90dG9tKSB7CisgICAgICAgIC8vICM1CisgICAg
ICAgIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUu
dmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07Cisg
ICAgICAgIGhlaWdodCA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgdXNlZFZlcnRp
Y2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBwYWRkaW5nQm90dG9t
ICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7Cisg
ICAgfQorCisgICAgaWYgKCFib3R0b20gJiYgdG9wICYmIGhlaWdodCkgeworICAgICAgICAvLyAj
NgorICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4u
YmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigw
KSB9OworICAgICAgICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIHVz
ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdo
dCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0
ZXIpOworICAgIH0KKworICAgIEFTU0VSVCh0b3ApOworICAgIEFTU0VSVChib3R0b20pOworICAg
IEFTU0VSVChoZWlnaHQpOworCisgICAgLy8gRm9yIG91dC1vZi1mbG93IGVsZW1lbnRzIHRoZSBj
b250YWluaW5nIGJsb2NrIGlzIGZvcm1lZCBieSB0aGUgcGFkZGluZyBlZGdlIG9mIHRoZSBhbmNl
c3Rvci4KKyAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwb3NpdGlvbmVkIHZhbHVlIGlzIGluIHRo
ZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgcGFkZGluZyBib3guIExldCdzIGNvbnZlcnQgaXQg
dG8gYm9yZGVyIGJveCBjb29yZGluYXRlIHN5c3RlbS4KKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9j
a1BhZGRpbmdWZXJ0aWNhbEVkZ2UgPSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7Cisg
ICAgKnRvcCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOworICAgICpib3R0
b20gKz0gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZTsKKworICAgIExPR19XSVRI
X1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbUG9zaXRpb25dW0hl
aWdodF1bTWFyZ2luXSAtPiBvdXQtb2YtZmxvdyBub24tcmVwbGFjZWQgLT4gdG9wKCIgPDwgKnRv
cCA8PCAicHgpIGJvdHRvbSgiICA8PCAqYm90dG9tIDw8ICJweCkgaGVpZ2h0KCIgPDwgKmhlaWdo
dCA8PCAicHgpIG1hcmdpbigiIDw8IHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPDwgInB4LCAi
ICA8PCB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgPDwgInB4KSBsYXlvdXRCb3goIiA8PCAmbGF5
b3V0Qm94IDw8ICIpIik7CisgICAgcmV0dXJuIHsgKnRvcCwgKmJvdHRvbSwgeyAqaGVpZ2h0LCB1
c2VkVmVydGljYWxNYXJnaW4gfSB9OworfQorCitIb3Jpem9udGFsR2VvbWV0cnkgRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dOb25SZXBsYWNlZEhvcml6b250YWxHZW9tZXRy
eShjb25zdCBDb250YWluZXJCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFs
dWVzJiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94
LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsK
KyAgICAKKyAgICAvLyAxMC4zLjcgQWJzb2x1dGVseSBwb3NpdGlvbmVkLCBub24tcmVwbGFjZWQg
ZWxlbWVudHMKKyAgICAvLworICAgIC8vICdsZWZ0JyArICdtYXJnaW4tbGVmdCcgKyAnYm9yZGVy
LWxlZnQtd2lkdGgnICsgJ3BhZGRpbmctbGVmdCcgKyAnd2lkdGgnICsgJ3BhZGRpbmctcmlnaHQn
ICsgJ2JvcmRlci1yaWdodC13aWR0aCcgKyAnbWFyZ2luLXJpZ2h0JyArICdyaWdodCcKKyAgICAv
LyA9IHdpZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKKworICAgIC8vIElmIGFsbCB0aHJlZSBvZiAn
bGVmdCcsICd3aWR0aCcsIGFuZCAncmlnaHQnIGFyZSAnYXV0byc6IEZpcnN0IHNldCBhbnkgJ2F1
dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgdG8gMC4KKyAg
ICAvLyBUaGVuLCBpZiB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGVsZW1lbnQgZXN0
YWJsaXNoaW5nIHRoZSBzdGF0aWMtcG9zaXRpb24gY29udGFpbmluZyBibG9jayBpcyAnbHRyJyBz
ZXQgJ2xlZnQnIHRvIHRoZSBzdGF0aWMKKyAgICAvLyBwb3NpdGlvbiBhbmQgYXBwbHkgcnVsZSBu
dW1iZXIgdGhyZWUgYmVsb3c7IG90aGVyd2lzZSwgc2V0ICdyaWdodCcgdG8gdGhlIHN0YXRpYyBw
b3NpdGlvbiBhbmQgYXBwbHkgcnVsZSBudW1iZXIgb25lIGJlbG93LgorICAgIC8vCisgICAgLy8g
SWYgbm9uZSBvZiB0aGUgdGhyZWUgaXMgJ2F1dG8nOiBJZiBib3RoICdtYXJnaW4tbGVmdCcgYW5k
ICdtYXJnaW4tcmlnaHQnIGFyZSAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0aGUg
ZXh0cmEgY29uc3RyYWludCB0aGF0IHRoZSB0d28gbWFyZ2lucyBnZXQgZXF1YWwgdmFsdWVzLAor
ICAgIC8vIHVubGVzcyB0aGlzIHdvdWxkIG1ha2UgdGhlbSBuZWdhdGl2ZSwgaW4gd2hpY2ggY2Fz
ZSB3aGVuIGRpcmVjdGlvbiBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAnbHRyJyAoJ3J0bCcp
LCBzZXQgJ21hcmdpbi1sZWZ0JyAoJ21hcmdpbi1yaWdodCcpIHRvIHplcm8gYW5kCisgICAgLy8g
c29sdmUgZm9yICdtYXJnaW4tcmlnaHQnICgnbWFyZ2luLWxlZnQnKS4gSWYgb25lIG9mICdtYXJn
aW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgaXMgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24g
Zm9yIHRoYXQgdmFsdWUuCisgICAgLy8gSWYgdGhlIHZhbHVlcyBhcmUgb3Zlci1jb25zdHJhaW5l
ZCwgaWdub3JlIHRoZSB2YWx1ZSBmb3IgJ2xlZnQnIChpbiBjYXNlIHRoZSAnZGlyZWN0aW9uJyBw
cm9wZXJ0eSBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAncnRsJykgb3IgJ3JpZ2h0JworICAg
IC8vIChpbiBjYXNlICdkaXJlY3Rpb24nIGlzICdsdHInKSBhbmQgc29sdmUgZm9yIHRoYXQgdmFs
dWUuCisgICAgLy8KKyAgICAvLyBPdGhlcndpc2UsIHNldCAnYXV0bycgdmFsdWVzIGZvciAnbWFy
Z2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyB0byAwLCBhbmQgcGljayB0aGUgb25lIG9mIHRo
ZSBmb2xsb3dpbmcgc2l4IHJ1bGVzIHRoYXQgYXBwbGllcy4KKyAgICAvLworICAgIC8vIDEuICds
ZWZ0JyBhbmQgJ3dpZHRoJyBhcmUgJ2F1dG8nIGFuZCAncmlnaHQnIGlzIG5vdCAnYXV0bycsIHRo
ZW4gdGhlIHdpZHRoIGlzIHNocmluay10by1maXQuIFRoZW4gc29sdmUgZm9yICdsZWZ0JworICAg
IC8vIDIuICdsZWZ0JyBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nIGFuZCAnd2lkdGgnIGlzIG5vdCAn
YXV0bycsIHRoZW4gaWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGVz
dGFibGlzaGluZyB0aGUgc3RhdGljLXBvc2l0aW9uIAorICAgIC8vICAgIGNvbnRhaW5pbmcgYmxv
Y2sgaXMgJ2x0cicgc2V0ICdsZWZ0JyB0byB0aGUgc3RhdGljIHBvc2l0aW9uLCBvdGhlcndpc2Ug
c2V0ICdyaWdodCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbi4KKyAgICAvLyAgICBUaGVuIHNvbHZl
IGZvciAnbGVmdCcgKGlmICdkaXJlY3Rpb24gaXMgJ3J0bCcpIG9yICdyaWdodCcgKGlmICdkaXJl
Y3Rpb24nIGlzICdsdHInKS4KKyAgICAvLyAzLiAnd2lkdGgnIGFuZCAncmlnaHQnIGFyZSAnYXV0
bycgYW5kICdsZWZ0JyBpcyBub3QgJ2F1dG8nLCB0aGVuIHRoZSB3aWR0aCBpcyBzaHJpbmstdG8t
Zml0IC4gVGhlbiBzb2x2ZSBmb3IgJ3JpZ2h0JworICAgIC8vIDQuICdsZWZ0JyBpcyAnYXV0bycs
ICd3aWR0aCcgYW5kICdyaWdodCcgYXJlIG5vdCAnYXV0bycsIHRoZW4gc29sdmUgZm9yICdsZWZ0
JworICAgIC8vIDUuICd3aWR0aCcgaXMgJ2F1dG8nLCAnbGVmdCcgYW5kICdyaWdodCcgYXJlIG5v
dCAnYXV0bycsIHRoZW4gc29sdmUgZm9yICd3aWR0aCcKKyAgICAvLyA2LiAncmlnaHQnIGlzICdh
dXRvJywgJ2xlZnQnIGFuZCAnd2lkdGgnIGFyZSBub3QgJ2F1dG8nLCB0aGVuIHNvbHZlIGZvciAn
cmlnaHQnCisKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdD
b250ZXh0KCk7CisgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICBhdXRv
JiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJv
eCk7CisgICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50
cy5sb2dpY2FsV2lkdGg7CisgICAgYXV0byBpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uID0gbGF5b3V0
Qm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOwor
ICAgIAorICAgIGF1dG8gbGVmdCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbExlZnQoKSwg
Y29udGFpbmluZ0Jsb2NrV2lkdGgpOworICAgIGF1dG8gcmlnaHQgPSBjb21wdXRlZFZhbHVlKHN0
eWxlLmxvZ2ljYWxSaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisgICAgYXV0byB3aWR0
aCA9IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoID8gb3ZlcnJpZGRlbkhvcml6b250
YWxWYWx1ZXMud2lkdGggOiBjb21wdXRlZFdpZHRoKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2Nr
V2lkdGgpOworICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6OmNv
bXB1dGVkSG9yaXpvbnRhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7
CisgICAgVXNlZEhvcml6b250YWxNYXJnaW4gdXNlZEhvcml6b250YWxNYXJnaW47CisgICAgYXV0
byBwYWRkaW5nTGVmdCA9IGJveEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCkudmFsdWVPcigwKTsKKyAg
ICBhdXRvIHBhZGRpbmdSaWdodCA9IGJveEdlb21ldHJ5LnBhZGRpbmdSaWdodCgpLnZhbHVlT3Io
MCk7CisgICAgYXV0byBib3JkZXJMZWZ0ID0gYm94R2VvbWV0cnkuYm9yZGVyTGVmdCgpOworICAg
IGF1dG8gYm9yZGVyUmlnaHQgPSBib3hHZW9tZXRyeS5ib3JkZXJSaWdodCgpOworICAgIGlmICgh
bGVmdCAmJiAhd2lkdGggJiYgIXJpZ2h0KSB7CisgICAgICAgIC8vIElmIGFsbCB0aHJlZSBvZiAn
bGVmdCcsICd3aWR0aCcsIGFuZCAncmlnaHQnIGFyZSAnYXV0byc6IEZpcnN0IHNldCBhbnkgJ2F1
dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgdG8gMC4KKyAg
ICAgICAgLy8gVGhlbiwgaWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50
IGVzdGFibGlzaGluZyB0aGUgc3RhdGljLXBvc2l0aW9uIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0
cicgc2V0ICdsZWZ0JyB0byB0aGUgc3RhdGljCisgICAgICAgIC8vIHBvc2l0aW9uIGFuZCBhcHBs
eSBydWxlIG51bWJlciB0aHJlZSBiZWxvdzsgb3RoZXJ3aXNlLCBzZXQgJ3JpZ2h0JyB0byB0aGUg
c3RhdGljIHBvc2l0aW9uIGFuZCBhcHBseSBydWxlIG51bWJlciBvbmUgYmVsb3cuCisgICAgICAg
IHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQu
dmFsdWVPcigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07CisK
KyAgICAgICAgYXV0byBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24gPSBzdGF0aWNIb3Jpem9udGFs
UG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0
cmFpbnRzKTsKKyAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pCisgICAgICAgICAg
ICBsZWZ0ID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICByaWdodCA9IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbjsKKyAgICB9IGVsc2UgaWYgKGxl
ZnQgJiYgd2lkdGggJiYgcmlnaHQpIHsKKyAgICAgICAgLy8gSWYgbm9uZSBvZiB0aGUgdGhyZWUg
aXMgJ2F1dG8nOiBJZiBib3RoICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIGFyZSAn
YXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0aGUgZXh0cmEgY29uc3RyYWludCB0aGF0
IHRoZSB0d28gbWFyZ2lucyBnZXQgZXF1YWwgdmFsdWVzLAorICAgICAgICAvLyB1bmxlc3MgdGhp
cyB3b3VsZCBtYWtlIHRoZW0gbmVnYXRpdmUsIGluIHdoaWNoIGNhc2Ugd2hlbiBkaXJlY3Rpb24g
b2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicgKCdydGwnKSwgc2V0ICdtYXJnaW4tbGVm
dCcgKCdtYXJnaW4tcmlnaHQnKSB0byB6ZXJvIGFuZAorICAgICAgICAvLyBzb2x2ZSBmb3IgJ21h
cmdpbi1yaWdodCcgKCdtYXJnaW4tbGVmdCcpLiBJZiBvbmUgb2YgJ21hcmdpbi1sZWZ0JyBvciAn
bWFyZ2luLXJpZ2h0JyBpcyAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiBmb3IgdGhhdCB2YWx1
ZS4KKyAgICAgICAgLy8gSWYgdGhlIHZhbHVlcyBhcmUgb3Zlci1jb25zdHJhaW5lZCwgaWdub3Jl
IHRoZSB2YWx1ZSBmb3IgJ2xlZnQnIChpbiBjYXNlIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBv
ZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAncnRsJykgb3IgJ3JpZ2h0JworICAgICAgICAvLyAo
aW4gY2FzZSAnZGlyZWN0aW9uJyBpcyAnbHRyJykgYW5kIHNvbHZlIGZvciB0aGF0IHZhbHVlLgor
ICAgICAgICBpZiAoIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiAhY29tcHV0ZWRI
b3Jpem9udGFsTWFyZ2luLmVuZCkgeworICAgICAgICAgICAgYXV0byBtYXJnaW5TdGFydEFuZEVu
ZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdM
ZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqcmlnaHQpOworICAg
ICAgICAgICAgaWYgKG1hcmdpblN0YXJ0QW5kRW5kID49IDApCisgICAgICAgICAgICAgICAgdXNl
ZEhvcml6b250YWxNYXJnaW4gPSB7IG1hcmdpblN0YXJ0QW5kRW5kIC8gMiwgbWFyZ2luU3RhcnRB
bmRFbmQgLyAyIH07CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNM
ZWZ0VG9SaWdodERpcmVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRh
bE1hcmdpbi5zdGFydCA9IDBfbHU7CisgICAgICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFs
TWFyZ2luLmVuZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250
YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRk
aW5nUmlnaHQgKyBib3JkZXJSaWdodCArICpyaWdodCk7CisgICAgICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gMF9sdTsK
KyAgICAgICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSBjb250YWlu
aW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0
aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5k
ICsgKnJpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0g
ZWxzZSBpZiAoIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCkgeworICAgICAgICAgICAg
dXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQ7
CisgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNvbnRhaW5pbmdCbG9j
a1dpZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFk
ZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAqcmln
aHQpOworICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7
CisgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9ICpjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uc3RhcnQ7CisgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQg
PSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0
YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsg
Ym9yZGVyUmlnaHQgKyAqcmlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXNl
ZEhvcml6b250YWxNYXJnaW4gPSB7ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQsICpj
b21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kIH07CisgICAgICAgICAgICAvLyBPdmVyY29uc3Ry
YWluZWQ/IElnbm9yZSByaWdodCAobGVmdCkuCisgICAgICAgICAgICBpZiAoaXNMZWZ0VG9SaWdo
dERpcmVjdGlvbikKKyAgICAgICAgICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRo
IC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgKmxlZnQgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGVm
dCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsg
Ym9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVy
UmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOworICAgICAgICB9Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgJ2F1dG8nIHZhbHVlcyBmb3Ig
J21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgdG8gMCwgYW5kIHBpY2sgdGhlIG9uZSBv
ZiB0aGUgZm9sbG93aW5nIHNpeCBydWxlcyB0aGF0IGFwcGxpZXMuCisgICAgICAgIHVzZWRIb3Jp
em9udGFsTWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigw
KSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07CisgICAgfQorCisg
ICAgaWYgKCFsZWZ0ICYmICF3aWR0aCAmJiByaWdodCkgeworICAgICAgICAvLyAjMQorICAgICAg
ICAvLyBDYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSB3aWR0aCBieSBzb2x2aW5nIGZvciAnd2lkdGgn
IGFmdGVyIHNldHRpbmcgJ2xlZnQnIChpbiBjYXNlIDEpIHRvIDAKKyAgICAgICAgbGVmdCA9IExh
eW91dFVuaXQgeyAwIH07CisgICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBjb250YWluaW5n
QmxvY2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVy
TGVmdCArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9y
aXpvbnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOworICAgICAgICB3aWR0aCA9IHNocmlua1RvRml0
V2lkdGgobGF5b3V0Qm94LCBhdmFpbGFibGVXaWR0aCk7CisgICAgICAgIGxlZnQgPSBjb250YWlu
aW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCAgKyBib3JkZXJSaWdodCArIHVz
ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7CisgICAgfSBlbHNlIGlmICghbGVmdCAm
JiAhcmlnaHQgJiYgd2lkdGgpIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAgYXV0byBzdGF0aWNI
b3Jpem9udGFsUG9zaXRpb24gPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb25Gb3JPdXRPZkZsb3dQ
b3NpdGlvbmVkKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICAgICAgaWYg
KGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pIHsKKyAgICAgICAgICAgIGxlZnQgPSBzdGF0aWNIb3Jp
em9udGFsUG9zaXRpb247CisgICAgICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRo
IC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByaWdodCA9
IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbjsKKyAgICAgICAgICAgIGxlZnQgPSBjb250YWluaW5n
QmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBw
YWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhv
cml6b250YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAo
IXdpZHRoICYmICFyaWdodCAmJiBsZWZ0KSB7CisgICAgICAgIC8vICMzCisgICAgICAgIC8vIENh
bGN1bGF0ZSB0aGUgYXZhaWxhYmxlIHdpZHRoIGJ5IHNvbHZpbmcgZm9yICd3aWR0aCcgYWZ0ZXIg
c2V0dGluZyAncmlnaHQnIChpbiBjYXNlIDMpIHRvIDAKKyAgICAgICAgcmlnaHQgPSBMYXlvdXRV
bml0IHsgMCB9OworICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gY29udGFpbmluZ0Jsb2Nr
V2lkdGggLSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250
YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKKyAgICAgICAgd2lkdGggPSBzaHJpbmtUb0ZpdFdpZHRo
KGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpOworICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdC
bG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJM
ZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCAr
IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7CisgICAgfSBlbHNlIGlmICghbGVmdCAmJiB3aWR0
aCAmJiByaWdodCkgeworICAgICAgICAvLyAjNAorICAgICAgICBsZWZ0ID0gY29udGFpbmluZ0Js
b2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7CisgICAgfSBlbHNlIGlmICghd2lkdGggJiYgbGVm
dCAmJiByaWdodCkgeworICAgICAgICAvLyAjNQorICAgICAgICB3aWR0aCA9IGNvbnRhaW5pbmdC
bG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJM
ZWZ0ICsgcGFkZGluZ0xlZnQgKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7CisgICAgfSBlbHNlIGlmICghcmlnaHQgJiYgbGVm
dCAmJiB3aWR0aCkgeworICAgICAgICAvLyAjNgorICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdC
bG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJM
ZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCAr
IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7CisgICAgfQorCisgICAgQVNTRVJUKGxlZnQpOwor
ICAgIEFTU0VSVChyaWdodCk7CisgICAgQVNTRVJUKHdpZHRoKTsKKworICAgIC8vIEZvciBvdXQt
b2YtZmxvdyBlbGVtZW50cyB0aGUgY29udGFpbmluZyBibG9jayBpcyBmb3JtZWQgYnkgdGhlIHBh
ZGRpbmcgZWRnZSBvZiB0aGUgYW5jZXN0b3IuCisgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcG9z
aXRpb25lZCB2YWx1ZSBpcyBpbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIHBhZGRpbmcg
Ym94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBib3ggY29vcmRpbmF0ZSBzeXN0ZW0uCisg
ICAgYXV0byBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlID0gaG9yaXpvbnRhbENv
bnN0cmFpbnRzLmxvZ2ljYWxMZWZ0OworICAgICpsZWZ0ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRp
bmdWZXJ0aWNhbEVkZ2U7CisgICAgKnJpZ2h0ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0
aWNhbEVkZ2U7CisKKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQs
IHN0cmVhbSA8PCAiW1Bvc2l0aW9uXVtXaWR0aF1bTWFyZ2luXSAtPiBvdXQtb2YtZmxvdyBub24t
cmVwbGFjZWQgLT4gbGVmdCgiIDw8ICpsZWZ0IDw8ICJweCkgcmlnaHQoIiAgPDwgKnJpZ2h0IDw8
ICJweCkgd2lkdGgoIiA8PCAqd2lkdGggPDwgInB4KSBtYXJnaW4oIiA8PCB1c2VkSG9yaXpvbnRh
bE1hcmdpbi5zdGFydCA8PCAicHgsICIgIDw8IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA8PCAi
cHgpIGxheW91dEJveCgiIDw8ICZsYXlvdXRCb3ggPDwgIikiKTsKKyAgICByZXR1cm4geyAqbGVm
dCwgKnJpZ2h0LCB7ICp3aWR0aCwgdXNlZEhvcml6b250YWxNYXJnaW4gfSB9OworfQorCitWZXJ0
aWNhbEdlb21ldHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93UmVwbGFj
ZWRWZXJ0aWNhbEdlb21ldHJ5KGNvbnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3Qg
SG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRp
Y2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0
aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAoreworICAgIEFTU0VS
VChyZXBsYWNlZEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisgICAgQVNTRVJUKHZlcnRp
Y2FsQ29uc3RyYWludHMubG9naWNhbEhlaWdodCk7CisKKyAgICAvLyAxMC42LjUgQWJzb2x1dGVs
eSBwb3NpdGlvbmVkLCByZXBsYWNlZCBlbGVtZW50cworICAgIC8vCisgICAgLy8gVGhlIHVzZWQg
dmFsdWUgb2YgJ2hlaWdodCcgaXMgZGV0ZXJtaW5lZCBhcyBmb3IgaW5saW5lIHJlcGxhY2VkIGVs
ZW1lbnRzLgorICAgIC8vIElmICdtYXJnaW4tdG9wJyBvciAnbWFyZ2luLWJvdHRvbScgaXMgc3Bl
Y2lmaWVkIGFzICdhdXRvJyBpdHMgdXNlZCB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBydWxl
cyBiZWxvdy4KKyAgICAvLyAxLiBJZiBib3RoICd0b3AnIGFuZCAnYm90dG9tJyBoYXZlIHRoZSB2
YWx1ZSAnYXV0bycsIHJlcGxhY2UgJ3RvcCcgd2l0aCB0aGUgZWxlbWVudCdzIHN0YXRpYyBwb3Np
dGlvbi4KKyAgICAvLyAyLiBJZiAnYm90dG9tJyBpcyAnYXV0bycsIHJlcGxhY2UgYW55ICdhdXRv
JyBvbiAnbWFyZ2luLXRvcCcgb3IgJ21hcmdpbi1ib3R0b20nIHdpdGggJzAnLgorICAgIC8vIDMu
IElmIGF0IHRoaXMgcG9pbnQgYm90aCAnbWFyZ2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyBh
cmUgc3RpbGwgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4dHJhIGNvbnN0
cmFpbnQgdGhhdCB0aGUgdHdvIG1hcmdpbnMgbXVzdCBnZXQgZXF1YWwgdmFsdWVzLgorICAgIC8v
IDQuIElmIGF0IHRoaXMgcG9pbnQgdGhlcmUgaXMgb25seSBvbmUgJ2F1dG8nIGxlZnQsIHNvbHZl
IHRoZSBlcXVhdGlvbiBmb3IgdGhhdCB2YWx1ZS4KKyAgICAvLyA1LiBJZiBhdCB0aGlzIHBvaW50
IHRoZSB2YWx1ZXMgYXJlIG92ZXItY29uc3RyYWluZWQsIGlnbm9yZSB0aGUgdmFsdWUgZm9yICdi
b3R0b20nIGFuZCBzb2x2ZSBmb3IgdGhhdCB2YWx1ZS4KKworICAgIGF1dG8mIGZvcm1hdHRpbmdD
b250ZXh0ID0gdGhpcy0+Zm9ybWF0dGluZ0NvbnRleHQoKTsKKyAgICBhdXRvJiBzdHlsZSA9IHJl
cGxhY2VkQm94LnN0eWxlKCk7CisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29u
dGV4dC5nZW9tZXRyeUZvckJveChyZXBsYWNlZEJveCk7CisgICAgYXV0byBjb250YWluaW5nQmxv
Y2tIZWlnaHQgPSAqdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2FsSGVpZ2h0OworICAgIGF1dG8g
Y29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRo
OworCisgICAgYXV0byB0b3AgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxUb3AoKSwgY29u
dGFpbmluZ0Jsb2NrV2lkdGgpOworICAgIGF1dG8gYm90dG9tID0gY29tcHV0ZWRWYWx1ZShzdHls
ZS5sb2dpY2FsQm90dG9tKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKyAgICBhdXRvIGhlaWdo
dCA9IGlubGluZVJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihyZXBsYWNlZEJveCwgaG9y
aXpvbnRhbENvbnN0cmFpbnRzLCB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGlj
YWxWYWx1ZXMpLmNvbnRlbnRIZWlnaHQ7CisgICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2lu
ID0gR2VvbWV0cnk6OmNvbXB1dGVkVmVydGljYWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250
YWxDb25zdHJhaW50cyk7CisgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZE1hcmdpbkJlZm9y
ZSA9IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlOworICAgIE9wdGlvbmFsPExheW91dFVu
aXQ+IHVzZWRNYXJnaW5BZnRlciA9IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXI7CisgICAg
YXV0byBwYWRkaW5nVG9wID0gYm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCk7Cisg
ICAgYXV0byBwYWRkaW5nQm90dG9tID0gYm94R2VvbWV0cnkucGFkZGluZ0JvdHRvbSgpLnZhbHVl
T3IoMCk7CisgICAgYXV0byBib3JkZXJUb3AgPSBib3hHZW9tZXRyeS5ib3JkZXJUb3AoKTsKKyAg
ICBhdXRvIGJvcmRlckJvdHRvbSA9IGJveEdlb21ldHJ5LmJvcmRlckJvdHRvbSgpOworCisgICAg
aWYgKCF0b3AgJiYgIWJvdHRvbSkgeworICAgICAgICAvLyAjMQorICAgICAgICB0b3AgPSBzdGF0
aWNWZXJ0aWNhbFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChyZXBsYWNlZEJveCwgdmVy
dGljYWxDb25zdHJhaW50cyk7CisgICAgfQorCisgICAgaWYgKCFib3R0b20pIHsKKyAgICAgICAg
Ly8gIzIKKyAgICAgICAgdXNlZE1hcmdpbkJlZm9yZSA9IGNvbXB1dGVkVmVydGljYWxNYXJnaW4u
YmVmb3JlLnZhbHVlT3IoMCk7CisgICAgICAgIHVzZWRNYXJnaW5BZnRlciA9IHVzZWRNYXJnaW5C
ZWZvcmU7CisgICAgfQorCisgICAgaWYgKCF1c2VkTWFyZ2luQmVmb3JlICYmICF1c2VkTWFyZ2lu
QWZ0ZXIpIHsKKyAgICAgICAgLy8gIzMKKyAgICAgICAgYXV0byBtYXJnaW5CZWZvcmVBbmRBZnRl
ciA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsgcGFkZGluZ1Rv
cCArIGhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqYm90dG9tKTsKKyAg
ICAgICAgdXNlZE1hcmdpbkJlZm9yZSA9IG1hcmdpbkJlZm9yZUFuZEFmdGVyIC8gMjsKKyAgICAg
ICAgdXNlZE1hcmdpbkFmdGVyID0gdXNlZE1hcmdpbkJlZm9yZTsKKyAgICB9CisKKyAgICAvLyAj
NAorICAgIGlmICghdG9wKQorICAgICAgICB0b3AgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAo
KnVzZWRNYXJnaW5CZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgaGVpZ2h0ICsgcGFk
ZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArICp1c2VkTWFyZ2luQWZ0ZXIgKyAqYm90dG9tKTsK
KworICAgIGlmICghYm90dG9tKQorICAgICAgICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWln
aHQgLSAoKnRvcCArICp1c2VkTWFyZ2luQmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCAr
IGhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVy
KTsKKworICAgIGlmICghdXNlZE1hcmdpbkJlZm9yZSkKKyAgICAgICAgdXNlZE1hcmdpbkJlZm9y
ZSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsgcGFkZGluZ1Rv
cCArIGhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFm
dGVyICsgKmJvdHRvbSk7CisKKyAgICBpZiAoIXVzZWRNYXJnaW5BZnRlcikKKyAgICAgICAgdXNl
ZE1hcmdpbkFmdGVyID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyAqdXNlZE1hcmdp
bkJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBoZWlnaHQgKyBwYWRkaW5nQm90dG9t
ICsgYm9yZGVyQm90dG9tICsgKmJvdHRvbSk7CisKKyAgICAvLyAjNQorICAgIGF1dG8gYm94SGVp
Z2h0ID0gKnRvcCArICp1c2VkTWFyZ2luQmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCAr
IGhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVy
ICsgKmJvdHRvbTsKKyAgICBpZiAoYm94SGVpZ2h0ID4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KQor
ICAgICAgICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArICp1c2VkTWFy
Z2luQmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdodCArIHBhZGRpbmdCb3R0
b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyKTsgCisKKyAgICAvLyBGb3Igb3V0
LW9mLWZsb3cgZWxlbWVudHMgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgZm9ybWVkIGJ5IHRoZSBw
YWRkaW5nIGVkZ2Ugb2YgdGhlIGFuY2VzdG9yLgorICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBv
c2l0aW9uZWQgdmFsdWUgaXMgaW4gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBwYWRkaW5n
IGJveC4gTGV0J3MgY29udmVydCBpdCB0byBib3JkZXIgYm94IGNvb3JkaW5hdGUgc3lzdGVtLgor
ICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZSA9IHZlcnRpY2FsQ29u
c3RyYWludHMubG9naWNhbFRvcDsKKyAgICAqdG9wICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdW
ZXJ0aWNhbEVkZ2U7CisgICAgKmJvdHRvbSArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGlj
YWxFZGdlOworCisgICAgQVNTRVJUKHRvcCk7CisgICAgQVNTRVJUKGJvdHRvbSk7CisgICAgQVNT
RVJUKHVzZWRNYXJnaW5CZWZvcmUpOworICAgIEFTU0VSVCh1c2VkTWFyZ2luQWZ0ZXIpOworICAg
IExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbUG9z
aXRpb25dW0hlaWdodF1bTWFyZ2luXSAtPiBvdXQtb2YtZmxvdyByZXBsYWNlZCAtPiB0b3AoIiA8
PCAqdG9wIDw8ICJweCkgYm90dG9tKCIgIDw8ICpib3R0b20gPDwgInB4KSBoZWlnaHQoIiA8PCBo
ZWlnaHQgPDwgInB4KSBtYXJnaW4oIiA8PCAqdXNlZE1hcmdpbkJlZm9yZSA8PCAicHgsICIgIDw8
ICp1c2VkTWFyZ2luQWZ0ZXIgPDwgInB4KSBsYXlvdXRCb3goIiA8PCAmcmVwbGFjZWRCb3ggPDwg
IikiKTsKKyAgICByZXR1cm4geyAqdG9wLCAqYm90dG9tLCB7IGhlaWdodCwgeyAqdXNlZE1hcmdp
bkJlZm9yZSwgKnVzZWRNYXJnaW5BZnRlciB9IH0gfTsKK30KKworSG9yaXpvbnRhbEdlb21ldHJ5
IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93UmVwbGFjZWRIb3Jpem9udGFs
R2VvbWV0cnkoY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFs
Q29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVydGljYWxDb25zdHJh
aW50cyYgdmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQoreworICAgIEFTU0VSVChyZXBsYWNlZEJv
eC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisKKyAgICAvLyAxMC4zLjggQWJzb2x1dGVseSBw
b3NpdGlvbmVkLCByZXBsYWNlZCBlbGVtZW50cworICAgIC8vIEluIHRoaXMgY2FzZSwgc2VjdGlv
biAxMC4zLjcgYXBwbGllcyB1cCB0aHJvdWdoIGFuZCBpbmNsdWRpbmcgdGhlIGNvbnN0cmFpbnQg
ZXF1YXRpb24sIGJ1dCB0aGUgcmVzdCBvZiBzZWN0aW9uIDEwLjMuNyBpcyByZXBsYWNlZCBieSB0
aGUgZm9sbG93aW5nIHJ1bGVzOgorICAgIC8vCisgICAgLy8gVGhlIHVzZWQgdmFsdWUgb2YgJ3dp
ZHRoJyBpcyBkZXRlcm1pbmVkIGFzIGZvciBpbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMuIElmICdt
YXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgaXMgc3BlY2lmaWVkIGFzICdhdXRvJyBpdHMg
dXNlZCB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBydWxlcyBiZWxvdy4KKyAgICAvLyAxLiBJ
ZiBib3RoICdsZWZ0JyBhbmQgJ3JpZ2h0JyBoYXZlIHRoZSB2YWx1ZSAnYXV0bycsIHRoZW4gaWYg
dGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGVzdGFibGlzaGluZyB0aGUg
c3RhdGljLXBvc2l0aW9uIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicsCisgICAgLy8gICBzZXQg
J2xlZnQnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb247IGVsc2UgaWYgJ2RpcmVjdGlvbicgaXMgJ3J0
bCcsIHNldCAncmlnaHQnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb24uCisgICAgLy8gMi4gSWYgJ2xl
ZnQnIG9yICdyaWdodCcgYXJlICdhdXRvJywgcmVwbGFjZSBhbnkgJ2F1dG8nIG9uICdtYXJnaW4t
bGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgd2l0aCAnMCcuCisgICAgLy8gMy4gSWYgYXQgdGhpcyBw
b2ludCBib3RoICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIGFyZSBzdGlsbCAnYXV0
bycsIHNvbHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0aGUgZXh0cmEgY29uc3RyYWludCB0aGF0IHRo
ZSB0d28gbWFyZ2lucyBtdXN0IGdldCBlcXVhbCB2YWx1ZXMsCisgICAgLy8gICB1bmxlc3MgdGhp
cyB3b3VsZCBtYWtlIHRoZW0gbmVnYXRpdmUsIGluIHdoaWNoIGNhc2Ugd2hlbiB0aGUgZGlyZWN0
aW9uIG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGlzICdsdHInICgncnRsJyksIHNldCAnbWFyZ2lu
LWxlZnQnICgnbWFyZ2luLXJpZ2h0JykgdG8gemVybyBhbmQKKyAgICAvLyAgIHNvbHZlIGZvciAn
bWFyZ2luLXJpZ2h0JyAoJ21hcmdpbi1sZWZ0JykuCisgICAgLy8gNC4gSWYgYXQgdGhpcyBwb2lu
dCB0aGVyZSBpcyBhbiAnYXV0bycgbGVmdCwgc29sdmUgdGhlIGVxdWF0aW9uIGZvciB0aGF0IHZh
bHVlLgorICAgIC8vIDUuIElmIGF0IHRoaXMgcG9pbnQgdGhlIHZhbHVlcyBhcmUgb3Zlci1jb25z
dHJhaW5lZCwgaWdub3JlIHRoZSB2YWx1ZSBmb3IgZWl0aGVyICdsZWZ0JyAoaW4gY2FzZSB0aGUg
J2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ3J0bCcpIG9y
CisgICAgLy8gICAncmlnaHQnIChpbiBjYXNlICdkaXJlY3Rpb24nIGlzICdsdHInKSBhbmQgc29s
dmUgZm9yIHRoYXQgdmFsdWUuCisKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMt
PmZvcm1hdHRpbmdDb250ZXh0KCk7CisgICAgYXV0byYgc3R5bGUgPSByZXBsYWNlZEJveC5zdHls
ZSgpOworICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlG
b3JCb3gocmVwbGFjZWRCb3gpOworICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jp
em9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoOworICAgIGF1dG8gaXNMZWZ0VG9SaWdodERp
cmVjdGlvbiA9IHJlcGxhY2VkQm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCkuaXNMZWZ0VG9S
aWdodERpcmVjdGlvbigpOworCisgICAgYXV0byBsZWZ0ID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5s
b2dpY2FsTGVmdCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisgICAgYXV0byByaWdodCA9IGNv
bXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbFJpZ2h0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsK
KyAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhv
cml6b250YWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAg
T3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZE1hcmdpblN0YXJ0ID0gY29tcHV0ZWRIb3Jpem9udGFs
TWFyZ2luLnN0YXJ0OworICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRNYXJnaW5FbmQgPSBj
b21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kOworICAgIGF1dG8gd2lkdGggPSBpbmxpbmVSZXBs
YWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykuY29u
dGVudFdpZHRoOworICAgIGF1dG8gcGFkZGluZ0xlZnQgPSBib3hHZW9tZXRyeS5wYWRkaW5nTGVm
dCgpLnZhbHVlT3IoMCk7CisgICAgYXV0byBwYWRkaW5nUmlnaHQgPSBib3hHZW9tZXRyeS5wYWRk
aW5nUmlnaHQoKS52YWx1ZU9yKDApOworICAgIGF1dG8gYm9yZGVyTGVmdCA9IGJveEdlb21ldHJ5
LmJvcmRlckxlZnQoKTsKKyAgICBhdXRvIGJvcmRlclJpZ2h0ID0gYm94R2VvbWV0cnkuYm9yZGVy
UmlnaHQoKTsKKworICAgIGlmICghbGVmdCAmJiAhcmlnaHQpIHsKKyAgICAgICAgLy8gIzEKKyAg
ICAgICAgYXV0byBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24gPSBzdGF0aWNIb3Jpem9udGFsUG9z
aXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3Ry
YWludHMpOworICAgICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikKKyAgICAgICAgICAg
IGxlZnQgPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb247CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIHJpZ2h0ID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uOworICAgIH0KKworICAgIGlmICgh
bGVmdCB8fCAhcmlnaHQpIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAgdXNlZE1hcmdpblN0YXJ0
ID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCk7CisgICAgICAgIHVz
ZWRNYXJnaW5FbmQgPSBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMCk7Cisg
ICAgfQorCisgICAgaWYgKCF1c2VkTWFyZ2luU3RhcnQgJiYgIXVzZWRNYXJnaW5FbmQpIHsKKyAg
ICAgICAgLy8gIzMKKyAgICAgICAgYXV0byBtYXJnaW5TdGFydEFuZEVuZCA9IGNvbnRhaW5pbmdC
bG9ja1dpZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBw
YWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICpyaWdodCk7CisgICAgICAgIGlmIChtYXJnaW5T
dGFydEFuZEVuZCA+PSAwKSB7CisgICAgICAgICAgICB1c2VkTWFyZ2luU3RhcnQgPSBtYXJnaW5T
dGFydEFuZEVuZCAvIDI7CisgICAgICAgICAgICB1c2VkTWFyZ2luRW5kID0gdXNlZE1hcmdpblN0
YXJ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24pIHsKKyAgICAgICAgICAgICAgICB1c2VkTWFyZ2luU3RhcnQgPSAwX2x1OworICAgICAg
ICAgICAgICAgIHVzZWRNYXJnaW5FbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCAr
ICp1c2VkTWFyZ2luU3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBh
ZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnJpZ2h0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICAgICAgdXNlZE1hcmdpbkVuZCA9IDBfbHU7CisgICAgICAgICAgICAgICAg
dXNlZE1hcmdpblN0YXJ0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyBib3JkZXJM
ZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsg
KnVzZWRNYXJnaW5FbmQgKyAqcmlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fQorCisgICAgLy8gIzQKKyAgICBpZiAoIWxlZnQpCisgICAgICAgIGxlZnQgPSBjb250YWluaW5n
QmxvY2tXaWR0aCAtICgqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0
ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFyZ2luRW5kICsg
KnJpZ2h0KTsKKworICAgIGlmICghcmlnaHQpCisgICAgICAgIHJpZ2h0ID0gY29udGFpbmluZ0Js
b2NrV2lkdGggLSAoKmxlZnQgKyAqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRp
bmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFyZ2lu
RW5kKTsKKworICAgIGlmICghdXNlZE1hcmdpblN0YXJ0KQorICAgICAgICB1c2VkTWFyZ2luU3Rh
cnQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5n
TGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNlZE1hcmdpbkVu
ZCArICpyaWdodCk7CisKKyAgICBpZiAoIXVzZWRNYXJnaW5FbmQpCisgICAgICAgIHVzZWRNYXJn
aW5FbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArICp1c2VkTWFyZ2luU3RhcnQg
KyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRl
clJpZ2h0ICsgKnJpZ2h0KTsKKworICAgIGF1dG8gYm94V2lkdGggPSAoKmxlZnQgKyAqdXNlZE1h
cmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmln
aHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFyZ2luRW5kICsgKnJpZ2h0KTsKKyAgICBpZiAoYm94
V2lkdGggPiBjb250YWluaW5nQmxvY2tXaWR0aCkgeworICAgICAgICAvLyAjNSBPdmVyLWNvbnN0
cmFpbmVkPworICAgICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikKKyAgICAgICAgICAg
IHJpZ2h0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyAqdXNlZE1hcmdpblN0YXJ0
ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3Jk
ZXJSaWdodCArICp1c2VkTWFyZ2luRW5kKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGVm
dCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCp1c2VkTWFyZ2luU3RhcnQgKyBib3JkZXJMZWZ0
ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnVz
ZWRNYXJnaW5FbmQgKyAqcmlnaHQpOworICAgIH0KKworICAgIEFTU0VSVChsZWZ0KTsKKyAgICBB
U1NFUlQocmlnaHQpOworICAgIEFTU0VSVCh1c2VkTWFyZ2luU3RhcnQpOworICAgIEFTU0VSVCh1
c2VkTWFyZ2luRW5kKTsKKworICAgIC8vIEZvciBvdXQtb2YtZmxvdyBlbGVtZW50cyB0aGUgY29u
dGFpbmluZyBibG9jayBpcyBmb3JtZWQgYnkgdGhlIHBhZGRpbmcgZWRnZSBvZiB0aGUgYW5jZXN0
b3IuCisgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcG9zaXRpb25lZCB2YWx1ZSBpcyBpbiB0aGUg
Y29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIHBhZGRpbmcgYm94LiBMZXQncyBjb252ZXJ0IGl0IHRv
IGJvcmRlciBib3ggY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAgYXV0byBjb250YWluaW5nQmxvY2tQ
YWRkaW5nVmVydGljYWxFZGdlID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxMZWZ0Owor
ICAgICpsZWZ0ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7CisgICAgKnJp
Z2h0ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7CisKKyAgICBMT0dfV0lU
SF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1Bvc2l0aW9uXVtX
aWR0aF1bTWFyZ2luXSAtPiBvdXQtb2YtZmxvdyByZXBsYWNlZCAtPiBsZWZ0KCIgPDwgKmxlZnQg
PDwgInB4KSByaWdodCgiICA8PCAqcmlnaHQgPDwgInB4KSB3aWR0aCgiIDw8IHdpZHRoIDw8ICJw
eCkgbWFyZ2luKCIgPDwgKnVzZWRNYXJnaW5TdGFydCA8PCAicHgsICIgIDw8ICp1c2VkTWFyZ2lu
RW5kIDw8ICJweCkgbGF5b3V0Qm94KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIpIik7CisgICAgcmV0
dXJuIHsgKmxlZnQsICpyaWdodCwgeyB3aWR0aCwgeyAqdXNlZE1hcmdpblN0YXJ0LCAqdXNlZE1h
cmdpbkVuZCB9IH0gfTsKK30KKworQ29udGVudEhlaWdodEFuZE1hcmdpbiBGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6OmNvbXBsaWNhdGVkQ2FzZXMoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNv
bnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBP
dmVycmlkZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgY29uc3QK
K3sKKyAgICBBU1NFUlQoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpOworICAgIC8vIFRPRE86
IFVzZSBjb21wbGljYXRlZC1jYXNlIGZvciBkb2N1bWVudCByZW5kZXJlciBmb3Igbm93IChzZWUg
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd0hlaWdodEFuZE1hcmdpbiku
CisgICAgQVNTRVJUKChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkgJiYgbGF5b3V0Qm94Lmlz
SW5GbG93KCkgJiYgIWxheW91dEJveC5pc092ZXJmbG93VmlzaWJsZSgpKSB8fCBsYXlvdXRCb3gu
aXNJbmxpbmVCbG9ja0JveCgpIHx8IGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpIHx8
IGxheW91dEJveC5pc0RvY3VtZW50Qm94KCkgfHwgbGF5b3V0Qm94LmlzVGFibGVCb3goKSk7CisK
KyAgICAvLyAxMC42LjYgQ29tcGxpY2F0ZWQgY2FzZXMKKyAgICAvLworICAgIC8vIEJsb2NrLWxl
dmVsLCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgd2hlbiAnb3ZlcmZsb3cn
IGRvZXMgbm90IGNvbXB1dGUgdG8gJ3Zpc2libGUnIChleGNlcHQgaWYgdGhlICdvdmVyZmxvdycg
cHJvcGVydHkncyB2YWx1ZSBoYXMgYmVlbiBwcm9wYWdhdGVkIHRvIHRoZSB2aWV3cG9ydCkuCisg
ICAgLy8gJ0lubGluZS1ibG9jaycsIG5vbi1yZXBsYWNlZCBlbGVtZW50cy4KKyAgICAvLyBGbG9h
dGluZywgbm9uLXJlcGxhY2VkIGVsZW1lbnRzLgorICAgIC8vCisgICAgLy8gMS4gSWYgJ21hcmdp
bi10b3AnLCBvciAnbWFyZ2luLWJvdHRvbScgYXJlICdhdXRvJywgdGhlaXIgdXNlZCB2YWx1ZSBp
cyAwLgorICAgIC8vIDIuIElmICdoZWlnaHQnIGlzICdhdXRvJywgdGhlIGhlaWdodCBkZXBlbmRz
IG9uIHRoZSBlbGVtZW50J3MgZGVzY2VuZGFudHMgcGVyIDEwLjYuNy4KKworICAgIGF1dG8gaGVp
Z2h0ID0gb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0aWNh
bFZhbHVlcy5oZWlnaHQudmFsdWUoKSA6IGNvbXB1dGVkSGVpZ2h0KGxheW91dEJveCk7CisgICAg
YXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVkVmVydGljYWxN
YXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgIC8vICMxCisgICAg
YXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNl
ZFZhbHVlcyB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1
dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OyAKKyAgICAvLyAjMgorICAgIGlm
ICghaGVpZ2h0KSB7CisgICAgICAgIEFTU0VSVChpc0hlaWdodEF1dG8obGF5b3V0Qm94KSk7Cisg
ICAgICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxDb250
YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCisgICAgICAg
ICAgICBoZWlnaHQgPSAwX2x1OworICAgICAgICBlbHNlIGlmIChsYXlvdXRCb3guaXNEb2N1bWVu
dEJveCgpICYmICFsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKSB7Cisg
ICAgICAgICAgICBhdXRvJiBkb2N1bWVudEJveCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5
b3V0Qm94KTsKKyAgICAgICAgICAgIGF1dG8gdG9wID0gQm94R2VvbWV0cnk6Om1hcmdpbkJveFJl
Y3QoZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveCgqZG9jdW1lbnRCb3guZmlyc3RJ
bkZsb3dDaGlsZCgpKSkudG9wKCk7CisgICAgICAgICAgICBhdXRvIGJvdHRvbSA9IEJveEdlb21l
dHJ5OjptYXJnaW5Cb3hSZWN0KGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goKmRv
Y3VtZW50Qm94Lmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7CisgICAgICAgICAgICAvLyBU
aGlzIGlzIGEgc3BlY2lhbCAocXVpcms/KSBiZWhhdmlvciBzaW5jZSB0aGUgZG9jdW1lbnQgYm94
IGlzIG5vdCBhIGZvcm1hdHRpbmcgY29udGV4dCByb290IGFuZAorICAgICAgICAgICAgLy8gYWxs
IHRoZSBmbG9hdCBib3hlcyBlbmQgdXAgYXQgdGhlIElDQiBsZXZlbC4KKyAgICAgICAgICAgIGF1
dG8mIGluaXRpYWxDb250YWluaW5nQmxvY2sgPSBkb2N1bWVudEJveC5mb3JtYXR0aW5nQ29udGV4
dFJvb3QoKTsKKyAgICAgICAgICAgIGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250
ZXh0IHsgZm9ybWF0dGluZ0NvbnRleHQoKSwgbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZEZvcm1h
dHRpbmdTdGF0ZShpbml0aWFsQ29udGFpbmluZ0Jsb2NrKS5mbG9hdGluZ1N0YXRlKCkgfTsKKyAg
ICAgICAgICAgIGlmIChhdXRvIGZsb2F0Qm90dG9tID0gZmxvYXRpbmdDb250ZXh0LmJvdHRvbSgp
KSB7CisgICAgICAgICAgICAgICAgYm90dG9tID0gc3RkOjptYXg8TGF5b3V0VW5pdD4oKmZsb2F0
Qm90dG9tLCBib3R0b20pOworICAgICAgICAgICAgICAgIGF1dG8gZmxvYXRUb3AgPSBmbG9hdGlu
Z0NvbnRleHQudG9wKCk7CisgICAgICAgICAgICAgICAgQVNTRVJUKGZsb2F0VG9wKTsKKyAgICAg
ICAgICAgICAgICB0b3AgPSBzdGQ6Om1pbjxMYXlvdXRVbml0PigqZmxvYXRUb3AsIHRvcCk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBoZWlnaHQgPSBib3R0b20gLSB0b3A7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlQobGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0
dGluZ0NvbnRleHQoKSk7CisgICAgICAgICAgICBoZWlnaHQgPSBjb250ZW50SGVpZ2h0Rm9yRm9y
bWF0dGluZ0NvbnRleHRSb290KGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KSk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlQoaGVpZ2h0KTsKKworICAgIExPR19XSVRIX1NU
UkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbSGVpZ2h0XVtNYXJnaW5d
IC0+IGZsb2F0aW5nIG5vbi1yZXBsYWNlZCAtPiBoZWlnaHQoIiA8PCAqaGVpZ2h0IDw8ICJweCkg
bWFyZ2luKCIgPDwgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSA8PCAicHgsICIgPDwgdXNlZFZl
cnRpY2FsTWFyZ2luLmFmdGVyIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8
PCAiKSIpOworICAgIHJldHVybiBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIHsgKmhlaWdodCwgdXNl
ZFZlcnRpY2FsTWFyZ2luIH07Cit9CisKK0NvbnRlbnRXaWR0aEFuZE1hcmdpbiBGb3JtYXR0aW5n
Q29udGV4dDo6R2VvbWV0cnk6OmZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJn
aW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9y
aXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3Zl
cnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0
aW5nUG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKKworICAgIC8v
IDEwLjMuNSBGbG9hdGluZywgbm9uLXJlcGxhY2VkIGVsZW1lbnRzCisgICAgLy8KKyAgICAvLyAx
LiBJZiAnbWFyZ2luLWxlZnQnLCBvciAnbWFyZ2luLXJpZ2h0JyBhcmUgY29tcHV0ZWQgYXMgJ2F1
dG8nLCB0aGVpciB1c2VkIHZhbHVlIGlzICcwJy4KKyAgICAvLyAyLiBJZiAnd2lkdGgnIGlzIGNv
bXB1dGVkIGFzICdhdXRvJywgdGhlIHVzZWQgdmFsdWUgaXMgdGhlICJzaHJpbmstdG8tZml0IiB3
aWR0aC4KKworICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6OmNv
bXB1dGVkSG9yaXpvbnRhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7
CisKKyAgICAvLyAjMQorICAgIGF1dG8gdXNlZEhvcml6b250YWxsTWFyZ2luID0gVXNlZEhvcml6
b250YWxNYXJnaW4geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwg
Y29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07CisgICAgLy8gIzIKKyAg
ICBhdXRvIHdpZHRoID0gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGggPyBvdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0aCA6IGNvbXB1dGVkV2lkdGgobGF5b3V0Qm94LCBob3Jp
em9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoKTsKKyAgICBpZiAoIXdpZHRoKQorICAgICAg
ICB3aWR0aCA9IHNocmlua1RvRml0V2lkdGgobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMubG9naWNhbFdpZHRoKTsKKworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4
dExheW91dCwgc3RyZWFtIDw8ICJbV2lkdGhdW01hcmdpbl0gLT4gZmxvYXRpbmcgbm9uLXJlcGxh
Y2VkIC0+IHdpZHRoKCIgPDwgKndpZHRoIDw8ICJweCkgbWFyZ2luKCIgPDwgdXNlZEhvcml6b250
YWxsTWFyZ2luLnN0YXJ0IDw8ICJweCwgIiA8PCB1c2VkSG9yaXpvbnRhbGxNYXJnaW4uZW5kIDw8
ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIpOworICAgIHJldHVybiBD
b250ZW50V2lkdGhBbmRNYXJnaW4geyAqd2lkdGgsIHVzZWRIb3Jpem9udGFsbE1hcmdpbiB9Owor
fQorCitDb250ZW50SGVpZ2h0QW5kTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6
ZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gm
IHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25z
dHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGlj
YWxWYWx1ZXMpIGNvbnN0Cit7CisgICAgQVNTRVJUKHJlcGxhY2VkQm94LmlzRmxvYXRpbmdQb3Np
dGlvbmVkKCkpOworCisgICAgLy8gMTAuNi4yIElubGluZSByZXBsYWNlZCBlbGVtZW50cywgYmxv
Y2stbGV2ZWwgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3csICdpbmxpbmUtYmxvY2sn
CisgICAgLy8gcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZsb2F0aW5nIHJl
cGxhY2VkIGVsZW1lbnRzCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5
b3V0LCBzdHJlYW0gPDwgIltIZWlnaHRdW01hcmdpbl0gLT4gZmxvYXRpbmcgcmVwbGFjZWQgLT4g
cmVkaXJlY3RlZCB0byBpbmxpbmUgcmVwbGFjZWQiKTsKKyAgICByZXR1cm4gaW5saW5lUmVwbGFj
ZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMsIHsgfSwgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKK30KKworQ29udGVudFdpZHRoQW5k
TWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6ZmxvYXRpbmdSZXBsYWNlZENvbnRl
bnRXaWR0aEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCit7CisgICAg
QVNTRVJUKHJlcGxhY2VkQm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOworCisgICAgLy8gMTAu
My42IEZsb2F0aW5nLCByZXBsYWNlZCBlbGVtZW50cworICAgIC8vCisgICAgLy8gMS4gSWYgJ21h
cmdpbi1sZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBhcmUgY29tcHV0ZWQgYXMgJ2F1dG8nLCB0aGVp
ciB1c2VkIHZhbHVlIGlzICcwJy4KKyAgICAvLyAyLiBUaGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgn
IGlzIGRldGVybWluZWQgYXMgZm9yIGlubGluZSByZXBsYWNlZCBlbGVtZW50cy4KKyAgICBhdXRv
IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6b250YWxN
YXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisKKyAgICBMT0dfV0lU
SF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW0hlaWdodF1bTWFy
Z2luXSAtPiBmbG9hdGluZyByZXBsYWNlZCAtPiByZWRpcmVjdGVkIHRvIGlubGluZSByZXBsYWNl
ZCIpOworICAgIGF1dG8gdXNlZE1hcmdpbiA9IFVzZWRIb3Jpem9udGFsTWFyZ2luIHsgY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1h
cmdpbi5lbmQudmFsdWVPcigwKSB9OworICAgIHJldHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRX
aWR0aEFuZE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IH0sIHsg
b3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGgsIHVzZWRNYXJnaW4gfSk7Cit9CisKK1Zl
cnRpY2FsR2VvbWV0cnkgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dWZXJ0
aWNhbEdlb21ldHJ5KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYg
dmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVy
cmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc091
dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisKKyAgICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2VkQm94
KCkpCisgICAgICAgIHJldHVybiBvdXRPZkZsb3dOb25SZXBsYWNlZFZlcnRpY2FsR2VvbWV0cnko
ZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMs
IHZlcnRpY2FsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7CisgICAgcmV0
dXJuIG91dE9mRmxvd1JlcGxhY2VkVmVydGljYWxHZW9tZXRyeShkb3duY2FzdDxSZXBsYWNlZEJv
eD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB2ZXJ0aWNhbENvbnN0cmFpbnRz
LCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworfQorCitIb3Jpem9udGFsR2VvbWV0cnkgRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkoY29u
c3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRh
bENvbnN0cmFpbnRzLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFp
bnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250
YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQo
KSk7CisKKyAgICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCisgICAgICAgIHJldHVy
biBvdXRPZkZsb3dOb25SZXBsYWNlZEhvcml6b250YWxHZW9tZXRyeShkb3duY2FzdDxDb250YWlu
ZXJCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6
b250YWxWYWx1ZXMpOworICAgIHJldHVybiBvdXRPZkZsb3dSZXBsYWNlZEhvcml6b250YWxHZW9t
ZXRyeShkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyk7Cit9
CisKK0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpm
bG9hdGluZ0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0
IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVy
cmlkZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgY29uc3QKK3sK
KyAgICBBU1NFUlQobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOworCisgICAgaWYg
KCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQorICAgICAgICByZXR1cm4gY29tcGxpY2F0ZWRD
YXNlcyhsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlblZlcnRpY2Fs
VmFsdWVzKTsKKyAgICByZXR1cm4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJn
aW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50
cywgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKK30KKworQ29udGVudFdpZHRoQW5kTWFyZ2lu
IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6ZmxvYXRpbmdDb250ZW50V2lkdGhBbmRNYXJn
aW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9y
aXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3Zl
cnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0
aW5nUG9zaXRpb25lZCgpKTsKKworICAgIGlmICghbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkK
KyAgICAgICAgcmV0dXJuIGZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4o
bGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFs
dWVzKTsKKyAgICByZXR1cm4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihk
b3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBv
dmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyk7Cit9CisKK0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4g
Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRB
bmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFs
Q29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgT3B0aW9uYWw8VmVydGljYWxDb25z
dHJhaW50cz4gdmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFs
dWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Cit7CisgICAgLy8gMTAuNi4yIElu
bGluZSByZXBsYWNlZCBlbGVtZW50cywgYmxvY2stbGV2ZWwgcmVwbGFjZWQgZWxlbWVudHMgaW4g
bm9ybWFsIGZsb3csICdpbmxpbmUtYmxvY2snIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBm
bG93IGFuZCBmbG9hdGluZyByZXBsYWNlZCBlbGVtZW50cworICAgIC8vCisgICAgLy8gMS4gSWYg
J21hcmdpbi10b3AnLCBvciAnbWFyZ2luLWJvdHRvbScgYXJlICdhdXRvJywgdGhlaXIgdXNlZCB2
YWx1ZSBpcyAwLgorICAgIC8vIDIuIElmICdoZWlnaHQnIGFuZCAnd2lkdGgnIGJvdGggaGF2ZSBj
b21wdXRlZCB2YWx1ZXMgb2YgJ2F1dG8nIGFuZCB0aGUgZWxlbWVudCBhbHNvIGhhcyBhbiBpbnRy
aW5zaWMgaGVpZ2h0LCB0aGVuIHRoYXQgaW50cmluc2ljIGhlaWdodCBpcyB0aGUgdXNlZCB2YWx1
ZSBvZiAnaGVpZ2h0Jy4KKyAgICAvLyAzLiBPdGhlcndpc2UsIGlmICdoZWlnaHQnIGhhcyBhIGNv
bXB1dGVkIHZhbHVlIG9mICdhdXRvJywgYW5kIHRoZSBlbGVtZW50IGhhcyBhbiBpbnRyaW5zaWMg
cmF0aW8gdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnaGVpZ2h0JyBpczoKKyAgICAvLyAgICAodXNl
ZCB3aWR0aCkgLyAoaW50cmluc2ljIHJhdGlvKQorICAgIC8vIDQuIE90aGVyd2lzZSwgaWYgJ2hl
aWdodCcgaGFzIGEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8nLCBhbmQgdGhlIGVsZW1lbnQgaGFz
IGFuIGludHJpbnNpYyBoZWlnaHQsIHRoZW4gdGhhdCBpbnRyaW5zaWMgaGVpZ2h0IGlzIHRoZSB1
c2VkIHZhbHVlIG9mICdoZWlnaHQnLgorICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgJ2hlaWdodCcg
aGFzIGEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8nLCBidXQgbm9uZSBvZiB0aGUgY29uZGl0aW9u
cyBhYm92ZSBhcmUgbWV0LCB0aGVuIHRoZSB1c2VkIHZhbHVlIG9mICdoZWlnaHQnIG11c3QgYmUg
c2V0IHRvCisgICAgLy8gICAgdGhlIGhlaWdodCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgdGhh
dCBoYXMgYSAyOjEgcmF0aW8sIGhhcyBhIGhlaWdodCBub3QgZ3JlYXRlciB0aGFuIDE1MHB4LCBh
bmQgaGFzIGEgd2lkdGggbm90IGdyZWF0ZXIgdGhhbiB0aGUgZGV2aWNlIHdpZHRoLgorCisgICAg
Ly8gIzEKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250
ZXh0KCk7CisgICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1
dGVkVmVydGljYWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Cisg
ICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxh
cHNlZFZhbHVlcyB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNv
bXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OworICAgIGF1dG8mIHN0eWxl
ID0gcmVwbGFjZWRCb3guc3R5bGUoKTsKKworICAgIGF1dG8gaGVpZ2h0ID0gb3ZlcnJpZGRlblZl
cnRpY2FsVmFsdWVzLmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQudmFs
dWUoKSA6IGNvbXB1dGVkSGVpZ2h0KHJlcGxhY2VkQm94LCB2ZXJ0aWNhbENvbnN0cmFpbnRzID8g
dmVydGljYWxDb25zdHJhaW50cy0+bG9naWNhbEhlaWdodCA6IFdURjo6bnVsbG9wdCk7CisgICAg
YXV0byBoZWlnaHRJc0F1dG8gPSAhb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCAmJiBp
c0hlaWdodEF1dG8ocmVwbGFjZWRCb3gpOworICAgIGF1dG8gd2lkdGhJc0F1dG8gPSBzdHlsZS5s
b2dpY2FsV2lkdGgoKS5pc0F1dG8oKTsKKworICAgIGlmIChoZWlnaHRJc0F1dG8gJiYgd2lkdGhJ
c0F1dG8gJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkpIHsKKyAgICAgICAgLy8g
IzIKKyAgICAgICAgaGVpZ2h0ID0gcmVwbGFjZWRCb3guaW50cmluc2ljSGVpZ2h0KCk7CisgICAg
fSBlbHNlIGlmIChoZWlnaHRJc0F1dG8gJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljUmF0aW8o
KSkgeworICAgICAgICAvLyAjMworICAgICAgICBhdXRvIHVzZWRXaWR0aCA9IGZvcm1hdHRpbmdD
b250ZXh0Lmdlb21ldHJ5Rm9yQm94KHJlcGxhY2VkQm94KS5jb250ZW50Qm94V2lkdGgoKTsKKyAg
ICAgICAgaGVpZ2h0ID0gdXNlZFdpZHRoIC8gcmVwbGFjZWRCb3guaW50cmluc2ljUmF0aW8oKTsK
KyAgICB9IGVsc2UgaWYgKGhlaWdodElzQXV0byAmJiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNI
ZWlnaHQoKSkgeworICAgICAgICAvLyAjNAorICAgICAgICBoZWlnaHQgPSByZXBsYWNlZEJveC5p
bnRyaW5zaWNIZWlnaHQoKTsKKyAgICB9IGVsc2UgaWYgKGhlaWdodElzQXV0bykgeworICAgICAg
ICAvLyAjNQorICAgICAgICBoZWlnaHQgPSB7IDE1MCB9OworICAgIH0KKworICAgIEFTU0VSVCho
ZWlnaHQpOworCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBz
dHJlYW0gPDwgIltIZWlnaHRdW01hcmdpbl0gLT4gaW5mbG93IHJlcGxhY2VkIC0+IGhlaWdodCgi
IDw8ICpoZWlnaHQgPDwgInB4KSBtYXJnaW4oIiA8PCB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3Jl
IDw8ICJweCwgIiA8PCB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgPDwgInB4KSAtPiBsYXlvdXRC
b3goIiA8PCAmcmVwbGFjZWRCb3ggPDwgIikiKTsKKyAgICByZXR1cm4geyAqaGVpZ2h0LCB1c2Vk
VmVydGljYWxNYXJnaW4gfTsKK30KKworQ29udGVudFdpZHRoQW5kTWFyZ2luIEZvcm1hdHRpbmdD
b250ZXh0OjpHZW9tZXRyeTo6aW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29u
c3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMm
IGhvcml6b250YWxDb25zdHJhaW50cywgT3B0aW9uYWw8VmVydGljYWxDb25zdHJhaW50cz4gdmVy
dGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJy
aWRkZW5Ib3Jpem9udGFsVmFsdWVzKQoreworICAgIC8vIDEwLjMuMiBJbmxpbmUsIHJlcGxhY2Vk
IGVsZW1lbnRzCisgICAgLy8KKyAgICAvLyBBIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJyBmb3Ig
J21hcmdpbi1sZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBiZWNvbWVzIGEgdXNlZCB2YWx1ZSBvZiAn
MCcuCisgICAgLy8KKyAgICAvLyAxLiBJZiAnaGVpZ2h0JyBhbmQgJ3dpZHRoJyBib3RoIGhhdmUg
Y29tcHV0ZWQgdmFsdWVzIG9mICdhdXRvJyBhbmQgdGhlIGVsZW1lbnQgYWxzbyBoYXMgYW4gaW50
cmluc2ljIHdpZHRoLCB0aGVuIHRoYXQgaW50cmluc2ljIHdpZHRoIGlzIHRoZSB1c2VkIHZhbHVl
IG9mICd3aWR0aCcuCisgICAgLy8KKyAgICAvLyAyLiBJZiAnaGVpZ2h0JyBhbmQgJ3dpZHRoJyBi
b3RoIGhhdmUgY29tcHV0ZWQgdmFsdWVzIG9mICdhdXRvJyBhbmQgdGhlIGVsZW1lbnQgaGFzIG5v
IGludHJpbnNpYyB3aWR0aCwgYnV0IGRvZXMgaGF2ZSBhbiBpbnRyaW5zaWMgaGVpZ2h0IGFuZCBp
bnRyaW5zaWMgcmF0aW87CisgICAgLy8gICAgb3IgaWYgJ3dpZHRoJyBoYXMgYSBjb21wdXRlZCB2
YWx1ZSBvZiAnYXV0bycsICdoZWlnaHQnIGhhcyBzb21lIG90aGVyIGNvbXB1dGVkIHZhbHVlLCBh
bmQgdGhlIGVsZW1lbnQgZG9lcyBoYXZlIGFuIGludHJpbnNpYyByYXRpbzsKKyAgICAvLyAgICB0
aGVuIHRoZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcgaXM6ICh1c2VkIGhlaWdodCkgKiAoaW50cmlu
c2ljIHJhdGlvKQorICAgIC8vCisgICAgLy8gMy4gSWYgJ2hlaWdodCcgYW5kICd3aWR0aCcgYm90
aCBoYXZlIGNvbXB1dGVkIHZhbHVlcyBvZiAnYXV0bycgYW5kIHRoZSBlbGVtZW50IGhhcyBhbiBp
bnRyaW5zaWMgcmF0aW8gYnV0IG5vIGludHJpbnNpYyBoZWlnaHQgb3Igd2lkdGgsCisgICAgLy8g
ICAgdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgnIGlzIHVuZGVmaW5lZCBpbiBDU1MgMi4y
LiBIb3dldmVyLCBpdCBpcyBzdWdnZXN0ZWQgdGhhdCwgaWYgdGhlIGNvbnRhaW5pbmcgYmxvY2sn
cyB3aWR0aCBkb2VzIG5vdCBpdHNlbGYgZGVwZW5kIG9uIHRoZSByZXBsYWNlZAorICAgIC8vICAg
IGVsZW1lbnQncyB3aWR0aCwgdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgnIGlzIGNhbGN1
bGF0ZWQgZnJvbSB0aGUgY29uc3RyYWludCBlcXVhdGlvbiB1c2VkIGZvciBibG9jay1sZXZlbCwg
bm9uLXJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93LgorICAgIC8vCisgICAgLy8gNC4g
T3RoZXJ3aXNlLCBpZiAnd2lkdGgnIGhhcyBhIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJywgYW5k
IHRoZSBlbGVtZW50IGhhcyBhbiBpbnRyaW5zaWMgd2lkdGgsIHRoZW4gdGhhdCBpbnRyaW5zaWMg
d2lkdGggaXMgdGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJy4KKyAgICAvLworICAgIC8vIDUuIE90
aGVyd2lzZSwgaWYgJ3dpZHRoJyBoYXMgYSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycsIGJ1dCBu
b25lIG9mIHRoZSBjb25kaXRpb25zIGFib3ZlIGFyZSBtZXQsIHRoZW4gdGhlIHVzZWQgdmFsdWUg
b2YgJ3dpZHRoJyBiZWNvbWVzIDMwMHB4LgorICAgIC8vICAgIElmIDMwMHB4IGlzIHRvbyB3aWRl
IHRvIGZpdCB0aGUgZGV2aWNlLCBVQXMgc2hvdWxkIHVzZSB0aGUgd2lkdGggb2YgdGhlIGxhcmdl
c3QgcmVjdGFuZ2xlIHRoYXQgaGFzIGEgMjoxIHJhdGlvIGFuZCBmaXRzIHRoZSBkZXZpY2UgaW5z
dGVhZC4KKworICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6OmNv
bXB1dGVkSG9yaXpvbnRhbE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
KTsKKworICAgIGF1dG8gdXNlZE1hcmdpblN0YXJ0ID0gWyZdIHsKKyAgICAgICAgaWYgKG92ZXJy
aWRkZW5Ib3Jpem9udGFsVmFsdWVzLm1hcmdpbikKKyAgICAgICAgICAgIHJldHVybiBvdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcy5tYXJnaW4tPnN0YXJ0OworICAgICAgICByZXR1cm4gY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMF9sdSk7CisgICAgfTsKKworICAgIGF1
dG8gdXNlZE1hcmdpbkVuZCA9IFsmXSB7CisgICAgICAgIGlmIChvdmVycmlkZGVuSG9yaXpvbnRh
bFZhbHVlcy5tYXJnaW4pCisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGRlbkhvcml6b250YWxW
YWx1ZXMubWFyZ2luLT5lbmQ7CisgICAgICAgIHJldHVybiBjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uZW5kLnZhbHVlT3IoMF9sdSk7CisgICAgfTsKKworICAgIGF1dG8gd2lkdGggPSBvdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0aCA/IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndp
ZHRoIDogY29tcHV0ZWRXaWR0aChyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxv
Z2ljYWxXaWR0aCk7CisgICAgYXV0byBoZWlnaHRJc0F1dG8gPSBpc0hlaWdodEF1dG8ocmVwbGFj
ZWRCb3gpOworICAgIGF1dG8gaGVpZ2h0ID0gY29tcHV0ZWRIZWlnaHQocmVwbGFjZWRCb3gsIHZl
cnRpY2FsQ29uc3RyYWludHMgPyB2ZXJ0aWNhbENvbnN0cmFpbnRzLT5sb2dpY2FsSGVpZ2h0IDog
V1RGOjpudWxsb3B0KTsKKworICAgIGlmICghd2lkdGggJiYgaGVpZ2h0SXNBdXRvICYmIHJlcGxh
Y2VkQm94Lmhhc0ludHJpbnNpY1dpZHRoKCkpIHsKKyAgICAgICAgLy8gIzEKKyAgICAgICAgd2lk
dGggPSByZXBsYWNlZEJveC5pbnRyaW5zaWNXaWR0aCgpOworICAgIH0gZWxzZSBpZiAoKCF3aWR0
aCAmJiBoZWlnaHRJc0F1dG8gJiYgIXJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1dpZHRoKCkgJiYg
cmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkgJiYgcmVwbGFjZWRCb3guaGFzSW50cmlu
c2ljUmF0aW8oKSkKKyAgICAgICAgfHwgKCF3aWR0aCAmJiBoZWlnaHQgJiYgcmVwbGFjZWRCb3gu
aGFzSW50cmluc2ljUmF0aW8oKSkpIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAgd2lkdGggPSBo
ZWlnaHQudmFsdWVPcihyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNIZWlnaHQoKSkgKiByZXBsYWNl
ZEJveC5pbnRyaW5zaWNSYXRpbygpOworICAgIH0gZWxzZSBpZiAoIXdpZHRoICYmIGhlaWdodElz
QXV0byAmJiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNSYXRpbygpICYmICFyZXBsYWNlZEJveC5o
YXNJbnRyaW5zaWNXaWR0aCgpICYmICFyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNIZWlnaHQoKSkg
eworICAgICAgICAvLyAjMworICAgICAgICAvLyBGSVhNRTogdW5kZWZpbmVkIGJ1dCBzdXJlbHkg
ZG9hYmxlLgorICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOworICAgIH0gZWxz
ZSBpZiAoIXdpZHRoICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1dpZHRoKCkpIHsKKyAgICAg
ICAgLy8gIzQKKyAgICAgICAgd2lkdGggPSByZXBsYWNlZEJveC5pbnRyaW5zaWNXaWR0aCgpOwor
ICAgIH0gZWxzZSBpZiAoIXdpZHRoKSB7CisgICAgICAgIC8vICM1CisgICAgICAgIHdpZHRoID0g
eyAzMDAgfTsKKyAgICB9CisKKyAgICBBU1NFUlQod2lkdGgpOworCisgICAgTE9HX1dJVEhfU1RS
RUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltXaWR0aF1bTWFyZ2luXSAt
PiBpbmZsb3cgcmVwbGFjZWQgLT4gd2lkdGgoIiA8PCAqd2lkdGggPDwgInB4KSBtYXJnaW4oIiA8
PCB1c2VkTWFyZ2luU3RhcnQoKSA8PCAicHgsICIgPDwgdXNlZE1hcmdpbkVuZCgpIDw8ICJweCkg
LT4gbGF5b3V0Qm94KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIpIik7CisgICAgcmV0dXJuIHsgKndp
ZHRoLCB7IHVzZWRNYXJnaW5TdGFydCgpLCB1c2VkTWFyZ2luRW5kKCkgfSB9OworfQorCitMYXlv
dXRTaXplIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93UG9zaXRpb25lZFBvc2l0
aW9uT2Zmc2V0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmIGhvcml6b250YWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94
LmlzSW5GbG93UG9zaXRpb25lZCgpKTsKKworICAgIC8vIDkuNC4zIFJlbGF0aXZlIHBvc2l0aW9u
aW5nCisgICAgLy8KKyAgICAvLyBUaGUgJ3RvcCcgYW5kICdib3R0b20nIHByb3BlcnRpZXMgbW92
ZSByZWxhdGl2ZWx5IHBvc2l0aW9uZWQgZWxlbWVudChzKSB1cCBvciBkb3duIHdpdGhvdXQgY2hh
bmdpbmcgdGhlaXIgc2l6ZS4KKyAgICAvLyBUb3AnIG1vdmVzIHRoZSBib3hlcyBkb3duLCBhbmQg
J2JvdHRvbScgbW92ZXMgdGhlbSB1cC4gU2luY2UgYm94ZXMgYXJlIG5vdCBzcGxpdCBvciBzdHJl
dGNoZWQgYXMgYSByZXN1bHQgb2YgJ3RvcCcgb3IgJ2JvdHRvbScsIHRoZSB1c2VkIHZhbHVlcyBh
cmUgYWx3YXlzOiB0b3AgPSAtYm90dG9tLgorICAgIC8vCisgICAgLy8gMS4gSWYgYm90aCBhcmUg
J2F1dG8nLCB0aGVpciB1c2VkIHZhbHVlcyBhcmUgYm90aCAnMCcuCisgICAgLy8gMi4gSWYgb25l
IG9mIHRoZW0gaXMgJ2F1dG8nLCBpdCBiZWNvbWVzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb3RoZXIu
CisgICAgLy8gMy4gSWYgbmVpdGhlciBpcyAnYXV0bycsICdib3R0b20nIGlzIGlnbm9yZWQgKGku
ZS4sIHRoZSB1c2VkIHZhbHVlIG9mICdib3R0b20nIHdpbGwgYmUgbWludXMgdGhlIHZhbHVlIG9m
ICd0b3AnKS4KKworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgYXV0
byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lk
dGg7CisKKyAgICBhdXRvIHRvcCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbFRvcCgpLCBj
b250YWluaW5nQmxvY2tXaWR0aCk7CisgICAgYXV0byBib3R0b20gPSBjb21wdXRlZFZhbHVlKHN0
eWxlLmxvZ2ljYWxCb3R0b20oKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworCisgICAgaWYgKCF0
b3AgJiYgIWJvdHRvbSkgeworICAgICAgICAvLyAjMQorICAgICAgICB0b3AgPSBib3R0b20gPSB7
IDAgfTsKKyAgICB9IGVsc2UgaWYgKCF0b3ApIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAgdG9w
ID0gLSpib3R0b207CisgICAgfSBlbHNlIGlmICghYm90dG9tKSB7CisgICAgICAgIC8vICMzCisg
ICAgICAgIGJvdHRvbSA9IC0qdG9wOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vICM0CisgICAg
ICAgIGJvdHRvbSA9IFdURjo6bnVsbG9wdDsKKyAgICB9CisKKyAgICAvLyBGb3IgcmVsYXRpdmVs
eSBwb3NpdGlvbmVkIGVsZW1lbnRzLCAnbGVmdCcgYW5kICdyaWdodCcgbW92ZSB0aGUgYm94KGVz
KSBob3Jpem9udGFsbHksIHdpdGhvdXQgY2hhbmdpbmcgdGhlaXIgc2l6ZS4KKyAgICAvLyAnTGVm
dCcgbW92ZXMgdGhlIGJveGVzIHRvIHRoZSByaWdodCwgYW5kICdyaWdodCcgbW92ZXMgdGhlbSB0
byB0aGUgbGVmdC4KKyAgICAvLyBTaW5jZSBib3hlcyBhcmUgbm90IHNwbGl0IG9yIHN0cmV0Y2hl
ZCBhcyBhIHJlc3VsdCBvZiAnbGVmdCcgb3IgJ3JpZ2h0JywgdGhlIHVzZWQgdmFsdWVzIGFyZSBh
bHdheXM6IGxlZnQgPSAtcmlnaHQuCisgICAgLy8KKyAgICAvLyAxLiBJZiBib3RoICdsZWZ0JyBh
bmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nICh0aGVpciBpbml0aWFsIHZhbHVlcyksIHRoZSB1c2VkIHZh
bHVlcyBhcmUgJzAnIChpLmUuLCB0aGUgYm94ZXMgc3RheSBpbiB0aGVpciBvcmlnaW5hbCBwb3Np
dGlvbikuCisgICAgLy8gMi4gSWYgJ2xlZnQnIGlzICdhdXRvJywgaXRzIHVzZWQgdmFsdWUgaXMg
bWludXMgdGhlIHZhbHVlIG9mICdyaWdodCcgKGkuZS4sIHRoZSBib3hlcyBtb3ZlIHRvIHRoZSBs
ZWZ0IGJ5IHRoZSB2YWx1ZSBvZiAncmlnaHQnKS4KKyAgICAvLyAzLiBJZiAncmlnaHQnIGlzIHNw
ZWNpZmllZCBhcyAnYXV0bycsIGl0cyB1c2VkIHZhbHVlIGlzIG1pbnVzIHRoZSB2YWx1ZSBvZiAn
bGVmdCcuCisgICAgLy8gNC4gSWYgbmVpdGhlciAnbGVmdCcgbm9yICdyaWdodCcgaXMgJ2F1dG8n
LCB0aGUgcG9zaXRpb24gaXMgb3Zlci1jb25zdHJhaW5lZCwgYW5kIG9uZSBvZiB0aGVtIGhhcyB0
byBiZSBpZ25vcmVkLgorICAgIC8vICAgIElmIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0
aGUgY29udGFpbmluZyBibG9jayBpcyAnbHRyJywgdGhlIHZhbHVlIG9mICdsZWZ0JyB3aW5zIGFu
ZCAncmlnaHQnIGJlY29tZXMgLSdsZWZ0Jy4KKyAgICAvLyAgICBJZiAnZGlyZWN0aW9uJyBvZiB0
aGUgY29udGFpbmluZyBibG9jayBpcyAncnRsJywgJ3JpZ2h0JyB3aW5zIGFuZCAnbGVmdCcgaXMg
aWdub3JlZC4KKworICAgIGF1dG8gbGVmdCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbExl
ZnQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworICAgIGF1dG8gcmlnaHQgPSBjb21wdXRlZFZh
bHVlKHN0eWxlLmxvZ2ljYWxSaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisKKyAgICBp
ZiAoIWxlZnQgJiYgIXJpZ2h0KSB7CisgICAgICAgIC8vICMxCisgICAgICAgIGxlZnQgPSByaWdo
dCA9IHsgMCB9OworICAgIH0gZWxzZSBpZiAoIWxlZnQpIHsKKyAgICAgICAgLy8gIzIKKyAgICAg
ICAgbGVmdCA9IC0qcmlnaHQ7CisgICAgfSBlbHNlIGlmICghcmlnaHQpIHsKKyAgICAgICAgLy8g
IzMKKyAgICAgICAgcmlnaHQgPSAtKmxlZnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gIzQK
KyAgICAgICAgYXV0byBpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uID0gbGF5b3V0Qm94LmNvbnRhaW5p
bmdCbG9jaygpLnN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOworICAgICAgICBpZiAo
aXNMZWZ0VG9SaWdodERpcmVjdGlvbikKKyAgICAgICAgICAgIHJpZ2h0ID0gLSpsZWZ0OworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBsZWZ0ID0gV1RGOjpudWxsb3B0OworICAgIH0KKworICAg
IEFTU0VSVCghYm90dG9tIHx8ICp0b3AgPT0gLSpib3R0b20pOworICAgIEFTU0VSVCghbGVmdCB8
fCAqbGVmdCA9PSAtKnJpZ2h0KTsKKworICAgIGF1dG8gdG9wUG9zaXRpb25PZmZzZXQgPSAqdG9w
OworICAgIGF1dG8gbGVmdFBvc2l0aW9uT2Zmc2V0ID0gbGVmdC52YWx1ZU9yKC0qcmlnaHQpOwor
CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwg
IltQb3NpdGlvbl0gLT4gcG9zaXRpb25lZCBpbmZsb3cgLT4gdG9wIG9mZnNldCgiIDw8IHRvcFBv
c2l0aW9uT2Zmc2V0IDw8ICJweCkgbGVmdCBvZmZzZXQoIiA8PCBsZWZ0UG9zaXRpb25PZmZzZXQg
PDwgInB4KSBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7CisgICAgcmV0dXJuIHsg
bGVmdFBvc2l0aW9uT2Zmc2V0LCB0b3BQb3NpdGlvbk9mZnNldCB9OworfQorCitpbmxpbmUgc3Rh
dGljIFdyaXRpbmdNb2RlIHVzZWRXcml0aW5nTW9kZShjb25zdCBCb3gmIGxheW91dEJveCkKK3sK
KyAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXdyaXRpbmctbW9kZXMtNC8jbG9naWNh
bC1kaXJlY3Rpb24tbGF5b3V0CisgICAgLy8gRmxvdy1yZWxhdGl2ZSBkaXJlY3Rpb25zIGFyZSBj
YWxjdWxhdGVkIHdpdGggcmVzcGVjdCB0byB0aGUgd3JpdGluZyBtb2RlIG9mIHRoZSBjb250YWlu
aW5nIGJsb2NrIG9mIHRoZSBib3guCisgICAgLy8gRm9yIGlubGluZS1sZXZlbCBib3hlcywgdGhl
IHdyaXRpbmcgbW9kZSBvZiB0aGUgcGFyZW50IGJveCBpcyB1c2VkIGluc3RlYWQuCisgICAgcmV0
dXJuIGxheW91dEJveC5pc0lubGluZUxldmVsQm94KCkgPyBsYXlvdXRCb3gucGFyZW50KCkuc3R5
bGUoKS53cml0aW5nTW9kZSgpIDogbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCku
d3JpdGluZ01vZGUoKTsKK30KKworRWRnZXMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpj
b21wdXRlZEJvcmRlcihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBhdXRvJiBz
dHlsZSA9IGxheW91dEJveC5zdHlsZSgpOworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5n
Q29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbQm9yZGVyXSAtPiBsYXlvdXRCb3g6ICIgPDwgJmxh
eW91dEJveCk7CisgICAgcmV0dXJuIHsKKyAgICAgICAgeyBMYXlvdXRVbml0KHN0eWxlLmJvcmRl
ckxlZnRXaWR0aCgpKSwgTGF5b3V0VW5pdChzdHlsZS5ib3JkZXJSaWdodFdpZHRoKCkpIH0sCisg
ICAgICAgIHsgTGF5b3V0VW5pdChzdHlsZS5ib3JkZXJUb3BXaWR0aCgpKSwgTGF5b3V0VW5pdChz
dHlsZS5ib3JkZXJCb3R0b21XaWR0aCgpKSB9CisgICAgfTsKK30KKworT3B0aW9uYWw8RWRnZXM+
IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRQYWRkaW5nKGNvbnN0IEJveCYg
bGF5b3V0Qm94LCBjb25zdCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSBjb25zdAor
eworICAgIGlmICghbGF5b3V0Qm94LmlzUGFkZGluZ0FwcGxpY2FibGUoKSkKKyAgICAgICAgcmV0
dXJuIFdURjo6bnVsbG9wdDsKKworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7
CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwg
IltQYWRkaW5nXSAtPiBsYXlvdXRCb3g6ICIgPDwgJmxheW91dEJveCk7CisgICAgcmV0dXJuIEVk
Z2VzIHsKKyAgICAgICAgeyB2YWx1ZUZvckxlbmd0aChzdHlsZS5wYWRkaW5nTGVmdCgpLCBjb250
YWluaW5nQmxvY2tXaWR0aCksIHZhbHVlRm9yTGVuZ3RoKHN0eWxlLnBhZGRpbmdSaWdodCgpLCBj
b250YWluaW5nQmxvY2tXaWR0aCkgfSwKKyAgICAgICAgeyB2YWx1ZUZvckxlbmd0aChzdHlsZS5w
YWRkaW5nVG9wKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgdmFsdWVGb3JMZW5ndGgoc3R5bGUu
cGFkZGluZ0JvdHRvbSgpLCBjb250YWluaW5nQmxvY2tXaWR0aCkgfQorICAgIH07Cit9CisKK0Nv
bXB1dGVkSG9yaXpvbnRhbE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1
dGVkSG9yaXpvbnRhbE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIGNvbnN0Cit7CisgICAgYXV0byYg
c3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRo
ID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKKyAgICBpZiAoaXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUodXNlZFdyaXRpbmdNb2RlKGxheW91dEJveCkpKQorICAgICAgICByZXR1
cm4geyBjb21wdXRlZFZhbHVlKHN0eWxlLm1hcmdpbkxlZnQoKSwgY29udGFpbmluZ0Jsb2NrV2lk
dGgpLCBjb21wdXRlZFZhbHVlKHN0eWxlLm1hcmdpblJpZ2h0KCksIGNvbnRhaW5pbmdCbG9ja1dp
ZHRoKSB9OworICAgIHJldHVybiB7IGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luVG9wKCksIGNv
bnRhaW5pbmdCbG9ja1dpZHRoKSwgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5Cb3R0b20oKSwg
Y29udGFpbmluZ0Jsb2NrV2lkdGgpIH07Cit9CisKK0NvbXB1dGVkVmVydGljYWxNYXJnaW4gRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKGNvbnN0IEJv
eCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25z
dHJhaW50cykgY29uc3QKK3sKKyAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwor
ICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9n
aWNhbFdpZHRoOworICAgIGlmIChpc0hvcml6b250YWxXcml0aW5nTW9kZSh1c2VkV3JpdGluZ01v
ZGUobGF5b3V0Qm94KSkpCisgICAgICAgIHJldHVybiB7IGNvbXB1dGVkVmFsdWUoc3R5bGUubWFy
Z2luVG9wKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJn
aW5Cb3R0b20oKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpIH07CisgICAgcmV0dXJuIHsgY29tcHV0
ZWRWYWx1ZShzdHlsZS5tYXJnaW5MZWZ0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgY29tcHV0
ZWRWYWx1ZShzdHlsZS5tYXJnaW5SaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCkgfTsKK30K
KworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5Ojpjb25zdHJhaW5CeU1pbk1heFdpZHRoKGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGludHJpbnNpY1dpZHRoKSBjb25zdAor
eworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgYXV0byBtaW5XaWR0
aCA9IGZpeGVkVmFsdWUoc3R5bGUubG9naWNhbE1pbldpZHRoKCkpOworICAgIGF1dG8gbWF4V2lk
dGggPSBmaXhlZFZhbHVlKHN0eWxlLmxvZ2ljYWxNYXhXaWR0aCgpKTsKKyAgICBpZiAoIW1pbldp
ZHRoICYmICFtYXhXaWR0aCkKKyAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoOworCisgICAg
aWYgKG1heFdpZHRoKSB7CisgICAgICAgIGludHJpbnNpY1dpZHRoLm1pbmltdW0gPSBzdGQ6Om1p
bigqbWF4V2lkdGgsIGludHJpbnNpY1dpZHRoLm1pbmltdW0pOworICAgICAgICBpbnRyaW5zaWNX
aWR0aC5tYXhpbXVtID0gc3RkOjptaW4oKm1heFdpZHRoLCBpbnRyaW5zaWNXaWR0aC5tYXhpbXVt
KTsKKyAgICB9CisKKyAgICBpZiAobWluV2lkdGgpIHsKKyAgICAgICAgaW50cmluc2ljV2lkdGgu
bWluaW11bSA9IHN0ZDo6bWF4KCptaW5XaWR0aCwgaW50cmluc2ljV2lkdGgubWluaW11bSk7Cisg
ICAgICAgIGludHJpbnNpY1dpZHRoLm1heGltdW0gPSBzdGQ6Om1heCgqbWluV2lkdGgsIGludHJp
bnNpY1dpZHRoLm1heGltdW0pOworICAgIH0KKworICAgIEFTU0VSVChpbnRyaW5zaWNXaWR0aC5t
aW5pbXVtIDw9IGludHJpbnNpY1dpZHRoLm1heGltdW0pOworICAgIHJldHVybiBpbnRyaW5zaWNX
aWR0aDsKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkNvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29u
dGVudCBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbnN0cmFpbnRzRm9yT3V0T2ZGbG93
Q29udGVudChjb25zdCBDb250YWluZXJCb3gmIGNvbnRhaW5lckJveCkKK3sKKyAgICBhdXRvJiBi
b3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goY29udGFpbmVy
Qm94KTsKKyAgICByZXR1cm4geworICAgICAgICB7IGJveEdlb21ldHJ5LnBhZGRpbmdCb3hMZWZ0
KCksIGJveEdlb21ldHJ5LnBhZGRpbmdCb3hXaWR0aCgpIH0sCisgICAgICAgIHsgYm94R2VvbWV0
cnkucGFkZGluZ0JveFRvcCgpLCBib3hHZW9tZXRyeS5wYWRkaW5nQm94SGVpZ2h0KCkgfSwKKyAg
ICAgICAgYm94R2VvbWV0cnkuY29udGVudEJveFdpZHRoKCkgfTsKK30KKworRm9ybWF0dGluZ0Nv
bnRleHQ6OkNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnk6OmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb25zdCBDb250YWluZXJCb3gmIGNv
bnRhaW5lckJveCwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiBlc2NhcGVSZWFzb24pCit7CisgICAg
YXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGNv
bnRhaW5lckJveCwgZXNjYXBlUmVhc29uKTsKKyAgICByZXR1cm4geyB7IGJveEdlb21ldHJ5LmNv
bnRlbnRCb3hMZWZ0KCksIGJveEdlb21ldHJ5LmNvbnRlbnRCb3hXaWR0aCgpIH0sIHsgYm94R2Vv
bWV0cnkuY29udGVudEJveFRvcCgpLCBjb21wdXRlZEhlaWdodChjb250YWluZXJCb3gpIH0gfTsK
K30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjgyMTFiMGRjNjMwY2EyMzk3YmFiMzg0Zjk4MDgzMDMxOTFmMmJkMGEKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisg
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisK
KyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkxheW91
dEJveC5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVkZSAiTGF5b3V0
SW5pdGlhbENvbnRhaW5pbmdCbG9jay5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3Bh
Y2UgTGF5b3V0IHsKKworTGF5b3V0VW5pdCBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpoZWln
aHRWYWx1ZU9mTmVhcmVzdENvbnRhaW5pbmdCbG9ja1dpdGhGaXhlZEhlaWdodChjb25zdCBCb3gm
IGxheW91dEJveCkKK3sKKyAgICAvLyBJbiBxdWlya3MgbW9kZSwgd2UgZ28gYW5kIHRyYXZlcnMg
dGhlIGNvbnRhaW5pbmcgYmxvY2sgY2hhaW4gdG8gZmluZCBhIGJsb2NrIGxldmVsIGJveCB3aXRo
IGZpeGVkIGhlaWdodCB2YWx1ZSwgZXZlbiBpZiBpdCBtZWFucyBsZWF2aW5nCisgICAgLy8gdGhl
IGN1cnJlbnQgZm9ybWF0dGluZyBjb250ZXh0LiBGSVhNRTogc3VyZWx5IHdlIG5lZWQgdG8gZG8g
c29tZSB0cmlja3MgaGVyZSB3aGVuIGJsb2NrIGRpcmVjdGlvbiBzdXBwb3J0IGlzIGFkZGVkLgor
ICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9ybWF0dGluZ0NvbnRleHQoKTsK
KyAgICBhdXRvKiBjb250YWluaW5nQmxvY2sgPSAmbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygp
OworICAgIExheW91dFVuaXQgYm9keUFuZERvY3VtZW50VmVydGljYWxNYXJnaW5QYWRkaW5nQW5k
Qm9yZGVyOworICAgIHdoaWxlIChjb250YWluaW5nQmxvY2spIHsKKyAgICAgICAgYXV0byBjb250
YWluaW5nQmxvY2tIZWlnaHQgPSBjb250YWluaW5nQmxvY2stPnN0eWxlKCkubG9naWNhbEhlaWdo
dCgpOworICAgICAgICBpZiAoY29udGFpbmluZ0Jsb2NrSGVpZ2h0LmlzRml4ZWQoKSkKKyAgICAg
ICAgICAgIHJldHVybiBMYXlvdXRVbml0KGNvbnRhaW5pbmdCbG9ja0hlaWdodC52YWx1ZSgpIC0g
Ym9keUFuZERvY3VtZW50VmVydGljYWxNYXJnaW5QYWRkaW5nQW5kQm9yZGVyKTsKKworICAgICAg
ICAvLyBJZiB0aGUgb25seSBmaXhlZCB2YWx1ZSBib3ggd2UgZmluZCBpcyB0aGUgSUNCLCB0aGVu
IGlnbm9yZSB0aGUgYm9keSBhbmQgdGhlIGRvY3VtZW50ICh2ZXJ0aWNhbCkgbWFyZ2luLCBwYWRk
aW5nIGFuZCBib3JkZXIuIFNvIG11Y2ggcXVpcmtpbmVzcy4KKyAgICAgICAgLy8gLWFuZCBpdCdz
IHRvdGFsbHkgaW5zYW5lIGJlY2F1c2Ugbm93IHdlIGZyZWVseSB0cmF2ZWwgYWNyb3NzIGZvcm1h
dHRpbmcgY29udGV4dCBib3VuZGFyaWVzIGFuZCBjb21wdXRlZCBtYXJnaW5zIGFyZSBub25leGlz
dGVudC4KKyAgICAgICAgaWYgKGNvbnRhaW5pbmdCbG9jay0+aXNCb2R5Qm94KCkgfHwgY29udGFp
bmluZ0Jsb2NrLT5pc0RvY3VtZW50Qm94KCkpIHsKKworICAgICAgICAgICAgYXV0byBnZW9tZXRy
eSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5KCk7CisgICAgICAgICAgICBhdXRvIGhvcml6
b250YWxDb25zdHJhaW50cyA9IGdlb21ldHJ5LmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChj
b250YWluaW5nQmxvY2stPmNvbnRhaW5pbmdCbG9jaygpLCBGb3JtYXR0aW5nQ29udGV4dDo6RXNj
YXBlUmVhc29uOjpGaW5kRml4ZWRIZWlnaHRBbmNlc3RvclF1aXJrKS5ob3Jpem9udGFsOworICAg
ICAgICAgICAgYXV0byB2ZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkVmVydGljYWxN
YXJnaW4oKmNvbnRhaW5pbmdCbG9jaywgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKworICAgICAg
ICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJv
eCgqY29udGFpbmluZ0Jsb2NrLCBGb3JtYXR0aW5nQ29udGV4dDo6RXNjYXBlUmVhc29uOjpGaW5k
Rml4ZWRIZWlnaHRBbmNlc3RvclF1aXJrKTsKKyAgICAgICAgICAgIGF1dG8gdmVydGljYWxQYWRk
aW5nID0gYm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCkgKyBib3hHZW9tZXRyeS5w
YWRkaW5nQm90dG9tKCkudmFsdWVPcigwKTsKKyAgICAgICAgICAgIGF1dG8gdmVydGljYWxCb3Jk
ZXIgPSBib3hHZW9tZXRyeS5ib3JkZXJUb3AoKSArIGJveEdlb21ldHJ5LmJvcmRlckJvdHRvbSgp
OworICAgICAgICAgICAgYm9keUFuZERvY3VtZW50VmVydGljYWxNYXJnaW5QYWRkaW5nQW5kQm9y
ZGVyICs9IHZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApICsgdmVydGljYWxNYXJnaW4u
YWZ0ZXIudmFsdWVPcigwKSArIHZlcnRpY2FsUGFkZGluZyArIHZlcnRpY2FsQm9yZGVyOworICAg
ICAgICB9CisKKyAgICAgICAgaWYgKGlzPEluaXRpYWxDb250YWluaW5nQmxvY2s+KCpjb250YWlu
aW5nQmxvY2spKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNvbnRhaW5pbmdCbG9jayA9
ICZjb250YWluaW5nQmxvY2stPmNvbnRhaW5pbmdCbG9jaygpOworICAgIH0KKyAgICAvLyBJbml0
aWFsIGNvbnRhaW5pbmcgYmxvY2sgaGFzIHRvIGhhdmUgYSBoZWlnaHQuCisgICAgcmV0dXJuIGZv
cm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveC5pbml0aWFsQ29udGFpbmlu
Z0Jsb2NrKCksIEZvcm1hdHRpbmdDb250ZXh0OjpFc2NhcGVSZWFzb246OkZpbmRGaXhlZEhlaWdo
dEFuY2VzdG9yUXVpcmspLmNvbnRlbnRCb3goKS5oZWlnaHQoKSAtIGJvZHlBbmREb2N1bWVudFZl
cnRpY2FsTWFyZ2luUGFkZGluZ0FuZEJvcmRlcjsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3Jt
YXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4
dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uMGY1NTVmODE5MzgxZTczYWYzZTE5YzAyZjM4YjBmY2YzYmQxMjA0
YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCkBAIC0wLDAg
KzEsNTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4K
KyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJs
b2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19D
T05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJG
bG9hdGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJGbG9hdGluZ1N0YXRlLmgiCisjaW5jbHVkZSAi
SW52YWxpZGF0aW9uU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJM
YXlvdXRDaGlsZEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCisj
aW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgorI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWlu
aW5nQmxvY2suaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUgIkxvZ2dpbmcu
aCIKKyNpbmNsdWRlICJUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5j
bHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9UZXh0U3Ry
ZWFtLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZf
TUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCk7CisKK0Jsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQ6OkJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVy
Qm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0
aW5nU3RhdGUpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3Qs
IGZvcm1hdHRpbmdTdGF0ZSkKK3sKK30KKwordm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojps
YXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiBpbnZhbGlkYXRpb25TdGF0ZSwg
Y29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKK3sKKyAgICAv
LyA5LjQuMSBCbG9jayBmb3JtYXR0aW5nIGNvbnRleHRzCisgICAgLy8gSW4gYSBibG9jayBmb3Jt
YXR0aW5nIGNvbnRleHQsIGJveGVzIGFyZSBsYWlkIG91dCBvbmUgYWZ0ZXIgdGhlIG90aGVyLCB2
ZXJ0aWNhbGx5LCBiZWdpbm5pbmcgYXQgdGhlIHRvcCBvZiBhIGNvbnRhaW5pbmcgYmxvY2suCisg
ICAgLy8gVGhlIHZlcnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNpYmxpbmcgYm94ZXMgaXMg
ZGV0ZXJtaW5lZCBieSB0aGUgJ21hcmdpbicgcHJvcGVydGllcy4KKyAgICAvLyBWZXJ0aWNhbCBt
YXJnaW5zIGJldHdlZW4gYWRqYWNlbnQgYmxvY2stbGV2ZWwgYm94ZXMgaW4gYSBibG9jayBmb3Jt
YXR0aW5nIGNvbnRleHQgY29sbGFwc2UuCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdD
b250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltTdGFydF0gLT4gYmxvY2sgZm9ybWF0dGluZyBjb250
ZXh0IC0+IGZvcm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKKyAgICBhdXRvJiBm
b3JtYXR0aW5nUm9vdCA9IHJvb3QoKTsKKyAgICBBU1NFUlQoZm9ybWF0dGluZ1Jvb3QuaGFzSW5G
bG93T3JGbG9hdGluZ0NoaWxkKCkpOworICAgIGF1dG8mIGZsb2F0aW5nU3RhdGUgPSBmb3JtYXR0
aW5nU3RhdGUoKS5mbG9hdGluZ1N0YXRlKCk7CisgICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBG
bG9hdGluZ0NvbnRleHQgeyAqdGhpcywgZmxvYXRpbmdTdGF0ZSB9OworCisgICAgTGF5b3V0UXVl
dWUgbGF5b3V0UXVldWU7CisgICAgZW51bSBjbGFzcyBMYXlvdXREaXJlY3Rpb24geyBDaGlsZCwg
U2libGluZyB9OworICAgIGF1dG8gYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUgPSBbJl0gKGNvbnN0
IGF1dG8mIGxheW91dEJveCwgYXV0byBkaXJlY3Rpb24pIHsKKyAgICAgICAgaWYgKGRpcmVjdGlv
biA9PSBMYXlvdXREaXJlY3Rpb246OkNoaWxkKSB7CisgICAgICAgICAgICBpZiAoIWlzPENvbnRh
aW5lckJveD4obGF5b3V0Qm94KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICBmb3IgKGF1dG8qIGNoaWxkID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRC
b3gpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5u
ZXh0SW5GbG93T3JGbG9hdGluZ1NpYmxpbmcoKSkgeworICAgICAgICAgICAgICAgIGlmICghaW52
YWxpZGF0aW9uU3RhdGUubmVlZHNMYXlvdXQoKmNoaWxkKSkKKyAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICAgICAgbGF5b3V0UXVldWUuYXBwZW5kKGNoaWxkKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gTGF5b3V0
RGlyZWN0aW9uOjpTaWJsaW5nKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8qIG5leHRTaWJsaW5n
ID0gbGF5b3V0Qm94Lm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpOyBuZXh0U2libGluZzsg
bmV4dFNpYmxpbmcgPSBuZXh0U2libGluZy0+bmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkp
IHsKKyAgICAgICAgICAgICAgICBpZiAoIWludmFsaWRhdGlvblN0YXRlLm5lZWRzTGF5b3V0KCpu
ZXh0U2libGluZykpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
ICAgIGxheW91dFF1ZXVlLmFwcGVuZChuZXh0U2libGluZyk7CisgICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9OworCisgICAgYXV0byBjb25zdHJhaW50c0ZvckxheW91dEJveCA9IFsmXSAoY29u
c3QgYXV0byYgbGF5b3V0Qm94KSB7CisgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxh
eW91dEJveC5jb250YWluaW5nQmxvY2soKTsKKyAgICAgICAgcmV0dXJuICZjb250YWluaW5nQmxv
Y2sgPT0gJmZvcm1hdHRpbmdSb290ID8gY29uc3RyYWludHMgOiBnZW9tZXRyeSgpLmNvbnN0cmFp
bnRzRm9ySW5GbG93Q29udGVudChjb250YWluaW5nQmxvY2spOworICAgIH07CisKKyAgICAvLyBU
aGlzIGlzIGEgcG9zdC1vcmRlciB0cmVlIHRyYXZlcnNhbCBsYXlvdXQuCisgICAgLy8gVGhlIHJv
b3QgY29udGFpbmVyIGxheW91dCBpcyBkb25lIGluIHRoZSBmb3JtYXR0aW5nIGNvbnRleHQgaXQg
bGl2ZXMgaW4sIG5vdCB0aGF0IG9uZSBpdCBjcmVhdGVzLCBzbyBsZXQncyBzdGFydCB3aXRoIHRo
ZSBmaXJzdCBjaGlsZC4KKyAgICBhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShmb3JtYXR0aW5nUm9v
dCwgTGF5b3V0RGlyZWN0aW9uOjpDaGlsZCk7CisgICAgLy8gMS4gR28gYWxsIHRoZSB3YXkgZG93
biB0byB0aGUgbGVhZiBub2RlCisgICAgLy8gMi4gQ29tcHV0ZSBzdGF0aWMgcG9zaXRpb24gYW5k
IHdpZHRoIGFzIHdlIHRyYXZlcnNlIGRvd24KKyAgICAvLyAzLiBBcyB3ZSBjbGltYiBiYWNrIG9u
IHRoZSB0cmVlLCBjb21wdXRlIGhlaWdodCBhbmQgZmluaWFsaXplIHBvc2l0aW9uCisgICAgLy8g
KEFueSBzdWJ0cmVlcyB3aXRoIG5ldyBmb3JtYXR0aW5nIGNvbnRleHRzIG5lZWQgdG8gbGF5b3V0
IHN5bmNocm9ub3VzbHkpCisgICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgLy8gVHJhdmVyc2UgZG93biBvbiB0aGUgZGVzY2VuZGFudHMgYW5kIGNvbXB1dGUgd2lk
dGgvc3RhdGljIHBvc2l0aW9uIHVudGlsIHdlIGZpbmQgYSBsZWFmIG5vZGUuCisgICAgICAgIHdo
aWxlICh0cnVlKSB7CisgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSAqbGF5b3V0UXVldWUu
bGFzdCgpOworICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyA9IGNv
bnN0cmFpbnRzRm9yTGF5b3V0Qm94KGxheW91dEJveCk7CisKKyAgICAgICAgICAgIGNvbXB1dGVC
b3JkZXJBbmRQYWRkaW5nKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9y
aXpvbnRhbCk7CisgICAgICAgICAgICBjb21wdXRlU3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlv
dXRCb3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLnZlcnRpY2FsKTsKKyAgICAgICAgICAg
IGNvbXB1dGVXaWR0aEFuZE1hcmdpbihmbG9hdGluZ0NvbnRleHQsIGxheW91dEJveCwgeyBjb25z
dHJhaW50cywgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMgfSk7CisgICAgICAgICAgICBjb21w
dXRlU3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29u
c3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAgICAgICAgICBjb21wdXRlUG9zaXRpb25Ub0F2b2lk
RmxvYXRzKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCB7IGNvbnN0cmFpbnRzLCBjb250YWlu
aW5nQmxvY2tDb25zdHJhaW50cyB9KTsKKworICAgICAgICAgICAgaWYgKGxheW91dEJveC5lc3Rh
Ymxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXM8Q29u
dGFpbmVyQm94PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94
KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkgeworICAgICAgICAgICAgICAgICAgICBhdXRv
JiBjb250YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7CisgICAg
ICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJRkNzIGluaGVyaXQg
ZmxvYXRzIGZyb20gcGFyZW50IEZDcy4gV2UgbmVlZCBmaW5hbCB2ZXJ0aWNhbCBwb3NpdGlvbiB0
byBmaW5kIGludHJ1ZGluZyBmbG9hdHMuCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb21w
dXRlVmVydGljYWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhjb250YWluZXJCb3gsIHsgY29u
c3RyYWludHMsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzIH0pOworICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIExheW91dCB0aGUgaW5mbG93IGRlc2NlbmRh
bnRzIG9mIHRoaXMgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QuCisgICAgICAgICAgICAgICAgICAg
IGF1dG8gZm9ybWF0dGluZ0NvbnRleHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5n
Q29udGV4dChjb250YWluZXJCb3gsIGxheW91dFN0YXRlKCkpOworICAgICAgICAgICAgICAgICAg
ICBpZiAoY29udGFpbmVyQm94LmlzVGFibGVXcmFwcGVyQm94KCkpCisgICAgICAgICAgICAgICAg
ICAgICAgICBkb3duY2FzdDxUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0PigqZm9y
bWF0dGluZ0NvbnRleHQpLnNldEhvcml6b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxvYXRzKGNv
bnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAgICAgICAgICAg
ICBmb3JtYXR0aW5nQ29udGV4dC0+bGF5b3V0SW5GbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0
ZSwgZ2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgaWYgKCFhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShsYXlvdXRCb3gsIExh
eW91dERpcmVjdGlvbjo6Q2hpbGQpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisKKyAgICAgICAgLy8gQ2xpbWIgYmFjayBvbiB0aGUgYW5jZXN0b3JzIGFuZCBjb21wdXRlIGhl
aWdodC9maW5hbCBwb3NpdGlvbi4KKyAgICAgICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5
KCkpIHsKKyAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9ICpsYXlvdXRRdWV1ZS50YWtlTGFz
dCgpOworICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyA9IGNvbnN0
cmFpbnRzRm9yTGF5b3V0Qm94KGxheW91dEJveCk7CisKKyAgICAgICAgICAgIC8vIEFsbCBpbmZs
b3cgZGVzY2VuZGFudHMgKGlmIHRoZXJlIGFyZSBhbnkpIGFyZSBsYWlkIG91dCBieSBub3cuIExl
dCdzIGNvbXB1dGUgdGhlIGJveCdzIGhlaWdodCBhbmQgdmVydGljYWwgbWFyZ2luLgorICAgICAg
ICAgICAgY29tcHV0ZUhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja0Nv
bnN0cmFpbnRzKTsKKyAgICAgICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9u
ZWQoKSkKKyAgICAgICAgICAgICAgICBmbG9hdGluZ1N0YXRlLmFwcGVuZChmbG9hdGluZ0NvbnRl
eHQudG9GbG9hdEl0ZW0obGF5b3V0Qm94KSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAg
ICAgICAgICAvLyBBZGp1c3QgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG5vdyB0aGF0IHdlJ3ZlIGdv
dCBmaW5hbCBtYXJnaW4gdmFsdWVzIGZvciBub24tZmxvYXQgYXZvaWRlciBib3hlcy4KKyAgICAg
ICAgICAgICAgICAvLyBGbG9hdCBhdm9pZGVycyBoYXZlIHByZS1jb21wdXRlZCB2ZXJ0aWNhbCBw
b3NpdGlvbnMgd2hlbiBmbG9hdHMgYXJlIHByZXNlbnQuCisgICAgICAgICAgICAgICAgaWYgKCFs
YXlvdXRCb3guaXNGbG9hdEF2b2lkZXIoKSB8fCBmbG9hdGluZ0NvbnRleHQuaXNFbXB0eSgpKSB7
CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1h
dHRpbmdTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZv
cm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOworICAgICAgICAgICAgICAgICAg
ICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGxh
eW91dEJveCwgZm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpLCBj
b250YWluaW5nQmxvY2tDb25zdHJhaW50cy52ZXJ0aWNhbCkpOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29u
dGV4dCA9IGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCk7IAorICAgICAg
ICAgICAgaWYgKGVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQpIHsKKyAgICAgICAgICAgICAg
ICAvLyBOb3cgdGhhdCB3ZSBjb21wdXRlZCB0aGUgYm94J3MgaGVpZ2h0LCB3ZSBjYW4gbGF5b3V0
IHRoZSBvdXQtb2YtZmxvdyBkZXNjZW5kYW50cy4KKyAgICAgICAgICAgICAgICBpZiAoaXM8Q29u
dGFpbmVyQm94PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94
KS5oYXNDaGlsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5lckJveCA9
IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICAgICAg
TGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmVyQm94LCBsYXlv
dXRTdGF0ZSgpKS0+bGF5b3V0T3V0T2ZGbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2Vv
bWV0cnkoKS5jb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFlc3RhYmxp
c2hlc0Zvcm1hdHRpbmdDb250ZXh0ICYmIGlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkKKyAg
ICAgICAgICAgICAgICBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihkb3duY2FzdDxDb250
YWluZXJCb3g+KGxheW91dEJveCksIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmhvcml6b250
YWwpOworCisgICAgICAgICAgICBpZiAoYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUobGF5b3V0Qm94
LCBMYXlvdXREaXJlY3Rpb246OlNpYmxpbmcpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgfQorICAgIC8vIFBsYWNlIHRoZSBpbmZsb3cgcG9zaXRpb25lZCBjaGlsZHJl
bi4KKyAgICBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihmb3JtYXR0aW5nUm9vdCwgY29u
c3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250
ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltFbmRdIC0+IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCAt
PiBmb3JtYXR0aW5nIHJvb3QoIiA8PCAmcm9vdCgpIDw8ICIpIik7Cit9CisKK0xheW91dFVuaXQg
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdAoreworICAg
IC8vIDEwLjYuNyAnQXV0bycgaGVpZ2h0cyBmb3IgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHJv
b3RzCisKKyAgICAvLyBJZiBpdCBoYXMgYmxvY2stbGV2ZWwgY2hpbGRyZW4sIHRoZSBoZWlnaHQg
aXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHRvcCBtYXJnaW4tZWRnZSBvZiB0aGUgdG9wbW9z
dCBibG9jay1sZXZlbAorICAgIC8vIGNoaWxkIGJveCBhbmQgdGhlIGJvdHRvbSBtYXJnaW4tZWRn
ZSBvZiB0aGUgYm90dG9tbW9zdCBibG9jay1sZXZlbCBjaGlsZCBib3guCisKKyAgICAvLyBJbiBh
ZGRpdGlvbiwgaWYgdGhlIGVsZW1lbnQgaGFzIGFueSBmbG9hdGluZyBkZXNjZW5kYW50cyB3aG9z
ZSBib3R0b20gbWFyZ2luIGVkZ2UgaXMgYmVsb3cgdGhlIGVsZW1lbnQncyBib3R0b20gY29udGVu
dCBlZGdlLAorICAgIC8vIHRoZW4gdGhlIGhlaWdodCBpcyBpbmNyZWFzZWQgdG8gaW5jbHVkZSB0
aG9zZSBlZGdlcy4gT25seSBmbG9hdHMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiB0aGlzIGJsb2NrIGZv
cm1hdHRpbmcgY29udGV4dCBhcmUgdGFrZW4KKyAgICAvLyBpbnRvIGFjY291bnQsIGUuZy4sIGZs
b2F0cyBpbnNpZGUgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGRlc2NlbmRhbnRzIG9yIG90aGVyIGZs
b2F0cyBhcmUgbm90LgorICAgIGF1dG8gdG9wID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9Owor
ICAgIGF1dG8gYm90dG9tID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OworICAgIGlmIChyb290
KCkuaGFzSW5GbG93Q2hpbGQoKSkgeworICAgICAgICB0b3AgPSBCb3hHZW9tZXRyeTo6bWFyZ2lu
Qm94UmVjdChnZW9tZXRyeUZvckJveCgqcm9vdCgpLmZpcnN0SW5GbG93Q2hpbGQoKSkpLnRvcCgp
OworICAgICAgICBib3R0b20gPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9tZXRyeUZv
ckJveCgqcm9vdCgpLmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7CisgICAgfQorCisgICAg
YXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhpcywgZm9ybWF0dGlu
Z1N0YXRlKCkuZmxvYXRpbmdTdGF0ZSgpIH07CisgICAgaWYgKGF1dG8gZmxvYXRUb3AgPSBmbG9h
dGluZ0NvbnRleHQudG9wKCkpIHsKKyAgICAgICAgdG9wID0gc3RkOjptaW4oKmZsb2F0VG9wLCB0
b3AudmFsdWVPcigqZmxvYXRUb3ApKTsKKyAgICAgICAgYXV0byBmbG9hdEJvdHRvbSA9ICpmbG9h
dGluZ0NvbnRleHQuYm90dG9tKCk7CisgICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4KGZsb2F0Qm90
dG9tLCBib3R0b20udmFsdWVPcihmbG9hdEJvdHRvbSkpOworICAgIH0KKyAgICByZXR1cm4gKmJv
dHRvbSAtICp0b3A7Cit9CisKK09wdGlvbmFsPExheW91dFVuaXQ+IEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6OnVzZWRBdmFpbGFibGVXaWR0aEZvckZsb2F0QXZvaWRlcihjb25zdCBGbG9hdGluZ0Nv
bnRleHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0
cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQoreworICAgIC8vIE5vcm1hbGx5IHRoZSBhdmFp
bGFibGUgd2lkdGggZm9yIGFuIGluLWZsb3cgYmxvY2sgbGV2ZWwgYm94IGlzIHRoZSB3aWR0aCBv
ZiB0aGUgY29udGFpbmluZyBibG9jaydzIGNvbnRlbnQgYm94LgorICAgIC8vIEhvd2V2ZXIgKGFu
ZCBjYW4ndCBmaW5kIGl0IGFueXdoZXJlIGluIHRoZSBzcGVjKSBub24tZmxvYXRpbmcgcG9zaXRp
b25lZCBmbG9hdCBhdm9pZGVyIGJsb2NrIGxldmVsIGJveGVzIGFyZSBjb25zdHJhaW5lZCBieSBl
eGlzdGluZyBmbG9hdHMuCisgICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpKTsK
KyAgICBpZiAoZmxvYXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHsgfTsK
KyAgICAvLyBGbG9hdCBjbGVhciBwdXNoZXMgdGhlIGJsb2NrIGxldmVsIGJveCBlaXRoZXIgYmVs
b3cgdGhlIGZsb2F0cywgb3IganVzdCBvbmUgc2lkZSBiZWxvdyBidXQgdGhlIG90aGVyIHNpZGUg
Y291bGQgb3ZlcmxhcC4KKyAgICAvLyBXaGF0IGl0IG1lYW5zIGlzIHRoYXQgdGhlIHVzZWQgYXZh
aWxhYmxlIHdpZHRoIGFsd2F5cyBtYXRjaGVzIHRoZSBjb250YWluaW5nIGJsb2NrJ3MgY29uc3Ry
YWludC4KKyAgICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKKyAgICAgICAgcmV0dXJu
IHsgfTsKKworICAgIEFTU0VSVChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4
dCgpKTsKKyAgICAvLyBWZXJ0aWNhbCBzdGF0aWMgcG9zaXRpb24gaXMgbm90IGNvbXB1dGVkIHll
dCBmb3IgdGhpcyBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdCwgc28gbGV0J3MganVzdCBwcmUtY29t
cHV0ZSBpdCBmb3Igbm93LgorICAgIHByZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5k
QW5jZXN0b3JzKGxheW91dEJveCwgY29uc3RyYWludHNQYWlyKTsKKworICAgIGF1dG8gbG9naWNh
bFRvcEluRm9ybWF0dGluZ0NvbnRleHRSb290Q29vcmRpbmF0ZSA9IFsmXSAoYXV0byYgZmxvYXRB
dm9pZGVyKSB7CisgICAgICAgIGF1dG8gdG9wID0gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChn
ZW9tZXRyeUZvckJveChmbG9hdEF2b2lkZXIpKTsKKyAgICAgICAgZm9yIChhdXRvKiBhbmNlc3Rv
ciA9ICZmbG9hdEF2b2lkZXIuY29udGFpbmluZ0Jsb2NrKCk7IGFuY2VzdG9yICE9ICZyb290KCk7
IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkKKyAgICAgICAgICAgIHRv
cCArPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94VG9wKGdlb21ldHJ5Rm9yQm94KCphbmNlc3Rvcikp
OworICAgICAgICByZXR1cm4gdG9wOworICAgIH07CisKKyAgICBhdXRvIGZsb2F0Q29uc3RyYWlu
dHNJbkNvbnRhaW5pbmdCbG9ja0Nvb3JkaW5hdGUgPSBbJl0gKGF1dG8gZmxvYXRDb25zdHJhaW50
cykgeworICAgICAgICBpZiAoIWZsb2F0Q29uc3RyYWludHMubGVmdCAmJiAhZmxvYXRDb25zdHJh
aW50cy5yaWdodCkKKyAgICAgICAgICAgIHJldHVybiBGbG9hdGluZ0NvbnRleHQ6OkNvbnN0cmFp
bnRzIHsgfTsKKyAgICAgICAgYXV0byBvZmZzZXQgPSBMYXlvdXRTaXplIHsgfTsKKyAgICAgICAg
Zm9yIChhdXRvKiBhbmNlc3RvciA9ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7IGFuY2Vz
dG9yICE9ICZyb290KCk7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkK
KyAgICAgICAgICAgIG9mZnNldCArPSB0b0xheW91dFNpemUoQm94R2VvbWV0cnk6OmJvcmRlckJv
eFRvcExlZnQoZ2VvbWV0cnlGb3JCb3goKmFuY2VzdG9yKSkpOworICAgICAgICBpZiAoZmxvYXRD
b25zdHJhaW50cy5sZWZ0KQorICAgICAgICAgICAgZmxvYXRDb25zdHJhaW50cy5sZWZ0ID0gUG9p
bnRJbkNvbnRleHRSb290IHsgKmZsb2F0Q29uc3RyYWludHMubGVmdCAtIG9mZnNldCB9OworICAg
ICAgICBpZiAoZmxvYXRDb25zdHJhaW50cy5yaWdodCkKKyAgICAgICAgICAgIGZsb2F0Q29uc3Ry
YWludHMucmlnaHQgPSBQb2ludEluQ29udGV4dFJvb3QgeyAqZmxvYXRDb25zdHJhaW50cy5yaWdo
dCAtIG9mZnNldCB9OworICAgICAgICByZXR1cm4gZmxvYXRDb25zdHJhaW50czsKKyAgICB9Owor
CisgICAgLy8gRklYTUU6IENoZWNrIGlmIHRoZSBub24teWV0LWNvbXB1dGVkIGhlaWdodCBhZmZl
Y3RzIHRoaXMgY29tcHV0YXRpb24gLSBhbmQgd2hldGhlciB3ZSBoYXZlIHRvIHJlc29sdmUgaXQg
YXQgYSBsYXRlciBwb2ludC4KKyAgICBhdXRvIGxvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wSW5Gb3Jt
YXR0aW5nQ29udGV4dFJvb3RDb29yZGluYXRlKGxheW91dEJveCk7CisgICAgYXV0byBjb25zdHJh
aW50cyA9IGZsb2F0Q29uc3RyYWludHNJbkNvbnRhaW5pbmdCbG9ja0Nvb3JkaW5hdGUoZmxvYXRp
bmdDb250ZXh0LmNvbnN0cmFpbnRzKGxvZ2ljYWxUb3AsIGxvZ2ljYWxUb3ApKTsKKyAgICBpZiAo
IWNvbnN0cmFpbnRzLmxlZnQgJiYgIWNvbnN0cmFpbnRzLnJpZ2h0KQorICAgICAgICByZXR1cm4g
eyB9OworICAgIC8vIFNocmluayB0aGUgYXZhaWxhYmxlIHNwYWNlIGlmIHRoZSBmbG9hdHMgYXJl
IGFjdHVhbGx5IGludHJ1ZGluZyBhdCB0aGlzIHZlcnRpY2FsIHBvc2l0aW9uLgorICAgIGF1dG8g
YXZhaWxhYmxlV2lkdGggPSBjb25zdHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250
YWwubG9naWNhbFdpZHRoOworICAgIGlmIChjb25zdHJhaW50cy5sZWZ0KQorICAgICAgICBhdmFp
bGFibGVXaWR0aCAtPSBjb25zdHJhaW50cy5sZWZ0LT54OworICAgIGlmIChjb25zdHJhaW50cy5y
aWdodCkKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3RkOjptYXgoMF9sdSwgY29uc3RyYWlu
dHNQYWlyLmNvbnRhaW5pbmdCbG9jay5ob3Jpem9udGFsLmxvZ2ljYWxSaWdodCgpIC0gY29uc3Ry
YWludHMucmlnaHQtPngpOworICAgIHJldHVybiBhdmFpbGFibGVXaWR0aDsKK30KKwordm9pZCBC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihjb25z
dCBDb250YWluZXJCb3gmIGNvbnRhaW5lckJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiBob3Jpem9udGFsQ29uc3RyYWludHMpCit7CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRp
bmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIlN0YXJ0OiBtb3ZlIGluLWZsb3cgcG9zaXRpb25l
ZCBjaGlsZHJlbiAtPiBwYXJlbnQ6ICIgPDwgJmNvbnRhaW5lckJveCk7CisgICAgZm9yIChhdXRv
JiBjaGlsZEJveCA6IGNoaWxkcmVuT2ZUeXBlPEJveD4oY29udGFpbmVyQm94KSkgeworICAgICAg
ICBpZiAoIWNoaWxkQm94LmlzSW5GbG93UG9zaXRpb25lZCgpKQorICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgIGF1dG8gcG9zaXRpb25PZmZzZXQgPSBnZW9tZXRyeSgpLmluRmxvd1Bvc2l0
aW9uZWRQb3NpdGlvbk9mZnNldChjaGlsZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAg
ICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoY2hpbGRCb3gpLm1vdmUocG9zaXRp
b25PZmZzZXQpOworICAgIH0KKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRM
YXlvdXQsIHN0cmVhbSA8PCAiRW5kOiBtb3ZlIGluLWZsb3cgcG9zaXRpb25lZCBjaGlsZHJlbiAt
PiBwYXJlbnQ6ICIgPDwgJmNvbnRhaW5lckJveCk7Cit9CisKK3ZvaWQgQmxvY2tGb3JtYXR0aW5n
Q29udGV4dDo6Y29tcHV0ZVN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRC
b3gsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpCit7Cisg
ICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRMb2dpY2FsVG9w
KGdlb21ldHJ5KCkuc3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIHZlcnRpY2FsQ29u
c3RyYWludHMpKTsKK30KKwordm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlU3Rh
dGljSG9yaXpvbnRhbFBvc2l0aW9uKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBmb3JtYXR0aW5n
U3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxMZWZ0KGdlb21ldHJ5KCku
c3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
KSk7Cit9CisKK3ZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6cHJlY29tcHV0ZVZlcnRpY2Fs
UG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENv
bnN0cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQoreworICAgIC8vIEluIG9yZGVyIHRvIGZp
Z3VyZSBvdXQgd2hldGhlciBhIGJveCBzaG91bGQgYXZvaWQgYSBmbG9hdCwgd2UgbmVlZCB0byBr
bm93IHRoZSBmaW5hbCBwb3NpdGlvbnMgb2YgYm90aCAoaWdub3JlIHJlbGF0aXZlIHBvc2l0aW9u
aW5nIGZvciBub3cpLgorICAgIC8vIEluIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCB0aGUgZmlu
YWwgcG9zaXRpb24gZm9yIGEgbm9ybWFsIGZsb3cgYm94IGluY2x1ZGVzCisgICAgLy8gMS4gdGhl
IHN0YXRpYyBwb3NpdGlvbiBhbmQKKyAgICAvLyAyLiB0aGUgY29ycmVzcG9uZGluZyAobm9uKWNv
bGxhcHNlZCBtYXJnaW5zLgorICAgIC8vIE5vdyB0aGUgdmVydGljYWwgbWFyZ2lucyBhcmUgY29t
cHV0ZWQgd2hlbiBhbGwgdGhlIGRlc2NlbmRhbnRzIGFyZSBmaW5hbGl6ZWQsIGJlY2F1c2UgdGhl
IG1hcmdpbiB2YWx1ZXMgbWlnaHQgYmUgZGVwZW5kaW5nIG9uIHRoZSBoZWlnaHQgb2YgdGhlIGJv
eAorICAgIC8vIChhbmQgdGhlIGhlaWdodCBtaWdodCBiZSBiYXNlZCBvbiB0aGUgY29udGVudCku
CisgICAgLy8gU28gd2hlbiB3ZSBnZXQgdG8gdGhlIHBvaW50IHdoZXJlIHdlIGludGVyc2VjdCB0
aGUgYm94IHdpdGggdGhlIGZsb2F0IHRvIGRlY2lkZSBpZiB0aGUgYm94IG5lZWRzIHRvIG1vdmUs
IHdlIGRvbid0IHlldCBoYXZlIHRoZSBmaW5hbCB2ZXJ0aWNhbCBwb3NpdGlvbi4KKyAgICAvLwor
ICAgIC8vIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCBhcyBsb25nIGFzIHdlIGRvbid0IGNyb3NzIHRo
ZSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgYm91bmRhcnksIHdlIHNob3VsZCBiZSBhYmxlIHRv
IHByZS1jb21wdXRlIHRoZSBmaW5hbCB0b3AgcG9zaXRpb24uCisgICAgLy8gRklYTUU6IHdlIGN1
cnJlbnRseSBkb24ndCBhY2NvdW50IGZvciB0aGUgImNsZWFyIiBwcm9wZXJ0eSB3aGVuIGNvbXB1
dGluZyB0aGUgZmluYWwgcG9zaXRpb24gZm9yIGFuIGFuY2VzdG9yLgorICAgIGZvciAoYXV0byog
YW5jZXN0b3IgPSAmbGF5b3V0Qm94OyBhbmNlc3RvciAmJiBhbmNlc3RvciAhPSAmcm9vdCgpOyBh
bmNlc3RvciA9ICZhbmNlc3Rvci0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKKyAgICAgICAgYXV0byBj
b25zdHJhaW50c0ZvckFuY2VzdG9yID0gWyZdIHsKKyAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5p
bmdCbG9jayA9IGFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKTsKKyAgICAgICAgICAgIHJldHVy
biAmY29udGFpbmluZ0Jsb2NrID09ICZyb290KCkgPyBjb25zdHJhaW50c1BhaXIuZm9ybWF0dGlu
Z0NvbnRleHRSb290IDogZ2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29u
dGFpbmluZ0Jsb2NrKTsKKyAgICAgICAgfSgpOworCisgICAgICAgIGF1dG8gY29tcHV0ZWRWZXJ0
aWNhbE1hcmdpbiA9IGdlb21ldHJ5KCkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbigqYW5jZXN0b3Is
IGNvbnN0cmFpbnRzRm9yQW5jZXN0b3IuaG9yaXpvbnRhbCk7CisgICAgICAgIGF1dG8gdXNlZE5v
bkNvbGxhcHNlZE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVz
IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0
aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgICAgIGF1dG8gcHJlY29tcHV0ZWRN
YXJnaW5CZWZvcmUgPSBtYXJnaW5Db2xsYXBzZSgpLnByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKCph
bmNlc3RvciwgdXNlZE5vbkNvbGxhcHNlZE1hcmdpbik7CisKKyAgICAgICAgYXV0byYgYm94R2Vv
bWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSgqYW5jZXN0b3IpOworICAgICAg
ICBhdXRvIG5vbkNvbGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFw
c2VkVmFsdWVzIHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUubm9uQ29sbGFwc2VkVmFsdWUsIHsg
fSB9OworICAgICAgICBhdXRvIGNvbGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6
Q29sbGFwc2VkVmFsdWVzIHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUuY29sbGFwc2VkVmFsdWUs
IHsgfSwgZmFsc2UgfTsKKyAgICAgICAgYXV0byB2ZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNh
bE1hcmdpbiB7IG5vbkNvbGxhcHNlZFZhbHVlcywgY29sbGFwc2VkVmFsdWVzLCB7IHByZWNvbXB1
dGVkTWFyZ2luQmVmb3JlLnBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW5CZWZvcmUsIHsgfSB9IH07
CisKKyAgICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0VXNlZFZlcnRpY2FsTWFyZ2luKCphbmNl
c3RvciwgdmVydGljYWxNYXJnaW4pOworICAgICAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1h
cmdpbih7IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2Fs
TWFyZ2luKSB9KTsKKyAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcCh2ZXJ0aWNhbFBv
c2l0aW9uV2l0aE1hcmdpbigqYW5jZXN0b3IsIHZlcnRpY2FsTWFyZ2luLCBjb25zdHJhaW50c0Zv
ckFuY2VzdG9yLnZlcnRpY2FsKSk7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICAgICAgc2V0UHJl
Y29tcHV0ZWRNYXJnaW5CZWZvcmUoKmFuY2VzdG9yLCBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZSk7
CisgICAgICAgIGJveEdlb21ldHJ5LnNldEhhc1ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKCk7Cisj
ZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZVBv
c2l0aW9uVG9Bdm9pZEZsb2F0cyhjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4
dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWlu
dHNQYWlyKQoreworICAgIGlmICghbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkpCisgICAgICAg
IHJldHVybjsKKyAgICAvLyBJbiBvcmRlciB0byBwb3NpdGlvbiBhIGZsb2F0IGF2b2lkZXIgd2Ug
bmVlZCB0byBrbm93IGl0cyB2ZXJ0aWNhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byBpdHMgZm9ybWF0
dGluZyBjb250ZXh0IHJvb3QgKGFuZCBub3QganVzdCBpdHMgY29udGFpbmluZyBibG9jayksCisg
ICAgLy8gYmVjYXVzZSBhbGwgdGhlIGFscmVhZHktcGxhY2VkIGZsb2F0cyAoZmxvYXRzIHRoYXQg
d2UgYXJlIHRyeWluZyB0byBhdm9pZCBoZXJlKSBpbiB0aGlzIEJGQyBtaWdodCBiZWxvbmcKKyAg
ICAvLyB0byBhIGRpZmZlcmVudCBzZXQgb2YgY29udGFpbmluZyBibG9ja3MgKGJ1dCB0aGV5IGFs
bCBkZXNjZW5kYW50cyBvZiB0aGUgQkZDIHJvb3QpLgorICAgIC8vIEhvd2V2ZXIgYWNjb3JkaW5n
IHRvIHRoZSBCRkMgcnVsZXMsIGF0IHRoaXMgcG9pbnQgb2YgdGhlIGxheW91dCBmbG93IHdlIGRv
bid0IHlldCBoYXZlIGNvbXB1dGVkIHZlcnRpY2FsIHBvc2l0aW9ucyBmb3IgdGhlIGFuY2VzdG9y
cy4KKyAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAg
cHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMobGF5b3V0Qm94LCBj
b25zdHJhaW50c1BhaXIpOworICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShs
YXlvdXRCb3gpLnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nQ29udGV4dC5wb3NpdGlvbkZvckZs
b2F0KGxheW91dEJveCwgY29uc3RyYWludHNQYWlyLmNvbnRhaW5pbmdCbG9jay5ob3Jpem9udGFs
KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gTm9uLWZsb2F0IHBvc2l0aW9uZWQg
ZmxvYXQgYXZvaWRlcnMgKGZvcm1hdHRpbmcgY29udGV4dCByb290cyBhbmQgY2xlYXIgYm94ZXMp
IHNob3VsZCBiZSBmaW5lIHVubGVzcyB0aGVyZSBhcmUgZmxvYXRzIGluIHRoaXMgY29udGV4dC4K
KyAgICBpZiAoZmxvYXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAg
IHByZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGxheW91dEJveCwg
Y29uc3RyYWludHNQYWlyKTsKKyAgICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKKyAg
ICAgICAgcmV0dXJuIGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihmbG9hdGlu
Z0NvbnRleHQsIGxheW91dEJveCk7CisKKyAgICBBU1NFUlQobGF5b3V0Qm94LmVzdGFibGlzaGVz
Rm9ybWF0dGluZ0NvbnRleHQoKSk7CisgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnko
bGF5b3V0Qm94KS5zZXRMb2dpY2FsVG9wTGVmdChmbG9hdGluZ0NvbnRleHQucG9zaXRpb25Gb3JO
b25GbG9hdGluZ0Zsb2F0QXZvaWRlcihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzUGFpci5jb250YWlu
aW5nQmxvY2suaG9yaXpvbnRhbCkpOworfQorCit2b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
OmNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihjb25zdCBGbG9hdGluZ0NvbnRl
eHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgQVNTRVJU
KGxheW91dEJveC5oYXNGbG9hdENsZWFyKCkpOworICAgIGlmIChmbG9hdGluZ0NvbnRleHQuaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm47CisgICAgYXV0byB2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xl
YXJhbmNlID0gZmxvYXRpbmdDb250ZXh0LnZlcnRpY2FsUG9zaXRpb25XaXRoQ2xlYXJhbmNlKGxh
eW91dEJveCk7CisgICAgaWYgKCF2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJhbmNlKQorICAgICAg
ICByZXR1cm47CisKKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJv
eEdlb21ldHJ5KGxheW91dEJveCk7CisgICAgQVNTRVJUKHZlcnRpY2FsUG9zaXRpb25BbmRDbGVh
cmFuY2UtPnBvc2l0aW9uID49IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hUb3AoYm94R2VvbWV0cnkp
KTsKKyAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25BbmRDbGVh
cmFuY2UtPnBvc2l0aW9uKTsKKyAgICBpZiAodmVydGljYWxQb3NpdGlvbkFuZENsZWFyYW5jZS0+
Y2xlYXJhbmNlKQorICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRIYXNDbGVhcmFuY2UobGF5
b3V0Qm94KTsKKyAgICAvLyBGSVhNRTogUmVzZXQgdGhlIG1hcmdpbiB2YWx1ZXMgb24gdGhlIGFu
Y2VzdG9ycy9wcmV2aW91cyBzaWJsaW5ncyBub3cgdGhhdCB0aGUgZmxvYXQgYXZvaWRlciB3aXRo
IGNsZWFyYW5jZSBkb2VzIG5vdCBtYXJnaW4gY29sbGFwc2UgYW55bW9yZS4KK30KKwordm9pZCBC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3QgRmxvYXRp
bmdDb250ZXh0JiBmbG9hdGluZ0NvbnRleHQsIGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBD
b25zdHJhaW50c1BhaXImIGNvbnN0cmFpbnRzUGFpcikKK3sKKyAgICBhdXRvIGF2YWlsYWJsZVdp
ZHRoRmxvYXRBdm9pZGVyID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OworICAgIGlmIChsYXlv
dXRCb3guaXNGbG9hdEF2b2lkZXIoKSkgeworICAgICAgICAvLyBGbG9hdCBhdm9pZGVycycgYXZh
aWxhYmxlIHdpZHRoIG1pZ2h0IGJlIHNocnVuayBieSBleGlzdGluZyBmbG9hdHMgaW4gdGhlIGNv
bnRleHQuCisgICAgICAgIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyID0gdXNlZEF2YWlsYWJs
ZVdpZHRoRm9yRmxvYXRBdm9pZGVyKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCBjb25zdHJh
aW50c1BhaXIpOworICAgIH0KKyAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGdlb21l
dHJ5KCkuY29tcHV0ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBjb25zdHJhaW50
c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250YWwsIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9p
ZGVyKTsKKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21l
dHJ5KGxheW91dEJveCk7CisgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGNvbnRl
bnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOworICAgIGJveEdlb21ldHJ5LnNldEhvcml6
b250YWxNYXJnaW4oeyBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCwgY29u
dGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIH0pOworfQorCit2b2lkIEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRC
b3gsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCit7Cisg
ICAgYXV0byBjb21wdXRlID0gWyZdKE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRIZWlnaHQpIC0+
IENvbnRlbnRIZWlnaHRBbmRNYXJnaW4geworICAgICAgICBpZiAobGF5b3V0Qm94LmlzSW5GbG93
KCkpCisgICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbkZsb3dDb250ZW50SGVpZ2h0QW5k
TWFyZ2luKGxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwgeyB1c2VkSGVpZ2h0IH0p
OworCisgICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAg
ICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmZsb2F0aW5nQ29udGVudEhlaWdodEFuZE1hcmdpbihs
YXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIHsgdXNlZEhlaWdodCB9KTsKKworICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICB9Owor
CisgICAgYXV0byBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZSh7IH0pOworICAgIGlm
IChhdXRvIG1heEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQobGF5b3V0Qm94
KSkgeworICAgICAgICBpZiAoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID4g
Km1heEhlaWdodCkgeworICAgICAgICAgICAgYXV0byBtYXhIZWlnaHRBbmRNYXJnaW4gPSBjb21w
dXRlKG1heEhlaWdodCk7CisgICAgICAgICAgICAvLyBVc2VkIGhlaWdodCBzaG91bGQgcmVtYWlu
IHRoZSBzYW1lLgorICAgICAgICAgICAgQVNTRVJUKChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9k
ZSgpICYmIChsYXlvdXRCb3guaXNCb2R5Qm94KCkgfHwgbGF5b3V0Qm94LmlzRG9jdW1lbnRCb3go
KSkpIHx8IG1heEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID09ICptYXhIZWlnaHQpOwor
ICAgICAgICAgICAgY29udGVudEhlaWdodEFuZE1hcmdpbiA9IHsgKm1heEhlaWdodCwgbWF4SGVp
Z2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbiB9OworICAgICAgICB9CisgICAgfQorCisg
ICAgaWYgKGF1dG8gbWluSGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbkhlaWdodChsYXlv
dXRCb3gpKSB7CisgICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWln
aHQgPCAqbWluSGVpZ2h0KSB7CisgICAgICAgICAgICBhdXRvIG1pbkhlaWdodEFuZE1hcmdpbiA9
IGNvbXB1dGUobWluSGVpZ2h0KTsKKyAgICAgICAgICAgIC8vIFVzZWQgaGVpZ2h0IHNob3VsZCBy
ZW1haW4gdGhlIHNhbWUuCisgICAgICAgICAgICBBU1NFUlQoKGxheW91dFN0YXRlKCkuaW5RdWly
a3NNb2RlKCkgJiYgKGxheW91dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVu
dEJveCgpKSkgfHwgbWluSGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPT0gKm1pbkhlaWdo
dCk7CisgICAgICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0geyAqbWluSGVpZ2h0LCBt
aW5IZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luIH07CisgICAgICAgIH0KKyAgICB9
CisKKyAgICAvLyAxLiBDb21wdXRlIGNvbGxhcHNlZCBtYXJnaW5zLgorICAgIC8vIDIuIEFkanVz
dCB2ZXJ0aWNhbCBwb3NpdGlvbiB1c2luZyB0aGUgY29sbGFwc2VkIHZhbHVlcy4KKyAgICAvLyAz
LiBBZGp1c3QgcHJldmlvdXMgaW4tZmxvdyBzaWJsaW5nIG1hcmdpbiBhZnRlciB1c2luZyB0aGlz
IG1hcmdpbi4KKyAgICBhdXRvIG1hcmdpbkNvbGxhcHNlID0gdGhpcy0+bWFyZ2luQ29sbGFwc2Uo
KTsKKyAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gbWFyZ2luQ29sbGFwc2UuY29sbGFwc2VkVmVy
dGljYWxWYWx1ZXMobGF5b3V0Qm94LCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNl
ZE1hcmdpbik7CisgICAgLy8gQ2FjaGUgdGhlIGNvbXB1dGVkIHBvc2l0aXZlIGFuZCBuZWdhdGl2
ZSBtYXJnaW4gdmFsdWUgcGFpci4KKyAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRVc2VkVmVydGlj
YWxNYXJnaW4obGF5b3V0Qm94LCB2ZXJ0aWNhbE1hcmdpbik7CisKKyNpZiBBU1NFUlRfRU5BQkxF
RAorICAgIGlmIChoYXNQcmVjb21wdXRlZE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpICYmIHByZWNv
bXB1dGVkTWFyZ2luQmVmb3JlKGxheW91dEJveCkudXNlZFZhbHVlKCkgIT0gbWFyZ2luQmVmb3Jl
KHZlcnRpY2FsTWFyZ2luKSkgeworICAgICAgICAvLyBXaGVuIHRoZSBwcmUtY29tcHV0ZWQgbWFy
Z2luIHR1cm5zIG91dCB0byBiZSBpbmNvcnJlY3QsIHdlIG5lZWQgdG8gcmUtbGF5b3V0IHRoaXMg
c3VidHJlZSB3aXRoIHRoZSBjb3JyZWN0IG1hcmdpbiB2YWx1ZXMuCisgICAgICAgIC8vIDxkaXYg
c3R5bGU9ImZsb2F0OiBsZWZ0Ij48L2Rpdj4KKyAgICAgICAgLy8gPGRpdj4KKyAgICAgICAgLy8g
ICA8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOiAyMDBweCI+PC9kaXY+CisgICAgICAgIC8vIDwv
ZGl2PgorICAgICAgICAvLyBUaGUgZmxvYXQgYm94IHRyaWdnZXJzIG1hcmdpbiBiZWZvcmUgY29t
cHV0YXRpb24gb24gdGhlIGFuY2VzdG9yIGNoYWluIHRvIGJlIGFibGUgdG8gaW50ZXJzZWN0IHdp
dGggb3RoZXIgZmxvYXRzIGluIHRoZSBzYW1lIGZsb2F0aW5nIGNvbnRleHQuCisgICAgICAgIC8v
IEhvd2V2ZXIgaW4gc29tZSBjYXNlcyB0aGUgcGFyZW50IG1hcmdpbi10b3AgY29sbGFwc2VzIHdp
dGggc29tZSBuZXh0IHNpYmxpbmdzIChuZXBoZXdzKSBhbmQgdGhlcmUncyBubyB3YXkgdG8gYmUg
YWJsZSB0byBwcm9wZXJseQorICAgICAgICAvLyBhY2NvdW50IGZvciB0aGF0IHdpdGhvdXQgbGF5
aW5nIG91dCBldmVyeSBub2RlIGluIHRoZSBGQyAoaW4gdGhlIGV4YW1wbGUsIHRoZSBtYXJnaW4t
Ym90dG9tIHB1c2hlcyBkb3duIHRoZSBmbG9hdCkuCisgICAgICAgIEFTU0VSVF9OT1RfSU1QTEVN
RU5URURfWUVUKCk7CisgICAgfQorI2VuZGlmCisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3Jt
YXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOworICAgIGJveEdlb21ldHJ5LnNl
dENvbnRlbnRCb3hIZWlnaHQoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KTsK
KyAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9yZSh2ZXJ0aWNh
bE1hcmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsKKyAgICAvLyBBZGp1c3Qg
dGhlIHByZXZpb3VzIHNpYmxpbmcncyBtYXJnaW4gYm90dG9tIG5vdyB0aGF0IHRoaXMgYm94J3Mg
dmVydGljYWwgbWFyZ2luIGlzIGNvbXB1dGVkLgorICAgIE1hcmdpbkNvbGxhcHNlOjp1cGRhdGVN
YXJnaW5BZnRlckZvclByZXZpb3VzU2libGluZygqdGhpcywgbWFyZ2luQ29sbGFwc2UsIGxheW91
dEJveCk7Cit9CisKK0Zvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cygpCit7CisgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRl
KCk7CisgICAgQVNTRVJUKCFmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50
cygpKTsKKyAgICAvLyBWaXNpdCB0aGUgaW4tZmxvdyBkZXNjZW5kYW50cyBhbmQgY29tcHV0ZSB0
aGVpciBtaW4vbWF4IGludHJpbnNpYyB3aWR0aCBpZiBuZWVkZWQuCisgICAgLy8gMS4gR28gYWxs
IHRoZSB3YXkgZG93biB0byB0aGUgbGVhZiBub2RlCisgICAgLy8gMi4gQ2hlY2sgaWYgYWN0dWFs
bHkgbmVlZCB0byB2aXNpdCBhbGwgdGhlIGJveGVzIGFzIHdlIHRyYXZlcnNlIGRvd24gKGFscmVh
ZHkgY29tcHV0ZWQsIGNvbnRhaW5lcidzIG1pbi9tYXggZG9lcyBub3QgZGVwZW5kIG9uIGRlc2Nl
bmRhbnRzIGV0YykKKyAgICAvLyAzLiBBcyB3ZSBjbGltYiBiYWNrIG9uIHRoZSB0cmVlLCBjb21w
dXRlIG1pbi9tYXggaW50cmluc2ljIHdpZHRoCisgICAgLy8gKEFueSBzdWJ0cmVlcyB3aXRoIG5l
dyBmb3JtYXR0aW5nIGNvbnRleHRzIG5lZWQgdG8gbGF5b3V0IHN5bmNocm9ub3VzbHkpCisgICAg
VmVjdG9yPGNvbnN0IEJveCo+IHF1ZXVlOworICAgIGlmIChyb290KCkuaGFzSW5GbG93T3JGbG9h
dGluZ0NoaWxkKCkpCisgICAgICAgIHF1ZXVlLmFwcGVuZChyb290KCkuZmlyc3RJbkZsb3dPckZs
b2F0aW5nQ2hpbGQoKSk7CisKKyAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbnN0cmFp
bnRzOworICAgIGF1dG8gbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoID0gTGF5b3V0VW5p
dCB7IH07CisgICAgYXV0byBjdXJyZW50SG9yaXpvbnRhbFN0YWNraW5nV2lkdGggPSBMYXlvdXRV
bml0IHsgfTsKKyAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICB3aGlsZSAo
dHJ1ZSkgeworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBkZWFsIHdpdGggZGVz
Y2VuZGFudCBjb250ZW50LgorICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKnF1ZXVlLmxh
c3QoKTsKKyAgICAgICAgICAgIC8vIEZsb2F0IGF2b2lkZXJzIGFyZSBhbGwgZXN0YWJsaXNoIGEg
bmV3IGZvcm1hdHRpbmcgY29udGV4dC4gTm8gbmVlZCB0byBsb29rIGluc2lkZSB0aGVtLgorICAg
ICAgICAgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpICYmICFsYXlvdXRCb3guaGFz
RmxvYXRDbGVhcigpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gTm9u
LWZsb2F0aW5nIGJsb2NrIGxldmVsIGJveGVzIHJlc2V0IHRoZSBjdXJyZW50IGhvcml6b250YWwg
ZmxvYXQgc3RhY2tpbmcuCisgICAgICAgICAgICAvLyBTUEVDOiBUaGlzIGlzIGEgYml0IG9kZCBh
cyBmbG9hdGluZyBwb3NpdGlvbmluZyBpcyBhIGZvcm1hdHRpbmcgY29udGV4dCBsZXZlbCBjb25j
ZXB0OgorICAgICAgICAgICAgLy8gZS5nLgorICAgICAgICAgICAgLy8gPGRpdiBzdHlsZT0iZmxv
YXQ6IGxlZnQ7IHdpZHRoOiAxMHB4OyI+PC9kaXY+CisgICAgICAgICAgICAvLyA8ZGl2PjwvZGl2
PgorICAgICAgICAgICAgLy8gPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiA0MHB4OyI+
PC9kaXY+CisgICAgICAgICAgICAvLyAuLi53aWxsIHByb2R1Y2UgYSBtYXggd2lkdGggb2YgNDBw
eCB3aGljaCBtYWtlcyB0aGUgZmxvYXRzIHZlcnRpY2FsbHkgc3RhY2tlZC4KKyAgICAgICAgICAg
IC8vIFZlcnRpY2FsbHkgc3RhY2tlZCBmbG9hdHMgbWFrZXMgbWUgdGhpbmsgd2UgaGF2ZW4ndCBt
YW5hZ2VkIHRvIHByb3ZpZGUgdGhlIG1heGltdW0gcHJlZmVycmVkIHdpZHRoIGZvciB0aGUgY29u
dGVudC4KKyAgICAgICAgICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHN0ZDo6
bWF4KGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250YWxTdGFj
a2luZ1dpZHRoKTsKKyAgICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9
IHsgfTsKKyAgICAgICAgICAgIC8vIEFscmVhZHkgaGFzIGNvbXB1dGVkIGludHJpbnNpYyBjb25z
dHJhaW50cy4KKyAgICAgICAgICAgIGlmIChmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhD
b25zdHJhaW50c0ZvckJveChsYXlvdXRCb3gpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgLy8gQm94IHdpdGggZml4ZWQgd2lkdGggZGVmaW5lcyB0aGVpciBkZXNjZW5kYW50
IGNvbnRlbnQgaW50cmluc2ljIHdpZHRoLgorICAgICAgICAgICAgaWYgKGxheW91dEJveC5zdHls
ZSgpLndpZHRoKCkuaXNGaXhlZCgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgLy8gTm9uLWZsb2F0IGF2b2lkZXIgZm9ybWF0dGluZyBjb250ZXh0IHJvb3RzIGFyZSBvcGFx
dWUgdG8gaW50cmluc2ljIHdpZHRoIGNvbXB1dGF0aW9uLgorICAgICAgICAgICAgaWYgKGxheW91
dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpCisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAvLyBObyByZWxldmFudCBjaGlsZCBjb250ZW50LgorICAgICAgICAg
ICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChkb3duY2FzdDxDb250YWluZXJC
b3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7CisgICAgICAgIH0K
KyAgICAgICAgLy8gQ29tcHV0ZSBtaW4vbWF4IGludHJpbnNpYyB3aWR0aCBib3R0b20gdXAgaWYg
bmVlZGVkLgorICAgICAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAg
YXV0byYgbGF5b3V0Qm94ID0gKnF1ZXVlLnRha2VMYXN0KCk7CisgICAgICAgICAgICBhdXRvIGRl
c2RlbmRhbnRDb25zdHJhaW50cyA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzRm9yQm94KGxheW91dEJveCk7CisgICAgICAgICAgICBpZiAoIWRlc2RlbmRhbnRDb25z
dHJhaW50cykgeworICAgICAgICAgICAgICAgIGRlc2RlbmRhbnRDb25zdHJhaW50cyA9IGdlb21l
dHJ5KCkuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhsYXlvdXRCb3gpOworICAgICAgICAgICAg
ICAgIGZvcm1hdHRpbmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGxh
eW91dEJveCwgKmRlc2RlbmRhbnRDb25zdHJhaW50cyk7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBjb25zdHJhaW50cy5taW5pbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMubWluaW11bSwg
ZGVzZGVuZGFudENvbnN0cmFpbnRzLT5taW5pbXVtKTsKKyAgICAgICAgICAgIGF1dG8gd2lsbFN0
YWNrSG9yaXpvbnRhbGx5ID0gbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkgJiYgIWxheW91dEJv
eC5oYXNGbG9hdENsZWFyKCk7CisgICAgICAgICAgICBpZiAod2lsbFN0YWNrSG9yaXpvbnRhbGx5
KQorICAgICAgICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCArPSBkZXNk
ZW5kYW50Q29uc3RyYWludHMtPm1heGltdW07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgY29uc3RyYWludHMubWF4aW11bSA9IHN0ZDo6bWF4KGNvbnN0cmFpbnRzLm1heGltdW0s
IGRlc2RlbmRhbnRDb25zdHJhaW50cy0+bWF4aW11bSk7CisgICAgICAgICAgICAvLyBNb3ZlIG92
ZXIgdG8gdGhlIG5leHQgc2libGluZyBvciB0YWtlIHRoZSBuZXh0IGJveCBpbiB0aGUgcXVldWUu
CisgICAgICAgICAgICBpZiAoYXV0byogbmV4dFNpYmxpbmcgPSBsYXlvdXRCb3gubmV4dEluRmxv
d09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQobmV4
dFNpYmxpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHN0ZDo6bWF4
KGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250YWxTdGFja2lu
Z1dpZHRoKTsKKyAgICBjb25zdHJhaW50cy5tYXhpbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMu
bWF4aW11bSwgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsKKyAgICBmb3JtYXR0aW5n
U3RhdGUuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25zdHJhaW50cyk7CisgICAgcmV0
dXJuIGNvbnN0cmFpbnRzOworfQorCitMYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
OnZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBV
c2VkVmVydGljYWxNYXJnaW4mIHZlcnRpY2FsTWFyZ2luLCAgY29uc3QgVmVydGljYWxDb25zdHJh
aW50cyYgdmVydGljYWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICBBU1NFUlQoIWxheW91dEJv
eC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisgICAgLy8gTm93IHRoYXQgd2UndmUgY29tcHV0
ZWQgdGhlIGZpbmFsIG1hcmdpbiBiZWZvcmUsIGxldCdzIHNoaWZ0IHRoZSBib3gncyB2ZXJ0aWNh
bCBwb3NpdGlvbiBpZiBuZWVkZWQuCisgICAgLy8gMS4gQ2hlY2sgaWYgdGhlIGJveCBoYXMgY2xl
YXJhbmNlLiBJZiBzbywgd2UndmUgYWxyZWFkeSBwcmVjb21wdXRlZC9maW5hbGl6ZWQgdGhlIHRv
cCB2YWx1ZSBhbmQgdmVydGljYWwgbWFyZ2luIGRvZXMgbm90IGltcGFjdCBpdCBhbnltb3JlLgor
ICAgIC8vIDIuIENoZWNrIGlmIHRoZSBtYXJnaW4gYmVmb3JlIGNvbGxhcHNlcyB3aXRoIHRoZSBw
cmV2aW91cyBib3gncyBtYXJnaW4gYWZ0ZXIuIGlmIG5vdCAtPiByZXR1cm4gcHJldmlvdXMgYm94
J3MgYm90dG9tIGluY2x1ZGluZyBtYXJnaW4gYWZ0ZXIgKyBtYXJnaW5CZWZvcmUKKyAgICAvLyAz
LiBDaGVjayBpZiB0aGUgcHJldmlvdXMgYm94J3MgbWFyZ2lucyBjb2xsYXBzZSB0aHJvdWdoLiBJ
ZiBub3QgLT4gcmV0dXJuIHByZXZpb3VzIGJveCcgYm90dG9tIGV4Y2x1ZGluZyBtYXJnaW4gYWZ0
ZXIgKyBtYXJnaW5CZWZvcmUgKHRoZXkgYXJlIHN1cHBvc2VkIHRvIGJlIGVxdWFsKQorICAgIC8v
IDQuIEdvIHRvIHByZXZpb3VzIGJveCBhbmQgc3RhcnQgZnJvbSBzdGVwICMxIHVudGlsIHdlIGhp
dCB0aGUgcGFyZW50IGJveC4KKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGdlb21ldHJ5Rm9yQm94
KGxheW91dEJveCk7CisgICAgaWYgKGZvcm1hdHRpbmdTdGF0ZSgpLmhhc0NsZWFyYW5jZShsYXlv
dXRCb3gpKQorICAgICAgICByZXR1cm4gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChib3hHZW9t
ZXRyeSk7CisKKyAgICBhdXRvKiBjdXJyZW50TGF5b3V0Qm94ID0gJmxheW91dEJveDsKKyAgICB3
aGlsZSAoY3VycmVudExheW91dEJveCkgeworICAgICAgICBpZiAoIWN1cnJlbnRMYXlvdXRCb3gt
PnByZXZpb3VzSW5GbG93U2libGluZygpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGF1
dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9ICpjdXJyZW50TGF5b3V0Qm94LT5wcmV2aW91c0lu
Rmxvd1NpYmxpbmcoKTsKKyAgICAgICAgaWYgKCFtYXJnaW5Db2xsYXBzZSgpLm1hcmdpbkJlZm9y
ZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVudExheW91dEJv
eCkpIHsKKyAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9tZXRyeUZv
ckJveChwcmV2aW91c0luRmxvd1NpYmxpbmcpOworICAgICAgICAgICAgcmV0dXJuIEJveEdlb21l
dHJ5OjptYXJnaW5Cb3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsgbWFyZ2lu
QmVmb3JlKHZlcnRpY2FsTWFyZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbWFyZ2lu
Q29sbGFwc2UoKS5tYXJnaW5zQ29sbGFwc2VUaHJvdWdoKHByZXZpb3VzSW5GbG93U2libGluZykp
IHsKKyAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9tZXRyeUZvckJv
eChwcmV2aW91c0luRmxvd1NpYmxpbmcpOworICAgICAgICAgICAgcmV0dXJuIEJveEdlb21ldHJ5
Ojpib3JkZXJCb3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsgbWFyZ2luQmVm
b3JlKHZlcnRpY2FsTWFyZ2luKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50TGF5b3V0Qm94
ID0gJnByZXZpb3VzSW5GbG93U2libGluZzsKKyAgICB9CisKKyAgICBhdXRvIGNvbnRhaW5pbmdC
bG9ja0NvbnRlbnRCb3hUb3AgPSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7CisgICAg
Ly8gQWRqdXN0IHZlcnRpY2FsIHBvc2l0aW9uIGRlcGVuZGluZyB3aGV0aGVyIHRoaXMgYm94IGRp
cmVjdGx5IG9yIGluZGlyZWN0bHkgYWRqb2lucyB3aXRoIGl0cyBwYXJlbnQuCisgICAgYXV0byBk
aXJlY3RseUFkam9pbnNQYXJlbnQgPSAhbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGluZygp
OworICAgIGlmIChkaXJlY3RseUFkam9pbnNQYXJlbnQpIHsKKyAgICAgICAgLy8gSWYgdGhlIHRv
cCBhbmQgYm90dG9tIG1hcmdpbnMgb2YgYSBib3ggYXJlIGFkam9pbmluZywgdGhlbiBpdCBpcyBw
b3NzaWJsZSBmb3IgbWFyZ2lucyB0byBjb2xsYXBzZSB0aHJvdWdoIGl0LgorICAgICAgICAvLyBJ
biB0aGlzIGNhc2UsIHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBkZXBlbmRzIG9uIGl0cyBy
ZWxhdGlvbnNoaXAgd2l0aCB0aGUgb3RoZXIgZWxlbWVudHMgd2hvc2UgbWFyZ2lucyBhcmUgYmVp
bmcgY29sbGFwc2VkLgorICAgICAgICBpZiAodmVydGljYWxNYXJnaW4uY29sbGFwc2VkVmFsdWVz
LmlzQ29sbGFwc2VkVGhyb3VnaCkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQncyBt
YXJnaW5zIGFyZSBjb2xsYXBzZWQgd2l0aCBpdHMgcGFyZW50J3MgdG9wIG1hcmdpbiwgdGhlIHRv
cCBib3JkZXIgZWRnZSBvZiB0aGUgYm94IGlzIGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhl
IHBhcmVudCdzLgorICAgICAgICAgICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3Jl
Q29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQorICAgICAgICAgICAg
ICAgIHJldHVybiBjb250YWluaW5nQmxvY2tDb250ZW50Qm94VG9wOworICAgICAgICAgICAgLy8g
T3RoZXJ3aXNlLCBlaXRoZXIgdGhlIGVsZW1lbnQncyBwYXJlbnQgaXMgbm90IHRha2luZyBwYXJ0
IGluIHRoZSBtYXJnaW4gY29sbGFwc2luZywgb3Igb25seSB0aGUgcGFyZW50J3MgYm90dG9tIG1h
cmdpbiBpcyBpbnZvbHZlZC4KKyAgICAgICAgICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgZWxl
bWVudCdzIHRvcCBib3JkZXIgZWRnZSBpcyB0aGUgc2FtZSBhcyBpdCB3b3VsZCBoYXZlIGJlZW4g
aWYgdGhlIGVsZW1lbnQgaGFkIGEgbm9uLXplcm8gYm90dG9tIGJvcmRlci4KKyAgICAgICAgICAg
IGF1dG8gYmVmb3JlTWFyZ2luV2l0aEJvdHRvbUJvcmRlciA9IG1hcmdpbkNvbGxhcHNlKCkubWFy
Z2luQmVmb3JlSWdub3JpbmdDb2xsYXBzaW5nVGhyb3VnaChsYXlvdXRCb3gsIHZlcnRpY2FsTWFy
Z2luLm5vbkNvbGxhcHNlZFZhbHVlcyk7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbmluZ0Js
b2NrQ29udGVudEJveFRvcCArIGJlZm9yZU1hcmdpbldpdGhCb3R0b21Cb3JkZXI7CisgICAgICAg
IH0KKyAgICAgICAgLy8gTm9uLWNvbGxhcHNlZCB0aHJvdWdoIGJveCB2ZXJ0aWNhbCBwb3NpdGlv
biBkZXBlbmRpbmcgd2hldGhlciB0aGUgbWFyZ2luIGNvbGxhcHNlcy4KKyAgICAgICAgaWYgKG1h
cmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9y
ZShsYXlvdXRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRC
b3hUb3A7CisKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgKyBt
YXJnaW5CZWZvcmUodmVydGljYWxNYXJnaW4pOworICAgIH0KKyAgICAvLyBBdCB0aGlzIHBvaW50
IHRoaXMgYm94IGluZGlyZWN0bHkgKHZpYSBjb2xsYXBzZWQgdGhyb3VnaCBwcmV2aW91cyBpbi1m
bG93IHNpYmxpbmdzKSBhZGpvaW5zIHRoZSBwYXJlbnQuIExldCdzIGNoZWNrIGlmIGl0IG1hcmdp
biBjb2xsYXBzZXMgd2l0aCB0aGUgcGFyZW50LgorICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9
IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsKKyAgICBBU1NFUlQoY29udGFpbmluZ0Jsb2Nr
LmZpcnN0SW5GbG93Q2hpbGQoKSk7CisgICAgQVNTRVJUKGNvbnRhaW5pbmdCbG9jay5maXJzdElu
Rmxvd0NoaWxkKCkgIT0gJmxheW91dEJveCk7CisgICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFy
Z2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZSgqY29udGFpbmluZ0Jsb2Nr
LmZpcnN0SW5GbG93Q2hpbGQoKSkpCisgICAgICAgIHJldHVybiBjb250YWluaW5nQmxvY2tDb250
ZW50Qm94VG9wOworCisgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgKyBt
YXJnaW5CZWZvcmUodmVydGljYWxNYXJnaW4pOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1h
dHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjYzZDk5NjkzZTg3Y2QwYjBmMTMyZWFjNzEzNjkwZTBiNzA1MmUxMjkKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgKQEAgLTAsMCArMSwxOTgg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNs
dWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5j
bHVkZSA8d3RmL0lzb01hbGxvYy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIExh
eW91dFVuaXQ7CisKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBCb3g7CitjbGFzcyBGbG9h
dGluZ0NvbnRleHQ7CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbGF5b3V0IGxvZ2lj
IGZvciBibG9jayBmb3JtYXR0aW5nIGNvbnRleHRzLgorLy8gaHR0cHM6Ly93d3cudzMub3JnL1RS
L0NTUzIyL3Zpc3VyZW4uaHRtbCNibG9jay1mb3JtYXR0aW5nCitjbGFzcyBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9JU09f
QUxMT0NBVEVEKEJsb2NrRm9ybWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAgIEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3Qs
IEJsb2NrRm9ybWF0dGluZ1N0YXRlJik7CisKKyAgICB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQo
SW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSBv
dmVycmlkZTsKKyAgICBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3Qgb3ZlcnJp
ZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzdHJ1Y3QgQ29uc3RyYWludHNQYWlyIHsKKyAgICAgICAg
Q29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IGZvcm1hdHRpbmdDb250ZXh0Um9vdDsKKyAgICAg
ICAgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IGNvbnRhaW5pbmdCbG9jazsKKyAgICB9Owor
ICAgIHZvaWQgcGxhY2VJbkZsb3dQb3NpdGlvbmVkQ2hpbGRyZW4oY29uc3QgQ29udGFpbmVyQm94
JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7CisKKyAgICB2b2lkIGNvbXB1dGVXaWR0
aEFuZE1hcmdpbihjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBCb3gmLCBjb25zdCBDb25z
dHJhaW50c1BhaXImKTsKKyAgICB2b2lkIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94
JiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jik7CisKKyAgICB2b2lkIGNvbXB1
dGVTdGF0aWNIb3Jpem9udGFsUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJik7CisgICAgdm9pZCBjb21wdXRlU3RhdGljVmVydGljYWxQb3NpdGlvbihjb25z
dCBCb3gmLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJik7CisgICAgdm9pZCBjb21wdXRlUG9z
aXRpb25Ub0F2b2lkRmxvYXRzKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0IEJveCYsIGNv
bnN0IENvbnN0cmFpbnRzUGFpciYpOworICAgIHZvaWQgY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25G
b3JGbG9hdENsZWFyKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0IEJveCYpOworCisgICAg
dm9pZCBwcmVjb21wdXRlVmVydGljYWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhjb25zdCBC
b3gmLCBjb25zdCBDb25zdHJhaW50c1BhaXImKTsKKworICAgIEludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJpZGU7CisKKyAg
ICBMYXlvdXRVbml0IHZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0
IFVzZWRWZXJ0aWNhbE1hcmdpbiYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmKSBjb25zdDsK
KworICAgIC8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBwb3NpdGlvbmluZyBhbmQgc2l6aW5nIGZv
ciBib3hlcyBwYXJ0aWNpcGF0aW5nIGluIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0LgorICAg
IGNsYXNzIEdlb21ldHJ5IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSB7Cisg
ICAgcHVibGljOgorICAgICAgICBHZW9tZXRyeShjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
Jik7CisKKyAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBpbkZsb3dDb250ZW50SGVpZ2h0
QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0
IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpOworICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJn
aW4gaW5GbG93Q29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7CisKKyAg
ICAgICAgUG9pbnQgc3RhdGljUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYpIGNvbnN0OworICAgICAgICBM
YXlvdXRVbml0IHN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgVmVydGlj
YWxDb25zdHJhaW50cyYpIGNvbnN0OworICAgICAgICBMYXlvdXRVbml0IHN0YXRpY0hvcml6b250
YWxQb3NpdGlvbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmKSBjb25z
dDsKKworICAgICAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMoY29uc3QgQm94Jik7CisKKyAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGNv
bXB1dGVkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYsIE9wdGlvbmFsPExheW91dFVuaXQ+IGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9p
ZGVyKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5G
bG93Tm9uUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpOwor
ICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50V2lk
dGhBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29u
c3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKyAgICAgICAgQ29udGVudFdpZHRoQW5k
TWFyZ2luIGluRmxvd1JlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IFJlcGxhY2Vk
Qm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6
b250YWxWYWx1ZXMmKTsKKworICAgICAgICBjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBm
b3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Zm9ybWF0dGluZ0NvbnRleHQo
KSk7IH0KKyAgICB9OworICAgIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21l
dHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMpOyB9CisKKyAgICAvLyBUaGlzIGNs
YXNzIGltcGxlbWVudHMgbWFyZ2luIGNvbGxhcHNpbmcgZm9yIGJsb2NrIGZvcm1hdHRpbmcgY29u
dGV4dC4KKyAgICBjbGFzcyBNYXJnaW5Db2xsYXBzZSB7CisgICAgcHVibGljOgorICAgICAgICBV
c2VkVmVydGljYWxNYXJnaW4gY29sbGFwc2VkVmVydGljYWxWYWx1ZXMoY29uc3QgQm94JiwgVXNl
ZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpOworCisgICAgICAgIFByZWNvbXB1
dGVkTWFyZ2luQmVmb3JlIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYsIFVzZWRW
ZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsKKyAgICAgICAgTGF5b3V0VW5pdCBt
YXJnaW5CZWZvcmVJZ25vcmluZ0NvbGxhcHNpbmdUaHJvdWdoKGNvbnN0IEJveCYsIFVzZWRWZXJ0
aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsKKyAgICAgICAgc3RhdGljIHZvaWQgdXBk
YXRlTWFyZ2luQWZ0ZXJGb3JQcmV2aW91c1NpYmxpbmcoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYs
IGNvbnN0IE1hcmdpbkNvbGxhcHNlJiwgY29uc3QgQm94Jik7CisKKyAgICAgICAgYm9vbCBtYXJn
aW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0
OworICAgICAgICBib29sIG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxk
TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OworICAgICAgICBib29sIG1hcmdpbkJlZm9y
ZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmKSBjb25zdDsKKyAgICAg
ICAgYm9vbCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5nTWFyZ2luQWZ0
ZXIoY29uc3QgQm94JikgY29uc3Q7CisKKyAgICAgICAgYm9vbCBtYXJnaW5BZnRlckNvbGxhcHNl
c1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmKSBjb25zdDsKKyAgICAgICAgYm9vbCBt
YXJnaW5BZnRlckNvbGxhcHNlc1dpdGhMYXN0SW5GbG93Q2hpbGRNYXJnaW5BZnRlcihjb25zdCBC
b3gmKSBjb25zdDsKKyAgICAgICAgYm9vbCBtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRN
YXJnaW5CZWZvcmUoY29uc3QgQm94JikgY29uc3Q7CisgICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJD
b2xsYXBzZXNXaXRoTmV4dFNpYmxpbmdNYXJnaW5CZWZvcmUoY29uc3QgQm94JikgY29uc3Q7Cisg
ICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoU2libGluZ01hcmdpbkJlZm9yZVdp
dGhDbGVhcmFuY2UoY29uc3QgQm94JikgY29uc3Q7CisKKyAgICAgICAgYm9vbCBtYXJnaW5zQ29s
bGFwc2VUaHJvdWdoKGNvbnN0IEJveCYpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAg
ZnJpZW5kIGNsYXNzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ7CisgICAgICAgIE1hcmdpbkNvbGxh
cHNlKGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsKKworICAgICAgICBlbnVtIGNsYXNz
IE1hcmdpblR5cGUgeyBCZWZvcmUsIEFmdGVyIH07CisgICAgICAgIFVzZWRWZXJ0aWNhbE1hcmdp
bjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBwb3NpdGl2ZU5lZ2F0aXZlVmFsdWVz
KGNvbnN0IEJveCYsIE1hcmdpblR5cGUpIGNvbnN0OworICAgICAgICBVc2VkVmVydGljYWxNYXJn
aW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcG9zaXRpdmVOZWdhdGl2ZU1hcmdp
bkJlZm9yZShjb25zdCBCb3gmLCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVl
cykgY29uc3Q7CisgICAgICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2
ZVBhaXI6OlZhbHVlcyBwb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQWZ0ZXIoY29uc3QgQm94JiwgVXNl
ZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0OworCisgICAgICAgIFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBwcmVjb21w
dXRlZFBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUoY29uc3QgQm94JiwgVXNlZFZlcnRpY2Fs
TWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0OworICAgICAgICBVc2VkVmVydGljYWxN
YXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcHJlY29tcHV0ZWRQb3NpdGl2
ZU5lZ2F0aXZlVmFsdWVzKGNvbnN0IEJveCYpIGNvbnN0OworCisgICAgICAgIFVzZWRWZXJ0aWNh
bE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBjb21wdXRlZFBvc2l0aXZl
QW5kTmVnYXRpdmVNYXJnaW4oVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZl
UGFpcjo6VmFsdWVzLCBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWly
OjpWYWx1ZXMpIGNvbnN0OworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBtYXJnaW5WYWx1
ZShVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMpIGNv
bnN0OworCisgICAgICAgIGJvb2wgaGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYpIGNvbnN0OworCisg
ICAgICAgIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIHsgcmV0dXJuIG1fYmxvY2tGb3JtYXR0
aW5nQ29udGV4dC5sYXlvdXRTdGF0ZSgpOyB9CisgICAgICAgIGNvbnN0IExheW91dFN0YXRlJiBs
YXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4dC5sYXlv
dXRTdGF0ZSgpOyB9CisgICAgICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1h
dHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja0Zvcm1hdHRpbmdDb250ZXh0OyB9
CisKKyAgICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgbV9ibG9ja0Zvcm1hdHRp
bmdDb250ZXh0OworICAgIH07CisgICAgTWFyZ2luQ29sbGFwc2UgbWFyZ2luQ29sbGFwc2UoKSBj
b25zdCB7IHJldHVybiBNYXJnaW5Db2xsYXBzZSgqdGhpcyk7IH0KKworICAgIGNsYXNzIFF1aXJr
cyA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzIHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIFF1aXJrcyhjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Jik7CisKKyAgICAgICAgYm9v
bCBuZWVkc1N0cmV0Y2hpbmcoY29uc3QgQm94JikgY29uc3Q7CisgICAgICAgIExheW91dFVuaXQg
c3RyZXRjaGVkSW5GbG93SGVpZ2h0KGNvbnN0IEJveCYsIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4p
OworCisgICAgICAgIGJvb2wgc2hvdWxkSWdub3JlQ29sbGFwc2VkUXVpcmtNYXJnaW4oY29uc3Qg
Qm94JikgY29uc3Q7CisgICAgICAgIGJvb2wgc2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRo
UGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OworICAgICAgICBib29sIHNob3Vs
ZENvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94JikgY29u
c3Q7CisKKyAgICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0Nv
bnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdDb250ZXh0PihG
b3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpmb3JtYXR0aW5nQ29udGV4dCgpKTsgfQorICAgICAg
ICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0
dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnkoKTsgfQorCisgICAgfTsKKyAgICBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4gUXVpcmtz
KCp0aGlzKTsgfQorCisgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZEF2YWlsYWJsZVdpZHRo
Rm9yRmxvYXRBdm9pZGVyKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0IEJveCYsIGNvbnN0
IENvbnN0cmFpbnRzUGFpciYpOworCisgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nU3RhdGUmIGZv
cm1hdHRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEJsb2NrRm9ybWF0dGluZ1N0
YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9CisgICAgQmxvY2tG
b3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIGRvd25jYXN0PEJsb2Nr
Rm9ybWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9
CisKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIHZvaWQgc2V0UHJlY29tcHV0ZWRNYXJnaW5CZWZv
cmUoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IFByZWNvbXB1dGVkTWFyZ2luQmVmb3JlJiBw
cmVjb21wdXRlZE1hcmdpbkJlZm9yZSkgeyBtX3ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlTGlzdC5z
ZXQoJmxheW91dEJveCwgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUpOyB9CisgICAgUHJlY29tcHV0
ZWRNYXJnaW5CZWZvcmUgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRC
b3gpIGNvbnN0IHsgcmV0dXJuIG1fcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmVMaXN0LmdldCgmbGF5
b3V0Qm94KTsgfQorICAgIGJvb2wgaGFzUHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoY29uc3QgQm94
JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmVMaXN0
LmNvbnRhaW5zKCZsYXlvdXRCb3gpOyB9CisjZW5kaWYKK3ByaXZhdGU6CisgICAgSGFzaE1hcDxj
b25zdCBCb3gqLCBQcmVjb21wdXRlZE1hcmdpbkJlZm9yZT4gbV9wcmVjb21wdXRlZE1hcmdpbkJl
Zm9yZUxpc3Q7Cit9OworCitpbmxpbmUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6
Okdlb21ldHJ5KGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkoYmxvY2tGb3JtYXR0aW5n
Q29udGV4dCkKK3sKK30KKworaW5saW5lIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6
UXVpcmtzKGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzKGJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQpCit7Cit9CisKK2lubGluZSBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBz
ZTo6TWFyZ2luQ29sbGFwc2UoY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgYmxvY2tGb3Jt
YXR0aW5nQ29udGV4dCkKKyAgICA6IG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4dChibG9ja0Zvcm1h
dHRpbmdDb250ZXh0KQoreworfQorCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZ
T1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LCBpc0Jsb2NrRm9y
bWF0dGluZ0NvbnRleHQoKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdD
b250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250
ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi4wYTFhMmI0MTZjNjdkZTVmMjQ1ZDUyYzE1ZGI2MzQzNThkY2NiNWIxCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9i
bG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApAQCAtMCww
ICsxLDQwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
CisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdf
Q09OVEVYVCkKKworI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAi
Rm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIK
KyNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENoaWxkSXRl
cmF0b3IuaCIKKyNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0SW5p
dGlhbENvbnRhaW5pbmdCbG9jay5oIgorI2luY2x1ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCisj
aW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0NvbnRlbnRIZWlnaHRB
bmRNYXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd05vblJlcGxh
Y2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRk
ZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKQoreworICAgIEFTU0VS
VChsYXlvdXRCb3guaXNJbkZsb3coKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSk7Cisg
ICAgQVNTRVJUKGxheW91dEJveC5pc092ZXJmbG93VmlzaWJsZSgpKTsKKworICAgIGF1dG8gY29t
cHV0ZSA9IFsmXShjb25zdCBhdXRvJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIC0+IENvbnRl
bnRIZWlnaHRBbmRNYXJnaW4geworCisgICAgICAgIC8vIDEwLjYuMyBCbG9jay1sZXZlbCBub24t
cmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgd2hlbiAnb3ZlcmZsb3cnIGNvbXB1dGVz
IHRvICd2aXNpYmxlJworICAgICAgICAvLworICAgICAgICAvLyBJZiAnbWFyZ2luLXRvcCcsIG9y
ICdtYXJnaW4tYm90dG9tJyBhcmUgJ2F1dG8nLCB0aGVpciB1c2VkIHZhbHVlIGlzIDAuCisgICAg
ICAgIC8vIElmICdoZWlnaHQnIGlzICdhdXRvJywgdGhlIGhlaWdodCBkZXBlbmRzIG9uIHdoZXRo
ZXIgdGhlIGVsZW1lbnQgaGFzIGFueSBibG9jay1sZXZlbCBjaGlsZHJlbiBhbmQgd2hldGhlciBp
dCBoYXMgcGFkZGluZyBvciBib3JkZXJzOgorICAgICAgICAvLyBUaGUgZWxlbWVudCdzIGhlaWdo
dCBpcyB0aGUgZGlzdGFuY2UgZnJvbSBpdHMgdG9wIGNvbnRlbnQgZWRnZSB0byB0aGUgZmlyc3Qg
YXBwbGljYWJsZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAvLyAxLiB0aGUgYm90dG9tIGVk
Z2Ugb2YgdGhlIGxhc3QgbGluZSBib3gsIGlmIHRoZSBib3ggZXN0YWJsaXNoZXMgYSBpbmxpbmUg
Zm9ybWF0dGluZyBjb250ZXh0IHdpdGggb25lIG9yIG1vcmUgbGluZXMKKyAgICAgICAgLy8gMi4g
dGhlIGJvdHRvbSBlZGdlIG9mIHRoZSBib3R0b20gKHBvc3NpYmx5IGNvbGxhcHNlZCkgbWFyZ2lu
IG9mIGl0cyBsYXN0IGluLWZsb3cgY2hpbGQsIGlmIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4K
KyAgICAgICAgLy8gICAgZG9lcyBub3QgY29sbGFwc2Ugd2l0aCB0aGUgZWxlbWVudCdzIGJvdHRv
bSBtYXJnaW4KKyAgICAgICAgLy8gMy4gdGhlIGJvdHRvbSBib3JkZXIgZWRnZSBvZiB0aGUgbGFz
dCBpbi1mbG93IGNoaWxkIHdob3NlIHRvcCBtYXJnaW4gZG9lc24ndCBjb2xsYXBzZSB3aXRoIHRo
ZSBlbGVtZW50J3MgYm90dG9tIG1hcmdpbgorICAgICAgICAvLyA0LiB6ZXJvLCBvdGhlcndpc2UK
KyAgICAgICAgLy8gT25seSBjaGlsZHJlbiBpbiB0aGUgbm9ybWFsIGZsb3cgYXJlIHRha2VuIGlu
dG8gYWNjb3VudCAoaS5lLiwgZmxvYXRpbmcgYm94ZXMgYW5kIGFic29sdXRlbHkgcG9zaXRpb25l
ZCBib3hlcyBhcmUgaWdub3JlZCwKKyAgICAgICAgLy8gYW5kIHJlbGF0aXZlbHkgcG9zaXRpb25l
ZCBib3hlcyBhcmUgY29uc2lkZXJlZCB3aXRob3V0IHRoZWlyIG9mZnNldCkuIE5vdGUgdGhhdCB0
aGUgY2hpbGQgYm94IG1heSBiZSBhbiBhbm9ueW1vdXMgYmxvY2sgYm94LgorCisgICAgICAgIGF1
dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlv
dXRCb3gpOworICAgICAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBHZW9tZXRyeTo6
Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7
CisgICAgICAgIGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpO
b25Db2xsYXBzZWRWYWx1ZXMgeyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9y
KDApLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsgCisgICAgICAg
IGF1dG8gYm9yZGVyQW5kUGFkZGluZ1RvcCA9IGJveEdlb21ldHJ5LmJvcmRlclRvcCgpICsgYm94
R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCk7CisgICAgICAgIGF1dG8gaGVpZ2h0ID0g
b3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVl
cy5oZWlnaHQudmFsdWUoKSA6IGNvbXB1dGVkSGVpZ2h0KGxheW91dEJveCk7CisKKyAgICAgICAg
aWYgKGhlaWdodCkKKyAgICAgICAgICAgIHJldHVybiB7ICpoZWlnaHQsIG5vbkNvbGxhcHNlZE1h
cmdpbiB9OworCisgICAgICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFk
b3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKKyAgICAg
ICAgICAgIHJldHVybiB7IDAsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OworCisgICAgICAgIC8vIDEu
IHRoZSBib3R0b20gZWRnZSBvZiB0aGUgbGFzdCBsaW5lIGJveCwgaWYgdGhlIGJveCBlc3RhYmxp
c2hlcyBhIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgd2l0aCBvbmUgb3IgbW9yZSBsaW5lcwor
ICAgICAgICBhdXRvJiBsYXlvdXRDb250YWluZXIgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxh
eW91dEJveCk7CisgICAgICAgIGlmIChsYXlvdXRDb250YWluZXIuZXN0YWJsaXNoZXNJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCgpKSB7CisgICAgICAgICAgICBhdXRvJiBpbmxpbmVGb3JtYXR0aW5n
U3RhdGUgPSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkSW5saW5lRm9ybWF0dGluZ1N0YXRlKGxh
eW91dENvbnRhaW5lcik7CisgICAgICAgICAgICBhdXRvJiBsaW5lcyA9IGlubGluZUZvcm1hdHRp
bmdTdGF0ZS5saW5lcygpOworICAgICAgICAgICAgLy8gRXZlbiBlbXB0eSBjb250YWluZXJzIGdl
bmVyYXRlIG9uZSBsaW5lLiAKKyAgICAgICAgICAgIEFTU0VSVCghbGluZXMuaXNFbXB0eSgpKTsK
KyAgICAgICAgICAgIHJldHVybiB7IHRvTGF5b3V0VW5pdChsaW5lcy5sYXN0KCkubGluZUJveExv
Z2ljYWxSZWN0KCkuYm90dG9tKCkgKyBpbmxpbmVGb3JtYXR0aW5nU3RhdGUuY2xlYXJHYXBBZnRl
ckxhc3RMaW5lKCkpIC0gYm9yZGVyQW5kUGFkZGluZ1RvcCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07
CisgICAgICAgIH0KKworICAgICAgICAvLyAyLiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGJvdHRv
bSAocG9zc2libHkgY29sbGFwc2VkKSBtYXJnaW4gb2YgaXRzIGxhc3QgaW4tZmxvdyBjaGlsZCwg
aWYgdGhlIGNoaWxkJ3MgYm90dG9tIG1hcmdpbi4uLgorICAgICAgICBhdXRvJiBsYXN0SW5GbG93
Q2hpbGQgPSAqbGF5b3V0Q29udGFpbmVyLmxhc3RJbkZsb3dDaGlsZCgpOworICAgICAgICBpZiAo
IWZvcm1hdHRpbmdDb250ZXh0KCkubWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5BZnRlckNvbGxhcHNl
c1dpdGhQYXJlbnRNYXJnaW5BZnRlcihsYXN0SW5GbG93Q2hpbGQpKSB7CisgICAgICAgICAgICBh
dXRvJiBsYXN0SW5GbG93Qm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5
Rm9yQm94KGxhc3RJbkZsb3dDaGlsZCk7CisgICAgICAgICAgICBhdXRvIGJvdHRvbUVkZ2VPZkJv
dHRvbU1hcmdpbiA9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGxhc3RJbkZsb3dCb3hHZW9t
ZXRyeSkuYm90dG9tKCkgKyBsYXN0SW5GbG93Qm94R2VvbWV0cnkubWFyZ2luQWZ0ZXIoKTsKKyAg
ICAgICAgICAgIHJldHVybiB7IGJvdHRvbUVkZ2VPZkJvdHRvbU1hcmdpbiAtIGJvcmRlckFuZFBh
ZGRpbmdUb3AsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OworICAgICAgICB9CisKKyAgICAgICAgLy8g
My4gdGhlIGJvdHRvbSBib3JkZXIgZWRnZSBvZiB0aGUgbGFzdCBpbi1mbG93IGNoaWxkIHdob3Nl
IHRvcCBtYXJnaW4gZG9lc24ndCBjb2xsYXBzZSB3aXRoIHRoZSBlbGVtZW50J3MgYm90dG9tIG1h
cmdpbgorICAgICAgICBhdXRvKiBpbkZsb3dDaGlsZCA9ICZsYXN0SW5GbG93Q2hpbGQ7CisgICAg
ICAgIHdoaWxlIChpbkZsb3dDaGlsZCAmJiBmb3JtYXR0aW5nQ29udGV4dCgpLm1hcmdpbkNvbGxh
cHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKCppbkZsb3dD
aGlsZCkpCisgICAgICAgICAgICBpbkZsb3dDaGlsZCA9IGluRmxvd0NoaWxkLT5wcmV2aW91c0lu
Rmxvd1NpYmxpbmcoKTsKKyAgICAgICAgaWYgKGluRmxvd0NoaWxkKSB7CisgICAgICAgICAgICBh
dXRvJiBpbkZsb3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JC
b3goKmluRmxvd0NoaWxkKTsKKyAgICAgICAgICAgIHJldHVybiB7IEJveEdlb21ldHJ5Ojpib3Jk
ZXJCb3hUb3AoaW5GbG93Qm94R2VvbWV0cnkpICsgaW5GbG93Qm94R2VvbWV0cnkuYm9yZGVyQm94
KCkuaGVpZ2h0KCkgLSBib3JkZXJBbmRQYWRkaW5nVG9wLCBub25Db2xsYXBzZWRNYXJnaW4gfTsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIDQuIHplcm8sIG90aGVyd2lzZQorICAgICAgICByZXR1
cm4geyAwLCBub25Db2xsYXBzZWRNYXJnaW4gfTsKKyAgICB9OworCisgICAgLy8gMTAuNi43ICdB
dXRvJyBoZWlnaHRzIGZvciBibG9jay1sZXZlbCBmb3JtYXR0aW5nIGNvbnRleHQgYm94ZXMuCisg
ICAgYXV0byBpc0F1dG9IZWlnaHQgPSAhb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCAm
JiAhY29tcHV0ZWRIZWlnaHQobGF5b3V0Qm94KTsKKyAgICBpZiAoaXNBdXRvSGVpZ2h0ICYmIChs
YXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpICYmICFsYXlvdXRCb3guZXN0
YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSkKKyAgICAgICAgcmV0dXJuIGNvbXB1
dGUoIE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyB7IGNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5n
Q29udGV4dFJvb3QoZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpKSB9KTsKKyAgICBy
ZXR1cm4gY29tcHV0ZShvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworfQorCitDb250ZW50V2lk
dGhBbmRNYXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd05vblJl
cGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBI
b3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJp
ZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQoreworICAg
IEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7CisKKyAgICBhdXRvIGNvbXB1dGUgPSBbJl0o
KSB7CisKKyAgICAgICAgLy8gMTAuMy4zIEJsb2NrLWxldmVsLCBub24tcmVwbGFjZWQgZWxlbWVu
dHMgaW4gbm9ybWFsIGZsb3cKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBj
b25zdHJhaW50cyBtdXN0IGhvbGQgYW1vbmcgdGhlIHVzZWQgdmFsdWVzIG9mIHRoZSBvdGhlciBw
cm9wZXJ0aWVzOgorICAgICAgICAvLyAnbWFyZ2luLWxlZnQnICsgJ2JvcmRlci1sZWZ0LXdpZHRo
JyArICdwYWRkaW5nLWxlZnQnICsgJ3dpZHRoJyArICdwYWRkaW5nLXJpZ2h0JyArICdib3JkZXIt
cmlnaHQtd2lkdGgnICsgJ21hcmdpbi1yaWdodCcgPSB3aWR0aCBvZiBjb250YWluaW5nIGJsb2Nr
CisgICAgICAgIC8vCisgICAgICAgIC8vIDEuIElmICd3aWR0aCcgaXMgbm90ICdhdXRvJyBhbmQg
J2JvcmRlci1sZWZ0LXdpZHRoJyArICdwYWRkaW5nLWxlZnQnICsgJ3dpZHRoJyArICdwYWRkaW5n
LXJpZ2h0JyArICdib3JkZXItcmlnaHQtd2lkdGgnIAorICAgICAgICAvLyAgICAocGx1cyBhbnkg
b2YgJ21hcmdpbi1sZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyB0aGF0IGFyZSBub3QgJ2F1dG8nKSBp
cyBsYXJnZXIgdGhhbiB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2ssIHRoZW4KKyAg
ICAgICAgLy8gICAgYW55ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdp
bi1yaWdodCcgYXJlLCBmb3IgdGhlIGZvbGxvd2luZyBydWxlcywgdHJlYXRlZCBhcyB6ZXJvLgor
ICAgICAgICAvLworICAgICAgICAvLyAyLiBJZiBhbGwgb2YgdGhlIGFib3ZlIGhhdmUgYSBjb21w
dXRlZCB2YWx1ZSBvdGhlciB0aGFuICdhdXRvJywgdGhlIHZhbHVlcyBhcmUgc2FpZCB0byBiZSAi
b3Zlci1jb25zdHJhaW5lZCIgYW5kIG9uZSBvZiB0aGUgdXNlZCB2YWx1ZXMgd2lsbAorICAgICAg
ICAvLyAgICBoYXZlIHRvIGJlIGRpZmZlcmVudCBmcm9tIGl0cyBjb21wdXRlZCB2YWx1ZS4gSWYg
dGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGhhcyB0aGUg
dmFsdWUgJ2x0cicsIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAgICAgICAgLy8gICAgb2YgJ21hcmdp
bi1yaWdodCcgaXMgaWdub3JlZCBhbmQgdGhlIHZhbHVlIGlzIGNhbGN1bGF0ZWQgc28gYXMgdG8g
bWFrZSB0aGUgZXF1YWxpdHkgdHJ1ZS4gSWYgdGhlIHZhbHVlIG9mICdkaXJlY3Rpb24nIGlzICdy
dGwnLAorICAgICAgICAvLyAgICB0aGlzIGhhcHBlbnMgdG8gJ21hcmdpbi1sZWZ0JyBpbnN0ZWFk
LgorICAgICAgICAvLworICAgICAgICAvLyAzLiBJZiB0aGVyZSBpcyBleGFjdGx5IG9uZSB2YWx1
ZSBzcGVjaWZpZWQgYXMgJ2F1dG8nLCBpdHMgdXNlZCB2YWx1ZSBmb2xsb3dzIGZyb20gdGhlIGVx
dWFsaXR5LgorICAgICAgICAvLworICAgICAgICAvLyA0LiBJZiAnd2lkdGgnIGlzIHNldCB0byAn
YXV0bycsIGFueSBvdGhlciAnYXV0bycgdmFsdWVzIGJlY29tZSAnMCcgYW5kICd3aWR0aCcgZm9s
bG93cyBmcm9tIHRoZSByZXN1bHRpbmcgZXF1YWxpdHkuCisgICAgICAgIC8vCisgICAgICAgIC8v
IDUuIElmIGJvdGggJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgYXJlICdhdXRvJywg
dGhlaXIgdXNlZCB2YWx1ZXMgYXJlIGVxdWFsLiBUaGlzIGhvcml6b250YWxseSBjZW50ZXJzIHRo
ZSBlbGVtZW50IHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICAgICAgLy8gICAgZWRnZXMgb2YgdGhl
IGNvbnRhaW5pbmcgYmxvY2suCisKKyAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9
IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7CisgICAgICAgIGF1dG8mIGNvbnRh
aW5pbmdCbG9ja1N0eWxlID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCk7Cisg
ICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZv
ckJveChsYXlvdXRCb3gpOworCisgICAgICAgIGF1dG8gd2lkdGggPSBvdmVycmlkZGVuSG9yaXpv
bnRhbFZhbHVlcy53aWR0aCA/IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoIDogY29t
cHV0ZWRXaWR0aChsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKyAgICAgICAgYXV0
byBjb21wdXRlZEhvcml6b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRIb3Jpem9udGFs
TWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICAgICAgVXNlZEhv
cml6b250YWxNYXJnaW4gdXNlZEhvcml6b250YWxNYXJnaW47CisgICAgICAgIGF1dG8gYm9yZGVy
TGVmdCA9IGJveEdlb21ldHJ5LmJvcmRlckxlZnQoKTsKKyAgICAgICAgYXV0byBib3JkZXJSaWdo
dCA9IGJveEdlb21ldHJ5LmJvcmRlclJpZ2h0KCk7CisgICAgICAgIGF1dG8gcGFkZGluZ0xlZnQg
PSBib3hHZW9tZXRyeS5wYWRkaW5nTGVmdCgpLnZhbHVlT3IoMCk7CisgICAgICAgIGF1dG8gcGFk
ZGluZ1JpZ2h0ID0gYm94R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVPcigwKTsKKworICAg
ICAgICAvLyAjMQorICAgICAgICBpZiAod2lkdGgpIHsKKyAgICAgICAgICAgIGF1dG8gaG9yaXpv
bnRhbFNwYWNlRm9yTWFyZ2luID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoY29tcHV0ZWRIb3Jp
em9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCkgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQg
KyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIGNvbXB1dGVkSG9yaXpvbnRh
bE1hcmdpbi5lbmQudmFsdWVPcigwKSk7CisgICAgICAgICAgICBpZiAoaG9yaXpvbnRhbFNwYWNl
Rm9yTWFyZ2luIDwgMCkKKyAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsg
Y29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpv
bnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OworICAgICAgICB9CisKKyAgICAgICAgLy8gIzIK
KyAgICAgICAgaWYgKHdpZHRoICYmIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiBj
b21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmlu
Z0Jsb2NrU3R5bGUuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSB7CisgICAgICAgICAgICAgICAg
dXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0
YXJ0OworICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9IGNvbnRhaW5p
bmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCAr
IHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQpOworICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5l
bmQgPSAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZDsKKyAgICAgICAgICAgICAgICB1c2Vk
SG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKGJvcmRlckxl
ZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsg
dXNlZEhvcml6b250YWxNYXJnaW4uZW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisg
ICAgICAgIC8vICMzCisgICAgICAgIGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0
ICYmIHdpZHRoICYmIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKKyAgICAgICAgICAg
IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5k
OworICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSBjb250YWluaW5nQmxv
Y2tXaWR0aCAtIChib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgICsgKndpZHRoICsgcGFkZGluZ1Jp
Z2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOworICAgICAgICB9
IGVsc2UgaWYgKGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiAhd2lkdGggJiYgY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgeworICAgICAgICAgICAgdXNlZEhvcml6b250YWxN
YXJnaW4gPSB7ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQsICpjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uZW5kIH07CisgICAgICAgICAgICB3aWR0aCA9IGNvbnRhaW5pbmdCbG9ja1dp
ZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdM
ZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5l
bmQpOworICAgICAgICB9IGVsc2UgaWYgKGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAm
JiB3aWR0aCAmJiAhY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgeworICAgICAgICAgICAg
dXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0
YXJ0OworICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gY29udGFpbmluZ0Js
b2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7CisgICAgICAg
IH0KKworICAgICAgICAvLyAjNAorICAgICAgICBpZiAoIXdpZHRoKSB7CisgICAgICAgICAgICB1
c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZh
bHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OworICAg
ICAgICAgICAgd2lkdGggPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1h
cmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHBhZGRpbmdSaWdodCArIGJv
cmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kKTsKKyAgICAgICAgfQorCisgICAg
ICAgIC8vICM1CisgICAgICAgIGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYm
ICFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7CisgICAgICAgICAgICBhdXRvIGhvcml6
b250YWxTcGFjZUZvck1hcmdpbiA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCAgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7Cisg
ICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgaG9yaXpvbnRhbFNwYWNlRm9yTWFy
Z2luIC8gMiwgaG9yaXpvbnRhbFNwYWNlRm9yTWFyZ2luIC8gMiB9OworICAgICAgICB9CisKKyAg
ICAgICAgYXV0byBzaG91bGRBcHBseUNlbnRlckFsaWduRm9yQmxvY2tDb250ZW50ID0gY29udGFp
bmluZ0Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gVGV4dEFsaWduTW9kZTo6V2ViS2l0Q2VudGVy
ICYmIChjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgfHwgY29tcHV0ZWRIb3Jpem9udGFs
TWFyZ2luLmVuZCk7CisgICAgICAgIGlmIChzaG91bGRBcHBseUNlbnRlckFsaWduRm9yQmxvY2tD
b250ZW50KSB7CisgICAgICAgICAgICBhdXRvIGJvcmRlckJveFdpZHRoID0gKGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCAgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7Cisg
ICAgICAgICAgICBhdXRvIG1hcmdpblN0YXJ0ID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0
YXJ0LnZhbHVlT3IoMCk7CisgICAgICAgICAgICBhdXRvIG1hcmdpbkVuZCA9IGNvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKTsKKyAgICAgICAgICAgIGF1dG8gY2VudGVyZWRM
b2dpY2FsTGVmdEZvck1hcmdpbkJveCA9IHN0ZDo6bWF4KChjb250YWluaW5nQmxvY2tXaWR0aCAt
IGJvcmRlckJveFdpZHRoIC0gbWFyZ2luU3RhcnQgLSBtYXJnaW5FbmQpIC8gMiwgMF9sdSk7Cisg
ICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNlbnRlcmVkTG9naWNhbExl
ZnRGb3JNYXJnaW5Cb3ggKyBtYXJnaW5TdGFydDsKKyAgICAgICAgICAgIHVzZWRIb3Jpem9udGFs
TWFyZ2luLmVuZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gYm9yZGVyQm94V2lkdGggLSBtYXJn
aW5TdGFydCArIG1hcmdpbkVuZDsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlQod2lkdGgpOwor
CisgICAgICAgIHJldHVybiBDb250ZW50V2lkdGhBbmRNYXJnaW4geyAqd2lkdGgsIHVzZWRIb3Jp
em9udGFsTWFyZ2luIH07CisgICAgfTsKKworICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFyZ2lu
ID0gY29tcHV0ZSgpOworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91
dCwgc3RyZWFtIDw8ICJbV2lkdGhdW01hcmdpbl0gLT4gaW5mbG93IG5vbi1yZXBsYWNlZCAtPiB3
aWR0aCgiIDw8IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGggPDwgInB4KSBtYXJn
aW4oIiA8PCBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCA8PCAicHgsICIg
PDwgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIDw8ICJweCkgLT4gbGF5b3V0
Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIpOworICAgIHJldHVybiBjb250ZW50V2lkdGhBbmRN
YXJnaW47Cit9CisKK0NvbnRlbnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeTo6aW5GbG93UmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVw
bGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6
b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJy
aWRkZW5Ib3Jpem9udGFsVmFsdWVzKQoreworICAgIEFTU0VSVChyZXBsYWNlZEJveC5pc0luRmxv
dygpKTsKKworICAgIC8vIDEwLjMuNCBCbG9jay1sZXZlbCwgcmVwbGFjZWQgZWxlbWVudHMgaW4g
bm9ybWFsIGZsb3cKKyAgICAvLworICAgIC8vIDEuIFRoZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcg
aXMgZGV0ZXJtaW5lZCBhcyBmb3IgaW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLgorICAgIC8vIDIu
IFRoZW4gdGhlIHJ1bGVzIGZvciBub24tcmVwbGFjZWQgYmxvY2stbGV2ZWwgZWxlbWVudHMgYXJl
IGFwcGxpZWQgdG8gZGV0ZXJtaW5lIHRoZSBtYXJnaW5zLgorCisgICAgLy8gIzEKKyAgICBhdXRv
IHVzZWRXaWR0aCA9IGlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKHJlcGxhY2Vk
Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMpLmNvbnRlbnRXaWR0aDsKKyAgICAvLyAjMgorICAgIGF1dG8gbm9uUmVwbGFjZWRXaWR0aEFu
ZE1hcmdpbiA9IGluRmxvd05vblJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKHJlcGxhY2Vk
Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzIHsg
dXNlZFdpZHRoLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy5tYXJnaW4gfSk7CisKKyAgICBM
T0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1dpZHRo
XVtNYXJnaW5dIC0+IGluZmxvdyByZXBsYWNlZCAtPiB3aWR0aCgiIDw8IHVzZWRXaWR0aCAgPDwg
InB4KSBtYXJnaW4oIiA8PCBub25SZXBsYWNlZFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uc3Rh
cnQgPDwgInB4LCAiIDw8IG5vblJlcGxhY2VkV2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQg
PDwgInB4KSAtPiBsYXlvdXRCb3goIiA8PCAmcmVwbGFjZWRCb3ggPDwgIikiKTsKKyAgICByZXR1
cm4geyB1c2VkV2lkdGgsIG5vblJlcGxhY2VkV2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbiB9Owor
fQorCitMYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNW
ZXJ0aWNhbFBvc2l0aW9uKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBWZXJ0aWNhbENvbnN0
cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzKSBjb25zdAoreworICAgIC8vIGh0dHBzOi8vd3d3
LnczLm9yZy9UUi9DU1MyMi92aXN1cmVuLmh0bWwjYmxvY2stZm9ybWF0dGluZworICAgIC8vIElu
IGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0LCBib3hlcyBhcmUgbGFpZCBvdXQgb25lIGFmdGVy
IHRoZSBvdGhlciwgdmVydGljYWxseSwgYmVnaW5uaW5nIGF0IHRoZSB0b3Agb2YgYSBjb250YWlu
aW5nIGJsb2NrLgorICAgIC8vIFRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzaWJs
aW5nIGJveGVzIGlzIGRldGVybWluZWQgYnkgdGhlICdtYXJnaW4nIHByb3BlcnRpZXMuCisgICAg
Ly8gVmVydGljYWwgbWFyZ2lucyBiZXR3ZWVuIGFkamFjZW50IGJsb2NrLWxldmVsIGJveGVzIGlu
IGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IGNvbGxhcHNlLgorICAgIGlmIChhdXRvKiBwcmV2
aW91c0luRmxvd1NpYmxpbmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkpIHsK
KyAgICAgICAgYXV0byYgcHJldmlvdXNJbkZsb3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250
ZXh0KCkuZ2VvbWV0cnlGb3JCb3goKnByZXZpb3VzSW5GbG93U2libGluZyk7CisgICAgICAgIHJl
dHVybiBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChwcmV2aW91c0luRmxvd0JveEdlb21ldHJ5
KS5ib3R0b20oKSArIHByZXZpb3VzSW5GbG93Qm94R2VvbWV0cnkubWFyZ2luQWZ0ZXIoKTsKKyAg
ICB9CisgICAgcmV0dXJuIHZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbFRvcDsKK30KKworTGF5
b3V0VW5pdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6c3RhdGljSG9yaXpvbnRh
bFBvc2l0aW9uKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmIGhvcml6b250YWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICAvLyBodHRwczovL3d3dy53
My5vcmcvVFIvQ1NTMjIvdmlzdXJlbi5odG1sI2Jsb2NrLWZvcm1hdHRpbmcKKyAgICAvLyBJbiBh
IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCwgZWFjaCBib3gncyBsZWZ0IG91dGVyIGVkZ2UgdG91
Y2hlcyB0aGUgbGVmdCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrIChmb3IgcmlnaHQtdG8t
bGVmdCBmb3JtYXR0aW5nLCByaWdodCBlZGdlcyB0b3VjaCkuCisgICAgcmV0dXJuIGhvcml6b250
YWxDb25zdHJhaW50cy5sb2dpY2FsTGVmdCArIGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlG
b3JCb3gobGF5b3V0Qm94KS5tYXJnaW5TdGFydCgpOworfQorCitQb2ludCBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpHZW9tZXRyeTo6c3RhdGljUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25z
dCBWZXJ0aWNhbENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzKSBjb25zdAoreworICAg
IHJldHVybiB7IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbihsYXlvdXRCb3gsIGhvcml6b250YWxD
b25zdHJhaW50cyksIHN0YXRpY1ZlcnRpY2FsUG9zaXRpb24obGF5b3V0Qm94LCB2ZXJ0aWNhbENv
bnN0cmFpbnRzKSB9OworfQorCitDb250ZW50SGVpZ2h0QW5kTWFyZ2luIEJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5OjppbkZsb3dDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJv
eCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25z
dHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGlj
YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpKTsKKworICAgIC8v
IDEwLjYuMiBJbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMsIGJsb2NrLWxldmVsIHJlcGxhY2VkIGVs
ZW1lbnRzIGluIG5vcm1hbCBmbG93LCAnaW5saW5lLWJsb2NrJworICAgIC8vIHJlcGxhY2VkIGVs
ZW1lbnRzIGluIG5vcm1hbCBmbG93IGFuZCBmbG9hdGluZyByZXBsYWNlZCBlbGVtZW50cworICAg
IGlmIChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQorICAgICAgICByZXR1cm4gaW5saW5lUmVw
bGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRC
b3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVz
KTsKKworICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gY29udGVudEhlaWdodEFuZE1hcmdpbjsK
KyAgICBpZiAobGF5b3V0Qm94LmlzT3ZlcmZsb3dWaXNpYmxlKCkgJiYgIWxheW91dEJveC5pc0Rv
Y3VtZW50Qm94KCkpIHsKKyAgICAgICAgLy8gVE9ETzogRmlndXJlIG91dCB0aGUgY2FzZSBmb3Ig
dGhlIGRvY3VtZW50IGVsZW1lbnQuIExldCdzIGp1c3QgY29tcGxpY2F0ZWQtY2FzZSBpdCBmb3Ig
bm93LgorICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gaW5GbG93Tm9uUmVwbGFjZWRD
b250ZW50SGVpZ2h0QW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBv
dmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIDEwLjYu
NiBDb21wbGljYXRlZCBjYXNlcworICAgICAgICAvLyBCbG9jay1sZXZlbCwgbm9uLXJlcGxhY2Vk
IGVsZW1lbnRzIGluIG5vcm1hbCBmbG93IHdoZW4gJ292ZXJmbG93JyBkb2VzIG5vdCBjb21wdXRl
IHRvICd2aXNpYmxlJyAoZXhjZXB0IGlmIHRoZSAnb3ZlcmZsb3cnIHByb3BlcnR5J3MgdmFsdWUg
aGFzIGJlZW4gcHJvcGFnYXRlZCB0byB0aGUgdmlld3BvcnQpLgorICAgICAgICBjb250ZW50SGVp
Z2h0QW5kTWFyZ2luID0gY29tcGxpY2F0ZWRDYXNlcyhsYXlvdXRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cywgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKKyAgICB9CisKKyAgICBhdXRvIHF1
aXJrcyA9IGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCk7CisgICAgaWYgKCFxdWlya3MubmVl
ZHNTdHJldGNoaW5nKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBjb250ZW50SGVpZ2h0QW5k
TWFyZ2luOworCisgICAgY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID0gcXVp
cmtzLnN0cmV0Y2hlZEluRmxvd0hlaWdodChsYXlvdXRCb3gsIGNvbnRlbnRIZWlnaHRBbmRNYXJn
aW4pOworCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJl
YW0gPDwgIltIZWlnaHRdW01hcmdpbl0gLT4gaW5mbG93IG5vbi1yZXBsYWNlZCAtPiBzdHJlY2hl
ZCB0byB2aWV3cG9ydCAtPiBoZWlnaHQoIiA8PCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRl
bnRIZWlnaHQgPDwgInB4KSBtYXJnaW4oIiA8PCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNv
bGxhcHNlZE1hcmdpbi5iZWZvcmUgPDwgInB4LCAiIDw8IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4u
bm9uQ29sbGFwc2VkTWFyZ2luLmFmdGVyIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJmxheW91
dEJveCA8PCAiKSIpOworICAgIHJldHVybiBjb250ZW50SGVpZ2h0QW5kTWFyZ2luOworfQorCitD
b250ZW50V2lkdGhBbmRNYXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Omlu
Rmxvd0NvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRk
ZW5Ib3Jpem9udGFsVmFsdWVzJiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKK3sKKyAgICBB
U1NFUlQobGF5b3V0Qm94LmlzSW5GbG93KCkpOworCisgICAgaWYgKCFsYXlvdXRCb3guaXNSZXBs
YWNlZEJveCgpKQorICAgICAgICByZXR1cm4gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50V2lkdGhB
bmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzKTsKKyAgICByZXR1cm4gaW5GbG93UmVwbGFjZWRDb250ZW50V2lkdGhBbmRN
YXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJh
aW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOworfQorCitDb250ZW50V2lkdGhBbmRN
YXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkQ29udGVudFdp
ZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxh
YmxlV2lkdGhGbG9hdEF2b2lkZXIpCit7CisgICAgYXV0byBjb21wdXRlID0gWyZdIChhdXRvIGNv
bnN0cmFpbnRzRm9yV2lkdGgsIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRXaWR0aCkgeworICAg
ICAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCisgICAgICAgICAgICBy
ZXR1cm4gZmxvYXRpbmdDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBjb25zdHJhaW50
c0ZvcldpZHRoLCB7IHVzZWRXaWR0aCwgeyB9IH0pOworCisgICAgICAgIGlmIChsYXlvdXRCb3gu
aXNJbkZsb3coKSkKKyAgICAgICAgICAgIHJldHVybiBpbkZsb3dDb250ZW50V2lkdGhBbmRNYXJn
aW4obGF5b3V0Qm94LCBjb25zdHJhaW50c0ZvcldpZHRoLCB7IHVzZWRXaWR0aCwgeyB9IH0pOwor
CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gQ29udGVudFdp
ZHRoQW5kTWFyZ2luIHsgfTsKKyAgICB9OworCisgICAgYXV0byBob3Jpem9udGFsQ29uc3RyYWlu
dHNGb3JXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50czsKKyAgICBpZiAobGF5b3V0Qm94LnN0
eWxlKCkubG9naWNhbFdpZHRoKCkuaXNBdXRvKCkgJiYgYXZhaWxhYmxlV2lkdGhGbG9hdEF2b2lk
ZXIpIHsKKyAgICAgICAgLy8gV2hpbGUgdGhlIG5vbi1hdXRvIHdpZHRoIHZhbHVlcyBzaG91bGQg
YWxsIGJlIHJlc29sdmVkIGFnYWluc3QgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0aCwgd2hl
bgorICAgICAgICAvLyB0aGUgd2lkdGggaXMgYXV0byB0aGUgYXZhaWxhYmxlIGhvcml6b250YWwg
c3BhY2UgaXMgc2hydW5rIGJ5IG5laWdoYm9yaW5nIGZsb2F0cy4KKyAgICAgICAgaG9yaXpvbnRh
bENvbnN0cmFpbnRzRm9yV2lkdGgubG9naWNhbFdpZHRoID0gKmF2YWlsYWJsZVdpZHRoRmxvYXRB
dm9pZGVyOworICAgIH0KKyAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUo
aG9yaXpvbnRhbENvbnN0cmFpbnRzRm9yV2lkdGgsIHsgfSk7CisgICAgYXV0byBhdmFpbGFibGVX
aWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7CisgICAgaWYgKGF1dG8g
bWF4V2lkdGggPSBjb21wdXRlZE1heFdpZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpKSB7
CisgICAgICAgIGF1dG8gbWF4V2lkdGhBbmRNYXJnaW4gPSBjb21wdXRlKGhvcml6b250YWxDb25z
dHJhaW50cywgbWF4V2lkdGgpOworICAgICAgICBpZiAoY29udGVudFdpZHRoQW5kTWFyZ2luLmNv
bnRlbnRXaWR0aCA+IG1heFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkKKyAgICAgICAgICAg
IGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IG1heFdpZHRoQW5kTWFyZ2luOworICAgIH0KKworICAg
IGF1dG8gbWluV2lkdGggPSBjb21wdXRlZE1pbldpZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lk
dGgpLnZhbHVlT3IoMCk7CisgICAgYXV0byBtaW5XaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUoaG9y
aXpvbnRhbENvbnN0cmFpbnRzLCBtaW5XaWR0aCk7CisgICAgaWYgKGNvbnRlbnRXaWR0aEFuZE1h
cmdpbi5jb250ZW50V2lkdGggPCBtaW5XaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCisgICAg
ICAgIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IG1pbldpZHRoQW5kTWFyZ2luOworICAgIHJldHVy
biBjb250ZW50V2lkdGhBbmRNYXJnaW47Cit9CisKK0Zvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0IEJveCYgbGF5b3V0Qm94KQoreworICAgIGF1dG8g
Zml4ZWRNYXJnaW5Cb3JkZXJBbmRQYWRkaW5nID0gWyZdKGF1dG8mIGxheW91dEJveCkgeworICAg
ICAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOworICAgICAgICByZXR1cm4gZml4
ZWRWYWx1ZShzdHlsZS5tYXJnaW5TdGFydCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIExh
eW91dFVuaXQgeyBzdHlsZS5ib3JkZXJMZWZ0V2lkdGgoKSB9CisgICAgICAgICAgICArIGZpeGVk
VmFsdWUoc3R5bGUucGFkZGluZ0xlZnQoKSkudmFsdWVPcigwKQorICAgICAgICAgICAgKyBmaXhl
ZFZhbHVlKHN0eWxlLnBhZGRpbmdSaWdodCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIExh
eW91dFVuaXQgeyBzdHlsZS5ib3JkZXJSaWdodFdpZHRoKCkgfQorICAgICAgICAgICAgKyBmaXhl
ZFZhbHVlKHN0eWxlLm1hcmdpbkVuZCgpKS52YWx1ZU9yKDApOworICAgIH07CisKKyAgICBhdXRv
IGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IFsmXSgpIC0+IEludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMgeworICAgICAgICBhdXRvIGxvZ2ljYWxXaWR0aCA9IGxheW91dEJveC5z
dHlsZSgpLmxvZ2ljYWxXaWR0aCgpOworICAgICAgICAvLyBNaW5pbXVtL21heGltdW0gd2lkdGgg
Y2FuJ3QgYmUgZGVwZW5kaW5nIG9uIHRoZSBjb250YWluaW5nIGJsb2NrJ3Mgd2lkdGguCisgICAg
ICAgIGF1dG8gbmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRoID0gbG9naWNhbFdpZHRo
LmlzQ2FsY3VsYXRlZCgpIHx8IGxvZ2ljYWxXaWR0aC5pc1BlcmNlbnQoKSB8fCBsb2dpY2FsV2lk
dGguaXNSZWxhdGl2ZSgpOworICAgICAgICBpZiAobmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9j
a1dpZHRoKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKworICAgICAgICBpZiAoYXV0byB3aWR0
aCA9IGZpeGVkVmFsdWUobG9naWNhbFdpZHRoKSkKKyAgICAgICAgICAgIHJldHVybiB7ICp3aWR0
aCwgKndpZHRoIH07CisKKyAgICAgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpIHsK
KyAgICAgICAgICAgIGF1dG8mIHJlcGxhY2VkQm94ID0gZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxh
eW91dEJveCk7CisgICAgICAgICAgICBpZiAocmVwbGFjZWRCb3guaGFzSW50cmluc2ljV2lkdGgo
KSkgeworICAgICAgICAgICAgICAgIGF1dG8gcmVwbGFjZWRXaWR0aCA9IHJlcGxhY2VkQm94Lmlu
dHJpbnNpY1dpZHRoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVwbGFjZWRXaWR0aCwg
cmVwbGFjZWRXaWR0aCB9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHsgfTsK
KyAgICAgICAgfQorCisgICAgICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8
ICFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93T3JGbG9hdGluZ0No
aWxkKCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworCisgICAgICAgIGlmIChsYXlvdXRCb3gu
aXNTaXplQ29udGFpbm1lbnRCb3goKSkgeworICAgICAgICAgICAgLy8gVGhlIGludHJpbnNpYyBz
aXplcyBvZiB0aGUgc2l6ZSBjb250YWlubWVudCBib3ggYXJlIGRldGVybWluZWQgYXMgaWYgdGhl
IGVsZW1lbnQgaGFkIG5vIGNvbnRlbnQsCisgICAgICAgICAgICAvLyBmb2xsb3dpbmcgdGhlIHNh
bWUgbG9naWMgYXMgd2hlbiBzaXppbmcgYXMgaWYgZW1wdHkuCisgICAgICAgICAgICByZXR1cm4g
eyB9OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1h
dHRpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJh
aW50cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGRvd25jYXN0PENv
bnRhaW5lckJveD4obGF5b3V0Qm94KSwgbGF5b3V0U3RhdGUoKSktPmNvbXB1dGVkSW50cmluc2lj
V2lkdGhDb25zdHJhaW50cygpOworICAgICAgICAgICAgaWYgKGxvZ2ljYWxXaWR0aC5pc01pbkNv
bnRlbnQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4geyBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzLm1pbmltdW0sIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSB9OworICAgICAg
ICAgICAgaWYgKGxvZ2ljYWxXaWR0aC5pc01heENvbnRlbnQoKSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4geyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIGludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMubWF4aW11bSB9OworICAgICAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRo
Q29uc3RyYWludHM7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMgPSBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKKyAgICAgICAgYXV0byYg
Zm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUoKS5mb3JtYXR0aW5nU3RhdGVGb3JCb3gobGF5
b3V0Qm94KTsKKyAgICAgICAgZm9yIChhdXRvJiBjaGlsZCA6IGNoaWxkcmVuT2ZUeXBlPEJveD4o
ZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpKSkgeworICAgICAgICAgICAgaWYgKGNo
aWxkLmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpIHx8IChjaGlsZC5pc0Zsb2F0QXZvaWRlcigpICYm
ICFjaGlsZC5oYXNGbG9hdENsZWFyKCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICAgICAgYXV0byBjaGlsZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBmb3JtYXR0aW5n
U3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChjaGlsZCk7CisgICAgICAgICAg
ICBBU1NFUlQoY2hpbGRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKTsKKworICAgICAgICAgICAg
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtID0gc3RkOjptYXgoaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cy5taW5pbXVtLCBjaGlsZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMtPm1p
bmltdW0pOworICAgICAgICAgICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtID0g
c3RkOjptYXgoaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtLCBjaGlsZEludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMtPm1heGltdW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBp
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOworICAgIH07CisgICAgLy8gRklYTUUgQ2hlY2sgZm9y
IGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzID0gY29uc3RyYWluQnlNaW5NYXhXaWR0aChsYXlvdXRCb3gsIGNvbXB1dGVkSW50cmluc2lj
V2lkdGhDb25zdHJhaW50cygpKTsKKyAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLmV4cGFu
ZChmaXhlZE1hcmdpbkJvcmRlckFuZFBhZGRpbmcobGF5b3V0Qm94KSk7CisgICAgcmV0dXJuIGlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGlu
Zy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRl
eHRRdWlya3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjcxYjA4ODQyMDNkYzg2YTY3MzZhYmM4ZWJkYWYyYTVl
ZjFkNTg2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtz
LmNwcApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VU
X0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgi
CisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIK
KyNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRJbml0aWFs
Q29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3N0YXRpYyBib29sIGlzUXVpcmtDb250
YWluZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgcmV0dXJuIGxheW91dEJveC5pc0Jv
ZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpIHx8IGxheW91dEJveC5pc1RhYmxl
Q2VsbCgpOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6bmVlZHNT
dHJldGNoaW5nKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIEFTU0VSVChsYXlv
dXRCb3guaXNJbkZsb3coKSk7CisgICAgLy8gSW4gcXVpcmtzIG1vZGUsIGluLWZsb3cgYm9keSBh
bmQgaHRtbCBzdHJldGNoIHRvIHRoZSBpbml0aWFsIGNvbnRhaW5pbmcgYmxvY2sgKGhlaWdodDog
YXV0byBvbmx5KS4KKyAgICBpZiAoIWxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghbGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSAm
JiAhbGF5b3V0Qm94LmlzQm9keUJveCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBy
ZXR1cm4gbGF5b3V0Qm94LnN0eWxlKCkubG9naWNhbEhlaWdodCgpLmlzQXV0bygpOworfQorCitM
YXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6c3RyZXRjaGVkSW5GbG93
SGVpZ2h0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGNvbnRl
bnRIZWlnaHRBbmRNYXJnaW4pCit7CisgICAgQVNTRVJUKG5lZWRzU3RyZXRjaGluZyhsYXlvdXRC
b3gpKTsKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250
ZXh0KCk7CisgICAgYXV0byBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiA9IGNvbnRlbnRIZWln
aHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSArIGNvbnRlbnRIZWlnaHRBbmRN
YXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmFmdGVyOworCisgICAgaWYgKGxheW91dEJveC5pc0Rv
Y3VtZW50Qm94KCkpIHsKKyAgICAgICAgLy8gTGV0J3Mgc3RyZXRjaCB0aGUgaW5mbG93IGRvY3Vt
ZW50IGJveCg8aHRtbD4pIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGluaXRpYWwgY29udGFpbmluZyBi
bG9jayAodmlldykuCisgICAgICAgIGF1dG8gZG9jdW1lbnRCb3hDb250ZW50SGVpZ2h0ID0gZm9y
bWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LmluaXRpYWxDb250YWluaW5n
QmxvY2soKSwgRXNjYXBlUmVhc29uOjpEb2N1bWVudEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWly
aykuY29udGVudEJveEhlaWdodCgpOworICAgICAgICAvLyBEb2N1bWVudCBib3gncyBvd24gdmVy
dGljYWwgbWFyZ2luL2JvcmRlci9wYWRkaW5nIHZhbHVlcyBhbHdheXMgc2hyaW5rIHRoZSBjb250
ZW50IGhlaWdodC4KKyAgICAgICAgYXV0byYgZG9jdW1lbnRCb3hHZW9tZXRyeSA9IGZvcm1hdHRp
bmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAgICAgIGRvY3VtZW50Qm94
Q29udGVudEhlaWdodCAtPSBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiArIGRvY3VtZW50Qm94
R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxQ
YWRkaW5nKCkudmFsdWVPcigwKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KGNvbnRlbnRIZWln
aHRBbmRNYXJnaW4uY29udGVudEhlaWdodCwgIGRvY3VtZW50Qm94Q29udGVudEhlaWdodCk7Cisg
ICAgfQorCisgICAgLy8gSGVyZSBpcyB0aGUgcXVpcmt5IHBhcnQgZm9yIGJvZHkgYm94IHdoZW4g
aXQgc3RyZXRjaGVzIGFsbCB0aGUgd2F5IHRvIHRoZSBJQ0IgZXZlbiB3aGVuIHRoZSBkb2N1bWVu
dCBib3ggZG9lcyBub3QgKGUuZy4gb3V0LW9mLWZsb3cgcG9zaXRpb25lZCkuCisgICAgQVNTRVJU
KGxheW91dEJveC5pc0JvZHlCb3goKSk7CisgICAgYXV0byYgaW5pdGlhbENvbnRhaW5pbmdCbG9j
ayA9IGxheW91dEJveC5pbml0aWFsQ29udGFpbmluZ0Jsb2NrKCk7CisgICAgYXV0byYgaW5pdGlh
bENvbnRhaW5pbmdCbG9ja0dlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JC
b3goaW5pdGlhbENvbnRhaW5pbmdCbG9jaywgRXNjYXBlUmVhc29uOjpCb2R5U3RyZXRjaGVzVG9W
aWV3cG9ydFF1aXJrKTsKKyAgICAvLyBTdGFydCB0aGUgY29udGVudCBoZWlnaHQgd2l0aCB0aGUg
SUNCLgorICAgIGF1dG8gYm9keUJveENvbnRlbnRIZWlnaHQgPSBpbml0aWFsQ29udGFpbmluZ0Js
b2NrR2VvbWV0cnkuY29udGVudEJveEhlaWdodCgpOworICAgIC8vIEJvZHkgYm94J3Mgb3duIGJv
cmRlciBhbmQgcGFkZGluZyBzaHJpbmsgdGhlIGNvbnRlbnQgaGVpZ2h0LgorICAgIGF1dG8mIGJv
ZHlCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJv
eCk7CisgICAgYm9keUJveENvbnRlbnRIZWlnaHQgLT0gYm9keUJveEdlb21ldHJ5LnZlcnRpY2Fs
Qm9yZGVyKCkgKyBib2R5Qm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsK
KyAgICAvLyBCb2R5IGJveCBuZXZlciBjb2xsYXBzZXMgaXRzIHZlcnRpY2FsIG1hcmdpbnMgd2l0
aCB0aGUgZG9jdW1lbnQgYm94IGJ1dCBpdCBtaWdodCBjb2xsYXBzZSBpdHMgbWFyZ2luIHdpdGgg
aXRzIGRlc2NlbmRhbnRzLgorICAgIGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0gY29udGVudEhl
aWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW47CisgICAgYXV0byBjb2xsYXBzZWRNYXJn
aW4gPSBmb3JtYXR0aW5nQ29udGV4dC5tYXJnaW5Db2xsYXBzZSgpLmNvbGxhcHNlZFZlcnRpY2Fs
VmFsdWVzKGxheW91dEJveCwgbm9uQ29sbGFwc2VkTWFyZ2luKS5jb2xsYXBzZWRWYWx1ZXM7Cisg
ICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBjb2xsYXBzZWRNYXJnaW4uYmVmb3JlLnZhbHVl
T3Iobm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSk7CisgICAgdXNlZFZlcnRpY2FsTWFyZ2luICs9
IGNvbGxhcHNlZE1hcmdpbi5pc0NvbGxhcHNlZFRocm91Z2ggPyBub25Db2xsYXBzZWRNYXJnaW4u
YWZ0ZXIgOiBjb2xsYXBzZWRNYXJnaW4uYWZ0ZXIudmFsdWVPcihub25Db2xsYXBzZWRNYXJnaW4u
YWZ0ZXIpOworICAgIGJvZHlCb3hDb250ZW50SGVpZ2h0IC09IHVzZWRWZXJ0aWNhbE1hcmdpbjsK
KyAgICAvLyBEb2N1bWVudCBib3gncyBwYWRkaW5nIGFuZCBib3JkZXIgYWxzbyBzaHJpbmsgdGhl
IGJvZHkgYm94J3MgY29udGVudCBoZWlnaHQuCisgICAgYXV0byYgZG9jdW1lbnRCb3ggPSBsYXlv
dXRCb3gucGFyZW50KCk7CisgICAgYXV0byYgZG9jdW1lbnRCb3hHZW9tZXRyeSA9IGZvcm1hdHRp
bmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGRvY3VtZW50Qm94LCBFc2NhcGVSZWFzb246OkJvZHlT
dHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspOworICAgIGJvZHlCb3hDb250ZW50SGVpZ2h0IC09IGRv
Y3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50Qm94R2VvbWV0cnku
dmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKKyAgICAvLyBIb3dldmVyIHRoZSBub24taW4t
ZmxvdyBkb2N1bWVudCBib3gncyB2ZXJ0aWNhbCBtYXJnaW5zIGFyZSBpZ25vcmVkLiBUaGV5IGRv
bid0IGFmZmVjdCB0aGUgYm9keSBib3gncyBjb250ZW50IGhlaWdodC4KKyAgICBpZiAoZG9jdW1l
bnRCb3guaXNJbkZsb3coKSkgeworICAgICAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2VvbWV0
cnkoKTsKKyAgICAgICAgYXV0byBwcmVjb21wdXRlRG9jdW1lbnRCb3hWZXJ0aWNhbE1hcmdpbiA9
IGdlb21ldHJ5LmNvbXB1dGVkVmVydGljYWxNYXJnaW4oZG9jdW1lbnRCb3gsIGdlb21ldHJ5LmNv
bnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChpbml0aWFsQ29udGFpbmluZ0Jsb2NrLCBFc2NhcGVS
ZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspLmhvcml6b250YWwpOworICAgICAg
ICBib2R5Qm94Q29udGVudEhlaWdodCAtPSBwcmVjb21wdXRlRG9jdW1lbnRCb3hWZXJ0aWNhbE1h
cmdpbi5iZWZvcmUudmFsdWVPcigwKSArIHByZWNvbXB1dGVEb2N1bWVudEJveFZlcnRpY2FsTWFy
Z2luLmFmdGVyLnZhbHVlT3IoMCk7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1heChjb250ZW50
SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQsICBib2R5Qm94Q29udGVudEhlaWdodCk7Cit9
CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpzaG91bGRJZ25vcmVDb2xs
YXBzZWRRdWlya01hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbGF5b3V0U3RhdGUoKS5pblF1aXJrc01vZGUoKSAmJiBpc1F1aXJrQ29udGFpbmVyKGxheW91
dEJveCk7Cit9CisKK2VudW0gY2xhc3MgVmVydGljYWxNYXJnaW4geyBCZWZvcmUsIEFmdGVyIH07
CitzdGF0aWMgaW5saW5lIGJvb2wgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGNvbnN0IEJveCYg
bGF5b3V0Qm94LCBWZXJ0aWNhbE1hcmdpbiB2ZXJ0aWNhbE1hcmdpbikKK3sKKyAgICBpZiAoIWxh
eW91dEJveC5pc0luRmxvdygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgYXV0byYgc3R5
bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICByZXR1cm4gKHZlcnRpY2FsTWFyZ2luID09IFZl
cnRpY2FsTWFyZ2luOjpCZWZvcmUgJiYgc3R5bGUuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSkgfHwg
KHZlcnRpY2FsTWFyZ2luID09IFZlcnRpY2FsTWFyZ2luOjpBZnRlciAmJiBzdHlsZS5oYXNNYXJn
aW5BZnRlclF1aXJrKCkpOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJr
czo6c2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0
IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmluUXVp
cmtzTW9kZSgpICYmIGhhc1F1aXJrTWFyZ2luVG9Db2xsYXBzZShsYXlvdXRCb3gsIFZlcnRpY2Fs
TWFyZ2luOjpCZWZvcmUpICYmIGlzUXVpcmtDb250YWluZXIobGF5b3V0Qm94LmNvbnRhaW5pbmdC
bG9jaygpKTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OnNob3Vs
ZENvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94JiBsYXlv
dXRCb3gpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkg
JiYgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGxheW91dEJveCwgVmVydGljYWxNYXJnaW46OkFm
dGVyKSAmJiBpc1F1aXJrQ29udGFpbmVyKGxheW91dEJveC5jb250YWluaW5nQmxvY2soKSk7Cit9
CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdTdGF0ZS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGlu
Zy9CbG9ja0Zvcm1hdHRpbmdTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjc0YTUwZmY2OTEzYWQxMmEw
OGQ1MmUzOTAyNzU5MTA3N2YyMzM1YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGlu
Z1N0YXRlLmNwcApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwor
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisg
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCisKKyNpZiBFTkFCTEUoTEFZ
T1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVz
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFL
RV9JU09fQUxMT0NBVEVEX0lNUEwoQmxvY2tGb3JtYXR0aW5nU3RhdGUpOworCitCbG9ja0Zvcm1h
dHRpbmdTdGF0ZTo6QmxvY2tGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYgZmxv
YXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQorICAgIDogRm9ybWF0dGluZ1N0
YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OkJsb2NrLCBsYXlvdXRTdGF0ZSkKK3sK
K30KKworQmxvY2tGb3JtYXR0aW5nU3RhdGU6On5CbG9ja0Zvcm1hdHRpbmdTdGF0ZSgpCit7Cit9
CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCBiL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Js
b2NrRm9ybWF0dGluZ1N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMWU2Y2Q2MTlkZDMxNmY1OWIzZjQwOWJm
MzVkNzA5NmQ5ZmI3YzhiMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRl
LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5B
QkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGb3JtYXR0aW5nU3Rh
dGUuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL1dlYWtIYXNo
U2V0Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCisvLyBC
bG9ja0Zvcm1hdHRpbmdTdGF0ZSBob2xkcyB0aGUgc3RhdGUgZm9yIGEgcGFydGljdWxhciBibG9j
ayBmb3JtYXR0aW5nIGNvbnRleHQgdHJlZS4KK2NsYXNzIEJsb2NrRm9ybWF0dGluZ1N0YXRlIDog
cHVibGljIEZvcm1hdHRpbmdTdGF0ZSB7CisgICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChCbG9j
a0Zvcm1hdHRpbmdTdGF0ZSk7CitwdWJsaWM6CisgICAgQmxvY2tGb3JtYXR0aW5nU3RhdGUoUmVm
PEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRlJik7CisgICAgfkJsb2NrRm9ybWF0dGluZ1N0
YXRlKCk7CisKKyAgICB2b2lkIHNldFVzZWRWZXJ0aWNhbE1hcmdpbihjb25zdCBCb3gmIGxheW91
dEJveCwgY29uc3QgVXNlZFZlcnRpY2FsTWFyZ2luJiB1c2VkVmVydGljYWxNYXJnaW4pIHsgbV91
c2VkVmVydGljYWxNYXJnaW5zLnNldCgmbGF5b3V0Qm94LCB1c2VkVmVydGljYWxNYXJnaW4pOyB9
CisgICAgVXNlZFZlcnRpY2FsTWFyZ2luIHVzZWRWZXJ0aWNhbE1hcmdpbihjb25zdCBCb3gmIGxh
eW91dEJveCkgY29uc3QgeyByZXR1cm4gbV91c2VkVmVydGljYWxNYXJnaW5zLmdldCgmbGF5b3V0
Qm94KTsgfQorICAgIGJvb2wgaGFzVXNlZFZlcnRpY2FsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0
Qm94KSBjb25zdCB7IHJldHVybiBtX3VzZWRWZXJ0aWNhbE1hcmdpbnMuY29udGFpbnMoJmxheW91
dEJveCk7IH0KKworICAgIHZvaWQgc2V0SGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYgbGF5b3V0Qm94
KSB7IG1fY2xlYXJhbmNlU2V0LmFkZChsYXlvdXRCb3gpOyB9CisgICAgdm9pZCBjbGVhckhhc0Ns
ZWFyYW5jZShjb25zdCBCb3gmIGxheW91dEJveCkgeyBtX2NsZWFyYW5jZVNldC5yZW1vdmUobGF5
b3V0Qm94KTsgfQorICAgIGJvb2wgaGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBj
b25zdCB7IHJldHVybiBtX2NsZWFyYW5jZVNldC5jb250YWlucyhsYXlvdXRCb3gpOyB9CisKK3By
aXZhdGU6CisgICAgSGFzaE1hcDxjb25zdCBCb3gqLCBVc2VkVmVydGljYWxNYXJnaW4+IG1fdXNl
ZFZlcnRpY2FsTWFyZ2luczsKKyAgICBXZWFrSGFzaFNldDxjb25zdCBCb3g+IG1fY2xlYXJhbmNl
U2V0OworfTsKKworfQorfQorCitTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRU
SU5HX1NUQVRFKEJsb2NrRm9ybWF0dGluZ1N0YXRlLCBpc0Jsb2NrRm9ybWF0dGluZ1N0YXRlKCkp
CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja01h
cmdpbkNvbGxhcHNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mMWZkNWJiZTIyYTFhYjkyZTg1MWQ4NTBkZTBm
NGE2YWQxODcxMGRiCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAK
QEAgLTAsMCArMSw2MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JN
QVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgorI2lu
Y2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUu
aCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3gu
aCIKKyNpbmNsdWRlICJMYXlvdXRVbml0LmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3N0YXRpYyBib29sIGhh
c0JvcmRlcihjb25zdCBCb3JkZXJWYWx1ZSYgYm9yZGVyVmFsdWUpCit7CisgICAgaWYgKGJvcmRl
clZhbHVlLnN0eWxlKCkgPT0gQm9yZGVyU3R5bGU6Ok5vbmUgfHwgYm9yZGVyVmFsdWUuc3R5bGUo
KSA9PSBCb3JkZXJTdHlsZTo6SGlkZGVuKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0
dXJuICEhYm9yZGVyVmFsdWUud2lkdGgoKTsKK30KKworc3RhdGljIGJvb2wgaGFzUGFkZGluZyhj
b25zdCBMZW5ndGgmIHBhZGRpbmdWYWx1ZSkKK3sKKyAgICAvLyBGSVhNRTogQ2hlY2sgaWYgcGVy
Y2VudCB2YWx1ZSBuZWVkcyB0byBiZSByZXNvbHZlZC4KKyAgICByZXR1cm4gIXBhZGRpbmdWYWx1
ZS5pc1plcm8oKTsKK30KKworc3RhdGljIGJvb2wgaGFzQm9yZGVyQmVmb3JlKGNvbnN0IEJveCYg
bGF5b3V0Qm94KQoreworICAgIHJldHVybiBoYXNCb3JkZXIobGF5b3V0Qm94LnN0eWxlKCkuYm9y
ZGVyQmVmb3JlKCkpOworfQorCitzdGF0aWMgYm9vbCBoYXNCb3JkZXJBZnRlcihjb25zdCBCb3gm
IGxheW91dEJveCkKK3sKKyAgICByZXR1cm4gaGFzQm9yZGVyKGxheW91dEJveC5zdHlsZSgpLmJv
cmRlckFmdGVyKCkpOworfQorCitzdGF0aWMgYm9vbCBoYXNQYWRkaW5nQmVmb3JlKGNvbnN0IEJv
eCYgbGF5b3V0Qm94KQoreworICAgIHJldHVybiBoYXNQYWRkaW5nKGxheW91dEJveC5zdHlsZSgp
LnBhZGRpbmdCZWZvcmUoKSk7Cit9CisKK3N0YXRpYyBib29sIGhhc1BhZGRpbmdBZnRlcihjb25z
dCBCb3gmIGxheW91dEJveCkKK3sKKyAgICByZXR1cm4gaGFzUGFkZGluZyhsYXlvdXRCb3guc3R5
bGUoKS5wYWRkaW5nQWZ0ZXIoKSk7Cit9CisKK3N0YXRpYyBib29sIGVzdGFibGlzaGVzQmxvY2tG
b3JtYXR0aW5nQ29udGV4dChjb25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICAvLyBXZWJLaXQg
dHJlYXRzIHRoZSBkb2N1bWVudCBlbGVtZW50IHJlbmRlcmVyIGFzIGEgYmxvY2sgZm9ybWF0dGlu
ZyBjb250ZXh0IHJvb3QuIEl0IHByb2JhYmx5IG9ubHkgaW1wYWN0cyBtYXJnaW4gY29sbGFwc2lu
Zywgc28gbGV0J3Mgbm90IGRvCisgICAgLy8gYSBsYXlvdXQgd2lkZSBxdWlyayBvbiB0aGlzIGZv
ciBub3cuCisgICAgaWYgKGxheW91dEJveC5pc0RvY3VtZW50Qm94KCkpCisgICAgICAgIHJldHVy
biB0cnVlOworICAgIHJldHVybiBsYXlvdXRCb3guZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0KCk7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFw
c2U6Omhhc0NsZWFyYW5jZShjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBpZiAo
IWxheW91dEJveC5oYXNGbG9hdENsZWFyKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAv
LyBGSVhNRTogcHJlY29tcHV0ZWRWZXJ0aWNhbFBvc2l0aW9uRm9yRm9ybWF0dGluZ1Jvb3QgbG9n
aWMgZW5kcyB1cCBjYWxsaW5nIGludG8gdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBsYXlvdXRCb3gg
KGZpcnN0IGluZmxvdyBjaGlsZCkgaGFzCisgICAgLy8gbm90IGJlZW4gbGFpZCBvdXQuCisgICAg
cmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkuZm9ybWF0dGluZ1N0YXRlKCkuaGFzQ2xlYXJhbmNl
KGxheW91dEJveCk7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29s
bGFwc2U6Om1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBC
b3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICAvLyAxLiBUaGlzIGlzIHRoZSBsYXN0IGluLWZs
b3cgY2hpbGQgYW5kIGl0cyBtYXJnaW5zIGNvbGxhcHNlIHRocm91Z2ggYW5kIHRoZSBtYXJnaW4g
YWZ0ZXIgY29sbGFwc2VzIHdpdGggcGFyZW50J3MgbWFyZ2luIGFmdGVyIG9yCisgICAgLy8gMi4g
VGhpcyBib3gncyBtYXJnaW4gYWZ0ZXIgY29sbGFwc2VzIHdpdGggdGhlIG5leHQgc2libGluZydz
IG1hcmdpbiBiZWZvcmUgYW5kIHRoYXQgc2libGluZyBjb2xsYXBzZXMgdGhyb3VnaCBhbmQKKyAg
ICAvLyB3ZSBjYW4gZ2V0IHRvIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgbGlrZSB0aGF0LgorICAg
IGF1dG8qIGxhc3RJbkZsb3dDaGlsZCA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5sYXN0
SW5GbG93Q2hpbGQoKTsKKyAgICBmb3IgKGF1dG8qIGN1cnJlbnRCb3ggPSAmbGF5b3V0Qm94OyBj
dXJyZW50Qm94OyBjdXJyZW50Qm94ID0gY3VycmVudEJveC0+bmV4dEluRmxvd1NpYmxpbmcoKSkg
eworICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKmN1cnJlbnRCb3gpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoY3VycmVudEJveCA9PSBsYXN0SW5G
bG93Q2hpbGQpCisgICAgICAgICAgICByZXR1cm4gbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFy
ZW50TWFyZ2luQWZ0ZXIoKmN1cnJlbnRCb3gpOyAKKyAgICAgICAgaWYgKCFtYXJnaW5BZnRlckNv
bGxhcHNlc1dpdGhOZXh0U2libGluZ01hcmdpbkJlZm9yZSgqY3VycmVudEJveCkpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
IHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5D
b2xsYXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShjb25z
dCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICAvLyBUaGUgZmlyc3QgaW5mbG93IGNoaWxk
IGNvdWxkIHByb3BhZ2F0ZSBpdHMgdG9wIG1hcmdpbiB0byBwYXJlbnQuCisgICAgLy8gaHR0cHM6
Ly93d3cudzMub3JnL1RSL0NTUzIxL2JveC5odG1sI2NvbGxhcHNpbmctbWFyZ2lucworICAgIEFT
U0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworCisgICAgaWYgKGZvcm1hdHRpbmdD
b250ZXh0KCkucXVpcmtzKCkuc2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50TWFy
Z2luQmVmb3JlKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gTWFy
Z2lucyBiZXR3ZWVuIGEgZmxvYXRlZCBib3ggYW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxh
cHNlLgorICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgLy8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQg
Ym94ZXMgZG8gbm90IGNvbGxhcHNlLgorICAgIGlmIChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3Np
dGlvbmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE1hcmdpbnMgb2YgaW5s
aW5lLWJsb2NrIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KKyAgICBpZiAobGF5b3V0Qm94LmlzSW5s
aW5lQmxvY2tCb3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gT25seSB0aGUg
Zmlyc3QgaW5sZmxvdyBjaGlsZCBjb2xsYXBzZXMgd2l0aCBwYXJlbnQuCisgICAgaWYgKGxheW91
dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOwor
ICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1h
dHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJl
bgorICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmluZ0Js
b2NrKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGhhc0JvcmRlckJlZm9yZShj
b250YWluaW5nQmxvY2spKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaGFzUGFk
ZGluZ0JlZm9yZShjb250YWluaW5nQmxvY2spKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAvLyAuLi5hbmQgdGhlIGNoaWxkIGhhcyBubyBjbGVhcmFuY2UuCisgICAgaWYgKGhhc0NsZWFy
YW5jZShsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFy
Z2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGNvbnN0IEJv
eCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVs
Qm94KCkpOworCisgICAgaWYgKCFsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9
ICpsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7CisgICAgLy8gTWFyZ2lucyBiZXR3
ZWVuIGEgZmxvYXRlZCBib3ggYW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxhcHNlLgorICAg
IGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSB8fCBwcmV2aW91c0luRmxvd1Np
YmxpbmcuaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxh
cHNlLgorICAgIGlmICgobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFsYXlv
dXRCb3guc3R5bGUoKS50b3AoKS5pc0F1dG8oKSkKKyAgICAgICAgfHwgKHByZXZpb3VzSW5GbG93
U2libGluZy5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhcHJldmlvdXNJbkZsb3dTaWJsaW5n
LnN0eWxlKCkuYm90dG9tKCkuaXNBdXRvKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCisgICAg
aWYgKGxheW91dEJveC5pc0lubGluZUJsb2NrQm94KCkgfHwgcHJldmlvdXNJbkZsb3dTaWJsaW5n
LmlzSW5saW5lQmxvY2tCb3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhl
IGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jay1sZXZlbCBlbGVtZW50IGFsd2F5cyBj
b2xsYXBzZXMgd2l0aCB0aGUgdG9wIG1hcmdpbiBvZgorICAgIC8vIGl0cyBuZXh0IGluLWZsb3cg
YmxvY2stbGV2ZWwgc2libGluZywgdW5sZXNzIHRoYXQgc2libGluZyBoYXMgY2xlYXJhbmNlLgor
ICAgIGlmIChoYXNDbGVhcmFuY2UobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFy
Z2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxkTWFy
Z2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIEFTU0VSVChsYXlv
dXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhh
dCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNl
IHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJlbi4KKyAgICBpZiAoZXN0YWJsaXNoZXNCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0KGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIFRoZSB0b3AgbWFyZ2luIG9mIGFuIGluLWZsb3cgYmxvY2sgZWxlbWVudCBjb2xsYXBzZXMg
d2l0aCBpdHMgZmlyc3QgaW4tZmxvdyBibG9jay1sZXZlbAorICAgIC8vIGNoaWxkJ3MgdG9wIG1h
cmdpbiBpZiB0aGUgZWxlbWVudCBoYXMgbm8gdG9wIGJvcmRlci4uLgorICAgIGlmIChoYXNCb3Jk
ZXJCZWZvcmUobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gLi4u
bm8gdG9wIHBhZGRpbmcKKyAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShsYXlvdXRCb3gpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94
KSB8fCAhZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxvd0NoaWxkKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8mIGZpcnN0SW5GbG93Q2hpbGQgPSAq
ZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93Q2hpbGQoKTsKKyAg
ICBpZiAoIWZpcnN0SW5GbG93Q2hpbGQuaXNCbG9ja0xldmVsQm94KCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIC8vIC4uLmFuZCB0aGUgY2hpbGQgaGFzIG5vIGNsZWFyYW5jZS4KKyAg
ICBpZiAoaGFzQ2xlYXJhbmNlKGZpcnN0SW5GbG93Q2hpbGQpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFw
c2UuCisgICAgaWYgKGZpcnN0SW5GbG93Q2hpbGQuaXNJbmxpbmVCbG9ja0JveCgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoU2li
bGluZ01hcmdpbkJlZm9yZVdpdGhDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0
Cit7CisgICAgLy8gSWYgdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgb2YgYW4gZWxlbWVudCB3
aXRoIGNsZWFyYW5jZSBhcmUgYWRqb2luaW5nLCBpdHMgbWFyZ2lucyBjb2xsYXBzZSB3aXRoIHRo
ZSBhZGpvaW5pbmcgbWFyZ2lucworICAgIC8vIG9mIGZvbGxvd2luZyBzaWJsaW5ncyBidXQgdGhh
dCByZXN1bHRpbmcgbWFyZ2luIGRvZXMgbm90IGNvbGxhcHNlIHdpdGggdGhlIGJvdHRvbSBtYXJn
aW4gb2YgdGhlIHBhcmVudCBibG9jay4KKyAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2go
bGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChhdXRvKiBwcmV2
aW91c1NpYmxpbmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7IHByZXZpb3Vz
U2libGluZzsgcHJldmlvdXNTaWJsaW5nID0gcHJldmlvdXNTaWJsaW5nLT5wcmV2aW91c0luRmxv
d1NpYmxpbmcoKSkgeworICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKnByZXZp
b3VzU2libGluZykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChoYXND
bGVhcmFuY2UoKnByZXZpb3VzU2libGluZykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZv
cmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgLy8gMS4gVGhpcyBpcyB0aGUg
Zmlyc3QgaW4tZmxvdyBjaGlsZCBhbmQgaXRzIG1hcmdpbnMgY29sbGFwc2UgdGhyb3VnaCBhbmQg
dGhlIG1hcmdpbiBiZWZvcmUgY29sbGFwc2VzIHdpdGggcGFyZW50J3MgbWFyZ2luIGJlZm9yZSBv
cgorICAgIC8vIDIuIFRoaXMgYm94J3MgbWFyZ2luIGJlZm9yZSBjb2xsYXBzZXMgd2l0aCB0aGUg
cHJldmlvdXMgc2libGluZydzIG1hcmdpbiBhZnRlciBhbmQgdGhhdCBzaWJsaW5nIGNvbGxhcHNl
cyB0aHJvdWdoIGFuZAorICAgIC8vIHdlIGNhbiBnZXQgdG8gdGhlIGZpcnN0IGluLWZsb3cgY2hp
bGQgbGlrZSB0aGF0LgorICAgIGF1dG8qIGZpcnN0SW5GbG93Q2hpbGQgPSBsYXlvdXRCb3guY29u
dGFpbmluZ0Jsb2NrKCkuZmlyc3RJbkZsb3dDaGlsZCgpOworICAgIGZvciAoYXV0byogY3VycmVu
dEJveCA9ICZsYXlvdXRCb3g7IGN1cnJlbnRCb3g7IGN1cnJlbnRCb3ggPSBjdXJyZW50Qm94LT5w
cmV2aW91c0luRmxvd1NpYmxpbmcoKSkgeworICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRo
cm91Z2goKmN1cnJlbnRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBp
ZiAoY3VycmVudEJveCA9PSBmaXJzdEluRmxvd0NoaWxkKQorICAgICAgICAgICAgcmV0dXJuIG1h
cmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUoKmN1cnJlbnRCb3gpOyAK
KyAgICAgICAgaWYgKCFtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5nTWFy
Z2luQWZ0ZXIoKmN1cnJlbnRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wg
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkFmdGVyQ29sbGFw
c2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAorewor
ICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworCisgICAgaWYgKGZvcm1h
dHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhQYXJl
bnRNYXJnaW5BZnRlcihsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8v
IE1hcmdpbnMgYmV0d2VlbiBhIGZsb2F0ZWQgYm94IGFuZCBhbnkgb3RoZXIgYm94IGRvIG5vdCBj
b2xsYXBzZS4KKyAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE1hcmdpbnMgb2YgYWJzb2x1dGVseSBwb3NpdGlv
bmVkIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KKyAgICBpZiAobGF5b3V0Qm94LmlzT3V0T2ZGbG93
UG9zaXRpb25lZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBNYXJnaW5zIG9m
IGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCisgICAgaWYgKGxheW91dEJveC5p
c0lubGluZUJsb2NrQm94KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE9ubHkg
dGhlIGxhc3QgaW5sZmxvdyBjaGlsZCBjb2xsYXBzZXMgd2l0aCBwYXJlbnQuCisgICAgaWYgKGxh
eW91dEJveC5uZXh0SW5GbG93U2libGluZygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBhdXRvJiBjb250YWluaW5nQmxvY2sgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7Cisg
ICAgLy8gTWFyZ2lucyBvZiBlbGVtZW50cyB0aGF0IGVzdGFibGlzaCBuZXcgYmxvY2sgZm9ybWF0
dGluZyBjb250ZXh0cyBkbyBub3QgY29sbGFwc2Ugd2l0aCB0aGVpciBpbi1mbG93IGNoaWxkcmVu
LgorICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmluZ0Js
b2NrKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4g
b2YgYW4gaW4tZmxvdyBibG9jayBib3ggd2l0aCBhICdoZWlnaHQnIG9mICdhdXRvJyBjb2xsYXBz
ZXMgd2l0aCBpdHMgbGFzdCBpbi1mbG93IGJsb2NrLWxldmVsIGNoaWxkJ3MgYm90dG9tIG1hcmdp
biwgaWY6CisgICAgaWYgKCFjb250YWluaW5nQmxvY2suc3R5bGUoKS5oZWlnaHQoKS5pc0F1dG8o
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9t
IHBhZGRpbmcsIGFuZAorICAgIGlmIChoYXNQYWRkaW5nQWZ0ZXIoY29udGFpbmluZ0Jsb2NrKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIGJv
cmRlciwgYW5kCisgICAgaWYgKGhhc0JvcmRlckFmdGVyKGNvbnRhaW5pbmdCbG9jaykpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4gbmVp
dGhlciBjb2xsYXBzZXMgd2l0aCBhIHRvcCBtYXJnaW4gdGhhdCBoYXMgY2xlYXJhbmNlLi4uCisg
ICAgaWYgKG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xl
YXJhbmNlKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIG5vciAo
aWYgdGhlIGJveCdzIG1pbi1oZWlnaHQgaXMgbm9uLXplcm8pIHdpdGggdGhlIGJveCdzIHRvcCBt
YXJnaW4uCisgICAgYXV0byBjb21wdXRlZE1pbkhlaWdodCA9IGNvbnRhaW5pbmdCbG9jay5zdHls
ZSgpLmxvZ2ljYWxNaW5IZWlnaHQoKTsKKyAgICBpZiAoIWNvbXB1dGVkTWluSGVpZ2h0LmlzQXV0
bygpICYmIGNvbXB1dGVkTWluSGVpZ2h0LnZhbHVlKCkgJiYgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNX
aXRoUGFyZW50TWFyZ2luQmVmb3JlKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1h
cmdpbkNvbGxhcHNlOjptYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhMYXN0SW5GbG93Q2hpbGRNYXJn
aW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0
Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKKworICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhh
dCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNl
IHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJlbi4KKyAgICBpZiAoZXN0YWJsaXNoZXNCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0KGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxDb250YWluZXJC
b3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgYXV0byYgbGFzdEluRmxvd0NoaWxkID0gKmRvd25jYXN0PENvbnRhaW5lckJveD4obGF5
b3V0Qm94KS5sYXN0SW5GbG93Q2hpbGQoKTsKKyAgICBpZiAoIWxhc3RJbkZsb3dDaGlsZC5pc0Js
b2NrTGV2ZWxCb3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlIGJvdHRv
bSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jayBib3ggd2l0aCBhICdoZWlnaHQnIG9mICdhdXRv
JyBjb2xsYXBzZXMgd2l0aCBpdHMgbGFzdCBpbi1mbG93IGJsb2NrLWxldmVsIGNoaWxkJ3MgYm90
dG9tIG1hcmdpbiwgaWY6CisgICAgaWYgKCFsYXlvdXRCb3guc3R5bGUoKS5oZWlnaHQoKS5pc0F1
dG8oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90
dG9tIHBhZGRpbmcsIGFuZAorICAgIGlmIChoYXNQYWRkaW5nQWZ0ZXIobGF5b3V0Qm94KSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIGJvcmRl
ciwgYW5kCisgICAgaWYgKGhhc0JvcmRlckFmdGVyKGxheW91dEJveCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIC8vIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4gbmVpdGhlciBjb2xs
YXBzZXMgd2l0aCBhIHRvcCBtYXJnaW4gdGhhdCBoYXMgY2xlYXJhbmNlLi4uCisgICAgaWYgKG1h
cmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGxh
c3RJbkZsb3dDaGlsZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIG5vciAoaWYg
dGhlIGJveCdzIG1pbi1oZWlnaHQgaXMgbm9uLXplcm8pIHdpdGggdGhlIGJveCdzIHRvcCBtYXJn
aW4uCisgICAgYXV0byBjb21wdXRlZE1pbkhlaWdodCA9IGxheW91dEJveC5zdHlsZSgpLmxvZ2lj
YWxNaW5IZWlnaHQoKTsKKyAgICBpZiAoIWNvbXB1dGVkTWluSGVpZ2h0LmlzQXV0bygpICYmIGNv
bXB1dGVkTWluSGVpZ2h0LnZhbHVlKCkKKyAgICAgICAgJiYgKG1hcmdpbkFmdGVyQ29sbGFwc2Vz
V2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXN0SW5GbG93Q2hpbGQpIHx8IGhhc0NsZWFyYW5jZShs
YXN0SW5GbG93Q2hpbGQpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTWFyZ2lu
cyBvZiBpbmxpbmUtYmxvY2sgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgorICAgIGlmIChsYXN0SW5G
bG93Q2hpbGQuaXNJbmxpbmVCbG9ja0JveCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAvLyBUaGlzIGlzIGEgcXVpcmsgYmVoYXZpb3I6IFdoZW4gdGhlIG1hcmdpbiBhZnRlciBvZiB0
aGUgbGFzdCBpbmZsb3cgY2hpbGQgKG9yIGEgcHJldmlvdXMgc2libGluZyB3aXRoIGNvbGxhcHNl
ZCB0aHJvdWdoIG1hcmdpbnMpCisgICAgLy8gY29sbGFwc2VzIHdpdGggYSBxdWlyayBwYXJlbnQn
cyB0aGUgbWFyZ2luIGJlZm9yZSwgdGhlbiB0aGUgc2FtZSBtYXJnaW4gYWZ0ZXIgZG9lcyBub3Qg
Y29sbGFwc2VzIHdpdGggdGhlIHBhcmVudCdzIG1hcmdpbiBhZnRlci4KKyAgICBpZiAoZm9ybWF0
dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihs
YXlvdXRCb3gpICYmIG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShs
YXN0SW5GbG93Q2hpbGQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFy
Z2luQWZ0ZXJDb2xsYXBzZXNXaXRoTmV4dFNpYmxpbmdNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBs
YXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3go
KSk7CisKKyAgICBpZiAoIWxheW91dEJveC5uZXh0SW5GbG93U2libGluZygpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZp
b3VzU2libGluZ01hcmdpbkFmdGVyKCpsYXlvdXRCb3gubmV4dEluRmxvd1NpYmxpbmcoKSk7Cit9
CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbnND
b2xsYXBzZVRocm91Z2goY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJU
KGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7CisKKyAgICAvLyBBIGJveCdzIG93biBtYXJn
aW5zIGNvbGxhcHNlIGlmIHRoZSAnbWluLWhlaWdodCcgcHJvcGVydHkgaXMgemVybywgYW5kIGl0
IGhhcyBuZWl0aGVyIHRvcCBvciBib3R0b20gYm9yZGVycyBub3IgdG9wIG9yIGJvdHRvbSBwYWRk
aW5nLAorICAgIC8vIGFuZCBpdCBoYXMgYSAnaGVpZ2h0JyBvZiBlaXRoZXIgMCBvciAnYXV0bycs
IGFuZCBpdCBkb2VzIG5vdCBjb250YWluIGEgbGluZSBib3gsIGFuZCBhbGwgb2YgaXRzIGluLWZs
b3cgY2hpbGRyZW4ncyBtYXJnaW5zIChpZiBhbnkpIGNvbGxhcHNlLgorICAgIGlmIChoYXNCb3Jk
ZXJCZWZvcmUobGF5b3V0Qm94KSB8fCBoYXNCb3JkZXJBZnRlcihsYXlvdXRCb3gpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShsYXlvdXRCb3gpIHx8
IGhhc1BhZGRpbmdBZnRlcihsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAvLyBNYXJnaW5zIGFyZSBub3QgYWRqb2luaW5nIHdoZW4gdGhlIGJveCBoYXMgY2xlYXJhbmNl
LgorICAgIGlmIChoYXNDbGVhcmFuY2UobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICBhdXRvIGNvbXB1
dGVkSGVpZ2h0VmFsdWVJc1plcm8gPSBzdHlsZS5oZWlnaHQoKS5pc0ZpeGVkKCkgJiYgIXN0eWxl
LmhlaWdodCgpLnZhbHVlKCk7CisgICAgaWYgKCEoc3R5bGUuaGVpZ2h0KCkuaXNBdXRvKCkgfHwg
Y29tcHV0ZWRIZWlnaHRWYWx1ZUlzWmVybykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIEZJWE1FOiBDaGVjayBmb3IgY29tcHV0ZWQgMCBoZWlnaHQuCisgICAgaWYgKCFzdHlsZS5t
aW5IZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklY
TUU6IEJsb2NrIHJlcGxhY2VkIGJveGVzIGNsZWFybHkgZG9uJ3QgY29sbGFwc2UgdGhyb3VnaCB0
aGVpciBtYXJnaW5zLCBidXQgSSBjb3VsZG4ndCBmaW5kIGl0IGluIHRoZSBzcGVjIHlldCAoYW5k
IG5vLCBpdCdzIG5vdCBhIHF1aXJrKS4KKyAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3go
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxh
eW91dEJveCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFkb3duY2FzdDxDb250
YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKKyAgICAgICAgcmV0dXJuICFl
c3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQobGF5b3V0Qm94KTsKKworICAgIGlmIChs
YXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKSB7CisgICAgICAgIGlmIChs
YXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7CisgICAgICAg
ICAgICBhdXRvJiBsYXlvdXRTdGF0ZSA9IHRoaXMtPmxheW91dFN0YXRlKCk7CisgICAgICAgICAg
ICAvLyBJZiB3ZSBnZXQgaGVyZSB0aHJvdWdoIG1hcmdpbiBlc3RpbWF0aW9uLCB3ZSBkb24ndCBu
ZWNlc3NhcmlseSBoYXZlIGFuIGFjdHVhbCBzdGF0ZSBmb3IgdGhpcyBsYXlvdXQgYm94IHNpbmNl
CisgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHN0YXJ0ZWQgbGF5aW5nIGl0IG91dCB5ZXQuCisg
ICAgICAgICAgICBhdXRvJiBjb250YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxh
eW91dEJveCk7CisgICAgICAgICAgICBpZiAoIWxheW91dFN0YXRlLmhhc0lubGluZUZvcm1hdHRp
bmdTdGF0ZShjb250YWluZXJCb3gpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgICAgICAgICAgYXV0byBpc0NvbnNpZGVyZWRFbXB0eSA9IFsmXSB7CisgICAgICAgICAgICAg
ICAgYXV0byYgaW5saW5lRm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUuZXN0YWJsaXNoZWRJ
bmxpbmVGb3JtYXR0aW5nU3RhdGUoY29udGFpbmVyQm94KTsKKyAgICAgICAgICAgICAgICBpZiAo
IWlubGluZUZvcm1hdHRpbmdTdGF0ZS5saW5lcygpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIC8vIEFueSBmbG9hdCBib3ggaW4g
dGhpcyBmb3JtYXR0aW5nIGNvbnRleHQgcHJldmVudHMgY29sbGFwc2luZyB0aHJvdWdoLgorICAg
ICAgICAgICAgICAgIGF1dG8mIGZsb2F0cyA9IGlubGluZUZvcm1hdHRpbmdTdGF0ZS5mbG9hdGlu
Z1N0YXRlKCkuZmxvYXRzKCk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBmbG9hdEl0ZW0g
OiBmbG9hdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZsb2F0SXRlbS5pc0luRm9ybWF0
dGluZ0NvbnRleHRPZihjb250YWluZXJCb3gpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICByZXR1cm4gaXNDb25zaWRlcmVkRW1wdHko
KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEEgcm9vdCBvZiBhIG5vbi1pbmxpbmUgZm9ybWF0
dGluZyBjb250ZXh0ICh0YWJsZSwgZmxleCBldGMpIHdpdGggaW5mbG93IGRlc2NlbmRhbnRzIHNo
b3VsZCBub3QgY29sbGFwc2UgdGhyb3VnaC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KworICAgIGZvciAoYXV0byogaW5mbG93Q2hpbGQgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxh
eW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsgaW5mbG93Q2hpbGQ7IGluZmxv
d0NoaWxkID0gaW5mbG93Q2hpbGQtPm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7Cisg
ICAgICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKmluZmxvd0NoaWxk
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtYXJnaW5zQ29sbGFw
c2VUaHJvdWdoKCppbmZsb3dDaGlsZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorICAgIHJldHVybiB0cnVlOworfQorCitVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5k
TmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFw
c2U6OmNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihVc2VkVmVydGljYWxNYXJnaW46
OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgYSwgVXNlZFZlcnRpY2FsTWFyZ2luOjpQ
b3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIGIpIGNvbnN0Cit7CisgICAgVXNlZFZlcnRp
Y2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIGNvbXB1dGVkVmFsdWVz
OworICAgIGlmIChhLnBvc2l0aXZlICYmIGIucG9zaXRpdmUpCisgICAgICAgIGNvbXB1dGVkVmFs
dWVzLnBvc2l0aXZlID0gc3RkOjptYXgoKmEucG9zaXRpdmUsICpiLnBvc2l0aXZlKTsKKyAgICBl
bHNlCisgICAgICAgIGNvbXB1dGVkVmFsdWVzLnBvc2l0aXZlID0gYS5wb3NpdGl2ZSA/IGEucG9z
aXRpdmUgOiBiLnBvc2l0aXZlOworCisgICAgaWYgKGEubmVnYXRpdmUgJiYgYi5uZWdhdGl2ZSkK
KyAgICAgICAgY29tcHV0ZWRWYWx1ZXMubmVnYXRpdmUgPSBzdGQ6Om1pbigqYS5uZWdhdGl2ZSwg
KmIubmVnYXRpdmUpOworICAgIGVsc2UKKyAgICAgICAgY29tcHV0ZWRWYWx1ZXMubmVnYXRpdmUg
PSBhLm5lZ2F0aXZlID8gYS5uZWdhdGl2ZSA6IGIubmVnYXRpdmU7CisKKyAgICBpZiAoYS5pc05v
blplcm8oKSAmJiBiLmlzTm9uWmVybygpKQorICAgICAgICBjb21wdXRlZFZhbHVlcy5pc1F1aXJr
ID0gYS5pc1F1aXJrIHx8IGIuaXNRdWlyazsKKyAgICBlbHNlIGlmIChhLmlzTm9uWmVybygpKQor
ICAgICAgICBjb21wdXRlZFZhbHVlcy5pc1F1aXJrID0gYS5pc1F1aXJrOworICAgIGVsc2UKKyAg
ICAgICAgY29tcHV0ZWRWYWx1ZXMuaXNRdWlyayA9IGIuaXNRdWlyazsKKworICAgIHJldHVybiBj
b21wdXRlZFZhbHVlczsKK30KKworT3B0aW9uYWw8TGF5b3V0VW5pdD4gQmxvY2tGb3JtYXR0aW5n
Q29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpblZhbHVlKFVzZWRWZXJ0aWNhbE1hcmdpbjo6
UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBtYXJnaW5WYWx1ZXMpIGNvbnN0Cit7Cisg
ICAgLy8gV2hlbiB0d28gb3IgbW9yZSBtYXJnaW5zIGNvbGxhcHNlLCB0aGUgcmVzdWx0aW5nIG1h
cmdpbiB3aWR0aCBpcyB0aGUgbWF4aW11bSBvZiB0aGUgY29sbGFwc2luZyBtYXJnaW5zJyB3aWR0
aHMuCisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgbmVnYXRpdmUgbWFyZ2lucywgdGhlIG1heGltdW0g
b2YgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgbmVnYXRpdmUgYWRqb2luaW5nIG1hcmdpbnMg
aXMgZGVkdWN0ZWQgZnJvbSB0aGUgbWF4aW11bQorICAgIC8vIG9mIHRoZSBwb3NpdGl2ZSBhZGpv
aW5pbmcgbWFyZ2lucy4gSWYgdGhlcmUgYXJlIG5vIHBvc2l0aXZlIG1hcmdpbnMsIHRoZSBtYXhp
bXVtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGFkam9pbmluZyBtYXJnaW5zIGlzIGRl
ZHVjdGVkIGZyb20gemVyby4KKyAgICBpZiAoIW1hcmdpblZhbHVlcy5uZWdhdGl2ZSkKKyAgICAg
ICAgcmV0dXJuIG1hcmdpblZhbHVlcy5wb3NpdGl2ZTsKKworICAgIGlmICghbWFyZ2luVmFsdWVz
LnBvc2l0aXZlKQorICAgICAgICByZXR1cm4gbWFyZ2luVmFsdWVzLm5lZ2F0aXZlOworCisgICAg
cmV0dXJuICptYXJnaW5WYWx1ZXMucG9zaXRpdmUgKyAqbWFyZ2luVmFsdWVzLm5lZ2F0aXZlOwor
fQorCit2b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjp1cGRhdGVN
YXJnaW5BZnRlckZvclByZXZpb3VzU2libGluZyhCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBibG9j
a0Zvcm1hdHRpbmdDb250ZXh0LCBjb25zdCBNYXJnaW5Db2xsYXBzZSYgbWFyZ2luQ29sbGFwc2Us
IGNvbnN0IEJveCYgbGF5b3V0Qm94KQoreworICAgIC8vIDEuIEdldCB0aGUgbWFyZ2luIGJlZm9y
ZSB2YWx1ZSBmcm9tIHRoZSBuZXh0IGluLWZsb3cgc2libGluZy4gVGhpcyBpcyB0aGUgc2FtZSBh
cyB0aGlzIGJveCdzIG1hcmdpbiBhZnRlciB2YWx1ZSBub3cgc2luY2UgdGhleSBhcmUgY29sbGFw
c2VkLgorICAgIC8vIDIuIFVwZGF0ZSB0aGUgY29sbGFwc2VkIG1hcmdpbiBhZnRlciB2YWx1ZSBh
cyB3ZWxsIGFzIHRoZSBwb3NpdGl2ZS9uZWdhdGl2ZSBjYWNoZS4KKyAgICAvLyAzLiBDaGVjayBp
ZiB0aGUgYm94J3MgbWFyZ2lucyBjb2xsYXBzZSB0aHJvdWdoLgorICAgIC8vIDQuIElmIHNvLCB1
cGRhdGUgdGhlIHBvc2l0aXZlL25lZ2F0aXZlIGNhY2hlLgorICAgIC8vIDUuIEluIGNhc2Ugb2Yg
Y29sbGFwc2VkIHRocm91Z2ggbWFyZ2lucyBjaGVjayBpZiB0aGUgYmVmb3JlIG1hcmdpbiBjb2xs
YXBlcyB3aXRoIHRoZSBwcmV2aW91cyBpbmZsb3cgc2libGluZydzIGFmdGVyIG1hcmdpbi4KKyAg
ICAvLyA2LiBJZiBzbywganVtcCB0byAjMi4KKyAgICAvLyA3LiBObyBuZWVkIHRvIHByb3BhZ2F0
ZSB0byBwYXJlbnQgYmVjYXVzZSBpdHMgbWFyZ2luIGlzIG5vdCBjb21wdXRlZCB5ZXQgKHByZS1j
b21wdXRlZCBhdCBtb3N0KS4KKyAgICBhdXRvKiBjdXJyZW50Qm94ID0gJmxheW91dEJveDsKKyAg
ICBhdXRvJiBibG9ja0Zvcm1hdHRpbmdTdGF0ZSA9IGJsb2NrRm9ybWF0dGluZ0NvbnRleHQuZm9y
bWF0dGluZ1N0YXRlKCk7CisgICAgd2hpbGUgKG1hcmdpbkNvbGxhcHNlLm1hcmdpbkJlZm9yZUNv
bGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVudEJveCkpIHsKKyAg
ICAgICAgYXV0byYgcHJldmlvdXNTaWJsaW5nID0gKmN1cnJlbnRCb3gtPnByZXZpb3VzSW5GbG93
U2libGluZygpOworICAgICAgICBhdXRvIHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luID0g
YmxvY2tGb3JtYXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKHByZXZpb3VzU2libGluZyk7
CisKKyAgICAgICAgYXV0byBjb2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkJlZm9yZSA9IHByZXZpb3Vz
U2libGluZ1ZlcnRpY2FsTWFyZ2luLmNvbGxhcHNlZFZhbHVlcy5iZWZvcmU7CisgICAgICAgIGF1
dG8gY29sbGFwc2VkVmVydGljYWxNYXJnaW5BZnRlciA9IGJsb2NrRm9ybWF0dGluZ0NvbnRleHQu
Z2VvbWV0cnlGb3JCb3goKmN1cnJlbnRCb3gpLm1hcmdpbkJlZm9yZSgpOworCisgICAgICAgIGF1
dG8gbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCA9IG1hcmdpbkNvbGxhcHNlLm1hcmdpbnNDb2xsYXBz
ZVRocm91Z2gocHJldmlvdXNTaWJsaW5nKTsKKyAgICAgICAgaWYgKG1hcmdpbnNDb2xsYXBzZVRo
cm91Z2gpCisgICAgICAgICAgICBjb2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkJlZm9yZSA9IGNvbGxh
cHNlZFZlcnRpY2FsTWFyZ2luQWZ0ZXI7CisKKyAgICAgICAgLy8gVXBkYXRlIHBvc2l0aXZlL25l
Z2F0aXZlIGNhY2hlLgorICAgICAgICBhdXRvIHByZXZpb3VzU2libGluZ1Bvc2l0aXZlTmVnYXRp
dmVNYXJnaW4gPSBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlv
dXNTaWJsaW5nKS5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzOworICAgICAgICBhdXRvIHBvc2l0
aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUgPSBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGlj
YWxNYXJnaW4oKmN1cnJlbnRCb3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlOwor
CisgICAgICAgIGF1dG8gYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbiA9IHBy
ZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luOworICAgICAgICBhZGp1c3RlZFByZXZpb3VzU2li
bGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0ZXIgPSBtYXJn
aW5Db2xsYXBzZS5jb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4ocG9zaXRpdmVOZWdh
dGl2ZU1hcmdpbkJlZm9yZSwgcHJldmlvdXNTaWJsaW5nUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbi5h
ZnRlcik7CisgICAgICAgIGlmIChtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKSB7CisgICAgICAgICAg
ICBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRp
dmVWYWx1ZXMuYmVmb3JlID0gbWFyZ2luQ29sbGFwc2UuY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0
aXZlTWFyZ2luKHByZXZpb3VzU2libGluZ1Bvc2l0aXZlTmVnYXRpdmVNYXJnaW4uYmVmb3JlLCBh
ZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVW
YWx1ZXMuYWZ0ZXIpOworICAgICAgICAgICAgYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNh
bE1hcmdpbi5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmFmdGVyID0gYWRqdXN0ZWRQcmV2aW91
c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbi5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmJlZm9yZTsK
KyAgICAgICAgfQorICAgICAgICBibG9ja0Zvcm1hdHRpbmdTdGF0ZS5zZXRVc2VkVmVydGljYWxN
YXJnaW4ocHJldmlvdXNTaWJsaW5nLCBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFy
Z2luKTsKKworICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2gpCisgICAgICAgICAg
ICBicmVhazsKKworICAgICAgICBjdXJyZW50Qm94ID0gJnByZXZpb3VzU2libGluZzsKKyAgICB9
Cit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVl
cyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdhdGl2
ZVZhbHVlcyhjb25zdCBCb3gmIGxheW91dEJveCwgTWFyZ2luVHlwZSBtYXJnaW5UeXBlKSBjb25z
dAoreworICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZm9y
bWF0dGluZ1N0YXRlKCk7CisgICAgLy8gQnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUgaW4gQkZDIGxh
eW91dCB0byBnYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZm9yIGVp
dGhlciBhIHByZXZpb3VzIHNpYmxpbmcgb3IgYSBjaGlsZCBib3gsCisgICAgLy8gd2UgbXVzaCBo
YXZlIGNvbXB1dGVkIGFuZCBjYWNoZWQgdGhvc2UgdmFsdWVzLgorICAgIEFTU0VSVChmb3JtYXR0
aW5nU3RhdGUuaGFzVXNlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCkpOworICAgIGF1dG8gcG9z
aXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luID0gZm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0
aWNhbE1hcmdpbihsYXlvdXRCb3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXM7CisgICAgcmV0
dXJuIG1hcmdpblR5cGUgPT0gTWFyZ2luVHlwZTo6QmVmb3JlID8gcG9zaXRpdmVBbmROZWdhdGl2
ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSA6IHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdp
bi5hZnRlcjsgCit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBh
aXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9zaXRp
dmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2Fs
TWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAorewor
ICAgIGF1dG8gZmlyc3RDaGlsZENvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IFsmXSgpIC0+IFVzZWRW
ZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7CisgICAgICAg
IGlmICghbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJnaW5CZWZv
cmUobGF5b3V0Qm94KSkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgIHJldHVybiBw
b3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKCpkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCku
Zmlyc3RJbkZsb3dDaGlsZCgpLCBNYXJnaW5UeXBlOjpCZWZvcmUpOworICAgIH07CisKKyAgICBh
dXRvIHByZXZpb3VTaWJsaW5nQ29sbGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVy
dGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgeworICAgICAgICBp
ZiAoIW1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcihs
YXlvdXRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgcmV0dXJuIHBvc2l0
aXZlTmVnYXRpdmVWYWx1ZXMoKmxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSwgTWFy
Z2luVHlwZTo6QWZ0ZXIpOworICAgIH07CisKKyAgICAvLyAxLiBHYXRoZXIgcG9zaXRpdmUgYW5k
IG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZnJvbSBmaXJzdCBjaGlsZCBpZiBtYXJnaW5zIGFyZSBh
ZGpvaW5pbmcuCisgICAgLy8gMi4gR2F0aGVyIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4g
dmFsdWVzIGZyb20gcHJldmlvdXMgaW5mbG93IHNpYmxpbmcgaWYgbWFyZ2lucyBhcmUgYWRqb2lu
aW5nLgorICAgIC8vIDMuIENvbXB1dGUgbWluL21heCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgY29s
bGFwc2VkIG1hcmdpbiB2YWx1ZXMgdXNpbmcgbm9uLWNvbGxwYXNlZCBjb21wdXRlZCBtYXJnaW4g
YmVmb3JlLgorICAgIGF1dG8gY29sbGFwc2VkTWFyZ2luQmVmb3JlID0gY29tcHV0ZWRQb3NpdGl2
ZUFuZE5lZ2F0aXZlTWFyZ2luKGZpcnN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5CZWZvcmUoKSwgcHJl
dmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5BZnRlcigpKTsKKyAgICBpZiAoY29sbGFwc2VkTWFy
Z2luQmVmb3JlLmlzUXVpcmsgJiYgZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRJ
Z25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihsYXlvdXRCb3gpKQorICAgICAgICBjb2xsYXBzZWRN
YXJnaW5CZWZvcmUgPSB7IH07CisKKyAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5k
TmVnYXRpdmVQYWlyOjpWYWx1ZXMgbm9uQ29sbGFwc2VkQmVmb3JlOworICAgIGlmIChub25Db2xs
YXBzZWRWYWx1ZXMuYmVmb3JlID4gMCkKKyAgICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0geyBu
b25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlLCB7IH0sIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdp
bkJlZm9yZVF1aXJrKCkgfTsKKyAgICBlbHNlIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3Jl
IDwgMCkKKyAgICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0geyB7IH0sIG5vbkNvbGxhcHNlZFZh
bHVlcy5iZWZvcmUsIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkgfTsK
KworICAgIHJldHVybiBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4oY29sbGFwc2Vk
TWFyZ2luQmVmb3JlLCBub25Db2xsYXBzZWRCZWZvcmUpOworfQorCitVc2VkVmVydGljYWxNYXJn
aW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6TWFyZ2luQ29sbGFwc2U6OnBvc2l0aXZlTmVnYXRpdmVNYXJnaW5BZnRlcihjb25zdCBCb3gm
IGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29s
bGFwc2VkVmFsdWVzKSBjb25zdAoreworICAgIGF1dG8gbGFzdENoaWxkQ29sbGFwc2VkTWFyZ2lu
QWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQ
YWlyOjpWYWx1ZXMgeworICAgICAgICBpZiAoIW1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aExhc3RJ
bkZsb3dDaGlsZE1hcmdpbkFmdGVyKGxheW91dEJveCkpCisgICAgICAgICAgICByZXR1cm4geyB9
OworICAgICAgICByZXR1cm4gcG9zaXRpdmVOZWdhdGl2ZVZhbHVlcygqZG93bmNhc3Q8Q29udGFp
bmVyQm94PihsYXlvdXRCb3gpLmxhc3RJbkZsb3dDaGlsZCgpLCBNYXJnaW5UeXBlOjpBZnRlcik7
CisgICAgfTsKKworICAgIC8vIFdlIGRvbid0IGtub3cgeWV0IHRoZSBtYXJnaW4gYmVmb3JlIHZh
bHVlIG9mIHRoZSBuZXh0IHNpYmxpbmcuIExldCdzIGp1c3QgcHJldGVuZCBpdCBkb2VzIG5vdCBo
YXZlIG9uZSBhbmQgCisgICAgLy8gdXBkYXRlIGl0IGxhdGVyIHdoZW4gd2UgY29tcHV0ZSB0aGUg
bmV4dCBzaWJsaW5nJ3MgbWFyZ2luIGJlZm9yZS4gU2VlIHVwZGF0ZU1hcmdpbkFmdGVyRm9yUHJl
dmlvdXNTaWJsaW5nLgorICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2
ZVBhaXI6OlZhbHVlcyBub25Db2xsYXBzZWRBZnRlcjsKKyAgICBpZiAobm9uQ29sbGFwc2VkVmFs
dWVzLmFmdGVyID4gMCkKKyAgICAgICAgbm9uQ29sbGFwc2VkQWZ0ZXIgPSB7IG5vbkNvbGxhcHNl
ZFZhbHVlcy5hZnRlciwgeyB9LCBsYXlvdXRCb3guc3R5bGUoKS5oYXNNYXJnaW5BZnRlclF1aXJr
KCkgfTsKKyAgICBlbHNlIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIgPCAwKQorICAgICAg
ICBub25Db2xsYXBzZWRBZnRlciA9IHsgeyB9LCBub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIsIGxh
eW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkFmdGVyUXVpcmsoKSB9OworCisgICAgcmV0dXJuIGNv
bXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihsYXN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5B
ZnRlcigpLCBub25Db2xsYXBzZWRBZnRlcik7Cit9CisKK0xheW91dFVuaXQgQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUlnbm9yaW5nQ29sbGFwc2lu
Z1Rocm91Z2goY29uc3QgQm94JiBsYXlvdXRCb3gsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29s
bGFwc2VkVmFsdWVzIG5vbkNvbGxhcHNlZFZhbHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94
LmlzQmxvY2tMZXZlbEJveCgpKTsKKyAgICByZXR1cm4gbWFyZ2luVmFsdWUocG9zaXRpdmVOZWdh
dGl2ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gsIG5vbkNvbGxhcHNlZFZhbHVlcykpLnZhbHVlT3Io
bm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSk7Cit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbiBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6Y29sbGFwc2VkVmVydGljYWxWYWx1
ZXMoY29uc3QgQm94JiBsYXlvdXRCb3gsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2Vk
VmFsdWVzIG5vbkNvbGxhcHNlZFZhbHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxv
Y2tMZXZlbEJveCgpKTsKKyAgICAvLyAxLiBHZXQgbWluL21heCBtYXJnaW4gdG9wIHZhbHVlcyBm
cm9tIHRoZSBmaXJzdCBpbi1mbG93IGNoaWxkIGlmIHdlIGFyZSBjb2xsYXBzaW5nIG1hcmdpbiB0
b3Agd2l0aCBpdC4KKyAgICAvLyAyLiBHZXQgbWluL21heCBtYXJnaW4gdG9wIHZhbHVlcyBmcm9t
IHRoZSBwcmV2aW91cyBpbi1mbG93IHNpYmxpbmcsIGlmIHdlIGFyZSBjb2xsYXBzaW5nIG1hcmdp
biB0b3Agd2l0aCBpdC4KKyAgICAvLyAzLiBHZXQgdGhpcyBsYXlvdXQgYm94J3MgY29tcHV0ZWQg
bWFyZ2luIHRvcCB2YWx1ZS4KKyAgICAvLyA0LiBVcGRhdGUgdGhlIG1pbi9tYXggdmFsdWUgYW5k
IGNvbXB1dGUgdGhlIGZpbmFsIG1hcmdpbi4KKyAgICBhdXRvIHBvc2l0aXZlQW5kTmVnYXRpdmVW
ZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBh
aXIgeyB0aGlzLT5wb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGxheW91dEJveCwgbm9uQ29s
bGFwc2VkVmFsdWVzKSwgdGhpcy0+cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkFmdGVyKGxheW91dEJv
eCwgbm9uQ29sbGFwc2VkVmFsdWVzKSB9OworCisgICAgYXV0byBtYXJnaW5zQ29sbGFwc2VUaHJv
dWdoID0gdGhpcy0+bWFyZ2luc0NvbGxhcHNlVGhyb3VnaChsYXlvdXRCb3gpOworICAgIGlmICht
YXJnaW5zQ29sbGFwc2VUaHJvdWdoKSB7CisgICAgICAgIHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0
aWNhbE1hcmdpbi5iZWZvcmUgPSBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4ocG9z
aXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSwgcG9zaXRpdmVBbmROZWdhdGl2
ZVZlcnRpY2FsTWFyZ2luLmFmdGVyKTsKKyAgICAgICAgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRp
Y2FsTWFyZ2luLmFmdGVyID0gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9y
ZTsKKyAgICB9CisKKyAgICBhdXRvIGhhc0NvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IG1hcmdpbkJl
Zm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxkTWFyZ2luQmVmb3JlKGxheW91dEJveCkg
fHwgbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGxh
eW91dEJveCk7CisgICAgYXV0byBoYXNDb2xsYXBzZWRNYXJnaW5BZnRlciA9IG1hcmdpbkFmdGVy
Q29sbGFwc2VzV2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFmdGVyKGxheW91dEJveCk7CisgICAg
YXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW4geyBub25Db2xsYXBz
ZWRWYWx1ZXMsIHsgfSwgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luIH07CisKKyAg
ICBpZiAoKGhhc0NvbGxhcHNlZE1hcmdpbkJlZm9yZSAmJiBoYXNDb2xsYXBzZWRNYXJnaW5BZnRl
cikgfHwgbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCkKKyAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2lu
LmNvbGxhcHNlZFZhbHVlcyA9IHsgbWFyZ2luVmFsdWUocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRp
Y2FsTWFyZ2luLmJlZm9yZSksIG1hcmdpblZhbHVlKHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNh
bE1hcmdpbi5hZnRlciksIG1hcmdpbnNDb2xsYXBzZVRocm91Z2ggfTsKKyAgICBlbHNlIGlmICho
YXNDb2xsYXBzZWRNYXJnaW5CZWZvcmUpCisgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5jb2xs
YXBzZWRWYWx1ZXMgPSB7IG1hcmdpblZhbHVlKHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1h
cmdpbi5iZWZvcmUpLCB7IH0sIGZhbHNlIH07CisgICAgZWxzZSBpZiAoaGFzQ29sbGFwc2VkTWFy
Z2luQWZ0ZXIpCisgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1ZXMgPSB7
IHsgfSwgbWFyZ2luVmFsdWUocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVy
KSwgZmFsc2UgfTsKKyAgICByZXR1cm4gdXNlZFZlcnRpY2FsTWFyZ2luOworfQorCit9Cit9Cisj
ZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvYmxvY2tmb3JtYXR0aW5nL1ByZWNvbXB1dGVkQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9Q
cmVjb21wdXRlZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRlZmIzZDU1NGZl
NjhkZTQyNzMxZmY4ZTJkNGIyMGVhYmY2NTllYzIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9QcmVjb21w
dXRlZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisg
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ0NvbnRleHQu
aCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAi
QmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRl
ICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2luY2x1
ZGUgIkxheW91dFVuaXQuaCIKKyNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3Np
dGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdp
bkNvbGxhcHNlOjpwcmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMoY29uc3QgQm94JiBs
YXlvdXRCb3gpIGNvbnN0Cit7CisgICAgYXV0byYgYmxvY2tGb3JtYXR0aW5nU3RhdGUgPSBkb3du
Y2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4obGF5b3V0U3RhdGUoKS5mb3JtYXR0aW5nU3RhdGVG
b3JCb3gobGF5b3V0Qm94KSk7CisgICAgaWYgKGJsb2NrRm9ybWF0dGluZ1N0YXRlLmhhc1VzZWRW
ZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gYmxvY2tGb3JtYXR0aW5n
U3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCkucG9zaXRpdmVBbmROZWdhdGl2ZVZh
bHVlcy5iZWZvcmU7CisKKyAgICBhdXRvIGdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5n
ZW9tZXRyeSgpOworICAgIGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRzID0gZ2VvbWV0cnkuY29u
c3RyYWludHNGb3JJbkZsb3dDb250ZW50KGxheW91dEJveC5jb250YWluaW5nQmxvY2soKSkuaG9y
aXpvbnRhbDsKKyAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBnZW9tZXRyeS5jb21w
dXRlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAg
ICBhdXRvIG5vbkNvbGxhcHNlZE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFw
c2VkVmFsdWVzIHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29t
cHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgcmV0dXJuIHByZWNv
bXB1dGVkUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gsIG5vbkNvbGxhcHNl
ZE1hcmdpbik7Cit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBh
aXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cHJlY29t
cHV0ZWRQb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBV
c2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyBub25Db2xsYXBzZWRWYWx1ZXMp
IGNvbnN0Cit7CisgICAgYXV0byBmaXJzdENoaWxkQ29sbGFwc2VkTWFyZ2luQmVmb3JlID0gWyZd
KCkgLT4gVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVz
IHsKKyAgICAgICAgaWYgKCFtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoRmlyc3RJbkZsb3dDaGls
ZE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAg
ICAgcmV0dXJuIHByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZVZhbHVlcygqZG93bmNhc3Q8Q29u
dGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93Q2hpbGQoKSk7CisgICAgfTsKKworICAg
IGF1dG8gcHJldmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5BZnRlciA9IFsmXSgpIC0+IFVzZWRW
ZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7CisgICAgICAg
IGlmICghbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVy
KGxheW91dEJveCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICBhdXRvJiBwcmV2
aW91c0luRmxvd1NpYmxpbmcgPSAqbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpOwor
ICAgICAgICBhdXRvJiBibG9ja0Zvcm1hdHRpbmdTdGF0ZSA9IGRvd25jYXN0PEJsb2NrRm9ybWF0
dGluZ1N0YXRlPihsYXlvdXRTdGF0ZSgpLmZvcm1hdHRpbmdTdGF0ZUZvckJveChwcmV2aW91c0lu
Rmxvd1NpYmxpbmcpKTsKKyAgICAgICAgcmV0dXJuIGJsb2NrRm9ybWF0dGluZ1N0YXRlLnVzZWRW
ZXJ0aWNhbE1hcmdpbihwcmV2aW91c0luRmxvd1NpYmxpbmcpLnBvc2l0aXZlQW5kTmVnYXRpdmVW
YWx1ZXMuYWZ0ZXI7CisgICAgfTsKKworICAgIC8vIDEuIEdhdGhlciBwb3NpdGl2ZSBhbmQgbmVn
YXRpdmUgbWFyZ2luIHZhbHVlcyBmcm9tIGZpcnN0IGNoaWxkIGlmIG1hcmdpbnMgYXJlIGFkam9p
bmluZy4KKyAgICAvLyAyLiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1
ZXMgZnJvbSBwcmV2aW91cyBpbmZsb3cgc2libGluZyBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcu
CisgICAgLy8gMy4gQ29tcHV0ZSBtaW4vbWF4IHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBjb2xsYXBz
ZWQgbWFyZ2luIHZhbHVlcyB1c2luZyBub24tY29sbHBhc2VkIGNvbXB1dGVkIG1hcmdpbiBiZWZv
cmUuCisgICAgYXV0byBjb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSBjb21wdXRlZFBvc2l0aXZlQW5k
TmVnYXRpdmVNYXJnaW4oZmlyc3RDaGlsZENvbGxhcHNlZE1hcmdpbkJlZm9yZSgpLCBwcmV2aW91
U2libGluZ0NvbGxhcHNlZE1hcmdpbkFmdGVyKCkpOworICAgIGlmIChjb2xsYXBzZWRNYXJnaW5C
ZWZvcmUuaXNRdWlyayAmJiBmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJrcygpLnNob3VsZElnbm9y
ZUNvbGxhcHNlZFF1aXJrTWFyZ2luKGxheW91dEJveCkpCisgICAgICAgIGNvbGxhcHNlZE1hcmdp
bkJlZm9yZSA9IHsgfTsKKworICAgIGF1dG8gbm9uQ29sbGFwc2VkQmVmb3JlID0gVXNlZFZlcnRp
Y2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHsgfTsKKyAgICBpZiAo
bm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSA+IDApCisgICAgICAgIG5vbkNvbGxhcHNlZEJlZm9y
ZSA9IHsgbm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSwgeyB9LCBsYXlvdXRCb3guc3R5bGUoKS5o
YXNNYXJnaW5CZWZvcmVRdWlyaygpIH07CisgICAgZWxzZSBpZiAobm9uQ29sbGFwc2VkVmFsdWVz
LmJlZm9yZSA8IDApCisgICAgICAgIG5vbkNvbGxhcHNlZEJlZm9yZSA9IHsgeyB9LCBub25Db2xs
YXBzZWRWYWx1ZXMuYmVmb3JlLCBsYXlvdXRCb3guc3R5bGUoKS5oYXNNYXJnaW5CZWZvcmVRdWly
aygpIH07CisKKyAgICByZXR1cm4gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKGNv
bGxhcHNlZE1hcmdpbkJlZm9yZSwgbm9uQ29sbGFwc2VkQmVmb3JlKTsKK30KKworUHJlY29tcHV0
ZWRNYXJnaW5CZWZvcmUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OnBy
ZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBVc2VkVmVydGljYWxN
YXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB1c2VkTm9uQ29sbGFwc2VkTWFyZ2luKQoreworICAg
IEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworICAgIC8vIERvbid0IHByZS1j
b21wdXRlIHZlcnRpY2FsIG1hcmdpbnMgZm9yIG91dCBvZiBmbG93IGJveGVzLgorICAgIEFTU0VS
VChsYXlvdXRCb3guaXNJbkZsb3coKSB8fCBsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQo
KSk7CisgICAgQVNTRVJUKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKKworICAgIGF1dG8g
cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IHByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2
ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gsIHVzZWROb25Db2xsYXBzZWRNYXJnaW4pOworICAgIGF1
dG8gY29sbGFwc2VkTWFyZ2luQmVmb3JlID0gbWFyZ2luVmFsdWUocG9zaXRpdmVOZWdhdGl2ZU1h
cmdpbkJlZm9yZSk7CisgICAgcmV0dXJuIHsgdXNlZE5vbkNvbGxhcHNlZE1hcmdpbi5iZWZvcmUs
IGNvbGxhcHNlZE1hcmdpbkJlZm9yZSwgcG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSB9Owor
fQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hYzZkZjY1Y2E0YmI3MTM2MDRlYWI3
MDAxNmNmN2RlZjFjMjJmMDRkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxl
V3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCkBAIC0wLDAgKzEsMjM4IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRhYmxlV3JhcHBlckJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbnZh
bGlkYXRpb25TdGF0ZS5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVk
ZSAiTGF5b3V0Q2hpbGRJdGVyYXRvci5oIgorI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKKyNp
bmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiVGFibGVG
b3JtYXR0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09f
QUxMT0NBVEVEX0lNUEwoVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCk7CisKK1Rh
YmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlV3JhcHBlckJsb2NrRm9ybWF0
dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEJs
b2NrRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCisgICAgOiBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgZm9ybWF0dGluZ1N0YXRlKQoreworfQor
Cit2b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dEluRmxvd0Nv
bnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRl
bnQmIGNvbnN0cmFpbnRzKQoreworICAgIC8vIFRoZSB0YWJsZSBnZW5lcmF0ZXMgYSBwcmluY2lw
YWwgYmxvY2sgY29udGFpbmVyIGJveCBjYWxsZWQgdGhlIHRhYmxlIHdyYXBwZXIgYm94IHRoYXQg
Y29udGFpbnMgdGhlIHRhYmxlIGJveCBpdHNlbGYgYW5kIGFueSBjYXB0aW9uIGJveGVzCisgICAg
Ly8gKGluIGRvY3VtZW50IG9yZGVyKS4gVGhlIHRhYmxlIGJveCBpcyBhIGJsb2NrLWxldmVsIGJv
eCB0aGF0IGNvbnRhaW5zIHRoZSB0YWJsZSdzIGludGVybmFsIHRhYmxlIGJveGVzLgorICAgIC8v
IFRoZSBjYXB0aW9uIGJveGVzIGFyZSBwcmluY2lwYWwgYmxvY2stbGV2ZWwgYm94ZXMgdGhhdCBy
ZXRhaW4gdGhlaXIgb3duIGNvbnRlbnQsIHBhZGRpbmcsIG1hcmdpbiwgYW5kIGJvcmRlciBhcmVh
cywgYW5kIGFyZSByZW5kZXJlZAorICAgIC8vIGFzIG5vcm1hbCBibG9jayBib3hlcyBpbnNpZGUg
dGhlIHRhYmxlIHdyYXBwZXIgYm94LiBXaGV0aGVyIHRoZSBjYXB0aW9uIGJveGVzIGFyZSBwbGFj
ZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSB0YWJsZSBib3ggaXMgZGVjaWRlZCBieQorICAgIC8vIHRo
ZSAnY2FwdGlvbi1zaWRlJyBwcm9wZXJ0eSwgYXMgZGVzY3JpYmVkIGJlbG93LgorICAgIGZvciAo
YXV0byYgY2hpbGQgOiBjaGlsZHJlbk9mVHlwZTxDb250YWluZXJCb3g+KHJvb3QoKSkpIHsKKyAg
ICAgICAgaWYgKGNoaWxkLmlzVGFibGVCb3goKSkKKyAgICAgICAgICAgIGxheW91dFRhYmxlQm94
KGNoaWxkLCBjb25zdHJhaW50cyk7CisgICAgICAgIGVsc2UgaWYgKGNoaWxkLmlzVGFibGVDYXB0
aW9uKCkpCisgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9Cit9CisKK3Zv
aWQgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0VGFibGVCb3goY29u
c3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250
ZW50JiBjb25zdHJhaW50cykKK3sKKyAgICBsYXlvdXRTdGF0ZSgpLmVuc3VyZVRhYmxlRm9ybWF0
dGluZ1N0YXRlKHRhYmxlQm94KTsKKworICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nRm9yVGFi
bGVCb3godGFibGVCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgIGNvbXB1dGVTdGF0
aWNWZXJ0aWNhbFBvc2l0aW9uKHRhYmxlQm94LCBjb25zdHJhaW50cy52ZXJ0aWNhbCk7CisgICAg
Y29tcHV0ZVdpZHRoQW5kTWFyZ2luRm9yVGFibGVCb3godGFibGVCb3gsIGNvbnN0cmFpbnRzLmhv
cml6b250YWwpOworICAgIGNvbXB1dGVTdGF0aWNIb3Jpem9udGFsUG9zaXRpb24odGFibGVCb3gs
IGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworCisgICAgaWYgKHRhYmxlQm94Lmhhc0NoaWxkKCkp
IHsKKyAgICAgICAgYXV0byBpbnZhbGlkYXRpb25TdGF0ZSA9IEludmFsaWRhdGlvblN0YXRlIHsg
fTsKKyAgICAgICAgTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQodGFibGVC
b3gsIGxheW91dFN0YXRlKCkpLT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRl
LCBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCh0YWJsZUJveCkpOworICAg
IH0KKworICAgIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW5Gb3JUYWJsZUJveCh0YWJsZUJveCwgY29u
c3RyYWludHMpOworfQorCit2b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
OmNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nRm9yVGFibGVCb3goY29uc3QgQ29udGFpbmVyQm94JiB0
YWJsZUJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWlu
dHMpCit7CisgICAgQVNTRVJUKHRhYmxlQm94LmlzVGFibGVCb3goKSk7CisgICAgaWYgKCF0YWJs
ZUJveC5oYXNDaGlsZCgpIHx8IHRhYmxlQm94LnN0eWxlKCkuYm9yZGVyQ29sbGFwc2UoKSA9PSBC
b3JkZXJDb2xsYXBzZTo6U2VwYXJhdGUpIHsKKyAgICAgICAgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmcodGFibGVCb3gsIGhvcml6b250YWxDb25zdHJhaW50
cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gVUFzIG11c3QgY29tcHV0ZSBhbiBp
bml0aWFsIGxlZnQgYW5kIHJpZ2h0IGJvcmRlciB3aWR0aCBmb3IgdGhlIHRhYmxlIGJ5IGV4YW1p
bmluZworICAgIC8vIHRoZSBmaXJzdCBhbmQgbGFzdCBjZWxscyBpbiB0aGUgZmlyc3Qgcm93IG9m
IHRoZSB0YWJsZS4KKyAgICAvLyBUaGUgbGVmdCBib3JkZXIgd2lkdGggb2YgdGhlIHRhYmxlIGlz
IGhhbGYgb2YgdGhlIGZpcnN0IGNlbGwncyBjb2xsYXBzZWQgbGVmdCBib3JkZXIsCisgICAgLy8g
YW5kIHRoZSByaWdodCBib3JkZXIgd2lkdGggb2YgdGhlIHRhYmxlIGlzIGhhbGYgb2YgdGhlIGxh
c3QgY2VsbCdzIGNvbGxhcHNlZCByaWdodCBib3JkZXIuCisgICAgLy8gVGhlIHRvcCBib3JkZXIg
d2lkdGggb2YgdGhlIHRhYmxlIGlzIGNvbXB1dGVkIGJ5IGV4YW1pbmluZyBhbGwgY2VsbHMgd2hv
IGNvbGxhcHNlIHRoZWlyIHRvcAorICAgIC8vIGJvcmRlcnMgd2l0aCB0aGUgdG9wIGJvcmRlciBv
ZiB0aGUgdGFibGUuIFRoZSB0b3AgYm9yZGVyIHdpZHRoIG9mIHRoZSB0YWJsZSBpcyBlcXVhbCB0
byBoYWxmIG9mIHRoZQorICAgIC8vIG1heGltdW0gY29sbGFwc2VkIHRvcCBib3JkZXIuIFRoZSBi
b3R0b20gYm9yZGVyIHdpZHRoIGlzIGNvbXB1dGVkIGJ5IGV4YW1pbmluZyBhbGwgY2VsbHMgd2hv
c2UgYm90dG9tIGJvcmRlcnMgY29sbGFwc2UKKyAgICAvLyB3aXRoIHRoZSBib3R0b20gb2YgdGhl
IHRhYmxlLiBUaGUgYm90dG9tIGJvcmRlciB3aWR0aCBpcyBlcXVhbCB0byBoYWxmIG9mIHRoZSBt
YXhpbXVtIGNvbGxhcHNlZCBib3R0b20gYm9yZGVyLgorICAgIGF1dG8mIGdyaWQgPSBsYXlvdXRT
dGF0ZSgpLmVzdGFibGlzaGVkVGFibGVGb3JtYXR0aW5nU3RhdGUodGFibGVCb3gpLnRhYmxlR3Jp
ZCgpOworICAgIGF1dG8gdGFibGVCb3JkZXIgPSBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKHRh
YmxlQm94KTsKKworICAgIGF1dG8mIGZpcnN0Q29sdW1uRmlyc3RSb3dCb3ggPSBncmlkLnNsb3Qo
eyAwICwgMCB9KS0+Y2VsbCgpLmJveCgpOworICAgIGF1dG8gbGVmdEJvcmRlciA9IHN0ZDo6bWF4
KHRhYmxlQm9yZGVyLmhvcml6b250YWwubGVmdCwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihm
aXJzdENvbHVtbkZpcnN0Um93Qm94KS5ob3Jpem9udGFsLmxlZnQpOworCisgICAgYXV0byYgbGFz
dENvbHVtbkZpcnN0Um93ID0gZ3JpZC5zbG90KHsgZ3JpZC5jb2x1bW5zKCkuc2l6ZSgpIC0gMSwg
MCB9KS0+Y2VsbCgpLmJveCgpOworICAgIGF1dG8gcmlnaHRCb3JkZXIgPSBzdGQ6Om1heCh0YWJs
ZUJvcmRlci5ob3Jpem9udGFsLnJpZ2h0LCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKGxhc3RD
b2x1bW5GaXJzdFJvdykuaG9yaXpvbnRhbC5yaWdodCk7CisKKyAgICBhdXRvIHRvcEJvcmRlciA9
IHRhYmxlQm9yZGVyLnZlcnRpY2FsLnRvcDsKKyAgICBhdXRvIGJvdHRvbUJvcmRlciA9IHRhYmxl
Qm9yZGVyLnZlcnRpY2FsLmJvdHRvbTsKKyAgICBhdXRvIGxhc3RSb3dJbmRleCA9IGdyaWQucm93
cygpLnNpemUoKSAtIDE7CisgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5J
bmRleCA8IGdyaWQuY29sdW1ucygpLnNpemUoKTsgKytjb2x1bW5JbmRleCkgeworICAgICAgICBh
dXRvJiBib3hJbkZpcnN0Um94ID0gZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIDAgfSktPmNlbGwo
KS5ib3goKTsKKyAgICAgICAgYXV0byYgYm94SW5MYXN0Um93ID0gZ3JpZC5zbG90KHsgY29sdW1u
SW5kZXgsIGxhc3RSb3dJbmRleCB9KS0+Y2VsbCgpLmJveCgpOworCisgICAgICAgIHRvcEJvcmRl
ciA9IHN0ZDo6bWF4KHRvcEJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihib3hJbkZp
cnN0Um94KS52ZXJ0aWNhbC50b3ApOworICAgICAgICBib3R0b21Cb3JkZXIgPSBzdGQ6Om1heChi
b3R0b21Cb3JkZXIsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIoYm94SW5MYXN0Um93KS52ZXJ0
aWNhbC5ib3R0b20pOworICAgIH0KKworICAgIHRvcEJvcmRlciA9IHN0ZDo6bWF4KHRvcEJvcmRl
ciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcigqdGFibGVCb3guZmlyc3RDaGlsZCgpKS52ZXJ0
aWNhbC50b3ApOworICAgIGZvciAoYXV0byYgc2VjdGlvbiA6IGNoaWxkcmVuT2ZUeXBlPENvbnRh
aW5lckJveD4odGFibGVCb3gpKSB7CisgICAgICAgIGF1dG8gaG9yaXp0b25hbEJvcmRlciA9IGdl
b21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIoc2VjdGlvbikuaG9yaXpvbnRhbDsKKyAgICAgICAgbGVm
dEJvcmRlciA9IHN0ZDo6bWF4KGxlZnRCb3JkZXIsIGhvcml6dG9uYWxCb3JkZXIubGVmdCk7Cisg
ICAgICAgIHJpZ2h0Qm9yZGVyID0gc3RkOjptYXgocmlnaHRCb3JkZXIsIGhvcml6dG9uYWxCb3Jk
ZXIucmlnaHQpOworICAgIH0KKyAgICBib3R0b21Cb3JkZXIgPSBzdGQ6Om1heChib3R0b21Cb3Jk
ZXIsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIoKnRhYmxlQm94Lmxhc3RDaGlsZCgpKS52ZXJ0
aWNhbC5ib3R0b20pOworCisgICAgYXV0byYgcm93cyA9IGdyaWQucm93cygpLmxpc3QoKTsKKyAg
ICB0b3BCb3JkZXIgPSBzdGQ6Om1heCh0b3BCb3JkZXIsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3Jk
ZXIocm93cy5maXJzdCgpLmJveCgpKS52ZXJ0aWNhbC50b3ApOworICAgIGZvciAoYXV0byYgcm93
IDogcm93cykgeworICAgICAgICBhdXRvIGhvcml6dG9uYWxCb3JkZXIgPSBnZW9tZXRyeSgpLmNv
bXB1dGVkQm9yZGVyKHJvdy5ib3goKSkuaG9yaXpvbnRhbDsKKyAgICAgICAgbGVmdEJvcmRlciA9
IHN0ZDo6bWF4KGxlZnRCb3JkZXIsIGhvcml6dG9uYWxCb3JkZXIubGVmdCk7CisgICAgICAgIHJp
Z2h0Qm9yZGVyID0gc3RkOjptYXgocmlnaHRCb3JkZXIsIGhvcml6dG9uYWxCb3JkZXIucmlnaHQp
OworICAgIH0KKyAgICBib3R0b21Cb3JkZXIgPSBzdGQ6Om1heChib3R0b21Cb3JkZXIsIGdlb21l
dHJ5KCkuY29tcHV0ZWRCb3JkZXIocm93cy5sYXN0KCkuYm94KCkpLnZlcnRpY2FsLmJvdHRvbSk7
CisKKyAgICBhdXRvIGNvbGxhcHNlZEJvcmRlciA9IEVkZ2VzIHsgeyBsZWZ0Qm9yZGVyLCByaWdo
dEJvcmRlciB9LCB7IHRvcEJvcmRlciwgYm90dG9tQm9yZGVyIH0gfTsKKyAgICBncmlkLnNldENv
bGxhcHNlZEJvcmRlcihjb2xsYXBzZWRCb3JkZXIpOworCisgICAgYXV0byYgYm94R2VvbWV0cnkg
PSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSh0YWJsZUJveCk7CisgICAgYm94R2VvbWV0
cnkuc2V0Qm9yZGVyKGNvbGxhcHNlZEJvcmRlciAvIDIpOworICAgIGJveEdlb21ldHJ5LnNldFBh
ZGRpbmcoZ2VvbWV0cnkoKS5jb21wdXRlZFBhZGRpbmcodGFibGVCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cy5sb2dpY2FsV2lkdGgpKTsKK30KKwordm9pZCBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0Ojpjb21wdXRlV2lkdGhBbmRNYXJnaW5Gb3JUYWJsZUJveChjb25zdCBDb250
YWluZXJCb3gmIHRhYmxlQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250
YWxDb25zdHJhaW50cykKK3sKKyAgICBBU1NFUlQodGFibGVCb3guaXNUYWJsZUJveCgpKTsKKyAg
ICAvLyBUaGlzIGlzIGEgc3BlY2lhbCB0YWJsZSAiZml0LWNvbnRlbnQgc2l6ZSIgYmVoYXZpb3Ig
aGFuZGxpbmcuIE5vdCBpbiB0aGUgc3BlYyB0aG91Z2guCisgICAgLy8gVGFibGUgcmV0dXJucyBp
dHMgZmluYWwgd2lkdGggYXMgbWluL21heC4gVXNlIHRoaXMgZmluYWwgd2lkdGggdmFsdWUgdG8g
Y29tcHV0ZWQgaG9yaXpvbnRhbCBtYXJnaW5zIGV0Yy4KKyAgICBhdXRvJiBmb3JtYXR0aW5nU3Rh
dGVGb3JUYWJsZUJveCA9IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRUYWJsZUZvcm1hdHRpbmdT
dGF0ZSh0YWJsZUJveCk7CisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gSW50
cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07CisgICAgaWYgKGF1dG8gcHJlY29tcHV0ZWRJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzID0gZm9ybWF0dGluZ1N0YXRlRm9yVGFibGVCb3guaW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cygpKQorICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
ID0gKnByZWNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKKyAgICBlbHNlIHsKKyAg
ICAgICAgaWYgKHRhYmxlQm94Lmhhc0NoaWxkKCkpCisgICAgICAgICAgICBpbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQodGFi
bGVCb3gsIGxheW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMo
KTsKKyAgICAgICAgZm9ybWF0dGluZ1N0YXRlRm9yVGFibGVCb3guc2V0SW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyhpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKTsKKyAgICB9CisKKyAgICBhdXRv
IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2Fs
V2lkdGg7CisgICAgLy8gMS4gVGhlIHRhYmxlIGdlbmVyYXRlcyBhIHByaW5jaXBhbCBibG9jayBj
b250YWluZXIgYm94IGNhbGxlZCB0aGUgdGFibGUgd3JhcHBlciBib3ggdGhhdCBjb250YWlucyB0
aGUgdGFibGUgYm94IGl0c2VsZiBhbmQgYW55IGNhcHRpb24gYm94ZXMuCisgICAgLy8gMi4gVGhl
IHRhYmxlIHdyYXBwZXIgYm94IGVzdGFibGlzaGVzIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0
LCBhbmQgdGhlIHRhYmxlIGJveCBlc3RhYmxpc2hlcyBhIHRhYmxlIGZvcm1hdHRpbmcgY29udGV4
dC4KKyAgICAvLyAzLiBUaGUgY29tcHV0ZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMgJ3Bvc2l0aW9u
JywgJ2Zsb2F0JywgJ21hcmdpbi0qJywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCBhbmQgJ2xl
ZnQnIG9uCisgICAgLy8gICAgdGhlIHRhYmxlIGVsZW1lbnQgYXJlIHVzZWQgb24gdGhlIHRhYmxl
IHdyYXBwZXIgYm94IGFuZCBub3QgdGhlIHRhYmxlIGJveDsgYWxsIG90aGVyIHZhbHVlcyBvZiBu
b24taW5oZXJpdGFibGUKKyAgICAvLyAgICBwcm9wZXJ0aWVzIGFyZSB1c2VkIG9uIHRoZSB0YWJs
ZSBib3ggYW5kIG5vdCB0aGUgdGFibGUgd3JhcHBlciBib3guCisgICAgLy8gNC4gSW4gYSBibG9j
ayBmb3JtYXR0aW5nIGNvbnRleHQsIGVhY2ggYm94J3MgbGVmdCBvdXRlciBlZGdlIHRvdWNoZXMg
dGhlIGxlZnQgZWRnZSBvZiB0aGUgY29udGFpbmluZyBibG9jay4KKyAgICAvLyAgICBUaGlzIGlz
IHRydWUgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgZmxvYXRzLCB1bmxlc3MgdGhlIGJveCBlc3Rh
Ymxpc2hlcyBhIG5ldyBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgKGluIHdoaWNoIGNhc2UgdGhl
CisgICAgLy8gICAgYm94IGl0c2VsZiBtYXkgYmVjb21lIG5hcnJvd2VyIGR1ZSB0byB0aGUgZmxv
YXRzKQorICAgIC8vCisgICAgLy8gTm93IGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY2FzZToKKyAg
ICAvLyA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBibG9jazsgd2lkdGg6IDUwMHB4OyI+CisgICAgLy8g
ICAgIDxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0OyB3aWR0aDogMTAwcHg7Ij48L2Rpdj4KKyAgICAv
LyAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IHRhYmxlOyB3aWR0aDogMTAlOyI+PC9kaXY+
CisgICAgLy8gICAgIDwvZGl2PgorICAgIC8vIDwvZGl2PgorICAgIC8vIDEuIFdlIGNyZWF0ZSBh
IHRhYmxlIHdyYXBwZXIgYm94IHRvIHdyYXAgdGhlICJkaXNwbGF5OiB0YWJsZSIgYmxvY2sgbGV2
ZWwgYm94ICgjMSkuCisgICAgLy8gMi4gVGhlIHRhYmxlIHdyYXBwZXIgYm94J3Mgd2lkdGggcHJv
cGVydHkgaXMgc2V0IHRvIGF1dG8gKCMzKS4KKyAgICAvLyAzLiBTaW5jZSBpdCBlc3RhYmxpc2hl
cyBhIG5ldyBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRh
bCBzcGFjZSBnZXRzIHNocnVuayBieSB0aGUgZmxvYXQgKCM0KQorICAgIC8vIDQuIFRoZSB0YWJs
ZSB3cmFwcGVyIGJveCdzIHVzZWQgd2lkdGggY29tcHV0ZXMgdG8gNTAwcHggLSAxMDBweCAtPiA0
MDBweDsKKyAgICAvLworICAgIC8vIE5vdyB3ZSBhcmUgaW5zaWRlIHRoZSBCRkMgZXN0YWJsaXNo
ZWQgYnkgdGhlIHRhYmxlIHdyYXBwZXIgYm94IGFuZCB0cnkgdG8gcmVzb2x2ZSB0aGUgdGFibGUn
cyB3aWR0aCAtPiAlMTAuCisgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBub3JtYWwgQkZDIHJ1bGVz
LCBpdCBzaG91bGQgY29tcHV0ZSB0byAxMCUgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBsb2dp
Y2FsIHdpZHRoOiA0MDBweCAtPiA0MHB4LgorICAgIC8vIEhvd2V2ZXIgaW4gcHJhY3RpY2UgaXQg
Y29tcHV0ZXMgdG8gNTBweCAoMTAlIG9mIDUwMHB4KS4KKyAgICAvLyBTaW1pbGFyIHNldHVwIHdp
dGggbm9uLXRhYmxlIGNvbnRlbnQgd291bGQgcmVzb2x2ZSB0aGUgaW5uZXIgYmxvY2sgbGV2ZWwg
Ym94J3Mgd2lkdGggdG8gNDBweDsKKyAgICAvLyBUaGlzIG5lZWRzIGNsYXJpZmljYXRpb24gaW4g
dGhlIHNwZWMuCisgICAgYXV0byBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRo
ID0gbV9ob3Jpem9udGFsQ29uc3RyYWludHNJZ25vcmluZ0Zsb2F0cy5sb2dpY2FsV2lkdGg7Cisg
ICAgYXV0byBnZW9tZXRyeSA9IHRoaXMtPmdlb21ldHJ5KCk7CisgICAgYXV0byBjb21wdXRlZFdp
ZHRoID0gZ2VvbWV0cnkuY29tcHV0ZWRXaWR0aCh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFp
bnRGb3JSZXNvbHZpbmdXaWR0aCk7CisgICAgYXV0byBjb21wdXRlZE1heFdpZHRoID0gZ2VvbWV0
cnkuY29tcHV0ZWRNYXhXaWR0aCh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRGb3JSZXNv
bHZpbmdXaWR0aCk7CisgICAgYXV0byBjb21wdXRlZE1pbldpZHRoID0gZ2VvbWV0cnkuY29tcHV0
ZWRNaW5XaWR0aCh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRGb3JSZXNvbHZpbmdXaWR0
aCk7CisgICAgLy8gVXNlIHRoZSBnZW5lcmljIHNocmluay10by1maXQtd2lkdGggbG9naWMgYXMg
dGhlIGluaXRpYWwgd2lkdGggZm9yIHRoZSB0YWJsZS4KKyAgICBhdXRvIHVzZWRXaWR0aCA9IHN0
ZDo6bWluKHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgYXZhaWxh
YmxlSG9yaXpvbnRhbFNwYWNlKSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtKTsK
KyAgICBpZiAoY29tcHV0ZWRXaWR0aCB8fCBjb21wdXRlZE1pbldpZHRoIHx8IGNvbXB1dGVkTWF4
V2lkdGgpIHsKKyAgICAgICAgaWYgKGNvbXB1dGVkV2lkdGgpIHsKKyAgICAgICAgICAgIC8vIE5v
cm1hbGl6ZSB0aGUgY29tcHV0ZWQgd2lkdGggdmFsdWUgZmlyc3QuCisgICAgICAgICAgICBpZiAo
Y29tcHV0ZWRNYXhXaWR0aCAmJiAqY29tcHV0ZWRXaWR0aCA+ICpjb21wdXRlZE1heFdpZHRoKQor
ICAgICAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggPSBjb21wdXRlZE1heFdpZHRoOworICAgICAg
ICAgICAgaWYgKGNvbXB1dGVkTWluV2lkdGggJiYgKmNvbXB1dGVkV2lkdGggPCAqY29tcHV0ZWRN
aW5XaWR0aCkKKyAgICAgICAgICAgICAgICBjb21wdXRlZFdpZHRoID0gY29tcHV0ZWRNaW5XaWR0
aDsKKyAgICAgICAgICAgIHVzZWRXaWR0aCA9ICpjb21wdXRlZFdpZHRoIDwgaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cy5taW5pbXVtID8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVt
IDogKmNvbXB1dGVkV2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29tcHV0ZWRNYXhX
aWR0aCAmJiAqY29tcHV0ZWRNYXhXaWR0aCA8IHVzZWRXaWR0aCkKKyAgICAgICAgICAgIHVzZWRX
aWR0aCA9IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bTsKKyAgICAgICAgaWYgKGNv
bXB1dGVkTWluV2lkdGggJiYgKmNvbXB1dGVkTWluV2lkdGggPiB1c2VkV2lkdGgpCisgICAgICAg
ICAgICB1c2VkV2lkdGggPSAqY29tcHV0ZWRNaW5XaWR0aDsKKyAgICB9CisKKyAgICBhdXRvIGNv
bnRlbnRXaWR0aEFuZE1hcmdpbiA9IGdlb21ldHJ5LmluRmxvd0NvbnRlbnRXaWR0aEFuZE1hcmdp
bih0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBPdmVycmlkZGVuSG9yaXpvbnRhbFZh
bHVlcyB7IHVzZWRXaWR0aCwgeyB9IH0pOworCisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3Jt
YXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSh0YWJsZUJveCk7CisgICAgYm94R2VvbWV0cnkuc2V0
Q29udGVudEJveFdpZHRoKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOworICAg
IGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyBjb250ZW50V2lkdGhBbmRNYXJnaW4u
dXNlZE1hcmdpbi5zdGFydCwgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIH0p
OworfQorCit2b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVI
ZWlnaHRBbmRNYXJnaW5Gb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBj
b25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAgIEFT
U0VSVCh0YWJsZUJveC5pc1RhYmxlQm94KCkpOworICAgIC8vIFRhYmxlIGlzIGEgc3BlY2lhbCBC
RkMgY29udGVudC4gSXRzIGhlaWdodCBpcyBtYWlubHkgZHJpdmVuIGJ5IHRoZSBjb250ZW50LiBD
b21wdXRlZCBoZWlnaHQsIG1pbi1oZWlnaHQgYW5kIG1heC1oZWlnaHQgYXJlIGFsbAorICAgIC8v
IGFscmVhZHkgYmVlbiB0YWtlbiBpbnRvIGFjY291bnQgZHVyaW5nIHRoZSBURkMgbGF5b3V0Lgor
ICAgIGF1dG8gaGVpZ2h0QW5kTWFyZ2luID0gZ2VvbWV0cnkoKS5pbkZsb3dDb250ZW50SGVpZ2h0
QW5kTWFyZ2luKHRhYmxlQm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFsLCB7IHF1aXJrcygpLm92
ZXJyaWRkZW5UYWJsZUhlaWdodCh0YWJsZUJveCkgfSk7CisKKyAgICBhdXRvIG1hcmdpbkNvbGxh
cHNlID0gdGhpcy0+bWFyZ2luQ29sbGFwc2UoKTsKKyAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0g
bWFyZ2luQ29sbGFwc2UuY29sbGFwc2VkVmVydGljYWxWYWx1ZXModGFibGVCb3gsIGhlaWdodEFu
ZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW4pOworICAgIC8vIENhY2hlIHRoZSBjb21wdXRlZCBw
b3NpdGl2ZSBhbmQgbmVnYXRpdmUgbWFyZ2luIHZhbHVlIHBhaXIuCisgICAgZm9ybWF0dGluZ1N0
YXRlKCkuc2V0VXNlZFZlcnRpY2FsTWFyZ2luKHRhYmxlQm94LCB2ZXJ0aWNhbE1hcmdpbik7CisK
KyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KHRh
YmxlQm94KTsKKyAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25X
aXRoTWFyZ2luKHRhYmxlQm94LCB2ZXJ0aWNhbE1hcmdpbiwgY29uc3RyYWludHMudmVydGljYWwp
KTsKKyAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGhlaWdodEFuZE1hcmdpbi5j
b250ZW50SGVpZ2h0KTsKKyAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdp
bkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsK
KyAgICAvLyBBZGp1c3QgdGhlIHByZXZpb3VzIHNpYmxpbmcncyBtYXJnaW4gYm90dG9tIG5vdyB0
aGF0IHRoaXMgYm94J3MgdmVydGljYWwgbWFyZ2luIGlzIGNvbXB1dGVkLgorICAgIE1hcmdpbkNv
bGxhcHNlOjp1cGRhdGVNYXJnaW5BZnRlckZvclByZXZpb3VzU2libGluZygqdGhpcywgbWFyZ2lu
Q29sbGFwc2UsIHRhYmxlQm94KTsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL3Rh
Ymxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdy
YXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBk
ZWExNTdjYzUyMTZmODg0ZmQyODk4MzRhM2M4NjY5NTM3NDI3YTUKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGlu
Zy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oCkBAIC0w
LDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nQ29udGV4
dC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
bmFtZXNwYWNlIExheW91dCB7CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgc3BlY2lh
bCBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgbGF5b3V0IGxvZ2ljIGZvciB0aGUgdGFibGUgd3Jh
cHBlci4KKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi90YWJsZXMuaHRtbCNtb2RlbAor
Y2xhc3MgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCBmaW5hbCA6IHB1YmxpYyBC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKFRhYmxl
V3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAgIFRhYmxlV3JhcHBl
ckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29u
dGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJik7CisKKyAgICB2b2lkIGxheW91dEluRmxv
d0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0Nv
bnRlbnQmKSBmaW5hbDsKKworICAgIHZvaWQgc2V0SG9yaXpvbnRhbENvbnN0cmFpbnRzSWdub3Jp
bmdGbG9hdHMoY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWlu
dHMpIHsgbV9ob3Jpem9udGFsQ29uc3RyYWludHNJZ25vcmluZ0Zsb2F0cyA9IGhvcml6b250YWxD
b25zdHJhaW50czsgfQorCitwcml2YXRlOgorICAgIGNsYXNzIFF1aXJrcyA6IHB1YmxpYyBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgeworICAgIHB1YmxpYzoKKyAgICAgICAgUXVpcmtz
KGNvbnN0IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsKKworICAgICAgICBP
cHRpb25hbDxMYXlvdXRVbml0PiBvdmVycmlkZGVuVGFibGVIZWlnaHQoY29uc3QgQ29udGFpbmVy
Qm94JiB0YWJsZUJveCkgY29uc3Q7CisgICAgfTsKKyAgICBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4gUXVpcmtzKCp0aGlz
KTsgfQorCisgICAgdm9pZCBsYXlvdXRUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxl
Qm94LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsKKworICAgIHZvaWQgY29t
cHV0ZUJvcmRlckFuZFBhZGRpbmdGb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmLCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmKTsKKyAgICB2b2lkIGNvbXB1dGVXaWR0aEFuZE1hcmdp
bkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYpOworICAgIHZvaWQgY29tcHV0ZUhlaWdodEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0
IENvbnRhaW5lckJveCYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOworCitw
cml2YXRlOgorICAgIEhvcml6b250YWxDb25zdHJhaW50cyBtX2hvcml6b250YWxDb25zdHJhaW50
c0lnbm9yaW5nRmxvYXRzOworfTsKKworaW5saW5lIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ6OlF1aXJrczo6UXVpcmtzKGNvbnN0IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KQorICAgIDogQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6UXVpcmtzKGZvcm1hdHRpbmdDb250ZXh0KQoreworfQorCit9Cit9CisKK1NQRUNJQUxJWkVf
VFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChUYWJsZVdyYXBwZXJCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0LCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSkK
KworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dFF1aXJrcy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tG
b3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZWFkYTkyZWQyOGY3OTdmM2I4
MjZiMGZiOTE1NDI1ZWI3ODliYjk5NQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9U
YWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApAQCAtMCwwICsxLDQ4
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRhYmxlV3Jh
cHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQorCisjaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK09wdGlvbmFsPExheW91dFVuaXQ+IFRhYmxl
V3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6b3ZlcnJpZGRlblRhYmxlSGVp
Z2h0KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gpIGNvbnN0Cit7CisgICAgaWYgKGxheW91
dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpIHsKKyAgICAgICAgLy8gSW4gcXVpcmtzIG1vZGUgYWx3
YXlzIHVzZSB0aGUgY29udGVudCBoZWlnaHQuIE5vdGUgdGhhdCB0aGUgdGFibGVzIHdpdGggY29u
dGVudCB0YWtlIGNvbXB1dGVkIHZhbHVlcyBpbnRvIGFjY291bnQuCisgICAgICAgIHJldHVybiBn
ZW9tZXRyeSgpLmNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QodGFibGVCb3gp
OworICAgIH0KKyAgICByZXR1cm4gdGFibGVCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkg
PyBnZW9tZXRyeSgpLmNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QodGFibGVC
b3gpIDogT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OworfQorCit9Cit9CisKKyNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9y
bWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjMxNTdmZDY5OTA0Mjg2OTdlODVkMTcxZjZkM2FjOGQ1ODdhY2FjZjgK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5jcHAKQEAgLTAsMCArMSwx
MjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisg
KiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICog
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRmxleEZv
cm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKKworI2luY2x1ZGUgIkZsZXhGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbmxpbmVS
ZWN0LmgiCisjaW5jbHVkZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRC
b3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENoaWxkSXRlcmF0b3IuaCIKKyNpbmNsdWRl
ICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19B
TExPQ0FURURfSU1QTChGbGV4Rm9ybWF0dGluZ0NvbnRleHQpOworCitGbGV4Rm9ybWF0dGluZ0Nv
bnRleHQ6OkZsZXhGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRp
bmdDb250ZXh0Um9vdCwgRmxleEZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKQorICAg
IDogRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHRSb290LCBmb3JtYXR0aW5nU3Rh
dGUpCit7Cit9CisKK3ZvaWQgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRJbkZsb3dDb250
ZW50KEludmFsaWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50
JiBjb25zdHJhaW50cykKK3sKKyAgICBjb21wdXRlSW50cmluc2ljV2lkdGhDb25zdHJhaW50c0Zv
ckZsZXhJdGVtcygpOworICAgIHNpemVBbmRQbGFjZUZsZXhJdGVtcyhjb25zdHJhaW50cyk7Cit9
CisKK0xheW91dFVuaXQgRmxleEZvcm1hdHRpbmdDb250ZXh0Ojp1c2VkQ29udGVudEhlaWdodCgp
IGNvbnN0Cit7CisgICAgYXV0byYgbGluZXMgPSBmb3JtYXR0aW5nU3RhdGUoKS5saW5lcygpOwor
ICAgIHJldHVybiBMYXlvdXRVbml0IHsgbGluZXMubGFzdCgpLmJvdHRvbSgpIC0gbGluZXMuZmly
c3QoKS50b3AoKSB9OworfQorCitGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25z
dHJhaW50cyBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25z
dHJhaW50cygpCit7CisgICAgcmV0dXJuIHsgfTsKK30KKwordm9pZCBGbGV4Rm9ybWF0dGluZ0Nv
bnRleHQ6OnNpemVBbmRQbGFjZUZsZXhJdGVtcyhjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0Nv
bnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMt
PmZvcm1hdHRpbmdTdGF0ZSgpOworICAgIGF1dG8gZ2VvbWV0cnkgPSB0aGlzLT5nZW9tZXRyeSgp
OworICAgIGF1dG8gZmxleEl0ZW1NYWluQXhpc1N0YXJ0ID0gY29uc3RyYWludHMuaG9yaXpvbnRh
bC5sb2dpY2FsTGVmdDsKKyAgICBhdXRvIGZsZXhJdGVtTWFpbkF4aXNFbmQgPSBmbGV4SXRlbU1h
aW5BeGlzU3RhcnQ7CisgICAgYXV0byBmbGV4SXRlbUNyb3NBeGlzU3RhcnQgPSBjb25zdHJhaW50
cy52ZXJ0aWNhbC5sb2dpY2FsVG9wOworICAgIGF1dG8gZmxleEl0ZW1Dcm9zQXhpc0VuZCA9IGZs
ZXhJdGVtQ3Jvc0F4aXNTdGFydDsKKyAgICBmb3IgKGF1dG8mIGZsZXhJdGVtIDogY2hpbGRyZW5P
ZlR5cGU8Q29udGFpbmVyQm94Pihyb290KCkpKSB7CisgICAgICAgIEFTU0VSVChmbGV4SXRlbS5l
c3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOworICAgICAgICAvLyBGSVhNRTogVGhpcyBp
cyBqdXN0IGEgc2ltcGxlLCBsZXQncyBsYXlvdXQgdGhlIGZsZXggaXRlbXMgYW5kIHBsYWNlIHRo
ZW0gbmV4dCB0byBlYWNoIG90aGVyIHNldHVwLgorICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRo
cyA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGZsZXhJ
dGVtKTsKKyAgICAgICAgYXV0byBmbGV4SXRlbUxvZ2ljYWxXaWR0aCA9IHN0ZDo6bWluKHN0ZDo6
bWF4KGludHJpbnNpY1dpZHRocy0+bWluaW11bSwgY29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dp
Y2FsV2lkdGgpLCBpbnRyaW5zaWNXaWR0aHMtPm1heGltdW0pOworICAgICAgICBhdXRvIGZsZXhJ
dGVtQ29uc3RyYWludHMgPSBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQgeyB7IHsgfSwgZmxl
eEl0ZW1Mb2dpY2FsV2lkdGggfSwgeyB9IH07CisKKyAgICAgICAgYXV0byBpbnZhbGlkYXRpb25T
dGF0ZSA9IEludmFsaWRhdGlvblN0YXRlIHsgfTsKKyAgICAgICAgTGF5b3V0Q29udGV4dDo6Y3Jl
YXRlRm9ybWF0dGluZ0NvbnRleHQoZmxleEl0ZW0sIGxheW91dFN0YXRlKCkpLT5sYXlvdXRJbkZs
b3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBmbGV4SXRlbUNvbnN0cmFpbnRzKTsKKworICAg
ICAgICBhdXRvIGNvbXB1dGVGbGV4SXRlbUdlb21ldHJ5ID0gWyZdIHsKKyAgICAgICAgICAgIGF1
dG8mIGZsZXhJdGVtR2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkoZmxleEl0
ZW0pOworCisgICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KExh
eW91dFBvaW50IHsgZmxleEl0ZW1NYWluQXhpc0VuZCwgZmxleEl0ZW1Dcm9zQXhpc1N0YXJ0IH0p
OworCisgICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldEJvcmRlcihnZW9tZXRyeS5jb21w
dXRlZEJvcmRlcihmbGV4SXRlbSkpOworICAgICAgICAgICAgZmxleEl0ZW1HZW9tZXRyeS5zZXRQ
YWRkaW5nKGdlb21ldHJ5LmNvbXB1dGVkUGFkZGluZyhmbGV4SXRlbSwgY29uc3RyYWludHMuaG9y
aXpvbnRhbC5sb2dpY2FsV2lkdGgpKTsKKworICAgICAgICAgICAgYXV0byBjb21wdXRlZEhvcml6
b250YWxNYXJnaW4gPSBnZW9tZXRyeS5jb21wdXRlZEhvcml6b250YWxNYXJnaW4oZmxleEl0ZW0s
IGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAgICAgZmxleEl0ZW1HZW9tZXRyeS5z
ZXRIb3Jpem9udGFsTWFyZ2luKHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVl
T3IoMF9sdSksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwX2x1KSB9KTsK
KworICAgICAgICAgICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gZ2VvbWV0cnkuY29t
cHV0ZWRWZXJ0aWNhbE1hcmdpbihmbGV4SXRlbSwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Cisg
ICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgY29tcHV0ZWRW
ZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwX2x1KSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdp
bi5hZnRlci52YWx1ZU9yKDBfbHUpIH0pOworCisgICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5
LnNldENvbnRlbnRCb3hIZWlnaHQoZ2VvbWV0cnkuY29udGVudEhlaWdodEZvckZvcm1hdHRpbmdD
b250ZXh0Um9vdChmbGV4SXRlbSkpOworICAgICAgICAgICAgZmxleEl0ZW1HZW9tZXRyeS5zZXRD
b250ZW50Qm94V2lkdGgoZmxleEl0ZW1Mb2dpY2FsV2lkdGgpOworICAgICAgICAgICAgZmxleEl0
ZW1NYWluQXhpc0VuZD0gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QoZmxleEl0ZW1HZW9tZXRy
eSkucmlnaHQoKTsKKyAgICAgICAgICAgIGZsZXhJdGVtQ3Jvc0F4aXNFbmQgPSBzdGQ6Om1heChm
bGV4SXRlbUNyb3NBeGlzRW5kLCBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChmbGV4SXRlbUdl
b21ldHJ5KS5ib3R0b20oKSk7CisgICAgICAgIH07CisgICAgICAgIGNvbXB1dGVGbGV4SXRlbUdl
b21ldHJ5KCk7CisgICAgfQorICAgIGF1dG8gZmxleExpbmUgPSBJbmxpbmVSZWN0IHsgZmxleEl0
ZW1Dcm9zQXhpc1N0YXJ0LCBmbGV4SXRlbU1haW5BeGlzU3RhcnQsIGZsZXhJdGVtTWFpbkF4aXNF
bmQgLSBmbGV4SXRlbU1haW5BeGlzU3RhcnQsIGZsZXhJdGVtQ3Jvc0F4aXNFbmQgLSBmbGV4SXRl
bUNyb3NBeGlzU3RhcnQgfTsKKyAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZShmbGV4TGluZSk7
Cit9CisKK3ZvaWQgRmxleEZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlSW50cmluc2ljV2lkdGhD
b25zdHJhaW50c0ZvckZsZXhJdGVtcygpCit7CisgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0g
dGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7CisgICAgYXV0byBnZW9tZXRyeSA9IHRoaXMtPmdlb21l
dHJ5KCk7CisgICAgZm9yIChhdXRvJiBmbGV4SXRlbSA6IGNoaWxkcmVuT2ZUeXBlPENvbnRhaW5l
ckJveD4ocm9vdCgpKSkgeworICAgICAgICBpZiAoZm9ybWF0dGluZ1N0YXRlLmludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHNGb3JCb3goZmxleEl0ZW0pKQorICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94
KGZsZXhJdGVtLCBnZW9tZXRyeS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGZsZXhJdGVtKSk7
CisgICAgfQorfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0Nv
bnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZv
cm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODFhMGU0MDY5ZmZk
MTAyOTY4OGNjNTE2Y2ZkOTU5MGNjYzkzNjUyYgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1h
dHRpbmdDb250ZXh0LmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAy
MCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25j
ZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJG
bGV4Rm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNp
bmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFj
ZSBMYXlvdXQgeworCitjbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKKy8vIFRoaXMgY2xhc3MgaW1w
bGVtZW50cyB0aGUgbGF5b3V0IGxvZ2ljIGZvciBmbGV4IGZvcm1hdHRpbmcgY29udGV4dHMuCisv
LyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWZsZXhib3gtMS8KK2NsYXNzIEZsZXhGb3JtYXR0
aW5nQ29udGV4dCBmaW5hbCA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dCB7CisgICAgV1RGX01B
S0VfSVNPX0FMTE9DQVRFRChGbGV4Rm9ybWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAgIEZs
ZXhGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0
Um9vdCwgRmxleEZvcm1hdHRpbmdTdGF0ZSYpOworICAgIHZvaWQgbGF5b3V0SW5GbG93Q29udGVu
dChJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYp
IG92ZXJyaWRlOworICAgIExheW91dFVuaXQgdXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdCBvdmVy
cmlkZTsKKworICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgLy8gVGhpcyBjbGFz
cyBpbXBsZW1lbnRzIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcgZm9yIGZsZXggaXRlbXMuCisgICAg
Y2xhc3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIEdlb21ldHJ5KGNvbnN0IEZsZXhGb3JtYXR0aW5nQ29udGV4dCYp
OworCisgICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2ljV2lkdGhDb25z
dHJhaW50cyhjb25zdCBDb250YWluZXJCb3gmKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGNv
bnN0IEZsZXhGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJl
dHVybiBkb3duY2FzdDxGbGV4Rm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpH
ZW9tZXRyeTo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KKyAgICB9OworICAgIEZsZXhGb3JtYXR0
aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBHZW9tZXRyeSgq
dGhpcyk7IH0KKworICAgIHZvaWQgc2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0IENvbnN0cmFp
bnRzRm9ySW5GbG93Q29udGVudCYpOworICAgIHZvaWQgY29tcHV0ZUludHJpbnNpY1dpZHRoQ29u
c3RyYWludHNGb3JGbGV4SXRlbXMoKTsKKworICAgIGNvbnN0IEZsZXhGb3JtYXR0aW5nU3RhdGUm
IGZvcm1hdHRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEZsZXhGb3JtYXR0aW5n
U3RhdGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KKyAgICBGbGV4
Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3duY2FzdDxGbGV4
Rm9ybWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9
Cit9OworCitpbmxpbmUgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6R2VvbWV0cnko
Y29uc3QgRmxleEZvcm1hdHRpbmdDb250ZXh0JiBmbGV4Rm9ybWF0dGluZ0NvbnRleHQpCisgICAg
OiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkoZmxleEZvcm1hdHRpbmdDb250ZXh0KQorewor
fQorCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09O
VEVYVChGbGV4Rm9ybWF0dGluZ0NvbnRleHQsIGlzRmxleEZvcm1hdHRpbmdDb250ZXh0KCkpCisK
KyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250
ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0Zs
ZXhGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYzdjOGRkMDk4MDlk
MWQwYjU4NGFiZmY3OGRkMTc5MWJmZjQ2ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0
dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGbGV4Rm9ybWF0dGluZ0NvbnRleHQuaCIKKwor
I2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRmxleEZv
cm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVk
ZSAiTGF5b3V0Q29udGV4dC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5
b3V0IHsKKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgRmxl
eEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhj
b25zdCBDb250YWluZXJCb3gmIGZsZXhJdGVtKQoreworICAgIGF1dG8gZml4ZWRNYXJnaW5Cb3Jk
ZXJBbmRQYWRkaW5nID0gWyZdKGF1dG8mIGxheW91dEJveCkgeworICAgICAgICBhdXRvJiBzdHls
ZSA9IGxheW91dEJveC5zdHlsZSgpOworICAgICAgICByZXR1cm4gZml4ZWRWYWx1ZShzdHlsZS5t
YXJnaW5TdGFydCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIExheW91dFVuaXQgeyBzdHls
ZS5ib3JkZXJMZWZ0V2lkdGgoKSB9CisgICAgICAgICAgICArIGZpeGVkVmFsdWUoc3R5bGUucGFk
ZGluZ0xlZnQoKSkudmFsdWVPcigwKQorICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0eWxlLnBh
ZGRpbmdSaWdodCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIExheW91dFVuaXQgeyBzdHls
ZS5ib3JkZXJSaWdodFdpZHRoKCkgfQorICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0eWxlLm1h
cmdpbkVuZCgpKS52YWx1ZU9yKDApOworICAgIH07CisKKyAgICBhdXRvIGNvbXB1dGVkSW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyA9IFsmXSgpIC0+IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMg
eworICAgICAgICBhdXRvIGxvZ2ljYWxXaWR0aCA9IGZsZXhJdGVtLnN0eWxlKCkubG9naWNhbFdp
ZHRoKCk7CisgICAgICAgIC8vIE1pbmltdW0vbWF4aW11bSB3aWR0aCBjYW4ndCBiZSBkZXBlbmRp
bmcgb24gdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0aC4KKyAgICAgICAgYXV0byBuZWVkc1Jl
c29sdmVkQ29udGFpbmluZ0Jsb2NrV2lkdGggPSBsb2dpY2FsV2lkdGguaXNDYWxjdWxhdGVkKCkg
fHwgbG9naWNhbFdpZHRoLmlzUGVyY2VudCgpIHx8IGxvZ2ljYWxXaWR0aC5pc1JlbGF0aXZlKCk7
CisgICAgICAgIGlmIChuZWVkc1Jlc29sdmVkQ29udGFpbmluZ0Jsb2NrV2lkdGgpCisgICAgICAg
ICAgICByZXR1cm4geyB9OworCisgICAgICAgIGlmIChhdXRvIHdpZHRoID0gZml4ZWRWYWx1ZShs
b2dpY2FsV2lkdGgpKQorICAgICAgICAgICAgcmV0dXJuIHsgKndpZHRoLCAqd2lkdGggfTsKKwor
ICAgICAgICBBU1NFUlQoZmxleEl0ZW0uZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsK
KyAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gTGF5b3V0Q29udGV4dDo6
Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZmxleEl0ZW0sIGxheW91dFN0YXRlKCkpLT5jb21wdXRl
ZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKKyAgICAgICAgaWYgKGxvZ2ljYWxXaWR0aC5p
c01pbkNvbnRlbnQoKSkKKyAgICAgICAgICAgIHJldHVybiB7IGludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMubWluaW11bSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtIH07CisgICAg
ICAgIGlmIChsb2dpY2FsV2lkdGguaXNNYXhDb250ZW50KCkpCisgICAgICAgICAgICByZXR1cm4g
eyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIGludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMubWF4aW11bSB9OworICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50
czsKKyAgICB9OworICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGNvbnN0cmFp
bkJ5TWluTWF4V2lkdGgoZmxleEl0ZW0sIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cygpKTsKKyAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLmV4cGFuZChmaXhlZE1hcmdpbkJv
cmRlckFuZFBhZGRpbmcoZmxleEl0ZW0pKTsKKyAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25z
dHJhaW50czsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdT
dGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhm
b3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQ1OWZjODVhMDM4
NTJkMzM1MjYxMzg0MGYzMTIyYzczM2M1NGZhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3Jt
YXR0aW5nU3RhdGUuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdTdGF0ZS5oIgorCisjaWYgRU5BQkxF
KExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5s
aW5lcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworV1RG
X01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEZsZXhGb3JtYXR0aW5nU3RhdGUpOworCitGbGV4Rm9y
bWF0dGluZ1N0YXRlOjpGbGV4Rm9ybWF0dGluZ1N0YXRlKFJlZjxGbG9hdGluZ1N0YXRlPiYmIGZs
b2F0aW5nU3RhdGUsIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKKyAgICA6IEZvcm1hdHRpbmdT
dGF0ZShXVEZNb3ZlKGZsb2F0aW5nU3RhdGUpLCBUeXBlOjpGbGV4LCBsYXlvdXRTdGF0ZSkKK3sK
K30KKworRmxleEZvcm1hdHRpbmdTdGF0ZTo6fkZsZXhGb3JtYXR0aW5nU3RhdGUoKQoreworfQor
Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5oIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9y
bWF0dGluZ1N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTA2M2I5ZGEyYTViOGRjMjcwMjA4Nzk0YTQ4MzY1
NDQxNjA5ZTNhMwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5oCkBAIC0w
LDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRm9ybWF0dGluZ1N0YXRlLmgiCisj
aW5jbHVkZSAiSW5saW5lUmVjdC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIEZsZXhGb3JtYXR0
aW5nU3RhdGUgOiBwdWJsaWMgRm9ybWF0dGluZ1N0YXRlIHsKKyAgICBXVEZfTUFLRV9JU09fQUxM
T0NBVEVEKEZsZXhGb3JtYXR0aW5nU3RhdGUpOworcHVibGljOgorICAgIEZsZXhGb3JtYXR0aW5n
U3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRlJik7CisgICAgfkZsZXhGb3Jt
YXR0aW5nU3RhdGUoKTsKKworICAgIGNvbnN0IGF1dG8mIGxpbmVzKCkgY29uc3QgeyByZXR1cm4g
bV9saW5lczsgfQorICAgIHZvaWQgYWRkTGluZShjb25zdCBJbmxpbmVSZWN0JiBsaW5lKSB7IG1f
bGluZXMuYXBwZW5kKGxpbmUpOyB9CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPElubGluZVJlY3Q+
IG1fbGluZXM7Cit9OworCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZP
Uk1BVFRJTkdfU1RBVEUoRmxleEZvcm1hdHRpbmdTdGF0ZSwgaXNGbGV4Rm9ybWF0dGluZ1N0YXRl
KCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2VyLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9J
bmxpbmVDb250ZW50QnJlYWtlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTQwYTZkYTlmOWMxNGYwMTQ0NTFm
YWRhMjQ2ZmIwZWJjZDEyZDJiOAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJl
YWtlci5jcHAKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
CisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisg
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiSW5saW5lQ29udGVudEJyZWFrZXIuaCIKKworI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRm9udENhc2NhZGUuaCIKKyNpbmNs
dWRlICJIeXBoZW5hdGlvbi5oIgorI2luY2x1ZGUgIklubGluZUl0ZW0uaCIKKyNpbmNsdWRlICJJ
bmxpbmVUZXh0SXRlbS5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgorI2luY2x1
ZGUgIlRleHRVdGlsLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQg
eworCisKKyNpZiBBU1NFUlRfRU5BQkxFRAorc3RhdGljIGlubGluZSBib29sIGhhc1RyYWlsaW5n
VGV4dENvbnRlbnQoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50
JiBjb250aW51b3VzQ29udGVudCkKK3sKKyAgICBmb3IgKGF1dG8mIHJ1biA6IFdURjo6bWFrZVJl
dmVyc2VkUmFuZ2UoY29udGludW91c0NvbnRlbnQucnVucygpKSkgeworICAgICAgICBhdXRvJiBp
bmxpbmVJdGVtID0gcnVuLmlubGluZUl0ZW07CisgICAgICAgIGlmIChpbmxpbmVJdGVtLmlzSW5s
aW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpCisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgcmV0dXJuIGlubGluZUl0ZW0uaXNUZXh0KCk7CisgICAgfQor
ICAgIHJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGJvb2wgaGFzTGVh
ZGluZ1RleHRDb250ZW50KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29u
dGVudCYgY29udGludW91c0NvbnRlbnQpCit7CisgICAgZm9yIChhdXRvJiBydW4gOiBjb250aW51
b3VzQ29udGVudC5ydW5zKCkpIHsKKyAgICAgICAgYXV0byYgaW5saW5lSXRlbSA9IHJ1bi5pbmxp
bmVJdGVtOworICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5s
aW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IHJldHVybiBpbmxpbmVJdGVtLmlzVGV4dCgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNUZXh0UnVuKGNvbnN0IElubGluZUNvbnRlbnRCcmVh
a2VyOjpDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQpCit7CisgICAgLy8gPHNw
YW4+dGV4dDwvc3Bhbj4gaXMgY29uc2lkZXJlZCBhIHRleHQgcnVuIGV2ZW4gd2l0aCB0aGUgW2lu
bGluZSBib3ggc3RhcnRdW2lubGluZSBib3ggZW5kXSBpbmxpbmUgaXRlbXMuCisgICAgLy8gQmFz
ZWQgb24gc3RhbmRhcmRzIGNvbW1pdCBib3VuZGFyeSBydWxlcyBpdCB3b3VsZCBiZSBlbm91Z2gg
dG8gY2hlY2sgdGhlIGZpcnN0IGlubGluZSBpdGVtLCBidXQgZHVlIHRvIHRoZSB0YWJsZSBxdWly
aywgd2UgY2FuIGhhdmUKKyAgICAvLyBpbWFnZSBhbmQgdGV4dCBuZXh0IHRvIGVhY2ggb3RoZXIg
aW5zaWRlIGEgY29udGludW91cyBzZXQgb2YgcnVucyAoc2VlIElubGluZUZvcm1hdHRpbmdDb250
ZXh0OjpRdWlya3M6Omhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdlKS4KKyAgICBmb3IgKGF1
dG8mIHJ1biA6IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKSkgeworICAgICAgICBpZiAocnVuLmlu
bGluZUl0ZW0uaXNUZXh0KCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAg
cmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNWaXN1YWxseUVtcHR5V2hp
dGVzcGFjZUNvbnRlbnQoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250
ZW50JiBjb250aW51b3VzQ29udGVudCkKK3sKKyAgICAvLyBbPHNwYW4+PC9zcGFuPiBdIFs8c3Bh
bj4gPC9zcGFuPl0gWyA8c3BhbiBzdHlsZT0icGFkZGluZzogMHB4OyI+PC9zcGFuPl0gYXJlIGFs
bCBjb25zaWRlcmVkIHZpc3VhbGx5IGVtcHR5IHdoaXRlc3BhY2UgY29udGVudC4KKyAgICAvLyBb
PHNwYW4gc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIHJlZCI+PC9zcGFuPiBdIHdoaWxlIHRoaXMg
aXMgd2hpdGVzcGFjZSBjb250ZW50IG9ubHksIGl0IGlzIG5vdCBjb25zaWRlcmVkIHZpc3VhbGx5
IGVtcHR5LgorICAgIC8vIER1ZSB0byBjb21taXQgYm91bmRhcnkgcnVsZXMsIHdlIGp1c3QgbmVl
ZCB0byBjaGVjayB0aGUgZmlyc3Qgbm9uLXR5cGVsZXNzIGlubGluZSBpdGVtIChjYW4ndCBoYXZl
IGJvdGggW2ltZ10gYW5kIFt0ZXh0XSkKKyAgICBmb3IgKGF1dG8mIHJ1biA6IGNvbnRpbnVvdXND
b250ZW50LnJ1bnMoKSkgeworICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gcnVuLmlubGluZUl0
ZW07CisgICAgICAgIC8vIEZJWE1FOiBjaGVjayBmb3IgcGFkZGluZyBib3JkZXIgZXRjLgorICAg
ICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lu
bGluZUJveEVuZCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJldHVybiBpbmxp
bmVJdGVtLmlzVGV4dCgpICYmIGRvd25jYXN0PElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKS5p
c1doaXRlc3BhY2UoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5s
aW5lIGJvb2wgaXNOb25Db250ZW50UnVuc09ubHkoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6
OkNvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkKK3sKKyAgICAvLyA8c3Bhbj48
L3NwYW4+IDwtIG5vbiBjb250ZW50IHJ1bnMuCisgICAgZm9yIChhdXRvJiBydW4gOiBjb250aW51
b3VzQ29udGVudC5ydW5zKCkpIHsKKyAgICAgICAgYXV0byYgaW5saW5lSXRlbSA9IHJ1bi5pbmxp
bmVJdGVtOworICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5s
aW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxp
bmUgT3B0aW9uYWw8c2l6ZV90PiBmaXJzdFRleHRSdW5JbmRleChjb25zdCBJbmxpbmVDb250ZW50
QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250ZW50KQoreworICAgIGF1
dG8mIHJ1bnMgPSBjb250aW51b3VzQ29udGVudC5ydW5zKCk7CisgICAgZm9yIChzaXplX3QgaW5k
ZXggPSAwOyBpbmRleCA8IHJ1bnMuc2l6ZSgpOyArK2luZGV4KSB7CisgICAgICAgIGlmIChydW5z
W2luZGV4XS5pbmxpbmVJdGVtLmlzVGV4dCgpKQorICAgICAgICAgICAgcmV0dXJuIGluZGV4Owor
ICAgIH0KKyAgICByZXR1cm4geyB9OworfQorCitib29sIElubGluZUNvbnRlbnRCcmVha2VyOjpp
c1dyYXBwaW5nQWxsb3dlZChjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQoreworICAgIGF1
dG8mIHN0eWxlVG9Vc2UgPSBpbmxpbmVJdGVtLmlzQm94KCkgPyBpbmxpbmVJdGVtLmxheW91dEJv
eCgpLnBhcmVudCgpLnN0eWxlKCkgOiBpbmxpbmVJdGVtLmxheW91dEJveCgpLnN0eWxlKCk7IAor
ICAgIC8vIERvIG5vdCB0cnkgdG8gd3JhcCBvdmVyZmxvd24gJ3ByZScgYW5kICduby13cmFwJyBj
b250ZW50IHRvIG5leHQgbGluZS4KKyAgICByZXR1cm4gc3R5bGVUb1VzZS53aGl0ZVNwYWNlKCkg
IT0gV2hpdGVTcGFjZTo6UHJlICYmIHN0eWxlVG9Vc2Uud2hpdGVTcGFjZSgpICE9IFdoaXRlU3Bh
Y2U6Ok5vV3JhcDsKK30KKworYm9vbCBJbmxpbmVDb250ZW50QnJlYWtlcjo6c2hvdWxkS2VlcEVu
ZE9mTGluZVdoaXRlc3BhY2UoY29uc3QgQ29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250
ZW50KSBjb25zdAoreworICAgIC8vIEdyYWIgdGhlIHN0eWxlIGFuZCBjaGVjayBmb3Igd2hpdGUt
c3BhY2UgcHJvcGVydHkgdG8gZGVjaWRlIHdoZXRoZXIgd2Ugc2hvdWxkIGxldCB0aGlzIHdoaXRl
c3BhY2UgY29udGVudCBvdmVyZmxvdyB0aGUgY3VycmVudCBsaW5lLgorICAgIC8vIE5vdGUgdGhh
dCB0aGUgImtlZXAiIGluIHRoaXMgY29udGV4dCBtZWFucyB3ZSBsZXQgdGhlIHdoaXRlc3BhY2Ug
Y29udGVudCBzaXQgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAvLyBJdCBtaWdodCB2ZXJ5IHdl
bGwgZ2V0IGNvbGxhcHNlZCB3aGVuIHdlIGNsb3NlIHRoZSBsaW5lIChub3JtYWwvbm93cmFwL3By
ZS1saW5lKS4KKyAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10ZXh0LTMvI3do
aXRlLXNwYWNlLXByb3BlcnR5CisgICAgYXV0byB3aGl0ZXNwYWNlID0gY29udGludW91c0NvbnRl
bnQucnVucygpWypmaXJzdFRleHRSdW5JbmRleChjb250aW51b3VzQ29udGVudCldLmlubGluZUl0
ZW0uc3R5bGUoKS53aGl0ZVNwYWNlKCk7CisgICAgcmV0dXJuIHdoaXRlc3BhY2UgPT0gV2hpdGVT
cGFjZTo6Tm9ybWFsIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6Tm9XcmFwIHx8IHdoaXRl
c3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlV3JhcCB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6
OlByZUxpbmU7Cit9CisKK0lubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQgSW5saW5lQ29udGVu
dEJyZWFrZXI6OnByb2Nlc3NJbmxpbmVDb250ZW50KGNvbnN0IENvbnRpbnVvdXNDb250ZW50JiBj
YW5kaWRhdGVDb250ZW50LCBjb25zdCBMaW5lU3RhdHVzJiBsaW5lU3RhdHVzKQoreworICAgIEFT
U0VSVCghc3RkOjppc25hbihsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKSk7CisgICAgYXV0byBw
cm9jZXNzQ2FuZGlkYXRlQ29udGVudCA9IFsmXSB7CisgICAgICAgIGlmIChjYW5kaWRhdGVDb250
ZW50LmxvZ2ljYWxXaWR0aCgpIDw9IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGgpCisgICAgICAg
ICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246OktlZXAgfTsKKyNpZiBVU0VfRkxP
QVRfQVNfSU5MSU5FX0xBWU9VVF9VTklUCisgICAgICAgIC8vIFByZWZlcnJlZCB3aWR0aCBjb21w
dXRhdGlvbiBzdW1zIHVwIGZsb2F0cyB3aGlsZSBsaW5lIGJyZWFrZXIgc3VidHJhY3RzIHRoZW0u
IFRoaXMgY2FuIGxlYWQgdG8gZXBzaWxvbi1zY2FsZSBkaWZmZXJlbmNlcy4KKyAgICAgICAgaWYg
KFdURjo6YXJlRXNzZW50aWFsbHlFcXVhbChjYW5kaWRhdGVDb250ZW50LmxvZ2ljYWxXaWR0aCgp
LCBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKSkKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQg
eyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCB9OworI2VuZGlmCisgICAgICAgIHJldHVybiBwcm9jZXNz
T3ZlcmZsb3dpbmdDb250ZW50KGNhbmRpZGF0ZUNvbnRlbnQsIGxpbmVTdGF0dXMpOworICAgIH07
CisKKyAgICBhdXRvIHJlc3VsdCA9IHByb2Nlc3NDYW5kaWRhdGVDb250ZW50KCk7CisgICAgaWYg
KHJlc3VsdC5hY3Rpb24gPT0gUmVzdWx0OjpBY3Rpb246OldyYXAgJiYgbGluZVN0YXR1cy50cmFp
bGluZ1NvZnRIeXBoZW5XaWR0aCAmJiBoYXNMZWFkaW5nVGV4dENvbnRlbnQoY2FuZGlkYXRlQ29u
dGVudCkpIHsKKyAgICAgICAgLy8gQSB0cmFpbGluZyBzb2Z0IGh5cGhlbiB3aXRoIGEgd3JhcHBl
ZCB0ZXh0IGNvbnRlbnQgdHVybnMgaW50byBhIHZpc2libGUgaHlwaGVuLgorICAgICAgICAvLyBM
ZXQncyBjaGVjayBpZiB0aGVyZSdzIGVub3VnaCBzcGFjZSBmb3IgdGhlIGh5cGhlbiBjaGFyYWN0
ZXIuCisgICAgICAgIGF1dG8gaHlwaGVuT3ZlcmZsb3dzID0gKmxpbmVTdGF0dXMudHJhaWxpbmdT
b2Z0SHlwaGVuV2lkdGggPiBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoOworICAgICAgICBhdXRv
IGFjdGlvbiA9IGh5cGhlbk92ZXJmbG93cyA/IFJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xhc3RO
b25PdmVyZmxvd2luZ1dyYXBPcHBvcnR1bml0eSA6IFJlc3VsdDo6QWN0aW9uOjpXcmFwV2l0aEh5
cGhlbjsKKyAgICAgICAgcmVzdWx0ID0geyBhY3Rpb24sIElzRW5kT2ZMaW5lOjpZZXMgfTsKKyAg
ICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IE92ZXJmbG93aW5nVGV4dENvbnRl
bnQgeworICAgIHNpemVfdCBydW5JbmRleCB7IDAgfTsgLy8gT3ZlcmZsb3dpbmcgcnVuIGluZGV4
LiBUaGVyZSdzIGFsd2F5cyBhbiBvdmVyZmxvd2luZyBydW4uCisgICAgc3RydWN0IEJyZWFraW5n
UG9zaXRpb24geworICAgICAgICBzaXplX3QgcnVuSW5kZXggeyAwIH07CisgICAgICAgIHN0cnVj
dCBUcmFpbGluZ0NvbnRlbnQgeworICAgICAgICAgICAgLy8gVHJhaWxpbmcgY29udGVudCBpcyBl
aXRoZXIgdGhlIHJ1bidzIGxlZnQgc2lkZSAod2hlbiB3ZSBicmVhayB0aGUgcnVuIHNvbWV3aGVy
ZSBpbiB0aGUgbWlkZGxlKSBvciB0aGUgcHJldmlvdXMgcnVuLgorICAgICAgICAgICAgLy8gU29t
ZXRpbWVzIHRoZSBicmVha2luZyBwb3NpdGlvbiBpcyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Yg
dGhlIGZpcnN0IHJ1biwgc28gdGhlcmUncyBubyB0cmFpbGluZyBydW4gYXQgYWxsLgorICAgICAg
ICAgICAgYm9vbCBvdmVyZmxvd3MgeyBmYWxzZSB9OworICAgICAgICAgICAgT3B0aW9uYWw8SW5s
aW5lQ29udGVudEJyZWFrZXI6OlBhcnRpYWxSdW4+IHBhcnRpYWxSdW4geyB9OworICAgICAgICB9
OworICAgICAgICBPcHRpb25hbDxUcmFpbGluZ0NvbnRlbnQ+IHRyYWlsaW5nQ29udGVudCB7IH07
CisgICAgfTsKKyAgICBPcHRpb25hbDxCcmVha2luZ1Bvc2l0aW9uPiBicmVha2luZ1Bvc2l0aW9u
IHsgfTsgLy8gV2hlcmUgd2UgYWN0dWFsbHkgYnJlYWsgdGhpcyBvdmVyZmxvd2luZyBjb250ZW50
LgorfTsKKworSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdCBJbmxpbmVDb250ZW50QnJlYWtl
cjo6cHJvY2Vzc092ZXJmbG93aW5nQ29udGVudChjb25zdCBDb250aW51b3VzQ29udGVudCYgb3Zl
cmZsb3dDb250ZW50LCBjb25zdCBMaW5lU3RhdHVzJiBsaW5lU3RhdHVzKSBjb25zdAoreworICAg
IGF1dG8gY29udGludW91c0NvbnRlbnQgPSBDb250aW51b3VzQ29udGVudCB7IG92ZXJmbG93Q29u
dGVudCB9OworICAgIEFTU0VSVCghY29udGludW91c0NvbnRlbnQucnVucygpLmlzRW1wdHkoKSk7
CisKKyAgICBBU1NFUlQoY29udGludW91c0NvbnRlbnQubG9naWNhbFdpZHRoKCkgPiBsaW5lU3Rh
dHVzLmF2YWlsYWJsZVdpZHRoKTsKKyAgICBpZiAoY29udGludW91c0NvbnRlbnQuaGFzVHJhaWxp
bmdDb2xsYXBzaWJsZUNvbnRlbnQoKSkgeworICAgICAgICBBU1NFUlQoaGFzVHJhaWxpbmdUZXh0
Q29udGVudChvdmVyZmxvd0NvbnRlbnQpKTsKKyAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhl
IGNvbnRlbnQgZml0cyB3aXRob3V0IHRoZSB0cmFpbGluZyBjb2xsYXBzaWJsZSBwYXJ0LgorICAg
ICAgICBpZiAoY29udGludW91c0NvbnRlbnQubm9uQ29sbGFwc2libGVMb2dpY2FsV2lkdGgoKSA8
PSBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKQorICAgICAgICAgICAgcmV0dXJuIHsgUmVzdWx0
OjpBY3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpObyB9OworICAgICAgICAvLyBOb3cgY2hlY2sg
aWYgd2UgY2FuIHRyaW0gdGhlIGxpbmUgdG9vLgorICAgICAgICBpZiAobGluZVN0YXR1cy5oYXNG
dWxseUNvbGxhcHNpYmxlVHJhaWxpbmdSdW4gJiYgY29udGludW91c0NvbnRlbnQuaXNGdWxseUNv
bGxhcHNpYmxlKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgbmV3IGNvbnRlbnQgaXMgZnVs
bHkgY29sbGFwc2libGUsIGl0IHNob3VsZCBzdXJlbHkgZml0LgorICAgICAgICAgICAgcmV0dXJu
IHsgUmVzdWx0OjpBY3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpObyB9OworICAgICAgICB9Cisg
ICAgfSBlbHNlIGlmIChsaW5lU3RhdHVzLmNvbGxhcHNpYmxlV2lkdGggJiYgaXNOb25Db250ZW50
UnVuc09ubHkoY29udGludW91c0NvbnRlbnQpKSB7CisgICAgICAgIC8vIExldCdzIHNlZSBpZiB0
aGUgbm9uLWNvbnRlbnQgcnVucyBmaXQgd2hlbiB0aGUgbGluZSBoYXMgdHJhaWxpbmcgY29sbGFw
c2libGUgY29udGVudC4KKyAgICAgICAgLy8gInRleHQgY29udGVudCA8c3BhbiBzdHlsZT0icGFk
ZGluZzogMXB4Ij48L3NwYW4+IiA8LSB0aGUgPHNwYW4+PC9zcGFuPiBydW5zIGNvdWxkIGZpdCBh
ZnRlciBjb2xsYXBzaW5nIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICAgICBpZiAoY29u
dGludW91c0NvbnRlbnQubG9naWNhbFdpZHRoKCkgPD0gbGluZVN0YXR1cy5hdmFpbGFibGVXaWR0
aCArIGxpbmVTdGF0dXMuY29sbGFwc2libGVXaWR0aCkKKyAgICAgICAgICAgIHJldHVybiB7IFJl
c3VsdDo6QWN0aW9uOjpLZWVwIH07CisgICAgfQorICAgIGlmIChpc1Zpc3VhbGx5RW1wdHlXaGl0
ZXNwYWNlQ29udGVudChjb250aW51b3VzQ29udGVudCkgJiYgc2hvdWxkS2VlcEVuZE9mTGluZVdo
aXRlc3BhY2UoY29udGludW91c0NvbnRlbnQpKSB7CisgICAgICAgIC8vIFRoaXMgb3ZlcmZsb3dp
bmcgY29udGVudCBhcHBhcmVudGx5IGZhbGxzIGludG8gdGhlIHJlbW92ZS9oYW5nIGVuZC1vZi1s
aW5lLXNwYWNlcyBjYXRlZ29yeS4KKyAgICAgICAgLy8gc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9U
Ui9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eSBtYXRyaXgKKyAgICAgICAgcmV0dXJu
IHsgUmVzdWx0OjpBY3Rpb246OktlZXAgfTsKKyAgICB9CisKKyAgICBzaXplX3Qgb3ZlcmZsb3dp
bmdSdW5JbmRleCA9IDA7CisgICAgaWYgKGhhc1RleHRSdW4oY29udGludW91c0NvbnRlbnQpKSB7
CisgICAgICAgIGF1dG8gdHJ5QnJlYWtpbmdDb250ZW50V2l0aFRleHQgPSBbJl0oKSAtPiBPcHRp
b25hbDxSZXN1bHQ+IHsKKyAgICAgICAgICAgIC8vIDEuIFRoaXMgdGV4dCBjb250ZW50IGlzIG5v
dCBicmVha2FibGUuCisgICAgICAgICAgICAvLyAyLiBUaGlzIGJyZWFrYWJsZSB0ZXh0IGNvbnRl
bnQgZG9lcyBub3QgZml0IGF0IGFsbC4gTm90IGV2ZW4gdGhlIGZpcnN0IGdseXBoLiBUaGlzIGlz
IGEgdmVyeSBzcGVjaWFsIGNhc2UuCisgICAgICAgICAgICAvLyAzLiBXZSBjYW4gYnJlYWsgdGhl
IGNvbnRlbnQgYnV0IGl0IHN0aWxsIG92ZXJmbG93cy4KKyAgICAgICAgICAgIC8vIDQuIE1hbmFn
ZWQgdG8gYnJlYWsgdGhlIGNvbnRlbnQgYmVmb3JlIHRoZSBvdmVyZmxvdyBwb2ludC4KKyAgICAg
ICAgICAgIGF1dG8gb3ZlcmZsb3dpbmdDb250ZW50ID0gcHJvY2Vzc092ZXJmbG93aW5nQ29udGVu
dFdpdGhUZXh0KGNvbnRpbnVvdXNDb250ZW50LCBsaW5lU3RhdHVzKTsKKyAgICAgICAgICAgIG92
ZXJmbG93aW5nUnVuSW5kZXggPSBvdmVyZmxvd2luZ0NvbnRlbnQucnVuSW5kZXg7CisgICAgICAg
ICAgICBpZiAoIW92ZXJmbG93aW5nQ29udGVudC5icmVha2luZ1Bvc2l0aW9uKQorICAgICAgICAg
ICAgICAgIHJldHVybiB7IH07CisgICAgICAgICAgICBhdXRvIHRyYWlsaW5nQ29udGVudCA9IG92
ZXJmbG93aW5nQ29udGVudC5icmVha2luZ1Bvc2l0aW9uLT50cmFpbGluZ0NvbnRlbnQ7CisgICAg
ICAgICAgICBpZiAoIXRyYWlsaW5nQ29udGVudCkgeworICAgICAgICAgICAgICAgIC8vIFdlIHRy
aWVkIHRvIGJyZWFrIHRoZSBjb250ZW50IGJ1dCB0aGUgYXZhaWxhYmxlIHNwYWNlIGNhbid0IGV2
ZW4gYWNjb21tb2RhdGUgdGhlIGZpcnN0IGdseXBoLgorICAgICAgICAgICAgICAgIC8vIDEuIFdy
YXAgdGhlIGNvbnRlbnQgb3ZlciB0byB0aGUgbmV4dCBsaW5lIHdoZW4gd2UndmUgZ290IGNvbnRl
bnQgb24gdGhlIGxpbmUgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICAvLyAyLiBLZWVwIHRoZSBm
aXJzdCBnbHlwaCBvbiB0aGUgZW1wdHkgbGluZSAob3Iga2VlcCB0aGUgd2hvbGUgcnVuIGlmIGl0
IGhhcyBvbmx5IG9uZSBnbHlwaC9jb21wbGV0ZWx5IGVtcHR5KS4KKyAgICAgICAgICAgICAgICBp
ZiAobGluZVN0YXR1cy5oYXNDb250ZW50KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVz
dWx0IHsgUmVzdWx0OjpBY3Rpb246OldyYXAsIElzRW5kT2ZMaW5lOjpZZXMgfTsKKyAgICAgICAg
ICAgICAgICBhdXRvIGxlYWRpbmdUZXh0UnVuSW5kZXggPSAqZmlyc3RUZXh0UnVuSW5kZXgoY29u
dGludW91c0NvbnRlbnQpOworICAgICAgICAgICAgICAgIGF1dG8mIGlubGluZVRleHRJdGVtID0g
ZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKVtsZWFkaW5n
VGV4dFJ1bkluZGV4XS5pbmxpbmVJdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5saW5lVGV4
dEl0ZW0ubGVuZ3RoKCkgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdCB7
IFJlc3VsdDo6QWN0aW9uOjpLZWVwLCBJc0VuZE9mTGluZTo6WWVzIH07CisgICAgICAgICAgICAg
ICAgYXV0byBmaXJzdENoYXJhY3RlcldpZHRoID0gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRJ
dGVtLCBpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBpbmxpbmVUZXh0SXRlbS5zdGFydCgpICsgMSwg
bGluZVN0YXR1cy5jb250ZW50TG9naWNhbFJpZ2h0KTsKKyAgICAgICAgICAgICAgICBhdXRvIGZp
cnN0Q2hhcmFjdGVyUnVuID0gUGFydGlhbFJ1biB7IDEsIGZpcnN0Q2hhcmFjdGVyV2lkdGggfTsK
KyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246OkJyZWFrLCBJ
c0VuZE9mTGluZTo6WWVzLCBSZXN1bHQ6OlBhcnRpYWxUcmFpbGluZ0NvbnRlbnQgeyBsZWFkaW5n
VGV4dFJ1bkluZGV4LCBmaXJzdENoYXJhY3RlclJ1biB9IH07CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAodHJhaWxpbmdDb250ZW50LT5vdmVyZmxvd3MgJiYgbGluZVN0YXR1cy5oYXND
b250ZW50KSB7CisgICAgICAgICAgICAgICAgLy8gV2UgbWFuYWdlZCB0byBicmVhayBhIHJ1biB3
aXRoIG92ZXJmbG93IGJ1dCB0aGUgbGluZSBhbHJlYWR5IGhhcyBjb250ZW50LiBMZXQncyB3cmFw
IGl0IHRvIHRoZSBuZXh0IGxpbmUuCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdCB7IFJl
c3VsdDo6QWN0aW9uOjpXcmFwLCBJc0VuZE9mTGluZTo6WWVzIH07CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAvLyBFaXRoZXIgd2UgbWFuYWdlZCB0byBicmVhayB3aXRoIG5vIG92ZXJmbG93
IG9yIHRoZSBsaW5lIGlzIGVtcHR5LgorICAgICAgICAgICAgYXV0byB0cmFpbGluZ1BhcnRpYWxD
b250ZW50ID0gUmVzdWx0OjpQYXJ0aWFsVHJhaWxpbmdDb250ZW50IHsgb3ZlcmZsb3dpbmdDb250
ZW50LmJyZWFraW5nUG9zaXRpb24tPnJ1bkluZGV4LCB0cmFpbGluZ0NvbnRlbnQtPnBhcnRpYWxS
dW4gfTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6OkFjdGlvbjo6QnJlYWss
IElzRW5kT2ZMaW5lOjpZZXMsIHRyYWlsaW5nUGFydGlhbENvbnRlbnQgfTsKKyAgICAgICAgfTsK
KyAgICAgICAgaWYgKGF1dG8gcmVzdWx0ID0gdHJ5QnJlYWtpbmdDb250ZW50V2l0aFRleHQoKSkK
KyAgICAgICAgICAgIHJldHVybiAqcmVzdWx0OworICAgIH0gZWxzZSBpZiAoY29udGludW91c0Nv
bnRlbnQucnVucygpLnNpemUoKSA+IDEpIHsKKyAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0
IGZvciB2YXJpb3VzIGNvbnRlbnQuCisgICAgICAgIGF1dG8mIHJ1bnMgPSBjb250aW51b3VzQ29u
dGVudC5ydW5zKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcnVucy5zaXplKCk7
ICsraSkgeworICAgICAgICAgICAgaWYgKHJ1bnNbaV0uaW5saW5lSXRlbS5pc0JveCgpKSB7Cisg
ICAgICAgICAgICAgICAgb3ZlcmZsb3dpbmdSdW5JbmRleCA9IGk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB3ZSBh
cmUgbm90IGFsbG93ZWQgdG8gYnJlYWsgdGhpcyBvdmVyZmxvd2luZyBjb250ZW50LCB3ZSBzdGls
bCBuZWVkIHRvIGRlY2lkZSB3aGV0aGVyIGtlZXAgaXQgb3Igd3JhcCBpdCB0byB0aGUgbmV4dCBs
aW5lLgorICAgIGlmICghbGluZVN0YXR1cy5oYXNDb250ZW50KQorICAgICAgICByZXR1cm4geyBS
ZXN1bHQ6OkFjdGlvbjo6S2VlcCwgSXNFbmRPZkxpbmU6Ok5vIH07CisgICAgLy8gTm93IGVpdGhl
ciB3cmFwIHRoaXMgY29udGVudCBvdmVyIHRvIHRoZSBuZXh0IGxpbmUgb3IgcmV2ZXJ0IGJhY2sg
dG8gYW4gZWFybGllciB3cmFwcGluZyBvcHBvcnR1bml0eSwgb3Igbm90IHdyYXAgYXQgYWxsLgor
ICAgIGF1dG8gc2hvdWxkV3JhcFVuYnJlYWthYmxlQ29udGVudFRvTmV4dExpbmUgPSBbJl0gewor
ICAgICAgICAvLyBUaGUgaW5kaXZpZHVhbCBydW5zIGluIHRoaXMgY29udGludW91cyBjb250ZW50
IGRvbid0IGJyZWFrLCBsZXQncyBjaGVjayBpZiB3ZSBhcmUgYWxsb3dlZCB0byB3cmFwIHRoaXMg
Y29udGVudCB0byBuZXh0IGxpbmUgKGUuZy4gcHJlIHdvdWxkIHByZXZlbnQgdXMgZnJvbSB3cmFw
cGluZykuCisgICAgICAgIC8vIFBhcmVudCBzdHlsZSBkcml2ZXMgdGhlIHdyYXBwaW5nIGJlaGF2
aW9yIGhlcmUuCisgICAgICAgIC8vIGUuZy4gPGRpdiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3Jh
cCI+c29tZSB0ZXh0PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFj
ZTogcHJlLXdyYXAiPjwvZGl2PjwvZGl2Pi4KKyAgICAgICAgLy8gV2hpbGUgdGhlIGlubGluZS1i
bG9jayBoYXMgcHJlLXdyYXAgd2hpY2ggYWxsb3dzIHdyYXBwaW5nLCB0aGUgY29udGVudCBsaXZl
cyBpbiBhIG5vd3JhcCBjb250ZXh0LgorICAgICAgICByZXR1cm4gaXNXcmFwcGluZ0FsbG93ZWQo
Y29udGludW91c0NvbnRlbnQucnVucygpW292ZXJmbG93aW5nUnVuSW5kZXhdLmlubGluZUl0ZW0p
OworICAgIH07CisgICAgaWYgKHNob3VsZFdyYXBVbmJyZWFrYWJsZUNvbnRlbnRUb05leHRMaW5l
KCkpCisgICAgICAgIHJldHVybiB7IFJlc3VsdDo6QWN0aW9uOjpXcmFwLCBJc0VuZE9mTGluZTo6
WWVzIH07CisgICAgaWYgKGxpbmVTdGF0dXMuaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bv
c2l0aW9uKQorICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0V3Jh
cE9wcG9ydHVuaXR5LCBJc0VuZE9mTGluZTo6WWVzIH07CisgICAgcmV0dXJuIHsgUmVzdWx0OjpB
Y3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpObyB9OworfQorCitPdmVyZmxvd2luZ1RleHRDb250
ZW50IElubGluZUNvbnRlbnRCcmVha2VyOjpwcm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50V2l0aFRl
eHQoY29uc3QgQ29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250ZW50LCBjb25zdCBMaW5l
U3RhdHVzJiBsaW5lU3RhdHVzKSBjb25zdAoreworICAgIGF1dG8mIHJ1bnMgPSBjb250aW51b3Vz
Q29udGVudC5ydW5zKCk7CisgICAgQVNTRVJUKCFydW5zLmlzRW1wdHkoKSk7CisKKyAgICBhdXRv
IGlzQnJlYWthYmxlUnVuID0gW10gKGF1dG8mIHJ1bikgeworICAgICAgICBBU1NFUlQocnVuLmlu
bGluZUl0ZW0uaXNUZXh0KCkgfHwgcnVuLmlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpIHx8
IHJ1bi5pbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkgfHwgcnVuLmlubGluZUl0ZW0ubGF5b3V0
Qm94KCkuaXNJbWFnZSgpKTsKKyAgICAgICAgaWYgKCFydW4uaW5saW5lSXRlbS5pc1RleHQoKSkg
eworICAgICAgICAgICAgLy8gQ2FuJ3QgYnJlYWsgaG9yaXpvbnRhbCBzcGFjaW5nIC0+IGUuZy4g
PHNwYW4gc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEwMHB4OyI+dGV4dGNvbnRlbnQ8L3NwYW4+LCBp
ZiB0aGUgW2lubGluZSBib3ggZW5kXSBpcyB0aGUgb3ZlcmZsb3duIGlubGluZSBpdGVtCisgICAg
ICAgICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlJ3MgYW5vdGhlciBpbmxpbmUgaXRl
bSBiZXlvbmQgdGhlIFtpbmxpbmUgYm94IGVuZF0gdG8gc3BsaXQuCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyB0ZXh0IHJ1biBu
ZWVkcyB0byBzdGF5IG9uIHRoZSBjdXJyZW50IGxpbmUuICAKKyAgICAgICAgcmV0dXJuIGlzV3Jh
cHBpbmdBbGxvd2VkKHJ1bi5pbmxpbmVJdGVtKTsKKyAgICB9OworCisgICAgYXV0byBmaW5kVHJh
aWxpbmdSdW5JbmRleCA9IFsmXSAoYXV0byBicmVha2FibGVSdW5JbmRleCkgLT4gT3B0aW9uYWw8
c2l6ZV90PiB7CisgICAgICAgIC8vIFdoZW4gdGhlIGJyZWFraW5nIHBvc2l0aW9uIGlzIGF0IHRo
ZSBiZWdpbm5pbmcgb2YgdGhlIHJ1biwgdGhlIHRyYWlsaW5nIHJ1biBpcyB0aGUgcHJldmlvdXMg
b25lLgorICAgICAgICBpZiAoIWJyZWFrYWJsZVJ1bkluZGV4KQorICAgICAgICAgICAgcmV0dXJu
IHsgfTsKKyAgICAgICAgLy8gVHJ5IG5vdCBicmVhayBjb250ZW50IGF0IGlubGluZSBib3ggYm91
bmRhcnkKKyAgICAgICAgLy8gZS5nLiA8c3Bhbj5maXRzPC9zcGFuPjxzcGFuPm92ZXJmbG93czwv
c3Bhbj4KKyAgICAgICAgLy8gd2hlbiB0aGUgdGV4dCAib3ZlcmZsb3dzIiBjb21wbGV0ZWx5IG92
ZXJmbG93cywgbGV0J3MgYnJlYWsgdGhlIGNvbnRlbnQgcmlnaHQgYmVmb3JlIHRoZSAnPHNwYW4+
Jy4KKyAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBzdWJzZXF1ZW50IGVtcHR5IGlu
bGluZSBib3hlcyBlLmcuCisgICAgICAgIGF1dG8gdHJhaWxpbmdDYW5kaWRhdGVJbmRleCA9IGJy
ZWFrYWJsZVJ1bkluZGV4IC0gMTsKKyAgICAgICAgYXV0byBpc0F0SW5saW5lQm94ID0gcnVuc1t0
cmFpbGluZ0NhbmRpZGF0ZUluZGV4XS5pbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKTsKKyAg
ICAgICAgcmV0dXJuICFpc0F0SW5saW5lQm94ID8gdHJhaWxpbmdDYW5kaWRhdGVJbmRleCA6IHRy
YWlsaW5nQ2FuZGlkYXRlSW5kZXggPyBtYWtlT3B0aW9uYWwodHJhaWxpbmdDYW5kaWRhdGVJbmRl
eCAtIDEpIDogV1RGOjpudWxsb3B0OworICAgIH07CisKKyAgICAvLyBDaGVjayB3aGVyZSB0aGUg
b3ZlcmZsb3cgb2NjdXJzIGFuZCB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgdG8gZmlndXJl
IG91dCB0aGUgYnJlYWtpbmcgYmVoYXZpb3VyLgorICAgIC8vIDxzcGFuIHN0eWxlPSJ3b3JkLWJy
ZWFrOiBub3JtYWwiPmZpcnN0PC9zcGFuPjxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay1h
bGwiPnNlY29uZDwvc3Bhbj48c3BhbiBzdHlsZT0id29yZC1icmVhazogbm9ybWFsIj50aGlyZDwv
c3Bhbj4KKworICAgIC8vIEZpcnN0IGZpbmQgdGhlIG92ZXJmbG93aW5nIHJ1bi4gCisgICAgYXV0
byBhY2N1bXVsYXRlZENvbnRlbnRXaWR0aCA9IElubGluZUxheW91dFVuaXQgeyB9OworICAgIGF1
dG8gb3ZlcmZsb3dpbmdSdW5JbmRleCA9IHJ1bnMuc2l6ZSgpOyAKKyAgICBmb3IgKHNpemVfdCBp
bmRleCA9IDA7IGluZGV4IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgYXV0byBy
dW5Mb2dpY2FsV2lkdGggPSBydW5zW2luZGV4XS5sb2dpY2FsV2lkdGg7CisgICAgICAgIGlmIChh
Y2N1bXVsYXRlZENvbnRlbnRXaWR0aCArIHJ1bkxvZ2ljYWxXaWR0aCAgPiBsaW5lU3RhdHVzLmF2
YWlsYWJsZVdpZHRoKSB7CisgICAgICAgICAgICBvdmVyZmxvd2luZ1J1bkluZGV4ID0gaW5kZXg7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhY2N1bXVsYXRlZENvbnRl
bnRXaWR0aCArPSBydW5Mb2dpY2FsV2lkdGg7CisgICAgfQorICAgIC8vIFdlIGhhdmUgdG8gaGF2
ZSBhbiBvdmVyZmxvd2luZyBydW4uCisgICAgUkVMRUFTRV9BU1NFUlQob3ZlcmZsb3dpbmdSdW5J
bmRleCA8IHJ1bnMuc2l6ZSgpKTsKKworICAgIGF1dG8gdHJ5QnJlYWtpbmdPdmVyZmxvd2luZ1J1
biA9IFsmXSgpIC0+IE9wdGlvbmFsPE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9z
aXRpb24+IHsKKyAgICAgICAgYXV0byBvdmVyZmxvd2luZ1J1biA9IHJ1bnNbb3ZlcmZsb3dpbmdS
dW5JbmRleF07CisgICAgICAgIGlmICghaXNCcmVha2FibGVSdW4ob3ZlcmZsb3dpbmdSdW4pKQor
ICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgaWYgKGF1dG8gcGFydGlhbFJ1biA9IHRy
eUJyZWFraW5nVGV4dFJ1bihvdmVyZmxvd2luZ1J1biwgbGluZVN0YXR1cy5jb250ZW50TG9naWNh
bFJpZ2h0ICsgYWNjdW11bGF0ZWRDb250ZW50V2lkdGgsIHN0ZDo6bWF4KDAuMGYsIGxpbmVTdGF0
dXMuYXZhaWxhYmxlV2lkdGggLSBhY2N1bXVsYXRlZENvbnRlbnRXaWR0aCksIGxpbmVTdGF0dXMu
aGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSkgeworICAgICAgICAgICAgaWYg
KHBhcnRpYWxSdW4tPmxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gT3ZlcmZsb3dpbmdU
ZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IG92ZXJmbG93aW5nUnVuSW5kZXgsIE92ZXJm
bG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb246OlRyYWlsaW5nQ29udGVudCB7IGZh
bHNlLCBwYXJ0aWFsUnVuIH0gfTsKKyAgICAgICAgICAgIC8vIFdoZW4gdGhlIGJyZWFraW5nIHBv
c2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJ1biwgdGhlIHRyYWlsaW5nIHJ1biBp
cyB0aGUgcHJldmlvdXMgb25lLgorICAgICAgICAgICAgaWYgKGF1dG8gdHJhaWxpbmdSdW5JbmRl
eCA9IGZpbmRUcmFpbGluZ1J1bkluZGV4KG92ZXJmbG93aW5nUnVuSW5kZXgpKQorICAgICAgICAg
ICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsg
KnRyYWlsaW5nUnVuSW5kZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRp
b246OlRyYWlsaW5nQ29udGVudCB7IH0gfTsKKyAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB3ZSBj
YW4ndCBhY2NvbW1vZGF0ZSBldmVuIHRoZSB2ZXJ5IGZpcnN0IGNoYXJhY3Rlci4gCisgICAgICAg
ICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB3aGVuIHRoZXJlJ3Mgbm8g
YnJlYWthYmxlIHJ1biBpbiB0aGlzIHNldC4KKyAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2lu
Z1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgfTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4geyB9OworICAgIH07CisgICAgLy8gQ2hlY2sgaWYgd2UgYWN0dWFsbHkgYnJlYWsgdGhp
cyBydW4uCisgICAgaWYgKGF1dG8gYnJlYWtpbmdQb3NpdGlvbiA9IHRyeUJyZWFraW5nT3ZlcmZs
b3dpbmdSdW4oKSkKKyAgICAgICAgcmV0dXJuIHsgb3ZlcmZsb3dpbmdSdW5JbmRleCwgYnJlYWtp
bmdQb3NpdGlvbiB9OworCisgICAgYXV0byB0cnlCcmVha2luZ1ByZXZpb3VzTm9uT3ZlcmZsb3dp
bmdSdW5zID0gWyZdKCkgLT4gT3B0aW9uYWw8T3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtp
bmdQb3NpdGlvbj4geworICAgICAgICBhdXRvIHByZXZpb3VzQ29udGVudFdpZHRoID0gYWNjdW11
bGF0ZWRDb250ZW50V2lkdGg7CisgICAgICAgIGZvciAoYXV0byBpbmRleCA9IG92ZXJmbG93aW5n
UnVuSW5kZXg7IGluZGV4LS07KSB7CisgICAgICAgICAgICBhdXRvJiBydW4gPSBydW5zW2luZGV4
XTsKKyAgICAgICAgICAgIHByZXZpb3VzQ29udGVudFdpZHRoIC09IHJ1bi5sb2dpY2FsV2lkdGg7
CisgICAgICAgICAgICBpZiAoIWlzQnJlYWthYmxlUnVuKHJ1bikpCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICBBU1NFUlQocnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpOwor
ICAgICAgICAgICAgaWYgKGF1dG8gcGFydGlhbFJ1biA9IHRyeUJyZWFraW5nVGV4dFJ1bihydW4s
IGxpbmVTdGF0dXMuY29udGVudExvZ2ljYWxSaWdodCArIHByZXZpb3VzQ29udGVudFdpZHRoLCB7
IH0sIGxpbmVTdGF0dXMuaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSkgewor
ICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgdGhpcyBydW4gZml0cywgc28gaWYgYnJlYWtpbmcg
aXMgYWxsb3dlZCBvbiB0aGUgcnVuLCBpdCBzaG91bGQgcmV0dXJuIGEgbm9uLWVtcHR5IGxlZnQt
c2lkZQorICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0J3MgZWl0aGVyIGF0IGh5cGhlbiBwb3Np
dGlvbiBvciB0aGUgZW50aXJlIHJ1biBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICBBU1NF
UlQocGFydGlhbFJ1bi0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBhdXRvIHJ1bklzRnVsbHlB
Y2NvbW1vZGF0ZWQgPSBwYXJ0aWFsUnVuLT5sZW5ndGggPT0gZG93bmNhc3Q8SW5saW5lVGV4dEl0
ZW0+KHJ1bi5pbmxpbmVJdGVtKS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT3Zl
cmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IGluZGV4LCBPdmVyZmxvd2lu
Z1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uOjpUcmFpbGluZ0NvbnRlbnQgeyBmYWxzZSwg
cnVuSXNGdWxseUFjY29tbW9kYXRlZCA/IFdURjo6bnVsbG9wdCA6IHBhcnRpYWxSdW4gfSB9Owor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB7IH07CisgICAgfTsKKyAg
ICAvLyBXZSBkaWQgbm90IG1hbmFnZSB0byBicmVhayB0aGUgcnVuIHRoYXQgYWN0dWFsbHkgb3Zl
cmZsb3dzIHRoZSBsaW5lLgorICAgIC8vIExldCdzIHRyeSB0byBmaW5kIGEgcHJldmlvdXMgYnJl
YWtpbmcgcG9zaXRpb24gc3RhcnRpbmcgZnJvbSB0aGUgb3ZlcmZsb3dpbmcgcnVuLiBJdCBzdXJl
bHkgZml0cy4KKyAgICBpZiAoYXV0byBicmVha2luZ1Bvc2l0aW9uID0gdHJ5QnJlYWtpbmdQcmV2
aW91c05vbk92ZXJmbG93aW5nUnVucygpKQorICAgICAgICByZXR1cm4geyBvdmVyZmxvd2luZ1J1
bkluZGV4LCBicmVha2luZ1Bvc2l0aW9uIH07CisKKyAgICBhdXRvIHRyeUJyZWFraW5nTmV4dE92
ZXJmbG93aW5nUnVucyA9IFsmXSgpIC0+IE9wdGlvbmFsPE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6
OkJyZWFraW5nUG9zaXRpb24+IHsKKyAgICAgICAgYXV0byBuZXh0Q29udGVudFdpZHRoID0gYWNj
dW11bGF0ZWRDb250ZW50V2lkdGggKyBydW5zW292ZXJmbG93aW5nUnVuSW5kZXhdLmxvZ2ljYWxX
aWR0aDsKKyAgICAgICAgZm9yIChhdXRvIGluZGV4ID0gb3ZlcmZsb3dpbmdSdW5JbmRleCArIDE7
IGluZGV4IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGF1dG8mIHJ1biA9
IHJ1bnNbaW5kZXhdOworICAgICAgICAgICAgaWYgKGlzQnJlYWthYmxlUnVuKHJ1bikpIHsKKyAg
ICAgICAgICAgICAgICBBU1NFUlQocnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpOworICAgICAgICAg
ICAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGlzIHJ1biBkb2VzIG5vdCBmaXQgdGhlIGF2YWlsYWJs
ZSBzcGFjZS4gSWYgd2UgY2FuIGJyZWFrIGl0IGF0IGFueSBwb3NpdGlvbiwgbGV0J3MganVzdCB1
c2UgdGhlIHN0YXJ0IG9mIHRoZSBydW4uCisgICAgICAgICAgICAgICAgaWYgKHdvcmRCcmVha0Jl
aGF2aW9yKHJ1bi5pbmxpbmVJdGVtLnN0eWxlKCksIGxpbmVTdGF0dXMuaGFzV3JhcE9wcG9ydHVu
aXR5QXRQcmV2aW91c1Bvc2l0aW9uKSA9PSBXb3JkQnJlYWtSdWxlOjpBdEFyYml0cmFyeVBvc2l0
aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgYmUgb24gYW4gaW5saW5lIGJv
eCBib3VuZGFyeS4gTGV0J3MgZ28gYmFjayB0byB0aGUgcnVuIGluIGZyb250IG9mIHRoZSBpbmxp
bmUgYm94IHN0YXJ0IHJ1bi4KKyAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiA8c3Bhbj51bmJy
ZWFrYWJsZV9hbmRfb3ZlcmZsb3c8c3BhbiBzdHlsZT0id29yZC1icmVhazogYnJlYWstYWxsIj5i
cmVha2FibGU8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBhdCAiYnJlYWth
YmxlIiwgPHNwYW4+IGlzIGF0IGluZGV4IC0gMSBhbmQgdGhlIHRyYWlsaW5nIHJ1biBpcyBhdCBp
bmRleCAtIDIuCisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChydW5zW2luZGV4IC0gMV0uaW5s
aW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkpOworICAgICAgICAgICAgICAgICAgICBhdXRvIHRy
YWlsaW5nUnVuSW5kZXggPSBmaW5kVHJhaWxpbmdSdW5JbmRleChpbmRleCk7CisgICAgICAgICAg
ICAgICAgICAgIGlmICghdHJhaWxpbmdSdW5JbmRleCkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gVGhpcyBjb250aW51b3VzIGNvbnRlbnQgZGlkIG5vdCBmaXQgZnJvbSB0aGUgZ2V0LWdv
LiBObyB0cmFpbGluZyBydW4uCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3ZlcmZs
b3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IH07CisgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gQXQgd29yc3Qgd2UgYXJlIGJhY2sgdG8gdGhl
IG92ZXJmbG93aW5nIHJ1biwgbGlrZSBpbiB0aGUgZXhhbXBsZSBhYm92ZS4KKyAgICAgICAgICAg
ICAgICAgICAgQVNTRVJUKCp0cmFpbGluZ1J1bkluZGV4ID49IG92ZXJmbG93aW5nUnVuSW5kZXgp
OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJl
YWtpbmdQb3NpdGlvbiB7ICp0cmFpbGluZ1J1bkluZGV4LCBPdmVyZmxvd2luZ1RleHRDb250ZW50
OjpCcmVha2luZ1Bvc2l0aW9uOjpUcmFpbGluZ0NvbnRlbnQgeyB0cnVlIH0gfTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGF1dG8gcGFydGlhbFJ1biA9IHRyeUJyZWFr
aW5nVGV4dFJ1bihydW4sIGxpbmVTdGF0dXMuY29udGVudExvZ2ljYWxSaWdodCArIG5leHRDb250
ZW50V2lkdGgsIHsgfSwgbGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9z
aXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChwYXJ0aWFsUnVuLT5sZW5ndGgp
OworICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYW5hZ2VkIHRvIGJyZWFrIHRoaXMgdGV4dCBy
dW4gbWlkIGNvbnRlbnQuIEl0IGhhcyB0byBiZSBhIGh5cGhlbiBicmVhay4KKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb24g
eyBpbmRleCwgT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbjo6VHJhaWxp
bmdDb250ZW50IHsgdHJ1ZSwgcGFydGlhbFJ1biB9IH07CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorICAgICAgICAgICAgbmV4dENvbnRlbnRXaWR0aCArPSBydW4ubG9naWNhbFdp
ZHRoOworICAgICAgICB9CisgICAgICAgIHJldHVybiB7IH07CisgICAgfTsKKyAgICAvLyBBdCB0
aGlzIHBvaW50IHdlIGtub3cgdGhhdCB0aGVyZSdzIG5vIGJyZWFrYWJsZSBydW4gYWxsIHRoZSB3
YXkgdG8gdGhlIG92ZXJmbG93aW5nIHJ1bi4KKyAgICAvLyBOb3cgd2UgbmVlZCB0byBjaGVjayBp
ZiBhbnkgcnVuIGFmdGVyIHRoZSBvdmVyZmxvd2luZyBjb250ZW50IGNhbiBicmVhay4KKyAgICAv
LyBlLmcuIDxzcGFuPnRoaXNfY29udGVudF9vdmVyZmxvd3NfYnV0X25vdF9icmVha2FibGU8c3Bh
bj48c3BhbiBzdHlsZT0id29yZC1icmVhazogYnJlYWstYWxsIj5idXRfdGhpc19pc19icmVha2Fi
bGU8L3NwYW4+CisgICAgaWYgKGF1dG8gYnJlYWtpbmdQb3NpdGlvbiA9IHRyeUJyZWFraW5nTmV4
dE92ZXJmbG93aW5nUnVucygpKQorICAgICAgICByZXR1cm4geyBvdmVyZmxvd2luZ1J1bkluZGV4
LCBicmVha2luZ1Bvc2l0aW9uIH07CisKKyAgICAvLyBHaXZlIHVwLCB0aGVyZSdzIG5vIGJyZWFr
YWJsZSBydW4gaW4gaGVyZS4KKyAgICByZXR1cm4geyBvdmVyZmxvd2luZ1J1bkluZGV4IH07Cit9
CisKK09wdGlvblNldDxJbmxpbmVDb250ZW50QnJlYWtlcjo6V29yZEJyZWFrUnVsZT4gSW5saW5l
Q29udGVudEJyZWFrZXI6OndvcmRCcmVha0JlaGF2aW9yKGNvbnN0IFJlbmRlclN0eWxlJiBzdHls
ZSwgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pIGNvbnN0Cit7Cisg
ICAgLy8gRGlzcmVnYXJkIGFueSBwcm9oaWJpdGlvbiBhZ2FpbnN0IGxpbmUgYnJlYWtzIG1hbmRh
dGVkIGJ5IHRoZSB3b3JkLWJyZWFrIHByb3BlcnR5LgorICAgIC8vIFRoZSBkaWZmZXJlbnQgd3Jh
cHBpbmcgb3Bwb3J0dW5pdGllcyBtdXN0IG5vdCBiZSBwcmlvcml0aXplZC4gSHlwaGVuYXRpb24g
aXMgbm90IGFwcGxpZWQuCisgICAgaWYgKHN0eWxlLmxpbmVCcmVhaygpID09IExpbmVCcmVhazo6
QW55d2hlcmUpCisgICAgICAgIHJldHVybiB7IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9z
aXRpb24gfTsKKyAgICAvLyBCcmVha2luZyBpcyBhbGxvd2VkIHdpdGhpbiDigJx3b3Jkc+KAnS4K
KyAgICBpZiAoc3R5bGUud29yZEJyZWFrKCkgPT0gV29yZEJyZWFrOjpCcmVha0FsbCkKKyAgICAg
ICAgcmV0dXJuIHsgV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbiB9OworICAgIC8v
IEJyZWFraW5nIGlzIGZvcmJpZGRlbiB3aXRoaW4g4oCcd29yZHPigJ0uCisgICAgaWYgKHN0eWxl
LndvcmRCcmVhaygpID09IFdvcmRCcmVhazo6S2VlcEFsbCkKKyAgICAgICAgcmV0dXJuIHsgfTsK
KworICAgIGF1dG8gYnJlYWtSdWxlcyA9IE9wdGlvblNldDxXb3JkQnJlYWtSdWxlPiB7IH07Cisg
ICAgYXV0byBoeXBoZW5hdGlvbklzQWxsb3dlZCA9ICFuX2h5cGhlbmF0aW9uSXNEaXNhYmxlZCAm
JiBzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVuczo6QXV0byAmJiBjYW5IeXBoZW5hdGUoc3R5bGUu
Y29tcHV0ZWRMb2NhbGUoKSk7CisgICAgaWYgKGh5cGhlbmF0aW9uSXNBbGxvd2VkKQorICAgICAg
ICBicmVha1J1bGVzLmFkZCh7IFdvcmRCcmVha1J1bGU6OkF0SHlwaGVuYXRpb25PcHBvcnR1bml0
aWVzIH0pOworICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IGNvbnRlbnQsIHRo
ZSB3b3JkLWJyZWFrIHByb3BlcnR5IGFsc28gc3VwcG9ydHMgYSBkZXByZWNhdGVkIGJyZWFrLXdv
cmQga2V5d29yZC4KKyAgICAvLyBXaGVuIHNwZWNpZmllZCwgdGhpcyBoYXMgdGhlIHNhbWUgZWZm
ZWN0IGFzIHdvcmQtYnJlYWs6IG5vcm1hbCBhbmQgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmUsIHJl
Z2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgb3ZlcmZsb3ctd3JhcCBwcm9wZXJ0
eS4KKyAgICBpZiAoc3R5bGUud29yZEJyZWFrKCkgPT0gV29yZEJyZWFrOjpCcmVha1dvcmQgJiYg
IWhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgeworICAgICAgICBicmVha1J1
bGVzLmFkZCh7IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRpb24gfSk7CisgICAgICAg
IHJldHVybiBicmVha1J1bGVzOworICAgIH0KKyAgICAvLyBPdmVyZmxvd1dyYXA6OkJyZWFrOiBB
biBvdGhlcndpc2UgdW5icmVha2FibGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBtYXkgYmUgYnJv
a2VuIGF0IGFuIGFyYml0cmFyeSBwb2ludCBpZiB0aGVyZSBhcmUgbm8gb3RoZXJ3aXNlLWFjY2Vw
dGFibGUgYnJlYWsgcG9pbnRzIGluIHRoZSBsaW5lLgorICAgIGlmIChzdHlsZS5vdmVyZmxvd1dy
YXAoKSA9PSBPdmVyZmxvd1dyYXA6OkJyZWFrICYmICFoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZp
b3VzUG9zaXRpb24pIHsKKyAgICAgICAgYnJlYWtSdWxlcy5hZGQoeyBXb3JkQnJlYWtSdWxlOjpB
dEFyYml0cmFyeVBvc2l0aW9uIH0pOworICAgICAgICByZXR1cm4gYnJlYWtSdWxlczsKKyAgICB9
CisgICAgcmV0dXJuIGJyZWFrUnVsZXM7Cit9CisKK09wdGlvbmFsPElubGluZUNvbnRlbnRCcmVh
a2VyOjpQYXJ0aWFsUnVuPiBJbmxpbmVDb250ZW50QnJlYWtlcjo6dHJ5QnJlYWtpbmdUZXh0UnVu
KGNvbnN0IENvbnRpbnVvdXNDb250ZW50OjpSdW4mIG92ZXJmbG93aW5nUnVuLCBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxMZWZ0LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBhdmFpbGFibGVX
aWR0aCwgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pIGNvbnN0Cit7
CisgICAgQVNTRVJUKG92ZXJmbG93aW5nUnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpOworICAgIGF1
dG8mIGlubGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KG92ZXJmbG93aW5n
UnVuLmlubGluZUl0ZW0pOworICAgIGF1dG8mIHN0eWxlID0gaW5saW5lVGV4dEl0ZW0uc3R5bGUo
KTsKKyAgICBhdXRvIGF2YWlsYWJsZVNwYWNlSXNJbmZpbml0ZSA9ICFhdmFpbGFibGVXaWR0aC5o
YXNWYWx1ZSgpOworCisgICAgYXV0byBicmVha1J1bGVzID0gd29yZEJyZWFrQmVoYXZpb3Ioc3R5
bGUsIGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbik7CisgICAgaWYgKGJyZWFr
UnVsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4geyB9OworCisgICAgaWYgKGJyZWFrUnVs
ZXMuY29udGFpbnMoV29yZEJyZWFrUnVsZTo6QXRIeXBoZW5hdGlvbk9wcG9ydHVuaXRpZXMpKSB7
CisgICAgICAgIGF1dG8gdHJ5QnJlYWtpbmdBdEh5cGhlbmF0aW9uT3Bwb3J0dW5pdHkgPSBbJl0o
KSAtPiBPcHRpb25hbDxQYXJ0aWFsUnVuPiB7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBoeXBo
ZW4gcG9zaXRpb24gYXMgZm9sbG93czoKKyAgICAgICAgICAgIC8vIDEuIFNwbGl0IHRoZSB0ZXh0
IGJ5IHRha2luZyB0aGUgaHlwaGVuIHdpZHRoIGludG8gYWNjb3VudAorICAgICAgICAgICAgLy8g
Mi4gRmluZCB0aGUgbGFzdCBoeXBoZW4gcG9zaXRpb24gYmVmb3JlIHRoZSBzcGxpdCBwb3NpdGlv
bgorICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVTcGFjZUlzSW5maW5pdGUgJiYgISphdmFpbGFi
bGVXaWR0aCkgeworICAgICAgICAgICAgICAgIC8vIFdlIHdvbid0IGJlIGFibGUgdG8gZmluZCBo
eXBoZW4gbG9jYXRpb24gd2hlbiB0aGVyZSdzIG5vIGF2YWlsYWJsZSBzcGFjZS4KKyAgICAgICAg
ICAgICAgICByZXR1cm4geyB9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBydW5M
ZW5ndGggPSBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxp
bWl0QmVmb3JlID0gc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpID09IFJlbmRlclN0eWxl
Ojppbml0aWFsSHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpID8gMCA6IHN0eWxlLmh5cGhlbmF0aW9u
TGltaXRCZWZvcmUoKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxpbWl0QWZ0ZXIgPSBzdHlsZS5o
eXBoZW5hdGlvbkxpbWl0QWZ0ZXIoKSA9PSBSZW5kZXJTdHlsZTo6aW5pdGlhbEh5cGhlbmF0aW9u
TGltaXRBZnRlcigpID8gMCA6IHN0eWxlLmh5cGhlbmF0aW9uTGltaXRBZnRlcigpOworICAgICAg
ICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBydW4gY2FuIGFjY29tbW9kYXRlIHRoZSBiZWZvcmUvYWZ0
ZXIgbGltaXRzIGF0IGFsbCBiZWZvcmUgc3RhcnQgbWVhc3VyaW5nIHRleHQuCisgICAgICAgICAg
ICBpZiAobGltaXRCZWZvcmUgPj0gcnVuTGVuZ3RoIHx8IGxpbWl0QWZ0ZXIgPj0gcnVuTGVuZ3Ro
IHx8IGxpbWl0QmVmb3JlICsgbGltaXRBZnRlciA+IHJ1bkxlbmd0aCkKKyAgICAgICAgICAgICAg
ICByZXR1cm4geyB9OworCisgICAgICAgICAgICB1bnNpZ25lZCBsZWZ0U2lkZUxlbmd0aCA9IHJ1
bkxlbmd0aDsKKyAgICAgICAgICAgIGF1dG8mIGZvbnRDYXNjYWRlID0gc3R5bGUuZm9udENhc2Nh
ZGUoKTsKKyAgICAgICAgICAgIGF1dG8gaHlwaGVuV2lkdGggPSBJbmxpbmVMYXlvdXRVbml0IHsg
Zm9udENhc2NhZGUud2lkdGgoVGV4dFJ1biB7IFN0cmluZ1ZpZXcgeyBzdHlsZS5oeXBoZW5TdHJp
bmcoKSB9IH0pIH07CisgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZVNwYWNlSXNJbmZpbml0ZSkg
eworICAgICAgICAgICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGhFeGNsdWRpbmdIeXBoZW4gPSAq
YXZhaWxhYmxlV2lkdGggLSBoeXBoZW5XaWR0aDsKKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxh
YmxlV2lkdGhFeGNsdWRpbmdIeXBoZW4gPD0gMCB8fCAhZW5vdWdoV2lkdGhGb3JIeXBoZW5hdGlv
bihhdmFpbGFibGVXaWR0aEV4Y2x1ZGluZ0h5cGhlbiwgZm9udENhc2NhZGUucGl4ZWxTaXplKCkp
KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICAgICAgICAgIGxlZnRT
aWRlTGVuZ3RoID0gVGV4dFV0aWw6OnNwbGl0KGlubGluZVRleHRJdGVtLCBvdmVyZmxvd2luZ1J1
bi5sb2dpY2FsV2lkdGgsIGF2YWlsYWJsZVdpZHRoRXhjbHVkaW5nSHlwaGVuLCBsb2dpY2FsTGVm
dCkubGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlZnRTaWRlTGVuZ3Ro
IDwgbGltaXRCZWZvcmUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgICAg
IC8vIEFkanVzdCBiZWZvcmUgaW5kZXggdG8gYWNjb21tb2RhdGUgdGhlIGxpbWl0LWFmdGVyIHZh
bHVlIChpdCdzIHRoZSBsYXN0IHBvdGVudGlhbCBoeXBoZW4gbG9jYXRpb24gaW4gdGhpcyBydW4p
LgorICAgICAgICAgICAgYXV0byBoeXBoZW5CZWZvcmUgPSBzdGQ6Om1pbihsZWZ0U2lkZUxlbmd0
aCwgcnVuTGVuZ3RoIC0gbGltaXRBZnRlcikgKyAxOworICAgICAgICAgICAgdW5zaWduZWQgaHlw
aGVuTG9jYXRpb24gPSBsYXN0SHlwaGVuTG9jYXRpb24oU3RyaW5nVmlldyhpbmxpbmVUZXh0SXRl
bS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpKS5zdWJzdHJpbmcoaW5saW5lVGV4dEl0ZW0uc3Rh
cnQoKSwgaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpLCBoeXBoZW5CZWZvcmUsIHN0eWxlLmNvbXB1
dGVkTG9jYWxlKCkpOworICAgICAgICAgICAgaWYgKCFoeXBoZW5Mb2NhdGlvbiB8fCBoeXBoZW5M
b2NhdGlvbiA8IGxpbWl0QmVmb3JlKQorICAgICAgICAgICAgICAgIHJldHVybiB7IH07CisgICAg
ICAgICAgICAvLyBoeXBoZW5Mb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhp
cyBJbmxpbmVJdGVtVGV4dC4KKyAgICAgICAgICAgIEFTU0VSVChpbmxpbmVUZXh0SXRlbS5zdGFy
dCgpICsgaHlwaGVuTG9jYXRpb24gPCBpbmxpbmVUZXh0SXRlbS5lbmQoKSk7CisgICAgICAgICAg
ICBhdXRvIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoV2l0aEh5cGhlbiA9IFRleHRVdGlsOjp3aWR0
aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwgaW5saW5lVGV4dEl0ZW0u
c3RhcnQoKSArIGh5cGhlbkxvY2F0aW9uLCBsb2dpY2FsTGVmdCk7CisgICAgICAgICAgICByZXR1
cm4gUGFydGlhbFJ1biB7IGh5cGhlbkxvY2F0aW9uLCB0cmFpbGluZ1BhcnRpYWxSdW5XaWR0aFdp
dGhIeXBoZW4sIGh5cGhlbldpZHRoIH07CisgICAgICAgIH07CisgICAgICAgIGlmIChhdXRvIHBh
cnRpYWxSdW4gPSB0cnlCcmVha2luZ0F0SHlwaGVuYXRpb25PcHBvcnR1bml0eSgpKQorICAgICAg
ICAgICAgcmV0dXJuIHBhcnRpYWxSdW47CisgICAgfQorCisgICAgaWYgKGJyZWFrUnVsZXMuY29u
dGFpbnMoV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbikpIHsKKyAgICAgICAgYXV0
byB0cnlCcmVha2luZ0F0QXJiaXRyYXJ5UG9zaXRpb24gPSBbJl0oKSAtPiBQYXJ0aWFsUnVuIHsK
KyAgICAgICAgICAgIGlmICghaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpIHsKKyAgICAgICAgICAg
ICAgICAvLyBFbXB0eSB0ZXh0IHJ1bnMgbWF5IGJlIGJyZWFrYWJsZSBiYXNlZCBvbiBzdHlsZSwg
YnV0IGluIHByYWN0aWNlIHdlIGNhbid0IHJlYWxseSBzcGxpdCB0aGVtIGFueSBmdXJ0aGVyLgor
ICAgICAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBp
ZiAoYXZhaWxhYmxlU3BhY2VJc0luZmluaXRlKSB7CisgICAgICAgICAgICAgICAgLy8gV2hlbiB0
aGUgcnVuIGNhbiBiZSBzcGxpdCBhdCBhcmJpdHJhcnkgcG9zaXRpb24gbGV0J3MganVzdCByZXR1
cm4gdGhlIGVudGlyZSBydW4gd2hlbiBpdCBpcyBpbnRlbmRlZCB0byBmaXQgb24gdGhlIGxpbmUu
CisgICAgICAgICAgICAgICAgQVNTRVJUKGlubGluZVRleHRJdGVtLmxlbmd0aCgpKTsKKyAgICAg
ICAgICAgICAgICBhdXRvIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoID0gVGV4dFV0aWw6OndpZHRo
KGlubGluZVRleHRJdGVtLCBsb2dpY2FsTGVmdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHsg
aW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCksIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoIH07CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBpZiAoISphdmFpbGFibGVXaWR0aCkgeworICAgICAgICAg
ICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgY2FzZXMgd2hlbiB0aGVyZSdzIG5vIHJvb20gYXQgYWxs
LiBUaGUgY29udGVudCBpcyBicmVha2FibGUgYnV0IHdlIGRvbid0IGhhdmUgc3BhY2UgZm9yIGl0
LgorICAgICAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBhdXRvIHNwbGl0RGF0YSA9IFRleHRVdGlsOjpzcGxpdChpbmxpbmVUZXh0SXRlbSwgb3ZlcmZs
b3dpbmdSdW4ubG9naWNhbFdpZHRoLCAqYXZhaWxhYmxlV2lkdGgsIGxvZ2ljYWxMZWZ0KTsKKyAg
ICAgICAgICAgIHJldHVybiB7IHNwbGl0RGF0YS5sZW5ndGgsIHNwbGl0RGF0YS5sb2dpY2FsV2lk
dGggfTsKKyAgICAgICAgfTsKKyAgICAgICAgLy8gV2l0aCBhcmJpdHJhcnkgYnJlYWtpbmcgdGhl
cmUncyBhbHdheXMgYSB2YWxpZCBicmVha2luZyBwb3NpdGlvbiAoZXZlbiBpZiBpdCBpcyBiZWZv
cmUgdGhlIGZpcnN0IHBvc2l0aW9uKS4KKyAgICAgICAgcmV0dXJuIHRyeUJyZWFraW5nQXRBcmJp
dHJhcnlQb3NpdGlvbigpOworICAgIH0KKyAgICByZXR1cm4geyB9OworfQorCit2b2lkIElubGlu
ZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudDo6YXBwZW5kKGNvbnN0IElubGluZUl0
ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoLCBPcHRpb25hbDxJ
bmxpbmVMYXlvdXRVbml0PiBjb2xsYXBzaWJsZVdpZHRoKQoreworICAgIG1fcnVucy5hcHBlbmQo
eyBpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGggfSk7CisgICAgbV9sb2dpY2FsV2lkdGggPSBjbGFt
cFRvPElubGluZUxheW91dFVuaXQ+KG1fbG9naWNhbFdpZHRoICsgbG9naWNhbFdpZHRoKTsKKyAg
ICBpZiAoIWNvbGxhcHNpYmxlV2lkdGgpIHsKKyAgICAgICAgbV9jb2xsYXBzaWJsZUxvZ2ljYWxX
aWR0aCA9IHsgfTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKmNvbGxhcHNpYmxl
V2lkdGggPT0gbG9naWNhbFdpZHRoKSB7CisgICAgICAgIC8vIEZ1bGx5IGNvbGxhcHNpYmxlIHJ1
bi4KKyAgICAgICAgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCArPSBsb2dpY2FsV2lkdGg7Cisg
ICAgICAgIEFTU0VSVChtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoIDw9IG1fbG9naWNhbFdpZHRo
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBQYXJ0aWFsbHkgY29sbGFwc2libGUg
cnVuLgorICAgIG1fY29sbGFwc2libGVMb2dpY2FsV2lkdGggPSAqY29sbGFwc2libGVXaWR0aDsK
KyAgICBBU1NFUlQobV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCA8PSBtX2xvZ2ljYWxXaWR0aCk7
Cit9CisKK3ZvaWQgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50OjpyZXNl
dCgpCit7CisgICAgbV9sb2dpY2FsV2lkdGggPSB7IH07CisgICAgbV9jb2xsYXBzaWJsZUxvZ2lj
YWxXaWR0aCA9IHsgfTsKKyAgICBtX3J1bnMuY2xlYXIoKTsKK30KKworfQorfQorI2VuZGlmCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lQ29udGVudEJyZWFrZXIuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtl
ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjVkMmQ0ZDZjZThjMTg5MzFkNWZlOGI1MGEzNzMwMWQ0YWNhOGU3ZDkK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lQ29udGVudEJyZWFrZXIuaApAQCAtMCwwICsxLDE1
MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAq
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JN
QVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK2NsYXNzIFJlbmRlclN0eWxlOworCituYW1lc3BhY2UgTGF5b3V0IHsKKwor
Y2xhc3MgSW5saW5lSXRlbTsKK3N0cnVjdCBPdmVyZmxvd2luZ1RleHRDb250ZW50OworCitjbGFz
cyBJbmxpbmVDb250ZW50QnJlYWtlciB7CitwdWJsaWM6CisgICAgc3RydWN0IFBhcnRpYWxSdW4g
eworICAgICAgICBzaXplX3QgbGVuZ3RoIHsgMCB9OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0
IGxvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4g
aHlwaGVuV2lkdGggeyB9OworICAgIH07CisgICAgZW51bSBjbGFzcyBJc0VuZE9mTGluZSB7IE5v
LCBZZXMgfTsKKyAgICBzdHJ1Y3QgUmVzdWx0IHsKKyAgICAgICAgZW51bSBjbGFzcyBBY3Rpb24g
eworICAgICAgICAgICAgS2VlcCwgLy8gS2VlcCBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUu
CisgICAgICAgICAgICBCcmVhaywgLy8gUGFydGlhbCBjb250ZW50IGlzIG9uIHRoZSBjdXJyZW50
IGxpbmUuCisgICAgICAgICAgICBXcmFwLCAvLyBDb250ZW50IGlzIHdyYXBwZWQgdG8gdGhlIG5l
eHQgbGluZS4KKyAgICAgICAgICAgIFdyYXBXaXRoSHlwaGVuLCAvLyBDb250ZW50IGlzIHdyYXBw
ZWQgdG8gdGhlIG5leHQgbGluZSBhbmQgdGhlIGN1cnJlbnQgbGluZSBlbmRzIHdpdGggYSB2aXNp
YmxlIGh5cGhlbi4KKyAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGNvbnRlbnQgb3ZlcmZsb3dz
IGFuZCBjYW4ndCBnZXQgYnJva2VuIHVwIGludG8gc21hbGxlciBiaXRzLgorICAgICAgICAgICAg
UmV2ZXJ0VG9MYXN0V3JhcE9wcG9ydHVuaXR5LCAvLyBUaGUgY29udGVudCBuZWVkcyB0byBiZSBy
ZXZlcnRlZCBiYWNrIHRvIHRoZSBsYXN0IHdyYXAgb3Bwb3J0dW5pdHkuCisgICAgICAgICAgICBS
ZXZlcnRUb0xhc3ROb25PdmVyZmxvd2luZ1dyYXBPcHBvcnR1bml0eSAvLyBUaGUgY29udGVudCBu
ZWVkcyB0byBiZSByZXZlcnRlZCBiYWNrIHRvIGEgd3JhcCBvcHBvcnR1bml0eSB0aGF0IHN0aWxs
IGZpdHMgdGhlIGxpbmUuCisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBQYXJ0aWFsVHJhaWxp
bmdDb250ZW50IHsKKyAgICAgICAgICAgIHNpemVfdCB0cmFpbGluZ1J1bkluZGV4IHsgMCB9Owor
ICAgICAgICAgICAgT3B0aW9uYWw8UGFydGlhbFJ1bj4gcGFydGlhbFJ1bjsgLy8gbnVsbG9wdCBw
YXJ0aWFsIHJ1biBtZWFucyB0aGUgdHJhaWxpbmcgcnVuIGlzIGEgY29tcGxldGUgcnVuLgorICAg
ICAgICB9OworICAgICAgICBBY3Rpb24gYWN0aW9uIHsgQWN0aW9uOjpLZWVwIH07CisgICAgICAg
IElzRW5kT2ZMaW5lIGlzRW5kT2ZMaW5lIHsgSXNFbmRPZkxpbmU6Ok5vIH07CisgICAgICAgIE9w
dGlvbmFsPFBhcnRpYWxUcmFpbGluZ0NvbnRlbnQ+IHBhcnRpYWxUcmFpbGluZ0NvbnRlbnQgeyB9
OworICAgICAgICBjb25zdCBJbmxpbmVJdGVtKiBsYXN0V3JhcE9wcG9ydHVuaXR5SXRlbSB7IG51
bGxwdHIgfTsKKyAgICB9OworCisgICAgLy8gVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyB0aGUgYW1v
dW50IG9mIGNvbnRpbnVvdXMgY29udGVudCBjb21taXR0ZWQgdG8gY29udGVudCBicmVha2luZyBh
dCBhIHRpbWUgKG5vIGluLWJldHdlZW4gd3JhcCBvcHBvcnR1bml0aWVzKS4KKyAgICAvLyBlLmcu
CisgICAgLy8gPGRpdj50ZXh0IGNvbnRlbnQgPHNwYW4+c3BhbjE8L3NwYW4+YmV0d2VlbjxzcGFu
PnNwYW4yPC9zcGFuPjwvZGl2PgorICAgIC8vIFt0ZXh0XVsgXVtjb250ZW50XVsgXVtpbmxpbmUg
Ym94IHN0YXJ0XVtzcGFuMV1baW5saW5lIGJveCBlbmRdW2JldHdlZW5dW2lubGluZSBib3ggc3Rh
cnRdW3NwYW4yXVtpbmxpbmUgYm94IGVuZF0KKyAgICAvLyBjb250aW51b3VzIGNhbmRpZGF0ZSBj
b250ZW50IGF0IGEgdGltZToKKyAgICAvLyAxLiBbdGV4dF0KKyAgICAvLyAyLiBbIF0KKyAgICAv
LyAzLiBbY29udGVudF0KKyAgICAvLyA0LiBbIF0KKyAgICAvLyA1LiBbaW5saW5lIGJveCBzdGFy
dF1bc3BhbjFdW2lubGluZSBib3ggZW5kXVtiZXR3ZWVuXVtpbmxpbmUgYm94IHN0YXJ0XVtzcGFu
Ml1baW5saW5lIGJveCBlbmRdCisgICAgLy8gc2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9j
c3MtdGV4dC0zLyNsaW5lLWJyZWFrLWRldGFpbHMKKyAgICBzdHJ1Y3QgQ29udGludW91c0NvbnRl
bnQgeworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0
dXJuIG1fbG9naWNhbFdpZHRoOyB9CisgICAgICAgIElubGluZUxheW91dFVuaXQgY29sbGFwc2li
bGVMb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRo
OyB9CisgICAgICAgIElubGluZUxheW91dFVuaXQgbm9uQ29sbGFwc2libGVMb2dpY2FsV2lkdGgo
KSBjb25zdCB7IHJldHVybiBsb2dpY2FsV2lkdGgoKSAtIGNvbGxhcHNpYmxlTG9naWNhbFdpZHRo
KCk7IH0KKyAgICAgICAgYm9vbCBoYXNUcmFpbGluZ0NvbGxhcHNpYmxlQ29udGVudCgpIGNvbnN0
IHsgcmV0dXJuICEhY29sbGFwc2libGVMb2dpY2FsV2lkdGgoKTsgfQorICAgICAgICBib29sIGlz
RnVsbHlDb2xsYXBzaWJsZSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxXaWR0aCgpID09IGNvbGxh
cHNpYmxlTG9naWNhbFdpZHRoKCk7IH0KKworICAgICAgICB2b2lkIGFwcGVuZChjb25zdCBJbmxp
bmVJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgsIE9wdGlvbmFsPElubGluZUxh
eW91dFVuaXQ+IGNvbGxhcHNpYmxlV2lkdGgpOworICAgICAgICB2b2lkIHJlc2V0KCk7CisKKyAg
ICAgICAgc3RydWN0IFJ1biB7CisgICAgICAgICAgICBSdW4oY29uc3QgSW5saW5lSXRlbSYsIElu
bGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICAgICAgICAgIFJ1bihjb25zdCBSdW4m
KTsKKyAgICAgICAgICAgIFJ1biYgb3BlcmF0b3I9KGNvbnN0IFJ1biYpOworCisgICAgICAgICAg
ICBjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtOworICAgICAgICAgICAgSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsV2lkdGggeyAwIH07CisgICAgICAgIH07CisgICAgICAgIHVzaW5nIFJ1bkxp
c3QgPSBWZWN0b3I8UnVuLCAzPjsKKyAgICAgICAgY29uc3QgUnVuTGlzdCYgcnVucygpIGNvbnN0
IHsgcmV0dXJuIG1fcnVuczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUnVuTGlzdCBtX3J1
bnM7CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9sb2dpY2FsV2lkdGggeyAwIH07CisgICAg
ICAgIElubGluZUxheW91dFVuaXQgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCB7IDAgfTsKKyAg
ICB9OworCisgICAgc3RydWN0IExpbmVTdGF0dXMgeworICAgICAgICBJbmxpbmVMYXlvdXRVbml0
IGNvbnRlbnRMb2dpY2FsUmlnaHQgeyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgYXZh
aWxhYmxlV2lkdGggeyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgY29sbGFwc2libGVX
aWR0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gdHJhaWxpbmdT
b2Z0SHlwaGVuV2lkdGg7CisgICAgICAgIGJvb2wgaGFzRnVsbHlDb2xsYXBzaWJsZVRyYWlsaW5n
UnVuIHsgZmFsc2UgfTsKKyAgICAgICAgYm9vbCBoYXNDb250ZW50IHsgZmFsc2UgfTsKKyAgICAg
ICAgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24geyBmYWxzZSB9Owor
ICAgIH07CisgICAgUmVzdWx0IHByb2Nlc3NJbmxpbmVDb250ZW50KGNvbnN0IENvbnRpbnVvdXND
b250ZW50JiwgY29uc3QgTGluZVN0YXR1cyYpOworICAgIHZvaWQgc2V0SHlwaGVuYXRpb25EaXNh
YmxlZCgpIHsgbl9oeXBoZW5hdGlvbklzRGlzYWJsZWQgPSB0cnVlOyB9CisKKyAgICBzdGF0aWMg
Ym9vbCBpc1dyYXBwaW5nQWxsb3dlZChjb25zdCBJbmxpbmVJdGVtJik7CisKK3ByaXZhdGU6Cisg
ICAgUmVzdWx0IHByb2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnQoY29uc3QgQ29udGludW91c0NvbnRl
bnQmLCBjb25zdCBMaW5lU3RhdHVzJikgY29uc3Q7CisgICAgT3ZlcmZsb3dpbmdUZXh0Q29udGVu
dCBwcm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50V2l0aFRleHQoY29uc3QgQ29udGludW91c0NvbnRl
bnQmLCBjb25zdCBMaW5lU3RhdHVzJikgY29uc3Q7CisgICAgT3B0aW9uYWw8UGFydGlhbFJ1bj4g
dHJ5QnJlYWtpbmdUZXh0UnVuKGNvbnN0IENvbnRpbnVvdXNDb250ZW50OjpSdW4mIG92ZXJmbG93
UnVuLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRV
bml0PiBhdmFpbGFibGVXaWR0aCwgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9z
aXRpb24pIGNvbnN0OworCisgICAgZW51bSBjbGFzcyBXb3JkQnJlYWtSdWxlIHsKKyAgICAgICAg
QXRBcmJpdHJhcnlQb3NpdGlvbiAgICAgICAgPSAxIDw8IDAsCisgICAgICAgIEF0SHlwaGVuYXRp
b25PcHBvcnR1bml0aWVzID0gMSA8PCAxCisgICAgfTsKKyAgICBPcHRpb25TZXQ8V29yZEJyZWFr
UnVsZT4gd29yZEJyZWFrQmVoYXZpb3IoY29uc3QgUmVuZGVyU3R5bGUmLCBib29sIGhhc1dyYXBP
cHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3Q7CisgICAgYm9vbCBzaG91bGRLZWVw
RW5kT2ZMaW5lV2hpdGVzcGFjZShjb25zdCBDb250aW51b3VzQ29udGVudCYpIGNvbnN0OworCisg
ICAgYm9vbCBuX2h5cGhlbmF0aW9uSXNEaXNhYmxlZCB7IGZhbHNlIH07Cit9OworCitpbmxpbmUg
SW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50OjpSdW46OlJ1bihjb25zdCBJ
bmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKKyAg
ICA6IGlubGluZUl0ZW0oaW5saW5lSXRlbSkKKyAgICAsIGxvZ2ljYWxXaWR0aChsb2dpY2FsV2lk
dGgpCit7Cit9CisKK2lubGluZSBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRl
bnQ6OlJ1bjo6UnVuKGNvbnN0IFJ1biYgb3RoZXIpCisgICAgOiBpbmxpbmVJdGVtKG90aGVyLmlu
bGluZUl0ZW0pCisgICAgLCBsb2dpY2FsV2lkdGgob3RoZXIubG9naWNhbFdpZHRoKQoreworfQor
Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRp
bmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmE1MWVhZmZjZGEzZWVj
YzQzZTIxNWQxZDk2NDYxMDZjMGNjNWE5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9y
bWF0dGluZ0NvbnRleHQuY3BwCkBAIC0wLDAgKzEsNjExIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNp
ZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsb2F0aW5n
Q29udGV4dC5oIgorI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisjaW5jbHVkZSAiSW5saW5lRm9y
bWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgorI2luY2x1ZGUgIklu
bGluZUxpbmVSdW4uaCIKKyNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgorI2luY2x1ZGUgIklu
dmFsaWRhdGlvblN0YXRlLmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5
b3V0Q29udGFpbmVyQm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgorI2luY2x1ZGUg
IkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKKyNpbmNsdWRlICJMYXlvdXRJbmxpbmVU
ZXh0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0TGluZUJyZWFrQm94LmgiCisjaW5jbHVkZSAiTGF5
b3V0UmVwbGFjZWRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUgIkxv
Z2dpbmcuaCIKKyNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmgiCisjaW5jbHVkZSAi
VGV4dFV0aWwuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorI2luY2x1ZGUg
PHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNl
IExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCk7CisKK0lubGluZUZvcm1hdHRpbmdDb250ZXh0OjpJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgSW5saW5lRm9y
bWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dChm
b3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKK3sKK30KKworc3RhdGljIGlu
bGluZSBjb25zdCBCb3gqIG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBjb25zdCBDb250YWluZXJCb3gmIHN0YXlXaXRoaW4pCit7CisgICAgLy8gQXRvbWlj
IGlubGluZS1sZXZlbCBib3hlcyBhbmQgZmxvYXRzIGFyZSBvcGFxdWUgYm94ZXMgbWVhbmluZyB0
aGF0IHRoZXkgYXJlCisgICAgLy8gcmVzcG9uc2libGUgZm9yIHRoZWlyIG93biBjb250ZW50IChk
byBub3QgbmVlZCB0byBkZXNjZW5kIGludG8gdGhlaXIgc3VidHJlZXMpLgorICAgIC8vIE9ubHkg
aW5saW5lIGJveGVzIG1heSBoYXZlIHJlbGV2YW50IGRlc2NlbmRhbnQgY29udGVudC4KKyAgICBp
ZiAobGF5b3V0Qm94LmlzSW5saW5lQm94KCkpIHsKKyAgICAgICAgaWYgKGlzPENvbnRhaW5lckJv
eD4obGF5b3V0Qm94KSAmJiBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5G
bG93T3JGbG9hdGluZ0NoaWxkKCkpIHsKKyAgICAgICAgICAgIC8vIEFub255bW91cyBpbmxpbmUg
dGV4dCBib3hlcy9saW5lIGJyZWFrcyBjYW4ndCBoYXZlIGRlc2NlbmRhbnQgY29udGVudCBieSBk
ZWZpbml0aW9uLgorICAgICAgICAgICAgQVNTRVJUKCFsYXlvdXRCb3guaXNJbmxpbmVUZXh0Qm94
KCkgJiYgIWxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKTsKKyAgICAgICAgICAgIHJldHVybiBk
b3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hp
bGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byogbmV4dEluUHJlT3JkZXIg
PSAmbGF5b3V0Qm94OyBuZXh0SW5QcmVPcmRlciAmJiBuZXh0SW5QcmVPcmRlciAhPSAmc3RheVdp
dGhpbjsgbmV4dEluUHJlT3JkZXIgPSAmbmV4dEluUHJlT3JkZXItPnBhcmVudCgpKSB7CisgICAg
ICAgIGlmIChhdXRvKiBuZXh0U2libGluZyA9IG5leHRJblByZU9yZGVyLT5uZXh0SW5GbG93T3JG
bG9hdGluZ1NpYmxpbmcoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXh0U2libGluZzsKKyAgICB9
CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6
OmxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmIGludmFsaWRhdGlvblN0YXRl
LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAg
IExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbU3Rh
cnRdIC0+IGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgLT4gZm9ybWF0dGluZyByb290KCIgPDwg
JnJvb3QoKSA8PCAiKSIpOworICAgIEFTU0VSVChyb290KCkuaGFzSW5GbG93T3JGbG9hdGluZ0No
aWxkKCkpOworCisgICAgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShpbnZhbGlkYXRpb25TdGF0
ZSk7CisgICAgYXV0byogbGF5b3V0Qm94ID0gcm9vdCgpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0No
aWxkKCk7CisgICAgLy8gMS4gVmlzaXQgZWFjaCBpbmxpbmUgYm94IGFuZCBwYXJ0aWFsbHkgY29t
cHV0ZSB0aGVpciBnZW9tZXRyeSAobWFyZ2lucywgcGFkZGluZyBhbmQgYm9yZGVycykuCisgICAg
Ly8gMi4gQ29sbGVjdCB0aGUgaW5saW5lIGl0ZW1zIChmbGF0dGVuIHRoZSB0aGUgbGF5b3V0IHRy
ZWUpIGFuZCBwbGFjZSB0aGVtIG9uIGxpbmVzIGluIGJpZGlyZWN0aW9uYWwgb3JkZXIuIAorICAg
IHdoaWxlIChsYXlvdXRCb3gpIHsKKyAgICAgICAgQVNTRVJUKGxheW91dEJveC0+aXNJbmxpbmVM
ZXZlbEJveCgpIHx8IGxheW91dEJveC0+aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7CisKKyAgICAg
ICAgaWYgKGxheW91dEJveC0+aXNBdG9taWNJbmxpbmVMZXZlbEJveCgpIHx8IGxheW91dEJveC0+
aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkgeworICAgICAgICAgICAgLy8gSW5saW5lLWJsb2Nrcywg
aW5saW5lLXRhYmxlcyBhbmQgcmVwbGFjZWQgZWxlbWVudHMgKGltZywgdmlkZW8pIGNhbiBiZSBz
aXplZCBidXQgbm90IHlldCBwb3NpdGlvbmVkLgorICAgICAgICAgICAgaWYgKGlzPENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KSAmJiBsYXlvdXRCb3gtPmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRl
eHQoKSkgeworICAgICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3gtPmlzSW5saW5lQmxvY2tC
b3goKSB8fCBsYXlvdXRCb3gtPmlzSW5saW5lVGFibGVCb3goKSB8fCBsYXlvdXRCb3gtPmlzRmxv
YXRpbmdQb3NpdGlvbmVkKCkpOworICAgICAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdSb290
ID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PigqbGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICBj
b21wdXRlQm9yZGVyQW5kUGFkZGluZyhmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWludHMuaG9yaXpv
bnRhbCk7CisgICAgICAgICAgICAgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKGZvcm1hdHRpbmdS
b290LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKKworICAgICAgICAgICAgICAgIGlmIChmb3Jt
YXR0aW5nUm9vdC5oYXNDaGlsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gZm9ybWF0
dGluZ0NvbnRleHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChmb3Jt
YXR0aW5nUm9vdCwgbGF5b3V0U3RhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3Jt
YXR0aW5nUm9vdC5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGZvcm1hdHRpbmdDb250ZXh0LT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlv
blN0YXRlLCBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChmb3JtYXR0aW5n
Um9vdCkpOworICAgICAgICAgICAgICAgICAgICBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKGZvcm1h
dHRpbmdSb290LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKKyAgICAgICAgICAgICAgICAgICAg
Zm9ybWF0dGluZ0NvbnRleHQtPmxheW91dE91dE9mRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3Rh
dGUsIGdlb21ldHJ5KCkuY29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50KGZvcm1hdHRpbmdS
b290KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbXB1
dGVIZWlnaHRBbmRNYXJnaW4oZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzLmhvcml6b250YWwp
OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBSZXBsYWNlZCBhbmQg
b3RoZXIgdHlwZSBvZiBsZWFmIGF0b21pYyBpbmxpbmUgYm94ZXMuCisgICAgICAgICAgICAgICAg
Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoKmxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRh
bCk7CisgICAgICAgICAgICAgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKCpsYXlvdXRCb3gsIGNv
bnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAgICAgICAgIGNvbXB1dGVIZWlnaHRBbmRN
YXJnaW4oKmxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LT5pc0xpbmVCcmVha0JveCgpKSB7CisgICAg
ICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5
KCpsYXlvdXRCb3gpOworICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdp
bih7IH0pOworICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Qm9yZGVyKHsgfSk7CisgICAgICAg
ICAgICBib3hHZW9tZXRyeS5zZXRQYWRkaW5nKHsgfSk7CisgICAgICAgICAgICBib3hHZW9tZXRy
eS5zZXRDb250ZW50Qm94V2lkdGgoeyB9KTsKKyAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldFZl
cnRpY2FsTWFyZ2luKHsgfSk7CisgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LT5pc0lubGlu
ZUJveCgpKSB7CisgICAgICAgICAgICAvLyBUZXh0IHdyYXBwZXIgYm94ZXMgKGFub255bW91cyBp
bmxpbmUgbGV2ZWwgYm94ZXMpIGRvbid0IGhhdmUgYm94IGdlb21ldHJpZXMgKHRoZXkgb25seSBn
ZW5lcmF0ZSBydW5zKS4KKyAgICAgICAgICAgIGlmICghbGF5b3V0Qm94LT5pc0lubGluZVRleHRC
b3goKSkgeworICAgICAgICAgICAgICAgIC8vIElubGluZSBib3hlcyAoPHNwYW4+KSBjYW4ndCBn
ZXQgc2l6ZWQvcG9zaXRpb25lZCB5ZXQuIEF0IHRoaXMgcG9pbnQgd2UgY2FuIG9ubHkgY29tcHV0
ZSB0aGVpciBtYXJnaW5zLCBib3JkZXJzIGFuZCBwYWRkaW5nLgorICAgICAgICAgICAgICAgIGNv
bXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwp
OworICAgICAgICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsTWFyZ2luKCpsYXlvdXRCb3gsIGNv
bnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZSgp
LmJveEdlb21ldHJ5KCpsYXlvdXRCb3gpLnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisKKyAgICAgICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlvdXQoKmxheW91
dEJveCwgcm9vdCgpKTsKKyAgICB9CisKKyAgICBjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVk
KCk7CisKKyAgICBhdXRvJiBpbmxpbmVJdGVtcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmlubGluZUl0
ZW1zKCk7CisgICAgbGluZUxheW91dChpbmxpbmVJdGVtcywgeyAwLCBpbmxpbmVJdGVtcy5zaXpl
KCkgfSwgY29uc3RyYWludHMpOworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4
dExheW91dCwgc3RyZWFtIDw8ICJbRW5kXSAtPiBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0IC0+
IGZvcm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKK30KKwordm9pZCBJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dDo6bGluZUxheW91dEZvckludGVyZ3JhdGlvbihJbnZhbGlkYXRpb25T
dGF0ZSYgaW52YWxpZGF0aW9uU3RhdGUsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVu
dCYgY29uc3RyYWludHMpCit7CisgICAgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShpbnZhbGlk
YXRpb25TdGF0ZSk7CisgICAgY29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgpOworICAgIGF1
dG8mIGlubGluZUl0ZW1zID0gZm9ybWF0dGluZ1N0YXRlKCkuaW5saW5lSXRlbXMoKTsKKyAgICBs
aW5lTGF5b3V0KGlubGluZUl0ZW1zLCB7IDAsIGlubGluZUl0ZW1zLnNpemUoKSB9LCBjb25zdHJh
aW50cyk7Cit9CisKK0xheW91dFVuaXQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OnVzZWRDb250
ZW50SGVpZ2h0KCkgY29uc3QKK3sKKyAgICAvLyAxMC42LjcgJ0F1dG8nIGhlaWdodHMgZm9yIGJs
b2NrIGZvcm1hdHRpbmcgY29udGV4dCByb290cworCisgICAgLy8gSWYgaXQgb25seSBoYXMgaW5s
aW5lLWxldmVsIGNoaWxkcmVuLCB0aGUgaGVpZ2h0IGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRo
ZSB0b3Agb2YgdGhlIHRvcG1vc3QgbGluZSBib3ggYW5kIHRoZSBib3R0b20gb2YgdGhlIGJvdHRv
bW1vc3QgbGluZSBib3guCisKKyAgICAvLyBJbiBhZGRpdGlvbiwgaWYgdGhlIGVsZW1lbnQgaGFz
IGFueSBmbG9hdGluZyBkZXNjZW5kYW50cyB3aG9zZSBib3R0b20gbWFyZ2luIGVkZ2UgaXMgYmVs
b3cgdGhlIGVsZW1lbnQncyBib3R0b20gY29udGVudCBlZGdlLAorICAgIC8vIHRoZW4gdGhlIGhl
aWdodCBpcyBpbmNyZWFzZWQgdG8gaW5jbHVkZSB0aG9zZSBlZGdlcy4gT25seSBmbG9hdHMgdGhh
dCBwYXJ0aWNpcGF0ZSBpbiB0aGlzIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBhcmUgdGFrZW4K
KyAgICAvLyBpbnRvIGFjY291bnQsIGUuZy4sIGZsb2F0cyBpbnNpZGUgYWJzb2x1dGVseSBwb3Np
dGlvbmVkIGRlc2NlbmRhbnRzIG9yIG90aGVyIGZsb2F0cyBhcmUgbm90LgorICAgIGF1dG8mIGxp
bmVzID0gZm9ybWF0dGluZ1N0YXRlKCkubGluZXMoKTsKKyAgICAvLyBFdmVuIGVtcHR5IGNvbnRl
bnQgZ2VuZXJhdGVzIGEgbGluZS4KKyAgICBBU1NFUlQoIWxpbmVzLmlzRW1wdHkoKSk7CisgICAg
YXV0byB0b3AgPSBMYXlvdXRVbml0IHsgbGluZXMuZmlyc3QoKS5saW5lQm94TG9naWNhbFJlY3Qo
KS50b3AoKSB9OworICAgIGF1dG8gYm90dG9tID0gTGF5b3V0VW5pdCB7IGxpbmVzLmxhc3QoKS5s
aW5lQm94TG9naWNhbFJlY3QoKS5ib3R0b20oKSArIGZvcm1hdHRpbmdTdGF0ZSgpLmNsZWFyR2Fw
QWZ0ZXJMYXN0TGluZSgpIH07CisKKyAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0aW5n
Q29udGV4dCB7ICp0aGlzLCBmb3JtYXR0aW5nU3RhdGUoKS5mbG9hdGluZ1N0YXRlKCkgfTsKKyAg
ICBpZiAoYXV0byBmbG9hdEJvdHRvbSA9IGZsb2F0aW5nQ29udGV4dC5ib3R0b20oKSkgeworICAg
ICAgICBib3R0b20gPSBzdGQ6Om1heCgqZmxvYXRCb3R0b20sIGJvdHRvbSk7CisgICAgICAgIHRv
cCA9IHN0ZDo6bWluKCpmbG9hdGluZ0NvbnRleHQudG9wKCksIHRvcCk7CisgICAgfQorICAgIHJl
dHVybiBib3R0b20gLSB0b3A7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6Omxp
bmVMYXlvdXQoSW5saW5lSXRlbXMmIGlubGluZUl0ZW1zLCBMaW5lQnVpbGRlcjo6SW5saW5lSXRl
bVJhbmdlIG5lZWRzTGF5b3V0UmFuZ2UsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVu
dCYgY29uc3RyYWludHMpCit7CisgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9y
bWF0dGluZ1N0YXRlKCk7CisgICAgZm9ybWF0dGluZ1N0YXRlLmxpbmVSdW5zKCkucmVzZXJ2ZUlu
aXRpYWxDYXBhY2l0eShmb3JtYXR0aW5nU3RhdGUuaW5saW5lSXRlbXMoKS5zaXplKCkpOworICAg
IElubGluZUxheW91dFVuaXQgbGluZUxvZ2ljYWxUb3AgPSBjb25zdHJhaW50cy52ZXJ0aWNhbC5s
b2dpY2FsVG9wOworICAgIHN0cnVjdCBQcmV2aW91c0xpbmUgeworICAgICAgICBMaW5lQnVpbGRl
cjo6SW5saW5lSXRlbVJhbmdlIHJhbmdlOworICAgICAgICBzaXplX3Qgb3ZlcmZsb3dDb250ZW50
TGVuZ3RoIHsgMCB9OworICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxv
d0xvZ2ljYWxXaWR0aDsKKyAgICB9OworICAgIE9wdGlvbmFsPFByZXZpb3VzTGluZT4gcHJldmlv
dXNMaW5lOworICAgIGF1dG8mIGZsb2F0aW5nU3RhdGUgPSBmb3JtYXR0aW5nU3RhdGUuZmxvYXRp
bmdTdGF0ZSgpOworICAgIGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250ZXh0IHsg
KnRoaXMsIGZsb2F0aW5nU3RhdGUgfTsKKyAgICBhdXRvIGlzRmlyc3RMaW5lID0gZm9ybWF0dGlu
Z1N0YXRlLmxpbmVzKCkuaXNFbXB0eSgpOworCisgICAgYXV0byBsaW5lQnVpbGRlciA9IExpbmVC
dWlsZGVyIHsgKnRoaXMsIGZsb2F0aW5nU3RhdGUsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIGlu
bGluZUl0ZW1zIH07CisgICAgd2hpbGUgKCFuZWVkc0xheW91dFJhbmdlLmlzRW1wdHkoKSkgewor
ICAgICAgICAvLyBUdXJuIHByZXZpb3VzIGxpbmUncyBvdmVyZmxvdyBjb250ZW50IGxlbmd0aCBp
bnRvIHRoZSBuZXh0IGxpbmUncyBsZWFkaW5nIGNvbnRlbnQgcGFydGlhbCBsZW5ndGguCisgICAg
ICAgIC8vICJzcFs8LWxpbmUgYnJlYWstPl1saXRfY29udGVudCIgLT4gb3ZlcmZsb3cgbGVuZ3Ro
OiAxMSAtPiBsZWFkaW5nIHBhcnRpYWwgY29udGVudCBsZW5ndGg6IDExLgorICAgICAgICBhdXRv
IHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCA9IHByZXZpb3VzTGluZSA/IHByZXZpb3VzTGlu
ZS0+b3ZlcmZsb3dDb250ZW50TGVuZ3RoIDogMDsKKyAgICAgICAgYXV0byBsZWFkaW5nTG9naWNh
bFdpZHRoID0gcHJldmlvdXNMaW5lID8gcHJldmlvdXNMaW5lLT5vdmVyZmxvd0xvZ2ljYWxXaWR0
aCA6IFdURjo6bnVsbG9wdDsKKyAgICAgICAgYXV0byBpbml0aWFsTGluZUNvbnN0cmFpbnRzID0g
SW5saW5lUmVjdCB7IGxpbmVMb2dpY2FsVG9wLCBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2lj
YWxMZWZ0LCBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxXaWR0aCwgcXVpcmtzKCkuaW5p
dGlhbExpbmVIZWlnaHQoKSB9OworICAgICAgICBhdXRvIGxpbmVDb250ZW50ID0gbGluZUJ1aWxk
ZXIubGF5b3V0SW5saW5lQ29udGVudChuZWVkc0xheW91dFJhbmdlLCBwYXJ0aWFsTGVhZGluZ0Nv
bnRlbnRMZW5ndGgsIGxlYWRpbmdMb2dpY2FsV2lkdGgsIGluaXRpYWxMaW5lQ29uc3RyYWludHMs
IGlzRmlyc3RMaW5lKTsKKyAgICAgICAgYXV0byBsaW5lTG9naWNhbFJlY3QgPSBjb21wdXRlR2Vv
bWV0cnlGb3JMaW5lQ29udGVudChsaW5lQ29udGVudCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7
CisKKyAgICAgICAgYXV0byBsaW5lQ29udGVudFJhbmdlID0gbGluZUNvbnRlbnQuaW5saW5lSXRl
bVJhbmdlOworICAgICAgICBpZiAoIWxpbmVDb250ZW50UmFuZ2UuaXNFbXB0eSgpKSB7CisgICAg
ICAgICAgICBBU1NFUlQobmVlZHNMYXlvdXRSYW5nZS5zdGFydCA8IGxpbmVDb250ZW50UmFuZ2Uu
ZW5kKTsKKyAgICAgICAgICAgIGlzRmlyc3RMaW5lID0gZmFsc2U7CisgICAgICAgICAgICBsaW5l
TG9naWNhbFRvcCA9IGdlb21ldHJ5KCkubG9naWNhbFRvcEZvck5leHRMaW5lKGxpbmVDb250ZW50
LCBsaW5lTG9naWNhbFJlY3QuYm90dG9tKCksIGZsb2F0aW5nQ29udGV4dCk7CisgICAgICAgICAg
ICBpZiAobGluZUNvbnRlbnQuaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KSB7CisgICAgICAg
ICAgICAgICAgLy8gVGhlIGZpbmFsIGNvbnRlbnQgaGVpZ2h0IG9mIHRoaXMgaW5saW5lIGZvcm1h
dHRpbmcgY29udGV4dCBzaG91bGQgaW5jbHVkZSB0aGUgY2xlYXJlZCBmbG9hdHMgYXMgd2VsbC4K
KyAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuc2V0Q2xlYXJHYXBBZnRlckxhc3RMaW5l
KGxpbmVMb2dpY2FsVG9wIC0gbGluZUxvZ2ljYWxSZWN0LmJvdHRvbSgpKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIC8vIFdoZW4gdGhlIHRyYWlsaW5nIGNvbnRlbnQgaXMgcGFydGlhbCwg
d2UgbmVlZCB0byByZXVzZSB0aGUgbGFzdCBJbmxpbmVUZXh0SXRlbS4KKyAgICAgICAgICAgIGF1
dG8gbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPSBsaW5lQ29udGVudC5wYXJ0aWFs
VHJhaWxpbmdDb250ZW50TGVuZ3RoOworICAgICAgICAgICAgaWYgKGxhc3RJbmxpbmVJdGVtTmVl
ZHNQYXJ0aWFsTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgYXV0byBsaW5lTGF5b3V0SGFzQWR2
YW5jZWQgPSAhcHJldmlvdXNMaW5lCisgICAgICAgICAgICAgICAgICAgIHx8IGxpbmVDb250ZW50
UmFuZ2UuZW5kID4gcHJldmlvdXNMaW5lLT5yYW5nZS5lbmQKKyAgICAgICAgICAgICAgICAgICAg
fHwgKHByZXZpb3VzTGluZS0+b3ZlcmZsb3dDb250ZW50TGVuZ3RoICYmIHByZXZpb3VzTGluZS0+
b3ZlcmZsb3dDb250ZW50TGVuZ3RoID4gbGluZUNvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVu
dExlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFsaW5lTGF5b3V0SGFzQWR2YW5jZWQpIHsK
KyAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAg
ICAgICAgIC8vIE1vdmUgb3ZlciB0byB0aGUgbmV4dCBydW4gaWYgd2UgYXJlIHN0dWNrIG9uIHRo
aXMgcGFydGlhbCBjb250ZW50ICh3aGVuIHRoZSBvdmVyZmxvdyBjb250ZW50IGxlbmd0aCByZW1h
aW5zIHRoZSBzYW1lKS4KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2VydGFpbmx5IGxvc2Ug
c29tZSBjb250ZW50LCBidXQgd2Ugd291bGQgYmUgYnVzeSBsb29waW5nIG90aGVyd2lzZS4KKyAg
ICAgICAgICAgICAgICAgICAgbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPSBmYWxz
ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZWVkc0xh
eW91dFJhbmdlLnN0YXJ0ID0gbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPyBsaW5l
Q29udGVudFJhbmdlLmVuZCAtIDEgOiBsaW5lQ29udGVudFJhbmdlLmVuZDsKKyAgICAgICAgICAg
IHByZXZpb3VzTGluZSA9IFByZXZpb3VzTGluZSB7IGxpbmVDb250ZW50UmFuZ2UsIGxpbmVDb250
ZW50LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgsIGxpbmVDb250ZW50Lm92ZXJmbG93TG9n
aWNhbFdpZHRoIH07CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAv
LyBGbG9hdHMgcHJldmVudGVkIHVzIHBsYWNpbmcgYW55IGNvbnRlbnQgb24gdGhlIGxpbmUuCisg
ICAgICAgIEFTU0VSVChsaW5lQ29udGVudC5ydW5zLmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VS
VChsaW5lQ29udGVudC5oYXNJbnRydXNpdmVGbG9hdCk7CisgICAgICAgIC8vIE1vdmUgdGhlIG5l
eHQgbGluZSBiZWxvdyB0aGUgaW50cnVzaXZlIGZsb2F0LgorICAgICAgICBhdXRvIGZsb2F0Q29u
c3RyYWludHMgPSBmbG9hdGluZ0NvbnRleHQuY29uc3RyYWludHModG9MYXlvdXRVbml0KGxpbmVM
b2dpY2FsVG9wKSwgdG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmVjdC5ib3R0b20oKSkpOworICAg
ICAgICBBU1NFUlQoZmxvYXRDb25zdHJhaW50cy5sZWZ0IHx8IGZsb2F0Q29uc3RyYWludHMucmln
aHQpOworICAgICAgICBzdGF0aWMgYXV0byBpbmlmaXRlUG9pbnQgPSBQb2ludEluQ29udGV4dFJv
b3Q6Om1heCgpOworICAgICAgICAvLyBJbiBjYXNlIG9mIGxlZnQgYW5kIHJpZ2h0IGNvbnN0cmFp
bnRzLCB3ZSBuZWVkIHRvIHBpY2sgdGhlIG9uZSB0aGF0J3MgY2xvc2VyIHRvIHRoZSBjdXJyZW50
IGxpbmUuCisgICAgICAgIGxpbmVMb2dpY2FsVG9wID0gc3RkOjptaW4oZmxvYXRDb25zdHJhaW50
cy5sZWZ0LnZhbHVlT3IoaW5pZml0ZVBvaW50KS55LCBmbG9hdENvbnN0cmFpbnRzLnJpZ2h0LnZh
bHVlT3IoaW5pZml0ZVBvaW50KS55KTsKKyAgICAgICAgQVNTRVJUKGxpbmVMb2dpY2FsVG9wIDwg
aW5pZml0ZVBvaW50LnkpOworICAgIH0KK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cygpCit7CisgICAgYXV0byYgbGF5b3V0U3RhdGUgPSB0aGlzLT5s
YXlvdXRTdGF0ZSgpOworICAgIEFTU0VSVCghZm9ybWF0dGluZ1N0YXRlKCkuaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cygpKTsKKworICAgIGlmICghcm9vdCgpLmhhc0luRmxvd09yRmxvYXRpbmdD
aGlsZCgpKSB7CisgICAgICAgIGF1dG8gY29uc3RyYWludHMgPSBnZW9tZXRyeSgpLmNvbnN0cmFp
bkJ5TWluTWF4V2lkdGgocm9vdCgpLCB7IH0pOworICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5z
ZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKTsKKyAgICAgICAgcmV0dXJu
IGNvbnN0cmFpbnRzOworICAgIH0KKworICAgIFZlY3Rvcjxjb25zdCBCb3gqPiBmb3JtYXR0aW5n
Q29udGV4dFJvb3RMaXN0OworICAgIGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRzID0gSG9yaXpv
bnRhbENvbnN0cmFpbnRzIHsgMF9sdSwgMF9sdSB9OworICAgIGF1dG8qIGxheW91dEJveCA9IHJv
b3QoKS5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpOworICAgIC8vIEluIG9yZGVyIHRvIGNv
bXB1dGUgdGhlIG1heC9taW4gd2lkdGhzLCB3ZSBuZWVkIHRvIGNvbXB1dGUgbWFyZ2lucywgYm9y
ZGVycyBhbmQgcGFkZGluZyBmb3IgY2VydGFpbiBpbmxpbmUgYm94ZXMgZmlyc3QuCisgICAgd2hp
bGUgKGxheW91dEJveCkgeworICAgICAgICBpZiAobGF5b3V0Qm94LT5pc0lubGluZVRleHRCb3go
KSkgeworICAgICAgICAgICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlvdXQo
KmxheW91dEJveCwgcm9vdCgpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9Cisg
ICAgICAgIGlmIChsYXlvdXRCb3gtPmlzUmVwbGFjZWRCb3goKSkgeworICAgICAgICAgICAgY29t
cHV0ZUJvcmRlckFuZFBhZGRpbmcoKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsK
KyAgICAgICAgICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbigqbGF5b3V0Qm94LCBob3Jpem9udGFs
Q29uc3RyYWludHMpOworICAgICAgICB9IGVsc2UgaWYgKGxheW91dEJveC0+aXNGbG9hdGluZ1Bv
c2l0aW9uZWQoKSB8fCBsYXlvdXRCb3gtPmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSkgeworICAg
ICAgICAgICAgQVNTRVJUKGxheW91dEJveC0+ZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgp
KTsKKyAgICAgICAgICAgIGZvcm1hdHRpbmdDb250ZXh0Um9vdExpc3QuYXBwZW5kKGxheW91dEJv
eCk7CisKKyAgICAgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGhv
cml6b250YWxDb25zdHJhaW50cyk7CisgICAgICAgICAgICBjb21wdXRlSG9yaXpvbnRhbE1hcmdp
bigqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAgICAgICAgY29tcHV0
ZUludHJpbnNpY1dpZHRoRm9yRm9ybWF0dGluZ1Jvb3QoKmxheW91dEJveCk7CisgICAgICAgIH0g
ZWxzZSBpZiAobGF5b3V0Qm94LT5pc0lubGluZUJveCgpKSB7CisgICAgICAgICAgICBjb21wdXRl
Qm9yZGVyQW5kUGFkZGluZygqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAg
ICAgICAgICAgY29tcHV0ZUhvcml6b250YWxNYXJnaW4oKmxheW91dEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICAgICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlvdXQoKmxh
eW91dEJveCwgcm9vdCgpKTsKKyAgICB9CisKKyAgICBjb2xsZWN0SW5saW5lQ29udGVudElmTmVl
ZGVkKCk7CisKKyAgICBhdXRvIG1heGltdW1MaW5lV2lkdGggPSBbJl0oYXV0byBhdmFpbGFibGVX
aWR0aCkgeworICAgICAgICAvLyBTd2l0Y2ggdG8gdGhlIG1pbi9tYXggZm9ybWF0dGluZyByb290
IHdpZHRoIHZhbHVlcyBiZWZvcmUgZm9ybWF0dGluZyB0aGUgbGluZXMuCisgICAgICAgIGZvciAo
YXV0byogZm9ybWF0dGluZ1Jvb3QgOiBmb3JtYXR0aW5nQ29udGV4dFJvb3RMaXN0KSB7CisgICAg
ICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRocyA9IGxheW91dFN0YXRlLmZvcm1hdHRpbmdTdGF0
ZUZvckJveCgqZm9ybWF0dGluZ1Jvb3QpLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3go
KmZvcm1hdHRpbmdSb290KTsKKyAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0
dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoKmZvcm1hdHRpbmdSb290KTsKKyAgICAgICAgICAgIGF1
dG8gY29udGVudFdpZHRoID0gKGF2YWlsYWJsZVdpZHRoID8gaW50cmluc2ljV2lkdGhzLT5tYXhp
bXVtIDogaW50cmluc2ljV2lkdGhzLT5taW5pbXVtKSAtIGJveEdlb21ldHJ5Lmhvcml6b250YWxN
YXJnaW5Cb3JkZXJBbmRQYWRkaW5nKCk7CisgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250
ZW50Qm94V2lkdGgoY29udGVudFdpZHRoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29t
cHV0ZWRJbnRyaW5zaWNXaWR0aEZvckNvbnN0cmFpbnQoYXZhaWxhYmxlV2lkdGgpOworICAgIH07
CisKKyAgICBhdXRvIG1pbmltdW1Db250ZW50V2lkdGggPSBjZWlsZWRMYXlvdXRVbml0KG1heGlt
dW1MaW5lV2lkdGgoMCkpOworICAgIGF1dG8gbWF4aW11bUNvbnRlbnRXaWR0aCA9IGNlaWxlZExh
eW91dFVuaXQobWF4aW11bUxpbmVXaWR0aChtYXhJbmxpbmVMYXlvdXRVbml0KCkpKTsKKyAgICBh
dXRvIGNvbnN0cmFpbnRzID0gZ2VvbWV0cnkoKS5jb25zdHJhaW5CeU1pbk1heFdpZHRoKHJvb3Qo
KSwgeyBtaW5pbXVtQ29udGVudFdpZHRoLCBtYXhpbXVtQ29udGVudFdpZHRoIH0pOworICAgIGZv
cm1hdHRpbmdTdGF0ZSgpLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3RyYWludHMp
OworICAgIHJldHVybiBjb25zdHJhaW50czsKK30KKworSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aEZvckNvbnN0cmFpbnQoSW5s
aW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCkgY29uc3QKK3sKKyAgICBhdXRvJiBpbmxpbmVJ
dGVtcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmlubGluZUl0ZW1zKCk7CisgICAgYXV0byBsaW5lQnVp
bGRlciA9IExpbmVCdWlsZGVyIHsgKnRoaXMsIGlubGluZUl0ZW1zIH07CisgICAgYXV0byBsYXlv
dXRSYW5nZSA9IExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UgeyAwICwgaW5saW5lSXRlbXMu
c2l6ZSgpIH07CisgICAgYXV0byBtYXhpbXVtTGluZVdpZHRoID0gSW5saW5lTGF5b3V0VW5pdCB7
IH07CisgICAgYXV0byBtYXhpbXVtRmxvYXRXaWR0aCA9IExheW91dFVuaXQgeyB9OworICAgIHdo
aWxlICghbGF5b3V0UmFuZ2UuaXNFbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaW50cmluc2ljQ29u
dGVudCA9IGxpbmVCdWlsZGVyLmNvbXB1dGVkSW50cmluc2ljV2lkdGgobGF5b3V0UmFuZ2UsIGF2
YWlsYWJsZVdpZHRoKTsKKyAgICAgICAgbGF5b3V0UmFuZ2Uuc3RhcnQgPSBpbnRyaW5zaWNDb250
ZW50LmlubGluZUl0ZW1SYW5nZS5lbmQ7CisgICAgICAgIG1heGltdW1MaW5lV2lkdGggPSBzdGQ6
Om1heChtYXhpbXVtTGluZVdpZHRoLCBpbnRyaW5zaWNDb250ZW50LmxvZ2ljYWxXaWR0aCk7Cisg
ICAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3IgY2xlYXIuCisgICAgICAgIGZvciAoYXV0
byogZmxvYXRCb3ggOiBpbnRyaW5zaWNDb250ZW50LmZsb2F0cykKKyAgICAgICAgICAgIG1heGlt
dW1GbG9hdFdpZHRoICs9IGdlb21ldHJ5Rm9yQm94KCpmbG9hdEJveCkubWFyZ2luQm94V2lkdGgo
KTsKKyAgICB9CisgICAgcmV0dXJuIG1heGltdW1MaW5lV2lkdGggKyBtYXhpbXVtRmxvYXRXaWR0
aDsKK30KKwordm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUludHJpbnNpY1dp
ZHRoRm9yRm9ybWF0dGluZ1Jvb3QoY29uc3QgQm94JiBmb3JtYXR0aW5nUm9vdCkKK3sKKyAgICBB
U1NFUlQoZm9ybWF0dGluZ1Jvb3QuZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKKyAg
ICBhdXRvIGNvbnN0cmFpbnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07CisgICAg
aWYgKGF1dG8gZml4ZWRXaWR0aCA9IGdlb21ldHJ5KCkuZml4ZWRWYWx1ZShmb3JtYXR0aW5nUm9v
dC5zdHlsZSgpLmxvZ2ljYWxXaWR0aCgpKSkKKyAgICAgICAgY29uc3RyYWludHMgPSB7ICpmaXhl
ZFdpZHRoLCAqZml4ZWRXaWR0aCB9OworICAgIGVsc2UgeworICAgICAgICBhdXRvIGhhc0luZmxv
d09yRmxvYXRpbmdDb250ZW50ID0gaXM8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nUm9vdCkgJiYg
ZG93bmNhc3Q8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nUm9vdCkuaGFzSW5GbG93T3JGbG9hdGlu
Z0NoaWxkKCk7CisgICAgICAgIC8vIFRoZSBpbnRyaW5zaWMgc2l6ZXMgb2YgdGhlIHNpemUgY29u
dGFpbm1lbnQgYm94IGFyZSBkZXRlcm1pbmVkIGFzIGlmIHRoZSBlbGVtZW50IGhhZCBubyBjb250
ZW50LgorICAgICAgICBhdXRvIHNob3VsZElnbm9yZUNoaWxkQ29udGVudCA9IGZvcm1hdHRpbmdS
b290LmlzU2l6ZUNvbnRhaW5tZW50Qm94KCk7CisgICAgICAgIGlmIChoYXNJbmZsb3dPckZsb2F0
aW5nQ29udGVudCAmJiAhc2hvdWxkSWdub3JlQ2hpbGRDb250ZW50KQorICAgICAgICAgICAgY29u
c3RyYWludHMgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChkb3duY2Fz
dDxDb250YWluZXJCb3g+KGZvcm1hdHRpbmdSb290KSwgbGF5b3V0U3RhdGUoKSktPmNvbXB1dGVk
SW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOworICAgIH0KKyAgICBjb25zdHJhaW50cyA9IGdl
b21ldHJ5KCkuY29uc3RyYWluQnlNaW5NYXhXaWR0aChmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWlu
dHMpOworICAgIGNvbnN0cmFpbnRzLmV4cGFuZChnZW9tZXRyeUZvckJveChmb3JtYXR0aW5nUm9v
dCkuaG9yaXpvbnRhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKSk7CisgICAgZm9ybWF0dGluZ1N0
YXRlKCkuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChmb3JtYXR0aW5nUm9vdCwg
Y29uc3RyYWludHMpOworfQorCit2b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRl
SG9yaXpvbnRhbE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCit7CisgICAgYXV0byBjb21wdXRlZEhv
cml6b250YWxNYXJnaW4gPSBnZW9tZXRyeSgpLmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihsYXlv
dXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94
R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgY29tcHV0ZWRIb3Jpem9u
dGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQu
dmFsdWVPcigwKSB9KTsKK30KKwordm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0
ZVdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29u
c3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBhdXRvIGNvbXB1dGUgPSBb
Jl0oT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZFdpZHRoKSB7CisgICAgICAgIGlmIChsYXlvdXRC
b3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgp
LmZsb2F0aW5nQ29udGVudFdpZHRoQW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0
cmFpbnRzLCB7IHVzZWRXaWR0aCwgeyB9IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94LmlzSW5s
aW5lQmxvY2tCb3goKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZUJsb2Nr
Q29udGVudFdpZHRoQW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7
IHVzZWRXaWR0aCwgeyB9IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3go
KSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZVJlcGxhY2VkQ29udGVudFdp
ZHRoQW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFs
Q29uc3RyYWludHMsIHsgfSwgeyB1c2VkV2lkdGgsIHsgfSB9KTsKKyAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBDb250ZW50V2lkdGhBbmRNYXJnaW4geyB9Owor
ICAgIH07CisKKyAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUoeyB9KTsK
KworICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNh
bFdpZHRoOworICAgIGlmIChhdXRvIG1heFdpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1heFdp
ZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpKSB7CisgICAgICAgIGF1dG8gbWF4V2lkdGhB
bmRNYXJnaW4gPSBjb21wdXRlKG1heFdpZHRoKTsKKyAgICAgICAgaWYgKGNvbnRlbnRXaWR0aEFu
ZE1hcmdpbi5jb250ZW50V2lkdGggPiBtYXhXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCisg
ICAgICAgICAgICBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBtYXhXaWR0aEFuZE1hcmdpbjsKKyAg
ICB9CisKKyAgICBhdXRvIG1pbldpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbldpZHRoKGxh
eW91dEJveCwgYXZhaWxhYmxlV2lkdGgpLnZhbHVlT3IoMCk7CisgICAgYXV0byBtaW5XaWR0aEFu
ZE1hcmdpbiA9IGNvbXB1dGUobWluV2lkdGgpOworICAgIGlmIChjb250ZW50V2lkdGhBbmRNYXJn
aW4uY29udGVudFdpZHRoIDwgbWluV2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQorICAgICAg
ICBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBtaW5XaWR0aEFuZE1hcmdpbjsKKworICAgIGF1dG8m
IGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsK
KyAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudFdpZHRoQW5kTWFyZ2lu
LmNvbnRlbnRXaWR0aCk7CisgICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IGNv
bnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0LCBjb250ZW50V2lkdGhBbmRNYXJn
aW4udXNlZE1hcmdpbi5lbmQgfSk7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6
OmNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQoreworICAgIGF1dG8gY29t
cHV0ZSA9IFsmXShPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkSGVpZ2h0KSB7CisgICAgICAgIGlm
IChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBn
ZW9tZXRyeSgpLmZsb2F0aW5nQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6
b250YWxDb25zdHJhaW50cywgeyB1c2VkSGVpZ2h0IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94
LmlzSW5saW5lQmxvY2tCb3goKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGlu
ZUJsb2NrQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJh
aW50cywgeyB1c2VkSGVpZ2h0IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRC
b3goKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZVJlcGxhY2VkQ29udGVu
dEhlaWdodEFuZE1hcmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpv
bnRhbENvbnN0cmFpbnRzLCB7IH0sIHsgdXNlZEhlaWdodCB9KTsKKyAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIHsgfTsK
KyAgICB9OworCisgICAgYXV0byBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZSh7IH0p
OworICAgIGlmIChhdXRvIG1heEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQo
bGF5b3V0Qm94KSkgeworICAgICAgICBhdXRvIG1heEhlaWdodEFuZE1hcmdpbiA9IGNvbXB1dGUo
bWF4SGVpZ2h0KTsKKyAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhl
aWdodCA+IG1heEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KQorICAgICAgICAgICAgY29u
dGVudEhlaWdodEFuZE1hcmdpbiA9IG1heEhlaWdodEFuZE1hcmdpbjsKKyAgICB9CisKKyAgICBp
ZiAoYXV0byBtaW5IZWlnaHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluSGVpZ2h0KGxheW91dEJv
eCkpIHsKKyAgICAgICAgYXV0byBtaW5IZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRlKG1pbkhlaWdo
dCk7CisgICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPCBt
aW5IZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCkKKyAgICAgICAgICAgIGNvbnRlbnRIZWln
aHRBbmRNYXJnaW4gPSBtaW5IZWlnaHRBbmRNYXJnaW47CisgICAgfQorICAgIGF1dG8mIGJveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsKKyAgICBi
b3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29u
dGVudEhlaWdodCk7CisgICAgYm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyBjb250ZW50
SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbi5iZWZvcmUsIGNvbnRlbnRIZWlnaHRB
bmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmFmdGVyIH0pOworfQorCit2b2lkIElubGluZUZv
cm1hdHRpbmdDb250ZXh0Ojpjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCkKK3sKKyAgICBh
dXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5nU3RhdGUoKTsKKyAgICBpZiAo
IWZvcm1hdHRpbmdTdGF0ZS5pbmxpbmVJdGVtcygpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
OworICAgIC8vIFRyYXZlcnNlIHRoZSB0cmVlIGFuZCBjcmVhdGUgaW5saW5lIGl0ZW1zIG91dCBv
ZiBpbmxpbmUgYm94ZXMgYW5kIGxlYWYgbm9kZXMuIFRoaXMgZXNzZW50aWFsbHkgdHVybnMgdGhl
IHRyZWUgaW5saW5lIHN0cnVjdHVyZSBpbnRvIGEgZmxhdCBvbmUuCisgICAgLy8gPHNwYW4+dGV4
dDxzcGFuPjwvc3Bhbj48aW1nPjwvc3Bhbj4gLT4gW0lubGluZUJveFN0YXJ0XVtJbmxpbmVMZXZl
bEJveF1bSW5saW5lQm94U3RhcnRdW0lubGluZUJveEVuZF1bSW5saW5lTGV2ZWxCb3hdW0lubGlu
ZUJveEVuZF0KKyAgICBBU1NFUlQocm9vdCgpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKTsK
KyAgICBMYXlvdXRRdWV1ZSBsYXlvdXRRdWV1ZTsKKyAgICBsYXlvdXRRdWV1ZS5hcHBlbmQocm9v
dCgpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpOworICAgIHdoaWxlICghbGF5b3V0UXVl
dWUuaXNFbXB0eSgpKSB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBhdXRv
JiBsYXlvdXRCb3ggPSAqbGF5b3V0UXVldWUubGFzdCgpOworICAgICAgICAgICAgYXV0byBpc0Jv
eFdpdGhJbmxpbmVDb250ZW50ID0gbGF5b3V0Qm94LmlzSW5saW5lQm94KCkgJiYgIWxheW91dEJv
eC5pc0lubGluZVRleHRCb3goKSAmJiAhbGF5b3V0Qm94LmlzTGluZUJyZWFrQm94KCk7CisgICAg
ICAgICAgICBpZiAoIWlzQm94V2l0aElubGluZUNvbnRlbnQpCisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzdGFydCBvZiBhbiBpbmxpbmUgYm94IChl
LmcuIDxzcGFuPikuCisgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkSW5saW5lSXRlbSh7
IGxheW91dEJveCwgSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94U3RhcnQgfSk7CisgICAgICAg
ICAgICBhdXRvJiBpbmxpbmVCb3hXaXRoSW5saW5lQ29udGVudCA9IGRvd25jYXN0PENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KTsKKyAgICAgICAgICAgIGlmICghaW5saW5lQm94V2l0aElubGluZUNv
bnRlbnQuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBsYXlvdXRRdWV1ZS5hcHBlbmQoaW5saW5lQm94V2l0aElubGluZUNvbnRl
bnQuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICB3
aGlsZSAoIWxheW91dFF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXV0byYgbGF5b3V0
Qm94ID0gKmxheW91dFF1ZXVlLnRha2VMYXN0KCk7CisgICAgICAgICAgICBpZiAoaXM8TGluZUJy
ZWFrQm94PihsYXlvdXRCb3gpKSB7CisgICAgICAgICAgICAgICAgYXV0byYgbGluZUJyZWFrQm94
ID0gZG93bmNhc3Q8TGluZUJyZWFrQm94PihsYXlvdXRCb3gpOworICAgICAgICAgICAgICAgIGZv
cm1hdHRpbmdTdGF0ZS5hZGRJbmxpbmVJdGVtKHsgbGF5b3V0Qm94LCBsaW5lQnJlYWtCb3guaXNP
cHRpb25hbCgpID8gSW5saW5lSXRlbTo6VHlwZTo6V29yZEJyZWFrT3Bwb3J0dW5pdHkgOiBJbmxp
bmVJdGVtOjpUeXBlOjpIYXJkTGluZUJyZWFrIH0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChs
YXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgICAgICBmb3JtYXR0
aW5nU3RhdGUuYWRkSW5saW5lSXRlbSh7IGxheW91dEJveCwgSW5saW5lSXRlbTo6VHlwZTo6Rmxv
YXQgfSk7CisgICAgICAgICAgICBlbHNlIGlmIChsYXlvdXRCb3guaXNBdG9taWNJbmxpbmVMZXZl
bEJveCgpKQorICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRJbmxpbmVJdGVtKHsg
bGF5b3V0Qm94LCBJbmxpbmVJdGVtOjpUeXBlOjpCb3ggfSk7CisgICAgICAgICAgICBlbHNlIGlm
IChsYXlvdXRCb3guaXNJbmxpbmVUZXh0Qm94KCkpIHsKKyAgICAgICAgICAgICAgICBJbmxpbmVU
ZXh0SXRlbTo6Y3JlYXRlQW5kQXBwZW5kVGV4dEl0ZW1zKGZvcm1hdHRpbmdTdGF0ZS5pbmxpbmVJ
dGVtcygpLCBkb3duY2FzdDxJbmxpbmVUZXh0Qm94PihsYXlvdXRCb3gpKTsKKyAgICAgICAgICAg
IH0gZWxzZSBpZiAobGF5b3V0Qm94LmlzSW5saW5lQm94KCkpCisgICAgICAgICAgICAgICAgZm9y
bWF0dGluZ1N0YXRlLmFkZElubGluZUl0ZW0oeyBsYXlvdXRCb3gsIElubGluZUl0ZW06OlR5cGU6
OklubGluZUJveEVuZCB9KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKworICAgICAgICAgICAgaWYgKGF1dG8qIG5leHRTaWJsaW5nID0g
bGF5b3V0Qm94Lm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7CisgICAgICAgICAgICAg
ICAgbGF5b3V0UXVldWUuYXBwZW5kKG5leHRTaWJsaW5nKTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworSW5saW5lUmVjdCBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUdlb21ldHJ5Rm9yTGluZUNvbnRlbnQoY29uc3Qg
TGluZUJ1aWxkZXI6OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCit7CisgICAgYXV0byYgZm9ybWF0dGlu
Z1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7CisgICAgYXV0byBnZW9tZXRyeSA9IHRo
aXMtPmdlb21ldHJ5KCk7CisKKyAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZUJveChnZW9tZXRy
eS5saW5lQm94Rm9yTGluZUNvbnRlbnQobGluZUNvbnRlbnQpKTsKKyAgICBjb25zdCBhdXRvJiBs
aW5lQm94ID0gZm9ybWF0dGluZ1N0YXRlLmxpbmVCb3hlcygpLmxhc3QoKTsKKyAgICBhdXRvIGxp
bmVJbmRleCA9IGZvcm1hdHRpbmdTdGF0ZS5saW5lcygpLnNpemUoKTsKKyAgICBhdXRvJiBsaW5l
Qm94TG9naWNhbFJlY3QgPSBsaW5lQm94LmxvZ2ljYWxSZWN0KCk7CisgICAgaWYgKCFsaW5lQm94
Lmhhc0NvbnRlbnQoKSkgeworICAgICAgICAvLyBGYXN0IHBhdGggZm9yIGxpbmVzIHdpdGggbm8g
Y29udGVudCBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2Rpdj4gb3IgPHNw
YW4+PGRpdj48L2Rpdj48L3NwYW4+IHdoZXJlIHdlIGNvbnN0cnVjdCBlbXB0eSBwcmUgYW5kIHBv
c3QgYmxvY2tzLgorICAgICAgICBBU1NFUlQoIWxpbmVCb3guY29udGVudExvZ2ljYWxXaWR0aCgp
ICYmICFsaW5lQm94TG9naWNhbFJlY3QuaGVpZ2h0KCkpOworICAgICAgICBhdXRvIHVwZGF0ZUlu
bGluZUJveGVzR2VvbWV0cnlJZkFwcGxpY2FibGUgPSBbJl0geworICAgICAgICAgICAgaWYgKCFs
aW5lQm94Lmhhc0lubGluZUJveCgpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
ICAgIFZlY3Rvcjxjb25zdCBCb3gqPiBsYXlvdXRCb3hMaXN0OworICAgICAgICAgICAgLy8gQ29s
bGVjdCB0aGUgZW1wdHkgaW5saW5lIGJveGVzIHRoYXQgc2hvd2VkIHVwIGZpcnN0IG9uIHRoaXMg
bGluZS4KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBhbiBpbmxpbmUgYm94IGVuZCBvbiBhbiBl
bXB0eSBsaW5lIGRvZXMgbm90IG1ha2UgdGhlIGlubGluZSBib3ggdGFsbGVyLgorICAgICAgICAg
ICAgLy8gKGUuZy4gPGRpdj50ZXh0PHNwYW4+PGJyPjwvc3Bhbj48L2Rpdj4pIDwtIHRoZSA8c3Bh
bj4gaW5saW5lIGJveCBpcyBhcyB0YWxsIGFzIHRoZSBsaW5lIGV2ZW4gdGhvdWdoIHRoZSA8L3Nw
YW4+IGlzIGFmdGVyIGEgPGJyPiBzbyB0ZWNobmljYWxseSBpcyBvbiB0aGUgZm9sbG93aW5nIChl
bXB0eSlsaW5lLgorICAgICAgICAgICAgZm9yIChhdXRvJiBsaW5lUnVuIDogbGluZUNvbnRlbnQu
cnVucykgeworICAgICAgICAgICAgICAgIGlmIChsaW5lUnVuLmlzSW5saW5lQm94U3RhcnQoKSkK
KyAgICAgICAgICAgICAgICAgICAgbGF5b3V0Qm94TGlzdC5hcHBlbmQoJmxpbmVSdW4ubGF5b3V0
Qm94KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChhdXRvKiBsYXlvdXRCb3gg
OiBsYXlvdXRCb3hMaXN0KSB7CisgICAgICAgICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBm
b3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkoKmxheW91dEJveCk7CisgICAgICAgICAgICAgICAg
YXV0byBpbmxpbmVCb3hMb2dpY2FsSGVpZ2h0ID0gTGF5b3V0VW5pdDo6ZnJvbUZsb2F0Q2VpbChs
aW5lQm94LmxvZ2ljYWxCb3JkZXJCb3hGb3JJbmxpbmVCb3goKmxheW91dEJveCwgYm94R2VvbWV0
cnkpLmhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94
SGVpZ2h0KGlubGluZUJveExvZ2ljYWxIZWlnaHQpOworICAgICAgICAgICAgICAgIGJveEdlb21l
dHJ5LnNldENvbnRlbnRCb3hXaWR0aCh7IH0pOworICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5
LnNldExvZ2ljYWxUb3BMZWZ0KHRvTGF5b3V0UG9pbnQobGluZUJveExvZ2ljYWxSZWN0LnRvcExl
ZnQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB1cGRhdGVJbmxpbmVC
b3hlc0dlb21ldHJ5SWZBcHBsaWNhYmxlKCk7CisgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRM
aW5lKHsgbGluZUJveExvZ2ljYWxSZWN0LCB7IHsgfSwgeyB9IH0sIHsgfSwgeyB9LCB7IH0gfSk7
CisgICAgICAgIHJldHVybiBsaW5lQm94TG9naWNhbFJlY3Q7CisgICAgfQorCisgICAgYXV0byBy
b290SW5saW5lQm94TG9naWNhbFJlY3QgPSBsaW5lQm94LmxvZ2ljYWxSZWN0Rm9yUm9vdElubGlu
ZUJveCgpOworICAgIGF1dG8gZW5jbG9zaW5nVG9wQW5kQm90dG9tID0gSW5saW5lTGluZUdlb21l
dHJ5OjpFbmNsb3NpbmdUb3BBbmRCb3R0b20geyByb290SW5saW5lQm94TG9naWNhbFJlY3QudG9w
KCksIHJvb3RJbmxpbmVCb3hMb2dpY2FsUmVjdC5ib3R0b20oKSB9OworICAgIEhhc2hTZXQ8Y29u
c3QgQm94Kj4gaW5saW5lQm94U3RhcnRTZXQ7CisgICAgSGFzaFNldDxjb25zdCBCb3gqPiBpbmxp
bmVCb3hFbmRTZXQ7CisKKyAgICBhdXRvIGNvbnN0cnVjdExpbmVSdW5zQW5kVXBkYXRlQm94R2Vv
bWV0cnkgPSBbJl0geworICAgICAgICAvLyBDcmVhdGUgdGhlIGlubGluZSBydW5zIG9uIHRoZSBj
dXJyZW50IGxpbmUuIFRoaXMgaXMgbW9zdGx5IHRleHQgYW5kIGF0b21pYyBpbmxpbmUgcnVucy4K
KyAgICAgICAgZm9yIChhdXRvJiBsaW5lUnVuIDogbGluZUNvbnRlbnQucnVucykgeworICAgICAg
ICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBub3QgbmVlZCB0byBjb25zdHJ1Y3QgYSBsaW5lIHJ1
biBmb3IgPGJyPi4KKyAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9IGxpbmVSdW4ubGF5b3V0
Qm94KCk7CisgICAgICAgICAgICBpZiAobGluZVJ1bi5pc1RleHQoKSkgeworICAgICAgICAgICAg
ICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gsIGxp
bmVCb3gubG9naWNhbFJlY3RGb3JUZXh0UnVuKGxpbmVSdW4pLCBsaW5lUnVuLmV4cGFuc2lvbigp
LCBsaW5lUnVuLnRleHRDb250ZW50KCkgfSk7CisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZVJ1bi5pc0xpbmVCcmVhaygpKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKGxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKSB7CisgICAgICAg
ICAgICAgICAgICAgIC8vIE9ubHkgaGFyZCBsaW5lYnJlYWtzIGhhdmUgYXNzb2NpYXRlZCBsYXlv
dXQgYm94ZXMuCisgICAgICAgICAgICAgICAgICAgIGF1dG8gbGluZUJyZWFrQm94UmVjdCA9IGxp
bmVCb3gubG9naWNhbFJlY3RGb3JMaW5lQnJlYWtCb3gobGF5b3V0Qm94KTsKKyAgICAgICAgICAg
ICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBsaW5lSW5kZXgsIGxheW91dEJv
eCwgbGluZUJyZWFrQm94UmVjdCwgbGluZVJ1bi5leHBhbnNpb24oKSwgeyB9IH0pOworCisgICAg
ICAgICAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdl
b21ldHJ5KGxheW91dEJveCk7CisgICAgICAgICAgICAgICAgICAgIGxpbmVCcmVha0JveFJlY3Qu
bW92ZUJ5KGxpbmVCb3hMb2dpY2FsUmVjdC50b3BMZWZ0KCkpOworICAgICAgICAgICAgICAgICAg
ICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVmdCh0b0xheW91dFBvaW50KGxpbmVCcmVha0Jv
eFJlY3QudG9wTGVmdCgpKSk7CisgICAgICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENv
bnRlbnRCb3hIZWlnaHQodG9MYXlvdXRVbml0KGxpbmVCcmVha0JveFJlY3QuaGVpZ2h0KCkpKTsK
KyAgICAgICAgICAgICAgICB9IGVsc2UgCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdT
dGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gsIGxpbmVCb3gubG9naWNhbFJl
Y3RGb3JUZXh0UnVuKGxpbmVSdW4pLCBsaW5lUnVuLmV4cGFuc2lvbigpLCBsaW5lUnVuLnRleHRD
b250ZW50KCkgfSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBpZiAobGluZVJ1bi5pc0JveCgpKSB7CisgICAgICAgICAgICAgICAgQVNTRVJU
KGxheW91dEJveC5pc0F0b21pY0lubGluZUxldmVsQm94KCkpOworICAgICAgICAgICAgICAgIGF1
dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7
CisgICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsQm9yZGVyQm94ID0gbGluZUJveC5sb2dpY2Fs
Qm9yZGVyQm94Rm9yQXRvbWljSW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94LCBib3hHZW9tZXRyeSk7
CisgICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBsaW5lSW5kZXgs
IGxheW91dEJveCwgbG9naWNhbEJvcmRlckJveCwgbGluZVJ1bi5leHBhbnNpb24oKSwgeyB9IH0p
OworCisgICAgICAgICAgICAgICAgYXV0byBib3JkZXJCb3hMb2dpY2FsVG9wTGVmdCA9IGxvZ2lj
YWxCb3JkZXJCb3gudG9wTGVmdCgpOworICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBpbmxp
bmUgYm94ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBsaW5lIGFuZCB0aGVpciB0b3AgcG9zaXRpb24g
Y2FuIGJlIG5lZ2F0aXZlLgorICAgICAgICAgICAgICAgIGJvcmRlckJveExvZ2ljYWxUb3BMZWZ0
Lm1vdmVCeShsaW5lQm94TG9naWNhbFJlY3QudG9wTGVmdCgpKTsKKyAgICAgICAgICAgICAgICBp
ZiAobGF5b3V0Qm94LmlzSW5GbG93UG9zaXRpb25lZCgpKQorICAgICAgICAgICAgICAgICAgICBi
b3JkZXJCb3hMb2dpY2FsVG9wTGVmdCArPSBnZW9tZXRyeS5pbkZsb3dQb3NpdGlvbmVkUG9zaXRp
b25PZmZzZXQobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAgICAgICAg
ICAgIC8vIEF0b21pYyBpbmxpbmUgYm94ZXMgYXJlIGFsbCBzZXQuIFRoZWlyIG1hcmdpbi9ib3Jk
ZXIvY29udGVudCBib3ggZ2VvbWV0cmllcyBhcmUgYWxyZWFkeSBjb21wdXRlZC4gV2UganVzdCBo
YXZlIHRvIHBvc2l0aW9uIHRoZW0gaGVyZS4KKyAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5z
ZXRMb2dpY2FsVG9wTGVmdCh0b0xheW91dFBvaW50KGJvcmRlckJveExvZ2ljYWxUb3BMZWZ0KSk7
CisKKyAgICAgICAgICAgICAgICBhdXRvIGJvcmRlckJveFRvcCA9IGJvcmRlckJveExvZ2ljYWxU
b3BMZWZ0LnkoKTsKKyAgICAgICAgICAgICAgICBhdXRvIGJvcmRlckJveEJvdHRvbSA9IGJvcmRl
ckJveFRvcCArIGJveEdlb21ldHJ5LmJvcmRlckJveEhlaWdodCgpOworICAgICAgICAgICAgICAg
IGVuY2xvc2luZ1RvcEFuZEJvdHRvbS50b3AgPSBzdGQ6Om1pbihlbmNsb3NpbmdUb3BBbmRCb3R0
b20udG9wLCBib3JkZXJCb3hUb3ApOworICAgICAgICAgICAgICAgIGVuY2xvc2luZ1RvcEFuZEJv
dHRvbS5ib3R0b20gPSBzdGQ6Om1heChlbmNsb3NpbmdUb3BBbmRCb3R0b20uYm90dG9tLCBib3Jk
ZXJCb3hCb3R0b20pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKGxpbmVSdW4uaXNJbmxpbmVCb3hTdGFydCgpKSB7CisgICAgICAgICAg
ICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkobGF5
b3V0Qm94KTsKKyAgICAgICAgICAgICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxSZWN0ID0gbGlu
ZUJveC5sb2dpY2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KGxheW91dEJveCwgYm94R2VvbWV0cnkp
OworICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4
LCBsYXlvdXRCb3gsIGlubGluZUJveExvZ2ljYWxSZWN0LCBsaW5lUnVuLmV4cGFuc2lvbigpLCB7
IH0gfSk7CisgICAgICAgICAgICAgICAgaW5saW5lQm94U3RhcnRTZXQuYWRkKCZsYXlvdXRCb3gp
OworICAgICAgICAgICAgICAgIGVuY2xvc2luZ1RvcEFuZEJvdHRvbS50b3AgPSBzdGQ6Om1pbihl
bmNsb3NpbmdUb3BBbmRCb3R0b20udG9wLCBpbmxpbmVCb3hMb2dpY2FsUmVjdC50b3AoKSk7Cisg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAo
bGluZVJ1bi5pc0lubGluZUJveEVuZCgpKSB7CisgICAgICAgICAgICAgICAgaW5saW5lQm94RW5k
U2V0LmFkZCgmbGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICBpZiAoIWlubGluZUJveFN0YXJ0
U2V0LmNvbnRhaW5zKCZsYXlvdXRCb3gpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFuIGlu
bGluZSBib3ggY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMuIFVzZSB0aGUgW2lubGluZSBib3ggZW5k
XSBzaWduYWwgdG8gaW5jbHVkZSBpdCBpbiB0aGUgZW5jbG9zaW5nIGdlb21ldHJ5CisgICAgICAg
ICAgICAgICAgICAgIC8vIG9ubHkgd2hlbiBpdCBzdGFydHMgYXQgYSBwcmV2aW91cyBsaW5lLgor
ICAgICAgICAgICAgICAgICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxSZWN0ID0gbGluZUJveC5s
b2dpY2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KGxheW91dEJveCwgZm9ybWF0dGluZ1N0YXRlLmJv
eEdlb21ldHJ5KGxheW91dEJveCkpOworICAgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdUb3BB
bmRCb3R0b20uYm90dG9tID0gc3RkOjptYXgoZW5jbG9zaW5nVG9wQW5kQm90dG9tLmJvdHRvbSwg
aW5saW5lQm94TG9naWNhbFJlY3QuYm90dG9tKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVChs
aW5lUnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7CisgICAgICAgIH0KKyAgICB9OworICAg
IGNvbnN0cnVjdExpbmVSdW5zQW5kVXBkYXRlQm94R2VvbWV0cnkoKTsKKworICAgIGF1dG8gdXBk
YXRlQm94R2VvbWV0cnlGb3JJbmxpbmVCb3hlcyA9IFsmXSB7CisgICAgICAgIC8vIEZJWE1FOiBX
ZSBtYXkgd2FudCB0byBrZWVwIGFyb3VuZCBhbiBpbmxpbmUgYm94IG9ubHkgc2V0LgorICAgICAg
ICBpZiAoIWxpbmVCb3guaGFzSW5saW5lQm94KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIC8vIEdyYWIgdGhlIGlubGluZSBib3hlcyAoZXZlbiB0aG9zZSB0aGF0IGRvbid0IGhhdmUg
YXNzb2NpYXRlZCBsYXlvdXQgYm94ZXMgb24gdGhlIGN1cnJlbnQgbGluZSBkdWUgdG8gbGluZSB3
cmFwcGluZykKKyAgICAgICAgLy8gYW5kIHVwZGF0ZSB0aGVpciBnZW9tZXRyaWVzLgorICAgICAg
ICBmb3IgKGF1dG8mIGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxC
b3hlcygpKSB7CisgICAgICAgICAgICBpZiAoIWlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkp
CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3gg
PSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKKyAgICAgICAgICAgIGF1dG8mIGJveEdlb21l
dHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7CisgICAgICAgICAg
ICAvLyBJbmxpbmUgYm94ZXMgbWF5IG9yIG1heSBub3QgYmUgd3JhcHBlZCBhbmQgaGF2ZSBydW5z
IG9uIG11bHRpcGxlIGxpbmVzIChlLmcuIDxzcGFuPmZpcnN0IGxpbmU8YnI+c2Vjb25kIGxpbmU8
YnI+dGhpcmQgbGluZTwvc3Bhbj4pCisgICAgICAgICAgICBhdXRvIGlubGluZUJveEJvcmRlckJv
eCA9IGxpbmVCb3gubG9naWNhbEJvcmRlckJveEZvcklubGluZUJveChsYXlvdXRCb3gsIGJveEdl
b21ldHJ5KTsKKyAgICAgICAgICAgIGF1dG8gaW5saW5lQm94U2l6ZSA9IExheW91dFNpemUgeyBM
YXlvdXRVbml0Ojpmcm9tRmxvYXRDZWlsKGlubGluZUJveEJvcmRlckJveC53aWR0aCgpKSwgTGF5
b3V0VW5pdDo6ZnJvbUZsb2F0Q2VpbChpbmxpbmVCb3hCb3JkZXJCb3guaGVpZ2h0KCkpIH07Cisg
ICAgICAgICAgICBhdXRvIGxvZ2ljYWxSZWN0ID0gUmVjdCB7IExheW91dFBvaW50IHsgaW5saW5l
Qm94Qm9yZGVyQm94LnRvcExlZnQoKSB9LCBpbmxpbmVCb3hTaXplIH07CisgICAgICAgICAgICBs
b2dpY2FsUmVjdC5tb3ZlQnkoTGF5b3V0UG9pbnQgeyBsaW5lQm94TG9naWNhbFJlY3QudG9wTGVm
dCgpIH0pOworICAgICAgICAgICAgaWYgKGlubGluZUJveFN0YXJ0U2V0LmNvbnRhaW5zKCZsYXlv
dXRCb3gpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpbmxpbmUgYm94IHNob3dlZCB1cCBm
aXJzdCBvbiB0aGlzIGxpbmUuCisgICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNh
bFRvcExlZnQobG9naWNhbFJlY3QudG9wTGVmdCgpKTsKKyAgICAgICAgICAgICAgICBhdXRvIGNv
bnRlbnRCb3hIZWlnaHQgPSBsb2dpY2FsUmVjdC5oZWlnaHQoKSAtIChib3hHZW9tZXRyeS52ZXJ0
aWNhbEJvcmRlcigpICsgYm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwX2x1
KSk7CisgICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodChjb250
ZW50Qm94SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBhdXRvIGNvbnRlbnRCb3hXaWR0aCA9IGxv
Z2ljYWxSZWN0LndpZHRoKCkgLSAoYm94R2VvbWV0cnkuaG9yaXpvbnRhbEJvcmRlcigpICsgYm94
R2VvbWV0cnkuaG9yaXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKTsKKyAgICAgICAgICAg
ICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudEJveFdpZHRoKTsKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE1p
ZGRsZSBvciBlbmQgb2YgdGhlIGlubGluZSBib3guIExldCdzIHN0cmV0Y2ggdGhlIGJveCBhcyBu
ZWVkZWQuCisgICAgICAgICAgICBhdXRvIGVuY2xvc2luZ0JvcmRlckJveFJlY3QgPSBCb3hHZW9t
ZXRyeTo6Ym9yZGVyQm94UmVjdChib3hHZW9tZXRyeSk7CisgICAgICAgICAgICBlbmNsb3NpbmdC
b3JkZXJCb3hSZWN0LmV4cGFuZFRvQ29udGFpbihsb2dpY2FsUmVjdCk7CisgICAgICAgICAgICBi
b3hHZW9tZXRyeS5zZXRMb2dpY2FsTGVmdChlbmNsb3NpbmdCb3JkZXJCb3hSZWN0LmxlZnQoKSk7
CisKKyAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoZW5jbG9zaW5n
Qm9yZGVyQm94UmVjdC5oZWlnaHQoKSAtIChib3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsg
Ym94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KSkpOworICAgICAgICAg
ICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGVuY2xvc2luZ0JvcmRlckJveFJlY3Qu
d2lkdGgoKSAtIChib3hHZW9tZXRyeS5ob3Jpem9udGFsQm9yZGVyKCkgKyBib3hHZW9tZXRyeS5o
b3Jpem9udGFsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpKTsKKyAgICAgICAgfQorICAgIH07Cisg
ICAgdXBkYXRlQm94R2VvbWV0cnlGb3JJbmxpbmVCb3hlcygpOworCisgICAgYXV0byBjb25zdHJ1
Y3RMaW5lR2VvbWV0cnkgPSBbJl0geworICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZSh7
IGxpbmVCb3hMb2dpY2FsUmVjdCwgZW5jbG9zaW5nVG9wQW5kQm90dG9tLCBsaW5lQm94LmFsaWdu
bWVudEJhc2VsaW5lKCksIHJvb3RJbmxpbmVCb3hMb2dpY2FsUmVjdC5sZWZ0KCksIGxpbmVDb250
ZW50LmNvbnRlbnRMb2dpY2FsV2lkdGggfSk7CisgICAgfTsKKyAgICBjb25zdHJ1Y3RMaW5lR2Vv
bWV0cnkoKTsKKworICAgIHJldHVybiBsaW5lQm94TG9naWNhbFJlY3Q7Cit9CisKK3ZvaWQgSW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQ6OmludmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoY29uc3QgSW52
YWxpZGF0aW9uU3RhdGUmKQoreworICAgIC8vIEZpbmQgb3V0IHdoYXQgd2UgbmVlZCB0byBpbnZh
bGlkYXRlLiBUaGlzIGlzIHdoZXJlIHdlIGFkZCBzb21lIHNtYXJ0cyB0byBkbyBwYXJ0aWFsIGxp
bmUgbGF5b3V0LgorICAgIC8vIEZvciBub3cgbGV0J3MganVzdCBjbGVhciB0aGUgcnVucy4KKyAg
ICBmb3JtYXR0aW5nU3RhdGUoKS5jbGVhckxpbmVBbmRSdW5zKCk7CisgICAgLy8gRklYTUU6IFRo
aXMgaXMgYWxzbyB3aGVyZSB3ZSB3b3VsZCBkZWxldGUgaW5saW5lIGl0ZW1zIGlmIHRoZWlyIGNv
bnRlbnQgY2hhbmdlZC4KK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVG
b3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250
ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uYWQ3ZWM5NzIzN2MxZTg4ZDc4ODYwMjY3YTE4MDdlMjA0OGFmNDMyZQotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9y
bWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09O
VEVYVCkKKworI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiSW5saW5l
TGluZUJ1aWxkZXIuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBJbmxpbmVGb3JtYXR0aW5nU3Rh
dGU7CitjbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKK2NsYXNzIExpbmVCb3g7CisKKy8vIFRoaXMg
Y2xhc3MgaW1wbGVtZW50cyB0aGUgbGF5b3V0IGxvZ2ljIGZvciBpbmxpbmUgZm9ybWF0dGluZyBj
b250ZXh0cy4KKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi92aXN1cmVuLmh0bWwjaW5s
aW5lLWZvcm1hdHRpbmcKK2NsYXNzIElubGluZUZvcm1hdHRpbmdDb250ZXh0IGZpbmFsIDogcHVi
bGljIEZvcm1hdHRpbmdDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKElubGlu
ZUZvcm1hdHRpbmdDb250ZXh0KTsKK3B1YmxpYzoKKyAgICBJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgSW5saW5lRm9ybWF0
dGluZ1N0YXRlJik7CisgICAgdm9pZCBsYXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0
YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jikgb3ZlcnJpZGU7CisgICAg
TGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgY2xh
c3MgUXVpcmtzIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgeworICAgIHB1Ymxp
YzoKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBpbml0aWFsTGluZUhlaWdodCgpIGNvbnN0Owor
ICAgICAgICBib29sIGhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdlKCkgY29uc3Q7CisgICAg
ICAgIGJvb2wgaW5saW5lTGV2ZWxCb3hBZmZlY3RzTGluZUJveChjb25zdCBMaW5lQm94OjpJbmxp
bmVMZXZlbEJveCYsIGNvbnN0IExpbmVCb3gmKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAg
ICAgIGZyaWVuZCBjbGFzcyBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKKyAgICAgICAgUXVpcmtz
KGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Jik7CisKKyAgICAgICAgY29uc3QgSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93
bmNhc3Q8SW5saW5lRm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6
OmZvcm1hdHRpbmdDb250ZXh0KCkpOyB9CisKKyAgICB9OworICAgIElubGluZUZvcm1hdHRpbmdD
b250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4gUXVpcmtzKCp0aGlzKTsgfQor
CisgICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25z
dCB7IHJldHVybiBkb3duY2FzdDxJbmxpbmVGb3JtYXR0aW5nU3RhdGU+KEZvcm1hdHRpbmdDb250
ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KKyAgICBJbmxpbmVGb3JtYXR0aW5nU3RhdGUmIGZv
cm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIGRvd25jYXN0PElubGluZUZvcm1hdHRpbmdTdGF0ZT4o
Rm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQorCisgICAgdm9pZCBsaW5l
TGF5b3V0Rm9ySW50ZXJncmF0aW9uKEludmFsaWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWlu
dHNGb3JJbkZsb3dDb250ZW50Jik7CisKK3ByaXZhdGU6CisgICAgSW50cmluc2ljV2lkdGhDb25z
dHJhaW50cyBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSBvdmVycmlkZTsKKwor
ICAgIGNsYXNzIEdlb21ldHJ5IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSB7
CisgICAgcHVibGljOgorICAgICAgICBMaW5lQm94IGxpbmVCb3hGb3JMaW5lQ29udGVudChjb25z
dCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmKTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBs
b2dpY2FsVG9wRm9yTmV4dExpbmUoY29uc3QgTGluZUJ1aWxkZXI6OkxpbmVDb250ZW50JiwgSW5s
aW5lTGF5b3V0VW5pdCBwcmV2aW91c0xpbmVMb2dpY2FsQm90dG9tLCBjb25zdCBGbG9hdGluZ0Nv
bnRleHQmKSBjb25zdDsKKworICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGlubGluZUJs
b2NrQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29u
c3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKSBjb25zdDsKKyAgICAg
ICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGlubGluZUJsb2NrQ29udGVudFdpZHRoQW5kTWFyZ2lu
KGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRk
ZW5Ib3Jpem9udGFsVmFsdWVzJik7CisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgY2xh
c3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7CisgICAgICAgIEdlb21ldHJ5KGNvbnN0IElubGlu
ZUZvcm1hdHRpbmdDb250ZXh0Jik7CisKKyAgICAgICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8SW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Zm9ybWF0dGlu
Z0NvbnRleHQoKSk7IH0KKworICAgIH07CisgICAgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMpOyB9CisKKyAg
ICB2b2lkIGxpbmVMYXlvdXQoSW5saW5lSXRlbXMmLCBMaW5lQnVpbGRlcjo6SW5saW5lSXRlbVJh
bmdlLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsKKworICAgIHZvaWQgY29t
cHV0ZUludHJpbnNpY1dpZHRoRm9yRm9ybWF0dGluZ1Jvb3QoY29uc3QgQm94Jik7CisgICAgSW5s
aW5lTGF5b3V0VW5pdCBjb21wdXRlZEludHJpbnNpY1dpZHRoRm9yQ29uc3RyYWludChJbmxpbmVM
YXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKSBjb25zdDsKKworICAgIHZvaWQgY29tcHV0ZUhvcml6
b250YWxNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7Cisg
ICAgdm9pZCBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYpOworICAgIHZvaWQgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKGNvbnN0IEJv
eCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOworCisgICAgdm9pZCBjb2xsZWN0SW5s
aW5lQ29udGVudElmTmVlZGVkKCk7CisgICAgSW5saW5lUmVjdCBjb21wdXRlR2VvbWV0cnlGb3JM
aW5lQ29udGVudChjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmLCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmKTsKKyAgICB2b2lkIGludmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoY29u
c3QgSW52YWxpZGF0aW9uU3RhdGUmKTsKK307CisKK2lubGluZSBJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6Okdlb21ldHJ5KGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBp
bmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICA6IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRy
eShpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworaW5saW5lIElubGluZUZvcm1hdHRp
bmdDb250ZXh0OjpRdWlya3M6OlF1aXJrcyhjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYg
aW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtz
KGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQoreworfQorCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQ
RV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dCwgaXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9J
bmxpbmVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dEdlb21ldHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iMjRlNzg4MzMzODBmYjRjYzIwNTEzNTlhMzZi
NTA0OTU0OWI5YWQwCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0
R2VvbWV0cnkuY3BwCkBAIC0wLDAgKzEsNzI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
CisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFC
TEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4
dC5oIgorI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiSW5saW5lTGlu
ZUJveC5oIgorI2luY2x1ZGUgIkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5l
ckJveC5oIgorI2luY2x1ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCisjaW5jbHVkZSAiTGVuZ3Ro
RnVuY3Rpb25zLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgewor
CitjbGFzcyBMaW5lQm94QnVpbGRlciB7CitwdWJsaWM6CisgICAgTGluZUJveEJ1aWxkZXIoY29u
c3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmKTsKKyAgICBMaW5lQm94IGJ1aWxkKGNvbnN0IExp
bmVCdWlsZGVyOjpMaW5lQ29udGVudCYpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBTaW1wbGlm
aWVkVmVydGljYWxBbGlnbm1lbnQgeworICAgICAgICBTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1l
bnQoY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gpOworCisgICAg
ICAgIHN0YXRpYyBib29sIGNhblVzZVNpbXBsaWZpZWRBbGlnbm1lbnQoY29uc3QgTGluZUJveDo6
SW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gsIGNvbnN0IExpbmVCb3g6OklubGluZUxldmVs
Qm94JiwgT3B0aW9uYWw8Y29uc3QgQm94R2VvbWV0cnk+IGlubGluZUxldmVsQm94R2VvbWV0cnkp
OworCisgICAgICAgIHZvaWQgYWxpZ24oTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmKTsKKworICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IHJvb3RJbmxpbmVCb3hMb2dpY2FsVG9wKCkgY29uc3QgeyBy
ZXR1cm4gbV9yb290SW5saW5lQm94TG9naWNhbFRvcDsgfQorICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IGxpbmVCb3hIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hMb2dpY2FsQm90dG9t
IC0gbV9saW5lQm94TG9naWNhbFRvcDsgfQorCisgICAgICAgIHZvaWQgc2V0RW5hYmxlZChib29s
IGVuYWJsZWQpIHsgbV9pc0VuYWJsZWQgPSBlbmFibGVkOyB9CisgICAgICAgIGJvb2wgaXNFbmFi
bGVkKCkgY29uc3QgeyByZXR1cm4gbV9pc0VuYWJsZWQ7IH0KKworICAgIHByaXZhdGU6CisgICAg
ICAgIHZvaWQgYWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94Jik7CisKKyAgICAg
ICAgY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIG1fcm9vdElubGluZUJveDsKKyAgICAg
ICAgYm9vbCBtX2lzRW5hYmxlZCB7IHRydWUgfTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBt
X2xpbmVCb3hMb2dpY2FsVG9wIHsgMCB9OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fbGlu
ZUJveExvZ2ljYWxCb3R0b20geyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9yb290
SW5saW5lQm94TG9naWNhbFRvcCB7IDAgfTsKKyAgICB9OworCisgICAgdm9pZCBzZXRWZXJ0aWNh
bEdlb21ldHJ5Rm9ySW5saW5lQm94KExpbmVCb3g6OklubGluZUxldmVsQm94JikgY29uc3Q7Cisg
ICAgdm9pZCBjb25zdHJ1Y3RBbmRBbGlnbklubGluZUxldmVsQm94ZXMoTGluZUJveCYsIGNvbnN0
IExpbmU6OlJ1bkxpc3QmKTsKKyAgICB2b2lkIGNvbXB1dGVMaW5lQm94SGVpZ2h0QW5kQWxpZ25J
bmxpbmVMZXZlbEJveGVzVmVydGljYWxseShMaW5lQm94Jik7CisKKyAgICBjb25zdCBJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2lu
bGluZUZvcm1hdHRpbmdDb250ZXh0OyB9CisgICAgY29uc3QgQm94JiByb290Qm94KCkgY29uc3Qg
eyByZXR1cm4gZm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCk7IH0KKyAgICBMYXlvdXRTdGF0ZSYg
bGF5b3V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmxheW91dFN0
YXRlKCk7IH0KKworICAgIGJvb2wgaXNSb290TGF5b3V0Qm94KGNvbnN0IENvbnRhaW5lckJveCYg
Y29udGFpbmVyQm94KSBjb25zdCB7IHJldHVybiAmY29udGFpbmVyQm94ID09ICZyb290Qm94KCk7
IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgbV9pbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDsKK307CisKK3N0cnVjdCBIYW5naW5nVHJhaWxpbmdXaGl0ZXNw
YWNlQ29udGVudCB7CitwdWJsaWM6CisgICAgdm9pZCByZXNldCgpOworCisgICAgSW5saW5lTGF5
b3V0VW5pdCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fd2lkdGg7IH0KKyAgICBib29sIGlzQ29u
ZGl0aW9uYWwoKSBjb25zdCB7IHJldHVybiBtX2lzQ29uZGl0aW9uYWw7IH0KKworICAgIHZvaWQg
c2V0SXNDb25kaXRpb25hbCgpIHsgbV9pc0NvbmRpdGlvbmFsID0gdHJ1ZTsgfQorICAgIHZvaWQg
ZXhwYW5kKElubGluZUxheW91dFVuaXQgd2lkdGgpIHsgbV93aWR0aCArPSB3aWR0aDsgfQorCitw
cml2YXRlOgorICAgIGJvb2wgbV9pc0NvbmRpdGlvbmFsIHsgZmFsc2UgfTsKKyAgICBJbmxpbmVM
YXlvdXRVbml0IG1fd2lkdGggeyAwIH07Cit9OworCit2b2lkIEhhbmdpbmdUcmFpbGluZ1doaXRl
c3BhY2VDb250ZW50OjpyZXNldCgpCit7CisgICAgbV9pc0NvbmRpdGlvbmFsID0gZmFsc2U7Cisg
ICAgbV93aWR0aCA9ICAwOworfQorCitzdGF0aWMgSGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNv
bnRlbnQgY29sbGVjdEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50KGNvbnN0IExpbmU6
OlJ1bkxpc3QmIHJ1bnMsIGJvb2wgaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KQoreworICAg
IGF1dG8gaGFuZ2luZ0NvbnRlbnQgPSBIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVudCB7
IH07CisgICAgaWYgKGlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudCkKKyAgICAgICAgaGFuZ2lu
Z0NvbnRlbnQuc2V0SXNDb25kaXRpb25hbCgpOworICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjpt
YWtlUmV2ZXJzZWRSYW5nZShydW5zKSkgeworICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94U3Rh
cnQoKSB8fCBydW4uaXNJbmxpbmVCb3hFbmQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICBpZiAocnVuLmlzTGluZUJyZWFrKCkpIHsKKyAgICAgICAgICAgIGhhbmdpbmdDb250ZW50
LnNldElzQ29uZGl0aW9uYWwoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9Cisg
ICAgICAgIGlmICghcnVuLmhhc1RyYWlsaW5nV2hpdGVzcGFjZSgpKQorICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBwcmVzZXJ2ZWQgb3IgaHVuZyB3aGl0
ZXNwYWNlLgorICAgICAgICBpZiAocnVuLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9IFdoaXRlU3Bh
Y2U6OlByZVdyYXApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gVGhpcyBpcyBlaXRo
ZXIgYSBub3JtYWwgb3IgY29uZGl0aW9uYWxseSBoYW5naW5nIHRyYWlsaW5nIHdoaXRlc3BhY2Uu
CisgICAgICAgIGhhbmdpbmdDb250ZW50LmV4cGFuZChydW4udHJhaWxpbmdXaGl0ZXNwYWNlV2lk
dGgoKSk7CisgICAgfQorICAgIHJldHVybiBoYW5naW5nQ29udGVudDsKK30KKworc3RhdGljIE9w
dGlvbmFsPElubGluZUxheW91dFVuaXQ+IGhvcml6b250YWxBbGlnbm1lbnRPZmZzZXQoY29uc3Qg
TGluZTo6UnVuTGlzdCYgcnVucywgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24sIElubGluZUxheW91
dFVuaXQgbGluZUxvZ2ljYWxXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdp
ZHRoLCBib29sIGlzTGFzdExpbmUpCit7CisgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGxpbmVM
b2dpY2FsV2lkdGggLSBjb250ZW50TG9naWNhbFdpZHRoOworICAgIGF1dG8gaGFuZ2luZ1RyYWls
aW5nV2hpdGVzcGFjZUNvbnRlbnQgPSBjb2xsZWN0SGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNv
bnRlbnQocnVucywgaXNMYXN0TGluZSk7CisgICAgYXZhaWxhYmxlV2lkdGggKz0gaGFuZ2luZ1Ry
YWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQud2lkdGgoKTsKKyAgICBpZiAoYXZhaWxhYmxlV2lkdGgg
PD0gMCkKKyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFs
QWxpZ25tZW50ID0gWyZdIHsKKyAgICAgICAgaWYgKHRleHRBbGlnbiAhPSBUZXh0QWxpZ25Nb2Rl
OjpKdXN0aWZ5KQorICAgICAgICAgICAgcmV0dXJuIHRleHRBbGlnbjsKKyAgICAgICAgLy8gVGV4
dCBpcyBqdXN0aWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBtZXRob2Qgc3BlY2lmaWVkIGJ5IHRoZSB0
ZXh0LWp1c3RpZnkgcHJvcGVydHksCisgICAgICAgIC8vIGluIG9yZGVyIHRvIGV4YWN0bHkgZmls
bCB0aGUgbGluZSBib3guIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRleHQtYWxpZ24t
bGFzdCwKKyAgICAgICAgLy8gdGhlIGxhc3QgbGluZSBiZWZvcmUgYSBmb3JjZWQgYnJlYWsgb3Ig
dGhlIGVuZCBvZiB0aGUgYmxvY2sgaXMgc3RhcnQtYWxpZ25lZC4KKyAgICAgICAgaWYgKGlzTGFz
dExpbmUgfHwgKCFydW5zLmlzRW1wdHkoKSAmJiBydW5zLmxhc3QoKS5pc0xpbmVCcmVhaygpKSkK
KyAgICAgICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpTdGFydDsKKyAgICAgICAgcmV0dXJu
IFRleHRBbGlnbk1vZGU6Okp1c3RpZnk7CisgICAgfTsKKworICAgIHN3aXRjaCAoY29tcHV0ZWRI
b3Jpem9udGFsQWxpZ25tZW50KCkpIHsKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OkxlZnQ6Cisg
ICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRMZWZ0OgorICAgIGNhc2UgVGV4dEFsaWduTW9k
ZTo6U3RhcnQ6CisgICAgICAgIHJldHVybiB7IH07CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpS
aWdodDoKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0OgorICAgIGNhc2UgVGV4
dEFsaWduTW9kZTo6RW5kOgorICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgY2Fz
ZSBUZXh0QWxpZ25Nb2RlOjpDZW50ZXI6CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRD
ZW50ZXI6CisgICAgICAgIHJldHVybiBhdmFpbGFibGVXaWR0aCAvIDI7CisgICAgY2FzZSBUZXh0
QWxpZ25Nb2RlOjpKdXN0aWZ5OgorICAgICAgICAvLyBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5IGlz
IGEgcnVuIGFsaWdubWVudCAoYW5kIHdlIG9ubHkgZG8gaW5saW5lIGJveCBhbGlnbm1lbnQgaGVy
ZSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9U
X0lNUExFTUVOVEVEX1lFVCgpOworICAgICAgICByZXR1cm4geyB9OworICAgIH0KKyAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4geyB9OworfQorCitMaW5lQm94QnVpbGRlcjo6
TGluZUJveEJ1aWxkZXIoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1h
dHRpbmdDb250ZXh0KQorICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dCkKK3sKK30KKworTGluZUJveCBMaW5lQm94QnVpbGRlcjo6YnVpbGQoY29u
c3QgTGluZUJ1aWxkZXI6OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCkKK3sKKyAgICBhdXRvJiBy
dW5zID0gbGluZUNvbnRlbnQucnVuczsKKyAgICBhdXRvIGxpbmVMb2dpY2FsV2lkdGggPSBsaW5l
Q29udGVudC5saW5lTG9naWNhbFdpZHRoOworICAgIGF1dG8gY29udGVudExvZ2ljYWxXaWR0aCA9
IGxpbmVDb250ZW50LmNvbnRlbnRMb2dpY2FsV2lkdGg7CisgICAgYXV0byBob3Jpem9udGFsQWxp
Z25tZW50T2Zmc2V0ID0gTGF5b3V0Ojpob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0KHJ1bnMsIHJv
b3RCb3goKS5zdHlsZSgpLnRleHRBbGlnbigpLCBsaW5lTG9naWNhbFdpZHRoLCBjb250ZW50TG9n
aWNhbFdpZHRoLCBsaW5lQ29udGVudC5pc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQpOworICAg
IGF1dG8gbGluZUJveCA9IExpbmVCb3ggeyByb290Qm94KCksIGxpbmVDb250ZW50LmxvZ2ljYWxU
b3BMZWZ0LCBsaW5lTG9naWNhbFdpZHRoLCBob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0LnZhbHVl
T3IoSW5saW5lTGF5b3V0VW5pdCB7IH0pLCBjb250ZW50TG9naWNhbFdpZHRoLCBsaW5lQ29udGVu
dC5ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQgfTsKKyAgICBjb25zdHJ1Y3RBbmRBbGln
bklubGluZUxldmVsQm94ZXMobGluZUJveCwgcnVucyk7CisgICAgcmV0dXJuIGxpbmVCb3g7Cit9
CisKK3ZvaWQgTGluZUJveEJ1aWxkZXI6OnNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3go
TGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94KSBjb25zdAoreworICAgIEFT
U0VSVChpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpIHx8IGlubGluZUxldmVsQm94LmlzTGlu
ZUJyZWFrQm94KCkpOworICAgIGF1dG8mIGZvbnRNZXRyaWNzID0gaW5saW5lTGV2ZWxCb3guc3R5
bGUoKS5mb250TWV0cmljcygpOworICAgIElubGluZUxheW91dFVuaXQgYXNjZW50ID0gZm9udE1l
dHJpY3MuYXNjZW50KCk7CisgICAgSW5saW5lTGF5b3V0VW5pdCBkZXNjZW50ID0gZm9udE1ldHJp
Y3MuZGVzY2VudCgpOworICAgIGF1dG8gbG9naWNhbEhlaWdodCA9IGFzY2VudCArIGRlc2NlbnQ7
CisgICAgLy8gV2UgbmVlZCBmbG9vci9jZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlvdXQgaW50ZWdy
YWwgcG9zaXRpb25pbmcuCisgICAgaW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUoZmxvb3JmKGFz
Y2VudCkpOworICAgIGlubGluZUxldmVsQm94LnNldERlc2NlbnQoY2VpbChkZXNjZW50KSk7Cisg
ICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KTsKKworICAg
IC8vIEZJWE1FOiBBZGp1c3QgbGF5b3V0IGJvdW5kcyB3aXRoIGZhbGxiYWNrIGZvbnQgd2hlbiBh
cHBsaWNhYmxlLgorICAgIGF1dG8mIHN0eWxlID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCku
c3R5bGUoKTsKKyAgICBhdXRvIGxpbmVIZWlnaHQgPSBzdHlsZS5saW5lSGVpZ2h0KCk7CisgICAg
aWYgKGxpbmVIZWlnaHQuaXNOZWdhdGl2ZSgpKSB7CisgICAgICAgIC8vIElmIGxpbmUtaGVpZ2h0
IGNvbXB1dGVzIHRvIG5vcm1hbCBhbmQgZWl0aGVyIHRleHQtZWRnZSBpcyBsZWFkaW5nIG9yIHRo
aXMgaXMgdGhlIHJvb3QgaW5saW5lIGJveCwKKyAgICAgICAgLy8gdGhlIGZvbnTigJlzIGxpbmUg
Z2FwIG1ldHJpYyBtYXkgYWxzbyBiZSBpbmNvcnBvcmF0ZWQgaW50byBBIGFuZCBEIGJ5IGFkZGlu
ZyBoYWxmIHRvIGVhY2ggc2lkZSBhcyBoYWxmLWxlYWRpbmcuCisgICAgICAgIC8vIGh0dHBzOi8v
d3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2lubGluZS1oZWlnaHQKKyAgICAgICAgLy8gU2lu
Y2UgdGV4dC1lZGdlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSBp
cyBsZWFkaW5nLCB3ZSBzaG91bGQganVzdCBhcHBseSBpdCB0bworICAgICAgICAvLyBhbGwgaW5s
aW5lIGJveGVzLgorICAgICAgICBhdXRvIGhhbGZMaW5lR2FwID0gKGZvbnRNZXRyaWNzLmxpbmVT
cGFjaW5nKCkgLSBsb2dpY2FsSGVpZ2h0KSAvIDI7CisgICAgICAgIGFzY2VudCArPSBoYWxmTGlu
ZUdhcDsKKyAgICAgICAgZGVzY2VudCArPSBoYWxmTGluZUdhcDsKKyAgICB9IGVsc2UgeworICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IGxpbmVIZWlnaHQgPSBzdHlsZS5jb21wdXRlZExpbmVIZWln
aHQoKTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBoYWxmTGVhZGluZyA9IChsaW5lSGVpZ2h0
IC0gKGFzY2VudCArIGRlc2NlbnQpKSAvIDI7CisgICAgICAgIGFzY2VudCArPSBoYWxmTGVhZGlu
ZzsKKyAgICAgICAgZGVzY2VudCArPSBoYWxmTGVhZGluZzsKKyAgICB9CisgICAgLy8gV2UgbmVl
ZCBmbG9vci9jZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlvdXQgaW50ZWdyYWwgcG9zaXRpb25pbmcu
CisgICAgaW5saW5lTGV2ZWxCb3guc2V0TGF5b3V0Qm91bmRzKExpbmVCb3g6OklubGluZUxldmVs
Qm94OjpMYXlvdXRCb3VuZHMgeyBmbG9vcmYoYXNjZW50KSwgY2VpbChkZXNjZW50KSB9KTsKK30K
Kwordm9pZCBMaW5lQm94QnVpbGRlcjo6Y29uc3RydWN0QW5kQWxpZ25JbmxpbmVMZXZlbEJveGVz
KExpbmVCb3gmIGxpbmVCb3gsIGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnMpCit7CisgICAgYXV0
byYgcm9vdElubGluZUJveCA9IGxpbmVCb3gucm9vdElubGluZUJveCgpOworICAgIHNldFZlcnRp
Y2FsR2VvbWV0cnlGb3JJbmxpbmVCb3gocm9vdElubGluZUJveCk7CisKKyAgICBhdXRvIHNpbXBs
aWZpZWRWZXJ0aWNhbEFsaWdubWVudCA9IFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudCB7IHJv
b3RJbmxpbmVCb3ggfTsKKyAgICAvLyBGSVhNRTogQWRkIGZhc3QgcGF0aCBzdXBwb3J0IGZvciBs
aW5lLWhlaWdodCBjb250ZW50LgorICAgIHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5zZXRF
bmFibGVkKGxheW91dFN0YXRlKCkuaW5TdGFuZGFyZHNNb2RlKCkgJiYgcm9vdEJveCgpLnN0eWxl
KCkubGluZUhlaWdodCgpLmlzTmVnYXRpdmUoKSk7CisKKyAgICBhdXRvIHNpbXBsaWZpZWRBbGln
blZlcnRpY2FsbHlJZkFwcGxpY2FibGUgPSBbJl0oYXV0byYgaW5saW5lTGV2ZWxCb3gsIE9wdGlv
bmFsPGNvbnN0IEJveEdlb21ldHJ5PiBib3hHZW9tZXRyeSkgeworICAgICAgICBpZiAoIXNpbXBs
aWZpZWRWZXJ0aWNhbEFsaWdubWVudC5pc0VuYWJsZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgaWYgKCFTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OmNhblVzZVNpbXBsaWZp
ZWRBbGlnbm1lbnQocm9vdElubGluZUJveCwgaW5saW5lTGV2ZWxCb3gsIGJveEdlb21ldHJ5KSkg
eworICAgICAgICAgICAgc2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50LnNldEVuYWJsZWQoZmFs
c2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNpbXBsaWZpZWRW
ZXJ0aWNhbEFsaWdubWVudC5hbGlnbihpbmxpbmVMZXZlbEJveCk7CisgICAgfTsKKworICAgIGF1
dG8gY3JlYXRlV3JhcHBlZElubGluZUJveGVzID0gWyZdIHsKKyAgICAgICAgaWYgKHJ1bnMuaXNF
bXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBBbiBpbmxpbmUgYm94IG1h
eSBub3QgbmVjZXNzYXJpbHkgc3RhcnQgb24gdGhlIGN1cnJlbnQgbGluZToKKyAgICAgICAgLy8g
PHNwYW4gaWQ9b3V0ZXI+bGluZSBicmVhazxicj50aGlzIGNvbnRlbnQncyBwYXJlbnQgaW5saW5l
IGJveCgnb3V0ZXInKSA8c3BhbiBpZD1pbm5lcj5zdGFydHMgb24gdGhlIHByZXZpb3VzIGxpbmU8
L3NwYW4+PC9zcGFuPgorICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJl
J3MgYW4gTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggZm9yIGV2ZXJ5IGlubGluZSBib3ggdGhhdCdz
IHByZXNlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgLy8gSW4gbmVzdGluZyBjYXNl
IHdlIG5lZWQgdG8gY3JlYXRlIExpbmVCb3g6OklubGluZUxldmVsQm94ZXMgZm9yIHRoZSBpbmxp
bmUgYm94IGFuY2VzdG9ycy4KKyAgICAgICAgLy8gV2Ugb25seSBoYXZlIHRvIGRvIGl0IG9uIHRo
ZSBmaXJzdCBydW4gYXMgYW55IHN1YnNlcXVlbnQgaW5saW5lIGNvbnRlbnQgaXMgZWl0aGVyIGF0
IHRoZSBzYW1lL2hpZ2hlciBuZXN0aW5nIGxldmVsIG9yCisgICAgICAgIC8vIG5lc3RlZCB3aXRo
IGEgW2lubGluZSBib3ggc3RhcnRdIHJ1bi4KKyAgICAgICAgYXV0byYgZmlyc3RSdW4gPSBydW5z
WzBdOworICAgICAgICBhdXRvJiBmaXJzdFJ1blBhcmVudExheW91dEJveCA9IGZpcnN0UnVuLmxh
eW91dEJveCgpLnBhcmVudCgpOworICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGlzIHRoZSBmb3Jt
YXR0aW5nIHJvb3QsIHdlIGNhbiBzdG9wIGhlcmUuIFRoaXMgaXMgcm9vdCBpbmxpbmUgYm94IGNv
bnRlbnQsIHRoZXJlJ3Mgbm8gbmVzdGluZyBpbmxpbmUgYm94IGZyb20gdGhlIHByZXZpb3VzIGxp
bmUocykKKyAgICAgICAgLy8gdW5sZXNzIHRoZSBpbmxpbmUgYm94IGNsb3NpbmcgaXMgZm9yY2Vk
IG92ZXIgdG8gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgLy8gZS5nLgorICAgICAgICAvLyA8
c3Bhbj5ub3JtYWxseSB0aGUgaW5saW5lIGJveCBjbG9zaW5nIGZvcm1zIGEgY29udGludW91cyBj
b250ZW50PC9zcGFuPgorICAgICAgICAvLyA8c3Bhbj51bmxlc3MgaXQncyBmb3JjZWQgdG8gdGhl
IG5leHQgbGluZTxicj48L3NwYW4+CisgICAgICAgIGF1dG8gZmlyc3RSdW5OZWVkc0lubGluZUJv
eCA9IGZpcnN0UnVuLmlzSW5saW5lQm94RW5kKCk7CisgICAgICAgIGlmICghZmlyc3RSdW5OZWVk
c0lubGluZUJveCAmJiBpc1Jvb3RMYXlvdXRCb3goZmlyc3RSdW5QYXJlbnRMYXlvdXRCb3gpKQor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBWZWN0b3I8Y29uc3QgQm94Kj4gbGF5b3V0Qm94
ZXNXaXRob3V0SW5saW5lQm94ZXM7CisgICAgICAgIGlmIChmaXJzdFJ1bk5lZWRzSW5saW5lQm94
KQorICAgICAgICAgICAgbGF5b3V0Qm94ZXNXaXRob3V0SW5saW5lQm94ZXMuYXBwZW5kKCZmaXJz
dFJ1bi5sYXlvdXRCb3goKSk7CisgICAgICAgIGF1dG8qIGFuY2VzdG9yID0gJmZpcnN0UnVuUGFy
ZW50TGF5b3V0Qm94OworICAgICAgICB3aGlsZSAoIWlzUm9vdExheW91dEJveCgqYW5jZXN0b3Ip
KSB7CisgICAgICAgICAgICBsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVCb3hlcy5hcHBlbmQoYW5j
ZXN0b3IpOworICAgICAgICAgICAgYW5jZXN0b3IgPSAmYW5jZXN0b3ItPnBhcmVudCgpOworICAg
ICAgICB9CisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgbWlzc2luZyBMaW5lQm94OjpJbmxpbmVC
b3hlcyBzdGFydGluZyB3aXRoIHRoZSB0b3Btb3N0IGxheW91dCBib3guCisgICAgICAgIGZvciAo
YXV0byogbGF5b3V0Qm94IDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShsYXlvdXRCb3hlc1dpdGhv
dXRJbmxpbmVCb3hlcykpIHsKKyAgICAgICAgICAgIGF1dG8gaW5saW5lQm94ID0gTGluZUJveDo6
SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUlubGluZUJveCgqbGF5b3V0Qm94LCByb290SW5saW5lQm94
LmxvZ2ljYWxMZWZ0KCksIGxpbmVCb3guY29udGVudExvZ2ljYWxXaWR0aCgpKTsKKyAgICAgICAg
ICAgIHNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3goaW5saW5lQm94KTsKKyAgICAgICAg
ICAgIHNpbXBsaWZpZWRBbGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUoaW5saW5lQm94LCB7IH0p
OworICAgICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChXVEZNb3ZlKGlubGluZUJv
eCkpOworICAgICAgICB9CisgICAgfTsKKyAgICBjcmVhdGVXcmFwcGVkSW5saW5lQm94ZXMoKTsK
KworICAgIGF1dG8gbGluZUhhc0NvbnRlbnQgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8mIHJ1biA6
IHJ1bnMpIHsKKyAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gcnVuLmxheW91dEJveCgpOworICAg
ICAgICBhdXRvIHJ1bkhhc0NvbnRlbnQgPSBbJl0gKCkgLT4gYm9vbCB7CisgICAgICAgICAgICBB
U1NFUlQoIWxpbmVIYXNDb250ZW50KTsKKyAgICAgICAgICAgIGlmIChydW4uaXNUZXh0KCkgfHwg
cnVuLmlzQm94KCkgfHwgcnVuLmlzU29mdExpbmVCcmVhaygpIHx8IHJ1bi5pc0hhcmRMaW5lQnJl
YWsoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGF1dG8mIGlu
bGluZUJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlv
dXRCb3gpOworICAgICAgICAgICAgLy8gRXZlbiBuZWdhdGl2ZSBob3Jpem9udGFsIG1hcmdpbiBt
YWtlcyB0aGUgbGluZSAiY29udGVudGZ1bCIuCisgICAgICAgICAgICBpZiAocnVuLmlzSW5saW5l
Qm94U3RhcnQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5saW5lQm94R2VvbWV0cnkubWFy
Z2luU3RhcnQoKSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCkgfHwgaW5saW5lQm94
R2VvbWV0cnkucGFkZGluZ0xlZnQoKS52YWx1ZU9yKDBfbHUpOworICAgICAgICAgICAgaWYgKHJ1
bi5pc0lubGluZUJveEVuZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVCb3hHZW9t
ZXRyeS5tYXJnaW5FbmQoKSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJSaWdodCgpIHx8IGlu
bGluZUJveEdlb21ldHJ5LnBhZGRpbmdSaWdodCgpLnZhbHVlT3IoMF9sdSk7CisgICAgICAgICAg
ICBpZiAocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICB9OworICAgICAgICBsaW5lSGFzQ29udGVudCA9IGxpbmVI
YXNDb250ZW50IHx8IHJ1bkhhc0NvbnRlbnQoKTsKKyAgICAgICAgYXV0byBsb2dpY2FsTGVmdCA9
IHJvb3RJbmxpbmVCb3gubG9naWNhbExlZnQoKSArIHJ1bi5sb2dpY2FsTGVmdCgpOworICAgICAg
ICBpZiAocnVuLmlzQm94KCkpIHsKKyAgICAgICAgICAgIGF1dG8mIGlubGluZUxldmVsQm94R2Vv
bWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Cisg
ICAgICAgICAgICBhdXRvIG1hcmdpbkJveEhlaWdodCA9IGlubGluZUxldmVsQm94R2VvbWV0cnku
bWFyZ2luQm94SGVpZ2h0KCk7CisgICAgICAgICAgICBhdXRvIGFzY2VudCA9IElubGluZUxheW91
dFVuaXQgeyB9OworICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlKCkuc2hvdWxkTm90U3ludGhl
c2l6ZUlubGluZUJsb2NrQmFzZWxpbmUoKSkgeworICAgICAgICAgICAgICAgIC8vIEludGVncmF0
aW9uIGNvZGVwYXRoIGNvbnN0cnVjdHMgcmVwbGFjZWQgYm94ZXMgZm9yIGlubGluZS1ibG9jayBj
b250ZW50LgorICAgICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgp
KTsKKyAgICAgICAgICAgICAgICBhc2NlbnQgPSAqZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91
dEJveCkuYmFzZWxpbmUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LmlzSW5s
aW5lQmxvY2tCb3goKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlbGluZSBvZiBhbiAn
aW5saW5lLWJsb2NrJyBpcyB0aGUgYmFzZWxpbmUgb2YgaXRzIGxhc3QgbGluZSBib3ggaW4gdGhl
IG5vcm1hbCBmbG93LCB1bmxlc3MgaXQgaGFzIGVpdGhlciBubyBpbi1mbG93IGxpbmUgYm94ZXMg
b3IKKyAgICAgICAgICAgICAgICAvLyBpZiBpdHMgJ292ZXJmbG93JyBwcm9wZXJ0eSBoYXMgYSBj
b21wdXRlZCB2YWx1ZSBvdGhlciB0aGFuICd2aXNpYmxlJywgaW4gd2hpY2ggY2FzZSB0aGUgYmFz
ZWxpbmUgaXMgdGhlIGJvdHRvbSBtYXJnaW4gZWRnZS4KKyAgICAgICAgICAgICAgICBhdXRvIHN5
bnRoZXNpemVCYXNlbGluZSA9ICFsYXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCgpIHx8ICFsYXlvdXRCb3guc3R5bGUoKS5pc092ZXJmbG93VmlzaWJsZSgpOworICAg
ICAgICAgICAgICAgIGlmIChzeW50aGVzaXplQmFzZWxpbmUpCisgICAgICAgICAgICAgICAgICAg
IGFzY2VudCA9IG1hcmdpbkJveEhlaWdodDsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICAgICAgICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUoKS5lc3Rh
Ymxpc2hlZElubGluZUZvcm1hdHRpbmdTdGF0ZShkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91
dEJveCkpOworICAgICAgICAgICAgICAgICAgICBhdXRvJiBsYXN0TGluZSA9IGZvcm1hdHRpbmdT
dGF0ZS5saW5lcygpLmxhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpbmxpbmVCbG9j
a0Jhc2VsaW5lID0gbGFzdExpbmUubGluZUJveExvZ2ljYWxSZWN0KCkudG9wKCkgKyBsYXN0TGlu
ZS5iYXNlbGluZSgpOworICAgICAgICAgICAgICAgICAgICBhc2NlbnQgPSBpbmxpbmVMZXZlbEJv
eEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpICsgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS5ib3JkZXJU
b3AoKSArIGlubGluZUxldmVsQm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCkgKyBp
bmxpbmVCbG9ja0Jhc2VsaW5lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxz
ZSBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKKyAgICAgICAgICAgICAgICBhc2NlbnQg
PSBkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KS5iYXNlbGluZSgpLnZhbHVlT3IobWFy
Z2luQm94SGVpZ2h0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhc2NlbnQg
PSBtYXJnaW5Cb3hIZWlnaHQ7CisgICAgICAgICAgICBsb2dpY2FsTGVmdCArPSBzdGQ6Om1heCgw
X2x1LCBpbmxpbmVMZXZlbEJveEdlb21ldHJ5Lm1hcmdpblN0YXJ0KCkpOworICAgICAgICAgICAg
YXV0byBhdG9taWNJbmxpbmVMZXZlbEJveCA9IExpbmVCb3g6OklubGluZUxldmVsQm94OjpjcmVh
dGVBdG9taWNJbmxpbmVMZXZlbEJveChsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCB7IGlubGluZUxl
dmVsQm94R2VvbWV0cnkuYm9yZGVyQm94V2lkdGgoKSwgbWFyZ2luQm94SGVpZ2h0IH0pOworICAg
ICAgICAgICAgYXRvbWljSW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUoYXNjZW50KTsKKyAgICAg
ICAgICAgIGF0b21pY0lubGluZUxldmVsQm94LnNldExheW91dEJvdW5kcyhMaW5lQm94OjpJbmxp
bmVMZXZlbEJveDo6TGF5b3V0Qm91bmRzIHsgYXNjZW50LCBtYXJnaW5Cb3hIZWlnaHQgLSBhc2Nl
bnQgfSk7CisgICAgICAgICAgICBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNhbGx5SWZBcHBsaWNhYmxl
KGF0b21pY0lubGluZUxldmVsQm94LCBpbmxpbmVMZXZlbEJveEdlb21ldHJ5KTsKKyAgICAgICAg
ICAgIGxpbmVCb3guYWRkSW5saW5lTGV2ZWxCb3goV1RGTW92ZShhdG9taWNJbmxpbmVMZXZlbEJv
eCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bi5p
c0lubGluZUJveFN0YXJ0KCkpIHsKKyAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgZG9u
J3Qga25vdyB5ZXQgaG93IHdpZGUgdGhpcyBpbmxpbmUgYm94IGlzLiBMZXQncyBhc3N1bWUgaXQn
cyBhcyBsb25nIGFzIHRoZSBsaW5lIGlzCisgICAgICAgICAgICAvLyBhbmQgYWRqdXN0IGl0IGxh
dGVyIGlmIHdlIGNvbWUgYWNyb3NzIGFuIGlubGluZUJveEVuZCBydW4gKHNlZSBiZWxvdykuCisg
ICAgICAgICAgICBhdXRvIGluaXRpYWxMb2dpY2FsV2lkdGggPSBsaW5lQm94LmNvbnRlbnRMb2dp
Y2FsV2lkdGgoKSAtIHJ1bi5sb2dpY2FsTGVmdCgpOworICAgICAgICAgICAgQVNTRVJUKGluaXRp
YWxMb2dpY2FsV2lkdGggPj0gMCk7CisgICAgICAgICAgICAvLyBJbmxpbmUgYm94IHJ1biBpcyBi
YXNlZCBvbiBtYXJnaW4gYm94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBib3guCisgICAg
ICAgICAgICBhdXRvIG1hcmdpblN0YXJ0ID0gc3RkOjptYXgoMF9sdSwgZm9ybWF0dGluZ0NvbnRl
eHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpLm1hcmdpblN0YXJ0KCkpOworICAgICAgICAg
ICAgbG9naWNhbExlZnQgKz0gbWFyZ2luU3RhcnQ7CisgICAgICAgICAgICBpbml0aWFsTG9naWNh
bFdpZHRoIC09IG1hcmdpblN0YXJ0OworICAgICAgICAgICAgYXV0byBpbmxpbmVCb3ggPSBMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlSW5saW5lQm94KGxheW91dEJveCwgbG9naWNhbExl
ZnQsIGluaXRpYWxMb2dpY2FsV2lkdGgpOworICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRy
eUZvcklubGluZUJveChpbmxpbmVCb3gpOworICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVy
dGljYWxseUlmQXBwbGljYWJsZShpbmxpbmVCb3gsIHsgfSk7CisgICAgICAgICAgICBsaW5lQm94
LmFkZElubGluZUxldmVsQm94KFdURk1vdmUoaW5saW5lQm94KSk7CisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94RW5kKCkpIHsKKyAg
ICAgICAgICAgIC8vIEFkanVzdCB0aGUgbG9naWNhbCB3aWR0aCB3aGVuIHRoZSBpbmxpbmUgYm94
IGNsb3NlcyBvbiB0aGlzIGxpbmUuCisgICAgICAgICAgICBhdXRvJiBpbmxpbmVCb3ggPSBsaW5l
Qm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7CisgICAgICAgICAgICBB
U1NFUlQoaW5saW5lQm94LmlzSW5saW5lQm94KCkpOworICAgICAgICAgICAgLy8gSW5saW5lIGJv
eCBydW4gaXMgYmFzZWQgb24gbWFyZ2luIGJveC4gTGV0J3MgY29udmVydCBpdCB0byBib3JkZXIg
Ym94LgorICAgICAgICAgICAgYXV0byBtYXJnaW5FbmQgPSBzdGQ6Om1heCgwX2x1LCBmb3JtYXR0
aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCkubWFyZ2luRW5kKCkpOworICAg
ICAgICAgICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmlnaHQgPSBsb2dpY2FsTGVmdCArIHJ1bi5s
b2dpY2FsV2lkdGgoKSAtIG1hcmdpbkVuZDsKKyAgICAgICAgICAgIGlubGluZUJveC5zZXRMb2dp
Y2FsV2lkdGgoaW5saW5lQm94TG9naWNhbFJpZ2h0IC0gaW5saW5lQm94LmxvZ2ljYWxMZWZ0KCkp
OworICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGljYWJsZShpbmxp
bmVCb3gsIHsgfSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBp
ZiAocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc1NvZnRMaW5lQnJlYWsoKSkgeworICAgICAgICAgICAg
Ly8gRklYTUU6IEFkanVzdCBub24tZW1wdHkgaW5saW5lIGJveCBoZWlnaHQgd2hlbiBnbHlwaHMg
ZnJvbSB0aGUgbm9uLXByaW1hcnkgZm9udCBzdHJldGNoIHRoZSBib3guCisgICAgICAgICAgICBs
aW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSkuc2V0
SGFzQ29udGVudCgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAg
aWYgKHJ1bi5pc0hhcmRMaW5lQnJlYWsoKSkgeworICAgICAgICAgICAgYXV0byBsaW5lQnJlYWtC
b3ggPSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlTGluZUJyZWFrQm94KGxheW91dEJv
eCwgbG9naWNhbExlZnQpOworICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRyeUZvcklubGlu
ZUJveChsaW5lQnJlYWtCb3gpOworICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxs
eUlmQXBwbGljYWJsZShsaW5lQnJlYWtCb3gsIHsgfSk7CisgICAgICAgICAgICBsaW5lQm94LmFk
ZElubGluZUxldmVsQm94KFdURk1vdmUobGluZUJyZWFrQm94KSk7CisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHko
KSkgeworICAgICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChMaW5lQm94OjpJbmxp
bmVMZXZlbEJveDo6Y3JlYXRlR2VuZXJpY0lubGluZUxldmVsQm94KGxheW91dEJveCwgbG9naWNh
bExlZnQpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIGxpbmVCb3guc2V0SGFzQ29udGVudChsaW5l
SGFzQ29udGVudCk7CisgICAgaWYgKHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5pc0VuYWJs
ZWQoKSB8fCAhbGluZUhhc0NvbnRlbnQpIHsKKyAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBi
ZSBhYmxlIHRvIGV4ZXJjaXNlIHRoZSBmYXN0IHBhdGggd2hlbiB0aGUgbGluZSBoYXMgbm8gY29u
dGVudCBhdCBhbGwsIGV2ZW4gaW4gbm9uLXN0YW5kYXJkcyBtb2RlIG9yIHdpdGggbGluZS1oZWln
aHQgc2V0LgorICAgICAgICByb290SW5saW5lQm94LnNldExvZ2ljYWxUb3AobGluZUhhc0NvbnRl
bnQgPyBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQucm9vdElubGluZUJveExvZ2ljYWxUb3Ao
KSA6IC1yb290SW5saW5lQm94LmJhc2VsaW5lKCkpOworICAgICAgICBsaW5lQm94LnNldExvZ2lj
YWxIZWlnaHQobGluZUhhc0NvbnRlbnQgPyBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQubGlu
ZUJveEhlaWdodCgpIDogSW5saW5lTGF5b3V0VW5pdCgpKTsKKyAgICB9IGVsc2UKKyAgICAgICAg
Y29tcHV0ZUxpbmVCb3hIZWlnaHRBbmRBbGlnbklubGluZUxldmVsQm94ZXNWZXJ0aWNhbGx5KGxp
bmVCb3gpOworfQorCit2b2lkIExpbmVCb3hCdWlsZGVyOjpjb21wdXRlTGluZUJveEhlaWdodEFu
ZEFsaWduSW5saW5lTGV2ZWxCb3hlc1ZlcnRpY2FsbHkoTGluZUJveCYgbGluZUJveCkKK3sKKyAg
ICBBU1NFUlQobGluZUJveC5oYXNDb250ZW50KCkpOworICAgIC8vIFRoaXMgZnVuY3Rpb24gKHBh
cnRpYWxseSkgaW1wbGVtZW50czoKKyAgICAvLyAyLjIuIExheW91dCBXaXRoaW4gTGluZSBCb3hl
cworICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xpbmUtbGF5b3V0
CisgICAgLy8gMS4gQ29tcHV0ZSB0aGUgbGluZSBib3ggaGVpZ2h0IHVzaW5nIHRoZSBsYXlvdXQg
Ym91bmRzIGdlb21ldHJ5LiBUaGlzIGhlaWdodCBjb21wdXRhdGlvbiBzdHJpY3RseSB1c2VzIGxh
eW91dCBib3VuZHMgYW5kIG5vdCBub3JtYWwgaW5saW5lIGxldmVsIGJveCBnZW9tZXRyaWVzLgor
ICAgIC8vIDIuIENvbXB1dGUgdGhlIGJhc2VsaW5lL2xvZ2ljYWwgdG9wIHBvc2l0aW9uIG9mIHRo
ZSByb290IGlubGluZSBib3guIEFsaWduZWQgYm94ZXMgcHVzaCB0aGUgcm9vdCBpbmxpbmUgYm94
IGFyb3VuZCBpbnNpZGUgdGhlIGxpbmUgYm94LgorICAgIC8vIDMuIEZpbmFsbHkgYWxpZ24gdGhl
IGlubGluZSBsZXZlbCBib3hlcyB1c2luZyAobW9zdGx5KSBub3JtYWwgaW5saW5lIGxldmVsIGJv
eCBnZW9tZXRyaWVzLgorICAgIGF1dG8gcXVpcmtzID0gZm9ybWF0dGluZ0NvbnRleHQoKS5xdWly
a3MoKTsKKyAgICBhdXRvJiByb290SW5saW5lQm94ID0gbGluZUJveC5yb290SW5saW5lQm94KCk7
CisKKyAgICBhdXRvIGNvbXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCA9IFsmXSB7CisgICAgICAg
IC8vIExpbmUgYm94IGhlaWdodCBjb21wdXRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgbGF5b3V0IGJv
dW5kcyBvZiB0aGUgaW5saW5lIGJveGVzIGFuZCBub3QgdGhlaXIgbG9naWNhbCAoYXNjZW50L2Rl
c2NlbnQpIGRpbWVuc2lvbnMuCisgICAgICAgIHN0cnVjdCBBYnNvbHV0ZVRvcEFuZEJvdHRvbSB7
CisgICAgICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHRvcCB7IDAgfTsKKyAgICAgICAgICAgIElu
bGluZUxheW91dFVuaXQgYm90dG9tIHsgMCB9OworICAgICAgICB9OworICAgICAgICBIYXNoTWFw
PGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94KiwgQWJzb2x1dGVUb3BBbmRCb3R0b20+IGlu
bGluZUxldmVsQm94QWJzb2x1dGVUb3BBbmRCb3R0b21NYXA7CisKKyAgICAgICAgYXV0byBtaW5p
bXVtTG9naWNhbFRvcCA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKKyAgICAgICAg
YXV0byBtYXhpbXVtTG9naWNhbEJvdHRvbSA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsg
fTsKKyAgICAgICAgaWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KHJvb3RJ
bmxpbmVCb3gsIGxpbmVCb3gpKSB7CisgICAgICAgICAgICBtaW5pbXVtTG9naWNhbFRvcCA9IElu
bGluZUxheW91dFVuaXQgeyB9OworICAgICAgICAgICAgbWF4aW11bUxvZ2ljYWxCb3R0b20gPSBy
b290SW5saW5lQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpOworICAgICAgICAgICAgaW5saW5l
TGV2ZWxCb3hBYnNvbHV0ZVRvcEFuZEJvdHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVCb3gsIEFic29s
dXRlVG9wQW5kQm90dG9tIHsgKm1pbmltdW1Mb2dpY2FsVG9wLCAqbWF4aW11bUxvZ2ljYWxCb3R0
b20gfSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgaW5saW5lTGV2ZWxCb3hBYnNvbHV0
ZVRvcEFuZEJvdHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVCb3gsIEFic29sdXRlVG9wQW5kQm90dG9t
IHsgfSk7CisKKyAgICAgICAgVmVjdG9yPExpbmVCb3g6OklubGluZUxldmVsQm94Kj4gbGluZUJv
eFJlbGF0aXZlSW5saW5lTGV2ZWxCb3hlczsKKyAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZl
bEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgeworICAgICAgICAgICAg
YXV0byYgbGF5b3V0Qm94ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7CisgICAgICAgICAg
ICBpZiAoaW5saW5lTGV2ZWxCb3guaGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpIHsKKyAg
ICAgICAgICAgICAgICBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveGVzLmFwcGVuZCgmaW5s
aW5lTGV2ZWxCb3gpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgYXV0byYgcGFyZW50SW5saW5lQm94ID0gbGluZUJveC5pbmxpbmVMZXZlbEJv
eEZvckxheW91dEJveChsYXlvdXRCb3gucGFyZW50KCkpOworICAgICAgICAgICAgLy8gTG9naWNh
bCB0b3AgaXMgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBpbmxpbmUgYm94J3MgbGF5b3V0IGJvdW5k
cy4KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGxvZ2ljYWwgdG9wIGlzIG5vdCB0aGUg
ZmluYWwgbG9naWNhbCB0b3Agb2YgdGhlIGlubGluZSBsZXZlbCBib3guCisgICAgICAgICAgICAv
LyBUaGlzIGlzIHRoZSBsb2dpY2FsIHRvcCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbGF5b3V0IGJv
dW5kcyBnZW9tZXRyeSB3aGljaCBtYXkgYmUgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgaW5saW5l
IGJveCdzIG5vcm1hbCBnZW9tZXRyeS4KKyAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcCA9IElu
bGluZUxheW91dFVuaXQgeyB9OworICAgICAgICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52
ZXJ0aWNhbEFsaWduKCkpIHsKKyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxp
bmU6IHsKKyAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFz
ZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAgICAgICAg
ICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQg
LSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOworICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRk
bGU6IHsKKyAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFz
ZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSAvIDIgKyBwYXJl
bnRJbmxpbmVCb3guc3R5bGUoKS5mb250TWV0cmljcygpLnhIZWlnaHQoKSAvIDI7CisgICAgICAg
ICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2Nl
bnQgLSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpC
YXNlbGluZU1pZGRsZTogeworICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgp
IC8gMjsKKyAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmxheW91
dEJvdW5kcygpLmFzY2VudCAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246Okxlbmd0aDogeworICAgICAgICAgICAgICAgIGF1dG8mIHN0eWxlID0gaW5s
aW5lTGV2ZWxCb3guc3R5bGUoKTsKKyAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZz
ZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBmbG9hdFZhbHVlRm9yTGVuZ3RoKHN0eWxlLnZlcnRpY2Fs
QWxpZ25MZW5ndGgoKSwgc3R5bGUuY29tcHV0ZWRMaW5lSGVpZ2h0KCkpICsgaW5saW5lTGV2ZWxC
b3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OworICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBw
YXJlbnRJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VGV4dFRvcDogeworICAgICAgICAgICAg
ICAgIC8vIE5vdGUgdGhhdCB0ZXh0LXRvcCBhbGlnbnMgd2l0aCB0aGUgaW5saW5lIGJveCdzIGZv
bnQgbWV0cmljcyB0b3AgKGFzY2VudCkgYW5kIG5vdCB0aGUgbGF5b3V0IGJvdW5kcyB0b3AuCisg
ICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMo
KS5hc2NlbnQgLSBwYXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKTsKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VGV4
dEJvdHRvbTogeworICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0ZXh0LWJvdHRvbSBhbGln
bnMgd2l0aCB0aGUgaW5saW5lIGJveCdzIGZvbnQgbWV0cmljcyBib3R0b20gKGRlc2NlbnQpIGFu
ZCBub3QgdGhlIGxheW91dCBib3VuZHMgYm90dG9tLgorICAgICAgICAgICAgICAgIGF1dG8gcGFy
ZW50SW5saW5lQm94TGF5b3V0Qm91bmRzID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5kcygp
OworICAgICAgICAgICAgICAgIGF1dG8gcGFyZW50SW5saW5lQm94TG9naWNhbEJvdHRvbSA9IHBh
cmVudElubGluZUJveExheW91dEJvdW5kcy5oZWlnaHQoKSAtIHBhcmVudElubGluZUJveExheW91
dEJvdW5kcy5kZXNjZW50ICsgcGFyZW50SW5saW5lQm94LmRlc2NlbnQoKS52YWx1ZU9yKElubGlu
ZUxheW91dFVuaXQoKSk7CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGlu
ZUJveExvZ2ljYWxCb3R0b20gLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQo
KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gcGFy
ZW50SW5saW5lQm94QWJzb2x1dGVUb3BBbmRCb3R0b20gPSBpbmxpbmVMZXZlbEJveEFic29sdXRl
VG9wQW5kQm90dG9tTWFwLmdldCgmcGFyZW50SW5saW5lQm94KTsKKyAgICAgICAgICAgIGF1dG8g
YWJzb2x1dGVMb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94QWJzb2x1dGVUb3BBbmRCb3R0b20u
dG9wICsgbG9naWNhbFRvcDsKKyAgICAgICAgICAgIGF1dG8gYWJzb2x1dGVMb2dpY2FsQm90dG9t
ID0gYWJzb2x1dGVMb2dpY2FsVG9wICsgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVp
Z2h0KCk7CisgICAgICAgICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9wQW5kQm90dG9tTWFw
LmFkZCgmaW5saW5lTGV2ZWxCb3gsIEFic29sdXRlVG9wQW5kQm90dG9tIHsgYWJzb2x1dGVMb2dp
Y2FsVG9wLCBhYnNvbHV0ZUxvZ2ljYWxCb3R0b20gfSk7CisgICAgICAgICAgICAvLyBTdHJldGNo
IHRoZSBtaW4vbWF4IGFic29sdXRlIHZhbHVlcyBpZiBhcHBsaWNhYmxlLgorICAgICAgICAgICAg
aWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGlubGluZUxldmVsQm94LCBs
aW5lQm94KSkgeworICAgICAgICAgICAgICAgIG1pbmltdW1Mb2dpY2FsVG9wID0gc3RkOjptaW4o
bWluaW11bUxvZ2ljYWxUb3AudmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxUb3ApLCBhYnNvbHV0ZUxv
Z2ljYWxUb3ApOworICAgICAgICAgICAgICAgIG1heGltdW1Mb2dpY2FsQm90dG9tID0gc3RkOjpt
YXgobWF4aW11bUxvZ2ljYWxCb3R0b20udmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxCb3R0b20pLCBh
YnNvbHV0ZUxvZ2ljYWxCb3R0b20pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IC8vIFRoZSBsaW5lIGJveCBoZWlnaHQgY29tcHV0YXRpb24gaXMgYXMgZm9sbG93czoKKyAgICAg
ICAgLy8gMS4gU3RyZXRjaCB0aGUgbGluZSBib3ggd2l0aCB0aGUgbm9uLWxpbmUtYm94IHJlbGF0
aXZlIGFsaWduZWQgaW5saW5lIGJveCBhYnNvbHV0ZSB0b3AgYW5kIGJvdHRvbSB2YWx1ZXMuCisg
ICAgICAgIC8vIDIuIENoZWNrIGlmIHRoZSBsaW5lIGJveCByZWxhdGl2ZSBhbGlnbmVkIGlubGlu
ZSBib3hlcyAodG9wLCBib3R0b20gZXRjKSBoYXZlIGVub3VnaCByb29tIGFuZCBzdHJldGNoIHRo
ZSBsaW5lIGJveCBmdXJ0aGVyIGlmIG5lZWRlZC4KKyAgICAgICAgYXV0byBsaW5lQm94TG9naWNh
bEhlaWdodCA9IG1heGltdW1Mb2dpY2FsQm90dG9tLnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCgp
KSAtIG1pbmltdW1Mb2dpY2FsVG9wLnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCgpKTsKKyAgICAg
ICAgZm9yIChhdXRvKiBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveCA6IGxpbmVCb3hSZWxh
dGl2ZUlubGluZUxldmVsQm94ZXMpIHsKKyAgICAgICAgICAgIGlmICghcXVpcmtzLmlubGluZUxl
dmVsQm94QWZmZWN0c0xpbmVCb3goKmxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94LCBsaW5l
Qm94KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGxpbmVCb3hMb2dp
Y2FsSGVpZ2h0ID0gc3RkOjptYXgobGluZUJveExvZ2ljYWxIZWlnaHQsIGxpbmVCb3hSZWxhdGl2
ZUlubGluZUxldmVsQm94LT5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSk7CisgICAgICAgIH0KKyAg
ICAgICAgbGluZUJveC5zZXRMb2dpY2FsSGVpZ2h0KGxpbmVCb3hMb2dpY2FsSGVpZ2h0KTsKKyAg
ICB9OworICAgIGNvbXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCgpOworCisgICAgYXV0byBjb21w
dXRlUm9vdElubGluZUJveFZlcnRpY2FsUG9zaXRpb24gPSBbJl0geworICAgICAgICBIYXNoTWFw
PGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94KiwgSW5saW5lTGF5b3V0VW5pdD4gaW5saW5l
TGV2ZWxCb3hBYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0TWFwOworICAgICAgICBpbmxpbmVMZXZlbEJv
eEFic29sdXRlQmFzZWxpbmVPZmZzZXRNYXAuYWRkKCZyb290SW5saW5lQm94LCBJbmxpbmVMYXlv
dXRVbml0IHsgfSk7CisKKyAgICAgICAgYXV0byBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxp
bmVCb3hCYXNlbGluZSA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKKyAgICAgICAg
aWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KHJvb3RJbmxpbmVCb3gsIGxp
bmVCb3gpKQorICAgICAgICAgICAgbWF4aW11bVRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFz
ZWxpbmUgPSByb290SW5saW5lQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKKworICAgICAgICBm
b3IgKGF1dG8mIGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hl
cygpKSB7CisgICAgICAgICAgICBhdXRvIGFic29sdXRlQmFzZWxpbmVPZmZzZXQgPSBJbmxpbmVM
YXlvdXRVbml0IHsgfTsKKyAgICAgICAgICAgIGlmICghaW5saW5lTGV2ZWxCb3guaGFzTGluZUJv
eFJlbGF0aXZlQWxpZ25tZW50KCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3gg
PSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKKyAgICAgICAgICAgICAgICBhdXRvJiBwYXJl
bnRJbmxpbmVCb3ggPSBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJv
eC5wYXJlbnQoKSk7CisgICAgICAgICAgICAgICAgYXV0byBiYXNlbGluZU9mZnNldEZyb21QYXJl
bnRCYXNlbGluZSA9IElubGluZUxheW91dFVuaXQgeyB9OworCisgICAgICAgICAgICAgICAgc3dp
dGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKKyAgICAgICAgICAgICAgICBj
YXNlIFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lOgorICAgICAgICAgICAgICAgICAgICBiYXNlbGlu
ZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHsgfTsKKyAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6IHsKKyAgICAg
ICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0g
KGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpIC8gMiArIHBhcmVudElubGlu
ZUJveC5zdHlsZSgpLmZvbnRNZXRyaWNzKCkueEhlaWdodCgpIC8gMik7CisgICAgICAgICAgICAg
ICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gbG9naWNhbFRvcE9mZnNl
dEZyb21QYXJlbnRCYXNlbGluZSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2Vu
dDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmVNaWRkbGU6IHsKKyAgICAgICAg
ICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCkgLyAyOworICAgICAgICAgICAgICAg
ICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxUb3BPZmZzZXRG
cm9tUGFyZW50QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7
CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Okxlbmd0aDogeworICAgICAgICAgICAgICAgICAg
ICBhdXRvJiBzdHlsZSA9IGlubGluZUxldmVsQm94LnN0eWxlKCk7CisgICAgICAgICAgICAgICAg
ICAgIGF1dG8gdmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5ndGgoc3R5bGUu
dmVydGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKSk7CisgICAg
ICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9
IHZlcnRpY2FsQWxpZ25PZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOworICAgICAg
ICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxU
b3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOwor
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpUZXh0VG9wOgorICAgICAgICAgICAgICAgICAgICBi
YXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHBhcmVudElubGluZUJveC5iYXNlbGlu
ZSgpIC0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OworICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRC
b3R0b206CisgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2Vs
aW5lID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtICpwYXJlbnRJbmxp
bmVCb3guZGVzY2VudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVE
X1lFVCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgYWJzb2x1dGVCYXNlbGluZU9mZnNldCA9IGlubGluZUxldmVsQm94QWJz
b2x1dGVCYXNlbGluZU9mZnNldE1hcC5nZXQoJnBhcmVudElubGluZUJveCkgKyBiYXNlbGluZU9m
ZnNldEZyb21QYXJlbnRCYXNlbGluZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKKyAgICAgICAg
ICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRvcDogeworICAgICAgICAgICAgICAgICAgICBh
YnNvbHV0ZUJhc2VsaW5lT2Zmc2V0ID0gcm9vdElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2Nl
bnQgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246OkJvdHRvbTogeworICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUJhc2Vs
aW5lT2Zmc2V0ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtIHJvb3RJ
bmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICAgICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7CisgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlubGluZUxldmVsQm94QWJzb2x1dGVCYXNlbGluZU9mZnNldE1hcC5hZGQoJmlubGluZUxl
dmVsQm94LCBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0KTsKKyAgICAgICAgICAgIGF1dG8gYWZmZWN0
c1Jvb3RJbmxpbmVCb3hWZXJ0aWNhbFBvc2l0aW9uID0gcXVpcmtzLmlubGluZUxldmVsQm94QWZm
ZWN0c0xpbmVCb3goaW5saW5lTGV2ZWxCb3gsIGxpbmVCb3gpOworICAgICAgICAgICAgaWYgKGFm
ZmVjdHNSb290SW5saW5lQm94VmVydGljYWxQb3NpdGlvbikgeworICAgICAgICAgICAgICAgIGF1
dG8gdG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IGFic29sdXRlQmFzZWxpbmVP
ZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAgICAgICAg
ICAgICAgaWYgKG1heGltdW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2VsaW5lKQorICAg
ICAgICAgICAgICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGlu
ZSA9IHN0ZDo6bWF4KCptYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSwg
dG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSk7CisgICAgICAgICAgICAgICAgZWxz
ZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpcyBxdWlyayBtb2RlIGFuZCB0aGUg
cm9vdCBpbmxpbmUgYm94IGhhcyBubyBjb250ZW50LiBUaGUgcm9vdCBpbmxpbmUgYm94J3MgYmFz
ZWxpbmUgaXMgYW5jaG9yZWQgYXQgMC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBu
ZWdhdGl2ZSBhc2NlbnQgKGUuZyBuZWdhdGl2ZSB0b3AgbWFyZ2luKSBjYW4gInB1c2giIHRoZSBy
b290IGlubGluZSBib3ggdXB3YXJkcyBhbmQgaGF2ZSBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAg
ICAgICAgICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9
IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudCA+PSAwCisgICAgICAgICAgICAg
ICAgICAgICAgICA/IHN0ZDo6bWF4KDAuMGYsIHRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFz
ZWxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IHRvcE9mZnNldEZyb21Sb290SW5saW5l
Qm94QmFzZWxpbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIGF1dG8gcm9vdElubGluZUJveExvZ2ljYWxUb3AgPSBtYXhpbXVtVG9wT2Zmc2V0
RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZS52YWx1ZU9yKDAuZikgLSByb290SW5saW5lQm94LmJh
c2VsaW5lKCk7CisgICAgICAgIHJvb3RJbmxpbmVCb3guc2V0TG9naWNhbFRvcChyb290SW5saW5l
Qm94TG9naWNhbFRvcCk7CisgICAgfTsKKyAgICBjb21wdXRlUm9vdElubGluZUJveFZlcnRpY2Fs
UG9zaXRpb24oKTsKKworICAgIGF1dG8gYWxpZ25JbmxpbmVMZXZlbEJveGVzID0gWyZdIHsKKyAg
ICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxl
dmVsQm94ZXMoKSkgeworICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5saW5lTGV2ZWxC
b3gubGF5b3V0Qm94KCk7CisgICAgICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVCb3ggPSBsaW5l
Qm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSk7CisgICAg
ICAgICAgICBhdXRvIGxvZ2ljYWxUb3AgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKKyAgICAgICAg
ICAgIHN3aXRjaCAoaW5saW5lTGV2ZWxCb3gudmVydGljYWxBbGlnbigpKSB7CisgICAgICAgICAg
ICBjYXNlIFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lOgorICAgICAgICAgICAgICAgIGxvZ2ljYWxU
b3AgPSBwYXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94LmJhc2VsaW5l
KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246Ok1pZGRsZTogeworICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21Q
YXJlbnRCYXNlbGluZSA9IChpbmxpbmVMZXZlbEJveC5sb2dpY2FsSGVpZ2h0KCkgLyAyICsgcGFy
ZW50SW5saW5lQm94LnN0eWxlKCkuZm9udE1ldHJpY3MoKS54SGVpZ2h0KCkgLyAyKTsKKyAgICAg
ICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmJhc2VsaW5lKCkgLSBsb2dp
Y2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZU1p
ZGRsZTogeworICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRC
YXNlbGluZSA9IGlubGluZUxldmVsQm94LmxvZ2ljYWxIZWlnaHQoKSAvIDI7CisgICAgICAgICAg
ICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gbG9naWNhbFRv
cE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6TGVuZ3RoOiB7CisgICAg
ICAgICAgICAgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVMZXZlbEJveC5zdHlsZSgpOworICAgICAg
ICAgICAgICAgIGF1dG8gdmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5ndGgo
c3R5bGUudmVydGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKSk7
CisgICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5l
ID0gdmVydGljYWxBbGlnbk9mZnNldCArIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7CisgICAg
ICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gbG9n
aWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCAodGV4dCl0b3AvYm90dG9t
IGFsaWduIHRoZWlyIGxheW91dCBib3VuZHMuCisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246OlRleHRUb3A6CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94
LmxheW91dEJvdW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRC
b3R0b206CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sb2dp
Y2FsSGVpZ2h0KCkgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5kZXNjZW50IC0gaW5s
aW5lTGV2ZWxCb3guYmFzZWxpbmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VG9wOgorICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhh
dCB0aGlzIGxvZ2ljYWwgdG9wIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGlubGluZSBi
b3guCisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94LmxheW91dEJv
dW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJvdHRvbToKKyAgICAg
ICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBsb2dpY2FsIHRvcCBpcyBub3QgcmVsYXRpdmUg
dG8gdGhlIHBhcmVudCBpbmxpbmUgYm94LgorICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBs
aW5lQm94LmxvZ2ljYWxIZWlnaHQoKSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmRl
c2NlbnQgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExF
TUVOVEVEX1lFVCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChsb2dpY2FsVG9wKTsKKyAgICAg
ICAgfQorICAgIH07CisgICAgYWxpZ25JbmxpbmVMZXZlbEJveGVzKCk7Cit9CisKK0xpbmVCb3hC
dWlsZGVyOjpTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OlNpbXBsaWZpZWRWZXJ0aWNhbEFs
aWdubWVudChjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgcm9vdElubGluZUJveCkKKyAg
ICA6IG1fcm9vdElubGluZUJveChyb290SW5saW5lQm94KQoreworICAgIGFkanVzdChyb290SW5s
aW5lQm94KTsKK30KKworYm9vbCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmllZFZlcnRpY2FsQWxp
Z25tZW50OjpjYW5Vc2VTaW1wbGlmaWVkQWxpZ25tZW50KGNvbnN0IExpbmVCb3g6OklubGluZUxl
dmVsQm94JiByb290SW5saW5lQm94LCBjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgaW5s
aW5lTGV2ZWxCb3gsIE9wdGlvbmFsPGNvbnN0IEJveEdlb21ldHJ5PiBpbmxpbmVMZXZlbEJveEdl
b21ldHJ5KQoreworICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0F0b21pY0lubGluZUxldmVsQm94
KCkpIHsKKyAgICAgICAgQVNTRVJUKGlubGluZUxldmVsQm94R2VvbWV0cnkpOworICAgICAgICAv
LyBCYXNlbGluZSBhbGlnbmVkLCBub24tc3RyZXRjaHkgZGlyZWN0IGNoaWxkcmVuIGFyZSBjb25z
aWRlcmVkIHRvIGJlIHNpbXBsZSBmb3Igbm93LgorICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBp
bmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKKyAgICAgICAgcmV0dXJuICZsYXlvdXRCb3gucGFy
ZW50KCkgPT0gJnJvb3RJbmxpbmVCb3gubGF5b3V0Qm94KCkKKyAgICAgICAgICAgICYmIGxheW91
dEJveC5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKSA9PSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZQor
ICAgICAgICAgICAgJiYgIWlubGluZUxldmVsQm94R2VvbWV0cnktPm1hcmdpbkJlZm9yZSgpCisg
ICAgICAgICAgICAmJiAhaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQWZ0ZXIoKQorICAg
ICAgICAgICAgJiYgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQm94SGVpZ2h0KCkgPD0g
cm9vdElubGluZUJveC5iYXNlbGluZSgpOworICAgIH0KKyAgICBpZiAoaW5saW5lTGV2ZWxCb3gu
aXNMaW5lQnJlYWtCb3goKSkgeworICAgICAgICAvLyBCYXNlbGluZSBhbGlnbmVkLCBub24tc3Ry
ZXRjaHkgbGluZSBicmVha3MgZS5nLiA8ZGl2PjxzcGFuPjxicj48L3NwYW4+PC9kaXY+IGJ1dCBu
b3QgPGRpdj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMDBweDsiPjxicj48L3NwYW4+PC9kaXY+
LgorICAgICAgICByZXR1cm4gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5bGUoKS52ZXJ0
aWNhbEFsaWduKCkgPT0gVmVydGljYWxBbGlnbjo6QmFzZWxpbmUgJiYgaW5saW5lTGV2ZWxCb3gu
YmFzZWxpbmUoKSA8PSByb290SW5saW5lQm94LmJhc2VsaW5lKCk7CisgICAgfQorICAgIGlmIChp
bmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpKSB7CisgICAgICAgIC8vIEJhc2VsaW5lIGFsaWdu
ZWQsIG5vbi1zdHJldGNoeSBpbmxpbmUgYm94ZXMgZS5nLiA8ZGl2PjxzcGFuPjwvc3Bhbj48L2Rp
dj4gYnV0IG5vdCA8ZGl2PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwMHB4OyI+PC9zcGFuPjwv
ZGl2Pi4KKyAgICAgICAgcmV0dXJuIGlubGluZUxldmVsQm94LmxheW91dEJveCgpLnN0eWxlKCku
dmVydGljYWxBbGlnbigpID09IFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lICYmIGlubGluZUxldmVs
Qm94LmxheW91dEJvdW5kcygpID09IHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCk7CisgICAg
fQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmll
ZFZlcnRpY2FsQWxpZ25tZW50OjphbGlnbihMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgaW5saW5l
TGV2ZWxCb3gpCit7CisgICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5saW5lTGV2ZWxC
b3goKSB8fCBpbmxpbmVMZXZlbEJveC5pc0xpbmVCcmVha0JveCgpIHx8IGlubGluZUxldmVsQm94
LmlzSW5saW5lQm94KCkpIHsKKyAgICAgICAgLy8gT25seSBiYXNlbGluZSBhbGlnbm1lbnQgZm9y
IG5vdy4KKyAgICAgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChtX3Jvb3RJbmxpbmVC
b3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCkpOworICAgICAgICBhZGp1
c3QoaW5saW5lTGV2ZWxCb3gpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9O
T1RfSU1QTEVNRU5URURfWUVUKCk7Cit9CisKK3ZvaWQgTGluZUJveEJ1aWxkZXI6OlNpbXBsaWZp
ZWRWZXJ0aWNhbEFsaWdubWVudDo6YWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94
JiBpbmxpbmVMZXZlbEJveCkKK3sKKyAgICBhdXRvIGxheW91dEJvdW5kc0xvZ2ljYWxUb3AgPSBt
X3Jvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gaW5saW5lTGV2ZWxCb3gubGF5
b3V0Qm91bmRzKCkuYXNjZW50OworICAgIG1fbGluZUJveExvZ2ljYWxUb3AgPSBzdGQ6Om1pbiht
X2xpbmVCb3hMb2dpY2FsVG9wLCBsYXlvdXRCb3VuZHNMb2dpY2FsVG9wKTsKKyAgICBtX2xpbmVC
b3hMb2dpY2FsQm90dG9tID0gc3RkOjptYXgobV9saW5lQm94TG9naWNhbEJvdHRvbSwgbGF5b3V0
Qm91bmRzTG9naWNhbFRvcCArIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgp
KTsKKyAgICBtX3Jvb3RJbmxpbmVCb3hMb2dpY2FsVG9wID0gc3RkOjptYXgobV9yb290SW5saW5l
Qm94TG9naWNhbFRvcCwgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbV9y
b290SW5saW5lQm94LmJhc2VsaW5lKCkpOworfQorCitMaW5lQm94IElubGluZUZvcm1hdHRpbmdD
b250ZXh0OjpHZW9tZXRyeTo6bGluZUJveEZvckxpbmVDb250ZW50KGNvbnN0IExpbmVCdWlsZGVy
OjpMaW5lQ29udGVudCYgbGluZUNvbnRlbnQpCit7CisgICAgcmV0dXJuIExpbmVCb3hCdWlsZGVy
KGZvcm1hdHRpbmdDb250ZXh0KCkpLmJ1aWxkKGxpbmVDb250ZW50KTsKK30KKworSW5saW5lTGF5
b3V0VW5pdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmxvZ2ljYWxUb3BGb3JO
ZXh0TGluZShjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250ZW50LCBJbmxp
bmVMYXlvdXRVbml0IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIGNvbnN0IEZsb2F0aW5nQ29u
dGV4dCYgZmxvYXRpbmdDb250ZXh0KSBjb25zdAoreworICAgIC8vIE5vcm1hbGx5IHRoZSBuZXh0
IGxpbmUncyBsb2dpY2FsIHRvcCBpcyB0aGUgcHJldmlvdXMgbGluZSdzIGxvZ2ljYWwgYm90dG9t
LCBidXQgd2hlbiB0aGUgbGluZSBlbmRzCisgICAgLy8gd2l0aCB0aGUgY2xlYXIgcHJvcGVydHkg
c2V0LCB0aGUgbmV4dCBsaW5lIG5lZWRzIHRvIGNsZWFyIHRoZSBleGlzdGluZyBmbG9hdHMuCisg
ICAgaWYgKGxpbmVDb250ZW50LnJ1bnMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gcHJldmlv
dXNMaW5lTG9naWNhbEJvdHRvbTsKKyAgICBhdXRvJiBsYXN0UnVuTGF5b3V0Qm94ID0gbGluZUNv
bnRlbnQucnVucy5sYXN0KCkubGF5b3V0Qm94KCk7IAorICAgIGlmIChsYXN0UnVuTGF5b3V0Qm94
LnN0eWxlKCkuY2xlYXIoKSA9PSBDbGVhcjo6Tm9uZSkKKyAgICAgICAgcmV0dXJuIHByZXZpb3Vz
TGluZUxvZ2ljYWxCb3R0b207CisgICAgYXV0byBwb3NpdGlvbldpdGhDbGVhcmFuY2UgPSBmbG9h
dGluZ0NvbnRleHQudmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UobGFzdFJ1bkxheW91dEJv
eCk7CisgICAgaWYgKCFwb3NpdGlvbldpdGhDbGVhcmFuY2UpCisgICAgICAgIHJldHVybiBwcmV2
aW91c0xpbmVMb2dpY2FsQm90dG9tOworICAgIHJldHVybiBzdGQ6Om1heChwcmV2aW91c0xpbmVM
b2dpY2FsQm90dG9tLCBJbmxpbmVMYXlvdXRVbml0KHBvc2l0aW9uV2l0aENsZWFyYW5jZS0+cG9z
aXRpb24pKTsKK30KKworQ29udGVudFdpZHRoQW5kTWFyZ2luIElubGluZUZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeTo6aW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94
JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9y
aXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3Zl
cnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGZvcm1hdHRpbmdDb250ZXh0
Um9vdC5pc0luRmxvdygpKTsKKworICAgIC8vIDEwLjMuMTAgJ0lubGluZS1ibG9jaycsIHJlcGxh
Y2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93CisKKyAgICAvLyBFeGFjdGx5IGFzIGlubGluZSBy
ZXBsYWNlZCBlbGVtZW50cy4KKyAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHRSb290LmlzUmVwbGFj
ZWRCb3goKSkKKyAgICAgICAgcmV0dXJuIGlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFy
Z2luKGRvd25jYXN0PFJlcGxhY2VkQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3QpLCBob3Jpem9u
dGFsQ29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOworCisgICAg
Ly8gMTAuMy45ICdJbmxpbmUtYmxvY2snLCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFs
IGZsb3cKKworICAgIC8vIElmICd3aWR0aCcgaXMgJ2F1dG8nLCB0aGUgdXNlZCB2YWx1ZSBpcyB0
aGUgc2hyaW5rLXRvLWZpdCB3aWR0aCBhcyBmb3IgZmxvYXRpbmcgZWxlbWVudHMuCisgICAgLy8g
QSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycgZm9yICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1y
aWdodCcgYmVjb21lcyBhIHVzZWQgdmFsdWUgb2YgJzAnLgorICAgIC8vICMxCisgICAgYXV0byB3
aWR0aCA9IGNvbXB1dGVkVmFsdWUoZm9ybWF0dGluZ0NvbnRleHRSb290LnN0eWxlKCkubG9naWNh
bFdpZHRoKCksIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOworICAgIGlmICgh
d2lkdGgpCisgICAgICAgIHdpZHRoID0gc2hyaW5rVG9GaXRXaWR0aChmb3JtYXR0aW5nQ29udGV4
dFJvb3QsIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOworCisgICAgLy8gIzIK
KyAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhv
cml6b250YWxNYXJnaW4oZm9ybWF0dGluZ0NvbnRleHRSb290LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMpOworCisgICAgcmV0dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7ICp3aWR0aCwgeyBjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwX2x1KSwgY29tcHV0ZWRIb3Jpem9u
dGFsTWFyZ2luLmVuZC52YWx1ZU9yKDBfbHUpIH0gfTsKK30KKworQ29udGVudEhlaWdodEFuZE1h
cmdpbiBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmlubGluZUJsb2NrQ29udGVu
dEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNh
bFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAoreworICAgIEFTU0VSVChs
YXlvdXRCb3guaXNJbkZsb3coKSk7CisKKyAgICAvLyAxMC42LjIgSW5saW5lIHJlcGxhY2VkIGVs
ZW1lbnRzLCBibG9jay1sZXZlbCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdywgJ2lu
bGluZS1ibG9jaycgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZsb2F0aW5n
IHJlcGxhY2VkIGVsZW1lbnRzCisgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCisg
ICAgICAgIHJldHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oZG93bmNh
c3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBv
dmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworCisgICAgLy8gMTAuNi42IENvbXBsaWNhdGVkIGNh
c2VzCisgICAgLy8gLSAnSW5saW5lLWJsb2NrJywgbm9uLXJlcGxhY2VkIGVsZW1lbnRzLgorICAg
IHJldHVybiBjb21wbGljYXRlZENhc2VzKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
LCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0
aW5nQ29udGV4dFF1aXJrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTFiZTY1ZGFkNWNjNWY1NmIyOWViMDcw
M2U2Y2RjOTQzOTBhYzJhNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dFF1aXJrcy5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVO
QUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiTGF5b3V0Qm94R2Vv
bWV0cnkuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0lu
bGluZUxheW91dFVuaXQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6aW5pdGlhbExp
bmVIZWlnaHQoKSBjb25zdAoreworICAgIC8vIE5lZ2F0aXZlIGxpbmVIZWlnaHQgdmFsdWUgbWVh
bnMgdGhlIGxpbmUtaGVpZ2h0IGlzIG5vdCBzZXQKKyAgICBhdXRvJiByb290ID0gZm9ybWF0dGlu
Z0NvbnRleHQoKS5yb290KCk7CisgICAgaWYgKGxheW91dFN0YXRlKCkuaW5TdGFuZGFyZHNNb2Rl
KCkgfHwgIXJvb3Quc3R5bGUoKS5saW5lSGVpZ2h0KCkuaXNOZWdhdGl2ZSgpKQorICAgICAgICBy
ZXR1cm4gcm9vdC5zdHlsZSgpLmNvbXB1dGVkTGluZUhlaWdodCgpOworICAgIHJldHVybiByb290
LnN0eWxlKCkuZm9udE1ldHJpY3MoKS5mbG9hdEhlaWdodCgpOworfQorCitib29sIElubGluZUZv
cm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OmlubGluZUxldmVsQm94QWZmZWN0c0xpbmVCb3goY29u
c3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94LCBjb25zdCBMaW5lQm94
JiBsaW5lQm94KSBjb25zdAoreworICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0xpbmVCcmVha0Jv
eCgpKSB7CisgICAgICAgIGlmIChsYXlvdXRTdGF0ZSgpLmluU3RhbmRhcmRzTW9kZSgpKQorICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIC8vIEluIHF1aXJrcyBtb2RlIGxpbmVicmVh
ayBib3hlcyAoPGJyPikgc3RvcCBhZmZlY3RpbmcgdGhlIGxpbmUgYm94IHdoZW4gKGFzc3VtZSA8
YnI+IGlzIG5lc3RlZCBlLmcuIDxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwMHB4Ij48YnI+PC9z
cGFuPikKKyAgICAgICAgLy8gMS4gdGhlIHJvb3QgaW5saW5lIGJveCBoYXMgY29udGVudCA8ZGl2
PmNvbnRlbnQ8YnI+L2Rpdj4KKyAgICAgICAgLy8gMi4gdGhlcmUncyBhdCBsZWFzdCBvbmUgYXRv
bWljIGlubGluZSBsZXZlbCBib3ggb24gdGhlIGxpbmUgZS5nIDxkaXY+PGltZz48YnI+PC9kaXY+
IG9yIDxkaXY+PHNwYW4+PGltZz48L3NwYW4+PGJyPjwvZGl2PgorICAgICAgICAvLyAzLiB0aGVy
ZSdzIGF0IGxlYXN0IG9uZSBpbmxpbmUgYm94IHdpdGggY29udGVudCBlLmcuIDxkaXY+PHNwYW4+
Y29udGVudDwvc3Bhbj48YnI+PC9kaXY+CisgICAgICAgIGlmIChsaW5lQm94LnJvb3RJbmxpbmVC
b3goKS5oYXNDb250ZW50KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlm
IChsaW5lQm94Lmhhc0F0b21pY0lubGluZUxldmVsQm94KCkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgZWl0aGVyIGhhdmUgb25seSB0aGUg
PGJyPiBvbiB0aGUgbGluZSBvciBpbmxpbmUgYm94ZXMgd2l0aCBvciB3aXRob3V0IGNvbnRlbnQu
CisgICAgICAgIGF1dG8mIGlubGluZUxldmVsQm94ZXMgPSBsaW5lQm94Lm5vblJvb3RJbmxpbmVM
ZXZlbEJveGVzKCk7CisgICAgICAgIEFTU0VSVCghaW5saW5lTGV2ZWxCb3hlcy5pc0VtcHR5KCkp
OworICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3hlcy5zaXplKCkgPT0gMSkKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBmb3IgKGF1dG8mIGlubGluZUxldmVsQm94IDogbGluZUJv
eC5ub25Sb290SW5saW5lTGV2ZWxCb3hlcygpKSB7CisgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0
IGVtcHR5IGlubGluZSBib3hlcyBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48
YnI+PC9kaXY+CisgICAgICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNJbmxpbmVCb3goKSAm
JiBpbmxpbmVMZXZlbEJveC5oYXNDb250ZW50KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoaW5s
aW5lTGV2ZWxCb3guaXNJbmxpbmVCb3goKSkgeworICAgICAgICAvLyBJbmxpbmUgYm94ZXMgKGUu
Zy4gcm9vdCBpbmxpbmUgYm94IG9yIDxzcGFuPikgYWZmZWN0cyBsaW5lIGJveGVzIGVpdGhlciB0
aHJvdWdoIHRoZSBzdHJ1dCBvciBhY3R1YWwgY29udGVudC4KKyAgICAgICAgYXV0byBpbmxpbmVC
b3hIYXNJbWFnaW5hcnlTdHJ1dCA9IGxheW91dFN0YXRlKCkuaW5TdGFuZGFyZHNNb2RlKCk7Cisg
ICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5oYXNDb250ZW50KCkgfHwgaW5saW5lQm94SGFzSW1h
Z2luYXJ5U3RydXQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlubGlu
ZUxldmVsQm94LmlzUm9vdElubGluZUJveCgpKSB7CisgICAgICAgICAgICBhdXRvIHNob3VsZFJv
b3RJbmxpbmVCb3hXaXRoTm9Db250ZW50U3RyZXRjaExpbmVCb3ggPSBbJl0geworICAgICAgICAg
ICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKS5zdHlsZSgpLmxpbmVIZWlnaHQo
KS5pc05lZ2F0aXZlKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgICAgICAgICAvLyBUaGUgcm9vdCBpbmxpbmUgYm94IHdpdGggbm9uLWluaXRpYWwgbGluZSBo
ZWlnaHQgdmFsdWUgc3RyZXRjaGVzIHRoZSBsaW5lIGJveCBldmVuIHdoZW4gcm9vdCBoYXMgbm8g
Y29udGVudAorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBpbmxp
bmUgYm94IHdpdGggY29udGVudC4KKyAgICAgICAgICAgICAgICAvLyBlLmcuIDxkaXYgc3R5bGU9
ImxpbmUtaGVpZ2h0OiAxMDBweDsiPjxzcGFuPmNvbnRlbnQ8L3NwYW4+PC9kaXY+CisgICAgICAg
ICAgICAgICAgaWYgKCFsaW5lQm94Lmhhc0lubGluZUJveCgpKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJv
eCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgeworICAgICAgICAgICAgICAg
ICAgICBpZiAoIWlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkpCisgICAgICAgICAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUxldmVsQm94
Lmhhc0NvbnRlbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICB9OworICAgICAgICAgICAgcmV0dXJuIHNob3VsZFJvb3RJbmxpbmVCb3hXaXRoTm9Db250ZW50
U3RyZXRjaExpbmVCb3goKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOb24tcm9vdCBpbmxpbmUg
Ym94ZXMgKGUuZy4gPHNwYW4+KS4KKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0
aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGlubGluZUxldmVsQm94LmxheW91dEJveCgpKTsK
KyAgICAgICAgaWYgKGJveEdlb21ldHJ5Lmhvcml6b250YWxCb3JkZXIoKSB8fCBib3hHZW9tZXRy
eS5ob3Jpem9udGFsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpIHsKKyAgICAgICAgICAgIC8vIEhv
cml6b250YWwgYm9yZGVyIGFuZCBwYWRkaW5nIG1ha2UgdGhlIGlubGluZSBib3ggc3RyZXRjaCB0
aGUgbGluZSAoZS5nLiA8c3BhbiBzdHlsZT0icGFkZGluZzogMTBweDsiPjwvc3Bhbj4pLgorICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKyAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKSB7
CisgICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAvLyBXaGlsZSBpbiBwcmFjdGljZSB3aGVu
IHRoZSBuZWdhdGl2ZSB2ZXJ0aWNhbCBtYXJnaW4gbWFrZXMgdGhlIGxheW91dCBib3VuZHMgZW1w
dHkgKGUuZzogaGVpZ2h0OiAxMDBweDsgbWFyZ2luLXRvcDogLTEwMHB4OyksIGFuZCB0aGlzIGlu
bGluZQorICAgICAgICAvLyBsZXZlbCBib3ggY29udHJpYnV0ZXMgMHB4IHRvIHRoZSBsaW5lIGJv
eCBoZWlnaHQsIGl0IHN0aWxsIG5lZWRzIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCB3aGlsZSBj
b21wdXRpbmcgbGluZSBib3ggZ2VvbWV0cmllcy4KKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkg
PSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGlubGluZUxldmVsQm94LmxheW91
dEJveCgpKTsKKyAgICAgICAgcmV0dXJuIGJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpIHx8IGJv
eEdlb21ldHJ5Lm1hcmdpbkFmdGVyKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwor
Ym9vbCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpoYXNTb2Z0V3JhcE9wcG9ydHVu
aXR5QXRJbWFnZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICFmb3JtYXR0aW5nQ29udGV4dCgpLnJv
b3QoKS5pc1RhYmxlQ2VsbCgpOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi44N2I2Yzk1YzE1NDVkNjQ1Y2RiZDRiMDU0NmFlYzE4NmNmM2NjZjVkCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxp
bmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAKQEAgLTAsMCArMSw0OSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0
aW5nU3RhdGUuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisj
aW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
bmFtZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChJbmxpbmVG
b3JtYXR0aW5nU3RhdGUpOworCitJbmxpbmVGb3JtYXR0aW5nU3RhdGU6OklubGluZUZvcm1hdHRp
bmdTdGF0ZShSZWY8RmxvYXRpbmdTdGF0ZT4mJiBmbG9hdGluZ1N0YXRlLCBMYXlvdXRTdGF0ZSYg
bGF5b3V0U3RhdGUpCisgICAgOiBGb3JtYXR0aW5nU3RhdGUoV1RGTW92ZShmbG9hdGluZ1N0YXRl
KSwgVHlwZTo6SW5saW5lLCBsYXlvdXRTdGF0ZSkKK3sKK30KKworSW5saW5lRm9ybWF0dGluZ1N0
YXRlOjp+SW5saW5lRm9ybWF0dGluZ1N0YXRlKCkKK3sKK30KKworfQorfQorI2VuZGlmCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZv
cm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRl
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uMzYzYjE2MDM2ODRlNTk0MDA3YTA4MjdiYzk0Y2I5N2I0YmEwMTc0Zgot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuaApAQCAtMCwwICsxLDEw
OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAq
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JN
QVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRl
ICJJbmxpbmVJdGVtLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgorI2luY2x1ZGUgIklu
bGluZUxpbmVHZW9tZXRyeS5oIgorI2luY2x1ZGUgIklubGluZUxpbmVSdW4uaCIKKyNpbmNsdWRl
IDx3dGYvSXNvTWFsbG9jLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlv
dXQgeworCit1c2luZyBJbmxpbmVJdGVtcyA9IFZlY3RvcjxJbmxpbmVJdGVtPjsKK3VzaW5nIElu
bGluZUxpbmVzID0gVmVjdG9yPElubGluZUxpbmVHZW9tZXRyeT47Cit1c2luZyBJbmxpbmVMaW5l
Qm94ZXMgPSBWZWN0b3I8TGluZUJveD47Cit1c2luZyBJbmxpbmVMaW5lUnVucyA9IFZlY3RvcjxM
aW5lUnVuPjsKKworLy8gSW5saW5lRm9ybWF0dGluZ1N0YXRlIGhvbGRzIHRoZSBzdGF0ZSBmb3Ig
YSBwYXJ0aWN1bGFyIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgdHJlZS4KK2NsYXNzIElubGlu
ZUZvcm1hdHRpbmdTdGF0ZSA6IHB1YmxpYyBGb3JtYXR0aW5nU3RhdGUgeworICAgIFdURl9NQUtF
X0lTT19BTExPQ0FURUQoSW5saW5lRm9ybWF0dGluZ1N0YXRlKTsKK3B1YmxpYzoKKyAgICBJbmxp
bmVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRlJik7Cisg
ICAgfklubGluZUZvcm1hdHRpbmdTdGF0ZSgpOworCisgICAgSW5saW5lSXRlbXMmIGlubGluZUl0
ZW1zKCkgeyByZXR1cm4gbV9pbmxpbmVJdGVtczsgfQorICAgIGNvbnN0IElubGluZUl0ZW1zJiBp
bmxpbmVJdGVtcygpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lSXRlbXM7IH0KKyAgICB2b2lkIGFk
ZElubGluZUl0ZW0oSW5saW5lSXRlbSYmIGlubGluZUl0ZW0pIHsgbV9pbmxpbmVJdGVtcy5hcHBl
bmQoV1RGTW92ZShpbmxpbmVJdGVtKSk7IH0KKworICAgIGNvbnN0IElubGluZUxpbmVzJiBsaW5l
cygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZXM7IH0KKyAgICBJbmxpbmVMaW5lcyYgbGluZXMoKSB7
IHJldHVybiBtX2xpbmVzOyB9CisgICAgdm9pZCBhZGRMaW5lKGNvbnN0IElubGluZUxpbmVHZW9t
ZXRyeSYgbGluZSkgeyBtX2xpbmVzLmFwcGVuZChsaW5lKTsgfQorCisgICAgY29uc3QgSW5saW5l
TGluZUJveGVzJiBsaW5lQm94ZXMoKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlczsgfQorICAg
IHZvaWQgYWRkTGluZUJveChMaW5lQm94JiYgbGluZUJveCkgeyBtX2xpbmVCb3hlcy5hcHBlbmQo
V1RGTW92ZShsaW5lQm94KSk7IH0KKworICAgIGNvbnN0IElubGluZUxpbmVSdW5zJiBsaW5lUnVu
cygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZVJ1bnM7IH0KKyAgICBJbmxpbmVMaW5lUnVucyYgbGlu
ZVJ1bnMoKSB7IHJldHVybiBtX2xpbmVSdW5zOyB9CisgICAgdm9pZCBhZGRMaW5lUnVuKExpbmVS
dW4mJiBydW4pIHsgbV9saW5lUnVucy5hcHBlbmQoV1RGTW92ZShydW4pKTsgfQorCisgICAgdm9p
ZCBzZXRDbGVhckdhcEFmdGVyTGFzdExpbmUoSW5saW5lTGF5b3V0VW5pdCB2ZXJ0aWNhbEdhcCk7
CisgICAgSW5saW5lTGF5b3V0VW5pdCBjbGVhckdhcEFmdGVyTGFzdExpbmUoKSBjb25zdCB7IHJl
dHVybiBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZTsgfQorCisgICAgdm9pZCBjbGVhckxpbmVBbmRS
dW5zKCk7CisgICAgdm9pZCBzaHJpbmtUb0ZpdCgpOworCitwcml2YXRlOgorICAgIC8vIENhY2hl
YWJsZSBpbnB1dCB0byBsaW5lIGxheW91dC4KKyAgICBJbmxpbmVJdGVtcyBtX2lubGluZUl0ZW1z
OworICAgIElubGluZUxpbmVzIG1fbGluZXM7CisgICAgSW5saW5lTGluZUJveGVzIG1fbGluZUJv
eGVzOworICAgIElubGluZUxpbmVSdW5zIG1fbGluZVJ1bnM7CisgICAgSW5saW5lTGF5b3V0VW5p
dCBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZSB7IDAgfTsKK307CisKK2lubGluZSB2b2lkIElubGlu
ZUZvcm1hdHRpbmdTdGF0ZTo6c2V0Q2xlYXJHYXBBZnRlckxhc3RMaW5lKElubGluZUxheW91dFVu
aXQgdmVydGljYWxHYXApCit7CisgICAgQVNTRVJUKHZlcnRpY2FsR2FwID49IDApOworICAgIG1f
Y2xlYXJHYXBBZnRlckxhc3RMaW5lID0gdmVydGljYWxHYXA7Cit9CisKK2lubGluZSB2b2lkIElu
bGluZUZvcm1hdHRpbmdTdGF0ZTo6Y2xlYXJMaW5lQW5kUnVucygpCit7CisgICAgbV9saW5lcy5j
bGVhcigpOworICAgIG1fbGluZUJveGVzLmNsZWFyKCk7CisgICAgbV9saW5lUnVucy5jbGVhcigp
OworICAgIG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lID0geyB9OworfQorCitpbmxpbmUgdm9pZCBJ
bmxpbmVGb3JtYXR0aW5nU3RhdGU6OnNocmlua1RvRml0KCkKK3sKKyAgICBtX2lubGluZUl0ZW1z
LnNocmlua1RvRml0KCk7CisgICAgbV9saW5lcy5zaHJpbmtUb0ZpdCgpOworICAgIG1fbGluZUJv
eGVzLnNocmlua1RvRml0KCk7CisgICAgbV9saW5lUnVucy5zaHJpbmtUb0ZpdCgpOworfQorCit9
Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUoSW5s
aW5lRm9ybWF0dGluZ1N0YXRlLCBpc0lubGluZUZvcm1hdHRpbmdTdGF0ZSgpKQorCisjZW5kaWYK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5s
aW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li4wNjA2ZjE4NDliNWE5YTYxODQ5YTIwZWJkNDE5NjVhNmFkZDhlYzg2Ci0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUl0ZW0uY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5saW5lSXRlbS5oIgorCisjaW5jbHVkZSAiSW5s
aW5lVGV4dEl0ZW0uaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQor
CituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworc3RydWN0IFNhbWVT
aXplQXNJbmxpbmVJdGVtIHsKKyAgICB2b2lkKiBsYXlvdXRCb3g7CisgICAgdWludDhfdCBlbnVt
MTsKKyAgICB1aW50OF90IGVudW0yOworICAgIGJvb2wgd2lkdGhCb29sOworICAgIGJvb2wgc29m
dEh5cGhlbkJvb2w7CisgICAgYm9vbCBpc1dvcmRTZXBhcmF0b3I7CisgICAgSW5saW5lTGF5b3V0
VW5pdCB3aWR0aDsKKyAgICB1bnNpZ25lZCBzdGFydDsKKyAgICB1bnNpZ25lZCBsZW5ndGg7Cit9
OworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihJbmxpbmVJdGVtKSA9PSBzaXplb2YoU2FtZVNpemVB
c0lubGluZUl0ZW0pLCAiIik7CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUl0
ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9y
bWF0dGluZy9JbmxpbmVJdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzJhZTI0YTYxMjY4NDU4ODc0YzcyMDk5
NDM4MmJhYjgyOTFkZGM0ZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmgKQEAgLTAs
MCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
CisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9V
VF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRl
ICJMYXlvdXRVbml0cy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0
IHsKKworY2xhc3MgSW5saW5lSXRlbSB7CitwdWJsaWM6CisgICAgZW51bSBjbGFzcyBUeXBlIDog
dWludDhfdCB7IFRleHQsIEhhcmRMaW5lQnJlYWssIFNvZnRMaW5lQnJlYWssIFdvcmRCcmVha09w
cG9ydHVuaXR5LCBCb3gsIEZsb2F0LCBJbmxpbmVCb3hTdGFydCwgSW5saW5lQm94RW5kIH07Cisg
ICAgSW5saW5lSXRlbShjb25zdCBCb3gmIGxheW91dEJveCwgVHlwZSk7CisKKyAgICBUeXBlIHR5
cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KKyAgICBjb25zdCBCb3gmIGxheW91dEJveCgp
IGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQorICAgIGNvbnN0IFJlbmRlclN0eWxlJiBz
dHlsZSgpIGNvbnN0IHsgcmV0dXJuIGxheW91dEJveCgpLnN0eWxlKCk7IH0KKworICAgIGJvb2wg
aXNUZXh0KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OlRleHQ7IH0KKyAgICBib29s
IGlzQm94KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OkJveDsgfQorICAgIGJvb2wg
aXNGbG9hdCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBUeXBlOjpGbG9hdDsgfQorICAgIGJv
b2wgaXNMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiBpc1NvZnRMaW5lQnJlYWsoKSB8fCBpc0hh
cmRMaW5lQnJlYWsoKTsgfQorICAgIGJvb2wgaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgpIGNvbnN0
IHsgcmV0dXJuIHR5cGUoKSA9PSBUeXBlOjpXb3JkQnJlYWtPcHBvcnR1bml0eTsgfQorICAgIGJv
b2wgaXNTb2Z0TGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OlNvZnRM
aW5lQnJlYWs7IH0KKyAgICBib29sIGlzSGFyZExpbmVCcmVhaygpIGNvbnN0IHsgcmV0dXJuIHR5
cGUoKSA9PSBUeXBlOjpIYXJkTGluZUJyZWFrOyB9CisgICAgYm9vbCBpc0lubGluZUJveFN0YXJ0
KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OklubGluZUJveFN0YXJ0OyB9CisgICAg
Ym9vbCBpc0lubGluZUJveEVuZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBUeXBlOjpJbmxp
bmVCb3hFbmQ7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBCb3gqIG1fbGF5b3V0Qm94IHsgbnVs
bHB0ciB9OworICAgIFR5cGUgbV90eXBlIHsgfTsKKworcHJvdGVjdGVkOgorICAgIC8vIEZvciBJ
bmxpbmVUZXh0SXRlbQorICAgIGVudW0gY2xhc3MgVGV4dEl0ZW1UeXBlICA6IHVpbnQ4X3QgeyBV
bmRlZmluZWQsIFdoaXRlc3BhY2UsIE5vbldoaXRlc3BhY2UgfTsKKyAgICBUZXh0SXRlbVR5cGUg
bV90ZXh0SXRlbVR5cGUgeyBUZXh0SXRlbVR5cGU6OlVuZGVmaW5lZCB9OworICAgIGJvb2wgbV9o
YXNXaWR0aCB7IGZhbHNlIH07CisgICAgYm9vbCBtX2hhc1RyYWlsaW5nU29mdEh5cGhlbiB7IGZh
bHNlIH07CisgICAgYm9vbCBtX2lzV29yZFNlcGFyYXRvciB7IGZhbHNlIH07CisgICAgSW5saW5l
TGF5b3V0VW5pdCBtX3dpZHRoIHsgfTsKKyAgICB1bnNpZ25lZCBtX2xlbmd0aCB7IDAgfTsKKwor
ICAgIC8vIEZvciBJbmxpbmVUZXh0SXRlbSBhbmQgSW5saW5lU29mdExpbmVCcmVha0l0ZW0KKyAg
ICB1bnNpZ25lZCBtX3N0YXJ0T3JQb3NpdGlvbiB7IDAgfTsKK307CisKK2lubGluZSBJbmxpbmVJ
dGVtOjpJbmxpbmVJdGVtKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBUeXBlIHR5cGUpCisgICAgOiBt
X2xheW91dEJveCgmbGF5b3V0Qm94KQorICAgICwgbV90eXBlKHR5cGUpCit7Cit9CisKKyNkZWZp
bmUgU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19JTkxJTkVfSVRFTShUb1ZhbHVlVHlwZU5hbWUsIHBy
ZWRpY2F0ZSkgXAorU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19CRUdJTihXZWJDb3JlOjpMYXlvdXQ6
OlRvVmFsdWVUeXBlTmFtZSkgXAorICAgIHN0YXRpYyBib29sIGlzVHlwZShjb25zdCBXZWJDb3Jl
OjpMYXlvdXQ6OklubGluZUl0ZW0mIGlubGluZUl0ZW0pIHsgcmV0dXJuIGlubGluZUl0ZW0ucHJl
ZGljYXRlOyB9IFwKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfRU5EKCkKKworfQorfQorI2VuZGlm
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uNWIzMzViYzQwZWVmYzljMjgzM2Q0ZDEzN2I0YTU4NDc4NzA3NTJmYwotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9y
bWF0dGluZy9JbmxpbmVMaW5lLmNwcApAQCAtMCwwICsxLDUzOSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbmxpbmVMaW5lLmgiCisKKyNpZiBFTkFCTEUo
TEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisj
aW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbmxpbmVTb2Z0
TGluZUJyZWFrSXRlbS5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVk
ZSAiUnVudGltZUVuYWJsZWRGZWF0dXJlcy5oIgorI2luY2x1ZGUgIlRleHRGbGFncy5oIgorI2lu
Y2x1ZGUgIlRleHRVdGlsLmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0xpbmU6OkxpbmUoY29u
c3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQorICAg
IDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAg
ICAsIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KG1fcnVucykKK3sKK30KKworTGluZTo6fkxp
bmUoKQoreworfQorCit2b2lkIExpbmU6OmluaXRpYWxpemUoKQoreworICAgIG1fbm9uU3Bhbm5p
bmdJbmxpbmVMZXZlbEJveENvdW50ID0gMDsKKyAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggPSB7
IH07CisgICAgbV9ydW5zLmNsZWFyKCk7CisgICAgbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9
IHsgfTsKKyAgICBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudC5yZXNldCgpOworfQorCit2b2lk
IExpbmU6OnJlbW92ZUNvbGxhcHNpYmxlQ29udGVudChJbmxpbmVMYXlvdXRVbml0IGV4dHJhSG9y
aXpvbnRhbFNwYWNlKQoreworICAgIHJlbW92ZVRyYWlsaW5nVHJpbW1hYmxlQ29udGVudCgpOwor
ICAgIHZpc3VhbGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KGV4dHJhSG9yaXpvbnRh
bFNwYWNlKTsKK30KKwordm9pZCBMaW5lOjphcHBseVJ1bkV4cGFuc2lvbihJbmxpbmVMYXlvdXRV
bml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKQoreworICAgIEFTU0VSVChmb3JtYXR0aW5nQ29udGV4
dCgpLnJvb3QoKS5zdHlsZSgpLnRleHRBbGlnbigpID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkp
OworICAgIC8vIFRleHQgaXMganVzdGlmaWVkIGFjY29yZGluZyB0byB0aGUgbWV0aG9kIHNwZWNp
ZmllZCBieSB0aGUgdGV4dC1qdXN0aWZ5IHByb3BlcnR5LAorICAgIC8vIGluIG9yZGVyIHRvIGV4
YWN0bHkgZmlsbCB0aGUgbGluZSBib3guIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRl
eHQtYWxpZ24tbGFzdCwKKyAgICAvLyB0aGUgbGFzdCBsaW5lIGJlZm9yZSBhIGZvcmNlZCBicmVh
ayBvciB0aGUgZW5kIG9mIHRoZSBibG9jayBpcyBzdGFydC1hbGlnbmVkLgorICAgIGlmIChtX3J1
bnMuaXNFbXB0eSgpIHx8IG1fcnVucy5sYXN0KCkuaXNMaW5lQnJlYWsoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgYXV0byBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50ID0gMDsKKyAgICBSdW4q
IGxhc3RSdW5XaXRoQ29udGVudCA9IG51bGxwdHI7CisgICAgLy8gQ29sbGVjdCBhbmQgZGlzdHJp
YnV0ZSB0aGUgZXhwYW5zaW9uIG9wcG9ydHVuaXRpZXMuCisgICAgZm9yIChhdXRvJiBydW4gOiBt
X3J1bnMpIHsKKyAgICAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCArPSBydW4uZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudCgpOworICAgICAgICBpZiAocnVuLmlzVGV4dCgpIHx8IHJ1bi5p
c0JveCgpKQorICAgICAgICAgICAgbGFzdFJ1bldpdGhDb250ZW50ID0gJnJ1bjsKKyAgICB9Cisg
ICAgLy8gTmVlZCB0byBmaXggdXAgdGhlIGxhc3QgcnVuJ3MgdHJhaWxpbmcgZXhwYW5zaW9uLgor
ICAgIGlmIChsYXN0UnVuV2l0aENvbnRlbnQgJiYgbGFzdFJ1bldpdGhDb250ZW50LT5oYXNFeHBh
bnNpb25PcHBvcnR1bml0eSgpKSB7CisgICAgICAgIC8vIFR1cm4gb2ZmIHRoZSB0cmFpbGluZyBi
aXRzIGZpcnN0IGFuZCBhZGQgdGhlIGZvcmJpZCB0cmFpbGluZyBleHBhbnNpb24uCisgICAgICAg
IGF1dG8gbGVhZGluZ0V4cGFuc2lvbiA9IGxhc3RSdW5XaXRoQ29udGVudC0+ZXhwYW5zaW9uQmVo
YXZpb3IoKSAmIExlZnRFeHBhbnNpb25NYXNrOworICAgICAgICBsYXN0UnVuV2l0aENvbnRlbnQt
PnNldEV4cGFuc2lvbkJlaGF2aW9yKGxlYWRpbmdFeHBhbnNpb24gfCBGb3JiaWRSaWdodEV4cGFu
c2lvbik7CisgICAgfQorICAgIC8vIEFueXRoaW5nIHRvIGRpc3RyaWJ1dGU/CisgICAgaWYgKCFl
eHBhbnNpb25PcHBvcnR1bml0eUNvdW50IHx8ICFleHRyYUhvcml6b250YWxTcGFjZSkKKyAgICAg
ICAgcmV0dXJuOworICAgIC8vIERpc3RyaWJ1dGUgdGhlIGV4dHJhIHNwYWNlLgorICAgIGF1dG8g
ZXhwYW5zaW9uVG9EaXN0cmlidXRlID0gZXh0cmFIb3Jpem9udGFsU3BhY2UgLyBleHBhbnNpb25P
cHBvcnR1bml0eUNvdW50OworICAgIGF1dG8gYWNjdW11bGF0ZWRFeHBhbnNpb24gPSBJbmxpbmVM
YXlvdXRVbml0IHsgfTsKKyAgICBmb3IgKGF1dG8mIHJ1biA6IG1fcnVucykgeworICAgICAgICAv
LyBFeHBhbmQgYW5kIG1vdmUgcnVucyBieSB0aGUgYWNjdW11bGF0ZWQgZXhwYW5zaW9uLgorICAg
ICAgICBydW4ubW92ZUhvcml6b250YWxseShhY2N1bXVsYXRlZEV4cGFuc2lvbik7CisgICAgICAg
IGlmICghcnVuLmhhc0V4cGFuc2lvbk9wcG9ydHVuaXR5KCkpCisgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgQVNTRVJUKHJ1bi5leHBhbnNpb25PcHBvcnR1bml0eUNvdW50KCkpOworICAg
ICAgICBhdXRvIGNvbXB1dGVkRXhwYW5zaW9uID0gZXhwYW5zaW9uVG9EaXN0cmlidXRlICogcnVu
LmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQoKTsKKyAgICAgICAgLy8gRklYTUU6IENoZWNrIHdo
eSB3ZSBuZWVkIHRvIHNldCBib3RoLgorICAgICAgICBydW4uc2V0SG9yaXpvbnRhbEV4cGFuc2lv
bihjb21wdXRlZEV4cGFuc2lvbik7CisgICAgICAgIHJ1bi5zaHJpbmtIb3Jpem9udGFsbHkoLWNv
bXB1dGVkRXhwYW5zaW9uKTsKKyAgICAgICAgYWNjdW11bGF0ZWRFeHBhbnNpb24gKz0gY29tcHV0
ZWRFeHBhbnNpb247CisgICAgfQorICAgIC8vIENvbnRlbnQgZ3Jvd3MgYXMgcnVucyBleHBhbmQu
CisgICAgbV9jb250ZW50TG9naWNhbFdpZHRoICs9IGFjY3VtdWxhdGVkRXhwYW5zaW9uOworfQor
Cit2b2lkIExpbmU6OnJlbW92ZVRyYWlsaW5nVHJpbW1hYmxlQ29udGVudCgpCit7CisgICAgaWYg
KG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmlzRW1wdHkoKSB8fCBtX3J1bnMuaXNFbXB0eSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDb21wbGV4IGxpbmUgbGF5b3V0IHF1aXJrOiBr
ZWVwIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGFyb3VuZCB3aGVuIGl0IGlzIGZvbGxvd2VkIGJ5
IGEgbGluZSBicmVhaywgdW5sZXNzIHRoZSBjb250ZW50IG92ZXJmbG93cyB0aGUgbGluZS4KKyAg
ICBpZiAoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c2hhcmVkRmVhdHVyZXMoKS5sYXlvdXRGb3Jt
YXR0aW5nQ29udGV4dEludGVncmF0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgIGF1dG8gaXNUZXh0
QWxpZ25SaWdodCA9IFsmXSB7CisgICAgICAgICAgICBhdXRvIHRleHRBbGlnbiA9IGZvcm1hdHRp
bmdDb250ZXh0KCkucm9vdCgpLnN0eWxlKCkudGV4dEFsaWduKCk7CisgICAgICAgICAgICByZXR1
cm4gdGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6OlJpZ2h0CisgICAgICAgICAgICAgICAgfHwg
dGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0CisgICAgICAgICAgICAgICAg
fHwgdGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6OkVuZDsKKyAgICAgICAgICAgIH0oKTsKKwor
ICAgICAgICBpZiAobV9ydW5zLmxhc3QoKS5pc0xpbmVCcmVhaygpICYmICFpc1RleHRBbGlnblJp
Z2h0KSB7CisgICAgICAgICAgICBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudC5yZXNldCgpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbV9jb250ZW50TG9n
aWNhbFdpZHRoIC09IG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlbW92ZSgpOworfQorCit2
b2lkIExpbmU6OnZpc3VhbGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KElubGluZUxh
eW91dFVuaXQgZXh0cmFIb3Jpem9udGFsU3BhY2UpCit7CisgICAgQVNTRVJUKG1fdHJpbW1hYmxl
VHJhaWxpbmdDb250ZW50LmlzRW1wdHkoKSk7CisgICAgLy8gSWYgd2hpdGUtc3BhY2UgaXMgc2V0
IHRvIHByZS13cmFwLCB0aGUgVUEgbXVzdAorICAgIC8vIC4uLgorICAgIC8vIEl0IG1heSBhbHNv
IHZpc3VhbGx5IGNvbGxhcHNlIHRoZSBjaGFyYWN0ZXIgYWR2YW5jZSB3aWR0aHMgb2YgYW55IHRo
YXQgd291bGQgb3RoZXJ3aXNlIG92ZXJmbG93LgorICAgIGF1dG8gb3ZlcmZsb3dXaWR0aCA9IC1l
eHRyYUhvcml6b250YWxTcGFjZTsKKyAgICBpZiAob3ZlcmZsb3dXaWR0aCA8PSAwKQorICAgICAg
ICByZXR1cm47CisgICAgLy8gTGV0J3MganVzdCBmaW5kIHRoZSB0cmFpbGluZyBwcmUtd3JhcCB3
aGl0ZXNwYWNlIGNvbnRlbnQgZm9yIG5vdyAoZS5nIGNoZWNrIGlmIHRoZXJlIGFyZSBtdWx0aXBs
ZSB0cmFpbGluZyBydW5zIHdpdGgKKyAgICAvLyBkaWZmZXJlbnQgc2V0IG9mIHdoaXRlLXNwYWNl
IHZhbHVlcyBhbmQgZGVjaWRlIGlmIHRoZSBpbi1iZXR3ZWVuIHByZS13cmFwIGNvbnRlbnQgc2hv
dWxkIGJlIGNvbGxhcHNlZCBhcyB3ZWxsLikKKyAgICBJbmxpbmVMYXlvdXRVbml0IHRyaW1tZWRD
b250ZW50V2lkdGggPSAwOworICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJzZWRS
YW5nZShtX3J1bnMpKSB7CisgICAgICAgIGlmIChydW4uc3R5bGUoKS53aGl0ZVNwYWNlKCkgIT0g
V2hpdGVTcGFjZTo6UHJlV3JhcCkgeworICAgICAgICAgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJl
c3RlZCBpbiBwcmUtd3JhcCB0cmFpbGluZyBjb250ZW50LgorICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgYXV0byBwcmVXcmFwVmlzdWFsbHlDb2xsYXBzaWJsZUlubGluZUl0
ZW0gPSBydW4uaXNJbmxpbmVCb3hTdGFydCgpIHx8IHJ1bi5pc0lubGluZUJveEVuZCgpIHx8IHJ1
bi5oYXNUcmFpbGluZ1doaXRlc3BhY2UoKTsKKyAgICAgICAgaWYgKCFwcmVXcmFwVmlzdWFsbHlD
b2xsYXBzaWJsZUlubGluZUl0ZW0pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgQVNTRVJU
KCFydW4uaGFzQ29sbGFwc2libGVUcmFpbGluZ1doaXRlc3BhY2UoKSk7CisgICAgICAgIElubGlu
ZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGggPSB7IH07CisgICAgICAgIGlmIChydW4uaXNUZXh0
KCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgYWx3YXlzIGNvbGxhcHNlIHRo
ZSBydW4gYXQgYSBnbHlwaCBib3VuZGFyeSBhcyB0aGUgc3BlYyBpbmRpY2F0ZXM6ICJjb2xsYXBz
ZSB0aGUgY2hhcmFjdGVyIGFkdmFuY2Ugd2lkdGhzIG9mIGFueSB0aGF0IHdvdWxkIG90aGVyd2lz
ZSBvdmVyZmxvdyIKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgdHJpbW1lZCB3aWR0aCBzaG91bGQg
YmUgY2FwcGVkIGF0IHN0ZDo6bWluKHJ1bi50cmFpbGluZ1doaXRlc3BhY2VXaWR0aCgpLCBvdmVy
Zmxvd1dpZHRoKSBmb3IgdGV4dCBydW5zLiBCb3RoIEZGIGFuZCBDaHJvbWUgYWdyZWUuCisgICAg
ICAgICAgICB0cmltbWFibGVXaWR0aCA9IHJ1bi50cmFpbGluZ1doaXRlc3BhY2VXaWR0aCgpOwor
ICAgICAgICAgICAgcnVuLnZpc3VhbGx5Q29sbGFwc2VUcmFpbGluZ1doaXRlc3BhY2UoKTsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyaW1tYWJsZVdpZHRoID0gcnVuLmxvZ2ljYWxX
aWR0aCgpOworICAgICAgICAgICAgcnVuLnNocmlua0hvcml6b250YWxseSh0cmltbWFibGVXaWR0
aCk7CisgICAgICAgIH0KKyAgICAgICAgdHJpbW1lZENvbnRlbnRXaWR0aCArPSB0cmltbWFibGVX
aWR0aDsKKyAgICAgICAgb3ZlcmZsb3dXaWR0aCAtPSB0cmltbWFibGVXaWR0aDsKKyAgICAgICAg
aWYgKG92ZXJmbG93V2lkdGggPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBt
X2NvbnRlbnRMb2dpY2FsV2lkdGggLT0gdHJpbW1lZENvbnRlbnRXaWR0aDsKK30KKwordm9pZCBM
aW5lOjphcHBlbmQoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsV2lkdGgpCit7CisgICAgaWYgKGlubGluZUl0ZW0uaXNUZXh0KCkpCisgICAgICAg
IGFwcGVuZFRleHRDb250ZW50KGRvd25jYXN0PElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKSwg
bG9naWNhbFdpZHRoKTsKKyAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkpCisg
ICAgICAgIGFwcGVuZExpbmVCcmVhayhpbmxpbmVJdGVtKTsKKyAgICBlbHNlIGlmIChpbmxpbmVJ
dGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkKKyAgICAgICAgYXBwZW5kV29yZEJyZWFrT3Bw
b3J0dW5pdHkoaW5saW5lSXRlbSk7CisgICAgZWxzZSBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJv
eFN0YXJ0KCkpCisgICAgICAgIGFwcGVuZElubGluZUJveFN0YXJ0KGlubGluZUl0ZW0sIGxvZ2lj
YWxXaWR0aCk7CisgICAgZWxzZSBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQorICAg
ICAgICBhcHBlbmRJbmxpbmVCb3hFbmQoaW5saW5lSXRlbSwgbG9naWNhbFdpZHRoKTsKKyAgICBl
bHNlIGlmIChpbmxpbmVJdGVtLmxheW91dEJveCgpLmlzUmVwbGFjZWRCb3goKSkKKyAgICAgICAg
YXBwZW5kUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgpOwor
ICAgIGVsc2UgaWYgKGlubGluZUl0ZW0uaXNCb3goKSkKKyAgICAgICAgYXBwZW5kTm9uUmVwbGFj
ZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgpOworICAgIGVsc2UKKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK3ZvaWQgTGluZTo6YXBwZW5kTm9uQnJl
YWthYmxlU3BhY2UoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7CisgICAgbV9y
dW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGxvZ2ljYWxMZWZ0LCBsb2dpY2FsV2lkdGggfSk7Cisg
ICAgbV9jb250ZW50TG9naWNhbFdpZHRoICs9IGxvZ2ljYWxXaWR0aDsKK30KKwordm9pZCBMaW5l
OjphcHBlbmRJbmxpbmVCb3hTdGFydChjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKK3sKKyAgICAvLyBUaGlzIGlzIHJlYWxseSBqdXN0
IGEgcGxhY2Vob2xkZXIgdG8gbWFyayB0aGUgc3RhcnQgb2YgdGhlIGlubGluZSBib3ggPHNwYW4+
LgorICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZv
ckJveChpbmxpbmVJdGVtLmxheW91dEJveCgpKTsKKyAgICBhdXRvIGFkanVzdGVkUnVuU3RhcnQg
PSBjb250ZW50TG9naWNhbFJpZ2h0KCkgKyBzdGQ6Om1pbihib3hHZW9tZXRyeS5tYXJnaW5TdGFy
dCgpLCAwX2x1KTsKKyAgICArK21fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50OworICAg
IGFwcGVuZE5vbkJyZWFrYWJsZVNwYWNlKGlubGluZUl0ZW0sIGFkanVzdGVkUnVuU3RhcnQsIGxv
Z2ljYWxXaWR0aCk7Cit9CisKK3ZvaWQgTGluZTo6YXBwZW5kSW5saW5lQm94RW5kKGNvbnN0IElu
bGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQorewor
ICAgIC8vIFRoaXMgaXMgcmVhbGx5IGp1c3QgYSBwbGFjZWhvbGRlciB0byBtYXJrIHRoZSBlbmQg
b2YgdGhlIGlubGluZSBib3ggPC9zcGFuPi4KKyAgICBhdXRvIHJlbW92ZVRyYWlsaW5nTGV0dGVy
U3BhY2luZyA9IFsmXSB7CisgICAgICAgIGlmICghbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQu
aXNUcmFpbGluZ1J1blBhcnRpYWxseVRyaW1tYWJsZSgpKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggLT0gbV90cmltbWFibGVUcmFpbGluZ0NvbnRl
bnQucmVtb3ZlUGFydGlhbGx5VHJpbW1hYmxlQ29udGVudCgpOworICAgIH07CisgICAgLy8gUHJl
dmVudCB0cmFpbGluZyBsZXR0ZXItc3BhY2luZyBmcm9tIHNwaWxsaW5nIG91dCBvZiB0aGUgaW5s
aW5lIGJveC4KKyAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jbGV0
dGVyLXNwYWNpbmctcHJvcGVydHkgU2VlIGV4YW1wbGUgMjEuCisgICAgcmVtb3ZlVHJhaWxpbmdM
ZXR0ZXJTcGFjaW5nKCk7CisgICAgYXBwZW5kTm9uQnJlYWthYmxlU3BhY2UoaW5saW5lSXRlbSwg
Y29udGVudExvZ2ljYWxXaWR0aCgpLCBsb2dpY2FsV2lkdGgpOworfQorCit2b2lkIExpbmU6OmFw
cGVuZFRleHRDb250ZW50KGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7CisgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVU
ZXh0SXRlbS5zdHlsZSgpOworICAgIGF1dG8gd2lsbENvbGxhcHNlQ29tcGxldGVseSA9IFsmXSB7
CisgICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc0VtcHR5Q29udGVudCgpKQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghaW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNl
KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChJbmxpbmVUZXh0SXRl
bTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtKSkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxhc3QgaXRlbSBpcyBj
b2xsYXBzZWQgYXMgd2VsbC4KKyAgICAgICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZl
cnNlZFJhbmdlKG1fcnVucykpIHsKKyAgICAgICAgICAgIGlmIChydW4uaXNCb3goKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAvLyBodHRwczovL2RyYWZ0cy5j
c3N3Zy5vcmcvY3NzLXRleHQtMy8jd2hpdGUtc3BhY2UtcGhhc2UtMQorICAgICAgICAgICAgLy8g
QW55IGNvbGxhcHNpYmxlIHNwYWNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhbm90aGVyIGNvbGxh
cHNpYmxlIHNwYWNl4oCUZXZlbiBvbmUgb3V0c2lkZSB0aGUgYm91bmRhcnkgb2YgdGhlIGlubGlu
ZSBjb250YWluaW5nIHRoYXQgc3BhY2UsCisgICAgICAgICAgICAvLyBwcm92aWRlZCBib3RoIHNw
YWNlcyBhcmUgd2l0aGluIHRoZSBzYW1lIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHTigJRpcyBj
b2xsYXBzZWQgdG8gaGF2ZSB6ZXJvIGFkdmFuY2Ugd2lkdGguCisgICAgICAgICAgICAvLyA6ICI8
c3Bhbj4gIDwvc3Bhbj4gIiA8LSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSBjb2xsYXBzZXMgY29t
cGxldGVseS4KKyAgICAgICAgICAgIC8vIE5vdCB0aGF0IHdoZW4gdGhlIGlubGluZSBib3ggaGFz
IHByZXNlcnZlIHdoaXRlc3BhY2Ugc3R5bGUsICI8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IHBy
ZSI+ICA8L3NwYW4+ICIgPC0gdGhpcyB3aGl0ZXNwYWNlIHN0YXlzIGFyb3VuZC4KKyAgICAgICAg
ICAgIGlmIChydW4uaXNUZXh0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bi5oYXNDb2xs
YXBzaWJsZVRyYWlsaW5nV2hpdGVzcGFjZSgpOworICAgICAgICAgICAgQVNTRVJUKHJ1bi5pc0lu
bGluZUJveFN0YXJ0KCkgfHwgcnVuLmlzSW5saW5lQm94RW5kKCkgfHwgcnVuLmlzV29yZEJyZWFr
T3Bwb3J0dW5pdHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTGVhZGluZyB3aGl0ZXNwYWNl
LgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgaWYgKHdpbGxDb2xsYXBzZUNv
bXBsZXRlbHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byBuZWVkc05ld1J1biA9IFsm
XSB7CisgICAgICAgIGlmIChtX3J1bnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIGF1dG8mIGxhc3RSdW4gPSBtX3J1bnMubGFzdCgpOworICAgICAgICBpZiAo
Jmxhc3RSdW4ubGF5b3V0Qm94KCkgIT0gJmlubGluZVRleHRJdGVtLmxheW91dEJveCgpKQorICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghbGFzdFJ1bi5pc1RleHQoKSkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAobGFzdFJ1bi5oYXNDb2xsYXBzZWRU
cmFpbGluZ1doaXRlc3BhY2UoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBp
ZiAoaW5saW5lVGV4dEl0ZW0uaXNXb3JkU2VwYXJhdG9yKCkgJiYgc3R5bGUuZm9udENhc2NhZGUo
KS53b3JkU3BhY2luZygpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9KCk7CisgICAgYXV0byBvbGRDb250ZW50TG9naWNhbFdpZHRoID0gY29u
dGVudExvZ2ljYWxXaWR0aCgpOworICAgIGlmIChuZWVkc05ld1J1bikgeworICAgICAgICAvLyBO
b3RlLCBuZWdhdGl2ZSB3b3JkcyBzcGFjaW5nIG1heSBjYXVzZSBnbHlwaCBvdmVybGFwLgorICAg
ICAgICBhdXRvIHJ1bkxvZ2ljYWxMZWZ0ID0gY29udGVudExvZ2ljYWxSaWdodCgpICsgKGlubGlu
ZVRleHRJdGVtLmlzV29yZFNlcGFyYXRvcigpID8gc3R5bGUuZm9udENhc2NhZGUoKS53b3JkU3Bh
Y2luZygpIDogMC4wZik7CisgICAgICAgIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVUZXh0SXRlbSwg
cnVuTG9naWNhbExlZnQsIGxvZ2ljYWxXaWR0aCB9KTsKKyAgICAgICAgbV9jb250ZW50TG9naWNh
bFdpZHRoID0gc3RkOjptYXgob2xkQ29udGVudExvZ2ljYWxXaWR0aCwgcnVuTG9naWNhbExlZnQg
KyBsb2dpY2FsV2lkdGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fcnVucy5sYXN0KCkuZXhw
YW5kKGlubGluZVRleHRJdGVtLCBsb2dpY2FsV2lkdGgpOworICAgICAgICAvLyBEbyBub3QgbGV0
IG5lZ2F0aXZlIGxldHRlciBzcGFjaW5nIG1ha2UgdGhlIGNvbnRlbnQgc2hvcnRlciB0aGFuIGl0
IGFscmVhZHkgaXMuCisgICAgICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCArPSBzdGQ6Om1heCgw
LjBmLCBsb2dpY2FsV2lkdGgpOworICAgIH0KKyAgICAvLyBTZXQgdGhlIHRyYWlsaW5nIHRyaW1t
YWJsZSBjb250ZW50LgorICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAh
SW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRl
bSkpIHsKKyAgICAgICAgbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuYWRkRnVsbHlUcmltbWFi
bGVDb250ZW50KG1fcnVucy5zaXplKCkgLSAxLCBjb250ZW50TG9naWNhbFdpZHRoKCkgLSBvbGRD
b250ZW50TG9naWNhbFdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBBbnkg
bm9uLXdoaXRlc3BhY2UsIG5vLXRyaW1tYWJsZSBjb250ZW50IHJlc2V0cyB0aGUgZXhpc3Rpbmcg
dHJpbW1hYmxlLgorICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlc2V0KCk7CisgICAg
aWYgKCFmb3JtYXR0aW5nQ29udGV4dCgpLmxheW91dFN0YXRlKCkuc2hvdWxkSWdub3JlVHJhaWxp
bmdMZXR0ZXJTcGFjaW5nKCkgJiYgIWlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpICYmIHN0
eWxlLmxldHRlclNwYWNpbmcoKSA+IDApCisgICAgICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250
ZW50LmFkZFBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQobV9ydW5zLnNpemUoKSAtIDEsIHN0eWxl
LmxldHRlclNwYWNpbmcoKSk7CisgICAgbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IGlubGlu
ZVRleHRJdGVtLmhhc1RyYWlsaW5nU29mdEh5cGhlbigpID8gbWFrZU9wdGlvbmFsKHN0eWxlLmZv
bnRDYXNjYWRlKCkud2lkdGgoVGV4dFJ1biB7IFN0cmluZ1ZpZXcgeyBzdHlsZS5oeXBoZW5TdHJp
bmcoKSB9IH0pKSA6IFdURjo6bnVsbG9wdDsKK30KKwordm9pZCBMaW5lOjphcHBlbmROb25SZXBs
YWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxh
eW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKQoreworICAgIG1fdHJpbW1hYmxlVHJhaWxp
bmdDb250ZW50LnJlc2V0KCk7CisgICAgbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IHsgfTsK
KyAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggKz0gbWFyZ2luQm94TG9naWNhbFdpZHRoOworICAg
ICsrbV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQ7CisgICAgYXV0byBtYXJnaW5TdGFy
dCA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goaW5saW5lSXRlbS5sYXlvdXRC
b3goKSkubWFyZ2luU3RhcnQoKTsKKyAgICBpZiAobWFyZ2luU3RhcnQgPj0gMCkgeworICAgICAg
ICBtX3J1bnMuYXBwZW5kKHsgaW5saW5lSXRlbSwgY29udGVudExvZ2ljYWxSaWdodCgpLCBtYXJn
aW5Cb3hMb2dpY2FsV2lkdGggfSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gTmVn
YXRpdmUgbWFyZ2luLXN0YXJ0IHB1bGxzIHRoZSBjb250ZW50IHRvIHRoZSBsb2dpY2FsIGxlZnQg
ZGlyZWN0aW9uLgorICAgIC8vIE5lZ2F0aXZlIG1hcmdpbiBhbHNvIHNxdWVlemVzIHRoZSBtYXJn
aW4gYm94LCB3ZSBuZWVkIHRvIHN0cmV0Y2ggaXQgdG8gbWFrZSBzdXJlIHRoZSBzdWJzZXF1ZW50
IGNvbnRlbnQgd29uJ3Qgb3ZlcmxhcC4KKyAgICAvLyBlLmcuIDxpbWcgc3R5bGU9IndpZHRoOiAx
MDBweDsgbWFyZ2luLWxlZnQ6IC0xMDBweDsiPiBwdWxscyB0aGUgcmVwbGFjZWQgYm94IHRvIC0x
MDBweCB3aXRoIHRoZSBtYXJnaW4gYm94IHdpZHRoIG9mIDBweC4KKyAgICAvLyBJbnN0ZWFkIHdl
IG5lZWQgdG8gcG9zaXRpb24gaXQgYXQgLTEwMHB4IGFuZCBzaXplIGl0IHRvIDEwMHB4IHNvIHRo
ZSBzdWJzZXF1ZW50IGNvbnRlbnQgc3RhcnRzIGF0IDBweC4gCisgICAgbV9ydW5zLmFwcGVuZCh7
IGlubGluZUl0ZW0sIGNvbnRlbnRMb2dpY2FsUmlnaHQoKSArIG1hcmdpblN0YXJ0LCBtYXJnaW5C
b3hMb2dpY2FsV2lkdGggLSBtYXJnaW5TdGFydCB9KTsKK30KKwordm9pZCBMaW5lOjphcHBlbmRS
ZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGlu
ZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKQoreworICAgIEFTU0VSVChpbmxpbmVJ
dGVtLmxheW91dEJveCgpLmlzUmVwbGFjZWRCb3goKSk7CisgICAgLy8gRklYTUU6IFN1cmVseSBy
ZXBsYWNlZCBib3hlcyBiZWhhdmUgZGlmZmVyZW50bHkuCisgICAgYXBwZW5kTm9uUmVwbGFjZWRJ
bmxpbmVMZXZlbEJveChpbmxpbmVJdGVtLCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGgpOworfQorCit2
b2lkIExpbmU6OmFwcGVuZExpbmVCcmVhayhjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQor
eworICAgIG1fdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPSB7IH07CisgICAgaWYgKGlubGluZUl0
ZW0uaXNIYXJkTGluZUJyZWFrKCkpIHsKKyAgICAgICAgKyttX25vblNwYW5uaW5nSW5saW5lTGV2
ZWxCb3hDb3VudDsKKyAgICAgICAgcmV0dXJuIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBj
b250ZW50TG9naWNhbFJpZ2h0KCksIDBfbHUgfSk7CisgICAgfQorICAgIC8vIFNvZnQgbGluZSBi
cmVha3MgKHByZXNlcnZlZCBuZXcgbGluZSBjaGFyYWN0ZXJzKSByZXF1aXJlIGlubGluZSB0ZXh0
IGJveGVzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCisgICAgQVNTRVJUKGlubGluZUl0ZW0u
aXNTb2Z0TGluZUJyZWFrKCkpOworICAgIG1fcnVucy5hcHBlbmQoeyBkb3duY2FzdDxJbmxpbmVT
b2Z0TGluZUJyZWFrSXRlbT4oaW5saW5lSXRlbSksIGNvbnRlbnRMb2dpY2FsUmlnaHQoKSB9KTsK
K30KKwordm9pZCBMaW5lOjphcHBlbmRXb3JkQnJlYWtPcHBvcnR1bml0eShjb25zdCBJbmxpbmVJ
dGVtJiBpbmxpbmVJdGVtKQoreworICAgIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBjb250
ZW50TG9naWNhbFJpZ2h0KCksIDBfbHUgfSk7Cit9CisKK3ZvaWQgTGluZTo6YWRkVHJhaWxpbmdI
eXBoZW4oSW5saW5lTGF5b3V0VW5pdCBoeXBoZW5Mb2dpY2FsV2lkdGgpCit7CisgICAgZm9yIChh
dXRvJiBydW4gOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKG1fcnVucykpIHsKKyAgICAgICAgaWYg
KCFydW4uaXNUZXh0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcnVuLnNldE5l
ZWRzSHlwaGVuKGh5cGhlbkxvZ2ljYWxXaWR0aCk7CisgICAgICAgIG1fY29udGVudExvZ2ljYWxX
aWR0aCArPSBoeXBoZW5Mb2dpY2FsV2lkdGg7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK2NvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0
JiBMaW5lOjpmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQ7Cit9CisKK0xpbmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6
VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KFJ1bkxpc3QmIHJ1bnMpCisgICAgOiBtX3J1bnMocnVu
cykKK3sKK30KKwordm9pZCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OmFkZEZ1bGx5
VHJpbW1hYmxlQ29udGVudChzaXplX3QgcnVuSW5kZXgsIElubGluZUxheW91dFVuaXQgdHJpbW1h
YmxlV2lkdGgpCit7CisgICAgLy8gQW55IHN1YnNlcXVlbnQgdHJpbW1hYmxlIHdoaXRlc3BhY2Ug
c2hvdWxkIGNvbGxhcHNlIHRvIHplcm8gYWR2YW5jZWQgd2lkdGggYW5kIGlnbm9yZWQgYXQgOjph
cHBlbmRUZXh0Q29udGVudCgpLgorICAgIEFTU0VSVCghbV9oYXNGdWxseVRyaW1tYWJsZUNvbnRl
bnQpOworICAgIG1fZnVsbHlUcmltbWFibGVXaWR0aCA9IHRyaW1tYWJsZVdpZHRoOworICAgIC8v
IE5vdGUgdGhhdCBqdXN0IGJlY2F1c2UgdGhlIHRyaW1tYWJsZSB3aWR0aCBpcyAwIChmb250LXNp
emU6IDBweCksIGl0IGRvZXMgbm90IG1lYW4gd2UgZG9uJ3QgaGF2ZSBhIHRyaW1tYWJsZSB0cmFp
bGluZyBjb250ZW50LgorICAgIG1faGFzRnVsbHlUcmltbWFibGVDb250ZW50ID0gdHJ1ZTsKKyAg
ICBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXggPSBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXgudmFs
dWVPcihydW5JbmRleCk7Cit9CisKK3ZvaWQgTGluZTo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50
OjphZGRQYXJ0aWFsbHlUcmltbWFibGVDb250ZW50KHNpemVfdCBydW5JbmRleCwgSW5saW5lTGF5
b3V0VW5pdCB0cmltbWFibGVXaWR0aCkKK3sKKyAgICAvLyBEbyBub3QgYWRkIHRyaW1tYWJsZSBs
ZXR0ZXIgc3BhY2luZyBhZnRlciBhIGZ1bGx5IHRyaW1tYWJsZSB3aGl0ZXNwYWNlLgorICAgIEFT
U0VSVCghbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4KTsKKyAgICBBU1NFUlQoIW1faGFzRnVsbHlU
cmltbWFibGVDb250ZW50KTsKKyAgICBBU1NFUlQoIW1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGgp
OworICAgIEFTU0VSVCh0cmltbWFibGVXaWR0aCk7CisgICAgbV9wYXJ0aWFsbHlUcmltbWFibGVX
aWR0aCA9IHRyaW1tYWJsZVdpZHRoOworICAgIG1fZmlyc3RUcmltbWFibGVSdW5JbmRleCA9IHJ1
bkluZGV4OworfQorCitJbmxpbmVMYXlvdXRVbml0IExpbmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29u
dGVudDo6cmVtb3ZlKCkKK3sKKyAgICAvLyBSZW1vdmUgdHJpbW1hYmxlIHRyYWlsaW5nIGNvbnRl
bnQgYW5kIG1vdmUgYWxsIHRoZSBzdWJzZXF1ZW50IHRyYWlsaW5nIHJ1bnMuCisgICAgLy8gPHNw
YW4+IDwvc3Bhbj48c3Bhbj48L3NwYW4+CisgICAgLy8gW3RyYWlsaW5nIHdoaXRlc3BhY2VdW2lu
bGluZSBib3ggZW5kXVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF0KKyAgICAvLyBU
cmltIHRoZSB3aGl0ZXNwYWNlIHJ1biBhbmQgbW92ZSB0aGUgdHJhaWxpbmcgaW5saW5lIGJveCBy
dW5zIHRvIHRoZSBsb2dpY2FsIGxlZnQuCisgICAgQVNTRVJUKCFpc0VtcHR5KCkpOworICAgIGF1
dG8mIHRyaW1tYWJsZVJ1biA9IG1fcnVuc1sqbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4XTsKKyAg
ICBBU1NFUlQodHJpbW1hYmxlUnVuLmlzVGV4dCgpKTsKKworICAgIGlmIChtX2hhc0Z1bGx5VHJp
bW1hYmxlQ29udGVudCkKKyAgICAgICAgdHJpbW1hYmxlUnVuLnJlbW92ZVRyYWlsaW5nV2hpdGVz
cGFjZSgpOworICAgIGlmIChtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRoKQorICAgICAgICB0cmlt
bWFibGVSdW4ucmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7CisKKyAgICBhdXRvIHRyaW1t
YWJsZVdpZHRoID0gd2lkdGgoKTsKKyAgICAvLyBXaGVuIHRoZSB0cmltbWFibGUgcnVuIGlzIGZv
bGxvd2VkIGJ5IHNvbWUgbm9uLWNvbnRlbnQgcnVucywgd2UgbmVlZCB0byBhZGp1c3QgdGhlaXIg
aG9yaXpvbnRhbCBwb3NpdGlvbnMuCisgICAgLy8gZS5nLiA8ZGl2PnRleHQgaXMgZm9sbG93ZWQg
YnkgdHJpbW1hYmxlIGNvbnRlbnQgICAgPHNwYW4+IDwvc3Bhbj48L2Rpdj4KKyAgICAvLyBXaGVu
IHRoZSBbdGV4dC4uLl0gcnVuIGlzIHRyaW1tZWQgKHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVt
b3ZlZCksIGJvdGggIjxzcGFuPiIgYW5kICI8L3NwYW4+IiBydW5zCisgICAgLy8gbmVlZCB0byBi
ZSBtb3ZlZCBob3Jpem9udGFsbHkgdG8gY2F0Y2ggdXAgd2l0aCB0aGUgW3RleHQuLi5dIHJ1bi4g
Tm90ZSB0aGF0IHRoZSB3aGl0ZXNwYWNlIGluc2lkZSB0aGUgPHNwYW4+IGRvZXMKKyAgICAvLyBu
b3QgcHJvZHVjZSBhIHJ1biBzaW5jZSBpbiA6OmFwcGVuZFRleHQoKSB3ZSBzZWUgaXQgYXMgYSBm
dWxseSBjb2xsYXBzaWJsZSBydW4uCisgICAgZm9yIChhdXRvIGluZGV4ID0gKm1fZmlyc3RUcmlt
bWFibGVSdW5JbmRleCArIDE7IGluZGV4IDwgbV9ydW5zLnNpemUoKTsgKytpbmRleCkgeworICAg
ICAgICBhdXRvJiBydW4gPSBtX3J1bnNbaW5kZXhdOworICAgICAgICBBU1NFUlQocnVuLmlzV29y
ZEJyZWFrT3Bwb3J0dW5pdHkoKSB8fCBydW4uaXNJbmxpbmVCb3hTdGFydCgpIHx8IHJ1bi5pc0lu
bGluZUJveEVuZCgpIHx8IHJ1bi5pc0xpbmVCcmVhaygpKTsKKyAgICAgICAgcnVuLm1vdmVIb3Jp
em9udGFsbHkoLXRyaW1tYWJsZVdpZHRoKTsKKyAgICB9CisgICAgaWYgKCF0cmltbWFibGVSdW4u
dGV4dENvbnRlbnQoKS0+bGVuZ3RoKCkpIHsKKyAgICAgICAgLy8gVGhpcyB0cmltbWFibGUgcnVu
IGlzIGZ1bGx5IGNvbGxhcHNlZCBub3cgKGUuZy4gPGRpdj48aW1nPiAgICA8c3Bhbj48L3NwYW4+
PC9kaXY+KS4KKyAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBrZWVwIGl0IGFyb3VuZCBhbnlt
b3JlLgorICAgICAgICBtX3J1bnMucmVtb3ZlKCptX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXgpOwor
ICAgIH0KKyAgICByZXNldCgpOworICAgIHJldHVybiB0cmltbWFibGVXaWR0aDsKK30KKworSW5s
aW5lTGF5b3V0VW5pdCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OnJlbW92ZVBhcnRp
YWxseVRyaW1tYWJsZUNvbnRlbnQoKQoreworICAgIC8vIFBhcnRpYWxseSB0cmltbWFibGUgY29u
dGVudCBpcyBhbHdheXMgZ2F0ZWQgYnkgYSBmdWxseSB0cmltbWFibGUgY29udGVudC4KKyAgICAv
LyBXZSBjYW4ndCBqdXN0IHRyaW0gc3BhY2luZyBpbiB0aGUgbWlkZGxlLgorICAgIEFTU0VSVCgh
bV9mdWxseVRyaW1tYWJsZVdpZHRoKTsKKyAgICByZXR1cm4gcmVtb3ZlKCk7Cit9CisKK0xpbmU6
OlJ1bjo6UnVuKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQg
bG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQorICAgIDogbV90eXBl
KGlubGluZUl0ZW0udHlwZSgpKQorICAgICwgbV9sYXlvdXRCb3goJmlubGluZUl0ZW0ubGF5b3V0
Qm94KCkpCisgICAgLCBtX2xvZ2ljYWxMZWZ0KGxvZ2ljYWxMZWZ0KQorICAgICwgbV9sb2dpY2Fs
V2lkdGgobG9naWNhbFdpZHRoKQoreworfQorCitMaW5lOjpSdW46OlJ1bihjb25zdCBJbmxpbmVT
b2Z0TGluZUJyZWFrSXRlbSYgc29mdExpbmVCcmVha0l0ZW0sIElubGluZUxheW91dFVuaXQgbG9n
aWNhbExlZnQpCisgICAgOiBtX3R5cGUoc29mdExpbmVCcmVha0l0ZW0udHlwZSgpKQorICAgICwg
bV9sYXlvdXRCb3goJnNvZnRMaW5lQnJlYWtJdGVtLmxheW91dEJveCgpKQorICAgICwgbV9sb2dp
Y2FsTGVmdChsb2dpY2FsTGVmdCkKKyAgICAsIG1fdGV4dENvbnRlbnQoeyBzb2Z0TGluZUJyZWFr
SXRlbS5wb3NpdGlvbigpLCAxLCBzb2Z0TGluZUJyZWFrSXRlbS5pbmxpbmVUZXh0Qm94KCkuY29u
dGVudCgpIH0pCit7Cit9CisKK0xpbmU6OlJ1bjo6UnVuKGNvbnN0IElubGluZVRleHRJdGVtJiBp
bmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsV2lkdGgpCisgICAgOiBtX3R5cGUoSW5saW5lSXRlbTo6VHlwZTo6VGV4dCkK
KyAgICAsIG1fbGF5b3V0Qm94KCZpbmxpbmVUZXh0SXRlbS5sYXlvdXRCb3goKSkKKyAgICAsIG1f
bG9naWNhbExlZnQobG9naWNhbExlZnQpCisgICAgLCBtX2xvZ2ljYWxXaWR0aChsb2dpY2FsV2lk
dGgpCisgICAgLCBtX3doaXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9ydHVuaXR5KCFUZXh0VXRpbDo6
c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtLmxheW91dEJveCgpKSkK
KyAgICAsIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSh0cmFpbGluZ1doaXRlc3BhY2VUeXBlKGlu
bGluZVRleHRJdGVtKSkKKyAgICAsIG1fdGV4dENvbnRlbnQoeyBpbmxpbmVUZXh0SXRlbS5zdGFy
dCgpLCBtX3RyYWlsaW5nV2hpdGVzcGFjZVR5cGUgPT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xs
YXBzZWQgPyAxIDogaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCksIGlubGluZVRleHRJdGVtLmlubGlu
ZVRleHRCb3goKS5jb250ZW50KCkgfSkKK3sKKyAgICBpZiAobV90cmFpbGluZ1doaXRlc3BhY2VU
eXBlICE9IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSkgeworICAgICAgICBtX3RyYWlsaW5nV2hp
dGVzcGFjZVdpZHRoID0gbG9naWNhbFdpZHRoOworICAgICAgICBpZiAobV93aGl0ZXNwYWNlSXNF
eHBhbnNpb25PcHBvcnR1bml0eSkKKyAgICAgICAgICAgIG1fZXhwYW5zaW9uT3Bwb3J0dW5pdHlD
b3VudCA9IDE7CisgICAgfQorfQorCit2b2lkIExpbmU6OlJ1bjo6ZXhwYW5kKGNvbnN0IElubGlu
ZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgp
Cit7CisgICAgLy8gRklYTUU6IFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBleHBhbnNpb24gbWVyZ2Uu
IFdlIHNob3VsZCBldmVudHVhbGx5IHN3aXRjaCBvdmVyIHRvIEZvbnRDYXNjYWRlOjpleHBhbnNp
b25PcHBvcnR1bml0eUNvdW50LgorICAgIEFTU0VSVCghaGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0
ZXNwYWNlKCkpOworICAgIEFTU0VSVChpc1RleHQoKSAmJiBpbmxpbmVUZXh0SXRlbS5pc1RleHQo
KSk7CisgICAgQVNTRVJUKG1fbGF5b3V0Qm94ID09ICZpbmxpbmVUZXh0SXRlbS5sYXlvdXRCb3go
KSk7CisKKyAgICBtX2xvZ2ljYWxXaWR0aCArPSBsb2dpY2FsV2lkdGg7CisgICAgbV90cmFpbGlu
Z1doaXRlc3BhY2VUeXBlID0gdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZShpbmxpbmVUZXh0SXRlbSk7
CisKKyAgICBpZiAobV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFj
ZTo6Tm9uZSkgeworICAgICAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0geyB9OworICAg
ICAgICBzZXRFeHBhbnNpb25CZWhhdmlvcihBbGxvd0xlZnRFeHBhbnNpb24gfCBBbGxvd1JpZ2h0
RXhwYW5zaW9uKTsKKyAgICAgICAgbV90ZXh0Q29udGVudC0+ZXhwYW5kKGlubGluZVRleHRJdGVt
Lmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX3RyYWlsaW5nV2hpdGVz
cGFjZVdpZHRoICs9IGxvZ2ljYWxXaWR0aDsKKyAgICBpZiAobV93aGl0ZXNwYWNlSXNFeHBhbnNp
b25PcHBvcnR1bml0eSkKKyAgICAgICAgKyttX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7Cisg
ICAgc2V0RXhwYW5zaW9uQmVoYXZpb3IoRGVmYXVsdEV4cGFuc2lvbik7CisgICAgbV90ZXh0Q29u
dGVudC0+ZXhwYW5kKG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9PSBUcmFpbGluZ1doaXRlc3Bh
Y2U6OkNvbGxhcHNlZCA/IDEgOiBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSk7Cit9CisKK2Jvb2wg
TGluZTo6UnVuOjpoYXNUcmFpbGluZ0xldHRlclNwYWNpbmcoKSBjb25zdAoreworICAgIHJldHVy
biAhaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkgJiYgc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCkgPiAw
OworfQorCitJbmxpbmVMYXlvdXRVbml0IExpbmU6OlJ1bjo6dHJhaWxpbmdMZXR0ZXJTcGFjaW5n
KCkgY29uc3QKK3sKKyAgICBpZiAoIWhhc1RyYWlsaW5nTGV0dGVyU3BhY2luZygpKQorICAgICAg
ICByZXR1cm4geyB9OworICAgIHJldHVybiBJbmxpbmVMYXlvdXRVbml0IHsgc3R5bGUoKS5sZXR0
ZXJTcGFjaW5nKCkgfTsKK30KKwordm9pZCBMaW5lOjpSdW46OnJlbW92ZVRyYWlsaW5nTGV0dGVy
U3BhY2luZygpCit7CisgICAgQVNTRVJUKGhhc1RyYWlsaW5nTGV0dGVyU3BhY2luZygpKTsKKyAg
ICBzaHJpbmtIb3Jpem9udGFsbHkodHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkpOworICAgIEFTU0VS
VChsb2dpY2FsV2lkdGgoKSA+IDAgfHwgKCFsb2dpY2FsV2lkdGgoKSAmJiBzdHlsZSgpLmxldHRl
clNwYWNpbmcoKSA+PSBzdGF0aWNfY2FzdDxmbG9hdD4oaW50TWF4Rm9yTGF5b3V0VW5pdCkpKTsK
K30KKwordm9pZCBMaW5lOjpSdW46OnJlbW92ZVRyYWlsaW5nV2hpdGVzcGFjZSgpCit7CisgICAg
Ly8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1z
cGFjZS1wcm9wZXJ0eSBtYXRyaXgKKyAgICAvLyBUcmltbWFibGUgd2hpdGVzcGFjZSBpcyBhbHdh
eXMgY29sbGFwc2libGUgc28gdGhlIGxlbmd0aCBvZiB0aGUgdHJhaWxpbmcgdHJpbW1hYmxlIHdo
aXRlc3BhY2UgaXMgYWx3YXlzIDEgKG9yIG5vbi1leGlzdGVudCkuCisgICAgQVNTRVJUKG1fdGV4
dENvbnRlbnQtPmxlbmd0aCgpKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IHRyYWlsaW5nVHJpbW1h
YmxlQ29udGVudExlbmd0aCA9IDE7CisgICAgbV90ZXh0Q29udGVudC0+c2hyaW5rKHRyYWlsaW5n
VHJpbW1hYmxlQ29udGVudExlbmd0aCk7CisgICAgdmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hp
dGVzcGFjZSgpOworfQorCit2b2lkIExpbmU6OlJ1bjo6dmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5n
V2hpdGVzcGFjZSgpCit7CisgICAgLy8gVGhpcyBpcyBqdXN0IGEgdmlzdWFsIGFkanVzdG1lbnQs
IHRoZSB0ZXh0IGxlbmd0aCBzaG91bGQgcmVtYWluIHRoZSBzYW1lLgorICAgIHNocmlua0hvcml6
b250YWxseShtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKTsKKyAgICBtX3RyYWlsaW5nV2hpdGVz
cGFjZVdpZHRoID0geyB9OworICAgIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9IFRyYWlsaW5n
V2hpdGVzcGFjZTo6Tm9uZTsKKworICAgIGlmIChtX3doaXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9y
dHVuaXR5KSB7CisgICAgICAgIEFTU0VSVChtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpOwor
ICAgICAgICBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQtLTsKKyAgICB9CisgICAgc2V0RXhw
YW5zaW9uQmVoYXZpb3IoQWxsb3dMZWZ0RXhwYW5zaW9uIHwgQWxsb3dSaWdodEV4cGFuc2lvbik7
Cit9CisKK3ZvaWQgTGluZTo6UnVuOjpzZXRFeHBhbnNpb25CZWhhdmlvcihFeHBhbnNpb25CZWhh
dmlvciBleHBhbnNpb25CZWhhdmlvcikKK3sKKyAgICBBU1NFUlQoaXNUZXh0KCkpOworICAgIG1f
ZXhwYW5zaW9uLmJlaGF2aW9yID0gZXhwYW5zaW9uQmVoYXZpb3I7Cit9CisKK0V4cGFuc2lvbkJl
aGF2aW9yIExpbmU6OlJ1bjo6ZXhwYW5zaW9uQmVoYXZpb3IoKSBjb25zdAoreworICAgIEFTU0VS
VChpc1RleHQoKSk7CisgICAgcmV0dXJuIG1fZXhwYW5zaW9uLmJlaGF2aW9yOworfQorCit2b2lk
IExpbmU6OlJ1bjo6c2V0SG9yaXpvbnRhbEV4cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxFeHBhbnNpb24pCit7CisgICAgQVNTRVJUKGlzVGV4dCgpKTsKKyAgICBBU1NFUlQoaGFzRXhw
YW5zaW9uT3Bwb3J0dW5pdHkoKSk7CisgICAgbV9leHBhbnNpb24uaG9yaXpvbnRhbEV4cGFuc2lv
biA9IGxvZ2ljYWxFeHBhbnNpb247Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcv
SW5saW5lTGluZS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mZTMzNTE5NTIxYWE5ZTRm
OTZhNzkzNGFlZDhjMDMyY2M5ZTc5M2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUu
aApAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5B
QkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVJdGVtLmgi
CisjaW5jbHVkZSAiSW5saW5lTGluZVJ1bi5oIgorI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgi
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDsKK2NsYXNzIElubGluZVNvZnRMaW5lQnJlYWtJdGVtOworCitj
bGFzcyBMaW5lIHsKK3B1YmxpYzoKKyAgICBMaW5lKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250
ZXh0Jik7CisgICAgfkxpbmUoKTsKKworICAgIHZvaWQgaW5pdGlhbGl6ZSgpOworCisgICAgdm9p
ZCBhcHBlbmQoY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRo
KTsKKworICAgIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCgpIGNvbnN0IHsg
cmV0dXJuIG1fY29udGVudExvZ2ljYWxXaWR0aDsgfQorICAgIElubGluZUxheW91dFVuaXQgY29u
dGVudExvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fcnVucy5pc0VtcHR5KCkgPyAwLjBm
IDogbV9ydW5zLmxhc3QoKS5sb2dpY2FsUmlnaHQoKTsgfQorICAgIHNpemVfdCBub25TcGFubmlu
Z0lubGluZUxldmVsQm94Q291bnQoKSBjb25zdCB7IHJldHVybiBtX25vblNwYW5uaW5nSW5saW5l
TGV2ZWxCb3hDb3VudDsgfQorCisgICAgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVUcmFpbGlu
Z1dpZHRoKCkgY29uc3QgeyByZXR1cm4gbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQud2lkdGgo
KTsgfQorICAgIGJvb2wgaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxlKCkgY29uc3QgeyByZXR1
cm4gbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxl
KCk7IH0KKworICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHRyYWlsaW5nU29mdEh5cGhl
bldpZHRoKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aDsgfQorICAg
IHZvaWQgYWRkVHJhaWxpbmdIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBoeXBoZW5Mb2dpY2FsV2lk
dGgpOworCisgICAgdm9pZCByZW1vdmVDb2xsYXBzaWJsZUNvbnRlbnQoSW5saW5lTGF5b3V0VW5p
dCBleHRyYUhvcml6b250YWxTcGFjZSk7CisgICAgdm9pZCBhcHBseVJ1bkV4cGFuc2lvbihJbmxp
bmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKTsKKworICAgIHN0cnVjdCBSdW4gewor
ICAgICAgICBib29sIGlzVGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVt
OjpUeXBlOjpUZXh0OyB9CisgICAgICAgIGJvb2wgaXNCb3goKSBjb25zdCB7IHJldHVybiBtX3R5
cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6Qm94OyB9CisgICAgICAgIGJvb2wgaXNMaW5lQnJlYWso
KSBjb25zdCB7IHJldHVybiBpc0hhcmRMaW5lQnJlYWsoKSB8fCBpc1NvZnRMaW5lQnJlYWsoKTsg
fQorICAgICAgICBib29sIGlzU29mdExpbmVCcmVhaygpIGNvbnN0ICB7IHJldHVybiBtX3R5cGUg
PT0gSW5saW5lSXRlbTo6VHlwZTo6U29mdExpbmVCcmVhazsgfQorICAgICAgICBib29sIGlzSGFy
ZExpbmVCcmVhaygpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpUeXBlOjpI
YXJkTGluZUJyZWFrOyB9CisgICAgICAgIGJvb2wgaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgpIGNv
bnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpUeXBlOjpXb3JkQnJlYWtPcHBvcnR1
bml0eTsgfQorICAgICAgICBib29sIGlzSW5saW5lQm94U3RhcnQoKSBjb25zdCB7IHJldHVybiBt
X3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94U3RhcnQ7IH0KKyAgICAgICAgYm9v
bCBpc0lubGluZUJveEVuZCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpU
eXBlOjpJbmxpbmVCb3hFbmQ7IH0KKworICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNv
bnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQorICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYg
c3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJveC0+c3R5bGUoKTsgfQorICAgICAgICBj
b25zdCBPcHRpb25hbDxMaW5lUnVuOjpUZXh0PiYgdGV4dENvbnRlbnQoKSBjb25zdCB7IHJldHVy
biBtX3RleHRDb250ZW50OyB9CisKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lk
dGgoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxXaWR0aDsgfQorICAgICAgICBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxMZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsTGVmdDsgfQorICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2lj
YWxMZWZ0KCkgKyBsb2dpY2FsV2lkdGgoKTsgfQorCisgICAgICAgIGNvbnN0IExpbmVSdW46OkV4
cGFuc2lvbiYgZXhwYW5zaW9uKCkgY29uc3QgeyByZXR1cm4gbV9leHBhbnNpb247IH0KKyAgICAg
ICAgYm9vbCBoYXNFeHBhbnNpb25PcHBvcnR1bml0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudDsgfQorICAgICAgICBFeHBhbnNpb25CZWhhdmlvciBleHBhbnNp
b25CZWhhdmlvcigpIGNvbnN0OworICAgICAgICB1bnNpZ25lZCBleHBhbnNpb25PcHBvcnR1bml0
eUNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9leHBhbnNpb25PcHBvcnR1bml0eUNvdW50OyB9CisK
KyAgICAgICAgYm9vbCBoYXNUcmFpbGluZ1doaXRlc3BhY2UoKSBjb25zdCB7IHJldHVybiBtX3Ry
YWlsaW5nV2hpdGVzcGFjZVR5cGUgIT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25lOyB9CisgICAg
ICAgIElubGluZUxheW91dFVuaXQgdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoKSBjb25zdCB7IHJl
dHVybiBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoOyB9CisKKyAgICBwcml2YXRlOgorICAgICAg
ICBmcmllbmQgY2xhc3MgTGluZTsKKworICAgICAgICBSdW4oY29uc3QgSW5saW5lVGV4dEl0ZW0m
LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxX
aWR0aCk7CisgICAgICAgIFJ1bihjb25zdCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSYsIElubGlu
ZUxheW91dFVuaXQgbG9naWNhbExlZnQpOworICAgICAgICBSdW4oY29uc3QgSW5saW5lSXRlbSYs
IElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdp
ZHRoKTsKKworICAgICAgICB2b2lkIGV4cGFuZChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIElubGlu
ZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICAgICAgdm9pZCBtb3ZlSG9yaXpvbnRhbGx5
KElubGluZUxheW91dFVuaXQgb2Zmc2V0KSB7IG1fbG9naWNhbExlZnQgKz0gb2Zmc2V0OyB9Cisg
ICAgICAgIHZvaWQgc2hyaW5rSG9yaXpvbnRhbGx5KElubGluZUxheW91dFVuaXQgd2lkdGgpIHsg
bV9sb2dpY2FsV2lkdGggLT0gd2lkdGg7IH0KKyAgICAgICAgdm9pZCBzZXRFeHBhbnNpb25CZWhh
dmlvcihFeHBhbnNpb25CZWhhdmlvcik7CisgICAgICAgIHZvaWQgc2V0SG9yaXpvbnRhbEV4cGFu
c2lvbihJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxFeHBhbnNpb24pOworICAgICAgICB2b2lkIHNl
dE5lZWRzSHlwaGVuKElubGluZUxheW91dFVuaXQgaHlwaGVuTG9naWNhbFdpZHRoKTsKKworICAg
ICAgICBlbnVtIGNsYXNzIFRyYWlsaW5nV2hpdGVzcGFjZSB7CisgICAgICAgICAgICBOb25lLAor
ICAgICAgICAgICAgTm90Q29sbGFwc2libGUsCisgICAgICAgICAgICBDb2xsYXBzaWJsZSwKKyAg
ICAgICAgICAgIENvbGxhcHNlZAorICAgICAgICB9OworICAgICAgICBib29sIGhhc0NvbGxhcHNp
YmxlVHJhaWxpbmdXaGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3Bh
Y2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Q29sbGFwc2libGUgfHwgaGFzQ29sbGFwc2Vk
VHJhaWxpbmdXaGl0ZXNwYWNlKCk7IH0KKyAgICAgICAgYm9vbCBoYXNDb2xsYXBzZWRUcmFpbGlu
Z1doaXRlc3BhY2UoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nV2hpdGVzcGFjZVR5cGUgPT0g
VHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQ7IH0KKyAgICAgICAgVHJhaWxpbmdXaGl0ZXNw
YWNlIHRyYWlsaW5nV2hpdGVzcGFjZVR5cGUoY29uc3QgSW5saW5lVGV4dEl0ZW0mKSBjb25zdDsK
KyAgICAgICAgdm9pZCByZW1vdmVUcmFpbGluZ1doaXRlc3BhY2UoKTsKKyAgICAgICAgdm9pZCB2
aXN1YWxseUNvbGxhcHNlVHJhaWxpbmdXaGl0ZXNwYWNlKCk7CisKKyAgICAgICAgYm9vbCBoYXNU
cmFpbGluZ0xldHRlclNwYWNpbmcoKSBjb25zdDsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB0
cmFpbGluZ0xldHRlclNwYWNpbmcoKSBjb25zdDsKKyAgICAgICAgdm9pZCByZW1vdmVUcmFpbGlu
Z0xldHRlclNwYWNpbmcoKTsKKworICAgICAgICBJbmxpbmVJdGVtOjpUeXBlIG1fdHlwZSB7IElu
bGluZUl0ZW06OlR5cGU6OlRleHQgfTsKKyAgICAgICAgY29uc3QgQm94KiBtX2xheW91dEJveCB7
IG51bGxwdHIgfTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2xvZ2ljYWxMZWZ0IHsgMCB9
OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fbG9naWNhbFdpZHRoIHsgMCB9OworICAgICAg
ICBib29sIG1fd2hpdGVzcGFjZUlzRXhwYW5zaW9uT3Bwb3J0dW5pdHkgeyBmYWxzZSB9OworICAg
ICAgICBUcmFpbGluZ1doaXRlc3BhY2UgbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlIHsgVHJhaWxp
bmdXaGl0ZXNwYWNlOjpOb25lIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV90cmFpbGlu
Z1doaXRlc3BhY2VXaWR0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8TGluZVJ1bjo6VGV4dD4g
bV90ZXh0Q29udGVudDsKKyAgICAgICAgTGluZVJ1bjo6RXhwYW5zaW9uIG1fZXhwYW5zaW9uOwor
ICAgICAgICB1bnNpZ25lZCBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQgeyAwIH07CisgICAg
fTsKKyAgICB1c2luZyBSdW5MaXN0ID0gVmVjdG9yPFJ1biwgMTA+OworICAgIGNvbnN0IFJ1bkxp
c3QmIHJ1bnMoKSBjb25zdCB7IHJldHVybiBtX3J1bnM7IH0KKworcHJpdmF0ZToKKyAgICB2b2lk
IGFwcGVuZE5vbkJyZWFrYWJsZVNwYWNlKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7CisgICAgdm9p
ZCBhcHBlbmRUZXh0Q29udGVudChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIElubGluZUxheW91dFVu
aXQgbG9naWNhbFdpZHRoKTsKKyAgICB2b2lkIGFwcGVuZE5vblJlcGxhY2VkSW5saW5lTGV2ZWxC
b3goY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdp
ZHRoKTsKKyAgICB2b2lkIGFwcGVuZFJlcGxhY2VkSW5saW5lTGV2ZWxCb3goY29uc3QgSW5saW5l
SXRlbSYsIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKTsKKyAgICB2b2lk
IGFwcGVuZElubGluZUJveFN0YXJ0KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0
IGxvZ2ljYWxXaWR0aCk7CisgICAgdm9pZCBhcHBlbmRJbmxpbmVCb3hFbmQoY29uc3QgSW5saW5l
SXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICB2b2lkIGFwcGVuZExp
bmVCcmVhayhjb25zdCBJbmxpbmVJdGVtJik7CisgICAgdm9pZCBhcHBlbmRXb3JkQnJlYWtPcHBv
cnR1bml0eShjb25zdCBJbmxpbmVJdGVtJik7CisKKyAgICB2b2lkIHJlbW92ZVRyYWlsaW5nVHJp
bW1hYmxlQ29udGVudCgpOworICAgIHZvaWQgdmlzdWFsbHlDb2xsYXBzZVByZVdyYXBPdmVyZmxv
d0NvbnRlbnQoSW5saW5lTGF5b3V0VW5pdCBleHRyYUhvcml6b250YWxTcGFjZSk7CisKKyAgICBj
b25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdDsK
KworICAgIHN0cnVjdCBUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQgeworICAgICAgICBUcmltbWFi
bGVUcmFpbGluZ0NvbnRlbnQoUnVuTGlzdCYpOworCisgICAgICAgIHZvaWQgYWRkRnVsbHlUcmlt
bWFibGVDb250ZW50KHNpemVfdCBydW5JbmRleCwgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVX
aWR0aCk7CisgICAgICAgIHZvaWQgYWRkUGFydGlhbGx5VHJpbW1hYmxlQ29udGVudChzaXplX3Qg
cnVuSW5kZXgsIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpOworICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IHJlbW92ZSgpOworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHJlbW92ZVBh
cnRpYWxseVRyaW1tYWJsZUNvbnRlbnQoKTsKKworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHdp
ZHRoKCkgY29uc3QgeyByZXR1cm4gbV9mdWxseVRyaW1tYWJsZVdpZHRoICsgbV9wYXJ0aWFsbHlU
cmltbWFibGVXaWR0aDsgfQorICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAh
bV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4Lmhhc1ZhbHVlKCk7IH0KKyAgICAgICAgYm9vbCBpc1Ry
YWlsaW5nUnVuRnVsbHlUcmltbWFibGUoKSBjb25zdCB7IHJldHVybiBtX2hhc0Z1bGx5VHJpbW1h
YmxlQ29udGVudDsgfQorICAgICAgICBib29sIGlzVHJhaWxpbmdSdW5QYXJ0aWFsbHlUcmltbWFi
bGUoKSBjb25zdCB7IHJldHVybiBtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRoOyB9CisKKyAgICAg
ICAgdm9pZCByZXNldCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUnVuTGlzdCYgbV9ydW5z
OworICAgICAgICBPcHRpb25hbDxzaXplX3Q+IG1fZmlyc3RUcmltbWFibGVSdW5JbmRleDsKKyAg
ICAgICAgYm9vbCBtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCB7IGZhbHNlIH07CisgICAgICAg
IElubGluZUxheW91dFVuaXQgbV9mdWxseVRyaW1tYWJsZVdpZHRoIHsgMCB9OworICAgICAgICBJ
bmxpbmVMYXlvdXRVbml0IG1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGggeyAwIH07CisgICAgfTsK
KworICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBtX2lubGluZUZvcm1hdHRpbmdD
b250ZXh0OworICAgIFJ1bkxpc3QgbV9ydW5zOworICAgIFRyaW1tYWJsZVRyYWlsaW5nQ29udGVu
dCBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudDsKKyAgICBJbmxpbmVMYXlvdXRVbml0IG1fY29u
dGVudExvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICBzaXplX3QgbV9ub25TcGFubmluZ0lubGluZUxl
dmVsQm94Q291bnQgeyAwIH07CisgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gbV90cmFp
bGluZ1NvZnRIeXBoZW5XaWR0aCB7IDAgfTsKK307CisKK2lubGluZSB2b2lkIExpbmU6OlRyaW1t
YWJsZVRyYWlsaW5nQ29udGVudDo6cmVzZXQoKQoreworICAgIG1faGFzRnVsbHlUcmltbWFibGVD
b250ZW50ID0gZmFsc2U7CisgICAgbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4ID0geyB9OworICAg
IG1fZnVsbHlUcmltbWFibGVXaWR0aCA9IHsgfTsKKyAgICBtX3BhcnRpYWxseVRyaW1tYWJsZVdp
ZHRoID0geyB9OworfQorCitpbmxpbmUgTGluZTo6UnVuOjpUcmFpbGluZ1doaXRlc3BhY2UgTGlu
ZTo6UnVuOjp0cmFpbGluZ1doaXRlc3BhY2VUeXBlKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxp
bmVUZXh0SXRlbSkgY29uc3QKK3sKKyAgICBpZiAoIWlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFj
ZSgpKQorICAgICAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25lOworICAgIGlmIChJ
bmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVt
KSkKKyAgICAgICAgcmV0dXJuIFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm90Q29sbGFwc2libGU7Cisg
ICAgaWYgKGlubGluZVRleHRJdGVtLmxlbmd0aCgpID09IDEpCisgICAgICAgIHJldHVybiBUcmFp
bGluZ1doaXRlc3BhY2U6OkNvbGxhcHNpYmxlOworICAgIHJldHVybiBUcmFpbGluZ1doaXRlc3Bh
Y2U6OkNvbGxhcHNlZDsKK30KKworaW5saW5lIHZvaWQgTGluZTo6UnVuOjpzZXROZWVkc0h5cGhl
bihJbmxpbmVMYXlvdXRVbml0IGh5cGhlbkxvZ2ljYWxXaWR0aCkKK3sKKyAgICBBU1NFUlQobV90
ZXh0Q29udGVudCk7CisgICAgbV90ZXh0Q29udGVudC0+c2V0TmVlZHNIeXBoZW4oKTsKKyAgICBt
X2xvZ2ljYWxXaWR0aCArPSBoeXBoZW5Mb2dpY2FsV2lkdGg7Cit9CisKK30KK30KKyNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxp
bmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLmVkMjEzYWUwMWNhYTM5NWE3OTg0MjExOGI5OTk3MjMxZThkMjBlMjkKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5jcHAKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgor
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
KyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgorCisj
aWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRC
b3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworTGluZUJveDo6SW5saW5lTGV2ZWxC
b3g6OklubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlvdXRVbml0
IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIGxvZ2ljYWxTaXplLCBUeXBlIHR5cGUpCisg
ICAgOiBtX2xheW91dEJveChtYWtlV2Vha1B0cihsYXlvdXRCb3gpKQorICAgICwgbV9sb2dpY2Fs
UmVjdCh7IH0sIGxvZ2ljYWxMZWZ0LCBsb2dpY2FsU2l6ZS53aWR0aCgpLCBsb2dpY2FsU2l6ZS5o
ZWlnaHQoKSkKKyAgICAsIG1fdHlwZSh0eXBlKQoreworfQorCit2b2lkIExpbmVCb3g6OklubGlu
ZUxldmVsQm94OjpzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKQoreworICAg
IC8vIEZJWE1FOiBSZW1vdmUgbGVnYWN5IHJvdW5kaW5nLgorICAgIG1fYmFzZWxpbmUgPSByb3Vu
ZFRvSW50KGJhc2VsaW5lKTsKK30KKwordm9pZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0
RGVzY2VudChJbmxpbmVMYXlvdXRVbml0IGRlc2NlbnQpCit7CisgICAgLy8gRklYTUU6IFJlbW92
ZSBsZWdhY3kgcm91bmRpbmcuCisgICAgbV9kZXNjZW50ID0gcm91bmRUb0ludChkZXNjZW50KTsK
K30KKwordm9pZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0TGF5b3V0Qm91bmRzKGNvbnN0
IExheW91dEJvdW5kcyYgbGF5b3V0Qm91bmRzKQoreworICAgIC8vIEZJWE1FOiBSZW1vdmUgbGVn
YWN5IHJvdW5kaW5nLgorICAgIG1fbGF5b3V0Qm91bmRzID0geyBJbmxpbmVMYXlvdXRVbml0KHJv
dW5kVG9JbnQobGF5b3V0Qm91bmRzLmFzY2VudCkpLCBJbmxpbmVMYXlvdXRVbml0KHJvdW5kVG9J
bnQobGF5b3V0Qm91bmRzLmRlc2NlbnQpKSB9OworfQorCit2b2lkIExpbmVCb3g6OklubGluZUxl
dmVsQm94OjpzZXRMb2dpY2FsVG9wKElubGluZUxheW91dFVuaXQgbG9naWNhbFRvcCkKK3sKKyAg
ICAvLyBGSVhNRTogUmVtb3ZlIGxlZ2FjeSByb3VuZGluZy4KKyAgICBtX2xvZ2ljYWxSZWN0LnNl
dFRvcChyb3VuZFRvSW50KGxvZ2ljYWxUb3ApKTsKK30KKwordm9pZCBMaW5lQm94OjpJbmxpbmVM
ZXZlbEJveDo6c2V0TG9naWNhbEhlaWdodChJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQp
Cit7CisgICAgLy8gRklYTUU6IFJlbW92ZSBsZWdhY3kgcm91bmRpbmcuCisgICAgbV9sb2dpY2Fs
UmVjdC5zZXRIZWlnaHQocm91bmRUb0ludChsb2dpY2FsSGVpZ2h0KSk7Cit9CisKK3ZvaWQgTGlu
ZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldEhhc0NvbnRlbnQoKQoreworICAgIEFTU0VSVChpc0lu
bGluZUJveCgpKTsKKyAgICBtX2hhc0NvbnRlbnQgPSB0cnVlOworfQorCitib29sIExpbmVCb3g6
OklubGluZUxldmVsQm94OjpoYXNMaW5lQm94UmVsYXRpdmVBbGlnbm1lbnQoKSBjb25zdAorewor
ICAgIGF1dG8gdmVydGljYWxBbGlnbm1lbnQgPSBsYXlvdXRCb3goKS5zdHlsZSgpLnZlcnRpY2Fs
QWxpZ24oKTsKKyAgICByZXR1cm4gdmVydGljYWxBbGlnbm1lbnQgPT0gVmVydGljYWxBbGlnbjo6
VG9wIHx8IHZlcnRpY2FsQWxpZ25tZW50ID09IFZlcnRpY2FsQWxpZ246OkJvdHRvbTsKK30KKwor
TGluZUJveDo6TGluZUJveChjb25zdCBCb3gmIHJvb3RMYXlvdXRCb3gsIGNvbnN0IElubGluZUxh
eW91dFBvaW50JiBsb2dpY2FsVG9wbGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsaW5lTG9naWNhbFdp
ZHRoLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5p
dCBjb250ZW50TG9naWNhbFdpZHRoLCBzaXplX3Qgbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENv
dW50KQorICAgIDogbV9sb2dpY2FsUmVjdChsb2dpY2FsVG9wbGVmdCwgSW5saW5lTGF5b3V0U2l6
ZSB7IGxpbmVMb2dpY2FsV2lkdGgsIHsgfSB9KQorICAgICwgbV9jb250ZW50TG9naWNhbFdpZHRo
KGNvbnRlbnRMb2dpY2FsV2lkdGgpCisgICAgLCBtX3Jvb3RJbmxpbmVCb3gocm9vdExheW91dEJv
eCwgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgY29udGVudExvZ2ljYWxX
aWR0aCwgeyB9IH0sIElubGluZUxldmVsQm94OjpUeXBlOjpSb290SW5saW5lQm94KQoreworICAg
IG1fbm9uUm9vdElubGluZUxldmVsQm94TGlzdC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG5vblNw
YW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCk7CisgICAgbV9ub25Sb290SW5saW5lTGV2ZWxCb3hN
YXAucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQp
OworfQorCit2b2lkIExpbmVCb3g6OmFkZElubGluZUxldmVsQm94KElubGluZUxldmVsQm94JiYg
aW5saW5lTGV2ZWxCb3gpCit7CisgICAgbV9ib3hUeXBlcy5hZGQoaW5saW5lTGV2ZWxCb3gudHlw
ZSgpKTsKKyAgICBtX25vblJvb3RJbmxpbmVMZXZlbEJveE1hcC5zZXQoJmlubGluZUxldmVsQm94
LmxheW91dEJveCgpLCBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Quc2l6ZSgpKTsKKyAgICBt
X25vblJvb3RJbmxpbmVMZXZlbEJveExpc3QuYXBwZW5kKFdURk1vdmUoaW5saW5lTGV2ZWxCb3gp
KTsKK30KKworSW5saW5lUmVjdCBMaW5lQm94Ojpsb2dpY2FsUmVjdEZvclRleHRSdW4oY29uc3Qg
TGluZTo6UnVuJiBydW4pIGNvbnN0Cit7CisgICAgQVNTRVJUKHJ1bi5pc1RleHQoKSB8fCBydW4u
aXNTb2Z0TGluZUJyZWFrKCkpOworICAgIGF1dG8qIHBhcmVudElubGluZUJveCA9ICZpbmxpbmVM
ZXZlbEJveEZvckxheW91dEJveChydW4ubGF5b3V0Qm94KCkucGFyZW50KCkpOworICAgIEFTU0VS
VChwYXJlbnRJbmxpbmVCb3gtPmlzSW5saW5lQm94KCkpOworICAgIGF1dG8mIGZvbnRNZXRyaWNz
ID0gcGFyZW50SW5saW5lQm94LT5zdHlsZSgpLmZvbnRNZXRyaWNzKCk7CisgICAgYXV0byBydW5s
b2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LT5sb2dpY2FsVG9wKCkgKyBwYXJlbnRJbmxpbmVC
b3gtPmJhc2VsaW5lKCkgLSBmb250TWV0cmljcy5hc2NlbnQoKTsKKworICAgIHdoaWxlIChwYXJl
bnRJbmxpbmVCb3ggIT0gJm1fcm9vdElubGluZUJveCAmJiAhcGFyZW50SW5saW5lQm94LT5oYXNM
aW5lQm94UmVsYXRpdmVBbGlnbm1lbnQoKSkgeworICAgICAgICBwYXJlbnRJbmxpbmVCb3ggPSAm
aW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3gocGFyZW50SW5saW5lQm94LT5sYXlvdXRCb3goKS5w
YXJlbnQoKSk7CisgICAgICAgIEFTU0VSVChwYXJlbnRJbmxpbmVCb3gtPmlzSW5saW5lQm94KCkp
OworICAgICAgICBydW5sb2dpY2FsVG9wICs9IHBhcmVudElubGluZUJveC0+bG9naWNhbFRvcCgp
OworICAgIH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQgPSBmb250TWV0cmlj
cy5oZWlnaHQoKTsKKyAgICByZXR1cm4geyBydW5sb2dpY2FsVG9wLCBtX3Jvb3RJbmxpbmVCb3gu
bG9naWNhbExlZnQoKSArIHJ1bi5sb2dpY2FsTGVmdCgpLCBydW4ubG9naWNhbFdpZHRoKCksIGxv
Z2ljYWxIZWlnaHQgfTsKK30KKworSW5saW5lUmVjdCBMaW5lQm94Ojpsb2dpY2FsUmVjdEZvckxp
bmVCcmVha0JveChjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5
b3V0Qm94LmlzTGluZUJyZWFrQm94KCkpOworICAgIHJldHVybiBsb2dpY2FsUmVjdEZvcklubGlu
ZUxldmVsQm94KGxheW91dEJveCk7Cit9CisKK0lubGluZVJlY3QgTGluZUJveDo6bG9naWNhbFJl
Y3RGb3JJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBB
U1NFUlQobGF5b3V0Qm94LmlzSW5saW5lTGV2ZWxCb3goKSB8fCBsYXlvdXRCb3guaXNMaW5lQnJl
YWtCb3goKSk7CisgICAgLy8gSW5saW5lIGxldmVsIGJveGVzIGFyZSByZWxhdGl2ZSB0byB0aGVp
ciBwYXJlbnQgdW5sZXNzIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgbWFrZXMgdGhlbSByZWxhdGl2
ZSB0byB0aGUgbGluZSBib3ggKGUuZy4gdG9wLCBib3R0b20pLgorICAgIGF1dG8qIGlubGluZUJv
eCA9ICZpbmxpbmVMZXZlbEJveEZvckxheW91dEJveChsYXlvdXRCb3gpOworICAgIGF1dG8gaW5s
aW5lQm94TG9naWNhbFJlY3QgPSBpbmxpbmVCb3gtPmxvZ2ljYWxSZWN0KCk7CisgICAgaWYgKGlu
bGluZUJveC0+aGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpCisgICAgICAgIHJldHVybiBp
bmxpbmVCb3hMb2dpY2FsUmVjdDsKKworICAgIC8vIEZhc3QgcGF0aCBmb3IgaW5saW5lIGxldmVs
IGJveGVzIG9uIHRoZSByb290IGlubGluZSBib3ggKGUuZyA8ZGl2PjxpbWc+PC9kaXY+KS4KKyAg
ICBpZiAoJmxheW91dEJveC5wYXJlbnQoKSA9PSAmbV9yb290SW5saW5lQm94LmxheW91dEJveCgp
KSB7CisgICAgICAgIGlubGluZUJveExvZ2ljYWxSZWN0Lm1vdmVWZXJ0aWNhbGx5KG1fcm9vdElu
bGluZUJveC5sb2dpY2FsVG9wKCkpOworICAgICAgICByZXR1cm4gaW5saW5lQm94TG9naWNhbFJl
Y3Q7CisgICAgfQorCisgICAgLy8gZS5nIDxkaXY+PHNwYW4+PGltZz48L3NwYW4+PC9kaXY+Cisg
ICAgYXV0byBpbmxpbmVCb3hBYnNvbHV0ZWxvZ2ljYWxUb3AgPSBpbmxpbmVCb3hMb2dpY2FsUmVj
dC50b3AoKTsKKyAgICB3aGlsZSAoaW5saW5lQm94ICE9ICZtX3Jvb3RJbmxpbmVCb3ggJiYgIWlu
bGluZUJveC0+aGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpIHsKKyAgICAgICAgaW5saW5l
Qm94ID0gJmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGlubGluZUJveC0+bGF5b3V0Qm94KCku
cGFyZW50KCkpOworICAgICAgICBBU1NFUlQoaW5saW5lQm94LT5pc0lubGluZUJveCgpKTsKKyAg
ICAgICAgaW5saW5lQm94QWJzb2x1dGVsb2dpY2FsVG9wICs9IGlubGluZUJveC0+bG9naWNhbFRv
cCgpOworICAgIH0KKyAgICByZXR1cm4gSW5saW5lUmVjdCB7IGlubGluZUJveEFic29sdXRlbG9n
aWNhbFRvcCwgaW5saW5lQm94TG9naWNhbFJlY3QubGVmdCgpLCBpbmxpbmVCb3hMb2dpY2FsUmVj
dC53aWR0aCgpLCBpbmxpbmVCb3hMb2dpY2FsUmVjdC5oZWlnaHQoKSB9OworfQorCitJbmxpbmVS
ZWN0IExpbmVCb3g6OmxvZ2ljYWxCb3JkZXJCb3hGb3JBdG9taWNJbmxpbmVMZXZlbEJveChjb25z
dCBCb3gmIGxheW91dEJveCwgY29uc3QgQm94R2VvbWV0cnkmIGJveEdlb21ldHJ5KSBjb25zdAor
eworICAgIEFTU0VSVChsYXlvdXRCb3guaXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKTsKKyAgICBh
dXRvIGxvZ2ljYWxSZWN0ID0gbG9naWNhbFJlY3RGb3JJbmxpbmVMZXZlbEJveChsYXlvdXRCb3gp
OworICAgIC8vIElubGluZSBsZXZlbCBib3hlcyB1c2UgdGhlaXIgbWFyZ2luIGJveCBmb3IgdmVy
dGljYWwgYWxpZ25tZW50LiBMZXQncyBjb3ZlcnQgdGhlbSB0byBib3JkZXIgYm94ZXMuCisgICAg
bG9naWNhbFJlY3QubW92ZVZlcnRpY2FsbHkoYm94R2VvbWV0cnkubWFyZ2luQmVmb3JlKCkpOwor
ICAgIGF1dG8gdmVydGljYWxNYXJnaW4gPSBib3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUoKSArIGJv
eEdlb21ldHJ5Lm1hcmdpbkFmdGVyKCk7CisgICAgbG9naWNhbFJlY3QuZXhwYW5kVmVydGljYWxs
eSgtdmVydGljYWxNYXJnaW4pOworICAgIHJldHVybiBsb2dpY2FsUmVjdDsKK30KKworSW5saW5l
UmVjdCBMaW5lQm94Ojpsb2dpY2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBjb25zdCBCb3hHZW9tZXRyeSYgYm94R2VvbWV0cnkpIGNvbnN0Cit7CisgICAgYXV0
byBsb2dpY2FsUmVjdCA9IGxvZ2ljYWxSZWN0Rm9ySW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94KTsK
KyAgICAvLyBUaGlzIGxvZ2ljYWwgcmVjdCBpcyBhcyB0YWxsIGFzIHRoZSAidGV4dCIgY29udGVu
dCBpcy4gTGV0J3MgYWRqdXN0IHdpdGggdmVydGljYWwgYm9yZGVyIGFuZCBwYWRkaW5nLgorICAg
IGF1dG8gdmVydGljYWxCb3JkZXJBbmRQYWRkaW5nID0gYm94R2VvbWV0cnkudmVydGljYWxCb3Jk
ZXIoKSArIGJveEdlb21ldHJ5LnZlcnRpY2FsUGFkZGluZygpLnZhbHVlT3IoMF9sdSk7CisgICAg
bG9naWNhbFJlY3QuZXhwYW5kVmVydGljYWxseSh2ZXJ0aWNhbEJvcmRlckFuZFBhZGRpbmcpOwor
ICAgIGxvZ2ljYWxSZWN0Lm1vdmVWZXJ0aWNhbGx5KC0oYm94R2VvbWV0cnkuYm9yZGVyVG9wKCkg
KyBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwX2x1KSkpOworICAgIHJldHVybiBs
b2dpY2FsUmVjdDsKK30KKworfSAvLyBuYW1lc3BhY2UgTGF5b3V0Cit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guaCBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVM
aW5lQm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uNjkyZTk2NjM4MzhlZDMyYThkZGIxOWI1ZmVhZDI0Njk3OTlm
MWMxMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94LmgKQEAgLTAsMCArMSwyMTUg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQorCisjaW5jbHVkZSAiSW5saW5lTGluZS5oIgorI2luY2x1ZGUgIklubGlu
ZVJlY3QuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorI2luY2x1ZGUgPHd0
Zi9VbmlxdWVSZWYuaD4KKyNpbmNsdWRlIDx3dGYvV2Vha1B0ci5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgQm94R2VvbWV0cnk7CitjbGFzcyBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKK2NsYXNzIExpbmVCb3hCdWlsZGVyOworc3RydWN0IFNp
bXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudDsKKworLy8gICBfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gTGluZSBCb3gKKy8vIHwgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8g
fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAg
fAorLy8gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0t
LS0tLS0tfC0tLS0tLS0tLS0gUm9vdCBJbmxpbmUgQm94CisvLyB8fCAgIF9fX19fICAgIF9fXyAg
ICAgIF9fXyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisvLyB8fCAgfCAgICAgICAg
LyAgIFwgICAgLyAgIFwgICAgICAgICB8ICBJbmxpbmUgTGV2ZWwgQm94ICB8CisvLyB8fCAgfF9f
X19fICB8ICAgICB8ICB8ICAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgIGFz
Y2VudAorLy8gfHwgIHwgICAgICAgfCAgICAgfCAgfCAgICAgfCAgICAgICAgfCAgICAgICAgICAg
ICAgICAgICAgfAorLy8gfHxfX3xfX19fX19fX1xfX18vX19fX1xfX18vX19fX19fX19ffF9fX19f
X19fX19fX19fX19fX19ffF9fX19fX18gYWxpZ25tZW50X2Jhc2VsaW5lCisvLyB8fAorLy8gfHwg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNj
ZW50CisvLyB8fF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fXworLy8gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKy8vIFRoZSByZXN1bHRpbmcgcmVjdGFuZ3Vs
YXIgYXJlYSB0aGF0IGNvbnRhaW5zIHRoZSBib3hlcyB0aGF0IGZvcm0gYSBzaW5nbGUgbGluZSBv
ZiBpbmxpbmUtbGV2ZWwgY29udGVudCBpcyBjYWxsZWQgYSBsaW5lIGJveC4KKy8vIGh0dHBzOi8v
d3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI21vZGVsCitjbGFzcyBMaW5lQm94IHsKKyAgICBX
VEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgSW5saW5lTGV2ZWxC
b3ggeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGluZUxldmVsQm94
IGNyZWF0ZUlubGluZUJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0
LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7CisgICAgICAgIHN0YXRpYyBMaW5lQm94
OjpJbmxpbmVMZXZlbEJveCBjcmVhdGVBdG9taWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplKTsKKyAgICAgICAg
c3RhdGljIExpbmVCb3g6OklubGluZUxldmVsQm94IGNyZWF0ZUxpbmVCcmVha0JveChjb25zdCBC
b3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KTsKKyAgICAgICAgc3RhdGljIExpbmVC
b3g6OklubGluZUxldmVsQm94IGNyZWF0ZUdlbmVyaWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gm
LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KTsKKworICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IGJhc2VsaW5lKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlbGluZTsgfQorICAgICAgICBPcHRp
b25hbDxJbmxpbmVMYXlvdXRVbml0PiBkZXNjZW50KCkgY29uc3QgeyByZXR1cm4gbV9kZXNjZW50
OyB9CisgICAgICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWlubGluZS0zLyNs
YXlvdXQtYm91bmRzCisgICAgICAgIHN0cnVjdCBMYXlvdXRCb3VuZHMgeworICAgICAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBhc2NlbnQgKyBkZXNjZW50
OyB9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGF5b3V0Qm91bmRzJiBvdGhl
cikgY29uc3QgeyByZXR1cm4gYXNjZW50ID09IG90aGVyLmFzY2VudCAmJiBkZXNjZW50ID09IG90
aGVyLmRlc2NlbnQ7IH0KKworICAgICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBhc2NlbnQgeyAw
IH07CisgICAgICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGRlc2NlbnQgeyAwIH07CisgICAgICAg
IH07CisgICAgICAgIExheW91dEJvdW5kcyBsYXlvdXRCb3VuZHMoKSBjb25zdCB7IHJldHVybiBt
X2xheW91dEJvdW5kczsgfQorCisgICAgICAgIGJvb2wgaGFzQ29udGVudCgpIGNvbnN0IHsgcmV0
dXJuIG1faGFzQ29udGVudDsgfQorICAgICAgICB2b2lkIHNldEhhc0NvbnRlbnQoKTsKKworICAg
ICAgICBWZXJ0aWNhbEFsaWduIHZlcnRpY2FsQWxpZ24oKSBjb25zdCB7IHJldHVybiBsYXlvdXRC
b3goKS5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKTsgfQorICAgICAgICBjb25zdCBCb3gmIGxheW91
dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQorICAgICAgICBjb25zdCBSZW5k
ZXJTdHlsZSYgc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJveC0+c3R5bGUoKTsgfQor
CisgICAgICAgIGJvb2wgaXNJbmxpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gVHlw
ZTo6SW5saW5lQm94IHx8IG1fdHlwZSA9PSBUeXBlOjpSb290SW5saW5lQm94OyB9CisgICAgICAg
IGJvb2wgaXNSb290SW5saW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IFR5cGU6OlJv
b3RJbmxpbmVCb3g7IH0KKyAgICAgICAgYm9vbCBpc0F0b21pY0lubGluZUxldmVsQm94KCkgY29u
c3QgeyByZXR1cm4gbV90eXBlID09IFR5cGU6OkF0b21pY0lubGluZUxldmVsQm94OyB9CisgICAg
ICAgIGJvb2wgaXNMaW5lQnJlYWtCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gVHlwZTo6
TGluZUJyZWFrQm94OyB9CisgICAgICAgIGJvb2wgaGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50
KCkgY29uc3Q7CisKKyAgICAgICAgZW51bSBjbGFzcyBUeXBlIDogdWludDhfdCB7CisgICAgICAg
ICAgICBJbmxpbmVCb3ggICAgICAgICAgICAgPSAxIDw8IDAsCisgICAgICAgICAgICBSb290SW5s
aW5lQm94ICAgICAgICAgPSAxIDw8IDEsCisgICAgICAgICAgICBBdG9taWNJbmxpbmVMZXZlbEJv
eCAgPSAxIDw8IDIsCisgICAgICAgICAgICBMaW5lQnJlYWtCb3ggICAgICAgICAgPSAxIDw8IDMs
CisgICAgICAgICAgICBHZW5lcmljSW5saW5lTGV2ZWxCb3ggPSAxIDw8IDQKKyAgICAgICAgfTsK
KyAgICAgICAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9CisKKyAgICAgICAg
SW5saW5lTGV2ZWxCb3goY29uc3QgQm94JiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwg
SW5saW5lTGF5b3V0U2l6ZSwgVHlwZSk7CisgICAgICAgIElubGluZUxldmVsQm94KCkgPSBkZWZh
dWx0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBTaW1wbGlmaWVkVmVy
dGljYWxBbGlnbm1lbnQ7CisgICAgICAgIGZyaWVuZCBjbGFzcyBMaW5lQm94QnVpbGRlcjsKKyAg
ICAgICAgZnJpZW5kIGNsYXNzIExpbmVCb3g7CisKKyAgICAgICAgY29uc3QgSW5saW5lUmVjdCYg
bG9naWNhbFJlY3QoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0OyB9CisgICAgICAgIElu
bGluZUxheW91dFVuaXQgbG9naWNhbFRvcCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3Qu
dG9wKCk7IH0KKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tKCkgY29uc3Qg
eyByZXR1cm4gbV9sb2dpY2FsUmVjdC5ib3R0b20oKTsgfQorICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxMZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5sZWZ0KCk7IH0K
KyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBt
X2xvZ2ljYWxSZWN0LndpZHRoKCk7IH0KKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
SGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5oZWlnaHQoKTsgfQorCisgICAg
ICAgIHZvaWQgc2V0TG9naWNhbFdpZHRoKElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKSB7
IG1fbG9naWNhbFJlY3Quc2V0V2lkdGgobG9naWNhbFdpZHRoKTsgfQorICAgICAgICB2b2lkIHNl
dExvZ2ljYWxIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCk7CisgICAgICAgIHZvaWQgc2V0TG9naWNh
bFRvcChJbmxpbmVMYXlvdXRVbml0KTsKKyAgICAgICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVM
YXlvdXRVbml0KTsKKyAgICAgICAgdm9pZCBzZXREZXNjZW50KElubGluZUxheW91dFVuaXQpOwor
ICAgICAgICB2b2lkIHNldExheW91dEJvdW5kcyhjb25zdCBMYXlvdXRCb3VuZHMmKTsKKworICAg
IHByaXZhdGU6CisgICAgICAgIFdlYWtQdHI8Y29uc3QgQm94PiBtX2xheW91dEJveDsKKyAgICAg
ICAgLy8gVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgbWFyZ2luIGFuZCBib3JkZXIgYm94ZXMu
IElubGluZSBsZXZlbCBib3hlcyBhcmUgdmVydGljYWxseSBhbGlnbmVkIHVzaW5nIHRoZWlyIG1h
cmdpbiBib3hlcy4KKyAgICAgICAgSW5saW5lUmVjdCBtX2xvZ2ljYWxSZWN0OworICAgICAgICBM
YXlvdXRCb3VuZHMgbV9sYXlvdXRCb3VuZHM7CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9i
YXNlbGluZSB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gbV9kZXNj
ZW50OworICAgICAgICBib29sIG1faGFzQ29udGVudCB7IGZhbHNlIH07CisgICAgICAgIFR5cGUg
bV90eXBlIHsgVHlwZTo6SW5saW5lQm94IH07CisgICAgfTsKKworICAgIExpbmVCb3goY29uc3Qg
Qm94JiByb290TGF5b3V0Qm94LCBjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgbG9naWNhbFRvcExl
ZnQsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0
IGxpbmVMb2dpY2FsV2lkdGgsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCwg
c2l6ZV90IG5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCk7CisKKyAgICBjb25zdCBJbmxp
bmVSZWN0JiBsb2dpY2FsUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3Q7IH0KKyAg
ICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxT
aXplKCkud2lkdGgoKTsgfQorICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbEhlaWdodCgpIGNv
bnN0IHsgcmV0dXJuIGxvZ2ljYWxTaXplKCkuaGVpZ2h0KCk7IH0KKyAgICBJbmxpbmVMYXlvdXRQ
b2ludCBsb2dpY2FsVG9wTGVmdCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkudG9wTGVm
dCgpOyB9CisgICAgSW5saW5lTGF5b3V0U2l6ZSBsb2dpY2FsU2l6ZSgpIGNvbnN0IHsgcmV0dXJu
IGxvZ2ljYWxSZWN0KCkuc2l6ZSgpOyB9CisgICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9n
aWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50TG9naWNhbFdpZHRoOyB9CisKKyAg
ICAvLyBOb3RlIHRoYXQgdGhlIGxpbmUgY2FuIGhhdmUgbWFueSBpbmxpbmUgYm94ZXMgYW5kIGJl
ICJlbXB0eSIgdGhlIHNhbWUgdGltZSBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bh
bj48L2Rpdj4KKyAgICBib29sIGhhc0NvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX2hhc0NvbnRl
bnQ7IH0KKyAgICBib29sIGhhc0lubGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYm94VHlwZXMu
Y29udGFpbnMoSW5saW5lTGV2ZWxCb3g6OlR5cGU6OklubGluZUJveCk7IH0KKyAgICBib29sIGhh
c05vbklubGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYm94VHlwZXMuY29udGFpbnNBbnkoeyBJ
bmxpbmVMZXZlbEJveDo6VHlwZTo6QXRvbWljSW5saW5lTGV2ZWxCb3gsIElubGluZUxldmVsQm94
OjpUeXBlOjpMaW5lQnJlYWtCb3gsIElubGluZUxldmVsQm94OjpUeXBlOjpHZW5lcmljSW5saW5l
TGV2ZWxCb3ggfSk7IH0KKyAgICBib29sIGhhc0F0b21pY0lubGluZUxldmVsQm94KCkgY29uc3Qg
eyByZXR1cm4gbV9ib3hUeXBlcy5jb250YWlucyhJbmxpbmVMZXZlbEJveDo6VHlwZTo6QXRvbWlj
SW5saW5lTGV2ZWxCb3gpOyB9CisKKyAgICBjb25zdCBJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2
ZWxCb3hGb3JMYXlvdXRCb3goY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIGNv
bnN0X2Nhc3Q8TGluZUJveCY+KCp0aGlzKS5pbmxpbmVMZXZlbEJveEZvckxheW91dEJveChsYXlv
dXRCb3gpOyB9CisKKyAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9yVGV4dFJ1bihjb25zdCBM
aW5lOjpSdW4mKSBjb25zdDsKKyAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9yTGluZUJyZWFr
Qm94KGNvbnN0IEJveCYpIGNvbnN0OworICAgIElubGluZVJlY3QgbG9naWNhbFJlY3RGb3JSb290
SW5saW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV9yb290SW5saW5lQm94LmxvZ2ljYWxSZWN0KCk7
IH0KKyAgICBJbmxpbmVSZWN0IGxvZ2ljYWxCb3JkZXJCb3hGb3JBdG9taWNJbmxpbmVMZXZlbEJv
eChjb25zdCBCb3gmLCBjb25zdCBCb3hHZW9tZXRyeSYpIGNvbnN0OworICAgIElubGluZVJlY3Qg
bG9naWNhbEJvcmRlckJveEZvcklubGluZUJveChjb25zdCBCb3gmLCBjb25zdCBCb3hHZW9tZXRy
eSYpIGNvbnN0OworCisgICAgY29uc3QgSW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3goKSBj
b25zdCB7IHJldHVybiBtX3Jvb3RJbmxpbmVCb3g7IH0KKyAgICB1c2luZyBJbmxpbmVMZXZlbEJv
eExpc3QgPSBWZWN0b3I8SW5saW5lTGV2ZWxCb3g+OworICAgIGNvbnN0IElubGluZUxldmVsQm94
TGlzdCYgbm9uUm9vdElubGluZUxldmVsQm94ZXMoKSBjb25zdCB7IHJldHVybiBtX25vblJvb3RJ
bmxpbmVMZXZlbEJveExpc3Q7IH0KKworICAgIElubGluZUxheW91dFVuaXQgYWxpZ25tZW50QmFz
ZWxpbmUoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RJbmxpbmVCb3gubG9naWNhbFRvcCgpICsgbV9y
b290SW5saW5lQm94LmJhc2VsaW5lKCk7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3Mg
TGluZUJveEJ1aWxkZXI7CisKKyAgICB2b2lkIHNldExvZ2ljYWxIZWlnaHQoSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsSGVpZ2h0KSB7IG1fbG9naWNhbFJlY3Quc2V0SGVpZ2h0KGxvZ2ljYWxIZWln
aHQpOyB9CisKKyAgICB2b2lkIGFkZElubGluZUxldmVsQm94KElubGluZUxldmVsQm94JiYpOwor
ICAgIElubGluZUxldmVsQm94TGlzdCYgbm9uUm9vdElubGluZUxldmVsQm94ZXMoKSB7IHJldHVy
biBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Q7IH0KKworICAgIElubGluZUxldmVsQm94JiBy
b290SW5saW5lQm94KCkgeyByZXR1cm4gbV9yb290SW5saW5lQm94OyB9CisKKyAgICBJbmxpbmVM
ZXZlbEJveCYgaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3goY29uc3QgQm94JiBsYXlvdXRCb3gp
IHsgcmV0dXJuICZsYXlvdXRCb3ggPT0gJm1fcm9vdElubGluZUJveC5sYXlvdXRCb3goKSA/IG1f
cm9vdElubGluZUJveCA6IG1fbm9uUm9vdElubGluZUxldmVsQm94TGlzdFttX25vblJvb3RJbmxp
bmVMZXZlbEJveE1hcC5nZXQoJmxheW91dEJveCldOyB9CisgICAgSW5saW5lUmVjdCBsb2dpY2Fs
UmVjdEZvcklubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdDsKKworICAg
IHZvaWQgc2V0SGFzQ29udGVudChib29sIGhhc0NvbnRlbnQpIHsgbV9oYXNDb250ZW50ID0gaGFz
Q29udGVudDsgfQorCitwcml2YXRlOgorICAgIElubGluZVJlY3QgbV9sb2dpY2FsUmVjdDsKKyAg
ICBJbmxpbmVMYXlvdXRVbml0IG1fY29udGVudExvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICBib29s
IG1faGFzQ29udGVudCB7IGZhbHNlIH07CisgICAgT3B0aW9uU2V0PElubGluZUxldmVsQm94OjpU
eXBlPiBtX2JveFR5cGVzOworCisgICAgSW5saW5lTGV2ZWxCb3ggbV9yb290SW5saW5lQm94Owor
ICAgIElubGluZUxldmVsQm94TGlzdCBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Q7CisKKyAg
ICBIYXNoTWFwPGNvbnN0IEJveCosIHNpemVfdD4gbV9ub25Sb290SW5saW5lTGV2ZWxCb3hNYXA7
Cit9OworCitpbmxpbmUgTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2
ZWxCb3g6OmNyZWF0ZUF0b21pY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIGxvZ2ljYWxTaXpl
KQoreworICAgIHJldHVybiBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCB7IGxheW91dEJveCwgbG9n
aWNhbExlZnQsIGxvZ2ljYWxTaXplLCBUeXBlOjpBdG9taWNJbmxpbmVMZXZlbEJveCB9OworfQor
CitpbmxpbmUgTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6
OmNyZWF0ZUlubGluZUJveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBs
b2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7CisgICAgcmV0dXJu
IExpbmVCb3g6OklubGluZUxldmVsQm94IHsgbGF5b3V0Qm94LCBsb2dpY2FsTGVmdCwgSW5saW5l
TGF5b3V0U2l6ZSB7IGxvZ2ljYWxXaWR0aCwgeyB9IH0sIFR5cGU6OklubGluZUJveCB9OworfQor
CitpbmxpbmUgTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6
OmNyZWF0ZUxpbmVCcmVha0JveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsTGVmdCkKK3sKKyAgICByZXR1cm4gTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggeyBs
YXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgfSwgVHlwZTo6TGluZUJy
ZWFrQm94IH07Cit9CisKK2lubGluZSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBMaW5lQm94OjpJ
bmxpbmVMZXZlbEJveDo6Y3JlYXRlR2VuZXJpY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KQoreworICAgIHJldHVybiBMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveCB7IGxheW91dEJveCwgbG9naWNhbExlZnQsIElubGluZUxheW91
dFNpemUgeyB9LCBUeXBlOjpHZW5lcmljSW5saW5lTGV2ZWxCb3ggfTsKK30KKworfQorfQorCisj
ZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1
aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjZjNjI2ZWEwZWU1YTYzYTRhOTYyYjE1NWNlNjEwNjUzMGZj
ZTIyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxkZXIuY3BwCkBAIC0wLDAg
KzEsODU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4K
KyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklu
bGluZUxpbmVCdWlsZGVyLmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKKworI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIklubGluZUZvcm1h
dHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0
Qm94R2VvbWV0cnkuaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUgIlRleHRV
dGlsLmgiCisjaW5jbHVkZSA8d3RmL3VuaWNvZGUvQ2hhcmFjdGVyTmFtZXMuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBl
bmRzV2l0aFNvZnRXcmFwT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5lVGV4dEl0ZW0mIGN1cnJlbnRU
ZXh0SXRlbSwgY29uc3QgSW5saW5lVGV4dEl0ZW0mIG5leHRJbmxpbmVUZXh0SXRlbSkKK3sKKyAg
ICBBU1NFUlQoIW5leHRJbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSk7CisgICAgLy8gV2Ug
YXJlIGF0IHRoZSBwb3NpdGlvbiBhZnRlciBhIHdoaXRlc3BhY2UuCisgICAgaWYgKGN1cnJlbnRU
ZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gV2hl
biBib3RoIHRoZXNlIG5vbi13aGl0ZXNwYWNlIHJ1bnMgYmVsb25nIHRvIHRoZSBzYW1lIGxheW91
dCBib3gsIGl0J3MgZ3VhcmFudGVlZCB0aGF0CisgICAgLy8gdGhleSBhcmUgc3BsaXQgYXQgYSBz
b2Z0IGJyZWFraW5nIG9wcG9ydHVuaXR5LiBTZWUgSW5saW5lVGV4dEl0ZW06Om1vdmVUb05leHRC
cmVha2FibGVQb3NpdGlvbi4KKyAgICBpZiAoJmN1cnJlbnRUZXh0SXRlbS5pbmxpbmVUZXh0Qm94
KCkgPT0gJm5leHRJbmxpbmVUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkpCisgICAgICAgIHJldHVy
biB0cnVlOworICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGNvbGxlY3QgYXQgbGVhc3QgMyBhZGphY2Vu
dCBjaGFyYWN0ZXJzIHRvIGJlIGFibGUgdG8gbWFrZSBhIGRlY2lzaW9uIHdoZXRoZXIgdGhlIHBy
ZXZpb3VzIHRleHQgaXRlbSBlbmRzIHdpdGggYnJlYWtpbmcgb3Bwb3J0dW5pdHkuCisgICAgLy8g
W2V4LV1bYW1wbGVdIDwtIHNlY29uZCB0byBsYXN0W3hdIGxhc3RbLV0gY3VycmVudFthXQorICAg
IC8vIFdlIG5lZWQgYXQgbGVhc3QgMSBjaGFyYWN0ZXIgaW4gdGhlIGN1cnJlbnQgaW5saW5lIHRl
eHQgaXRlbSBhbmQgMiBtb3JlIGZyb20gcHJldmlvdXMgaW5saW5lIGl0ZW1zLgorICAgIGF1dG8g
cHJldmlvdXNDb250ZW50ID0gY3VycmVudFRleHRJdGVtLmlubGluZVRleHRCb3goKS5jb250ZW50
KCk7CisgICAgYXV0byBsaW5lQnJlYWtJdGVyYXRvciA9IExhenlMaW5lQnJlYWtJdGVyYXRvciB7
IG5leHRJbmxpbmVUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpIH07CisgICAgYXV0
byBwcmV2aW91c0NvbnRlbnRMZW5ndGggPSBwcmV2aW91c0NvbnRlbnQubGVuZ3RoKCk7CisgICAg
Ly8gRklYTUU6IFdlIHNob3VsZCBsb29rIGludG8gdGhlIGVudGlyZSB1bmNvbW1pdHRlZCBjb250
ZW50IGZvciBtb3JlIHRleHQgY29udGV4dC4KKyAgICBVQ2hhciBsYXN0Q2hhcmFjdGVyID0gcHJl
dmlvdXNDb250ZW50TGVuZ3RoID8gcHJldmlvdXNDb250ZW50W3ByZXZpb3VzQ29udGVudExlbmd0
aCAtIDFdIDogMDsKKyAgICBpZiAobGFzdENoYXJhY3RlciA9PSBzb2Z0SHlwaGVuICYmIGN1cnJl
bnRUZXh0SXRlbS5zdHlsZSgpLmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpOb25lKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgVUNoYXIgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gcHJldmlvdXND
b250ZW50TGVuZ3RoID4gMSA/IHByZXZpb3VzQ29udGVudFtwcmV2aW91c0NvbnRlbnRMZW5ndGgg
LSAyXSA6IDA7CisgICAgbGluZUJyZWFrSXRlcmF0b3Iuc2V0UHJpb3JDb250ZXh0KGxhc3RDaGFy
YWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rlcik7CisgICAgLy8gTm93IGNoZWNrIGlmIHdlIGNh
biBicmVhayByaWdodCBhdCB0aGUgaW5saW5lIGl0ZW0gYm91bmRhcnkuCisgICAgLy8gV2l0aCB0
aGUgW2V4LWFtcGxlXSwgZmluZE5leHRCcmVha2FibGVQb3NpdGlvbiBzaG91bGQgcmV0dXJuIHRo
ZSBzdGFydFBvc2l0aW9uICgwKS4KKyAgICAvLyBGSVhNRTogQ2hlY2sgaWYgdGhlcmUncyBhIG1v
cmUgY29ycmVjdCB3YXkgb2YgZmluZGluZyBicmVha2luZyBvcHBvcnR1bml0aWVzLgorICAgIHJl
dHVybiAhVGV4dFV0aWw6OmZpbmROZXh0QnJlYWthYmxlUG9zaXRpb24obGluZUJyZWFrSXRlcmF0
b3IsIDAsIG5leHRJbmxpbmVUZXh0SXRlbS5zdHlsZSgpKTsKK30KKworc3RhdGljIGlubGluZSBi
b29sIGlzQXRTb2Z0V3JhcE9wcG9ydHVuaXR5KGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0
JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCwgY29uc3QgSW5saW5lSXRlbSYgY3VycmVudCwgY29u
c3QgSW5saW5lSXRlbSYgbmV4dCkKK3sKKyAgICAvLyAiaXMgYXQiIHNpbXBsZSBtZWFucyB0aGF0
IHRoZXJlJ3MgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgcmlnaHQgYWZ0ZXIgdGhlIFtjdXJyZW50
XS4KKyAgICAvLyBbdGV4dF1bIF1bdGV4dF1baW5saW5lIGJveCBzdGFydF0uLi4gKDxkaXY+dGV4
dCBjb250ZW50PHNwYW4+Li48L2Rpdj4pCisgICAgLy8gc29mdCB3cmFwIGluZGV4ZXM6IDAgYW5k
IDEgZGVmaW5pdGVseSwgMiBkZXBlbmRzIG9uIHRoZSBjb250ZW50IGFmdGVyIHRoZSBbaW5saW5l
IGJveCBzdGFydF0uCisKKyAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQt
My8jbGluZS1icmVhay1kZXRhaWxzCisgICAgLy8gRmlndXJlIG91dCBpZiB0aGUgbmV3IGluY29t
aW5nIGNvbnRlbnQgcHV0cyB0aGUgdW5jb21taXR0ZWQgY29udGVudCBvbiBhIHNvZnQgd3JhcCBv
cHBvcnR1bml0eS4KKyAgICAvLyBlLmcuIFtpbmxpbmUgYm94IHN0YXJ0XVtwcmlvcl9jb250aW51
b3VzX2NvbnRlbnRdW2lubGluZSBib3ggZW5kXSAoPHNwYW4+cHJpb3JfY29udGludW91c19jb250
ZW50PC9zcGFuPikKKyAgICAvLyBBbiBpbmNvbWluZyA8aW1nPiBib3ggd291bGQgZW5hYmxlIHVz
IHRvIGNvbW1pdCB0aGUgIjxzcGFuPnByaW9yX2NvbnRpbnVvdXNfY29udGVudDwvc3Bhbj4iIGNv
bnRlbnQKKyAgICAvLyBidXQgYW4gaW5jb21pbmcgdGV4dCBjb250ZW50IHdvdWxkIG5vdCBuZWNl
c3NhcmlseS4KKyAgICBBU1NFUlQoY3VycmVudC5pc1RleHQoKSB8fCBjdXJyZW50LmlzQm94KCkg
fHwgY3VycmVudC5pc0Zsb2F0KCkpOworICAgIEFTU0VSVChuZXh0LmlzVGV4dCgpIHx8IG5leHQu
aXNCb3goKSB8fCBuZXh0LmlzRmxvYXQoKSk7CisgICAgaWYgKGN1cnJlbnQuaXNUZXh0KCkgJiYg
bmV4dC5pc1RleHQoKSkgeworICAgICAgICBhdXRvJiBjdXJyZW50SW5saW5lVGV4dEl0ZW0gPSBk
b3duY2FzdDxJbmxpbmVUZXh0SXRlbT4oY3VycmVudCk7CisgICAgICAgIGF1dG8mIG5leHRJbmxp
bmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihuZXh0KTsKKyAgICAgICAgaWYg
KGN1cnJlbnRJbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkgeworICAgICAgICAgICAgLy8g
WyBdW3RleHRdIDogYWZ0ZXIgW3doaXRlc3BhY2VdIHBvc2l0aW9uIGlzIGEgc29mdCB3cmFwIG9w
cG9ydHVuaXR5LgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAg
aWYgKG5leHRJbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkgeworICAgICAgICAgICAgLy8g
W3RleHRdWyBdICg8c3Bhbj50ZXh0PC9zcGFuPiApCisgICAgICAgICAgICAvLyB3aGl0ZS1zcGFj
ZTogYnJlYWstc3BhY2VzOiBsaW5lIGJyZWFraW5nIG9wcG9ydHVuaXR5IGV4aXN0cyBhZnRlciBl
dmVyeSBwcmVzZXJ2ZWQgd2hpdGUgc3BhY2UgY2hhcmFjdGVyLCBidXQgbm90IGJlZm9yZS4KKyAg
ICAgICAgICAgIHJldHVybiBuZXh0SW5saW5lVGV4dEl0ZW0uc3R5bGUoKS53aGl0ZVNwYWNlKCkg
IT0gV2hpdGVTcGFjZTo6QnJlYWtTcGFjZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJl
bnQuc3R5bGUoKS5saW5lQnJlYWsoKSA9PSBMaW5lQnJlYWs6OkFueXdoZXJlIHx8IG5leHQuc3R5
bGUoKS5saW5lQnJlYWsoKSA9PSBMaW5lQnJlYWs6OkFueXdoZXJlKSB7CisgICAgICAgICAgICAv
LyBUaGVyZSBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBhcm91bmQgZXZlcnkgdHlwb2dyYXBo
aWMgY2hhcmFjdGVyIHVuaXQsIGluY2x1ZGluZyBhcm91bmQgYW55IHB1bmN0dWF0aW9uIGNoYXJh
Y3RlcgorICAgICAgICAgICAgLy8gb3IgcHJlc2VydmVkIHdoaXRlIHNwYWNlcywgb3IgaW4gdGhl
IG1pZGRsZSBvZiB3b3Jkcy4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9Cisg
ICAgICAgIC8vIEJvdGggY3VycmVudCBhbmQgbmV4dCBpdGVtcyBhcmUgbm9uLXdoaXRlc3BhY2Ug
dGV4dC4KKyAgICAgICAgLy8gW3RleHRdW3RleHRdIDogaXMgYSBjb250aW51b3VzIGNvbnRlbnQu
CisgICAgICAgIC8vIFt0ZXh0LV1bdGV4dF0gOiBhZnRlciBbaHlwaGVuXSBwb3NpdGlvbiBpcyBh
IHNvZnQgd3JhcCBvcHBvcnR1bml0eS4KKyAgICAgICAgcmV0dXJuIGVuZHNXaXRoU29mdFdyYXBP
cHBvcnR1bml0eShjdXJyZW50SW5saW5lVGV4dEl0ZW0sIG5leHRJbmxpbmVUZXh0SXRlbSk7Cisg
ICAgfQorICAgIGlmIChjdXJyZW50LmlzRmxvYXQoKSB8fCBuZXh0LmlzRmxvYXQoKSkgeworICAg
ICAgICAvLyBXaGlsZSBmbG9hdHMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBpbmxpbmUgY29udGVudCBh
bmQgdGhleSBhcmUgbm90IHN1cHBvc2VkIHRvIGludHJvZHVjZSBzb2Z0IHdyYXAgb3Bwb3J0dW5p
dGllcywKKyAgICAgICAgLy8gZS5nLiBbdGV4dF1bZmxvYXQgYm94XVtmbG9hdCBib3hdW3RleHRd
W2Zsb2F0IGJveF1bdGV4dF0gaXMgZXNzZW50aWFsbHkganVzdCBbdGV4dF1bdGV4dF1bdGV4dF0K
KyAgICAgICAgLy8gZmlndXJpbmcgb3V0IHdoZXRoZXIgYSBmbG9hdCAob3Igc2V0IG9mIGZsb2F0
cykgc2hvdWxkIHN0YXkgb24gdGhlIGxpbmUgb3Igbm90IChhbmQgaGFuZGxlIHBvdGVudGlhbGx5
IG91dCBvZiBvcmRlciBpbmxpbmUgaXRlbXMpCisgICAgICAgIC8vIGJyaW5ncyBpbiB1bm5lY2Vz
c2FyeSBjb21wbGV4aXR5LgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGN1
cnJlbnQuaXNCb3goKSB8fCBuZXh0LmlzQm94KCkpIHsKKyAgICAgICAgYXV0byBpc0ltYWdlQ29u
dGVudCA9IGN1cnJlbnQubGF5b3V0Qm94KCkuaXNJbWFnZSgpIHx8IG5leHQubGF5b3V0Qm94KCku
aXNJbWFnZSgpOworICAgICAgICBpZiAoaXNJbWFnZUNvbnRlbnQpCisgICAgICAgICAgICByZXR1
cm4gaW5saW5lRm9ybWF0dGluZ0NvbnRleHQucXVpcmtzKCkuaGFzU29mdFdyYXBPcHBvcnR1bml0
eUF0SW1hZ2UoKTsKKyAgICAgICAgLy8gW3RleHRdW2lubGluZSBib3ggc3RhcnRdW2lubGluZSBi
b3ggZW5kXVtpbmxpbmUgYm94XSAodGV4dDxzcGFuPjwvc3Bhbj48aW1nPikgOiB0aGVyZSdzIGEg
c29mdCB3cmFwIG9wcG9ydHVuaXR5IGJldHdlZW4gdGhlIFt0ZXh0XSBhbmQgW2ltZ10uCisgICAg
ICAgIC8vIFRoZSBsaW5lIGJyZWFraW5nIGJlaGF2aW9yIG9mIGEgcmVwbGFjZWQgZWxlbWVudCBv
ciBvdGhlciBhdG9taWMgaW5saW5lIGlzIGVxdWl2YWxlbnQgdG8gYW4gaWRlb2dyYXBoaWMgY2hh
cmFjdGVyLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0cnVjdCBMaW5lQ2FuZGlkYXRlIHsKKyAg
ICBMaW5lQ2FuZGlkYXRlKGJvb2wgaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKTsKKworICAg
IHZvaWQgcmVzZXQoKTsKKworICAgIHN0cnVjdCBJbmxpbmVDb250ZW50IHsKKyAgICAgICAgSW5s
aW5lQ29udGVudChib29sIGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZyk7CisKKyAgICAgICAg
Y29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3Vz
Q29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGludW91c0NvbnRlbnQ7IH0KKyAgICAgICAg
Y29uc3QgSW5saW5lSXRlbSogdHJhaWxpbmdMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiBtX3Ry
YWlsaW5nTGluZUJyZWFrOyB9CisgICAgICAgIGNvbnN0IElubGluZUl0ZW0qIHRyYWlsaW5nV29y
ZEJyZWFrT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nV29yZEJyZWFrT3Bw
b3J0dW5pdHk7IH0KKworICAgICAgICB2b2lkIGFwcGVuZElubGluZUl0ZW0oY29uc3QgSW5saW5l
SXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICAgICAgdm9pZCBhcHBl
bmRUcmFpbGluZ0xpbmVCcmVhayhjb25zdCBJbmxpbmVJdGVtJiBsaW5lQnJlYWtJdGVtKSB7IG1f
dHJhaWxpbmdMaW5lQnJlYWsgPSAmbGluZUJyZWFrSXRlbTsgfQorICAgICAgICB2b2lkIGFwcGVu
ZHRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5lSXRlbSYgd29yZEJyZWFr
SXRlbSkgeyBtX3RyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkgPSAmd29yZEJyZWFrSXRlbTsg
fQorICAgICAgICB2b2lkIHJlc2V0KCk7CisgICAgICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsg
cmV0dXJuIG1fY29udGludW91c0NvbnRlbnQucnVucygpLmlzRW1wdHkoKSAmJiAhdHJhaWxpbmdX
b3JkQnJlYWtPcHBvcnR1bml0eSgpICYmICF0cmFpbGluZ0xpbmVCcmVhaygpOyB9CisgICAgICAg
IGJvb2wgaGFzSW5saW5lTGV2ZWxCb3goKSBjb25zdCB7IHJldHVybiBtX2hhc0lubGluZUxldmVs
Qm94OyB9CisKKyAgICAgICAgdm9pZCBzZXRIYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHko
Ym9vbCBoYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkpIHsgbV9oYXNUcmFpbGluZ1NvZnRX
cmFwT3Bwb3J0dW5pdHkgPSBoYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHk7IH0KKyAgICAg
ICAgYm9vbCBoYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBt
X2hhc1RyYWlsaW5nU29mdFdyYXBPcHBvcnR1bml0eTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAg
ICAgYm9vbCBtX2lnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZyB7IGZhbHNlIH07CisKKyAgICAg
ICAgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50IG1fY29udGludW91c0Nv
bnRlbnQ7CisgICAgICAgIGNvbnN0IElubGluZUl0ZW0qIG1fdHJhaWxpbmdMaW5lQnJlYWsgeyBu
dWxscHRyIH07CisgICAgICAgIGNvbnN0IElubGluZUl0ZW0qIG1fdHJhaWxpbmdXb3JkQnJlYWtP
cHBvcnR1bml0eSB7IG51bGxwdHIgfTsKKyAgICAgICAgYm9vbCBtX2hhc0lubGluZUxldmVsQm94
IHsgZmFsc2UgfTsKKyAgICAgICAgYm9vbCBtX2hhc1RyYWlsaW5nU29mdFdyYXBPcHBvcnR1bml0
eSB7IGZhbHNlIH07CisgICAgfTsKKworICAgIC8vIENhbmRpZGF0ZSBjb250ZW50IGlzIGEgY29s
bGVjdGlvbiBvZiBpbmxpbmUgY29udGVudCBvciBhIGZsb2F0IGJveC4KKyAgICBJbmxpbmVDb250
ZW50IGlubGluZUNvbnRlbnQ7CisgICAgY29uc3QgSW5saW5lSXRlbSogZmxvYXRJdGVtIHsgbnVs
bHB0ciB9OworfTsKKworTGluZUNhbmRpZGF0ZTo6TGluZUNhbmRpZGF0ZShib29sIGlnbm9yZVRy
YWlsaW5nTGV0dGVyU3BhY2luZykKKyAgICA6IGlubGluZUNvbnRlbnQoaWdub3JlVHJhaWxpbmdM
ZXR0ZXJTcGFjaW5nKQoreworfQorCitMaW5lQ2FuZGlkYXRlOjpJbmxpbmVDb250ZW50OjpJbmxp
bmVDb250ZW50KGJvb2wgaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKQorICAgIDogbV9pZ25v
cmVUcmFpbGluZ0xldHRlclNwYWNpbmcoaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKQorewor
fQorCitpbmxpbmUgdm9pZCBMaW5lQ2FuZGlkYXRlOjpJbmxpbmVDb250ZW50OjphcHBlbmRJbmxp
bmVJdGVtKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9n
aWNhbFdpZHRoKQoreworICAgIEFTU0VSVChpbmxpbmVJdGVtLmlzVGV4dCgpIHx8IGlubGluZUl0
ZW0uaXNCb3goKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVt
LmlzSW5saW5lQm94RW5kKCkpOworICAgIGF1dG8gY29sbGFwc2libGVXaWR0aCA9IFsmXSgpIC0+
IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsKKyAgICAgICAgaWYgKCFpbmxpbmVJdGVtLmlz
VGV4dCgpKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgYXV0byYgaW5saW5lVGV4
dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSk7CisgICAgICAgIGlm
IChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3Vs
ZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpIHsKKyAgICAgICAgICAgIC8v
IEZ1bGx5IGNvbGxhcHNpYmxlIHRyYWlsaW5nIGNvbnRlbnQuCisgICAgICAgICAgICByZXR1cm4g
bG9naWNhbFdpZHRoOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIGZvciBwYXJ0aWFsbHkg
Y29sbGFwc2libGUgY29udGVudC4KKyAgICAgICAgaWYgKG1faWdub3JlVHJhaWxpbmdMZXR0ZXJT
cGFjaW5nKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgYXV0byBsZXR0ZXJTcGFj
aW5nID0gaW5saW5lSXRlbS5zdHlsZSgpLmxldHRlclNwYWNpbmcoKTsKKyAgICAgICAgaWYgKGxl
dHRlclNwYWNpbmcgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgIEFTU0VS
VChsb2dpY2FsV2lkdGggPiBsZXR0ZXJTcGFjaW5nKTsKKyAgICAgICAgcmV0dXJuIGxldHRlclNw
YWNpbmc7CisgICAgfTsKKyAgICBtX2NvbnRpbnVvdXNDb250ZW50LmFwcGVuZChpbmxpbmVJdGVt
LCBsb2dpY2FsV2lkdGgsIGNvbGxhcHNpYmxlV2lkdGgoKSk7CisgICAgbV9oYXNJbmxpbmVMZXZl
bEJveCA9IG1faGFzSW5saW5lTGV2ZWxCb3ggfHwgaW5saW5lSXRlbS5pc0JveCgpIHx8IGlubGlu
ZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpOworfQorCitpbmxpbmUgdm9pZCBMaW5lQ2FuZGlkYXRl
OjpJbmxpbmVDb250ZW50OjpyZXNldCgpCit7CisgICAgbV9jb250aW51b3VzQ29udGVudC5yZXNl
dCgpOworICAgIG1fdHJhaWxpbmdMaW5lQnJlYWsgPSB7IH07CisgICAgbV90cmFpbGluZ1dvcmRC
cmVha09wcG9ydHVuaXR5ID0geyB9OworICAgIG1faGFzSW5saW5lTGV2ZWxCb3ggPSBmYWxzZTsK
K30KKworaW5saW5lIHZvaWQgTGluZUNhbmRpZGF0ZTo6cmVzZXQoKQoreworICAgIGZsb2F0SXRl
bSA9IG51bGxwdHI7CisgICAgaW5saW5lQ29udGVudC5yZXNldCgpOworfQorCitJbmxpbmVMYXlv
dXRVbml0IExpbmVCdWlsZGVyOjppbmxpbmVJdGVtV2lkdGgoY29uc3QgSW5saW5lSXRlbSYgaW5s
aW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpIGNvbnN0Cit7Cisg
ICAgaWYgKGlzPElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKSkgeworICAgICAgICBhdXRvJiBp
bmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKTsKKyAg
ICAgICAgaWYgKGF1dG8gY29udGVudFdpZHRoID0gaW5saW5lVGV4dEl0ZW0ud2lkdGgoKSkKKyAg
ICAgICAgICAgIHJldHVybiAqY29udGVudFdpZHRoOworICAgICAgICBpZiAoIWlubGluZVRleHRJ
dGVtLmlzV2hpdGVzcGFjZSgpIHx8IElubGluZVRleHRJdGVtOjpzaG91bGRQcmVzZXJ2ZVNwYWNl
c0FuZFRhYnMoaW5saW5lVGV4dEl0ZW0pKQorICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlsOjp3
aWR0aChpbmxpbmVUZXh0SXRlbSwgY29udGVudExvZ2ljYWxMZWZ0KTsKKyAgICAgICAgcmV0dXJu
IFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwg
aW5saW5lVGV4dEl0ZW0uc3RhcnQoKSArIDEsIGNvbnRlbnRMb2dpY2FsTGVmdCk7CisgICAgfQor
CisgICAgaWYgKGlubGluZUl0ZW0uaXNMaW5lQnJlYWsoKSB8fCBpbmxpbmVJdGVtLmlzV29yZEJy
ZWFrT3Bwb3J0dW5pdHkoKSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIGF1dG8mIGxheW91
dEJveCA9IGlubGluZUl0ZW0ubGF5b3V0Qm94KCk7CisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBt
X2lubGluZUZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisKKyAg
ICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCisgICAgICAgIHJldHVybiBi
b3hHZW9tZXRyeS5tYXJnaW5Cb3hXaWR0aCgpOworCisgICAgaWYgKGxheW91dEJveC5pc1JlcGxh
Y2VkQm94KCkpCisgICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5Cb3hXaWR0aCgpOwor
CisgICAgaWYgKGlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpKQorICAgICAgICByZXR1cm4g
Ym94R2VvbWV0cnkubWFyZ2luU3RhcnQoKSArIGJveEdlb21ldHJ5LmJvcmRlckxlZnQoKSArIGJv
eEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCkudmFsdWVPcigwKTsKKworICAgIGlmIChpbmxpbmVJdGVt
LmlzSW5saW5lQm94RW5kKCkpCisgICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5FbmQo
KSArIGJveEdlb21ldHJ5LmJvcmRlclJpZ2h0KCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nUmlnaHQo
KS52YWx1ZU9yKDApOworCisgICAgLy8gTm9uLXJlcGxhY2VkIGlubGluZSBib3ggKGUuZy4gaW5s
aW5lLWJsb2NrKQorICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5Cb3hXaWR0aCgpOworfQor
CitMaW5lQnVpbGRlcjo6TGluZUJ1aWxkZXIoSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGlu
ZUZvcm1hdHRpbmdDb250ZXh0LCBGbG9hdGluZ1N0YXRlJiBmbG9hdGluZ1N0YXRlLCBIb3Jpem9u
dGFsQ29uc3RyYWludHMgcm9vdEhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgSW5saW5lSXRl
bXMmIGlubGluZUl0ZW1zKQorICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1faW5saW5lRm9ybWF0dGluZ1N0YXRlKCZpbmxpbmVG
b3JtYXR0aW5nQ29udGV4dC5mb3JtYXR0aW5nU3RhdGUoKSkKKyAgICAsIG1fZmxvYXRpbmdTdGF0
ZSgmZmxvYXRpbmdTdGF0ZSkKKyAgICAsIG1fcm9vdEhvcml6b250YWxDb25zdHJhaW50cyhyb290
SG9yaXpvbnRhbENvbnN0cmFpbnRzKQorICAgICwgbV9saW5lKGlubGluZUZvcm1hdHRpbmdDb250
ZXh0KQorICAgICwgbV9pbmxpbmVJdGVtcyhpbmxpbmVJdGVtcykKK3sKK30KKworTGluZUJ1aWxk
ZXI6OkxpbmVCdWlsZGVyKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dCwgY29uc3QgSW5saW5lSXRlbXMmIGlubGluZUl0ZW1zKQorICAgIDogbV9p
bmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1f
bGluZShpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1faW5saW5lSXRlbXMoaW5saW5l
SXRlbXMpCit7Cit9CisKK0xpbmVCdWlsZGVyOjpMaW5lQ29udGVudCBMaW5lQnVpbGRlcjo6bGF5
b3V0SW5saW5lQ29udGVudChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2Us
IHNpemVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91
dFVuaXQ+IG92ZXJmbG93TG9naWNhbFdpZHRoLCBjb25zdCBJbmxpbmVSZWN0JiBpbml0aWFsTGlu
ZUxvZ2ljYWxSZWN0LCBib29sIGlzRmlyc3RMaW5lKQoreworICAgIGluaXRpYWxpemUoaW5pdGlh
bENvbnN0cmFpbnRzRm9yTGluZShpbml0aWFsTGluZUxvZ2ljYWxSZWN0LCBpc0ZpcnN0TGluZSkp
OworCisgICAgYXV0byBjb21taXR0ZWRDb250ZW50ID0gcGxhY2VJbmxpbmVDb250ZW50KG5lZWRz
TGF5b3V0UmFuZ2UsIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCwgb3ZlcmZsb3dMb2dpY2Fs
V2lkdGgpOworICAgIGF1dG8gY29tbWl0dGVkUmFuZ2UgPSBjbG9zZShuZWVkc0xheW91dFJhbmdl
LCBjb21taXR0ZWRDb250ZW50KTsKKworICAgIGF1dG8gaXNMYXN0TGluZSA9IGlzTGFzdExpbmVX
aXRoSW5saW5lQ29udGVudChjb21taXR0ZWRSYW5nZSwgbmVlZHNMYXlvdXRSYW5nZS5lbmQsIGNv
bW1pdHRlZENvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCk7CisgICAgcmV0dXJu
IExpbmVDb250ZW50IHsgY29tbWl0dGVkUmFuZ2UsIGNvbW1pdHRlZENvbnRlbnQucGFydGlhbFRy
YWlsaW5nQ29udGVudExlbmd0aCwgY29tbWl0dGVkQ29udGVudC5vdmVyZmxvd0xvZ2ljYWxXaWR0
aCwgbV9mbG9hdHMsIG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0CisgICAgICAgICwgbV9s
aW5lTG9naWNhbFJlY3QudG9wTGVmdCgpCisgICAgICAgICwgbV9saW5lTG9naWNhbFJlY3Qud2lk
dGgoKQorICAgICAgICAsIG1fbGluZS5jb250ZW50TG9naWNhbFdpZHRoKCkKKyAgICAgICAgLCBp
c0xhc3RMaW5lCisgICAgICAgICwgbV9saW5lLm5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3Vu
dCgpCisgICAgICAgICwgbV9saW5lLnJ1bnMoKX07Cit9CisKK0xpbmVCdWlsZGVyOjpJbnRyaW5z
aWNDb250ZW50IExpbmVCdWlsZGVyOjpjb21wdXRlZEludHJpbnNpY1dpZHRoKGNvbnN0IElubGlu
ZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVX
aWR0aCkKK3sKKyAgICBpbml0aWFsaXplKHsgeyB7IH0sIHsgYXZhaWxhYmxlV2lkdGgsIG1heElu
bGluZUxheW91dFVuaXQoKSB9IH0sIGZhbHNlIH0pOworICAgIGF1dG8gY29tbWl0dGVkQ29udGVu
dCA9IHBsYWNlSW5saW5lQ29udGVudChuZWVkc0xheW91dFJhbmdlLCB7IH0sIHsgfSk7CisgICAg
YXV0byBjb21taXR0ZWRSYW5nZSA9IGNsb3NlKG5lZWRzTGF5b3V0UmFuZ2UsIGNvbW1pdHRlZENv
bnRlbnQpOworICAgIHJldHVybiB7IGNvbW1pdHRlZFJhbmdlLCBtX2xpbmUuY29udGVudExvZ2lj
YWxXaWR0aCgpLCBtX2Zsb2F0cyB9OworfQorCit2b2lkIExpbmVCdWlsZGVyOjppbml0aWFsaXpl
KGNvbnN0IFVzZWRDb25zdHJhaW50cyYgbGluZUNvbnN0cmFpbnRzKQoreworICAgIG1fZmxvYXRz
LmNsZWFyKCk7CisgICAgbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtID0geyB9OworICAgIG1fd3Jh
cE9wcG9ydHVuaXR5TGlzdC5jbGVhcigpOworCisgICAgbV9saW5lLmluaXRpYWxpemUoKTsKKyAg
ICBtX2xpbmVMb2dpY2FsUmVjdCA9IGxpbmVDb25zdHJhaW50cy5sb2dpY2FsUmVjdDsKKyAgICBt
X2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IGxpbmVDb25zdHJhaW50cy5pc0NvbnN0cmFp
bmVkQnlGbG9hdDsKK30KKworTGluZUJ1aWxkZXI6OkNvbW1pdHRlZENvbnRlbnQgTGluZUJ1aWxk
ZXI6OnBsYWNlSW5saW5lQ29udGVudChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0
UmFuZ2UsIHNpemVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgpCit7CisgICAgYXV0byBsaW5lQ2FuZGlk
YXRlID0gTGluZUNhbmRpZGF0ZSB7IGxheW91dFN0YXRlKCkuc2hvdWxkSWdub3JlVHJhaWxpbmdM
ZXR0ZXJTcGFjaW5nKCkgfTsKKyAgICBhdXRvIGlubGluZUNvbnRlbnRCcmVha2VyID0gSW5saW5l
Q29udGVudEJyZWFrZXIgeyB9OworCisgICAgYXV0byBjdXJyZW50SXRlbUluZGV4ID0gbmVlZHNM
YXlvdXRSYW5nZS5zdGFydDsKKyAgICBzaXplX3QgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50ID0g
MDsKKyAgICB3aGlsZSAoY3VycmVudEl0ZW1JbmRleCA8IG5lZWRzTGF5b3V0UmFuZ2UuZW5kKSB7
CisgICAgICAgIC8vIDEuIENvbGxlY3QgdGhlIHNldCBvZiBydW5zIHRoYXQgd2UgY2FuIGNvbW1p
dCB0byB0aGUgbGluZSBhcyBvbmUgZW50aXR5IGUuZy4gPHNwYW4+dGV4dF9hbmRfc3Bhbl9zdGFy
dF9zcGFuX2VuZDwvc3Bhbj4uCisgICAgICAgIC8vIDIuIEFwcGx5IGZsb2F0cyBhbmQgc2hyaW5r
IHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFjZSBlLmcuIDxzcGFuPmludHJ1XzxkaXYgc3R5
bGU9ImZsb2F0OiBsZWZ0Ij48L2Rpdj5zaXZlX2Zsb2F0PC9zcGFuPi4KKyAgICAgICAgLy8gMy4g
Q2hlY2sgaWYgdGhlIGNvbnRlbnQgZml0cyB0aGUgbGluZSBhbmQgY29tbWl0IHRoZSBjb250ZW50
IGFjY29yZGluZ2x5IChmdWxsLCBwYXJ0aWFsIG9yIG5vdCBjb21taXQgYXQgYWxsKS4KKyAgICAg
ICAgLy8gNC4gUmV0dXJuIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGVpdGhlciBi
eSBub3QgYmVpbmcgYWJsZSB0byBmaXQgbW9yZSBjb250ZW50IG9yIGJlY2F1c2Ugb2YgYW4gZXhw
bGljaXQgbGluZSBicmVhay4KKyAgICAgICAgY2FuZGlkYXRlQ29udGVudEZvckxpbmUobGluZUNh
bmRpZGF0ZSwgY3VycmVudEl0ZW1JbmRleCwgbmVlZHNMYXlvdXRSYW5nZSwgcGFydGlhbExlYWRp
bmdDb250ZW50TGVuZ3RoLCBzdGQ6OmV4Y2hhbmdlKGxlYWRpbmdMb2dpY2FsV2lkdGgsIFdURjo6
bnVsbG9wdCksIG1fbGluZS5jb250ZW50TG9naWNhbFJpZ2h0KCkpOworICAgICAgICAvLyBOb3cg
Y2hlY2sgaWYgd2UgY2FuIHB1dCB0aGlzIGNvbnRlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAg
ICAgICAgYXV0byByZXN1bHQgPSBSZXN1bHQgeyB9OworICAgICAgICBpZiAobGluZUNhbmRpZGF0
ZS5mbG9hdEl0ZW0pIHsKKyAgICAgICAgICAgIEFTU0VSVChsaW5lQ2FuZGlkYXRlLmlubGluZUNv
bnRlbnQuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIGhhbmRsZUZsb2F0Q29udGVudCgqbGluZUNh
bmRpZGF0ZS5mbG9hdEl0ZW0pOworICAgICAgICAgICAgLy8gRmxvYXRzIG5ldmVyIHRlcm1pbmF0
ZSB0aGUgbGluZS4KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVJ
bmxpbmVDb250ZW50KGlubGluZUNvbnRlbnRCcmVha2VyLCBuZWVkc0xheW91dFJhbmdlLCBsaW5l
Q2FuZGlkYXRlKTsKKyAgICAgICAgYXV0byBpc0VuZE9mTGluZSA9IHJlc3VsdC5pc0VuZE9mTGlu
ZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllczsKKyAgICAgICAgaWYg
KCFyZXN1bHQuY29tbWl0dGVkQ291bnQuaXNSZXZlcnQpIHsKKyAgICAgICAgICAgIGNvbW1pdHRl
ZElubGluZUl0ZW1Db3VudCArPSByZXN1bHQuY29tbWl0dGVkQ291bnQudmFsdWU7CisgICAgICAg
ICAgICBhdXRvJiBpbmxpbmVDb250ZW50ID0gbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50Owor
ICAgICAgICAgICAgYXV0byBpbmxpbmVDb250ZW50SXNGdWxseUNvbW1pdHRlZCA9IGlubGluZUNv
bnRlbnQuY29udGludW91c0NvbnRlbnQoKS5ydW5zKCkuc2l6ZSgpID09IHJlc3VsdC5jb21taXR0
ZWRDb3VudC52YWx1ZSAmJiAhcmVzdWx0LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGg7Cisg
ICAgICAgICAgICBpZiAoaW5saW5lQ29udGVudElzRnVsbHlDb21taXR0ZWQpIHsKKyAgICAgICAg
ICAgICAgICBpZiAoYXV0byogd29yZEJyZWFrT3Bwb3J0dW5pdHkgPSBpbmxpbmVDb250ZW50LnRy
YWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyA8
d2JyPiBuZWVkcyB0byBiZSBvbiB0aGUgbGluZSBhcyBhbiBlbXB0eSBydW4gc28gdGhhdCB3ZSBj
YW4gY29uc3RydWN0IGFuIGlubGluZSBib3ggYW5kIGNvbXB1dGUgYmFzaWMgZ2VvbWV0cnkuCisg
ICAgICAgICAgICAgICAgICAgICsrY29tbWl0dGVkSW5saW5lSXRlbUNvdW50OworICAgICAgICAg
ICAgICAgICAgICBtX2xpbmUuYXBwZW5kKCp3b3JkQnJlYWtPcHBvcnR1bml0eSwgeyB9KTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlubGluZUNvbnRlbnQudHJhaWxp
bmdMaW5lQnJlYWsoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGdWxseSBjb21taXR0ZWQg
KG9yIGVtcHR5KSBjb250ZW50IGZvbGxvd2VkIGJ5IGEgbGluZSBicmVhayBtZWFucyAiZW5kIG9m
IGxpbmUiLgorICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyB3aWxsIHB1dCB0aGUg
bGluZSBicmVhayBib3ggYXQgdGhlIGVuZCBvZiB0aGUgbGluZSB3aGlsZSBpbiBjYXNlIG9mIHNv
bWUgaW5saW5lIGJveGVzLCB0aGUgbGluZSBicmVhaworICAgICAgICAgICAgICAgICAgICAvLyBj
b3VsZCB2ZXJ5IHdlbGwgYmUgYXQgYW4gZWFybGllciBwb3NpdGlvbi4gVGhpcyBoYXMgbm8gdmlz
dWFsIGltcGxpY2F0aW9ucyBhdCB0aGlzIHBvaW50IHRob3VnaCAob25seSBnZW9tZXRyeSBjb3Jy
ZWN0bmVzcyBvbiB0aGUgbGluZSBicmVhayBib3gpLgorICAgICAgICAgICAgICAgICAgICAvLyBl
LmcuIDxzcGFuIHN0eWxlPSJib3JkZXItcmlnaHQ6IDEwcHggc29saWQgZ3JlZW4iPnRleHQ8YnI+
PC9zcGFuPiB3aGVyZSB0aGUgPGJyPidzIGhvcml6b250YWwgcG9zaXRpb24gaXMgYmVmb3JlIHRo
ZSByaWdodCBib3JkZXIgYW5kIG5vdCBhZnRlci4KKyAgICAgICAgICAgICAgICAgICAgbV9saW5l
LmFwcGVuZCgqaW5saW5lQ29udGVudC50cmFpbGluZ0xpbmVCcmVhaygpLCB7IH0pOworICAgICAg
ICAgICAgICAgICAgICArK2NvbW1pdHRlZElubGluZUl0ZW1Db3VudDsKKyAgICAgICAgICAgICAg
ICAgICAgaXNFbmRPZkxpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQg
PSByZXN1bHQuY29tbWl0dGVkQ291bnQudmFsdWU7CisKKyAgICAgICAgaWYgKGlzRW5kT2ZMaW5l
KSB7CisgICAgICAgICAgICAvLyBXZSBjYW4ndCBwbGFjZSBhbnkgbW9yZSBpdGVtcyBvbiB0aGUg
Y3VycmVudCBsaW5lLgorICAgICAgICAgICAgcmV0dXJuIHsgY29tbWl0dGVkSW5saW5lSXRlbUNv
dW50LCByZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCwgcmVzdWx0Lm92ZXJmbG93
TG9naWNhbFdpZHRoIH07CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudEl0ZW1JbmRleCA9IG5l
ZWRzTGF5b3V0UmFuZ2Uuc3RhcnQgKyBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgKyBtX2Zsb2F0
cy5zaXplKCk7CisgICAgICAgIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCA9IHsgfTsKKyAg
ICB9CisgICAgLy8gTG9va3MgbGlrZSB3ZSd2ZSBydW4gb3V0IG9mIHJ1bnMuCisgICAgcmV0dXJu
IHsgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50LCB7IH0gfTsKK30KKworTGluZUJ1aWxkZXI6Oklu
bGluZUl0ZW1SYW5nZSBMaW5lQnVpbGRlcjo6Y2xvc2UoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBu
ZWVkc0xheW91dFJhbmdlLCBjb25zdCBDb21taXR0ZWRDb250ZW50JiBjb21taXR0ZWRDb250ZW50
KQoreworICAgIEFTU0VSVChjb21taXR0ZWRDb250ZW50LmlubGluZUl0ZW1Db3VudCB8fCAhbV9m
bG9hdHMuaXNFbXB0eSgpIHx8IG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0KTsKKyAgICBh
dXRvIG51bWJlck9mQ29tbWl0dGVkSXRlbXMgPSBjb21taXR0ZWRDb250ZW50LmlubGluZUl0ZW1D
b3VudCArIG1fZmxvYXRzLnNpemUoKTsKKyAgICBhdXRvIHRyYWlsaW5nSW5saW5lSXRlbUluZGV4
ID0gbmVlZHNMYXlvdXRSYW5nZS5zdGFydCArIG51bWJlck9mQ29tbWl0dGVkSXRlbXMgLSAxOwor
ICAgIGF1dG8gbGluZVJhbmdlID0gSW5saW5lSXRlbVJhbmdlIHsgbmVlZHNMYXlvdXRSYW5nZS5z
dGFydCwgdHJhaWxpbmdJbmxpbmVJdGVtSW5kZXggKyAxIH07CisgICAgQVNTRVJUKGxpbmVSYW5n
ZS5lbmQgPD0gbmVlZHNMYXlvdXRSYW5nZS5lbmQpOworICAgIGlmICghY29tbWl0dGVkQ29udGVu
dC5pbmxpbmVJdGVtQ291bnQpIHsKKyAgICAgICAgLy8gTGluZSBpcyBlbXB0eSwgd2Ugb25seSBt
YW5hZ2VkIHRvIHBsYWNlIGZsb2F0IGJveGVzLgorICAgICAgICByZXR1cm4gbGluZVJhbmdlOwor
ICAgIH0KKyAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gbV9saW5lTG9naWNhbFJlY3Qud2lkdGgo
KSAtIG1fbGluZS5jb250ZW50TG9naWNhbFJpZ2h0KCk7CisgICAgbV9saW5lLnJlbW92ZUNvbGxh
cHNpYmxlQ29udGVudChhdmFpbGFibGVXaWR0aCk7CisgICAgYXV0byBob3Jpem9udGFsQWxpZ25t
ZW50ID0gcm9vdCgpLnN0eWxlKCkudGV4dEFsaWduKCk7CisgICAgYXV0byBydW5zRXhwYW5kSG9y
aXpvbnRhbGx5ID0gaG9yaXpvbnRhbEFsaWdubWVudCA9PSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5
ICYmICFpc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQobGluZVJhbmdlLCBuZWVkc0xheW91dFJh
bmdlLmVuZCwgY29tbWl0dGVkQ29udGVudC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoKTsK
KyAgICBpZiAocnVuc0V4cGFuZEhvcml6b250YWxseSkKKyAgICAgICAgbV9saW5lLmFwcGx5UnVu
RXhwYW5zaW9uKG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkgLSBtX2xpbmUuY29udGVudExvZ2lj
YWxSaWdodCgpKTsKKyAgICBhdXRvIGxpbmVFbmRzV2l0aEh5cGhlbiA9IGZhbHNlOworICAgIGlm
ICghbV9saW5lLnJ1bnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgYXV0byYgbGFzdFRleHRDb250
ZW50ID0gbV9saW5lLnJ1bnMoKS5sYXN0KCkudGV4dENvbnRlbnQoKTsKKyAgICAgICAgbGluZUVu
ZHNXaXRoSHlwaGVuID0gbGFzdFRleHRDb250ZW50ICYmIGxhc3RUZXh0Q29udGVudC0+bmVlZHNI
eXBoZW4oKTsKKyAgICB9CisgICAgbV9zdWNjZXNzaXZlSHlwaGVuYXRlZExpbmVDb3VudCA9IGxp
bmVFbmRzV2l0aEh5cGhlbiA/IG1fc3VjY2Vzc2l2ZUh5cGhlbmF0ZWRMaW5lQ291bnQgKyAxIDog
MDsKKyAgICByZXR1cm4gbGluZVJhbmdlOworfQorCitPcHRpb25hbDxIb3Jpem9udGFsQ29uc3Ry
YWludHM+IExpbmVCdWlsZGVyOjpmbG9hdENvbnN0cmFpbnRzKGNvbnN0IElubGluZVJlY3QmIGxp
bmVMb2dpY2FsUmVjdCkgY29uc3QKK3sKKyAgICBhdXRvKiBmbG9hdGluZ1N0YXRlID0gdGhpcy0+
ZmxvYXRpbmdTdGF0ZSgpOworICAgIGlmICghZmxvYXRpbmdTdGF0ZSB8fCBmbG9hdGluZ1N0YXRl
LT5mbG9hdHMoKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICAvLyBDaGVj
ayBmb3IgaW50cnVkaW5nIGZsb2F0cyBhbmQgYWRqdXN0IGxvZ2ljYWwgbGVmdC9hdmFpbGFibGUg
d2lkdGggZm9yIHRoaXMgbGluZSBhY2NvcmRpbmdseS4KKyAgICBhdXRvIGZsb2F0aW5nQ29udGV4
dCA9IEZsb2F0aW5nQ29udGV4dCB7IGZvcm1hdHRpbmdDb250ZXh0KCksICpmbG9hdGluZ1N0YXRl
IH07CisgICAgYXV0byBjb25zdHJhaW50cyA9IGZsb2F0aW5nQ29udGV4dC5jb25zdHJhaW50cyh0
b0xheW91dFVuaXQobGluZUxvZ2ljYWxSZWN0LnRvcCgpKSwgdG9MYXlvdXRVbml0KGxpbmVMb2dp
Y2FsUmVjdC5ib3R0b20oKSkpOworICAgIC8vIENoZWNrIGlmIHRoZXNlIHZhbHVlcyBhY3R1YWxs
eSBjb25zdHJhaW4gdGhlIGxpbmUuCisgICAgaWYgKGNvbnN0cmFpbnRzLmxlZnQgJiYgY29uc3Ry
YWludHMubGVmdC0+eCA8PSBsaW5lTG9naWNhbFJlY3QubGVmdCgpKQorICAgICAgICBjb25zdHJh
aW50cy5sZWZ0ID0geyB9OworCisgICAgaWYgKGNvbnN0cmFpbnRzLnJpZ2h0ICYmIGNvbnN0cmFp
bnRzLnJpZ2h0LT54ID49IGxpbmVMb2dpY2FsUmVjdC5yaWdodCgpKQorICAgICAgICBjb25zdHJh
aW50cy5yaWdodCA9IHsgfTsKKworICAgIGlmICghY29uc3RyYWludHMubGVmdCAmJiAhY29uc3Ry
YWludHMucmlnaHQpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICBhdXRvIGxpbmVMb2dpY2Fs
TGVmdCA9IGxpbmVMb2dpY2FsUmVjdC5sZWZ0KCk7CisgICAgYXV0byBsaW5lTG9naWNhbFJpZ2h0
ID0gbGluZUxvZ2ljYWxSZWN0LnJpZ2h0KCk7CisgICAgaWYgKGNvbnN0cmFpbnRzLmxlZnQgJiYg
Y29uc3RyYWludHMucmlnaHQpIHsKKyAgICAgICAgbGluZUxvZ2ljYWxSaWdodCA9IGNvbnN0cmFp
bnRzLnJpZ2h0LT54OworICAgICAgICBsaW5lTG9naWNhbExlZnQgPSBjb25zdHJhaW50cy5sZWZ0
LT54OworICAgIH0gZWxzZSBpZiAoY29uc3RyYWludHMubGVmdCkgeworICAgICAgICBBU1NFUlQo
Y29uc3RyYWludHMubGVmdC0+eCA+PSBsaW5lTG9naWNhbExlZnQpOworICAgICAgICBsaW5lTG9n
aWNhbExlZnQgPSBjb25zdHJhaW50cy5sZWZ0LT54OworICAgIH0gZWxzZSBpZiAoY29uc3RyYWlu
dHMucmlnaHQpIHsKKyAgICAgICAgLy8gUmlnaHQgZmxvYXQgYm94ZXMgbWF5IG92ZXJmbG93IHRo
ZSBjb250YWluaW5nIGJsb2NrIG9uIHRoZSBsZWZ0LgorICAgICAgICBsaW5lTG9naWNhbFJpZ2h0
ID0gc3RkOjptYXg8SW5saW5lTGF5b3V0VW5pdD4obGluZUxvZ2ljYWxMZWZ0LCBjb25zdHJhaW50
cy5yaWdodC0+eCk7CisgICAgfQorICAgIHJldHVybiBIb3Jpem9udGFsQ29uc3RyYWludHMgeyB0
b0xheW91dFVuaXQobGluZUxvZ2ljYWxMZWZ0KSwgdG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmln
aHQgLSBsaW5lTG9naWNhbExlZnQpIH07Cit9CisKK0xpbmVCdWlsZGVyOjpVc2VkQ29uc3RyYWlu
dHMgTGluZUJ1aWxkZXI6OmluaXRpYWxDb25zdHJhaW50c0ZvckxpbmUoY29uc3QgSW5saW5lUmVj
dCYgaW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgYm9vbCBpc0ZpcnN0TGluZSkgY29uc3QKK3sKKyAg
ICBhdXRvIGxpbmVMb2dpY2FsTGVmdCA9IGluaXRpYWxMaW5lTG9naWNhbFJlY3QubGVmdCgpOwor
ICAgIGF1dG8gbGluZUxvZ2ljYWxSaWdodCA9IGluaXRpYWxMaW5lTG9naWNhbFJlY3QucmlnaHQo
KTsKKyAgICBhdXRvIGxpbmVJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IGZhbHNlOworCisgICAgaWYg
KGF1dG8gbGluZUNvbnN0cmFpbnRzID0gZmxvYXRDb25zdHJhaW50cyhpbml0aWFsTGluZUxvZ2lj
YWxSZWN0KSkgeworICAgICAgICBsaW5lTG9naWNhbExlZnQgPSBsaW5lQ29uc3RyYWludHMtPmxv
Z2ljYWxMZWZ0OworICAgICAgICBsaW5lTG9naWNhbFJpZ2h0ID0gbGluZUNvbnN0cmFpbnRzLT5s
b2dpY2FsUmlnaHQoKTsKKyAgICAgICAgbGluZUlzQ29uc3RyYWluZWRCeUZsb2F0ID0gdHJ1ZTsK
KyAgICB9CisKKyAgICBhdXRvIGNvbXB1dGVkVGV4dEluZGVudCA9IFsmXSgpIC0+IElubGluZUxh
eW91dFVuaXQgeworICAgICAgICAvLyB0ZXh0LWluZGVudCBwcm9wZXJ0eSBzcGVjaWZpZXMgdGhl
IGluZGVudGF0aW9uIGFwcGxpZWQgdG8gbGluZXMgb2YgaW5saW5lIGNvbnRlbnQgaW4gYSBibG9j
ay4KKyAgICAgICAgLy8gVGhlIGluZGVudCBpcyB0cmVhdGVkIGFzIGEgbWFyZ2luIGFwcGxpZWQg
dG8gdGhlIHN0YXJ0IGVkZ2Ugb2YgdGhlIGxpbmUgYm94LgorICAgICAgICAvLyBVbmxlc3Mgb3Ro
ZXJ3aXNlIHNwZWNpZmllZCwgb25seSBsaW5lcyB0aGF0IGFyZSB0aGUgZmlyc3QgZm9ybWF0dGVk
IGxpbmUgb2YgYW4gZWxlbWVudCBhcmUgYWZmZWN0ZWQuCisgICAgICAgIC8vIEZvciBleGFtcGxl
LCB0aGUgZmlyc3QgbGluZSBvZiBhbiBhbm9ueW1vdXMgYmxvY2sgYm94IGlzIG9ubHkgYWZmZWN0
ZWQgaWYgaXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJlbnQgZWxlbWVudC4KKyAgICAg
ICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBlYWNoLWxpbmUuCisgICAgICAgIC8vIFtJbnRl
Z3JhdGlvbl0gcm9vdCgpLT5wYXJlbnQoKSB3b3VsZCBub3JtYWxseSBwcm9kdWNlIGEgdmFsaWQg
bGF5b3V0IGJveC4KKyAgICAgICAgYXV0byYgcm9vdCA9IHRoaXMtPnJvb3QoKTsKKyAgICAgICAg
YXV0byBpc0Zvcm1hdHRpbmdDb250ZXh0Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCA9ICFyb290
LmlzQW5vbnltb3VzKCk7CisgICAgICAgIGlmIChyb290LmlzQW5vbnltb3VzKCkpIHsKKyAgICAg
ICAgICAgIC8vIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRoZSBlYWNoLWxpbmUgYW5k
L29yIGhhbmdpbmcga2V5d29yZHMsIG9ubHkgbGluZXMgdGhhdCBhcmUgdGhlIGZpcnN0IGZvcm1h
dHRlZCBsaW5lCisgICAgICAgICAgICAvLyBvZiBhbiBlbGVtZW50IGFyZSBhZmZlY3RlZC4KKyAg
ICAgICAgICAgIC8vIEZvciBleGFtcGxlLCB0aGUgZmlyc3QgbGluZSBvZiBhbiBhbm9ueW1vdXMg
YmxvY2sgYm94IGlzIG9ubHkgYWZmZWN0ZWQgaWYgaXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGl0
cyBwYXJlbnQgZWxlbWVudC4KKyAgICAgICAgICAgIGF1dG8gaXNJbnRlZ3JhdGVkUm9vdEJveEZp
cnN0Q2hpbGQgPSBsYXlvdXRTdGF0ZSgpLmlzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkKCk7
CisgICAgICAgICAgICBpZiAoaXNJbnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQgPT0gTGF5b3V0
U3RhdGU6OklzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkOjpOb3RBcHBsaWNhYmxlKQorICAg
ICAgICAgICAgICAgIGlzRm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9UZXh0SW5kZW50
ID0gcm9vdC5wYXJlbnQoKS5maXJzdEluRmxvd0NoaWxkKCkgPT0gJnJvb3Q7CisgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgaXNGb3JtYXR0aW5nQ29udGV4dFJvb3RDYW5kaWRhdGVU
b1RleHRJbmRlbnQgPSBpc0ludGVncmF0ZWRSb290Qm94Rmlyc3RDaGlsZCA9PSBMYXlvdXRTdGF0
ZTo6SXNJbnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQ6OlllczsKKyAgICAgICAgfQorICAgICAg
ICBpZiAoIWlzRm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9UZXh0SW5kZW50KQorICAg
ICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgYXV0byBpbnZlcnRMaW5lUmFuZ2UgPSByb290
LnN0eWxlKCkudGV4dEluZGVudFR5cGUoKSA9PSBUZXh0SW5kZW50VHlwZTo6SGFuZ2luZzsKKyAg
ICAgICAgLy8gdGV4dC1pbmRlbnQ6IGhhbmdpbmcgaW52ZXJ0cyB3aGljaCBsaW5lcyBhcmUgYWZm
ZWN0ZWQuCisgICAgICAgIC8vIGludmVydGVkIGxpbmUgcmFuZ2UgLT4gYWxsIHRoZSBsaW5lcyBl
eGNlcHQgdGhlIGZpcnN0IG9uZS4KKyAgICAgICAgLy8gIWludmVydGVkIGxpbmUgcmFuZ2UgLT4g
Zmlyc3QgbGluZSBnZXRzIHRoZSBpbmRlbnQuCisgICAgICAgIGF1dG8gc2hvdWxkSW5kZW50ID0g
aW52ZXJ0TGluZVJhbmdlICE9IGlzRmlyc3RMaW5lOworICAgICAgICBpZiAoIXNob3VsZEluZGVu
dCkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisKKyAgICAgICAgYXV0byB0ZXh0SW5kZW50ID0g
cm9vdC5zdHlsZSgpLnRleHRJbmRlbnQoKTsKKyAgICAgICAgaWYgKHRleHRJbmRlbnQgPT0gUmVu
ZGVyU3R5bGU6OmluaXRpYWxUZXh0SW5kZW50KCkpCisgICAgICAgICAgICByZXR1cm4geyB9Owor
ICAgICAgICByZXR1cm4geyBtaW5pbXVtVmFsdWVGb3JMZW5ndGgodGV4dEluZGVudCwgaW5pdGlh
bExpbmVMb2dpY2FsUmVjdC53aWR0aCgpKSB9OworICAgIH07CisgICAgbGluZUxvZ2ljYWxMZWZ0
ICs9IGNvbXB1dGVkVGV4dEluZGVudCgpOworICAgIHJldHVybiBVc2VkQ29uc3RyYWludHMgeyB7
IGluaXRpYWxMaW5lTG9naWNhbFJlY3QudG9wKCksIGxpbmVMb2dpY2FsTGVmdCwgbGluZUxvZ2lj
YWxSaWdodCAtIGxpbmVMb2dpY2FsTGVmdCwgaW5pdGlhbExpbmVMb2dpY2FsUmVjdC5oZWlnaHQo
KSB9LCBsaW5lSXNDb25zdHJhaW5lZEJ5RmxvYXQgfTsKK30KKwordm9pZCBMaW5lQnVpbGRlcjo6
Y2FuZGlkYXRlQ29udGVudEZvckxpbmUoTGluZUNhbmRpZGF0ZSYgbGluZUNhbmRpZGF0ZSwgc2l6
ZV90IGN1cnJlbnRJbmxpbmVJdGVtSW5kZXgsIGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGF5b3V0
UmFuZ2UsIHNpemVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgsIElubGluZUxheW91dFVuaXQgY3VycmVu
dExvZ2ljYWxSaWdodCkKK3sKKyAgICBBU1NFUlQoY3VycmVudElubGluZUl0ZW1JbmRleCA8IGxh
eW91dFJhbmdlLmVuZCk7CisgICAgbGluZUNhbmRpZGF0ZS5yZXNldCgpOworICAgIC8vIDEuIFNp
bXBseSBhZGQgYW55IG92ZXJmbG93IGNvbnRlbnQgZnJvbSB0aGUgcHJldmlvdXMgbGluZSB0byB0
aGUgY2FuZGlkYXRlIGNvbnRlbnQuIEl0J3MgYWx3YXlzIGEgdGV4dCBjb250ZW50LgorICAgIC8v
IDIuIEZpbmQgdGhlIG5leHQgc29mdCB3cmFwIHBvc2l0aW9uIG9yIGV4cGxpY2l0IGxpbmUgYnJl
YWsuCisgICAgLy8gMy4gQ29sbGVjdCBmbG9hdHMgYmV0d2VlbiB0aGUgaW5saW5lIGNvbnRlbnQu
CisgICAgYXV0byBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggPSBuZXh0V3JhcE9wcG9ydHVuaXR5
KGN1cnJlbnRJbmxpbmVJdGVtSW5kZXgsIGxheW91dFJhbmdlKTsKKyAgICAvLyBzb2Z0V3JhcE9w
cG9ydHVuaXR5SW5kZXggPT0gbGF5b3V0UmFuZ2UuZW5kIG1lYW5zIHdlIGRvbid0IGhhdmUgYW55
IHdyYXAgb3Bwb3J0dW5pdHkgaW4gdGhpcyBjb250ZW50LgorICAgIEFTU0VSVChzb2Z0V3JhcE9w
cG9ydHVuaXR5SW5kZXggPD0gbGF5b3V0UmFuZ2UuZW5kKTsKKworICAgIGlmIChwYXJ0aWFsTGVh
ZGluZ0NvbnRlbnRMZW5ndGgpIHsKKyAgICAgICAgLy8gSGFuZGxlIGxlYWRpbmcgcGFydGlhbCBj
b250ZW50IGZpcnN0IChvdmVyZmxvd2luZyB0ZXh0IGZyb20gdGhlIHByZXZpb3VzIGxpbmUpLgor
ICAgICAgICAvLyBDb25zdHJ1Y3QgYSBwYXJ0aWFsIGxlYWRpbmcgaW5saW5lIGl0ZW0uCisgICAg
ICAgIG1fcGFydGlhbExlYWRpbmdUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPiht
X2lubGluZUl0ZW1zW2N1cnJlbnRJbmxpbmVJdGVtSW5kZXhdKS5yaWdodChwYXJ0aWFsTGVhZGlu
Z0NvbnRlbnRMZW5ndGgpOworICAgICAgICBhdXRvIGl0ZW1XaWR0aCA9IGxlYWRpbmdMb2dpY2Fs
V2lkdGggPyAqc3RkOjpleGNoYW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6Om51bGxvcHQp
IDogaW5saW5lSXRlbVdpZHRoKCptX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0sIGN1cnJlbnRMb2dp
Y2FsUmlnaHQpOworICAgICAgICBsaW5lQ2FuZGlkYXRlLmlubGluZUNvbnRlbnQuYXBwZW5kSW5s
aW5lSXRlbSgqbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtLCBpdGVtV2lkdGgpOworICAgICAgICBj
dXJyZW50TG9naWNhbFJpZ2h0ICs9IGl0ZW1XaWR0aDsKKyAgICAgICAgKytjdXJyZW50SW5saW5l
SXRlbUluZGV4OworICAgIH0KKworICAgIGZvciAoYXV0byBpbmRleCA9IGN1cnJlbnRJbmxpbmVJ
dGVtSW5kZXg7IGluZGV4IDwgc29mdFdyYXBPcHBvcnR1bml0eUluZGV4OyArK2luZGV4KSB7Cisg
ICAgICAgIGF1dG8mIGlubGluZUl0ZW0gPSBtX2lubGluZUl0ZW1zW2luZGV4XTsKKyAgICAgICAg
aWYgKGlubGluZUl0ZW0uaXNGbG9hdCgpKSB7CisgICAgICAgICAgICBsaW5lQ2FuZGlkYXRlLmZs
b2F0SXRlbSA9ICZpbmxpbmVJdGVtOworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNvZnQgd3Jh
cCBvcHBvcnR1bml0eSwgbXVzdCBiZSB0aGUgb25seSBpdGVtIGluIHRoZSBsaXN0LgorICAgICAg
ICAgICAgQVNTRVJUKGN1cnJlbnRJbmxpbmVJdGVtSW5kZXggKyAxID09IHNvZnRXcmFwT3Bwb3J0
dW5pdHlJbmRleCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBp
ZiAoaW5saW5lSXRlbS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8
fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkgfHwgaW5saW5lSXRlbS5pc0JveCgpKSB7Cisg
ICAgICAgICAgICBBU1NFUlQoIWxlYWRpbmdMb2dpY2FsV2lkdGggfHwgaW5saW5lSXRlbS5pc1Rl
eHQoKSk7CisgICAgICAgICAgICBhdXRvIGxvZ2ljYWxXaWR0aCA9IGxlYWRpbmdMb2dpY2FsV2lk
dGggPyAqc3RkOjpleGNoYW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6Om51bGxvcHQpIDog
aW5saW5lSXRlbVdpZHRoKGlubGluZUl0ZW0sIGN1cnJlbnRMb2dpY2FsUmlnaHQpOworICAgICAg
ICAgICAgbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmFwcGVuZElubGluZUl0ZW0oaW5saW5l
SXRlbSwgbG9naWNhbFdpZHRoKTsKKyAgICAgICAgICAgIGN1cnJlbnRMb2dpY2FsUmlnaHQgKz0g
bG9naWNhbFdpZHRoOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAg
aWYgKGlubGluZUl0ZW0uaXNMaW5lQnJlYWsoKSB8fCBpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bw
b3J0dW5pdHkoKSkgeworICAgICAgICAgICAgLy8gU2luY2UgYm90aCA8YnI+IGFuZCA8d2JyPiBh
cmUgZXhwbGljaXQgd29yZCBicmVhayBvcHBvcnR1bml0aWVzIHRoZXkgaGF2ZSB0byBiZSB0cmFp
bGluZyBpdGVtcyBpbiB0aGlzIGNhbmRpZGF0ZSBydW4gbGlzdCB1bmxlc3MgdGhleSBhcmUgZW1i
ZWRkZWQgaW4gaW5saW5lIGJveGVzLgorICAgICAgICAgICAgLy8gZS5nLiA8c3Bhbj48d2JyPjwv
c3Bhbj4KKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgICAgICAgICAgZm9yIChhdXRvIGkgPSBpbmRl
eCArIDE7IGkgPCBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXg7ICsraSkKKyAgICAgICAgICAgICAg
ICBBU1NFUlQobV9pbmxpbmVJdGVtc1tpXS5pc0lubGluZUJveEVuZCgpKTsKKyNlbmRpZgorICAg
ICAgICAgICAgaW5saW5lSXRlbS5pc0xpbmVCcmVhaygpID8gbGluZUNhbmRpZGF0ZS5pbmxpbmVD
b250ZW50LmFwcGVuZFRyYWlsaW5nTGluZUJyZWFrKGlubGluZUl0ZW0pIDogbGluZUNhbmRpZGF0
ZS5pbmxpbmVDb250ZW50LmFwcGVuZHRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoaW5saW5l
SXRlbSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgYXV0byBpbmxpbmVDb250ZW50RW5kc0luU29mdFdy
YXBPcHBvcnR1bml0eSA9IFsmXSB7CisgICAgICAgIGlmICghc29mdFdyYXBPcHBvcnR1bml0eUlu
ZGV4IHx8IHNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCA9PSBsYXlvdXRSYW5nZS5lbmQpIHsKKyAg
ICAgICAgICAgIC8vIFRoaXMgY2FuZGlkYXRlIGlubGluZSBjb250ZW50IGVuZHMgYmVjYXVzZSB0
aGUgZW50aXJlIGNvbnRlbnQgZW5kcyBhbmQgbm90IGJlY2F1c2UgdGhlcmUncyBhIHNvZnQgd3Jh
cCBvcHBvcnR1bml0eS4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
ICAgICBpZiAobV9pbmxpbmVJdGVtc1tzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggLSAxXS5pc0Zs
b2F0KCkpIHsKKyAgICAgICAgICAgIC8vIFdoaWxlIHdlIHN0b3AgYXQgZmxvYXRzLCB0aGV5IGFy
ZSBub3QgY29uc2lkZXJlZCByZWFsIHNvZnQgd3JhcCBvcHBvcnR1bml0aWVzLiAKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cu
dzMub3JnL1RSL2Nzcy10ZXh0LTMvI2xpbmUtYnJlYWstZGV0YWlscworICAgICAgICBhdXRvJiB0
cmFpbGluZ0lubGluZUl0ZW0gPSBtX2lubGluZUl0ZW1zW3NvZnRXcmFwT3Bwb3J0dW5pdHlJbmRl
eCAtIDFdOworICAgICAgICBpZiAodHJhaWxpbmdJbmxpbmVJdGVtLmlzQm94KCkgfHwgdHJhaWxp
bmdJbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkgfHwgdHJhaWxpbmdJbmxpbmVJdGVtLmlzV29yZEJy
ZWFrT3Bwb3J0dW5pdHkoKSB8fCB0cmFpbGluZ0lubGluZUl0ZW0uaXNJbmxpbmVCb3hFbmQoKSkg
eworICAgICAgICAgICAgLy8gRm9yIFdlYi1jb21wYXRpYmlsaXR5IHRoZXJlIGlzIGEgc29mdCB3
cmFwIG9wcG9ydHVuaXR5IGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCByZXBsYWNlZCBlbGVtZW50IG9y
IG90aGVyIGF0b21pYyBpbmxpbmUuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
fQorICAgICAgICBpZiAodHJhaWxpbmdJbmxpbmVJdGVtLmlzVGV4dCgpKSB7CisgICAgICAgICAg
ICBhdXRvJiBpbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPih0cmFpbGlu
Z0lubGluZUl0ZW0pOworICAgICAgICAgICAgaWYgKGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFj
ZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgLy8gTm93IGlu
IGNhc2Ugb2Ygbm9uLXdoaXRlc3BhY2UgdHJhaWxpbmcgY29udGVudCwgd2UgbmVlZCB0byBjaGVj
ayBpZiB0aGUgYWN0dWFsIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBiZWxvbmdzIHRvIHRoZSBuZXh0
IHNldC4KKyAgICAgICAgICAgIC8vIGUuZy4gInRoaXNfaXNfdGhlX3RyYWlsaW5nX3J1bjxzcGFu
PiA8LWJ1dF90aGlzX3NwYWNlX2hlcmVfaXNfdGhlX3NvZnRfd3JhcF9vcHBvcnR1bml0eSIKKyAg
ICAgICAgICAgIC8vIFdoZW4gdGhlcmUncyBhbiBpbmxpbmUgYm94IHN0YXJ0KDxzcGFuPikvZW5k
KDwvc3Bhbj4pIGJldHdlZW4gdGhlIHRyYWlsaW5nIGFuZCB0aGUgKG5leHQpbGVhZGluZyBydW4s
IHdoaWxlIHdlIGJyZWFrIGJlZm9yZSB0aGUgaW5saW5lIGJveCBzdGFydCAoPHNwYW4+KQorICAg
ICAgICAgICAgLy8gdGhlIGFjdHVhbCBzb2Z0IHdyYXAgcG9zaXRpb24gaXMgYWZ0ZXIgdGhlIGlu
bGluZSBib3ggc3RhcnQgKDxzcGFuPikgYnV0IGluIHRlcm1zIG9mIGxpbmUgYnJlYWtpbmcgY29u
dGludWl0eSB0aGUgaW5saW5lIGJveCBzdGFydCAoPHNwYW4+KSBhbmQgdGhlIHdoaXRlc3BhY2Ug
cnVuIGJlbG9uZyB0b2dldGhlci4KKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKGxheW91dFJh
bmdlLmVuZCA8PSBtX2lubGluZUl0ZW1zLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGF1dG8g
aW5kZXggPSBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXg7IGluZGV4IDwgbGF5b3V0UmFuZ2UuZW5k
OyArK2luZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKG1faW5saW5lSXRlbXNbaW5kZXhdLmlz
SW5saW5lQm94U3RhcnQoKSB8fCBtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJveEVuZCgp
KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvLyBGSVhN
RTogQ2hlY2sgaWYgW25vbi13aGl0ZXNwYWNlXVtpbmxpbmUtYm94XVtuby13aGl0ZXNwYWNlXSBj
b250ZW50IGhhcyBydWxlcyBhYm91dCBpdC4KKyAgICAgICAgICAgICAgICAvLyBGb3Igbm93IGxl
dCdzIHNheSB0aGUgc29mdCB3cmFwIHBvc2l0aW9uIGJlbG9uZ3MgdG8gdGhlIG5leHQgc2V0IG9m
IHJ1bnMgd2hlbiBbbm9uLXdoaXRlc3BhY2VdW2lubGluZS1ib3hdW3doaXRlc3BhY2VdLCBbbm9u
LXdoaXRlc3BhY2VdW2lubGluZS1ib3hdW2JveF0gZXRjLgorICAgICAgICAgICAgICAgIHJldHVy
biBtX2lubGluZUl0ZW1zW2luZGV4XS5pc1RleHQoKSAmJiAhZG93bmNhc3Q8SW5saW5lVGV4dEl0
ZW0+KG1faW5saW5lSXRlbXNbaW5kZXhdKS5pc1doaXRlc3BhY2UoKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworICAgIGxpbmVDYW5kaWRh
dGUuaW5saW5lQ29udGVudC5zZXRIYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoaW5saW5l
Q29udGVudEVuZHNJblNvZnRXcmFwT3Bwb3J0dW5pdHkoKSk7Cit9CisKK3NpemVfdCBMaW5lQnVp
bGRlcjo6bmV4dFdyYXBPcHBvcnR1bml0eShzaXplX3Qgc3RhcnRJbmRleCwgY29uc3QgTGluZUJ1
aWxkZXI6OklubGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFuZ2UpIGNvbnN0Cit7CisgICAgLy8gMS4g
RmluZCB0aGUgc3RhcnQgY2FuZGlkYXRlIGJ5IHNraXBwaW5nIGxlYWRpbmcgbm9uLWNvbnRlbnQg
aXRlbXMgZS5nICI8c3Bhbj48c3Bhbj5zdGFydCIuIE9wcG9ydHVuaXR5IGlzIGFmdGVyICI8c3Bh
bj48c3Bhbj4iLgorICAgIC8vIDIuIEZpbmQgdGhlIGVuZCBjYW5kaWRhdGUgYnkgc2tpcHBpbmcg
bm9uLWNvbnRlbnQgaXRlbXMgaW5iZXR3ZWVuIGUuZy4gIjxzcGFuPjxzcGFuPnN0YXJ0PC9zcGFu
PmVuZCIuIE9wcG9ydHVuaXR5IGlzIGFmdGVyICI8L3NwYW4+Ii4KKyAgICAvLyAzLiBDaGVjayBp
ZiB0aGVyZSdzIGEgc29mdCB3cmFwIG9wcG9ydHVuaXR5IGJldHdlZW4gdGhlIDIgY2FuZGlkYXRl
IGlubGluZSBpdGVtcyBhbmQgcmVwZWF0LgorICAgIC8vIDQuIEFueSBmb3JjZSBsaW5lIGJyZWFr
L2V4cGxpY2l0IHdyYXAgY29udGVudCBpbmJldHdlZW4gaXMgY29uc2lkZXJlZCBhcyB3cmFwIG9w
cG9ydHVuaXR5LgorCisgICAgLy8gW2V4LV1baW5saW5lIGJveCBzdGFydF1baW5saW5lIGJveCBl
bmRdW2Zsb2F0XVthbXBsZV0gKGV4LTxzcGFuPjwvc3Bhbj48ZGl2IHN0eWxlPSJmbG9hdDpsZWZ0
Ij48L2Rpdj5hbXBsZSkuIFdyYXAgaW5kZXggaXMgYXQgW2V4LV0uCisgICAgLy8gW2V4XVtpbmxp
bmUgYm94IHN0YXJ0XVthbXAtXVtpbmxpbmUgYm94IHN0YXJ0XVtsZV0gKGV4PHNwYW4+YW1wLTxz
cGFuPmFtcGxlKS4gV3JhcCBpbmRleCBpcyBhdCBbYW1wLV0uCisgICAgLy8gW2V4LV1baW5saW5l
IGJveCBzdGFydF1bbGluZSBicmVha11bYW1wbGVdIChleC08c3Bhbj48YnI+YW1wbGUpLiBXcmFw
IGluZGV4IGlzIGFmdGVyIFticl0uCisgICAgYXV0byBwcmV2aW91c0lubGluZUl0ZW1JbmRleCA9
IE9wdGlvbmFsPHNpemVfdD4geyB9OworICAgIGZvciAoYXV0byBpbmRleCA9IHN0YXJ0SW5kZXg7
IGluZGV4IDwgbGF5b3V0UmFuZ2UuZW5kOyArK2luZGV4KSB7CisgICAgICAgIGF1dG8mIGlubGlu
ZUl0ZW0gPSBtX2lubGluZUl0ZW1zW2luZGV4XTsKKyAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNM
aW5lQnJlYWsoKSB8fCBpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkgeworICAg
ICAgICAgICAgLy8gV2UgYWx3YXlzIHN0b3AgYXQgZXhwbGljaXQgd3JhcHBpbmcgb3Bwb3J0dW5p
dGllcyBlLmcuIDxicj4uIEhvd2V2ZXIgdGhlIHdyYXAgcG9zaXRpb24gbWF5IGJlIGF0IGxhdGVy
IHBvc2l0aW9uLgorICAgICAgICAgICAgLy8gZS5nLiA8c3Bhbj48c3Bhbj48YnI+PC9zcGFuPjwv
c3Bhbj4gPC0gd3JhcCBwb3NpdGlvbiBpcyBhZnRlciB0aGUgc2Vjb25kIDwvc3Bhbj4KKyAgICAg
ICAgICAgIC8vIGJ1dCBpbiBjYXNlIG9mIDxzcGFuPjxicj48c3Bhbj48L3NwYW4+PC9zcGFuPiA8
LSB3cmFwIHBvc2l0aW9uIGlzIHJpZ2h0IGFmdGVyIDxicj4uCisgICAgICAgICAgICBmb3IgKCsr
aW5kZXg7IGluZGV4IDwgbGF5b3V0UmFuZ2UuZW5kICYmIG1faW5saW5lSXRlbXNbaW5kZXhdLmlz
SW5saW5lQm94RW5kKCk7ICsraW5kZXgpIHsgfQorICAgICAgICAgICAgcmV0dXJuIGluZGV4Owor
ICAgICAgICB9CisgICAgICAgIGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBp
bmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gc2Vl
IHdoYXQgY29tZXMgbmV4dCB0byBkZWNpZGUuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgfQorICAgICAgICBBU1NFUlQoaW5saW5lSXRlbS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlz
Qm94KCkgfHwgaW5saW5lSXRlbS5pc0Zsb2F0KCkpOworICAgICAgICBpZiAoIXByZXZpb3VzSW5s
aW5lSXRlbUluZGV4KSB7CisgICAgICAgICAgICBwcmV2aW91c0lubGluZUl0ZW1JbmRleCA9IGlu
ZGV4OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gQXQgdGhp
cyBwb2ludCBwcmV2aW91cyBhbmQgY3VycmVudCBpdGVtcyBhcmUgbm90IG5lY2Vzc2FyaWx5IGFk
amFjZW50IGl0ZW1zIGUuZyAicHJldmlvdXM8c3Bhbj5jdXJyZW50PC9zcGFuPiIKKyAgICAgICAg
YXV0byYgcHJldmlvdXNJdGVtID0gbV9pbmxpbmVJdGVtc1sqcHJldmlvdXNJbmxpbmVJdGVtSW5k
ZXhdOworICAgICAgICBhdXRvJiBjdXJyZW50SXRlbSA9IG1faW5saW5lSXRlbXNbaW5kZXhdOwor
ICAgICAgICBpZiAoaXNBdFNvZnRXcmFwT3Bwb3J0dW5pdHkobV9pbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dCwgcHJldmlvdXNJdGVtLCBjdXJyZW50SXRlbSkpIHsKKyAgICAgICAgICAgIGlmICgqcHJl
dmlvdXNJbmxpbmVJdGVtSW5kZXggKyAxID09IGluZGV4ICYmICghcHJldmlvdXNJdGVtLmlzVGV4
dCgpIHx8ICFjdXJyZW50SXRlbS5pc1RleHQoKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBv
bmx5IGtub3cgdGhlIGV4YWN0IHNvZnQgd3JhcCBvcHBvcnR1bml0eSBpbmRleCB3aGVuIHRoZSBw
cmV2aW91cyBhbmQgY3VycmVudCBpdGVtcyBhcmUgbmV4dCB0byBlYWNoIG90aGVyLgorICAgICAg
ICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRo
ZXJlJ3MgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgYmV0d2VlbiAncHJldmlvdXNJbmxpbmVJdGVt
SW5kZXgnIGFuZCAnaW5kZXgnLgorICAgICAgICAgICAgLy8gTm93IGZvcndhcmQtZmluZCBmcm9t
IHRoZSBzdGFydCBwb3NpdGlvbiB0byBzZWUgd2hlcmUgd2UgY2FuIGFjdHVhbGx5IHdyYXAuCisg
ICAgICAgICAgICAvLyBbZXgtXVthbXBsZV0gdnMuIFtleC1dW2lubGluZSBib3ggc3RhcnRdW2lu
bGluZSBib3ggZW5kXVthbXBsZV0KKyAgICAgICAgICAgIC8vIHdoZXJlIFtleC1dIGlzIHN0YXJ0
Q29udGVudCBhbmQgW2FtcGxlXSBpcyB0aGUgbmV4dENvbnRlbnQuCisgICAgICAgICAgICBmb3Ig
KGF1dG8gY2FuZGlkYXRlSW5kZXggPSAqcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggKyAxOyBjYW5k
aWRhdGVJbmRleCA8IGluZGV4OyArK2NhbmRpZGF0ZUluZGV4KSB7CisgICAgICAgICAgICAgICAg
aWYgKG1faW5saW5lSXRlbXNbY2FuZGlkYXRlSW5kZXhdLmlzSW5saW5lQm94U3RhcnQoKSkgewor
ICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgY29udGVudCBhbmQgW2lubGluZSBib3ggc3Rh
cnRdIGFuZCBbaW5saW5lIGJveCBlbmRdIGZvcm0gdW5icmVha2FibGUgY29udGVudC4KKyAgICAg
ICAgICAgICAgICAgICAgLy8gZXgtPHNwYW4+PC9zcGFuPmFtcGxlICA6IHdyYXAgb3Bwb3J0dW5p
dHkgaXMgYWZ0ZXIgImV4LSIuCisgICAgICAgICAgICAgICAgICAgIC8vIGV4LTwvc3Bhbj48L3Nw
YW4+YW1wbGUgOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC08L3NwYW4+PC9zcGFuPiIu
CisgICAgICAgICAgICAgICAgICAgIC8vIGV4LTwvc3Bhbj48c3Bhbj5hbXBsZTwvc3Bhbj4gOiB3
cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC08L3NwYW4+Ii4KKyAgICAgICAgICAgICAgICAg
ICAgLy8gZXgtPHNwYW4+PHNwYW4+YW1wbGU8L3NwYW4+PC9zcGFuPiA6IHdyYXAgb3Bwb3J0dW5p
dHkgaXMgYWZ0ZXIgImV4LSIuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVJ
bmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1
cm4gaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBp
bmRleDsKKyAgICB9CisgICAgcmV0dXJuIGxheW91dFJhbmdlLmVuZDsKK30KKwordm9pZCBMaW5l
QnVpbGRlcjo6aGFuZGxlRmxvYXRDb250ZW50KGNvbnN0IElubGluZUl0ZW0mIGZsb2F0SXRlbSkK
K3sKKyAgICBhdXRvJiBmbG9hdEJveCA9IGZsb2F0SXRlbS5sYXlvdXRCb3goKTsKKyAgICBtX2Zs
b2F0cy5hcHBlbmQoJmZsb2F0Qm94KTsKKworICAgIGF1dG8qIGZsb2F0aW5nU3RhdGUgPSB0aGlz
LT5mbG9hdGluZ1N0YXRlKCk7CisgICAgaWYgKCFmbG9hdGluZ1N0YXRlKQorICAgICAgICByZXR1
cm47CisKKyAgICBBU1NFUlQoZm9ybWF0dGluZ1N0YXRlKCkpOworICAgIGF1dG8mIGJveEdlb21l
dHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCktPmJveEdlb21ldHJ5KGZsb2F0Qm94KTsKKyAgICAvLyBT
ZXQgc3RhdGljIHBvc2l0aW9uIGZpcnN0LgorICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3BM
ZWZ0KExheW91dFBvaW50IHsgbV9saW5lTG9naWNhbFJlY3QudG9wTGVmdCgpIH0pOworICAgIC8v
IEZsb2F0IGl0LgorICAgIEFTU0VSVChtX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHMpOworICAg
IGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250ZXh0IHsgZm9ybWF0dGluZ0NvbnRl
eHQoKSwgKmZsb2F0aW5nU3RhdGUgfTsKKyAgICBhdXRvIGZsb2F0aW5nUG9zaXRpb24gPSBmbG9h
dGluZ0NvbnRleHQucG9zaXRpb25Gb3JGbG9hdChmbG9hdEJveCwgKm1fcm9vdEhvcml6b250YWxD
b25zdHJhaW50cyk7CisgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQoZmxvYXRpbmdQ
b3NpdGlvbik7CisgICAgZmxvYXRpbmdTdGF0ZS0+YXBwZW5kKGZsb2F0aW5nQ29udGV4dC50b0Zs
b2F0SXRlbShmbG9hdEJveCkpOworICAgIC8vIENoZWNrIGlmIHRoaXMgZmxvYXQgc2hyaW5rcyB0
aGUgbGluZSAodGhleSBkb24ndCBnZXQgcG9zaXRpb25lZCBoaWdoZXIgdGhhbiB0aGUgbGluZSku
CisgICAgaWYgKGZsb2F0aW5nUG9zaXRpb24ueSgpID4gbV9saW5lTG9naWNhbFJlY3QuYm90dG9t
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0
ID0gdHJ1ZTsKKyAgICBhdXRvIGZsb2F0Qm94V2lkdGggPSBpbmxpbmVJdGVtV2lkdGgoZmxvYXRJ
dGVtLCB7IH0pOworICAgIGlmIChmbG9hdEJveC5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSkK
KyAgICAgICAgbV9saW5lTG9naWNhbFJlY3Quc2V0TGVmdChtX2xpbmVMb2dpY2FsUmVjdC5sZWZ0
KCkgKyBmbG9hdEJveFdpZHRoKTsgICAgCisgICAgbV9saW5lTG9naWNhbFJlY3QuZXhwYW5kSG9y
aXpvbnRhbGx5KC1mbG9hdEJveFdpZHRoKTsKK30KKworTGluZUJ1aWxkZXI6OlJlc3VsdCBMaW5l
QnVpbGRlcjo6aGFuZGxlSW5saW5lQ29udGVudChJbmxpbmVDb250ZW50QnJlYWtlciYgaW5saW5l
Q29udGVudEJyZWFrZXIsIGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFuZ2UsIGNvbnN0
IExpbmVDYW5kaWRhdGUmIGxpbmVDYW5kaWRhdGUpCit7CisgICAgYXV0byYgaW5saW5lQ29udGVu
dCA9IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudDsKKyAgICBpZiAoaW5saW5lQ29udGVudC5j
b250aW51b3VzQ29udGVudCgpLnJ1bnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgQVNTRVJUKGlu
bGluZUNvbnRlbnQudHJhaWxpbmdMaW5lQnJlYWsoKSB8fCBpbmxpbmVDb250ZW50LnRyYWlsaW5n
V29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7CisgICAgICAgIHJldHVybiB7IGlubGluZUNvbnRlbnQu
dHJhaWxpbmdMaW5lQnJlYWsoKSA/IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6
WWVzIDogSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9OworICAgIH0KKyAg
ICBhdXRvIHNob3VsZERpc2FibGVIeXBoZW5hdGlvbiA9IFsmXSB7CisgICAgICAgIGF1dG8mIHN0
eWxlID0gcm9vdCgpLnN0eWxlKCk7CisgICAgICAgIHVuc2lnbmVkIGxpbWl0TGluZXMgPSBzdHls
ZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMoKSA9PSBSZW5kZXJTdHlsZTo6aW5pdGlhbEh5cGhlbmF0
aW9uTGltaXRMaW5lcygpID8gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpIDog
c3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCk7CisgICAgICAgIHJldHVybiBtX3N1Y2Nlc3Np
dmVIeXBoZW5hdGVkTGluZUNvdW50ID49IGxpbWl0TGluZXM7CisgICAgfTsKKyAgICBpZiAoc2hv
dWxkRGlzYWJsZUh5cGhlbmF0aW9uKCkpCisgICAgICAgIGlubGluZUNvbnRlbnRCcmVha2VyLnNl
dEh5cGhlbmF0aW9uRGlzYWJsZWQoKTsKKworICAgIGF1dG8mIGNvbnRpbnVvdXNJbmxpbmVDb250
ZW50ID0gbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmNvbnRpbnVvdXNDb250ZW50KCk7Cisg
ICAgYXV0byBsaW5lTG9naWNhbFJlY3RGb3JDYW5kaWRhdGVDb250ZW50ID0gWyZdIHsKKyAgICAg
ICAgLy8gQ2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBjb250ZW50IHdvdWxkIHN0cmV0Y2ggdGhlIGxp
bmUgYW5kIHdoZXRoZXIgYWRkaXRpb25hbCBmbG9hdHMgYXJlIGdldHRpbmcgaW4gdGhlIHdheS4K
KyAgICAgICAgaWYgKCFmbG9hdGluZ1N0YXRlKCkgfHwgIWlubGluZUNvbnRlbnQuaGFzSW5saW5l
TGV2ZWxCb3goKSkKKyAgICAgICAgICAgIHJldHVybiBtX2xpbmVMb2dpY2FsUmVjdDsKKyAgICAg
ICAgYXV0byBtYXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQgPSBtX2xpbmVMb2dpY2FsUmVjdC5oZWln
aHQoKTsKKyAgICAgICAgZm9yIChhdXRvJiBydW4gOiBjb250aW51b3VzSW5saW5lQ29udGVudC5y
dW5zKCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3IgaW5saW5lIGJv
eGVzIHRvby4KKyAgICAgICAgICAgIGlmICghcnVuLmlubGluZUl0ZW0uaXNCb3goKSkKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG1heGltdW1MaW5lTG9naWNhbEhlaWdo
dCA9IHN0ZDo6bWF4KG1heGltdW1MaW5lTG9naWNhbEhlaWdodCwgSW5saW5lTGF5b3V0VW5pdCB7
IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gocnVuLmlubGluZUl0ZW0ubGF5b3V0
Qm94KCkpLm1hcmdpbkJveEhlaWdodCgpIH0pOworICAgICAgICB9CisgICAgICAgIGlmIChtYXhp
bXVtTGluZUxvZ2ljYWxIZWlnaHQgPT0gbV9saW5lTG9naWNhbFJlY3QuaGVpZ2h0KCkpCisgICAg
ICAgICAgICByZXR1cm4gbV9saW5lTG9naWNhbFJlY3Q7CisgICAgICAgIGF1dG8gYWRqdXN0ZWRM
aW5lTG9naWNhbFJlY3QgPSBJbmxpbmVSZWN0IHsgbV9saW5lTG9naWNhbFJlY3QudG9wKCksIG1f
bGluZUxvZ2ljYWxSZWN0LmxlZnQoKSwgbV9saW5lTG9naWNhbFJlY3Qud2lkdGgoKSwgbWF4aW11
bUxpbmVMb2dpY2FsSGVpZ2h0IH07CisgICAgICAgIGlmIChhdXRvIGhvcml6b250YWxDb25zdHJh
aW50cyA9IGZsb2F0Q29uc3RyYWludHMoYWRqdXN0ZWRMaW5lTG9naWNhbFJlY3QpKSB7CisgICAg
ICAgICAgICBhZGp1c3RlZExpbmVMb2dpY2FsUmVjdC5zZXRMZWZ0KGhvcml6b250YWxDb25zdHJh
aW50cy0+bG9naWNhbExlZnQpOworICAgICAgICAgICAgYWRqdXN0ZWRMaW5lTG9naWNhbFJlY3Qu
c2V0V2lkdGgoaG9yaXpvbnRhbENvbnN0cmFpbnRzLT5sb2dpY2FsV2lkdGgpOworICAgICAgICB9
CisgICAgICAgIHJldHVybiBhZGp1c3RlZExpbmVMb2dpY2FsUmVjdDsKKyAgICB9KCk7CisgICAg
YXV0byBhdmFpbGFibGVXaWR0aCA9IFsmXSB7CisgICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGhG
b3JDb250ZW50ID0gbGluZUxvZ2ljYWxSZWN0Rm9yQ2FuZGlkYXRlQ29udGVudC53aWR0aCgpIC0g
bV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6aXNuYW4o
YXZhaWxhYmxlV2lkdGhGb3JDb250ZW50KSA/IG1heElubGluZUxheW91dFVuaXQoKSA6IGF2YWls
YWJsZVdpZHRoRm9yQ29udGVudDsKKyAgICB9KCk7CisgICAgLy8gV2hpbGUgdGhlIGZsb2F0cyBh
cmUgbm90IGNvbnNpZGVyZWQgdG8gYmUgb24gdGhlIGxpbmUsIHRoZXkgbWFrZSB0aGUgbGluZSBj
b250ZW50ZnVsIGZvciBsaW5lIGJyZWFraW5nLgorICAgIGF1dG8gbGluZUhhc0NvbnRlbnQgPSAh
bV9saW5lLnJ1bnMoKS5pc0VtcHR5KCkgfHwgbV9jb250ZW50SXNDb25zdHJhaW5lZEJ5RmxvYXQ7
CisgICAgYXV0byBsaW5lU3RhdHVzID0gSW5saW5lQ29udGVudEJyZWFrZXI6OkxpbmVTdGF0dXMg
eyBtX2xpbmUuY29udGVudExvZ2ljYWxSaWdodCgpLCBhdmFpbGFibGVXaWR0aCwgbV9saW5lLnRy
aW1tYWJsZVRyYWlsaW5nV2lkdGgoKSwgbV9saW5lLnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCks
IG1fbGluZS5pc1RyYWlsaW5nUnVuRnVsbHlUcmltbWFibGUoKSwgbGluZUhhc0NvbnRlbnQsICFt
X3dyYXBPcHBvcnR1bml0eUxpc3QuaXNFbXB0eSgpIH07CisgICAgYXV0byByZXN1bHQgPSBpbmxp
bmVDb250ZW50QnJlYWtlci5wcm9jZXNzSW5saW5lQ29udGVudChjb250aW51b3VzSW5saW5lQ29u
dGVudCwgbGluZVN0YXR1cyk7CisgICAgYXV0byYgY2FuZGlkYXRlUnVucyA9IGNvbnRpbnVvdXNJ
bmxpbmVDb250ZW50LnJ1bnMoKTsKKyAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250
ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rpb246OktlZXApIHsKKyAgICAgICAgLy8gVGhpcyBjb250
aW51b3VzIGNvbnRlbnQgY2FuIGJlIGZ1bGx5IHBsYWNlZCBvbiB0aGUgY3VycmVudCBsaW5lLgor
ICAgICAgICBtX2xpbmVMb2dpY2FsUmVjdCA9IGxpbmVMb2dpY2FsUmVjdEZvckNhbmRpZGF0ZUNv
bnRlbnQ7CisgICAgICAgIGZvciAoYXV0byYgcnVuIDogY2FuZGlkYXRlUnVucykKKyAgICAgICAg
ICAgIG1fbGluZS5hcHBlbmQocnVuLmlubGluZUl0ZW0sIHJ1bi5sb2dpY2FsV2lkdGgpOworICAg
ICAgICBpZiAobGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50Lmhhc1RyYWlsaW5nU29mdFdyYXBP
cHBvcnR1bml0eSgpKSB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgYWxsb3dlZCB0
byB3cmFwIGF0IHRoaXMgcG9zaXRpb24uCisgICAgICAgICAgICBhdXRvJiB0cmFpbGluZ0l0ZW0g
PSBjYW5kaWRhdGVSdW5zLmxhc3QoKS5pbmxpbmVJdGVtOworICAgICAgICAgICAgLy8gRklYTUU6
IFRoZXJlIG11c3QgYmUgYSB3YXkgdG8gZGVjaWRlIGlmIHRoZSB0cmFpbGluZyBydW4gYWN0dWFs
bHkgZW5kZWQgdXAgb24gdGhlIGxpbmUuCisgICAgICAgICAgICAvLyBMZXQncyBqdXN0IGRlYWwg
d2l0aCBjb2xsYXBzZWQgbGVhZGluZyB3aGl0ZXNwYWNlIGZvciBub3cuCisgICAgICAgICAgICBp
ZiAoIW1fbGluZS5ydW5zKCkuaXNFbXB0eSgpICYmIElubGluZUNvbnRlbnRCcmVha2VyOjppc1dy
YXBwaW5nQWxsb3dlZCh0cmFpbGluZ0l0ZW0pKQorICAgICAgICAgICAgICAgIG1fd3JhcE9wcG9y
dHVuaXR5TGlzdC5hcHBlbmQoJnRyYWlsaW5nSXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIHsgcmVzdWx0LmlzRW5kT2ZMaW5lLCB7IGNhbmRpZGF0ZVJ1bnMuc2l6ZSgpLCBmYWxzZSB9
IH07CisgICAgfQorCisgICAgYXV0byBlbGlnaWJsZU92ZXJmbG93V2lkdGhBc0xlYWRpbmcgPSBb
Jl0gKCkgLT4gT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geworICAgICAgICAvLyBGSVhNRTog
QWRkIHN1cHBvcnQgZm9yIG90aGVyIHR5cGVzIG9mIGNvbnRpbnVvdXMgY29udGVudC4KKyAgICAg
ICAgQVNTRVJUKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6
QWN0aW9uOjpXcmFwIHx8IHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJl
c3VsdDo6QWN0aW9uOjpCcmVhayk7CisgICAgICAgIGlmIChjYW5kaWRhdGVSdW5zLnNpemUoKSAh
PSAxIHx8ICFjYW5kaWRhdGVSdW5zLmZpcnN0KCkuaW5saW5lSXRlbS5pc1RleHQoKSkKKyAgICAg
ICAgICAgIHJldHVybiB7IH07CisgICAgICAgIGF1dG8mIGlubGluZVRleHRJdGVtID0gZG93bmNh
c3Q8SW5saW5lVGV4dEl0ZW0+KGNhbmRpZGF0ZVJ1bnMuZmlyc3QoKS5pbmxpbmVJdGVtKTsKKyAg
ICAgICAgaWYgKGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpKQorICAgICAgICAgICAgcmV0
dXJuIHsgfTsKKyAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFr
ZXI6OlJlc3VsdDo6QWN0aW9uOjpXcmFwKQorICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVJ1
bnMuZmlyc3QoKS5sb2dpY2FsV2lkdGg7CisgICAgICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElu
bGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6QnJlYWsgJiYgcmVzdWx0LnBhcnRp
YWxUcmFpbGluZ0NvbnRlbnQtPnBhcnRpYWxSdW4pCisgICAgICAgICAgICByZXR1cm4gY2FuZGlk
YXRlUnVucy5maXJzdCgpLmxvZ2ljYWxXaWR0aCAtIHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250
ZW50LT5wYXJ0aWFsUnVuLT5sb2dpY2FsV2lkdGg7CisgICAgICAgIHJldHVybiB7IH07CisgICAg
fTsKKworICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1
bHQ6OkFjdGlvbjo6V3JhcCkgeworICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09
IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKKyAgICAgICAgLy8gVGhp
cyBjb250aW51b3VzIGNvbnRlbnQgY2FuJ3QgYmUgcGxhY2VkIG9uIHRoZSBjdXJyZW50IGxpbmUu
IE5vdGhpbmcgdG8gY29tbWl0IGF0IHRoaXMgdGltZS4KKyAgICAgICAgcmV0dXJuIHsgSW5saW5l
Q29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgfSwgeyB9LCBlbGlnaWJsZU92ZXJm
bG93V2lkdGhBc0xlYWRpbmcoKSB9OworICAgIH0KKyAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJ
bmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rpb246OldyYXBXaXRoSHlwaGVuKSB7Cisg
ICAgICAgIEFTU0VSVChyZXN1bHQuaXNFbmRPZkxpbmUgPT0gSW5saW5lQ29udGVudEJyZWFrZXI6
OklzRW5kT2ZMaW5lOjpZZXMpOworICAgICAgICAvLyBUaGlzIGNvbnRpbnVvdXMgY29udGVudCBj
YW4ndCBiZSBwbGFjZWQgb24gdGhlIGN1cnJlbnQgbGluZSwgbm90aGluZyB0byBjb21taXQuCisg
ICAgICAgIC8vIEhvd2V2ZXIgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY3VycmVudCBs
aW5lIGdhaW5zIGEgdHJhaWxpbmcgaHlwaGVuLgorICAgICAgICBBU1NFUlQobV9saW5lLnRyYWls
aW5nU29mdEh5cGhlbldpZHRoKCkpOworICAgICAgICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBoZW4o
Km1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpKTsKKyAgICAgICAgcmV0dXJuIHsgSW5s
aW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMgfTsKKyAgICB9CisgICAgaWYgKHJl
c3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpSZXZl
cnRUb0xhc3RXcmFwT3Bwb3J0dW5pdHkpIHsKKyAgICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9m
TGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olllcyk7CisgICAgICAg
IC8vIE5vdCBvbmx5IHRoaXMgY29udGVudCBjYW4ndCBiZSBwbGFjZWQgb24gdGhlIGN1cnJlbnQg
bGluZSwgYnV0IHdlIGV2ZW4gbmVlZCB0byByZXZlcnQgdGhlIGxpbmUgYmFjayB0byBhbiBlYXJs
aWVyIHBvc2l0aW9uLgorICAgICAgICBBU1NFUlQoIW1fd3JhcE9wcG9ydHVuaXR5TGlzdC5pc0Vt
cHR5KCkpOworICAgICAgICByZXR1cm4geyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxp
bmU6OlllcywgeyByZWJ1aWxkTGluZShsYXlvdXRSYW5nZSwgKm1fd3JhcE9wcG9ydHVuaXR5TGlz
dC5sYXN0KCkpLCB0cnVlIH0gfTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5s
aW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xhc3ROb25PdmVyZmxv
d2luZ1dyYXBPcHBvcnR1bml0eSkgeworICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5l
ID09IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKKyAgICAgICAgQVNT
RVJUKCFtX3dyYXBPcHBvcnR1bml0eUxpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgcmV0dXJuIHsg
SW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgcmVidWlsZExpbmVGb3JU
cmFpbGluZ1NvZnRIeXBoZW4obGF5b3V0UmFuZ2UpLCB0cnVlIH0gfTsKKyAgICB9CisgICAgaWYg
KHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpC
cmVhaykgeworICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09IElubGluZUNvbnRl
bnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKKyAgICAgICAgLy8gQ29tbWl0IHRoZSBjb21i
aW5hdGlvbiBvZiBmdWxsIGFuZCBwYXJ0aWFsIGNvbnRlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4K
KyAgICAgICAgQVNTRVJUKHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50KTsKKyAgICAgICAg
Y29tbWl0UGFydGlhbENvbnRlbnQoY2FuZGlkYXRlUnVucywgKnJlc3VsdC5wYXJ0aWFsVHJhaWxp
bmdDb250ZW50KTsKKyAgICAgICAgLy8gV2hlbiBicmVha2luZyBtdWx0aXBsZSBydW5zIDxzcGFu
IHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay1hbGwiPnRleHQ8L3NwYW4+PHNwYW4+Y29udGVudDwv
c3Bhbj4sIHdlIG1pZ2h0IGVuZCB1cCBicmVha2luZyB0aGVtIGF0IHJ1biBib3VuZGFyeS4KKyAg
ICAgICAgLy8gSXQgc2ltcGx5IG1lYW5zIHdlIGRvbid0IHJlYWxseSBoYXZlIGEgcGFydGlhbCBy
dW4uIFBhcnRpYWwgY29udGVudCB5ZXMsIGJ1dCBub3QgcGFydGlhbCBydW4uCisgICAgICAgIGF1
dG8gdHJhaWxpbmdSdW5JbmRleCA9IHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50LT50cmFp
bGluZ1J1bkluZGV4OworICAgICAgICBhdXRvIGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCA9IHRy
YWlsaW5nUnVuSW5kZXggKyAxOworICAgICAgICBpZiAoIXJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdD
b250ZW50LT5wYXJ0aWFsUnVuKQorICAgICAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJy
ZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50LCBmYWxz
ZSB9IH07CisKKyAgICAgICAgYXV0byBwYXJ0aWFsUnVuID0gKnJlc3VsdC5wYXJ0aWFsVHJhaWxp
bmdDb250ZW50LT5wYXJ0aWFsUnVuOworICAgICAgICBhdXRvJiB0cmFpbGluZ0lubGluZVRleHRJ
dGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGNhbmRpZGF0ZVJ1bnNbdHJhaWxpbmdSdW5J
bmRleF0uaW5saW5lSXRlbSk7CisgICAgICAgIEFTU0VSVChwYXJ0aWFsUnVuLmxlbmd0aCA8IHRy
YWlsaW5nSW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpOworICAgICAgICBhdXRvIG92ZXJmbG93TGVu
Z3RoID0gdHJhaWxpbmdJbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSAtIHBhcnRpYWxSdW4ubGVuZ3Ro
OworICAgICAgICByZXR1cm4geyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olll
cywgeyBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQsIGZhbHNlIH0sIG92ZXJmbG93TGVuZ3RoLCBl
bGlnaWJsZU92ZXJmbG93V2lkdGhBc0xlYWRpbmcoKSB9OworICAgIH0KKyAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICByZXR1cm4geyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxp
bmU6Ok5vIH07Cit9CisKK3ZvaWQgTGluZUJ1aWxkZXI6OmNvbW1pdFBhcnRpYWxDb250ZW50KGNv
bnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudDo6UnVuTGlzdCYgcnVu
cywgY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6UGFydGlhbFRyYWlsaW5nQ29u
dGVudCYgcGFydGlhbFRyYWlsaW5nQ29udGVudCkKK3sKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9
IDA7IGluZGV4IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgYXV0byYgcnVuID0g
cnVuc1tpbmRleF07CisgICAgICAgIGlmIChwYXJ0aWFsVHJhaWxpbmdDb250ZW50LnRyYWlsaW5n
UnVuSW5kZXggPT0gaW5kZXgpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgY29tbWl0IHBh
cnRpYWwgdHJhaWxpbmcgaXRlbS4KKyAgICAgICAgICAgIGlmIChhdXRvIHBhcnRpYWxSdW4gPSBw
YXJ0aWFsVHJhaWxpbmdDb250ZW50LnBhcnRpYWxSdW4pIHsKKyAgICAgICAgICAgICAgICBBU1NF
UlQocnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpOworICAgICAgICAgICAgICAgIGF1dG8mIHRyYWls
aW5nSW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4ocnVuc1twYXJ0aWFs
VHJhaWxpbmdDb250ZW50LnRyYWlsaW5nUnVuSW5kZXhdLmlubGluZUl0ZW0pOworICAgICAgICAg
ICAgICAgIGF1dG8gcGFydGlhbFRyYWlsaW5nVGV4dEl0ZW0gPSB0cmFpbGluZ0lubGluZVRleHRJ
dGVtLmxlZnQocGFydGlhbFJ1bi0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtX2xpbmUuYXBw
ZW5kKHBhcnRpYWxUcmFpbGluZ1RleHRJdGVtLCBwYXJ0aWFsUnVuLT5sb2dpY2FsV2lkdGgpOwor
ICAgICAgICAgICAgICAgIGlmIChhdXRvIGh5cGhlbldpZHRoID0gcGFydGlhbFJ1bi0+aHlwaGVu
V2lkdGgpCisgICAgICAgICAgICAgICAgICAgIG1fbGluZS5hZGRUcmFpbGluZ0h5cGhlbigqaHlw
aGVuV2lkdGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIC8vIFRoZSBwYXJ0aWFsIHJ1biBpcyB0aGUgbGFzdCBjb250ZW50IHRvIGNvbW1pdC4K
KyAgICAgICAgICAgIG1fbGluZS5hcHBlbmQocnVuLmlubGluZUl0ZW0sIHJ1bi5sb2dpY2FsV2lk
dGgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1fbGluZS5hcHBl
bmQocnVuLmlubGluZUl0ZW0sIHJ1bi5sb2dpY2FsV2lkdGgpOworICAgIH0KK30KKworc2l6ZV90
IExpbmVCdWlsZGVyOjpyZWJ1aWxkTGluZShjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJh
bmdlLCBjb25zdCBJbmxpbmVJdGVtJiBsYXN0SW5saW5lSXRlbVRvQWRkKQoreworICAgIEFTU0VS
VCghbV93cmFwT3Bwb3J0dW5pdHlMaXN0LmlzRW1wdHkoKSk7CisgICAgLy8gV2UgbWlnaHQgYWxy
ZWFkeSBoYXZlIGFkZGVkIGZsb2F0cy4gVGhleSBzaHJpbmsgdGhlIGF2YWlsYWJsZSBob3Jpem9u
dGFsIHNwYWNlIGZvciB0aGUgbGluZS4KKyAgICAvLyBMZXQncyBqdXN0IHJldXNlIHdoYXQgdGhl
IGxpbmUgaGFzIGF0IHRoaXMgcG9pbnQuCisgICAgbV9saW5lLmluaXRpYWxpemUoKTsKKyAgICBh
dXRvIGN1cnJlbnRJdGVtSW5kZXggPSBsYXlvdXRSYW5nZS5zdGFydDsKKyAgICBpZiAobV9wYXJ0
aWFsTGVhZGluZ1RleHRJdGVtKSB7CisgICAgICAgIG1fbGluZS5hcHBlbmQoKm1fcGFydGlhbExl
YWRpbmdUZXh0SXRlbSwgaW5saW5lSXRlbVdpZHRoKCptX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0s
IHsgfSkpOworICAgICAgICBpZiAoJm1fcGFydGlhbExlYWRpbmdUZXh0SXRlbS52YWx1ZSgpID09
ICZsYXN0SW5saW5lSXRlbVRvQWRkKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICsr
Y3VycmVudEl0ZW1JbmRleDsKKyAgICB9CisgICAgZm9yICg7IGN1cnJlbnRJdGVtSW5kZXggPCBs
YXlvdXRSYW5nZS5lbmQ7ICsrY3VycmVudEl0ZW1JbmRleCkgeworICAgICAgICBhdXRvJiBpbmxp
bmVJdGVtID0gbV9pbmxpbmVJdGVtc1tjdXJyZW50SXRlbUluZGV4XTsKKyAgICAgICAgbV9saW5l
LmFwcGVuZChpbmxpbmVJdGVtLCBpbmxpbmVJdGVtV2lkdGgoaW5saW5lSXRlbSwgbV9saW5lLmNv
bnRlbnRMb2dpY2FsUmlnaHQoKSkpOworICAgICAgICBpZiAoJmlubGluZUl0ZW0gPT0gJmxhc3RJ
bmxpbmVJdGVtVG9BZGQpCisgICAgICAgICAgICByZXR1cm4gY3VycmVudEl0ZW1JbmRleCAtIGxh
eW91dFJhbmdlLnN0YXJ0ICsgMTsKKyAgICB9CisgICAgcmV0dXJuIGxheW91dFJhbmdlLnNpemUo
KTsKK30KKworc2l6ZV90IExpbmVCdWlsZGVyOjpyZWJ1aWxkTGluZUZvclRyYWlsaW5nU29mdEh5
cGhlbihjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlKQoreworICAgIEFTU0VSVCgh
bV93cmFwT3Bwb3J0dW5pdHlMaXN0LmlzRW1wdHkoKSk7CisgICAgLy8gUmV2ZXJ0IGFsbCB0aGUg
d2F5IGJhY2sgdG8gYSB3cmFwIG9wcG9ydHVuaXR5IHdoZW4gZWl0aGVyIGEgc29mdCBoeXBoZW4g
Zml0cyBvciBubyBoeXBoZW4gaXMgcmVxdWlyZWQuCisgICAgZm9yIChhdXRvIGkgPSBtX3dyYXBP
cHBvcnR1bml0eUxpc3Quc2l6ZSgpOyBpLS0gPiAxOykgeworICAgICAgICBhdXRvJiBzb2Z0V3Jh
cE9wcG9ydHVuaXR5SXRlbSA9ICptX3dyYXBPcHBvcnR1bml0eUxpc3RbaV07CisgICAgICAgIC8v
IEZJWE1FOiBJZiB0aGlzIHR1cm5zIG91dCB0byBiZSBhIHBlcmYgaXNzdWUsIHdlIGNvdWxkIGFs
c28gdHJhdmVyc2UgdGhlIHdyYXAgbGlzdCBhbmQga2VlcCBhZGRpbmcgdGhlIGl0ZW1zCisgICAg
ICAgIC8vIHdoaWxlIHdhdGNoaW5nIHRoZSBhdmFpbGFibGUgd2lkdGggdmVyeSBjbG9zZWx5Lgor
ICAgICAgICBhdXRvIGNvbW1pdHRlZENvdW50ID0gcmVidWlsZExpbmUobGF5b3V0UmFuZ2UsIHNv
ZnRXcmFwT3Bwb3J0dW5pdHlJdGVtKTsKKyAgICAgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IG1f
bGluZUxvZ2ljYWxSZWN0LndpZHRoKCkgLSBtX2xpbmUuY29udGVudExvZ2ljYWxSaWdodCgpOwor
ICAgICAgICBhdXRvIHRyYWlsaW5nU29mdEh5cGhlbldpZHRoID0gbV9saW5lLnRyYWlsaW5nU29m
dEh5cGhlbldpZHRoKCk7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpbGluZyBoeXBoZW4g
bm93IGZpdHMgdGhlIGxpbmUgKG9yIHdlIGRvbid0IG5lZWQgaHloZW4gYW55bW9yZSkuCisgICAg
ICAgIGlmICghdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggfHwgdHJhaWxpbmdTb2Z0SHlwaGVuV2lk
dGggPD0gYXZhaWxhYmxlV2lkdGgpIHsKKyAgICAgICAgICAgIGlmICh0cmFpbGluZ1NvZnRIeXBo
ZW5XaWR0aCkKKyAgICAgICAgICAgICAgICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBoZW4oKnRyYWls
aW5nU29mdEh5cGhlbldpZHRoKTsKKyAgICAgICAgICAgIHJldHVybiBjb21taXR0ZWRDb3VudDsK
KyAgICAgICAgfQorICAgIH0KKyAgICAvLyBIYXZlIGF0IGxlYXN0IHNvbWUgY29udGVudCBvbiB0
aGUgbGluZS4KKyAgICBhdXRvIGNvbW1pdHRlZENvdW50ID0gcmVidWlsZExpbmUobGF5b3V0UmFu
Z2UsICptX3dyYXBPcHBvcnR1bml0eUxpc3QuZmlyc3QoKSk7CisgICAgaWYgKGF1dG8gdHJhaWxp
bmdTb2Z0SHlwaGVuV2lkdGggPSBtX2xpbmUudHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgoKSkKKyAg
ICAgICAgbV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCp0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCk7
CisgICAgcmV0dXJuIGNvbW1pdHRlZENvdW50OworfQorCitib29sIExpbmVCdWlsZGVyOjppc0xh
c3RMaW5lV2l0aElubGluZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsaW5lUmFuZ2Us
IHNpemVfdCBsYXN0SW5saW5lSXRlbUluZGV4LCBib29sIGhhc1BhcnRpYWxUcmFpbGluZ0NvbnRl
bnQpIGNvbnN0Cit7CisgICAgaWYgKGhhc1BhcnRpYWxUcmFpbGluZ0NvbnRlbnQpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICBpZiAobGluZVJhbmdlLmVuZCA9PSBsYXN0SW5saW5lSXRlbUlu
ZGV4KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBPbWl0IGZsb2F0cyB0byBzZWUgaWYg
dGhpcyBpcyB0aGUgbGFzdCBsaW5lIHdpdGggaW5saW5lIGNvbnRlbnQuCisgICAgZm9yIChhdXRv
IGkgPSBsYXN0SW5saW5lSXRlbUluZGV4OyBpLS07KSB7CisgICAgICAgIGlmICghbV9pbmxpbmVJ
dGVtc1tpXS5pc0Zsb2F0KCkpCisgICAgICAgICAgICByZXR1cm4gaSA9PSBsaW5lUmFuZ2UuZW5k
IC0gMTsKKyAgICB9CisgICAgLy8gVGhlcmUgaGFzIHRvIGJlIGF0IGxlYXN0IG9uZSBub24tZmxv
YXQgaXRlbS4KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK2NvbnN0IENvbnRhaW5lckJveCYgTGluZUJ1aWxkZXI6OnJvb3QoKSBjb25zdAoreworICAg
IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKTsKK30KKworY29uc3QgTGF5b3V0U3Rh
dGUmIExpbmVCdWlsZGVyOjpsYXlvdXRTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZvcm1h
dHRpbmdDb250ZXh0KCkubGF5b3V0U3RhdGUoKTsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9y
bWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCdWlsZGVyLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uMGUyMTcxNTA1ZWZmYjQyZmRmMGIzMjE2NDNiMzQzZDhjNTVmY2FlZgotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5l
Zm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKKworI2luY2x1ZGUgIklubGluZUNvbnRlbnRCcmVha2VyLmgiCisjaW5jbHVkZSAiSW5saW5l
Rm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZS5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgRmxvYXRpbmdDb250ZXh0Owor
c3RydWN0IExpbmVDYW5kaWRhdGU7CisKK2NsYXNzIExpbmVCdWlsZGVyIHsKK3B1YmxpYzoKKyAg
ICBMaW5lQnVpbGRlcihJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYsIEZsb2F0aW5nU3RhdGUmLCBI
b3Jpem9udGFsQ29uc3RyYWludHMgcm9vdEhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgSW5s
aW5lSXRlbXMmKTsKKyAgICBMaW5lQnVpbGRlcihjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dCYsIGNvbnN0IElubGluZUl0ZW1zJik7CisKKyAgICBzdHJ1Y3QgSW5saW5lSXRlbVJhbmdlIHsK
KyAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gc3RhcnQgPT0gZW5kOyB9Cisg
ICAgICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gZW5kIC0gc3RhcnQ7IH0KKyAgICAg
ICAgc2l6ZV90IHN0YXJ0IHsgMCB9OworICAgICAgICBzaXplX3QgZW5kIHsgMCB9OworICAgIH07
CisgICAgdXNpbmcgRmxvYXRMaXN0ID0gVmVjdG9yPGNvbnN0IEJveCo+OworICAgIHN0cnVjdCBM
aW5lQ29udGVudCB7CisgICAgICAgIElubGluZUl0ZW1SYW5nZSBpbmxpbmVJdGVtUmFuZ2U7Cisg
ICAgICAgIHNpemVfdCBwYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoIHsgMCB9OworICAgICAg
ICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxvd0xvZ2ljYWxXaWR0aDsKKyAgICAg
ICAgY29uc3QgRmxvYXRMaXN0JiBmbG9hdHM7CisgICAgICAgIGJvb2wgaGFzSW50cnVzaXZlRmxv
YXQgeyBmYWxzZSB9OworICAgICAgICBJbmxpbmVMYXlvdXRQb2ludCBsb2dpY2FsVG9wTGVmdDsK
KyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsaW5lTG9naWNhbFdpZHRoOworICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGg7CisgICAgICAgIGJvb2wgaXNMYXN0TGlu
ZVdpdGhJbmxpbmVDb250ZW50IHsgdHJ1ZSB9OworICAgICAgICBzaXplX3Qgbm9uU3Bhbm5pbmdJ
bmxpbmVMZXZlbEJveENvdW50IHsgMCB9OworICAgICAgICBjb25zdCBMaW5lOjpSdW5MaXN0JiBy
dW5zOworICAgIH07CisgICAgTGluZUNvbnRlbnQgbGF5b3V0SW5saW5lQ29udGVudChjb25zdCBJ
bmxpbmVJdGVtUmFuZ2UmLCBzaXplX3QgcGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBPcHRp
b25hbDxJbmxpbmVMYXlvdXRVbml0PiBsZWFkaW5nTG9naWNhbFdpZHRoLCBjb25zdCBJbmxpbmVS
ZWN0JiBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LCBib29sIGlzRmlyc3RMaW5lKTsKKworICAgIHN0
cnVjdCBJbnRyaW5zaWNDb250ZW50IHsKKyAgICAgICAgSW5saW5lSXRlbVJhbmdlIGlubGluZUl0
ZW1SYW5nZTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGggeyAwIH07Cisg
ICAgICAgIGNvbnN0IEZsb2F0TGlzdCYgZmxvYXRzOworICAgIH07CisgICAgSW50cmluc2ljQ29u
dGVudCBjb21wdXRlZEludHJpbnNpY1dpZHRoKGNvbnN0IElubGluZUl0ZW1SYW5nZSYsIElubGlu
ZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgpOworCitwcml2YXRlOgorICAgIHZvaWQgY2FuZGlk
YXRlQ29udGVudEZvckxpbmUoTGluZUNhbmRpZGF0ZSYsIHNpemVfdCBpbmxpbmVJdGVtSW5kZXgs
IGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgc2l6ZV90IG92ZXJmbG93
TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBsZWFkaW5nTG9naWNhbFdpZHRoLCBJ
bmxpbmVMYXlvdXRVbml0IGN1cnJlbnRMb2dpY2FsUmlnaHQpOworICAgIHNpemVfdCBuZXh0V3Jh
cE9wcG9ydHVuaXR5KHNpemVfdCBzdGFydEluZGV4LCBjb25zdCBMaW5lQnVpbGRlcjo6SW5saW5l
SXRlbVJhbmdlJiBsYXlvdXRSYW5nZSkgY29uc3Q7CisKKyAgICBzdHJ1Y3QgUmVzdWx0IHsKKyAg
ICAgICAgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lIGlzRW5kT2ZMaW5lIHsgSW5s
aW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9OworICAgICAgICBzdHJ1Y3QgQ29t
bWl0dGVkQ29udGVudENvdW50IHsKKyAgICAgICAgICAgIHNpemVfdCB2YWx1ZSB7IDAgfTsKKyAg
ICAgICAgICAgIGJvb2wgaXNSZXZlcnQgeyBmYWxzZSB9OworICAgICAgICB9OworICAgICAgICBD
b21taXR0ZWRDb250ZW50Q291bnQgY29tbWl0dGVkQ291bnQgeyB9OworICAgICAgICBzaXplX3Qg
cGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5s
aW5lTGF5b3V0VW5pdD4gb3ZlcmZsb3dMb2dpY2FsV2lkdGggeyB9OworICAgIH07CisgICAgc3Ry
dWN0IFVzZWRDb25zdHJhaW50cyB7CisgICAgICAgIElubGluZVJlY3QgbG9naWNhbFJlY3Q7Cisg
ICAgICAgIGJvb2wgaXNDb25zdHJhaW5lZEJ5RmxvYXQgeyBmYWxzZSB9OworICAgIH07CisgICAg
VXNlZENvbnN0cmFpbnRzIGluaXRpYWxDb25zdHJhaW50c0ZvckxpbmUoY29uc3QgSW5saW5lUmVj
dCYgaW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgYm9vbCBpc0ZpcnN0TGluZSkgY29uc3Q7CisgICAg
T3B0aW9uYWw8SG9yaXpvbnRhbENvbnN0cmFpbnRzPiBmbG9hdENvbnN0cmFpbnRzKGNvbnN0IElu
bGluZVJlY3QmIGxpbmVMb2dpY2FsUmVjdCkgY29uc3Q7CisKKyAgICB2b2lkIGhhbmRsZUZsb2F0
Q29udGVudChjb25zdCBJbmxpbmVJdGVtJik7CisgICAgUmVzdWx0IGhhbmRsZUlubGluZUNvbnRl
bnQoSW5saW5lQ29udGVudEJyZWFrZXImLCBjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5
b3V0UmFuZ2UsIGNvbnN0IExpbmVDYW5kaWRhdGUmKTsKKyAgICBzaXplX3QgcmVidWlsZExpbmUo
Y29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBjb25zdCBJbmxpbmVJdGVt
JiBsYXN0SW5saW5lSXRlbVRvQWRkKTsKKyAgICBzaXplX3QgcmVidWlsZExpbmVGb3JUcmFpbGlu
Z1NvZnRIeXBoZW4oY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsYXlvdXRSYW5nZSk7CisgICAgdm9p
ZCBjb21taXRQYXJ0aWFsQ29udGVudChjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGlu
dW91c0NvbnRlbnQ6OlJ1bkxpc3QmLCBjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0
OjpQYXJ0aWFsVHJhaWxpbmdDb250ZW50Jik7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFVz
ZWRDb25zdHJhaW50cyYpOworICAgIHN0cnVjdCBDb21taXR0ZWRDb250ZW50IHsKKyAgICAgICAg
c2l6ZV90IGlubGluZUl0ZW1Db3VudCB7IDAgfTsKKyAgICAgICAgc2l6ZV90IHBhcnRpYWxUcmFp
bGluZ0NvbnRlbnRMZW5ndGggeyAwIH07CisgICAgICAgIE9wdGlvbmFsPElubGluZUxheW91dFVu
aXQ+IG92ZXJmbG93TG9naWNhbFdpZHRoIHsgfTsKKyAgICB9OworICAgIENvbW1pdHRlZENvbnRl
bnQgcGxhY2VJbmxpbmVDb250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5nZSYsIHNpemVfdCBwYXJ0
aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IG92ZXJm
bG93TG9naWNhbFdpZHRoKTsKKyAgICBJbmxpbmVJdGVtUmFuZ2UgY2xvc2UoY29uc3QgSW5saW5l
SXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBjb25zdCBDb21taXR0ZWRDb250ZW50Jik7CisK
KyAgICBJbmxpbmVMYXlvdXRVbml0IGlubGluZUl0ZW1XaWR0aChjb25zdCBJbmxpbmVJdGVtJiwg
SW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpIGNvbnN0OworICAgIGJvb2wgaXNM
YXN0TGluZVdpdGhJbmxpbmVDb250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGluZVJhbmdl
LCBzaXplX3QgbGFzdElubGluZUl0ZW1JbmRleCwgYm9vbCBoYXNQYXJ0aWFsVHJhaWxpbmdDb250
ZW50KSBjb25zdDsKKworICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0
aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7IH0K
KyAgICBJbmxpbmVGb3JtYXR0aW5nU3RhdGUqIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIG1f
aW5saW5lRm9ybWF0dGluZ1N0YXRlOyB9CisgICAgRmxvYXRpbmdTdGF0ZSogZmxvYXRpbmdTdGF0
ZSgpIHsgcmV0dXJuIG1fZmxvYXRpbmdTdGF0ZTsgfQorICAgIGNvbnN0IEZsb2F0aW5nU3RhdGUq
IGZsb2F0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nU3RhdGU7IH0KKyAgICBj
b25zdCBDb250YWluZXJCb3gmIHJvb3QoKSBjb25zdDsKKyAgICBjb25zdCBMYXlvdXRTdGF0ZSYg
bGF5b3V0U3RhdGUoKSBjb25zdDsKKworICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0
JiBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0OworICAgIElubGluZUZvcm1hdHRpbmdTdGF0ZSog
bV9pbmxpbmVGb3JtYXR0aW5nU3RhdGUgeyBudWxscHRyIH07CisgICAgRmxvYXRpbmdTdGF0ZSog
bV9mbG9hdGluZ1N0YXRlIHsgbnVsbHB0ciB9OworICAgIE9wdGlvbmFsPEhvcml6b250YWxDb25z
dHJhaW50cz4gbV9yb290SG9yaXpvbnRhbENvbnN0cmFpbnRzOworCisgICAgTGluZSBtX2xpbmU7
CisgICAgSW5saW5lUmVjdCBtX2xpbmVMb2dpY2FsUmVjdDsKKyAgICBjb25zdCBJbmxpbmVJdGVt
cyYgbV9pbmxpbmVJdGVtczsKKyAgICBGbG9hdExpc3QgbV9mbG9hdHM7CisgICAgT3B0aW9uYWw8
SW5saW5lVGV4dEl0ZW0+IG1fcGFydGlhbExlYWRpbmdUZXh0SXRlbTsKKyAgICBWZWN0b3I8Y29u
c3QgSW5saW5lSXRlbSo+IG1fd3JhcE9wcG9ydHVuaXR5TGlzdDsKKyAgICB1bnNpZ25lZCBtX3N1
Y2Nlc3NpdmVIeXBoZW5hdGVkTGluZUNvdW50IHsgMCB9OworICAgIGJvb2wgbV9jb250ZW50SXND
b25zdHJhaW5lZEJ5RmxvYXQgeyBmYWxzZSB9OworfTsKKworfQorfQorI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1h
dHRpbmcvSW5saW5lTGluZUdlb21ldHJ5LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUdlb21ldHJ5LmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uZDZhMmM1OGEwNzZlNDljMmNkM2M5ZTJmOTJhYjM2ZDAzZjI3MjllNQotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5l
Zm9ybWF0dGluZy9JbmxpbmVMaW5lR2VvbWV0cnkuaApAQCAtMCwwICsxLDgwIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKKworI2luY2x1ZGUgIklubGluZVJlY3QuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFt
ZXNwYWNlIExheW91dCB7CisKK2NsYXNzIElubGluZUxpbmVHZW9tZXRyeSB7CisgICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgc3RydWN0IEVuY2xvc2luZ1RvcEFuZEJv
dHRvbSB7CisgICAgICAgIC8vIFRoaXMgdmFsdWVzIGVuY2xvc2VzIHRoZSByb290IGlubGluZSBi
b3ggYW5kIGFueSBvdGhlciBpbmxpbmUgbGV2ZWwgYm94J3MgYm9yZGVyIGJveC4KKyAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCB0b3AgeyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgYm90
dG9tIHsgMCB9OworICAgIH07CisgICAgSW5saW5lTGluZUdlb21ldHJ5KGNvbnN0IElubGluZVJl
Y3QmIGxpbmVCb3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tLCBJbmxpbmVMYXlv
dXRVbml0IGFsaWdtZW50QmFzZWxpbmUsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxM
ZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgpOworCisgICAgY29uc3Qg
SW5saW5lUmVjdCYgbGluZUJveExvZ2ljYWxSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94
TG9naWNhbFJlY3Q7IH0KKworICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBlbmNsb3NpbmdUb3BB
bmRCb3R0b20oKSBjb25zdCB7IHJldHVybiBtX2VuY2xvc2luZ1RvcEFuZEJvdHRvbTsgfQorCisg
ICAgSW5saW5lTGF5b3V0VW5pdCBiYXNlbGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fYWxpZ21lbnRC
YXNlbGluZTsgfQorCisgICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQoKSBj
b25zdCB7IHJldHVybiBtX2NvbnRlbnRMb2dpY2FsTGVmdDsgfQorICAgIElubGluZUxheW91dFVu
aXQgY29udGVudExvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudExvZ2ljYWxX
aWR0aDsgfQorCisgICAgdm9pZCBtb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNl
dCkgeyBtX2xpbmVCb3hMb2dpY2FsUmVjdC5tb3ZlVmVydGljYWxseShvZmZzZXQpOyB9CisKK3By
aXZhdGU6CisgICAgLy8gVGhpcyBpcyBsaW5lIGJveCBnZW9tZXRyeSAoc2VlIGh0dHBzOi8vd3d3
LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xpbmUtYm94KS4KKyAgICBJbmxpbmVSZWN0IG1fbGlu
ZUJveExvZ2ljYWxSZWN0OworICAgIC8vIEVuY2xvc2luZyB0b3AgYW5kIGJvdHRvbSBpbmNsdWRl
cyBhbGwgaW5saW5lIGxldmVsIGJveGVzIChib3JkZXIgYm94KSB2ZXJ0aWNhbGx5LgorICAgIC8v
IFdoaWxlIHRoZSBsaW5lIGJveCB1c3VhbGx5IGVuY2xvc2UgdGhlbSBhcyB3ZWxsLCBpdHMgdmVy
dGljYWwgZ2VvbWV0cnkgaXMgYmFzZWQgb24KKyAgICAvLyB0aGUgbGF5b3V0IGJvdW5kcyBvZiB0
aGUgaW5saW5lIGxldmVsIGJveGVzIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgd2hlbiBsaW5lLWhl
aWdodCBpcyBwcmVzZW50LgorICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBtX2VuY2xvc2luZ1Rv
cEFuZEJvdHRvbTsKKyAgICBJbmxpbmVMYXlvdXRVbml0IG1fYWxpZ21lbnRCYXNlbGluZSB7IDAg
fTsKKyAgICBJbmxpbmVMYXlvdXRVbml0IG1fY29udGVudExvZ2ljYWxMZWZ0IHsgMCB9OworICAg
IElubGluZUxheW91dFVuaXQgbV9jb250ZW50TG9naWNhbFdpZHRoIHsgMCB9OworfTsKKworaW5s
aW5lIElubGluZUxpbmVHZW9tZXRyeTo6SW5saW5lTGluZUdlb21ldHJ5KGNvbnN0IElubGluZVJl
Y3QmIGxpbmVCb3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tIGVuY2xvc2luZ1Rv
cEFuZEJvdHRvbSwgSW5saW5lTGF5b3V0VW5pdCBhbGlnbWVudEJhc2VsaW5lLCBJbmxpbmVMYXlv
dXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNh
bFdpZHRoKQorICAgIDogbV9saW5lQm94TG9naWNhbFJlY3QobGluZUJveExvZ2ljYWxSZWN0KQor
ICAgICwgbV9lbmNsb3NpbmdUb3BBbmRCb3R0b20oZW5jbG9zaW5nVG9wQW5kQm90dG9tKQorICAg
ICwgbV9hbGlnbWVudEJhc2VsaW5lKGFsaWdtZW50QmFzZWxpbmUpCisgICAgLCBtX2NvbnRlbnRM
b2dpY2FsTGVmdChjb250ZW50TG9naWNhbExlZnQpCisgICAgLCBtX2NvbnRlbnRMb2dpY2FsV2lk
dGgoY29udGVudExvZ2ljYWxXaWR0aCkKK3sKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0
dGluZy9JbmxpbmVMaW5lUnVuLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZVJ1bi5oCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBiMGVl
MTRkZWQwYmUyY2NkNTJkMzQzM2IwODg0NTQ2YzFmMGQyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcv
SW5saW5lTGluZVJ1bi5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBv
bmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUg
IklubGluZVJlY3QuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJUZXh0Rmxh
Z3MuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3N0cnVj
dCBMaW5lUnVuIHsKKyAgICBXVEZfTUFLRV9TVFJVQ1RfRkFTVF9BTExPQ0FURUQ7CisgICAgc3Ry
dWN0IFRleHQgeworICAgICAgICBXVEZfTUFLRV9TVFJVQ1RfRkFTVF9BTExPQ0FURUQ7CisgICAg
cHVibGljOgorICAgICAgICBUZXh0KHNpemVfdCBwb3NpdGlvbiwgc2l6ZV90IGxlbmd0aCwgY29u
c3QgU3RyaW5nJik7CisKKyAgICAgICAgc2l6ZV90IHN0YXJ0KCkgY29uc3QgeyByZXR1cm4gbV9z
dGFydDsgfQorICAgICAgICBzaXplX3QgZW5kKCkgY29uc3QgeyByZXR1cm4gc3RhcnQoKSArIGxl
bmd0aCgpOyB9CisgICAgICAgIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2xlbmd0
aDsgfQorICAgICAgICBTdHJpbmcgY29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudFN0
cmluZzsgfQorCisgICAgICAgIGJvb2wgbmVlZHNIeXBoZW4oKSBjb25zdCB7IHJldHVybiBtX25l
ZWRzSHlwaGVuOyB9CisgICAgICAgIHZvaWQgc2V0TmVlZHNIeXBoZW4oKSB7IG1fbmVlZHNIeXBo
ZW4gPSB0cnVlOyB9CisKKyAgICAgICAgdm9pZCBleHBhbmQoc2l6ZV90IGRlbHRhKSB7IG1fbGVu
Z3RoICs9IGRlbHRhOyB9CisgICAgICAgIHZvaWQgc2hyaW5rKHNpemVfdCBkZWx0YSkgeyBtX2xl
bmd0aCAtPSBkZWx0YTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc2l6ZV90IG1fc3RhcnQg
eyAwIH07CisgICAgICAgIHNpemVfdCBtX2xlbmd0aCB7IDAgfTsKKyAgICAgICAgYm9vbCBtX25l
ZWRzSHlwaGVuIHsgZmFsc2UgfTsKKyAgICAgICAgU3RyaW5nIG1fY29udGVudFN0cmluZzsKKyAg
ICB9OworCisgICAgc3RydWN0IEV4cGFuc2lvbjsKKyAgICBMaW5lUnVuKHNpemVfdCBsaW5lSW5k
ZXgsIGNvbnN0IEJveCYsIGNvbnN0IElubGluZVJlY3QmLCBFeHBhbnNpb24sIE9wdGlvbmFsPFRl
eHQ+ID0gV1RGOjpudWxsb3B0KTsKKworICAgIGNvbnN0IElubGluZVJlY3QmIGxvZ2ljYWxSZWN0
KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdDsgfQorCisgICAgSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS50b3AoKTsgfQorICAg
IElubGluZUxheW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxS
ZWN0KCkuYm90dG9tKCk7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KCkgY29u
c3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS5sZWZ0KCk7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0
IGxvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkucmlnaHQoKTsgfQor
CisgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBsb2dp
Y2FsUmVjdCgpLndpZHRoKCk7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQo
KSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVjdCgpLmhlaWdodCgpOyB9CisKKyAgICB2b2lkIG1v
dmVWZXJ0aWNhbGx5KElubGluZUxheW91dFVuaXQgb2Zmc2V0KSB7IG1fbG9naWNhbFJlY3QubW92
ZVZlcnRpY2FsbHkob2Zmc2V0KTsgfQorICAgIE9wdGlvbmFsPFRleHQ+JiB0ZXh0KCkgeyByZXR1
cm4gbV90ZXh0OyB9CisgICAgY29uc3QgT3B0aW9uYWw8VGV4dD4mIHRleHQoKSBjb25zdCB7IHJl
dHVybiBtX3RleHQ7IH0KKworICAgIHN0cnVjdCBFeHBhbnNpb24geworICAgICAgICBFeHBhbnNp
b25CZWhhdmlvciBiZWhhdmlvciB7IERlZmF1bHRFeHBhbnNpb24gfTsKKyAgICAgICAgSW5saW5l
TGF5b3V0VW5pdCBob3Jpem9udGFsRXhwYW5zaW9uIHsgMCB9OworICAgIH07CisgICAgRXhwYW5z
aW9uIGV4cGFuc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fZXhwYW5zaW9uOyB9CisKKyAgICBjb25z
dCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQorICAgIHNp
emVfdCBsaW5lSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2xpbmVJbmRleDsgfQorCitwcml2YXRl
OgorICAgIGNvbnN0IHNpemVfdCBtX2xpbmVJbmRleDsKKyAgICBXZWFrUHRyPGNvbnN0IExheW91
dDo6Qm94PiBtX2xheW91dEJveDsKKyAgICBJbmxpbmVSZWN0IG1fbG9naWNhbFJlY3Q7CisgICAg
RXhwYW5zaW9uIG1fZXhwYW5zaW9uOworICAgIE9wdGlvbmFsPFRleHQ+IG1fdGV4dDsKK307CisK
K2lubGluZSBMaW5lUnVuOjpMaW5lUnVuKHNpemVfdCBsaW5lSW5kZXgsIGNvbnN0IExheW91dDo6
Qm94JiBsYXlvdXRCb3gsIGNvbnN0IElubGluZVJlY3QmIGxvZ2ljYWxSZWN0LCBFeHBhbnNpb24g
ZXhwYW5zaW9uLCBPcHRpb25hbDxUZXh0PiB0ZXh0KQorICAgIDogbV9saW5lSW5kZXgobGluZUlu
ZGV4KQorICAgICwgbV9sYXlvdXRCb3gobWFrZVdlYWtQdHIobGF5b3V0Qm94KSkKKyAgICAsIG1f
bG9naWNhbFJlY3QobG9naWNhbFJlY3QpCisgICAgLCBtX2V4cGFuc2lvbihleHBhbnNpb24pCisg
ICAgLCBtX3RleHQodGV4dCkKK3sKK30KKworaW5saW5lIExpbmVSdW46OlRleHQ6OlRleHQoc2l6
ZV90IHN0YXJ0LCBzaXplX3QgbGVuZ3RoLCBjb25zdCBTdHJpbmcmIGNvbnRlbnRTdHJpbmcpCisg
ICAgOiBtX3N0YXJ0KHN0YXJ0KQorICAgICwgbV9sZW5ndGgobGVuZ3RoKQorICAgICwgbV9jb250
ZW50U3RyaW5nKGNvbnRlbnRTdHJpbmcpCit7Cit9CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0
aW5nL0lubGluZVJlY3QuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVSZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYWNkMDlhYjFlNzEw
MWFhNmVjZjQzM2QyNjQwMDRmZmU4ZmI3YThjNAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVS
ZWN0LmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
KyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisg
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lm
IEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiTGF5b3V0VW5p
dHMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNz
IElubGluZVJlY3QgeworcHVibGljOgorICAgIElubGluZVJlY3QoKSA9IGRlZmF1bHQ7CisgICAg
SW5saW5lUmVjdChJbmxpbmVMYXlvdXRVbml0IHRvcCwgSW5saW5lTGF5b3V0VW5pdCBsZWZ0LCBJ
bmxpbmVMYXlvdXRVbml0IHdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCk7CisgICAgSW5s
aW5lUmVjdChjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgdG9wTGVmdCwgSW5saW5lTGF5b3V0VW5p
dCB3aWR0aCwgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQpOworICAgIElubGluZVJlY3QoY29uc3Qg
SW5saW5lTGF5b3V0UG9pbnQmIHRvcExlZnQsIGNvbnN0IElubGluZUxheW91dFNpemUmKTsKKyAg
ICAKKyAgICBJbmxpbmVMYXlvdXRVbml0IHRvcCgpIGNvbnN0OworICAgIElubGluZUxheW91dFVu
aXQgbGVmdCgpIGNvbnN0OworICAgIElubGluZUxheW91dFBvaW50IHRvcExlZnQoKSBjb25zdDsK
KworICAgIElubGluZUxheW91dFVuaXQgYm90dG9tKCkgY29uc3Q7CisgICAgSW5saW5lTGF5b3V0
VW5pdCByaWdodCgpIGNvbnN0OyAgICAgICAgCisKKyAgICBJbmxpbmVMYXlvdXRVbml0IHdpZHRo
KCkgY29uc3Q7CisgICAgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQoKSBjb25zdDsKKyAgICBJbmxp
bmVMYXlvdXRTaXplIHNpemUoKSBjb25zdDsKKworICAgIHZvaWQgc2V0VG9wKElubGluZUxheW91
dFVuaXQpOworICAgIHZvaWQgc2V0Qm90dG9tKElubGluZUxheW91dFVuaXQpOworICAgIHZvaWQg
c2V0TGVmdChJbmxpbmVMYXlvdXRVbml0KTsKKyAgICB2b2lkIHNldFRvcExlZnQoY29uc3QgSW5s
aW5lTGF5b3V0UG9pbnQmKTsKKyAgICB2b2lkIHNldFdpZHRoKElubGluZUxheW91dFVuaXQpOwor
ICAgIHZvaWQgc2V0SGVpZ2h0KElubGluZUxheW91dFVuaXQpOworCisgICAgdm9pZCBtb3ZlSG9y
aXpvbnRhbGx5KElubGluZUxheW91dFVuaXQpOworICAgIHZvaWQgbW92ZVZlcnRpY2FsbHkoSW5s
aW5lTGF5b3V0VW5pdCk7CisgICAgdm9pZCBtb3ZlQnkoSW5saW5lTGF5b3V0UG9pbnQpOworCisg
ICAgdm9pZCBleHBhbmQoT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4sIE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+KTsKKyAgICB2b2lkIGV4cGFuZFRvQ29udGFpbihjb25zdCBJbmxpbmVSZWN0
Jik7CisgICAgdm9pZCBleHBhbmRIb3Jpem9udGFsbHkoSW5saW5lTGF5b3V0VW5pdCBkZWx0YSkg
eyBleHBhbmQoZGVsdGEsIHsgfSk7IH0KKyAgICB2b2lkIGV4cGFuZFZlcnRpY2FsbHkoSW5saW5l
TGF5b3V0VW5pdCBkZWx0YSkgeyBleHBhbmQoeyB9LCBkZWx0YSk7IH0KKyAgICB2b2lkIGV4cGFu
ZFZlcnRpY2FsbHlUb0NvbnRhaW4oY29uc3QgSW5saW5lUmVjdCYpOworICAgIHZvaWQgaW5mbGF0
ZShJbmxpbmVMYXlvdXRVbml0KTsKKworICAgIG9wZXJhdG9yIElubGluZUxheW91dFJlY3QoKSBj
b25zdDsKKworcHJpdmF0ZToKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIHZvaWQgaW52YWxpZGF0
ZVRvcCgpIHsgbV9oYXNWYWxpZFRvcCA9IGZhbHNlOyB9CisgICAgdm9pZCBpbnZhbGlkYXRlTGVm
dCgpIHsgbV9oYXNWYWxpZExlZnQgPSBmYWxzZTsgfQorICAgIHZvaWQgaW52YWxpZGF0ZVdpZHRo
KCkgeyBtX2hhc1ZhbGlkV2lkdGggPSBmYWxzZTsgfQorICAgIHZvaWQgaW52YWxpZGF0ZUhlaWdo
dCgpIHsgbV9oYXNWYWxpZEhlaWdodCA9IGZhbHNlOyB9CisgICAgdm9pZCBpbnZhbGlkYXRlUG9z
aXRpb24oKTsKKworICAgIGJvb2wgaGFzVmFsaWRQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1f
aGFzVmFsaWRUb3AgJiYgbV9oYXNWYWxpZExlZnQ7IH0KKyAgICBib29sIGhhc1ZhbGlkU2l6ZSgp
IGNvbnN0IHsgcmV0dXJuIG1faGFzVmFsaWRXaWR0aCAmJiBtX2hhc1ZhbGlkSGVpZ2h0OyB9Cisg
ICAgYm9vbCBoYXNWYWxpZEdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gaGFzVmFsaWRQb3NpdGlv
bigpICYmIGhhc1ZhbGlkU2l6ZSgpOyB9CisKKyAgICB2b2lkIHNldEhhc1ZhbGlkUG9zaXRpb24o
KTsKKyAgICB2b2lkIHNldEhhc1ZhbGlkU2l6ZSgpOworCisgICAgYm9vbCBtX2hhc1ZhbGlkVG9w
IHsgZmFsc2UgfTsKKyAgICBib29sIG1faGFzVmFsaWRMZWZ0IHsgZmFsc2UgfTsKKyAgICBib29s
IG1faGFzVmFsaWRXaWR0aCB7IGZhbHNlIH07CisgICAgYm9vbCBtX2hhc1ZhbGlkSGVpZ2h0IHsg
ZmFsc2UgfTsKKyNlbmRpZiAvLyBBU1NFUlRfRU5BQkxFRAorICAgIElubGluZUxheW91dFJlY3Qg
bV9yZWN0OworfTsKKworaW5saW5lIElubGluZVJlY3Q6OklubGluZVJlY3QoSW5saW5lTGF5b3V0
VW5pdCB0b3AsIElubGluZUxheW91dFVuaXQgbGVmdCwgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCwg
SW5saW5lTGF5b3V0VW5pdCBoZWlnaHQpCisgICAgOiBtX3JlY3QobGVmdCwgdG9wLCB3aWR0aCwg
aGVpZ2h0KQoreworI2lmIEFTU0VSVF9FTkFCTEVECisgICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7
CisgICAgbV9oYXNWYWxpZExlZnQgPSB0cnVlOworICAgIG1faGFzVmFsaWRXaWR0aCA9IHRydWU7
CisgICAgbV9oYXNWYWxpZEhlaWdodCA9IHRydWU7CisjZW5kaWYKK30KKworaW5saW5lIElubGlu
ZVJlY3Q6OklubGluZVJlY3QoY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIHRvcExlZnQsIElubGlu
ZUxheW91dFVuaXQgd2lkdGgsIElubGluZUxheW91dFVuaXQgaGVpZ2h0KQorICAgIDogSW5saW5l
UmVjdCh0b3BMZWZ0LnkoKSwgdG9wTGVmdC54KCksIHdpZHRoLCBoZWlnaHQpCit7Cit9CisKK2lu
bGluZSBJbmxpbmVSZWN0OjpJbmxpbmVSZWN0KGNvbnN0IElubGluZUxheW91dFBvaW50JiB0b3BM
ZWZ0LCBjb25zdCBJbmxpbmVMYXlvdXRTaXplJiBzaXplKQorICAgIDogSW5saW5lUmVjdCh0b3BM
ZWZ0LnkoKSwgdG9wTGVmdC54KCksIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSkKK3sKK30K
KworI2lmIEFTU0VSVF9FTkFCTEVECitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjppbnZhbGlkYXRl
UG9zaXRpb24oKQoreworICAgIGludmFsaWRhdGVUb3AoKTsKKyAgICBpbnZhbGlkYXRlTGVmdCgp
OworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRIYXNWYWxpZFBvc2l0aW9uKCkKK3sK
KyAgICBtX2hhc1ZhbGlkVG9wID0gdHJ1ZTsKKyAgICBtX2hhc1ZhbGlkTGVmdCA9IHRydWU7Cit9
CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6OnNldEhhc1ZhbGlkU2l6ZSgpCit7CisgICAgbV9o
YXNWYWxpZFdpZHRoID0gdHJ1ZTsKKyAgICBtX2hhc1ZhbGlkSGVpZ2h0ID0gdHJ1ZTsKK30KKyNl
bmRpZiAvLyBBU1NFUlRfRU5BQkxFRAorCitpbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVS
ZWN0Ojp0b3AoKSBjb25zdAoreworICAgIEFTU0VSVChtX2hhc1ZhbGlkVG9wKTsKKyAgICByZXR1
cm4gbV9yZWN0LnkoKTsKK30KKworaW5saW5lIElubGluZUxheW91dFVuaXQgSW5saW5lUmVjdDo6
bGVmdCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1faGFzVmFsaWRMZWZ0KTsKKyAgICByZXR1cm4g
bV9yZWN0LngoKTsKK30KKworaW5saW5lIElubGluZUxheW91dFVuaXQgSW5saW5lUmVjdDo6Ym90
dG9tKCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV9oYXNWYWxpZFRvcCAmJiBtX2hhc1ZhbGlkSGVp
Z2h0KTsKKyAgICByZXR1cm4gbV9yZWN0Lm1heFkoKTsKK30KKworaW5saW5lIElubGluZUxheW91
dFVuaXQgSW5saW5lUmVjdDo6cmlnaHQoKSBjb25zdAoreworICAgIEFTU0VSVChtX2hhc1ZhbGlk
TGVmdCAmJiBtX2hhc1ZhbGlkV2lkdGgpOworICAgIHJldHVybiBtX3JlY3QubWF4WCgpOworfQor
CitpbmxpbmUgSW5saW5lTGF5b3V0UG9pbnQgSW5saW5lUmVjdDo6dG9wTGVmdCgpIGNvbnN0Cit7
CisgICAgQVNTRVJUKGhhc1ZhbGlkUG9zaXRpb24oKSk7CisgICAgcmV0dXJuIG1fcmVjdC5taW5Y
TWluWUNvcm5lcigpOworfQorCitpbmxpbmUgSW5saW5lTGF5b3V0U2l6ZSBJbmxpbmVSZWN0Ojpz
aXplKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaGFzVmFsaWRTaXplKCkpOworICAgIHJldHVybiBt
X3JlY3Quc2l6ZSgpOworfQorCitpbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVSZWN0Ojp3
aWR0aCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1faGFzVmFsaWRXaWR0aCk7CisgICAgcmV0dXJu
IG1fcmVjdC53aWR0aCgpOworfQorCitpbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVSZWN0
OjpoZWlnaHQoKSBjb25zdAoreworICAgIEFTU0VSVChtX2hhc1ZhbGlkSGVpZ2h0KTsKKyAgICBy
ZXR1cm4gbV9yZWN0LmhlaWdodCgpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRU
b3BMZWZ0KGNvbnN0IElubGluZUxheW91dFBvaW50JiB0b3BMZWZ0KQoreworI2lmIEFTU0VSVF9F
TkFCTEVECisgICAgc2V0SGFzVmFsaWRQb3NpdGlvbigpOworI2VuZGlmCisgICAgbV9yZWN0LnNl
dExvY2F0aW9uKHRvcExlZnQpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRUb3Ao
SW5saW5lTGF5b3V0VW5pdCB0b3ApCit7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICBtX2hhc1Zh
bGlkVG9wID0gdHJ1ZTsKKyNlbmRpZgorICAgIG1fcmVjdC5zZXRZKHRvcCk7Cit9CisKK2lubGlu
ZSB2b2lkIElubGluZVJlY3Q6OnNldEJvdHRvbShJbmxpbmVMYXlvdXRVbml0IGJvdHRvbSkKK3sK
KyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIG1faGFzVmFsaWRUb3AgPSB0cnVlOworICAgIG1faGFz
VmFsaWRIZWlnaHQgPSB0cnVlOworI2VuZGlmCisgICAgbV9yZWN0LnNoaWZ0TWF4WUVkZ2VUbyhi
b3R0b20pOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRMZWZ0KElubGluZUxheW91
dFVuaXQgbGVmdCkKK3sKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIG1faGFzVmFsaWRMZWZ0ID0g
dHJ1ZTsKKyNlbmRpZgorICAgIG1fcmVjdC5zZXRYKGxlZnQpOworfQorCitpbmxpbmUgdm9pZCBJ
bmxpbmVSZWN0OjpzZXRXaWR0aChJbmxpbmVMYXlvdXRVbml0IHdpZHRoKQoreworI2lmIEFTU0VS
VF9FTkFCTEVECisgICAgbV9oYXNWYWxpZFdpZHRoID0gdHJ1ZTsKKyNlbmRpZgorICAgIG1fcmVj
dC5zZXRXaWR0aCh3aWR0aCk7Cit9CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6OnNldEhlaWdo
dChJbmxpbmVMYXlvdXRVbml0IGhlaWdodCkKK3sKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIG1f
aGFzVmFsaWRIZWlnaHQgPSB0cnVlOworI2VuZGlmCisgICAgbV9yZWN0LnNldEhlaWdodChoZWln
aHQpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0Ojptb3ZlSG9yaXpvbnRhbGx5KElubGlu
ZUxheW91dFVuaXQgb2Zmc2V0KQoreworICAgIEFTU0VSVChtX2hhc1ZhbGlkTGVmdCk7CisgICAg
bV9yZWN0Lm1vdmUoSW5saW5lTGF5b3V0U2l6ZSB7IG9mZnNldCwgMCB9KTsKK30KKworaW5saW5l
IHZvaWQgSW5saW5lUmVjdDo6bW92ZVZlcnRpY2FsbHkoSW5saW5lTGF5b3V0VW5pdCBvZmZzZXQp
Cit7CisgICAgQVNTRVJUKG1faGFzVmFsaWRUb3ApOworICAgIG1fcmVjdC5tb3ZlKElubGluZUxh
eW91dFNpemUgeyAwLCBvZmZzZXQgfSk7Cit9CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6Om1v
dmVCeShJbmxpbmVMYXlvdXRQb2ludCBvZmZzZXQpCit7CisgICAgQVNTRVJUKG1faGFzVmFsaWRU
b3ApOworICAgIEFTU0VSVChtX2hhc1ZhbGlkTGVmdCk7CisgICAgbV9yZWN0Lm1vdmVCeShvZmZz
ZXQpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpleHBhbmQoT3B0aW9uYWw8SW5saW5l
TGF5b3V0VW5pdD4gd2lkdGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGhlaWdodCkKK3sK
KyAgICBBU1NFUlQoIXdpZHRoIHx8IG1faGFzVmFsaWRXaWR0aCk7CisgICAgQVNTRVJUKCFoZWln
aHQgfHwgbV9oYXNWYWxpZEhlaWdodCk7CisgICAgbV9yZWN0LmV4cGFuZCh3aWR0aC52YWx1ZU9y
KDApLCBoZWlnaHQudmFsdWVPcigwKSk7Cit9CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6OmV4
cGFuZFRvQ29udGFpbihjb25zdCBJbmxpbmVSZWN0JiBvdGhlcikKK3sKKyNpZiBBU1NFUlRfRU5B
QkxFRAorICAgIG1faGFzVmFsaWRUb3AgPSB0cnVlOworICAgIG1faGFzVmFsaWRMZWZ0ID0gdHJ1
ZTsKKyAgICBtX2hhc1ZhbGlkV2lkdGggPSB0cnVlOworICAgIG1faGFzVmFsaWRIZWlnaHQgPSB0
cnVlOworI2VuZGlmCisgICAgbV9yZWN0LnVuaXRlRXZlbklmRW1wdHkob3RoZXIpOworfQorCitp
bmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpleHBhbmRWZXJ0aWNhbGx5VG9Db250YWluKGNvbnN0IElu
bGluZVJlY3QmIG90aGVyKQoreworICAgIGF1dG8gY29udGFpblRvcCA9IHN0ZDo6bWluKHRvcCgp
LCBvdGhlci50b3AoKSk7CisgICAgYXV0byBjb250YWluQm90dG9tID0gc3RkOjptYXgoYm90dG9t
KCksIG90aGVyLmJvdHRvbSgpKTsKKyAgICBzZXRUb3AoY29udGFpblRvcCk7CisgICAgc2V0Qm90
dG9tKGNvbnRhaW5Cb3R0b20pOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjppbmZsYXRl
KElubGluZUxheW91dFVuaXQgaW5mbGF0ZSkKK3sKKyAgICBBU1NFUlQoaGFzVmFsaWRHZW9tZXRy
eSgpKTsKKyAgICBtX3JlY3QuaW5mbGF0ZShpbmZsYXRlKTsKK30KKworaW5saW5lIElubGluZVJl
Y3Q6Om9wZXJhdG9yIElubGluZUxheW91dFJlY3QoKSBjb25zdAoreworICAgIEFTU0VSVChoYXNW
YWxpZEdlb21ldHJ5KCkpOyAKKyAgICByZXR1cm4gbV9yZWN0OworfQorCit9Cit9CisjZW5kaWYK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5s
aW5lZm9ybWF0dGluZy9JbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVNvZnRMaW5l
QnJlYWtJdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOWVhMDZmYmNkZDE3ODI0MmJhYjU0NzNhOTRhMTNhYzMw
YmM3OTcwYgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oCkBA
IC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShM
QVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiSW5saW5lSXRlbS5oIgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgSW5saW5lU29m
dExpbmVCcmVha0l0ZW0gOiBwdWJsaWMgSW5saW5lSXRlbSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IElubGluZVNvZnRMaW5lQnJlYWtJdGVtIGNyZWF0ZVNvZnRMaW5lQnJlYWtJdGVtKGNvbnN0IElu
bGluZVRleHRCb3gmLCB1bnNpZ25lZCBwb3NpdGlvbik7CisKKyAgICB1bnNpZ25lZCBwb3NpdGlv
bigpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRPclBvc2l0aW9uOyB9CisgICAgY29uc3QgSW5saW5l
VGV4dEJveCYgaW5saW5lVGV4dEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PElubGluZVRl
eHRCb3g+KGxheW91dEJveCgpKTsgfQorCisgICAgSW5saW5lU29mdExpbmVCcmVha0l0ZW0oY29u
c3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHBvc2l0aW9uKTsKK307CisKK2lubGluZSBJbmxp
bmVTb2Z0TGluZUJyZWFrSXRlbSBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbTo6Y3JlYXRlU29mdExp
bmVCcmVha0l0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQg
cG9zaXRpb24pCit7CisgICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgcG9zaXRpb24gfTsKK30K
KworaW5saW5lIElubGluZVNvZnRMaW5lQnJlYWtJdGVtOjpJbmxpbmVTb2Z0TGluZUJyZWFrSXRl
bShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBwb3NpdGlvbikK
KyAgICA6IElubGluZUl0ZW0oaW5saW5lVGV4dEJveCwgVHlwZTo6U29mdExpbmVCcmVhaykKK3sK
KyAgICBtX3N0YXJ0T3JQb3NpdGlvbiA9IHBvc2l0aW9uOworfQorCit9Cit9CisKK1NQRUNJQUxJ
WkVfVFlQRV9UUkFJVFNfSU5MSU5FX0lURU0oSW5saW5lU29mdExpbmVCcmVha0l0ZW0sIGlzU29m
dExpbmVCcmVhaygpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVUZXh0SXRlbS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRp
bmcvSW5saW5lVGV4dEl0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjljNzM3YWYwYmRiYTk1YTVmNDA1ZWNi
NDk0NWZjY2QxOWNkOGJjMzkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uY3Bw
CkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIklubGluZVRleHRJdGVtLmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdf
Q09OVEVYVCkKKworI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisjaW5jbHVkZSAiSW5saW5lU29m
dExpbmVCcmVha0l0ZW0uaCIKKyNpbmNsdWRlICJUZXh0VXRpbC5oIgorI2luY2x1ZGUgPHd0Zi91
bmljb2RlL0NoYXJhY3Rlck5hbWVzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFj
ZSBMYXlvdXQgeworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihJbmxpbmVJdGVtKSA9PSBzaXplb2Yo
SW5saW5lVGV4dEl0ZW0pLCAiIik7CisKK3N0cnVjdCBXaGl0ZXNwYWNlQ29udGVudCB7CisgICAg
c2l6ZV90IGxlbmd0aCB7IDAgfTsKKyAgICBib29sIGlzV29yZFNlcGFyYXRvciB7IHRydWUgfTsK
K307CitzdGF0aWMgT3B0aW9uYWw8V2hpdGVzcGFjZUNvbnRlbnQ+IG1vdmVUb05leHROb25XaGl0
ZXNwYWNlUG9zaXRpb24oY29uc3QgU3RyaW5nVmlldyYgdGV4dENvbnRlbnQsIHNpemVfdCBzdGFy
dFBvc2l0aW9uLCBib29sIHByZXNlcnZlTmV3bGluZSwgYm9vbCBwcmVzZXJ2ZVRhYikKK3sKKyAg
ICBhdXRvIGhhc1dvcmRTZXBhcmF0b3JDaGFyYWN0ZXIgPSBmYWxzZTsKKyAgICBhdXRvIGlzV2hp
dGVzcGFjZUNoYXJhY3RlciA9IFsmXShhdXRvIGNoYXJhY3RlcikgeworICAgICAgICAvLyB3aGl0
ZSBzcGFjZSBwcm9jZXNzaW5nIGluIENTUyBhZmZlY3RzIG9ubHkgdGhlIGRvY3VtZW50IHdoaXRl
IHNwYWNlIGNoYXJhY3RlcnM6IHNwYWNlcyAoVSswMDIwKSwgdGFicyAoVSswMDA5KSwgYW5kIHNl
Z21lbnQgYnJlYWtzLgorICAgICAgICBhdXRvIGlzVHJlYXRlZEFzU3BhY2VDaGFyYWN0ZXIgPSBj
aGFyYWN0ZXIgPT0gc3BhY2UgfHwgKGNoYXJhY3RlciA9PSBuZXdsaW5lQ2hhcmFjdGVyICYmICFw
cmVzZXJ2ZU5ld2xpbmUpIHx8IChjaGFyYWN0ZXIgPT0gdGFiQ2hhcmFjdGVyICYmICFwcmVzZXJ2
ZVRhYik7CisgICAgICAgIGhhc1dvcmRTZXBhcmF0b3JDaGFyYWN0ZXIgPSBoYXNXb3JkU2VwYXJh
dG9yQ2hhcmFjdGVyIHx8IGlzVHJlYXRlZEFzU3BhY2VDaGFyYWN0ZXI7CisgICAgICAgIHJldHVy
biBpc1RyZWF0ZWRBc1NwYWNlQ2hhcmFjdGVyIHx8IGNoYXJhY3RlciA9PSB0YWJDaGFyYWN0ZXI7
CisgICAgfTsKKyAgICBhdXRvIG5leHROb25XaGl0ZVNwYWNlUG9zaXRpb24gPSBzdGFydFBvc2l0
aW9uOworICAgIHdoaWxlIChuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uIDwgdGV4dENvbnRlbnQu
bGVuZ3RoKCkgJiYgaXNXaGl0ZXNwYWNlQ2hhcmFjdGVyKHRleHRDb250ZW50W25leHROb25XaGl0
ZVNwYWNlUG9zaXRpb25dKSkKKyAgICAgICAgKytuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uOwor
ICAgIHJldHVybiBuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uID09IHN0YXJ0UG9zaXRpb24gPyBX
VEY6Om51bGxvcHQgOiBtYWtlT3B0aW9uYWwoV2hpdGVzcGFjZUNvbnRlbnQgeyBuZXh0Tm9uV2hp
dGVTcGFjZVBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiwgaGFzV29yZFNlcGFyYXRvckNoYXJhY3Rl
ciB9KTsKK30KKworc3RhdGljIHVuc2lnbmVkIG1vdmVUb05leHRCcmVha2FibGVQb3NpdGlvbih1
bnNpZ25lZCBzdGFydFBvc2l0aW9uLCBMYXp5TGluZUJyZWFrSXRlcmF0b3ImIGxpbmVCcmVha0l0
ZXJhdG9yLCBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUpCit7CisgICAgYXV0byB0ZXh0TGVuZ3Ro
ID0gbGluZUJyZWFrSXRlcmF0b3Iuc3RyaW5nVmlldygpLmxlbmd0aCgpOworICAgIGF1dG8gc3Rh
cnRQb3NpdGlvbkZvck5leHRCcmVha2FibGVQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb247CisgICAg
d2hpbGUgKHN0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb24gPCB0ZXh0TGVuZ3Ro
KSB7CisgICAgICAgIGF1dG8gbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gVGV4dFV0aWw6OmZpbmRO
ZXh0QnJlYWthYmxlUG9zaXRpb24obGluZUJyZWFrSXRlcmF0b3IsIHN0YXJ0UG9zaXRpb25Gb3JO
ZXh0QnJlYWthYmxlUG9zaXRpb24sIHN0eWxlKTsKKyAgICAgICAgLy8gT2Z0ZW50aW1lcyB0aGUg
bmV4dCBicmVha2FibGUgcG9zaXRpb24gY29tZXMgYmFjayBhcyB0aGUgc3RhcnQgcG9zaXRpb24g
KG1vc3Qgbm90YWJseSBoeXBoZW5zKS4KKyAgICAgICAgaWYgKG5leHRCcmVha2FibGVQb3NpdGlv
biAhPSBzdGFydFBvc2l0aW9uKQorICAgICAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3Np
dGlvbiAtIHN0YXJ0UG9zaXRpb247CisgICAgICAgICsrc3RhcnRQb3NpdGlvbkZvck5leHRCcmVh
a2FibGVQb3NpdGlvbjsKKyAgICB9CisgICAgcmV0dXJuIHRleHRMZW5ndGggLSBzdGFydFBvc2l0
aW9uOworfQorCit2b2lkIElubGluZVRleHRJdGVtOjpjcmVhdGVBbmRBcHBlbmRUZXh0SXRlbXMo
SW5saW5lSXRlbXMmIGlubGluZUNvbnRlbnQsIGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRl
eHRCb3gpCit7CisgICAgYXV0byB0ZXh0ID0gaW5saW5lVGV4dEJveC5jb250ZW50KCk7CisgICAg
aWYgKCF0ZXh0Lmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gaW5saW5lQ29udGVudC5hcHBlbmQo
SW5saW5lVGV4dEl0ZW06OmNyZWF0ZUVtcHR5SXRlbShpbmxpbmVUZXh0Qm94KSk7CisKKyAgICBh
dXRvJiBzdHlsZSA9IGlubGluZVRleHRCb3guc3R5bGUoKTsKKyAgICBhdXRvJiBmb250ID0gc3R5
bGUuZm9udENhc2NhZGUoKTsKKyAgICBhdXRvIHdoaXRlc3BhY2VDb250ZW50SXNUcmVhdGVkQXNT
aW5nbGVTcGFjZSA9ICFUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGlu
ZVRleHRCb3gpOworICAgIGF1dG8gc2hvdWxkUHJlc2VydmVOZXdsaW5lID0gVGV4dFV0aWw6OnNo
b3VsZFByZXNlcnZlTmV3bGluZShpbmxpbmVUZXh0Qm94KTsKKyAgICBhdXRvIGxpbmVCcmVha0l0
ZXJhdG9yID0gTGF6eUxpbmVCcmVha0l0ZXJhdG9yIHsgdGV4dCwgc3R5bGUuY29tcHV0ZWRMb2Nh
bGUoKSwgVGV4dFV0aWw6OmxpbmVCcmVha0l0ZXJhdG9yTW9kZShzdHlsZS5saW5lQnJlYWsoKSkg
fTsKKyAgICB1bnNpZ25lZCBjdXJyZW50UG9zaXRpb24gPSAwOworCisgICAgYXV0byBpbmxpbmVJ
dGVtV2lkdGggPSBbJl0oYXV0byBzdGFydFBvc2l0aW9uLCBhdXRvIGxlbmd0aCkgLT4gT3B0aW9u
YWw8SW5saW5lTGF5b3V0VW5pdD4geworICAgICAgICBpZiAoIWlubGluZVRleHRCb3guY2FuVXNl
U2ltcGxpZmllZENvbnRlbnRNZWFzdXJpbmcoKSkKKyAgICAgICAgICAgIHJldHVybiB7IH07Cisg
ICAgICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEJveCwgc3RhcnRQb3NpdGlv
biwgc3RhcnRQb3NpdGlvbiArIGxlbmd0aCwgeyB9KTsKKyAgICB9OworCisgICAgd2hpbGUgKGN1
cnJlbnRQb3NpdGlvbiA8IHRleHQubGVuZ3RoKCkpIHsKKyAgICAgICAgYXV0byBpc1NlZ21lbnRC
cmVha0NhbmRpZGF0ZSA9IFtdKGF1dG8gY2hhcmFjdGVyKSB7CisgICAgICAgICAgICByZXR1cm4g
Y2hhcmFjdGVyID09ICdcbic7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gU2VnbWVudCBicmVh
a3Mgd2l0aCBwcmVzZXJ2ZSBuZXcgbGluZSBzdHlsZSAod2hpdGUtc3BhY2U6IHByZSwgcHJlLXdy
YXAsIGJyZWFrLXNwYWNlcyBhbmQgcHJlLWxpbmUpIGNvbXB1dGUgdG8gZm9yY2VkIGxpbmUgYnJl
YWsuCisgICAgICAgIGlmIChpc1NlZ21lbnRCcmVha0NhbmRpZGF0ZSh0ZXh0W2N1cnJlbnRQb3Np
dGlvbl0pICYmIHNob3VsZFByZXNlcnZlTmV3bGluZSkgeworICAgICAgICAgICAgaW5saW5lQ29u
dGVudC5hcHBlbmQoSW5saW5lU29mdExpbmVCcmVha0l0ZW06OmNyZWF0ZVNvZnRMaW5lQnJlYWtJ
dGVtKGlubGluZVRleHRCb3gsIGN1cnJlbnRQb3NpdGlvbikpOworICAgICAgICAgICAgKytjdXJy
ZW50UG9zaXRpb247CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAg
IGlmIChhdXRvIHdoaXRlc3BhY2VDb250ZW50ID0gbW92ZVRvTmV4dE5vbldoaXRlc3BhY2VQb3Np
dGlvbih0ZXh0LCBjdXJyZW50UG9zaXRpb24sIHNob3VsZFByZXNlcnZlTmV3bGluZSwgIXdoaXRl
c3BhY2VDb250ZW50SXNUcmVhdGVkQXNTaW5nbGVTcGFjZSkpIHsKKyAgICAgICAgICAgIEFTU0VS
VCh3aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGF1dG8gYXBwZW5kV2hp
dGVzcGFjZUl0ZW0gPSBbJl0gKGF1dG8gc3RhcnRQb3NpdGlvbiwgYXV0byBpdGVtTGVuZ3RoKSB7
CisgICAgICAgICAgICAgICAgYXV0byBzaW1wbGVTaW5nbGVXaGl0ZXNwYWNlQ29udGVudCA9IGlu
bGluZVRleHRCb3guY2FuVXNlU2ltcGxpZmllZENvbnRlbnRNZWFzdXJpbmcoKSAmJiAoaXRlbUxl
bmd0aCA9PSAxIHx8IHdoaXRlc3BhY2VDb250ZW50SXNUcmVhdGVkQXNTaW5nbGVTcGFjZSk7Cisg
ICAgICAgICAgICAgICAgYXV0byB3aWR0aCA9IHNpbXBsZVNpbmdsZVdoaXRlc3BhY2VDb250ZW50
ID8gbWFrZU9wdGlvbmFsKElubGluZUxheW91dFVuaXQgeyBmb250LnNwYWNlV2lkdGgoKSB9KSA6
IGlubGluZUl0ZW1XaWR0aChzdGFydFBvc2l0aW9uLCBpdGVtTGVuZ3RoKTsKKyAgICAgICAgICAg
ICAgICBpbmxpbmVDb250ZW50LmFwcGVuZChJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlV2hpdGVzcGFj
ZUl0ZW0oaW5saW5lVGV4dEJveCwgc3RhcnRQb3NpdGlvbiwgaXRlbUxlbmd0aCwgd2hpdGVzcGFj
ZUNvbnRlbnQtPmlzV29yZFNlcGFyYXRvciwgd2lkdGgpKTsKKyAgICAgICAgICAgIH07CisgICAg
ICAgICAgICBpZiAoc3R5bGUud2hpdGVTcGFjZSgpID09IFdoaXRlU3BhY2U6OkJyZWFrU3BhY2Vz
KSB7CisgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10ZXh0LTMv
I3doaXRlLXNwYWNlLXBoYXNlLTEKKyAgICAgICAgICAgICAgICAvLyBGb3IgYnJlYWstc3BhY2Vz
LCBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBleGlzdHMgYWZ0ZXIgZXZlcnkgc3BhY2UgYW5kIGV2
ZXJ5IHRhYi4KKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogaWYgdGhpcyB0dXJucyBvdXQgdG8g
YmUgYSBwZXJmIGhpdCB3aXRoIHRvbyBtYW55IGluZGl2aWR1YWwgd2hpdGVzcGFjZSBpbmxpbmUg
aXRlbXMsIHdlIHNob3VsZCB0cmFuc2l0aW9uIHRoaXMgbG9naWMgdG8gbGluZSBicmVha2luZy4K
KyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdoaXRlc3BhY2VDb250ZW50
LT5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kV2hpdGVzcGFjZUl0ZW0o
Y3VycmVudFBvc2l0aW9uICsgaSwgMSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAg
ICAgICBhcHBlbmRXaGl0ZXNwYWNlSXRlbShjdXJyZW50UG9zaXRpb24sIHdoaXRlc3BhY2VDb250
ZW50LT5sZW5ndGgpOworICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uICs9IHdoaXRlc3BhY2VD
b250ZW50LT5sZW5ndGg7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAg
ICAgIGF1dG8gaGFzVHJhaWxpbmdTb2Z0SHlwaGVuID0gZmFsc2U7CisgICAgICAgIGF1dG8gaW5p
dGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjsKKyAgICAgICAgYXV0
byBpc0F0U29mdEh5cGhlbiA9IFsmXShhdXRvIHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1
cm4gdGV4dFtwb3NpdGlvbl0gPT0gc29mdEh5cGhlbjsKKyAgICAgICAgfTsKKyAgICAgICAgaWYg
KHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpOb25lKSB7CisgICAgICAgICAgICAvLyBMZXQn
cyBtZXJnZSBjYW5kaWRhdGUgSW5saW5lVGV4dEl0ZW1zIHNlcGFyYXRlZCBieSBzb2Z0IGh5cGhl
biB3aGVuIHRoZSBzdHlsZSBzYXlzIHNvLgorICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRQb3Np
dGlvbiA8IHRleHQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIG5vbldoaXRlU3Bh
Y2VMZW5ndGggPSBtb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24oY3VycmVudFBvc2l0aW9uLCBs
aW5lQnJlYWtJdGVyYXRvciwgc3R5bGUpOworICAgICAgICAgICAgICAgIEFTU0VSVChub25XaGl0
ZVNwYWNlTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24gKz0gbm9uV2hp
dGVTcGFjZUxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQXRTb2Z0SHlwaGVuKGN1cnJl
bnRQb3NpdGlvbiAtIDEpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF1dG8gbm9uV2hpdGVTcGFjZUxlbmd0
aCA9IG1vdmVUb05leHRCcmVha2FibGVQb3NpdGlvbihpbml0aWFsTm9uV2hpdGVzcGFjZVBvc2l0
aW9uLCBsaW5lQnJlYWtJdGVyYXRvciwgc3R5bGUpOworICAgICAgICAgICAgQVNTRVJUKG5vbldo
aXRlU3BhY2VMZW5ndGgpOworICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uICs9IG5vbldoaXRl
U3BhY2VMZW5ndGg7CisgICAgICAgICAgICBoYXNUcmFpbGluZ1NvZnRIeXBoZW4gPSBpc0F0U29m
dEh5cGhlbihjdXJyZW50UG9zaXRpb24gLSAxKTsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlQo
aW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiA8IGN1cnJlbnRQb3NpdGlvbik7CisgICAgICAg
IEFTU0VSVF9JTVBMSUVTKHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpOb25lLCAhaGFzVHJh
aWxpbmdTb2Z0SHlwaGVuKTsKKyAgICAgICAgYXV0byBsZW5ndGggPSBjdXJyZW50UG9zaXRpb24g
LSBpbml0aWFsTm9uV2hpdGVzcGFjZVBvc2l0aW9uOworICAgICAgICBpbmxpbmVDb250ZW50LmFw
cGVuZChJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlTm9uV2hpdGVzcGFjZUl0ZW0oaW5saW5lVGV4dEJv
eCwgaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiwgbGVuZ3RoLCBoYXNUcmFpbGluZ1NvZnRI
eXBoZW4sIGlubGluZUl0ZW1XaWR0aChpbml0aWFsTm9uV2hpdGVzcGFjZVBvc2l0aW9uLCBsZW5n
dGgpKSk7CisgICAgfQorfQorCitib29sIElubGluZVRleHRJdGVtOjppc0VtcHR5Q29udGVudCgp
IGNvbnN0Cit7CisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBjaGVjayBmb3IgbW9yZSB6ZXJvIHdp
ZHRoIGNvbnRlbnQgYW5kIG5vdCBqdXN0IFUrMjAwQi4KKyAgICByZXR1cm4gIW1fbGVuZ3RoIHx8
IChtX2xlbmd0aCA9PSAxICYmIGlubGluZVRleHRCb3goKS5jb250ZW50KClbc3RhcnQoKV0gPT0g
emVyb1dpZHRoU3BhY2UpOyAKK30KKworYm9vbCBJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2Vy
dmVTcGFjZXNBbmRUYWJzKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSkKK3sK
KyAgICBBU1NFUlQoaW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpOworICAgIHJldHVybiBU
ZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtLmxheW91
dEJveCgpKTsKK30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0u
aCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0
dGluZy9JbmxpbmVUZXh0SXRlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjUyZGM5OGRjZjA2YTE5YWEwNWZjNGFh
MGFhMjRkOTgzYTViN2NkMTUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uaApA
QCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxF
KExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVJdGVtLmgiCisj
aW5jbHVkZSAiTGF5b3V0SW5saW5lVGV4dEJveC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7Citu
YW1lc3BhY2UgTGF5b3V0IHsKKwordXNpbmcgSW5saW5lSXRlbXMgPSBWZWN0b3I8SW5saW5lSXRl
bT47CisKK2NsYXNzIElubGluZVRleHRJdGVtIDogcHVibGljIElubGluZUl0ZW0geworcHVibGlj
OgorICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUFuZEFwcGVuZFRleHRJdGVtcyhJbmxpbmVJdGVtcyYs
IGNvbnN0IElubGluZVRleHRCb3gmKTsKKworICAgIHVuc2lnbmVkIHN0YXJ0KCkgY29uc3QgeyBy
ZXR1cm4gbV9zdGFydE9yUG9zaXRpb247IH0KKyAgICB1bnNpZ25lZCBlbmQoKSBjb25zdCB7IHJl
dHVybiBzdGFydCgpICsgbGVuZ3RoKCk7IH0KKyAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdCB7
IHJldHVybiBtX2xlbmd0aDsgfQorCisgICAgYm9vbCBpc1doaXRlc3BhY2UoKSBjb25zdCB7IHJl
dHVybiBtX3RleHRJdGVtVHlwZSA9PSBUZXh0SXRlbVR5cGU6OldoaXRlc3BhY2U7IH0KKyAgICBi
b29sIGlzV29yZFNlcGFyYXRvcigpIGNvbnN0IHsgcmV0dXJuIG1faXNXb3JkU2VwYXJhdG9yOyB9
CisgICAgYm9vbCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4oKSBjb25zdCB7IHJldHVybiBtX2hhc1Ry
YWlsaW5nU29mdEh5cGhlbjsgfQorICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRo
KCkgY29uc3QgeyByZXR1cm4gbV9oYXNXaWR0aCA/IG1ha2VPcHRpb25hbChtX3dpZHRoKSA6IE9w
dGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsgfQorICAgIGJvb2wgaXNFbXB0eUNvbnRlbnQo
KSBjb25zdDsKKworICAgIGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRCb3goKSBjb25z
dCB7IHJldHVybiBkb3duY2FzdDxJbmxpbmVUZXh0Qm94PihsYXlvdXRCb3goKSk7IH0KKworICAg
IElubGluZVRleHRJdGVtIGxlZnQodW5zaWduZWQgbGVuZ3RoKSBjb25zdDsKKyAgICBJbmxpbmVU
ZXh0SXRlbSByaWdodCh1bnNpZ25lZCBsZW5ndGgpIGNvbnN0OworCisgICAgc3RhdGljIGJvb2wg
c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGNvbnN0IElubGluZVRleHRJdGVtJik7CisKK3By
aXZhdGU6CisgICAgdXNpbmcgSW5saW5lSXRlbTo6VGV4dEl0ZW1UeXBlOworCisgICAgSW5saW5l
VGV4dEl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBs
ZW5ndGgsIGJvb2wgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBib29sIGlzV29yZFNlcGFyYXRvciwg
T3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgsIFRleHRJdGVtVHlwZSk7CisgICAgZXhw
bGljaXQgSW5saW5lVGV4dEl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYpOworCisgICAgc3RhdGlj
IElubGluZVRleHRJdGVtIGNyZWF0ZVdoaXRlc3BhY2VJdGVtKGNvbnN0IElubGluZVRleHRCb3gm
LCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGlzV29yZFNlcGFyYXRvciwg
T3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgpOworICAgIHN0YXRpYyBJbmxpbmVUZXh0
SXRlbSBjcmVhdGVOb25XaGl0ZXNwYWNlSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWdu
ZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIE9w
dGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRoKTsKKyAgICBzdGF0aWMgSW5saW5lVGV4dEl0
ZW0gY3JlYXRlRW1wdHlJdGVtKGNvbnN0IElubGluZVRleHRCb3gmKTsKK307CisKK2lubGluZSBJ
bmxpbmVUZXh0SXRlbSBJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlV2hpdGVzcGFjZUl0ZW0oY29uc3Qg
SW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGxl
bmd0aCwgYm9vbCBpc1dvcmRTZXBhcmF0b3IsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdp
ZHRoKQoreworICAgIHJldHVybiB7IGlubGluZVRleHRCb3gsIHN0YXJ0LCBsZW5ndGgsIGZhbHNl
LCBpc1dvcmRTZXBhcmF0b3IsIHdpZHRoLCBUZXh0SXRlbVR5cGU6OldoaXRlc3BhY2UgfTsKK30K
KworaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpjcmVhdGVOb25XaGl0ZXNw
YWNlSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBzdGFy
dCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGhhc1RyYWlsaW5nU29mdEh5cGhlbiwgT3B0aW9uYWw8
SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgpCit7CisgICAgLy8gRklYTUU6IFVzZSB0aGUgZm9sbG93
aW5nIGxpc3Qgb2Ygbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBzZXQgdGhlICJpc1dvcmRT
ZXBhcmF0b3IiIGJpdDogbm9CcmVha1NwYWNlLCBldGhpb3BpY1dvcmRzcGFjZSwgYWVnZWFuV29y
ZFNlcGFyYXRvckxpbmUgYWVnZWFuV29yZFNlcGFyYXRvckRvdCB1Z2FyaXRpY1dvcmREaXZpZGVy
LgorICAgIHJldHVybiB7IGlubGluZVRleHRCb3gsIHN0YXJ0LCBsZW5ndGgsIGhhc1RyYWlsaW5n
U29mdEh5cGhlbiwgZmFsc2UsIHdpZHRoLCBUZXh0SXRlbVR5cGU6Ok5vbldoaXRlc3BhY2UgfTsK
K30KKworaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpjcmVhdGVFbXB0eUl0
ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCkKK3sKKyAgICByZXR1cm4gSW5s
aW5lVGV4dEl0ZW0geyBpbmxpbmVUZXh0Qm94IH07Cit9CisKK2lubGluZSBJbmxpbmVUZXh0SXRl
bTo6SW5saW5lVGV4dEl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5z
aWduZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4s
IGJvb2wgaXNXb3JkU2VwYXJhdG9yLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCwg
VGV4dEl0ZW1UeXBlIHRleHRJdGVtVHlwZSkKKyAgICA6IElubGluZUl0ZW0oaW5saW5lVGV4dEJv
eCwgVHlwZTo6VGV4dCkKK3sKKyAgICBtX3N0YXJ0T3JQb3NpdGlvbiA9IHN0YXJ0OworICAgIG1f
bGVuZ3RoID0gbGVuZ3RoOworICAgIG1faGFzV2lkdGggPSAhIXdpZHRoOworICAgIG1faGFzVHJh
aWxpbmdTb2Z0SHlwaGVuID0gaGFzVHJhaWxpbmdTb2Z0SHlwaGVuOworICAgIG1faXNXb3JkU2Vw
YXJhdG9yID0gaXNXb3JkU2VwYXJhdG9yOworICAgIG1fd2lkdGggPSB3aWR0aC52YWx1ZU9yKDAp
OworICAgIG1fdGV4dEl0ZW1UeXBlID0gdGV4dEl0ZW1UeXBlOworfQorCitpbmxpbmUgSW5saW5l
VGV4dEl0ZW06OklubGluZVRleHRJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRC
b3gpCisgICAgOiBJbmxpbmVJdGVtKGlubGluZVRleHRCb3gsIFR5cGU6OlRleHQpCit7Cit9CisK
K2lubGluZSBJbmxpbmVUZXh0SXRlbSBJbmxpbmVUZXh0SXRlbTo6bGVmdCh1bnNpZ25lZCBsZW5n
dGgpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlQobGVuZ3RoIDw9IHRoaXMtPmxlbmd0aCgp
KTsKKyAgICBBU1NFUlQobV90ZXh0SXRlbVR5cGUgIT0gVGV4dEl0ZW1UeXBlOjpVbmRlZmluZWQp
OworICAgIEFTU0VSVChsZW5ndGgpOworICAgIHJldHVybiB7IGlubGluZVRleHRCb3goKSwgc3Rh
cnQoKSwgbGVuZ3RoLCBmYWxzZSwgaXNXb3JkU2VwYXJhdG9yKCksIFdURjo6bnVsbG9wdCwgbV90
ZXh0SXRlbVR5cGUgfTsKK30KKworaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVt
OjpyaWdodCh1bnNpZ25lZCBsZW5ndGgpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlQobGVu
Z3RoIDw9IHRoaXMtPmxlbmd0aCgpKTsKKyAgICBBU1NFUlQobV90ZXh0SXRlbVR5cGUgIT0gVGV4
dEl0ZW1UeXBlOjpVbmRlZmluZWQpOworICAgIEFTU0VSVChsZW5ndGgpOworICAgIHJldHVybiB7
IGlubGluZVRleHRCb3goKSwgZW5kKCkgLSBsZW5ndGgsIGxlbmd0aCwgaGFzVHJhaWxpbmdTb2Z0
SHlwaGVuKCksIGlzV29yZFNlcGFyYXRvcigpLCBXVEY6Om51bGxvcHQsIG1fdGV4dEl0ZW1UeXBl
IH07Cit9CisKK30KK30KKworU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19JTkxJTkVfSVRFTShJbmxp
bmVUZXh0SXRlbSwgaXNUZXh0KCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0
aWwuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVm
b3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjdlNTc1YmNlNzI4NTNhOGM5
ZGJmMzYyZjRmYzliMTk5NzZhYjI1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvdGV4dC9UZXh0VXRp
bC5jcHAKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
KyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisg
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiVGV4dFV0aWwuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19D
T05URVhUKQorCisjaW5jbHVkZSAiQnJlYWtMaW5lcy5oIgorI2luY2x1ZGUgIkZvbnRDYXNjYWRl
LmgiCisjaW5jbHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIKKyNpbmNsdWRlICJMYXlvdXRJbmxpbmVU
ZXh0Qm94LmgiCisjaW5jbHVkZSAiUmVuZGVyQm94LmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGUu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0lubGluZUxh
eW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0
SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpCit7CisgICAgcmV0dXJu
IFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwg
aW5saW5lVGV4dEl0ZW0uZW5kKCksIGNvbnRlbnRMb2dpY2FsTGVmdCk7Cit9CisKK0lubGluZUxh
eW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0
SXRlbSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91dFVuaXQgY29udGVu
dExvZ2ljYWxMZWZ0KQoreworICAgIFJFTEVBU0VfQVNTRVJUKGZyb20gPj0gaW5saW5lVGV4dEl0
ZW0uc3RhcnQoKSk7CisgICAgUkVMRUFTRV9BU1NFUlQodG8gPD0gaW5saW5lVGV4dEl0ZW0uZW5k
KCkpOworICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4
dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpIHsKKyAg
ICAgICAgYXV0byBzcGFjZVdpZHRoID0gaW5saW5lVGV4dEl0ZW0uc3R5bGUoKS5mb250Q2FzY2Fk
ZSgpLnNwYWNlV2lkdGgoKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6aXNuYW4oc3BhY2VXaWR0aCkg
PyAwLjBmIDogc3RkOjppc2luZihzcGFjZVdpZHRoKSA/IG1heElubGluZUxheW91dFVuaXQoKSA6
IHNwYWNlV2lkdGg7CisgICAgfQorICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4
dEl0ZW0uaW5saW5lVGV4dEJveCgpLCBmcm9tLCB0bywgY29udGVudExvZ2ljYWxMZWZ0KTsKK30K
KworSW5saW5lTGF5b3V0VW5pdCBUZXh0VXRpbDo6d2lkdGgoY29uc3QgSW5saW5lVGV4dEJveCYg
aW5saW5lVGV4dEJveCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91dFVu
aXQgY29udGVudExvZ2ljYWxMZWZ0KQoreworICAgIGlmIChmcm9tID09IHRvKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIGF1dG8mIHN0eWxlID0gaW5saW5lVGV4dEJveC5zdHlsZSgpOworICAg
IGF1dG8mIGZvbnQgPSBzdHlsZS5mb250Q2FzY2FkZSgpOworICAgIGF1dG8gdGV4dCA9IGlubGlu
ZVRleHRCb3guY29udGVudCgpOworICAgIEFTU0VSVCh0byA8PSB0ZXh0Lmxlbmd0aCgpKTsKKyAg
ICBhdXRvIGhhc0tlcm5pbmdPckxpZ2F0dXJlcyA9IGZvbnQuZW5hYmxlS2VybmluZygpIHx8IGZv
bnQucmVxdWlyZXNTaGFwaW5nKCk7CisgICAgYXV0byBtZWFzdXJlV2l0aEVuZFNwYWNlID0gaGFz
S2VybmluZ09yTGlnYXR1cmVzICYmIHRvIDwgdGV4dC5sZW5ndGgoKSAmJiB0ZXh0W3RvXSA9PSAn
ICc7CisgICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2UpCisgICAgICAgICsrdG87CisgICAgZmxv
YXQgd2lkdGggPSAwOworICAgIGlmIChpbmxpbmVUZXh0Qm94LmNhblVzZVNpbXBsaWZpZWRDb250
ZW50TWVhc3VyaW5nKCkpCisgICAgICAgIHdpZHRoID0gZm9udC53aWR0aEZvclNpbXBsZVRleHQo
U3RyaW5nVmlldyh0ZXh0KS5zdWJzdHJpbmcoZnJvbSwgdG8gLSBmcm9tKSk7CisgICAgZWxzZSB7
CisgICAgICAgIGF1dG8gdGFiV2lkdGggPSBzdHlsZS5jb2xsYXBzZVdoaXRlU3BhY2UoKSA/IFRh
YlNpemUoMCkgOiBzdHlsZS50YWJTaXplKCk7CisgICAgICAgIFdlYkNvcmU6OlRleHRSdW4gcnVu
KFN0cmluZ1ZpZXcodGV4dCkuc3Vic3RyaW5nKGZyb20sIHRvIC0gZnJvbSksIGNvbnRlbnRMb2dp
Y2FsTGVmdCk7CisgICAgICAgIGlmICh0YWJXaWR0aCkKKyAgICAgICAgICAgIHJ1bi5zZXRUYWJT
aXplKHRydWUsIHRhYldpZHRoKTsKKyAgICAgICAgd2lkdGggPSBmb250LndpZHRoKHJ1bik7Cisg
ICAgfQorCisgICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2UpCisgICAgICAgIHdpZHRoIC09IChm
b250LnNwYWNlV2lkdGgoKSArIGZvbnQud29yZFNwYWNpbmcoKSk7CisKKyAgICByZXR1cm4gc3Rk
Ojppc25hbih3aWR0aCkgPyAwLjBmIDogc3RkOjppc2luZih3aWR0aCkgPyBtYXhJbmxpbmVMYXlv
dXRVbml0KCkgOiB3aWR0aDsKK30KKworVGV4dFV0aWw6OlNwbGl0RGF0YSBUZXh0VXRpbDo6c3Bs
aXQoY29uc3QgSW5saW5lVGV4dEl0ZW0mIGlubGluZVRleHRJdGVtLCBJbmxpbmVMYXlvdXRVbml0
IHRleHRXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCwgSW5saW5lTGF5b3V0
VW5pdCBjb250ZW50TG9naWNhbExlZnQpCit7CisgICAgQVNTRVJUKGF2YWlsYWJsZVdpZHRoID49
IDApOworICAgIGF1dG8gc3RhcnRQb3NpdGlvbiA9IGlubGluZVRleHRJdGVtLnN0YXJ0KCk7Cisg
ICAgYXV0byBsZW5ndGggPSBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKTsKKyAgICBBU1NFUlQobGVu
Z3RoKTsKKworICAgIGF1dG8gbGVmdCA9IHN0YXJ0UG9zaXRpb247CisgICAgLy8gUGF0aG9sb2dp
Y2FsIGNhc2Ugb2YgKGV4dHJlbWVseSlsb25nIHN0cmluZyBhbmQgbmFycm93IGxpbmVzLgorICAg
IC8vIEFkanVzdCB0aGUgcmFuZ2Ugc28gdGhhdCB3ZSBjYW4gcGljayBhIHJlYXNvbmFibGUgbWlk
cG9pbnQuCisgICAgSW5saW5lTGF5b3V0VW5pdCBhdmVyYWdlQ2hhcmFjdGVyV2lkdGggPSB0ZXh0
V2lkdGggLyBsZW5ndGg7CisgICAgdW5zaWduZWQgb2Zmc2V0ID0gdG9MYXlvdXRVbml0KDIgKiBh
dmFpbGFibGVXaWR0aCAvIGF2ZXJhZ2VDaGFyYWN0ZXJXaWR0aCkudG9VbnNpZ25lZCgpOworICAg
IGF1dG8gcmlnaHQgPSBzdGQ6Om1pbjx1bnNpZ25lZD4obGVmdCArIG9mZnNldCwgKHN0YXJ0UG9z
aXRpb24gKyBsZW5ndGggLSAxKSk7CisgICAgLy8gUHJlc2VydmUgdGhlIGxlZnQgd2lkdGggZm9y
IHRoZSBmaW5hbCBzcGxpdCBwb3NpdGlvbiBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gcmVtZWFz
dXJlIHRoZSBsZWZ0IHNpZGUgYWdhaW4uCisgICAgSW5saW5lTGF5b3V0VW5pdCBsZWZ0U2lkZVdp
ZHRoID0gMDsKKyAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7CisgICAgICAgIGF1dG8gbWlkZGxl
ID0gKGxlZnQgKyByaWdodCkgLyAyOworICAgICAgICBhdXRvIHdpZHRoID0gVGV4dFV0aWw6Ondp
ZHRoKGlubGluZVRleHRJdGVtLCBzdGFydFBvc2l0aW9uLCBtaWRkbGUgKyAxLCBjb250ZW50TG9n
aWNhbExlZnQpOworICAgICAgICBpZiAod2lkdGggPCBhdmFpbGFibGVXaWR0aCkgeworICAgICAg
ICAgICAgbGVmdCA9IG1pZGRsZSArIDE7CisgICAgICAgICAgICBsZWZ0U2lkZVdpZHRoID0gd2lk
dGg7CisgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPiBhdmFpbGFibGVXaWR0aCkKKyAgICAgICAg
ICAgIHJpZ2h0ID0gbWlkZGxlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJpZ2h0ID0g
bWlkZGxlICsgMTsKKyAgICAgICAgICAgIGxlZnRTaWRlV2lkdGggPSB3aWR0aDsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB7IHN0YXJ0UG9zaXRpb24s
IHJpZ2h0IC0gc3RhcnRQb3NpdGlvbiwgbGVmdFNpZGVXaWR0aCB9OworfQorCit1bnNpZ25lZCBU
ZXh0VXRpbDo6ZmluZE5leHRCcmVha2FibGVQb3NpdGlvbihMYXp5TGluZUJyZWFrSXRlcmF0b3Im
IGxpbmVCcmVha0l0ZXJhdG9yLCB1bnNpZ25lZCBzdGFydFBvc2l0aW9uLCBjb25zdCBSZW5kZXJT
dHlsZSYgc3R5bGUpCit7CisgICAgYXV0byBrZWVwQWxsV29yZHNGb3JDSksgPSBzdHlsZS53b3Jk
QnJlYWsoKSA9PSBXb3JkQnJlYWs6OktlZXBBbGw7CisgICAgYXV0byBicmVha05CU1AgPSBzdHls
ZS5hdXRvV3JhcCgpICYmIHN0eWxlLm5ic3BNb2RlKCkgPT0gTkJTUE1vZGU6OlNwYWNlOworCisg
ICAgaWYgKGtlZXBBbGxXb3Jkc0ZvckNKSykgeworICAgICAgICBpZiAoYnJlYWtOQlNQKQorICAg
ICAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbktlZXBpbmdBbGxXb3JkcyhsaW5l
QnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7CisgICAgICAgIHJldHVybiBuZXh0QnJlYWth
YmxlUG9zaXRpb25LZWVwaW5nQWxsV29yZHNJZ25vcmluZ05CU1AobGluZUJyZWFrSXRlcmF0b3Is
IHN0YXJ0UG9zaXRpb24pOworICAgIH0KKworICAgIGlmIChsaW5lQnJlYWtJdGVyYXRvci5tb2Rl
KCkgPT0gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpEZWZhdWx0KSB7CisgICAgICAgIGlmIChicmVh
a05CU1ApCisgICAgICAgICAgICByZXR1cm4gV2ViQ29yZTo6bmV4dEJyZWFrYWJsZVBvc2l0aW9u
KGxpbmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9uKTsKKyAgICAgICAgcmV0dXJuIG5leHRC
cmVha2FibGVQb3NpdGlvbklnbm9yaW5nTkJTUChsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3Np
dGlvbik7CisgICAgfQorCisgICAgaWYgKGJyZWFrTkJTUCkKKyAgICAgICAgcmV0dXJuIG5leHRC
cmVha2FibGVQb3NpdGlvbldpdGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQ
b3NpdGlvbik7CisgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbklnbm9yaW5nTkJTUFdp
dGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Cit9CisKK2Jv
b2wgVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhjb25zdCBCb3gmIGxheW91
dEJveCkKK3sKKyAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXRleHQtMy8jd2hpdGUt
c3BhY2UtcHJvcGVydHkKKyAgICBhdXRvIHdoaXRlc3BhY2UgPSBsYXlvdXRCb3guc3R5bGUoKS53
aGl0ZVNwYWNlKCk7CisgICAgcmV0dXJuIHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlIHx8
IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlV3JhcCB8fCB3aGl0ZXNwYWNlID09IFdoaXRl
U3BhY2U6OkJyZWFrU3BhY2VzOworfQorCitib29sIFRleHRVdGlsOjpzaG91bGRQcmVzZXJ2ZU5l
d2xpbmUoY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgYXV0byB3aGl0ZXNwYWNlID0gbGF5
b3V0Qm94LnN0eWxlKCkud2hpdGVTcGFjZSgpOworICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9U
Ui9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eQorICAgIHJldHVybiB3aGl0ZXNwYWNl
ID09IFdoaXRlU3BhY2U6OlByZSB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZVdyYXAg
fHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpCcmVha1NwYWNlcyB8fCB3aGl0ZXNwYWNlID09
IFdoaXRlU3BhY2U6OlByZUxpbmU7IAorfQorCitMaW5lQnJlYWtJdGVyYXRvck1vZGUgVGV4dFV0
aWw6OmxpbmVCcmVha0l0ZXJhdG9yTW9kZShMaW5lQnJlYWsgbGluZUJyZWFrKQoreworICAgIHN3
aXRjaCAobGluZUJyZWFrKSB7CisgICAgY2FzZSBMaW5lQnJlYWs6OkF1dG86CisgICAgY2FzZSBM
aW5lQnJlYWs6OkFmdGVyV2hpdGVTcGFjZToKKyAgICBjYXNlIExpbmVCcmVhazo6QW55d2hlcmU6
CisgICAgICAgIHJldHVybiBMaW5lQnJlYWtJdGVyYXRvck1vZGU6OkRlZmF1bHQ7CisgICAgY2Fz
ZSBMaW5lQnJlYWs6Okxvb3NlOgorICAgICAgICByZXR1cm4gTGluZUJyZWFrSXRlcmF0b3JNb2Rl
OjpMb29zZTsKKyAgICBjYXNlIExpbmVCcmVhazo6Tm9ybWFsOgorICAgICAgICByZXR1cm4gTGlu
ZUJyZWFrSXRlcmF0b3JNb2RlOjpOb3JtYWw7CisgICAgY2FzZSBMaW5lQnJlYWs6OlN0cmljdDoK
KyAgICAgICAgcmV0dXJuIExpbmVCcmVha0l0ZXJhdG9yTW9kZTo6U3RyaWN0OworICAgIH0KKyAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gTGluZUJyZWFrSXRlcmF0b3JNb2Rl
OjpEZWZhdWx0OworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRVdGls
LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1h
dHRpbmcvdGV4dC9UZXh0VXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFmNTg0ZmE3OTgxYmQ0MzgzY2Y0M2Uy
M2E0YmZhZWI4MjBjZTMyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvdGV4dC9UZXh0VXRpbC5oCkBA
IC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShM
QVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiSW5saW5lSXRlbS5oIgorI2lu
Y2x1ZGUgIkxheW91dFVuaXRzLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvVGV4dEJyZWFrSXRlcmF0
b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSZW5kZXJTdHlsZTsKKworbmFt
ZXNwYWNlIExheW91dCB7CisKK2NsYXNzIElubGluZVRleHRCb3g7CitjbGFzcyBJbmxpbmVUZXh0
SXRlbTsKKworY2xhc3MgVGV4dFV0aWwgeworcHVibGljOgorICAgIHN0YXRpYyBJbmxpbmVMYXlv
dXRVbml0IHdpZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBjb250
ZW50TG9naWNhbExlZnQpOworICAgIHN0YXRpYyBJbmxpbmVMYXlvdXRVbml0IHdpZHRoKGNvbnN0
IElubGluZVRleHRJdGVtJiwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91
dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KTsKKyAgICBzdGF0aWMgSW5saW5lTGF5b3V0VW5pdCB3
aWR0aChjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElu
bGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KTsKKworICAgIHN0cnVjdCBTcGxpdERh
dGEgeworICAgICAgICB1bnNpZ25lZCBzdGFydCB7IDAgfTsKKyAgICAgICAgdW5zaWduZWQgbGVu
Z3RoIHsgMCB9OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCB7IDAgfTsK
KyAgICB9OworICAgIHN0YXRpYyBTcGxpdERhdGEgc3BsaXQoY29uc3QgSW5saW5lVGV4dEl0ZW0m
LCBJbmxpbmVMYXlvdXRVbml0IHRleHRXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVX
aWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpOworCisgICAgc3RhdGlj
IHVuc2lnbmVkIGZpbmROZXh0QnJlYWthYmxlUG9zaXRpb24oTGF6eUxpbmVCcmVha0l0ZXJhdG9y
JiwgdW5zaWduZWQgc3RhcnRQb3NpdGlvbiwgY29uc3QgUmVuZGVyU3R5bGUmKTsKKyAgICBzdGF0
aWMgTGluZUJyZWFrSXRlcmF0b3JNb2RlIGxpbmVCcmVha0l0ZXJhdG9yTW9kZShMaW5lQnJlYWsp
OworCisgICAgc3RhdGljIGJvb2wgc2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGNvbnN0IEJv
eCYpOworICAgIHN0YXRpYyBib29sIHNob3VsZFByZXNlcnZlTmV3bGluZShjb25zdCBCb3gmKTsK
K307CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0
dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45MDJhZjdjNWVkODhk
NTA0Y2FjNDI1YTEzNTIxMDA4YjZlNThiOWFjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3Jt
YXR0aW5nQ29udGV4dC5jcHAKQEAgLTAsMCArMSw1MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJCbG9ja0Zvcm1h
dHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbmxp
bmVGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbnZhbGlkYXRpb25TdGF0ZS5oIgorI2lu
Y2x1ZGUgIkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5j
bHVkZSAiTGF5b3V0Q2hpbGRJdGVyYXRvci5oIgorI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIK
KyNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiVGFi
bGVGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworV1RGX01BS0VfSVNP
X0FMTE9DQVRFRF9JTVBMKFRhYmxlRm9ybWF0dGluZ0NvbnRleHQpOworCisvLyBodHRwczovL3d3
dy53My5vcmcvVFIvY3NzLXRhYmxlcy0zLyN0YWJsZS1sYXlvdXQtYWxnb3JpdGhtCitUYWJsZUZv
cm1hdHRpbmdDb250ZXh0OjpUYWJsZUZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJv
eCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBUYWJsZUZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGlu
Z1N0YXRlKQorICAgIDogRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHRSb290LCBm
b3JtYXR0aW5nU3RhdGUpCit7Cit9CisKK3ZvaWQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6bGF5
b3V0SW5GbG93Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9y
SW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgYXV0byBhdmFpbGFibGVIb3Jpem9u
dGFsU3BhY2UgPSBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxXaWR0aDsKKyAgICBhdXRv
IGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UgPSBjb25zdHJhaW50cy52ZXJ0aWNhbC5sb2dpY2FsSGVp
Z2h0OworICAgIC8vIDEuIENvbXB1dGUgd2lkdGggYW5kIGhlaWdodCBmb3IgdGhlIGdyaWQuCisg
ICAgY29tcHV0ZUFuZERpc3RyaWJ1dGVFeHRyYVNwYWNlKGF2YWlsYWJsZUhvcml6b250YWxTcGFj
ZSwgYXZhaWxhYmxlVmVydGljYWxTcGFjZSk7CisgICAgLy8gMi4gRmluYWxpemUgY2VsbHMuCisg
ICAgc2V0VXNlZEdlb21ldHJ5Rm9yQ2VsbHMoYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKKyAg
ICAvLyAzLiBGaW5hbGl6ZSByb3dzLgorICAgIHNldFVzZWRHZW9tZXRyeUZvclJvd3MoYXZhaWxh
YmxlSG9yaXpvbnRhbFNwYWNlKTsKKyAgICAvLyA0LiBGaW5hbGl6ZSBzZWN0aW9ucy4KKyAgICBz
ZXRVc2VkR2VvbWV0cnlGb3JTZWN0aW9ucyhjb25zdHJhaW50cyk7Cit9CisKK0xheW91dFVuaXQg
VGFibGVGb3JtYXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdAoreworICAg
IC8vIFRhYmxlIGhhcyB0byBoYXZlIHNvbWUgc2VjdGlvbiBjb250ZW50LCBhdCBsZWFzdCBvbmUg
PHRib2R5Pi4KKyAgICBhdXRvIHRvcCA9IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KGdlb21l
dHJ5Rm9yQm94KCpyb290KCkuZmlyc3RJbkZsb3dDaGlsZCgpKSkudG9wKCk7CisgICAgYXV0byBi
b3R0b20gPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9tZXRyeUZvckJveCgqcm9vdCgp
Lmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7CisgICAgcmV0dXJuIGJvdHRvbSAtIHRvcDsK
K30KKwordm9pZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpzZXRVc2VkR2VvbWV0cnlGb3JDZWxs
cyhMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSkKK3sKKyAgICBhdXRvJiBncmlk
ID0gZm9ybWF0dGluZ1N0YXRlKCkudGFibGVHcmlkKCk7CisgICAgYXV0byYgY29sdW1uTGlzdCA9
IGdyaWQuY29sdW1ucygpLmxpc3QoKTsKKyAgICBhdXRvJiByb3dMaXN0ID0gZ3JpZC5yb3dzKCku
bGlzdCgpOworICAgIC8vIEZpbmFsIHRhYmxlIGNlbGwgbGF5b3V0LiBBdCB0aGlzIHBvaW50IGFs
bCBwZXJjZW50YWdlIHZhbHVlcyBjYW4gYmUgcmVzb2x2ZWQuCisgICAgYXV0byBzZWN0aW9uT2Zm
c2V0ID0gTGF5b3V0VW5pdCB7IH07CisgICAgYXV0byogY3VycmVudFNlY3Rpb24gPSAmcm93TGlz
dC5maXJzdCgpLmJveCgpLnBhcmVudCgpOworICAgIGZvciAoYXV0byYgY2VsbCA6IGdyaWQuY2Vs
bHMoKSkgeworICAgICAgICBhdXRvJiBjZWxsQm94ID0gY2VsbC0+Ym94KCk7CisgICAgICAgIGF1
dG8mIGNlbGxCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGNlbGxC
b3gpOworICAgICAgICBhdXRvJiBzZWN0aW9uID0gcm93TGlzdFtjZWxsLT5zdGFydFJvdygpXS5i
b3goKS5wYXJlbnQoKTsKKyAgICAgICAgaWYgKCZzZWN0aW9uICE9IGN1cnJlbnRTZWN0aW9uKSB7
CisgICAgICAgICAgICBjdXJyZW50U2VjdGlvbiA9ICZzZWN0aW9uOworICAgICAgICAgICAgLy8g
V2hpbGUgdGhlIGdyaWQgaXMgYSBjb250aW51b3VzIGZsb3cgb2Ygcm93cywgaW4gdGhlIGRpc3Bs
YXkgdHJlZSB0aGV5IGFyZSByZWxhdGl2ZSB0byB0aGVpciBzZWN0aW9ucy4KKyAgICAgICAgICAg
IHNlY3Rpb25PZmZzZXQgPSByb3dMaXN0W2NlbGwtPnN0YXJ0Um93KCldLmxvZ2ljYWxUb3AoKTsK
KyAgICAgICAgfQorICAgICAgICBjZWxsQm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcChyb3dMaXN0
W2NlbGwtPnN0YXJ0Um93KCldLmxvZ2ljYWxUb3AoKSAtIHNlY3Rpb25PZmZzZXQpOworICAgICAg
ICBjZWxsQm94R2VvbWV0cnkuc2V0TG9naWNhbExlZnQoY29sdW1uTGlzdFtjZWxsLT5zdGFydENv
bHVtbigpXS5sb2dpY2FsTGVmdCgpKTsKKyAgICAgICAgYXV0byBhdmFpbGFibGVWZXJ0aWNhbFNw
YWNlID0gcm93TGlzdFtjZWxsLT5zdGFydFJvdygpXS5sb2dpY2FsSGVpZ2h0KCk7CisgICAgICAg
IGZvciAoc2l6ZV90IHJvd0luZGV4ID0gY2VsbC0+c3RhcnRSb3coKSArIDE7IHJvd0luZGV4IDwg
Y2VsbC0+ZW5kUm93KCk7ICsrcm93SW5kZXgpCisgICAgICAgICAgICBhdmFpbGFibGVWZXJ0aWNh
bFNwYWNlICs9IHJvd0xpc3Rbcm93SW5kZXhdLmxvZ2ljYWxIZWlnaHQoKTsKKyAgICAgICAgYXZh
aWxhYmxlVmVydGljYWxTcGFjZSArPSAoY2VsbC0+cm93U3BhbigpIC0gMSkgKiBncmlkLnZlcnRp
Y2FsU3BhY2luZygpOworICAgICAgICBsYXlvdXRDZWxsKCpjZWxsLCBhdmFpbGFibGVIb3Jpem9u
dGFsU3BhY2UsIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpOworICAgICAgICAvLyBGSVhNRTogRmlu
ZCBvdXQgaWYgaXQgaXMgb2sgdG8gdXNlIHRoZSByZWd1bGFyIHBhZGRpbmcgaGVyZSB0byBhbGln
biB0aGUgY29udGVudCBib3ggaW5zaWRlIGEgdGFsbCBjZWxsIG9yIHdlIG5lZWQgdG8gCisgICAg
ICAgIC8vIHVzZSBzb21lIGtpbmQgb2YgaW50cmluc2ljIHBhZGRpbmcgc2ltaWxhciB0byBSZW5k
ZXJUYWJsZUNlbGwuCisgICAgICAgIGF1dG8gcGFkZGluZ1RvcCA9IGNlbGxCb3hHZW9tZXRyeS5w
YWRkaW5nVG9wKCkudmFsdWVPcihMYXlvdXRVbml0IHsgfSk7CisgICAgICAgIGF1dG8gcGFkZGlu
Z0JvdHRvbSA9IGNlbGxCb3hHZW9tZXRyeS5wYWRkaW5nQm90dG9tKCkudmFsdWVPcihMYXlvdXRV
bml0IHsgfSk7CisgICAgICAgIGF1dG8gaW50cmluc2ljUGFkZGluZ1RvcCA9IExheW91dFVuaXQg
eyB9OworICAgICAgICBhdXRvIGludHJpbnNpY1BhZGRpbmdCb3R0b20gPSBMYXlvdXRVbml0IHsg
fTsKKworICAgICAgICBzd2l0Y2ggKGNlbGxCb3guc3R5bGUoKS52ZXJ0aWNhbEFsaWduKCkpIHsK
KyAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6IHsKKyAgICAgICAgICAgIGF1dG8g
aW50cmluc2ljVmVydGljYWxQYWRkaW5nID0gc3RkOjptYXgoMF9sdSwgYXZhaWxhYmxlVmVydGlj
YWxTcGFjZSAtIGNlbGxCb3hHZW9tZXRyeS52ZXJ0aWNhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmco
KSAtIGNlbGxCb3hHZW9tZXRyeS5jb250ZW50Qm94SGVpZ2h0KCkpOworICAgICAgICAgICAgaW50
cmluc2ljUGFkZGluZ1RvcCA9IGludHJpbnNpY1ZlcnRpY2FsUGFkZGluZyAvIDI7CisgICAgICAg
ICAgICBpbnRyaW5zaWNQYWRkaW5nQm90dG9tID0gaW50cmluc2ljVmVydGljYWxQYWRkaW5nIC8g
MjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVmVydGljYWxB
bGlnbjo6QmFzZWxpbmU6IHsKKyAgICAgICAgICAgIGF1dG8gcm93QmFzZWxpbmUgPSBMYXlvdXRV
bml0IHsgcm93TGlzdFtjZWxsLT5zdGFydFJvdygpXS5iYXNlbGluZSgpIH07CisgICAgICAgICAg
ICBhdXRvIGNlbGxCYXNlbGluZSA9IExheW91dFVuaXQgeyBjZWxsLT5iYXNlbGluZSgpIH07Cisg
ICAgICAgICAgICBpbnRyaW5zaWNQYWRkaW5nVG9wID0gc3RkOjptYXgoMF9sdSwgcm93QmFzZWxp
bmUgLSBjZWxsQmFzZWxpbmUgLSBjZWxsQm94R2VvbWV0cnkuYm9yZGVyVG9wKCkpOworICAgICAg
ICAgICAgaW50cmluc2ljUGFkZGluZ0JvdHRvbSA9IHN0ZDo6bWF4KDBfbHUsIGF2YWlsYWJsZVZl
cnRpY2FsU3BhY2UgLSBjZWxsQm94R2VvbWV0cnkudmVydGljYWxNYXJnaW5Cb3JkZXJBbmRQYWRk
aW5nKCkgLSBpbnRyaW5zaWNQYWRkaW5nVG9wIC0gY2VsbEJveEdlb21ldHJ5LmNvbnRlbnRCb3hI
ZWlnaHQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0
OgorICAgICAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpbnRyaW5zaWNQYWRkaW5nVG9wICYmIGNl
bGxCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpIHsKKyAgICAgICAgICAgIGF1dG8gYWRq
dXN0Q2VsbENvbnRlbnRXaXRoSW5zdHJpbnNpY1BhZGRpbmdCZWZvcmUgPSBbJl0geworICAgICAg
ICAgICAgICAgIC8vIENoaWxkIGJveGVzIChhbmQgcnVucykgYXJlIGFsd2F5cyBpbiB0aGUgY29v
cmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBib3JkZXIgYm94LgorICAg
ICAgICAgICAgICAgIC8vIFRoZSBjb250ZW50IGJveCAod2hlcmUgdGhlIGNoaWxkIGNvbnRlbnQg
bGl2ZXMpIGlzIGluc2lkZSB0aGUgcGFkZGluZyBib3gsIHdoaWNoIGlzIGluc2lkZSB0aGUgYm9y
ZGVyIGJveC4KKyAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBjb21wdXRlIHRoZSBjaGls
ZCBib3ggdG9wL2xlZnQgcG9zaXRpb24sIHdlIG5lZWQgdG8ga25vdyBib3RoIHRoZSBwYWRkaW5n
IGFuZCB0aGUgYm9yZGVyIG9mZnNldHMuICAKKyAgICAgICAgICAgICAgICAvLyBOb3JtYWxseSBi
eSB0aGUgdGltZSB3ZSBzdGFydCBwb3NpdGlvbmluZyB0aGUgY2hpbGQgY29udGVudCwgd2UgYWxy
ZWFkeSBoYXZlIGNvbXB1dGVkIGJvcmRlcnMgYW5kIHBhZGRpbmcgZm9yIHRoZSBjb250YWluaW5n
IGJsb2NrLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZGlmZmVyZW50IHdpdGggdGFibGUg
Y2VsbHMgd2hlcmUgdGhlIGZpbmFsIHBhZGRpbmcgb2Zmc2V0IGRlcGVuZHMgb24gdGhlIGNvbnRl
bnQgaGVpZ2h0IGFzIHdlIHVzZQorICAgICAgICAgICAgICAgIC8vIHRoZSBwYWRkaW5nIGJveCB0
byB2ZXJ0aWNhbGx5IGFsaWduIHRoZSB0YWJsZSBjZWxsIGNvbnRlbnQuCisgICAgICAgICAgICAg
ICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZEZvcm1h
dHRpbmdTdGF0ZShjZWxsQm94KTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8qIGNoaWxkID0g
Y2VsbEJveC5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGls
ZC0+bmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKGNoaWxkLT5pc0lubGluZVRleHRCb3goKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnko
KmNoaWxkKS5tb3ZlVmVydGljYWxseShpbnRyaW5zaWNQYWRkaW5nVG9wKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNlbGxCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGlubGluZUZvcm1h
dHRpbmdTdGF0ZWUgPSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkSW5saW5lRm9ybWF0dGluZ1N0
YXRlKGNlbGxCb3gpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHJ1biA6IGlubGlu
ZUZvcm1hdHRpbmdTdGF0ZWUubGluZVJ1bnMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1
bi5tb3ZlVmVydGljYWxseShpbnRyaW5zaWNQYWRkaW5nVG9wKTsKKyAgICAgICAgICAgICAgICAg
ICAgZm9yIChhdXRvJiBsaW5lIDogaW5saW5lRm9ybWF0dGluZ1N0YXRlZS5saW5lcygpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgbGluZS5tb3ZlVmVydGljYWxseShpbnRyaW5zaWNQYWRkaW5n
VG9wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYWRq
dXN0Q2VsbENvbnRlbnRXaXRoSW5zdHJpbnNpY1BhZGRpbmdCZWZvcmUoKTsKKyAgICAgICAgfQor
ICAgICAgICBjZWxsQm94R2VvbWV0cnkuc2V0VmVydGljYWxQYWRkaW5nKHsgcGFkZGluZ1RvcCAr
IGludHJpbnNpY1BhZGRpbmdUb3AsIHBhZGRpbmdCb3R0b20gKyBpbnRyaW5zaWNQYWRkaW5nQm90
dG9tIH0pOworICAgIH0KK30KKwordm9pZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpzZXRVc2Vk
R2VvbWV0cnlGb3JSb3dzKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKQorewor
ICAgIGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsKKyAgICBhdXRv
JiByb3dzID0gZ3JpZC5yb3dzKCkubGlzdCgpOworCisgICAgYXV0byByb3dMb2dpY2FsVG9wID0g
Z3JpZC52ZXJ0aWNhbFNwYWNpbmcoKTsKKyAgICBjb25zdCBDb250YWluZXJCb3gqIHByZXZpb3Vz
Um93ID0gbnVsbHB0cjsKKyAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwg
cm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAgICAgICAgYXV0byYgcm93ID0gcm93c1tyb3dJ
bmRleF07CisgICAgICAgIGF1dG8mIHJvd0JveCA9IHJvdy5ib3goKTsKKyAgICAgICAgYXV0byYg
cm93Qm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShyb3dCb3gpOwor
CisgICAgICAgIHJvd0JveEdlb21ldHJ5LnNldFBhZGRpbmcoZ2VvbWV0cnkoKS5jb21wdXRlZFBh
ZGRpbmcocm93Qm94LCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpKTsKKyAgICAgICAgLy8gSW50
ZXJuYWwgdGFibGUgZWxlbWVudHMgZG8gbm90IGhhdmUgbWFyZ2lucy4KKyAgICAgICAgcm93Qm94
R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IH0pOworICAgICAgICByb3dCb3hHZW9tZXRy
eS5zZXRWZXJ0aWNhbE1hcmdpbih7IH0pOworCisgICAgICAgIGF1dG8gY29tcHV0ZWRSb3dCb3Jk
ZXIgPSBbJl0geworICAgICAgICAgICAgYXV0byBib3JkZXIgPSBnZW9tZXRyeSgpLmNvbXB1dGVk
Qm9yZGVyKHJvd0JveCk7CisgICAgICAgICAgICBpZiAoIWdyaWQuY29sbGFwc2VkQm9yZGVyKCkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIGJvcmRlcjsKKyAgICAgICAgICAgIC8vIEJvcmRlciBj
b2xsYXBzaW5nIGRlbGVnYXRlcyBib3JkZXJzIHRvIHRhYmxlL2NlbGxzLgorICAgICAgICAgICAg
Ym9yZGVyLmhvcml6b250YWwgPSB7IH07CisgICAgICAgICAgICBpZiAoIXJvd0luZGV4KQorICAg
ICAgICAgICAgICAgIGJvcmRlci52ZXJ0aWNhbC50b3AgPSB7IH07CisgICAgICAgICAgICBpZiAo
cm93SW5kZXggPT0gcm93cy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgIGJvcmRlci52ZXJ0
aWNhbC5ib3R0b20gPSB7IH07CisgICAgICAgICAgICByZXR1cm4gYm9yZGVyOworICAgICAgICB9
KCk7CisgICAgICAgIGlmIChjb21wdXRlZFJvd0JvcmRlci5oZWlnaHQoKSA+IHJvdy5sb2dpY2Fs
SGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGFuIG9kZCBxdWlyayB3
aGVuIHRoZSByb3cgYm9yZGVyIG92ZXJmbG93cyB0aGUgcm93LgorICAgICAgICAgICAgLy8gV2Ug
ZG9uJ3QgcGFpbnQgcm93IGJvcmRlcnMgc28gaXQgZG9lcyBub3QgbWF0dGVyIHRvbyBtdWNoLCBi
dXQgaWYgd2UgZG9uJ3QKKyAgICAgICAgICAgIC8vIHNldCB0aGlzIGZha2UgYm9yZGVyIHZhbHVl
LCB0aGFuIHdlIGVpdGhlciBlbmQgdXAgd2l0aCBhIG5lZ2F0aXZlIGNvbnRlbnQgYm94CisgICAg
ICAgICAgICAvLyBvciB3aXRoIGEgd2lkZSBmcmFtZSBib3guCisgICAgICAgICAgICAvLyBJZiBp
dCBoYXBwZW5zIHRvIGNhdXNlIGlzc3VlcyBpbiB0aGUgZGlzcGxheSB0cmVlLCB3ZSBjb3VsZCBh
bHNvIGNvbnNpZGVyCisgICAgICAgICAgICAvLyBhIHNwZWNpYWwgZnJhbWUgYm94IG92ZXJyaWRl
LCB3aGVyZSBwYWRkaW5nIGJveCArIGJvcmRlciAhPSBmcmFtZSBib3guCisgICAgICAgICAgICBj
b21wdXRlZFJvd0JvcmRlci52ZXJ0aWNhbC50b3AgPSB7IH07CisgICAgICAgICAgICBjb21wdXRl
ZFJvd0JvcmRlci52ZXJ0aWNhbC5ib3R0b20gPSB7IH07CisgICAgICAgIH0KKyAgICAgICAgcm93
Qm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodChyb3cubG9naWNhbEhlaWdodCgpIC0gY29t
cHV0ZWRSb3dCb3JkZXIuaGVpZ2h0KCkpOworCisgICAgICAgIGF1dG8gcm93TG9naWNhbFdpZHRo
ID0gZ3JpZC5jb2x1bW5zKCkubG9naWNhbFdpZHRoKCkgKyAyICogZ3JpZC5ob3Jpem9udGFsU3Bh
Y2luZygpOworICAgICAgICBpZiAoY29tcHV0ZWRSb3dCb3JkZXIud2lkdGgoKSA+IHJvd0xvZ2lj
YWxXaWR0aCkgeworICAgICAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdmUuCisgICAgICAgICAg
ICBjb21wdXRlZFJvd0JvcmRlci5ob3Jpem9udGFsLmxlZnQgPSB7IH07CisgICAgICAgICAgICBj
b21wdXRlZFJvd0JvcmRlci5ob3Jpem9udGFsLnJpZ2h0ID0geyB9OworICAgICAgICB9CisgICAg
ICAgIHJvd0JveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChyb3dMb2dpY2FsV2lkdGggLSBj
b21wdXRlZFJvd0JvcmRlci53aWR0aCgpKTsKKyAgICAgICAgcm93Qm94R2VvbWV0cnkuc2V0Qm9y
ZGVyKGNvbXB1dGVkUm93Qm9yZGVyKTsKKworICAgICAgICBpZiAocHJldmlvdXNSb3cgJiYgJnBy
ZXZpb3VzUm93LT5wYXJlbnQoKSAhPSAmcm93Qm94LnBhcmVudCgpKSB7CisgICAgICAgICAgICAv
LyBUaGlzIHJvdyBpcyBpbiBhIGRpZmZlcmVudCBzZWN0aW9uLgorICAgICAgICAgICAgcm93TG9n
aWNhbFRvcCA9IHsgfTsKKyAgICAgICAgfQorICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRMb2dp
Y2FsVG9wKHJvd0xvZ2ljYWxUb3ApOworICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRMb2dpY2Fs
TGVmdCh7IH0pOworCisgICAgICAgIHJvd0xvZ2ljYWxUb3AgKz0gcm93LmxvZ2ljYWxIZWlnaHQo
KSArIGdyaWQudmVydGljYWxTcGFjaW5nKCk7CisgICAgICAgIHByZXZpb3VzUm93ID0gJnJvd0Jv
eDsKKyAgICB9CisKKyAgICBhdXRvJiBjb2x1bW5zID0gZ3JpZC5jb2x1bW5zKCk7CisgICAgVmVj
dG9yPElubGluZUxheW91dFVuaXQ+IHJvd0Jhc2VsaW5lcyhyb3dzLnNpemUoKSwgMCk7CisgICAg
Ly8gTm93IHRoYXQgY2VsbHMgYXJlIGxhaWQgb3V0LCBsZXQncyBjb21wdXRlIHRoZSByb3cgYmFz
ZWxpbmVzLgorICAgIGZvciAoc2l6ZV90IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dzLnNp
emUoKTsgKytyb3dJbmRleCkgeworICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7
IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29sdW1uSW5kZXgpIHsKKyAgICAgICAg
ICAgIGF1dG8mIHNsb3QgPSAqZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0pOwor
ICAgICAgICAgICAgaWYgKHNsb3QuaXNSb3dTcGFubmVkKCkpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICBpZiAoc2xvdC5oYXNSb3dTcGFuKCkpCisgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICBhdXRvJiBjZWxsID0gc2xvdC5jZWxsKCk7CisgICAg
ICAgICAgICByb3dCYXNlbGluZXNbcm93SW5kZXhdID0gc3RkOjptYXgocm93QmFzZWxpbmVzW3Jv
d0luZGV4XSwgY2VsbC5iYXNlbGluZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNp
emVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpCisg
ICAgICAgIHJvd3Nbcm93SW5kZXhdLnNldEJhc2VsaW5lKHJvd0Jhc2VsaW5lc1tyb3dJbmRleF0p
OworfQorCit2b2lkIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OnNldFVzZWRHZW9tZXRyeUZvclNl
Y3Rpb25zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCit7
CisgICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpOworICAgIGF1
dG8mIHRhYmxlQm94ID0gcm9vdCgpOworICAgIGF1dG8gc2VjdGlvbldpZHRoID0gZ3JpZC5jb2x1
bW5zKCkubG9naWNhbFdpZHRoKCkgKyAyICogZ3JpZC5ob3Jpem9udGFsU3BhY2luZygpOworICAg
IGF1dG8gbG9naWNhbFRvcCA9IGNvbnN0cmFpbnRzLnZlcnRpY2FsLmxvZ2ljYWxUb3A7CisgICAg
YXV0byB2ZXJ0aWNhbFNwYWNpbmcgPSBncmlkLnZlcnRpY2FsU3BhY2luZygpOworICAgIGF1dG8g
cGFkZGluZ0JlZm9yZSA9IE9wdGlvbmFsPExheW91dFVuaXQ+IHsgdmVydGljYWxTcGFjaW5nIH07
CisgICAgYXV0byBwYWRkaW5nQWZ0ZXIgPSB2ZXJ0aWNhbFNwYWNpbmc7CisgICAgZm9yIChhdXRv
JiBzZWN0aW9uQm94IDogY2hpbGRyZW5PZlR5cGU8Q29udGFpbmVyQm94Pih0YWJsZUJveCkpIHsK
KyAgICAgICAgYXV0byYgc2VjdGlvbkJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94
R2VvbWV0cnkoc2VjdGlvbkJveCk7CisgICAgICAgIC8vIFNlY3Rpb24gYm9yZGVycyBhcmUgZWl0
aGVyIGNvbGxhcHNlZCBvciBpZ25vcmVkLgorICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0
Qm9yZGVyKHsgfSk7CisgICAgICAgIC8vIFVzZSBmYWtlIHZlcnRpY2FsIHBhZGRpbmcgdG8gc3Bh
Y2Ugb3V0IHRoZSBzZWN0aW9ucy4KKyAgICAgICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldFBhZGRp
bmcoRWRnZXMgeyB7IH0sIHsgcGFkZGluZ0JlZm9yZS52YWx1ZU9yKDBfbHUpLCBwYWRkaW5nQWZ0
ZXIgfSB9KTsKKyAgICAgICAgcGFkZGluZ0JlZm9yZSA9IFdURjo6bnVsbG9wdDsKKyAgICAgICAg
Ly8gSW50ZXJuYWwgdGFibGUgZWxlbWVudHMgZG8gbm90IGhhdmUgbWFyZ2lucy4KKyAgICAgICAg
c2VjdGlvbkJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyB9KTsKKyAgICAgICAgc2Vj
dGlvbkJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7CisKKyAgICAgICAgc2VjdGlv
bkJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChzZWN0aW9uV2lkdGgpOworICAgICAgICBh
dXRvIHNlY3Rpb25Db250ZW50SGVpZ2h0ID0gTGF5b3V0VW5pdCB7IH07CisgICAgICAgIHNpemVf
dCByb3dDb3VudCA9IDA7CisgICAgICAgIGZvciAoYXV0byYgcm93Qm94IDogY2hpbGRyZW5PZlR5
cGU8Q29udGFpbmVyQm94PihzZWN0aW9uQm94KSkgeworICAgICAgICAgICAgc2VjdGlvbkNvbnRl
bnRIZWlnaHQgKz0gZ2VvbWV0cnlGb3JCb3gocm93Qm94KS5ib3JkZXJCb3hIZWlnaHQoKTsKKyAg
ICAgICAgICAgICsrcm93Q291bnQ7CisgICAgICAgIH0KKyAgICAgICAgc2VjdGlvbkNvbnRlbnRI
ZWlnaHQgKz0gdmVydGljYWxTcGFjaW5nICogKHJvd0NvdW50IC0gMSk7CisgICAgICAgIHNlY3Rp
b25Cb3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KHNlY3Rpb25Db250ZW50SGVpZ2h0KTsK
KyAgICAgICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldExvZ2ljYWxMZWZ0KGNvbnN0cmFpbnRzLmhv
cml6b250YWwubG9naWNhbExlZnQpOworICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0TG9n
aWNhbFRvcChsb2dpY2FsVG9wKTsKKworICAgICAgICBsb2dpY2FsVG9wICs9IHNlY3Rpb25Cb3hH
ZW9tZXRyeS5ib3JkZXJCb3hIZWlnaHQoKTsKKyAgICB9Cit9CisKK3ZvaWQgVGFibGVGb3JtYXR0
aW5nQ29udGV4dDo6bGF5b3V0Q2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwsIExheW91
dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2Vk
Q2VsbEhlaWdodCkKK3sKKyAgICBBU1NFUlQoY2VsbC5ib3goKS5lc3RhYmxpc2hlc0Jsb2NrRm9y
bWF0dGluZ0NvbnRleHQoKSk7CisKKyAgICBhdXRvJiBncmlkID0gZm9ybWF0dGluZ1N0YXRlKCku
dGFibGVHcmlkKCk7CisgICAgYXV0byYgY2VsbEJveCA9IGNlbGwuYm94KCk7CisgICAgYXV0byYg
Y2VsbEJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoY2VsbEJveCk7
CisKKyAgICBjZWxsQm94R2VvbWV0cnkuc2V0Qm9yZGVyKGdlb21ldHJ5KCkuY29tcHV0ZWRDZWxs
Qm9yZGVyKGNlbGwpKTsKKyAgICBjZWxsQm94R2VvbWV0cnkuc2V0UGFkZGluZyhnZW9tZXRyeSgp
LmNvbXB1dGVkUGFkZGluZyhjZWxsQm94LCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpKTsKKyAg
ICAvLyBJbnRlcm5hbCB0YWJsZSBlbGVtZW50cyBkbyBub3QgaGF2ZSBtYXJnaW5zLgorICAgIGNl
bGxCb3hHZW9tZXRyeS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgfSk7CisgICAgY2VsbEJveEdlb21l
dHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7CisKKyAgICBhdXRvIGF2YWlsYWJsZVNwYWNlRm9y
Q29udGVudCA9IFsmXSB7CisgICAgICAgIGF1dG8mIGNvbHVtbkxpc3QgPSBncmlkLmNvbHVtbnMo
KS5saXN0KCk7CisgICAgICAgIGF1dG8gbG9naWNhbFdpZHRoID0gTGF5b3V0VW5pdCB7IH07Cisg
ICAgICAgIGZvciAoYXV0byBjb2x1bW5JbmRleCA9IGNlbGwuc3RhcnRDb2x1bW4oKTsgY29sdW1u
SW5kZXggPCBjZWxsLmVuZENvbHVtbigpOyArK2NvbHVtbkluZGV4KQorICAgICAgICAgICAgbG9n
aWNhbFdpZHRoICs9IGNvbHVtbkxpc3QuYXQoY29sdW1uSW5kZXgpLmxvZ2ljYWxXaWR0aCgpOwor
ICAgICAgICAvLyBObyBjb2x1bW4gc3BhY2luZyB3aGVuIHNwYW5uaW5nLgorICAgICAgICBsb2dp
Y2FsV2lkdGggKz0gKGNlbGwuY29sdW1uU3BhbigpIC0gMSkgKiBncmlkLmhvcml6b250YWxTcGFj
aW5nKCk7CisgICAgICAgIHJldHVybiBsb2dpY2FsV2lkdGggLSBjZWxsQm94R2VvbWV0cnkuaG9y
aXpvbnRhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKTsKKyAgICB9KCk7CisgICAgY2VsbEJveEdl
b21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChhdmFpbGFibGVTcGFjZUZvckNvbnRlbnQpOworCisg
ICAgaWYgKGNlbGxCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpIHsKKyAgICAgICAgYXV0
byBjb25zdHJhaW50c0ZvckNlbGxDb250ZW50ID0gZ2VvbWV0cnkoKS5jb25zdHJhaW50c0Zvcklu
Rmxvd0NvbnRlbnQoY2VsbEJveCk7CisgICAgICAgIGNvbnN0cmFpbnRzRm9yQ2VsbENvbnRlbnQu
dmVydGljYWwubG9naWNhbEhlaWdodCA9IHVzZWRDZWxsSGVpZ2h0OworICAgICAgICBhdXRvIGlu
dmFsaWRhdGlvblN0YXRlID0gSW52YWxpZGF0aW9uU3RhdGUgeyB9OworICAgICAgICAvLyBGSVhN
RTogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgcGFydCBvZiB0aGUgaW52YWxpZGF0aW9uIHN0YXRl
IHRvIGluZGljYXRlIHdoZW4gd2UgcmUtbGF5b3V0IHRoZSBjZWxsCisgICAgICAgIC8vIG11bHRp
cGxlIHRpbWVzIGFzIHBhcnQgb2YgdGhlIG11bHRpLXBhc3MgdGFibGUgYWxnb3JpdGhtLgorICAg
ICAgICBhdXRvJiBmbG9hdGluZ1N0YXRlRm9yQ2VsbENvbnRlbnQgPSBsYXlvdXRTdGF0ZSgpLmVu
c3VyZUJsb2NrRm9ybWF0dGluZ1N0YXRlKGNlbGxCb3gpLmZsb2F0aW5nU3RhdGUoKTsKKyAgICAg
ICAgZmxvYXRpbmdTdGF0ZUZvckNlbGxDb250ZW50LmNsZWFyKCk7CisgICAgICAgIExheW91dENv
bnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGNlbGxCb3gsIGxheW91dFN0YXRlKCkpLT5s
YXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBjb25zdHJhaW50c0ZvckNlbGxD
b250ZW50KTsKKyAgICB9CisgICAgY2VsbEJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQo
Z2VvbWV0cnkoKS5jZWxsSGVpZ2goY2VsbEJveCkpOworfQorCitGb3JtYXR0aW5nQ29udGV4dDo6
SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRl
ZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKQoreworICAgIEFTU0VSVCghcm9vdCgpLmlzU2l6
ZUNvbnRhaW5tZW50Qm94KCkpOworICAgIC8vIFRhYmxlcyBoYXZlIGEgc2xpZ2h0eSBkaWZmZXJl
bnQgY29uY2VwdCBvZiBzaHJpbmsgdG8gZml0LiBJdCdzIHJlYWxseSBvbmx5IGRpZmZlcmVudCB3
aXRoIG5vbi1hdXRvICJ3aWR0aCIgdmFsdWVzLCB3aGVyZQorICAgIC8vIGEgZ2VuZXJpYyBzaHJp
bmstdG8gZml0IGJsb2NrIGxldmVsIGJveCBsaWtlIGEgZmxvYXQgYm94IHdvdWxkIGJlIGp1c3Qg
c2l6ZWQgdG8gdGhlIGNvbXB1dGVkIHZhbHVlIG9mICJ3aWR0aCIsIHRhYmxlcworICAgIC8vIGNh
biBhY3R1YWxseSBiZSBzdHJlY2hlZCB3YXkgb3Zlci4KKyAgICBhdXRvJiBncmlkID0gZm9ybWF0
dGluZ1N0YXRlKCkudGFibGVHcmlkKCk7CisgICAgaWYgKGF1dG8gY29tcHV0ZWRXaWR0aENvbnN0
cmFpbnRzID0gZ3JpZC53aWR0aENvbnN0cmFpbnRzKCkpCisgICAgICAgIHJldHVybiAqY29tcHV0
ZWRXaWR0aENvbnN0cmFpbnRzOworCisgICAgLy8gQ29tcHV0ZSB0aGUgbWluaW11bS9tYXhpbXVt
IHdpZHRoIG9mIGVhY2ggY29sdW1uLgorICAgIGF1dG8gY29tcHV0ZWRXaWR0aENvbnN0cmFpbnRz
ID0gY29tcHV0ZWRQcmVmZXJyZWRXaWR0aEZvckNvbHVtbnMoKTsKKyAgICBncmlkLnNldFdpZHRo
Q29uc3RyYWludHMoY29tcHV0ZWRXaWR0aENvbnN0cmFpbnRzKTsKKyAgICByZXR1cm4gY29tcHV0
ZWRXaWR0aENvbnN0cmFpbnRzOworfQorCitVbmlxdWVSZWY8VGFibGVHcmlkPiBUYWJsZUZvcm1h
dHRpbmdDb250ZXh0OjplbnN1cmVUYWJsZUdyaWQoY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJv
eCkKK3sKKyAgICBhdXRvIHRhYmxlR3JpZCA9IG1ha2VVbmlxdWVSZWY8VGFibGVHcmlkPigpOwor
ICAgIGF1dG8mIHRhYmxlU3R5bGUgPSB0YWJsZUJveC5zdHlsZSgpOworICAgIGF1dG8gc2hvdWxk
QXBwbHlCb3JkZXJTcGFjaW5nID0gdGFibGVTdHlsZS5ib3JkZXJDb2xsYXBzZSgpID09IEJvcmRl
ckNvbGxhcHNlOjpTZXBhcmF0ZTsKKyAgICB0YWJsZUdyaWQtPnNldEhvcml6b250YWxTcGFjaW5n
KExheW91dFVuaXQgeyBzaG91bGRBcHBseUJvcmRlclNwYWNpbmcgPyB0YWJsZVN0eWxlLmhvcml6
b250YWxCb3JkZXJTcGFjaW5nKCkgOiAwIH0pOworICAgIHRhYmxlR3JpZC0+c2V0VmVydGljYWxT
cGFjaW5nKExheW91dFVuaXQgeyBzaG91bGRBcHBseUJvcmRlclNwYWNpbmcgPyB0YWJsZVN0eWxl
LnZlcnRpY2FsQm9yZGVyU3BhY2luZygpIDogMCB9KTsKKworICAgIGF1dG8qIGZpcnN0Q2hpbGQg
PSB0YWJsZUJveC5maXJzdENoaWxkKCk7CisgICAgaWYgKCFmaXJzdENoaWxkKSB7CisgICAgICAg
IC8vIFRoZSByYXJlIGNhc2Ugb2YgZW1wdHkgdGFibGUuCisgICAgICAgIHJldHVybiB0YWJsZUdy
aWQ7CisgICAgfQorCisgICAgY29uc3QgQm94KiB0YWJsZUNhcHRpb24gPSBudWxscHRyOworICAg
IGNvbnN0IEJveCogY29sZ3JvdXAgPSBudWxscHRyOworICAgIC8vIFRhYmxlIGNhcHRpb24gaXMg
YW4gb3B0aW9uYWwgZWxlbWVudDsgaWYgdXNlZCwgaXQgaXMgYWx3YXlzIHRoZSBmaXJzdCBjaGls
ZCBvZiBhIDx0YWJsZT4uCisgICAgaWYgKGZpcnN0Q2hpbGQtPmlzVGFibGVDYXB0aW9uKCkpCisg
ICAgICAgIHRhYmxlQ2FwdGlvbiA9IGZpcnN0Q2hpbGQ7CisgICAgLy8gVGhlIDxjb2xncm91cD4g
bXVzdCBhcHBlYXIgYWZ0ZXIgYW55IG9wdGlvbmFsIDxjYXB0aW9uPiBlbGVtZW50IGJ1dCBiZWZv
cmUgYW55IDx0aGVhZD4sIDx0aD4sIDx0Ym9keT4sIDx0Zm9vdD4gYW5kIDx0cj4gZWxlbWVudC4K
KyAgICBhdXRvKiBjb2xncm91cENhbmRpZGF0ZSA9IGZpcnN0Q2hpbGQ7CisgICAgaWYgKHRhYmxl
Q2FwdGlvbikKKyAgICAgICAgY29sZ3JvdXBDYW5kaWRhdGUgPSB0YWJsZUNhcHRpb24tPm5leHRT
aWJsaW5nKCk7CisgICAgaWYgKGNvbGdyb3VwQ2FuZGlkYXRlLT5pc1RhYmxlQ29sdW1uR3JvdXAo
KSkKKyAgICAgICAgY29sZ3JvdXAgPSBjb2xncm91cENhbmRpZGF0ZTsKKworICAgIGlmIChjb2xn
cm91cCkgeworICAgICAgICBhdXRvJiBjb2x1bW5zID0gdGFibGVHcmlkLT5jb2x1bW5zKCk7Cisg
ICAgICAgIGZvciAoYXV0byogY29sdW1uID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PigqY29sZ3Jv
dXApLmZpcnN0Q2hpbGQoKTsgY29sdW1uOyBjb2x1bW4gPSBjb2x1bW4tPm5leHRTaWJsaW5nKCkp
IHsKKyAgICAgICAgICAgIEFTU0VSVChjb2x1bW4tPmlzVGFibGVDb2x1bW4oKSk7CisgICAgICAg
ICAgICBhdXRvIGNvbHVtblNwYW5Db3VudCA9IGNvbHVtbi0+Y29sdW1uU3BhbigpOworICAgICAg
ICAgICAgQVNTRVJUKGNvbHVtblNwYW5Db3VudCA+IDApOworICAgICAgICAgICAgd2hpbGUgKGNv
bHVtblNwYW5Db3VudC0tKQorICAgICAgICAgICAgICAgIGNvbHVtbnMuYWRkQ29sdW1uKGRvd25j
YXN0PENvbnRhaW5lckJveD4oKmNvbHVtbikpOworICAgICAgICB9CisgICAgfQorCisgICAgYXV0
byogZmlyc3RTZWN0aW9uID0gY29sZ3JvdXAgPyBjb2xncm91cC0+bmV4dFNpYmxpbmcoKSA6IHRh
YmxlQ2FwdGlvbiA/IHRhYmxlQ2FwdGlvbi0+bmV4dFNpYmxpbmcoKSA6IGZpcnN0Q2hpbGQ7Cisg
ICAgZm9yIChhdXRvKiBzZWN0aW9uID0gZmlyc3RTZWN0aW9uOyBzZWN0aW9uOyBzZWN0aW9uID0g
c2VjdGlvbi0+bmV4dFNpYmxpbmcoKSkgeworICAgICAgICBBU1NFUlQoc2VjdGlvbi0+aXNUYWJs
ZUhlYWRlcigpIHx8IHNlY3Rpb24tPmlzVGFibGVCb2R5KCkgfHwgc2VjdGlvbi0+aXNUYWJsZUZv
b3RlcigpKTsKKyAgICAgICAgZm9yIChhdXRvKiByb3cgPSBkb3duY2FzdDxDb250YWluZXJCb3g+
KCpzZWN0aW9uKS5maXJzdENoaWxkKCk7IHJvdzsgcm93ID0gcm93LT5uZXh0U2libGluZygpKSB7
CisgICAgICAgICAgICBBU1NFUlQocm93LT5pc1RhYmxlUm93KCkpOworICAgICAgICAgICAgZm9y
IChhdXRvKiBjZWxsID0gZG93bmNhc3Q8Q29udGFpbmVyQm94Pigqcm93KS5maXJzdENoaWxkKCk7
IGNlbGw7IGNlbGwgPSBjZWxsLT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICAgICAgQVNT
RVJUKGNlbGwtPmlzVGFibGVDZWxsKCkpOworICAgICAgICAgICAgICAgIHRhYmxlR3JpZC0+YXBw
ZW5kQ2VsbChkb3duY2FzdDxDb250YWluZXJCb3g+KCpjZWxsKSk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRhYmxlR3JpZDsKK30KKworRm9ybWF0dGluZ0Nv
bnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6
Y29tcHV0ZWRQcmVmZXJyZWRXaWR0aEZvckNvbHVtbnMoKQoreworICAgIGF1dG8mIGZvcm1hdHRp
bmdTdGF0ZSA9IHRoaXMtPmZvcm1hdHRpbmdTdGF0ZSgpOworICAgIGF1dG8mIGdyaWQgPSBmb3Jt
YXR0aW5nU3RhdGUudGFibGVHcmlkKCk7CisgICAgQVNTRVJUKCFncmlkLndpZHRoQ29uc3RyYWlu
dHMoKSk7CisKKyAgICAvLyBDb2x1bW4gcHJlZmVycmVkIHdpZHRoIGNvbXB1dGF0aW9uIGFzIGZv
bGxvd3M6CisgICAgLy8gMS4gQ29sbGVjdCBlYWNoIGNlbGxzJyB3aWR0aCBjb25zdHJhaW50cwor
ICAgIC8vIDIuIENvbGxlY3QgZml4ZWQgY29sdW1uIHdpZHRocyBzZXQgYnkgPGNvbGdyb3VwPidz
IGFuZCA8Y29sPnMKKyAgICAvLyAzLiBGaW5kIHRoZSBtaW4vbWF4IHdpZHRoIGZvciBlYWNoIGNv
bHVtbnMgdXNpbmcgdGhlIGNlbGwgY29uc3RyYWludHMgYW5kIHRoZSA8Y29sPiBmaXhlZCB3aWR0
aHMgYnV0IGlnbm9yZSBjb2x1bW4gc3BhbnMuCisgICAgLy8gNC4gRGlzdHJpYnV0ZSBjb2x1bW4g
c3Bhbm5pbmcgY2VsbHMgbWluL21heCB3aWR0aHMuCisgICAgLy8gNS4gQWRkIHRoZW0gYWxsIHVw
IGFuZCByZXR1cm4gdGhlIGNvbXB1dGVkIG1pbi9tYXggd2lkdGhzLgorICAgIGZvciAoYXV0byYg
Y2VsbCA6IGdyaWQuY2VsbHMoKSkgeworICAgICAgICBhdXRvJiBjZWxsQm94ID0gY2VsbC0+Ym94
KCk7CisgICAgICAgIEFTU0VSVChjZWxsQm94LmVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dCgpKTsKKworICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRoID0gZm9ybWF0dGluZ1N0YXRl
LmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goY2VsbEJveCk7CisgICAgICAgIGlmICgh
aW50cmluc2ljV2lkdGgpIHsKKyAgICAgICAgICAgIGludHJpbnNpY1dpZHRoID0gZ2VvbWV0cnko
KS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQ2VsbCgqY2VsbCk7CisgICAgICAgICAgICBm
b3JtYXR0aW5nU3RhdGUuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChjZWxsQm94
LCAqaW50cmluc2ljV2lkdGgpOworICAgICAgICB9CisgICAgICAgIC8vIFNwYW5uZXIgY2VsbHMg
cHV0IHRoZWlyIGludHJpbnNpYyB3aWR0aHMgb24gdGhlIGluaXRpYWwgc2xvdHMuCisgICAgICAg
IGdyaWQuc2xvdChjZWxsLT5wb3NpdGlvbigpKS0+c2V0V2lkdGhDb25zdHJhaW50cygqaW50cmlu
c2ljV2lkdGgpOworICAgIH0KKworICAgIC8vIDIuIENvbGxlY3QgdGhlIGZpeGVkIHdpZHRoIDxj
b2w+cy4KKyAgICBhdXRvJiBjb2x1bW5MaXN0ID0gZ3JpZC5jb2x1bW5zKCkubGlzdCgpOworICAg
IFZlY3RvcjxPcHRpb25hbDxMYXlvdXRVbml0Pj4gZml4ZWRXaWR0aENvbHVtbnM7CisgICAgZm9y
IChhdXRvJiBjb2x1bW4gOiBjb2x1bW5MaXN0KSB7CisgICAgICAgIGF1dG8gZml4ZWRXaWR0aCA9
IFsmXSAoKSAtPiBPcHRpb25hbDxMYXlvdXRVbml0PiB7CisgICAgICAgICAgICBhdXRvKiBjb2x1
bW5Cb3ggPSBjb2x1bW4uYm94KCk7CisgICAgICAgICAgICBpZiAoIWNvbHVtbkJveCkgeworICAg
ICAgICAgICAgICAgIC8vIEFub3lubW91cyBjb2x1bW5zIGRvbid0IGhhdmUgYXNzb2NpYXRlZCBs
YXlvdXQgYm94ZXMgYW5kIGNhbid0IGhhdmUgZml4ZWQgY29sIHNpemUuCisgICAgICAgICAgICAg
ICAgcmV0dXJuIHsgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdXRvIHdpZHRo
ID0gY29sdW1uQm94LT5jb2x1bW5XaWR0aCgpKQorICAgICAgICAgICAgICAgIHJldHVybiB3aWR0
aDsKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmNvbXB1dGVkQ29sdW1uV2lkdGgoKmNv
bHVtbkJveCk7CisgICAgICAgIH07CisgICAgICAgIGZpeGVkV2lkdGhDb2x1bW5zLmFwcGVuZChm
aXhlZFdpZHRoKCkpOworICAgIH0KKworICAgIFZlY3RvcjxGb3JtYXR0aW5nQ29udGV4dDo6SW50
cmluc2ljV2lkdGhDb25zdHJhaW50cz4gY29sdW1uSW50cmluc2ljV2lkdGhzKGNvbHVtbkxpc3Qu
c2l6ZSgpKTsKKyAgICAvLyAzLiBDb2xsZWN0IGhlIG1pbi9tYXggd2lkdGggZm9yIGVhY2ggY29s
dW1uIGJ1dCBpZ25vcmUgY29sdW1uIHNwYW5zIGZvciBub3cuCisgICAgVmVjdG9yPFNsb3RQb3Np
dGlvbj4gc3Bhbm5pbmdDZWxsUG9zaXRpb25MaXN0OworICAgIHNpemVfdCBudW1iZXJPZkFjdHVh
bENvbHVtbnMgPSAwOworICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5k
ZXggPCBjb2x1bW5MaXN0LnNpemUoKTsgKytjb2x1bW5JbmRleCkgeworICAgICAgICBhdXRvIGNv
bHVtbkhhc05vblNwYW5uZWRDZWxsID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IHJvd0lu
ZGV4ID0gMDsgcm93SW5kZXggPCBncmlkLnJvd3MoKS5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAg
ICAgICAgICAgIGF1dG8mIHNsb3QgPSAqZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4
IH0pOworICAgICAgICAgICAgaWYgKHNsb3QuaXNDb2x1bW5TcGFubmVkKCkpCisgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICBjb2x1bW5IYXNOb25TcGFubmVkQ2VsbCA9IHRy
dWU7CisgICAgICAgICAgICBpZiAoc2xvdC5oYXNDb2x1bW5TcGFuKCkpIHsKKyAgICAgICAgICAg
ICAgICBzcGFubmluZ0NlbGxQb3NpdGlvbkxpc3QuYXBwZW5kKHsgY29sdW1uSW5kZXgsIHJvd0lu
ZGV4IH0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgYXV0byBjb2x1bW5GaXhlZFdpZHRoID0gZml4ZWRXaWR0aENvbHVtbnNbY29sdW1uSW5k
ZXhdOworICAgICAgICAgICAgYXV0byB3aWR0aENvbnN0cmFpbnRzID0gIWNvbHVtbkZpeGVkV2lk
dGggPyBzbG90LndpZHRoQ29uc3RyYWludHMoKSA6IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzIHsgKmNvbHVtbkZpeGVkV2lkdGgsICpjb2x1bW5GaXhlZFdpZHRo
IH07CisgICAgICAgICAgICBjb2x1bW5JbnRyaW5zaWNXaWR0aHNbY29sdW1uSW5kZXhdLm1pbmlt
dW0gPSBzdGQ6Om1heCh3aWR0aENvbnN0cmFpbnRzLm1pbmltdW0sIGNvbHVtbkludHJpbnNpY1dp
ZHRoc1tjb2x1bW5JbmRleF0ubWluaW11bSk7CisgICAgICAgICAgICBjb2x1bW5JbnRyaW5zaWNX
aWR0aHNbY29sdW1uSW5kZXhdLm1heGltdW0gPSBzdGQ6Om1heCh3aWR0aENvbnN0cmFpbnRzLm1h
eGltdW0sIGNvbHVtbkludHJpbnNpY1dpZHRoc1tjb2x1bW5JbmRleF0ubWF4aW11bSk7CisgICAg
ICAgIH0KKyAgICAgICAgaWYgKGNvbHVtbkhhc05vblNwYW5uZWRDZWxsKQorICAgICAgICAgICAg
KytudW1iZXJPZkFjdHVhbENvbHVtbnM7CisgICAgfQorCisgICAgLy8gNC4gRGlzdHJpYnV0ZSB0
aGUgc3Bhbm5pbmcgbWluL21heCB3aWR0aHMuCisgICAgZm9yIChhdXRvIHNwYW5uaW5nQ2VsbFBv
c2l0aW9uIDogc3Bhbm5pbmdDZWxsUG9zaXRpb25MaXN0KSB7CisgICAgICAgIGF1dG8mIHNsb3Qg
PSAqZ3JpZC5zbG90KHNwYW5uaW5nQ2VsbFBvc2l0aW9uKTsKKyAgICAgICAgYXV0byYgY2VsbCA9
IHNsb3QuY2VsbCgpOworICAgICAgICBBU1NFUlQoc2xvdC5oYXNDb2x1bW5TcGFuKCkpOworICAg
ICAgICBhdXRvIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUgPSBzbG90LndpZHRoQ29uc3Ry
YWludHMoKTsKKyAgICAgICAgZm9yIChzaXplX3QgY29sdW1uU3BhbkluZGV4ID0gY2VsbC5zdGFy
dENvbHVtbigpOyBjb2x1bW5TcGFuSW5kZXggPCBjZWxsLmVuZENvbHVtbigpOyArK2NvbHVtblNw
YW5JbmRleCkKKyAgICAgICAgICAgIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUgLT0gY29s
dW1uSW50cmluc2ljV2lkdGhzW2NvbHVtblNwYW5JbmRleF07CisgICAgICAgIC8vIDx0YWJsZSBz
dHlsZT0iYm9yZGVyLXNwYWNpbmc6IDUwcHgiPjx0cj48dGQgY29sc3Bhbj0yPmxvbmcgbG9uZyB0
ZXh0PC90ZD48L3RyPjx0cj48dGQ+bG88L3RkPjx0ZD54dDwvdGQ+PHRyPjwvdGFibGU+CisgICAg
ICAgIC8vIFtsb25nIGxvbmcgdGV4dF0KKyAgICAgICAgLy8gW2xvXSAgICAgICAgW3h0XQorICAg
ICAgICAvLyBXaGlsZSBpdCBsb29rcyBsaWtlIHRoZSBzcGFubmluZyBjZWxsIGhhcyB0byBkaXN0
cmlidXRlIGFsbCBpdHMgc3Bhbm5pbmcgd2lkdGgsIHRoZSBib3JkZXItc3BhY2luZyB0YWtlcyBt
b3N0IG9mIHRoZSBzcGFjZSBhbmQKKyAgICAgICAgLy8gbm8gZGlzdHJpYnV0aW9uIGlzIG5lZWRl
ZCBhdCBhbGwuCisgICAgICAgIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUgLT0gKGNlbGwu
Y29sdW1uU3BhbigpIC0gMSkgKiBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7CisgICAgICAgIC8v
IEZJWE1FOiBDaGVjayBpZiBmaXhlZCB3aWR0aCBjb2x1bW5zIHNob3VsZCBiZSBza2lwcGVkIGhl
cmUuCisgICAgICAgIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWluaW11bSA9IHN0ZDo6
bWF4KExheW91dFVuaXQgeyB9LCB3aWR0aENvbnN0cmFpbnRzVG9EaXN0cmlidXRlLm1pbmltdW0g
LyBjZWxsLmNvbHVtblNwYW4oKSk7CisgICAgICAgIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1
dGUubWF4aW11bSA9IHN0ZDo6bWF4KExheW91dFVuaXQgeyB9LCB3aWR0aENvbnN0cmFpbnRzVG9E
aXN0cmlidXRlLm1heGltdW0gLyBjZWxsLmNvbHVtblNwYW4oKSk7CisgICAgICAgIGlmICh3aWR0
aENvbnN0cmFpbnRzVG9EaXN0cmlidXRlLm1pbmltdW0gfHwgd2lkdGhDb25zdHJhaW50c1RvRGlz
dHJpYnV0ZS5tYXhpbXVtKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW5TcGFuSW5k
ZXggPSBjZWxsLnN0YXJ0Q29sdW1uKCk7IGNvbHVtblNwYW5JbmRleCA8IGNlbGwuZW5kQ29sdW1u
KCk7ICsrY29sdW1uU3BhbkluZGV4KQorICAgICAgICAgICAgICAgIGNvbHVtbkludHJpbnNpY1dp
ZHRoc1tjb2x1bW5TcGFuSW5kZXhdICs9IHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGU7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICAvLyA1LiBUaGUgZmluYWwgdGFibGUgbWluL21heCB3aWR0
aHMgaXMganVzdCB0aGUgYWNjdW11bGF0ZWQgY29sdW1uIGNvbnN0cmFpbnRzLgorICAgIGF1dG8g
dGFibGVXaWR0aENvbnN0cmFpbnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07Cisg
ICAgZm9yIChhdXRvJiBjb2x1bW5JbnRyaW5zaWNXaWR0aCA6IGNvbHVtbkludHJpbnNpY1dpZHRo
cykKKyAgICAgICAgdGFibGVXaWR0aENvbnN0cmFpbnRzICs9IGNvbHVtbkludHJpbnNpY1dpZHRo
OworICAgIC8vIEV4YXBhbmQgdGhlIHByZWZlcnJlZCB3aWR0aCB3aXRoIGxlYWRpbmcgYW5kIHRy
YWlsaW5nIGNlbGwgc3BhY2luZyAobm90ZSB0aGF0IGNvbHVtbiBzcGFubmVycyBjb3VudCBhcyBv
bmUgY2VsbCkuCisgICAgdGFibGVXaWR0aENvbnN0cmFpbnRzICs9IChudW1iZXJPZkFjdHVhbENv
bHVtbnMgKyAxKSAqIGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKKyAgICByZXR1cm4gdGFibGVX
aWR0aENvbnN0cmFpbnRzOworfQorCit2b2lkIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1
dGVBbmREaXN0cmlidXRlRXh0cmFTcGFjZShMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxT
cGFjZSwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlVmVydGljYWxTcGFjZSkKK3sKKyAg
ICAvLyBDb21wdXRlIGFuZCBiYWxhbmNlIHRoZSBjb2x1bW4gYW5kIHJvdyBzcGFjZXMuCisgICAg
YXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpOworICAgIGF1dG8mIGNv
bHVtbnMgPSBncmlkLmNvbHVtbnMoKS5saXN0KCk7CisgICAgYXV0byB0YWJsZUxheW91dCA9IHRo
aXMtPnRhYmxlTGF5b3V0KCk7CisKKyAgICAvLyBDb2x1bW5zIGZpcnN0LgorICAgIGF1dG8gZGlz
dHJpYnV0ZWRIb3Jpem9udGFsU3BhY2VzID0gdGFibGVMYXlvdXQuZGlzdHJpYnV0ZWRIb3Jpem9u
dGFsU3BhY2UoYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKKyAgICBBU1NFUlQoZGlzdHJpYnV0
ZWRIb3Jpem9udGFsU3BhY2VzLnNpemUoKSA9PSBjb2x1bW5zLnNpemUoKSk7CisgICAgYXV0byBj
b2x1bW5Mb2dpY2FsTGVmdCA9IGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKKyAgICBmb3IgKHNp
emVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29s
dW1uSW5kZXgpIHsKKyAgICAgICAgYXV0byYgY29sdW1uID0gY29sdW1uc1tjb2x1bW5JbmRleF07
CisgICAgICAgIGNvbHVtbi5zZXRMb2dpY2FsTGVmdChjb2x1bW5Mb2dpY2FsTGVmdCk7CisgICAg
ICAgIGNvbHVtbi5zZXRMb2dpY2FsV2lkdGgoZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2VzW2Nv
bHVtbkluZGV4XSk7CisgICAgICAgIGNvbHVtbkxvZ2ljYWxMZWZ0ICs9IGRpc3RyaWJ1dGVkSG9y
aXpvbnRhbFNwYWNlc1tjb2x1bW5JbmRleF0gKyBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7Cisg
ICAgfQorCisgICAgLy8gUm93cyBzZWNvbmQuCisgICAgYXV0byYgcm93cyA9IGdyaWQucm93cygp
Lmxpc3QoKTsKKyAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5z
aXplKCk7ICsrcm93SW5kZXgpIHsKKyAgICAgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAw
OyBjb2x1bW5JbmRleCA8IGNvbHVtbnMuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7CisgICAgICAg
ICAgICBhdXRvJiBzbG90ID0gKmdyaWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsK
KyAgICAgICAgICAgIGlmIChzbG90LmlzUm93U3Bhbm5lZCgpKQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgbGF5b3V0Q2VsbChzbG90LmNlbGwoKSwgYXZhaWxhYmxlSG9y
aXpvbnRhbFNwYWNlKTsKKyAgICAgICAgICAgIGlmIChzbG90Lmhhc1Jvd1NwYW4oKSkKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIFRoZSBtaW5pbXVtIGhlaWdodCBv
ZiBhIHJvdyAod2l0aG91dCBzcGFubmluZy1yZWxhdGVkIGhlaWdodCBkaXN0cmlidXRpb24pIGlz
IGRlZmluZWQgYXMgdGhlIGhlaWdodCBvZiBhbiBoeXBvdGhldGljYWwKKyAgICAgICAgICAgIC8v
IGxpbmVib3ggY29udGFpbmluZyB0aGUgY2VsbHMgb3JpZ2luYXRpbmcgaW4gdGhlIHJvdy4KKyAg
ICAgICAgICAgIGF1dG8mIGNlbGwgPSBzbG90LmNlbGwoKTsKKyAgICAgICAgICAgIGNlbGwuc2V0
QmFzZWxpbmUoZ2VvbWV0cnkoKS51c2VkQmFzZWxpbmVGb3JDZWxsKGNlbGwuYm94KCkpKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIGF1dG8gZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNlcyA9IHRh
YmxlTGF5b3V0LmRpc3RyaWJ1dGVkVmVydGljYWxTcGFjZShhdmFpbGFibGVWZXJ0aWNhbFNwYWNl
KTsKKyAgICBBU1NFUlQoZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNlcy5zaXplKCkgPT0gcm93cy5z
aXplKCkpOworICAgIGF1dG8gcm93TG9naWNhbFRvcCA9IGdyaWQudmVydGljYWxTcGFjaW5nKCk7
CisgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyAr
K3Jvd0luZGV4KSB7CisgICAgICAgIGF1dG8mIHJvdyA9IHJvd3Nbcm93SW5kZXhdOworICAgICAg
ICByb3cuc2V0TG9naWNhbEhlaWdodChkaXN0cmlidXRlZFZlcnRpY2FsU3BhY2VzW3Jvd0luZGV4
XSk7CisgICAgICAgIHJvdy5zZXRMb2dpY2FsVG9wKHJvd0xvZ2ljYWxUb3ApOworICAgICAgICBy
b3dMb2dpY2FsVG9wICs9IGRpc3RyaWJ1dGVkVmVydGljYWxTcGFjZXNbcm93SW5kZXhdICsgZ3Jp
ZC52ZXJ0aWNhbFNwYWNpbmcoKTsKKyAgICB9Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0
dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uMWYzMGRlMTM1NDU2NjU1ODFlYjk0OWEyN2I4MGRmNGUxMjIyNWU2ZgotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
dGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQuaApAQCAtMCwwICsxLDEyNiBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRU
SU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUg
IlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiVGFibGVHcmlkLmgiCisjaW5jbHVk
ZSA8d3RmL0lzb01hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIEludmFsaWRhdGlvblN0
YXRlOworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBsYXlvdXQgbG9naWMgZm9yIHRhYmxl
IGZvcm1hdHRpbmcgY29udGV4dHMuCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjIvdGFi
bGVzLmh0bWwKK2NsYXNzIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQgZmluYWwgOiBwdWJsaWMgRm9y
bWF0dGluZ0NvbnRleHQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVGb3JtYXR0
aW5nQ29udGV4dCk7CitwdWJsaWM6CisgICAgVGFibGVGb3JtYXR0aW5nQ29udGV4dChjb25zdCBD
b250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgVGFibGVGb3JtYXR0aW5nU3RhdGUm
KTsKKyAgICB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25z
dCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSBvdmVycmlkZTsKKyAgICBMYXlvdXRVbml0
IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgVW5pcXVl
UmVmPFRhYmxlR3JpZD4gZW5zdXJlVGFibGVHcmlkKGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVC
b3gpOworCitwcml2YXRlOgorICAgIGNsYXNzIFRhYmxlTGF5b3V0IHsKKyAgICBwdWJsaWM6Cisg
ICAgICAgIFRhYmxlTGF5b3V0KGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmLCBjb25zdCBU
YWJsZUdyaWQmKTsKKworICAgICAgICB1c2luZyBEaXN0cmlidXRlZFNwYWNlcyA9IFZlY3RvcjxM
YXlvdXRVbml0PjsKKyAgICAgICAgRGlzdHJpYnV0ZWRTcGFjZXMgZGlzdHJpYnV0ZWRIb3Jpem9u
dGFsU3BhY2UoTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOworICAgICAgICBE
aXN0cmlidXRlZFNwYWNlcyBkaXN0cmlidXRlZFZlcnRpY2FsU3BhY2UoT3B0aW9uYWw8TGF5b3V0
VW5pdD4gYXZhaWxhYmxlVmVydGljYWxTcGFjZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBj
b25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsg
cmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRleHQ7IH0KKworICAgICAgICBjb25zdCBUYWJsZUZvcm1h
dHRpbmdDb250ZXh0JiBtX2Zvcm1hdHRpbmdDb250ZXh0OworICAgICAgICBjb25zdCBUYWJsZUdy
aWQmIG1fZ3JpZDsKKyAgICB9OworCisgICAgY2xhc3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0
dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIExheW91dFVuaXQg
Y2VsbEhlaWdoKGNvbnN0IENvbnRhaW5lckJveCYpIGNvbnN0OworICAgICAgICBFZGdlcyBjb21w
dXRlZENlbGxCb3JkZXIoY29uc3QgVGFibGVHcmlkOjpDZWxsJikgY29uc3Q7CisgICAgICAgIE9w
dGlvbmFsPExheW91dFVuaXQ+IGNvbXB1dGVkQ29sdW1uV2lkdGgoY29uc3QgQ29udGFpbmVyQm94
JiBjb2x1bW5Cb3gpOworICAgICAgICBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQ2VsbChjb25zdCBUYWJsZUdy
aWQ6OkNlbGwmKTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB1c2VkQmFzZWxpbmVGb3JDZWxs
KGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBm
cmllbmQgY2xhc3MgVGFibGVGb3JtYXR0aW5nQ29udGV4dDsKKyAgICAgICAgR2VvbWV0cnkoY29u
c3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYsIGNvbnN0IFRhYmxlR3JpZCYpOworCisgICAgICAg
IGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3Qg
eyByZXR1cm4gZG93bmNhc3Q8VGFibGVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5Ojpmb3JtYXR0aW5nQ29udGV4dCgpKTsgfQorICAgICAgICBjb25zdCBUYWJs
ZUdyaWQmIG1fZ3JpZDsKKyAgICB9OworICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMsIGZvcm1hdHRpbmdT
dGF0ZSgpLnRhYmxlR3JpZCgpKTsgfQorCisgICAgY2xhc3MgUXVpcmtzIDogcHVibGljIEZvcm1h
dHRpbmdDb250ZXh0OjpRdWlya3MgeworICAgIHB1YmxpYzoKKyAgICAgICAgUXVpcmtzKGNvbnN0
IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmKTsKKworICAgICAgICBib29sIHNob3VsZElnbm9yZUNo
aWxkQ29udGVudFZlcnRpY2FsTWFyZ2luKGNvbnN0IENvbnRhaW5lckJveCYpIGNvbnN0OworCisg
ICAgICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkg
Y29uc3QgeyByZXR1cm4gZG93bmNhc3Q8VGFibGVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGlu
Z0NvbnRleHQ6OlF1aXJrczo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KKyAgICAgICAgVGFibGVG
b3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBmb3Jt
YXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCk7IH0KKyAgICB9OworICAgIFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9
CisKKyAgICBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dCB0YWJsZUxheW91dCgp
IGNvbnN0IHsgcmV0dXJuIFRhYmxlTGF5b3V0KCp0aGlzLCBmb3JtYXR0aW5nU3RhdGUoKS50YWJs
ZUdyaWQoKSk7IH0KKworICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBsYXlvdXRDZWxsKGNv
bnN0IFRhYmxlR3JpZDo6Q2VsbCYsIExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNl
LCBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkQ2VsbEhlaWdodCA9IFdURjo6bnVsbG9wdCk7Cisg
ICAgdm9pZCBzZXRVc2VkR2VvbWV0cnlGb3JDZWxscyhMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6
b250YWxTcGFjZSk7CisgICAgdm9pZCBzZXRVc2VkR2VvbWV0cnlGb3JSb3dzKExheW91dFVuaXQg
YXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKKyAgICB2b2lkIHNldFVzZWRHZW9tZXRyeUZvclNl
Y3Rpb25zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOworCisgICAgSW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyBjb21wdXRlZFByZWZlcnJlZFdpZHRoRm9yQ29sdW1ucygpOwor
ICAgIHZvaWQgY29tcHV0ZUFuZERpc3RyaWJ1dGVFeHRyYVNwYWNlKExheW91dFVuaXQgYXZhaWxh
YmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVWZXJ0aWNh
bFNwYWNlKTsKKworICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3Rh
dGUoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxUYWJsZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0
dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQorICAgIFRhYmxlRm9ybWF0dGluZ1N0
YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3duY2FzdDxUYWJsZUZvcm1hdHRpbmdT
dGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQorfTsKKworaW5s
aW5lIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpHZW9tZXRyeShjb25zdCBUYWJs
ZUZvcm1hdHRpbmdDb250ZXh0JiB0YWJsZUZvcm1hdHRpbmdDb250ZXh0LCBjb25zdCBUYWJsZUdy
aWQmIGdyaWQpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkodGFibGVGb3JtYXR0
aW5nQ29udGV4dCkKKyAgICAsIG1fZ3JpZChncmlkKQoreworfQorCitpbmxpbmUgVGFibGVGb3Jt
YXR0aW5nQ29udGV4dDo6UXVpcmtzOjpRdWlya3MoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4
dCYgdGFibGVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICA6IEZvcm1hdHRpbmdDb250ZXh0OjpRdWly
a3ModGFibGVGb3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworfQorfQorCitTUEVDSUFMSVpFX1RZ
UEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoVGFibGVGb3JtYXR0aW5nQ29udGV4
dCwgaXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFi
bGVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRH
ZW9tZXRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZDczMjM5MjY5NGY2ZTdhODI0MjljMjBhNWU2MTA5ODQw
ZTJhZWRjOAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRy
eS5jcHAKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
KyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisg
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9V
VF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUu
aCIKKyNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENvbnRl
eHQuaCIKKyNpbmNsdWRlICJMYXlvdXREZXNjZW5kYW50SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJM
YXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5n
U3RhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0xh
eW91dFVuaXQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNlbGxIZWlnaChjb25z
dCBDb250YWluZXJCb3gmIGNlbGxCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGNlbGxCb3guaXNJ
bkZsb3coKSk7CisgICAgYXV0byBjb250ZW50SGVpZ2h0ID0gTGF5b3V0VW5pdCB7IH07CisgICAg
aWYgKGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkSWdub3JlQ2hpbGRDb250ZW50
VmVydGljYWxNYXJnaW4oY2VsbEJveCkpIHsKKyAgICAgICAgQVNTRVJUKGNlbGxCb3guZmlyc3RJ
bkZsb3dDaGlsZCgpKTsKKyAgICAgICAgYXV0byBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZv
cm1hdHRpbmdDb250ZXh0KCk7CisgICAgICAgIGF1dG8mIGZpcnN0SW5GbG93Q2hpbGQgPSAqY2Vs
bEJveC5maXJzdEluRmxvd0NoaWxkKCk7CisgICAgICAgIGF1dG8mIGxhc3RJbkZsb3dDaGlsZCA9
ICpjZWxsQm94Lmxhc3RJbkZsb3dDaGlsZCgpOworICAgICAgICBhdXRvJiBmaXJzdEluRmxvd0No
aWxkR2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChmaXJzdEluRmxv
d0NoaWxkLCBFc2NhcGVSZWFzb246OlRhYmxlUXVpcmtOZWVkc0dlb21ldHJ5RnJvbUVzdGFibGlz
aGVkRm9ybWF0dGluZ0NvbnRleHQpOworICAgICAgICBhdXRvJiBsYXN0SW5GbG93Q2hpbGRHZW9t
ZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxhc3RJbkZsb3dDaGlsZCwg
RXNjYXBlUmVhc29uOjpUYWJsZVF1aXJrTmVlZHNHZW9tZXRyeUZyb21Fc3RhYmxpc2hlZEZvcm1h
dHRpbmdDb250ZXh0KTsKKworICAgICAgICBhdXRvIHRvcCA9IGZpcnN0SW5GbG93Q2hpbGQuc3R5
bGUoKS5oYXNNYXJnaW5CZWZvcmVRdWlyaygpID8gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3Qo
Zmlyc3RJbkZsb3dDaGlsZEdlb21ldHJ5KS50b3AoKSA6IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hS
ZWN0KGZpcnN0SW5GbG93Q2hpbGRHZW9tZXRyeSkudG9wKCk7CisgICAgICAgIGF1dG8gYm90dG9t
ID0gbGFzdEluRmxvd0NoaWxkLnN0eWxlKCkuaGFzTWFyZ2luQWZ0ZXJRdWlyaygpID8gQm94R2Vv
bWV0cnk6OmJvcmRlckJveFJlY3QobGFzdEluRmxvd0NoaWxkR2VvbWV0cnkpLmJvdHRvbSgpIDog
Qm94R2VvbWV0cnk6Om1hcmdpbkJveFJlY3QobGFzdEluRmxvd0NoaWxkR2VvbWV0cnkpLmJvdHRv
bSgpOworICAgICAgICBjb250ZW50SGVpZ2h0ID0gYm90dG9tIC0gdG9wOworICAgIH0gZWxzZQor
ICAgICAgICBjb250ZW50SGVpZ2h0ID0gY29udGVudEhlaWdodEZvckZvcm1hdHRpbmdDb250ZXh0
Um9vdChjZWxsQm94KTsKKyAgICByZXR1cm4gc3RkOjptYXgoY29tcHV0ZWRIZWlnaHQoY2VsbEJv
eCkudmFsdWVPcigwX2x1KSwgY29udGVudEhlaWdodCk7Cit9CisKK0VkZ2VzIFRhYmxlRm9ybWF0
dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZENlbGxCb3JkZXIoY29uc3QgVGFibGVHcmlk
OjpDZWxsJiBjZWxsKSBjb25zdAoreworICAgIGF1dG8mIGNlbGxCb3ggPSBjZWxsLmJveCgpOwor
ICAgIGF1dG8gYm9yZGVyID0gY29tcHV0ZWRCb3JkZXIoY2VsbEJveCk7CisgICAgYXV0byBjb2xs
YXBzZWRCb3JkZXIgPSBtX2dyaWQuY29sbGFwc2VkQm9yZGVyKCk7CisgICAgaWYgKCFjb2xsYXBz
ZWRCb3JkZXIpCisgICAgICAgIHJldHVybiBib3JkZXI7CisKKyAgICAvLyBXZSBtaWdodCB3YW50
IHRvIGNhY2hlIHRoZXNlIGNvbGxhcHNlZCBib3JkZXJzIG9uIHRoZSBncmlkLgorICAgIGF1dG8g
Y2VsbFBvc2l0aW9uID0gY2VsbC5wb3NpdGlvbigpOworICAgIC8vIENvbGxhcHNlZCBib3JkZXIg
bGVmdCBmcm9tIHRhYmxlIGFuZCBhZGphY2VudCBjZWxscy4KKyAgICBpZiAoIWNlbGxQb3NpdGlv
bi5jb2x1bW4pCisgICAgICAgIGJvcmRlci5ob3Jpem9udGFsLmxlZnQgPSBjb2xsYXBzZWRCb3Jk
ZXItPmhvcml6b250YWwubGVmdCAvIDI7CisgICAgZWxzZSB7CisgICAgICAgIGF1dG8gYWRqYWNl
bnRCb3JkZXJSaWdodCA9IGNvbXB1dGVkQm9yZGVyKG1fZ3JpZC5zbG90KHsgY2VsbFBvc2l0aW9u
LmNvbHVtbiAtIDEsIGNlbGxQb3NpdGlvbi5yb3cgfSktPmNlbGwoKS5ib3goKSkuaG9yaXpvbnRh
bC5yaWdodDsKKyAgICAgICAgYm9yZGVyLmhvcml6b250YWwubGVmdCA9IHN0ZDo6bWF4KGJvcmRl
ci5ob3Jpem9udGFsLmxlZnQsIGFkamFjZW50Qm9yZGVyUmlnaHQpIC8gMjsKKyAgICB9CisgICAg
Ly8gQ29sbGFwc2VkIGJvcmRlciByaWdodCBmcm9tIHRhYmxlIGFuZCBhZGphY2VudCBjZWxscy4K
KyAgICBpZiAoY2VsbFBvc2l0aW9uLmNvbHVtbiA9PSBtX2dyaWQuY29sdW1ucygpLnNpemUoKSAt
IDEpCisgICAgICAgIGJvcmRlci5ob3Jpem9udGFsLnJpZ2h0ID0gY29sbGFwc2VkQm9yZGVyLT5o
b3Jpem9udGFsLnJpZ2h0IC8gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgYXV0byBhZGphY2VudEJv
cmRlckxlZnQgPSBjb21wdXRlZEJvcmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1
bW4gKyAxLCBjZWxsUG9zaXRpb24ucm93IH0pLT5jZWxsKCkuYm94KCkpLmhvcml6b250YWwubGVm
dDsKKyAgICAgICAgYm9yZGVyLmhvcml6b250YWwucmlnaHQgPSBzdGQ6Om1heChib3JkZXIuaG9y
aXpvbnRhbC5yaWdodCwgYWRqYWNlbnRCb3JkZXJMZWZ0KSAvIDI7CisgICAgfQorICAgIC8vIENv
bGxhcHNlZCBib3JkZXIgdG9wIGZyb20gdGFibGUsIHJvdyBhbmQgYWRqYWNlbnQgY2VsbHMuCisg
ICAgYXV0byYgcm93cyA9IG1fZ3JpZC5yb3dzKCkubGlzdCgpOworICAgIGlmICghY2VsbFBvc2l0
aW9uLnJvdykKKyAgICAgICAgYm9yZGVyLnZlcnRpY2FsLnRvcCA9IGNvbGxhcHNlZEJvcmRlci0+
dmVydGljYWwudG9wIC8gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgYXV0byBhZGphY2VudEJvcmRl
ckJvdHRvbSA9IGNvbXB1dGVkQm9yZGVyKG1fZ3JpZC5zbG90KHsgY2VsbFBvc2l0aW9uLmNvbHVt
biwgY2VsbFBvc2l0aW9uLnJvdyAtIDEgfSktPmNlbGwoKS5ib3goKSkudmVydGljYWwuYm90dG9t
OworICAgICAgICBhdXRvIGFkamFjZW50Um93Qm90dG9tID0gY29tcHV0ZWRCb3JkZXIocm93c1tj
ZWxsUG9zaXRpb24ucm93IC0gMV0uYm94KCkpLnZlcnRpY2FsLmJvdHRvbTsKKyAgICAgICAgYXV0
byBhZGphY2VudENvbGxhcHNlZEJvcmRlciA9IHN0ZDo6bWF4KGFkamFjZW50Qm9yZGVyQm90dG9t
LCBhZGphY2VudFJvd0JvdHRvbSk7CisgICAgICAgIGJvcmRlci52ZXJ0aWNhbC50b3AgPSBzdGQ6
Om1heChib3JkZXIudmVydGljYWwudG9wLCBhZGphY2VudENvbGxhcHNlZEJvcmRlcikgLyAyOwor
ICAgIH0KKyAgICAvLyBDb2xsYXBzZWQgYm9yZGVyIGJvdHRvbSBmcm9tIHRhYmxlLCByb3cgYW5k
IGFkamFjZW50IGNlbGxzLgorICAgIGlmIChjZWxsUG9zaXRpb24ucm93ID09IG1fZ3JpZC5yb3dz
KCkuc2l6ZSgpIC0gMSkKKyAgICAgICAgYm9yZGVyLnZlcnRpY2FsLmJvdHRvbSA9IGNvbGxhcHNl
ZEJvcmRlci0+dmVydGljYWwuYm90dG9tIC8gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgYXV0byBh
ZGphY2VudEJvcmRlclRvcCA9IGNvbXB1dGVkQm9yZGVyKG1fZ3JpZC5zbG90KHsgY2VsbFBvc2l0
aW9uLmNvbHVtbiwgY2VsbFBvc2l0aW9uLnJvdyArIDEgfSktPmNlbGwoKS5ib3goKSkudmVydGlj
YWwudG9wOworICAgICAgICBhdXRvIGFkamFjZW50Um93VG9wID0gY29tcHV0ZWRCb3JkZXIocm93
c1tjZWxsUG9zaXRpb24ucm93ICsgMV0uYm94KCkpLnZlcnRpY2FsLnRvcDsKKyAgICAgICAgYXV0
byBhZGphY2VudENvbGxhcHNlZEJvcmRlciA9IHN0ZDo6bWF4KGFkamFjZW50Qm9yZGVyVG9wLCBh
ZGphY2VudFJvd1RvcCk7CisgICAgICAgIGJvcmRlci52ZXJ0aWNhbC5ib3R0b20gPSBzdGQ6Om1h
eChib3JkZXIudmVydGljYWwuYm90dG9tLCBhZGphY2VudENvbGxhcHNlZEJvcmRlcikgLyAyOwor
ICAgIH0KKyAgICByZXR1cm4gYm9yZGVyOworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBUYWJs
ZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRDb2x1bW5XaWR0aChjb25zdCBD
b250YWluZXJCb3gmIGNvbHVtbkJveCkKK3sKKyAgICAvLyBDaGVjayBib3RoIHN0eWxlIGFuZCA8
Y29sPidzIHdpZHRoIGF0dHJpYnV0ZS4KKyAgICAvLyBGSVhNRTogRmlndXJlIG91dCB3aGF0IHRv
IGRvIHdpdGggY2FsY3VsYXRlZCB2YWx1ZXMsIGxpa2UgPGNvbCBzdHlsZT0id2lkdGg6IDEwJSI+
LgorICAgIGlmIChhdXRvIGNvbXB1dGVkV2lkdGhWYWx1ZSA9IGNvbXB1dGVkV2lkdGgoY29sdW1u
Qm94LCB7IH0pKQorICAgICAgICByZXR1cm4gY29tcHV0ZWRXaWR0aFZhbHVlOworICAgIHJldHVy
biBjb2x1bW5Cb3guY29sdW1uV2lkdGgoKTsKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Omlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JDZWxsKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2Vs
bCkKK3sKKyAgICBhdXRvJiBjZWxsQm94ID0gY2VsbC5ib3goKTsKKyAgICBhdXRvJiBzdHlsZSA9
IGNlbGxCb3guc3R5bGUoKTsKKworICAgIGF1dG8gY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzID0gWyZdKCkgLT4gRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMgeworICAgICAgICAvLyBFdmVuIGZpeGVkIHdpZHRoIGNlbGxzIGV4cGFuZCB0byB0aGVp
ciBtaW5pbXVtIGNvbnRlbnQgd2lkdGgKKyAgICAgICAgLy8gPHRkIHN0eWxlPSJ3aWR0aDogMTBw
eCI+dGVzdF9jb250ZW50PC90ZD4gd2lsbCBzaXplIHRvIG1heChtaW5pbXVtIGNvbnRlbnQgd2lk
dGgsIGNvbXB1dGVkIHdpZHRoKS4KKyAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzID0gRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9Owor
ICAgICAgICBpZiAoY2VsbEJveC5oYXNDaGlsZCgpKQorICAgICAgICAgICAgaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGNl
bGxCb3gsIGxheW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMo
KTsKKyAgICAgICAgaWYgKGF1dG8gZml4ZWRXaWR0aCA9IGZpeGVkVmFsdWUoc3R5bGUubG9naWNh
bFdpZHRoKCkpKQorICAgICAgICAgICAgcmV0dXJuIHsgc3RkOjptYXgoaW50cmluc2ljV2lkdGhD
b25zdHJhaW50cy5taW5pbXVtLCAqZml4ZWRXaWR0aCksIHN0ZDo6bWF4KGludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMubWluaW11bSwgKmZpeGVkV2lkdGgpIH07CisgICAgICAgIHJldHVybiBpbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzOworICAgIH07CisgICAgLy8gRklYTUUgQ2hlY2sgZm9yIGJv
eC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
ID0gY29uc3RyYWluQnlNaW5NYXhXaWR0aChjZWxsQm94LCBjb21wdXRlZEludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMoKSk7CisgICAgLy8gRXhwYW5kIHdpdGggYm9yZGVyCisgICAgaW50cmluc2lj
V2lkdGhDb25zdHJhaW50cy5leHBhbmQoY29tcHV0ZWRDZWxsQm9yZGVyKGNlbGwpLndpZHRoKCkp
OworICAgIC8vIHBhZGRpbmcKKyAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLmV4cGFuZChm
aXhlZFZhbHVlKHN0eWxlLnBhZGRpbmdMZWZ0KCkpLnZhbHVlT3IoMCkgKyBmaXhlZFZhbHVlKHN0
eWxlLnBhZGRpbmdSaWdodCgpKS52YWx1ZU9yKDApKTsKKyAgICAvLyBhbmQgbWFyZ2luCisgICAg
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQoZml4ZWRWYWx1ZShzdHlsZS5tYXJnaW5T
dGFydCgpKS52YWx1ZU9yKDApICsgZml4ZWRWYWx1ZShzdHlsZS5tYXJnaW5FbmQoKSkudmFsdWVP
cigwKSk7CisgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Cit9CisKKworSW5s
aW5lTGF5b3V0VW5pdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6dXNlZEJhc2Vs
aW5lRm9yQ2VsbChjb25zdCBDb250YWluZXJCb3gmIGNlbGxCb3gpCit7CisgICAgLy8gVGhlIGJh
c2VsaW5lIG9mIGEgY2VsbCBpcyBkZWZpbmVkIGFzIHRoZSBiYXNlbGluZSBvZiB0aGUgZmlyc3Qg
aW4tZmxvdyBsaW5lIGJveCBpbiB0aGUgY2VsbCwKKyAgICAvLyBvciB0aGUgZmlyc3QgaW4tZmxv
dyB0YWJsZS1yb3cgaW4gdGhlIGNlbGwsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KKyAgICAvLyBJ
ZiB0aGVyZSBpcyBubyBzdWNoIGxpbmUgYm94LCB0aGUgYmFzZWxpbmUgaXMgdGhlIGJvdHRvbSBv
ZiBjb250ZW50IGVkZ2Ugb2YgdGhlIGNlbGwgYm94LgorICAgIGlmIChjZWxsQm94LmVzdGFibGlz
aGVzSW5saW5lRm9ybWF0dGluZ0NvbnRleHQoKSkKKyAgICAgICAgcmV0dXJuIGxheW91dFN0YXRl
KCkuZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUoY2VsbEJveCkubGluZXMoKVswXS5i
YXNlbGluZSgpOworICAgIGZvciAoYXV0byYgY2VsbERlc2NlbmRhbnQgOiBkZXNjZW5kYW50c09m
VHlwZTxDb250YWluZXJCb3g+KGNlbGxCb3gpKSB7CisgICAgICAgIGlmIChjZWxsRGVzY2VuZGFu
dC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgICAgIGF1
dG8mIGlubGluZUZvcm1hdHRpbmdTdGF0ZUZvckNlbGwgPSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlz
aGVkSW5saW5lRm9ybWF0dGluZ1N0YXRlKGNlbGxEZXNjZW5kYW50KTsKKyAgICAgICAgICAgIGlm
ICghaW5saW5lRm9ybWF0dGluZ1N0YXRlRm9yQ2VsbC5saW5lcygpLmlzRW1wdHkoKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gaW5saW5lRm9ybWF0dGluZ1N0YXRlRm9yQ2VsbC5saW5lcygpWzBd
LmJhc2VsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNlbGxEZXNjZW5kYW50LmVzdGFi
bGlzaGVzVGFibGVGb3JtYXR0aW5nQ29udGV4dCgpKQorICAgICAgICAgICAgcmV0dXJuIGxheW91
dFN0YXRlKCkuZXN0YWJsaXNoZWRUYWJsZUZvcm1hdHRpbmdTdGF0ZShjZWxsRGVzY2VuZGFudCku
dGFibGVHcmlkKCkucm93cygpLmxpc3QoKVswXS5iYXNlbGluZSgpOworICAgIH0KKyAgICByZXR1
cm4gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChjZWxsQm94KS5jb250ZW50Qm94
Qm90dG9tKCk7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRp
bmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmI2NGE2MmRmZjA3MTRhZDY4ZmE3ODk2ODVmYmJiMjEzNzRmZjE1MzIKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3Rh
YmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApAQCAtMCwwICsx
LDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgor
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQorCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVy
Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
bmFtZXNwYWNlIExheW91dCB7CisKK2Jvb2wgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtz
OjpzaG91bGRJZ25vcmVDaGlsZENvbnRlbnRWZXJ0aWNhbE1hcmdpbihjb25zdCBDb250YWluZXJC
b3gmIGNlbGxCb3gpIGNvbnN0Cit7CisgICAgLy8gTm9ybWFsbHkgQkZDIHJvb3QgY29udGVudCBo
ZWlnaHQgdGFrZXMgdGhlIG1hcmdpbiBib3ggb2YgdGhlIGNoaWxkIGNvbnRlbnQgYXMgdmVydGlj
YWwgbWFyZ2lucyBkb24ndCBjb2xsYXBzZSB3aXRoIEJGQyByb290cywKKyAgICAvLyBidXQgdGFi
bGUgY2VsbCBib3hlcyBkbyBjb2xsYXBzZSB0aGVpciAobm9uLWV4aXN0aW5nKSBtYXJnaW5zIHdp
dGggY2hpbGQgcXVpcmsgbWFyZ2lucyAoc28gbXVjaCBxdWlyayksIHNvIGhlcmUgd2UgY2hlY2sK
KyAgICAvLyBpZiB0aGUgY29udGVudCBoZWlnaHQgc2hvdWxkIGluY2x1ZGUgbWFyZ2lucyBvciBu
b3QuCisgICAgLy8gZS5nIDx0YWJsZT48dHI+PHRkPjxwPnRleHQgY29udGVudDwvdGQ+PC90cj48
L3RhYmxlPiA8LSA8cD4ncyBxdWlyayBtYXJnaW4gY29sbGFwc2VzIHdpdGggdGhlIDx0ZD4gc28g
aXRzIGNvbnRlbnQKKyAgICAvLyBoZWlnaHQgc2hvdWxkIG5vdCBpbmNsdWRlIHZlcnRpY2FsIG1h
cmdpbnMuCisgICAgaWYgKCFsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgaWYgKGNlbGxCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFjZWxsQm94Lmhhc0lu
Rmxvd0NoaWxkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gY2VsbEJveC5m
aXJzdEluRmxvd0NoaWxkKCktPnN0eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSB8fCBjZWxs
Qm94Lmxhc3RJbkZsb3dDaGlsZCgpLT5zdHlsZSgpLmhhc01hcmdpbkFmdGVyUXVpcmsoKTsKK30K
KworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5n
L1RhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xMzEwZWY1ZTEzMjYwZDFhMzFm
YjFkOWU4NmUyYzZiNjIzYTY1OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5n
U3RhdGUuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
CisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisg
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIKKworI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4
dC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwo
VGFibGVGb3JtYXR0aW5nU3RhdGUpOworCitUYWJsZUZvcm1hdHRpbmdTdGF0ZTo6VGFibGVGb3Jt
YXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3Rh
dGUmIGxheW91dFN0YXRlLCBjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KQorICAgIDogRm9y
bWF0dGluZ1N0YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OlRhYmxlLCBsYXlvdXRT
dGF0ZSkKKyAgICAsIG1fdGFibGVHcmlkKFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmVuc3VyZVRh
YmxlR3JpZCh0YWJsZUJveCkpCit7Cit9CisKK1RhYmxlRm9ybWF0dGluZ1N0YXRlOjp+VGFibGVG
b3JtYXR0aW5nU3RhdGUoKQoreworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxl
Rm9ybWF0dGluZ1N0YXRlLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjdk
MWU0YWYwYjk2YWNjNGQzNDM0NWFhOWNmNmQ4M2Y3OGQ1M2M3NmYKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGlu
Zy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
cHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisj
aW5jbHVkZSAiRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiVGFibGVHcmlkLmgiCisjaW5j
bHVkZSA8d3RmL0lzb01hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYuaD4KKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKKy8vIFRhYmxlRm9ybWF0dGlu
Z1N0YXRlIGhvbGRzIHRoZSBzdGF0ZSBmb3IgYSBwYXJ0aWN1bGFyIHRhYmxlIGZvcm1hdHRpbmcg
Y29udGV4dCB0cmVlLgorY2xhc3MgVGFibGVGb3JtYXR0aW5nU3RhdGUgOiBwdWJsaWMgRm9ybWF0
dGluZ1N0YXRlIHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKFRhYmxlRm9ybWF0dGluZ1N0
YXRlKTsKK3B1YmxpYzoKKyAgICBUYWJsZUZvcm1hdHRpbmdTdGF0ZShSZWY8RmxvYXRpbmdTdGF0
ZT4mJiwgTGF5b3V0U3RhdGUmLCBjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KTsKKyAgICB+
VGFibGVGb3JtYXR0aW5nU3RhdGUoKTsKKworICAgIFRhYmxlR3JpZCYgdGFibGVHcmlkKCkgeyBy
ZXR1cm4gbV90YWJsZUdyaWQ7IH0KKyAgICBjb25zdCBUYWJsZUdyaWQmIHRhYmxlR3JpZCgpIGNv
bnN0IHsgcmV0dXJuIG1fdGFibGVHcmlkOyB9CisKK3ByaXZhdGU6CisgICAgVW5pcXVlUmVmPFRh
YmxlR3JpZD4gbV90YWJsZUdyaWQ7Cit9OworCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJ
VFNfTEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUoVGFibGVGb3JtYXR0aW5nU3RhdGUsIGlzVGFibGVG
b3JtYXR0aW5nU3RhdGUoKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuY3BwIGIv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcv
VGFibGVHcmlkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zYzQxZDhkMDhhNTI1ZTc1NmFiY2RjYjFhMjE1Yzlm
NDY1NmFjZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmNwcApAQCAtMCwwICsxLDE5
NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAq
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJUYWJsZUdy
aWQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVk
ZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNw
YWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChUYWJsZUdyaWQpOwor
CitUYWJsZUdyaWQ6OkNvbHVtbjo6Q29sdW1uKGNvbnN0IENvbnRhaW5lckJveCogY29sdW1uQm94
KQorICAgIDogbV9sYXlvdXRCb3gobWFrZVdlYWtQdHIoY29sdW1uQm94KSkKK3sKK30KKwordm9p
ZCBUYWJsZUdyaWQ6OkNvbHVtbjo6c2V0TG9naWNhbFdpZHRoKExheW91dFVuaXQgY29tcHV0ZWRM
b2dpY2FsV2lkdGgpCit7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICBtX2hhc0NvbXB1dGVkV2lk
dGggPSB0cnVlOworI2VuZGlmCisgICAgbV9jb21wdXRlZExvZ2ljYWxXaWR0aCA9IGNvbXB1dGVk
TG9naWNhbFdpZHRoOworfQorCitMYXlvdXRVbml0IFRhYmxlR3JpZDo6Q29sdW1uOjpsb2dpY2Fs
V2lkdGgoKSBjb25zdAoreworICAgIEFTU0VSVChtX2hhc0NvbXB1dGVkV2lkdGgpOworICAgIHJl
dHVybiBtX2NvbXB1dGVkTG9naWNhbFdpZHRoOworfQorCit2b2lkIFRhYmxlR3JpZDo6Q29sdW1u
OjpzZXRMb2dpY2FsTGVmdChMYXlvdXRVbml0IGNvbXB1dGVkTG9naWNhbExlZnQpCit7CisjaWYg
QVNTRVJUX0VOQUJMRUQKKyAgICBtX2hhc0NvbXB1dGVkTGVmdCA9IHRydWU7CisjZW5kaWYKKyAg
ICBtX2NvbXB1dGVkTG9naWNhbExlZnQgPSBjb21wdXRlZExvZ2ljYWxMZWZ0OworfQorCitMYXlv
dXRVbml0IFRhYmxlR3JpZDo6Q29sdW1uOjpsb2dpY2FsTGVmdCgpIGNvbnN0Cit7CisgICAgQVNT
RVJUKG1faGFzQ29tcHV0ZWRMZWZ0KTsKKyAgICByZXR1cm4gbV9jb21wdXRlZExvZ2ljYWxMZWZ0
OworfQorCitib29sIFRhYmxlR3JpZDo6Q29sdW1uOjppc0ZpeGVkV2lkdGgoKSBjb25zdAorewor
ICAgIHJldHVybiBoYXNGaXhlZFdpZHRoQ2VsbCgpIHx8IChib3goKSAmJiBib3goKS0+Y29sdW1u
V2lkdGgoKSk7Cit9CisKK3ZvaWQgVGFibGVHcmlkOjpDb2x1bW5zOjphZGRDb2x1bW4oY29uc3Qg
Q29udGFpbmVyQm94JiBjb2x1bW5Cb3gpCit7CisgICAgbV9jb2x1bW5MaXN0LmFwcGVuZCh7ICZj
b2x1bW5Cb3ggfSk7Cit9CisKK3ZvaWQgVGFibGVHcmlkOjpDb2x1bW5zOjphZGRBbm9ueW1vdXND
b2x1bW4oKQoreworICAgIG1fY29sdW1uTGlzdC5hcHBlbmQoeyBudWxscHRyIH0pOworfQorCiti
b29sIFRhYmxlR3JpZDo6Q29sdW1uczo6aGFzRml4ZWRDb2x1bW5zT25seSgpIGNvbnN0Cit7Cisg
ICAgZm9yIChhdXRvJiBjb2x1bW4gOiBtX2NvbHVtbkxpc3QpIHsKKyAgICAgICAgaWYgKCFjb2x1
bW4uaXNGaXhlZFdpZHRoKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg
IHJldHVybiB0cnVlOworfQorCit2b2lkIFRhYmxlR3JpZDo6Um93czo6YWRkUm93KGNvbnN0IENv
bnRhaW5lckJveCYgcm93Qm94KQoreworICAgIG1fcm93TGlzdC5hcHBlbmQoeyByb3dCb3ggfSk7
Cit9CisKK1RhYmxlR3JpZDo6Um93OjpSb3coY29uc3QgQ29udGFpbmVyQm94JiByb3dCb3gpCisg
ICAgOiBtX2xheW91dEJveChtYWtlV2Vha1B0cihyb3dCb3gpKQoreworfQorCitUYWJsZUdyaWQ6
OkNlbGw6OkNlbGwoY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94LCBTbG90UG9zaXRpb24gcG9z
aXRpb24sIENlbGxTcGFuIHNwYW4pCisgICAgOiBtX2xheW91dEJveChtYWtlV2Vha1B0cihjZWxs
Qm94KSkKKyAgICAsIG1fcG9zaXRpb24ocG9zaXRpb24pCisgICAgLCBtX3NwYW4oc3BhbikKK3sK
K30KKworYm9vbCBUYWJsZUdyaWQ6OkNlbGw6OmlzRml4ZWRXaWR0aCgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGJveCgpLnN0eWxlKCkubG9naWNhbFdpZHRoKCkuaXNGaXhlZCgpOworfQorCitUYWJs
ZUdyaWQ6OlNsb3Q6OlNsb3QoQ2VsbCYgY2VsbCwgYm9vbCBpc0NvbHVtblNwYW5uZWQsIGJvb2wg
aXNSb3dTcGFubmVkKQorICAgIDogbV9jZWxsKG1ha2VXZWFrUHRyKGNlbGwpKQorICAgICwgbV9p
c0NvbHVtblNwYW5uZWQoaXNDb2x1bW5TcGFubmVkKQorICAgICwgbV9pc1Jvd1NwYW5uZWQoaXNS
b3dTcGFubmVkKQoreworfQorCitUYWJsZUdyaWQ6OlRhYmxlR3JpZCgpCit7Cit9CisKK1RhYmxl
R3JpZDo6U2xvdCogVGFibGVHcmlkOjpzbG90KFNsb3RQb3NpdGlvbiBwb3NpdGlvbikKK3sKKyAg
ICByZXR1cm4gbV9zbG90TWFwLmdldChwb3NpdGlvbik7Cit9CisKK3ZvaWQgVGFibGVHcmlkOjph
cHBlbmRDZWxsKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCkKK3sKKyAgICBhdXRvIHJvd1Nw
YW4gPSBjZWxsQm94LnJvd1NwYW4oKTsKKyAgICBhdXRvIGNvbHVtblNwYW4gPSBjZWxsQm94LmNv
bHVtblNwYW4oKTsKKyAgICBhdXRvIGlzSW5OZXdSb3cgPSAhY2VsbEJveC5wcmV2aW91c1NpYmxp
bmcoKTsKKyAgICBhdXRvIGluaXRpYWxTbG90UG9zaXRpb24gPSBTbG90UG9zaXRpb24geyB9Owor
CisgICAgaWYgKCFtX2NlbGxzLmlzRW1wdHkoKSkgeworICAgICAgICBhdXRvJiBsYXN0Q2VsbCA9
IG1fY2VsbHMubGFzdCgpOworICAgICAgICBhdXRvIGxhc3RTbG90UG9zaXRpb24gPSBsYXN0Q2Vs
bC0+cG9zaXRpb24oKTsKKyAgICAgICAgLy8gRmlyc3QgdGFibGUgY2VsbCBpbiB0aGlzIHJvdz8K
KyAgICAgICAgaWYgKGlzSW5OZXdSb3cpCisgICAgICAgICAgICBpbml0aWFsU2xvdFBvc2l0aW9u
ID0gU2xvdFBvc2l0aW9uIHsgMCwgbGFzdFNsb3RQb3NpdGlvbi5yb3cgKyAxIH07CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIGluaXRpYWxTbG90UG9zaXRpb24gPSBTbG90UG9zaXRpb24geyBs
YXN0U2xvdFBvc2l0aW9uLmNvbHVtbiArIDEsIGxhc3RTbG90UG9zaXRpb24ucm93IH07CisKKyAg
ICAgICAgLy8gUGljayB0aGUgbmV4dCBhdmFpbGFibGUgc2xvdCBieSBhdm9pZGluZyByb3cgYW5k
IGNvbHVtbiBzcGFubmVycy4KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlm
ICghbV9zbG90TWFwLmNvbnRhaW5zKGluaXRpYWxTbG90UG9zaXRpb24pKQorICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgKytpbml0aWFsU2xvdFBvc2l0aW9uLmNvbHVtbjsKKyAg
ICAgICAgfQorICAgIH0KKyAgICBhdXRvIGNlbGwgPSBtYWtlVW5pcXVlPENlbGw+KGNlbGxCb3gs
IGluaXRpYWxTbG90UG9zaXRpb24sIENlbGxTcGFuIHsgY29sdW1uU3Bhbiwgcm93U3BhbiB9KTsK
KyAgICAvLyBSb3cgYW5kIGNvbHVtbiBzcGFubmVycyBjcmVhdGUgYWRkaXRpb25hbCBzbG90cy4K
KyAgICBmb3IgKHNpemVfdCByb3cgPSAwOyByb3cgPCByb3dTcGFuOyArK3JvdykgeworICAgICAg
ICBmb3IgKGF1dG8gY29sdW1uID0gY2VsbC0+c3RhcnRDb2x1bW4oKTsgY29sdW1uIDwgY2VsbC0+
ZW5kQ29sdW1uKCk7ICsrY29sdW1uKSB7CisgICAgICAgICAgICBhdXRvIHBvc2l0aW9uID0gU2xv
dFBvc2l0aW9uIHsgY29sdW1uLCBjZWxsLT5zdGFydFJvdygpICsgcm93IH07CisgICAgICAgICAg
ICBBU1NFUlQoIW1fc2xvdE1hcC5jb250YWlucyhwb3NpdGlvbikpOworICAgICAgICAgICAgLy8g
VGhpcyBzbG90IGlzIHNwYW5uZWQgYnkgYSBjZWxsIGF0IHRoZSBpbml0aWFsIHNsb3cgcG9zaXRp
b24uCisgICAgICAgICAgICBhdXRvIGlzQ29sdW1uU3Bhbm5lZCA9IGNvbHVtbiAhPSBjZWxsLT5z
dGFydENvbHVtbigpOworICAgICAgICAgICAgYXV0byBpc1Jvd1NwYW5uZWQgPSAhIXJvdzsKKyAg
ICAgICAgICAgIG1fc2xvdE1hcC5hZGQocG9zaXRpb24sIG1ha2VVbmlxdWU8U2xvdD4oKmNlbGws
IGlzQ29sdW1uU3Bhbm5lZCwgaXNSb3dTcGFubmVkKSk7CisgICAgICAgIH0KKyAgICB9CisgICAg
Ly8gSW5pdGlhbGl6ZSBjb2x1bW5zL3Jvd3MgaWYgbmVlZGVkLgorICAgIGF1dG8gbWlzc2luZ051
bWJlck9mQ29sdW1ucyA9IHN0ZDo6bWF4PGludD4oMCwgaW5pdGlhbFNsb3RQb3NpdGlvbi5jb2x1
bW4gKyBjb2x1bW5TcGFuIC0gbV9jb2x1bW5zLnNpemUoKSk7CisgICAgZm9yIChhdXRvIGNvbHVt
biA9IDA7IGNvbHVtbiA8IG1pc3NpbmdOdW1iZXJPZkNvbHVtbnM7ICsrY29sdW1uKQorICAgICAg
ICBtX2NvbHVtbnMuYWRkQW5vbnltb3VzQ29sdW1uKCk7CisKKyAgICBpZiAoY2VsbC0+aXNGaXhl
ZFdpZHRoKCkpIHsKKyAgICAgICAgZm9yIChhdXRvIGNvbHVtbiA9IGNlbGwtPnN0YXJ0Q29sdW1u
KCk7IGNvbHVtbiA8IGNlbGwtPmVuZENvbHVtbigpOyArK2NvbHVtbikKKyAgICAgICAgICAgIG1f
Y29sdW1ucy5saXN0KClbY29sdW1uXS5zZXRIYXNGaXhlZFdpZHRoQ2VsbCgpOworICAgIH0KKwor
ICAgIGlmIChpc0luTmV3Um93KQorICAgICAgICBtX3Jvd3MuYWRkUm93KGNlbGxCb3gucGFyZW50
KCkpOworCisgICAgbV9jZWxscy5hZGQoV1RGTW92ZShjZWxsKSk7Cit9CisKK3ZvaWQgVGFibGVH
cmlkOjppbnNlcnRDZWxsKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCwgY29uc3QgQ29udGFp
bmVyQm94JiBiZWZvcmUpCit7CisgICAgVU5VU0VEX1BBUkFNKGNlbGxCb3gpOworICAgIFVOVVNF
RF9QQVJBTShiZWZvcmUpOworfQorCit2b2lkIFRhYmxlR3JpZDo6cmVtb3ZlQ2VsbChjb25zdCBD
b250YWluZXJCb3gmIGNlbGxCb3gpCit7CisgICAgVU5VU0VEX1BBUkFNKGNlbGxCb3gpOworfQor
Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlR3JpZC5oIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmgKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uNjI1YTNmNDRiZjYyMjFjZTQ2NTI1OTQwOTEzZWNlMTBiMDZhYWNlZgotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFi
bGVmb3JtYXR0aW5nL1RhYmxlR3JpZC5oCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKwor
I2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIK
KyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKyNp
bmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorI2luY2x1ZGUgPHd0Zi9MaXN0SGFzaFNl
dC5oPgorI2luY2x1ZGUgPHd0Zi9XZWFrUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25h
bWVzcGFjZSBMYXlvdXQgeworY2xhc3MgQm94OworY2xhc3MgQ29udGFpbmVyQm94OworCitjbGFz
cyBUYWJsZUdyaWQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVHcmlkKTsKK3B1
YmxpYzoKKyAgICBUYWJsZUdyaWQoKTsKKworICAgIHZvaWQgYXBwZW5kQ2VsbChjb25zdCBDb250
YWluZXJCb3gmKTsKKyAgICB2b2lkIGluc2VydENlbGwoY29uc3QgQ29udGFpbmVyQm94JiwgY29u
c3QgQ29udGFpbmVyQm94JiBiZWZvcmUpOworICAgIHZvaWQgcmVtb3ZlQ2VsbChjb25zdCBDb250
YWluZXJCb3gmKTsKKworICAgIHZvaWQgc2V0SG9yaXpvbnRhbFNwYWNpbmcoTGF5b3V0VW5pdCBo
b3Jpem9udGFsU3BhY2luZykgeyBtX2hvcml6b250YWxTcGFjaW5nID0gaG9yaXpvbnRhbFNwYWNp
bmc7IH0KKyAgICBMYXlvdXRVbml0IGhvcml6b250YWxTcGFjaW5nKCkgY29uc3QgeyByZXR1cm4g
bV9ob3Jpem9udGFsU3BhY2luZzsgfQorCisgICAgdm9pZCBzZXRWZXJ0aWNhbFNwYWNpbmcoTGF5
b3V0VW5pdCB2ZXJ0aWNhbFNwYWNpbmcpIHsgbV92ZXJ0aWNhbFNwYWNpbmcgPSB2ZXJ0aWNhbFNw
YWNpbmc7IH0KKyAgICBMYXlvdXRVbml0IHZlcnRpY2FsU3BhY2luZygpIGNvbnN0IHsgcmV0dXJu
IG1fdmVydGljYWxTcGFjaW5nOyB9CisKKyAgICB2b2lkIHNldENvbGxhcHNlZEJvcmRlcihjb25z
dCBFZGdlcyYgY29sbGFwc2VkQm9yZGVyKSB7IG1fY29sbGFwc2VkQm9yZGVyID0gY29sbGFwc2Vk
Qm9yZGVyOyB9CisgICAgT3B0aW9uYWw8RWRnZXM+IGNvbGxhcHNlZEJvcmRlcigpIGNvbnN0IHsg
cmV0dXJuIG1fY29sbGFwc2VkQm9yZGVyOyB9CisKKyAgICB2b2lkIHNldFdpZHRoQ29uc3RyYWlu
dHMoRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2lj
V2lkdGhDb25zdHJhaW50cykgeyBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzOyB9CisgICAgT3B0aW9uYWw8Rm9ybWF0dGluZ0NvbnRleHQ6Oklu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHM+IHdpZHRoQ29uc3RyYWludHMoKSBjb25zdCB7IHJldHVy
biBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7IH0KKworICAgIGJvb2wgaXNFbXB0eSgpIGNv
bnN0IHsgcmV0dXJuIG1fc2xvdE1hcC5pc0VtcHR5KCk7IH0KKyAgICAvLyBDb2x1bW4gcmVwcmVz
ZW50cyBhIHZlcnRpY2FsIHNldCBvZiBzbG90cyBpbiB0aGUgZ3JpZC4gQSBjb2x1bW4gaGFzIGhv
cml6b250YWwgcG9zaXRpb24gYW5kIHdpZHRoLgorICAgIGNsYXNzIENvbHVtbiB7CisgICAgcHVi
bGljOgorICAgICAgICBDb2x1bW4oY29uc3QgQ29udGFpbmVyQm94Kik7CisKKyAgICAgICAgdm9p
ZCBzZXRMb2dpY2FsTGVmdChMYXlvdXRVbml0KTsKKyAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2Fs
TGVmdCgpIGNvbnN0OworICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0IHsg
cmV0dXJuIGxvZ2ljYWxMZWZ0KCkgKyBsb2dpY2FsV2lkdGgoKTsgfQorICAgICAgICB2b2lkIHNl
dExvZ2ljYWxXaWR0aChMYXlvdXRVbml0KTsKKyAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsV2lk
dGgoKSBjb25zdDsKKworICAgICAgICBib29sIGlzRml4ZWRXaWR0aCgpIGNvbnN0OworCisgICAg
ICAgIHZvaWQgc2V0SGFzRml4ZWRXaWR0aENlbGwoKSB7IG1faGFzRml4ZWRXaWR0aENlbGwgPSB0
cnVlOyB9CisgICAgICAgIGNvbnN0IENvbnRhaW5lckJveCogYm94KCkgY29uc3QgeyByZXR1cm4g
bV9sYXlvdXRCb3guZ2V0KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgaGFzRml4
ZWRXaWR0aENlbGwoKSBjb25zdCB7IHJldHVybiBtX2hhc0ZpeGVkV2lkdGhDZWxsOyB9CisKKyAg
ICAgICAgTGF5b3V0VW5pdCBtX2NvbXB1dGVkTG9naWNhbFdpZHRoOworICAgICAgICBMYXlvdXRV
bml0IG1fY29tcHV0ZWRMb2dpY2FsTGVmdDsKKyAgICAgICAgV2Vha1B0cjxjb25zdCBDb250YWlu
ZXJCb3g+IG1fbGF5b3V0Qm94OworICAgICAgICBib29sIG1faGFzRml4ZWRXaWR0aENlbGwgeyBm
YWxzZSB9OworCisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICAgICAgYm9vbCBtX2hhc0NvbXB1dGVk
V2lkdGggeyBmYWxzZSB9OworICAgICAgICBib29sIG1faGFzQ29tcHV0ZWRMZWZ0IHsgZmFsc2Ug
fTsKKyNlbmRpZgorICAgIH07CisKKyAgICBjbGFzcyBDb2x1bW5zIHsKKyAgICBwdWJsaWM6Cisg
ICAgICAgIHVzaW5nIENvbHVtbkxpc3QgPSBWZWN0b3I8Q29sdW1uPjsKKyAgICAgICAgQ29sdW1u
TGlzdCYgbGlzdCgpIHsgcmV0dXJuIG1fY29sdW1uTGlzdDsgfQorICAgICAgICBjb25zdCBDb2x1
bW5MaXN0JiBsaXN0KCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0OyB9CisgICAgICAgIHNp
emVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0LnNpemUoKTsgfQorCisgICAg
ICAgIHZvaWQgYWRkQ29sdW1uKGNvbnN0IENvbnRhaW5lckJveCYpOworICAgICAgICB2b2lkIGFk
ZEFub255bW91c0NvbHVtbigpOworCisgICAgICAgIExheW91dFVuaXQgbG9naWNhbFdpZHRoKCkg
Y29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0Lmxhc3QoKS5sb2dpY2FsUmlnaHQoKSAtIG1fY29s
dW1uTGlzdC5maXJzdCgpLmxvZ2ljYWxMZWZ0KCk7IH0KKyAgICAgICAgYm9vbCBoYXNGaXhlZENv
bHVtbnNPbmx5KCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBDb2x1bW5MaXN0IG1f
Y29sdW1uTGlzdDsKKyAgICB9OworCisgICAgY2xhc3MgUm93IHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIFJvdyhjb25zdCBDb250YWluZXJCb3gmKTsKKworICAgICAgICB2b2lkIHNldExvZ2ljYWxU
b3AoTGF5b3V0VW5pdCBsb2dpY2FsVG9wKSB7IG1fbG9naWNhbFRvcCA9IGxvZ2ljYWxUb3A7IH0K
KyAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2Fs
VG9wOyB9CisgICAgICAgIExheW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJu
IGxvZ2ljYWxUb3AoKSArIGxvZ2ljYWxIZWlnaHQoKTsgfQorCisgICAgICAgIHZvaWQgc2V0TG9n
aWNhbEhlaWdodChMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQpIHsgbV9sb2dpY2FsSGVpZ2h0ID0g
bG9naWNhbEhlaWdodDsgfQorICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQoKSBjb25z
dCB7IHJldHVybiBtX2xvZ2ljYWxIZWlnaHQ7IH0KKworICAgICAgICB2b2lkIHNldEJhc2VsaW5l
KElubGluZUxheW91dFVuaXQgYmFzZWxpbmUpIHsgbV9iYXNlbGluZSA9IGJhc2VsaW5lOyB9Cisg
ICAgICAgIElubGluZUxheW91dFVuaXQgYmFzZWxpbmUoKSBjb25zdCB7IHJldHVybiBtX2Jhc2Vs
aW5lOyB9CisKKyAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25zdCB7IHJldHVy
biAqbV9sYXlvdXRCb3guZ2V0KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIExheW91dFVu
aXQgbV9sb2dpY2FsVG9wOworICAgICAgICBMYXlvdXRVbml0IG1fbG9naWNhbEhlaWdodDsKKyAg
ICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OworICAgICAgICBXZWFrUHRy
PGNvbnN0IENvbnRhaW5lckJveD4gbV9sYXlvdXRCb3g7CisgICAgfTsKKworICAgIGNsYXNzIFJv
d3MgeworICAgIHB1YmxpYzoKKyAgICAgICAgdXNpbmcgUm93TGlzdCA9IFZlY3RvcjxSb3c+Owor
ICAgICAgICBSb3dMaXN0JiBsaXN0KCkgeyByZXR1cm4gbV9yb3dMaXN0OyB9CisgICAgICAgIGNv
bnN0IFJvd0xpc3QmIGxpc3QoKSBjb25zdCB7IHJldHVybiBtX3Jvd0xpc3Q7IH0KKworICAgICAg
ICB2b2lkIGFkZFJvdyhjb25zdCBDb250YWluZXJCb3gmKTsKKworICAgICAgICBzaXplX3Qgc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcm93TGlzdC5zaXplKCk7IH0KKworICAgIHByaXZhdGU6Cisg
ICAgICAgIFJvd0xpc3QgbV9yb3dMaXN0OworICAgIH07CisKKyAgICAvLyBDZWxsIHJlcHJlc2Vu
dHMgYSA8dGQ+IG9yIDx0aD4uIEl0IGNhbiBzcGFuIG11bHRpcGxlIHNsb3RzIGluIHRoZSBncmlk
LgorICAgIGNsYXNzIENlbGwgOiBwdWJsaWMgQ2FuTWFrZVdlYWtQdHI8Q2VsbD4geworICAgICAg
ICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lOTElORShDZWxsKTsKKyAgICBwdWJsaWM6CisgICAg
ICAgIENlbGwoY29uc3QgQ29udGFpbmVyQm94JiwgU2xvdFBvc2l0aW9uLCBDZWxsU3Bhbik7CisK
KyAgICAgICAgc2l6ZV90IHN0YXJ0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbi5j
b2x1bW47IH0KKyAgICAgICAgc2l6ZV90IGVuZENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1fcG9z
aXRpb24uY29sdW1uICsgbV9zcGFuLmNvbHVtbjsgfQorCisgICAgICAgIHNpemVfdCBzdGFydFJv
dygpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb24ucm93OyB9CisgICAgICAgIHNpemVfdCBlbmRS
b3coKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aW9uLnJvdyArIG1fc3Bhbi5yb3c7IH0KKworICAg
ICAgICBzaXplX3QgY29sdW1uU3BhbigpIGNvbnN0IHsgcmV0dXJuIG1fc3Bhbi5jb2x1bW47IH0K
KyAgICAgICAgc2l6ZV90IHJvd1NwYW4oKSBjb25zdCB7IHJldHVybiBtX3NwYW4ucm93OyB9CisK
KyAgICAgICAgU2xvdFBvc2l0aW9uIHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlv
bjsgfQorICAgICAgICBDZWxsU3BhbiBzcGFuKCkgY29uc3QgeyByZXR1cm4gbV9zcGFuOyB9CisK
KyAgICAgICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKSB7IG1f
YmFzZWxpbmUgPSBiYXNlbGluZTsgfQorICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5l
KCkgY29uc3QgeyByZXR1cm4gbV9iYXNlbGluZTsgfQorCisgICAgICAgIGJvb2wgaXNGaXhlZFdp
ZHRoKCkgY29uc3Q7CisKKyAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25zdCB7
IHJldHVybiAqbV9sYXlvdXRCb3guZ2V0KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFdl
YWtQdHI8Y29uc3QgQ29udGFpbmVyQm94PiBtX2xheW91dEJveDsKKyAgICAgICAgU2xvdFBvc2l0
aW9uIG1fcG9zaXRpb247CisgICAgICAgIENlbGxTcGFuIG1fc3BhbjsKKyAgICAgICAgSW5saW5l
TGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OworICAgIH07CisKKyAgICBjbGFzcyBTbG90IHsK
KyAgICBwdWJsaWM6CisgICAgICAgIFdURl9NQUtFX1NUUlVDVF9GQVNUX0FMTE9DQVRFRDsKKyAg
ICAgICAgU2xvdCgpID0gZGVmYXVsdDsKKyAgICAgICAgU2xvdChDZWxsJiwgYm9vbCBpc0NvbHVt
blNwYW5uZWQsIGJvb2wgaXNSb3dTcGFubmVkKTsKKworICAgICAgICBjb25zdCBDZWxsJiBjZWxs
KCkgY29uc3QgeyByZXR1cm4gKm1fY2VsbDsgfQorICAgICAgICBDZWxsJiBjZWxsKCkgeyByZXR1
cm4gKm1fY2VsbDsgfQorCisgICAgICAgIGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzJiB3aWR0aENvbnN0cmFpbnRzKCkgY29uc3QgeyByZXR1cm4gbV93
aWR0aENvbnN0cmFpbnRzOyB9CisgICAgICAgIHZvaWQgc2V0V2lkdGhDb25zdHJhaW50cyhjb25z
dCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgd2lkdGhDb25z
dHJhaW50cykgeyBtX3dpZHRoQ29uc3RyYWludHMgPSB3aWR0aENvbnN0cmFpbnRzOyB9CisKKyAg
ICAgICAgLy8gSW5pdGlhbCBzbG90IHBvc2l0aW9uIGZvciBhIHNwYW5uaW5nIGNlbGwuCisgICAg
ICAgIC8vIDx0ZD48L3RkPjx0ZCBjb2xzcGFuPTI+PC90ZD4gWzEsIDBdIHNsb3QgaGFzIGNvbHVt
biBzcGFuIG9mIDIuCisgICAgICAgIGJvb2wgaGFzQ29sdW1uU3BhbigpIGNvbnN0IHsgcmV0dXJu
IG1fY2VsbC0+Y29sdW1uU3BhbigpID4gMSAmJiAhaXNDb2x1bW5TcGFubmVkKCk7IH0KKyAgICAg
ICAgYm9vbCBoYXNSb3dTcGFuKCkgY29uc3QgeyByZXR1cm4gbV9jZWxsLT5yb3dTcGFuKCkgPiAx
ICYmICFpc1Jvd1NwYW5uZWQoKTsgfQorCisgICAgICAgIC8vIE5vbi1pbml0aWFsIHNwYW5uZWQg
c2xvdC4KKyAgICAgICAgLy8gPHRkPjwvdGQ+PHRkIGNvbHNwYW49Mj48L3RkPiBbMiwgMF0gc2xv
dCBpcyBjb2x1bW4gc3Bhbm5lZCBieSBbMSwgMF0uCisgICAgICAgIC8vIDx0ZD48L3RkPjx0ZD48
L3RkPjx0ZD48L3RkPgorICAgICAgICBib29sIGlzQ29sdW1uU3Bhbm5lZCgpIGNvbnN0IHsgcmV0
dXJuIG1faXNDb2x1bW5TcGFubmVkOyB9CisgICAgICAgIGJvb2wgaXNSb3dTcGFubmVkKCkgY29u
c3QgeyByZXR1cm4gbV9pc1Jvd1NwYW5uZWQ7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFdl
YWtQdHI8Q2VsbD4gbV9jZWxsOworICAgICAgICBib29sIG1faXNDb2x1bW5TcGFubmVkIHsgZmFs
c2UgfTsKKyAgICAgICAgYm9vbCBtX2lzUm93U3Bhbm5lZCB7IGZhbHNlIH07CisgICAgICAgIEZv
cm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIG1fd2lkdGhDb25zdHJh
aW50czsKKyAgICB9OworCisgICAgY29uc3QgQ29sdW1ucyYgY29sdW1ucygpIGNvbnN0IHsgcmV0
dXJuIG1fY29sdW1uczsgfQorICAgIENvbHVtbnMmIGNvbHVtbnMoKSB7IHJldHVybiBtX2NvbHVt
bnM7IH0KKworICAgIGNvbnN0IFJvd3MmIHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3M7IH0K
KyAgICBSb3dzJiByb3dzKCkgeyByZXR1cm4gbV9yb3dzOyB9CisKKyAgICB1c2luZyBDZWxscyA9
IFdURjo6TGlzdEhhc2hTZXQ8c3RkOjp1bmlxdWVfcHRyPENlbGw+PjsKKyAgICBDZWxscyYgY2Vs
bHMoKSB7IHJldHVybiBtX2NlbGxzOyB9CisKKyAgICBTbG90KiBzbG90KFNsb3RQb3NpdGlvbik7
CisgICAgY29uc3QgU2xvdCogc2xvdChTbG90UG9zaXRpb24gcG9zaXRpb24pIGNvbnN0IHsgcmV0
dXJuIG1fc2xvdE1hcC5nZXQocG9zaXRpb24pOyB9CisgICAgYm9vbCBpc1NwYW5uZWQoU2xvdFBv
c2l0aW9uKTsKKworcHJpdmF0ZToKKyAgICB1c2luZyBTbG90TWFwID0gV1RGOjpIYXNoTWFwPFNs
b3RQb3NpdGlvbiwgc3RkOjp1bmlxdWVfcHRyPFNsb3Q+PjsKKworICAgIENvbHVtbnMgbV9jb2x1
bW5zOworICAgIFJvd3MgbV9yb3dzOworICAgIENlbGxzIG1fY2VsbHM7CisgICAgU2xvdE1hcCBt
X3Nsb3RNYXA7CisKKyAgICBMYXlvdXRVbml0IG1faG9yaXpvbnRhbFNwYWNpbmc7CisgICAgTGF5
b3V0VW5pdCBtX3ZlcnRpY2FsU3BhY2luZzsKKyAgICBPcHRpb25hbDxGb3JtYXR0aW5nQ29udGV4
dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cz4gbV9pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
OworICAgIE9wdGlvbmFsPEVkZ2VzPiBtX2NvbGxhcHNlZEJvcmRlcjsKK307CisKK30KK30KKwor
I2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUxheW91dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUxheW91dC5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uMjMzNTJjNWExN2Y4YzBiM2QzZDI0NGU5MjVhN2VmMjQ4MTk4YThkMwotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFi
bGVmb3JtYXR0aW5nL1RhYmxlTGF5b3V0LmNwcApAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisg
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQor
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdDb250ZXh0
LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUg
IkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCisvLyBodHRwczovL3d3dy53My5vcmcv
VFIvY3NzLXRhYmxlcy0zLyN0YWJsZS1sYXlvdXQtYWxnb3JpdGhtCitUYWJsZUZvcm1hdHRpbmdD
b250ZXh0OjpUYWJsZUxheW91dDo6VGFibGVMYXlvdXQoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29u
dGV4dCYgZm9ybWF0dGluZ0NvbnRleHQsIGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkKKyAgICA6IG1f
Zm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHQpCisgICAgLCBtX2dyaWQoZ3JpZCkK
K3sKK30KKworc3RydWN0IENvbHVtblNwYW4geworICAgIHN0YXRpYyBzaXplX3QgaGFzU3Bhbihj
b25zdCBUYWJsZUdyaWQ6OlNsb3QmIHNsb3QpIHsgcmV0dXJuIHNsb3QuaGFzQ29sdW1uU3Bhbigp
OyB9CisgICAgc3RhdGljIHNpemVfdCBpc1NwYW5uZWQoY29uc3QgVGFibGVHcmlkOjpTbG90JiBz
bG90KSB7IHJldHVybiBzbG90LmlzQ29sdW1uU3Bhbm5lZCgpOyB9CisKKyAgICBzdGF0aWMgc2l6
ZV90IHNwYW5Db3VudChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJuIGNlbGwu
Y29sdW1uU3BhbigpOyB9CisgICAgc3RhdGljIHNpemVfdCBzdGFydFNwYW4oY29uc3QgVGFibGVH
cmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBjZWxsLnN0YXJ0Q29sdW1uKCk7IH0KKyAgICBzdGF0
aWMgc2l6ZV90IGVuZFNwYW4oY29uc3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBj
ZWxsLmVuZENvbHVtbigpOyB9CisKKyAgICBzdGF0aWMgc2l6ZV90IGluZGV4KHNpemVfdCBjb2x1
bW5JbmRleCwgc2l6ZV90IC8qcm93SW5kZXgqLykgeyByZXR1cm4gY29sdW1uSW5kZXg7IH0KKyAg
ICBzdGF0aWMgc2l6ZV90IHNpemUoY29uc3QgVGFibGVHcmlkJiBncmlkKSB7IHJldHVybiBncmlk
LmNvbHVtbnMoKS5zaXplKCk7IH0KKworICAgIHN0YXRpYyBMYXlvdXRVbml0IHNwYWNpbmcoY29u
c3QgVGFibGVHcmlkJiBncmlkKSB7IHJldHVybiBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7IH0K
K307CisKK3N0cnVjdCBSb3dTcGFuIHsKKyAgICBzdGF0aWMgc2l6ZV90IGhhc1NwYW4oY29uc3Qg
VGFibGVHcmlkOjpTbG90JiBzbG90KSB7IHJldHVybiBzbG90Lmhhc1Jvd1NwYW4oKTsgfQorICAg
IHN0YXRpYyBzaXplX3QgaXNTcGFubmVkKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCkgeyBy
ZXR1cm4gc2xvdC5pc1Jvd1NwYW5uZWQoKTsgfQorCisgICAgc3RhdGljIHNpemVfdCBzcGFuQ291
bnQoY29uc3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBjZWxsLnJvd1NwYW4oKTsg
fQorICAgIHN0YXRpYyBzaXplX3Qgc3RhcnRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2Vs
bCkgeyByZXR1cm4gY2VsbC5zdGFydFJvdygpOyB9CisgICAgc3RhdGljIHNpemVfdCBlbmRTcGFu
KGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5lbmRSb3coKTsgfQor
CisgICAgc3RhdGljIHNpemVfdCBpbmRleChzaXplX3QgLypjb2x1bW5JbmRleCovLCBzaXplX3Qg
cm93SW5kZXgpIHsgcmV0dXJuIHJvd0luZGV4OyB9CisgICAgc3RhdGljIHNpemVfdCBzaXplKGNv
bnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5yb3dzKCkuc2l6ZSgpOyB9CisKKyAg
ICBzdGF0aWMgTGF5b3V0VW5pdCBzcGFjaW5nKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1
cm4gZ3JpZC52ZXJ0aWNhbFNwYWNpbmcoKTsgfQorfTsKKworc3RydWN0IEdyaWRTcGFjZSB7Cisg
ICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIXZhbHVlOyB9CisKKyAgICAvLyBJbml0
aWFsIHdpZHRoL2hlaWdodCBmb3IgY29sdW1uL3JvdyB3ZSBzdGFydCB0aGUgZGlzdHJpYnV0aW9u
IHdpZHRoICh1c3VhbGx5IGEgbWludW11bSB3aWR0aCkuCisgICAgZmxvYXQgdmFsdWUgeyAwIH07
CisgICAgLy8gVGhlIGJhc2UgdG8gY29tcHV0ZSB0aGUgZGlzdHJpYnV0aW9uIHJhdGlvLiBJdCBu
b3JtYWxseSBtYXRjaGVzIHRoZSBbdmFsdWVdIGJ1dCBpbiBzb21lIGNhc2VzIHdlIHVzZSB0aGUg
bWF4aW11bSB2YWx1ZSB0byBkaXN0cmlidXRlIHRoZSBleHRyYSBzcGFjZS4gCisgICAgZmxvYXQg
ZGlzdHJpYnV0aW9uQmFzZSB7IDAgfTsKK307CisKK2lubGluZSBzdGF0aWMgR3JpZFNwYWNlIG1h
eChjb25zdCBHcmlkU3BhY2UmIGEsIGNvbnN0IEdyaWRTcGFjZSYgYikKK3sKKyAgICByZXR1cm4g
eyBzdGQ6Om1heChhLnZhbHVlLCBiLnZhbHVlKSwgc3RkOjptYXgoYS5kaXN0cmlidXRpb25CYXNl
LCBiLmRpc3RyaWJ1dGlvbkJhc2UpIH07Cit9CisKK2lubGluZSBzdGF0aWMgR3JpZFNwYWNlJiBv
cGVyYXRvci0oR3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCit7CisgICAgYS52YWx1
ZSA9IHN0ZDo6bWF4KDAuMGYsIGEudmFsdWUgLSBiLnZhbHVlKTsKKyAgICBhLmRpc3RyaWJ1dGlv
bkJhc2UgPSBzdGQ6Om1heCgwLjBmLCBhLmRpc3RyaWJ1dGlvbkJhc2UgLSBiLmRpc3RyaWJ1dGlv
bkJhc2UpOworICAgIHJldHVybiBhOworfQorCitpbmxpbmUgc3RhdGljIEdyaWRTcGFjZSYgb3Bl
cmF0b3IrPShHcmlkU3BhY2UmIGEsIGNvbnN0IEdyaWRTcGFjZSYgYikKK3sKKyAgICBhLnZhbHVl
ICs9IGIudmFsdWU7CisgICAgYS5kaXN0cmlidXRpb25CYXNlICs9IGIuZGlzdHJpYnV0aW9uQmFz
ZTsKKyAgICByZXR1cm4gYTsKK30KKworaW5saW5lIHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJhdG9y
LT0oR3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCit7CisgICAgcmV0dXJuIGEgLSBi
OworfQorCitpbmxpbmUgc3RhdGljIEdyaWRTcGFjZSYgb3BlcmF0b3IvKEdyaWRTcGFjZSYgYSwg
dW5zaWduZWQgdmFsdWUpCit7CisgICAgYS52YWx1ZSAvPSB2YWx1ZTsKKyAgICBhLmRpc3RyaWJ1
dGlvbkJhc2UgLz0gdmFsdWU7CisgICAgcmV0dXJuIGE7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFt
ZSBTcGFuVHlwZT4KK3N0YXRpYyBWZWN0b3I8TGF5b3V0VW5pdD4gZGlzdHJpYnV0ZUF2YWlsYWJs
ZVNwYWNlKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCwgTGF5b3V0VW5pdCBhdmFpbGFibGVTcGFjZSwg
Y29uc3QgV1RGOjpGdW5jdGlvbjxHcmlkU3BhY2UoY29uc3QgVGFibGVHcmlkOjpTbG90Jiwgc2l6
ZV90KT4mIHNsb3RTcGFjZSkKK3sKKyAgICBzdHJ1Y3QgUmVzb2x2ZWRJdGVtIHsKKyAgICAgICAg
R3JpZFNwYWNlIHNsb3RTcGFjZTsKKyAgICAgICAgYm9vbCBpc0ZpeGVkIHsgZmFsc2UgfTsKKyAg
ICB9OworCisgICAgYXV0byYgY29sdW1ucyA9IGdyaWQuY29sdW1ucygpOworICAgIGF1dG8mIHJv
d3MgPSBncmlkLnJvd3MoKTsKKyAgICAvLyAxLiBDb2xsZWN0IHRoZSBub24tc3Bhbm5pbmcgc3Bh
Y2VzIGZpcnN0LiBUaGV5IGFyZSB1c2VkIGZvciB0aGUgZmluYWwgZGlzdHJpYnV0aW9uIGFzIHdl
bGwgYXMgZm9yIGRpc3RyaWJ1dGluZyB0aGUgc3Bhbm5pbmcgc3BhY2UuCisgICAgVmVjdG9yPE9w
dGlvbmFsPFJlc29sdmVkSXRlbT4+IHJlc29sdmVkSXRlbXMoU3BhblR5cGU6OnNpemUoZ3JpZCkp
OworICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1bW5z
LnNpemUoKTsgKytjb2x1bW5JbmRleCkgeworICAgICAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9
IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAgICAgICAgICAgIGF1
dG8mIHNsb3QgPSAqZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0pOworICAgICAg
ICAgICAgaWYgKFNwYW5UeXBlOjpoYXNTcGFuKHNsb3QpIHx8IFNwYW5UeXBlOjppc1NwYW5uZWQo
c2xvdCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhdXRvIGluZGV4
ID0gU3BhblR5cGU6OmluZGV4KGNvbHVtbkluZGV4LCByb3dJbmRleCk7CisgICAgICAgICAgICBp
ZiAoIXJlc29sdmVkSXRlbXNbaW5kZXhdKQorICAgICAgICAgICAgICAgIHJlc29sdmVkSXRlbXNb
aW5kZXhdID0gUmVzb2x2ZWRJdGVtIHsgfTsKKyAgICAgICAgICAgIHJlc29sdmVkSXRlbXNbaW5k
ZXhdLT5zbG90U3BhY2UgPSBtYXgocmVzb2x2ZWRJdGVtc1tpbmRleF0tPnNsb3RTcGFjZSwgc2xv
dFNwYWNlKHNsb3QsIGluZGV4KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAyLiBDb2xs
ZWN0IHRoZSBzcGFubmluZyBjZWxscy4KKyAgICBzdHJ1Y3QgU3Bhbm5pbmdDZWxsIHsKKyAgICAg
ICAgU2xvdFBvc2l0aW9uIHBvc2l0aW9uOworICAgICAgICBHcmlkU3BhY2UgdW5yZXNvbHZlZFNw
YWNlOworICAgIH07CisgICAgVmVjdG9yPFNwYW5uaW5nQ2VsbD4gc3Bhbm5pbmdDZWxsczsKKyAg
ICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93
SW5kZXgpIHsKKyAgICAgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRl
eCA8IGNvbHVtbnMuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBhdXRvJiBz
bG90ID0gKmdyaWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsKKyAgICAgICAgICAg
IGlmIChTcGFuVHlwZTo6aGFzU3BhbihzbG90KSkKKyAgICAgICAgICAgICAgICBzcGFubmluZ0Nl
bGxzLmFwcGVuZCh7IHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0sIHNsb3RTcGFjZShzbG90LCBT
cGFuVHlwZTo6aW5kZXgoY29sdW1uSW5kZXgsIHJvd0luZGV4KSkgfSk7CisgICAgICAgIH0KKyAg
ICB9CisgICAgLy8gV2UgbmVlZCB0aGVzZSBzcGFubmluZyBjZWxscyBpbiB0aGUgb3JkZXIgb2Yg
dGhlIG51bWJlciBvZiBjb2x1bW5zL3Jvd3MgdGhleSBzcGFuIHNvIHRoYXQKKyAgICAvLyB3ZSBj
YW4gcmVzb2x2ZSBvdmVybGFwcGluZyBzcGFucyBzdGFydGluZyB3aXRoIHRoZSBzaG9ydGVyIG9u
ZXMgZS5nLgorICAgIC8vIDx0ZCBjb2xzcGFuPTQ+I2E8L3RkPjx0ZD4jYjwvdGQ+CisgICAgLy8g
PHRkIGNvbHNwYW49Mj4jYzwvdGQ+PHRkIGNvbHNwYW49Mz4jZDwvdGQ+CisgICAgc3RkOjpzb3J0
KHNwYW5uaW5nQ2VsbHMuYmVnaW4oKSwgc3Bhbm5pbmdDZWxscy5lbmQoKSwgWyZdIChhdXRvJiBh
LCBhdXRvJiBiKSB7CisgICAgICAgIHJldHVybiBTcGFuVHlwZTo6c3BhbkNvdW50KGdyaWQuc2xv
dChhLnBvc2l0aW9uKS0+Y2VsbCgpKSA8IFNwYW5UeXBlOjpzcGFuQ291bnQoZ3JpZC5zbG90KGIu
cG9zaXRpb24pLT5jZWxsKCkpOworICAgIH0pOworCisgICAgLy8gMy4gRGlzdHJpYnV0ZSB0aGUg
c3Bhbm5pbmcgY2VsbHMnIG1pbWltdW0gc3BhY2UgYWNyb3NzIHRoZSBjb2x1bW5zL3Jvd3MgdXNp
bmcgdGhlIG5vbi1zcGFubmluZyBzcGFjZXMuCisgICAgLy8gZS5nLiBbIDEgXVsgNSBdWyAxIF0K
KyAgICAvLyAgICAgIFsgICAgOSAgIF1bIDEgXQorICAgIC8vIFRoZSBpbml0aWFsIHdpZHRocyBh
cmU6IFsgMiBdWyA3IF1bIDEgXQorICAgIGZvciAoYXV0byBzcGFubmluZ0NlbGwgOiBzcGFubmlu
Z0NlbGxzKSB7CisgICAgICAgIGF1dG8mIGNlbGwgPSBncmlkLnNsb3Qoc3Bhbm5pbmdDZWxsLnBv
c2l0aW9uKS0+Y2VsbCgpOworICAgICAgICBhdXRvIHVucmVzb2x2ZWRTcGFubmluZ1NwYWNlID0g
c3Bhbm5pbmdDZWxsLnVucmVzb2x2ZWRTcGFjZTsKKyAgICAgICAgaWYgKCFyZXNvbHZlZEl0ZW1z
W1NwYW5UeXBlOjpzdGFydFNwYW4oY2VsbCldIHx8ICFyZXNvbHZlZEl0ZW1zW1NwYW5UeXBlOjpl
bmRTcGFuKGNlbGwpIC0gMV0pIHsKKyAgICAgICAgICAgIC8vIDx0ZCBjb2xzcGFuPTQ+I2E8L3Rk
Pjx0ZD4jYjwvdGQ+CisgICAgICAgICAgICAvLyA8dGQgY29sc3Bhbj0yPiNjPC90ZD48dGQgY29s
c3Bhbj0zPiNkPC90ZD4KKyAgICAgICAgICAgIC8vIFVucmVzb2x2ZWQgY29sdW1ucyBhcmU6IDEg
MiAzIDQKKyAgICAgICAgICAgIC8vIDEuIFRha2UgY29sc3Bhbj0yIChzaG9ydGVzdCBzcGFuKSBh
bmQgcmVzb2x2ZSBjb2x1bW4gMSBhbmQgMgorICAgICAgICAgICAgLy8gMi4gVGFrZSBjb2xzcGFu
PTMgYW5kIHJlc29sdmUgY29sdW1uIDMgYW5kIDQgKDUgaXMgcmVzb2x2ZWQgYmVjYXVzZSBpdCBh
bHJlYWR5IGhhcyBhIG5vbi1zcGFubmluZyBjZWxsKS4KKyAgICAgICAgICAgIC8vIDMuIGNvbHNw
YW49NCBuZWVkcyBubyByZXNvbHZpbmcgYmVjYXVzZSBhbGwgdGhlIHNwYW5uZWQgY29sdW1ucyAo
MSAyIDMgNCkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuCisgICAgICAgICAgICBhdXRvIHVu
cmVzb2x2ZWRDb2x1bW5Db3VudCA9IGNlbGwuY29sdW1uU3BhbigpOworICAgICAgICAgICAgZm9y
IChhdXRvIHNwYW5JbmRleCA9IFNwYW5UeXBlOjpzdGFydFNwYW4oY2VsbCk7IHNwYW5JbmRleCA8
IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwpOyArK3NwYW5JbmRleCkgeworICAgICAgICAgICAgICAg
IGlmICghcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdKQorICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgICAgICBBU1NFUlQodW5yZXNvbHZlZENvbHVtbkNvdW50KTsKKyAg
ICAgICAgICAgICAgICAtLXVucmVzb2x2ZWRDb2x1bW5Db3VudDsKKyAgICAgICAgICAgICAgICB1
bnJlc29sdmVkU3Bhbm5pbmdTcGFjZSAtPSByZXNvbHZlZEl0ZW1zW3NwYW5JbmRleF0tPnNsb3RT
cGFjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVCh1bnJlc29sdmVkQ29sdW1u
Q291bnQpOworICAgICAgICAgICAgYXV0byBlcXVhbFNwYWNlRm9yU3Bhbm5lZENvbHVtbnMgPSB1
bnJlc29sdmVkU3Bhbm5pbmdTcGFjZSAvIHVucmVzb2x2ZWRDb2x1bW5Db3VudDsKKyAgICAgICAg
ICAgIGZvciAoYXV0byBzcGFuSW5kZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpOyBzcGFu
SW5kZXggPCBTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5kZXgpIHsKKyAgICAgICAg
ICAgICAgICBpZiAocmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdKQorICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1zW3NwYW5JbmRleF0gPSBS
ZXNvbHZlZEl0ZW0geyBlcXVhbFNwYWNlRm9yU3Bhbm5lZENvbHVtbnMsIGZhbHNlIH07CisgICAg
ICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyAxLiBDb2xsZWN0IHRo
ZSBub24tc3BhbmluZyByZXNvbHZlZCBzcGFjZXMuCisgICAgICAgICAgICAvLyAyLiBEaXN0cmli
dXRlIHRoZSBleHRyYSBzcGFjZSBhbW9uZyB0aGUgc3Bhbm5lZCBjb2x1bW5zL3Jvd3MgYmFzZWQg
b24gdGhlIHJlc29sdmVkIHNwYWNlIHZhbHVlcy4KKyAgICAgICAgICAgIC8vIGUuZy4gc3Bhbm5p
bmcgd2lkdGg6IFsgICA5ICAgXS4gUmVzb2x2ZWQgd2lkdGhzIGZvciB0aGUgc3Bhbm5lZCBjb2x1
bW5zOiBbIDEgXSBbIDIgXQorICAgICAgICAgICAgLy8gTmV3IHJlc29sdmVkIHdpZHRoczogWyAz
IF0gWyA2IF0uCisgICAgICAgICAgICBhdXRvIHJlc29sdmVkU3Bhbm5pbmdTcGFjZSA9IEdyaWRT
cGFjZSB7IH07CisgICAgICAgICAgICBmb3IgKGF1dG8gc3BhbkluZGV4ID0gU3BhblR5cGU6OnN0
YXJ0U3BhbihjZWxsKTsgc3BhbkluZGV4IDwgU3BhblR5cGU6OmVuZFNwYW4oY2VsbCk7ICsrc3Bh
bkluZGV4KQorICAgICAgICAgICAgICAgIHJlc29sdmVkU3Bhbm5pbmdTcGFjZSArPSByZXNvbHZl
ZEl0ZW1zW3NwYW5JbmRleF0tPnNsb3RTcGFjZTsKKyAgICAgICAgICAgIGlmIChyZXNvbHZlZFNw
YW5uaW5nU3BhY2UudmFsdWUgPj0gdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UudmFsdWUpIHsKKyAg
ICAgICAgICAgICAgICAvLyBUaGUgc3Bhbm5pbmcgY2VsbCBmaXRzIHRoZSBzcGFubmVkIGNvbHVt
bnMvcm93cyBqdXN0IGZpbmUuIE5vdGhpbmcgdG8gZGlzdHJpYnV0ZS4KKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gc3BhY2luZyA9IFNw
YW5UeXBlOjpzcGFjaW5nKGdyaWQpICogKFNwYW5UeXBlOjpzcGFuQ291bnQoY2VsbCkgLSAxKTsK
KyAgICAgICAgICAgIGF1dG8gc3BhY2VUb0Rpc3RyaWJ1dGUgPSB1bnJlc29sdmVkU3Bhbm5pbmdT
cGFjZSAtIEdyaWRTcGFjZSB7IHNwYWNpbmcsIHNwYWNpbmcgfSAtIHJlc29sdmVkU3Bhbm5pbmdT
cGFjZTsgCisgICAgICAgICAgICBpZiAoIXNwYWNlVG9EaXN0cmlidXRlLmlzRW1wdHkoKSkgewor
ICAgICAgICAgICAgICAgIGF1dG8gZGlzdHJpYnV0aW9uUmF0aW8gPSBzcGFjZVRvRGlzdHJpYnV0
ZS5kaXN0cmlidXRpb25CYXNlIC8gcmVzb2x2ZWRTcGFubmluZ1NwYWNlLmRpc3RyaWJ1dGlvbkJh
c2U7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIHNwYW5JbmRleCA9IFNwYW5UeXBlOjpzdGFy
dFNwYW4oY2VsbCk7IHNwYW5JbmRleCA8IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwpOyArK3NwYW5J
bmRleCkKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90
U3BhY2UgKz0gR3JpZFNwYWNlIHsgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2Uu
dmFsdWUgKiBkaXN0cmlidXRpb25SYXRpbywgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90
U3BhY2UuZGlzdHJpYnV0aW9uQmFzZSAqIGRpc3RyaWJ1dGlvblJhdGlvfTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyA0LiBEaXN0cmlidXRlIHRoZSBleHRyYSBzcGFj
ZSB1c2luZyB0aGUgZmluYWwgcmVzb2x2ZWQgd2lkdGhzLgorI2lmIEFTU0VSVF9FTkFCTEVECisg
ICAgLy8gV2UgaGF2ZSB0byBoYXZlIGFsbCB0aGUgc3BhY2VzIHJlc29sdmVkIGF0IHRoaXMgcG9p
bnQuCisgICAgZm9yIChhdXRvJiByZXNvbHZlZEl0ZW0gOiByZXNvbHZlZEl0ZW1zKQorICAgICAg
ICBBU1NFUlQocmVzb2x2ZWRJdGVtKTsKKyNlbmRpZgorICAgIC8vIEZpeGVkIHNpemUgY2VsbHMg
ZG9uJ3QgcGFydGljaXBhdGUgaW4gYXZhaWxhYmxlIHNwYWNlIGRpc3RyaWJ1dGlvbi4KKyAgICBh
dXRvIGFkanVzdGFibGVkU3BhY2UgPSBHcmlkU3BhY2UgeyB9OworICAgIGZvciAoYXV0byYgcmVz
b2x2ZWRJdGVtIDogcmVzb2x2ZWRJdGVtcykgeworICAgICAgICBpZiAocmVzb2x2ZWRJdGVtLT5p
c0ZpeGVkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGFkanVzdGFibGVkU3BhY2Ug
Kz0gcmVzb2x2ZWRJdGVtLT5zbG90U3BhY2U7CisgICAgfQorCisgICAgVmVjdG9yPExheW91dFVu
aXQ+IGRpc3RyaWJ1dGVkU3BhY2VzKHJlc29sdmVkSXRlbXMuc2l6ZSgpKTsKKyAgICBmbG9hdCBz
cGFjZVRvRGlzdHJpYnV0ZSA9IGF2YWlsYWJsZVNwYWNlIC0gYWRqdXN0YWJsZWRTcGFjZS52YWx1
ZSAtICgocmVzb2x2ZWRJdGVtcy5zaXplKCkgKyAxKSAqIFNwYW5UeXBlOjpzcGFjaW5nKGdyaWQp
KTsKKyAgICAvLyBFc3NlbnRpYWxseSB0aGUgcmVtYWluaW5nIHNwYWNlIHRvIGRpc3RyaWJ1dGUg
c2hvdWxkIG5ldmVyIGJlIG5lZ2F0aXZlLiBMYXlvdXRVbml0OjplcHNpbG9uKCkgaXMgcmVxdWly
ZWQgdG8gY29tcGVuc2F0ZSBmb3IgTGF5b3V0VW5pdCdzIGxvdyBwcmVjaXNpb24uCisgICAgQVNT
RVJUKHNwYWNlVG9EaXN0cmlidXRlID49IC1MYXlvdXRVbml0OjplcHNpbG9uKCkgKiByZXNvbHZl
ZEl0ZW1zLnNpemUoKSk7CisgICAgLy8gRGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UgYmFzZWQg
b24gdGhlIHJlc29sdmVkIHNwYWNlcy4KKyAgICBhdXRvIGRpc3RyaWJ1dGlvblJhdGlvID0gc3Bh
Y2VUb0Rpc3RyaWJ1dGUgLyBhZGp1c3RhYmxlZFNwYWNlLmRpc3RyaWJ1dGlvbkJhc2U7CisgICAg
Zm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJlc29sdmVkSXRlbXMuc2l6ZSgpOyArK2lu
ZGV4KSB7CisgICAgICAgIGF1dG8gc2xvdFNwYWNlID0gcmVzb2x2ZWRJdGVtc1tpbmRleF0tPnNs
b3RTcGFjZS52YWx1ZTsKKyAgICAgICAgYXV0byBuZWVkc1NwYWNlRGlzdHJpYnV0aW9uID0gc3Bh
Y2VUb0Rpc3RyaWJ1dGUgJiYgIXJlc29sdmVkSXRlbXNbaW5kZXhdLT5pc0ZpeGVkOworICAgICAg
ICBkaXN0cmlidXRlZFNwYWNlc1tpbmRleF0gPSBMYXlvdXRVbml0IHsgc2xvdFNwYWNlIH07Cisg
ICAgICAgIGlmICghbmVlZHNTcGFjZURpc3RyaWJ1dGlvbikKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICBkaXN0cmlidXRlZFNwYWNlc1tpbmRleF0gKz0gTGF5b3V0VW5pdCB7IHJlc29s
dmVkSXRlbXNbaW5kZXhdLT5zbG90U3BhY2UuZGlzdHJpYnV0aW9uQmFzZSAqIGRpc3RyaWJ1dGlv
blJhdGlvIH07CisgICAgfQorICAgIHJldHVybiBkaXN0cmlidXRlZFNwYWNlczsKK30KKworVGFi
bGVGb3JtYXR0aW5nQ29udGV4dDo6VGFibGVMYXlvdXQ6OkRpc3RyaWJ1dGVkU3BhY2VzIFRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlTGF5b3V0OjpkaXN0cmlidXRlZEhvcml6b250YWxTcGFj
ZShMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSkKK3sKKyAgICBlbnVtIGNsYXNz
IENvbHVtbldpZHRoQmFsYW5jaW5nQmFzZSB7IE1pbmltdW1XaWR0aCwgTWF4aW11bVdpZHRoIH07
CisgICAgYXV0byBjb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UgPSBhdmFpbGFibGVIb3Jpem9udGFs
U3BhY2UgPj0gbV9ncmlkLndpZHRoQ29uc3RyYWludHMoKS0+bWF4aW11bSA/IENvbHVtbldpZHRo
QmFsYW5jaW5nQmFzZTo6TWF4aW11bVdpZHRoIDogQ29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlOjpN
aW5pbXVtV2lkdGg7CisgICAgcmV0dXJuIGRpc3RyaWJ1dGVBdmFpbGFibGVTcGFjZTxDb2x1bW5T
cGFuPihtX2dyaWQsIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSwgWyZdIChjb25zdCBUYWJsZUdy
aWQ6OlNsb3QmIHNsb3QsIHNpemVfdCBjb2x1bW5JbmRleCkgeworICAgICAgICBhdXRvJiBjb2x1
bW4gPSBtX2dyaWQuY29sdW1ucygpLmxpc3QoKVtjb2x1bW5JbmRleF07CisgICAgICAgIGF1dG8g
Y29sdW1uQm94Rml4ZWRXaWR0aCA9IGNvbHVtbi5ib3goKSA/IGNvbHVtbi5ib3goKS0+Y29sdW1u
V2lkdGgoKS52YWx1ZU9yKDBfbHUpIDogMF9sdTsKKyAgICAgICAgYXV0byBtaW5pbXVtV2lkdGgg
PSBzdGQ6Om1heDxmbG9hdD4oc2xvdC53aWR0aENvbnN0cmFpbnRzKCkubWluaW11bSwgY29sdW1u
Qm94Rml4ZWRXaWR0aCk7CisgICAgICAgIGF1dG8gbWF4aW11bVdpZHRoID0gc3RkOjptYXg8Zmxv
YXQ+KHNsb3Qud2lkdGhDb25zdHJhaW50cygpLm1heGltdW0sIGNvbHVtbkJveEZpeGVkV2lkdGgp
OworCisgICAgICAgIGlmIChjb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UgPT0gQ29sdW1uV2lkdGhC
YWxhbmNpbmdCYXNlOjpNaW5pbXVtV2lkdGgpIHsKKyAgICAgICAgICAgIEFTU0VSVChtYXhpbXVt
V2lkdGggPj0gbWluaW11bVdpZHRoKTsKKyAgICAgICAgICAgIHJldHVybiBHcmlkU3BhY2UgeyBt
aW5pbXVtV2lkdGgsIG1heGltdW1XaWR0aCAtIG1pbmltdW1XaWR0aCB9OworICAgICAgICB9Cisg
ICAgICAgIC8vIFdoZW4gdGhlIGNvbHVtbiBoYXMgYSBmaXhlZCB3aWR0aCBjZWxsLCB0aGUgbWF4
aW11bSB3aWR0aCBiYWxhbmNpbmcgaXMgYmFzZWQgb24gdGhlIG1pbmltdW0gd2lkdGguCisgICAg
ICAgIGlmIChjb2x1bW4uaXNGaXhlZFdpZHRoKCkpCisgICAgICAgICAgICByZXR1cm4gR3JpZFNw
YWNlIHsgbWluaW11bVdpZHRoLCBtYXhpbXVtV2lkdGggfTsKKyAgICAgICAgcmV0dXJuIEdyaWRT
cGFjZSB7IG1heGltdW1XaWR0aCwgbWF4aW11bVdpZHRoIH07CisgICAgfSk7Cit9CisKK1RhYmxl
Rm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlTGF5b3V0OjpEaXN0cmlidXRlZFNwYWNlcyBUYWJsZUZv
cm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dDo6ZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNlKE9w
dGlvbmFsPExheW91dFVuaXQ+IGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpCit7CisgICAgYXV0byYg
cm93cyA9IG1fZ3JpZC5yb3dzKCk7CisgICAgYXV0byYgY29sdW1ucyA9IG1fZ3JpZC5jb2x1bW5z
KCk7CisKKyAgICBWZWN0b3I8TGF5b3V0VW5pdD4gcm93SGVpZ2h0KHJvd3Muc2l6ZSgpKTsKKyAg
ICBhdXRvIHRhYmxlVXNlZEhlaWdodCA9IExheW91dFVuaXQgeyB9OworICAgIC8vIDIuIENvbGxl
Y3QgaW5pdGlhbCwgYmFzZWxpbmUgYWxpZ25lZCByb3cgaGVpZ2h0cy4KKyAgICBmb3IgKHNpemVf
dCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAg
ICAgICAgYXV0byBtYXhpbXVtQ29sdW1uQXNjZW50ID0gSW5saW5lTGF5b3V0VW5pdCB7IH07Cisg
ICAgICAgIGF1dG8gbWF4aW11bUNvbHVtbkRlc2NlbnQgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsK
KyAgICAgICAgLy8gSW5pdGlhbCBtaW5pbXVtIGhlaWdodCBpcyB0aGUgY29tcHV0ZWQgaGVpZ2h0
IGlmIGF2YWlsYWJsZSA8dHIgc3R5bGU9ImhlaWdodDogMTAwcHgiPjx0ZD48L3RkPjwvdHI+Cisg
ICAgICAgIHJvd0hlaWdodFtyb3dJbmRleF0gPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5
KCkuY29tcHV0ZWRIZWlnaHQocm93cy5saXN0KClbcm93SW5kZXhdLmJveCgpLCBhdmFpbGFibGVW
ZXJ0aWNhbFNwYWNlKS52YWx1ZU9yKDBfbHUpOworICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW5J
bmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29sdW1uSW5kZXgpIHsK
KyAgICAgICAgICAgIGF1dG8mIHNsb3QgPSAqbV9ncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgcm93
SW5kZXggfSk7CisgICAgICAgICAgICBpZiAoc2xvdC5pc1Jvd1NwYW5uZWQoKSkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChzbG90Lmhhc1Jvd1NwYW4oKSkKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIFRoZSBtaW5pbXVtIGhlaWdo
dCBvZiBhIHJvdyAod2l0aG91dCBzcGFubmluZy1yZWxhdGVkIGhlaWdodCBkaXN0cmlidXRpb24p
IGlzIGRlZmluZWQgYXMgdGhlIGhlaWdodCBvZiBhbiBoeXBvdGhldGljYWwKKyAgICAgICAgICAg
IC8vIGxpbmVib3ggY29udGFpbmluZyB0aGUgY2VsbHMgb3JpZ2luYXRpbmcgaW4gdGhlIHJvdy4K
KyAgICAgICAgICAgIGF1dG8mIGNlbGwgPSBzbG90LmNlbGwoKTsKKyAgICAgICAgICAgIGF1dG8m
IGNlbGxCb3ggPSBjZWxsLmJveCgpOworICAgICAgICAgICAgYXV0byBoZWlnaHQgPSBmb3JtYXR0
aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGNlbGxCb3gpLmJvcmRlckJveEhlaWdodCgpOwor
ICAgICAgICAgICAgaWYgKGNlbGxCb3guc3R5bGUoKS52ZXJ0aWNhbEFsaWduKCkgPT0gVmVydGlj
YWxBbGlnbjo6QmFzZWxpbmUpIHsKKyAgICAgICAgICAgICAgICBtYXhpbXVtQ29sdW1uQXNjZW50
ID0gc3RkOjptYXgobWF4aW11bUNvbHVtbkFzY2VudCwgY2VsbC5iYXNlbGluZSgpKTsKKyAgICAg
ICAgICAgICAgICBtYXhpbXVtQ29sdW1uRGVzY2VudCA9IHN0ZDo6bWF4KG1heGltdW1Db2x1bW5E
ZXNjZW50LCBoZWlnaHQgLSBjZWxsLmJhc2VsaW5lKCkpOworICAgICAgICAgICAgICAgIHJvd0hl
aWdodFtyb3dJbmRleF0gPSBzdGQ6Om1heChyb3dIZWlnaHRbcm93SW5kZXhdLCBMYXlvdXRVbml0
IHsgbWF4aW11bUNvbHVtbkFzY2VudCArIG1heGltdW1Db2x1bW5EZXNjZW50IH0pOworICAgICAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcm93SGVpZ2h0W3Jvd0luZGV4XSA9IHN0ZDo6
bWF4KHJvd0hlaWdodFtyb3dJbmRleF0sIGhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgdGFi
bGVVc2VkSGVpZ2h0ICs9IHJvd0hlaWdodFtyb3dJbmRleF07CisgICAgfQorICAgIC8vIEZJWE1F
OiBDb2xsZWN0IHNwYW5uaW5nIHJvdyBtYXhpbXVtIGhlaWdodHMuCisKKyAgICB0YWJsZVVzZWRI
ZWlnaHQgKz0gKHJvd3Muc2l6ZSgpICsgMSkgKiBtX2dyaWQudmVydGljYWxTcGFjaW5nKCk7Cisg
ICAgYXV0byBhdmFpbGFibGVTcGFjZSA9IHN0ZDo6bWF4KGF2YWlsYWJsZVZlcnRpY2FsU3BhY2Uu
dmFsdWVPcigwX2x1KSwgdGFibGVVc2VkSGVpZ2h0KTsKKyAgICAvLyBEaXN0cmlidXRlIGV4dHJh
IHNwYWNlIGlmIHRoZSB0YWJsZSBpcyBzdXBwb3NlZCB0byBiZSB0YWxsZXIgdGhhbiB0aGUgc3Vt
IG9mIHRoZSByb3cgaGVpZ2h0cy4KKyAgICByZXR1cm4gZGlzdHJpYnV0ZUF2YWlsYWJsZVNwYWNl
PFJvd1NwYW4+KG1fZ3JpZCwgYXZhaWxhYmxlU3BhY2UsIFsmXSAoY29uc3QgVGFibGVHcmlkOjpT
bG90JiBzbG90LCBzaXplX3Qgcm93SW5kZXgpIHsKKyAgICAgICAgaWYgKHNsb3QuaGFzUm93U3Bh
bigpKQorICAgICAgICAgICAgcmV0dXJuIEdyaWRTcGFjZSB7IGZvcm1hdHRpbmdDb250ZXh0KCku
Z2VvbWV0cnlGb3JCb3goc2xvdC5jZWxsKCkuYm94KCkpLmJvcmRlckJveEhlaWdodCgpLCBmb3Jt
YXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KHNsb3QuY2VsbCgpLmJveCgpKS5ib3JkZXJC
b3hIZWlnaHQoKSB9OworICAgICAgICBhdXRvJiByb3dzID0gbV9ncmlkLnJvd3MoKTsKKyAgICAg
ICAgYXV0byBjb21wdXRlZFJvd0hlaWdodCA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnko
KS5jb21wdXRlZEhlaWdodChyb3dzLmxpc3QoKVtyb3dJbmRleF0uYm94KCksIHsgfSk7CisgICAg
ICAgIGF1dG8gaGVpZ2h0ID0gc3RkOjptYXg8ZmxvYXQ+KHJvd0hlaWdodFtyb3dJbmRleF0sIGNv
bXB1dGVkUm93SGVpZ2h0LnZhbHVlT3IoMF9sdSkpOworICAgICAgICByZXR1cm4gR3JpZFNwYWNl
IHsgaGVpZ2h0LCBoZWlnaHQgfTsKKyAgICB9KTsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRl
bnRCcmVha2VyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUNvbnRlbnRCcmVha2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQw
YTZkYTlmOWMxNGYwMTQ0NTFmYWRhMjQ2ZmIwZWJjZDEyZDJiOC4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5l
Zm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1
MzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6
Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
Ci0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJJ
bmxpbmVDb250ZW50QnJlYWtlci5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NP
TlRFWFQpCi0KLSNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgotI2luY2x1ZGUgIkh5cGhlbmF0aW9u
LmgiCi0jaW5jbHVkZSAiSW5saW5lSXRlbS5oIgotI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgi
Ci0jaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCi0jaW5jbHVkZSAiVGV4dFV0aWwuaCIK
LQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLQotI2lmIEFTU0VS
VF9FTkFCTEVECi1zdGF0aWMgaW5saW5lIGJvb2wgaGFzVHJhaWxpbmdUZXh0Q29udGVudChjb25z
dCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250
ZW50KQotewotICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShjb250
aW51b3VzQ29udGVudC5ydW5zKCkpKSB7Ci0gICAgICAgIGF1dG8mIGlubGluZUl0ZW0gPSBydW4u
aW5saW5lSXRlbTsKLSAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpIHx8
IGlubGluZUl0ZW0uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICByZXR1cm4gaW5saW5lSXRlbS5pc1RleHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNl
OwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgYm9vbCBoYXNMZWFkaW5nVGV4dENvbnRlbnQo
Y29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3Vz
Q29udGVudCkKLXsKLSAgICBmb3IgKGF1dG8mIHJ1biA6IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMo
KSkgewotICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gcnVuLmlubGluZUl0ZW07Ci0gICAgICAg
IGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5l
Qm94RW5kKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcmV0dXJuIGlubGluZUl0
ZW0uaXNUZXh0KCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGlu
ZSBib29sIGhhc1RleHRSdW4oY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXND
b250ZW50JiBjb250aW51b3VzQ29udGVudCkKLXsKLSAgICAvLyA8c3Bhbj50ZXh0PC9zcGFuPiBp
cyBjb25zaWRlcmVkIGEgdGV4dCBydW4gZXZlbiB3aXRoIHRoZSBbaW5saW5lIGJveCBzdGFydF1b
aW5saW5lIGJveCBlbmRdIGlubGluZSBpdGVtcy4KLSAgICAvLyBCYXNlZCBvbiBzdGFuZGFyZHMg
Y29tbWl0IGJvdW5kYXJ5IHJ1bGVzIGl0IHdvdWxkIGJlIGVub3VnaCB0byBjaGVjayB0aGUgZmly
c3QgaW5saW5lIGl0ZW0sIGJ1dCBkdWUgdG8gdGhlIHRhYmxlIHF1aXJrLCB3ZSBjYW4gaGF2ZQot
ICAgIC8vIGltYWdlIGFuZCB0ZXh0IG5leHQgdG8gZWFjaCBvdGhlciBpbnNpZGUgYSBjb250aW51
b3VzIHNldCBvZiBydW5zIChzZWUgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6aGFz
U29mdFdyYXBPcHBvcnR1bml0eUF0SW1hZ2UpLgotICAgIGZvciAoYXV0byYgcnVuIDogY29udGlu
dW91c0NvbnRlbnQucnVucygpKSB7Ci0gICAgICAgIGlmIChydW4uaW5saW5lSXRlbS5pc1RleHQo
KSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1Zpc3VhbGx5RW1wdHlXaGl0ZXNwYWNlQ29udGVudChj
b25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXND
b250ZW50KQotewotICAgIC8vIFs8c3Bhbj48L3NwYW4+IF0gWzxzcGFuPiA8L3NwYW4+XSBbIDxz
cGFuIHN0eWxlPSJwYWRkaW5nOiAwcHg7Ij48L3NwYW4+XSBhcmUgYWxsIGNvbnNpZGVyZWQgdmlz
dWFsbHkgZW1wdHkgd2hpdGVzcGFjZSBjb250ZW50LgotICAgIC8vIFs8c3BhbiBzdHlsZT0iYm9y
ZGVyOiAxcHggc29saWQgcmVkIj48L3NwYW4+IF0gd2hpbGUgdGhpcyBpcyB3aGl0ZXNwYWNlIGNv
bnRlbnQgb25seSwgaXQgaXMgbm90IGNvbnNpZGVyZWQgdmlzdWFsbHkgZW1wdHkuCi0gICAgLy8g
RHVlIHRvIGNvbW1pdCBib3VuZGFyeSBydWxlcywgd2UganVzdCBuZWVkIHRvIGNoZWNrIHRoZSBm
aXJzdCBub24tdHlwZWxlc3MgaW5saW5lIGl0ZW0gKGNhbid0IGhhdmUgYm90aCBbaW1nXSBhbmQg
W3RleHRdKQotICAgIGZvciAoYXV0byYgcnVuIDogY29udGludW91c0NvbnRlbnQucnVucygpKSB7
Ci0gICAgICAgIGF1dG8mIGlubGluZUl0ZW0gPSBydW4uaW5saW5lSXRlbTsKLSAgICAgICAgLy8g
RklYTUU6IGNoZWNrIGZvciBwYWRkaW5nIGJvcmRlciBldGMuCi0gICAgICAgIGlmIChpbmxpbmVJ
dGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpCi0g
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcmV0dXJuIGlubGluZUl0ZW0uaXNUZXh0KCkg
JiYgZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGlubGluZUl0ZW0pLmlzV2hpdGVzcGFjZSgpOwot
ICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc05vbkNv
bnRlbnRSdW5zT25seShjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRl
bnQmIGNvbnRpbnVvdXNDb250ZW50KQotewotICAgIC8vIDxzcGFuPjwvc3Bhbj4gPC0gbm9uIGNv
bnRlbnQgcnVucy4KLSAgICBmb3IgKGF1dG8mIHJ1biA6IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMo
KSkgewotICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gcnVuLmlubGluZUl0ZW07Ci0gICAgICAg
IGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5l
Qm94RW5kKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSBPcHRpb25hbDxzaXpl
X3Q+IGZpcnN0VGV4dFJ1bkluZGV4KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51
b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQpCi17Ci0gICAgYXV0byYgcnVucyA9IGNvbnRp
bnVvdXNDb250ZW50LnJ1bnMoKTsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwg
cnVucy5zaXplKCk7ICsraW5kZXgpIHsKLSAgICAgICAgaWYgKHJ1bnNbaW5kZXhdLmlubGluZUl0
ZW0uaXNUZXh0KCkpCi0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIHJldHVy
biB7IH07Ci19Ci0KLWJvb2wgSW5saW5lQ29udGVudEJyZWFrZXI6OmlzV3JhcHBpbmdBbGxvd2Vk
KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0pCi17Ci0gICAgYXV0byYgc3R5bGVUb1VzZSA9
IGlubGluZUl0ZW0uaXNCb3goKSA/IGlubGluZUl0ZW0ubGF5b3V0Qm94KCkucGFyZW50KCkuc3R5
bGUoKSA6IGlubGluZUl0ZW0ubGF5b3V0Qm94KCkuc3R5bGUoKTsgCi0gICAgLy8gRG8gbm90IHRy
eSB0byB3cmFwIG92ZXJmbG93biAncHJlJyBhbmQgJ25vLXdyYXAnIGNvbnRlbnQgdG8gbmV4dCBs
aW5lLgotICAgIHJldHVybiBzdHlsZVRvVXNlLndoaXRlU3BhY2UoKSAhPSBXaGl0ZVNwYWNlOjpQ
cmUgJiYgc3R5bGVUb1VzZS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6Tm9XcmFwOwotfQot
Ci1ib29sIElubGluZUNvbnRlbnRCcmVha2VyOjpzaG91bGRLZWVwRW5kT2ZMaW5lV2hpdGVzcGFj
ZShjb25zdCBDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQpIGNvbnN0Ci17Ci0g
ICAgLy8gR3JhYiB0aGUgc3R5bGUgYW5kIGNoZWNrIGZvciB3aGl0ZS1zcGFjZSBwcm9wZXJ0eSB0
byBkZWNpZGUgd2hldGhlciB3ZSBzaG91bGQgbGV0IHRoaXMgd2hpdGVzcGFjZSBjb250ZW50IG92
ZXJmbG93IHRoZSBjdXJyZW50IGxpbmUuCi0gICAgLy8gTm90ZSB0aGF0IHRoZSAia2VlcCIgaW4g
dGhpcyBjb250ZXh0IG1lYW5zIHdlIGxldCB0aGUgd2hpdGVzcGFjZSBjb250ZW50IHNpdCBvbiB0
aGUgY3VycmVudCBsaW5lLgotICAgIC8vIEl0IG1pZ2h0IHZlcnkgd2VsbCBnZXQgY29sbGFwc2Vk
IHdoZW4gd2UgY2xvc2UgdGhlIGxpbmUgKG5vcm1hbC9ub3dyYXAvcHJlLWxpbmUpLgotICAgIC8v
IFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXRleHQtMy8jd2hpdGUtc3BhY2UtcHJvcGVy
dHkKLSAgICBhdXRvIHdoaXRlc3BhY2UgPSBjb250aW51b3VzQ29udGVudC5ydW5zKClbKmZpcnN0
VGV4dFJ1bkluZGV4KGNvbnRpbnVvdXNDb250ZW50KV0uaW5saW5lSXRlbS5zdHlsZSgpLndoaXRl
U3BhY2UoKTsKLSAgICByZXR1cm4gd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpOb3JtYWwgfHwg
d2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpOb1dyYXAgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNw
YWNlOjpQcmVXcmFwIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlTGluZTsKLX0KLQot
SW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6cHJvY2Vz
c0lubGluZUNvbnRlbnQoY29uc3QgQ29udGludW91c0NvbnRlbnQmIGNhbmRpZGF0ZUNvbnRlbnQs
IGNvbnN0IExpbmVTdGF0dXMmIGxpbmVTdGF0dXMpCi17Ci0gICAgQVNTRVJUKCFzdGQ6OmlzbmFu
KGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGgpKTsKLSAgICBhdXRvIHByb2Nlc3NDYW5kaWRhdGVD
b250ZW50ID0gWyZdIHsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZUNvbnRlbnQubG9naWNhbFdpZHRo
KCkgPD0gbGluZVN0YXR1cy5hdmFpbGFibGVXaWR0aCkKLSAgICAgICAgICAgIHJldHVybiBSZXN1
bHQgeyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCB9OwotI2lmIFVTRV9GTE9BVF9BU19JTkxJTkVfTEFZ
T1VUX1VOSVQKLSAgICAgICAgLy8gUHJlZmVycmVkIHdpZHRoIGNvbXB1dGF0aW9uIHN1bXMgdXAg
ZmxvYXRzIHdoaWxlIGxpbmUgYnJlYWtlciBzdWJ0cmFjdHMgdGhlbS4gVGhpcyBjYW4gbGVhZCB0
byBlcHNpbG9uLXNjYWxlIGRpZmZlcmVuY2VzLgotICAgICAgICBpZiAoV1RGOjphcmVFc3NlbnRp
YWxseUVxdWFsKGNhbmRpZGF0ZUNvbnRlbnQubG9naWNhbFdpZHRoKCksIGxpbmVTdGF0dXMuYXZh
aWxhYmxlV2lkdGgpKQotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdCB7IFJlc3VsdDo6QWN0aW9u
OjpLZWVwIH07Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NPdmVyZmxvd2luZ0NvbnRl
bnQoY2FuZGlkYXRlQ29udGVudCwgbGluZVN0YXR1cyk7Ci0gICAgfTsKLQotICAgIGF1dG8gcmVz
dWx0ID0gcHJvY2Vzc0NhbmRpZGF0ZUNvbnRlbnQoKTsKLSAgICBpZiAocmVzdWx0LmFjdGlvbiA9
PSBSZXN1bHQ6OkFjdGlvbjo6V3JhcCAmJiBsaW5lU3RhdHVzLnRyYWlsaW5nU29mdEh5cGhlbldp
ZHRoICYmIGhhc0xlYWRpbmdUZXh0Q29udGVudChjYW5kaWRhdGVDb250ZW50KSkgewotICAgICAg
ICAvLyBBIHRyYWlsaW5nIHNvZnQgaHlwaGVuIHdpdGggYSB3cmFwcGVkIHRleHQgY29udGVudCB0
dXJucyBpbnRvIGEgdmlzaWJsZSBoeXBoZW4uCi0gICAgICAgIC8vIExldCdzIGNoZWNrIGlmIHRo
ZXJlJ3MgZW5vdWdoIHNwYWNlIGZvciB0aGUgaHlwaGVuIGNoYXJhY3Rlci4KLSAgICAgICAgYXV0
byBoeXBoZW5PdmVyZmxvd3MgPSAqbGluZVN0YXR1cy50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA+
IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGg7Ci0gICAgICAgIGF1dG8gYWN0aW9uID0gaHlwaGVu
T3ZlcmZsb3dzID8gUmVzdWx0OjpBY3Rpb246OlJldmVydFRvTGFzdE5vbk92ZXJmbG93aW5nV3Jh
cE9wcG9ydHVuaXR5IDogUmVzdWx0OjpBY3Rpb246OldyYXBXaXRoSHlwaGVuOwotICAgICAgICBy
ZXN1bHQgPSB7IGFjdGlvbiwgSXNFbmRPZkxpbmU6OlllcyB9OwotICAgIH0KLSAgICByZXR1cm4g
cmVzdWx0OwotfQotCi1zdHJ1Y3QgT3ZlcmZsb3dpbmdUZXh0Q29udGVudCB7Ci0gICAgc2l6ZV90
IHJ1bkluZGV4IHsgMCB9OyAvLyBPdmVyZmxvd2luZyBydW4gaW5kZXguIFRoZXJlJ3MgYWx3YXlz
IGFuIG92ZXJmbG93aW5nIHJ1bi4KLSAgICBzdHJ1Y3QgQnJlYWtpbmdQb3NpdGlvbiB7Ci0gICAg
ICAgIHNpemVfdCBydW5JbmRleCB7IDAgfTsKLSAgICAgICAgc3RydWN0IFRyYWlsaW5nQ29udGVu
dCB7Ci0gICAgICAgICAgICAvLyBUcmFpbGluZyBjb250ZW50IGlzIGVpdGhlciB0aGUgcnVuJ3Mg
bGVmdCBzaWRlICh3aGVuIHdlIGJyZWFrIHRoZSBydW4gc29tZXdoZXJlIGluIHRoZSBtaWRkbGUp
IG9yIHRoZSBwcmV2aW91cyBydW4uCi0gICAgICAgICAgICAvLyBTb21ldGltZXMgdGhlIGJyZWFr
aW5nIHBvc2l0aW9uIGlzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgZmlyc3QgcnVuLCBz
byB0aGVyZSdzIG5vIHRyYWlsaW5nIHJ1biBhdCBhbGwuCi0gICAgICAgICAgICBib29sIG92ZXJm
bG93cyB7IGZhbHNlIH07Ci0gICAgICAgICAgICBPcHRpb25hbDxJbmxpbmVDb250ZW50QnJlYWtl
cjo6UGFydGlhbFJ1bj4gcGFydGlhbFJ1biB7IH07Ci0gICAgICAgIH07Ci0gICAgICAgIE9wdGlv
bmFsPFRyYWlsaW5nQ29udGVudD4gdHJhaWxpbmdDb250ZW50IHsgfTsKLSAgICB9OwotICAgIE9w
dGlvbmFsPEJyZWFraW5nUG9zaXRpb24+IGJyZWFraW5nUG9zaXRpb24geyB9OyAvLyBXaGVyZSB3
ZSBhY3R1YWxseSBicmVhayB0aGlzIG92ZXJmbG93aW5nIGNvbnRlbnQuCi19OwotCi1JbmxpbmVD
b250ZW50QnJlYWtlcjo6UmVzdWx0IElubGluZUNvbnRlbnRCcmVha2VyOjpwcm9jZXNzT3ZlcmZs
b3dpbmdDb250ZW50KGNvbnN0IENvbnRpbnVvdXNDb250ZW50JiBvdmVyZmxvd0NvbnRlbnQsIGNv
bnN0IExpbmVTdGF0dXMmIGxpbmVTdGF0dXMpIGNvbnN0Ci17Ci0gICAgYXV0byBjb250aW51b3Vz
Q29udGVudCA9IENvbnRpbnVvdXNDb250ZW50IHsgb3ZlcmZsb3dDb250ZW50IH07Ci0gICAgQVNT
RVJUKCFjb250aW51b3VzQ29udGVudC5ydW5zKCkuaXNFbXB0eSgpKTsKLQotICAgIEFTU0VSVChj
b250aW51b3VzQ29udGVudC5sb2dpY2FsV2lkdGgoKSA+IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lk
dGgpOwotICAgIGlmIChjb250aW51b3VzQ29udGVudC5oYXNUcmFpbGluZ0NvbGxhcHNpYmxlQ29u
dGVudCgpKSB7Ci0gICAgICAgIEFTU0VSVChoYXNUcmFpbGluZ1RleHRDb250ZW50KG92ZXJmbG93
Q29udGVudCkpOwotICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgY29udGVudCBmaXRzIHdp
dGhvdXQgdGhlIHRyYWlsaW5nIGNvbGxhcHNpYmxlIHBhcnQuCi0gICAgICAgIGlmIChjb250aW51
b3VzQ29udGVudC5ub25Db2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCgpIDw9IGxpbmVTdGF0dXMuYXZh
aWxhYmxlV2lkdGgpCi0gICAgICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCwg
SXNFbmRPZkxpbmU6Ok5vIH07Ci0gICAgICAgIC8vIE5vdyBjaGVjayBpZiB3ZSBjYW4gdHJpbSB0
aGUgbGluZSB0b28uCi0gICAgICAgIGlmIChsaW5lU3RhdHVzLmhhc0Z1bGx5Q29sbGFwc2libGVU
cmFpbGluZ1J1biAmJiBjb250aW51b3VzQ29udGVudC5pc0Z1bGx5Q29sbGFwc2libGUoKSkgewot
ICAgICAgICAgICAgLy8gSWYgdGhpcyBuZXcgY29udGVudCBpcyBmdWxseSBjb2xsYXBzaWJsZSwg
aXQgc2hvdWxkIHN1cmVseSBmaXQuCi0gICAgICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlv
bjo6S2VlcCwgSXNFbmRPZkxpbmU6Ok5vIH07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGxp
bmVTdGF0dXMuY29sbGFwc2libGVXaWR0aCAmJiBpc05vbkNvbnRlbnRSdW5zT25seShjb250aW51
b3VzQ29udGVudCkpIHsKLSAgICAgICAgLy8gTGV0J3Mgc2VlIGlmIHRoZSBub24tY29udGVudCBy
dW5zIGZpdCB3aGVuIHRoZSBsaW5lIGhhcyB0cmFpbGluZyBjb2xsYXBzaWJsZSBjb250ZW50Lgot
ICAgICAgICAvLyAidGV4dCBjb250ZW50IDxzcGFuIHN0eWxlPSJwYWRkaW5nOiAxcHgiPjwvc3Bh
bj4iIDwtIHRoZSA8c3Bhbj48L3NwYW4+IHJ1bnMgY291bGQgZml0IGFmdGVyIGNvbGxhcHNpbmcg
dGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UuCi0gICAgICAgIGlmIChjb250aW51b3VzQ29udGVudC5s
b2dpY2FsV2lkdGgoKSA8PSBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoICsgbGluZVN0YXR1cy5j
b2xsYXBzaWJsZVdpZHRoKQotICAgICAgICAgICAgcmV0dXJuIHsgUmVzdWx0OjpBY3Rpb246Oktl
ZXAgfTsKLSAgICB9Ci0gICAgaWYgKGlzVmlzdWFsbHlFbXB0eVdoaXRlc3BhY2VDb250ZW50KGNv
bnRpbnVvdXNDb250ZW50KSAmJiBzaG91bGRLZWVwRW5kT2ZMaW5lV2hpdGVzcGFjZShjb250aW51
b3VzQ29udGVudCkpIHsKLSAgICAgICAgLy8gVGhpcyBvdmVyZmxvd2luZyBjb250ZW50IGFwcGFy
ZW50bHkgZmFsbHMgaW50byB0aGUgcmVtb3ZlL2hhbmcgZW5kLW9mLWxpbmUtc3BhY2VzIGNhdGVn
b3J5LgotICAgICAgICAvLyBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10ZXh0LTMvI3do
aXRlLXNwYWNlLXByb3BlcnR5IG1hdHJpeAotICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlv
bjo6S2VlcCB9OwotICAgIH0KLQotICAgIHNpemVfdCBvdmVyZmxvd2luZ1J1bkluZGV4ID0gMDsK
LSAgICBpZiAoaGFzVGV4dFJ1bihjb250aW51b3VzQ29udGVudCkpIHsKLSAgICAgICAgYXV0byB0
cnlCcmVha2luZ0NvbnRlbnRXaXRoVGV4dCA9IFsmXSgpIC0+IE9wdGlvbmFsPFJlc3VsdD4gewot
ICAgICAgICAgICAgLy8gMS4gVGhpcyB0ZXh0IGNvbnRlbnQgaXMgbm90IGJyZWFrYWJsZS4KLSAg
ICAgICAgICAgIC8vIDIuIFRoaXMgYnJlYWthYmxlIHRleHQgY29udGVudCBkb2VzIG5vdCBmaXQg
YXQgYWxsLiBOb3QgZXZlbiB0aGUgZmlyc3QgZ2x5cGguIFRoaXMgaXMgYSB2ZXJ5IHNwZWNpYWwg
Y2FzZS4KLSAgICAgICAgICAgIC8vIDMuIFdlIGNhbiBicmVhayB0aGUgY29udGVudCBidXQgaXQg
c3RpbGwgb3ZlcmZsb3dzLgotICAgICAgICAgICAgLy8gNC4gTWFuYWdlZCB0byBicmVhayB0aGUg
Y29udGVudCBiZWZvcmUgdGhlIG92ZXJmbG93IHBvaW50LgotICAgICAgICAgICAgYXV0byBvdmVy
Zmxvd2luZ0NvbnRlbnQgPSBwcm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50V2l0aFRleHQoY29udGlu
dW91c0NvbnRlbnQsIGxpbmVTdGF0dXMpOwotICAgICAgICAgICAgb3ZlcmZsb3dpbmdSdW5JbmRl
eCA9IG92ZXJmbG93aW5nQ29udGVudC5ydW5JbmRleDsKLSAgICAgICAgICAgIGlmICghb3ZlcmZs
b3dpbmdDb250ZW50LmJyZWFraW5nUG9zaXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIHsg
fTsKLSAgICAgICAgICAgIGF1dG8gdHJhaWxpbmdDb250ZW50ID0gb3ZlcmZsb3dpbmdDb250ZW50
LmJyZWFraW5nUG9zaXRpb24tPnRyYWlsaW5nQ29udGVudDsKLSAgICAgICAgICAgIGlmICghdHJh
aWxpbmdDb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgdHJpZWQgdG8gYnJlYWsgdGhl
IGNvbnRlbnQgYnV0IHRoZSBhdmFpbGFibGUgc3BhY2UgY2FuJ3QgZXZlbiBhY2NvbW1vZGF0ZSB0
aGUgZmlyc3QgZ2x5cGguCi0gICAgICAgICAgICAgICAgLy8gMS4gV3JhcCB0aGUgY29udGVudCBv
dmVyIHRvIHRoZSBuZXh0IGxpbmUgd2hlbiB3ZSd2ZSBnb3QgY29udGVudCBvbiB0aGUgbGluZSBh
bHJlYWR5LgotICAgICAgICAgICAgICAgIC8vIDIuIEtlZXAgdGhlIGZpcnN0IGdseXBoIG9uIHRo
ZSBlbXB0eSBsaW5lIChvciBrZWVwIHRoZSB3aG9sZSBydW4gaWYgaXQgaGFzIG9ubHkgb25lIGds
eXBoL2NvbXBsZXRlbHkgZW1wdHkpLgotICAgICAgICAgICAgICAgIGlmIChsaW5lU3RhdHVzLmhh
c0NvbnRlbnQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6OkFj
dGlvbjo6V3JhcCwgSXNFbmRPZkxpbmU6OlllcyB9OwotICAgICAgICAgICAgICAgIGF1dG8gbGVh
ZGluZ1RleHRSdW5JbmRleCA9ICpmaXJzdFRleHRSdW5JbmRleChjb250aW51b3VzQ29udGVudCk7
Ci0gICAgICAgICAgICAgICAgYXV0byYgaW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVU
ZXh0SXRlbT4oY29udGludW91c0NvbnRlbnQucnVucygpW2xlYWRpbmdUZXh0UnVuSW5kZXhdLmlu
bGluZUl0ZW0pOwotICAgICAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSA8
PSAxKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246
OktlZXAsIElzRW5kT2ZMaW5lOjpZZXMgfTsKLSAgICAgICAgICAgICAgICBhdXRvIGZpcnN0Q2hh
cmFjdGVyV2lkdGggPSBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0sIGlubGluZVRleHRJ
dGVtLnN0YXJ0KCksIGlubGluZVRleHRJdGVtLnN0YXJ0KCkgKyAxLCBsaW5lU3RhdHVzLmNvbnRl
bnRMb2dpY2FsUmlnaHQpOwotICAgICAgICAgICAgICAgIGF1dG8gZmlyc3RDaGFyYWN0ZXJSdW4g
PSBQYXJ0aWFsUnVuIHsgMSwgZmlyc3RDaGFyYWN0ZXJXaWR0aCB9OwotICAgICAgICAgICAgICAg
IHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6OkFjdGlvbjo6QnJlYWssIElzRW5kT2ZMaW5lOjpZZXMs
IFJlc3VsdDo6UGFydGlhbFRyYWlsaW5nQ29udGVudCB7IGxlYWRpbmdUZXh0UnVuSW5kZXgsIGZp
cnN0Q2hhcmFjdGVyUnVuIH0gfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0cmFp
bGluZ0NvbnRlbnQtPm92ZXJmbG93cyAmJiBsaW5lU3RhdHVzLmhhc0NvbnRlbnQpIHsKLSAgICAg
ICAgICAgICAgICAvLyBXZSBtYW5hZ2VkIHRvIGJyZWFrIGEgcnVuIHdpdGggb3ZlcmZsb3cgYnV0
IHRoZSBsaW5lIGFscmVhZHkgaGFzIGNvbnRlbnQuIExldCdzIHdyYXAgaXQgdG8gdGhlIG5leHQg
bGluZS4KLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246Oldy
YXAsIElzRW5kT2ZMaW5lOjpZZXMgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEVp
dGhlciB3ZSBtYW5hZ2VkIHRvIGJyZWFrIHdpdGggbm8gb3ZlcmZsb3cgb3IgdGhlIGxpbmUgaXMg
ZW1wdHkuCi0gICAgICAgICAgICBhdXRvIHRyYWlsaW5nUGFydGlhbENvbnRlbnQgPSBSZXN1bHQ6
OlBhcnRpYWxUcmFpbGluZ0NvbnRlbnQgeyBvdmVyZmxvd2luZ0NvbnRlbnQuYnJlYWtpbmdQb3Np
dGlvbi0+cnVuSW5kZXgsIHRyYWlsaW5nQ29udGVudC0+cGFydGlhbFJ1biB9OwotICAgICAgICAg
ICAgcmV0dXJuIFJlc3VsdCB7IFJlc3VsdDo6QWN0aW9uOjpCcmVhaywgSXNFbmRPZkxpbmU6Olll
cywgdHJhaWxpbmdQYXJ0aWFsQ29udGVudCB9OwotICAgICAgICB9OwotICAgICAgICBpZiAoYXV0
byByZXN1bHQgPSB0cnlCcmVha2luZ0NvbnRlbnRXaXRoVGV4dCgpKQotICAgICAgICAgICAgcmV0
dXJuICpyZXN1bHQ7Ci0gICAgfSBlbHNlIGlmIChjb250aW51b3VzQ29udGVudC5ydW5zKCkuc2l6
ZSgpID4gMSkgewotICAgICAgICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIHZhcmlvdXMgY29u
dGVudC4KLSAgICAgICAgYXV0byYgcnVucyA9IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKTsKLSAg
ICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBydW5zLnNpemUoKTsgKytpKSB7Ci0gICAgICAg
ICAgICBpZiAocnVuc1tpXS5pbmxpbmVJdGVtLmlzQm94KCkpIHsKLSAgICAgICAgICAgICAgICBv
dmVyZmxvd2luZ1J1bkluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHdlIGFyZSBub3QgYWxsb3dlZCB0
byBicmVhayB0aGlzIG92ZXJmbG93aW5nIGNvbnRlbnQsIHdlIHN0aWxsIG5lZWQgdG8gZGVjaWRl
IHdoZXRoZXIga2VlcCBpdCBvciB3cmFwIGl0IHRvIHRoZSBuZXh0IGxpbmUuCi0gICAgaWYgKCFs
aW5lU3RhdHVzLmhhc0NvbnRlbnQpCi0gICAgICAgIHJldHVybiB7IFJlc3VsdDo6QWN0aW9uOjpL
ZWVwLCBJc0VuZE9mTGluZTo6Tm8gfTsKLSAgICAvLyBOb3cgZWl0aGVyIHdyYXAgdGhpcyBjb250
ZW50IG92ZXIgdG8gdGhlIG5leHQgbGluZSBvciByZXZlcnQgYmFjayB0byBhbiBlYXJsaWVyIHdy
YXBwaW5nIG9wcG9ydHVuaXR5LCBvciBub3Qgd3JhcCBhdCBhbGwuCi0gICAgYXV0byBzaG91bGRX
cmFwVW5icmVha2FibGVDb250ZW50VG9OZXh0TGluZSA9IFsmXSB7Ci0gICAgICAgIC8vIFRoZSBp
bmRpdmlkdWFsIHJ1bnMgaW4gdGhpcyBjb250aW51b3VzIGNvbnRlbnQgZG9uJ3QgYnJlYWssIGxl
dCdzIGNoZWNrIGlmIHdlIGFyZSBhbGxvd2VkIHRvIHdyYXAgdGhpcyBjb250ZW50IHRvIG5leHQg
bGluZSAoZS5nLiBwcmUgd291bGQgcHJldmVudCB1cyBmcm9tIHdyYXBwaW5nKS4KLSAgICAgICAg
Ly8gUGFyZW50IHN0eWxlIGRyaXZlcyB0aGUgd3JhcHBpbmcgYmVoYXZpb3IgaGVyZS4KLSAgICAg
ICAgLy8gZS5nLiA8ZGl2IHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwIj5zb21lIHRleHQ8ZGl2
IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcCI+PC9k
aXY+PC9kaXY+LgotICAgICAgICAvLyBXaGlsZSB0aGUgaW5saW5lLWJsb2NrIGhhcyBwcmUtd3Jh
cCB3aGljaCBhbGxvd3Mgd3JhcHBpbmcsIHRoZSBjb250ZW50IGxpdmVzIGluIGEgbm93cmFwIGNv
bnRleHQuCi0gICAgICAgIHJldHVybiBpc1dyYXBwaW5nQWxsb3dlZChjb250aW51b3VzQ29udGVu
dC5ydW5zKClbb3ZlcmZsb3dpbmdSdW5JbmRleF0uaW5saW5lSXRlbSk7Ci0gICAgfTsKLSAgICBp
ZiAoc2hvdWxkV3JhcFVuYnJlYWthYmxlQ29udGVudFRvTmV4dExpbmUoKSkKLSAgICAgICAgcmV0
dXJuIHsgUmVzdWx0OjpBY3Rpb246OldyYXAsIElzRW5kT2ZMaW5lOjpZZXMgfTsKLSAgICBpZiAo
bGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pCi0gICAgICAg
IHJldHVybiB7IFJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xhc3RXcmFwT3Bwb3J0dW5pdHksIElz
RW5kT2ZMaW5lOjpZZXMgfTsKLSAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCwgSXNF
bmRPZkxpbmU6Ok5vIH07Ci19Ci0KLU92ZXJmbG93aW5nVGV4dENvbnRlbnQgSW5saW5lQ29udGVu
dEJyZWFrZXI6OnByb2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnRXaXRoVGV4dChjb25zdCBDb250aW51
b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQsIGNvbnN0IExpbmVTdGF0dXMmIGxpbmVTdGF0
dXMpIGNvbnN0Ci17Ci0gICAgYXV0byYgcnVucyA9IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKTsK
LSAgICBBU1NFUlQoIXJ1bnMuaXNFbXB0eSgpKTsKLQotICAgIGF1dG8gaXNCcmVha2FibGVSdW4g
PSBbXSAoYXV0byYgcnVuKSB7Ci0gICAgICAgIEFTU0VSVChydW4uaW5saW5lSXRlbS5pc1RleHQo
KSB8fCBydW4uaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgcnVuLmlubGluZUl0ZW0u
aXNJbmxpbmVCb3hFbmQoKSB8fCBydW4uaW5saW5lSXRlbS5sYXlvdXRCb3goKS5pc0ltYWdlKCkp
OwotICAgICAgICBpZiAoIXJ1bi5pbmxpbmVJdGVtLmlzVGV4dCgpKSB7Ci0gICAgICAgICAgICAv
LyBDYW4ndCBicmVhayBob3Jpem9udGFsIHNwYWNpbmcgLT4gZS5nLiA8c3BhbiBzdHlsZT0icGFk
ZGluZy1yaWdodDogMTAwcHg7Ij50ZXh0Y29udGVudDwvc3Bhbj4sIGlmIHRoZSBbaW5saW5lIGJv
eCBlbmRdIGlzIHRoZSBvdmVyZmxvd24gaW5saW5lIGl0ZW0KLSAgICAgICAgICAgIC8vIHdlIG5l
ZWQgdG8gY2hlY2sgaWYgdGhlcmUncyBhbm90aGVyIGlubGluZSBpdGVtIGJleW9uZCB0aGUgW2lu
bGluZSBib3ggZW5kXSB0byBzcGxpdC4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgfQotICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHRleHQgcnVuIG5lZWRzIHRvIHN0YXkgb24g
dGhlIGN1cnJlbnQgbGluZS4gIAotICAgICAgICByZXR1cm4gaXNXcmFwcGluZ0FsbG93ZWQocnVu
LmlubGluZUl0ZW0pOwotICAgIH07Ci0KLSAgICBhdXRvIGZpbmRUcmFpbGluZ1J1bkluZGV4ID0g
WyZdIChhdXRvIGJyZWFrYWJsZVJ1bkluZGV4KSAtPiBPcHRpb25hbDxzaXplX3Q+IHsKLSAgICAg
ICAgLy8gV2hlbiB0aGUgYnJlYWtpbmcgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0
aGUgcnVuLCB0aGUgdHJhaWxpbmcgcnVuIGlzIHRoZSBwcmV2aW91cyBvbmUuCi0gICAgICAgIGlm
ICghYnJlYWthYmxlUnVuSW5kZXgpCi0gICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAv
LyBUcnkgbm90IGJyZWFrIGNvbnRlbnQgYXQgaW5saW5lIGJveCBib3VuZGFyeQotICAgICAgICAv
LyBlLmcuIDxzcGFuPmZpdHM8L3NwYW4+PHNwYW4+b3ZlcmZsb3dzPC9zcGFuPgotICAgICAgICAv
LyB3aGVuIHRoZSB0ZXh0ICJvdmVyZmxvd3MiIGNvbXBsZXRlbHkgb3ZlcmZsb3dzLCBsZXQncyBi
cmVhayB0aGUgY29udGVudCByaWdodCBiZWZvcmUgdGhlICc8c3Bhbj4nLgotICAgICAgICAvLyBG
SVhNRTogQWRkIHN1cHBvcnQgZm9yIHN1YnNlcXVlbnQgZW1wdHkgaW5saW5lIGJveGVzIGUuZy4K
LSAgICAgICAgYXV0byB0cmFpbGluZ0NhbmRpZGF0ZUluZGV4ID0gYnJlYWthYmxlUnVuSW5kZXgg
LSAxOwotICAgICAgICBhdXRvIGlzQXRJbmxpbmVCb3ggPSBydW5zW3RyYWlsaW5nQ2FuZGlkYXRl
SW5kZXhdLmlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpOwotICAgICAgICByZXR1cm4gIWlz
QXRJbmxpbmVCb3ggPyB0cmFpbGluZ0NhbmRpZGF0ZUluZGV4IDogdHJhaWxpbmdDYW5kaWRhdGVJ
bmRleCA/IG1ha2VPcHRpb25hbCh0cmFpbGluZ0NhbmRpZGF0ZUluZGV4IC0gMSkgOiBXVEY6Om51
bGxvcHQ7Ci0gICAgfTsKLQotICAgIC8vIENoZWNrIHdoZXJlIHRoZSBvdmVyZmxvdyBvY2N1cnMg
YW5kIHVzZSB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSB0byBmaWd1cmUgb3V0IHRoZSBicmVha2lu
ZyBiZWhhdmlvdXIuCi0gICAgLy8gPHNwYW4gc3R5bGU9IndvcmQtYnJlYWs6IG5vcm1hbCI+Zmly
c3Q8L3NwYW4+PHNwYW4gc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLWFsbCI+c2Vjb25kPC9zcGFu
PjxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBub3JtYWwiPnRoaXJkPC9zcGFuPgotCi0gICAgLy8g
Rmlyc3QgZmluZCB0aGUgb3ZlcmZsb3dpbmcgcnVuLiAKLSAgICBhdXRvIGFjY3VtdWxhdGVkQ29u
dGVudFdpZHRoID0gSW5saW5lTGF5b3V0VW5pdCB7IH07Ci0gICAgYXV0byBvdmVyZmxvd2luZ1J1
bkluZGV4ID0gcnVucy5zaXplKCk7IAotICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXgg
PCBydW5zLnNpemUoKTsgKytpbmRleCkgewotICAgICAgICBhdXRvIHJ1bkxvZ2ljYWxXaWR0aCA9
IHJ1bnNbaW5kZXhdLmxvZ2ljYWxXaWR0aDsKLSAgICAgICAgaWYgKGFjY3VtdWxhdGVkQ29udGVu
dFdpZHRoICsgcnVuTG9naWNhbFdpZHRoICA+IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGgpIHsK
LSAgICAgICAgICAgIG92ZXJmbG93aW5nUnVuSW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0gICAgICAgIGFjY3VtdWxhdGVkQ29udGVudFdpZHRoICs9IHJ1bkxv
Z2ljYWxXaWR0aDsKLSAgICB9Ci0gICAgLy8gV2UgaGF2ZSB0byBoYXZlIGFuIG92ZXJmbG93aW5n
IHJ1bi4KLSAgICBSRUxFQVNFX0FTU0VSVChvdmVyZmxvd2luZ1J1bkluZGV4IDwgcnVucy5zaXpl
KCkpOwotCi0gICAgYXV0byB0cnlCcmVha2luZ092ZXJmbG93aW5nUnVuID0gWyZdKCkgLT4gT3B0
aW9uYWw8T3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbj4gewotICAgICAg
ICBhdXRvIG92ZXJmbG93aW5nUnVuID0gcnVuc1tvdmVyZmxvd2luZ1J1bkluZGV4XTsKLSAgICAg
ICAgaWYgKCFpc0JyZWFrYWJsZVJ1bihvdmVyZmxvd2luZ1J1bikpCi0gICAgICAgICAgICByZXR1
cm4geyB9OwotICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gdHJ5QnJlYWtpbmdUZXh0UnVu
KG92ZXJmbG93aW5nUnVuLCBsaW5lU3RhdHVzLmNvbnRlbnRMb2dpY2FsUmlnaHQgKyBhY2N1bXVs
YXRlZENvbnRlbnRXaWR0aCwgc3RkOjptYXgoMC4wZiwgbGluZVN0YXR1cy5hdmFpbGFibGVXaWR0
aCAtIGFjY3VtdWxhdGVkQ29udGVudFdpZHRoKSwgbGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5p
dHlBdFByZXZpb3VzUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICBpZiAocGFydGlhbFJ1bi0+bGVu
Z3RoKQotICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVh
a2luZ1Bvc2l0aW9uIHsgb3ZlcmZsb3dpbmdSdW5JbmRleCwgT3ZlcmZsb3dpbmdUZXh0Q29udGVu
dDo6QnJlYWtpbmdQb3NpdGlvbjo6VHJhaWxpbmdDb250ZW50IHsgZmFsc2UsIHBhcnRpYWxSdW4g
fSB9OwotICAgICAgICAgICAgLy8gV2hlbiB0aGUgYnJlYWtpbmcgcG9zaXRpb24gaXMgYXQgdGhl
IGJlZ2lubmluZyBvZiB0aGUgcnVuLCB0aGUgdHJhaWxpbmcgcnVuIGlzIHRoZSBwcmV2aW91cyBv
bmUuCi0gICAgICAgICAgICBpZiAoYXV0byB0cmFpbGluZ1J1bkluZGV4ID0gZmluZFRyYWlsaW5n
UnVuSW5kZXgob3ZlcmZsb3dpbmdSdW5JbmRleCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE92
ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb24geyAqdHJhaWxpbmdSdW5JbmRl
eCwgT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbjo6VHJhaWxpbmdDb250
ZW50IHsgfSB9OwotICAgICAgICAgICAgLy8gU29tZXRpbWVzIHdlIGNhbid0IGFjY29tbW9kYXRl
IGV2ZW4gdGhlIHZlcnkgZmlyc3QgY2hhcmFjdGVyLiAKLSAgICAgICAgICAgIC8vIE5vdGUgdGhh
dCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHdoZW4gdGhlcmUncyBubyBicmVha2FibGUgcnVuIGlu
IHRoaXMgc2V0LgotICAgICAgICAgICAgcmV0dXJuIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJy
ZWFraW5nUG9zaXRpb24geyB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB7IH07Ci0gICAg
fTsKLSAgICAvLyBDaGVjayBpZiB3ZSBhY3R1YWxseSBicmVhayB0aGlzIHJ1bi4KLSAgICBpZiAo
YXV0byBicmVha2luZ1Bvc2l0aW9uID0gdHJ5QnJlYWtpbmdPdmVyZmxvd2luZ1J1bigpKQotICAg
ICAgICByZXR1cm4geyBvdmVyZmxvd2luZ1J1bkluZGV4LCBicmVha2luZ1Bvc2l0aW9uIH07Ci0K
LSAgICBhdXRvIHRyeUJyZWFraW5nUHJldmlvdXNOb25PdmVyZmxvd2luZ1J1bnMgPSBbJl0oKSAt
PiBPcHRpb25hbDxPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uPiB7Ci0g
ICAgICAgIGF1dG8gcHJldmlvdXNDb250ZW50V2lkdGggPSBhY2N1bXVsYXRlZENvbnRlbnRXaWR0
aDsKLSAgICAgICAgZm9yIChhdXRvIGluZGV4ID0gb3ZlcmZsb3dpbmdSdW5JbmRleDsgaW5kZXgt
LTspIHsKLSAgICAgICAgICAgIGF1dG8mIHJ1biA9IHJ1bnNbaW5kZXhdOwotICAgICAgICAgICAg
cHJldmlvdXNDb250ZW50V2lkdGggLT0gcnVuLmxvZ2ljYWxXaWR0aDsKLSAgICAgICAgICAgIGlm
ICghaXNCcmVha2FibGVSdW4ocnVuKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgICAgIEFTU0VSVChydW4uaW5saW5lSXRlbS5pc1RleHQoKSk7Ci0gICAgICAgICAgICBpZiAo
YXV0byBwYXJ0aWFsUnVuID0gdHJ5QnJlYWtpbmdUZXh0UnVuKHJ1biwgbGluZVN0YXR1cy5jb250
ZW50TG9naWNhbFJpZ2h0ICsgcHJldmlvdXNDb250ZW50V2lkdGgsIHsgfSwgbGluZVN0YXR1cy5o
YXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAg
Ly8gV2Uga25vdyB0aGlzIHJ1biBmaXRzLCBzbyBpZiBicmVha2luZyBpcyBhbGxvd2VkIG9uIHRo
ZSBydW4sIGl0IHNob3VsZCByZXR1cm4gYSBub24tZW1wdHkgbGVmdC1zaWRlCi0gICAgICAgICAg
ICAgICAgLy8gc2luY2UgaXQncyBlaXRoZXIgYXQgaHlwaGVuIHBvc2l0aW9uIG9yIHRoZSBlbnRp
cmUgcnVuIGlzIHJldHVybmVkLgotICAgICAgICAgICAgICAgIEFTU0VSVChwYXJ0aWFsUnVuLT5s
ZW5ndGgpOwotICAgICAgICAgICAgICAgIGF1dG8gcnVuSXNGdWxseUFjY29tbW9kYXRlZCA9IHBh
cnRpYWxSdW4tPmxlbmd0aCA9PSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4ocnVuLmlubGluZUl0
ZW0pLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250
ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgaW5kZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJy
ZWFraW5nUG9zaXRpb246OlRyYWlsaW5nQ29udGVudCB7IGZhbHNlLCBydW5Jc0Z1bGx5QWNjb21t
b2RhdGVkID8gV1RGOjpudWxsb3B0IDogcGFydGlhbFJ1biB9IH07Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICB9OwotICAgIC8vIFdlIGRpZCBub3Qg
bWFuYWdlIHRvIGJyZWFrIHRoZSBydW4gdGhhdCBhY3R1YWxseSBvdmVyZmxvd3MgdGhlIGxpbmUu
Ci0gICAgLy8gTGV0J3MgdHJ5IHRvIGZpbmQgYSBwcmV2aW91cyBicmVha2luZyBwb3NpdGlvbiBz
dGFydGluZyBmcm9tIHRoZSBvdmVyZmxvd2luZyBydW4uIEl0IHN1cmVseSBmaXRzLgotICAgIGlm
IChhdXRvIGJyZWFraW5nUG9zaXRpb24gPSB0cnlCcmVha2luZ1ByZXZpb3VzTm9uT3ZlcmZsb3dp
bmdSdW5zKCkpCi0gICAgICAgIHJldHVybiB7IG92ZXJmbG93aW5nUnVuSW5kZXgsIGJyZWFraW5n
UG9zaXRpb24gfTsKLQotICAgIGF1dG8gdHJ5QnJlYWtpbmdOZXh0T3ZlcmZsb3dpbmdSdW5zID0g
WyZdKCkgLT4gT3B0aW9uYWw8T3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlv
bj4gewotICAgICAgICBhdXRvIG5leHRDb250ZW50V2lkdGggPSBhY2N1bXVsYXRlZENvbnRlbnRX
aWR0aCArIHJ1bnNbb3ZlcmZsb3dpbmdSdW5JbmRleF0ubG9naWNhbFdpZHRoOwotICAgICAgICBm
b3IgKGF1dG8gaW5kZXggPSBvdmVyZmxvd2luZ1J1bkluZGV4ICsgMTsgaW5kZXggPCBydW5zLnNp
emUoKTsgKytpbmRleCkgewotICAgICAgICAgICAgYXV0byYgcnVuID0gcnVuc1tpbmRleF07Ci0g
ICAgICAgICAgICBpZiAoaXNCcmVha2FibGVSdW4ocnVuKSkgewotICAgICAgICAgICAgICAgIEFT
U0VSVChydW4uaW5saW5lSXRlbS5pc1RleHQoKSk7Ci0gICAgICAgICAgICAgICAgLy8gV2Uga25v
dyB0aGF0IHRoaXMgcnVuIGRvZXMgbm90IGZpdCB0aGUgYXZhaWxhYmxlIHNwYWNlLiBJZiB3ZSBj
YW4gYnJlYWsgaXQgYXQgYW55IHBvc2l0aW9uLCBsZXQncyBqdXN0IHVzZSB0aGUgc3RhcnQgb2Yg
dGhlIHJ1bi4KLSAgICAgICAgICAgICAgICBpZiAod29yZEJyZWFrQmVoYXZpb3IocnVuLmlubGlu
ZUl0ZW0uc3R5bGUoKSwgbGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9z
aXRpb24pID09IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRpb24pIHsKLSAgICAgICAg
ICAgICAgICAgICAgLy8gV2UgbXVzdCBiZSBvbiBhbiBpbmxpbmUgYm94IGJvdW5kYXJ5LiBMZXQn
cyBnbyBiYWNrIHRvIHRoZSBydW4gaW4gZnJvbnQgb2YgdGhlIGlubGluZSBib3ggc3RhcnQgcnVu
LgotICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIDxzcGFuPnVuYnJlYWthYmxlX2FuZF9vdmVy
ZmxvdzxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay1hbGwiPmJyZWFrYWJsZTwvc3Bhbj4K
LSAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGF0ICJicmVha2FibGUiLCA8c3Bhbj4gaXMg
YXQgaW5kZXggLSAxIGFuZCB0aGUgdHJhaWxpbmcgcnVuIGlzIGF0IGluZGV4IC0gMi4KLSAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUKHJ1bnNbaW5kZXggLSAxXS5pbmxpbmVJdGVtLmlzSW5saW5l
Qm94U3RhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8gdHJhaWxpbmdSdW5JbmRleCA9
IGZpbmRUcmFpbGluZ1J1bkluZGV4KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0
cmFpbGluZ1J1bkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNvbnRp
bnVvdXMgY29udGVudCBkaWQgbm90IGZpdCBmcm9tIHRoZSBnZXQtZ28uIE5vIHRyYWlsaW5nIHJ1
bi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50
OjpCcmVha2luZ1Bvc2l0aW9uIHsgfTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgICAgICAvLyBBdCB3b3JzdCB3ZSBhcmUgYmFjayB0byB0aGUgb3ZlcmZsb3dpbmcgcnVu
LCBsaWtlIGluIHRoZSBleGFtcGxlIGFib3ZlLgotICAgICAgICAgICAgICAgICAgICBBU1NFUlQo
KnRyYWlsaW5nUnVuSW5kZXggPj0gb3ZlcmZsb3dpbmdSdW5JbmRleCk7Ci0gICAgICAgICAgICAg
ICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsg
KnRyYWlsaW5nUnVuSW5kZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRp
b246OlRyYWlsaW5nQ29udGVudCB7IHRydWUgfSB9OwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gdHJ5QnJlYWtpbmdUZXh0UnVuKHJ1biwg
bGluZVN0YXR1cy5jb250ZW50TG9naWNhbFJpZ2h0ICsgbmV4dENvbnRlbnRXaWR0aCwgeyB9LCBs
aW5lU3RhdHVzLmhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikpIHsKLSAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUKHBhcnRpYWxSdW4tPmxlbmd0aCk7Ci0gICAgICAgICAgICAg
ICAgICAgIC8vIFdlIG1hbmFnZWQgdG8gYnJlYWsgdGhpcyB0ZXh0IHJ1biBtaWQgY29udGVudC4g
SXQgaGFzIHRvIGJlIGEgaHlwaGVuIGJyZWFrLgotICAgICAgICAgICAgICAgICAgICByZXR1cm4g
T3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IGluZGV4LCBPdmVyZmxv
d2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uOjpUcmFpbGluZ0NvbnRlbnQgeyB0cnVl
LCBwYXJ0aWFsUnVuIH0gfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBuZXh0Q29udGVudFdpZHRoICs9IHJ1bi5sb2dpY2FsV2lkdGg7Ci0gICAgICAgIH0K
LSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICB9OwotICAgIC8vIEF0IHRoaXMgcG9pbnQgd2Uga25v
dyB0aGF0IHRoZXJlJ3Mgbm8gYnJlYWthYmxlIHJ1biBhbGwgdGhlIHdheSB0byB0aGUgb3ZlcmZs
b3dpbmcgcnVuLgotICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGFueSBydW4gYWZ0ZXIg
dGhlIG92ZXJmbG93aW5nIGNvbnRlbnQgY2FuIGJyZWFrLgotICAgIC8vIGUuZy4gPHNwYW4+dGhp
c19jb250ZW50X292ZXJmbG93c19idXRfbm90X2JyZWFrYWJsZTxzcGFuPjxzcGFuIHN0eWxlPSJ3
b3JkLWJyZWFrOiBicmVhay1hbGwiPmJ1dF90aGlzX2lzX2JyZWFrYWJsZTwvc3Bhbj4KLSAgICBp
ZiAoYXV0byBicmVha2luZ1Bvc2l0aW9uID0gdHJ5QnJlYWtpbmdOZXh0T3ZlcmZsb3dpbmdSdW5z
KCkpCi0gICAgICAgIHJldHVybiB7IG92ZXJmbG93aW5nUnVuSW5kZXgsIGJyZWFraW5nUG9zaXRp
b24gfTsKLQotICAgIC8vIEdpdmUgdXAsIHRoZXJlJ3Mgbm8gYnJlYWthYmxlIHJ1biBpbiBoZXJl
LgotICAgIHJldHVybiB7IG92ZXJmbG93aW5nUnVuSW5kZXggfTsKLX0KLQotT3B0aW9uU2V0PElu
bGluZUNvbnRlbnRCcmVha2VyOjpXb3JkQnJlYWtSdWxlPiBJbmxpbmVDb250ZW50QnJlYWtlcjo6
d29yZEJyZWFrQmVoYXZpb3IoY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlLCBib29sIGhhc1dyYXBP
cHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3QKLXsKLSAgICAvLyBEaXNyZWdhcmQg
YW55IHByb2hpYml0aW9uIGFnYWluc3QgbGluZSBicmVha3MgbWFuZGF0ZWQgYnkgdGhlIHdvcmQt
YnJlYWsgcHJvcGVydHkuCi0gICAgLy8gVGhlIGRpZmZlcmVudCB3cmFwcGluZyBvcHBvcnR1bml0
aWVzIG11c3Qgbm90IGJlIHByaW9yaXRpemVkLiBIeXBoZW5hdGlvbiBpcyBub3QgYXBwbGllZC4K
LSAgICBpZiAoc3R5bGUubGluZUJyZWFrKCkgPT0gTGluZUJyZWFrOjpBbnl3aGVyZSkKLSAgICAg
ICAgcmV0dXJuIHsgV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbiB9OwotICAgIC8v
IEJyZWFraW5nIGlzIGFsbG93ZWQgd2l0aGluIOKAnHdvcmRz4oCdLgotICAgIGlmIChzdHlsZS53
b3JkQnJlYWsoKSA9PSBXb3JkQnJlYWs6OkJyZWFrQWxsKQotICAgICAgICByZXR1cm4geyBXb3Jk
QnJlYWtSdWxlOjpBdEFyYml0cmFyeVBvc2l0aW9uIH07Ci0gICAgLy8gQnJlYWtpbmcgaXMgZm9y
YmlkZGVuIHdpdGhpbiDigJx3b3Jkc+KAnS4KLSAgICBpZiAoc3R5bGUud29yZEJyZWFrKCkgPT0g
V29yZEJyZWFrOjpLZWVwQWxsKQotICAgICAgICByZXR1cm4geyB9OwotCi0gICAgYXV0byBicmVh
a1J1bGVzID0gT3B0aW9uU2V0PFdvcmRCcmVha1J1bGU+IHsgfTsKLSAgICBhdXRvIGh5cGhlbmF0
aW9uSXNBbGxvd2VkID0gIW5faHlwaGVuYXRpb25Jc0Rpc2FibGVkICYmIHN0eWxlLmh5cGhlbnMo
KSA9PSBIeXBoZW5zOjpBdXRvICYmIGNhbkh5cGhlbmF0ZShzdHlsZS5jb21wdXRlZExvY2FsZSgp
KTsKLSAgICBpZiAoaHlwaGVuYXRpb25Jc0FsbG93ZWQpCi0gICAgICAgIGJyZWFrUnVsZXMuYWRk
KHsgV29yZEJyZWFrUnVsZTo6QXRIeXBoZW5hdGlvbk9wcG9ydHVuaXRpZXMgfSk7Ci0gICAgLy8g
Rm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgY29udGVudCwgdGhlIHdvcmQtYnJlYWsgcHJv
cGVydHkgYWxzbyBzdXBwb3J0cyBhIGRlcHJlY2F0ZWQgYnJlYWstd29yZCBrZXl3b3JkLgotICAg
IC8vIFdoZW4gc3BlY2lmaWVkLCB0aGlzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgd29yZC1icmVh
azogbm9ybWFsIGFuZCBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZSwgcmVnYXJkbGVzcyBvZiB0aGUg
YWN0dWFsIHZhbHVlIG9mIHRoZSBvdmVyZmxvdy13cmFwIHByb3BlcnR5LgotICAgIGlmIChzdHls
ZS53b3JkQnJlYWsoKSA9PSBXb3JkQnJlYWs6OkJyZWFrV29yZCAmJiAhaGFzV3JhcE9wcG9ydHVu
aXR5QXRQcmV2aW91c1Bvc2l0aW9uKSB7Ci0gICAgICAgIGJyZWFrUnVsZXMuYWRkKHsgV29yZEJy
ZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbiB9KTsKLSAgICAgICAgcmV0dXJuIGJyZWFrUnVs
ZXM7Ci0gICAgfQotICAgIC8vIE92ZXJmbG93V3JhcDo6QnJlYWs6IEFuIG90aGVyd2lzZSB1bmJy
ZWFrYWJsZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIG1heSBiZSBicm9rZW4gYXQgYW4gYXJiaXRy
YXJ5IHBvaW50IGlmIHRoZXJlIGFyZSBubyBvdGhlcndpc2UtYWNjZXB0YWJsZSBicmVhayBwb2lu
dHMgaW4gdGhlIGxpbmUuCi0gICAgaWYgKHN0eWxlLm92ZXJmbG93V3JhcCgpID09IE92ZXJmbG93
V3JhcDo6QnJlYWsgJiYgIWhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgewot
ICAgICAgICBicmVha1J1bGVzLmFkZCh7IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRp
b24gfSk7Ci0gICAgICAgIHJldHVybiBicmVha1J1bGVzOwotICAgIH0KLSAgICByZXR1cm4gYnJl
YWtSdWxlczsKLX0KLQotT3B0aW9uYWw8SW5saW5lQ29udGVudEJyZWFrZXI6OlBhcnRpYWxSdW4+
IElubGluZUNvbnRlbnRCcmVha2VyOjp0cnlCcmVha2luZ1RleHRSdW4oY29uc3QgQ29udGludW91
c0NvbnRlbnQ6OlJ1biYgb3ZlcmZsb3dpbmdSdW4sIElubGluZUxheW91dFVuaXQgbG9naWNhbExl
ZnQsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGF2YWlsYWJsZVdpZHRoLCBib29sIGhhc1dy
YXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3QKLXsKLSAgICBBU1NFUlQob3Zl
cmZsb3dpbmdSdW4uaW5saW5lSXRlbS5pc1RleHQoKSk7Ci0gICAgYXV0byYgaW5saW5lVGV4dEl0
ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4ob3ZlcmZsb3dpbmdSdW4uaW5saW5lSXRlbSk7
Ci0gICAgYXV0byYgc3R5bGUgPSBpbmxpbmVUZXh0SXRlbS5zdHlsZSgpOwotICAgIGF1dG8gYXZh
aWxhYmxlU3BhY2VJc0luZmluaXRlID0gIWF2YWlsYWJsZVdpZHRoLmhhc1ZhbHVlKCk7Ci0KLSAg
ICBhdXRvIGJyZWFrUnVsZXMgPSB3b3JkQnJlYWtCZWhhdmlvcihzdHlsZSwgaGFzV3JhcE9wcG9y
dHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKTsKLSAgICBpZiAoYnJlYWtSdWxlcy5pc0VtcHR5KCkp
Ci0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICBpZiAoYnJlYWtSdWxlcy5jb250YWlucyhXb3Jk
QnJlYWtSdWxlOjpBdEh5cGhlbmF0aW9uT3Bwb3J0dW5pdGllcykpIHsKLSAgICAgICAgYXV0byB0
cnlCcmVha2luZ0F0SHlwaGVuYXRpb25PcHBvcnR1bml0eSA9IFsmXSgpIC0+IE9wdGlvbmFsPFBh
cnRpYWxSdW4+IHsKLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIGh5cGhlbiBwb3NpdGlvbiBhcyBm
b2xsb3dzOgotICAgICAgICAgICAgLy8gMS4gU3BsaXQgdGhlIHRleHQgYnkgdGFraW5nIHRoZSBo
eXBoZW4gd2lkdGggaW50byBhY2NvdW50Ci0gICAgICAgICAgICAvLyAyLiBGaW5kIHRoZSBsYXN0
IGh5cGhlbiBwb3NpdGlvbiBiZWZvcmUgdGhlIHNwbGl0IHBvc2l0aW9uCi0gICAgICAgICAgICBp
ZiAoIWF2YWlsYWJsZVNwYWNlSXNJbmZpbml0ZSAmJiAhKmF2YWlsYWJsZVdpZHRoKSB7Ci0gICAg
ICAgICAgICAgICAgLy8gV2Ugd29uJ3QgYmUgYWJsZSB0byBmaW5kIGh5cGhlbiBsb2NhdGlvbiB3
aGVuIHRoZXJlJ3Mgbm8gYXZhaWxhYmxlIHNwYWNlLgotICAgICAgICAgICAgICAgIHJldHVybiB7
IH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIHJ1bkxlbmd0aCA9IGlubGluZVRl
eHRJdGVtLmxlbmd0aCgpOwotICAgICAgICAgICAgdW5zaWduZWQgbGltaXRCZWZvcmUgPSBzdHls
ZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCkgPT0gUmVuZGVyU3R5bGU6OmluaXRpYWxIeXBoZW5h
dGlvbkxpbWl0QmVmb3JlKCkgPyAwIDogc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpOwot
ICAgICAgICAgICAgdW5zaWduZWQgbGltaXRBZnRlciA9IHN0eWxlLmh5cGhlbmF0aW9uTGltaXRB
ZnRlcigpID09IFJlbmRlclN0eWxlOjppbml0aWFsSHlwaGVuYXRpb25MaW1pdEFmdGVyKCkgPyAw
IDogc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCk7Ci0gICAgICAgICAgICAvLyBDaGVjayBp
ZiB0aGlzIHJ1biBjYW4gYWNjb21tb2RhdGUgdGhlIGJlZm9yZS9hZnRlciBsaW1pdHMgYXQgYWxs
IGJlZm9yZSBzdGFydCBtZWFzdXJpbmcgdGV4dC4KLSAgICAgICAgICAgIGlmIChsaW1pdEJlZm9y
ZSA+PSBydW5MZW5ndGggfHwgbGltaXRBZnRlciA+PSBydW5MZW5ndGggfHwgbGltaXRCZWZvcmUg
KyBsaW1pdEFmdGVyID4gcnVuTGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiB7IH07Ci0K
LSAgICAgICAgICAgIHVuc2lnbmVkIGxlZnRTaWRlTGVuZ3RoID0gcnVuTGVuZ3RoOwotICAgICAg
ICAgICAgYXV0byYgZm9udENhc2NhZGUgPSBzdHlsZS5mb250Q2FzY2FkZSgpOwotICAgICAgICAg
ICAgYXV0byBoeXBoZW5XaWR0aCA9IElubGluZUxheW91dFVuaXQgeyBmb250Q2FzY2FkZS53aWR0
aChUZXh0UnVuIHsgU3RyaW5nVmlldyB7IHN0eWxlLmh5cGhlblN0cmluZygpIH0gfSkgfTsKLSAg
ICAgICAgICAgIGlmICghYXZhaWxhYmxlU3BhY2VJc0luZmluaXRlKSB7Ci0gICAgICAgICAgICAg
ICAgYXV0byBhdmFpbGFibGVXaWR0aEV4Y2x1ZGluZ0h5cGhlbiA9ICphdmFpbGFibGVXaWR0aCAt
IGh5cGhlbldpZHRoOwotICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVXaWR0aEV4Y2x1ZGlu
Z0h5cGhlbiA8PSAwIHx8ICFlbm91Z2hXaWR0aEZvckh5cGhlbmF0aW9uKGF2YWlsYWJsZVdpZHRo
RXhjbHVkaW5nSHlwaGVuLCBmb250Q2FzY2FkZS5waXhlbFNpemUoKSkpCi0gICAgICAgICAgICAg
ICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgICAgICAgICAgbGVmdFNpZGVMZW5ndGggPSBUZXh0
VXRpbDo6c3BsaXQoaW5saW5lVGV4dEl0ZW0sIG92ZXJmbG93aW5nUnVuLmxvZ2ljYWxXaWR0aCwg
YXZhaWxhYmxlV2lkdGhFeGNsdWRpbmdIeXBoZW4sIGxvZ2ljYWxMZWZ0KS5sZW5ndGg7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGVmdFNpZGVMZW5ndGggPCBsaW1pdEJlZm9yZSkK
LSAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAgICAgLy8gQWRqdXN0IGJlZm9y
ZSBpbmRleCB0byBhY2NvbW1vZGF0ZSB0aGUgbGltaXQtYWZ0ZXIgdmFsdWUgKGl0J3MgdGhlIGxh
c3QgcG90ZW50aWFsIGh5cGhlbiBsb2NhdGlvbiBpbiB0aGlzIHJ1bikuCi0gICAgICAgICAgICBh
dXRvIGh5cGhlbkJlZm9yZSA9IHN0ZDo6bWluKGxlZnRTaWRlTGVuZ3RoLCBydW5MZW5ndGggLSBs
aW1pdEFmdGVyKSArIDE7Ci0gICAgICAgICAgICB1bnNpZ25lZCBoeXBoZW5Mb2NhdGlvbiA9IGxh
c3RIeXBoZW5Mb2NhdGlvbihTdHJpbmdWaWV3KGlubGluZVRleHRJdGVtLmlubGluZVRleHRCb3go
KS5jb250ZW50KCkpLnN1YnN0cmluZyhpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBpbmxpbmVUZXh0
SXRlbS5sZW5ndGgoKSksIGh5cGhlbkJlZm9yZSwgc3R5bGUuY29tcHV0ZWRMb2NhbGUoKSk7Ci0g
ICAgICAgICAgICBpZiAoIWh5cGhlbkxvY2F0aW9uIHx8IGh5cGhlbkxvY2F0aW9uIDwgbGltaXRC
ZWZvcmUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgICAgIC8vIGh5cGhl
bkxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGlzIElubGluZUl0ZW1UZXh0
LgotICAgICAgICAgICAgQVNTRVJUKGlubGluZVRleHRJdGVtLnN0YXJ0KCkgKyBoeXBoZW5Mb2Nh
dGlvbiA8IGlubGluZVRleHRJdGVtLmVuZCgpKTsKLSAgICAgICAgICAgIGF1dG8gdHJhaWxpbmdQ
YXJ0aWFsUnVuV2lkdGhXaXRoSHlwaGVuID0gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRJdGVt
LCBpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBpbmxpbmVUZXh0SXRlbS5zdGFydCgpICsgaHlwaGVu
TG9jYXRpb24sIGxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgICAgIHJldHVybiBQYXJ0aWFsUnVuIHsg
aHlwaGVuTG9jYXRpb24sIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoV2l0aEh5cGhlbiwgaHlwaGVu
V2lkdGggfTsKLSAgICAgICAgfTsKLSAgICAgICAgaWYgKGF1dG8gcGFydGlhbFJ1biA9IHRyeUJy
ZWFraW5nQXRIeXBoZW5hdGlvbk9wcG9ydHVuaXR5KCkpCi0gICAgICAgICAgICByZXR1cm4gcGFy
dGlhbFJ1bjsKLSAgICB9Ci0KLSAgICBpZiAoYnJlYWtSdWxlcy5jb250YWlucyhXb3JkQnJlYWtS
dWxlOjpBdEFyYml0cmFyeVBvc2l0aW9uKSkgewotICAgICAgICBhdXRvIHRyeUJyZWFraW5nQXRB
cmJpdHJhcnlQb3NpdGlvbiA9IFsmXSgpIC0+IFBhcnRpYWxSdW4gewotICAgICAgICAgICAgaWYg
KCFpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIC8vIEVtcHR5IHRl
eHQgcnVucyBtYXkgYmUgYnJlYWthYmxlIGJhc2VkIG9uIHN0eWxlLCBidXQgaW4gcHJhY3RpY2Ug
d2UgY2FuJ3QgcmVhbGx5IHNwbGl0IHRoZW0gYW55IGZ1cnRoZXIuCi0gICAgICAgICAgICAgICAg
cmV0dXJuIHsgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdmFpbGFibGVTcGFj
ZUlzSW5maW5pdGUpIHsKLSAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBydW4gY2FuIGJlIHNw
bGl0IGF0IGFyYml0cmFyeSBwb3NpdGlvbiBsZXQncyBqdXN0IHJldHVybiB0aGUgZW50aXJlIHJ1
biB3aGVuIGl0IGlzIGludGVuZGVkIHRvIGZpdCBvbiB0aGUgbGluZS4KLSAgICAgICAgICAgICAg
ICBBU1NFUlQoaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGF1dG8g
dHJhaWxpbmdQYXJ0aWFsUnVuV2lkdGggPSBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0s
IGxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4geyBpbmxpbmVUZXh0SXRlbS5s
ZW5ndGgoKSwgdHJhaWxpbmdQYXJ0aWFsUnVuV2lkdGggfTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGlmICghKmF2YWlsYWJsZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgLy8gRmFzdCBw
YXRoIGZvciBjYXNlcyB3aGVuIHRoZXJlJ3Mgbm8gcm9vbSBhdCBhbGwuIFRoZSBjb250ZW50IGlz
IGJyZWFrYWJsZSBidXQgd2UgZG9uJ3QgaGF2ZSBzcGFjZSBmb3IgaXQuCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIHsgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dG8gc3BsaXREYXRh
ID0gVGV4dFV0aWw6OnNwbGl0KGlubGluZVRleHRJdGVtLCBvdmVyZmxvd2luZ1J1bi5sb2dpY2Fs
V2lkdGgsICphdmFpbGFibGVXaWR0aCwgbG9naWNhbExlZnQpOwotICAgICAgICAgICAgcmV0dXJu
IHsgc3BsaXREYXRhLmxlbmd0aCwgc3BsaXREYXRhLmxvZ2ljYWxXaWR0aCB9OwotICAgICAgICB9
OwotICAgICAgICAvLyBXaXRoIGFyYml0cmFyeSBicmVha2luZyB0aGVyZSdzIGFsd2F5cyBhIHZh
bGlkIGJyZWFraW5nIHBvc2l0aW9uIChldmVuIGlmIGl0IGlzIGJlZm9yZSB0aGUgZmlyc3QgcG9z
aXRpb24pLgotICAgICAgICByZXR1cm4gdHJ5QnJlYWtpbmdBdEFyYml0cmFyeVBvc2l0aW9uKCk7
Ci0gICAgfQotICAgIHJldHVybiB7IH07Ci19Ci0KLXZvaWQgSW5saW5lQ29udGVudEJyZWFrZXI6
OkNvbnRpbnVvdXNDb250ZW50OjphcHBlbmQoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwg
SW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+
IGNvbGxhcHNpYmxlV2lkdGgpCi17Ci0gICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGxv
Z2ljYWxXaWR0aCB9KTsKLSAgICBtX2xvZ2ljYWxXaWR0aCA9IGNsYW1wVG88SW5saW5lTGF5b3V0
VW5pdD4obV9sb2dpY2FsV2lkdGggKyBsb2dpY2FsV2lkdGgpOwotICAgIGlmICghY29sbGFwc2li
bGVXaWR0aCkgewotICAgICAgICBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoID0geyB9OwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgqY29sbGFwc2libGVXaWR0aCA9PSBsb2dpY2Fs
V2lkdGgpIHsKLSAgICAgICAgLy8gRnVsbHkgY29sbGFwc2libGUgcnVuLgotICAgICAgICBtX2Nv
bGxhcHNpYmxlTG9naWNhbFdpZHRoICs9IGxvZ2ljYWxXaWR0aDsKLSAgICAgICAgQVNTRVJUKG1f
Y29sbGFwc2libGVMb2dpY2FsV2lkdGggPD0gbV9sb2dpY2FsV2lkdGgpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotICAgIC8vIFBhcnRpYWxseSBjb2xsYXBzaWJsZSBydW4uCi0gICAgbV9jb2xs
YXBzaWJsZUxvZ2ljYWxXaWR0aCA9ICpjb2xsYXBzaWJsZVdpZHRoOwotICAgIEFTU0VSVChtX2Nv
bGxhcHNpYmxlTG9naWNhbFdpZHRoIDw9IG1fbG9naWNhbFdpZHRoKTsKLX0KLQotdm9pZCBJbmxp
bmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OnJlc2V0KCkKLXsKLSAgICBtX2xv
Z2ljYWxXaWR0aCA9IHsgfTsKLSAgICBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoID0geyB9Owot
ICAgIG1fcnVucy5jbGVhcigpOwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2VyLmgg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJl
YWtlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDJkNGQ2Y2U4YzE4OTMxZDVm
ZThiNTBhMzczMDFkNGFjYThlN2Q5Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZUNvbnRlbnRCcmVha2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
Ci0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgot
ICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRF
WFQpCi0KLSNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0K
LWNsYXNzIFJlbmRlclN0eWxlOwotCi1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgSW5saW5l
SXRlbTsKLXN0cnVjdCBPdmVyZmxvd2luZ1RleHRDb250ZW50OwotCi1jbGFzcyBJbmxpbmVDb250
ZW50QnJlYWtlciB7Ci1wdWJsaWM6Ci0gICAgc3RydWN0IFBhcnRpYWxSdW4gewotICAgICAgICBz
aXplX3QgbGVuZ3RoIHsgMCB9OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0
aCB7IDAgfTsKLSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gaHlwaGVuV2lkdGgg
eyB9OwotICAgIH07Ci0gICAgZW51bSBjbGFzcyBJc0VuZE9mTGluZSB7IE5vLCBZZXMgfTsKLSAg
ICBzdHJ1Y3QgUmVzdWx0IHsKLSAgICAgICAgZW51bSBjbGFzcyBBY3Rpb24gewotICAgICAgICAg
ICAgS2VlcCwgLy8gS2VlcCBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAgICAg
ICBCcmVhaywgLy8gUGFydGlhbCBjb250ZW50IGlzIG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAg
ICAgICAgICBXcmFwLCAvLyBDb250ZW50IGlzIHdyYXBwZWQgdG8gdGhlIG5leHQgbGluZS4KLSAg
ICAgICAgICAgIFdyYXBXaXRoSHlwaGVuLCAvLyBDb250ZW50IGlzIHdyYXBwZWQgdG8gdGhlIG5l
eHQgbGluZSBhbmQgdGhlIGN1cnJlbnQgbGluZSBlbmRzIHdpdGggYSB2aXNpYmxlIGh5cGhlbi4K
LSAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGNvbnRlbnQgb3ZlcmZsb3dzIGFuZCBjYW4ndCBn
ZXQgYnJva2VuIHVwIGludG8gc21hbGxlciBiaXRzLgotICAgICAgICAgICAgUmV2ZXJ0VG9MYXN0
V3JhcE9wcG9ydHVuaXR5LCAvLyBUaGUgY29udGVudCBuZWVkcyB0byBiZSByZXZlcnRlZCBiYWNr
IHRvIHRoZSBsYXN0IHdyYXAgb3Bwb3J0dW5pdHkuCi0gICAgICAgICAgICBSZXZlcnRUb0xhc3RO
b25PdmVyZmxvd2luZ1dyYXBPcHBvcnR1bml0eSAvLyBUaGUgY29udGVudCBuZWVkcyB0byBiZSBy
ZXZlcnRlZCBiYWNrIHRvIGEgd3JhcCBvcHBvcnR1bml0eSB0aGF0IHN0aWxsIGZpdHMgdGhlIGxp
bmUuCi0gICAgICAgIH07Ci0gICAgICAgIHN0cnVjdCBQYXJ0aWFsVHJhaWxpbmdDb250ZW50IHsK
LSAgICAgICAgICAgIHNpemVfdCB0cmFpbGluZ1J1bkluZGV4IHsgMCB9OwotICAgICAgICAgICAg
T3B0aW9uYWw8UGFydGlhbFJ1bj4gcGFydGlhbFJ1bjsgLy8gbnVsbG9wdCBwYXJ0aWFsIHJ1biBt
ZWFucyB0aGUgdHJhaWxpbmcgcnVuIGlzIGEgY29tcGxldGUgcnVuLgotICAgICAgICB9OwotICAg
ICAgICBBY3Rpb24gYWN0aW9uIHsgQWN0aW9uOjpLZWVwIH07Ci0gICAgICAgIElzRW5kT2ZMaW5l
IGlzRW5kT2ZMaW5lIHsgSXNFbmRPZkxpbmU6Ok5vIH07Ci0gICAgICAgIE9wdGlvbmFsPFBhcnRp
YWxUcmFpbGluZ0NvbnRlbnQ+IHBhcnRpYWxUcmFpbGluZ0NvbnRlbnQgeyB9OwotICAgICAgICBj
b25zdCBJbmxpbmVJdGVtKiBsYXN0V3JhcE9wcG9ydHVuaXR5SXRlbSB7IG51bGxwdHIgfTsKLSAg
ICB9OwotCi0gICAgLy8gVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIGNvbnRp
bnVvdXMgY29udGVudCBjb21taXR0ZWQgdG8gY29udGVudCBicmVha2luZyBhdCBhIHRpbWUgKG5v
IGluLWJldHdlZW4gd3JhcCBvcHBvcnR1bml0aWVzKS4KLSAgICAvLyBlLmcuCi0gICAgLy8gPGRp
dj50ZXh0IGNvbnRlbnQgPHNwYW4+c3BhbjE8L3NwYW4+YmV0d2VlbjxzcGFuPnNwYW4yPC9zcGFu
PjwvZGl2PgotICAgIC8vIFt0ZXh0XVsgXVtjb250ZW50XVsgXVtpbmxpbmUgYm94IHN0YXJ0XVtz
cGFuMV1baW5saW5lIGJveCBlbmRdW2JldHdlZW5dW2lubGluZSBib3ggc3RhcnRdW3NwYW4yXVtp
bmxpbmUgYm94IGVuZF0KLSAgICAvLyBjb250aW51b3VzIGNhbmRpZGF0ZSBjb250ZW50IGF0IGEg
dGltZToKLSAgICAvLyAxLiBbdGV4dF0KLSAgICAvLyAyLiBbIF0KLSAgICAvLyAzLiBbY29udGVu
dF0KLSAgICAvLyA0LiBbIF0KLSAgICAvLyA1LiBbaW5saW5lIGJveCBzdGFydF1bc3BhbjFdW2lu
bGluZSBib3ggZW5kXVtiZXR3ZWVuXVtpbmxpbmUgYm94IHN0YXJ0XVtzcGFuMl1baW5saW5lIGJv
eCBlbmRdCi0gICAgLy8gc2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdGV4dC0zLyNs
aW5lLWJyZWFrLWRldGFpbHMKLSAgICBzdHJ1Y3QgQ29udGludW91c0NvbnRlbnQgewotICAgICAg
ICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNh
bFdpZHRoOyB9Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgY29sbGFwc2libGVMb2dpY2FsV2lk
dGgoKSBjb25zdCB7IHJldHVybiBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoOyB9Ci0gICAgICAg
IElubGluZUxheW91dFVuaXQgbm9uQ29sbGFwc2libGVMb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJl
dHVybiBsb2dpY2FsV2lkdGgoKSAtIGNvbGxhcHNpYmxlTG9naWNhbFdpZHRoKCk7IH0KLSAgICAg
ICAgYm9vbCBoYXNUcmFpbGluZ0NvbGxhcHNpYmxlQ29udGVudCgpIGNvbnN0IHsgcmV0dXJuICEh
Y29sbGFwc2libGVMb2dpY2FsV2lkdGgoKTsgfQotICAgICAgICBib29sIGlzRnVsbHlDb2xsYXBz
aWJsZSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxXaWR0aCgpID09IGNvbGxhcHNpYmxlTG9naWNh
bFdpZHRoKCk7IH0KLQotICAgICAgICB2b2lkIGFwcGVuZChjb25zdCBJbmxpbmVJdGVtJiwgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGNv
bGxhcHNpYmxlV2lkdGgpOwotICAgICAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICAgICAgc3RydWN0
IFJ1biB7Ci0gICAgICAgICAgICBSdW4oY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVu
aXQgbG9naWNhbFdpZHRoKTsKLSAgICAgICAgICAgIFJ1bihjb25zdCBSdW4mKTsKLSAgICAgICAg
ICAgIFJ1biYgb3BlcmF0b3I9KGNvbnN0IFJ1biYpOwotCi0gICAgICAgICAgICBjb25zdCBJbmxp
bmVJdGVtJiBpbmxpbmVJdGVtOwotICAgICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
V2lkdGggeyAwIH07Ci0gICAgICAgIH07Ci0gICAgICAgIHVzaW5nIFJ1bkxpc3QgPSBWZWN0b3I8
UnVuLCAzPjsKLSAgICAgICAgY29uc3QgUnVuTGlzdCYgcnVucygpIGNvbnN0IHsgcmV0dXJuIG1f
cnVuczsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgUnVuTGlzdCBtX3J1bnM7Ci0gICAgICAg
IElubGluZUxheW91dFVuaXQgbV9sb2dpY2FsV2lkdGggeyAwIH07Ci0gICAgICAgIElubGluZUxh
eW91dFVuaXQgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICB9OwotCi0gICAg
c3RydWN0IExpbmVTdGF0dXMgewotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dp
Y2FsUmlnaHQgeyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgg
eyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgY29sbGFwc2libGVXaWR0aCB7IDAgfTsK
LSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gdHJhaWxpbmdTb2Z0SHlwaGVuV2lk
dGg7Ci0gICAgICAgIGJvb2wgaGFzRnVsbHlDb2xsYXBzaWJsZVRyYWlsaW5nUnVuIHsgZmFsc2Ug
fTsKLSAgICAgICAgYm9vbCBoYXNDb250ZW50IHsgZmFsc2UgfTsKLSAgICAgICAgYm9vbCBoYXNX
cmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24geyBmYWxzZSB9OwotICAgIH07Ci0gICAg
UmVzdWx0IHByb2Nlc3NJbmxpbmVDb250ZW50KGNvbnN0IENvbnRpbnVvdXNDb250ZW50JiwgY29u
c3QgTGluZVN0YXR1cyYpOwotICAgIHZvaWQgc2V0SHlwaGVuYXRpb25EaXNhYmxlZCgpIHsgbl9o
eXBoZW5hdGlvbklzRGlzYWJsZWQgPSB0cnVlOyB9Ci0KLSAgICBzdGF0aWMgYm9vbCBpc1dyYXBw
aW5nQWxsb3dlZChjb25zdCBJbmxpbmVJdGVtJik7Ci0KLXByaXZhdGU6Ci0gICAgUmVzdWx0IHBy
b2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnQoY29uc3QgQ29udGludW91c0NvbnRlbnQmLCBjb25zdCBM
aW5lU3RhdHVzJikgY29uc3Q7Ci0gICAgT3ZlcmZsb3dpbmdUZXh0Q29udGVudCBwcm9jZXNzT3Zl
cmZsb3dpbmdDb250ZW50V2l0aFRleHQoY29uc3QgQ29udGludW91c0NvbnRlbnQmLCBjb25zdCBM
aW5lU3RhdHVzJikgY29uc3Q7Ci0gICAgT3B0aW9uYWw8UGFydGlhbFJ1bj4gdHJ5QnJlYWtpbmdU
ZXh0UnVuKGNvbnN0IENvbnRpbnVvdXNDb250ZW50OjpSdW4mIG92ZXJmbG93UnVuLCBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBhdmFpbGFi
bGVXaWR0aCwgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pIGNvbnN0
OwotCi0gICAgZW51bSBjbGFzcyBXb3JkQnJlYWtSdWxlIHsKLSAgICAgICAgQXRBcmJpdHJhcnlQ
b3NpdGlvbiAgICAgICAgPSAxIDw8IDAsCi0gICAgICAgIEF0SHlwaGVuYXRpb25PcHBvcnR1bml0
aWVzID0gMSA8PCAxCi0gICAgfTsKLSAgICBPcHRpb25TZXQ8V29yZEJyZWFrUnVsZT4gd29yZEJy
ZWFrQmVoYXZpb3IoY29uc3QgUmVuZGVyU3R5bGUmLCBib29sIGhhc1dyYXBPcHBvcnR1bml0eUF0
UHJldmlvdXNQb3NpdGlvbikgY29uc3Q7Ci0gICAgYm9vbCBzaG91bGRLZWVwRW5kT2ZMaW5lV2hp
dGVzcGFjZShjb25zdCBDb250aW51b3VzQ29udGVudCYpIGNvbnN0OwotCi0gICAgYm9vbCBuX2h5
cGhlbmF0aW9uSXNEaXNhYmxlZCB7IGZhbHNlIH07Ci19OwotCi1pbmxpbmUgSW5saW5lQ29udGVu
dEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50OjpSdW46OlJ1bihjb25zdCBJbmxpbmVJdGVtJiBp
bmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKLSAgICA6IGlubGluZUl0
ZW0oaW5saW5lSXRlbSkKLSAgICAsIGxvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGgpCi17Ci19Ci0K
LWlubGluZSBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OlJ1bjo6UnVu
KGNvbnN0IFJ1biYgb3RoZXIpCi0gICAgOiBpbmxpbmVJdGVtKG90aGVyLmlubGluZUl0ZW0pCi0g
ICAgLCBsb2dpY2FsV2lkdGgob3RoZXIubG9naWNhbFdpZHRoKQotewotfQotCi19Ci19Ci0jZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUZvcm1hdHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVm
b3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggYTUxZWFmZmNkYTNlZWNjNDNlMjE1ZDFkOTY0NjEwNmMwY2M1YTk3Mi4uMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5jcHAKKysr
IC9kZXYvbnVsbApAQCAtMSw2MTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
LSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgot
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25m
aWcuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxF
KExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGbG9hdGluZ0NvbnRleHQu
aCIKLSNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdT
dGF0ZS5oIgotI2luY2x1ZGUgIklubGluZUxpbmVCb3guaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5l
UnVuLmgiCi0jaW5jbHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIKLSNpbmNsdWRlICJJbnZhbGlkYXRp
b25TdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dENvbnRh
aW5lckJveC5oIgotI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKLSNpbmNsdWRlICJMYXlvdXRJ
bml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCi0jaW5jbHVkZSAiTGF5b3V0SW5saW5lVGV4dEJveC5o
IgotI2luY2x1ZGUgIkxheW91dExpbmVCcmVha0JveC5oIgotI2luY2x1ZGUgIkxheW91dFJlcGxh
Y2VkQm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKLSNpbmNsdWRlICJMb2dnaW5nLmgi
Ci0jaW5jbHVkZSAiUnVudGltZUVuYWJsZWRGZWF0dXJlcy5oIgotI2luY2x1ZGUgIlRleHRVdGls
LmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KLSNpbmNsdWRlIDx3dGYvdGV4
dC9UZXh0U3RyZWFtLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQg
ewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoSW5saW5lRm9ybWF0dGluZ0NvbnRleHQp
OwotCi1JbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6SW5saW5lRm9ybWF0dGluZ0NvbnRleHQoY29u
c3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIElubGluZUZvcm1hdHRpbmdT
dGF0ZSYgZm9ybWF0dGluZ1N0YXRlKQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGlu
Z0NvbnRleHRSb290LCBmb3JtYXR0aW5nU3RhdGUpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgY29u
c3QgQm94KiBuZXh0SW5saW5lTGV2ZWxCb3hUb0xheW91dChjb25zdCBCb3gmIGxheW91dEJveCwg
Y29uc3QgQ29udGFpbmVyQm94JiBzdGF5V2l0aGluKQotewotICAgIC8vIEF0b21pYyBpbmxpbmUt
bGV2ZWwgYm94ZXMgYW5kIGZsb2F0cyBhcmUgb3BhcXVlIGJveGVzIG1lYW5pbmcgdGhhdCB0aGV5
IGFyZQotICAgIC8vIHJlc3BvbnNpYmxlIGZvciB0aGVpciBvd24gY29udGVudCAoZG8gbm90IG5l
ZWQgdG8gZGVzY2VuZCBpbnRvIHRoZWlyIHN1YnRyZWVzKS4KLSAgICAvLyBPbmx5IGlubGluZSBi
b3hlcyBtYXkgaGF2ZSByZWxldmFudCBkZXNjZW5kYW50IGNvbnRlbnQuCi0gICAgaWYgKGxheW91
dEJveC5pc0lubGluZUJveCgpKSB7Ci0gICAgICAgIGlmIChpczxDb250YWluZXJCb3g+KGxheW91
dEJveCkgJiYgZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxvd09yRmxv
YXRpbmdDaGlsZCgpKSB7Ci0gICAgICAgICAgICAvLyBBbm9ueW1vdXMgaW5saW5lIHRleHQgYm94
ZXMvbGluZSBicmVha3MgY2FuJ3QgaGF2ZSBkZXNjZW5kYW50IGNvbnRlbnQgYnkgZGVmaW5pdGlv
bi4KLSAgICAgICAgICAgIEFTU0VSVCghbGF5b3V0Qm94LmlzSW5saW5lVGV4dEJveCgpICYmICFs
YXlvdXRCb3guaXNMaW5lQnJlYWtCb3goKSk7Ci0gICAgICAgICAgICByZXR1cm4gZG93bmNhc3Q8
Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8qIG5leHRJblByZU9yZGVyID0gJmxheW91
dEJveDsgbmV4dEluUHJlT3JkZXIgJiYgbmV4dEluUHJlT3JkZXIgIT0gJnN0YXlXaXRoaW47IG5l
eHRJblByZU9yZGVyID0gJm5leHRJblByZU9yZGVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAo
YXV0byogbmV4dFNpYmxpbmcgPSBuZXh0SW5QcmVPcmRlci0+bmV4dEluRmxvd09yRmxvYXRpbmdT
aWJsaW5nKCkpCi0gICAgICAgICAgICByZXR1cm4gbmV4dFNpYmxpbmc7Ci0gICAgfQotICAgIHJl
dHVybiBudWxscHRyOwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRJ
bkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiBpbnZhbGlkYXRpb25TdGF0ZSwgY29uc3Qg
Q29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBMT0dfV0lU
SF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1N0YXJ0XSAtPiBp
bmxpbmUgZm9ybWF0dGluZyBjb250ZXh0IC0+IGZvcm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkg
PDwgIikiKTsKLSAgICBBU1NFUlQocm9vdCgpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKTsK
LQotICAgIGludmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoaW52YWxpZGF0aW9uU3RhdGUpOwotICAg
IGF1dG8qIGxheW91dEJveCA9IHJvb3QoKS5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpOwot
ICAgIC8vIDEuIFZpc2l0IGVhY2ggaW5saW5lIGJveCBhbmQgcGFydGlhbGx5IGNvbXB1dGUgdGhl
aXIgZ2VvbWV0cnkgKG1hcmdpbnMsIHBhZGRpbmcgYW5kIGJvcmRlcnMpLgotICAgIC8vIDIuIENv
bGxlY3QgdGhlIGlubGluZSBpdGVtcyAoZmxhdHRlbiB0aGUgdGhlIGxheW91dCB0cmVlKSBhbmQg
cGxhY2UgdGhlbSBvbiBsaW5lcyBpbiBiaWRpcmVjdGlvbmFsIG9yZGVyLiAKLSAgICB3aGlsZSAo
bGF5b3V0Qm94KSB7Ci0gICAgICAgIEFTU0VSVChsYXlvdXRCb3gtPmlzSW5saW5lTGV2ZWxCb3go
KSB8fCBsYXlvdXRCb3gtPmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOwotCi0gICAgICAgIGlmIChs
YXlvdXRCb3gtPmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSB8fCBsYXlvdXRCb3gtPmlzRmxvYXRp
bmdQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgICAgIC8vIElubGluZS1ibG9ja3MsIGlubGluZS10
YWJsZXMgYW5kIHJlcGxhY2VkIGVsZW1lbnRzIChpbWcsIHZpZGVvKSBjYW4gYmUgc2l6ZWQgYnV0
IG5vdCB5ZXQgcG9zaXRpb25lZC4KLSAgICAgICAgICAgIGlmIChpczxDb250YWluZXJCb3g+KGxh
eW91dEJveCkgJiYgbGF5b3V0Qm94LT5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpIHsK
LSAgICAgICAgICAgICAgICBBU1NFUlQobGF5b3V0Qm94LT5pc0lubGluZUJsb2NrQm94KCkgfHwg
bGF5b3V0Qm94LT5pc0lubGluZVRhYmxlQm94KCkgfHwgbGF5b3V0Qm94LT5pc0Zsb2F0aW5nUG9z
aXRpb25lZCgpKTsKLSAgICAgICAgICAgICAgICBhdXRvJiBmb3JtYXR0aW5nUm9vdCA9IGRvd25j
YXN0PENvbnRhaW5lckJveD4oKmxheW91dEJveCk7Ci0gICAgICAgICAgICAgICAgY29tcHV0ZUJv
cmRlckFuZFBhZGRpbmcoZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwot
ICAgICAgICAgICAgICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbihmb3JtYXR0aW5nUm9vdCwgY29u
c3RyYWludHMuaG9yaXpvbnRhbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ1Jv
b3QuaGFzQ2hpbGQoKSkgewotICAgICAgICAgICAgICAgICAgICBhdXRvIGZvcm1hdHRpbmdDb250
ZXh0ID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ1Jv
b3QsIGxheW91dFN0YXRlKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ1Jv
b3QuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBm
b3JtYXR0aW5nQ29udGV4dC0+bGF5b3V0SW5GbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwg
Z2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoZm9ybWF0dGluZ1Jvb3QpKTsK
LSAgICAgICAgICAgICAgICAgICAgY29tcHV0ZUhlaWdodEFuZE1hcmdpbihmb3JtYXR0aW5nUm9v
dCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdHRp
bmdDb250ZXh0LT5sYXlvdXRPdXRPZkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBnZW9t
ZXRyeSgpLmNvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudChmb3JtYXR0aW5nUm9vdCkpOwot
ICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBjb21wdXRlSGVpZ2h0
QW5kTWFyZ2luKGZvcm1hdHRpbmdSb290LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICAg
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVwbGFjZWQgYW5kIG90aGVyIHR5
cGUgb2YgbGVhZiBhdG9taWMgaW5saW5lIGJveGVzLgotICAgICAgICAgICAgICAgIGNvbXB1dGVC
b3JkZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwotICAg
ICAgICAgICAgICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbigqbGF5b3V0Qm94LCBjb25zdHJhaW50
cy5ob3Jpem9udGFsKTsKLSAgICAgICAgICAgICAgICBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKCps
YXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwotICAgICAgICAgICAgfQotICAgICAg
ICB9IGVsc2UgaWYgKGxheW91dEJveC0+aXNMaW5lQnJlYWtCb3goKSkgewotICAgICAgICAgICAg
YXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSgqbGF5b3V0
Qm94KTsKLSAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyB9KTsK
LSAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldEJvcmRlcih7IH0pOwotICAgICAgICAgICAgYm94
R2VvbWV0cnkuc2V0UGFkZGluZyh7IH0pOwotICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29u
dGVudEJveFdpZHRoKHsgfSk7Ci0gICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1h
cmdpbih7IH0pOwotICAgICAgICB9IGVsc2UgaWYgKGxheW91dEJveC0+aXNJbmxpbmVCb3goKSkg
ewotICAgICAgICAgICAgLy8gVGV4dCB3cmFwcGVyIGJveGVzIChhbm9ueW1vdXMgaW5saW5lIGxl
dmVsIGJveGVzKSBkb24ndCBoYXZlIGJveCBnZW9tZXRyaWVzICh0aGV5IG9ubHkgZ2VuZXJhdGUg
cnVucykuCi0gICAgICAgICAgICBpZiAoIWxheW91dEJveC0+aXNJbmxpbmVUZXh0Qm94KCkpIHsK
LSAgICAgICAgICAgICAgICAvLyBJbmxpbmUgYm94ZXMgKDxzcGFuPikgY2FuJ3QgZ2V0IHNpemVk
L3Bvc2l0aW9uZWQgeWV0LiBBdCB0aGlzIHBvaW50IHdlIGNhbiBvbmx5IGNvbXB1dGUgdGhlaXIg
bWFyZ2lucywgYm9yZGVycyBhbmQgcGFkZGluZy4KLSAgICAgICAgICAgICAgICBjb21wdXRlQm9y
ZGVyQW5kUGFkZGluZygqbGF5b3V0Qm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICAg
ICAgICAgICAgICBjb21wdXRlSG9yaXpvbnRhbE1hcmdpbigqbGF5b3V0Qm94LCBjb25zdHJhaW50
cy5ob3Jpem9udGFsKTsKLSAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9t
ZXRyeSgqbGF5b3V0Qm94KS5zZXRWZXJ0aWNhbE1hcmdpbih7IH0pOwotICAgICAgICAgICAgfQot
ICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotCi0gICAg
ICAgIGxheW91dEJveCA9IG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KCpsYXlvdXRCb3gsIHJv
b3QoKSk7Ci0gICAgfQotCi0gICAgY29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgpOwotCi0g
ICAgYXV0byYgaW5saW5lSXRlbXMgPSBmb3JtYXR0aW5nU3RhdGUoKS5pbmxpbmVJdGVtcygpOwot
ICAgIGxpbmVMYXlvdXQoaW5saW5lSXRlbXMsIHsgMCwgaW5saW5lSXRlbXMuc2l6ZSgpIH0sIGNv
bnN0cmFpbnRzKTsKLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQs
IHN0cmVhbSA8PCAiW0VuZF0gLT4gaW5saW5lIGZvcm1hdHRpbmcgY29udGV4dCAtPiBmb3JtYXR0
aW5nIHJvb3QoIiA8PCAmcm9vdCgpIDw8ICIpIik7Ci19Ci0KLXZvaWQgSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQ6OmxpbmVMYXlvdXRGb3JJbnRlcmdyYXRpb24oSW52YWxpZGF0aW9uU3RhdGUmIGlu
dmFsaWRhdGlvblN0YXRlLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0
cmFpbnRzKQotewotICAgIGludmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoaW52YWxpZGF0aW9uU3Rh
dGUpOwotICAgIGNvbGxlY3RJbmxpbmVDb250ZW50SWZOZWVkZWQoKTsKLSAgICBhdXRvJiBpbmxp
bmVJdGVtcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmlubGluZUl0ZW1zKCk7Ci0gICAgbGluZUxheW91
dChpbmxpbmVJdGVtcywgeyAwLCBpbmxpbmVJdGVtcy5zaXplKCkgfSwgY29uc3RyYWludHMpOwot
fQotCi1MYXlvdXRVbml0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojp1c2VkQ29udGVudEhlaWdo
dCgpIGNvbnN0Ci17Ci0gICAgLy8gMTAuNi43ICdBdXRvJyBoZWlnaHRzIGZvciBibG9jayBmb3Jt
YXR0aW5nIGNvbnRleHQgcm9vdHMKLQotICAgIC8vIElmIGl0IG9ubHkgaGFzIGlubGluZS1sZXZl
bCBjaGlsZHJlbiwgdGhlIGhlaWdodCBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdG9wIG9m
IHRoZSB0b3Btb3N0IGxpbmUgYm94IGFuZCB0aGUgYm90dG9tIG9mIHRoZSBib3R0b21tb3N0IGxp
bmUgYm94LgotCi0gICAgLy8gSW4gYWRkaXRpb24sIGlmIHRoZSBlbGVtZW50IGhhcyBhbnkgZmxv
YXRpbmcgZGVzY2VuZGFudHMgd2hvc2UgYm90dG9tIG1hcmdpbiBlZGdlIGlzIGJlbG93IHRoZSBl
bGVtZW50J3MgYm90dG9tIGNvbnRlbnQgZWRnZSwKLSAgICAvLyB0aGVuIHRoZSBoZWlnaHQgaXMg
aW5jcmVhc2VkIHRvIGluY2x1ZGUgdGhvc2UgZWRnZXMuIE9ubHkgZmxvYXRzIHRoYXQgcGFydGlj
aXBhdGUgaW4gdGhpcyBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgYXJlIHRha2VuCi0gICAgLy8g
aW50byBhY2NvdW50LCBlLmcuLCBmbG9hdHMgaW5zaWRlIGFic29sdXRlbHkgcG9zaXRpb25lZCBk
ZXNjZW5kYW50cyBvciBvdGhlciBmbG9hdHMgYXJlIG5vdC4KLSAgICBhdXRvJiBsaW5lcyA9IGZv
cm1hdHRpbmdTdGF0ZSgpLmxpbmVzKCk7Ci0gICAgLy8gRXZlbiBlbXB0eSBjb250ZW50IGdlbmVy
YXRlcyBhIGxpbmUuCi0gICAgQVNTRVJUKCFsaW5lcy5pc0VtcHR5KCkpOwotICAgIGF1dG8gdG9w
ID0gTGF5b3V0VW5pdCB7IGxpbmVzLmZpcnN0KCkubGluZUJveExvZ2ljYWxSZWN0KCkudG9wKCkg
fTsKLSAgICBhdXRvIGJvdHRvbSA9IExheW91dFVuaXQgeyBsaW5lcy5sYXN0KCkubGluZUJveExv
Z2ljYWxSZWN0KCkuYm90dG9tKCkgKyBmb3JtYXR0aW5nU3RhdGUoKS5jbGVhckdhcEFmdGVyTGFz
dExpbmUoKSB9OwotCi0gICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQg
eyAqdGhpcywgZm9ybWF0dGluZ1N0YXRlKCkuZmxvYXRpbmdTdGF0ZSgpIH07Ci0gICAgaWYgKGF1
dG8gZmxvYXRCb3R0b20gPSBmbG9hdGluZ0NvbnRleHQuYm90dG9tKCkpIHsKLSAgICAgICAgYm90
dG9tID0gc3RkOjptYXgoKmZsb2F0Qm90dG9tLCBib3R0b20pOwotICAgICAgICB0b3AgPSBzdGQ6
Om1pbigqZmxvYXRpbmdDb250ZXh0LnRvcCgpLCB0b3ApOwotICAgIH0KLSAgICByZXR1cm4gYm90
dG9tIC0gdG9wOwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpsaW5lTGF5b3V0
KElubGluZUl0ZW1zJiBpbmxpbmVJdGVtcywgTGluZUJ1aWxkZXI6OklubGluZUl0ZW1SYW5nZSBu
ZWVkc0xheW91dFJhbmdlLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0
cmFpbnRzKQotewotICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1hdHRpbmdT
dGF0ZSgpOwotICAgIGZvcm1hdHRpbmdTdGF0ZS5saW5lUnVucygpLnJlc2VydmVJbml0aWFsQ2Fw
YWNpdHkoZm9ybWF0dGluZ1N0YXRlLmlubGluZUl0ZW1zKCkuc2l6ZSgpKTsKLSAgICBJbmxpbmVM
YXlvdXRVbml0IGxpbmVMb2dpY2FsVG9wID0gY29uc3RyYWludHMudmVydGljYWwubG9naWNhbFRv
cDsKLSAgICBzdHJ1Y3QgUHJldmlvdXNMaW5lIHsKLSAgICAgICAgTGluZUJ1aWxkZXI6OklubGlu
ZUl0ZW1SYW5nZSByYW5nZTsKLSAgICAgICAgc2l6ZV90IG92ZXJmbG93Q29udGVudExlbmd0aCB7
IDAgfTsKLSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gb3ZlcmZsb3dMb2dpY2Fs
V2lkdGg7Ci0gICAgfTsKLSAgICBPcHRpb25hbDxQcmV2aW91c0xpbmU+IHByZXZpb3VzTGluZTsK
LSAgICBhdXRvJiBmbG9hdGluZ1N0YXRlID0gZm9ybWF0dGluZ1N0YXRlLmZsb2F0aW5nU3RhdGUo
KTsKLSAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7ICp0aGlzLCBm
bG9hdGluZ1N0YXRlIH07Ci0gICAgYXV0byBpc0ZpcnN0TGluZSA9IGZvcm1hdHRpbmdTdGF0ZS5s
aW5lcygpLmlzRW1wdHkoKTsKLQotICAgIGF1dG8gbGluZUJ1aWxkZXIgPSBMaW5lQnVpbGRlciB7
ICp0aGlzLCBmbG9hdGluZ1N0YXRlLCBjb25zdHJhaW50cy5ob3Jpem9udGFsLCBpbmxpbmVJdGVt
cyB9OwotICAgIHdoaWxlICghbmVlZHNMYXlvdXRSYW5nZS5pc0VtcHR5KCkpIHsKLSAgICAgICAg
Ly8gVHVybiBwcmV2aW91cyBsaW5lJ3Mgb3ZlcmZsb3cgY29udGVudCBsZW5ndGggaW50byB0aGUg
bmV4dCBsaW5lJ3MgbGVhZGluZyBjb250ZW50IHBhcnRpYWwgbGVuZ3RoLgotICAgICAgICAvLyAi
c3BbPC1saW5lIGJyZWFrLT5dbGl0X2NvbnRlbnQiIC0+IG92ZXJmbG93IGxlbmd0aDogMTEgLT4g
bGVhZGluZyBwYXJ0aWFsIGNvbnRlbnQgbGVuZ3RoOiAxMS4KLSAgICAgICAgYXV0byBwYXJ0aWFs
TGVhZGluZ0NvbnRlbnRMZW5ndGggPSBwcmV2aW91c0xpbmUgPyBwcmV2aW91c0xpbmUtPm92ZXJm
bG93Q29udGVudExlbmd0aCA6IDA7Ci0gICAgICAgIGF1dG8gbGVhZGluZ0xvZ2ljYWxXaWR0aCA9
IHByZXZpb3VzTGluZSA/IHByZXZpb3VzTGluZS0+b3ZlcmZsb3dMb2dpY2FsV2lkdGggOiBXVEY6
Om51bGxvcHQ7Ci0gICAgICAgIGF1dG8gaW5pdGlhbExpbmVDb25zdHJhaW50cyA9IElubGluZVJl
Y3QgeyBsaW5lTG9naWNhbFRvcCwgY29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dpY2FsTGVmdCwg
Y29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dpY2FsV2lkdGgsIHF1aXJrcygpLmluaXRpYWxMaW5l
SGVpZ2h0KCkgfTsKLSAgICAgICAgYXV0byBsaW5lQ29udGVudCA9IGxpbmVCdWlsZGVyLmxheW91
dElubGluZUNvbnRlbnQobmVlZHNMYXlvdXRSYW5nZSwgcGFydGlhbExlYWRpbmdDb250ZW50TGVu
Z3RoLCBsZWFkaW5nTG9naWNhbFdpZHRoLCBpbml0aWFsTGluZUNvbnN0cmFpbnRzLCBpc0ZpcnN0
TGluZSk7Ci0gICAgICAgIGF1dG8gbGluZUxvZ2ljYWxSZWN0ID0gY29tcHV0ZUdlb21ldHJ5Rm9y
TGluZUNvbnRlbnQobGluZUNvbnRlbnQsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwotCi0gICAg
ICAgIGF1dG8gbGluZUNvbnRlbnRSYW5nZSA9IGxpbmVDb250ZW50LmlubGluZUl0ZW1SYW5nZTsK
LSAgICAgICAgaWYgKCFsaW5lQ29udGVudFJhbmdlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAg
QVNTRVJUKG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQgPCBsaW5lQ29udGVudFJhbmdlLmVuZCk7Ci0g
ICAgICAgICAgICBpc0ZpcnN0TGluZSA9IGZhbHNlOwotICAgICAgICAgICAgbGluZUxvZ2ljYWxU
b3AgPSBnZW9tZXRyeSgpLmxvZ2ljYWxUb3BGb3JOZXh0TGluZShsaW5lQ29udGVudCwgbGluZUxv
Z2ljYWxSZWN0LmJvdHRvbSgpLCBmbG9hdGluZ0NvbnRleHQpOwotICAgICAgICAgICAgaWYgKGxp
bmVDb250ZW50LmlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudCkgewotICAgICAgICAgICAgICAg
IC8vIFRoZSBmaW5hbCBjb250ZW50IGhlaWdodCBvZiB0aGlzIGlubGluZSBmb3JtYXR0aW5nIGNv
bnRleHQgc2hvdWxkIGluY2x1ZGUgdGhlIGNsZWFyZWQgZmxvYXRzIGFzIHdlbGwuCi0gICAgICAg
ICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLnNldENsZWFyR2FwQWZ0ZXJMYXN0TGluZShsaW5lTG9n
aWNhbFRvcCAtIGxpbmVMb2dpY2FsUmVjdC5ib3R0b20oKSk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAvLyBXaGVuIHRoZSB0cmFpbGluZyBjb250ZW50IGlzIHBhcnRpYWwsIHdlIG5lZWQg
dG8gcmV1c2UgdGhlIGxhc3QgSW5saW5lVGV4dEl0ZW0uCi0gICAgICAgICAgICBhdXRvIGxhc3RJ
bmxpbmVJdGVtTmVlZHNQYXJ0aWFsTGF5b3V0ID0gbGluZUNvbnRlbnQucGFydGlhbFRyYWlsaW5n
Q29udGVudExlbmd0aDsKLSAgICAgICAgICAgIGlmIChsYXN0SW5saW5lSXRlbU5lZWRzUGFydGlh
bExheW91dCkgewotICAgICAgICAgICAgICAgIGF1dG8gbGluZUxheW91dEhhc0FkdmFuY2VkID0g
IXByZXZpb3VzTGluZQotICAgICAgICAgICAgICAgICAgICB8fCBsaW5lQ29udGVudFJhbmdlLmVu
ZCA+IHByZXZpb3VzTGluZS0+cmFuZ2UuZW5kCi0gICAgICAgICAgICAgICAgICAgIHx8IChwcmV2
aW91c0xpbmUtPm92ZXJmbG93Q29udGVudExlbmd0aCAmJiBwcmV2aW91c0xpbmUtPm92ZXJmbG93
Q29udGVudExlbmd0aCA+IGxpbmVDb250ZW50LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgp
OwotICAgICAgICAgICAgICAgIGlmICghbGluZUxheW91dEhhc0FkdmFuY2VkKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgICAgICAgICAv
LyBNb3ZlIG92ZXIgdG8gdGhlIG5leHQgcnVuIGlmIHdlIGFyZSBzdHVjayBvbiB0aGlzIHBhcnRp
YWwgY29udGVudCAod2hlbiB0aGUgb3ZlcmZsb3cgY29udGVudCBsZW5ndGggcmVtYWlucyB0aGUg
c2FtZSkuCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNlcnRhaW5seSBsb3NlIHNvbWUgY29u
dGVudCwgYnV0IHdlIHdvdWxkIGJlIGJ1c3kgbG9vcGluZyBvdGhlcndpc2UuCi0gICAgICAgICAg
ICAgICAgICAgIGxhc3RJbmxpbmVJdGVtTmVlZHNQYXJ0aWFsTGF5b3V0ID0gZmFsc2U7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmVlZHNMYXlvdXRSYW5n
ZS5zdGFydCA9IGxhc3RJbmxpbmVJdGVtTmVlZHNQYXJ0aWFsTGF5b3V0ID8gbGluZUNvbnRlbnRS
YW5nZS5lbmQgLSAxIDogbGluZUNvbnRlbnRSYW5nZS5lbmQ7Ci0gICAgICAgICAgICBwcmV2aW91
c0xpbmUgPSBQcmV2aW91c0xpbmUgeyBsaW5lQ29udGVudFJhbmdlLCBsaW5lQ29udGVudC5wYXJ0
aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoLCBsaW5lQ29udGVudC5vdmVyZmxvd0xvZ2ljYWxXaWR0
aCB9OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRmxvYXRz
IHByZXZlbnRlZCB1cyBwbGFjaW5nIGFueSBjb250ZW50IG9uIHRoZSBsaW5lLgotICAgICAgICBB
U1NFUlQobGluZUNvbnRlbnQucnVucy5pc0VtcHR5KCkpOwotICAgICAgICBBU1NFUlQobGluZUNv
bnRlbnQuaGFzSW50cnVzaXZlRmxvYXQpOwotICAgICAgICAvLyBNb3ZlIHRoZSBuZXh0IGxpbmUg
YmVsb3cgdGhlIGludHJ1c2l2ZSBmbG9hdC4KLSAgICAgICAgYXV0byBmbG9hdENvbnN0cmFpbnRz
ID0gZmxvYXRpbmdDb250ZXh0LmNvbnN0cmFpbnRzKHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFRv
cCksIHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFJlY3QuYm90dG9tKCkpKTsKLSAgICAgICAgQVNT
RVJUKGZsb2F0Q29uc3RyYWludHMubGVmdCB8fCBmbG9hdENvbnN0cmFpbnRzLnJpZ2h0KTsKLSAg
ICAgICAgc3RhdGljIGF1dG8gaW5pZml0ZVBvaW50ID0gUG9pbnRJbkNvbnRleHRSb290OjptYXgo
KTsKLSAgICAgICAgLy8gSW4gY2FzZSBvZiBsZWZ0IGFuZCByaWdodCBjb25zdHJhaW50cywgd2Ug
bmVlZCB0byBwaWNrIHRoZSBvbmUgdGhhdCdzIGNsb3NlciB0byB0aGUgY3VycmVudCBsaW5lLgot
ICAgICAgICBsaW5lTG9naWNhbFRvcCA9IHN0ZDo6bWluKGZsb2F0Q29uc3RyYWludHMubGVmdC52
YWx1ZU9yKGluaWZpdGVQb2ludCkueSwgZmxvYXRDb25zdHJhaW50cy5yaWdodC52YWx1ZU9yKGlu
aWZpdGVQb2ludCkueSk7Ci0gICAgICAgIEFTU0VSVChsaW5lTG9naWNhbFRvcCA8IGluaWZpdGVQ
b2ludC55KTsKLSAgICB9Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzIElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlZEludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMoKQotewotICAgIGF1dG8mIGxheW91dFN0YXRlID0gdGhpcy0+bGF5b3V0U3Rh
dGUoKTsKLSAgICBBU1NFUlQoIWZvcm1hdHRpbmdTdGF0ZSgpLmludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMoKSk7Ci0KLSAgICBpZiAoIXJvb3QoKS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkg
ewotICAgICAgICBhdXRvIGNvbnN0cmFpbnRzID0gZ2VvbWV0cnkoKS5jb25zdHJhaW5CeU1pbk1h
eFdpZHRoKHJvb3QoKSwgeyB9KTsKLSAgICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0SW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyhjb25zdHJhaW50cyk7Ci0gICAgICAgIHJldHVybiBjb25zdHJh
aW50czsKLSAgICB9Ci0KLSAgICBWZWN0b3I8Y29uc3QgQm94Kj4gZm9ybWF0dGluZ0NvbnRleHRS
b290TGlzdDsKLSAgICBhdXRvIGhvcml6b250YWxDb25zdHJhaW50cyA9IEhvcml6b250YWxDb25z
dHJhaW50cyB7IDBfbHUsIDBfbHUgfTsKLSAgICBhdXRvKiBsYXlvdXRCb3ggPSByb290KCkuZmly
c3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsKLSAgICAvLyBJbiBvcmRlciB0byBjb21wdXRlIHRo
ZSBtYXgvbWluIHdpZHRocywgd2UgbmVlZCB0byBjb21wdXRlIG1hcmdpbnMsIGJvcmRlcnMgYW5k
IHBhZGRpbmcgZm9yIGNlcnRhaW4gaW5saW5lIGJveGVzIGZpcnN0LgotICAgIHdoaWxlIChsYXlv
dXRCb3gpIHsKLSAgICAgICAgaWYgKGxheW91dEJveC0+aXNJbmxpbmVUZXh0Qm94KCkpIHsKLSAg
ICAgICAgICAgIGxheW91dEJveCA9IG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KCpsYXlvdXRC
b3gsIHJvb3QoKSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBp
ZiAobGF5b3V0Qm94LT5pc1JlcGxhY2VkQm94KCkpIHsKLSAgICAgICAgICAgIGNvbXB1dGVCb3Jk
ZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgICAg
ICAgICBjb21wdXRlV2lkdGhBbmRNYXJnaW4oKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFp
bnRzKTsKLSAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRCb3gtPmlzRmxvYXRpbmdQb3NpdGlvbmVk
KCkgfHwgbGF5b3V0Qm94LT5pc0F0b21pY0lubGluZUxldmVsQm94KCkpIHsKLSAgICAgICAgICAg
IEFTU0VSVChsYXlvdXRCb3gtPmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7Ci0gICAg
ICAgICAgICBmb3JtYXR0aW5nQ29udGV4dFJvb3RMaXN0LmFwcGVuZChsYXlvdXRCb3gpOwotCi0g
ICAgICAgICAgICBjb21wdXRlQm9yZGVyQW5kUGFkZGluZygqbGF5b3V0Qm94LCBob3Jpem9udGFs
Q29uc3RyYWludHMpOwotICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxNYXJnaW4oKmxheW91
dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgICAgIGNvbXB1dGVJbnRyaW5z
aWNXaWR0aEZvckZvcm1hdHRpbmdSb290KCpsYXlvdXRCb3gpOwotICAgICAgICB9IGVsc2UgaWYg
KGxheW91dEJveC0+aXNJbmxpbmVCb3goKSkgewotICAgICAgICAgICAgY29tcHV0ZUJvcmRlckFu
ZFBhZGRpbmcoKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgICAg
IGNvbXB1dGVIb3Jpem9udGFsTWFyZ2luKCpsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50
cyk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0g
ICAgICAgIGxheW91dEJveCA9IG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KCpsYXlvdXRCb3gs
IHJvb3QoKSk7Ci0gICAgfQotCi0gICAgY29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgpOwot
Ci0gICAgYXV0byBtYXhpbXVtTGluZVdpZHRoID0gWyZdKGF1dG8gYXZhaWxhYmxlV2lkdGgpIHsK
LSAgICAgICAgLy8gU3dpdGNoIHRvIHRoZSBtaW4vbWF4IGZvcm1hdHRpbmcgcm9vdCB3aWR0aCB2
YWx1ZXMgYmVmb3JlIGZvcm1hdHRpbmcgdGhlIGxpbmVzLgotICAgICAgICBmb3IgKGF1dG8qIGZv
cm1hdHRpbmdSb290IDogZm9ybWF0dGluZ0NvbnRleHRSb290TGlzdCkgewotICAgICAgICAgICAg
YXV0byBpbnRyaW5zaWNXaWR0aHMgPSBsYXlvdXRTdGF0ZS5mb3JtYXR0aW5nU3RhdGVGb3JCb3go
KmZvcm1hdHRpbmdSb290KS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KCpmb3JtYXR0
aW5nUm9vdCk7Ci0gICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0
ZSgpLmJveEdlb21ldHJ5KCpmb3JtYXR0aW5nUm9vdCk7Ci0gICAgICAgICAgICBhdXRvIGNvbnRl
bnRXaWR0aCA9IChhdmFpbGFibGVXaWR0aCA/IGludHJpbnNpY1dpZHRocy0+bWF4aW11bSA6IGlu
dHJpbnNpY1dpZHRocy0+bWluaW11bSkgLSBib3hHZW9tZXRyeS5ob3Jpem9udGFsTWFyZ2luQm9y
ZGVyQW5kUGFkZGluZygpOwotICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdp
ZHRoKGNvbnRlbnRXaWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXB1dGVkSW50
cmluc2ljV2lkdGhGb3JDb25zdHJhaW50KGF2YWlsYWJsZVdpZHRoKTsKLSAgICB9OwotCi0gICAg
YXV0byBtaW5pbXVtQ29udGVudFdpZHRoID0gY2VpbGVkTGF5b3V0VW5pdChtYXhpbXVtTGluZVdp
ZHRoKDApKTsKLSAgICBhdXRvIG1heGltdW1Db250ZW50V2lkdGggPSBjZWlsZWRMYXlvdXRVbml0
KG1heGltdW1MaW5lV2lkdGgobWF4SW5saW5lTGF5b3V0VW5pdCgpKSk7Ci0gICAgYXV0byBjb25z
dHJhaW50cyA9IGdlb21ldHJ5KCkuY29uc3RyYWluQnlNaW5NYXhXaWR0aChyb290KCksIHsgbWlu
aW11bUNvbnRlbnRXaWR0aCwgbWF4aW11bUNvbnRlbnRXaWR0aCB9KTsKLSAgICBmb3JtYXR0aW5n
U3RhdGUoKS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKTsKLSAgICBy
ZXR1cm4gY29uc3RyYWludHM7Ci19Ci0KLUlubGluZUxheW91dFVuaXQgSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhGb3JDb25zdHJhaW50KElubGluZUxheW91
dFVuaXQgYXZhaWxhYmxlV2lkdGgpIGNvbnN0Ci17Ci0gICAgYXV0byYgaW5saW5lSXRlbXMgPSBm
b3JtYXR0aW5nU3RhdGUoKS5pbmxpbmVJdGVtcygpOwotICAgIGF1dG8gbGluZUJ1aWxkZXIgPSBM
aW5lQnVpbGRlciB7ICp0aGlzLCBpbmxpbmVJdGVtcyB9OwotICAgIGF1dG8gbGF5b3V0UmFuZ2Ug
PSBMaW5lQnVpbGRlcjo6SW5saW5lSXRlbVJhbmdlIHsgMCAsIGlubGluZUl0ZW1zLnNpemUoKSB9
OwotICAgIGF1dG8gbWF4aW11bUxpbmVXaWR0aCA9IElubGluZUxheW91dFVuaXQgeyB9OwotICAg
IGF1dG8gbWF4aW11bUZsb2F0V2lkdGggPSBMYXlvdXRVbml0IHsgfTsKLSAgICB3aGlsZSAoIWxh
eW91dFJhbmdlLmlzRW1wdHkoKSkgewotICAgICAgICBhdXRvIGludHJpbnNpY0NvbnRlbnQgPSBs
aW5lQnVpbGRlci5jb21wdXRlZEludHJpbnNpY1dpZHRoKGxheW91dFJhbmdlLCBhdmFpbGFibGVX
aWR0aCk7Ci0gICAgICAgIGxheW91dFJhbmdlLnN0YXJ0ID0gaW50cmluc2ljQ29udGVudC5pbmxp
bmVJdGVtUmFuZ2UuZW5kOwotICAgICAgICBtYXhpbXVtTGluZVdpZHRoID0gc3RkOjptYXgobWF4
aW11bUxpbmVXaWR0aCwgaW50cmluc2ljQ29udGVudC5sb2dpY2FsV2lkdGgpOwotICAgICAgICAv
LyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIGNsZWFyLgotICAgICAgICBmb3IgKGF1dG8qIGZsb2F0
Qm94IDogaW50cmluc2ljQ29udGVudC5mbG9hdHMpCi0gICAgICAgICAgICBtYXhpbXVtRmxvYXRX
aWR0aCArPSBnZW9tZXRyeUZvckJveCgqZmxvYXRCb3gpLm1hcmdpbkJveFdpZHRoKCk7Ci0gICAg
fQotICAgIHJldHVybiBtYXhpbXVtTGluZVdpZHRoICsgbWF4aW11bUZsb2F0V2lkdGg7Ci19Ci0K
LXZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVJbnRyaW5zaWNXaWR0aEZvckZv
cm1hdHRpbmdSb290KGNvbnN0IEJveCYgZm9ybWF0dGluZ1Jvb3QpCi17Ci0gICAgQVNTRVJUKGZv
cm1hdHRpbmdSb290LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7Ci0gICAgYXV0byBj
b25zdHJhaW50cyA9IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9OwotICAgIGlmIChhdXRv
IGZpeGVkV2lkdGggPSBnZW9tZXRyeSgpLmZpeGVkVmFsdWUoZm9ybWF0dGluZ1Jvb3Quc3R5bGUo
KS5sb2dpY2FsV2lkdGgoKSkpCi0gICAgICAgIGNvbnN0cmFpbnRzID0geyAqZml4ZWRXaWR0aCwg
KmZpeGVkV2lkdGggfTsKLSAgICBlbHNlIHsKLSAgICAgICAgYXV0byBoYXNJbmZsb3dPckZsb2F0
aW5nQ29udGVudCA9IGlzPENvbnRhaW5lckJveD4oZm9ybWF0dGluZ1Jvb3QpICYmIGRvd25jYXN0
PENvbnRhaW5lckJveD4oZm9ybWF0dGluZ1Jvb3QpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgp
OwotICAgICAgICAvLyBUaGUgaW50cmluc2ljIHNpemVzIG9mIHRoZSBzaXplIGNvbnRhaW5tZW50
IGJveCBhcmUgZGV0ZXJtaW5lZCBhcyBpZiB0aGUgZWxlbWVudCBoYWQgbm8gY29udGVudC4KLSAg
ICAgICAgYXV0byBzaG91bGRJZ25vcmVDaGlsZENvbnRlbnQgPSBmb3JtYXR0aW5nUm9vdC5pc1Np
emVDb250YWlubWVudEJveCgpOwotICAgICAgICBpZiAoaGFzSW5mbG93T3JGbG9hdGluZ0NvbnRl
bnQgJiYgIXNob3VsZElnbm9yZUNoaWxkQ29udGVudCkKLSAgICAgICAgICAgIGNvbnN0cmFpbnRz
ID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZG93bmNhc3Q8Q29udGFp
bmVyQm94Pihmb3JtYXR0aW5nUm9vdCksIGxheW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMoKTsKLSAgICB9Ci0gICAgY29uc3RyYWludHMgPSBnZW9tZXRyeSgp
LmNvbnN0cmFpbkJ5TWluTWF4V2lkdGgoZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzKTsKLSAg
ICBjb25zdHJhaW50cy5leHBhbmQoZ2VvbWV0cnlGb3JCb3goZm9ybWF0dGluZ1Jvb3QpLmhvcml6
b250YWxNYXJnaW5Cb3JkZXJBbmRQYWRkaW5nKCkpOwotICAgIGZvcm1hdHRpbmdTdGF0ZSgpLnNl
dEludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFp
bnRzKTsKLX0KLQotdm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUhvcml6b250
YWxNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQotewotICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFs
TWFyZ2luID0gZ2VvbWV0cnkoKS5jb21wdXRlZEhvcml6b250YWxNYXJnaW4obGF5b3V0Qm94LCBo
b3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgIGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5
KGxheW91dEJveCkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdp
bi5zdGFydC52YWx1ZU9yKDApLCBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3Io
MCkgfSk7Ci19Ci0KLXZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVXaWR0aEFu
ZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiBob3Jpem9udGFsQ29uc3RyYWludHMpCi17Ci0gICAgYXV0byBjb21wdXRlID0gWyZdKE9wdGlv
bmFsPExheW91dFVuaXQ+IHVzZWRXaWR0aCkgewotICAgICAgICBpZiAobGF5b3V0Qm94LmlzRmxv
YXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5mbG9hdGlu
Z0NvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywg
eyB1c2VkV2lkdGgsIHsgfSB9KTsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc0lubGluZUJsb2Nr
Qm94KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbmxpbmVCbG9ja0NvbnRlbnRX
aWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgeyB1c2VkV2lk
dGgsIHsgfSB9KTsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0gICAg
ICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbmxpbmVSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1h
cmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCB7IH0sIHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgICAgICByZXR1cm4gQ29udGVudFdpZHRoQW5kTWFyZ2luIHsgfTsKLSAgICB9Owot
Ci0gICAgYXV0byBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBjb21wdXRlKHsgfSk7Ci0KLSAgICBh
dXRvIGF2YWlsYWJsZVdpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsK
LSAgICBpZiAoYXV0byBtYXhXaWR0aCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhXaWR0aChsYXlv
dXRCb3gsIGF2YWlsYWJsZVdpZHRoKSkgewotICAgICAgICBhdXRvIG1heFdpZHRoQW5kTWFyZ2lu
ID0gY29tcHV0ZShtYXhXaWR0aCk7Ci0gICAgICAgIGlmIChjb250ZW50V2lkdGhBbmRNYXJnaW4u
Y29udGVudFdpZHRoID4gbWF4V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQotICAgICAgICAg
ICAgY29udGVudFdpZHRoQW5kTWFyZ2luID0gbWF4V2lkdGhBbmRNYXJnaW47Ci0gICAgfQotCi0g
ICAgYXV0byBtaW5XaWR0aCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNaW5XaWR0aChsYXlvdXRCb3gs
IGF2YWlsYWJsZVdpZHRoKS52YWx1ZU9yKDApOwotICAgIGF1dG8gbWluV2lkdGhBbmRNYXJnaW4g
PSBjb21wdXRlKG1pbldpZHRoKTsKLSAgICBpZiAoY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRl
bnRXaWR0aCA8IG1pbldpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkKLSAgICAgICAgY29udGVu
dFdpZHRoQW5kTWFyZ2luID0gbWluV2lkdGhBbmRNYXJnaW47Ci0KLSAgICBhdXRvJiBib3hHZW9t
ZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgYm94
R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50
V2lkdGgpOwotICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyBjb250ZW50V2lk
dGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCwgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRN
YXJnaW4uZW5kIH0pOwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRl
SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29u
c3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKLXsKLSAgICBhdXRvIGNvbXB1dGUgPSBb
Jl0oT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZEhlaWdodCkgewotICAgICAgICBpZiAobGF5b3V0
Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnko
KS5mbG9hdGluZ0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29u
c3RyYWludHMsIHsgdXNlZEhlaWdodCB9KTsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc0lubGlu
ZUJsb2NrQm94KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbmxpbmVCbG9ja0Nv
bnRlbnRIZWlnaHRBbmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsg
dXNlZEhlaWdodCB9KTsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0g
ICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRB
bmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25z
dHJhaW50cywgeyB9LCB7IHVzZWRIZWlnaHQgfSk7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgICAgICByZXR1cm4gQ29udGVudEhlaWdodEFuZE1hcmdpbiB7IH07Ci0gICAgfTsK
LQotICAgIGF1dG8gY29udGVudEhlaWdodEFuZE1hcmdpbiA9IGNvbXB1dGUoeyB9KTsKLSAgICBp
ZiAoYXV0byBtYXhIZWlnaHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWF4SGVpZ2h0KGxheW91dEJv
eCkpIHsKLSAgICAgICAgYXV0byBtYXhIZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRlKG1heEhlaWdo
dCk7Ci0gICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPiBt
YXhIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCkKLSAgICAgICAgICAgIGNvbnRlbnRIZWln
aHRBbmRNYXJnaW4gPSBtYXhIZWlnaHRBbmRNYXJnaW47Ci0gICAgfQotCi0gICAgaWYgKGF1dG8g
bWluSGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbkhlaWdodChsYXlvdXRCb3gpKSB7Ci0g
ICAgICAgIGF1dG8gbWluSGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZShtaW5IZWlnaHQpOwotICAg
ICAgICBpZiAoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0IDwgbWluSGVpZ2h0
QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpCi0gICAgICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFy
Z2luID0gbWluSGVpZ2h0QW5kTWFyZ2luOwotICAgIH0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9
IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgYm94R2VvbWV0
cnkuc2V0Q29udGVudEJveEhlaWdodChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWln
aHQpOwotICAgIGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgY29udGVudEhlaWdodEFu
ZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW4uYmVmb3JlLCBjb250ZW50SGVpZ2h0QW5kTWFyZ2lu
Lm5vbkNvbGxhcHNlZE1hcmdpbi5hZnRlciB9KTsKLX0KLQotdm9pZCBJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dDo6Y29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgpCi17Ci0gICAgYXV0byYgZm9y
bWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgaWYgKCFmb3JtYXR0
aW5nU3RhdGUuaW5saW5lSXRlbXMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAv
LyBUcmF2ZXJzZSB0aGUgdHJlZSBhbmQgY3JlYXRlIGlubGluZSBpdGVtcyBvdXQgb2YgaW5saW5l
IGJveGVzIGFuZCBsZWFmIG5vZGVzLiBUaGlzIGVzc2VudGlhbGx5IHR1cm5zIHRoZSB0cmVlIGlu
bGluZSBzdHJ1Y3R1cmUgaW50byBhIGZsYXQgb25lLgotICAgIC8vIDxzcGFuPnRleHQ8c3Bhbj48
L3NwYW4+PGltZz48L3NwYW4+IC0+IFtJbmxpbmVCb3hTdGFydF1bSW5saW5lTGV2ZWxCb3hdW0lu
bGluZUJveFN0YXJ0XVtJbmxpbmVCb3hFbmRdW0lubGluZUxldmVsQm94XVtJbmxpbmVCb3hFbmRd
Ci0gICAgQVNTRVJUKHJvb3QoKS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7Ci0gICAgTGF5
b3V0UXVldWUgbGF5b3V0UXVldWU7Ci0gICAgbGF5b3V0UXVldWUuYXBwZW5kKHJvb3QoKS5maXJz
dEluRmxvd09yRmxvYXRpbmdDaGlsZCgpKTsKLSAgICB3aGlsZSAoIWxheW91dFF1ZXVlLmlzRW1w
dHkoKSkgewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgYXV0byYgbGF5b3V0
Qm94ID0gKmxheW91dFF1ZXVlLmxhc3QoKTsKLSAgICAgICAgICAgIGF1dG8gaXNCb3hXaXRoSW5s
aW5lQ29udGVudCA9IGxheW91dEJveC5pc0lubGluZUJveCgpICYmICFsYXlvdXRCb3guaXNJbmxp
bmVUZXh0Qm94KCkgJiYgIWxheW91dEJveC5pc0xpbmVCcmVha0JveCgpOwotICAgICAgICAgICAg
aWYgKCFpc0JveFdpdGhJbmxpbmVDb250ZW50KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhcnQgb2YgYW4gaW5saW5lIGJveCAoZS5nLiA8c3Bh
bj4pLgotICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZElubGluZUl0ZW0oeyBsYXlvdXRC
b3gsIElubGluZUl0ZW06OlR5cGU6OklubGluZUJveFN0YXJ0IH0pOwotICAgICAgICAgICAgYXV0
byYgaW5saW5lQm94V2l0aElubGluZUNvbnRlbnQgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxh
eW91dEJveCk7Ci0gICAgICAgICAgICBpZiAoIWlubGluZUJveFdpdGhJbmxpbmVDb250ZW50Lmhh
c0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgbGF5b3V0UXVldWUuYXBwZW5kKGlubGluZUJveFdpdGhJbmxpbmVDb250ZW50LmZpcnN0
SW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFs
YXlvdXRRdWV1ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9ICps
YXlvdXRRdWV1ZS50YWtlTGFzdCgpOwotICAgICAgICAgICAgaWYgKGlzPExpbmVCcmVha0JveD4o
bGF5b3V0Qm94KSkgewotICAgICAgICAgICAgICAgIGF1dG8mIGxpbmVCcmVha0JveCA9IGRvd25j
YXN0PExpbmVCcmVha0JveD4obGF5b3V0Qm94KTsKLSAgICAgICAgICAgICAgICBmb3JtYXR0aW5n
U3RhdGUuYWRkSW5saW5lSXRlbSh7IGxheW91dEJveCwgbGluZUJyZWFrQm94LmlzT3B0aW9uYWwo
KSA/IElubGluZUl0ZW06OlR5cGU6OldvcmRCcmVha09wcG9ydHVuaXR5IDogSW5saW5lSXRlbTo6
VHlwZTo6SGFyZExpbmVCcmVhayB9KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94
LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRl
LmFkZElubGluZUl0ZW0oeyBsYXlvdXRCb3gsIElubGluZUl0ZW06OlR5cGU6OkZsb2F0IH0pOwot
ICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0Qm94LmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSkK
LSAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkSW5saW5lSXRlbSh7IGxheW91dEJv
eCwgSW5saW5lSXRlbTo6VHlwZTo6Qm94IH0pOwotICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0
Qm94LmlzSW5saW5lVGV4dEJveCgpKSB7Ci0gICAgICAgICAgICAgICAgSW5saW5lVGV4dEl0ZW06
OmNyZWF0ZUFuZEFwcGVuZFRleHRJdGVtcyhmb3JtYXR0aW5nU3RhdGUuaW5saW5lSXRlbXMoKSwg
ZG93bmNhc3Q8SW5saW5lVGV4dEJveD4obGF5b3V0Qm94KSk7Ci0gICAgICAgICAgICB9IGVsc2Ug
aWYgKGxheW91dEJveC5pc0lubGluZUJveCgpKQotICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdT
dGF0ZS5hZGRJbmxpbmVJdGVtKHsgbGF5b3V0Qm94LCBJbmxpbmVJdGVtOjpUeXBlOjpJbmxpbmVC
b3hFbmQgfSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7Ci0KLSAgICAgICAgICAgIGlmIChhdXRvKiBuZXh0U2libGluZyA9IGxheW91dEJv
eC5uZXh0SW5GbG93T3JGbG9hdGluZ1NpYmxpbmcoKSkgewotICAgICAgICAgICAgICAgIGxheW91
dFF1ZXVlLmFwcGVuZChuZXh0U2libGluZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLUlubGluZVJlY3QgSW5saW5lRm9ybWF0
dGluZ0NvbnRleHQ6OmNvbXB1dGVHZW9tZXRyeUZvckxpbmVDb250ZW50KGNvbnN0IExpbmVCdWls
ZGVyOjpMaW5lQ29udGVudCYgbGluZUNvbnRlbnQsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQotewotICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9
IHRoaXMtPmZvcm1hdHRpbmdTdGF0ZSgpOwotICAgIGF1dG8gZ2VvbWV0cnkgPSB0aGlzLT5nZW9t
ZXRyeSgpOwotCi0gICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVCb3goZ2VvbWV0cnkubGluZUJv
eEZvckxpbmVDb250ZW50KGxpbmVDb250ZW50KSk7Ci0gICAgY29uc3QgYXV0byYgbGluZUJveCA9
IGZvcm1hdHRpbmdTdGF0ZS5saW5lQm94ZXMoKS5sYXN0KCk7Ci0gICAgYXV0byBsaW5lSW5kZXgg
PSBmb3JtYXR0aW5nU3RhdGUubGluZXMoKS5zaXplKCk7Ci0gICAgYXV0byYgbGluZUJveExvZ2lj
YWxSZWN0ID0gbGluZUJveC5sb2dpY2FsUmVjdCgpOwotICAgIGlmICghbGluZUJveC5oYXNDb250
ZW50KCkpIHsKLSAgICAgICAgLy8gRmFzdCBwYXRoIGZvciBsaW5lcyB3aXRoIG5vIGNvbnRlbnQg
ZS5nLiA8ZGl2PjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PC9kaXY+IG9yIDxzcGFuPjxkaXY+
PC9kaXY+PC9zcGFuPiB3aGVyZSB3ZSBjb25zdHJ1Y3QgZW1wdHkgcHJlIGFuZCBwb3N0IGJsb2Nr
cy4KLSAgICAgICAgQVNTRVJUKCFsaW5lQm94LmNvbnRlbnRMb2dpY2FsV2lkdGgoKSAmJiAhbGlu
ZUJveExvZ2ljYWxSZWN0LmhlaWdodCgpKTsKLSAgICAgICAgYXV0byB1cGRhdGVJbmxpbmVCb3hl
c0dlb21ldHJ5SWZBcHBsaWNhYmxlID0gWyZdIHsKLSAgICAgICAgICAgIGlmICghbGluZUJveC5o
YXNJbmxpbmVCb3goKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBWZWN0
b3I8Y29uc3QgQm94Kj4gbGF5b3V0Qm94TGlzdDsKLSAgICAgICAgICAgIC8vIENvbGxlY3QgdGhl
IGVtcHR5IGlubGluZSBib3hlcyB0aGF0IHNob3dlZCB1cCBmaXJzdCBvbiB0aGlzIGxpbmUuCi0g
ICAgICAgICAgICAvLyBOb3RlIHRoYXQgYW4gaW5saW5lIGJveCBlbmQgb24gYW4gZW1wdHkgbGlu
ZSBkb2VzIG5vdCBtYWtlIHRoZSBpbmxpbmUgYm94IHRhbGxlci4KLSAgICAgICAgICAgIC8vIChl
LmcuIDxkaXY+dGV4dDxzcGFuPjxicj48L3NwYW4+PC9kaXY+KSA8LSB0aGUgPHNwYW4+IGlubGlu
ZSBib3ggaXMgYXMgdGFsbCBhcyB0aGUgbGluZSBldmVuIHRob3VnaCB0aGUgPC9zcGFuPiBpcyBh
ZnRlciBhIDxicj4gc28gdGVjaG5pY2FsbHkgaXMgb24gdGhlIGZvbGxvd2luZyAoZW1wdHkpbGlu
ZS4KLSAgICAgICAgICAgIGZvciAoYXV0byYgbGluZVJ1biA6IGxpbmVDb250ZW50LnJ1bnMpIHsK
LSAgICAgICAgICAgICAgICBpZiAobGluZVJ1bi5pc0lubGluZUJveFN0YXJ0KCkpCi0gICAgICAg
ICAgICAgICAgICAgIGxheW91dEJveExpc3QuYXBwZW5kKCZsaW5lUnVuLmxheW91dEJveCgpKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoYXV0byogbGF5b3V0Qm94IDogbGF5b3V0
Qm94TGlzdCkgewotICAgICAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGlu
Z1N0YXRlLmJveEdlb21ldHJ5KCpsYXlvdXRCb3gpOwotICAgICAgICAgICAgICAgIGF1dG8gaW5s
aW5lQm94TG9naWNhbEhlaWdodCA9IExheW91dFVuaXQ6OmZyb21GbG9hdENlaWwobGluZUJveC5s
b2dpY2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KCpsYXlvdXRCb3gsIGJveEdlb21ldHJ5KS5oZWln
aHQoKSk7Ci0gICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodChp
bmxpbmVCb3hMb2dpY2FsSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRD
b250ZW50Qm94V2lkdGgoeyB9KTsKLSAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dp
Y2FsVG9wTGVmdCh0b0xheW91dFBvaW50KGxpbmVCb3hMb2dpY2FsUmVjdC50b3BMZWZ0KCkpKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgdXBkYXRlSW5saW5lQm94ZXNHZW9t
ZXRyeUlmQXBwbGljYWJsZSgpOwotICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZSh7IGxp
bmVCb3hMb2dpY2FsUmVjdCwgeyB7IH0sIHsgfSB9LCB7IH0sIHsgfSwgeyB9IH0pOwotICAgICAg
ICByZXR1cm4gbGluZUJveExvZ2ljYWxSZWN0OwotICAgIH0KLQotICAgIGF1dG8gcm9vdElubGlu
ZUJveExvZ2ljYWxSZWN0ID0gbGluZUJveC5sb2dpY2FsUmVjdEZvclJvb3RJbmxpbmVCb3goKTsK
LSAgICBhdXRvIGVuY2xvc2luZ1RvcEFuZEJvdHRvbSA9IElubGluZUxpbmVHZW9tZXRyeTo6RW5j
bG9zaW5nVG9wQW5kQm90dG9tIHsgcm9vdElubGluZUJveExvZ2ljYWxSZWN0LnRvcCgpLCByb290
SW5saW5lQm94TG9naWNhbFJlY3QuYm90dG9tKCkgfTsKLSAgICBIYXNoU2V0PGNvbnN0IEJveCo+
IGlubGluZUJveFN0YXJ0U2V0OwotICAgIEhhc2hTZXQ8Y29uc3QgQm94Kj4gaW5saW5lQm94RW5k
U2V0OwotCi0gICAgYXV0byBjb25zdHJ1Y3RMaW5lUnVuc0FuZFVwZGF0ZUJveEdlb21ldHJ5ID0g
WyZdIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBpbmxpbmUgcnVucyBvbiB0aGUgY3VycmVudCBs
aW5lLiBUaGlzIGlzIG1vc3RseSB0ZXh0IGFuZCBhdG9taWMgaW5saW5lIHJ1bnMuCi0gICAgICAg
IGZvciAoYXV0byYgbGluZVJ1biA6IGxpbmVDb250ZW50LnJ1bnMpIHsKLSAgICAgICAgICAgIC8v
IEZJWE1FOiBXZSBzaG91bGQgbm90IG5lZWQgdG8gY29uc3RydWN0IGEgbGluZSBydW4gZm9yIDxi
cj4uCi0gICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBsaW5lUnVuLmxheW91dEJveCgpOwot
ICAgICAgICAgICAgaWYgKGxpbmVSdW4uaXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBmb3Jt
YXR0aW5nU3RhdGUuYWRkTGluZVJ1bih7IGxpbmVJbmRleCwgbGF5b3V0Qm94LCBsaW5lQm94Lmxv
Z2ljYWxSZWN0Rm9yVGV4dFJ1bihsaW5lUnVuKSwgbGluZVJ1bi5leHBhbnNpb24oKSwgbGluZVJ1
bi50ZXh0Q29udGVudCgpIH0pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgaWYgKGxpbmVSdW4uaXNMaW5lQnJlYWsoKSkgewotICAgICAgICAg
ICAgICAgIGlmIChsYXlvdXRCb3guaXNMaW5lQnJlYWtCb3goKSkgewotICAgICAgICAgICAgICAg
ICAgICAvLyBPbmx5IGhhcmQgbGluZWJyZWFrcyBoYXZlIGFzc29jaWF0ZWQgbGF5b3V0IGJveGVz
LgotICAgICAgICAgICAgICAgICAgICBhdXRvIGxpbmVCcmVha0JveFJlY3QgPSBsaW5lQm94Lmxv
Z2ljYWxSZWN0Rm9yTGluZUJyZWFrQm94KGxheW91dEJveCk7Ci0gICAgICAgICAgICAgICAgICAg
IGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gsIGxpbmVC
cmVha0JveFJlY3QsIGxpbmVSdW4uZXhwYW5zaW9uKCksIHsgfSB9KTsKLQotICAgICAgICAgICAg
ICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShs
YXlvdXRCb3gpOwotICAgICAgICAgICAgICAgICAgICBsaW5lQnJlYWtCb3hSZWN0Lm1vdmVCeShs
aW5lQm94TG9naWNhbFJlY3QudG9wTGVmdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYm94R2Vv
bWV0cnkuc2V0TG9naWNhbFRvcExlZnQodG9MYXlvdXRQb2ludChsaW5lQnJlYWtCb3hSZWN0LnRv
cExlZnQoKSkpOwotICAgICAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94
SGVpZ2h0KHRvTGF5b3V0VW5pdChsaW5lQnJlYWtCb3hSZWN0LmhlaWdodCgpKSk7Ci0gICAgICAg
ICAgICAgICAgfSBlbHNlIAotICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRk
TGluZVJ1bih7IGxpbmVJbmRleCwgbGF5b3V0Qm94LCBsaW5lQm94LmxvZ2ljYWxSZWN0Rm9yVGV4
dFJ1bihsaW5lUnVuKSwgbGluZVJ1bi5leHBhbnNpb24oKSwgbGluZVJ1bi50ZXh0Q29udGVudCgp
IH0pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgaWYgKGxpbmVSdW4uaXNCb3goKSkgewotICAgICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRC
b3guaXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKTsKLSAgICAgICAgICAgICAgICBhdXRvJiBib3hH
ZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAgICAg
ICAgICAgICAgIGF1dG8gbG9naWNhbEJvcmRlckJveCA9IGxpbmVCb3gubG9naWNhbEJvcmRlckJv
eEZvckF0b21pY0lubGluZUxldmVsQm94KGxheW91dEJveCwgYm94R2VvbWV0cnkpOwotICAgICAg
ICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRC
b3gsIGxvZ2ljYWxCb3JkZXJCb3gsIGxpbmVSdW4uZXhwYW5zaW9uKCksIHsgfSB9KTsKLQotICAg
ICAgICAgICAgICAgIGF1dG8gYm9yZGVyQm94TG9naWNhbFRvcExlZnQgPSBsb2dpY2FsQm9yZGVy
Qm94LnRvcExlZnQoKTsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgaW5saW5lIGJveGVz
IGFyZSByZWxhdGl2ZSB0byB0aGUgbGluZSBhbmQgdGhlaXIgdG9wIHBvc2l0aW9uIGNhbiBiZSBu
ZWdhdGl2ZS4KLSAgICAgICAgICAgICAgICBib3JkZXJCb3hMb2dpY2FsVG9wTGVmdC5tb3ZlQnko
bGluZUJveExvZ2ljYWxSZWN0LnRvcExlZnQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91
dEJveC5pc0luRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgYm9yZGVyQm94
TG9naWNhbFRvcExlZnQgKz0gZ2VvbWV0cnkuaW5GbG93UG9zaXRpb25lZFBvc2l0aW9uT2Zmc2V0
KGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgICAgICAgICAvLyBB
dG9taWMgaW5saW5lIGJveGVzIGFyZSBhbGwgc2V0LiBUaGVpciBtYXJnaW4vYm9yZGVyL2NvbnRl
bnQgYm94IGdlb21ldHJpZXMgYXJlIGFscmVhZHkgY29tcHV0ZWQuIFdlIGp1c3QgaGF2ZSB0byBw
b3NpdGlvbiB0aGVtIGhlcmUuCi0gICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNh
bFRvcExlZnQodG9MYXlvdXRQb2ludChib3JkZXJCb3hMb2dpY2FsVG9wTGVmdCkpOwotCi0gICAg
ICAgICAgICAgICAgYXV0byBib3JkZXJCb3hUb3AgPSBib3JkZXJCb3hMb2dpY2FsVG9wTGVmdC55
KCk7Ci0gICAgICAgICAgICAgICAgYXV0byBib3JkZXJCb3hCb3R0b20gPSBib3JkZXJCb3hUb3Ag
KyBib3hHZW9tZXRyeS5ib3JkZXJCb3hIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBlbmNsb3Np
bmdUb3BBbmRCb3R0b20udG9wID0gc3RkOjptaW4oZW5jbG9zaW5nVG9wQW5kQm90dG9tLnRvcCwg
Ym9yZGVyQm94VG9wKTsKLSAgICAgICAgICAgICAgICBlbmNsb3NpbmdUb3BBbmRCb3R0b20uYm90
dG9tID0gc3RkOjptYXgoZW5jbG9zaW5nVG9wQW5kQm90dG9tLmJvdHRvbSwgYm9yZGVyQm94Qm90
dG9tKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGlmIChsaW5lUnVuLmlzSW5saW5lQm94U3RhcnQoKSkgewotICAgICAgICAgICAgICAgIGF1
dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7
Ci0gICAgICAgICAgICAgICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmVjdCA9IGxpbmVCb3gubG9n
aWNhbEJvcmRlckJveEZvcklubGluZUJveChsYXlvdXRCb3gsIGJveEdlb21ldHJ5KTsKLSAgICAg
ICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZVJ1bih7IGxpbmVJbmRleCwgbGF5b3V0
Qm94LCBpbmxpbmVCb3hMb2dpY2FsUmVjdCwgbGluZVJ1bi5leHBhbnNpb24oKSwgeyB9IH0pOwot
ICAgICAgICAgICAgICAgIGlubGluZUJveFN0YXJ0U2V0LmFkZCgmbGF5b3V0Qm94KTsKLSAgICAg
ICAgICAgICAgICBlbmNsb3NpbmdUb3BBbmRCb3R0b20udG9wID0gc3RkOjptaW4oZW5jbG9zaW5n
VG9wQW5kQm90dG9tLnRvcCwgaW5saW5lQm94TG9naWNhbFJlY3QudG9wKCkpOwotICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmVSdW4u
aXNJbmxpbmVCb3hFbmQoKSkgewotICAgICAgICAgICAgICAgIGlubGluZUJveEVuZFNldC5hZGQo
JmxheW91dEJveCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbmxpbmVCb3hTdGFydFNldC5jb250
YWlucygmbGF5b3V0Qm94KSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBbiBpbmxpbmUgYm94
IGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzLiBVc2UgdGhlIFtpbmxpbmUgYm94IGVuZF0gc2lnbmFs
IHRvIGluY2x1ZGUgaXQgaW4gdGhlIGVuY2xvc2luZyBnZW9tZXRyeQotICAgICAgICAgICAgICAg
ICAgICAvLyBvbmx5IHdoZW4gaXQgc3RhcnRzIGF0IGEgcHJldmlvdXMgbGluZS4KLSAgICAgICAg
ICAgICAgICAgICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmVjdCA9IGxpbmVCb3gubG9naWNhbEJv
cmRlckJveEZvcklubGluZUJveChsYXlvdXRCb3gsIGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRy
eShsYXlvdXRCb3gpKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nVG9wQW5kQm90dG9t
LmJvdHRvbSA9IHN0ZDo6bWF4KGVuY2xvc2luZ1RvcEFuZEJvdHRvbS5ib3R0b20sIGlubGluZUJv
eExvZ2ljYWxSZWN0LmJvdHRvbSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBU1NFUlQobGluZVJ1bi5p
c1dvcmRCcmVha09wcG9ydHVuaXR5KCkpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBjb25zdHJ1
Y3RMaW5lUnVuc0FuZFVwZGF0ZUJveEdlb21ldHJ5KCk7Ci0KLSAgICBhdXRvIHVwZGF0ZUJveEdl
b21ldHJ5Rm9ySW5saW5lQm94ZXMgPSBbJl0gewotICAgICAgICAvLyBGSVhNRTogV2UgbWF5IHdh
bnQgdG8ga2VlcCBhcm91bmQgYW4gaW5saW5lIGJveCBvbmx5IHNldC4KLSAgICAgICAgaWYgKCFs
aW5lQm94Lmhhc0lubGluZUJveCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvLyBH
cmFiIHRoZSBpbmxpbmUgYm94ZXMgKGV2ZW4gdGhvc2UgdGhhdCBkb24ndCBoYXZlIGFzc29jaWF0
ZWQgbGF5b3V0IGJveGVzIG9uIHRoZSBjdXJyZW50IGxpbmUgZHVlIHRvIGxpbmUgd3JhcHBpbmcp
Ci0gICAgICAgIC8vIGFuZCB1cGRhdGUgdGhlaXIgZ2VvbWV0cmllcy4KLSAgICAgICAgZm9yIChh
dXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkg
ewotICAgICAgICAgICAgaWYgKCFpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpKQotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5saW5l
TGV2ZWxCb3gubGF5b3V0Qm94KCk7Ci0gICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZv
cm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAgICAgICAgICAgLy8gSW5s
aW5lIGJveGVzIG1heSBvciBtYXkgbm90IGJlIHdyYXBwZWQgYW5kIGhhdmUgcnVucyBvbiBtdWx0
aXBsZSBsaW5lcyAoZS5nLiA8c3Bhbj5maXJzdCBsaW5lPGJyPnNlY29uZCBsaW5lPGJyPnRoaXJk
IGxpbmU8L3NwYW4+KQotICAgICAgICAgICAgYXV0byBpbmxpbmVCb3hCb3JkZXJCb3ggPSBsaW5l
Qm94LmxvZ2ljYWxCb3JkZXJCb3hGb3JJbmxpbmVCb3gobGF5b3V0Qm94LCBib3hHZW9tZXRyeSk7
Ci0gICAgICAgICAgICBhdXRvIGlubGluZUJveFNpemUgPSBMYXlvdXRTaXplIHsgTGF5b3V0VW5p
dDo6ZnJvbUZsb2F0Q2VpbChpbmxpbmVCb3hCb3JkZXJCb3gud2lkdGgoKSksIExheW91dFVuaXQ6
OmZyb21GbG9hdENlaWwoaW5saW5lQm94Qm9yZGVyQm94LmhlaWdodCgpKSB9OwotICAgICAgICAg
ICAgYXV0byBsb2dpY2FsUmVjdCA9IFJlY3QgeyBMYXlvdXRQb2ludCB7IGlubGluZUJveEJvcmRl
ckJveC50b3BMZWZ0KCkgfSwgaW5saW5lQm94U2l6ZSB9OwotICAgICAgICAgICAgbG9naWNhbFJl
Y3QubW92ZUJ5KExheW91dFBvaW50IHsgbGluZUJveExvZ2ljYWxSZWN0LnRvcExlZnQoKSB9KTsK
LSAgICAgICAgICAgIGlmIChpbmxpbmVCb3hTdGFydFNldC5jb250YWlucygmbGF5b3V0Qm94KSkg
ewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaW5saW5lIGJveCBzaG93ZWQgdXAgZmlyc3Qgb24g
dGhpcyBsaW5lLgotICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0
KGxvZ2ljYWxSZWN0LnRvcExlZnQoKSk7Ci0gICAgICAgICAgICAgICAgYXV0byBjb250ZW50Qm94
SGVpZ2h0ID0gbG9naWNhbFJlY3QuaGVpZ2h0KCkgLSAoYm94R2VvbWV0cnkudmVydGljYWxCb3Jk
ZXIoKSArIGJveEdlb21ldHJ5LnZlcnRpY2FsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpOwotICAg
ICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoY29udGVudEJveEhl
aWdodCk7Ci0gICAgICAgICAgICAgICAgYXV0byBjb250ZW50Qm94V2lkdGggPSBsb2dpY2FsUmVj
dC53aWR0aCgpIC0gKGJveEdlb21ldHJ5Lmhvcml6b250YWxCb3JkZXIoKSArIGJveEdlb21ldHJ5
Lmhvcml6b250YWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KSk7Ci0gICAgICAgICAgICAgICAgYm94
R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGNvbnRlbnRCb3hXaWR0aCk7Ci0gICAgICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBNaWRkbGUgb3Ig
ZW5kIG9mIHRoZSBpbmxpbmUgYm94LiBMZXQncyBzdHJldGNoIHRoZSBib3ggYXMgbmVlZGVkLgot
ICAgICAgICAgICAgYXV0byBlbmNsb3NpbmdCb3JkZXJCb3hSZWN0ID0gQm94R2VvbWV0cnk6OmJv
cmRlckJveFJlY3QoYm94R2VvbWV0cnkpOwotICAgICAgICAgICAgZW5jbG9zaW5nQm9yZGVyQm94
UmVjdC5leHBhbmRUb0NvbnRhaW4obG9naWNhbFJlY3QpOwotICAgICAgICAgICAgYm94R2VvbWV0
cnkuc2V0TG9naWNhbExlZnQoZW5jbG9zaW5nQm9yZGVyQm94UmVjdC5sZWZ0KCkpOwotCi0gICAg
ICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGVuY2xvc2luZ0JvcmRlckJv
eFJlY3QuaGVpZ2h0KCkgLSAoYm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGJveEdlb21l
dHJ5LnZlcnRpY2FsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpKTsKLSAgICAgICAgICAgIGJveEdl
b21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChlbmNsb3NpbmdCb3JkZXJCb3hSZWN0LndpZHRoKCkg
LSAoYm94R2VvbWV0cnkuaG9yaXpvbnRhbEJvcmRlcigpICsgYm94R2VvbWV0cnkuaG9yaXpvbnRh
bFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKSk7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIHVwZGF0
ZUJveEdlb21ldHJ5Rm9ySW5saW5lQm94ZXMoKTsKLQotICAgIGF1dG8gY29uc3RydWN0TGluZUdl
b21ldHJ5ID0gWyZdIHsKLSAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmUoeyBsaW5lQm94
TG9naWNhbFJlY3QsIGVuY2xvc2luZ1RvcEFuZEJvdHRvbSwgbGluZUJveC5hbGlnbm1lbnRCYXNl
bGluZSgpLCByb290SW5saW5lQm94TG9naWNhbFJlY3QubGVmdCgpLCBsaW5lQ29udGVudC5jb250
ZW50TG9naWNhbFdpZHRoIH0pOwotICAgIH07Ci0gICAgY29uc3RydWN0TGluZUdlb21ldHJ5KCk7
Ci0KLSAgICByZXR1cm4gbGluZUJveExvZ2ljYWxSZWN0OwotfQotCi12b2lkIElubGluZUZvcm1h
dHRpbmdDb250ZXh0OjppbnZhbGlkYXRlRm9ybWF0dGluZ1N0YXRlKGNvbnN0IEludmFsaWRhdGlv
blN0YXRlJikKLXsKLSAgICAvLyBGaW5kIG91dCB3aGF0IHdlIG5lZWQgdG8gaW52YWxpZGF0ZS4g
VGhpcyBpcyB3aGVyZSB3ZSBhZGQgc29tZSBzbWFydHMgdG8gZG8gcGFydGlhbCBsaW5lIGxheW91
dC4KLSAgICAvLyBGb3Igbm93IGxldCdzIGp1c3QgY2xlYXIgdGhlIHJ1bnMuCi0gICAgZm9ybWF0
dGluZ1N0YXRlKCkuY2xlYXJMaW5lQW5kUnVucygpOwotICAgIC8vIEZJWE1FOiBUaGlzIGlzIGFs
c28gd2hlcmUgd2Ugd291bGQgZGVsZXRlIGlubGluZSBpdGVtcyBpZiB0aGVpciBjb250ZW50IGNo
YW5nZWQuCi19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHQu
aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3ZWM5NzIzN2MxZTg4ZDc4ODYwMjY3
YTE4MDdlMjA0OGFmNDMyZS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgot
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
LSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhU
KQotCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5l
QnVpbGRlci5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLQotbmFtZXNwYWNlIFdlYkNv
cmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIElubGluZUZvcm1hdHRpbmdTdGF0ZTsK
LWNsYXNzIEludmFsaWRhdGlvblN0YXRlOwotY2xhc3MgTGluZUJveDsKLQotLy8gVGhpcyBjbGFz
cyBpbXBsZW1lbnRzIHRoZSBsYXlvdXQgbG9naWMgZm9yIGlubGluZSBmb3JtYXR0aW5nIGNvbnRl
eHRzLgotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIyL3Zpc3VyZW4uaHRtbCNpbmxpbmUt
Zm9ybWF0dGluZwotY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQgZmluYWwgOiBwdWJsaWMg
Rm9ybWF0dGluZ0NvbnRleHQgewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoSW5saW5lRm9y
bWF0dGluZ0NvbnRleHQpOwotcHVibGljOgotICAgIElubGluZUZvcm1hdHRpbmdDb250ZXh0KGNv
bnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBJbmxpbmVGb3JtYXR0aW5n
U3RhdGUmKTsKLSAgICB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUm
LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSBvdmVycmlkZTsKLSAgICBMYXlv
dXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICBjbGFzcyBR
dWlya3MgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyB7Ci0gICAgcHVibGljOgot
ICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGluaXRpYWxMaW5lSGVpZ2h0KCkgY29uc3Q7Ci0gICAg
ICAgIGJvb2wgaGFzU29mdFdyYXBPcHBvcnR1bml0eUF0SW1hZ2UoKSBjb25zdDsKLSAgICAgICAg
Ym9vbCBpbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGNvbnN0IExpbmVCb3g6OklubGluZUxl
dmVsQm94JiwgY29uc3QgTGluZUJveCYpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAg
ZnJpZW5kIGNsYXNzIElubGluZUZvcm1hdHRpbmdDb250ZXh0OwotICAgICAgICBRdWlya3MoY29u
c3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmKTsKLQotICAgICAgICBjb25zdCBJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2Fz
dDxJbmxpbmVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6Zm9y
bWF0dGluZ0NvbnRleHQoKSk7IH0KLQotICAgIH07Ci0gICAgSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9Ci0KLSAg
ICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIGNvbnN0IHsg
cmV0dXJuIGRvd25jYXN0PElubGluZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6
OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQotICAgIElubGluZUZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0
dGluZ1N0YXRlKCkgeyByZXR1cm4gZG93bmNhc3Q8SW5saW5lRm9ybWF0dGluZ1N0YXRlPihGb3Jt
YXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9Ci0KLSAgICB2b2lkIGxpbmVMYXlv
dXRGb3JJbnRlcmdyYXRpb24oSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0Zv
ckluRmxvd0NvbnRlbnQmKTsKLQotcHJpdmF0ZToKLSAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpIG92ZXJyaWRlOwotCi0gICAg
Y2xhc3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKLSAg
ICBwdWJsaWM6Ci0gICAgICAgIExpbmVCb3ggbGluZUJveEZvckxpbmVDb250ZW50KGNvbnN0IExp
bmVCdWlsZGVyOjpMaW5lQ29udGVudCYpOwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxUb3BGb3JOZXh0TGluZShjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmLCBJbmxpbmVM
YXlvdXRVbml0IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIGNvbnN0IEZsb2F0aW5nQ29udGV4
dCYpIGNvbnN0OwotCi0gICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5saW5lQmxvY2tD
b250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpIGNvbnN0OwotICAgICAgICBD
b250ZW50V2lkdGhBbmRNYXJnaW4gaW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRNYXJnaW4oY29u
c3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhv
cml6b250YWxWYWx1ZXMmKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKLSAgICAgICAgR2VvbWV0cnkoY29uc3QgSW5saW5lRm9y
bWF0dGluZ0NvbnRleHQmKTsKLQotICAgICAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpmb3JtYXR0aW5nQ29u
dGV4dCgpKTsgfQotCi0gICAgfTsKLSAgICBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0
cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBHZW9tZXRyeSgqdGhpcyk7IH0KLQotICAgIHZv
aWQgbGluZUxheW91dChJbmxpbmVJdGVtcyYsIExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2Us
IGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOwotCi0gICAgdm9pZCBjb21wdXRl
SW50cmluc2ljV2lkdGhGb3JGb3JtYXR0aW5nUm9vdChjb25zdCBCb3gmKTsKLSAgICBJbmxpbmVM
YXlvdXRVbml0IGNvbXB1dGVkSW50cmluc2ljV2lkdGhGb3JDb25zdHJhaW50KElubGluZUxheW91
dFVuaXQgYXZhaWxhYmxlV2lkdGgpIGNvbnN0OwotCi0gICAgdm9pZCBjb21wdXRlSG9yaXpvbnRh
bE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmKTsKLSAgICB2
b2lkIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJik7Ci0gICAgdm9pZCBjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3QgQm94Jiwg
Y29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7Ci0KLSAgICB2b2lkIGNvbGxlY3RJbmxpbmVD
b250ZW50SWZOZWVkZWQoKTsKLSAgICBJbmxpbmVSZWN0IGNvbXB1dGVHZW9tZXRyeUZvckxpbmVD
b250ZW50KGNvbnN0IExpbmVCdWlsZGVyOjpMaW5lQ29udGVudCYsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYpOwotICAgIHZvaWQgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShjb25zdCBJ
bnZhbGlkYXRpb25TdGF0ZSYpOwotfTsKLQotaW5saW5lIElubGluZUZvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeTo6R2VvbWV0cnkoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGlu
ZUZvcm1hdHRpbmdDb250ZXh0KQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5KGlu
bGluZUZvcm1hdHRpbmdDb250ZXh0KQotewotfQotCi1pbmxpbmUgSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQ6OlF1aXJrczo6UXVpcmtzKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxp
bmVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICA6IEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MoaW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQpCi17Ci19Ci0KLX0KLX0KLQotU1BFQ0lBTElaRV9UWVBFX1RS
QUlUU19MQVlPVVRfRk9STUFUVElOR19DT05URVhUKElubGluZUZvcm1hdHRpbmdDb250ZXh0LCBp
c0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRH
ZW9tZXRyeS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggYjI0ZTc4ODMzMzgwZmI0Y2MyMDUxMzU5YTM2YjUwNDk1NDliOWFkMC4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAor
KysgL2Rldi9udWxsCkBAIC0xLDcyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
Ci0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNv
bmZpZy5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFC
TEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4
dC5oIgotI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiSW5saW5lTGlu
ZUJveC5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dENvbnRhaW5l
ckJveC5oIgotI2luY2x1ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCi0jaW5jbHVkZSAiTGVuZ3Ro
RnVuY3Rpb25zLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewot
Ci1jbGFzcyBMaW5lQm94QnVpbGRlciB7Ci1wdWJsaWM6Ci0gICAgTGluZUJveEJ1aWxkZXIoY29u
c3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmKTsKLSAgICBMaW5lQm94IGJ1aWxkKGNvbnN0IExp
bmVCdWlsZGVyOjpMaW5lQ29udGVudCYpOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBTaW1wbGlm
aWVkVmVydGljYWxBbGlnbm1lbnQgewotICAgICAgICBTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1l
bnQoY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gpOwotCi0gICAg
ICAgIHN0YXRpYyBib29sIGNhblVzZVNpbXBsaWZpZWRBbGlnbm1lbnQoY29uc3QgTGluZUJveDo6
SW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gsIGNvbnN0IExpbmVCb3g6OklubGluZUxldmVs
Qm94JiwgT3B0aW9uYWw8Y29uc3QgQm94R2VvbWV0cnk+IGlubGluZUxldmVsQm94R2VvbWV0cnkp
OwotCi0gICAgICAgIHZvaWQgYWxpZ24oTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmKTsKLQotICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IHJvb3RJbmxpbmVCb3hMb2dpY2FsVG9wKCkgY29uc3QgeyBy
ZXR1cm4gbV9yb290SW5saW5lQm94TG9naWNhbFRvcDsgfQotICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IGxpbmVCb3hIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hMb2dpY2FsQm90dG9t
IC0gbV9saW5lQm94TG9naWNhbFRvcDsgfQotCi0gICAgICAgIHZvaWQgc2V0RW5hYmxlZChib29s
IGVuYWJsZWQpIHsgbV9pc0VuYWJsZWQgPSBlbmFibGVkOyB9Ci0gICAgICAgIGJvb2wgaXNFbmFi
bGVkKCkgY29uc3QgeyByZXR1cm4gbV9pc0VuYWJsZWQ7IH0KLQotICAgIHByaXZhdGU6Ci0gICAg
ICAgIHZvaWQgYWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94Jik7Ci0KLSAgICAg
ICAgY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIG1fcm9vdElubGluZUJveDsKLSAgICAg
ICAgYm9vbCBtX2lzRW5hYmxlZCB7IHRydWUgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBt
X2xpbmVCb3hMb2dpY2FsVG9wIHsgMCB9OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fbGlu
ZUJveExvZ2ljYWxCb3R0b20geyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbV9yb290
SW5saW5lQm94TG9naWNhbFRvcCB7IDAgfTsKLSAgICB9OwotCi0gICAgdm9pZCBzZXRWZXJ0aWNh
bEdlb21ldHJ5Rm9ySW5saW5lQm94KExpbmVCb3g6OklubGluZUxldmVsQm94JikgY29uc3Q7Ci0g
ICAgdm9pZCBjb25zdHJ1Y3RBbmRBbGlnbklubGluZUxldmVsQm94ZXMoTGluZUJveCYsIGNvbnN0
IExpbmU6OlJ1bkxpc3QmKTsKLSAgICB2b2lkIGNvbXB1dGVMaW5lQm94SGVpZ2h0QW5kQWxpZ25J
bmxpbmVMZXZlbEJveGVzVmVydGljYWxseShMaW5lQm94Jik7Ci0KLSAgICBjb25zdCBJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2lu
bGluZUZvcm1hdHRpbmdDb250ZXh0OyB9Ci0gICAgY29uc3QgQm94JiByb290Qm94KCkgY29uc3Qg
eyByZXR1cm4gZm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCk7IH0KLSAgICBMYXlvdXRTdGF0ZSYg
bGF5b3V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmxheW91dFN0
YXRlKCk7IH0KLQotICAgIGJvb2wgaXNSb290TGF5b3V0Qm94KGNvbnN0IENvbnRhaW5lckJveCYg
Y29udGFpbmVyQm94KSBjb25zdCB7IHJldHVybiAmY29udGFpbmVyQm94ID09ICZyb290Qm94KCk7
IH0KLQotcHJpdmF0ZToKLSAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgbV9pbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDsKLX07Ci0KLXN0cnVjdCBIYW5naW5nVHJhaWxpbmdXaGl0ZXNw
YWNlQ29udGVudCB7Ci1wdWJsaWM6Ci0gICAgdm9pZCByZXNldCgpOwotCi0gICAgSW5saW5lTGF5
b3V0VW5pdCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fd2lkdGg7IH0KLSAgICBib29sIGlzQ29u
ZGl0aW9uYWwoKSBjb25zdCB7IHJldHVybiBtX2lzQ29uZGl0aW9uYWw7IH0KLQotICAgIHZvaWQg
c2V0SXNDb25kaXRpb25hbCgpIHsgbV9pc0NvbmRpdGlvbmFsID0gdHJ1ZTsgfQotICAgIHZvaWQg
ZXhwYW5kKElubGluZUxheW91dFVuaXQgd2lkdGgpIHsgbV93aWR0aCArPSB3aWR0aDsgfQotCi1w
cml2YXRlOgotICAgIGJvb2wgbV9pc0NvbmRpdGlvbmFsIHsgZmFsc2UgfTsKLSAgICBJbmxpbmVM
YXlvdXRVbml0IG1fd2lkdGggeyAwIH07Ci19OwotCi12b2lkIEhhbmdpbmdUcmFpbGluZ1doaXRl
c3BhY2VDb250ZW50OjpyZXNldCgpCi17Ci0gICAgbV9pc0NvbmRpdGlvbmFsID0gZmFsc2U7Ci0g
ICAgbV93aWR0aCA9ICAwOwotfQotCi1zdGF0aWMgSGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNv
bnRlbnQgY29sbGVjdEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50KGNvbnN0IExpbmU6
OlJ1bkxpc3QmIHJ1bnMsIGJvb2wgaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KQotewotICAg
IGF1dG8gaGFuZ2luZ0NvbnRlbnQgPSBIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVudCB7
IH07Ci0gICAgaWYgKGlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudCkKLSAgICAgICAgaGFuZ2lu
Z0NvbnRlbnQuc2V0SXNDb25kaXRpb25hbCgpOwotICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjpt
YWtlUmV2ZXJzZWRSYW5nZShydW5zKSkgewotICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94U3Rh
cnQoKSB8fCBydW4uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICBpZiAocnVuLmlzTGluZUJyZWFrKCkpIHsKLSAgICAgICAgICAgIGhhbmdpbmdDb250ZW50
LnNldElzQ29uZGl0aW9uYWwoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0g
ICAgICAgIGlmICghcnVuLmhhc1RyYWlsaW5nV2hpdGVzcGFjZSgpKQotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBwcmVzZXJ2ZWQgb3IgaHVuZyB3aGl0
ZXNwYWNlLgotICAgICAgICBpZiAocnVuLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9IFdoaXRlU3Bh
Y2U6OlByZVdyYXApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLy8gVGhpcyBpcyBlaXRo
ZXIgYSBub3JtYWwgb3IgY29uZGl0aW9uYWxseSBoYW5naW5nIHRyYWlsaW5nIHdoaXRlc3BhY2Uu
Ci0gICAgICAgIGhhbmdpbmdDb250ZW50LmV4cGFuZChydW4udHJhaWxpbmdXaGl0ZXNwYWNlV2lk
dGgoKSk7Ci0gICAgfQotICAgIHJldHVybiBoYW5naW5nQ29udGVudDsKLX0KLQotc3RhdGljIE9w
dGlvbmFsPElubGluZUxheW91dFVuaXQ+IGhvcml6b250YWxBbGlnbm1lbnRPZmZzZXQoY29uc3Qg
TGluZTo6UnVuTGlzdCYgcnVucywgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24sIElubGluZUxheW91
dFVuaXQgbGluZUxvZ2ljYWxXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdp
ZHRoLCBib29sIGlzTGFzdExpbmUpCi17Ci0gICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGxpbmVM
b2dpY2FsV2lkdGggLSBjb250ZW50TG9naWNhbFdpZHRoOwotICAgIGF1dG8gaGFuZ2luZ1RyYWls
aW5nV2hpdGVzcGFjZUNvbnRlbnQgPSBjb2xsZWN0SGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNv
bnRlbnQocnVucywgaXNMYXN0TGluZSk7Ci0gICAgYXZhaWxhYmxlV2lkdGggKz0gaGFuZ2luZ1Ry
YWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQud2lkdGgoKTsKLSAgICBpZiAoYXZhaWxhYmxlV2lkdGgg
PD0gMCkKLSAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFs
QWxpZ25tZW50ID0gWyZdIHsKLSAgICAgICAgaWYgKHRleHRBbGlnbiAhPSBUZXh0QWxpZ25Nb2Rl
OjpKdXN0aWZ5KQotICAgICAgICAgICAgcmV0dXJuIHRleHRBbGlnbjsKLSAgICAgICAgLy8gVGV4
dCBpcyBqdXN0aWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBtZXRob2Qgc3BlY2lmaWVkIGJ5IHRoZSB0
ZXh0LWp1c3RpZnkgcHJvcGVydHksCi0gICAgICAgIC8vIGluIG9yZGVyIHRvIGV4YWN0bHkgZmls
bCB0aGUgbGluZSBib3guIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRleHQtYWxpZ24t
bGFzdCwKLSAgICAgICAgLy8gdGhlIGxhc3QgbGluZSBiZWZvcmUgYSBmb3JjZWQgYnJlYWsgb3Ig
dGhlIGVuZCBvZiB0aGUgYmxvY2sgaXMgc3RhcnQtYWxpZ25lZC4KLSAgICAgICAgaWYgKGlzTGFz
dExpbmUgfHwgKCFydW5zLmlzRW1wdHkoKSAmJiBydW5zLmxhc3QoKS5pc0xpbmVCcmVhaygpKSkK
LSAgICAgICAgICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpTdGFydDsKLSAgICAgICAgcmV0dXJu
IFRleHRBbGlnbk1vZGU6Okp1c3RpZnk7Ci0gICAgfTsKLQotICAgIHN3aXRjaCAoY29tcHV0ZWRI
b3Jpem9udGFsQWxpZ25tZW50KCkpIHsKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OkxlZnQ6Ci0g
ICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRMZWZ0OgotICAgIGNhc2UgVGV4dEFsaWduTW9k
ZTo6U3RhcnQ6Ci0gICAgICAgIHJldHVybiB7IH07Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpS
aWdodDoKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0OgotICAgIGNhc2UgVGV4
dEFsaWduTW9kZTo6RW5kOgotICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7Ci0gICAgY2Fz
ZSBUZXh0QWxpZ25Nb2RlOjpDZW50ZXI6Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRD
ZW50ZXI6Ci0gICAgICAgIHJldHVybiBhdmFpbGFibGVXaWR0aCAvIDI7Ci0gICAgY2FzZSBUZXh0
QWxpZ25Nb2RlOjpKdXN0aWZ5OgotICAgICAgICAvLyBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5IGlz
IGEgcnVuIGFsaWdubWVudCAoYW5kIHdlIG9ubHkgZG8gaW5saW5lIGJveCBhbGlnbm1lbnQgaGVy
ZSkKLSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICBkZWZhdWx0OgotICAgICAgICBBU1NFUlRfTk9U
X0lNUExFTUVOVEVEX1lFVCgpOwotICAgICAgICByZXR1cm4geyB9OwotICAgIH0KLSAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4geyB9OwotfQotCi1MaW5lQm94QnVpbGRlcjo6
TGluZUJveEJ1aWxkZXIoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1h
dHRpbmdDb250ZXh0KQotICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dCkKLXsKLX0KLQotTGluZUJveCBMaW5lQm94QnVpbGRlcjo6YnVpbGQoY29u
c3QgTGluZUJ1aWxkZXI6OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCkKLXsKLSAgICBhdXRvJiBy
dW5zID0gbGluZUNvbnRlbnQucnVuczsKLSAgICBhdXRvIGxpbmVMb2dpY2FsV2lkdGggPSBsaW5l
Q29udGVudC5saW5lTG9naWNhbFdpZHRoOwotICAgIGF1dG8gY29udGVudExvZ2ljYWxXaWR0aCA9
IGxpbmVDb250ZW50LmNvbnRlbnRMb2dpY2FsV2lkdGg7Ci0gICAgYXV0byBob3Jpem9udGFsQWxp
Z25tZW50T2Zmc2V0ID0gTGF5b3V0Ojpob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0KHJ1bnMsIHJv
b3RCb3goKS5zdHlsZSgpLnRleHRBbGlnbigpLCBsaW5lTG9naWNhbFdpZHRoLCBjb250ZW50TG9n
aWNhbFdpZHRoLCBsaW5lQ29udGVudC5pc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQpOwotICAg
IGF1dG8gbGluZUJveCA9IExpbmVCb3ggeyByb290Qm94KCksIGxpbmVDb250ZW50LmxvZ2ljYWxU
b3BMZWZ0LCBsaW5lTG9naWNhbFdpZHRoLCBob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0LnZhbHVl
T3IoSW5saW5lTGF5b3V0VW5pdCB7IH0pLCBjb250ZW50TG9naWNhbFdpZHRoLCBsaW5lQ29udGVu
dC5ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQgfTsKLSAgICBjb25zdHJ1Y3RBbmRBbGln
bklubGluZUxldmVsQm94ZXMobGluZUJveCwgcnVucyk7Ci0gICAgcmV0dXJuIGxpbmVCb3g7Ci19
Ci0KLXZvaWQgTGluZUJveEJ1aWxkZXI6OnNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3go
TGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94KSBjb25zdAotewotICAgIEFT
U0VSVChpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpIHx8IGlubGluZUxldmVsQm94LmlzTGlu
ZUJyZWFrQm94KCkpOwotICAgIGF1dG8mIGZvbnRNZXRyaWNzID0gaW5saW5lTGV2ZWxCb3guc3R5
bGUoKS5mb250TWV0cmljcygpOwotICAgIElubGluZUxheW91dFVuaXQgYXNjZW50ID0gZm9udE1l
dHJpY3MuYXNjZW50KCk7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBkZXNjZW50ID0gZm9udE1ldHJp
Y3MuZGVzY2VudCgpOwotICAgIGF1dG8gbG9naWNhbEhlaWdodCA9IGFzY2VudCArIGRlc2NlbnQ7
Ci0gICAgLy8gV2UgbmVlZCBmbG9vci9jZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlvdXQgaW50ZWdy
YWwgcG9zaXRpb25pbmcuCi0gICAgaW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUoZmxvb3JmKGFz
Y2VudCkpOwotICAgIGlubGluZUxldmVsQm94LnNldERlc2NlbnQoY2VpbChkZXNjZW50KSk7Ci0g
ICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KTsKLQotICAg
IC8vIEZJWE1FOiBBZGp1c3QgbGF5b3V0IGJvdW5kcyB3aXRoIGZhbGxiYWNrIGZvbnQgd2hlbiBh
cHBsaWNhYmxlLgotICAgIGF1dG8mIHN0eWxlID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCku
c3R5bGUoKTsKLSAgICBhdXRvIGxpbmVIZWlnaHQgPSBzdHlsZS5saW5lSGVpZ2h0KCk7Ci0gICAg
aWYgKGxpbmVIZWlnaHQuaXNOZWdhdGl2ZSgpKSB7Ci0gICAgICAgIC8vIElmIGxpbmUtaGVpZ2h0
IGNvbXB1dGVzIHRvIG5vcm1hbCBhbmQgZWl0aGVyIHRleHQtZWRnZSBpcyBsZWFkaW5nIG9yIHRo
aXMgaXMgdGhlIHJvb3QgaW5saW5lIGJveCwKLSAgICAgICAgLy8gdGhlIGZvbnTigJlzIGxpbmUg
Z2FwIG1ldHJpYyBtYXkgYWxzbyBiZSBpbmNvcnBvcmF0ZWQgaW50byBBIGFuZCBEIGJ5IGFkZGlu
ZyBoYWxmIHRvIGVhY2ggc2lkZSBhcyBoYWxmLWxlYWRpbmcuCi0gICAgICAgIC8vIGh0dHBzOi8v
d3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2lubGluZS1oZWlnaHQKLSAgICAgICAgLy8gU2lu
Y2UgdGV4dC1lZGdlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSBp
cyBsZWFkaW5nLCB3ZSBzaG91bGQganVzdCBhcHBseSBpdCB0bwotICAgICAgICAvLyBhbGwgaW5s
aW5lIGJveGVzLgotICAgICAgICBhdXRvIGhhbGZMaW5lR2FwID0gKGZvbnRNZXRyaWNzLmxpbmVT
cGFjaW5nKCkgLSBsb2dpY2FsSGVpZ2h0KSAvIDI7Ci0gICAgICAgIGFzY2VudCArPSBoYWxmTGlu
ZUdhcDsKLSAgICAgICAgZGVzY2VudCArPSBoYWxmTGluZUdhcDsKLSAgICB9IGVsc2UgewotICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IGxpbmVIZWlnaHQgPSBzdHlsZS5jb21wdXRlZExpbmVIZWln
aHQoKTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBoYWxmTGVhZGluZyA9IChsaW5lSGVpZ2h0
IC0gKGFzY2VudCArIGRlc2NlbnQpKSAvIDI7Ci0gICAgICAgIGFzY2VudCArPSBoYWxmTGVhZGlu
ZzsKLSAgICAgICAgZGVzY2VudCArPSBoYWxmTGVhZGluZzsKLSAgICB9Ci0gICAgLy8gV2UgbmVl
ZCBmbG9vci9jZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlvdXQgaW50ZWdyYWwgcG9zaXRpb25pbmcu
Ci0gICAgaW5saW5lTGV2ZWxCb3guc2V0TGF5b3V0Qm91bmRzKExpbmVCb3g6OklubGluZUxldmVs
Qm94OjpMYXlvdXRCb3VuZHMgeyBmbG9vcmYoYXNjZW50KSwgY2VpbChkZXNjZW50KSB9KTsKLX0K
LQotdm9pZCBMaW5lQm94QnVpbGRlcjo6Y29uc3RydWN0QW5kQWxpZ25JbmxpbmVMZXZlbEJveGVz
KExpbmVCb3gmIGxpbmVCb3gsIGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnMpCi17Ci0gICAgYXV0
byYgcm9vdElubGluZUJveCA9IGxpbmVCb3gucm9vdElubGluZUJveCgpOwotICAgIHNldFZlcnRp
Y2FsR2VvbWV0cnlGb3JJbmxpbmVCb3gocm9vdElubGluZUJveCk7Ci0KLSAgICBhdXRvIHNpbXBs
aWZpZWRWZXJ0aWNhbEFsaWdubWVudCA9IFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudCB7IHJv
b3RJbmxpbmVCb3ggfTsKLSAgICAvLyBGSVhNRTogQWRkIGZhc3QgcGF0aCBzdXBwb3J0IGZvciBs
aW5lLWhlaWdodCBjb250ZW50LgotICAgIHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5zZXRF
bmFibGVkKGxheW91dFN0YXRlKCkuaW5TdGFuZGFyZHNNb2RlKCkgJiYgcm9vdEJveCgpLnN0eWxl
KCkubGluZUhlaWdodCgpLmlzTmVnYXRpdmUoKSk7Ci0KLSAgICBhdXRvIHNpbXBsaWZpZWRBbGln
blZlcnRpY2FsbHlJZkFwcGxpY2FibGUgPSBbJl0oYXV0byYgaW5saW5lTGV2ZWxCb3gsIE9wdGlv
bmFsPGNvbnN0IEJveEdlb21ldHJ5PiBib3hHZW9tZXRyeSkgewotICAgICAgICBpZiAoIXNpbXBs
aWZpZWRWZXJ0aWNhbEFsaWdubWVudC5pc0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgaWYgKCFTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OmNhblVzZVNpbXBsaWZp
ZWRBbGlnbm1lbnQocm9vdElubGluZUJveCwgaW5saW5lTGV2ZWxCb3gsIGJveEdlb21ldHJ5KSkg
ewotICAgICAgICAgICAgc2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50LnNldEVuYWJsZWQoZmFs
c2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNpbXBsaWZpZWRW
ZXJ0aWNhbEFsaWdubWVudC5hbGlnbihpbmxpbmVMZXZlbEJveCk7Ci0gICAgfTsKLQotICAgIGF1
dG8gY3JlYXRlV3JhcHBlZElubGluZUJveGVzID0gWyZdIHsKLSAgICAgICAgaWYgKHJ1bnMuaXNF
bXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvLyBBbiBpbmxpbmUgYm94IG1h
eSBub3QgbmVjZXNzYXJpbHkgc3RhcnQgb24gdGhlIGN1cnJlbnQgbGluZToKLSAgICAgICAgLy8g
PHNwYW4gaWQ9b3V0ZXI+bGluZSBicmVhazxicj50aGlzIGNvbnRlbnQncyBwYXJlbnQgaW5saW5l
IGJveCgnb3V0ZXInKSA8c3BhbiBpZD1pbm5lcj5zdGFydHMgb24gdGhlIHByZXZpb3VzIGxpbmU8
L3NwYW4+PC9zcGFuPgotICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJl
J3MgYW4gTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggZm9yIGV2ZXJ5IGlubGluZSBib3ggdGhhdCdz
IHByZXNlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAgLy8gSW4gbmVzdGluZyBjYXNl
IHdlIG5lZWQgdG8gY3JlYXRlIExpbmVCb3g6OklubGluZUxldmVsQm94ZXMgZm9yIHRoZSBpbmxp
bmUgYm94IGFuY2VzdG9ycy4KLSAgICAgICAgLy8gV2Ugb25seSBoYXZlIHRvIGRvIGl0IG9uIHRo
ZSBmaXJzdCBydW4gYXMgYW55IHN1YnNlcXVlbnQgaW5saW5lIGNvbnRlbnQgaXMgZWl0aGVyIGF0
IHRoZSBzYW1lL2hpZ2hlciBuZXN0aW5nIGxldmVsIG9yCi0gICAgICAgIC8vIG5lc3RlZCB3aXRo
IGEgW2lubGluZSBib3ggc3RhcnRdIHJ1bi4KLSAgICAgICAgYXV0byYgZmlyc3RSdW4gPSBydW5z
WzBdOwotICAgICAgICBhdXRvJiBmaXJzdFJ1blBhcmVudExheW91dEJveCA9IGZpcnN0UnVuLmxh
eW91dEJveCgpLnBhcmVudCgpOwotICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGlzIHRoZSBmb3Jt
YXR0aW5nIHJvb3QsIHdlIGNhbiBzdG9wIGhlcmUuIFRoaXMgaXMgcm9vdCBpbmxpbmUgYm94IGNv
bnRlbnQsIHRoZXJlJ3Mgbm8gbmVzdGluZyBpbmxpbmUgYm94IGZyb20gdGhlIHByZXZpb3VzIGxp
bmUocykKLSAgICAgICAgLy8gdW5sZXNzIHRoZSBpbmxpbmUgYm94IGNsb3NpbmcgaXMgZm9yY2Vk
IG92ZXIgdG8gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAgLy8gZS5nLgotICAgICAgICAvLyA8
c3Bhbj5ub3JtYWxseSB0aGUgaW5saW5lIGJveCBjbG9zaW5nIGZvcm1zIGEgY29udGludW91cyBj
b250ZW50PC9zcGFuPgotICAgICAgICAvLyA8c3Bhbj51bmxlc3MgaXQncyBmb3JjZWQgdG8gdGhl
IG5leHQgbGluZTxicj48L3NwYW4+Ci0gICAgICAgIGF1dG8gZmlyc3RSdW5OZWVkc0lubGluZUJv
eCA9IGZpcnN0UnVuLmlzSW5saW5lQm94RW5kKCk7Ci0gICAgICAgIGlmICghZmlyc3RSdW5OZWVk
c0lubGluZUJveCAmJiBpc1Jvb3RMYXlvdXRCb3goZmlyc3RSdW5QYXJlbnRMYXlvdXRCb3gpKQot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBWZWN0b3I8Y29uc3QgQm94Kj4gbGF5b3V0Qm94
ZXNXaXRob3V0SW5saW5lQm94ZXM7Ci0gICAgICAgIGlmIChmaXJzdFJ1bk5lZWRzSW5saW5lQm94
KQotICAgICAgICAgICAgbGF5b3V0Qm94ZXNXaXRob3V0SW5saW5lQm94ZXMuYXBwZW5kKCZmaXJz
dFJ1bi5sYXlvdXRCb3goKSk7Ci0gICAgICAgIGF1dG8qIGFuY2VzdG9yID0gJmZpcnN0UnVuUGFy
ZW50TGF5b3V0Qm94OwotICAgICAgICB3aGlsZSAoIWlzUm9vdExheW91dEJveCgqYW5jZXN0b3Ip
KSB7Ci0gICAgICAgICAgICBsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVCb3hlcy5hcHBlbmQoYW5j
ZXN0b3IpOwotICAgICAgICAgICAgYW5jZXN0b3IgPSAmYW5jZXN0b3ItPnBhcmVudCgpOwotICAg
ICAgICB9Ci0gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgbWlzc2luZyBMaW5lQm94OjpJbmxpbmVC
b3hlcyBzdGFydGluZyB3aXRoIHRoZSB0b3Btb3N0IGxheW91dCBib3guCi0gICAgICAgIGZvciAo
YXV0byogbGF5b3V0Qm94IDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShsYXlvdXRCb3hlc1dpdGhv
dXRJbmxpbmVCb3hlcykpIHsKLSAgICAgICAgICAgIGF1dG8gaW5saW5lQm94ID0gTGluZUJveDo6
SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUlubGluZUJveCgqbGF5b3V0Qm94LCByb290SW5saW5lQm94
LmxvZ2ljYWxMZWZ0KCksIGxpbmVCb3guY29udGVudExvZ2ljYWxXaWR0aCgpKTsKLSAgICAgICAg
ICAgIHNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3goaW5saW5lQm94KTsKLSAgICAgICAg
ICAgIHNpbXBsaWZpZWRBbGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUoaW5saW5lQm94LCB7IH0p
OwotICAgICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChXVEZNb3ZlKGlubGluZUJv
eCkpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBjcmVhdGVXcmFwcGVkSW5saW5lQm94ZXMoKTsK
LQotICAgIGF1dG8gbGluZUhhc0NvbnRlbnQgPSBmYWxzZTsKLSAgICBmb3IgKGF1dG8mIHJ1biA6
IHJ1bnMpIHsKLSAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gcnVuLmxheW91dEJveCgpOwotICAg
ICAgICBhdXRvIHJ1bkhhc0NvbnRlbnQgPSBbJl0gKCkgLT4gYm9vbCB7Ci0gICAgICAgICAgICBB
U1NFUlQoIWxpbmVIYXNDb250ZW50KTsKLSAgICAgICAgICAgIGlmIChydW4uaXNUZXh0KCkgfHwg
cnVuLmlzQm94KCkgfHwgcnVuLmlzU29mdExpbmVCcmVhaygpIHx8IHJ1bi5pc0hhcmRMaW5lQnJl
YWsoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGF1dG8mIGlu
bGluZUJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlv
dXRCb3gpOwotICAgICAgICAgICAgLy8gRXZlbiBuZWdhdGl2ZSBob3Jpem9udGFsIG1hcmdpbiBt
YWtlcyB0aGUgbGluZSAiY29udGVudGZ1bCIuCi0gICAgICAgICAgICBpZiAocnVuLmlzSW5saW5l
Qm94U3RhcnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5saW5lQm94R2VvbWV0cnkubWFy
Z2luU3RhcnQoKSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCkgfHwgaW5saW5lQm94
R2VvbWV0cnkucGFkZGluZ0xlZnQoKS52YWx1ZU9yKDBfbHUpOwotICAgICAgICAgICAgaWYgKHJ1
bi5pc0lubGluZUJveEVuZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVCb3hHZW9t
ZXRyeS5tYXJnaW5FbmQoKSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJSaWdodCgpIHx8IGlu
bGluZUJveEdlb21ldHJ5LnBhZGRpbmdSaWdodCgpLnZhbHVlT3IoMF9sdSk7Ci0gICAgICAgICAg
ICBpZiAocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkKLSAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAg
IHJldHVybiB0cnVlOwotICAgICAgICB9OwotICAgICAgICBsaW5lSGFzQ29udGVudCA9IGxpbmVI
YXNDb250ZW50IHx8IHJ1bkhhc0NvbnRlbnQoKTsKLSAgICAgICAgYXV0byBsb2dpY2FsTGVmdCA9
IHJvb3RJbmxpbmVCb3gubG9naWNhbExlZnQoKSArIHJ1bi5sb2dpY2FsTGVmdCgpOwotICAgICAg
ICBpZiAocnVuLmlzQm94KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGlubGluZUxldmVsQm94R2Vv
bWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0g
ICAgICAgICAgICBhdXRvIG1hcmdpbkJveEhlaWdodCA9IGlubGluZUxldmVsQm94R2VvbWV0cnku
bWFyZ2luQm94SGVpZ2h0KCk7Ci0gICAgICAgICAgICBhdXRvIGFzY2VudCA9IElubGluZUxheW91
dFVuaXQgeyB9OwotICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlKCkuc2hvdWxkTm90U3ludGhl
c2l6ZUlubGluZUJsb2NrQmFzZWxpbmUoKSkgewotICAgICAgICAgICAgICAgIC8vIEludGVncmF0
aW9uIGNvZGVwYXRoIGNvbnN0cnVjdHMgcmVwbGFjZWQgYm94ZXMgZm9yIGlubGluZS1ibG9jayBj
b250ZW50LgotICAgICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgp
KTsKLSAgICAgICAgICAgICAgICBhc2NlbnQgPSAqZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91
dEJveCkuYmFzZWxpbmUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LmlzSW5s
aW5lQmxvY2tCb3goKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlbGluZSBvZiBhbiAn
aW5saW5lLWJsb2NrJyBpcyB0aGUgYmFzZWxpbmUgb2YgaXRzIGxhc3QgbGluZSBib3ggaW4gdGhl
IG5vcm1hbCBmbG93LCB1bmxlc3MgaXQgaGFzIGVpdGhlciBubyBpbi1mbG93IGxpbmUgYm94ZXMg
b3IKLSAgICAgICAgICAgICAgICAvLyBpZiBpdHMgJ292ZXJmbG93JyBwcm9wZXJ0eSBoYXMgYSBj
b21wdXRlZCB2YWx1ZSBvdGhlciB0aGFuICd2aXNpYmxlJywgaW4gd2hpY2ggY2FzZSB0aGUgYmFz
ZWxpbmUgaXMgdGhlIGJvdHRvbSBtYXJnaW4gZWRnZS4KLSAgICAgICAgICAgICAgICBhdXRvIHN5
bnRoZXNpemVCYXNlbGluZSA9ICFsYXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCgpIHx8ICFsYXlvdXRCb3guc3R5bGUoKS5pc092ZXJmbG93VmlzaWJsZSgpOwotICAg
ICAgICAgICAgICAgIGlmIChzeW50aGVzaXplQmFzZWxpbmUpCi0gICAgICAgICAgICAgICAgICAg
IGFzY2VudCA9IG1hcmdpbkJveEhlaWdodDsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAg
ICAgICAgICAgICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUoKS5lc3Rh
Ymxpc2hlZElubGluZUZvcm1hdHRpbmdTdGF0ZShkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91
dEJveCkpOwotICAgICAgICAgICAgICAgICAgICBhdXRvJiBsYXN0TGluZSA9IGZvcm1hdHRpbmdT
dGF0ZS5saW5lcygpLmxhc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBpbmxpbmVCbG9j
a0Jhc2VsaW5lID0gbGFzdExpbmUubGluZUJveExvZ2ljYWxSZWN0KCkudG9wKCkgKyBsYXN0TGlu
ZS5iYXNlbGluZSgpOwotICAgICAgICAgICAgICAgICAgICBhc2NlbnQgPSBpbmxpbmVMZXZlbEJv
eEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpICsgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS5ib3JkZXJU
b3AoKSArIGlubGluZUxldmVsQm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCkgKyBp
bmxpbmVCbG9ja0Jhc2VsaW5lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxz
ZSBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgICAgICAgICBhc2NlbnQg
PSBkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KS5iYXNlbGluZSgpLnZhbHVlT3IobWFy
Z2luQm94SGVpZ2h0KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhc2NlbnQg
PSBtYXJnaW5Cb3hIZWlnaHQ7Ci0gICAgICAgICAgICBsb2dpY2FsTGVmdCArPSBzdGQ6Om1heCgw
X2x1LCBpbmxpbmVMZXZlbEJveEdlb21ldHJ5Lm1hcmdpblN0YXJ0KCkpOwotICAgICAgICAgICAg
YXV0byBhdG9taWNJbmxpbmVMZXZlbEJveCA9IExpbmVCb3g6OklubGluZUxldmVsQm94OjpjcmVh
dGVBdG9taWNJbmxpbmVMZXZlbEJveChsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCB7IGlubGluZUxl
dmVsQm94R2VvbWV0cnkuYm9yZGVyQm94V2lkdGgoKSwgbWFyZ2luQm94SGVpZ2h0IH0pOwotICAg
ICAgICAgICAgYXRvbWljSW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUoYXNjZW50KTsKLSAgICAg
ICAgICAgIGF0b21pY0lubGluZUxldmVsQm94LnNldExheW91dEJvdW5kcyhMaW5lQm94OjpJbmxp
bmVMZXZlbEJveDo6TGF5b3V0Qm91bmRzIHsgYXNjZW50LCBtYXJnaW5Cb3hIZWlnaHQgLSBhc2Nl
bnQgfSk7Ci0gICAgICAgICAgICBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNhbGx5SWZBcHBsaWNhYmxl
KGF0b21pY0lubGluZUxldmVsQm94LCBpbmxpbmVMZXZlbEJveEdlb21ldHJ5KTsKLSAgICAgICAg
ICAgIGxpbmVCb3guYWRkSW5saW5lTGV2ZWxCb3goV1RGTW92ZShhdG9taWNJbmxpbmVMZXZlbEJv
eCkpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJ1bi5p
c0lubGluZUJveFN0YXJ0KCkpIHsKLSAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgZG9u
J3Qga25vdyB5ZXQgaG93IHdpZGUgdGhpcyBpbmxpbmUgYm94IGlzLiBMZXQncyBhc3N1bWUgaXQn
cyBhcyBsb25nIGFzIHRoZSBsaW5lIGlzCi0gICAgICAgICAgICAvLyBhbmQgYWRqdXN0IGl0IGxh
dGVyIGlmIHdlIGNvbWUgYWNyb3NzIGFuIGlubGluZUJveEVuZCBydW4gKHNlZSBiZWxvdykuCi0g
ICAgICAgICAgICBhdXRvIGluaXRpYWxMb2dpY2FsV2lkdGggPSBsaW5lQm94LmNvbnRlbnRMb2dp
Y2FsV2lkdGgoKSAtIHJ1bi5sb2dpY2FsTGVmdCgpOwotICAgICAgICAgICAgQVNTRVJUKGluaXRp
YWxMb2dpY2FsV2lkdGggPj0gMCk7Ci0gICAgICAgICAgICAvLyBJbmxpbmUgYm94IHJ1biBpcyBi
YXNlZCBvbiBtYXJnaW4gYm94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBib3guCi0gICAg
ICAgICAgICBhdXRvIG1hcmdpblN0YXJ0ID0gc3RkOjptYXgoMF9sdSwgZm9ybWF0dGluZ0NvbnRl
eHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpLm1hcmdpblN0YXJ0KCkpOwotICAgICAgICAg
ICAgbG9naWNhbExlZnQgKz0gbWFyZ2luU3RhcnQ7Ci0gICAgICAgICAgICBpbml0aWFsTG9naWNh
bFdpZHRoIC09IG1hcmdpblN0YXJ0OwotICAgICAgICAgICAgYXV0byBpbmxpbmVCb3ggPSBMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlSW5saW5lQm94KGxheW91dEJveCwgbG9naWNhbExl
ZnQsIGluaXRpYWxMb2dpY2FsV2lkdGgpOwotICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRy
eUZvcklubGluZUJveChpbmxpbmVCb3gpOwotICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVy
dGljYWxseUlmQXBwbGljYWJsZShpbmxpbmVCb3gsIHsgfSk7Ci0gICAgICAgICAgICBsaW5lQm94
LmFkZElubGluZUxldmVsQm94KFdURk1vdmUoaW5saW5lQm94KSk7Ci0gICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94RW5kKCkpIHsKLSAg
ICAgICAgICAgIC8vIEFkanVzdCB0aGUgbG9naWNhbCB3aWR0aCB3aGVuIHRoZSBpbmxpbmUgYm94
IGNsb3NlcyBvbiB0aGlzIGxpbmUuCi0gICAgICAgICAgICBhdXRvJiBpbmxpbmVCb3ggPSBsaW5l
Qm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0gICAgICAgICAgICBB
U1NFUlQoaW5saW5lQm94LmlzSW5saW5lQm94KCkpOwotICAgICAgICAgICAgLy8gSW5saW5lIGJv
eCBydW4gaXMgYmFzZWQgb24gbWFyZ2luIGJveC4gTGV0J3MgY29udmVydCBpdCB0byBib3JkZXIg
Ym94LgotICAgICAgICAgICAgYXV0byBtYXJnaW5FbmQgPSBzdGQ6Om1heCgwX2x1LCBmb3JtYXR0
aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCkubWFyZ2luRW5kKCkpOwotICAg
ICAgICAgICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmlnaHQgPSBsb2dpY2FsTGVmdCArIHJ1bi5s
b2dpY2FsV2lkdGgoKSAtIG1hcmdpbkVuZDsKLSAgICAgICAgICAgIGlubGluZUJveC5zZXRMb2dp
Y2FsV2lkdGgoaW5saW5lQm94TG9naWNhbFJpZ2h0IC0gaW5saW5lQm94LmxvZ2ljYWxMZWZ0KCkp
OwotICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGljYWJsZShpbmxp
bmVCb3gsIHsgfSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBp
ZiAocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc1NvZnRMaW5lQnJlYWsoKSkgewotICAgICAgICAgICAg
Ly8gRklYTUU6IEFkanVzdCBub24tZW1wdHkgaW5saW5lIGJveCBoZWlnaHQgd2hlbiBnbHlwaHMg
ZnJvbSB0aGUgbm9uLXByaW1hcnkgZm9udCBzdHJldGNoIHRoZSBib3guCi0gICAgICAgICAgICBs
aW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSkuc2V0
SGFzQ29udGVudCgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAg
aWYgKHJ1bi5pc0hhcmRMaW5lQnJlYWsoKSkgewotICAgICAgICAgICAgYXV0byBsaW5lQnJlYWtC
b3ggPSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlTGluZUJyZWFrQm94KGxheW91dEJv
eCwgbG9naWNhbExlZnQpOwotICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRyeUZvcklubGlu
ZUJveChsaW5lQnJlYWtCb3gpOwotICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxs
eUlmQXBwbGljYWJsZShsaW5lQnJlYWtCb3gsIHsgfSk7Ci0gICAgICAgICAgICBsaW5lQm94LmFk
ZElubGluZUxldmVsQm94KFdURk1vdmUobGluZUJyZWFrQm94KSk7Ci0gICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHko
KSkgewotICAgICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChMaW5lQm94OjpJbmxp
bmVMZXZlbEJveDo6Y3JlYXRlR2VuZXJpY0lubGluZUxldmVsQm94KGxheW91dEJveCwgbG9naWNh
bExlZnQpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOwotICAgIH0KLQotICAgIGxpbmVCb3guc2V0SGFzQ29udGVudChsaW5l
SGFzQ29udGVudCk7Ci0gICAgaWYgKHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5pc0VuYWJs
ZWQoKSB8fCAhbGluZUhhc0NvbnRlbnQpIHsKLSAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBi
ZSBhYmxlIHRvIGV4ZXJjaXNlIHRoZSBmYXN0IHBhdGggd2hlbiB0aGUgbGluZSBoYXMgbm8gY29u
dGVudCBhdCBhbGwsIGV2ZW4gaW4gbm9uLXN0YW5kYXJkcyBtb2RlIG9yIHdpdGggbGluZS1oZWln
aHQgc2V0LgotICAgICAgICByb290SW5saW5lQm94LnNldExvZ2ljYWxUb3AobGluZUhhc0NvbnRl
bnQgPyBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQucm9vdElubGluZUJveExvZ2ljYWxUb3Ao
KSA6IC1yb290SW5saW5lQm94LmJhc2VsaW5lKCkpOwotICAgICAgICBsaW5lQm94LnNldExvZ2lj
YWxIZWlnaHQobGluZUhhc0NvbnRlbnQgPyBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQubGlu
ZUJveEhlaWdodCgpIDogSW5saW5lTGF5b3V0VW5pdCgpKTsKLSAgICB9IGVsc2UKLSAgICAgICAg
Y29tcHV0ZUxpbmVCb3hIZWlnaHRBbmRBbGlnbklubGluZUxldmVsQm94ZXNWZXJ0aWNhbGx5KGxp
bmVCb3gpOwotfQotCi12b2lkIExpbmVCb3hCdWlsZGVyOjpjb21wdXRlTGluZUJveEhlaWdodEFu
ZEFsaWduSW5saW5lTGV2ZWxCb3hlc1ZlcnRpY2FsbHkoTGluZUJveCYgbGluZUJveCkKLXsKLSAg
ICBBU1NFUlQobGluZUJveC5oYXNDb250ZW50KCkpOwotICAgIC8vIFRoaXMgZnVuY3Rpb24gKHBh
cnRpYWxseSkgaW1wbGVtZW50czoKLSAgICAvLyAyLjIuIExheW91dCBXaXRoaW4gTGluZSBCb3hl
cwotICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xpbmUtbGF5b3V0
Ci0gICAgLy8gMS4gQ29tcHV0ZSB0aGUgbGluZSBib3ggaGVpZ2h0IHVzaW5nIHRoZSBsYXlvdXQg
Ym91bmRzIGdlb21ldHJ5LiBUaGlzIGhlaWdodCBjb21wdXRhdGlvbiBzdHJpY3RseSB1c2VzIGxh
eW91dCBib3VuZHMgYW5kIG5vdCBub3JtYWwgaW5saW5lIGxldmVsIGJveCBnZW9tZXRyaWVzLgot
ICAgIC8vIDIuIENvbXB1dGUgdGhlIGJhc2VsaW5lL2xvZ2ljYWwgdG9wIHBvc2l0aW9uIG9mIHRo
ZSByb290IGlubGluZSBib3guIEFsaWduZWQgYm94ZXMgcHVzaCB0aGUgcm9vdCBpbmxpbmUgYm94
IGFyb3VuZCBpbnNpZGUgdGhlIGxpbmUgYm94LgotICAgIC8vIDMuIEZpbmFsbHkgYWxpZ24gdGhl
IGlubGluZSBsZXZlbCBib3hlcyB1c2luZyAobW9zdGx5KSBub3JtYWwgaW5saW5lIGxldmVsIGJv
eCBnZW9tZXRyaWVzLgotICAgIGF1dG8gcXVpcmtzID0gZm9ybWF0dGluZ0NvbnRleHQoKS5xdWly
a3MoKTsKLSAgICBhdXRvJiByb290SW5saW5lQm94ID0gbGluZUJveC5yb290SW5saW5lQm94KCk7
Ci0KLSAgICBhdXRvIGNvbXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCA9IFsmXSB7Ci0gICAgICAg
IC8vIExpbmUgYm94IGhlaWdodCBjb21wdXRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgbGF5b3V0IGJv
dW5kcyBvZiB0aGUgaW5saW5lIGJveGVzIGFuZCBub3QgdGhlaXIgbG9naWNhbCAoYXNjZW50L2Rl
c2NlbnQpIGRpbWVuc2lvbnMuCi0gICAgICAgIHN0cnVjdCBBYnNvbHV0ZVRvcEFuZEJvdHRvbSB7
Ci0gICAgICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHRvcCB7IDAgfTsKLSAgICAgICAgICAgIElu
bGluZUxheW91dFVuaXQgYm90dG9tIHsgMCB9OwotICAgICAgICB9OwotICAgICAgICBIYXNoTWFw
PGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94KiwgQWJzb2x1dGVUb3BBbmRCb3R0b20+IGlu
bGluZUxldmVsQm94QWJzb2x1dGVUb3BBbmRCb3R0b21NYXA7Ci0KLSAgICAgICAgYXV0byBtaW5p
bXVtTG9naWNhbFRvcCA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKLSAgICAgICAg
YXV0byBtYXhpbXVtTG9naWNhbEJvdHRvbSA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsg
fTsKLSAgICAgICAgaWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KHJvb3RJ
bmxpbmVCb3gsIGxpbmVCb3gpKSB7Ci0gICAgICAgICAgICBtaW5pbXVtTG9naWNhbFRvcCA9IElu
bGluZUxheW91dFVuaXQgeyB9OwotICAgICAgICAgICAgbWF4aW11bUxvZ2ljYWxCb3R0b20gPSBy
b290SW5saW5lQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpOwotICAgICAgICAgICAgaW5saW5l
TGV2ZWxCb3hBYnNvbHV0ZVRvcEFuZEJvdHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVCb3gsIEFic29s
dXRlVG9wQW5kQm90dG9tIHsgKm1pbmltdW1Mb2dpY2FsVG9wLCAqbWF4aW11bUxvZ2ljYWxCb3R0
b20gfSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaW5saW5lTGV2ZWxCb3hBYnNvbHV0
ZVRvcEFuZEJvdHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVCb3gsIEFic29sdXRlVG9wQW5kQm90dG9t
IHsgfSk7Ci0KLSAgICAgICAgVmVjdG9yPExpbmVCb3g6OklubGluZUxldmVsQm94Kj4gbGluZUJv
eFJlbGF0aXZlSW5saW5lTGV2ZWxCb3hlczsKLSAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZl
bEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgewotICAgICAgICAgICAg
YXV0byYgbGF5b3V0Qm94ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7Ci0gICAgICAgICAg
ICBpZiAoaW5saW5lTGV2ZWxCb3guaGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpIHsKLSAg
ICAgICAgICAgICAgICBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveGVzLmFwcGVuZCgmaW5s
aW5lTGV2ZWxCb3gpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgYXV0byYgcGFyZW50SW5saW5lQm94ID0gbGluZUJveC5pbmxpbmVMZXZlbEJv
eEZvckxheW91dEJveChsYXlvdXRCb3gucGFyZW50KCkpOwotICAgICAgICAgICAgLy8gTG9naWNh
bCB0b3AgaXMgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBpbmxpbmUgYm94J3MgbGF5b3V0IGJvdW5k
cy4KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGxvZ2ljYWwgdG9wIGlzIG5vdCB0aGUg
ZmluYWwgbG9naWNhbCB0b3Agb2YgdGhlIGlubGluZSBsZXZlbCBib3guCi0gICAgICAgICAgICAv
LyBUaGlzIGlzIHRoZSBsb2dpY2FsIHRvcCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbGF5b3V0IGJv
dW5kcyBnZW9tZXRyeSB3aGljaCBtYXkgYmUgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgaW5saW5l
IGJveCdzIG5vcm1hbCBnZW9tZXRyeS4KLSAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcCA9IElu
bGluZUxheW91dFVuaXQgeyB9OwotICAgICAgICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52
ZXJ0aWNhbEFsaWduKCkpIHsKLSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxp
bmU6IHsKLSAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFz
ZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0gICAgICAgICAg
ICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQg
LSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRk
bGU6IHsKLSAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFz
ZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSAvIDIgKyBwYXJl
bnRJbmxpbmVCb3guc3R5bGUoKS5mb250TWV0cmljcygpLnhIZWlnaHQoKSAvIDI7Ci0gICAgICAg
ICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2Nl
bnQgLSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpC
YXNlbGluZU1pZGRsZTogewotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgp
IC8gMjsKLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmxheW91
dEJvdW5kcygpLmFzY2VudCAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7Ci0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246Okxlbmd0aDogewotICAgICAgICAgICAgICAgIGF1dG8mIHN0eWxlID0gaW5s
aW5lTGV2ZWxCb3guc3R5bGUoKTsKLSAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZz
ZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBmbG9hdFZhbHVlRm9yTGVuZ3RoKHN0eWxlLnZlcnRpY2Fs
QWxpZ25MZW5ndGgoKSwgc3R5bGUuY29tcHV0ZWRMaW5lSGVpZ2h0KCkpICsgaW5saW5lTGV2ZWxC
b3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OwotICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBw
YXJlbnRJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VGV4dFRvcDogewotICAgICAgICAgICAg
ICAgIC8vIE5vdGUgdGhhdCB0ZXh0LXRvcCBhbGlnbnMgd2l0aCB0aGUgaW5saW5lIGJveCdzIGZv
bnQgbWV0cmljcyB0b3AgKGFzY2VudCkgYW5kIG5vdCB0aGUgbGF5b3V0IGJvdW5kcyB0b3AuCi0g
ICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMo
KS5hc2NlbnQgLSBwYXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKTsKLSAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VGV4
dEJvdHRvbTogewotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0ZXh0LWJvdHRvbSBhbGln
bnMgd2l0aCB0aGUgaW5saW5lIGJveCdzIGZvbnQgbWV0cmljcyBib3R0b20gKGRlc2NlbnQpIGFu
ZCBub3QgdGhlIGxheW91dCBib3VuZHMgYm90dG9tLgotICAgICAgICAgICAgICAgIGF1dG8gcGFy
ZW50SW5saW5lQm94TGF5b3V0Qm91bmRzID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5kcygp
OwotICAgICAgICAgICAgICAgIGF1dG8gcGFyZW50SW5saW5lQm94TG9naWNhbEJvdHRvbSA9IHBh
cmVudElubGluZUJveExheW91dEJvdW5kcy5oZWlnaHQoKSAtIHBhcmVudElubGluZUJveExheW91
dEJvdW5kcy5kZXNjZW50ICsgcGFyZW50SW5saW5lQm94LmRlc2NlbnQoKS52YWx1ZU9yKElubGlu
ZUxheW91dFVuaXQoKSk7Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGlu
ZUJveExvZ2ljYWxCb3R0b20gLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQo
KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRl
ZmF1bHQ6Ci0gICAgICAgICAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKLSAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dG8gcGFy
ZW50SW5saW5lQm94QWJzb2x1dGVUb3BBbmRCb3R0b20gPSBpbmxpbmVMZXZlbEJveEFic29sdXRl
VG9wQW5kQm90dG9tTWFwLmdldCgmcGFyZW50SW5saW5lQm94KTsKLSAgICAgICAgICAgIGF1dG8g
YWJzb2x1dGVMb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94QWJzb2x1dGVUb3BBbmRCb3R0b20u
dG9wICsgbG9naWNhbFRvcDsKLSAgICAgICAgICAgIGF1dG8gYWJzb2x1dGVMb2dpY2FsQm90dG9t
ID0gYWJzb2x1dGVMb2dpY2FsVG9wICsgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVp
Z2h0KCk7Ci0gICAgICAgICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9wQW5kQm90dG9tTWFw
LmFkZCgmaW5saW5lTGV2ZWxCb3gsIEFic29sdXRlVG9wQW5kQm90dG9tIHsgYWJzb2x1dGVMb2dp
Y2FsVG9wLCBhYnNvbHV0ZUxvZ2ljYWxCb3R0b20gfSk7Ci0gICAgICAgICAgICAvLyBTdHJldGNo
IHRoZSBtaW4vbWF4IGFic29sdXRlIHZhbHVlcyBpZiBhcHBsaWNhYmxlLgotICAgICAgICAgICAg
aWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGlubGluZUxldmVsQm94LCBs
aW5lQm94KSkgewotICAgICAgICAgICAgICAgIG1pbmltdW1Mb2dpY2FsVG9wID0gc3RkOjptaW4o
bWluaW11bUxvZ2ljYWxUb3AudmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxUb3ApLCBhYnNvbHV0ZUxv
Z2ljYWxUb3ApOwotICAgICAgICAgICAgICAgIG1heGltdW1Mb2dpY2FsQm90dG9tID0gc3RkOjpt
YXgobWF4aW11bUxvZ2ljYWxCb3R0b20udmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxCb3R0b20pLCBh
YnNvbHV0ZUxvZ2ljYWxCb3R0b20pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAg
IC8vIFRoZSBsaW5lIGJveCBoZWlnaHQgY29tcHV0YXRpb24gaXMgYXMgZm9sbG93czoKLSAgICAg
ICAgLy8gMS4gU3RyZXRjaCB0aGUgbGluZSBib3ggd2l0aCB0aGUgbm9uLWxpbmUtYm94IHJlbGF0
aXZlIGFsaWduZWQgaW5saW5lIGJveCBhYnNvbHV0ZSB0b3AgYW5kIGJvdHRvbSB2YWx1ZXMuCi0g
ICAgICAgIC8vIDIuIENoZWNrIGlmIHRoZSBsaW5lIGJveCByZWxhdGl2ZSBhbGlnbmVkIGlubGlu
ZSBib3hlcyAodG9wLCBib3R0b20gZXRjKSBoYXZlIGVub3VnaCByb29tIGFuZCBzdHJldGNoIHRo
ZSBsaW5lIGJveCBmdXJ0aGVyIGlmIG5lZWRlZC4KLSAgICAgICAgYXV0byBsaW5lQm94TG9naWNh
bEhlaWdodCA9IG1heGltdW1Mb2dpY2FsQm90dG9tLnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCgp
KSAtIG1pbmltdW1Mb2dpY2FsVG9wLnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCgpKTsKLSAgICAg
ICAgZm9yIChhdXRvKiBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveCA6IGxpbmVCb3hSZWxh
dGl2ZUlubGluZUxldmVsQm94ZXMpIHsKLSAgICAgICAgICAgIGlmICghcXVpcmtzLmlubGluZUxl
dmVsQm94QWZmZWN0c0xpbmVCb3goKmxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94LCBsaW5l
Qm94KSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGxpbmVCb3hMb2dp
Y2FsSGVpZ2h0ID0gc3RkOjptYXgobGluZUJveExvZ2ljYWxIZWlnaHQsIGxpbmVCb3hSZWxhdGl2
ZUlubGluZUxldmVsQm94LT5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAg
ICAgICAgbGluZUJveC5zZXRMb2dpY2FsSGVpZ2h0KGxpbmVCb3hMb2dpY2FsSGVpZ2h0KTsKLSAg
ICB9OwotICAgIGNvbXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCgpOwotCi0gICAgYXV0byBjb21w
dXRlUm9vdElubGluZUJveFZlcnRpY2FsUG9zaXRpb24gPSBbJl0gewotICAgICAgICBIYXNoTWFw
PGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94KiwgSW5saW5lTGF5b3V0VW5pdD4gaW5saW5l
TGV2ZWxCb3hBYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0TWFwOwotICAgICAgICBpbmxpbmVMZXZlbEJv
eEFic29sdXRlQmFzZWxpbmVPZmZzZXRNYXAuYWRkKCZyb290SW5saW5lQm94LCBJbmxpbmVMYXlv
dXRVbml0IHsgfSk7Ci0KLSAgICAgICAgYXV0byBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxp
bmVCb3hCYXNlbGluZSA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKLSAgICAgICAg
aWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KHJvb3RJbmxpbmVCb3gsIGxp
bmVCb3gpKQotICAgICAgICAgICAgbWF4aW11bVRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFz
ZWxpbmUgPSByb290SW5saW5lQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKLQotICAgICAgICBm
b3IgKGF1dG8mIGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hl
cygpKSB7Ci0gICAgICAgICAgICBhdXRvIGFic29sdXRlQmFzZWxpbmVPZmZzZXQgPSBJbmxpbmVM
YXlvdXRVbml0IHsgfTsKLSAgICAgICAgICAgIGlmICghaW5saW5lTGV2ZWxCb3guaGFzTGluZUJv
eFJlbGF0aXZlQWxpZ25tZW50KCkpIHsKLSAgICAgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3gg
PSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKLSAgICAgICAgICAgICAgICBhdXRvJiBwYXJl
bnRJbmxpbmVCb3ggPSBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJv
eC5wYXJlbnQoKSk7Ci0gICAgICAgICAgICAgICAgYXV0byBiYXNlbGluZU9mZnNldEZyb21QYXJl
bnRCYXNlbGluZSA9IElubGluZUxheW91dFVuaXQgeyB9OwotCi0gICAgICAgICAgICAgICAgc3dp
dGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKLSAgICAgICAgICAgICAgICBj
YXNlIFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lOgotICAgICAgICAgICAgICAgICAgICBiYXNlbGlu
ZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHsgfTsKLSAgICAgICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6IHsKLSAgICAg
ICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0g
KGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpIC8gMiArIHBhcmVudElubGlu
ZUJveC5zdHlsZSgpLmZvbnRNZXRyaWNzKCkueEhlaWdodCgpIC8gMik7Ci0gICAgICAgICAgICAg
ICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gbG9naWNhbFRvcE9mZnNl
dEZyb21QYXJlbnRCYXNlbGluZSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2Vu
dDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmVNaWRkbGU6IHsKLSAgICAgICAg
ICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCkgLyAyOwotICAgICAgICAgICAgICAg
ICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxUb3BPZmZzZXRG
cm9tUGFyZW50QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7
Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Okxlbmd0aDogewotICAgICAgICAgICAgICAgICAg
ICBhdXRvJiBzdHlsZSA9IGlubGluZUxldmVsQm94LnN0eWxlKCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGF1dG8gdmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5ndGgoc3R5bGUu
dmVydGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKSk7Ci0gICAg
ICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9
IHZlcnRpY2FsQWxpZ25PZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOwotICAgICAg
ICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxU
b3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOwot
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpUZXh0VG9wOgotICAgICAgICAgICAgICAgICAgICBi
YXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHBhcmVudElubGluZUJveC5iYXNlbGlu
ZSgpIC0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OwotICAgICAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRC
b3R0b206Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2Vs
aW5lID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtICpwYXJlbnRJbmxp
bmVCb3guZGVzY2VudCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVE
X1lFVCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgYWJzb2x1dGVCYXNlbGluZU9mZnNldCA9IGlubGluZUxldmVsQm94QWJz
b2x1dGVCYXNlbGluZU9mZnNldE1hcC5nZXQoJnBhcmVudElubGluZUJveCkgKyBiYXNlbGluZU9m
ZnNldEZyb21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKLSAgICAgICAg
ICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRvcDogewotICAgICAgICAgICAgICAgICAgICBh
YnNvbHV0ZUJhc2VsaW5lT2Zmc2V0ID0gcm9vdElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2Nl
bnQgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0gICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246OkJvdHRvbTogewotICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUJhc2Vs
aW5lT2Zmc2V0ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtIHJvb3RJ
bmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAg
ICAgICAgICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci0gICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGlubGluZUxldmVsQm94QWJzb2x1dGVCYXNlbGluZU9mZnNldE1hcC5hZGQoJmlubGluZUxl
dmVsQm94LCBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0KTsKLSAgICAgICAgICAgIGF1dG8gYWZmZWN0
c1Jvb3RJbmxpbmVCb3hWZXJ0aWNhbFBvc2l0aW9uID0gcXVpcmtzLmlubGluZUxldmVsQm94QWZm
ZWN0c0xpbmVCb3goaW5saW5lTGV2ZWxCb3gsIGxpbmVCb3gpOwotICAgICAgICAgICAgaWYgKGFm
ZmVjdHNSb290SW5saW5lQm94VmVydGljYWxQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIGF1
dG8gdG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IGFic29sdXRlQmFzZWxpbmVP
ZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0gICAgICAgICAg
ICAgICAgaWYgKG1heGltdW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2VsaW5lKQotICAg
ICAgICAgICAgICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGlu
ZSA9IHN0ZDo6bWF4KCptYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSwg
dG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSk7Ci0gICAgICAgICAgICAgICAgZWxz
ZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpcyBxdWlyayBtb2RlIGFuZCB0aGUg
cm9vdCBpbmxpbmUgYm94IGhhcyBubyBjb250ZW50LiBUaGUgcm9vdCBpbmxpbmUgYm94J3MgYmFz
ZWxpbmUgaXMgYW5jaG9yZWQgYXQgMC4KLSAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBu
ZWdhdGl2ZSBhc2NlbnQgKGUuZyBuZWdhdGl2ZSB0b3AgbWFyZ2luKSBjYW4gInB1c2giIHRoZSBy
b290IGlubGluZSBib3ggdXB3YXJkcyBhbmQgaGF2ZSBhIG5lZ2F0aXZlIHZhbHVlLgotICAgICAg
ICAgICAgICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9
IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudCA+PSAwCi0gICAgICAgICAgICAg
ICAgICAgICAgICA/IHN0ZDo6bWF4KDAuMGYsIHRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFz
ZWxpbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHRvcE9mZnNldEZyb21Sb290SW5saW5l
Qm94QmFzZWxpbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgICAgIGF1dG8gcm9vdElubGluZUJveExvZ2ljYWxUb3AgPSBtYXhpbXVtVG9wT2Zmc2V0
RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZS52YWx1ZU9yKDAuZikgLSByb290SW5saW5lQm94LmJh
c2VsaW5lKCk7Ci0gICAgICAgIHJvb3RJbmxpbmVCb3guc2V0TG9naWNhbFRvcChyb290SW5saW5l
Qm94TG9naWNhbFRvcCk7Ci0gICAgfTsKLSAgICBjb21wdXRlUm9vdElubGluZUJveFZlcnRpY2Fs
UG9zaXRpb24oKTsKLQotICAgIGF1dG8gYWxpZ25JbmxpbmVMZXZlbEJveGVzID0gWyZdIHsKLSAg
ICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxl
dmVsQm94ZXMoKSkgewotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5saW5lTGV2ZWxC
b3gubGF5b3V0Qm94KCk7Ci0gICAgICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVCb3ggPSBsaW5l
Qm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSk7Ci0gICAg
ICAgICAgICBhdXRvIGxvZ2ljYWxUb3AgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAgICAgICAg
ICAgIHN3aXRjaCAoaW5saW5lTGV2ZWxCb3gudmVydGljYWxBbGlnbigpKSB7Ci0gICAgICAgICAg
ICBjYXNlIFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lOgotICAgICAgICAgICAgICAgIGxvZ2ljYWxU
b3AgPSBwYXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94LmJhc2VsaW5l
KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246Ok1pZGRsZTogewotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21Q
YXJlbnRCYXNlbGluZSA9IChpbmxpbmVMZXZlbEJveC5sb2dpY2FsSGVpZ2h0KCkgLyAyICsgcGFy
ZW50SW5saW5lQm94LnN0eWxlKCkuZm9udE1ldHJpY3MoKS54SGVpZ2h0KCkgLyAyKTsKLSAgICAg
ICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmJhc2VsaW5lKCkgLSBsb2dp
Y2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZU1p
ZGRsZTogewotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRC
YXNlbGluZSA9IGlubGluZUxldmVsQm94LmxvZ2ljYWxIZWlnaHQoKSAvIDI7Ci0gICAgICAgICAg
ICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gbG9naWNhbFRv
cE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6TGVuZ3RoOiB7Ci0gICAg
ICAgICAgICAgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVMZXZlbEJveC5zdHlsZSgpOwotICAgICAg
ICAgICAgICAgIGF1dG8gdmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5ndGgo
c3R5bGUudmVydGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKSk7
Ci0gICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5l
ID0gdmVydGljYWxBbGlnbk9mZnNldCArIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7Ci0gICAg
ICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gbG9n
aWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCAodGV4dCl0b3AvYm90dG9t
IGFsaWduIHRoZWlyIGxheW91dCBib3VuZHMuCi0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246OlRleHRUb3A6Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94
LmxheW91dEJvdW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7Ci0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRC
b3R0b206Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sb2dp
Y2FsSGVpZ2h0KCkgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5kZXNjZW50IC0gaW5s
aW5lTGV2ZWxCb3guYmFzZWxpbmUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VG9wOgotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhh
dCB0aGlzIGxvZ2ljYWwgdG9wIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGlubGluZSBi
b3guCi0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94LmxheW91dEJv
dW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7Ci0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJvdHRvbToKLSAgICAg
ICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBsb2dpY2FsIHRvcCBpcyBub3QgcmVsYXRpdmUg
dG8gdGhlIHBhcmVudCBpbmxpbmUgYm94LgotICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBs
aW5lQm94LmxvZ2ljYWxIZWlnaHQoKSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmRl
c2NlbnQgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOwotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExF
TUVOVEVEX1lFVCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChsb2dpY2FsVG9wKTsKLSAgICAg
ICAgfQotICAgIH07Ci0gICAgYWxpZ25JbmxpbmVMZXZlbEJveGVzKCk7Ci19Ci0KLUxpbmVCb3hC
dWlsZGVyOjpTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OlNpbXBsaWZpZWRWZXJ0aWNhbEFs
aWdubWVudChjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgcm9vdElubGluZUJveCkKLSAg
ICA6IG1fcm9vdElubGluZUJveChyb290SW5saW5lQm94KQotewotICAgIGFkanVzdChyb290SW5s
aW5lQm94KTsKLX0KLQotYm9vbCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmllZFZlcnRpY2FsQWxp
Z25tZW50OjpjYW5Vc2VTaW1wbGlmaWVkQWxpZ25tZW50KGNvbnN0IExpbmVCb3g6OklubGluZUxl
dmVsQm94JiByb290SW5saW5lQm94LCBjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgaW5s
aW5lTGV2ZWxCb3gsIE9wdGlvbmFsPGNvbnN0IEJveEdlb21ldHJ5PiBpbmxpbmVMZXZlbEJveEdl
b21ldHJ5KQotewotICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0F0b21pY0lubGluZUxldmVsQm94
KCkpIHsKLSAgICAgICAgQVNTRVJUKGlubGluZUxldmVsQm94R2VvbWV0cnkpOwotICAgICAgICAv
LyBCYXNlbGluZSBhbGlnbmVkLCBub24tc3RyZXRjaHkgZGlyZWN0IGNoaWxkcmVuIGFyZSBjb25z
aWRlcmVkIHRvIGJlIHNpbXBsZSBmb3Igbm93LgotICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBp
bmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKLSAgICAgICAgcmV0dXJuICZsYXlvdXRCb3gucGFy
ZW50KCkgPT0gJnJvb3RJbmxpbmVCb3gubGF5b3V0Qm94KCkKLSAgICAgICAgICAgICYmIGxheW91
dEJveC5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKSA9PSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZQot
ICAgICAgICAgICAgJiYgIWlubGluZUxldmVsQm94R2VvbWV0cnktPm1hcmdpbkJlZm9yZSgpCi0g
ICAgICAgICAgICAmJiAhaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQWZ0ZXIoKQotICAg
ICAgICAgICAgJiYgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQm94SGVpZ2h0KCkgPD0g
cm9vdElubGluZUJveC5iYXNlbGluZSgpOwotICAgIH0KLSAgICBpZiAoaW5saW5lTGV2ZWxCb3gu
aXNMaW5lQnJlYWtCb3goKSkgewotICAgICAgICAvLyBCYXNlbGluZSBhbGlnbmVkLCBub24tc3Ry
ZXRjaHkgbGluZSBicmVha3MgZS5nLiA8ZGl2PjxzcGFuPjxicj48L3NwYW4+PC9kaXY+IGJ1dCBu
b3QgPGRpdj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMDBweDsiPjxicj48L3NwYW4+PC9kaXY+
LgotICAgICAgICByZXR1cm4gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5bGUoKS52ZXJ0
aWNhbEFsaWduKCkgPT0gVmVydGljYWxBbGlnbjo6QmFzZWxpbmUgJiYgaW5saW5lTGV2ZWxCb3gu
YmFzZWxpbmUoKSA8PSByb290SW5saW5lQm94LmJhc2VsaW5lKCk7Ci0gICAgfQotICAgIGlmIChp
bmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpKSB7Ci0gICAgICAgIC8vIEJhc2VsaW5lIGFsaWdu
ZWQsIG5vbi1zdHJldGNoeSBpbmxpbmUgYm94ZXMgZS5nLiA8ZGl2PjxzcGFuPjwvc3Bhbj48L2Rp
dj4gYnV0IG5vdCA8ZGl2PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwMHB4OyI+PC9zcGFuPjwv
ZGl2Pi4KLSAgICAgICAgcmV0dXJuIGlubGluZUxldmVsQm94LmxheW91dEJveCgpLnN0eWxlKCku
dmVydGljYWxBbGlnbigpID09IFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lICYmIGlubGluZUxldmVs
Qm94LmxheW91dEJvdW5kcygpID09IHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCk7Ci0gICAg
fQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmll
ZFZlcnRpY2FsQWxpZ25tZW50OjphbGlnbihMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgaW5saW5l
TGV2ZWxCb3gpCi17Ci0gICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5saW5lTGV2ZWxC
b3goKSB8fCBpbmxpbmVMZXZlbEJveC5pc0xpbmVCcmVha0JveCgpIHx8IGlubGluZUxldmVsQm94
LmlzSW5saW5lQm94KCkpIHsKLSAgICAgICAgLy8gT25seSBiYXNlbGluZSBhbGlnbm1lbnQgZm9y
IG5vdy4KLSAgICAgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChtX3Jvb3RJbmxpbmVC
b3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCkpOwotICAgICAgICBhZGp1
c3QoaW5saW5lTGV2ZWxCb3gpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFTU0VSVF9O
T1RfSU1QTEVNRU5URURfWUVUKCk7Ci19Ci0KLXZvaWQgTGluZUJveEJ1aWxkZXI6OlNpbXBsaWZp
ZWRWZXJ0aWNhbEFsaWdubWVudDo6YWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94
JiBpbmxpbmVMZXZlbEJveCkKLXsKLSAgICBhdXRvIGxheW91dEJvdW5kc0xvZ2ljYWxUb3AgPSBt
X3Jvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gaW5saW5lTGV2ZWxCb3gubGF5
b3V0Qm91bmRzKCkuYXNjZW50OwotICAgIG1fbGluZUJveExvZ2ljYWxUb3AgPSBzdGQ6Om1pbiht
X2xpbmVCb3hMb2dpY2FsVG9wLCBsYXlvdXRCb3VuZHNMb2dpY2FsVG9wKTsKLSAgICBtX2xpbmVC
b3hMb2dpY2FsQm90dG9tID0gc3RkOjptYXgobV9saW5lQm94TG9naWNhbEJvdHRvbSwgbGF5b3V0
Qm91bmRzTG9naWNhbFRvcCArIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgp
KTsKLSAgICBtX3Jvb3RJbmxpbmVCb3hMb2dpY2FsVG9wID0gc3RkOjptYXgobV9yb290SW5saW5l
Qm94TG9naWNhbFRvcCwgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbV9y
b290SW5saW5lQm94LmJhc2VsaW5lKCkpOwotfQotCi1MaW5lQm94IElubGluZUZvcm1hdHRpbmdD
b250ZXh0OjpHZW9tZXRyeTo6bGluZUJveEZvckxpbmVDb250ZW50KGNvbnN0IExpbmVCdWlsZGVy
OjpMaW5lQ29udGVudCYgbGluZUNvbnRlbnQpCi17Ci0gICAgcmV0dXJuIExpbmVCb3hCdWlsZGVy
KGZvcm1hdHRpbmdDb250ZXh0KCkpLmJ1aWxkKGxpbmVDb250ZW50KTsKLX0KLQotSW5saW5lTGF5
b3V0VW5pdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmxvZ2ljYWxUb3BGb3JO
ZXh0TGluZShjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250ZW50LCBJbmxp
bmVMYXlvdXRVbml0IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIGNvbnN0IEZsb2F0aW5nQ29u
dGV4dCYgZmxvYXRpbmdDb250ZXh0KSBjb25zdAotewotICAgIC8vIE5vcm1hbGx5IHRoZSBuZXh0
IGxpbmUncyBsb2dpY2FsIHRvcCBpcyB0aGUgcHJldmlvdXMgbGluZSdzIGxvZ2ljYWwgYm90dG9t
LCBidXQgd2hlbiB0aGUgbGluZSBlbmRzCi0gICAgLy8gd2l0aCB0aGUgY2xlYXIgcHJvcGVydHkg
c2V0LCB0aGUgbmV4dCBsaW5lIG5lZWRzIHRvIGNsZWFyIHRoZSBleGlzdGluZyBmbG9hdHMuCi0g
ICAgaWYgKGxpbmVDb250ZW50LnJ1bnMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gcHJldmlv
dXNMaW5lTG9naWNhbEJvdHRvbTsKLSAgICBhdXRvJiBsYXN0UnVuTGF5b3V0Qm94ID0gbGluZUNv
bnRlbnQucnVucy5sYXN0KCkubGF5b3V0Qm94KCk7IAotICAgIGlmIChsYXN0UnVuTGF5b3V0Qm94
LnN0eWxlKCkuY2xlYXIoKSA9PSBDbGVhcjo6Tm9uZSkKLSAgICAgICAgcmV0dXJuIHByZXZpb3Vz
TGluZUxvZ2ljYWxCb3R0b207Ci0gICAgYXV0byBwb3NpdGlvbldpdGhDbGVhcmFuY2UgPSBmbG9h
dGluZ0NvbnRleHQudmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UobGFzdFJ1bkxheW91dEJv
eCk7Ci0gICAgaWYgKCFwb3NpdGlvbldpdGhDbGVhcmFuY2UpCi0gICAgICAgIHJldHVybiBwcmV2
aW91c0xpbmVMb2dpY2FsQm90dG9tOwotICAgIHJldHVybiBzdGQ6Om1heChwcmV2aW91c0xpbmVM
b2dpY2FsQm90dG9tLCBJbmxpbmVMYXlvdXRVbml0KHBvc2l0aW9uV2l0aENsZWFyYW5jZS0+cG9z
aXRpb24pKTsKLX0KLQotQ29udGVudFdpZHRoQW5kTWFyZ2luIElubGluZUZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeTo6aW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94
JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9y
aXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3Zl
cnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGZvcm1hdHRpbmdDb250ZXh0
Um9vdC5pc0luRmxvdygpKTsKLQotICAgIC8vIDEwLjMuMTAgJ0lubGluZS1ibG9jaycsIHJlcGxh
Y2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93Ci0KLSAgICAvLyBFeGFjdGx5IGFzIGlubGluZSBy
ZXBsYWNlZCBlbGVtZW50cy4KLSAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHRSb290LmlzUmVwbGFj
ZWRCb3goKSkKLSAgICAgICAgcmV0dXJuIGlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFy
Z2luKGRvd25jYXN0PFJlcGxhY2VkQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3QpLCBob3Jpem9u
dGFsQ29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOwotCi0gICAg
Ly8gMTAuMy45ICdJbmxpbmUtYmxvY2snLCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFs
IGZsb3cKLQotICAgIC8vIElmICd3aWR0aCcgaXMgJ2F1dG8nLCB0aGUgdXNlZCB2YWx1ZSBpcyB0
aGUgc2hyaW5rLXRvLWZpdCB3aWR0aCBhcyBmb3IgZmxvYXRpbmcgZWxlbWVudHMuCi0gICAgLy8g
QSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycgZm9yICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1y
aWdodCcgYmVjb21lcyBhIHVzZWQgdmFsdWUgb2YgJzAnLgotICAgIC8vICMxCi0gICAgYXV0byB3
aWR0aCA9IGNvbXB1dGVkVmFsdWUoZm9ybWF0dGluZ0NvbnRleHRSb290LnN0eWxlKCkubG9naWNh
bFdpZHRoKCksIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOwotICAgIGlmICgh
d2lkdGgpCi0gICAgICAgIHdpZHRoID0gc2hyaW5rVG9GaXRXaWR0aChmb3JtYXR0aW5nQ29udGV4
dFJvb3QsIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOwotCi0gICAgLy8gIzIK
LSAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhv
cml6b250YWxNYXJnaW4oZm9ybWF0dGluZ0NvbnRleHRSb290LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMpOwotCi0gICAgcmV0dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7ICp3aWR0aCwgeyBjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwX2x1KSwgY29tcHV0ZWRIb3Jpem9u
dGFsTWFyZ2luLmVuZC52YWx1ZU9yKDBfbHUpIH0gfTsKLX0KLQotQ29udGVudEhlaWdodEFuZE1h
cmdpbiBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmlubGluZUJsb2NrQ29udGVu
dEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNh
bFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAgIEFTU0VSVChs
YXlvdXRCb3guaXNJbkZsb3coKSk7Ci0KLSAgICAvLyAxMC42LjIgSW5saW5lIHJlcGxhY2VkIGVs
ZW1lbnRzLCBibG9jay1sZXZlbCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdywgJ2lu
bGluZS1ibG9jaycgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZsb2F0aW5n
IHJlcGxhY2VkIGVsZW1lbnRzCi0gICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0g
ICAgICAgIHJldHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oZG93bmNh
c3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBv
dmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwotCi0gICAgLy8gMTAuNi42IENvbXBsaWNhdGVkIGNh
c2VzCi0gICAgLy8gLSAnSW5saW5lLWJsb2NrJywgbm9uLXJlcGxhY2VkIGVsZW1lbnRzLgotICAg
IHJldHVybiBjb21wbGljYXRlZENhc2VzKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
LCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0
dGluZ0NvbnRleHRRdWlya3MuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1h
dHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCA5MWJlNjVkYWQ1Y2M1ZjU2YjI5ZWIwNzAzZTZjZGM5NDM5MGFjMmE3Li4w
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtz
LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1
ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNp
ZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkxheW91dEJv
eEdlb21ldHJ5LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewot
Ci1JbmxpbmVMYXlvdXRVbml0IElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OmluaXRp
YWxMaW5lSGVpZ2h0KCkgY29uc3QKLXsKLSAgICAvLyBOZWdhdGl2ZSBsaW5lSGVpZ2h0IHZhbHVl
IG1lYW5zIHRoZSBsaW5lLWhlaWdodCBpcyBub3Qgc2V0Ci0gICAgYXV0byYgcm9vdCA9IGZvcm1h
dHRpbmdDb250ZXh0KCkucm9vdCgpOwotICAgIGlmIChsYXlvdXRTdGF0ZSgpLmluU3RhbmRhcmRz
TW9kZSgpIHx8ICFyb290LnN0eWxlKCkubGluZUhlaWdodCgpLmlzTmVnYXRpdmUoKSkKLSAgICAg
ICAgcmV0dXJuIHJvb3Quc3R5bGUoKS5jb21wdXRlZExpbmVIZWlnaHQoKTsKLSAgICByZXR1cm4g
cm9vdC5zdHlsZSgpLmZvbnRNZXRyaWNzKCkuZmxvYXRIZWlnaHQoKTsKLX0KLQotYm9vbCBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjppbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94
KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiBpbmxpbmVMZXZlbEJveCwgY29uc3QgTGlu
ZUJveCYgbGluZUJveCkgY29uc3QKLXsKLSAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNMaW5lQnJl
YWtCb3goKSkgewotICAgICAgICBpZiAobGF5b3V0U3RhdGUoKS5pblN0YW5kYXJkc01vZGUoKSkK
LSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAvLyBJbiBxdWlya3MgbW9kZSBsaW5l
YnJlYWsgYm94ZXMgKDxicj4pIHN0b3AgYWZmZWN0aW5nIHRoZSBsaW5lIGJveCB3aGVuIChhc3N1
bWUgPGJyPiBpcyBuZXN0ZWQgZS5nLiA8c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMDBweCI+PGJy
Pjwvc3Bhbj4pCi0gICAgICAgIC8vIDEuIHRoZSByb290IGlubGluZSBib3ggaGFzIGNvbnRlbnQg
PGRpdj5jb250ZW50PGJyPi9kaXY+Ci0gICAgICAgIC8vIDIuIHRoZXJlJ3MgYXQgbGVhc3Qgb25l
IGF0b21pYyBpbmxpbmUgbGV2ZWwgYm94IG9uIHRoZSBsaW5lIGUuZyA8ZGl2PjxpbWc+PGJyPjwv
ZGl2PiBvciA8ZGl2PjxzcGFuPjxpbWc+PC9zcGFuPjxicj48L2Rpdj4KLSAgICAgICAgLy8gMy4g
dGhlcmUncyBhdCBsZWFzdCBvbmUgaW5saW5lIGJveCB3aXRoIGNvbnRlbnQgZS5nLiA8ZGl2Pjxz
cGFuPmNvbnRlbnQ8L3NwYW4+PGJyPjwvZGl2PgotICAgICAgICBpZiAobGluZUJveC5yb290SW5s
aW5lQm94KCkuaGFzQ29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICBpZiAobGluZUJveC5oYXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGVpdGhlciBoYXZlIG9ubHkg
dGhlIDxicj4gb24gdGhlIGxpbmUgb3IgaW5saW5lIGJveGVzIHdpdGggb3Igd2l0aG91dCBjb250
ZW50LgotICAgICAgICBhdXRvJiBpbmxpbmVMZXZlbEJveGVzID0gbGluZUJveC5ub25Sb290SW5s
aW5lTGV2ZWxCb3hlcygpOwotICAgICAgICBBU1NFUlQoIWlubGluZUxldmVsQm94ZXMuaXNFbXB0
eSgpKTsKLSAgICAgICAgaWYgKGlubGluZUxldmVsQm94ZXMuc2l6ZSgpID09IDEpCi0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxp
bmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgewotICAgICAgICAgICAgLy8gRmlsdGVy
IG91dCBlbXB0eSBpbmxpbmUgYm94ZXMgZS5nLiA8ZGl2PjxzcGFuPjwvc3Bhbj48c3Bhbj48L3Nw
YW4+PGJyPjwvZGl2PgotICAgICAgICAgICAgaWYgKGlubGluZUxldmVsQm94LmlzSW5saW5lQm94
KCkgJiYgaW5saW5lTGV2ZWxCb3guaGFzQ29udGVudCgpKQotICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYg
KGlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkpIHsKLSAgICAgICAgLy8gSW5saW5lIGJveGVz
IChlLmcuIHJvb3QgaW5saW5lIGJveCBvciA8c3Bhbj4pIGFmZmVjdHMgbGluZSBib3hlcyBlaXRo
ZXIgdGhyb3VnaCB0aGUgc3RydXQgb3IgYWN0dWFsIGNvbnRlbnQuCi0gICAgICAgIGF1dG8gaW5s
aW5lQm94SGFzSW1hZ2luYXJ5U3RydXQgPSBsYXlvdXRTdGF0ZSgpLmluU3RhbmRhcmRzTW9kZSgp
OwotICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3guaGFzQ29udGVudCgpIHx8IGlubGluZUJveEhh
c0ltYWdpbmFyeVN0cnV0KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChp
bmxpbmVMZXZlbEJveC5pc1Jvb3RJbmxpbmVCb3goKSkgewotICAgICAgICAgICAgYXV0byBzaG91
bGRSb290SW5saW5lQm94V2l0aE5vQ29udGVudFN0cmV0Y2hMaW5lQm94ID0gWyZdIHsKLSAgICAg
ICAgICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5bGUoKS5saW5lSGVp
Z2h0KCkuaXNOZWdhdGl2ZSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgICAgICAgICAgLy8gVGhlIHJvb3QgaW5saW5lIGJveCB3aXRoIG5vbi1pbml0aWFsIGxp
bmUgaGVpZ2h0IHZhbHVlIHN0cmV0Y2hlcyB0aGUgbGluZSBib3ggZXZlbiB3aGVuIHJvb3QgaGFz
IG5vIGNvbnRlbnQKLSAgICAgICAgICAgICAgICAvLyBidXQgdGhlcmUncyBhdCBsZWFzdCBvbmUg
aW5saW5lIGJveCB3aXRoIGNvbnRlbnQuCi0gICAgICAgICAgICAgICAgLy8gZS5nLiA8ZGl2IHN0
eWxlPSJsaW5lLWhlaWdodDogMTAwcHg7Ij48c3Bhbj5jb250ZW50PC9zcGFuPjwvZGl2PgotICAg
ICAgICAgICAgICAgIGlmICghbGluZUJveC5oYXNJbmxpbmVCb3goKSkKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byYgaW5saW5lTGV2
ZWxCb3ggOiBsaW5lQm94Lm5vblJvb3RJbmxpbmVMZXZlbEJveGVzKCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgaWYgKCFpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVMZXZl
bEJveC5oYXNDb250ZW50KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICAgICAgfTsKLSAgICAgICAgICAgIHJldHVybiBzaG91bGRSb290SW5saW5lQm94V2l0aE5vQ29u
dGVudFN0cmV0Y2hMaW5lQm94KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm9uLXJvb3QgaW5s
aW5lIGJveGVzIChlLmcuIDxzcGFuPikuCi0gICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9y
bWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3go
KSk7Ci0gICAgICAgIGlmIChib3hHZW9tZXRyeS5ob3Jpem9udGFsQm9yZGVyKCkgfHwgYm94R2Vv
bWV0cnkuaG9yaXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKSB7Ci0gICAgICAgICAgICAv
LyBIb3Jpem9udGFsIGJvcmRlciBhbmQgcGFkZGluZyBtYWtlIHRoZSBpbmxpbmUgYm94IHN0cmV0
Y2ggdGhlIGxpbmUgKGUuZy4gPHNwYW4gc3R5bGU9InBhZGRpbmc6IDEwcHg7Ij48L3NwYW4+KS4K
LSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9Ci0gICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5saW5lTGV2ZWxCb3go
KSkgewotICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCkp
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgLy8gV2hpbGUgaW4gcHJhY3RpY2Ug
d2hlbiB0aGUgbmVnYXRpdmUgdmVydGljYWwgbWFyZ2luIG1ha2VzIHRoZSBsYXlvdXQgYm91bmRz
IGVtcHR5IChlLmc6IGhlaWdodDogMTAwcHg7IG1hcmdpbi10b3A6IC0xMDBweDspLCBhbmQgdGhp
cyBpbmxpbmUKLSAgICAgICAgLy8gbGV2ZWwgYm94IGNvbnRyaWJ1dGVzIDBweCB0byB0aGUgbGlu
ZSBib3ggaGVpZ2h0LCBpdCBzdGlsbCBuZWVkcyB0byBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hp
bGUgY29tcHV0aW5nIGxpbmUgYm94IGdlb21ldHJpZXMuCi0gICAgICAgIGF1dG8mIGJveEdlb21l
dHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVMZXZlbEJveC5s
YXlvdXRCb3goKSk7Ci0gICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUoKSB8
fCBib3hHZW9tZXRyeS5tYXJnaW5BZnRlcigpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLWJvb2wgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6aGFzU29mdFdyYXBPcHBv
cnR1bml0eUF0SW1hZ2UoKSBjb25zdAotewotICAgIHJldHVybiAhZm9ybWF0dGluZ0NvbnRleHQo
KS5yb290KCkuaXNUYWJsZUNlbGwoKTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdT
dGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVG
b3JtYXR0aW5nU3RhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2I2Yzk1
YzE1NDVkNjQ1Y2RiZDRiMDU0NmFlYzE4NmNmM2NjZjVkLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSAr
MCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgot
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGlu
ZUZvcm1hdHRpbmdTdGF0ZS5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRF
WFQpCi0KLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3BhY2UgV2Vi
Q29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBM
KElubGluZUZvcm1hdHRpbmdTdGF0ZSk7Ci0KLUlubGluZUZvcm1hdHRpbmdTdGF0ZTo6SW5saW5l
Rm9ybWF0dGluZ1N0YXRlKFJlZjxGbG9hdGluZ1N0YXRlPiYmIGZsb2F0aW5nU3RhdGUsIExheW91
dFN0YXRlJiBsYXlvdXRTdGF0ZSkKLSAgICA6IEZvcm1hdHRpbmdTdGF0ZShXVEZNb3ZlKGZsb2F0
aW5nU3RhdGUpLCBUeXBlOjpJbmxpbmUsIGxheW91dFN0YXRlKQotewotfQotCi1JbmxpbmVGb3Jt
YXR0aW5nU3RhdGU6On5JbmxpbmVGb3JtYXR0aW5nU3RhdGUoKQotewotfQotCi19Ci19Ci0jZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUZvcm1hdHRpbmdTdGF0ZS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1h
dHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDM2M2IxNjAzNjg0ZTU5NDAwN2EwODI3YmM5NGNiOTdiNGJhMDE3NGYuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgKKysrIC9kZXYvbnVsbApA
QCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFy
ZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxF
KExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUu
aCIKLSNpbmNsdWRlICJJbmxpbmVJdGVtLmgiCi0jaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgot
I2luY2x1ZGUgIklubGluZUxpbmVHZW9tZXRyeS5oIgotI2luY2x1ZGUgIklubGluZUxpbmVSdW4u
aCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi11c2luZyBJbmxpbmVJdGVtcyA9IFZlY3RvcjxJbmxpbmVJdGVt
PjsKLXVzaW5nIElubGluZUxpbmVzID0gVmVjdG9yPElubGluZUxpbmVHZW9tZXRyeT47Ci11c2lu
ZyBJbmxpbmVMaW5lQm94ZXMgPSBWZWN0b3I8TGluZUJveD47Ci11c2luZyBJbmxpbmVMaW5lUnVu
cyA9IFZlY3RvcjxMaW5lUnVuPjsKLQotLy8gSW5saW5lRm9ybWF0dGluZ1N0YXRlIGhvbGRzIHRo
ZSBzdGF0ZSBmb3IgYSBwYXJ0aWN1bGFyIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgdHJlZS4K
LWNsYXNzIElubGluZUZvcm1hdHRpbmdTdGF0ZSA6IHB1YmxpYyBGb3JtYXR0aW5nU3RhdGUgewot
ICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoSW5saW5lRm9ybWF0dGluZ1N0YXRlKTsKLXB1Ymxp
YzoKLSAgICBJbmxpbmVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91
dFN0YXRlJik7Ci0gICAgfklubGluZUZvcm1hdHRpbmdTdGF0ZSgpOwotCi0gICAgSW5saW5lSXRl
bXMmIGlubGluZUl0ZW1zKCkgeyByZXR1cm4gbV9pbmxpbmVJdGVtczsgfQotICAgIGNvbnN0IElu
bGluZUl0ZW1zJiBpbmxpbmVJdGVtcygpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lSXRlbXM7IH0K
LSAgICB2b2lkIGFkZElubGluZUl0ZW0oSW5saW5lSXRlbSYmIGlubGluZUl0ZW0pIHsgbV9pbmxp
bmVJdGVtcy5hcHBlbmQoV1RGTW92ZShpbmxpbmVJdGVtKSk7IH0KLQotICAgIGNvbnN0IElubGlu
ZUxpbmVzJiBsaW5lcygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZXM7IH0KLSAgICBJbmxpbmVMaW5l
cyYgbGluZXMoKSB7IHJldHVybiBtX2xpbmVzOyB9Ci0gICAgdm9pZCBhZGRMaW5lKGNvbnN0IElu
bGluZUxpbmVHZW9tZXRyeSYgbGluZSkgeyBtX2xpbmVzLmFwcGVuZChsaW5lKTsgfQotCi0gICAg
Y29uc3QgSW5saW5lTGluZUJveGVzJiBsaW5lQm94ZXMoKSBjb25zdCB7IHJldHVybiBtX2xpbmVC
b3hlczsgfQotICAgIHZvaWQgYWRkTGluZUJveChMaW5lQm94JiYgbGluZUJveCkgeyBtX2xpbmVC
b3hlcy5hcHBlbmQoV1RGTW92ZShsaW5lQm94KSk7IH0KLQotICAgIGNvbnN0IElubGluZUxpbmVS
dW5zJiBsaW5lUnVucygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZVJ1bnM7IH0KLSAgICBJbmxpbmVM
aW5lUnVucyYgbGluZVJ1bnMoKSB7IHJldHVybiBtX2xpbmVSdW5zOyB9Ci0gICAgdm9pZCBhZGRM
aW5lUnVuKExpbmVSdW4mJiBydW4pIHsgbV9saW5lUnVucy5hcHBlbmQoV1RGTW92ZShydW4pKTsg
fQotCi0gICAgdm9pZCBzZXRDbGVhckdhcEFmdGVyTGFzdExpbmUoSW5saW5lTGF5b3V0VW5pdCB2
ZXJ0aWNhbEdhcCk7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBjbGVhckdhcEFmdGVyTGFzdExpbmUo
KSBjb25zdCB7IHJldHVybiBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZTsgfQotCi0gICAgdm9pZCBj
bGVhckxpbmVBbmRSdW5zKCk7Ci0gICAgdm9pZCBzaHJpbmtUb0ZpdCgpOwotCi1wcml2YXRlOgot
ICAgIC8vIENhY2hlYWJsZSBpbnB1dCB0byBsaW5lIGxheW91dC4KLSAgICBJbmxpbmVJdGVtcyBt
X2lubGluZUl0ZW1zOwotICAgIElubGluZUxpbmVzIG1fbGluZXM7Ci0gICAgSW5saW5lTGluZUJv
eGVzIG1fbGluZUJveGVzOwotICAgIElubGluZUxpbmVSdW5zIG1fbGluZVJ1bnM7Ci0gICAgSW5s
aW5lTGF5b3V0VW5pdCBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZSB7IDAgfTsKLX07Ci0KLWlubGlu
ZSB2b2lkIElubGluZUZvcm1hdHRpbmdTdGF0ZTo6c2V0Q2xlYXJHYXBBZnRlckxhc3RMaW5lKElu
bGluZUxheW91dFVuaXQgdmVydGljYWxHYXApCi17Ci0gICAgQVNTRVJUKHZlcnRpY2FsR2FwID49
IDApOwotICAgIG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lID0gdmVydGljYWxHYXA7Ci19Ci0KLWlu
bGluZSB2b2lkIElubGluZUZvcm1hdHRpbmdTdGF0ZTo6Y2xlYXJMaW5lQW5kUnVucygpCi17Ci0g
ICAgbV9saW5lcy5jbGVhcigpOwotICAgIG1fbGluZUJveGVzLmNsZWFyKCk7Ci0gICAgbV9saW5l
UnVucy5jbGVhcigpOwotICAgIG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lID0geyB9OwotfQotCi1p
bmxpbmUgdm9pZCBJbmxpbmVGb3JtYXR0aW5nU3RhdGU6OnNocmlua1RvRml0KCkKLXsKLSAgICBt
X2lubGluZUl0ZW1zLnNocmlua1RvRml0KCk7Ci0gICAgbV9saW5lcy5zaHJpbmtUb0ZpdCgpOwot
ICAgIG1fbGluZUJveGVzLnNocmlua1RvRml0KCk7Ci0gICAgbV9saW5lUnVucy5zaHJpbmtUb0Zp
dCgpOwotfQotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJ
TkdfU1RBVEUoSW5saW5lRm9ybWF0dGluZ1N0YXRlLCBpc0lubGluZUZvcm1hdHRpbmdTdGF0ZSgp
KQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUl0ZW0uY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1h
dHRpbmcvSW5saW5lSXRlbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MDZm
MTg0OWI1YTlhNjE4NDlhMjBlYmQ0MTk2NWE2YWRkOGVjODYuLjAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZv
cm1hdHRpbmcvSW5saW5lSXRlbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0v
KgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
LSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGluZUl0ZW0uaCIK
LQotI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1B
VFRJTkdfQ09OVEVYVCkKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7
Ci0KLXN0cnVjdCBTYW1lU2l6ZUFzSW5saW5lSXRlbSB7Ci0gICAgdm9pZCogbGF5b3V0Qm94Owot
ICAgIHVpbnQ4X3QgZW51bTE7Ci0gICAgdWludDhfdCBlbnVtMjsKLSAgICBib29sIHdpZHRoQm9v
bDsKLSAgICBib29sIHNvZnRIeXBoZW5Cb29sOwotICAgIGJvb2wgaXNXb3JkU2VwYXJhdG9yOwot
ICAgIElubGluZUxheW91dFVuaXQgd2lkdGg7Ci0gICAgdW5zaWduZWQgc3RhcnQ7Ci0gICAgdW5z
aWduZWQgbGVuZ3RoOwotfTsKLQotc3RhdGljX2Fzc2VydChzaXplb2YoSW5saW5lSXRlbSkgPT0g
c2l6ZW9mKFNhbWVTaXplQXNJbmxpbmVJdGVtKSwgIiIpOwotCi19Ci19Ci0jZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUl0ZW0u
aCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUl0ZW0uaApk
ZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhZTI0YTYxMjY4NDU4ODc0YzcyMDk5NDM4
MmJhYjgyOTFkZGM0ZC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmgK
KysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
Ci0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNl
Ci0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkxh
eW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dFVuaXRzLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3Jl
IHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBJbmxpbmVJdGVtIHsKLXB1YmxpYzoKLSAg
ICBlbnVtIGNsYXNzIFR5cGUgOiB1aW50OF90IHsgVGV4dCwgSGFyZExpbmVCcmVhaywgU29mdExp
bmVCcmVhaywgV29yZEJyZWFrT3Bwb3J0dW5pdHksIEJveCwgRmxvYXQsIElubGluZUJveFN0YXJ0
LCBJbmxpbmVCb3hFbmQgfTsKLSAgICBJbmxpbmVJdGVtKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBU
eXBlKTsKLQotICAgIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQotICAgIGNv
bnN0IEJveCYgbGF5b3V0Qm94KCkgY29uc3QgeyByZXR1cm4gKm1fbGF5b3V0Qm94OyB9Ci0gICAg
Y29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbGF5b3V0Qm94KCkuc3R5
bGUoKTsgfQotCi0gICAgYm9vbCBpc1RleHQoKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0gVHlw
ZTo6VGV4dDsgfQotICAgIGJvb2wgaXNCb3goKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0gVHlw
ZTo6Qm94OyB9Ci0gICAgYm9vbCBpc0Zsb2F0KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5
cGU6OkZsb2F0OyB9Ci0gICAgYm9vbCBpc0xpbmVCcmVhaygpIGNvbnN0IHsgcmV0dXJuIGlzU29m
dExpbmVCcmVhaygpIHx8IGlzSGFyZExpbmVCcmVhaygpOyB9Ci0gICAgYm9vbCBpc1dvcmRCcmVh
a09wcG9ydHVuaXR5KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OldvcmRCcmVha09w
cG9ydHVuaXR5OyB9Ci0gICAgYm9vbCBpc1NvZnRMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiB0
eXBlKCkgPT0gVHlwZTo6U29mdExpbmVCcmVhazsgfQotICAgIGJvb2wgaXNIYXJkTGluZUJyZWFr
KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OkhhcmRMaW5lQnJlYWs7IH0KLSAgICBi
b29sIGlzSW5saW5lQm94U3RhcnQoKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0gVHlwZTo6SW5s
aW5lQm94U3RhcnQ7IH0KLSAgICBib29sIGlzSW5saW5lQm94RW5kKCkgY29uc3QgeyByZXR1cm4g
dHlwZSgpID09IFR5cGU6OklubGluZUJveEVuZDsgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IEJv
eCogbV9sYXlvdXRCb3ggeyBudWxscHRyIH07Ci0gICAgVHlwZSBtX3R5cGUgeyB9OwotCi1wcm90
ZWN0ZWQ6Ci0gICAgLy8gRm9yIElubGluZVRleHRJdGVtCi0gICAgZW51bSBjbGFzcyBUZXh0SXRl
bVR5cGUgIDogdWludDhfdCB7IFVuZGVmaW5lZCwgV2hpdGVzcGFjZSwgTm9uV2hpdGVzcGFjZSB9
OwotICAgIFRleHRJdGVtVHlwZSBtX3RleHRJdGVtVHlwZSB7IFRleHRJdGVtVHlwZTo6VW5kZWZp
bmVkIH07Ci0gICAgYm9vbCBtX2hhc1dpZHRoIHsgZmFsc2UgfTsKLSAgICBib29sIG1faGFzVHJh
aWxpbmdTb2Z0SHlwaGVuIHsgZmFsc2UgfTsKLSAgICBib29sIG1faXNXb3JkU2VwYXJhdG9yIHsg
ZmFsc2UgfTsKLSAgICBJbmxpbmVMYXlvdXRVbml0IG1fd2lkdGggeyB9OwotICAgIHVuc2lnbmVk
IG1fbGVuZ3RoIHsgMCB9OwotCi0gICAgLy8gRm9yIElubGluZVRleHRJdGVtIGFuZCBJbmxpbmVT
b2Z0TGluZUJyZWFrSXRlbQotICAgIHVuc2lnbmVkIG1fc3RhcnRPclBvc2l0aW9uIHsgMCB9Owot
fTsKLQotaW5saW5lIElubGluZUl0ZW06OklubGluZUl0ZW0oY29uc3QgQm94JiBsYXlvdXRCb3gs
IFR5cGUgdHlwZSkKLSAgICA6IG1fbGF5b3V0Qm94KCZsYXlvdXRCb3gpCi0gICAgLCBtX3R5cGUo
dHlwZSkKLXsKLX0KLQotI2RlZmluZSBTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0lOTElORV9JVEVN
KFRvVmFsdWVUeXBlTmFtZSwgcHJlZGljYXRlKSBcCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0JF
R0lOKFdlYkNvcmU6OkxheW91dDo6VG9WYWx1ZVR5cGVOYW1lKSBcCi0gICAgc3RhdGljIGJvb2wg
aXNUeXBlKGNvbnN0IFdlYkNvcmU6OkxheW91dDo6SW5saW5lSXRlbSYgaW5saW5lSXRlbSkgeyBy
ZXR1cm4gaW5saW5lSXRlbS5wcmVkaWNhdGU7IH0gXAotU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19F
TkQoKQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDViMzM1YmM0MGVlZmM5YzI4MzNkNGQxMzdiNGE1ODQ3ODcwNzUyZmMuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1Mzkg
KzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0g
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
LSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
Ci0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
LSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0g
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJJbmxp
bmVMaW5lLmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2lu
Y2x1ZGUgIkZvbnRDYXNjYWRlLmgiCi0jaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ0NvbnRleHQu
aCIKLSNpbmNsdWRlICJJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oIgotI2luY2x1ZGUgIkxheW91
dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAiUnVudGltZUVuYWJsZWRGZWF0dXJlcy5oIgotI2lu
Y2x1ZGUgIlRleHRGbGFncy5oIgotI2luY2x1ZGUgIlRleHRVdGlsLmgiCi0jaW5jbHVkZSA8d3Rm
L0lzb01hbGxvY0lubGluZXMuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExh
eW91dCB7Ci0KLUxpbmU6OkxpbmUoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGlu
ZUZvcm1hdHRpbmdDb250ZXh0KQotICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxp
bmVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICAsIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KG1f
cnVucykKLXsKLX0KLQotTGluZTo6fkxpbmUoKQotewotfQotCi12b2lkIExpbmU6OmluaXRpYWxp
emUoKQotewotICAgIG1fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50ID0gMDsKLSAgICBt
X2NvbnRlbnRMb2dpY2FsV2lkdGggPSB7IH07Ci0gICAgbV9ydW5zLmNsZWFyKCk7Ci0gICAgbV90
cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IHsgfTsKLSAgICBtX3RyaW1tYWJsZVRyYWlsaW5nQ29u
dGVudC5yZXNldCgpOwotfQotCi12b2lkIExpbmU6OnJlbW92ZUNvbGxhcHNpYmxlQ29udGVudChJ
bmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKQotewotICAgIHJlbW92ZVRyYWls
aW5nVHJpbW1hYmxlQ29udGVudCgpOwotICAgIHZpc3VhbGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZs
b3dDb250ZW50KGV4dHJhSG9yaXpvbnRhbFNwYWNlKTsKLX0KLQotdm9pZCBMaW5lOjphcHBseVJ1
bkV4cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKQotewotICAg
IEFTU0VSVChmb3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKS5zdHlsZSgpLnRleHRBbGlnbigpID09
IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkpOwotICAgIC8vIFRleHQgaXMganVzdGlmaWVkIGFjY29y
ZGluZyB0byB0aGUgbWV0aG9kIHNwZWNpZmllZCBieSB0aGUgdGV4dC1qdXN0aWZ5IHByb3BlcnR5
LAotICAgIC8vIGluIG9yZGVyIHRvIGV4YWN0bHkgZmlsbCB0aGUgbGluZSBib3guIFVubGVzcyBv
dGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRleHQtYWxpZ24tbGFzdCwKLSAgICAvLyB0aGUgbGFzdCBs
aW5lIGJlZm9yZSBhIGZvcmNlZCBicmVhayBvciB0aGUgZW5kIG9mIHRoZSBibG9jayBpcyBzdGFy
dC1hbGlnbmVkLgotICAgIGlmIChtX3J1bnMuaXNFbXB0eSgpIHx8IG1fcnVucy5sYXN0KCkuaXNM
aW5lQnJlYWsoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYXV0byBleHBhbnNpb25PcHBvcnR1
bml0eUNvdW50ID0gMDsKLSAgICBSdW4qIGxhc3RSdW5XaXRoQ29udGVudCA9IG51bGxwdHI7Ci0g
ICAgLy8gQ29sbGVjdCBhbmQgZGlzdHJpYnV0ZSB0aGUgZXhwYW5zaW9uIG9wcG9ydHVuaXRpZXMu
Ci0gICAgZm9yIChhdXRvJiBydW4gOiBtX3J1bnMpIHsKLSAgICAgICAgZXhwYW5zaW9uT3Bwb3J0
dW5pdHlDb3VudCArPSBydW4uZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCgpOwotICAgICAgICBp
ZiAocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc0JveCgpKQotICAgICAgICAgICAgbGFzdFJ1bldpdGhD
b250ZW50ID0gJnJ1bjsKLSAgICB9Ci0gICAgLy8gTmVlZCB0byBmaXggdXAgdGhlIGxhc3QgcnVu
J3MgdHJhaWxpbmcgZXhwYW5zaW9uLgotICAgIGlmIChsYXN0UnVuV2l0aENvbnRlbnQgJiYgbGFz
dFJ1bldpdGhDb250ZW50LT5oYXNFeHBhbnNpb25PcHBvcnR1bml0eSgpKSB7Ci0gICAgICAgIC8v
IFR1cm4gb2ZmIHRoZSB0cmFpbGluZyBiaXRzIGZpcnN0IGFuZCBhZGQgdGhlIGZvcmJpZCB0cmFp
bGluZyBleHBhbnNpb24uCi0gICAgICAgIGF1dG8gbGVhZGluZ0V4cGFuc2lvbiA9IGxhc3RSdW5X
aXRoQ29udGVudC0+ZXhwYW5zaW9uQmVoYXZpb3IoKSAmIExlZnRFeHBhbnNpb25NYXNrOwotICAg
ICAgICBsYXN0UnVuV2l0aENvbnRlbnQtPnNldEV4cGFuc2lvbkJlaGF2aW9yKGxlYWRpbmdFeHBh
bnNpb24gfCBGb3JiaWRSaWdodEV4cGFuc2lvbik7Ci0gICAgfQotICAgIC8vIEFueXRoaW5nIHRv
IGRpc3RyaWJ1dGU/Ci0gICAgaWYgKCFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50IHx8ICFleHRy
YUhvcml6b250YWxTcGFjZSkKLSAgICAgICAgcmV0dXJuOwotICAgIC8vIERpc3RyaWJ1dGUgdGhl
IGV4dHJhIHNwYWNlLgotICAgIGF1dG8gZXhwYW5zaW9uVG9EaXN0cmlidXRlID0gZXh0cmFIb3Jp
em9udGFsU3BhY2UgLyBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50OwotICAgIGF1dG8gYWNjdW11
bGF0ZWRFeHBhbnNpb24gPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAgICBmb3IgKGF1dG8mIHJ1
biA6IG1fcnVucykgewotICAgICAgICAvLyBFeHBhbmQgYW5kIG1vdmUgcnVucyBieSB0aGUgYWNj
dW11bGF0ZWQgZXhwYW5zaW9uLgotICAgICAgICBydW4ubW92ZUhvcml6b250YWxseShhY2N1bXVs
YXRlZEV4cGFuc2lvbik7Ci0gICAgICAgIGlmICghcnVuLmhhc0V4cGFuc2lvbk9wcG9ydHVuaXR5
KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgQVNTRVJUKHJ1bi5leHBhbnNpb25P
cHBvcnR1bml0eUNvdW50KCkpOwotICAgICAgICBhdXRvIGNvbXB1dGVkRXhwYW5zaW9uID0gZXhw
YW5zaW9uVG9EaXN0cmlidXRlICogcnVuLmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQoKTsKLSAg
ICAgICAgLy8gRklYTUU6IENoZWNrIHdoeSB3ZSBuZWVkIHRvIHNldCBib3RoLgotICAgICAgICBy
dW4uc2V0SG9yaXpvbnRhbEV4cGFuc2lvbihjb21wdXRlZEV4cGFuc2lvbik7Ci0gICAgICAgIHJ1
bi5zaHJpbmtIb3Jpem9udGFsbHkoLWNvbXB1dGVkRXhwYW5zaW9uKTsKLSAgICAgICAgYWNjdW11
bGF0ZWRFeHBhbnNpb24gKz0gY29tcHV0ZWRFeHBhbnNpb247Ci0gICAgfQotICAgIC8vIENvbnRl
bnQgZ3Jvd3MgYXMgcnVucyBleHBhbmQuCi0gICAgbV9jb250ZW50TG9naWNhbFdpZHRoICs9IGFj
Y3VtdWxhdGVkRXhwYW5zaW9uOwotfQotCi12b2lkIExpbmU6OnJlbW92ZVRyYWlsaW5nVHJpbW1h
YmxlQ29udGVudCgpCi17Ci0gICAgaWYgKG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmlzRW1w
dHkoKSB8fCBtX3J1bnMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBDb21w
bGV4IGxpbmUgbGF5b3V0IHF1aXJrOiBrZWVwIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGFyb3Vu
ZCB3aGVuIGl0IGlzIGZvbGxvd2VkIGJ5IGEgbGluZSBicmVhaywgdW5sZXNzIHRoZSBjb250ZW50
IG92ZXJmbG93cyB0aGUgbGluZS4KLSAgICBpZiAoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c2hh
cmVkRmVhdHVyZXMoKS5sYXlvdXRGb3JtYXR0aW5nQ29udGV4dEludGVncmF0aW9uRW5hYmxlZCgp
KSB7Ci0gICAgICAgIGF1dG8gaXNUZXh0QWxpZ25SaWdodCA9IFsmXSB7Ci0gICAgICAgICAgICBh
dXRvIHRleHRBbGlnbiA9IGZvcm1hdHRpbmdDb250ZXh0KCkucm9vdCgpLnN0eWxlKCkudGV4dEFs
aWduKCk7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6OlJp
Z2h0Ci0gICAgICAgICAgICAgICAgfHwgdGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6OldlYktp
dFJpZ2h0Ci0gICAgICAgICAgICAgICAgfHwgdGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6OkVu
ZDsKLSAgICAgICAgICAgIH0oKTsKLQotICAgICAgICBpZiAobV9ydW5zLmxhc3QoKS5pc0xpbmVC
cmVhaygpICYmICFpc1RleHRBbGlnblJpZ2h0KSB7Ci0gICAgICAgICAgICBtX3RyaW1tYWJsZVRy
YWlsaW5nQ29udGVudC5yZXNldCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgbV9jb250ZW50TG9naWNhbFdpZHRoIC09IG1fdHJpbW1hYmxlVHJhaWxpbmdD
b250ZW50LnJlbW92ZSgpOwotfQotCi12b2lkIExpbmU6OnZpc3VhbGx5Q29sbGFwc2VQcmVXcmFw
T3ZlcmZsb3dDb250ZW50KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFsU3BhY2UpCi17
Ci0gICAgQVNTRVJUKG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmlzRW1wdHkoKSk7Ci0gICAg
Ly8gSWYgd2hpdGUtc3BhY2UgaXMgc2V0IHRvIHByZS13cmFwLCB0aGUgVUEgbXVzdAotICAgIC8v
IC4uLgotICAgIC8vIEl0IG1heSBhbHNvIHZpc3VhbGx5IGNvbGxhcHNlIHRoZSBjaGFyYWN0ZXIg
YWR2YW5jZSB3aWR0aHMgb2YgYW55IHRoYXQgd291bGQgb3RoZXJ3aXNlIG92ZXJmbG93LgotICAg
IGF1dG8gb3ZlcmZsb3dXaWR0aCA9IC1leHRyYUhvcml6b250YWxTcGFjZTsKLSAgICBpZiAob3Zl
cmZsb3dXaWR0aCA8PSAwKQotICAgICAgICByZXR1cm47Ci0gICAgLy8gTGV0J3MganVzdCBmaW5k
IHRoZSB0cmFpbGluZyBwcmUtd3JhcCB3aGl0ZXNwYWNlIGNvbnRlbnQgZm9yIG5vdyAoZS5nIGNo
ZWNrIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB0cmFpbGluZyBydW5zIHdpdGgKLSAgICAvLyBkaWZm
ZXJlbnQgc2V0IG9mIHdoaXRlLXNwYWNlIHZhbHVlcyBhbmQgZGVjaWRlIGlmIHRoZSBpbi1iZXR3
ZWVuIHByZS13cmFwIGNvbnRlbnQgc2hvdWxkIGJlIGNvbGxhcHNlZCBhcyB3ZWxsLikKLSAgICBJ
bmxpbmVMYXlvdXRVbml0IHRyaW1tZWRDb250ZW50V2lkdGggPSAwOwotICAgIGZvciAoYXV0byYg
cnVuIDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShtX3J1bnMpKSB7Ci0gICAgICAgIGlmIChydW4u
c3R5bGUoKS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6UHJlV3JhcCkgewotICAgICAgICAg
ICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBwcmUtd3JhcCB0cmFpbGluZyBjb250ZW50
LgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYXV0byBwcmVXcmFwVmlz
dWFsbHlDb2xsYXBzaWJsZUlubGluZUl0ZW0gPSBydW4uaXNJbmxpbmVCb3hTdGFydCgpIHx8IHJ1
bi5pc0lubGluZUJveEVuZCgpIHx8IHJ1bi5oYXNUcmFpbGluZ1doaXRlc3BhY2UoKTsKLSAgICAg
ICAgaWYgKCFwcmVXcmFwVmlzdWFsbHlDb2xsYXBzaWJsZUlubGluZUl0ZW0pCi0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgQVNTRVJUKCFydW4uaGFzQ29sbGFwc2libGVUcmFpbGluZ1doaXRl
c3BhY2UoKSk7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGggPSB7IH07
Ci0gICAgICAgIGlmIChydW4uaXNUZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBz
aG91bGQgYWx3YXlzIGNvbGxhcHNlIHRoZSBydW4gYXQgYSBnbHlwaCBib3VuZGFyeSBhcyB0aGUg
c3BlYyBpbmRpY2F0ZXM6ICJjb2xsYXBzZSB0aGUgY2hhcmFjdGVyIGFkdmFuY2Ugd2lkdGhzIG9m
IGFueSB0aGF0IHdvdWxkIG90aGVyd2lzZSBvdmVyZmxvdyIKLSAgICAgICAgICAgIC8vIGFuZCB0
aGUgdHJpbW1lZCB3aWR0aCBzaG91bGQgYmUgY2FwcGVkIGF0IHN0ZDo6bWluKHJ1bi50cmFpbGlu
Z1doaXRlc3BhY2VXaWR0aCgpLCBvdmVyZmxvd1dpZHRoKSBmb3IgdGV4dCBydW5zLiBCb3RoIEZG
IGFuZCBDaHJvbWUgYWdyZWUuCi0gICAgICAgICAgICB0cmltbWFibGVXaWR0aCA9IHJ1bi50cmFp
bGluZ1doaXRlc3BhY2VXaWR0aCgpOwotICAgICAgICAgICAgcnVuLnZpc3VhbGx5Q29sbGFwc2VU
cmFpbGluZ1doaXRlc3BhY2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyaW1t
YWJsZVdpZHRoID0gcnVuLmxvZ2ljYWxXaWR0aCgpOwotICAgICAgICAgICAgcnVuLnNocmlua0hv
cml6b250YWxseSh0cmltbWFibGVXaWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJpbW1lZENv
bnRlbnRXaWR0aCArPSB0cmltbWFibGVXaWR0aDsKLSAgICAgICAgb3ZlcmZsb3dXaWR0aCAtPSB0
cmltbWFibGVXaWR0aDsKLSAgICAgICAgaWYgKG92ZXJmbG93V2lkdGggPD0gMCkKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgIH0KLSAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggLT0gdHJpbW1lZENv
bnRlbnRXaWR0aDsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmQoY29uc3QgSW5saW5lSXRlbSYgaW5s
aW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgaWYgKGlubGlu
ZUl0ZW0uaXNUZXh0KCkpCi0gICAgICAgIGFwcGVuZFRleHRDb250ZW50KGRvd25jYXN0PElubGlu
ZVRleHRJdGVtPihpbmxpbmVJdGVtKSwgbG9naWNhbFdpZHRoKTsKLSAgICBlbHNlIGlmIChpbmxp
bmVJdGVtLmlzTGluZUJyZWFrKCkpCi0gICAgICAgIGFwcGVuZExpbmVCcmVhayhpbmxpbmVJdGVt
KTsKLSAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkKLSAg
ICAgICAgYXBwZW5kV29yZEJyZWFrT3Bwb3J0dW5pdHkoaW5saW5lSXRlbSk7Ci0gICAgZWxzZSBp
ZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkpCi0gICAgICAgIGFwcGVuZElubGluZUJv
eFN0YXJ0KGlubGluZUl0ZW0sIGxvZ2ljYWxXaWR0aCk7Ci0gICAgZWxzZSBpZiAoaW5saW5lSXRl
bS5pc0lubGluZUJveEVuZCgpKQotICAgICAgICBhcHBlbmRJbmxpbmVCb3hFbmQoaW5saW5lSXRl
bSwgbG9naWNhbFdpZHRoKTsKLSAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmxheW91dEJveCgpLmlz
UmVwbGFjZWRCb3goKSkKLSAgICAgICAgYXBwZW5kUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxp
bmVJdGVtLCBsb2dpY2FsV2lkdGgpOwotICAgIGVsc2UgaWYgKGlubGluZUl0ZW0uaXNCb3goKSkK
LSAgICAgICAgYXBwZW5kTm9uUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVtLCBsb2dp
Y2FsV2lkdGgpOwotICAgIGVsc2UKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci19Ci0K
LXZvaWQgTGluZTo6YXBwZW5kTm9uQnJlYWthYmxlU3BhY2UoY29uc3QgSW5saW5lSXRlbSYgaW5s
aW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBs
b2dpY2FsV2lkdGgpCi17Ci0gICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGxvZ2ljYWxM
ZWZ0LCBsb2dpY2FsV2lkdGggfSk7Ci0gICAgbV9jb250ZW50TG9naWNhbFdpZHRoICs9IGxvZ2lj
YWxXaWR0aDsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmRJbmxpbmVCb3hTdGFydChjb25zdCBJbmxp
bmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKLXsKLSAg
ICAvLyBUaGlzIGlzIHJlYWxseSBqdXN0IGEgcGxhY2Vob2xkZXIgdG8gbWFyayB0aGUgc3RhcnQg
b2YgdGhlIGlubGluZSBib3ggPHNwYW4+LgotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0
dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVJdGVtLmxheW91dEJveCgpKTsKLSAg
ICBhdXRvIGFkanVzdGVkUnVuU3RhcnQgPSBjb250ZW50TG9naWNhbFJpZ2h0KCkgKyBzdGQ6Om1p
bihib3hHZW9tZXRyeS5tYXJnaW5TdGFydCgpLCAwX2x1KTsKLSAgICArK21fbm9uU3Bhbm5pbmdJ
bmxpbmVMZXZlbEJveENvdW50OwotICAgIGFwcGVuZE5vbkJyZWFrYWJsZVNwYWNlKGlubGluZUl0
ZW0sIGFkanVzdGVkUnVuU3RhcnQsIGxvZ2ljYWxXaWR0aCk7Ci19Ci0KLXZvaWQgTGluZTo6YXBw
ZW5kSW5saW5lQm94RW5kKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91
dFVuaXQgbG9naWNhbFdpZHRoKQotewotICAgIC8vIFRoaXMgaXMgcmVhbGx5IGp1c3QgYSBwbGFj
ZWhvbGRlciB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGlubGluZSBib3ggPC9zcGFuPi4KLSAgICBh
dXRvIHJlbW92ZVRyYWlsaW5nTGV0dGVyU3BhY2luZyA9IFsmXSB7Ci0gICAgICAgIGlmICghbV90
cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuaXNUcmFpbGluZ1J1blBhcnRpYWxseVRyaW1tYWJsZSgp
KQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggLT0g
bV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQucmVtb3ZlUGFydGlhbGx5VHJpbW1hYmxlQ29udGVu
dCgpOwotICAgIH07Ci0gICAgLy8gUHJldmVudCB0cmFpbGluZyBsZXR0ZXItc3BhY2luZyBmcm9t
IHNwaWxsaW5nIG91dCBvZiB0aGUgaW5saW5lIGJveC4KLSAgICAvLyBodHRwczovL2RyYWZ0cy5j
c3N3Zy5vcmcvY3NzLXRleHQtMy8jbGV0dGVyLXNwYWNpbmctcHJvcGVydHkgU2VlIGV4YW1wbGUg
MjEuCi0gICAgcmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7Ci0gICAgYXBwZW5kTm9uQnJl
YWthYmxlU3BhY2UoaW5saW5lSXRlbSwgY29udGVudExvZ2ljYWxXaWR0aCgpLCBsb2dpY2FsV2lk
dGgpOwotfQotCi12b2lkIExpbmU6OmFwcGVuZFRleHRDb250ZW50KGNvbnN0IElubGluZVRleHRJ
dGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0g
ICAgYXV0byYgc3R5bGUgPSBpbmxpbmVUZXh0SXRlbS5zdHlsZSgpOwotICAgIGF1dG8gd2lsbENv
bGxhcHNlQ29tcGxldGVseSA9IFsmXSB7Ci0gICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc0Vt
cHR5Q29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmICghaW5s
aW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgIGlmIChJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlu
bGluZVRleHRJdGVtKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgLy8gQ2hl
Y2sgaWYgdGhlIGxhc3QgaXRlbSBpcyBjb2xsYXBzZWQgYXMgd2VsbC4KLSAgICAgICAgZm9yIChh
dXRvJiBydW4gOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKG1fcnVucykpIHsKLSAgICAgICAgICAg
IGlmIChydW4uaXNCb3goKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
ICAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jd2hpdGUtc3BhY2Ut
cGhhc2UtMQotICAgICAgICAgICAgLy8gQW55IGNvbGxhcHNpYmxlIHNwYWNlIGltbWVkaWF0ZWx5
IGZvbGxvd2luZyBhbm90aGVyIGNvbGxhcHNpYmxlIHNwYWNl4oCUZXZlbiBvbmUgb3V0c2lkZSB0
aGUgYm91bmRhcnkgb2YgdGhlIGlubGluZSBjb250YWluaW5nIHRoYXQgc3BhY2UsCi0gICAgICAg
ICAgICAvLyBwcm92aWRlZCBib3RoIHNwYWNlcyBhcmUgd2l0aGluIHRoZSBzYW1lIGlubGluZSBm
b3JtYXR0aW5nIGNvbnRleHTigJRpcyBjb2xsYXBzZWQgdG8gaGF2ZSB6ZXJvIGFkdmFuY2Ugd2lk
dGguCi0gICAgICAgICAgICAvLyA6ICI8c3Bhbj4gIDwvc3Bhbj4gIiA8LSB0aGUgdHJhaWxpbmcg
d2hpdGVzcGFjZSBjb2xsYXBzZXMgY29tcGxldGVseS4KLSAgICAgICAgICAgIC8vIE5vdCB0aGF0
IHdoZW4gdGhlIGlubGluZSBib3ggaGFzIHByZXNlcnZlIHdoaXRlc3BhY2Ugc3R5bGUsICI8c3Bh
biBzdHlsZT0id2hpdGUtc3BhY2U6IHByZSI+ICA8L3NwYW4+ICIgPC0gdGhpcyB3aGl0ZXNwYWNl
IHN0YXlzIGFyb3VuZC4KLSAgICAgICAgICAgIGlmIChydW4uaXNUZXh0KCkpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIHJ1bi5oYXNDb2xsYXBzaWJsZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwotICAg
ICAgICAgICAgQVNTRVJUKHJ1bi5pc0lubGluZUJveFN0YXJ0KCkgfHwgcnVuLmlzSW5saW5lQm94
RW5kKCkgfHwgcnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7Ci0gICAgICAgIH0KLSAgICAg
ICAgLy8gTGVhZGluZyB3aGl0ZXNwYWNlLgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Owot
Ci0gICAgaWYgKHdpbGxDb2xsYXBzZUNvbXBsZXRlbHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgYXV0byBuZWVkc05ld1J1biA9IFsmXSB7Ci0gICAgICAgIGlmIChtX3J1bnMuaXNFbXB0eSgp
KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGF1dG8mIGxhc3RSdW4gPSBtX3J1
bnMubGFzdCgpOwotICAgICAgICBpZiAoJmxhc3RSdW4ubGF5b3V0Qm94KCkgIT0gJmlubGluZVRl
eHRJdGVtLmxheW91dEJveCgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlm
ICghbGFzdFJ1bi5pc1RleHQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBp
ZiAobGFzdFJ1bi5oYXNDb2xsYXBzZWRUcmFpbGluZ1doaXRlc3BhY2UoKSkKLSAgICAgICAgICAg
IHJldHVybiB0cnVlOwotICAgICAgICBpZiAoaW5saW5lVGV4dEl0ZW0uaXNXb3JkU2VwYXJhdG9y
KCkgJiYgc3R5bGUuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpKQotICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9KCk7Ci0gICAgYXV0byBvbGRD
b250ZW50TG9naWNhbFdpZHRoID0gY29udGVudExvZ2ljYWxXaWR0aCgpOwotICAgIGlmIChuZWVk
c05ld1J1bikgewotICAgICAgICAvLyBOb3RlLCBuZWdhdGl2ZSB3b3JkcyBzcGFjaW5nIG1heSBj
YXVzZSBnbHlwaCBvdmVybGFwLgotICAgICAgICBhdXRvIHJ1bkxvZ2ljYWxMZWZ0ID0gY29udGVu
dExvZ2ljYWxSaWdodCgpICsgKGlubGluZVRleHRJdGVtLmlzV29yZFNlcGFyYXRvcigpID8gc3R5
bGUuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpIDogMC4wZik7Ci0gICAgICAgIG1fcnVucy5h
cHBlbmQoeyBpbmxpbmVUZXh0SXRlbSwgcnVuTG9naWNhbExlZnQsIGxvZ2ljYWxXaWR0aCB9KTsK
LSAgICAgICAgbV9jb250ZW50TG9naWNhbFdpZHRoID0gc3RkOjptYXgob2xkQ29udGVudExvZ2lj
YWxXaWR0aCwgcnVuTG9naWNhbExlZnQgKyBsb2dpY2FsV2lkdGgpOwotICAgIH0gZWxzZSB7Ci0g
ICAgICAgIG1fcnVucy5sYXN0KCkuZXhwYW5kKGlubGluZVRleHRJdGVtLCBsb2dpY2FsV2lkdGgp
OwotICAgICAgICAvLyBEbyBub3QgbGV0IG5lZ2F0aXZlIGxldHRlciBzcGFjaW5nIG1ha2UgdGhl
IGNvbnRlbnQgc2hvcnRlciB0aGFuIGl0IGFscmVhZHkgaXMuCi0gICAgICAgIG1fY29udGVudExv
Z2ljYWxXaWR0aCArPSBzdGQ6Om1heCgwLjBmLCBsb2dpY2FsV2lkdGgpOwotICAgIH0KLSAgICAv
LyBTZXQgdGhlIHRyYWlsaW5nIHRyaW1tYWJsZSBjb250ZW50LgotICAgIGlmIChpbmxpbmVUZXh0
SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3Bh
Y2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpIHsKLSAgICAgICAgbV90cmltbWFibGVUcmFpbGlu
Z0NvbnRlbnQuYWRkRnVsbHlUcmltbWFibGVDb250ZW50KG1fcnVucy5zaXplKCkgLSAxLCBjb250
ZW50TG9naWNhbFdpZHRoKCkgLSBvbGRDb250ZW50TG9naWNhbFdpZHRoKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICAvLyBBbnkgbm9uLXdoaXRlc3BhY2UsIG5vLXRyaW1tYWJsZSBjb250
ZW50IHJlc2V0cyB0aGUgZXhpc3RpbmcgdHJpbW1hYmxlLgotICAgIG1fdHJpbW1hYmxlVHJhaWxp
bmdDb250ZW50LnJlc2V0KCk7Ci0gICAgaWYgKCFmb3JtYXR0aW5nQ29udGV4dCgpLmxheW91dFN0
YXRlKCkuc2hvdWxkSWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgJiYgIWlubGluZVRleHRJ
dGVtLmlzV2hpdGVzcGFjZSgpICYmIHN0eWxlLmxldHRlclNwYWNpbmcoKSA+IDApCi0gICAgICAg
IG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmFkZFBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQo
bV9ydW5zLnNpemUoKSAtIDEsIHN0eWxlLmxldHRlclNwYWNpbmcoKSk7Ci0gICAgbV90cmFpbGlu
Z1NvZnRIeXBoZW5XaWR0aCA9IGlubGluZVRleHRJdGVtLmhhc1RyYWlsaW5nU29mdEh5cGhlbigp
ID8gbWFrZU9wdGlvbmFsKHN0eWxlLmZvbnRDYXNjYWRlKCkud2lkdGgoVGV4dFJ1biB7IFN0cmlu
Z1ZpZXcgeyBzdHlsZS5oeXBoZW5TdHJpbmcoKSB9IH0pKSA6IFdURjo6bnVsbG9wdDsKLX0KLQot
dm9pZCBMaW5lOjphcHBlbmROb25SZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0
ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKQot
ewotICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlc2V0KCk7Ci0gICAgbV90cmFpbGlu
Z1NvZnRIeXBoZW5XaWR0aCA9IHsgfTsKLSAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggKz0gbWFy
Z2luQm94TG9naWNhbFdpZHRoOwotICAgICsrbV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291
bnQ7Ci0gICAgYXV0byBtYXJnaW5TdGFydCA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlG
b3JCb3goaW5saW5lSXRlbS5sYXlvdXRCb3goKSkubWFyZ2luU3RhcnQoKTsKLSAgICBpZiAobWFy
Z2luU3RhcnQgPj0gMCkgewotICAgICAgICBtX3J1bnMuYXBwZW5kKHsgaW5saW5lSXRlbSwgY29u
dGVudExvZ2ljYWxSaWdodCgpLCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGggfSk7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0gICAgLy8gTmVnYXRpdmUgbWFyZ2luLXN0YXJ0IHB1bGxzIHRoZSBjb250
ZW50IHRvIHRoZSBsb2dpY2FsIGxlZnQgZGlyZWN0aW9uLgotICAgIC8vIE5lZ2F0aXZlIG1hcmdp
biBhbHNvIHNxdWVlemVzIHRoZSBtYXJnaW4gYm94LCB3ZSBuZWVkIHRvIHN0cmV0Y2ggaXQgdG8g
bWFrZSBzdXJlIHRoZSBzdWJzZXF1ZW50IGNvbnRlbnQgd29uJ3Qgb3ZlcmxhcC4KLSAgICAvLyBl
LmcuIDxpbWcgc3R5bGU9IndpZHRoOiAxMDBweDsgbWFyZ2luLWxlZnQ6IC0xMDBweDsiPiBwdWxs
cyB0aGUgcmVwbGFjZWQgYm94IHRvIC0xMDBweCB3aXRoIHRoZSBtYXJnaW4gYm94IHdpZHRoIG9m
IDBweC4KLSAgICAvLyBJbnN0ZWFkIHdlIG5lZWQgdG8gcG9zaXRpb24gaXQgYXQgLTEwMHB4IGFu
ZCBzaXplIGl0IHRvIDEwMHB4IHNvIHRoZSBzdWJzZXF1ZW50IGNvbnRlbnQgc3RhcnRzIGF0IDBw
eC4gCi0gICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGNvbnRlbnRMb2dpY2FsUmlnaHQo
KSArIG1hcmdpblN0YXJ0LCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGggLSBtYXJnaW5TdGFydCB9KTsK
LX0KLQotdm9pZCBMaW5lOjphcHBlbmRSZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGlu
ZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRo
KQotewotICAgIEFTU0VSVChpbmxpbmVJdGVtLmxheW91dEJveCgpLmlzUmVwbGFjZWRCb3goKSk7
Ci0gICAgLy8gRklYTUU6IFN1cmVseSByZXBsYWNlZCBib3hlcyBiZWhhdmUgZGlmZmVyZW50bHku
Ci0gICAgYXBwZW5kTm9uUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVtLCBtYXJnaW5C
b3hMb2dpY2FsV2lkdGgpOwotfQotCi12b2lkIExpbmU6OmFwcGVuZExpbmVCcmVhayhjb25zdCBJ
bmxpbmVJdGVtJiBpbmxpbmVJdGVtKQotewotICAgIG1fdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgg
PSB7IH07Ci0gICAgaWYgKGlubGluZUl0ZW0uaXNIYXJkTGluZUJyZWFrKCkpIHsKLSAgICAgICAg
KyttX25vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudDsKLSAgICAgICAgcmV0dXJuIG1fcnVu
cy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIDBfbHUgfSk7Ci0g
ICAgfQotICAgIC8vIFNvZnQgbGluZSBicmVha3MgKHByZXNlcnZlZCBuZXcgbGluZSBjaGFyYWN0
ZXJzKSByZXF1aXJlIGlubGluZSB0ZXh0IGJveGVzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMu
Ci0gICAgQVNTRVJUKGlubGluZUl0ZW0uaXNTb2Z0TGluZUJyZWFrKCkpOwotICAgIG1fcnVucy5h
cHBlbmQoeyBkb3duY2FzdDxJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbT4oaW5saW5lSXRlbSksIGNv
bnRlbnRMb2dpY2FsUmlnaHQoKSB9KTsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmRXb3JkQnJlYWtP
cHBvcnR1bml0eShjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQotewotICAgIG1fcnVucy5h
cHBlbmQoeyBpbmxpbmVJdGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIDBfbHUgfSk7Ci19Ci0K
LXZvaWQgTGluZTo6YWRkVHJhaWxpbmdIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBoeXBoZW5Mb2dp
Y2FsV2lkdGgpCi17Ci0gICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdl
KG1fcnVucykpIHsKLSAgICAgICAgaWYgKCFydW4uaXNUZXh0KCkpCi0gICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgcnVuLnNldE5lZWRzSHlwaGVuKGh5cGhlbkxvZ2ljYWxXaWR0aCk7Ci0g
ICAgICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCArPSBoeXBoZW5Mb2dpY2FsV2lkdGg7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci19Ci0KLWNvbnN0
IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBMaW5lOjpmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Ci19Ci0KLUxpbmU6OlRy
aW1tYWJsZVRyYWlsaW5nQ29udGVudDo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KFJ1bkxpc3Qm
IHJ1bnMpCi0gICAgOiBtX3J1bnMocnVucykKLXsKLX0KLQotdm9pZCBMaW5lOjpUcmltbWFibGVU
cmFpbGluZ0NvbnRlbnQ6OmFkZEZ1bGx5VHJpbW1hYmxlQ29udGVudChzaXplX3QgcnVuSW5kZXgs
IElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpCi17Ci0gICAgLy8gQW55IHN1YnNlcXVl
bnQgdHJpbW1hYmxlIHdoaXRlc3BhY2Ugc2hvdWxkIGNvbGxhcHNlIHRvIHplcm8gYWR2YW5jZWQg
d2lkdGggYW5kIGlnbm9yZWQgYXQgOjphcHBlbmRUZXh0Q29udGVudCgpLgotICAgIEFTU0VSVCgh
bV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQpOwotICAgIG1fZnVsbHlUcmltbWFibGVXaWR0aCA9
IHRyaW1tYWJsZVdpZHRoOwotICAgIC8vIE5vdGUgdGhhdCBqdXN0IGJlY2F1c2UgdGhlIHRyaW1t
YWJsZSB3aWR0aCBpcyAwIChmb250LXNpemU6IDBweCksIGl0IGRvZXMgbm90IG1lYW4gd2UgZG9u
J3QgaGF2ZSBhIHRyaW1tYWJsZSB0cmFpbGluZyBjb250ZW50LgotICAgIG1faGFzRnVsbHlUcmlt
bWFibGVDb250ZW50ID0gdHJ1ZTsKLSAgICBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXggPSBtX2Zp
cnN0VHJpbW1hYmxlUnVuSW5kZXgudmFsdWVPcihydW5JbmRleCk7Ci19Ci0KLXZvaWQgTGluZTo6
VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50OjphZGRQYXJ0aWFsbHlUcmltbWFibGVDb250ZW50KHNp
emVfdCBydW5JbmRleCwgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVXaWR0aCkKLXsKLSAgICAv
LyBEbyBub3QgYWRkIHRyaW1tYWJsZSBsZXR0ZXIgc3BhY2luZyBhZnRlciBhIGZ1bGx5IHRyaW1t
YWJsZSB3aGl0ZXNwYWNlLgotICAgIEFTU0VSVCghbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4KTsK
LSAgICBBU1NFUlQoIW1faGFzRnVsbHlUcmltbWFibGVDb250ZW50KTsKLSAgICBBU1NFUlQoIW1f
cGFydGlhbGx5VHJpbW1hYmxlV2lkdGgpOwotICAgIEFTU0VSVCh0cmltbWFibGVXaWR0aCk7Ci0g
ICAgbV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aCA9IHRyaW1tYWJsZVdpZHRoOwotICAgIG1fZmly
c3RUcmltbWFibGVSdW5JbmRleCA9IHJ1bkluZGV4OwotfQotCi1JbmxpbmVMYXlvdXRVbml0IExp
bmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6cmVtb3ZlKCkKLXsKLSAgICAvLyBSZW1vdmUg
dHJpbW1hYmxlIHRyYWlsaW5nIGNvbnRlbnQgYW5kIG1vdmUgYWxsIHRoZSBzdWJzZXF1ZW50IHRy
YWlsaW5nIHJ1bnMuCi0gICAgLy8gPHNwYW4+IDwvc3Bhbj48c3Bhbj48L3NwYW4+Ci0gICAgLy8g
W3RyYWlsaW5nIHdoaXRlc3BhY2VdW2lubGluZSBib3ggZW5kXVtpbmxpbmUgYm94IHN0YXJ0XVtp
bmxpbmUgYm94IGVuZF0KLSAgICAvLyBUcmltIHRoZSB3aGl0ZXNwYWNlIHJ1biBhbmQgbW92ZSB0
aGUgdHJhaWxpbmcgaW5saW5lIGJveCBydW5zIHRvIHRoZSBsb2dpY2FsIGxlZnQuCi0gICAgQVNT
RVJUKCFpc0VtcHR5KCkpOwotICAgIGF1dG8mIHRyaW1tYWJsZVJ1biA9IG1fcnVuc1sqbV9maXJz
dFRyaW1tYWJsZVJ1bkluZGV4XTsKLSAgICBBU1NFUlQodHJpbW1hYmxlUnVuLmlzVGV4dCgpKTsK
LQotICAgIGlmIChtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCkKLSAgICAgICAgdHJpbW1hYmxl
UnVuLnJlbW92ZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwotICAgIGlmIChtX3BhcnRpYWxseVRyaW1t
YWJsZVdpZHRoKQotICAgICAgICB0cmltbWFibGVSdW4ucmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFj
aW5nKCk7Ci0KLSAgICBhdXRvIHRyaW1tYWJsZVdpZHRoID0gd2lkdGgoKTsKLSAgICAvLyBXaGVu
IHRoZSB0cmltbWFibGUgcnVuIGlzIGZvbGxvd2VkIGJ5IHNvbWUgbm9uLWNvbnRlbnQgcnVucywg
d2UgbmVlZCB0byBhZGp1c3QgdGhlaXIgaG9yaXpvbnRhbCBwb3NpdGlvbnMuCi0gICAgLy8gZS5n
LiA8ZGl2PnRleHQgaXMgZm9sbG93ZWQgYnkgdHJpbW1hYmxlIGNvbnRlbnQgICAgPHNwYW4+IDwv
c3Bhbj48L2Rpdj4KLSAgICAvLyBXaGVuIHRoZSBbdGV4dC4uLl0gcnVuIGlzIHRyaW1tZWQgKHRy
YWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCksIGJvdGggIjxzcGFuPiIgYW5kICI8L3NwYW4+
IiBydW5zCi0gICAgLy8gbmVlZCB0byBiZSBtb3ZlZCBob3Jpem9udGFsbHkgdG8gY2F0Y2ggdXAg
d2l0aCB0aGUgW3RleHQuLi5dIHJ1bi4gTm90ZSB0aGF0IHRoZSB3aGl0ZXNwYWNlIGluc2lkZSB0
aGUgPHNwYW4+IGRvZXMKLSAgICAvLyBub3QgcHJvZHVjZSBhIHJ1biBzaW5jZSBpbiA6OmFwcGVu
ZFRleHQoKSB3ZSBzZWUgaXQgYXMgYSBmdWxseSBjb2xsYXBzaWJsZSBydW4uCi0gICAgZm9yIChh
dXRvIGluZGV4ID0gKm1fZmlyc3RUcmltbWFibGVSdW5JbmRleCArIDE7IGluZGV4IDwgbV9ydW5z
LnNpemUoKTsgKytpbmRleCkgewotICAgICAgICBhdXRvJiBydW4gPSBtX3J1bnNbaW5kZXhdOwot
ICAgICAgICBBU1NFUlQocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSB8fCBydW4uaXNJbmxp
bmVCb3hTdGFydCgpIHx8IHJ1bi5pc0lubGluZUJveEVuZCgpIHx8IHJ1bi5pc0xpbmVCcmVhaygp
KTsKLSAgICAgICAgcnVuLm1vdmVIb3Jpem9udGFsbHkoLXRyaW1tYWJsZVdpZHRoKTsKLSAgICB9
Ci0gICAgaWYgKCF0cmltbWFibGVSdW4udGV4dENvbnRlbnQoKS0+bGVuZ3RoKCkpIHsKLSAgICAg
ICAgLy8gVGhpcyB0cmltbWFibGUgcnVuIGlzIGZ1bGx5IGNvbGxhcHNlZCBub3cgKGUuZy4gPGRp
dj48aW1nPiAgICA8c3Bhbj48L3NwYW4+PC9kaXY+KS4KLSAgICAgICAgLy8gV2UgZG9uJ3QgbmVl
ZCB0byBrZWVwIGl0IGFyb3VuZCBhbnltb3JlLgotICAgICAgICBtX3J1bnMucmVtb3ZlKCptX2Zp
cnN0VHJpbW1hYmxlUnVuSW5kZXgpOwotICAgIH0KLSAgICByZXNldCgpOwotICAgIHJldHVybiB0
cmltbWFibGVXaWR0aDsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBMaW5lOjpUcmltbWFibGVUcmFp
bGluZ0NvbnRlbnQ6OnJlbW92ZVBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQoKQotewotICAgIC8v
IFBhcnRpYWxseSB0cmltbWFibGUgY29udGVudCBpcyBhbHdheXMgZ2F0ZWQgYnkgYSBmdWxseSB0
cmltbWFibGUgY29udGVudC4KLSAgICAvLyBXZSBjYW4ndCBqdXN0IHRyaW0gc3BhY2luZyBpbiB0
aGUgbWlkZGxlLgotICAgIEFTU0VSVCghbV9mdWxseVRyaW1tYWJsZVdpZHRoKTsKLSAgICByZXR1
cm4gcmVtb3ZlKCk7Ci19Ci0KLUxpbmU6OlJ1bjo6UnVuKGNvbnN0IElubGluZUl0ZW0mIGlubGlu
ZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQgbG9n
aWNhbFdpZHRoKQotICAgIDogbV90eXBlKGlubGluZUl0ZW0udHlwZSgpKQotICAgICwgbV9sYXlv
dXRCb3goJmlubGluZUl0ZW0ubGF5b3V0Qm94KCkpCi0gICAgLCBtX2xvZ2ljYWxMZWZ0KGxvZ2lj
YWxMZWZ0KQotICAgICwgbV9sb2dpY2FsV2lkdGgobG9naWNhbFdpZHRoKQotewotfQotCi1MaW5l
OjpSdW46OlJ1bihjb25zdCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSYgc29mdExpbmVCcmVha0l0
ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQpCi0gICAgOiBtX3R5cGUoc29mdExpbmVC
cmVha0l0ZW0udHlwZSgpKQotICAgICwgbV9sYXlvdXRCb3goJnNvZnRMaW5lQnJlYWtJdGVtLmxh
eW91dEJveCgpKQotICAgICwgbV9sb2dpY2FsTGVmdChsb2dpY2FsTGVmdCkKLSAgICAsIG1fdGV4
dENvbnRlbnQoeyBzb2Z0TGluZUJyZWFrSXRlbS5wb3NpdGlvbigpLCAxLCBzb2Z0TGluZUJyZWFr
SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpIH0pCi17Ci19Ci0KLUxpbmU6OlJ1bjo6UnVu
KGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBs
b2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi0gICAgOiBtX3R5cGUo
SW5saW5lSXRlbTo6VHlwZTo6VGV4dCkKLSAgICAsIG1fbGF5b3V0Qm94KCZpbmxpbmVUZXh0SXRl
bS5sYXlvdXRCb3goKSkKLSAgICAsIG1fbG9naWNhbExlZnQobG9naWNhbExlZnQpCi0gICAgLCBt
X2xvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGgpCi0gICAgLCBtX3doaXRlc3BhY2VJc0V4cGFuc2lv
bk9wcG9ydHVuaXR5KCFUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGlu
ZVRleHRJdGVtLmxheW91dEJveCgpKSkKLSAgICAsIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSh0
cmFpbGluZ1doaXRlc3BhY2VUeXBlKGlubGluZVRleHRJdGVtKSkKLSAgICAsIG1fdGV4dENvbnRl
bnQoeyBpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBtX3RyYWlsaW5nV2hpdGVzcGFjZVR5cGUgPT0g
VHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQgPyAxIDogaW5saW5lVGV4dEl0ZW0ubGVuZ3Ro
KCksIGlubGluZVRleHRJdGVtLmlubGluZVRleHRCb3goKS5jb250ZW50KCkgfSkKLXsKLSAgICBp
ZiAobV90cmFpbGluZ1doaXRlc3BhY2VUeXBlICE9IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSkg
ewotICAgICAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0gbG9naWNhbFdpZHRoOwotICAg
ICAgICBpZiAobV93aGl0ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1bml0eSkKLSAgICAgICAgICAg
IG1fZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCA9IDE7Ci0gICAgfQotfQotCi12b2lkIExpbmU6
OlJ1bjo6ZXhwYW5kKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5l
TGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgaXMgYSB2ZXJ5
IHNpbXBsZSBleHBhbnNpb24gbWVyZ2UuIFdlIHNob3VsZCBldmVudHVhbGx5IHN3aXRjaCBvdmVy
IHRvIEZvbnRDYXNjYWRlOjpleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LgotICAgIEFTU0VSVCgh
aGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCkpOwotICAgIEFTU0VSVChpc1RleHQoKSAm
JiBpbmxpbmVUZXh0SXRlbS5pc1RleHQoKSk7Ci0gICAgQVNTRVJUKG1fbGF5b3V0Qm94ID09ICZp
bmxpbmVUZXh0SXRlbS5sYXlvdXRCb3goKSk7Ci0KLSAgICBtX2xvZ2ljYWxXaWR0aCArPSBsb2dp
Y2FsV2lkdGg7Ci0gICAgbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID0gdHJhaWxpbmdXaGl0ZXNw
YWNlVHlwZShpbmxpbmVUZXh0SXRlbSk7Ci0KLSAgICBpZiAobV90cmFpbGluZ1doaXRlc3BhY2VU
eXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSkgewotICAgICAgICBtX3RyYWlsaW5nV2hp
dGVzcGFjZVdpZHRoID0geyB9OwotICAgICAgICBzZXRFeHBhbnNpb25CZWhhdmlvcihBbGxvd0xl
ZnRFeHBhbnNpb24gfCBBbGxvd1JpZ2h0RXhwYW5zaW9uKTsKLSAgICAgICAgbV90ZXh0Q29udGVu
dC0+ZXhwYW5kKGlubGluZVRleHRJdGVtLmxlbmd0aCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoICs9IGxvZ2ljYWxXaWR0aDsKLSAgICBp
ZiAobV93aGl0ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1bml0eSkKLSAgICAgICAgKyttX2V4cGFu
c2lvbk9wcG9ydHVuaXR5Q291bnQ7Ci0gICAgc2V0RXhwYW5zaW9uQmVoYXZpb3IoRGVmYXVsdEV4
cGFuc2lvbik7Ci0gICAgbV90ZXh0Q29udGVudC0+ZXhwYW5kKG1fdHJhaWxpbmdXaGl0ZXNwYWNl
VHlwZSA9PSBUcmFpbGluZ1doaXRlc3BhY2U6OkNvbGxhcHNlZCA/IDEgOiBpbmxpbmVUZXh0SXRl
bS5sZW5ndGgoKSk7Ci19Ci0KLWJvb2wgTGluZTo6UnVuOjpoYXNUcmFpbGluZ0xldHRlclNwYWNp
bmcoKSBjb25zdAotewotICAgIHJldHVybiAhaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkgJiYgc3R5
bGUoKS5sZXR0ZXJTcGFjaW5nKCkgPiAwOwotfQotCi1JbmxpbmVMYXlvdXRVbml0IExpbmU6OlJ1
bjo6dHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgY29uc3QKLXsKLSAgICBpZiAoIWhhc1RyYWlsaW5n
TGV0dGVyU3BhY2luZygpKQotICAgICAgICByZXR1cm4geyB9OwotICAgIHJldHVybiBJbmxpbmVM
YXlvdXRVbml0IHsgc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCkgfTsKLX0KLQotdm9pZCBMaW5lOjpS
dW46OnJlbW92ZVRyYWlsaW5nTGV0dGVyU3BhY2luZygpCi17Ci0gICAgQVNTRVJUKGhhc1RyYWls
aW5nTGV0dGVyU3BhY2luZygpKTsKLSAgICBzaHJpbmtIb3Jpem9udGFsbHkodHJhaWxpbmdMZXR0
ZXJTcGFjaW5nKCkpOwotICAgIEFTU0VSVChsb2dpY2FsV2lkdGgoKSA+IDAgfHwgKCFsb2dpY2Fs
V2lkdGgoKSAmJiBzdHlsZSgpLmxldHRlclNwYWNpbmcoKSA+PSBzdGF0aWNfY2FzdDxmbG9hdD4o
aW50TWF4Rm9yTGF5b3V0VW5pdCkpKTsKLX0KLQotdm9pZCBMaW5lOjpSdW46OnJlbW92ZVRyYWls
aW5nV2hpdGVzcGFjZSgpCi17Ci0gICAgLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vd3d3LnczLm9y
Zy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eSBtYXRyaXgKLSAgICAvLyBUcmlt
bWFibGUgd2hpdGVzcGFjZSBpcyBhbHdheXMgY29sbGFwc2libGUgc28gdGhlIGxlbmd0aCBvZiB0
aGUgdHJhaWxpbmcgdHJpbW1hYmxlIHdoaXRlc3BhY2UgaXMgYWx3YXlzIDEgKG9yIG5vbi1leGlz
dGVudCkuCi0gICAgQVNTRVJUKG1fdGV4dENvbnRlbnQtPmxlbmd0aCgpKTsKLSAgICBjb25zdGV4
cHIgc2l6ZV90IHRyYWlsaW5nVHJpbW1hYmxlQ29udGVudExlbmd0aCA9IDE7Ci0gICAgbV90ZXh0
Q29udGVudC0+c2hyaW5rKHRyYWlsaW5nVHJpbW1hYmxlQ29udGVudExlbmd0aCk7Ci0gICAgdmlz
dWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwotfQotCi12b2lkIExpbmU6OlJ1bjo6
dmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgpCi17Ci0gICAgLy8gVGhpcyBpcyBq
dXN0IGEgdmlzdWFsIGFkanVzdG1lbnQsIHRoZSB0ZXh0IGxlbmd0aCBzaG91bGQgcmVtYWluIHRo
ZSBzYW1lLgotICAgIHNocmlua0hvcml6b250YWxseShtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRo
KTsKLSAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0geyB9OwotICAgIG1fdHJhaWxpbmdX
aGl0ZXNwYWNlVHlwZSA9IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZTsKLQotICAgIGlmIChtX3do
aXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9ydHVuaXR5KSB7Ci0gICAgICAgIEFTU0VSVChtX2V4cGFu
c2lvbk9wcG9ydHVuaXR5Q291bnQpOwotICAgICAgICBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQtLTsKLSAgICB9Ci0gICAgc2V0RXhwYW5zaW9uQmVoYXZpb3IoQWxsb3dMZWZ0RXhwYW5zaW9u
IHwgQWxsb3dSaWdodEV4cGFuc2lvbik7Ci19Ci0KLXZvaWQgTGluZTo6UnVuOjpzZXRFeHBhbnNp
b25CZWhhdmlvcihFeHBhbnNpb25CZWhhdmlvciBleHBhbnNpb25CZWhhdmlvcikKLXsKLSAgICBB
U1NFUlQoaXNUZXh0KCkpOwotICAgIG1fZXhwYW5zaW9uLmJlaGF2aW9yID0gZXhwYW5zaW9uQmVo
YXZpb3I7Ci19Ci0KLUV4cGFuc2lvbkJlaGF2aW9yIExpbmU6OlJ1bjo6ZXhwYW5zaW9uQmVoYXZp
b3IoKSBjb25zdAotewotICAgIEFTU0VSVChpc1RleHQoKSk7Ci0gICAgcmV0dXJuIG1fZXhwYW5z
aW9uLmJlaGF2aW9yOwotfQotCi12b2lkIExpbmU6OlJ1bjo6c2V0SG9yaXpvbnRhbEV4cGFuc2lv
bihJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxFeHBhbnNpb24pCi17Ci0gICAgQVNTRVJUKGlzVGV4
dCgpKTsKLSAgICBBU1NFUlQoaGFzRXhwYW5zaW9uT3Bwb3J0dW5pdHkoKSk7Ci0gICAgbV9leHBh
bnNpb24uaG9yaXpvbnRhbEV4cGFuc2lvbiA9IGxvZ2ljYWxFeHBhbnNpb247Ci19Ci0KLX0KLX0K
LQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0
dGluZy9JbmxpbmVMaW5lLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVMaW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMzM1MTk1MjFh
YTllNGY5NmE3OTM0YWVkOGMwMzJjYzllNzkzZjUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRp
bmcvSW5saW5lTGluZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgot
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
LSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhU
KQotCi0jaW5jbHVkZSAiSW5saW5lSXRlbS5oIgotI2luY2x1ZGUgIklubGluZUxpbmVSdW4uaCIK
LSNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1l
c3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Ci1jbGFzcyBJ
bmxpbmVTb2Z0TGluZUJyZWFrSXRlbTsKLQotY2xhc3MgTGluZSB7Ci1wdWJsaWM6Ci0gICAgTGlu
ZShjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYpOwotICAgIH5MaW5lKCk7Ci0KLSAgICB2
b2lkIGluaXRpYWxpemUoKTsKLQotICAgIHZvaWQgYXBwZW5kKGNvbnN0IElubGluZUl0ZW0mLCBJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0KLSAgICBJbmxpbmVMYXlvdXRVbml0IGNv
bnRlbnRMb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRMb2dpY2FsV2lkdGg7
IH0KLSAgICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsUmlnaHQoKSBjb25zdCB7IHJl
dHVybiBtX3J1bnMuaXNFbXB0eSgpID8gMC4wZiA6IG1fcnVucy5sYXN0KCkubG9naWNhbFJpZ2h0
KCk7IH0KLSAgICBzaXplX3Qgbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50KCkgY29uc3Qg
eyByZXR1cm4gbV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQ7IH0KLQotICAgIElubGlu
ZUxheW91dFVuaXQgdHJpbW1hYmxlVHJhaWxpbmdXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fdHJp
bW1hYmxlVHJhaWxpbmdDb250ZW50LndpZHRoKCk7IH0KLSAgICBib29sIGlzVHJhaWxpbmdSdW5G
dWxseVRyaW1tYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50
LmlzVHJhaWxpbmdSdW5GdWxseVRyaW1tYWJsZSgpOyB9Ci0KLSAgICBPcHRpb25hbDxJbmxpbmVM
YXlvdXRVbml0PiB0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fdHJh
aWxpbmdTb2Z0SHlwaGVuV2lkdGg7IH0KLSAgICB2b2lkIGFkZFRyYWlsaW5nSHlwaGVuKElubGlu
ZUxheW91dFVuaXQgaHlwaGVuTG9naWNhbFdpZHRoKTsKLQotICAgIHZvaWQgcmVtb3ZlQ29sbGFw
c2libGVDb250ZW50KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFsU3BhY2UpOwotICAg
IHZvaWQgYXBwbHlSdW5FeHBhbnNpb24oSW5saW5lTGF5b3V0VW5pdCBleHRyYUhvcml6b250YWxT
cGFjZSk7Ci0KLSAgICBzdHJ1Y3QgUnVuIHsKLSAgICAgICAgYm9vbCBpc1RleHQoKSBjb25zdCB7
IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6VGV4dDsgfQotICAgICAgICBib29s
IGlzQm94KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5cGU6OkJveDsg
fQotICAgICAgICBib29sIGlzTGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gaXNIYXJkTGluZUJy
ZWFrKCkgfHwgaXNTb2Z0TGluZUJyZWFrKCk7IH0KLSAgICAgICAgYm9vbCBpc1NvZnRMaW5lQnJl
YWsoKSBjb25zdCAgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5cGU6OlNvZnRMaW5l
QnJlYWs7IH0KLSAgICAgICAgYm9vbCBpc0hhcmRMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiBt
X3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6SGFyZExpbmVCcmVhazsgfQotICAgICAgICBib29s
IGlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gSW5saW5l
SXRlbTo6VHlwZTo6V29yZEJyZWFrT3Bwb3J0dW5pdHk7IH0KLSAgICAgICAgYm9vbCBpc0lubGlu
ZUJveFN0YXJ0KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5cGU6Oklu
bGluZUJveFN0YXJ0OyB9Ci0gICAgICAgIGJvb2wgaXNJbmxpbmVCb3hFbmQoKSBjb25zdCB7IHJl
dHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94RW5kOyB9Ci0KLSAgICAg
ICAgY29uc3QgQm94JiBsYXlvdXRCb3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRCb3g7IH0K
LSAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9sYXlv
dXRCb3gtPnN0eWxlKCk7IH0KLSAgICAgICAgY29uc3QgT3B0aW9uYWw8TGluZVJ1bjo6VGV4dD4m
IHRleHRDb250ZW50KCkgY29uc3QgeyByZXR1cm4gbV90ZXh0Q29udGVudDsgfQotCi0gICAgICAg
IElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2Fs
V2lkdGg7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgpIGNvbnN0IHsg
cmV0dXJuIG1fbG9naWNhbExlZnQ7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
UmlnaHQoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsTGVmdCgpICsgbG9naWNhbFdpZHRoKCk7IH0K
LQotICAgICAgICBjb25zdCBMaW5lUnVuOjpFeHBhbnNpb24mIGV4cGFuc2lvbigpIGNvbnN0IHsg
cmV0dXJuIG1fZXhwYW5zaW9uOyB9Ci0gICAgICAgIGJvb2wgaGFzRXhwYW5zaW9uT3Bwb3J0dW5p
dHkoKSBjb25zdCB7IHJldHVybiBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7IH0KLSAgICAg
ICAgRXhwYW5zaW9uQmVoYXZpb3IgZXhwYW5zaW9uQmVoYXZpb3IoKSBjb25zdDsKLSAgICAgICAg
dW5zaWduZWQgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fZXhw
YW5zaW9uT3Bwb3J0dW5pdHlDb3VudDsgfQotCi0gICAgICAgIGJvb2wgaGFzVHJhaWxpbmdXaGl0
ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlICE9IFRyYWls
aW5nV2hpdGVzcGFjZTo6Tm9uZTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHRyYWlsaW5n
V2hpdGVzcGFjZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3BhY2VXaWR0
aDsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNsYXNzIExpbmU7Ci0KLSAgICAg
ICAgUnVuKGNvbnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVm
dCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOwotICAgICAgICBSdW4oY29uc3QgSW5s
aW5lU29mdExpbmVCcmVha0l0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KTsKLSAg
ICAgICAgUnVuKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0
LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0KLSAgICAgICAgdm9pZCBleHBhbmQo
Y29uc3QgSW5saW5lVGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0g
ICAgICAgIHZvaWQgbW92ZUhvcml6b250YWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkgeyBt
X2xvZ2ljYWxMZWZ0ICs9IG9mZnNldDsgfQotICAgICAgICB2b2lkIHNocmlua0hvcml6b250YWxs
eShJbmxpbmVMYXlvdXRVbml0IHdpZHRoKSB7IG1fbG9naWNhbFdpZHRoIC09IHdpZHRoOyB9Ci0g
ICAgICAgIHZvaWQgc2V0RXhwYW5zaW9uQmVoYXZpb3IoRXhwYW5zaW9uQmVoYXZpb3IpOwotICAg
ICAgICB2b2lkIHNldEhvcml6b250YWxFeHBhbnNpb24oSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
RXhwYW5zaW9uKTsKLSAgICAgICAgdm9pZCBzZXROZWVkc0h5cGhlbihJbmxpbmVMYXlvdXRVbml0
IGh5cGhlbkxvZ2ljYWxXaWR0aCk7Ci0KLSAgICAgICAgZW51bSBjbGFzcyBUcmFpbGluZ1doaXRl
c3BhY2UgewotICAgICAgICAgICAgTm9uZSwKLSAgICAgICAgICAgIE5vdENvbGxhcHNpYmxlLAot
ICAgICAgICAgICAgQ29sbGFwc2libGUsCi0gICAgICAgICAgICBDb2xsYXBzZWQKLSAgICAgICAg
fTsKLSAgICAgICAgYm9vbCBoYXNDb2xsYXBzaWJsZVRyYWlsaW5nV2hpdGVzcGFjZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9PSBUcmFpbGluZ1doaXRlc3BhY2U6
OkNvbGxhcHNpYmxlIHx8IGhhc0NvbGxhcHNlZFRyYWlsaW5nV2hpdGVzcGFjZSgpOyB9Ci0gICAg
ICAgIGJvb2wgaGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4g
bV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Q29sbGFwc2Vk
OyB9Ci0gICAgICAgIFRyYWlsaW5nV2hpdGVzcGFjZSB0cmFpbGluZ1doaXRlc3BhY2VUeXBlKGNv
bnN0IElubGluZVRleHRJdGVtJikgY29uc3Q7Ci0gICAgICAgIHZvaWQgcmVtb3ZlVHJhaWxpbmdX
aGl0ZXNwYWNlKCk7Ci0gICAgICAgIHZvaWQgdmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVz
cGFjZSgpOwotCi0gICAgICAgIGJvb2wgaGFzVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgY29uc3Q7
Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgdHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgY29uc3Q7
Ci0gICAgICAgIHZvaWQgcmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7Ci0KLSAgICAgICAg
SW5saW5lSXRlbTo6VHlwZSBtX3R5cGUgeyBJbmxpbmVJdGVtOjpUeXBlOjpUZXh0IH07Ci0gICAg
ICAgIGNvbnN0IEJveCogbV9sYXlvdXRCb3ggeyBudWxscHRyIH07Ci0gICAgICAgIElubGluZUxh
eW91dFVuaXQgbV9sb2dpY2FsTGVmdCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBt
X2xvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICAgICAgYm9vbCBtX3doaXRlc3BhY2VJc0V4cGFuc2lv
bk9wcG9ydHVuaXR5IHsgZmFsc2UgfTsKLSAgICAgICAgVHJhaWxpbmdXaGl0ZXNwYWNlIG1fdHJh
aWxpbmdXaGl0ZXNwYWNlVHlwZSB7IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSB9OwotICAgICAg
ICBJbmxpbmVMYXlvdXRVbml0IG1fdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGggeyAwIH07Ci0gICAg
ICAgIE9wdGlvbmFsPExpbmVSdW46OlRleHQ+IG1fdGV4dENvbnRlbnQ7Ci0gICAgICAgIExpbmVS
dW46OkV4cGFuc2lvbiBtX2V4cGFuc2lvbjsKLSAgICAgICAgdW5zaWduZWQgbV9leHBhbnNpb25P
cHBvcnR1bml0eUNvdW50IHsgMCB9OwotICAgIH07Ci0gICAgdXNpbmcgUnVuTGlzdCA9IFZlY3Rv
cjxSdW4sIDEwPjsKLSAgICBjb25zdCBSdW5MaXN0JiBydW5zKCkgY29uc3QgeyByZXR1cm4gbV9y
dW5zOyB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBhcHBlbmROb25CcmVha2FibGVTcGFjZShjb25z
dCBJbmxpbmVJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsV2lkdGgpOwotICAgIHZvaWQgYXBwZW5kVGV4dENvbnRlbnQoY29uc3QgSW5s
aW5lVGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgdm9pZCBh
cHBlbmROb25SZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVM
YXlvdXRVbml0IG1hcmdpbkJveExvZ2ljYWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBlbmRSZXBsYWNl
ZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IG1hcmdp
bkJveExvZ2ljYWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBlbmRJbmxpbmVCb3hTdGFydChjb25zdCBJ
bmxpbmVJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOwotICAgIHZvaWQgYXBw
ZW5kSW5saW5lQm94RW5kKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBlbmRMaW5lQnJlYWsoY29uc3QgSW5saW5lSXRlbSYpOwot
ICAgIHZvaWQgYXBwZW5kV29yZEJyZWFrT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5lSXRlbSYpOwot
Ci0gICAgdm9pZCByZW1vdmVUcmFpbGluZ1RyaW1tYWJsZUNvbnRlbnQoKTsKLSAgICB2b2lkIHZp
c3VhbGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KElubGluZUxheW91dFVuaXQgZXh0
cmFIb3Jpem9udGFsU3BhY2UpOwotCi0gICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQm
IGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3Q7Ci0KLSAgICBzdHJ1Y3QgVHJpbW1hYmxlVHJhaWxp
bmdDb250ZW50IHsKLSAgICAgICAgVHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KFJ1bkxpc3QmKTsK
LQotICAgICAgICB2b2lkIGFkZEZ1bGx5VHJpbW1hYmxlQ29udGVudChzaXplX3QgcnVuSW5kZXgs
IElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpOwotICAgICAgICB2b2lkIGFkZFBhcnRp
YWxseVRyaW1tYWJsZUNvbnRlbnQoc2l6ZV90IHJ1bkluZGV4LCBJbmxpbmVMYXlvdXRVbml0IHRy
aW1tYWJsZVdpZHRoKTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCByZW1vdmUoKTsKLSAgICAg
ICAgSW5saW5lTGF5b3V0VW5pdCByZW1vdmVQYXJ0aWFsbHlUcmltbWFibGVDb250ZW50KCk7Ci0K
LSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fZnVsbHlU
cmltbWFibGVXaWR0aCArIG1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGg7IH0KLSAgICAgICAgYm9v
bCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIW1fZmlyc3RUcmltbWFibGVSdW5JbmRleC5oYXNW
YWx1ZSgpOyB9Ci0gICAgICAgIGJvb2wgaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxlKCkgY29u
c3QgeyByZXR1cm4gbV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQ7IH0KLSAgICAgICAgYm9vbCBp
c1RyYWlsaW5nUnVuUGFydGlhbGx5VHJpbW1hYmxlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJ0aWFs
bHlUcmltbWFibGVXaWR0aDsgfQotCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLQotICAgIHByaXZh
dGU6Ci0gICAgICAgIFJ1bkxpc3QmIG1fcnVuczsKLSAgICAgICAgT3B0aW9uYWw8c2l6ZV90PiBt
X2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXg7Ci0gICAgICAgIGJvb2wgbV9oYXNGdWxseVRyaW1tYWJs
ZUNvbnRlbnQgeyBmYWxzZSB9OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fZnVsbHlUcmlt
bWFibGVXaWR0aCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX3BhcnRpYWxseVRy
aW1tYWJsZVdpZHRoIHsgMCB9OwotICAgIH07Ci0KLSAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCYgbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKLSAgICBSdW5MaXN0IG1fcnVuczsK
LSAgICBUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQgbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQ7
Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBtX2NvbnRlbnRMb2dpY2FsV2lkdGggeyAwIH07Ci0gICAg
c2l6ZV90IG1fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50IHsgMCB9OwotICAgIE9wdGlv
bmFsPElubGluZUxheW91dFVuaXQ+IG1fdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggeyAwIH07Ci19
OwotCi1pbmxpbmUgdm9pZCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OnJlc2V0KCkK
LXsKLSAgICBtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCA9IGZhbHNlOwotICAgIG1fZmlyc3RU
cmltbWFibGVSdW5JbmRleCA9IHsgfTsKLSAgICBtX2Z1bGx5VHJpbW1hYmxlV2lkdGggPSB7IH07
Ci0gICAgbV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aCA9IHsgfTsKLX0KLQotaW5saW5lIExpbmU6
OlJ1bjo6VHJhaWxpbmdXaGl0ZXNwYWNlIExpbmU6OlJ1bjo6dHJhaWxpbmdXaGl0ZXNwYWNlVHlw
ZShjb25zdCBJbmxpbmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0ZW0pIGNvbnN0Ci17Ci0gICAgaWYg
KCFpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKLSAgICAgICAgcmV0dXJuIFRyYWlsaW5n
V2hpdGVzcGFjZTo6Tm9uZTsKLSAgICBpZiAoSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZl
U3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpCi0gICAgICAgIHJldHVybiBUcmFpbGluZ1do
aXRlc3BhY2U6Ok5vdENvbGxhcHNpYmxlOwotICAgIGlmIChpbmxpbmVUZXh0SXRlbS5sZW5ndGgo
KSA9PSAxKQotICAgICAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzaWJsZTsK
LSAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQ7Ci19Ci0KLWlubGluZSB2
b2lkIExpbmU6OlJ1bjo6c2V0TmVlZHNIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBoeXBoZW5Mb2dp
Y2FsV2lkdGgpCi17Ci0gICAgQVNTRVJUKG1fdGV4dENvbnRlbnQpOwotICAgIG1fdGV4dENvbnRl
bnQtPnNldE5lZWRzSHlwaGVuKCk7Ci0gICAgbV9sb2dpY2FsV2lkdGggKz0gaHlwaGVuTG9naWNh
bFdpZHRoOwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5jcHAKZGVsZXRlZCBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IGVkMjEzYWUwMWNhYTM5NWE3OTg0MjExOGI5OTk3MjMxZThkMjBlMjku
LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5jcHAKKysrIC9kZXYv
bnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwot
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIK
LSNpbmNsdWRlICJJbmxpbmVMaW5lQm94LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJ
TkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAi
TGF5b3V0Q29udGFpbmVyQm94LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1MaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6SW5saW5lTGV2ZWxCb3goY29uc3Qg
Qm94JiBsYXlvdXRCb3gsIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91
dFNpemUgbG9naWNhbFNpemUsIFR5cGUgdHlwZSkKLSAgICA6IG1fbGF5b3V0Qm94KG1ha2VXZWFr
UHRyKGxheW91dEJveCkpCi0gICAgLCBtX2xvZ2ljYWxSZWN0KHsgfSwgbG9naWNhbExlZnQsIGxv
Z2ljYWxTaXplLndpZHRoKCksIGxvZ2ljYWxTaXplLmhlaWdodCgpKQotICAgICwgbV90eXBlKHR5
cGUpCi17Ci19Ci0KLXZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldEJhc2VsaW5lKElu
bGluZUxheW91dFVuaXQgYmFzZWxpbmUpCi17Ci0gICAgLy8gRklYTUU6IFJlbW92ZSBsZWdhY3kg
cm91bmRpbmcuCi0gICAgbV9iYXNlbGluZSA9IHJvdW5kVG9JbnQoYmFzZWxpbmUpOwotfQotCi12
b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94OjpzZXREZXNjZW50KElubGluZUxheW91dFVuaXQg
ZGVzY2VudCkKLXsKLSAgICAvLyBGSVhNRTogUmVtb3ZlIGxlZ2FjeSByb3VuZGluZy4KLSAgICBt
X2Rlc2NlbnQgPSByb3VuZFRvSW50KGRlc2NlbnQpOwotfQotCi12b2lkIExpbmVCb3g6OklubGlu
ZUxldmVsQm94OjpzZXRMYXlvdXRCb3VuZHMoY29uc3QgTGF5b3V0Qm91bmRzJiBsYXlvdXRCb3Vu
ZHMpCi17Ci0gICAgLy8gRklYTUU6IFJlbW92ZSBsZWdhY3kgcm91bmRpbmcuCi0gICAgbV9sYXlv
dXRCb3VuZHMgPSB7IElubGluZUxheW91dFVuaXQocm91bmRUb0ludChsYXlvdXRCb3VuZHMuYXNj
ZW50KSksIElubGluZUxheW91dFVuaXQocm91bmRUb0ludChsYXlvdXRCb3VuZHMuZGVzY2VudCkp
IH07Ci19Ci0KLXZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldExvZ2ljYWxUb3AoSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsVG9wKQotewotICAgIC8vIEZJWE1FOiBSZW1vdmUgbGVnYWN5
IHJvdW5kaW5nLgotICAgIG1fbG9naWNhbFJlY3Quc2V0VG9wKHJvdW5kVG9JbnQobG9naWNhbFRv
cCkpOwotfQotCi12b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94OjpzZXRMb2dpY2FsSGVpZ2h0
KElubGluZUxheW91dFVuaXQgbG9naWNhbEhlaWdodCkKLXsKLSAgICAvLyBGSVhNRTogUmVtb3Zl
IGxlZ2FjeSByb3VuZGluZy4KLSAgICBtX2xvZ2ljYWxSZWN0LnNldEhlaWdodChyb3VuZFRvSW50
KGxvZ2ljYWxIZWlnaHQpKTsKLX0KLQotdm9pZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0
SGFzQ29udGVudCgpCi17Ci0gICAgQVNTRVJUKGlzSW5saW5lQm94KCkpOwotICAgIG1faGFzQ29u
dGVudCA9IHRydWU7Ci19Ci0KLWJvb2wgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6Omhhc0xpbmVC
b3hSZWxhdGl2ZUFsaWdubWVudCgpIGNvbnN0Ci17Ci0gICAgYXV0byB2ZXJ0aWNhbEFsaWdubWVu
dCA9IGxheW91dEJveCgpLnN0eWxlKCkudmVydGljYWxBbGlnbigpOwotICAgIHJldHVybiB2ZXJ0
aWNhbEFsaWdubWVudCA9PSBWZXJ0aWNhbEFsaWduOjpUb3AgfHwgdmVydGljYWxBbGlnbm1lbnQg
PT0gVmVydGljYWxBbGlnbjo6Qm90dG9tOwotfQotCi1MaW5lQm94OjpMaW5lQm94KGNvbnN0IEJv
eCYgcm9vdExheW91dEJveCwgY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIGxvZ2ljYWxUb3BsZWZ0
LCBJbmxpbmVMYXlvdXRVbml0IGxpbmVMb2dpY2FsV2lkdGgsIElubGluZUxheW91dFVuaXQgY29u
dGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgsIHNp
emVfdCBub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQpCi0gICAgOiBtX2xvZ2ljYWxSZWN0
KGxvZ2ljYWxUb3BsZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgbGluZUxvZ2ljYWxXaWR0aCwgeyB9
IH0pCi0gICAgLCBtX2NvbnRlbnRMb2dpY2FsV2lkdGgoY29udGVudExvZ2ljYWxXaWR0aCkKLSAg
ICAsIG1fcm9vdElubGluZUJveChyb290TGF5b3V0Qm94LCBjb250ZW50TG9naWNhbExlZnQsIElu
bGluZUxheW91dFNpemUgeyBjb250ZW50TG9naWNhbFdpZHRoLCB7IH0gfSwgSW5saW5lTGV2ZWxC
b3g6OlR5cGU6OlJvb3RJbmxpbmVCb3gpCi17Ci0gICAgbV9ub25Sb290SW5saW5lTGV2ZWxCb3hM
aXN0LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50
KTsKLSAgICBtX25vblJvb3RJbmxpbmVMZXZlbEJveE1hcC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5
KG5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCk7Ci19Ci0KLXZvaWQgTGluZUJveDo6YWRk
SW5saW5lTGV2ZWxCb3goSW5saW5lTGV2ZWxCb3gmJiBpbmxpbmVMZXZlbEJveCkKLXsKLSAgICBt
X2JveFR5cGVzLmFkZChpbmxpbmVMZXZlbEJveC50eXBlKCkpOwotICAgIG1fbm9uUm9vdElubGlu
ZUxldmVsQm94TWFwLnNldCgmaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCksIG1fbm9uUm9vdElu
bGluZUxldmVsQm94TGlzdC5zaXplKCkpOwotICAgIG1fbm9uUm9vdElubGluZUxldmVsQm94TGlz
dC5hcHBlbmQoV1RGTW92ZShpbmxpbmVMZXZlbEJveCkpOwotfQotCi1JbmxpbmVSZWN0IExpbmVC
b3g6OmxvZ2ljYWxSZWN0Rm9yVGV4dFJ1bihjb25zdCBMaW5lOjpSdW4mIHJ1bikgY29uc3QKLXsK
LSAgICBBU1NFUlQocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc1NvZnRMaW5lQnJlYWsoKSk7Ci0gICAg
YXV0byogcGFyZW50SW5saW5lQm94ID0gJmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KHJ1bi5s
YXlvdXRCb3goKS5wYXJlbnQoKSk7Ci0gICAgQVNTRVJUKHBhcmVudElubGluZUJveC0+aXNJbmxp
bmVCb3goKSk7Ci0gICAgYXV0byYgZm9udE1ldHJpY3MgPSBwYXJlbnRJbmxpbmVCb3gtPnN0eWxl
KCkuZm9udE1ldHJpY3MoKTsKLSAgICBhdXRvIHJ1bmxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxpbmVC
b3gtPmxvZ2ljYWxUb3AoKSArIHBhcmVudElubGluZUJveC0+YmFzZWxpbmUoKSAtIGZvbnRNZXRy
aWNzLmFzY2VudCgpOwotCi0gICAgd2hpbGUgKHBhcmVudElubGluZUJveCAhPSAmbV9yb290SW5s
aW5lQm94ICYmICFwYXJlbnRJbmxpbmVCb3gtPmhhc0xpbmVCb3hSZWxhdGl2ZUFsaWdubWVudCgp
KSB7Ci0gICAgICAgIHBhcmVudElubGluZUJveCA9ICZpbmxpbmVMZXZlbEJveEZvckxheW91dEJv
eChwYXJlbnRJbmxpbmVCb3gtPmxheW91dEJveCgpLnBhcmVudCgpKTsKLSAgICAgICAgQVNTRVJU
KHBhcmVudElubGluZUJveC0+aXNJbmxpbmVCb3goKSk7Ci0gICAgICAgIHJ1bmxvZ2ljYWxUb3Ag
Kz0gcGFyZW50SW5saW5lQm94LT5sb2dpY2FsVG9wKCk7Ci0gICAgfQotICAgIElubGluZUxheW91
dFVuaXQgbG9naWNhbEhlaWdodCA9IGZvbnRNZXRyaWNzLmhlaWdodCgpOwotICAgIHJldHVybiB7
IHJ1bmxvZ2ljYWxUb3AsIG1fcm9vdElubGluZUJveC5sb2dpY2FsTGVmdCgpICsgcnVuLmxvZ2lj
YWxMZWZ0KCksIHJ1bi5sb2dpY2FsV2lkdGgoKSwgbG9naWNhbEhlaWdodCB9OwotfQotCi1Jbmxp
bmVSZWN0IExpbmVCb3g6OmxvZ2ljYWxSZWN0Rm9yTGluZUJyZWFrQm94KGNvbnN0IEJveCYgbGF5
b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNMaW5lQnJlYWtCb3goKSk7
Ci0gICAgcmV0dXJuIGxvZ2ljYWxSZWN0Rm9ySW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94KTsKLX0K
LQotSW5saW5lUmVjdCBMaW5lQm94Ojpsb2dpY2FsUmVjdEZvcklubGluZUxldmVsQm94KGNvbnN0
IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbmxpbmVM
ZXZlbEJveCgpIHx8IGxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKTsKLSAgICAvLyBJbmxpbmUg
bGV2ZWwgYm94ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZWlyIHBhcmVudCB1bmxlc3MgdGhlIHZlcnRp
Y2FsIGFsaWdubWVudCBtYWtlcyB0aGVtIHJlbGF0aXZlIHRvIHRoZSBsaW5lIGJveCAoZS5nLiB0
b3AsIGJvdHRvbSkuCi0gICAgYXV0byogaW5saW5lQm94ID0gJmlubGluZUxldmVsQm94Rm9yTGF5
b3V0Qm94KGxheW91dEJveCk7Ci0gICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmVjdCA9IGlubGlu
ZUJveC0+bG9naWNhbFJlY3QoKTsKLSAgICBpZiAoaW5saW5lQm94LT5oYXNMaW5lQm94UmVsYXRp
dmVBbGlnbm1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGlubGluZUJveExvZ2ljYWxSZWN0OwotCi0g
ICAgLy8gRmFzdCBwYXRoIGZvciBpbmxpbmUgbGV2ZWwgYm94ZXMgb24gdGhlIHJvb3QgaW5saW5l
IGJveCAoZS5nIDxkaXY+PGltZz48L2Rpdj4pLgotICAgIGlmICgmbGF5b3V0Qm94LnBhcmVudCgp
ID09ICZtX3Jvb3RJbmxpbmVCb3gubGF5b3V0Qm94KCkpIHsKLSAgICAgICAgaW5saW5lQm94TG9n
aWNhbFJlY3QubW92ZVZlcnRpY2FsbHkobV9yb290SW5saW5lQm94LmxvZ2ljYWxUb3AoKSk7Ci0g
ICAgICAgIHJldHVybiBpbmxpbmVCb3hMb2dpY2FsUmVjdDsKLSAgICB9Ci0KLSAgICAvLyBlLmcg
PGRpdj48c3Bhbj48aW1nPjwvc3Bhbj48L2Rpdj4KLSAgICBhdXRvIGlubGluZUJveEFic29sdXRl
bG9naWNhbFRvcCA9IGlubGluZUJveExvZ2ljYWxSZWN0LnRvcCgpOwotICAgIHdoaWxlIChpbmxp
bmVCb3ggIT0gJm1fcm9vdElubGluZUJveCAmJiAhaW5saW5lQm94LT5oYXNMaW5lQm94UmVsYXRp
dmVBbGlnbm1lbnQoKSkgewotICAgICAgICBpbmxpbmVCb3ggPSAmaW5saW5lTGV2ZWxCb3hGb3JM
YXlvdXRCb3goaW5saW5lQm94LT5sYXlvdXRCb3goKS5wYXJlbnQoKSk7Ci0gICAgICAgIEFTU0VS
VChpbmxpbmVCb3gtPmlzSW5saW5lQm94KCkpOwotICAgICAgICBpbmxpbmVCb3hBYnNvbHV0ZWxv
Z2ljYWxUb3AgKz0gaW5saW5lQm94LT5sb2dpY2FsVG9wKCk7Ci0gICAgfQotICAgIHJldHVybiBJ
bmxpbmVSZWN0IHsgaW5saW5lQm94QWJzb2x1dGVsb2dpY2FsVG9wLCBpbmxpbmVCb3hMb2dpY2Fs
UmVjdC5sZWZ0KCksIGlubGluZUJveExvZ2ljYWxSZWN0LndpZHRoKCksIGlubGluZUJveExvZ2lj
YWxSZWN0LmhlaWdodCgpIH07Ci19Ci0KLUlubGluZVJlY3QgTGluZUJveDo6bG9naWNhbEJvcmRl
ckJveEZvckF0b21pY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBC
b3hHZW9tZXRyeSYgYm94R2VvbWV0cnkpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5p
c0F0b21pY0lubGluZUxldmVsQm94KCkpOwotICAgIGF1dG8gbG9naWNhbFJlY3QgPSBsb2dpY2Fs
UmVjdEZvcklubGluZUxldmVsQm94KGxheW91dEJveCk7Ci0gICAgLy8gSW5saW5lIGxldmVsIGJv
eGVzIHVzZSB0aGVpciBtYXJnaW4gYm94IGZvciB2ZXJ0aWNhbCBhbGlnbm1lbnQuIExldCdzIGNv
dmVydCB0aGVtIHRvIGJvcmRlciBib3hlcy4KLSAgICBsb2dpY2FsUmVjdC5tb3ZlVmVydGljYWxs
eShib3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUoKSk7Ci0gICAgYXV0byB2ZXJ0aWNhbE1hcmdpbiA9
IGJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpICsgYm94R2VvbWV0cnkubWFyZ2luQWZ0ZXIoKTsK
LSAgICBsb2dpY2FsUmVjdC5leHBhbmRWZXJ0aWNhbGx5KC12ZXJ0aWNhbE1hcmdpbik7Ci0gICAg
cmV0dXJuIGxvZ2ljYWxSZWN0OwotfQotCi1JbmxpbmVSZWN0IExpbmVCb3g6OmxvZ2ljYWxCb3Jk
ZXJCb3hGb3JJbmxpbmVCb3goY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEJveEdlb21ldHJ5
JiBib3hHZW9tZXRyeSkgY29uc3QKLXsKLSAgICBhdXRvIGxvZ2ljYWxSZWN0ID0gbG9naWNhbFJl
Y3RGb3JJbmxpbmVMZXZlbEJveChsYXlvdXRCb3gpOwotICAgIC8vIFRoaXMgbG9naWNhbCByZWN0
IGlzIGFzIHRhbGwgYXMgdGhlICJ0ZXh0IiBjb250ZW50IGlzLiBMZXQncyBhZGp1c3Qgd2l0aCB2
ZXJ0aWNhbCBib3JkZXIgYW5kIHBhZGRpbmcuCi0gICAgYXV0byB2ZXJ0aWNhbEJvcmRlckFuZFBh
ZGRpbmcgPSBib3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgYm94R2VvbWV0cnkudmVydGlj
YWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KTsKLSAgICBsb2dpY2FsUmVjdC5leHBhbmRWZXJ0aWNh
bGx5KHZlcnRpY2FsQm9yZGVyQW5kUGFkZGluZyk7Ci0gICAgbG9naWNhbFJlY3QubW92ZVZlcnRp
Y2FsbHkoLShib3hHZW9tZXRyeS5ib3JkZXJUb3AoKSArIGJveEdlb21ldHJ5LnBhZGRpbmdUb3Ao
KS52YWx1ZU9yKDBfbHUpKSk7Ci0gICAgcmV0dXJuIGxvZ2ljYWxSZWN0OwotfQotCi19IC8vIG5h
bWVzcGFjZSBMYXlvdXQKLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKLQotI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94
LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94
LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MmU5NjYzODM4ZWQzMmE4ZGRiMTli
NWZlYWQyNDY5Nzk5ZjFjMTAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGlu
ZUJveC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJh
Z21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5j
bHVkZSAiSW5saW5lTGluZS5oIgotI2luY2x1ZGUgIklubGluZVJlY3QuaCIKLSNpbmNsdWRlIDx3
dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotI2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYuaD4KLSNpbmNs
dWRlIDx3dGYvV2Vha1B0ci5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5
b3V0IHsKLQotY2xhc3MgQm94R2VvbWV0cnk7Ci1jbGFzcyBJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dDsKLWNsYXNzIExpbmVCb3hCdWlsZGVyOwotc3RydWN0IFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdu
bWVudDsKLQotLy8gICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18gTGluZSBCb3gKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gfCAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAotLy8gfCAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0gUm9v
dCBJbmxpbmUgQm94Ci0vLyB8fCAgIF9fX19fICAgIF9fXyAgICAgIF9fXyAgICAgICAgICB8ICAg
ICAgICAgICAgICAgICAgICB8Ci0vLyB8fCAgfCAgICAgICAgLyAgIFwgICAgLyAgIFwgICAgICAg
ICB8ICBJbmxpbmUgTGV2ZWwgQm94ICB8Ci0vLyB8fCAgfF9fX19fICB8ICAgICB8ICB8ICAgICB8
ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgIGFzY2VudAotLy8gfHwgIHwgICAgICAg
fCAgICAgfCAgfCAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAotLy8gfHxfX3xf
X19fX19fX1xfX18vX19fX1xfX18vX19fX19fX19ffF9fX19fX19fX19fX19fX19fX19ffF9fX19f
X18gYWxpZ25tZW50X2Jhc2VsaW5lCi0vLyB8fAotLy8gfHwgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW50Ci0vLyB8fF9fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotLy8g
fF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX18KLS8vIFRoZSByZXN1bHRpbmcgcmVjdGFuZ3VsYXIgYXJlYSB0aGF0IGNvbnRhaW5z
IHRoZSBib3hlcyB0aGF0IGZvcm0gYSBzaW5nbGUgbGluZSBvZiBpbmxpbmUtbGV2ZWwgY29udGVu
dCBpcyBjYWxsZWQgYSBsaW5lIGJveC4KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5s
aW5lLTMvI21vZGVsCi1jbGFzcyBMaW5lQm94IHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRF
RDsKLXB1YmxpYzoKLSAgICBzdHJ1Y3QgSW5saW5lTGV2ZWxCb3ggewotICAgIHB1YmxpYzoKLSAg
ICAgICAgc3RhdGljIExpbmVCb3g6OklubGluZUxldmVsQm94IGNyZWF0ZUlubGluZUJveChjb25z
dCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxv
Z2ljYWxXaWR0aCk7Ci0gICAgICAgIHN0YXRpYyBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBjcmVh
dGVBdG9taWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplKTsKLSAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGlu
ZUxldmVsQm94IGNyZWF0ZUxpbmVCcmVha0JveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0
IGxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGluZUxldmVsQm94IGNy
ZWF0ZUdlbmVyaWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxv
Z2ljYWxMZWZ0KTsKLQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKCkgY29uc3Qg
eyByZXR1cm4gbV9iYXNlbGluZTsgfQotICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0
PiBkZXNjZW50KCkgY29uc3QgeyByZXR1cm4gbV9kZXNjZW50OyB9Ci0gICAgICAgIC8vIFNlZSBo
dHRwczovL3d3dy53My5vcmcvVFIvY3NzLWlubGluZS0zLyNsYXlvdXQtYm91bmRzCi0gICAgICAg
IHN0cnVjdCBMYXlvdXRCb3VuZHMgewotICAgICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBoZWln
aHQoKSBjb25zdCB7IHJldHVybiBhc2NlbnQgKyBkZXNjZW50OyB9Ci0gICAgICAgICAgICBib29s
IG9wZXJhdG9yPT0oY29uc3QgTGF5b3V0Qm91bmRzJiBvdGhlcikgY29uc3QgeyByZXR1cm4gYXNj
ZW50ID09IG90aGVyLmFzY2VudCAmJiBkZXNjZW50ID09IG90aGVyLmRlc2NlbnQ7IH0KLQotICAg
ICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBhc2NlbnQgeyAwIH07Ci0gICAgICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IGRlc2NlbnQgeyAwIH07Ci0gICAgICAgIH07Ci0gICAgICAgIExheW91dEJv
dW5kcyBsYXlvdXRCb3VuZHMoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJvdW5kczsgfQotCi0g
ICAgICAgIGJvb2wgaGFzQ29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzQ29udGVudDsgfQot
ICAgICAgICB2b2lkIHNldEhhc0NvbnRlbnQoKTsKLQotICAgICAgICBWZXJ0aWNhbEFsaWduIHZl
cnRpY2FsQWxpZ24oKSBjb25zdCB7IHJldHVybiBsYXlvdXRCb3goKS5zdHlsZSgpLnZlcnRpY2Fs
QWxpZ24oKTsgfQotICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0dXJu
ICptX2xheW91dEJveDsgfQotICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUoKSBjb25z
dCB7IHJldHVybiBtX2xheW91dEJveC0+c3R5bGUoKTsgfQotCi0gICAgICAgIGJvb2wgaXNJbmxp
bmVCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gVHlwZTo6SW5saW5lQm94IHx8IG1fdHlw
ZSA9PSBUeXBlOjpSb290SW5saW5lQm94OyB9Ci0gICAgICAgIGJvb2wgaXNSb290SW5saW5lQm94
KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IFR5cGU6OlJvb3RJbmxpbmVCb3g7IH0KLSAgICAg
ICAgYm9vbCBpc0F0b21pY0lubGluZUxldmVsQm94KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09
IFR5cGU6OkF0b21pY0lubGluZUxldmVsQm94OyB9Ci0gICAgICAgIGJvb2wgaXNMaW5lQnJlYWtC
b3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gVHlwZTo6TGluZUJyZWFrQm94OyB9Ci0gICAg
ICAgIGJvb2wgaGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkgY29uc3Q7Ci0KLSAgICAgICAg
ZW51bSBjbGFzcyBUeXBlIDogdWludDhfdCB7Ci0gICAgICAgICAgICBJbmxpbmVCb3ggICAgICAg
ICAgICAgPSAxIDw8IDAsCi0gICAgICAgICAgICBSb290SW5saW5lQm94ICAgICAgICAgPSAxIDw8
IDEsCi0gICAgICAgICAgICBBdG9taWNJbmxpbmVMZXZlbEJveCAgPSAxIDw8IDIsCi0gICAgICAg
ICAgICBMaW5lQnJlYWtCb3ggICAgICAgICAgPSAxIDw8IDMsCi0gICAgICAgICAgICBHZW5lcmlj
SW5saW5lTGV2ZWxCb3ggPSAxIDw8IDQKLSAgICAgICAgfTsKLSAgICAgICAgVHlwZSB0eXBlKCkg
Y29uc3QgeyByZXR1cm4gbV90eXBlOyB9Ci0KLSAgICAgICAgSW5saW5lTGV2ZWxCb3goY29uc3Qg
Qm94JiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0U2l6ZSwgVHlw
ZSk7Ci0gICAgICAgIElubGluZUxldmVsQm94KCkgPSBkZWZhdWx0OwotCi0gICAgcHJpdmF0ZToK
LSAgICAgICAgZnJpZW5kIHN0cnVjdCBTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ7Ci0gICAg
ICAgIGZyaWVuZCBjbGFzcyBMaW5lQm94QnVpbGRlcjsKLSAgICAgICAgZnJpZW5kIGNsYXNzIExp
bmVCb3g7Ci0KLSAgICAgICAgY29uc3QgSW5saW5lUmVjdCYgbG9naWNhbFJlY3QoKSBjb25zdCB7
IHJldHVybiBtX2xvZ2ljYWxSZWN0OyB9Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbG9naWNh
bFRvcCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3QudG9wKCk7IH0KLSAgICAgICAgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tKCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVj
dC5ib3R0b20oKTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KCkgY29u
c3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5sZWZ0KCk7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0LndpZHRoKCk7
IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KCkgY29uc3QgeyByZXR1
cm4gbV9sb2dpY2FsUmVjdC5oZWlnaHQoKTsgfQotCi0gICAgICAgIHZvaWQgc2V0TG9naWNhbFdp
ZHRoKElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKSB7IG1fbG9naWNhbFJlY3Quc2V0V2lk
dGgobG9naWNhbFdpZHRoKTsgfQotICAgICAgICB2b2lkIHNldExvZ2ljYWxIZWlnaHQoSW5saW5l
TGF5b3V0VW5pdCk7Ci0gICAgICAgIHZvaWQgc2V0TG9naWNhbFRvcChJbmxpbmVMYXlvdXRVbml0
KTsKLSAgICAgICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0KTsKLSAgICAgICAg
dm9pZCBzZXREZXNjZW50KElubGluZUxheW91dFVuaXQpOwotICAgICAgICB2b2lkIHNldExheW91
dEJvdW5kcyhjb25zdCBMYXlvdXRCb3VuZHMmKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFdl
YWtQdHI8Y29uc3QgQm94PiBtX2xheW91dEJveDsKLSAgICAgICAgLy8gVGhpcyBpcyB0aGUgY29t
YmluYXRpb24gb2YgbWFyZ2luIGFuZCBib3JkZXIgYm94ZXMuIElubGluZSBsZXZlbCBib3hlcyBh
cmUgdmVydGljYWxseSBhbGlnbmVkIHVzaW5nIHRoZWlyIG1hcmdpbiBib3hlcy4KLSAgICAgICAg
SW5saW5lUmVjdCBtX2xvZ2ljYWxSZWN0OwotICAgICAgICBMYXlvdXRCb3VuZHMgbV9sYXlvdXRC
b3VuZHM7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbV9iYXNlbGluZSB7IDAgfTsKLSAgICAg
ICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gbV9kZXNjZW50OwotICAgICAgICBib29sIG1f
aGFzQ29udGVudCB7IGZhbHNlIH07Ci0gICAgICAgIFR5cGUgbV90eXBlIHsgVHlwZTo6SW5saW5l
Qm94IH07Ci0gICAgfTsKLQotICAgIExpbmVCb3goY29uc3QgQm94JiByb290TGF5b3V0Qm94LCBj
b25zdCBJbmxpbmVMYXlvdXRQb2ludCYgbG9naWNhbFRvcExlZnQsIElubGluZUxheW91dFVuaXQg
Y29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxpbmVMb2dpY2FsV2lkdGgsIElu
bGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCwgc2l6ZV90IG5vblNwYW5uaW5nSW5s
aW5lTGV2ZWxCb3hDb3VudCk7Ci0KLSAgICBjb25zdCBJbmxpbmVSZWN0JiBsb2dpY2FsUmVjdCgp
IGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3Q7IH0KLSAgICBJbmxpbmVMYXlvdXRVbml0IGxv
Z2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxTaXplKCkud2lkdGgoKTsgfQotICAg
IElubGluZUxheW91dFVuaXQgbG9naWNhbEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxT
aXplKCkuaGVpZ2h0KCk7IH0KLSAgICBJbmxpbmVMYXlvdXRQb2ludCBsb2dpY2FsVG9wTGVmdCgp
IGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkudG9wTGVmdCgpOyB9Ci0gICAgSW5saW5lTGF5
b3V0U2l6ZSBsb2dpY2FsU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkuc2l6ZSgp
OyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoKCkgY29uc3QgeyBy
ZXR1cm4gbV9jb250ZW50TG9naWNhbFdpZHRoOyB9Ci0KLSAgICAvLyBOb3RlIHRoYXQgdGhlIGxp
bmUgY2FuIGhhdmUgbWFueSBpbmxpbmUgYm94ZXMgYW5kIGJlICJlbXB0eSIgdGhlIHNhbWUgdGlt
ZSBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2Rpdj4KLSAgICBib29sIGhh
c0NvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX2hhc0NvbnRlbnQ7IH0KLSAgICBib29sIGhhc0lu
bGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYm94VHlwZXMuY29udGFpbnMoSW5saW5lTGV2ZWxC
b3g6OlR5cGU6OklubGluZUJveCk7IH0KLSAgICBib29sIGhhc05vbklubGluZUJveCgpIGNvbnN0
IHsgcmV0dXJuIG1fYm94VHlwZXMuY29udGFpbnNBbnkoeyBJbmxpbmVMZXZlbEJveDo6VHlwZTo6
QXRvbWljSW5saW5lTGV2ZWxCb3gsIElubGluZUxldmVsQm94OjpUeXBlOjpMaW5lQnJlYWtCb3gs
IElubGluZUxldmVsQm94OjpUeXBlOjpHZW5lcmljSW5saW5lTGV2ZWxCb3ggfSk7IH0KLSAgICBi
b29sIGhhc0F0b21pY0lubGluZUxldmVsQm94KCkgY29uc3QgeyByZXR1cm4gbV9ib3hUeXBlcy5j
b250YWlucyhJbmxpbmVMZXZlbEJveDo6VHlwZTo6QXRvbWljSW5saW5lTGV2ZWxCb3gpOyB9Ci0K
LSAgICBjb25zdCBJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3goY29u
c3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8TGluZUJveCY+KCp0
aGlzKS5pbmxpbmVMZXZlbEJveEZvckxheW91dEJveChsYXlvdXRCb3gpOyB9Ci0KLSAgICBJbmxp
bmVSZWN0IGxvZ2ljYWxSZWN0Rm9yVGV4dFJ1bihjb25zdCBMaW5lOjpSdW4mKSBjb25zdDsKLSAg
ICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9yTGluZUJyZWFrQm94KGNvbnN0IEJveCYpIGNvbnN0
OwotICAgIElubGluZVJlY3QgbG9naWNhbFJlY3RGb3JSb290SW5saW5lQm94KCkgY29uc3QgeyBy
ZXR1cm4gbV9yb290SW5saW5lQm94LmxvZ2ljYWxSZWN0KCk7IH0KLSAgICBJbmxpbmVSZWN0IGxv
Z2ljYWxCb3JkZXJCb3hGb3JBdG9taWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBjb25zdCBC
b3hHZW9tZXRyeSYpIGNvbnN0OwotICAgIElubGluZVJlY3QgbG9naWNhbEJvcmRlckJveEZvcklu
bGluZUJveChjb25zdCBCb3gmLCBjb25zdCBCb3hHZW9tZXRyeSYpIGNvbnN0OwotCi0gICAgY29u
c3QgSW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX3Jvb3RJ
bmxpbmVCb3g7IH0KLSAgICB1c2luZyBJbmxpbmVMZXZlbEJveExpc3QgPSBWZWN0b3I8SW5saW5l
TGV2ZWxCb3g+OwotICAgIGNvbnN0IElubGluZUxldmVsQm94TGlzdCYgbm9uUm9vdElubGluZUxl
dmVsQm94ZXMoKSBjb25zdCB7IHJldHVybiBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Q7IH0K
LQotICAgIElubGluZUxheW91dFVuaXQgYWxpZ25tZW50QmFzZWxpbmUoKSBjb25zdCB7IHJldHVy
biBtX3Jvb3RJbmxpbmVCb3gubG9naWNhbFRvcCgpICsgbV9yb290SW5saW5lQm94LmJhc2VsaW5l
KCk7IH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgTGluZUJveEJ1aWxkZXI7Ci0KLSAg
ICB2b2lkIHNldExvZ2ljYWxIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KSB7
IG1fbG9naWNhbFJlY3Quc2V0SGVpZ2h0KGxvZ2ljYWxIZWlnaHQpOyB9Ci0KLSAgICB2b2lkIGFk
ZElubGluZUxldmVsQm94KElubGluZUxldmVsQm94JiYpOwotICAgIElubGluZUxldmVsQm94TGlz
dCYgbm9uUm9vdElubGluZUxldmVsQm94ZXMoKSB7IHJldHVybiBtX25vblJvb3RJbmxpbmVMZXZl
bEJveExpc3Q7IH0KLQotICAgIElubGluZUxldmVsQm94JiByb290SW5saW5lQm94KCkgeyByZXR1
cm4gbV9yb290SW5saW5lQm94OyB9Ci0KLSAgICBJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxC
b3hGb3JMYXlvdXRCb3goY29uc3QgQm94JiBsYXlvdXRCb3gpIHsgcmV0dXJuICZsYXlvdXRCb3gg
PT0gJm1fcm9vdElubGluZUJveC5sYXlvdXRCb3goKSA/IG1fcm9vdElubGluZUJveCA6IG1fbm9u
Um9vdElubGluZUxldmVsQm94TGlzdFttX25vblJvb3RJbmxpbmVMZXZlbEJveE1hcC5nZXQoJmxh
eW91dEJveCldOyB9Ci0gICAgSW5saW5lUmVjdCBsb2dpY2FsUmVjdEZvcklubGluZUxldmVsQm94
KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdDsKLQotICAgIHZvaWQgc2V0SGFzQ29udGVudChi
b29sIGhhc0NvbnRlbnQpIHsgbV9oYXNDb250ZW50ID0gaGFzQ29udGVudDsgfQotCi1wcml2YXRl
OgotICAgIElubGluZVJlY3QgbV9sb2dpY2FsUmVjdDsKLSAgICBJbmxpbmVMYXlvdXRVbml0IG1f
Y29udGVudExvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICBib29sIG1faGFzQ29udGVudCB7IGZhbHNl
IH07Ci0gICAgT3B0aW9uU2V0PElubGluZUxldmVsQm94OjpUeXBlPiBtX2JveFR5cGVzOwotCi0g
ICAgSW5saW5lTGV2ZWxCb3ggbV9yb290SW5saW5lQm94OwotICAgIElubGluZUxldmVsQm94TGlz
dCBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Q7Ci0KLSAgICBIYXNoTWFwPGNvbnN0IEJveCos
IHNpemVfdD4gbV9ub25Sb290SW5saW5lTGV2ZWxCb3hNYXA7Ci19OwotCi1pbmxpbmUgTGluZUJv
eDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUF0b21pY0lu
bGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIGxvZ2ljYWxTaXplKQotewotICAgIHJldHVybiBMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveCB7IGxheW91dEJveCwgbG9naWNhbExlZnQsIGxvZ2ljYWxTaXpl
LCBUeXBlOjpBdG9taWNJbmxpbmVMZXZlbEJveCB9OwotfQotCi1pbmxpbmUgTGluZUJveDo6SW5s
aW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUlubGluZUJveChjb25z
dCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgcmV0dXJuIExpbmVCb3g6OklubGluZUxldmVs
Qm94IHsgbGF5b3V0Qm94LCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0U2l6ZSB7IGxvZ2ljYWxX
aWR0aCwgeyB9IH0sIFR5cGU6OklubGluZUJveCB9OwotfQotCi1pbmxpbmUgTGluZUJveDo6SW5s
aW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUxpbmVCcmVha0JveChj
b25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCkKLXsKLSAg
ICByZXR1cm4gTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggeyBsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0
LCBJbmxpbmVMYXlvdXRTaXplIHsgfSwgVHlwZTo6TGluZUJyZWFrQm94IH07Ci19Ci0KLWlubGlu
ZSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRl
R2VuZXJpY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxMZWZ0KQotewotICAgIHJldHVybiBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCB7
IGxheW91dEJveCwgbG9naWNhbExlZnQsIElubGluZUxheW91dFNpemUgeyB9LCBUeXBlOjpHZW5l
cmljSW5saW5lTGV2ZWxCb3ggfTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCdWlsZGVyLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCdWls
ZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2MjZlYTBlZTVhNjNhNGE5
NjJiMTU1Y2U2MTA2NTMwZmNlMjJmMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVMaW5lQnVpbGRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NTcgKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
Ci0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgot
ICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5lQnVpbGRlci5o
IgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJG
bG9hdGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oIgot
I2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0j
aW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKLSNpbmNsdWRlICJUZXh0VXRpbC5oIgotI2luY2x1ZGUg
PHd0Zi91bmljb2RlL0NoYXJhY3Rlck5hbWVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi1zdGF0aWMgaW5saW5lIGJvb2wgZW5kc1dpdGhTb2Z0V3JhcE9w
cG9ydHVuaXR5KGNvbnN0IElubGluZVRleHRJdGVtJiBjdXJyZW50VGV4dEl0ZW0sIGNvbnN0IElu
bGluZVRleHRJdGVtJiBuZXh0SW5saW5lVGV4dEl0ZW0pCi17Ci0gICAgQVNTRVJUKCFuZXh0SW5s
aW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpOwotICAgIC8vIFdlIGFyZSBhdCB0aGUgcG9zaXRp
b24gYWZ0ZXIgYSB3aGl0ZXNwYWNlLgotICAgIGlmIChjdXJyZW50VGV4dEl0ZW0uaXNXaGl0ZXNw
YWNlKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIC8vIFdoZW4gYm90aCB0aGVzZSBub24t
d2hpdGVzcGFjZSBydW5zIGJlbG9uZyB0byB0aGUgc2FtZSBsYXlvdXQgYm94LCBpdCdzIGd1YXJh
bnRlZWQgdGhhdAotICAgIC8vIHRoZXkgYXJlIHNwbGl0IGF0IGEgc29mdCBicmVha2luZyBvcHBv
cnR1bml0eS4gU2VlIElubGluZVRleHRJdGVtOjptb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24u
Ci0gICAgaWYgKCZjdXJyZW50VGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpID09ICZuZXh0SW5saW5l
VGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAvLyBO
b3cgd2UgbmVlZCB0byBjb2xsZWN0IGF0IGxlYXN0IDMgYWRqYWNlbnQgY2hhcmFjdGVycyB0byBi
ZSBhYmxlIHRvIG1ha2UgYSBkZWNpc2lvbiB3aGV0aGVyIHRoZSBwcmV2aW91cyB0ZXh0IGl0ZW0g
ZW5kcyB3aXRoIGJyZWFraW5nIG9wcG9ydHVuaXR5LgotICAgIC8vIFtleC1dW2FtcGxlXSA8LSBz
ZWNvbmQgdG8gbGFzdFt4XSBsYXN0Wy1dIGN1cnJlbnRbYV0KLSAgICAvLyBXZSBuZWVkIGF0IGxl
YXN0IDEgY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IGlubGluZSB0ZXh0IGl0ZW0gYW5kIDIgbW9y
ZSBmcm9tIHByZXZpb3VzIGlubGluZSBpdGVtcy4KLSAgICBhdXRvIHByZXZpb3VzQ29udGVudCA9
IGN1cnJlbnRUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpOwotICAgIGF1dG8gbGlu
ZUJyZWFrSXRlcmF0b3IgPSBMYXp5TGluZUJyZWFrSXRlcmF0b3IgeyBuZXh0SW5saW5lVGV4dEl0
ZW0uaW5saW5lVGV4dEJveCgpLmNvbnRlbnQoKSB9OwotICAgIGF1dG8gcHJldmlvdXNDb250ZW50
TGVuZ3RoID0gcHJldmlvdXNDb250ZW50Lmxlbmd0aCgpOwotICAgIC8vIEZJWE1FOiBXZSBzaG91
bGQgbG9vayBpbnRvIHRoZSBlbnRpcmUgdW5jb21taXR0ZWQgY29udGVudCBmb3IgbW9yZSB0ZXh0
IGNvbnRleHQuCi0gICAgVUNoYXIgbGFzdENoYXJhY3RlciA9IHByZXZpb3VzQ29udGVudExlbmd0
aCA/IHByZXZpb3VzQ29udGVudFtwcmV2aW91c0NvbnRlbnRMZW5ndGggLSAxXSA6IDA7Ci0gICAg
aWYgKGxhc3RDaGFyYWN0ZXIgPT0gc29mdEh5cGhlbiAmJiBjdXJyZW50VGV4dEl0ZW0uc3R5bGUo
KS5oeXBoZW5zKCkgPT0gSHlwaGVuczo6Tm9uZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IFVDaGFyIHNlY29uZFRvTGFzdENoYXJhY3RlciA9IHByZXZpb3VzQ29udGVudExlbmd0aCA+IDEg
PyBwcmV2aW91c0NvbnRlbnRbcHJldmlvdXNDb250ZW50TGVuZ3RoIC0gMl0gOiAwOwotICAgIGxp
bmVCcmVha0l0ZXJhdG9yLnNldFByaW9yQ29udGV4dChsYXN0Q2hhcmFjdGVyLCBzZWNvbmRUb0xh
c3RDaGFyYWN0ZXIpOwotICAgIC8vIE5vdyBjaGVjayBpZiB3ZSBjYW4gYnJlYWsgcmlnaHQgYXQg
dGhlIGlubGluZSBpdGVtIGJvdW5kYXJ5LgotICAgIC8vIFdpdGggdGhlIFtleC1hbXBsZV0sIGZp
bmROZXh0QnJlYWthYmxlUG9zaXRpb24gc2hvdWxkIHJldHVybiB0aGUgc3RhcnRQb3NpdGlvbiAo
MCkuCi0gICAgLy8gRklYTUU6IENoZWNrIGlmIHRoZXJlJ3MgYSBtb3JlIGNvcnJlY3Qgd2F5IG9m
IGZpbmRpbmcgYnJlYWtpbmcgb3Bwb3J0dW5pdGllcy4KLSAgICByZXR1cm4gIVRleHRVdGlsOjpm
aW5kTmV4dEJyZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCAwLCBuZXh0SW5saW5l
VGV4dEl0ZW0uc3R5bGUoKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0F0U29mdFdyYXBP
cHBvcnR1bml0eShjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQsIGNvbnN0IElubGluZUl0ZW0mIGN1cnJlbnQsIGNvbnN0IElubGluZUl0ZW0mIG5l
eHQpCi17Ci0gICAgLy8gImlzIGF0IiBzaW1wbGUgbWVhbnMgdGhhdCB0aGVyZSdzIGEgc29mdCB3
cmFwIG9wcG9ydHVuaXR5IHJpZ2h0IGFmdGVyIHRoZSBbY3VycmVudF0uCi0gICAgLy8gW3RleHRd
WyBdW3RleHRdW2lubGluZSBib3ggc3RhcnRdLi4uICg8ZGl2PnRleHQgY29udGVudDxzcGFuPi4u
PC9kaXY+KQotICAgIC8vIHNvZnQgd3JhcCBpbmRleGVzOiAwIGFuZCAxIGRlZmluaXRlbHksIDIg
ZGVwZW5kcyBvbiB0aGUgY29udGVudCBhZnRlciB0aGUgW2lubGluZSBib3ggc3RhcnRdLgotCi0g
ICAgLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy10ZXh0LTMvI2xpbmUtYnJlYWstZGV0
YWlscwotICAgIC8vIEZpZ3VyZSBvdXQgaWYgdGhlIG5ldyBpbmNvbWluZyBjb250ZW50IHB1dHMg
dGhlIHVuY29tbWl0dGVkIGNvbnRlbnQgb24gYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkuCi0gICAg
Ly8gZS5nLiBbaW5saW5lIGJveCBzdGFydF1bcHJpb3JfY29udGludW91c19jb250ZW50XVtpbmxp
bmUgYm94IGVuZF0gKDxzcGFuPnByaW9yX2NvbnRpbnVvdXNfY29udGVudDwvc3Bhbj4pCi0gICAg
Ly8gQW4gaW5jb21pbmcgPGltZz4gYm94IHdvdWxkIGVuYWJsZSB1cyB0byBjb21taXQgdGhlICI8
c3Bhbj5wcmlvcl9jb250aW51b3VzX2NvbnRlbnQ8L3NwYW4+IiBjb250ZW50Ci0gICAgLy8gYnV0
IGFuIGluY29taW5nIHRleHQgY29udGVudCB3b3VsZCBub3QgbmVjZXNzYXJpbHkuCi0gICAgQVNT
RVJUKGN1cnJlbnQuaXNUZXh0KCkgfHwgY3VycmVudC5pc0JveCgpIHx8IGN1cnJlbnQuaXNGbG9h
dCgpKTsKLSAgICBBU1NFUlQobmV4dC5pc1RleHQoKSB8fCBuZXh0LmlzQm94KCkgfHwgbmV4dC5p
c0Zsb2F0KCkpOwotICAgIGlmIChjdXJyZW50LmlzVGV4dCgpICYmIG5leHQuaXNUZXh0KCkpIHsK
LSAgICAgICAgYXV0byYgY3VycmVudElubGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4
dEl0ZW0+KGN1cnJlbnQpOwotICAgICAgICBhdXRvJiBuZXh0SW5saW5lVGV4dEl0ZW0gPSBkb3du
Y2FzdDxJbmxpbmVUZXh0SXRlbT4obmV4dCk7Ci0gICAgICAgIGlmIChjdXJyZW50SW5saW5lVGV4
dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpIHsKLSAgICAgICAgICAgIC8vIFsgXVt0ZXh0XSA6IGFmdGVy
IFt3aGl0ZXNwYWNlXSBwb3NpdGlvbiBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eS4KLSAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZXh0SW5saW5lVGV4
dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpIHsKLSAgICAgICAgICAgIC8vIFt0ZXh0XVsgXSAoPHNwYW4+
dGV4dDwvc3Bhbj4gKQotICAgICAgICAgICAgLy8gd2hpdGUtc3BhY2U6IGJyZWFrLXNwYWNlczog
bGluZSBicmVha2luZyBvcHBvcnR1bml0eSBleGlzdHMgYWZ0ZXIgZXZlcnkgcHJlc2VydmVkIHdo
aXRlIHNwYWNlIGNoYXJhY3RlciwgYnV0IG5vdCBiZWZvcmUuCi0gICAgICAgICAgICByZXR1cm4g
bmV4dElubGluZVRleHRJdGVtLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9IFdoaXRlU3BhY2U6OkJy
ZWFrU3BhY2VzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50LnN0eWxlKCkubGluZUJy
ZWFrKCkgPT0gTGluZUJyZWFrOjpBbnl3aGVyZSB8fCBuZXh0LnN0eWxlKCkubGluZUJyZWFrKCkg
PT0gTGluZUJyZWFrOjpBbnl3aGVyZSkgewotICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBzb2Z0
IHdyYXAgb3Bwb3J0dW5pdHkgYXJvdW5kIGV2ZXJ5IHR5cG9ncmFwaGljIGNoYXJhY3RlciB1bml0
LCBpbmNsdWRpbmcgYXJvdW5kIGFueSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIKLSAgICAgICAgICAg
IC8vIG9yIHByZXNlcnZlZCB3aGl0ZSBzcGFjZXMsIG9yIGluIHRoZSBtaWRkbGUgb2Ygd29yZHMu
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBCb3RoIGN1
cnJlbnQgYW5kIG5leHQgaXRlbXMgYXJlIG5vbi13aGl0ZXNwYWNlIHRleHQuCi0gICAgICAgIC8v
IFt0ZXh0XVt0ZXh0XSA6IGlzIGEgY29udGludW91cyBjb250ZW50LgotICAgICAgICAvLyBbdGV4
dC1dW3RleHRdIDogYWZ0ZXIgW2h5cGhlbl0gcG9zaXRpb24gaXMgYSBzb2Z0IHdyYXAgb3Bwb3J0
dW5pdHkuCi0gICAgICAgIHJldHVybiBlbmRzV2l0aFNvZnRXcmFwT3Bwb3J0dW5pdHkoY3VycmVu
dElubGluZVRleHRJdGVtLCBuZXh0SW5saW5lVGV4dEl0ZW0pOwotICAgIH0KLSAgICBpZiAoY3Vy
cmVudC5pc0Zsb2F0KCkgfHwgbmV4dC5pc0Zsb2F0KCkpIHsKLSAgICAgICAgLy8gV2hpbGUgZmxv
YXRzIGFyZSBub3QgcGFydCBvZiB0aGUgaW5saW5lIGNvbnRlbnQgYW5kIHRoZXkgYXJlIG5vdCBz
dXBwb3NlZCB0byBpbnRyb2R1Y2Ugc29mdCB3cmFwIG9wcG9ydHVuaXRpZXMsCi0gICAgICAgIC8v
IGUuZy4gW3RleHRdW2Zsb2F0IGJveF1bZmxvYXQgYm94XVt0ZXh0XVtmbG9hdCBib3hdW3RleHRd
IGlzIGVzc2VudGlhbGx5IGp1c3QgW3RleHRdW3RleHRdW3RleHRdCi0gICAgICAgIC8vIGZpZ3Vy
aW5nIG91dCB3aGV0aGVyIGEgZmxvYXQgKG9yIHNldCBvZiBmbG9hdHMpIHNob3VsZCBzdGF5IG9u
IHRoZSBsaW5lIG9yIG5vdCAoYW5kIGhhbmRsZSBwb3RlbnRpYWxseSBvdXQgb2Ygb3JkZXIgaW5s
aW5lIGl0ZW1zKQotICAgICAgICAvLyBicmluZ3MgaW4gdW5uZWNlc3NhcnkgY29tcGxleGl0eS4K
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChjdXJyZW50LmlzQm94KCkgfHwg
bmV4dC5pc0JveCgpKSB7Ci0gICAgICAgIGF1dG8gaXNJbWFnZUNvbnRlbnQgPSBjdXJyZW50Lmxh
eW91dEJveCgpLmlzSW1hZ2UoKSB8fCBuZXh0LmxheW91dEJveCgpLmlzSW1hZ2UoKTsKLSAgICAg
ICAgaWYgKGlzSW1hZ2VDb250ZW50KQotICAgICAgICAgICAgcmV0dXJuIGlubGluZUZvcm1hdHRp
bmdDb250ZXh0LnF1aXJrcygpLmhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdlKCk7Ci0gICAg
ICAgIC8vIFt0ZXh0XVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF1baW5saW5lIGJv
eF0gKHRleHQ8c3Bhbj48L3NwYW4+PGltZz4pIDogdGhlcmUncyBhIHNvZnQgd3JhcCBvcHBvcnR1
bml0eSBiZXR3ZWVuIHRoZSBbdGV4dF0gYW5kIFtpbWddLgotICAgICAgICAvLyBUaGUgbGluZSBi
cmVha2luZyBiZWhhdmlvciBvZiBhIHJlcGxhY2VkIGVsZW1lbnQgb3Igb3RoZXIgYXRvbWljIGlu
bGluZSBpcyBlcXVpdmFsZW50IHRvIGFuIGlkZW9ncmFwaGljIGNoYXJhY3Rlci4KLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVy
biB0cnVlOwotfQotCi1zdHJ1Y3QgTGluZUNhbmRpZGF0ZSB7Ci0gICAgTGluZUNhbmRpZGF0ZShi
b29sIGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZyk7Ci0KLSAgICB2b2lkIHJlc2V0KCk7Ci0K
LSAgICBzdHJ1Y3QgSW5saW5lQ29udGVudCB7Ci0gICAgICAgIElubGluZUNvbnRlbnQoYm9vbCBp
Z25vcmVUcmFpbGluZ0xldHRlclNwYWNpbmcpOwotCi0gICAgICAgIGNvbnN0IElubGluZUNvbnRl
bnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQoKSBjb25zdCB7
IHJldHVybiBtX2NvbnRpbnVvdXNDb250ZW50OyB9Ci0gICAgICAgIGNvbnN0IElubGluZUl0ZW0q
IHRyYWlsaW5nTGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ0xpbmVCcmVhazsg
fQotICAgICAgICBjb25zdCBJbmxpbmVJdGVtKiB0cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5
KCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5OyB9Ci0KLSAg
ICAgICAgdm9pZCBhcHBlbmRJbmxpbmVJdGVtKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIHZvaWQgYXBwZW5kVHJhaWxpbmdMaW5lQnJl
YWsoY29uc3QgSW5saW5lSXRlbSYgbGluZUJyZWFrSXRlbSkgeyBtX3RyYWlsaW5nTGluZUJyZWFr
ID0gJmxpbmVCcmVha0l0ZW07IH0KLSAgICAgICAgdm9pZCBhcHBlbmR0cmFpbGluZ1dvcmRCcmVh
a09wcG9ydHVuaXR5KGNvbnN0IElubGluZUl0ZW0mIHdvcmRCcmVha0l0ZW0pIHsgbV90cmFpbGlu
Z1dvcmRCcmVha09wcG9ydHVuaXR5ID0gJndvcmRCcmVha0l0ZW07IH0KLSAgICAgICAgdm9pZCBy
ZXNldCgpOwotICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2NvbnRpbnVv
dXNDb250ZW50LnJ1bnMoKS5pc0VtcHR5KCkgJiYgIXRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5p
dHkoKSAmJiAhdHJhaWxpbmdMaW5lQnJlYWsoKTsgfQotICAgICAgICBib29sIGhhc0lubGluZUxl
dmVsQm94KCkgY29uc3QgeyByZXR1cm4gbV9oYXNJbmxpbmVMZXZlbEJveDsgfQotCi0gICAgICAg
IHZvaWQgc2V0SGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KGJvb2wgaGFzVHJhaWxpbmdT
b2Z0V3JhcE9wcG9ydHVuaXR5KSB7IG1faGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5ID0g
aGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5OyB9Ci0gICAgICAgIGJvb2wgaGFzVHJhaWxp
bmdTb2Z0V3JhcE9wcG9ydHVuaXR5KCkgY29uc3QgeyByZXR1cm4gbV9oYXNUcmFpbGluZ1NvZnRX
cmFwT3Bwb3J0dW5pdHk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgbV9pZ25vcmVU
cmFpbGluZ0xldHRlclNwYWNpbmcgeyBmYWxzZSB9OwotCi0gICAgICAgIElubGluZUNvbnRlbnRC
cmVha2VyOjpDb250aW51b3VzQ29udGVudCBtX2NvbnRpbnVvdXNDb250ZW50OwotICAgICAgICBj
b25zdCBJbmxpbmVJdGVtKiBtX3RyYWlsaW5nTGluZUJyZWFrIHsgbnVsbHB0ciB9OwotICAgICAg
ICBjb25zdCBJbmxpbmVJdGVtKiBtX3RyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkgeyBudWxs
cHRyIH07Ci0gICAgICAgIGJvb2wgbV9oYXNJbmxpbmVMZXZlbEJveCB7IGZhbHNlIH07Ci0gICAg
ICAgIGJvb2wgbV9oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkgeyBmYWxzZSB9OwotICAg
IH07Ci0KLSAgICAvLyBDYW5kaWRhdGUgY29udGVudCBpcyBhIGNvbGxlY3Rpb24gb2YgaW5saW5l
IGNvbnRlbnQgb3IgYSBmbG9hdCBib3guCi0gICAgSW5saW5lQ29udGVudCBpbmxpbmVDb250ZW50
OwotICAgIGNvbnN0IElubGluZUl0ZW0qIGZsb2F0SXRlbSB7IG51bGxwdHIgfTsKLX07Ci0KLUxp
bmVDYW5kaWRhdGU6OkxpbmVDYW5kaWRhdGUoYm9vbCBpZ25vcmVUcmFpbGluZ0xldHRlclNwYWNp
bmcpCi0gICAgOiBpbmxpbmVDb250ZW50KGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKLXsK
LX0KLQotTGluZUNhbmRpZGF0ZTo6SW5saW5lQ29udGVudDo6SW5saW5lQ29udGVudChib29sIGln
bm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKLSAgICA6IG1faWdub3JlVHJhaWxpbmdMZXR0ZXJT
cGFjaW5nKGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKLXsKLX0KLQotaW5saW5lIHZvaWQg
TGluZUNhbmRpZGF0ZTo6SW5saW5lQ29udGVudDo6YXBwZW5kSW5saW5lSXRlbShjb25zdCBJbmxp
bmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKLXsKLSAg
ICBBU1NFUlQoaW5saW5lSXRlbS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlzQm94KCkgfHwgaW5s
aW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgp
KTsKLSAgICBhdXRvIGNvbGxhcHNpYmxlV2lkdGggPSBbJl0oKSAtPiBPcHRpb25hbDxJbmxpbmVM
YXlvdXRVbml0PiB7Ci0gICAgICAgIGlmICghaW5saW5lSXRlbS5pc1RleHQoKSkKLSAgICAgICAg
ICAgIHJldHVybiB7IH07Ci0gICAgICAgIGF1dG8mIGlubGluZVRleHRJdGVtID0gZG93bmNhc3Q8
SW5saW5lVGV4dEl0ZW0+KGlubGluZUl0ZW0pOwotICAgICAgICBpZiAoaW5saW5lVGV4dEl0ZW0u
aXNXaGl0ZXNwYWNlKCkgJiYgIUlubGluZVRleHRJdGVtOjpzaG91bGRQcmVzZXJ2ZVNwYWNlc0Fu
ZFRhYnMoaW5saW5lVGV4dEl0ZW0pKSB7Ci0gICAgICAgICAgICAvLyBGdWxseSBjb2xsYXBzaWJs
ZSB0cmFpbGluZyBjb250ZW50LgotICAgICAgICAgICAgcmV0dXJuIGxvZ2ljYWxXaWR0aDsKLSAg
ICAgICAgfQotICAgICAgICAvLyBDaGVjayBmb3IgcGFydGlhbGx5IGNvbGxhcHNpYmxlIGNvbnRl
bnQuCi0gICAgICAgIGlmIChtX2lnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKLSAgICAgICAg
ICAgIHJldHVybiB7IH07Ci0gICAgICAgIGF1dG8gbGV0dGVyU3BhY2luZyA9IGlubGluZUl0ZW0u
c3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCk7Ci0gICAgICAgIGlmIChsZXR0ZXJTcGFjaW5nIDw9IDAp
Ci0gICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICBBU1NFUlQobG9naWNhbFdpZHRoID4g
bGV0dGVyU3BhY2luZyk7Ci0gICAgICAgIHJldHVybiBsZXR0ZXJTcGFjaW5nOwotICAgIH07Ci0g
ICAgbV9jb250aW51b3VzQ29udGVudC5hcHBlbmQoaW5saW5lSXRlbSwgbG9naWNhbFdpZHRoLCBj
b2xsYXBzaWJsZVdpZHRoKCkpOwotICAgIG1faGFzSW5saW5lTGV2ZWxCb3ggPSBtX2hhc0lubGlu
ZUxldmVsQm94IHx8IGlubGluZUl0ZW0uaXNCb3goKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94
U3RhcnQoKTsKLX0KLQotaW5saW5lIHZvaWQgTGluZUNhbmRpZGF0ZTo6SW5saW5lQ29udGVudDo6
cmVzZXQoKQotewotICAgIG1fY29udGludW91c0NvbnRlbnQucmVzZXQoKTsKLSAgICBtX3RyYWls
aW5nTGluZUJyZWFrID0geyB9OwotICAgIG1fdHJhaWxpbmdXb3JkQnJlYWtPcHBvcnR1bml0eSA9
IHsgfTsKLSAgICBtX2hhc0lubGluZUxldmVsQm94ID0gZmFsc2U7Ci19Ci0KLWlubGluZSB2b2lk
IExpbmVDYW5kaWRhdGU6OnJlc2V0KCkKLXsKLSAgICBmbG9hdEl0ZW0gPSBudWxscHRyOwotICAg
IGlubGluZUNvbnRlbnQucmVzZXQoKTsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBMaW5lQnVpbGRl
cjo6aW5saW5lSXRlbVdpZHRoKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxh
eW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KSBjb25zdAotewotICAgIGlmIChpczxJbmxpbmVU
ZXh0SXRlbT4oaW5saW5lSXRlbSkpIHsKLSAgICAgICAgYXV0byYgaW5saW5lVGV4dEl0ZW0gPSBk
b3duY2FzdDxJbmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSk7Ci0gICAgICAgIGlmIChhdXRvIGNv
bnRlbnRXaWR0aCA9IGlubGluZVRleHRJdGVtLndpZHRoKCkpCi0gICAgICAgICAgICByZXR1cm4g
KmNvbnRlbnRXaWR0aDsKLSAgICAgICAgaWYgKCFpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2Uo
KSB8fCBJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRl
eHRJdGVtKSkKLSAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0
ZW0sIGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0gICAgICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgo
aW5saW5lVGV4dEl0ZW0sIGlubGluZVRleHRJdGVtLnN0YXJ0KCksIGlubGluZVRleHRJdGVtLnN0
YXJ0KCkgKyAxLCBjb250ZW50TG9naWNhbExlZnQpOwotICAgIH0KLQotICAgIGlmIChpbmxpbmVJ
dGVtLmlzTGluZUJyZWFrKCkgfHwgaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkp
Ci0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICBhdXRvJiBsYXlvdXRCb3ggPSBpbmxpbmVJdGVt
LmxheW91dEJveCgpOwotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gbV9pbmxpbmVGb3JtYXR0aW5n
Q29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwotCi0gICAgaWYgKGxheW91dEJveC5p
c0Zsb2F0aW5nUG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2lu
Qm94V2lkdGgoKTsKLQotICAgIGlmIChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQotICAgICAg
ICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luQm94V2lkdGgoKTsKLQotICAgIGlmIChpbmxpbmVJ
dGVtLmlzSW5saW5lQm94U3RhcnQoKSkKLSAgICAgICAgcmV0dXJuIGJveEdlb21ldHJ5Lm1hcmdp
blN0YXJ0KCkgKyBib3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCkgKyBib3hHZW9tZXRyeS5wYWRkaW5n
TGVmdCgpLnZhbHVlT3IoMCk7Ci0KLSAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgp
KQotICAgICAgICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luRW5kKCkgKyBib3hHZW9tZXRyeS5i
b3JkZXJSaWdodCgpICsgYm94R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVPcigwKTsKLQot
ICAgIC8vIE5vbi1yZXBsYWNlZCBpbmxpbmUgYm94IChlLmcuIGlubGluZS1ibG9jaykKLSAgICBy
ZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luQm94V2lkdGgoKTsKLX0KLQotTGluZUJ1aWxkZXI6Okxp
bmVCdWlsZGVyKElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4
dCwgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSwgSG9yaXpvbnRhbENvbnN0cmFpbnRzIHJv
b3RIb3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IElubGluZUl0ZW1zJiBpbmxpbmVJdGVtcykK
LSAgICA6IG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQoaW5saW5lRm9ybWF0dGluZ0NvbnRleHQp
Ci0gICAgLCBtX2lubGluZUZvcm1hdHRpbmdTdGF0ZSgmaW5saW5lRm9ybWF0dGluZ0NvbnRleHQu
Zm9ybWF0dGluZ1N0YXRlKCkpCi0gICAgLCBtX2Zsb2F0aW5nU3RhdGUoJmZsb2F0aW5nU3RhdGUp
Ci0gICAgLCBtX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHMocm9vdEhvcml6b250YWxDb25zdHJh
aW50cykKLSAgICAsIG1fbGluZShpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICAsIG1faW5s
aW5lSXRlbXMoaW5saW5lSXRlbXMpCi17Ci19Ci0KLUxpbmVCdWlsZGVyOjpMaW5lQnVpbGRlcihj
b25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5lRm9ybWF0dGluZ0NvbnRleHQsIGNv
bnN0IElubGluZUl0ZW1zJiBpbmxpbmVJdGVtcykKLSAgICA6IG1faW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQoaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCi0gICAgLCBtX2xpbmUoaW5saW5lRm9ybWF0
dGluZ0NvbnRleHQpCi0gICAgLCBtX2lubGluZUl0ZW1zKGlubGluZUl0ZW1zKQotewotfQotCi1M
aW5lQnVpbGRlcjo6TGluZUNvbnRlbnQgTGluZUJ1aWxkZXI6OmxheW91dElubGluZUNvbnRlbnQo
Y29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBzaXplX3QgcGFydGlhbExl
YWRpbmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxvd0xv
Z2ljYWxXaWR0aCwgY29uc3QgSW5saW5lUmVjdCYgaW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgYm9v
bCBpc0ZpcnN0TGluZSkKLXsKLSAgICBpbml0aWFsaXplKGluaXRpYWxDb25zdHJhaW50c0Zvckxp
bmUoaW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgaXNGaXJzdExpbmUpKTsKLQotICAgIGF1dG8gY29t
bWl0dGVkQ29udGVudCA9IHBsYWNlSW5saW5lQ29udGVudChuZWVkc0xheW91dFJhbmdlLCBwYXJ0
aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIG92ZXJmbG93TG9naWNhbFdpZHRoKTsKLSAgICBhdXRv
IGNvbW1pdHRlZFJhbmdlID0gY2xvc2UobmVlZHNMYXlvdXRSYW5nZSwgY29tbWl0dGVkQ29udGVu
dCk7Ci0KLSAgICBhdXRvIGlzTGFzdExpbmUgPSBpc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQo
Y29tbWl0dGVkUmFuZ2UsIG5lZWRzTGF5b3V0UmFuZ2UuZW5kLCBjb21taXR0ZWRDb250ZW50LnBh
cnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgpOwotICAgIHJldHVybiBMaW5lQ29udGVudCB7IGNv
bW1pdHRlZFJhbmdlLCBjb21taXR0ZWRDb250ZW50LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5n
dGgsIGNvbW1pdHRlZENvbnRlbnQub3ZlcmZsb3dMb2dpY2FsV2lkdGgsIG1fZmxvYXRzLCBtX2Nv
bnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdAotICAgICAgICAsIG1fbGluZUxvZ2ljYWxSZWN0LnRv
cExlZnQoKQotICAgICAgICAsIG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkKLSAgICAgICAgLCBt
X2xpbmUuY29udGVudExvZ2ljYWxXaWR0aCgpCi0gICAgICAgICwgaXNMYXN0TGluZQotICAgICAg
ICAsIG1fbGluZS5ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQoKQotICAgICAgICAsIG1f
bGluZS5ydW5zKCl9OwotfQotCi1MaW5lQnVpbGRlcjo6SW50cmluc2ljQ29udGVudCBMaW5lQnVp
bGRlcjo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRz
TGF5b3V0UmFuZ2UsIElubGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgpCi17Ci0gICAgaW5p
dGlhbGl6ZSh7IHsgeyB9LCB7IGF2YWlsYWJsZVdpZHRoLCBtYXhJbmxpbmVMYXlvdXRVbml0KCkg
fSB9LCBmYWxzZSB9KTsKLSAgICBhdXRvIGNvbW1pdHRlZENvbnRlbnQgPSBwbGFjZUlubGluZUNv
bnRlbnQobmVlZHNMYXlvdXRSYW5nZSwgeyB9LCB7IH0pOwotICAgIGF1dG8gY29tbWl0dGVkUmFu
Z2UgPSBjbG9zZShuZWVkc0xheW91dFJhbmdlLCBjb21taXR0ZWRDb250ZW50KTsKLSAgICByZXR1
cm4geyBjb21taXR0ZWRSYW5nZSwgbV9saW5lLmNvbnRlbnRMb2dpY2FsV2lkdGgoKSwgbV9mbG9h
dHMgfTsKLX0KLQotdm9pZCBMaW5lQnVpbGRlcjo6aW5pdGlhbGl6ZShjb25zdCBVc2VkQ29uc3Ry
YWludHMmIGxpbmVDb25zdHJhaW50cykKLXsKLSAgICBtX2Zsb2F0cy5jbGVhcigpOwotICAgIG1f
cGFydGlhbExlYWRpbmdUZXh0SXRlbSA9IHsgfTsKLSAgICBtX3dyYXBPcHBvcnR1bml0eUxpc3Qu
Y2xlYXIoKTsKLQotICAgIG1fbGluZS5pbml0aWFsaXplKCk7Ci0gICAgbV9saW5lTG9naWNhbFJl
Y3QgPSBsaW5lQ29uc3RyYWludHMubG9naWNhbFJlY3Q7Ci0gICAgbV9jb250ZW50SXNDb25zdHJh
aW5lZEJ5RmxvYXQgPSBsaW5lQ29uc3RyYWludHMuaXNDb25zdHJhaW5lZEJ5RmxvYXQ7Ci19Ci0K
LUxpbmVCdWlsZGVyOjpDb21taXR0ZWRDb250ZW50IExpbmVCdWlsZGVyOjpwbGFjZUlubGluZUNv
bnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBzaXplX3QgcGFy
dGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBsZWFk
aW5nTG9naWNhbFdpZHRoKQotewotICAgIGF1dG8gbGluZUNhbmRpZGF0ZSA9IExpbmVDYW5kaWRh
dGUgeyBsYXlvdXRTdGF0ZSgpLnNob3VsZElnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZygpIH07
Ci0gICAgYXV0byBpbmxpbmVDb250ZW50QnJlYWtlciA9IElubGluZUNvbnRlbnRCcmVha2VyIHsg
fTsKLQotICAgIGF1dG8gY3VycmVudEl0ZW1JbmRleCA9IG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQ7
Ci0gICAgc2l6ZV90IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCA9IDA7Ci0gICAgd2hpbGUgKGN1
cnJlbnRJdGVtSW5kZXggPCBuZWVkc0xheW91dFJhbmdlLmVuZCkgewotICAgICAgICAvLyAxLiBD
b2xsZWN0IHRoZSBzZXQgb2YgcnVucyB0aGF0IHdlIGNhbiBjb21taXQgdG8gdGhlIGxpbmUgYXMg
b25lIGVudGl0eSBlLmcuIDxzcGFuPnRleHRfYW5kX3NwYW5fc3RhcnRfc3Bhbl9lbmQ8L3NwYW4+
LgotICAgICAgICAvLyAyLiBBcHBseSBmbG9hdHMgYW5kIHNocmluayB0aGUgYXZhaWxhYmxlIGhv
cml6b250YWwgc3BhY2UgZS5nLiA8c3Bhbj5pbnRydV88ZGl2IHN0eWxlPSJmbG9hdDogbGVmdCI+
PC9kaXY+c2l2ZV9mbG9hdDwvc3Bhbj4uCi0gICAgICAgIC8vIDMuIENoZWNrIGlmIHRoZSBjb250
ZW50IGZpdHMgdGhlIGxpbmUgYW5kIGNvbW1pdCB0aGUgY29udGVudCBhY2NvcmRpbmdseSAoZnVs
bCwgcGFydGlhbCBvciBub3QgY29tbWl0IGF0IGFsbCkuCi0gICAgICAgIC8vIDQuIFJldHVybiBp
ZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBlaXRoZXIgYnkgbm90IGJlaW5nIGFibGUg
dG8gZml0IG1vcmUgY29udGVudCBvciBiZWNhdXNlIG9mIGFuIGV4cGxpY2l0IGxpbmUgYnJlYWsu
Ci0gICAgICAgIGNhbmRpZGF0ZUNvbnRlbnRGb3JMaW5lKGxpbmVDYW5kaWRhdGUsIGN1cnJlbnRJ
dGVtSW5kZXgsIG5lZWRzTGF5b3V0UmFuZ2UsIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCwg
c3RkOjpleGNoYW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6Om51bGxvcHQpLCBtX2xpbmUu
Y29udGVudExvZ2ljYWxSaWdodCgpKTsKLSAgICAgICAgLy8gTm93IGNoZWNrIGlmIHdlIGNhbiBw
dXQgdGhpcyBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAgIGF1dG8gcmVzdWx0
ID0gUmVzdWx0IHsgfTsKLSAgICAgICAgaWYgKGxpbmVDYW5kaWRhdGUuZmxvYXRJdGVtKSB7Ci0g
ICAgICAgICAgICBBU1NFUlQobGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmlzRW1wdHkoKSk7
Ci0gICAgICAgICAgICBoYW5kbGVGbG9hdENvbnRlbnQoKmxpbmVDYW5kaWRhdGUuZmxvYXRJdGVt
KTsKLSAgICAgICAgICAgIC8vIEZsb2F0cyBuZXZlciB0ZXJtaW5hdGUgdGhlIGxpbmUuCi0gICAg
ICAgIH0gZWxzZQotICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlSW5saW5lQ29udGVudChpbmxp
bmVDb250ZW50QnJlYWtlciwgbmVlZHNMYXlvdXRSYW5nZSwgbGluZUNhbmRpZGF0ZSk7Ci0gICAg
ICAgIGF1dG8gaXNFbmRPZkxpbmUgPSByZXN1bHQuaXNFbmRPZkxpbmUgPT0gSW5saW5lQ29udGVu
dEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXM7Ci0gICAgICAgIGlmICghcmVzdWx0LmNvbW1pdHRl
ZENvdW50LmlzUmV2ZXJ0KSB7Ci0gICAgICAgICAgICBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQg
Kz0gcmVzdWx0LmNvbW1pdHRlZENvdW50LnZhbHVlOwotICAgICAgICAgICAgYXV0byYgaW5saW5l
Q29udGVudCA9IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudDsKLSAgICAgICAgICAgIGF1dG8g
aW5saW5lQ29udGVudElzRnVsbHlDb21taXR0ZWQgPSBpbmxpbmVDb250ZW50LmNvbnRpbnVvdXND
b250ZW50KCkucnVucygpLnNpemUoKSA9PSByZXN1bHQuY29tbWl0dGVkQ291bnQudmFsdWUgJiYg
IXJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoOwotICAgICAgICAgICAgaWYgKGlu
bGluZUNvbnRlbnRJc0Z1bGx5Q29tbWl0dGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF1dG8q
IHdvcmRCcmVha09wcG9ydHVuaXR5ID0gaW5saW5lQ29udGVudC50cmFpbGluZ1dvcmRCcmVha09w
cG9ydHVuaXR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gPHdicj4gbmVlZHMgdG8gYmUg
b24gdGhlIGxpbmUgYXMgYW4gZW1wdHkgcnVuIHNvIHRoYXQgd2UgY2FuIGNvbnN0cnVjdCBhbiBp
bmxpbmUgYm94IGFuZCBjb21wdXRlIGJhc2ljIGdlb21ldHJ5LgotICAgICAgICAgICAgICAgICAg
ICArK2NvbW1pdHRlZElubGluZUl0ZW1Db3VudDsKLSAgICAgICAgICAgICAgICAgICAgbV9saW5l
LmFwcGVuZCgqd29yZEJyZWFrT3Bwb3J0dW5pdHksIHsgfSk7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIGlmIChpbmxpbmVDb250ZW50LnRyYWlsaW5nTGluZUJyZWFrKCkpIHsK
LSAgICAgICAgICAgICAgICAgICAgLy8gRnVsbHkgY29tbWl0dGVkIChvciBlbXB0eSkgY29udGVu
dCBmb2xsb3dlZCBieSBhIGxpbmUgYnJlYWsgbWVhbnMgImVuZCBvZiBsaW5lIi4KLSAgICAgICAg
ICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgd2lsbCBwdXQgdGhlIGxpbmUgYnJlYWsgYm94IGF0
IHRoZSBlbmQgb2YgdGhlIGxpbmUgd2hpbGUgaW4gY2FzZSBvZiBzb21lIGlubGluZSBib3hlcywg
dGhlIGxpbmUgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgLy8gY291bGQgdmVyeSB3ZWxsIGJl
IGF0IGFuIGVhcmxpZXIgcG9zaXRpb24uIFRoaXMgaGFzIG5vIHZpc3VhbCBpbXBsaWNhdGlvbnMg
YXQgdGhpcyBwb2ludCB0aG91Z2ggKG9ubHkgZ2VvbWV0cnkgY29ycmVjdG5lc3Mgb24gdGhlIGxp
bmUgYnJlYWsgYm94KS4KLSAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiA8c3BhbiBzdHlsZT0i
Ym9yZGVyLXJpZ2h0OiAxMHB4IHNvbGlkIGdyZWVuIj50ZXh0PGJyPjwvc3Bhbj4gd2hlcmUgdGhl
IDxicj4ncyBob3Jpem9udGFsIHBvc2l0aW9uIGlzIGJlZm9yZSB0aGUgcmlnaHQgYm9yZGVyIGFu
ZCBub3QgYWZ0ZXIuCi0gICAgICAgICAgICAgICAgICAgIG1fbGluZS5hcHBlbmQoKmlubGluZUNv
bnRlbnQudHJhaWxpbmdMaW5lQnJlYWsoKSwgeyB9KTsKLSAgICAgICAgICAgICAgICAgICAgKytj
b21taXR0ZWRJbmxpbmVJdGVtQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlzRW5kT2ZMaW5l
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50ID0gcmVzdWx0LmNvbW1pdHRl
ZENvdW50LnZhbHVlOwotCi0gICAgICAgIGlmIChpc0VuZE9mTGluZSkgewotICAgICAgICAgICAg
Ly8gV2UgY2FuJ3QgcGxhY2UgYW55IG1vcmUgaXRlbXMgb24gdGhlIGN1cnJlbnQgbGluZS4KLSAg
ICAgICAgICAgIHJldHVybiB7IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCwgcmVzdWx0LnBhcnRp
YWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgsIHJlc3VsdC5vdmVyZmxvd0xvZ2ljYWxXaWR0aCB9Owot
ICAgICAgICB9Ci0gICAgICAgIGN1cnJlbnRJdGVtSW5kZXggPSBuZWVkc0xheW91dFJhbmdlLnN0
YXJ0ICsgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50ICsgbV9mbG9hdHMuc2l6ZSgpOwotICAgICAg
ICBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGggPSB7IH07Ci0gICAgfQotICAgIC8vIExvb2tz
IGxpa2Ugd2UndmUgcnVuIG91dCBvZiBydW5zLgotICAgIHJldHVybiB7IGNvbW1pdHRlZElubGlu
ZUl0ZW1Db3VudCwgeyB9IH07Ci19Ci0KLUxpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UgTGlu
ZUJ1aWxkZXI6OmNsb3NlKGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwg
Y29uc3QgQ29tbWl0dGVkQ29udGVudCYgY29tbWl0dGVkQ29udGVudCkKLXsKLSAgICBBU1NFUlQo
Y29tbWl0dGVkQ29udGVudC5pbmxpbmVJdGVtQ291bnQgfHwgIW1fZmxvYXRzLmlzRW1wdHkoKSB8
fCBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdCk7Ci0gICAgYXV0byBudW1iZXJPZkNvbW1p
dHRlZEl0ZW1zID0gY29tbWl0dGVkQ29udGVudC5pbmxpbmVJdGVtQ291bnQgKyBtX2Zsb2F0cy5z
aXplKCk7Ci0gICAgYXV0byB0cmFpbGluZ0lubGluZUl0ZW1JbmRleCA9IG5lZWRzTGF5b3V0UmFu
Z2Uuc3RhcnQgKyBudW1iZXJPZkNvbW1pdHRlZEl0ZW1zIC0gMTsKLSAgICBhdXRvIGxpbmVSYW5n
ZSA9IElubGluZUl0ZW1SYW5nZSB7IG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQsIHRyYWlsaW5nSW5s
aW5lSXRlbUluZGV4ICsgMSB9OwotICAgIEFTU0VSVChsaW5lUmFuZ2UuZW5kIDw9IG5lZWRzTGF5
b3V0UmFuZ2UuZW5kKTsKLSAgICBpZiAoIWNvbW1pdHRlZENvbnRlbnQuaW5saW5lSXRlbUNvdW50
KSB7Ci0gICAgICAgIC8vIExpbmUgaXMgZW1wdHksIHdlIG9ubHkgbWFuYWdlZCB0byBwbGFjZSBm
bG9hdCBib3hlcy4KLSAgICAgICAgcmV0dXJuIGxpbmVSYW5nZTsKLSAgICB9Ci0gICAgYXV0byBh
dmFpbGFibGVXaWR0aCA9IG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkgLSBtX2xpbmUuY29udGVu
dExvZ2ljYWxSaWdodCgpOwotICAgIG1fbGluZS5yZW1vdmVDb2xsYXBzaWJsZUNvbnRlbnQoYXZh
aWxhYmxlV2lkdGgpOwotICAgIGF1dG8gaG9yaXpvbnRhbEFsaWdubWVudCA9IHJvb3QoKS5zdHls
ZSgpLnRleHRBbGlnbigpOwotICAgIGF1dG8gcnVuc0V4cGFuZEhvcml6b250YWxseSA9IGhvcml6
b250YWxBbGlnbm1lbnQgPT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSAmJiAhaXNMYXN0TGluZVdp
dGhJbmxpbmVDb250ZW50KGxpbmVSYW5nZSwgbmVlZHNMYXlvdXRSYW5nZS5lbmQsIGNvbW1pdHRl
ZENvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCk7Ci0gICAgaWYgKHJ1bnNFeHBh
bmRIb3Jpem9udGFsbHkpCi0gICAgICAgIG1fbGluZS5hcHBseVJ1bkV4cGFuc2lvbihtX2xpbmVM
b2dpY2FsUmVjdC53aWR0aCgpIC0gbV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKSk7Ci0gICAg
YXV0byBsaW5lRW5kc1dpdGhIeXBoZW4gPSBmYWxzZTsKLSAgICBpZiAoIW1fbGluZS5ydW5zKCku
aXNFbXB0eSgpKSB7Ci0gICAgICAgIGF1dG8mIGxhc3RUZXh0Q29udGVudCA9IG1fbGluZS5ydW5z
KCkubGFzdCgpLnRleHRDb250ZW50KCk7Ci0gICAgICAgIGxpbmVFbmRzV2l0aEh5cGhlbiA9IGxh
c3RUZXh0Q29udGVudCAmJiBsYXN0VGV4dENvbnRlbnQtPm5lZWRzSHlwaGVuKCk7Ci0gICAgfQot
ICAgIG1fc3VjY2Vzc2l2ZUh5cGhlbmF0ZWRMaW5lQ291bnQgPSBsaW5lRW5kc1dpdGhIeXBoZW4g
PyBtX3N1Y2Nlc3NpdmVIeXBoZW5hdGVkTGluZUNvdW50ICsgMSA6IDA7Ci0gICAgcmV0dXJuIGxp
bmVSYW5nZTsKLX0KLQotT3B0aW9uYWw8SG9yaXpvbnRhbENvbnN0cmFpbnRzPiBMaW5lQnVpbGRl
cjo6ZmxvYXRDb25zdHJhaW50cyhjb25zdCBJbmxpbmVSZWN0JiBsaW5lTG9naWNhbFJlY3QpIGNv
bnN0Ci17Ci0gICAgYXV0byogZmxvYXRpbmdTdGF0ZSA9IHRoaXMtPmZsb2F0aW5nU3RhdGUoKTsK
LSAgICBpZiAoIWZsb2F0aW5nU3RhdGUgfHwgZmxvYXRpbmdTdGF0ZS0+ZmxvYXRzKCkuaXNFbXB0
eSgpKQotICAgICAgICByZXR1cm4geyB9OwotCi0gICAgLy8gQ2hlY2sgZm9yIGludHJ1ZGluZyBm
bG9hdHMgYW5kIGFkanVzdCBsb2dpY2FsIGxlZnQvYXZhaWxhYmxlIHdpZHRoIGZvciB0aGlzIGxp
bmUgYWNjb3JkaW5nbHkuCi0gICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRl
eHQgeyBmb3JtYXR0aW5nQ29udGV4dCgpLCAqZmxvYXRpbmdTdGF0ZSB9OwotICAgIGF1dG8gY29u
c3RyYWludHMgPSBmbG9hdGluZ0NvbnRleHQuY29uc3RyYWludHModG9MYXlvdXRVbml0KGxpbmVM
b2dpY2FsUmVjdC50b3AoKSksIHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFJlY3QuYm90dG9tKCkp
KTsKLSAgICAvLyBDaGVjayBpZiB0aGVzZSB2YWx1ZXMgYWN0dWFsbHkgY29uc3RyYWluIHRoZSBs
aW5lLgotICAgIGlmIChjb25zdHJhaW50cy5sZWZ0ICYmIGNvbnN0cmFpbnRzLmxlZnQtPnggPD0g
bGluZUxvZ2ljYWxSZWN0LmxlZnQoKSkKLSAgICAgICAgY29uc3RyYWludHMubGVmdCA9IHsgfTsK
LQotICAgIGlmIChjb25zdHJhaW50cy5yaWdodCAmJiBjb25zdHJhaW50cy5yaWdodC0+eCA+PSBs
aW5lTG9naWNhbFJlY3QucmlnaHQoKSkKLSAgICAgICAgY29uc3RyYWludHMucmlnaHQgPSB7IH07
Ci0KLSAgICBpZiAoIWNvbnN0cmFpbnRzLmxlZnQgJiYgIWNvbnN0cmFpbnRzLnJpZ2h0KQotICAg
ICAgICByZXR1cm4geyB9OwotCi0gICAgYXV0byBsaW5lTG9naWNhbExlZnQgPSBsaW5lTG9naWNh
bFJlY3QubGVmdCgpOwotICAgIGF1dG8gbGluZUxvZ2ljYWxSaWdodCA9IGxpbmVMb2dpY2FsUmVj
dC5yaWdodCgpOwotICAgIGlmIChjb25zdHJhaW50cy5sZWZ0ICYmIGNvbnN0cmFpbnRzLnJpZ2h0
KSB7Ci0gICAgICAgIGxpbmVMb2dpY2FsUmlnaHQgPSBjb25zdHJhaW50cy5yaWdodC0+eDsKLSAg
ICAgICAgbGluZUxvZ2ljYWxMZWZ0ID0gY29uc3RyYWludHMubGVmdC0+eDsKLSAgICB9IGVsc2Ug
aWYgKGNvbnN0cmFpbnRzLmxlZnQpIHsKLSAgICAgICAgQVNTRVJUKGNvbnN0cmFpbnRzLmxlZnQt
PnggPj0gbGluZUxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgbGluZUxvZ2ljYWxMZWZ0ID0gY29uc3Ry
YWludHMubGVmdC0+eDsKLSAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnRzLnJpZ2h0KSB7Ci0gICAg
ICAgIC8vIFJpZ2h0IGZsb2F0IGJveGVzIG1heSBvdmVyZmxvdyB0aGUgY29udGFpbmluZyBibG9j
ayBvbiB0aGUgbGVmdC4KLSAgICAgICAgbGluZUxvZ2ljYWxSaWdodCA9IHN0ZDo6bWF4PElubGlu
ZUxheW91dFVuaXQ+KGxpbmVMb2dpY2FsTGVmdCwgY29uc3RyYWludHMucmlnaHQtPngpOwotICAg
IH0KLSAgICByZXR1cm4gSG9yaXpvbnRhbENvbnN0cmFpbnRzIHsgdG9MYXlvdXRVbml0KGxpbmVM
b2dpY2FsTGVmdCksIHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFJpZ2h0IC0gbGluZUxvZ2ljYWxM
ZWZ0KSB9OwotfQotCi1MaW5lQnVpbGRlcjo6VXNlZENvbnN0cmFpbnRzIExpbmVCdWlsZGVyOjpp
bml0aWFsQ29uc3RyYWludHNGb3JMaW5lKGNvbnN0IElubGluZVJlY3QmIGluaXRpYWxMaW5lTG9n
aWNhbFJlY3QsIGJvb2wgaXNGaXJzdExpbmUpIGNvbnN0Ci17Ci0gICAgYXV0byBsaW5lTG9naWNh
bExlZnQgPSBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LmxlZnQoKTsKLSAgICBhdXRvIGxpbmVMb2dp
Y2FsUmlnaHQgPSBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LnJpZ2h0KCk7Ci0gICAgYXV0byBsaW5l
SXNDb25zdHJhaW5lZEJ5RmxvYXQgPSBmYWxzZTsKLQotICAgIGlmIChhdXRvIGxpbmVDb25zdHJh
aW50cyA9IGZsb2F0Q29uc3RyYWludHMoaW5pdGlhbExpbmVMb2dpY2FsUmVjdCkpIHsKLSAgICAg
ICAgbGluZUxvZ2ljYWxMZWZ0ID0gbGluZUNvbnN0cmFpbnRzLT5sb2dpY2FsTGVmdDsKLSAgICAg
ICAgbGluZUxvZ2ljYWxSaWdodCA9IGxpbmVDb25zdHJhaW50cy0+bG9naWNhbFJpZ2h0KCk7Ci0g
ICAgICAgIGxpbmVJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IHRydWU7Ci0gICAgfQotCi0gICAgYXV0
byBjb21wdXRlZFRleHRJbmRlbnQgPSBbJl0oKSAtPiBJbmxpbmVMYXlvdXRVbml0IHsKLSAgICAg
ICAgLy8gdGV4dC1pbmRlbnQgcHJvcGVydHkgc3BlY2lmaWVzIHRoZSBpbmRlbnRhdGlvbiBhcHBs
aWVkIHRvIGxpbmVzIG9mIGlubGluZSBjb250ZW50IGluIGEgYmxvY2suCi0gICAgICAgIC8vIFRo
ZSBpbmRlbnQgaXMgdHJlYXRlZCBhcyBhIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBzdGFydCBlZGdl
IG9mIHRoZSBsaW5lIGJveC4KLSAgICAgICAgLy8gVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQs
IG9ubHkgbGluZXMgdGhhdCBhcmUgdGhlIGZpcnN0IGZvcm1hdHRlZCBsaW5lIG9mIGFuIGVsZW1l
bnQgYXJlIGFmZmVjdGVkLgotICAgICAgICAvLyBGb3IgZXhhbXBsZSwgdGhlIGZpcnN0IGxpbmUg
b2YgYW4gYW5vbnltb3VzIGJsb2NrIGJveCBpcyBvbmx5IGFmZmVjdGVkIGlmIGl0IGlzIHRoZSBm
aXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50IGVsZW1lbnQuCi0gICAgICAgIC8vIEZJWE1FOiBBZGQg
c3VwcG9ydCBmb3IgZWFjaC1saW5lLgotICAgICAgICAvLyBbSW50ZWdyYXRpb25dIHJvb3QoKS0+
cGFyZW50KCkgd291bGQgbm9ybWFsbHkgcHJvZHVjZSBhIHZhbGlkIGxheW91dCBib3guCi0gICAg
ICAgIGF1dG8mIHJvb3QgPSB0aGlzLT5yb290KCk7Ci0gICAgICAgIGF1dG8gaXNGb3JtYXR0aW5n
Q29udGV4dFJvb3RDYW5kaWRhdGVUb1RleHRJbmRlbnQgPSAhcm9vdC5pc0Fub255bW91cygpOwot
ICAgICAgICBpZiAocm9vdC5pc0Fub255bW91cygpKSB7Ci0gICAgICAgICAgICAvLyBVbmxlc3Mg
b3RoZXJ3aXNlIHNwZWNpZmllZCBieSB0aGUgZWFjaC1saW5lIGFuZC9vciBoYW5naW5nIGtleXdv
cmRzLCBvbmx5IGxpbmVzIHRoYXQgYXJlIHRoZSBmaXJzdCBmb3JtYXR0ZWQgbGluZQotICAgICAg
ICAgICAgLy8gb2YgYW4gZWxlbWVudCBhcmUgYWZmZWN0ZWQuCi0gICAgICAgICAgICAvLyBGb3Ig
ZXhhbXBsZSwgdGhlIGZpcnN0IGxpbmUgb2YgYW4gYW5vbnltb3VzIGJsb2NrIGJveCBpcyBvbmx5
IGFmZmVjdGVkIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50IGVsZW1lbnQu
Ci0gICAgICAgICAgICBhdXRvIGlzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkID0gbGF5b3V0
U3RhdGUoKS5pc0ludGVncmF0ZWRSb290Qm94Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgaWYg
KGlzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkID09IExheW91dFN0YXRlOjpJc0ludGVncmF0
ZWRSb290Qm94Rmlyc3RDaGlsZDo6Tm90QXBwbGljYWJsZSkKLSAgICAgICAgICAgICAgICBpc0Zv
cm1hdHRpbmdDb250ZXh0Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCA9IHJvb3QucGFyZW50KCku
Zmlyc3RJbkZsb3dDaGlsZCgpID09ICZyb290OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAg
ICAgICAgIGlzRm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9UZXh0SW5kZW50ID0gaXNJ
bnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQgPT0gTGF5b3V0U3RhdGU6OklzSW50ZWdyYXRlZFJv
b3RCb3hGaXJzdENoaWxkOjpZZXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc0Zvcm1hdHRp
bmdDb250ZXh0Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCkKLSAgICAgICAgICAgIHJldHVybiB7
IH07Ci0gICAgICAgIGF1dG8gaW52ZXJ0TGluZVJhbmdlID0gcm9vdC5zdHlsZSgpLnRleHRJbmRl
bnRUeXBlKCkgPT0gVGV4dEluZGVudFR5cGU6Okhhbmdpbmc7Ci0gICAgICAgIC8vIHRleHQtaW5k
ZW50OiBoYW5naW5nIGludmVydHMgd2hpY2ggbGluZXMgYXJlIGFmZmVjdGVkLgotICAgICAgICAv
LyBpbnZlcnRlZCBsaW5lIHJhbmdlIC0+IGFsbCB0aGUgbGluZXMgZXhjZXB0IHRoZSBmaXJzdCBv
bmUuCi0gICAgICAgIC8vICFpbnZlcnRlZCBsaW5lIHJhbmdlIC0+IGZpcnN0IGxpbmUgZ2V0cyB0
aGUgaW5kZW50LgotICAgICAgICBhdXRvIHNob3VsZEluZGVudCA9IGludmVydExpbmVSYW5nZSAh
PSBpc0ZpcnN0TGluZTsKLSAgICAgICAgaWYgKCFzaG91bGRJbmRlbnQpCi0gICAgICAgICAgICBy
ZXR1cm4geyB9OwotCi0gICAgICAgIGF1dG8gdGV4dEluZGVudCA9IHJvb3Quc3R5bGUoKS50ZXh0
SW5kZW50KCk7Ci0gICAgICAgIGlmICh0ZXh0SW5kZW50ID09IFJlbmRlclN0eWxlOjppbml0aWFs
VGV4dEluZGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgcmV0dXJuIHsg
bWluaW11bVZhbHVlRm9yTGVuZ3RoKHRleHRJbmRlbnQsIGluaXRpYWxMaW5lTG9naWNhbFJlY3Qu
d2lkdGgoKSkgfTsKLSAgICB9OwotICAgIGxpbmVMb2dpY2FsTGVmdCArPSBjb21wdXRlZFRleHRJ
bmRlbnQoKTsKLSAgICByZXR1cm4gVXNlZENvbnN0cmFpbnRzIHsgeyBpbml0aWFsTGluZUxvZ2lj
YWxSZWN0LnRvcCgpLCBsaW5lTG9naWNhbExlZnQsIGxpbmVMb2dpY2FsUmlnaHQgLSBsaW5lTG9n
aWNhbExlZnQsIGluaXRpYWxMaW5lTG9naWNhbFJlY3QuaGVpZ2h0KCkgfSwgbGluZUlzQ29uc3Ry
YWluZWRCeUZsb2F0IH07Ci19Ci0KLXZvaWQgTGluZUJ1aWxkZXI6OmNhbmRpZGF0ZUNvbnRlbnRG
b3JMaW5lKExpbmVDYW5kaWRhdGUmIGxpbmVDYW5kaWRhdGUsIHNpemVfdCBjdXJyZW50SW5saW5l
SXRlbUluZGV4LCBjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBzaXplX3QgcGFy
dGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBsZWFk
aW5nTG9naWNhbFdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGN1cnJlbnRMb2dpY2FsUmlnaHQpCi17
Ci0gICAgQVNTRVJUKGN1cnJlbnRJbmxpbmVJdGVtSW5kZXggPCBsYXlvdXRSYW5nZS5lbmQpOwot
ICAgIGxpbmVDYW5kaWRhdGUucmVzZXQoKTsKLSAgICAvLyAxLiBTaW1wbHkgYWRkIGFueSBvdmVy
ZmxvdyBjb250ZW50IGZyb20gdGhlIHByZXZpb3VzIGxpbmUgdG8gdGhlIGNhbmRpZGF0ZSBjb250
ZW50LiBJdCdzIGFsd2F5cyBhIHRleHQgY29udGVudC4KLSAgICAvLyAyLiBGaW5kIHRoZSBuZXh0
IHNvZnQgd3JhcCBwb3NpdGlvbiBvciBleHBsaWNpdCBsaW5lIGJyZWFrLgotICAgIC8vIDMuIENv
bGxlY3QgZmxvYXRzIGJldHdlZW4gdGhlIGlubGluZSBjb250ZW50LgotICAgIGF1dG8gc29mdFdy
YXBPcHBvcnR1bml0eUluZGV4ID0gbmV4dFdyYXBPcHBvcnR1bml0eShjdXJyZW50SW5saW5lSXRl
bUluZGV4LCBsYXlvdXRSYW5nZSk7Ci0gICAgLy8gc29mdFdyYXBPcHBvcnR1bml0eUluZGV4ID09
IGxheW91dFJhbmdlLmVuZCBtZWFucyB3ZSBkb24ndCBoYXZlIGFueSB3cmFwIG9wcG9ydHVuaXR5
IGluIHRoaXMgY29udGVudC4KLSAgICBBU1NFUlQoc29mdFdyYXBPcHBvcnR1bml0eUluZGV4IDw9
IGxheW91dFJhbmdlLmVuZCk7Ci0KLSAgICBpZiAocGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3Ro
KSB7Ci0gICAgICAgIC8vIEhhbmRsZSBsZWFkaW5nIHBhcnRpYWwgY29udGVudCBmaXJzdCAob3Zl
cmZsb3dpbmcgdGV4dCBmcm9tIHRoZSBwcmV2aW91cyBsaW5lKS4KLSAgICAgICAgLy8gQ29uc3Ry
dWN0IGEgcGFydGlhbCBsZWFkaW5nIGlubGluZSBpdGVtLgotICAgICAgICBtX3BhcnRpYWxMZWFk
aW5nVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4obV9pbmxpbmVJdGVtc1tjdXJy
ZW50SW5saW5lSXRlbUluZGV4XSkucmlnaHQocGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoKTsK
LSAgICAgICAgYXV0byBpdGVtV2lkdGggPSBsZWFkaW5nTG9naWNhbFdpZHRoID8gKnN0ZDo6ZXhj
aGFuZ2UobGVhZGluZ0xvZ2ljYWxXaWR0aCwgV1RGOjpudWxsb3B0KSA6IGlubGluZUl0ZW1XaWR0
aCgqbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtLCBjdXJyZW50TG9naWNhbFJpZ2h0KTsKLSAgICAg
ICAgbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmFwcGVuZElubGluZUl0ZW0oKm1fcGFydGlh
bExlYWRpbmdUZXh0SXRlbSwgaXRlbVdpZHRoKTsKLSAgICAgICAgY3VycmVudExvZ2ljYWxSaWdo
dCArPSBpdGVtV2lkdGg7Ci0gICAgICAgICsrY3VycmVudElubGluZUl0ZW1JbmRleDsKLSAgICB9
Ci0KLSAgICBmb3IgKGF1dG8gaW5kZXggPSBjdXJyZW50SW5saW5lSXRlbUluZGV4OyBpbmRleCA8
IHNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleDsgKytpbmRleCkgewotICAgICAgICBhdXRvJiBpbmxp
bmVJdGVtID0gbV9pbmxpbmVJdGVtc1tpbmRleF07Ci0gICAgICAgIGlmIChpbmxpbmVJdGVtLmlz
RmxvYXQoKSkgewotICAgICAgICAgICAgbGluZUNhbmRpZGF0ZS5mbG9hdEl0ZW0gPSAmaW5saW5l
SXRlbTsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHksIG11
c3QgYmUgdGhlIG9ubHkgaXRlbSBpbiB0aGUgbGlzdC4KLSAgICAgICAgICAgIEFTU0VSVChjdXJy
ZW50SW5saW5lSXRlbUluZGV4ICsgMSA9PSBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXgpOwotICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNU
ZXh0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lu
bGluZUJveEVuZCgpIHx8IGlubGluZUl0ZW0uaXNCb3goKSkgewotICAgICAgICAgICAgQVNTRVJU
KCFsZWFkaW5nTG9naWNhbFdpZHRoIHx8IGlubGluZUl0ZW0uaXNUZXh0KCkpOwotICAgICAgICAg
ICAgYXV0byBsb2dpY2FsV2lkdGggPSBsZWFkaW5nTG9naWNhbFdpZHRoID8gKnN0ZDo6ZXhjaGFu
Z2UobGVhZGluZ0xvZ2ljYWxXaWR0aCwgV1RGOjpudWxsb3B0KSA6IGlubGluZUl0ZW1XaWR0aChp
bmxpbmVJdGVtLCBjdXJyZW50TG9naWNhbFJpZ2h0KTsKLSAgICAgICAgICAgIGxpbmVDYW5kaWRh
dGUuaW5saW5lQ29udGVudC5hcHBlbmRJbmxpbmVJdGVtKGlubGluZUl0ZW0sIGxvZ2ljYWxXaWR0
aCk7Ci0gICAgICAgICAgICBjdXJyZW50TG9naWNhbFJpZ2h0ICs9IGxvZ2ljYWxXaWR0aDsKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmxpbmVJdGVtLmlz
TGluZUJyZWFrKCkgfHwgaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkpIHsKLSAg
ICAgICAgICAgIC8vIFNpbmNlIGJvdGggPGJyPiBhbmQgPHdicj4gYXJlIGV4cGxpY2l0IHdvcmQg
YnJlYWsgb3Bwb3J0dW5pdGllcyB0aGV5IGhhdmUgdG8gYmUgdHJhaWxpbmcgaXRlbXMgaW4gdGhp
cyBjYW5kaWRhdGUgcnVuIGxpc3QgdW5sZXNzIHRoZXkgYXJlIGVtYmVkZGVkIGluIGlubGluZSBi
b3hlcy4KLSAgICAgICAgICAgIC8vIGUuZy4gPHNwYW4+PHdicj48L3NwYW4+Ci0jaWYgQVNTRVJU
X0VOQUJMRUQKLSAgICAgICAgICAgIGZvciAoYXV0byBpID0gaW5kZXggKyAxOyBpIDwgc29mdFdy
YXBPcHBvcnR1bml0eUluZGV4OyArK2kpCi0gICAgICAgICAgICAgICAgQVNTRVJUKG1faW5saW5l
SXRlbXNbaV0uaXNJbmxpbmVCb3hFbmQoKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlubGluZUl0
ZW0uaXNMaW5lQnJlYWsoKSA/IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5hcHBlbmRUcmFp
bGluZ0xpbmVCcmVhayhpbmxpbmVJdGVtKSA6IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5h
cHBlbmR0cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5KGlubGluZUl0ZW0pOwotICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0g
ICAgfQotICAgIGF1dG8gaW5saW5lQ29udGVudEVuZHNJblNvZnRXcmFwT3Bwb3J0dW5pdHkgPSBb
Jl0gewotICAgICAgICBpZiAoIXNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCB8fCBzb2Z0V3JhcE9w
cG9ydHVuaXR5SW5kZXggPT0gbGF5b3V0UmFuZ2UuZW5kKSB7Ci0gICAgICAgICAgICAvLyBUaGlz
IGNhbmRpZGF0ZSBpbmxpbmUgY29udGVudCBlbmRzIGJlY2F1c2UgdGhlIGVudGlyZSBjb250ZW50
IGVuZHMgYW5kIG5vdCBiZWNhdXNlIHRoZXJlJ3MgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkuCi0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1faW5saW5l
SXRlbXNbc29mdFdyYXBPcHBvcnR1bml0eUluZGV4IC0gMV0uaXNGbG9hdCgpKSB7Ci0gICAgICAg
ICAgICAvLyBXaGlsZSB3ZSBzdG9wIGF0IGZsb2F0cywgdGhleSBhcmUgbm90IGNvbnNpZGVyZWQg
cmVhbCBzb2Z0IHdyYXAgb3Bwb3J0dW5pdGllcy4gCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4
dC0zLyNsaW5lLWJyZWFrLWRldGFpbHMKLSAgICAgICAgYXV0byYgdHJhaWxpbmdJbmxpbmVJdGVt
ID0gbV9pbmxpbmVJdGVtc1tzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggLSAxXTsKLSAgICAgICAg
aWYgKHRyYWlsaW5nSW5saW5lSXRlbS5pc0JveCgpIHx8IHRyYWlsaW5nSW5saW5lSXRlbS5pc0xp
bmVCcmVhaygpIHx8IHRyYWlsaW5nSW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkg
fHwgdHJhaWxpbmdJbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpIHsKLSAgICAgICAgICAgIC8v
IEZvciBXZWItY29tcGF0aWJpbGl0eSB0aGVyZSBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBi
ZWZvcmUgYW5kIGFmdGVyIGVhY2ggcmVwbGFjZWQgZWxlbWVudCBvciBvdGhlciBhdG9taWMgaW5s
aW5lLgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRy
YWlsaW5nSW5saW5lSXRlbS5pc1RleHQoKSkgewotICAgICAgICAgICAgYXV0byYgaW5saW5lVGV4
dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4odHJhaWxpbmdJbmxpbmVJdGVtKTsKLSAg
ICAgICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKLSAgICAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIC8vIE5vdyBpbiBjYXNlIG9mIG5vbi13aGl0
ZXNwYWNlIHRyYWlsaW5nIGNvbnRlbnQsIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGFjdHVhbCBz
b2Z0IHdyYXAgb3Bwb3J0dW5pdHkgYmVsb25ncyB0byB0aGUgbmV4dCBzZXQuCi0gICAgICAgICAg
ICAvLyBlLmcuICJ0aGlzX2lzX3RoZV90cmFpbGluZ19ydW48c3Bhbj4gPC1idXRfdGhpc19zcGFj
ZV9oZXJlX2lzX3RoZV9zb2Z0X3dyYXBfb3Bwb3J0dW5pdHkiCi0gICAgICAgICAgICAvLyBXaGVu
IHRoZXJlJ3MgYW4gaW5saW5lIGJveCBzdGFydCg8c3Bhbj4pL2VuZCg8L3NwYW4+KSBiZXR3ZWVu
IHRoZSB0cmFpbGluZyBhbmQgdGhlIChuZXh0KWxlYWRpbmcgcnVuLCB3aGlsZSB3ZSBicmVhayBi
ZWZvcmUgdGhlIGlubGluZSBib3ggc3RhcnQgKDxzcGFuPikKLSAgICAgICAgICAgIC8vIHRoZSBh
Y3R1YWwgc29mdCB3cmFwIHBvc2l0aW9uIGlzIGFmdGVyIHRoZSBpbmxpbmUgYm94IHN0YXJ0ICg8
c3Bhbj4pIGJ1dCBpbiB0ZXJtcyBvZiBsaW5lIGJyZWFraW5nIGNvbnRpbnVpdHkgdGhlIGlubGlu
ZSBib3ggc3RhcnQgKDxzcGFuPikgYW5kIHRoZSB3aGl0ZXNwYWNlIHJ1biBiZWxvbmcgdG9nZXRo
ZXIuCi0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChsYXlvdXRSYW5nZS5lbmQgPD0gbV9pbmxp
bmVJdGVtcy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChhdXRvIGluZGV4ID0gc29mdFdyYXBP
cHBvcnR1bml0eUluZGV4OyBpbmRleCA8IGxheW91dFJhbmdlLmVuZDsgKytpbmRleCkgewotICAg
ICAgICAgICAgICAgIGlmIChtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJveFN0YXJ0KCkg
fHwgbV9pbmxpbmVJdGVtc1tpbmRleF0uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IENoZWNrIGlmIFtub24t
d2hpdGVzcGFjZV1baW5saW5lLWJveF1bbm8td2hpdGVzcGFjZV0gY29udGVudCBoYXMgcnVsZXMg
YWJvdXQgaXQuCi0gICAgICAgICAgICAgICAgLy8gRm9yIG5vdyBsZXQncyBzYXkgdGhlIHNvZnQg
d3JhcCBwb3NpdGlvbiBiZWxvbmdzIHRvIHRoZSBuZXh0IHNldCBvZiBydW5zIHdoZW4gW25vbi13
aGl0ZXNwYWNlXVtpbmxpbmUtYm94XVt3aGl0ZXNwYWNlXSwgW25vbi13aGl0ZXNwYWNlXVtpbmxp
bmUtYm94XVtib3hdIGV0Yy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbV9pbmxpbmVJdGVtc1tp
bmRleF0uaXNUZXh0KCkgJiYgIWRvd25jYXN0PElubGluZVRleHRJdGVtPihtX2lubGluZUl0ZW1z
W2luZGV4XSkuaXNXaGl0ZXNwYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgfTsKLSAgICBsaW5lQ2FuZGlkYXRlLmlubGluZUNvbnRlbnQu
c2V0SGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KGlubGluZUNvbnRlbnRFbmRzSW5Tb2Z0
V3JhcE9wcG9ydHVuaXR5KCkpOwotfQotCi1zaXplX3QgTGluZUJ1aWxkZXI6Om5leHRXcmFwT3Bw
b3J0dW5pdHkoc2l6ZV90IHN0YXJ0SW5kZXgsIGNvbnN0IExpbmVCdWlsZGVyOjpJbmxpbmVJdGVt
UmFuZ2UmIGxheW91dFJhbmdlKSBjb25zdAotewotICAgIC8vIDEuIEZpbmQgdGhlIHN0YXJ0IGNh
bmRpZGF0ZSBieSBza2lwcGluZyBsZWFkaW5nIG5vbi1jb250ZW50IGl0ZW1zIGUuZyAiPHNwYW4+
PHNwYW4+c3RhcnQiLiBPcHBvcnR1bml0eSBpcyBhZnRlciAiPHNwYW4+PHNwYW4+Ii4KLSAgICAv
LyAyLiBGaW5kIHRoZSBlbmQgY2FuZGlkYXRlIGJ5IHNraXBwaW5nIG5vbi1jb250ZW50IGl0ZW1z
IGluYmV0d2VlbiBlLmcuICI8c3Bhbj48c3Bhbj5zdGFydDwvc3Bhbj5lbmQiLiBPcHBvcnR1bml0
eSBpcyBhZnRlciAiPC9zcGFuPiIuCi0gICAgLy8gMy4gQ2hlY2sgaWYgdGhlcmUncyBhIHNvZnQg
d3JhcCBvcHBvcnR1bml0eSBiZXR3ZWVuIHRoZSAyIGNhbmRpZGF0ZSBpbmxpbmUgaXRlbXMgYW5k
IHJlcGVhdC4KLSAgICAvLyA0LiBBbnkgZm9yY2UgbGluZSBicmVhay9leHBsaWNpdCB3cmFwIGNv
bnRlbnQgaW5iZXR3ZWVuIGlzIGNvbnNpZGVyZWQgYXMgd3JhcCBvcHBvcnR1bml0eS4KLQotICAg
IC8vIFtleC1dW2lubGluZSBib3ggc3RhcnRdW2lubGluZSBib3ggZW5kXVtmbG9hdF1bYW1wbGVd
IChleC08c3Bhbj48L3NwYW4+PGRpdiBzdHlsZT0iZmxvYXQ6bGVmdCI+PC9kaXY+YW1wbGUpLiBX
cmFwIGluZGV4IGlzIGF0IFtleC1dLgotICAgIC8vIFtleF1baW5saW5lIGJveCBzdGFydF1bYW1w
LV1baW5saW5lIGJveCBzdGFydF1bbGVdIChleDxzcGFuPmFtcC08c3Bhbj5hbXBsZSkuIFdyYXAg
aW5kZXggaXMgYXQgW2FtcC1dLgotICAgIC8vIFtleC1dW2lubGluZSBib3ggc3RhcnRdW2xpbmUg
YnJlYWtdW2FtcGxlXSAoZXgtPHNwYW4+PGJyPmFtcGxlKS4gV3JhcCBpbmRleCBpcyBhZnRlciBb
YnJdLgotICAgIGF1dG8gcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBPcHRpb25hbDxzaXplX3Q+
IHsgfTsKLSAgICBmb3IgKGF1dG8gaW5kZXggPSBzdGFydEluZGV4OyBpbmRleCA8IGxheW91dFJh
bmdlLmVuZDsgKytpbmRleCkgewotICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gbV9pbmxpbmVJ
dGVtc1tpbmRleF07Ci0gICAgICAgIGlmIChpbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkgfHwgaW5s
aW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkpIHsKLSAgICAgICAgICAgIC8vIFdlIGFs
d2F5cyBzdG9wIGF0IGV4cGxpY2l0IHdyYXBwaW5nIG9wcG9ydHVuaXRpZXMgZS5nLiA8YnI+LiBI
b3dldmVyIHRoZSB3cmFwIHBvc2l0aW9uIG1heSBiZSBhdCBsYXRlciBwb3NpdGlvbi4KLSAgICAg
ICAgICAgIC8vIGUuZy4gPHNwYW4+PHNwYW4+PGJyPjwvc3Bhbj48L3NwYW4+IDwtIHdyYXAgcG9z
aXRpb24gaXMgYWZ0ZXIgdGhlIHNlY29uZCA8L3NwYW4+Ci0gICAgICAgICAgICAvLyBidXQgaW4g
Y2FzZSBvZiA8c3Bhbj48YnI+PHNwYW4+PC9zcGFuPjwvc3Bhbj4gPC0gd3JhcCBwb3NpdGlvbiBp
cyByaWdodCBhZnRlciA8YnI+LgotICAgICAgICAgICAgZm9yICgrK2luZGV4OyBpbmRleCA8IGxh
eW91dFJhbmdlLmVuZCAmJiBtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJveEVuZCgpOyAr
K2luZGV4KSB7IH0KLSAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgfQotICAgICAg
ICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGlu
ZUJveEVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBOZWVkIHRvIHNlZSB3aGF0IGNvbWVzIG5leHQg
dG8gZGVjaWRlLgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQVNT
RVJUKGlubGluZUl0ZW0uaXNUZXh0KCkgfHwgaW5saW5lSXRlbS5pc0JveCgpIHx8IGlubGluZUl0
ZW0uaXNGbG9hdCgpKTsKLSAgICAgICAgaWYgKCFwcmV2aW91c0lubGluZUl0ZW1JbmRleCkgewot
ICAgICAgICAgICAgcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBpbmRleDsKLSAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgcHJldmlvdXMg
YW5kIGN1cnJlbnQgaXRlbXMgYXJlIG5vdCBuZWNlc3NhcmlseSBhZGphY2VudCBpdGVtcyBlLmcg
InByZXZpb3VzPHNwYW4+Y3VycmVudDwvc3Bhbj4iCi0gICAgICAgIGF1dG8mIHByZXZpb3VzSXRl
bSA9IG1faW5saW5lSXRlbXNbKnByZXZpb3VzSW5saW5lSXRlbUluZGV4XTsKLSAgICAgICAgYXV0
byYgY3VycmVudEl0ZW0gPSBtX2lubGluZUl0ZW1zW2luZGV4XTsKLSAgICAgICAgaWYgKGlzQXRT
b2Z0V3JhcE9wcG9ydHVuaXR5KG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQsIHByZXZpb3VzSXRl
bSwgY3VycmVudEl0ZW0pKSB7Ci0gICAgICAgICAgICBpZiAoKnByZXZpb3VzSW5saW5lSXRlbUlu
ZGV4ICsgMSA9PSBpbmRleCAmJiAoIXByZXZpb3VzSXRlbS5pc1RleHQoKSB8fCAhY3VycmVudEl0
ZW0uaXNUZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugb25seSBrbm93IHRoZSBleGFj
dCBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgaW5kZXggd2hlbiB0aGUgcHJldmlvdXMgYW5kIGN1cnJl
bnQgaXRlbXMgYXJlIG5leHQgdG8gZWFjaCBvdGhlci4KLSAgICAgICAgICAgICAgICByZXR1cm4g
aW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGVyZSdzIGEgc29mdCB3cmFw
IG9wcG9ydHVuaXR5IGJldHdlZW4gJ3ByZXZpb3VzSW5saW5lSXRlbUluZGV4JyBhbmQgJ2luZGV4
Jy4KLSAgICAgICAgICAgIC8vIE5vdyBmb3J3YXJkLWZpbmQgZnJvbSB0aGUgc3RhcnQgcG9zaXRp
b24gdG8gc2VlIHdoZXJlIHdlIGNhbiBhY3R1YWxseSB3cmFwLgotICAgICAgICAgICAgLy8gW2V4
LV1bYW1wbGVdIHZzLiBbZXgtXVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF1bYW1w
bGVdCi0gICAgICAgICAgICAvLyB3aGVyZSBbZXgtXSBpcyBzdGFydENvbnRlbnQgYW5kIFthbXBs
ZV0gaXMgdGhlIG5leHRDb250ZW50LgotICAgICAgICAgICAgZm9yIChhdXRvIGNhbmRpZGF0ZUlu
ZGV4ID0gKnByZXZpb3VzSW5saW5lSXRlbUluZGV4ICsgMTsgY2FuZGlkYXRlSW5kZXggPCBpbmRl
eDsgKytjYW5kaWRhdGVJbmRleCkgewotICAgICAgICAgICAgICAgIGlmIChtX2lubGluZUl0ZW1z
W2NhbmRpZGF0ZUluZGV4XS5pc0lubGluZUJveFN0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICAg
ICAgLy8gaW5saW5lIGNvbnRlbnQgYW5kIFtpbmxpbmUgYm94IHN0YXJ0XSBhbmQgW2lubGluZSBi
b3ggZW5kXSBmb3JtIHVuYnJlYWthYmxlIGNvbnRlbnQuCi0gICAgICAgICAgICAgICAgICAgIC8v
IGV4LTxzcGFuPjwvc3Bhbj5hbXBsZSAgOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC0i
LgotICAgICAgICAgICAgICAgICAgICAvLyBleC08L3NwYW4+PC9zcGFuPmFtcGxlIDogd3JhcCBv
cHBvcnR1bml0eSBpcyBhZnRlciAiZXgtPC9zcGFuPjwvc3Bhbj4iLgotICAgICAgICAgICAgICAg
ICAgICAvLyBleC08L3NwYW4+PHNwYW4+YW1wbGU8L3NwYW4+IDogd3JhcCBvcHBvcnR1bml0eSBp
cyBhZnRlciAiZXgtPC9zcGFuPiIuCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4LTxzcGFuPjxz
cGFuPmFtcGxlPC9zcGFuPjwvc3Bhbj4gOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC0i
LgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlSW5kZXg7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAg
ICB9Ci0gICAgICAgIHByZXZpb3VzSW5saW5lSXRlbUluZGV4ID0gaW5kZXg7Ci0gICAgfQotICAg
IHJldHVybiBsYXlvdXRSYW5nZS5lbmQ7Ci19Ci0KLXZvaWQgTGluZUJ1aWxkZXI6OmhhbmRsZUZs
b2F0Q29udGVudChjb25zdCBJbmxpbmVJdGVtJiBmbG9hdEl0ZW0pCi17Ci0gICAgYXV0byYgZmxv
YXRCb3ggPSBmbG9hdEl0ZW0ubGF5b3V0Qm94KCk7Ci0gICAgbV9mbG9hdHMuYXBwZW5kKCZmbG9h
dEJveCk7Ci0KLSAgICBhdXRvKiBmbG9hdGluZ1N0YXRlID0gdGhpcy0+ZmxvYXRpbmdTdGF0ZSgp
OwotICAgIGlmICghZmxvYXRpbmdTdGF0ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNTRVJU
KGZvcm1hdHRpbmdTdGF0ZSgpKTsKLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdT
dGF0ZSgpLT5ib3hHZW9tZXRyeShmbG9hdEJveCk7Ci0gICAgLy8gU2V0IHN0YXRpYyBwb3NpdGlv
biBmaXJzdC4KLSAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVmdChMYXlvdXRQb2ludCB7
IG1fbGluZUxvZ2ljYWxSZWN0LnRvcExlZnQoKSB9KTsKLSAgICAvLyBGbG9hdCBpdC4KLSAgICBB
U1NFUlQobV9yb290SG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICBhdXRvIGZsb2F0aW5nQ29u
dGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7IGZvcm1hdHRpbmdDb250ZXh0KCksICpmbG9hdGluZ1N0
YXRlIH07Ci0gICAgYXV0byBmbG9hdGluZ1Bvc2l0aW9uID0gZmxvYXRpbmdDb250ZXh0LnBvc2l0
aW9uRm9yRmxvYXQoZmxvYXRCb3gsICptX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHMpOwotICAg
IGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nUG9zaXRpb24pOwotICAgIGZs
b2F0aW5nU3RhdGUtPmFwcGVuZChmbG9hdGluZ0NvbnRleHQudG9GbG9hdEl0ZW0oZmxvYXRCb3gp
KTsKLSAgICAvLyBDaGVjayBpZiB0aGlzIGZsb2F0IHNocmlua3MgdGhlIGxpbmUgKHRoZXkgZG9u
J3QgZ2V0IHBvc2l0aW9uZWQgaGlnaGVyIHRoYW4gdGhlIGxpbmUpLgotICAgIGlmIChmbG9hdGlu
Z1Bvc2l0aW9uLnkoKSA+IG1fbGluZUxvZ2ljYWxSZWN0LmJvdHRvbSgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IHRydWU7Ci0gICAgYXV0
byBmbG9hdEJveFdpZHRoID0gaW5saW5lSXRlbVdpZHRoKGZsb2F0SXRlbSwgeyB9KTsKLSAgICBp
ZiAoZmxvYXRCb3guaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgIG1fbGluZUxv
Z2ljYWxSZWN0LnNldExlZnQobV9saW5lTG9naWNhbFJlY3QubGVmdCgpICsgZmxvYXRCb3hXaWR0
aCk7ICAgIAotICAgIG1fbGluZUxvZ2ljYWxSZWN0LmV4cGFuZEhvcml6b250YWxseSgtZmxvYXRC
b3hXaWR0aCk7Ci19Ci0KLUxpbmVCdWlsZGVyOjpSZXN1bHQgTGluZUJ1aWxkZXI6OmhhbmRsZUlu
bGluZUNvbnRlbnQoSW5saW5lQ29udGVudEJyZWFrZXImIGlubGluZUNvbnRlbnRCcmVha2VyLCBj
b25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBjb25zdCBMaW5lQ2FuZGlkYXRlJiBs
aW5lQ2FuZGlkYXRlKQotewotICAgIGF1dG8mIGlubGluZUNvbnRlbnQgPSBsaW5lQ2FuZGlkYXRl
LmlubGluZUNvbnRlbnQ7Ci0gICAgaWYgKGlubGluZUNvbnRlbnQuY29udGludW91c0NvbnRlbnQo
KS5ydW5zKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFTU0VSVChpbmxpbmVDb250ZW50LnRyYWls
aW5nTGluZUJyZWFrKCkgfHwgaW5saW5lQ29udGVudC50cmFpbGluZ1dvcmRCcmVha09wcG9ydHVu
aXR5KCkpOwotICAgICAgICByZXR1cm4geyBpbmxpbmVDb250ZW50LnRyYWlsaW5nTGluZUJyZWFr
KCkgPyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllcyA6IElubGluZUNvbnRl
bnRCcmVha2VyOjpJc0VuZE9mTGluZTo6Tm8gfTsKLSAgICB9Ci0gICAgYXV0byBzaG91bGREaXNh
YmxlSHlwaGVuYXRpb24gPSBbJl0gewotICAgICAgICBhdXRvJiBzdHlsZSA9IHJvb3QoKS5zdHls
ZSgpOwotICAgICAgICB1bnNpZ25lZCBsaW1pdExpbmVzID0gc3R5bGUuaHlwaGVuYXRpb25MaW1p
dExpbmVzKCkgPT0gUmVuZGVyU3R5bGU6OmluaXRpYWxIeXBoZW5hdGlvbkxpbWl0TGluZXMoKSA/
IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSA6IHN0eWxlLmh5cGhlbmF0aW9u
TGltaXRMaW5lcygpOwotICAgICAgICByZXR1cm4gbV9zdWNjZXNzaXZlSHlwaGVuYXRlZExpbmVD
b3VudCA+PSBsaW1pdExpbmVzOwotICAgIH07Ci0gICAgaWYgKHNob3VsZERpc2FibGVIeXBoZW5h
dGlvbigpKQotICAgICAgICBpbmxpbmVDb250ZW50QnJlYWtlci5zZXRIeXBoZW5hdGlvbkRpc2Fi
bGVkKCk7Ci0KLSAgICBhdXRvJiBjb250aW51b3VzSW5saW5lQ29udGVudCA9IGxpbmVDYW5kaWRh
dGUuaW5saW5lQ29udGVudC5jb250aW51b3VzQ29udGVudCgpOwotICAgIGF1dG8gbGluZUxvZ2lj
YWxSZWN0Rm9yQ2FuZGlkYXRlQ29udGVudCA9IFsmXSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRo
ZSBjYW5kaWRhdGUgY29udGVudCB3b3VsZCBzdHJldGNoIHRoZSBsaW5lIGFuZCB3aGV0aGVyIGFk
ZGl0aW9uYWwgZmxvYXRzIGFyZSBnZXR0aW5nIGluIHRoZSB3YXkuCi0gICAgICAgIGlmICghZmxv
YXRpbmdTdGF0ZSgpIHx8ICFpbmxpbmVDb250ZW50Lmhhc0lubGluZUxldmVsQm94KCkpCi0gICAg
ICAgICAgICByZXR1cm4gbV9saW5lTG9naWNhbFJlY3Q7Ci0gICAgICAgIGF1dG8gbWF4aW11bUxp
bmVMb2dpY2FsSGVpZ2h0ID0gbV9saW5lTG9naWNhbFJlY3QuaGVpZ2h0KCk7Ci0gICAgICAgIGZv
ciAoYXV0byYgcnVuIDogY29udGludW91c0lubGluZUNvbnRlbnQucnVucygpKSB7Ci0gICAgICAg
ICAgICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIGlubGluZSBib3hlcyB0b28uCi0gICAgICAg
ICAgICBpZiAoIXJ1bi5pbmxpbmVJdGVtLmlzQm94KCkpCi0gICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICBtYXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQgPSBzdGQ6Om1heChtYXhp
bXVtTGluZUxvZ2ljYWxIZWlnaHQsIElubGluZUxheW91dFVuaXQgeyBmb3JtYXR0aW5nQ29udGV4
dCgpLmdlb21ldHJ5Rm9yQm94KHJ1bi5pbmxpbmVJdGVtLmxheW91dEJveCgpKS5tYXJnaW5Cb3hI
ZWlnaHQoKSB9KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF4aW11bUxpbmVMb2dpY2FsSGVp
Z2h0ID09IG1fbGluZUxvZ2ljYWxSZWN0LmhlaWdodCgpKQotICAgICAgICAgICAgcmV0dXJuIG1f
bGluZUxvZ2ljYWxSZWN0OwotICAgICAgICBhdXRvIGFkanVzdGVkTGluZUxvZ2ljYWxSZWN0ID0g
SW5saW5lUmVjdCB7IG1fbGluZUxvZ2ljYWxSZWN0LnRvcCgpLCBtX2xpbmVMb2dpY2FsUmVjdC5s
ZWZ0KCksIG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCksIG1heGltdW1MaW5lTG9naWNhbEhlaWdo
dCB9OwotICAgICAgICBpZiAoYXV0byBob3Jpem9udGFsQ29uc3RyYWludHMgPSBmbG9hdENvbnN0
cmFpbnRzKGFkanVzdGVkTGluZUxvZ2ljYWxSZWN0KSkgewotICAgICAgICAgICAgYWRqdXN0ZWRM
aW5lTG9naWNhbFJlY3Quc2V0TGVmdChob3Jpem9udGFsQ29uc3RyYWludHMtPmxvZ2ljYWxMZWZ0
KTsKLSAgICAgICAgICAgIGFkanVzdGVkTGluZUxvZ2ljYWxSZWN0LnNldFdpZHRoKGhvcml6b250
YWxDb25zdHJhaW50cy0+bG9naWNhbFdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4g
YWRqdXN0ZWRMaW5lTG9naWNhbFJlY3Q7Ci0gICAgfSgpOwotICAgIGF1dG8gYXZhaWxhYmxlV2lk
dGggPSBbJl0gewotICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoRm9yQ29udGVudCA9IGxpbmVM
b2dpY2FsUmVjdEZvckNhbmRpZGF0ZUNvbnRlbnQud2lkdGgoKSAtIG1fbGluZS5jb250ZW50TG9n
aWNhbFJpZ2h0KCk7Ci0gICAgICAgIHJldHVybiBzdGQ6OmlzbmFuKGF2YWlsYWJsZVdpZHRoRm9y
Q29udGVudCkgPyBtYXhJbmxpbmVMYXlvdXRVbml0KCkgOiBhdmFpbGFibGVXaWR0aEZvckNvbnRl
bnQ7Ci0gICAgfSgpOwotICAgIC8vIFdoaWxlIHRoZSBmbG9hdHMgYXJlIG5vdCBjb25zaWRlcmVk
IHRvIGJlIG9uIHRoZSBsaW5lLCB0aGV5IG1ha2UgdGhlIGxpbmUgY29udGVudGZ1bCBmb3IgbGlu
ZSBicmVha2luZy4KLSAgICBhdXRvIGxpbmVIYXNDb250ZW50ID0gIW1fbGluZS5ydW5zKCkuaXNF
bXB0eSgpIHx8IG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0OwotICAgIGF1dG8gbGluZVN0
YXR1cyA9IElubGluZUNvbnRlbnRCcmVha2VyOjpMaW5lU3RhdHVzIHsgbV9saW5lLmNvbnRlbnRM
b2dpY2FsUmlnaHQoKSwgYXZhaWxhYmxlV2lkdGgsIG1fbGluZS50cmltbWFibGVUcmFpbGluZ1dp
ZHRoKCksIG1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpLCBtX2xpbmUuaXNUcmFpbGlu
Z1J1bkZ1bGx5VHJpbW1hYmxlKCksIGxpbmVIYXNDb250ZW50LCAhbV93cmFwT3Bwb3J0dW5pdHlM
aXN0LmlzRW1wdHkoKSB9OwotICAgIGF1dG8gcmVzdWx0ID0gaW5saW5lQ29udGVudEJyZWFrZXIu
cHJvY2Vzc0lubGluZUNvbnRlbnQoY29udGludW91c0lubGluZUNvbnRlbnQsIGxpbmVTdGF0dXMp
OwotICAgIGF1dG8mIGNhbmRpZGF0ZVJ1bnMgPSBjb250aW51b3VzSW5saW5lQ29udGVudC5ydW5z
KCk7Ci0gICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3Vs
dDo6QWN0aW9uOjpLZWVwKSB7Ci0gICAgICAgIC8vIFRoaXMgY29udGludW91cyBjb250ZW50IGNh
biBiZSBmdWxseSBwbGFjZWQgb24gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAgbV9saW5lTG9n
aWNhbFJlY3QgPSBsaW5lTG9naWNhbFJlY3RGb3JDYW5kaWRhdGVDb250ZW50OwotICAgICAgICBm
b3IgKGF1dG8mIHJ1biA6IGNhbmRpZGF0ZVJ1bnMpCi0gICAgICAgICAgICBtX2xpbmUuYXBwZW5k
KHJ1bi5pbmxpbmVJdGVtLCBydW4ubG9naWNhbFdpZHRoKTsKLSAgICAgICAgaWYgKGxpbmVDYW5k
aWRhdGUuaW5saW5lQ29udGVudC5oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoKSkgewot
ICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGFsbG93ZWQgdG8gd3JhcCBhdCB0aGlzIHBv
c2l0aW9uLgotICAgICAgICAgICAgYXV0byYgdHJhaWxpbmdJdGVtID0gY2FuZGlkYXRlUnVucy5s
YXN0KCkuaW5saW5lSXRlbTsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBUaGVyZSBtdXN0IGJlIGEg
d2F5IHRvIGRlY2lkZSBpZiB0aGUgdHJhaWxpbmcgcnVuIGFjdHVhbGx5IGVuZGVkIHVwIG9uIHRo
ZSBsaW5lLgotICAgICAgICAgICAgLy8gTGV0J3MganVzdCBkZWFsIHdpdGggY29sbGFwc2VkIGxl
YWRpbmcgd2hpdGVzcGFjZSBmb3Igbm93LgotICAgICAgICAgICAgaWYgKCFtX2xpbmUucnVucygp
LmlzRW1wdHkoKSAmJiBJbmxpbmVDb250ZW50QnJlYWtlcjo6aXNXcmFwcGluZ0FsbG93ZWQodHJh
aWxpbmdJdGVtKSkKLSAgICAgICAgICAgICAgICBtX3dyYXBPcHBvcnR1bml0eUxpc3QuYXBwZW5k
KCZ0cmFpbGluZ0l0ZW0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB7IHJlc3VsdC5pc0Vu
ZE9mTGluZSwgeyBjYW5kaWRhdGVSdW5zLnNpemUoKSwgZmFsc2UgfSB9OwotICAgIH0KLQotICAg
IGF1dG8gZWxpZ2libGVPdmVyZmxvd1dpZHRoQXNMZWFkaW5nID0gWyZdICgpIC0+IE9wdGlvbmFs
PElubGluZUxheW91dFVuaXQ+IHsKLSAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBv
dGhlciB0eXBlcyBvZiBjb250aW51b3VzIGNvbnRlbnQuCi0gICAgICAgIEFTU0VSVChyZXN1bHQu
YWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6V3JhcCB8fCBy
ZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6QnJl
YWspOwotICAgICAgICBpZiAoY2FuZGlkYXRlUnVucy5zaXplKCkgIT0gMSB8fCAhY2FuZGlkYXRl
UnVucy5maXJzdCgpLmlubGluZUl0ZW0uaXNUZXh0KCkpCi0gICAgICAgICAgICByZXR1cm4geyB9
OwotICAgICAgICBhdXRvJiBpbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVt
PihjYW5kaWRhdGVSdW5zLmZpcnN0KCkuaW5saW5lSXRlbSk7Ci0gICAgICAgIGlmIChpbmxpbmVU
ZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAg
IGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlv
bjo6V3JhcCkKLSAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVSdW5zLmZpcnN0KCkubG9naWNh
bFdpZHRoOwotICAgICAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250ZW50QnJlYWtl
cjo6UmVzdWx0OjpBY3Rpb246OkJyZWFrICYmIHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50
LT5wYXJ0aWFsUnVuKQotICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVJ1bnMuZmlyc3QoKS5s
b2dpY2FsV2lkdGggLSByZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+cGFydGlhbFJ1bi0+
bG9naWNhbFdpZHRoOwotICAgICAgICByZXR1cm4geyB9OwotICAgIH07Ci0KLSAgICBpZiAocmVz
dWx0LmFjdGlvbiA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rpb246OldyYXAp
IHsKLSAgICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJl
YWtlcjo6SXNFbmRPZkxpbmU6Olllcyk7Ci0gICAgICAgIC8vIFRoaXMgY29udGludW91cyBjb250
ZW50IGNhbid0IGJlIHBsYWNlZCBvbiB0aGUgY3VycmVudCBsaW5lLiBOb3RoaW5nIHRvIGNvbW1p
dCBhdCB0aGlzIHRpbWUuCi0gICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJ
c0VuZE9mTGluZTo6WWVzLCB7IH0sIHsgfSwgZWxpZ2libGVPdmVyZmxvd1dpZHRoQXNMZWFkaW5n
KCkgfTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFr
ZXI6OlJlc3VsdDo6QWN0aW9uOjpXcmFwV2l0aEh5cGhlbikgewotICAgICAgICBBU1NFUlQocmVz
dWx0LmlzRW5kT2ZMaW5lID09IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVz
KTsKLSAgICAgICAgLy8gVGhpcyBjb250aW51b3VzIGNvbnRlbnQgY2FuJ3QgYmUgcGxhY2VkIG9u
IHRoZSBjdXJyZW50IGxpbmUsIG5vdGhpbmcgdG8gY29tbWl0LgotICAgICAgICAvLyBIb3dldmVy
IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGN1cnJlbnQgbGluZSBnYWlucyBhIHRyYWls
aW5nIGh5cGhlbi4KLSAgICAgICAgQVNTRVJUKG1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0
aCgpKTsKLSAgICAgICAgbV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCptX2xpbmUudHJhaWxpbmdT
b2Z0SHlwaGVuV2lkdGgoKSk7Ci0gICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2Vy
OjpJc0VuZE9mTGluZTo6WWVzIH07Ci0gICAgfQotICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElu
bGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0V3JhcE9wcG9y
dHVuaXR5KSB7Ci0gICAgICAgIEFTU0VSVChyZXN1bHQuaXNFbmRPZkxpbmUgPT0gSW5saW5lQ29u
dGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMpOwotICAgICAgICAvLyBOb3Qgb25seSB0aGlz
IGNvbnRlbnQgY2FuJ3QgYmUgcGxhY2VkIG9uIHRoZSBjdXJyZW50IGxpbmUsIGJ1dCB3ZSBldmVu
IG5lZWQgdG8gcmV2ZXJ0IHRoZSBsaW5lIGJhY2sgdG8gYW4gZWFybGllciBwb3NpdGlvbi4KLSAg
ICAgICAgQVNTRVJUKCFtX3dyYXBPcHBvcnR1bml0eUxpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAg
cmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgcmVidWls
ZExpbmUobGF5b3V0UmFuZ2UsICptX3dyYXBPcHBvcnR1bml0eUxpc3QubGFzdCgpKSwgdHJ1ZSB9
IH07Ci0gICAgfQotICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2Vy
OjpSZXN1bHQ6OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0Tm9uT3ZlcmZsb3dpbmdXcmFwT3Bwb3J0dW5p
dHkpIHsKLSAgICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50
QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olllcyk7Ci0gICAgICAgIEFTU0VSVCghbV93cmFwT3Bwb3J0
dW5pdHlMaXN0LmlzRW1wdHkoKSk7Ci0gICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVh
a2VyOjpJc0VuZE9mTGluZTo6WWVzLCB7IHJlYnVpbGRMaW5lRm9yVHJhaWxpbmdTb2Z0SHlwaGVu
KGxheW91dFJhbmdlKSwgdHJ1ZSB9IH07Ci0gICAgfQotICAgIGlmIChyZXN1bHQuYWN0aW9uID09
IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6QnJlYWspIHsKLSAgICAgICAg
QVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRP
ZkxpbmU6Olllcyk7Ci0gICAgICAgIC8vIENvbW1pdCB0aGUgY29tYmluYXRpb24gb2YgZnVsbCBh
bmQgcGFydGlhbCBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAgIEFTU0VSVChy
ZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudCk7Ci0gICAgICAgIGNvbW1pdFBhcnRpYWxDb250
ZW50KGNhbmRpZGF0ZVJ1bnMsICpyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudCk7Ci0gICAg
ICAgIC8vIFdoZW4gYnJlYWtpbmcgbXVsdGlwbGUgcnVucyA8c3BhbiBzdHlsZT0id29yZC1icmVh
azogYnJlYWstYWxsIj50ZXh0PC9zcGFuPjxzcGFuPmNvbnRlbnQ8L3NwYW4+LCB3ZSBtaWdodCBl
bmQgdXAgYnJlYWtpbmcgdGhlbSBhdCBydW4gYm91bmRhcnkuCi0gICAgICAgIC8vIEl0IHNpbXBs
eSBtZWFucyB3ZSBkb24ndCByZWFsbHkgaGF2ZSBhIHBhcnRpYWwgcnVuLiBQYXJ0aWFsIGNvbnRl
bnQgeWVzLCBidXQgbm90IHBhcnRpYWwgcnVuLgotICAgICAgICBhdXRvIHRyYWlsaW5nUnVuSW5k
ZXggPSByZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+dHJhaWxpbmdSdW5JbmRleDsKLSAg
ICAgICAgYXV0byBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgPSB0cmFpbGluZ1J1bkluZGV4ICsg
MTsKLSAgICAgICAgaWYgKCFyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+cGFydGlhbFJ1
bikKLSAgICAgICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGlu
ZTo6WWVzLCB7IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCwgZmFsc2UgfSB9OwotCi0gICAgICAg
IGF1dG8gcGFydGlhbFJ1biA9ICpyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+cGFydGlh
bFJ1bjsKLSAgICAgICAgYXV0byYgdHJhaWxpbmdJbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElu
bGluZVRleHRJdGVtPihjYW5kaWRhdGVSdW5zW3RyYWlsaW5nUnVuSW5kZXhdLmlubGluZUl0ZW0p
OwotICAgICAgICBBU1NFUlQocGFydGlhbFJ1bi5sZW5ndGggPCB0cmFpbGluZ0lubGluZVRleHRJ
dGVtLmxlbmd0aCgpKTsKLSAgICAgICAgYXV0byBvdmVyZmxvd0xlbmd0aCA9IHRyYWlsaW5nSW5s
aW5lVGV4dEl0ZW0ubGVuZ3RoKCkgLSBwYXJ0aWFsUnVuLmxlbmd0aDsKLSAgICAgICAgcmV0dXJu
IHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgY29tbWl0dGVkSW5s
aW5lSXRlbUNvdW50LCBmYWxzZSB9LCBvdmVyZmxvd0xlbmd0aCwgZWxpZ2libGVPdmVyZmxvd1dp
ZHRoQXNMZWFkaW5nKCkgfTsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAg
cmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9OwotfQotCi12
b2lkIExpbmVCdWlsZGVyOjpjb21taXRQYXJ0aWFsQ29udGVudChjb25zdCBJbmxpbmVDb250ZW50
QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OlJ1bkxpc3QmIHJ1bnMsIGNvbnN0IElubGluZUNv
bnRlbnRCcmVha2VyOjpSZXN1bHQ6OlBhcnRpYWxUcmFpbGluZ0NvbnRlbnQmIHBhcnRpYWxUcmFp
bGluZ0NvbnRlbnQpCi17Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJ1bnMu
c2l6ZSgpOyArK2luZGV4KSB7Ci0gICAgICAgIGF1dG8mIHJ1biA9IHJ1bnNbaW5kZXhdOwotICAg
ICAgICBpZiAocGFydGlhbFRyYWlsaW5nQ29udGVudC50cmFpbGluZ1J1bkluZGV4ID09IGluZGV4
KSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYW5kIGNvbW1pdCBwYXJ0aWFsIHRyYWlsaW5nIGl0
ZW0uCi0gICAgICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gcGFydGlhbFRyYWlsaW5nQ29u
dGVudC5wYXJ0aWFsUnVuKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHJ1bi5pbmxpbmVJdGVt
LmlzVGV4dCgpKTsKLSAgICAgICAgICAgICAgICBhdXRvJiB0cmFpbGluZ0lubGluZVRleHRJdGVt
ID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KHJ1bnNbcGFydGlhbFRyYWlsaW5nQ29udGVudC50
cmFpbGluZ1J1bkluZGV4XS5pbmxpbmVJdGVtKTsKLSAgICAgICAgICAgICAgICBhdXRvIHBhcnRp
YWxUcmFpbGluZ1RleHRJdGVtID0gdHJhaWxpbmdJbmxpbmVUZXh0SXRlbS5sZWZ0KHBhcnRpYWxS
dW4tPmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbV9saW5lLmFwcGVuZChwYXJ0aWFsVHJhaWxp
bmdUZXh0SXRlbSwgcGFydGlhbFJ1bi0+bG9naWNhbFdpZHRoKTsKLSAgICAgICAgICAgICAgICBp
ZiAoYXV0byBoeXBoZW5XaWR0aCA9IHBhcnRpYWxSdW4tPmh5cGhlbldpZHRoKQotICAgICAgICAg
ICAgICAgICAgICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBoZW4oKmh5cGhlbldpZHRoKTsKLSAgICAg
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGUgcGFy
dGlhbCBydW4gaXMgdGhlIGxhc3QgY29udGVudCB0byBjb21taXQuCi0gICAgICAgICAgICBtX2xp
bmUuYXBwZW5kKHJ1bi5pbmxpbmVJdGVtLCBydW4ubG9naWNhbFdpZHRoKTsKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtX2xpbmUuYXBwZW5kKHJ1bi5pbmxpbmVJdGVt
LCBydW4ubG9naWNhbFdpZHRoKTsKLSAgICB9Ci19Ci0KLXNpemVfdCBMaW5lQnVpbGRlcjo6cmVi
dWlsZExpbmUoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsYXlvdXRSYW5nZSwgY29uc3QgSW5saW5l
SXRlbSYgbGFzdElubGluZUl0ZW1Ub0FkZCkKLXsKLSAgICBBU1NFUlQoIW1fd3JhcE9wcG9ydHVu
aXR5TGlzdC5pc0VtcHR5KCkpOwotICAgIC8vIFdlIG1pZ2h0IGFscmVhZHkgaGF2ZSBhZGRlZCBm
bG9hdHMuIFRoZXkgc2hyaW5rIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFjZSBmb3IgdGhl
IGxpbmUuCi0gICAgLy8gTGV0J3MganVzdCByZXVzZSB3aGF0IHRoZSBsaW5lIGhhcyBhdCB0aGlz
IHBvaW50LgotICAgIG1fbGluZS5pbml0aWFsaXplKCk7Ci0gICAgYXV0byBjdXJyZW50SXRlbUlu
ZGV4ID0gbGF5b3V0UmFuZ2Uuc3RhcnQ7Ci0gICAgaWYgKG1fcGFydGlhbExlYWRpbmdUZXh0SXRl
bSkgewotICAgICAgICBtX2xpbmUuYXBwZW5kKCptX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0sIGlu
bGluZUl0ZW1XaWR0aCgqbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtLCB7IH0pKTsKLSAgICAgICAg
aWYgKCZtX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0udmFsdWUoKSA9PSAmbGFzdElubGluZUl0ZW1U
b0FkZCkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICArK2N1cnJlbnRJdGVtSW5kZXg7
Ci0gICAgfQotICAgIGZvciAoOyBjdXJyZW50SXRlbUluZGV4IDwgbGF5b3V0UmFuZ2UuZW5kOyAr
K2N1cnJlbnRJdGVtSW5kZXgpIHsKLSAgICAgICAgYXV0byYgaW5saW5lSXRlbSA9IG1faW5saW5l
SXRlbXNbY3VycmVudEl0ZW1JbmRleF07Ci0gICAgICAgIG1fbGluZS5hcHBlbmQoaW5saW5lSXRl
bSwgaW5saW5lSXRlbVdpZHRoKGlubGluZUl0ZW0sIG1fbGluZS5jb250ZW50TG9naWNhbFJpZ2h0
KCkpKTsKLSAgICAgICAgaWYgKCZpbmxpbmVJdGVtID09ICZsYXN0SW5saW5lSXRlbVRvQWRkKQot
ICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJdGVtSW5kZXggLSBsYXlvdXRSYW5nZS5zdGFydCAr
IDE7Ci0gICAgfQotICAgIHJldHVybiBsYXlvdXRSYW5nZS5zaXplKCk7Ci19Ci0KLXNpemVfdCBM
aW5lQnVpbGRlcjo6cmVidWlsZExpbmVGb3JUcmFpbGluZ1NvZnRIeXBoZW4oY29uc3QgSW5saW5l
SXRlbVJhbmdlJiBsYXlvdXRSYW5nZSkKLXsKLSAgICBBU1NFUlQoIW1fd3JhcE9wcG9ydHVuaXR5
TGlzdC5pc0VtcHR5KCkpOwotICAgIC8vIFJldmVydCBhbGwgdGhlIHdheSBiYWNrIHRvIGEgd3Jh
cCBvcHBvcnR1bml0eSB3aGVuIGVpdGhlciBhIHNvZnQgaHlwaGVuIGZpdHMgb3Igbm8gaHlwaGVu
IGlzIHJlcXVpcmVkLgotICAgIGZvciAoYXV0byBpID0gbV93cmFwT3Bwb3J0dW5pdHlMaXN0LnNp
emUoKTsgaS0tID4gMTspIHsKLSAgICAgICAgYXV0byYgc29mdFdyYXBPcHBvcnR1bml0eUl0ZW0g
PSAqbV93cmFwT3Bwb3J0dW5pdHlMaXN0W2ldOwotICAgICAgICAvLyBGSVhNRTogSWYgdGhpcyB0
dXJucyBvdXQgdG8gYmUgYSBwZXJmIGlzc3VlLCB3ZSBjb3VsZCBhbHNvIHRyYXZlcnNlIHRoZSB3
cmFwIGxpc3QgYW5kIGtlZXAgYWRkaW5nIHRoZSBpdGVtcwotICAgICAgICAvLyB3aGlsZSB3YXRj
aGluZyB0aGUgYXZhaWxhYmxlIHdpZHRoIHZlcnkgY2xvc2VseS4KLSAgICAgICAgYXV0byBjb21t
aXR0ZWRDb3VudCA9IHJlYnVpbGRMaW5lKGxheW91dFJhbmdlLCBzb2Z0V3JhcE9wcG9ydHVuaXR5
SXRlbSk7Ci0gICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBtX2xpbmVMb2dpY2FsUmVjdC53
aWR0aCgpIC0gbV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKTsKLSAgICAgICAgYXV0byB0cmFp
bGluZ1NvZnRIeXBoZW5XaWR0aCA9IG1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpOwot
ICAgICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaWxpbmcgaHlwaGVuIG5vdyBmaXRzIHRoZSBsaW5l
IChvciB3ZSBkb24ndCBuZWVkIGh5aGVuIGFueW1vcmUpLgotICAgICAgICBpZiAoIXRyYWlsaW5n
U29mdEh5cGhlbldpZHRoIHx8IHRyYWlsaW5nU29mdEh5cGhlbldpZHRoIDw9IGF2YWlsYWJsZVdp
ZHRoKSB7Ci0gICAgICAgICAgICBpZiAodHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgpCi0gICAgICAg
ICAgICAgICAgbV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCp0cmFpbGluZ1NvZnRIeXBoZW5XaWR0
aCk7Ci0gICAgICAgICAgICByZXR1cm4gY29tbWl0dGVkQ291bnQ7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgLy8gSGF2ZSBhdCBsZWFzdCBzb21lIGNvbnRlbnQgb24gdGhlIGxpbmUuCi0gICAgYXV0
byBjb21taXR0ZWRDb3VudCA9IHJlYnVpbGRMaW5lKGxheW91dFJhbmdlLCAqbV93cmFwT3Bwb3J0
dW5pdHlMaXN0LmZpcnN0KCkpOwotICAgIGlmIChhdXRvIHRyYWlsaW5nU29mdEh5cGhlbldpZHRo
ID0gbV9saW5lLnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCkpCi0gICAgICAgIG1fbGluZS5hZGRU
cmFpbGluZ0h5cGhlbigqdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgpOwotICAgIHJldHVybiBjb21t
aXR0ZWRDb3VudDsKLX0KLQotYm9vbCBMaW5lQnVpbGRlcjo6aXNMYXN0TGluZVdpdGhJbmxpbmVD
b250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGluZVJhbmdlLCBzaXplX3QgbGFzdElubGlu
ZUl0ZW1JbmRleCwgYm9vbCBoYXNQYXJ0aWFsVHJhaWxpbmdDb250ZW50KSBjb25zdAotewotICAg
IGlmIChoYXNQYXJ0aWFsVHJhaWxpbmdDb250ZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgaWYgKGxpbmVSYW5nZS5lbmQgPT0gbGFzdElubGluZUl0ZW1JbmRleCkKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgLy8gT21pdCBmbG9hdHMgdG8gc2VlIGlmIHRoaXMgaXMgdGhlIGxhc3Qg
bGluZSB3aXRoIGlubGluZSBjb250ZW50LgotICAgIGZvciAoYXV0byBpID0gbGFzdElubGluZUl0
ZW1JbmRleDsgaS0tOykgewotICAgICAgICBpZiAoIW1faW5saW5lSXRlbXNbaV0uaXNGbG9hdCgp
KQotICAgICAgICAgICAgcmV0dXJuIGkgPT0gbGluZVJhbmdlLmVuZCAtIDE7Ci0gICAgfQotICAg
IC8vIFRoZXJlIGhhcyB0byBiZSBhdCBsZWFzdCBvbmUgbm9uLWZsb2F0IGl0ZW0uCi0gICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1jb25zdCBDb250YWlu
ZXJCb3gmIExpbmVCdWlsZGVyOjpyb290KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZm9ybWF0dGlu
Z0NvbnRleHQoKS5yb290KCk7Ci19Ci0KLWNvbnN0IExheW91dFN0YXRlJiBMaW5lQnVpbGRlcjo6
bGF5b3V0U3RhdGUoKSBjb25zdAotewotICAgIHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmxh
eW91dFN0YXRlKCk7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5oIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxkZXIuaApkZWxl
dGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyMTcxNTA1ZWZmYjQyZmRmMGIzMjE2NDNiMzQz
ZDhjNTVmY2FlZi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRl
ci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAot
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21h
IG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVk
ZSAiSW5saW5lQ29udGVudEJyZWFrZXIuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3Rh
dGUuaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5lLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBGbG9hdGluZ0NvbnRleHQ7Ci1zdHJ1Y3QgTGluZUNh
bmRpZGF0ZTsKLQotY2xhc3MgTGluZUJ1aWxkZXIgewotcHVibGljOgotICAgIExpbmVCdWlsZGVy
KElubGluZUZvcm1hdHRpbmdDb250ZXh0JiwgRmxvYXRpbmdTdGF0ZSYsIEhvcml6b250YWxDb25z
dHJhaW50cyByb290SG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBJbmxpbmVJdGVtcyYpOwot
ICAgIExpbmVCdWlsZGVyKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiwgY29uc3QgSW5s
aW5lSXRlbXMmKTsKLQotICAgIHN0cnVjdCBJbmxpbmVJdGVtUmFuZ2UgewotICAgICAgICBib29s
IGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBzdGFydCA9PSBlbmQ7IH0KLSAgICAgICAgc2l6ZV90
IHNpemUoKSBjb25zdCB7IHJldHVybiBlbmQgLSBzdGFydDsgfQotICAgICAgICBzaXplX3Qgc3Rh
cnQgeyAwIH07Ci0gICAgICAgIHNpemVfdCBlbmQgeyAwIH07Ci0gICAgfTsKLSAgICB1c2luZyBG
bG9hdExpc3QgPSBWZWN0b3I8Y29uc3QgQm94Kj47Ci0gICAgc3RydWN0IExpbmVDb250ZW50IHsK
LSAgICAgICAgSW5saW5lSXRlbVJhbmdlIGlubGluZUl0ZW1SYW5nZTsKLSAgICAgICAgc2l6ZV90
IHBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGggeyAwIH07Ci0gICAgICAgIE9wdGlvbmFsPElu
bGluZUxheW91dFVuaXQ+IG92ZXJmbG93TG9naWNhbFdpZHRoOwotICAgICAgICBjb25zdCBGbG9h
dExpc3QmIGZsb2F0czsKLSAgICAgICAgYm9vbCBoYXNJbnRydXNpdmVGbG9hdCB7IGZhbHNlIH07
Ci0gICAgICAgIElubGluZUxheW91dFBvaW50IGxvZ2ljYWxUb3BMZWZ0OwotICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IGxpbmVMb2dpY2FsV2lkdGg7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQg
Y29udGVudExvZ2ljYWxXaWR0aDsKLSAgICAgICAgYm9vbCBpc0xhc3RMaW5lV2l0aElubGluZUNv
bnRlbnQgeyB0cnVlIH07Ci0gICAgICAgIHNpemVfdCBub25TcGFubmluZ0lubGluZUxldmVsQm94
Q291bnQgeyAwIH07Ci0gICAgICAgIGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnM7Ci0gICAgfTsK
LSAgICBMaW5lQ29udGVudCBsYXlvdXRJbmxpbmVDb250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5n
ZSYsIHNpemVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxh
eW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgsIGNvbnN0IElubGluZVJlY3QmIGluaXRpYWxM
aW5lTG9naWNhbFJlY3QsIGJvb2wgaXNGaXJzdExpbmUpOwotCi0gICAgc3RydWN0IEludHJpbnNp
Y0NvbnRlbnQgewotICAgICAgICBJbmxpbmVJdGVtUmFuZ2UgaW5saW5lSXRlbVJhbmdlOwotICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICAgICAgY29uc3Qg
RmxvYXRMaXN0JiBmbG9hdHM7Ci0gICAgfTsKLSAgICBJbnRyaW5zaWNDb250ZW50IGNvbXB1dGVk
SW50cmluc2ljV2lkdGgoY29uc3QgSW5saW5lSXRlbVJhbmdlJiwgSW5saW5lTGF5b3V0VW5pdCBh
dmFpbGFibGVXaWR0aCk7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBjYW5kaWRhdGVDb250ZW50Rm9y
TGluZShMaW5lQ2FuZGlkYXRlJiwgc2l6ZV90IGlubGluZUl0ZW1JbmRleCwgY29uc3QgSW5saW5l
SXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBzaXplX3Qgb3ZlcmZsb3dMZW5ndGgsIE9wdGlv
bmFsPElubGluZUxheW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgsIElubGluZUxheW91dFVu
aXQgY3VycmVudExvZ2ljYWxSaWdodCk7Ci0gICAgc2l6ZV90IG5leHRXcmFwT3Bwb3J0dW5pdHko
c2l6ZV90IHN0YXJ0SW5kZXgsIGNvbnN0IExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UmIGxh
eW91dFJhbmdlKSBjb25zdDsKLQotICAgIHN0cnVjdCBSZXN1bHQgewotICAgICAgICBJbmxpbmVD
b250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmUgaXNFbmRPZkxpbmUgeyBJbmxpbmVDb250ZW50QnJl
YWtlcjo6SXNFbmRPZkxpbmU6Ok5vIH07Ci0gICAgICAgIHN0cnVjdCBDb21taXR0ZWRDb250ZW50
Q291bnQgewotICAgICAgICAgICAgc2l6ZV90IHZhbHVlIHsgMCB9OwotICAgICAgICAgICAgYm9v
bCBpc1JldmVydCB7IGZhbHNlIH07Ci0gICAgICAgIH07Ci0gICAgICAgIENvbW1pdHRlZENvbnRl
bnRDb3VudCBjb21taXR0ZWRDb3VudCB7IH07Ci0gICAgICAgIHNpemVfdCBwYXJ0aWFsVHJhaWxp
bmdDb250ZW50TGVuZ3RoIHsgMCB9OwotICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0
PiBvdmVyZmxvd0xvZ2ljYWxXaWR0aCB7IH07Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVXNlZENvbnN0
cmFpbnRzIHsKLSAgICAgICAgSW5saW5lUmVjdCBsb2dpY2FsUmVjdDsKLSAgICAgICAgYm9vbCBp
c0NvbnN0cmFpbmVkQnlGbG9hdCB7IGZhbHNlIH07Ci0gICAgfTsKLSAgICBVc2VkQ29uc3RyYWlu
dHMgaW5pdGlhbENvbnN0cmFpbnRzRm9yTGluZShjb25zdCBJbmxpbmVSZWN0JiBpbml0aWFsTGlu
ZUxvZ2ljYWxSZWN0LCBib29sIGlzRmlyc3RMaW5lKSBjb25zdDsKLSAgICBPcHRpb25hbDxIb3Jp
em9udGFsQ29uc3RyYWludHM+IGZsb2F0Q29uc3RyYWludHMoY29uc3QgSW5saW5lUmVjdCYgbGlu
ZUxvZ2ljYWxSZWN0KSBjb25zdDsKLQotICAgIHZvaWQgaGFuZGxlRmxvYXRDb250ZW50KGNvbnN0
IElubGluZUl0ZW0mKTsKLSAgICBSZXN1bHQgaGFuZGxlSW5saW5lQ29udGVudChJbmxpbmVDb250
ZW50QnJlYWtlciYsIGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgY29u
c3QgTGluZUNhbmRpZGF0ZSYpOwotICAgIHNpemVfdCByZWJ1aWxkTGluZShjb25zdCBJbmxpbmVJ
dGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2UsIGNvbnN0IElubGluZUl0ZW0mIGxhc3RJbmxpbmVJ
dGVtVG9BZGQpOwotICAgIHNpemVfdCByZWJ1aWxkTGluZUZvclRyYWlsaW5nU29mdEh5cGhlbihj
b25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlKTsKLSAgICB2b2lkIGNvbW1pdFBhcnRp
YWxDb250ZW50KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudDo6
UnVuTGlzdCYsIGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OlBhcnRpYWxUcmFp
bGluZ0NvbnRlbnQmKTsKLSAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVXNlZENvbnN0cmFpbnRz
Jik7Ci0gICAgc3RydWN0IENvbW1pdHRlZENvbnRlbnQgewotICAgICAgICBzaXplX3QgaW5saW5l
SXRlbUNvdW50IHsgMCB9OwotICAgICAgICBzaXplX3QgcGFydGlhbFRyYWlsaW5nQ29udGVudExl
bmd0aCB7IDAgfTsKLSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gb3ZlcmZsb3dM
b2dpY2FsV2lkdGggeyB9OwotICAgIH07Ci0gICAgQ29tbWl0dGVkQ29udGVudCBwbGFjZUlubGlu
ZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiwgc2l6ZV90IHBhcnRpYWxMZWFkaW5nQ29u
dGVudExlbmd0aCwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gb3ZlcmZsb3dMb2dpY2FsV2lk
dGgpOwotICAgIElubGluZUl0ZW1SYW5nZSBjbG9zZShjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5l
ZWRzTGF5b3V0UmFuZ2UsIGNvbnN0IENvbW1pdHRlZENvbnRlbnQmKTsKLQotICAgIElubGluZUxh
eW91dFVuaXQgaW5saW5lSXRlbVdpZHRoKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRV
bml0IGNvbnRlbnRMb2dpY2FsTGVmdCkgY29uc3Q7Ci0gICAgYm9vbCBpc0xhc3RMaW5lV2l0aElu
bGluZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsaW5lUmFuZ2UsIHNpemVfdCBsYXN0
SW5saW5lSXRlbUluZGV4LCBib29sIGhhc1BhcnRpYWxUcmFpbGluZ0NvbnRlbnQpIGNvbnN0Owot
Ci0gICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkg
Y29uc3QgeyByZXR1cm4gbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsgfQotICAgIElubGluZUZv
cm1hdHRpbmdTdGF0ZSogZm9ybWF0dGluZ1N0YXRlKCkgeyByZXR1cm4gbV9pbmxpbmVGb3JtYXR0
aW5nU3RhdGU7IH0KLSAgICBGbG9hdGluZ1N0YXRlKiBmbG9hdGluZ1N0YXRlKCkgeyByZXR1cm4g
bV9mbG9hdGluZ1N0YXRlOyB9Ci0gICAgY29uc3QgRmxvYXRpbmdTdGF0ZSogZmxvYXRpbmdTdGF0
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRpbmdTdGF0ZTsgfQotICAgIGNvbnN0IENvbnRhaW5l
ckJveCYgcm9vdCgpIGNvbnN0OwotICAgIGNvbnN0IExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgp
IGNvbnN0OwotCi0gICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIG1faW5saW5lRm9y
bWF0dGluZ0NvbnRleHQ7Ci0gICAgSW5saW5lRm9ybWF0dGluZ1N0YXRlKiBtX2lubGluZUZvcm1h
dHRpbmdTdGF0ZSB7IG51bGxwdHIgfTsKLSAgICBGbG9hdGluZ1N0YXRlKiBtX2Zsb2F0aW5nU3Rh
dGUgeyBudWxscHRyIH07Ci0gICAgT3B0aW9uYWw8SG9yaXpvbnRhbENvbnN0cmFpbnRzPiBtX3Jv
b3RIb3Jpem9udGFsQ29uc3RyYWludHM7Ci0KLSAgICBMaW5lIG1fbGluZTsKLSAgICBJbmxpbmVS
ZWN0IG1fbGluZUxvZ2ljYWxSZWN0OwotICAgIGNvbnN0IElubGluZUl0ZW1zJiBtX2lubGluZUl0
ZW1zOwotICAgIEZsb2F0TGlzdCBtX2Zsb2F0czsKLSAgICBPcHRpb25hbDxJbmxpbmVUZXh0SXRl
bT4gbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtOwotICAgIFZlY3Rvcjxjb25zdCBJbmxpbmVJdGVt
Kj4gbV93cmFwT3Bwb3J0dW5pdHlMaXN0OwotICAgIHVuc2lnbmVkIG1fc3VjY2Vzc2l2ZUh5cGhl
bmF0ZWRMaW5lQ291bnQgeyAwIH07Ci0gICAgYm9vbCBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlG
bG9hdCB7IGZhbHNlIH07Ci19OwotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVHZW9tZXRyeS5oIGIvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUdlb21ldHJ5LmgK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTJjNThhMDc2ZTQ5YzJjZDNjOWUyZjky
YWIzNmQwM2YyNzI5ZTUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUdl
b21ldHJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0
IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0g
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0g
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3By
YWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2lu
Y2x1ZGUgIklubGluZVJlY3QuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExh
eW91dCB7Ci0KLWNsYXNzIElubGluZUxpbmVHZW9tZXRyeSB7Ci0gICAgV1RGX01BS0VfRkFTVF9B
TExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgc3RydWN0IEVuY2xvc2luZ1RvcEFuZEJvdHRvbSB7Ci0g
ICAgICAgIC8vIFRoaXMgdmFsdWVzIGVuY2xvc2VzIHRoZSByb290IGlubGluZSBib3ggYW5kIGFu
eSBvdGhlciBpbmxpbmUgbGV2ZWwgYm94J3MgYm9yZGVyIGJveC4KLSAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCB0b3AgeyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgYm90dG9tIHsgMCB9
OwotICAgIH07Ci0gICAgSW5saW5lTGluZUdlb21ldHJ5KGNvbnN0IElubGluZVJlY3QmIGxpbmVC
b3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tLCBJbmxpbmVMYXlvdXRVbml0IGFs
aWdtZW50QmFzZWxpbmUsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxp
bmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgpOwotCi0gICAgY29uc3QgSW5saW5lUmVj
dCYgbGluZUJveExvZ2ljYWxSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94TG9naWNhbFJl
Y3Q7IH0KLQotICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBlbmNsb3NpbmdUb3BBbmRCb3R0b20o
KSBjb25zdCB7IHJldHVybiBtX2VuY2xvc2luZ1RvcEFuZEJvdHRvbTsgfQotCi0gICAgSW5saW5l
TGF5b3V0VW5pdCBiYXNlbGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fYWxpZ21lbnRCYXNlbGluZTsg
fQotCi0gICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQoKSBjb25zdCB7IHJl
dHVybiBtX2NvbnRlbnRMb2dpY2FsTGVmdDsgfQotICAgIElubGluZUxheW91dFVuaXQgY29udGVu
dExvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudExvZ2ljYWxXaWR0aDsgfQot
Ci0gICAgdm9pZCBtb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkgeyBtX2xp
bmVCb3hMb2dpY2FsUmVjdC5tb3ZlVmVydGljYWxseShvZmZzZXQpOyB9Ci0KLXByaXZhdGU6Ci0g
ICAgLy8gVGhpcyBpcyBsaW5lIGJveCBnZW9tZXRyeSAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9U
Ui9jc3MtaW5saW5lLTMvI2xpbmUtYm94KS4KLSAgICBJbmxpbmVSZWN0IG1fbGluZUJveExvZ2lj
YWxSZWN0OwotICAgIC8vIEVuY2xvc2luZyB0b3AgYW5kIGJvdHRvbSBpbmNsdWRlcyBhbGwgaW5s
aW5lIGxldmVsIGJveGVzIChib3JkZXIgYm94KSB2ZXJ0aWNhbGx5LgotICAgIC8vIFdoaWxlIHRo
ZSBsaW5lIGJveCB1c3VhbGx5IGVuY2xvc2UgdGhlbSBhcyB3ZWxsLCBpdHMgdmVydGljYWwgZ2Vv
bWV0cnkgaXMgYmFzZWQgb24KLSAgICAvLyB0aGUgbGF5b3V0IGJvdW5kcyBvZiB0aGUgaW5saW5l
IGxldmVsIGJveGVzIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgd2hlbiBsaW5lLWhlaWdodCBpcyBw
cmVzZW50LgotICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBtX2VuY2xvc2luZ1RvcEFuZEJvdHRv
bTsKLSAgICBJbmxpbmVMYXlvdXRVbml0IG1fYWxpZ21lbnRCYXNlbGluZSB7IDAgfTsKLSAgICBJ
bmxpbmVMYXlvdXRVbml0IG1fY29udGVudExvZ2ljYWxMZWZ0IHsgMCB9OwotICAgIElubGluZUxh
eW91dFVuaXQgbV9jb250ZW50TG9naWNhbFdpZHRoIHsgMCB9OwotfTsKLQotaW5saW5lIElubGlu
ZUxpbmVHZW9tZXRyeTo6SW5saW5lTGluZUdlb21ldHJ5KGNvbnN0IElubGluZVJlY3QmIGxpbmVC
b3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tIGVuY2xvc2luZ1RvcEFuZEJvdHRv
bSwgSW5saW5lTGF5b3V0VW5pdCBhbGlnbWVudEJhc2VsaW5lLCBJbmxpbmVMYXlvdXRVbml0IGNv
bnRlbnRMb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoKQot
ICAgIDogbV9saW5lQm94TG9naWNhbFJlY3QobGluZUJveExvZ2ljYWxSZWN0KQotICAgICwgbV9l
bmNsb3NpbmdUb3BBbmRCb3R0b20oZW5jbG9zaW5nVG9wQW5kQm90dG9tKQotICAgICwgbV9hbGln
bWVudEJhc2VsaW5lKGFsaWdtZW50QmFzZWxpbmUpCi0gICAgLCBtX2NvbnRlbnRMb2dpY2FsTGVm
dChjb250ZW50TG9naWNhbExlZnQpCi0gICAgLCBtX2NvbnRlbnRMb2dpY2FsV2lkdGgoY29udGVu
dExvZ2ljYWxXaWR0aCkKLXsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVSdW4uaCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVSdW4uaApkZWxldGVk
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwZWUxNGRlZDBiZTJjY2Q1MmQzNDMzYjA4ODQ1NDZj
MWYwZDJiMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lUnVuLmgKKysr
IC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
LSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgot
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQot
Ci0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJJbmxp
bmVSZWN0LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiVGV4dEZsYWdzLmgi
Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1zdHJ1Y3QgTGlu
ZVJ1biB7Ci0gICAgV1RGX01BS0VfU1RSVUNUX0ZBU1RfQUxMT0NBVEVEOwotICAgIHN0cnVjdCBU
ZXh0IHsKLSAgICAgICAgV1RGX01BS0VfU1RSVUNUX0ZBU1RfQUxMT0NBVEVEOwotICAgIHB1Ymxp
YzoKLSAgICAgICAgVGV4dChzaXplX3QgcG9zaXRpb24sIHNpemVfdCBsZW5ndGgsIGNvbnN0IFN0
cmluZyYpOwotCi0gICAgICAgIHNpemVfdCBzdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnQ7
IH0KLSAgICAgICAgc2l6ZV90IGVuZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0KCkgKyBsZW5ndGgo
KTsgfQotICAgICAgICBzaXplX3QgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9sZW5ndGg7IH0K
LSAgICAgICAgU3RyaW5nIGNvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRTdHJpbmc7
IH0KLQotICAgICAgICBib29sIG5lZWRzSHlwaGVuKCkgY29uc3QgeyByZXR1cm4gbV9uZWVkc0h5
cGhlbjsgfQotICAgICAgICB2b2lkIHNldE5lZWRzSHlwaGVuKCkgeyBtX25lZWRzSHlwaGVuID0g
dHJ1ZTsgfQotCi0gICAgICAgIHZvaWQgZXhwYW5kKHNpemVfdCBkZWx0YSkgeyBtX2xlbmd0aCAr
PSBkZWx0YTsgfQotICAgICAgICB2b2lkIHNocmluayhzaXplX3QgZGVsdGEpIHsgbV9sZW5ndGgg
LT0gZGVsdGE7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNpemVfdCBtX3N0YXJ0IHsgMCB9
OwotICAgICAgICBzaXplX3QgbV9sZW5ndGggeyAwIH07Ci0gICAgICAgIGJvb2wgbV9uZWVkc0h5
cGhlbiB7IGZhbHNlIH07Ci0gICAgICAgIFN0cmluZyBtX2NvbnRlbnRTdHJpbmc7Ci0gICAgfTsK
LQotICAgIHN0cnVjdCBFeHBhbnNpb247Ci0gICAgTGluZVJ1bihzaXplX3QgbGluZUluZGV4LCBj
b25zdCBCb3gmLCBjb25zdCBJbmxpbmVSZWN0JiwgRXhwYW5zaW9uLCBPcHRpb25hbDxUZXh0PiA9
IFdURjo6bnVsbG9wdCk7Ci0KLSAgICBjb25zdCBJbmxpbmVSZWN0JiBsb2dpY2FsUmVjdCgpIGNv
bnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3Q7IH0KLQotICAgIElubGluZUxheW91dFVuaXQgbG9n
aWNhbFRvcCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkudG9wKCk7IH0KLSAgICBJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxCb3R0b20oKSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVjdCgp
LmJvdHRvbSgpOyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgpIGNvbnN0IHsg
cmV0dXJuIGxvZ2ljYWxSZWN0KCkubGVmdCgpOyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsb2dp
Y2FsUmlnaHQoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVjdCgpLnJpZ2h0KCk7IH0KLQotICAg
IElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJl
Y3QoKS53aWR0aCgpOyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KCkgY29u
c3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS5oZWlnaHQoKTsgfQotCi0gICAgdm9pZCBtb3ZlVmVy
dGljYWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkgeyBtX2xvZ2ljYWxSZWN0Lm1vdmVWZXJ0
aWNhbGx5KG9mZnNldCk7IH0KLSAgICBPcHRpb25hbDxUZXh0PiYgdGV4dCgpIHsgcmV0dXJuIG1f
dGV4dDsgfQotICAgIGNvbnN0IE9wdGlvbmFsPFRleHQ+JiB0ZXh0KCkgY29uc3QgeyByZXR1cm4g
bV90ZXh0OyB9Ci0KLSAgICBzdHJ1Y3QgRXhwYW5zaW9uIHsKLSAgICAgICAgRXhwYW5zaW9uQmVo
YXZpb3IgYmVoYXZpb3IgeyBEZWZhdWx0RXhwYW5zaW9uIH07Ci0gICAgICAgIElubGluZUxheW91
dFVuaXQgaG9yaXpvbnRhbEV4cGFuc2lvbiB7IDAgfTsKLSAgICB9OwotICAgIEV4cGFuc2lvbiBl
eHBhbnNpb24oKSBjb25zdCB7IHJldHVybiBtX2V4cGFuc2lvbjsgfQotCi0gICAgY29uc3QgQm94
JiBsYXlvdXRCb3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRCb3g7IH0KLSAgICBzaXplX3Qg
bGluZUluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9saW5lSW5kZXg7IH0KLQotcHJpdmF0ZToKLSAg
ICBjb25zdCBzaXplX3QgbV9saW5lSW5kZXg7Ci0gICAgV2Vha1B0cjxjb25zdCBMYXlvdXQ6OkJv
eD4gbV9sYXlvdXRCb3g7Ci0gICAgSW5saW5lUmVjdCBtX2xvZ2ljYWxSZWN0OwotICAgIEV4cGFu
c2lvbiBtX2V4cGFuc2lvbjsKLSAgICBPcHRpb25hbDxUZXh0PiBtX3RleHQ7Ci19OwotCi1pbmxp
bmUgTGluZVJ1bjo6TGluZVJ1bihzaXplX3QgbGluZUluZGV4LCBjb25zdCBMYXlvdXQ6OkJveCYg
bGF5b3V0Qm94LCBjb25zdCBJbmxpbmVSZWN0JiBsb2dpY2FsUmVjdCwgRXhwYW5zaW9uIGV4cGFu
c2lvbiwgT3B0aW9uYWw8VGV4dD4gdGV4dCkKLSAgICA6IG1fbGluZUluZGV4KGxpbmVJbmRleCkK
LSAgICAsIG1fbGF5b3V0Qm94KG1ha2VXZWFrUHRyKGxheW91dEJveCkpCi0gICAgLCBtX2xvZ2lj
YWxSZWN0KGxvZ2ljYWxSZWN0KQotICAgICwgbV9leHBhbnNpb24oZXhwYW5zaW9uKQotICAgICwg
bV90ZXh0KHRleHQpCi17Ci19Ci0KLWlubGluZSBMaW5lUnVuOjpUZXh0OjpUZXh0KHNpemVfdCBz
dGFydCwgc2l6ZV90IGxlbmd0aCwgY29uc3QgU3RyaW5nJiBjb250ZW50U3RyaW5nKQotICAgIDog
bV9zdGFydChzdGFydCkKLSAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKLSAgICAsIG1fY29udGVudFN0
cmluZyhjb250ZW50U3RyaW5nKQotewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVJlY3QuaCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVJlY3QuaApkZWxldGVkIGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkMDlhYjFlNzEwMWFhNmVjZjQzM2QyNjQwMDRmZmU4ZmI3
YThjNC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVSZWN0LmgKKysrIC9kZXYv
bnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwot
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJMYXlvdXRVbml0
cy5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3Mg
SW5saW5lUmVjdCB7Ci1wdWJsaWM6Ci0gICAgSW5saW5lUmVjdCgpID0gZGVmYXVsdDsKLSAgICBJ
bmxpbmVSZWN0KElubGluZUxheW91dFVuaXQgdG9wLCBJbmxpbmVMYXlvdXRVbml0IGxlZnQsIElu
bGluZUxheW91dFVuaXQgd2lkdGgsIElubGluZUxheW91dFVuaXQgaGVpZ2h0KTsKLSAgICBJbmxp
bmVSZWN0KGNvbnN0IElubGluZUxheW91dFBvaW50JiB0b3BMZWZ0LCBJbmxpbmVMYXlvdXRVbml0
IHdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCk7Ci0gICAgSW5saW5lUmVjdChjb25zdCBJ
bmxpbmVMYXlvdXRQb2ludCYgdG9wTGVmdCwgY29uc3QgSW5saW5lTGF5b3V0U2l6ZSYpOwotICAg
IAotICAgIElubGluZUxheW91dFVuaXQgdG9wKCkgY29uc3Q7Ci0gICAgSW5saW5lTGF5b3V0VW5p
dCBsZWZ0KCkgY29uc3Q7Ci0gICAgSW5saW5lTGF5b3V0UG9pbnQgdG9wTGVmdCgpIGNvbnN0Owot
Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBib3R0b20oKSBjb25zdDsKLSAgICBJbmxpbmVMYXlvdXRV
bml0IHJpZ2h0KCkgY29uc3Q7ICAgICAgICAKLQotICAgIElubGluZUxheW91dFVuaXQgd2lkdGgo
KSBjb25zdDsKLSAgICBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCgpIGNvbnN0OwotICAgIElubGlu
ZUxheW91dFNpemUgc2l6ZSgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRUb3AoSW5saW5lTGF5b3V0
VW5pdCk7Ci0gICAgdm9pZCBzZXRCb3R0b20oSW5saW5lTGF5b3V0VW5pdCk7Ci0gICAgdm9pZCBz
ZXRMZWZ0KElubGluZUxheW91dFVuaXQpOwotICAgIHZvaWQgc2V0VG9wTGVmdChjb25zdCBJbmxp
bmVMYXlvdXRQb2ludCYpOwotICAgIHZvaWQgc2V0V2lkdGgoSW5saW5lTGF5b3V0VW5pdCk7Ci0g
ICAgdm9pZCBzZXRIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCk7Ci0KLSAgICB2b2lkIG1vdmVIb3Jp
em9udGFsbHkoSW5saW5lTGF5b3V0VW5pdCk7Ci0gICAgdm9pZCBtb3ZlVmVydGljYWxseShJbmxp
bmVMYXlvdXRVbml0KTsKLSAgICB2b2lkIG1vdmVCeShJbmxpbmVMYXlvdXRQb2ludCk7Ci0KLSAg
ICB2b2lkIGV4cGFuZChPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiwgT3B0aW9uYWw8SW5saW5l
TGF5b3V0VW5pdD4pOwotICAgIHZvaWQgZXhwYW5kVG9Db250YWluKGNvbnN0IElubGluZVJlY3Qm
KTsKLSAgICB2b2lkIGV4cGFuZEhvcml6b250YWxseShJbmxpbmVMYXlvdXRVbml0IGRlbHRhKSB7
IGV4cGFuZChkZWx0YSwgeyB9KTsgfQotICAgIHZvaWQgZXhwYW5kVmVydGljYWxseShJbmxpbmVM
YXlvdXRVbml0IGRlbHRhKSB7IGV4cGFuZCh7IH0sIGRlbHRhKTsgfQotICAgIHZvaWQgZXhwYW5k
VmVydGljYWxseVRvQ29udGFpbihjb25zdCBJbmxpbmVSZWN0Jik7Ci0gICAgdm9pZCBpbmZsYXRl
KElubGluZUxheW91dFVuaXQpOwotCi0gICAgb3BlcmF0b3IgSW5saW5lTGF5b3V0UmVjdCgpIGNv
bnN0OwotCi1wcml2YXRlOgotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAgdm9pZCBpbnZhbGlkYXRl
VG9wKCkgeyBtX2hhc1ZhbGlkVG9wID0gZmFsc2U7IH0KLSAgICB2b2lkIGludmFsaWRhdGVMZWZ0
KCkgeyBtX2hhc1ZhbGlkTGVmdCA9IGZhbHNlOyB9Ci0gICAgdm9pZCBpbnZhbGlkYXRlV2lkdGgo
KSB7IG1faGFzVmFsaWRXaWR0aCA9IGZhbHNlOyB9Ci0gICAgdm9pZCBpbnZhbGlkYXRlSGVpZ2h0
KCkgeyBtX2hhc1ZhbGlkSGVpZ2h0ID0gZmFsc2U7IH0KLSAgICB2b2lkIGludmFsaWRhdGVQb3Np
dGlvbigpOwotCi0gICAgYm9vbCBoYXNWYWxpZFBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9o
YXNWYWxpZFRvcCAmJiBtX2hhc1ZhbGlkTGVmdDsgfQotICAgIGJvb2wgaGFzVmFsaWRTaXplKCkg
Y29uc3QgeyByZXR1cm4gbV9oYXNWYWxpZFdpZHRoICYmIG1faGFzVmFsaWRIZWlnaHQ7IH0KLSAg
ICBib29sIGhhc1ZhbGlkR2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBoYXNWYWxpZFBvc2l0aW9u
KCkgJiYgaGFzVmFsaWRTaXplKCk7IH0KLQotICAgIHZvaWQgc2V0SGFzVmFsaWRQb3NpdGlvbigp
OwotICAgIHZvaWQgc2V0SGFzVmFsaWRTaXplKCk7Ci0KLSAgICBib29sIG1faGFzVmFsaWRUb3Ag
eyBmYWxzZSB9OwotICAgIGJvb2wgbV9oYXNWYWxpZExlZnQgeyBmYWxzZSB9OwotICAgIGJvb2wg
bV9oYXNWYWxpZFdpZHRoIHsgZmFsc2UgfTsKLSAgICBib29sIG1faGFzVmFsaWRIZWlnaHQgeyBm
YWxzZSB9OwotI2VuZGlmIC8vIEFTU0VSVF9FTkFCTEVECi0gICAgSW5saW5lTGF5b3V0UmVjdCBt
X3JlY3Q7Ci19OwotCi1pbmxpbmUgSW5saW5lUmVjdDo6SW5saW5lUmVjdChJbmxpbmVMYXlvdXRV
bml0IHRvcCwgSW5saW5lTGF5b3V0VW5pdCBsZWZ0LCBJbmxpbmVMYXlvdXRVbml0IHdpZHRoLCBJ
bmxpbmVMYXlvdXRVbml0IGhlaWdodCkKLSAgICA6IG1fcmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBo
ZWlnaHQpCi17Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICBtX2hhc1ZhbGlkVG9wID0gdHJ1ZTsK
LSAgICBtX2hhc1ZhbGlkTGVmdCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZFdpZHRoID0gdHJ1ZTsK
LSAgICBtX2hhc1ZhbGlkSGVpZ2h0ID0gdHJ1ZTsKLSNlbmRpZgotfQotCi1pbmxpbmUgSW5saW5l
UmVjdDo6SW5saW5lUmVjdChjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgdG9wTGVmdCwgSW5saW5l
TGF5b3V0VW5pdCB3aWR0aCwgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQpCi0gICAgOiBJbmxpbmVS
ZWN0KHRvcExlZnQueSgpLCB0b3BMZWZ0LngoKSwgd2lkdGgsIGhlaWdodCkKLXsKLX0KLQotaW5s
aW5lIElubGluZVJlY3Q6OklubGluZVJlY3QoY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIHRvcExl
ZnQsIGNvbnN0IElubGluZUxheW91dFNpemUmIHNpemUpCi0gICAgOiBJbmxpbmVSZWN0KHRvcExl
ZnQueSgpLCB0b3BMZWZ0LngoKSwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKQotewotfQot
Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLWlubGluZSB2b2lkIElubGluZVJlY3Q6OmludmFsaWRhdGVQ
b3NpdGlvbigpCi17Ci0gICAgaW52YWxpZGF0ZVRvcCgpOwotICAgIGludmFsaWRhdGVMZWZ0KCk7
Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OnNldEhhc1ZhbGlkUG9zaXRpb24oKQotewot
ICAgIG1faGFzVmFsaWRUb3AgPSB0cnVlOwotICAgIG1faGFzVmFsaWRMZWZ0ID0gdHJ1ZTsKLX0K
LQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0SGFzVmFsaWRTaXplKCkKLXsKLSAgICBtX2hh
c1ZhbGlkV2lkdGggPSB0cnVlOwotICAgIG1faGFzVmFsaWRIZWlnaHQgPSB0cnVlOwotfQotI2Vu
ZGlmIC8vIEFTU0VSVF9FTkFCTEVECi0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0IElubGluZVJl
Y3Q6OnRvcCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRUb3ApOwotICAgIHJldHVy
biBtX3JlY3QueSgpOwotfQotCi1pbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVSZWN0Ojps
ZWZ0KCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZExlZnQpOwotICAgIHJldHVybiBt
X3JlY3QueCgpOwotfQotCi1pbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVSZWN0Ojpib3R0
b20oKSBjb25zdAotewotICAgIEFTU0VSVChtX2hhc1ZhbGlkVG9wICYmIG1faGFzVmFsaWRIZWln
aHQpOwotICAgIHJldHVybiBtX3JlY3QubWF4WSgpOwotfQotCi1pbmxpbmUgSW5saW5lTGF5b3V0
VW5pdCBJbmxpbmVSZWN0OjpyaWdodCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRM
ZWZ0ICYmIG1faGFzVmFsaWRXaWR0aCk7Ci0gICAgcmV0dXJuIG1fcmVjdC5tYXhYKCk7Ci19Ci0K
LWlubGluZSBJbmxpbmVMYXlvdXRQb2ludCBJbmxpbmVSZWN0Ojp0b3BMZWZ0KCkgY29uc3QKLXsK
LSAgICBBU1NFUlQoaGFzVmFsaWRQb3NpdGlvbigpKTsKLSAgICByZXR1cm4gbV9yZWN0Lm1pblhN
aW5ZQ29ybmVyKCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRTaXplIElubGluZVJlY3Q6OnNp
emUoKSBjb25zdAotewotICAgIEFTU0VSVChoYXNWYWxpZFNpemUoKSk7Ci0gICAgcmV0dXJuIG1f
cmVjdC5zaXplKCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0IElubGluZVJlY3Q6Ondp
ZHRoKCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZFdpZHRoKTsKLSAgICByZXR1cm4g
bV9yZWN0LndpZHRoKCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0IElubGluZVJlY3Q6
OmhlaWdodCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRIZWlnaHQpOwotICAgIHJl
dHVybiBtX3JlY3QuaGVpZ2h0KCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OnNldFRv
cExlZnQoY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIHRvcExlZnQpCi17Ci0jaWYgQVNTRVJUX0VO
QUJMRUQKLSAgICBzZXRIYXNWYWxpZFBvc2l0aW9uKCk7Ci0jZW5kaWYKLSAgICBtX3JlY3Quc2V0
TG9jYXRpb24odG9wTGVmdCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OnNldFRvcChJ
bmxpbmVMYXlvdXRVbml0IHRvcCkKLXsKLSNpZiBBU1NFUlRfRU5BQkxFRAotICAgIG1faGFzVmFs
aWRUb3AgPSB0cnVlOwotI2VuZGlmCi0gICAgbV9yZWN0LnNldFkodG9wKTsKLX0KLQotaW5saW5l
IHZvaWQgSW5saW5lUmVjdDo6c2V0Qm90dG9tKElubGluZUxheW91dFVuaXQgYm90dG9tKQotewot
I2lmIEFTU0VSVF9FTkFCTEVECi0gICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7Ci0gICAgbV9oYXNW
YWxpZEhlaWdodCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX3JlY3Quc2hpZnRNYXhZRWRnZVRvKGJv
dHRvbSk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OnNldExlZnQoSW5saW5lTGF5b3V0
VW5pdCBsZWZ0KQotewotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAgbV9oYXNWYWxpZExlZnQgPSB0
cnVlOwotI2VuZGlmCi0gICAgbV9yZWN0LnNldFgobGVmdCk7Ci19Ci0KLWlubGluZSB2b2lkIElu
bGluZVJlY3Q6OnNldFdpZHRoKElubGluZUxheW91dFVuaXQgd2lkdGgpCi17Ci0jaWYgQVNTRVJU
X0VOQUJMRUQKLSAgICBtX2hhc1ZhbGlkV2lkdGggPSB0cnVlOwotI2VuZGlmCi0gICAgbV9yZWN0
LnNldFdpZHRoKHdpZHRoKTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0SGVpZ2h0
KElubGluZUxheW91dFVuaXQgaGVpZ2h0KQotewotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAgbV9o
YXNWYWxpZEhlaWdodCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX3JlY3Quc2V0SGVpZ2h0KGhlaWdo
dCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6Om1vdmVIb3Jpem9udGFsbHkoSW5saW5l
TGF5b3V0VW5pdCBvZmZzZXQpCi17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRMZWZ0KTsKLSAgICBt
X3JlY3QubW92ZShJbmxpbmVMYXlvdXRTaXplIHsgb2Zmc2V0LCAwIH0pOwotfQotCi1pbmxpbmUg
dm9pZCBJbmxpbmVSZWN0Ojptb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkK
LXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZFRvcCk7Ci0gICAgbV9yZWN0Lm1vdmUoSW5saW5lTGF5
b3V0U2l6ZSB7IDAsIG9mZnNldCB9KTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6bW92
ZUJ5KElubGluZUxheW91dFBvaW50IG9mZnNldCkKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZFRv
cCk7Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRMZWZ0KTsKLSAgICBtX3JlY3QubW92ZUJ5KG9mZnNl
dCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OmV4cGFuZChPcHRpb25hbDxJbmxpbmVM
YXlvdXRVbml0PiB3aWR0aCwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gaGVpZ2h0KQotewot
ICAgIEFTU0VSVCghd2lkdGggfHwgbV9oYXNWYWxpZFdpZHRoKTsKLSAgICBBU1NFUlQoIWhlaWdo
dCB8fCBtX2hhc1ZhbGlkSGVpZ2h0KTsKLSAgICBtX3JlY3QuZXhwYW5kKHdpZHRoLnZhbHVlT3Io
MCksIGhlaWdodC52YWx1ZU9yKDApKTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6ZXhw
YW5kVG9Db250YWluKGNvbnN0IElubGluZVJlY3QmIG90aGVyKQotewotI2lmIEFTU0VSVF9FTkFC
TEVECi0gICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZExlZnQgPSB0cnVl
OwotICAgIG1faGFzVmFsaWRXaWR0aCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZEhlaWdodCA9IHRy
dWU7Ci0jZW5kaWYKLSAgICBtX3JlY3QudW5pdGVFdmVuSWZFbXB0eShvdGhlcik7Ci19Ci0KLWlu
bGluZSB2b2lkIElubGluZVJlY3Q6OmV4cGFuZFZlcnRpY2FsbHlUb0NvbnRhaW4oY29uc3QgSW5s
aW5lUmVjdCYgb3RoZXIpCi17Ci0gICAgYXV0byBjb250YWluVG9wID0gc3RkOjptaW4odG9wKCks
IG90aGVyLnRvcCgpKTsKLSAgICBhdXRvIGNvbnRhaW5Cb3R0b20gPSBzdGQ6Om1heChib3R0b20o
KSwgb3RoZXIuYm90dG9tKCkpOwotICAgIHNldFRvcChjb250YWluVG9wKTsKLSAgICBzZXRCb3R0
b20oY29udGFpbkJvdHRvbSk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OmluZmxhdGUo
SW5saW5lTGF5b3V0VW5pdCBpbmZsYXRlKQotewotICAgIEFTU0VSVChoYXNWYWxpZEdlb21ldHJ5
KCkpOwotICAgIG1fcmVjdC5pbmZsYXRlKGluZmxhdGUpOwotfQotCi1pbmxpbmUgSW5saW5lUmVj
dDo6b3BlcmF0b3IgSW5saW5lTGF5b3V0UmVjdCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGhhc1Zh
bGlkR2VvbWV0cnkoKSk7IAotICAgIHJldHVybiBtX3JlY3Q7Ci19Ci0KLX0KLX0KLSNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5l
U29mdExpbmVCcmVha0l0ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0
aW5nL0lubGluZVNvZnRMaW5lQnJlYWtJdGVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDllYTA2ZmJjZGQxNzgyNDJiYWI1NDczYTk0YTEzYWMzMGJjNzk3MGIuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lU29mdExpbmVCcmVha0l0ZW0uaAorKysgL2Rldi9udWxs
CkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBh
cmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJM
RShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiSW5saW5lSXRlbS5oIgot
Ci1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgSW5saW5l
U29mdExpbmVCcmVha0l0ZW0gOiBwdWJsaWMgSW5saW5lSXRlbSB7Ci1wdWJsaWM6Ci0gICAgc3Rh
dGljIElubGluZVNvZnRMaW5lQnJlYWtJdGVtIGNyZWF0ZVNvZnRMaW5lQnJlYWtJdGVtKGNvbnN0
IElubGluZVRleHRCb3gmLCB1bnNpZ25lZCBwb3NpdGlvbik7Ci0KLSAgICB1bnNpZ25lZCBwb3Np
dGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRPclBvc2l0aW9uOyB9Ci0gICAgY29uc3QgSW5s
aW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PElubGlu
ZVRleHRCb3g+KGxheW91dEJveCgpKTsgfQotCi0gICAgSW5saW5lU29mdExpbmVCcmVha0l0ZW0o
Y29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHBvc2l0aW9uKTsKLX07Ci0KLWlubGluZSBJ
bmxpbmVTb2Z0TGluZUJyZWFrSXRlbSBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbTo6Y3JlYXRlU29m
dExpbmVCcmVha0l0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWdu
ZWQgcG9zaXRpb24pCi17Ci0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgcG9zaXRpb24gfTsK
LX0KLQotaW5saW5lIElubGluZVNvZnRMaW5lQnJlYWtJdGVtOjpJbmxpbmVTb2Z0TGluZUJyZWFr
SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBwb3NpdGlv
bikKLSAgICA6IElubGluZUl0ZW0oaW5saW5lVGV4dEJveCwgVHlwZTo6U29mdExpbmVCcmVhaykK
LXsKLSAgICBtX3N0YXJ0T3JQb3NpdGlvbiA9IHBvc2l0aW9uOwotfQotCi19Ci19Ci0KLVNQRUNJ
QUxJWkVfVFlQRV9UUkFJVFNfSU5MSU5FX0lURU0oSW5saW5lU29mdExpbmVCcmVha0l0ZW0sIGlz
U29mdExpbmVCcmVhaygpKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmNwcApkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggOWM3MzdhZjBiZGJhOTVhNWY0MDVlY2I0OTQ1ZmNjZDE5Y2Q4YmMz
OS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVUZXh0SXRlbS5jcHAKKysrIC9k
ZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMK
LSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAq
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICog
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcu
aCIKLSNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JN
QVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgotI2luY2x1ZGUgIklu
bGluZVNvZnRMaW5lQnJlYWtJdGVtLmgiCi0jaW5jbHVkZSAiVGV4dFV0aWwuaCIKLSNpbmNsdWRl
IDx3dGYvdW5pY29kZS9DaGFyYWN0ZXJOYW1lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1u
YW1lc3BhY2UgTGF5b3V0IHsKLQotc3RhdGljX2Fzc2VydChzaXplb2YoSW5saW5lSXRlbSkgPT0g
c2l6ZW9mKElubGluZVRleHRJdGVtKSwgIiIpOwotCi1zdHJ1Y3QgV2hpdGVzcGFjZUNvbnRlbnQg
ewotICAgIHNpemVfdCBsZW5ndGggeyAwIH07Ci0gICAgYm9vbCBpc1dvcmRTZXBhcmF0b3IgeyB0
cnVlIH07Ci19Owotc3RhdGljIE9wdGlvbmFsPFdoaXRlc3BhY2VDb250ZW50PiBtb3ZlVG9OZXh0
Tm9uV2hpdGVzcGFjZVBvc2l0aW9uKGNvbnN0IFN0cmluZ1ZpZXcmIHRleHRDb250ZW50LCBzaXpl
X3Qgc3RhcnRQb3NpdGlvbiwgYm9vbCBwcmVzZXJ2ZU5ld2xpbmUsIGJvb2wgcHJlc2VydmVUYWIp
Ci17Ci0gICAgYXV0byBoYXNXb3JkU2VwYXJhdG9yQ2hhcmFjdGVyID0gZmFsc2U7Ci0gICAgYXV0
byBpc1doaXRlc3BhY2VDaGFyYWN0ZXIgPSBbJl0oYXV0byBjaGFyYWN0ZXIpIHsKLSAgICAgICAg
Ly8gd2hpdGUgc3BhY2UgcHJvY2Vzc2luZyBpbiBDU1MgYWZmZWN0cyBvbmx5IHRoZSBkb2N1bWVu
dCB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzOiBzcGFjZXMgKFUrMDAyMCksIHRhYnMgKFUrMDAwOSks
IGFuZCBzZWdtZW50IGJyZWFrcy4KLSAgICAgICAgYXV0byBpc1RyZWF0ZWRBc1NwYWNlQ2hhcmFj
dGVyID0gY2hhcmFjdGVyID09IHNwYWNlIHx8IChjaGFyYWN0ZXIgPT0gbmV3bGluZUNoYXJhY3Rl
ciAmJiAhcHJlc2VydmVOZXdsaW5lKSB8fCAoY2hhcmFjdGVyID09IHRhYkNoYXJhY3RlciAmJiAh
cHJlc2VydmVUYWIpOwotICAgICAgICBoYXNXb3JkU2VwYXJhdG9yQ2hhcmFjdGVyID0gaGFzV29y
ZFNlcGFyYXRvckNoYXJhY3RlciB8fCBpc1RyZWF0ZWRBc1NwYWNlQ2hhcmFjdGVyOwotICAgICAg
ICByZXR1cm4gaXNUcmVhdGVkQXNTcGFjZUNoYXJhY3RlciB8fCBjaGFyYWN0ZXIgPT0gdGFiQ2hh
cmFjdGVyOwotICAgIH07Ci0gICAgYXV0byBuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uID0gc3Rh
cnRQb3NpdGlvbjsKLSAgICB3aGlsZSAobmV4dE5vbldoaXRlU3BhY2VQb3NpdGlvbiA8IHRleHRD
b250ZW50Lmxlbmd0aCgpICYmIGlzV2hpdGVzcGFjZUNoYXJhY3Rlcih0ZXh0Q29udGVudFtuZXh0
Tm9uV2hpdGVTcGFjZVBvc2l0aW9uXSkpCi0gICAgICAgICsrbmV4dE5vbldoaXRlU3BhY2VQb3Np
dGlvbjsKLSAgICByZXR1cm4gbmV4dE5vbldoaXRlU3BhY2VQb3NpdGlvbiA9PSBzdGFydFBvc2l0
aW9uID8gV1RGOjpudWxsb3B0IDogbWFrZU9wdGlvbmFsKFdoaXRlc3BhY2VDb250ZW50IHsgbmV4
dE5vbldoaXRlU3BhY2VQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24sIGhhc1dvcmRTZXBhcmF0b3JD
aGFyYWN0ZXIgfSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBtb3ZlVG9OZXh0QnJlYWthYmxlUG9z
aXRpb24odW5zaWduZWQgc3RhcnRQb3NpdGlvbiwgTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiBsaW5l
QnJlYWtJdGVyYXRvciwgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKQotewotICAgIGF1dG8gdGV4
dExlbmd0aCA9IGxpbmVCcmVha0l0ZXJhdG9yLnN0cmluZ1ZpZXcoKS5sZW5ndGgoKTsKLSAgICBh
dXRvIHN0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb24gPSBzdGFydFBvc2l0aW9u
OwotICAgIHdoaWxlIChzdGFydFBvc2l0aW9uRm9yTmV4dEJyZWFrYWJsZVBvc2l0aW9uIDwgdGV4
dExlbmd0aCkgewotICAgICAgICBhdXRvIG5leHRCcmVha2FibGVQb3NpdGlvbiA9IFRleHRVdGls
OjpmaW5kTmV4dEJyZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0
aW9uRm9yTmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBzdHlsZSk7Ci0gICAgICAgIC8vIE9mdGVudGlt
ZXMgdGhlIG5leHQgYnJlYWthYmxlIHBvc2l0aW9uIGNvbWVzIGJhY2sgYXMgdGhlIHN0YXJ0IHBv
c2l0aW9uIChtb3N0IG5vdGFibHkgaHlwaGVucykuCi0gICAgICAgIGlmIChuZXh0QnJlYWthYmxl
UG9zaXRpb24gIT0gc3RhcnRQb3NpdGlvbikKLSAgICAgICAgICAgIHJldHVybiBuZXh0QnJlYWth
YmxlUG9zaXRpb24gLSBzdGFydFBvc2l0aW9uOwotICAgICAgICArK3N0YXJ0UG9zaXRpb25Gb3JO
ZXh0QnJlYWthYmxlUG9zaXRpb247Ci0gICAgfQotICAgIHJldHVybiB0ZXh0TGVuZ3RoIC0gc3Rh
cnRQb3NpdGlvbjsKLX0KLQotdm9pZCBJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlQW5kQXBwZW5kVGV4
dEl0ZW1zKElubGluZUl0ZW1zJiBpbmxpbmVDb250ZW50LCBjb25zdCBJbmxpbmVUZXh0Qm94JiBp
bmxpbmVUZXh0Qm94KQotewotICAgIGF1dG8gdGV4dCA9IGlubGluZVRleHRCb3guY29udGVudCgp
OwotICAgIGlmICghdGV4dC5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIGlubGluZUNvbnRlbnQu
YXBwZW5kKElubGluZVRleHRJdGVtOjpjcmVhdGVFbXB0eUl0ZW0oaW5saW5lVGV4dEJveCkpOwot
Ci0gICAgYXV0byYgc3R5bGUgPSBpbmxpbmVUZXh0Qm94LnN0eWxlKCk7Ci0gICAgYXV0byYgZm9u
dCA9IHN0eWxlLmZvbnRDYXNjYWRlKCk7Ci0gICAgYXV0byB3aGl0ZXNwYWNlQ29udGVudElzVHJl
YXRlZEFzU2luZ2xlU3BhY2UgPSAhVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFi
cyhpbmxpbmVUZXh0Qm94KTsKLSAgICBhdXRvIHNob3VsZFByZXNlcnZlTmV3bGluZSA9IFRleHRV
dGlsOjpzaG91bGRQcmVzZXJ2ZU5ld2xpbmUoaW5saW5lVGV4dEJveCk7Ci0gICAgYXV0byBsaW5l
QnJlYWtJdGVyYXRvciA9IExhenlMaW5lQnJlYWtJdGVyYXRvciB7IHRleHQsIHN0eWxlLmNvbXB1
dGVkTG9jYWxlKCksIFRleHRVdGlsOjpsaW5lQnJlYWtJdGVyYXRvck1vZGUoc3R5bGUubGluZUJy
ZWFrKCkpIH07Ci0gICAgdW5zaWduZWQgY3VycmVudFBvc2l0aW9uID0gMDsKLQotICAgIGF1dG8g
aW5saW5lSXRlbVdpZHRoID0gWyZdKGF1dG8gc3RhcnRQb3NpdGlvbiwgYXV0byBsZW5ndGgpIC0+
IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsKLSAgICAgICAgaWYgKCFpbmxpbmVUZXh0Qm94
LmNhblVzZVNpbXBsaWZpZWRDb250ZW50TWVhc3VyaW5nKCkpCi0gICAgICAgICAgICByZXR1cm4g
eyB9OwotICAgICAgICByZXR1cm4gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRCb3gsIHN0YXJ0
UG9zaXRpb24sIHN0YXJ0UG9zaXRpb24gKyBsZW5ndGgsIHsgfSk7Ci0gICAgfTsKLQotICAgIHdo
aWxlIChjdXJyZW50UG9zaXRpb24gPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgIGF1dG8gaXNT
ZWdtZW50QnJlYWtDYW5kaWRhdGUgPSBbXShhdXRvIGNoYXJhY3RlcikgewotICAgICAgICAgICAg
cmV0dXJuIGNoYXJhY3RlciA9PSAnXG4nOwotICAgICAgICB9OwotCi0gICAgICAgIC8vIFNlZ21l
bnQgYnJlYWtzIHdpdGggcHJlc2VydmUgbmV3IGxpbmUgc3R5bGUgKHdoaXRlLXNwYWNlOiBwcmUs
IHByZS13cmFwLCBicmVhay1zcGFjZXMgYW5kIHByZS1saW5lKSBjb21wdXRlIHRvIGZvcmNlZCBs
aW5lIGJyZWFrLgotICAgICAgICBpZiAoaXNTZWdtZW50QnJlYWtDYW5kaWRhdGUodGV4dFtjdXJy
ZW50UG9zaXRpb25dKSAmJiBzaG91bGRQcmVzZXJ2ZU5ld2xpbmUpIHsKLSAgICAgICAgICAgIGlu
bGluZUNvbnRlbnQuYXBwZW5kKElubGluZVNvZnRMaW5lQnJlYWtJdGVtOjpjcmVhdGVTb2Z0TGlu
ZUJyZWFrSXRlbShpbmxpbmVUZXh0Qm94LCBjdXJyZW50UG9zaXRpb24pKTsKLSAgICAgICAgICAg
ICsrY3VycmVudFBvc2l0aW9uOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQot
ICAgICAgICBpZiAoYXV0byB3aGl0ZXNwYWNlQ29udGVudCA9IG1vdmVUb05leHROb25XaGl0ZXNw
YWNlUG9zaXRpb24odGV4dCwgY3VycmVudFBvc2l0aW9uLCBzaG91bGRQcmVzZXJ2ZU5ld2xpbmUs
ICF3aGl0ZXNwYWNlQ29udGVudElzVHJlYXRlZEFzU2luZ2xlU3BhY2UpKSB7Ci0gICAgICAgICAg
ICBBU1NFUlQod2hpdGVzcGFjZUNvbnRlbnQtPmxlbmd0aCk7Ci0gICAgICAgICAgICBhdXRvIGFw
cGVuZFdoaXRlc3BhY2VJdGVtID0gWyZdIChhdXRvIHN0YXJ0UG9zaXRpb24sIGF1dG8gaXRlbUxl
bmd0aCkgewotICAgICAgICAgICAgICAgIGF1dG8gc2ltcGxlU2luZ2xlV2hpdGVzcGFjZUNvbnRl
bnQgPSBpbmxpbmVUZXh0Qm94LmNhblVzZVNpbXBsaWZpZWRDb250ZW50TWVhc3VyaW5nKCkgJiYg
KGl0ZW1MZW5ndGggPT0gMSB8fCB3aGl0ZXNwYWNlQ29udGVudElzVHJlYXRlZEFzU2luZ2xlU3Bh
Y2UpOwotICAgICAgICAgICAgICAgIGF1dG8gd2lkdGggPSBzaW1wbGVTaW5nbGVXaGl0ZXNwYWNl
Q29udGVudCA/IG1ha2VPcHRpb25hbChJbmxpbmVMYXlvdXRVbml0IHsgZm9udC5zcGFjZVdpZHRo
KCkgfSkgOiBpbmxpbmVJdGVtV2lkdGgoc3RhcnRQb3NpdGlvbiwgaXRlbUxlbmd0aCk7Ci0gICAg
ICAgICAgICAgICAgaW5saW5lQ29udGVudC5hcHBlbmQoSW5saW5lVGV4dEl0ZW06OmNyZWF0ZVdo
aXRlc3BhY2VJdGVtKGlubGluZVRleHRCb3gsIHN0YXJ0UG9zaXRpb24sIGl0ZW1MZW5ndGgsIHdo
aXRlc3BhY2VDb250ZW50LT5pc1dvcmRTZXBhcmF0b3IsIHdpZHRoKSk7Ci0gICAgICAgICAgICB9
OwotICAgICAgICAgICAgaWYgKHN0eWxlLndoaXRlU3BhY2UoKSA9PSBXaGl0ZVNwYWNlOjpCcmVh
a1NwYWNlcykgewotICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mt
dGV4dC0zLyN3aGl0ZS1zcGFjZS1waGFzZS0xCi0gICAgICAgICAgICAgICAgLy8gRm9yIGJyZWFr
LXNwYWNlcywgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgZXhpc3RzIGFmdGVyIGV2ZXJ5IHNwYWNl
IGFuZCBldmVyeSB0YWIuCi0gICAgICAgICAgICAgICAgLy8gRklYTUU6IGlmIHRoaXMgdHVybnMg
b3V0IHRvIGJlIGEgcGVyZiBoaXQgd2l0aCB0b28gbWFueSBpbmRpdmlkdWFsIHdoaXRlc3BhY2Ug
aW5saW5lIGl0ZW1zLCB3ZSBzaG91bGQgdHJhbnNpdGlvbiB0aGlzIGxvZ2ljIHRvIGxpbmUgYnJl
YWtpbmcuCi0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3aGl0ZXNwYWNl
Q29udGVudC0+bGVuZ3RoOyArK2kpCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZFdoaXRlc3Bh
Y2VJdGVtKGN1cnJlbnRQb3NpdGlvbiArIGksIDEpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAg
ICAgICAgICAgICAgYXBwZW5kV2hpdGVzcGFjZUl0ZW0oY3VycmVudFBvc2l0aW9uLCB3aGl0ZXNw
YWNlQ29udGVudC0+bGVuZ3RoKTsKLSAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiArPSB3aGl0
ZXNwYWNlQ29udGVudC0+bGVuZ3RoOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0K
LQotICAgICAgICBhdXRvIGhhc1RyYWlsaW5nU29mdEh5cGhlbiA9IGZhbHNlOwotICAgICAgICBh
dXRvIGluaXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb247Ci0gICAg
ICAgIGF1dG8gaXNBdFNvZnRIeXBoZW4gPSBbJl0oYXV0byBwb3NpdGlvbikgewotICAgICAgICAg
ICAgcmV0dXJuIHRleHRbcG9zaXRpb25dID09IHNvZnRIeXBoZW47Ci0gICAgICAgIH07Ci0gICAg
ICAgIGlmIChzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVuczo6Tm9uZSkgewotICAgICAgICAgICAg
Ly8gTGV0J3MgbWVyZ2UgY2FuZGlkYXRlIElubGluZVRleHRJdGVtcyBzZXBhcmF0ZWQgYnkgc29m
dCBoeXBoZW4gd2hlbiB0aGUgc3R5bGUgc2F5cyBzby4KLSAgICAgICAgICAgIHdoaWxlIChjdXJy
ZW50UG9zaXRpb24gPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBub25X
aGl0ZVNwYWNlTGVuZ3RoID0gbW92ZVRvTmV4dEJyZWFrYWJsZVBvc2l0aW9uKGN1cnJlbnRQb3Np
dGlvbiwgbGluZUJyZWFrSXRlcmF0b3IsIHN0eWxlKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQo
bm9uV2hpdGVTcGFjZUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uICs9
IG5vbldoaXRlU3BhY2VMZW5ndGg7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0F0U29mdEh5cGhl
bihjdXJyZW50UG9zaXRpb24gLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdXRvIG5vbldoaXRlU3Bh
Y2VMZW5ndGggPSBtb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24oaW5pdGlhbE5vbldoaXRlc3Bh
Y2VQb3NpdGlvbiwgbGluZUJyZWFrSXRlcmF0b3IsIHN0eWxlKTsKLSAgICAgICAgICAgIEFTU0VS
VChub25XaGl0ZVNwYWNlTGVuZ3RoKTsKLSAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiArPSBu
b25XaGl0ZVNwYWNlTGVuZ3RoOwotICAgICAgICAgICAgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuID0g
aXNBdFNvZnRIeXBoZW4oY3VycmVudFBvc2l0aW9uIC0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAg
QVNTRVJUKGluaXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRpb24gPCBjdXJyZW50UG9zaXRpb24pOwot
ICAgICAgICBBU1NFUlRfSU1QTElFUyhzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVuczo6Tm9uZSwg
IWhhc1RyYWlsaW5nU29mdEh5cGhlbik7Ci0gICAgICAgIGF1dG8gbGVuZ3RoID0gY3VycmVudFBv
c2l0aW9uIC0gaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbjsKLSAgICAgICAgaW5saW5lQ29u
dGVudC5hcHBlbmQoSW5saW5lVGV4dEl0ZW06OmNyZWF0ZU5vbldoaXRlc3BhY2VJdGVtKGlubGlu
ZVRleHRCb3gsIGluaXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRpb24sIGxlbmd0aCwgaGFzVHJhaWxp
bmdTb2Z0SHlwaGVuLCBpbmxpbmVJdGVtV2lkdGgoaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlv
biwgbGVuZ3RoKSkpOwotICAgIH0KLX0KLQotYm9vbCBJbmxpbmVUZXh0SXRlbTo6aXNFbXB0eUNv
bnRlbnQoKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgZm9yIG1vcmUg
emVybyB3aWR0aCBjb250ZW50IGFuZCBub3QganVzdCBVKzIwMEIuCi0gICAgcmV0dXJuICFtX2xl
bmd0aCB8fCAobV9sZW5ndGggPT0gMSAmJiBpbmxpbmVUZXh0Qm94KCkuY29udGVudCgpW3N0YXJ0
KCldID09IHplcm9XaWR0aFNwYWNlKTsgCi19Ci0KLWJvb2wgSW5saW5lVGV4dEl0ZW06OnNob3Vs
ZFByZXNlcnZlU3BhY2VzQW5kVGFicyhjb25zdCBJbmxpbmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0
ZW0pCi17Ci0gICAgQVNTRVJUKGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpKTsKLSAgICBy
ZXR1cm4gVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRl
bS5sYXlvdXRCb3goKSk7Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uaCBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmgKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGM5OGRjZjA2YTE5YWEwNWZjNGFhMGFhMjRkOTgzYTVi
N2NkMTUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uaAorKysg
L2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwot
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0g
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0K
LSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIklubGlu
ZUl0ZW0uaCIKLSNpbmNsdWRlICJMYXlvdXRJbmxpbmVUZXh0Qm94LmgiCi0KLW5hbWVzcGFjZSBX
ZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi11c2luZyBJbmxpbmVJdGVtcyA9IFZlY3Rv
cjxJbmxpbmVJdGVtPjsKLQotY2xhc3MgSW5saW5lVGV4dEl0ZW0gOiBwdWJsaWMgSW5saW5lSXRl
bSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgY3JlYXRlQW5kQXBwZW5kVGV4dEl0ZW1zKElu
bGluZUl0ZW1zJiwgY29uc3QgSW5saW5lVGV4dEJveCYpOwotCi0gICAgdW5zaWduZWQgc3RhcnQo
KSBjb25zdCB7IHJldHVybiBtX3N0YXJ0T3JQb3NpdGlvbjsgfQotICAgIHVuc2lnbmVkIGVuZCgp
IGNvbnN0IHsgcmV0dXJuIHN0YXJ0KCkgKyBsZW5ndGgoKTsgfQotICAgIHVuc2lnbmVkIGxlbmd0
aCgpIGNvbnN0IHsgcmV0dXJuIG1fbGVuZ3RoOyB9Ci0KLSAgICBib29sIGlzV2hpdGVzcGFjZSgp
IGNvbnN0IHsgcmV0dXJuIG1fdGV4dEl0ZW1UeXBlID09IFRleHRJdGVtVHlwZTo6V2hpdGVzcGFj
ZTsgfQotICAgIGJvb2wgaXNXb3JkU2VwYXJhdG9yKCkgY29uc3QgeyByZXR1cm4gbV9pc1dvcmRT
ZXBhcmF0b3I7IH0KLSAgICBib29sIGhhc1RyYWlsaW5nU29mdEh5cGhlbigpIGNvbnN0IHsgcmV0
dXJuIG1faGFzVHJhaWxpbmdTb2Z0SHlwaGVuOyB9Ci0gICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0
VW5pdD4gd2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2hhc1dpZHRoID8gbWFrZU9wdGlvbmFsKG1f
d2lkdGgpIDogT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geyB9OyB9Ci0gICAgYm9vbCBpc0Vt
cHR5Q29udGVudCgpIGNvbnN0OwotCi0gICAgY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4
dEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PElubGluZVRleHRCb3g+KGxheW91dEJveCgp
KTsgfQotCi0gICAgSW5saW5lVGV4dEl0ZW0gbGVmdCh1bnNpZ25lZCBsZW5ndGgpIGNvbnN0Owot
ICAgIElubGluZVRleHRJdGVtIHJpZ2h0KHVuc2lnbmVkIGxlbmd0aCkgY29uc3Q7Ci0KLSAgICBz
dGF0aWMgYm9vbCBzaG91bGRQcmVzZXJ2ZVNwYWNlc0FuZFRhYnMoY29uc3QgSW5saW5lVGV4dEl0
ZW0mKTsKLQotcHJpdmF0ZToKLSAgICB1c2luZyBJbmxpbmVJdGVtOjpUZXh0SXRlbVR5cGU7Ci0K
LSAgICBJbmxpbmVUZXh0SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWduZWQgc3RhcnQs
IHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIGJvb2wgaXNXb3Jk
U2VwYXJhdG9yLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCwgVGV4dEl0ZW1UeXBl
KTsKLSAgICBleHBsaWNpdCBJbmxpbmVUZXh0SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94Jik7Ci0K
LSAgICBzdGF0aWMgSW5saW5lVGV4dEl0ZW0gY3JlYXRlV2hpdGVzcGFjZUl0ZW0oY29uc3QgSW5s
aW5lVGV4dEJveCYsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wgaXNXb3Jk
U2VwYXJhdG9yLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCk7Ci0gICAgc3RhdGlj
IElubGluZVRleHRJdGVtIGNyZWF0ZU5vbldoaXRlc3BhY2VJdGVtKGNvbnN0IElubGluZVRleHRC
b3gmLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGhhc1RyYWlsaW5nU29m
dEh5cGhlbiwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgpOwotICAgIHN0YXRpYyBJ
bmxpbmVUZXh0SXRlbSBjcmVhdGVFbXB0eUl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYpOwotfTsK
LQotaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpjcmVhdGVXaGl0ZXNwYWNl
SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBzdGFydCwg
dW5zaWduZWQgbGVuZ3RoLCBib29sIGlzV29yZFNlcGFyYXRvciwgT3B0aW9uYWw8SW5saW5lTGF5
b3V0VW5pdD4gd2lkdGgpCi17Ci0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgc3RhcnQsIGxl
bmd0aCwgZmFsc2UsIGlzV29yZFNlcGFyYXRvciwgd2lkdGgsIFRleHRJdGVtVHlwZTo6V2hpdGVz
cGFjZSB9OwotfQotCi1pbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5saW5lVGV4dEl0ZW06OmNyZWF0
ZU5vbldoaXRlc3BhY2VJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRCb3gsIHVu
c2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wgaGFzVHJhaWxpbmdTb2Z0SHlwaGVu
LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCkKLXsKLSAgICAvLyBGSVhNRTogVXNl
IHRoZSBmb2xsb3dpbmcgbGlzdCBvZiBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHNldCB0
aGUgImlzV29yZFNlcGFyYXRvciIgYml0OiBub0JyZWFrU3BhY2UsIGV0aGlvcGljV29yZHNwYWNl
LCBhZWdlYW5Xb3JkU2VwYXJhdG9yTGluZSBhZWdlYW5Xb3JkU2VwYXJhdG9yRG90IHVnYXJpdGlj
V29yZERpdmlkZXIuCi0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgc3RhcnQsIGxlbmd0aCwg
aGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBmYWxzZSwgd2lkdGgsIFRleHRJdGVtVHlwZTo6Tm9uV2hp
dGVzcGFjZSB9OwotfQotCi1pbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5saW5lVGV4dEl0ZW06OmNy
ZWF0ZUVtcHR5SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94KQotewotICAg
IHJldHVybiBJbmxpbmVUZXh0SXRlbSB7IGlubGluZVRleHRCb3ggfTsKLX0KLQotaW5saW5lIElu
bGluZVRleHRJdGVtOjpJbmxpbmVUZXh0SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVU
ZXh0Qm94LCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGhhc1RyYWlsaW5n
U29mdEh5cGhlbiwgYm9vbCBpc1dvcmRTZXBhcmF0b3IsIE9wdGlvbmFsPElubGluZUxheW91dFVu
aXQ+IHdpZHRoLCBUZXh0SXRlbVR5cGUgdGV4dEl0ZW1UeXBlKQotICAgIDogSW5saW5lSXRlbShp
bmxpbmVUZXh0Qm94LCBUeXBlOjpUZXh0KQotewotICAgIG1fc3RhcnRPclBvc2l0aW9uID0gc3Rh
cnQ7Ci0gICAgbV9sZW5ndGggPSBsZW5ndGg7Ci0gICAgbV9oYXNXaWR0aCA9ICEhd2lkdGg7Ci0g
ICAgbV9oYXNUcmFpbGluZ1NvZnRIeXBoZW4gPSBoYXNUcmFpbGluZ1NvZnRIeXBoZW47Ci0gICAg
bV9pc1dvcmRTZXBhcmF0b3IgPSBpc1dvcmRTZXBhcmF0b3I7Ci0gICAgbV93aWR0aCA9IHdpZHRo
LnZhbHVlT3IoMCk7Ci0gICAgbV90ZXh0SXRlbVR5cGUgPSB0ZXh0SXRlbVR5cGU7Ci19Ci0KLWlu
bGluZSBJbmxpbmVUZXh0SXRlbTo6SW5saW5lVGV4dEl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYg
aW5saW5lVGV4dEJveCkKLSAgICA6IElubGluZUl0ZW0oaW5saW5lVGV4dEJveCwgVHlwZTo6VGV4
dCkKLXsKLX0KLQotaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpsZWZ0KHVu
c2lnbmVkIGxlbmd0aCkgY29uc3QKLXsKLSAgICBSRUxFQVNFX0FTU0VSVChsZW5ndGggPD0gdGhp
cy0+bGVuZ3RoKCkpOwotICAgIEFTU0VSVChtX3RleHRJdGVtVHlwZSAhPSBUZXh0SXRlbVR5cGU6
OlVuZGVmaW5lZCk7Ci0gICAgQVNTRVJUKGxlbmd0aCk7Ci0gICAgcmV0dXJuIHsgaW5saW5lVGV4
dEJveCgpLCBzdGFydCgpLCBsZW5ndGgsIGZhbHNlLCBpc1dvcmRTZXBhcmF0b3IoKSwgV1RGOjpu
dWxsb3B0LCBtX3RleHRJdGVtVHlwZSB9OwotfQotCi1pbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5s
aW5lVGV4dEl0ZW06OnJpZ2h0KHVuc2lnbmVkIGxlbmd0aCkgY29uc3QKLXsKLSAgICBSRUxFQVNF
X0FTU0VSVChsZW5ndGggPD0gdGhpcy0+bGVuZ3RoKCkpOwotICAgIEFTU0VSVChtX3RleHRJdGVt
VHlwZSAhPSBUZXh0SXRlbVR5cGU6OlVuZGVmaW5lZCk7Ci0gICAgQVNTRVJUKGxlbmd0aCk7Ci0g
ICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCgpLCBlbmQoKSAtIGxlbmd0aCwgbGVuZ3RoLCBoYXNU
cmFpbGluZ1NvZnRIeXBoZW4oKSwgaXNXb3JkU2VwYXJhdG9yKCksIFdURjo6bnVsbG9wdCwgbV90
ZXh0SXRlbVR5cGUgfTsKLX0KLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0lOTElO
RV9JVEVNKElubGluZVRleHRJdGVtLCBpc1RleHQoKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRVdGlsLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuY3Bw
CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTU3NWJjZTcyODUzYThjOWRiZjM2MmY0
ZmM5YjE5OTc2YWIyNTIwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0
aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5j
bHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGV4dFV0aWwuaCIKLQotI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQnJlYWtMaW5lcy5oIgotI2luY2x1
ZGUgIkZvbnRDYXNjYWRlLmgiCi0jaW5jbHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIKLSNpbmNsdWRl
ICJMYXlvdXRJbmxpbmVUZXh0Qm94LmgiCi0jaW5jbHVkZSAiUmVuZGVyQm94LmgiCi0jaW5jbHVk
ZSAiUmVuZGVyU3R5bGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91
dCB7Ci0KLUlubGluZUxheW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRJ
dGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQp
Ci17Ci0gICAgcmV0dXJuIFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4
dEl0ZW0uc3RhcnQoKSwgaW5saW5lVGV4dEl0ZW0uZW5kKCksIGNvbnRlbnRMb2dpY2FsTGVmdCk7
Ci19Ci0KLUlubGluZUxheW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRJ
dGVtJiBpbmxpbmVUZXh0SXRlbSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxh
eW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KQotewotICAgIFJFTEVBU0VfQVNTRVJUKGZyb20g
Pj0gaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSk7Ci0gICAgUkVMRUFTRV9BU1NFUlQodG8gPD0gaW5s
aW5lVGV4dEl0ZW0uZW5kKCkpOwotICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2Uo
KSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVU
ZXh0SXRlbSkpIHsKLSAgICAgICAgYXV0byBzcGFjZVdpZHRoID0gaW5saW5lVGV4dEl0ZW0uc3R5
bGUoKS5mb250Q2FzY2FkZSgpLnNwYWNlV2lkdGgoKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6aXNu
YW4oc3BhY2VXaWR0aCkgPyAwLjBmIDogc3RkOjppc2luZihzcGFjZVdpZHRoKSA/IG1heElubGlu
ZUxheW91dFVuaXQoKSA6IHNwYWNlV2lkdGg7Ci0gICAgfQotICAgIHJldHVybiBUZXh0VXRpbDo6
d2lkdGgoaW5saW5lVGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpLCBmcm9tLCB0bywgY29udGVudExv
Z2ljYWxMZWZ0KTsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBUZXh0VXRpbDo6d2lkdGgoY29uc3Qg
SW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8s
IElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KQotewotICAgIGlmIChmcm9tID09
IHRvKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGF1dG8mIHN0eWxlID0gaW5saW5lVGV4dEJv
eC5zdHlsZSgpOwotICAgIGF1dG8mIGZvbnQgPSBzdHlsZS5mb250Q2FzY2FkZSgpOwotICAgIGF1
dG8gdGV4dCA9IGlubGluZVRleHRCb3guY29udGVudCgpOwotICAgIEFTU0VSVCh0byA8PSB0ZXh0
Lmxlbmd0aCgpKTsKLSAgICBhdXRvIGhhc0tlcm5pbmdPckxpZ2F0dXJlcyA9IGZvbnQuZW5hYmxl
S2VybmluZygpIHx8IGZvbnQucmVxdWlyZXNTaGFwaW5nKCk7Ci0gICAgYXV0byBtZWFzdXJlV2l0
aEVuZFNwYWNlID0gaGFzS2VybmluZ09yTGlnYXR1cmVzICYmIHRvIDwgdGV4dC5sZW5ndGgoKSAm
JiB0ZXh0W3RvXSA9PSAnICc7Ci0gICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2UpCi0gICAgICAg
ICsrdG87Ci0gICAgZmxvYXQgd2lkdGggPSAwOwotICAgIGlmIChpbmxpbmVUZXh0Qm94LmNhblVz
ZVNpbXBsaWZpZWRDb250ZW50TWVhc3VyaW5nKCkpCi0gICAgICAgIHdpZHRoID0gZm9udC53aWR0
aEZvclNpbXBsZVRleHQoU3RyaW5nVmlldyh0ZXh0KS5zdWJzdHJpbmcoZnJvbSwgdG8gLSBmcm9t
KSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF1dG8gdGFiV2lkdGggPSBzdHlsZS5jb2xsYXBzZVdo
aXRlU3BhY2UoKSA/IFRhYlNpemUoMCkgOiBzdHlsZS50YWJTaXplKCk7Ci0gICAgICAgIFdlYkNv
cmU6OlRleHRSdW4gcnVuKFN0cmluZ1ZpZXcodGV4dCkuc3Vic3RyaW5nKGZyb20sIHRvIC0gZnJv
bSksIGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0gICAgICAgIGlmICh0YWJXaWR0aCkKLSAgICAgICAg
ICAgIHJ1bi5zZXRUYWJTaXplKHRydWUsIHRhYldpZHRoKTsKLSAgICAgICAgd2lkdGggPSBmb250
LndpZHRoKHJ1bik7Ci0gICAgfQotCi0gICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2UpCi0gICAg
ICAgIHdpZHRoIC09IChmb250LnNwYWNlV2lkdGgoKSArIGZvbnQud29yZFNwYWNpbmcoKSk7Ci0K
LSAgICByZXR1cm4gc3RkOjppc25hbih3aWR0aCkgPyAwLjBmIDogc3RkOjppc2luZih3aWR0aCkg
PyBtYXhJbmxpbmVMYXlvdXRVbml0KCkgOiB3aWR0aDsKLX0KLQotVGV4dFV0aWw6OlNwbGl0RGF0
YSBUZXh0VXRpbDo6c3BsaXQoY29uc3QgSW5saW5lVGV4dEl0ZW0mIGlubGluZVRleHRJdGVtLCBJ
bmxpbmVMYXlvdXRVbml0IHRleHRXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0
aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpCi17Ci0gICAgQVNTRVJUKGF2
YWlsYWJsZVdpZHRoID49IDApOwotICAgIGF1dG8gc3RhcnRQb3NpdGlvbiA9IGlubGluZVRleHRJ
dGVtLnN0YXJ0KCk7Ci0gICAgYXV0byBsZW5ndGggPSBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKTsK
LSAgICBBU1NFUlQobGVuZ3RoKTsKLQotICAgIGF1dG8gbGVmdCA9IHN0YXJ0UG9zaXRpb247Ci0g
ICAgLy8gUGF0aG9sb2dpY2FsIGNhc2Ugb2YgKGV4dHJlbWVseSlsb25nIHN0cmluZyBhbmQgbmFy
cm93IGxpbmVzLgotICAgIC8vIEFkanVzdCB0aGUgcmFuZ2Ugc28gdGhhdCB3ZSBjYW4gcGljayBh
IHJlYXNvbmFibGUgbWlkcG9pbnQuCi0gICAgSW5saW5lTGF5b3V0VW5pdCBhdmVyYWdlQ2hhcmFj
dGVyV2lkdGggPSB0ZXh0V2lkdGggLyBsZW5ndGg7Ci0gICAgdW5zaWduZWQgb2Zmc2V0ID0gdG9M
YXlvdXRVbml0KDIgKiBhdmFpbGFibGVXaWR0aCAvIGF2ZXJhZ2VDaGFyYWN0ZXJXaWR0aCkudG9V
bnNpZ25lZCgpOwotICAgIGF1dG8gcmlnaHQgPSBzdGQ6Om1pbjx1bnNpZ25lZD4obGVmdCArIG9m
ZnNldCwgKHN0YXJ0UG9zaXRpb24gKyBsZW5ndGggLSAxKSk7Ci0gICAgLy8gUHJlc2VydmUgdGhl
IGxlZnQgd2lkdGggZm9yIHRoZSBmaW5hbCBzcGxpdCBwb3NpdGlvbiBzbyB0aGF0IHdlIGRvbid0
IG5lZWQgdG8gcmVtZWFzdXJlIHRoZSBsZWZ0IHNpZGUgYWdhaW4uCi0gICAgSW5saW5lTGF5b3V0
VW5pdCBsZWZ0U2lkZVdpZHRoID0gMDsKLSAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7Ci0gICAg
ICAgIGF1dG8gbWlkZGxlID0gKGxlZnQgKyByaWdodCkgLyAyOwotICAgICAgICBhdXRvIHdpZHRo
ID0gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRJdGVtLCBzdGFydFBvc2l0aW9uLCBtaWRkbGUg
KyAxLCBjb250ZW50TG9naWNhbExlZnQpOwotICAgICAgICBpZiAod2lkdGggPCBhdmFpbGFibGVX
aWR0aCkgewotICAgICAgICAgICAgbGVmdCA9IG1pZGRsZSArIDE7Ci0gICAgICAgICAgICBsZWZ0
U2lkZVdpZHRoID0gd2lkdGg7Ci0gICAgICAgIH0gZWxzZSBpZiAod2lkdGggPiBhdmFpbGFibGVX
aWR0aCkKLSAgICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlOwotICAgICAgICBlbHNlIHsKLSAgICAg
ICAgICAgIHJpZ2h0ID0gbWlkZGxlICsgMTsKLSAgICAgICAgICAgIGxlZnRTaWRlV2lkdGggPSB3
aWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB7
IHN0YXJ0UG9zaXRpb24sIHJpZ2h0IC0gc3RhcnRQb3NpdGlvbiwgbGVmdFNpZGVXaWR0aCB9Owot
fQotCi11bnNpZ25lZCBUZXh0VXRpbDo6ZmluZE5leHRCcmVha2FibGVQb3NpdGlvbihMYXp5TGlu
ZUJyZWFrSXRlcmF0b3ImIGxpbmVCcmVha0l0ZXJhdG9yLCB1bnNpZ25lZCBzdGFydFBvc2l0aW9u
LCBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUpCi17Ci0gICAgYXV0byBrZWVwQWxsV29yZHNGb3JD
SksgPSBzdHlsZS53b3JkQnJlYWsoKSA9PSBXb3JkQnJlYWs6OktlZXBBbGw7Ci0gICAgYXV0byBi
cmVha05CU1AgPSBzdHlsZS5hdXRvV3JhcCgpICYmIHN0eWxlLm5ic3BNb2RlKCkgPT0gTkJTUE1v
ZGU6OlNwYWNlOwotCi0gICAgaWYgKGtlZXBBbGxXb3Jkc0ZvckNKSykgewotICAgICAgICBpZiAo
YnJlYWtOQlNQKQotICAgICAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbktlZXBp
bmdBbGxXb3JkcyhsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Ci0gICAgICAgIHJl
dHVybiBuZXh0QnJlYWthYmxlUG9zaXRpb25LZWVwaW5nQWxsV29yZHNJZ25vcmluZ05CU1AobGlu
ZUJyZWFrSXRlcmF0b3IsIHN0YXJ0UG9zaXRpb24pOwotICAgIH0KLQotICAgIGlmIChsaW5lQnJl
YWtJdGVyYXRvci5tb2RlKCkgPT0gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpEZWZhdWx0KSB7Ci0g
ICAgICAgIGlmIChicmVha05CU1ApCi0gICAgICAgICAgICByZXR1cm4gV2ViQ29yZTo6bmV4dEJy
ZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9uKTsKLSAgICAg
ICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbklnbm9yaW5nTkJTUChsaW5lQnJlYWtJdGVy
YXRvciwgc3RhcnRQb3NpdGlvbik7Ci0gICAgfQotCi0gICAgaWYgKGJyZWFrTkJTUCkKLSAgICAg
ICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbldpdGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJ
dGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Ci0gICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlv
bklnbm9yaW5nTkJTUFdpdGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3Np
dGlvbik7Ci19Ci0KLWJvb2wgVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhj
b25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3Nz
LXRleHQtMy8jd2hpdGUtc3BhY2UtcHJvcGVydHkKLSAgICBhdXRvIHdoaXRlc3BhY2UgPSBsYXlv
dXRCb3guc3R5bGUoKS53aGl0ZVNwYWNlKCk7Ci0gICAgcmV0dXJuIHdoaXRlc3BhY2UgPT0gV2hp
dGVTcGFjZTo6UHJlIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlV3JhcCB8fCB3aGl0
ZXNwYWNlID09IFdoaXRlU3BhY2U6OkJyZWFrU3BhY2VzOwotfQotCi1ib29sIFRleHRVdGlsOjpz
aG91bGRQcmVzZXJ2ZU5ld2xpbmUoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAgYXV0byB3
aGl0ZXNwYWNlID0gbGF5b3V0Qm94LnN0eWxlKCkud2hpdGVTcGFjZSgpOwotICAgIC8vIGh0dHBz
Oi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eQotICAgIHJl
dHVybiB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZSB8fCB3aGl0ZXNwYWNlID09IFdoaXRl
U3BhY2U6OlByZVdyYXAgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpCcmVha1NwYWNlcyB8
fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZUxpbmU7IAotfQotCi1MaW5lQnJlYWtJdGVy
YXRvck1vZGUgVGV4dFV0aWw6OmxpbmVCcmVha0l0ZXJhdG9yTW9kZShMaW5lQnJlYWsgbGluZUJy
ZWFrKQotewotICAgIHN3aXRjaCAobGluZUJyZWFrKSB7Ci0gICAgY2FzZSBMaW5lQnJlYWs6OkF1
dG86Ci0gICAgY2FzZSBMaW5lQnJlYWs6OkFmdGVyV2hpdGVTcGFjZToKLSAgICBjYXNlIExpbmVC
cmVhazo6QW55d2hlcmU6Ci0gICAgICAgIHJldHVybiBMaW5lQnJlYWtJdGVyYXRvck1vZGU6OkRl
ZmF1bHQ7Ci0gICAgY2FzZSBMaW5lQnJlYWs6Okxvb3NlOgotICAgICAgICByZXR1cm4gTGluZUJy
ZWFrSXRlcmF0b3JNb2RlOjpMb29zZTsKLSAgICBjYXNlIExpbmVCcmVhazo6Tm9ybWFsOgotICAg
ICAgICByZXR1cm4gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpOb3JtYWw7Ci0gICAgY2FzZSBMaW5l
QnJlYWs6OlN0cmljdDoKLSAgICAgICAgcmV0dXJuIExpbmVCcmVha0l0ZXJhdG9yTW9kZTo6U3Ry
aWN0OwotICAgIH0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gTGluZUJy
ZWFrSXRlcmF0b3JNb2RlOjpEZWZhdWx0OwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuaCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuaApk
ZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1ODRmYTc5ODFiZDQzODNjZjQzZTIzYTRi
ZmFlYjgyMGNlMzJmMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRVdGls
LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAy
MDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBv
bmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUg
IklubGluZUl0ZW0uaCIKLSNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgotI2luY2x1ZGUgPHd0Zi90
ZXh0L1RleHRCcmVha0l0ZXJhdG9yLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotY2xhc3Mg
UmVuZGVyU3R5bGU7Ci0KLW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBJbmxpbmVUZXh0Qm94
OwotY2xhc3MgSW5saW5lVGV4dEl0ZW07Ci0KLWNsYXNzIFRleHRVdGlsIHsKLXB1YmxpYzoKLSAg
ICBzdGF0aWMgSW5saW5lTGF5b3V0VW5pdCB3aWR0aChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIElu
bGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KTsKLSAgICBzdGF0aWMgSW5saW5lTGF5
b3V0VW5pdCB3aWR0aChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIHVuc2lnbmVkIGZyb20sIHVuc2ln
bmVkIHRvLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0gICAgc3RhdGlj
IElubGluZUxheW91dFVuaXQgd2lkdGgoY29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIGZy
b20sIHVuc2lnbmVkIHRvLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0K
LSAgICBzdHJ1Y3QgU3BsaXREYXRhIHsKLSAgICAgICAgdW5zaWduZWQgc3RhcnQgeyAwIH07Ci0g
ICAgICAgIHVuc2lnbmVkIGxlbmd0aCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBs
b2dpY2FsV2lkdGggeyAwIH07Ci0gICAgfTsKLSAgICBzdGF0aWMgU3BsaXREYXRhIHNwbGl0KGNv
bnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCB0ZXh0V2lkdGgsIElubGluZUxh
eW91dFVuaXQgYXZhaWxhYmxlV2lkdGgsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxM
ZWZ0KTsKLQotICAgIHN0YXRpYyB1bnNpZ25lZCBmaW5kTmV4dEJyZWFrYWJsZVBvc2l0aW9uKExh
enlMaW5lQnJlYWtJdGVyYXRvciYsIHVuc2lnbmVkIHN0YXJ0UG9zaXRpb24sIGNvbnN0IFJlbmRl
clN0eWxlJik7Ci0gICAgc3RhdGljIExpbmVCcmVha0l0ZXJhdG9yTW9kZSBsaW5lQnJlYWtJdGVy
YXRvck1vZGUoTGluZUJyZWFrKTsKLQotICAgIHN0YXRpYyBib29sIHNob3VsZFByZXNlcnZlU3Bh
Y2VzQW5kVGFicyhjb25zdCBCb3gmKTsKLSAgICBzdGF0aWMgYm9vbCBzaG91bGRQcmVzZXJ2ZU5l
d2xpbmUoY29uc3QgQm94Jik7Ci19OwotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGlu
Z0NvbnRleHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDJhZjdjNWVkODhk
NTA0Y2FjNDI1YTEzNTIxMDA4YjZlNThiOWFjLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcv
VGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBA
QAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJUYWJsZUZvcm1h
dHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkK
LQotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiRmxvYXRpbmdT
dGF0ZS5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIklu
dmFsaWRhdGlvblN0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5
b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDaGlsZEl0ZXJhdG9yLmgiCi0jaW5j
bHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5n
QmxvY2suaCIKLSNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgPHd0
Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoVGFibGVGb3JtYXR0aW5nQ29u
dGV4dCk7Ci0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGFibGVzLTMvI3RhYmxlLWxh
eW91dC1hbGdvcml0aG0KLVRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlRm9ybWF0dGluZ0Nv
bnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIFRhYmxlRm9y
bWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCi0gICAgOiBGb3JtYXR0aW5nQ29udGV4dChm
b3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKLXsKLX0KLQotdm9pZCBUYWJs
ZUZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRl
JiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAg
ICBhdXRvIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSA9IGNvbnN0cmFpbnRzLmhvcml6b250YWwu
bG9naWNhbFdpZHRoOwotICAgIGF1dG8gYXZhaWxhYmxlVmVydGljYWxTcGFjZSA9IGNvbnN0cmFp
bnRzLnZlcnRpY2FsLmxvZ2ljYWxIZWlnaHQ7Ci0gICAgLy8gMS4gQ29tcHV0ZSB3aWR0aCBhbmQg
aGVpZ2h0IGZvciB0aGUgZ3JpZC4KLSAgICBjb21wdXRlQW5kRGlzdHJpYnV0ZUV4dHJhU3BhY2Uo
YXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKTsKLSAgICAv
LyAyLiBGaW5hbGl6ZSBjZWxscy4KLSAgICBzZXRVc2VkR2VvbWV0cnlGb3JDZWxscyhhdmFpbGFi
bGVIb3Jpem9udGFsU3BhY2UpOwotICAgIC8vIDMuIEZpbmFsaXplIHJvd3MuCi0gICAgc2V0VXNl
ZEdlb21ldHJ5Rm9yUm93cyhhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAgIC8vIDQuIEZp
bmFsaXplIHNlY3Rpb25zLgotICAgIHNldFVzZWRHZW9tZXRyeUZvclNlY3Rpb25zKGNvbnN0cmFp
bnRzKTsKLX0KLQotTGF5b3V0VW5pdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0Ojp1c2VkQ29udGVu
dEhlaWdodCgpIGNvbnN0Ci17Ci0gICAgLy8gVGFibGUgaGFzIHRvIGhhdmUgc29tZSBzZWN0aW9u
IGNvbnRlbnQsIGF0IGxlYXN0IG9uZSA8dGJvZHk+LgotICAgIGF1dG8gdG9wID0gQm94R2VvbWV0
cnk6Om1hcmdpbkJveFJlY3QoZ2VvbWV0cnlGb3JCb3goKnJvb3QoKS5maXJzdEluRmxvd0NoaWxk
KCkpKS50b3AoKTsKLSAgICBhdXRvIGJvdHRvbSA9IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0
KGdlb21ldHJ5Rm9yQm94KCpyb290KCkubGFzdEluRmxvd0NoaWxkKCkpKS5ib3R0b20oKTsKLSAg
ICByZXR1cm4gYm90dG9tIC0gdG9wOwotfQotCi12b2lkIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6
OnNldFVzZWRHZW9tZXRyeUZvckNlbGxzKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNw
YWNlKQotewotICAgIGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsK
LSAgICBhdXRvJiBjb2x1bW5MaXN0ID0gZ3JpZC5jb2x1bW5zKCkubGlzdCgpOwotICAgIGF1dG8m
IHJvd0xpc3QgPSBncmlkLnJvd3MoKS5saXN0KCk7Ci0gICAgLy8gRmluYWwgdGFibGUgY2VsbCBs
YXlvdXQuIEF0IHRoaXMgcG9pbnQgYWxsIHBlcmNlbnRhZ2UgdmFsdWVzIGNhbiBiZSByZXNvbHZl
ZC4KLSAgICBhdXRvIHNlY3Rpb25PZmZzZXQgPSBMYXlvdXRVbml0IHsgfTsKLSAgICBhdXRvKiBj
dXJyZW50U2VjdGlvbiA9ICZyb3dMaXN0LmZpcnN0KCkuYm94KCkucGFyZW50KCk7Ci0gICAgZm9y
IChhdXRvJiBjZWxsIDogZ3JpZC5jZWxscygpKSB7Ci0gICAgICAgIGF1dG8mIGNlbGxCb3ggPSBj
ZWxsLT5ib3goKTsKLSAgICAgICAgYXV0byYgY2VsbEJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0
YXRlKCkuYm94R2VvbWV0cnkoY2VsbEJveCk7Ci0gICAgICAgIGF1dG8mIHNlY3Rpb24gPSByb3dM
aXN0W2NlbGwtPnN0YXJ0Um93KCldLmJveCgpLnBhcmVudCgpOwotICAgICAgICBpZiAoJnNlY3Rp
b24gIT0gY3VycmVudFNlY3Rpb24pIHsKLSAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uID0gJnNl
Y3Rpb247Ci0gICAgICAgICAgICAvLyBXaGlsZSB0aGUgZ3JpZCBpcyBhIGNvbnRpbnVvdXMgZmxv
dyBvZiByb3dzLCBpbiB0aGUgZGlzcGxheSB0cmVlIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZWly
IHNlY3Rpb25zLgotICAgICAgICAgICAgc2VjdGlvbk9mZnNldCA9IHJvd0xpc3RbY2VsbC0+c3Rh
cnRSb3coKV0ubG9naWNhbFRvcCgpOwotICAgICAgICB9Ci0gICAgICAgIGNlbGxCb3hHZW9tZXRy
eS5zZXRMb2dpY2FsVG9wKHJvd0xpc3RbY2VsbC0+c3RhcnRSb3coKV0ubG9naWNhbFRvcCgpIC0g
c2VjdGlvbk9mZnNldCk7Ci0gICAgICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRMb2dpY2FsTGVmdChj
b2x1bW5MaXN0W2NlbGwtPnN0YXJ0Q29sdW1uKCldLmxvZ2ljYWxMZWZ0KCkpOwotICAgICAgICBh
dXRvIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UgPSByb3dMaXN0W2NlbGwtPnN0YXJ0Um93KCldLmxv
Z2ljYWxIZWlnaHQoKTsKLSAgICAgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSBjZWxsLT5zdGFy
dFJvdygpICsgMTsgcm93SW5kZXggPCBjZWxsLT5lbmRSb3coKTsgKytyb3dJbmRleCkKLSAgICAg
ICAgICAgIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UgKz0gcm93TGlzdFtyb3dJbmRleF0ubG9naWNh
bEhlaWdodCgpOwotICAgICAgICBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlICs9IChjZWxsLT5yb3dT
cGFuKCkgLSAxKSAqIGdyaWQudmVydGljYWxTcGFjaW5nKCk7Ci0gICAgICAgIGxheW91dENlbGwo
KmNlbGwsIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSwgYXZhaWxhYmxlVmVydGljYWxTcGFjZSk7
Ci0gICAgICAgIC8vIEZJWE1FOiBGaW5kIG91dCBpZiBpdCBpcyBvayB0byB1c2UgdGhlIHJlZ3Vs
YXIgcGFkZGluZyBoZXJlIHRvIGFsaWduIHRoZSBjb250ZW50IGJveCBpbnNpZGUgYSB0YWxsIGNl
bGwgb3Igd2UgbmVlZCB0byAKLSAgICAgICAgLy8gdXNlIHNvbWUga2luZCBvZiBpbnRyaW5zaWMg
cGFkZGluZyBzaW1pbGFyIHRvIFJlbmRlclRhYmxlQ2VsbC4KLSAgICAgICAgYXV0byBwYWRkaW5n
VG9wID0gY2VsbEJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKExheW91dFVuaXQgeyB9
KTsKLSAgICAgICAgYXV0byBwYWRkaW5nQm90dG9tID0gY2VsbEJveEdlb21ldHJ5LnBhZGRpbmdC
b3R0b20oKS52YWx1ZU9yKExheW91dFVuaXQgeyB9KTsKLSAgICAgICAgYXV0byBpbnRyaW5zaWNQ
YWRkaW5nVG9wID0gTGF5b3V0VW5pdCB7IH07Ci0gICAgICAgIGF1dG8gaW50cmluc2ljUGFkZGlu
Z0JvdHRvbSA9IExheW91dFVuaXQgeyB9OwotCi0gICAgICAgIHN3aXRjaCAoY2VsbEJveC5zdHls
ZSgpLnZlcnRpY2FsQWxpZ24oKSkgewotICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Ok1pZGRs
ZTogewotICAgICAgICAgICAgYXV0byBpbnRyaW5zaWNWZXJ0aWNhbFBhZGRpbmcgPSBzdGQ6Om1h
eCgwX2x1LCBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlIC0gY2VsbEJveEdlb21ldHJ5LnZlcnRpY2Fs
TWFyZ2luQm9yZGVyQW5kUGFkZGluZygpIC0gY2VsbEJveEdlb21ldHJ5LmNvbnRlbnRCb3hIZWln
aHQoKSk7Ci0gICAgICAgICAgICBpbnRyaW5zaWNQYWRkaW5nVG9wID0gaW50cmluc2ljVmVydGlj
YWxQYWRkaW5nIC8gMjsKLSAgICAgICAgICAgIGludHJpbnNpY1BhZGRpbmdCb3R0b20gPSBpbnRy
aW5zaWNWZXJ0aWNhbFBhZGRpbmcgLyAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0K
LSAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZTogewotICAgICAgICAgICAgYXV0
byByb3dCYXNlbGluZSA9IExheW91dFVuaXQgeyByb3dMaXN0W2NlbGwtPnN0YXJ0Um93KCldLmJh
c2VsaW5lKCkgfTsKLSAgICAgICAgICAgIGF1dG8gY2VsbEJhc2VsaW5lID0gTGF5b3V0VW5pdCB7
IGNlbGwtPmJhc2VsaW5lKCkgfTsKLSAgICAgICAgICAgIGludHJpbnNpY1BhZGRpbmdUb3AgPSBz
dGQ6Om1heCgwX2x1LCByb3dCYXNlbGluZSAtIGNlbGxCYXNlbGluZSAtIGNlbGxCb3hHZW9tZXRy
eS5ib3JkZXJUb3AoKSk7Ci0gICAgICAgICAgICBpbnRyaW5zaWNQYWRkaW5nQm90dG9tID0gc3Rk
OjptYXgoMF9sdSwgYXZhaWxhYmxlVmVydGljYWxTcGFjZSAtIGNlbGxCb3hHZW9tZXRyeS52ZXJ0
aWNhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKSAtIGludHJpbnNpY1BhZGRpbmdUb3AgLSBjZWxs
Qm94R2VvbWV0cnkuY29udGVudEJveEhlaWdodCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVO
VEVEX1lFVCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlu
dHJpbnNpY1BhZGRpbmdUb3AgJiYgY2VsbEJveC5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkg
ewotICAgICAgICAgICAgYXV0byBhZGp1c3RDZWxsQ29udGVudFdpdGhJbnN0cmluc2ljUGFkZGlu
Z0JlZm9yZSA9IFsmXSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hpbGQgYm94ZXMgKGFuZCBydW5z
KSBhcmUgYWx3YXlzIGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgY29udGFpbmluZyBi
bG9jaydzIGJvcmRlciBib3guCi0gICAgICAgICAgICAgICAgLy8gVGhlIGNvbnRlbnQgYm94ICh3
aGVyZSB0aGUgY2hpbGQgY29udGVudCBsaXZlcykgaXMgaW5zaWRlIHRoZSBwYWRkaW5nIGJveCwg
d2hpY2ggaXMgaW5zaWRlIHRoZSBib3JkZXIgYm94LgotICAgICAgICAgICAgICAgIC8vIEluIG9y
ZGVyIHRvIGNvbXB1dGUgdGhlIGNoaWxkIGJveCB0b3AvbGVmdCBwb3NpdGlvbiwgd2UgbmVlZCB0
byBrbm93IGJvdGggdGhlIHBhZGRpbmcgYW5kIHRoZSBib3JkZXIgb2Zmc2V0cy4gIAotICAgICAg
ICAgICAgICAgIC8vIE5vcm1hbGx5IGJ5IHRoZSB0aW1lIHdlIHN0YXJ0IHBvc2l0aW9uaW5nIHRo
ZSBjaGlsZCBjb250ZW50LCB3ZSBhbHJlYWR5IGhhdmUgY29tcHV0ZWQgYm9yZGVycyBhbmQgcGFk
ZGluZyBmb3IgdGhlIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBp
cyBkaWZmZXJlbnQgd2l0aCB0YWJsZSBjZWxscyB3aGVyZSB0aGUgZmluYWwgcGFkZGluZyBvZmZz
ZXQgZGVwZW5kcyBvbiB0aGUgY29udGVudCBoZWlnaHQgYXMgd2UgdXNlCi0gICAgICAgICAgICAg
ICAgLy8gdGhlIHBhZGRpbmcgYm94IHRvIHZlcnRpY2FsbHkgYWxpZ24gdGhlIHRhYmxlIGNlbGwg
Y29udGVudC4KLSAgICAgICAgICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSBsYXlvdXRT
dGF0ZSgpLmVzdGFibGlzaGVkRm9ybWF0dGluZ1N0YXRlKGNlbGxCb3gpOwotICAgICAgICAgICAg
ICAgIGZvciAoYXV0byogY2hpbGQgPSBjZWxsQm94LmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxk
KCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0SW5GbG93T3JGbG9hdGluZ1NpYmxpbmcoKSkg
ewotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzSW5saW5lVGV4dEJveCgpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1h
dHRpbmdTdGF0ZS5ib3hHZW9tZXRyeSgqY2hpbGQpLm1vdmVWZXJ0aWNhbGx5KGludHJpbnNpY1Bh
ZGRpbmdUb3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2VsbEJv
eC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgYXV0byYgaW5saW5lRm9ybWF0dGluZ1N0YXRlZSA9IGxheW91dFN0YXRlKCkuZXN0YWJs
aXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUoY2VsbEJveCk7Ci0gICAgICAgICAgICAgICAgICAg
IGZvciAoYXV0byYgcnVuIDogaW5saW5lRm9ybWF0dGluZ1N0YXRlZS5saW5lUnVucygpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgcnVuLm1vdmVWZXJ0aWNhbGx5KGludHJpbnNpY1BhZGRpbmdU
b3ApOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGxpbmUgOiBpbmxpbmVGb3JtYXR0
aW5nU3RhdGVlLmxpbmVzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLm1vdmVWZXJ0
aWNhbGx5KGludHJpbnNpY1BhZGRpbmdUb3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIH07Ci0gICAgICAgICAgICBhZGp1c3RDZWxsQ29udGVudFdpdGhJbnN0cmluc2ljUGFkZGlu
Z0JlZm9yZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRWZXJ0aWNh
bFBhZGRpbmcoeyBwYWRkaW5nVG9wICsgaW50cmluc2ljUGFkZGluZ1RvcCwgcGFkZGluZ0JvdHRv
bSArIGludHJpbnNpY1BhZGRpbmdCb3R0b20gfSk7Ci0gICAgfQotfQotCi12b2lkIFRhYmxlRm9y
bWF0dGluZ0NvbnRleHQ6OnNldFVzZWRHZW9tZXRyeUZvclJvd3MoTGF5b3V0VW5pdCBhdmFpbGFi
bGVIb3Jpem9udGFsU3BhY2UpCi17Ci0gICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZSgp
LnRhYmxlR3JpZCgpOwotICAgIGF1dG8mIHJvd3MgPSBncmlkLnJvd3MoKS5saXN0KCk7Ci0KLSAg
ICBhdXRvIHJvd0xvZ2ljYWxUb3AgPSBncmlkLnZlcnRpY2FsU3BhY2luZygpOwotICAgIGNvbnN0
IENvbnRhaW5lckJveCogcHJldmlvdXNSb3cgPSBudWxscHRyOwotICAgIGZvciAoc2l6ZV90IHJv
d0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkgewotICAgICAg
ICBhdXRvJiByb3cgPSByb3dzW3Jvd0luZGV4XTsKLSAgICAgICAgYXV0byYgcm93Qm94ID0gcm93
LmJveCgpOwotICAgICAgICBhdXRvJiByb3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgp
LmJveEdlb21ldHJ5KHJvd0JveCk7Ci0KLSAgICAgICAgcm93Qm94R2VvbWV0cnkuc2V0UGFkZGlu
ZyhnZW9tZXRyeSgpLmNvbXB1dGVkUGFkZGluZyhyb3dCb3gsIGF2YWlsYWJsZUhvcml6b250YWxT
cGFjZSkpOwotICAgICAgICAvLyBJbnRlcm5hbCB0YWJsZSBlbGVtZW50cyBkbyBub3QgaGF2ZSBt
YXJnaW5zLgotICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgfSk7
Ci0gICAgICAgIHJvd0JveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7Ci0KLSAgICAg
ICAgYXV0byBjb21wdXRlZFJvd0JvcmRlciA9IFsmXSB7Ci0gICAgICAgICAgICBhdXRvIGJvcmRl
ciA9IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIocm93Qm94KTsKLSAgICAgICAgICAgIGlmICgh
Z3JpZC5jb2xsYXBzZWRCb3JkZXIoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYm9yZGVyOwot
ICAgICAgICAgICAgLy8gQm9yZGVyIGNvbGxhcHNpbmcgZGVsZWdhdGVzIGJvcmRlcnMgdG8gdGFi
bGUvY2VsbHMuCi0gICAgICAgICAgICBib3JkZXIuaG9yaXpvbnRhbCA9IHsgfTsKLSAgICAgICAg
ICAgIGlmICghcm93SW5kZXgpCi0gICAgICAgICAgICAgICAgYm9yZGVyLnZlcnRpY2FsLnRvcCA9
IHsgfTsKLSAgICAgICAgICAgIGlmIChyb3dJbmRleCA9PSByb3dzLnNpemUoKSAtIDEpCi0gICAg
ICAgICAgICAgICAgYm9yZGVyLnZlcnRpY2FsLmJvdHRvbSA9IHsgfTsKLSAgICAgICAgICAgIHJl
dHVybiBib3JkZXI7Ci0gICAgICAgIH0oKTsKLSAgICAgICAgaWYgKGNvbXB1dGVkUm93Qm9yZGVy
LmhlaWdodCgpID4gcm93LmxvZ2ljYWxIZWlnaHQoKSkgewotICAgICAgICAgICAgLy8gRklYTUU6
IFRoaXMgaXMgYW4gb2RkIHF1aXJrIHdoZW4gdGhlIHJvdyBib3JkZXIgb3ZlcmZsb3dzIHRoZSBy
b3cuCi0gICAgICAgICAgICAvLyBXZSBkb24ndCBwYWludCByb3cgYm9yZGVycyBzbyBpdCBkb2Vz
IG5vdCBtYXR0ZXIgdG9vIG11Y2gsIGJ1dCBpZiB3ZSBkb24ndAotICAgICAgICAgICAgLy8gc2V0
IHRoaXMgZmFrZSBib3JkZXIgdmFsdWUsIHRoYW4gd2UgZWl0aGVyIGVuZCB1cCB3aXRoIGEgbmVn
YXRpdmUgY29udGVudCBib3gKLSAgICAgICAgICAgIC8vIG9yIHdpdGggYSB3aWRlIGZyYW1lIGJv
eC4KLSAgICAgICAgICAgIC8vIElmIGl0IGhhcHBlbnMgdG8gY2F1c2UgaXNzdWVzIGluIHRoZSBk
aXNwbGF5IHRyZWUsIHdlIGNvdWxkIGFsc28gY29uc2lkZXIKLSAgICAgICAgICAgIC8vIGEgc3Bl
Y2lhbCBmcmFtZSBib3ggb3ZlcnJpZGUsIHdoZXJlIHBhZGRpbmcgYm94ICsgYm9yZGVyICE9IGZy
YW1lIGJveC4KLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLnZlcnRpY2FsLnRvcCA9IHsg
fTsKLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLnZlcnRpY2FsLmJvdHRvbSA9IHsgfTsK
LSAgICAgICAgfQotICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KHJv
dy5sb2dpY2FsSGVpZ2h0KCkgLSBjb21wdXRlZFJvd0JvcmRlci5oZWlnaHQoKSk7Ci0KLSAgICAg
ICAgYXV0byByb3dMb2dpY2FsV2lkdGggPSBncmlkLmNvbHVtbnMoKS5sb2dpY2FsV2lkdGgoKSAr
IDIgKiBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7Ci0gICAgICAgIGlmIChjb21wdXRlZFJvd0Jv
cmRlci53aWR0aCgpID4gcm93TG9naWNhbFdpZHRoKSB7Ci0gICAgICAgICAgICAvLyBTZWUgY29t
bWVudCBhYm92ZS4KLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLmhvcml6b250YWwubGVm
dCA9IHsgfTsKLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLmhvcml6b250YWwucmlnaHQg
PSB7IH07Ci0gICAgICAgIH0KLSAgICAgICAgcm93Qm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdp
ZHRoKHJvd0xvZ2ljYWxXaWR0aCAtIGNvbXB1dGVkUm93Qm9yZGVyLndpZHRoKCkpOwotICAgICAg
ICByb3dCb3hHZW9tZXRyeS5zZXRCb3JkZXIoY29tcHV0ZWRSb3dCb3JkZXIpOwotCi0gICAgICAg
IGlmIChwcmV2aW91c1JvdyAmJiAmcHJldmlvdXNSb3ctPnBhcmVudCgpICE9ICZyb3dCb3gucGFy
ZW50KCkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgcm93IGlzIGluIGEgZGlmZmVyZW50IHNlY3Rp
b24uCi0gICAgICAgICAgICByb3dMb2dpY2FsVG9wID0geyB9OwotICAgICAgICB9Ci0gICAgICAg
IHJvd0JveEdlb21ldHJ5LnNldExvZ2ljYWxUb3Aocm93TG9naWNhbFRvcCk7Ci0gICAgICAgIHJv
d0JveEdlb21ldHJ5LnNldExvZ2ljYWxMZWZ0KHsgfSk7Ci0KLSAgICAgICAgcm93TG9naWNhbFRv
cCArPSByb3cubG9naWNhbEhlaWdodCgpICsgZ3JpZC52ZXJ0aWNhbFNwYWNpbmcoKTsKLSAgICAg
ICAgcHJldmlvdXNSb3cgPSAmcm93Qm94OwotICAgIH0KLQotICAgIGF1dG8mIGNvbHVtbnMgPSBn
cmlkLmNvbHVtbnMoKTsKLSAgICBWZWN0b3I8SW5saW5lTGF5b3V0VW5pdD4gcm93QmFzZWxpbmVz
KHJvd3Muc2l6ZSgpLCAwKTsKLSAgICAvLyBOb3cgdGhhdCBjZWxscyBhcmUgbGFpZCBvdXQsIGxl
dCdzIGNvbXB1dGUgdGhlIHJvdyBiYXNlbGluZXMuCi0gICAgZm9yIChzaXplX3Qgcm93SW5kZXgg
PSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7Ci0gICAgICAgIGZvciAo
c2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1bW5zLnNpemUoKTsgKytj
b2x1bW5JbmRleCkgewotICAgICAgICAgICAgYXV0byYgc2xvdCA9ICpncmlkLnNsb3QoeyBjb2x1
bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICBpZiAoc2xvdC5pc1Jvd1NwYW5uZWQo
KSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChzbG90Lmhhc1Jv
d1NwYW4oKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGF1dG8mIGNl
bGwgPSBzbG90LmNlbGwoKTsKLSAgICAgICAgICAgIHJvd0Jhc2VsaW5lc1tyb3dJbmRleF0gPSBz
dGQ6Om1heChyb3dCYXNlbGluZXNbcm93SW5kZXhdLCBjZWxsLmJhc2VsaW5lKCkpOwotICAgICAg
ICB9Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dz
LnNpemUoKTsgKytyb3dJbmRleCkKLSAgICAgICAgcm93c1tyb3dJbmRleF0uc2V0QmFzZWxpbmUo
cm93QmFzZWxpbmVzW3Jvd0luZGV4XSk7Ci19Ci0KLXZvaWQgVGFibGVGb3JtYXR0aW5nQ29udGV4
dDo6c2V0VXNlZEdlb21ldHJ5Rm9yU2VjdGlvbnMoY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dD
b250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBhdXRvJiBncmlkID0gZm9ybWF0dGluZ1N0YXRl
KCkudGFibGVHcmlkKCk7Ci0gICAgYXV0byYgdGFibGVCb3ggPSByb290KCk7Ci0gICAgYXV0byBz
ZWN0aW9uV2lkdGggPSBncmlkLmNvbHVtbnMoKS5sb2dpY2FsV2lkdGgoKSArIDIgKiBncmlkLmhv
cml6b250YWxTcGFjaW5nKCk7Ci0gICAgYXV0byBsb2dpY2FsVG9wID0gY29uc3RyYWludHMudmVy
dGljYWwubG9naWNhbFRvcDsKLSAgICBhdXRvIHZlcnRpY2FsU3BhY2luZyA9IGdyaWQudmVydGlj
YWxTcGFjaW5nKCk7Ci0gICAgYXV0byBwYWRkaW5nQmVmb3JlID0gT3B0aW9uYWw8TGF5b3V0VW5p
dD4geyB2ZXJ0aWNhbFNwYWNpbmcgfTsKLSAgICBhdXRvIHBhZGRpbmdBZnRlciA9IHZlcnRpY2Fs
U3BhY2luZzsKLSAgICBmb3IgKGF1dG8mIHNlY3Rpb25Cb3ggOiBjaGlsZHJlbk9mVHlwZTxDb250
YWluZXJCb3g+KHRhYmxlQm94KSkgewotICAgICAgICBhdXRvJiBzZWN0aW9uQm94R2VvbWV0cnkg
PSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShzZWN0aW9uQm94KTsKLSAgICAgICAgLy8g
U2VjdGlvbiBib3JkZXJzIGFyZSBlaXRoZXIgY29sbGFwc2VkIG9yIGlnbm9yZWQuCi0gICAgICAg
IHNlY3Rpb25Cb3hHZW9tZXRyeS5zZXRCb3JkZXIoeyB9KTsKLSAgICAgICAgLy8gVXNlIGZha2Ug
dmVydGljYWwgcGFkZGluZyB0byBzcGFjZSBvdXQgdGhlIHNlY3Rpb25zLgotICAgICAgICBzZWN0
aW9uQm94R2VvbWV0cnkuc2V0UGFkZGluZyhFZGdlcyB7IHsgfSwgeyBwYWRkaW5nQmVmb3JlLnZh
bHVlT3IoMF9sdSksIHBhZGRpbmdBZnRlciB9IH0pOwotICAgICAgICBwYWRkaW5nQmVmb3JlID0g
V1RGOjpudWxsb3B0OwotICAgICAgICAvLyBJbnRlcm5hbCB0YWJsZSBlbGVtZW50cyBkbyBub3Qg
aGF2ZSBtYXJnaW5zLgotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1h
cmdpbih7IH0pOwotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4o
eyB9KTsKLQotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKHNl
Y3Rpb25XaWR0aCk7Ci0gICAgICAgIGF1dG8gc2VjdGlvbkNvbnRlbnRIZWlnaHQgPSBMYXlvdXRV
bml0IHsgfTsKLSAgICAgICAgc2l6ZV90IHJvd0NvdW50ID0gMDsKLSAgICAgICAgZm9yIChhdXRv
JiByb3dCb3ggOiBjaGlsZHJlbk9mVHlwZTxDb250YWluZXJCb3g+KHNlY3Rpb25Cb3gpKSB7Ci0g
ICAgICAgICAgICBzZWN0aW9uQ29udGVudEhlaWdodCArPSBnZW9tZXRyeUZvckJveChyb3dCb3gp
LmJvcmRlckJveEhlaWdodCgpOwotICAgICAgICAgICAgKytyb3dDb3VudDsKLSAgICAgICAgfQot
ICAgICAgICBzZWN0aW9uQ29udGVudEhlaWdodCArPSB2ZXJ0aWNhbFNwYWNpbmcgKiAocm93Q291
bnQgLSAxKTsKLSAgICAgICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQo
c2VjdGlvbkNvbnRlbnRIZWlnaHQpOwotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0TG9n
aWNhbExlZnQoY29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dpY2FsTGVmdCk7Ci0gICAgICAgIHNl
Y3Rpb25Cb3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKGxvZ2ljYWxUb3ApOwotCi0gICAgICAgIGxv
Z2ljYWxUb3AgKz0gc2VjdGlvbkJveEdlb21ldHJ5LmJvcmRlckJveEhlaWdodCgpOwotICAgIH0K
LX0KLQotdm9pZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRDZWxsKGNvbnN0IFRhYmxl
R3JpZDo6Q2VsbCYgY2VsbCwgTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UsIE9w
dGlvbmFsPExheW91dFVuaXQ+IHVzZWRDZWxsSGVpZ2h0KQotewotICAgIEFTU0VSVChjZWxsLmJv
eCgpLmVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpKTsKLQotICAgIGF1dG8mIGdy
aWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsKLSAgICBhdXRvJiBjZWxsQm94ID0g
Y2VsbC5ib3goKTsKLSAgICBhdXRvJiBjZWxsQm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUo
KS5ib3hHZW9tZXRyeShjZWxsQm94KTsKLQotICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRCb3JkZXIo
Z2VvbWV0cnkoKS5jb21wdXRlZENlbGxCb3JkZXIoY2VsbCkpOwotICAgIGNlbGxCb3hHZW9tZXRy
eS5zZXRQYWRkaW5nKGdlb21ldHJ5KCkuY29tcHV0ZWRQYWRkaW5nKGNlbGxCb3gsIGF2YWlsYWJs
ZUhvcml6b250YWxTcGFjZSkpOwotICAgIC8vIEludGVybmFsIHRhYmxlIGVsZW1lbnRzIGRvIG5v
dCBoYXZlIG1hcmdpbnMuCi0gICAgY2VsbEJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4o
eyB9KTsKLSAgICBjZWxsQm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyB9KTsKLQotICAg
IGF1dG8gYXZhaWxhYmxlU3BhY2VGb3JDb250ZW50ID0gWyZdIHsKLSAgICAgICAgYXV0byYgY29s
dW1uTGlzdCA9IGdyaWQuY29sdW1ucygpLmxpc3QoKTsKLSAgICAgICAgYXV0byBsb2dpY2FsV2lk
dGggPSBMYXlvdXRVbml0IHsgfTsKLSAgICAgICAgZm9yIChhdXRvIGNvbHVtbkluZGV4ID0gY2Vs
bC5zdGFydENvbHVtbigpOyBjb2x1bW5JbmRleCA8IGNlbGwuZW5kQ29sdW1uKCk7ICsrY29sdW1u
SW5kZXgpCi0gICAgICAgICAgICBsb2dpY2FsV2lkdGggKz0gY29sdW1uTGlzdC5hdChjb2x1bW5J
bmRleCkubG9naWNhbFdpZHRoKCk7Ci0gICAgICAgIC8vIE5vIGNvbHVtbiBzcGFjaW5nIHdoZW4g
c3Bhbm5pbmcuCi0gICAgICAgIGxvZ2ljYWxXaWR0aCArPSAoY2VsbC5jb2x1bW5TcGFuKCkgLSAx
KSAqIGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKLSAgICAgICAgcmV0dXJuIGxvZ2ljYWxXaWR0
aCAtIGNlbGxCb3hHZW9tZXRyeS5ob3Jpem9udGFsTWFyZ2luQm9yZGVyQW5kUGFkZGluZygpOwot
ICAgIH0oKTsKLSAgICBjZWxsQm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGF2YWlsYWJs
ZVNwYWNlRm9yQ29udGVudCk7Ci0KLSAgICBpZiAoY2VsbEJveC5oYXNJbkZsb3dPckZsb2F0aW5n
Q2hpbGQoKSkgewotICAgICAgICBhdXRvIGNvbnN0cmFpbnRzRm9yQ2VsbENvbnRlbnQgPSBnZW9t
ZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjZWxsQm94KTsKLSAgICAgICAgY29u
c3RyYWludHNGb3JDZWxsQ29udGVudC52ZXJ0aWNhbC5sb2dpY2FsSGVpZ2h0ID0gdXNlZENlbGxI
ZWlnaHQ7Ci0gICAgICAgIGF1dG8gaW52YWxpZGF0aW9uU3RhdGUgPSBJbnZhbGlkYXRpb25TdGF0
ZSB7IH07Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBwYXJ0IG9m
IHRoZSBpbnZhbGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgd2hlbiB3ZSByZS1sYXlvdXQgdGhl
IGNlbGwKLSAgICAgICAgLy8gbXVsdGlwbGUgdGltZXMgYXMgcGFydCBvZiB0aGUgbXVsdGktcGFz
cyB0YWJsZSBhbGdvcml0aG0uCi0gICAgICAgIGF1dG8mIGZsb2F0aW5nU3RhdGVGb3JDZWxsQ29u
dGVudCA9IGxheW91dFN0YXRlKCkuZW5zdXJlQmxvY2tGb3JtYXR0aW5nU3RhdGUoY2VsbEJveCku
ZmxvYXRpbmdTdGF0ZSgpOwotICAgICAgICBmbG9hdGluZ1N0YXRlRm9yQ2VsbENvbnRlbnQuY2xl
YXIoKTsKLSAgICAgICAgTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY2Vs
bEJveCwgbGF5b3V0U3RhdGUoKSktPmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3Rh
dGUsIGNvbnN0cmFpbnRzRm9yQ2VsbENvbnRlbnQpOwotICAgIH0KLSAgICBjZWxsQm94R2VvbWV0
cnkuc2V0Q29udGVudEJveEhlaWdodChnZW9tZXRyeSgpLmNlbGxIZWlnaChjZWxsQm94KSk7Ci19
Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIFRhYmxlRm9y
bWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpCi17Ci0g
ICAgQVNTRVJUKCFyb290KCkuaXNTaXplQ29udGFpbm1lbnRCb3goKSk7Ci0gICAgLy8gVGFibGVz
IGhhdmUgYSBzbGlnaHR5IGRpZmZlcmVudCBjb25jZXB0IG9mIHNocmluayB0byBmaXQuIEl0J3Mg
cmVhbGx5IG9ubHkgZGlmZmVyZW50IHdpdGggbm9uLWF1dG8gIndpZHRoIiB2YWx1ZXMsIHdoZXJl
Ci0gICAgLy8gYSBnZW5lcmljIHNocmluay10byBmaXQgYmxvY2sgbGV2ZWwgYm94IGxpa2UgYSBm
bG9hdCBib3ggd291bGQgYmUganVzdCBzaXplZCB0byB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgIndp
ZHRoIiwgdGFibGVzCi0gICAgLy8gY2FuIGFjdHVhbGx5IGJlIHN0cmVjaGVkIHdheSBvdmVyLgot
ICAgIGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsKLSAgICBpZiAo
YXV0byBjb21wdXRlZFdpZHRoQ29uc3RyYWludHMgPSBncmlkLndpZHRoQ29uc3RyYWludHMoKSkK
LSAgICAgICAgcmV0dXJuICpjb21wdXRlZFdpZHRoQ29uc3RyYWludHM7Ci0KLSAgICAvLyBDb21w
dXRlIHRoZSBtaW5pbXVtL21heGltdW0gd2lkdGggb2YgZWFjaCBjb2x1bW4uCi0gICAgYXV0byBj
b21wdXRlZFdpZHRoQ29uc3RyYWludHMgPSBjb21wdXRlZFByZWZlcnJlZFdpZHRoRm9yQ29sdW1u
cygpOwotICAgIGdyaWQuc2V0V2lkdGhDb25zdHJhaW50cyhjb21wdXRlZFdpZHRoQ29uc3RyYWlu
dHMpOwotICAgIHJldHVybiBjb21wdXRlZFdpZHRoQ29uc3RyYWludHM7Ci19Ci0KLVVuaXF1ZVJl
ZjxUYWJsZUdyaWQ+IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmVuc3VyZVRhYmxlR3JpZChjb25z
dCBDb250YWluZXJCb3gmIHRhYmxlQm94KQotewotICAgIGF1dG8gdGFibGVHcmlkID0gbWFrZVVu
aXF1ZVJlZjxUYWJsZUdyaWQ+KCk7Ci0gICAgYXV0byYgdGFibGVTdHlsZSA9IHRhYmxlQm94LnN0
eWxlKCk7Ci0gICAgYXV0byBzaG91bGRBcHBseUJvcmRlclNwYWNpbmcgPSB0YWJsZVN0eWxlLmJv
cmRlckNvbGxhcHNlKCkgPT0gQm9yZGVyQ29sbGFwc2U6OlNlcGFyYXRlOwotICAgIHRhYmxlR3Jp
ZC0+c2V0SG9yaXpvbnRhbFNwYWNpbmcoTGF5b3V0VW5pdCB7IHNob3VsZEFwcGx5Qm9yZGVyU3Bh
Y2luZyA/IHRhYmxlU3R5bGUuaG9yaXpvbnRhbEJvcmRlclNwYWNpbmcoKSA6IDAgfSk7Ci0gICAg
dGFibGVHcmlkLT5zZXRWZXJ0aWNhbFNwYWNpbmcoTGF5b3V0VW5pdCB7IHNob3VsZEFwcGx5Qm9y
ZGVyU3BhY2luZyA/IHRhYmxlU3R5bGUudmVydGljYWxCb3JkZXJTcGFjaW5nKCkgOiAwIH0pOwot
Ci0gICAgYXV0byogZmlyc3RDaGlsZCA9IHRhYmxlQm94LmZpcnN0Q2hpbGQoKTsKLSAgICBpZiAo
IWZpcnN0Q2hpbGQpIHsKLSAgICAgICAgLy8gVGhlIHJhcmUgY2FzZSBvZiBlbXB0eSB0YWJsZS4K
LSAgICAgICAgcmV0dXJuIHRhYmxlR3JpZDsKLSAgICB9Ci0KLSAgICBjb25zdCBCb3gqIHRhYmxl
Q2FwdGlvbiA9IG51bGxwdHI7Ci0gICAgY29uc3QgQm94KiBjb2xncm91cCA9IG51bGxwdHI7Ci0g
ICAgLy8gVGFibGUgY2FwdGlvbiBpcyBhbiBvcHRpb25hbCBlbGVtZW50OyBpZiB1c2VkLCBpdCBp
cyBhbHdheXMgdGhlIGZpcnN0IGNoaWxkIG9mIGEgPHRhYmxlPi4KLSAgICBpZiAoZmlyc3RDaGls
ZC0+aXNUYWJsZUNhcHRpb24oKSkKLSAgICAgICAgdGFibGVDYXB0aW9uID0gZmlyc3RDaGlsZDsK
LSAgICAvLyBUaGUgPGNvbGdyb3VwPiBtdXN0IGFwcGVhciBhZnRlciBhbnkgb3B0aW9uYWwgPGNh
cHRpb24+IGVsZW1lbnQgYnV0IGJlZm9yZSBhbnkgPHRoZWFkPiwgPHRoPiwgPHRib2R5PiwgPHRm
b290PiBhbmQgPHRyPiBlbGVtZW50LgotICAgIGF1dG8qIGNvbGdyb3VwQ2FuZGlkYXRlID0gZmly
c3RDaGlsZDsKLSAgICBpZiAodGFibGVDYXB0aW9uKQotICAgICAgICBjb2xncm91cENhbmRpZGF0
ZSA9IHRhYmxlQ2FwdGlvbi0+bmV4dFNpYmxpbmcoKTsKLSAgICBpZiAoY29sZ3JvdXBDYW5kaWRh
dGUtPmlzVGFibGVDb2x1bW5Hcm91cCgpKQotICAgICAgICBjb2xncm91cCA9IGNvbGdyb3VwQ2Fu
ZGlkYXRlOwotCi0gICAgaWYgKGNvbGdyb3VwKSB7Ci0gICAgICAgIGF1dG8mIGNvbHVtbnMgPSB0
YWJsZUdyaWQtPmNvbHVtbnMoKTsKLSAgICAgICAgZm9yIChhdXRvKiBjb2x1bW4gPSBkb3duY2Fz
dDxDb250YWluZXJCb3g+KCpjb2xncm91cCkuZmlyc3RDaGlsZCgpOyBjb2x1bW47IGNvbHVtbiA9
IGNvbHVtbi0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgQVNTRVJUKGNvbHVtbi0+aXNU
YWJsZUNvbHVtbigpKTsKLSAgICAgICAgICAgIGF1dG8gY29sdW1uU3BhbkNvdW50ID0gY29sdW1u
LT5jb2x1bW5TcGFuKCk7Ci0gICAgICAgICAgICBBU1NFUlQoY29sdW1uU3BhbkNvdW50ID4gMCk7
Ci0gICAgICAgICAgICB3aGlsZSAoY29sdW1uU3BhbkNvdW50LS0pCi0gICAgICAgICAgICAgICAg
Y29sdW1ucy5hZGRDb2x1bW4oZG93bmNhc3Q8Q29udGFpbmVyQm94PigqY29sdW1uKSk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICBhdXRvKiBmaXJzdFNlY3Rpb24gPSBjb2xncm91cCA/IGNvbGdy
b3VwLT5uZXh0U2libGluZygpIDogdGFibGVDYXB0aW9uID8gdGFibGVDYXB0aW9uLT5uZXh0U2li
bGluZygpIDogZmlyc3RDaGlsZDsKLSAgICBmb3IgKGF1dG8qIHNlY3Rpb24gPSBmaXJzdFNlY3Rp
b247IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAg
IEFTU0VSVChzZWN0aW9uLT5pc1RhYmxlSGVhZGVyKCkgfHwgc2VjdGlvbi0+aXNUYWJsZUJvZHko
KSB8fCBzZWN0aW9uLT5pc1RhYmxlRm9vdGVyKCkpOwotICAgICAgICBmb3IgKGF1dG8qIHJvdyA9
IGRvd25jYXN0PENvbnRhaW5lckJveD4oKnNlY3Rpb24pLmZpcnN0Q2hpbGQoKTsgcm93OyByb3cg
PSByb3ctPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIEFTU0VSVChyb3ctPmlzVGFibGVS
b3coKSk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8qIGNlbGwgPSBkb3duY2FzdDxDb250YWluZXJC
b3g+KCpyb3cpLmZpcnN0Q2hpbGQoKTsgY2VsbDsgY2VsbCA9IGNlbGwtPm5leHRTaWJsaW5nKCkp
IHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoY2VsbC0+aXNUYWJsZUNlbGwoKSk7Ci0gICAgICAg
ICAgICAgICAgdGFibGVHcmlkLT5hcHBlbmRDZWxsKGRvd25jYXN0PENvbnRhaW5lckJveD4oKmNl
bGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdGFibGVH
cmlkOwotfQotCi1Gb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBU
YWJsZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlZFByZWZlcnJlZFdpZHRoRm9yQ29sdW1ucygp
Ci17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7
Ci0gICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZS50YWJsZUdyaWQoKTsKLSAgICBBU1NF
UlQoIWdyaWQud2lkdGhDb25zdHJhaW50cygpKTsKLQotICAgIC8vIENvbHVtbiBwcmVmZXJyZWQg
d2lkdGggY29tcHV0YXRpb24gYXMgZm9sbG93czoKLSAgICAvLyAxLiBDb2xsZWN0IGVhY2ggY2Vs
bHMnIHdpZHRoIGNvbnN0cmFpbnRzCi0gICAgLy8gMi4gQ29sbGVjdCBmaXhlZCBjb2x1bW4gd2lk
dGhzIHNldCBieSA8Y29sZ3JvdXA+J3MgYW5kIDxjb2w+cwotICAgIC8vIDMuIEZpbmQgdGhlIG1p
bi9tYXggd2lkdGggZm9yIGVhY2ggY29sdW1ucyB1c2luZyB0aGUgY2VsbCBjb25zdHJhaW50cyBh
bmQgdGhlIDxjb2w+IGZpeGVkIHdpZHRocyBidXQgaWdub3JlIGNvbHVtbiBzcGFucy4KLSAgICAv
LyA0LiBEaXN0cmlidXRlIGNvbHVtbiBzcGFubmluZyBjZWxscyBtaW4vbWF4IHdpZHRocy4KLSAg
ICAvLyA1LiBBZGQgdGhlbSBhbGwgdXAgYW5kIHJldHVybiB0aGUgY29tcHV0ZWQgbWluL21heCB3
aWR0aHMuCi0gICAgZm9yIChhdXRvJiBjZWxsIDogZ3JpZC5jZWxscygpKSB7Ci0gICAgICAgIGF1
dG8mIGNlbGxCb3ggPSBjZWxsLT5ib3goKTsKLSAgICAgICAgQVNTRVJUKGNlbGxCb3guZXN0YWJs
aXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCkpOwotCi0gICAgICAgIGF1dG8gaW50cmluc2lj
V2lkdGggPSBmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChj
ZWxsQm94KTsKLSAgICAgICAgaWYgKCFpbnRyaW5zaWNXaWR0aCkgewotICAgICAgICAgICAgaW50
cmluc2ljV2lkdGggPSBnZW9tZXRyeSgpLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JDZWxs
KCpjZWxsKTsKLSAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzRm9yQm94KGNlbGxCb3gsICppbnRyaW5zaWNXaWR0aCk7Ci0gICAgICAgIH0KLSAg
ICAgICAgLy8gU3Bhbm5lciBjZWxscyBwdXQgdGhlaXIgaW50cmluc2ljIHdpZHRocyBvbiB0aGUg
aW5pdGlhbCBzbG90cy4KLSAgICAgICAgZ3JpZC5zbG90KGNlbGwtPnBvc2l0aW9uKCkpLT5zZXRX
aWR0aENvbnN0cmFpbnRzKCppbnRyaW5zaWNXaWR0aCk7Ci0gICAgfQotCi0gICAgLy8gMi4gQ29s
bGVjdCB0aGUgZml4ZWQgd2lkdGggPGNvbD5zLgotICAgIGF1dG8mIGNvbHVtbkxpc3QgPSBncmlk
LmNvbHVtbnMoKS5saXN0KCk7Ci0gICAgVmVjdG9yPE9wdGlvbmFsPExheW91dFVuaXQ+PiBmaXhl
ZFdpZHRoQ29sdW1uczsKLSAgICBmb3IgKGF1dG8mIGNvbHVtbiA6IGNvbHVtbkxpc3QpIHsKLSAg
ICAgICAgYXV0byBmaXhlZFdpZHRoID0gWyZdICgpIC0+IE9wdGlvbmFsPExheW91dFVuaXQ+IHsK
LSAgICAgICAgICAgIGF1dG8qIGNvbHVtbkJveCA9IGNvbHVtbi5ib3goKTsKLSAgICAgICAgICAg
IGlmICghY29sdW1uQm94KSB7Ci0gICAgICAgICAgICAgICAgLy8gQW5veW5tb3VzIGNvbHVtbnMg
ZG9uJ3QgaGF2ZSBhc3NvY2lhdGVkIGxheW91dCBib3hlcyBhbmQgY2FuJ3QgaGF2ZSBmaXhlZCBj
b2wgc2l6ZS4KLSAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgaWYgKGF1dG8gd2lkdGggPSBjb2x1bW5Cb3gtPmNvbHVtbldpZHRoKCkpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIHdpZHRoOwotICAgICAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCku
Y29tcHV0ZWRDb2x1bW5XaWR0aCgqY29sdW1uQm94KTsKLSAgICAgICAgfTsKLSAgICAgICAgZml4
ZWRXaWR0aENvbHVtbnMuYXBwZW5kKGZpeGVkV2lkdGgoKSk7Ci0gICAgfQotCi0gICAgVmVjdG9y
PEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzPiBjb2x1bW5JbnRy
aW5zaWNXaWR0aHMoY29sdW1uTGlzdC5zaXplKCkpOwotICAgIC8vIDMuIENvbGxlY3QgaGUgbWlu
L21heCB3aWR0aCBmb3IgZWFjaCBjb2x1bW4gYnV0IGlnbm9yZSBjb2x1bW4gc3BhbnMgZm9yIG5v
dy4KLSAgICBWZWN0b3I8U2xvdFBvc2l0aW9uPiBzcGFubmluZ0NlbGxQb3NpdGlvbkxpc3Q7Ci0g
ICAgc2l6ZV90IG51bWJlck9mQWN0dWFsQ29sdW1ucyA9IDA7Ci0gICAgZm9yIChzaXplX3QgY29s
dW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IGNvbHVtbkxpc3Quc2l6ZSgpOyArK2NvbHVtbklu
ZGV4KSB7Ci0gICAgICAgIGF1dG8gY29sdW1uSGFzTm9uU3Bhbm5lZENlbGwgPSBmYWxzZTsKLSAg
ICAgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IGdyaWQucm93cygpLnNp
emUoKTsgKytyb3dJbmRleCkgewotICAgICAgICAgICAgYXV0byYgc2xvdCA9ICpncmlkLnNsb3Qo
eyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICBpZiAoc2xvdC5pc0NvbHVt
blNwYW5uZWQoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNvbHVt
bkhhc05vblNwYW5uZWRDZWxsID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChzbG90Lmhhc0NvbHVt
blNwYW4oKSkgewotICAgICAgICAgICAgICAgIHNwYW5uaW5nQ2VsbFBvc2l0aW9uTGlzdC5hcHBl
bmQoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIGNvbHVtbkZpeGVkV2lkdGggPSBmaXhl
ZFdpZHRoQ29sdW1uc1tjb2x1bW5JbmRleF07Ci0gICAgICAgICAgICBhdXRvIHdpZHRoQ29uc3Ry
YWludHMgPSAhY29sdW1uRml4ZWRXaWR0aCA/IHNsb3Qud2lkdGhDb25zdHJhaW50cygpIDogRm9y
bWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyAqY29sdW1uRml4ZWRX
aWR0aCwgKmNvbHVtbkZpeGVkV2lkdGggfTsKLSAgICAgICAgICAgIGNvbHVtbkludHJpbnNpY1dp
ZHRoc1tjb2x1bW5JbmRleF0ubWluaW11bSA9IHN0ZDo6bWF4KHdpZHRoQ29uc3RyYWludHMubWlu
aW11bSwgY29sdW1uSW50cmluc2ljV2lkdGhzW2NvbHVtbkluZGV4XS5taW5pbXVtKTsKLSAgICAg
ICAgICAgIGNvbHVtbkludHJpbnNpY1dpZHRoc1tjb2x1bW5JbmRleF0ubWF4aW11bSA9IHN0ZDo6
bWF4KHdpZHRoQ29uc3RyYWludHMubWF4aW11bSwgY29sdW1uSW50cmluc2ljV2lkdGhzW2NvbHVt
bkluZGV4XS5tYXhpbXVtKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29sdW1uSGFzTm9uU3Bh
bm5lZENlbGwpCi0gICAgICAgICAgICArK251bWJlck9mQWN0dWFsQ29sdW1uczsKLSAgICB9Ci0K
LSAgICAvLyA0LiBEaXN0cmlidXRlIHRoZSBzcGFubmluZyBtaW4vbWF4IHdpZHRocy4KLSAgICBm
b3IgKGF1dG8gc3Bhbm5pbmdDZWxsUG9zaXRpb24gOiBzcGFubmluZ0NlbGxQb3NpdGlvbkxpc3Qp
IHsKLSAgICAgICAgYXV0byYgc2xvdCA9ICpncmlkLnNsb3Qoc3Bhbm5pbmdDZWxsUG9zaXRpb24p
OwotICAgICAgICBhdXRvJiBjZWxsID0gc2xvdC5jZWxsKCk7Ci0gICAgICAgIEFTU0VSVChzbG90
Lmhhc0NvbHVtblNwYW4oKSk7Ci0gICAgICAgIGF1dG8gd2lkdGhDb25zdHJhaW50c1RvRGlzdHJp
YnV0ZSA9IHNsb3Qud2lkdGhDb25zdHJhaW50cygpOwotICAgICAgICBmb3IgKHNpemVfdCBjb2x1
bW5TcGFuSW5kZXggPSBjZWxsLnN0YXJ0Q29sdW1uKCk7IGNvbHVtblNwYW5JbmRleCA8IGNlbGwu
ZW5kQ29sdW1uKCk7ICsrY29sdW1uU3BhbkluZGV4KQotICAgICAgICAgICAgd2lkdGhDb25zdHJh
aW50c1RvRGlzdHJpYnV0ZSAtPSBjb2x1bW5JbnRyaW5zaWNXaWR0aHNbY29sdW1uU3BhbkluZGV4
XTsKLSAgICAgICAgLy8gPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogNTBweCI+PHRyPjx0
ZCBjb2xzcGFuPTI+bG9uZyBsb25nIHRleHQ8L3RkPjwvdHI+PHRyPjx0ZD5sbzwvdGQ+PHRkPnh0
PC90ZD48dHI+PC90YWJsZT4KLSAgICAgICAgLy8gW2xvbmcgbG9uZyB0ZXh0XQotICAgICAgICAv
LyBbbG9dICAgICAgICBbeHRdCi0gICAgICAgIC8vIFdoaWxlIGl0IGxvb2tzIGxpa2UgdGhlIHNw
YW5uaW5nIGNlbGwgaGFzIHRvIGRpc3RyaWJ1dGUgYWxsIGl0cyBzcGFubmluZyB3aWR0aCwgdGhl
IGJvcmRlci1zcGFjaW5nIHRha2VzIG1vc3Qgb2YgdGhlIHNwYWNlIGFuZAotICAgICAgICAvLyBu
byBkaXN0cmlidXRpb24gaXMgbmVlZGVkIGF0IGFsbC4KLSAgICAgICAgd2lkdGhDb25zdHJhaW50
c1RvRGlzdHJpYnV0ZSAtPSAoY2VsbC5jb2x1bW5TcGFuKCkgLSAxKSAqIGdyaWQuaG9yaXpvbnRh
bFNwYWNpbmcoKTsKLSAgICAgICAgLy8gRklYTUU6IENoZWNrIGlmIGZpeGVkIHdpZHRoIGNvbHVt
bnMgc2hvdWxkIGJlIHNraXBwZWQgaGVyZS4KLSAgICAgICAgd2lkdGhDb25zdHJhaW50c1RvRGlz
dHJpYnV0ZS5taW5pbXVtID0gc3RkOjptYXgoTGF5b3V0VW5pdCB7IH0sIHdpZHRoQ29uc3RyYWlu
dHNUb0Rpc3RyaWJ1dGUubWluaW11bSAvIGNlbGwuY29sdW1uU3BhbigpKTsKLSAgICAgICAgd2lk
dGhDb25zdHJhaW50c1RvRGlzdHJpYnV0ZS5tYXhpbXVtID0gc3RkOjptYXgoTGF5b3V0VW5pdCB7
IH0sIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWF4aW11bSAvIGNlbGwuY29sdW1uU3Bh
bigpKTsKLSAgICAgICAgaWYgKHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWluaW11bSB8
fCB3aWR0aENvbnN0cmFpbnRzVG9EaXN0cmlidXRlLm1heGltdW0pIHsKLSAgICAgICAgICAgIGZv
ciAoc2l6ZV90IGNvbHVtblNwYW5JbmRleCA9IGNlbGwuc3RhcnRDb2x1bW4oKTsgY29sdW1uU3Bh
bkluZGV4IDwgY2VsbC5lbmRDb2x1bW4oKTsgKytjb2x1bW5TcGFuSW5kZXgpCi0gICAgICAgICAg
ICAgICAgY29sdW1uSW50cmluc2ljV2lkdGhzW2NvbHVtblNwYW5JbmRleF0gKz0gd2lkdGhDb25z
dHJhaW50c1RvRGlzdHJpYnV0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIDUuIFRoZSBm
aW5hbCB0YWJsZSBtaW4vbWF4IHdpZHRocyBpcyBqdXN0IHRoZSBhY2N1bXVsYXRlZCBjb2x1bW4g
Y29uc3RyYWludHMuCi0gICAgYXV0byB0YWJsZVdpZHRoQ29uc3RyYWludHMgPSBJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzIHsgfTsKLSAgICBmb3IgKGF1dG8mIGNvbHVtbkludHJpbnNpY1dpZHRo
IDogY29sdW1uSW50cmluc2ljV2lkdGhzKQotICAgICAgICB0YWJsZVdpZHRoQ29uc3RyYWludHMg
Kz0gY29sdW1uSW50cmluc2ljV2lkdGg7Ci0gICAgLy8gRXhhcGFuZCB0aGUgcHJlZmVycmVkIHdp
ZHRoIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgY2VsbCBzcGFjaW5nIChub3RlIHRoYXQgY29s
dW1uIHNwYW5uZXJzIGNvdW50IGFzIG9uZSBjZWxsKS4KLSAgICB0YWJsZVdpZHRoQ29uc3RyYWlu
dHMgKz0gKG51bWJlck9mQWN0dWFsQ29sdW1ucyArIDEpICogZ3JpZC5ob3Jpem9udGFsU3BhY2lu
ZygpOwotICAgIHJldHVybiB0YWJsZVdpZHRoQ29uc3RyYWludHM7Ci19Ci0KLXZvaWQgVGFibGVG
b3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUFuZERpc3RyaWJ1dGVFeHRyYVNwYWNlKExheW91dFVu
aXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFi
bGVWZXJ0aWNhbFNwYWNlKQotewotICAgIC8vIENvbXB1dGUgYW5kIGJhbGFuY2UgdGhlIGNvbHVt
biBhbmQgcm93IHNwYWNlcy4KLSAgICBhdXRvJiBncmlkID0gZm9ybWF0dGluZ1N0YXRlKCkudGFi
bGVHcmlkKCk7Ci0gICAgYXV0byYgY29sdW1ucyA9IGdyaWQuY29sdW1ucygpLmxpc3QoKTsKLSAg
ICBhdXRvIHRhYmxlTGF5b3V0ID0gdGhpcy0+dGFibGVMYXlvdXQoKTsKLQotICAgIC8vIENvbHVt
bnMgZmlyc3QuCi0gICAgYXV0byBkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZXMgPSB0YWJsZUxh
eW91dC5kaXN0cmlidXRlZEhvcml6b250YWxTcGFjZShhdmFpbGFibGVIb3Jpem9udGFsU3BhY2Up
OwotICAgIEFTU0VSVChkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZXMuc2l6ZSgpID09IGNvbHVt
bnMuc2l6ZSgpKTsKLSAgICBhdXRvIGNvbHVtbkxvZ2ljYWxMZWZ0ID0gZ3JpZC5ob3Jpem9udGFs
U3BhY2luZygpOwotICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXgg
PCBjb2x1bW5zLnNpemUoKTsgKytjb2x1bW5JbmRleCkgewotICAgICAgICBhdXRvJiBjb2x1bW4g
PSBjb2x1bW5zW2NvbHVtbkluZGV4XTsKLSAgICAgICAgY29sdW1uLnNldExvZ2ljYWxMZWZ0KGNv
bHVtbkxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgY29sdW1uLnNldExvZ2ljYWxXaWR0aChkaXN0cmli
dXRlZEhvcml6b250YWxTcGFjZXNbY29sdW1uSW5kZXhdKTsKLSAgICAgICAgY29sdW1uTG9naWNh
bExlZnQgKz0gZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2VzW2NvbHVtbkluZGV4XSArIGdyaWQu
aG9yaXpvbnRhbFNwYWNpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBSb3dzIHNlY29uZC4KLSAgICBh
dXRvJiByb3dzID0gZ3JpZC5yb3dzKCkubGlzdCgpOwotICAgIGZvciAoc2l6ZV90IHJvd0luZGV4
ID0gMDsgcm93SW5kZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkgewotICAgICAgICBmb3Ig
KHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsr
Y29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGF1dG8mIHNsb3QgPSAqZ3JpZC5zbG90KHsgY29s
dW1uSW5kZXgsIHJvd0luZGV4IH0pOwotICAgICAgICAgICAgaWYgKHNsb3QuaXNSb3dTcGFubmVk
KCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBsYXlvdXRDZWxsKHNs
b3QuY2VsbCgpLCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAgICAgICAgICAgaWYgKHNs
b3QuaGFzUm93U3BhbigpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
Ly8gVGhlIG1pbmltdW0gaGVpZ2h0IG9mIGEgcm93ICh3aXRob3V0IHNwYW5uaW5nLXJlbGF0ZWQg
aGVpZ2h0IGRpc3RyaWJ1dGlvbikgaXMgZGVmaW5lZCBhcyB0aGUgaGVpZ2h0IG9mIGFuIGh5cG90
aGV0aWNhbAotICAgICAgICAgICAgLy8gbGluZWJveCBjb250YWluaW5nIHRoZSBjZWxscyBvcmln
aW5hdGluZyBpbiB0aGUgcm93LgotICAgICAgICAgICAgYXV0byYgY2VsbCA9IHNsb3QuY2VsbCgp
OwotICAgICAgICAgICAgY2VsbC5zZXRCYXNlbGluZShnZW9tZXRyeSgpLnVzZWRCYXNlbGluZUZv
ckNlbGwoY2VsbC5ib3goKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXV0byBkaXN0cmli
dXRlZFZlcnRpY2FsU3BhY2VzID0gdGFibGVMYXlvdXQuZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNl
KGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpOwotICAgIEFTU0VSVChkaXN0cmlidXRlZFZlcnRpY2Fs
U3BhY2VzLnNpemUoKSA9PSByb3dzLnNpemUoKSk7Ci0gICAgYXV0byByb3dMb2dpY2FsVG9wID0g
Z3JpZC52ZXJ0aWNhbFNwYWNpbmcoKTsKLSAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJv
d0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKLSAgICAgICAgYXV0byYgcm93ID0g
cm93c1tyb3dJbmRleF07Ci0gICAgICAgIHJvdy5zZXRMb2dpY2FsSGVpZ2h0KGRpc3RyaWJ1dGVk
VmVydGljYWxTcGFjZXNbcm93SW5kZXhdKTsKLSAgICAgICAgcm93LnNldExvZ2ljYWxUb3Aocm93
TG9naWNhbFRvcCk7Ci0gICAgICAgIHJvd0xvZ2ljYWxUb3AgKz0gZGlzdHJpYnV0ZWRWZXJ0aWNh
bFNwYWNlc1tyb3dJbmRleF0gKyBncmlkLnZlcnRpY2FsU3BhY2luZygpOwotICAgIH0KLX0KLQot
fQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZv
cm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0
L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDFmMzBkZTEzNTQ1NjY1NTgxZWI5NDlhMjdiODBkZjRlMTIyMjVlNmYu
LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dl
YkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgKKysr
IC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
LSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgot
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQot
Ci0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb3Jt
YXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5j
bHVkZSAiVGFibGVHcmlkLmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgotI2luY2x1ZGUg
PHd0Zi9VbmlxdWVSZWYuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91
dCB7Ci0KLWNsYXNzIEludmFsaWRhdGlvblN0YXRlOwotLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRz
IHRoZSBsYXlvdXQgbG9naWMgZm9yIHRhYmxlIGZvcm1hdHRpbmcgY29udGV4dHMuCi0vLyBodHRw
czovL3d3dy53My5vcmcvVFIvQ1NTMjIvdGFibGVzLmh0bWwKLWNsYXNzIFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQgZmluYWwgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQgewotICAgIFdURl9NQUtF
X0lTT19BTExPQ0FURUQoVGFibGVGb3JtYXR0aW5nQ29udGV4dCk7Ci1wdWJsaWM6Ci0gICAgVGFi
bGVGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0
Um9vdCwgVGFibGVGb3JtYXR0aW5nU3RhdGUmKTsKLSAgICB2b2lkIGxheW91dEluRmxvd0NvbnRl
bnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQm
KSBvdmVycmlkZTsKLSAgICBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3Qgb3Zl
cnJpZGU7Ci0KLSAgICBzdGF0aWMgVW5pcXVlUmVmPFRhYmxlR3JpZD4gZW5zdXJlVGFibGVHcmlk
KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gpOwotCi1wcml2YXRlOgotICAgIGNsYXNzIFRh
YmxlTGF5b3V0IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFRhYmxlTGF5b3V0KGNvbnN0IFRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQmLCBjb25zdCBUYWJsZUdyaWQmKTsKLQotICAgICAgICB1c2luZyBE
aXN0cmlidXRlZFNwYWNlcyA9IFZlY3RvcjxMYXlvdXRVbml0PjsKLSAgICAgICAgRGlzdHJpYnV0
ZWRTcGFjZXMgZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2UoTGF5b3V0VW5pdCBhdmFpbGFibGVI
b3Jpem9udGFsU3BhY2UpOwotICAgICAgICBEaXN0cmlidXRlZFNwYWNlcyBkaXN0cmlidXRlZFZl
cnRpY2FsU3BhY2UoT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlVmVydGljYWxTcGFjZSk7
Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiBm
b3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRleHQ7IH0K
LQotICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiBtX2Zvcm1hdHRpbmdDb250
ZXh0OwotICAgICAgICBjb25zdCBUYWJsZUdyaWQmIG1fZ3JpZDsKLSAgICB9OwotCi0gICAgY2xh
c3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKLSAgICBw
dWJsaWM6Ci0gICAgICAgIExheW91dFVuaXQgY2VsbEhlaWdoKGNvbnN0IENvbnRhaW5lckJveCYp
IGNvbnN0OwotICAgICAgICBFZGdlcyBjb21wdXRlZENlbGxCb3JkZXIoY29uc3QgVGFibGVHcmlk
OjpDZWxsJikgY29uc3Q7Ci0gICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbXB1dGVkQ29s
dW1uV2lkdGgoY29uc3QgQ29udGFpbmVyQm94JiBjb2x1bW5Cb3gpOwotICAgICAgICBGb3JtYXR0
aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzRm9yQ2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmKTsKLSAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCB1c2VkQmFzZWxpbmVGb3JDZWxsKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCk7
Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgVGFibGVGb3JtYXR0aW5nQ29u
dGV4dDsKLSAgICAgICAgR2VvbWV0cnkoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYsIGNv
bnN0IFRhYmxlR3JpZCYpOwotCi0gICAgICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQm
IGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8VGFibGVGb3JtYXR0
aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpmb3JtYXR0aW5nQ29udGV4
dCgpKTsgfQotICAgICAgICBjb25zdCBUYWJsZUdyaWQmIG1fZ3JpZDsKLSAgICB9OwotICAgIFRh
YmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4g
R2VvbWV0cnkoKnRoaXMsIGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpKTsgfQotCi0gICAg
Y2xhc3MgUXVpcmtzIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgewotICAgIHB1
YmxpYzoKLSAgICAgICAgUXVpcmtzKGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmKTsKLQot
ICAgICAgICBib29sIHNob3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luKGNvbnN0
IENvbnRhaW5lckJveCYpIGNvbnN0OwotCi0gICAgICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ0Nv
bnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8VGFibGVG
b3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6Zm9ybWF0dGluZ0Nv
bnRleHQoKSk7IH0KLSAgICAgICAgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2Vv
bWV0cnkoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCk7IH0K
LSAgICB9OwotICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyBxdWlya3MoKSBjb25z
dCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9Ci0KLSAgICBUYWJsZUZvcm1hdHRpbmdDb250ZXh0
OjpUYWJsZUxheW91dCB0YWJsZUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIFRhYmxlTGF5b3V0KCp0
aGlzLCBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKSk7IH0KLQotICAgIEludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJp
ZGU7Ci0gICAgdm9pZCBsYXlvdXRDZWxsKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYsIExheW91dFVu
aXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkQ2Vs
bEhlaWdodCA9IFdURjo6bnVsbG9wdCk7Ci0gICAgdm9pZCBzZXRVc2VkR2VvbWV0cnlGb3JDZWxs
cyhMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSk7Ci0gICAgdm9pZCBzZXRVc2Vk
R2VvbWV0cnlGb3JSb3dzKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKLSAg
ICB2b2lkIHNldFVzZWRHZW9tZXRyeUZvclNlY3Rpb25zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5G
bG93Q29udGVudCYpOwotCi0gICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBjb21wdXRlZFBy
ZWZlcnJlZFdpZHRoRm9yQ29sdW1ucygpOwotICAgIHZvaWQgY29tcHV0ZUFuZERpc3RyaWJ1dGVF
eHRyYVNwYWNlKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxM
YXlvdXRVbml0PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKTsKLQotICAgIGNvbnN0IFRhYmxlRm9y
bWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxU
YWJsZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgp
KTsgfQotICAgIFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVy
biBkb3duY2FzdDxUYWJsZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1h
dHRpbmdTdGF0ZSgpKTsgfQotfTsKLQotaW5saW5lIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5OjpHZW9tZXRyeShjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiB0YWJsZUZvcm1h
dHRpbmdDb250ZXh0LCBjb25zdCBUYWJsZUdyaWQmIGdyaWQpCi0gICAgOiBGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnkodGFibGVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICAsIG1fZ3JpZChncmlk
KQotewotfQotCi1pbmxpbmUgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpRdWlya3Mo
Y29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYgdGFibGVGb3JtYXR0aW5nQ29udGV4dCkKLSAg
ICA6IEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3ModGFibGVGb3JtYXR0aW5nQ29udGV4dCkKLXsK
LX0KLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NP
TlRFWFQoVGFibGVGb3JtYXR0aW5nQ29udGV4dCwgaXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkp
Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0
dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3Bw
CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzMyMzkyNjk0ZjZlN2E4MjQyOWMyMGE1
ZTYxMDk4NDBlMmFlZGM4Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0
aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0v
KgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
LSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0j
aW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2Vv
bWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCi0jaW5jbHVkZSAiTGF5b3V0RGVz
Y2VuZGFudEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRhaW5pbmdCbG9j
ay5oIgotI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCi0KLW5hbWVzcGFjZSBXZWJD
b3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1MYXlvdXRVbml0IFRhYmxlRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5OjpjZWxsSGVpZ2goY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94KSBj
b25zdAotewotICAgIEFTU0VSVChjZWxsQm94LmlzSW5GbG93KCkpOwotICAgIGF1dG8gY29udGVu
dEhlaWdodCA9IExheW91dFVuaXQgeyB9OwotICAgIGlmIChmb3JtYXR0aW5nQ29udGV4dCgpLnF1
aXJrcygpLnNob3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luKGNlbGxCb3gpKSB7
Ci0gICAgICAgIEFTU0VSVChjZWxsQm94LmZpcnN0SW5GbG93Q2hpbGQoKSk7Ci0gICAgICAgIGF1
dG8gZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgpOwotICAgICAg
ICBhdXRvJiBmaXJzdEluRmxvd0NoaWxkID0gKmNlbGxCb3guZmlyc3RJbkZsb3dDaGlsZCgpOwot
ICAgICAgICBhdXRvJiBsYXN0SW5GbG93Q2hpbGQgPSAqY2VsbEJveC5sYXN0SW5GbG93Q2hpbGQo
KTsKLSAgICAgICAgYXV0byYgZmlyc3RJbkZsb3dDaGlsZEdlb21ldHJ5ID0gZm9ybWF0dGluZ0Nv
bnRleHQuZ2VvbWV0cnlGb3JCb3goZmlyc3RJbkZsb3dDaGlsZCwgRXNjYXBlUmVhc29uOjpUYWJs
ZVF1aXJrTmVlZHNHZW9tZXRyeUZyb21Fc3RhYmxpc2hlZEZvcm1hdHRpbmdDb250ZXh0KTsKLSAg
ICAgICAgYXV0byYgbGFzdEluRmxvd0NoaWxkR2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5n
ZW9tZXRyeUZvckJveChsYXN0SW5GbG93Q2hpbGQsIEVzY2FwZVJlYXNvbjo6VGFibGVRdWlya05l
ZWRzR2VvbWV0cnlGcm9tRXN0YWJsaXNoZWRGb3JtYXR0aW5nQ29udGV4dCk7Ci0KLSAgICAgICAg
YXV0byB0b3AgPSBmaXJzdEluRmxvd0NoaWxkLnN0eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmso
KSA/IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGZpcnN0SW5GbG93Q2hpbGRHZW9tZXRyeSku
dG9wKCkgOiBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChmaXJzdEluRmxvd0NoaWxkR2VvbWV0
cnkpLnRvcCgpOwotICAgICAgICBhdXRvIGJvdHRvbSA9IGxhc3RJbkZsb3dDaGlsZC5zdHlsZSgp
Lmhhc01hcmdpbkFmdGVyUXVpcmsoKSA/IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGxhc3RJ
bkZsb3dDaGlsZEdlb21ldHJ5KS5ib3R0b20oKSA6IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0
KGxhc3RJbkZsb3dDaGlsZEdlb21ldHJ5KS5ib3R0b20oKTsKLSAgICAgICAgY29udGVudEhlaWdo
dCA9IGJvdHRvbSAtIHRvcDsKLSAgICB9IGVsc2UKLSAgICAgICAgY29udGVudEhlaWdodCA9IGNv
bnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QoY2VsbEJveCk7Ci0gICAgcmV0dXJu
IHN0ZDo6bWF4KGNvbXB1dGVkSGVpZ2h0KGNlbGxCb3gpLnZhbHVlT3IoMF9sdSksIGNvbnRlbnRI
ZWlnaHQpOwotfQotCi1FZGdlcyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29t
cHV0ZWRDZWxsQm9yZGVyKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgY29uc3QKLXsKLSAg
ICBhdXRvJiBjZWxsQm94ID0gY2VsbC5ib3goKTsKLSAgICBhdXRvIGJvcmRlciA9IGNvbXB1dGVk
Qm9yZGVyKGNlbGxCb3gpOwotICAgIGF1dG8gY29sbGFwc2VkQm9yZGVyID0gbV9ncmlkLmNvbGxh
cHNlZEJvcmRlcigpOwotICAgIGlmICghY29sbGFwc2VkQm9yZGVyKQotICAgICAgICByZXR1cm4g
Ym9yZGVyOwotCi0gICAgLy8gV2UgbWlnaHQgd2FudCB0byBjYWNoZSB0aGVzZSBjb2xsYXBzZWQg
Ym9yZGVycyBvbiB0aGUgZ3JpZC4KLSAgICBhdXRvIGNlbGxQb3NpdGlvbiA9IGNlbGwucG9zaXRp
b24oKTsKLSAgICAvLyBDb2xsYXBzZWQgYm9yZGVyIGxlZnQgZnJvbSB0YWJsZSBhbmQgYWRqYWNl
bnQgY2VsbHMuCi0gICAgaWYgKCFjZWxsUG9zaXRpb24uY29sdW1uKQotICAgICAgICBib3JkZXIu
aG9yaXpvbnRhbC5sZWZ0ID0gY29sbGFwc2VkQm9yZGVyLT5ob3Jpem9udGFsLmxlZnQgLyAyOwot
ICAgIGVsc2UgewotICAgICAgICBhdXRvIGFkamFjZW50Qm9yZGVyUmlnaHQgPSBjb21wdXRlZEJv
cmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4gLSAxLCBjZWxsUG9zaXRpb24u
cm93IH0pLT5jZWxsKCkuYm94KCkpLmhvcml6b250YWwucmlnaHQ7Ci0gICAgICAgIGJvcmRlci5o
b3Jpem9udGFsLmxlZnQgPSBzdGQ6Om1heChib3JkZXIuaG9yaXpvbnRhbC5sZWZ0LCBhZGphY2Vu
dEJvcmRlclJpZ2h0KSAvIDI7Ci0gICAgfQotICAgIC8vIENvbGxhcHNlZCBib3JkZXIgcmlnaHQg
ZnJvbSB0YWJsZSBhbmQgYWRqYWNlbnQgY2VsbHMuCi0gICAgaWYgKGNlbGxQb3NpdGlvbi5jb2x1
bW4gPT0gbV9ncmlkLmNvbHVtbnMoKS5zaXplKCkgLSAxKQotICAgICAgICBib3JkZXIuaG9yaXpv
bnRhbC5yaWdodCA9IGNvbGxhcHNlZEJvcmRlci0+aG9yaXpvbnRhbC5yaWdodCAvIDI7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJMZWZ0ID0gY29tcHV0ZWRCb3JkZXIo
bV9ncmlkLnNsb3QoeyBjZWxsUG9zaXRpb24uY29sdW1uICsgMSwgY2VsbFBvc2l0aW9uLnJvdyB9
KS0+Y2VsbCgpLmJveCgpKS5ob3Jpem9udGFsLmxlZnQ7Ci0gICAgICAgIGJvcmRlci5ob3Jpem9u
dGFsLnJpZ2h0ID0gc3RkOjptYXgoYm9yZGVyLmhvcml6b250YWwucmlnaHQsIGFkamFjZW50Qm9y
ZGVyTGVmdCkgLyAyOwotICAgIH0KLSAgICAvLyBDb2xsYXBzZWQgYm9yZGVyIHRvcCBmcm9tIHRh
YmxlLCByb3cgYW5kIGFkamFjZW50IGNlbGxzLgotICAgIGF1dG8mIHJvd3MgPSBtX2dyaWQucm93
cygpLmxpc3QoKTsKLSAgICBpZiAoIWNlbGxQb3NpdGlvbi5yb3cpCi0gICAgICAgIGJvcmRlci52
ZXJ0aWNhbC50b3AgPSBjb2xsYXBzZWRCb3JkZXItPnZlcnRpY2FsLnRvcCAvIDI7Ci0gICAgZWxz
ZSB7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJCb3R0b20gPSBjb21wdXRlZEJvcmRlciht
X2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4sIGNlbGxQb3NpdGlvbi5yb3cgLSAxIH0p
LT5jZWxsKCkuYm94KCkpLnZlcnRpY2FsLmJvdHRvbTsKLSAgICAgICAgYXV0byBhZGphY2VudFJv
d0JvdHRvbSA9IGNvbXB1dGVkQm9yZGVyKHJvd3NbY2VsbFBvc2l0aW9uLnJvdyAtIDFdLmJveCgp
KS52ZXJ0aWNhbC5ib3R0b207Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIg
PSBzdGQ6Om1heChhZGphY2VudEJvcmRlckJvdHRvbSwgYWRqYWNlbnRSb3dCb3R0b20pOwotICAg
ICAgICBib3JkZXIudmVydGljYWwudG9wID0gc3RkOjptYXgoYm9yZGVyLnZlcnRpY2FsLnRvcCwg
YWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIpIC8gMjsKLSAgICB9Ci0gICAgLy8gQ29sbGFwc2VkIGJv
cmRlciBib3R0b20gZnJvbSB0YWJsZSwgcm93IGFuZCBhZGphY2VudCBjZWxscy4KLSAgICBpZiAo
Y2VsbFBvc2l0aW9uLnJvdyA9PSBtX2dyaWQucm93cygpLnNpemUoKSAtIDEpCi0gICAgICAgIGJv
cmRlci52ZXJ0aWNhbC5ib3R0b20gPSBjb2xsYXBzZWRCb3JkZXItPnZlcnRpY2FsLmJvdHRvbSAv
IDI7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJUb3AgPSBjb21wdXRl
ZEJvcmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4sIGNlbGxQb3NpdGlvbi5y
b3cgKyAxIH0pLT5jZWxsKCkuYm94KCkpLnZlcnRpY2FsLnRvcDsKLSAgICAgICAgYXV0byBhZGph
Y2VudFJvd1RvcCA9IGNvbXB1dGVkQm9yZGVyKHJvd3NbY2VsbFBvc2l0aW9uLnJvdyArIDFdLmJv
eCgpKS52ZXJ0aWNhbC50b3A7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIg
PSBzdGQ6Om1heChhZGphY2VudEJvcmRlclRvcCwgYWRqYWNlbnRSb3dUb3ApOwotICAgICAgICBi
b3JkZXIudmVydGljYWwuYm90dG9tID0gc3RkOjptYXgoYm9yZGVyLnZlcnRpY2FsLmJvdHRvbSwg
YWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIpIC8gMjsKLSAgICB9Ci0gICAgcmV0dXJuIGJvcmRlcjsK
LX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0
cnk6OmNvbXB1dGVkQ29sdW1uV2lkdGgoY29uc3QgQ29udGFpbmVyQm94JiBjb2x1bW5Cb3gpCi17
Ci0gICAgLy8gQ2hlY2sgYm90aCBzdHlsZSBhbmQgPGNvbD4ncyB3aWR0aCBhdHRyaWJ1dGUuCi0g
ICAgLy8gRklYTUU6IEZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIGNhbGN1bGF0ZWQgdmFsdWVz
LCBsaWtlIDxjb2wgc3R5bGU9IndpZHRoOiAxMCUiPi4KLSAgICBpZiAoYXV0byBjb21wdXRlZFdp
ZHRoVmFsdWUgPSBjb21wdXRlZFdpZHRoKGNvbHVtbkJveCwgeyB9KSkKLSAgICAgICAgcmV0dXJu
IGNvbXB1dGVkV2lkdGhWYWx1ZTsKLSAgICByZXR1cm4gY29sdW1uQm94LmNvbHVtbldpZHRoKCk7
Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIFRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9y
Q2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpCi17Ci0gICAgYXV0byYgY2VsbEJveCA9
IGNlbGwuYm94KCk7Ci0gICAgYXV0byYgc3R5bGUgPSBjZWxsQm94LnN0eWxlKCk7Ci0KLSAgICBh
dXRvIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IFsmXSgpIC0+IEZvcm1hdHRp
bmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsKLSAgICAgICAgLy8gRXZlbiBm
aXhlZCB3aWR0aCBjZWxscyBleHBhbmQgdG8gdGhlaXIgbWluaW11bSBjb250ZW50IHdpZHRoCi0g
ICAgICAgIC8vIDx0ZCBzdHlsZT0id2lkdGg6IDEwcHgiPnRlc3RfY29udGVudDwvdGQ+IHdpbGwg
c2l6ZSB0byBtYXgobWluaW11bSBjb250ZW50IHdpZHRoLCBjb21wdXRlZCB3aWR0aCkuCi0gICAg
ICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IEZvcm1hdHRpbmdDb250ZXh0OjpJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKLSAgICAgICAgaWYgKGNlbGxCb3guaGFzQ2hp
bGQoKSkKLSAgICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBMYXlvdXRDb250
ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjZWxsQm94LCBsYXlvdXRTdGF0ZSgpKS0+Y29t
cHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGlmIChhdXRvIGZpeGVk
V2lkdGggPSBmaXhlZFZhbHVlKHN0eWxlLmxvZ2ljYWxXaWR0aCgpKSkKLSAgICAgICAgICAgIHJl
dHVybiB7IHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgKmZpeGVk
V2lkdGgpLCBzdGQ6Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0sICpmaXhl
ZFdpZHRoKSB9OwotICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKLSAg
ICB9OwotICAgIC8vIEZJWE1FIENoZWNrIGZvciBib3gtc2l6aW5nOiBib3JkZXItYm94OwotICAg
IGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGNvbnN0cmFpbkJ5TWluTWF4V2lkdGgo
Y2VsbEJveCwgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkpOwotICAgIC8vIEV4
cGFuZCB3aXRoIGJvcmRlcgotICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMuZXhwYW5kKGNv
bXB1dGVkQ2VsbEJvcmRlcihjZWxsKS53aWR0aCgpKTsKLSAgICAvLyBwYWRkaW5nCi0gICAgaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQoZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nTGVm
dCgpKS52YWx1ZU9yKDApICsgZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nUmlnaHQoKSkudmFsdWVP
cigwKSk7Ci0gICAgLy8gYW5kIG1hcmdpbgotICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMu
ZXhwYW5kKGZpeGVkVmFsdWUoc3R5bGUubWFyZ2luU3RhcnQoKSkudmFsdWVPcigwKSArIGZpeGVk
VmFsdWUoc3R5bGUubWFyZ2luRW5kKCkpLnZhbHVlT3IoMCkpOwotICAgIHJldHVybiBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzOwotfQotCi0KLUlubGluZUxheW91dFVuaXQgVGFibGVGb3JtYXR0
aW5nQ29udGV4dDo6R2VvbWV0cnk6OnVzZWRCYXNlbGluZUZvckNlbGwoY29uc3QgQ29udGFpbmVy
Qm94JiBjZWxsQm94KQotewotICAgIC8vIFRoZSBiYXNlbGluZSBvZiBhIGNlbGwgaXMgZGVmaW5l
ZCBhcyB0aGUgYmFzZWxpbmUgb2YgdGhlIGZpcnN0IGluLWZsb3cgbGluZSBib3ggaW4gdGhlIGNl
bGwsCi0gICAgLy8gb3IgdGhlIGZpcnN0IGluLWZsb3cgdGFibGUtcm93IGluIHRoZSBjZWxsLCB3
aGljaGV2ZXIgY29tZXMgZmlyc3QuCi0gICAgLy8gSWYgdGhlcmUgaXMgbm8gc3VjaCBsaW5lIGJv
eCwgdGhlIGJhc2VsaW5lIGlzIHRoZSBib3R0b20gb2YgY29udGVudCBlZGdlIG9mIHRoZSBjZWxs
IGJveC4KLSAgICBpZiAoY2VsbEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0
KCkpCi0gICAgICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkSW5saW5lRm9ybWF0
dGluZ1N0YXRlKGNlbGxCb3gpLmxpbmVzKClbMF0uYmFzZWxpbmUoKTsKLSAgICBmb3IgKGF1dG8m
IGNlbGxEZXNjZW5kYW50IDogZGVzY2VuZGFudHNPZlR5cGU8Q29udGFpbmVyQm94PihjZWxsQm94
KSkgewotICAgICAgICBpZiAoY2VsbERlc2NlbmRhbnQuZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICBhdXRvJiBpbmxpbmVGb3JtYXR0aW5nU3RhdGVG
b3JDZWxsID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZElubGluZUZvcm1hdHRpbmdTdGF0ZShj
ZWxsRGVzY2VuZGFudCk7Ci0gICAgICAgICAgICBpZiAoIWlubGluZUZvcm1hdHRpbmdTdGF0ZUZv
ckNlbGwubGluZXMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGlubGluZUZv
cm1hdHRpbmdTdGF0ZUZvckNlbGwubGluZXMoKVswXS5iYXNlbGluZSgpOwotICAgICAgICB9Ci0g
ICAgICAgIGlmIChjZWxsRGVzY2VuZGFudC5lc3RhYmxpc2hlc1RhYmxlRm9ybWF0dGluZ0NvbnRl
eHQoKSkKLSAgICAgICAgICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkVGFibGVG
b3JtYXR0aW5nU3RhdGUoY2VsbERlc2NlbmRhbnQpLnRhYmxlR3JpZCgpLnJvd3MoKS5saXN0KClb
MF0uYmFzZWxpbmUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkuZ2Vv
bWV0cnlGb3JCb3goY2VsbEJveCkuY29udGVudEJveEJvdHRvbSgpOwotfQotCi19Ci19Ci0KLSNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9U
YWJsZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90
YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NGE2MmRmZjA3MTRhZDY4ZmE3ODk2ODVmYmJiMjEzNzRm
ZjE1MzIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0
UXVpcmtzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoK
LSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0j
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgot
Ci0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJMYXlv
dXRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJMYXlv
dXRTdGF0ZS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQot
Ym9vbCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OnNob3VsZElnbm9yZUNoaWxkQ29u
dGVudFZlcnRpY2FsTWFyZ2luKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCkgY29uc3QKLXsK
LSAgICAvLyBOb3JtYWxseSBCRkMgcm9vdCBjb250ZW50IGhlaWdodCB0YWtlcyB0aGUgbWFyZ2lu
IGJveCBvZiB0aGUgY2hpbGQgY29udGVudCBhcyB2ZXJ0aWNhbCBtYXJnaW5zIGRvbid0IGNvbGxh
cHNlIHdpdGggQkZDIHJvb3RzLAotICAgIC8vIGJ1dCB0YWJsZSBjZWxsIGJveGVzIGRvIGNvbGxh
cHNlIHRoZWlyIChub24tZXhpc3RpbmcpIG1hcmdpbnMgd2l0aCBjaGlsZCBxdWlyayBtYXJnaW5z
IChzbyBtdWNoIHF1aXJrKSwgc28gaGVyZSB3ZSBjaGVjawotICAgIC8vIGlmIHRoZSBjb250ZW50
IGhlaWdodCBzaG91bGQgaW5jbHVkZSBtYXJnaW5zIG9yIG5vdC4KLSAgICAvLyBlLmcgPHRhYmxl
Pjx0cj48dGQ+PHA+dGV4dCBjb250ZW50PC90ZD48L3RyPjwvdGFibGU+IDwtIDxwPidzIHF1aXJr
IG1hcmdpbiBjb2xsYXBzZXMgd2l0aCB0aGUgPHRkPiBzbyBpdHMgY29udGVudAotICAgIC8vIGhl
aWdodCBzaG91bGQgbm90IGluY2x1ZGUgdmVydGljYWwgbWFyZ2lucy4KLSAgICBpZiAoIWxheW91
dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAo
Y2VsbEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICBpZiAoIWNlbGxCb3guaGFzSW5GbG93Q2hpbGQoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBjZWxsQm94LmZpcnN0SW5GbG93Q2hpbGQoKS0+c3R5
bGUoKS5oYXNNYXJnaW5CZWZvcmVRdWlyaygpIHx8IGNlbGxCb3gubGFzdEluRmxvd0NoaWxkKCkt
PnN0eWxlKCkuaGFzTWFyZ2luQWZ0ZXJRdWlyaygpOwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1h
dHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1Rh
YmxlRm9ybWF0dGluZ1N0YXRlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMx
MGVmNWUxMzI2MGQxYTMxZmIxZDllODZlMmM2YjYyM2E2NTk4Ny4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVm
b3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUx
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0Ogot
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
Ci0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
Ci0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgot
ICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGFi
bGVGb3JtYXR0aW5nU3RhdGUuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQotCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgPHd0
Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoVGFibGVGb3JtYXR0aW5nU3Rh
dGUpOwotCi1UYWJsZUZvcm1hdHRpbmdTdGF0ZTo6VGFibGVGb3JtYXR0aW5nU3RhdGUoUmVmPEZs
b2F0aW5nU3RhdGU+JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBj
b25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KQotICAgIDogRm9ybWF0dGluZ1N0YXRlKFdURk1v
dmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OlRhYmxlLCBsYXlvdXRTdGF0ZSkKLSAgICAsIG1fdGFi
bGVHcmlkKFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmVuc3VyZVRhYmxlR3JpZCh0YWJsZUJveCkp
Ci17Ci19Ci0KLVRhYmxlRm9ybWF0dGluZ1N0YXRlOjp+VGFibGVGb3JtYXR0aW5nU3RhdGUoKQot
ewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90
YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuaCBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuaApkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggN2QxZTRhZjBiOTZhY2M0ZDM0MzQ1YWE5Y2Y2ZDgzZjc4ZDUzYzc2
Zi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmgKKysr
IC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwot
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0g
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0K
LSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZvcm1h
dHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIlRhYmxlR3JpZC5oIgotI2luY2x1ZGUgPHd0Zi9Jc29N
YWxsb2MuaD4KLSNpbmNsdWRlIDx3dGYvVW5pcXVlUmVmLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3Jl
IHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi0vLyBUYWJsZUZvcm1hdHRpbmdTdGF0ZSBob2xkcyB0
aGUgc3RhdGUgZm9yIGEgcGFydGljdWxhciB0YWJsZSBmb3JtYXR0aW5nIGNvbnRleHQgdHJlZS4K
LWNsYXNzIFRhYmxlRm9ybWF0dGluZ1N0YXRlIDogcHVibGljIEZvcm1hdHRpbmdTdGF0ZSB7Ci0g
ICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChUYWJsZUZvcm1hdHRpbmdTdGF0ZSk7Ci1wdWJsaWM6
Ci0gICAgVGFibGVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0
YXRlJiwgY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCk7Ci0gICAgflRhYmxlRm9ybWF0dGlu
Z1N0YXRlKCk7Ci0KLSAgICBUYWJsZUdyaWQmIHRhYmxlR3JpZCgpIHsgcmV0dXJuIG1fdGFibGVH
cmlkOyB9Ci0gICAgY29uc3QgVGFibGVHcmlkJiB0YWJsZUdyaWQoKSBjb25zdCB7IHJldHVybiBt
X3RhYmxlR3JpZDsgfQotCi1wcml2YXRlOgotICAgIFVuaXF1ZVJlZjxUYWJsZUdyaWQ+IG1fdGFi
bGVHcmlkOwotfTsKLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JN
QVRUSU5HX1NUQVRFKFRhYmxlRm9ybWF0dGluZ1N0YXRlLCBpc1RhYmxlRm9ybWF0dGluZ1N0YXRl
KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9y
bWF0dGluZy9UYWJsZUdyaWQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0
dGluZy9UYWJsZUdyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQxZDhk
MDhhNTI1ZTc1NmFiY2RjYjFhMjE1YzlmNDY1NmFjZmI2Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1h
dHRpbmcvVGFibGVHcmlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgot
ICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAq
Ci0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
Ci0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlRhYmxlR3JpZC5oIgotCi0j
aWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlIDx3dGYvSXNv
TWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0
IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKFRhYmxlR3JpZCk7Ci0KLVRhYmxlR3Jp
ZDo6Q29sdW1uOjpDb2x1bW4oY29uc3QgQ29udGFpbmVyQm94KiBjb2x1bW5Cb3gpCi0gICAgOiBt
X2xheW91dEJveChtYWtlV2Vha1B0cihjb2x1bW5Cb3gpKQotewotfQotCi12b2lkIFRhYmxlR3Jp
ZDo6Q29sdW1uOjpzZXRMb2dpY2FsV2lkdGgoTGF5b3V0VW5pdCBjb21wdXRlZExvZ2ljYWxXaWR0
aCkKLXsKLSNpZiBBU1NFUlRfRU5BQkxFRAotICAgIG1faGFzQ29tcHV0ZWRXaWR0aCA9IHRydWU7
Ci0jZW5kaWYKLSAgICBtX2NvbXB1dGVkTG9naWNhbFdpZHRoID0gY29tcHV0ZWRMb2dpY2FsV2lk
dGg7Ci19Ci0KLUxheW91dFVuaXQgVGFibGVHcmlkOjpDb2x1bW46OmxvZ2ljYWxXaWR0aCgpIGNv
bnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzQ29tcHV0ZWRXaWR0aCk7Ci0gICAgcmV0dXJuIG1fY29t
cHV0ZWRMb2dpY2FsV2lkdGg7Ci19Ci0KLXZvaWQgVGFibGVHcmlkOjpDb2x1bW46OnNldExvZ2lj
YWxMZWZ0KExheW91dFVuaXQgY29tcHV0ZWRMb2dpY2FsTGVmdCkKLXsKLSNpZiBBU1NFUlRfRU5B
QkxFRAotICAgIG1faGFzQ29tcHV0ZWRMZWZ0ID0gdHJ1ZTsKLSNlbmRpZgotICAgIG1fY29tcHV0
ZWRMb2dpY2FsTGVmdCA9IGNvbXB1dGVkTG9naWNhbExlZnQ7Ci19Ci0KLUxheW91dFVuaXQgVGFi
bGVHcmlkOjpDb2x1bW46OmxvZ2ljYWxMZWZ0KCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9oYXND
b21wdXRlZExlZnQpOwotICAgIHJldHVybiBtX2NvbXB1dGVkTG9naWNhbExlZnQ7Ci19Ci0KLWJv
b2wgVGFibGVHcmlkOjpDb2x1bW46OmlzRml4ZWRXaWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGhhc0ZpeGVkV2lkdGhDZWxsKCkgfHwgKGJveCgpICYmIGJveCgpLT5jb2x1bW5XaWR0aCgpKTsK
LX0KLQotdm9pZCBUYWJsZUdyaWQ6OkNvbHVtbnM6OmFkZENvbHVtbihjb25zdCBDb250YWluZXJC
b3gmIGNvbHVtbkJveCkKLXsKLSAgICBtX2NvbHVtbkxpc3QuYXBwZW5kKHsgJmNvbHVtbkJveCB9
KTsKLX0KLQotdm9pZCBUYWJsZUdyaWQ6OkNvbHVtbnM6OmFkZEFub255bW91c0NvbHVtbigpCi17
Ci0gICAgbV9jb2x1bW5MaXN0LmFwcGVuZCh7IG51bGxwdHIgfSk7Ci19Ci0KLWJvb2wgVGFibGVH
cmlkOjpDb2x1bW5zOjpoYXNGaXhlZENvbHVtbnNPbmx5KCkgY29uc3QKLXsKLSAgICBmb3IgKGF1
dG8mIGNvbHVtbiA6IG1fY29sdW1uTGlzdCkgewotICAgICAgICBpZiAoIWNvbHVtbi5pc0ZpeGVk
V2lkdGgoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLXZvaWQgVGFibGVHcmlkOjpSb3dzOjphZGRSb3coY29uc3QgQ29udGFpbmVyQm94
JiByb3dCb3gpCi17Ci0gICAgbV9yb3dMaXN0LmFwcGVuZCh7IHJvd0JveCB9KTsKLX0KLQotVGFi
bGVHcmlkOjpSb3c6OlJvdyhjb25zdCBDb250YWluZXJCb3gmIHJvd0JveCkKLSAgICA6IG1fbGF5
b3V0Qm94KG1ha2VXZWFrUHRyKHJvd0JveCkpCi17Ci19Ci0KLVRhYmxlR3JpZDo6Q2VsbDo6Q2Vs
bChjb25zdCBDb250YWluZXJCb3gmIGNlbGxCb3gsIFNsb3RQb3NpdGlvbiBwb3NpdGlvbiwgQ2Vs
bFNwYW4gc3BhbikKLSAgICA6IG1fbGF5b3V0Qm94KG1ha2VXZWFrUHRyKGNlbGxCb3gpKQotICAg
ICwgbV9wb3NpdGlvbihwb3NpdGlvbikKLSAgICAsIG1fc3BhbihzcGFuKQotewotfQotCi1ib29s
IFRhYmxlR3JpZDo6Q2VsbDo6aXNGaXhlZFdpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gYm94
KCkuc3R5bGUoKS5sb2dpY2FsV2lkdGgoKS5pc0ZpeGVkKCk7Ci19Ci0KLVRhYmxlR3JpZDo6U2xv
dDo6U2xvdChDZWxsJiBjZWxsLCBib29sIGlzQ29sdW1uU3Bhbm5lZCwgYm9vbCBpc1Jvd1NwYW5u
ZWQpCi0gICAgOiBtX2NlbGwobWFrZVdlYWtQdHIoY2VsbCkpCi0gICAgLCBtX2lzQ29sdW1uU3Bh
bm5lZChpc0NvbHVtblNwYW5uZWQpCi0gICAgLCBtX2lzUm93U3Bhbm5lZChpc1Jvd1NwYW5uZWQp
Ci17Ci19Ci0KLVRhYmxlR3JpZDo6VGFibGVHcmlkKCkKLXsKLX0KLQotVGFibGVHcmlkOjpTbG90
KiBUYWJsZUdyaWQ6OnNsb3QoU2xvdFBvc2l0aW9uIHBvc2l0aW9uKQotewotICAgIHJldHVybiBt
X3Nsb3RNYXAuZ2V0KHBvc2l0aW9uKTsKLX0KLQotdm9pZCBUYWJsZUdyaWQ6OmFwcGVuZENlbGwo
Y29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94KQotewotICAgIGF1dG8gcm93U3BhbiA9IGNlbGxC
b3gucm93U3BhbigpOwotICAgIGF1dG8gY29sdW1uU3BhbiA9IGNlbGxCb3guY29sdW1uU3Bhbigp
OwotICAgIGF1dG8gaXNJbk5ld1JvdyA9ICFjZWxsQm94LnByZXZpb3VzU2libGluZygpOwotICAg
IGF1dG8gaW5pdGlhbFNsb3RQb3NpdGlvbiA9IFNsb3RQb3NpdGlvbiB7IH07Ci0KLSAgICBpZiAo
IW1fY2VsbHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGF1dG8mIGxhc3RDZWxsID0gbV9jZWxscy5s
YXN0KCk7Ci0gICAgICAgIGF1dG8gbGFzdFNsb3RQb3NpdGlvbiA9IGxhc3RDZWxsLT5wb3NpdGlv
bigpOwotICAgICAgICAvLyBGaXJzdCB0YWJsZSBjZWxsIGluIHRoaXMgcm93PwotICAgICAgICBp
ZiAoaXNJbk5ld1JvdykKLSAgICAgICAgICAgIGluaXRpYWxTbG90UG9zaXRpb24gPSBTbG90UG9z
aXRpb24geyAwLCBsYXN0U2xvdFBvc2l0aW9uLnJvdyArIDEgfTsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgaW5pdGlhbFNsb3RQb3NpdGlvbiA9IFNsb3RQb3NpdGlvbiB7IGxhc3RTbG90UG9z
aXRpb24uY29sdW1uICsgMSwgbGFzdFNsb3RQb3NpdGlvbi5yb3cgfTsKLQotICAgICAgICAvLyBQ
aWNrIHRoZSBuZXh0IGF2YWlsYWJsZSBzbG90IGJ5IGF2b2lkaW5nIHJvdyBhbmQgY29sdW1uIHNw
YW5uZXJzLgotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaWYgKCFtX3Nsb3RN
YXAuY29udGFpbnMoaW5pdGlhbFNsb3RQb3NpdGlvbikpCi0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICArK2luaXRpYWxTbG90UG9zaXRpb24uY29sdW1uOwotICAgICAgICB9Ci0g
ICAgfQotICAgIGF1dG8gY2VsbCA9IG1ha2VVbmlxdWU8Q2VsbD4oY2VsbEJveCwgaW5pdGlhbFNs
b3RQb3NpdGlvbiwgQ2VsbFNwYW4geyBjb2x1bW5TcGFuLCByb3dTcGFuIH0pOwotICAgIC8vIFJv
dyBhbmQgY29sdW1uIHNwYW5uZXJzIGNyZWF0ZSBhZGRpdGlvbmFsIHNsb3RzLgotICAgIGZvciAo
c2l6ZV90IHJvdyA9IDA7IHJvdyA8IHJvd1NwYW47ICsrcm93KSB7Ci0gICAgICAgIGZvciAoYXV0
byBjb2x1bW4gPSBjZWxsLT5zdGFydENvbHVtbigpOyBjb2x1bW4gPCBjZWxsLT5lbmRDb2x1bW4o
KTsgKytjb2x1bW4pIHsKLSAgICAgICAgICAgIGF1dG8gcG9zaXRpb24gPSBTbG90UG9zaXRpb24g
eyBjb2x1bW4sIGNlbGwtPnN0YXJ0Um93KCkgKyByb3cgfTsKLSAgICAgICAgICAgIEFTU0VSVCgh
bV9zbG90TWFwLmNvbnRhaW5zKHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAvLyBUaGlzIHNsb3Qg
aXMgc3Bhbm5lZCBieSBhIGNlbGwgYXQgdGhlIGluaXRpYWwgc2xvdyBwb3NpdGlvbi4KLSAgICAg
ICAgICAgIGF1dG8gaXNDb2x1bW5TcGFubmVkID0gY29sdW1uICE9IGNlbGwtPnN0YXJ0Q29sdW1u
KCk7Ci0gICAgICAgICAgICBhdXRvIGlzUm93U3Bhbm5lZCA9ICEhcm93OwotICAgICAgICAgICAg
bV9zbG90TWFwLmFkZChwb3NpdGlvbiwgbWFrZVVuaXF1ZTxTbG90PigqY2VsbCwgaXNDb2x1bW5T
cGFubmVkLCBpc1Jvd1NwYW5uZWQpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBJbml0aWFs
aXplIGNvbHVtbnMvcm93cyBpZiBuZWVkZWQuCi0gICAgYXV0byBtaXNzaW5nTnVtYmVyT2ZDb2x1
bW5zID0gc3RkOjptYXg8aW50PigwLCBpbml0aWFsU2xvdFBvc2l0aW9uLmNvbHVtbiArIGNvbHVt
blNwYW4gLSBtX2NvbHVtbnMuc2l6ZSgpKTsKLSAgICBmb3IgKGF1dG8gY29sdW1uID0gMDsgY29s
dW1uIDwgbWlzc2luZ051bWJlck9mQ29sdW1uczsgKytjb2x1bW4pCi0gICAgICAgIG1fY29sdW1u
cy5hZGRBbm9ueW1vdXNDb2x1bW4oKTsKLQotICAgIGlmIChjZWxsLT5pc0ZpeGVkV2lkdGgoKSkg
ewotICAgICAgICBmb3IgKGF1dG8gY29sdW1uID0gY2VsbC0+c3RhcnRDb2x1bW4oKTsgY29sdW1u
IDwgY2VsbC0+ZW5kQ29sdW1uKCk7ICsrY29sdW1uKQotICAgICAgICAgICAgbV9jb2x1bW5zLmxp
c3QoKVtjb2x1bW5dLnNldEhhc0ZpeGVkV2lkdGhDZWxsKCk7Ci0gICAgfQotCi0gICAgaWYgKGlz
SW5OZXdSb3cpCi0gICAgICAgIG1fcm93cy5hZGRSb3coY2VsbEJveC5wYXJlbnQoKSk7Ci0KLSAg
ICBtX2NlbGxzLmFkZChXVEZNb3ZlKGNlbGwpKTsKLX0KLQotdm9pZCBUYWJsZUdyaWQ6Omluc2Vy
dENlbGwoY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94LCBjb25zdCBDb250YWluZXJCb3gmIGJl
Zm9yZSkKLXsKLSAgICBVTlVTRURfUEFSQU0oY2VsbEJveCk7Ci0gICAgVU5VU0VEX1BBUkFNKGJl
Zm9yZSk7Ci19Ci0KLXZvaWQgVGFibGVHcmlkOjpyZW1vdmVDZWxsKGNvbnN0IENvbnRhaW5lckJv
eCYgY2VsbEJveCkKLXsKLSAgICBVTlVTRURfUEFSQU0oY2VsbEJveCk7Ci19Ci0KLX0KLX0KLSNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9U
YWJsZUdyaWQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVH
cmlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNWEzZjQ0YmY2MjIxY2U0NjUy
NTk0MDkxM2VjZTEwYjA2YWFjZWYuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUdy
aWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdt
YSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1
ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKLSNpbmNs
dWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLSNpbmNsdWRl
IDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotI2luY2x1ZGUgPHd0Zi9MaXN0SGFzaFNldC5oPgot
I2luY2x1ZGUgPHd0Zi9XZWFrUHRyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFj
ZSBMYXlvdXQgewotY2xhc3MgQm94OwotY2xhc3MgQ29udGFpbmVyQm94OwotCi1jbGFzcyBUYWJs
ZUdyaWQgewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVHcmlkKTsKLXB1YmxpYzoK
LSAgICBUYWJsZUdyaWQoKTsKLQotICAgIHZvaWQgYXBwZW5kQ2VsbChjb25zdCBDb250YWluZXJC
b3gmKTsKLSAgICB2b2lkIGluc2VydENlbGwoY29uc3QgQ29udGFpbmVyQm94JiwgY29uc3QgQ29u
dGFpbmVyQm94JiBiZWZvcmUpOwotICAgIHZvaWQgcmVtb3ZlQ2VsbChjb25zdCBDb250YWluZXJC
b3gmKTsKLQotICAgIHZvaWQgc2V0SG9yaXpvbnRhbFNwYWNpbmcoTGF5b3V0VW5pdCBob3Jpem9u
dGFsU3BhY2luZykgeyBtX2hvcml6b250YWxTcGFjaW5nID0gaG9yaXpvbnRhbFNwYWNpbmc7IH0K
LSAgICBMYXlvdXRVbml0IGhvcml6b250YWxTcGFjaW5nKCkgY29uc3QgeyByZXR1cm4gbV9ob3Jp
em9udGFsU3BhY2luZzsgfQotCi0gICAgdm9pZCBzZXRWZXJ0aWNhbFNwYWNpbmcoTGF5b3V0VW5p
dCB2ZXJ0aWNhbFNwYWNpbmcpIHsgbV92ZXJ0aWNhbFNwYWNpbmcgPSB2ZXJ0aWNhbFNwYWNpbmc7
IH0KLSAgICBMYXlvdXRVbml0IHZlcnRpY2FsU3BhY2luZygpIGNvbnN0IHsgcmV0dXJuIG1fdmVy
dGljYWxTcGFjaW5nOyB9Ci0KLSAgICB2b2lkIHNldENvbGxhcHNlZEJvcmRlcihjb25zdCBFZGdl
cyYgY29sbGFwc2VkQm9yZGVyKSB7IG1fY29sbGFwc2VkQm9yZGVyID0gY29sbGFwc2VkQm9yZGVy
OyB9Ci0gICAgT3B0aW9uYWw8RWRnZXM+IGNvbGxhcHNlZEJvcmRlcigpIGNvbnN0IHsgcmV0dXJu
IG1fY29sbGFwc2VkQm9yZGVyOyB9Ci0KLSAgICB2b2lkIHNldFdpZHRoQ29uc3RyYWludHMoRm9y
bWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2ljV2lkdGhD
b25zdHJhaW50cykgeyBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBpbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzOyB9Ci0gICAgT3B0aW9uYWw8Rm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHM+IHdpZHRoQ29uc3RyYWludHMoKSBjb25zdCB7IHJldHVybiBtX2lu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHM7IH0KLQotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsg
cmV0dXJuIG1fc2xvdE1hcC5pc0VtcHR5KCk7IH0KLSAgICAvLyBDb2x1bW4gcmVwcmVzZW50cyBh
IHZlcnRpY2FsIHNldCBvZiBzbG90cyBpbiB0aGUgZ3JpZC4gQSBjb2x1bW4gaGFzIGhvcml6b250
YWwgcG9zaXRpb24gYW5kIHdpZHRoLgotICAgIGNsYXNzIENvbHVtbiB7Ci0gICAgcHVibGljOgot
ICAgICAgICBDb2x1bW4oY29uc3QgQ29udGFpbmVyQm94Kik7Ci0KLSAgICAgICAgdm9pZCBzZXRM
b2dpY2FsTGVmdChMYXlvdXRVbml0KTsKLSAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgp
IGNvbnN0OwotICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJu
IGxvZ2ljYWxMZWZ0KCkgKyBsb2dpY2FsV2lkdGgoKTsgfQotICAgICAgICB2b2lkIHNldExvZ2lj
YWxXaWR0aChMYXlvdXRVbml0KTsKLSAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBj
b25zdDsKLQotICAgICAgICBib29sIGlzRml4ZWRXaWR0aCgpIGNvbnN0OwotCi0gICAgICAgIHZv
aWQgc2V0SGFzRml4ZWRXaWR0aENlbGwoKSB7IG1faGFzRml4ZWRXaWR0aENlbGwgPSB0cnVlOyB9
Ci0gICAgICAgIGNvbnN0IENvbnRhaW5lckJveCogYm94KCkgY29uc3QgeyByZXR1cm4gbV9sYXlv
dXRCb3guZ2V0KCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgaGFzRml4ZWRXaWR0
aENlbGwoKSBjb25zdCB7IHJldHVybiBtX2hhc0ZpeGVkV2lkdGhDZWxsOyB9Ci0KLSAgICAgICAg
TGF5b3V0VW5pdCBtX2NvbXB1dGVkTG9naWNhbFdpZHRoOwotICAgICAgICBMYXlvdXRVbml0IG1f
Y29tcHV0ZWRMb2dpY2FsTGVmdDsKLSAgICAgICAgV2Vha1B0cjxjb25zdCBDb250YWluZXJCb3g+
IG1fbGF5b3V0Qm94OwotICAgICAgICBib29sIG1faGFzRml4ZWRXaWR0aENlbGwgeyBmYWxzZSB9
OwotCi0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICAgICAgYm9vbCBtX2hhc0NvbXB1dGVkV2lkdGgg
eyBmYWxzZSB9OwotICAgICAgICBib29sIG1faGFzQ29tcHV0ZWRMZWZ0IHsgZmFsc2UgfTsKLSNl
bmRpZgotICAgIH07Ci0KLSAgICBjbGFzcyBDb2x1bW5zIHsKLSAgICBwdWJsaWM6Ci0gICAgICAg
IHVzaW5nIENvbHVtbkxpc3QgPSBWZWN0b3I8Q29sdW1uPjsKLSAgICAgICAgQ29sdW1uTGlzdCYg
bGlzdCgpIHsgcmV0dXJuIG1fY29sdW1uTGlzdDsgfQotICAgICAgICBjb25zdCBDb2x1bW5MaXN0
JiBsaXN0KCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0OyB9Ci0gICAgICAgIHNpemVfdCBz
aXplKCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0LnNpemUoKTsgfQotCi0gICAgICAgIHZv
aWQgYWRkQ29sdW1uKGNvbnN0IENvbnRhaW5lckJveCYpOwotICAgICAgICB2b2lkIGFkZEFub255
bW91c0NvbHVtbigpOwotCi0gICAgICAgIExheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3Qg
eyByZXR1cm4gbV9jb2x1bW5MaXN0Lmxhc3QoKS5sb2dpY2FsUmlnaHQoKSAtIG1fY29sdW1uTGlz
dC5maXJzdCgpLmxvZ2ljYWxMZWZ0KCk7IH0KLSAgICAgICAgYm9vbCBoYXNGaXhlZENvbHVtbnNP
bmx5KCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBDb2x1bW5MaXN0IG1fY29sdW1u
TGlzdDsKLSAgICB9OwotCi0gICAgY2xhc3MgUm93IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFJv
dyhjb25zdCBDb250YWluZXJCb3gmKTsKLQotICAgICAgICB2b2lkIHNldExvZ2ljYWxUb3AoTGF5
b3V0VW5pdCBsb2dpY2FsVG9wKSB7IG1fbG9naWNhbFRvcCA9IGxvZ2ljYWxUb3A7IH0KLSAgICAg
ICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsVG9wOyB9
Ci0gICAgICAgIExheW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2lj
YWxUb3AoKSArIGxvZ2ljYWxIZWlnaHQoKTsgfQotCi0gICAgICAgIHZvaWQgc2V0TG9naWNhbEhl
aWdodChMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQpIHsgbV9sb2dpY2FsSGVpZ2h0ID0gbG9naWNh
bEhlaWdodDsgfQotICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQoKSBjb25zdCB7IHJl
dHVybiBtX2xvZ2ljYWxIZWlnaHQ7IH0KLQotICAgICAgICB2b2lkIHNldEJhc2VsaW5lKElubGlu
ZUxheW91dFVuaXQgYmFzZWxpbmUpIHsgbV9iYXNlbGluZSA9IGJhc2VsaW5lOyB9Ci0gICAgICAg
IElubGluZUxheW91dFVuaXQgYmFzZWxpbmUoKSBjb25zdCB7IHJldHVybiBtX2Jhc2VsaW5lOyB9
Ci0KLSAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25zdCB7IHJldHVybiAqbV9s
YXlvdXRCb3guZ2V0KCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIExheW91dFVuaXQgbV9s
b2dpY2FsVG9wOwotICAgICAgICBMYXlvdXRVbml0IG1fbG9naWNhbEhlaWdodDsKLSAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OwotICAgICAgICBXZWFrUHRyPGNvbnN0
IENvbnRhaW5lckJveD4gbV9sYXlvdXRCb3g7Ci0gICAgfTsKLQotICAgIGNsYXNzIFJvd3Mgewot
ICAgIHB1YmxpYzoKLSAgICAgICAgdXNpbmcgUm93TGlzdCA9IFZlY3RvcjxSb3c+OwotICAgICAg
ICBSb3dMaXN0JiBsaXN0KCkgeyByZXR1cm4gbV9yb3dMaXN0OyB9Ci0gICAgICAgIGNvbnN0IFJv
d0xpc3QmIGxpc3QoKSBjb25zdCB7IHJldHVybiBtX3Jvd0xpc3Q7IH0KLQotICAgICAgICB2b2lk
IGFkZFJvdyhjb25zdCBDb250YWluZXJCb3gmKTsKLQotICAgICAgICBzaXplX3Qgc2l6ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fcm93TGlzdC5zaXplKCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAg
IFJvd0xpc3QgbV9yb3dMaXN0OwotICAgIH07Ci0KLSAgICAvLyBDZWxsIHJlcHJlc2VudHMgYSA8
dGQ+IG9yIDx0aD4uIEl0IGNhbiBzcGFuIG11bHRpcGxlIHNsb3RzIGluIHRoZSBncmlkLgotICAg
IGNsYXNzIENlbGwgOiBwdWJsaWMgQ2FuTWFrZVdlYWtQdHI8Q2VsbD4gewotICAgICAgICBXVEZf
TUFLRV9JU09fQUxMT0NBVEVEX0lOTElORShDZWxsKTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIENl
bGwoY29uc3QgQ29udGFpbmVyQm94JiwgU2xvdFBvc2l0aW9uLCBDZWxsU3Bhbik7Ci0KLSAgICAg
ICAgc2l6ZV90IHN0YXJ0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbi5jb2x1bW47
IH0KLSAgICAgICAgc2l6ZV90IGVuZENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb24u
Y29sdW1uICsgbV9zcGFuLmNvbHVtbjsgfQotCi0gICAgICAgIHNpemVfdCBzdGFydFJvdygpIGNv
bnN0IHsgcmV0dXJuIG1fcG9zaXRpb24ucm93OyB9Ci0gICAgICAgIHNpemVfdCBlbmRSb3coKSBj
b25zdCB7IHJldHVybiBtX3Bvc2l0aW9uLnJvdyArIG1fc3Bhbi5yb3c7IH0KLQotICAgICAgICBz
aXplX3QgY29sdW1uU3BhbigpIGNvbnN0IHsgcmV0dXJuIG1fc3Bhbi5jb2x1bW47IH0KLSAgICAg
ICAgc2l6ZV90IHJvd1NwYW4oKSBjb25zdCB7IHJldHVybiBtX3NwYW4ucm93OyB9Ci0KLSAgICAg
ICAgU2xvdFBvc2l0aW9uIHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbjsgfQot
ICAgICAgICBDZWxsU3BhbiBzcGFuKCkgY29uc3QgeyByZXR1cm4gbV9zcGFuOyB9Ci0KLSAgICAg
ICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKSB7IG1fYmFzZWxp
bmUgPSBiYXNlbGluZTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKCkgY29u
c3QgeyByZXR1cm4gbV9iYXNlbGluZTsgfQotCi0gICAgICAgIGJvb2wgaXNGaXhlZFdpZHRoKCkg
Y29uc3Q7Ci0KLSAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25zdCB7IHJldHVy
biAqbV9sYXlvdXRCb3guZ2V0KCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFdlYWtQdHI8
Y29uc3QgQ29udGFpbmVyQm94PiBtX2xheW91dEJveDsKLSAgICAgICAgU2xvdFBvc2l0aW9uIG1f
cG9zaXRpb247Ci0gICAgICAgIENlbGxTcGFuIG1fc3BhbjsKLSAgICAgICAgSW5saW5lTGF5b3V0
VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OwotICAgIH07Ci0KLSAgICBjbGFzcyBTbG90IHsKLSAgICBw
dWJsaWM6Ci0gICAgICAgIFdURl9NQUtFX1NUUlVDVF9GQVNUX0FMTE9DQVRFRDsKLSAgICAgICAg
U2xvdCgpID0gZGVmYXVsdDsKLSAgICAgICAgU2xvdChDZWxsJiwgYm9vbCBpc0NvbHVtblNwYW5u
ZWQsIGJvb2wgaXNSb3dTcGFubmVkKTsKLQotICAgICAgICBjb25zdCBDZWxsJiBjZWxsKCkgY29u
c3QgeyByZXR1cm4gKm1fY2VsbDsgfQotICAgICAgICBDZWxsJiBjZWxsKCkgeyByZXR1cm4gKm1f
Y2VsbDsgfQotCi0gICAgICAgIGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzJiB3aWR0aENvbnN0cmFpbnRzKCkgY29uc3QgeyByZXR1cm4gbV93aWR0aENv
bnN0cmFpbnRzOyB9Ci0gICAgICAgIHZvaWQgc2V0V2lkdGhDb25zdHJhaW50cyhjb25zdCBGb3Jt
YXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgd2lkdGhDb25zdHJhaW50
cykgeyBtX3dpZHRoQ29uc3RyYWludHMgPSB3aWR0aENvbnN0cmFpbnRzOyB9Ci0KLSAgICAgICAg
Ly8gSW5pdGlhbCBzbG90IHBvc2l0aW9uIGZvciBhIHNwYW5uaW5nIGNlbGwuCi0gICAgICAgIC8v
IDx0ZD48L3RkPjx0ZCBjb2xzcGFuPTI+PC90ZD4gWzEsIDBdIHNsb3QgaGFzIGNvbHVtbiBzcGFu
IG9mIDIuCi0gICAgICAgIGJvb2wgaGFzQ29sdW1uU3BhbigpIGNvbnN0IHsgcmV0dXJuIG1fY2Vs
bC0+Y29sdW1uU3BhbigpID4gMSAmJiAhaXNDb2x1bW5TcGFubmVkKCk7IH0KLSAgICAgICAgYm9v
bCBoYXNSb3dTcGFuKCkgY29uc3QgeyByZXR1cm4gbV9jZWxsLT5yb3dTcGFuKCkgPiAxICYmICFp
c1Jvd1NwYW5uZWQoKTsgfQotCi0gICAgICAgIC8vIE5vbi1pbml0aWFsIHNwYW5uZWQgc2xvdC4K
LSAgICAgICAgLy8gPHRkPjwvdGQ+PHRkIGNvbHNwYW49Mj48L3RkPiBbMiwgMF0gc2xvdCBpcyBj
b2x1bW4gc3Bhbm5lZCBieSBbMSwgMF0uCi0gICAgICAgIC8vIDx0ZD48L3RkPjx0ZD48L3RkPjx0
ZD48L3RkPgotICAgICAgICBib29sIGlzQ29sdW1uU3Bhbm5lZCgpIGNvbnN0IHsgcmV0dXJuIG1f
aXNDb2x1bW5TcGFubmVkOyB9Ci0gICAgICAgIGJvb2wgaXNSb3dTcGFubmVkKCkgY29uc3QgeyBy
ZXR1cm4gbV9pc1Jvd1NwYW5uZWQ7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFdlYWtQdHI8
Q2VsbD4gbV9jZWxsOwotICAgICAgICBib29sIG1faXNDb2x1bW5TcGFubmVkIHsgZmFsc2UgfTsK
LSAgICAgICAgYm9vbCBtX2lzUm93U3Bhbm5lZCB7IGZhbHNlIH07Ci0gICAgICAgIEZvcm1hdHRp
bmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIG1fd2lkdGhDb25zdHJhaW50czsK
LSAgICB9OwotCi0gICAgY29uc3QgQ29sdW1ucyYgY29sdW1ucygpIGNvbnN0IHsgcmV0dXJuIG1f
Y29sdW1uczsgfQotICAgIENvbHVtbnMmIGNvbHVtbnMoKSB7IHJldHVybiBtX2NvbHVtbnM7IH0K
LQotICAgIGNvbnN0IFJvd3MmIHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3M7IH0KLSAgICBS
b3dzJiByb3dzKCkgeyByZXR1cm4gbV9yb3dzOyB9Ci0KLSAgICB1c2luZyBDZWxscyA9IFdURjo6
TGlzdEhhc2hTZXQ8c3RkOjp1bmlxdWVfcHRyPENlbGw+PjsKLSAgICBDZWxscyYgY2VsbHMoKSB7
IHJldHVybiBtX2NlbGxzOyB9Ci0KLSAgICBTbG90KiBzbG90KFNsb3RQb3NpdGlvbik7Ci0gICAg
Y29uc3QgU2xvdCogc2xvdChTbG90UG9zaXRpb24gcG9zaXRpb24pIGNvbnN0IHsgcmV0dXJuIG1f
c2xvdE1hcC5nZXQocG9zaXRpb24pOyB9Ci0gICAgYm9vbCBpc1NwYW5uZWQoU2xvdFBvc2l0aW9u
KTsKLQotcHJpdmF0ZToKLSAgICB1c2luZyBTbG90TWFwID0gV1RGOjpIYXNoTWFwPFNsb3RQb3Np
dGlvbiwgc3RkOjp1bmlxdWVfcHRyPFNsb3Q+PjsKLQotICAgIENvbHVtbnMgbV9jb2x1bW5zOwot
ICAgIFJvd3MgbV9yb3dzOwotICAgIENlbGxzIG1fY2VsbHM7Ci0gICAgU2xvdE1hcCBtX3Nsb3RN
YXA7Ci0KLSAgICBMYXlvdXRVbml0IG1faG9yaXpvbnRhbFNwYWNpbmc7Ci0gICAgTGF5b3V0VW5p
dCBtX3ZlcnRpY2FsU3BhY2luZzsKLSAgICBPcHRpb25hbDxGb3JtYXR0aW5nQ29udGV4dDo6SW50
cmluc2ljV2lkdGhDb25zdHJhaW50cz4gbV9pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOwotICAg
IE9wdGlvbmFsPEVkZ2VzPiBtX2NvbGxhcHNlZEJvcmRlcjsKLX07Ci0KLX0KLX0KLQotI2VuZGlm
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxl
TGF5b3V0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVM
YXlvdXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM1MmM1YTE3ZjhjMGIz
ZDNkMjQ0ZTkyNWE3ZWYyNDgxOThhOGQzLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFi
bGVMYXlvdXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgot
ICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgot
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAq
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwot
Ci0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5o
IgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJM
YXlvdXRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgotCi1uYW1lc3BhY2Ug
V2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RS
L2Nzcy10YWJsZXMtMy8jdGFibGUtbGF5b3V0LWFsZ29yaXRobQotVGFibGVGb3JtYXR0aW5nQ29u
dGV4dDo6VGFibGVMYXlvdXQ6OlRhYmxlTGF5b3V0KGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRl
eHQmIGZvcm1hdHRpbmdDb250ZXh0LCBjb25zdCBUYWJsZUdyaWQmIGdyaWQpCi0gICAgOiBtX2Zv
cm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0KQotICAgICwgbV9ncmlkKGdyaWQpCi17
Ci19Ci0KLXN0cnVjdCBDb2x1bW5TcGFuIHsKLSAgICBzdGF0aWMgc2l6ZV90IGhhc1NwYW4oY29u
c3QgVGFibGVHcmlkOjpTbG90JiBzbG90KSB7IHJldHVybiBzbG90Lmhhc0NvbHVtblNwYW4oKTsg
fQotICAgIHN0YXRpYyBzaXplX3QgaXNTcGFubmVkKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xv
dCkgeyByZXR1cm4gc2xvdC5pc0NvbHVtblNwYW5uZWQoKTsgfQotCi0gICAgc3RhdGljIHNpemVf
dCBzcGFuQ291bnQoY29uc3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBjZWxsLmNv
bHVtblNwYW4oKTsgfQotICAgIHN0YXRpYyBzaXplX3Qgc3RhcnRTcGFuKGNvbnN0IFRhYmxlR3Jp
ZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5zdGFydENvbHVtbigpOyB9Ci0gICAgc3RhdGlj
IHNpemVfdCBlbmRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2Vs
bC5lbmRDb2x1bW4oKTsgfQotCi0gICAgc3RhdGljIHNpemVfdCBpbmRleChzaXplX3QgY29sdW1u
SW5kZXgsIHNpemVfdCAvKnJvd0luZGV4Ki8pIHsgcmV0dXJuIGNvbHVtbkluZGV4OyB9Ci0gICAg
c3RhdGljIHNpemVfdCBzaXplKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5j
b2x1bW5zKCkuc2l6ZSgpOyB9Ci0KLSAgICBzdGF0aWMgTGF5b3V0VW5pdCBzcGFjaW5nKGNvbnN0
IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5ob3Jpem9udGFsU3BhY2luZygpOyB9Ci19
OwotCi1zdHJ1Y3QgUm93U3BhbiB7Ci0gICAgc3RhdGljIHNpemVfdCBoYXNTcGFuKGNvbnN0IFRh
YmxlR3JpZDo6U2xvdCYgc2xvdCkgeyByZXR1cm4gc2xvdC5oYXNSb3dTcGFuKCk7IH0KLSAgICBz
dGF0aWMgc2l6ZV90IGlzU3Bhbm5lZChjb25zdCBUYWJsZUdyaWQ6OlNsb3QmIHNsb3QpIHsgcmV0
dXJuIHNsb3QuaXNSb3dTcGFubmVkKCk7IH0KLQotICAgIHN0YXRpYyBzaXplX3Qgc3BhbkNvdW50
KGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5yb3dTcGFuKCk7IH0K
LSAgICBzdGF0aWMgc2l6ZV90IHN0YXJ0U3Bhbihjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwp
IHsgcmV0dXJuIGNlbGwuc3RhcnRSb3coKTsgfQotICAgIHN0YXRpYyBzaXplX3QgZW5kU3Bhbihj
b25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJuIGNlbGwuZW5kUm93KCk7IH0KLQot
ICAgIHN0YXRpYyBzaXplX3QgaW5kZXgoc2l6ZV90IC8qY29sdW1uSW5kZXgqLywgc2l6ZV90IHJv
d0luZGV4KSB7IHJldHVybiByb3dJbmRleDsgfQotICAgIHN0YXRpYyBzaXplX3Qgc2l6ZShjb25z
dCBUYWJsZUdyaWQmIGdyaWQpIHsgcmV0dXJuIGdyaWQucm93cygpLnNpemUoKTsgfQotCi0gICAg
c3RhdGljIExheW91dFVuaXQgc3BhY2luZyhjb25zdCBUYWJsZUdyaWQmIGdyaWQpIHsgcmV0dXJu
IGdyaWQudmVydGljYWxTcGFjaW5nKCk7IH0KLX07Ci0KLXN0cnVjdCBHcmlkU3BhY2UgewotICAg
IGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICF2YWx1ZTsgfQotCi0gICAgLy8gSW5pdGlh
bCB3aWR0aC9oZWlnaHQgZm9yIGNvbHVtbi9yb3cgd2Ugc3RhcnQgdGhlIGRpc3RyaWJ1dGlvbiB3
aWR0aCAodXN1YWxseSBhIG1pbnVtdW0gd2lkdGgpLgotICAgIGZsb2F0IHZhbHVlIHsgMCB9Owot
ICAgIC8vIFRoZSBiYXNlIHRvIGNvbXB1dGUgdGhlIGRpc3RyaWJ1dGlvbiByYXRpby4gSXQgbm9y
bWFsbHkgbWF0Y2hlcyB0aGUgW3ZhbHVlXSBidXQgaW4gc29tZSBjYXNlcyB3ZSB1c2UgdGhlIG1h
eGltdW0gdmFsdWUgdG8gZGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UuIAotICAgIGZsb2F0IGRp
c3RyaWJ1dGlvbkJhc2UgeyAwIH07Ci19OwotCi1pbmxpbmUgc3RhdGljIEdyaWRTcGFjZSBtYXgo
Y29uc3QgR3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCi17Ci0gICAgcmV0dXJuIHsg
c3RkOjptYXgoYS52YWx1ZSwgYi52YWx1ZSksIHN0ZDo6bWF4KGEuZGlzdHJpYnV0aW9uQmFzZSwg
Yi5kaXN0cmlidXRpb25CYXNlKSB9OwotfQotCi1pbmxpbmUgc3RhdGljIEdyaWRTcGFjZSYgb3Bl
cmF0b3ItKEdyaWRTcGFjZSYgYSwgY29uc3QgR3JpZFNwYWNlJiBiKQotewotICAgIGEudmFsdWUg
PSBzdGQ6Om1heCgwLjBmLCBhLnZhbHVlIC0gYi52YWx1ZSk7Ci0gICAgYS5kaXN0cmlidXRpb25C
YXNlID0gc3RkOjptYXgoMC4wZiwgYS5kaXN0cmlidXRpb25CYXNlIC0gYi5kaXN0cmlidXRpb25C
YXNlKTsKLSAgICByZXR1cm4gYTsKLX0KLQotaW5saW5lIHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJh
dG9yKz0oR3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCi17Ci0gICAgYS52YWx1ZSAr
PSBiLnZhbHVlOwotICAgIGEuZGlzdHJpYnV0aW9uQmFzZSArPSBiLmRpc3RyaWJ1dGlvbkJhc2U7
Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLWlubGluZSBzdGF0aWMgR3JpZFNwYWNlJiBvcGVyYXRvci09
KEdyaWRTcGFjZSYgYSwgY29uc3QgR3JpZFNwYWNlJiBiKQotewotICAgIHJldHVybiBhIC0gYjsK
LX0KLQotaW5saW5lIHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJhdG9yLyhHcmlkU3BhY2UmIGEsIHVu
c2lnbmVkIHZhbHVlKQotewotICAgIGEudmFsdWUgLz0gdmFsdWU7Ci0gICAgYS5kaXN0cmlidXRp
b25CYXNlIC89IHZhbHVlOwotICAgIHJldHVybiBhOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUg
U3BhblR5cGU+Ci1zdGF0aWMgVmVjdG9yPExheW91dFVuaXQ+IGRpc3RyaWJ1dGVBdmFpbGFibGVT
cGFjZShjb25zdCBUYWJsZUdyaWQmIGdyaWQsIExheW91dFVuaXQgYXZhaWxhYmxlU3BhY2UsIGNv
bnN0IFdURjo6RnVuY3Rpb248R3JpZFNwYWNlKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYsIHNpemVf
dCk+JiBzbG90U3BhY2UpCi17Ci0gICAgc3RydWN0IFJlc29sdmVkSXRlbSB7Ci0gICAgICAgIEdy
aWRTcGFjZSBzbG90U3BhY2U7Ci0gICAgICAgIGJvb2wgaXNGaXhlZCB7IGZhbHNlIH07Ci0gICAg
fTsKLQotICAgIGF1dG8mIGNvbHVtbnMgPSBncmlkLmNvbHVtbnMoKTsKLSAgICBhdXRvJiByb3dz
ID0gZ3JpZC5yb3dzKCk7Ci0gICAgLy8gMS4gQ29sbGVjdCB0aGUgbm9uLXNwYW5uaW5nIHNwYWNl
cyBmaXJzdC4gVGhleSBhcmUgdXNlZCBmb3IgdGhlIGZpbmFsIGRpc3RyaWJ1dGlvbiBhcyB3ZWxs
IGFzIGZvciBkaXN0cmlidXRpbmcgdGhlIHNwYW5uaW5nIHNwYWNlLgotICAgIFZlY3RvcjxPcHRp
b25hbDxSZXNvbHZlZEl0ZW0+PiByZXNvbHZlZEl0ZW1zKFNwYW5UeXBlOjpzaXplKGdyaWQpKTsK
LSAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5z
aXplKCk7ICsrY29sdW1uSW5kZXgpIHsKLSAgICAgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAw
OyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7Ci0gICAgICAgICAgICBhdXRv
JiBzbG90ID0gKmdyaWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsKLSAgICAgICAg
ICAgIGlmIChTcGFuVHlwZTo6aGFzU3BhbihzbG90KSB8fCBTcGFuVHlwZTo6aXNTcGFubmVkKHNs
b3QpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYXV0byBpbmRleCA9
IFNwYW5UeXBlOjppbmRleChjb2x1bW5JbmRleCwgcm93SW5kZXgpOwotICAgICAgICAgICAgaWYg
KCFyZXNvbHZlZEl0ZW1zW2luZGV4XSkKLSAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1zW2lu
ZGV4XSA9IFJlc29sdmVkSXRlbSB7IH07Ci0gICAgICAgICAgICByZXNvbHZlZEl0ZW1zW2luZGV4
XS0+c2xvdFNwYWNlID0gbWF4KHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90U3BhY2UsIHNsb3RT
cGFjZShzbG90LCBpbmRleCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gMi4gQ29sbGVj
dCB0aGUgc3Bhbm5pbmcgY2VsbHMuCi0gICAgc3RydWN0IFNwYW5uaW5nQ2VsbCB7Ci0gICAgICAg
IFNsb3RQb3NpdGlvbiBwb3NpdGlvbjsKLSAgICAgICAgR3JpZFNwYWNlIHVucmVzb2x2ZWRTcGFj
ZTsKLSAgICB9OwotICAgIFZlY3RvcjxTcGFubmluZ0NlbGw+IHNwYW5uaW5nQ2VsbHM7Ci0gICAg
Zm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0lu
ZGV4KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXgg
PCBjb2x1bW5zLnNpemUoKTsgKytjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgYXV0byYgc2xv
dCA9ICpncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICBp
ZiAoU3BhblR5cGU6Omhhc1NwYW4oc2xvdCkpCi0gICAgICAgICAgICAgICAgc3Bhbm5pbmdDZWxs
cy5hcHBlbmQoeyB7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9LCBzbG90U3BhY2Uoc2xvdCwgU3Bh
blR5cGU6OmluZGV4KGNvbHVtbkluZGV4LCByb3dJbmRleCkpIH0pOwotICAgICAgICB9Ci0gICAg
fQotICAgIC8vIFdlIG5lZWQgdGhlc2Ugc3Bhbm5pbmcgY2VsbHMgaW4gdGhlIG9yZGVyIG9mIHRo
ZSBudW1iZXIgb2YgY29sdW1ucy9yb3dzIHRoZXkgc3BhbiBzbyB0aGF0Ci0gICAgLy8gd2UgY2Fu
IHJlc29sdmUgb3ZlcmxhcHBpbmcgc3BhbnMgc3RhcnRpbmcgd2l0aCB0aGUgc2hvcnRlciBvbmVz
IGUuZy4KLSAgICAvLyA8dGQgY29sc3Bhbj00PiNhPC90ZD48dGQ+I2I8L3RkPgotICAgIC8vIDx0
ZCBjb2xzcGFuPTI+I2M8L3RkPjx0ZCBjb2xzcGFuPTM+I2Q8L3RkPgotICAgIHN0ZDo6c29ydChz
cGFubmluZ0NlbGxzLmJlZ2luKCksIHNwYW5uaW5nQ2VsbHMuZW5kKCksIFsmXSAoYXV0byYgYSwg
YXV0byYgYikgewotICAgICAgICByZXR1cm4gU3BhblR5cGU6OnNwYW5Db3VudChncmlkLnNsb3Qo
YS5wb3NpdGlvbiktPmNlbGwoKSkgPCBTcGFuVHlwZTo6c3BhbkNvdW50KGdyaWQuc2xvdChiLnBv
c2l0aW9uKS0+Y2VsbCgpKTsKLSAgICB9KTsKLQotICAgIC8vIDMuIERpc3RyaWJ1dGUgdGhlIHNw
YW5uaW5nIGNlbGxzJyBtaW1pbXVtIHNwYWNlIGFjcm9zcyB0aGUgY29sdW1ucy9yb3dzIHVzaW5n
IHRoZSBub24tc3Bhbm5pbmcgc3BhY2VzLgotICAgIC8vIGUuZy4gWyAxIF1bIDUgXVsgMSBdCi0g
ICAgLy8gICAgICBbICAgIDkgICBdWyAxIF0KLSAgICAvLyBUaGUgaW5pdGlhbCB3aWR0aHMgYXJl
OiBbIDIgXVsgNyBdWyAxIF0KLSAgICBmb3IgKGF1dG8gc3Bhbm5pbmdDZWxsIDogc3Bhbm5pbmdD
ZWxscykgewotICAgICAgICBhdXRvJiBjZWxsID0gZ3JpZC5zbG90KHNwYW5uaW5nQ2VsbC5wb3Np
dGlvbiktPmNlbGwoKTsKLSAgICAgICAgYXV0byB1bnJlc29sdmVkU3Bhbm5pbmdTcGFjZSA9IHNw
YW5uaW5nQ2VsbC51bnJlc29sdmVkU3BhY2U7Ci0gICAgICAgIGlmICghcmVzb2x2ZWRJdGVtc1tT
cGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpXSB8fCAhcmVzb2x2ZWRJdGVtc1tTcGFuVHlwZTo6ZW5k
U3BhbihjZWxsKSAtIDFdKSB7Ci0gICAgICAgICAgICAvLyA8dGQgY29sc3Bhbj00PiNhPC90ZD48
dGQ+I2I8L3RkPgotICAgICAgICAgICAgLy8gPHRkIGNvbHNwYW49Mj4jYzwvdGQ+PHRkIGNvbHNw
YW49Mz4jZDwvdGQ+Ci0gICAgICAgICAgICAvLyBVbnJlc29sdmVkIGNvbHVtbnMgYXJlOiAxIDIg
MyA0Ci0gICAgICAgICAgICAvLyAxLiBUYWtlIGNvbHNwYW49MiAoc2hvcnRlc3Qgc3BhbikgYW5k
IHJlc29sdmUgY29sdW1uIDEgYW5kIDIKLSAgICAgICAgICAgIC8vIDIuIFRha2UgY29sc3Bhbj0z
IGFuZCByZXNvbHZlIGNvbHVtbiAzIGFuZCA0ICg1IGlzIHJlc29sdmVkIGJlY2F1c2UgaXQgYWxy
ZWFkeSBoYXMgYSBub24tc3Bhbm5pbmcgY2VsbCkuCi0gICAgICAgICAgICAvLyAzLiBjb2xzcGFu
PTQgbmVlZHMgbm8gcmVzb2x2aW5nIGJlY2F1c2UgYWxsIHRoZSBzcGFubmVkIGNvbHVtbnMgKDEg
MiAzIDQpIGhhdmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkLgotICAgICAgICAgICAgYXV0byB1bnJl
c29sdmVkQ29sdW1uQ291bnQgPSBjZWxsLmNvbHVtblNwYW4oKTsKLSAgICAgICAgICAgIGZvciAo
YXV0byBzcGFuSW5kZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpOyBzcGFuSW5kZXggPCBT
cGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBp
ZiAoIXJlc29sdmVkSXRlbXNbc3BhbkluZGV4XSkKLSAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHVucmVzb2x2ZWRDb2x1bW5Db3VudCk7Ci0gICAg
ICAgICAgICAgICAgLS11bnJlc29sdmVkQ29sdW1uQ291bnQ7Ci0gICAgICAgICAgICAgICAgdW5y
ZXNvbHZlZFNwYW5uaW5nU3BhY2UgLT0gcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3Bh
Y2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBU1NFUlQodW5yZXNvbHZlZENvbHVtbkNv
dW50KTsKLSAgICAgICAgICAgIGF1dG8gZXF1YWxTcGFjZUZvclNwYW5uZWRDb2x1bW5zID0gdW5y
ZXNvbHZlZFNwYW5uaW5nU3BhY2UgLyB1bnJlc29sdmVkQ29sdW1uQ291bnQ7Ci0gICAgICAgICAg
ICBmb3IgKGF1dG8gc3BhbkluZGV4ID0gU3BhblR5cGU6OnN0YXJ0U3BhbihjZWxsKTsgc3Bhbklu
ZGV4IDwgU3BhblR5cGU6OmVuZFNwYW4oY2VsbCk7ICsrc3BhbkluZGV4KSB7Ci0gICAgICAgICAg
ICAgICAgaWYgKHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XSkKLSAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdID0gUmVz
b2x2ZWRJdGVtIHsgZXF1YWxTcGFjZUZvclNwYW5uZWRDb2x1bW5zLCBmYWxzZSB9OwotICAgICAg
ICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gMS4gQ29sbGVjdCB0aGUg
bm9uLXNwYW5pbmcgcmVzb2x2ZWQgc3BhY2VzLgotICAgICAgICAgICAgLy8gMi4gRGlzdHJpYnV0
ZSB0aGUgZXh0cmEgc3BhY2UgYW1vbmcgdGhlIHNwYW5uZWQgY29sdW1ucy9yb3dzIGJhc2VkIG9u
IHRoZSByZXNvbHZlZCBzcGFjZSB2YWx1ZXMuCi0gICAgICAgICAgICAvLyBlLmcuIHNwYW5uaW5n
IHdpZHRoOiBbICAgOSAgIF0uIFJlc29sdmVkIHdpZHRocyBmb3IgdGhlIHNwYW5uZWQgY29sdW1u
czogWyAxIF0gWyAyIF0KLSAgICAgICAgICAgIC8vIE5ldyByZXNvbHZlZCB3aWR0aHM6IFsgMyBd
IFsgNiBdLgotICAgICAgICAgICAgYXV0byByZXNvbHZlZFNwYW5uaW5nU3BhY2UgPSBHcmlkU3Bh
Y2UgeyB9OwotICAgICAgICAgICAgZm9yIChhdXRvIHNwYW5JbmRleCA9IFNwYW5UeXBlOjpzdGFy
dFNwYW4oY2VsbCk7IHNwYW5JbmRleCA8IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwpOyArK3NwYW5J
bmRleCkKLSAgICAgICAgICAgICAgICByZXNvbHZlZFNwYW5uaW5nU3BhY2UgKz0gcmVzb2x2ZWRJ
dGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2U7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRTcGFu
bmluZ1NwYWNlLnZhbHVlID49IHVucmVzb2x2ZWRTcGFubmluZ1NwYWNlLnZhbHVlKSB7Ci0gICAg
ICAgICAgICAgICAgLy8gVGhlIHNwYW5uaW5nIGNlbGwgZml0cyB0aGUgc3Bhbm5lZCBjb2x1bW5z
L3Jvd3MganVzdCBmaW5lLiBOb3RoaW5nIHRvIGRpc3RyaWJ1dGUuCi0gICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIHNwYWNpbmcgPSBTcGFu
VHlwZTo6c3BhY2luZyhncmlkKSAqIChTcGFuVHlwZTo6c3BhbkNvdW50KGNlbGwpIC0gMSk7Ci0g
ICAgICAgICAgICBhdXRvIHNwYWNlVG9EaXN0cmlidXRlID0gdW5yZXNvbHZlZFNwYW5uaW5nU3Bh
Y2UgLSBHcmlkU3BhY2UgeyBzcGFjaW5nLCBzcGFjaW5nIH0gLSByZXNvbHZlZFNwYW5uaW5nU3Bh
Y2U7IAotICAgICAgICAgICAgaWYgKCFzcGFjZVRvRGlzdHJpYnV0ZS5pc0VtcHR5KCkpIHsKLSAg
ICAgICAgICAgICAgICBhdXRvIGRpc3RyaWJ1dGlvblJhdGlvID0gc3BhY2VUb0Rpc3RyaWJ1dGUu
ZGlzdHJpYnV0aW9uQmFzZSAvIHJlc29sdmVkU3Bhbm5pbmdTcGFjZS5kaXN0cmlidXRpb25CYXNl
OwotICAgICAgICAgICAgICAgIGZvciAoYXV0byBzcGFuSW5kZXggPSBTcGFuVHlwZTo6c3RhcnRT
cGFuKGNlbGwpOyBzcGFuSW5kZXggPCBTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5k
ZXgpCi0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xvdFNw
YWNlICs9IEdyaWRTcGFjZSB7IHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xvdFNwYWNlLnZh
bHVlICogZGlzdHJpYnV0aW9uUmF0aW8sIHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xvdFNw
YWNlLmRpc3RyaWJ1dGlvbkJhc2UgKiBkaXN0cmlidXRpb25SYXRpb307Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gNC4gRGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2Ug
dXNpbmcgdGhlIGZpbmFsIHJlc29sdmVkIHdpZHRocy4KLSNpZiBBU1NFUlRfRU5BQkxFRAotICAg
IC8vIFdlIGhhdmUgdG8gaGF2ZSBhbGwgdGhlIHNwYWNlcyByZXNvbHZlZCBhdCB0aGlzIHBvaW50
LgotICAgIGZvciAoYXV0byYgcmVzb2x2ZWRJdGVtIDogcmVzb2x2ZWRJdGVtcykKLSAgICAgICAg
QVNTRVJUKHJlc29sdmVkSXRlbSk7Ci0jZW5kaWYKLSAgICAvLyBGaXhlZCBzaXplIGNlbGxzIGRv
bid0IHBhcnRpY2lwYXRlIGluIGF2YWlsYWJsZSBzcGFjZSBkaXN0cmlidXRpb24uCi0gICAgYXV0
byBhZGp1c3RhYmxlZFNwYWNlID0gR3JpZFNwYWNlIHsgfTsKLSAgICBmb3IgKGF1dG8mIHJlc29s
dmVkSXRlbSA6IHJlc29sdmVkSXRlbXMpIHsKLSAgICAgICAgaWYgKHJlc29sdmVkSXRlbS0+aXNG
aXhlZCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBhZGp1c3RhYmxlZFNwYWNlICs9
IHJlc29sdmVkSXRlbS0+c2xvdFNwYWNlOwotICAgIH0KLQotICAgIFZlY3RvcjxMYXlvdXRVbml0
PiBkaXN0cmlidXRlZFNwYWNlcyhyZXNvbHZlZEl0ZW1zLnNpemUoKSk7Ci0gICAgZmxvYXQgc3Bh
Y2VUb0Rpc3RyaWJ1dGUgPSBhdmFpbGFibGVTcGFjZSAtIGFkanVzdGFibGVkU3BhY2UudmFsdWUg
LSAoKHJlc29sdmVkSXRlbXMuc2l6ZSgpICsgMSkgKiBTcGFuVHlwZTo6c3BhY2luZyhncmlkKSk7
Ci0gICAgLy8gRXNzZW50aWFsbHkgdGhlIHJlbWFpbmluZyBzcGFjZSB0byBkaXN0cmlidXRlIHNo
b3VsZCBuZXZlciBiZSBuZWdhdGl2ZS4gTGF5b3V0VW5pdDo6ZXBzaWxvbigpIGlzIHJlcXVpcmVk
IHRvIGNvbXBlbnNhdGUgZm9yIExheW91dFVuaXQncyBsb3cgcHJlY2lzaW9uLgotICAgIEFTU0VS
VChzcGFjZVRvRGlzdHJpYnV0ZSA+PSAtTGF5b3V0VW5pdDo6ZXBzaWxvbigpICogcmVzb2x2ZWRJ
dGVtcy5zaXplKCkpOwotICAgIC8vIERpc3RyaWJ1dGUgdGhlIGV4dHJhIHNwYWNlIGJhc2VkIG9u
IHRoZSByZXNvbHZlZCBzcGFjZXMuCi0gICAgYXV0byBkaXN0cmlidXRpb25SYXRpbyA9IHNwYWNl
VG9EaXN0cmlidXRlIC8gYWRqdXN0YWJsZWRTcGFjZS5kaXN0cmlidXRpb25CYXNlOwotICAgIGZv
ciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCByZXNvbHZlZEl0ZW1zLnNpemUoKTsgKytpbmRl
eCkgewotICAgICAgICBhdXRvIHNsb3RTcGFjZSA9IHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90
U3BhY2UudmFsdWU7Ci0gICAgICAgIGF1dG8gbmVlZHNTcGFjZURpc3RyaWJ1dGlvbiA9IHNwYWNl
VG9EaXN0cmlidXRlICYmICFyZXNvbHZlZEl0ZW1zW2luZGV4XS0+aXNGaXhlZDsKLSAgICAgICAg
ZGlzdHJpYnV0ZWRTcGFjZXNbaW5kZXhdID0gTGF5b3V0VW5pdCB7IHNsb3RTcGFjZSB9OwotICAg
ICAgICBpZiAoIW5lZWRzU3BhY2VEaXN0cmlidXRpb24pCi0gICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgZGlzdHJpYnV0ZWRTcGFjZXNbaW5kZXhdICs9IExheW91dFVuaXQgeyByZXNvbHZl
ZEl0ZW1zW2luZGV4XS0+c2xvdFNwYWNlLmRpc3RyaWJ1dGlvbkJhc2UgKiBkaXN0cmlidXRpb25S
YXRpbyB9OwotICAgIH0KLSAgICByZXR1cm4gZGlzdHJpYnV0ZWRTcGFjZXM7Ci19Ci0KLVRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlTGF5b3V0OjpEaXN0cmlidXRlZFNwYWNlcyBUYWJsZUZv
cm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dDo6ZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2Uo
TGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpCi17Ci0gICAgZW51bSBjbGFzcyBD
b2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UgeyBNaW5pbXVtV2lkdGgsIE1heGltdW1XaWR0aCB9Owot
ICAgIGF1dG8gY29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlID0gYXZhaWxhYmxlSG9yaXpvbnRhbFNw
YWNlID49IG1fZ3JpZC53aWR0aENvbnN0cmFpbnRzKCktPm1heGltdW0gPyBDb2x1bW5XaWR0aEJh
bGFuY2luZ0Jhc2U6Ok1heGltdW1XaWR0aCA6IENvbHVtbldpZHRoQmFsYW5jaW5nQmFzZTo6TWlu
aW11bVdpZHRoOwotICAgIHJldHVybiBkaXN0cmlidXRlQXZhaWxhYmxlU3BhY2U8Q29sdW1uU3Bh
bj4obV9ncmlkLCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UsIFsmXSAoY29uc3QgVGFibGVHcmlk
OjpTbG90JiBzbG90LCBzaXplX3QgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgYXV0byYgY29sdW1u
ID0gbV9ncmlkLmNvbHVtbnMoKS5saXN0KClbY29sdW1uSW5kZXhdOwotICAgICAgICBhdXRvIGNv
bHVtbkJveEZpeGVkV2lkdGggPSBjb2x1bW4uYm94KCkgPyBjb2x1bW4uYm94KCktPmNvbHVtbldp
ZHRoKCkudmFsdWVPcigwX2x1KSA6IDBfbHU7Ci0gICAgICAgIGF1dG8gbWluaW11bVdpZHRoID0g
c3RkOjptYXg8ZmxvYXQ+KHNsb3Qud2lkdGhDb25zdHJhaW50cygpLm1pbmltdW0sIGNvbHVtbkJv
eEZpeGVkV2lkdGgpOwotICAgICAgICBhdXRvIG1heGltdW1XaWR0aCA9IHN0ZDo6bWF4PGZsb2F0
PihzbG90LndpZHRoQ29uc3RyYWludHMoKS5tYXhpbXVtLCBjb2x1bW5Cb3hGaXhlZFdpZHRoKTsK
LQotICAgICAgICBpZiAoY29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlID09IENvbHVtbldpZHRoQmFs
YW5jaW5nQmFzZTo6TWluaW11bVdpZHRoKSB7Ci0gICAgICAgICAgICBBU1NFUlQobWF4aW11bVdp
ZHRoID49IG1pbmltdW1XaWR0aCk7Ci0gICAgICAgICAgICByZXR1cm4gR3JpZFNwYWNlIHsgbWlu
aW11bVdpZHRoLCBtYXhpbXVtV2lkdGggLSBtaW5pbXVtV2lkdGggfTsKLSAgICAgICAgfQotICAg
ICAgICAvLyBXaGVuIHRoZSBjb2x1bW4gaGFzIGEgZml4ZWQgd2lkdGggY2VsbCwgdGhlIG1heGlt
dW0gd2lkdGggYmFsYW5jaW5nIGlzIGJhc2VkIG9uIHRoZSBtaW5pbXVtIHdpZHRoLgotICAgICAg
ICBpZiAoY29sdW1uLmlzRml4ZWRXaWR0aCgpKQotICAgICAgICAgICAgcmV0dXJuIEdyaWRTcGFj
ZSB7IG1pbmltdW1XaWR0aCwgbWF4aW11bVdpZHRoIH07Ci0gICAgICAgIHJldHVybiBHcmlkU3Bh
Y2UgeyBtYXhpbXVtV2lkdGgsIG1heGltdW1XaWR0aCB9OwotICAgIH0pOwotfQotCi1UYWJsZUZv
cm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dDo6RGlzdHJpYnV0ZWRTcGFjZXMgVGFibGVGb3Jt
YXR0aW5nQ29udGV4dDo6VGFibGVMYXlvdXQ6OmRpc3RyaWJ1dGVkVmVydGljYWxTcGFjZShPcHRp
b25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKQotewotICAgIGF1dG8mIHJv
d3MgPSBtX2dyaWQucm93cygpOwotICAgIGF1dG8mIGNvbHVtbnMgPSBtX2dyaWQuY29sdW1ucygp
OwotCi0gICAgVmVjdG9yPExheW91dFVuaXQ+IHJvd0hlaWdodChyb3dzLnNpemUoKSk7Ci0gICAg
YXV0byB0YWJsZVVzZWRIZWlnaHQgPSBMYXlvdXRVbml0IHsgfTsKLSAgICAvLyAyLiBDb2xsZWN0
IGluaXRpYWwsIGJhc2VsaW5lIGFsaWduZWQgcm93IGhlaWdodHMuCi0gICAgZm9yIChzaXplX3Qg
cm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7Ci0gICAg
ICAgIGF1dG8gbWF4aW11bUNvbHVtbkFzY2VudCA9IElubGluZUxheW91dFVuaXQgeyB9OwotICAg
ICAgICBhdXRvIG1heGltdW1Db2x1bW5EZXNjZW50ID0gSW5saW5lTGF5b3V0VW5pdCB7IH07Ci0g
ICAgICAgIC8vIEluaXRpYWwgbWluaW11bSBoZWlnaHQgaXMgdGhlIGNvbXB1dGVkIGhlaWdodCBp
ZiBhdmFpbGFibGUgPHRyIHN0eWxlPSJoZWlnaHQ6IDEwMHB4Ij48dGQ+PC90ZD48L3RyPgotICAg
ICAgICByb3dIZWlnaHRbcm93SW5kZXhdID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeSgp
LmNvbXB1dGVkSGVpZ2h0KHJvd3MubGlzdCgpW3Jvd0luZGV4XS5ib3goKSwgYXZhaWxhYmxlVmVy
dGljYWxTcGFjZSkudmFsdWVPcigwX2x1KTsKLSAgICAgICAgZm9yIChzaXplX3QgY29sdW1uSW5k
ZXggPSAwOyBjb2x1bW5JbmRleCA8IGNvbHVtbnMuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7Ci0g
ICAgICAgICAgICBhdXRvJiBzbG90ID0gKm1fZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0lu
ZGV4IH0pOwotICAgICAgICAgICAgaWYgKHNsb3QuaXNSb3dTcGFubmVkKCkpCi0gICAgICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoc2xvdC5oYXNSb3dTcGFuKCkpCi0gICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAvLyBUaGUgbWluaW11bSBoZWlnaHQg
b2YgYSByb3cgKHdpdGhvdXQgc3Bhbm5pbmctcmVsYXRlZCBoZWlnaHQgZGlzdHJpYnV0aW9uKSBp
cyBkZWZpbmVkIGFzIHRoZSBoZWlnaHQgb2YgYW4gaHlwb3RoZXRpY2FsCi0gICAgICAgICAgICAv
LyBsaW5lYm94IGNvbnRhaW5pbmcgdGhlIGNlbGxzIG9yaWdpbmF0aW5nIGluIHRoZSByb3cuCi0g
ICAgICAgICAgICBhdXRvJiBjZWxsID0gc2xvdC5jZWxsKCk7Ci0gICAgICAgICAgICBhdXRvJiBj
ZWxsQm94ID0gY2VsbC5ib3goKTsKLSAgICAgICAgICAgIGF1dG8gaGVpZ2h0ID0gZm9ybWF0dGlu
Z0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChjZWxsQm94KS5ib3JkZXJCb3hIZWlnaHQoKTsKLSAg
ICAgICAgICAgIGlmIChjZWxsQm94LnN0eWxlKCkudmVydGljYWxBbGlnbigpID09IFZlcnRpY2Fs
QWxpZ246OkJhc2VsaW5lKSB7Ci0gICAgICAgICAgICAgICAgbWF4aW11bUNvbHVtbkFzY2VudCA9
IHN0ZDo6bWF4KG1heGltdW1Db2x1bW5Bc2NlbnQsIGNlbGwuYmFzZWxpbmUoKSk7Ci0gICAgICAg
ICAgICAgICAgbWF4aW11bUNvbHVtbkRlc2NlbnQgPSBzdGQ6Om1heChtYXhpbXVtQ29sdW1uRGVz
Y2VudCwgaGVpZ2h0IC0gY2VsbC5iYXNlbGluZSgpKTsKLSAgICAgICAgICAgICAgICByb3dIZWln
aHRbcm93SW5kZXhdID0gc3RkOjptYXgocm93SGVpZ2h0W3Jvd0luZGV4XSwgTGF5b3V0VW5pdCB7
IG1heGltdW1Db2x1bW5Bc2NlbnQgKyBtYXhpbXVtQ29sdW1uRGVzY2VudCB9KTsKLSAgICAgICAg
ICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJvd0hlaWdodFtyb3dJbmRleF0gPSBzdGQ6Om1h
eChyb3dIZWlnaHRbcm93SW5kZXhdLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIHRhYmxl
VXNlZEhlaWdodCArPSByb3dIZWlnaHRbcm93SW5kZXhdOwotICAgIH0KLSAgICAvLyBGSVhNRTog
Q29sbGVjdCBzcGFubmluZyByb3cgbWF4aW11bSBoZWlnaHRzLgotCi0gICAgdGFibGVVc2VkSGVp
Z2h0ICs9IChyb3dzLnNpemUoKSArIDEpICogbV9ncmlkLnZlcnRpY2FsU3BhY2luZygpOwotICAg
IGF1dG8gYXZhaWxhYmxlU3BhY2UgPSBzdGQ6Om1heChhdmFpbGFibGVWZXJ0aWNhbFNwYWNlLnZh
bHVlT3IoMF9sdSksIHRhYmxlVXNlZEhlaWdodCk7Ci0gICAgLy8gRGlzdHJpYnV0ZSBleHRyYSBz
cGFjZSBpZiB0aGUgdGFibGUgaXMgc3VwcG9zZWQgdG8gYmUgdGFsbGVyIHRoYW4gdGhlIHN1bSBv
ZiB0aGUgcm93IGhlaWdodHMuCi0gICAgcmV0dXJuIGRpc3RyaWJ1dGVBdmFpbGFibGVTcGFjZTxS
b3dTcGFuPihtX2dyaWQsIGF2YWlsYWJsZVNwYWNlLCBbJl0gKGNvbnN0IFRhYmxlR3JpZDo6U2xv
dCYgc2xvdCwgc2l6ZV90IHJvd0luZGV4KSB7Ci0gICAgICAgIGlmIChzbG90Lmhhc1Jvd1NwYW4o
KSkKLSAgICAgICAgICAgIHJldHVybiBHcmlkU3BhY2UgeyBmb3JtYXR0aW5nQ29udGV4dCgpLmdl
b21ldHJ5Rm9yQm94KHNsb3QuY2VsbCgpLmJveCgpKS5ib3JkZXJCb3hIZWlnaHQoKSwgZm9ybWF0
dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChzbG90LmNlbGwoKS5ib3goKSkuYm9yZGVyQm94
SGVpZ2h0KCkgfTsKLSAgICAgICAgYXV0byYgcm93cyA9IG1fZ3JpZC5yb3dzKCk7Ci0gICAgICAg
IGF1dG8gY29tcHV0ZWRSb3dIZWlnaHQgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCku
Y29tcHV0ZWRIZWlnaHQocm93cy5saXN0KClbcm93SW5kZXhdLmJveCgpLCB7IH0pOwotICAgICAg
ICBhdXRvIGhlaWdodCA9IHN0ZDo6bWF4PGZsb2F0Pihyb3dIZWlnaHRbcm93SW5kZXhdLCBjb21w
dXRlZFJvd0hlaWdodC52YWx1ZU9yKDBfbHUpKTsKLSAgICAgICAgcmV0dXJuIEdyaWRTcGFjZSB7
IGhlaWdodCwgaGVpZ2h0IH07Ci0gICAgfSk7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCg==
</data>
<flag name="commit-queue"
          id="448123"
          type_id="3"
          status="-"
          setter="ews-feeder"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>427504</attachid>
            <date>2021-05-01 09:44:57 -0700</date>
            <delta_ts>2021-05-01 12:55:45 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-225270-20210501094455.patch</filename>
            <type>text/plain</type>
            <size>1297417</size>
            <attacher name="alan">zalan</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc2ODczCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjk3NGJhNTg4ODg3ZGRh
NWI1ODllOGZiM2I1YTQwZWU1ZWUwMzgxYi4uYWVkYTU5ZmQ2OTg4NTkzNGYzZjYwZDU2MTczZTYy
NTQ1MDc3NzliZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDIxLTA1LTAxICBaYWxh
biBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CisKKyAgICAgICAgW0xGQ10gTW92ZSBmb3JtYXR0
aW5nIGNvbnRleHRzIHRvIGxheW91dC9mb3JtYXR0aW5nQ29udGV4dHMgZGlyZWN0b3J5CisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMjUyNzAKKworICAg
ICAgICBSZXZpZXdlZCBieSBBbnR0aSBLb2l2aXN0by4KKworICAgICAgICAqIENNYWtlTGlzdHMu
dHh0OgorICAgICAgICAqIFNvdXJjZXMudHh0OgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvajoKKwogMjAyMS0wNS0wMSAgWmFsYW4gQnVqdGFzICA8emFsYW5AYXBw
bGUuY29tPgogCiAgICAgICAgIFtSZW5kZXJUcmVlQnVpbGRlcl0gUmVzZXQgdGhlICJjaGlsZHJl
biBpbmxpbmUiIHN0YXRlIHdoZW4gbWVyZ2luZyBhbm9ueW1vdXMgdGFibGUgYm94ZXMKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNvcmUvQ01h
a2VMaXN0cy50eHQKaW5kZXggNGE0NWEyODg3OWM0YTc3YmYxNDMwMTZmMWMzNThmNGU1NWI2N2Y3
MC4uMGZhYWJmM2MwNzFjMWM0M2QxNTA3NmY5OTBhNWQ0YmFiODU2MGEzMiAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VM
aXN0cy50eHQKQEAgLTEwMSwxNiArMTAxLDE3IEBAIHNldChXZWJDb3JlX1BSSVZBVEVfSU5DTFVE
RV9ESVJFQ1RPUklFUwogICAgICIke1dFQkNPUkVfRElSfS9pbnNwZWN0b3IvYWdlbnRzL3BhZ2Ui
CiAgICAgIiR7V0VCQ09SRV9ESVJ9L2luc3BlY3Rvci9hZ2VudHMvd29ya2VyIgogICAgICIke1dF
QkNPUkVfRElSfS9sYXlvdXQiCi0gICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9ibG9ja2Zvcm1h
dHRpbmciCi0gICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3
cmFwcGVyIgotICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvZmxleGZvcm1hdHRpbmciCisgICAg
IiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMiCisgICAgIiR7V0VCQ09S
RV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nIgorICAgICIk
e1dFQkNPUkVfRElSfS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90
YWJsZXdyYXBwZXIiCisgICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvZmxleGZvcm1hdHRpbmciCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mbG9hdHMiCi0g
ICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9pbmxpbmVmb3JtYXR0aW5nIgotICAgICIke1dFQkNP
UkVfRElSfS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy90ZXh0IgorICAgICIke1dFQkNPUkVfRElS
fS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmciCisgICAgIiR7V0VC
Q09SRV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy90ZXh0
IgogICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvaW50ZWdyYXRpb24iCiAgICAgIiR7V0VCQ09S
RV9ESVJ9L2xheW91dC9pbnZhbGlkYXRpb24iCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9s
YXlvdXR0cmVlIgotICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nIgor
ICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0
dGluZyIKICAgICAiJHtXRUJDT1JFX0RJUn0vbG9hZGVyIgogICAgICIke1dFQkNPUkVfRElSfS9s
b2FkZXIvYXBwY2FjaGUiCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xvYWRlci9hcmNoaXZlIgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvSGVhZGVycy5jbWFrZSBiL1NvdXJjZS9XZWJDb3JlL0hl
YWRlcnMuY21ha2UKaW5kZXggZmNlNzVjMDgwMjU5YWE2NjlhNjBhZjFhZTcxODNmZWQwYmFhN2Zl
OS4uOTBkYWJiOTExM2I5MGQ3MmZkMDEyNDRkOTcwMTE5Y2E2ZTYyOThhMiAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvSGVhZGVycy5jbWFrZQorKysgYi9Tb3VyY2UvV2ViQ29yZS9IZWFkZXJz
LmNtYWtlCkBAIC03NTQsNyArNzU0LDcgQEAgc2V0KFdlYkNvcmVfUFJJVkFURV9GUkFNRVdPUktf
SEVBREVSUwogICAgIGxheW91dC9MYXlvdXRVbml0cy5oCiAgICAgbGF5b3V0L01hcmdpblR5cGVz
LmgKIAotICAgIGxheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVJlY3QuaAorICAgIGxheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVSZWN0LmgKIAogICAg
IGxheW91dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbklubGluZUNvbnRlbnQuaAogICAg
IGxheW91dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbkxpbmUuaApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvU291cmNlcy50eHQgYi9Tb3VyY2UvV2ViQ29yZS9Tb3VyY2VzLnR4dApp
bmRleCA4Njk4ZDU2NTM2OWNlYjZjYzI0OGNkMjc1OWVjMjU5ZjA1OTkyNWNiLi4yZDkwNjE0OTNh
NGYyNTA3Y2FhNGRmN2NkODc1MmZiMmEyNjI5YWJlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9Tb3VyY2VzLnR4dAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Tb3VyY2VzLnR4dApAQCAtMTUwOCw0
MCArMTUwOCw0MCBAQCBpbnNwZWN0b3IvYWdlbnRzL3dvcmtlci9Xb3JrZXJET01EZWJ1Z2dlckFn
ZW50LmNwcAogaW5zcGVjdG9yL2FnZW50cy93b3JrZXIvV29ya2VyRGVidWdnZXJBZ2VudC5jcHAK
IGluc3BlY3Rvci9hZ2VudHMvd29ya2VyL1dvcmtlck5ldHdvcmtBZ2VudC5jcHAKIGluc3BlY3Rv
ci9hZ2VudHMvd29ya2VyL1dvcmtlclJ1bnRpbWVBZ2VudC5jcHAKLWxheW91dC9Gb3JtYXR0aW5n
Q29udGV4dC5jcHAKLWxheW91dC9Gb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAotbGF5b3V0
L0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9G
b3JtYXR0aW5nQ29udGV4dC5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGlu
Z0NvbnRleHRHZW9tZXRyeS5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGlu
Z0NvbnRleHRRdWlya3MuY3BwCiBsYXlvdXQvRm9ybWF0dGluZ1N0YXRlLmNwcAogbGF5b3V0L0xh
eW91dENvbnRleHQuY3BwCiBsYXlvdXQvTGF5b3V0UGhhc2UuY3BwCiBsYXlvdXQvTGF5b3V0U3Rh
dGUuY3BwCiBsYXlvdXQvTGF5b3V0VW5pdHMuY3BwCiBsYXlvdXQvVmVyaWZpY2F0aW9uLmNwcAot
bGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcAotbGF5b3V0
L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCi1sYXlv
dXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCi1sYXlv
dXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmNwcAotbGF5b3V0L2Jsb2Nr
Zm9ybWF0dGluZy9CbG9ja01hcmdpbkNvbGxhcHNlLmNwcAotbGF5b3V0L2Jsb2NrZm9ybWF0dGlu
Zy9QcmVjb21wdXRlZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCi1sYXlvdXQvYmxvY2tmb3JtYXR0
aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcAot
bGF5b3V0L2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKLWxheW91dC9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0
dGluZ0NvbnRleHQuY3BwCi1sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250
ZXh0R2VvbWV0cnkuY3BwCi1sYXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0
ZS5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9y
bWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0
dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCitsYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNw
cAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0
aW5nU3RhdGUuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9C
bG9ja01hcmdpbkNvbGxhcHNlLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zv
cm1hdHRpbmcvUHJlY29tcHV0ZWRCbG9ja01hcmdpbkNvbGxhcHNlLmNwcAorbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJs
b2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2Nr
Zm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4
dFF1aXJrcy5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxl
eEZvcm1hdHRpbmdDb250ZXh0LmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9y
bWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKK2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5jcHAKIGxheW91
dC9mbG9hdHMvRmxvYXRBdm9pZGVyLmNwcAogbGF5b3V0L2Zsb2F0cy9GbG9hdGluZ0NvbnRleHQu
Y3BwCiBsYXlvdXQvZmxvYXRzL0Zsb2F0aW5nU3RhdGUuY3BwCi1sYXlvdXQvaW5saW5lZm9ybWF0
dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5jcHAKLWxheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUZvcm1hdHRpbmdDb250ZXh0LmNwcAotbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKLWxheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcAotbGF5b3V0L2lubGluZWZvcm1hdHRpbmcv
SW5saW5lRm9ybWF0dGluZ1N0YXRlLmNwcAotbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5l
SXRlbS5jcHAKLWxheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUuY3BwCi1sYXlvdXQv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94LmNwcAotbGF5b3V0L2lubGluZWZvcm1hdHRp
bmcvSW5saW5lTGluZUJ1aWxkZXIuY3BwCi1sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVU
ZXh0SXRlbS5jcHAKLWxheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuY3BwCits
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lQ29udGVudEJy
ZWFrZXIuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKK2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4
dFF1aXJrcy5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9J
bmxpbmVGb3JtYXR0aW5nU3RhdGUuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lSXRlbS5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5s
aW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxkZXIuY3BwCitsYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uY3BwCitsYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvdGV4dC9UZXh0VXRpbC5jcHAKIGxh
eW91dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbkJveFRyZWUuY3BwCiBsYXlvdXQvaW50
ZWdyYXRpb24vTGF5b3V0SW50ZWdyYXRpb25Db3ZlcmFnZS5jcHAKIGxheW91dC9pbnRlZ3JhdGlv
bi9MYXlvdXRJbnRlZ3JhdGlvbklubGluZUNvbnRlbnRCdWlsZGVyLmNwcApAQCAtMTU2MCwxMiAr
MTU2MCwxMiBAQCBsYXlvdXQvbGF5b3V0dHJlZS9MYXlvdXRJbmxpbmVUZXh0Qm94LmNwcAogbGF5
b3V0L2xheW91dHRyZWUvTGF5b3V0TGluZUJyZWFrQm94LmNwcAogbGF5b3V0L2xheW91dHRyZWUv
TGF5b3V0UmVwbGFjZWRCb3guY3BwCiBsYXlvdXQvbGF5b3V0dHJlZS9MYXlvdXRUcmVlQnVpbGRl
ci5jcHAKLWxheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAK
LWxheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNw
cAotbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNw
cAotbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5jcHAKLWxheW91
dC90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmNwcAotbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9U
YWJsZUxheW91dC5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5n
L1RhYmxlRm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3Rh
YmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCitsYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0
UXVpcmtzLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFi
bGVGb3JtYXR0aW5nU3RhdGUuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9y
bWF0dGluZy9UYWJsZUdyaWQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9y
bWF0dGluZy9UYWJsZUxheW91dC5jcHAKIGxvYWRlci9Qcml2YXRlQ2xpY2tNZWFzdXJlbWVudC5j
cHAKIGxvYWRlci9BcHBsaWNhdGlvbk1hbmlmZXN0TG9hZGVyLmNwcAogbG9hZGVyL0NhbnZhc0Fj
dGl2aXR5UmVjb3JkLmNwcApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qCmluZGV4IDZjZmY0ZTk5ZGViNGUzMDM1OGEyZTQ1NmI1ZGQ1MGIyYzBh
MzUwNjAuLjY2ZDRmZGY1ZjM0Nzg5NThlNzg5YzMwMzEyZTM2MzAzMmRkZTIyNDcgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTE4
MTc5LDE4ICsxODE3OSwxMSBAQAogCQkxMTVDRkE2NjIwOEFGNzIwMDAxRTY5OTEgLyogbGF5b3V0
ICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKLQkJCQkxMTVDRkE5
OTIwOEJDMDlBMDAxRTY5OTEgLyogYmxvY2tmb3JtYXR0aW5nICovLAotCQkJCTZGQjdEMkQ1MjUw
RkQ3QjUwMDAyMDdBQSAvKiBmbGV4Zm9ybWF0dGluZyAqLywKIAkJCQk2RkNGQzA1NTIxMkRBQ0My
MDA3Njk1RDIgLyogZmxvYXRzICovLAotCQkJCTExNUNGQTlBMjA4QkMxNDAwMDFFNjk5MSAvKiBp
bmxpbmVmb3JtYXR0aW5nICovLAorCQkJCTZGODQ0RjdGMjYzRDkxNjEwMEY5MTM3MCAvKiBmb3Jt
YXR0aW5nQ29udGV4dHMgKi8sCiAJCQkJRTRGQjRCMUUyMzk1MzU2RjAwM0MzMzZBIC8qIGludGVn
cmF0aW9uICovLAogCQkJCTZGOTVERTRBMjM3Qjg4MzAwMEU1MTdFMSAvKiBpbnZhbGlkYXRpb24g
Ki8sCiAJCQkJMTE1Q0ZBOTAyMDhCOTQ0MTAwMUU2OTkxIC8qIGxheW91dHRyZWUgKi8sCi0JCQkJ
NkZDNUNBOTEyMkUzNTkzMzAwQjEzRTExIC8qIHRhYmxlZm9ybWF0dGluZyAqLywKLQkJCQkxMTVD
RkE2OTIwOEFGN0QwMDAxRTY5OTEgLyogRm9ybWF0dGluZ0NvbnRleHQuY3BwICovLAotCQkJCTEx
NUNGQTY4MjA4QUY3RDAwMDFFNjk5MSAvKiBGb3JtYXR0aW5nQ29udGV4dC5oICovLAotCQkJCTZG
QkI4NjA1MjBCNDY0QjYwMERBRDkzOCAvKiBGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCAq
LywKLQkJCQk2RjhGNDYwMTIxQjAzQkI0MDA0MUFDM0EgLyogRm9ybWF0dGluZ0NvbnRleHRRdWly
a3MuY3BwICovLAogCQkJCTExNUNGQTc1MjA4QUZFMzAwMDFFNjk5MSAvKiBGb3JtYXR0aW5nU3Rh
dGUuY3BwICovLAogCQkJCTExNUNGQTc0MjA4QUZFMzAwMDFFNjk5MSAvKiBGb3JtYXR0aW5nU3Rh
dGUuaCAqLywKIAkJCQk2RjI2QkI2OTIzMzQzRTVBMDAyRjJCRUEgLyogTGF5b3V0Q29udGV4dC5j
cHAgKi8sCkBAIC0yMjYwMSw2ICsyMjU5NCwyMSBAQAogCQkJcGF0aCA9IGFuZ2xlOwogCQkJc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsKIAkJfTsKKwkJNkY4NDRGN0YyNjNEOTE2MTAwRjkxMzcwIC8q
IGZvcm1hdHRpbmdDb250ZXh0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRy
ZW4gPSAoCisJCQkJMTE1Q0ZBOTkyMDhCQzA5QTAwMUU2OTkxIC8qIGJsb2NrZm9ybWF0dGluZyAq
LywKKwkJCQk2RkI3RDJENTI1MEZEN0I1MDAwMjA3QUEgLyogZmxleGZvcm1hdHRpbmcgKi8sCisJ
CQkJMTE1Q0ZBOUEyMDhCQzE0MDAwMUU2OTkxIC8qIGlubGluZWZvcm1hdHRpbmcgKi8sCisJCQkJ
NkZDNUNBOTEyMkUzNTkzMzAwQjEzRTExIC8qIHRhYmxlZm9ybWF0dGluZyAqLywKKwkJCQkxMTVD
RkE2OTIwOEFGN0QwMDAxRTY5OTEgLyogRm9ybWF0dGluZ0NvbnRleHQuY3BwICovLAorCQkJCTEx
NUNGQTY4MjA4QUY3RDAwMDFFNjk5MSAvKiBGb3JtYXR0aW5nQ29udGV4dC5oICovLAorCQkJCTZG
QkI4NjA1MjBCNDY0QjYwMERBRDkzOCAvKiBGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCAq
LywKKwkJCQk2RjhGNDYwMTIxQjAzQkI0MDA0MUFDM0EgLyogRm9ybWF0dGluZ0NvbnRleHRRdWly
a3MuY3BwICovLAorCQkJKTsKKwkJCXBhdGggPSBmb3JtYXR0aW5nQ29udGV4dHM7CisJCQlzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOworCQl9OwogCQk2Rjk1REU0QTIzN0I4ODMwMDBFNTE3RTEgLyog
aW52YWxpZGF0aW9uICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dC5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRm9ybWF0dGluZ0NvbnRleHQuY3BwCmRlbGV0ZWQgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCA5ODU3ZGJhMmM3ZDY1Mjk2MGM0MTFmYWJjYTM1NzU4Njk1YmEx
MTI4Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAt
MSwzMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBt
ZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRl
ICJGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NP
TlRFWFQpCi0KLSNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJJbnZhbGlk
YXRpb25TdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dEJv
eEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCi0jaW5jbHVkZSAi
TGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dERlc2NlbmRhbnRJdGVyYXRvci5oIgot
I2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKLSNpbmNsdWRlICJMYXlv
dXRSZXBsYWNlZEJveC5oIgotI2luY2x1ZGUgIkxheW91dFN0YXRlLmgiCi0jaW5jbHVkZSAiTG9n
Z2luZy5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0jaW5jbHVkZSA8d3Rm
L3RleHQvVGV4dFN0cmVhbS5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5
b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEZvcm1hdHRpbmdDb250ZXh0KTsK
LQotRm9ybWF0dGluZ0NvbnRleHQ6OkZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJv
eCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0
ZSkKLSAgICA6IG1fcm9vdChtYWtlV2Vha1B0cihmb3JtYXR0aW5nQ29udGV4dFJvb3QpKQotICAg
ICwgbV9mb3JtYXR0aW5nU3RhdGUoZm9ybWF0dGluZ1N0YXRlKQotewotICAgIEFTU0VSVChmb3Jt
YXR0aW5nQ29udGV4dFJvb3QuaGFzQ2hpbGQoKSk7Ci0jaWZuZGVmIE5ERUJVRwotICAgIGxheW91
dFN0YXRlKCkucmVnaXN0ZXJGb3JtYXR0aW5nQ29udGV4dCgqdGhpcyk7Ci0jZW5kaWYKLX0KLQot
Rm9ybWF0dGluZ0NvbnRleHQ6On5Gb3JtYXR0aW5nQ29udGV4dCgpCi17Ci0jaWZuZGVmIE5ERUJV
RwotICAgIGxheW91dFN0YXRlKCkuZGVyZWdpc3RlckZvcm1hdHRpbmdDb250ZXh0KCp0aGlzKTsK
LSNlbmRpZgotfQotCi1MYXlvdXRTdGF0ZSYgRm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dFN0YXRl
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9mb3JtYXR0aW5nU3RhdGUubGF5b3V0U3RhdGUoKTsK
LX0KLQotdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZU91dE9mRmxvd0hvcml6b250YWxH
ZW9tZXRyeShjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29uc3RyYWludHNGb3JPdXRPZkZs
b3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3V0T2ZG
bG93UG9zaXRpb25lZCgpKTsKLSAgICBhdXRvIGNvbXB1dGUgPSBbJl0oT3B0aW9uYWw8TGF5b3V0
VW5pdD4gdXNlZFdpZHRoKSB7Ci0gICAgICAgIHJldHVybiBnZW9tZXRyeSgpLm91dE9mRmxvd0hv
cml6b250YWxHZW9tZXRyeShsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIGNvbnN0
cmFpbnRzLnZlcnRpY2FsLCB7IHVzZWRXaWR0aCwgeyB9IH0pOwotICAgIH07Ci0KLSAgICBhdXRv
IGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gY29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dpY2FsV2lk
dGg7Ci0gICAgYXV0byBob3Jpem9udGFsR2VvbWV0cnkgPSBjb21wdXRlKHsgfSk7Ci0gICAgaWYg
KGF1dG8gbWF4V2lkdGggPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWF4V2lkdGgobGF5b3V0Qm94LCBj
b250YWluaW5nQmxvY2tXaWR0aCkpIHsKLSAgICAgICAgYXV0byBtYXhIb3Jpem9udGFsR2VvbWV0
cnkgPSBjb21wdXRlKG1heFdpZHRoKTsKLSAgICAgICAgaWYgKGhvcml6b250YWxHZW9tZXRyeS5j
b250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoID4gbWF4SG9yaXpvbnRhbEdlb21ldHJ5
LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCi0gICAgICAgICAgICBob3Jpem9u
dGFsR2VvbWV0cnkgPSBtYXhIb3Jpem9udGFsR2VvbWV0cnk7Ci0gICAgfQotCi0gICAgaWYgKGF1
dG8gbWluV2lkdGggPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluV2lkdGgobGF5b3V0Qm94LCBjb250
YWluaW5nQmxvY2tXaWR0aCkpIHsKLSAgICAgICAgYXV0byBtaW5Ib3Jpem9udGFsR2VvbWV0cnkg
PSBjb21wdXRlKG1pbldpZHRoKTsKLSAgICAgICAgaWYgKGhvcml6b250YWxHZW9tZXRyeS5jb250
ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoIDwgbWluSG9yaXpvbnRhbEdlb21ldHJ5LmNv
bnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCi0gICAgICAgICAgICBob3Jpem9udGFs
R2VvbWV0cnkgPSBtaW5Ib3Jpem9udGFsR2VvbWV0cnk7Ci0gICAgfQotCi0gICAgYXV0byYgYm94
R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAg
IGJveEdlb21ldHJ5LnNldExvZ2ljYWxMZWZ0KGhvcml6b250YWxHZW9tZXRyeS5sZWZ0ICsgaG9y
aXpvbnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0KTsK
LSAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoaG9yaXpvbnRhbEdlb21ldHJ5LmNv
bnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOwotICAgIGF1dG8mIHVzZWRIb3Jpem9u
dGFsTWFyZ2luID0gaG9yaXpvbnRhbEdlb21ldHJ5LmNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2Vk
TWFyZ2luOwotICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyB1c2VkSG9yaXpv
bnRhbE1hcmdpbi5zdGFydCwgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kIH0pOwotfQotCi12b2lk
IEZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlT3V0T2ZGbG93VmVydGljYWxHZW9tZXRyeShjb25z
dCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50JiBj
b25zdHJhaW50cykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25l
ZCgpKTsKLSAgICBhdXRvIGNvbXB1dGUgPSBbJl0oT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZEhl
aWdodCkgewotICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5vdXRPZkZsb3dWZXJ0aWNhbEdlb21l
dHJ5KGxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwgY29uc3RyYWludHMudmVydGlj
YWwsIHsgdXNlZEhlaWdodCB9KTsKLSAgICB9OwotCi0gICAgYXV0byBjb250YWluaW5nQmxvY2tI
ZWlnaHQgPSAqY29uc3RyYWludHMudmVydGljYWwubG9naWNhbEhlaWdodDsKLSAgICBhdXRvIHZl
cnRpY2FsR2VvbWV0cnkgPSBjb21wdXRlKHsgfSk7Ci0gICAgaWYgKGF1dG8gbWF4SGVpZ2h0ID0g
Z2VvbWV0cnkoKS5jb21wdXRlZE1heEhlaWdodChsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja0hl
aWdodCkpIHsKLSAgICAgICAgYXV0byBtYXhWZXJ0aWNhbEdlb21ldHJ5ID0gY29tcHV0ZShtYXhI
ZWlnaHQpOwotICAgICAgICBpZiAodmVydGljYWxHZW9tZXRyeS5jb250ZW50SGVpZ2h0QW5kTWFy
Z2luLmNvbnRlbnRIZWlnaHQgPiBtYXhWZXJ0aWNhbEdlb21ldHJ5LmNvbnRlbnRIZWlnaHRBbmRN
YXJnaW4uY29udGVudEhlaWdodCkKLSAgICAgICAgICAgIHZlcnRpY2FsR2VvbWV0cnkgPSBtYXhW
ZXJ0aWNhbEdlb21ldHJ5OwotICAgIH0KLQotICAgIGlmIChhdXRvIG1pbkhlaWdodCA9IGdlb21l
dHJ5KCkuY29tcHV0ZWRNaW5IZWlnaHQobGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tIZWlnaHQp
KSB7Ci0gICAgICAgIGF1dG8gbWluVmVydGljYWxHZW9tZXRyeSA9IGNvbXB1dGUobWluSGVpZ2h0
KTsKLSAgICAgICAgaWYgKHZlcnRpY2FsR2VvbWV0cnkuY29udGVudEhlaWdodEFuZE1hcmdpbi5j
b250ZW50SGVpZ2h0IDwgbWluVmVydGljYWxHZW9tZXRyeS5jb250ZW50SGVpZ2h0QW5kTWFyZ2lu
LmNvbnRlbnRIZWlnaHQpCi0gICAgICAgICAgICB2ZXJ0aWNhbEdlb21ldHJ5ID0gbWluVmVydGlj
YWxHZW9tZXRyeTsKLSAgICB9Ci0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdT
dGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgYXV0byBub25Db2xsYXBzZWRWZXJ0
aWNhbE1hcmdpbiA9IHZlcnRpY2FsR2VvbWV0cnkuY29udGVudEhlaWdodEFuZE1hcmdpbi5ub25D
b2xsYXBzZWRNYXJnaW47Ci0gICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcCh2ZXJ0aWNhbEdl
b21ldHJ5LnRvcCArIG5vbkNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSk7Ci0gICAgYm94
R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodCh2ZXJ0aWNhbEdlb21ldHJ5LmNvbnRlbnRIZWln
aHRBbmRNYXJnaW4uY29udGVudEhlaWdodCk7Ci0gICAgLy8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5
IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgotICAgIGJveEdlb21ldHJ5LnNldFZl
cnRpY2FsTWFyZ2luKHsgbm9uQ29sbGFwc2VkVmVydGljYWxNYXJnaW4uYmVmb3JlLCBub25Db2xs
YXBzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciB9KTsKLX0KLQotdm9pZCBGb3JtYXR0aW5nQ29udGV4
dDo6Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnQpCi17Ci0gICAgYXV0byYg
Ym94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwot
ICAgIGJveEdlb21ldHJ5LnNldEJvcmRlcihnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKGxheW91
dEJveCkpOwotICAgIGJveEdlb21ldHJ5LnNldFBhZGRpbmcoZ2VvbWV0cnkoKS5jb21wdXRlZFBh
ZGRpbmcobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludC5sb2dpY2FsV2lkdGgpKTsKLX0K
LQotdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0T3V0T2ZGbG93Q29udGVudChJbnZhbGlk
YXRpb25TdGF0ZSYgaW52YWxpZGF0aW9uU3RhdGUsIGNvbnN0IENvbnN0cmFpbnRzRm9yT3V0T2ZG
bG93Q29udGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRp
bmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIlN0YXJ0OiBsYXlvdXQgb3V0LW9mLWZsb3cgY29u
dGVudCAtPiBjb250ZXh0OiAiIDw8ICZsYXlvdXRTdGF0ZSgpIDw8ICIgcm9vdDogIiA8PCAmcm9v
dCgpKTsKLQotICAgIGNvbGxlY3RPdXRPZkZsb3dEZXNjZW5kYW50c0lmTmVlZGVkKCk7Ci0KLSAg
ICBhdXRvIGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94ID0gWyZdIChjb25zdCBhdXRvJiBvdXRPZkZs
b3dCb3gpIHsKLSAgICAgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gb3V0T2ZGbG93Qm94LmNv
bnRhaW5pbmdCbG9jaygpOwotICAgICAgICByZXR1cm4gJmNvbnRhaW5pbmdCbG9jayA9PSAmcm9v
dCgpID8gY29uc3RyYWludHMgOiBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29u
dGVudChjb250YWluaW5nQmxvY2spOwotICAgIH07Ci0KLSAgICBmb3IgKGF1dG8mIG91dE9mRmxv
d0JveCA6IGZvcm1hdHRpbmdTdGF0ZSgpLm91dE9mRmxvd0JveGVzKCkpIHsKLSAgICAgICAgQVNT
RVJUKG91dE9mRmxvd0JveC0+ZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKLSAgICAg
ICAgaWYgKCFpbnZhbGlkYXRpb25TdGF0ZS5uZWVkc0xheW91dCgqb3V0T2ZGbG93Qm94KSkKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrQ29uc3Ry
YWludHMgPSBjb25zdHJhaW50c0ZvckxheW91dEJveCgqb3V0T2ZGbG93Qm94KTsKLSAgICAgICAg
YXV0byBob3Jpem9udGFsQ29uc3RyYWludHNGb3JCb3JkZXJBbmRQYWRkaW5nID0gSG9yaXpvbnRh
bENvbnN0cmFpbnRzIHsgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dp
Y2FsTGVmdCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuYm9yZGVyQW5kUGFkZGluZ0NvbnN0
cmFpbnRzIH07Ci0gICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpvdXRPZkZsb3dCb3gs
IGhvcml6b250YWxDb25zdHJhaW50c0ZvckJvcmRlckFuZFBhZGRpbmcpOwotCi0gICAgICAgIGNv
bXB1dGVPdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkoKm91dE9mRmxvd0JveCwgY29udGFpbmlu
Z0Jsb2NrQ29uc3RyYWludHMpOwotICAgICAgICBhdXRvIG91dE9mRmxvd0JveEhhc0NvbnRlbnQg
PSBpczxDb250YWluZXJCb3g+KCpvdXRPZkZsb3dCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJv
eD4oKm91dE9mRmxvd0JveCkuaGFzQ2hpbGQoKTsKLSAgICAgICAgaWYgKG91dE9mRmxvd0JveEhh
c0NvbnRlbnQpIHsKLSAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5lckJveCA9IGRvd25jYXN0PENv
bnRhaW5lckJveD4oKm91dE9mRmxvd0JveCk7Ci0gICAgICAgICAgICBhdXRvIGZvcm1hdHRpbmdD
b250ZXh0ID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmVy
Qm94LCBsYXlvdXRTdGF0ZSgpKTsKLSAgICAgICAgICAgIGlmIChjb250YWluZXJCb3guaGFzSW5G
bG93T3JGbG9hdGluZ0NoaWxkKCkpCi0gICAgICAgICAgICAgICAgZm9ybWF0dGluZ0NvbnRleHQt
PmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGdlb21ldHJ5KCkuY29uc3Ry
YWludHNGb3JJbkZsb3dDb250ZW50KGNvbnRhaW5lckJveCkpOwotICAgICAgICAgICAgY29tcHV0
ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoY29udGFpbmVyQm94LCBjb250YWluaW5nQmxvY2tD
b25zdHJhaW50cyk7Ci0gICAgICAgICAgICBmb3JtYXR0aW5nQ29udGV4dC0+bGF5b3V0T3V0T2ZG
bG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5jb25zdHJhaW50c0Zvck91
dE9mRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAg
ICAgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoKm91dE9mRmxvd0JveCwgY29udGFp
bmluZ0Jsb2NrQ29uc3RyYWludHMpOwotICAgIH0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0
dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiRW5kOiBsYXlvdXQgb3V0LW9mLWZsb3cgY29u
dGVudCAtPiBjb250ZXh0OiAiIDw8ICZsYXlvdXRTdGF0ZSgpIDw8ICIgcm9vdDogIiA8PCAmcm9v
dCgpKTsKLX0KLQotY29uc3QgQm94R2VvbWV0cnkmIEZvcm1hdHRpbmdDb250ZXh0OjpnZW9tZXRy
eUZvckJveChjb25zdCBCb3gmIGxheW91dEJveCwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiBlc2Nh
cGVSZWFzb24pIGNvbnN0Ci17Ci0gICAgVU5VU0VEX1BBUkFNKGVzY2FwZVJlYXNvbik7Ci0jaWYg
QVNTRVJUX0VOQUJMRUQKLSAgICBhdXRvIGlzT2tUb0FjY2Vzc0JveEdlb21ldHJ5ID0gWyZdIHsK
LSAgICAgICAgaWYgKCFpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihsYXlvdXRCb3gpICYmICZs
YXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCkgPT0gJnJvb3QoKSkgewotICAgICAgICAg
ICAgLy8gVGhpcyBpcyB0aGUgbm9uLWVzY2FwZSBjYXNlIG9mIGFjY2Vzc2luZyBhIGJveCdzIGdl
b21ldHJ5IGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgc2FtZSBmb3JtYXR0aW5nIGNvbnRleHQuCi0g
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZXNjYXBl
UmVhc29uKSB7Ci0gICAgICAgICAgICAvLyBBbnkgZ2VvbWV0cnkgYWNjZXNzIG91dHNpZGUgb2Yg
dGhlIGZvcm1hdHRpbmcgY29udGV4dCB3aXRob3V0IGEgdmFsaWQgcmVhc29uIGlzIGNvbnNpZGVy
ZWQgYW4gZXNjYXBlLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAg
ICAgICAgaWYgKCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpEb2N1bWVudEJveFN0cmV0
Y2hlc1RvVmlld3BvcnRRdWlyaykgewotICAgICAgICAgICAgQVNTRVJUKGxheW91dFN0YXRlKCku
aW5RdWlya3NNb2RlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGlzPEluaXRpYWxDb250YWluaW5n
QmxvY2s+KGxheW91dEJveCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKmVzY2FwZVJlYXNv
biA9PSBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspIHsKLSAgICAg
ICAgICAgIEFTU0VSVChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpKTsKLSAgICAgICAgICAg
IHJldHVybiBpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihsYXlvdXRCb3gpIHx8IGxheW91dEJv
eC5pc0RvY3VtZW50Qm94KCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgqZXNjYXBlUmVh
c29uID09IEVzY2FwZVJlYXNvbjo6VGFibGVRdWlya05lZWRzR2VvbWV0cnlGcm9tRXN0YWJsaXNo
ZWRGb3JtYXR0aW5nQ29udGV4dCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3
aGVuIHRoZSB0YWJsZSBmb3JtYXR0aW5nIHJvb3QgY29sbGVjdHMgZ2VvbWV0cnkgaW5mb3JtYXRp
b24gZnJvbSB0aGUgY2VsbCdzCi0gICAgICAgICAgICAvLyBmb3JtYXR0aW5nIGNvbnRleHQgdG8g
YmUgYWJsZSB0byBkZXRlcm1pbmUgd2lkdGgvaGVpZ2h0LiBzZWUgc2hvdWxkSWdub3JlQ2hpbGRD
b250ZW50VmVydGljYWxNYXJnaW4KLSAgICAgICAgICAgIEFTU0VSVChyb290KCkuZXN0YWJsaXNo
ZXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkpOwotICAgICAgICAgICAgcmV0dXJuICZsYXlvdXRC
b3guZm9ybWF0dGluZ0NvbnRleHRSb290KCkuZm9ybWF0dGluZ0NvbnRleHRSb290KCkgPT0gJnJv
b3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJl
YXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRyeSkgewotICAgICAgICAgICAgLy8g
V2hlbiBjb21wdXRpbmcgdGhlIHN0YXRpYyBwb3NpdGlvbiBvZiBhbiBvdXQtb2YtZmxvdyBib3gs
IHdlIG5lZWQgdG8gZ2F0aGVyIHNpYmxpbmcvcGFyZW50IGdlb21ldHJ5IGluZm9ybWF0aW9uCi0g
ICAgICAgICAgICAvLyBhcyBpZiB0aGUgb3V0LW9mLWZsb3cgYm94IHdhcyBhIHNpbXBsZSBpbmZs
b3cgYm94LgotICAgICAgICAgICAgLy8gTm93IHNpbmNlIHRoZSBvdXQtb2YtZmxvdyBhbmQgdGhl
IHNpYmxpbmcvcGFyZW50IGJveGVzIGNvdWxkIHZlcnkgd2VsbCBiZSBpbiBkaWZmZXJlbnQgY29u
dGFpbmluZyBibG9jayBzdWJ0cmVlcwotICAgICAgICAgICAgLy8gdGhlIGZvcm1hdHRpbmcgY29u
dGV4dCB0aGV5IGxpdmUgaW4gY291bGQgYWxzbyBiZSB2ZXJ5IGRpZmZlcmVudC4KLSAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCplc2NhcGVSZWFzb24g
PT0gRXNjYXBlUmVhc29uOjpGbG9hdEJveElzQWx3YXlzUmVsYXRpdmVUb0Zsb2F0U3RhdGVSb290
KSB7Ci0gICAgICAgICAgICAvLyBGbG9hdCBib3ggdG9wL2xlZnQgdmFsdWVzIGFyZSBtYXBwZWQg
cmVsYXRpdmUgdG8gdGhlIEZsb2F0U3RhdGUncyByb290LiBJbmxpbmUgZm9ybWF0dGluZyBjb250
ZXh0cyhBKSBpbmhlcml0IGZsb2F0cyBmcm9tIHBhcmVudAotICAgICAgICAgICAgLy8gYmxvY2sg
Zm9ybWF0dGluZyBjb250ZXh0cyhCKS4gRmxvYXRzIGluIHRoZXNlIGlubGluZSBmb3JtYXR0aW5n
IGNvbnRleHRzKEEpIG5lZWQgdG8gYmUgbWFwcGVkIHRvIHRoZSBwYXJlbnQsIGJsb2NrIGZvcm1h
dHRpbmcgY29udGV4dChCKS4KLSAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0Um9v
dCA9IGxheW91dEJveC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKLSAgICAgICAgICAgIHJldHVy
biAmZm9ybWF0dGluZ0NvbnRleHRSb290ID09ICZyb290KCkgfHwgJmZvcm1hdHRpbmdDb250ZXh0
Um9vdCA9PSAmcm9vdCgpLmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpOwotICAgICAgICB9Ci0KLSAg
ICAgICAgaWYgKCplc2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpGaW5kRml4ZWRIZWlnaHRB
bmNlc3RvclF1aXJrKSB7Ci0gICAgICAgICAgICBBU1NFUlQobGF5b3V0U3RhdGUoKS5pblF1aXJr
c01vZGUoKSk7Ci0gICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBjb250YWluaW5nIGJsb2Nr
IHdpdGggZml4ZWQgaGVpZ2h0IHF1aXJrLiBTZWUgUXVpcmtzOjpoZWlnaHRWYWx1ZU9mTmVhcmVz
dENvbnRhaW5pbmdCbG9ja1dpdGhGaXhlZEhlaWdodC4KLSAgICAgICAgICAgIC8vIFRoaXMgaXMg
b25seSB0byBjaGVjayBpZiB0aGUgdGFyZ2V0Rm9ybWF0dGluZ1Jvb3QgaXMgYW4gYW5jZXN0b3Ig
Zm9ybWF0dGluZyByb290LgotICAgICAgICAgICAgaWYgKGlzPEluaXRpYWxDb250YWluaW5nQmxv
Y2s+KGxheW91dEJveCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAg
ICBhdXRvJiB0YXJnZXRGb3JtYXR0aW5nUm9vdCA9IGxheW91dEJveC5mb3JtYXR0aW5nQ29udGV4
dFJvb3QoKTsKLSAgICAgICAgICAgIGF1dG8qIGFuY2VzdG9yRm9ybWF0dGluZ0NvbnRleHRSb290
ID0gJnJvb3QoKS5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKLSAgICAgICAgICAgIHdoaWxlICh0
cnVlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCZ0YXJnZXRGb3JtYXR0aW5nUm9vdCA9PSBhbmNl
c3RvckZvcm1hdHRpbmdDb250ZXh0Um9vdCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgICAgICAgICAgICAgYW5jZXN0b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QgPSAmYW5j
ZXN0b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QtPmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpOwotICAg
ICAgICAgICAgICAgIGlmIChpczxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPigqYW5jZXN0b3JGb3Jt
YXR0aW5nQ29udGV4dFJvb3QpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAg
ICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNvbjo6VGFibGVOZWVkc0FjY2Vzc1Rv
VGFibGVXcmFwcGVyKSB7Ci0gICAgICAgICAgICAvLyBUYWJsZXMgYXJlIHdyYXBwZWQgaW4gYSAy
IGxldmVsIGZvcm1hdHRpbmcgY29udGV4dCBzdHJ1Y3R1cmUuIEEgPHRhYmxlPiBlbGVtZW50IGlu
aXRpYXRlcyBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBmb3IgaXRzIHByaW5jaXBhbCB0YWJs
ZSBib3gKLSAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBjYXB0aW9uIGFuZCB0aGUgdGFibGUgY29u
dGVudCBsaXZlLiBJdCBhbHNvIGluaXRpYXRlcyBhIHRhYmxlIHdyYXBwZXIgYm94IHdoaWNoIGVz
dGFibGlzaGVzIHRoZSB0YWJsZSBmb3JtYXR0aW5nIGNvbnRleHQuCi0gICAgICAgICAgICAvLyBJ
biBtYW55IGNhc2VzIHRoZSBURkMgbmVlZHMgYWNjZXNzIHRvIHRoZSBwYXJlbnQgKGdlbmVyYXRl
ZCkgQkZDLgotICAgICAgICAgICAgcmV0dXJuICZsYXlvdXRCb3ggPT0gJnJvb3QoKS5mb3JtYXR0
aW5nQ29udGV4dFJvb3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfTsKLSNlbmRpZgotICAgIEFTU0VSVChp
c09rVG9BY2Nlc3NCb3hHZW9tZXRyeSgpKTsKLSAgICBBU1NFUlQobGF5b3V0U3RhdGUoKS5oYXNC
b3hHZW9tZXRyeShsYXlvdXRCb3gpKTsKLSAgICByZXR1cm4gbGF5b3V0U3RhdGUoKS5nZW9tZXRy
eUZvckJveChsYXlvdXRCb3gpOwotfQotCi12b2lkIEZvcm1hdHRpbmdDb250ZXh0Ojpjb2xsZWN0
T3V0T2ZGbG93RGVzY2VuZGFudHNJZk5lZWRlZCgpCi17Ci0gICAgaWYgKCFmb3JtYXR0aW5nU3Rh
dGUoKS5vdXRPZkZsb3dCb3hlcygpLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGF1
dG8mIHJvb3QgPSB0aGlzLT5yb290KCk7Ci0gICAgaWYgKCFyb290Lmhhc0NoaWxkKCkpCi0gICAg
ICAgIHJldHVybjsKLSAgICBpZiAoIXJvb3QuaXNQb3NpdGlvbmVkKCkgJiYgIWlzPEluaXRpYWxD
b250YWluaW5nQmxvY2s+KHJvb3QpKQotICAgICAgICByZXR1cm47Ci0gICAgLy8gQ29sbGVjdCB0
aGUgb3V0LW9mLWZsb3cgZGVzY2VuZGFudHMgYXQgdGhlIGZvcm1hdHRpbmcgcm9vdCBsZXZlbCAo
YXMgb3Bwb3NlZCB0byBhdCB0aGUgY29udGFpbmluZyBibG9jayBsZXZlbCwgdGhvdWdoIHRoZXkg
bWlnaHQgYmUgdGhlIHNhbWUpLgotICAgIC8vIEZJWE1FOiBUdXJuIHRoaXMgaW50byBhIHJlZ2lz
dGVyLXNlbGYgYXMgYm94ZXMgYXJlIGJlaW5nIGluc2VydGVkLgotICAgIGZvciAoYXV0byYgZGVz
Y2VuZGFudCA6IGRlc2NlbmRhbnRzT2ZUeXBlPEJveD4ocm9vdCkpIHsKLSAgICAgICAgaWYgKCFk
ZXNjZW5kYW50LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgIGlmICgmZGVzY2VuZGFudC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKSAhPSAmcm9v
dCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5hZGRP
dXRPZkZsb3dCb3goZGVzY2VuZGFudCk7Ci0gICAgfQotfQotCi0jaWZuZGVmIE5ERUJVRwotdm9p
ZCBGb3JtYXR0aW5nQ29udGV4dDo6dmFsaWRhdGVHZW9tZXRyeUNvbnN0cmFpbnRzQWZ0ZXJMYXlv
dXQoKSBjb25zdAotewotICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0Um9vdCA9IHJvb3QoKTsK
LSAgICAvLyBGSVhNRTogYWRkIGEgZGVzY2VuZGFudHNPZlR5cGU8PiBmbGF2b3IgdGhhdCBzdG9w
cyBhdCBuZXN0ZWQgZm9ybWF0dGluZyBjb250ZXh0cwotICAgIGZvciAoYXV0byYgbGF5b3V0Qm94
IDogZGVzY2VuZGFudHNPZlR5cGU8Qm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3QpKSB7Ci0gICAg
ICAgIGlmICgmbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpICE9ICZmb3JtYXR0aW5n
Q29udGV4dFJvb3QpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgYXV0byYgY29udGFp
bmluZ0Jsb2NrR2VvbWV0cnkgPSBnZW9tZXRyeUZvckJveChsYXlvdXRCb3guY29udGFpbmluZ0Js
b2NrKCkpOwotICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGdlb21ldHJ5Rm9yQm94KGxheW91
dEJveCk7Ci0KLSAgICAgICAgLy8gMTAuMy4zIEJsb2NrLWxldmVsLCBub24tcmVwbGFjZWQgZWxl
bWVudHMgaW4gbm9ybWFsIGZsb3cKLSAgICAgICAgLy8gMTAuMy43IEFic29sdXRlbHkgcG9zaXRp
b25lZCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzCi0gICAgICAgIGlmICgobGF5b3V0Qm94LmlzQmxv
Y2tMZXZlbEJveCgpIHx8IGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkgJiYgIWxh
eW91dEJveC5pc1JlcGxhY2VkQm94KCkpIHsKLSAgICAgICAgICAgIC8vIG1hcmdpbi1sZWZ0ICsg
Ym9yZGVyLWxlZnQtd2lkdGggKyBwYWRkaW5nLWxlZnQgKyB3aWR0aCArIHBhZGRpbmctcmlnaHQg
KyBib3JkZXItcmlnaHQtd2lkdGggKyBtYXJnaW4tcmlnaHQgPSB3aWR0aCBvZiBjb250YWluaW5n
IGJsb2NrCi0gICAgICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gY29udGFpbmlu
Z0Jsb2NrR2VvbWV0cnkuY29udGVudEJveFdpZHRoKCk7Ci0gICAgICAgICAgICBBU1NFUlQoYm94
R2VvbWV0cnkuaG9yaXpvbnRhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKSArIGJveEdlb21ldHJ5
LmNvbnRlbnRCb3hXaWR0aCgpID09IGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIDEwLjYuNCBBYnNvbHV0ZWx5IHBvc2l0aW9uZWQsIG5vbi1yZXBsYWNlZCBl
bGVtZW50cwotICAgICAgICBpZiAobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpICYm
ICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKSB7Ci0gICAgICAgICAgICAvLyB0b3AgKyBtYXJn
aW4tdG9wICsgYm9yZGVyLXRvcC13aWR0aCArIHBhZGRpbmctdG9wICsgaGVpZ2h0ICsgcGFkZGlu
Zy1ib3R0b20gKyBib3JkZXItYm90dG9tLXdpZHRoICsgbWFyZ2luLWJvdHRvbSArIGJvdHRvbSA9
IGhlaWdodCBvZiBjb250YWluaW5nIGJsb2NrCi0gICAgICAgICAgICBhdXRvIGNvbnRhaW5pbmdC
bG9ja0hlaWdodCA9IGNvbnRhaW5pbmdCbG9ja0dlb21ldHJ5LmNvbnRlbnRCb3hIZWlnaHQoKTsK
LSAgICAgICAgICAgIEFTU0VSVChCb3hHZW9tZXRyeTo6Ym9yZGVyQm94VG9wKGJveEdlb21ldHJ5
KSArIGJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpICsgYm94R2VvbWV0cnkuYm9yZGVyVG9wKCkg
KyBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKSArIGJveEdlb21ldHJ5LmNvbnRl
bnRCb3hIZWlnaHQoKQotICAgICAgICAgICAgICAgICsgYm94R2VvbWV0cnkucGFkZGluZ0JvdHRv
bSgpLnZhbHVlT3IoMCkgKyBib3hHZW9tZXRyeS5ib3JkZXJCb3R0b20oKSArIGJveEdlb21ldHJ5
Lm1hcmdpbkFmdGVyKCkgPT0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KTsKLSAgICAgICAgfQotICAg
IH0KLX0KLSNlbmRpZgotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1h
dHRpbmdDb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMTAyNTU4OGVj
NGEwM2Q5ZTM1YTBhYzkzMGE3NzZjNjIzZjg0NDQuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdDb250
ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
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
dWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRVbml0LmgiCi0jaW5j
bHVkZSAiTGF5b3V0VW5pdHMuaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+Ci0jaW5jbHVk
ZSA8d3RmL1dlYWtQdHIuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1jbGFzcyBMYXlvdXRT
aXplOwotc3RydWN0IExlbmd0aDsKLQotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIEJveEdl
b21ldHJ5OwotY2xhc3MgUmVwbGFjZWRCb3g7Ci1zdHJ1Y3QgQ29tcHV0ZWRIb3Jpem9udGFsTWFy
Z2luOwotc3RydWN0IENvbXB1dGVkVmVydGljYWxNYXJnaW47Ci1jbGFzcyBDb250YWluZXJCb3g7
Ci1zdHJ1Y3QgQ29udGVudEhlaWdodEFuZE1hcmdpbjsKLXN0cnVjdCBDb250ZW50V2lkdGhBbmRN
YXJnaW47Ci1zdHJ1Y3QgRWRnZXM7Ci1jbGFzcyBGb3JtYXR0aW5nU3RhdGU7Ci1zdHJ1Y3QgSG9y
aXpvbnRhbEdlb21ldHJ5OwotY2xhc3MgSW52YWxpZGF0aW9uU3RhdGU7Ci1jbGFzcyBMYXlvdXRT
dGF0ZTsKLXN0cnVjdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlczsKLXN0cnVjdCBPdmVycmlk
ZGVuVmVydGljYWxWYWx1ZXM7Ci1zdHJ1Y3QgVmVydGljYWxHZW9tZXRyeTsKLQotY2xhc3MgRm9y
bWF0dGluZ0NvbnRleHQgewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoRm9ybWF0dGluZ0Nv
bnRleHQpOwotcHVibGljOgotICAgIEZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJv
eCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBGb3JtYXR0aW5nU3RhdGUmKTsKLSAgICB2aXJ0dWFs
IH5Gb3JtYXR0aW5nQ29udGV4dCgpOwotCi0gICAgc3RydWN0IENvbnN0cmFpbnRzRm9ySW5GbG93
Q29udGVudCB7Ci0gICAgICAgIEhvcml6b250YWxDb25zdHJhaW50cyBob3Jpem9udGFsOwotICAg
ICAgICBWZXJ0aWNhbENvbnN0cmFpbnRzIHZlcnRpY2FsOwotICAgIH07Ci0gICAgdmlydHVhbCB2
b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJh
aW50c0ZvckluRmxvd0NvbnRlbnQmKSA9IDA7Ci0KLSAgICBzdHJ1Y3QgQ29uc3RyYWludHNGb3JP
dXRPZkZsb3dDb250ZW50IHsKLSAgICAgICAgSG9yaXpvbnRhbENvbnN0cmFpbnRzIGhvcml6b250
YWw7Ci0gICAgICAgIFZlcnRpY2FsQ29uc3RyYWludHMgdmVydGljYWw7Ci0gICAgICAgIC8vIEJv
cmRlcnMgYW5kIHBhZGRpbmcgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIGNvbnRhaW5pbmcgYmxv
Y2sncyBjb250ZW50IGJveCBhcyBpZiB0aGUgYm94IHdhcyBhbiBpbi1mbG93IGJveC4KLSAgICAg
ICAgTGF5b3V0VW5pdCBib3JkZXJBbmRQYWRkaW5nQ29uc3RyYWludHM7Ci0gICAgfTsKLSAgICB2
b2lkIGxheW91dE91dE9mRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25z
dHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQmKTsKLQotICAgIHN0cnVjdCBJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzIHsKLSAgICAgICAgdm9pZCBleHBhbmQoTGF5b3V0VW5pdCBob3Jpem9udGFs
VmFsdWUpOwotICAgICAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzJiBvcGVyYXRvcis9KGNv
bnN0IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmKTsKLSAgICAgICAgSW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyYgb3BlcmF0b3IrPShMYXlvdXRVbml0KTsKLSAgICAgICAgSW50cmluc2ljV2lk
dGhDb25zdHJhaW50cyYgb3BlcmF0b3ItPShjb25zdCBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
Jik7Ci0gICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIG9wZXJhdG9yLT0oTGF5b3V0
VW5pdCk7Ci0KLSAgICAgICAgTGF5b3V0VW5pdCBtaW5pbXVtOwotICAgICAgICBMYXlvdXRVbml0
IG1heGltdW07Ci0gICAgfTsKLSAgICB2aXJ0dWFsIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMg
Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgPSAwOwotICAgIHZpcnR1YWwgTGF5
b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0ID0gMDsKLQotICAgIGJvb2wgaXNCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFibGlzaGVzQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dCgpOyB9Ci0gICAgYm9vbCBpc0lubGluZUZvcm1hdHRpbmdDb250
ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFibGlzaGVzSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQoKTsgfQotICAgIGJvb2wgaXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyBy
ZXR1cm4gcm9vdCgpLmVzdGFibGlzaGVzVGFibGVGb3JtYXR0aW5nQ29udGV4dCgpOyB9Ci0gICAg
Ym9vbCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVy
biBpc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSAmJiByb290KCkuaXNUYWJsZVdyYXBwZXJCb3go
KTsgfQotICAgIGJvb2wgaXNGbGV4Rm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBy
b290KCkuZXN0YWJsaXNoZXNGbGV4Rm9ybWF0dGluZ0NvbnRleHQoKTsgfQotCi0gICAgZW51bSBj
bGFzcyBFc2NhcGVSZWFzb24gewotICAgICAgICBUYWJsZVF1aXJrTmVlZHNHZW9tZXRyeUZyb21F
c3RhYmxpc2hlZEZvcm1hdHRpbmdDb250ZXh0LAotICAgICAgICBPdXRPZkZsb3dCb3hOZWVkc0lu
Rmxvd0dlb21ldHJ5LAotICAgICAgICBGbG9hdEJveElzQWx3YXlzUmVsYXRpdmVUb0Zsb2F0U3Rh
dGVSb290LAotICAgICAgICBGaW5kRml4ZWRIZWlnaHRBbmNlc3RvclF1aXJrLAotICAgICAgICBE
b2N1bWVudEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaywKLSAgICAgICAgQm9keVN0cmV0Y2hl
c1RvVmlld3BvcnRRdWlyaywKLSAgICAgICAgVGFibGVOZWVkc0FjY2Vzc1RvVGFibGVXcmFwcGVy
Ci0gICAgfTsKLSAgICBjb25zdCBCb3hHZW9tZXRyeSYgZ2VvbWV0cnlGb3JCb3goY29uc3QgQm94
JiwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiA9IFdURjo6bnVsbG9wdCkgY29uc3Q7Ci0gICAgY29u
c3QgQ29udGFpbmVyQm94JiByb290KCkgY29uc3QgeyByZXR1cm4gKm1fcm9vdDsgfQotCi0gICAg
TGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICB1c2lu
ZyBMYXlvdXRRdWV1ZSA9IFZlY3Rvcjxjb25zdCBCb3gqPjsKLQotICAgIGNvbnN0IEZvcm1hdHRp
bmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9mb3JtYXR0aW5nU3Rh
dGU7IH0KLSAgICBGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIG1f
Zm9ybWF0dGluZ1N0YXRlOyB9Ci0KLSAgICB2b2lkIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKGNv
bnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOwotCi0jaWZuZGVmIE5ERUJV
RwotICAgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZUdlb21ldHJ5Q29uc3RyYWludHNBZnRlckxheW91
dCgpIGNvbnN0OwotI2VuZGlmCi0KLSAgICAvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgZ2VuZXJp
YyBwb3NpdGlvbmluZyBhbmQgc2l6aW5nLgotICAgIGNsYXNzIEdlb21ldHJ5IHsKLSAgICBwdWJs
aWM6Ci0gICAgICAgIFZlcnRpY2FsR2VvbWV0cnkgb3V0T2ZGbG93VmVydGljYWxHZW9tZXRyeShj
b25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBWZXJ0aWNhbENv
bnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7Ci0gICAg
ICAgIEhvcml6b250YWxHZW9tZXRyeSBvdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkoY29uc3Qg
Qm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgVmVydGljYWxDb25zdHJh
aW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0KLSAgICAgICAgQ29u
dGVudEhlaWdodEFuZE1hcmdpbiBmbG9hdGluZ0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3Qg
Qm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRp
Y2FsVmFsdWVzJikgY29uc3Q7Ci0gICAgICAgIENvbnRlbnRXaWR0aEFuZE1hcmdpbiBmbG9hdGlu
Z0NvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYpOwotCi0gICAgICAgIENv
bnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5saW5lUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2lu
KGNvbnN0IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgT3B0aW9u
YWw8VmVydGljYWxDb25zdHJhaW50cz4sIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYp
IGNvbnN0OwotICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gaW5saW5lUmVwbGFjZWRDb250
ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29u
c3RyYWludHMmLCBPcHRpb25hbDxWZXJ0aWNhbENvbnN0cmFpbnRzPiwgY29uc3QgT3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMmKTsKLQotICAgICAgICBMYXlvdXRTaXplIGluRmxvd1Bvc2l0aW9u
ZWRQb3NpdGlvbk9mZnNldChjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMm
KSBjb25zdDsKLQotICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGNvbXBsaWNhdGVkQ2Fz
ZXMoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJp
ZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7Ci0gICAgICAgIExheW91dFVuaXQgc2hyaW5rVG9G
aXRXaWR0aChjb25zdCBCb3gmLCBMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKTsKLQotICAgICAg
ICBFZGdlcyBjb21wdXRlZEJvcmRlcihjb25zdCBCb3gmKSBjb25zdDsKLSAgICAgICAgT3B0aW9u
YWw8RWRnZXM+IGNvbXB1dGVkUGFkZGluZyhjb25zdCBCb3gmLCBMYXlvdXRVbml0IGNvbnRhaW5p
bmdCbG9ja1dpZHRoKSBjb25zdDsKLQotICAgICAgICBDb21wdXRlZEhvcml6b250YWxNYXJnaW4g
Y29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYpIGNvbnN0OwotICAgICAgICBDb21wdXRlZFZlcnRpY2FsTWFyZ2luIGNvbXB1dGVk
VmVydGljYWxNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJikg
Y29uc3Q7Ci0KLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRWYWx1ZShjb25z
dCBMZW5ndGgmIGdlb21ldHJ5UHJvcGVydHksIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lk
dGgpIGNvbnN0OwotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBmaXhlZFZhbHVlKGNvbnN0
IExlbmd0aCYgZ2VvbWV0cnlQcm9wZXJ0eSkgY29uc3Q7Ci0KLSAgICAgICAgT3B0aW9uYWw8TGF5
b3V0VW5pdD4gY29tcHV0ZWRNaW5IZWlnaHQoY29uc3QgQm94JiwgT3B0aW9uYWw8TGF5b3V0VW5p
dD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RGOjpudWxsb3B0KSBjb25zdDsKLSAgICAgICAg
T3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRNYXhIZWlnaHQoY29uc3QgQm94JiwgT3B0aW9u
YWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RGOjpudWxsb3B0KSBjb25z
dDsKLQotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZE1pbldpZHRoKGNvbnN0
IEJveCYsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgICAgICBPcHRpb25h
bDxMYXlvdXRVbml0PiBjb21wdXRlZE1heFdpZHRoKGNvbnN0IEJveCYsIExheW91dFVuaXQgY29u
dGFpbmluZ0Jsb2NrV2lkdGgpOwotCi0gICAgICAgIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzIGNvbnN0cmFpbkJ5TWluTWF4V2lkdGgoY29uc3QgQm94JiwgSW50
cmluc2ljV2lkdGhDb25zdHJhaW50cykgY29uc3Q7Ci0KLSAgICAgICAgTGF5b3V0VW5pdCBjb250
ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KGNvbnN0IENvbnRhaW5lckJveCYpIGNv
bnN0OwotCi0gICAgICAgIENvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCBjb25zdHJhaW50
c0Zvck91dE9mRmxvd0NvbnRlbnQoY29uc3QgQ29udGFpbmVyQm94Jik7Ci0gICAgICAgIENvbnN0
cmFpbnRzRm9ySW5GbG93Q29udGVudCBjb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29uc3Qg
Q29udGFpbmVyQm94JiwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiA9IFdURjo6bnVsbG9wdCk7Ci0K
LSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRIZWlnaHQoY29uc3QgQm94Jiwg
T3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RGOjpudWxsb3B0
KSBjb25zdDsKLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRXaWR0aChjb25z
dCBCb3gmLCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLQotICAgIHByb3RlY3Rl
ZDoKLSAgICAgICAgZnJpZW5kIGNsYXNzIEZvcm1hdHRpbmdDb250ZXh0OwotICAgICAgICBHZW9t
ZXRyeShjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0gICAgICAgIGNvbnN0IExheW91dFN0
YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRleHQubGF5
b3V0U3RhdGUoKTsgfQotICAgICAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSB7IHJldHVy
biBtX2Zvcm1hdHRpbmdDb250ZXh0LmxheW91dFN0YXRlKCk7IH0KLSAgICAgICAgY29uc3QgRm9y
bWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9mb3Jt
YXR0aW5nQ29udGV4dDsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgVmVydGljYWxHZW9tZXRy
eSBvdXRPZkZsb3dSZXBsYWNlZFZlcnRpY2FsR2VvbWV0cnkoY29uc3QgUmVwbGFjZWRCb3gmLCBj
b25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiwg
Y29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7Ci0gICAgICAgIEhvcml6b250
YWxHZW9tZXRyeSBvdXRPZkZsb3dSZXBsYWNlZEhvcml6b250YWxHZW9tZXRyeShjb25zdCBSZXBs
YWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IFZlcnRpY2FsQ29u
c3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYpOwotCi0gICAgICAg
IFZlcnRpY2FsR2VvbWV0cnkgb3V0T2ZGbG93Tm9uUmVwbGFjZWRWZXJ0aWNhbEdlb21ldHJ5KGNv
bnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IFZl
cnRpY2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKSBjb25z
dDsKLSAgICAgICAgSG9yaXpvbnRhbEdlb21ldHJ5IG91dE9mRmxvd05vblJlcGxhY2VkSG9yaXpv
bnRhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0KLSAgICAgICAgQ29u
dGVudEhlaWdodEFuZE1hcmdpbiBmbG9hdGluZ1JlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdp
bihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0
IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpIGNvbnN0OwotICAgICAgICBDb250ZW50V2lkdGhB
bmRNYXJnaW4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBSZXBs
YWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5I
b3Jpem9udGFsVmFsdWVzJik7Ci0KLSAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGZsb2F0
aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsK
LQotICAgICAgICBMYXlvdXRVbml0IHN0YXRpY1ZlcnRpY2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQ
b3NpdGlvbmVkKGNvbnN0IEJveCYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmKSBjb25zdDsK
LSAgICAgICAgTGF5b3V0VW5pdCBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb25Gb3JPdXRPZkZsb3dQ
b3NpdGlvbmVkKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpIGNvbnN0
OwotCi0gICAgICAgIGVudW0gY2xhc3MgSGVpZ2h0VHlwZSB7IE1pbiwgTWF4LCBOb3JtYWwgfTsK
LSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRIZWlnaHRWYWx1ZShjb25zdCBC
b3gmLCBIZWlnaHRUeXBlLCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWln
aHQpIGNvbnN0OwotCi0gICAgICAgIGVudW0gY2xhc3MgV2lkdGhUeXBlIHsgTWluLCBNYXgsIE5v
cm1hbCB9OwotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZFdpZHRoVmFsdWUo
Y29uc3QgQm94JiwgV2lkdGhUeXBlLCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsK
LQotICAgICAgICBjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgbV9mb3JtYXR0aW5nQ29udGV4dDsK
LSAgICB9OwotICAgIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgpIGNvbnN0
IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlzKTsgfQotCi0gICAgY2xhc3MgUXVpcmtzIHsKLSAgICBw
dWJsaWM6Ci0gICAgICAgIFF1aXJrcyhjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0gICAg
ICAgIExheW91dFVuaXQgaGVpZ2h0VmFsdWVPZk5lYXJlc3RDb250YWluaW5nQmxvY2tXaXRoRml4
ZWRIZWlnaHQoY29uc3QgQm94Jik7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGNvbnN0IExh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRl
eHQubGF5b3V0U3RhdGUoKTsgfQotICAgICAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSB7
IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0LmxheW91dFN0YXRlKCk7IH0KLSAgICAgICAgY29u
c3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4g
bV9mb3JtYXR0aW5nQ29udGV4dDsgfQotCi0gICAgICAgIGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0
JiBtX2Zvcm1hdHRpbmdDb250ZXh0OwotICAgIH07Ci0gICAgRm9ybWF0dGluZ0NvbnRleHQ6OlF1
aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9Ci0KLXByaXZhdGU6
Ci0gICAgdm9pZCBjb2xsZWN0T3V0T2ZGbG93RGVzY2VuZGFudHNJZk5lZWRlZCgpOwotICAgIHZv
aWQgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoY29uc3QgQm94JiwgY29uc3QgQ29u
c3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50Jik7Ci0gICAgdm9pZCBjb21wdXRlT3V0T2ZGbG93
SG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0IEJveCYsIGNvbnN0IENvbnN0cmFpbnRzRm9yT3V0T2ZG
bG93Q29udGVudCYpOwotCi0gICAgV2Vha1B0cjxjb25zdCBDb250YWluZXJCb3g+IG1fcm9vdDsK
LSAgICBGb3JtYXR0aW5nU3RhdGUmIG1fZm9ybWF0dGluZ1N0YXRlOwotfTsKLQotaW5saW5lIEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6R2VvbWV0cnkoY29uc3QgRm9ybWF0dGluZ0NvbnRl
eHQmIGZvcm1hdHRpbmdDb250ZXh0KQotICAgIDogbV9mb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0
aW5nQ29udGV4dCkKLXsKLX0KLQotaW5saW5lIEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OlF1
aXJrcyhjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQpCi0gICAgOiBt
X2Zvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0KQotewotfQotCi1pbmxpbmUgdm9p
ZCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50czo6ZXhwYW5kKExh
eW91dFVuaXQgaG9yaXpvbnRhbFZhbHVlKQotewotICAgIG1pbmltdW0gKz0gaG9yaXpvbnRhbFZh
bHVlOwotICAgIG1heGltdW0gKz0gaG9yaXpvbnRhbFZhbHVlOwotfQotCi1pbmxpbmUgRm9ybWF0
dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIEZvcm1hdHRpbmdDb250ZXh0
OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOjpvcGVyYXRvcis9KGNvbnN0IEludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMmIG90aGVyKQotewotICAgIG1pbmltdW0gKz0gb3RoZXIubWluaW11bTsK
LSAgICBtYXhpbXVtICs9IG90aGVyLm1heGltdW07Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1p
bmxpbmUgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIEZvcm1h
dHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOjpvcGVyYXRvcis9KExheW91
dFVuaXQgdmFsdWUpCi17Ci0gICAgZXhwYW5kKHZhbHVlKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19
Ci0KLWlubGluZSBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYg
Rm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM6Om9wZXJhdG9yLT0o
Y29uc3QgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3RoZXIpCi17Ci0gICAgbWluaW11bSAt
PSBvdGhlci5taW5pbXVtOwotICAgIG1heGltdW0gLT0gb3RoZXIubWF4aW11bTsKLSAgICByZXR1
cm4gKnRoaXM7Ci19Ci0KLWlubGluZSBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyYgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM6
Om9wZXJhdG9yLT0oTGF5b3V0VW5pdCB2YWx1ZSkKLXsKLSAgICBleHBhbmQoLXZhbHVlKTsKLSAg
ICByZXR1cm4gKnRoaXM7Ci19Ci0KLX0KLX0KLQotI2RlZmluZSBTUEVDSUFMSVpFX1RZUEVfVFJB
SVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoVG9WYWx1ZVR5cGVOYW1lLCBwcmVkaWNhdGUp
IFwKLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfQkVHSU4oV2ViQ29yZTo6TGF5b3V0OjpUb1ZhbHVl
VHlwZU5hbWUpIFwKLSAgICBzdGF0aWMgYm9vbCBpc1R5cGUoY29uc3QgV2ViQ29yZTo6TGF5b3V0
OjpGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQpIHsgcmV0dXJuIGZvcm1hdHRp
bmdDb250ZXh0LnByZWRpY2F0ZTsgfSBcCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0VORCgpCi0K
LSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdDb250
ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdDb250ZXh0
R2VvbWV0cnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWIxOTY1N2I4YmU3
MTk5YWEzZmZjMjA2ZjU3MjFhNzJjZDYyYzgxLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4
dEdlb21ldHJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNjUgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0g
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQot
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgot
Ci0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJCbG9j
a0Zvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkZsZXhGb3JtYXR0aW5nU3RhdGUuaCIKLSNp
bmNsdWRlICJGbG9hdGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJGbG9hdGluZ1N0YXRlLmgiCi0j
aW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGV4
dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKLSNpbmNsdWRl
ICJMYXlvdXRSZXBsYWNlZEJveC5oIgotI2luY2x1ZGUgIkxvZ2dpbmcuaCIKLSNpbmNsdWRlICJU
YWJsZUZvcm1hdHRpbmdTdGF0ZS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2Ug
TGF5b3V0IHsKLQotc3RhdGljIGlubGluZSBib29sIGlzSGVpZ2h0QXV0byhjb25zdCBCb3gmIGxh
eW91dEJveCkKLXsKLSAgICAvLyAxMC41IENvbnRlbnQgaGVpZ2h0OiB0aGUgJ2hlaWdodCcgcHJv
cGVydHkKLSAgICAvLwotICAgIC8vIFRoZSBwZXJjZW50YWdlIGlzIGNhbGN1bGF0ZWQgd2l0aCBy
ZXNwZWN0IHRvIHRoZSBoZWlnaHQgb2YgdGhlIGdlbmVyYXRlZCBib3gncyBjb250YWluaW5nIGJs
b2NrLgotICAgIC8vIElmIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgbm90
IHNwZWNpZmllZCBleHBsaWNpdGx5IChpLmUuLCBpdCBkZXBlbmRzIG9uIGNvbnRlbnQgaGVpZ2h0
KSwKLSAgICAvLyBhbmQgdGhpcyBlbGVtZW50IGlzIG5vdCBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQs
IHRoZSB1c2VkIGhlaWdodCBpcyBjYWxjdWxhdGVkIGFzIGlmICdhdXRvJyB3YXMgc3BlY2lmaWVk
LgotCi0gICAgYXV0byBoZWlnaHQgPSBsYXlvdXRCb3guc3R5bGUoKS5sb2dpY2FsSGVpZ2h0KCk7
Ci0gICAgaWYgKGhlaWdodC5pc0F1dG8oKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBp
ZiAoaGVpZ2h0LmlzUGVyY2VudCgpKSB7Ci0gICAgICAgIGlmIChsYXlvdXRCb3guaXNPdXRPZkZs
b3dQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0
dXJuICFsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkuc3R5bGUoKS5sb2dpY2FsSGVpZ2h0KCku
aXNGaXhlZCgpOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotT3B0aW9uYWw8TGF5
b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZEhlaWdodFZhbHVl
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBIZWlnaHRUeXBlIGhlaWdodFR5cGUsIE9wdGlvbmFsPExh
eW91dFVuaXQ+IGNvbnRhaW5pbmdCbG9ja0hlaWdodCkgY29uc3QKLXsKLSAgICBhdXRvJiBzdHls
ZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIGF1dG8gaGVpZ2h0ID0gaGVpZ2h0VHlwZSA9PSBI
ZWlnaHRUeXBlOjpOb3JtYWwgPyBzdHlsZS5sb2dpY2FsSGVpZ2h0KCkgOiBoZWlnaHRUeXBlID09
IEhlaWdodFR5cGU6Ok1pbiA/IHN0eWxlLmxvZ2ljYWxNaW5IZWlnaHQoKSA6IHN0eWxlLmxvZ2lj
YWxNYXhIZWlnaHQoKTsKLSAgICBpZiAoaGVpZ2h0LmlzVW5kZWZpbmVkKCkgfHwgaGVpZ2h0Lmlz
QXV0bygpIHx8IGhlaWdodC5pc01heENvbnRlbnQoKSB8fCBoZWlnaHQuaXNNaW5Db250ZW50KCkg
fHwgaGVpZ2h0LmlzRml0Q29udGVudCgpKQotICAgICAgICByZXR1cm4geyB9OwotCi0gICAgaWYg
KGhlaWdodC5pc0ZpeGVkKCkpCi0gICAgICAgIHJldHVybiBMYXlvdXRVbml0IHsgaGVpZ2h0LnZh
bHVlKCkgfTsKLQotICAgIGlmICghY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSB7Ci0gICAgICAgIGlm
IChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpKQotICAgICAgICAgICAgY29udGFpbmluZ0Js
b2NrSGVpZ2h0ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5oZWlnaHRWYWx1ZU9mTmVh
cmVzdENvbnRhaW5pbmdCbG9ja1dpdGhGaXhlZEhlaWdodChsYXlvdXRCb3gpOwotICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgIGF1dG8gbm9uQW5vbnltb3VzQ29udGFpbmluZ0Jsb2NrTG9naWNh
bEhlaWdodCA9IFsmXSB7Ci0gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgYmxvY2sgbGV2ZWwg
Ym94IGlzIGEgZGlyZWN0IGNoaWxkIG9mIGFuIGlubGluZSBsZXZlbCBib3ggKDxzcGFuPjxkaXY+
PC9kaXY+PC9zcGFuPikgYW5kIHdlIHdyYXAgaXQgaW50byBhIGNvbnRpbnVhdGlvbiwKLSAgICAg
ICAgICAgICAgICAvLyB0aGUgY29udGFpbmluZyBibG9jayAoYW5vbnltb3VzIHdyYXBwZXIpIGlz
IG5vdCB0aGUgYm94IHdlIG5lZWQgdG8gY2hlY2sgZm9yIGZpeGVkIGhlaWdodC4KLSAgICAgICAg
ICAgICAgICBhdXRvJiBpbml0aWFsQ29udGFpbmluZ0Jsb2NrID0gbGF5b3V0Qm94LmluaXRpYWxD
b250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8qIGNvbnRhaW5pbmdC
bG9jayA9ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7IGNvbnRhaW5pbmdCbG9jayAhPSAm
aW5pdGlhbENvbnRhaW5pbmdCbG9jazsgY29udGFpbmluZ0Jsb2NrID0gJmNvbnRhaW5pbmdCbG9j
ay0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5p
bmdCbG9jay0+aXNBbm9ueW1vdXMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrLT5zdHlsZSgpLmxv
Z2ljYWxIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJu
IGluaXRpYWxDb250YWluaW5nQmxvY2suc3R5bGUoKS5sb2dpY2FsSGVpZ2h0KCk7Ci0gICAgICAg
ICAgICB9OwotICAgICAgICAgICAgY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gZml4ZWRWYWx1ZShu
b25Bbm9ueW1vdXNDb250YWluaW5nQmxvY2tMb2dpY2FsSGVpZ2h0KCkpOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgaWYgKCFjb250YWluaW5nQmxvY2tIZWlnaHQpCi0gICAgICAgIHJldHVybiB7
IH07Ci0KLSAgICByZXR1cm4gdmFsdWVGb3JMZW5ndGgoaGVpZ2h0LCAqY29udGFpbmluZ0Jsb2Nr
SGVpZ2h0KTsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5Ojpjb21wdXRlZEhlaWdodChjb25zdCBCb3gmIGxheW91dEJveCwgT3B0aW9uYWw8TGF5
b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSBjb25zdAotewotICAgIGlmIChhdXRvIGhl
aWdodCA9IGNvbXB1dGVkSGVpZ2h0VmFsdWUobGF5b3V0Qm94LCBIZWlnaHRUeXBlOjpOb3JtYWws
IGNvbnRhaW5pbmdCbG9ja0hlaWdodCkpIHsKLSAgICAgICAgaWYgKGxheW91dEJveC5zdHlsZSgp
LmJveFNpemluZygpID09IEJveFNpemluZzo6Q29udGVudEJveCkKLSAgICAgICAgICAgIHJldHVy
biBoZWlnaHQ7Ci0gICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQo
KS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwotICAgICAgICByZXR1cm4gKmhlaWdodCAtIChi
b3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgYm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5n
KCkudmFsdWVPcigwKSk7Ci0gICAgfQotICAgIHJldHVybiB7IH07Ci19Ci0KLU9wdGlvbmFsPExh
eW91dFVuaXQ+IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRXaWR0aFZhbHVl
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBXaWR0aFR5cGUgd2lkdGhUeXBlLCBMYXlvdXRVbml0IGNv
bnRhaW5pbmdCbG9ja1dpZHRoKQotewotICAgIC8vIEFwcGxpZXMgdG86IGFsbCBlbGVtZW50cyBl
eGNlcHQgbm9uLXJlcGxhY2VkIGlubGluZXMgKG91dC1vZi1mbG93IGNoZWNrIGlzIHJlcXVpcmVk
IGZvciBwb3NpdGlvbmVkIDxicj4gYXMgZm9yIHNvbWUgcmVhc29uIHdlIGRvbid0IGJsb2NraWZ5
IHRoZW0pLgotICAgIEFTU0VSVCghbGF5b3V0Qm94LmlzSW5saW5lQm94KCkgfHwgbGF5b3V0Qm94
LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKLQotICAgIGF1dG8gd2lkdGggPSBbJl0gewotICAg
ICAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgICAgICBzd2l0Y2ggKHdp
ZHRoVHlwZSkgewotICAgICAgICBjYXNlIFdpZHRoVHlwZTo6Tm9ybWFsOgotICAgICAgICAgICAg
cmV0dXJuIHN0eWxlLmxvZ2ljYWxXaWR0aCgpOwotICAgICAgICBjYXNlIFdpZHRoVHlwZTo6TWlu
OgotICAgICAgICAgICAgcmV0dXJuIHN0eWxlLmxvZ2ljYWxNaW5XaWR0aCgpOwotICAgICAgICBj
YXNlIFdpZHRoVHlwZTo6TWF4OgotICAgICAgICAgICAgcmV0dXJuIHN0eWxlLmxvZ2ljYWxNYXhX
aWR0aCgpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAg
ICByZXR1cm4gc3R5bGUubG9naWNhbFdpZHRoKCk7Ci0gICAgfSgpOwotICAgIGlmIChhdXRvIGNv
bXB1dGVkVmFsdWUgPSB0aGlzLT5jb21wdXRlZFZhbHVlKHdpZHRoLCBjb250YWluaW5nQmxvY2tX
aWR0aCkpCi0gICAgICAgIHJldHVybiBjb21wdXRlZFZhbHVlOwotCi0gICAgaWYgKHdpZHRoLmlz
TWluQ29udGVudCgpIHx8IHdpZHRoLmlzTWF4Q29udGVudCgpIHx8IHdpZHRoLmlzRml0Q29udGVu
dCgpKSB7Ci0gICAgICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpKQotICAgICAg
ICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgYXV0byYgY29udGFpbmVyQm94ID0gZG93bmNhc3Q8
Q29udGFpbmVyQm94PihsYXlvdXRCb3gpOwotICAgICAgICAvLyBGSVhNRTogQ29uc2lkZXIgc3Bs
aXR0aW5nIHVwIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBzbyB0aGF0IHdlIGNv
dWxkIGNvbXB1dGVkIHRoZSBtaW4gYW5kIG1heCB2YWx1ZXMgc2VwYXJhdGVseS4KLSAgICAgICAg
YXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gWyZdIHsKLSAgICAgICAgICAgIGlmICgh
Y29udGFpbmVyQm94Lmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQotICAgICAgICAgICAgICAg
IHJldHVybiBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgMF9sdSwgY29udGFpbmluZ0Jsb2Nr
V2lkdGggfTsKLSAgICAgICAgICAgIEFTU0VSVChjb250YWluZXJCb3guZXN0YWJsaXNoZXNGb3Jt
YXR0aW5nQ29udGV4dCgpKTsKLSAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IGxh
eW91dFN0YXRlKCkuZW5zdXJlRm9ybWF0dGluZ1N0YXRlKGNvbnRhaW5lckJveCk7Ci0gICAgICAg
ICAgICBpZiAoYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gZm9ybWF0dGluZ1N0YXRl
LmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKmlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Ci0gICAgICAgICAgICByZXR1cm4gTGF5b3V0Q29udGV4
dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmVyQm94LCBsYXlvdXRTdGF0ZSgpKS0+
Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIH0oKTsKLSAgICAg
ICAgaWYgKHdpZHRoLmlzTWluQ29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIGludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMubWluaW11bTsKLSAgICAgICAgaWYgKHdpZHRoLmlzTWF4Q29udGVu
dCgpKQotICAgICAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11
bTsKLSAgICAgICAgQVNTRVJUKHdpZHRoLmlzRml0Q29udGVudCgpKTsKLSAgICAgICAgLy8gSWYg
dGhlIGF2YWlsYWJsZSBzcGFjZSBpbiBhIGdpdmVuIGF4aXMgaXMgZGVmaW5pdGUsIGVxdWFsIHRv
IG1pbihtYXgtY29udGVudCBzaXplLAotICAgICAgICAvLyBtYXgobWluLWNvbnRlbnQgc2l6ZSwg
c3RyZXRjaC1maXQgc2l6ZSkpLiBPdGhlcndpc2UsIGVxdWFsIHRvIHRoZSBtYXgtY29udGVudCBz
aXplIGluIHRoYXQgYXhpcy4KLSAgICAgICAgLy8gRklYTUU6IFdlIGRvbid0IHlldCBoYXZlIGlu
ZGVmaW5pdGUgYXZhaWxhYmxlIHNpemUuCi0gICAgICAgIHJldHVybiBzdGQ6Om1pbihpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMubWluaW11bSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpKTsKLSAgICB9Ci0gICAgcmV0dXJu
IHsgfTsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5Ojpjb21wdXRlZFdpZHRoKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBMYXlvdXRVbml0IGNvbnRh
aW5pbmdCbG9ja1dpZHRoKQotewotICAgIGlmIChhdXRvIGNvbXB1dGVkV2lkdGggPSBjb21wdXRl
ZFdpZHRoVmFsdWUobGF5b3V0Qm94LCBXaWR0aFR5cGU6Ok5vcm1hbCwgY29udGFpbmluZ0Jsb2Nr
V2lkdGgpKSB7Ci0gICAgICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAg
ICAgIC8vIE5vbi1xdWFudGl0YXRpdmUgdmFsdWVzIHN1Y2ggYXMgYXV0byBhbmQgbWluLWNvbnRl
bnQgYXJlIG5vdCBpbmZsdWVuY2VkIGJ5IHRoZSBib3gtc2l6aW5nIHByb3BlcnR5LgotICAgICAg
ICBpZiAoc3R5bGUuYm94U2l6aW5nKCkgPT0gQm94U2l6aW5nOjpDb250ZW50Qm94IHx8IHN0eWxl
LndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKLSAgICAgICAgICAgIHJldHVybiBjb21wdXRl
ZFdpZHRoOwotICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCku
Z2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKLSAgICAgICAgcmV0dXJuICpjb21wdXRlZFdpZHRo
IC0gKGJveEdlb21ldHJ5Lmhvcml6b250YWxCb3JkZXIoKSArIGJveEdlb21ldHJ5Lmhvcml6b250
YWxQYWRkaW5nKCkudmFsdWVPcigwKSk7Ci0gICAgfQotICAgIHJldHVybiB7IH07Ci19Ci0KLUxh
eW91dFVuaXQgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb250ZW50SGVpZ2h0Rm9yRm9y
bWF0dGluZ0NvbnRleHRSb290KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRS
b290KSBjb25zdAotewotICAgIEFTU0VSVChmb3JtYXR0aW5nQ29udGV4dFJvb3QuZXN0YWJsaXNo
ZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKLSAgICBBU1NFUlQoaXNIZWlnaHRBdXRvKGZvcm1hdHRp
bmdDb250ZXh0Um9vdCkgfHwgZm9ybWF0dGluZ0NvbnRleHRSb290LmVzdGFibGlzaGVzVGFibGVG
b3JtYXR0aW5nQ29udGV4dCgpIHx8IGZvcm1hdHRpbmdDb250ZXh0Um9vdC5pc1RhYmxlQ2VsbCgp
KTsKLSAgICBhdXRvIHVzZWRDb250ZW50SGVpZ2h0ID0gTGF5b3V0VW5pdCB7IH07IAotICAgIGF1
dG8gaGFzQ29udGVudCA9IGZvcm1hdHRpbmdDb250ZXh0Um9vdC5oYXNJbkZsb3dPckZsb2F0aW5n
Q2hpbGQoKTsKLSAgICAvLyBUaGUgdXNlZCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5tZW50IGJveCBp
cyBkZXRlcm1pbmVkIGFzIGlmIHBlcmZvcm1pbmcgYSBub3JtYWwgbGF5b3V0IG9mIHRoZSBib3gs
IGV4Y2VwdCB0aGF0IGl0IGlzIHRyZWF0ZWQgYXMgaGF2aW5nIG5vIGNvbnRlbnQuCi0gICAgYXV0
byBzaG91bGRJZ25vcmVDb250ZW50ID0gZm9ybWF0dGluZ0NvbnRleHRSb290LmlzU2l6ZUNvbnRh
aW5tZW50Qm94KCk7Ci0gICAgaWYgKGhhc0NvbnRlbnQgJiYgIXNob3VsZElnbm9yZUNvbnRlbnQp
Ci0gICAgICAgIHVzZWRDb250ZW50SGVpZ2h0ID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0
dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHRSb290LCBjb25zdF9jYXN0PExheW91dFN0YXRl
Jj4obGF5b3V0U3RhdGUoKSkpLT51c2VkQ29udGVudEhlaWdodCgpOwotICAgIHJldHVybiB1c2Vk
Q29udGVudEhlaWdodDsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5Ojpjb21wdXRlZFZhbHVlKGNvbnN0IExlbmd0aCYgZ2VvbWV0cnlQcm9wZXJ0
eSwgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCkgY29uc3QKLXsKLSAgICAvLyAgSW4g
Z2VuZXJhbCwgdGhlIGNvbXB1dGVkIHZhbHVlIHJlc29sdmVzIHRoZSBzcGVjaWZpZWQgdmFsdWUg
YXMgZmFyIGFzIHBvc3NpYmxlIHdpdGhvdXQgbGF5aW5nIG91dCB0aGUgY29udGVudC4KLSAgICBp
ZiAoZ2VvbWV0cnlQcm9wZXJ0eS5pc0ZpeGVkKCkgfHwgZ2VvbWV0cnlQcm9wZXJ0eS5pc1BlcmNl
bnQoKSB8fCBnZW9tZXRyeVByb3BlcnR5LmlzQ2FsY3VsYXRlZCgpKQotICAgICAgICByZXR1cm4g
dmFsdWVGb3JMZW5ndGgoZ2VvbWV0cnlQcm9wZXJ0eSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwot
ICAgIHJldHVybiB7IH07Ci19Ci0KLU9wdGlvbmFsPExheW91dFVuaXQ+IEZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeTo6Zml4ZWRWYWx1ZShjb25zdCBMZW5ndGgmIGdlb21ldHJ5UHJvcGVydHkp
IGNvbnN0Ci17Ci0gICAgaWYgKCFnZW9tZXRyeVByb3BlcnR5LmlzRml4ZWQoKSkKLSAgICAgICAg
cmV0dXJuIHsgfTsKLSAgICByZXR1cm4gTGF5b3V0VW5pdCB7IGdlb21ldHJ5UHJvcGVydHkudmFs
dWUoKSB9OwotfQotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjIvdmlzdWRldC5odG1s
I21pbi1tYXgtaGVpZ2h0cwotLy8gU3BlY2lmaWVzIGEgcGVyY2VudGFnZSBmb3IgZGV0ZXJtaW5p
bmcgdGhlIHVzZWQgdmFsdWUuIFRoZSBwZXJjZW50YWdlIGlzIGNhbGN1bGF0ZWQgd2l0aCByZXNw
ZWN0IHRvIHRoZSBoZWlnaHQgb2YgdGhlIGdlbmVyYXRlZCBib3gncyBjb250YWluaW5nIGJsb2Nr
LgotLy8gSWYgdGhlIGhlaWdodCBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyBub3Qgc3BlY2lm
aWVkIGV4cGxpY2l0bHkgKGkuZS4sIGl0IGRlcGVuZHMgb24gY29udGVudCBoZWlnaHQpLCBhbmQg
dGhpcyBlbGVtZW50IGlzIG5vdCBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQsCi0vLyB0aGUgcGVyY2Vu
dGFnZSB2YWx1ZSBpcyB0cmVhdGVkIGFzICcwJyAoZm9yICdtaW4taGVpZ2h0Jykgb3IgJ25vbmUn
IChmb3IgJ21heC1oZWlnaHQnKS4KLU9wdGlvbmFsPExheW91dFVuaXQ+IEZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRNYXhIZWlnaHQoY29uc3QgQm94JiBsYXlvdXRCb3gsIE9w
dGlvbmFsPExheW91dFVuaXQ+IGNvbnRhaW5pbmdCbG9ja0hlaWdodCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gY29tcHV0ZWRIZWlnaHRWYWx1ZShsYXlvdXRCb3gsIEhlaWdodFR5cGU6Ok1heCwgY29u
dGFpbmluZ0Jsb2NrSGVpZ2h0KTsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZE1pbkhlaWdodChjb25zdCBCb3gmIGxheW91dEJv
eCwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSBjb25zdAotewot
ICAgIHJldHVybiBjb21wdXRlZEhlaWdodFZhbHVlKGxheW91dEJveCwgSGVpZ2h0VHlwZTo6TWlu
LCBjb250YWluaW5nQmxvY2tIZWlnaHQpOwotfQotCi1PcHRpb25hbDxMYXlvdXRVbml0PiBGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkTWluV2lkdGgoY29uc3QgQm94JiBsYXlv
dXRCb3gsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpCi17Ci0gICAgcmV0dXJuIGNv
bXB1dGVkV2lkdGhWYWx1ZShsYXlvdXRCb3gsIFdpZHRoVHlwZTo6TWluLCBjb250YWluaW5nQmxv
Y2tXaWR0aCk7Ci19Ci0KLU9wdGlvbmFsPExheW91dFVuaXQ+IEZvcm1hdHRpbmdDb250ZXh0OjpH
ZW9tZXRyeTo6Y29tcHV0ZWRNYXhXaWR0aChjb25zdCBCb3gmIGxheW91dEJveCwgTGF5b3V0VW5p
dCBjb250YWluaW5nQmxvY2tXaWR0aCkKLXsKLSAgICByZXR1cm4gY29tcHV0ZWRXaWR0aFZhbHVl
KGxheW91dEJveCwgV2lkdGhUeXBlOjpNYXgsIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLX0KLQot
TGF5b3V0VW5pdCBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OnN0YXRpY1ZlcnRpY2FsUG9z
aXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBW
ZXJ0aWNhbENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzKSBjb25zdAotewotICAgIEFT
U0VSVChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOwotCi0gICAgLy8gRm9yIHRo
ZSBwdXJwb3NlcyBvZiB0aGlzIHNlY3Rpb24gYW5kIHRoZSBuZXh0LCB0aGUgdGVybSAic3RhdGlj
IHBvc2l0aW9uIiAob2YgYW4gZWxlbWVudCkgcmVmZXJzLCByb3VnaGx5LCB0byB0aGUgcG9zaXRp
b24gYW4gZWxlbWVudCB3b3VsZCBoYXZlCi0gICAgLy8gaGFkIGluIHRoZSBub3JtYWwgZmxvdy4g
TW9yZSBwcmVjaXNlbHksIHRoZSBzdGF0aWMgcG9zaXRpb24gZm9yICd0b3AnIGlzIHRoZSBkaXN0
YW5jZSBmcm9tIHRoZSB0b3AgZWRnZSBvZiB0aGUgY29udGFpbmluZyBibG9jayB0byB0aGUgdG9w
IG1hcmdpbgotICAgIC8vIGVkZ2Ugb2YgYSBoeXBvdGhldGljYWwgYm94IHRoYXQgd291bGQgaGF2
ZSBiZWVuIHRoZSBmaXJzdCBib3ggb2YgdGhlIGVsZW1lbnQgaWYgaXRzIHNwZWNpZmllZCAncG9z
aXRpb24nIHZhbHVlIGhhZCBiZWVuICdzdGF0aWMnIGFuZCBpdHMgc3BlY2lmaWVkCi0gICAgLy8g
J2Zsb2F0JyBoYWQgYmVlbiAnbm9uZScgYW5kIGl0cyBzcGVjaWZpZWQgJ2NsZWFyJyBoYWQgYmVl
biAnbm9uZScuIChOb3RlIHRoYXQgZHVlIHRvIHRoZSBydWxlcyBpbiBzZWN0aW9uIDkuNyB0aGlz
IG1pZ2h0IHJlcXVpcmUgYWxzbyBhc3N1bWluZyBhIGRpZmZlcmVudAotICAgIC8vIGNvbXB1dGVk
IHZhbHVlIGZvciAnZGlzcGxheScuKSBUaGUgdmFsdWUgaXMgbmVnYXRpdmUgaWYgdGhlIGh5cG90
aGV0aWNhbCBib3ggaXMgYWJvdmUgdGhlIGNvbnRhaW5pbmcgYmxvY2suCi0KLSAgICAvLyBTdGFy
dCB3aXRoIHRoaXMgYm94J3MgYm9yZGVyIGJveCBvZmZzZXQgZnJvbSB0aGUgcGFyZW50J3MgYm9y
ZGVyIGJveC4KLSAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdD
b250ZXh0KCk7Ci0gICAgTGF5b3V0VW5pdCB0b3A7Ci0gICAgaWYgKGxheW91dEJveC5wcmV2aW91
c0luRmxvd1NpYmxpbmcoKSAmJiBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCktPmlz
QmxvY2tMZXZlbEJveCgpKSB7Ci0gICAgICAgIC8vIEFkZCBzaWJsaW5nIG9mZnNldAotICAgICAg
ICBhdXRvJiBwcmV2aW91c0luRmxvd1NpYmxpbmcgPSAqbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93
U2libGluZygpOwotICAgICAgICBhdXRvJiBwcmV2aW91c0luRmxvd0JveEdlb21ldHJ5ID0gZm9y
bWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gocHJldmlvdXNJbkZsb3dTaWJsaW5nLCBFc2Nh
cGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0cnkpOwotICAgICAgICBhdXRv
JiBmb3JtYXR0aW5nU3RhdGUgPSBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4obGF5b3V0
U3RhdGUoKS5mb3JtYXR0aW5nU3RhdGVGb3JCb3gocHJldmlvdXNJbkZsb3dTaWJsaW5nKSk7Ci0g
ICAgICAgIGF1dG8gdXNlZFZlcnRpY2FsTWFyZ2luRm9yUHJldmlvdXNCb3ggPSBmb3JtYXR0aW5n
U3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKHByZXZpb3VzSW5GbG93U2libGluZyk7Ci0KLSAgICAg
ICAgdG9wICs9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KHByZXZpb3VzSW5GbG93Qm94R2Vv
bWV0cnkpLmJvdHRvbSgpICsgdXNlZFZlcnRpY2FsTWFyZ2luRm9yUHJldmlvdXNCb3gubm9uQ29s
bGFwc2VkVmFsdWVzLmFmdGVyOwotICAgIH0gZWxzZQotICAgICAgICB0b3AgPSBmb3JtYXR0aW5n
Q29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gucGFyZW50KCksIEVzY2FwZVJlYXNvbjo6
T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRyeSkuY29udGVudEJveFRvcCgpOwotCi0gICAg
Ly8gUmVzb2x2ZSB0b3AgYWxsIHRoZSB3YXkgdXAgdG8gdGhlIGNvbnRhaW5pbmcgYmxvY2suCi0g
ICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOwot
ICAgIC8vIFN0YXJ0IHdpdGggdGhlIHBhcmVudCBzaW5jZSB3ZSBwcmV0ZW5kIHRoYXQgdGhpcyBi
b3ggaXMgbm9ybWFsIGZsb3cuCi0gICAgZm9yIChhdXRvKiBhbmNlc3RvciA9ICZsYXlvdXRCb3gu
cGFyZW50KCk7IGFuY2VzdG9yICE9ICZjb250YWluaW5nQmxvY2s7IGFuY2VzdG9yID0gJmFuY2Vz
dG9yLT5jb250YWluaW5nQmxvY2soKSkgewotICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZv
cm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KCphbmNlc3RvciwgRXNjYXBlUmVhc29uOjpP
dXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5KTsKLSAgICAgICAgLy8gQm94R2VvbWV0cnk6
OnRvcCBpcyB0aGUgYm9yZGVyIGJveCB0b3AgcG9zaXRpb24gaW4gaXRzIGNvbnRhaW5pbmcgYmxv
Y2sncyBjb29yZGluYXRlIHN5c3RlbS4KLSAgICAgICAgdG9wICs9IEJveEdlb21ldHJ5Ojpib3Jk
ZXJCb3hUb3AoYm94R2VvbWV0cnkpOwotICAgICAgICBBU1NFUlQoIWFuY2VzdG9yLT5pc1Bvc2l0
aW9uZWQoKSB8fCBsYXlvdXRCb3guaXNGaXhlZFBvc2l0aW9uZWQoKSk7Ci0gICAgfQotICAgIC8v
IE1vdmUgdGhlIHN0YXRpYyBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgcGFkZGluZyBib3guIFRo
aXMgaXMgdmVyeSBzcGVjaWZpYyB0byBhYm9sdXRlbHkgcG9zaXRpb25lZCBib3hlcy4KLSAgICBy
ZXR1cm4gdG9wIC0gdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2FsVG9wOwotfQotCi1MYXlvdXRV
bml0IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6c3RhdGljSG9yaXpvbnRhbFBvc2l0aW9u
Rm9yT3V0T2ZGbG93UG9zaXRpb25lZChjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIGNvbnN0Ci17Ci0gICAgQVNT
RVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7Ci0gICAgLy8gU2VlIHN0YXRp
Y1ZlcnRpY2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkIGZvciB0aGUgZGVmaW5pdGlv
biBvZiB0aGUgc3RhdGljIHBvc2l0aW9uLgotCi0gICAgLy8gU3RhcnQgd2l0aCB0aGlzIGJveCdz
IGJvcmRlciBib3ggb2Zmc2V0IGZyb20gdGhlIHBhcmVudCdzIGJvcmRlciBib3guCi0gICAgYXV0
byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgpOwotICAgIGF1
dG8gbGVmdCA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveC5wYXJl
bnQoKSwgRXNjYXBlUmVhc29uOjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5KS5jb250
ZW50Qm94TGVmdCgpOwotCi0gICAgLy8gUmVzb2x2ZSBsZWZ0IGFsbCB0aGUgd2F5IHVwIHRvIHRo
ZSBjb250YWluaW5nIGJsb2NrLgotICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxheW91dEJv
eC5jb250YWluaW5nQmxvY2soKTsKLSAgICAvLyBTdGFydCB3aXRoIHRoZSBwYXJlbnQgc2luY2Ug
d2UgcHJldGVuZCB0aGF0IHRoaXMgYm94IGlzIG5vcm1hbCBmbG93LgotICAgIGZvciAoYXV0byog
YW5jZXN0b3IgPSAmbGF5b3V0Qm94LnBhcmVudCgpOyBhbmNlc3RvciAhPSAmY29udGFpbmluZ0Js
b2NrOyBhbmNlc3RvciA9ICZhbmNlc3Rvci0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAgICAg
YXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveCgqYW5j
ZXN0b3IsIEVzY2FwZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRyeSk7Ci0g
ICAgICAgIC8vIEJveEdlb21ldHJ5OjpsZWZ0IGlzIHRoZSBib3JkZXIgYm94IGxlZnQgcG9zaXRp
b24gaW4gaXRzIGNvbnRhaW5pbmcgYmxvY2sncyBjb29yZGluYXRlIHN5c3RlbS4KLSAgICAgICAg
bGVmdCArPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94TGVmdChib3hHZW9tZXRyeSk7Ci0gICAgICAg
IEFTU0VSVCghYW5jZXN0b3ItPmlzUG9zaXRpb25lZCgpIHx8IGxheW91dEJveC5pc0ZpeGVkUG9z
aXRpb25lZCgpKTsKLSAgICB9Ci0gICAgLy8gTW92ZSB0aGUgc3RhdGljIHBvc2l0aW9uIHJlbGF0
aXZlIHRvIHRoZSBwYWRkaW5nIGJveC4gVGhpcyBpcyB2ZXJ5IHNwZWNpZmljIHRvIGFib2x1dGVs
eSBwb3NpdGlvbmVkIGJveGVzLgotICAgIHJldHVybiBsZWZ0IC0gaG9yaXpvbnRhbENvbnN0cmFp
bnRzLmxvZ2ljYWxMZWZ0OwotfQotCi1MYXlvdXRVbml0IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeTo6c2hyaW5rVG9GaXRXaWR0aChjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwg
TGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCkKLXsKLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0
dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1dpZHRoXSAtPiBzaHJpbmsgdG8gZml0IC0+
IHVuc3VwcG9ydGVkIC0+IHdpZHRoKCIgPDwgTGF5b3V0VW5pdCB7IH0gPDwgInB4KSBsYXlvdXRC
b3g6ICIgPDwgJmZvcm1hdHRpbmdDb250ZXh0Um9vdCA8PCAiKSIpOwotICAgIEFTU0VSVChmb3Jt
YXR0aW5nQ29udGV4dFJvb3QuZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKLQotICAg
IC8vIENhbGN1bGF0aW9uIG9mIHRoZSBzaHJpbmstdG8tZml0IHdpZHRoIGlzIHNpbWlsYXIgdG8g
Y2FsY3VsYXRpbmcgdGhlIHdpZHRoIG9mIGEgdGFibGUgY2VsbCB1c2luZyB0aGUgYXV0b21hdGlj
IHRhYmxlIGxheW91dCBhbGdvcml0aG0uCi0gICAgLy8gUm91Z2hseTogY2FsY3VsYXRlIHRoZSBw
cmVmZXJyZWQgd2lkdGggYnkgZm9ybWF0dGluZyB0aGUgY29udGVudCB3aXRob3V0IGJyZWFraW5n
IGxpbmVzIG90aGVyIHRoYW4gd2hlcmUgZXhwbGljaXQgbGluZSBicmVha3Mgb2NjdXIsCi0gICAg
Ly8gYW5kIGFsc28gY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgbWluaW11bSB3aWR0aCwgZS5nLiwg
YnkgdHJ5aW5nIGFsbCBwb3NzaWJsZSBsaW5lIGJyZWFrcy4gQ1NTIDIuMiBkb2VzIG5vdCBkZWZp
bmUgdGhlIGV4YWN0IGFsZ29yaXRobS4KLSAgICAvLyBUaGlyZGx5LCBmaW5kIHRoZSBhdmFpbGFi
bGUgd2lkdGg6IGluIHRoaXMgY2FzZSwgdGhpcyBpcyB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5p
bmcgYmxvY2sgbWludXMgdGhlIHVzZWQgdmFsdWVzIG9mICdtYXJnaW4tbGVmdCcsICdib3JkZXIt
bGVmdC13aWR0aCcsCi0gICAgLy8gJ3BhZGRpbmctbGVmdCcsICdwYWRkaW5nLXJpZ2h0JywgJ2Jv
cmRlci1yaWdodC13aWR0aCcsICdtYXJnaW4tcmlnaHQnLCBhbmQgdGhlIHdpZHRocyBvZiBhbnkg
cmVsZXZhbnQgc2Nyb2xsIGJhcnMuCi0KLSAgICAvLyBUaGVuIHRoZSBzaHJpbmstdG8tZml0IHdp
ZHRoIGlzOiBtaW4obWF4KHByZWZlcnJlZCBtaW5pbXVtIHdpZHRoLCBhdmFpbGFibGUgd2lkdGgp
LCBwcmVmZXJyZWQgd2lkdGgpLgotICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9
IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9OwotICAgIGF1dG8gaGFzQ29udGVudCA9IGlz
PENvbnRhaW5lckJveD4oZm9ybWF0dGluZ0NvbnRleHRSb290KSAmJiBkb3duY2FzdDxDb250YWlu
ZXJCb3g+KGZvcm1hdHRpbmdDb250ZXh0Um9vdCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7
Ci0gICAgLy8gVGhlIHVzZWQgd2lkdGggb2YgdGhlIGNvbnRhaW5tZW50IGJveCBpcyBkZXRlcm1p
bmVkIGFzIGlmIHBlcmZvcm1pbmcgYSBub3JtYWwgbGF5b3V0IG9mIHRoZSBib3gsIGV4Y2VwdCB0
aGF0IGl0IGlzIHRyZWF0ZWQgYXMgaGF2aW5nIG5vIGNvbnRlbnQuCi0gICAgYXV0byBzaG91bGRJ
Z25vcmVDb250ZW50ID0gZm9ybWF0dGluZ0NvbnRleHRSb290LmlzU2l6ZUNvbnRhaW5tZW50Qm94
KCk7ICAKLSAgICBpZiAoaGFzQ29udGVudCAmJiAhc2hvdWxkSWdub3JlQ29udGVudCkgewotICAg
ICAgICBhdXRvJiByb290ID0gZG93bmNhc3Q8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nQ29udGV4
dFJvb3QpOwotICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGVGb3JSb290ID0gbGF5b3V0U3Rh
dGUoKS5lbnN1cmVGb3JtYXR0aW5nU3RhdGUocm9vdCk7Ci0gICAgICAgIGF1dG8gcHJlY29tcHV0
ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gZm9ybWF0dGluZ1N0YXRlRm9yUm9vdC5pbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGlmICghcHJlY29tcHV0ZWRJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzKQotICAgICAgICAgICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50
cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KHJvb3QsIGxheW91dFN0
YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9ICpwcmVjb21wdXRlZElu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Ci0gICAgfQotICAgIHJldHVybiBzdGQ6Om1pbihzdGQ6
Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0sIGF2YWlsYWJsZVdpZHRoKSwg
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtKTsKLX0KLQotVmVydGljYWxHZW9tZXRy
eSBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Om91dE9mRmxvd05vblJlcGxhY2VkVmVydGlj
YWxHZW9tZXRyeShjb25zdCBDb250YWluZXJCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRpY2FsQ29uc3Ry
YWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVl
cyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRC
b3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkp
OwotICAgIEFTU0VSVCh2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxIZWlnaHQpOwotCi0gICAg
Ly8gMTAuNi40IEFic29sdXRlbHkgcG9zaXRpb25lZCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzCi0g
ICAgLy8KLSAgICAvLyBGb3IgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGVsZW1lbnRzLCB0aGUgdXNl
ZCB2YWx1ZXMgb2YgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbnMgbXVzdCBzYXRpc2Z5IHRoaXMgY29u
c3RyYWludDoKLSAgICAvLyAndG9wJyArICdtYXJnaW4tdG9wJyArICdib3JkZXItdG9wLXdpZHRo
JyArICdwYWRkaW5nLXRvcCcgKyAnaGVpZ2h0JyArICdwYWRkaW5nLWJvdHRvbScgKyAnYm9yZGVy
LWJvdHRvbS13aWR0aCcgKyAnbWFyZ2luLWJvdHRvbScgKyAnYm90dG9tJwotICAgIC8vID0gaGVp
Z2h0IG9mIGNvbnRhaW5pbmcgYmxvY2sKLQotICAgIC8vIElmIGFsbCB0aHJlZSBvZiAndG9wJywg
J2hlaWdodCcsIGFuZCAnYm90dG9tJyBhcmUgYXV0bywgc2V0ICd0b3AnIHRvIHRoZSBzdGF0aWMg
cG9zaXRpb24gYW5kIGFwcGx5IHJ1bGUgbnVtYmVyIHRocmVlIGJlbG93LgotCi0gICAgLy8gSWYg
bm9uZSBvZiB0aGUgdGhyZWUgYXJlICdhdXRvJzogSWYgYm90aCAnbWFyZ2luLXRvcCcgYW5kICdt
YXJnaW4tYm90dG9tJyBhcmUgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4
dHJhCi0gICAgLy8gY29uc3RyYWludCB0aGF0IHRoZSB0d28gbWFyZ2lucyBnZXQgZXF1YWwgdmFs
dWVzLiBJZiBvbmUgb2YgJ21hcmdpbi10b3AnIG9yICdtYXJnaW4tYm90dG9tJyBpcyAnYXV0bycs
IHNvbHZlIHRoZSBlcXVhdGlvbiBmb3IgdGhhdCB2YWx1ZS4KLSAgICAvLyBJZiB0aGUgdmFsdWVz
IGFyZSBvdmVyLWNvbnN0cmFpbmVkLCBpZ25vcmUgdGhlIHZhbHVlIGZvciAnYm90dG9tJyBhbmQg
c29sdmUgZm9yIHRoYXQgdmFsdWUuCi0KLSAgICAvLyBPdGhlcndpc2UsIHBpY2sgdGhlIG9uZSBv
ZiB0aGUgZm9sbG93aW5nIHNpeCBydWxlcyB0aGF0IGFwcGxpZXMuCi0KLSAgICAvLyAxLiAndG9w
JyBhbmQgJ2hlaWdodCcgYXJlICdhdXRvJyBhbmQgJ2JvdHRvbScgaXMgbm90ICdhdXRvJywgdGhl
biB0aGUgaGVpZ2h0IGlzIGJhc2VkIG9uIHRoZSBjb250ZW50IHBlciAxMC42LjcsCi0gICAgLy8g
ICAgIHNldCAnYXV0bycgdmFsdWVzIGZvciAnbWFyZ2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9t
JyB0byAwLCBhbmQgc29sdmUgZm9yICd0b3AnCi0gICAgLy8gMi4gJ3RvcCcgYW5kICdib3R0b20n
IGFyZSAnYXV0bycgYW5kICdoZWlnaHQnIGlzIG5vdCAnYXV0bycsIHRoZW4gc2V0ICd0b3AnIHRv
IHRoZSBzdGF0aWMgcG9zaXRpb24sIHNldCAnYXV0bycgdmFsdWVzIGZvcgotICAgIC8vICAgICdt
YXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAsIGFuZCBzb2x2ZSBmb3IgJ2JvdHRv
bScKLSAgICAvLyAzLiAnaGVpZ2h0JyBhbmQgJ2JvdHRvbScgYXJlICdhdXRvJyBhbmQgJ3RvcCcg
aXMgbm90ICdhdXRvJywgdGhlbiB0aGUgaGVpZ2h0IGlzIGJhc2VkIG9uIHRoZSBjb250ZW50IHBl
ciAxMC42LjcsIHNldCAnYXV0bycKLSAgICAvLyAgICAgdmFsdWVzIGZvciAnbWFyZ2luLXRvcCcg
YW5kICdtYXJnaW4tYm90dG9tJyB0byAwLCBhbmQgc29sdmUgZm9yICdib3R0b20nCi0gICAgLy8g
NC4gJ3RvcCcgaXMgJ2F1dG8nLCAnaGVpZ2h0JyBhbmQgJ2JvdHRvbScgYXJlIG5vdCAnYXV0bycs
IHRoZW4gc2V0ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0
b20nIHRvIDAsIGFuZCBzb2x2ZSBmb3IgJ3RvcCcKLSAgICAvLyA1LiAnaGVpZ2h0JyBpcyAnYXV0
bycsICd0b3AnIGFuZCAnYm90dG9tJyBhcmUgbm90ICdhdXRvJywgdGhlbiAnYXV0bycgdmFsdWVz
IGZvciAnbWFyZ2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyBhcmUgc2V0IHRvIDAgYW5kIHNv
bHZlIGZvciAnaGVpZ2h0JwotICAgIC8vIDYuICdib3R0b20nIGlzICdhdXRvJywgJ3RvcCcgYW5k
ICdoZWlnaHQnIGFyZSBub3QgJ2F1dG8nLCB0aGVuIHNldCAnYXV0bycgdmFsdWVzIGZvciAnbWFy
Z2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyB0byAwIGFuZCBzb2x2ZSBmb3IgJ2JvdHRvbScK
LQotICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9ybWF0dGluZ0NvbnRleHQo
KTsKLSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIGF1dG8mIGJveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKLSAg
ICBhdXRvIGNvbnRhaW5pbmdCbG9ja0hlaWdodCA9ICp2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2lj
YWxIZWlnaHQ7Ci0gICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250YWxDb25z
dHJhaW50cy5sb2dpY2FsV2lkdGg7Ci0KLSAgICBhdXRvIHRvcCA9IGNvbXB1dGVkVmFsdWUoc3R5
bGUubG9naWNhbFRvcCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0gICAgYXV0byBib3R0b20g
PSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxCb3R0b20oKSwgY29udGFpbmluZ0Jsb2NrV2lk
dGgpOwotICAgIGF1dG8gaGVpZ2h0ID0gb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCA/
IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQudmFsdWUoKSA6IGNvbXB1dGVkSGVpZ2h0
KGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrSGVpZ2h0KTsKLSAgICBhdXRvIGNvbXB1dGVkVmVy
dGljYWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gs
IGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xs
YXBzZWRWYWx1ZXMgdXNlZFZlcnRpY2FsTWFyZ2luOyAKLSAgICBhdXRvIHBhZGRpbmdUb3AgPSBi
b3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKTsKLSAgICBhdXRvIHBhZGRpbmdCb3R0
b20gPSBib3hHZW9tZXRyeS5wYWRkaW5nQm90dG9tKCkudmFsdWVPcigwKTsKLSAgICBhdXRvIGJv
cmRlclRvcCA9IGJveEdlb21ldHJ5LmJvcmRlclRvcCgpOwotICAgIGF1dG8gYm9yZGVyQm90dG9t
ID0gYm94R2VvbWV0cnkuYm9yZGVyQm90dG9tKCk7Ci0KLSAgICBpZiAoIXRvcCAmJiAhaGVpZ2h0
ICYmICFib3R0b20pCi0gICAgICAgIHRvcCA9IHN0YXRpY1ZlcnRpY2FsUG9zaXRpb25Gb3JPdXRP
ZkZsb3dQb3NpdGlvbmVkKGxheW91dEJveCwgdmVydGljYWxDb25zdHJhaW50cyk7Ci0KLSAgICBp
ZiAodG9wICYmIGhlaWdodCAmJiBib3R0b20pIHsKLSAgICAgICAgaWYgKCFjb21wdXRlZFZlcnRp
Y2FsTWFyZ2luLmJlZm9yZSAmJiAhY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlcikgewotICAg
ICAgICAgICAgYXV0byBtYXJnaW5CZWZvcmVBbmRBZnRlciA9IGNvbnRhaW5pbmdCbG9ja0hlaWdo
dCAtICgqdG9wICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90
dG9tICsgYm9yZGVyQm90dG9tICsgKmJvdHRvbSk7Ci0gICAgICAgICAgICB1c2VkVmVydGljYWxN
YXJnaW4gPSB7IG1hcmdpbkJlZm9yZUFuZEFmdGVyIC8gMiwgbWFyZ2luQmVmb3JlQW5kQWZ0ZXIg
LyAyIH07Ci0gICAgICAgIH0gZWxzZSBpZiAoIWNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3Jl
KSB7Ci0gICAgICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgPSAqY29tcHV0ZWRWZXJ0
aWNhbE1hcmdpbi5hZnRlcjsKLSAgICAgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUg
PSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIGJvcmRlclRvcCArIHBhZGRpbmdUb3Ag
KyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0aWNhbE1h
cmdpbi5hZnRlciArICpib3R0b20pOwotICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZFZlcnRp
Y2FsTWFyZ2luLmFmdGVyKSB7Ci0gICAgICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3Jl
ID0gKmNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlOwotICAgICAgICAgICAgdXNlZFZlcnRp
Y2FsTWFyZ2luLmFmdGVyID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyB1c2VkVmVy
dGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWlnaHQgKyBw
YWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKmJvdHRvbSk7Ci0gICAgICAgIH0gZWxzZQot
ICAgICAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luID0geyAqY29tcHV0ZWRWZXJ0aWNhbE1hcmdp
bi5iZWZvcmUsICpjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyIH07Ci0gICAgICAgIC8vIE92
ZXItY29uc3RyYWluZWQ/Ci0gICAgICAgIGF1dG8gYm94SGVpZ2h0ID0gKnRvcCArIHVzZWRWZXJ0
aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBh
ZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgKyAq
Ym90dG9tOwotICAgICAgICBpZiAoYm94SGVpZ2h0ICE9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCkK
LSAgICAgICAgICAgIGJvdHRvbSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgdXNl
ZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyAqaGVpZ2h0
ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRl
cik7Ci0gICAgfQotCi0gICAgaWYgKCF0b3AgJiYgIWhlaWdodCAmJiBib3R0b20pIHsKLSAgICAg
ICAgLy8gIzEKLSAgICAgICAgaGVpZ2h0ID0gY29udGVudEhlaWdodEZvckZvcm1hdHRpbmdDb250
ZXh0Um9vdChsYXlvdXRCb3gpOwotICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7IGNvbXB1
dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJn
aW4uYWZ0ZXIudmFsdWVPcigwKSB9OwotICAgICAgICB0b3AgPSBjb250YWluaW5nQmxvY2tIZWln
aHQgLSAodXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3Ag
KyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0aWNhbE1h
cmdpbi5hZnRlciArICpib3R0b20pOyAKLSAgICB9Ci0KLSAgICBpZiAoIXRvcCAmJiAhYm90dG9t
ICYmIGhlaWdodCkgewotICAgICAgICAvLyAjMgotICAgICAgICB0b3AgPSBzdGF0aWNWZXJ0aWNh
bFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChsYXlvdXRCb3gsIHZlcnRpY2FsQ29uc3Ry
YWludHMpOwotICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7IGNvbXB1dGVkVmVydGljYWxN
YXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFs
dWVPcigwKSB9OwotICAgICAgICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRv
cCArIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsg
KmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVydGljYWxNYXJn
aW4uYWZ0ZXIpOwotICAgIH0KLQotICAgIGlmICghaGVpZ2h0ICYmICFib3R0b20gJiYgdG9wKSB7
Ci0gICAgICAgIC8vICMzCi0gICAgICAgIGhlaWdodCA9IGNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0
aW5nQ29udGV4dFJvb3QobGF5b3V0Qm94KTsKLSAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luID0g
eyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21wdXRlZFZlcnRp
Y2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKLSAgICAgICAgYm90dG9tID0gY29udGFpbmlu
Z0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVy
VG9wICsgcGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9t
ICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyKTsKLSAgICB9Ci0KLSAgICBpZiAoIXRvcCAmJiBo
ZWlnaHQgJiYgYm90dG9tKSB7Ci0gICAgICAgIC8vICM0Ci0gICAgICAgIHVzZWRWZXJ0aWNhbE1h
cmdpbiA9IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0
ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07Ci0gICAgICAgIHRvcCA9IGNvbnRh
aW5pbmdCbG9ja0hlaWdodCAtICh1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9w
ICsgcGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsg
dXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7Ci0gICAgfQotCi0gICAgaWYgKCFo
ZWlnaHQgJiYgdG9wICYmIGJvdHRvbSkgewotICAgICAgICAvLyAjNQotICAgICAgICB1c2VkVmVy
dGljYWxNYXJnaW4gPSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCks
IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OwotICAgICAgICBoZWln
aHQgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIHVzZWRWZXJ0aWNhbE1hcmdpbi5i
ZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJv
dHRvbSArIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciArICpib3R0b20pOwotICAgIH0KLQotICAg
IGlmICghYm90dG9tICYmIHRvcCAmJiBoZWlnaHQpIHsKLSAgICAgICAgLy8gIzYKLSAgICAgICAg
dXNlZFZlcnRpY2FsTWFyZ2luID0geyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1
ZU9yKDApLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKLSAgICAg
ICAgYm90dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyB1c2VkVmVydGljYWxN
YXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWlnaHQgKyBwYWRkaW5n
Qm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyKTsKLSAgICB9
Ci0KLSAgICBBU1NFUlQodG9wKTsKLSAgICBBU1NFUlQoYm90dG9tKTsKLSAgICBBU1NFUlQoaGVp
Z2h0KTsKLQotICAgIC8vIEZvciBvdXQtb2YtZmxvdyBlbGVtZW50cyB0aGUgY29udGFpbmluZyBi
bG9jayBpcyBmb3JtZWQgYnkgdGhlIHBhZGRpbmcgZWRnZSBvZiB0aGUgYW5jZXN0b3IuCi0gICAg
Ly8gQXQgdGhpcyBwb2ludCB0aGUgcG9zaXRpb25lZCB2YWx1ZSBpcyBpbiB0aGUgY29vcmRpbmF0
ZSBzeXN0ZW0gb2YgdGhlIHBhZGRpbmcgYm94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBi
b3ggY29vcmRpbmF0ZSBzeXN0ZW0uCi0gICAgYXV0byBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVy
dGljYWxFZGdlID0gdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2FsVG9wOwotICAgICp0b3AgKz0g
Y29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZTsKLSAgICAqYm90dG9tICs9IGNvbnRh
aW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7Ci0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9y
bWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1Bvc2l0aW9uXVtIZWlnaHRdW01hcmdp
bl0gLT4gb3V0LW9mLWZsb3cgbm9uLXJlcGxhY2VkIC0+IHRvcCgiIDw8ICp0b3AgPDwgInB4KSBi
b3R0b20oIiAgPDwgKmJvdHRvbSA8PCAicHgpIGhlaWdodCgiIDw8ICpoZWlnaHQgPDwgInB4KSBt
YXJnaW4oIiA8PCB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlIDw8ICJweCwgIiAgPDwgdXNlZFZl
cnRpY2FsTWFyZ2luLmFmdGVyIDw8ICJweCkgbGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAi
KSIpOwotICAgIHJldHVybiB7ICp0b3AsICpib3R0b20sIHsgKmhlaWdodCwgdXNlZFZlcnRpY2Fs
TWFyZ2luIH0gfTsKLX0KLQotSG9yaXpvbnRhbEdlb21ldHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpH
ZW9tZXRyeTo6b3V0T2ZGbG93Tm9uUmVwbGFjZWRIb3Jpem9udGFsR2VvbWV0cnkoY29uc3QgQ29u
dGFpbmVyQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpv
bnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJp
ZGRlbkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxv
d1Bvc2l0aW9uZWQoKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSk7Ci0gICAgCi0gICAg
Ly8gMTAuMy43IEFic29sdXRlbHkgcG9zaXRpb25lZCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzCi0g
ICAgLy8KLSAgICAvLyAnbGVmdCcgKyAnbWFyZ2luLWxlZnQnICsgJ2JvcmRlci1sZWZ0LXdpZHRo
JyArICdwYWRkaW5nLWxlZnQnICsgJ3dpZHRoJyArICdwYWRkaW5nLXJpZ2h0JyArICdib3JkZXIt
cmlnaHQtd2lkdGgnICsgJ21hcmdpbi1yaWdodCcgKyAncmlnaHQnCi0gICAgLy8gPSB3aWR0aCBv
ZiBjb250YWluaW5nIGJsb2NrCi0KLSAgICAvLyBJZiBhbGwgdGhyZWUgb2YgJ2xlZnQnLCAnd2lk
dGgnLCBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nOiBGaXJzdCBzZXQgYW55ICdhdXRvJyB2YWx1ZXMg
Zm9yICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIHRvIDAuCi0gICAgLy8gVGhlbiwg
aWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGVzdGFibGlzaGluZyB0
aGUgc3RhdGljLXBvc2l0aW9uIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicgc2V0ICdsZWZ0JyB0
byB0aGUgc3RhdGljCi0gICAgLy8gcG9zaXRpb24gYW5kIGFwcGx5IHJ1bGUgbnVtYmVyIHRocmVl
IGJlbG93OyBvdGhlcndpc2UsIHNldCAncmlnaHQnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb24gYW5k
IGFwcGx5IHJ1bGUgbnVtYmVyIG9uZSBiZWxvdy4KLSAgICAvLwotICAgIC8vIElmIG5vbmUgb2Yg
dGhlIHRocmVlIGlzICdhdXRvJzogSWYgYm90aCAnbWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJp
Z2h0JyBhcmUgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4dHJhIGNvbnN0
cmFpbnQgdGhhdCB0aGUgdHdvIG1hcmdpbnMgZ2V0IGVxdWFsIHZhbHVlcywKLSAgICAvLyB1bmxl
c3MgdGhpcyB3b3VsZCBtYWtlIHRoZW0gbmVnYXRpdmUsIGluIHdoaWNoIGNhc2Ugd2hlbiBkaXJl
Y3Rpb24gb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicgKCdydGwnKSwgc2V0ICdtYXJn
aW4tbGVmdCcgKCdtYXJnaW4tcmlnaHQnKSB0byB6ZXJvIGFuZAotICAgIC8vIHNvbHZlIGZvciAn
bWFyZ2luLXJpZ2h0JyAoJ21hcmdpbi1sZWZ0JykuIElmIG9uZSBvZiAnbWFyZ2luLWxlZnQnIG9y
ICdtYXJnaW4tcmlnaHQnIGlzICdhdXRvJywgc29sdmUgdGhlIGVxdWF0aW9uIGZvciB0aGF0IHZh
bHVlLgotICAgIC8vIElmIHRoZSB2YWx1ZXMgYXJlIG92ZXItY29uc3RyYWluZWQsIGlnbm9yZSB0
aGUgdmFsdWUgZm9yICdsZWZ0JyAoaW4gY2FzZSB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2Yg
dGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ3J0bCcpIG9yICdyaWdodCcKLSAgICAvLyAoaW4gY2Fz
ZSAnZGlyZWN0aW9uJyBpcyAnbHRyJykgYW5kIHNvbHZlIGZvciB0aGF0IHZhbHVlLgotICAgIC8v
Ci0gICAgLy8gT3RoZXJ3aXNlLCBzZXQgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi1sZWZ0JyBh
bmQgJ21hcmdpbi1yaWdodCcgdG8gMCwgYW5kIHBpY2sgdGhlIG9uZSBvZiB0aGUgZm9sbG93aW5n
IHNpeCBydWxlcyB0aGF0IGFwcGxpZXMuCi0gICAgLy8KLSAgICAvLyAxLiAnbGVmdCcgYW5kICd3
aWR0aCcgYXJlICdhdXRvJyBhbmQgJ3JpZ2h0JyBpcyBub3QgJ2F1dG8nLCB0aGVuIHRoZSB3aWR0
aCBpcyBzaHJpbmstdG8tZml0LiBUaGVuIHNvbHZlIGZvciAnbGVmdCcKLSAgICAvLyAyLiAnbGVm
dCcgYW5kICdyaWdodCcgYXJlICdhdXRvJyBhbmQgJ3dpZHRoJyBpcyBub3QgJ2F1dG8nLCB0aGVu
IGlmIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgZWxlbWVudCBlc3RhYmxpc2hpbmcg
dGhlIHN0YXRpYy1wb3NpdGlvbiAKLSAgICAvLyAgICBjb250YWluaW5nIGJsb2NrIGlzICdsdHIn
IHNldCAnbGVmdCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbiwgb3RoZXJ3aXNlIHNldCAncmlnaHQn
IHRvIHRoZSBzdGF0aWMgcG9zaXRpb24uCi0gICAgLy8gICAgVGhlbiBzb2x2ZSBmb3IgJ2xlZnQn
IChpZiAnZGlyZWN0aW9uIGlzICdydGwnKSBvciAncmlnaHQnIChpZiAnZGlyZWN0aW9uJyBpcyAn
bHRyJykuCi0gICAgLy8gMy4gJ3dpZHRoJyBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nIGFuZCAnbGVm
dCcgaXMgbm90ICdhdXRvJywgdGhlbiB0aGUgd2lkdGggaXMgc2hyaW5rLXRvLWZpdCAuIFRoZW4g
c29sdmUgZm9yICdyaWdodCcKLSAgICAvLyA0LiAnbGVmdCcgaXMgJ2F1dG8nLCAnd2lkdGgnIGFu
ZCAncmlnaHQnIGFyZSBub3QgJ2F1dG8nLCB0aGVuIHNvbHZlIGZvciAnbGVmdCcKLSAgICAvLyA1
LiAnd2lkdGgnIGlzICdhdXRvJywgJ2xlZnQnIGFuZCAncmlnaHQnIGFyZSBub3QgJ2F1dG8nLCB0
aGVuIHNvbHZlIGZvciAnd2lkdGgnCi0gICAgLy8gNi4gJ3JpZ2h0JyBpcyAnYXV0bycsICdsZWZ0
JyBhbmQgJ3dpZHRoJyBhcmUgbm90ICdhdXRvJywgdGhlbiBzb2x2ZSBmb3IgJ3JpZ2h0JwotCi0g
ICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgpOwot
ICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAgYXV0byYgYm94R2VvbWV0
cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwotICAgIGF1
dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdp
ZHRoOwotICAgIGF1dG8gaXNMZWZ0VG9SaWdodERpcmVjdGlvbiA9IGxheW91dEJveC5jb250YWlu
aW5nQmxvY2soKS5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKLSAgICAKLSAgICBh
dXRvIGxlZnQgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxMZWZ0KCksIGNvbnRhaW5pbmdC
bG9ja1dpZHRoKTsKLSAgICBhdXRvIHJpZ2h0ID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2Fs
UmlnaHQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgIGF1dG8gd2lkdGggPSBvdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0aCA/IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndp
ZHRoIDogY29tcHV0ZWRXaWR0aChsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLSAg
ICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6
b250YWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgIFVzZWRI
b3Jpem9udGFsTWFyZ2luIHVzZWRIb3Jpem9udGFsTWFyZ2luOwotICAgIGF1dG8gcGFkZGluZ0xl
ZnQgPSBib3hHZW9tZXRyeS5wYWRkaW5nTGVmdCgpLnZhbHVlT3IoMCk7Ci0gICAgYXV0byBwYWRk
aW5nUmlnaHQgPSBib3hHZW9tZXRyeS5wYWRkaW5nUmlnaHQoKS52YWx1ZU9yKDApOwotICAgIGF1
dG8gYm9yZGVyTGVmdCA9IGJveEdlb21ldHJ5LmJvcmRlckxlZnQoKTsKLSAgICBhdXRvIGJvcmRl
clJpZ2h0ID0gYm94R2VvbWV0cnkuYm9yZGVyUmlnaHQoKTsKLSAgICBpZiAoIWxlZnQgJiYgIXdp
ZHRoICYmICFyaWdodCkgewotICAgICAgICAvLyBJZiBhbGwgdGhyZWUgb2YgJ2xlZnQnLCAnd2lk
dGgnLCBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nOiBGaXJzdCBzZXQgYW55ICdhdXRvJyB2YWx1ZXMg
Zm9yICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIHRvIDAuCi0gICAgICAgIC8vIFRo
ZW4sIGlmIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgZWxlbWVudCBlc3RhYmxpc2hp
bmcgdGhlIHN0YXRpYy1wb3NpdGlvbiBjb250YWluaW5nIGJsb2NrIGlzICdsdHInIHNldCAnbGVm
dCcgdG8gdGhlIHN0YXRpYwotICAgICAgICAvLyBwb3NpdGlvbiBhbmQgYXBwbHkgcnVsZSBudW1i
ZXIgdGhyZWUgYmVsb3c7IG90aGVyd2lzZSwgc2V0ICdyaWdodCcgdG8gdGhlIHN0YXRpYyBwb3Np
dGlvbiBhbmQgYXBwbHkgcnVsZSBudW1iZXIgb25lIGJlbG93LgotICAgICAgICB1c2VkSG9yaXpv
bnRhbE1hcmdpbiA9IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCks
IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OwotCi0gICAgICAgIGF1
dG8gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uRm9y
T3V0T2ZGbG93UG9zaXRpb25lZChsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0g
ICAgICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKQotICAgICAgICAgICAgbGVmdCA9IHN0
YXRpY0hvcml6b250YWxQb3NpdGlvbjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmlnaHQg
PSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb247Ci0gICAgfSBlbHNlIGlmIChsZWZ0ICYmIHdpZHRo
ICYmIHJpZ2h0KSB7Ci0gICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIHRocmVlIGlzICdhdXRvJzog
SWYgYm90aCAnbWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyBhcmUgJ2F1dG8nLCBzb2x2
ZSB0aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4dHJhIGNvbnN0cmFpbnQgdGhhdCB0aGUgdHdvIG1h
cmdpbnMgZ2V0IGVxdWFsIHZhbHVlcywKLSAgICAgICAgLy8gdW5sZXNzIHRoaXMgd291bGQgbWFr
ZSB0aGVtIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIHdoZW4gZGlyZWN0aW9uIG9mIHRoZSBjb250
YWluaW5nIGJsb2NrIGlzICdsdHInICgncnRsJyksIHNldCAnbWFyZ2luLWxlZnQnICgnbWFyZ2lu
LXJpZ2h0JykgdG8gemVybyBhbmQKLSAgICAgICAgLy8gc29sdmUgZm9yICdtYXJnaW4tcmlnaHQn
ICgnbWFyZ2luLWxlZnQnKS4gSWYgb25lIG9mICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdo
dCcgaXMgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gZm9yIHRoYXQgdmFsdWUuCi0gICAgICAg
IC8vIElmIHRoZSB2YWx1ZXMgYXJlIG92ZXItY29uc3RyYWluZWQsIGlnbm9yZSB0aGUgdmFsdWUg
Zm9yICdsZWZ0JyAoaW4gY2FzZSB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGNvbnRh
aW5pbmcgYmxvY2sgaXMgJ3J0bCcpIG9yICdyaWdodCcKLSAgICAgICAgLy8gKGluIGNhc2UgJ2Rp
cmVjdGlvbicgaXMgJ2x0cicpIGFuZCBzb2x2ZSBmb3IgdGhhdCB2YWx1ZS4KLSAgICAgICAgaWYg
KCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgJiYgIWNvbXB1dGVkSG9yaXpvbnRhbE1h
cmdpbi5lbmQpIHsKLSAgICAgICAgICAgIGF1dG8gbWFyZ2luU3RhcnRBbmRFbmQgPSBjb250YWlu
aW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0
aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnJpZ2h0KTsKLSAgICAgICAgICAgIGlm
IChtYXJnaW5TdGFydEFuZEVuZCA+PSAwKQotICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFs
TWFyZ2luID0geyBtYXJnaW5TdGFydEFuZEVuZCAvIDIsIG1hcmdpblN0YXJ0QW5kRW5kIC8gMiB9
OwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHRE
aXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3Rh
cnQgPSAwX2x1OwotICAgICAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQg
PSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0
YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsg
Ym9yZGVyUmlnaHQgKyAqcmlnaHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9IDBfbHU7Ci0gICAgICAgICAg
ICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gY29udGFpbmluZ0Jsb2NrV2lk
dGggLSAoKmxlZnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5n
UmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCArICpyaWdodCk7
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFj
b21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQpIHsKLSAgICAgICAgICAgIHVzZWRIb3Jpem9u
dGFsTWFyZ2luLmVuZCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kOwotICAgICAgICAg
ICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgq
bGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCAr
IGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKLSAgICAg
ICAgfSBlbHNlIGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgewotICAgICAgICAg
ICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LnN0YXJ0OwotICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gY29udGFpbmlu
Z0Jsb2NrV2lkdGggLSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRl
ckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0
ICsgKnJpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVzZWRIb3Jpem9udGFs
TWFyZ2luID0geyAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LCAqY29tcHV0ZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCB9OwotICAgICAgICAgICAgLy8gT3ZlcmNvbnN0cmFpbmVkPyBJZ25v
cmUgcmlnaHQgKGxlZnQpLgotICAgICAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24p
Ci0gICAgICAgICAgICAgICAgcmlnaHQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICh1c2VkSG9y
aXpvbnRhbE1hcmdpbi5zdGFydCArICpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsg
KndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdp
bi5lbmQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxlZnQgPSBjb250YWlu
aW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNl
ZEhvcml6b250YWxNYXJnaW4uZW5kICsgKnJpZ2h0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7
Ci0gICAgICAgIC8vIE90aGVyd2lzZSwgc2V0ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tbGVm
dCcgYW5kICdtYXJnaW4tcmlnaHQnIHRvIDAsIGFuZCBwaWNrIHRoZSBvbmUgb2YgdGhlIGZvbGxv
d2luZyBzaXggcnVsZXMgdGhhdCBhcHBsaWVzLgotICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdp
biA9IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OwotICAgIH0KLQotICAgIGlmICghbGVm
dCAmJiAhd2lkdGggJiYgcmlnaHQpIHsKLSAgICAgICAgLy8gIzEKLSAgICAgICAgLy8gQ2FsY3Vs
YXRlIHRoZSBhdmFpbGFibGUgd2lkdGggYnkgc29sdmluZyBmb3IgJ3dpZHRoJyBhZnRlciBzZXR0
aW5nICdsZWZ0JyAoaW4gY2FzZSAxKSB0byAwCi0gICAgICAgIGxlZnQgPSBMYXlvdXRVbml0IHsg
MCB9OwotICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gY29udGFpbmluZ0Jsb2NrV2lkdGgg
LSAoKmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRk
aW5nTGVmdCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJn
aW4uZW5kICsgKnJpZ2h0KTsKLSAgICAgICAgd2lkdGggPSBzaHJpbmtUb0ZpdFdpZHRoKGxheW91
dEJveCwgYXZhaWxhYmxlV2lkdGgpOwotICAgICAgICBsZWZ0ID0gY29udGFpbmluZ0Jsb2NrV2lk
dGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xl
ZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRh
bE1hcmdpbi5lbmQgKyAqcmlnaHQpOwotICAgIH0gZWxzZSBpZiAoIWxlZnQgJiYgIXJpZ2h0ICYm
IHdpZHRoKSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIGF1dG8gc3RhdGljSG9yaXpvbnRhbFBv
c2l0aW9uID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChs
YXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgICAgIGlmIChpc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBsZWZ0ID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0
aW9uOwotICAgICAgICAgICAgcmlnaHQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCAr
IHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsg
KndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdp
bi5lbmQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmlnaHQgPSBzdGF0aWNIb3Jp
em9udGFsUG9zaXRpb247Ci0gICAgICAgICAgICBsZWZ0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGgg
LSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQg
KyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFy
Z2luLmVuZCArICpyaWdodCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCF3aWR0aCAmJiAh
cmlnaHQgJiYgbGVmdCkgewotICAgICAgICAvLyAjMwotICAgICAgICAvLyBDYWxjdWxhdGUgdGhl
IGF2YWlsYWJsZSB3aWR0aCBieSBzb2x2aW5nIGZvciAnd2lkdGgnIGFmdGVyIHNldHRpbmcgJ3Jp
Z2h0JyAoaW4gY2FzZSAzKSB0byAwCi0gICAgICAgIHJpZ2h0ID0gTGF5b3V0VW5pdCB7IDAgfTsK
LSAgICAgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCps
ZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xl
ZnQgKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVu
ZCArICpyaWdodCk7Ci0gICAgICAgIHdpZHRoID0gc2hyaW5rVG9GaXRXaWR0aChsYXlvdXRCb3gs
IGF2YWlsYWJsZVdpZHRoKTsKLSAgICAgICAgcmlnaHQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAt
ICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRp
bmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpv
bnRhbE1hcmdpbi5lbmQpOwotICAgIH0gZWxzZSBpZiAoIWxlZnQgJiYgd2lkdGggJiYgcmlnaHQp
IHsKLSAgICAgICAgLy8gIzQKLSAgICAgICAgbGVmdCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0g
KHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsg
KndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdp
bi5lbmQgKyAqcmlnaHQpOwotICAgIH0gZWxzZSBpZiAoIXdpZHRoICYmIGxlZnQgJiYgcmlnaHQp
IHsKLSAgICAgICAgLy8gIzUKLSAgICAgICAgd2lkdGggPSBjb250YWluaW5nQmxvY2tXaWR0aCAt
ICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRp
bmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdp
bi5lbmQgKyAqcmlnaHQpOwotICAgIH0gZWxzZSBpZiAoIXJpZ2h0ICYmIGxlZnQgJiYgd2lkdGgp
IHsKLSAgICAgICAgLy8gIzYKLSAgICAgICAgcmlnaHQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAt
ICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRp
bmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpv
bnRhbE1hcmdpbi5lbmQpOwotICAgIH0KLQotICAgIEFTU0VSVChsZWZ0KTsKLSAgICBBU1NFUlQo
cmlnaHQpOwotICAgIEFTU0VSVCh3aWR0aCk7Ci0KLSAgICAvLyBGb3Igb3V0LW9mLWZsb3cgZWxl
bWVudHMgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgZm9ybWVkIGJ5IHRoZSBwYWRkaW5nIGVkZ2Ug
b2YgdGhlIGFuY2VzdG9yLgotICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBvc2l0aW9uZWQgdmFs
dWUgaXMgaW4gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBwYWRkaW5nIGJveC4gTGV0J3Mg
Y29udmVydCBpdCB0byBib3JkZXIgYm94IGNvb3JkaW5hdGUgc3lzdGVtLgotICAgIGF1dG8gY29u
dGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZSA9IGhvcml6b250YWxDb25zdHJhaW50cy5s
b2dpY2FsTGVmdDsKLSAgICAqbGVmdCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxF
ZGdlOwotICAgICpyaWdodCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOwot
Ci0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwg
IltQb3NpdGlvbl1bV2lkdGhdW01hcmdpbl0gLT4gb3V0LW9mLWZsb3cgbm9uLXJlcGxhY2VkIC0+
IGxlZnQoIiA8PCAqbGVmdCA8PCAicHgpIHJpZ2h0KCIgIDw8ICpyaWdodCA8PCAicHgpIHdpZHRo
KCIgPDwgKndpZHRoIDw8ICJweCkgbWFyZ2luKCIgPDwgdXNlZEhvcml6b250YWxNYXJnaW4uc3Rh
cnQgPDwgInB4LCAiICA8PCB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgPDwgInB4KSBsYXlvdXRC
b3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIHsgKmxlZnQsICpyaWdodCwg
eyAqd2lkdGgsIHVzZWRIb3Jpem9udGFsTWFyZ2luIH0gfTsKLX0KLQotVmVydGljYWxHZW9tZXRy
eSBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Om91dE9mRmxvd1JlcGxhY2VkVmVydGljYWxH
ZW9tZXRyeShjb25zdCBSZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFp
bnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMm
IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgY29uc3QKLXsKLSAgICBBU1NFUlQocmVwbGFjZWRC
b3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOwotICAgIEFTU0VSVCh2ZXJ0aWNhbENvbnN0cmFp
bnRzLmxvZ2ljYWxIZWlnaHQpOwotCi0gICAgLy8gMTAuNi41IEFic29sdXRlbHkgcG9zaXRpb25l
ZCwgcmVwbGFjZWQgZWxlbWVudHMKLSAgICAvLwotICAgIC8vIFRoZSB1c2VkIHZhbHVlIG9mICdo
ZWlnaHQnIGlzIGRldGVybWluZWQgYXMgZm9yIGlubGluZSByZXBsYWNlZCBlbGVtZW50cy4KLSAg
ICAvLyBJZiAnbWFyZ2luLXRvcCcgb3IgJ21hcmdpbi1ib3R0b20nIGlzIHNwZWNpZmllZCBhcyAn
YXV0bycgaXRzIHVzZWQgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcnVsZXMgYmVsb3cuCi0g
ICAgLy8gMS4gSWYgYm90aCAndG9wJyBhbmQgJ2JvdHRvbScgaGF2ZSB0aGUgdmFsdWUgJ2F1dG8n
LCByZXBsYWNlICd0b3AnIHdpdGggdGhlIGVsZW1lbnQncyBzdGF0aWMgcG9zaXRpb24uCi0gICAg
Ly8gMi4gSWYgJ2JvdHRvbScgaXMgJ2F1dG8nLCByZXBsYWNlIGFueSAnYXV0bycgb24gJ21hcmdp
bi10b3AnIG9yICdtYXJnaW4tYm90dG9tJyB3aXRoICcwJy4KLSAgICAvLyAzLiBJZiBhdCB0aGlz
IHBvaW50IGJvdGggJ21hcmdpbi10b3AnIGFuZCAnbWFyZ2luLWJvdHRvbScgYXJlIHN0aWxsICdh
dXRvJywgc29sdmUgdGhlIGVxdWF0aW9uIHVuZGVyIHRoZSBleHRyYSBjb25zdHJhaW50IHRoYXQg
dGhlIHR3byBtYXJnaW5zIG11c3QgZ2V0IGVxdWFsIHZhbHVlcy4KLSAgICAvLyA0LiBJZiBhdCB0
aGlzIHBvaW50IHRoZXJlIGlzIG9ubHkgb25lICdhdXRvJyBsZWZ0LCBzb2x2ZSB0aGUgZXF1YXRp
b24gZm9yIHRoYXQgdmFsdWUuCi0gICAgLy8gNS4gSWYgYXQgdGhpcyBwb2ludCB0aGUgdmFsdWVz
IGFyZSBvdmVyLWNvbnN0cmFpbmVkLCBpZ25vcmUgdGhlIHZhbHVlIGZvciAnYm90dG9tJyBhbmQg
c29sdmUgZm9yIHRoYXQgdmFsdWUuCi0KLSAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRo
aXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7Ci0gICAgYXV0byYgc3R5bGUgPSByZXBsYWNlZEJveC5z
dHlsZSgpOwotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0
cnlGb3JCb3gocmVwbGFjZWRCb3gpOwotICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0g
KnZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbEhlaWdodDsKLSAgICBhdXRvIGNvbnRhaW5pbmdC
bG9ja1dpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLQotICAgIGF1
dG8gdG9wID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2FsVG9wKCksIGNvbnRhaW5pbmdCbG9j
a1dpZHRoKTsKLSAgICBhdXRvIGJvdHRvbSA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbEJv
dHRvbSgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0gICAgYXV0byBoZWlnaHQgPSBpbmxpbmVS
ZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cywgdmVydGljYWxDb25zdHJhaW50cywgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKS5j
b250ZW50SGVpZ2h0OwotICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5
Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMpOwotICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRNYXJnaW5CZWZvcmUgPSBjb21wdXRl
ZFZlcnRpY2FsTWFyZ2luLmJlZm9yZTsKLSAgICBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkTWFy
Z2luQWZ0ZXIgPSBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyOwotICAgIGF1dG8gcGFkZGlu
Z1RvcCA9IGJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKDApOwotICAgIGF1dG8gcGFk
ZGluZ0JvdHRvbSA9IGJveEdlb21ldHJ5LnBhZGRpbmdCb3R0b20oKS52YWx1ZU9yKDApOwotICAg
IGF1dG8gYm9yZGVyVG9wID0gYm94R2VvbWV0cnkuYm9yZGVyVG9wKCk7Ci0gICAgYXV0byBib3Jk
ZXJCb3R0b20gPSBib3hHZW9tZXRyeS5ib3JkZXJCb3R0b20oKTsKLQotICAgIGlmICghdG9wICYm
ICFib3R0b20pIHsKLSAgICAgICAgLy8gIzEKLSAgICAgICAgdG9wID0gc3RhdGljVmVydGljYWxQ
b3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQocmVwbGFjZWRCb3gsIHZlcnRpY2FsQ29uc3Ry
YWludHMpOwotICAgIH0KLQotICAgIGlmICghYm90dG9tKSB7Ci0gICAgICAgIC8vICMyCi0gICAg
ICAgIHVzZWRNYXJnaW5CZWZvcmUgPSBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1
ZU9yKDApOwotICAgICAgICB1c2VkTWFyZ2luQWZ0ZXIgPSB1c2VkTWFyZ2luQmVmb3JlOwotICAg
IH0KLQotICAgIGlmICghdXNlZE1hcmdpbkJlZm9yZSAmJiAhdXNlZE1hcmdpbkFmdGVyKSB7Ci0g
ICAgICAgIC8vICMzCi0gICAgICAgIGF1dG8gbWFyZ2luQmVmb3JlQW5kQWZ0ZXIgPSBjb250YWlu
aW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBoZWlnaHQg
KyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKmJvdHRvbSk7Ci0gICAgICAgIHVzZWRN
YXJnaW5CZWZvcmUgPSBtYXJnaW5CZWZvcmVBbmRBZnRlciAvIDI7Ci0gICAgICAgIHVzZWRNYXJn
aW5BZnRlciA9IHVzZWRNYXJnaW5CZWZvcmU7Ci0gICAgfQotCi0gICAgLy8gIzQKLSAgICBpZiAo
IXRvcCkKLSAgICAgICAgdG9wID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp1c2VkTWFyZ2lu
QmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdodCArIHBhZGRpbmdCb3R0b20g
KyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyICsgKmJvdHRvbSk7Ci0KLSAgICBpZiAo
IWJvdHRvbSkKLSAgICAgICAgYm90dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3Ag
KyAqdXNlZE1hcmdpbkJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBoZWlnaHQgKyBw
YWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKnVzZWRNYXJnaW5BZnRlcik7Ci0KLSAgICBp
ZiAoIXVzZWRNYXJnaW5CZWZvcmUpCi0gICAgICAgIHVzZWRNYXJnaW5CZWZvcmUgPSBjb250YWlu
aW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBoZWlnaHQg
KyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKnVzZWRNYXJnaW5BZnRlciArICpib3R0
b20pOwotCi0gICAgaWYgKCF1c2VkTWFyZ2luQWZ0ZXIpCi0gICAgICAgIHVzZWRNYXJnaW5BZnRl
ciA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgKnVzZWRNYXJnaW5CZWZvcmUgKyBi
b3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJv
dHRvbSArICpib3R0b20pOwotCi0gICAgLy8gIzUKLSAgICBhdXRvIGJveEhlaWdodCA9ICp0b3Ag
KyAqdXNlZE1hcmdpbkJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBoZWlnaHQgKyBw
YWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgKnVzZWRNYXJnaW5BZnRlciArICpib3R0b207
Ci0gICAgaWYgKGJveEhlaWdodCA+IGNvbnRhaW5pbmdCbG9ja0hlaWdodCkKLSAgICAgICAgYm90
dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyAqdXNlZE1hcmdpbkJlZm9yZSAr
IGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVy
Qm90dG9tICsgKnVzZWRNYXJnaW5BZnRlcik7IAotCi0gICAgLy8gRm9yIG91dC1vZi1mbG93IGVs
ZW1lbnRzIHRoZSBjb250YWluaW5nIGJsb2NrIGlzIGZvcm1lZCBieSB0aGUgcGFkZGluZyBlZGdl
IG9mIHRoZSBhbmNlc3Rvci4KLSAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwb3NpdGlvbmVkIHZh
bHVlIGlzIGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgcGFkZGluZyBib3guIExldCdz
IGNvbnZlcnQgaXQgdG8gYm9yZGVyIGJveCBjb29yZGluYXRlIHN5c3RlbS4KLSAgICBhdXRvIGNv
bnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2UgPSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxv
Z2ljYWxUb3A7Ci0gICAgKnRvcCArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdl
OwotICAgICpib3R0b20gKz0gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZTsKLQot
ICAgIEFTU0VSVCh0b3ApOwotICAgIEFTU0VSVChib3R0b20pOwotICAgIEFTU0VSVCh1c2VkTWFy
Z2luQmVmb3JlKTsKLSAgICBBU1NFUlQodXNlZE1hcmdpbkFmdGVyKTsKLSAgICBMT0dfV0lUSF9T
VFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1Bvc2l0aW9uXVtIZWln
aHRdW01hcmdpbl0gLT4gb3V0LW9mLWZsb3cgcmVwbGFjZWQgLT4gdG9wKCIgPDwgKnRvcCA8PCAi
cHgpIGJvdHRvbSgiICA8PCAqYm90dG9tIDw8ICJweCkgaGVpZ2h0KCIgPDwgaGVpZ2h0IDw8ICJw
eCkgbWFyZ2luKCIgPDwgKnVzZWRNYXJnaW5CZWZvcmUgPDwgInB4LCAiICA8PCAqdXNlZE1hcmdp
bkFmdGVyIDw8ICJweCkgbGF5b3V0Qm94KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIpIik7Ci0gICAg
cmV0dXJuIHsgKnRvcCwgKmJvdHRvbSwgeyBoZWlnaHQsIHsgKnVzZWRNYXJnaW5CZWZvcmUsICp1
c2VkTWFyZ2luQWZ0ZXIgfSB9IH07Ci19Ci0KLUhvcml6b250YWxHZW9tZXRyeSBGb3JtYXR0aW5n
Q29udGV4dDo6R2VvbWV0cnk6Om91dE9mRmxvd1JlcGxhY2VkSG9yaXpvbnRhbEdlb21ldHJ5KGNv
bnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRp
Y2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJiBvdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcykKLXsKLSAgICBBU1NFUlQocmVwbGFjZWRCb3guaXNPdXRPZkZs
b3dQb3NpdGlvbmVkKCkpOwotCi0gICAgLy8gMTAuMy44IEFic29sdXRlbHkgcG9zaXRpb25lZCwg
cmVwbGFjZWQgZWxlbWVudHMKLSAgICAvLyBJbiB0aGlzIGNhc2UsIHNlY3Rpb24gMTAuMy43IGFw
cGxpZXMgdXAgdGhyb3VnaCBhbmQgaW5jbHVkaW5nIHRoZSBjb25zdHJhaW50IGVxdWF0aW9uLCBi
dXQgdGhlIHJlc3Qgb2Ygc2VjdGlvbiAxMC4zLjcgaXMgcmVwbGFjZWQgYnkgdGhlIGZvbGxvd2lu
ZyBydWxlczoKLSAgICAvLwotICAgIC8vIFRoZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcgaXMgZGV0
ZXJtaW5lZCBhcyBmb3IgaW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLiBJZiAnbWFyZ2luLWxlZnQn
IG9yICdtYXJnaW4tcmlnaHQnIGlzIHNwZWNpZmllZCBhcyAnYXV0bycgaXRzIHVzZWQgdmFsdWUg
aXMgZGV0ZXJtaW5lZCBieSB0aGUgcnVsZXMgYmVsb3cuCi0gICAgLy8gMS4gSWYgYm90aCAnbGVm
dCcgYW5kICdyaWdodCcgaGF2ZSB0aGUgdmFsdWUgJ2F1dG8nLCB0aGVuIGlmIHRoZSAnZGlyZWN0
aW9uJyBwcm9wZXJ0eSBvZiB0aGUgZWxlbWVudCBlc3RhYmxpc2hpbmcgdGhlIHN0YXRpYy1wb3Np
dGlvbiBjb250YWluaW5nIGJsb2NrIGlzICdsdHInLAotICAgIC8vICAgc2V0ICdsZWZ0JyB0byB0
aGUgc3RhdGljIHBvc2l0aW9uOyBlbHNlIGlmICdkaXJlY3Rpb24nIGlzICdydGwnLCBzZXQgJ3Jp
Z2h0JyB0byB0aGUgc3RhdGljIHBvc2l0aW9uLgotICAgIC8vIDIuIElmICdsZWZ0JyBvciAncmln
aHQnIGFyZSAnYXV0bycsIHJlcGxhY2UgYW55ICdhdXRvJyBvbiAnbWFyZ2luLWxlZnQnIG9yICdt
YXJnaW4tcmlnaHQnIHdpdGggJzAnLgotICAgIC8vIDMuIElmIGF0IHRoaXMgcG9pbnQgYm90aCAn
bWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyBhcmUgc3RpbGwgJ2F1dG8nLCBzb2x2ZSB0
aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4dHJhIGNvbnN0cmFpbnQgdGhhdCB0aGUgdHdvIG1hcmdp
bnMgbXVzdCBnZXQgZXF1YWwgdmFsdWVzLAotICAgIC8vICAgdW5sZXNzIHRoaXMgd291bGQgbWFr
ZSB0aGVtIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIHdoZW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUg
Y29udGFpbmluZyBibG9jayBpcyAnbHRyJyAoJ3J0bCcpLCBzZXQgJ21hcmdpbi1sZWZ0JyAoJ21h
cmdpbi1yaWdodCcpIHRvIHplcm8gYW5kCi0gICAgLy8gICBzb2x2ZSBmb3IgJ21hcmdpbi1yaWdo
dCcgKCdtYXJnaW4tbGVmdCcpLgotICAgIC8vIDQuIElmIGF0IHRoaXMgcG9pbnQgdGhlcmUgaXMg
YW4gJ2F1dG8nIGxlZnQsIHNvbHZlIHRoZSBlcXVhdGlvbiBmb3IgdGhhdCB2YWx1ZS4KLSAgICAv
LyA1LiBJZiBhdCB0aGlzIHBvaW50IHRoZSB2YWx1ZXMgYXJlIG92ZXItY29uc3RyYWluZWQsIGln
bm9yZSB0aGUgdmFsdWUgZm9yIGVpdGhlciAnbGVmdCcgKGluIGNhc2UgdGhlICdkaXJlY3Rpb24n
IHByb3BlcnR5IG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGlzICdydGwnKSBvcgotICAgIC8vICAg
J3JpZ2h0JyAoaW4gY2FzZSAnZGlyZWN0aW9uJyBpcyAnbHRyJykgYW5kIHNvbHZlIGZvciB0aGF0
IHZhbHVlLgotCi0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5n
Q29udGV4dCgpOwotICAgIGF1dG8mIHN0eWxlID0gcmVwbGFjZWRCb3guc3R5bGUoKTsKLSAgICBh
dXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KHJlcGxh
Y2VkQm94KTsKLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpvbnRhbENvbnN0
cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAgICBhdXRvIGlzTGVmdFRvUmlnaHREaXJlY3Rpb24gPSBy
ZXBsYWNlZEJveC5jb250YWluaW5nQmxvY2soKS5zdHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rp
b24oKTsKLQotICAgIGF1dG8gbGVmdCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbExlZnQo
KSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgIGF1dG8gcmlnaHQgPSBjb21wdXRlZFZhbHVl
KHN0eWxlLmxvZ2ljYWxSaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7Ci0gICAgYXV0byBj
b21wdXRlZEhvcml6b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRIb3Jpem9udGFsTWFy
Z2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgIE9wdGlvbmFsPExh
eW91dFVuaXQ+IHVzZWRNYXJnaW5TdGFydCA9IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFy
dDsKLSAgICBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkTWFyZ2luRW5kID0gY29tcHV0ZWRIb3Jp
em9udGFsTWFyZ2luLmVuZDsKLSAgICBhdXRvIHdpZHRoID0gaW5saW5lUmVwbGFjZWRDb250ZW50
V2lkdGhBbmRNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgdmVydGlj
YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpLmNvbnRlbnRXaWR0aDsK
LSAgICBhdXRvIHBhZGRpbmdMZWZ0ID0gYm94R2VvbWV0cnkucGFkZGluZ0xlZnQoKS52YWx1ZU9y
KDApOwotICAgIGF1dG8gcGFkZGluZ1JpZ2h0ID0gYm94R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCku
dmFsdWVPcigwKTsKLSAgICBhdXRvIGJvcmRlckxlZnQgPSBib3hHZW9tZXRyeS5ib3JkZXJMZWZ0
KCk7Ci0gICAgYXV0byBib3JkZXJSaWdodCA9IGJveEdlb21ldHJ5LmJvcmRlclJpZ2h0KCk7Ci0K
LSAgICBpZiAoIWxlZnQgJiYgIXJpZ2h0KSB7Ci0gICAgICAgIC8vICMxCi0gICAgICAgIGF1dG8g
c3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uRm9yT3V0
T2ZGbG93UG9zaXRpb25lZChyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAg
ICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pCi0gICAgICAgICAgICBsZWZ0ID0gc3Rh
dGljSG9yaXpvbnRhbFBvc2l0aW9uOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByaWdodCA9
IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbjsKLSAgICB9Ci0KLSAgICBpZiAoIWxlZnQgfHwgIXJp
Z2h0KSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIHVzZWRNYXJnaW5TdGFydCA9IGNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDApOwotICAgICAgICB1c2VkTWFyZ2luRW5k
ID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApOwotICAgIH0KLQotICAg
IGlmICghdXNlZE1hcmdpblN0YXJ0ICYmICF1c2VkTWFyZ2luRW5kKSB7Ci0gICAgICAgIC8vICMz
Ci0gICAgICAgIGF1dG8gbWFyZ2luU3RhcnRBbmRFbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAt
ICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0
ICsgYm9yZGVyUmlnaHQgKyAqcmlnaHQpOwotICAgICAgICBpZiAobWFyZ2luU3RhcnRBbmRFbmQg
Pj0gMCkgewotICAgICAgICAgICAgdXNlZE1hcmdpblN0YXJ0ID0gbWFyZ2luU3RhcnRBbmRFbmQg
LyAyOwotICAgICAgICAgICAgdXNlZE1hcmdpbkVuZCA9IHVzZWRNYXJnaW5TdGFydDsKLSAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKSB7Ci0g
ICAgICAgICAgICAgICAgdXNlZE1hcmdpblN0YXJ0ID0gMF9sdTsKLSAgICAgICAgICAgICAgICB1
c2VkTWFyZ2luRW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyAqdXNlZE1hcmdp
blN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQg
KyBib3JkZXJSaWdodCArICpyaWdodCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgICAgIHVzZWRNYXJnaW5FbmQgPSAwX2x1OwotICAgICAgICAgICAgICAgIHVzZWRNYXJnaW5T
dGFydCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRp
bmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFyZ2lu
RW5kICsgKnJpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8v
ICM0Ci0gICAgaWYgKCFsZWZ0KQotICAgICAgICBsZWZ0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGgg
LSAoKnVzZWRNYXJnaW5TdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdpZHRoICsg
cGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNlZE1hcmdpbkVuZCArICpyaWdodCk7Ci0K
LSAgICBpZiAoIXJpZ2h0KQotICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0g
KCpsZWZ0ICsgKnVzZWRNYXJnaW5TdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdp
ZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNlZE1hcmdpbkVuZCk7Ci0KLSAg
ICBpZiAoIXVzZWRNYXJnaW5TdGFydCkKLSAgICAgICAgdXNlZE1hcmdpblN0YXJ0ID0gY29udGFp
bmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0
aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnVzZWRNYXJnaW5FbmQgKyAqcmlnaHQp
OwotCi0gICAgaWYgKCF1c2VkTWFyZ2luRW5kKQotICAgICAgICB1c2VkTWFyZ2luRW5kID0gY29u
dGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyAqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVm
dCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICpy
aWdodCk7Ci0KLSAgICBhdXRvIGJveFdpZHRoID0gKCpsZWZ0ICsgKnVzZWRNYXJnaW5TdGFydCAr
IGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVy
UmlnaHQgKyAqdXNlZE1hcmdpbkVuZCArICpyaWdodCk7Ci0gICAgaWYgKGJveFdpZHRoID4gY29u
dGFpbmluZ0Jsb2NrV2lkdGgpIHsKLSAgICAgICAgLy8gIzUgT3Zlci1jb25zdHJhaW5lZD8KLSAg
ICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pCi0gICAgICAgICAgICByaWdodCA9IGNv
bnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgKnVzZWRNYXJnaW5TdGFydCArIGJvcmRlckxl
ZnQgKyBwYWRkaW5nTGVmdCArIHdpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAq
dXNlZE1hcmdpbkVuZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxlZnQgPSBjb250YWlu
aW5nQmxvY2tXaWR0aCAtICgqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdM
ZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFyZ2luRW5k
ICsgKnJpZ2h0KTsKLSAgICB9Ci0KLSAgICBBU1NFUlQobGVmdCk7Ci0gICAgQVNTRVJUKHJpZ2h0
KTsKLSAgICBBU1NFUlQodXNlZE1hcmdpblN0YXJ0KTsKLSAgICBBU1NFUlQodXNlZE1hcmdpbkVu
ZCk7Ci0KLSAgICAvLyBGb3Igb3V0LW9mLWZsb3cgZWxlbWVudHMgdGhlIGNvbnRhaW5pbmcgYmxv
Y2sgaXMgZm9ybWVkIGJ5IHRoZSBwYWRkaW5nIGVkZ2Ugb2YgdGhlIGFuY2VzdG9yLgotICAgIC8v
IEF0IHRoaXMgcG9pbnQgdGhlIHBvc2l0aW9uZWQgdmFsdWUgaXMgaW4gdGhlIGNvb3JkaW5hdGUg
c3lzdGVtIG9mIHRoZSBwYWRkaW5nIGJveC4gTGV0J3MgY29udmVydCBpdCB0byBib3JkZXIgYm94
IGNvb3JkaW5hdGUgc3lzdGVtLgotICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRp
Y2FsRWRnZSA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsTGVmdDsKLSAgICAqbGVmdCAr
PSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOwotICAgICpyaWdodCArPSBjb250
YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOwotCi0gICAgTE9HX1dJVEhfU1RSRUFNKEZv
cm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltQb3NpdGlvbl1bV2lkdGhdW01hcmdp
bl0gLT4gb3V0LW9mLWZsb3cgcmVwbGFjZWQgLT4gbGVmdCgiIDw8ICpsZWZ0IDw8ICJweCkgcmln
aHQoIiAgPDwgKnJpZ2h0IDw8ICJweCkgd2lkdGgoIiA8PCB3aWR0aCA8PCAicHgpIG1hcmdpbigi
IDw8ICp1c2VkTWFyZ2luU3RhcnQgPDwgInB4LCAiICA8PCAqdXNlZE1hcmdpbkVuZCA8PCAicHgp
IGxheW91dEJveCgiIDw8ICZyZXBsYWNlZEJveCA8PCAiKSIpOwotICAgIHJldHVybiB7ICpsZWZ0
LCAqcmlnaHQsIHsgd2lkdGgsIHsgKnVzZWRNYXJnaW5TdGFydCwgKnVzZWRNYXJnaW5FbmQgfSB9
IH07Ci19Ci0KLUNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5Ojpjb21wbGljYXRlZENhc2VzKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZl
cnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Ci17Ci0gICAgQVNT
RVJUKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKLSAgICAvLyBUT0RPOiBVc2UgY29tcGxp
Y2F0ZWQtY2FzZSBmb3IgZG9jdW1lbnQgcmVuZGVyZXIgZm9yIG5vdyAoc2VlIEJsb2NrRm9ybWF0
dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbkZsb3dIZWlnaHRBbmRNYXJnaW4pLgotICAgIEFTU0VS
VCgobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpICYmIGxheW91dEJveC5pc0luRmxvdygpICYm
ICFsYXlvdXRCb3guaXNPdmVyZmxvd1Zpc2libGUoKSkgfHwgbGF5b3V0Qm94LmlzSW5saW5lQmxv
Y2tCb3goKSB8fCBsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSB8fCBsYXlvdXRCb3gu
aXNEb2N1bWVudEJveCgpIHx8IGxheW91dEJveC5pc1RhYmxlQm94KCkpOwotCi0gICAgLy8gMTAu
Ni42IENvbXBsaWNhdGVkIGNhc2VzCi0gICAgLy8KLSAgICAvLyBCbG9jay1sZXZlbCwgbm9uLXJl
cGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93IHdoZW4gJ292ZXJmbG93JyBkb2VzIG5vdCBj
b21wdXRlIHRvICd2aXNpYmxlJyAoZXhjZXB0IGlmIHRoZSAnb3ZlcmZsb3cnIHByb3BlcnR5J3Mg
dmFsdWUgaGFzIGJlZW4gcHJvcGFnYXRlZCB0byB0aGUgdmlld3BvcnQpLgotICAgIC8vICdJbmxp
bmUtYmxvY2snLCBub24tcmVwbGFjZWQgZWxlbWVudHMuCi0gICAgLy8gRmxvYXRpbmcsIG5vbi1y
ZXBsYWNlZCBlbGVtZW50cy4KLSAgICAvLwotICAgIC8vIDEuIElmICdtYXJnaW4tdG9wJywgb3Ig
J21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHRoZWlyIHVzZWQgdmFsdWUgaXMgMC4KLSAgICAv
LyAyLiBJZiAnaGVpZ2h0JyBpcyAnYXV0bycsIHRoZSBoZWlnaHQgZGVwZW5kcyBvbiB0aGUgZWxl
bWVudCdzIGRlc2NlbmRhbnRzIHBlciAxMC42LjcuCi0KLSAgICBhdXRvIGhlaWdodCA9IG92ZXJy
aWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQgPyBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVp
Z2h0LnZhbHVlKCkgOiBjb21wdXRlZEhlaWdodChsYXlvdXRCb3gpOwotICAgIGF1dG8gY29tcHV0
ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKGxheW91
dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAvLyAjMQotICAgIGF1dG8gdXNlZFZl
cnRpY2FsTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgeyBj
b21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21wdXRlZFZlcnRpY2Fs
TWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsgCi0gICAgLy8gIzIKLSAgICBpZiAoIWhlaWdodCkg
ewotICAgICAgICBBU1NFUlQoaXNIZWlnaHRBdXRvKGxheW91dEJveCkpOwotICAgICAgICBpZiAo
IWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSB8fCAhZG93bmNhc3Q8Q29udGFpbmVyQm94Pihs
YXlvdXRCb3gpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQotICAgICAgICAgICAgaGVpZ2h0
ID0gMF9sdTsKLSAgICAgICAgZWxzZSBpZiAobGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSAmJiAh
bGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSkgewotICAgICAgICAgICAg
YXV0byYgZG9jdW1lbnRCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7Ci0g
ICAgICAgICAgICBhdXRvIHRvcCA9IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KGZvcm1hdHRp
bmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goKmRvY3VtZW50Qm94LmZpcnN0SW5GbG93Q2hpbGQo
KSkpLnRvcCgpOwotICAgICAgICAgICAgYXV0byBib3R0b20gPSBCb3hHZW9tZXRyeTo6bWFyZ2lu
Qm94UmVjdChmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KCpkb2N1bWVudEJveC5s
YXN0SW5GbG93Q2hpbGQoKSkpLmJvdHRvbSgpOwotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNw
ZWNpYWwgKHF1aXJrPykgYmVoYXZpb3Igc2luY2UgdGhlIGRvY3VtZW50IGJveCBpcyBub3QgYSBm
b3JtYXR0aW5nIGNvbnRleHQgcm9vdCBhbmQKLSAgICAgICAgICAgIC8vIGFsbCB0aGUgZmxvYXQg
Ym94ZXMgZW5kIHVwIGF0IHRoZSBJQ0IgbGV2ZWwuCi0gICAgICAgICAgICBhdXRvJiBpbml0aWFs
Q29udGFpbmluZ0Jsb2NrID0gZG9jdW1lbnRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCk7Ci0g
ICAgICAgICAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7IGZvcm1h
dHRpbmdDb250ZXh0KCksIGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRGb3JtYXR0aW5nU3RhdGUo
aW5pdGlhbENvbnRhaW5pbmdCbG9jaykuZmxvYXRpbmdTdGF0ZSgpIH07Ci0gICAgICAgICAgICBp
ZiAoYXV0byBmbG9hdEJvdHRvbSA9IGZsb2F0aW5nQ29udGV4dC5ib3R0b20oKSkgewotICAgICAg
ICAgICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4PExheW91dFVuaXQ+KCpmbG9hdEJvdHRvbSwgYm90
dG9tKTsKLSAgICAgICAgICAgICAgICBhdXRvIGZsb2F0VG9wID0gZmxvYXRpbmdDb250ZXh0LnRv
cCgpOwotICAgICAgICAgICAgICAgIEFTU0VSVChmbG9hdFRvcCk7Ci0gICAgICAgICAgICAgICAg
dG9wID0gc3RkOjptaW48TGF5b3V0VW5pdD4oKmZsb2F0VG9wLCB0b3ApOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgaGVpZ2h0ID0gYm90dG9tIC0gdG9wOwotICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgQVNTRVJUKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0
KCkpOwotICAgICAgICAgICAgaGVpZ2h0ID0gY29udGVudEhlaWdodEZvckZvcm1hdHRpbmdDb250
ZXh0Um9vdChkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkpOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgQVNTRVJUKGhlaWdodCk7Ci0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0
dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW0hlaWdodF1bTWFyZ2luXSAtPiBmbG9hdGlu
ZyBub24tcmVwbGFjZWQgLT4gaGVpZ2h0KCIgPDwgKmhlaWdodCA8PCAicHgpIG1hcmdpbigiIDw8
IHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPDwgInB4LCAiIDw8IHVzZWRWZXJ0aWNhbE1hcmdp
bi5hZnRlciA8PCAicHgpIC0+IGxheW91dEJveCgiIDw8ICZsYXlvdXRCb3ggPDwgIikiKTsKLSAg
ICByZXR1cm4gQ29udGVudEhlaWdodEFuZE1hcmdpbiB7ICpoZWlnaHQsIHVzZWRWZXJ0aWNhbE1h
cmdpbiB9OwotfQotCi1Db250ZW50V2lkdGhBbmRNYXJnaW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5OjpmbG9hdGluZ05vblJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJv
eCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25z
dHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9u
ZWQoKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSk7Ci0KLSAgICAvLyAxMC4zLjUgRmxv
YXRpbmcsIG5vbi1yZXBsYWNlZCBlbGVtZW50cwotICAgIC8vCi0gICAgLy8gMS4gSWYgJ21hcmdp
bi1sZWZ0Jywgb3IgJ21hcmdpbi1yaWdodCcgYXJlIGNvbXB1dGVkIGFzICdhdXRvJywgdGhlaXIg
dXNlZCB2YWx1ZSBpcyAnMCcuCi0gICAgLy8gMi4gSWYgJ3dpZHRoJyBpcyBjb21wdXRlZCBhcyAn
YXV0bycsIHRoZSB1c2VkIHZhbHVlIGlzIHRoZSAic2hyaW5rLXRvLWZpdCIgd2lkdGguCi0KLSAg
ICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6
b250YWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotCi0gICAgLy8g
IzEKLSAgICBhdXRvIHVzZWRIb3Jpem9udGFsbE1hcmdpbiA9IFVzZWRIb3Jpem9udGFsTWFyZ2lu
IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OwotICAgIC8vICMyCi0gICAgYXV0byB3aWR0
aCA9IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoID8gb3ZlcnJpZGRlbkhvcml6b250
YWxWYWx1ZXMud2lkdGggOiBjb21wdXRlZFdpZHRoKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0
cmFpbnRzLmxvZ2ljYWxXaWR0aCk7Ci0gICAgaWYgKCF3aWR0aCkKLSAgICAgICAgd2lkdGggPSBz
aHJpbmtUb0ZpdFdpZHRoKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxX
aWR0aCk7Ci0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0
cmVhbSA8PCAiW1dpZHRoXVtNYXJnaW5dIC0+IGZsb2F0aW5nIG5vbi1yZXBsYWNlZCAtPiB3aWR0
aCgiIDw8ICp3aWR0aCA8PCAicHgpIG1hcmdpbigiIDw8IHVzZWRIb3Jpem9udGFsbE1hcmdpbi5z
dGFydCA8PCAicHgsICIgPDwgdXNlZEhvcml6b250YWxsTWFyZ2luLmVuZCA8PCAicHgpIC0+IGxh
eW91dEJveCgiIDw8ICZsYXlvdXRCb3ggPDwgIikiKTsKLSAgICByZXR1cm4gQ29udGVudFdpZHRo
QW5kTWFyZ2luIHsgKndpZHRoLCB1c2VkSG9yaXpvbnRhbGxNYXJnaW4gfTsKLX0KLQotQ29udGVu
dEhlaWdodEFuZE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZsb2F0aW5nUmVw
bGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJv
eCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNv
bnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBj
b25zdAotewotICAgIEFTU0VSVChyZXBsYWNlZEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKTsK
LQotICAgIC8vIDEwLjYuMiBJbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMsIGJsb2NrLWxldmVsIHJl
cGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93LCAnaW5saW5lLWJsb2NrJwotICAgIC8vIHJl
cGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93IGFuZCBmbG9hdGluZyByZXBsYWNlZCBlbGVt
ZW50cwotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFt
IDw8ICJbSGVpZ2h0XVtNYXJnaW5dIC0+IGZsb2F0aW5nIHJlcGxhY2VkIC0+IHJlZGlyZWN0ZWQg
dG8gaW5saW5lIHJlcGxhY2VkIik7Ci0gICAgcmV0dXJuIGlubGluZVJlcGxhY2VkQ29udGVudEhl
aWdodEFuZE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IH0sIG92
ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZsb2F0aW5nUmVwbGFjZWRDb250ZW50V2lkdGhBbmRN
YXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29u
c3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250
YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQotewotICAgIEFTU0VSVChyZXBs
YWNlZEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKTsKLQotICAgIC8vIDEwLjMuNiBGbG9hdGlu
ZywgcmVwbGFjZWQgZWxlbWVudHMKLSAgICAvLwotICAgIC8vIDEuIElmICdtYXJnaW4tbGVmdCcg
b3IgJ21hcmdpbi1yaWdodCcgYXJlIGNvbXB1dGVkIGFzICdhdXRvJywgdGhlaXIgdXNlZCB2YWx1
ZSBpcyAnMCcuCi0gICAgLy8gMi4gVGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBpcyBkZXRlcm1p
bmVkIGFzIGZvciBpbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMuCi0gICAgYXV0byBjb21wdXRlZEhv
cml6b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKHJlcGxh
Y2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotCi0gICAgTE9HX1dJVEhfU1RSRUFNKEZv
cm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltIZWlnaHRdW01hcmdpbl0gLT4gZmxv
YXRpbmcgcmVwbGFjZWQgLT4gcmVkaXJlY3RlZCB0byBpbmxpbmUgcmVwbGFjZWQiKTsKLSAgICBh
dXRvIHVzZWRNYXJnaW4gPSBVc2VkSG9yaXpvbnRhbE1hcmdpbiB7IGNvbXB1dGVkSG9yaXpvbnRh
bE1hcmdpbi5zdGFydC52YWx1ZU9yKDApLCBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZh
bHVlT3IoMCkgfTsKLSAgICByZXR1cm4gaW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJn
aW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCB7IG92ZXJyaWRkZW5I
b3Jpem9udGFsVmFsdWVzLndpZHRoLCB1c2VkTWFyZ2luIH0pOwotfQotCi1WZXJ0aWNhbEdlb21l
dHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93VmVydGljYWxHZW9tZXRy
eShjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jp
em9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29u
c3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRp
Y2FsVmFsdWVzKSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3Np
dGlvbmVkKCkpOwotCi0gICAgaWYgKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQotICAgICAg
ICByZXR1cm4gb3V0T2ZGbG93Tm9uUmVwbGFjZWRWZXJ0aWNhbEdlb21ldHJ5KGRvd25jYXN0PENv
bnRhaW5lckJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB2ZXJ0aWNhbENv
bnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwotICAgIHJldHVybiBvdXRPZkZs
b3dSZXBsYWNlZFZlcnRpY2FsR2VvbWV0cnkoZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJv
eCksIGhvcml6b250YWxDb25zdHJhaW50cywgdmVydGljYWxDb25zdHJhaW50cywgb3ZlcnJpZGRl
blZlcnRpY2FsVmFsdWVzKTsKLX0KLQotSG9yaXpvbnRhbEdlb21ldHJ5IEZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93SG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50
cywgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cywgY29uc3Qg
T3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQot
ewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOwotCi0gICAg
aWYgKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQotICAgICAgICByZXR1cm4gb3V0T2ZGbG93
Tm9uUmVwbGFjZWRIb3Jpem9udGFsR2VvbWV0cnkoZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlv
dXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVz
KTsKLSAgICByZXR1cm4gb3V0T2ZGbG93UmVwbGFjZWRIb3Jpem9udGFsR2VvbWV0cnkoZG93bmNh
c3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgdmVydGlj
YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOwotfQotCi1Db250ZW50
SGVpZ2h0QW5kTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6ZmxvYXRpbmdDb250
ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFs
Q29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRp
Y2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Ci17Ci0gICAgQVNTRVJU
KGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKTsKLQotICAgIGlmICghbGF5b3V0Qm94
LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgcmV0dXJuIGNvbXBsaWNhdGVkQ2FzZXMobGF5b3V0
Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci0g
ICAgcmV0dXJuIGZsb2F0aW5nUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGRvd25jYXN0
PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRk
ZW5WZXJ0aWNhbFZhbHVlcyk7Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBGb3JtYXR0aW5n
Q29udGV4dDo6R2VvbWV0cnk6OmZsb2F0aW5nQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJv
eCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25z
dHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzKQotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9u
ZWQoKSk7Ci0KLSAgICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0gICAgICAgIHJl
dHVybiBmbG9hdGluZ05vblJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGxheW91dEJveCwg
aG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyk7Ci0gICAg
cmV0dXJuIGZsb2F0aW5nUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oZG93bmNhc3Q8UmVw
bGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhv
cml6b250YWxWYWx1ZXMpOwotfQotCi1Db250ZW50SGVpZ2h0QW5kTWFyZ2luIEZvcm1hdHRpbmdD
b250ZXh0OjpHZW9tZXRyeTo6aW5saW5lUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNv
bnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiBob3Jpem9udGFsQ29uc3RyYWludHMsIE9wdGlvbmFsPFZlcnRpY2FsQ29uc3RyYWludHM+IHZl
cnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJp
ZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAgIC8vIDEwLjYuMiBJbmxpbmUgcmVwbGFj
ZWQgZWxlbWVudHMsIGJsb2NrLWxldmVsIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93
LCAnaW5saW5lLWJsb2NrJyByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdyBhbmQgZmxv
YXRpbmcgcmVwbGFjZWQgZWxlbWVudHMKLSAgICAvLwotICAgIC8vIDEuIElmICdtYXJnaW4tdG9w
Jywgb3IgJ21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHRoZWlyIHVzZWQgdmFsdWUgaXMgMC4K
LSAgICAvLyAyLiBJZiAnaGVpZ2h0JyBhbmQgJ3dpZHRoJyBib3RoIGhhdmUgY29tcHV0ZWQgdmFs
dWVzIG9mICdhdXRvJyBhbmQgdGhlIGVsZW1lbnQgYWxzbyBoYXMgYW4gaW50cmluc2ljIGhlaWdo
dCwgdGhlbiB0aGF0IGludHJpbnNpYyBoZWlnaHQgaXMgdGhlIHVzZWQgdmFsdWUgb2YgJ2hlaWdo
dCcuCi0gICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiAnaGVpZ2h0JyBoYXMgYSBjb21wdXRlZCB2YWx1
ZSBvZiAnYXV0bycsIGFuZCB0aGUgZWxlbWVudCBoYXMgYW4gaW50cmluc2ljIHJhdGlvIHRoZW4g
dGhlIHVzZWQgdmFsdWUgb2YgJ2hlaWdodCcgaXM6Ci0gICAgLy8gICAgKHVzZWQgd2lkdGgpIC8g
KGludHJpbnNpYyByYXRpbykKLSAgICAvLyA0LiBPdGhlcndpc2UsIGlmICdoZWlnaHQnIGhhcyBh
IGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJywgYW5kIHRoZSBlbGVtZW50IGhhcyBhbiBpbnRyaW5z
aWMgaGVpZ2h0LCB0aGVuIHRoYXQgaW50cmluc2ljIGhlaWdodCBpcyB0aGUgdXNlZCB2YWx1ZSBv
ZiAnaGVpZ2h0Jy4KLSAgICAvLyA1LiBPdGhlcndpc2UsIGlmICdoZWlnaHQnIGhhcyBhIGNvbXB1
dGVkIHZhbHVlIG9mICdhdXRvJywgYnV0IG5vbmUgb2YgdGhlIGNvbmRpdGlvbnMgYWJvdmUgYXJl
IG1ldCwgdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnaGVpZ2h0JyBtdXN0IGJlIHNldCB0bwotICAg
IC8vICAgIHRoZSBoZWlnaHQgb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIHRoYXQgaGFzIGEgMjox
IHJhdGlvLCBoYXMgYSBoZWlnaHQgbm90IGdyZWF0ZXIgdGhhbiAxNTBweCwgYW5kIGhhcyBhIHdp
ZHRoIG5vdCBncmVhdGVyIHRoYW4gdGhlIGRldmljZSB3aWR0aC4KLQotICAgIC8vICMxCi0gICAg
YXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgpOwotICAg
IGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2Fs
TWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgIGF1dG8gdXNl
ZFZlcnRpY2FsTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMg
eyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21wdXRlZFZlcnRp
Y2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKLSAgICBhdXRvJiBzdHlsZSA9IHJlcGxhY2Vk
Qm94LnN0eWxlKCk7Ci0KLSAgICBhdXRvIGhlaWdodCA9IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVl
cy5oZWlnaHQgPyBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVpZ2h0LnZhbHVlKCkgOiBjb21w
dXRlZEhlaWdodChyZXBsYWNlZEJveCwgdmVydGljYWxDb25zdHJhaW50cyA/IHZlcnRpY2FsQ29u
c3RyYWludHMtPmxvZ2ljYWxIZWlnaHQgOiBXVEY6Om51bGxvcHQpOwotICAgIGF1dG8gaGVpZ2h0
SXNBdXRvID0gIW92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQgJiYgaXNIZWlnaHRBdXRv
KHJlcGxhY2VkQm94KTsKLSAgICBhdXRvIHdpZHRoSXNBdXRvID0gc3R5bGUubG9naWNhbFdpZHRo
KCkuaXNBdXRvKCk7Ci0KLSAgICBpZiAoaGVpZ2h0SXNBdXRvICYmIHdpZHRoSXNBdXRvICYmIHJl
cGxhY2VkQm94Lmhhc0ludHJpbnNpY0hlaWdodCgpKSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAg
IGhlaWdodCA9IHJlcGxhY2VkQm94LmludHJpbnNpY0hlaWdodCgpOwotICAgIH0gZWxzZSBpZiAo
aGVpZ2h0SXNBdXRvICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1JhdGlvKCkpIHsKLSAgICAg
ICAgLy8gIzMKLSAgICAgICAgYXV0byB1c2VkV2lkdGggPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9t
ZXRyeUZvckJveChyZXBsYWNlZEJveCkuY29udGVudEJveFdpZHRoKCk7Ci0gICAgICAgIGhlaWdo
dCA9IHVzZWRXaWR0aCAvIHJlcGxhY2VkQm94LmludHJpbnNpY1JhdGlvKCk7Ci0gICAgfSBlbHNl
IGlmIChoZWlnaHRJc0F1dG8gJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkpIHsK
LSAgICAgICAgLy8gIzQKLSAgICAgICAgaGVpZ2h0ID0gcmVwbGFjZWRCb3guaW50cmluc2ljSGVp
Z2h0KCk7Ci0gICAgfSBlbHNlIGlmIChoZWlnaHRJc0F1dG8pIHsKLSAgICAgICAgLy8gIzUKLSAg
ICAgICAgaGVpZ2h0ID0geyAxNTAgfTsKLSAgICB9Ci0KLSAgICBBU1NFUlQoaGVpZ2h0KTsKLQot
ICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJb
SGVpZ2h0XVtNYXJnaW5dIC0+IGluZmxvdyByZXBsYWNlZCAtPiBoZWlnaHQoIiA8PCAqaGVpZ2h0
IDw8ICJweCkgbWFyZ2luKCIgPDwgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSA8PCAicHgsICIg
PDwgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJnJl
cGxhY2VkQm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIHsgKmhlaWdodCwgdXNlZFZlcnRpY2FsTWFy
Z2luIH07Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnk6OmlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IFJlcGxhY2Vk
Qm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFs
Q29uc3RyYWludHMsIE9wdGlvbmFsPFZlcnRpY2FsQ29uc3RyYWludHM+IHZlcnRpY2FsQ29uc3Ry
YWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJiBvdmVycmlkZGVuSG9yaXpv
bnRhbFZhbHVlcykKLXsKLSAgICAvLyAxMC4zLjIgSW5saW5lLCByZXBsYWNlZCBlbGVtZW50cwot
ICAgIC8vCi0gICAgLy8gQSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycgZm9yICdtYXJnaW4tbGVm
dCcgb3IgJ21hcmdpbi1yaWdodCcgYmVjb21lcyBhIHVzZWQgdmFsdWUgb2YgJzAnLgotICAgIC8v
Ci0gICAgLy8gMS4gSWYgJ2hlaWdodCcgYW5kICd3aWR0aCcgYm90aCBoYXZlIGNvbXB1dGVkIHZh
bHVlcyBvZiAnYXV0bycgYW5kIHRoZSBlbGVtZW50IGFsc28gaGFzIGFuIGludHJpbnNpYyB3aWR0
aCwgdGhlbiB0aGF0IGludHJpbnNpYyB3aWR0aCBpcyB0aGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgn
LgotICAgIC8vCi0gICAgLy8gMi4gSWYgJ2hlaWdodCcgYW5kICd3aWR0aCcgYm90aCBoYXZlIGNv
bXB1dGVkIHZhbHVlcyBvZiAnYXV0bycgYW5kIHRoZSBlbGVtZW50IGhhcyBubyBpbnRyaW5zaWMg
d2lkdGgsIGJ1dCBkb2VzIGhhdmUgYW4gaW50cmluc2ljIGhlaWdodCBhbmQgaW50cmluc2ljIHJh
dGlvOwotICAgIC8vICAgIG9yIGlmICd3aWR0aCcgaGFzIGEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1
dG8nLCAnaGVpZ2h0JyBoYXMgc29tZSBvdGhlciBjb21wdXRlZCB2YWx1ZSwgYW5kIHRoZSBlbGVt
ZW50IGRvZXMgaGF2ZSBhbiBpbnRyaW5zaWMgcmF0aW87Ci0gICAgLy8gICAgdGhlbiB0aGUgdXNl
ZCB2YWx1ZSBvZiAnd2lkdGgnIGlzOiAodXNlZCBoZWlnaHQpICogKGludHJpbnNpYyByYXRpbykK
LSAgICAvLwotICAgIC8vIDMuIElmICdoZWlnaHQnIGFuZCAnd2lkdGgnIGJvdGggaGF2ZSBjb21w
dXRlZCB2YWx1ZXMgb2YgJ2F1dG8nIGFuZCB0aGUgZWxlbWVudCBoYXMgYW4gaW50cmluc2ljIHJh
dGlvIGJ1dCBubyBpbnRyaW5zaWMgaGVpZ2h0IG9yIHdpZHRoLAotICAgIC8vICAgIHRoZW4gdGhl
IHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBpcyB1bmRlZmluZWQgaW4gQ1NTIDIuMi4gSG93ZXZlciwg
aXQgaXMgc3VnZ2VzdGVkIHRoYXQsIGlmIHRoZSBjb250YWluaW5nIGJsb2NrJ3Mgd2lkdGggZG9l
cyBub3QgaXRzZWxmIGRlcGVuZCBvbiB0aGUgcmVwbGFjZWQKLSAgICAvLyAgICBlbGVtZW50J3Mg
d2lkdGgsIHRoZW4gdGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBpcyBjYWxjdWxhdGVkIGZyb20g
dGhlIGNvbnN0cmFpbnQgZXF1YXRpb24gdXNlZCBmb3IgYmxvY2stbGV2ZWwsIG5vbi1yZXBsYWNl
ZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdy4KLSAgICAvLwotICAgIC8vIDQuIE90aGVyd2lzZSwg
aWYgJ3dpZHRoJyBoYXMgYSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycsIGFuZCB0aGUgZWxlbWVu
dCBoYXMgYW4gaW50cmluc2ljIHdpZHRoLCB0aGVuIHRoYXQgaW50cmluc2ljIHdpZHRoIGlzIHRo
ZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcuCi0gICAgLy8KLSAgICAvLyA1LiBPdGhlcndpc2UsIGlm
ICd3aWR0aCcgaGFzIGEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8nLCBidXQgbm9uZSBvZiB0aGUg
Y29uZGl0aW9ucyBhYm92ZSBhcmUgbWV0LCB0aGVuIHRoZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcg
YmVjb21lcyAzMDBweC4KLSAgICAvLyAgICBJZiAzMDBweCBpcyB0b28gd2lkZSB0byBmaXQgdGhl
IGRldmljZSwgVUFzIHNob3VsZCB1c2UgdGhlIHdpZHRoIG9mIHRoZSBsYXJnZXN0IHJlY3Rhbmds
ZSB0aGF0IGhhcyBhIDI6MSByYXRpbyBhbmQgZml0cyB0aGUgZGV2aWNlIGluc3RlYWQuCi0KLSAg
ICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6
b250YWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0KLSAgICBh
dXRvIHVzZWRNYXJnaW5TdGFydCA9IFsmXSB7Ci0gICAgICAgIGlmIChvdmVycmlkZGVuSG9yaXpv
bnRhbFZhbHVlcy5tYXJnaW4pCi0gICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGRlbkhvcml6b250
YWxWYWx1ZXMubWFyZ2luLT5zdGFydDsKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVkSG9yaXpvbnRh
bE1hcmdpbi5zdGFydC52YWx1ZU9yKDBfbHUpOwotICAgIH07Ci0KLSAgICBhdXRvIHVzZWRNYXJn
aW5FbmQgPSBbJl0gewotICAgICAgICBpZiAob3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMubWFy
Z2luKQotICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLm1hcmdp
bi0+ZW5kOwotICAgICAgICByZXR1cm4gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1
ZU9yKDBfbHUpOwotICAgIH07Ci0KLSAgICBhdXRvIHdpZHRoID0gb3ZlcnJpZGRlbkhvcml6b250
YWxWYWx1ZXMud2lkdGggPyBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0aCA6IGNvbXB1
dGVkV2lkdGgocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgp
OwotICAgIGF1dG8gaGVpZ2h0SXNBdXRvID0gaXNIZWlnaHRBdXRvKHJlcGxhY2VkQm94KTsKLSAg
ICBhdXRvIGhlaWdodCA9IGNvbXB1dGVkSGVpZ2h0KHJlcGxhY2VkQm94LCB2ZXJ0aWNhbENvbnN0
cmFpbnRzID8gdmVydGljYWxDb25zdHJhaW50cy0+bG9naWNhbEhlaWdodCA6IFdURjo6bnVsbG9w
dCk7Ci0KLSAgICBpZiAoIXdpZHRoICYmIGhlaWdodElzQXV0byAmJiByZXBsYWNlZEJveC5oYXNJ
bnRyaW5zaWNXaWR0aCgpKSB7Ci0gICAgICAgIC8vICMxCi0gICAgICAgIHdpZHRoID0gcmVwbGFj
ZWRCb3guaW50cmluc2ljV2lkdGgoKTsKLSAgICB9IGVsc2UgaWYgKCghd2lkdGggJiYgaGVpZ2h0
SXNBdXRvICYmICFyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNXaWR0aCgpICYmIHJlcGxhY2VkQm94
Lmhhc0ludHJpbnNpY0hlaWdodCgpICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1JhdGlvKCkp
Ci0gICAgICAgIHx8ICghd2lkdGggJiYgaGVpZ2h0ICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNp
Y1JhdGlvKCkpKSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIHdpZHRoID0gaGVpZ2h0LnZhbHVl
T3IocmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkpICogcmVwbGFjZWRCb3guaW50cmlu
c2ljUmF0aW8oKTsKLSAgICB9IGVsc2UgaWYgKCF3aWR0aCAmJiBoZWlnaHRJc0F1dG8gJiYgcmVw
bGFjZWRCb3guaGFzSW50cmluc2ljUmF0aW8oKSAmJiAhcmVwbGFjZWRCb3guaGFzSW50cmluc2lj
V2lkdGgoKSAmJiAhcmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkpIHsKLSAgICAgICAg
Ly8gIzMKLSAgICAgICAgLy8gRklYTUU6IHVuZGVmaW5lZCBidXQgc3VyZWx5IGRvYWJsZS4KLSAg
ICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKLSAgICB9IGVsc2UgaWYgKCF3aWR0
aCAmJiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNXaWR0aCgpKSB7Ci0gICAgICAgIC8vICM0Ci0g
ICAgICAgIHdpZHRoID0gcmVwbGFjZWRCb3guaW50cmluc2ljV2lkdGgoKTsKLSAgICB9IGVsc2Ug
aWYgKCF3aWR0aCkgewotICAgICAgICAvLyAjNQotICAgICAgICB3aWR0aCA9IHsgMzAwIH07Ci0g
ICAgfQotCi0gICAgQVNTRVJUKHdpZHRoKTsKLQotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0
aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbV2lkdGhdW01hcmdpbl0gLT4gaW5mbG93IHJl
cGxhY2VkIC0+IHdpZHRoKCIgPDwgKndpZHRoIDw8ICJweCkgbWFyZ2luKCIgPDwgdXNlZE1hcmdp
blN0YXJ0KCkgPDwgInB4LCAiIDw8IHVzZWRNYXJnaW5FbmQoKSA8PCAicHgpIC0+IGxheW91dEJv
eCgiIDw8ICZyZXBsYWNlZEJveCA8PCAiKSIpOwotICAgIHJldHVybiB7ICp3aWR0aCwgeyB1c2Vk
TWFyZ2luU3RhcnQoKSwgdXNlZE1hcmdpbkVuZCgpIH0gfTsKLX0KLQotTGF5b3V0U2l6ZSBGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd1Bvc2l0aW9uZWRQb3NpdGlvbk9mZnNldChj
b25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9u
dGFsQ29uc3RyYWludHMpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvd1Bv
c2l0aW9uZWQoKSk7Ci0KLSAgICAvLyA5LjQuMyBSZWxhdGl2ZSBwb3NpdGlvbmluZwotICAgIC8v
Ci0gICAgLy8gVGhlICd0b3AnIGFuZCAnYm90dG9tJyBwcm9wZXJ0aWVzIG1vdmUgcmVsYXRpdmVs
eSBwb3NpdGlvbmVkIGVsZW1lbnQocykgdXAgb3IgZG93biB3aXRob3V0IGNoYW5naW5nIHRoZWly
IHNpemUuCi0gICAgLy8gVG9wJyBtb3ZlcyB0aGUgYm94ZXMgZG93biwgYW5kICdib3R0b20nIG1v
dmVzIHRoZW0gdXAuIFNpbmNlIGJveGVzIGFyZSBub3Qgc3BsaXQgb3Igc3RyZXRjaGVkIGFzIGEg
cmVzdWx0IG9mICd0b3AnIG9yICdib3R0b20nLCB0aGUgdXNlZCB2YWx1ZXMgYXJlIGFsd2F5czog
dG9wID0gLWJvdHRvbS4KLSAgICAvLwotICAgIC8vIDEuIElmIGJvdGggYXJlICdhdXRvJywgdGhl
aXIgdXNlZCB2YWx1ZXMgYXJlIGJvdGggJzAnLgotICAgIC8vIDIuIElmIG9uZSBvZiB0aGVtIGlz
ICdhdXRvJywgaXQgYmVjb21lcyB0aGUgbmVnYXRpdmUgb2YgdGhlIG90aGVyLgotICAgIC8vIDMu
IElmIG5laXRoZXIgaXMgJ2F1dG8nLCAnYm90dG9tJyBpcyBpZ25vcmVkIChpLmUuLCB0aGUgdXNl
ZCB2YWx1ZSBvZiAnYm90dG9tJyB3aWxsIGJlIG1pbnVzIHRoZSB2YWx1ZSBvZiAndG9wJykuCi0K
LSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIGF1dG8gY29udGFpbmlu
Z0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoOwotCi0gICAg
YXV0byB0b3AgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxUb3AoKSwgY29udGFpbmluZ0Js
b2NrV2lkdGgpOwotICAgIGF1dG8gYm90dG9tID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2Fs
Qm90dG9tKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKLQotICAgIGlmICghdG9wICYmICFib3R0
b20pIHsKLSAgICAgICAgLy8gIzEKLSAgICAgICAgdG9wID0gYm90dG9tID0geyAwIH07Ci0gICAg
fSBlbHNlIGlmICghdG9wKSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIHRvcCA9IC0qYm90dG9t
OwotICAgIH0gZWxzZSBpZiAoIWJvdHRvbSkgewotICAgICAgICAvLyAjMwotICAgICAgICBib3R0
b20gPSAtKnRvcDsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyAjNAotICAgICAgICBib3R0b20g
PSBXVEY6Om51bGxvcHQ7Ci0gICAgfQotCi0gICAgLy8gRm9yIHJlbGF0aXZlbHkgcG9zaXRpb25l
ZCBlbGVtZW50cywgJ2xlZnQnIGFuZCAncmlnaHQnIG1vdmUgdGhlIGJveChlcykgaG9yaXpvbnRh
bGx5LCB3aXRob3V0IGNoYW5naW5nIHRoZWlyIHNpemUuCi0gICAgLy8gJ0xlZnQnIG1vdmVzIHRo
ZSBib3hlcyB0byB0aGUgcmlnaHQsIGFuZCAncmlnaHQnIG1vdmVzIHRoZW0gdG8gdGhlIGxlZnQu
Ci0gICAgLy8gU2luY2UgYm94ZXMgYXJlIG5vdCBzcGxpdCBvciBzdHJldGNoZWQgYXMgYSByZXN1
bHQgb2YgJ2xlZnQnIG9yICdyaWdodCcsIHRoZSB1c2VkIHZhbHVlcyBhcmUgYWx3YXlzOiBsZWZ0
ID0gLXJpZ2h0LgotICAgIC8vCi0gICAgLy8gMS4gSWYgYm90aCAnbGVmdCcgYW5kICdyaWdodCcg
YXJlICdhdXRvJyAodGhlaXIgaW5pdGlhbCB2YWx1ZXMpLCB0aGUgdXNlZCB2YWx1ZXMgYXJlICcw
JyAoaS5lLiwgdGhlIGJveGVzIHN0YXkgaW4gdGhlaXIgb3JpZ2luYWwgcG9zaXRpb24pLgotICAg
IC8vIDIuIElmICdsZWZ0JyBpcyAnYXV0bycsIGl0cyB1c2VkIHZhbHVlIGlzIG1pbnVzIHRoZSB2
YWx1ZSBvZiAncmlnaHQnIChpLmUuLCB0aGUgYm94ZXMgbW92ZSB0byB0aGUgbGVmdCBieSB0aGUg
dmFsdWUgb2YgJ3JpZ2h0JykuCi0gICAgLy8gMy4gSWYgJ3JpZ2h0JyBpcyBzcGVjaWZpZWQgYXMg
J2F1dG8nLCBpdHMgdXNlZCB2YWx1ZSBpcyBtaW51cyB0aGUgdmFsdWUgb2YgJ2xlZnQnLgotICAg
IC8vIDQuIElmIG5laXRoZXIgJ2xlZnQnIG5vciAncmlnaHQnIGlzICdhdXRvJywgdGhlIHBvc2l0
aW9uIGlzIG92ZXItY29uc3RyYWluZWQsIGFuZCBvbmUgb2YgdGhlbSBoYXMgdG8gYmUgaWdub3Jl
ZC4KLSAgICAvLyAgICBJZiB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGNvbnRhaW5p
bmcgYmxvY2sgaXMgJ2x0cicsIHRoZSB2YWx1ZSBvZiAnbGVmdCcgd2lucyBhbmQgJ3JpZ2h0JyBi
ZWNvbWVzIC0nbGVmdCcuCi0gICAgLy8gICAgSWYgJ2RpcmVjdGlvbicgb2YgdGhlIGNvbnRhaW5p
bmcgYmxvY2sgaXMgJ3J0bCcsICdyaWdodCcgd2lucyBhbmQgJ2xlZnQnIGlzIGlnbm9yZWQuCi0K
LSAgICBhdXRvIGxlZnQgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxMZWZ0KCksIGNvbnRh
aW5pbmdCbG9ja1dpZHRoKTsKLSAgICBhdXRvIHJpZ2h0ID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5s
b2dpY2FsUmlnaHQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotCi0gICAgaWYgKCFsZWZ0ICYm
ICFyaWdodCkgewotICAgICAgICAvLyAjMQotICAgICAgICBsZWZ0ID0gcmlnaHQgPSB7IDAgfTsK
LSAgICB9IGVsc2UgaWYgKCFsZWZ0KSB7Ci0gICAgICAgIC8vICMyCi0gICAgICAgIGxlZnQgPSAt
KnJpZ2h0OwotICAgIH0gZWxzZSBpZiAoIXJpZ2h0KSB7Ci0gICAgICAgIC8vICMzCi0gICAgICAg
IHJpZ2h0ID0gLSpsZWZ0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vICM0Ci0gICAgICAgIGF1
dG8gaXNMZWZ0VG9SaWdodERpcmVjdGlvbiA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5z
dHlsZSgpLmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKTsKLSAgICAgICAgaWYgKGlzTGVmdFRvUmln
aHREaXJlY3Rpb24pCi0gICAgICAgICAgICByaWdodCA9IC0qbGVmdDsKLSAgICAgICAgZWxzZQot
ICAgICAgICAgICAgbGVmdCA9IFdURjo6bnVsbG9wdDsKLSAgICB9Ci0KLSAgICBBU1NFUlQoIWJv
dHRvbSB8fCAqdG9wID09IC0qYm90dG9tKTsKLSAgICBBU1NFUlQoIWxlZnQgfHwgKmxlZnQgPT0g
LSpyaWdodCk7Ci0KLSAgICBhdXRvIHRvcFBvc2l0aW9uT2Zmc2V0ID0gKnRvcDsKLSAgICBhdXRv
IGxlZnRQb3NpdGlvbk9mZnNldCA9IGxlZnQudmFsdWVPcigtKnJpZ2h0KTsKLQotICAgIExPR19X
SVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbUG9zaXRpb25d
IC0+IHBvc2l0aW9uZWQgaW5mbG93IC0+IHRvcCBvZmZzZXQoIiA8PCB0b3BQb3NpdGlvbk9mZnNl
dCA8PCAicHgpIGxlZnQgb2Zmc2V0KCIgPDwgbGVmdFBvc2l0aW9uT2Zmc2V0IDw8ICJweCkgbGF5
b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIpOwotICAgIHJldHVybiB7IGxlZnRQb3NpdGlv
bk9mZnNldCwgdG9wUG9zaXRpb25PZmZzZXQgfTsKLX0KLQotaW5saW5lIHN0YXRpYyBXcml0aW5n
TW9kZSB1c2VkV3JpdGluZ01vZGUoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAgLy8gaHR0
cHM6Ly93d3cudzMub3JnL1RSL2Nzcy13cml0aW5nLW1vZGVzLTQvI2xvZ2ljYWwtZGlyZWN0aW9u
LWxheW91dAotICAgIC8vIEZsb3ctcmVsYXRpdmUgZGlyZWN0aW9ucyBhcmUgY2FsY3VsYXRlZCB3
aXRoIHJlc3BlY3QgdG8gdGhlIHdyaXRpbmcgbW9kZSBvZiB0aGUgY29udGFpbmluZyBibG9jayBv
ZiB0aGUgYm94LgotICAgIC8vIEZvciBpbmxpbmUtbGV2ZWwgYm94ZXMsIHRoZSB3cml0aW5nIG1v
ZGUgb2YgdGhlIHBhcmVudCBib3ggaXMgdXNlZCBpbnN0ZWFkLgotICAgIHJldHVybiBsYXlvdXRC
b3guaXNJbmxpbmVMZXZlbEJveCgpID8gbGF5b3V0Qm94LnBhcmVudCgpLnN0eWxlKCkud3JpdGlu
Z01vZGUoKSA6IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5zdHlsZSgpLndyaXRpbmdNb2Rl
KCk7Ci19Ci0KLUVkZ2VzIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRCb3Jk
ZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgYXV0byYgc3R5bGUgPSBsYXlv
dXRCb3guc3R5bGUoKTsKLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlv
dXQsIHN0cmVhbSA8PCAiW0JvcmRlcl0gLT4gbGF5b3V0Qm94OiAiIDw8ICZsYXlvdXRCb3gpOwot
ICAgIHJldHVybiB7Ci0gICAgICAgIHsgTGF5b3V0VW5pdChzdHlsZS5ib3JkZXJMZWZ0V2lkdGgo
KSksIExheW91dFVuaXQoc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCgpKSB9LAotICAgICAgICB7IExh
eW91dFVuaXQoc3R5bGUuYm9yZGVyVG9wV2lkdGgoKSksIExheW91dFVuaXQoc3R5bGUuYm9yZGVy
Qm90dG9tV2lkdGgoKSkgfQotICAgIH07Ci19Ci0KLU9wdGlvbmFsPEVkZ2VzPiBGb3JtYXR0aW5n
Q29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkUGFkZGluZyhjb25zdCBCb3gmIGxheW91dEJveCwg
Y29uc3QgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCkgY29uc3QKLXsKLSAgICBpZiAo
IWxheW91dEJveC5pc1BhZGRpbmdBcHBsaWNhYmxlKCkpCi0gICAgICAgIHJldHVybiBXVEY6Om51
bGxvcHQ7Ci0KLSAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIExPR19X
SVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbUGFkZGluZ10g
LT4gbGF5b3V0Qm94OiAiIDw8ICZsYXlvdXRCb3gpOwotICAgIHJldHVybiBFZGdlcyB7Ci0gICAg
ICAgIHsgdmFsdWVGb3JMZW5ndGgoc3R5bGUucGFkZGluZ0xlZnQoKSwgY29udGFpbmluZ0Jsb2Nr
V2lkdGgpLCB2YWx1ZUZvckxlbmd0aChzdHlsZS5wYWRkaW5nUmlnaHQoKSwgY29udGFpbmluZ0Js
b2NrV2lkdGgpIH0sCi0gICAgICAgIHsgdmFsdWVGb3JMZW5ndGgoc3R5bGUucGFkZGluZ1RvcCgp
LCBjb250YWluaW5nQmxvY2tXaWR0aCksIHZhbHVlRm9yTGVuZ3RoKHN0eWxlLnBhZGRpbmdCb3R0
b20oKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpIH0KLSAgICB9OwotfQotCi1Db21wdXRlZEhvcml6
b250YWxNYXJnaW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZEhvcml6b250
YWxNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSBjb25zdAotewotICAgIGF1dG8mIHN0eWxlID0gbGF5
b3V0Qm94LnN0eWxlKCk7Ci0gICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250
YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7Ci0gICAgaWYgKGlzSG9yaXpvbnRhbFdyaXRpbmdN
b2RlKHVzZWRXcml0aW5nTW9kZShsYXlvdXRCb3gpKSkKLSAgICAgICAgcmV0dXJuIHsgY29tcHV0
ZWRWYWx1ZShzdHlsZS5tYXJnaW5MZWZ0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgY29tcHV0
ZWRWYWx1ZShzdHlsZS5tYXJnaW5SaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCkgfTsKLSAg
ICByZXR1cm4geyBjb21wdXRlZFZhbHVlKHN0eWxlLm1hcmdpblRvcCgpLCBjb250YWluaW5nQmxv
Y2tXaWR0aCksIGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luQm90dG9tKCksIGNvbnRhaW5pbmdC
bG9ja1dpZHRoKSB9OwotfQotCi1Db21wdXRlZFZlcnRpY2FsTWFyZ2luIEZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJv
eCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIGNv
bnN0Ci17Ci0gICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICBhdXRvIGNv
bnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsK
LSAgICBpZiAoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUodXNlZFdyaXRpbmdNb2RlKGxheW91dEJv
eCkpKQotICAgICAgICByZXR1cm4geyBjb21wdXRlZFZhbHVlKHN0eWxlLm1hcmdpblRvcCgpLCBj
b250YWluaW5nQmxvY2tXaWR0aCksIGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luQm90dG9tKCks
IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSB9OwotICAgIHJldHVybiB7IGNvbXB1dGVkVmFsdWUoc3R5
bGUubWFyZ2luTGVmdCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCksIGNvbXB1dGVkVmFsdWUoc3R5
bGUubWFyZ2luUmlnaHQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpIH07Ci19Ci0KLUZvcm1hdHRp
bmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIEZvcm1hdHRpbmdDb250ZXh0OjpH
ZW9tZXRyeTo6Y29uc3RyYWluQnlNaW5NYXhXaWR0aChjb25zdCBCb3gmIGxheW91dEJveCwgSW50
cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNXaWR0aCkgY29uc3QKLXsKLSAgICBhdXRv
JiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOwotICAgIGF1dG8gbWluV2lkdGggPSBmaXhlZFZh
bHVlKHN0eWxlLmxvZ2ljYWxNaW5XaWR0aCgpKTsKLSAgICBhdXRvIG1heFdpZHRoID0gZml4ZWRW
YWx1ZShzdHlsZS5sb2dpY2FsTWF4V2lkdGgoKSk7Ci0gICAgaWYgKCFtaW5XaWR0aCAmJiAhbWF4
V2lkdGgpCi0gICAgICAgIHJldHVybiBpbnRyaW5zaWNXaWR0aDsKLQotICAgIGlmIChtYXhXaWR0
aCkgewotICAgICAgICBpbnRyaW5zaWNXaWR0aC5taW5pbXVtID0gc3RkOjptaW4oKm1heFdpZHRo
LCBpbnRyaW5zaWNXaWR0aC5taW5pbXVtKTsKLSAgICAgICAgaW50cmluc2ljV2lkdGgubWF4aW11
bSA9IHN0ZDo6bWluKCptYXhXaWR0aCwgaW50cmluc2ljV2lkdGgubWF4aW11bSk7Ci0gICAgfQot
Ci0gICAgaWYgKG1pbldpZHRoKSB7Ci0gICAgICAgIGludHJpbnNpY1dpZHRoLm1pbmltdW0gPSBz
dGQ6Om1heCgqbWluV2lkdGgsIGludHJpbnNpY1dpZHRoLm1pbmltdW0pOwotICAgICAgICBpbnRy
aW5zaWNXaWR0aC5tYXhpbXVtID0gc3RkOjptYXgoKm1pbldpZHRoLCBpbnRyaW5zaWNXaWR0aC5t
YXhpbXVtKTsKLSAgICB9Ci0KLSAgICBBU1NFUlQoaW50cmluc2ljV2lkdGgubWluaW11bSA8PSBp
bnRyaW5zaWNXaWR0aC5tYXhpbXVtKTsKLSAgICByZXR1cm4gaW50cmluc2ljV2lkdGg7Ci19Ci0K
LUZvcm1hdHRpbmdDb250ZXh0OjpDb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQgRm9ybWF0
dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29u
c3QgQ29udGFpbmVyQm94JiBjb250YWluZXJCb3gpCi17Ci0gICAgYXV0byYgYm94R2VvbWV0cnkg
PSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGNvbnRhaW5lckJveCk7Ci0gICAg
cmV0dXJuIHsKLSAgICAgICAgeyBib3hHZW9tZXRyeS5wYWRkaW5nQm94TGVmdCgpLCBib3hHZW9t
ZXRyeS5wYWRkaW5nQm94V2lkdGgoKSB9LAotICAgICAgICB7IGJveEdlb21ldHJ5LnBhZGRpbmdC
b3hUb3AoKSwgYm94R2VvbWV0cnkucGFkZGluZ0JveEhlaWdodCgpIH0sCi0gICAgICAgIGJveEdl
b21ldHJ5LmNvbnRlbnRCb3hXaWR0aCgpIH07Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpDb25z
dHJhaW50c0ZvckluRmxvd0NvbnRlbnQgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb25z
dHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29uc3QgQ29udGFpbmVyQm94JiBjb250YWluZXJCb3gs
IE9wdGlvbmFsPEVzY2FwZVJlYXNvbj4gZXNjYXBlUmVhc29uKQotewotICAgIGF1dG8mIGJveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChjb250YWluZXJCb3gs
IGVzY2FwZVJlYXNvbik7Ci0gICAgcmV0dXJuIHsgeyBib3hHZW9tZXRyeS5jb250ZW50Qm94TGVm
dCgpLCBib3hHZW9tZXRyeS5jb250ZW50Qm94V2lkdGgoKSB9LCB7IGJveEdlb21ldHJ5LmNvbnRl
bnRCb3hUb3AoKSwgY29tcHV0ZWRIZWlnaHQoY29udGFpbmVyQm94KSB9IH07Ci19Ci0KLX0KLX0K
LSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdDb250
ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dFF1
aXJrcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTFiMGRjNjMwY2EyMzk3
YmFiMzg0Zjk4MDgzMDMxOTFmMmJkMGEuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdDb250ZXh0UXVp
cmtzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5j
bHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVO
QUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiTGF5b3V0Qm94Lmgi
Ci0jaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRJbml0aWFs
Q29udGFpbmluZ0Jsb2NrLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlv
dXQgewotCi1MYXlvdXRVbml0IEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OmhlaWdodFZhbHVl
T2ZOZWFyZXN0Q29udGFpbmluZ0Jsb2NrV2l0aEZpeGVkSGVpZ2h0KGNvbnN0IEJveCYgbGF5b3V0
Qm94KQotewotICAgIC8vIEluIHF1aXJrcyBtb2RlLCB3ZSBnbyBhbmQgdHJhdmVycyB0aGUgY29u
dGFpbmluZyBibG9jayBjaGFpbiB0byBmaW5kIGEgYmxvY2sgbGV2ZWwgYm94IHdpdGggZml4ZWQg
aGVpZ2h0IHZhbHVlLCBldmVuIGlmIGl0IG1lYW5zIGxlYXZpbmcKLSAgICAvLyB0aGUgY3VycmVu
dCBmb3JtYXR0aW5nIGNvbnRleHQuIEZJWE1FOiBzdXJlbHkgd2UgbmVlZCB0byBkbyBzb21lIHRy
aWNrcyBoZXJlIHdoZW4gYmxvY2sgZGlyZWN0aW9uIHN1cHBvcnQgaXMgYWRkZWQuCi0gICAgYXV0
byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgpOwotICAgIGF1
dG8qIGNvbnRhaW5pbmdCbG9jayA9ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAg
TGF5b3V0VW5pdCBib2R5QW5kRG9jdW1lbnRWZXJ0aWNhbE1hcmdpblBhZGRpbmdBbmRCb3JkZXI7
Ci0gICAgd2hpbGUgKGNvbnRhaW5pbmdCbG9jaykgewotICAgICAgICBhdXRvIGNvbnRhaW5pbmdC
bG9ja0hlaWdodCA9IGNvbnRhaW5pbmdCbG9jay0+c3R5bGUoKS5sb2dpY2FsSGVpZ2h0KCk7Ci0g
ICAgICAgIGlmIChjb250YWluaW5nQmxvY2tIZWlnaHQuaXNGaXhlZCgpKQotICAgICAgICAgICAg
cmV0dXJuIExheW91dFVuaXQoY29udGFpbmluZ0Jsb2NrSGVpZ2h0LnZhbHVlKCkgLSBib2R5QW5k
RG9jdW1lbnRWZXJ0aWNhbE1hcmdpblBhZGRpbmdBbmRCb3JkZXIpOwotCi0gICAgICAgIC8vIElm
IHRoZSBvbmx5IGZpeGVkIHZhbHVlIGJveCB3ZSBmaW5kIGlzIHRoZSBJQ0IsIHRoZW4gaWdub3Jl
IHRoZSBib2R5IGFuZCB0aGUgZG9jdW1lbnQgKHZlcnRpY2FsKSBtYXJnaW4sIHBhZGRpbmcgYW5k
IGJvcmRlci4gU28gbXVjaCBxdWlya2luZXNzLgotICAgICAgICAvLyAtYW5kIGl0J3MgdG90YWxs
eSBpbnNhbmUgYmVjYXVzZSBub3cgd2UgZnJlZWx5IHRyYXZlbCBhY3Jvc3MgZm9ybWF0dGluZyBj
b250ZXh0IGJvdW5kYXJpZXMgYW5kIGNvbXB1dGVkIG1hcmdpbnMgYXJlIG5vbmV4aXN0ZW50Lgot
ICAgICAgICBpZiAoY29udGFpbmluZ0Jsb2NrLT5pc0JvZHlCb3goKSB8fCBjb250YWluaW5nQmxv
Y2stPmlzRG9jdW1lbnRCb3goKSkgewotCi0gICAgICAgICAgICBhdXRvIGdlb21ldHJ5ID0gZm9y
bWF0dGluZ0NvbnRleHQuZ2VvbWV0cnkoKTsKLSAgICAgICAgICAgIGF1dG8gaG9yaXpvbnRhbENv
bnN0cmFpbnRzID0gZ2VvbWV0cnkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KGNvbnRhaW5p
bmdCbG9jay0+Y29udGFpbmluZ0Jsb2NrKCksIEZvcm1hdHRpbmdDb250ZXh0OjpFc2NhcGVSZWFz
b246OkZpbmRGaXhlZEhlaWdodEFuY2VzdG9yUXVpcmspLmhvcml6b250YWw7Ci0gICAgICAgICAg
ICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gZ2VvbWV0cnkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbigq
Y29udGFpbmluZ0Jsb2NrLCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotCi0gICAgICAgICAgICBh
dXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KCpjb250
YWluaW5nQmxvY2ssIEZvcm1hdHRpbmdDb250ZXh0OjpFc2NhcGVSZWFzb246OkZpbmRGaXhlZEhl
aWdodEFuY2VzdG9yUXVpcmspOwotICAgICAgICAgICAgYXV0byB2ZXJ0aWNhbFBhZGRpbmcgPSBi
b3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKSArIGJveEdlb21ldHJ5LnBhZGRpbmdC
b3R0b20oKS52YWx1ZU9yKDApOwotICAgICAgICAgICAgYXV0byB2ZXJ0aWNhbEJvcmRlciA9IGJv
eEdlb21ldHJ5LmJvcmRlclRvcCgpICsgYm94R2VvbWV0cnkuYm9yZGVyQm90dG9tKCk7Ci0gICAg
ICAgICAgICBib2R5QW5kRG9jdW1lbnRWZXJ0aWNhbE1hcmdpblBhZGRpbmdBbmRCb3JkZXIgKz0g
dmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCkgKyB2ZXJ0aWNhbE1hcmdpbi5hZnRlci52
YWx1ZU9yKDApICsgdmVydGljYWxQYWRkaW5nICsgdmVydGljYWxCb3JkZXI7Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAoaXM8SW5pdGlhbENvbnRhaW5pbmdCbG9jaz4oKmNvbnRhaW5pbmdCbG9j
aykpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY29udGFpbmluZ0Jsb2NrID0gJmNvbnRh
aW5pbmdCbG9jay0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgfQotICAgIC8vIEluaXRpYWwgY29u
dGFpbmluZyBibG9jayBoYXMgdG8gaGF2ZSBhIGhlaWdodC4KLSAgICByZXR1cm4gZm9ybWF0dGlu
Z0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LmluaXRpYWxDb250YWluaW5nQmxvY2so
KSwgRm9ybWF0dGluZ0NvbnRleHQ6OkVzY2FwZVJlYXNvbjo6RmluZEZpeGVkSGVpZ2h0QW5jZXN0
b3JRdWlyaykuY29udGVudEJveCgpLmhlaWdodCgpIC0gYm9keUFuZERvY3VtZW50VmVydGljYWxN
YXJnaW5QYWRkaW5nQW5kQm9yZGVyOwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250
ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNTU1Zjgx
OTM4MWU3M2FmM2UxOWMwMmYzOGIwZmNmM2JkMTIwNGIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0
dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2MyAr
MCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgot
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQotCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJGbG9h
dGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJGbG9hdGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiSW52
YWxpZGF0aW9uU3RhdGUuaCIKLSNpbmNsdWRlICJMYXlvdXRCb3guaCIKLSNpbmNsdWRlICJMYXlv
dXRDaGlsZEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCi0jaW5j
bHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5n
QmxvY2suaCIKLSNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgotI2luY2x1ZGUgIkxvZ2dpbmcuaCIK
LSNpbmNsdWRlICJUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVk
ZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9UZXh0U3RyZWFt
Lmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1XVEZfTUFL
RV9JU09fQUxMT0NBVEVEX0lNUEwoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCk7Ci0KLUJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6OkJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94
JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5n
U3RhdGUpCi0gICAgOiBGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZv
cm1hdHRpbmdTdGF0ZSkKLXsKLX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpsYXlv
dXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiBpbnZhbGlkYXRpb25TdGF0ZSwgY29u
c3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICAvLyA5
LjQuMSBCbG9jayBmb3JtYXR0aW5nIGNvbnRleHRzCi0gICAgLy8gSW4gYSBibG9jayBmb3JtYXR0
aW5nIGNvbnRleHQsIGJveGVzIGFyZSBsYWlkIG91dCBvbmUgYWZ0ZXIgdGhlIG90aGVyLCB2ZXJ0
aWNhbGx5LCBiZWdpbm5pbmcgYXQgdGhlIHRvcCBvZiBhIGNvbnRhaW5pbmcgYmxvY2suCi0gICAg
Ly8gVGhlIHZlcnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNpYmxpbmcgYm94ZXMgaXMgZGV0
ZXJtaW5lZCBieSB0aGUgJ21hcmdpbicgcHJvcGVydGllcy4KLSAgICAvLyBWZXJ0aWNhbCBtYXJn
aW5zIGJldHdlZW4gYWRqYWNlbnQgYmxvY2stbGV2ZWwgYm94ZXMgaW4gYSBibG9jayBmb3JtYXR0
aW5nIGNvbnRleHQgY29sbGFwc2UuCi0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250
ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltTdGFydF0gLT4gYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0
IC0+IGZvcm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKLSAgICBhdXRvJiBmb3Jt
YXR0aW5nUm9vdCA9IHJvb3QoKTsKLSAgICBBU1NFUlQoZm9ybWF0dGluZ1Jvb3QuaGFzSW5GbG93
T3JGbG9hdGluZ0NoaWxkKCkpOwotICAgIGF1dG8mIGZsb2F0aW5nU3RhdGUgPSBmb3JtYXR0aW5n
U3RhdGUoKS5mbG9hdGluZ1N0YXRlKCk7Ci0gICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9h
dGluZ0NvbnRleHQgeyAqdGhpcywgZmxvYXRpbmdTdGF0ZSB9OwotCi0gICAgTGF5b3V0UXVldWUg
bGF5b3V0UXVldWU7Ci0gICAgZW51bSBjbGFzcyBMYXlvdXREaXJlY3Rpb24geyBDaGlsZCwgU2li
bGluZyB9OwotICAgIGF1dG8gYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUgPSBbJl0gKGNvbnN0IGF1
dG8mIGxheW91dEJveCwgYXV0byBkaXJlY3Rpb24pIHsKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9
PSBMYXlvdXREaXJlY3Rpb246OkNoaWxkKSB7Ci0gICAgICAgICAgICBpZiAoIWlzPENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
ICAgICBmb3IgKGF1dG8qIGNoaWxkID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gp
LmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0
SW5GbG93T3JGbG9hdGluZ1NpYmxpbmcoKSkgewotICAgICAgICAgICAgICAgIGlmICghaW52YWxp
ZGF0aW9uU3RhdGUubmVlZHNMYXlvdXQoKmNoaWxkKSkKLSAgICAgICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICAgICAgbGF5b3V0UXVldWUuYXBwZW5kKGNoaWxkKTsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gTGF5b3V0RGly
ZWN0aW9uOjpTaWJsaW5nKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8qIG5leHRTaWJsaW5nID0g
bGF5b3V0Qm94Lm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpOyBuZXh0U2libGluZzsgbmV4
dFNpYmxpbmcgPSBuZXh0U2libGluZy0+bmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkpIHsK
LSAgICAgICAgICAgICAgICBpZiAoIWludmFsaWRhdGlvblN0YXRlLm5lZWRzTGF5b3V0KCpuZXh0
U2libGluZykpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAg
IGxheW91dFF1ZXVlLmFwcGVuZChuZXh0U2libGluZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
IH0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICB9OwotCi0gICAgYXV0byBjb25zdHJhaW50c0ZvckxheW91dEJveCA9IFsmXSAoY29uc3Qg
YXV0byYgbGF5b3V0Qm94KSB7Ci0gICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxheW91
dEJveC5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgcmV0dXJuICZjb250YWluaW5nQmxvY2sg
PT0gJmZvcm1hdHRpbmdSb290ID8gY29uc3RyYWludHMgOiBnZW9tZXRyeSgpLmNvbnN0cmFpbnRz
Rm9ySW5GbG93Q29udGVudChjb250YWluaW5nQmxvY2spOwotICAgIH07Ci0KLSAgICAvLyBUaGlz
IGlzIGEgcG9zdC1vcmRlciB0cmVlIHRyYXZlcnNhbCBsYXlvdXQuCi0gICAgLy8gVGhlIHJvb3Qg
Y29udGFpbmVyIGxheW91dCBpcyBkb25lIGluIHRoZSBmb3JtYXR0aW5nIGNvbnRleHQgaXQgbGl2
ZXMgaW4sIG5vdCB0aGF0IG9uZSBpdCBjcmVhdGVzLCBzbyBsZXQncyBzdGFydCB3aXRoIHRoZSBm
aXJzdCBjaGlsZC4KLSAgICBhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShmb3JtYXR0aW5nUm9vdCwg
TGF5b3V0RGlyZWN0aW9uOjpDaGlsZCk7Ci0gICAgLy8gMS4gR28gYWxsIHRoZSB3YXkgZG93biB0
byB0aGUgbGVhZiBub2RlCi0gICAgLy8gMi4gQ29tcHV0ZSBzdGF0aWMgcG9zaXRpb24gYW5kIHdp
ZHRoIGFzIHdlIHRyYXZlcnNlIGRvd24KLSAgICAvLyAzLiBBcyB3ZSBjbGltYiBiYWNrIG9uIHRo
ZSB0cmVlLCBjb21wdXRlIGhlaWdodCBhbmQgZmluaWFsaXplIHBvc2l0aW9uCi0gICAgLy8gKEFu
eSBzdWJ0cmVlcyB3aXRoIG5ldyBmb3JtYXR0aW5nIGNvbnRleHRzIG5lZWQgdG8gbGF5b3V0IHN5
bmNocm9ub3VzbHkpCi0gICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgLy8gVHJhdmVyc2UgZG93biBvbiB0aGUgZGVzY2VuZGFudHMgYW5kIGNvbXB1dGUgd2lkdGgv
c3RhdGljIHBvc2l0aW9uIHVudGlsIHdlIGZpbmQgYSBsZWFmIG5vZGUuCi0gICAgICAgIHdoaWxl
ICh0cnVlKSB7Ci0gICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSAqbGF5b3V0UXVldWUubGFz
dCgpOwotICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyA9IGNvbnN0
cmFpbnRzRm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0KLSAgICAgICAgICAgIGNvbXB1dGVCb3Jk
ZXJBbmRQYWRkaW5nKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9yaXpv
bnRhbCk7Ci0gICAgICAgICAgICBjb21wdXRlU3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRC
b3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLnZlcnRpY2FsKTsKLSAgICAgICAgICAgIGNv
bXB1dGVXaWR0aEFuZE1hcmdpbihmbG9hdGluZ0NvbnRleHQsIGxheW91dEJveCwgeyBjb25zdHJh
aW50cywgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMgfSk7Ci0gICAgICAgICAgICBjb21wdXRl
U3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3Ry
YWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICBjb21wdXRlUG9zaXRpb25Ub0F2b2lkRmxv
YXRzKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCB7IGNvbnN0cmFpbnRzLCBjb250YWluaW5n
QmxvY2tDb25zdHJhaW50cyB9KTsKLQotICAgICAgICAgICAgaWYgKGxheW91dEJveC5lc3RhYmxp
c2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXM8Q29udGFp
bmVyQm94PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5o
YXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkgewotICAgICAgICAgICAgICAgICAgICBhdXRvJiBj
b250YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7Ci0gICAgICAg
ICAgICAgICAgICAgIGlmIChjb250YWluZXJCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJRkNzIGluaGVyaXQgZmxv
YXRzIGZyb20gcGFyZW50IEZDcy4gV2UgbmVlZCBmaW5hbCB2ZXJ0aWNhbCBwb3NpdGlvbiB0byBm
aW5kIGludHJ1ZGluZyBmbG9hdHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb21wdXRl
VmVydGljYWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhjb250YWluZXJCb3gsIHsgY29uc3Ry
YWludHMsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzIH0pOwotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIExheW91dCB0aGUgaW5mbG93IGRlc2NlbmRhbnRz
IG9mIHRoaXMgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QuCi0gICAgICAgICAgICAgICAgICAgIGF1
dG8gZm9ybWF0dGluZ0NvbnRleHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29u
dGV4dChjb250YWluZXJCb3gsIGxheW91dFN0YXRlKCkpOwotICAgICAgICAgICAgICAgICAgICBp
ZiAoY29udGFpbmVyQm94LmlzVGFibGVXcmFwcGVyQm94KCkpCi0gICAgICAgICAgICAgICAgICAg
ICAgICBkb3duY2FzdDxUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0PigqZm9ybWF0
dGluZ0NvbnRleHQpLnNldEhvcml6b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxvYXRzKGNvbnRh
aW5pbmdCbG9ja0NvbnN0cmFpbnRzLmhvcml6b250YWwpOwotICAgICAgICAgICAgICAgICAgICBm
b3JtYXR0aW5nQ29udGV4dC0+bGF5b3V0SW5GbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwg
Z2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgaWYgKCFhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShsYXlvdXRCb3gsIExheW91
dERpcmVjdGlvbjo6Q2hpbGQpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0K
LSAgICAgICAgLy8gQ2xpbWIgYmFjayBvbiB0aGUgYW5jZXN0b3JzIGFuZCBjb21wdXRlIGhlaWdo
dC9maW5hbCBwb3NpdGlvbi4KLSAgICAgICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5KCkp
IHsKLSAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9ICpsYXlvdXRRdWV1ZS50YWtlTGFzdCgp
OwotICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyA9IGNvbnN0cmFp
bnRzRm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0KLSAgICAgICAgICAgIC8vIEFsbCBpbmZsb3cg
ZGVzY2VuZGFudHMgKGlmIHRoZXJlIGFyZSBhbnkpIGFyZSBsYWlkIG91dCBieSBub3cuIExldCdz
IGNvbXB1dGUgdGhlIGJveCdzIGhlaWdodCBhbmQgdmVydGljYWwgbWFyZ2luLgotICAgICAgICAg
ICAgY29tcHV0ZUhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0
cmFpbnRzKTsKLSAgICAgICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQo
KSkKLSAgICAgICAgICAgICAgICBmbG9hdGluZ1N0YXRlLmFwcGVuZChmbG9hdGluZ0NvbnRleHQu
dG9GbG9hdEl0ZW0obGF5b3V0Qm94KSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAg
ICAgICAvLyBBZGp1c3QgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG5vdyB0aGF0IHdlJ3ZlIGdvdCBm
aW5hbCBtYXJnaW4gdmFsdWVzIGZvciBub24tZmxvYXQgYXZvaWRlciBib3hlcy4KLSAgICAgICAg
ICAgICAgICAvLyBGbG9hdCBhdm9pZGVycyBoYXZlIHByZS1jb21wdXRlZCB2ZXJ0aWNhbCBwb3Np
dGlvbnMgd2hlbiBmbG9hdHMgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgaWYgKCFsYXlv
dXRCb3guaXNGbG9hdEF2b2lkZXIoKSB8fCBmbG9hdGluZ0NvbnRleHQuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1hdHRp
bmdTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1h
dHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAgICAgICAgICAgICAgICAgICBi
b3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGxheW91
dEJveCwgZm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpLCBjb250
YWluaW5nQmxvY2tDb25zdHJhaW50cy52ZXJ0aWNhbCkpOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dG8gZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4
dCA9IGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCk7IAotICAgICAgICAg
ICAgaWYgKGVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQpIHsKLSAgICAgICAgICAgICAgICAv
LyBOb3cgdGhhdCB3ZSBjb21wdXRlZCB0aGUgYm94J3MgaGVpZ2h0LCB3ZSBjYW4gbGF5b3V0IHRo
ZSBvdXQtb2YtZmxvdyBkZXNjZW5kYW50cy4KLSAgICAgICAgICAgICAgICBpZiAoaXM8Q29udGFp
bmVyQm94PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5o
YXNDaGlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5lckJveCA9IGRv
d25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKLSAgICAgICAgICAgICAgICAgICAgTGF5
b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmVyQm94LCBsYXlvdXRT
dGF0ZSgpKS0+bGF5b3V0T3V0T2ZGbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0
cnkoKS5jb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFlc3RhYmxpc2hl
c0Zvcm1hdHRpbmdDb250ZXh0ICYmIGlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkKLSAgICAg
ICAgICAgICAgICBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihkb3duY2FzdDxDb250YWlu
ZXJCb3g+KGxheW91dEJveCksIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmhvcml6b250YWwp
OwotCi0gICAgICAgICAgICBpZiAoYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUobGF5b3V0Qm94LCBM
YXlvdXREaXJlY3Rpb246OlNpYmxpbmcpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0gICAgfQotICAgIC8vIFBsYWNlIHRoZSBpbmZsb3cgcG9zaXRpb25lZCBjaGlsZHJlbi4K
LSAgICBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihmb3JtYXR0aW5nUm9vdCwgY29uc3Ry
YWludHMuaG9yaXpvbnRhbCk7Ci0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0
TGF5b3V0LCBzdHJlYW0gPDwgIltFbmRdIC0+IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCAtPiBm
b3JtYXR0aW5nIHJvb3QoIiA8PCAmcm9vdCgpIDw8ICIpIik7Ci19Ci0KLUxheW91dFVuaXQgQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdAotewotICAgIC8v
IDEwLjYuNyAnQXV0bycgaGVpZ2h0cyBmb3IgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHJvb3Rz
Ci0KLSAgICAvLyBJZiBpdCBoYXMgYmxvY2stbGV2ZWwgY2hpbGRyZW4sIHRoZSBoZWlnaHQgaXMg
dGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHRvcCBtYXJnaW4tZWRnZSBvZiB0aGUgdG9wbW9zdCBi
bG9jay1sZXZlbAotICAgIC8vIGNoaWxkIGJveCBhbmQgdGhlIGJvdHRvbSBtYXJnaW4tZWRnZSBv
ZiB0aGUgYm90dG9tbW9zdCBibG9jay1sZXZlbCBjaGlsZCBib3guCi0KLSAgICAvLyBJbiBhZGRp
dGlvbiwgaWYgdGhlIGVsZW1lbnQgaGFzIGFueSBmbG9hdGluZyBkZXNjZW5kYW50cyB3aG9zZSBi
b3R0b20gbWFyZ2luIGVkZ2UgaXMgYmVsb3cgdGhlIGVsZW1lbnQncyBib3R0b20gY29udGVudCBl
ZGdlLAotICAgIC8vIHRoZW4gdGhlIGhlaWdodCBpcyBpbmNyZWFzZWQgdG8gaW5jbHVkZSB0aG9z
ZSBlZGdlcy4gT25seSBmbG9hdHMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiB0aGlzIGJsb2NrIGZvcm1h
dHRpbmcgY29udGV4dCBhcmUgdGFrZW4KLSAgICAvLyBpbnRvIGFjY291bnQsIGUuZy4sIGZsb2F0
cyBpbnNpZGUgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGRlc2NlbmRhbnRzIG9yIG90aGVyIGZsb2F0
cyBhcmUgbm90LgotICAgIGF1dG8gdG9wID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OwotICAg
IGF1dG8gYm90dG9tID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OwotICAgIGlmIChyb290KCku
aGFzSW5GbG93Q2hpbGQoKSkgewotICAgICAgICB0b3AgPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94
UmVjdChnZW9tZXRyeUZvckJveCgqcm9vdCgpLmZpcnN0SW5GbG93Q2hpbGQoKSkpLnRvcCgpOwot
ICAgICAgICBib3R0b20gPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9tZXRyeUZvckJv
eCgqcm9vdCgpLmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7Ci0gICAgfQotCi0gICAgYXV0
byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhpcywgZm9ybWF0dGluZ1N0
YXRlKCkuZmxvYXRpbmdTdGF0ZSgpIH07Ci0gICAgaWYgKGF1dG8gZmxvYXRUb3AgPSBmbG9hdGlu
Z0NvbnRleHQudG9wKCkpIHsKLSAgICAgICAgdG9wID0gc3RkOjptaW4oKmZsb2F0VG9wLCB0b3Au
dmFsdWVPcigqZmxvYXRUb3ApKTsKLSAgICAgICAgYXV0byBmbG9hdEJvdHRvbSA9ICpmbG9hdGlu
Z0NvbnRleHQuYm90dG9tKCk7Ci0gICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4KGZsb2F0Qm90dG9t
LCBib3R0b20udmFsdWVPcihmbG9hdEJvdHRvbSkpOwotICAgIH0KLSAgICByZXR1cm4gKmJvdHRv
bSAtICp0b3A7Ci19Ci0KLU9wdGlvbmFsPExheW91dFVuaXQ+IEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6OnVzZWRBdmFpbGFibGVXaWR0aEZvckZsb2F0QXZvaWRlcihjb25zdCBGbG9hdGluZ0NvbnRl
eHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFp
bnRzUGFpciYgY29uc3RyYWludHNQYWlyKQotewotICAgIC8vIE5vcm1hbGx5IHRoZSBhdmFpbGFi
bGUgd2lkdGggZm9yIGFuIGluLWZsb3cgYmxvY2sgbGV2ZWwgYm94IGlzIHRoZSB3aWR0aCBvZiB0
aGUgY29udGFpbmluZyBibG9jaydzIGNvbnRlbnQgYm94LgotICAgIC8vIEhvd2V2ZXIgKGFuZCBj
YW4ndCBmaW5kIGl0IGFueXdoZXJlIGluIHRoZSBzcGVjKSBub24tZmxvYXRpbmcgcG9zaXRpb25l
ZCBmbG9hdCBhdm9pZGVyIGJsb2NrIGxldmVsIGJveGVzIGFyZSBjb25zdHJhaW5lZCBieSBleGlz
dGluZyBmbG9hdHMuCi0gICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpKTsKLSAg
ICBpZiAoZmxvYXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHsgfTsKLSAg
ICAvLyBGbG9hdCBjbGVhciBwdXNoZXMgdGhlIGJsb2NrIGxldmVsIGJveCBlaXRoZXIgYmVsb3cg
dGhlIGZsb2F0cywgb3IganVzdCBvbmUgc2lkZSBiZWxvdyBidXQgdGhlIG90aGVyIHNpZGUgY291
bGQgb3ZlcmxhcC4KLSAgICAvLyBXaGF0IGl0IG1lYW5zIGlzIHRoYXQgdGhlIHVzZWQgYXZhaWxh
YmxlIHdpZHRoIGFsd2F5cyBtYXRjaGVzIHRoZSBjb250YWluaW5nIGJsb2NrJ3MgY29uc3RyYWlu
dC4KLSAgICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKLSAgICAgICAgcmV0dXJuIHsg
fTsKLQotICAgIEFTU0VSVChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgp
KTsKLSAgICAvLyBWZXJ0aWNhbCBzdGF0aWMgcG9zaXRpb24gaXMgbm90IGNvbXB1dGVkIHlldCBm
b3IgdGhpcyBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdCwgc28gbGV0J3MganVzdCBwcmUtY29tcHV0
ZSBpdCBmb3Igbm93LgotICAgIHByZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5j
ZXN0b3JzKGxheW91dEJveCwgY29uc3RyYWludHNQYWlyKTsKLQotICAgIGF1dG8gbG9naWNhbFRv
cEluRm9ybWF0dGluZ0NvbnRleHRSb290Q29vcmRpbmF0ZSA9IFsmXSAoYXV0byYgZmxvYXRBdm9p
ZGVyKSB7Ci0gICAgICAgIGF1dG8gdG9wID0gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChnZW9t
ZXRyeUZvckJveChmbG9hdEF2b2lkZXIpKTsKLSAgICAgICAgZm9yIChhdXRvKiBhbmNlc3RvciA9
ICZmbG9hdEF2b2lkZXIuY29udGFpbmluZ0Jsb2NrKCk7IGFuY2VzdG9yICE9ICZyb290KCk7IGFu
Y2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkKLSAgICAgICAgICAgIHRvcCAr
PSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94VG9wKGdlb21ldHJ5Rm9yQm94KCphbmNlc3RvcikpOwot
ICAgICAgICByZXR1cm4gdG9wOwotICAgIH07Ci0KLSAgICBhdXRvIGZsb2F0Q29uc3RyYWludHNJ
bkNvbnRhaW5pbmdCbG9ja0Nvb3JkaW5hdGUgPSBbJl0gKGF1dG8gZmxvYXRDb25zdHJhaW50cykg
ewotICAgICAgICBpZiAoIWZsb2F0Q29uc3RyYWludHMubGVmdCAmJiAhZmxvYXRDb25zdHJhaW50
cy5yaWdodCkKLSAgICAgICAgICAgIHJldHVybiBGbG9hdGluZ0NvbnRleHQ6OkNvbnN0cmFpbnRz
IHsgfTsKLSAgICAgICAgYXV0byBvZmZzZXQgPSBMYXlvdXRTaXplIHsgfTsKLSAgICAgICAgZm9y
IChhdXRvKiBhbmNlc3RvciA9ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7IGFuY2VzdG9y
ICE9ICZyb290KCk7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkKLSAg
ICAgICAgICAgIG9mZnNldCArPSB0b0xheW91dFNpemUoQm94R2VvbWV0cnk6OmJvcmRlckJveFRv
cExlZnQoZ2VvbWV0cnlGb3JCb3goKmFuY2VzdG9yKSkpOwotICAgICAgICBpZiAoZmxvYXRDb25z
dHJhaW50cy5sZWZ0KQotICAgICAgICAgICAgZmxvYXRDb25zdHJhaW50cy5sZWZ0ID0gUG9pbnRJ
bkNvbnRleHRSb290IHsgKmZsb2F0Q29uc3RyYWludHMubGVmdCAtIG9mZnNldCB9OwotICAgICAg
ICBpZiAoZmxvYXRDb25zdHJhaW50cy5yaWdodCkKLSAgICAgICAgICAgIGZsb2F0Q29uc3RyYWlu
dHMucmlnaHQgPSBQb2ludEluQ29udGV4dFJvb3QgeyAqZmxvYXRDb25zdHJhaW50cy5yaWdodCAt
IG9mZnNldCB9OwotICAgICAgICByZXR1cm4gZmxvYXRDb25zdHJhaW50czsKLSAgICB9OwotCi0g
ICAgLy8gRklYTUU6IENoZWNrIGlmIHRoZSBub24teWV0LWNvbXB1dGVkIGhlaWdodCBhZmZlY3Rz
IHRoaXMgY29tcHV0YXRpb24gLSBhbmQgd2hldGhlciB3ZSBoYXZlIHRvIHJlc29sdmUgaXQgYXQg
YSBsYXRlciBwb2ludC4KLSAgICBhdXRvIGxvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wSW5Gb3JtYXR0
aW5nQ29udGV4dFJvb3RDb29yZGluYXRlKGxheW91dEJveCk7Ci0gICAgYXV0byBjb25zdHJhaW50
cyA9IGZsb2F0Q29uc3RyYWludHNJbkNvbnRhaW5pbmdCbG9ja0Nvb3JkaW5hdGUoZmxvYXRpbmdD
b250ZXh0LmNvbnN0cmFpbnRzKGxvZ2ljYWxUb3AsIGxvZ2ljYWxUb3ApKTsKLSAgICBpZiAoIWNv
bnN0cmFpbnRzLmxlZnQgJiYgIWNvbnN0cmFpbnRzLnJpZ2h0KQotICAgICAgICByZXR1cm4geyB9
OwotICAgIC8vIFNocmluayB0aGUgYXZhaWxhYmxlIHNwYWNlIGlmIHRoZSBmbG9hdHMgYXJlIGFj
dHVhbGx5IGludHJ1ZGluZyBhdCB0aGlzIHZlcnRpY2FsIHBvc2l0aW9uLgotICAgIGF1dG8gYXZh
aWxhYmxlV2lkdGggPSBjb25zdHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250YWwu
bG9naWNhbFdpZHRoOwotICAgIGlmIChjb25zdHJhaW50cy5sZWZ0KQotICAgICAgICBhdmFpbGFi
bGVXaWR0aCAtPSBjb25zdHJhaW50cy5sZWZ0LT54OwotICAgIGlmIChjb25zdHJhaW50cy5yaWdo
dCkKLSAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3RkOjptYXgoMF9sdSwgY29uc3RyYWludHNQ
YWlyLmNvbnRhaW5pbmdCbG9jay5ob3Jpem9udGFsLmxvZ2ljYWxSaWdodCgpIC0gY29uc3RyYWlu
dHMucmlnaHQtPngpOwotICAgIHJldHVybiBhdmFpbGFibGVXaWR0aDsKLX0KLQotdm9pZCBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihjb25zdCBD
b250YWluZXJCb3gmIGNvbnRhaW5lckJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBo
b3Jpem9udGFsQ29uc3RyYWludHMpCi17Ci0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdD
b250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIlN0YXJ0OiBtb3ZlIGluLWZsb3cgcG9zaXRpb25lZCBj
aGlsZHJlbiAtPiBwYXJlbnQ6ICIgPDwgJmNvbnRhaW5lckJveCk7Ci0gICAgZm9yIChhdXRvJiBj
aGlsZEJveCA6IGNoaWxkcmVuT2ZUeXBlPEJveD4oY29udGFpbmVyQm94KSkgewotICAgICAgICBp
ZiAoIWNoaWxkQm94LmlzSW5GbG93UG9zaXRpb25lZCgpKQotICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgIGF1dG8gcG9zaXRpb25PZmZzZXQgPSBnZW9tZXRyeSgpLmluRmxvd1Bvc2l0aW9u
ZWRQb3NpdGlvbk9mZnNldChjaGlsZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAg
ICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoY2hpbGRCb3gpLm1vdmUocG9zaXRpb25P
ZmZzZXQpOwotICAgIH0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlv
dXQsIHN0cmVhbSA8PCAiRW5kOiBtb3ZlIGluLWZsb3cgcG9zaXRpb25lZCBjaGlsZHJlbiAtPiBw
YXJlbnQ6ICIgPDwgJmNvbnRhaW5lckJveCk7Ci19Ci0KLXZvaWQgQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6Y29tcHV0ZVN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gs
IGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpCi17Ci0gICAg
Zm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRMb2dpY2FsVG9wKGdl
b21ldHJ5KCkuc3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIHZlcnRpY2FsQ29uc3Ry
YWludHMpKTsKLX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlU3RhdGlj
SG9yaXpvbnRhbFBvc2l0aW9uKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFs
Q29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKLXsKLSAgICBmb3JtYXR0aW5nU3Rh
dGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxMZWZ0KGdlb21ldHJ5KCkuc3Rh
dGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSk7
Ci19Ci0KLXZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6cHJlY29tcHV0ZVZlcnRpY2FsUG9z
aXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0
cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQotewotICAgIC8vIEluIG9yZGVyIHRvIGZpZ3Vy
ZSBvdXQgd2hldGhlciBhIGJveCBzaG91bGQgYXZvaWQgYSBmbG9hdCwgd2UgbmVlZCB0byBrbm93
IHRoZSBmaW5hbCBwb3NpdGlvbnMgb2YgYm90aCAoaWdub3JlIHJlbGF0aXZlIHBvc2l0aW9uaW5n
IGZvciBub3cpLgotICAgIC8vIEluIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCB0aGUgZmluYWwg
cG9zaXRpb24gZm9yIGEgbm9ybWFsIGZsb3cgYm94IGluY2x1ZGVzCi0gICAgLy8gMS4gdGhlIHN0
YXRpYyBwb3NpdGlvbiBhbmQKLSAgICAvLyAyLiB0aGUgY29ycmVzcG9uZGluZyAobm9uKWNvbGxh
cHNlZCBtYXJnaW5zLgotICAgIC8vIE5vdyB0aGUgdmVydGljYWwgbWFyZ2lucyBhcmUgY29tcHV0
ZWQgd2hlbiBhbGwgdGhlIGRlc2NlbmRhbnRzIGFyZSBmaW5hbGl6ZWQsIGJlY2F1c2UgdGhlIG1h
cmdpbiB2YWx1ZXMgbWlnaHQgYmUgZGVwZW5kaW5nIG9uIHRoZSBoZWlnaHQgb2YgdGhlIGJveAot
ICAgIC8vIChhbmQgdGhlIGhlaWdodCBtaWdodCBiZSBiYXNlZCBvbiB0aGUgY29udGVudCkuCi0g
ICAgLy8gU28gd2hlbiB3ZSBnZXQgdG8gdGhlIHBvaW50IHdoZXJlIHdlIGludGVyc2VjdCB0aGUg
Ym94IHdpdGggdGhlIGZsb2F0IHRvIGRlY2lkZSBpZiB0aGUgYm94IG5lZWRzIHRvIG1vdmUsIHdl
IGRvbid0IHlldCBoYXZlIHRoZSBmaW5hbCB2ZXJ0aWNhbCBwb3NpdGlvbi4KLSAgICAvLwotICAg
IC8vIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCBhcyBsb25nIGFzIHdlIGRvbid0IGNyb3NzIHRoZSBi
bG9jayBmb3JtYXR0aW5nIGNvbnRleHQgYm91bmRhcnksIHdlIHNob3VsZCBiZSBhYmxlIHRvIHBy
ZS1jb21wdXRlIHRoZSBmaW5hbCB0b3AgcG9zaXRpb24uCi0gICAgLy8gRklYTUU6IHdlIGN1cnJl
bnRseSBkb24ndCBhY2NvdW50IGZvciB0aGUgImNsZWFyIiBwcm9wZXJ0eSB3aGVuIGNvbXB1dGlu
ZyB0aGUgZmluYWwgcG9zaXRpb24gZm9yIGFuIGFuY2VzdG9yLgotICAgIGZvciAoYXV0byogYW5j
ZXN0b3IgPSAmbGF5b3V0Qm94OyBhbmNlc3RvciAmJiBhbmNlc3RvciAhPSAmcm9vdCgpOyBhbmNl
c3RvciA9ICZhbmNlc3Rvci0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAgICAgYXV0byBjb25z
dHJhaW50c0ZvckFuY2VzdG9yID0gWyZdIHsKLSAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdC
bG9jayA9IGFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgIHJldHVybiAm
Y29udGFpbmluZ0Jsb2NrID09ICZyb290KCkgPyBjb25zdHJhaW50c1BhaXIuZm9ybWF0dGluZ0Nv
bnRleHRSb290IDogZ2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29udGFp
bmluZ0Jsb2NrKTsKLSAgICAgICAgfSgpOwotCi0gICAgICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNh
bE1hcmdpbiA9IGdlb21ldHJ5KCkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbigqYW5jZXN0b3IsIGNv
bnN0cmFpbnRzRm9yQW5jZXN0b3IuaG9yaXpvbnRhbCk7Ci0gICAgICAgIGF1dG8gdXNlZE5vbkNv
bGxhcHNlZE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIHsg
Y29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNh
bE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07Ci0gICAgICAgIGF1dG8gcHJlY29tcHV0ZWRNYXJn
aW5CZWZvcmUgPSBtYXJnaW5Db2xsYXBzZSgpLnByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKCphbmNl
c3RvciwgdXNlZE5vbkNvbGxhcHNlZE1hcmdpbik7Ci0KLSAgICAgICAgYXV0byYgYm94R2VvbWV0
cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSgqYW5jZXN0b3IpOwotICAgICAgICBh
dXRvIG5vbkNvbGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2Vk
VmFsdWVzIHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUubm9uQ29sbGFwc2VkVmFsdWUsIHsgfSB9
OwotICAgICAgICBhdXRvIGNvbGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Q29s
bGFwc2VkVmFsdWVzIHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUuY29sbGFwc2VkVmFsdWUsIHsg
fSwgZmFsc2UgfTsKLSAgICAgICAgYXV0byB2ZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1h
cmdpbiB7IG5vbkNvbGxhcHNlZFZhbHVlcywgY29sbGFwc2VkVmFsdWVzLCB7IHByZWNvbXB1dGVk
TWFyZ2luQmVmb3JlLnBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW5CZWZvcmUsIHsgfSB9IH07Ci0K
LSAgICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0VXNlZFZlcnRpY2FsTWFyZ2luKCphbmNlc3Rv
ciwgdmVydGljYWxNYXJnaW4pOwotICAgICAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdp
bih7IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFy
Z2luKSB9KTsKLSAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcCh2ZXJ0aWNhbFBvc2l0
aW9uV2l0aE1hcmdpbigqYW5jZXN0b3IsIHZlcnRpY2FsTWFyZ2luLCBjb25zdHJhaW50c0ZvckFu
Y2VzdG9yLnZlcnRpY2FsKSk7Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICAgICAgc2V0UHJlY29t
cHV0ZWRNYXJnaW5CZWZvcmUoKmFuY2VzdG9yLCBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZSk7Ci0g
ICAgICAgIGJveEdlb21ldHJ5LnNldEhhc1ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKCk7Ci0jZW5k
aWYKLSAgICB9Ci19Ci0KLXZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZVBvc2l0
aW9uVG9Bdm9pZEZsb2F0cyhjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCwg
Y29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWludHNQ
YWlyKQotewotICAgIGlmICghbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkpCi0gICAgICAgIHJl
dHVybjsKLSAgICAvLyBJbiBvcmRlciB0byBwb3NpdGlvbiBhIGZsb2F0IGF2b2lkZXIgd2UgbmVl
ZCB0byBrbm93IGl0cyB2ZXJ0aWNhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byBpdHMgZm9ybWF0dGlu
ZyBjb250ZXh0IHJvb3QgKGFuZCBub3QganVzdCBpdHMgY29udGFpbmluZyBibG9jayksCi0gICAg
Ly8gYmVjYXVzZSBhbGwgdGhlIGFscmVhZHktcGxhY2VkIGZsb2F0cyAoZmxvYXRzIHRoYXQgd2Ug
YXJlIHRyeWluZyB0byBhdm9pZCBoZXJlKSBpbiB0aGlzIEJGQyBtaWdodCBiZWxvbmcKLSAgICAv
LyB0byBhIGRpZmZlcmVudCBzZXQgb2YgY29udGFpbmluZyBibG9ja3MgKGJ1dCB0aGV5IGFsbCBk
ZXNjZW5kYW50cyBvZiB0aGUgQkZDIHJvb3QpLgotICAgIC8vIEhvd2V2ZXIgYWNjb3JkaW5nIHRv
IHRoZSBCRkMgcnVsZXMsIGF0IHRoaXMgcG9pbnQgb2YgdGhlIGxheW91dCBmbG93IHdlIGRvbid0
IHlldCBoYXZlIGNvbXB1dGVkIHZlcnRpY2FsIHBvc2l0aW9ucyBmb3IgdGhlIGFuY2VzdG9ycy4K
LSAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgcHJl
Y29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMobGF5b3V0Qm94LCBjb25z
dHJhaW50c1BhaXIpOwotICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlv
dXRCb3gpLnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nQ29udGV4dC5wb3NpdGlvbkZvckZsb2F0
KGxheW91dEJveCwgY29uc3RyYWludHNQYWlyLmNvbnRhaW5pbmdCbG9jay5ob3Jpem9udGFsKSk7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gTm9uLWZsb2F0IHBvc2l0aW9uZWQgZmxv
YXQgYXZvaWRlcnMgKGZvcm1hdHRpbmcgY29udGV4dCByb290cyBhbmQgY2xlYXIgYm94ZXMpIHNo
b3VsZCBiZSBmaW5lIHVubGVzcyB0aGVyZSBhcmUgZmxvYXRzIGluIHRoaXMgY29udGV4dC4KLSAg
ICBpZiAoZmxvYXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIHBy
ZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGxheW91dEJveCwgY29u
c3RyYWludHNQYWlyKTsKLSAgICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKLSAgICAg
ICAgcmV0dXJuIGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihmbG9hdGluZ0Nv
bnRleHQsIGxheW91dEJveCk7Ci0KLSAgICBBU1NFUlQobGF5b3V0Qm94LmVzdGFibGlzaGVzRm9y
bWF0dGluZ0NvbnRleHQoKSk7Ci0gICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5
b3V0Qm94KS5zZXRMb2dpY2FsVG9wTGVmdChmbG9hdGluZ0NvbnRleHQucG9zaXRpb25Gb3JOb25G
bG9hdGluZ0Zsb2F0QXZvaWRlcihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzUGFpci5jb250YWluaW5n
QmxvY2suaG9yaXpvbnRhbCkpOwotfQotCi12b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNv
bXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihjb25zdCBGbG9hdGluZ0NvbnRleHQm
IGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAgQVNTRVJUKGxh
eW91dEJveC5oYXNGbG9hdENsZWFyKCkpOwotICAgIGlmIChmbG9hdGluZ0NvbnRleHQuaXNFbXB0
eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgYXV0byB2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJh
bmNlID0gZmxvYXRpbmdDb250ZXh0LnZlcnRpY2FsUG9zaXRpb25XaXRoQ2xlYXJhbmNlKGxheW91
dEJveCk7Ci0gICAgaWYgKCF2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJhbmNlKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdl
b21ldHJ5KGxheW91dEJveCk7Ci0gICAgQVNTRVJUKHZlcnRpY2FsUG9zaXRpb25BbmRDbGVhcmFu
Y2UtPnBvc2l0aW9uID49IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hUb3AoYm94R2VvbWV0cnkpKTsK
LSAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25BbmRDbGVhcmFu
Y2UtPnBvc2l0aW9uKTsKLSAgICBpZiAodmVydGljYWxQb3NpdGlvbkFuZENsZWFyYW5jZS0+Y2xl
YXJhbmNlKQotICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRIYXNDbGVhcmFuY2UobGF5b3V0
Qm94KTsKLSAgICAvLyBGSVhNRTogUmVzZXQgdGhlIG1hcmdpbiB2YWx1ZXMgb24gdGhlIGFuY2Vz
dG9ycy9wcmV2aW91cyBzaWJsaW5ncyBub3cgdGhhdCB0aGUgZmxvYXQgYXZvaWRlciB3aXRoIGNs
ZWFyYW5jZSBkb2VzIG5vdCBtYXJnaW4gY29sbGFwc2UgYW55bW9yZS4KLX0KLQotdm9pZCBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3QgRmxvYXRpbmdD
b250ZXh0JiBmbG9hdGluZ0NvbnRleHQsIGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBDb25z
dHJhaW50c1BhaXImIGNvbnN0cmFpbnRzUGFpcikKLXsKLSAgICBhdXRvIGF2YWlsYWJsZVdpZHRo
RmxvYXRBdm9pZGVyID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OwotICAgIGlmIChsYXlvdXRC
b3guaXNGbG9hdEF2b2lkZXIoKSkgewotICAgICAgICAvLyBGbG9hdCBhdm9pZGVycycgYXZhaWxh
YmxlIHdpZHRoIG1pZ2h0IGJlIHNocnVuayBieSBleGlzdGluZyBmbG9hdHMgaW4gdGhlIGNvbnRl
eHQuCi0gICAgICAgIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyID0gdXNlZEF2YWlsYWJsZVdp
ZHRoRm9yRmxvYXRBdm9pZGVyKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCBjb25zdHJhaW50
c1BhaXIpOwotICAgIH0KLSAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGdlb21ldHJ5
KCkuY29tcHV0ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBjb25zdHJhaW50c1Bh
aXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250YWwsIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVy
KTsKLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5
KGxheW91dEJveCk7Ci0gICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGNvbnRlbnRX
aWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOwotICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250
YWxNYXJnaW4oeyBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCwgY29udGVu
dFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIH0pOwotfQotCi12b2lkIEJsb2NrRm9ybWF0
dGluZ0NvbnRleHQ6OmNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gs
IGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCi17Ci0gICAg
YXV0byBjb21wdXRlID0gWyZdKE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRIZWlnaHQpIC0+IENv
bnRlbnRIZWlnaHRBbmRNYXJnaW4gewotICAgICAgICBpZiAobGF5b3V0Qm94LmlzSW5GbG93KCkp
Ci0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbkZsb3dDb250ZW50SGVpZ2h0QW5kTWFy
Z2luKGxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwgeyB1c2VkSGVpZ2h0IH0pOwot
Ci0gICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAg
ICAgIHJldHVybiBnZW9tZXRyeSgpLmZsb2F0aW5nQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlv
dXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIHsgdXNlZEhlaWdodCB9KTsKLQotICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICB9OwotCi0g
ICAgYXV0byBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZSh7IH0pOwotICAgIGlmIChh
dXRvIG1heEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQobGF5b3V0Qm94KSkg
ewotICAgICAgICBpZiAoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID4gKm1h
eEhlaWdodCkgewotICAgICAgICAgICAgYXV0byBtYXhIZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRl
KG1heEhlaWdodCk7Ci0gICAgICAgICAgICAvLyBVc2VkIGhlaWdodCBzaG91bGQgcmVtYWluIHRo
ZSBzYW1lLgotICAgICAgICAgICAgQVNTRVJUKChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgp
ICYmIChsYXlvdXRCb3guaXNCb2R5Qm94KCkgfHwgbGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSkp
IHx8IG1heEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID09ICptYXhIZWlnaHQpOwotICAg
ICAgICAgICAgY29udGVudEhlaWdodEFuZE1hcmdpbiA9IHsgKm1heEhlaWdodCwgbWF4SGVpZ2h0
QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbiB9OwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
aWYgKGF1dG8gbWluSGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbkhlaWdodChsYXlvdXRC
b3gpKSB7Ci0gICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQg
PCAqbWluSGVpZ2h0KSB7Ci0gICAgICAgICAgICBhdXRvIG1pbkhlaWdodEFuZE1hcmdpbiA9IGNv
bXB1dGUobWluSGVpZ2h0KTsKLSAgICAgICAgICAgIC8vIFVzZWQgaGVpZ2h0IHNob3VsZCByZW1h
aW4gdGhlIHNhbWUuCi0gICAgICAgICAgICBBU1NFUlQoKGxheW91dFN0YXRlKCkuaW5RdWlya3NN
b2RlKCkgJiYgKGxheW91dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJv
eCgpKSkgfHwgbWluSGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPT0gKm1pbkhlaWdodCk7
Ci0gICAgICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0geyAqbWluSGVpZ2h0LCBtaW5I
ZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICAvLyAxLiBDb21wdXRlIGNvbGxhcHNlZCBtYXJnaW5zLgotICAgIC8vIDIuIEFkanVzdCB2
ZXJ0aWNhbCBwb3NpdGlvbiB1c2luZyB0aGUgY29sbGFwc2VkIHZhbHVlcy4KLSAgICAvLyAzLiBB
ZGp1c3QgcHJldmlvdXMgaW4tZmxvdyBzaWJsaW5nIG1hcmdpbiBhZnRlciB1c2luZyB0aGlzIG1h
cmdpbi4KLSAgICBhdXRvIG1hcmdpbkNvbGxhcHNlID0gdGhpcy0+bWFyZ2luQ29sbGFwc2UoKTsK
LSAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gbWFyZ2luQ29sbGFwc2UuY29sbGFwc2VkVmVydGlj
YWxWYWx1ZXMobGF5b3V0Qm94LCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1h
cmdpbik7Ci0gICAgLy8gQ2FjaGUgdGhlIGNvbXB1dGVkIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBt
YXJnaW4gdmFsdWUgcGFpci4KLSAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRVc2VkVmVydGljYWxN
YXJnaW4obGF5b3V0Qm94LCB2ZXJ0aWNhbE1hcmdpbik7Ci0KLSNpZiBBU1NFUlRfRU5BQkxFRAot
ICAgIGlmIChoYXNQcmVjb21wdXRlZE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpICYmIHByZWNvbXB1
dGVkTWFyZ2luQmVmb3JlKGxheW91dEJveCkudXNlZFZhbHVlKCkgIT0gbWFyZ2luQmVmb3JlKHZl
cnRpY2FsTWFyZ2luKSkgewotICAgICAgICAvLyBXaGVuIHRoZSBwcmUtY29tcHV0ZWQgbWFyZ2lu
IHR1cm5zIG91dCB0byBiZSBpbmNvcnJlY3QsIHdlIG5lZWQgdG8gcmUtbGF5b3V0IHRoaXMgc3Vi
dHJlZSB3aXRoIHRoZSBjb3JyZWN0IG1hcmdpbiB2YWx1ZXMuCi0gICAgICAgIC8vIDxkaXYgc3R5
bGU9ImZsb2F0OiBsZWZ0Ij48L2Rpdj4KLSAgICAgICAgLy8gPGRpdj4KLSAgICAgICAgLy8gICA8
ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOiAyMDBweCI+PC9kaXY+Ci0gICAgICAgIC8vIDwvZGl2
PgotICAgICAgICAvLyBUaGUgZmxvYXQgYm94IHRyaWdnZXJzIG1hcmdpbiBiZWZvcmUgY29tcHV0
YXRpb24gb24gdGhlIGFuY2VzdG9yIGNoYWluIHRvIGJlIGFibGUgdG8gaW50ZXJzZWN0IHdpdGgg
b3RoZXIgZmxvYXRzIGluIHRoZSBzYW1lIGZsb2F0aW5nIGNvbnRleHQuCi0gICAgICAgIC8vIEhv
d2V2ZXIgaW4gc29tZSBjYXNlcyB0aGUgcGFyZW50IG1hcmdpbi10b3AgY29sbGFwc2VzIHdpdGgg
c29tZSBuZXh0IHNpYmxpbmdzIChuZXBoZXdzKSBhbmQgdGhlcmUncyBubyB3YXkgdG8gYmUgYWJs
ZSB0byBwcm9wZXJseQotICAgICAgICAvLyBhY2NvdW50IGZvciB0aGF0IHdpdGhvdXQgbGF5aW5n
IG91dCBldmVyeSBub2RlIGluIHRoZSBGQyAoaW4gdGhlIGV4YW1wbGUsIHRoZSBtYXJnaW4tYm90
dG9tIHB1c2hlcyBkb3duIHRoZSBmbG9hdCkuCi0gICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5U
RURfWUVUKCk7Ci0gICAgfQotI2VuZGlmCi0gICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0
aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAgIGJveEdlb21ldHJ5LnNldENv
bnRlbnRCb3hIZWlnaHQoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KTsKLSAg
ICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1h
cmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsKLSAgICAvLyBBZGp1c3QgdGhl
IHByZXZpb3VzIHNpYmxpbmcncyBtYXJnaW4gYm90dG9tIG5vdyB0aGF0IHRoaXMgYm94J3MgdmVy
dGljYWwgbWFyZ2luIGlzIGNvbXB1dGVkLgotICAgIE1hcmdpbkNvbGxhcHNlOjp1cGRhdGVNYXJn
aW5BZnRlckZvclByZXZpb3VzU2libGluZygqdGhpcywgbWFyZ2luQ29sbGFwc2UsIGxheW91dEJv
eCk7Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIEJs
b2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygp
Ci17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7
Ci0gICAgQVNTRVJUKCFmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cygp
KTsKLSAgICAvLyBWaXNpdCB0aGUgaW4tZmxvdyBkZXNjZW5kYW50cyBhbmQgY29tcHV0ZSB0aGVp
ciBtaW4vbWF4IGludHJpbnNpYyB3aWR0aCBpZiBuZWVkZWQuCi0gICAgLy8gMS4gR28gYWxsIHRo
ZSB3YXkgZG93biB0byB0aGUgbGVhZiBub2RlCi0gICAgLy8gMi4gQ2hlY2sgaWYgYWN0dWFsbHkg
bmVlZCB0byB2aXNpdCBhbGwgdGhlIGJveGVzIGFzIHdlIHRyYXZlcnNlIGRvd24gKGFscmVhZHkg
Y29tcHV0ZWQsIGNvbnRhaW5lcidzIG1pbi9tYXggZG9lcyBub3QgZGVwZW5kIG9uIGRlc2NlbmRh
bnRzIGV0YykKLSAgICAvLyAzLiBBcyB3ZSBjbGltYiBiYWNrIG9uIHRoZSB0cmVlLCBjb21wdXRl
IG1pbi9tYXggaW50cmluc2ljIHdpZHRoCi0gICAgLy8gKEFueSBzdWJ0cmVlcyB3aXRoIG5ldyBm
b3JtYXR0aW5nIGNvbnRleHRzIG5lZWQgdG8gbGF5b3V0IHN5bmNocm9ub3VzbHkpCi0gICAgVmVj
dG9yPGNvbnN0IEJveCo+IHF1ZXVlOwotICAgIGlmIChyb290KCkuaGFzSW5GbG93T3JGbG9hdGlu
Z0NoaWxkKCkpCi0gICAgICAgIHF1ZXVlLmFwcGVuZChyb290KCkuZmlyc3RJbkZsb3dPckZsb2F0
aW5nQ2hpbGQoKSk7Ci0KLSAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbnN0cmFpbnRz
OwotICAgIGF1dG8gbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoID0gTGF5b3V0VW5pdCB7
IH07Ci0gICAgYXV0byBjdXJyZW50SG9yaXpvbnRhbFN0YWNraW5nV2lkdGggPSBMYXlvdXRVbml0
IHsgfTsKLSAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgewotICAgICAgICB3aGlsZSAodHJ1
ZSkgewotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBkZWFsIHdpdGggZGVzY2Vu
ZGFudCBjb250ZW50LgotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKnF1ZXVlLmxhc3Qo
KTsKLSAgICAgICAgICAgIC8vIEZsb2F0IGF2b2lkZXJzIGFyZSBhbGwgZXN0YWJsaXNoIGEgbmV3
IGZvcm1hdHRpbmcgY29udGV4dC4gTm8gbmVlZCB0byBsb29rIGluc2lkZSB0aGVtLgotICAgICAg
ICAgICAgaWYgKGxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpICYmICFsYXlvdXRCb3guaGFzRmxv
YXRDbGVhcigpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLy8gTm9uLWZs
b2F0aW5nIGJsb2NrIGxldmVsIGJveGVzIHJlc2V0IHRoZSBjdXJyZW50IGhvcml6b250YWwgZmxv
YXQgc3RhY2tpbmcuCi0gICAgICAgICAgICAvLyBTUEVDOiBUaGlzIGlzIGEgYml0IG9kZCBhcyBm
bG9hdGluZyBwb3NpdGlvbmluZyBpcyBhIGZvcm1hdHRpbmcgY29udGV4dCBsZXZlbCBjb25jZXB0
OgotICAgICAgICAgICAgLy8gZS5nLgotICAgICAgICAgICAgLy8gPGRpdiBzdHlsZT0iZmxvYXQ6
IGxlZnQ7IHdpZHRoOiAxMHB4OyI+PC9kaXY+Ci0gICAgICAgICAgICAvLyA8ZGl2PjwvZGl2Pgot
ICAgICAgICAgICAgLy8gPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiA0MHB4OyI+PC9k
aXY+Ci0gICAgICAgICAgICAvLyAuLi53aWxsIHByb2R1Y2UgYSBtYXggd2lkdGggb2YgNDBweCB3
aGljaCBtYWtlcyB0aGUgZmxvYXRzIHZlcnRpY2FsbHkgc3RhY2tlZC4KLSAgICAgICAgICAgIC8v
IFZlcnRpY2FsbHkgc3RhY2tlZCBmbG9hdHMgbWFrZXMgbWUgdGhpbmsgd2UgaGF2ZW4ndCBtYW5h
Z2VkIHRvIHByb3ZpZGUgdGhlIG1heGltdW0gcHJlZmVycmVkIHdpZHRoIGZvciB0aGUgY29udGVu
dC4KLSAgICAgICAgICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHN0ZDo6bWF4
KGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250YWxTdGFja2lu
Z1dpZHRoKTsKLSAgICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHsg
fTsKLSAgICAgICAgICAgIC8vIEFscmVhZHkgaGFzIGNvbXB1dGVkIGludHJpbnNpYyBjb25zdHJh
aW50cy4KLSAgICAgICAgICAgIGlmIChmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25z
dHJhaW50c0ZvckJveChsYXlvdXRCb3gpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgLy8gQm94IHdpdGggZml4ZWQgd2lkdGggZGVmaW5lcyB0aGVpciBkZXNjZW5kYW50IGNv
bnRlbnQgaW50cmluc2ljIHdpZHRoLgotICAgICAgICAgICAgaWYgKGxheW91dEJveC5zdHlsZSgp
LndpZHRoKCkuaXNGaXhlZCgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
Ly8gTm9uLWZsb2F0IGF2b2lkZXIgZm9ybWF0dGluZyBjb250ZXh0IHJvb3RzIGFyZSBvcGFxdWUg
dG8gaW50cmluc2ljIHdpZHRoIGNvbXB1dGF0aW9uLgotICAgICAgICAgICAgaWYgKGxheW91dEJv
eC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAvLyBObyByZWxldmFudCBjaGlsZCBjb250ZW50LgotICAgICAgICAgICAg
aWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENvbnRhaW5lckJv
eD4obGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChkb3duY2FzdDxDb250YWluZXJCb3g+
KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7Ci0gICAgICAgIH0KLSAg
ICAgICAgLy8gQ29tcHV0ZSBtaW4vbWF4IGludHJpbnNpYyB3aWR0aCBib3R0b20gdXAgaWYgbmVl
ZGVkLgotICAgICAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYXV0
byYgbGF5b3V0Qm94ID0gKnF1ZXVlLnRha2VMYXN0KCk7Ci0gICAgICAgICAgICBhdXRvIGRlc2Rl
bmRhbnRDb25zdHJhaW50cyA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzRm9yQm94KGxheW91dEJveCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2RlbmRhbnRDb25zdHJh
aW50cykgewotICAgICAgICAgICAgICAgIGRlc2RlbmRhbnRDb25zdHJhaW50cyA9IGdlb21ldHJ5
KCkuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhsYXlvdXRCb3gpOwotICAgICAgICAgICAgICAg
IGZvcm1hdHRpbmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGxheW91
dEJveCwgKmRlc2RlbmRhbnRDb25zdHJhaW50cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBjb25zdHJhaW50cy5taW5pbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMubWluaW11bSwgZGVz
ZGVuZGFudENvbnN0cmFpbnRzLT5taW5pbXVtKTsKLSAgICAgICAgICAgIGF1dG8gd2lsbFN0YWNr
SG9yaXpvbnRhbGx5ID0gbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkgJiYgIWxheW91dEJveC5o
YXNGbG9hdENsZWFyKCk7Ci0gICAgICAgICAgICBpZiAod2lsbFN0YWNrSG9yaXpvbnRhbGx5KQot
ICAgICAgICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCArPSBkZXNkZW5k
YW50Q29uc3RyYWludHMtPm1heGltdW07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAg
ICAgY29uc3RyYWludHMubWF4aW11bSA9IHN0ZDo6bWF4KGNvbnN0cmFpbnRzLm1heGltdW0sIGRl
c2RlbmRhbnRDb25zdHJhaW50cy0+bWF4aW11bSk7Ci0gICAgICAgICAgICAvLyBNb3ZlIG92ZXIg
dG8gdGhlIG5leHQgc2libGluZyBvciB0YWtlIHRoZSBuZXh0IGJveCBpbiB0aGUgcXVldWUuCi0g
ICAgICAgICAgICBpZiAoYXV0byogbmV4dFNpYmxpbmcgPSBsYXlvdXRCb3gubmV4dEluRmxvd09y
RmxvYXRpbmdTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQobmV4dFNp
YmxpbmcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgfQotICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHN0ZDo6bWF4KGN1
cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dp
ZHRoKTsKLSAgICBjb25zdHJhaW50cy5tYXhpbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMubWF4
aW11bSwgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsKLSAgICBmb3JtYXR0aW5nU3Rh
dGUuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25zdHJhaW50cyk7Ci0gICAgcmV0dXJu
IGNvbnN0cmFpbnRzOwotfQotCi1MYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OnZl
cnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBVc2Vk
VmVydGljYWxNYXJnaW4mIHZlcnRpY2FsTWFyZ2luLCAgY29uc3QgVmVydGljYWxDb25zdHJhaW50
cyYgdmVydGljYWxDb25zdHJhaW50cykgY29uc3QKLXsKLSAgICBBU1NFUlQoIWxheW91dEJveC5p
c091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7Ci0gICAgLy8gTm93IHRoYXQgd2UndmUgY29tcHV0ZWQg
dGhlIGZpbmFsIG1hcmdpbiBiZWZvcmUsIGxldCdzIHNoaWZ0IHRoZSBib3gncyB2ZXJ0aWNhbCBw
b3NpdGlvbiBpZiBuZWVkZWQuCi0gICAgLy8gMS4gQ2hlY2sgaWYgdGhlIGJveCBoYXMgY2xlYXJh
bmNlLiBJZiBzbywgd2UndmUgYWxyZWFkeSBwcmVjb21wdXRlZC9maW5hbGl6ZWQgdGhlIHRvcCB2
YWx1ZSBhbmQgdmVydGljYWwgbWFyZ2luIGRvZXMgbm90IGltcGFjdCBpdCBhbnltb3JlLgotICAg
IC8vIDIuIENoZWNrIGlmIHRoZSBtYXJnaW4gYmVmb3JlIGNvbGxhcHNlcyB3aXRoIHRoZSBwcmV2
aW91cyBib3gncyBtYXJnaW4gYWZ0ZXIuIGlmIG5vdCAtPiByZXR1cm4gcHJldmlvdXMgYm94J3Mg
Ym90dG9tIGluY2x1ZGluZyBtYXJnaW4gYWZ0ZXIgKyBtYXJnaW5CZWZvcmUKLSAgICAvLyAzLiBD
aGVjayBpZiB0aGUgcHJldmlvdXMgYm94J3MgbWFyZ2lucyBjb2xsYXBzZSB0aHJvdWdoLiBJZiBu
b3QgLT4gcmV0dXJuIHByZXZpb3VzIGJveCcgYm90dG9tIGV4Y2x1ZGluZyBtYXJnaW4gYWZ0ZXIg
KyBtYXJnaW5CZWZvcmUgKHRoZXkgYXJlIHN1cHBvc2VkIHRvIGJlIGVxdWFsKQotICAgIC8vIDQu
IEdvIHRvIHByZXZpb3VzIGJveCBhbmQgc3RhcnQgZnJvbSBzdGVwICMxIHVudGlsIHdlIGhpdCB0
aGUgcGFyZW50IGJveC4KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGdlb21ldHJ5Rm9yQm94KGxh
eW91dEJveCk7Ci0gICAgaWYgKGZvcm1hdHRpbmdTdGF0ZSgpLmhhc0NsZWFyYW5jZShsYXlvdXRC
b3gpKQotICAgICAgICByZXR1cm4gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChib3hHZW9tZXRy
eSk7Ci0KLSAgICBhdXRvKiBjdXJyZW50TGF5b3V0Qm94ID0gJmxheW91dEJveDsKLSAgICB3aGls
ZSAoY3VycmVudExheW91dEJveCkgewotICAgICAgICBpZiAoIWN1cnJlbnRMYXlvdXRCb3gtPnBy
ZXZpb3VzSW5GbG93U2libGluZygpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGF1dG8m
IHByZXZpb3VzSW5GbG93U2libGluZyA9ICpjdXJyZW50TGF5b3V0Qm94LT5wcmV2aW91c0luRmxv
d1NpYmxpbmcoKTsKLSAgICAgICAgaWYgKCFtYXJnaW5Db2xsYXBzZSgpLm1hcmdpbkJlZm9yZUNv
bGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVudExheW91dEJveCkp
IHsKLSAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9tZXRyeUZvckJv
eChwcmV2aW91c0luRmxvd1NpYmxpbmcpOwotICAgICAgICAgICAgcmV0dXJuIEJveEdlb21ldHJ5
OjptYXJnaW5Cb3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsgbWFyZ2luQmVm
b3JlKHZlcnRpY2FsTWFyZ2luKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbWFyZ2luQ29s
bGFwc2UoKS5tYXJnaW5zQ29sbGFwc2VUaHJvdWdoKHByZXZpb3VzSW5GbG93U2libGluZykpIHsK
LSAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9tZXRyeUZvckJveChw
cmV2aW91c0luRmxvd1NpYmxpbmcpOwotICAgICAgICAgICAgcmV0dXJuIEJveEdlb21ldHJ5Ojpi
b3JkZXJCb3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsgbWFyZ2luQmVmb3Jl
KHZlcnRpY2FsTWFyZ2luKTsKLSAgICAgICAgfQotICAgICAgICBjdXJyZW50TGF5b3V0Qm94ID0g
JnByZXZpb3VzSW5GbG93U2libGluZzsKLSAgICB9Ci0KLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9j
a0NvbnRlbnRCb3hUb3AgPSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7Ci0gICAgLy8g
QWRqdXN0IHZlcnRpY2FsIHBvc2l0aW9uIGRlcGVuZGluZyB3aGV0aGVyIHRoaXMgYm94IGRpcmVj
dGx5IG9yIGluZGlyZWN0bHkgYWRqb2lucyB3aXRoIGl0cyBwYXJlbnQuCi0gICAgYXV0byBkaXJl
Y3RseUFkam9pbnNQYXJlbnQgPSAhbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpOwot
ICAgIGlmIChkaXJlY3RseUFkam9pbnNQYXJlbnQpIHsKLSAgICAgICAgLy8gSWYgdGhlIHRvcCBh
bmQgYm90dG9tIG1hcmdpbnMgb2YgYSBib3ggYXJlIGFkam9pbmluZywgdGhlbiBpdCBpcyBwb3Nz
aWJsZSBmb3IgbWFyZ2lucyB0byBjb2xsYXBzZSB0aHJvdWdoIGl0LgotICAgICAgICAvLyBJbiB0
aGlzIGNhc2UsIHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBkZXBlbmRzIG9uIGl0cyByZWxh
dGlvbnNoaXAgd2l0aCB0aGUgb3RoZXIgZWxlbWVudHMgd2hvc2UgbWFyZ2lucyBhcmUgYmVpbmcg
Y29sbGFwc2VkLgotICAgICAgICBpZiAodmVydGljYWxNYXJnaW4uY29sbGFwc2VkVmFsdWVzLmlz
Q29sbGFwc2VkVGhyb3VnaCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQncyBtYXJn
aW5zIGFyZSBjb2xsYXBzZWQgd2l0aCBpdHMgcGFyZW50J3MgdG9wIG1hcmdpbiwgdGhlIHRvcCBi
b3JkZXIgZWRnZSBvZiB0aGUgYm94IGlzIGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHBh
cmVudCdzLgotICAgICAgICAgICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29s
bGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQotICAgICAgICAgICAgICAg
IHJldHVybiBjb250YWluaW5nQmxvY2tDb250ZW50Qm94VG9wOwotICAgICAgICAgICAgLy8gT3Ro
ZXJ3aXNlLCBlaXRoZXIgdGhlIGVsZW1lbnQncyBwYXJlbnQgaXMgbm90IHRha2luZyBwYXJ0IGlu
IHRoZSBtYXJnaW4gY29sbGFwc2luZywgb3Igb25seSB0aGUgcGFyZW50J3MgYm90dG9tIG1hcmdp
biBpcyBpbnZvbHZlZC4KLSAgICAgICAgICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVu
dCdzIHRvcCBib3JkZXIgZWRnZSBpcyB0aGUgc2FtZSBhcyBpdCB3b3VsZCBoYXZlIGJlZW4gaWYg
dGhlIGVsZW1lbnQgaGFkIGEgbm9uLXplcm8gYm90dG9tIGJvcmRlci4KLSAgICAgICAgICAgIGF1
dG8gYmVmb3JlTWFyZ2luV2l0aEJvdHRvbUJvcmRlciA9IG1hcmdpbkNvbGxhcHNlKCkubWFyZ2lu
QmVmb3JlSWdub3JpbmdDb2xsYXBzaW5nVGhyb3VnaChsYXlvdXRCb3gsIHZlcnRpY2FsTWFyZ2lu
Lm5vbkNvbGxhcHNlZFZhbHVlcyk7Ci0gICAgICAgICAgICByZXR1cm4gY29udGFpbmluZ0Jsb2Nr
Q29udGVudEJveFRvcCArIGJlZm9yZU1hcmdpbldpdGhCb3R0b21Cb3JkZXI7Ci0gICAgICAgIH0K
LSAgICAgICAgLy8gTm9uLWNvbGxhcHNlZCB0aHJvdWdoIGJveCB2ZXJ0aWNhbCBwb3NpdGlvbiBk
ZXBlbmRpbmcgd2hldGhlciB0aGUgbWFyZ2luIGNvbGxhcHNlcy4KLSAgICAgICAgaWYgKG1hcmdp
bkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShs
YXlvdXRCb3gpKQotICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hU
b3A7Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgKyBtYXJn
aW5CZWZvcmUodmVydGljYWxNYXJnaW4pOwotICAgIH0KLSAgICAvLyBBdCB0aGlzIHBvaW50IHRo
aXMgYm94IGluZGlyZWN0bHkgKHZpYSBjb2xsYXBzZWQgdGhyb3VnaCBwcmV2aW91cyBpbi1mbG93
IHNpYmxpbmdzKSBhZGpvaW5zIHRoZSBwYXJlbnQuIExldCdzIGNoZWNrIGlmIGl0IG1hcmdpbiBj
b2xsYXBzZXMgd2l0aCB0aGUgcGFyZW50LgotICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxh
eW91dEJveC5jb250YWluaW5nQmxvY2soKTsKLSAgICBBU1NFUlQoY29udGFpbmluZ0Jsb2NrLmZp
cnN0SW5GbG93Q2hpbGQoKSk7Ci0gICAgQVNTRVJUKGNvbnRhaW5pbmdCbG9jay5maXJzdEluRmxv
d0NoaWxkKCkgIT0gJmxheW91dEJveCk7Ci0gICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2lu
QmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZSgqY29udGFpbmluZ0Jsb2NrLmZp
cnN0SW5GbG93Q2hpbGQoKSkpCi0gICAgICAgIHJldHVybiBjb250YWluaW5nQmxvY2tDb250ZW50
Qm94VG9wOwotCi0gICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgKyBtYXJn
aW5CZWZvcmUodmVydGljYWxNYXJnaW4pOwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdD
b250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9y
bWF0dGluZ0NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkOTk2OTNl
ODdjZDBiMGYxMzJlYWM3MTM2OTBlMGI3MDUyZTEyOS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0
aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1B
VFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5j
bHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotI2lu
Y2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1jbGFzcyBM
YXlvdXRVbml0OwotCi1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgQm94OwotY2xhc3MgRmxv
YXRpbmdDb250ZXh0OwotCi0vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGxheW91dCBsb2dp
YyBmb3IgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cy4KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9U
Ui9DU1MyMi92aXN1cmVuLmh0bWwjYmxvY2stZm9ybWF0dGluZwotY2xhc3MgQmxvY2tGb3JtYXR0
aW5nQ29udGV4dCA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dCB7Ci0gICAgV1RGX01BS0VfSVNP
X0FMTE9DQVRFRChCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KTsKLXB1YmxpYzoKLSAgICBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290
LCBCbG9ja0Zvcm1hdHRpbmdTdGF0ZSYpOwotCi0gICAgdm9pZCBsYXlvdXRJbkZsb3dDb250ZW50
KEludmFsaWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jikg
b3ZlcnJpZGU7Ci0gICAgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0IG92ZXJy
aWRlOwotCi1wcm90ZWN0ZWQ6Ci0gICAgc3RydWN0IENvbnN0cmFpbnRzUGFpciB7Ci0gICAgICAg
IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBmb3JtYXR0aW5nQ29udGV4dFJvb3Q7Ci0gICAg
ICAgIENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBjb250YWluaW5nQmxvY2s7Ci0gICAgfTsK
LSAgICB2b2lkIHBsYWNlSW5GbG93UG9zaXRpb25lZENoaWxkcmVuKGNvbnN0IENvbnRhaW5lckJv
eCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOwotCi0gICAgdm9pZCBjb21wdXRlV2lk
dGhBbmRNYXJnaW4oY29uc3QgRmxvYXRpbmdDb250ZXh0JiwgY29uc3QgQm94JiwgY29uc3QgQ29u
c3RyYWludHNQYWlyJik7Ci0gICAgdm9pZCBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJv
eCYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOwotCi0gICAgdm9pZCBjb21w
dXRlU3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYpOwotICAgIHZvaWQgY29tcHV0ZVN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29u
c3QgQm94JiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYpOwotICAgIHZvaWQgY29tcHV0ZVBv
c2l0aW9uVG9Bdm9pZEZsb2F0cyhjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBCb3gmLCBj
b25zdCBDb25zdHJhaW50c1BhaXImKTsKLSAgICB2b2lkIGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9u
Rm9yRmxvYXRDbGVhcihjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBCb3gmKTsKLQotICAg
IHZvaWQgcHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMoY29uc3Qg
Qm94JiwgY29uc3QgQ29uc3RyYWludHNQYWlyJik7Ci0KLSAgICBJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpIG92ZXJyaWRlOwotCi0g
ICAgTGF5b3V0VW5pdCB2ZXJ0aWNhbFBvc2l0aW9uV2l0aE1hcmdpbihjb25zdCBCb3gmLCBjb25z
dCBVc2VkVmVydGljYWxNYXJnaW4mLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJikgY29uc3Q7
Ci0KLSAgICAvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgcG9zaXRpb25pbmcgYW5kIHNpemluZyBm
b3IgYm94ZXMgcGFydGljaXBhdGluZyBpbiBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dC4KLSAg
ICBjbGFzcyBHZW9tZXRyeSA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgewot
ICAgIHB1YmxpYzoKLSAgICAgICAgR2VvbWV0cnkoY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dCYpOwotCi0gICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5GbG93Q29udGVudEhlaWdo
dEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25z
dCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKTsKLSAgICAgICAgQ29udGVudFdpZHRoQW5kTWFy
Z2luIGluRmxvd0NvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYpOwotCi0g
ICAgICAgIFBvaW50IHN0YXRpY1Bvc2l0aW9uKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmKSBjb25zdDsKLSAgICAgICAg
TGF5b3V0VW5pdCBzdGF0aWNWZXJ0aWNhbFBvc2l0aW9uKGNvbnN0IEJveCYsIGNvbnN0IFZlcnRp
Y2FsQ29uc3RyYWludHMmKSBjb25zdDsKLSAgICAgICAgTGF5b3V0VW5pdCBzdGF0aWNIb3Jpem9u
dGFsUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJikgY29u
c3Q7Ci0KLSAgICAgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzKGNvbnN0IEJveCYpOwotCi0gICAgICAgIENvbnRlbnRXaWR0aEFuZE1hcmdpbiBj
b21wdXRlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFs
Q29uc3RyYWludHMmLCBPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVXaWR0aEZsb2F0QXZv
aWRlcik7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGlu
Rmxvd05vblJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBI
b3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKTsK
LSAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGluRmxvd05vblJlcGxhY2VkQ29udGVudFdp
ZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNv
bnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0gICAgICAgIENvbnRlbnRXaWR0aEFu
ZE1hcmdpbiBpbkZsb3dSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBSZXBsYWNl
ZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzJik7Ci0KLSAgICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYg
Zm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0PihGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZvcm1hdHRpbmdDb250ZXh0
KCkpOyB9Ci0gICAgfTsKLSAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSBnZW9t
ZXRyeSgpIGNvbnN0IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlzKTsgfQotCi0gICAgLy8gVGhpcyBj
bGFzcyBpbXBsZW1lbnRzIG1hcmdpbiBjb2xsYXBzaW5nIGZvciBibG9jayBmb3JtYXR0aW5nIGNv
bnRleHQuCi0gICAgY2xhc3MgTWFyZ2luQ29sbGFwc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAg
VXNlZFZlcnRpY2FsTWFyZ2luIGNvbGxhcHNlZFZlcnRpY2FsVmFsdWVzKGNvbnN0IEJveCYsIFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsKLQotICAgICAgICBQcmVjb21w
dXRlZE1hcmdpbkJlZm9yZSBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZShjb25zdCBCb3gmLCBVc2Vk
VmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyk7Ci0gICAgICAgIExheW91dFVuaXQg
bWFyZ2luQmVmb3JlSWdub3JpbmdDb2xsYXBzaW5nVGhyb3VnaChjb25zdCBCb3gmLCBVc2VkVmVy
dGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyk7Ci0gICAgICAgIHN0YXRpYyB2b2lkIHVw
ZGF0ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nKEJsb2NrRm9ybWF0dGluZ0NvbnRleHQm
LCBjb25zdCBNYXJnaW5Db2xsYXBzZSYsIGNvbnN0IEJveCYpOwotCi0gICAgICAgIGJvb2wgbWFy
Z2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShjb25zdCBCb3gmKSBjb25z
dDsKLSAgICAgICAgYm9vbCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoRmlyc3RJbkZsb3dDaGls
ZE1hcmdpbkJlZm9yZShjb25zdCBCb3gmKSBjb25zdDsKLSAgICAgICAgYm9vbCBtYXJnaW5CZWZv
cmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94JikgY29uc3Q7Ci0gICAg
ICAgIGJvb2wgbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFm
dGVyKGNvbnN0IEJveCYpIGNvbnN0OwotCi0gICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBz
ZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94JikgY29uc3Q7Ci0gICAgICAgIGJvb2wg
bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoTGFzdEluRmxvd0NoaWxkTWFyZ2luQWZ0ZXIoY29uc3Qg
Qm94JikgY29uc3Q7Ci0gICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50
TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OwotICAgICAgICBib29sIG1hcmdpbkFmdGVy
Q29sbGFwc2VzV2l0aE5leHRTaWJsaW5nTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0Owot
ICAgICAgICBib29sIG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVX
aXRoQ2xlYXJhbmNlKGNvbnN0IEJveCYpIGNvbnN0OwotCi0gICAgICAgIGJvb2wgbWFyZ2luc0Nv
bGxhcHNlVGhyb3VnaChjb25zdCBCb3gmKSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAg
IGZyaWVuZCBjbGFzcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OwotICAgICAgICBNYXJnaW5Db2xs
YXBzZShjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Jik7Ci0KLSAgICAgICAgZW51bSBjbGFz
cyBNYXJnaW5UeXBlIHsgQmVmb3JlLCBBZnRlciB9OwotICAgICAgICBVc2VkVmVydGljYWxNYXJn
aW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcG9zaXRpdmVOZWdhdGl2ZVZhbHVl
cyhjb25zdCBCb3gmLCBNYXJnaW5UeXBlKSBjb25zdDsKLSAgICAgICAgVXNlZFZlcnRpY2FsTWFy
Z2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHBvc2l0aXZlTmVnYXRpdmVNYXJn
aW5CZWZvcmUoY29uc3QgQm94JiwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1
ZXMpIGNvbnN0OwotICAgICAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRp
dmVQYWlyOjpWYWx1ZXMgcG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkFmdGVyKGNvbnN0IEJveCYsIFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdDsKLQotICAgICAgICBV
c2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcHJlY29t
cHV0ZWRQb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYsIFVzZWRWZXJ0aWNh
bE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdDsKLSAgICAgICAgVXNlZFZlcnRpY2Fs
TWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHByZWNvbXB1dGVkUG9zaXRp
dmVOZWdhdGl2ZVZhbHVlcyhjb25zdCBCb3gmKSBjb25zdDsKLQotICAgICAgICBVc2VkVmVydGlj
YWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgY29tcHV0ZWRQb3NpdGl2
ZUFuZE5lZ2F0aXZlTWFyZ2luKFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2
ZVBhaXI6OlZhbHVlcywgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFp
cjo6VmFsdWVzKSBjb25zdDsKLSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gbWFyZ2luVmFs
dWUoVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzKSBj
b25zdDsKLQotICAgICAgICBib29sIGhhc0NsZWFyYW5jZShjb25zdCBCb3gmKSBjb25zdDsKLQot
ICAgICAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSB7IHJldHVybiBtX2Jsb2NrRm9ybWF0
dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQotICAgICAgICBjb25zdCBMYXlvdXRTdGF0ZSYg
bGF5b3V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2Jsb2NrRm9ybWF0dGluZ0NvbnRleHQubGF5
b3V0U3RhdGUoKTsgfQotICAgICAgICBjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBmb3Jt
YXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4dDsg
fQotCi0gICAgICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIG1fYmxvY2tGb3JtYXR0
aW5nQ29udGV4dDsKLSAgICB9OwotICAgIE1hcmdpbkNvbGxhcHNlIG1hcmdpbkNvbGxhcHNlKCkg
Y29uc3QgeyByZXR1cm4gTWFyZ2luQ29sbGFwc2UoKnRoaXMpOyB9Ci0KLSAgICBjbGFzcyBRdWly
a3MgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyB7Ci0gICAgcHVibGljOgotICAg
ICAgICBRdWlya3MoY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0gICAgICAgIGJv
b2wgbmVlZHNTdHJldGNoaW5nKGNvbnN0IEJveCYpIGNvbnN0OwotICAgICAgICBMYXlvdXRVbml0
IHN0cmV0Y2hlZEluRmxvd0hlaWdodChjb25zdCBCb3gmLCBDb250ZW50SGVpZ2h0QW5kTWFyZ2lu
KTsKLQotICAgICAgICBib29sIHNob3VsZElnbm9yZUNvbGxhcHNlZFF1aXJrTWFyZ2luKGNvbnN0
IEJveCYpIGNvbnN0OwotICAgICAgICBib29sIHNob3VsZENvbGxhcHNlTWFyZ2luQmVmb3JlV2l0
aFBhcmVudE1hcmdpbkJlZm9yZShjb25zdCBCb3gmKSBjb25zdDsKLSAgICAgICAgYm9vbCBzaG91
bGRDb2xsYXBzZU1hcmdpbkFmdGVyV2l0aFBhcmVudE1hcmdpbkFmdGVyKGNvbnN0IEJveCYpIGNv
bnN0OwotCi0gICAgICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdD
b250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8QmxvY2tGb3JtYXR0aW5nQ29udGV4dD4o
Rm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KLSAgICAg
ICAgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJl
dHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCk7IH0KLQotICAgIH07Ci0gICAgQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzIHF1aXJrcygpIGNvbnN0IHsgcmV0dXJuIFF1aXJr
cygqdGhpcyk7IH0KLQotICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRBdmFpbGFibGVXaWR0
aEZvckZsb2F0QXZvaWRlcihjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBCb3gmLCBjb25z
dCBDb25zdHJhaW50c1BhaXImKTsKLQotICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBm
b3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdT
dGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQotICAgIEJsb2Nr
Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3duY2FzdDxCbG9j
a0Zvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsg
fQotCi0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICB2b2lkIHNldFByZWNvbXB1dGVkTWFyZ2luQmVm
b3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBQcmVjb21wdXRlZE1hcmdpbkJlZm9yZSYg
cHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUpIHsgbV9wcmVjb21wdXRlZE1hcmdpbkJlZm9yZUxpc3Qu
c2V0KCZsYXlvdXRCb3gsIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKTsgfQotICAgIFByZWNvbXB1
dGVkTWFyZ2luQmVmb3JlIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0
Qm94KSBjb25zdCB7IHJldHVybiBtX3ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlTGlzdC5nZXQoJmxh
eW91dEJveCk7IH0KLSAgICBib29sIGhhc1ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJv
eCYgbGF5b3V0Qm94KSBjb25zdCB7IHJldHVybiBtX3ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlTGlz
dC5jb250YWlucygmbGF5b3V0Qm94KTsgfQotI2VuZGlmCi1wcml2YXRlOgotICAgIEhhc2hNYXA8
Y29uc3QgQm94KiwgUHJlY29tcHV0ZWRNYXJnaW5CZWZvcmU+IG1fcHJlY29tcHV0ZWRNYXJnaW5C
ZWZvcmVMaXN0OwotfTsKLQotaW5saW5lIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5
OjpHZW9tZXRyeShjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBibG9ja0Zvcm1hdHRpbmdD
b250ZXh0KQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5KGJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQpCi17Ci19Ci0KLWlubGluZSBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6
OlF1aXJrcyhjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBibG9ja0Zvcm1hdHRpbmdDb250
ZXh0KQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyhibG9ja0Zvcm1hdHRpbmdDb250
ZXh0KQotewotfQotCi1pbmxpbmUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFw
c2U6Ok1hcmdpbkNvbGxhcHNlKGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2NrRm9y
bWF0dGluZ0NvbnRleHQpCi0gICAgOiBtX2Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoYmxvY2tGb3Jt
YXR0aW5nQ29udGV4dCkKLXsKLX0KLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xB
WU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCwgaXNCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3Bw
IGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdD
b250ZXh0R2VvbWV0cnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTFhMmI0
MTZjNjdkZTVmMjQ1ZDUyYzE1ZGI2MzQzNThkY2NiNWIxLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1h
dHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorKysgL2Rldi9udWxsCkBA
IC0xLDQwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1
ZGUgIkJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNs
dWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0
ZS5oIgotI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q2hp
bGRJdGVyYXRvci5oIgotI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKLSNpbmNsdWRlICJMYXlv
dXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCi0jaW5jbHVkZSAiTGF5b3V0UmVwbGFjZWRCb3gu
aCIKLSNpbmNsdWRlICJMb2dnaW5nLmgiCi0jaW5jbHVkZSA8d3RmL3RleHQvVGV4dFN0cmVhbS5o
PgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotQ29udGVudEhl
aWdodEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93Tm9u
UmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3Zl
cnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpCi17Ci0gICAg
QVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgp
KTsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3ZlcmZsb3dWaXNpYmxlKCkpOwotCi0gICAgYXV0
byBjb21wdXRlID0gWyZdKGNvbnN0IGF1dG8mIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgLT4g
Q29udGVudEhlaWdodEFuZE1hcmdpbiB7Ci0KLSAgICAgICAgLy8gMTAuNi4zIEJsb2NrLWxldmVs
IG5vbi1yZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdyB3aGVuICdvdmVyZmxvdycgY29t
cHV0ZXMgdG8gJ3Zpc2libGUnCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElmICdtYXJnaW4tdG9w
Jywgb3IgJ21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHRoZWlyIHVzZWQgdmFsdWUgaXMgMC4K
LSAgICAgICAgLy8gSWYgJ2hlaWdodCcgaXMgJ2F1dG8nLCB0aGUgaGVpZ2h0IGRlcGVuZHMgb24g
d2hldGhlciB0aGUgZWxlbWVudCBoYXMgYW55IGJsb2NrLWxldmVsIGNoaWxkcmVuIGFuZCB3aGV0
aGVyIGl0IGhhcyBwYWRkaW5nIG9yIGJvcmRlcnM6Ci0gICAgICAgIC8vIFRoZSBlbGVtZW50J3Mg
aGVpZ2h0IGlzIHRoZSBkaXN0YW5jZSBmcm9tIGl0cyB0b3AgY29udGVudCBlZGdlIHRvIHRoZSBm
aXJzdCBhcHBsaWNhYmxlIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vIDEuIHRoZSBib3R0
b20gZWRnZSBvZiB0aGUgbGFzdCBsaW5lIGJveCwgaWYgdGhlIGJveCBlc3RhYmxpc2hlcyBhIGlu
bGluZSBmb3JtYXR0aW5nIGNvbnRleHQgd2l0aCBvbmUgb3IgbW9yZSBsaW5lcwotICAgICAgICAv
LyAyLiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGJvdHRvbSAocG9zc2libHkgY29sbGFwc2VkKSBt
YXJnaW4gb2YgaXRzIGxhc3QgaW4tZmxvdyBjaGlsZCwgaWYgdGhlIGNoaWxkJ3MgYm90dG9tIG1h
cmdpbgotICAgICAgICAvLyAgICBkb2VzIG5vdCBjb2xsYXBzZSB3aXRoIHRoZSBlbGVtZW50J3Mg
Ym90dG9tIG1hcmdpbgotICAgICAgICAvLyAzLiB0aGUgYm90dG9tIGJvcmRlciBlZGdlIG9mIHRo
ZSBsYXN0IGluLWZsb3cgY2hpbGQgd2hvc2UgdG9wIG1hcmdpbiBkb2Vzbid0IGNvbGxhcHNlIHdp
dGggdGhlIGVsZW1lbnQncyBib3R0b20gbWFyZ2luCi0gICAgICAgIC8vIDQuIHplcm8sIG90aGVy
d2lzZQotICAgICAgICAvLyBPbmx5IGNoaWxkcmVuIGluIHRoZSBub3JtYWwgZmxvdyBhcmUgdGFr
ZW4gaW50byBhY2NvdW50IChpLmUuLCBmbG9hdGluZyBib3hlcyBhbmQgYWJzb2x1dGVseSBwb3Np
dGlvbmVkIGJveGVzIGFyZSBpZ25vcmVkLAotICAgICAgICAvLyBhbmQgcmVsYXRpdmVseSBwb3Np
dGlvbmVkIGJveGVzIGFyZSBjb25zaWRlcmVkIHdpdGhvdXQgdGhlaXIgb2Zmc2V0KS4gTm90ZSB0
aGF0IHRoZSBjaGlsZCBib3ggbWF5IGJlIGFuIGFub255bW91cyBibG9jayBib3guCi0KLSAgICAg
ICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94
KGxheW91dEJveCk7Ci0gICAgICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21l
dHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFp
bnRzKTsKLSAgICAgICAgYXV0byBub25Db2xsYXBzZWRNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJn
aW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZh
bHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OyAKLSAg
ICAgICAgYXV0byBib3JkZXJBbmRQYWRkaW5nVG9wID0gYm94R2VvbWV0cnkuYm9yZGVyVG9wKCkg
KyBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwKTsKLSAgICAgICAgYXV0byBoZWln
aHQgPSBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVpZ2h0ID8gb3ZlcnJpZGRlblZlcnRpY2Fs
VmFsdWVzLmhlaWdodC52YWx1ZSgpIDogY29tcHV0ZWRIZWlnaHQobGF5b3V0Qm94KTsKLQotICAg
ICAgICBpZiAoaGVpZ2h0KQotICAgICAgICAgICAgcmV0dXJuIHsgKmhlaWdodCwgbm9uQ29sbGFw
c2VkTWFyZ2luIH07Ci0KLSAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkg
fHwgIWRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dDaGlsZCgpKQot
ICAgICAgICAgICAgcmV0dXJuIHsgMCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0KLSAgICAgICAg
Ly8gMS4gdGhlIGJvdHRvbSBlZGdlIG9mIHRoZSBsYXN0IGxpbmUgYm94LCBpZiB0aGUgYm94IGVz
dGFibGlzaGVzIGEgaW5saW5lIGZvcm1hdHRpbmcgY29udGV4dCB3aXRoIG9uZSBvciBtb3JlIGxp
bmVzCi0gICAgICAgIGF1dG8mIGxheW91dENvbnRhaW5lciA9IGRvd25jYXN0PENvbnRhaW5lckJv
eD4obGF5b3V0Qm94KTsKLSAgICAgICAgaWYgKGxheW91dENvbnRhaW5lci5lc3RhYmxpc2hlc0lu
bGluZUZvcm1hdHRpbmdDb250ZXh0KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGlubGluZUZvcm1h
dHRpbmdTdGF0ZSA9IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3Rh
dGUobGF5b3V0Q29udGFpbmVyKTsKLSAgICAgICAgICAgIGF1dG8mIGxpbmVzID0gaW5saW5lRm9y
bWF0dGluZ1N0YXRlLmxpbmVzKCk7Ci0gICAgICAgICAgICAvLyBFdmVuIGVtcHR5IGNvbnRhaW5l
cnMgZ2VuZXJhdGUgb25lIGxpbmUuIAotICAgICAgICAgICAgQVNTRVJUKCFsaW5lcy5pc0VtcHR5
KCkpOwotICAgICAgICAgICAgcmV0dXJuIHsgdG9MYXlvdXRVbml0KGxpbmVzLmxhc3QoKS5saW5l
Qm94TG9naWNhbFJlY3QoKS5ib3R0b20oKSArIGlubGluZUZvcm1hdHRpbmdTdGF0ZS5jbGVhckdh
cEFmdGVyTGFzdExpbmUoKSkgLSBib3JkZXJBbmRQYWRkaW5nVG9wLCBub25Db2xsYXBzZWRNYXJn
aW4gfTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDIuIHRoZSBib3R0b20gZWRnZSBvZiB0aGUg
Ym90dG9tIChwb3NzaWJseSBjb2xsYXBzZWQpIG1hcmdpbiBvZiBpdHMgbGFzdCBpbi1mbG93IGNo
aWxkLCBpZiB0aGUgY2hpbGQncyBib3R0b20gbWFyZ2luLi4uCi0gICAgICAgIGF1dG8mIGxhc3RJ
bkZsb3dDaGlsZCA9ICpsYXlvdXRDb250YWluZXIubGFzdEluRmxvd0NoaWxkKCk7Ci0gICAgICAg
IGlmICghZm9ybWF0dGluZ0NvbnRleHQoKS5tYXJnaW5Db2xsYXBzZSgpLm1hcmdpbkFmdGVyQ29s
bGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKGxhc3RJbkZsb3dDaGlsZCkpIHsKLSAgICAgICAg
ICAgIGF1dG8mIGxhc3RJbkZsb3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2Vv
bWV0cnlGb3JCb3gobGFzdEluRmxvd0NoaWxkKTsKLSAgICAgICAgICAgIGF1dG8gYm90dG9tRWRn
ZU9mQm90dG9tTWFyZ2luID0gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QobGFzdEluRmxvd0Jv
eEdlb21ldHJ5KS5ib3R0b20oKSArIGxhc3RJbkZsb3dCb3hHZW9tZXRyeS5tYXJnaW5BZnRlcigp
OwotICAgICAgICAgICAgcmV0dXJuIHsgYm90dG9tRWRnZU9mQm90dG9tTWFyZ2luIC0gYm9yZGVy
QW5kUGFkZGluZ1RvcCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0gICAgICAgIH0KLQotICAgICAg
ICAvLyAzLiB0aGUgYm90dG9tIGJvcmRlciBlZGdlIG9mIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQg
d2hvc2UgdG9wIG1hcmdpbiBkb2Vzbid0IGNvbGxhcHNlIHdpdGggdGhlIGVsZW1lbnQncyBib3R0
b20gbWFyZ2luCi0gICAgICAgIGF1dG8qIGluRmxvd0NoaWxkID0gJmxhc3RJbkZsb3dDaGlsZDsK
LSAgICAgICAgd2hpbGUgKGluRmxvd0NoaWxkICYmIGZvcm1hdHRpbmdDb250ZXh0KCkubWFyZ2lu
Q29sbGFwc2UoKS5tYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoKmlu
Rmxvd0NoaWxkKSkKLSAgICAgICAgICAgIGluRmxvd0NoaWxkID0gaW5GbG93Q2hpbGQtPnByZXZp
b3VzSW5GbG93U2libGluZygpOwotICAgICAgICBpZiAoaW5GbG93Q2hpbGQpIHsKLSAgICAgICAg
ICAgIGF1dG8mIGluRmxvd0JveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRy
eUZvckJveCgqaW5GbG93Q2hpbGQpOwotICAgICAgICAgICAgcmV0dXJuIHsgQm94R2VvbWV0cnk6
OmJvcmRlckJveFRvcChpbkZsb3dCb3hHZW9tZXRyeSkgKyBpbkZsb3dCb3hHZW9tZXRyeS5ib3Jk
ZXJCb3goKS5oZWlnaHQoKSAtIGJvcmRlckFuZFBhZGRpbmdUb3AsIG5vbkNvbGxhcHNlZE1hcmdp
biB9OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gNC4gemVybywgb3RoZXJ3aXNlCi0gICAgICAg
IHJldHVybiB7IDAsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OwotICAgIH07Ci0KLSAgICAvLyAxMC42
LjcgJ0F1dG8nIGhlaWdodHMgZm9yIGJsb2NrLWxldmVsIGZvcm1hdHRpbmcgY29udGV4dCBib3hl
cy4KLSAgICBhdXRvIGlzQXV0b0hlaWdodCA9ICFvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVp
Z2h0ICYmICFjb21wdXRlZEhlaWdodChsYXlvdXRCb3gpOwotICAgIGlmIChpc0F1dG9IZWlnaHQg
JiYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkgJiYgIWxheW91dEJv
eC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpKQotICAgICAgICByZXR1cm4g
Y29tcHV0ZSggT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzIHsgY29udGVudEhlaWdodEZvckZvcm1h
dHRpbmdDb250ZXh0Um9vdChkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkpIH0pOwot
ICAgIHJldHVybiBjb21wdXRlKG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci19Ci0KLUNvbnRl
bnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93
Tm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNv
bnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBP
dmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCi17
Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpKTsKLQotICAgIGF1dG8gY29tcHV0ZSA9
IFsmXSgpIHsKLQotICAgICAgICAvLyAxMC4zLjMgQmxvY2stbGV2ZWwsIG5vbi1yZXBsYWNlZCBl
bGVtZW50cyBpbiBub3JtYWwgZmxvdwotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgZm9sbG93
aW5nIGNvbnN0cmFpbnRzIG11c3QgaG9sZCBhbW9uZyB0aGUgdXNlZCB2YWx1ZXMgb2YgdGhlIG90
aGVyIHByb3BlcnRpZXM6Ci0gICAgICAgIC8vICdtYXJnaW4tbGVmdCcgKyAnYm9yZGVyLWxlZnQt
d2lkdGgnICsgJ3BhZGRpbmctbGVmdCcgKyAnd2lkdGgnICsgJ3BhZGRpbmctcmlnaHQnICsgJ2Jv
cmRlci1yaWdodC13aWR0aCcgKyAnbWFyZ2luLXJpZ2h0JyA9IHdpZHRoIG9mIGNvbnRhaW5pbmcg
YmxvY2sKLSAgICAgICAgLy8KLSAgICAgICAgLy8gMS4gSWYgJ3dpZHRoJyBpcyBub3QgJ2F1dG8n
IGFuZCAnYm9yZGVyLWxlZnQtd2lkdGgnICsgJ3BhZGRpbmctbGVmdCcgKyAnd2lkdGgnICsgJ3Bh
ZGRpbmctcmlnaHQnICsgJ2JvcmRlci1yaWdodC13aWR0aCcgCi0gICAgICAgIC8vICAgIChwbHVz
IGFueSBvZiAnbWFyZ2luLWxlZnQnIG9yICdtYXJnaW4tcmlnaHQnIHRoYXQgYXJlIG5vdCAnYXV0
bycpIGlzIGxhcmdlciB0aGFuIHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmluZyBibG9jaywgdGhl
bgotICAgICAgICAvLyAgICBhbnkgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi1sZWZ0JyBvciAn
bWFyZ2luLXJpZ2h0JyBhcmUsIGZvciB0aGUgZm9sbG93aW5nIHJ1bGVzLCB0cmVhdGVkIGFzIHpl
cm8uCi0gICAgICAgIC8vCi0gICAgICAgIC8vIDIuIElmIGFsbCBvZiB0aGUgYWJvdmUgaGF2ZSBh
IGNvbXB1dGVkIHZhbHVlIG90aGVyIHRoYW4gJ2F1dG8nLCB0aGUgdmFsdWVzIGFyZSBzYWlkIHRv
IGJlICJvdmVyLWNvbnN0cmFpbmVkIiBhbmQgb25lIG9mIHRoZSB1c2VkIHZhbHVlcyB3aWxsCi0g
ICAgICAgIC8vICAgIGhhdmUgdG8gYmUgZGlmZmVyZW50IGZyb20gaXRzIGNvbXB1dGVkIHZhbHVl
LiBJZiB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaGFz
IHRoZSB2YWx1ZSAnbHRyJywgdGhlIHNwZWNpZmllZCB2YWx1ZQotICAgICAgICAvLyAgICBvZiAn
bWFyZ2luLXJpZ2h0JyBpcyBpZ25vcmVkIGFuZCB0aGUgdmFsdWUgaXMgY2FsY3VsYXRlZCBzbyBh
cyB0byBtYWtlIHRoZSBlcXVhbGl0eSB0cnVlLiBJZiB0aGUgdmFsdWUgb2YgJ2RpcmVjdGlvbicg
aXMgJ3J0bCcsCi0gICAgICAgIC8vICAgIHRoaXMgaGFwcGVucyB0byAnbWFyZ2luLWxlZnQnIGlu
c3RlYWQuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIDMuIElmIHRoZXJlIGlzIGV4YWN0bHkgb25l
IHZhbHVlIHNwZWNpZmllZCBhcyAnYXV0bycsIGl0cyB1c2VkIHZhbHVlIGZvbGxvd3MgZnJvbSB0
aGUgZXF1YWxpdHkuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIDQuIElmICd3aWR0aCcgaXMgc2V0
IHRvICdhdXRvJywgYW55IG90aGVyICdhdXRvJyB2YWx1ZXMgYmVjb21lICcwJyBhbmQgJ3dpZHRo
JyBmb2xsb3dzIGZyb20gdGhlIHJlc3VsdGluZyBlcXVhbGl0eS4KLSAgICAgICAgLy8KLSAgICAg
ICAgLy8gNS4gSWYgYm90aCAnbWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyBhcmUgJ2F1
dG8nLCB0aGVpciB1c2VkIHZhbHVlcyBhcmUgZXF1YWwuIFRoaXMgaG9yaXpvbnRhbGx5IGNlbnRl
cnMgdGhlIGVsZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoZQotICAgICAgICAvLyAgICBlZGdlcyBv
ZiB0aGUgY29udGFpbmluZyBibG9jay4KLQotICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dp
ZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAgICAgICAgYXV0byYg
Y29udGFpbmluZ0Jsb2NrU3R5bGUgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkuc3R5bGUo
KTsKLSAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21l
dHJ5Rm9yQm94KGxheW91dEJveCk7Ci0KLSAgICAgICAgYXV0byB3aWR0aCA9IG92ZXJyaWRkZW5I
b3Jpem9udGFsVmFsdWVzLndpZHRoID8gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGgg
OiBjb21wdXRlZFdpZHRoKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgICAg
ICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6
b250YWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgICAgICBV
c2VkSG9yaXpvbnRhbE1hcmdpbiB1c2VkSG9yaXpvbnRhbE1hcmdpbjsKLSAgICAgICAgYXV0byBi
b3JkZXJMZWZ0ID0gYm94R2VvbWV0cnkuYm9yZGVyTGVmdCgpOwotICAgICAgICBhdXRvIGJvcmRl
clJpZ2h0ID0gYm94R2VvbWV0cnkuYm9yZGVyUmlnaHQoKTsKLSAgICAgICAgYXV0byBwYWRkaW5n
TGVmdCA9IGJveEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCkudmFsdWVPcigwKTsKLSAgICAgICAgYXV0
byBwYWRkaW5nUmlnaHQgPSBib3hHZW9tZXRyeS5wYWRkaW5nUmlnaHQoKS52YWx1ZU9yKDApOwot
Ci0gICAgICAgIC8vICMxCi0gICAgICAgIGlmICh3aWR0aCkgewotICAgICAgICAgICAgYXV0byBo
b3Jpem9udGFsU3BhY2VGb3JNYXJnaW4gPSBjb250YWluaW5nQmxvY2tXaWR0aCAtIChjb21wdXRl
ZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSArIGJvcmRlckxlZnQgKyBwYWRkaW5n
TGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgY29tcHV0ZWRIb3Jp
em9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApKTsKLSAgICAgICAgICAgIGlmIChob3Jpem9udGFs
U3BhY2VGb3JNYXJnaW4gPCAwKQotICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2lu
ID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29tcHV0ZWRI
b3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyAjMgotICAgICAgICBpZiAod2lkdGggJiYgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0
ICYmIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKLSAgICAgICAgICAgIGlmIChjb250
YWluaW5nQmxvY2tTdHlsZS5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIHsKLSAgICAgICAgICAg
ICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uc3RhcnQ7Ci0gICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gY29u
dGFpbmluZ0Jsb2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJM
ZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7
Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFy
Z2luLmVuZCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kOwotICAgICAgICAgICAgICAg
IHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoYm9y
ZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmln
aHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gIzMKLSAgICAgICAgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4u
c3RhcnQgJiYgd2lkdGggJiYgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgewotICAgICAg
ICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdp
bi5lbmQ7Ci0gICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNvbnRhaW5p
bmdCbG9ja1dpZHRoIC0gKGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCAgKyAqd2lkdGggKyBwYWRk
aW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7Ci0gICAg
ICAgIH0gZWxzZSBpZiAoY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmICF3aWR0aCAm
JiBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7Ci0gICAgICAgICAgICB1c2VkSG9yaXpv
bnRhbE1hcmdpbiA9IHsgKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCwgKmNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbi5lbmQgfTsKLSAgICAgICAgICAgIHdpZHRoID0gY29udGFpbmluZ0Js
b2NrV2lkdGggLSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFy
Z2luLmVuZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0
YXJ0ICYmIHdpZHRoICYmICFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7Ci0gICAgICAg
ICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uc3RhcnQ7Ci0gICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgPSBjb250YWlu
aW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQg
KyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0KTsKLSAg
ICAgICAgfQotCi0gICAgICAgIC8vICM0Ci0gICAgICAgIGlmICghd2lkdGgpIHsKLSAgICAgICAg
ICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3Rh
cnQudmFsdWVPcigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07
Ci0gICAgICAgICAgICB3aWR0aCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9u
dGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0
ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAgICAgICB9Ci0K
LSAgICAgICAgLy8gIzUKLSAgICAgICAgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3Rh
cnQgJiYgIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKLSAgICAgICAgICAgIGF1dG8g
aG9yaXpvbnRhbFNwYWNlRm9yTWFyZ2luID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoYm9yZGVy
TGVmdCArIHBhZGRpbmdMZWZ0ICArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0
KTsKLSAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyBob3Jpem9udGFsU3BhY2VG
b3JNYXJnaW4gLyAyLCBob3Jpem9udGFsU3BhY2VGb3JNYXJnaW4gLyAyIH07Ci0gICAgICAgIH0K
LQotICAgICAgICBhdXRvIHNob3VsZEFwcGx5Q2VudGVyQWxpZ25Gb3JCbG9ja0NvbnRlbnQgPSBj
b250YWluaW5nQmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRD
ZW50ZXIgJiYgKGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCB8fCBjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uZW5kKTsKLSAgICAgICAgaWYgKHNob3VsZEFwcGx5Q2VudGVyQWxpZ25Gb3JC
bG9ja0NvbnRlbnQpIHsKLSAgICAgICAgICAgIGF1dG8gYm9yZGVyQm94V2lkdGggPSAoYm9yZGVy
TGVmdCArIHBhZGRpbmdMZWZ0ICArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0
KTsKLSAgICAgICAgICAgIGF1dG8gbWFyZ2luU3RhcnQgPSBjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uc3RhcnQudmFsdWVPcigwKTsKLSAgICAgICAgICAgIGF1dG8gbWFyZ2luRW5kID0gY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApOwotICAgICAgICAgICAgYXV0byBjZW50
ZXJlZExvZ2ljYWxMZWZ0Rm9yTWFyZ2luQm94ID0gc3RkOjptYXgoKGNvbnRhaW5pbmdCbG9ja1dp
ZHRoIC0gYm9yZGVyQm94V2lkdGggLSBtYXJnaW5TdGFydCAtIG1hcmdpbkVuZCkgLyAyLCAwX2x1
KTsKLSAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gY2VudGVyZWRMb2dp
Y2FsTGVmdEZvck1hcmdpbkJveCArIG1hcmdpblN0YXJ0OwotICAgICAgICAgICAgdXNlZEhvcml6
b250YWxNYXJnaW4uZW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSBib3JkZXJCb3hXaWR0aCAt
IG1hcmdpblN0YXJ0ICsgbWFyZ2luRW5kOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVCh3aWR0
aCk7Ci0KLSAgICAgICAgcmV0dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7ICp3aWR0aCwgdXNl
ZEhvcml6b250YWxNYXJnaW4gfTsKLSAgICB9OwotCi0gICAgYXV0byBjb250ZW50V2lkdGhBbmRN
YXJnaW4gPSBjb21wdXRlKCk7Ci0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0
TGF5b3V0LCBzdHJlYW0gPDwgIltXaWR0aF1bTWFyZ2luXSAtPiBpbmZsb3cgbm9uLXJlcGxhY2Vk
IC0+IHdpZHRoKCIgPDwgY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA8PCAicHgp
IG1hcmdpbigiIDw8IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0IDw8ICJw
eCwgIiA8PCBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgPDwgInB4KSAtPiBs
YXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIGNvbnRlbnRXaWR0
aEFuZE1hcmdpbjsKLX0KLQotQ29udGVudFdpZHRoQW5kTWFyZ2luIEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5OjppbkZsb3dSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25z
dCBSZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYg
aG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYg
b3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKHJlcGxhY2VkQm94Lmlz
SW5GbG93KCkpOwotCi0gICAgLy8gMTAuMy40IEJsb2NrLWxldmVsLCByZXBsYWNlZCBlbGVtZW50
cyBpbiBub3JtYWwgZmxvdwotICAgIC8vCi0gICAgLy8gMS4gVGhlIHVzZWQgdmFsdWUgb2YgJ3dp
ZHRoJyBpcyBkZXRlcm1pbmVkIGFzIGZvciBpbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMuCi0gICAg
Ly8gMi4gVGhlbiB0aGUgcnVsZXMgZm9yIG5vbi1yZXBsYWNlZCBibG9jay1sZXZlbCBlbGVtZW50
cyBhcmUgYXBwbGllZCB0byBkZXRlcm1pbmUgdGhlIG1hcmdpbnMuCi0KLSAgICAvLyAjMQotICAg
IGF1dG8gdXNlZFdpZHRoID0gaW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4ocmVw
bGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBvdmVycmlkZGVuSG9yaXpvbnRh
bFZhbHVlcykuY29udGVudFdpZHRoOwotICAgIC8vICMyCi0gICAgYXV0byBub25SZXBsYWNlZFdp
ZHRoQW5kTWFyZ2luID0gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4ocmVw
bGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMgeyB1c2VkV2lkdGgsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLm1hcmdpbiB9KTsKLQot
ICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJb
V2lkdGhdW01hcmdpbl0gLT4gaW5mbG93IHJlcGxhY2VkIC0+IHdpZHRoKCIgPDwgdXNlZFdpZHRo
ICA8PCAicHgpIG1hcmdpbigiIDw8IG5vblJlcGxhY2VkV2lkdGhBbmRNYXJnaW4udXNlZE1hcmdp
bi5zdGFydCA8PCAicHgsICIgPDwgbm9uUmVwbGFjZWRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2lu
LmVuZCA8PCAicHgpIC0+IGxheW91dEJveCgiIDw8ICZyZXBsYWNlZEJveCA8PCAiKSIpOwotICAg
IHJldHVybiB7IHVzZWRXaWR0aCwgbm9uUmVwbGFjZWRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2lu
IH07Ci19Ci0KLUxheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OnN0
YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IFZlcnRpY2Fs
Q29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpIGNvbnN0Ci17Ci0gICAgLy8gaHR0cHM6
Ly93d3cudzMub3JnL1RSL0NTUzIyL3Zpc3VyZW4uaHRtbCNibG9jay1mb3JtYXR0aW5nCi0gICAg
Ly8gSW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGJveGVzIGFyZSBsYWlkIG91dCBvbmUg
YWZ0ZXIgdGhlIG90aGVyLCB2ZXJ0aWNhbGx5LCBiZWdpbm5pbmcgYXQgdGhlIHRvcCBvZiBhIGNv
bnRhaW5pbmcgYmxvY2suCi0gICAgLy8gVGhlIHZlcnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdHdv
IHNpYmxpbmcgYm94ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgJ21hcmdpbicgcHJvcGVydGllcy4K
LSAgICAvLyBWZXJ0aWNhbCBtYXJnaW5zIGJldHdlZW4gYWRqYWNlbnQgYmxvY2stbGV2ZWwgYm94
ZXMgaW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgY29sbGFwc2UuCi0gICAgaWYgKGF1dG8q
IHByZXZpb3VzSW5GbG93U2libGluZyA9IGxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmco
KSkgewotICAgICAgICBhdXRvJiBwcmV2aW91c0luRmxvd0JveEdlb21ldHJ5ID0gZm9ybWF0dGlu
Z0NvbnRleHQoKS5nZW9tZXRyeUZvckJveCgqcHJldmlvdXNJbkZsb3dTaWJsaW5nKTsKLSAgICAg
ICAgcmV0dXJuIEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KHByZXZpb3VzSW5GbG93Qm94R2Vv
bWV0cnkpLmJvdHRvbSgpICsgcHJldmlvdXNJbkZsb3dCb3hHZW9tZXRyeS5tYXJnaW5BZnRlcigp
OwotICAgIH0KLSAgICByZXR1cm4gdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2FsVG9wOwotfQot
Ci1MYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNIb3Jp
em9udGFsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSBjb25zdAotewotICAgIC8vIGh0dHBzOi8v
d3d3LnczLm9yZy9UUi9DU1MyMi92aXN1cmVuLmh0bWwjYmxvY2stZm9ybWF0dGluZwotICAgIC8v
IEluIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0LCBlYWNoIGJveCdzIGxlZnQgb3V0ZXIgZWRn
ZSB0b3VjaGVzIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgKGZvciByaWdo
dC10by1sZWZ0IGZvcm1hdHRpbmcsIHJpZ2h0IGVkZ2VzIHRvdWNoKS4KLSAgICByZXR1cm4gaG9y
aXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxMZWZ0ICsgZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9t
ZXRyeUZvckJveChsYXlvdXRCb3gpLm1hcmdpblN0YXJ0KCk7Ci19Ci0KLVBvaW50IEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNQb3NpdGlvbihjb25zdCBCb3gmIGxheW91
dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMs
IGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIHsgc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgaG9yaXpv
bnRhbENvbnN0cmFpbnRzKSwgc3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIHZlcnRp
Y2FsQ29uc3RyYWludHMpIH07Ci19Ci0KLUNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29u
c3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRh
bENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5W
ZXJ0aWNhbFZhbHVlcykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5GbG93KCkpOwotCi0g
ICAgLy8gMTAuNi4yIElubGluZSByZXBsYWNlZCBlbGVtZW50cywgYmxvY2stbGV2ZWwgcmVwbGFj
ZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3csICdpbmxpbmUtYmxvY2snCi0gICAgLy8gcmVwbGFj
ZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZsb2F0aW5nIHJlcGxhY2VkIGVsZW1lbnRz
Ci0gICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0gICAgICAgIHJldHVybiBpbmxp
bmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxh
eW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBvdmVycmlkZGVuVmVydGljYWxW
YWx1ZXMpOwotCi0gICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBjb250ZW50SGVpZ2h0QW5kTWFy
Z2luOwotICAgIGlmIChsYXlvdXRCb3guaXNPdmVyZmxvd1Zpc2libGUoKSAmJiAhbGF5b3V0Qm94
LmlzRG9jdW1lbnRCb3goKSkgewotICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHRoZSBjYXNl
IGZvciB0aGUgZG9jdW1lbnQgZWxlbWVudC4gTGV0J3MganVzdCBjb21wbGljYXRlZC1jYXNlIGl0
IGZvciBub3cuCi0gICAgICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gPSBpbkZsb3dOb25SZXBs
YWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8g
MTAuNi42IENvbXBsaWNhdGVkIGNhc2VzCi0gICAgICAgIC8vIEJsb2NrLWxldmVsLCBub24tcmVw
bGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgd2hlbiAnb3ZlcmZsb3cnIGRvZXMgbm90IGNv
bXB1dGUgdG8gJ3Zpc2libGUnIChleGNlcHQgaWYgdGhlICdvdmVyZmxvdycgcHJvcGVydHkncyB2
YWx1ZSBoYXMgYmVlbiBwcm9wYWdhdGVkIHRvIHRoZSB2aWV3cG9ydCkuCi0gICAgICAgIGNvbnRl
bnRIZWlnaHRBbmRNYXJnaW4gPSBjb21wbGljYXRlZENhc2VzKGxheW91dEJveCwgaG9yaXpvbnRh
bENvbnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwotICAgIH0KLQotICAgIGF1
dG8gcXVpcmtzID0gZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKTsKLSAgICBpZiAoIXF1aXJr
cy5uZWVkc1N0cmV0Y2hpbmcobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGNvbnRlbnRIZWln
aHRBbmRNYXJnaW47Ci0KLSAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQg
PSBxdWlya3Muc3RyZXRjaGVkSW5GbG93SGVpZ2h0KGxheW91dEJveCwgY29udGVudEhlaWdodEFu
ZE1hcmdpbik7Ci0KLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQs
IHN0cmVhbSA8PCAiW0hlaWdodF1bTWFyZ2luXSAtPiBpbmZsb3cgbm9uLXJlcGxhY2VkIC0+IHN0
cmVjaGVkIHRvIHZpZXdwb3J0IC0+IGhlaWdodCgiIDw8IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4u
Y29udGVudEhlaWdodCA8PCAicHgpIG1hcmdpbigiIDw8IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4u
bm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSA8PCAicHgsICIgPDwgY29udGVudEhlaWdodEFuZE1h
cmdpbi5ub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIgPDwgInB4KSAtPiBsYXlvdXRCb3goIiA8PCAm
bGF5b3V0Qm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW47Ci19
Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRy
eTo6aW5GbG93Q29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3Zl
cnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQotewot
ICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7Ci0KLSAgICBpZiAoIWxheW91dEJveC5p
c1JlcGxhY2VkQm94KCkpCi0gICAgICAgIHJldHVybiBpbkZsb3dOb25SZXBsYWNlZENvbnRlbnRX
aWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMpOwotICAgIHJldHVybiBpbkZsb3dSZXBsYWNlZENvbnRlbnRXaWR0
aEFuZE1hcmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyk7Ci19Ci0KLUNvbnRlbnRXaWR0
aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRDb250
ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBPcHRpb25hbDxMYXlvdXRVbml0PiBh
dmFpbGFibGVXaWR0aEZsb2F0QXZvaWRlcikKLXsKLSAgICBhdXRvIGNvbXB1dGUgPSBbJl0gKGF1
dG8gY29uc3RyYWludHNGb3JXaWR0aCwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZFdpZHRoKSB7
Ci0gICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAg
ICAgIHJldHVybiBmbG9hdGluZ0NvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnN0
cmFpbnRzRm9yV2lkdGgsIHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0KLSAgICAgICAgaWYgKGxheW91
dEJveC5pc0luRmxvdygpKQotICAgICAgICAgICAgcmV0dXJuIGluRmxvd0NvbnRlbnRXaWR0aEFu
ZE1hcmdpbihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzRm9yV2lkdGgsIHsgdXNlZFdpZHRoLCB7IH0g
fSk7Ci0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBDb250
ZW50V2lkdGhBbmRNYXJnaW4geyB9OwotICAgIH07Ci0KLSAgICBhdXRvIGhvcml6b250YWxDb25z
dHJhaW50c0ZvcldpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzOwotICAgIGlmIChsYXlvdXRC
b3guc3R5bGUoKS5sb2dpY2FsV2lkdGgoKS5pc0F1dG8oKSAmJiBhdmFpbGFibGVXaWR0aEZsb2F0
QXZvaWRlcikgewotICAgICAgICAvLyBXaGlsZSB0aGUgbm9uLWF1dG8gd2lkdGggdmFsdWVzIHNo
b3VsZCBhbGwgYmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgY29udGFpbmluZyBibG9jaydzIHdpZHRo
LCB3aGVuCi0gICAgICAgIC8vIHRoZSB3aWR0aCBpcyBhdXRvIHRoZSBhdmFpbGFibGUgaG9yaXpv
bnRhbCBzcGFjZSBpcyBzaHJ1bmsgYnkgbmVpZ2hib3JpbmcgZmxvYXRzLgotICAgICAgICBob3Jp
em9udGFsQ29uc3RyYWludHNGb3JXaWR0aC5sb2dpY2FsV2lkdGggPSAqYXZhaWxhYmxlV2lkdGhG
bG9hdEF2b2lkZXI7Ci0gICAgfQotICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFyZ2luID0gY29t
cHV0ZShob3Jpem9udGFsQ29uc3RyYWludHNGb3JXaWR0aCwgeyB9KTsKLSAgICBhdXRvIGF2YWls
YWJsZVdpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAgICBpZiAo
YXV0byBtYXhXaWR0aCA9IGNvbXB1dGVkTWF4V2lkdGgobGF5b3V0Qm94LCBhdmFpbGFibGVXaWR0
aCkpIHsKLSAgICAgICAgYXV0byBtYXhXaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUoaG9yaXpvbnRh
bENvbnN0cmFpbnRzLCBtYXhXaWR0aCk7Ci0gICAgICAgIGlmIChjb250ZW50V2lkdGhBbmRNYXJn
aW4uY29udGVudFdpZHRoID4gbWF4V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQotICAgICAg
ICAgICAgY29udGVudFdpZHRoQW5kTWFyZ2luID0gbWF4V2lkdGhBbmRNYXJnaW47Ci0gICAgfQot
Ci0gICAgYXV0byBtaW5XaWR0aCA9IGNvbXB1dGVkTWluV2lkdGgobGF5b3V0Qm94LCBhdmFpbGFi
bGVXaWR0aCkudmFsdWVPcigwKTsKLSAgICBhdXRvIG1pbldpZHRoQW5kTWFyZ2luID0gY29tcHV0
ZShob3Jpem9udGFsQ29uc3RyYWludHMsIG1pbldpZHRoKTsKLSAgICBpZiAoY29udGVudFdpZHRo
QW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA8IG1pbldpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkK
LSAgICAgICAgY29udGVudFdpZHRoQW5kTWFyZ2luID0gbWluV2lkdGhBbmRNYXJnaW47Ci0gICAg
cmV0dXJuIGNvbnRlbnRXaWR0aEFuZE1hcmdpbjsKLX0KLQotRm9ybWF0dGluZ0NvbnRleHQ6Oklu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6
OmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAg
YXV0byBmaXhlZE1hcmdpbkJvcmRlckFuZFBhZGRpbmcgPSBbJl0oYXV0byYgbGF5b3V0Qm94KSB7
Ci0gICAgICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAgICAgIHJldHVy
biBmaXhlZFZhbHVlKHN0eWxlLm1hcmdpblN0YXJ0KCkpLnZhbHVlT3IoMCkKLSAgICAgICAgICAg
ICsgTGF5b3V0VW5pdCB7IHN0eWxlLmJvcmRlckxlZnRXaWR0aCgpIH0KLSAgICAgICAgICAgICsg
Zml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nTGVmdCgpKS52YWx1ZU9yKDApCi0gICAgICAgICAgICAr
IGZpeGVkVmFsdWUoc3R5bGUucGFkZGluZ1JpZ2h0KCkpLnZhbHVlT3IoMCkKLSAgICAgICAgICAg
ICsgTGF5b3V0VW5pdCB7IHN0eWxlLmJvcmRlclJpZ2h0V2lkdGgoKSB9Ci0gICAgICAgICAgICAr
IGZpeGVkVmFsdWUoc3R5bGUubWFyZ2luRW5kKCkpLnZhbHVlT3IoMCk7Ci0gICAgfTsKLQotICAg
IGF1dG8gY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gWyZdKCkgLT4gSW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyB7Ci0gICAgICAgIGF1dG8gbG9naWNhbFdpZHRoID0gbGF5b3V0
Qm94LnN0eWxlKCkubG9naWNhbFdpZHRoKCk7Ci0gICAgICAgIC8vIE1pbmltdW0vbWF4aW11bSB3
aWR0aCBjYW4ndCBiZSBkZXBlbmRpbmcgb24gdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0aC4K
LSAgICAgICAgYXV0byBuZWVkc1Jlc29sdmVkQ29udGFpbmluZ0Jsb2NrV2lkdGggPSBsb2dpY2Fs
V2lkdGguaXNDYWxjdWxhdGVkKCkgfHwgbG9naWNhbFdpZHRoLmlzUGVyY2VudCgpIHx8IGxvZ2lj
YWxXaWR0aC5pc1JlbGF0aXZlKCk7Ci0gICAgICAgIGlmIChuZWVkc1Jlc29sdmVkQ29udGFpbmlu
Z0Jsb2NrV2lkdGgpCi0gICAgICAgICAgICByZXR1cm4geyB9OwotCi0gICAgICAgIGlmIChhdXRv
IHdpZHRoID0gZml4ZWRWYWx1ZShsb2dpY2FsV2lkdGgpKQotICAgICAgICAgICAgcmV0dXJuIHsg
KndpZHRoLCAqd2lkdGggfTsKLQotICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3go
KSkgewotICAgICAgICAgICAgYXV0byYgcmVwbGFjZWRCb3ggPSBkb3duY2FzdDxSZXBsYWNlZEJv
eD4obGF5b3V0Qm94KTsKLSAgICAgICAgICAgIGlmIChyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNX
aWR0aCgpKSB7Ci0gICAgICAgICAgICAgICAgYXV0byByZXBsYWNlZFdpZHRoID0gcmVwbGFjZWRC
b3guaW50cmluc2ljV2lkdGgoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4geyByZXBsYWNlZFdp
ZHRoLCByZXBsYWNlZFdpZHRoIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4g
eyB9OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJv
eCkgfHwgIWRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0
aW5nQ2hpbGQoKSkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0KLSAgICAgICAgaWYgKGxheW91
dEJveC5pc1NpemVDb250YWlubWVudEJveCgpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgaW50cmlu
c2ljIHNpemVzIG9mIHRoZSBzaXplIGNvbnRhaW5tZW50IGJveCBhcmUgZGV0ZXJtaW5lZCBhcyBp
ZiB0aGUgZWxlbWVudCBoYWQgbm8gY29udGVudCwKLSAgICAgICAgICAgIC8vIGZvbGxvd2luZyB0
aGUgc2FtZSBsb2dpYyBhcyB3aGVuIHNpemluZyBhcyBpZiBlbXB0eS4KLSAgICAgICAgICAgIHJl
dHVybiB7IH07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGF5b3V0Qm94LmVzdGFibGlzaGVz
Rm9ybWF0dGluZ0NvbnRleHQoKSkgewotICAgICAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZG93bmNh
c3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLCBsYXlvdXRTdGF0ZSgpKS0+Y29tcHV0ZWRJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgICAgICBpZiAobG9naWNhbFdpZHRoLmlz
TWluQ29udGVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiB7IGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMubWluaW11bSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtIH07Ci0g
ICAgICAgICAgICBpZiAobG9naWNhbFdpZHRoLmlzTWF4Q29udGVudCgpKQotICAgICAgICAgICAg
ICAgIHJldHVybiB7IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSwgaW50cmluc2lj
V2lkdGhDb25zdHJhaW50cy5tYXhpbXVtIH07Ci0gICAgICAgICAgICByZXR1cm4gaW50cmluc2lj
V2lkdGhDb25zdHJhaW50czsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cyA9IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9OwotICAgICAgICBh
dXRvJiBmb3JtYXR0aW5nU3RhdGUgPSBsYXlvdXRTdGF0ZSgpLmZvcm1hdHRpbmdTdGF0ZUZvckJv
eChsYXlvdXRCb3gpOwotICAgICAgICBmb3IgKGF1dG8mIGNoaWxkIDogY2hpbGRyZW5PZlR5cGU8
Qm94Pihkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkpKSB7Ci0gICAgICAgICAgICBp
ZiAoY2hpbGQuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgfHwgKGNoaWxkLmlzRmxvYXRBdm9pZGVy
KCkgJiYgIWNoaWxkLmhhc0Zsb2F0Q2xlYXIoKSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgICAgICBhdXRvIGNoaWxkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGZvcm1h
dHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGNoaWxkKTsKLSAgICAg
ICAgICAgIEFTU0VSVChjaGlsZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMpOwotCi0gICAgICAg
ICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0gPSBzdGQ6Om1heChpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0sIGNoaWxkSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cy0+bWluaW11bSk7Ci0gICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGlt
dW0gPSBzdGQ6Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIGNoaWxkSW50
cmluc2ljV2lkdGhDb25zdHJhaW50cy0+bWF4aW11bSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0
dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Ci0gICAgfTsKLSAgICAvLyBGSVhNRSBDaGVj
ayBmb3IgYm94LXNpemluZzogYm9yZGVyLWJveDsKLSAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMgPSBjb25zdHJhaW5CeU1pbk1heFdpZHRoKGxheW91dEJveCwgY29tcHV0ZWRJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzKCkpOwotICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMu
ZXhwYW5kKGZpeGVkTWFyZ2luQm9yZGVyQW5kUGFkZGluZyhsYXlvdXRCb3gpKTsKLSAgICByZXR1
cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0
aW5nQ29udGV4dFF1aXJrcy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0
aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCA3MWIwODg0MjAzZGM4NmE2NzM2YWJjOGViZGFmMmE1ZWYxZDU4NmFlLi4wMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAK
KysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAx
OCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFC
TEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGlu
Z1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2Vv
bWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJMYXlv
dXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCi0jaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKLQot
bmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLXN0YXRpYyBib29sIGlz
UXVpcmtDb250YWluZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAgcmV0dXJuIGxheW91
dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpIHx8IGxheW91dEJv
eC5pc1RhYmxlQ2VsbCgpOwotfQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJr
czo6bmVlZHNTdHJldGNoaW5nKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFT
U0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7Ci0gICAgLy8gSW4gcXVpcmtzIG1vZGUsIGluLWZs
b3cgYm9keSBhbmQgaHRtbCBzdHJldGNoIHRvIHRoZSBpbml0aWFsIGNvbnRhaW5pbmcgYmxvY2sg
KGhlaWdodDogYXV0byBvbmx5KS4KLSAgICBpZiAoIWxheW91dFN0YXRlKCkuaW5RdWlya3NNb2Rl
KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghbGF5b3V0Qm94LmlzRG9jdW1l
bnRCb3goKSAmJiAhbGF5b3V0Qm94LmlzQm9keUJveCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICByZXR1cm4gbGF5b3V0Qm94LnN0eWxlKCkubG9naWNhbEhlaWdodCgpLmlzQXV0bygp
OwotfQotCi1MYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6c3RyZXRj
aGVkSW5GbG93SGVpZ2h0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBDb250ZW50SGVpZ2h0QW5kTWFy
Z2luIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4pCi17Ci0gICAgQVNTRVJUKG5lZWRzU3RyZXRjaGlu
ZyhsYXlvdXRCb3gpKTsKLSAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1h
dHRpbmdDb250ZXh0KCk7Ci0gICAgYXV0byBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiA9IGNv
bnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSArIGNvbnRlbnRI
ZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmFmdGVyOwotCi0gICAgaWYgKGxheW91
dEJveC5pc0RvY3VtZW50Qm94KCkpIHsKLSAgICAgICAgLy8gTGV0J3Mgc3RyZXRjaCB0aGUgaW5m
bG93IGRvY3VtZW50IGJveCg8aHRtbD4pIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGluaXRpYWwgY29u
dGFpbmluZyBibG9jayAodmlldykuCi0gICAgICAgIGF1dG8gZG9jdW1lbnRCb3hDb250ZW50SGVp
Z2h0ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LmluaXRpYWxD
b250YWluaW5nQmxvY2soKSwgRXNjYXBlUmVhc29uOjpEb2N1bWVudEJveFN0cmV0Y2hlc1RvVmll
d3BvcnRRdWlyaykuY29udGVudEJveEhlaWdodCgpOwotICAgICAgICAvLyBEb2N1bWVudCBib3gn
cyBvd24gdmVydGljYWwgbWFyZ2luL2JvcmRlci9wYWRkaW5nIHZhbHVlcyBhbHdheXMgc2hyaW5r
IHRoZSBjb250ZW50IGhlaWdodC4KLSAgICAgICAgYXV0byYgZG9jdW1lbnRCb3hHZW9tZXRyeSA9
IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0gICAgICAgIGRv
Y3VtZW50Qm94Q29udGVudEhlaWdodCAtPSBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiArIGRv
Y3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50Qm94R2VvbWV0cnku
dmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KGNv
bnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCwgIGRvY3VtZW50Qm94Q29udGVudEhl
aWdodCk7Ci0gICAgfQotCi0gICAgLy8gSGVyZSBpcyB0aGUgcXVpcmt5IHBhcnQgZm9yIGJvZHkg
Ym94IHdoZW4gaXQgc3RyZXRjaGVzIGFsbCB0aGUgd2F5IHRvIHRoZSBJQ0IgZXZlbiB3aGVuIHRo
ZSBkb2N1bWVudCBib3ggZG9lcyBub3QgKGUuZy4gb3V0LW9mLWZsb3cgcG9zaXRpb25lZCkuCi0g
ICAgQVNTRVJUKGxheW91dEJveC5pc0JvZHlCb3goKSk7Ci0gICAgYXV0byYgaW5pdGlhbENvbnRh
aW5pbmdCbG9jayA9IGxheW91dEJveC5pbml0aWFsQ29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgYXV0
byYgaW5pdGlhbENvbnRhaW5pbmdCbG9ja0dlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2Vv
bWV0cnlGb3JCb3goaW5pdGlhbENvbnRhaW5pbmdCbG9jaywgRXNjYXBlUmVhc29uOjpCb2R5U3Ry
ZXRjaGVzVG9WaWV3cG9ydFF1aXJrKTsKLSAgICAvLyBTdGFydCB0aGUgY29udGVudCBoZWlnaHQg
d2l0aCB0aGUgSUNCLgotICAgIGF1dG8gYm9keUJveENvbnRlbnRIZWlnaHQgPSBpbml0aWFsQ29u
dGFpbmluZ0Jsb2NrR2VvbWV0cnkuY29udGVudEJveEhlaWdodCgpOwotICAgIC8vIEJvZHkgYm94
J3Mgb3duIGJvcmRlciBhbmQgcGFkZGluZyBzaHJpbmsgdGhlIGNvbnRlbnQgaGVpZ2h0LgotICAg
IGF1dG8mIGJvZHlCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94
KGxheW91dEJveCk7Ci0gICAgYm9keUJveENvbnRlbnRIZWlnaHQgLT0gYm9keUJveEdlb21ldHJ5
LnZlcnRpY2FsQm9yZGVyKCkgKyBib2R5Qm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFs
dWVPcigwKTsKLSAgICAvLyBCb2R5IGJveCBuZXZlciBjb2xsYXBzZXMgaXRzIHZlcnRpY2FsIG1h
cmdpbnMgd2l0aCB0aGUgZG9jdW1lbnQgYm94IGJ1dCBpdCBtaWdodCBjb2xsYXBzZSBpdHMgbWFy
Z2luIHdpdGggaXRzIGRlc2NlbmRhbnRzLgotICAgIGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0g
Y29udGVudEhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW47Ci0gICAgYXV0byBjb2xs
YXBzZWRNYXJnaW4gPSBmb3JtYXR0aW5nQ29udGV4dC5tYXJnaW5Db2xsYXBzZSgpLmNvbGxhcHNl
ZFZlcnRpY2FsVmFsdWVzKGxheW91dEJveCwgbm9uQ29sbGFwc2VkTWFyZ2luKS5jb2xsYXBzZWRW
YWx1ZXM7Ci0gICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBjb2xsYXBzZWRNYXJnaW4uYmVm
b3JlLnZhbHVlT3Iobm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSk7Ci0gICAgdXNlZFZlcnRpY2Fs
TWFyZ2luICs9IGNvbGxhcHNlZE1hcmdpbi5pc0NvbGxhcHNlZFRocm91Z2ggPyBub25Db2xsYXBz
ZWRNYXJnaW4uYWZ0ZXIgOiBjb2xsYXBzZWRNYXJnaW4uYWZ0ZXIudmFsdWVPcihub25Db2xsYXBz
ZWRNYXJnaW4uYWZ0ZXIpOwotICAgIGJvZHlCb3hDb250ZW50SGVpZ2h0IC09IHVzZWRWZXJ0aWNh
bE1hcmdpbjsKLSAgICAvLyBEb2N1bWVudCBib3gncyBwYWRkaW5nIGFuZCBib3JkZXIgYWxzbyBz
aHJpbmsgdGhlIGJvZHkgYm94J3MgY29udGVudCBoZWlnaHQuCi0gICAgYXV0byYgZG9jdW1lbnRC
b3ggPSBsYXlvdXRCb3gucGFyZW50KCk7Ci0gICAgYXV0byYgZG9jdW1lbnRCb3hHZW9tZXRyeSA9
IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGRvY3VtZW50Qm94LCBFc2NhcGVSZWFz
b246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspOwotICAgIGJvZHlCb3hDb250ZW50SGVp
Z2h0IC09IGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50Qm94
R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKLSAgICAvLyBIb3dldmVyIHRo
ZSBub24taW4tZmxvdyBkb2N1bWVudCBib3gncyB2ZXJ0aWNhbCBtYXJnaW5zIGFyZSBpZ25vcmVk
LiBUaGV5IGRvbid0IGFmZmVjdCB0aGUgYm9keSBib3gncyBjb250ZW50IGhlaWdodC4KLSAgICBp
ZiAoZG9jdW1lbnRCb3guaXNJbkZsb3coKSkgewotICAgICAgICBhdXRvIGdlb21ldHJ5ID0gdGhp
cy0+Z2VvbWV0cnkoKTsKLSAgICAgICAgYXV0byBwcmVjb21wdXRlRG9jdW1lbnRCb3hWZXJ0aWNh
bE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkVmVydGljYWxNYXJnaW4oZG9jdW1lbnRCb3gsIGdl
b21ldHJ5LmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChpbml0aWFsQ29udGFpbmluZ0Jsb2Nr
LCBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspLmhvcml6b250YWwp
OwotICAgICAgICBib2R5Qm94Q29udGVudEhlaWdodCAtPSBwcmVjb21wdXRlRG9jdW1lbnRCb3hW
ZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSArIHByZWNvbXB1dGVEb2N1bWVudEJveFZl
cnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCk7Ci0gICAgfQotICAgIHJldHVybiBzdGQ6Om1h
eChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQsICBib2R5Qm94Q29udGVudEhl
aWdodCk7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpzaG91bGRJ
Z25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsK
LSAgICByZXR1cm4gbGF5b3V0U3RhdGUoKS5pblF1aXJrc01vZGUoKSAmJiBpc1F1aXJrQ29udGFp
bmVyKGxheW91dEJveCk7Ci19Ci0KLWVudW0gY2xhc3MgVmVydGljYWxNYXJnaW4geyBCZWZvcmUs
IEFmdGVyIH07Ci1zdGF0aWMgaW5saW5lIGJvb2wgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGNv
bnN0IEJveCYgbGF5b3V0Qm94LCBWZXJ0aWNhbE1hcmdpbiB2ZXJ0aWNhbE1hcmdpbikKLXsKLSAg
ICBpZiAoIWxheW91dEJveC5pc0luRmxvdygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
YXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICByZXR1cm4gKHZlcnRpY2FsTWFy
Z2luID09IFZlcnRpY2FsTWFyZ2luOjpCZWZvcmUgJiYgc3R5bGUuaGFzTWFyZ2luQmVmb3JlUXVp
cmsoKSkgfHwgKHZlcnRpY2FsTWFyZ2luID09IFZlcnRpY2FsTWFyZ2luOjpBZnRlciAmJiBzdHls
ZS5oYXNNYXJnaW5BZnRlclF1aXJrKCkpOwotfQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6OlF1aXJrczo6c2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50TWFyZ2luQmVm
b3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIHJldHVybiBsYXlvdXRTdGF0
ZSgpLmluUXVpcmtzTW9kZSgpICYmIGhhc1F1aXJrTWFyZ2luVG9Db2xsYXBzZShsYXlvdXRCb3gs
IFZlcnRpY2FsTWFyZ2luOjpCZWZvcmUpICYmIGlzUXVpcmtDb250YWluZXIobGF5b3V0Qm94LmNv
bnRhaW5pbmdCbG9jaygpKTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWly
a3M6OnNob3VsZENvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3Qg
Qm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGxheW91dFN0YXRlKCkuaW5RdWly
a3NNb2RlKCkgJiYgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGxheW91dEJveCwgVmVydGljYWxN
YXJnaW46OkFmdGVyKSAmJiBpc1F1aXJrQ29udGFpbmVyKGxheW91dEJveC5jb250YWluaW5nQmxv
Y2soKSk7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuY3BwCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzRhNTBmZjY5MTNhZDEyYTA4ZDUyZTM5MDI3
NTkxMDc3ZjIzMzViLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5n
U3RhdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNp
bmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgotCi0j
aWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlIDx3dGYvSXNv
TWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0
IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEJsb2NrRm9ybWF0dGluZ1N0YXRlKTsK
LQotQmxvY2tGb3JtYXR0aW5nU3RhdGU6OkJsb2NrRm9ybWF0dGluZ1N0YXRlKFJlZjxGbG9hdGlu
Z1N0YXRlPiYmIGZsb2F0aW5nU3RhdGUsIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKLSAgICA6
IEZvcm1hdHRpbmdTdGF0ZShXVEZNb3ZlKGZsb2F0aW5nU3RhdGUpLCBUeXBlOjpCbG9jaywgbGF5
b3V0U3RhdGUpCi17Ci19Ci0KLUJsb2NrRm9ybWF0dGluZ1N0YXRlOjp+QmxvY2tGb3JtYXR0aW5n
U3RhdGUoKQotewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuaApkZWxl
dGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU2Y2Q2MTlkZDMxNmY1OWIzZjQwOWJmMzVkNzA5
NmQ5ZmI3YzhiMS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0
YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
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
ZGUgIkZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLSNpbmNs
dWRlIDx3dGYvV2Vha0hhc2hTZXQuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNl
IExheW91dCB7Ci0KLS8vIEJsb2NrRm9ybWF0dGluZ1N0YXRlIGhvbGRzIHRoZSBzdGF0ZSBmb3Ig
YSBwYXJ0aWN1bGFyIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCB0cmVlLgotY2xhc3MgQmxvY2tG
b3JtYXR0aW5nU3RhdGUgOiBwdWJsaWMgRm9ybWF0dGluZ1N0YXRlIHsKLSAgICBXVEZfTUFLRV9J
U09fQUxMT0NBVEVEKEJsb2NrRm9ybWF0dGluZ1N0YXRlKTsKLXB1YmxpYzoKLSAgICBCbG9ja0Zv
cm1hdHRpbmdTdGF0ZShSZWY8RmxvYXRpbmdTdGF0ZT4mJiwgTGF5b3V0U3RhdGUmKTsKLSAgICB+
QmxvY2tGb3JtYXR0aW5nU3RhdGUoKTsKLQotICAgIHZvaWQgc2V0VXNlZFZlcnRpY2FsTWFyZ2lu
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBVc2VkVmVydGljYWxNYXJnaW4mIHVzZWRWZXJ0
aWNhbE1hcmdpbikgeyBtX3VzZWRWZXJ0aWNhbE1hcmdpbnMuc2V0KCZsYXlvdXRCb3gsIHVzZWRW
ZXJ0aWNhbE1hcmdpbik7IH0KLSAgICBVc2VkVmVydGljYWxNYXJnaW4gdXNlZFZlcnRpY2FsTWFy
Z2luKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdCB7IHJldHVybiBtX3VzZWRWZXJ0aWNhbE1h
cmdpbnMuZ2V0KCZsYXlvdXRCb3gpOyB9Ci0gICAgYm9vbCBoYXNVc2VkVmVydGljYWxNYXJnaW4o
Y29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fdXNlZFZlcnRpY2FsTWFyZ2lu
cy5jb250YWlucygmbGF5b3V0Qm94KTsgfQotCi0gICAgdm9pZCBzZXRIYXNDbGVhcmFuY2UoY29u
c3QgQm94JiBsYXlvdXRCb3gpIHsgbV9jbGVhcmFuY2VTZXQuYWRkKGxheW91dEJveCk7IH0KLSAg
ICB2b2lkIGNsZWFySGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSB7IG1fY2xlYXJh
bmNlU2V0LnJlbW92ZShsYXlvdXRCb3gpOyB9Ci0gICAgYm9vbCBoYXNDbGVhcmFuY2UoY29uc3Qg
Qm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fY2xlYXJhbmNlU2V0LmNvbnRhaW5zKGxh
eW91dEJveCk7IH0KLQotcHJpdmF0ZToKLSAgICBIYXNoTWFwPGNvbnN0IEJveCosIFVzZWRWZXJ0
aWNhbE1hcmdpbj4gbV91c2VkVmVydGljYWxNYXJnaW5zOwotICAgIFdlYWtIYXNoU2V0PGNvbnN0
IEJveD4gbV9jbGVhcmFuY2VTZXQ7Ci19OwotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJ
VFNfTEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUoQmxvY2tGb3JtYXR0aW5nU3RhdGUsIGlzQmxvY2tG
b3JtYXR0aW5nU3RhdGUoKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrTWFyZ2luQ29sbGFwc2UuY3BwIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja01hcmdpbkNvbGxhcHNlLmNwcApkZWxl
dGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmZDViYmUyMmExYWI5MmU4NTFkODUwZGUwZjRh
NmFkMTg3MTBkYi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrTWFyZ2luQ29sbGFw
c2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5j
bHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0j
aWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJCbG9ja0Zv
cm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJJ
bmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJMYXlvdXRCb3guaCIKLSNpbmNsdWRl
ICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRVbml0LmgiCi0jaW5jbHVk
ZSAiUmVuZGVyU3R5bGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91
dCB7Ci0KLXN0YXRpYyBib29sIGhhc0JvcmRlcihjb25zdCBCb3JkZXJWYWx1ZSYgYm9yZGVyVmFs
dWUpCi17Ci0gICAgaWYgKGJvcmRlclZhbHVlLnN0eWxlKCkgPT0gQm9yZGVyU3R5bGU6Ok5vbmUg
fHwgYm9yZGVyVmFsdWUuc3R5bGUoKSA9PSBCb3JkZXJTdHlsZTo6SGlkZGVuKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuICEhYm9yZGVyVmFsdWUud2lkdGgoKTsKLX0KLQotc3Rh
dGljIGJvb2wgaGFzUGFkZGluZyhjb25zdCBMZW5ndGgmIHBhZGRpbmdWYWx1ZSkKLXsKLSAgICAv
LyBGSVhNRTogQ2hlY2sgaWYgcGVyY2VudCB2YWx1ZSBuZWVkcyB0byBiZSByZXNvbHZlZC4KLSAg
ICByZXR1cm4gIXBhZGRpbmdWYWx1ZS5pc1plcm8oKTsKLX0KLQotc3RhdGljIGJvb2wgaGFzQm9y
ZGVyQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAgIHJldHVybiBoYXNCb3JkZXIo
bGF5b3V0Qm94LnN0eWxlKCkuYm9yZGVyQmVmb3JlKCkpOwotfQotCi1zdGF0aWMgYm9vbCBoYXNC
b3JkZXJBZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICByZXR1cm4gaGFzQm9yZGVy
KGxheW91dEJveC5zdHlsZSgpLmJvcmRlckFmdGVyKCkpOwotfQotCi1zdGF0aWMgYm9vbCBoYXNQ
YWRkaW5nQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAgIHJldHVybiBoYXNQYWRk
aW5nKGxheW91dEJveC5zdHlsZSgpLnBhZGRpbmdCZWZvcmUoKSk7Ci19Ci0KLXN0YXRpYyBib29s
IGhhc1BhZGRpbmdBZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICByZXR1cm4gaGFz
UGFkZGluZyhsYXlvdXRCb3guc3R5bGUoKS5wYWRkaW5nQWZ0ZXIoKSk7Ci19Ci0KLXN0YXRpYyBi
b29sIGVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dChjb25zdCBCb3gmIGxheW91dEJv
eCkKLXsKLSAgICAvLyBXZWJLaXQgdHJlYXRzIHRoZSBkb2N1bWVudCBlbGVtZW50IHJlbmRlcmVy
IGFzIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QuIEl0IHByb2JhYmx5IG9ubHkgaW1w
YWN0cyBtYXJnaW4gY29sbGFwc2luZywgc28gbGV0J3Mgbm90IGRvCi0gICAgLy8gYSBsYXlvdXQg
d2lkZSBxdWlyayBvbiB0aGlzIGZvciBub3cuCi0gICAgaWYgKGxheW91dEJveC5pc0RvY3VtZW50
Qm94KCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBsYXlvdXRCb3guZXN0YWJs
aXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCk7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5n
Q29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Omhhc0NsZWFyYW5jZShjb25zdCBCb3gmIGxheW91dEJv
eCkgY29uc3QKLXsKLSAgICBpZiAoIWxheW91dEJveC5oYXNGbG9hdENsZWFyKCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAvLyBGSVhNRTogcHJlY29tcHV0ZWRWZXJ0aWNhbFBvc2l0aW9u
Rm9yRm9ybWF0dGluZ1Jvb3QgbG9naWMgZW5kcyB1cCBjYWxsaW5nIGludG8gdGhpcyBmdW5jdGlv
biB3aGVuIHRoZSBsYXlvdXRCb3ggKGZpcnN0IGluZmxvdyBjaGlsZCkgaGFzCi0gICAgLy8gbm90
IGJlZW4gbGFpZCBvdXQuCi0gICAgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkuZm9ybWF0dGlu
Z1N0YXRlKCkuaGFzQ2xlYXJhbmNlKGxheW91dEJveCk7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJl
bnRNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAgICAvLyAxLiBU
aGlzIGlzIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgYW5kIGl0cyBtYXJnaW5zIGNvbGxhcHNlIHRo
cm91Z2ggYW5kIHRoZSBtYXJnaW4gYWZ0ZXIgY29sbGFwc2VzIHdpdGggcGFyZW50J3MgbWFyZ2lu
IGFmdGVyIG9yCi0gICAgLy8gMi4gVGhpcyBib3gncyBtYXJnaW4gYWZ0ZXIgY29sbGFwc2VzIHdp
dGggdGhlIG5leHQgc2libGluZydzIG1hcmdpbiBiZWZvcmUgYW5kIHRoYXQgc2libGluZyBjb2xs
YXBzZXMgdGhyb3VnaCBhbmQKLSAgICAvLyB3ZSBjYW4gZ2V0IHRvIHRoZSBsYXN0IGluLWZsb3cg
Y2hpbGQgbGlrZSB0aGF0LgotICAgIGF1dG8qIGxhc3RJbkZsb3dDaGlsZCA9IGxheW91dEJveC5j
b250YWluaW5nQmxvY2soKS5sYXN0SW5GbG93Q2hpbGQoKTsKLSAgICBmb3IgKGF1dG8qIGN1cnJl
bnRCb3ggPSAmbGF5b3V0Qm94OyBjdXJyZW50Qm94OyBjdXJyZW50Qm94ID0gY3VycmVudEJveC0+
bmV4dEluRmxvd1NpYmxpbmcoKSkgewotICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91
Z2goKmN1cnJlbnRCb3gpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAo
Y3VycmVudEJveCA9PSBsYXN0SW5GbG93Q2hpbGQpCi0gICAgICAgICAgICByZXR1cm4gbWFyZ2lu
QWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoKmN1cnJlbnRCb3gpOyAKLSAgICAg
ICAgaWYgKCFtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhOZXh0U2libGluZ01hcmdpbkJlZm9yZSgq
Y3VycmVudEJveCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBh
cmVudE1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAgICAvLyBU
aGUgZmlyc3QgaW5mbG93IGNoaWxkIGNvdWxkIHByb3BhZ2F0ZSBpdHMgdG9wIG1hcmdpbiB0byBw
YXJlbnQuCi0gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIxL2JveC5odG1sI2NvbGxh
cHNpbmctbWFyZ2lucwotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwot
Ci0gICAgaWYgKGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkQ29sbGFwc2VNYXJn
aW5CZWZvcmVXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxheW91dEJveCkpCi0gICAgICAgIHJldHVy
biB0cnVlOwotCi0gICAgLy8gTWFyZ2lucyBiZXR3ZWVuIGEgZmxvYXRlZCBib3ggYW5kIGFueSBv
dGhlciBib3ggZG8gbm90IGNvbGxhcHNlLgotICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bv
c2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gTWFyZ2lucyBvZiBh
YnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgotICAgIGlmIChsYXlv
dXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIC8vIE1hcmdpbnMgb2YgaW5saW5lLWJsb2NrIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KLSAg
ICBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxvY2tCb3goKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgLy8gT25seSB0aGUgZmlyc3QgaW5sZmxvdyBjaGlsZCBjb2xsYXBzZXMgd2l0aCBw
YXJlbnQuCi0gICAgaWYgKGxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gbGF5b3V0Qm94
LmNvbnRhaW5pbmdCbG9jaygpOwotICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3Rh
Ymxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGgg
dGhlaXIgaW4tZmxvdyBjaGlsZHJlbgotICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGlu
Z0NvbnRleHQoY29udGFpbmluZ0Jsb2NrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
aWYgKGhhc0JvcmRlckJlZm9yZShjb250YWluaW5nQmxvY2spKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShjb250YWluaW5nQmxvY2spKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyAuLi5hbmQgdGhlIGNoaWxkIGhhcyBubyBjbGVhcmFu
Y2UuCi0gICAgaWYgKGhhc0NsZWFyYW5jZShsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGlu
Z01hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChs
YXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwotCi0gICAgaWYgKCFsYXlvdXRCb3gucHJldmlv
dXNJbkZsb3dTaWJsaW5nKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGF1dG8mIHBy
ZXZpb3VzSW5GbG93U2libGluZyA9ICpsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7
Ci0gICAgLy8gTWFyZ2lucyBiZXR3ZWVuIGEgZmxvYXRlZCBib3ggYW5kIGFueSBvdGhlciBib3gg
ZG8gbm90IGNvbGxhcHNlLgotICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQo
KSB8fCBwcmV2aW91c0luRmxvd1NpYmxpbmcuaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9u
ZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgotICAgIGlmICgobGF5b3V0Qm94LmlzT3V0T2ZGbG93
UG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guc3R5bGUoKS50b3AoKS5pc0F1dG8oKSkKLSAgICAg
ICAgfHwgKHByZXZpb3VzSW5GbG93U2libGluZy5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAh
cHJldmlvdXNJbkZsb3dTaWJsaW5nLnN0eWxlKCkuYm90dG9tKCkuaXNBdXRvKCkpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBk
byBub3QgY29sbGFwc2UuCi0gICAgaWYgKGxheW91dEJveC5pc0lubGluZUJsb2NrQm94KCkgfHwg
cHJldmlvdXNJbkZsb3dTaWJsaW5nLmlzSW5saW5lQmxvY2tCb3goKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jay1s
ZXZlbCBlbGVtZW50IGFsd2F5cyBjb2xsYXBzZXMgd2l0aCB0aGUgdG9wIG1hcmdpbiBvZgotICAg
IC8vIGl0cyBuZXh0IGluLWZsb3cgYmxvY2stbGV2ZWwgc2libGluZywgdW5sZXNzIHRoYXQgc2li
bGluZyBoYXMgY2xlYXJhbmNlLgotICAgIGlmIChoYXNDbGVhcmFuY2UobGF5b3V0Qm94KSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQmxvY2tG
b3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUNvbGxhcHNlc1dp
dGhGaXJzdEluRmxvd0NoaWxkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25z
dAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwotICAgIC8vIE1h
cmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29u
dGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJlbi4KLSAgICBp
ZiAoZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGxheW91dEJveCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIC8vIFRoZSB0b3AgbWFyZ2luIG9mIGFuIGluLWZsb3cgYmxv
Y2sgZWxlbWVudCBjb2xsYXBzZXMgd2l0aCBpdHMgZmlyc3QgaW4tZmxvdyBibG9jay1sZXZlbAot
ICAgIC8vIGNoaWxkJ3MgdG9wIG1hcmdpbiBpZiB0aGUgZWxlbWVudCBoYXMgbm8gdG9wIGJvcmRl
ci4uLgotICAgIGlmIChoYXNCb3JkZXJCZWZvcmUobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgLy8gLi4ubm8gdG9wIHBhZGRpbmcKLSAgICBpZiAoaGFzUGFkZGluZ0Jl
Zm9yZShsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIWlzPENv
bnRhaW5lckJveD4obGF5b3V0Qm94KSB8fCAhZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRC
b3gpLmhhc0luRmxvd0NoaWxkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGF1dG8m
IGZpcnN0SW5GbG93Q2hpbGQgPSAqZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZp
cnN0SW5GbG93Q2hpbGQoKTsKLSAgICBpZiAoIWZpcnN0SW5GbG93Q2hpbGQuaXNCbG9ja0xldmVs
Qm94KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIC4uLmFuZCB0aGUgY2hpbGQg
aGFzIG5vIGNsZWFyYW5jZS4KLSAgICBpZiAoaGFzQ2xlYXJhbmNlKGZpcnN0SW5GbG93Q2hpbGQp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9j
ayBib3hlcyBkbyBub3QgY29sbGFwc2UuCi0gICAgaWYgKGZpcnN0SW5GbG93Q2hpbGQuaXNJbmxp
bmVCbG9ja0JveCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2lu
QWZ0ZXJDb2xsYXBzZXNXaXRoU2libGluZ01hcmdpbkJlZm9yZVdpdGhDbGVhcmFuY2UoY29uc3Qg
Qm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhlIHRvcCBhbmQgYm90dG9tIG1h
cmdpbnMgb2YgYW4gZWxlbWVudCB3aXRoIGNsZWFyYW5jZSBhcmUgYWRqb2luaW5nLCBpdHMgbWFy
Z2lucyBjb2xsYXBzZSB3aXRoIHRoZSBhZGpvaW5pbmcgbWFyZ2lucwotICAgIC8vIG9mIGZvbGxv
d2luZyBzaWJsaW5ncyBidXQgdGhhdCByZXN1bHRpbmcgbWFyZ2luIGRvZXMgbm90IGNvbGxhcHNl
IHdpdGggdGhlIGJvdHRvbSBtYXJnaW4gb2YgdGhlIHBhcmVudCBibG9jay4KLSAgICBpZiAoIW1h
cmdpbnNDb2xsYXBzZVRocm91Z2gobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgZm9yIChhdXRvKiBwcmV2aW91c1NpYmxpbmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZs
b3dTaWJsaW5nKCk7IHByZXZpb3VzU2libGluZzsgcHJldmlvdXNTaWJsaW5nID0gcHJldmlvdXNT
aWJsaW5nLT5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkgewotICAgICAgICBpZiAoIW1hcmdpbnND
b2xsYXBzZVRocm91Z2goKnByZXZpb3VzU2libGluZykpCi0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgIGlmIChoYXNDbGVhcmFuY2UoKnByZXZpb3VzU2libGluZykpCi0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEJs
b2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5BZnRlckNvbGxhcHNl
c1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0g
ICAgLy8gMS4gVGhpcyBpcyB0aGUgZmlyc3QgaW4tZmxvdyBjaGlsZCBhbmQgaXRzIG1hcmdpbnMg
Y29sbGFwc2UgdGhyb3VnaCBhbmQgdGhlIG1hcmdpbiBiZWZvcmUgY29sbGFwc2VzIHdpdGggcGFy
ZW50J3MgbWFyZ2luIGJlZm9yZSBvcgotICAgIC8vIDIuIFRoaXMgYm94J3MgbWFyZ2luIGJlZm9y
ZSBjb2xsYXBzZXMgd2l0aCB0aGUgcHJldmlvdXMgc2libGluZydzIG1hcmdpbiBhZnRlciBhbmQg
dGhhdCBzaWJsaW5nIGNvbGxhcHNlcyB0aHJvdWdoIGFuZAotICAgIC8vIHdlIGNhbiBnZXQgdG8g
dGhlIGZpcnN0IGluLWZsb3cgY2hpbGQgbGlrZSB0aGF0LgotICAgIGF1dG8qIGZpcnN0SW5GbG93
Q2hpbGQgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkuZmlyc3RJbkZsb3dDaGlsZCgpOwot
ICAgIGZvciAoYXV0byogY3VycmVudEJveCA9ICZsYXlvdXRCb3g7IGN1cnJlbnRCb3g7IGN1cnJl
bnRCb3ggPSBjdXJyZW50Qm94LT5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkgewotICAgICAgICBp
ZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKmN1cnJlbnRCb3gpKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICBpZiAoY3VycmVudEJveCA9PSBmaXJzdEluRmxvd0NoaWxkKQot
ICAgICAgICAgICAgcmV0dXJuIG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5C
ZWZvcmUoKmN1cnJlbnRCb3gpOyAKLSAgICAgICAgaWYgKCFtYXJnaW5CZWZvcmVDb2xsYXBzZXNX
aXRoUHJldmlvdXNTaWJsaW5nTWFyZ2luQWZ0ZXIoKmN1cnJlbnRCb3gpKQotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1
cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFw
c2U6Om1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKGNvbnN0IEJveCYg
bGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94
KCkpOwotCi0gICAgaWYgKGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkQ29sbGFw
c2VNYXJnaW5BZnRlcldpdGhQYXJlbnRNYXJnaW5BZnRlcihsYXlvdXRCb3gpKQotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLQotICAgIC8vIE1hcmdpbnMgYmV0d2VlbiBhIGZsb2F0ZWQgYm94IGFuZCBh
bnkgb3RoZXIgYm94IGRvIG5vdCBjb2xsYXBzZS4KLSAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRp
bmdQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIE1hcmdpbnMg
b2YgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KLSAgICBpZiAo
bGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2Uu
Ci0gICAgaWYgKGxheW91dEJveC5pc0lubGluZUJsb2NrQm94KCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIC8vIE9ubHkgdGhlIGxhc3QgaW5sZmxvdyBjaGlsZCBjb2xsYXBzZXMgd2l0
aCBwYXJlbnQuCi0gICAgaWYgKGxheW91dEJveC5uZXh0SW5GbG93U2libGluZygpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICBhdXRvJiBjb250YWluaW5nQmxvY2sgPSBsYXlvdXRCb3gu
Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgLy8gTWFyZ2lucyBvZiBlbGVtZW50cyB0aGF0IGVzdGFi
bGlzaCBuZXcgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cyBkbyBub3QgY29sbGFwc2Ugd2l0aCB0
aGVpciBpbi1mbG93IGNoaWxkcmVuLgotICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGlu
Z0NvbnRleHQoY29udGFpbmluZ0Jsb2NrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
Ly8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jayBib3ggd2l0aCBhICdoZWln
aHQnIG9mICdhdXRvJyBjb2xsYXBzZXMgd2l0aCBpdHMgbGFzdCBpbi1mbG93IGJsb2NrLWxldmVs
IGNoaWxkJ3MgYm90dG9tIG1hcmdpbiwgaWY6Ci0gICAgaWYgKCFjb250YWluaW5nQmxvY2suc3R5
bGUoKS5oZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8g
dGhlIGJveCBoYXMgbm8gYm90dG9tIHBhZGRpbmcsIGFuZAotICAgIGlmIChoYXNQYWRkaW5nQWZ0
ZXIoY29udGFpbmluZ0Jsb2NrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gdGhl
IGJveCBoYXMgbm8gYm90dG9tIGJvcmRlciwgYW5kCi0gICAgaWYgKGhhc0JvcmRlckFmdGVyKGNv
bnRhaW5pbmdCbG9jaykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIHRoZSBjaGls
ZCdzIGJvdHRvbSBtYXJnaW4gbmVpdGhlciBjb2xsYXBzZXMgd2l0aCBhIHRvcCBtYXJnaW4gdGhh
dCBoYXMgY2xlYXJhbmNlLi4uCi0gICAgaWYgKG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxp
bmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIC8vIG5vciAoaWYgdGhlIGJveCdzIG1pbi1oZWlnaHQgaXMgbm9uLXplcm8p
IHdpdGggdGhlIGJveCdzIHRvcCBtYXJnaW4uCi0gICAgYXV0byBjb21wdXRlZE1pbkhlaWdodCA9
IGNvbnRhaW5pbmdCbG9jay5zdHlsZSgpLmxvZ2ljYWxNaW5IZWlnaHQoKTsKLSAgICBpZiAoIWNv
bXB1dGVkTWluSGVpZ2h0LmlzQXV0bygpICYmIGNvbXB1dGVkTWluSGVpZ2h0LnZhbHVlKCkgJiYg
bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxheW91dEJveCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5BZnRlckNvbGxhcHNlc1dp
dGhMYXN0SW5GbG93Q2hpbGRNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QK
LXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLQotICAgIC8vIE1h
cmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29u
dGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJlbi4KLSAgICBp
ZiAoZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGxheW91dEJveCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8
ICFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXV0byYgbGFzdEluRmxvd0NoaWxkID0gKmRvd25j
YXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5sYXN0SW5GbG93Q2hpbGQoKTsKLSAgICBpZiAo
IWxhc3RJbkZsb3dDaGlsZC5pc0Jsb2NrTGV2ZWxCb3goKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jayBib3ggd2l0
aCBhICdoZWlnaHQnIG9mICdhdXRvJyBjb2xsYXBzZXMgd2l0aCBpdHMgbGFzdCBpbi1mbG93IGJs
b2NrLWxldmVsIGNoaWxkJ3MgYm90dG9tIG1hcmdpbiwgaWY6Ci0gICAgaWYgKCFsYXlvdXRCb3gu
c3R5bGUoKS5oZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
Ly8gdGhlIGJveCBoYXMgbm8gYm90dG9tIHBhZGRpbmcsIGFuZAotICAgIGlmIChoYXNQYWRkaW5n
QWZ0ZXIobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gdGhlIGJv
eCBoYXMgbm8gYm90dG9tIGJvcmRlciwgYW5kCi0gICAgaWYgKGhhc0JvcmRlckFmdGVyKGxheW91
dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIHRoZSBjaGlsZCdzIGJvdHRv
bSBtYXJnaW4gbmVpdGhlciBjb2xsYXBzZXMgd2l0aCBhIHRvcCBtYXJnaW4gdGhhdCBoYXMgY2xl
YXJhbmNlLi4uCi0gICAgaWYgKG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5C
ZWZvcmVXaXRoQ2xlYXJhbmNlKGxhc3RJbkZsb3dDaGlsZCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIC8vIG5vciAoaWYgdGhlIGJveCdzIG1pbi1oZWlnaHQgaXMgbm9uLXplcm8pIHdp
dGggdGhlIGJveCdzIHRvcCBtYXJnaW4uCi0gICAgYXV0byBjb21wdXRlZE1pbkhlaWdodCA9IGxh
eW91dEJveC5zdHlsZSgpLmxvZ2ljYWxNaW5IZWlnaHQoKTsKLSAgICBpZiAoIWNvbXB1dGVkTWlu
SGVpZ2h0LmlzQXV0bygpICYmIGNvbXB1dGVkTWluSGVpZ2h0LnZhbHVlKCkKLSAgICAgICAgJiYg
KG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXN0SW5GbG93Q2hp
bGQpIHx8IGhhc0NsZWFyYW5jZShsYXN0SW5GbG93Q2hpbGQpKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgLy8gTWFyZ2lucyBvZiBpbmxpbmUtYmxvY2sgYm94ZXMgZG8gbm90IGNvbGxh
cHNlLgotICAgIGlmIChsYXN0SW5GbG93Q2hpbGQuaXNJbmxpbmVCbG9ja0JveCgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBUaGlzIGlzIGEgcXVpcmsgYmVoYXZpb3I6IFdoZW4g
dGhlIG1hcmdpbiBhZnRlciBvZiB0aGUgbGFzdCBpbmZsb3cgY2hpbGQgKG9yIGEgcHJldmlvdXMg
c2libGluZyB3aXRoIGNvbGxhcHNlZCB0aHJvdWdoIG1hcmdpbnMpCi0gICAgLy8gY29sbGFwc2Vz
IHdpdGggYSBxdWlyayBwYXJlbnQncyB0aGUgbWFyZ2luIGJlZm9yZSwgdGhlbiB0aGUgc2FtZSBt
YXJnaW4gYWZ0ZXIgZG9lcyBub3QgY29sbGFwc2VzIHdpdGggdGhlIHBhcmVudCdzIG1hcmdpbiBh
ZnRlci4KLSAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVD
b2xsYXBzZWRRdWlya01hcmdpbihsYXlvdXRCb3gpICYmIG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0
aFBhcmVudE1hcmdpbkJlZm9yZShsYXN0SW5GbG93Q2hpbGQpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoTmV4dFNpYmxpbmdNYXJn
aW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91
dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7Ci0KLSAgICBpZiAoIWxheW91dEJveC5uZXh0SW5GbG93
U2libGluZygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gbWFyZ2luQmVm
b3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKCpsYXlvdXRCb3gubmV4
dEluRmxvd1NpYmxpbmcoKSk7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFy
Z2luQ29sbGFwc2U6Om1hcmdpbnNDb2xsYXBzZVRocm91Z2goY29uc3QgQm94JiBsYXlvdXRCb3gp
IGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7Ci0KLSAg
ICAvLyBBIGJveCdzIG93biBtYXJnaW5zIGNvbGxhcHNlIGlmIHRoZSAnbWluLWhlaWdodCcgcHJv
cGVydHkgaXMgemVybywgYW5kIGl0IGhhcyBuZWl0aGVyIHRvcCBvciBib3R0b20gYm9yZGVycyBu
b3IgdG9wIG9yIGJvdHRvbSBwYWRkaW5nLAotICAgIC8vIGFuZCBpdCBoYXMgYSAnaGVpZ2h0JyBv
ZiBlaXRoZXIgMCBvciAnYXV0bycsIGFuZCBpdCBkb2VzIG5vdCBjb250YWluIGEgbGluZSBib3gs
IGFuZCBhbGwgb2YgaXRzIGluLWZsb3cgY2hpbGRyZW4ncyBtYXJnaW5zIChpZiBhbnkpIGNvbGxh
cHNlLgotICAgIGlmIChoYXNCb3JkZXJCZWZvcmUobGF5b3V0Qm94KSB8fCBoYXNCb3JkZXJBZnRl
cihsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoaGFzUGFkZGlu
Z0JlZm9yZShsYXlvdXRCb3gpIHx8IGhhc1BhZGRpbmdBZnRlcihsYXlvdXRCb3gpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIGFyZSBub3QgYWRqb2luaW5nIHdoZW4g
dGhlIGJveCBoYXMgY2xlYXJhbmNlLgotICAgIGlmIChoYXNDbGVhcmFuY2UobGF5b3V0Qm94KSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5
bGUoKTsKLSAgICBhdXRvIGNvbXB1dGVkSGVpZ2h0VmFsdWVJc1plcm8gPSBzdHlsZS5oZWlnaHQo
KS5pc0ZpeGVkKCkgJiYgIXN0eWxlLmhlaWdodCgpLnZhbHVlKCk7Ci0gICAgaWYgKCEoc3R5bGUu
aGVpZ2h0KCkuaXNBdXRvKCkgfHwgY29tcHV0ZWRIZWlnaHRWYWx1ZUlzWmVybykpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIC8vIEZJWE1FOiBDaGVjayBmb3IgY29tcHV0ZWQgMCBoZWln
aHQuCi0gICAgaWYgKCFzdHlsZS5taW5IZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgLy8gRklYTUU6IEJsb2NrIHJlcGxhY2VkIGJveGVzIGNsZWFybHkgZG9u
J3QgY29sbGFwc2UgdGhyb3VnaCB0aGVpciBtYXJnaW5zLCBidXQgSSBjb3VsZG4ndCBmaW5kIGl0
IGluIHRoZSBzcGVjIHlldCAoYW5kIG5vLCBpdCdzIG5vdCBhIHF1aXJrKS4KLSAgICBpZiAobGF5
b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYg
KCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0g
ICAgaWYgKCFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQo
KSkKLSAgICAgICAgcmV0dXJuICFlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQobGF5
b3V0Qm94KTsKLQotICAgIGlmIChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4
dCgpKSB7Ci0gICAgICAgIGlmIChsYXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCgpKSB7Ci0gICAgICAgICAgICBhdXRvJiBsYXlvdXRTdGF0ZSA9IHRoaXMtPmxheW91
dFN0YXRlKCk7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB0aHJvdWdoIG1hcmdpbiBl
c3RpbWF0aW9uLCB3ZSBkb24ndCBuZWNlc3NhcmlseSBoYXZlIGFuIGFjdHVhbCBzdGF0ZSBmb3Ig
dGhpcyBsYXlvdXQgYm94IHNpbmNlCi0gICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHN0YXJ0ZWQg
bGF5aW5nIGl0IG91dCB5ZXQuCi0gICAgICAgICAgICBhdXRvJiBjb250YWluZXJCb3ggPSBkb3du
Y2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7Ci0gICAgICAgICAgICBpZiAoIWxheW91dFN0
YXRlLmhhc0lubGluZUZvcm1hdHRpbmdTdGF0ZShjb250YWluZXJCb3gpKQotICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgYXV0byBpc0NvbnNpZGVyZWRFbXB0eSA9
IFsmXSB7Ci0gICAgICAgICAgICAgICAgYXV0byYgaW5saW5lRm9ybWF0dGluZ1N0YXRlID0gbGF5
b3V0U3RhdGUuZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUoY29udGFpbmVyQm94KTsK
LSAgICAgICAgICAgICAgICBpZiAoIWlubGluZUZvcm1hdHRpbmdTdGF0ZS5saW5lcygpLmlzRW1w
dHkoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAg
IC8vIEFueSBmbG9hdCBib3ggaW4gdGhpcyBmb3JtYXR0aW5nIGNvbnRleHQgcHJldmVudHMgY29s
bGFwc2luZyB0aHJvdWdoLgotICAgICAgICAgICAgICAgIGF1dG8mIGZsb2F0cyA9IGlubGluZUZv
cm1hdHRpbmdTdGF0ZS5mbG9hdGluZ1N0YXRlKCkuZmxvYXRzKCk7Ci0gICAgICAgICAgICAgICAg
Zm9yIChhdXRvJiBmbG9hdEl0ZW0gOiBmbG9hdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KGZsb2F0SXRlbS5pc0luRm9ybWF0dGluZ0NvbnRleHRPZihjb250YWluZXJCb3gpKQotICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICByZXR1
cm4gaXNDb25zaWRlcmVkRW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEEgcm9vdCBv
ZiBhIG5vbi1pbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0ICh0YWJsZSwgZmxleCBldGMpIHdpdGgg
aW5mbG93IGRlc2NlbmRhbnRzIHNob3VsZCBub3QgY29sbGFwc2UgdGhyb3VnaC4KLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoYXV0byogaW5mbG93Q2hpbGQgPSBkb3du
Y2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQo
KTsgaW5mbG93Q2hpbGQ7IGluZmxvd0NoaWxkID0gaW5mbG93Q2hpbGQtPm5leHRJbkZsb3dPckZs
b2F0aW5nU2libGluZygpKSB7Ci0gICAgICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGlu
Z0NvbnRleHQoKmluZmxvd0NoaWxkKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgaWYgKCFtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKCppbmZsb3dDaGlsZCkpCi0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1Vc2VkVmVydGlj
YWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5n
Q29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OmNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdp
bihVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgYSwg
VXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIGIpIGNv
bnN0Ci17Ci0gICAgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6
VmFsdWVzIGNvbXB1dGVkVmFsdWVzOwotICAgIGlmIChhLnBvc2l0aXZlICYmIGIucG9zaXRpdmUp
Ci0gICAgICAgIGNvbXB1dGVkVmFsdWVzLnBvc2l0aXZlID0gc3RkOjptYXgoKmEucG9zaXRpdmUs
ICpiLnBvc2l0aXZlKTsKLSAgICBlbHNlCi0gICAgICAgIGNvbXB1dGVkVmFsdWVzLnBvc2l0aXZl
ID0gYS5wb3NpdGl2ZSA/IGEucG9zaXRpdmUgOiBiLnBvc2l0aXZlOwotCi0gICAgaWYgKGEubmVn
YXRpdmUgJiYgYi5uZWdhdGl2ZSkKLSAgICAgICAgY29tcHV0ZWRWYWx1ZXMubmVnYXRpdmUgPSBz
dGQ6Om1pbigqYS5uZWdhdGl2ZSwgKmIubmVnYXRpdmUpOwotICAgIGVsc2UKLSAgICAgICAgY29t
cHV0ZWRWYWx1ZXMubmVnYXRpdmUgPSBhLm5lZ2F0aXZlID8gYS5uZWdhdGl2ZSA6IGIubmVnYXRp
dmU7Ci0KLSAgICBpZiAoYS5pc05vblplcm8oKSAmJiBiLmlzTm9uWmVybygpKQotICAgICAgICBj
b21wdXRlZFZhbHVlcy5pc1F1aXJrID0gYS5pc1F1aXJrIHx8IGIuaXNRdWlyazsKLSAgICBlbHNl
IGlmIChhLmlzTm9uWmVybygpKQotICAgICAgICBjb21wdXRlZFZhbHVlcy5pc1F1aXJrID0gYS5p
c1F1aXJrOwotICAgIGVsc2UKLSAgICAgICAgY29tcHV0ZWRWYWx1ZXMuaXNRdWlyayA9IGIuaXNR
dWlyazsKLQotICAgIHJldHVybiBjb21wdXRlZFZhbHVlczsKLX0KLQotT3B0aW9uYWw8TGF5b3V0
VW5pdD4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpblZhbHVl
KFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBtYXJn
aW5WYWx1ZXMpIGNvbnN0Ci17Ci0gICAgLy8gV2hlbiB0d28gb3IgbW9yZSBtYXJnaW5zIGNvbGxh
cHNlLCB0aGUgcmVzdWx0aW5nIG1hcmdpbiB3aWR0aCBpcyB0aGUgbWF4aW11bSBvZiB0aGUgY29s
bGFwc2luZyBtYXJnaW5zJyB3aWR0aHMuCi0gICAgLy8gSW4gdGhlIGNhc2Ugb2YgbmVnYXRpdmUg
bWFyZ2lucywgdGhlIG1heGltdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgbmVnYXRp
dmUgYWRqb2luaW5nIG1hcmdpbnMgaXMgZGVkdWN0ZWQgZnJvbSB0aGUgbWF4aW11bQotICAgIC8v
IG9mIHRoZSBwb3NpdGl2ZSBhZGpvaW5pbmcgbWFyZ2lucy4gSWYgdGhlcmUgYXJlIG5vIHBvc2l0
aXZlIG1hcmdpbnMsIHRoZSBtYXhpbXVtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGFk
am9pbmluZyBtYXJnaW5zIGlzIGRlZHVjdGVkIGZyb20gemVyby4KLSAgICBpZiAoIW1hcmdpblZh
bHVlcy5uZWdhdGl2ZSkKLSAgICAgICAgcmV0dXJuIG1hcmdpblZhbHVlcy5wb3NpdGl2ZTsKLQot
ICAgIGlmICghbWFyZ2luVmFsdWVzLnBvc2l0aXZlKQotICAgICAgICByZXR1cm4gbWFyZ2luVmFs
dWVzLm5lZ2F0aXZlOwotCi0gICAgcmV0dXJuICptYXJnaW5WYWx1ZXMucG9zaXRpdmUgKyAqbWFy
Z2luVmFsdWVzLm5lZ2F0aXZlOwotfQotCi12b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1h
cmdpbkNvbGxhcHNlOjp1cGRhdGVNYXJnaW5BZnRlckZvclByZXZpb3VzU2libGluZyhCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0JiBibG9ja0Zvcm1hdHRpbmdDb250ZXh0LCBjb25zdCBNYXJnaW5Db2xs
YXBzZSYgbWFyZ2luQ29sbGFwc2UsIGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAgIC8vIDEu
IEdldCB0aGUgbWFyZ2luIGJlZm9yZSB2YWx1ZSBmcm9tIHRoZSBuZXh0IGluLWZsb3cgc2libGlu
Zy4gVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGlzIGJveCdzIG1hcmdpbiBhZnRlciB2YWx1ZSBub3cg
c2luY2UgdGhleSBhcmUgY29sbGFwc2VkLgotICAgIC8vIDIuIFVwZGF0ZSB0aGUgY29sbGFwc2Vk
IG1hcmdpbiBhZnRlciB2YWx1ZSBhcyB3ZWxsIGFzIHRoZSBwb3NpdGl2ZS9uZWdhdGl2ZSBjYWNo
ZS4KLSAgICAvLyAzLiBDaGVjayBpZiB0aGUgYm94J3MgbWFyZ2lucyBjb2xsYXBzZSB0aHJvdWdo
LgotICAgIC8vIDQuIElmIHNvLCB1cGRhdGUgdGhlIHBvc2l0aXZlL25lZ2F0aXZlIGNhY2hlLgot
ICAgIC8vIDUuIEluIGNhc2Ugb2YgY29sbGFwc2VkIHRocm91Z2ggbWFyZ2lucyBjaGVjayBpZiB0
aGUgYmVmb3JlIG1hcmdpbiBjb2xsYXBlcyB3aXRoIHRoZSBwcmV2aW91cyBpbmZsb3cgc2libGlu
ZydzIGFmdGVyIG1hcmdpbi4KLSAgICAvLyA2LiBJZiBzbywganVtcCB0byAjMi4KLSAgICAvLyA3
LiBObyBuZWVkIHRvIHByb3BhZ2F0ZSB0byBwYXJlbnQgYmVjYXVzZSBpdHMgbWFyZ2luIGlzIG5v
dCBjb21wdXRlZCB5ZXQgKHByZS1jb21wdXRlZCBhdCBtb3N0KS4KLSAgICBhdXRvKiBjdXJyZW50
Qm94ID0gJmxheW91dEJveDsKLSAgICBhdXRvJiBibG9ja0Zvcm1hdHRpbmdTdGF0ZSA9IGJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQuZm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgd2hpbGUgKG1hcmdpbkNv
bGxhcHNlLm1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRl
cigqY3VycmVudEJveCkpIHsKLSAgICAgICAgYXV0byYgcHJldmlvdXNTaWJsaW5nID0gKmN1cnJl
bnRCb3gtPnByZXZpb3VzSW5GbG93U2libGluZygpOwotICAgICAgICBhdXRvIHByZXZpb3VzU2li
bGluZ1ZlcnRpY2FsTWFyZ2luID0gYmxvY2tGb3JtYXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFy
Z2luKHByZXZpb3VzU2libGluZyk7Ci0KLSAgICAgICAgYXV0byBjb2xsYXBzZWRWZXJ0aWNhbE1h
cmdpbkJlZm9yZSA9IHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLmNvbGxhcHNlZFZhbHVl
cy5iZWZvcmU7Ci0gICAgICAgIGF1dG8gY29sbGFwc2VkVmVydGljYWxNYXJnaW5BZnRlciA9IGJs
b2NrRm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goKmN1cnJlbnRCb3gpLm1hcmdpbkJl
Zm9yZSgpOwotCi0gICAgICAgIGF1dG8gbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCA9IG1hcmdpbkNv
bGxhcHNlLm1hcmdpbnNDb2xsYXBzZVRocm91Z2gocHJldmlvdXNTaWJsaW5nKTsKLSAgICAgICAg
aWYgKG1hcmdpbnNDb2xsYXBzZVRocm91Z2gpCi0gICAgICAgICAgICBjb2xsYXBzZWRWZXJ0aWNh
bE1hcmdpbkJlZm9yZSA9IGNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luQWZ0ZXI7Ci0KLSAgICAgICAg
Ly8gVXBkYXRlIHBvc2l0aXZlL25lZ2F0aXZlIGNhY2hlLgotICAgICAgICBhdXRvIHByZXZpb3Vz
U2libGluZ1Bvc2l0aXZlTmVnYXRpdmVNYXJnaW4gPSBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2Vk
VmVydGljYWxNYXJnaW4ocHJldmlvdXNTaWJsaW5nKS5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVz
OwotICAgICAgICBhdXRvIHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUgPSBibG9ja0Zvcm1h
dHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4oKmN1cnJlbnRCb3gpLnBvc2l0aXZlQW5kTmVn
YXRpdmVWYWx1ZXMuYmVmb3JlOwotCi0gICAgICAgIGF1dG8gYWRqdXN0ZWRQcmV2aW91c1NpYmxp
bmdWZXJ0aWNhbE1hcmdpbiA9IHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luOwotICAgICAg
ICBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRp
dmVWYWx1ZXMuYWZ0ZXIgPSBtYXJnaW5Db2xsYXBzZS5jb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRp
dmVNYXJnaW4ocG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSwgcHJldmlvdXNTaWJsaW5nUG9z
aXRpdmVOZWdhdGl2ZU1hcmdpbi5hZnRlcik7Ci0gICAgICAgIGlmIChtYXJnaW5zQ29sbGFwc2VU
aHJvdWdoKSB7Ci0gICAgICAgICAgICBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFy
Z2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlID0gbWFyZ2luQ29sbGFwc2UuY29t
cHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKHByZXZpb3VzU2libGluZ1Bvc2l0aXZlTmVn
YXRpdmVNYXJnaW4uYmVmb3JlLCBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2lu
LnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0ZXIpOwotICAgICAgICAgICAgYWRqdXN0ZWRQ
cmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbi5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmFm
dGVyID0gYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbi5wb3NpdGl2ZUFuZE5l
Z2F0aXZlVmFsdWVzLmJlZm9yZTsKLSAgICAgICAgfQotICAgICAgICBibG9ja0Zvcm1hdHRpbmdT
dGF0ZS5zZXRVc2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNTaWJsaW5nLCBhZGp1c3RlZFByZXZp
b3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luKTsKLQotICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBz
ZVRocm91Z2gpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjdXJyZW50Qm94ID0gJnBy
ZXZpb3VzU2libGluZzsKLSAgICB9Ci19Ci0KLVVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVB
bmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xs
YXBzZTo6cG9zaXRpdmVOZWdhdGl2ZVZhbHVlcyhjb25zdCBCb3gmIGxheW91dEJveCwgTWFyZ2lu
VHlwZSBtYXJnaW5UeXBlKSBjb25zdAotewotICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IGZv
cm1hdHRpbmdDb250ZXh0KCkuZm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgLy8gQnkgdGhlIHRpbWUg
d2UgZ2V0IGhlcmUgaW4gQkZDIGxheW91dCB0byBnYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZl
IG1hcmdpbiB2YWx1ZXMgZm9yIGVpdGhlciBhIHByZXZpb3VzIHNpYmxpbmcgb3IgYSBjaGlsZCBi
b3gsCi0gICAgLy8gd2UgbXVzaCBoYXZlIGNvbXB1dGVkIGFuZCBjYWNoZWQgdGhvc2UgdmFsdWVz
LgotICAgIEFTU0VSVChmb3JtYXR0aW5nU3RhdGUuaGFzVXNlZFZlcnRpY2FsTWFyZ2luKGxheW91
dEJveCkpOwotICAgIGF1dG8gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luID0gZm9y
bWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpLnBvc2l0aXZlQW5kTmVn
YXRpdmVWYWx1ZXM7Ci0gICAgcmV0dXJuIG1hcmdpblR5cGUgPT0gTWFyZ2luVHlwZTo6QmVmb3Jl
ID8gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSA6IHBvc2l0aXZlQW5k
TmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5hZnRlcjsgCi19Ci0KLVVzZWRWZXJ0aWNhbE1hcmdpbjo6
UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpN
YXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxh
eW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFw
c2VkVmFsdWVzKSBjb25zdAotewotICAgIGF1dG8gZmlyc3RDaGlsZENvbGxhcHNlZE1hcmdpbkJl
Zm9yZSA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBh
aXI6OlZhbHVlcyB7Ci0gICAgICAgIGlmICghbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aEZpcnN0
SW5GbG93Q2hpbGRNYXJnaW5CZWZvcmUobGF5b3V0Qm94KSkKLSAgICAgICAgICAgIHJldHVybiB7
IH07Ci0gICAgICAgIHJldHVybiBwb3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKCpkb3duY2FzdDxDb250
YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dDaGlsZCgpLCBNYXJnaW5UeXBlOjpCZWZv
cmUpOwotICAgIH07Ci0KLSAgICBhdXRvIHByZXZpb3VTaWJsaW5nQ29sbGFwc2VkTWFyZ2luQWZ0
ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWly
OjpWYWx1ZXMgewotICAgICAgICBpZiAoIW1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91
c1NpYmxpbmdNYXJnaW5BZnRlcihsYXlvdXRCb3gpKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsK
LSAgICAgICAgcmV0dXJuIHBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMoKmxheW91dEJveC5wcmV2aW91
c0luRmxvd1NpYmxpbmcoKSwgTWFyZ2luVHlwZTo6QWZ0ZXIpOwotICAgIH07Ci0KLSAgICAvLyAx
LiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZnJvbSBmaXJzdCBj
aGlsZCBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcuCi0gICAgLy8gMi4gR2F0aGVyIHBvc2l0aXZl
IGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWVzIGZyb20gcHJldmlvdXMgaW5mbG93IHNpYmxpbmcg
aWYgbWFyZ2lucyBhcmUgYWRqb2luaW5nLgotICAgIC8vIDMuIENvbXB1dGUgbWluL21heCBwb3Np
dGl2ZSBhbmQgbmVnYXRpdmUgY29sbGFwc2VkIG1hcmdpbiB2YWx1ZXMgdXNpbmcgbm9uLWNvbGxw
YXNlZCBjb21wdXRlZCBtYXJnaW4gYmVmb3JlLgotICAgIGF1dG8gY29sbGFwc2VkTWFyZ2luQmVm
b3JlID0gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKGZpcnN0Q2hpbGRDb2xsYXBz
ZWRNYXJnaW5CZWZvcmUoKSwgcHJldmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5BZnRlcigpKTsK
LSAgICBpZiAoY29sbGFwc2VkTWFyZ2luQmVmb3JlLmlzUXVpcmsgJiYgZm9ybWF0dGluZ0NvbnRl
eHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihsYXlvdXRCb3gp
KQotICAgICAgICBjb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSB7IH07Ci0KLSAgICBVc2VkVmVydGlj
YWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgbm9uQ29sbGFwc2VkQmVm
b3JlOwotICAgIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlID4gMCkKLSAgICAgICAgbm9u
Q29sbGFwc2VkQmVmb3JlID0geyBub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlLCB7IH0sIGxheW91
dEJveC5zdHlsZSgpLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkgfTsKLSAgICBlbHNlIGlmIChub25D
b2xsYXBzZWRWYWx1ZXMuYmVmb3JlIDwgMCkKLSAgICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0g
eyB7IH0sIG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUsIGxheW91dEJveC5zdHlsZSgpLmhhc01h
cmdpbkJlZm9yZVF1aXJrKCkgfTsKLQotICAgIHJldHVybiBjb21wdXRlZFBvc2l0aXZlQW5kTmVn
YXRpdmVNYXJnaW4oY29sbGFwc2VkTWFyZ2luQmVmb3JlLCBub25Db2xsYXBzZWRCZWZvcmUpOwot
fQotCi1Vc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMg
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OnBvc2l0aXZlTmVnYXRpdmVN
YXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25D
b2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAotewotICAgIGF1dG8gbGFz
dENoaWxkQ29sbGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGljYWxNYXJnaW46
OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgewotICAgICAgICBpZiAoIW1hcmdpbkFm
dGVyQ29sbGFwc2VzV2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFmdGVyKGxheW91dEJveCkpCi0g
ICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICByZXR1cm4gcG9zaXRpdmVOZWdhdGl2ZVZh
bHVlcygqZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmxhc3RJbkZsb3dDaGlsZCgp
LCBNYXJnaW5UeXBlOjpBZnRlcik7Ci0gICAgfTsKLQotICAgIC8vIFdlIGRvbid0IGtub3cgeWV0
IHRoZSBtYXJnaW4gYmVmb3JlIHZhbHVlIG9mIHRoZSBuZXh0IHNpYmxpbmcuIExldCdzIGp1c3Qg
cHJldGVuZCBpdCBkb2VzIG5vdCBoYXZlIG9uZSBhbmQgCi0gICAgLy8gdXBkYXRlIGl0IGxhdGVy
IHdoZW4gd2UgY29tcHV0ZSB0aGUgbmV4dCBzaWJsaW5nJ3MgbWFyZ2luIGJlZm9yZS4gU2VlIHVw
ZGF0ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nLgotICAgIFVzZWRWZXJ0aWNhbE1hcmdp
bjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBub25Db2xsYXBzZWRBZnRlcjsKLSAg
ICBpZiAobm9uQ29sbGFwc2VkVmFsdWVzLmFmdGVyID4gMCkKLSAgICAgICAgbm9uQ29sbGFwc2Vk
QWZ0ZXIgPSB7IG5vbkNvbGxhcHNlZFZhbHVlcy5hZnRlciwgeyB9LCBsYXlvdXRCb3guc3R5bGUo
KS5oYXNNYXJnaW5BZnRlclF1aXJrKCkgfTsKLSAgICBlbHNlIGlmIChub25Db2xsYXBzZWRWYWx1
ZXMuYWZ0ZXIgPCAwKQotICAgICAgICBub25Db2xsYXBzZWRBZnRlciA9IHsgeyB9LCBub25Db2xs
YXBzZWRWYWx1ZXMuYWZ0ZXIsIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkFmdGVyUXVpcmso
KSB9OwotCi0gICAgcmV0dXJuIGNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihsYXN0
Q2hpbGRDb2xsYXBzZWRNYXJnaW5BZnRlcigpLCBub25Db2xsYXBzZWRBZnRlcik7Ci19Ci0KLUxh
eW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJl
Zm9yZUlnbm9yaW5nQ29sbGFwc2luZ1Rocm91Z2goY29uc3QgQm94JiBsYXlvdXRCb3gsIFVzZWRW
ZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIG5vbkNvbGxhcHNlZFZhbHVlcykKLXsK
LSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLSAgICByZXR1cm4gbWFy
Z2luVmFsdWUocG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gsIG5vbkNvbGxh
cHNlZFZhbHVlcykpLnZhbHVlT3Iobm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSk7Ci19Ci0KLVVz
ZWRWZXJ0aWNhbE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6
Y29sbGFwc2VkVmVydGljYWxWYWx1ZXMoY29uc3QgQm94JiBsYXlvdXRCb3gsIFVzZWRWZXJ0aWNh
bE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIG5vbkNvbGxhcHNlZFZhbHVlcykKLXsKLSAgICBB
U1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLSAgICAvLyAxLiBHZXQgbWluL21h
eCBtYXJnaW4gdG9wIHZhbHVlcyBmcm9tIHRoZSBmaXJzdCBpbi1mbG93IGNoaWxkIGlmIHdlIGFy
ZSBjb2xsYXBzaW5nIG1hcmdpbiB0b3Agd2l0aCBpdC4KLSAgICAvLyAyLiBHZXQgbWluL21heCBt
YXJnaW4gdG9wIHZhbHVlcyBmcm9tIHRoZSBwcmV2aW91cyBpbi1mbG93IHNpYmxpbmcsIGlmIHdl
IGFyZSBjb2xsYXBzaW5nIG1hcmdpbiB0b3Agd2l0aCBpdC4KLSAgICAvLyAzLiBHZXQgdGhpcyBs
YXlvdXQgYm94J3MgY29tcHV0ZWQgbWFyZ2luIHRvcCB2YWx1ZS4KLSAgICAvLyA0LiBVcGRhdGUg
dGhlIG1pbi9tYXggdmFsdWUgYW5kIGNvbXB1dGUgdGhlIGZpbmFsIG1hcmdpbi4KLSAgICBhdXRv
IHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6
UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXIgeyB0aGlzLT5wb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVm
b3JlKGxheW91dEJveCwgbm9uQ29sbGFwc2VkVmFsdWVzKSwgdGhpcy0+cG9zaXRpdmVOZWdhdGl2
ZU1hcmdpbkFmdGVyKGxheW91dEJveCwgbm9uQ29sbGFwc2VkVmFsdWVzKSB9OwotCi0gICAgYXV0
byBtYXJnaW5zQ29sbGFwc2VUaHJvdWdoID0gdGhpcy0+bWFyZ2luc0NvbGxhcHNlVGhyb3VnaChs
YXlvdXRCb3gpOwotICAgIGlmIChtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKSB7Ci0gICAgICAgIHBv
c2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPSBjb21wdXRlZFBvc2l0aXZl
QW5kTmVnYXRpdmVNYXJnaW4ocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9y
ZSwgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyKTsKLSAgICAgICAgcG9z
aXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyID0gcG9zaXRpdmVBbmROZWdhdGl2
ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZTsKLSAgICB9Ci0KLSAgICBhdXRvIGhhc0NvbGxhcHNlZE1h
cmdpbkJlZm9yZSA9IG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxkTWFy
Z2luQmVmb3JlKGxheW91dEJveCkgfHwgbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3Vz
U2libGluZ01hcmdpbkFmdGVyKGxheW91dEJveCk7Ci0gICAgYXV0byBoYXNDb2xsYXBzZWRNYXJn
aW5BZnRlciA9IG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFm
dGVyKGxheW91dEJveCk7Ci0gICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGlj
YWxNYXJnaW4geyBub25Db2xsYXBzZWRWYWx1ZXMsIHsgfSwgcG9zaXRpdmVBbmROZWdhdGl2ZVZl
cnRpY2FsTWFyZ2luIH07Ci0KLSAgICBpZiAoKGhhc0NvbGxhcHNlZE1hcmdpbkJlZm9yZSAmJiBo
YXNDb2xsYXBzZWRNYXJnaW5BZnRlcikgfHwgbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCkKLSAgICAg
ICAgdXNlZFZlcnRpY2FsTWFyZ2luLmNvbGxhcHNlZFZhbHVlcyA9IHsgbWFyZ2luVmFsdWUocG9z
aXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSksIG1hcmdpblZhbHVlKHBvc2l0
aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5hZnRlciksIG1hcmdpbnNDb2xsYXBzZVRocm91
Z2ggfTsKLSAgICBlbHNlIGlmIChoYXNDb2xsYXBzZWRNYXJnaW5CZWZvcmUpCi0gICAgICAgIHVz
ZWRWZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1ZXMgPSB7IG1hcmdpblZhbHVlKHBvc2l0aXZl
QW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5iZWZvcmUpLCB7IH0sIGZhbHNlIH07Ci0gICAgZWxz
ZSBpZiAoaGFzQ29sbGFwc2VkTWFyZ2luQWZ0ZXIpCi0gICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdp
bi5jb2xsYXBzZWRWYWx1ZXMgPSB7IHsgfSwgbWFyZ2luVmFsdWUocG9zaXRpdmVBbmROZWdhdGl2
ZVZlcnRpY2FsTWFyZ2luLmFmdGVyKSwgZmFsc2UgfTsKLSAgICByZXR1cm4gdXNlZFZlcnRpY2Fs
TWFyZ2luOwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9ibG9ja2Zvcm1hdHRpbmcvUHJlY29tcHV0ZWRCbG9ja01hcmdpbkNvbGxhcHNlLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvUHJlY29tcHV0ZWRCbG9ja01h
cmdpbkNvbGxhcHNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmYjNkNTU0
ZmU2OGRlNDI3MzFmZjhlMmQ0YjIwZWFiZjY1OWVjMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0
aW5nL1ByZWNvbXB1dGVkQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAt
MSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBt
ZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRl
ICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJ
TkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVk
ZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCi0jaW5jbHVk
ZSAiTGF5b3V0U3RhdGUuaCIKLSNpbmNsdWRlICJMYXlvdXRVbml0LmgiCi0jaW5jbHVkZSAiUmVu
ZGVyU3R5bGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0K
LVVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cHJlY29tcHV0ZWRQb3NpdGl2ZU5l
Z2F0aXZlVmFsdWVzKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIGF1dG8mIGJs
b2NrRm9ybWF0dGluZ1N0YXRlID0gZG93bmNhc3Q8QmxvY2tGb3JtYXR0aW5nU3RhdGU+KGxheW91
dFN0YXRlKCkuZm9ybWF0dGluZ1N0YXRlRm9yQm94KGxheW91dEJveCkpOwotICAgIGlmIChibG9j
a0Zvcm1hdHRpbmdTdGF0ZS5oYXNVc2VkVmVydGljYWxNYXJnaW4obGF5b3V0Qm94KSkKLSAgICAg
ICAgcmV0dXJuIGJsb2NrRm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRC
b3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlOwotCi0gICAgYXV0byBnZW9tZXRy
eSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnkoKTsKLSAgICBhdXRvIGhvcml6b250YWxD
b25zdHJhaW50cyA9IGdlb21ldHJ5LmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChsYXlvdXRC
b3guY29udGFpbmluZ0Jsb2NrKCkpLmhvcml6b250YWw7Ci0gICAgYXV0byBjb21wdXRlZFZlcnRp
Y2FsTWFyZ2luID0gZ2VvbWV0cnkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gsIGhv
cml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgYXV0byBub25Db2xsYXBzZWRNYXJnaW4gPSBVc2Vk
VmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB7IGNvbXB1dGVkVmVydGljYWxNYXJn
aW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVP
cigwKSB9OwotICAgIHJldHVybiBwcmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZv
cmUobGF5b3V0Qm94LCBub25Db2xsYXBzZWRNYXJnaW4pOwotfQotCi1Vc2VkVmVydGljYWxNYXJn
aW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6TWFyZ2luQ29sbGFwc2U6OnByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9y
ZShjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRW
YWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAotewotICAgIGF1dG8gZmlyc3RDaGlsZENv
bGxhcHNlZE1hcmdpbkJlZm9yZSA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRp
dmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7Ci0gICAgICAgIGlmICghbWFyZ2luQmVmb3JlQ29s
bGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJnaW5CZWZvcmUobGF5b3V0Qm94KSkKLSAgICAg
ICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIHJldHVybiBwcmVjb21wdXRlZFBvc2l0aXZlTmVn
YXRpdmVWYWx1ZXMoKmRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5maXJzdEluRmxv
d0NoaWxkKCkpOwotICAgIH07Ci0KLSAgICBhdXRvIHByZXZpb3VTaWJsaW5nQ29sbGFwc2VkTWFy
Z2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRp
dmVQYWlyOjpWYWx1ZXMgewotICAgICAgICBpZiAoIW1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQ
cmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcihsYXlvdXRCb3gpKQotICAgICAgICAgICAgcmV0dXJu
IHsgfTsKLSAgICAgICAgYXV0byYgcHJldmlvdXNJbkZsb3dTaWJsaW5nID0gKmxheW91dEJveC5w
cmV2aW91c0luRmxvd1NpYmxpbmcoKTsKLSAgICAgICAgYXV0byYgYmxvY2tGb3JtYXR0aW5nU3Rh
dGUgPSBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4obGF5b3V0U3RhdGUoKS5mb3JtYXR0
aW5nU3RhdGVGb3JCb3gocHJldmlvdXNJbkZsb3dTaWJsaW5nKSk7Ci0gICAgICAgIHJldHVybiBi
bG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNJbkZsb3dTaWJs
aW5nKS5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmFmdGVyOwotICAgIH07Ci0KLSAgICAvLyAx
LiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZnJvbSBmaXJzdCBj
aGlsZCBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcuCi0gICAgLy8gMi4gR2F0aGVyIHBvc2l0aXZl
IGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWVzIGZyb20gcHJldmlvdXMgaW5mbG93IHNpYmxpbmcg
aWYgbWFyZ2lucyBhcmUgYWRqb2luaW5nLgotICAgIC8vIDMuIENvbXB1dGUgbWluL21heCBwb3Np
dGl2ZSBhbmQgbmVnYXRpdmUgY29sbGFwc2VkIG1hcmdpbiB2YWx1ZXMgdXNpbmcgbm9uLWNvbGxw
YXNlZCBjb21wdXRlZCBtYXJnaW4gYmVmb3JlLgotICAgIGF1dG8gY29sbGFwc2VkTWFyZ2luQmVm
b3JlID0gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKGZpcnN0Q2hpbGRDb2xsYXBz
ZWRNYXJnaW5CZWZvcmUoKSwgcHJldmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5BZnRlcigpKTsK
LSAgICBpZiAoY29sbGFwc2VkTWFyZ2luQmVmb3JlLmlzUXVpcmsgJiYgZm9ybWF0dGluZ0NvbnRl
eHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihsYXlvdXRCb3gp
KQotICAgICAgICBjb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSB7IH07Ci0KLSAgICBhdXRvIG5vbkNv
bGxhcHNlZEJlZm9yZSA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBh
aXI6OlZhbHVlcyB7IH07Ci0gICAgaWYgKG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUgPiAwKQot
ICAgICAgICBub25Db2xsYXBzZWRCZWZvcmUgPSB7IG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUs
IHsgfSwgbGF5b3V0Qm94LnN0eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSB9OwotICAgIGVs
c2UgaWYgKG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUgPCAwKQotICAgICAgICBub25Db2xsYXBz
ZWRCZWZvcmUgPSB7IHsgfSwgbm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSwgbGF5b3V0Qm94LnN0
eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSB9OwotCi0gICAgcmV0dXJuIGNvbXB1dGVkUG9z
aXRpdmVBbmROZWdhdGl2ZU1hcmdpbihjb2xsYXBzZWRNYXJnaW5CZWZvcmUsIG5vbkNvbGxhcHNl
ZEJlZm9yZSk7Ci19Ci0KLVByZWNvbXB1dGVkTWFyZ2luQmVmb3JlIEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjpwcmVjb21wdXRlZE1hcmdpbkJlZm9yZShjb25zdCBCb3gm
IGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgdXNlZE5v
bkNvbGxhcHNlZE1hcmdpbikKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJv
eCgpKTsKLSAgICAvLyBEb24ndCBwcmUtY29tcHV0ZSB2ZXJ0aWNhbCBtYXJnaW5zIGZvciBvdXQg
b2YgZmxvdyBib3hlcy4KLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5GbG93KCkgfHwgbGF5b3V0
Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOwotICAgIEFTU0VSVCghbGF5b3V0Qm94LmlzUmVw
bGFjZWRCb3goKSk7Ci0KLSAgICBhdXRvIHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUgPSBw
cmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUobGF5b3V0Qm94LCB1c2VkTm9u
Q29sbGFwc2VkTWFyZ2luKTsKLSAgICBhdXRvIGNvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IG1hcmdp
blZhbHVlKHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUpOwotICAgIHJldHVybiB7IHVzZWRO
b25Db2xsYXBzZWRNYXJnaW4uYmVmb3JlLCBjb2xsYXBzZWRNYXJnaW5CZWZvcmUsIHBvc2l0aXZl
TmVnYXRpdmVNYXJnaW5CZWZvcmUgfTsKLX0KLQotfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdy
YXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9i
bG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzZkZjY1Y2E0YmI3MTM2
MDRlYWI3MDAxNmNmN2RlZjFjMjJmMDRkLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFi
bGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCisrKyAvZGV2
L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Ci0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
LSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0g
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgi
Ci0jaW5jbHVkZSAiVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0jaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJCbG9ja0Zvcm1h
dHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkludmFsaWRhdGlvblN0YXRlLmgiCi0jaW5jbHVkZSAi
TGF5b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDaGlsZEl0ZXJhdG9yLmgiCi0j
aW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWlu
aW5nQmxvY2suaCIKLSNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVk
ZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNw
YWNlIExheW91dCB7Ci0KLVdURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChUYWJsZVdyYXBwZXJC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0KTsKLQotVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6VGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJC
b3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgQmxvY2tGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRp
bmdTdGF0ZSkKLSAgICA6IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHRS
b290LCBmb3JtYXR0aW5nU3RhdGUpCi17Ci19Ci0KLXZvaWQgVGFibGVXcmFwcGVyQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dDo6bGF5b3V0SW5GbG93Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYsIGNv
bnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgLy8g
VGhlIHRhYmxlIGdlbmVyYXRlcyBhIHByaW5jaXBhbCBibG9jayBjb250YWluZXIgYm94IGNhbGxl
ZCB0aGUgdGFibGUgd3JhcHBlciBib3ggdGhhdCBjb250YWlucyB0aGUgdGFibGUgYm94IGl0c2Vs
ZiBhbmQgYW55IGNhcHRpb24gYm94ZXMKLSAgICAvLyAoaW4gZG9jdW1lbnQgb3JkZXIpLiBUaGUg
dGFibGUgYm94IGlzIGEgYmxvY2stbGV2ZWwgYm94IHRoYXQgY29udGFpbnMgdGhlIHRhYmxlJ3Mg
aW50ZXJuYWwgdGFibGUgYm94ZXMuCi0gICAgLy8gVGhlIGNhcHRpb24gYm94ZXMgYXJlIHByaW5j
aXBhbCBibG9jay1sZXZlbCBib3hlcyB0aGF0IHJldGFpbiB0aGVpciBvd24gY29udGVudCwgcGFk
ZGluZywgbWFyZ2luLCBhbmQgYm9yZGVyIGFyZWFzLCBhbmQgYXJlIHJlbmRlcmVkCi0gICAgLy8g
YXMgbm9ybWFsIGJsb2NrIGJveGVzIGluc2lkZSB0aGUgdGFibGUgd3JhcHBlciBib3guIFdoZXRo
ZXIgdGhlIGNhcHRpb24gYm94ZXMgYXJlIHBsYWNlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHRhYmxl
IGJveCBpcyBkZWNpZGVkIGJ5Ci0gICAgLy8gdGhlICdjYXB0aW9uLXNpZGUnIHByb3BlcnR5LCBh
cyBkZXNjcmliZWQgYmVsb3cuCi0gICAgZm9yIChhdXRvJiBjaGlsZCA6IGNoaWxkcmVuT2ZUeXBl
PENvbnRhaW5lckJveD4ocm9vdCgpKSkgewotICAgICAgICBpZiAoY2hpbGQuaXNUYWJsZUJveCgp
KQotICAgICAgICAgICAgbGF5b3V0VGFibGVCb3goY2hpbGQsIGNvbnN0cmFpbnRzKTsKLSAgICAg
ICAgZWxzZSBpZiAoY2hpbGQuaXNUYWJsZUNhcHRpb24oKSkKLSAgICAgICAgICAgIEFTU0VSVF9O
T1RfSU1QTEVNRU5URURfWUVUKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwotICAgIH0KLX0KLQotdm9pZCBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpsYXlvdXRUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBj
b25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQotewotICAgIGxh
eW91dFN0YXRlKCkuZW5zdXJlVGFibGVGb3JtYXR0aW5nU3RhdGUodGFibGVCb3gpOwotCi0gICAg
Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmdGb3JUYWJsZUJveCh0YWJsZUJveCwgY29uc3RyYWludHMu
aG9yaXpvbnRhbCk7Ci0gICAgY29tcHV0ZVN0YXRpY1ZlcnRpY2FsUG9zaXRpb24odGFibGVCb3gs
IGNvbnN0cmFpbnRzLnZlcnRpY2FsKTsKLSAgICBjb21wdXRlV2lkdGhBbmRNYXJnaW5Gb3JUYWJs
ZUJveCh0YWJsZUJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgY29tcHV0ZVN0YXRp
Y0hvcml6b250YWxQb3NpdGlvbih0YWJsZUJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0K
LSAgICBpZiAodGFibGVCb3guaGFzQ2hpbGQoKSkgewotICAgICAgICBhdXRvIGludmFsaWRhdGlv
blN0YXRlID0gSW52YWxpZGF0aW9uU3RhdGUgeyB9OwotICAgICAgICBMYXlvdXRDb250ZXh0Ojpj
cmVhdGVGb3JtYXR0aW5nQ29udGV4dCh0YWJsZUJveCwgbGF5b3V0U3RhdGUoKSktPmxheW91dElu
Rmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGdlb21ldHJ5KCkuY29uc3RyYWludHNGb3JJ
bkZsb3dDb250ZW50KHRhYmxlQm94KSk7Ci0gICAgfQotCi0gICAgY29tcHV0ZUhlaWdodEFuZE1h
cmdpbkZvclRhYmxlQm94KHRhYmxlQm94LCBjb25zdHJhaW50cyk7Ci19Ci0KLXZvaWQgVGFibGVX
cmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmdGb3JU
YWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBjb25zdCBIb3Jpem9udGFsQ29u
c3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKLXsKLSAgICBBU1NFUlQodGFibGVCb3gu
aXNUYWJsZUJveCgpKTsKLSAgICBpZiAoIXRhYmxlQm94Lmhhc0NoaWxkKCkgfHwgdGFibGVCb3gu
c3R5bGUoKS5ib3JkZXJDb2xsYXBzZSgpID09IEJvcmRlckNvbGxhcHNlOjpTZXBhcmF0ZSkgewot
ICAgICAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlQm9yZGVyQW5kUGFkZGluZyh0
YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LSAgICAvLyBVQXMgbXVzdCBjb21wdXRlIGFuIGluaXRpYWwgbGVmdCBhbmQgcmlnaHQgYm9yZGVy
IHdpZHRoIGZvciB0aGUgdGFibGUgYnkgZXhhbWluaW5nCi0gICAgLy8gdGhlIGZpcnN0IGFuZCBs
YXN0IGNlbGxzIGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIHRhYmxlLgotICAgIC8vIFRoZSBsZWZ0
IGJvcmRlciB3aWR0aCBvZiB0aGUgdGFibGUgaXMgaGFsZiBvZiB0aGUgZmlyc3QgY2VsbCdzIGNv
bGxhcHNlZCBsZWZ0IGJvcmRlciwKLSAgICAvLyBhbmQgdGhlIHJpZ2h0IGJvcmRlciB3aWR0aCBv
ZiB0aGUgdGFibGUgaXMgaGFsZiBvZiB0aGUgbGFzdCBjZWxsJ3MgY29sbGFwc2VkIHJpZ2h0IGJv
cmRlci4KLSAgICAvLyBUaGUgdG9wIGJvcmRlciB3aWR0aCBvZiB0aGUgdGFibGUgaXMgY29tcHV0
ZWQgYnkgZXhhbWluaW5nIGFsbCBjZWxscyB3aG8gY29sbGFwc2UgdGhlaXIgdG9wCi0gICAgLy8g
Ym9yZGVycyB3aXRoIHRoZSB0b3AgYm9yZGVyIG9mIHRoZSB0YWJsZS4gVGhlIHRvcCBib3JkZXIg
d2lkdGggb2YgdGhlIHRhYmxlIGlzIGVxdWFsIHRvIGhhbGYgb2YgdGhlCi0gICAgLy8gbWF4aW11
bSBjb2xsYXBzZWQgdG9wIGJvcmRlci4gVGhlIGJvdHRvbSBib3JkZXIgd2lkdGggaXMgY29tcHV0
ZWQgYnkgZXhhbWluaW5nIGFsbCBjZWxscyB3aG9zZSBib3R0b20gYm9yZGVycyBjb2xsYXBzZQot
ICAgIC8vIHdpdGggdGhlIGJvdHRvbSBvZiB0aGUgdGFibGUuIFRoZSBib3R0b20gYm9yZGVyIHdp
ZHRoIGlzIGVxdWFsIHRvIGhhbGYgb2YgdGhlIG1heGltdW0gY29sbGFwc2VkIGJvdHRvbSBib3Jk
ZXIuCi0gICAgYXV0byYgZ3JpZCA9IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRUYWJsZUZvcm1h
dHRpbmdTdGF0ZSh0YWJsZUJveCkudGFibGVHcmlkKCk7Ci0gICAgYXV0byB0YWJsZUJvcmRlciA9
IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIodGFibGVCb3gpOwotCi0gICAgYXV0byYgZmlyc3RD
b2x1bW5GaXJzdFJvd0JveCA9IGdyaWQuc2xvdCh7IDAgLCAwIH0pLT5jZWxsKCkuYm94KCk7Ci0g
ICAgYXV0byBsZWZ0Qm9yZGVyID0gc3RkOjptYXgodGFibGVCb3JkZXIuaG9yaXpvbnRhbC5sZWZ0
LCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKGZpcnN0Q29sdW1uRmlyc3RSb3dCb3gpLmhvcml6
b250YWwubGVmdCk7Ci0KLSAgICBhdXRvJiBsYXN0Q29sdW1uRmlyc3RSb3cgPSBncmlkLnNsb3Qo
eyBncmlkLmNvbHVtbnMoKS5zaXplKCkgLSAxLCAwIH0pLT5jZWxsKCkuYm94KCk7Ci0gICAgYXV0
byByaWdodEJvcmRlciA9IHN0ZDo6bWF4KHRhYmxlQm9yZGVyLmhvcml6b250YWwucmlnaHQsIGdl
b21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIobGFzdENvbHVtbkZpcnN0Um93KS5ob3Jpem9udGFsLnJp
Z2h0KTsKLQotICAgIGF1dG8gdG9wQm9yZGVyID0gdGFibGVCb3JkZXIudmVydGljYWwudG9wOwot
ICAgIGF1dG8gYm90dG9tQm9yZGVyID0gdGFibGVCb3JkZXIudmVydGljYWwuYm90dG9tOwotICAg
IGF1dG8gbGFzdFJvd0luZGV4ID0gZ3JpZC5yb3dzKCkuc2l6ZSgpIC0gMTsKLSAgICBmb3IgKHNp
emVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgZ3JpZC5jb2x1bW5zKCkuc2l6ZSgp
OyArK2NvbHVtbkluZGV4KSB7Ci0gICAgICAgIGF1dG8mIGJveEluRmlyc3RSb3ggPSBncmlkLnNs
b3QoeyBjb2x1bW5JbmRleCwgMCB9KS0+Y2VsbCgpLmJveCgpOwotICAgICAgICBhdXRvJiBib3hJ
bkxhc3RSb3cgPSBncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgbGFzdFJvd0luZGV4IH0pLT5jZWxs
KCkuYm94KCk7Ci0KLSAgICAgICAgdG9wQm9yZGVyID0gc3RkOjptYXgodG9wQm9yZGVyLCBnZW9t
ZXRyeSgpLmNvbXB1dGVkQm9yZGVyKGJveEluRmlyc3RSb3gpLnZlcnRpY2FsLnRvcCk7Ci0gICAg
ICAgIGJvdHRvbUJvcmRlciA9IHN0ZDo6bWF4KGJvdHRvbUJvcmRlciwgZ2VvbWV0cnkoKS5jb21w
dXRlZEJvcmRlcihib3hJbkxhc3RSb3cpLnZlcnRpY2FsLmJvdHRvbSk7Ci0gICAgfQotCi0gICAg
dG9wQm9yZGVyID0gc3RkOjptYXgodG9wQm9yZGVyLCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVy
KCp0YWJsZUJveC5maXJzdENoaWxkKCkpLnZlcnRpY2FsLnRvcCk7Ci0gICAgZm9yIChhdXRvJiBz
ZWN0aW9uIDogY2hpbGRyZW5PZlR5cGU8Q29udGFpbmVyQm94Pih0YWJsZUJveCkpIHsKLSAgICAg
ICAgYXV0byBob3JpenRvbmFsQm9yZGVyID0gZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihzZWN0
aW9uKS5ob3Jpem9udGFsOwotICAgICAgICBsZWZ0Qm9yZGVyID0gc3RkOjptYXgobGVmdEJvcmRl
ciwgaG9yaXp0b25hbEJvcmRlci5sZWZ0KTsKLSAgICAgICAgcmlnaHRCb3JkZXIgPSBzdGQ6Om1h
eChyaWdodEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5yaWdodCk7Ci0gICAgfQotICAgIGJvdHRv
bUJvcmRlciA9IHN0ZDo6bWF4KGJvdHRvbUJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRl
cigqdGFibGVCb3gubGFzdENoaWxkKCkpLnZlcnRpY2FsLmJvdHRvbSk7Ci0KLSAgICBhdXRvJiBy
b3dzID0gZ3JpZC5yb3dzKCkubGlzdCgpOwotICAgIHRvcEJvcmRlciA9IHN0ZDo6bWF4KHRvcEJv
cmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihyb3dzLmZpcnN0KCkuYm94KCkpLnZlcnRp
Y2FsLnRvcCk7Ci0gICAgZm9yIChhdXRvJiByb3cgOiByb3dzKSB7Ci0gICAgICAgIGF1dG8gaG9y
aXp0b25hbEJvcmRlciA9IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIocm93LmJveCgpKS5ob3Jp
em9udGFsOwotICAgICAgICBsZWZ0Qm9yZGVyID0gc3RkOjptYXgobGVmdEJvcmRlciwgaG9yaXp0
b25hbEJvcmRlci5sZWZ0KTsKLSAgICAgICAgcmlnaHRCb3JkZXIgPSBzdGQ6Om1heChyaWdodEJv
cmRlciwgaG9yaXp0b25hbEJvcmRlci5yaWdodCk7Ci0gICAgfQotICAgIGJvdHRvbUJvcmRlciA9
IHN0ZDo6bWF4KGJvdHRvbUJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihyb3dzLmxh
c3QoKS5ib3goKSkudmVydGljYWwuYm90dG9tKTsKLQotICAgIGF1dG8gY29sbGFwc2VkQm9yZGVy
ID0gRWRnZXMgeyB7IGxlZnRCb3JkZXIsIHJpZ2h0Qm9yZGVyIH0sIHsgdG9wQm9yZGVyLCBib3R0
b21Cb3JkZXIgfSB9OwotICAgIGdyaWQuc2V0Q29sbGFwc2VkQm9yZGVyKGNvbGxhcHNlZEJvcmRl
cik7Ci0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21l
dHJ5KHRhYmxlQm94KTsKLSAgICBib3hHZW9tZXRyeS5zZXRCb3JkZXIoY29sbGFwc2VkQm9yZGVy
IC8gMik7Ci0gICAgYm94R2VvbWV0cnkuc2V0UGFkZGluZyhnZW9tZXRyeSgpLmNvbXB1dGVkUGFk
ZGluZyh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aCkpOwotfQot
Ci12b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVXaWR0aEFu
ZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQotewotICAgIEFTU0VS
VCh0YWJsZUJveC5pc1RhYmxlQm94KCkpOwotICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIHRhYmxl
ICJmaXQtY29udGVudCBzaXplIiBiZWhhdmlvciBoYW5kbGluZy4gTm90IGluIHRoZSBzcGVjIHRo
b3VnaC4KLSAgICAvLyBUYWJsZSByZXR1cm5zIGl0cyBmaW5hbCB3aWR0aCBhcyBtaW4vbWF4LiBV
c2UgdGhpcyBmaW5hbCB3aWR0aCB2YWx1ZSB0byBjb21wdXRlZCBob3Jpem9udGFsIG1hcmdpbnMg
ZXRjLgotICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZUZvclRhYmxlQm94ID0gbGF5b3V0U3RhdGUo
KS5lc3RhYmxpc2hlZFRhYmxlRm9ybWF0dGluZ1N0YXRlKHRhYmxlQm94KTsKLSAgICBhdXRvIGlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsK
LSAgICBpZiAoYXV0byBwcmVjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBmb3Jt
YXR0aW5nU3RhdGVGb3JUYWJsZUJveC5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkpCi0gICAg
ICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSAqcHJlY29tcHV0ZWRJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzOwotICAgIGVsc2UgewotICAgICAgICBpZiAodGFibGVCb3guaGFzQ2hpbGQo
KSkKLSAgICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBMYXlvdXRDb250ZXh0
OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dCh0YWJsZUJveCwgbGF5b3V0U3RhdGUoKSktPmNvbXB1
dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOwotICAgICAgICBmb3JtYXR0aW5nU3RhdGVG
b3JUYWJsZUJveC5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMpOwotICAgIH0KLQotICAgIGF1dG8gYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlID0g
aG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAgICAvLyAxLiBUaGUgdGFibGUg
Z2VuZXJhdGVzIGEgcHJpbmNpcGFsIGJsb2NrIGNvbnRhaW5lciBib3ggY2FsbGVkIHRoZSB0YWJs
ZSB3cmFwcGVyIGJveCB0aGF0IGNvbnRhaW5zIHRoZSB0YWJsZSBib3ggaXRzZWxmIGFuZCBhbnkg
Y2FwdGlvbiBib3hlcy4KLSAgICAvLyAyLiBUaGUgdGFibGUgd3JhcHBlciBib3ggZXN0YWJsaXNo
ZXMgYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGFuZCB0aGUgdGFibGUgYm94IGVzdGFibGlz
aGVzIGEgdGFibGUgZm9ybWF0dGluZyBjb250ZXh0LgotICAgIC8vIDMuIFRoZSBjb21wdXRlZCB2
YWx1ZXMgb2YgcHJvcGVydGllcyAncG9zaXRpb24nLCAnZmxvYXQnLCAnbWFyZ2luLSonLCAndG9w
JywgJ3JpZ2h0JywgJ2JvdHRvbScsIGFuZCAnbGVmdCcgb24KLSAgICAvLyAgICB0aGUgdGFibGUg
ZWxlbWVudCBhcmUgdXNlZCBvbiB0aGUgdGFibGUgd3JhcHBlciBib3ggYW5kIG5vdCB0aGUgdGFi
bGUgYm94OyBhbGwgb3RoZXIgdmFsdWVzIG9mIG5vbi1pbmhlcml0YWJsZQotICAgIC8vICAgIHBy
b3BlcnRpZXMgYXJlIHVzZWQgb24gdGhlIHRhYmxlIGJveCBhbmQgbm90IHRoZSB0YWJsZSB3cmFw
cGVyIGJveC4KLSAgICAvLyA0LiBJbiBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCwgZWFjaCBi
b3gncyBsZWZ0IG91dGVyIGVkZ2UgdG91Y2hlcyB0aGUgbGVmdCBlZGdlIG9mIHRoZSBjb250YWlu
aW5nIGJsb2NrLgotICAgIC8vICAgIFRoaXMgaXMgdHJ1ZSBldmVuIGluIHRoZSBwcmVzZW5jZSBv
ZiBmbG9hdHMsIHVubGVzcyB0aGUgYm94IGVzdGFibGlzaGVzIGEgbmV3IGJsb2NrIGZvcm1hdHRp
bmcgY29udGV4dCAoaW4gd2hpY2ggY2FzZSB0aGUKLSAgICAvLyAgICBib3ggaXRzZWxmIG1heSBi
ZWNvbWUgbmFycm93ZXIgZHVlIHRvIHRoZSBmbG9hdHMpCi0gICAgLy8KLSAgICAvLyBOb3cgY29u
c2lkZXIgdGhlIGZvbGxvd2luZyBjYXNlOgotICAgIC8vIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGJs
b2NrOyB3aWR0aDogNTAwcHg7Ij4KLSAgICAvLyAgICAgPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7
IHdpZHRoOiAxMDBweDsiPjwvZGl2PgotICAgIC8vICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxh
eTogdGFibGU7IHdpZHRoOiAxMCU7Ij48L2Rpdj4KLSAgICAvLyAgICAgPC9kaXY+Ci0gICAgLy8g
PC9kaXY+Ci0gICAgLy8gMS4gV2UgY3JlYXRlIGEgdGFibGUgd3JhcHBlciBib3ggdG8gd3JhcCB0
aGUgImRpc3BsYXk6IHRhYmxlIiBibG9jayBsZXZlbCBib3ggKCMxKS4KLSAgICAvLyAyLiBUaGUg
dGFibGUgd3JhcHBlciBib3gncyB3aWR0aCBwcm9wZXJ0eSBpcyBzZXQgdG8gYXV0byAoIzMpLgot
ICAgIC8vIDMuIFNpbmNlIGl0IGVzdGFibGlzaGVzIGEgbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29u
dGV4dCwgdGhlIGF2YWlsYWJsZSBob3Jpem9udGFsIHNwYWNlIGdldHMgc2hydW5rIGJ5IHRoZSBm
bG9hdCAoIzQpCi0gICAgLy8gNC4gVGhlIHRhYmxlIHdyYXBwZXIgYm94J3MgdXNlZCB3aWR0aCBj
b21wdXRlcyB0byA1MDBweCAtIDEwMHB4IC0+IDQwMHB4OwotICAgIC8vCi0gICAgLy8gTm93IHdl
IGFyZSBpbnNpZGUgdGhlIEJGQyBlc3RhYmxpc2hlZCBieSB0aGUgdGFibGUgd3JhcHBlciBib3gg
YW5kIHRyeSB0byByZXNvbHZlIHRoZSB0YWJsZSdzIHdpZHRoIC0+ICUxMC4KLSAgICAvLyBBY2Nv
cmRpbmcgdG8gdGhlIG5vcm1hbCBCRkMgcnVsZXMsIGl0IHNob3VsZCBjb21wdXRlIHRvIDEwJSBv
ZiB0aGUgY29udGFpbmluZyBibG9jaydzIGxvZ2ljYWwgd2lkdGg6IDQwMHB4IC0+IDQwcHguCi0g
ICAgLy8gSG93ZXZlciBpbiBwcmFjdGljZSBpdCBjb21wdXRlcyB0byA1MHB4ICgxMCUgb2YgNTAw
cHgpLgotICAgIC8vIFNpbWlsYXIgc2V0dXAgd2l0aCBub24tdGFibGUgY29udGVudCB3b3VsZCBy
ZXNvbHZlIHRoZSBpbm5lciBibG9jayBsZXZlbCBib3gncyB3aWR0aCB0byA0MHB4OwotICAgIC8v
IFRoaXMgbmVlZHMgY2xhcmlmaWNhdGlvbiBpbiB0aGUgc3BlYy4KLSAgICBhdXRvIGhvcml6b250
YWxDb25zdHJhaW50Rm9yUmVzb2x2aW5nV2lkdGggPSBtX2hvcml6b250YWxDb25zdHJhaW50c0ln
bm9yaW5nRmxvYXRzLmxvZ2ljYWxXaWR0aDsKLSAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2Vv
bWV0cnkoKTsKLSAgICBhdXRvIGNvbXB1dGVkV2lkdGggPSBnZW9tZXRyeS5jb21wdXRlZFdpZHRo
KHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRoKTsKLSAgICBh
dXRvIGNvbXB1dGVkTWF4V2lkdGggPSBnZW9tZXRyeS5jb21wdXRlZE1heFdpZHRoKHRhYmxlQm94
LCBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRoKTsKLSAgICBhdXRvIGNvbXB1
dGVkTWluV2lkdGggPSBnZW9tZXRyeS5jb21wdXRlZE1pbldpZHRoKHRhYmxlQm94LCBob3Jpem9u
dGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRoKTsKLSAgICAvLyBVc2UgdGhlIGdlbmVyaWMg
c2hyaW5rLXRvLWZpdC13aWR0aCBsb2dpYyBhcyB0aGUgaW5pdGlhbCB3aWR0aCBmb3IgdGhlIHRh
YmxlLgotICAgIGF1dG8gdXNlZFdpZHRoID0gc3RkOjptaW4oc3RkOjptYXgoaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cy5taW5pbXVtLCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpLCBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0pOwotICAgIGlmIChjb21wdXRlZFdpZHRoIHx8IGNv
bXB1dGVkTWluV2lkdGggfHwgY29tcHV0ZWRNYXhXaWR0aCkgewotICAgICAgICBpZiAoY29tcHV0
ZWRXaWR0aCkgewotICAgICAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBjb21wdXRlZCB3aWR0aCB2
YWx1ZSBmaXJzdC4KLSAgICAgICAgICAgIGlmIChjb21wdXRlZE1heFdpZHRoICYmICpjb21wdXRl
ZFdpZHRoID4gKmNvbXB1dGVkTWF4V2lkdGgpCi0gICAgICAgICAgICAgICAgY29tcHV0ZWRXaWR0
aCA9IGNvbXB1dGVkTWF4V2lkdGg7Ci0gICAgICAgICAgICBpZiAoY29tcHV0ZWRNaW5XaWR0aCAm
JiAqY29tcHV0ZWRXaWR0aCA8ICpjb21wdXRlZE1pbldpZHRoKQotICAgICAgICAgICAgICAgIGNv
bXB1dGVkV2lkdGggPSBjb21wdXRlZE1pbldpZHRoOwotICAgICAgICAgICAgdXNlZFdpZHRoID0g
KmNvbXB1dGVkV2lkdGggPCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0gPyBpbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0gOiAqY29tcHV0ZWRXaWR0aDsKLSAgICAgICAg
fQotCi0gICAgICAgIGlmIChjb21wdXRlZE1heFdpZHRoICYmICpjb21wdXRlZE1heFdpZHRoIDwg
dXNlZFdpZHRoKQotICAgICAgICAgICAgdXNlZFdpZHRoID0gaW50cmluc2ljV2lkdGhDb25zdHJh
aW50cy5taW5pbXVtOwotICAgICAgICBpZiAoY29tcHV0ZWRNaW5XaWR0aCAmJiAqY29tcHV0ZWRN
aW5XaWR0aCA+IHVzZWRXaWR0aCkKLSAgICAgICAgICAgIHVzZWRXaWR0aCA9ICpjb21wdXRlZE1p
bldpZHRoOwotICAgIH0KLQotICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFyZ2luID0gZ2VvbWV0
cnkuaW5GbG93Q29udGVudFdpZHRoQW5kTWFyZ2luKHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3Ry
YWludHMsIE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzIHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0K
LSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KHRh
YmxlQm94KTsKLSAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudFdpZHRo
QW5kTWFyZ2luLmNvbnRlbnRXaWR0aCk7Ci0gICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1h
cmdpbih7IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0LCBjb250ZW50V2lk
dGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgfSk7Ci19Ci0KLXZvaWQgVGFibGVXcmFwcGVyQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUhlaWdodEFuZE1hcmdpbkZvclRhYmxlQm94KGNv
bnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29u
dGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgQVNTRVJUKHRhYmxlQm94LmlzVGFibGVCb3goKSk7
Ci0gICAgLy8gVGFibGUgaXMgYSBzcGVjaWFsIEJGQyBjb250ZW50LiBJdHMgaGVpZ2h0IGlzIG1h
aW5seSBkcml2ZW4gYnkgdGhlIGNvbnRlbnQuIENvbXB1dGVkIGhlaWdodCwgbWluLWhlaWdodCBh
bmQgbWF4LWhlaWdodCBhcmUgYWxsCi0gICAgLy8gYWxyZWFkeSBiZWVuIHRha2VuIGludG8gYWNj
b3VudCBkdXJpbmcgdGhlIFRGQyBsYXlvdXQuCi0gICAgYXV0byBoZWlnaHRBbmRNYXJnaW4gPSBn
ZW9tZXRyeSgpLmluRmxvd0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4odGFibGVCb3gsIGNvbnN0cmFp
bnRzLmhvcml6b250YWwsIHsgcXVpcmtzKCkub3ZlcnJpZGRlblRhYmxlSGVpZ2h0KHRhYmxlQm94
KSB9KTsKLQotICAgIGF1dG8gbWFyZ2luQ29sbGFwc2UgPSB0aGlzLT5tYXJnaW5Db2xsYXBzZSgp
OwotICAgIGF1dG8gdmVydGljYWxNYXJnaW4gPSBtYXJnaW5Db2xsYXBzZS5jb2xsYXBzZWRWZXJ0
aWNhbFZhbHVlcyh0YWJsZUJveCwgaGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbik7
Ci0gICAgLy8gQ2FjaGUgdGhlIGNvbXB1dGVkIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4g
dmFsdWUgcGFpci4KLSAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRVc2VkVmVydGljYWxNYXJnaW4o
dGFibGVCb3gsIHZlcnRpY2FsTWFyZ2luKTsKLQotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9y
bWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkodGFibGVCb3gpOwotICAgIGJveEdlb21ldHJ5LnNl
dExvZ2ljYWxUb3AodmVydGljYWxQb3NpdGlvbldpdGhNYXJnaW4odGFibGVCb3gsIHZlcnRpY2Fs
TWFyZ2luLCBjb25zdHJhaW50cy52ZXJ0aWNhbCkpOwotICAgIGJveEdlb21ldHJ5LnNldENvbnRl
bnRCb3hIZWlnaHQoaGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpOwotICAgIGJveEdlb21l
dHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKSwgbWFy
Z2luQWZ0ZXIodmVydGljYWxNYXJnaW4pIH0pOwotICAgIC8vIEFkanVzdCB0aGUgcHJldmlvdXMg
c2libGluZydzIG1hcmdpbiBib3R0b20gbm93IHRoYXQgdGhpcyBib3gncyB2ZXJ0aWNhbCBtYXJn
aW4gaXMgY29tcHV0ZWQuCi0gICAgTWFyZ2luQ29sbGFwc2U6OnVwZGF0ZU1hcmdpbkFmdGVyRm9y
UHJldmlvdXNTaWJsaW5nKCp0aGlzLCBtYXJnaW5Db2xsYXBzZSwgdGFibGVCb3gpOwotfQotCi19
Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9y
bWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5o
IGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFi
bGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwZGVhMTU3Y2M1MjE2Zjg4NGZkMjg5ODM0YTNjODY2OTUzNzQyN2E1Li4wMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0
dGluZ0NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgot
ICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgot
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAq
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwot
Ci0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQot
Ci0jaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgPHd0Zi9Jc29N
YWxsb2MuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLS8v
IFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgc3BlY2lhbCBibG9jayBmb3JtYXR0aW5nIGNvbnRl
eHQgbGF5b3V0IGxvZ2ljIGZvciB0aGUgdGFibGUgd3JhcHBlci4KLS8vIGh0dHBzOi8vd3d3Lncz
Lm9yZy9UUi9DU1MyMi90YWJsZXMuaHRtbCNtb2RlbAotY2xhc3MgVGFibGVXcmFwcGVyQmxvY2tG
b3JtYXR0aW5nQ29udGV4dCBmaW5hbCA6IHB1YmxpYyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0IHsK
LSAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQpOwotcHVibGljOgotICAgIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQo
Y29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGlu
Z1N0YXRlJik7Ci0KLSAgICB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3Rh
dGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSBmaW5hbDsKLQotICAgIHZv
aWQgc2V0SG9yaXpvbnRhbENvbnN0cmFpbnRzSWdub3JpbmdGbG9hdHMoY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIHsgbV9ob3Jpem9udGFsQ29uc3Ry
YWludHNJZ25vcmluZ0Zsb2F0cyA9IGhvcml6b250YWxDb25zdHJhaW50czsgfQotCi1wcml2YXRl
OgotICAgIGNsYXNzIFF1aXJrcyA6IHB1YmxpYyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWly
a3MgewotICAgIHB1YmxpYzoKLSAgICAgICAgUXVpcmtzKGNvbnN0IFRhYmxlV3JhcHBlckJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQmKTsKLQotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBvdmVy
cmlkZGVuVGFibGVIZWlnaHQoY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCkgY29uc3Q7Ci0g
ICAgfTsKLSAgICBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgcXVp
cmtzKCkgY29uc3QgeyByZXR1cm4gUXVpcmtzKCp0aGlzKTsgfQotCi0gICAgdm9pZCBsYXlvdXRU
YWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBjb25zdCBDb25zdHJhaW50c0Zv
ckluRmxvd0NvbnRlbnQmKTsKLQotICAgIHZvaWQgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmdGb3JU
YWJsZUJveChjb25zdCBDb250YWluZXJCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMm
KTsKLSAgICB2b2lkIGNvbXB1dGVXaWR0aEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRh
aW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOwotICAgIHZvaWQgY29tcHV0
ZUhlaWdodEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IENv
bnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOwotCi1wcml2YXRlOgotICAgIEhvcml6b250YWxD
b25zdHJhaW50cyBtX2hvcml6b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxvYXRzOwotfTsKLQot
aW5saW5lIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6UXVpcmtz
KGNvbnN0IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250
ZXh0KQotICAgIDogQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzKGZvcm1hdHRpbmdDb250
ZXh0KQotewotfQotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1B
VFRJTkdfQ09OVEVYVChUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LCBpc1RhYmxl
V3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdy
YXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0
dGluZ0NvbnRleHRRdWlya3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWRh
OTJlZDI4Zjc5N2YzYjgyNmIwZmI5MTU0MjVlYjc4OWJiOTk1Li4wMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9ibG9ja2Zv
cm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHRR
dWlya3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNp
bmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2lu
Y2x1ZGUgIkxheW91dFN0YXRlLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1PcHRpb25hbDxMYXlvdXRVbml0PiBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpRdWlya3M6Om92ZXJyaWRkZW5UYWJsZUhlaWdodChjb25zdCBDb250YWluZXJC
b3gmIHRhYmxlQm94KSBjb25zdAotewotICAgIGlmIChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9k
ZSgpKSB7Ci0gICAgICAgIC8vIEluIHF1aXJrcyBtb2RlIGFsd2F5cyB1c2UgdGhlIGNvbnRlbnQg
aGVpZ2h0LiBOb3RlIHRoYXQgdGhlIHRhYmxlcyB3aXRoIGNvbnRlbnQgdGFrZSBjb21wdXRlZCB2
YWx1ZXMgaW50byBhY2NvdW50LgotICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5jb250ZW50SGVp
Z2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KHRhYmxlQm94KTsKLSAgICB9Ci0gICAgcmV0dXJu
IHRhYmxlQm94Lmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpID8gZ2VvbWV0cnkoKS5jb250ZW50
SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KHRhYmxlQm94KSA6IE9wdGlvbmFsPExheW91
dFVuaXQ+IHsgfTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5j
cHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNTdmZDY5OTA0Mjg2OTdlODVkMTcx
ZjZkM2FjOGQ1ODdhY2FjZjguLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0
aW5nQ29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0g
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQot
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJGbGV4Rm9ybWF0dGluZ0NvbnRleHQu
aCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAi
RmxleEZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIklubGluZVJlY3QuaCIKLSNpbmNsdWRl
ICJJbnZhbGlkYXRpb25TdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0j
aW5jbHVkZSAiTGF5b3V0Q2hpbGRJdGVyYXRvci5oIgotI2luY2x1ZGUgIkxheW91dENvbnRleHQu
aCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29y
ZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEZs
ZXhGb3JtYXR0aW5nQ29udGV4dCk7Ci0KLUZsZXhGb3JtYXR0aW5nQ29udGV4dDo6RmxleEZvcm1h
dHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBG
bGV4Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCi0gICAgOiBGb3JtYXR0aW5nQ29u
dGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKLXsKLX0KLQotdm9p
ZCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9u
U3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQot
ewotICAgIGNvbXB1dGVJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yRmxleEl0ZW1zKCk7Ci0g
ICAgc2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0cmFpbnRzKTsKLX0KLQotTGF5b3V0VW5pdCBG
bGV4Rm9ybWF0dGluZ0NvbnRleHQ6OnVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3QKLXsKLSAgICBh
dXRvJiBsaW5lcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmxpbmVzKCk7Ci0gICAgcmV0dXJuIExheW91
dFVuaXQgeyBsaW5lcy5sYXN0KCkuYm90dG9tKCkgLSBsaW5lcy5maXJzdCgpLnRvcCgpIH07Ci19
Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIEZsZXhGb3Jt
YXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkKLXsKLSAg
ICByZXR1cm4geyB9OwotfQotCi12b2lkIEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6c2l6ZUFuZFBs
YWNlRmxleEl0ZW1zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWlu
dHMpCi17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRl
KCk7Ci0gICAgYXV0byBnZW9tZXRyeSA9IHRoaXMtPmdlb21ldHJ5KCk7Ci0gICAgYXV0byBmbGV4
SXRlbU1haW5BeGlzU3RhcnQgPSBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxMZWZ0Owot
ICAgIGF1dG8gZmxleEl0ZW1NYWluQXhpc0VuZCA9IGZsZXhJdGVtTWFpbkF4aXNTdGFydDsKLSAg
ICBhdXRvIGZsZXhJdGVtQ3Jvc0F4aXNTdGFydCA9IGNvbnN0cmFpbnRzLnZlcnRpY2FsLmxvZ2lj
YWxUb3A7Ci0gICAgYXV0byBmbGV4SXRlbUNyb3NBeGlzRW5kID0gZmxleEl0ZW1Dcm9zQXhpc1N0
YXJ0OwotICAgIGZvciAoYXV0byYgZmxleEl0ZW0gOiBjaGlsZHJlbk9mVHlwZTxDb250YWluZXJC
b3g+KHJvb3QoKSkpIHsKLSAgICAgICAgQVNTRVJUKGZsZXhJdGVtLmVzdGFibGlzaGVzRm9ybWF0
dGluZ0NvbnRleHQoKSk7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUs
IGxldCdzIGxheW91dCB0aGUgZmxleCBpdGVtcyBhbmQgcGxhY2UgdGhlbSBuZXh0IHRvIGVhY2gg
b3RoZXIgc2V0dXAuCi0gICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhzID0gZm9ybWF0dGluZ1N0
YXRlLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goZmxleEl0ZW0pOwotICAgICAgICBh
dXRvIGZsZXhJdGVtTG9naWNhbFdpZHRoID0gc3RkOjptaW4oc3RkOjptYXgoaW50cmluc2ljV2lk
dGhzLT5taW5pbXVtLCBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxXaWR0aCksIGludHJp
bnNpY1dpZHRocy0+bWF4aW11bSk7Ci0gICAgICAgIGF1dG8gZmxleEl0ZW1Db25zdHJhaW50cyA9
IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCB7IHsgeyB9LCBmbGV4SXRlbUxvZ2ljYWxXaWR0
aCB9LCB7IH0gfTsKLQotICAgICAgICBhdXRvIGludmFsaWRhdGlvblN0YXRlID0gSW52YWxpZGF0
aW9uU3RhdGUgeyB9OwotICAgICAgICBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29u
dGV4dChmbGV4SXRlbSwgbGF5b3V0U3RhdGUoKSktPmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxp
ZGF0aW9uU3RhdGUsIGZsZXhJdGVtQ29uc3RyYWludHMpOwotCi0gICAgICAgIGF1dG8gY29tcHV0
ZUZsZXhJdGVtR2VvbWV0cnkgPSBbJl0gewotICAgICAgICAgICAgYXV0byYgZmxleEl0ZW1HZW9t
ZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShmbGV4SXRlbSk7Ci0KLSAgICAgICAg
ICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQoTGF5b3V0UG9pbnQgeyBmbGV4
SXRlbU1haW5BeGlzRW5kLCBmbGV4SXRlbUNyb3NBeGlzU3RhcnQgfSk7Ci0KLSAgICAgICAgICAg
IGZsZXhJdGVtR2VvbWV0cnkuc2V0Qm9yZGVyKGdlb21ldHJ5LmNvbXB1dGVkQm9yZGVyKGZsZXhJ
dGVtKSk7Ci0gICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldFBhZGRpbmcoZ2VvbWV0cnku
Y29tcHV0ZWRQYWRkaW5nKGZsZXhJdGVtLCBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxX
aWR0aCkpOwotCi0gICAgICAgICAgICBhdXRvIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IGdl
b21ldHJ5LmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihmbGV4SXRlbSwgY29uc3RyYWludHMuaG9y
aXpvbnRhbCk7Ci0gICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldEhvcml6b250YWxNYXJn
aW4oeyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwX2x1KSwgY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDBfbHUpIH0pOwotCi0gICAgICAgICAgICBh
dXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBnZW9tZXRyeS5jb21wdXRlZFZlcnRpY2FsTWFy
Z2luKGZsZXhJdGVtLCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICAgICAgICAgIGZsZXhJ
dGVtR2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJl
Zm9yZS52YWx1ZU9yKDBfbHUpLCBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3Io
MF9sdSkgfSk7Ci0KLSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0Q29udGVudEJveEhl
aWdodChnZW9tZXRyeS5jb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KGZsZXhJ
dGVtKSk7Ci0gICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChm
bGV4SXRlbUxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgICAgICBmbGV4SXRlbU1haW5BeGlzRW5kPSBC
b3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChmbGV4SXRlbUdlb21ldHJ5KS5yaWdodCgpOwotICAg
ICAgICAgICAgZmxleEl0ZW1Dcm9zQXhpc0VuZCA9IHN0ZDo6bWF4KGZsZXhJdGVtQ3Jvc0F4aXNF
bmQsIEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGZsZXhJdGVtR2VvbWV0cnkpLmJvdHRvbSgp
KTsKLSAgICAgICAgfTsKLSAgICAgICAgY29tcHV0ZUZsZXhJdGVtR2VvbWV0cnkoKTsKLSAgICB9
Ci0gICAgYXV0byBmbGV4TGluZSA9IElubGluZVJlY3QgeyBmbGV4SXRlbUNyb3NBeGlzU3RhcnQs
IGZsZXhJdGVtTWFpbkF4aXNTdGFydCwgZmxleEl0ZW1NYWluQXhpc0VuZCAtIGZsZXhJdGVtTWFp
bkF4aXNTdGFydCwgZmxleEl0ZW1Dcm9zQXhpc0VuZCAtIGZsZXhJdGVtQ3Jvc0F4aXNTdGFydCB9
OwotICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lKGZsZXhMaW5lKTsKLX0KLQotdm9pZCBGbGV4
Rm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yRmxl
eEl0ZW1zKCkKLXsKLSAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5n
U3RhdGUoKTsKLSAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2VvbWV0cnkoKTsKLSAgICBmb3Ig
KGF1dG8mIGZsZXhJdGVtIDogY2hpbGRyZW5PZlR5cGU8Q29udGFpbmVyQm94Pihyb290KCkpKSB7
Ci0gICAgICAgIGlmIChmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50c0Zv
ckJveChmbGV4SXRlbSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZm9ybWF0dGlu
Z1N0YXRlLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goZmxleEl0ZW0sIGdlb21l
dHJ5LmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoZmxleEl0ZW0pKTsKLSAgICB9Ci19Ci0KLX0K
LX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxleGZvcm1h
dHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxl
eGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDgxYTBlNDA2OWZmZDEwMjk2ODhjYzUxNmNmZDk1OTBjY2M5MzY1MmIuLjAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5oCisrKyAvZGV2L251
bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAq
IGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5B
QkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGbGV4Rm9ybWF0dGlu
Z1N0YXRlLmgiCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlIDx3dGYv
SXNvTWFsbG9jLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewot
Ci1jbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKLS8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUg
bGF5b3V0IGxvZ2ljIGZvciBmbGV4IGZvcm1hdHRpbmcgY29udGV4dHMuCi0vLyBodHRwczovL3d3
dy53My5vcmcvVFIvY3NzLWZsZXhib3gtMS8KLWNsYXNzIEZsZXhGb3JtYXR0aW5nQ29udGV4dCBm
aW5hbCA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dCB7Ci0gICAgV1RGX01BS0VfSVNPX0FMTE9D
QVRFRChGbGV4Rm9ybWF0dGluZ0NvbnRleHQpOwotcHVibGljOgotICAgIEZsZXhGb3JtYXR0aW5n
Q29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgRmxleEZv
cm1hdHRpbmdTdGF0ZSYpOwotICAgIHZvaWQgbGF5b3V0SW5GbG93Q29udGVudChJbnZhbGlkYXRp
b25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpIG92ZXJyaWRlOwot
ICAgIExheW91dFVuaXQgdXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdCBvdmVycmlkZTsKLQotICAg
IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzKCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRz
IHBvc2l0aW9uaW5nIGFuZCBzaXppbmcgZm9yIGZsZXggaXRlbXMuCi0gICAgY2xhc3MgR2VvbWV0
cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKLSAgICBwdWJsaWM6Ci0g
ICAgICAgIEdlb21ldHJ5KGNvbnN0IEZsZXhGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0gICAgICAg
IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25z
dCBDb250YWluZXJCb3gmKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IEZsZXhGb3Jt
YXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2Fz
dDxGbGV4Rm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Zm9y
bWF0dGluZ0NvbnRleHQoKSk7IH0KLSAgICB9OwotICAgIEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6
R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBHZW9tZXRyeSgqdGhpcyk7IH0KLQot
ICAgIHZvaWQgc2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93
Q29udGVudCYpOwotICAgIHZvaWQgY29tcHV0ZUludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JG
bGV4SXRlbXMoKTsKLQotICAgIGNvbnN0IEZsZXhGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdT
dGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEZsZXhGb3JtYXR0aW5nU3RhdGU+KEZvcm1h
dHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KLSAgICBGbGV4Rm9ybWF0dGluZ1N0
YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3duY2FzdDxGbGV4Rm9ybWF0dGluZ1N0
YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9Ci19OwotCi1pbmxp
bmUgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6R2VvbWV0cnkoY29uc3QgRmxleEZv
cm1hdHRpbmdDb250ZXh0JiBmbGV4Rm9ybWF0dGluZ0NvbnRleHQpCi0gICAgOiBGb3JtYXR0aW5n
Q29udGV4dDo6R2VvbWV0cnkoZmxleEZvcm1hdHRpbmdDb250ZXh0KQotewotfQotCi19Ci19Ci0K
LVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChGbGV4Rm9y
bWF0dGluZ0NvbnRleHQsIGlzRmxleEZvcm1hdHRpbmdDb250ZXh0KCkpCi0KLSNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0
aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mbGV4Zm9ybWF0
dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IGRjN2M4ZGQwOTgwOWQxZDBiNTg0YWJmZjc4ZGQxNzkxYmZmNDY4OTguLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNw
cAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAi
Y29uZmlnLmgiCi0jaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFC
TEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZsZXhGb3JtYXR0aW5n
U3RhdGUuaCIKLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91
dENvbnRleHQuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0K
LUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIEZsZXhGb3JtYXR0
aW5nQ29udGV4dDo6R2VvbWV0cnk6OmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3QgQ29u
dGFpbmVyQm94JiBmbGV4SXRlbSkKLXsKLSAgICBhdXRvIGZpeGVkTWFyZ2luQm9yZGVyQW5kUGFk
ZGluZyA9IFsmXShhdXRvJiBsYXlvdXRCb3gpIHsKLSAgICAgICAgYXV0byYgc3R5bGUgPSBsYXlv
dXRCb3guc3R5bGUoKTsKLSAgICAgICAgcmV0dXJuIGZpeGVkVmFsdWUoc3R5bGUubWFyZ2luU3Rh
cnQoKSkudmFsdWVPcigwKQotICAgICAgICAgICAgKyBMYXlvdXRVbml0IHsgc3R5bGUuYm9yZGVy
TGVmdFdpZHRoKCkgfQotICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0eWxlLnBhZGRpbmdMZWZ0
KCkpLnZhbHVlT3IoMCkKLSAgICAgICAgICAgICsgZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nUmln
aHQoKSkudmFsdWVPcigwKQotICAgICAgICAgICAgKyBMYXlvdXRVbml0IHsgc3R5bGUuYm9yZGVy
UmlnaHRXaWR0aCgpIH0KLSAgICAgICAgICAgICsgZml4ZWRWYWx1ZShzdHlsZS5tYXJnaW5FbmQo
KSkudmFsdWVPcigwKTsKLSAgICB9OwotCi0gICAgYXV0byBjb21wdXRlZEludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMgPSBbJl0oKSAtPiBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsKLSAgICAg
ICAgYXV0byBsb2dpY2FsV2lkdGggPSBmbGV4SXRlbS5zdHlsZSgpLmxvZ2ljYWxXaWR0aCgpOwot
ICAgICAgICAvLyBNaW5pbXVtL21heGltdW0gd2lkdGggY2FuJ3QgYmUgZGVwZW5kaW5nIG9uIHRo
ZSBjb250YWluaW5nIGJsb2NrJ3Mgd2lkdGguCi0gICAgICAgIGF1dG8gbmVlZHNSZXNvbHZlZENv
bnRhaW5pbmdCbG9ja1dpZHRoID0gbG9naWNhbFdpZHRoLmlzQ2FsY3VsYXRlZCgpIHx8IGxvZ2lj
YWxXaWR0aC5pc1BlcmNlbnQoKSB8fCBsb2dpY2FsV2lkdGguaXNSZWxhdGl2ZSgpOwotICAgICAg
ICBpZiAobmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRoKQotICAgICAgICAgICAgcmV0
dXJuIHsgfTsKLQotICAgICAgICBpZiAoYXV0byB3aWR0aCA9IGZpeGVkVmFsdWUobG9naWNhbFdp
ZHRoKSkKLSAgICAgICAgICAgIHJldHVybiB7ICp3aWR0aCwgKndpZHRoIH07Ci0KLSAgICAgICAg
QVNTRVJUKGZsZXhJdGVtLmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7Ci0gICAgICAg
IGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZv
cm1hdHRpbmdDb250ZXh0KGZsZXhJdGVtLCBsYXlvdXRTdGF0ZSgpKS0+Y29tcHV0ZWRJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGlmIChsb2dpY2FsV2lkdGguaXNNaW5Db250
ZW50KCkpCi0gICAgICAgICAgICByZXR1cm4geyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1p
bmltdW0sIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSB9OwotICAgICAgICBpZiAo
bG9naWNhbFdpZHRoLmlzTWF4Q29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIHsgaW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtLCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1h
eGltdW0gfTsKLSAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Ci0gICAg
fTsKLSAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBjb25zdHJhaW5CeU1pbk1h
eFdpZHRoKGZsZXhJdGVtLCBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSk7Ci0g
ICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQoZml4ZWRNYXJnaW5Cb3JkZXJBbmRQ
YWRkaW5nKGZsZXhJdGVtKSk7Ci0gICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7
Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
ZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5jcHAKZGVsZXRlZCBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWZjODVhMDM4NTJkMzM1MjYxMzg0MGYzMTIyYzczM2M1NGZh
YTAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3RhdGUuY3BwCisr
KyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
LSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgot
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25m
aWcuaCIKLSNpbmNsdWRlICJGbGV4Rm9ybWF0dGluZ1N0YXRlLmgiCi0KLSNpZiBFTkFCTEUoTEFZ
T1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVz
Lmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1XVEZfTUFL
RV9JU09fQUxMT0NBVEVEX0lNUEwoRmxleEZvcm1hdHRpbmdTdGF0ZSk7Ci0KLUZsZXhGb3JtYXR0
aW5nU3RhdGU6OkZsZXhGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYgZmxvYXRp
bmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQotICAgIDogRm9ybWF0dGluZ1N0YXRl
KFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OkZsZXgsIGxheW91dFN0YXRlKQotewotfQot
Ci1GbGV4Rm9ybWF0dGluZ1N0YXRlOjp+RmxleEZvcm1hdHRpbmdTdGF0ZSgpCi17Ci19Ci0KLX0K
LX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2ZsZXhmb3JtYXR0
aW5nL0ZsZXhGb3JtYXR0aW5nU3RhdGUuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mbGV4Zm9y
bWF0dGluZy9GbGV4Rm9ybWF0dGluZ1N0YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IGEwNjNiOWRhMmE1YjhkYzI3MDIwODc5NGE0ODM2NTQ0MTYwOWUzYTMuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3RhdGUuaAorKysgL2Rldi9udWxsCkBAIC0x
LDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0
OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiRm9ybWF0dGluZ1N0YXRlLmgiCi0j
aW5jbHVkZSAiSW5saW5lUmVjdC5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLQotbmFt
ZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIEZsZXhGb3JtYXR0
aW5nU3RhdGUgOiBwdWJsaWMgRm9ybWF0dGluZ1N0YXRlIHsKLSAgICBXVEZfTUFLRV9JU09fQUxM
T0NBVEVEKEZsZXhGb3JtYXR0aW5nU3RhdGUpOwotcHVibGljOgotICAgIEZsZXhGb3JtYXR0aW5n
U3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRlJik7Ci0gICAgfkZsZXhGb3Jt
YXR0aW5nU3RhdGUoKTsKLQotICAgIGNvbnN0IGF1dG8mIGxpbmVzKCkgY29uc3QgeyByZXR1cm4g
bV9saW5lczsgfQotICAgIHZvaWQgYWRkTGluZShjb25zdCBJbmxpbmVSZWN0JiBsaW5lKSB7IG1f
bGluZXMuYXBwZW5kKGxpbmUpOyB9Ci0KLXByaXZhdGU6Ci0gICAgVmVjdG9yPElubGluZVJlY3Q+
IG1fbGluZXM7Ci19OwotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZP
Uk1BVFRJTkdfU1RBVEUoRmxleEZvcm1hdHRpbmdTdGF0ZSwgaXNGbGV4Rm9ybWF0dGluZ1N0YXRl
KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9Gb3JtYXR0aW5nQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL0Zvcm1hdHRpbmdDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45ODU3
ZGJhMmM3ZDY1Mjk2MGM0MTFmYWJjYTM1NzU4Njk1YmExMTI4Ci0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9Gb3JtYXR0aW5nQ29udGV4
dC5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
KyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisg
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9S
TUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVk
ZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRl
ICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgor
I2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKKyNpbmNsdWRlICJMYXlvdXREZXNjZW5kYW50SXRl
cmF0b3IuaCIKKyNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5j
bHVkZSAiTGF5b3V0UmVwbGFjZWRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2lu
Y2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFt
ZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChGb3JtYXR0aW5n
Q29udGV4dCk7CisKK0Zvcm1hdHRpbmdDb250ZXh0OjpGb3JtYXR0aW5nQ29udGV4dChjb25zdCBD
b250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgRm9ybWF0dGluZ1N0YXRlJiBmb3Jt
YXR0aW5nU3RhdGUpCisgICAgOiBtX3Jvb3QobWFrZVdlYWtQdHIoZm9ybWF0dGluZ0NvbnRleHRS
b290KSkKKyAgICAsIG1fZm9ybWF0dGluZ1N0YXRlKGZvcm1hdHRpbmdTdGF0ZSkKK3sKKyAgICBB
U1NFUlQoZm9ybWF0dGluZ0NvbnRleHRSb290Lmhhc0NoaWxkKCkpOworI2lmbmRlZiBOREVCVUcK
KyAgICBsYXlvdXRTdGF0ZSgpLnJlZ2lzdGVyRm9ybWF0dGluZ0NvbnRleHQoKnRoaXMpOworI2Vu
ZGlmCit9CisKK0Zvcm1hdHRpbmdDb250ZXh0Ojp+Rm9ybWF0dGluZ0NvbnRleHQoKQoreworI2lm
bmRlZiBOREVCVUcKKyAgICBsYXlvdXRTdGF0ZSgpLmRlcmVnaXN0ZXJGb3JtYXR0aW5nQ29udGV4
dCgqdGhpcyk7CisjZW5kaWYKK30KKworTGF5b3V0U3RhdGUmIEZvcm1hdHRpbmdDb250ZXh0Ojps
YXlvdXRTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZm9ybWF0dGluZ1N0YXRlLmxheW91
dFN0YXRlKCk7Cit9CisKK3ZvaWQgRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVPdXRPZkZsb3dI
b3Jpem9udGFsR2VvbWV0cnkoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRz
Rm9yT3V0T2ZGbG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgQVNTRVJUKGxheW91dEJv
eC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisgICAgYXV0byBjb21wdXRlID0gWyZdKE9wdGlv
bmFsPExheW91dFVuaXQ+IHVzZWRXaWR0aCkgeworICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5v
dXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkobGF5b3V0Qm94LCBjb25zdHJhaW50cy5ob3Jpem9u
dGFsLCBjb25zdHJhaW50cy52ZXJ0aWNhbCwgeyB1c2VkV2lkdGgsIHsgfSB9KTsKKyAgICB9Owor
CisgICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGNvbnN0cmFpbnRzLmhvcml6b250YWwu
bG9naWNhbFdpZHRoOworICAgIGF1dG8gaG9yaXpvbnRhbEdlb21ldHJ5ID0gY29tcHV0ZSh7IH0p
OworICAgIGlmIChhdXRvIG1heFdpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1heFdpZHRoKGxh
eW91dEJveCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpKSB7CisgICAgICAgIGF1dG8gbWF4SG9yaXpv
bnRhbEdlb21ldHJ5ID0gY29tcHV0ZShtYXhXaWR0aCk7CisgICAgICAgIGlmIChob3Jpem9udGFs
R2VvbWV0cnkuY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA+IG1heEhvcml6b250
YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQorICAgICAgICAg
ICAgaG9yaXpvbnRhbEdlb21ldHJ5ID0gbWF4SG9yaXpvbnRhbEdlb21ldHJ5OworICAgIH0KKwor
ICAgIGlmIChhdXRvIG1pbldpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbldpZHRoKGxheW91
dEJveCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpKSB7CisgICAgICAgIGF1dG8gbWluSG9yaXpvbnRh
bEdlb21ldHJ5ID0gY29tcHV0ZShtaW5XaWR0aCk7CisgICAgICAgIGlmIChob3Jpem9udGFsR2Vv
bWV0cnkuY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA8IG1pbkhvcml6b250YWxH
ZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQorICAgICAgICAgICAg
aG9yaXpvbnRhbEdlb21ldHJ5ID0gbWluSG9yaXpvbnRhbEdlb21ldHJ5OworICAgIH0KKworICAg
IGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0
Qm94KTsKKyAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsTGVmdChob3Jpem9udGFsR2VvbWV0cnku
bGVmdCArIGhvcml6b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdp
bi5zdGFydCk7CisgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGhvcml6b250YWxH
ZW9tZXRyeS5jb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKTsKKyAgICBhdXRvJiB1
c2VkSG9yaXpvbnRhbE1hcmdpbiA9IGhvcml6b250YWxHZW9tZXRyeS5jb250ZW50V2lkdGhBbmRN
YXJnaW4udXNlZE1hcmdpbjsKKyAgICBib3hHZW9tZXRyeS5zZXRIb3Jpem9udGFsTWFyZ2luKHsg
dXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQsIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCB9KTsK
K30KKwordm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2Vv
bWV0cnkoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzRm9yT3V0T2ZGbG93
Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxv
d1Bvc2l0aW9uZWQoKSk7CisgICAgYXV0byBjb21wdXRlID0gWyZdKE9wdGlvbmFsPExheW91dFVu
aXQ+IHVzZWRIZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCkub3V0T2ZGbG93VmVy
dGljYWxHZW9tZXRyeShsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIGNvbnN0cmFp
bnRzLnZlcnRpY2FsLCB7IHVzZWRIZWlnaHQgfSk7CisgICAgfTsKKworICAgIGF1dG8gY29udGFp
bmluZ0Jsb2NrSGVpZ2h0ID0gKmNvbnN0cmFpbnRzLnZlcnRpY2FsLmxvZ2ljYWxIZWlnaHQ7Cisg
ICAgYXV0byB2ZXJ0aWNhbEdlb21ldHJ5ID0gY29tcHV0ZSh7IH0pOworICAgIGlmIChhdXRvIG1h
eEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQobGF5b3V0Qm94LCBjb250YWlu
aW5nQmxvY2tIZWlnaHQpKSB7CisgICAgICAgIGF1dG8gbWF4VmVydGljYWxHZW9tZXRyeSA9IGNv
bXB1dGUobWF4SGVpZ2h0KTsKKyAgICAgICAgaWYgKHZlcnRpY2FsR2VvbWV0cnkuY29udGVudEhl
aWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID4gbWF4VmVydGljYWxHZW9tZXRyeS5jb250ZW50
SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpCisgICAgICAgICAgICB2ZXJ0aWNhbEdlb21l
dHJ5ID0gbWF4VmVydGljYWxHZW9tZXRyeTsKKyAgICB9CisKKyAgICBpZiAoYXV0byBtaW5IZWln
aHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluSGVpZ2h0KGxheW91dEJveCwgY29udGFpbmluZ0Js
b2NrSGVpZ2h0KSkgeworICAgICAgICBhdXRvIG1pblZlcnRpY2FsR2VvbWV0cnkgPSBjb21wdXRl
KG1pbkhlaWdodCk7CisgICAgICAgIGlmICh2ZXJ0aWNhbEdlb21ldHJ5LmNvbnRlbnRIZWlnaHRB
bmRNYXJnaW4uY29udGVudEhlaWdodCA8IG1pblZlcnRpY2FsR2VvbWV0cnkuY29udGVudEhlaWdo
dEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KQorICAgICAgICAgICAgdmVydGljYWxHZW9tZXRyeSA9
IG1pblZlcnRpY2FsR2VvbWV0cnk7CisgICAgfQorCisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBm
b3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOworICAgIGF1dG8gbm9uQ29s
bGFwc2VkVmVydGljYWxNYXJnaW4gPSB2ZXJ0aWNhbEdlb21ldHJ5LmNvbnRlbnRIZWlnaHRBbmRN
YXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luOworICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3Ao
dmVydGljYWxHZW9tZXRyeS50b3AgKyBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUp
OworICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQodmVydGljYWxHZW9tZXRyeS5j
b250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpOworICAgIC8vIE1hcmdpbnMgb2Yg
YWJzb2x1dGVseSBwb3NpdGlvbmVkIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KKyAgICBib3hHZW9t
ZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG5vbkNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luLmJlZm9y
ZSwgbm9uQ29sbGFwc2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgfSk7Cit9CisKK3ZvaWQgRm9ybWF0
dGluZ0NvbnRleHQ6OmNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50KQorewor
ICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5
b3V0Qm94KTsKKyAgICBib3hHZW9tZXRyeS5zZXRCb3JkZXIoZ2VvbWV0cnkoKS5jb21wdXRlZEJv
cmRlcihsYXlvdXRCb3gpKTsKKyAgICBib3hHZW9tZXRyeS5zZXRQYWRkaW5nKGdlb21ldHJ5KCku
Y29tcHV0ZWRQYWRkaW5nKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnQubG9naWNhbFdp
ZHRoKSk7Cit9CisKK3ZvaWQgRm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dE91dE9mRmxvd0NvbnRl
bnQoSW52YWxpZGF0aW9uU3RhdGUmIGludmFsaWRhdGlvblN0YXRlLCBjb25zdCBDb25zdHJhaW50
c0Zvck91dE9mRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAgIExPR19XSVRIX1NUUkVB
TShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJTdGFydDogbGF5b3V0IG91dC1v
Zi1mbG93IGNvbnRlbnQgLT4gY29udGV4dDogIiA8PCAmbGF5b3V0U3RhdGUoKSA8PCAiIHJvb3Q6
ICIgPDwgJnJvb3QoKSk7CisKKyAgICBjb2xsZWN0T3V0T2ZGbG93RGVzY2VuZGFudHNJZk5lZWRl
ZCgpOworCisgICAgYXV0byBjb25zdHJhaW50c0ZvckxheW91dEJveCA9IFsmXSAoY29uc3QgYXV0
byYgb3V0T2ZGbG93Qm94KSB7CisgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IG91dE9m
Rmxvd0JveC5jb250YWluaW5nQmxvY2soKTsKKyAgICAgICAgcmV0dXJuICZjb250YWluaW5nQmxv
Y2sgPT0gJnJvb3QoKSA/IGNvbnN0cmFpbnRzIDogZ2VvbWV0cnkoKS5jb25zdHJhaW50c0Zvck91
dE9mRmxvd0NvbnRlbnQoY29udGFpbmluZ0Jsb2NrKTsKKyAgICB9OworCisgICAgZm9yIChhdXRv
JiBvdXRPZkZsb3dCb3ggOiBmb3JtYXR0aW5nU3RhdGUoKS5vdXRPZkZsb3dCb3hlcygpKSB7Cisg
ICAgICAgIEFTU0VSVChvdXRPZkZsb3dCb3gtPmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQo
KSk7CisgICAgICAgIGlmICghaW52YWxpZGF0aW9uU3RhdGUubmVlZHNMYXlvdXQoKm91dE9mRmxv
d0JveCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBhdXRvIGNvbnRhaW5pbmdC
bG9ja0NvbnN0cmFpbnRzID0gY29uc3RyYWludHNGb3JMYXlvdXRCb3goKm91dE9mRmxvd0JveCk7
CisgICAgICAgIGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRzRm9yQm9yZGVyQW5kUGFkZGluZyA9
IEhvcml6b250YWxDb25zdHJhaW50cyB7IGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmhvcml6
b250YWwubG9naWNhbExlZnQsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmJvcmRlckFuZFBh
ZGRpbmdDb25zdHJhaW50cyB9OworICAgICAgICBjb21wdXRlQm9yZGVyQW5kUGFkZGluZygqb3V0
T2ZGbG93Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHNGb3JCb3JkZXJBbmRQYWRkaW5nKTsKKwor
ICAgICAgICBjb21wdXRlT3V0T2ZGbG93SG9yaXpvbnRhbEdlb21ldHJ5KCpvdXRPZkZsb3dCb3gs
IGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzKTsKKyAgICAgICAgYXV0byBvdXRPZkZsb3dCb3hI
YXNDb250ZW50ID0gaXM8Q29udGFpbmVyQm94Pigqb3V0T2ZGbG93Qm94KSAmJiBkb3duY2FzdDxD
b250YWluZXJCb3g+KCpvdXRPZkZsb3dCb3gpLmhhc0NoaWxkKCk7CisgICAgICAgIGlmIChvdXRP
ZkZsb3dCb3hIYXNDb250ZW50KSB7CisgICAgICAgICAgICBhdXRvJiBjb250YWluZXJCb3ggPSBk
b3duY2FzdDxDb250YWluZXJCb3g+KCpvdXRPZkZsb3dCb3gpOworICAgICAgICAgICAgYXV0byBm
b3JtYXR0aW5nQ29udGV4dCA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0
KGNvbnRhaW5lckJveCwgbGF5b3V0U3RhdGUoKSk7CisgICAgICAgICAgICBpZiAoY29udGFpbmVy
Qm94Lmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKQorICAgICAgICAgICAgICAgIGZvcm1hdHRp
bmdDb250ZXh0LT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBnZW9tZXRy
eSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb250YWluZXJCb3gpKTsKKyAgICAgICAg
ICAgIGNvbXB1dGVPdXRPZkZsb3dWZXJ0aWNhbEdlb21ldHJ5KGNvbnRhaW5lckJveCwgY29udGFp
bmluZ0Jsb2NrQ29uc3RyYWludHMpOworICAgICAgICAgICAgZm9ybWF0dGluZ0NvbnRleHQtPmxh
eW91dE91dE9mRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGdlb21ldHJ5KCkuY29uc3Ry
YWludHNGb3JPdXRPZkZsb3dDb250ZW50KGNvbnRhaW5lckJveCkpOworICAgICAgICB9IGVsc2UK
KyAgICAgICAgICAgIGNvbXB1dGVPdXRPZkZsb3dWZXJ0aWNhbEdlb21ldHJ5KCpvdXRPZkZsb3dC
b3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzKTsKKyAgICB9CisgICAgTE9HX1dJVEhfU1RS
RUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIkVuZDogbGF5b3V0IG91dC1v
Zi1mbG93IGNvbnRlbnQgLT4gY29udGV4dDogIiA8PCAmbGF5b3V0U3RhdGUoKSA8PCAiIHJvb3Q6
ICIgPDwgJnJvb3QoKSk7Cit9CisKK2NvbnN0IEJveEdlb21ldHJ5JiBGb3JtYXR0aW5nQ29udGV4
dDo6Z2VvbWV0cnlGb3JCb3goY29uc3QgQm94JiBsYXlvdXRCb3gsIE9wdGlvbmFsPEVzY2FwZVJl
YXNvbj4gZXNjYXBlUmVhc29uKSBjb25zdAoreworICAgIFVOVVNFRF9QQVJBTShlc2NhcGVSZWFz
b24pOworI2lmIEFTU0VSVF9FTkFCTEVECisgICAgYXV0byBpc09rVG9BY2Nlc3NCb3hHZW9tZXRy
eSA9IFsmXSB7CisgICAgICAgIGlmICghaXM8SW5pdGlhbENvbnRhaW5pbmdCbG9jaz4obGF5b3V0
Qm94KSAmJiAmbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpID09ICZyb290KCkpIHsK
KyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG5vbi1lc2NhcGUgY2FzZSBvZiBhY2Nlc3Npbmcg
YSBib3gncyBnZW9tZXRyeSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIHNhbWUgZm9ybWF0dGluZyBj
b250ZXh0LgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoIWVzY2FwZVJlYXNvbikgeworICAgICAgICAgICAgLy8gQW55IGdlb21ldHJ5IGFjY2VzcyBv
dXRzaWRlIG9mIHRoZSBmb3JtYXR0aW5nIGNvbnRleHQgd2l0aG91dCBhIHZhbGlkIHJlYXNvbiBp
cyBjb25zaWRlcmVkIGFuIGVzY2FwZS4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorCisgICAgICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNvbjo6RG9jdW1l
bnRCb3hTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspIHsKKyAgICAgICAgICAgIEFTU0VSVChsYXlv
dXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBpczxJbml0aWFs
Q29udGFpbmluZ0Jsb2NrPihsYXlvdXRCb3gpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpl
c2NhcGVSZWFzb24gPT0gRXNjYXBlUmVhc29uOjpCb2R5U3RyZXRjaGVzVG9WaWV3cG9ydFF1aXJr
KSB7CisgICAgICAgICAgICBBU1NFUlQobGF5b3V0U3RhdGUoKS5pblF1aXJrc01vZGUoKSk7Cisg
ICAgICAgICAgICByZXR1cm4gaXM8SW5pdGlhbENvbnRhaW5pbmdCbG9jaz4obGF5b3V0Qm94KSB8
fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAo
KmVzY2FwZVJlYXNvbiA9PSBFc2NhcGVSZWFzb246OlRhYmxlUXVpcmtOZWVkc0dlb21ldHJ5RnJv
bUVzdGFibGlzaGVkRm9ybWF0dGluZ0NvbnRleHQpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMg
dGhlIGNhc2Ugd2hlbiB0aGUgdGFibGUgZm9ybWF0dGluZyByb290IGNvbGxlY3RzIGdlb21ldHJ5
IGluZm9ybWF0aW9uIGZyb20gdGhlIGNlbGwncworICAgICAgICAgICAgLy8gZm9ybWF0dGluZyBj
b250ZXh0IHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdpZHRoL2hlaWdodC4gc2VlIHNob3VsZEln
bm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luCisgICAgICAgICAgICBBU1NFUlQocm9vdCgp
LmVzdGFibGlzaGVzVGFibGVGb3JtYXR0aW5nQ29udGV4dCgpKTsKKyAgICAgICAgICAgIHJldHVy
biAmbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpLmZvcm1hdHRpbmdDb250ZXh0Um9v
dCgpID09ICZyb290KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmVzY2FwZVJlYXNvbiA9
PSBFc2NhcGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0cnkpIHsKKyAgICAg
ICAgICAgIC8vIFdoZW4gY29tcHV0aW5nIHRoZSBzdGF0aWMgcG9zaXRpb24gb2YgYW4gb3V0LW9m
LWZsb3cgYm94LCB3ZSBuZWVkIHRvIGdhdGhlciBzaWJsaW5nL3BhcmVudCBnZW9tZXRyeSBpbmZv
cm1hdGlvbgorICAgICAgICAgICAgLy8gYXMgaWYgdGhlIG91dC1vZi1mbG93IGJveCB3YXMgYSBz
aW1wbGUgaW5mbG93IGJveC4KKyAgICAgICAgICAgIC8vIE5vdyBzaW5jZSB0aGUgb3V0LW9mLWZs
b3cgYW5kIHRoZSBzaWJsaW5nL3BhcmVudCBib3hlcyBjb3VsZCB2ZXJ5IHdlbGwgYmUgaW4gZGlm
ZmVyZW50IGNvbnRhaW5pbmcgYmxvY2sgc3VidHJlZXMKKyAgICAgICAgICAgIC8vIHRoZSBmb3Jt
YXR0aW5nIGNvbnRleHQgdGhleSBsaXZlIGluIGNvdWxkIGFsc28gYmUgdmVyeSBkaWZmZXJlbnQu
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqZXNj
YXBlUmVhc29uID09IEVzY2FwZVJlYXNvbjo6RmxvYXRCb3hJc0Fsd2F5c1JlbGF0aXZlVG9GbG9h
dFN0YXRlUm9vdCkgeworICAgICAgICAgICAgLy8gRmxvYXQgYm94IHRvcC9sZWZ0IHZhbHVlcyBh
cmUgbWFwcGVkIHJlbGF0aXZlIHRvIHRoZSBGbG9hdFN0YXRlJ3Mgcm9vdC4gSW5saW5lIGZvcm1h
dHRpbmcgY29udGV4dHMoQSkgaW5oZXJpdCBmbG9hdHMgZnJvbSBwYXJlbnQKKyAgICAgICAgICAg
IC8vIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMoQikuIEZsb2F0cyBpbiB0aGVzZSBpbmxpbmUg
Zm9ybWF0dGluZyBjb250ZXh0cyhBKSBuZWVkIHRvIGJlIG1hcHBlZCB0byB0aGUgcGFyZW50LCBi
bG9jayBmb3JtYXR0aW5nIGNvbnRleHQoQikuCisgICAgICAgICAgICBhdXRvJiBmb3JtYXR0aW5n
Q29udGV4dFJvb3QgPSBsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCk7CisgICAgICAg
ICAgICByZXR1cm4gJmZvcm1hdHRpbmdDb250ZXh0Um9vdCA9PSAmcm9vdCgpIHx8ICZmb3JtYXR0
aW5nQ29udGV4dFJvb3QgPT0gJnJvb3QoKS5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKKyAgICAg
ICAgfQorCisgICAgICAgIGlmICgqZXNjYXBlUmVhc29uID09IEVzY2FwZVJlYXNvbjo6RmluZEZp
eGVkSGVpZ2h0QW5jZXN0b3JRdWlyaykgeworICAgICAgICAgICAgQVNTRVJUKGxheW91dFN0YXRl
KCkuaW5RdWlya3NNb2RlKCkpOworICAgICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgY29udGFp
bmluZyBibG9jayB3aXRoIGZpeGVkIGhlaWdodCBxdWlyay4gU2VlIFF1aXJrczo6aGVpZ2h0VmFs
dWVPZk5lYXJlc3RDb250YWluaW5nQmxvY2tXaXRoRml4ZWRIZWlnaHQuCisgICAgICAgICAgICAv
LyBUaGlzIGlzIG9ubHkgdG8gY2hlY2sgaWYgdGhlIHRhcmdldEZvcm1hdHRpbmdSb290IGlzIGFu
IGFuY2VzdG9yIGZvcm1hdHRpbmcgcm9vdC4KKyAgICAgICAgICAgIGlmIChpczxJbml0aWFsQ29u
dGFpbmluZ0Jsb2NrPihsYXlvdXRCb3gpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICAgICAgYXV0byYgdGFyZ2V0Rm9ybWF0dGluZ1Jvb3QgPSBsYXlvdXRCb3guZm9ybWF0
dGluZ0NvbnRleHRSb290KCk7CisgICAgICAgICAgICBhdXRvKiBhbmNlc3RvckZvcm1hdHRpbmdD
b250ZXh0Um9vdCA9ICZyb290KCkuZm9ybWF0dGluZ0NvbnRleHRSb290KCk7CisgICAgICAgICAg
ICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGlmICgmdGFyZ2V0Rm9ybWF0dGluZ1Jv
b3QgPT0gYW5jZXN0b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QpCisgICAgICAgICAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGFuY2VzdG9yRm9ybWF0dGluZ0NvbnRleHRS
b290ID0gJmFuY2VzdG9yRm9ybWF0dGluZ0NvbnRleHRSb290LT5mb3JtYXR0aW5nQ29udGV4dFJv
b3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXM8SW5pdGlhbENvbnRhaW5pbmdCbG9jaz4oKmFu
Y2VzdG9yRm9ybWF0dGluZ0NvbnRleHRSb290KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKworICAgICAgICBpZiAoKmVzY2FwZVJlYXNvbiA9PSBFc2NhcGVSZWFzb246OlRhYmxlTmVl
ZHNBY2Nlc3NUb1RhYmxlV3JhcHBlcikgeworICAgICAgICAgICAgLy8gVGFibGVzIGFyZSB3cmFw
cGVkIGluIGEgMiBsZXZlbCBmb3JtYXR0aW5nIGNvbnRleHQgc3RydWN0dXJlLiBBIDx0YWJsZT4g
ZWxlbWVudCBpbml0aWF0ZXMgYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgZm9yIGl0cyBwcmlu
Y2lwYWwgdGFibGUgYm94CisgICAgICAgICAgICAvLyB3aGVyZSB0aGUgY2FwdGlvbiBhbmQgdGhl
IHRhYmxlIGNvbnRlbnQgbGl2ZS4gSXQgYWxzbyBpbml0aWF0ZXMgYSB0YWJsZSB3cmFwcGVyIGJv
eCB3aGljaCBlc3RhYmxpc2hlcyB0aGUgdGFibGUgZm9ybWF0dGluZyBjb250ZXh0LgorICAgICAg
ICAgICAgLy8gSW4gbWFueSBjYXNlcyB0aGUgVEZDIG5lZWRzIGFjY2VzcyB0byB0aGUgcGFyZW50
IChnZW5lcmF0ZWQpIEJGQy4KKyAgICAgICAgICAgIHJldHVybiAmbGF5b3V0Qm94ID09ICZyb290
KCkuZm9ybWF0dGluZ0NvbnRleHRSb290KCk7CisgICAgICAgIH0KKworICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisjZW5kaWYKKyAg
ICBBU1NFUlQoaXNPa1RvQWNjZXNzQm94R2VvbWV0cnkoKSk7CisgICAgQVNTRVJUKGxheW91dFN0
YXRlKCkuaGFzQm94R2VvbWV0cnkobGF5b3V0Qm94KSk7CisgICAgcmV0dXJuIGxheW91dFN0YXRl
KCkuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KTsKK30KKwordm9pZCBGb3JtYXR0aW5nQ29udGV4
dDo6Y29sbGVjdE91dE9mRmxvd0Rlc2NlbmRhbnRzSWZOZWVkZWQoKQoreworICAgIGlmICghZm9y
bWF0dGluZ1N0YXRlKCkub3V0T2ZGbG93Qm94ZXMoKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVy
bjsKKyAgICBhdXRvJiByb290ID0gdGhpcy0+cm9vdCgpOworICAgIGlmICghcm9vdC5oYXNDaGls
ZCgpKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFyb290LmlzUG9zaXRpb25lZCgpICYmICFp
czxJbml0aWFsQ29udGFpbmluZ0Jsb2NrPihyb290KSkKKyAgICAgICAgcmV0dXJuOworICAgIC8v
IENvbGxlY3QgdGhlIG91dC1vZi1mbG93IGRlc2NlbmRhbnRzIGF0IHRoZSBmb3JtYXR0aW5nIHJv
b3QgbGV2ZWwgKGFzIG9wcG9zZWQgdG8gYXQgdGhlIGNvbnRhaW5pbmcgYmxvY2sgbGV2ZWwsIHRo
b3VnaCB0aGV5IG1pZ2h0IGJlIHRoZSBzYW1lKS4KKyAgICAvLyBGSVhNRTogVHVybiB0aGlzIGlu
dG8gYSByZWdpc3Rlci1zZWxmIGFzIGJveGVzIGFyZSBiZWluZyBpbnNlcnRlZC4KKyAgICBmb3Ig
KGF1dG8mIGRlc2NlbmRhbnQgOiBkZXNjZW5kYW50c09mVHlwZTxCb3g+KHJvb3QpKSB7CisgICAg
ICAgIGlmICghZGVzY2VuZGFudC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICBpZiAoJmRlc2NlbmRhbnQuZm9ybWF0dGluZ0NvbnRleHRSb290
KCkgIT0gJnJvb3QpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9ybWF0dGluZ1N0
YXRlKCkuYWRkT3V0T2ZGbG93Qm94KGRlc2NlbmRhbnQpOworICAgIH0KK30KKworI2lmbmRlZiBO
REVCVUcKK3ZvaWQgRm9ybWF0dGluZ0NvbnRleHQ6OnZhbGlkYXRlR2VvbWV0cnlDb25zdHJhaW50
c0FmdGVyTGF5b3V0KCkgY29uc3QKK3sKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dFJvb3Qg
PSByb290KCk7CisgICAgLy8gRklYTUU6IGFkZCBhIGRlc2NlbmRhbnRzT2ZUeXBlPD4gZmxhdm9y
IHRoYXQgc3RvcHMgYXQgbmVzdGVkIGZvcm1hdHRpbmcgY29udGV4dHMKKyAgICBmb3IgKGF1dG8m
IGxheW91dEJveCA6IGRlc2NlbmRhbnRzT2ZUeXBlPEJveD4oZm9ybWF0dGluZ0NvbnRleHRSb290
KSkgeworICAgICAgICBpZiAoJmxheW91dEJveC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKSAhPSAm
Zm9ybWF0dGluZ0NvbnRleHRSb290KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGF1
dG8mIGNvbnRhaW5pbmdCbG9ja0dlb21ldHJ5ID0gZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LmNv
bnRhaW5pbmdCbG9jaygpKTsKKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBnZW9tZXRyeUZv
ckJveChsYXlvdXRCb3gpOworCisgICAgICAgIC8vIDEwLjMuMyBCbG9jay1sZXZlbCwgbm9uLXJl
cGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93CisgICAgICAgIC8vIDEwLjMuNyBBYnNvbHV0
ZWx5IHBvc2l0aW9uZWQsIG5vbi1yZXBsYWNlZCBlbGVtZW50cworICAgICAgICBpZiAoKGxheW91
dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSB8fCBsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVk
KCkpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKSB7CisgICAgICAgICAgICAvLyBtYXJn
aW4tbGVmdCArIGJvcmRlci1sZWZ0LXdpZHRoICsgcGFkZGluZy1sZWZ0ICsgd2lkdGggKyBwYWRk
aW5nLXJpZ2h0ICsgYm9yZGVyLXJpZ2h0LXdpZHRoICsgbWFyZ2luLXJpZ2h0ID0gd2lkdGggb2Yg
Y29udGFpbmluZyBibG9jaworICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9
IGNvbnRhaW5pbmdCbG9ja0dlb21ldHJ5LmNvbnRlbnRCb3hXaWR0aCgpOworICAgICAgICAgICAg
QVNTRVJUKGJveEdlb21ldHJ5Lmhvcml6b250YWxNYXJnaW5Cb3JkZXJBbmRQYWRkaW5nKCkgKyBi
b3hHZW9tZXRyeS5jb250ZW50Qm94V2lkdGgoKSA9PSBjb250YWluaW5nQmxvY2tXaWR0aCk7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyAxMC42LjQgQWJzb2x1dGVseSBwb3NpdGlvbmVkLCBub24t
cmVwbGFjZWQgZWxlbWVudHMKKyAgICAgICAgaWYgKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0
aW9uZWQoKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkgeworICAgICAgICAgICAgLy8g
dG9wICsgbWFyZ2luLXRvcCArIGJvcmRlci10b3Atd2lkdGggKyBwYWRkaW5nLXRvcCArIGhlaWdo
dCArIHBhZGRpbmctYm90dG9tICsgYm9yZGVyLWJvdHRvbS13aWR0aCArIG1hcmdpbi1ib3R0b20g
KyBib3R0b20gPSBoZWlnaHQgb2YgY29udGFpbmluZyBibG9jaworICAgICAgICAgICAgYXV0byBj
b250YWluaW5nQmxvY2tIZWlnaHQgPSBjb250YWluaW5nQmxvY2tHZW9tZXRyeS5jb250ZW50Qm94
SGVpZ2h0KCk7CisgICAgICAgICAgICBBU1NFUlQoQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChi
b3hHZW9tZXRyeSkgKyBib3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUoKSArIGJveEdlb21ldHJ5LmJv
cmRlclRvcCgpICsgYm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCkgKyBib3hHZW9t
ZXRyeS5jb250ZW50Qm94SGVpZ2h0KCkKKyAgICAgICAgICAgICAgICArIGJveEdlb21ldHJ5LnBh
ZGRpbmdCb3R0b20oKS52YWx1ZU9yKDApICsgYm94R2VvbWV0cnkuYm9yZGVyQm90dG9tKCkgKyBi
b3hHZW9tZXRyeS5tYXJnaW5BZnRlcigpID09IGNvbnRhaW5pbmdCbG9ja0hlaWdodCk7CisgICAg
ICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL0Zvcm1hdHRpbmdDb250ZXh0Lmgg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL0Zvcm1hdHRpbmdDb250
ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uNzExMDI1NTg4ZWM0YTAzZDllMzVhMGFjOTMwYTc3NmM2MjNmODQ0
NAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvRm9ybWF0dGluZ0NvbnRleHQuaApAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
IElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICog
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisK
KyNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRVbml0Lmgi
CisjaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+Cisj
aW5jbHVkZSA8d3RmL1dlYWtQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBM
YXlvdXRTaXplOworc3RydWN0IExlbmd0aDsKKworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNz
IEJveEdlb21ldHJ5OworY2xhc3MgUmVwbGFjZWRCb3g7CitzdHJ1Y3QgQ29tcHV0ZWRIb3Jpem9u
dGFsTWFyZ2luOworc3RydWN0IENvbXB1dGVkVmVydGljYWxNYXJnaW47CitjbGFzcyBDb250YWlu
ZXJCb3g7CitzdHJ1Y3QgQ29udGVudEhlaWdodEFuZE1hcmdpbjsKK3N0cnVjdCBDb250ZW50V2lk
dGhBbmRNYXJnaW47CitzdHJ1Y3QgRWRnZXM7CitjbGFzcyBGb3JtYXR0aW5nU3RhdGU7CitzdHJ1
Y3QgSG9yaXpvbnRhbEdlb21ldHJ5OworY2xhc3MgSW52YWxpZGF0aW9uU3RhdGU7CitjbGFzcyBM
YXlvdXRTdGF0ZTsKK3N0cnVjdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlczsKK3N0cnVjdCBP
dmVycmlkZGVuVmVydGljYWxWYWx1ZXM7CitzdHJ1Y3QgVmVydGljYWxHZW9tZXRyeTsKKworY2xh
c3MgRm9ybWF0dGluZ0NvbnRleHQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoRm9ybWF0
dGluZ0NvbnRleHQpOworcHVibGljOgorICAgIEZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRh
aW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBGb3JtYXR0aW5nU3RhdGUmKTsKKyAgICB2
aXJ0dWFsIH5Gb3JtYXR0aW5nQ29udGV4dCgpOworCisgICAgc3RydWN0IENvbnN0cmFpbnRzRm9y
SW5GbG93Q29udGVudCB7CisgICAgICAgIEhvcml6b250YWxDb25zdHJhaW50cyBob3Jpem9udGFs
OworICAgICAgICBWZXJ0aWNhbENvbnN0cmFpbnRzIHZlcnRpY2FsOworICAgIH07CisgICAgdmly
dHVhbCB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBD
b25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSA9IDA7CisKKyAgICBzdHJ1Y3QgQ29uc3RyYWlu
dHNGb3JPdXRPZkZsb3dDb250ZW50IHsKKyAgICAgICAgSG9yaXpvbnRhbENvbnN0cmFpbnRzIGhv
cml6b250YWw7CisgICAgICAgIFZlcnRpY2FsQ29uc3RyYWludHMgdmVydGljYWw7CisgICAgICAg
IC8vIEJvcmRlcnMgYW5kIHBhZGRpbmcgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIGNvbnRhaW5p
bmcgYmxvY2sncyBjb250ZW50IGJveCBhcyBpZiB0aGUgYm94IHdhcyBhbiBpbi1mbG93IGJveC4K
KyAgICAgICAgTGF5b3V0VW5pdCBib3JkZXJBbmRQYWRkaW5nQ29uc3RyYWludHM7CisgICAgfTsK
KyAgICB2b2lkIGxheW91dE91dE9mRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25z
dCBDb25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQmKTsKKworICAgIHN0cnVjdCBJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzIHsKKyAgICAgICAgdm9pZCBleHBhbmQoTGF5b3V0VW5pdCBob3Jp
em9udGFsVmFsdWUpOworICAgICAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzJiBvcGVyYXRv
cis9KGNvbnN0IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmKTsKKyAgICAgICAgSW50cmluc2lj
V2lkdGhDb25zdHJhaW50cyYgb3BlcmF0b3IrPShMYXlvdXRVbml0KTsKKyAgICAgICAgSW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyYgb3BlcmF0b3ItPShjb25zdCBJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzJik7CisgICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIG9wZXJhdG9yLT0o
TGF5b3V0VW5pdCk7CisKKyAgICAgICAgTGF5b3V0VW5pdCBtaW5pbXVtOworICAgICAgICBMYXlv
dXRVbml0IG1heGltdW07CisgICAgfTsKKyAgICB2aXJ0dWFsIEludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgPSAwOworICAgIHZpcnR1
YWwgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0ID0gMDsKKworICAgIGJvb2wg
aXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFibGlz
aGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpOyB9CisgICAgYm9vbCBpc0lubGluZUZvcm1hdHRp
bmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gcm9vdCgpLmVzdGFibGlzaGVzSW5saW5lRm9ybWF0
dGluZ0NvbnRleHQoKTsgfQorICAgIGJvb2wgaXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkgY29u
c3QgeyByZXR1cm4gcm9vdCgpLmVzdGFibGlzaGVzVGFibGVGb3JtYXR0aW5nQ29udGV4dCgpOyB9
CisgICAgYm9vbCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7
IHJldHVybiBpc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSAmJiByb290KCkuaXNUYWJsZVdyYXBw
ZXJCb3goKTsgfQorICAgIGJvb2wgaXNGbGV4Rm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJl
dHVybiByb290KCkuZXN0YWJsaXNoZXNGbGV4Rm9ybWF0dGluZ0NvbnRleHQoKTsgfQorCisgICAg
ZW51bSBjbGFzcyBFc2NhcGVSZWFzb24geworICAgICAgICBUYWJsZVF1aXJrTmVlZHNHZW9tZXRy
eUZyb21Fc3RhYmxpc2hlZEZvcm1hdHRpbmdDb250ZXh0LAorICAgICAgICBPdXRPZkZsb3dCb3hO
ZWVkc0luRmxvd0dlb21ldHJ5LAorICAgICAgICBGbG9hdEJveElzQWx3YXlzUmVsYXRpdmVUb0Zs
b2F0U3RhdGVSb290LAorICAgICAgICBGaW5kRml4ZWRIZWlnaHRBbmNlc3RvclF1aXJrLAorICAg
ICAgICBEb2N1bWVudEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaywKKyAgICAgICAgQm9keVN0
cmV0Y2hlc1RvVmlld3BvcnRRdWlyaywKKyAgICAgICAgVGFibGVOZWVkc0FjY2Vzc1RvVGFibGVX
cmFwcGVyCisgICAgfTsKKyAgICBjb25zdCBCb3hHZW9tZXRyeSYgZ2VvbWV0cnlGb3JCb3goY29u
c3QgQm94JiwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiA9IFdURjo6bnVsbG9wdCkgY29uc3Q7Cisg
ICAgY29uc3QgQ29udGFpbmVyQm94JiByb290KCkgY29uc3QgeyByZXR1cm4gKm1fcm9vdDsgfQor
CisgICAgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAg
ICB1c2luZyBMYXlvdXRRdWV1ZSA9IFZlY3Rvcjxjb25zdCBCb3gqPjsKKworICAgIGNvbnN0IEZv
cm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9mb3JtYXR0
aW5nU3RhdGU7IH0KKyAgICBGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0
dXJuIG1fZm9ybWF0dGluZ1N0YXRlOyB9CisKKyAgICB2b2lkIGNvbXB1dGVCb3JkZXJBbmRQYWRk
aW5nKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOworCisjaWZuZGVm
IE5ERUJVRworICAgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZUdlb21ldHJ5Q29uc3RyYWludHNBZnRl
ckxheW91dCgpIGNvbnN0OworI2VuZGlmCisKKyAgICAvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMg
Z2VuZXJpYyBwb3NpdGlvbmluZyBhbmQgc2l6aW5nLgorICAgIGNsYXNzIEdlb21ldHJ5IHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIFZlcnRpY2FsR2VvbWV0cnkgb3V0T2ZGbG93VmVydGljYWxHZW9t
ZXRyeShjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBWZXJ0
aWNhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7
CisgICAgICAgIEhvcml6b250YWxHZW9tZXRyeSBvdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnko
Y29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgVmVydGljYWxD
b25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7CisKKyAgICAg
ICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBmbG9hdGluZ0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4o
Y29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRl
blZlcnRpY2FsVmFsdWVzJikgY29uc3Q7CisgICAgICAgIENvbnRlbnRXaWR0aEFuZE1hcmdpbiBm
bG9hdGluZ0NvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFs
Q29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYpOworCisgICAg
ICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5saW5lUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5k
TWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwg
T3B0aW9uYWw8VmVydGljYWxDb25zdHJhaW50cz4sIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZh
bHVlcyYpIGNvbnN0OworICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gaW5saW5lUmVwbGFj
ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmLCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmLCBPcHRpb25hbDxWZXJ0aWNhbENvbnN0cmFpbnRzPiwgY29uc3QgT3Zl
cnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKworICAgICAgICBMYXlvdXRTaXplIGluRmxvd1Bv
c2l0aW9uZWRQb3NpdGlvbk9mZnNldChjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmKSBjb25zdDsKKworICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGNvbXBsaWNh
dGVkQ2FzZXMoY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3Qg
T3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7CisgICAgICAgIExheW91dFVuaXQgc2hy
aW5rVG9GaXRXaWR0aChjb25zdCBCb3gmLCBMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKTsKKwor
ICAgICAgICBFZGdlcyBjb21wdXRlZEJvcmRlcihjb25zdCBCb3gmKSBjb25zdDsKKyAgICAgICAg
T3B0aW9uYWw8RWRnZXM+IGNvbXB1dGVkUGFkZGluZyhjb25zdCBCb3gmLCBMYXlvdXRVbml0IGNv
bnRhaW5pbmdCbG9ja1dpZHRoKSBjb25zdDsKKworICAgICAgICBDb21wdXRlZEhvcml6b250YWxN
YXJnaW4gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYpIGNvbnN0OworICAgICAgICBDb21wdXRlZFZlcnRpY2FsTWFyZ2luIGNv
bXB1dGVkVmVydGljYWxNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJikgY29uc3Q7CisKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRWYWx1
ZShjb25zdCBMZW5ndGgmIGdlb21ldHJ5UHJvcGVydHksIExheW91dFVuaXQgY29udGFpbmluZ0Js
b2NrV2lkdGgpIGNvbnN0OworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBmaXhlZFZhbHVl
KGNvbnN0IExlbmd0aCYgZ2VvbWV0cnlQcm9wZXJ0eSkgY29uc3Q7CisKKyAgICAgICAgT3B0aW9u
YWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRNaW5IZWlnaHQoY29uc3QgQm94JiwgT3B0aW9uYWw8TGF5
b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RGOjpudWxsb3B0KSBjb25zdDsKKyAg
ICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRNYXhIZWlnaHQoY29uc3QgQm94Jiwg
T3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RGOjpudWxsb3B0
KSBjb25zdDsKKworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZE1pbldpZHRo
KGNvbnN0IEJveCYsIExheW91dFVuaXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworICAgICAgICBP
cHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZE1heFdpZHRoKGNvbnN0IEJveCYsIExheW91dFVu
aXQgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworCisgICAgICAgIEZvcm1hdHRpbmdDb250ZXh0OjpJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbnN0cmFpbkJ5TWluTWF4V2lkdGgoY29uc3QgQm94
JiwgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cykgY29uc3Q7CisKKyAgICAgICAgTGF5b3V0VW5p
dCBjb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0NvbnRleHRSb290KGNvbnN0IENvbnRhaW5lckJv
eCYpIGNvbnN0OworCisgICAgICAgIENvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCBjb25z
dHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29uc3QgQ29udGFpbmVyQm94Jik7CisgICAgICAg
IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBjb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQo
Y29uc3QgQ29udGFpbmVyQm94JiwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiA9IFdURjo6bnVsbG9w
dCk7CisKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRIZWlnaHQoY29uc3Qg
Qm94JiwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gV1RGOjpu
dWxsb3B0KSBjb25zdDsKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRXaWR0
aChjb25zdCBCb3gmLCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKworICAgIHBy
b3RlY3RlZDoKKyAgICAgICAgZnJpZW5kIGNsYXNzIEZvcm1hdHRpbmdDb250ZXh0OworICAgICAg
ICBHZW9tZXRyeShjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYpOworCisgICAgICAgIGNvbnN0IExh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRl
eHQubGF5b3V0U3RhdGUoKTsgfQorICAgICAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSB7
IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0LmxheW91dFN0YXRlKCk7IH0KKyAgICAgICAgY29u
c3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4g
bV9mb3JtYXR0aW5nQ29udGV4dDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVmVydGljYWxH
ZW9tZXRyeSBvdXRPZkZsb3dSZXBsYWNlZFZlcnRpY2FsR2VvbWV0cnkoY29uc3QgUmVwbGFjZWRC
b3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFp
bnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7CisgICAgICAgIEhv
cml6b250YWxHZW9tZXRyeSBvdXRPZkZsb3dSZXBsYWNlZEhvcml6b250YWxHZW9tZXRyeShjb25z
dCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IFZlcnRp
Y2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYpOworCisg
ICAgICAgIFZlcnRpY2FsR2VvbWV0cnkgb3V0T2ZGbG93Tm9uUmVwbGFjZWRWZXJ0aWNhbEdlb21l
dHJ5KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNv
bnN0IFZlcnRpY2FsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMm
KSBjb25zdDsKKyAgICAgICAgSG9yaXpvbnRhbEdlb21ldHJ5IG91dE9mRmxvd05vblJlcGxhY2Vk
SG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7CisKKyAgICAg
ICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBmbG9hdGluZ1JlcGxhY2VkQ29udGVudEhlaWdodEFu
ZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYs
IGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpIGNvbnN0OworICAgICAgICBDb250ZW50
V2lkdGhBbmRNYXJnaW4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25z
dCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJy
aWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7CisKKyAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2lu
IGZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiwgY29u
c3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMmKTsKKworICAgICAgICBMYXlvdXRVbml0IHN0YXRpY1ZlcnRpY2FsUG9zaXRpb25Gb3JPdXRP
ZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmKSBj
b25zdDsKKyAgICAgICAgTGF5b3V0VW5pdCBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb25Gb3JPdXRP
ZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYp
IGNvbnN0OworCisgICAgICAgIGVudW0gY2xhc3MgSGVpZ2h0VHlwZSB7IE1pbiwgTWF4LCBOb3Jt
YWwgfTsKKyAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gY29tcHV0ZWRIZWlnaHRWYWx1ZShj
b25zdCBCb3gmLCBIZWlnaHRUeXBlLCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxv
Y2tIZWlnaHQpIGNvbnN0OworCisgICAgICAgIGVudW0gY2xhc3MgV2lkdGhUeXBlIHsgTWluLCBN
YXgsIE5vcm1hbCB9OworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBjb21wdXRlZFdpZHRo
VmFsdWUoY29uc3QgQm94JiwgV2lkdGhUeXBlLCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dp
ZHRoKTsKKworICAgICAgICBjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgbV9mb3JtYXR0aW5nQ29u
dGV4dDsKKyAgICB9OworICAgIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgp
IGNvbnN0IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlzKTsgfQorCisgICAgY2xhc3MgUXVpcmtzIHsK
KyAgICBwdWJsaWM6CisgICAgICAgIFF1aXJrcyhjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYpOwor
CisgICAgICAgIExheW91dFVuaXQgaGVpZ2h0VmFsdWVPZk5lYXJlc3RDb250YWluaW5nQmxvY2tX
aXRoRml4ZWRIZWlnaHQoY29uc3QgQm94Jik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGNv
bnN0IExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0dGlu
Z0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQorICAgICAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3Rh
dGUoKSB7IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0LmxheW91dFN0YXRlKCk7IH0KKyAgICAg
ICAgY29uc3QgRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyBy
ZXR1cm4gbV9mb3JtYXR0aW5nQ29udGV4dDsgfQorCisgICAgICAgIGNvbnN0IEZvcm1hdHRpbmdD
b250ZXh0JiBtX2Zvcm1hdHRpbmdDb250ZXh0OworICAgIH07CisgICAgRm9ybWF0dGluZ0NvbnRl
eHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9CisKK3By
aXZhdGU6CisgICAgdm9pZCBjb2xsZWN0T3V0T2ZGbG93RGVzY2VuZGFudHNJZk5lZWRlZCgpOwor
ICAgIHZvaWQgY29tcHV0ZU91dE9mRmxvd1ZlcnRpY2FsR2VvbWV0cnkoY29uc3QgQm94JiwgY29u
c3QgQ29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50Jik7CisgICAgdm9pZCBjb21wdXRlT3V0
T2ZGbG93SG9yaXpvbnRhbEdlb21ldHJ5KGNvbnN0IEJveCYsIGNvbnN0IENvbnN0cmFpbnRzRm9y
T3V0T2ZGbG93Q29udGVudCYpOworCisgICAgV2Vha1B0cjxjb25zdCBDb250YWluZXJCb3g+IG1f
cm9vdDsKKyAgICBGb3JtYXR0aW5nU3RhdGUmIG1fZm9ybWF0dGluZ1N0YXRlOworfTsKKworaW5s
aW5lIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6R2VvbWV0cnkoY29uc3QgRm9ybWF0dGlu
Z0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KQorICAgIDogbV9mb3JtYXR0aW5nQ29udGV4dChm
b3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworaW5saW5lIEZvcm1hdHRpbmdDb250ZXh0OjpRdWly
a3M6OlF1aXJrcyhjb25zdCBGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQpCisg
ICAgOiBtX2Zvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0KQoreworfQorCitpbmxp
bmUgdm9pZCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50czo6ZXhw
YW5kKExheW91dFVuaXQgaG9yaXpvbnRhbFZhbHVlKQoreworICAgIG1pbmltdW0gKz0gaG9yaXpv
bnRhbFZhbHVlOworICAgIG1heGltdW0gKz0gaG9yaXpvbnRhbFZhbHVlOworfQorCitpbmxpbmUg
Rm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMmIEZvcm1hdHRpbmdD
b250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOjpvcGVyYXRvcis9KGNvbnN0IEludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMmIG90aGVyKQoreworICAgIG1pbmltdW0gKz0gb3RoZXIubWlu
aW11bTsKKyAgICBtYXhpbXVtICs9IG90aGVyLm1heGltdW07CisgICAgcmV0dXJuICp0aGlzOwor
fQorCitpbmxpbmUgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMm
IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOjpvcGVyYXRvcis9
KExheW91dFVuaXQgdmFsdWUpCit7CisgICAgZXhwYW5kKHZhbHVlKTsKKyAgICByZXR1cm4gKnRo
aXM7Cit9CisKK2lubGluZSBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJh
aW50cyYgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM6Om9wZXJh
dG9yLT0oY29uc3QgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgb3RoZXIpCit7CisgICAgbWlu
aW11bSAtPSBvdGhlci5taW5pbXVtOworICAgIG1heGltdW0gLT0gb3RoZXIubWF4aW11bTsKKyAg
ICByZXR1cm4gKnRoaXM7Cit9CisKK2lubGluZSBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2lj
V2lkdGhDb25zdHJhaW50cyYgRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHM6Om9wZXJhdG9yLT0oTGF5b3V0VW5pdCB2YWx1ZSkKK3sKKyAgICBleHBhbmQoLXZhbHVl
KTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK30KK30KKworI2RlZmluZSBTUEVDSUFMSVpFX1RZ
UEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoVG9WYWx1ZVR5cGVOYW1lLCBwcmVk
aWNhdGUpIFwKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfQkVHSU4oV2ViQ29yZTo6TGF5b3V0OjpU
b1ZhbHVlVHlwZU5hbWUpIFwKKyAgICBzdGF0aWMgYm9vbCBpc1R5cGUoY29uc3QgV2ViQ29yZTo6
TGF5b3V0OjpGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQpIHsgcmV0dXJuIGZv
cm1hdHRpbmdDb250ZXh0LnByZWRpY2F0ZTsgfSBcCitTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0VO
RCgpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9Gb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uOWViMTk2NTdiOGJlNzE5OWFhM2ZmYzIwNmY1NzIxYTcyY2Q2MmM4MQotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKQEAgLTAsMCArMSwxMTY1IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0Lmgi
CisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkJs
b2NrRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdTdGF0ZS5oIgor
I2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIK
KyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRDb250
ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRhaW5pbmdCbG9jay5oIgorI2luY2x1
ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUg
IlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFj
ZSBMYXlvdXQgeworCitzdGF0aWMgaW5saW5lIGJvb2wgaXNIZWlnaHRBdXRvKGNvbnN0IEJveCYg
bGF5b3V0Qm94KQoreworICAgIC8vIDEwLjUgQ29udGVudCBoZWlnaHQ6IHRoZSAnaGVpZ2h0JyBw
cm9wZXJ0eQorICAgIC8vCisgICAgLy8gVGhlIHBlcmNlbnRhZ2UgaXMgY2FsY3VsYXRlZCB3aXRo
IHJlc3BlY3QgdG8gdGhlIGhlaWdodCBvZiB0aGUgZ2VuZXJhdGVkIGJveCdzIGNvbnRhaW5pbmcg
YmxvY2suCisgICAgLy8gSWYgdGhlIGhlaWdodCBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyBu
b3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHkgKGkuZS4sIGl0IGRlcGVuZHMgb24gY29udGVudCBoZWln
aHQpLAorICAgIC8vIGFuZCB0aGlzIGVsZW1lbnQgaXMgbm90IGFic29sdXRlbHkgcG9zaXRpb25l
ZCwgdGhlIHVzZWQgaGVpZ2h0IGlzIGNhbGN1bGF0ZWQgYXMgaWYgJ2F1dG8nIHdhcyBzcGVjaWZp
ZWQuCisKKyAgICBhdXRvIGhlaWdodCA9IGxheW91dEJveC5zdHlsZSgpLmxvZ2ljYWxIZWlnaHQo
KTsKKyAgICBpZiAoaGVpZ2h0LmlzQXV0bygpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAg
IGlmIChoZWlnaHQuaXNQZXJjZW50KCkpIHsKKyAgICAgICAgaWYgKGxheW91dEJveC5pc091dE9m
Rmxvd1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBy
ZXR1cm4gIWxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5zdHlsZSgpLmxvZ2ljYWxIZWlnaHQo
KS5pc0ZpeGVkKCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitPcHRpb25hbDxM
YXlvdXRVbml0PiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkSGVpZ2h0VmFs
dWUoY29uc3QgQm94JiBsYXlvdXRCb3gsIEhlaWdodFR5cGUgaGVpZ2h0VHlwZSwgT3B0aW9uYWw8
TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSBjb25zdAoreworICAgIGF1dG8mIHN0
eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgYXV0byBoZWlnaHQgPSBoZWlnaHRUeXBlID09
IEhlaWdodFR5cGU6Ok5vcm1hbCA/IHN0eWxlLmxvZ2ljYWxIZWlnaHQoKSA6IGhlaWdodFR5cGUg
PT0gSGVpZ2h0VHlwZTo6TWluID8gc3R5bGUubG9naWNhbE1pbkhlaWdodCgpIDogc3R5bGUubG9n
aWNhbE1heEhlaWdodCgpOworICAgIGlmIChoZWlnaHQuaXNVbmRlZmluZWQoKSB8fCBoZWlnaHQu
aXNBdXRvKCkgfHwgaGVpZ2h0LmlzTWF4Q29udGVudCgpIHx8IGhlaWdodC5pc01pbkNvbnRlbnQo
KSB8fCBoZWlnaHQuaXNGaXRDb250ZW50KCkpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICBp
ZiAoaGVpZ2h0LmlzRml4ZWQoKSkKKyAgICAgICAgcmV0dXJuIExheW91dFVuaXQgeyBoZWlnaHQu
dmFsdWUoKSB9OworCisgICAgaWYgKCFjb250YWluaW5nQmxvY2tIZWlnaHQpIHsKKyAgICAgICAg
aWYgKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpCisgICAgICAgICAgICBjb250YWluaW5n
QmxvY2tIZWlnaHQgPSBmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJrcygpLmhlaWdodFZhbHVlT2ZO
ZWFyZXN0Q29udGFpbmluZ0Jsb2NrV2l0aEZpeGVkSGVpZ2h0KGxheW91dEJveCk7CisgICAgICAg
IGVsc2UgeworICAgICAgICAgICAgYXV0byBub25Bbm9ueW1vdXNDb250YWluaW5nQmxvY2tMb2dp
Y2FsSGVpZ2h0ID0gWyZdIHsKKyAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBibG9jayBsZXZl
bCBib3ggaXMgYSBkaXJlY3QgY2hpbGQgb2YgYW4gaW5saW5lIGxldmVsIGJveCAoPHNwYW4+PGRp
dj48L2Rpdj48L3NwYW4+KSBhbmQgd2Ugd3JhcCBpdCBpbnRvIGEgY29udGludWF0aW9uLAorICAg
ICAgICAgICAgICAgIC8vIHRoZSBjb250YWluaW5nIGJsb2NrIChhbm9ueW1vdXMgd3JhcHBlcikg
aXMgbm90IHRoZSBib3ggd2UgbmVlZCB0byBjaGVjayBmb3IgZml4ZWQgaGVpZ2h0LgorICAgICAg
ICAgICAgICAgIGF1dG8mIGluaXRpYWxDb250YWluaW5nQmxvY2sgPSBsYXlvdXRCb3guaW5pdGlh
bENvbnRhaW5pbmdCbG9jaygpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byogY29udGFpbmlu
Z0Jsb2NrID0gJmxheW91dEJveC5jb250YWluaW5nQmxvY2soKTsgY29udGFpbmluZ0Jsb2NrICE9
ICZpbml0aWFsQ29udGFpbmluZ0Jsb2NrOyBjb250YWluaW5nQmxvY2sgPSAmY29udGFpbmluZ0Js
b2NrLT5jb250YWluaW5nQmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFp
bmluZ0Jsb2NrLT5pc0Fub255bW91cygpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluaW5nQmxvY2stPnN0eWxlKCku
bG9naWNhbEhlaWdodCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1
cm4gaW5pdGlhbENvbnRhaW5pbmdCbG9jay5zdHlsZSgpLmxvZ2ljYWxIZWlnaHQoKTsKKyAgICAg
ICAgICAgIH07CisgICAgICAgICAgICBjb250YWluaW5nQmxvY2tIZWlnaHQgPSBmaXhlZFZhbHVl
KG5vbkFub255bW91c0NvbnRhaW5pbmdCbG9ja0xvZ2ljYWxIZWlnaHQoKSk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBpZiAoIWNvbnRhaW5pbmdCbG9ja0hlaWdodCkKKyAgICAgICAgcmV0dXJu
IHsgfTsKKworICAgIHJldHVybiB2YWx1ZUZvckxlbmd0aChoZWlnaHQsICpjb250YWluaW5nQmxv
Y2tIZWlnaHQpOworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0aW5nQ29udGV4dDo6
R2VvbWV0cnk6OmNvbXB1dGVkSGVpZ2h0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBPcHRpb25hbDxM
YXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQpIGNvbnN0Cit7CisgICAgaWYgKGF1dG8g
aGVpZ2h0ID0gY29tcHV0ZWRIZWlnaHRWYWx1ZShsYXlvdXRCb3gsIEhlaWdodFR5cGU6Ok5vcm1h
bCwgY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSkgeworICAgICAgICBpZiAobGF5b3V0Qm94LnN0eWxl
KCkuYm94U2l6aW5nKCkgPT0gQm94U2l6aW5nOjpDb250ZW50Qm94KQorICAgICAgICAgICAgcmV0
dXJuIGhlaWdodDsKKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4
dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAgICAgIHJldHVybiAqaGVpZ2h0IC0g
KGJveEdlb21ldHJ5LnZlcnRpY2FsQm9yZGVyKCkgKyBib3hHZW9tZXRyeS52ZXJ0aWNhbFBhZGRp
bmcoKS52YWx1ZU9yKDApKTsKKyAgICB9CisgICAgcmV0dXJuIHsgfTsKK30KKworT3B0aW9uYWw8
TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZFdpZHRoVmFs
dWUoY29uc3QgQm94JiBsYXlvdXRCb3gsIFdpZHRoVHlwZSB3aWR0aFR5cGUsIExheW91dFVuaXQg
Y29udGFpbmluZ0Jsb2NrV2lkdGgpCit7CisgICAgLy8gQXBwbGllcyB0bzogYWxsIGVsZW1lbnRz
IGV4Y2VwdCBub24tcmVwbGFjZWQgaW5saW5lcyAob3V0LW9mLWZsb3cgY2hlY2sgaXMgcmVxdWly
ZWQgZm9yIHBvc2l0aW9uZWQgPGJyPiBhcyBmb3Igc29tZSByZWFzb24gd2UgZG9uJ3QgYmxvY2tp
ZnkgdGhlbSkuCisgICAgQVNTRVJUKCFsYXlvdXRCb3guaXNJbmxpbmVCb3goKSB8fCBsYXlvdXRC
b3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOworCisgICAgYXV0byB3aWR0aCA9IFsmXSB7Cisg
ICAgICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgICAgIHN3aXRjaCAo
d2lkdGhUeXBlKSB7CisgICAgICAgIGNhc2UgV2lkdGhUeXBlOjpOb3JtYWw6CisgICAgICAgICAg
ICByZXR1cm4gc3R5bGUubG9naWNhbFdpZHRoKCk7CisgICAgICAgIGNhc2UgV2lkdGhUeXBlOjpN
aW46CisgICAgICAgICAgICByZXR1cm4gc3R5bGUubG9naWNhbE1pbldpZHRoKCk7CisgICAgICAg
IGNhc2UgV2lkdGhUeXBlOjpNYXg6CisgICAgICAgICAgICByZXR1cm4gc3R5bGUubG9naWNhbE1h
eFdpZHRoKCk7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAg
ICAgIHJldHVybiBzdHlsZS5sb2dpY2FsV2lkdGgoKTsKKyAgICB9KCk7CisgICAgaWYgKGF1dG8g
Y29tcHV0ZWRWYWx1ZSA9IHRoaXMtPmNvbXB1dGVkVmFsdWUod2lkdGgsIGNvbnRhaW5pbmdCbG9j
a1dpZHRoKSkKKyAgICAgICAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7CisKKyAgICBpZiAod2lkdGgu
aXNNaW5Db250ZW50KCkgfHwgd2lkdGguaXNNYXhDb250ZW50KCkgfHwgd2lkdGguaXNGaXRDb250
ZW50KCkpIHsKKyAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkpCisgICAg
ICAgICAgICByZXR1cm4geyB9OworICAgICAgICBhdXRvJiBjb250YWluZXJCb3ggPSBkb3duY2Fz
dDxDb250YWluZXJCb3g+KGxheW91dEJveCk7CisgICAgICAgIC8vIEZJWE1FOiBDb25zaWRlciBz
cGxpdHRpbmcgdXAgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHNvIHRoYXQgd2Ug
Y291bGQgY29tcHV0ZWQgdGhlIG1pbiBhbmQgbWF4IHZhbHVlcyBzZXBhcmF0ZWx5LgorICAgICAg
ICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBbJl0geworICAgICAgICAgICAgaWYg
KCFjb250YWluZXJCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyAwX2x1LCBjb250YWluaW5nQmxv
Y2tXaWR0aCB9OworICAgICAgICAgICAgQVNTRVJUKGNvbnRhaW5lckJveC5lc3RhYmxpc2hlc0Zv
cm1hdHRpbmdDb250ZXh0KCkpOworICAgICAgICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0g
bGF5b3V0U3RhdGUoKS5lbnN1cmVGb3JtYXR0aW5nU3RhdGUoY29udGFpbmVyQm94KTsKKyAgICAg
ICAgICAgIGlmIChhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBmb3JtYXR0aW5nU3Rh
dGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpKQorICAgICAgICAgICAgICAgIHJldHVybiAq
aW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKKyAgICAgICAgICAgIHJldHVybiBMYXlvdXRDb250
ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjb250YWluZXJCb3gsIGxheW91dFN0YXRlKCkp
LT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKKyAgICAgICAgfSgpOworICAg
ICAgICBpZiAod2lkdGguaXNNaW5Db250ZW50KCkpCisgICAgICAgICAgICByZXR1cm4gaW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtOworICAgICAgICBpZiAod2lkdGguaXNNYXhDb250
ZW50KCkpCisgICAgICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhp
bXVtOworICAgICAgICBBU1NFUlQod2lkdGguaXNGaXRDb250ZW50KCkpOworICAgICAgICAvLyBJ
ZiB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIGEgZ2l2ZW4gYXhpcyBpcyBkZWZpbml0ZSwgZXF1YWwg
dG8gbWluKG1heC1jb250ZW50IHNpemUsCisgICAgICAgIC8vIG1heChtaW4tY29udGVudCBzaXpl
LCBzdHJldGNoLWZpdCBzaXplKSkuIE90aGVyd2lzZSwgZXF1YWwgdG8gdGhlIG1heC1jb250ZW50
IHNpemUgaW4gdGhhdCBheGlzLgorICAgICAgICAvLyBGSVhNRTogV2UgZG9uJ3QgeWV0IGhhdmUg
aW5kZWZpbml0ZSBhdmFpbGFibGUgc2l6ZS4KKyAgICAgICAgcmV0dXJuIHN0ZDo6bWluKGludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSwgc3RkOjptYXgoaW50cmluc2ljV2lkdGhDb25z
dHJhaW50cy5taW5pbXVtLCBjb250YWluaW5nQmxvY2tXaWR0aCkpOworICAgIH0KKyAgICByZXR1
cm4geyB9OworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnk6OmNvbXB1dGVkV2lkdGgoY29uc3QgQm94JiBsYXlvdXRCb3gsIExheW91dFVuaXQgY29u
dGFpbmluZ0Jsb2NrV2lkdGgpCit7CisgICAgaWYgKGF1dG8gY29tcHV0ZWRXaWR0aCA9IGNvbXB1
dGVkV2lkdGhWYWx1ZShsYXlvdXRCb3gsIFdpZHRoVHlwZTo6Tm9ybWFsLCBjb250YWluaW5nQmxv
Y2tXaWR0aCkpIHsKKyAgICAgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAg
ICAgICAgLy8gTm9uLXF1YW50aXRhdGl2ZSB2YWx1ZXMgc3VjaCBhcyBhdXRvIGFuZCBtaW4tY29u
dGVudCBhcmUgbm90IGluZmx1ZW5jZWQgYnkgdGhlIGJveC1zaXppbmcgcHJvcGVydHkuCisgICAg
ICAgIGlmIChzdHlsZS5ib3hTaXppbmcoKSA9PSBCb3hTaXppbmc6OkNvbnRlbnRCb3ggfHwgc3R5
bGUud2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQorICAgICAgICAgICAgcmV0dXJuIGNvbXB1
dGVkV2lkdGg7CisgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQo
KS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOworICAgICAgICByZXR1cm4gKmNvbXB1dGVkV2lk
dGggLSAoYm94R2VvbWV0cnkuaG9yaXpvbnRhbEJvcmRlcigpICsgYm94R2VvbWV0cnkuaG9yaXpv
bnRhbFBhZGRpbmcoKS52YWx1ZU9yKDApKTsKKyAgICB9CisgICAgcmV0dXJuIHsgfTsKK30KKwor
TGF5b3V0VW5pdCBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbnRlbnRIZWlnaHRGb3JG
b3JtYXR0aW5nQ29udGV4dFJvb3QoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4
dFJvb3QpIGNvbnN0Cit7CisgICAgQVNTRVJUKGZvcm1hdHRpbmdDb250ZXh0Um9vdC5lc3RhYmxp
c2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOworICAgIEFTU0VSVChpc0hlaWdodEF1dG8oZm9ybWF0
dGluZ0NvbnRleHRSb290KSB8fCBmb3JtYXR0aW5nQ29udGV4dFJvb3QuZXN0YWJsaXNoZXNUYWJs
ZUZvcm1hdHRpbmdDb250ZXh0KCkgfHwgZm9ybWF0dGluZ0NvbnRleHRSb290LmlzVGFibGVDZWxs
KCkpOworICAgIGF1dG8gdXNlZENvbnRlbnRIZWlnaHQgPSBMYXlvdXRVbml0IHsgfTsgCisgICAg
YXV0byBoYXNDb250ZW50ID0gZm9ybWF0dGluZ0NvbnRleHRSb290Lmhhc0luRmxvd09yRmxvYXRp
bmdDaGlsZCgpOworICAgIC8vIFRoZSB1c2VkIGhlaWdodCBvZiB0aGUgY29udGFpbm1lbnQgYm94
IGlzIGRldGVybWluZWQgYXMgaWYgcGVyZm9ybWluZyBhIG5vcm1hbCBsYXlvdXQgb2YgdGhlIGJv
eCwgZXhjZXB0IHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBoYXZpbmcgbm8gY29udGVudC4KKyAgICBh
dXRvIHNob3VsZElnbm9yZUNvbnRlbnQgPSBmb3JtYXR0aW5nQ29udGV4dFJvb3QuaXNTaXplQ29u
dGFpbm1lbnRCb3goKTsKKyAgICBpZiAoaGFzQ29udGVudCAmJiAhc2hvdWxkSWdub3JlQ29udGVu
dCkKKyAgICAgICAgdXNlZENvbnRlbnRIZWlnaHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3Jt
YXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGNvbnN0X2Nhc3Q8TGF5b3V0U3Rh
dGUmPihsYXlvdXRTdGF0ZSgpKSktPnVzZWRDb250ZW50SGVpZ2h0KCk7CisgICAgcmV0dXJuIHVz
ZWRDb250ZW50SGVpZ2h0OworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkVmFsdWUoY29uc3QgTGVuZ3RoJiBnZW9tZXRyeVByb3Bl
cnR5LCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSBjb25zdAoreworICAgIC8vICBJ
biBnZW5lcmFsLCB0aGUgY29tcHV0ZWQgdmFsdWUgcmVzb2x2ZXMgdGhlIHNwZWNpZmllZCB2YWx1
ZSBhcyBmYXIgYXMgcG9zc2libGUgd2l0aG91dCBsYXlpbmcgb3V0IHRoZSBjb250ZW50LgorICAg
IGlmIChnZW9tZXRyeVByb3BlcnR5LmlzRml4ZWQoKSB8fCBnZW9tZXRyeVByb3BlcnR5LmlzUGVy
Y2VudCgpIHx8IGdlb21ldHJ5UHJvcGVydHkuaXNDYWxjdWxhdGVkKCkpCisgICAgICAgIHJldHVy
biB2YWx1ZUZvckxlbmd0aChnZW9tZXRyeVByb3BlcnR5LCBjb250YWluaW5nQmxvY2tXaWR0aCk7
CisgICAgcmV0dXJuIHsgfTsKK30KKworT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5OjpmaXhlZFZhbHVlKGNvbnN0IExlbmd0aCYgZ2VvbWV0cnlQcm9wZXJ0
eSkgY29uc3QKK3sKKyAgICBpZiAoIWdlb21ldHJ5UHJvcGVydHkuaXNGaXhlZCgpKQorICAgICAg
ICByZXR1cm4geyB9OworICAgIHJldHVybiBMYXlvdXRVbml0IHsgZ2VvbWV0cnlQcm9wZXJ0eS52
YWx1ZSgpIH07Cit9CisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi92aXN1ZGV0Lmh0
bWwjbWluLW1heC1oZWlnaHRzCisvLyBTcGVjaWZpZXMgYSBwZXJjZW50YWdlIGZvciBkZXRlcm1p
bmluZyB0aGUgdXNlZCB2YWx1ZS4gVGhlIHBlcmNlbnRhZ2UgaXMgY2FsY3VsYXRlZCB3aXRoIHJl
c3BlY3QgdG8gdGhlIGhlaWdodCBvZiB0aGUgZ2VuZXJhdGVkIGJveCdzIGNvbnRhaW5pbmcgYmxv
Y2suCisvLyBJZiB0aGUgaGVpZ2h0IG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGlzIG5vdCBzcGVj
aWZpZWQgZXhwbGljaXRseSAoaS5lLiwgaXQgZGVwZW5kcyBvbiBjb250ZW50IGhlaWdodCksIGFu
ZCB0aGlzIGVsZW1lbnQgaXMgbm90IGFic29sdXRlbHkgcG9zaXRpb25lZCwKKy8vIHRoZSBwZXJj
ZW50YWdlIHZhbHVlIGlzIHRyZWF0ZWQgYXMgJzAnIChmb3IgJ21pbi1oZWlnaHQnKSBvciAnbm9u
ZScgKGZvciAnbWF4LWhlaWdodCcpLgorT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZE1heEhlaWdodChjb25zdCBCb3gmIGxheW91dEJveCwg
T3B0aW9uYWw8TGF5b3V0VW5pdD4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KSBjb25zdAoreworICAg
IHJldHVybiBjb21wdXRlZEhlaWdodFZhbHVlKGxheW91dEJveCwgSGVpZ2h0VHlwZTo6TWF4LCBj
b250YWluaW5nQmxvY2tIZWlnaHQpOworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBGb3JtYXR0
aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkTWluSGVpZ2h0KGNvbnN0IEJveCYgbGF5b3V0
Qm94LCBPcHRpb25hbDxMYXlvdXRVbml0PiBjb250YWluaW5nQmxvY2tIZWlnaHQpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGNvbXB1dGVkSGVpZ2h0VmFsdWUobGF5b3V0Qm94LCBIZWlnaHRUeXBlOjpN
aW4sIGNvbnRhaW5pbmdCbG9ja0hlaWdodCk7Cit9CisKK09wdGlvbmFsPExheW91dFVuaXQ+IEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRNaW5XaWR0aChjb25zdCBCb3gmIGxh
eW91dEJveCwgTGF5b3V0VW5pdCBjb250YWluaW5nQmxvY2tXaWR0aCkKK3sKKyAgICByZXR1cm4g
Y29tcHV0ZWRXaWR0aFZhbHVlKGxheW91dEJveCwgV2lkdGhUeXBlOjpNaW4sIGNvbnRhaW5pbmdC
bG9ja1dpZHRoKTsKK30KKworT3B0aW9uYWw8TGF5b3V0VW5pdD4gRm9ybWF0dGluZ0NvbnRleHQ6
Okdlb21ldHJ5Ojpjb21wdXRlZE1heFdpZHRoKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBMYXlvdXRV
bml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKQoreworICAgIHJldHVybiBjb21wdXRlZFdpZHRoVmFs
dWUobGF5b3V0Qm94LCBXaWR0aFR5cGU6Ok1heCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworfQor
CitMYXlvdXRVbml0IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6c3RhdGljVmVydGljYWxQ
b3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0
IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpIGNvbnN0Cit7CisgICAg
QVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisKKyAgICAvLyBGb3Ig
dGhlIHB1cnBvc2VzIG9mIHRoaXMgc2VjdGlvbiBhbmQgdGhlIG5leHQsIHRoZSB0ZXJtICJzdGF0
aWMgcG9zaXRpb24iIChvZiBhbiBlbGVtZW50KSByZWZlcnMsIHJvdWdobHksIHRvIHRoZSBwb3Np
dGlvbiBhbiBlbGVtZW50IHdvdWxkIGhhdmUKKyAgICAvLyBoYWQgaW4gdGhlIG5vcm1hbCBmbG93
LiBNb3JlIHByZWNpc2VseSwgdGhlIHN0YXRpYyBwb3NpdGlvbiBmb3IgJ3RvcCcgaXMgdGhlIGRp
c3RhbmNlIGZyb20gdGhlIHRvcCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrIHRvIHRoZSB0
b3AgbWFyZ2luCisgICAgLy8gZWRnZSBvZiBhIGh5cG90aGV0aWNhbCBib3ggdGhhdCB3b3VsZCBo
YXZlIGJlZW4gdGhlIGZpcnN0IGJveCBvZiB0aGUgZWxlbWVudCBpZiBpdHMgc3BlY2lmaWVkICdw
b3NpdGlvbicgdmFsdWUgaGFkIGJlZW4gJ3N0YXRpYycgYW5kIGl0cyBzcGVjaWZpZWQKKyAgICAv
LyAnZmxvYXQnIGhhZCBiZWVuICdub25lJyBhbmQgaXRzIHNwZWNpZmllZCAnY2xlYXInIGhhZCBi
ZWVuICdub25lJy4gKE5vdGUgdGhhdCBkdWUgdG8gdGhlIHJ1bGVzIGluIHNlY3Rpb24gOS43IHRo
aXMgbWlnaHQgcmVxdWlyZSBhbHNvIGFzc3VtaW5nIGEgZGlmZmVyZW50CisgICAgLy8gY29tcHV0
ZWQgdmFsdWUgZm9yICdkaXNwbGF5Jy4pIFRoZSB2YWx1ZSBpcyBuZWdhdGl2ZSBpZiB0aGUgaHlw
b3RoZXRpY2FsIGJveCBpcyBhYm92ZSB0aGUgY29udGFpbmluZyBibG9jay4KKworICAgIC8vIFN0
YXJ0IHdpdGggdGhpcyBib3gncyBib3JkZXIgYm94IG9mZnNldCBmcm9tIHRoZSBwYXJlbnQncyBi
b3JkZXIgYm94LgorICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9ybWF0dGlu
Z0NvbnRleHQoKTsKKyAgICBMYXlvdXRVbml0IHRvcDsKKyAgICBpZiAobGF5b3V0Qm94LnByZXZp
b3VzSW5GbG93U2libGluZygpICYmIGxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKS0+
aXNCbG9ja0xldmVsQm94KCkpIHsKKyAgICAgICAgLy8gQWRkIHNpYmxpbmcgb2Zmc2V0CisgICAg
ICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9ICpsYXlvdXRCb3gucHJldmlvdXNJbkZs
b3dTaWJsaW5nKCk7CisgICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93Qm94R2VvbWV0cnkgPSBm
b3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChwcmV2aW91c0luRmxvd1NpYmxpbmcsIEVz
Y2FwZVJlYXNvbjo6T3V0T2ZGbG93Qm94TmVlZHNJbkZsb3dHZW9tZXRyeSk7CisgICAgICAgIGF1
dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IGRvd25jYXN0PEJsb2NrRm9ybWF0dGluZ1N0YXRlPihsYXlv
dXRTdGF0ZSgpLmZvcm1hdHRpbmdTdGF0ZUZvckJveChwcmV2aW91c0luRmxvd1NpYmxpbmcpKTsK
KyAgICAgICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW5Gb3JQcmV2aW91c0JveCA9IGZvcm1hdHRp
bmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNJbkZsb3dTaWJsaW5nKTsKKworICAg
ICAgICB0b3AgKz0gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QocHJldmlvdXNJbkZsb3dCb3hH
ZW9tZXRyeSkuYm90dG9tKCkgKyB1c2VkVmVydGljYWxNYXJnaW5Gb3JQcmV2aW91c0JveC5ub25D
b2xsYXBzZWRWYWx1ZXMuYWZ0ZXI7CisgICAgfSBlbHNlCisgICAgICAgIHRvcCA9IGZvcm1hdHRp
bmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveC5wYXJlbnQoKSwgRXNjYXBlUmVhc29u
OjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5KS5jb250ZW50Qm94VG9wKCk7CisKKyAg
ICAvLyBSZXNvbHZlIHRvcCBhbGwgdGhlIHdheSB1cCB0byB0aGUgY29udGFpbmluZyBibG9jay4K
KyAgICBhdXRvJiBjb250YWluaW5nQmxvY2sgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7
CisgICAgLy8gU3RhcnQgd2l0aCB0aGUgcGFyZW50IHNpbmNlIHdlIHByZXRlbmQgdGhhdCB0aGlz
IGJveCBpcyBub3JtYWwgZmxvdy4KKyAgICBmb3IgKGF1dG8qIGFuY2VzdG9yID0gJmxheW91dEJv
eC5wYXJlbnQoKTsgYW5jZXN0b3IgIT0gJmNvbnRhaW5pbmdCbG9jazsgYW5jZXN0b3IgPSAmYW5j
ZXN0b3ItPmNvbnRhaW5pbmdCbG9jaygpKSB7CisgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0g
Zm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goKmFuY2VzdG9yLCBFc2NhcGVSZWFzb246
Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0cnkpOworICAgICAgICAvLyBCb3hHZW9tZXRy
eTo6dG9wIGlzIHRoZSBib3JkZXIgYm94IHRvcCBwb3NpdGlvbiBpbiBpdHMgY29udGFpbmluZyBi
bG9jaydzIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAgICB0b3AgKz0gQm94R2VvbWV0cnk6OmJv
cmRlckJveFRvcChib3hHZW9tZXRyeSk7CisgICAgICAgIEFTU0VSVCghYW5jZXN0b3ItPmlzUG9z
aXRpb25lZCgpIHx8IGxheW91dEJveC5pc0ZpeGVkUG9zaXRpb25lZCgpKTsKKyAgICB9CisgICAg
Ly8gTW92ZSB0aGUgc3RhdGljIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBwYWRkaW5nIGJveC4g
VGhpcyBpcyB2ZXJ5IHNwZWNpZmljIHRvIGFib2x1dGVseSBwb3NpdGlvbmVkIGJveGVzLgorICAg
IHJldHVybiB0b3AgLSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7Cit9CisKK0xheW91
dFVuaXQgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNIb3Jpem9udGFsUG9zaXRp
b25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jp
em9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICBB
U1NFUlQobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKKyAgICAvLyBTZWUgc3Rh
dGljVmVydGljYWxQb3NpdGlvbkZvck91dE9mRmxvd1Bvc2l0aW9uZWQgZm9yIHRoZSBkZWZpbml0
aW9uIG9mIHRoZSBzdGF0aWMgcG9zaXRpb24uCisKKyAgICAvLyBTdGFydCB3aXRoIHRoaXMgYm94
J3MgYm9yZGVyIGJveCBvZmZzZXQgZnJvbSB0aGUgcGFyZW50J3MgYm9yZGVyIGJveC4KKyAgICBh
dXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7CisgICAg
YXV0byBsZWZ0ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LnBh
cmVudCgpLCBFc2NhcGVSZWFzb246Ok91dE9mRmxvd0JveE5lZWRzSW5GbG93R2VvbWV0cnkpLmNv
bnRlbnRCb3hMZWZ0KCk7CisKKyAgICAvLyBSZXNvbHZlIGxlZnQgYWxsIHRoZSB3YXkgdXAgdG8g
dGhlIGNvbnRhaW5pbmcgYmxvY2suCisgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gbGF5b3V0
Qm94LmNvbnRhaW5pbmdCbG9jaygpOworICAgIC8vIFN0YXJ0IHdpdGggdGhlIHBhcmVudCBzaW5j
ZSB3ZSBwcmV0ZW5kIHRoYXQgdGhpcyBib3ggaXMgbm9ybWFsIGZsb3cuCisgICAgZm9yIChhdXRv
KiBhbmNlc3RvciA9ICZsYXlvdXRCb3gucGFyZW50KCk7IGFuY2VzdG9yICE9ICZjb250YWluaW5n
QmxvY2s7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkgeworICAgICAg
ICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KCph
bmNlc3RvciwgRXNjYXBlUmVhc29uOjpPdXRPZkZsb3dCb3hOZWVkc0luRmxvd0dlb21ldHJ5KTsK
KyAgICAgICAgLy8gQm94R2VvbWV0cnk6OmxlZnQgaXMgdGhlIGJvcmRlciBib3ggbGVmdCBwb3Np
dGlvbiBpbiBpdHMgY29udGFpbmluZyBibG9jaydzIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAg
ICBsZWZ0ICs9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hMZWZ0KGJveEdlb21ldHJ5KTsKKyAgICAg
ICAgQVNTRVJUKCFhbmNlc3Rvci0+aXNQb3NpdGlvbmVkKCkgfHwgbGF5b3V0Qm94LmlzRml4ZWRQ
b3NpdGlvbmVkKCkpOworICAgIH0KKyAgICAvLyBNb3ZlIHRoZSBzdGF0aWMgcG9zaXRpb24gcmVs
YXRpdmUgdG8gdGhlIHBhZGRpbmcgYm94LiBUaGlzIGlzIHZlcnkgc3BlY2lmaWMgdG8gYWJvbHV0
ZWx5IHBvc2l0aW9uZWQgYm94ZXMuCisgICAgcmV0dXJuIGxlZnQgLSBob3Jpem9udGFsQ29uc3Ry
YWludHMubG9naWNhbExlZnQ7Cit9CisKK0xheW91dFVuaXQgRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5OjpzaHJpbmtUb0ZpdFdpZHRoKGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290
LCBMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKQoreworICAgIExPR19XSVRIX1NUUkVBTShGb3Jt
YXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbV2lkdGhdIC0+IHNocmluayB0byBmaXQg
LT4gdW5zdXBwb3J0ZWQgLT4gd2lkdGgoIiA8PCBMYXlvdXRVbml0IHsgfSA8PCAicHgpIGxheW91
dEJveDogIiA8PCAmZm9ybWF0dGluZ0NvbnRleHRSb290IDw8ICIpIik7CisgICAgQVNTRVJUKGZv
cm1hdHRpbmdDb250ZXh0Um9vdC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpOworCisg
ICAgLy8gQ2FsY3VsYXRpb24gb2YgdGhlIHNocmluay10by1maXQgd2lkdGggaXMgc2ltaWxhciB0
byBjYWxjdWxhdGluZyB0aGUgd2lkdGggb2YgYSB0YWJsZSBjZWxsIHVzaW5nIHRoZSBhdXRvbWF0
aWMgdGFibGUgbGF5b3V0IGFsZ29yaXRobS4KKyAgICAvLyBSb3VnaGx5OiBjYWxjdWxhdGUgdGhl
IHByZWZlcnJlZCB3aWR0aCBieSBmb3JtYXR0aW5nIHRoZSBjb250ZW50IHdpdGhvdXQgYnJlYWtp
bmcgbGluZXMgb3RoZXIgdGhhbiB3aGVyZSBleHBsaWNpdCBsaW5lIGJyZWFrcyBvY2N1ciwKKyAg
ICAvLyBhbmQgYWxzbyBjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBtaW5pbXVtIHdpZHRoLCBlLmcu
LCBieSB0cnlpbmcgYWxsIHBvc3NpYmxlIGxpbmUgYnJlYWtzLiBDU1MgMi4yIGRvZXMgbm90IGRl
ZmluZSB0aGUgZXhhY3QgYWxnb3JpdGhtLgorICAgIC8vIFRoaXJkbHksIGZpbmQgdGhlIGF2YWls
YWJsZSB3aWR0aDogaW4gdGhpcyBjYXNlLCB0aGlzIGlzIHRoZSB3aWR0aCBvZiB0aGUgY29udGFp
bmluZyBibG9jayBtaW51cyB0aGUgdXNlZCB2YWx1ZXMgb2YgJ21hcmdpbi1sZWZ0JywgJ2JvcmRl
ci1sZWZ0LXdpZHRoJywKKyAgICAvLyAncGFkZGluZy1sZWZ0JywgJ3BhZGRpbmctcmlnaHQnLCAn
Ym9yZGVyLXJpZ2h0LXdpZHRoJywgJ21hcmdpbi1yaWdodCcsIGFuZCB0aGUgd2lkdGhzIG9mIGFu
eSByZWxldmFudCBzY3JvbGwgYmFycy4KKworICAgIC8vIFRoZW4gdGhlIHNocmluay10by1maXQg
d2lkdGggaXM6IG1pbihtYXgocHJlZmVycmVkIG1pbmltdW0gd2lkdGgsIGF2YWlsYWJsZSB3aWR0
aCksIHByZWZlcnJlZCB3aWR0aCkuCisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
ID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07CisgICAgYXV0byBoYXNDb250ZW50ID0g
aXM8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3QpICYmIGRvd25jYXN0PENvbnRh
aW5lckJveD4oZm9ybWF0dGluZ0NvbnRleHRSb290KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQo
KTsKKyAgICAvLyBUaGUgdXNlZCB3aWR0aCBvZiB0aGUgY29udGFpbm1lbnQgYm94IGlzIGRldGVy
bWluZWQgYXMgaWYgcGVyZm9ybWluZyBhIG5vcm1hbCBsYXlvdXQgb2YgdGhlIGJveCwgZXhjZXB0
IHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBoYXZpbmcgbm8gY29udGVudC4KKyAgICBhdXRvIHNob3Vs
ZElnbm9yZUNvbnRlbnQgPSBmb3JtYXR0aW5nQ29udGV4dFJvb3QuaXNTaXplQ29udGFpbm1lbnRC
b3goKTsgIAorICAgIGlmIChoYXNDb250ZW50ICYmICFzaG91bGRJZ25vcmVDb250ZW50KSB7Cisg
ICAgICAgIGF1dG8mIHJvb3QgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGZvcm1hdHRpbmdDb250
ZXh0Um9vdCk7CisgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZUZvclJvb3QgPSBsYXlvdXRT
dGF0ZSgpLmVuc3VyZUZvcm1hdHRpbmdTdGF0ZShyb290KTsKKyAgICAgICAgYXV0byBwcmVjb21w
dXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBmb3JtYXR0aW5nU3RhdGVGb3JSb290Lmlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKKyAgICAgICAgaWYgKCFwcmVjb21wdXRlZEludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMpCisgICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQocm9vdCwgbGF5b3V0
U3RhdGUoKSktPmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gKnByZWNvbXB1dGVk
SW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bWluKHN0
ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgYXZhaWxhYmxlV2lkdGgp
LCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0pOworfQorCitWZXJ0aWNhbEdlb21l
dHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93Tm9uUmVwbGFjZWRWZXJ0
aWNhbEdlb21ldHJ5KGNvbnN0IENvbnRhaW5lckJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVydGljYWxDb25z
dHJhaW50cyYgdmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFs
dWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91
dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3go
KSk7CisgICAgQVNTRVJUKHZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbEhlaWdodCk7CisKKyAg
ICAvLyAxMC42LjQgQWJzb2x1dGVseSBwb3NpdGlvbmVkLCBub24tcmVwbGFjZWQgZWxlbWVudHMK
KyAgICAvLworICAgIC8vIEZvciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgZWxlbWVudHMsIHRoZSB1
c2VkIHZhbHVlcyBvZiB0aGUgdmVydGljYWwgZGltZW5zaW9ucyBtdXN0IHNhdGlzZnkgdGhpcyBj
b25zdHJhaW50OgorICAgIC8vICd0b3AnICsgJ21hcmdpbi10b3AnICsgJ2JvcmRlci10b3Atd2lk
dGgnICsgJ3BhZGRpbmctdG9wJyArICdoZWlnaHQnICsgJ3BhZGRpbmctYm90dG9tJyArICdib3Jk
ZXItYm90dG9tLXdpZHRoJyArICdtYXJnaW4tYm90dG9tJyArICdib3R0b20nCisgICAgLy8gPSBo
ZWlnaHQgb2YgY29udGFpbmluZyBibG9jaworCisgICAgLy8gSWYgYWxsIHRocmVlIG9mICd0b3An
LCAnaGVpZ2h0JywgYW5kICdib3R0b20nIGFyZSBhdXRvLCBzZXQgJ3RvcCcgdG8gdGhlIHN0YXRp
YyBwb3NpdGlvbiBhbmQgYXBwbHkgcnVsZSBudW1iZXIgdGhyZWUgYmVsb3cuCisKKyAgICAvLyBJ
ZiBub25lIG9mIHRoZSB0aHJlZSBhcmUgJ2F1dG8nOiBJZiBib3RoICdtYXJnaW4tdG9wJyBhbmQg
J21hcmdpbi1ib3R0b20nIGFyZSAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0aGUg
ZXh0cmEKKyAgICAvLyBjb25zdHJhaW50IHRoYXQgdGhlIHR3byBtYXJnaW5zIGdldCBlcXVhbCB2
YWx1ZXMuIElmIG9uZSBvZiAnbWFyZ2luLXRvcCcgb3IgJ21hcmdpbi1ib3R0b20nIGlzICdhdXRv
Jywgc29sdmUgdGhlIGVxdWF0aW9uIGZvciB0aGF0IHZhbHVlLgorICAgIC8vIElmIHRoZSB2YWx1
ZXMgYXJlIG92ZXItY29uc3RyYWluZWQsIGlnbm9yZSB0aGUgdmFsdWUgZm9yICdib3R0b20nIGFu
ZCBzb2x2ZSBmb3IgdGhhdCB2YWx1ZS4KKworICAgIC8vIE90aGVyd2lzZSwgcGljayB0aGUgb25l
IG9mIHRoZSBmb2xsb3dpbmcgc2l4IHJ1bGVzIHRoYXQgYXBwbGllcy4KKworICAgIC8vIDEuICd0
b3AnIGFuZCAnaGVpZ2h0JyBhcmUgJ2F1dG8nIGFuZCAnYm90dG9tJyBpcyBub3QgJ2F1dG8nLCB0
aGVuIHRoZSBoZWlnaHQgaXMgYmFzZWQgb24gdGhlIGNvbnRlbnQgcGVyIDEwLjYuNywKKyAgICAv
LyAgICAgc2V0ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0
b20nIHRvIDAsIGFuZCBzb2x2ZSBmb3IgJ3RvcCcKKyAgICAvLyAyLiAndG9wJyBhbmQgJ2JvdHRv
bScgYXJlICdhdXRvJyBhbmQgJ2hlaWdodCcgaXMgbm90ICdhdXRvJywgdGhlbiBzZXQgJ3RvcCcg
dG8gdGhlIHN0YXRpYyBwb3NpdGlvbiwgc2V0ICdhdXRvJyB2YWx1ZXMgZm9yCisgICAgLy8gICAg
J21hcmdpbi10b3AnIGFuZCAnbWFyZ2luLWJvdHRvbScgdG8gMCwgYW5kIHNvbHZlIGZvciAnYm90
dG9tJworICAgIC8vIDMuICdoZWlnaHQnIGFuZCAnYm90dG9tJyBhcmUgJ2F1dG8nIGFuZCAndG9w
JyBpcyBub3QgJ2F1dG8nLCB0aGVuIHRoZSBoZWlnaHQgaXMgYmFzZWQgb24gdGhlIGNvbnRlbnQg
cGVyIDEwLjYuNywgc2V0ICdhdXRvJworICAgIC8vICAgICB2YWx1ZXMgZm9yICdtYXJnaW4tdG9w
JyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAsIGFuZCBzb2x2ZSBmb3IgJ2JvdHRvbScKKyAgICAv
LyA0LiAndG9wJyBpcyAnYXV0bycsICdoZWlnaHQnIGFuZCAnYm90dG9tJyBhcmUgbm90ICdhdXRv
JywgdGhlbiBzZXQgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi10b3AnIGFuZCAnbWFyZ2luLWJv
dHRvbScgdG8gMCwgYW5kIHNvbHZlIGZvciAndG9wJworICAgIC8vIDUuICdoZWlnaHQnIGlzICdh
dXRvJywgJ3RvcCcgYW5kICdib3R0b20nIGFyZSBub3QgJ2F1dG8nLCB0aGVuICdhdXRvJyB2YWx1
ZXMgZm9yICdtYXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIGFyZSBzZXQgdG8gMCBhbmQg
c29sdmUgZm9yICdoZWlnaHQnCisgICAgLy8gNi4gJ2JvdHRvbScgaXMgJ2F1dG8nLCAndG9wJyBh
bmQgJ2hlaWdodCcgYXJlIG5vdCAnYXV0bycsIHRoZW4gc2V0ICdhdXRvJyB2YWx1ZXMgZm9yICdt
YXJnaW4tdG9wJyBhbmQgJ21hcmdpbi1ib3R0b20nIHRvIDAgYW5kIHNvbHZlIGZvciAnYm90dG9t
JworCisgICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4
dCgpOworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgYXV0byYgYm94
R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwor
ICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrSGVpZ2h0ID0gKnZlcnRpY2FsQ29uc3RyYWludHMubG9n
aWNhbEhlaWdodDsKKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpvbnRhbENv
bnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKKworICAgIGF1dG8gdG9wID0gY29tcHV0ZWRWYWx1ZShz
dHlsZS5sb2dpY2FsVG9wKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKyAgICBhdXRvIGJvdHRv
bSA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbEJvdHRvbSgpLCBjb250YWluaW5nQmxvY2tX
aWR0aCk7CisgICAgYXV0byBoZWlnaHQgPSBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVpZ2h0
ID8gb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodC52YWx1ZSgpIDogY29tcHV0ZWRIZWln
aHQobGF5b3V0Qm94LCBjb250YWluaW5nQmxvY2tIZWlnaHQpOworICAgIGF1dG8gY29tcHV0ZWRW
ZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJv
eCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNv
bGxhcHNlZFZhbHVlcyB1c2VkVmVydGljYWxNYXJnaW47IAorICAgIGF1dG8gcGFkZGluZ1RvcCA9
IGJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKDApOworICAgIGF1dG8gcGFkZGluZ0Jv
dHRvbSA9IGJveEdlb21ldHJ5LnBhZGRpbmdCb3R0b20oKS52YWx1ZU9yKDApOworICAgIGF1dG8g
Ym9yZGVyVG9wID0gYm94R2VvbWV0cnkuYm9yZGVyVG9wKCk7CisgICAgYXV0byBib3JkZXJCb3R0
b20gPSBib3hHZW9tZXRyeS5ib3JkZXJCb3R0b20oKTsKKworICAgIGlmICghdG9wICYmICFoZWln
aHQgJiYgIWJvdHRvbSkKKyAgICAgICAgdG9wID0gc3RhdGljVmVydGljYWxQb3NpdGlvbkZvck91
dE9mRmxvd1Bvc2l0aW9uZWQobGF5b3V0Qm94LCB2ZXJ0aWNhbENvbnN0cmFpbnRzKTsKKworICAg
IGlmICh0b3AgJiYgaGVpZ2h0ICYmIGJvdHRvbSkgeworICAgICAgICBpZiAoIWNvbXB1dGVkVmVy
dGljYWxNYXJnaW4uYmVmb3JlICYmICFjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyKSB7Cisg
ICAgICAgICAgICBhdXRvIG1hcmdpbkJlZm9yZUFuZEFmdGVyID0gY29udGFpbmluZ0Jsb2NrSGVp
Z2h0IC0gKCp0b3AgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdC
b3R0b20gKyBib3JkZXJCb3R0b20gKyAqYm90dG9tKTsKKyAgICAgICAgICAgIHVzZWRWZXJ0aWNh
bE1hcmdpbiA9IHsgbWFyZ2luQmVmb3JlQW5kQWZ0ZXIgLyAyLCBtYXJnaW5CZWZvcmVBbmRBZnRl
ciAvIDIgfTsKKyAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZv
cmUpIHsKKyAgICAgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciA9ICpjb21wdXRlZFZl
cnRpY2FsTWFyZ2luLmFmdGVyOworICAgICAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9y
ZSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsgcGFkZGluZ1Rv
cCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2Fs
TWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7CisgICAgICAgIH0gZWxzZSBpZiAoIWNvbXB1dGVkVmVy
dGljYWxNYXJnaW4uYWZ0ZXIpIHsKKyAgICAgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZv
cmUgPSAqY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmU7CisgICAgICAgICAgICB1c2VkVmVy
dGljYWxNYXJnaW4uYWZ0ZXIgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIHVzZWRW
ZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCAr
IHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqYm90dG9tKTsKKyAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4gPSB7ICpjb21wdXRlZFZlcnRpY2FsTWFy
Z2luLmJlZm9yZSwgKmNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIgfTsKKyAgICAgICAgLy8g
T3Zlci1jb25zdHJhaW5lZD8KKyAgICAgICAgYXV0byBib3hIZWlnaHQgPSAqdG9wICsgdXNlZFZl
cnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyAqaGVpZ2h0ICsg
cGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0aWNhbE1hcmdpbi5hZnRlciAr
ICpib3R0b207CisgICAgICAgIGlmIChib3hIZWlnaHQgIT0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0
KQorICAgICAgICAgICAgYm90dG9tID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyB1
c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArICpoZWln
aHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFm
dGVyKTsKKyAgICB9CisKKyAgICBpZiAoIXRvcCAmJiAhaGVpZ2h0ICYmIGJvdHRvbSkgeworICAg
ICAgICAvLyAjMQorICAgICAgICBoZWlnaHQgPSBjb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0Nv
bnRleHRSb290KGxheW91dEJveCk7CisgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IHsgY29t
cHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1h
cmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgICAgIHRvcCA9IGNvbnRhaW5pbmdCbG9ja0hl
aWdodCAtICh1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1Rv
cCArICpoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyQm90dG9tICsgdXNlZFZlcnRpY2Fs
TWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7IAorICAgIH0KKworICAgIGlmICghdG9wICYmICFib3R0
b20gJiYgaGVpZ2h0KSB7CisgICAgICAgIC8vICMyCisgICAgICAgIHRvcCA9IHN0YXRpY1ZlcnRp
Y2FsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVkKGxheW91dEJveCwgdmVydGljYWxDb25z
dHJhaW50cyk7CisgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbiA9IHsgY29tcHV0ZWRWZXJ0aWNh
bE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52
YWx1ZU9yKDApIH07CisgICAgICAgIGJvdHRvbSA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgq
dG9wICsgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3Ag
KyAqaGVpZ2h0ICsgcGFkZGluZ0JvdHRvbSArIGJvcmRlckJvdHRvbSArIHVzZWRWZXJ0aWNhbE1h
cmdpbi5hZnRlcik7CisgICAgfQorCisgICAgaWYgKCFoZWlnaHQgJiYgIWJvdHRvbSAmJiB0b3Ap
IHsKKyAgICAgICAgLy8gIzMKKyAgICAgICAgaGVpZ2h0ID0gY29udGVudEhlaWdodEZvckZvcm1h
dHRpbmdDb250ZXh0Um9vdChsYXlvdXRCb3gpOworICAgICAgICB1c2VkVmVydGljYWxNYXJnaW4g
PSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVy
dGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OworICAgICAgICBib3R0b20gPSBjb250YWlu
aW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3Jk
ZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0
b20gKyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIpOworICAgIH0KKworICAgIGlmICghdG9wICYm
IGhlaWdodCAmJiBib3R0b20pIHsKKyAgICAgICAgLy8gIzQKKyAgICAgICAgdXNlZFZlcnRpY2Fs
TWFyZ2luID0geyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21w
dXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsKKyAgICAgICAgdG9wID0gY29u
dGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgKyBib3JkZXJU
b3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20g
KyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgKyAqYm90dG9tKTsKKyAgICB9CisKKyAgICBpZiAo
IWhlaWdodCAmJiB0b3AgJiYgYm90dG9tKSB7CisgICAgICAgIC8vICM1CisgICAgICAgIHVzZWRW
ZXJ0aWNhbE1hcmdpbiA9IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigw
KSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgICAgIGhl
aWdodCA9IGNvbnRhaW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgdXNlZFZlcnRpY2FsTWFyZ2lu
LmJlZm9yZSArIGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVy
Qm90dG9tICsgdXNlZFZlcnRpY2FsTWFyZ2luLmFmdGVyICsgKmJvdHRvbSk7CisgICAgfQorCisg
ICAgaWYgKCFib3R0b20gJiYgdG9wICYmIGhlaWdodCkgeworICAgICAgICAvLyAjNgorICAgICAg
ICB1c2VkVmVydGljYWxNYXJnaW4gPSB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZh
bHVlT3IoMCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OworICAg
ICAgICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArIHVzZWRWZXJ0aWNh
bE1hcmdpbi5iZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgKmhlaWdodCArIHBhZGRp
bmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIpOworICAg
IH0KKworICAgIEFTU0VSVCh0b3ApOworICAgIEFTU0VSVChib3R0b20pOworICAgIEFTU0VSVCho
ZWlnaHQpOworCisgICAgLy8gRm9yIG91dC1vZi1mbG93IGVsZW1lbnRzIHRoZSBjb250YWluaW5n
IGJsb2NrIGlzIGZvcm1lZCBieSB0aGUgcGFkZGluZyBlZGdlIG9mIHRoZSBhbmNlc3Rvci4KKyAg
ICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwb3NpdGlvbmVkIHZhbHVlIGlzIGluIHRoZSBjb29yZGlu
YXRlIHN5c3RlbSBvZiB0aGUgcGFkZGluZyBib3guIExldCdzIGNvbnZlcnQgaXQgdG8gYm9yZGVy
IGJveCBjb29yZGluYXRlIHN5c3RlbS4KKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdW
ZXJ0aWNhbEVkZ2UgPSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7CisgICAgKnRvcCAr
PSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOworICAgICpib3R0b20gKz0gY29u
dGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZTsKKworICAgIExPR19XSVRIX1NUUkVBTShG
b3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbUG9zaXRpb25dW0hlaWdodF1bTWFy
Z2luXSAtPiBvdXQtb2YtZmxvdyBub24tcmVwbGFjZWQgLT4gdG9wKCIgPDwgKnRvcCA8PCAicHgp
IGJvdHRvbSgiICA8PCAqYm90dG9tIDw8ICJweCkgaGVpZ2h0KCIgPDwgKmhlaWdodCA8PCAicHgp
IG1hcmdpbigiIDw8IHVzZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPDwgInB4LCAiICA8PCB1c2Vk
VmVydGljYWxNYXJnaW4uYWZ0ZXIgPDwgInB4KSBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8
ICIpIik7CisgICAgcmV0dXJuIHsgKnRvcCwgKmJvdHRvbSwgeyAqaGVpZ2h0LCB1c2VkVmVydGlj
YWxNYXJnaW4gfSB9OworfQorCitIb3Jpem9udGFsR2VvbWV0cnkgRm9ybWF0dGluZ0NvbnRleHQ6
Okdlb21ldHJ5OjpvdXRPZkZsb3dOb25SZXBsYWNlZEhvcml6b250YWxHZW9tZXRyeShjb25zdCBD
b250YWluZXJCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jp
em9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJiBvdmVy
cmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzT3V0T2ZG
bG93UG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKKyAgICAKKyAg
ICAvLyAxMC4zLjcgQWJzb2x1dGVseSBwb3NpdGlvbmVkLCBub24tcmVwbGFjZWQgZWxlbWVudHMK
KyAgICAvLworICAgIC8vICdsZWZ0JyArICdtYXJnaW4tbGVmdCcgKyAnYm9yZGVyLWxlZnQtd2lk
dGgnICsgJ3BhZGRpbmctbGVmdCcgKyAnd2lkdGgnICsgJ3BhZGRpbmctcmlnaHQnICsgJ2JvcmRl
ci1yaWdodC13aWR0aCcgKyAnbWFyZ2luLXJpZ2h0JyArICdyaWdodCcKKyAgICAvLyA9IHdpZHRo
IG9mIGNvbnRhaW5pbmcgYmxvY2sKKworICAgIC8vIElmIGFsbCB0aHJlZSBvZiAnbGVmdCcsICd3
aWR0aCcsIGFuZCAncmlnaHQnIGFyZSAnYXV0byc6IEZpcnN0IHNldCBhbnkgJ2F1dG8nIHZhbHVl
cyBmb3IgJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgdG8gMC4KKyAgICAvLyBUaGVu
LCBpZiB0aGUgJ2RpcmVjdGlvbicgcHJvcGVydHkgb2YgdGhlIGVsZW1lbnQgZXN0YWJsaXNoaW5n
IHRoZSBzdGF0aWMtcG9zaXRpb24gY29udGFpbmluZyBibG9jayBpcyAnbHRyJyBzZXQgJ2xlZnQn
IHRvIHRoZSBzdGF0aWMKKyAgICAvLyBwb3NpdGlvbiBhbmQgYXBwbHkgcnVsZSBudW1iZXIgdGhy
ZWUgYmVsb3c7IG90aGVyd2lzZSwgc2V0ICdyaWdodCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbiBh
bmQgYXBwbHkgcnVsZSBudW1iZXIgb25lIGJlbG93LgorICAgIC8vCisgICAgLy8gSWYgbm9uZSBv
ZiB0aGUgdGhyZWUgaXMgJ2F1dG8nOiBJZiBib3RoICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4t
cmlnaHQnIGFyZSAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0aGUgZXh0cmEgY29u
c3RyYWludCB0aGF0IHRoZSB0d28gbWFyZ2lucyBnZXQgZXF1YWwgdmFsdWVzLAorICAgIC8vIHVu
bGVzcyB0aGlzIHdvdWxkIG1ha2UgdGhlbSBuZWdhdGl2ZSwgaW4gd2hpY2ggY2FzZSB3aGVuIGRp
cmVjdGlvbiBvZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAnbHRyJyAoJ3J0bCcpLCBzZXQgJ21h
cmdpbi1sZWZ0JyAoJ21hcmdpbi1yaWdodCcpIHRvIHplcm8gYW5kCisgICAgLy8gc29sdmUgZm9y
ICdtYXJnaW4tcmlnaHQnICgnbWFyZ2luLWxlZnQnKS4gSWYgb25lIG9mICdtYXJnaW4tbGVmdCcg
b3IgJ21hcmdpbi1yaWdodCcgaXMgJ2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gZm9yIHRoYXQg
dmFsdWUuCisgICAgLy8gSWYgdGhlIHZhbHVlcyBhcmUgb3Zlci1jb25zdHJhaW5lZCwgaWdub3Jl
IHRoZSB2YWx1ZSBmb3IgJ2xlZnQnIChpbiBjYXNlIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBv
ZiB0aGUgY29udGFpbmluZyBibG9jayBpcyAncnRsJykgb3IgJ3JpZ2h0JworICAgIC8vIChpbiBj
YXNlICdkaXJlY3Rpb24nIGlzICdsdHInKSBhbmQgc29sdmUgZm9yIHRoYXQgdmFsdWUuCisgICAg
Ly8KKyAgICAvLyBPdGhlcndpc2UsIHNldCAnYXV0bycgdmFsdWVzIGZvciAnbWFyZ2luLWxlZnQn
IGFuZCAnbWFyZ2luLXJpZ2h0JyB0byAwLCBhbmQgcGljayB0aGUgb25lIG9mIHRoZSBmb2xsb3dp
bmcgc2l4IHJ1bGVzIHRoYXQgYXBwbGllcy4KKyAgICAvLworICAgIC8vIDEuICdsZWZ0JyBhbmQg
J3dpZHRoJyBhcmUgJ2F1dG8nIGFuZCAncmlnaHQnIGlzIG5vdCAnYXV0bycsIHRoZW4gdGhlIHdp
ZHRoIGlzIHNocmluay10by1maXQuIFRoZW4gc29sdmUgZm9yICdsZWZ0JworICAgIC8vIDIuICds
ZWZ0JyBhbmQgJ3JpZ2h0JyBhcmUgJ2F1dG8nIGFuZCAnd2lkdGgnIGlzIG5vdCAnYXV0bycsIHRo
ZW4gaWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGVzdGFibGlzaGlu
ZyB0aGUgc3RhdGljLXBvc2l0aW9uIAorICAgIC8vICAgIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0
cicgc2V0ICdsZWZ0JyB0byB0aGUgc3RhdGljIHBvc2l0aW9uLCBvdGhlcndpc2Ugc2V0ICdyaWdo
dCcgdG8gdGhlIHN0YXRpYyBwb3NpdGlvbi4KKyAgICAvLyAgICBUaGVuIHNvbHZlIGZvciAnbGVm
dCcgKGlmICdkaXJlY3Rpb24gaXMgJ3J0bCcpIG9yICdyaWdodCcgKGlmICdkaXJlY3Rpb24nIGlz
ICdsdHInKS4KKyAgICAvLyAzLiAnd2lkdGgnIGFuZCAncmlnaHQnIGFyZSAnYXV0bycgYW5kICds
ZWZ0JyBpcyBub3QgJ2F1dG8nLCB0aGVuIHRoZSB3aWR0aCBpcyBzaHJpbmstdG8tZml0IC4gVGhl
biBzb2x2ZSBmb3IgJ3JpZ2h0JworICAgIC8vIDQuICdsZWZ0JyBpcyAnYXV0bycsICd3aWR0aCcg
YW5kICdyaWdodCcgYXJlIG5vdCAnYXV0bycsIHRoZW4gc29sdmUgZm9yICdsZWZ0JworICAgIC8v
IDUuICd3aWR0aCcgaXMgJ2F1dG8nLCAnbGVmdCcgYW5kICdyaWdodCcgYXJlIG5vdCAnYXV0bycs
IHRoZW4gc29sdmUgZm9yICd3aWR0aCcKKyAgICAvLyA2LiAncmlnaHQnIGlzICdhdXRvJywgJ2xl
ZnQnIGFuZCAnd2lkdGgnIGFyZSBub3QgJ2F1dG8nLCB0aGVuIHNvbHZlIGZvciAncmlnaHQnCisK
KyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7
CisgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICBhdXRvJiBib3hHZW9t
ZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAg
YXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2Fs
V2lkdGg7CisgICAgYXV0byBpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uID0gbGF5b3V0Qm94LmNvbnRh
aW5pbmdCbG9jaygpLnN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOworICAgIAorICAg
IGF1dG8gbGVmdCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbExlZnQoKSwgY29udGFpbmlu
Z0Jsb2NrV2lkdGgpOworICAgIGF1dG8gcmlnaHQgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2lj
YWxSaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisgICAgYXV0byB3aWR0aCA9IG92ZXJy
aWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoID8gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMu
d2lkdGggOiBjb21wdXRlZFdpZHRoKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwor
ICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgVXNl
ZEhvcml6b250YWxNYXJnaW4gdXNlZEhvcml6b250YWxNYXJnaW47CisgICAgYXV0byBwYWRkaW5n
TGVmdCA9IGJveEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCkudmFsdWVPcigwKTsKKyAgICBhdXRvIHBh
ZGRpbmdSaWdodCA9IGJveEdlb21ldHJ5LnBhZGRpbmdSaWdodCgpLnZhbHVlT3IoMCk7CisgICAg
YXV0byBib3JkZXJMZWZ0ID0gYm94R2VvbWV0cnkuYm9yZGVyTGVmdCgpOworICAgIGF1dG8gYm9y
ZGVyUmlnaHQgPSBib3hHZW9tZXRyeS5ib3JkZXJSaWdodCgpOworICAgIGlmICghbGVmdCAmJiAh
d2lkdGggJiYgIXJpZ2h0KSB7CisgICAgICAgIC8vIElmIGFsbCB0aHJlZSBvZiAnbGVmdCcsICd3
aWR0aCcsIGFuZCAncmlnaHQnIGFyZSAnYXV0byc6IEZpcnN0IHNldCBhbnkgJ2F1dG8nIHZhbHVl
cyBmb3IgJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgdG8gMC4KKyAgICAgICAgLy8g
VGhlbiwgaWYgdGhlICdkaXJlY3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGVzdGFibGlz
aGluZyB0aGUgc3RhdGljLXBvc2l0aW9uIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicgc2V0ICds
ZWZ0JyB0byB0aGUgc3RhdGljCisgICAgICAgIC8vIHBvc2l0aW9uIGFuZCBhcHBseSBydWxlIG51
bWJlciB0aHJlZSBiZWxvdzsgb3RoZXJ3aXNlLCBzZXQgJ3JpZ2h0JyB0byB0aGUgc3RhdGljIHBv
c2l0aW9uIGFuZCBhcHBseSBydWxlIG51bWJlciBvbmUgYmVsb3cuCisgICAgICAgIHVzZWRIb3Jp
em9udGFsTWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigw
KSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07CisKKyAgICAgICAg
YXV0byBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24gPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb25G
b3JPdXRPZkZsb3dQb3NpdGlvbmVkKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsK
KyAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pCisgICAgICAgICAgICBsZWZ0ID0g
c3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uOworICAgICAgICBlbHNlCisgICAgICAgICAgICByaWdo
dCA9IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbjsKKyAgICB9IGVsc2UgaWYgKGxlZnQgJiYgd2lk
dGggJiYgcmlnaHQpIHsKKyAgICAgICAgLy8gSWYgbm9uZSBvZiB0aGUgdGhyZWUgaXMgJ2F1dG8n
OiBJZiBib3RoICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIGFyZSAnYXV0bycsIHNv
bHZlIHRoZSBlcXVhdGlvbiB1bmRlciB0aGUgZXh0cmEgY29uc3RyYWludCB0aGF0IHRoZSB0d28g
bWFyZ2lucyBnZXQgZXF1YWwgdmFsdWVzLAorICAgICAgICAvLyB1bmxlc3MgdGhpcyB3b3VsZCBt
YWtlIHRoZW0gbmVnYXRpdmUsIGluIHdoaWNoIGNhc2Ugd2hlbiBkaXJlY3Rpb24gb2YgdGhlIGNv
bnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicgKCdydGwnKSwgc2V0ICdtYXJnaW4tbGVmdCcgKCdtYXJn
aW4tcmlnaHQnKSB0byB6ZXJvIGFuZAorICAgICAgICAvLyBzb2x2ZSBmb3IgJ21hcmdpbi1yaWdo
dCcgKCdtYXJnaW4tbGVmdCcpLiBJZiBvbmUgb2YgJ21hcmdpbi1sZWZ0JyBvciAnbWFyZ2luLXJp
Z2h0JyBpcyAnYXV0bycsIHNvbHZlIHRoZSBlcXVhdGlvbiBmb3IgdGhhdCB2YWx1ZS4KKyAgICAg
ICAgLy8gSWYgdGhlIHZhbHVlcyBhcmUgb3Zlci1jb25zdHJhaW5lZCwgaWdub3JlIHRoZSB2YWx1
ZSBmb3IgJ2xlZnQnIChpbiBjYXNlIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgY29u
dGFpbmluZyBibG9jayBpcyAncnRsJykgb3IgJ3JpZ2h0JworICAgICAgICAvLyAoaW4gY2FzZSAn
ZGlyZWN0aW9uJyBpcyAnbHRyJykgYW5kIHNvbHZlIGZvciB0aGF0IHZhbHVlLgorICAgICAgICBp
ZiAoIWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiAhY29tcHV0ZWRIb3Jpem9udGFs
TWFyZ2luLmVuZCkgeworICAgICAgICAgICAgYXV0byBtYXJnaW5TdGFydEFuZEVuZCA9IGNvbnRh
aW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndp
ZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqcmlnaHQpOworICAgICAgICAgICAg
aWYgKG1hcmdpblN0YXJ0QW5kRW5kID49IDApCisgICAgICAgICAgICAgICAgdXNlZEhvcml6b250
YWxNYXJnaW4gPSB7IG1hcmdpblN0YXJ0QW5kRW5kIC8gMiwgbWFyZ2luU3RhcnRBbmRFbmQgLyAy
IH07CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNMZWZ0VG9SaWdo
dERpcmVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5z
dGFydCA9IDBfbHU7CisgICAgICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVu
ZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4u
c3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQg
KyBib3JkZXJSaWdodCArICpyaWdodCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gMF9sdTsKKyAgICAgICAg
ICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSBjb250YWluaW5nQmxvY2tX
aWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBhZGRp
bmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kICsgKnJpZ2h0
KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAo
IWNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCkgeworICAgICAgICAgICAgdXNlZEhvcml6
b250YWxNYXJnaW4uZW5kID0gKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQ7CisgICAgICAg
ICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0g
KCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0
ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOworICAg
ICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7CisgICAgICAg
ICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uc3RhcnQ7CisgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgPSBjb250YWlu
aW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9y
ZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmln
aHQgKyAqcmlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXNlZEhvcml6b250
YWxNYXJnaW4gPSB7ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQsICpjb21wdXRlZEhv
cml6b250YWxNYXJnaW4uZW5kIH07CisgICAgICAgICAgICAvLyBPdmVyY29uc3RyYWluZWQ/IEln
bm9yZSByaWdodCAobGVmdCkuCisgICAgICAgICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlv
bikKKyAgICAgICAgICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVzZWRI
b3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgKmxlZnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQg
KyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFy
Z2luLmVuZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGVmdCA9IGNvbnRh
aW5pbmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVm
dCArIHBhZGRpbmdMZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1
c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgKyAqcmlnaHQpOworICAgICAgICB9CisgICAgfSBlbHNl
IHsKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi1s
ZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgdG8gMCwgYW5kIHBpY2sgdGhlIG9uZSBvZiB0aGUgZm9s
bG93aW5nIHNpeCBydWxlcyB0aGF0IGFwcGxpZXMuCisgICAgICAgIHVzZWRIb3Jpem9udGFsTWFy
Z2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07CisgICAgfQorCisgICAgaWYgKCFs
ZWZ0ICYmICF3aWR0aCAmJiByaWdodCkgeworICAgICAgICAvLyAjMQorICAgICAgICAvLyBDYWxj
dWxhdGUgdGhlIGF2YWlsYWJsZSB3aWR0aCBieSBzb2x2aW5nIGZvciAnd2lkdGgnIGFmdGVyIHNl
dHRpbmcgJ2xlZnQnIChpbiBjYXNlIDEpIHRvIDAKKyAgICAgICAgbGVmdCA9IExheW91dFVuaXQg
eyAwIH07CisgICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBjb250YWluaW5nQmxvY2tXaWR0
aCAtICgqbGVmdCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBh
ZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1h
cmdpbi5lbmQgKyAqcmlnaHQpOworICAgICAgICB3aWR0aCA9IHNocmlua1RvRml0V2lkdGgobGF5
b3V0Qm94LCBhdmFpbGFibGVXaWR0aCk7CisgICAgICAgIGxlZnQgPSBjb250YWluaW5nQmxvY2tX
aWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5n
TGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCAgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9u
dGFsTWFyZ2luLmVuZCArICpyaWdodCk7CisgICAgfSBlbHNlIGlmICghbGVmdCAmJiAhcmlnaHQg
JiYgd2lkdGgpIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAgYXV0byBzdGF0aWNIb3Jpem9udGFs
UG9zaXRpb24gPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb25Gb3JPdXRPZkZsb3dQb3NpdGlvbmVk
KGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICAgICAgaWYgKGlzTGVmdFRv
UmlnaHREaXJlY3Rpb24pIHsKKyAgICAgICAgICAgIGxlZnQgPSBzdGF0aWNIb3Jpem9udGFsUG9z
aXRpb247CisgICAgICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKCpsZWZ0
ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQg
KyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFy
Z2luLmVuZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByaWdodCA9IHN0YXRpY0hv
cml6b250YWxQb3NpdGlvbjsKKyAgICAgICAgICAgIGxlZnQgPSBjb250YWluaW5nQmxvY2tXaWR0
aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVm
dCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxN
YXJnaW4uZW5kICsgKnJpZ2h0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXdpZHRoICYm
ICFyaWdodCAmJiBsZWZ0KSB7CisgICAgICAgIC8vICMzCisgICAgICAgIC8vIENhbGN1bGF0ZSB0
aGUgYXZhaWxhYmxlIHdpZHRoIGJ5IHNvbHZpbmcgZm9yICd3aWR0aCcgYWZ0ZXIgc2V0dGluZyAn
cmlnaHQnIChpbiBjYXNlIDMpIHRvIDAKKyAgICAgICAgcmlnaHQgPSBMYXlvdXRVbml0IHsgMCB9
OworICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAo
KmxlZnQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5n
TGVmdCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxNYXJnaW4u
ZW5kICsgKnJpZ2h0KTsKKyAgICAgICAgd2lkdGggPSBzaHJpbmtUb0ZpdFdpZHRoKGxheW91dEJv
eCwgYXZhaWxhYmxlV2lkdGgpOworICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRo
IC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCk7CisgICAgfSBlbHNlIGlmICghbGVmdCAmJiB3aWR0aCAmJiByaWdo
dCkgeworICAgICAgICAvLyAjNAorICAgICAgICBsZWZ0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGgg
LSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQg
KyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFy
Z2luLmVuZCArICpyaWdodCk7CisgICAgfSBlbHNlIGlmICghd2lkdGggJiYgbGVmdCAmJiByaWdo
dCkgeworICAgICAgICAvLyAjNQorICAgICAgICB3aWR0aCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRo
IC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFy
Z2luLmVuZCArICpyaWdodCk7CisgICAgfSBlbHNlIGlmICghcmlnaHQgJiYgbGVmdCAmJiB3aWR0
aCkgeworICAgICAgICAvLyAjNgorICAgICAgICByaWdodCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRo
IC0gKCpsZWZ0ICsgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCk7CisgICAgfQorCisgICAgQVNTRVJUKGxlZnQpOworICAgIEFTU0VS
VChyaWdodCk7CisgICAgQVNTRVJUKHdpZHRoKTsKKworICAgIC8vIEZvciBvdXQtb2YtZmxvdyBl
bGVtZW50cyB0aGUgY29udGFpbmluZyBibG9jayBpcyBmb3JtZWQgYnkgdGhlIHBhZGRpbmcgZWRn
ZSBvZiB0aGUgYW5jZXN0b3IuCisgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcG9zaXRpb25lZCB2
YWx1ZSBpcyBpbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIHBhZGRpbmcgYm94LiBMZXQn
cyBjb252ZXJ0IGl0IHRvIGJvcmRlciBib3ggY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAgYXV0byBj
b250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlID0gaG9yaXpvbnRhbENvbnN0cmFpbnRz
LmxvZ2ljYWxMZWZ0OworICAgICpsZWZ0ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNh
bEVkZ2U7CisgICAgKnJpZ2h0ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7
CisKKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8
PCAiW1Bvc2l0aW9uXVtXaWR0aF1bTWFyZ2luXSAtPiBvdXQtb2YtZmxvdyBub24tcmVwbGFjZWQg
LT4gbGVmdCgiIDw8ICpsZWZ0IDw8ICJweCkgcmlnaHQoIiAgPDwgKnJpZ2h0IDw8ICJweCkgd2lk
dGgoIiA8PCAqd2lkdGggPDwgInB4KSBtYXJnaW4oIiA8PCB1c2VkSG9yaXpvbnRhbE1hcmdpbi5z
dGFydCA8PCAicHgsICIgIDw8IHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA8PCAicHgpIGxheW91
dEJveCgiIDw8ICZsYXlvdXRCb3ggPDwgIikiKTsKKyAgICByZXR1cm4geyAqbGVmdCwgKnJpZ2h0
LCB7ICp3aWR0aCwgdXNlZEhvcml6b250YWxNYXJnaW4gfSB9OworfQorCitWZXJ0aWNhbEdlb21l
dHJ5IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93UmVwbGFjZWRWZXJ0aWNh
bEdlb21ldHJ5KGNvbnN0IFJlcGxhY2VkQm94JiByZXBsYWNlZEJveCwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRpY2FsQ29uc3Ry
YWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVl
cyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAoreworICAgIEFTU0VSVChyZXBsYWNl
ZEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisgICAgQVNTRVJUKHZlcnRpY2FsQ29uc3Ry
YWludHMubG9naWNhbEhlaWdodCk7CisKKyAgICAvLyAxMC42LjUgQWJzb2x1dGVseSBwb3NpdGlv
bmVkLCByZXBsYWNlZCBlbGVtZW50cworICAgIC8vCisgICAgLy8gVGhlIHVzZWQgdmFsdWUgb2Yg
J2hlaWdodCcgaXMgZGV0ZXJtaW5lZCBhcyBmb3IgaW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLgor
ICAgIC8vIElmICdtYXJnaW4tdG9wJyBvciAnbWFyZ2luLWJvdHRvbScgaXMgc3BlY2lmaWVkIGFz
ICdhdXRvJyBpdHMgdXNlZCB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBydWxlcyBiZWxvdy4K
KyAgICAvLyAxLiBJZiBib3RoICd0b3AnIGFuZCAnYm90dG9tJyBoYXZlIHRoZSB2YWx1ZSAnYXV0
bycsIHJlcGxhY2UgJ3RvcCcgd2l0aCB0aGUgZWxlbWVudCdzIHN0YXRpYyBwb3NpdGlvbi4KKyAg
ICAvLyAyLiBJZiAnYm90dG9tJyBpcyAnYXV0bycsIHJlcGxhY2UgYW55ICdhdXRvJyBvbiAnbWFy
Z2luLXRvcCcgb3IgJ21hcmdpbi1ib3R0b20nIHdpdGggJzAnLgorICAgIC8vIDMuIElmIGF0IHRo
aXMgcG9pbnQgYm90aCAnbWFyZ2luLXRvcCcgYW5kICdtYXJnaW4tYm90dG9tJyBhcmUgc3RpbGwg
J2F1dG8nLCBzb2x2ZSB0aGUgZXF1YXRpb24gdW5kZXIgdGhlIGV4dHJhIGNvbnN0cmFpbnQgdGhh
dCB0aGUgdHdvIG1hcmdpbnMgbXVzdCBnZXQgZXF1YWwgdmFsdWVzLgorICAgIC8vIDQuIElmIGF0
IHRoaXMgcG9pbnQgdGhlcmUgaXMgb25seSBvbmUgJ2F1dG8nIGxlZnQsIHNvbHZlIHRoZSBlcXVh
dGlvbiBmb3IgdGhhdCB2YWx1ZS4KKyAgICAvLyA1LiBJZiBhdCB0aGlzIHBvaW50IHRoZSB2YWx1
ZXMgYXJlIG92ZXItY29uc3RyYWluZWQsIGlnbm9yZSB0aGUgdmFsdWUgZm9yICdib3R0b20nIGFu
ZCBzb2x2ZSBmb3IgdGhhdCB2YWx1ZS4KKworICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0ID0g
dGhpcy0+Zm9ybWF0dGluZ0NvbnRleHQoKTsKKyAgICBhdXRvJiBzdHlsZSA9IHJlcGxhY2VkQm94
LnN0eWxlKCk7CisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9t
ZXRyeUZvckJveChyZXBsYWNlZEJveCk7CisgICAgYXV0byBjb250YWluaW5nQmxvY2tIZWlnaHQg
PSAqdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2FsSGVpZ2h0OworICAgIGF1dG8gY29udGFpbmlu
Z0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoOworCisgICAg
YXV0byB0b3AgPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2ljYWxUb3AoKSwgY29udGFpbmluZ0Js
b2NrV2lkdGgpOworICAgIGF1dG8gYm90dG9tID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2Fs
Qm90dG9tKCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKyAgICBhdXRvIGhlaWdodCA9IGlubGlu
ZVJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMp
LmNvbnRlbnRIZWlnaHQ7CisgICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gR2VvbWV0
cnk6OmNvbXB1dGVkVmVydGljYWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJh
aW50cyk7CisgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZE1hcmdpbkJlZm9yZSA9IGNvbXB1
dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlOworICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRN
YXJnaW5BZnRlciA9IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXI7CisgICAgYXV0byBwYWRk
aW5nVG9wID0gYm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCk7CisgICAgYXV0byBw
YWRkaW5nQm90dG9tID0gYm94R2VvbWV0cnkucGFkZGluZ0JvdHRvbSgpLnZhbHVlT3IoMCk7Cisg
ICAgYXV0byBib3JkZXJUb3AgPSBib3hHZW9tZXRyeS5ib3JkZXJUb3AoKTsKKyAgICBhdXRvIGJv
cmRlckJvdHRvbSA9IGJveEdlb21ldHJ5LmJvcmRlckJvdHRvbSgpOworCisgICAgaWYgKCF0b3Ag
JiYgIWJvdHRvbSkgeworICAgICAgICAvLyAjMQorICAgICAgICB0b3AgPSBzdGF0aWNWZXJ0aWNh
bFBvc2l0aW9uRm9yT3V0T2ZGbG93UG9zaXRpb25lZChyZXBsYWNlZEJveCwgdmVydGljYWxDb25z
dHJhaW50cyk7CisgICAgfQorCisgICAgaWYgKCFib3R0b20pIHsKKyAgICAgICAgLy8gIzIKKyAg
ICAgICAgdXNlZE1hcmdpbkJlZm9yZSA9IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZh
bHVlT3IoMCk7CisgICAgICAgIHVzZWRNYXJnaW5BZnRlciA9IHVzZWRNYXJnaW5CZWZvcmU7Cisg
ICAgfQorCisgICAgaWYgKCF1c2VkTWFyZ2luQmVmb3JlICYmICF1c2VkTWFyZ2luQWZ0ZXIpIHsK
KyAgICAgICAgLy8gIzMKKyAgICAgICAgYXV0byBtYXJnaW5CZWZvcmVBbmRBZnRlciA9IGNvbnRh
aW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdo
dCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqYm90dG9tKTsKKyAgICAgICAgdXNl
ZE1hcmdpbkJlZm9yZSA9IG1hcmdpbkJlZm9yZUFuZEFmdGVyIC8gMjsKKyAgICAgICAgdXNlZE1h
cmdpbkFmdGVyID0gdXNlZE1hcmdpbkJlZm9yZTsKKyAgICB9CisKKyAgICAvLyAjNAorICAgIGlm
ICghdG9wKQorICAgICAgICB0b3AgPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnVzZWRNYXJn
aW5CZWZvcmUgKyBib3JkZXJUb3AgKyBwYWRkaW5nVG9wICsgaGVpZ2h0ICsgcGFkZGluZ0JvdHRv
bSArIGJvcmRlckJvdHRvbSArICp1c2VkTWFyZ2luQWZ0ZXIgKyAqYm90dG9tKTsKKworICAgIGlm
ICghYm90dG9tKQorICAgICAgICBib3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRv
cCArICp1c2VkTWFyZ2luQmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdodCAr
IHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyKTsKKworICAg
IGlmICghdXNlZE1hcmdpbkJlZm9yZSkKKyAgICAgICAgdXNlZE1hcmdpbkJlZm9yZSA9IGNvbnRh
aW5pbmdCbG9ja0hlaWdodCAtICgqdG9wICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdo
dCArIHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyICsgKmJv
dHRvbSk7CisKKyAgICBpZiAoIXVzZWRNYXJnaW5BZnRlcikKKyAgICAgICAgdXNlZE1hcmdpbkFm
dGVyID0gY29udGFpbmluZ0Jsb2NrSGVpZ2h0IC0gKCp0b3AgKyAqdXNlZE1hcmdpbkJlZm9yZSAr
IGJvcmRlclRvcCArIHBhZGRpbmdUb3AgKyBoZWlnaHQgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVy
Qm90dG9tICsgKmJvdHRvbSk7CisKKyAgICAvLyAjNQorICAgIGF1dG8gYm94SGVpZ2h0ID0gKnRv
cCArICp1c2VkTWFyZ2luQmVmb3JlICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdodCAr
IHBhZGRpbmdCb3R0b20gKyBib3JkZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyICsgKmJvdHRv
bTsKKyAgICBpZiAoYm94SGVpZ2h0ID4gY29udGFpbmluZ0Jsb2NrSGVpZ2h0KQorICAgICAgICBi
b3R0b20gPSBjb250YWluaW5nQmxvY2tIZWlnaHQgLSAoKnRvcCArICp1c2VkTWFyZ2luQmVmb3Jl
ICsgYm9yZGVyVG9wICsgcGFkZGluZ1RvcCArIGhlaWdodCArIHBhZGRpbmdCb3R0b20gKyBib3Jk
ZXJCb3R0b20gKyAqdXNlZE1hcmdpbkFmdGVyKTsgCisKKyAgICAvLyBGb3Igb3V0LW9mLWZsb3cg
ZWxlbWVudHMgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgZm9ybWVkIGJ5IHRoZSBwYWRkaW5nIGVk
Z2Ugb2YgdGhlIGFuY2VzdG9yLgorICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBvc2l0aW9uZWQg
dmFsdWUgaXMgaW4gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBwYWRkaW5nIGJveC4gTGV0
J3MgY29udmVydCBpdCB0byBib3JkZXIgYm94IGNvb3JkaW5hdGUgc3lzdGVtLgorICAgIGF1dG8g
Y29udGFpbmluZ0Jsb2NrUGFkZGluZ1ZlcnRpY2FsRWRnZSA9IHZlcnRpY2FsQ29uc3RyYWludHMu
bG9naWNhbFRvcDsKKyAgICAqdG9wICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVk
Z2U7CisgICAgKmJvdHRvbSArPSBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVydGljYWxFZGdlOwor
CisgICAgQVNTRVJUKHRvcCk7CisgICAgQVNTRVJUKGJvdHRvbSk7CisgICAgQVNTRVJUKHVzZWRN
YXJnaW5CZWZvcmUpOworICAgIEFTU0VSVCh1c2VkTWFyZ2luQWZ0ZXIpOworICAgIExPR19XSVRI
X1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbUG9zaXRpb25dW0hl
aWdodF1bTWFyZ2luXSAtPiBvdXQtb2YtZmxvdyByZXBsYWNlZCAtPiB0b3AoIiA8PCAqdG9wIDw8
ICJweCkgYm90dG9tKCIgIDw8ICpib3R0b20gPDwgInB4KSBoZWlnaHQoIiA8PCBoZWlnaHQgPDwg
InB4KSBtYXJnaW4oIiA8PCAqdXNlZE1hcmdpbkJlZm9yZSA8PCAicHgsICIgIDw8ICp1c2VkTWFy
Z2luQWZ0ZXIgPDwgInB4KSBsYXlvdXRCb3goIiA8PCAmcmVwbGFjZWRCb3ggPDwgIikiKTsKKyAg
ICByZXR1cm4geyAqdG9wLCAqYm90dG9tLCB7IGhlaWdodCwgeyAqdXNlZE1hcmdpbkJlZm9yZSwg
KnVzZWRNYXJnaW5BZnRlciB9IH0gfTsKK30KKworSG9yaXpvbnRhbEdlb21ldHJ5IEZvcm1hdHRp
bmdDb250ZXh0OjpHZW9tZXRyeTo6b3V0T2ZGbG93UmVwbGFjZWRIb3Jpem9udGFsR2VvbWV0cnko
Y29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVy
dGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJy
aWRkZW5Ib3Jpem9udGFsVmFsdWVzKQoreworICAgIEFTU0VSVChyZXBsYWNlZEJveC5pc091dE9m
Rmxvd1Bvc2l0aW9uZWQoKSk7CisKKyAgICAvLyAxMC4zLjggQWJzb2x1dGVseSBwb3NpdGlvbmVk
LCByZXBsYWNlZCBlbGVtZW50cworICAgIC8vIEluIHRoaXMgY2FzZSwgc2VjdGlvbiAxMC4zLjcg
YXBwbGllcyB1cCB0aHJvdWdoIGFuZCBpbmNsdWRpbmcgdGhlIGNvbnN0cmFpbnQgZXF1YXRpb24s
IGJ1dCB0aGUgcmVzdCBvZiBzZWN0aW9uIDEwLjMuNyBpcyByZXBsYWNlZCBieSB0aGUgZm9sbG93
aW5nIHJ1bGVzOgorICAgIC8vCisgICAgLy8gVGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBpcyBk
ZXRlcm1pbmVkIGFzIGZvciBpbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMuIElmICdtYXJnaW4tbGVm
dCcgb3IgJ21hcmdpbi1yaWdodCcgaXMgc3BlY2lmaWVkIGFzICdhdXRvJyBpdHMgdXNlZCB2YWx1
ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBydWxlcyBiZWxvdy4KKyAgICAvLyAxLiBJZiBib3RoICds
ZWZ0JyBhbmQgJ3JpZ2h0JyBoYXZlIHRoZSB2YWx1ZSAnYXV0bycsIHRoZW4gaWYgdGhlICdkaXJl
Y3Rpb24nIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGVzdGFibGlzaGluZyB0aGUgc3RhdGljLXBv
c2l0aW9uIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ2x0cicsCisgICAgLy8gICBzZXQgJ2xlZnQnIHRv
IHRoZSBzdGF0aWMgcG9zaXRpb247IGVsc2UgaWYgJ2RpcmVjdGlvbicgaXMgJ3J0bCcsIHNldCAn
cmlnaHQnIHRvIHRoZSBzdGF0aWMgcG9zaXRpb24uCisgICAgLy8gMi4gSWYgJ2xlZnQnIG9yICdy
aWdodCcgYXJlICdhdXRvJywgcmVwbGFjZSBhbnkgJ2F1dG8nIG9uICdtYXJnaW4tbGVmdCcgb3Ig
J21hcmdpbi1yaWdodCcgd2l0aCAnMCcuCisgICAgLy8gMy4gSWYgYXQgdGhpcyBwb2ludCBib3Ro
ICdtYXJnaW4tbGVmdCcgYW5kICdtYXJnaW4tcmlnaHQnIGFyZSBzdGlsbCAnYXV0bycsIHNvbHZl
IHRoZSBlcXVhdGlvbiB1bmRlciB0aGUgZXh0cmEgY29uc3RyYWludCB0aGF0IHRoZSB0d28gbWFy
Z2lucyBtdXN0IGdldCBlcXVhbCB2YWx1ZXMsCisgICAgLy8gICB1bmxlc3MgdGhpcyB3b3VsZCBt
YWtlIHRoZW0gbmVnYXRpdmUsIGluIHdoaWNoIGNhc2Ugd2hlbiB0aGUgZGlyZWN0aW9uIG9mIHRo
ZSBjb250YWluaW5nIGJsb2NrIGlzICdsdHInICgncnRsJyksIHNldCAnbWFyZ2luLWxlZnQnICgn
bWFyZ2luLXJpZ2h0JykgdG8gemVybyBhbmQKKyAgICAvLyAgIHNvbHZlIGZvciAnbWFyZ2luLXJp
Z2h0JyAoJ21hcmdpbi1sZWZ0JykuCisgICAgLy8gNC4gSWYgYXQgdGhpcyBwb2ludCB0aGVyZSBp
cyBhbiAnYXV0bycgbGVmdCwgc29sdmUgdGhlIGVxdWF0aW9uIGZvciB0aGF0IHZhbHVlLgorICAg
IC8vIDUuIElmIGF0IHRoaXMgcG9pbnQgdGhlIHZhbHVlcyBhcmUgb3Zlci1jb25zdHJhaW5lZCwg
aWdub3JlIHRoZSB2YWx1ZSBmb3IgZWl0aGVyICdsZWZ0JyAoaW4gY2FzZSB0aGUgJ2RpcmVjdGlv
bicgcHJvcGVydHkgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaXMgJ3J0bCcpIG9yCisgICAgLy8g
ICAncmlnaHQnIChpbiBjYXNlICdkaXJlY3Rpb24nIGlzICdsdHInKSBhbmQgc29sdmUgZm9yIHRo
YXQgdmFsdWUuCisKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRp
bmdDb250ZXh0KCk7CisgICAgYXV0byYgc3R5bGUgPSByZXBsYWNlZEJveC5zdHlsZSgpOworICAg
IGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gocmVw
bGFjZWRCb3gpOworICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29u
c3RyYWludHMubG9naWNhbFdpZHRoOworICAgIGF1dG8gaXNMZWZ0VG9SaWdodERpcmVjdGlvbiA9
IHJlcGxhY2VkQm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVj
dGlvbigpOworCisgICAgYXV0byBsZWZ0ID0gY29tcHV0ZWRWYWx1ZShzdHlsZS5sb2dpY2FsTGVm
dCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisgICAgYXV0byByaWdodCA9IGNvbXB1dGVkVmFs
dWUoc3R5bGUubG9naWNhbFJpZ2h0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKyAgICBhdXRv
IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6b250YWxN
YXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgT3B0aW9uYWw8
TGF5b3V0VW5pdD4gdXNlZE1hcmdpblN0YXJ0ID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0
YXJ0OworICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRNYXJnaW5FbmQgPSBjb21wdXRlZEhv
cml6b250YWxNYXJnaW4uZW5kOworICAgIGF1dG8gd2lkdGggPSBpbmxpbmVSZXBsYWNlZENvbnRl
bnRXaWR0aEFuZE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB2ZXJ0
aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykuY29udGVudFdpZHRo
OworICAgIGF1dG8gcGFkZGluZ0xlZnQgPSBib3hHZW9tZXRyeS5wYWRkaW5nTGVmdCgpLnZhbHVl
T3IoMCk7CisgICAgYXV0byBwYWRkaW5nUmlnaHQgPSBib3hHZW9tZXRyeS5wYWRkaW5nUmlnaHQo
KS52YWx1ZU9yKDApOworICAgIGF1dG8gYm9yZGVyTGVmdCA9IGJveEdlb21ldHJ5LmJvcmRlckxl
ZnQoKTsKKyAgICBhdXRvIGJvcmRlclJpZ2h0ID0gYm94R2VvbWV0cnkuYm9yZGVyUmlnaHQoKTsK
KworICAgIGlmICghbGVmdCAmJiAhcmlnaHQpIHsKKyAgICAgICAgLy8gIzEKKyAgICAgICAgYXV0
byBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24gPSBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb25Gb3JP
dXRPZkZsb3dQb3NpdGlvbmVkKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwor
ICAgICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikKKyAgICAgICAgICAgIGxlZnQgPSBz
dGF0aWNIb3Jpem9udGFsUG9zaXRpb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJpZ2h0
ID0gc3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uOworICAgIH0KKworICAgIGlmICghbGVmdCB8fCAh
cmlnaHQpIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAgdXNlZE1hcmdpblN0YXJ0ID0gY29tcHV0
ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCk7CisgICAgICAgIHVzZWRNYXJnaW5F
bmQgPSBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMCk7CisgICAgfQorCisg
ICAgaWYgKCF1c2VkTWFyZ2luU3RhcnQgJiYgIXVzZWRNYXJnaW5FbmQpIHsKKyAgICAgICAgLy8g
IzMKKyAgICAgICAgYXV0byBtYXJnaW5TdGFydEFuZEVuZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRo
IC0gKCpsZWZ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmln
aHQgKyBib3JkZXJSaWdodCArICpyaWdodCk7CisgICAgICAgIGlmIChtYXJnaW5TdGFydEFuZEVu
ZCA+PSAwKSB7CisgICAgICAgICAgICB1c2VkTWFyZ2luU3RhcnQgPSBtYXJnaW5TdGFydEFuZEVu
ZCAvIDI7CisgICAgICAgICAgICB1c2VkTWFyZ2luRW5kID0gdXNlZE1hcmdpblN0YXJ0OworICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGlzTGVmdFRvUmlnaHREaXJlY3Rpb24pIHsK
KyAgICAgICAgICAgICAgICB1c2VkTWFyZ2luU3RhcnQgPSAwX2x1OworICAgICAgICAgICAgICAg
IHVzZWRNYXJnaW5FbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArICp1c2VkTWFy
Z2luU3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdo
dCArIGJvcmRlclJpZ2h0ICsgKnJpZ2h0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICAgICAgdXNlZE1hcmdpbkVuZCA9IDBfbHU7CisgICAgICAgICAgICAgICAgdXNlZE1hcmdp
blN0YXJ0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyBib3JkZXJMZWZ0ICsgcGFk
ZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnVzZWRNYXJn
aW5FbmQgKyAqcmlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAg
Ly8gIzQKKyAgICBpZiAoIWxlZnQpCisgICAgICAgIGxlZnQgPSBjb250YWluaW5nQmxvY2tXaWR0
aCAtICgqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGgg
KyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFyZ2luRW5kICsgKnJpZ2h0KTsK
KworICAgIGlmICghcmlnaHQpCisgICAgICAgIHJpZ2h0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGgg
LSAoKmxlZnQgKyAqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsg
d2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArICp1c2VkTWFyZ2luRW5kKTsKKwor
ICAgIGlmICghdXNlZE1hcmdpblN0YXJ0KQorICAgICAgICB1c2VkTWFyZ2luU3RhcnQgPSBjb250
YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHdp
ZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyAqdXNlZE1hcmdpbkVuZCArICpyaWdo
dCk7CisKKyAgICBpZiAoIXVzZWRNYXJnaW5FbmQpCisgICAgICAgIHVzZWRNYXJnaW5FbmQgPSBj
b250YWluaW5nQmxvY2tXaWR0aCAtICgqbGVmdCArICp1c2VkTWFyZ2luU3RhcnQgKyBib3JkZXJM
ZWZ0ICsgcGFkZGluZ0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsg
KnJpZ2h0KTsKKworICAgIGF1dG8gYm94V2lkdGggPSAoKmxlZnQgKyAqdXNlZE1hcmdpblN0YXJ0
ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3Jk
ZXJSaWdodCArICp1c2VkTWFyZ2luRW5kICsgKnJpZ2h0KTsKKyAgICBpZiAoYm94V2lkdGggPiBj
b250YWluaW5nQmxvY2tXaWR0aCkgeworICAgICAgICAvLyAjNSBPdmVyLWNvbnN0cmFpbmVkPwor
ICAgICAgICBpZiAoaXNMZWZ0VG9SaWdodERpcmVjdGlvbikKKyAgICAgICAgICAgIHJpZ2h0ID0g
Y29udGFpbmluZ0Jsb2NrV2lkdGggLSAoKmxlZnQgKyAqdXNlZE1hcmdpblN0YXJ0ICsgYm9yZGVy
TGVmdCArIHBhZGRpbmdMZWZ0ICsgd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCAr
ICp1c2VkTWFyZ2luRW5kKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGVmdCA9IGNvbnRh
aW5pbmdCbG9ja1dpZHRoIC0gKCp1c2VkTWFyZ2luU3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGlu
Z0xlZnQgKyB3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgKnVzZWRNYXJnaW5F
bmQgKyAqcmlnaHQpOworICAgIH0KKworICAgIEFTU0VSVChsZWZ0KTsKKyAgICBBU1NFUlQocmln
aHQpOworICAgIEFTU0VSVCh1c2VkTWFyZ2luU3RhcnQpOworICAgIEFTU0VSVCh1c2VkTWFyZ2lu
RW5kKTsKKworICAgIC8vIEZvciBvdXQtb2YtZmxvdyBlbGVtZW50cyB0aGUgY29udGFpbmluZyBi
bG9jayBpcyBmb3JtZWQgYnkgdGhlIHBhZGRpbmcgZWRnZSBvZiB0aGUgYW5jZXN0b3IuCisgICAg
Ly8gQXQgdGhpcyBwb2ludCB0aGUgcG9zaXRpb25lZCB2YWx1ZSBpcyBpbiB0aGUgY29vcmRpbmF0
ZSBzeXN0ZW0gb2YgdGhlIHBhZGRpbmcgYm94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBi
b3ggY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAgYXV0byBjb250YWluaW5nQmxvY2tQYWRkaW5nVmVy
dGljYWxFZGdlID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxMZWZ0OworICAgICpsZWZ0
ICs9IGNvbnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7CisgICAgKnJpZ2h0ICs9IGNv
bnRhaW5pbmdCbG9ja1BhZGRpbmdWZXJ0aWNhbEVkZ2U7CisKKyAgICBMT0dfV0lUSF9TVFJFQU0o
Rm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1Bvc2l0aW9uXVtXaWR0aF1bTWFy
Z2luXSAtPiBvdXQtb2YtZmxvdyByZXBsYWNlZCAtPiBsZWZ0KCIgPDwgKmxlZnQgPDwgInB4KSBy
aWdodCgiICA8PCAqcmlnaHQgPDwgInB4KSB3aWR0aCgiIDw8IHdpZHRoIDw8ICJweCkgbWFyZ2lu
KCIgPDwgKnVzZWRNYXJnaW5TdGFydCA8PCAicHgsICIgIDw8ICp1c2VkTWFyZ2luRW5kIDw8ICJw
eCkgbGF5b3V0Qm94KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIpIik7CisgICAgcmV0dXJuIHsgKmxl
ZnQsICpyaWdodCwgeyB3aWR0aCwgeyAqdXNlZE1hcmdpblN0YXJ0LCAqdXNlZE1hcmdpbkVuZCB9
IH0gfTsKK30KKworQ29udGVudEhlaWdodEFuZE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnk6OmNvbXBsaWNhdGVkQ2FzZXMoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVu
VmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgY29uc3QKK3sKKyAgICBB
U1NFUlQoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpOworICAgIC8vIFRPRE86IFVzZSBjb21w
bGljYXRlZC1jYXNlIGZvciBkb2N1bWVudCByZW5kZXJlciBmb3Igbm93IChzZWUgQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd0hlaWdodEFuZE1hcmdpbikuCisgICAgQVNT
RVJUKChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkgJiYgbGF5b3V0Qm94LmlzSW5GbG93KCkg
JiYgIWxheW91dEJveC5pc092ZXJmbG93VmlzaWJsZSgpKSB8fCBsYXlvdXRCb3guaXNJbmxpbmVC
bG9ja0JveCgpIHx8IGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpIHx8IGxheW91dEJv
eC5pc0RvY3VtZW50Qm94KCkgfHwgbGF5b3V0Qm94LmlzVGFibGVCb3goKSk7CisKKyAgICAvLyAx
MC42LjYgQ29tcGxpY2F0ZWQgY2FzZXMKKyAgICAvLworICAgIC8vIEJsb2NrLWxldmVsLCBub24t
cmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgd2hlbiAnb3ZlcmZsb3cnIGRvZXMgbm90
IGNvbXB1dGUgdG8gJ3Zpc2libGUnIChleGNlcHQgaWYgdGhlICdvdmVyZmxvdycgcHJvcGVydHkn
cyB2YWx1ZSBoYXMgYmVlbiBwcm9wYWdhdGVkIHRvIHRoZSB2aWV3cG9ydCkuCisgICAgLy8gJ0lu
bGluZS1ibG9jaycsIG5vbi1yZXBsYWNlZCBlbGVtZW50cy4KKyAgICAvLyBGbG9hdGluZywgbm9u
LXJlcGxhY2VkIGVsZW1lbnRzLgorICAgIC8vCisgICAgLy8gMS4gSWYgJ21hcmdpbi10b3AnLCBv
ciAnbWFyZ2luLWJvdHRvbScgYXJlICdhdXRvJywgdGhlaXIgdXNlZCB2YWx1ZSBpcyAwLgorICAg
IC8vIDIuIElmICdoZWlnaHQnIGlzICdhdXRvJywgdGhlIGhlaWdodCBkZXBlbmRzIG9uIHRoZSBl
bGVtZW50J3MgZGVzY2VuZGFudHMgcGVyIDEwLjYuNy4KKworICAgIGF1dG8gaGVpZ2h0ID0gb3Zl
cnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5o
ZWlnaHQudmFsdWUoKSA6IGNvbXB1dGVkSGVpZ2h0KGxheW91dEJveCk7CisgICAgYXV0byBjb21w
dXRlZFZlcnRpY2FsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVkVmVydGljYWxNYXJnaW4obGF5
b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgIC8vICMxCisgICAgYXV0byB1c2Vk
VmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB7
IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVydGlj
YWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OyAKKyAgICAvLyAjMgorICAgIGlmICghaGVpZ2h0
KSB7CisgICAgICAgIEFTU0VSVChpc0hlaWdodEF1dG8obGF5b3V0Qm94KSk7CisgICAgICAgIGlm
ICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxDb250YWluZXJCb3g+
KGxheW91dEJveCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCisgICAgICAgICAgICBoZWln
aHQgPSAwX2x1OworICAgICAgICBlbHNlIGlmIChsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpICYm
ICFsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKSB7CisgICAgICAgICAg
ICBhdXRvJiBkb2N1bWVudEJveCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsK
KyAgICAgICAgICAgIGF1dG8gdG9wID0gQm94R2VvbWV0cnk6Om1hcmdpbkJveFJlY3QoZm9ybWF0
dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveCgqZG9jdW1lbnRCb3guZmlyc3RJbkZsb3dDaGls
ZCgpKSkudG9wKCk7CisgICAgICAgICAgICBhdXRvIGJvdHRvbSA9IEJveEdlb21ldHJ5OjptYXJn
aW5Cb3hSZWN0KGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goKmRvY3VtZW50Qm94
Lmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEg
c3BlY2lhbCAocXVpcms/KSBiZWhhdmlvciBzaW5jZSB0aGUgZG9jdW1lbnQgYm94IGlzIG5vdCBh
IGZvcm1hdHRpbmcgY29udGV4dCByb290IGFuZAorICAgICAgICAgICAgLy8gYWxsIHRoZSBmbG9h
dCBib3hlcyBlbmQgdXAgYXQgdGhlIElDQiBsZXZlbC4KKyAgICAgICAgICAgIGF1dG8mIGluaXRp
YWxDb250YWluaW5nQmxvY2sgPSBkb2N1bWVudEJveC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsK
KyAgICAgICAgICAgIGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250ZXh0IHsgZm9y
bWF0dGluZ0NvbnRleHQoKSwgbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZEZvcm1hdHRpbmdTdGF0
ZShpbml0aWFsQ29udGFpbmluZ0Jsb2NrKS5mbG9hdGluZ1N0YXRlKCkgfTsKKyAgICAgICAgICAg
IGlmIChhdXRvIGZsb2F0Qm90dG9tID0gZmxvYXRpbmdDb250ZXh0LmJvdHRvbSgpKSB7CisgICAg
ICAgICAgICAgICAgYm90dG9tID0gc3RkOjptYXg8TGF5b3V0VW5pdD4oKmZsb2F0Qm90dG9tLCBi
b3R0b20pOworICAgICAgICAgICAgICAgIGF1dG8gZmxvYXRUb3AgPSBmbG9hdGluZ0NvbnRleHQu
dG9wKCk7CisgICAgICAgICAgICAgICAgQVNTRVJUKGZsb2F0VG9wKTsKKyAgICAgICAgICAgICAg
ICB0b3AgPSBzdGQ6Om1pbjxMYXlvdXRVbml0PigqZmxvYXRUb3AsIHRvcCk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBoZWlnaHQgPSBib3R0b20gLSB0b3A7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICBBU1NFUlQobGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRl
eHQoKSk7CisgICAgICAgICAgICBoZWlnaHQgPSBjb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0Nv
bnRleHRSb290KGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KSk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBBU1NFUlQoaGVpZ2h0KTsKKworICAgIExPR19XSVRIX1NUUkVBTShGb3Jt
YXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbSGVpZ2h0XVtNYXJnaW5dIC0+IGZsb2F0
aW5nIG5vbi1yZXBsYWNlZCAtPiBoZWlnaHQoIiA8PCAqaGVpZ2h0IDw8ICJweCkgbWFyZ2luKCIg
PDwgdXNlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZSA8PCAicHgsICIgPDwgdXNlZFZlcnRpY2FsTWFy
Z2luLmFmdGVyIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIpOwor
ICAgIHJldHVybiBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIHsgKmhlaWdodCwgdXNlZFZlcnRpY2Fs
TWFyZ2luIH07Cit9CisKK0NvbnRlbnRXaWR0aEFuZE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6
R2VvbWV0cnk6OmZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3Qg
Qm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhv
cml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRp
b25lZCgpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKKworICAgIC8vIDEwLjMuNSBG
bG9hdGluZywgbm9uLXJlcGxhY2VkIGVsZW1lbnRzCisgICAgLy8KKyAgICAvLyAxLiBJZiAnbWFy
Z2luLWxlZnQnLCBvciAnbWFyZ2luLXJpZ2h0JyBhcmUgY29tcHV0ZWQgYXMgJ2F1dG8nLCB0aGVp
ciB1c2VkIHZhbHVlIGlzICcwJy4KKyAgICAvLyAyLiBJZiAnd2lkdGgnIGlzIGNvbXB1dGVkIGFz
ICdhdXRvJywgdGhlIHVzZWQgdmFsdWUgaXMgdGhlICJzaHJpbmstdG8tZml0IiB3aWR0aC4KKwor
ICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisKKyAgICAv
LyAjMQorICAgIGF1dG8gdXNlZEhvcml6b250YWxsTWFyZ2luID0gVXNlZEhvcml6b250YWxNYXJn
aW4geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29tcHV0ZWRI
b3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07CisgICAgLy8gIzIKKyAgICBhdXRvIHdp
ZHRoID0gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGggPyBvdmVycmlkZGVuSG9yaXpv
bnRhbFZhbHVlcy53aWR0aCA6IGNvbXB1dGVkV2lkdGgobGF5b3V0Qm94LCBob3Jpem9udGFsQ29u
c3RyYWludHMubG9naWNhbFdpZHRoKTsKKyAgICBpZiAoIXdpZHRoKQorICAgICAgICB3aWR0aCA9
IHNocmlua1RvRml0V2lkdGgobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNh
bFdpZHRoKTsKKworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwg
c3RyZWFtIDw8ICJbV2lkdGhdW01hcmdpbl0gLT4gZmxvYXRpbmcgbm9uLXJlcGxhY2VkIC0+IHdp
ZHRoKCIgPDwgKndpZHRoIDw8ICJweCkgbWFyZ2luKCIgPDwgdXNlZEhvcml6b250YWxsTWFyZ2lu
LnN0YXJ0IDw8ICJweCwgIiA8PCB1c2VkSG9yaXpvbnRhbGxNYXJnaW4uZW5kIDw8ICJweCkgLT4g
bGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIpOworICAgIHJldHVybiBDb250ZW50V2lk
dGhBbmRNYXJnaW4geyAqd2lkdGgsIHVzZWRIb3Jpem9udGFsbE1hcmdpbiB9OworfQorCitDb250
ZW50SGVpZ2h0QW5kTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6ZmxvYXRpbmdS
ZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2Vk
Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywg
Y29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMp
IGNvbnN0Cit7CisgICAgQVNTRVJUKHJlcGxhY2VkQm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkp
OworCisgICAgLy8gMTAuNi4yIElubGluZSByZXBsYWNlZCBlbGVtZW50cywgYmxvY2stbGV2ZWwg
cmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3csICdpbmxpbmUtYmxvY2snCisgICAgLy8g
cmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZsb2F0aW5nIHJlcGxhY2VkIGVs
ZW1lbnRzCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJl
YW0gPDwgIltIZWlnaHRdW01hcmdpbl0gLT4gZmxvYXRpbmcgcmVwbGFjZWQgLT4gcmVkaXJlY3Rl
ZCB0byBpbmxpbmUgcmVwbGFjZWQiKTsKKyAgICByZXR1cm4gaW5saW5lUmVwbGFjZWRDb250ZW50
SGVpZ2h0QW5kTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgfSwg
b3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKK30KKworQ29udGVudFdpZHRoQW5kTWFyZ2luIEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6ZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRXaWR0aEFu
ZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYgcmVwbGFjZWRCb3gsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpv
bnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKHJl
cGxhY2VkQm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOworCisgICAgLy8gMTAuMy42IEZsb2F0
aW5nLCByZXBsYWNlZCBlbGVtZW50cworICAgIC8vCisgICAgLy8gMS4gSWYgJ21hcmdpbi1sZWZ0
JyBvciAnbWFyZ2luLXJpZ2h0JyBhcmUgY29tcHV0ZWQgYXMgJ2F1dG8nLCB0aGVpciB1c2VkIHZh
bHVlIGlzICcwJy4KKyAgICAvLyAyLiBUaGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgnIGlzIGRldGVy
bWluZWQgYXMgZm9yIGlubGluZSByZXBsYWNlZCBlbGVtZW50cy4KKyAgICBhdXRvIGNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6b250YWxNYXJnaW4ocmVw
bGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisKKyAgICBMT0dfV0lUSF9TVFJFQU0o
Rm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW0hlaWdodF1bTWFyZ2luXSAtPiBm
bG9hdGluZyByZXBsYWNlZCAtPiByZWRpcmVjdGVkIHRvIGlubGluZSByZXBsYWNlZCIpOworICAg
IGF1dG8gdXNlZE1hcmdpbiA9IFVzZWRIb3Jpem9udGFsTWFyZ2luIHsgY29tcHV0ZWRIb3Jpem9u
dGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQu
dmFsdWVPcigwKSB9OworICAgIHJldHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1h
cmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IH0sIHsgb3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMud2lkdGgsIHVzZWRNYXJnaW4gfSk7Cit9CisKK1ZlcnRpY2FsR2Vv
bWV0cnkgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dWZXJ0aWNhbEdlb21l
dHJ5KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhv
cml6b250YWxDb25zdHJhaW50cywgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVydGljYWxD
b25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVy
dGljYWxWYWx1ZXMpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bv
c2l0aW9uZWQoKSk7CisKKyAgICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCisgICAg
ICAgIHJldHVybiBvdXRPZkZsb3dOb25SZXBsYWNlZFZlcnRpY2FsR2VvbWV0cnkoZG93bmNhc3Q8
Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMsIHZlcnRpY2Fs
Q29uc3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7CisgICAgcmV0dXJuIG91dE9m
Rmxvd1JlcGxhY2VkVmVydGljYWxHZW9tZXRyeShkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0
Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBvdmVycmlk
ZGVuVmVydGljYWxWYWx1ZXMpOworfQorCitIb3Jpem9udGFsR2VvbWV0cnkgRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5OjpvdXRPZkZsb3dIb3Jpem9udGFsR2VvbWV0cnkoY29uc3QgQm94JiBs
YXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzLCBjb25z
dCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMp
Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7CisKKyAg
ICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCisgICAgICAgIHJldHVybiBvdXRPZkZs
b3dOb25SZXBsYWNlZEhvcml6b250YWxHZW9tZXRyeShkb3duY2FzdDxDb250YWluZXJCb3g+KGxh
eW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMpOworICAgIHJldHVybiBvdXRPZkZsb3dSZXBsYWNlZEhvcml6b250YWxHZW9tZXRyeShkb3du
Y2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB2ZXJ0
aWNhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyk7Cit9CisKK0NvbnRl
bnRIZWlnaHRBbmRNYXJnaW4gRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpmbG9hdGluZ0Nv
bnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuVmVy
dGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgY29uc3QKK3sKKyAgICBBU1NF
UlQobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOworCisgICAgaWYgKCFsYXlvdXRC
b3guaXNSZXBsYWNlZEJveCgpKQorICAgICAgICByZXR1cm4gY29tcGxpY2F0ZWRDYXNlcyhsYXlv
dXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsK
KyAgICByZXR1cm4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oZG93bmNh
c3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJp
ZGRlblZlcnRpY2FsVmFsdWVzKTsKK30KKworQ29udGVudFdpZHRoQW5kTWFyZ2luIEZvcm1hdHRp
bmdDb250ZXh0OjpHZW9tZXRyeTo6ZmxvYXRpbmdDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3Qg
Qm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhv
cml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRp
b25lZCgpKTsKKworICAgIGlmICghbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKKyAgICAgICAg
cmV0dXJuIGZsb2F0aW5nTm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94
LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKTsKKyAg
ICByZXR1cm4gZmxvYXRpbmdSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihkb3duY2FzdDxS
ZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVu
SG9yaXpvbnRhbFZhbHVlcyk7Cit9CisKK0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4gRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5OjppbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4o
Y29uc3QgUmVwbGFjZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmIGhvcml6b250YWxDb25zdHJhaW50cywgT3B0aW9uYWw8VmVydGljYWxDb25zdHJhaW50cz4g
dmVydGljYWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVy
cmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Cit7CisgICAgLy8gMTAuNi4yIElubGluZSByZXBs
YWNlZCBlbGVtZW50cywgYmxvY2stbGV2ZWwgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZs
b3csICdpbmxpbmUtYmxvY2snIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93IGFuZCBm
bG9hdGluZyByZXBsYWNlZCBlbGVtZW50cworICAgIC8vCisgICAgLy8gMS4gSWYgJ21hcmdpbi10
b3AnLCBvciAnbWFyZ2luLWJvdHRvbScgYXJlICdhdXRvJywgdGhlaXIgdXNlZCB2YWx1ZSBpcyAw
LgorICAgIC8vIDIuIElmICdoZWlnaHQnIGFuZCAnd2lkdGgnIGJvdGggaGF2ZSBjb21wdXRlZCB2
YWx1ZXMgb2YgJ2F1dG8nIGFuZCB0aGUgZWxlbWVudCBhbHNvIGhhcyBhbiBpbnRyaW5zaWMgaGVp
Z2h0LCB0aGVuIHRoYXQgaW50cmluc2ljIGhlaWdodCBpcyB0aGUgdXNlZCB2YWx1ZSBvZiAnaGVp
Z2h0Jy4KKyAgICAvLyAzLiBPdGhlcndpc2UsIGlmICdoZWlnaHQnIGhhcyBhIGNvbXB1dGVkIHZh
bHVlIG9mICdhdXRvJywgYW5kIHRoZSBlbGVtZW50IGhhcyBhbiBpbnRyaW5zaWMgcmF0aW8gdGhl
biB0aGUgdXNlZCB2YWx1ZSBvZiAnaGVpZ2h0JyBpczoKKyAgICAvLyAgICAodXNlZCB3aWR0aCkg
LyAoaW50cmluc2ljIHJhdGlvKQorICAgIC8vIDQuIE90aGVyd2lzZSwgaWYgJ2hlaWdodCcgaGFz
IGEgY29tcHV0ZWQgdmFsdWUgb2YgJ2F1dG8nLCBhbmQgdGhlIGVsZW1lbnQgaGFzIGFuIGludHJp
bnNpYyBoZWlnaHQsIHRoZW4gdGhhdCBpbnRyaW5zaWMgaGVpZ2h0IGlzIHRoZSB1c2VkIHZhbHVl
IG9mICdoZWlnaHQnLgorICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgJ2hlaWdodCcgaGFzIGEgY29t
cHV0ZWQgdmFsdWUgb2YgJ2F1dG8nLCBidXQgbm9uZSBvZiB0aGUgY29uZGl0aW9ucyBhYm92ZSBh
cmUgbWV0LCB0aGVuIHRoZSB1c2VkIHZhbHVlIG9mICdoZWlnaHQnIG11c3QgYmUgc2V0IHRvCisg
ICAgLy8gICAgdGhlIGhlaWdodCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgdGhhdCBoYXMgYSAy
OjEgcmF0aW8sIGhhcyBhIGhlaWdodCBub3QgZ3JlYXRlciB0aGFuIDE1MHB4LCBhbmQgaGFzIGEg
d2lkdGggbm90IGdyZWF0ZXIgdGhhbiB0aGUgZGV2aWNlIHdpZHRoLgorCisgICAgLy8gIzEKKyAg
ICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7Cisg
ICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVkVmVydGlj
YWxNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgYXV0byB1
c2VkVmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVl
cyB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVkVmVy
dGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OworICAgIGF1dG8mIHN0eWxlID0gcmVwbGFj
ZWRCb3guc3R5bGUoKTsKKworICAgIGF1dG8gaGVpZ2h0ID0gb3ZlcnJpZGRlblZlcnRpY2FsVmFs
dWVzLmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQudmFsdWUoKSA6IGNv
bXB1dGVkSGVpZ2h0KHJlcGxhY2VkQm94LCB2ZXJ0aWNhbENvbnN0cmFpbnRzID8gdmVydGljYWxD
b25zdHJhaW50cy0+bG9naWNhbEhlaWdodCA6IFdURjo6bnVsbG9wdCk7CisgICAgYXV0byBoZWln
aHRJc0F1dG8gPSAhb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCAmJiBpc0hlaWdodEF1
dG8ocmVwbGFjZWRCb3gpOworICAgIGF1dG8gd2lkdGhJc0F1dG8gPSBzdHlsZS5sb2dpY2FsV2lk
dGgoKS5pc0F1dG8oKTsKKworICAgIGlmIChoZWlnaHRJc0F1dG8gJiYgd2lkdGhJc0F1dG8gJiYg
cmVwbGFjZWRCb3guaGFzSW50cmluc2ljSGVpZ2h0KCkpIHsKKyAgICAgICAgLy8gIzIKKyAgICAg
ICAgaGVpZ2h0ID0gcmVwbGFjZWRCb3guaW50cmluc2ljSGVpZ2h0KCk7CisgICAgfSBlbHNlIGlm
IChoZWlnaHRJc0F1dG8gJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljUmF0aW8oKSkgeworICAg
ICAgICAvLyAjMworICAgICAgICBhdXRvIHVzZWRXaWR0aCA9IGZvcm1hdHRpbmdDb250ZXh0Lmdl
b21ldHJ5Rm9yQm94KHJlcGxhY2VkQm94KS5jb250ZW50Qm94V2lkdGgoKTsKKyAgICAgICAgaGVp
Z2h0ID0gdXNlZFdpZHRoIC8gcmVwbGFjZWRCb3guaW50cmluc2ljUmF0aW8oKTsKKyAgICB9IGVs
c2UgaWYgKGhlaWdodElzQXV0byAmJiByZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNIZWlnaHQoKSkg
eworICAgICAgICAvLyAjNAorICAgICAgICBoZWlnaHQgPSByZXBsYWNlZEJveC5pbnRyaW5zaWNI
ZWlnaHQoKTsKKyAgICB9IGVsc2UgaWYgKGhlaWdodElzQXV0bykgeworICAgICAgICAvLyAjNQor
ICAgICAgICBoZWlnaHQgPSB7IDE1MCB9OworICAgIH0KKworICAgIEFTU0VSVChoZWlnaHQpOwor
CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwg
IltIZWlnaHRdW01hcmdpbl0gLT4gaW5mbG93IHJlcGxhY2VkIC0+IGhlaWdodCgiIDw8ICpoZWln
aHQgPDwgInB4KSBtYXJnaW4oIiA8PCB1c2VkVmVydGljYWxNYXJnaW4uYmVmb3JlIDw8ICJweCwg
IiA8PCB1c2VkVmVydGljYWxNYXJnaW4uYWZ0ZXIgPDwgInB4KSAtPiBsYXlvdXRCb3goIiA8PCAm
cmVwbGFjZWRCb3ggPDwgIikiKTsKKyAgICByZXR1cm4geyAqaGVpZ2h0LCB1c2VkVmVydGljYWxN
YXJnaW4gfTsKK30KKworQ29udGVudFdpZHRoQW5kTWFyZ2luIEZvcm1hdHRpbmdDb250ZXh0OjpH
ZW9tZXRyeTo6aW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVwbGFj
ZWRCb3gmIHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250
YWxDb25zdHJhaW50cywgT3B0aW9uYWw8VmVydGljYWxDb25zdHJhaW50cz4gdmVydGljYWxDb25z
dHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzKQoreworICAgIC8vIDEwLjMuMiBJbmxpbmUsIHJlcGxhY2VkIGVsZW1lbnRz
CisgICAgLy8KKyAgICAvLyBBIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJyBmb3IgJ21hcmdpbi1s
ZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBiZWNvbWVzIGEgdXNlZCB2YWx1ZSBvZiAnMCcuCisgICAg
Ly8KKyAgICAvLyAxLiBJZiAnaGVpZ2h0JyBhbmQgJ3dpZHRoJyBib3RoIGhhdmUgY29tcHV0ZWQg
dmFsdWVzIG9mICdhdXRvJyBhbmQgdGhlIGVsZW1lbnQgYWxzbyBoYXMgYW4gaW50cmluc2ljIHdp
ZHRoLCB0aGVuIHRoYXQgaW50cmluc2ljIHdpZHRoIGlzIHRoZSB1c2VkIHZhbHVlIG9mICd3aWR0
aCcuCisgICAgLy8KKyAgICAvLyAyLiBJZiAnaGVpZ2h0JyBhbmQgJ3dpZHRoJyBib3RoIGhhdmUg
Y29tcHV0ZWQgdmFsdWVzIG9mICdhdXRvJyBhbmQgdGhlIGVsZW1lbnQgaGFzIG5vIGludHJpbnNp
YyB3aWR0aCwgYnV0IGRvZXMgaGF2ZSBhbiBpbnRyaW5zaWMgaGVpZ2h0IGFuZCBpbnRyaW5zaWMg
cmF0aW87CisgICAgLy8gICAgb3IgaWYgJ3dpZHRoJyBoYXMgYSBjb21wdXRlZCB2YWx1ZSBvZiAn
YXV0bycsICdoZWlnaHQnIGhhcyBzb21lIG90aGVyIGNvbXB1dGVkIHZhbHVlLCBhbmQgdGhlIGVs
ZW1lbnQgZG9lcyBoYXZlIGFuIGludHJpbnNpYyByYXRpbzsKKyAgICAvLyAgICB0aGVuIHRoZSB1
c2VkIHZhbHVlIG9mICd3aWR0aCcgaXM6ICh1c2VkIGhlaWdodCkgKiAoaW50cmluc2ljIHJhdGlv
KQorICAgIC8vCisgICAgLy8gMy4gSWYgJ2hlaWdodCcgYW5kICd3aWR0aCcgYm90aCBoYXZlIGNv
bXB1dGVkIHZhbHVlcyBvZiAnYXV0bycgYW5kIHRoZSBlbGVtZW50IGhhcyBhbiBpbnRyaW5zaWMg
cmF0aW8gYnV0IG5vIGludHJpbnNpYyBoZWlnaHQgb3Igd2lkdGgsCisgICAgLy8gICAgdGhlbiB0
aGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgnIGlzIHVuZGVmaW5lZCBpbiBDU1MgMi4yLiBIb3dldmVy
LCBpdCBpcyBzdWdnZXN0ZWQgdGhhdCwgaWYgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0aCBk
b2VzIG5vdCBpdHNlbGYgZGVwZW5kIG9uIHRoZSByZXBsYWNlZAorICAgIC8vICAgIGVsZW1lbnQn
cyB3aWR0aCwgdGhlbiB0aGUgdXNlZCB2YWx1ZSBvZiAnd2lkdGgnIGlzIGNhbGN1bGF0ZWQgZnJv
bSB0aGUgY29uc3RyYWludCBlcXVhdGlvbiB1c2VkIGZvciBibG9jay1sZXZlbCwgbm9uLXJlcGxh
Y2VkIGVsZW1lbnRzIGluIG5vcm1hbCBmbG93LgorICAgIC8vCisgICAgLy8gNC4gT3RoZXJ3aXNl
LCBpZiAnd2lkdGgnIGhhcyBhIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJywgYW5kIHRoZSBlbGVt
ZW50IGhhcyBhbiBpbnRyaW5zaWMgd2lkdGgsIHRoZW4gdGhhdCBpbnRyaW5zaWMgd2lkdGggaXMg
dGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJy4KKyAgICAvLworICAgIC8vIDUuIE90aGVyd2lzZSwg
aWYgJ3dpZHRoJyBoYXMgYSBjb21wdXRlZCB2YWx1ZSBvZiAnYXV0bycsIGJ1dCBub25lIG9mIHRo
ZSBjb25kaXRpb25zIGFib3ZlIGFyZSBtZXQsIHRoZW4gdGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRo
JyBiZWNvbWVzIDMwMHB4LgorICAgIC8vICAgIElmIDMwMHB4IGlzIHRvbyB3aWRlIHRvIGZpdCB0
aGUgZGV2aWNlLCBVQXMgc2hvdWxkIHVzZSB0aGUgd2lkdGggb2YgdGhlIGxhcmdlc3QgcmVjdGFu
Z2xlIHRoYXQgaGFzIGEgMjoxIHJhdGlvIGFuZCBmaXRzIHRoZSBkZXZpY2UgaW5zdGVhZC4KKwor
ICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6OmNvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbihyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKworICAg
IGF1dG8gdXNlZE1hcmdpblN0YXJ0ID0gWyZdIHsKKyAgICAgICAgaWYgKG92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzLm1hcmdpbikKKyAgICAgICAgICAgIHJldHVybiBvdmVycmlkZGVuSG9yaXpv
bnRhbFZhbHVlcy5tYXJnaW4tPnN0YXJ0OworICAgICAgICByZXR1cm4gY29tcHV0ZWRIb3Jpem9u
dGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMF9sdSk7CisgICAgfTsKKworICAgIGF1dG8gdXNlZE1h
cmdpbkVuZCA9IFsmXSB7CisgICAgICAgIGlmIChvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy5t
YXJnaW4pCisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMubWFy
Z2luLT5lbmQ7CisgICAgICAgIHJldHVybiBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZh
bHVlT3IoMF9sdSk7CisgICAgfTsKKworICAgIGF1dG8gd2lkdGggPSBvdmVycmlkZGVuSG9yaXpv
bnRhbFZhbHVlcy53aWR0aCA/IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoIDogY29t
cHV0ZWRXaWR0aChyZXBsYWNlZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0
aCk7CisgICAgYXV0byBoZWlnaHRJc0F1dG8gPSBpc0hlaWdodEF1dG8ocmVwbGFjZWRCb3gpOwor
ICAgIGF1dG8gaGVpZ2h0ID0gY29tcHV0ZWRIZWlnaHQocmVwbGFjZWRCb3gsIHZlcnRpY2FsQ29u
c3RyYWludHMgPyB2ZXJ0aWNhbENvbnN0cmFpbnRzLT5sb2dpY2FsSGVpZ2h0IDogV1RGOjpudWxs
b3B0KTsKKworICAgIGlmICghd2lkdGggJiYgaGVpZ2h0SXNBdXRvICYmIHJlcGxhY2VkQm94Lmhh
c0ludHJpbnNpY1dpZHRoKCkpIHsKKyAgICAgICAgLy8gIzEKKyAgICAgICAgd2lkdGggPSByZXBs
YWNlZEJveC5pbnRyaW5zaWNXaWR0aCgpOworICAgIH0gZWxzZSBpZiAoKCF3aWR0aCAmJiBoZWln
aHRJc0F1dG8gJiYgIXJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1dpZHRoKCkgJiYgcmVwbGFjZWRC
b3guaGFzSW50cmluc2ljSGVpZ2h0KCkgJiYgcmVwbGFjZWRCb3guaGFzSW50cmluc2ljUmF0aW8o
KSkKKyAgICAgICAgfHwgKCF3aWR0aCAmJiBoZWlnaHQgJiYgcmVwbGFjZWRCb3guaGFzSW50cmlu
c2ljUmF0aW8oKSkpIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAgd2lkdGggPSBoZWlnaHQudmFs
dWVPcihyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNIZWlnaHQoKSkgKiByZXBsYWNlZEJveC5pbnRy
aW5zaWNSYXRpbygpOworICAgIH0gZWxzZSBpZiAoIXdpZHRoICYmIGhlaWdodElzQXV0byAmJiBy
ZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNSYXRpbygpICYmICFyZXBsYWNlZEJveC5oYXNJbnRyaW5z
aWNXaWR0aCgpICYmICFyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNIZWlnaHQoKSkgeworICAgICAg
ICAvLyAjMworICAgICAgICAvLyBGSVhNRTogdW5kZWZpbmVkIGJ1dCBzdXJlbHkgZG9hYmxlLgor
ICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOworICAgIH0gZWxzZSBpZiAoIXdp
ZHRoICYmIHJlcGxhY2VkQm94Lmhhc0ludHJpbnNpY1dpZHRoKCkpIHsKKyAgICAgICAgLy8gIzQK
KyAgICAgICAgd2lkdGggPSByZXBsYWNlZEJveC5pbnRyaW5zaWNXaWR0aCgpOworICAgIH0gZWxz
ZSBpZiAoIXdpZHRoKSB7CisgICAgICAgIC8vICM1CisgICAgICAgIHdpZHRoID0geyAzMDAgfTsK
KyAgICB9CisKKyAgICBBU1NFUlQod2lkdGgpOworCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1h
dHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltXaWR0aF1bTWFyZ2luXSAtPiBpbmZsb3cg
cmVwbGFjZWQgLT4gd2lkdGgoIiA8PCAqd2lkdGggPDwgInB4KSBtYXJnaW4oIiA8PCB1c2VkTWFy
Z2luU3RhcnQoKSA8PCAicHgsICIgPDwgdXNlZE1hcmdpbkVuZCgpIDw8ICJweCkgLT4gbGF5b3V0
Qm94KCIgPDwgJnJlcGxhY2VkQm94IDw8ICIpIik7CisgICAgcmV0dXJuIHsgKndpZHRoLCB7IHVz
ZWRNYXJnaW5TdGFydCgpLCB1c2VkTWFyZ2luRW5kKCkgfSB9OworfQorCitMYXlvdXRTaXplIEZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93UG9zaXRpb25lZFBvc2l0aW9uT2Zmc2V0
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6
b250YWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5GbG93
UG9zaXRpb25lZCgpKTsKKworICAgIC8vIDkuNC4zIFJlbGF0aXZlIHBvc2l0aW9uaW5nCisgICAg
Ly8KKyAgICAvLyBUaGUgJ3RvcCcgYW5kICdib3R0b20nIHByb3BlcnRpZXMgbW92ZSByZWxhdGl2
ZWx5IHBvc2l0aW9uZWQgZWxlbWVudChzKSB1cCBvciBkb3duIHdpdGhvdXQgY2hhbmdpbmcgdGhl
aXIgc2l6ZS4KKyAgICAvLyBUb3AnIG1vdmVzIHRoZSBib3hlcyBkb3duLCBhbmQgJ2JvdHRvbScg
bW92ZXMgdGhlbSB1cC4gU2luY2UgYm94ZXMgYXJlIG5vdCBzcGxpdCBvciBzdHJldGNoZWQgYXMg
YSByZXN1bHQgb2YgJ3RvcCcgb3IgJ2JvdHRvbScsIHRoZSB1c2VkIHZhbHVlcyBhcmUgYWx3YXlz
OiB0b3AgPSAtYm90dG9tLgorICAgIC8vCisgICAgLy8gMS4gSWYgYm90aCBhcmUgJ2F1dG8nLCB0
aGVpciB1c2VkIHZhbHVlcyBhcmUgYm90aCAnMCcuCisgICAgLy8gMi4gSWYgb25lIG9mIHRoZW0g
aXMgJ2F1dG8nLCBpdCBiZWNvbWVzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb3RoZXIuCisgICAgLy8g
My4gSWYgbmVpdGhlciBpcyAnYXV0bycsICdib3R0b20nIGlzIGlnbm9yZWQgKGkuZS4sIHRoZSB1
c2VkIHZhbHVlIG9mICdib3R0b20nIHdpbGwgYmUgbWludXMgdGhlIHZhbHVlIG9mICd0b3AnKS4K
KworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgYXV0byBjb250YWlu
aW5nQmxvY2tXaWR0aCA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7CisKKyAg
ICBhdXRvIHRvcCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbFRvcCgpLCBjb250YWluaW5n
QmxvY2tXaWR0aCk7CisgICAgYXV0byBib3R0b20gPSBjb21wdXRlZFZhbHVlKHN0eWxlLmxvZ2lj
YWxCb3R0b20oKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOworCisgICAgaWYgKCF0b3AgJiYgIWJv
dHRvbSkgeworICAgICAgICAvLyAjMQorICAgICAgICB0b3AgPSBib3R0b20gPSB7IDAgfTsKKyAg
ICB9IGVsc2UgaWYgKCF0b3ApIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAgdG9wID0gLSpib3R0
b207CisgICAgfSBlbHNlIGlmICghYm90dG9tKSB7CisgICAgICAgIC8vICMzCisgICAgICAgIGJv
dHRvbSA9IC0qdG9wOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vICM0CisgICAgICAgIGJvdHRv
bSA9IFdURjo6bnVsbG9wdDsKKyAgICB9CisKKyAgICAvLyBGb3IgcmVsYXRpdmVseSBwb3NpdGlv
bmVkIGVsZW1lbnRzLCAnbGVmdCcgYW5kICdyaWdodCcgbW92ZSB0aGUgYm94KGVzKSBob3Jpem9u
dGFsbHksIHdpdGhvdXQgY2hhbmdpbmcgdGhlaXIgc2l6ZS4KKyAgICAvLyAnTGVmdCcgbW92ZXMg
dGhlIGJveGVzIHRvIHRoZSByaWdodCwgYW5kICdyaWdodCcgbW92ZXMgdGhlbSB0byB0aGUgbGVm
dC4KKyAgICAvLyBTaW5jZSBib3hlcyBhcmUgbm90IHNwbGl0IG9yIHN0cmV0Y2hlZCBhcyBhIHJl
c3VsdCBvZiAnbGVmdCcgb3IgJ3JpZ2h0JywgdGhlIHVzZWQgdmFsdWVzIGFyZSBhbHdheXM6IGxl
ZnQgPSAtcmlnaHQuCisgICAgLy8KKyAgICAvLyAxLiBJZiBib3RoICdsZWZ0JyBhbmQgJ3JpZ2h0
JyBhcmUgJ2F1dG8nICh0aGVpciBpbml0aWFsIHZhbHVlcyksIHRoZSB1c2VkIHZhbHVlcyBhcmUg
JzAnIChpLmUuLCB0aGUgYm94ZXMgc3RheSBpbiB0aGVpciBvcmlnaW5hbCBwb3NpdGlvbikuCisg
ICAgLy8gMi4gSWYgJ2xlZnQnIGlzICdhdXRvJywgaXRzIHVzZWQgdmFsdWUgaXMgbWludXMgdGhl
IHZhbHVlIG9mICdyaWdodCcgKGkuZS4sIHRoZSBib3hlcyBtb3ZlIHRvIHRoZSBsZWZ0IGJ5IHRo
ZSB2YWx1ZSBvZiAncmlnaHQnKS4KKyAgICAvLyAzLiBJZiAncmlnaHQnIGlzIHNwZWNpZmllZCBh
cyAnYXV0bycsIGl0cyB1c2VkIHZhbHVlIGlzIG1pbnVzIHRoZSB2YWx1ZSBvZiAnbGVmdCcuCisg
ICAgLy8gNC4gSWYgbmVpdGhlciAnbGVmdCcgbm9yICdyaWdodCcgaXMgJ2F1dG8nLCB0aGUgcG9z
aXRpb24gaXMgb3Zlci1jb25zdHJhaW5lZCwgYW5kIG9uZSBvZiB0aGVtIGhhcyB0byBiZSBpZ25v
cmVkLgorICAgIC8vICAgIElmIHRoZSAnZGlyZWN0aW9uJyBwcm9wZXJ0eSBvZiB0aGUgY29udGFp
bmluZyBibG9jayBpcyAnbHRyJywgdGhlIHZhbHVlIG9mICdsZWZ0JyB3aW5zIGFuZCAncmlnaHQn
IGJlY29tZXMgLSdsZWZ0Jy4KKyAgICAvLyAgICBJZiAnZGlyZWN0aW9uJyBvZiB0aGUgY29udGFp
bmluZyBibG9jayBpcyAncnRsJywgJ3JpZ2h0JyB3aW5zIGFuZCAnbGVmdCcgaXMgaWdub3JlZC4K
KworICAgIGF1dG8gbGVmdCA9IGNvbXB1dGVkVmFsdWUoc3R5bGUubG9naWNhbExlZnQoKSwgY29u
dGFpbmluZ0Jsb2NrV2lkdGgpOworICAgIGF1dG8gcmlnaHQgPSBjb21wdXRlZFZhbHVlKHN0eWxl
LmxvZ2ljYWxSaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCk7CisKKyAgICBpZiAoIWxlZnQg
JiYgIXJpZ2h0KSB7CisgICAgICAgIC8vICMxCisgICAgICAgIGxlZnQgPSByaWdodCA9IHsgMCB9
OworICAgIH0gZWxzZSBpZiAoIWxlZnQpIHsKKyAgICAgICAgLy8gIzIKKyAgICAgICAgbGVmdCA9
IC0qcmlnaHQ7CisgICAgfSBlbHNlIGlmICghcmlnaHQpIHsKKyAgICAgICAgLy8gIzMKKyAgICAg
ICAgcmlnaHQgPSAtKmxlZnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gIzQKKyAgICAgICAg
YXV0byBpc0xlZnRUb1JpZ2h0RGlyZWN0aW9uID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygp
LnN0eWxlKCkuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpOworICAgICAgICBpZiAoaXNMZWZ0VG9S
aWdodERpcmVjdGlvbikKKyAgICAgICAgICAgIHJpZ2h0ID0gLSpsZWZ0OworICAgICAgICBlbHNl
CisgICAgICAgICAgICBsZWZ0ID0gV1RGOjpudWxsb3B0OworICAgIH0KKworICAgIEFTU0VSVCgh
Ym90dG9tIHx8ICp0b3AgPT0gLSpib3R0b20pOworICAgIEFTU0VSVCghbGVmdCB8fCAqbGVmdCA9
PSAtKnJpZ2h0KTsKKworICAgIGF1dG8gdG9wUG9zaXRpb25PZmZzZXQgPSAqdG9wOworICAgIGF1
dG8gbGVmdFBvc2l0aW9uT2Zmc2V0ID0gbGVmdC52YWx1ZU9yKC0qcmlnaHQpOworCisgICAgTE9H
X1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltQb3NpdGlv
bl0gLT4gcG9zaXRpb25lZCBpbmZsb3cgLT4gdG9wIG9mZnNldCgiIDw8IHRvcFBvc2l0aW9uT2Zm
c2V0IDw8ICJweCkgbGVmdCBvZmZzZXQoIiA8PCBsZWZ0UG9zaXRpb25PZmZzZXQgPDwgInB4KSBs
YXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7CisgICAgcmV0dXJuIHsgbGVmdFBvc2l0
aW9uT2Zmc2V0LCB0b3BQb3NpdGlvbk9mZnNldCB9OworfQorCitpbmxpbmUgc3RhdGljIFdyaXRp
bmdNb2RlIHVzZWRXcml0aW5nTW9kZShjb25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICAvLyBo
dHRwczovL3d3dy53My5vcmcvVFIvY3NzLXdyaXRpbmctbW9kZXMtNC8jbG9naWNhbC1kaXJlY3Rp
b24tbGF5b3V0CisgICAgLy8gRmxvdy1yZWxhdGl2ZSBkaXJlY3Rpb25zIGFyZSBjYWxjdWxhdGVk
IHdpdGggcmVzcGVjdCB0byB0aGUgd3JpdGluZyBtb2RlIG9mIHRoZSBjb250YWluaW5nIGJsb2Nr
IG9mIHRoZSBib3guCisgICAgLy8gRm9yIGlubGluZS1sZXZlbCBib3hlcywgdGhlIHdyaXRpbmcg
bW9kZSBvZiB0aGUgcGFyZW50IGJveCBpcyB1c2VkIGluc3RlYWQuCisgICAgcmV0dXJuIGxheW91
dEJveC5pc0lubGluZUxldmVsQm94KCkgPyBsYXlvdXRCb3gucGFyZW50KCkuc3R5bGUoKS53cml0
aW5nTW9kZSgpIDogbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCkud3JpdGluZ01v
ZGUoKTsKK30KKworRWRnZXMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZEJv
cmRlcihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBhdXRvJiBzdHlsZSA9IGxh
eW91dEJveC5zdHlsZSgpOworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExh
eW91dCwgc3RyZWFtIDw8ICJbQm9yZGVyXSAtPiBsYXlvdXRCb3g6ICIgPDwgJmxheW91dEJveCk7
CisgICAgcmV0dXJuIHsKKyAgICAgICAgeyBMYXlvdXRVbml0KHN0eWxlLmJvcmRlckxlZnRXaWR0
aCgpKSwgTGF5b3V0VW5pdChzdHlsZS5ib3JkZXJSaWdodFdpZHRoKCkpIH0sCisgICAgICAgIHsg
TGF5b3V0VW5pdChzdHlsZS5ib3JkZXJUb3BXaWR0aCgpKSwgTGF5b3V0VW5pdChzdHlsZS5ib3Jk
ZXJCb3R0b21XaWR0aCgpKSB9CisgICAgfTsKK30KKworT3B0aW9uYWw8RWRnZXM+IEZvcm1hdHRp
bmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRQYWRkaW5nKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBjb25zdCBMYXlvdXRVbml0IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSBjb25zdAoreworICAgIGlm
ICghbGF5b3V0Qm94LmlzUGFkZGluZ0FwcGxpY2FibGUoKSkKKyAgICAgICAgcmV0dXJuIFdURjo6
bnVsbG9wdDsKKworICAgIGF1dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgTE9H
X1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltQYWRkaW5n
XSAtPiBsYXlvdXRCb3g6ICIgPDwgJmxheW91dEJveCk7CisgICAgcmV0dXJuIEVkZ2VzIHsKKyAg
ICAgICAgeyB2YWx1ZUZvckxlbmd0aChzdHlsZS5wYWRkaW5nTGVmdCgpLCBjb250YWluaW5nQmxv
Y2tXaWR0aCksIHZhbHVlRm9yTGVuZ3RoKHN0eWxlLnBhZGRpbmdSaWdodCgpLCBjb250YWluaW5n
QmxvY2tXaWR0aCkgfSwKKyAgICAgICAgeyB2YWx1ZUZvckxlbmd0aChzdHlsZS5wYWRkaW5nVG9w
KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgdmFsdWVGb3JMZW5ndGgoc3R5bGUucGFkZGluZ0Jv
dHRvbSgpLCBjb250YWluaW5nQmxvY2tXaWR0aCkgfQorICAgIH07Cit9CisKK0NvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkSG9yaXpv
bnRhbE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIGNvbnN0Cit7CisgICAgYXV0byYgc3R5bGUgPSBs
YXlvdXRCb3guc3R5bGUoKTsKKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpv
bnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKKyAgICBpZiAoaXNIb3Jpem9udGFsV3JpdGlu
Z01vZGUodXNlZFdyaXRpbmdNb2RlKGxheW91dEJveCkpKQorICAgICAgICByZXR1cm4geyBjb21w
dXRlZFZhbHVlKHN0eWxlLm1hcmdpbkxlZnQoKSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpLCBjb21w
dXRlZFZhbHVlKHN0eWxlLm1hcmdpblJpZ2h0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSB9Owor
ICAgIHJldHVybiB7IGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luVG9wKCksIGNvbnRhaW5pbmdC
bG9ja1dpZHRoKSwgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5Cb3R0b20oKSwgY29udGFpbmlu
Z0Jsb2NrV2lkdGgpIH07Cit9CisKK0NvbXB1dGVkVmVydGljYWxNYXJnaW4gRm9ybWF0dGluZ0Nv
bnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZFZlcnRpY2FsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0
Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykg
Y29uc3QKK3sKKyAgICBhdXRvJiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOworICAgIGF1dG8g
Y29udGFpbmluZ0Jsb2NrV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRo
OworICAgIGlmIChpc0hvcml6b250YWxXcml0aW5nTW9kZSh1c2VkV3JpdGluZ01vZGUobGF5b3V0
Qm94KSkpCisgICAgICAgIHJldHVybiB7IGNvbXB1dGVkVmFsdWUoc3R5bGUubWFyZ2luVG9wKCks
IGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgY29tcHV0ZWRWYWx1ZShzdHlsZS5tYXJnaW5Cb3R0b20o
KSwgY29udGFpbmluZ0Jsb2NrV2lkdGgpIH07CisgICAgcmV0dXJuIHsgY29tcHV0ZWRWYWx1ZShz
dHlsZS5tYXJnaW5MZWZ0KCksIGNvbnRhaW5pbmdCbG9ja1dpZHRoKSwgY29tcHV0ZWRWYWx1ZShz
dHlsZS5tYXJnaW5SaWdodCgpLCBjb250YWluaW5nQmxvY2tXaWR0aCkgfTsKK30KKworRm9ybWF0
dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgRm9ybWF0dGluZ0NvbnRleHQ6
Okdlb21ldHJ5Ojpjb25zdHJhaW5CeU1pbk1heFdpZHRoKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGludHJpbnNpY1dpZHRoKSBjb25zdAoreworICAgIGF1
dG8mIHN0eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7CisgICAgYXV0byBtaW5XaWR0aCA9IGZpeGVk
VmFsdWUoc3R5bGUubG9naWNhbE1pbldpZHRoKCkpOworICAgIGF1dG8gbWF4V2lkdGggPSBmaXhl
ZFZhbHVlKHN0eWxlLmxvZ2ljYWxNYXhXaWR0aCgpKTsKKyAgICBpZiAoIW1pbldpZHRoICYmICFt
YXhXaWR0aCkKKyAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoOworCisgICAgaWYgKG1heFdp
ZHRoKSB7CisgICAgICAgIGludHJpbnNpY1dpZHRoLm1pbmltdW0gPSBzdGQ6Om1pbigqbWF4V2lk
dGgsIGludHJpbnNpY1dpZHRoLm1pbmltdW0pOworICAgICAgICBpbnRyaW5zaWNXaWR0aC5tYXhp
bXVtID0gc3RkOjptaW4oKm1heFdpZHRoLCBpbnRyaW5zaWNXaWR0aC5tYXhpbXVtKTsKKyAgICB9
CisKKyAgICBpZiAobWluV2lkdGgpIHsKKyAgICAgICAgaW50cmluc2ljV2lkdGgubWluaW11bSA9
IHN0ZDo6bWF4KCptaW5XaWR0aCwgaW50cmluc2ljV2lkdGgubWluaW11bSk7CisgICAgICAgIGlu
dHJpbnNpY1dpZHRoLm1heGltdW0gPSBzdGQ6Om1heCgqbWluV2lkdGgsIGludHJpbnNpY1dpZHRo
Lm1heGltdW0pOworICAgIH0KKworICAgIEFTU0VSVChpbnRyaW5zaWNXaWR0aC5taW5pbXVtIDw9
IGludHJpbnNpY1dpZHRoLm1heGltdW0pOworICAgIHJldHVybiBpbnRyaW5zaWNXaWR0aDsKK30K
KworRm9ybWF0dGluZ0NvbnRleHQ6OkNvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudCBGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudChj
b25zdCBDb250YWluZXJCb3gmIGNvbnRhaW5lckJveCkKK3sKKyAgICBhdXRvJiBib3hHZW9tZXRy
eSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goY29udGFpbmVyQm94KTsKKyAg
ICByZXR1cm4geworICAgICAgICB7IGJveEdlb21ldHJ5LnBhZGRpbmdCb3hMZWZ0KCksIGJveEdl
b21ldHJ5LnBhZGRpbmdCb3hXaWR0aCgpIH0sCisgICAgICAgIHsgYm94R2VvbWV0cnkucGFkZGlu
Z0JveFRvcCgpLCBib3hHZW9tZXRyeS5wYWRkaW5nQm94SGVpZ2h0KCkgfSwKKyAgICAgICAgYm94
R2VvbWV0cnkuY29udGVudEJveFdpZHRoKCkgfTsKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkNv
bnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNv
bnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb25zdCBDb250YWluZXJCb3gmIGNvbnRhaW5lckJv
eCwgT3B0aW9uYWw8RXNjYXBlUmVhc29uPiBlc2NhcGVSZWFzb24pCit7CisgICAgYXV0byYgYm94
R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGNvbnRhaW5lckJv
eCwgZXNjYXBlUmVhc29uKTsKKyAgICByZXR1cm4geyB7IGJveEdlb21ldHJ5LmNvbnRlbnRCb3hM
ZWZ0KCksIGJveEdlb21ldHJ5LmNvbnRlbnRCb3hXaWR0aCgpIH0sIHsgYm94R2VvbWV0cnkuY29u
dGVudEJveFRvcCgpLCBjb21wdXRlZEhlaWdodChjb250YWluZXJCb3gpIH0gfTsKK30KKworfQor
fQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjgyMTFiMGRjNjMwY2EyMzk3YmFiMzg0Zjk4MDgzMDMxOTFmMmJkMGEKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL0Zvcm1hdHRp
bmdDb250ZXh0UXVpcmtzLmNwcApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFC
TEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkxheW91dEJveC5oIgor
I2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENv
bnRhaW5pbmdCbG9jay5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0
IHsKKworTGF5b3V0VW5pdCBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpoZWlnaHRWYWx1ZU9m
TmVhcmVzdENvbnRhaW5pbmdCbG9ja1dpdGhGaXhlZEhlaWdodChjb25zdCBCb3gmIGxheW91dEJv
eCkKK3sKKyAgICAvLyBJbiBxdWlya3MgbW9kZSwgd2UgZ28gYW5kIHRyYXZlcnMgdGhlIGNvbnRh
aW5pbmcgYmxvY2sgY2hhaW4gdG8gZmluZCBhIGJsb2NrIGxldmVsIGJveCB3aXRoIGZpeGVkIGhl
aWdodCB2YWx1ZSwgZXZlbiBpZiBpdCBtZWFucyBsZWF2aW5nCisgICAgLy8gdGhlIGN1cnJlbnQg
Zm9ybWF0dGluZyBjb250ZXh0LiBGSVhNRTogc3VyZWx5IHdlIG5lZWQgdG8gZG8gc29tZSB0cmlj
a3MgaGVyZSB3aGVuIGJsb2NrIGRpcmVjdGlvbiBzdXBwb3J0IGlzIGFkZGVkLgorICAgIGF1dG8m
IGZvcm1hdHRpbmdDb250ZXh0ID0gdGhpcy0+Zm9ybWF0dGluZ0NvbnRleHQoKTsKKyAgICBhdXRv
KiBjb250YWluaW5nQmxvY2sgPSAmbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOworICAgIExh
eW91dFVuaXQgYm9keUFuZERvY3VtZW50VmVydGljYWxNYXJnaW5QYWRkaW5nQW5kQm9yZGVyOwor
ICAgIHdoaWxlIChjb250YWluaW5nQmxvY2spIHsKKyAgICAgICAgYXV0byBjb250YWluaW5nQmxv
Y2tIZWlnaHQgPSBjb250YWluaW5nQmxvY2stPnN0eWxlKCkubG9naWNhbEhlaWdodCgpOworICAg
ICAgICBpZiAoY29udGFpbmluZ0Jsb2NrSGVpZ2h0LmlzRml4ZWQoKSkKKyAgICAgICAgICAgIHJl
dHVybiBMYXlvdXRVbml0KGNvbnRhaW5pbmdCbG9ja0hlaWdodC52YWx1ZSgpIC0gYm9keUFuZERv
Y3VtZW50VmVydGljYWxNYXJnaW5QYWRkaW5nQW5kQm9yZGVyKTsKKworICAgICAgICAvLyBJZiB0
aGUgb25seSBmaXhlZCB2YWx1ZSBib3ggd2UgZmluZCBpcyB0aGUgSUNCLCB0aGVuIGlnbm9yZSB0
aGUgYm9keSBhbmQgdGhlIGRvY3VtZW50ICh2ZXJ0aWNhbCkgbWFyZ2luLCBwYWRkaW5nIGFuZCBi
b3JkZXIuIFNvIG11Y2ggcXVpcmtpbmVzcy4KKyAgICAgICAgLy8gLWFuZCBpdCdzIHRvdGFsbHkg
aW5zYW5lIGJlY2F1c2Ugbm93IHdlIGZyZWVseSB0cmF2ZWwgYWNyb3NzIGZvcm1hdHRpbmcgY29u
dGV4dCBib3VuZGFyaWVzIGFuZCBjb21wdXRlZCBtYXJnaW5zIGFyZSBub25leGlzdGVudC4KKyAg
ICAgICAgaWYgKGNvbnRhaW5pbmdCbG9jay0+aXNCb2R5Qm94KCkgfHwgY29udGFpbmluZ0Jsb2Nr
LT5pc0RvY3VtZW50Qm94KCkpIHsKKworICAgICAgICAgICAgYXV0byBnZW9tZXRyeSA9IGZvcm1h
dHRpbmdDb250ZXh0Lmdlb21ldHJ5KCk7CisgICAgICAgICAgICBhdXRvIGhvcml6b250YWxDb25z
dHJhaW50cyA9IGdlb21ldHJ5LmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjb250YWluaW5n
QmxvY2stPmNvbnRhaW5pbmdCbG9jaygpLCBGb3JtYXR0aW5nQ29udGV4dDo6RXNjYXBlUmVhc29u
OjpGaW5kRml4ZWRIZWlnaHRBbmNlc3RvclF1aXJrKS5ob3Jpem9udGFsOworICAgICAgICAgICAg
YXV0byB2ZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkVmVydGljYWxNYXJnaW4oKmNv
bnRhaW5pbmdCbG9jaywgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKworICAgICAgICAgICAgYXV0
byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveCgqY29udGFp
bmluZ0Jsb2NrLCBGb3JtYXR0aW5nQ29udGV4dDo6RXNjYXBlUmVhc29uOjpGaW5kRml4ZWRIZWln
aHRBbmNlc3RvclF1aXJrKTsKKyAgICAgICAgICAgIGF1dG8gdmVydGljYWxQYWRkaW5nID0gYm94
R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nQm90
dG9tKCkudmFsdWVPcigwKTsKKyAgICAgICAgICAgIGF1dG8gdmVydGljYWxCb3JkZXIgPSBib3hH
ZW9tZXRyeS5ib3JkZXJUb3AoKSArIGJveEdlb21ldHJ5LmJvcmRlckJvdHRvbSgpOworICAgICAg
ICAgICAgYm9keUFuZERvY3VtZW50VmVydGljYWxNYXJnaW5QYWRkaW5nQW5kQm9yZGVyICs9IHZl
cnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApICsgdmVydGljYWxNYXJnaW4uYWZ0ZXIudmFs
dWVPcigwKSArIHZlcnRpY2FsUGFkZGluZyArIHZlcnRpY2FsQm9yZGVyOworICAgICAgICB9CisK
KyAgICAgICAgaWYgKGlzPEluaXRpYWxDb250YWluaW5nQmxvY2s+KCpjb250YWluaW5nQmxvY2sp
KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNvbnRhaW5pbmdCbG9jayA9ICZjb250YWlu
aW5nQmxvY2stPmNvbnRhaW5pbmdCbG9jaygpOworICAgIH0KKyAgICAvLyBJbml0aWFsIGNvbnRh
aW5pbmcgYmxvY2sgaGFzIHRvIGhhdmUgYSBoZWlnaHQuCisgICAgcmV0dXJuIGZvcm1hdHRpbmdD
b250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveC5pbml0aWFsQ29udGFpbmluZ0Jsb2NrKCks
IEZvcm1hdHRpbmdDb250ZXh0OjpFc2NhcGVSZWFzb246OkZpbmRGaXhlZEhlaWdodEFuY2VzdG9y
UXVpcmspLmNvbnRlbnRCb3goKS5oZWlnaHQoKSAtIGJvZHlBbmREb2N1bWVudFZlcnRpY2FsTWFy
Z2luUGFkZGluZ0FuZEJvcmRlcjsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Js
b2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uMGY1NTVmODE5MzgxZTczYWYzZTE5YzAyZjM4YjBmY2YzYmQxMjA0YgotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxv
Y2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCkBAIC0wLDAgKzEsNTYzIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJsb2NrRm9ybWF0
dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQor
CisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJGbG9hdGluZ0Nv
bnRleHQuaCIKKyNpbmNsdWRlICJGbG9hdGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiSW52YWxpZGF0
aW9uU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRDaGls
ZEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCisjaW5jbHVkZSAi
TGF5b3V0Q29udGV4dC5oIgorI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2su
aCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNs
dWRlICJUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSA8d3Rm
L0lzb01hbGxvY0lubGluZXMuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9UZXh0U3RyZWFtLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09f
QUxMT0NBVEVEX0lNUEwoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCk7CisKK0Jsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ6OkJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3Jt
YXR0aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUp
CisgICAgOiBGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRp
bmdTdGF0ZSkKK3sKK30KKwordm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRJbkZs
b3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiBpbnZhbGlkYXRpb25TdGF0ZSwgY29uc3QgQ29u
c3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKK3sKKyAgICAvLyA5LjQuMSBC
bG9jayBmb3JtYXR0aW5nIGNvbnRleHRzCisgICAgLy8gSW4gYSBibG9jayBmb3JtYXR0aW5nIGNv
bnRleHQsIGJveGVzIGFyZSBsYWlkIG91dCBvbmUgYWZ0ZXIgdGhlIG90aGVyLCB2ZXJ0aWNhbGx5
LCBiZWdpbm5pbmcgYXQgdGhlIHRvcCBvZiBhIGNvbnRhaW5pbmcgYmxvY2suCisgICAgLy8gVGhl
IHZlcnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNpYmxpbmcgYm94ZXMgaXMgZGV0ZXJtaW5l
ZCBieSB0aGUgJ21hcmdpbicgcHJvcGVydGllcy4KKyAgICAvLyBWZXJ0aWNhbCBtYXJnaW5zIGJl
dHdlZW4gYWRqYWNlbnQgYmxvY2stbGV2ZWwgYm94ZXMgaW4gYSBibG9jayBmb3JtYXR0aW5nIGNv
bnRleHQgY29sbGFwc2UuCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5
b3V0LCBzdHJlYW0gPDwgIltTdGFydF0gLT4gYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IC0+IGZv
cm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKKyAgICBhdXRvJiBmb3JtYXR0aW5n
Um9vdCA9IHJvb3QoKTsKKyAgICBBU1NFUlQoZm9ybWF0dGluZ1Jvb3QuaGFzSW5GbG93T3JGbG9h
dGluZ0NoaWxkKCkpOworICAgIGF1dG8mIGZsb2F0aW5nU3RhdGUgPSBmb3JtYXR0aW5nU3RhdGUo
KS5mbG9hdGluZ1N0YXRlKCk7CisgICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0Nv
bnRleHQgeyAqdGhpcywgZmxvYXRpbmdTdGF0ZSB9OworCisgICAgTGF5b3V0UXVldWUgbGF5b3V0
UXVldWU7CisgICAgZW51bSBjbGFzcyBMYXlvdXREaXJlY3Rpb24geyBDaGlsZCwgU2libGluZyB9
OworICAgIGF1dG8gYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUgPSBbJl0gKGNvbnN0IGF1dG8mIGxh
eW91dEJveCwgYXV0byBkaXJlY3Rpb24pIHsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBMYXlv
dXREaXJlY3Rpb246OkNoaWxkKSB7CisgICAgICAgICAgICBpZiAoIWlzPENvbnRhaW5lckJveD4o
bGF5b3V0Qm94KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBm
b3IgKGF1dG8qIGNoaWxkID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0
SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0SW5GbG93
T3JGbG9hdGluZ1NpYmxpbmcoKSkgeworICAgICAgICAgICAgICAgIGlmICghaW52YWxpZGF0aW9u
U3RhdGUubmVlZHNMYXlvdXQoKmNoaWxkKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICAgICAgbGF5b3V0UXVldWUuYXBwZW5kKGNoaWxkKTsKKyAgICAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gTGF5b3V0RGlyZWN0aW9u
OjpTaWJsaW5nKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8qIG5leHRTaWJsaW5nID0gbGF5b3V0
Qm94Lm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpOyBuZXh0U2libGluZzsgbmV4dFNpYmxp
bmcgPSBuZXh0U2libGluZy0+bmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKKyAgICAg
ICAgICAgICAgICBpZiAoIWludmFsaWRhdGlvblN0YXRlLm5lZWRzTGF5b3V0KCpuZXh0U2libGlu
ZykpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGxheW91
dFF1ZXVlLmFwcGVuZChuZXh0U2libGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
OworCisgICAgYXV0byBjb25zdHJhaW50c0ZvckxheW91dEJveCA9IFsmXSAoY29uc3QgYXV0byYg
bGF5b3V0Qm94KSB7CisgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxheW91dEJveC5j
b250YWluaW5nQmxvY2soKTsKKyAgICAgICAgcmV0dXJuICZjb250YWluaW5nQmxvY2sgPT0gJmZv
cm1hdHRpbmdSb290ID8gY29uc3RyYWludHMgOiBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5G
bG93Q29udGVudChjb250YWluaW5nQmxvY2spOworICAgIH07CisKKyAgICAvLyBUaGlzIGlzIGEg
cG9zdC1vcmRlciB0cmVlIHRyYXZlcnNhbCBsYXlvdXQuCisgICAgLy8gVGhlIHJvb3QgY29udGFp
bmVyIGxheW91dCBpcyBkb25lIGluIHRoZSBmb3JtYXR0aW5nIGNvbnRleHQgaXQgbGl2ZXMgaW4s
IG5vdCB0aGF0IG9uZSBpdCBjcmVhdGVzLCBzbyBsZXQncyBzdGFydCB3aXRoIHRoZSBmaXJzdCBj
aGlsZC4KKyAgICBhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShmb3JtYXR0aW5nUm9vdCwgTGF5b3V0
RGlyZWN0aW9uOjpDaGlsZCk7CisgICAgLy8gMS4gR28gYWxsIHRoZSB3YXkgZG93biB0byB0aGUg
bGVhZiBub2RlCisgICAgLy8gMi4gQ29tcHV0ZSBzdGF0aWMgcG9zaXRpb24gYW5kIHdpZHRoIGFz
IHdlIHRyYXZlcnNlIGRvd24KKyAgICAvLyAzLiBBcyB3ZSBjbGltYiBiYWNrIG9uIHRoZSB0cmVl
LCBjb21wdXRlIGhlaWdodCBhbmQgZmluaWFsaXplIHBvc2l0aW9uCisgICAgLy8gKEFueSBzdWJ0
cmVlcyB3aXRoIG5ldyBmb3JtYXR0aW5nIGNvbnRleHRzIG5lZWQgdG8gbGF5b3V0IHN5bmNocm9u
b3VzbHkpCisgICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8g
VHJhdmVyc2UgZG93biBvbiB0aGUgZGVzY2VuZGFudHMgYW5kIGNvbXB1dGUgd2lkdGgvc3RhdGlj
IHBvc2l0aW9uIHVudGlsIHdlIGZpbmQgYSBsZWFmIG5vZGUuCisgICAgICAgIHdoaWxlICh0cnVl
KSB7CisgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSAqbGF5b3V0UXVldWUubGFzdCgpOwor
ICAgICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyA9IGNvbnN0cmFpbnRz
Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7CisKKyAgICAgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQ
YWRkaW5nKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9yaXpvbnRhbCk7
CisgICAgICAgICAgICBjb21wdXRlU3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIGNv
bnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLnZlcnRpY2FsKTsKKyAgICAgICAgICAgIGNvbXB1dGVX
aWR0aEFuZE1hcmdpbihmbG9hdGluZ0NvbnRleHQsIGxheW91dEJveCwgeyBjb25zdHJhaW50cywg
Y29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMgfSk7CisgICAgICAgICAgICBjb21wdXRlU3RhdGlj
SG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMu
aG9yaXpvbnRhbCk7CisgICAgICAgICAgICBjb21wdXRlUG9zaXRpb25Ub0F2b2lkRmxvYXRzKGZs
b2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCB7IGNvbnN0cmFpbnRzLCBjb250YWluaW5nQmxvY2tD
b25zdHJhaW50cyB9KTsKKworICAgICAgICAgICAgaWYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zv
cm1hdHRpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXM8Q29udGFpbmVyQm94
PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZs
b3dPckZsb2F0aW5nQ2hpbGQoKSkgeworICAgICAgICAgICAgICAgICAgICBhdXRvJiBjb250YWlu
ZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7CisgICAgICAgICAgICAg
ICAgICAgIGlmIChjb250YWluZXJCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJRkNzIGluaGVyaXQgZmxvYXRzIGZy
b20gcGFyZW50IEZDcy4gV2UgbmVlZCBmaW5hbCB2ZXJ0aWNhbCBwb3NpdGlvbiB0byBmaW5kIGlu
dHJ1ZGluZyBmbG9hdHMuCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb21wdXRlVmVydGlj
YWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhjb250YWluZXJCb3gsIHsgY29uc3RyYWludHMs
IGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzIH0pOworICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgIC8vIExheW91dCB0aGUgaW5mbG93IGRlc2NlbmRhbnRzIG9mIHRo
aXMgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QuCisgICAgICAgICAgICAgICAgICAgIGF1dG8gZm9y
bWF0dGluZ0NvbnRleHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChj
b250YWluZXJCb3gsIGxheW91dFN0YXRlKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29u
dGFpbmVyQm94LmlzVGFibGVXcmFwcGVyQm94KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBk
b3duY2FzdDxUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0PigqZm9ybWF0dGluZ0Nv
bnRleHQpLnNldEhvcml6b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxvYXRzKGNvbnRhaW5pbmdC
bG9ja0NvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAgICAgICAgICAgICBmb3JtYXR0
aW5nQ29udGV4dC0+bGF5b3V0SW5GbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0
cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgaWYgKCFhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShsYXlvdXRCb3gsIExheW91dERpcmVj
dGlvbjo6Q2hpbGQpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gQ2xpbWIgYmFjayBvbiB0aGUgYW5jZXN0b3JzIGFuZCBjb21wdXRlIGhlaWdodC9maW5h
bCBwb3NpdGlvbi4KKyAgICAgICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9ICpsYXlvdXRRdWV1ZS50YWtlTGFzdCgpOworICAg
ICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzRm9y
TGF5b3V0Qm94KGxheW91dEJveCk7CisKKyAgICAgICAgICAgIC8vIEFsbCBpbmZsb3cgZGVzY2Vu
ZGFudHMgKGlmIHRoZXJlIGFyZSBhbnkpIGFyZSBsYWlkIG91dCBieSBub3cuIExldCdzIGNvbXB1
dGUgdGhlIGJveCdzIGhlaWdodCBhbmQgdmVydGljYWwgbWFyZ2luLgorICAgICAgICAgICAgY29t
cHV0ZUhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRz
KTsKKyAgICAgICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAg
ICAgICAgICAgICAgICBmbG9hdGluZ1N0YXRlLmFwcGVuZChmbG9hdGluZ0NvbnRleHQudG9GbG9h
dEl0ZW0obGF5b3V0Qm94KSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAv
LyBBZGp1c3QgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG5vdyB0aGF0IHdlJ3ZlIGdvdCBmaW5hbCBt
YXJnaW4gdmFsdWVzIGZvciBub24tZmxvYXQgYXZvaWRlciBib3hlcy4KKyAgICAgICAgICAgICAg
ICAvLyBGbG9hdCBhdm9pZGVycyBoYXZlIHByZS1jb21wdXRlZCB2ZXJ0aWNhbCBwb3NpdGlvbnMg
d2hlbiBmbG9hdHMgYXJlIHByZXNlbnQuCisgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCb3gu
aXNGbG9hdEF2b2lkZXIoKSB8fCBmbG9hdGluZ0NvbnRleHQuaXNFbXB0eSgpKSB7CisgICAgICAg
ICAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1hdHRpbmdTdGF0
ZSgpOworICAgICAgICAgICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdT
dGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOworICAgICAgICAgICAgICAgICAgICBib3hHZW9t
ZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGxheW91dEJveCwg
Zm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpLCBjb250YWluaW5n
QmxvY2tDb25zdHJhaW50cy52ZXJ0aWNhbCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGF1dG8gZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCA9IGxh
eW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCk7IAorICAgICAgICAgICAgaWYg
KGVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3cg
dGhhdCB3ZSBjb21wdXRlZCB0aGUgYm94J3MgaGVpZ2h0LCB3ZSBjYW4gbGF5b3V0IHRoZSBvdXQt
b2YtZmxvdyBkZXNjZW5kYW50cy4KKyAgICAgICAgICAgICAgICBpZiAoaXM8Q29udGFpbmVyQm94
PihsYXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNDaGls
ZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5lckJveCA9IGRvd25jYXN0
PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0Q29u
dGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmVyQm94LCBsYXlvdXRTdGF0ZSgp
KS0+bGF5b3V0T3V0T2ZGbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5j
b25zdHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFlc3RhYmxpc2hlc0Zvcm1h
dHRpbmdDb250ZXh0ICYmIGlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkKKyAgICAgICAgICAg
ICAgICBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihkb3duY2FzdDxDb250YWluZXJCb3g+
KGxheW91dEJveCksIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmhvcml6b250YWwpOworCisg
ICAgICAgICAgICBpZiAoYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUobGF5b3V0Qm94LCBMYXlvdXRE
aXJlY3Rpb246OlNpYmxpbmcpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgfQorICAgIC8vIFBsYWNlIHRoZSBpbmZsb3cgcG9zaXRpb25lZCBjaGlsZHJlbi4KKyAgICBw
bGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWludHMu
aG9yaXpvbnRhbCk7CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0
LCBzdHJlYW0gPDwgIltFbmRdIC0+IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCAtPiBmb3JtYXR0
aW5nIHJvb3QoIiA8PCAmcm9vdCgpIDw8ICIpIik7Cit9CisKK0xheW91dFVuaXQgQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdAoreworICAgIC8vIDEwLjYu
NyAnQXV0bycgaGVpZ2h0cyBmb3IgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHJvb3RzCisKKyAg
ICAvLyBJZiBpdCBoYXMgYmxvY2stbGV2ZWwgY2hpbGRyZW4sIHRoZSBoZWlnaHQgaXMgdGhlIGRp
c3RhbmNlIGJldHdlZW4gdGhlIHRvcCBtYXJnaW4tZWRnZSBvZiB0aGUgdG9wbW9zdCBibG9jay1s
ZXZlbAorICAgIC8vIGNoaWxkIGJveCBhbmQgdGhlIGJvdHRvbSBtYXJnaW4tZWRnZSBvZiB0aGUg
Ym90dG9tbW9zdCBibG9jay1sZXZlbCBjaGlsZCBib3guCisKKyAgICAvLyBJbiBhZGRpdGlvbiwg
aWYgdGhlIGVsZW1lbnQgaGFzIGFueSBmbG9hdGluZyBkZXNjZW5kYW50cyB3aG9zZSBib3R0b20g
bWFyZ2luIGVkZ2UgaXMgYmVsb3cgdGhlIGVsZW1lbnQncyBib3R0b20gY29udGVudCBlZGdlLAor
ICAgIC8vIHRoZW4gdGhlIGhlaWdodCBpcyBpbmNyZWFzZWQgdG8gaW5jbHVkZSB0aG9zZSBlZGdl
cy4gT25seSBmbG9hdHMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiB0aGlzIGJsb2NrIGZvcm1hdHRpbmcg
Y29udGV4dCBhcmUgdGFrZW4KKyAgICAvLyBpbnRvIGFjY291bnQsIGUuZy4sIGZsb2F0cyBpbnNp
ZGUgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGRlc2NlbmRhbnRzIG9yIG90aGVyIGZsb2F0cyBhcmUg
bm90LgorICAgIGF1dG8gdG9wID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OworICAgIGF1dG8g
Ym90dG9tID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OworICAgIGlmIChyb290KCkuaGFzSW5G
bG93Q2hpbGQoKSkgeworICAgICAgICB0b3AgPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChn
ZW9tZXRyeUZvckJveCgqcm9vdCgpLmZpcnN0SW5GbG93Q2hpbGQoKSkpLnRvcCgpOworICAgICAg
ICBib3R0b20gPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9tZXRyeUZvckJveCgqcm9v
dCgpLmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7CisgICAgfQorCisgICAgYXV0byBmbG9h
dGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhpcywgZm9ybWF0dGluZ1N0YXRlKCku
ZmxvYXRpbmdTdGF0ZSgpIH07CisgICAgaWYgKGF1dG8gZmxvYXRUb3AgPSBmbG9hdGluZ0NvbnRl
eHQudG9wKCkpIHsKKyAgICAgICAgdG9wID0gc3RkOjptaW4oKmZsb2F0VG9wLCB0b3AudmFsdWVP
cigqZmxvYXRUb3ApKTsKKyAgICAgICAgYXV0byBmbG9hdEJvdHRvbSA9ICpmbG9hdGluZ0NvbnRl
eHQuYm90dG9tKCk7CisgICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4KGZsb2F0Qm90dG9tLCBib3R0
b20udmFsdWVPcihmbG9hdEJvdHRvbSkpOworICAgIH0KKyAgICByZXR1cm4gKmJvdHRvbSAtICp0
b3A7Cit9CisKK09wdGlvbmFsPExheW91dFVuaXQ+IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OnVz
ZWRBdmFpbGFibGVXaWR0aEZvckZsb2F0QXZvaWRlcihjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZs
b2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzUGFp
ciYgY29uc3RyYWludHNQYWlyKQoreworICAgIC8vIE5vcm1hbGx5IHRoZSBhdmFpbGFibGUgd2lk
dGggZm9yIGFuIGluLWZsb3cgYmxvY2sgbGV2ZWwgYm94IGlzIHRoZSB3aWR0aCBvZiB0aGUgY29u
dGFpbmluZyBibG9jaydzIGNvbnRlbnQgYm94LgorICAgIC8vIEhvd2V2ZXIgKGFuZCBjYW4ndCBm
aW5kIGl0IGFueXdoZXJlIGluIHRoZSBzcGVjKSBub24tZmxvYXRpbmcgcG9zaXRpb25lZCBmbG9h
dCBhdm9pZGVyIGJsb2NrIGxldmVsIGJveGVzIGFyZSBjb25zdHJhaW5lZCBieSBleGlzdGluZyBm
bG9hdHMuCisgICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpKTsKKyAgICBpZiAo
ZmxvYXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAvLyBG
bG9hdCBjbGVhciBwdXNoZXMgdGhlIGJsb2NrIGxldmVsIGJveCBlaXRoZXIgYmVsb3cgdGhlIGZs
b2F0cywgb3IganVzdCBvbmUgc2lkZSBiZWxvdyBidXQgdGhlIG90aGVyIHNpZGUgY291bGQgb3Zl
cmxhcC4KKyAgICAvLyBXaGF0IGl0IG1lYW5zIGlzIHRoYXQgdGhlIHVzZWQgYXZhaWxhYmxlIHdp
ZHRoIGFsd2F5cyBtYXRjaGVzIHRoZSBjb250YWluaW5nIGJsb2NrJ3MgY29uc3RyYWludC4KKyAg
ICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKwor
ICAgIEFTU0VSVChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKKyAg
ICAvLyBWZXJ0aWNhbCBzdGF0aWMgcG9zaXRpb24gaXMgbm90IGNvbXB1dGVkIHlldCBmb3IgdGhp
cyBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdCwgc28gbGV0J3MganVzdCBwcmUtY29tcHV0ZSBpdCBm
b3Igbm93LgorICAgIHByZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0b3Jz
KGxheW91dEJveCwgY29uc3RyYWludHNQYWlyKTsKKworICAgIGF1dG8gbG9naWNhbFRvcEluRm9y
bWF0dGluZ0NvbnRleHRSb290Q29vcmRpbmF0ZSA9IFsmXSAoYXV0byYgZmxvYXRBdm9pZGVyKSB7
CisgICAgICAgIGF1dG8gdG9wID0gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChnZW9tZXRyeUZv
ckJveChmbG9hdEF2b2lkZXIpKTsKKyAgICAgICAgZm9yIChhdXRvKiBhbmNlc3RvciA9ICZmbG9h
dEF2b2lkZXIuY29udGFpbmluZ0Jsb2NrKCk7IGFuY2VzdG9yICE9ICZyb290KCk7IGFuY2VzdG9y
ID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkKKyAgICAgICAgICAgIHRvcCArPSBCb3hH
ZW9tZXRyeTo6Ym9yZGVyQm94VG9wKGdlb21ldHJ5Rm9yQm94KCphbmNlc3RvcikpOworICAgICAg
ICByZXR1cm4gdG9wOworICAgIH07CisKKyAgICBhdXRvIGZsb2F0Q29uc3RyYWludHNJbkNvbnRh
aW5pbmdCbG9ja0Nvb3JkaW5hdGUgPSBbJl0gKGF1dG8gZmxvYXRDb25zdHJhaW50cykgeworICAg
ICAgICBpZiAoIWZsb2F0Q29uc3RyYWludHMubGVmdCAmJiAhZmxvYXRDb25zdHJhaW50cy5yaWdo
dCkKKyAgICAgICAgICAgIHJldHVybiBGbG9hdGluZ0NvbnRleHQ6OkNvbnN0cmFpbnRzIHsgfTsK
KyAgICAgICAgYXV0byBvZmZzZXQgPSBMYXlvdXRTaXplIHsgfTsKKyAgICAgICAgZm9yIChhdXRv
KiBhbmNlc3RvciA9ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7IGFuY2VzdG9yICE9ICZy
b290KCk7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkKKyAgICAgICAg
ICAgIG9mZnNldCArPSB0b0xheW91dFNpemUoQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcExlZnQo
Z2VvbWV0cnlGb3JCb3goKmFuY2VzdG9yKSkpOworICAgICAgICBpZiAoZmxvYXRDb25zdHJhaW50
cy5sZWZ0KQorICAgICAgICAgICAgZmxvYXRDb25zdHJhaW50cy5sZWZ0ID0gUG9pbnRJbkNvbnRl
eHRSb290IHsgKmZsb2F0Q29uc3RyYWludHMubGVmdCAtIG9mZnNldCB9OworICAgICAgICBpZiAo
ZmxvYXRDb25zdHJhaW50cy5yaWdodCkKKyAgICAgICAgICAgIGZsb2F0Q29uc3RyYWludHMucmln
aHQgPSBQb2ludEluQ29udGV4dFJvb3QgeyAqZmxvYXRDb25zdHJhaW50cy5yaWdodCAtIG9mZnNl
dCB9OworICAgICAgICByZXR1cm4gZmxvYXRDb25zdHJhaW50czsKKyAgICB9OworCisgICAgLy8g
RklYTUU6IENoZWNrIGlmIHRoZSBub24teWV0LWNvbXB1dGVkIGhlaWdodCBhZmZlY3RzIHRoaXMg
Y29tcHV0YXRpb24gLSBhbmQgd2hldGhlciB3ZSBoYXZlIHRvIHJlc29sdmUgaXQgYXQgYSBsYXRl
ciBwb2ludC4KKyAgICBhdXRvIGxvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wSW5Gb3JtYXR0aW5nQ29u
dGV4dFJvb3RDb29yZGluYXRlKGxheW91dEJveCk7CisgICAgYXV0byBjb25zdHJhaW50cyA9IGZs
b2F0Q29uc3RyYWludHNJbkNvbnRhaW5pbmdCbG9ja0Nvb3JkaW5hdGUoZmxvYXRpbmdDb250ZXh0
LmNvbnN0cmFpbnRzKGxvZ2ljYWxUb3AsIGxvZ2ljYWxUb3ApKTsKKyAgICBpZiAoIWNvbnN0cmFp
bnRzLmxlZnQgJiYgIWNvbnN0cmFpbnRzLnJpZ2h0KQorICAgICAgICByZXR1cm4geyB9OworICAg
IC8vIFNocmluayB0aGUgYXZhaWxhYmxlIHNwYWNlIGlmIHRoZSBmbG9hdHMgYXJlIGFjdHVhbGx5
IGludHJ1ZGluZyBhdCB0aGlzIHZlcnRpY2FsIHBvc2l0aW9uLgorICAgIGF1dG8gYXZhaWxhYmxl
V2lkdGggPSBjb25zdHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250YWwubG9naWNh
bFdpZHRoOworICAgIGlmIChjb25zdHJhaW50cy5sZWZ0KQorICAgICAgICBhdmFpbGFibGVXaWR0
aCAtPSBjb25zdHJhaW50cy5sZWZ0LT54OworICAgIGlmIChjb25zdHJhaW50cy5yaWdodCkKKyAg
ICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3RkOjptYXgoMF9sdSwgY29uc3RyYWludHNQYWlyLmNv
bnRhaW5pbmdCbG9jay5ob3Jpem9udGFsLmxvZ2ljYWxSaWdodCgpIC0gY29uc3RyYWludHMucmln
aHQtPngpOworICAgIHJldHVybiBhdmFpbGFibGVXaWR0aDsKK30KKwordm9pZCBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0OjpwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihjb25zdCBDb250YWlu
ZXJCb3gmIGNvbnRhaW5lckJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9u
dGFsQ29uc3RyYWludHMpCit7CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0
TGF5b3V0LCBzdHJlYW0gPDwgIlN0YXJ0OiBtb3ZlIGluLWZsb3cgcG9zaXRpb25lZCBjaGlsZHJl
biAtPiBwYXJlbnQ6ICIgPDwgJmNvbnRhaW5lckJveCk7CisgICAgZm9yIChhdXRvJiBjaGlsZEJv
eCA6IGNoaWxkcmVuT2ZUeXBlPEJveD4oY29udGFpbmVyQm94KSkgeworICAgICAgICBpZiAoIWNo
aWxkQm94LmlzSW5GbG93UG9zaXRpb25lZCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgIGF1dG8gcG9zaXRpb25PZmZzZXQgPSBnZW9tZXRyeSgpLmluRmxvd1Bvc2l0aW9uZWRQb3Np
dGlvbk9mZnNldChjaGlsZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICAgICAgZm9y
bWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoY2hpbGRCb3gpLm1vdmUocG9zaXRpb25PZmZzZXQp
OworICAgIH0KKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0
cmVhbSA8PCAiRW5kOiBtb3ZlIGluLWZsb3cgcG9zaXRpb25lZCBjaGlsZHJlbiAtPiBwYXJlbnQ6
ICIgPDwgJmNvbnRhaW5lckJveCk7Cit9CisKK3ZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6
Y29tcHV0ZVN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0
IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpCit7CisgICAgZm9ybWF0
dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRMb2dpY2FsVG9wKGdlb21ldHJ5
KCkuc3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIHZlcnRpY2FsQ29uc3RyYWludHMp
KTsKK30KKwordm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlU3RhdGljSG9yaXpv
bnRhbFBvc2l0aW9uKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBmb3JtYXR0aW5nU3RhdGUoKS5i
b3hHZW9tZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxMZWZ0KGdlb21ldHJ5KCkuc3RhdGljSG9y
aXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSk7Cit9CisK
K3ZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6cHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25G
b3JCb3hBbmRBbmNlc3RvcnMoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRz
UGFpciYgY29uc3RyYWludHNQYWlyKQoreworICAgIC8vIEluIG9yZGVyIHRvIGZpZ3VyZSBvdXQg
d2hldGhlciBhIGJveCBzaG91bGQgYXZvaWQgYSBmbG9hdCwgd2UgbmVlZCB0byBrbm93IHRoZSBm
aW5hbCBwb3NpdGlvbnMgb2YgYm90aCAoaWdub3JlIHJlbGF0aXZlIHBvc2l0aW9uaW5nIGZvciBu
b3cpLgorICAgIC8vIEluIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCB0aGUgZmluYWwgcG9zaXRp
b24gZm9yIGEgbm9ybWFsIGZsb3cgYm94IGluY2x1ZGVzCisgICAgLy8gMS4gdGhlIHN0YXRpYyBw
b3NpdGlvbiBhbmQKKyAgICAvLyAyLiB0aGUgY29ycmVzcG9uZGluZyAobm9uKWNvbGxhcHNlZCBt
YXJnaW5zLgorICAgIC8vIE5vdyB0aGUgdmVydGljYWwgbWFyZ2lucyBhcmUgY29tcHV0ZWQgd2hl
biBhbGwgdGhlIGRlc2NlbmRhbnRzIGFyZSBmaW5hbGl6ZWQsIGJlY2F1c2UgdGhlIG1hcmdpbiB2
YWx1ZXMgbWlnaHQgYmUgZGVwZW5kaW5nIG9uIHRoZSBoZWlnaHQgb2YgdGhlIGJveAorICAgIC8v
IChhbmQgdGhlIGhlaWdodCBtaWdodCBiZSBiYXNlZCBvbiB0aGUgY29udGVudCkuCisgICAgLy8g
U28gd2hlbiB3ZSBnZXQgdG8gdGhlIHBvaW50IHdoZXJlIHdlIGludGVyc2VjdCB0aGUgYm94IHdp
dGggdGhlIGZsb2F0IHRvIGRlY2lkZSBpZiB0aGUgYm94IG5lZWRzIHRvIG1vdmUsIHdlIGRvbid0
IHlldCBoYXZlIHRoZSBmaW5hbCB2ZXJ0aWNhbCBwb3NpdGlvbi4KKyAgICAvLworICAgIC8vIFRo
ZSBpZGVhIGhlcmUgaXMgdGhhdCBhcyBsb25nIGFzIHdlIGRvbid0IGNyb3NzIHRoZSBibG9jayBm
b3JtYXR0aW5nIGNvbnRleHQgYm91bmRhcnksIHdlIHNob3VsZCBiZSBhYmxlIHRvIHByZS1jb21w
dXRlIHRoZSBmaW5hbCB0b3AgcG9zaXRpb24uCisgICAgLy8gRklYTUU6IHdlIGN1cnJlbnRseSBk
b24ndCBhY2NvdW50IGZvciB0aGUgImNsZWFyIiBwcm9wZXJ0eSB3aGVuIGNvbXB1dGluZyB0aGUg
ZmluYWwgcG9zaXRpb24gZm9yIGFuIGFuY2VzdG9yLgorICAgIGZvciAoYXV0byogYW5jZXN0b3Ig
PSAmbGF5b3V0Qm94OyBhbmNlc3RvciAmJiBhbmNlc3RvciAhPSAmcm9vdCgpOyBhbmNlc3RvciA9
ICZhbmNlc3Rvci0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKKyAgICAgICAgYXV0byBjb25zdHJhaW50
c0ZvckFuY2VzdG9yID0gWyZdIHsKKyAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9
IGFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybiAmY29udGFp
bmluZ0Jsb2NrID09ICZyb290KCkgPyBjb25zdHJhaW50c1BhaXIuZm9ybWF0dGluZ0NvbnRleHRS
b290IDogZ2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29udGFpbmluZ0Js
b2NrKTsKKyAgICAgICAgfSgpOworCisgICAgICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdp
biA9IGdlb21ldHJ5KCkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbigqYW5jZXN0b3IsIGNvbnN0cmFp
bnRzRm9yQW5jZXN0b3IuaG9yaXpvbnRhbCk7CisgICAgICAgIGF1dG8gdXNlZE5vbkNvbGxhcHNl
ZE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIHsgY29tcHV0
ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdp
bi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgICAgIGF1dG8gcHJlY29tcHV0ZWRNYXJnaW5CZWZv
cmUgPSBtYXJnaW5Db2xsYXBzZSgpLnByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKCphbmNlc3Rvciwg
dXNlZE5vbkNvbGxhcHNlZE1hcmdpbik7CisKKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBm
b3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSgqYW5jZXN0b3IpOworICAgICAgICBhdXRvIG5v
bkNvbGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVz
IHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUubm9uQ29sbGFwc2VkVmFsdWUsIHsgfSB9OworICAg
ICAgICBhdXRvIGNvbGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Q29sbGFwc2Vk
VmFsdWVzIHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUuY29sbGFwc2VkVmFsdWUsIHsgfSwgZmFs
c2UgfTsKKyAgICAgICAgYXV0byB2ZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbiB7
IG5vbkNvbGxhcHNlZFZhbHVlcywgY29sbGFwc2VkVmFsdWVzLCB7IHByZWNvbXB1dGVkTWFyZ2lu
QmVmb3JlLnBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW5CZWZvcmUsIHsgfSB9IH07CisKKyAgICAg
ICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0VXNlZFZlcnRpY2FsTWFyZ2luKCphbmNlc3RvciwgdmVy
dGljYWxNYXJnaW4pOworICAgICAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1h
cmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9
KTsKKyAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcCh2ZXJ0aWNhbFBvc2l0aW9uV2l0
aE1hcmdpbigqYW5jZXN0b3IsIHZlcnRpY2FsTWFyZ2luLCBjb25zdHJhaW50c0ZvckFuY2VzdG9y
LnZlcnRpY2FsKSk7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICAgICAgc2V0UHJlY29tcHV0ZWRN
YXJnaW5CZWZvcmUoKmFuY2VzdG9yLCBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZSk7CisgICAgICAg
IGJveEdlb21ldHJ5LnNldEhhc1ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKCk7CisjZW5kaWYKKyAg
ICB9Cit9CisKK3ZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZVBvc2l0aW9uVG9B
dm9pZEZsb2F0cyhjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3Qg
Qm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQor
eworICAgIGlmICghbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkpCisgICAgICAgIHJldHVybjsK
KyAgICAvLyBJbiBvcmRlciB0byBwb3NpdGlvbiBhIGZsb2F0IGF2b2lkZXIgd2UgbmVlZCB0byBr
bm93IGl0cyB2ZXJ0aWNhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byBpdHMgZm9ybWF0dGluZyBjb250
ZXh0IHJvb3QgKGFuZCBub3QganVzdCBpdHMgY29udGFpbmluZyBibG9jayksCisgICAgLy8gYmVj
YXVzZSBhbGwgdGhlIGFscmVhZHktcGxhY2VkIGZsb2F0cyAoZmxvYXRzIHRoYXQgd2UgYXJlIHRy
eWluZyB0byBhdm9pZCBoZXJlKSBpbiB0aGlzIEJGQyBtaWdodCBiZWxvbmcKKyAgICAvLyB0byBh
IGRpZmZlcmVudCBzZXQgb2YgY29udGFpbmluZyBibG9ja3MgKGJ1dCB0aGV5IGFsbCBkZXNjZW5k
YW50cyBvZiB0aGUgQkZDIHJvb3QpLgorICAgIC8vIEhvd2V2ZXIgYWNjb3JkaW5nIHRvIHRoZSBC
RkMgcnVsZXMsIGF0IHRoaXMgcG9pbnQgb2YgdGhlIGxheW91dCBmbG93IHdlIGRvbid0IHlldCBo
YXZlIGNvbXB1dGVkIHZlcnRpY2FsIHBvc2l0aW9ucyBmb3IgdGhlIGFuY2VzdG9ycy4KKyAgICBp
ZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgcHJlY29tcHV0
ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMobGF5b3V0Qm94LCBjb25zdHJhaW50
c1BhaXIpOworICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gp
LnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nQ29udGV4dC5wb3NpdGlvbkZvckZsb2F0KGxheW91
dEJveCwgY29uc3RyYWludHNQYWlyLmNvbnRhaW5pbmdCbG9jay5ob3Jpem9udGFsKSk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gTm9uLWZsb2F0IHBvc2l0aW9uZWQgZmxvYXQgYXZv
aWRlcnMgKGZvcm1hdHRpbmcgY29udGV4dCByb290cyBhbmQgY2xlYXIgYm94ZXMpIHNob3VsZCBi
ZSBmaW5lIHVubGVzcyB0aGVyZSBhcmUgZmxvYXRzIGluIHRoaXMgY29udGV4dC4KKyAgICBpZiAo
ZmxvYXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHByZWNvbXB1
dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGxheW91dEJveCwgY29uc3RyYWlu
dHNQYWlyKTsKKyAgICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKKyAgICAgICAgcmV0
dXJuIGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihmbG9hdGluZ0NvbnRleHQs
IGxheW91dEJveCk7CisKKyAgICBBU1NFUlQobGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGlu
Z0NvbnRleHQoKSk7CisgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94
KS5zZXRMb2dpY2FsVG9wTGVmdChmbG9hdGluZ0NvbnRleHQucG9zaXRpb25Gb3JOb25GbG9hdGlu
Z0Zsb2F0QXZvaWRlcihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzUGFpci5jb250YWluaW5nQmxvY2su
aG9yaXpvbnRhbCkpOworfQorCit2b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVW
ZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0
aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgQVNTRVJUKGxheW91dEJv
eC5oYXNGbG9hdENsZWFyKCkpOworICAgIGlmIChmbG9hdGluZ0NvbnRleHQuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm47CisgICAgYXV0byB2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJhbmNlID0g
ZmxvYXRpbmdDb250ZXh0LnZlcnRpY2FsUG9zaXRpb25XaXRoQ2xlYXJhbmNlKGxheW91dEJveCk7
CisgICAgaWYgKCF2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJhbmNlKQorICAgICAgICByZXR1cm47
CisKKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5
KGxheW91dEJveCk7CisgICAgQVNTRVJUKHZlcnRpY2FsUG9zaXRpb25BbmRDbGVhcmFuY2UtPnBv
c2l0aW9uID49IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hUb3AoYm94R2VvbWV0cnkpKTsKKyAgICBi
b3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25BbmRDbGVhcmFuY2UtPnBv
c2l0aW9uKTsKKyAgICBpZiAodmVydGljYWxQb3NpdGlvbkFuZENsZWFyYW5jZS0+Y2xlYXJhbmNl
KQorICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRIYXNDbGVhcmFuY2UobGF5b3V0Qm94KTsK
KyAgICAvLyBGSVhNRTogUmVzZXQgdGhlIG1hcmdpbiB2YWx1ZXMgb24gdGhlIGFuY2VzdG9ycy9w
cmV2aW91cyBzaWJsaW5ncyBub3cgdGhhdCB0aGUgZmxvYXQgYXZvaWRlciB3aXRoIGNsZWFyYW5j
ZSBkb2VzIG5vdCBtYXJnaW4gY29sbGFwc2UgYW55bW9yZS4KK30KKwordm9pZCBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0Ojpjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3QgRmxvYXRpbmdDb250ZXh0
JiBmbG9hdGluZ0NvbnRleHQsIGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBDb25zdHJhaW50
c1BhaXImIGNvbnN0cmFpbnRzUGFpcikKK3sKKyAgICBhdXRvIGF2YWlsYWJsZVdpZHRoRmxvYXRB
dm9pZGVyID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OworICAgIGlmIChsYXlvdXRCb3guaXNG
bG9hdEF2b2lkZXIoKSkgeworICAgICAgICAvLyBGbG9hdCBhdm9pZGVycycgYXZhaWxhYmxlIHdp
ZHRoIG1pZ2h0IGJlIHNocnVuayBieSBleGlzdGluZyBmbG9hdHMgaW4gdGhlIGNvbnRleHQuCisg
ICAgICAgIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyID0gdXNlZEF2YWlsYWJsZVdpZHRoRm9y
RmxvYXRBdm9pZGVyKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCBjb25zdHJhaW50c1BhaXIp
OworICAgIH0KKyAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGdlb21ldHJ5KCkuY29t
cHV0ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBjb25zdHJhaW50c1BhaXIuY29u
dGFpbmluZ0Jsb2NrLmhvcml6b250YWwsIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyKTsKKyAg
ICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91
dEJveCk7CisgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGNvbnRlbnRXaWR0aEFu
ZE1hcmdpbi5jb250ZW50V2lkdGgpOworICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJn
aW4oeyBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCwgY29udGVudFdpZHRo
QW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIH0pOworfQorCit2b2lkIEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6OmNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0
IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgYXV0byBj
b21wdXRlID0gWyZdKE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRIZWlnaHQpIC0+IENvbnRlbnRI
ZWlnaHRBbmRNYXJnaW4geworICAgICAgICBpZiAobGF5b3V0Qm94LmlzSW5GbG93KCkpCisgICAg
ICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbkZsb3dDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGxh
eW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwgeyB1c2VkSGVpZ2h0IH0pOworCisgICAg
ICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJl
dHVybiBnZW9tZXRyeSgpLmZsb2F0aW5nQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gs
IGNvbnN0cmFpbnRzLmhvcml6b250YWwsIHsgdXNlZEhlaWdodCB9KTsKKworICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICB9OworCisgICAgYXV0
byBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZSh7IH0pOworICAgIGlmIChhdXRvIG1h
eEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQobGF5b3V0Qm94KSkgeworICAg
ICAgICBpZiAoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID4gKm1heEhlaWdo
dCkgeworICAgICAgICAgICAgYXV0byBtYXhIZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRlKG1heEhl
aWdodCk7CisgICAgICAgICAgICAvLyBVc2VkIGhlaWdodCBzaG91bGQgcmVtYWluIHRoZSBzYW1l
LgorICAgICAgICAgICAgQVNTRVJUKChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpICYmIChs
YXlvdXRCb3guaXNCb2R5Qm94KCkgfHwgbGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSkpIHx8IG1h
eEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID09ICptYXhIZWlnaHQpOworICAgICAgICAg
ICAgY29udGVudEhlaWdodEFuZE1hcmdpbiA9IHsgKm1heEhlaWdodCwgbWF4SGVpZ2h0QW5kTWFy
Z2luLm5vbkNvbGxhcHNlZE1hcmdpbiB9OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF1
dG8gbWluSGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbkhlaWdodChsYXlvdXRCb3gpKSB7
CisgICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPCAqbWlu
SGVpZ2h0KSB7CisgICAgICAgICAgICBhdXRvIG1pbkhlaWdodEFuZE1hcmdpbiA9IGNvbXB1dGUo
bWluSGVpZ2h0KTsKKyAgICAgICAgICAgIC8vIFVzZWQgaGVpZ2h0IHNob3VsZCByZW1haW4gdGhl
IHNhbWUuCisgICAgICAgICAgICBBU1NFUlQoKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkg
JiYgKGxheW91dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpKSkg
fHwgbWluSGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPT0gKm1pbkhlaWdodCk7CisgICAg
ICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0geyAqbWluSGVpZ2h0LCBtaW5IZWlnaHRB
bmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAv
LyAxLiBDb21wdXRlIGNvbGxhcHNlZCBtYXJnaW5zLgorICAgIC8vIDIuIEFkanVzdCB2ZXJ0aWNh
bCBwb3NpdGlvbiB1c2luZyB0aGUgY29sbGFwc2VkIHZhbHVlcy4KKyAgICAvLyAzLiBBZGp1c3Qg
cHJldmlvdXMgaW4tZmxvdyBzaWJsaW5nIG1hcmdpbiBhZnRlciB1c2luZyB0aGlzIG1hcmdpbi4K
KyAgICBhdXRvIG1hcmdpbkNvbGxhcHNlID0gdGhpcy0+bWFyZ2luQ29sbGFwc2UoKTsKKyAgICBh
dXRvIHZlcnRpY2FsTWFyZ2luID0gbWFyZ2luQ29sbGFwc2UuY29sbGFwc2VkVmVydGljYWxWYWx1
ZXMobGF5b3V0Qm94LCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbik7
CisgICAgLy8gQ2FjaGUgdGhlIGNvbXB1dGVkIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4g
dmFsdWUgcGFpci4KKyAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRVc2VkVmVydGljYWxNYXJnaW4o
bGF5b3V0Qm94LCB2ZXJ0aWNhbE1hcmdpbik7CisKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIGlm
IChoYXNQcmVjb21wdXRlZE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpICYmIHByZWNvbXB1dGVkTWFy
Z2luQmVmb3JlKGxheW91dEJveCkudXNlZFZhbHVlKCkgIT0gbWFyZ2luQmVmb3JlKHZlcnRpY2Fs
TWFyZ2luKSkgeworICAgICAgICAvLyBXaGVuIHRoZSBwcmUtY29tcHV0ZWQgbWFyZ2luIHR1cm5z
IG91dCB0byBiZSBpbmNvcnJlY3QsIHdlIG5lZWQgdG8gcmUtbGF5b3V0IHRoaXMgc3VidHJlZSB3
aXRoIHRoZSBjb3JyZWN0IG1hcmdpbiB2YWx1ZXMuCisgICAgICAgIC8vIDxkaXYgc3R5bGU9ImZs
b2F0OiBsZWZ0Ij48L2Rpdj4KKyAgICAgICAgLy8gPGRpdj4KKyAgICAgICAgLy8gICA8ZGl2IHN0
eWxlPSJtYXJnaW4tYm90dG9tOiAyMDBweCI+PC9kaXY+CisgICAgICAgIC8vIDwvZGl2PgorICAg
ICAgICAvLyBUaGUgZmxvYXQgYm94IHRyaWdnZXJzIG1hcmdpbiBiZWZvcmUgY29tcHV0YXRpb24g
b24gdGhlIGFuY2VzdG9yIGNoYWluIHRvIGJlIGFibGUgdG8gaW50ZXJzZWN0IHdpdGggb3RoZXIg
ZmxvYXRzIGluIHRoZSBzYW1lIGZsb2F0aW5nIGNvbnRleHQuCisgICAgICAgIC8vIEhvd2V2ZXIg
aW4gc29tZSBjYXNlcyB0aGUgcGFyZW50IG1hcmdpbi10b3AgY29sbGFwc2VzIHdpdGggc29tZSBu
ZXh0IHNpYmxpbmdzIChuZXBoZXdzKSBhbmQgdGhlcmUncyBubyB3YXkgdG8gYmUgYWJsZSB0byBw
cm9wZXJseQorICAgICAgICAvLyBhY2NvdW50IGZvciB0aGF0IHdpdGhvdXQgbGF5aW5nIG91dCBl
dmVyeSBub2RlIGluIHRoZSBGQyAoaW4gdGhlIGV4YW1wbGUsIHRoZSBtYXJnaW4tYm90dG9tIHB1
c2hlcyBkb3duIHRoZSBmbG9hdCkuCisgICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVU
KCk7CisgICAgfQorI2VuZGlmCisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3Rh
dGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOworICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRC
b3hIZWlnaHQoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KTsKKyAgICBib3hH
ZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiks
IG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsKKyAgICAvLyBBZGp1c3QgdGhlIHByZXZp
b3VzIHNpYmxpbmcncyBtYXJnaW4gYm90dG9tIG5vdyB0aGF0IHRoaXMgYm94J3MgdmVydGljYWwg
bWFyZ2luIGlzIGNvbXB1dGVkLgorICAgIE1hcmdpbkNvbGxhcHNlOjp1cGRhdGVNYXJnaW5BZnRl
ckZvclByZXZpb3VzU2libGluZygqdGhpcywgbWFyZ2luQ29sbGFwc2UsIGxheW91dEJveCk7Cit9
CisKK0Zvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIEJsb2NrRm9y
bWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpCit7Cisg
ICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7CisgICAg
QVNTRVJUKCFmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpKTsKKyAg
ICAvLyBWaXNpdCB0aGUgaW4tZmxvdyBkZXNjZW5kYW50cyBhbmQgY29tcHV0ZSB0aGVpciBtaW4v
bWF4IGludHJpbnNpYyB3aWR0aCBpZiBuZWVkZWQuCisgICAgLy8gMS4gR28gYWxsIHRoZSB3YXkg
ZG93biB0byB0aGUgbGVhZiBub2RlCisgICAgLy8gMi4gQ2hlY2sgaWYgYWN0dWFsbHkgbmVlZCB0
byB2aXNpdCBhbGwgdGhlIGJveGVzIGFzIHdlIHRyYXZlcnNlIGRvd24gKGFscmVhZHkgY29tcHV0
ZWQsIGNvbnRhaW5lcidzIG1pbi9tYXggZG9lcyBub3QgZGVwZW5kIG9uIGRlc2NlbmRhbnRzIGV0
YykKKyAgICAvLyAzLiBBcyB3ZSBjbGltYiBiYWNrIG9uIHRoZSB0cmVlLCBjb21wdXRlIG1pbi9t
YXggaW50cmluc2ljIHdpZHRoCisgICAgLy8gKEFueSBzdWJ0cmVlcyB3aXRoIG5ldyBmb3JtYXR0
aW5nIGNvbnRleHRzIG5lZWQgdG8gbGF5b3V0IHN5bmNocm9ub3VzbHkpCisgICAgVmVjdG9yPGNv
bnN0IEJveCo+IHF1ZXVlOworICAgIGlmIChyb290KCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxk
KCkpCisgICAgICAgIHF1ZXVlLmFwcGVuZChyb290KCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hp
bGQoKSk7CisKKyAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbnN0cmFpbnRzOworICAg
IGF1dG8gbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoID0gTGF5b3V0VW5pdCB7IH07Cisg
ICAgYXV0byBjdXJyZW50SG9yaXpvbnRhbFN0YWNraW5nV2lkdGggPSBMYXlvdXRVbml0IHsgfTsK
KyAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICB3aGlsZSAodHJ1ZSkgewor
ICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBkZWFsIHdpdGggZGVzY2VuZGFudCBj
b250ZW50LgorICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKnF1ZXVlLmxhc3QoKTsKKyAg
ICAgICAgICAgIC8vIEZsb2F0IGF2b2lkZXJzIGFyZSBhbGwgZXN0YWJsaXNoIGEgbmV3IGZvcm1h
dHRpbmcgY29udGV4dC4gTm8gbmVlZCB0byBsb29rIGluc2lkZSB0aGVtLgorICAgICAgICAgICAg
aWYgKGxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpICYmICFsYXlvdXRCb3guaGFzRmxvYXRDbGVh
cigpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gTm9uLWZsb2F0aW5n
IGJsb2NrIGxldmVsIGJveGVzIHJlc2V0IHRoZSBjdXJyZW50IGhvcml6b250YWwgZmxvYXQgc3Rh
Y2tpbmcuCisgICAgICAgICAgICAvLyBTUEVDOiBUaGlzIGlzIGEgYml0IG9kZCBhcyBmbG9hdGlu
ZyBwb3NpdGlvbmluZyBpcyBhIGZvcm1hdHRpbmcgY29udGV4dCBsZXZlbCBjb25jZXB0OgorICAg
ICAgICAgICAgLy8gZS5nLgorICAgICAgICAgICAgLy8gPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7
IHdpZHRoOiAxMHB4OyI+PC9kaXY+CisgICAgICAgICAgICAvLyA8ZGl2PjwvZGl2PgorICAgICAg
ICAgICAgLy8gPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiA0MHB4OyI+PC9kaXY+Cisg
ICAgICAgICAgICAvLyAuLi53aWxsIHByb2R1Y2UgYSBtYXggd2lkdGggb2YgNDBweCB3aGljaCBt
YWtlcyB0aGUgZmxvYXRzIHZlcnRpY2FsbHkgc3RhY2tlZC4KKyAgICAgICAgICAgIC8vIFZlcnRp
Y2FsbHkgc3RhY2tlZCBmbG9hdHMgbWFrZXMgbWUgdGhpbmsgd2UgaGF2ZW4ndCBtYW5hZ2VkIHRv
IHByb3ZpZGUgdGhlIG1heGltdW0gcHJlZmVycmVkIHdpZHRoIGZvciB0aGUgY29udGVudC4KKyAg
ICAgICAgICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHN0ZDo6bWF4KGN1cnJl
bnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRo
KTsKKyAgICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHsgfTsKKyAg
ICAgICAgICAgIC8vIEFscmVhZHkgaGFzIGNvbXB1dGVkIGludHJpbnNpYyBjb25zdHJhaW50cy4K
KyAgICAgICAgICAgIGlmIChmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50
c0ZvckJveChsYXlvdXRCb3gpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
Ly8gQm94IHdpdGggZml4ZWQgd2lkdGggZGVmaW5lcyB0aGVpciBkZXNjZW5kYW50IGNvbnRlbnQg
aW50cmluc2ljIHdpZHRoLgorICAgICAgICAgICAgaWYgKGxheW91dEJveC5zdHlsZSgpLndpZHRo
KCkuaXNGaXhlZCgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gTm9u
LWZsb2F0IGF2b2lkZXIgZm9ybWF0dGluZyBjb250ZXh0IHJvb3RzIGFyZSBvcGFxdWUgdG8gaW50
cmluc2ljIHdpZHRoIGNvbXB1dGF0aW9uLgorICAgICAgICAgICAgaWYgKGxheW91dEJveC5lc3Rh
Ymxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAvLyBObyByZWxldmFudCBjaGlsZCBjb250ZW50LgorICAgICAgICAgICAgaWYgKCFp
czxDb250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENvbnRhaW5lckJveD4obGF5
b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91
dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7CisgICAgICAgIH0KKyAgICAgICAg
Ly8gQ29tcHV0ZSBtaW4vbWF4IGludHJpbnNpYyB3aWR0aCBib3R0b20gdXAgaWYgbmVlZGVkLgor
ICAgICAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXV0byYgbGF5
b3V0Qm94ID0gKnF1ZXVlLnRha2VMYXN0KCk7CisgICAgICAgICAgICBhdXRvIGRlc2RlbmRhbnRD
b25zdHJhaW50cyA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9y
Qm94KGxheW91dEJveCk7CisgICAgICAgICAgICBpZiAoIWRlc2RlbmRhbnRDb25zdHJhaW50cykg
eworICAgICAgICAgICAgICAgIGRlc2RlbmRhbnRDb25zdHJhaW50cyA9IGdlb21ldHJ5KCkuaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cyhsYXlvdXRCb3gpOworICAgICAgICAgICAgICAgIGZvcm1h
dHRpbmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGxheW91dEJveCwg
KmRlc2RlbmRhbnRDb25zdHJhaW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25z
dHJhaW50cy5taW5pbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMubWluaW11bSwgZGVzZGVuZGFu
dENvbnN0cmFpbnRzLT5taW5pbXVtKTsKKyAgICAgICAgICAgIGF1dG8gd2lsbFN0YWNrSG9yaXpv
bnRhbGx5ID0gbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkgJiYgIWxheW91dEJveC5oYXNGbG9h
dENsZWFyKCk7CisgICAgICAgICAgICBpZiAod2lsbFN0YWNrSG9yaXpvbnRhbGx5KQorICAgICAg
ICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCArPSBkZXNkZW5kYW50Q29u
c3RyYWludHMtPm1heGltdW07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29u
c3RyYWludHMubWF4aW11bSA9IHN0ZDo6bWF4KGNvbnN0cmFpbnRzLm1heGltdW0sIGRlc2RlbmRh
bnRDb25zdHJhaW50cy0+bWF4aW11bSk7CisgICAgICAgICAgICAvLyBNb3ZlIG92ZXIgdG8gdGhl
IG5leHQgc2libGluZyBvciB0YWtlIHRoZSBuZXh0IGJveCBpbiB0aGUgcXVldWUuCisgICAgICAg
ICAgICBpZiAoYXV0byogbmV4dFNpYmxpbmcgPSBsYXlvdXRCb3gubmV4dEluRmxvd09yRmxvYXRp
bmdTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQobmV4dFNpYmxpbmcp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fQorICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHN0ZDo6bWF4KGN1cnJlbnRI
b3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsK
KyAgICBjb25zdHJhaW50cy5tYXhpbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMubWF4aW11bSwg
bWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsKKyAgICBmb3JtYXR0aW5nU3RhdGUuc2V0
SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25zdHJhaW50cyk7CisgICAgcmV0dXJuIGNvbnN0
cmFpbnRzOworfQorCitMYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OnZlcnRpY2Fs
UG9zaXRpb25XaXRoTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBVc2VkVmVydGlj
YWxNYXJnaW4mIHZlcnRpY2FsTWFyZ2luLCAgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVy
dGljYWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICBBU1NFUlQoIWxheW91dEJveC5pc091dE9m
Rmxvd1Bvc2l0aW9uZWQoKSk7CisgICAgLy8gTm93IHRoYXQgd2UndmUgY29tcHV0ZWQgdGhlIGZp
bmFsIG1hcmdpbiBiZWZvcmUsIGxldCdzIHNoaWZ0IHRoZSBib3gncyB2ZXJ0aWNhbCBwb3NpdGlv
biBpZiBuZWVkZWQuCisgICAgLy8gMS4gQ2hlY2sgaWYgdGhlIGJveCBoYXMgY2xlYXJhbmNlLiBJ
ZiBzbywgd2UndmUgYWxyZWFkeSBwcmVjb21wdXRlZC9maW5hbGl6ZWQgdGhlIHRvcCB2YWx1ZSBh
bmQgdmVydGljYWwgbWFyZ2luIGRvZXMgbm90IGltcGFjdCBpdCBhbnltb3JlLgorICAgIC8vIDIu
IENoZWNrIGlmIHRoZSBtYXJnaW4gYmVmb3JlIGNvbGxhcHNlcyB3aXRoIHRoZSBwcmV2aW91cyBi
b3gncyBtYXJnaW4gYWZ0ZXIuIGlmIG5vdCAtPiByZXR1cm4gcHJldmlvdXMgYm94J3MgYm90dG9t
IGluY2x1ZGluZyBtYXJnaW4gYWZ0ZXIgKyBtYXJnaW5CZWZvcmUKKyAgICAvLyAzLiBDaGVjayBp
ZiB0aGUgcHJldmlvdXMgYm94J3MgbWFyZ2lucyBjb2xsYXBzZSB0aHJvdWdoLiBJZiBub3QgLT4g
cmV0dXJuIHByZXZpb3VzIGJveCcgYm90dG9tIGV4Y2x1ZGluZyBtYXJnaW4gYWZ0ZXIgKyBtYXJn
aW5CZWZvcmUgKHRoZXkgYXJlIHN1cHBvc2VkIHRvIGJlIGVxdWFsKQorICAgIC8vIDQuIEdvIHRv
IHByZXZpb3VzIGJveCBhbmQgc3RhcnQgZnJvbSBzdGVwICMxIHVudGlsIHdlIGhpdCB0aGUgcGFy
ZW50IGJveC4KKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGdlb21ldHJ5Rm9yQm94KGxheW91dEJv
eCk7CisgICAgaWYgKGZvcm1hdHRpbmdTdGF0ZSgpLmhhc0NsZWFyYW5jZShsYXlvdXRCb3gpKQor
ICAgICAgICByZXR1cm4gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChib3hHZW9tZXRyeSk7CisK
KyAgICBhdXRvKiBjdXJyZW50TGF5b3V0Qm94ID0gJmxheW91dEJveDsKKyAgICB3aGlsZSAoY3Vy
cmVudExheW91dEJveCkgeworICAgICAgICBpZiAoIWN1cnJlbnRMYXlvdXRCb3gtPnByZXZpb3Vz
SW5GbG93U2libGluZygpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGF1dG8mIHByZXZp
b3VzSW5GbG93U2libGluZyA9ICpjdXJyZW50TGF5b3V0Qm94LT5wcmV2aW91c0luRmxvd1NpYmxp
bmcoKTsKKyAgICAgICAgaWYgKCFtYXJnaW5Db2xsYXBzZSgpLm1hcmdpbkJlZm9yZUNvbGxhcHNl
c1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVudExheW91dEJveCkpIHsKKyAg
ICAgICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9tZXRyeUZvckJveChwcmV2
aW91c0luRmxvd1NpYmxpbmcpOworICAgICAgICAgICAgcmV0dXJuIEJveEdlb21ldHJ5OjptYXJn
aW5Cb3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsgbWFyZ2luQmVmb3JlKHZl
cnRpY2FsTWFyZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbWFyZ2luQ29sbGFwc2Uo
KS5tYXJnaW5zQ29sbGFwc2VUaHJvdWdoKHByZXZpb3VzSW5GbG93U2libGluZykpIHsKKyAgICAg
ICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9tZXRyeUZvckJveChwcmV2aW91
c0luRmxvd1NpYmxpbmcpOworICAgICAgICAgICAgcmV0dXJuIEJveEdlb21ldHJ5Ojpib3JkZXJC
b3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsgbWFyZ2luQmVmb3JlKHZlcnRp
Y2FsTWFyZ2luKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50TGF5b3V0Qm94ID0gJnByZXZp
b3VzSW5GbG93U2libGluZzsKKyAgICB9CisKKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja0NvbnRl
bnRCb3hUb3AgPSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7CisgICAgLy8gQWRqdXN0
IHZlcnRpY2FsIHBvc2l0aW9uIGRlcGVuZGluZyB3aGV0aGVyIHRoaXMgYm94IGRpcmVjdGx5IG9y
IGluZGlyZWN0bHkgYWRqb2lucyB3aXRoIGl0cyBwYXJlbnQuCisgICAgYXV0byBkaXJlY3RseUFk
am9pbnNQYXJlbnQgPSAhbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpOworICAgIGlm
IChkaXJlY3RseUFkam9pbnNQYXJlbnQpIHsKKyAgICAgICAgLy8gSWYgdGhlIHRvcCBhbmQgYm90
dG9tIG1hcmdpbnMgb2YgYSBib3ggYXJlIGFkam9pbmluZywgdGhlbiBpdCBpcyBwb3NzaWJsZSBm
b3IgbWFyZ2lucyB0byBjb2xsYXBzZSB0aHJvdWdoIGl0LgorICAgICAgICAvLyBJbiB0aGlzIGNh
c2UsIHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBkZXBlbmRzIG9uIGl0cyByZWxhdGlvbnNo
aXAgd2l0aCB0aGUgb3RoZXIgZWxlbWVudHMgd2hvc2UgbWFyZ2lucyBhcmUgYmVpbmcgY29sbGFw
c2VkLgorICAgICAgICBpZiAodmVydGljYWxNYXJnaW4uY29sbGFwc2VkVmFsdWVzLmlzQ29sbGFw
c2VkVGhyb3VnaCkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQncyBtYXJnaW5zIGFy
ZSBjb2xsYXBzZWQgd2l0aCBpdHMgcGFyZW50J3MgdG9wIG1hcmdpbiwgdGhlIHRvcCBib3JkZXIg
ZWRnZSBvZiB0aGUgYm94IGlzIGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHBhcmVudCdz
LgorICAgICAgICAgICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2Vz
V2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQorICAgICAgICAgICAgICAgIHJldHVy
biBjb250YWluaW5nQmxvY2tDb250ZW50Qm94VG9wOworICAgICAgICAgICAgLy8gT3RoZXJ3aXNl
LCBlaXRoZXIgdGhlIGVsZW1lbnQncyBwYXJlbnQgaXMgbm90IHRha2luZyBwYXJ0IGluIHRoZSBt
YXJnaW4gY29sbGFwc2luZywgb3Igb25seSB0aGUgcGFyZW50J3MgYm90dG9tIG1hcmdpbiBpcyBp
bnZvbHZlZC4KKyAgICAgICAgICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCdzIHRv
cCBib3JkZXIgZWRnZSBpcyB0aGUgc2FtZSBhcyBpdCB3b3VsZCBoYXZlIGJlZW4gaWYgdGhlIGVs
ZW1lbnQgaGFkIGEgbm9uLXplcm8gYm90dG9tIGJvcmRlci4KKyAgICAgICAgICAgIGF1dG8gYmVm
b3JlTWFyZ2luV2l0aEJvdHRvbUJvcmRlciA9IG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3Jl
SWdub3JpbmdDb2xsYXBzaW5nVGhyb3VnaChsYXlvdXRCb3gsIHZlcnRpY2FsTWFyZ2luLm5vbkNv
bGxhcHNlZFZhbHVlcyk7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrQ29udGVu
dEJveFRvcCArIGJlZm9yZU1hcmdpbldpdGhCb3R0b21Cb3JkZXI7CisgICAgICAgIH0KKyAgICAg
ICAgLy8gTm9uLWNvbGxhcHNlZCB0aHJvdWdoIGJveCB2ZXJ0aWNhbCBwb3NpdGlvbiBkZXBlbmRp
bmcgd2hldGhlciB0aGUgbWFyZ2luIGNvbGxhcHNlcy4KKyAgICAgICAgaWYgKG1hcmdpbkNvbGxh
cHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXlvdXRC
b3gpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3A7CisK
KyAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgKyBtYXJnaW5CZWZv
cmUodmVydGljYWxNYXJnaW4pOworICAgIH0KKyAgICAvLyBBdCB0aGlzIHBvaW50IHRoaXMgYm94
IGluZGlyZWN0bHkgKHZpYSBjb2xsYXBzZWQgdGhyb3VnaCBwcmV2aW91cyBpbi1mbG93IHNpYmxp
bmdzKSBhZGpvaW5zIHRoZSBwYXJlbnQuIExldCdzIGNoZWNrIGlmIGl0IG1hcmdpbiBjb2xsYXBz
ZXMgd2l0aCB0aGUgcGFyZW50LgorICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxheW91dEJv
eC5jb250YWluaW5nQmxvY2soKTsKKyAgICBBU1NFUlQoY29udGFpbmluZ0Jsb2NrLmZpcnN0SW5G
bG93Q2hpbGQoKSk7CisgICAgQVNTRVJUKGNvbnRhaW5pbmdCbG9jay5maXJzdEluRmxvd0NoaWxk
KCkgIT0gJmxheW91dEJveCk7CisgICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3Jl
Q29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZSgqY29udGFpbmluZ0Jsb2NrLmZpcnN0SW5G
bG93Q2hpbGQoKSkpCisgICAgICAgIHJldHVybiBjb250YWluaW5nQmxvY2tDb250ZW50Qm94VG9w
OworCisgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgKyBtYXJnaW5CZWZv
cmUodmVydGljYWxNYXJnaW4pOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjYzZDk5NjkzZTg3Y2QwYjBmMTMyZWFjNzEzNjkwZTBiNzA1MmUxMjkKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9y
bWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgKQEAgLTAsMCArMSwxOTggQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJGb3Jt
YXR0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3Rm
L0lzb01hbGxvYy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIExheW91dFVuaXQ7
CisKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBCb3g7CitjbGFzcyBGbG9hdGluZ0NvbnRl
eHQ7CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbGF5b3V0IGxvZ2ljIGZvciBibG9j
ayBmb3JtYXR0aW5nIGNvbnRleHRzLgorLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIyL3Zp
c3VyZW4uaHRtbCNibG9jay1mb3JtYXR0aW5nCitjbGFzcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVE
KEJsb2NrRm9ybWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAgIEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9y
bWF0dGluZ1N0YXRlJik7CisKKyAgICB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0
aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSBvdmVycmlkZTsK
KyAgICBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3Qgb3ZlcnJpZGU7CisKK3By
b3RlY3RlZDoKKyAgICBzdHJ1Y3QgQ29uc3RyYWludHNQYWlyIHsKKyAgICAgICAgQ29uc3RyYWlu
dHNGb3JJbkZsb3dDb250ZW50IGZvcm1hdHRpbmdDb250ZXh0Um9vdDsKKyAgICAgICAgQ29uc3Ry
YWludHNGb3JJbkZsb3dDb250ZW50IGNvbnRhaW5pbmdCbG9jazsKKyAgICB9OworICAgIHZvaWQg
cGxhY2VJbkZsb3dQb3NpdGlvbmVkQ2hpbGRyZW4oY29uc3QgQ29udGFpbmVyQm94JiwgY29uc3Qg
SG9yaXpvbnRhbENvbnN0cmFpbnRzJik7CisKKyAgICB2b2lkIGNvbXB1dGVXaWR0aEFuZE1hcmdp
bihjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBCb3gmLCBjb25zdCBDb25zdHJhaW50c1Bh
aXImKTsKKyAgICB2b2lkIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3Qg
Q29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jik7CisKKyAgICB2b2lkIGNvbXB1dGVTdGF0aWNI
b3Jpem9udGFsUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
Jik7CisgICAgdm9pZCBjb21wdXRlU3RhdGljVmVydGljYWxQb3NpdGlvbihjb25zdCBCb3gmLCBj
b25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJik7CisgICAgdm9pZCBjb21wdXRlUG9zaXRpb25Ub0F2
b2lkRmxvYXRzKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0IEJveCYsIGNvbnN0IENvbnN0
cmFpbnRzUGFpciYpOworICAgIHZvaWQgY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JGbG9hdENs
ZWFyKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0IEJveCYpOworCisgICAgdm9pZCBwcmVj
b21wdXRlVmVydGljYWxQb3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhjb25zdCBCb3gmLCBjb25z
dCBDb25zdHJhaW50c1BhaXImKTsKKworICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29t
cHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJpZGU7CisKKyAgICBMYXlvdXRV
bml0IHZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IFVzZWRWZXJ0
aWNhbE1hcmdpbiYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmKSBjb25zdDsKKworICAgIC8v
IFRoaXMgY2xhc3MgaW1wbGVtZW50cyBwb3NpdGlvbmluZyBhbmQgc2l6aW5nIGZvciBib3hlcyBw
YXJ0aWNpcGF0aW5nIGluIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0LgorICAgIGNsYXNzIEdl
b21ldHJ5IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSB7CisgICAgcHVibGlj
OgorICAgICAgICBHZW9tZXRyeShjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Jik7CisKKyAg
ICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBpbkZsb3dDb250ZW50SGVpZ2h0QW5kTWFyZ2lu
KGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRk
ZW5WZXJ0aWNhbFZhbHVlcyYpOworICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gaW5GbG93
Q29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7CisKKyAgICAgICAgUG9p
bnQgc3RhdGljUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYpIGNvbnN0OworICAgICAgICBMYXlvdXRVbml0
IHN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgVmVydGljYWxDb25zdHJh
aW50cyYpIGNvbnN0OworICAgICAgICBMYXlvdXRVbml0IHN0YXRpY0hvcml6b250YWxQb3NpdGlv
bihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmKSBjb25zdDsKKworICAg
ICAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMo
Y29uc3QgQm94Jik7CisKKyAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGNvbXB1dGVkQ29u
dGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYsIE9wdGlvbmFsPExheW91dFVuaXQ+IGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyKTsKKwor
ICAgIHByaXZhdGU6CisgICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5GbG93Tm9uUmVw
bGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxD
b25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpOworICAgICAgICBD
b250ZW50V2lkdGhBbmRNYXJnaW4gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJn
aW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJp
ZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKyAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGlu
Rmxvd1JlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IFJlcGxhY2VkQm94JiwgY29u
c3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1
ZXMmKTsKKworICAgICAgICBjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5n
Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ+
KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KKyAg
ICB9OworICAgIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29u
c3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMpOyB9CisKKyAgICAvLyBUaGlzIGNsYXNzIGltcGxl
bWVudHMgbWFyZ2luIGNvbGxhcHNpbmcgZm9yIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dC4KKyAg
ICBjbGFzcyBNYXJnaW5Db2xsYXBzZSB7CisgICAgcHVibGljOgorICAgICAgICBVc2VkVmVydGlj
YWxNYXJnaW4gY29sbGFwc2VkVmVydGljYWxWYWx1ZXMoY29uc3QgQm94JiwgVXNlZFZlcnRpY2Fs
TWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpOworCisgICAgICAgIFByZWNvbXB1dGVkTWFyZ2lu
QmVmb3JlIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYsIFVzZWRWZXJ0aWNhbE1h
cmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsKKyAgICAgICAgTGF5b3V0VW5pdCBtYXJnaW5CZWZv
cmVJZ25vcmluZ0NvbGxhcHNpbmdUaHJvdWdoKGNvbnN0IEJveCYsIFVzZWRWZXJ0aWNhbE1hcmdp
bjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsKKyAgICAgICAgc3RhdGljIHZvaWQgdXBkYXRlTWFyZ2lu
QWZ0ZXJGb3JQcmV2aW91c1NpYmxpbmcoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYsIGNvbnN0IE1h
cmdpbkNvbGxhcHNlJiwgY29uc3QgQm94Jik7CisKKyAgICAgICAgYm9vbCBtYXJnaW5CZWZvcmVD
b2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OworICAgICAg
ICBib29sIG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxkTWFyZ2luQmVm
b3JlKGNvbnN0IEJveCYpIGNvbnN0OworICAgICAgICBib29sIG1hcmdpbkJlZm9yZUNvbGxhcHNl
c1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmKSBjb25zdDsKKyAgICAgICAgYm9vbCBt
YXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5nTWFyZ2luQWZ0ZXIoY29uc3Qg
Qm94JikgY29uc3Q7CisKKyAgICAgICAgYm9vbCBtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJl
bnRNYXJnaW5BZnRlcihjb25zdCBCb3gmKSBjb25zdDsKKyAgICAgICAgYm9vbCBtYXJnaW5BZnRl
ckNvbGxhcHNlc1dpdGhMYXN0SW5GbG93Q2hpbGRNYXJnaW5BZnRlcihjb25zdCBCb3gmKSBjb25z
dDsKKyAgICAgICAgYm9vbCBtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZv
cmUoY29uc3QgQm94JikgY29uc3Q7CisgICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNX
aXRoTmV4dFNpYmxpbmdNYXJnaW5CZWZvcmUoY29uc3QgQm94JikgY29uc3Q7CisgICAgICAgIGJv
b2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoU2libGluZ01hcmdpbkJlZm9yZVdpdGhDbGVhcmFu
Y2UoY29uc3QgQm94JikgY29uc3Q7CisKKyAgICAgICAgYm9vbCBtYXJnaW5zQ29sbGFwc2VUaHJv
dWdoKGNvbnN0IEJveCYpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIGNs
YXNzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ7CisgICAgICAgIE1hcmdpbkNvbGxhcHNlKGNvbnN0
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsKKworICAgICAgICBlbnVtIGNsYXNzIE1hcmdpblR5
cGUgeyBCZWZvcmUsIEFmdGVyIH07CisgICAgICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRp
dmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBwb3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKGNvbnN0IEJv
eCYsIE1hcmdpblR5cGUpIGNvbnN0OworICAgICAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0
aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShj
b25zdCBCb3gmLCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcykgY29uc3Q7
CisgICAgICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZh
bHVlcyBwb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQWZ0ZXIoY29uc3QgQm94JiwgVXNlZFZlcnRpY2Fs
TWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0OworCisgICAgICAgIFVzZWRWZXJ0aWNh
bE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBwcmVjb21wdXRlZFBvc2l0
aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUoY29uc3QgQm94JiwgVXNlZFZlcnRpY2FsTWFyZ2luOjpO
b25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0OworICAgICAgICBVc2VkVmVydGljYWxNYXJnaW46OlBv
c2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcHJlY29tcHV0ZWRQb3NpdGl2ZU5lZ2F0aXZl
VmFsdWVzKGNvbnN0IEJveCYpIGNvbnN0OworCisgICAgICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6
UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRp
dmVNYXJnaW4oVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFs
dWVzLCBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMp
IGNvbnN0OworICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBtYXJnaW5WYWx1ZShVc2VkVmVy
dGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMpIGNvbnN0OworCisg
ICAgICAgIGJvb2wgaGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYpIGNvbnN0OworCisgICAgICAgIExh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIHsgcmV0dXJuIG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4
dC5sYXlvdXRTdGF0ZSgpOyB9CisgICAgICAgIGNvbnN0IExheW91dFN0YXRlJiBsYXlvdXRTdGF0
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4dC5sYXlvdXRTdGF0ZSgp
OyB9CisgICAgICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250
ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja0Zvcm1hdHRpbmdDb250ZXh0OyB9CisKKyAgICAg
ICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgbV9ibG9ja0Zvcm1hdHRpbmdDb250ZXh0
OworICAgIH07CisgICAgTWFyZ2luQ29sbGFwc2UgbWFyZ2luQ29sbGFwc2UoKSBjb25zdCB7IHJl
dHVybiBNYXJnaW5Db2xsYXBzZSgqdGhpcyk7IH0KKworICAgIGNsYXNzIFF1aXJrcyA6IHB1Ymxp
YyBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFF1aXJr
cyhjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Jik7CisKKyAgICAgICAgYm9vbCBuZWVkc1N0
cmV0Y2hpbmcoY29uc3QgQm94JikgY29uc3Q7CisgICAgICAgIExheW91dFVuaXQgc3RyZXRjaGVk
SW5GbG93SGVpZ2h0KGNvbnN0IEJveCYsIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4pOworCisgICAg
ICAgIGJvb2wgc2hvdWxkSWdub3JlQ29sbGFwc2VkUXVpcmtNYXJnaW4oY29uc3QgQm94JikgY29u
c3Q7CisgICAgICAgIGJvb2wgc2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50TWFy
Z2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OworICAgICAgICBib29sIHNob3VsZENvbGxhcHNl
TWFyZ2luQWZ0ZXJXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94JikgY29uc3Q7CisKKyAg
ICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBj
b25zdCB7IHJldHVybiBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdDb250ZXh0PihGb3JtYXR0aW5n
Q29udGV4dDo6UXVpcmtzOjpmb3JtYXR0aW5nQ29udGV4dCgpKTsgfQorICAgICAgICBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0dXJuIGZvcm1h
dHRpbmdDb250ZXh0KCkuZ2VvbWV0cnkoKTsgfQorCisgICAgfTsKKyAgICBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4gUXVpcmtzKCp0aGlzKTsg
fQorCisgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZEF2YWlsYWJsZVdpZHRoRm9yRmxvYXRB
dm9pZGVyKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0IEJveCYsIGNvbnN0IENvbnN0cmFp
bnRzUGFpciYpOworCisgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdT
dGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEJsb2NrRm9ybWF0dGluZ1N0YXRlPihGb3Jt
YXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9CisgICAgQmxvY2tGb3JtYXR0aW5n
U3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIGRvd25jYXN0PEJsb2NrRm9ybWF0dGlu
Z1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9CisKKyNpZiBB
U1NFUlRfRU5BQkxFRAorICAgIHZvaWQgc2V0UHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoY29uc3Qg
Qm94JiBsYXlvdXRCb3gsIGNvbnN0IFByZWNvbXB1dGVkTWFyZ2luQmVmb3JlJiBwcmVjb21wdXRl
ZE1hcmdpbkJlZm9yZSkgeyBtX3ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlTGlzdC5zZXQoJmxheW91
dEJveCwgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUpOyB9CisgICAgUHJlY29tcHV0ZWRNYXJnaW5C
ZWZvcmUgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0
IHsgcmV0dXJuIG1fcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmVMaXN0LmdldCgmbGF5b3V0Qm94KTsg
fQorICAgIGJvb2wgaGFzUHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRC
b3gpIGNvbnN0IHsgcmV0dXJuIG1fcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmVMaXN0LmNvbnRhaW5z
KCZsYXlvdXRCb3gpOyB9CisjZW5kaWYKK3ByaXZhdGU6CisgICAgSGFzaE1hcDxjb25zdCBCb3gq
LCBQcmVjb21wdXRlZE1hcmdpbkJlZm9yZT4gbV9wcmVjb21wdXRlZE1hcmdpbkJlZm9yZUxpc3Q7
Cit9OworCitpbmxpbmUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Okdlb21ldHJ5
KGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2NrRm9ybWF0dGluZ0NvbnRleHQpCisg
ICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkoYmxvY2tGb3JtYXR0aW5nQ29udGV4dCkK
K3sKK30KKworaW5saW5lIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6UXVpcmtzKGNv
bnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2NrRm9ybWF0dGluZ0NvbnRleHQpCisgICAg
OiBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzKGJsb2NrRm9ybWF0dGluZ0NvbnRleHQpCit7Cit9
CisKK2lubGluZSBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6TWFyZ2lu
Q29sbGFwc2UoY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgYmxvY2tGb3JtYXR0aW5nQ29u
dGV4dCkKKyAgICA6IG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4dChibG9ja0Zvcm1hdHRpbmdDb250
ZXh0KQoreworfQorCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1B
VFRJTkdfQ09OVEVYVChCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LCBpc0Jsb2NrRm9ybWF0dGluZ0Nv
bnRleHQoKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2Vv
bWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9j
a2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li4wYTFhMmI0MTZjNjdkZTVmMjQ1ZDUyYzE1ZGI2MzQzNThkY2NiNWIxCi0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1h
dHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApAQCAtMCwwICsxLDQwMSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkK
KworI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiRm9ybWF0dGlu
Z0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRl
ICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENoaWxkSXRlcmF0b3IuaCIK
KyNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRh
aW5pbmdCbG9jay5oIgorI2luY2x1ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCisjaW5jbHVkZSAi
TG9nZ2luZy5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4g
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd05vblJlcGxhY2VkQ29udGVu
dEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNh
bFZhbHVlcyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKQoreworICAgIEFTU0VSVChsYXlvdXRC
b3guaXNJbkZsb3coKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSk7CisgICAgQVNTRVJU
KGxheW91dEJveC5pc092ZXJmbG93VmlzaWJsZSgpKTsKKworICAgIGF1dG8gY29tcHV0ZSA9IFsm
XShjb25zdCBhdXRvJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIC0+IENvbnRlbnRIZWlnaHRB
bmRNYXJnaW4geworCisgICAgICAgIC8vIDEwLjYuMyBCbG9jay1sZXZlbCBub24tcmVwbGFjZWQg
ZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgd2hlbiAnb3ZlcmZsb3cnIGNvbXB1dGVzIHRvICd2aXNp
YmxlJworICAgICAgICAvLworICAgICAgICAvLyBJZiAnbWFyZ2luLXRvcCcsIG9yICdtYXJnaW4t
Ym90dG9tJyBhcmUgJ2F1dG8nLCB0aGVpciB1c2VkIHZhbHVlIGlzIDAuCisgICAgICAgIC8vIElm
ICdoZWlnaHQnIGlzICdhdXRvJywgdGhlIGhlaWdodCBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGVs
ZW1lbnQgaGFzIGFueSBibG9jay1sZXZlbCBjaGlsZHJlbiBhbmQgd2hldGhlciBpdCBoYXMgcGFk
ZGluZyBvciBib3JkZXJzOgorICAgICAgICAvLyBUaGUgZWxlbWVudCdzIGhlaWdodCBpcyB0aGUg
ZGlzdGFuY2UgZnJvbSBpdHMgdG9wIGNvbnRlbnQgZWRnZSB0byB0aGUgZmlyc3QgYXBwbGljYWJs
ZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAvLyAxLiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhl
IGxhc3QgbGluZSBib3gsIGlmIHRoZSBib3ggZXN0YWJsaXNoZXMgYSBpbmxpbmUgZm9ybWF0dGlu
ZyBjb250ZXh0IHdpdGggb25lIG9yIG1vcmUgbGluZXMKKyAgICAgICAgLy8gMi4gdGhlIGJvdHRv
bSBlZGdlIG9mIHRoZSBib3R0b20gKHBvc3NpYmx5IGNvbGxhcHNlZCkgbWFyZ2luIG9mIGl0cyBs
YXN0IGluLWZsb3cgY2hpbGQsIGlmIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4KKyAgICAgICAg
Ly8gICAgZG9lcyBub3QgY29sbGFwc2Ugd2l0aCB0aGUgZWxlbWVudCdzIGJvdHRvbSBtYXJnaW4K
KyAgICAgICAgLy8gMy4gdGhlIGJvdHRvbSBib3JkZXIgZWRnZSBvZiB0aGUgbGFzdCBpbi1mbG93
IGNoaWxkIHdob3NlIHRvcCBtYXJnaW4gZG9lc24ndCBjb2xsYXBzZSB3aXRoIHRoZSBlbGVtZW50
J3MgYm90dG9tIG1hcmdpbgorICAgICAgICAvLyA0LiB6ZXJvLCBvdGhlcndpc2UKKyAgICAgICAg
Ly8gT25seSBjaGlsZHJlbiBpbiB0aGUgbm9ybWFsIGZsb3cgYXJlIHRha2VuIGludG8gYWNjb3Vu
dCAoaS5lLiwgZmxvYXRpbmcgYm94ZXMgYW5kIGFic29sdXRlbHkgcG9zaXRpb25lZCBib3hlcyBh
cmUgaWdub3JlZCwKKyAgICAgICAgLy8gYW5kIHJlbGF0aXZlbHkgcG9zaXRpb25lZCBib3hlcyBh
cmUgY29uc2lkZXJlZCB3aXRob3V0IHRoZWlyIG9mZnNldCkuIE5vdGUgdGhhdCB0aGUgY2hpbGQg
Ym94IG1heSBiZSBhbiBhbm9ueW1vdXMgYmxvY2sgYm94LgorCisgICAgICAgIGF1dG8mIGJveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwor
ICAgICAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRW
ZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgICAg
IGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBz
ZWRWYWx1ZXMgeyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21w
dXRlZFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsgCisgICAgICAgIGF1dG8gYm9y
ZGVyQW5kUGFkZGluZ1RvcCA9IGJveEdlb21ldHJ5LmJvcmRlclRvcCgpICsgYm94R2VvbWV0cnku
cGFkZGluZ1RvcCgpLnZhbHVlT3IoMCk7CisgICAgICAgIGF1dG8gaGVpZ2h0ID0gb3ZlcnJpZGRl
blZlcnRpY2FsVmFsdWVzLmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQu
dmFsdWUoKSA6IGNvbXB1dGVkSGVpZ2h0KGxheW91dEJveCk7CisKKyAgICAgICAgaWYgKGhlaWdo
dCkKKyAgICAgICAgICAgIHJldHVybiB7ICpoZWlnaHQsIG5vbkNvbGxhcHNlZE1hcmdpbiB9Owor
CisgICAgICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxD
b250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKKyAgICAgICAgICAgIHJl
dHVybiB7IDAsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OworCisgICAgICAgIC8vIDEuIHRoZSBib3R0
b20gZWRnZSBvZiB0aGUgbGFzdCBsaW5lIGJveCwgaWYgdGhlIGJveCBlc3RhYmxpc2hlcyBhIGlu
bGluZSBmb3JtYXR0aW5nIGNvbnRleHQgd2l0aCBvbmUgb3IgbW9yZSBsaW5lcworICAgICAgICBh
dXRvJiBsYXlvdXRDb250YWluZXIgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7
CisgICAgICAgIGlmIChsYXlvdXRDb250YWluZXIuZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCgpKSB7CisgICAgICAgICAgICBhdXRvJiBpbmxpbmVGb3JtYXR0aW5nU3RhdGUgPSBs
YXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkSW5saW5lRm9ybWF0dGluZ1N0YXRlKGxheW91dENvbnRh
aW5lcik7CisgICAgICAgICAgICBhdXRvJiBsaW5lcyA9IGlubGluZUZvcm1hdHRpbmdTdGF0ZS5s
aW5lcygpOworICAgICAgICAgICAgLy8gRXZlbiBlbXB0eSBjb250YWluZXJzIGdlbmVyYXRlIG9u
ZSBsaW5lLiAKKyAgICAgICAgICAgIEFTU0VSVCghbGluZXMuaXNFbXB0eSgpKTsKKyAgICAgICAg
ICAgIHJldHVybiB7IHRvTGF5b3V0VW5pdChsaW5lcy5sYXN0KCkubGluZUJveExvZ2ljYWxSZWN0
KCkuYm90dG9tKCkgKyBpbmxpbmVGb3JtYXR0aW5nU3RhdGUuY2xlYXJHYXBBZnRlckxhc3RMaW5l
KCkpIC0gYm9yZGVyQW5kUGFkZGluZ1RvcCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07CisgICAgICAg
IH0KKworICAgICAgICAvLyAyLiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGJvdHRvbSAocG9zc2li
bHkgY29sbGFwc2VkKSBtYXJnaW4gb2YgaXRzIGxhc3QgaW4tZmxvdyBjaGlsZCwgaWYgdGhlIGNo
aWxkJ3MgYm90dG9tIG1hcmdpbi4uLgorICAgICAgICBhdXRvJiBsYXN0SW5GbG93Q2hpbGQgPSAq
bGF5b3V0Q29udGFpbmVyLmxhc3RJbkZsb3dDaGlsZCgpOworICAgICAgICBpZiAoIWZvcm1hdHRp
bmdDb250ZXh0KCkubWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJl
bnRNYXJnaW5BZnRlcihsYXN0SW5GbG93Q2hpbGQpKSB7CisgICAgICAgICAgICBhdXRvJiBsYXN0
SW5GbG93Qm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxh
c3RJbkZsb3dDaGlsZCk7CisgICAgICAgICAgICBhdXRvIGJvdHRvbUVkZ2VPZkJvdHRvbU1hcmdp
biA9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGxhc3RJbkZsb3dCb3hHZW9tZXRyeSkuYm90
dG9tKCkgKyBsYXN0SW5GbG93Qm94R2VvbWV0cnkubWFyZ2luQWZ0ZXIoKTsKKyAgICAgICAgICAg
IHJldHVybiB7IGJvdHRvbUVkZ2VPZkJvdHRvbU1hcmdpbiAtIGJvcmRlckFuZFBhZGRpbmdUb3As
IG5vbkNvbGxhcHNlZE1hcmdpbiB9OworICAgICAgICB9CisKKyAgICAgICAgLy8gMy4gdGhlIGJv
dHRvbSBib3JkZXIgZWRnZSBvZiB0aGUgbGFzdCBpbi1mbG93IGNoaWxkIHdob3NlIHRvcCBtYXJn
aW4gZG9lc24ndCBjb2xsYXBzZSB3aXRoIHRoZSBlbGVtZW50J3MgYm90dG9tIG1hcmdpbgorICAg
ICAgICBhdXRvKiBpbkZsb3dDaGlsZCA9ICZsYXN0SW5GbG93Q2hpbGQ7CisgICAgICAgIHdoaWxl
IChpbkZsb3dDaGlsZCAmJiBmb3JtYXR0aW5nQ29udGV4dCgpLm1hcmdpbkNvbGxhcHNlKCkubWFy
Z2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKCppbkZsb3dDaGlsZCkpCisg
ICAgICAgICAgICBpbkZsb3dDaGlsZCA9IGluRmxvd0NoaWxkLT5wcmV2aW91c0luRmxvd1NpYmxp
bmcoKTsKKyAgICAgICAgaWYgKGluRmxvd0NoaWxkKSB7CisgICAgICAgICAgICBhdXRvJiBpbkZs
b3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goKmluRmxv
d0NoaWxkKTsKKyAgICAgICAgICAgIHJldHVybiB7IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hUb3Ao
aW5GbG93Qm94R2VvbWV0cnkpICsgaW5GbG93Qm94R2VvbWV0cnkuYm9yZGVyQm94KCkuaGVpZ2h0
KCkgLSBib3JkZXJBbmRQYWRkaW5nVG9wLCBub25Db2xsYXBzZWRNYXJnaW4gfTsKKyAgICAgICAg
fQorCisgICAgICAgIC8vIDQuIHplcm8sIG90aGVyd2lzZQorICAgICAgICByZXR1cm4geyAwLCBu
b25Db2xsYXBzZWRNYXJnaW4gfTsKKyAgICB9OworCisgICAgLy8gMTAuNi43ICdBdXRvJyBoZWln
aHRzIGZvciBibG9jay1sZXZlbCBmb3JtYXR0aW5nIGNvbnRleHQgYm94ZXMuCisgICAgYXV0byBp
c0F1dG9IZWlnaHQgPSAhb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCAmJiAhY29tcHV0
ZWRIZWlnaHQobGF5b3V0Qm94KTsKKyAgICBpZiAoaXNBdXRvSGVpZ2h0ICYmIChsYXlvdXRCb3gu
ZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpICYmICFsYXlvdXRCb3guZXN0YWJsaXNoZXNJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSkKKyAgICAgICAgcmV0dXJuIGNvbXB1dGUoIE92ZXJy
aWRkZW5WZXJ0aWNhbFZhbHVlcyB7IGNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJv
b3QoZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpKSB9KTsKKyAgICByZXR1cm4gY29t
cHV0ZShvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworfQorCitDb250ZW50V2lkdGhBbmRNYXJn
aW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd05vblJlcGxhY2VkQ29u
dGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFs
Q29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6
b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQoreworICAgIEFTU0VSVChs
YXlvdXRCb3guaXNJbkZsb3coKSk7CisKKyAgICBhdXRvIGNvbXB1dGUgPSBbJl0oKSB7CisKKyAg
ICAgICAgLy8gMTAuMy4zIEJsb2NrLWxldmVsLCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9y
bWFsIGZsb3cKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb25zdHJhaW50
cyBtdXN0IGhvbGQgYW1vbmcgdGhlIHVzZWQgdmFsdWVzIG9mIHRoZSBvdGhlciBwcm9wZXJ0aWVz
OgorICAgICAgICAvLyAnbWFyZ2luLWxlZnQnICsgJ2JvcmRlci1sZWZ0LXdpZHRoJyArICdwYWRk
aW5nLWxlZnQnICsgJ3dpZHRoJyArICdwYWRkaW5nLXJpZ2h0JyArICdib3JkZXItcmlnaHQtd2lk
dGgnICsgJ21hcmdpbi1yaWdodCcgPSB3aWR0aCBvZiBjb250YWluaW5nIGJsb2NrCisgICAgICAg
IC8vCisgICAgICAgIC8vIDEuIElmICd3aWR0aCcgaXMgbm90ICdhdXRvJyBhbmQgJ2JvcmRlci1s
ZWZ0LXdpZHRoJyArICdwYWRkaW5nLWxlZnQnICsgJ3dpZHRoJyArICdwYWRkaW5nLXJpZ2h0JyAr
ICdib3JkZXItcmlnaHQtd2lkdGgnIAorICAgICAgICAvLyAgICAocGx1cyBhbnkgb2YgJ21hcmdp
bi1sZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyB0aGF0IGFyZSBub3QgJ2F1dG8nKSBpcyBsYXJnZXIg
dGhhbiB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2ssIHRoZW4KKyAgICAgICAgLy8g
ICAgYW55ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcg
YXJlLCBmb3IgdGhlIGZvbGxvd2luZyBydWxlcywgdHJlYXRlZCBhcyB6ZXJvLgorICAgICAgICAv
LworICAgICAgICAvLyAyLiBJZiBhbGwgb2YgdGhlIGFib3ZlIGhhdmUgYSBjb21wdXRlZCB2YWx1
ZSBvdGhlciB0aGFuICdhdXRvJywgdGhlIHZhbHVlcyBhcmUgc2FpZCB0byBiZSAib3Zlci1jb25z
dHJhaW5lZCIgYW5kIG9uZSBvZiB0aGUgdXNlZCB2YWx1ZXMgd2lsbAorICAgICAgICAvLyAgICBo
YXZlIHRvIGJlIGRpZmZlcmVudCBmcm9tIGl0cyBjb21wdXRlZCB2YWx1ZS4gSWYgdGhlICdkaXJl
Y3Rpb24nIHByb3BlcnR5IG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGhhcyB0aGUgdmFsdWUgJ2x0
cicsIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAgICAgICAgLy8gICAgb2YgJ21hcmdpbi1yaWdodCcg
aXMgaWdub3JlZCBhbmQgdGhlIHZhbHVlIGlzIGNhbGN1bGF0ZWQgc28gYXMgdG8gbWFrZSB0aGUg
ZXF1YWxpdHkgdHJ1ZS4gSWYgdGhlIHZhbHVlIG9mICdkaXJlY3Rpb24nIGlzICdydGwnLAorICAg
ICAgICAvLyAgICB0aGlzIGhhcHBlbnMgdG8gJ21hcmdpbi1sZWZ0JyBpbnN0ZWFkLgorICAgICAg
ICAvLworICAgICAgICAvLyAzLiBJZiB0aGVyZSBpcyBleGFjdGx5IG9uZSB2YWx1ZSBzcGVjaWZp
ZWQgYXMgJ2F1dG8nLCBpdHMgdXNlZCB2YWx1ZSBmb2xsb3dzIGZyb20gdGhlIGVxdWFsaXR5Lgor
ICAgICAgICAvLworICAgICAgICAvLyA0LiBJZiAnd2lkdGgnIGlzIHNldCB0byAnYXV0bycsIGFu
eSBvdGhlciAnYXV0bycgdmFsdWVzIGJlY29tZSAnMCcgYW5kICd3aWR0aCcgZm9sbG93cyBmcm9t
IHRoZSByZXN1bHRpbmcgZXF1YWxpdHkuCisgICAgICAgIC8vCisgICAgICAgIC8vIDUuIElmIGJv
dGggJ21hcmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgYXJlICdhdXRvJywgdGhlaXIgdXNl
ZCB2YWx1ZXMgYXJlIGVxdWFsLiBUaGlzIGhvcml6b250YWxseSBjZW50ZXJzIHRoZSBlbGVtZW50
IHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICAgICAgLy8gICAgZWRnZXMgb2YgdGhlIGNvbnRhaW5p
bmcgYmxvY2suCisKKyAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250
YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7CisgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9j
a1N0eWxlID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCk7CisgICAgICAgIGF1
dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlv
dXRCb3gpOworCisgICAgICAgIGF1dG8gd2lkdGggPSBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVl
cy53aWR0aCA/IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoIDogY29tcHV0ZWRXaWR0
aChsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKyAgICAgICAgYXV0byBjb21wdXRl
ZEhvcml6b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKGxh
eW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICAgICAgVXNlZEhvcml6b250YWxN
YXJnaW4gdXNlZEhvcml6b250YWxNYXJnaW47CisgICAgICAgIGF1dG8gYm9yZGVyTGVmdCA9IGJv
eEdlb21ldHJ5LmJvcmRlckxlZnQoKTsKKyAgICAgICAgYXV0byBib3JkZXJSaWdodCA9IGJveEdl
b21ldHJ5LmJvcmRlclJpZ2h0KCk7CisgICAgICAgIGF1dG8gcGFkZGluZ0xlZnQgPSBib3hHZW9t
ZXRyeS5wYWRkaW5nTGVmdCgpLnZhbHVlT3IoMCk7CisgICAgICAgIGF1dG8gcGFkZGluZ1JpZ2h0
ID0gYm94R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVPcigwKTsKKworICAgICAgICAvLyAj
MQorICAgICAgICBpZiAod2lkdGgpIHsKKyAgICAgICAgICAgIGF1dG8gaG9yaXpvbnRhbFNwYWNl
Rm9yTWFyZ2luID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoY29tcHV0ZWRIb3Jpem9udGFsTWFy
Z2luLnN0YXJ0LnZhbHVlT3IoMCkgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGgg
KyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCArIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5l
bmQudmFsdWVPcigwKSk7CisgICAgICAgICAgICBpZiAoaG9yaXpvbnRhbFNwYWNlRm9yTWFyZ2lu
IDwgMCkKKyAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgY29tcHV0ZWRI
b3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdp
bi5lbmQudmFsdWVPcigwKSB9OworICAgICAgICB9CisKKyAgICAgICAgLy8gIzIKKyAgICAgICAg
aWYgKHdpZHRoICYmIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiBjb21wdXRlZEhv
cml6b250YWxNYXJnaW4uZW5kKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmluZ0Jsb2NrU3R5
bGUuaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgdXNlZEhvcml6
b250YWxNYXJnaW4uc3RhcnQgPSAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0OworICAg
ICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9IGNvbnRhaW5pbmdCbG9ja1dp
ZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdM
ZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQpOworICAgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgPSAqY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZDsKKyAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRh
bE1hcmdpbi5zdGFydCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKGJvcmRlckxlZnQgKyBwYWRk
aW5nTGVmdCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6
b250YWxNYXJnaW4uZW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8v
ICMzCisgICAgICAgIGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmIHdpZHRo
ICYmIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKKyAgICAgICAgICAgIHVzZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kOworICAgICAg
ICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAt
IChib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9y
ZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOworICAgICAgICB9IGVsc2UgaWYg
KGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiAhd2lkdGggJiYgY29tcHV0ZWRIb3Jp
em9udGFsTWFyZ2luLmVuZCkgeworICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4gPSB7
ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQsICpjb21wdXRlZEhvcml6b250YWxNYXJn
aW4uZW5kIH07CisgICAgICAgICAgICB3aWR0aCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVz
ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgcGFk
ZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOworICAg
ICAgICB9IGVsc2UgaWYgKGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiB3aWR0aCAm
JiAhY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgeworICAgICAgICAgICAgdXNlZEhvcml6
b250YWxNYXJnaW4uc3RhcnQgPSAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0OworICAg
ICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGgg
LSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQg
KyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7CisgICAgICAgIH0KKworICAg
ICAgICAvLyAjNAorICAgICAgICBpZiAoIXdpZHRoKSB7CisgICAgICAgICAgICB1c2VkSG9yaXpv
bnRhbE1hcmdpbiA9IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCks
IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OworICAgICAgICAgICAg
d2lkdGggPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFy
dCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0
ICsgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICM1
CisgICAgICAgIGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmICFjb21wdXRl
ZEhvcml6b250YWxNYXJnaW4uZW5kKSB7CisgICAgICAgICAgICBhdXRvIGhvcml6b250YWxTcGFj
ZUZvck1hcmdpbiA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKGJvcmRlckxlZnQgKyBwYWRkaW5n
TGVmdCAgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7CisgICAgICAgICAg
ICB1c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgaG9yaXpvbnRhbFNwYWNlRm9yTWFyZ2luIC8gMiwg
aG9yaXpvbnRhbFNwYWNlRm9yTWFyZ2luIC8gMiB9OworICAgICAgICB9CisKKyAgICAgICAgYXV0
byBzaG91bGRBcHBseUNlbnRlckFsaWduRm9yQmxvY2tDb250ZW50ID0gY29udGFpbmluZ0Jsb2Nr
U3R5bGUudGV4dEFsaWduKCkgPT0gVGV4dEFsaWduTW9kZTo6V2ViS2l0Q2VudGVyICYmIChjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgfHwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVu
ZCk7CisgICAgICAgIGlmIChzaG91bGRBcHBseUNlbnRlckFsaWduRm9yQmxvY2tDb250ZW50KSB7
CisgICAgICAgICAgICBhdXRvIGJvcmRlckJveFdpZHRoID0gKGJvcmRlckxlZnQgKyBwYWRkaW5n
TGVmdCAgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7CisgICAgICAgICAg
ICBhdXRvIG1hcmdpblN0YXJ0ID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVl
T3IoMCk7CisgICAgICAgICAgICBhdXRvIG1hcmdpbkVuZCA9IGNvbXB1dGVkSG9yaXpvbnRhbE1h
cmdpbi5lbmQudmFsdWVPcigwKTsKKyAgICAgICAgICAgIGF1dG8gY2VudGVyZWRMb2dpY2FsTGVm
dEZvck1hcmdpbkJveCA9IHN0ZDo6bWF4KChjb250YWluaW5nQmxvY2tXaWR0aCAtIGJvcmRlckJv
eFdpZHRoIC0gbWFyZ2luU3RhcnQgLSBtYXJnaW5FbmQpIC8gMiwgMF9sdSk7CisgICAgICAgICAg
ICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNlbnRlcmVkTG9naWNhbExlZnRGb3JNYXJn
aW5Cb3ggKyBtYXJnaW5TdGFydDsKKyAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVu
ZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gYm9yZGVyQm94V2lkdGggLSBtYXJnaW5TdGFydCAr
IG1hcmdpbkVuZDsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlQod2lkdGgpOworCisgICAgICAg
IHJldHVybiBDb250ZW50V2lkdGhBbmRNYXJnaW4geyAqd2lkdGgsIHVzZWRIb3Jpem9udGFsTWFy
Z2luIH07CisgICAgfTsKKworICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFyZ2luID0gY29tcHV0
ZSgpOworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFt
IDw8ICJbV2lkdGhdW01hcmdpbl0gLT4gaW5mbG93IG5vbi1yZXBsYWNlZCAtPiB3aWR0aCgiIDw8
IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGggPDwgInB4KSBtYXJnaW4oIiA8PCBj
b250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCA8PCAicHgsICIgPDwgY29udGVu
dFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwg
JmxheW91dEJveCA8PCAiKSIpOworICAgIHJldHVybiBjb250ZW50V2lkdGhBbmRNYXJnaW47Cit9
CisKK0NvbnRlbnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRy
eTo6aW5GbG93UmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gm
IHJlcGxhY2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25z
dHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzKQoreworICAgIEFTU0VSVChyZXBsYWNlZEJveC5pc0luRmxvdygpKTsKKwor
ICAgIC8vIDEwLjMuNCBCbG9jay1sZXZlbCwgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZs
b3cKKyAgICAvLworICAgIC8vIDEuIFRoZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcgaXMgZGV0ZXJt
aW5lZCBhcyBmb3IgaW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLgorICAgIC8vIDIuIFRoZW4gdGhl
IHJ1bGVzIGZvciBub24tcmVwbGFjZWQgYmxvY2stbGV2ZWwgZWxlbWVudHMgYXJlIGFwcGxpZWQg
dG8gZGV0ZXJtaW5lIHRoZSBtYXJnaW5zLgorCisgICAgLy8gIzEKKyAgICBhdXRvIHVzZWRXaWR0
aCA9IGlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jp
em9udGFsQ29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpLmNvbnRl
bnRXaWR0aDsKKyAgICAvLyAjMgorICAgIGF1dG8gbm9uUmVwbGFjZWRXaWR0aEFuZE1hcmdpbiA9
IGluRmxvd05vblJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jp
em9udGFsQ29uc3RyYWludHMsIE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzIHsgdXNlZFdpZHRo
LCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy5tYXJnaW4gfSk7CisKKyAgICBMT0dfV0lUSF9T
VFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1dpZHRoXVtNYXJnaW5d
IC0+IGluZmxvdyByZXBsYWNlZCAtPiB3aWR0aCgiIDw8IHVzZWRXaWR0aCAgPDwgInB4KSBtYXJn
aW4oIiA8PCBub25SZXBsYWNlZFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uc3RhcnQgPDwgInB4
LCAiIDw8IG5vblJlcGxhY2VkV2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgPDwgInB4KSAt
PiBsYXlvdXRCb3goIiA8PCAmcmVwbGFjZWRCb3ggPDwgIikiKTsKKyAgICByZXR1cm4geyB1c2Vk
V2lkdGgsIG5vblJlcGxhY2VkV2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbiB9OworfQorCitMYXlv
dXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNWZXJ0aWNhbFBv
c2l0aW9uKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiB2
ZXJ0aWNhbENvbnN0cmFpbnRzKSBjb25zdAoreworICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9U
Ui9DU1MyMi92aXN1cmVuLmh0bWwjYmxvY2stZm9ybWF0dGluZworICAgIC8vIEluIGEgYmxvY2sg
Zm9ybWF0dGluZyBjb250ZXh0LCBib3hlcyBhcmUgbGFpZCBvdXQgb25lIGFmdGVyIHRoZSBvdGhl
ciwgdmVydGljYWxseSwgYmVnaW5uaW5nIGF0IHRoZSB0b3Agb2YgYSBjb250YWluaW5nIGJsb2Nr
LgorICAgIC8vIFRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzaWJsaW5nIGJveGVz
IGlzIGRldGVybWluZWQgYnkgdGhlICdtYXJnaW4nIHByb3BlcnRpZXMuCisgICAgLy8gVmVydGlj
YWwgbWFyZ2lucyBiZXR3ZWVuIGFkamFjZW50IGJsb2NrLWxldmVsIGJveGVzIGluIGEgYmxvY2sg
Zm9ybWF0dGluZyBjb250ZXh0IGNvbGxhcHNlLgorICAgIGlmIChhdXRvKiBwcmV2aW91c0luRmxv
d1NpYmxpbmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkpIHsKKyAgICAgICAg
YXV0byYgcHJldmlvdXNJbkZsb3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2Vv
bWV0cnlGb3JCb3goKnByZXZpb3VzSW5GbG93U2libGluZyk7CisgICAgICAgIHJldHVybiBCb3hH
ZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChwcmV2aW91c0luRmxvd0JveEdlb21ldHJ5KS5ib3R0b20o
KSArIHByZXZpb3VzSW5GbG93Qm94R2VvbWV0cnkubWFyZ2luQWZ0ZXIoKTsKKyAgICB9CisgICAg
cmV0dXJuIHZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbFRvcDsKK30KKworTGF5b3V0VW5pdCBC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6c3RhdGljSG9yaXpvbnRhbFBvc2l0aW9u
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6
b250YWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIv
Q1NTMjIvdmlzdXJlbi5odG1sI2Jsb2NrLWZvcm1hdHRpbmcKKyAgICAvLyBJbiBhIGJsb2NrIGZv
cm1hdHRpbmcgY29udGV4dCwgZWFjaCBib3gncyBsZWZ0IG91dGVyIGVkZ2UgdG91Y2hlcyB0aGUg
bGVmdCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrIChmb3IgcmlnaHQtdG8tbGVmdCBmb3Jt
YXR0aW5nLCByaWdodCBlZGdlcyB0b3VjaCkuCisgICAgcmV0dXJuIGhvcml6b250YWxDb25zdHJh
aW50cy5sb2dpY2FsTGVmdCArIGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGF5
b3V0Qm94KS5tYXJnaW5TdGFydCgpOworfQorCitQb2ludCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeTo6c3RhdGljUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBWZXJ0aWNh
bENvbnN0cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzKSBjb25zdAoreworICAgIHJldHVybiB7
IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50
cyksIHN0YXRpY1ZlcnRpY2FsUG9zaXRpb24obGF5b3V0Qm94LCB2ZXJ0aWNhbENvbnN0cmFpbnRz
KSB9OworfQorCitDb250ZW50SGVpZ2h0QW5kTWFyZ2luIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
Okdlb21ldHJ5OjppbkZsb3dDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0
Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywg
Y29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMp
Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpKTsKKworICAgIC8vIDEwLjYuMiBJ
bmxpbmUgcmVwbGFjZWQgZWxlbWVudHMsIGJsb2NrLWxldmVsIHJlcGxhY2VkIGVsZW1lbnRzIGlu
IG5vcm1hbCBmbG93LCAnaW5saW5lLWJsb2NrJworICAgIC8vIHJlcGxhY2VkIGVsZW1lbnRzIGlu
IG5vcm1hbCBmbG93IGFuZCBmbG9hdGluZyByZXBsYWNlZCBlbGVtZW50cworICAgIGlmIChsYXlv
dXRCb3guaXNSZXBsYWNlZEJveCgpKQorICAgICAgICByZXR1cm4gaW5saW5lUmVwbGFjZWRDb250
ZW50SGVpZ2h0QW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jp
em9udGFsQ29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKKworICAg
IENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gY29udGVudEhlaWdodEFuZE1hcmdpbjsKKyAgICBpZiAo
bGF5b3V0Qm94LmlzT3ZlcmZsb3dWaXNpYmxlKCkgJiYgIWxheW91dEJveC5pc0RvY3VtZW50Qm94
KCkpIHsKKyAgICAgICAgLy8gVE9ETzogRmlndXJlIG91dCB0aGUgY2FzZSBmb3IgdGhlIGRvY3Vt
ZW50IGVsZW1lbnQuIExldCdzIGp1c3QgY29tcGxpY2F0ZWQtY2FzZSBpdCBmb3Igbm93LgorICAg
ICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50SGVp
Z2h0QW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVu
VmVydGljYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIDEwLjYuNiBDb21wbGlj
YXRlZCBjYXNlcworICAgICAgICAvLyBCbG9jay1sZXZlbCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRz
IGluIG5vcm1hbCBmbG93IHdoZW4gJ292ZXJmbG93JyBkb2VzIG5vdCBjb21wdXRlIHRvICd2aXNp
YmxlJyAoZXhjZXB0IGlmIHRoZSAnb3ZlcmZsb3cnIHByb3BlcnR5J3MgdmFsdWUgaGFzIGJlZW4g
cHJvcGFnYXRlZCB0byB0aGUgdmlld3BvcnQpLgorICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFy
Z2luID0gY29tcGxpY2F0ZWRDYXNlcyhsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywg
b3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKKyAgICB9CisKKyAgICBhdXRvIHF1aXJrcyA9IGZv
cm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCk7CisgICAgaWYgKCFxdWlya3MubmVlZHNTdHJldGNo
aW5nKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBjb250ZW50SGVpZ2h0QW5kTWFyZ2luOwor
CisgICAgY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID0gcXVpcmtzLnN0cmV0
Y2hlZEluRmxvd0hlaWdodChsYXlvdXRCb3gsIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4pOworCisg
ICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltI
ZWlnaHRdW01hcmdpbl0gLT4gaW5mbG93IG5vbi1yZXBsYWNlZCAtPiBzdHJlY2hlZCB0byB2aWV3
cG9ydCAtPiBoZWlnaHQoIiA8PCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQg
PDwgInB4KSBtYXJnaW4oIiA8PCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1h
cmdpbi5iZWZvcmUgPDwgInB4LCAiIDw8IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFw
c2VkTWFyZ2luLmFmdGVyIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAi
KSIpOworICAgIHJldHVybiBjb250ZW50SGVpZ2h0QW5kTWFyZ2luOworfQorCitDb250ZW50V2lk
dGhBbmRNYXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd0NvbnRl
bnRXaWR0aEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9u
dGFsVmFsdWVzJiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKK3sKKyAgICBBU1NFUlQobGF5
b3V0Qm94LmlzSW5GbG93KCkpOworCisgICAgaWYgKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgp
KQorICAgICAgICByZXR1cm4gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4o
bGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFs
dWVzKTsKKyAgICByZXR1cm4gaW5GbG93UmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oZG93
bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgb3Zl
cnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOworfQorCitDb250ZW50V2lkdGhBbmRNYXJnaW4gQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkQ29udGVudFdpZHRoQW5kTWFy
Z2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhv
cml6b250YWxDb25zdHJhaW50cywgT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlV2lkdGhG
bG9hdEF2b2lkZXIpCit7CisgICAgYXV0byBjb21wdXRlID0gWyZdIChhdXRvIGNvbnN0cmFpbnRz
Rm9yV2lkdGgsIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRXaWR0aCkgeworICAgICAgICBpZiAo
bGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCisgICAgICAgICAgICByZXR1cm4gZmxv
YXRpbmdDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBjb25zdHJhaW50c0ZvcldpZHRo
LCB7IHVzZWRXaWR0aCwgeyB9IH0pOworCisgICAgICAgIGlmIChsYXlvdXRCb3guaXNJbkZsb3co
KSkKKyAgICAgICAgICAgIHJldHVybiBpbkZsb3dDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0
Qm94LCBjb25zdHJhaW50c0ZvcldpZHRoLCB7IHVzZWRXaWR0aCwgeyB9IH0pOworCisgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gQ29udGVudFdpZHRoQW5kTWFy
Z2luIHsgfTsKKyAgICB9OworCisgICAgYXV0byBob3Jpem9udGFsQ29uc3RyYWludHNGb3JXaWR0
aCA9IGhvcml6b250YWxDb25zdHJhaW50czsKKyAgICBpZiAobGF5b3V0Qm94LnN0eWxlKCkubG9n
aWNhbFdpZHRoKCkuaXNBdXRvKCkgJiYgYXZhaWxhYmxlV2lkdGhGbG9hdEF2b2lkZXIpIHsKKyAg
ICAgICAgLy8gV2hpbGUgdGhlIG5vbi1hdXRvIHdpZHRoIHZhbHVlcyBzaG91bGQgYWxsIGJlIHJl
c29sdmVkIGFnYWluc3QgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0aCwgd2hlbgorICAgICAg
ICAvLyB0aGUgd2lkdGggaXMgYXV0byB0aGUgYXZhaWxhYmxlIGhvcml6b250YWwgc3BhY2UgaXMg
c2hydW5rIGJ5IG5laWdoYm9yaW5nIGZsb2F0cy4KKyAgICAgICAgaG9yaXpvbnRhbENvbnN0cmFp
bnRzRm9yV2lkdGgubG9naWNhbFdpZHRoID0gKmF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyOwor
ICAgIH0KKyAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUoaG9yaXpvbnRh
bENvbnN0cmFpbnRzRm9yV2lkdGgsIHsgfSk7CisgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGhv
cml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7CisgICAgaWYgKGF1dG8gbWF4V2lkdGgg
PSBjb21wdXRlZE1heFdpZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpKSB7CisgICAgICAg
IGF1dG8gbWF4V2lkdGhBbmRNYXJnaW4gPSBjb21wdXRlKGhvcml6b250YWxDb25zdHJhaW50cywg
bWF4V2lkdGgpOworICAgICAgICBpZiAoY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0
aCA+IG1heFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkKKyAgICAgICAgICAgIGNvbnRlbnRX
aWR0aEFuZE1hcmdpbiA9IG1heFdpZHRoQW5kTWFyZ2luOworICAgIH0KKworICAgIGF1dG8gbWlu
V2lkdGggPSBjb21wdXRlZE1pbldpZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpLnZhbHVl
T3IoMCk7CisgICAgYXV0byBtaW5XaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUoaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCBtaW5XaWR0aCk7CisgICAgaWYgKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250
ZW50V2lkdGggPCBtaW5XaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCisgICAgICAgIGNvbnRl
bnRXaWR0aEFuZE1hcmdpbiA9IG1pbldpZHRoQW5kTWFyZ2luOworICAgIHJldHVybiBjb250ZW50
V2lkdGhBbmRNYXJnaW47Cit9CisKK0Zvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzKGNvbnN0IEJveCYgbGF5b3V0Qm94KQoreworICAgIGF1dG8gZml4ZWRNYXJn
aW5Cb3JkZXJBbmRQYWRkaW5nID0gWyZdKGF1dG8mIGxheW91dEJveCkgeworICAgICAgICBhdXRv
JiBzdHlsZSA9IGxheW91dEJveC5zdHlsZSgpOworICAgICAgICByZXR1cm4gZml4ZWRWYWx1ZShz
dHlsZS5tYXJnaW5TdGFydCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIExheW91dFVuaXQg
eyBzdHlsZS5ib3JkZXJMZWZ0V2lkdGgoKSB9CisgICAgICAgICAgICArIGZpeGVkVmFsdWUoc3R5
bGUucGFkZGluZ0xlZnQoKSkudmFsdWVPcigwKQorICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0
eWxlLnBhZGRpbmdSaWdodCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIExheW91dFVuaXQg
eyBzdHlsZS5ib3JkZXJSaWdodFdpZHRoKCkgfQorICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0
eWxlLm1hcmdpbkVuZCgpKS52YWx1ZU9yKDApOworICAgIH07CisKKyAgICBhdXRvIGNvbXB1dGVk
SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IFsmXSgpIC0+IEludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMgeworICAgICAgICBhdXRvIGxvZ2ljYWxXaWR0aCA9IGxheW91dEJveC5zdHlsZSgpLmxv
Z2ljYWxXaWR0aCgpOworICAgICAgICAvLyBNaW5pbXVtL21heGltdW0gd2lkdGggY2FuJ3QgYmUg
ZGVwZW5kaW5nIG9uIHRoZSBjb250YWluaW5nIGJsb2NrJ3Mgd2lkdGguCisgICAgICAgIGF1dG8g
bmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRoID0gbG9naWNhbFdpZHRoLmlzQ2FsY3Vs
YXRlZCgpIHx8IGxvZ2ljYWxXaWR0aC5pc1BlcmNlbnQoKSB8fCBsb2dpY2FsV2lkdGguaXNSZWxh
dGl2ZSgpOworICAgICAgICBpZiAobmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRoKQor
ICAgICAgICAgICAgcmV0dXJuIHsgfTsKKworICAgICAgICBpZiAoYXV0byB3aWR0aCA9IGZpeGVk
VmFsdWUobG9naWNhbFdpZHRoKSkKKyAgICAgICAgICAgIHJldHVybiB7ICp3aWR0aCwgKndpZHRo
IH07CisKKyAgICAgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpIHsKKyAgICAgICAg
ICAgIGF1dG8mIHJlcGxhY2VkQm94ID0gZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCk7
CisgICAgICAgICAgICBpZiAocmVwbGFjZWRCb3guaGFzSW50cmluc2ljV2lkdGgoKSkgeworICAg
ICAgICAgICAgICAgIGF1dG8gcmVwbGFjZWRXaWR0aCA9IHJlcGxhY2VkQm94LmludHJpbnNpY1dp
ZHRoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVwbGFjZWRXaWR0aCwgcmVwbGFjZWRX
aWR0aCB9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAg
fQorCisgICAgICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2Fz
dDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCisg
ICAgICAgICAgICByZXR1cm4geyB9OworCisgICAgICAgIGlmIChsYXlvdXRCb3guaXNTaXplQ29u
dGFpbm1lbnRCb3goKSkgeworICAgICAgICAgICAgLy8gVGhlIGludHJpbnNpYyBzaXplcyBvZiB0
aGUgc2l6ZSBjb250YWlubWVudCBib3ggYXJlIGRldGVybWluZWQgYXMgaWYgdGhlIGVsZW1lbnQg
aGFkIG5vIGNvbnRlbnQsCisgICAgICAgICAgICAvLyBmb2xsb3dpbmcgdGhlIHNhbWUgbG9naWMg
YXMgd2hlbiBzaXppbmcgYXMgaWYgZW1wdHkuCisgICAgICAgICAgICByZXR1cm4geyB9OworICAg
ICAgICB9CisKKyAgICAgICAgaWYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250
ZXh0KCkpIHsKKyAgICAgICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IExh
eW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGRvd25jYXN0PENvbnRhaW5lckJv
eD4obGF5b3V0Qm94KSwgbGF5b3V0U3RhdGUoKSktPmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25z
dHJhaW50cygpOworICAgICAgICAgICAgaWYgKGxvZ2ljYWxXaWR0aC5pc01pbkNvbnRlbnQoKSkK
KyAgICAgICAgICAgICAgICByZXR1cm4geyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmlt
dW0sIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSB9OworICAgICAgICAgICAgaWYg
KGxvZ2ljYWxXaWR0aC5pc01heENvbnRlbnQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4geyBp
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIGludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMubWF4aW11bSB9OworICAgICAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHM7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMg
PSBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKKyAgICAgICAgYXV0byYgZm9ybWF0dGlu
Z1N0YXRlID0gbGF5b3V0U3RhdGUoKS5mb3JtYXR0aW5nU3RhdGVGb3JCb3gobGF5b3V0Qm94KTsK
KyAgICAgICAgZm9yIChhdXRvJiBjaGlsZCA6IGNoaWxkcmVuT2ZUeXBlPEJveD4oZG93bmNhc3Q8
Q29udGFpbmVyQm94PihsYXlvdXRCb3gpKSkgeworICAgICAgICAgICAgaWYgKGNoaWxkLmlzT3V0
T2ZGbG93UG9zaXRpb25lZCgpIHx8IChjaGlsZC5pc0Zsb2F0QXZvaWRlcigpICYmICFjaGlsZC5o
YXNGbG9hdENsZWFyKCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
YXV0byBjaGlsZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBmb3JtYXR0aW5nU3RhdGUuaW50
cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChjaGlsZCk7CisgICAgICAgICAgICBBU1NFUlQo
Y2hpbGRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKTsKKworICAgICAgICAgICAgaW50cmluc2lj
V2lkdGhDb25zdHJhaW50cy5taW5pbXVtID0gc3RkOjptYXgoaW50cmluc2ljV2lkdGhDb25zdHJh
aW50cy5taW5pbXVtLCBjaGlsZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMtPm1pbmltdW0pOwor
ICAgICAgICAgICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtID0gc3RkOjptYXgo
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtLCBjaGlsZEludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMtPm1heGltdW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzOworICAgIH07CisgICAgLy8gRklYTUUgQ2hlY2sgZm9yIGJveC1zaXpp
bmc6IGJvcmRlci1ib3g7CisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gY29u
c3RyYWluQnlNaW5NYXhXaWR0aChsYXlvdXRCb3gsIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25z
dHJhaW50cygpKTsKKyAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLmV4cGFuZChmaXhlZE1h
cmdpbkJvcmRlckFuZFBhZGRpbmcobGF5b3V0Qm94KSk7CisgICAgcmV0dXJuIGludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHM7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zv
cm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3Mu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjcxYjA4ODQyMDNkYzg2YTY3MzZhYmM4ZWJkYWYyYTVlZjFkNTg2YWUK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApAQCAt
MCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJ
TkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVk
ZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKKyNpbmNsdWRl
ICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmlu
Z0Jsb2NrLmgiCisjaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworbmFtZXNwYWNlIExheW91dCB7CisKK3N0YXRpYyBib29sIGlzUXVpcmtDb250YWluZXIoY29u
c3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgcmV0dXJuIGxheW91dEJveC5pc0JvZHlCb3goKSB8
fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpIHx8IGxheW91dEJveC5pc1RhYmxlQ2VsbCgpOwor
fQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6bmVlZHNTdHJldGNoaW5n
KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNJ
bkZsb3coKSk7CisgICAgLy8gSW4gcXVpcmtzIG1vZGUsIGluLWZsb3cgYm9keSBhbmQgaHRtbCBz
dHJldGNoIHRvIHRoZSBpbml0aWFsIGNvbnRhaW5pbmcgYmxvY2sgKGhlaWdodDogYXV0byBvbmx5
KS4KKyAgICBpZiAoIWxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGlmICghbGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSAmJiAhbGF5b3V0
Qm94LmlzQm9keUJveCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gbGF5
b3V0Qm94LnN0eWxlKCkubG9naWNhbEhlaWdodCgpLmlzQXV0bygpOworfQorCitMYXlvdXRVbml0
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6c3RyZXRjaGVkSW5GbG93SGVpZ2h0KGNv
bnN0IEJveCYgbGF5b3V0Qm94LCBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGNvbnRlbnRIZWlnaHRB
bmRNYXJnaW4pCit7CisgICAgQVNTRVJUKG5lZWRzU3RyZXRjaGluZyhsYXlvdXRCb3gpKTsKKyAg
ICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7Cisg
ICAgYXV0byBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiA9IGNvbnRlbnRIZWlnaHRBbmRNYXJn
aW4ubm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSArIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9u
Q29sbGFwc2VkTWFyZ2luLmFmdGVyOworCisgICAgaWYgKGxheW91dEJveC5pc0RvY3VtZW50Qm94
KCkpIHsKKyAgICAgICAgLy8gTGV0J3Mgc3RyZXRjaCB0aGUgaW5mbG93IGRvY3VtZW50IGJveCg8
aHRtbD4pIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGluaXRpYWwgY29udGFpbmluZyBibG9jayAodmll
dykuCisgICAgICAgIGF1dG8gZG9jdW1lbnRCb3hDb250ZW50SGVpZ2h0ID0gZm9ybWF0dGluZ0Nv
bnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LmluaXRpYWxDb250YWluaW5nQmxvY2soKSwg
RXNjYXBlUmVhc29uOjpEb2N1bWVudEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaykuY29udGVu
dEJveEhlaWdodCgpOworICAgICAgICAvLyBEb2N1bWVudCBib3gncyBvd24gdmVydGljYWwgbWFy
Z2luL2JvcmRlci9wYWRkaW5nIHZhbHVlcyBhbHdheXMgc2hyaW5rIHRoZSBjb250ZW50IGhlaWdo
dC4KKyAgICAgICAgYXV0byYgZG9jdW1lbnRCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0
Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAgICAgIGRvY3VtZW50Qm94Q29udGVudEhl
aWdodCAtPSBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiArIGRvY3VtZW50Qm94R2VvbWV0cnku
dmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCku
dmFsdWVPcigwKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KGNvbnRlbnRIZWlnaHRBbmRNYXJn
aW4uY29udGVudEhlaWdodCwgIGRvY3VtZW50Qm94Q29udGVudEhlaWdodCk7CisgICAgfQorCisg
ICAgLy8gSGVyZSBpcyB0aGUgcXVpcmt5IHBhcnQgZm9yIGJvZHkgYm94IHdoZW4gaXQgc3RyZXRj
aGVzIGFsbCB0aGUgd2F5IHRvIHRoZSBJQ0IgZXZlbiB3aGVuIHRoZSBkb2N1bWVudCBib3ggZG9l
cyBub3QgKGUuZy4gb3V0LW9mLWZsb3cgcG9zaXRpb25lZCkuCisgICAgQVNTRVJUKGxheW91dEJv
eC5pc0JvZHlCb3goKSk7CisgICAgYXV0byYgaW5pdGlhbENvbnRhaW5pbmdCbG9jayA9IGxheW91
dEJveC5pbml0aWFsQ29udGFpbmluZ0Jsb2NrKCk7CisgICAgYXV0byYgaW5pdGlhbENvbnRhaW5p
bmdCbG9ja0dlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goaW5pdGlh
bENvbnRhaW5pbmdCbG9jaywgRXNjYXBlUmVhc29uOjpCb2R5U3RyZXRjaGVzVG9WaWV3cG9ydFF1
aXJrKTsKKyAgICAvLyBTdGFydCB0aGUgY29udGVudCBoZWlnaHQgd2l0aCB0aGUgSUNCLgorICAg
IGF1dG8gYm9keUJveENvbnRlbnRIZWlnaHQgPSBpbml0aWFsQ29udGFpbmluZ0Jsb2NrR2VvbWV0
cnkuY29udGVudEJveEhlaWdodCgpOworICAgIC8vIEJvZHkgYm94J3Mgb3duIGJvcmRlciBhbmQg
cGFkZGluZyBzaHJpbmsgdGhlIGNvbnRlbnQgaGVpZ2h0LgorICAgIGF1dG8mIGJvZHlCb3hHZW9t
ZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAg
Ym9keUJveENvbnRlbnRIZWlnaHQgLT0gYm9keUJveEdlb21ldHJ5LnZlcnRpY2FsQm9yZGVyKCkg
KyBib2R5Qm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKKyAgICAvLyBC
b2R5IGJveCBuZXZlciBjb2xsYXBzZXMgaXRzIHZlcnRpY2FsIG1hcmdpbnMgd2l0aCB0aGUgZG9j
dW1lbnQgYm94IGJ1dCBpdCBtaWdodCBjb2xsYXBzZSBpdHMgbWFyZ2luIHdpdGggaXRzIGRlc2Nl
bmRhbnRzLgorICAgIGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0gY29udGVudEhlaWdodEFuZE1h
cmdpbi5ub25Db2xsYXBzZWRNYXJnaW47CisgICAgYXV0byBjb2xsYXBzZWRNYXJnaW4gPSBmb3Jt
YXR0aW5nQ29udGV4dC5tYXJnaW5Db2xsYXBzZSgpLmNvbGxhcHNlZFZlcnRpY2FsVmFsdWVzKGxh
eW91dEJveCwgbm9uQ29sbGFwc2VkTWFyZ2luKS5jb2xsYXBzZWRWYWx1ZXM7CisgICAgYXV0byB1
c2VkVmVydGljYWxNYXJnaW4gPSBjb2xsYXBzZWRNYXJnaW4uYmVmb3JlLnZhbHVlT3Iobm9uQ29s
bGFwc2VkTWFyZ2luLmJlZm9yZSk7CisgICAgdXNlZFZlcnRpY2FsTWFyZ2luICs9IGNvbGxhcHNl
ZE1hcmdpbi5pc0NvbGxhcHNlZFRocm91Z2ggPyBub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIgOiBj
b2xsYXBzZWRNYXJnaW4uYWZ0ZXIudmFsdWVPcihub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIpOwor
ICAgIGJvZHlCb3hDb250ZW50SGVpZ2h0IC09IHVzZWRWZXJ0aWNhbE1hcmdpbjsKKyAgICAvLyBE
b2N1bWVudCBib3gncyBwYWRkaW5nIGFuZCBib3JkZXIgYWxzbyBzaHJpbmsgdGhlIGJvZHkgYm94
J3MgY29udGVudCBoZWlnaHQuCisgICAgYXV0byYgZG9jdW1lbnRCb3ggPSBsYXlvdXRCb3gucGFy
ZW50KCk7CisgICAgYXV0byYgZG9jdW1lbnRCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0
Lmdlb21ldHJ5Rm9yQm94KGRvY3VtZW50Qm94LCBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNU
b1ZpZXdwb3J0UXVpcmspOworICAgIGJvZHlCb3hDb250ZW50SGVpZ2h0IC09IGRvY3VtZW50Qm94
R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxQ
YWRkaW5nKCkudmFsdWVPcigwKTsKKyAgICAvLyBIb3dldmVyIHRoZSBub24taW4tZmxvdyBkb2N1
bWVudCBib3gncyB2ZXJ0aWNhbCBtYXJnaW5zIGFyZSBpZ25vcmVkLiBUaGV5IGRvbid0IGFmZmVj
dCB0aGUgYm9keSBib3gncyBjb250ZW50IGhlaWdodC4KKyAgICBpZiAoZG9jdW1lbnRCb3guaXNJ
bkZsb3coKSkgeworICAgICAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2VvbWV0cnkoKTsKKyAg
ICAgICAgYXV0byBwcmVjb21wdXRlRG9jdW1lbnRCb3hWZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5
LmNvbXB1dGVkVmVydGljYWxNYXJnaW4oZG9jdW1lbnRCb3gsIGdlb21ldHJ5LmNvbnN0cmFpbnRz
Rm9ySW5GbG93Q29udGVudChpbml0aWFsQ29udGFpbmluZ0Jsb2NrLCBFc2NhcGVSZWFzb246OkJv
ZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspLmhvcml6b250YWwpOworICAgICAgICBib2R5Qm94
Q29udGVudEhlaWdodCAtPSBwcmVjb21wdXRlRG9jdW1lbnRCb3hWZXJ0aWNhbE1hcmdpbi5iZWZv
cmUudmFsdWVPcigwKSArIHByZWNvbXB1dGVEb2N1bWVudEJveFZlcnRpY2FsTWFyZ2luLmFmdGVy
LnZhbHVlT3IoMCk7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1heChjb250ZW50SGVpZ2h0QW5k
TWFyZ2luLmNvbnRlbnRIZWlnaHQsICBib2R5Qm94Q29udGVudEhlaWdodCk7Cit9CisKK2Jvb2wg
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpzaG91bGRJZ25vcmVDb2xsYXBzZWRRdWly
a01hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICByZXR1cm4gbGF5b3V0
U3RhdGUoKS5pblF1aXJrc01vZGUoKSAmJiBpc1F1aXJrQ29udGFpbmVyKGxheW91dEJveCk7Cit9
CisKK2VudW0gY2xhc3MgVmVydGljYWxNYXJnaW4geyBCZWZvcmUsIEFmdGVyIH07CitzdGF0aWMg
aW5saW5lIGJvb2wgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBWZXJ0aWNhbE1hcmdpbiB2ZXJ0aWNhbE1hcmdpbikKK3sKKyAgICBpZiAoIWxheW91dEJveC5p
c0luRmxvdygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgYXV0byYgc3R5bGUgPSBsYXlv
dXRCb3guc3R5bGUoKTsKKyAgICByZXR1cm4gKHZlcnRpY2FsTWFyZ2luID09IFZlcnRpY2FsTWFy
Z2luOjpCZWZvcmUgJiYgc3R5bGUuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSkgfHwgKHZlcnRpY2Fs
TWFyZ2luID09IFZlcnRpY2FsTWFyZ2luOjpBZnRlciAmJiBzdHlsZS5oYXNNYXJnaW5BZnRlclF1
aXJrKCkpOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6c2hvdWxk
Q29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5
b3V0Qm94KSBjb25zdAoreworICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgp
ICYmIGhhc1F1aXJrTWFyZ2luVG9Db2xsYXBzZShsYXlvdXRCb3gsIFZlcnRpY2FsTWFyZ2luOjpC
ZWZvcmUpICYmIGlzUXVpcmtDb250YWluZXIobGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpKTsK
K30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OnNob3VsZENvbGxhcHNl
TWFyZ2luQWZ0ZXJXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkgJiYgaGFzUXVp
cmtNYXJnaW5Ub0NvbGxhcHNlKGxheW91dEJveCwgVmVydGljYWxNYXJnaW46OkFmdGVyKSAmJiBp
c1F1aXJrQ29udGFpbmVyKGxheW91dEJveC5jb250YWluaW5nQmxvY2soKSk7Cit9CisKK30KK30K
KworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zv
cm1hdHRpbmdTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjc0YTUwZmY2OTEzYWQxMmEwOGQ1MmUzOTAy
NzU5MTA3N2YyMzM1YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmNw
cApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1B
VFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxM
T0NBVEVEX0lNUEwoQmxvY2tGb3JtYXR0aW5nU3RhdGUpOworCitCbG9ja0Zvcm1hdHRpbmdTdGF0
ZTo6QmxvY2tGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYgZmxvYXRpbmdTdGF0
ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQorICAgIDogRm9ybWF0dGluZ1N0YXRlKFdURk1v
dmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OkJsb2NrLCBsYXlvdXRTdGF0ZSkKK3sKK30KKworQmxv
Y2tGb3JtYXR0aW5nU3RhdGU6On5CbG9ja0Zvcm1hdHRpbmdTdGF0ZSgpCit7Cit9CisKK30KK30K
KyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250
ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0
dGluZ1N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMWU2Y2Q2MTlkZDMxNmY1OWIzZjQwOWJmMzVkNzA5NmQ5
ZmI3YzhiMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmgKQEAgLTAs
MCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
CisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9V
VF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUuaCIKKyNp
bmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL1dlYWtIYXNoU2V0Lmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCisvLyBCbG9ja0Zvcm1h
dHRpbmdTdGF0ZSBob2xkcyB0aGUgc3RhdGUgZm9yIGEgcGFydGljdWxhciBibG9jayBmb3JtYXR0
aW5nIGNvbnRleHQgdHJlZS4KK2NsYXNzIEJsb2NrRm9ybWF0dGluZ1N0YXRlIDogcHVibGljIEZv
cm1hdHRpbmdTdGF0ZSB7CisgICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChCbG9ja0Zvcm1hdHRp
bmdTdGF0ZSk7CitwdWJsaWM6CisgICAgQmxvY2tGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5n
U3RhdGU+JiYsIExheW91dFN0YXRlJik7CisgICAgfkJsb2NrRm9ybWF0dGluZ1N0YXRlKCk7CisK
KyAgICB2b2lkIHNldFVzZWRWZXJ0aWNhbE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29u
c3QgVXNlZFZlcnRpY2FsTWFyZ2luJiB1c2VkVmVydGljYWxNYXJnaW4pIHsgbV91c2VkVmVydGlj
YWxNYXJnaW5zLnNldCgmbGF5b3V0Qm94LCB1c2VkVmVydGljYWxNYXJnaW4pOyB9CisgICAgVXNl
ZFZlcnRpY2FsTWFyZ2luIHVzZWRWZXJ0aWNhbE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCkg
Y29uc3QgeyByZXR1cm4gbV91c2VkVmVydGljYWxNYXJnaW5zLmdldCgmbGF5b3V0Qm94KTsgfQor
ICAgIGJvb2wgaGFzVXNlZFZlcnRpY2FsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25z
dCB7IHJldHVybiBtX3VzZWRWZXJ0aWNhbE1hcmdpbnMuY29udGFpbnMoJmxheW91dEJveCk7IH0K
KworICAgIHZvaWQgc2V0SGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSB7IG1fY2xl
YXJhbmNlU2V0LmFkZChsYXlvdXRCb3gpOyB9CisgICAgdm9pZCBjbGVhckhhc0NsZWFyYW5jZShj
b25zdCBCb3gmIGxheW91dEJveCkgeyBtX2NsZWFyYW5jZVNldC5yZW1vdmUobGF5b3V0Qm94KTsg
fQorICAgIGJvb2wgaGFzQ2xlYXJhbmNlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdCB7IHJl
dHVybiBtX2NsZWFyYW5jZVNldC5jb250YWlucyhsYXlvdXRCb3gpOyB9CisKK3ByaXZhdGU6Cisg
ICAgSGFzaE1hcDxjb25zdCBCb3gqLCBVc2VkVmVydGljYWxNYXJnaW4+IG1fdXNlZFZlcnRpY2Fs
TWFyZ2luczsKKyAgICBXZWFrSGFzaFNldDxjb25zdCBCb3g+IG1fY2xlYXJhbmNlU2V0OworfTsK
KworfQorfQorCitTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX1NUQVRF
KEJsb2NrRm9ybWF0dGluZ1N0YXRlLCBpc0Jsb2NrRm9ybWF0dGluZ1N0YXRlKCkpCisKKyNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9i
bG9ja2Zvcm1hdHRpbmcvQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja01hcmdpbkNvbGxh
cHNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5mMWZkNWJiZTIyYTFhYjkyZTg1MWQ4NTBkZTBmNGE2YWQxODcx
MGRiCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAKQEAgLTAsMCAr
MSw2MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
CisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgor
ICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NP
TlRFWFQpCisKKyNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkZs
b2F0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNs
dWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNs
dWRlICJMYXlvdXRVbml0LmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3N0YXRpYyBib29sIGhhc0JvcmRlcihj
b25zdCBCb3JkZXJWYWx1ZSYgYm9yZGVyVmFsdWUpCit7CisgICAgaWYgKGJvcmRlclZhbHVlLnN0
eWxlKCkgPT0gQm9yZGVyU3R5bGU6Ok5vbmUgfHwgYm9yZGVyVmFsdWUuc3R5bGUoKSA9PSBCb3Jk
ZXJTdHlsZTo6SGlkZGVuKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuICEhYm9y
ZGVyVmFsdWUud2lkdGgoKTsKK30KKworc3RhdGljIGJvb2wgaGFzUGFkZGluZyhjb25zdCBMZW5n
dGgmIHBhZGRpbmdWYWx1ZSkKK3sKKyAgICAvLyBGSVhNRTogQ2hlY2sgaWYgcGVyY2VudCB2YWx1
ZSBuZWVkcyB0byBiZSByZXNvbHZlZC4KKyAgICByZXR1cm4gIXBhZGRpbmdWYWx1ZS5pc1plcm8o
KTsKK30KKworc3RhdGljIGJvb2wgaGFzQm9yZGVyQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94
KQoreworICAgIHJldHVybiBoYXNCb3JkZXIobGF5b3V0Qm94LnN0eWxlKCkuYm9yZGVyQmVmb3Jl
KCkpOworfQorCitzdGF0aWMgYm9vbCBoYXNCb3JkZXJBZnRlcihjb25zdCBCb3gmIGxheW91dEJv
eCkKK3sKKyAgICByZXR1cm4gaGFzQm9yZGVyKGxheW91dEJveC5zdHlsZSgpLmJvcmRlckFmdGVy
KCkpOworfQorCitzdGF0aWMgYm9vbCBoYXNQYWRkaW5nQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0
Qm94KQoreworICAgIHJldHVybiBoYXNQYWRkaW5nKGxheW91dEJveC5zdHlsZSgpLnBhZGRpbmdC
ZWZvcmUoKSk7Cit9CisKK3N0YXRpYyBib29sIGhhc1BhZGRpbmdBZnRlcihjb25zdCBCb3gmIGxh
eW91dEJveCkKK3sKKyAgICByZXR1cm4gaGFzUGFkZGluZyhsYXlvdXRCb3guc3R5bGUoKS5wYWRk
aW5nQWZ0ZXIoKSk7Cit9CisKK3N0YXRpYyBib29sIGVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5n
Q29udGV4dChjb25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICAvLyBXZWJLaXQgdHJlYXRzIHRo
ZSBkb2N1bWVudCBlbGVtZW50IHJlbmRlcmVyIGFzIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0
IHJvb3QuIEl0IHByb2JhYmx5IG9ubHkgaW1wYWN0cyBtYXJnaW4gY29sbGFwc2luZywgc28gbGV0
J3Mgbm90IGRvCisgICAgLy8gYSBsYXlvdXQgd2lkZSBxdWlyayBvbiB0aGlzIGZvciBub3cuCisg
ICAgaWYgKGxheW91dEJveC5pc0RvY3VtZW50Qm94KCkpCisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIHJldHVybiBsYXlvdXRCb3guZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCk7
Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Omhhc0Ns
ZWFyYW5jZShjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBpZiAoIWxheW91dEJv
eC5oYXNGbG9hdENsZWFyKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBGSVhNRTog
cHJlY29tcHV0ZWRWZXJ0aWNhbFBvc2l0aW9uRm9yRm9ybWF0dGluZ1Jvb3QgbG9naWMgZW5kcyB1
cCBjYWxsaW5nIGludG8gdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBsYXlvdXRCb3ggKGZpcnN0IGlu
ZmxvdyBjaGlsZCkgaGFzCisgICAgLy8gbm90IGJlZW4gbGFpZCBvdXQuCisgICAgcmV0dXJuIGZv
cm1hdHRpbmdDb250ZXh0KCkuZm9ybWF0dGluZ1N0YXRlKCkuaGFzQ2xlYXJhbmNlKGxheW91dEJv
eCk7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1h
cmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91
dEJveCkgY29uc3QKK3sKKyAgICAvLyAxLiBUaGlzIGlzIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQg
YW5kIGl0cyBtYXJnaW5zIGNvbGxhcHNlIHRocm91Z2ggYW5kIHRoZSBtYXJnaW4gYWZ0ZXIgY29s
bGFwc2VzIHdpdGggcGFyZW50J3MgbWFyZ2luIGFmdGVyIG9yCisgICAgLy8gMi4gVGhpcyBib3gn
cyBtYXJnaW4gYWZ0ZXIgY29sbGFwc2VzIHdpdGggdGhlIG5leHQgc2libGluZydzIG1hcmdpbiBi
ZWZvcmUgYW5kIHRoYXQgc2libGluZyBjb2xsYXBzZXMgdGhyb3VnaCBhbmQKKyAgICAvLyB3ZSBj
YW4gZ2V0IHRvIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgbGlrZSB0aGF0LgorICAgIGF1dG8qIGxh
c3RJbkZsb3dDaGlsZCA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5sYXN0SW5GbG93Q2hp
bGQoKTsKKyAgICBmb3IgKGF1dG8qIGN1cnJlbnRCb3ggPSAmbGF5b3V0Qm94OyBjdXJyZW50Qm94
OyBjdXJyZW50Qm94ID0gY3VycmVudEJveC0+bmV4dEluRmxvd1NpYmxpbmcoKSkgeworICAgICAg
ICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKmN1cnJlbnRCb3gpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoY3VycmVudEJveCA9PSBsYXN0SW5GbG93Q2hpbGQp
CisgICAgICAgICAgICByZXR1cm4gbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2lu
QWZ0ZXIoKmN1cnJlbnRCb3gpOyAKKyAgICAgICAgaWYgKCFtYXJnaW5BZnRlckNvbGxhcHNlc1dp
dGhOZXh0U2libGluZ01hcmdpbkJlZm9yZSgqY3VycmVudEJveCkpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBm
YWxzZTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6
bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxh
eW91dEJveCkgY29uc3QKK3sKKyAgICAvLyBUaGUgZmlyc3QgaW5mbG93IGNoaWxkIGNvdWxkIHBy
b3BhZ2F0ZSBpdHMgdG9wIG1hcmdpbiB0byBwYXJlbnQuCisgICAgLy8gaHR0cHM6Ly93d3cudzMu
b3JnL1RSL0NTUzIxL2JveC5odG1sI2NvbGxhcHNpbmctbWFyZ2lucworICAgIEFTU0VSVChsYXlv
dXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworCisgICAgaWYgKGZvcm1hdHRpbmdDb250ZXh0KCku
cXVpcmtzKCkuc2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50TWFyZ2luQmVmb3Jl
KGxheW91dEJveCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gTWFyZ2lucyBiZXR3
ZWVuIGEgZmxvYXRlZCBib3ggYW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxhcHNlLgorICAg
IGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgLy8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8g
bm90IGNvbGxhcHNlLgorICAgIGlmIChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE1hcmdpbnMgb2YgaW5saW5lLWJsb2Nr
IGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KKyAgICBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxvY2tC
b3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gT25seSB0aGUgZmlyc3QgaW5s
ZmxvdyBjaGlsZCBjb2xsYXBzZXMgd2l0aCBwYXJlbnQuCisgICAgaWYgKGxheW91dEJveC5wcmV2
aW91c0luRmxvd1NpYmxpbmcoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYXV0byYg
Y29udGFpbmluZ0Jsb2NrID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOworICAgIC8vIE1h
cmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29u
dGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJlbgorICAgIGlm
IChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmluZ0Jsb2NrKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGhhc0JvcmRlckJlZm9yZShjb250YWluaW5n
QmxvY2spKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaGFzUGFkZGluZ0JlZm9y
ZShjb250YWluaW5nQmxvY2spKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyAuLi5h
bmQgdGhlIGNoaWxkIGhhcyBubyBjbGVhcmFuY2UuCisgICAgaWYgKGhhc0NsZWFyYW5jZShsYXlv
dXRCb3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
Ym9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVmb3Jl
Q29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0
Qm94KSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwor
CisgICAgaWYgKCFsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9ICpsYXlvdXRC
b3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7CisgICAgLy8gTWFyZ2lucyBiZXR3ZWVuIGEgZmxv
YXRlZCBib3ggYW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxhcHNlLgorICAgIGlmIChsYXlv
dXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSB8fCBwcmV2aW91c0luRmxvd1NpYmxpbmcuaXNG
bG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTWFy
Z2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgorICAg
IGlmICgobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guc3R5
bGUoKS50b3AoKS5pc0F1dG8oKSkKKyAgICAgICAgfHwgKHByZXZpb3VzSW5GbG93U2libGluZy5p
c091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhcHJldmlvdXNJbkZsb3dTaWJsaW5nLnN0eWxlKCku
Ym90dG9tKCkuaXNBdXRvKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBNYXJn
aW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCisgICAgaWYgKGxheW91
dEJveC5pc0lubGluZUJsb2NrQm94KCkgfHwgcHJldmlvdXNJbkZsb3dTaWJsaW5nLmlzSW5saW5l
QmxvY2tCb3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlIGJvdHRvbSBt
YXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jay1sZXZlbCBlbGVtZW50IGFsd2F5cyBjb2xsYXBzZXMg
d2l0aCB0aGUgdG9wIG1hcmdpbiBvZgorICAgIC8vIGl0cyBuZXh0IGluLWZsb3cgYmxvY2stbGV2
ZWwgc2libGluZywgdW5sZXNzIHRoYXQgc2libGluZyBoYXMgY2xlYXJhbmNlLgorICAgIGlmICho
YXNDbGVhcmFuY2UobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFw
c2U6Om1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxkTWFyZ2luQmVmb3Jl
KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNC
bG9ja0xldmVsQm94KCkpOworICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxp
c2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhl
aXIgaW4tZmxvdyBjaGlsZHJlbi4KKyAgICBpZiAoZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0KGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFRoZSB0
b3AgbWFyZ2luIG9mIGFuIGluLWZsb3cgYmxvY2sgZWxlbWVudCBjb2xsYXBzZXMgd2l0aCBpdHMg
Zmlyc3QgaW4tZmxvdyBibG9jay1sZXZlbAorICAgIC8vIGNoaWxkJ3MgdG9wIG1hcmdpbiBpZiB0
aGUgZWxlbWVudCBoYXMgbm8gdG9wIGJvcmRlci4uLgorICAgIGlmIChoYXNCb3JkZXJCZWZvcmUo
bGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gLi4ubm8gdG9wIHBh
ZGRpbmcKKyAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShsYXlvdXRCb3gpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSB8fCAhZG93
bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxvd0NoaWxkKCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGF1dG8mIGZpcnN0SW5GbG93Q2hpbGQgPSAqZG93bmNhc3Q8
Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93Q2hpbGQoKTsKKyAgICBpZiAoIWZp
cnN0SW5GbG93Q2hpbGQuaXNCbG9ja0xldmVsQm94KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIC8vIC4uLmFuZCB0aGUgY2hpbGQgaGFzIG5vIGNsZWFyYW5jZS4KKyAgICBpZiAoaGFz
Q2xlYXJhbmNlKGZpcnN0SW5GbG93Q2hpbGQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCisgICAg
aWYgKGZpcnN0SW5GbG93Q2hpbGQuaXNJbmxpbmVCbG9ja0JveCgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoU2libGluZ01hcmdp
bkJlZm9yZVdpdGhDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAg
Ly8gSWYgdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgb2YgYW4gZWxlbWVudCB3aXRoIGNsZWFy
YW5jZSBhcmUgYWRqb2luaW5nLCBpdHMgbWFyZ2lucyBjb2xsYXBzZSB3aXRoIHRoZSBhZGpvaW5p
bmcgbWFyZ2lucworICAgIC8vIG9mIGZvbGxvd2luZyBzaWJsaW5ncyBidXQgdGhhdCByZXN1bHRp
bmcgbWFyZ2luIGRvZXMgbm90IGNvbGxhcHNlIHdpdGggdGhlIGJvdHRvbSBtYXJnaW4gb2YgdGhl
IHBhcmVudCBibG9jay4KKyAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2gobGF5b3V0Qm94
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChhdXRvKiBwcmV2aW91c1NpYmxp
bmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7IHByZXZpb3VzU2libGluZzsg
cHJldmlvdXNTaWJsaW5nID0gcHJldmlvdXNTaWJsaW5nLT5wcmV2aW91c0luRmxvd1NpYmxpbmco
KSkgeworICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKnByZXZpb3VzU2libGlu
ZykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChoYXNDbGVhcmFuY2Uo
KnByZXZpb3VzU2libGluZykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAg
cmV0dXJuIGZhbHNlOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNv
bGxhcHNlOjptYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUoY29uc3Qg
Qm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgLy8gMS4gVGhpcyBpcyB0aGUgZmlyc3QgaW4t
ZmxvdyBjaGlsZCBhbmQgaXRzIG1hcmdpbnMgY29sbGFwc2UgdGhyb3VnaCBhbmQgdGhlIG1hcmdp
biBiZWZvcmUgY29sbGFwc2VzIHdpdGggcGFyZW50J3MgbWFyZ2luIGJlZm9yZSBvcgorICAgIC8v
IDIuIFRoaXMgYm94J3MgbWFyZ2luIGJlZm9yZSBjb2xsYXBzZXMgd2l0aCB0aGUgcHJldmlvdXMg
c2libGluZydzIG1hcmdpbiBhZnRlciBhbmQgdGhhdCBzaWJsaW5nIGNvbGxhcHNlcyB0aHJvdWdo
IGFuZAorICAgIC8vIHdlIGNhbiBnZXQgdG8gdGhlIGZpcnN0IGluLWZsb3cgY2hpbGQgbGlrZSB0
aGF0LgorICAgIGF1dG8qIGZpcnN0SW5GbG93Q2hpbGQgPSBsYXlvdXRCb3guY29udGFpbmluZ0Js
b2NrKCkuZmlyc3RJbkZsb3dDaGlsZCgpOworICAgIGZvciAoYXV0byogY3VycmVudEJveCA9ICZs
YXlvdXRCb3g7IGN1cnJlbnRCb3g7IGN1cnJlbnRCb3ggPSBjdXJyZW50Qm94LT5wcmV2aW91c0lu
Rmxvd1NpYmxpbmcoKSkgeworICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKmN1
cnJlbnRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoY3VycmVu
dEJveCA9PSBmaXJzdEluRmxvd0NoaWxkKQorICAgICAgICAgICAgcmV0dXJuIG1hcmdpbkJlZm9y
ZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUoKmN1cnJlbnRCb3gpOyAKKyAgICAgICAg
aWYgKCFtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5nTWFyZ2luQWZ0ZXIo
KmN1cnJlbnRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBh
cmVudE1hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIEFTU0VS
VChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworCisgICAgaWYgKGZvcm1hdHRpbmdDb250
ZXh0KCkucXVpcmtzKCkuc2hvdWxkQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhQYXJlbnRNYXJnaW5B
ZnRlcihsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE1hcmdpbnMg
YmV0d2VlbiBhIGZsb2F0ZWQgYm94IGFuZCBhbnkgb3RoZXIgYm94IGRvIG5vdCBjb2xsYXBzZS4K
KyAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIC8vIE1hcmdpbnMgb2YgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJveGVz
IGRvIG5vdCBjb2xsYXBzZS4KKyAgICBpZiAobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25l
ZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1i
bG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCisgICAgaWYgKGxheW91dEJveC5pc0lubGluZUJs
b2NrQm94KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE9ubHkgdGhlIGxhc3Qg
aW5sZmxvdyBjaGlsZCBjb2xsYXBzZXMgd2l0aCBwYXJlbnQuCisgICAgaWYgKGxheW91dEJveC5u
ZXh0SW5GbG93U2libGluZygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBhdXRvJiBj
b250YWluaW5nQmxvY2sgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7CisgICAgLy8gTWFy
Z2lucyBvZiBlbGVtZW50cyB0aGF0IGVzdGFibGlzaCBuZXcgYmxvY2sgZm9ybWF0dGluZyBjb250
ZXh0cyBkbyBub3QgY29sbGFwc2Ugd2l0aCB0aGVpciBpbi1mbG93IGNoaWxkcmVuLgorICAgIGlm
IChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmluZ0Jsb2NrKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4t
ZmxvdyBibG9jayBib3ggd2l0aCBhICdoZWlnaHQnIG9mICdhdXRvJyBjb2xsYXBzZXMgd2l0aCBp
dHMgbGFzdCBpbi1mbG93IGJsb2NrLWxldmVsIGNoaWxkJ3MgYm90dG9tIG1hcmdpbiwgaWY6Cisg
ICAgaWYgKCFjb250YWluaW5nQmxvY2suc3R5bGUoKS5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIHBhZGRpbmcs
IGFuZAorICAgIGlmIChoYXNQYWRkaW5nQWZ0ZXIoY29udGFpbmluZ0Jsb2NrKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIGJvcmRlciwgYW5k
CisgICAgaWYgKGhhc0JvcmRlckFmdGVyKGNvbnRhaW5pbmdCbG9jaykpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIC8vIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4gbmVpdGhlciBjb2xs
YXBzZXMgd2l0aCBhIHRvcCBtYXJnaW4gdGhhdCBoYXMgY2xlYXJhbmNlLi4uCisgICAgaWYgKG1h
cmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGxh
eW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIG5vciAoaWYgdGhlIGJv
eCdzIG1pbi1oZWlnaHQgaXMgbm9uLXplcm8pIHdpdGggdGhlIGJveCdzIHRvcCBtYXJnaW4uCisg
ICAgYXV0byBjb21wdXRlZE1pbkhlaWdodCA9IGNvbnRhaW5pbmdCbG9jay5zdHlsZSgpLmxvZ2lj
YWxNaW5IZWlnaHQoKTsKKyAgICBpZiAoIWNvbXB1dGVkTWluSGVpZ2h0LmlzQXV0bygpICYmIGNv
bXB1dGVkTWluSGVpZ2h0LnZhbHVlKCkgJiYgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50
TWFyZ2luQmVmb3JlKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJl
dHVybiB0cnVlOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxh
cHNlOjptYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhMYXN0SW5GbG93Q2hpbGRNYXJnaW5BZnRlcihj
b25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxv
Y2tMZXZlbEJveCgpKTsKKworICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxp
c2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhl
aXIgaW4tZmxvdyBjaGlsZHJlbi4KKyAgICBpZiAoZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0KGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghaXM8
Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91
dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYXV0
byYgbGFzdEluRmxvd0NoaWxkID0gKmRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5s
YXN0SW5GbG93Q2hpbGQoKTsKKyAgICBpZiAoIWxhc3RJbkZsb3dDaGlsZC5pc0Jsb2NrTGV2ZWxC
b3goKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4g
b2YgYW4gaW4tZmxvdyBibG9jayBib3ggd2l0aCBhICdoZWlnaHQnIG9mICdhdXRvJyBjb2xsYXBz
ZXMgd2l0aCBpdHMgbGFzdCBpbi1mbG93IGJsb2NrLWxldmVsIGNoaWxkJ3MgYm90dG9tIG1hcmdp
biwgaWY6CisgICAgaWYgKCFsYXlvdXRCb3guc3R5bGUoKS5oZWlnaHQoKS5pc0F1dG8oKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIHBhZGRp
bmcsIGFuZAorICAgIGlmIChoYXNQYWRkaW5nQWZ0ZXIobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIGJvcmRlciwgYW5kCisg
ICAgaWYgKGhhc0JvcmRlckFmdGVyKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIC8vIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4gbmVpdGhlciBjb2xsYXBzZXMgd2l0
aCBhIHRvcCBtYXJnaW4gdGhhdCBoYXMgY2xlYXJhbmNlLi4uCisgICAgaWYgKG1hcmdpbkFmdGVy
Q29sbGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGxhc3RJbkZsb3dD
aGlsZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIG5vciAoaWYgdGhlIGJveCdz
IG1pbi1oZWlnaHQgaXMgbm9uLXplcm8pIHdpdGggdGhlIGJveCdzIHRvcCBtYXJnaW4uCisgICAg
YXV0byBjb21wdXRlZE1pbkhlaWdodCA9IGxheW91dEJveC5zdHlsZSgpLmxvZ2ljYWxNaW5IZWln
aHQoKTsKKyAgICBpZiAoIWNvbXB1dGVkTWluSGVpZ2h0LmlzQXV0bygpICYmIGNvbXB1dGVkTWlu
SGVpZ2h0LnZhbHVlKCkKKyAgICAgICAgJiYgKG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVu
dE1hcmdpbkJlZm9yZShsYXN0SW5GbG93Q2hpbGQpIHx8IGhhc0NsZWFyYW5jZShsYXN0SW5GbG93
Q2hpbGQpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTWFyZ2lucyBvZiBpbmxp
bmUtYmxvY2sgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgorICAgIGlmIChsYXN0SW5GbG93Q2hpbGQu
aXNJbmxpbmVCbG9ja0JveCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUaGlz
IGlzIGEgcXVpcmsgYmVoYXZpb3I6IFdoZW4gdGhlIG1hcmdpbiBhZnRlciBvZiB0aGUgbGFzdCBp
bmZsb3cgY2hpbGQgKG9yIGEgcHJldmlvdXMgc2libGluZyB3aXRoIGNvbGxhcHNlZCB0aHJvdWdo
IG1hcmdpbnMpCisgICAgLy8gY29sbGFwc2VzIHdpdGggYSBxdWlyayBwYXJlbnQncyB0aGUgbWFy
Z2luIGJlZm9yZSwgdGhlbiB0aGUgc2FtZSBtYXJnaW4gYWZ0ZXIgZG9lcyBub3QgY29sbGFwc2Vz
IHdpdGggdGhlIHBhcmVudCdzIG1hcmdpbiBhZnRlci4KKyAgICBpZiAoZm9ybWF0dGluZ0NvbnRl
eHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihsYXlvdXRCb3gp
ICYmIG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXN0SW5GbG93
Q2hpbGQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
Ym9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQWZ0ZXJD
b2xsYXBzZXNXaXRoTmV4dFNpYmxpbmdNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gp
IGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7CisKKyAg
ICBpZiAoIWxheW91dEJveC5uZXh0SW5GbG93U2libGluZygpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICByZXR1cm4gbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGlu
Z01hcmdpbkFmdGVyKCpsYXlvdXRCb3gubmV4dEluRmxvd1NpYmxpbmcoKSk7Cit9CisKK2Jvb2wg
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbnNDb2xsYXBzZVRo
cm91Z2goY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJv
eC5pc0Jsb2NrTGV2ZWxCb3goKSk7CisKKyAgICAvLyBBIGJveCdzIG93biBtYXJnaW5zIGNvbGxh
cHNlIGlmIHRoZSAnbWluLWhlaWdodCcgcHJvcGVydHkgaXMgemVybywgYW5kIGl0IGhhcyBuZWl0
aGVyIHRvcCBvciBib3R0b20gYm9yZGVycyBub3IgdG9wIG9yIGJvdHRvbSBwYWRkaW5nLAorICAg
IC8vIGFuZCBpdCBoYXMgYSAnaGVpZ2h0JyBvZiBlaXRoZXIgMCBvciAnYXV0bycsIGFuZCBpdCBk
b2VzIG5vdCBjb250YWluIGEgbGluZSBib3gsIGFuZCBhbGwgb2YgaXRzIGluLWZsb3cgY2hpbGRy
ZW4ncyBtYXJnaW5zIChpZiBhbnkpIGNvbGxhcHNlLgorICAgIGlmIChoYXNCb3JkZXJCZWZvcmUo
bGF5b3V0Qm94KSB8fCBoYXNCb3JkZXJBZnRlcihsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShsYXlvdXRCb3gpIHx8IGhhc1BhZGRp
bmdBZnRlcihsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBNYXJn
aW5zIGFyZSBub3QgYWRqb2luaW5nIHdoZW4gdGhlIGJveCBoYXMgY2xlYXJhbmNlLgorICAgIGlm
IChoYXNDbGVhcmFuY2UobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
YXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICBhdXRvIGNvbXB1dGVkSGVpZ2h0
VmFsdWVJc1plcm8gPSBzdHlsZS5oZWlnaHQoKS5pc0ZpeGVkKCkgJiYgIXN0eWxlLmhlaWdodCgp
LnZhbHVlKCk7CisgICAgaWYgKCEoc3R5bGUuaGVpZ2h0KCkuaXNBdXRvKCkgfHwgY29tcHV0ZWRI
ZWlnaHRWYWx1ZUlzWmVybykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEZJWE1F
OiBDaGVjayBmb3IgY29tcHV0ZWQgMCBoZWlnaHQuCisgICAgaWYgKCFzdHlsZS5taW5IZWlnaHQo
KS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6IEJsb2Nr
IHJlcGxhY2VkIGJveGVzIGNsZWFybHkgZG9uJ3QgY29sbGFwc2UgdGhyb3VnaCB0aGVpciBtYXJn
aW5zLCBidXQgSSBjb3VsZG4ndCBmaW5kIGl0IGluIHRoZSBzcGVjIHlldCAoYW5kIG5vLCBpdCdz
IG5vdCBhIHF1aXJrKS4KKyAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkp
CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFkb3duY2FzdDxDb250YWluZXJCb3g+
KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKKyAgICAgICAgcmV0dXJuICFlc3RhYmxpc2hl
c0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQobGF5b3V0Qm94KTsKKworICAgIGlmIChsYXlvdXRCb3gu
ZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKSB7CisgICAgICAgIGlmIChsYXlvdXRCb3gu
ZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7CisgICAgICAgICAgICBhdXRv
JiBsYXlvdXRTdGF0ZSA9IHRoaXMtPmxheW91dFN0YXRlKCk7CisgICAgICAgICAgICAvLyBJZiB3
ZSBnZXQgaGVyZSB0aHJvdWdoIG1hcmdpbiBlc3RpbWF0aW9uLCB3ZSBkb24ndCBuZWNlc3Nhcmls
eSBoYXZlIGFuIGFjdHVhbCBzdGF0ZSBmb3IgdGhpcyBsYXlvdXQgYm94IHNpbmNlCisgICAgICAg
ICAgICAvLyB3ZSBoYXZlbid0IHN0YXJ0ZWQgbGF5aW5nIGl0IG91dCB5ZXQuCisgICAgICAgICAg
ICBhdXRvJiBjb250YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7
CisgICAgICAgICAgICBpZiAoIWxheW91dFN0YXRlLmhhc0lubGluZUZvcm1hdHRpbmdTdGF0ZShj
b250YWluZXJCb3gpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAg
ICAgYXV0byBpc0NvbnNpZGVyZWRFbXB0eSA9IFsmXSB7CisgICAgICAgICAgICAgICAgYXV0byYg
aW5saW5lRm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUuZXN0YWJsaXNoZWRJbmxpbmVGb3Jt
YXR0aW5nU3RhdGUoY29udGFpbmVyQm94KTsKKyAgICAgICAgICAgICAgICBpZiAoIWlubGluZUZv
cm1hdHRpbmdTdGF0ZS5saW5lcygpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIC8vIEFueSBmbG9hdCBib3ggaW4gdGhpcyBmb3Jt
YXR0aW5nIGNvbnRleHQgcHJldmVudHMgY29sbGFwc2luZyB0aHJvdWdoLgorICAgICAgICAgICAg
ICAgIGF1dG8mIGZsb2F0cyA9IGlubGluZUZvcm1hdHRpbmdTdGF0ZS5mbG9hdGluZ1N0YXRlKCku
ZmxvYXRzKCk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBmbG9hdEl0ZW0gOiBmbG9hdHMp
IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZsb2F0SXRlbS5pc0luRm9ybWF0dGluZ0NvbnRl
eHRPZihjb250YWluZXJCb3gpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgICAgIH07CisgICAgICAgICAgICByZXR1cm4gaXNDb25zaWRlcmVkRW1wdHkoKTsKKyAgICAg
ICAgfQorCisgICAgICAgIC8vIEEgcm9vdCBvZiBhIG5vbi1pbmxpbmUgZm9ybWF0dGluZyBjb250
ZXh0ICh0YWJsZSwgZmxleCBldGMpIHdpdGggaW5mbG93IGRlc2NlbmRhbnRzIHNob3VsZCBub3Qg
Y29sbGFwc2UgdGhyb3VnaC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZv
ciAoYXV0byogaW5mbG93Q2hpbGQgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCku
Zmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsgaW5mbG93Q2hpbGQ7IGluZmxvd0NoaWxkID0g
aW5mbG93Q2hpbGQtPm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7CisgICAgICAgIGlm
IChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKmluZmxvd0NoaWxkKSkKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFtYXJnaW5zQ29sbGFwc2VUaHJvdWdo
KCppbmZsb3dDaGlsZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJl
dHVybiB0cnVlOworfQorCitVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQ
YWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OmNvbXB1
dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZl
QW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgYSwgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFu
ZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIGIpIGNvbnN0Cit7CisgICAgVXNlZFZlcnRpY2FsTWFyZ2lu
OjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIGNvbXB1dGVkVmFsdWVzOworICAgIGlm
IChhLnBvc2l0aXZlICYmIGIucG9zaXRpdmUpCisgICAgICAgIGNvbXB1dGVkVmFsdWVzLnBvc2l0
aXZlID0gc3RkOjptYXgoKmEucG9zaXRpdmUsICpiLnBvc2l0aXZlKTsKKyAgICBlbHNlCisgICAg
ICAgIGNvbXB1dGVkVmFsdWVzLnBvc2l0aXZlID0gYS5wb3NpdGl2ZSA/IGEucG9zaXRpdmUgOiBi
LnBvc2l0aXZlOworCisgICAgaWYgKGEubmVnYXRpdmUgJiYgYi5uZWdhdGl2ZSkKKyAgICAgICAg
Y29tcHV0ZWRWYWx1ZXMubmVnYXRpdmUgPSBzdGQ6Om1pbigqYS5uZWdhdGl2ZSwgKmIubmVnYXRp
dmUpOworICAgIGVsc2UKKyAgICAgICAgY29tcHV0ZWRWYWx1ZXMubmVnYXRpdmUgPSBhLm5lZ2F0
aXZlID8gYS5uZWdhdGl2ZSA6IGIubmVnYXRpdmU7CisKKyAgICBpZiAoYS5pc05vblplcm8oKSAm
JiBiLmlzTm9uWmVybygpKQorICAgICAgICBjb21wdXRlZFZhbHVlcy5pc1F1aXJrID0gYS5pc1F1
aXJrIHx8IGIuaXNRdWlyazsKKyAgICBlbHNlIGlmIChhLmlzTm9uWmVybygpKQorICAgICAgICBj
b21wdXRlZFZhbHVlcy5pc1F1aXJrID0gYS5pc1F1aXJrOworICAgIGVsc2UKKyAgICAgICAgY29t
cHV0ZWRWYWx1ZXMuaXNRdWlyayA9IGIuaXNRdWlyazsKKworICAgIHJldHVybiBjb21wdXRlZFZh
bHVlczsKK30KKworT3B0aW9uYWw8TGF5b3V0VW5pdD4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6
TWFyZ2luQ29sbGFwc2U6Om1hcmdpblZhbHVlKFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVB
bmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBtYXJnaW5WYWx1ZXMpIGNvbnN0Cit7CisgICAgLy8gV2hl
biB0d28gb3IgbW9yZSBtYXJnaW5zIGNvbGxhcHNlLCB0aGUgcmVzdWx0aW5nIG1hcmdpbiB3aWR0
aCBpcyB0aGUgbWF4aW11bSBvZiB0aGUgY29sbGFwc2luZyBtYXJnaW5zJyB3aWR0aHMuCisgICAg
Ly8gSW4gdGhlIGNhc2Ugb2YgbmVnYXRpdmUgbWFyZ2lucywgdGhlIG1heGltdW0gb2YgdGhlIGFi
c29sdXRlIHZhbHVlcyBvZiB0aGUgbmVnYXRpdmUgYWRqb2luaW5nIG1hcmdpbnMgaXMgZGVkdWN0
ZWQgZnJvbSB0aGUgbWF4aW11bQorICAgIC8vIG9mIHRoZSBwb3NpdGl2ZSBhZGpvaW5pbmcgbWFy
Z2lucy4gSWYgdGhlcmUgYXJlIG5vIHBvc2l0aXZlIG1hcmdpbnMsIHRoZSBtYXhpbXVtIG9mIHRo
ZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGFkam9pbmluZyBtYXJnaW5zIGlzIGRlZHVjdGVkIGZy
b20gemVyby4KKyAgICBpZiAoIW1hcmdpblZhbHVlcy5uZWdhdGl2ZSkKKyAgICAgICAgcmV0dXJu
IG1hcmdpblZhbHVlcy5wb3NpdGl2ZTsKKworICAgIGlmICghbWFyZ2luVmFsdWVzLnBvc2l0aXZl
KQorICAgICAgICByZXR1cm4gbWFyZ2luVmFsdWVzLm5lZ2F0aXZlOworCisgICAgcmV0dXJuICpt
YXJnaW5WYWx1ZXMucG9zaXRpdmUgKyAqbWFyZ2luVmFsdWVzLm5lZ2F0aXZlOworfQorCit2b2lk
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjp1cGRhdGVNYXJnaW5BZnRl
ckZvclByZXZpb3VzU2libGluZyhCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBibG9ja0Zvcm1hdHRp
bmdDb250ZXh0LCBjb25zdCBNYXJnaW5Db2xsYXBzZSYgbWFyZ2luQ29sbGFwc2UsIGNvbnN0IEJv
eCYgbGF5b3V0Qm94KQoreworICAgIC8vIDEuIEdldCB0aGUgbWFyZ2luIGJlZm9yZSB2YWx1ZSBm
cm9tIHRoZSBuZXh0IGluLWZsb3cgc2libGluZy4gVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGlzIGJv
eCdzIG1hcmdpbiBhZnRlciB2YWx1ZSBub3cgc2luY2UgdGhleSBhcmUgY29sbGFwc2VkLgorICAg
IC8vIDIuIFVwZGF0ZSB0aGUgY29sbGFwc2VkIG1hcmdpbiBhZnRlciB2YWx1ZSBhcyB3ZWxsIGFz
IHRoZSBwb3NpdGl2ZS9uZWdhdGl2ZSBjYWNoZS4KKyAgICAvLyAzLiBDaGVjayBpZiB0aGUgYm94
J3MgbWFyZ2lucyBjb2xsYXBzZSB0aHJvdWdoLgorICAgIC8vIDQuIElmIHNvLCB1cGRhdGUgdGhl
IHBvc2l0aXZlL25lZ2F0aXZlIGNhY2hlLgorICAgIC8vIDUuIEluIGNhc2Ugb2YgY29sbGFwc2Vk
IHRocm91Z2ggbWFyZ2lucyBjaGVjayBpZiB0aGUgYmVmb3JlIG1hcmdpbiBjb2xsYXBlcyB3aXRo
IHRoZSBwcmV2aW91cyBpbmZsb3cgc2libGluZydzIGFmdGVyIG1hcmdpbi4KKyAgICAvLyA2LiBJ
ZiBzbywganVtcCB0byAjMi4KKyAgICAvLyA3LiBObyBuZWVkIHRvIHByb3BhZ2F0ZSB0byBwYXJl
bnQgYmVjYXVzZSBpdHMgbWFyZ2luIGlzIG5vdCBjb21wdXRlZCB5ZXQgKHByZS1jb21wdXRlZCBh
dCBtb3N0KS4KKyAgICBhdXRvKiBjdXJyZW50Qm94ID0gJmxheW91dEJveDsKKyAgICBhdXRvJiBi
bG9ja0Zvcm1hdHRpbmdTdGF0ZSA9IGJsb2NrRm9ybWF0dGluZ0NvbnRleHQuZm9ybWF0dGluZ1N0
YXRlKCk7CisgICAgd2hpbGUgKG1hcmdpbkNvbGxhcHNlLm1hcmdpbkJlZm9yZUNvbGxhcHNlc1dp
dGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVudEJveCkpIHsKKyAgICAgICAgYXV0
byYgcHJldmlvdXNTaWJsaW5nID0gKmN1cnJlbnRCb3gtPnByZXZpb3VzSW5GbG93U2libGluZygp
OworICAgICAgICBhdXRvIHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luID0gYmxvY2tGb3Jt
YXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKHByZXZpb3VzU2libGluZyk7CisKKyAgICAg
ICAgYXV0byBjb2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkJlZm9yZSA9IHByZXZpb3VzU2libGluZ1Zl
cnRpY2FsTWFyZ2luLmNvbGxhcHNlZFZhbHVlcy5iZWZvcmU7CisgICAgICAgIGF1dG8gY29sbGFw
c2VkVmVydGljYWxNYXJnaW5BZnRlciA9IGJsb2NrRm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlG
b3JCb3goKmN1cnJlbnRCb3gpLm1hcmdpbkJlZm9yZSgpOworCisgICAgICAgIGF1dG8gbWFyZ2lu
c0NvbGxhcHNlVGhyb3VnaCA9IG1hcmdpbkNvbGxhcHNlLm1hcmdpbnNDb2xsYXBzZVRocm91Z2go
cHJldmlvdXNTaWJsaW5nKTsKKyAgICAgICAgaWYgKG1hcmdpbnNDb2xsYXBzZVRocm91Z2gpCisg
ICAgICAgICAgICBjb2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkJlZm9yZSA9IGNvbGxhcHNlZFZlcnRp
Y2FsTWFyZ2luQWZ0ZXI7CisKKyAgICAgICAgLy8gVXBkYXRlIHBvc2l0aXZlL25lZ2F0aXZlIGNh
Y2hlLgorICAgICAgICBhdXRvIHByZXZpb3VzU2libGluZ1Bvc2l0aXZlTmVnYXRpdmVNYXJnaW4g
PSBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNTaWJsaW5n
KS5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzOworICAgICAgICBhdXRvIHBvc2l0aXZlTmVnYXRp
dmVNYXJnaW5CZWZvcmUgPSBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4o
KmN1cnJlbnRCb3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlOworCisgICAgICAg
IGF1dG8gYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbiA9IHByZXZpb3VzU2li
bGluZ1ZlcnRpY2FsTWFyZ2luOworICAgICAgICBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRp
Y2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0ZXIgPSBtYXJnaW5Db2xsYXBz
ZS5jb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4ocG9zaXRpdmVOZWdhdGl2ZU1hcmdp
bkJlZm9yZSwgcHJldmlvdXNTaWJsaW5nUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbi5hZnRlcik7Cisg
ICAgICAgIGlmIChtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKSB7CisgICAgICAgICAgICBhZGp1c3Rl
ZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMu
YmVmb3JlID0gbWFyZ2luQ29sbGFwc2UuY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2lu
KHByZXZpb3VzU2libGluZ1Bvc2l0aXZlTmVnYXRpdmVNYXJnaW4uYmVmb3JlLCBhZGp1c3RlZFBy
ZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0
ZXIpOworICAgICAgICAgICAgYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbi5w
b3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmFmdGVyID0gYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdW
ZXJ0aWNhbE1hcmdpbi5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmJlZm9yZTsKKyAgICAgICAg
fQorICAgICAgICBibG9ja0Zvcm1hdHRpbmdTdGF0ZS5zZXRVc2VkVmVydGljYWxNYXJnaW4ocHJl
dmlvdXNTaWJsaW5nLCBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luKTsKKwor
ICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2gpCisgICAgICAgICAgICBicmVhazsK
KworICAgICAgICBjdXJyZW50Qm94ID0gJnByZXZpb3VzU2libGluZzsKKyAgICB9Cit9CisKK1Vz
ZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdhdGl2ZVZhbHVlcyhj
b25zdCBCb3gmIGxheW91dEJveCwgTWFyZ2luVHlwZSBtYXJnaW5UeXBlKSBjb25zdAoreworICAg
IGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZm9ybWF0dGluZ1N0
YXRlKCk7CisgICAgLy8gQnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUgaW4gQkZDIGxheW91dCB0byBn
YXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZm9yIGVpdGhlciBhIHBy
ZXZpb3VzIHNpYmxpbmcgb3IgYSBjaGlsZCBib3gsCisgICAgLy8gd2UgbXVzaCBoYXZlIGNvbXB1
dGVkIGFuZCBjYWNoZWQgdGhvc2UgdmFsdWVzLgorICAgIEFTU0VSVChmb3JtYXR0aW5nU3RhdGUu
aGFzVXNlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCkpOworICAgIGF1dG8gcG9zaXRpdmVBbmRO
ZWdhdGl2ZVZlcnRpY2FsTWFyZ2luID0gZm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdp
bihsYXlvdXRCb3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXM7CisgICAgcmV0dXJuIG1hcmdp
blR5cGUgPT0gTWFyZ2luVHlwZTo6QmVmb3JlID8gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2Fs
TWFyZ2luLmJlZm9yZSA6IHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5hZnRlcjsg
Cit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVl
cyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdhdGl2
ZU1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpO
b25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAoreworICAgIGF1dG8g
Zmlyc3RDaGlsZENvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1h
cmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7CisgICAgICAgIGlmICghbWFy
Z2luQmVmb3JlQ29sbGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJnaW5CZWZvcmUobGF5b3V0
Qm94KSkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgIHJldHVybiBwb3NpdGl2ZU5l
Z2F0aXZlVmFsdWVzKCpkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZs
b3dDaGlsZCgpLCBNYXJnaW5UeXBlOjpCZWZvcmUpOworICAgIH07CisKKyAgICBhdXRvIHByZXZp
b3VTaWJsaW5nQ29sbGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGljYWxNYXJn
aW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgeworICAgICAgICBpZiAoIW1hcmdp
bkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcihsYXlvdXRCb3gp
KQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgcmV0dXJuIHBvc2l0aXZlTmVnYXRp
dmVWYWx1ZXMoKmxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSwgTWFyZ2luVHlwZTo6
QWZ0ZXIpOworICAgIH07CisKKyAgICAvLyAxLiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZl
IG1hcmdpbiB2YWx1ZXMgZnJvbSBmaXJzdCBjaGlsZCBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcu
CisgICAgLy8gMi4gR2F0aGVyIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWVzIGZy
b20gcHJldmlvdXMgaW5mbG93IHNpYmxpbmcgaWYgbWFyZ2lucyBhcmUgYWRqb2luaW5nLgorICAg
IC8vIDMuIENvbXB1dGUgbWluL21heCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgY29sbGFwc2VkIG1h
cmdpbiB2YWx1ZXMgdXNpbmcgbm9uLWNvbGxwYXNlZCBjb21wdXRlZCBtYXJnaW4gYmVmb3JlLgor
ICAgIGF1dG8gY29sbGFwc2VkTWFyZ2luQmVmb3JlID0gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0
aXZlTWFyZ2luKGZpcnN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5CZWZvcmUoKSwgcHJldmlvdVNpYmxp
bmdDb2xsYXBzZWRNYXJnaW5BZnRlcigpKTsKKyAgICBpZiAoY29sbGFwc2VkTWFyZ2luQmVmb3Jl
LmlzUXVpcmsgJiYgZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVDb2xs
YXBzZWRRdWlya01hcmdpbihsYXlvdXRCb3gpKQorICAgICAgICBjb2xsYXBzZWRNYXJnaW5CZWZv
cmUgPSB7IH07CisKKyAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQ
YWlyOjpWYWx1ZXMgbm9uQ29sbGFwc2VkQmVmb3JlOworICAgIGlmIChub25Db2xsYXBzZWRWYWx1
ZXMuYmVmb3JlID4gMCkKKyAgICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0geyBub25Db2xsYXBz
ZWRWYWx1ZXMuYmVmb3JlLCB7IH0sIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkJlZm9yZVF1
aXJrKCkgfTsKKyAgICBlbHNlIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlIDwgMCkKKyAg
ICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0geyB7IH0sIG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZv
cmUsIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkgfTsKKworICAgIHJl
dHVybiBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4oY29sbGFwc2VkTWFyZ2luQmVm
b3JlLCBub25Db2xsYXBzZWRCZWZvcmUpOworfQorCitVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0
aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2lu
Q29sbGFwc2U6OnBvc2l0aXZlTmVnYXRpdmVNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJv
eCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFs
dWVzKSBjb25zdAoreworICAgIGF1dG8gbGFzdENoaWxkQ29sbGFwc2VkTWFyZ2luQWZ0ZXIgPSBb
Jl0oKSAtPiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1
ZXMgeworICAgICAgICBpZiAoIW1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aExhc3RJbkZsb3dDaGls
ZE1hcmdpbkFmdGVyKGxheW91dEJveCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAg
ICByZXR1cm4gcG9zaXRpdmVOZWdhdGl2ZVZhbHVlcygqZG93bmNhc3Q8Q29udGFpbmVyQm94Pihs
YXlvdXRCb3gpLmxhc3RJbkZsb3dDaGlsZCgpLCBNYXJnaW5UeXBlOjpBZnRlcik7CisgICAgfTsK
KworICAgIC8vIFdlIGRvbid0IGtub3cgeWV0IHRoZSBtYXJnaW4gYmVmb3JlIHZhbHVlIG9mIHRo
ZSBuZXh0IHNpYmxpbmcuIExldCdzIGp1c3QgcHJldGVuZCBpdCBkb2VzIG5vdCBoYXZlIG9uZSBh
bmQgCisgICAgLy8gdXBkYXRlIGl0IGxhdGVyIHdoZW4gd2UgY29tcHV0ZSB0aGUgbmV4dCBzaWJs
aW5nJ3MgbWFyZ2luIGJlZm9yZS4gU2VlIHVwZGF0ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJs
aW5nLgorICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZh
bHVlcyBub25Db2xsYXBzZWRBZnRlcjsKKyAgICBpZiAobm9uQ29sbGFwc2VkVmFsdWVzLmFmdGVy
ID4gMCkKKyAgICAgICAgbm9uQ29sbGFwc2VkQWZ0ZXIgPSB7IG5vbkNvbGxhcHNlZFZhbHVlcy5h
ZnRlciwgeyB9LCBsYXlvdXRCb3guc3R5bGUoKS5oYXNNYXJnaW5BZnRlclF1aXJrKCkgfTsKKyAg
ICBlbHNlIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIgPCAwKQorICAgICAgICBub25Db2xs
YXBzZWRBZnRlciA9IHsgeyB9LCBub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIsIGxheW91dEJveC5z
dHlsZSgpLmhhc01hcmdpbkFmdGVyUXVpcmsoKSB9OworCisgICAgcmV0dXJuIGNvbXB1dGVkUG9z
aXRpdmVBbmROZWdhdGl2ZU1hcmdpbihsYXN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5BZnRlcigpLCBu
b25Db2xsYXBzZWRBZnRlcik7Cit9CisKK0xheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUlnbm9yaW5nQ29sbGFwc2luZ1Rocm91Z2go
Y29uc3QgQm94JiBsYXlvdXRCb3gsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFs
dWVzIG5vbkNvbGxhcHNlZFZhbHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tM
ZXZlbEJveCgpKTsKKyAgICByZXR1cm4gbWFyZ2luVmFsdWUocG9zaXRpdmVOZWdhdGl2ZU1hcmdp
bkJlZm9yZShsYXlvdXRCb3gsIG5vbkNvbGxhcHNlZFZhbHVlcykpLnZhbHVlT3Iobm9uQ29sbGFw
c2VkVmFsdWVzLmJlZm9yZSk7Cit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbiBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6Y29sbGFwc2VkVmVydGljYWxWYWx1ZXMoY29uc3Qg
Qm94JiBsYXlvdXRCb3gsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIG5v
bkNvbGxhcHNlZFZhbHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJv
eCgpKTsKKyAgICAvLyAxLiBHZXQgbWluL21heCBtYXJnaW4gdG9wIHZhbHVlcyBmcm9tIHRoZSBm
aXJzdCBpbi1mbG93IGNoaWxkIGlmIHdlIGFyZSBjb2xsYXBzaW5nIG1hcmdpbiB0b3Agd2l0aCBp
dC4KKyAgICAvLyAyLiBHZXQgbWluL21heCBtYXJnaW4gdG9wIHZhbHVlcyBmcm9tIHRoZSBwcmV2
aW91cyBpbi1mbG93IHNpYmxpbmcsIGlmIHdlIGFyZSBjb2xsYXBzaW5nIG1hcmdpbiB0b3Agd2l0
aCBpdC4KKyAgICAvLyAzLiBHZXQgdGhpcyBsYXlvdXQgYm94J3MgY29tcHV0ZWQgbWFyZ2luIHRv
cCB2YWx1ZS4KKyAgICAvLyA0LiBVcGRhdGUgdGhlIG1pbi9tYXggdmFsdWUgYW5kIGNvbXB1dGUg
dGhlIGZpbmFsIG1hcmdpbi4KKyAgICBhdXRvIHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1h
cmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXIgeyB0aGlz
LT5wb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGxheW91dEJveCwgbm9uQ29sbGFwc2VkVmFs
dWVzKSwgdGhpcy0+cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkFmdGVyKGxheW91dEJveCwgbm9uQ29s
bGFwc2VkVmFsdWVzKSB9OworCisgICAgYXV0byBtYXJnaW5zQ29sbGFwc2VUaHJvdWdoID0gdGhp
cy0+bWFyZ2luc0NvbGxhcHNlVGhyb3VnaChsYXlvdXRCb3gpOworICAgIGlmIChtYXJnaW5zQ29s
bGFwc2VUaHJvdWdoKSB7CisgICAgICAgIHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdp
bi5iZWZvcmUgPSBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4ocG9zaXRpdmVBbmRO
ZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSwgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2Fs
TWFyZ2luLmFmdGVyKTsKKyAgICAgICAgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2lu
LmFmdGVyID0gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZTsKKyAgICB9
CisKKyAgICBhdXRvIGhhc0NvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IG1hcmdpbkJlZm9yZUNvbGxh
cHNlc1dpdGhGaXJzdEluRmxvd0NoaWxkTWFyZ2luQmVmb3JlKGxheW91dEJveCkgfHwgbWFyZ2lu
QmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGxheW91dEJveCk7
CisgICAgYXV0byBoYXNDb2xsYXBzZWRNYXJnaW5BZnRlciA9IG1hcmdpbkFmdGVyQ29sbGFwc2Vz
V2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFmdGVyKGxheW91dEJveCk7CisgICAgYXV0byB1c2Vk
VmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW4geyBub25Db2xsYXBzZWRWYWx1ZXMs
IHsgfSwgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luIH07CisKKyAgICBpZiAoKGhh
c0NvbGxhcHNlZE1hcmdpbkJlZm9yZSAmJiBoYXNDb2xsYXBzZWRNYXJnaW5BZnRlcikgfHwgbWFy
Z2luc0NvbGxhcHNlVGhyb3VnaCkKKyAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luLmNvbGxhcHNl
ZFZhbHVlcyA9IHsgbWFyZ2luVmFsdWUocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2lu
LmJlZm9yZSksIG1hcmdpblZhbHVlKHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5h
ZnRlciksIG1hcmdpbnNDb2xsYXBzZVRocm91Z2ggfTsKKyAgICBlbHNlIGlmIChoYXNDb2xsYXBz
ZWRNYXJnaW5CZWZvcmUpCisgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1
ZXMgPSB7IG1hcmdpblZhbHVlKHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5iZWZv
cmUpLCB7IH0sIGZhbHNlIH07CisgICAgZWxzZSBpZiAoaGFzQ29sbGFwc2VkTWFyZ2luQWZ0ZXIp
CisgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1ZXMgPSB7IHsgfSwgbWFy
Z2luVmFsdWUocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyKSwgZmFsc2Ug
fTsKKyAgICByZXR1cm4gdXNlZFZlcnRpY2FsTWFyZ2luOworfQorCit9Cit9CisjZW5kaWYKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tm
b3JtYXR0aW5nL1ByZWNvbXB1dGVkQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9QcmVjb21wdXRl
ZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRlZmIzZDU1NGZlNjhkZTQyNzMx
ZmY4ZTJkNGIyMGVhYmY2NTllYzIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9QcmVjb21wdXRlZEJsb2Nr
TWFyZ2luQ29sbGFwc2UuY3BwCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lm
IEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3Jt
YXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRD
b250YWluZXJCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUgIkxheW91
dFVuaXQuaCIKKyNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CituYW1lc3BhY2UgTGF5b3V0IHsKKworVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5l
Z2F0aXZlUGFpcjo6VmFsdWVzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNl
OjpwcmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMoY29uc3QgQm94JiBsYXlvdXRCb3gp
IGNvbnN0Cit7CisgICAgYXV0byYgYmxvY2tGb3JtYXR0aW5nU3RhdGUgPSBkb3duY2FzdDxCbG9j
a0Zvcm1hdHRpbmdTdGF0ZT4obGF5b3V0U3RhdGUoKS5mb3JtYXR0aW5nU3RhdGVGb3JCb3gobGF5
b3V0Qm94KSk7CisgICAgaWYgKGJsb2NrRm9ybWF0dGluZ1N0YXRlLmhhc1VzZWRWZXJ0aWNhbE1h
cmdpbihsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gYmxvY2tGb3JtYXR0aW5nU3RhdGUudXNl
ZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCkucG9zaXRpdmVBbmROZWdhdGl2ZVZhbHVlcy5iZWZv
cmU7CisKKyAgICBhdXRvIGdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeSgp
OworICAgIGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRzID0gZ2VvbWV0cnkuY29uc3RyYWludHNG
b3JJbkZsb3dDb250ZW50KGxheW91dEJveC5jb250YWluaW5nQmxvY2soKSkuaG9yaXpvbnRhbDsK
KyAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBnZW9tZXRyeS5jb21wdXRlZFZlcnRp
Y2FsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICBhdXRvIG5v
bkNvbGxhcHNlZE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVz
IHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0
aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgcmV0dXJuIHByZWNvbXB1dGVkUG9z
aXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gsIG5vbkNvbGxhcHNlZE1hcmdpbik7
Cit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVl
cyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cHJlY29tcHV0ZWRQb3Np
dGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBVc2VkVmVydGlj
YWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyBub25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0Cit7
CisgICAgYXV0byBmaXJzdENoaWxkQ29sbGFwc2VkTWFyZ2luQmVmb3JlID0gWyZdKCkgLT4gVXNl
ZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHsKKyAgICAg
ICAgaWYgKCFtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoRmlyc3RJbkZsb3dDaGlsZE1hcmdpbkJl
Zm9yZShsYXlvdXRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgcmV0dXJu
IHByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZVZhbHVlcygqZG93bmNhc3Q8Q29udGFpbmVyQm94
PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93Q2hpbGQoKSk7CisgICAgfTsKKworICAgIGF1dG8gcHJl
dmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5BZnRlciA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1h
cmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7CisgICAgICAgIGlmICghbWFy
Z2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGxheW91dEJv
eCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICBhdXRvJiBwcmV2aW91c0luRmxv
d1NpYmxpbmcgPSAqbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpOworICAgICAgICBh
dXRvJiBibG9ja0Zvcm1hdHRpbmdTdGF0ZSA9IGRvd25jYXN0PEJsb2NrRm9ybWF0dGluZ1N0YXRl
PihsYXlvdXRTdGF0ZSgpLmZvcm1hdHRpbmdTdGF0ZUZvckJveChwcmV2aW91c0luRmxvd1NpYmxp
bmcpKTsKKyAgICAgICAgcmV0dXJuIGJsb2NrRm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1h
cmdpbihwcmV2aW91c0luRmxvd1NpYmxpbmcpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0
ZXI7CisgICAgfTsKKworICAgIC8vIDEuIEdhdGhlciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgbWFy
Z2luIHZhbHVlcyBmcm9tIGZpcnN0IGNoaWxkIGlmIG1hcmdpbnMgYXJlIGFkam9pbmluZy4KKyAg
ICAvLyAyLiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZnJvbSBw
cmV2aW91cyBpbmZsb3cgc2libGluZyBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcuCisgICAgLy8g
My4gQ29tcHV0ZSBtaW4vbWF4IHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBjb2xsYXBzZWQgbWFyZ2lu
IHZhbHVlcyB1c2luZyBub24tY29sbHBhc2VkIGNvbXB1dGVkIG1hcmdpbiBiZWZvcmUuCisgICAg
YXV0byBjb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVN
YXJnaW4oZmlyc3RDaGlsZENvbGxhcHNlZE1hcmdpbkJlZm9yZSgpLCBwcmV2aW91U2libGluZ0Nv
bGxhcHNlZE1hcmdpbkFmdGVyKCkpOworICAgIGlmIChjb2xsYXBzZWRNYXJnaW5CZWZvcmUuaXNR
dWlyayAmJiBmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJrcygpLnNob3VsZElnbm9yZUNvbGxhcHNl
ZFF1aXJrTWFyZ2luKGxheW91dEJveCkpCisgICAgICAgIGNvbGxhcHNlZE1hcmdpbkJlZm9yZSA9
IHsgfTsKKworICAgIGF1dG8gbm9uQ29sbGFwc2VkQmVmb3JlID0gVXNlZFZlcnRpY2FsTWFyZ2lu
OjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHsgfTsKKyAgICBpZiAobm9uQ29sbGFw
c2VkVmFsdWVzLmJlZm9yZSA+IDApCisgICAgICAgIG5vbkNvbGxhcHNlZEJlZm9yZSA9IHsgbm9u
Q29sbGFwc2VkVmFsdWVzLmJlZm9yZSwgeyB9LCBsYXlvdXRCb3guc3R5bGUoKS5oYXNNYXJnaW5C
ZWZvcmVRdWlyaygpIH07CisgICAgZWxzZSBpZiAobm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSA8
IDApCisgICAgICAgIG5vbkNvbGxhcHNlZEJlZm9yZSA9IHsgeyB9LCBub25Db2xsYXBzZWRWYWx1
ZXMuYmVmb3JlLCBsYXlvdXRCb3guc3R5bGUoKS5oYXNNYXJnaW5CZWZvcmVRdWlyaygpIH07CisK
KyAgICByZXR1cm4gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKGNvbGxhcHNlZE1h
cmdpbkJlZm9yZSwgbm9uQ29sbGFwc2VkQmVmb3JlKTsKK30KKworUHJlY29tcHV0ZWRNYXJnaW5C
ZWZvcmUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OnByZWNvbXB1dGVk
TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBVc2VkVmVydGljYWxNYXJnaW46Ok5v
bkNvbGxhcHNlZFZhbHVlcyB1c2VkTm9uQ29sbGFwc2VkTWFyZ2luKQoreworICAgIEFTU0VSVChs
YXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworICAgIC8vIERvbid0IHByZS1jb21wdXRlIHZl
cnRpY2FsIG1hcmdpbnMgZm9yIG91dCBvZiBmbG93IGJveGVzLgorICAgIEFTU0VSVChsYXlvdXRC
b3guaXNJbkZsb3coKSB8fCBsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7CisgICAg
QVNTRVJUKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKKworICAgIGF1dG8gcG9zaXRpdmVO
ZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IHByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJl
Zm9yZShsYXlvdXRCb3gsIHVzZWROb25Db2xsYXBzZWRNYXJnaW4pOworICAgIGF1dG8gY29sbGFw
c2VkTWFyZ2luQmVmb3JlID0gbWFyZ2luVmFsdWUocG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9y
ZSk7CisgICAgcmV0dXJuIHsgdXNlZE5vbkNvbGxhcHNlZE1hcmdpbi5iZWZvcmUsIGNvbGxhcHNl
ZE1hcmdpbkJlZm9yZSwgcG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSB9OworfQorCit9Cit9
CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hYzZkZjY1Y2E0YmI3MTM2MDRlYWI3MDAxNmNmN2Rl
ZjFjMjJmMDRkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJs
b2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisj
aW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbnZhbGlkYXRpb25T
dGF0ZS5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVkZSAiTGF5b3V0
Q2hpbGRJdGVyYXRvci5oIgorI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKKyNpbmNsdWRlICJM
YXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5n
Q29udGV4dC5oIgorI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxMT0NBVEVE
X0lNUEwoVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCk7CisKK1RhYmxlV3JhcHBl
ckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0
dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCisgICAgOiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
KGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgZm9ybWF0dGluZ1N0YXRlKQoreworfQorCit2b2lkIFRh
YmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dEluRmxvd0NvbnRlbnQoSW52
YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0
cmFpbnRzKQoreworICAgIC8vIFRoZSB0YWJsZSBnZW5lcmF0ZXMgYSBwcmluY2lwYWwgYmxvY2sg
Y29udGFpbmVyIGJveCBjYWxsZWQgdGhlIHRhYmxlIHdyYXBwZXIgYm94IHRoYXQgY29udGFpbnMg
dGhlIHRhYmxlIGJveCBpdHNlbGYgYW5kIGFueSBjYXB0aW9uIGJveGVzCisgICAgLy8gKGluIGRv
Y3VtZW50IG9yZGVyKS4gVGhlIHRhYmxlIGJveCBpcyBhIGJsb2NrLWxldmVsIGJveCB0aGF0IGNv
bnRhaW5zIHRoZSB0YWJsZSdzIGludGVybmFsIHRhYmxlIGJveGVzLgorICAgIC8vIFRoZSBjYXB0
aW9uIGJveGVzIGFyZSBwcmluY2lwYWwgYmxvY2stbGV2ZWwgYm94ZXMgdGhhdCByZXRhaW4gdGhl
aXIgb3duIGNvbnRlbnQsIHBhZGRpbmcsIG1hcmdpbiwgYW5kIGJvcmRlciBhcmVhcywgYW5kIGFy
ZSByZW5kZXJlZAorICAgIC8vIGFzIG5vcm1hbCBibG9jayBib3hlcyBpbnNpZGUgdGhlIHRhYmxl
IHdyYXBwZXIgYm94LiBXaGV0aGVyIHRoZSBjYXB0aW9uIGJveGVzIGFyZSBwbGFjZWQgYmVmb3Jl
IG9yIGFmdGVyIHRoZSB0YWJsZSBib3ggaXMgZGVjaWRlZCBieQorICAgIC8vIHRoZSAnY2FwdGlv
bi1zaWRlJyBwcm9wZXJ0eSwgYXMgZGVzY3JpYmVkIGJlbG93LgorICAgIGZvciAoYXV0byYgY2hp
bGQgOiBjaGlsZHJlbk9mVHlwZTxDb250YWluZXJCb3g+KHJvb3QoKSkpIHsKKyAgICAgICAgaWYg
KGNoaWxkLmlzVGFibGVCb3goKSkKKyAgICAgICAgICAgIGxheW91dFRhYmxlQm94KGNoaWxkLCBj
b25zdHJhaW50cyk7CisgICAgICAgIGVsc2UgaWYgKGNoaWxkLmlzVGFibGVDYXB0aW9uKCkpCisg
ICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9Cit9CisKK3ZvaWQgVGFibGVX
cmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0VGFibGVCb3goY29uc3QgQ29udGFp
bmVyQm94JiB0YWJsZUJveCwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25z
dHJhaW50cykKK3sKKyAgICBsYXlvdXRTdGF0ZSgpLmVuc3VyZVRhYmxlRm9ybWF0dGluZ1N0YXRl
KHRhYmxlQm94KTsKKworICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nRm9yVGFibGVCb3godGFi
bGVCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgIGNvbXB1dGVTdGF0aWNWZXJ0aWNh
bFBvc2l0aW9uKHRhYmxlQm94LCBjb25zdHJhaW50cy52ZXJ0aWNhbCk7CisgICAgY29tcHV0ZVdp
ZHRoQW5kTWFyZ2luRm9yVGFibGVCb3godGFibGVCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwp
OworICAgIGNvbXB1dGVTdGF0aWNIb3Jpem9udGFsUG9zaXRpb24odGFibGVCb3gsIGNvbnN0cmFp
bnRzLmhvcml6b250YWwpOworCisgICAgaWYgKHRhYmxlQm94Lmhhc0NoaWxkKCkpIHsKKyAgICAg
ICAgYXV0byBpbnZhbGlkYXRpb25TdGF0ZSA9IEludmFsaWRhdGlvblN0YXRlIHsgfTsKKyAgICAg
ICAgTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQodGFibGVCb3gsIGxheW91
dFN0YXRlKCkpLT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBnZW9tZXRy
eSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCh0YWJsZUJveCkpOworICAgIH0KKworICAg
IGNvbXB1dGVIZWlnaHRBbmRNYXJnaW5Gb3JUYWJsZUJveCh0YWJsZUJveCwgY29uc3RyYWludHMp
OworfQorCit2b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVC
b3JkZXJBbmRQYWRkaW5nRm9yVGFibGVCb3goY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCwg
Y29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCit7Cisg
ICAgQVNTRVJUKHRhYmxlQm94LmlzVGFibGVCb3goKSk7CisgICAgaWYgKCF0YWJsZUJveC5oYXND
aGlsZCgpIHx8IHRhYmxlQm94LnN0eWxlKCkuYm9yZGVyQ29sbGFwc2UoKSA9PSBCb3JkZXJDb2xs
YXBzZTo6U2VwYXJhdGUpIHsKKyAgICAgICAgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0
ZUJvcmRlckFuZFBhZGRpbmcodGFibGVCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gVUFzIG11c3QgY29tcHV0ZSBhbiBpbml0aWFsIGxl
ZnQgYW5kIHJpZ2h0IGJvcmRlciB3aWR0aCBmb3IgdGhlIHRhYmxlIGJ5IGV4YW1pbmluZworICAg
IC8vIHRoZSBmaXJzdCBhbmQgbGFzdCBjZWxscyBpbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSB0YWJs
ZS4KKyAgICAvLyBUaGUgbGVmdCBib3JkZXIgd2lkdGggb2YgdGhlIHRhYmxlIGlzIGhhbGYgb2Yg
dGhlIGZpcnN0IGNlbGwncyBjb2xsYXBzZWQgbGVmdCBib3JkZXIsCisgICAgLy8gYW5kIHRoZSBy
aWdodCBib3JkZXIgd2lkdGggb2YgdGhlIHRhYmxlIGlzIGhhbGYgb2YgdGhlIGxhc3QgY2VsbCdz
IGNvbGxhcHNlZCByaWdodCBib3JkZXIuCisgICAgLy8gVGhlIHRvcCBib3JkZXIgd2lkdGggb2Yg
dGhlIHRhYmxlIGlzIGNvbXB1dGVkIGJ5IGV4YW1pbmluZyBhbGwgY2VsbHMgd2hvIGNvbGxhcHNl
IHRoZWlyIHRvcAorICAgIC8vIGJvcmRlcnMgd2l0aCB0aGUgdG9wIGJvcmRlciBvZiB0aGUgdGFi
bGUuIFRoZSB0b3AgYm9yZGVyIHdpZHRoIG9mIHRoZSB0YWJsZSBpcyBlcXVhbCB0byBoYWxmIG9m
IHRoZQorICAgIC8vIG1heGltdW0gY29sbGFwc2VkIHRvcCBib3JkZXIuIFRoZSBib3R0b20gYm9y
ZGVyIHdpZHRoIGlzIGNvbXB1dGVkIGJ5IGV4YW1pbmluZyBhbGwgY2VsbHMgd2hvc2UgYm90dG9t
IGJvcmRlcnMgY29sbGFwc2UKKyAgICAvLyB3aXRoIHRoZSBib3R0b20gb2YgdGhlIHRhYmxlLiBU
aGUgYm90dG9tIGJvcmRlciB3aWR0aCBpcyBlcXVhbCB0byBoYWxmIG9mIHRoZSBtYXhpbXVtIGNv
bGxhcHNlZCBib3R0b20gYm9yZGVyLgorICAgIGF1dG8mIGdyaWQgPSBsYXlvdXRTdGF0ZSgpLmVz
dGFibGlzaGVkVGFibGVGb3JtYXR0aW5nU3RhdGUodGFibGVCb3gpLnRhYmxlR3JpZCgpOworICAg
IGF1dG8gdGFibGVCb3JkZXIgPSBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKHRhYmxlQm94KTsK
KworICAgIGF1dG8mIGZpcnN0Q29sdW1uRmlyc3RSb3dCb3ggPSBncmlkLnNsb3QoeyAwICwgMCB9
KS0+Y2VsbCgpLmJveCgpOworICAgIGF1dG8gbGVmdEJvcmRlciA9IHN0ZDo6bWF4KHRhYmxlQm9y
ZGVyLmhvcml6b250YWwubGVmdCwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihmaXJzdENvbHVt
bkZpcnN0Um93Qm94KS5ob3Jpem9udGFsLmxlZnQpOworCisgICAgYXV0byYgbGFzdENvbHVtbkZp
cnN0Um93ID0gZ3JpZC5zbG90KHsgZ3JpZC5jb2x1bW5zKCkuc2l6ZSgpIC0gMSwgMCB9KS0+Y2Vs
bCgpLmJveCgpOworICAgIGF1dG8gcmlnaHRCb3JkZXIgPSBzdGQ6Om1heCh0YWJsZUJvcmRlci5o
b3Jpem9udGFsLnJpZ2h0LCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKGxhc3RDb2x1bW5GaXJz
dFJvdykuaG9yaXpvbnRhbC5yaWdodCk7CisKKyAgICBhdXRvIHRvcEJvcmRlciA9IHRhYmxlQm9y
ZGVyLnZlcnRpY2FsLnRvcDsKKyAgICBhdXRvIGJvdHRvbUJvcmRlciA9IHRhYmxlQm9yZGVyLnZl
cnRpY2FsLmJvdHRvbTsKKyAgICBhdXRvIGxhc3RSb3dJbmRleCA9IGdyaWQucm93cygpLnNpemUo
KSAtIDE7CisgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IGdy
aWQuY29sdW1ucygpLnNpemUoKTsgKytjb2x1bW5JbmRleCkgeworICAgICAgICBhdXRvJiBib3hJ
bkZpcnN0Um94ID0gZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIDAgfSktPmNlbGwoKS5ib3goKTsK
KyAgICAgICAgYXV0byYgYm94SW5MYXN0Um93ID0gZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIGxh
c3RSb3dJbmRleCB9KS0+Y2VsbCgpLmJveCgpOworCisgICAgICAgIHRvcEJvcmRlciA9IHN0ZDo6
bWF4KHRvcEJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihib3hJbkZpcnN0Um94KS52
ZXJ0aWNhbC50b3ApOworICAgICAgICBib3R0b21Cb3JkZXIgPSBzdGQ6Om1heChib3R0b21Cb3Jk
ZXIsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIoYm94SW5MYXN0Um93KS52ZXJ0aWNhbC5ib3R0
b20pOworICAgIH0KKworICAgIHRvcEJvcmRlciA9IHN0ZDo6bWF4KHRvcEJvcmRlciwgZ2VvbWV0
cnkoKS5jb21wdXRlZEJvcmRlcigqdGFibGVCb3guZmlyc3RDaGlsZCgpKS52ZXJ0aWNhbC50b3Ap
OworICAgIGZvciAoYXV0byYgc2VjdGlvbiA6IGNoaWxkcmVuT2ZUeXBlPENvbnRhaW5lckJveD4o
dGFibGVCb3gpKSB7CisgICAgICAgIGF1dG8gaG9yaXp0b25hbEJvcmRlciA9IGdlb21ldHJ5KCku
Y29tcHV0ZWRCb3JkZXIoc2VjdGlvbikuaG9yaXpvbnRhbDsKKyAgICAgICAgbGVmdEJvcmRlciA9
IHN0ZDo6bWF4KGxlZnRCb3JkZXIsIGhvcml6dG9uYWxCb3JkZXIubGVmdCk7CisgICAgICAgIHJp
Z2h0Qm9yZGVyID0gc3RkOjptYXgocmlnaHRCb3JkZXIsIGhvcml6dG9uYWxCb3JkZXIucmlnaHQp
OworICAgIH0KKyAgICBib3R0b21Cb3JkZXIgPSBzdGQ6Om1heChib3R0b21Cb3JkZXIsIGdlb21l
dHJ5KCkuY29tcHV0ZWRCb3JkZXIoKnRhYmxlQm94Lmxhc3RDaGlsZCgpKS52ZXJ0aWNhbC5ib3R0
b20pOworCisgICAgYXV0byYgcm93cyA9IGdyaWQucm93cygpLmxpc3QoKTsKKyAgICB0b3BCb3Jk
ZXIgPSBzdGQ6Om1heCh0b3BCb3JkZXIsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIocm93cy5m
aXJzdCgpLmJveCgpKS52ZXJ0aWNhbC50b3ApOworICAgIGZvciAoYXV0byYgcm93IDogcm93cykg
eworICAgICAgICBhdXRvIGhvcml6dG9uYWxCb3JkZXIgPSBnZW9tZXRyeSgpLmNvbXB1dGVkQm9y
ZGVyKHJvdy5ib3goKSkuaG9yaXpvbnRhbDsKKyAgICAgICAgbGVmdEJvcmRlciA9IHN0ZDo6bWF4
KGxlZnRCb3JkZXIsIGhvcml6dG9uYWxCb3JkZXIubGVmdCk7CisgICAgICAgIHJpZ2h0Qm9yZGVy
ID0gc3RkOjptYXgocmlnaHRCb3JkZXIsIGhvcml6dG9uYWxCb3JkZXIucmlnaHQpOworICAgIH0K
KyAgICBib3R0b21Cb3JkZXIgPSBzdGQ6Om1heChib3R0b21Cb3JkZXIsIGdlb21ldHJ5KCkuY29t
cHV0ZWRCb3JkZXIocm93cy5sYXN0KCkuYm94KCkpLnZlcnRpY2FsLmJvdHRvbSk7CisKKyAgICBh
dXRvIGNvbGxhcHNlZEJvcmRlciA9IEVkZ2VzIHsgeyBsZWZ0Qm9yZGVyLCByaWdodEJvcmRlciB9
LCB7IHRvcEJvcmRlciwgYm90dG9tQm9yZGVyIH0gfTsKKyAgICBncmlkLnNldENvbGxhcHNlZEJv
cmRlcihjb2xsYXBzZWRCb3JkZXIpOworCisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0
aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSh0YWJsZUJveCk7CisgICAgYm94R2VvbWV0cnkuc2V0Qm9y
ZGVyKGNvbGxhcHNlZEJvcmRlciAvIDIpOworICAgIGJveEdlb21ldHJ5LnNldFBhZGRpbmcoZ2Vv
bWV0cnkoKS5jb21wdXRlZFBhZGRpbmcodGFibGVCb3gsIGhvcml6b250YWxDb25zdHJhaW50cy5s
b2dpY2FsV2lkdGgpKTsKK30KKwordm9pZCBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0Ojpjb21wdXRlV2lkdGhBbmRNYXJnaW5Gb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gm
IHRhYmxlQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJh
aW50cykKK3sKKyAgICBBU1NFUlQodGFibGVCb3guaXNUYWJsZUJveCgpKTsKKyAgICAvLyBUaGlz
IGlzIGEgc3BlY2lhbCB0YWJsZSAiZml0LWNvbnRlbnQgc2l6ZSIgYmVoYXZpb3IgaGFuZGxpbmcu
IE5vdCBpbiB0aGUgc3BlYyB0aG91Z2guCisgICAgLy8gVGFibGUgcmV0dXJucyBpdHMgZmluYWwg
d2lkdGggYXMgbWluL21heC4gVXNlIHRoaXMgZmluYWwgd2lkdGggdmFsdWUgdG8gY29tcHV0ZWQg
aG9yaXpvbnRhbCBtYXJnaW5zIGV0Yy4KKyAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGVGb3JUYWJs
ZUJveCA9IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRUYWJsZUZvcm1hdHRpbmdTdGF0ZSh0YWJs
ZUJveCk7CisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gSW50cmluc2ljV2lk
dGhDb25zdHJhaW50cyB7IH07CisgICAgaWYgKGF1dG8gcHJlY29tcHV0ZWRJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzID0gZm9ybWF0dGluZ1N0YXRlRm9yVGFibGVCb3guaW50cmluc2ljV2lkdGhD
b25zdHJhaW50cygpKQorICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gKnByZWNv
bXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYg
KHRhYmxlQm94Lmhhc0NoaWxkKCkpCisgICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQodGFibGVCb3gsIGxh
eW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKKyAgICAg
ICAgZm9ybWF0dGluZ1N0YXRlRm9yVGFibGVCb3guc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50
cyhpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKTsKKyAgICB9CisKKyAgICBhdXRvIGF2YWlsYWJs
ZUhvcml6b250YWxTcGFjZSA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7Cisg
ICAgLy8gMS4gVGhlIHRhYmxlIGdlbmVyYXRlcyBhIHByaW5jaXBhbCBibG9jayBjb250YWluZXIg
Ym94IGNhbGxlZCB0aGUgdGFibGUgd3JhcHBlciBib3ggdGhhdCBjb250YWlucyB0aGUgdGFibGUg
Ym94IGl0c2VsZiBhbmQgYW55IGNhcHRpb24gYm94ZXMuCisgICAgLy8gMi4gVGhlIHRhYmxlIHdy
YXBwZXIgYm94IGVzdGFibGlzaGVzIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0LCBhbmQgdGhl
IHRhYmxlIGJveCBlc3RhYmxpc2hlcyBhIHRhYmxlIGZvcm1hdHRpbmcgY29udGV4dC4KKyAgICAv
LyAzLiBUaGUgY29tcHV0ZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMgJ3Bvc2l0aW9uJywgJ2Zsb2F0
JywgJ21hcmdpbi0qJywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCBhbmQgJ2xlZnQnIG9uCisg
ICAgLy8gICAgdGhlIHRhYmxlIGVsZW1lbnQgYXJlIHVzZWQgb24gdGhlIHRhYmxlIHdyYXBwZXIg
Ym94IGFuZCBub3QgdGhlIHRhYmxlIGJveDsgYWxsIG90aGVyIHZhbHVlcyBvZiBub24taW5oZXJp
dGFibGUKKyAgICAvLyAgICBwcm9wZXJ0aWVzIGFyZSB1c2VkIG9uIHRoZSB0YWJsZSBib3ggYW5k
IG5vdCB0aGUgdGFibGUgd3JhcHBlciBib3guCisgICAgLy8gNC4gSW4gYSBibG9jayBmb3JtYXR0
aW5nIGNvbnRleHQsIGVhY2ggYm94J3MgbGVmdCBvdXRlciBlZGdlIHRvdWNoZXMgdGhlIGxlZnQg
ZWRnZSBvZiB0aGUgY29udGFpbmluZyBibG9jay4KKyAgICAvLyAgICBUaGlzIGlzIHRydWUgZXZl
biBpbiB0aGUgcHJlc2VuY2Ugb2YgZmxvYXRzLCB1bmxlc3MgdGhlIGJveCBlc3RhYmxpc2hlcyBh
IG5ldyBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgKGluIHdoaWNoIGNhc2UgdGhlCisgICAgLy8g
ICAgYm94IGl0c2VsZiBtYXkgYmVjb21lIG5hcnJvd2VyIGR1ZSB0byB0aGUgZmxvYXRzKQorICAg
IC8vCisgICAgLy8gTm93IGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY2FzZToKKyAgICAvLyA8ZGl2
IHN0eWxlPSJkaXNwbGF5OiBibG9jazsgd2lkdGg6IDUwMHB4OyI+CisgICAgLy8gICAgIDxkaXYg
c3R5bGU9ImZsb2F0OiBsZWZ0OyB3aWR0aDogMTAwcHg7Ij48L2Rpdj4KKyAgICAvLyAgICAgICAg
IDxkaXYgc3R5bGU9ImRpc3BsYXk6IHRhYmxlOyB3aWR0aDogMTAlOyI+PC9kaXY+CisgICAgLy8g
ICAgIDwvZGl2PgorICAgIC8vIDwvZGl2PgorICAgIC8vIDEuIFdlIGNyZWF0ZSBhIHRhYmxlIHdy
YXBwZXIgYm94IHRvIHdyYXAgdGhlICJkaXNwbGF5OiB0YWJsZSIgYmxvY2sgbGV2ZWwgYm94ICgj
MSkuCisgICAgLy8gMi4gVGhlIHRhYmxlIHdyYXBwZXIgYm94J3Mgd2lkdGggcHJvcGVydHkgaXMg
c2V0IHRvIGF1dG8gKCMzKS4KKyAgICAvLyAzLiBTaW5jZSBpdCBlc3RhYmxpc2hlcyBhIG5ldyBi
bG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFjZSBn
ZXRzIHNocnVuayBieSB0aGUgZmxvYXQgKCM0KQorICAgIC8vIDQuIFRoZSB0YWJsZSB3cmFwcGVy
IGJveCdzIHVzZWQgd2lkdGggY29tcHV0ZXMgdG8gNTAwcHggLSAxMDBweCAtPiA0MDBweDsKKyAg
ICAvLworICAgIC8vIE5vdyB3ZSBhcmUgaW5zaWRlIHRoZSBCRkMgZXN0YWJsaXNoZWQgYnkgdGhl
IHRhYmxlIHdyYXBwZXIgYm94IGFuZCB0cnkgdG8gcmVzb2x2ZSB0aGUgdGFibGUncyB3aWR0aCAt
PiAlMTAuCisgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBub3JtYWwgQkZDIHJ1bGVzLCBpdCBzaG91
bGQgY29tcHV0ZSB0byAxMCUgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBsb2dpY2FsIHdpZHRo
OiA0MDBweCAtPiA0MHB4LgorICAgIC8vIEhvd2V2ZXIgaW4gcHJhY3RpY2UgaXQgY29tcHV0ZXMg
dG8gNTBweCAoMTAlIG9mIDUwMHB4KS4KKyAgICAvLyBTaW1pbGFyIHNldHVwIHdpdGggbm9uLXRh
YmxlIGNvbnRlbnQgd291bGQgcmVzb2x2ZSB0aGUgaW5uZXIgYmxvY2sgbGV2ZWwgYm94J3Mgd2lk
dGggdG8gNDBweDsKKyAgICAvLyBUaGlzIG5lZWRzIGNsYXJpZmljYXRpb24gaW4gdGhlIHNwZWMu
CisgICAgYXV0byBob3Jpem9udGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRoID0gbV9ob3Jp
em9udGFsQ29uc3RyYWludHNJZ25vcmluZ0Zsb2F0cy5sb2dpY2FsV2lkdGg7CisgICAgYXV0byBn
ZW9tZXRyeSA9IHRoaXMtPmdlb21ldHJ5KCk7CisgICAgYXV0byBjb21wdXRlZFdpZHRoID0gZ2Vv
bWV0cnkuY29tcHV0ZWRXaWR0aCh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRGb3JSZXNv
bHZpbmdXaWR0aCk7CisgICAgYXV0byBjb21wdXRlZE1heFdpZHRoID0gZ2VvbWV0cnkuY29tcHV0
ZWRNYXhXaWR0aCh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRGb3JSZXNvbHZpbmdXaWR0
aCk7CisgICAgYXV0byBjb21wdXRlZE1pbldpZHRoID0gZ2VvbWV0cnkuY29tcHV0ZWRNaW5XaWR0
aCh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRGb3JSZXNvbHZpbmdXaWR0aCk7CisgICAg
Ly8gVXNlIHRoZSBnZW5lcmljIHNocmluay10by1maXQtd2lkdGggbG9naWMgYXMgdGhlIGluaXRp
YWwgd2lkdGggZm9yIHRoZSB0YWJsZS4KKyAgICBhdXRvIHVzZWRXaWR0aCA9IHN0ZDo6bWluKHN0
ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgYXZhaWxhYmxlSG9yaXpv
bnRhbFNwYWNlKSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtKTsKKyAgICBpZiAo
Y29tcHV0ZWRXaWR0aCB8fCBjb21wdXRlZE1pbldpZHRoIHx8IGNvbXB1dGVkTWF4V2lkdGgpIHsK
KyAgICAgICAgaWYgKGNvbXB1dGVkV2lkdGgpIHsKKyAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0
aGUgY29tcHV0ZWQgd2lkdGggdmFsdWUgZmlyc3QuCisgICAgICAgICAgICBpZiAoY29tcHV0ZWRN
YXhXaWR0aCAmJiAqY29tcHV0ZWRXaWR0aCA+ICpjb21wdXRlZE1heFdpZHRoKQorICAgICAgICAg
ICAgICAgIGNvbXB1dGVkV2lkdGggPSBjb21wdXRlZE1heFdpZHRoOworICAgICAgICAgICAgaWYg
KGNvbXB1dGVkTWluV2lkdGggJiYgKmNvbXB1dGVkV2lkdGggPCAqY29tcHV0ZWRNaW5XaWR0aCkK
KyAgICAgICAgICAgICAgICBjb21wdXRlZFdpZHRoID0gY29tcHV0ZWRNaW5XaWR0aDsKKyAgICAg
ICAgICAgIHVzZWRXaWR0aCA9ICpjb21wdXRlZFdpZHRoIDwgaW50cmluc2ljV2lkdGhDb25zdHJh
aW50cy5taW5pbXVtID8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtIDogKmNvbXB1
dGVkV2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29tcHV0ZWRNYXhXaWR0aCAmJiAq
Y29tcHV0ZWRNYXhXaWR0aCA8IHVzZWRXaWR0aCkKKyAgICAgICAgICAgIHVzZWRXaWR0aCA9IGlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bTsKKyAgICAgICAgaWYgKGNvbXB1dGVkTWlu
V2lkdGggJiYgKmNvbXB1dGVkTWluV2lkdGggPiB1c2VkV2lkdGgpCisgICAgICAgICAgICB1c2Vk
V2lkdGggPSAqY29tcHV0ZWRNaW5XaWR0aDsKKyAgICB9CisKKyAgICBhdXRvIGNvbnRlbnRXaWR0
aEFuZE1hcmdpbiA9IGdlb21ldHJ5LmluRmxvd0NvbnRlbnRXaWR0aEFuZE1hcmdpbih0YWJsZUJv
eCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyB7IHVz
ZWRXaWR0aCwgeyB9IH0pOworCisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3Rh
dGUoKS5ib3hHZW9tZXRyeSh0YWJsZUJveCk7CisgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJv
eFdpZHRoKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOworICAgIGJveEdlb21l
dHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdp
bi5zdGFydCwgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIH0pOworfQorCit2
b2lkIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVIZWlnaHRBbmRN
YXJnaW5Gb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBjb25zdCBDb25z
dHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAgIEFTU0VSVCh0YWJs
ZUJveC5pc1RhYmxlQm94KCkpOworICAgIC8vIFRhYmxlIGlzIGEgc3BlY2lhbCBCRkMgY29udGVu
dC4gSXRzIGhlaWdodCBpcyBtYWlubHkgZHJpdmVuIGJ5IHRoZSBjb250ZW50LiBDb21wdXRlZCBo
ZWlnaHQsIG1pbi1oZWlnaHQgYW5kIG1heC1oZWlnaHQgYXJlIGFsbAorICAgIC8vIGFscmVhZHkg
YmVlbiB0YWtlbiBpbnRvIGFjY291bnQgZHVyaW5nIHRoZSBURkMgbGF5b3V0LgorICAgIGF1dG8g
aGVpZ2h0QW5kTWFyZ2luID0gZ2VvbWV0cnkoKS5pbkZsb3dDb250ZW50SGVpZ2h0QW5kTWFyZ2lu
KHRhYmxlQm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFsLCB7IHF1aXJrcygpLm92ZXJyaWRkZW5U
YWJsZUhlaWdodCh0YWJsZUJveCkgfSk7CisKKyAgICBhdXRvIG1hcmdpbkNvbGxhcHNlID0gdGhp
cy0+bWFyZ2luQ29sbGFwc2UoKTsKKyAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gbWFyZ2luQ29s
bGFwc2UuY29sbGFwc2VkVmVydGljYWxWYWx1ZXModGFibGVCb3gsIGhlaWdodEFuZE1hcmdpbi5u
b25Db2xsYXBzZWRNYXJnaW4pOworICAgIC8vIENhY2hlIHRoZSBjb21wdXRlZCBwb3NpdGl2ZSBh
bmQgbmVnYXRpdmUgbWFyZ2luIHZhbHVlIHBhaXIuCisgICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0
VXNlZFZlcnRpY2FsTWFyZ2luKHRhYmxlQm94LCB2ZXJ0aWNhbE1hcmdpbik7CisKKyAgICBhdXRv
JiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KHRhYmxlQm94KTsK
KyAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2lu
KHRhYmxlQm94LCB2ZXJ0aWNhbE1hcmdpbiwgY29uc3RyYWludHMudmVydGljYWwpKTsKKyAgICBi
b3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVp
Z2h0KTsKKyAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9yZSh2
ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsKKyAgICAvLyBB
ZGp1c3QgdGhlIHByZXZpb3VzIHNpYmxpbmcncyBtYXJnaW4gYm90dG9tIG5vdyB0aGF0IHRoaXMg
Ym94J3MgdmVydGljYWwgbWFyZ2luIGlzIGNvbXB1dGVkLgorICAgIE1hcmdpbkNvbGxhcHNlOjp1
cGRhdGVNYXJnaW5BZnRlckZvclByZXZpb3VzU2libGluZygqdGhpcywgbWFyZ2luQ29sbGFwc2Us
IHRhYmxlQm94KTsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBl
ci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFi
bGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBkZWExNTdjYzUy
MTZmODg0ZmQyODk4MzRhM2M4NjY5NTM3NDI3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdy
YXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oCkBAIC0wLDAgKzEsNzYg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgorI2lu
Y2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNl
IExheW91dCB7CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgc3BlY2lhbCBibG9jayBm
b3JtYXR0aW5nIGNvbnRleHQgbGF5b3V0IGxvZ2ljIGZvciB0aGUgdGFibGUgd3JhcHBlci4KKy8v
IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi90YWJsZXMuaHRtbCNtb2RlbAorY2xhc3MgVGFi
bGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCBmaW5hbCA6IHB1YmxpYyBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKFRhYmxlV3JhcHBlckJs
b2NrRm9ybWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAgIFRhYmxlV3JhcHBlckJsb2NrRm9y
bWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3Qs
IEJsb2NrRm9ybWF0dGluZ1N0YXRlJik7CisKKyAgICB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQo
SW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSBm
aW5hbDsKKworICAgIHZvaWQgc2V0SG9yaXpvbnRhbENvbnN0cmFpbnRzSWdub3JpbmdGbG9hdHMo
Y29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpIHsgbV9o
b3Jpem9udGFsQ29uc3RyYWludHNJZ25vcmluZ0Zsb2F0cyA9IGhvcml6b250YWxDb25zdHJhaW50
czsgfQorCitwcml2YXRlOgorICAgIGNsYXNzIFF1aXJrcyA6IHB1YmxpYyBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpRdWlya3MgeworICAgIHB1YmxpYzoKKyAgICAgICAgUXVpcmtzKGNvbnN0IFRh
YmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsKKworICAgICAgICBPcHRpb25hbDxM
YXlvdXRVbml0PiBvdmVycmlkZGVuVGFibGVIZWlnaHQoY29uc3QgQ29udGFpbmVyQm94JiB0YWJs
ZUJveCkgY29uc3Q7CisgICAgfTsKKyAgICBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4gUXVpcmtzKCp0aGlzKTsgfQorCisg
ICAgdm9pZCBsYXlvdXRUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBjb25z
dCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsKKworICAgIHZvaWQgY29tcHV0ZUJvcmRl
ckFuZFBhZGRpbmdGb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmLCBjb25zdCBIb3Jpem9u
dGFsQ29uc3RyYWludHMmKTsKKyAgICB2b2lkIGNvbXB1dGVXaWR0aEFuZE1hcmdpbkZvclRhYmxl
Qm94KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOwor
ICAgIHZvaWQgY29tcHV0ZUhlaWdodEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5l
ckJveCYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOworCitwcml2YXRlOgor
ICAgIEhvcml6b250YWxDb25zdHJhaW50cyBtX2hvcml6b250YWxDb25zdHJhaW50c0lnbm9yaW5n
RmxvYXRzOworfTsKKworaW5saW5lIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
OlF1aXJrczo6UXVpcmtzKGNvbnN0IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQm
IGZvcm1hdHRpbmdDb250ZXh0KQorICAgIDogQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtz
KGZvcm1hdHRpbmdDb250ZXh0KQoreworfQorCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJ
VFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0LCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSkKKworI2VuZGlm
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Js
b2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dFF1aXJrcy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5n
Q29udGV4dFF1aXJrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZWFkYTkyZWQyOGY3OTdmM2I4MjZiMGZiOTE1
NDI1ZWI3ODliYjk5NQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBw
ZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApAQCAtMCwwICsxLDQ4IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRhYmxlV3JhcHBlckJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQorCisjaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
bmFtZXNwYWNlIExheW91dCB7CisKK09wdGlvbmFsPExheW91dFVuaXQ+IFRhYmxlV3JhcHBlckJs
b2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6b3ZlcnJpZGRlblRhYmxlSGVpZ2h0KGNvbnN0
IENvbnRhaW5lckJveCYgdGFibGVCb3gpIGNvbnN0Cit7CisgICAgaWYgKGxheW91dFN0YXRlKCku
aW5RdWlya3NNb2RlKCkpIHsKKyAgICAgICAgLy8gSW4gcXVpcmtzIG1vZGUgYWx3YXlzIHVzZSB0
aGUgY29udGVudCBoZWlnaHQuIE5vdGUgdGhhdCB0aGUgdGFibGVzIHdpdGggY29udGVudCB0YWtl
IGNvbXB1dGVkIHZhbHVlcyBpbnRvIGFjY291bnQuCisgICAgICAgIHJldHVybiBnZW9tZXRyeSgp
LmNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QodGFibGVCb3gpOworICAgIH0K
KyAgICByZXR1cm4gdGFibGVCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkgPyBnZW9tZXRy
eSgpLmNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QodGFibGVCb3gpIDogT3B0
aW9uYWw8TGF5b3V0VW5pdD4geyB9OworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9G
bGV4Rm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjMxNTdmZDY5OTA0Mjg2OTdlODVkMTcxZjZkM2FjOGQ1ODdhY2FjZjgKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhm
b3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5jcHAKQEAgLTAsMCArMSwxMjMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdD
b250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2lu
Y2x1ZGUgIkZsZXhGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbmxpbmVSZWN0LmgiCisj
aW5jbHVkZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRy
eS5oIgorI2luY2x1ZGUgIkxheW91dENoaWxkSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJMYXlvdXRD
b250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURf
SU1QTChGbGV4Rm9ybWF0dGluZ0NvbnRleHQpOworCitGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OkZs
ZXhGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0
Um9vdCwgRmxleEZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKQorICAgIDogRm9ybWF0
dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHRSb290LCBmb3JtYXR0aW5nU3RhdGUpCit7Cit9
CisKK3ZvaWQgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRJbkZsb3dDb250ZW50KEludmFs
aWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJh
aW50cykKK3sKKyAgICBjb21wdXRlSW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckZsZXhJdGVt
cygpOworICAgIHNpemVBbmRQbGFjZUZsZXhJdGVtcyhjb25zdHJhaW50cyk7Cit9CisKK0xheW91
dFVuaXQgRmxleEZvcm1hdHRpbmdDb250ZXh0Ojp1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0Cit7
CisgICAgYXV0byYgbGluZXMgPSBmb3JtYXR0aW5nU3RhdGUoKS5saW5lcygpOworICAgIHJldHVy
biBMYXlvdXRVbml0IHsgbGluZXMubGFzdCgpLmJvdHRvbSgpIC0gbGluZXMuZmlyc3QoKS50b3Ao
KSB9OworfQorCitGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBG
bGV4Rm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygp
Cit7CisgICAgcmV0dXJuIHsgfTsKK30KKwordm9pZCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OnNp
emVBbmRQbGFjZUZsZXhJdGVtcyhjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNv
bnN0cmFpbnRzKQoreworICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1hdHRp
bmdTdGF0ZSgpOworICAgIGF1dG8gZ2VvbWV0cnkgPSB0aGlzLT5nZW9tZXRyeSgpOworICAgIGF1
dG8gZmxleEl0ZW1NYWluQXhpc1N0YXJ0ID0gY29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dpY2Fs
TGVmdDsKKyAgICBhdXRvIGZsZXhJdGVtTWFpbkF4aXNFbmQgPSBmbGV4SXRlbU1haW5BeGlzU3Rh
cnQ7CisgICAgYXV0byBmbGV4SXRlbUNyb3NBeGlzU3RhcnQgPSBjb25zdHJhaW50cy52ZXJ0aWNh
bC5sb2dpY2FsVG9wOworICAgIGF1dG8gZmxleEl0ZW1Dcm9zQXhpc0VuZCA9IGZsZXhJdGVtQ3Jv
c0F4aXNTdGFydDsKKyAgICBmb3IgKGF1dG8mIGZsZXhJdGVtIDogY2hpbGRyZW5PZlR5cGU8Q29u
dGFpbmVyQm94Pihyb290KCkpKSB7CisgICAgICAgIEFTU0VSVChmbGV4SXRlbS5lc3RhYmxpc2hl
c0Zvcm1hdHRpbmdDb250ZXh0KCkpOworICAgICAgICAvLyBGSVhNRTogVGhpcyBpcyBqdXN0IGEg
c2ltcGxlLCBsZXQncyBsYXlvdXQgdGhlIGZsZXggaXRlbXMgYW5kIHBsYWNlIHRoZW0gbmV4dCB0
byBlYWNoIG90aGVyIHNldHVwLgorICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRocyA9IGZvcm1h
dHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGZsZXhJdGVtKTsKKyAg
ICAgICAgYXV0byBmbGV4SXRlbUxvZ2ljYWxXaWR0aCA9IHN0ZDo6bWluKHN0ZDo6bWF4KGludHJp
bnNpY1dpZHRocy0+bWluaW11bSwgY29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dpY2FsV2lkdGgp
LCBpbnRyaW5zaWNXaWR0aHMtPm1heGltdW0pOworICAgICAgICBhdXRvIGZsZXhJdGVtQ29uc3Ry
YWludHMgPSBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQgeyB7IHsgfSwgZmxleEl0ZW1Mb2dp
Y2FsV2lkdGggfSwgeyB9IH07CisKKyAgICAgICAgYXV0byBpbnZhbGlkYXRpb25TdGF0ZSA9IElu
dmFsaWRhdGlvblN0YXRlIHsgfTsKKyAgICAgICAgTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0
dGluZ0NvbnRleHQoZmxleEl0ZW0sIGxheW91dFN0YXRlKCkpLT5sYXlvdXRJbkZsb3dDb250ZW50
KGludmFsaWRhdGlvblN0YXRlLCBmbGV4SXRlbUNvbnN0cmFpbnRzKTsKKworICAgICAgICBhdXRv
IGNvbXB1dGVGbGV4SXRlbUdlb21ldHJ5ID0gWyZdIHsKKyAgICAgICAgICAgIGF1dG8mIGZsZXhJ
dGVtR2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkoZmxleEl0ZW0pOworCisg
ICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KExheW91dFBvaW50
IHsgZmxleEl0ZW1NYWluQXhpc0VuZCwgZmxleEl0ZW1Dcm9zQXhpc1N0YXJ0IH0pOworCisgICAg
ICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldEJvcmRlcihnZW9tZXRyeS5jb21wdXRlZEJvcmRl
cihmbGV4SXRlbSkpOworICAgICAgICAgICAgZmxleEl0ZW1HZW9tZXRyeS5zZXRQYWRkaW5nKGdl
b21ldHJ5LmNvbXB1dGVkUGFkZGluZyhmbGV4SXRlbSwgY29uc3RyYWludHMuaG9yaXpvbnRhbC5s
b2dpY2FsV2lkdGgpKTsKKworICAgICAgICAgICAgYXV0byBjb21wdXRlZEhvcml6b250YWxNYXJn
aW4gPSBnZW9tZXRyeS5jb21wdXRlZEhvcml6b250YWxNYXJnaW4oZmxleEl0ZW0sIGNvbnN0cmFp
bnRzLmhvcml6b250YWwpOworICAgICAgICAgICAgZmxleEl0ZW1HZW9tZXRyeS5zZXRIb3Jpem9u
dGFsTWFyZ2luKHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMF9sdSks
IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwX2x1KSB9KTsKKworICAgICAg
ICAgICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gZ2VvbWV0cnkuY29tcHV0ZWRWZXJ0
aWNhbE1hcmdpbihmbGV4SXRlbSwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAgICAgICAg
ICBmbGV4SXRlbUdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgY29tcHV0ZWRWZXJ0aWNhbE1h
cmdpbi5iZWZvcmUudmFsdWVPcigwX2x1KSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52
YWx1ZU9yKDBfbHUpIH0pOworCisgICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5LnNldENvbnRl
bnRCb3hIZWlnaHQoZ2VvbWV0cnkuY29udGVudEhlaWdodEZvckZvcm1hdHRpbmdDb250ZXh0Um9v
dChmbGV4SXRlbSkpOworICAgICAgICAgICAgZmxleEl0ZW1HZW9tZXRyeS5zZXRDb250ZW50Qm94
V2lkdGgoZmxleEl0ZW1Mb2dpY2FsV2lkdGgpOworICAgICAgICAgICAgZmxleEl0ZW1NYWluQXhp
c0VuZD0gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QoZmxleEl0ZW1HZW9tZXRyeSkucmlnaHQo
KTsKKyAgICAgICAgICAgIGZsZXhJdGVtQ3Jvc0F4aXNFbmQgPSBzdGQ6Om1heChmbGV4SXRlbUNy
b3NBeGlzRW5kLCBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChmbGV4SXRlbUdlb21ldHJ5KS5i
b3R0b20oKSk7CisgICAgICAgIH07CisgICAgICAgIGNvbXB1dGVGbGV4SXRlbUdlb21ldHJ5KCk7
CisgICAgfQorICAgIGF1dG8gZmxleExpbmUgPSBJbmxpbmVSZWN0IHsgZmxleEl0ZW1Dcm9zQXhp
c1N0YXJ0LCBmbGV4SXRlbU1haW5BeGlzU3RhcnQsIGZsZXhJdGVtTWFpbkF4aXNFbmQgLSBmbGV4
SXRlbU1haW5BeGlzU3RhcnQsIGZsZXhJdGVtQ3Jvc0F4aXNFbmQgLSBmbGV4SXRlbUNyb3NBeGlz
U3RhcnQgfTsKKyAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZShmbGV4TGluZSk7Cit9CisKK3Zv
aWQgRmxleEZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlSW50cmluc2ljV2lkdGhDb25zdHJhaW50
c0ZvckZsZXhJdGVtcygpCit7CisgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9y
bWF0dGluZ1N0YXRlKCk7CisgICAgYXV0byBnZW9tZXRyeSA9IHRoaXMtPmdlb21ldHJ5KCk7Cisg
ICAgZm9yIChhdXRvJiBmbGV4SXRlbSA6IGNoaWxkcmVuT2ZUeXBlPENvbnRhaW5lckJveD4ocm9v
dCgpKSkgeworICAgICAgICBpZiAoZm9ybWF0dGluZ1N0YXRlLmludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHNGb3JCb3goZmxleEl0ZW0pKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGZv
cm1hdHRpbmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGZsZXhJdGVt
LCBnZW9tZXRyeS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGZsZXhJdGVtKSk7CisgICAgfQor
fQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuaCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcv
RmxleEZvcm1hdHRpbmdDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODFhMGU0MDY5ZmZkMTAyOTY4OGNj
NTE2Y2ZkOTU5MGNjYzkzNjUyYgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250
ZXh0LmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJGbGV4Rm9ybWF0
dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlIDx3
dGYvSXNvTWFsbG9jLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQg
eworCitjbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0
aGUgbGF5b3V0IGxvZ2ljIGZvciBmbGV4IGZvcm1hdHRpbmcgY29udGV4dHMuCisvLyBodHRwczov
L3d3dy53My5vcmcvVFIvY3NzLWZsZXhib3gtMS8KK2NsYXNzIEZsZXhGb3JtYXR0aW5nQ29udGV4
dCBmaW5hbCA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dCB7CisgICAgV1RGX01BS0VfSVNPX0FM
TE9DQVRFRChGbGV4Rm9ybWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAgIEZsZXhGb3JtYXR0
aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgRmxl
eEZvcm1hdHRpbmdTdGF0ZSYpOworICAgIHZvaWQgbGF5b3V0SW5GbG93Q29udGVudChJbnZhbGlk
YXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpIG92ZXJyaWRl
OworICAgIExheW91dFVuaXQgdXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdCBvdmVycmlkZTsKKwor
ICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgLy8gVGhpcyBjbGFzcyBpbXBsZW1l
bnRzIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcgZm9yIGZsZXggaXRlbXMuCisgICAgY2xhc3MgR2Vv
bWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKKyAgICBwdWJsaWM6
CisgICAgICAgIEdlb21ldHJ5KGNvbnN0IEZsZXhGb3JtYXR0aW5nQ29udGV4dCYpOworCisgICAg
ICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhj
b25zdCBDb250YWluZXJCb3gmKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IEZsZXhG
b3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3du
Y2FzdDxGbGV4Rm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6
Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KKyAgICB9OworICAgIEZsZXhGb3JtYXR0aW5nQ29udGV4
dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBHZW9tZXRyeSgqdGhpcyk7IH0K
KworICAgIHZvaWQgc2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5G
bG93Q29udGVudCYpOworICAgIHZvaWQgY29tcHV0ZUludHJpbnNpY1dpZHRoQ29uc3RyYWludHNG
b3JGbGV4SXRlbXMoKTsKKworICAgIGNvbnN0IEZsZXhGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRp
bmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEZsZXhGb3JtYXR0aW5nU3RhdGU+KEZv
cm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KKyAgICBGbGV4Rm9ybWF0dGlu
Z1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3duY2FzdDxGbGV4Rm9ybWF0dGlu
Z1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9Cit9OworCitp
bmxpbmUgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6R2VvbWV0cnkoY29uc3QgRmxl
eEZvcm1hdHRpbmdDb250ZXh0JiBmbGV4Rm9ybWF0dGluZ0NvbnRleHQpCisgICAgOiBGb3JtYXR0
aW5nQ29udGV4dDo6R2VvbWV0cnkoZmxleEZvcm1hdHRpbmdDb250ZXh0KQoreworfQorCit9Cit9
CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChGbGV4
Rm9ybWF0dGluZ0NvbnRleHQsIGlzRmxleEZvcm1hdHRpbmdDb250ZXh0KCkpCisKKyNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4
Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0
aW5nQ29udGV4dEdlb21ldHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYzdjOGRkMDk4MDlkMWQwYjU4NGFi
ZmY3OGRkMTc5MWJmZjQ2ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRl
eHRHZW9tZXRyeS5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAy
MCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJGbGV4Rm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJM
RShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdT
dGF0ZS5oIgorI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0
Q29udGV4dC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKwor
Rm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgRmxleEZvcm1hdHRp
bmdDb250ZXh0OjpHZW9tZXRyeTo6aW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25zdCBDb250
YWluZXJCb3gmIGZsZXhJdGVtKQoreworICAgIGF1dG8gZml4ZWRNYXJnaW5Cb3JkZXJBbmRQYWRk
aW5nID0gWyZdKGF1dG8mIGxheW91dEJveCkgeworICAgICAgICBhdXRvJiBzdHlsZSA9IGxheW91
dEJveC5zdHlsZSgpOworICAgICAgICByZXR1cm4gZml4ZWRWYWx1ZShzdHlsZS5tYXJnaW5TdGFy
dCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIExheW91dFVuaXQgeyBzdHlsZS5ib3JkZXJM
ZWZ0V2lkdGgoKSB9CisgICAgICAgICAgICArIGZpeGVkVmFsdWUoc3R5bGUucGFkZGluZ0xlZnQo
KSkudmFsdWVPcigwKQorICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0eWxlLnBhZGRpbmdSaWdo
dCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIExheW91dFVuaXQgeyBzdHlsZS5ib3JkZXJS
aWdodFdpZHRoKCkgfQorICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0eWxlLm1hcmdpbkVuZCgp
KS52YWx1ZU9yKDApOworICAgIH07CisKKyAgICBhdXRvIGNvbXB1dGVkSW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyA9IFsmXSgpIC0+IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeworICAgICAg
ICBhdXRvIGxvZ2ljYWxXaWR0aCA9IGZsZXhJdGVtLnN0eWxlKCkubG9naWNhbFdpZHRoKCk7Cisg
ICAgICAgIC8vIE1pbmltdW0vbWF4aW11bSB3aWR0aCBjYW4ndCBiZSBkZXBlbmRpbmcgb24gdGhl
IGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0aC4KKyAgICAgICAgYXV0byBuZWVkc1Jlc29sdmVkQ29u
dGFpbmluZ0Jsb2NrV2lkdGggPSBsb2dpY2FsV2lkdGguaXNDYWxjdWxhdGVkKCkgfHwgbG9naWNh
bFdpZHRoLmlzUGVyY2VudCgpIHx8IGxvZ2ljYWxXaWR0aC5pc1JlbGF0aXZlKCk7CisgICAgICAg
IGlmIChuZWVkc1Jlc29sdmVkQ29udGFpbmluZ0Jsb2NrV2lkdGgpCisgICAgICAgICAgICByZXR1
cm4geyB9OworCisgICAgICAgIGlmIChhdXRvIHdpZHRoID0gZml4ZWRWYWx1ZShsb2dpY2FsV2lk
dGgpKQorICAgICAgICAgICAgcmV0dXJuIHsgKndpZHRoLCAqd2lkdGggfTsKKworICAgICAgICBB
U1NFUlQoZmxleEl0ZW0uZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKKyAgICAgICAg
YXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9y
bWF0dGluZ0NvbnRleHQoZmxleEl0ZW0sIGxheW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMoKTsKKyAgICAgICAgaWYgKGxvZ2ljYWxXaWR0aC5pc01pbkNvbnRl
bnQoKSkKKyAgICAgICAgICAgIHJldHVybiB7IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWlu
aW11bSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtIH07CisgICAgICAgIGlmIChs
b2dpY2FsV2lkdGguaXNNYXhDb250ZW50KCkpCisgICAgICAgICAgICByZXR1cm4geyBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4
aW11bSB9OworICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKKyAgICB9
OworICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGNvbnN0cmFpbkJ5TWluTWF4
V2lkdGgoZmxleEl0ZW0sIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpKTsKKyAg
ICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLmV4cGFuZChmaXhlZE1hcmdpbkJvcmRlckFuZFBh
ZGRpbmcoZmxleEl0ZW0pKTsKKyAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsK
K30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5n
L0ZsZXhGb3JtYXR0aW5nU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQ1OWZjODVhMDM4NTJkMzM1MjYx
Mzg0MGYzMTIyYzczM2M1NGZhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3Rh
dGUuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
KyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisg
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdTdGF0ZS5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9G
T1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworV1RGX01BS0VfSVNP
X0FMTE9DQVRFRF9JTVBMKEZsZXhGb3JtYXR0aW5nU3RhdGUpOworCitGbGV4Rm9ybWF0dGluZ1N0
YXRlOjpGbGV4Rm9ybWF0dGluZ1N0YXRlKFJlZjxGbG9hdGluZ1N0YXRlPiYmIGZsb2F0aW5nU3Rh
dGUsIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKKyAgICA6IEZvcm1hdHRpbmdTdGF0ZShXVEZN
b3ZlKGZsb2F0aW5nU3RhdGUpLCBUeXBlOjpGbGV4LCBsYXlvdXRTdGF0ZSkKK3sKK30KKworRmxl
eEZvcm1hdHRpbmdTdGF0ZTo6fkZsZXhGb3JtYXR0aW5nU3RhdGUoKQoreworfQorCit9Cit9Cisj
ZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5oIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ1N0
YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uYTA2M2I5ZGEyYTViOGRjMjcwMjA4Nzk0YTQ4MzY1NDQxNjA5ZTNh
MwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdTdGF0ZS5oCkBAIC0wLDAgKzEsNTUg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAi
SW5saW5lUmVjdC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIEZsZXhGb3JtYXR0aW5nU3RhdGUg
OiBwdWJsaWMgRm9ybWF0dGluZ1N0YXRlIHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKEZs
ZXhGb3JtYXR0aW5nU3RhdGUpOworcHVibGljOgorICAgIEZsZXhGb3JtYXR0aW5nU3RhdGUoUmVm
PEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRlJik7CisgICAgfkZsZXhGb3JtYXR0aW5nU3Rh
dGUoKTsKKworICAgIGNvbnN0IGF1dG8mIGxpbmVzKCkgY29uc3QgeyByZXR1cm4gbV9saW5lczsg
fQorICAgIHZvaWQgYWRkTGluZShjb25zdCBJbmxpbmVSZWN0JiBsaW5lKSB7IG1fbGluZXMuYXBw
ZW5kKGxpbmUpOyB9CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPElubGluZVJlY3Q+IG1fbGluZXM7
Cit9OworCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdf
U1RBVEUoRmxleEZvcm1hdHRpbmdTdGF0ZSwgaXNGbGV4Rm9ybWF0dGluZ1N0YXRlKCkpCisKKyNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2VyLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250
ZW50QnJlYWtlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTQwYTZkYTlmOWMxNGYwMTQ0NTFmYWRhMjQ2ZmIw
ZWJjZDEyZDJiOAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5jcHAK
QEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiSW5saW5lQ29udGVudEJyZWFrZXIuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRm9udENhc2NhZGUuaCIKKyNpbmNsdWRlICJIeXBo
ZW5hdGlvbi5oIgorI2luY2x1ZGUgIklubGluZUl0ZW0uaCIKKyNpbmNsdWRlICJJbmxpbmVUZXh0
SXRlbS5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgorI2luY2x1ZGUgIlRleHRV
dGlsLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCisKKyNp
ZiBBU1NFUlRfRU5BQkxFRAorc3RhdGljIGlubGluZSBib29sIGhhc1RyYWlsaW5nVGV4dENvbnRl
bnQoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50JiBjb250aW51
b3VzQ29udGVudCkKK3sKKyAgICBmb3IgKGF1dG8mIHJ1biA6IFdURjo6bWFrZVJldmVyc2VkUmFu
Z2UoY29udGludW91c0NvbnRlbnQucnVucygpKSkgeworICAgICAgICBhdXRvJiBpbmxpbmVJdGVt
ID0gcnVuLmlubGluZUl0ZW07CisgICAgICAgIGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3Rh
cnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpCisgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgcmV0dXJuIGlubGluZUl0ZW0uaXNUZXh0KCk7CisgICAgfQorICAgIHJldHVy
biBmYWxzZTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGJvb2wgaGFzTGVhZGluZ1RleHRD
b250ZW50KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudCYgY29u
dGludW91c0NvbnRlbnQpCit7CisgICAgZm9yIChhdXRvJiBydW4gOiBjb250aW51b3VzQ29udGVu
dC5ydW5zKCkpIHsKKyAgICAgICAgYXV0byYgaW5saW5lSXRlbSA9IHJ1bi5pbmxpbmVJdGVtOwor
ICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5p
c0lubGluZUJveEVuZCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJldHVybiBp
bmxpbmVJdGVtLmlzVGV4dCgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRp
YyBpbmxpbmUgYm9vbCBoYXNUZXh0UnVuKGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250
aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQpCit7CisgICAgLy8gPHNwYW4+dGV4dDwv
c3Bhbj4gaXMgY29uc2lkZXJlZCBhIHRleHQgcnVuIGV2ZW4gd2l0aCB0aGUgW2lubGluZSBib3gg
c3RhcnRdW2lubGluZSBib3ggZW5kXSBpbmxpbmUgaXRlbXMuCisgICAgLy8gQmFzZWQgb24gc3Rh
bmRhcmRzIGNvbW1pdCBib3VuZGFyeSBydWxlcyBpdCB3b3VsZCBiZSBlbm91Z2ggdG8gY2hlY2sg
dGhlIGZpcnN0IGlubGluZSBpdGVtLCBidXQgZHVlIHRvIHRoZSB0YWJsZSBxdWlyaywgd2UgY2Fu
IGhhdmUKKyAgICAvLyBpbWFnZSBhbmQgdGV4dCBuZXh0IHRvIGVhY2ggb3RoZXIgaW5zaWRlIGEg
Y29udGludW91cyBzZXQgb2YgcnVucyAoc2VlIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpRdWly
a3M6Omhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdlKS4KKyAgICBmb3IgKGF1dG8mIHJ1biA6
IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKSkgeworICAgICAgICBpZiAocnVuLmlubGluZUl0ZW0u
aXNUZXh0KCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZh
bHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNWaXN1YWxseUVtcHR5V2hpdGVzcGFjZUNv
bnRlbnQoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50JiBjb250
aW51b3VzQ29udGVudCkKK3sKKyAgICAvLyBbPHNwYW4+PC9zcGFuPiBdIFs8c3Bhbj4gPC9zcGFu
Pl0gWyA8c3BhbiBzdHlsZT0icGFkZGluZzogMHB4OyI+PC9zcGFuPl0gYXJlIGFsbCBjb25zaWRl
cmVkIHZpc3VhbGx5IGVtcHR5IHdoaXRlc3BhY2UgY29udGVudC4KKyAgICAvLyBbPHNwYW4gc3R5
bGU9ImJvcmRlcjogMXB4IHNvbGlkIHJlZCI+PC9zcGFuPiBdIHdoaWxlIHRoaXMgaXMgd2hpdGVz
cGFjZSBjb250ZW50IG9ubHksIGl0IGlzIG5vdCBjb25zaWRlcmVkIHZpc3VhbGx5IGVtcHR5Lgor
ICAgIC8vIER1ZSB0byBjb21taXQgYm91bmRhcnkgcnVsZXMsIHdlIGp1c3QgbmVlZCB0byBjaGVj
ayB0aGUgZmlyc3Qgbm9uLXR5cGVsZXNzIGlubGluZSBpdGVtIChjYW4ndCBoYXZlIGJvdGggW2lt
Z10gYW5kIFt0ZXh0XSkKKyAgICBmb3IgKGF1dG8mIHJ1biA6IGNvbnRpbnVvdXNDb250ZW50LnJ1
bnMoKSkgeworICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gcnVuLmlubGluZUl0ZW07CisgICAg
ICAgIC8vIEZJWE1FOiBjaGVjayBmb3IgcGFkZGluZyBib3JkZXIgZXRjLgorICAgICAgICBpZiAo
aW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVu
ZCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJldHVybiBpbmxpbmVJdGVtLmlz
VGV4dCgpICYmIGRvd25jYXN0PElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKS5pc1doaXRlc3Bh
Y2UoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wg
aXNOb25Db250ZW50UnVuc09ubHkoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVv
dXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkKK3sKKyAgICAvLyA8c3Bhbj48L3NwYW4+IDwt
IG5vbiBjb250ZW50IHJ1bnMuCisgICAgZm9yIChhdXRvJiBydW4gOiBjb250aW51b3VzQ29udGVu
dC5ydW5zKCkpIHsKKyAgICAgICAgYXV0byYgaW5saW5lSXRlbSA9IHJ1bi5pbmxpbmVJdGVtOwor
ICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5p
c0lubGluZUJveEVuZCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgT3B0aW9u
YWw8c2l6ZV90PiBmaXJzdFRleHRSdW5JbmRleChjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6
Q29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250ZW50KQoreworICAgIGF1dG8mIHJ1bnMg
PSBjb250aW51b3VzQ29udGVudC5ydW5zKCk7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBp
bmRleCA8IHJ1bnMuc2l6ZSgpOyArK2luZGV4KSB7CisgICAgICAgIGlmIChydW5zW2luZGV4XS5p
bmxpbmVJdGVtLmlzVGV4dCgpKQorICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKyAg
ICByZXR1cm4geyB9OworfQorCitib29sIElubGluZUNvbnRlbnRCcmVha2VyOjppc1dyYXBwaW5n
QWxsb3dlZChjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQoreworICAgIGF1dG8mIHN0eWxl
VG9Vc2UgPSBpbmxpbmVJdGVtLmlzQm94KCkgPyBpbmxpbmVJdGVtLmxheW91dEJveCgpLnBhcmVu
dCgpLnN0eWxlKCkgOiBpbmxpbmVJdGVtLmxheW91dEJveCgpLnN0eWxlKCk7IAorICAgIC8vIERv
IG5vdCB0cnkgdG8gd3JhcCBvdmVyZmxvd24gJ3ByZScgYW5kICduby13cmFwJyBjb250ZW50IHRv
IG5leHQgbGluZS4KKyAgICByZXR1cm4gc3R5bGVUb1VzZS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVT
cGFjZTo6UHJlICYmIHN0eWxlVG9Vc2Uud2hpdGVTcGFjZSgpICE9IFdoaXRlU3BhY2U6Ok5vV3Jh
cDsKK30KKworYm9vbCBJbmxpbmVDb250ZW50QnJlYWtlcjo6c2hvdWxkS2VlcEVuZE9mTGluZVdo
aXRlc3BhY2UoY29uc3QgQ29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250ZW50KSBjb25z
dAoreworICAgIC8vIEdyYWIgdGhlIHN0eWxlIGFuZCBjaGVjayBmb3Igd2hpdGUtc3BhY2UgcHJv
cGVydHkgdG8gZGVjaWRlIHdoZXRoZXIgd2Ugc2hvdWxkIGxldCB0aGlzIHdoaXRlc3BhY2UgY29u
dGVudCBvdmVyZmxvdyB0aGUgY3VycmVudCBsaW5lLgorICAgIC8vIE5vdGUgdGhhdCB0aGUgImtl
ZXAiIGluIHRoaXMgY29udGV4dCBtZWFucyB3ZSBsZXQgdGhlIHdoaXRlc3BhY2UgY29udGVudCBz
aXQgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAvLyBJdCBtaWdodCB2ZXJ5IHdlbGwgZ2V0IGNv
bGxhcHNlZCB3aGVuIHdlIGNsb3NlIHRoZSBsaW5lIChub3JtYWwvbm93cmFwL3ByZS1saW5lKS4K
KyAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10ZXh0LTMvI3doaXRlLXNwYWNl
LXByb3BlcnR5CisgICAgYXV0byB3aGl0ZXNwYWNlID0gY29udGludW91c0NvbnRlbnQucnVucygp
WypmaXJzdFRleHRSdW5JbmRleChjb250aW51b3VzQ29udGVudCldLmlubGluZUl0ZW0uc3R5bGUo
KS53aGl0ZVNwYWNlKCk7CisgICAgcmV0dXJuIHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6Tm9y
bWFsIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6Tm9XcmFwIHx8IHdoaXRlc3BhY2UgPT0g
V2hpdGVTcGFjZTo6UHJlV3JhcCB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZUxpbmU7
Cit9CisKK0lubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQgSW5saW5lQ29udGVudEJyZWFrZXI6
OnByb2Nlc3NJbmxpbmVDb250ZW50KGNvbnN0IENvbnRpbnVvdXNDb250ZW50JiBjYW5kaWRhdGVD
b250ZW50LCBjb25zdCBMaW5lU3RhdHVzJiBsaW5lU3RhdHVzKQoreworICAgIEFTU0VSVCghc3Rk
Ojppc25hbihsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKSk7CisgICAgYXV0byBwcm9jZXNzQ2Fu
ZGlkYXRlQ29udGVudCA9IFsmXSB7CisgICAgICAgIGlmIChjYW5kaWRhdGVDb250ZW50LmxvZ2lj
YWxXaWR0aCgpIDw9IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGgpCisgICAgICAgICAgICByZXR1
cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246OktlZXAgfTsKKyNpZiBVU0VfRkxPQVRfQVNfSU5M
SU5FX0xBWU9VVF9VTklUCisgICAgICAgIC8vIFByZWZlcnJlZCB3aWR0aCBjb21wdXRhdGlvbiBz
dW1zIHVwIGZsb2F0cyB3aGlsZSBsaW5lIGJyZWFrZXIgc3VidHJhY3RzIHRoZW0uIFRoaXMgY2Fu
IGxlYWQgdG8gZXBzaWxvbi1zY2FsZSBkaWZmZXJlbmNlcy4KKyAgICAgICAgaWYgKFdURjo6YXJl
RXNzZW50aWFsbHlFcXVhbChjYW5kaWRhdGVDb250ZW50LmxvZ2ljYWxXaWR0aCgpLCBsaW5lU3Rh
dHVzLmF2YWlsYWJsZVdpZHRoKSkKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6
OkFjdGlvbjo6S2VlcCB9OworI2VuZGlmCisgICAgICAgIHJldHVybiBwcm9jZXNzT3ZlcmZsb3dp
bmdDb250ZW50KGNhbmRpZGF0ZUNvbnRlbnQsIGxpbmVTdGF0dXMpOworICAgIH07CisKKyAgICBh
dXRvIHJlc3VsdCA9IHByb2Nlc3NDYW5kaWRhdGVDb250ZW50KCk7CisgICAgaWYgKHJlc3VsdC5h
Y3Rpb24gPT0gUmVzdWx0OjpBY3Rpb246OldyYXAgJiYgbGluZVN0YXR1cy50cmFpbGluZ1NvZnRI
eXBoZW5XaWR0aCAmJiBoYXNMZWFkaW5nVGV4dENvbnRlbnQoY2FuZGlkYXRlQ29udGVudCkpIHsK
KyAgICAgICAgLy8gQSB0cmFpbGluZyBzb2Z0IGh5cGhlbiB3aXRoIGEgd3JhcHBlZCB0ZXh0IGNv
bnRlbnQgdHVybnMgaW50byBhIHZpc2libGUgaHlwaGVuLgorICAgICAgICAvLyBMZXQncyBjaGVj
ayBpZiB0aGVyZSdzIGVub3VnaCBzcGFjZSBmb3IgdGhlIGh5cGhlbiBjaGFyYWN0ZXIuCisgICAg
ICAgIGF1dG8gaHlwaGVuT3ZlcmZsb3dzID0gKmxpbmVTdGF0dXMudHJhaWxpbmdTb2Z0SHlwaGVu
V2lkdGggPiBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoOworICAgICAgICBhdXRvIGFjdGlvbiA9
IGh5cGhlbk92ZXJmbG93cyA/IFJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xhc3ROb25PdmVyZmxv
d2luZ1dyYXBPcHBvcnR1bml0eSA6IFJlc3VsdDo6QWN0aW9uOjpXcmFwV2l0aEh5cGhlbjsKKyAg
ICAgICAgcmVzdWx0ID0geyBhY3Rpb24sIElzRW5kT2ZMaW5lOjpZZXMgfTsKKyAgICB9CisgICAg
cmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IE92ZXJmbG93aW5nVGV4dENvbnRlbnQgeworICAg
IHNpemVfdCBydW5JbmRleCB7IDAgfTsgLy8gT3ZlcmZsb3dpbmcgcnVuIGluZGV4LiBUaGVyZSdz
IGFsd2F5cyBhbiBvdmVyZmxvd2luZyBydW4uCisgICAgc3RydWN0IEJyZWFraW5nUG9zaXRpb24g
eworICAgICAgICBzaXplX3QgcnVuSW5kZXggeyAwIH07CisgICAgICAgIHN0cnVjdCBUcmFpbGlu
Z0NvbnRlbnQgeworICAgICAgICAgICAgLy8gVHJhaWxpbmcgY29udGVudCBpcyBlaXRoZXIgdGhl
IHJ1bidzIGxlZnQgc2lkZSAod2hlbiB3ZSBicmVhayB0aGUgcnVuIHNvbWV3aGVyZSBpbiB0aGUg
bWlkZGxlKSBvciB0aGUgcHJldmlvdXMgcnVuLgorICAgICAgICAgICAgLy8gU29tZXRpbWVzIHRo
ZSBicmVha2luZyBwb3NpdGlvbiBpcyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0
IHJ1biwgc28gdGhlcmUncyBubyB0cmFpbGluZyBydW4gYXQgYWxsLgorICAgICAgICAgICAgYm9v
bCBvdmVyZmxvd3MgeyBmYWxzZSB9OworICAgICAgICAgICAgT3B0aW9uYWw8SW5saW5lQ29udGVu
dEJyZWFrZXI6OlBhcnRpYWxSdW4+IHBhcnRpYWxSdW4geyB9OworICAgICAgICB9OworICAgICAg
ICBPcHRpb25hbDxUcmFpbGluZ0NvbnRlbnQ+IHRyYWlsaW5nQ29udGVudCB7IH07CisgICAgfTsK
KyAgICBPcHRpb25hbDxCcmVha2luZ1Bvc2l0aW9uPiBicmVha2luZ1Bvc2l0aW9uIHsgfTsgLy8g
V2hlcmUgd2UgYWN0dWFsbHkgYnJlYWsgdGhpcyBvdmVyZmxvd2luZyBjb250ZW50LgorfTsKKwor
SW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6cHJvY2Vz
c092ZXJmbG93aW5nQ29udGVudChjb25zdCBDb250aW51b3VzQ29udGVudCYgb3ZlcmZsb3dDb250
ZW50LCBjb25zdCBMaW5lU3RhdHVzJiBsaW5lU3RhdHVzKSBjb25zdAoreworICAgIGF1dG8gY29u
dGludW91c0NvbnRlbnQgPSBDb250aW51b3VzQ29udGVudCB7IG92ZXJmbG93Q29udGVudCB9Owor
ICAgIEFTU0VSVCghY29udGludW91c0NvbnRlbnQucnVucygpLmlzRW1wdHkoKSk7CisKKyAgICBB
U1NFUlQoY29udGludW91c0NvbnRlbnQubG9naWNhbFdpZHRoKCkgPiBsaW5lU3RhdHVzLmF2YWls
YWJsZVdpZHRoKTsKKyAgICBpZiAoY29udGludW91c0NvbnRlbnQuaGFzVHJhaWxpbmdDb2xsYXBz
aWJsZUNvbnRlbnQoKSkgeworICAgICAgICBBU1NFUlQoaGFzVHJhaWxpbmdUZXh0Q29udGVudChv
dmVyZmxvd0NvbnRlbnQpKTsKKyAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlIGNvbnRlbnQg
Zml0cyB3aXRob3V0IHRoZSB0cmFpbGluZyBjb2xsYXBzaWJsZSBwYXJ0LgorICAgICAgICBpZiAo
Y29udGludW91c0NvbnRlbnQubm9uQ29sbGFwc2libGVMb2dpY2FsV2lkdGgoKSA8PSBsaW5lU3Rh
dHVzLmF2YWlsYWJsZVdpZHRoKQorICAgICAgICAgICAgcmV0dXJuIHsgUmVzdWx0OjpBY3Rpb246
OktlZXAsIElzRW5kT2ZMaW5lOjpObyB9OworICAgICAgICAvLyBOb3cgY2hlY2sgaWYgd2UgY2Fu
IHRyaW0gdGhlIGxpbmUgdG9vLgorICAgICAgICBpZiAobGluZVN0YXR1cy5oYXNGdWxseUNvbGxh
cHNpYmxlVHJhaWxpbmdSdW4gJiYgY29udGludW91c0NvbnRlbnQuaXNGdWxseUNvbGxhcHNpYmxl
KCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgbmV3IGNvbnRlbnQgaXMgZnVsbHkgY29sbGFw
c2libGUsIGl0IHNob3VsZCBzdXJlbHkgZml0LgorICAgICAgICAgICAgcmV0dXJuIHsgUmVzdWx0
OjpBY3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpObyB9OworICAgICAgICB9CisgICAgfSBlbHNl
IGlmIChsaW5lU3RhdHVzLmNvbGxhcHNpYmxlV2lkdGggJiYgaXNOb25Db250ZW50UnVuc09ubHko
Y29udGludW91c0NvbnRlbnQpKSB7CisgICAgICAgIC8vIExldCdzIHNlZSBpZiB0aGUgbm9uLWNv
bnRlbnQgcnVucyBmaXQgd2hlbiB0aGUgbGluZSBoYXMgdHJhaWxpbmcgY29sbGFwc2libGUgY29u
dGVudC4KKyAgICAgICAgLy8gInRleHQgY29udGVudCA8c3BhbiBzdHlsZT0icGFkZGluZzogMXB4
Ij48L3NwYW4+IiA8LSB0aGUgPHNwYW4+PC9zcGFuPiBydW5zIGNvdWxkIGZpdCBhZnRlciBjb2xs
YXBzaW5nIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICAgICBpZiAoY29udGludW91c0Nv
bnRlbnQubG9naWNhbFdpZHRoKCkgPD0gbGluZVN0YXR1cy5hdmFpbGFibGVXaWR0aCArIGxpbmVT
dGF0dXMuY29sbGFwc2libGVXaWR0aCkKKyAgICAgICAgICAgIHJldHVybiB7IFJlc3VsdDo6QWN0
aW9uOjpLZWVwIH07CisgICAgfQorICAgIGlmIChpc1Zpc3VhbGx5RW1wdHlXaGl0ZXNwYWNlQ29u
dGVudChjb250aW51b3VzQ29udGVudCkgJiYgc2hvdWxkS2VlcEVuZE9mTGluZVdoaXRlc3BhY2Uo
Y29udGludW91c0NvbnRlbnQpKSB7CisgICAgICAgIC8vIFRoaXMgb3ZlcmZsb3dpbmcgY29udGVu
dCBhcHBhcmVudGx5IGZhbGxzIGludG8gdGhlIHJlbW92ZS9oYW5nIGVuZC1vZi1saW5lLXNwYWNl
cyBjYXRlZ29yeS4KKyAgICAgICAgLy8gc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4
dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eSBtYXRyaXgKKyAgICAgICAgcmV0dXJuIHsgUmVzdWx0
OjpBY3Rpb246OktlZXAgfTsKKyAgICB9CisKKyAgICBzaXplX3Qgb3ZlcmZsb3dpbmdSdW5JbmRl
eCA9IDA7CisgICAgaWYgKGhhc1RleHRSdW4oY29udGludW91c0NvbnRlbnQpKSB7CisgICAgICAg
IGF1dG8gdHJ5QnJlYWtpbmdDb250ZW50V2l0aFRleHQgPSBbJl0oKSAtPiBPcHRpb25hbDxSZXN1
bHQ+IHsKKyAgICAgICAgICAgIC8vIDEuIFRoaXMgdGV4dCBjb250ZW50IGlzIG5vdCBicmVha2Fi
bGUuCisgICAgICAgICAgICAvLyAyLiBUaGlzIGJyZWFrYWJsZSB0ZXh0IGNvbnRlbnQgZG9lcyBu
b3QgZml0IGF0IGFsbC4gTm90IGV2ZW4gdGhlIGZpcnN0IGdseXBoLiBUaGlzIGlzIGEgdmVyeSBz
cGVjaWFsIGNhc2UuCisgICAgICAgICAgICAvLyAzLiBXZSBjYW4gYnJlYWsgdGhlIGNvbnRlbnQg
YnV0IGl0IHN0aWxsIG92ZXJmbG93cy4KKyAgICAgICAgICAgIC8vIDQuIE1hbmFnZWQgdG8gYnJl
YWsgdGhlIGNvbnRlbnQgYmVmb3JlIHRoZSBvdmVyZmxvdyBwb2ludC4KKyAgICAgICAgICAgIGF1
dG8gb3ZlcmZsb3dpbmdDb250ZW50ID0gcHJvY2Vzc092ZXJmbG93aW5nQ29udGVudFdpdGhUZXh0
KGNvbnRpbnVvdXNDb250ZW50LCBsaW5lU3RhdHVzKTsKKyAgICAgICAgICAgIG92ZXJmbG93aW5n
UnVuSW5kZXggPSBvdmVyZmxvd2luZ0NvbnRlbnQucnVuSW5kZXg7CisgICAgICAgICAgICBpZiAo
IW92ZXJmbG93aW5nQ29udGVudC5icmVha2luZ1Bvc2l0aW9uKQorICAgICAgICAgICAgICAgIHJl
dHVybiB7IH07CisgICAgICAgICAgICBhdXRvIHRyYWlsaW5nQ29udGVudCA9IG92ZXJmbG93aW5n
Q29udGVudC5icmVha2luZ1Bvc2l0aW9uLT50cmFpbGluZ0NvbnRlbnQ7CisgICAgICAgICAgICBp
ZiAoIXRyYWlsaW5nQ29udGVudCkgeworICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHRvIGJy
ZWFrIHRoZSBjb250ZW50IGJ1dCB0aGUgYXZhaWxhYmxlIHNwYWNlIGNhbid0IGV2ZW4gYWNjb21t
b2RhdGUgdGhlIGZpcnN0IGdseXBoLgorICAgICAgICAgICAgICAgIC8vIDEuIFdyYXAgdGhlIGNv
bnRlbnQgb3ZlciB0byB0aGUgbmV4dCBsaW5lIHdoZW4gd2UndmUgZ290IGNvbnRlbnQgb24gdGhl
IGxpbmUgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICAvLyAyLiBLZWVwIHRoZSBmaXJzdCBnbHlw
aCBvbiB0aGUgZW1wdHkgbGluZSAob3Iga2VlcCB0aGUgd2hvbGUgcnVuIGlmIGl0IGhhcyBvbmx5
IG9uZSBnbHlwaC9jb21wbGV0ZWx5IGVtcHR5KS4KKyAgICAgICAgICAgICAgICBpZiAobGluZVN0
YXR1cy5oYXNDb250ZW50KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVz
dWx0OjpBY3Rpb246OldyYXAsIElzRW5kT2ZMaW5lOjpZZXMgfTsKKyAgICAgICAgICAgICAgICBh
dXRvIGxlYWRpbmdUZXh0UnVuSW5kZXggPSAqZmlyc3RUZXh0UnVuSW5kZXgoY29udGludW91c0Nv
bnRlbnQpOworICAgICAgICAgICAgICAgIGF1dG8mIGlubGluZVRleHRJdGVtID0gZG93bmNhc3Q8
SW5saW5lVGV4dEl0ZW0+KGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKVtsZWFkaW5nVGV4dFJ1bklu
ZGV4XS5pbmxpbmVJdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5saW5lVGV4dEl0ZW0ubGVu
Z3RoKCkgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdCB7IFJlc3VsdDo6
QWN0aW9uOjpLZWVwLCBJc0VuZE9mTGluZTo6WWVzIH07CisgICAgICAgICAgICAgICAgYXV0byBm
aXJzdENoYXJhY3RlcldpZHRoID0gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRJdGVtLCBpbmxp
bmVUZXh0SXRlbS5zdGFydCgpLCBpbmxpbmVUZXh0SXRlbS5zdGFydCgpICsgMSwgbGluZVN0YXR1
cy5jb250ZW50TG9naWNhbFJpZ2h0KTsKKyAgICAgICAgICAgICAgICBhdXRvIGZpcnN0Q2hhcmFj
dGVyUnVuID0gUGFydGlhbFJ1biB7IDEsIGZpcnN0Q2hhcmFjdGVyV2lkdGggfTsKKyAgICAgICAg
ICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246OkJyZWFrLCBJc0VuZE9mTGlu
ZTo6WWVzLCBSZXN1bHQ6OlBhcnRpYWxUcmFpbGluZ0NvbnRlbnQgeyBsZWFkaW5nVGV4dFJ1bklu
ZGV4LCBmaXJzdENoYXJhY3RlclJ1biB9IH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBp
ZiAodHJhaWxpbmdDb250ZW50LT5vdmVyZmxvd3MgJiYgbGluZVN0YXR1cy5oYXNDb250ZW50KSB7
CisgICAgICAgICAgICAgICAgLy8gV2UgbWFuYWdlZCB0byBicmVhayBhIHJ1biB3aXRoIG92ZXJm
bG93IGJ1dCB0aGUgbGluZSBhbHJlYWR5IGhhcyBjb250ZW50LiBMZXQncyB3cmFwIGl0IHRvIHRo
ZSBuZXh0IGxpbmUuCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdCB7IFJlc3VsdDo6QWN0
aW9uOjpXcmFwLCBJc0VuZE9mTGluZTo6WWVzIH07CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICAvLyBFaXRoZXIgd2UgbWFuYWdlZCB0byBicmVhayB3aXRoIG5vIG92ZXJmbG93IG9yIHRoZSBs
aW5lIGlzIGVtcHR5LgorICAgICAgICAgICAgYXV0byB0cmFpbGluZ1BhcnRpYWxDb250ZW50ID0g
UmVzdWx0OjpQYXJ0aWFsVHJhaWxpbmdDb250ZW50IHsgb3ZlcmZsb3dpbmdDb250ZW50LmJyZWFr
aW5nUG9zaXRpb24tPnJ1bkluZGV4LCB0cmFpbGluZ0NvbnRlbnQtPnBhcnRpYWxSdW4gfTsKKyAg
ICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6OkFjdGlvbjo6QnJlYWssIElzRW5kT2ZM
aW5lOjpZZXMsIHRyYWlsaW5nUGFydGlhbENvbnRlbnQgfTsKKyAgICAgICAgfTsKKyAgICAgICAg
aWYgKGF1dG8gcmVzdWx0ID0gdHJ5QnJlYWtpbmdDb250ZW50V2l0aFRleHQoKSkKKyAgICAgICAg
ICAgIHJldHVybiAqcmVzdWx0OworICAgIH0gZWxzZSBpZiAoY29udGludW91c0NvbnRlbnQucnVu
cygpLnNpemUoKSA+IDEpIHsKKyAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciB2YXJp
b3VzIGNvbnRlbnQuCisgICAgICAgIGF1dG8mIHJ1bnMgPSBjb250aW51b3VzQ29udGVudC5ydW5z
KCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcnVucy5zaXplKCk7ICsraSkgewor
ICAgICAgICAgICAgaWYgKHJ1bnNbaV0uaW5saW5lSXRlbS5pc0JveCgpKSB7CisgICAgICAgICAg
ICAgICAgb3ZlcmZsb3dpbmdSdW5JbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB3ZSBhcmUgbm90IGFs
bG93ZWQgdG8gYnJlYWsgdGhpcyBvdmVyZmxvd2luZyBjb250ZW50LCB3ZSBzdGlsbCBuZWVkIHRv
IGRlY2lkZSB3aGV0aGVyIGtlZXAgaXQgb3Igd3JhcCBpdCB0byB0aGUgbmV4dCBsaW5lLgorICAg
IGlmICghbGluZVN0YXR1cy5oYXNDb250ZW50KQorICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFj
dGlvbjo6S2VlcCwgSXNFbmRPZkxpbmU6Ok5vIH07CisgICAgLy8gTm93IGVpdGhlciB3cmFwIHRo
aXMgY29udGVudCBvdmVyIHRvIHRoZSBuZXh0IGxpbmUgb3IgcmV2ZXJ0IGJhY2sgdG8gYW4gZWFy
bGllciB3cmFwcGluZyBvcHBvcnR1bml0eSwgb3Igbm90IHdyYXAgYXQgYWxsLgorICAgIGF1dG8g
c2hvdWxkV3JhcFVuYnJlYWthYmxlQ29udGVudFRvTmV4dExpbmUgPSBbJl0geworICAgICAgICAv
LyBUaGUgaW5kaXZpZHVhbCBydW5zIGluIHRoaXMgY29udGludW91cyBjb250ZW50IGRvbid0IGJy
ZWFrLCBsZXQncyBjaGVjayBpZiB3ZSBhcmUgYWxsb3dlZCB0byB3cmFwIHRoaXMgY29udGVudCB0
byBuZXh0IGxpbmUgKGUuZy4gcHJlIHdvdWxkIHByZXZlbnQgdXMgZnJvbSB3cmFwcGluZykuCisg
ICAgICAgIC8vIFBhcmVudCBzdHlsZSBkcml2ZXMgdGhlIHdyYXBwaW5nIGJlaGF2aW9yIGhlcmUu
CisgICAgICAgIC8vIGUuZy4gPGRpdiBzdHlsZT0id2hpdGUtc3BhY2U6IG5vd3JhcCI+c29tZSB0
ZXh0PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogcHJlLXdy
YXAiPjwvZGl2PjwvZGl2Pi4KKyAgICAgICAgLy8gV2hpbGUgdGhlIGlubGluZS1ibG9jayBoYXMg
cHJlLXdyYXAgd2hpY2ggYWxsb3dzIHdyYXBwaW5nLCB0aGUgY29udGVudCBsaXZlcyBpbiBhIG5v
d3JhcCBjb250ZXh0LgorICAgICAgICByZXR1cm4gaXNXcmFwcGluZ0FsbG93ZWQoY29udGludW91
c0NvbnRlbnQucnVucygpW292ZXJmbG93aW5nUnVuSW5kZXhdLmlubGluZUl0ZW0pOworICAgIH07
CisgICAgaWYgKHNob3VsZFdyYXBVbmJyZWFrYWJsZUNvbnRlbnRUb05leHRMaW5lKCkpCisgICAg
ICAgIHJldHVybiB7IFJlc3VsdDo6QWN0aW9uOjpXcmFwLCBJc0VuZE9mTGluZTo6WWVzIH07Cisg
ICAgaWYgKGxpbmVTdGF0dXMuaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKQor
ICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0V3JhcE9wcG9ydHVu
aXR5LCBJc0VuZE9mTGluZTo6WWVzIH07CisgICAgcmV0dXJuIHsgUmVzdWx0OjpBY3Rpb246Oktl
ZXAsIElzRW5kT2ZMaW5lOjpObyB9OworfQorCitPdmVyZmxvd2luZ1RleHRDb250ZW50IElubGlu
ZUNvbnRlbnRCcmVha2VyOjpwcm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50V2l0aFRleHQoY29uc3Qg
Q29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250ZW50LCBjb25zdCBMaW5lU3RhdHVzJiBs
aW5lU3RhdHVzKSBjb25zdAoreworICAgIGF1dG8mIHJ1bnMgPSBjb250aW51b3VzQ29udGVudC5y
dW5zKCk7CisgICAgQVNTRVJUKCFydW5zLmlzRW1wdHkoKSk7CisKKyAgICBhdXRvIGlzQnJlYWth
YmxlUnVuID0gW10gKGF1dG8mIHJ1bikgeworICAgICAgICBBU1NFUlQocnVuLmlubGluZUl0ZW0u
aXNUZXh0KCkgfHwgcnVuLmlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpIHx8IHJ1bi5pbmxp
bmVJdGVtLmlzSW5saW5lQm94RW5kKCkgfHwgcnVuLmlubGluZUl0ZW0ubGF5b3V0Qm94KCkuaXNJ
bWFnZSgpKTsKKyAgICAgICAgaWYgKCFydW4uaW5saW5lSXRlbS5pc1RleHQoKSkgeworICAgICAg
ICAgICAgLy8gQ2FuJ3QgYnJlYWsgaG9yaXpvbnRhbCBzcGFjaW5nIC0+IGUuZy4gPHNwYW4gc3R5
bGU9InBhZGRpbmctcmlnaHQ6IDEwMHB4OyI+dGV4dGNvbnRlbnQ8L3NwYW4+LCBpZiB0aGUgW2lu
bGluZSBib3ggZW5kXSBpcyB0aGUgb3ZlcmZsb3duIGlubGluZSBpdGVtCisgICAgICAgICAgICAv
LyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlJ3MgYW5vdGhlciBpbmxpbmUgaXRlbSBiZXlvbmQg
dGhlIFtpbmxpbmUgYm94IGVuZF0gdG8gc3BsaXQuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyB0ZXh0IHJ1biBuZWVkcyB0byBz
dGF5IG9uIHRoZSBjdXJyZW50IGxpbmUuICAKKyAgICAgICAgcmV0dXJuIGlzV3JhcHBpbmdBbGxv
d2VkKHJ1bi5pbmxpbmVJdGVtKTsKKyAgICB9OworCisgICAgYXV0byBmaW5kVHJhaWxpbmdSdW5J
bmRleCA9IFsmXSAoYXV0byBicmVha2FibGVSdW5JbmRleCkgLT4gT3B0aW9uYWw8c2l6ZV90PiB7
CisgICAgICAgIC8vIFdoZW4gdGhlIGJyZWFraW5nIHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5p
bmcgb2YgdGhlIHJ1biwgdGhlIHRyYWlsaW5nIHJ1biBpcyB0aGUgcHJldmlvdXMgb25lLgorICAg
ICAgICBpZiAoIWJyZWFrYWJsZVJ1bkluZGV4KQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAg
ICAgICAgLy8gVHJ5IG5vdCBicmVhayBjb250ZW50IGF0IGlubGluZSBib3ggYm91bmRhcnkKKyAg
ICAgICAgLy8gZS5nLiA8c3Bhbj5maXRzPC9zcGFuPjxzcGFuPm92ZXJmbG93czwvc3Bhbj4KKyAg
ICAgICAgLy8gd2hlbiB0aGUgdGV4dCAib3ZlcmZsb3dzIiBjb21wbGV0ZWx5IG92ZXJmbG93cywg
bGV0J3MgYnJlYWsgdGhlIGNvbnRlbnQgcmlnaHQgYmVmb3JlIHRoZSAnPHNwYW4+Jy4KKyAgICAg
ICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBzdWJzZXF1ZW50IGVtcHR5IGlubGluZSBib3hl
cyBlLmcuCisgICAgICAgIGF1dG8gdHJhaWxpbmdDYW5kaWRhdGVJbmRleCA9IGJyZWFrYWJsZVJ1
bkluZGV4IC0gMTsKKyAgICAgICAgYXV0byBpc0F0SW5saW5lQm94ID0gcnVuc1t0cmFpbGluZ0Nh
bmRpZGF0ZUluZGV4XS5pbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKTsKKyAgICAgICAgcmV0
dXJuICFpc0F0SW5saW5lQm94ID8gdHJhaWxpbmdDYW5kaWRhdGVJbmRleCA6IHRyYWlsaW5nQ2Fu
ZGlkYXRlSW5kZXggPyBtYWtlT3B0aW9uYWwodHJhaWxpbmdDYW5kaWRhdGVJbmRleCAtIDEpIDog
V1RGOjpudWxsb3B0OworICAgIH07CisKKyAgICAvLyBDaGVjayB3aGVyZSB0aGUgb3ZlcmZsb3cg
b2NjdXJzIGFuZCB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgdG8gZmlndXJlIG91dCB0aGUg
YnJlYWtpbmcgYmVoYXZpb3VyLgorICAgIC8vIDxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBub3Jt
YWwiPmZpcnN0PC9zcGFuPjxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay1hbGwiPnNlY29u
ZDwvc3Bhbj48c3BhbiBzdHlsZT0id29yZC1icmVhazogbm9ybWFsIj50aGlyZDwvc3Bhbj4KKwor
ICAgIC8vIEZpcnN0IGZpbmQgdGhlIG92ZXJmbG93aW5nIHJ1bi4gCisgICAgYXV0byBhY2N1bXVs
YXRlZENvbnRlbnRXaWR0aCA9IElubGluZUxheW91dFVuaXQgeyB9OworICAgIGF1dG8gb3ZlcmZs
b3dpbmdSdW5JbmRleCA9IHJ1bnMuc2l6ZSgpOyAKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7
IGluZGV4IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgYXV0byBydW5Mb2dpY2Fs
V2lkdGggPSBydW5zW2luZGV4XS5sb2dpY2FsV2lkdGg7CisgICAgICAgIGlmIChhY2N1bXVsYXRl
ZENvbnRlbnRXaWR0aCArIHJ1bkxvZ2ljYWxXaWR0aCAgPiBsaW5lU3RhdHVzLmF2YWlsYWJsZVdp
ZHRoKSB7CisgICAgICAgICAgICBvdmVyZmxvd2luZ1J1bkluZGV4ID0gaW5kZXg7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhY2N1bXVsYXRlZENvbnRlbnRXaWR0aCAr
PSBydW5Mb2dpY2FsV2lkdGg7CisgICAgfQorICAgIC8vIFdlIGhhdmUgdG8gaGF2ZSBhbiBvdmVy
Zmxvd2luZyBydW4uCisgICAgUkVMRUFTRV9BU1NFUlQob3ZlcmZsb3dpbmdSdW5JbmRleCA8IHJ1
bnMuc2l6ZSgpKTsKKworICAgIGF1dG8gdHJ5QnJlYWtpbmdPdmVyZmxvd2luZ1J1biA9IFsmXSgp
IC0+IE9wdGlvbmFsPE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb24+IHsK
KyAgICAgICAgYXV0byBvdmVyZmxvd2luZ1J1biA9IHJ1bnNbb3ZlcmZsb3dpbmdSdW5JbmRleF07
CisgICAgICAgIGlmICghaXNCcmVha2FibGVSdW4ob3ZlcmZsb3dpbmdSdW4pKQorICAgICAgICAg
ICAgcmV0dXJuIHsgfTsKKyAgICAgICAgaWYgKGF1dG8gcGFydGlhbFJ1biA9IHRyeUJyZWFraW5n
VGV4dFJ1bihvdmVyZmxvd2luZ1J1biwgbGluZVN0YXR1cy5jb250ZW50TG9naWNhbFJpZ2h0ICsg
YWNjdW11bGF0ZWRDb250ZW50V2lkdGgsIHN0ZDo6bWF4KDAuMGYsIGxpbmVTdGF0dXMuYXZhaWxh
YmxlV2lkdGggLSBhY2N1bXVsYXRlZENvbnRlbnRXaWR0aCksIGxpbmVTdGF0dXMuaGFzV3JhcE9w
cG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSkgeworICAgICAgICAgICAgaWYgKHBhcnRpYWxS
dW4tPmxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gT3ZlcmZsb3dpbmdUZXh0Q29udGVu
dDo6QnJlYWtpbmdQb3NpdGlvbiB7IG92ZXJmbG93aW5nUnVuSW5kZXgsIE92ZXJmbG93aW5nVGV4
dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb246OlRyYWlsaW5nQ29udGVudCB7IGZhbHNlLCBwYXJ0
aWFsUnVuIH0gfTsKKyAgICAgICAgICAgIC8vIFdoZW4gdGhlIGJyZWFraW5nIHBvc2l0aW9uIGlz
IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJ1biwgdGhlIHRyYWlsaW5nIHJ1biBpcyB0aGUgcHJl
dmlvdXMgb25lLgorICAgICAgICAgICAgaWYgKGF1dG8gdHJhaWxpbmdSdW5JbmRleCA9IGZpbmRU
cmFpbGluZ1J1bkluZGV4KG92ZXJmbG93aW5nUnVuSW5kZXgpKQorICAgICAgICAgICAgICAgIHJl
dHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgKnRyYWlsaW5n
UnVuSW5kZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb246OlRyYWls
aW5nQ29udGVudCB7IH0gfTsKKyAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB3ZSBjYW4ndCBhY2Nv
bW1vZGF0ZSBldmVuIHRoZSB2ZXJ5IGZpcnN0IGNoYXJhY3Rlci4gCisgICAgICAgICAgICAvLyBO
b3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB3aGVuIHRoZXJlJ3Mgbm8gYnJlYWthYmxl
IHJ1biBpbiB0aGlzIHNldC4KKyAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250
ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4geyB9
OworICAgIH07CisgICAgLy8gQ2hlY2sgaWYgd2UgYWN0dWFsbHkgYnJlYWsgdGhpcyBydW4uCisg
ICAgaWYgKGF1dG8gYnJlYWtpbmdQb3NpdGlvbiA9IHRyeUJyZWFraW5nT3ZlcmZsb3dpbmdSdW4o
KSkKKyAgICAgICAgcmV0dXJuIHsgb3ZlcmZsb3dpbmdSdW5JbmRleCwgYnJlYWtpbmdQb3NpdGlv
biB9OworCisgICAgYXV0byB0cnlCcmVha2luZ1ByZXZpb3VzTm9uT3ZlcmZsb3dpbmdSdW5zID0g
WyZdKCkgLT4gT3B0aW9uYWw8T3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlv
bj4geworICAgICAgICBhdXRvIHByZXZpb3VzQ29udGVudFdpZHRoID0gYWNjdW11bGF0ZWRDb250
ZW50V2lkdGg7CisgICAgICAgIGZvciAoYXV0byBpbmRleCA9IG92ZXJmbG93aW5nUnVuSW5kZXg7
IGluZGV4LS07KSB7CisgICAgICAgICAgICBhdXRvJiBydW4gPSBydW5zW2luZGV4XTsKKyAgICAg
ICAgICAgIHByZXZpb3VzQ29udGVudFdpZHRoIC09IHJ1bi5sb2dpY2FsV2lkdGg7CisgICAgICAg
ICAgICBpZiAoIWlzQnJlYWthYmxlUnVuKHJ1bikpCisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICBBU1NFUlQocnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpOworICAgICAgICAg
ICAgaWYgKGF1dG8gcGFydGlhbFJ1biA9IHRyeUJyZWFraW5nVGV4dFJ1bihydW4sIGxpbmVTdGF0
dXMuY29udGVudExvZ2ljYWxSaWdodCArIHByZXZpb3VzQ29udGVudFdpZHRoLCB7IH0sIGxpbmVT
dGF0dXMuaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSkgeworICAgICAgICAg
ICAgICAgIC8vIFdlIGtub3cgdGhpcyBydW4gZml0cywgc28gaWYgYnJlYWtpbmcgaXMgYWxsb3dl
ZCBvbiB0aGUgcnVuLCBpdCBzaG91bGQgcmV0dXJuIGEgbm9uLWVtcHR5IGxlZnQtc2lkZQorICAg
ICAgICAgICAgICAgIC8vIHNpbmNlIGl0J3MgZWl0aGVyIGF0IGh5cGhlbiBwb3NpdGlvbiBvciB0
aGUgZW50aXJlIHJ1biBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICBBU1NFUlQocGFydGlh
bFJ1bi0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBhdXRvIHJ1bklzRnVsbHlBY2NvbW1vZGF0
ZWQgPSBwYXJ0aWFsUnVuLT5sZW5ndGggPT0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KHJ1bi5p
bmxpbmVJdGVtKS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT3ZlcmZsb3dpbmdU
ZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IGluZGV4LCBPdmVyZmxvd2luZ1RleHRDb250
ZW50OjpCcmVha2luZ1Bvc2l0aW9uOjpUcmFpbGluZ0NvbnRlbnQgeyBmYWxzZSwgcnVuSXNGdWxs
eUFjY29tbW9kYXRlZCA/IFdURjo6bnVsbG9wdCA6IHBhcnRpYWxSdW4gfSB9OworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB7IH07CisgICAgfTsKKyAgICAvLyBXZSBk
aWQgbm90IG1hbmFnZSB0byBicmVhayB0aGUgcnVuIHRoYXQgYWN0dWFsbHkgb3ZlcmZsb3dzIHRo
ZSBsaW5lLgorICAgIC8vIExldCdzIHRyeSB0byBmaW5kIGEgcHJldmlvdXMgYnJlYWtpbmcgcG9z
aXRpb24gc3RhcnRpbmcgZnJvbSB0aGUgb3ZlcmZsb3dpbmcgcnVuLiBJdCBzdXJlbHkgZml0cy4K
KyAgICBpZiAoYXV0byBicmVha2luZ1Bvc2l0aW9uID0gdHJ5QnJlYWtpbmdQcmV2aW91c05vbk92
ZXJmbG93aW5nUnVucygpKQorICAgICAgICByZXR1cm4geyBvdmVyZmxvd2luZ1J1bkluZGV4LCBi
cmVha2luZ1Bvc2l0aW9uIH07CisKKyAgICBhdXRvIHRyeUJyZWFraW5nTmV4dE92ZXJmbG93aW5n
UnVucyA9IFsmXSgpIC0+IE9wdGlvbmFsPE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5n
UG9zaXRpb24+IHsKKyAgICAgICAgYXV0byBuZXh0Q29udGVudFdpZHRoID0gYWNjdW11bGF0ZWRD
b250ZW50V2lkdGggKyBydW5zW292ZXJmbG93aW5nUnVuSW5kZXhdLmxvZ2ljYWxXaWR0aDsKKyAg
ICAgICAgZm9yIChhdXRvIGluZGV4ID0gb3ZlcmZsb3dpbmdSdW5JbmRleCArIDE7IGluZGV4IDwg
cnVucy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGF1dG8mIHJ1biA9IHJ1bnNbaW5k
ZXhdOworICAgICAgICAgICAgaWYgKGlzQnJlYWthYmxlUnVuKHJ1bikpIHsKKyAgICAgICAgICAg
ICAgICBBU1NFUlQocnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpOworICAgICAgICAgICAgICAgIC8v
IFdlIGtub3cgdGhhdCB0aGlzIHJ1biBkb2VzIG5vdCBmaXQgdGhlIGF2YWlsYWJsZSBzcGFjZS4g
SWYgd2UgY2FuIGJyZWFrIGl0IGF0IGFueSBwb3NpdGlvbiwgbGV0J3MganVzdCB1c2UgdGhlIHN0
YXJ0IG9mIHRoZSBydW4uCisgICAgICAgICAgICAgICAgaWYgKHdvcmRCcmVha0JlaGF2aW9yKHJ1
bi5pbmxpbmVJdGVtLnN0eWxlKCksIGxpbmVTdGF0dXMuaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2
aW91c1Bvc2l0aW9uKSA9PSBXb3JkQnJlYWtSdWxlOjpBdEFyYml0cmFyeVBvc2l0aW9uKSB7Cisg
ICAgICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgYmUgb24gYW4gaW5saW5lIGJveCBib3VuZGFy
eS4gTGV0J3MgZ28gYmFjayB0byB0aGUgcnVuIGluIGZyb250IG9mIHRoZSBpbmxpbmUgYm94IHN0
YXJ0IHJ1bi4KKyAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiA8c3Bhbj51bmJyZWFrYWJsZV9h
bmRfb3ZlcmZsb3c8c3BhbiBzdHlsZT0id29yZC1icmVhazogYnJlYWstYWxsIj5icmVha2FibGU8
L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBhdCAiYnJlYWthYmxlIiwgPHNw
YW4+IGlzIGF0IGluZGV4IC0gMSBhbmQgdGhlIHRyYWlsaW5nIHJ1biBpcyBhdCBpbmRleCAtIDIu
CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChydW5zW2luZGV4IC0gMV0uaW5saW5lSXRlbS5p
c0lubGluZUJveFN0YXJ0KCkpOworICAgICAgICAgICAgICAgICAgICBhdXRvIHRyYWlsaW5nUnVu
SW5kZXggPSBmaW5kVHJhaWxpbmdSdW5JbmRleChpbmRleCk7CisgICAgICAgICAgICAgICAgICAg
IGlmICghdHJhaWxpbmdSdW5JbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhp
cyBjb250aW51b3VzIGNvbnRlbnQgZGlkIG5vdCBmaXQgZnJvbSB0aGUgZ2V0LWdvLiBObyB0cmFp
bGluZyBydW4uCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3ZlcmZsb3dpbmdUZXh0
Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IH07CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgLy8gQXQgd29yc3Qgd2UgYXJlIGJhY2sgdG8gdGhlIG92ZXJmbG93
aW5nIHJ1biwgbGlrZSBpbiB0aGUgZXhhbXBsZSBhYm92ZS4KKyAgICAgICAgICAgICAgICAgICAg
QVNTRVJUKCp0cmFpbGluZ1J1bkluZGV4ID49IG92ZXJmbG93aW5nUnVuSW5kZXgpOworICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3Np
dGlvbiB7ICp0cmFpbGluZ1J1bkluZGV4LCBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2lu
Z1Bvc2l0aW9uOjpUcmFpbGluZ0NvbnRlbnQgeyB0cnVlIH0gfTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgaWYgKGF1dG8gcGFydGlhbFJ1biA9IHRyeUJyZWFraW5nVGV4dFJ1
bihydW4sIGxpbmVTdGF0dXMuY29udGVudExvZ2ljYWxSaWdodCArIG5leHRDb250ZW50V2lkdGgs
IHsgfSwgbGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pKSB7
CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChwYXJ0aWFsUnVuLT5sZW5ndGgpOworICAgICAg
ICAgICAgICAgICAgICAvLyBXZSBtYW5hZ2VkIHRvIGJyZWFrIHRoaXMgdGV4dCBydW4gbWlkIGNv
bnRlbnQuIEl0IGhhcyB0byBiZSBhIGh5cGhlbiBicmVhay4KKyAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb24geyBpbmRleCwg
T3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbjo6VHJhaWxpbmdDb250ZW50
IHsgdHJ1ZSwgcGFydGlhbFJ1biB9IH07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fQorICAgICAgICAgICAgbmV4dENvbnRlbnRXaWR0aCArPSBydW4ubG9naWNhbFdpZHRoOworICAg
ICAgICB9CisgICAgICAgIHJldHVybiB7IH07CisgICAgfTsKKyAgICAvLyBBdCB0aGlzIHBvaW50
IHdlIGtub3cgdGhhdCB0aGVyZSdzIG5vIGJyZWFrYWJsZSBydW4gYWxsIHRoZSB3YXkgdG8gdGhl
IG92ZXJmbG93aW5nIHJ1bi4KKyAgICAvLyBOb3cgd2UgbmVlZCB0byBjaGVjayBpZiBhbnkgcnVu
IGFmdGVyIHRoZSBvdmVyZmxvd2luZyBjb250ZW50IGNhbiBicmVhay4KKyAgICAvLyBlLmcuIDxz
cGFuPnRoaXNfY29udGVudF9vdmVyZmxvd3NfYnV0X25vdF9icmVha2FibGU8c3Bhbj48c3BhbiBz
dHlsZT0id29yZC1icmVhazogYnJlYWstYWxsIj5idXRfdGhpc19pc19icmVha2FibGU8L3NwYW4+
CisgICAgaWYgKGF1dG8gYnJlYWtpbmdQb3NpdGlvbiA9IHRyeUJyZWFraW5nTmV4dE92ZXJmbG93
aW5nUnVucygpKQorICAgICAgICByZXR1cm4geyBvdmVyZmxvd2luZ1J1bkluZGV4LCBicmVha2lu
Z1Bvc2l0aW9uIH07CisKKyAgICAvLyBHaXZlIHVwLCB0aGVyZSdzIG5vIGJyZWFrYWJsZSBydW4g
aW4gaGVyZS4KKyAgICByZXR1cm4geyBvdmVyZmxvd2luZ1J1bkluZGV4IH07Cit9CisKK09wdGlv
blNldDxJbmxpbmVDb250ZW50QnJlYWtlcjo6V29yZEJyZWFrUnVsZT4gSW5saW5lQ29udGVudEJy
ZWFrZXI6OndvcmRCcmVha0JlaGF2aW9yKGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSwgYm9vbCBo
YXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pIGNvbnN0Cit7CisgICAgLy8gRGlz
cmVnYXJkIGFueSBwcm9oaWJpdGlvbiBhZ2FpbnN0IGxpbmUgYnJlYWtzIG1hbmRhdGVkIGJ5IHRo
ZSB3b3JkLWJyZWFrIHByb3BlcnR5LgorICAgIC8vIFRoZSBkaWZmZXJlbnQgd3JhcHBpbmcgb3Bw
b3J0dW5pdGllcyBtdXN0IG5vdCBiZSBwcmlvcml0aXplZC4gSHlwaGVuYXRpb24gaXMgbm90IGFw
cGxpZWQuCisgICAgaWYgKHN0eWxlLmxpbmVCcmVhaygpID09IExpbmVCcmVhazo6QW55d2hlcmUp
CisgICAgICAgIHJldHVybiB7IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRpb24gfTsK
KyAgICAvLyBCcmVha2luZyBpcyBhbGxvd2VkIHdpdGhpbiDigJx3b3Jkc+KAnS4KKyAgICBpZiAo
c3R5bGUud29yZEJyZWFrKCkgPT0gV29yZEJyZWFrOjpCcmVha0FsbCkKKyAgICAgICAgcmV0dXJu
IHsgV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbiB9OworICAgIC8vIEJyZWFraW5n
IGlzIGZvcmJpZGRlbiB3aXRoaW4g4oCcd29yZHPigJ0uCisgICAgaWYgKHN0eWxlLndvcmRCcmVh
aygpID09IFdvcmRCcmVhazo6S2VlcEFsbCkKKyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIGF1
dG8gYnJlYWtSdWxlcyA9IE9wdGlvblNldDxXb3JkQnJlYWtSdWxlPiB7IH07CisgICAgYXV0byBo
eXBoZW5hdGlvbklzQWxsb3dlZCA9ICFuX2h5cGhlbmF0aW9uSXNEaXNhYmxlZCAmJiBzdHlsZS5o
eXBoZW5zKCkgPT0gSHlwaGVuczo6QXV0byAmJiBjYW5IeXBoZW5hdGUoc3R5bGUuY29tcHV0ZWRM
b2NhbGUoKSk7CisgICAgaWYgKGh5cGhlbmF0aW9uSXNBbGxvd2VkKQorICAgICAgICBicmVha1J1
bGVzLmFkZCh7IFdvcmRCcmVha1J1bGU6OkF0SHlwaGVuYXRpb25PcHBvcnR1bml0aWVzIH0pOwor
ICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IGNvbnRlbnQsIHRoZSB3b3JkLWJy
ZWFrIHByb3BlcnR5IGFsc28gc3VwcG9ydHMgYSBkZXByZWNhdGVkIGJyZWFrLXdvcmQga2V5d29y
ZC4KKyAgICAvLyBXaGVuIHNwZWNpZmllZCwgdGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHdv
cmQtYnJlYWs6IG5vcm1hbCBhbmQgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmUsIHJlZ2FyZGxlc3Mg
b2YgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgb3ZlcmZsb3ctd3JhcCBwcm9wZXJ0eS4KKyAgICBp
ZiAoc3R5bGUud29yZEJyZWFrKCkgPT0gV29yZEJyZWFrOjpCcmVha1dvcmQgJiYgIWhhc1dyYXBP
cHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgeworICAgICAgICBicmVha1J1bGVzLmFkZCh7
IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRpb24gfSk7CisgICAgICAgIHJldHVybiBi
cmVha1J1bGVzOworICAgIH0KKyAgICAvLyBPdmVyZmxvd1dyYXA6OkJyZWFrOiBBbiBvdGhlcndp
c2UgdW5icmVha2FibGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBtYXkgYmUgYnJva2VuIGF0IGFu
IGFyYml0cmFyeSBwb2ludCBpZiB0aGVyZSBhcmUgbm8gb3RoZXJ3aXNlLWFjY2VwdGFibGUgYnJl
YWsgcG9pbnRzIGluIHRoZSBsaW5lLgorICAgIGlmIChzdHlsZS5vdmVyZmxvd1dyYXAoKSA9PSBP
dmVyZmxvd1dyYXA6OkJyZWFrICYmICFoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRp
b24pIHsKKyAgICAgICAgYnJlYWtSdWxlcy5hZGQoeyBXb3JkQnJlYWtSdWxlOjpBdEFyYml0cmFy
eVBvc2l0aW9uIH0pOworICAgICAgICByZXR1cm4gYnJlYWtSdWxlczsKKyAgICB9CisgICAgcmV0
dXJuIGJyZWFrUnVsZXM7Cit9CisKK09wdGlvbmFsPElubGluZUNvbnRlbnRCcmVha2VyOjpQYXJ0
aWFsUnVuPiBJbmxpbmVDb250ZW50QnJlYWtlcjo6dHJ5QnJlYWtpbmdUZXh0UnVuKGNvbnN0IENv
bnRpbnVvdXNDb250ZW50OjpSdW4mIG92ZXJmbG93aW5nUnVuLCBJbmxpbmVMYXlvdXRVbml0IGxv
Z2ljYWxMZWZ0LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBhdmFpbGFibGVXaWR0aCwgYm9v
bCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pIGNvbnN0Cit7CisgICAgQVNT
RVJUKG92ZXJmbG93aW5nUnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpOworICAgIGF1dG8mIGlubGlu
ZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KG92ZXJmbG93aW5nUnVuLmlubGlu
ZUl0ZW0pOworICAgIGF1dG8mIHN0eWxlID0gaW5saW5lVGV4dEl0ZW0uc3R5bGUoKTsKKyAgICBh
dXRvIGF2YWlsYWJsZVNwYWNlSXNJbmZpbml0ZSA9ICFhdmFpbGFibGVXaWR0aC5oYXNWYWx1ZSgp
OworCisgICAgYXV0byBicmVha1J1bGVzID0gd29yZEJyZWFrQmVoYXZpb3Ioc3R5bGUsIGhhc1dy
YXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbik7CisgICAgaWYgKGJyZWFrUnVsZXMuaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm4geyB9OworCisgICAgaWYgKGJyZWFrUnVsZXMuY29udGFp
bnMoV29yZEJyZWFrUnVsZTo6QXRIeXBoZW5hdGlvbk9wcG9ydHVuaXRpZXMpKSB7CisgICAgICAg
IGF1dG8gdHJ5QnJlYWtpbmdBdEh5cGhlbmF0aW9uT3Bwb3J0dW5pdHkgPSBbJl0oKSAtPiBPcHRp
b25hbDxQYXJ0aWFsUnVuPiB7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBoeXBoZW4gcG9zaXRp
b24gYXMgZm9sbG93czoKKyAgICAgICAgICAgIC8vIDEuIFNwbGl0IHRoZSB0ZXh0IGJ5IHRha2lu
ZyB0aGUgaHlwaGVuIHdpZHRoIGludG8gYWNjb3VudAorICAgICAgICAgICAgLy8gMi4gRmluZCB0
aGUgbGFzdCBoeXBoZW4gcG9zaXRpb24gYmVmb3JlIHRoZSBzcGxpdCBwb3NpdGlvbgorICAgICAg
ICAgICAgaWYgKCFhdmFpbGFibGVTcGFjZUlzSW5maW5pdGUgJiYgISphdmFpbGFibGVXaWR0aCkg
eworICAgICAgICAgICAgICAgIC8vIFdlIHdvbid0IGJlIGFibGUgdG8gZmluZCBoeXBoZW4gbG9j
YXRpb24gd2hlbiB0aGVyZSdzIG5vIGF2YWlsYWJsZSBzcGFjZS4KKyAgICAgICAgICAgICAgICBy
ZXR1cm4geyB9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBydW5MZW5ndGggPSBp
bmxpbmVUZXh0SXRlbS5sZW5ndGgoKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxpbWl0QmVmb3Jl
ID0gc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpID09IFJlbmRlclN0eWxlOjppbml0aWFs
SHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpID8gMCA6IHN0eWxlLmh5cGhlbmF0aW9uTGltaXRCZWZv
cmUoKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxpbWl0QWZ0ZXIgPSBzdHlsZS5oeXBoZW5hdGlv
bkxpbWl0QWZ0ZXIoKSA9PSBSZW5kZXJTdHlsZTo6aW5pdGlhbEh5cGhlbmF0aW9uTGltaXRBZnRl
cigpID8gMCA6IHN0eWxlLmh5cGhlbmF0aW9uTGltaXRBZnRlcigpOworICAgICAgICAgICAgLy8g
Q2hlY2sgaWYgdGhpcyBydW4gY2FuIGFjY29tbW9kYXRlIHRoZSBiZWZvcmUvYWZ0ZXIgbGltaXRz
IGF0IGFsbCBiZWZvcmUgc3RhcnQgbWVhc3VyaW5nIHRleHQuCisgICAgICAgICAgICBpZiAobGlt
aXRCZWZvcmUgPj0gcnVuTGVuZ3RoIHx8IGxpbWl0QWZ0ZXIgPj0gcnVuTGVuZ3RoIHx8IGxpbWl0
QmVmb3JlICsgbGltaXRBZnRlciA+IHJ1bkxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4g
eyB9OworCisgICAgICAgICAgICB1bnNpZ25lZCBsZWZ0U2lkZUxlbmd0aCA9IHJ1bkxlbmd0aDsK
KyAgICAgICAgICAgIGF1dG8mIGZvbnRDYXNjYWRlID0gc3R5bGUuZm9udENhc2NhZGUoKTsKKyAg
ICAgICAgICAgIGF1dG8gaHlwaGVuV2lkdGggPSBJbmxpbmVMYXlvdXRVbml0IHsgZm9udENhc2Nh
ZGUud2lkdGgoVGV4dFJ1biB7IFN0cmluZ1ZpZXcgeyBzdHlsZS5oeXBoZW5TdHJpbmcoKSB9IH0p
IH07CisgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZVNwYWNlSXNJbmZpbml0ZSkgeworICAgICAg
ICAgICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGhFeGNsdWRpbmdIeXBoZW4gPSAqYXZhaWxhYmxl
V2lkdGggLSBoeXBoZW5XaWR0aDsKKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlV2lkdGhF
eGNsdWRpbmdIeXBoZW4gPD0gMCB8fCAhZW5vdWdoV2lkdGhGb3JIeXBoZW5hdGlvbihhdmFpbGFi
bGVXaWR0aEV4Y2x1ZGluZ0h5cGhlbiwgZm9udENhc2NhZGUucGl4ZWxTaXplKCkpKQorICAgICAg
ICAgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICAgICAgICAgIGxlZnRTaWRlTGVuZ3Ro
ID0gVGV4dFV0aWw6OnNwbGl0KGlubGluZVRleHRJdGVtLCBvdmVyZmxvd2luZ1J1bi5sb2dpY2Fs
V2lkdGgsIGF2YWlsYWJsZVdpZHRoRXhjbHVkaW5nSHlwaGVuLCBsb2dpY2FsTGVmdCkubGVuZ3Ro
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlZnRTaWRlTGVuZ3RoIDwgbGltaXRC
ZWZvcmUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgICAgIC8vIEFkanVz
dCBiZWZvcmUgaW5kZXggdG8gYWNjb21tb2RhdGUgdGhlIGxpbWl0LWFmdGVyIHZhbHVlIChpdCdz
IHRoZSBsYXN0IHBvdGVudGlhbCBoeXBoZW4gbG9jYXRpb24gaW4gdGhpcyBydW4pLgorICAgICAg
ICAgICAgYXV0byBoeXBoZW5CZWZvcmUgPSBzdGQ6Om1pbihsZWZ0U2lkZUxlbmd0aCwgcnVuTGVu
Z3RoIC0gbGltaXRBZnRlcikgKyAxOworICAgICAgICAgICAgdW5zaWduZWQgaHlwaGVuTG9jYXRp
b24gPSBsYXN0SHlwaGVuTG9jYXRpb24oU3RyaW5nVmlldyhpbmxpbmVUZXh0SXRlbS5pbmxpbmVU
ZXh0Qm94KCkuY29udGVudCgpKS5zdWJzdHJpbmcoaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwgaW5s
aW5lVGV4dEl0ZW0ubGVuZ3RoKCkpLCBoeXBoZW5CZWZvcmUsIHN0eWxlLmNvbXB1dGVkTG9jYWxl
KCkpOworICAgICAgICAgICAgaWYgKCFoeXBoZW5Mb2NhdGlvbiB8fCBoeXBoZW5Mb2NhdGlvbiA8
IGxpbWl0QmVmb3JlKQorICAgICAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgICAgICAv
LyBoeXBoZW5Mb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhpcyBJbmxpbmVJ
dGVtVGV4dC4KKyAgICAgICAgICAgIEFTU0VSVChpbmxpbmVUZXh0SXRlbS5zdGFydCgpICsgaHlw
aGVuTG9jYXRpb24gPCBpbmxpbmVUZXh0SXRlbS5lbmQoKSk7CisgICAgICAgICAgICBhdXRvIHRy
YWlsaW5nUGFydGlhbFJ1bldpZHRoV2l0aEh5cGhlbiA9IFRleHRVdGlsOjp3aWR0aChpbmxpbmVU
ZXh0SXRlbSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSAr
IGh5cGhlbkxvY2F0aW9uLCBsb2dpY2FsTGVmdCk7CisgICAgICAgICAgICByZXR1cm4gUGFydGlh
bFJ1biB7IGh5cGhlbkxvY2F0aW9uLCB0cmFpbGluZ1BhcnRpYWxSdW5XaWR0aFdpdGhIeXBoZW4s
IGh5cGhlbldpZHRoIH07CisgICAgICAgIH07CisgICAgICAgIGlmIChhdXRvIHBhcnRpYWxSdW4g
PSB0cnlCcmVha2luZ0F0SHlwaGVuYXRpb25PcHBvcnR1bml0eSgpKQorICAgICAgICAgICAgcmV0
dXJuIHBhcnRpYWxSdW47CisgICAgfQorCisgICAgaWYgKGJyZWFrUnVsZXMuY29udGFpbnMoV29y
ZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbikpIHsKKyAgICAgICAgYXV0byB0cnlCcmVh
a2luZ0F0QXJiaXRyYXJ5UG9zaXRpb24gPSBbJl0oKSAtPiBQYXJ0aWFsUnVuIHsKKyAgICAgICAg
ICAgIGlmICghaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBF
bXB0eSB0ZXh0IHJ1bnMgbWF5IGJlIGJyZWFrYWJsZSBiYXNlZCBvbiBzdHlsZSwgYnV0IGluIHBy
YWN0aWNlIHdlIGNhbid0IHJlYWxseSBzcGxpdCB0aGVtIGFueSBmdXJ0aGVyLgorICAgICAgICAg
ICAgICAgIHJldHVybiB7IH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZhaWxh
YmxlU3BhY2VJc0luZmluaXRlKSB7CisgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgcnVuIGNh
biBiZSBzcGxpdCBhdCBhcmJpdHJhcnkgcG9zaXRpb24gbGV0J3MganVzdCByZXR1cm4gdGhlIGVu
dGlyZSBydW4gd2hlbiBpdCBpcyBpbnRlbmRlZCB0byBmaXQgb24gdGhlIGxpbmUuCisgICAgICAg
ICAgICAgICAgQVNTRVJUKGlubGluZVRleHRJdGVtLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAg
ICBhdXRvIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoID0gVGV4dFV0aWw6OndpZHRoKGlubGluZVRl
eHRJdGVtLCBsb2dpY2FsTGVmdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHsgaW5saW5lVGV4
dEl0ZW0ubGVuZ3RoKCksIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoIH07CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBpZiAoISphdmFpbGFibGVXaWR0aCkgeworICAgICAgICAgICAgICAgIC8v
IEZhc3QgcGF0aCBmb3IgY2FzZXMgd2hlbiB0aGVyZSdzIG5vIHJvb20gYXQgYWxsLiBUaGUgY29u
dGVudCBpcyBicmVha2FibGUgYnV0IHdlIGRvbid0IGhhdmUgc3BhY2UgZm9yIGl0LgorICAgICAg
ICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIHNw
bGl0RGF0YSA9IFRleHRVdGlsOjpzcGxpdChpbmxpbmVUZXh0SXRlbSwgb3ZlcmZsb3dpbmdSdW4u
bG9naWNhbFdpZHRoLCAqYXZhaWxhYmxlV2lkdGgsIGxvZ2ljYWxMZWZ0KTsKKyAgICAgICAgICAg
IHJldHVybiB7IHNwbGl0RGF0YS5sZW5ndGgsIHNwbGl0RGF0YS5sb2dpY2FsV2lkdGggfTsKKyAg
ICAgICAgfTsKKyAgICAgICAgLy8gV2l0aCBhcmJpdHJhcnkgYnJlYWtpbmcgdGhlcmUncyBhbHdh
eXMgYSB2YWxpZCBicmVha2luZyBwb3NpdGlvbiAoZXZlbiBpZiBpdCBpcyBiZWZvcmUgdGhlIGZp
cnN0IHBvc2l0aW9uKS4KKyAgICAgICAgcmV0dXJuIHRyeUJyZWFraW5nQXRBcmJpdHJhcnlQb3Np
dGlvbigpOworICAgIH0KKyAgICByZXR1cm4geyB9OworfQorCit2b2lkIElubGluZUNvbnRlbnRC
cmVha2VyOjpDb250aW51b3VzQ29udGVudDo6YXBwZW5kKGNvbnN0IElubGluZUl0ZW0mIGlubGlu
ZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoLCBPcHRpb25hbDxJbmxpbmVMYXlv
dXRVbml0PiBjb2xsYXBzaWJsZVdpZHRoKQoreworICAgIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJ
dGVtLCBsb2dpY2FsV2lkdGggfSk7CisgICAgbV9sb2dpY2FsV2lkdGggPSBjbGFtcFRvPElubGlu
ZUxheW91dFVuaXQ+KG1fbG9naWNhbFdpZHRoICsgbG9naWNhbFdpZHRoKTsKKyAgICBpZiAoIWNv
bGxhcHNpYmxlV2lkdGgpIHsKKyAgICAgICAgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCA9IHsg
fTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKmNvbGxhcHNpYmxlV2lkdGggPT0g
bG9naWNhbFdpZHRoKSB7CisgICAgICAgIC8vIEZ1bGx5IGNvbGxhcHNpYmxlIHJ1bi4KKyAgICAg
ICAgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCArPSBsb2dpY2FsV2lkdGg7CisgICAgICAgIEFT
U0VSVChtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoIDw9IG1fbG9naWNhbFdpZHRoKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBQYXJ0aWFsbHkgY29sbGFwc2libGUgcnVuLgorICAg
IG1fY29sbGFwc2libGVMb2dpY2FsV2lkdGggPSAqY29sbGFwc2libGVXaWR0aDsKKyAgICBBU1NF
UlQobV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCA8PSBtX2xvZ2ljYWxXaWR0aCk7Cit9CisKK3Zv
aWQgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50OjpyZXNldCgpCit7Cisg
ICAgbV9sb2dpY2FsV2lkdGggPSB7IH07CisgICAgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCA9
IHsgfTsKKyAgICBtX3J1bnMuY2xlYXIoKTsKK30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRp
bmcvSW5saW5lQ29udGVudEJyZWFrZXIuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjVkMmQ0ZDZjZThjMTg5MzFkNWZlOGI1MGEzNzMwMWQ0YWNhOGU3ZDkKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGlu
ZWZvcm1hdHRpbmcvSW5saW5lQ29udGVudEJyZWFrZXIuaApAQCAtMCwwICsxLDE1MCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NP
TlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIFJlbmRlclN0eWxlOworCituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgSW5s
aW5lSXRlbTsKK3N0cnVjdCBPdmVyZmxvd2luZ1RleHRDb250ZW50OworCitjbGFzcyBJbmxpbmVD
b250ZW50QnJlYWtlciB7CitwdWJsaWM6CisgICAgc3RydWN0IFBhcnRpYWxSdW4geworICAgICAg
ICBzaXplX3QgbGVuZ3RoIHsgMCB9OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxX
aWR0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gaHlwaGVuV2lk
dGggeyB9OworICAgIH07CisgICAgZW51bSBjbGFzcyBJc0VuZE9mTGluZSB7IE5vLCBZZXMgfTsK
KyAgICBzdHJ1Y3QgUmVzdWx0IHsKKyAgICAgICAgZW51bSBjbGFzcyBBY3Rpb24geworICAgICAg
ICAgICAgS2VlcCwgLy8gS2VlcCBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCisgICAgICAg
ICAgICBCcmVhaywgLy8gUGFydGlhbCBjb250ZW50IGlzIG9uIHRoZSBjdXJyZW50IGxpbmUuCisg
ICAgICAgICAgICBXcmFwLCAvLyBDb250ZW50IGlzIHdyYXBwZWQgdG8gdGhlIG5leHQgbGluZS4K
KyAgICAgICAgICAgIFdyYXBXaXRoSHlwaGVuLCAvLyBDb250ZW50IGlzIHdyYXBwZWQgdG8gdGhl
IG5leHQgbGluZSBhbmQgdGhlIGN1cnJlbnQgbGluZSBlbmRzIHdpdGggYSB2aXNpYmxlIGh5cGhl
bi4KKyAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGNvbnRlbnQgb3ZlcmZsb3dzIGFuZCBjYW4n
dCBnZXQgYnJva2VuIHVwIGludG8gc21hbGxlciBiaXRzLgorICAgICAgICAgICAgUmV2ZXJ0VG9M
YXN0V3JhcE9wcG9ydHVuaXR5LCAvLyBUaGUgY29udGVudCBuZWVkcyB0byBiZSByZXZlcnRlZCBi
YWNrIHRvIHRoZSBsYXN0IHdyYXAgb3Bwb3J0dW5pdHkuCisgICAgICAgICAgICBSZXZlcnRUb0xh
c3ROb25PdmVyZmxvd2luZ1dyYXBPcHBvcnR1bml0eSAvLyBUaGUgY29udGVudCBuZWVkcyB0byBi
ZSByZXZlcnRlZCBiYWNrIHRvIGEgd3JhcCBvcHBvcnR1bml0eSB0aGF0IHN0aWxsIGZpdHMgdGhl
IGxpbmUuCisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBQYXJ0aWFsVHJhaWxpbmdDb250ZW50
IHsKKyAgICAgICAgICAgIHNpemVfdCB0cmFpbGluZ1J1bkluZGV4IHsgMCB9OworICAgICAgICAg
ICAgT3B0aW9uYWw8UGFydGlhbFJ1bj4gcGFydGlhbFJ1bjsgLy8gbnVsbG9wdCBwYXJ0aWFsIHJ1
biBtZWFucyB0aGUgdHJhaWxpbmcgcnVuIGlzIGEgY29tcGxldGUgcnVuLgorICAgICAgICB9Owor
ICAgICAgICBBY3Rpb24gYWN0aW9uIHsgQWN0aW9uOjpLZWVwIH07CisgICAgICAgIElzRW5kT2ZM
aW5lIGlzRW5kT2ZMaW5lIHsgSXNFbmRPZkxpbmU6Ok5vIH07CisgICAgICAgIE9wdGlvbmFsPFBh
cnRpYWxUcmFpbGluZ0NvbnRlbnQ+IHBhcnRpYWxUcmFpbGluZ0NvbnRlbnQgeyB9OworICAgICAg
ICBjb25zdCBJbmxpbmVJdGVtKiBsYXN0V3JhcE9wcG9ydHVuaXR5SXRlbSB7IG51bGxwdHIgfTsK
KyAgICB9OworCisgICAgLy8gVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIGNv
bnRpbnVvdXMgY29udGVudCBjb21taXR0ZWQgdG8gY29udGVudCBicmVha2luZyBhdCBhIHRpbWUg
KG5vIGluLWJldHdlZW4gd3JhcCBvcHBvcnR1bml0aWVzKS4KKyAgICAvLyBlLmcuCisgICAgLy8g
PGRpdj50ZXh0IGNvbnRlbnQgPHNwYW4+c3BhbjE8L3NwYW4+YmV0d2VlbjxzcGFuPnNwYW4yPC9z
cGFuPjwvZGl2PgorICAgIC8vIFt0ZXh0XVsgXVtjb250ZW50XVsgXVtpbmxpbmUgYm94IHN0YXJ0
XVtzcGFuMV1baW5saW5lIGJveCBlbmRdW2JldHdlZW5dW2lubGluZSBib3ggc3RhcnRdW3NwYW4y
XVtpbmxpbmUgYm94IGVuZF0KKyAgICAvLyBjb250aW51b3VzIGNhbmRpZGF0ZSBjb250ZW50IGF0
IGEgdGltZToKKyAgICAvLyAxLiBbdGV4dF0KKyAgICAvLyAyLiBbIF0KKyAgICAvLyAzLiBbY29u
dGVudF0KKyAgICAvLyA0LiBbIF0KKyAgICAvLyA1LiBbaW5saW5lIGJveCBzdGFydF1bc3BhbjFd
W2lubGluZSBib3ggZW5kXVtiZXR3ZWVuXVtpbmxpbmUgYm94IHN0YXJ0XVtzcGFuMl1baW5saW5l
IGJveCBlbmRdCisgICAgLy8gc2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdGV4dC0z
LyNsaW5lLWJyZWFrLWRldGFpbHMKKyAgICBzdHJ1Y3QgQ29udGludW91c0NvbnRlbnQgeworICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9n
aWNhbFdpZHRoOyB9CisgICAgICAgIElubGluZUxheW91dFVuaXQgY29sbGFwc2libGVMb2dpY2Fs
V2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoOyB9CisgICAg
ICAgIElubGluZUxheW91dFVuaXQgbm9uQ29sbGFwc2libGVMb2dpY2FsV2lkdGgoKSBjb25zdCB7
IHJldHVybiBsb2dpY2FsV2lkdGgoKSAtIGNvbGxhcHNpYmxlTG9naWNhbFdpZHRoKCk7IH0KKyAg
ICAgICAgYm9vbCBoYXNUcmFpbGluZ0NvbGxhcHNpYmxlQ29udGVudCgpIGNvbnN0IHsgcmV0dXJu
ICEhY29sbGFwc2libGVMb2dpY2FsV2lkdGgoKTsgfQorICAgICAgICBib29sIGlzRnVsbHlDb2xs
YXBzaWJsZSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxXaWR0aCgpID09IGNvbGxhcHNpYmxlTG9n
aWNhbFdpZHRoKCk7IH0KKworICAgICAgICB2b2lkIGFwcGVuZChjb25zdCBJbmxpbmVJdGVtJiwg
SW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+
IGNvbGxhcHNpYmxlV2lkdGgpOworICAgICAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAgICAgc3Ry
dWN0IFJ1biB7CisgICAgICAgICAgICBSdW4oY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91
dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICAgICAgICAgIFJ1bihjb25zdCBSdW4mKTsKKyAgICAg
ICAgICAgIFJ1biYgb3BlcmF0b3I9KGNvbnN0IFJ1biYpOworCisgICAgICAgICAgICBjb25zdCBJ
bmxpbmVJdGVtJiBpbmxpbmVJdGVtOworICAgICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dp
Y2FsV2lkdGggeyAwIH07CisgICAgICAgIH07CisgICAgICAgIHVzaW5nIFJ1bkxpc3QgPSBWZWN0
b3I8UnVuLCAzPjsKKyAgICAgICAgY29uc3QgUnVuTGlzdCYgcnVucygpIGNvbnN0IHsgcmV0dXJu
IG1fcnVuczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUnVuTGlzdCBtX3J1bnM7CisgICAg
ICAgIElubGluZUxheW91dFVuaXQgbV9sb2dpY2FsV2lkdGggeyAwIH07CisgICAgICAgIElubGlu
ZUxheW91dFVuaXQgbV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICB9OworCisg
ICAgc3RydWN0IExpbmVTdGF0dXMgeworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRM
b2dpY2FsUmlnaHQgeyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lk
dGggeyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgY29sbGFwc2libGVXaWR0aCB7IDAg
fTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gdHJhaWxpbmdTb2Z0SHlwaGVu
V2lkdGg7CisgICAgICAgIGJvb2wgaGFzRnVsbHlDb2xsYXBzaWJsZVRyYWlsaW5nUnVuIHsgZmFs
c2UgfTsKKyAgICAgICAgYm9vbCBoYXNDb250ZW50IHsgZmFsc2UgfTsKKyAgICAgICAgYm9vbCBo
YXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24geyBmYWxzZSB9OworICAgIH07Cisg
ICAgUmVzdWx0IHByb2Nlc3NJbmxpbmVDb250ZW50KGNvbnN0IENvbnRpbnVvdXNDb250ZW50Jiwg
Y29uc3QgTGluZVN0YXR1cyYpOworICAgIHZvaWQgc2V0SHlwaGVuYXRpb25EaXNhYmxlZCgpIHsg
bl9oeXBoZW5hdGlvbklzRGlzYWJsZWQgPSB0cnVlOyB9CisKKyAgICBzdGF0aWMgYm9vbCBpc1dy
YXBwaW5nQWxsb3dlZChjb25zdCBJbmxpbmVJdGVtJik7CisKK3ByaXZhdGU6CisgICAgUmVzdWx0
IHByb2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnQoY29uc3QgQ29udGludW91c0NvbnRlbnQmLCBjb25z
dCBMaW5lU3RhdHVzJikgY29uc3Q7CisgICAgT3ZlcmZsb3dpbmdUZXh0Q29udGVudCBwcm9jZXNz
T3ZlcmZsb3dpbmdDb250ZW50V2l0aFRleHQoY29uc3QgQ29udGludW91c0NvbnRlbnQmLCBjb25z
dCBMaW5lU3RhdHVzJikgY29uc3Q7CisgICAgT3B0aW9uYWw8UGFydGlhbFJ1bj4gdHJ5QnJlYWtp
bmdUZXh0UnVuKGNvbnN0IENvbnRpbnVvdXNDb250ZW50OjpSdW4mIG92ZXJmbG93UnVuLCBJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBhdmFp
bGFibGVXaWR0aCwgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pIGNv
bnN0OworCisgICAgZW51bSBjbGFzcyBXb3JkQnJlYWtSdWxlIHsKKyAgICAgICAgQXRBcmJpdHJh
cnlQb3NpdGlvbiAgICAgICAgPSAxIDw8IDAsCisgICAgICAgIEF0SHlwaGVuYXRpb25PcHBvcnR1
bml0aWVzID0gMSA8PCAxCisgICAgfTsKKyAgICBPcHRpb25TZXQ8V29yZEJyZWFrUnVsZT4gd29y
ZEJyZWFrQmVoYXZpb3IoY29uc3QgUmVuZGVyU3R5bGUmLCBib29sIGhhc1dyYXBPcHBvcnR1bml0
eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3Q7CisgICAgYm9vbCBzaG91bGRLZWVwRW5kT2ZMaW5l
V2hpdGVzcGFjZShjb25zdCBDb250aW51b3VzQ29udGVudCYpIGNvbnN0OworCisgICAgYm9vbCBu
X2h5cGhlbmF0aW9uSXNEaXNhYmxlZCB7IGZhbHNlIH07Cit9OworCitpbmxpbmUgSW5saW5lQ29u
dGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50OjpSdW46OlJ1bihjb25zdCBJbmxpbmVJdGVt
JiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKKyAgICA6IGlubGlu
ZUl0ZW0oaW5saW5lSXRlbSkKKyAgICAsIGxvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGgpCit7Cit9
CisKK2lubGluZSBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OlJ1bjo6
UnVuKGNvbnN0IFJ1biYgb3RoZXIpCisgICAgOiBpbmxpbmVJdGVtKG90aGVyLmlubGluZUl0ZW0p
CisgICAgLCBsb2dpY2FsV2lkdGgob3RoZXIubG9naWNhbFdpZHRoKQoreworfQorCit9Cit9Cisj
ZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmE1MWVhZmZjZGEzZWVjYzQzZTIxNWQx
ZDk2NDYxMDZjMGNjNWE5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQuY3BwCkBAIC0wLDAgKzEsNjExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwor
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisg
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUo
TEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5o
IgorI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ1N0
YXRlLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgorI2luY2x1ZGUgIklubGluZUxpbmVS
dW4uaCIKKyNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgorI2luY2x1ZGUgIkludmFsaWRhdGlv
blN0YXRlLmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGFp
bmVyQm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgorI2luY2x1ZGUgIkxheW91dElu
aXRpYWxDb250YWluaW5nQmxvY2suaCIKKyNpbmNsdWRlICJMYXlvdXRJbmxpbmVUZXh0Qm94Lmgi
CisjaW5jbHVkZSAiTGF5b3V0TGluZUJyZWFrQm94LmgiCisjaW5jbHVkZSAiTGF5b3V0UmVwbGFj
ZWRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIK
KyNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmgiCisjaW5jbHVkZSAiVGV4dFV0aWwu
aCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0
L1RleHRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7
CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCk7
CisKK0lubGluZUZvcm1hdHRpbmdDb250ZXh0OjpJbmxpbmVGb3JtYXR0aW5nQ29udGV4dChjb25z
dCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgSW5saW5lRm9ybWF0dGluZ1N0
YXRlJiBmb3JtYXR0aW5nU3RhdGUpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5n
Q29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKK3sKK30KKworc3RhdGljIGlubGluZSBjb25z
dCBCb3gqIG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBj
b25zdCBDb250YWluZXJCb3gmIHN0YXlXaXRoaW4pCit7CisgICAgLy8gQXRvbWljIGlubGluZS1s
ZXZlbCBib3hlcyBhbmQgZmxvYXRzIGFyZSBvcGFxdWUgYm94ZXMgbWVhbmluZyB0aGF0IHRoZXkg
YXJlCisgICAgLy8gcmVzcG9uc2libGUgZm9yIHRoZWlyIG93biBjb250ZW50IChkbyBub3QgbmVl
ZCB0byBkZXNjZW5kIGludG8gdGhlaXIgc3VidHJlZXMpLgorICAgIC8vIE9ubHkgaW5saW5lIGJv
eGVzIG1heSBoYXZlIHJlbGV2YW50IGRlc2NlbmRhbnQgY29udGVudC4KKyAgICBpZiAobGF5b3V0
Qm94LmlzSW5saW5lQm94KCkpIHsKKyAgICAgICAgaWYgKGlzPENvbnRhaW5lckJveD4obGF5b3V0
Qm94KSAmJiBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93T3JGbG9h
dGluZ0NoaWxkKCkpIHsKKyAgICAgICAgICAgIC8vIEFub255bW91cyBpbmxpbmUgdGV4dCBib3hl
cy9saW5lIGJyZWFrcyBjYW4ndCBoYXZlIGRlc2NlbmRhbnQgY29udGVudCBieSBkZWZpbml0aW9u
LgorICAgICAgICAgICAgQVNTRVJUKCFsYXlvdXRCb3guaXNJbmxpbmVUZXh0Qm94KCkgJiYgIWxh
eW91dEJveC5pc0xpbmVCcmVha0JveCgpKTsKKyAgICAgICAgICAgIHJldHVybiBkb3duY2FzdDxD
b250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byogbmV4dEluUHJlT3JkZXIgPSAmbGF5b3V0
Qm94OyBuZXh0SW5QcmVPcmRlciAmJiBuZXh0SW5QcmVPcmRlciAhPSAmc3RheVdpdGhpbjsgbmV4
dEluUHJlT3JkZXIgPSAmbmV4dEluUHJlT3JkZXItPnBhcmVudCgpKSB7CisgICAgICAgIGlmIChh
dXRvKiBuZXh0U2libGluZyA9IG5leHRJblByZU9yZGVyLT5uZXh0SW5GbG93T3JGbG9hdGluZ1Np
YmxpbmcoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXh0U2libGluZzsKKyAgICB9CisgICAgcmV0
dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dElu
Rmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmIGludmFsaWRhdGlvblN0YXRlLCBjb25zdCBD
b25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAgIExPR19XSVRI
X1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbU3RhcnRdIC0+IGlu
bGluZSBmb3JtYXR0aW5nIGNvbnRleHQgLT4gZm9ybWF0dGluZyByb290KCIgPDwgJnJvb3QoKSA8
PCAiKSIpOworICAgIEFTU0VSVChyb290KCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpOwor
CisgICAgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShpbnZhbGlkYXRpb25TdGF0ZSk7CisgICAg
YXV0byogbGF5b3V0Qm94ID0gcm9vdCgpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7Cisg
ICAgLy8gMS4gVmlzaXQgZWFjaCBpbmxpbmUgYm94IGFuZCBwYXJ0aWFsbHkgY29tcHV0ZSB0aGVp
ciBnZW9tZXRyeSAobWFyZ2lucywgcGFkZGluZyBhbmQgYm9yZGVycykuCisgICAgLy8gMi4gQ29s
bGVjdCB0aGUgaW5saW5lIGl0ZW1zIChmbGF0dGVuIHRoZSB0aGUgbGF5b3V0IHRyZWUpIGFuZCBw
bGFjZSB0aGVtIG9uIGxpbmVzIGluIGJpZGlyZWN0aW9uYWwgb3JkZXIuIAorICAgIHdoaWxlIChs
YXlvdXRCb3gpIHsKKyAgICAgICAgQVNTRVJUKGxheW91dEJveC0+aXNJbmxpbmVMZXZlbEJveCgp
IHx8IGxheW91dEJveC0+aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7CisKKyAgICAgICAgaWYgKGxh
eW91dEJveC0+aXNBdG9taWNJbmxpbmVMZXZlbEJveCgpIHx8IGxheW91dEJveC0+aXNGbG9hdGlu
Z1Bvc2l0aW9uZWQoKSkgeworICAgICAgICAgICAgLy8gSW5saW5lLWJsb2NrcywgaW5saW5lLXRh
YmxlcyBhbmQgcmVwbGFjZWQgZWxlbWVudHMgKGltZywgdmlkZW8pIGNhbiBiZSBzaXplZCBidXQg
bm90IHlldCBwb3NpdGlvbmVkLgorICAgICAgICAgICAgaWYgKGlzPENvbnRhaW5lckJveD4obGF5
b3V0Qm94KSAmJiBsYXlvdXRCb3gtPmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSkgewor
ICAgICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3gtPmlzSW5saW5lQmxvY2tCb3goKSB8fCBs
YXlvdXRCb3gtPmlzSW5saW5lVGFibGVCb3goKSB8fCBsYXlvdXRCb3gtPmlzRmxvYXRpbmdQb3Np
dGlvbmVkKCkpOworICAgICAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdSb290ID0gZG93bmNh
c3Q8Q29udGFpbmVyQm94PigqbGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICBjb21wdXRlQm9y
ZGVyQW5kUGFkZGluZyhmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Cisg
ICAgICAgICAgICAgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKGZvcm1hdHRpbmdSb290LCBjb25z
dHJhaW50cy5ob3Jpem9udGFsKTsKKworICAgICAgICAgICAgICAgIGlmIChmb3JtYXR0aW5nUm9v
dC5oYXNDaGlsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gZm9ybWF0dGluZ0NvbnRl
eHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nUm9v
dCwgbGF5b3V0U3RhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXR0aW5nUm9v
dC5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZv
cm1hdHRpbmdDb250ZXh0LT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBn
ZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChmb3JtYXR0aW5nUm9vdCkpOwor
ICAgICAgICAgICAgICAgICAgICBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKGZvcm1hdHRpbmdSb290
LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGlu
Z0NvbnRleHQtPmxheW91dE91dE9mRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGdlb21l
dHJ5KCkuY29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50KGZvcm1hdHRpbmdSb290KSk7Cisg
ICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVIZWlnaHRB
bmRNYXJnaW4oZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBSZXBsYWNlZCBhbmQgb3RoZXIgdHlw
ZSBvZiBsZWFmIGF0b21pYyBpbmxpbmUgYm94ZXMuCisgICAgICAgICAgICAgICAgY29tcHV0ZUJv
cmRlckFuZFBhZGRpbmcoKmxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAg
ICAgICAgICAgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRz
Lmhvcml6b250YWwpOworICAgICAgICAgICAgICAgIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oKmxh
eW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0gZWxzZSBpZiAobGF5b3V0Qm94LT5pc0xpbmVCcmVha0JveCgpKSB7CisgICAgICAgICAgICBh
dXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KCpsYXlvdXRC
b3gpOworICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IH0pOwor
ICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Qm9yZGVyKHsgfSk7CisgICAgICAgICAgICBib3hH
ZW9tZXRyeS5zZXRQYWRkaW5nKHsgfSk7CisgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250
ZW50Qm94V2lkdGgoeyB9KTsKKyAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFy
Z2luKHsgfSk7CisgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LT5pc0lubGluZUJveCgpKSB7
CisgICAgICAgICAgICAvLyBUZXh0IHdyYXBwZXIgYm94ZXMgKGFub255bW91cyBpbmxpbmUgbGV2
ZWwgYm94ZXMpIGRvbid0IGhhdmUgYm94IGdlb21ldHJpZXMgKHRoZXkgb25seSBnZW5lcmF0ZSBy
dW5zKS4KKyAgICAgICAgICAgIGlmICghbGF5b3V0Qm94LT5pc0lubGluZVRleHRCb3goKSkgewor
ICAgICAgICAgICAgICAgIC8vIElubGluZSBib3hlcyAoPHNwYW4+KSBjYW4ndCBnZXQgc2l6ZWQv
cG9zaXRpb25lZCB5ZXQuIEF0IHRoaXMgcG9pbnQgd2UgY2FuIG9ubHkgY29tcHV0ZSB0aGVpciBt
YXJnaW5zLCBib3JkZXJzIGFuZCBwYWRkaW5nLgorICAgICAgICAgICAgICAgIGNvbXB1dGVCb3Jk
ZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAg
ICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsTWFyZ2luKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRz
Lmhvcml6b250YWwpOworICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21l
dHJ5KCpsYXlvdXRCb3gpLnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0gZWxzZQorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisKKyAgICAg
ICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlvdXQoKmxheW91dEJveCwgcm9v
dCgpKTsKKyAgICB9CisKKyAgICBjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCk7CisKKyAg
ICBhdXRvJiBpbmxpbmVJdGVtcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmlubGluZUl0ZW1zKCk7Cisg
ICAgbGluZUxheW91dChpbmxpbmVJdGVtcywgeyAwLCBpbmxpbmVJdGVtcy5zaXplKCkgfSwgY29u
c3RyYWludHMpOworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwg
c3RyZWFtIDw8ICJbRW5kXSAtPiBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0IC0+IGZvcm1hdHRp
bmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKK30KKwordm9pZCBJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dDo6bGluZUxheW91dEZvckludGVyZ3JhdGlvbihJbnZhbGlkYXRpb25TdGF0ZSYgaW52
YWxpZGF0aW9uU3RhdGUsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3Ry
YWludHMpCit7CisgICAgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShpbnZhbGlkYXRpb25TdGF0
ZSk7CisgICAgY29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgpOworICAgIGF1dG8mIGlubGlu
ZUl0ZW1zID0gZm9ybWF0dGluZ1N0YXRlKCkuaW5saW5lSXRlbXMoKTsKKyAgICBsaW5lTGF5b3V0
KGlubGluZUl0ZW1zLCB7IDAsIGlubGluZUl0ZW1zLnNpemUoKSB9LCBjb25zdHJhaW50cyk7Cit9
CisKK0xheW91dFVuaXQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OnVzZWRDb250ZW50SGVpZ2h0
KCkgY29uc3QKK3sKKyAgICAvLyAxMC42LjcgJ0F1dG8nIGhlaWdodHMgZm9yIGJsb2NrIGZvcm1h
dHRpbmcgY29udGV4dCByb290cworCisgICAgLy8gSWYgaXQgb25seSBoYXMgaW5saW5lLWxldmVs
IGNoaWxkcmVuLCB0aGUgaGVpZ2h0IGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0b3Agb2Yg
dGhlIHRvcG1vc3QgbGluZSBib3ggYW5kIHRoZSBib3R0b20gb2YgdGhlIGJvdHRvbW1vc3QgbGlu
ZSBib3guCisKKyAgICAvLyBJbiBhZGRpdGlvbiwgaWYgdGhlIGVsZW1lbnQgaGFzIGFueSBmbG9h
dGluZyBkZXNjZW5kYW50cyB3aG9zZSBib3R0b20gbWFyZ2luIGVkZ2UgaXMgYmVsb3cgdGhlIGVs
ZW1lbnQncyBib3R0b20gY29udGVudCBlZGdlLAorICAgIC8vIHRoZW4gdGhlIGhlaWdodCBpcyBp
bmNyZWFzZWQgdG8gaW5jbHVkZSB0aG9zZSBlZGdlcy4gT25seSBmbG9hdHMgdGhhdCBwYXJ0aWNp
cGF0ZSBpbiB0aGlzIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBhcmUgdGFrZW4KKyAgICAvLyBp
bnRvIGFjY291bnQsIGUuZy4sIGZsb2F0cyBpbnNpZGUgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGRl
c2NlbmRhbnRzIG9yIG90aGVyIGZsb2F0cyBhcmUgbm90LgorICAgIGF1dG8mIGxpbmVzID0gZm9y
bWF0dGluZ1N0YXRlKCkubGluZXMoKTsKKyAgICAvLyBFdmVuIGVtcHR5IGNvbnRlbnQgZ2VuZXJh
dGVzIGEgbGluZS4KKyAgICBBU1NFUlQoIWxpbmVzLmlzRW1wdHkoKSk7CisgICAgYXV0byB0b3Ag
PSBMYXlvdXRVbml0IHsgbGluZXMuZmlyc3QoKS5saW5lQm94TG9naWNhbFJlY3QoKS50b3AoKSB9
OworICAgIGF1dG8gYm90dG9tID0gTGF5b3V0VW5pdCB7IGxpbmVzLmxhc3QoKS5saW5lQm94TG9n
aWNhbFJlY3QoKS5ib3R0b20oKSArIGZvcm1hdHRpbmdTdGF0ZSgpLmNsZWFyR2FwQWZ0ZXJMYXN0
TGluZSgpIH07CisKKyAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7
ICp0aGlzLCBmb3JtYXR0aW5nU3RhdGUoKS5mbG9hdGluZ1N0YXRlKCkgfTsKKyAgICBpZiAoYXV0
byBmbG9hdEJvdHRvbSA9IGZsb2F0aW5nQ29udGV4dC5ib3R0b20oKSkgeworICAgICAgICBib3R0
b20gPSBzdGQ6Om1heCgqZmxvYXRCb3R0b20sIGJvdHRvbSk7CisgICAgICAgIHRvcCA9IHN0ZDo6
bWluKCpmbG9hdGluZ0NvbnRleHQudG9wKCksIHRvcCk7CisgICAgfQorICAgIHJldHVybiBib3R0
b20gLSB0b3A7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmxpbmVMYXlvdXQo
SW5saW5lSXRlbXMmIGlubGluZUl0ZW1zLCBMaW5lQnVpbGRlcjo6SW5saW5lSXRlbVJhbmdlIG5l
ZWRzTGF5b3V0UmFuZ2UsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3Ry
YWludHMpCit7CisgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0
YXRlKCk7CisgICAgZm9ybWF0dGluZ1N0YXRlLmxpbmVSdW5zKCkucmVzZXJ2ZUluaXRpYWxDYXBh
Y2l0eShmb3JtYXR0aW5nU3RhdGUuaW5saW5lSXRlbXMoKS5zaXplKCkpOworICAgIElubGluZUxh
eW91dFVuaXQgbGluZUxvZ2ljYWxUb3AgPSBjb25zdHJhaW50cy52ZXJ0aWNhbC5sb2dpY2FsVG9w
OworICAgIHN0cnVjdCBQcmV2aW91c0xpbmUgeworICAgICAgICBMaW5lQnVpbGRlcjo6SW5saW5l
SXRlbVJhbmdlIHJhbmdlOworICAgICAgICBzaXplX3Qgb3ZlcmZsb3dDb250ZW50TGVuZ3RoIHsg
MCB9OworICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxvd0xvZ2ljYWxX
aWR0aDsKKyAgICB9OworICAgIE9wdGlvbmFsPFByZXZpb3VzTGluZT4gcHJldmlvdXNMaW5lOwor
ICAgIGF1dG8mIGZsb2F0aW5nU3RhdGUgPSBmb3JtYXR0aW5nU3RhdGUuZmxvYXRpbmdTdGF0ZSgp
OworICAgIGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250ZXh0IHsgKnRoaXMsIGZs
b2F0aW5nU3RhdGUgfTsKKyAgICBhdXRvIGlzRmlyc3RMaW5lID0gZm9ybWF0dGluZ1N0YXRlLmxp
bmVzKCkuaXNFbXB0eSgpOworCisgICAgYXV0byBsaW5lQnVpbGRlciA9IExpbmVCdWlsZGVyIHsg
KnRoaXMsIGZsb2F0aW5nU3RhdGUsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIGlubGluZUl0ZW1z
IH07CisgICAgd2hpbGUgKCFuZWVkc0xheW91dFJhbmdlLmlzRW1wdHkoKSkgeworICAgICAgICAv
LyBUdXJuIHByZXZpb3VzIGxpbmUncyBvdmVyZmxvdyBjb250ZW50IGxlbmd0aCBpbnRvIHRoZSBu
ZXh0IGxpbmUncyBsZWFkaW5nIGNvbnRlbnQgcGFydGlhbCBsZW5ndGguCisgICAgICAgIC8vICJz
cFs8LWxpbmUgYnJlYWstPl1saXRfY29udGVudCIgLT4gb3ZlcmZsb3cgbGVuZ3RoOiAxMSAtPiBs
ZWFkaW5nIHBhcnRpYWwgY29udGVudCBsZW5ndGg6IDExLgorICAgICAgICBhdXRvIHBhcnRpYWxM
ZWFkaW5nQ29udGVudExlbmd0aCA9IHByZXZpb3VzTGluZSA/IHByZXZpb3VzTGluZS0+b3ZlcmZs
b3dDb250ZW50TGVuZ3RoIDogMDsKKyAgICAgICAgYXV0byBsZWFkaW5nTG9naWNhbFdpZHRoID0g
cHJldmlvdXNMaW5lID8gcHJldmlvdXNMaW5lLT5vdmVyZmxvd0xvZ2ljYWxXaWR0aCA6IFdURjo6
bnVsbG9wdDsKKyAgICAgICAgYXV0byBpbml0aWFsTGluZUNvbnN0cmFpbnRzID0gSW5saW5lUmVj
dCB7IGxpbmVMb2dpY2FsVG9wLCBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxMZWZ0LCBj
b25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxXaWR0aCwgcXVpcmtzKCkuaW5pdGlhbExpbmVI
ZWlnaHQoKSB9OworICAgICAgICBhdXRvIGxpbmVDb250ZW50ID0gbGluZUJ1aWxkZXIubGF5b3V0
SW5saW5lQ29udGVudChuZWVkc0xheW91dFJhbmdlLCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5n
dGgsIGxlYWRpbmdMb2dpY2FsV2lkdGgsIGluaXRpYWxMaW5lQ29uc3RyYWludHMsIGlzRmlyc3RM
aW5lKTsKKyAgICAgICAgYXV0byBsaW5lTG9naWNhbFJlY3QgPSBjb21wdXRlR2VvbWV0cnlGb3JM
aW5lQ29udGVudChsaW5lQ29udGVudCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisKKyAgICAg
ICAgYXV0byBsaW5lQ29udGVudFJhbmdlID0gbGluZUNvbnRlbnQuaW5saW5lSXRlbVJhbmdlOwor
ICAgICAgICBpZiAoIWxpbmVDb250ZW50UmFuZ2UuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBB
U1NFUlQobmVlZHNMYXlvdXRSYW5nZS5zdGFydCA8IGxpbmVDb250ZW50UmFuZ2UuZW5kKTsKKyAg
ICAgICAgICAgIGlzRmlyc3RMaW5lID0gZmFsc2U7CisgICAgICAgICAgICBsaW5lTG9naWNhbFRv
cCA9IGdlb21ldHJ5KCkubG9naWNhbFRvcEZvck5leHRMaW5lKGxpbmVDb250ZW50LCBsaW5lTG9n
aWNhbFJlY3QuYm90dG9tKCksIGZsb2F0aW5nQ29udGV4dCk7CisgICAgICAgICAgICBpZiAobGlu
ZUNvbnRlbnQuaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KSB7CisgICAgICAgICAgICAgICAg
Ly8gVGhlIGZpbmFsIGNvbnRlbnQgaGVpZ2h0IG9mIHRoaXMgaW5saW5lIGZvcm1hdHRpbmcgY29u
dGV4dCBzaG91bGQgaW5jbHVkZSB0aGUgY2xlYXJlZCBmbG9hdHMgYXMgd2VsbC4KKyAgICAgICAg
ICAgICAgICBmb3JtYXR0aW5nU3RhdGUuc2V0Q2xlYXJHYXBBZnRlckxhc3RMaW5lKGxpbmVMb2dp
Y2FsVG9wIC0gbGluZUxvZ2ljYWxSZWN0LmJvdHRvbSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIC8vIFdoZW4gdGhlIHRyYWlsaW5nIGNvbnRlbnQgaXMgcGFydGlhbCwgd2UgbmVlZCB0
byByZXVzZSB0aGUgbGFzdCBJbmxpbmVUZXh0SXRlbS4KKyAgICAgICAgICAgIGF1dG8gbGFzdElu
bGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPSBsaW5lQ29udGVudC5wYXJ0aWFsVHJhaWxpbmdD
b250ZW50TGVuZ3RoOworICAgICAgICAgICAgaWYgKGxhc3RJbmxpbmVJdGVtTmVlZHNQYXJ0aWFs
TGF5b3V0KSB7CisgICAgICAgICAgICAgICAgYXV0byBsaW5lTGF5b3V0SGFzQWR2YW5jZWQgPSAh
cHJldmlvdXNMaW5lCisgICAgICAgICAgICAgICAgICAgIHx8IGxpbmVDb250ZW50UmFuZ2UuZW5k
ID4gcHJldmlvdXNMaW5lLT5yYW5nZS5lbmQKKyAgICAgICAgICAgICAgICAgICAgfHwgKHByZXZp
b3VzTGluZS0+b3ZlcmZsb3dDb250ZW50TGVuZ3RoICYmIHByZXZpb3VzTGluZS0+b3ZlcmZsb3dD
b250ZW50TGVuZ3RoID4gbGluZUNvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCk7
CisgICAgICAgICAgICAgICAgaWYgKCFsaW5lTGF5b3V0SGFzQWR2YW5jZWQpIHsKKyAgICAgICAg
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgICAgIC8v
IE1vdmUgb3ZlciB0byB0aGUgbmV4dCBydW4gaWYgd2UgYXJlIHN0dWNrIG9uIHRoaXMgcGFydGlh
bCBjb250ZW50ICh3aGVuIHRoZSBvdmVyZmxvdyBjb250ZW50IGxlbmd0aCByZW1haW5zIHRoZSBz
YW1lKS4KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2VydGFpbmx5IGxvc2Ugc29tZSBjb250
ZW50LCBidXQgd2Ugd291bGQgYmUgYnVzeSBsb29waW5nIG90aGVyd2lzZS4KKyAgICAgICAgICAg
ICAgICAgICAgbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPSBmYWxzZTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZWVkc0xheW91dFJhbmdl
LnN0YXJ0ID0gbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPyBsaW5lQ29udGVudFJh
bmdlLmVuZCAtIDEgOiBsaW5lQ29udGVudFJhbmdlLmVuZDsKKyAgICAgICAgICAgIHByZXZpb3Vz
TGluZSA9IFByZXZpb3VzTGluZSB7IGxpbmVDb250ZW50UmFuZ2UsIGxpbmVDb250ZW50LnBhcnRp
YWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgsIGxpbmVDb250ZW50Lm92ZXJmbG93TG9naWNhbFdpZHRo
IH07CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBGbG9hdHMg
cHJldmVudGVkIHVzIHBsYWNpbmcgYW55IGNvbnRlbnQgb24gdGhlIGxpbmUuCisgICAgICAgIEFT
U0VSVChsaW5lQ29udGVudC5ydW5zLmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVChsaW5lQ29u
dGVudC5oYXNJbnRydXNpdmVGbG9hdCk7CisgICAgICAgIC8vIE1vdmUgdGhlIG5leHQgbGluZSBi
ZWxvdyB0aGUgaW50cnVzaXZlIGZsb2F0LgorICAgICAgICBhdXRvIGZsb2F0Q29uc3RyYWludHMg
PSBmbG9hdGluZ0NvbnRleHQuY29uc3RyYWludHModG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsVG9w
KSwgdG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmVjdC5ib3R0b20oKSkpOworICAgICAgICBBU1NF
UlQoZmxvYXRDb25zdHJhaW50cy5sZWZ0IHx8IGZsb2F0Q29uc3RyYWludHMucmlnaHQpOworICAg
ICAgICBzdGF0aWMgYXV0byBpbmlmaXRlUG9pbnQgPSBQb2ludEluQ29udGV4dFJvb3Q6Om1heCgp
OworICAgICAgICAvLyBJbiBjYXNlIG9mIGxlZnQgYW5kIHJpZ2h0IGNvbnN0cmFpbnRzLCB3ZSBu
ZWVkIHRvIHBpY2sgdGhlIG9uZSB0aGF0J3MgY2xvc2VyIHRvIHRoZSBjdXJyZW50IGxpbmUuCisg
ICAgICAgIGxpbmVMb2dpY2FsVG9wID0gc3RkOjptaW4oZmxvYXRDb25zdHJhaW50cy5sZWZ0LnZh
bHVlT3IoaW5pZml0ZVBvaW50KS55LCBmbG9hdENvbnN0cmFpbnRzLnJpZ2h0LnZhbHVlT3IoaW5p
Zml0ZVBvaW50KS55KTsKKyAgICAgICAgQVNTRVJUKGxpbmVMb2dpY2FsVG9wIDwgaW5pZml0ZVBv
aW50LnkpOworICAgIH0KK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhD
b25zdHJhaW50cygpCit7CisgICAgYXV0byYgbGF5b3V0U3RhdGUgPSB0aGlzLT5sYXlvdXRTdGF0
ZSgpOworICAgIEFTU0VSVCghZm9ybWF0dGluZ1N0YXRlKCkuaW50cmluc2ljV2lkdGhDb25zdHJh
aW50cygpKTsKKworICAgIGlmICghcm9vdCgpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKSB7
CisgICAgICAgIGF1dG8gY29uc3RyYWludHMgPSBnZW9tZXRyeSgpLmNvbnN0cmFpbkJ5TWluTWF4
V2lkdGgocm9vdCgpLCB7IH0pOworICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0cmFp
bnRzOworICAgIH0KKworICAgIFZlY3Rvcjxjb25zdCBCb3gqPiBmb3JtYXR0aW5nQ29udGV4dFJv
b3RMaXN0OworICAgIGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRzID0gSG9yaXpvbnRhbENvbnN0
cmFpbnRzIHsgMF9sdSwgMF9sdSB9OworICAgIGF1dG8qIGxheW91dEJveCA9IHJvb3QoKS5maXJz
dEluRmxvd09yRmxvYXRpbmdDaGlsZCgpOworICAgIC8vIEluIG9yZGVyIHRvIGNvbXB1dGUgdGhl
IG1heC9taW4gd2lkdGhzLCB3ZSBuZWVkIHRvIGNvbXB1dGUgbWFyZ2lucywgYm9yZGVycyBhbmQg
cGFkZGluZyBmb3IgY2VydGFpbiBpbmxpbmUgYm94ZXMgZmlyc3QuCisgICAgd2hpbGUgKGxheW91
dEJveCkgeworICAgICAgICBpZiAobGF5b3V0Qm94LT5pc0lubGluZVRleHRCb3goKSkgeworICAg
ICAgICAgICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlvdXQoKmxheW91dEJv
eCwgcm9vdCgpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlm
IChsYXlvdXRCb3gtPmlzUmVwbGFjZWRCb3goKSkgeworICAgICAgICAgICAgY29tcHV0ZUJvcmRl
ckFuZFBhZGRpbmcoKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICAgICAg
ICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbigqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMpOworICAgICAgICB9IGVsc2UgaWYgKGxheW91dEJveC0+aXNGbG9hdGluZ1Bvc2l0aW9uZWQo
KSB8fCBsYXlvdXRCb3gtPmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSkgeworICAgICAgICAgICAg
QVNTRVJUKGxheW91dEJveC0+ZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKKyAgICAg
ICAgICAgIGZvcm1hdHRpbmdDb250ZXh0Um9vdExpc3QuYXBwZW5kKGxheW91dEJveCk7CisKKyAg
ICAgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGhvcml6b250YWxD
b25zdHJhaW50cyk7CisgICAgICAgICAgICBjb21wdXRlSG9yaXpvbnRhbE1hcmdpbigqbGF5b3V0
Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAgICAgICAgY29tcHV0ZUludHJpbnNp
Y1dpZHRoRm9yRm9ybWF0dGluZ1Jvb3QoKmxheW91dEJveCk7CisgICAgICAgIH0gZWxzZSBpZiAo
bGF5b3V0Qm94LT5pc0lubGluZUJveCgpKSB7CisgICAgICAgICAgICBjb21wdXRlQm9yZGVyQW5k
UGFkZGluZygqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAgICAgICAg
Y29tcHV0ZUhvcml6b250YWxNYXJnaW4oKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICAgICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlvdXQoKmxheW91dEJveCwg
cm9vdCgpKTsKKyAgICB9CisKKyAgICBjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCk7CisK
KyAgICBhdXRvIG1heGltdW1MaW5lV2lkdGggPSBbJl0oYXV0byBhdmFpbGFibGVXaWR0aCkgewor
ICAgICAgICAvLyBTd2l0Y2ggdG8gdGhlIG1pbi9tYXggZm9ybWF0dGluZyByb290IHdpZHRoIHZh
bHVlcyBiZWZvcmUgZm9ybWF0dGluZyB0aGUgbGluZXMuCisgICAgICAgIGZvciAoYXV0byogZm9y
bWF0dGluZ1Jvb3QgOiBmb3JtYXR0aW5nQ29udGV4dFJvb3RMaXN0KSB7CisgICAgICAgICAgICBh
dXRvIGludHJpbnNpY1dpZHRocyA9IGxheW91dFN0YXRlLmZvcm1hdHRpbmdTdGF0ZUZvckJveCgq
Zm9ybWF0dGluZ1Jvb3QpLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goKmZvcm1hdHRp
bmdSb290KTsKKyAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRl
KCkuYm94R2VvbWV0cnkoKmZvcm1hdHRpbmdSb290KTsKKyAgICAgICAgICAgIGF1dG8gY29udGVu
dFdpZHRoID0gKGF2YWlsYWJsZVdpZHRoID8gaW50cmluc2ljV2lkdGhzLT5tYXhpbXVtIDogaW50
cmluc2ljV2lkdGhzLT5taW5pbXVtKSAtIGJveEdlb21ldHJ5Lmhvcml6b250YWxNYXJnaW5Cb3Jk
ZXJBbmRQYWRkaW5nKCk7CisgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lk
dGgoY29udGVudFdpZHRoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tcHV0ZWRJbnRy
aW5zaWNXaWR0aEZvckNvbnN0cmFpbnQoYXZhaWxhYmxlV2lkdGgpOworICAgIH07CisKKyAgICBh
dXRvIG1pbmltdW1Db250ZW50V2lkdGggPSBjZWlsZWRMYXlvdXRVbml0KG1heGltdW1MaW5lV2lk
dGgoMCkpOworICAgIGF1dG8gbWF4aW11bUNvbnRlbnRXaWR0aCA9IGNlaWxlZExheW91dFVuaXQo
bWF4aW11bUxpbmVXaWR0aChtYXhJbmxpbmVMYXlvdXRVbml0KCkpKTsKKyAgICBhdXRvIGNvbnN0
cmFpbnRzID0gZ2VvbWV0cnkoKS5jb25zdHJhaW5CeU1pbk1heFdpZHRoKHJvb3QoKSwgeyBtaW5p
bXVtQ29udGVudFdpZHRoLCBtYXhpbXVtQ29udGVudFdpZHRoIH0pOworICAgIGZvcm1hdHRpbmdT
dGF0ZSgpLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3RyYWludHMpOworICAgIHJl
dHVybiBjb25zdHJhaW50czsKK30KKworSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aEZvckNvbnN0cmFpbnQoSW5saW5lTGF5b3V0
VW5pdCBhdmFpbGFibGVXaWR0aCkgY29uc3QKK3sKKyAgICBhdXRvJiBpbmxpbmVJdGVtcyA9IGZv
cm1hdHRpbmdTdGF0ZSgpLmlubGluZUl0ZW1zKCk7CisgICAgYXV0byBsaW5lQnVpbGRlciA9IExp
bmVCdWlsZGVyIHsgKnRoaXMsIGlubGluZUl0ZW1zIH07CisgICAgYXV0byBsYXlvdXRSYW5nZSA9
IExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UgeyAwICwgaW5saW5lSXRlbXMuc2l6ZSgpIH07
CisgICAgYXV0byBtYXhpbXVtTGluZVdpZHRoID0gSW5saW5lTGF5b3V0VW5pdCB7IH07CisgICAg
YXV0byBtYXhpbXVtRmxvYXRXaWR0aCA9IExheW91dFVuaXQgeyB9OworICAgIHdoaWxlICghbGF5
b3V0UmFuZ2UuaXNFbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaW50cmluc2ljQ29udGVudCA9IGxp
bmVCdWlsZGVyLmNvbXB1dGVkSW50cmluc2ljV2lkdGgobGF5b3V0UmFuZ2UsIGF2YWlsYWJsZVdp
ZHRoKTsKKyAgICAgICAgbGF5b3V0UmFuZ2Uuc3RhcnQgPSBpbnRyaW5zaWNDb250ZW50LmlubGlu
ZUl0ZW1SYW5nZS5lbmQ7CisgICAgICAgIG1heGltdW1MaW5lV2lkdGggPSBzdGQ6Om1heChtYXhp
bXVtTGluZVdpZHRoLCBpbnRyaW5zaWNDb250ZW50LmxvZ2ljYWxXaWR0aCk7CisgICAgICAgIC8v
IEZJWE1FOiBBZGQgc3VwcG9ydCBmb3IgY2xlYXIuCisgICAgICAgIGZvciAoYXV0byogZmxvYXRC
b3ggOiBpbnRyaW5zaWNDb250ZW50LmZsb2F0cykKKyAgICAgICAgICAgIG1heGltdW1GbG9hdFdp
ZHRoICs9IGdlb21ldHJ5Rm9yQm94KCpmbG9hdEJveCkubWFyZ2luQm94V2lkdGgoKTsKKyAgICB9
CisgICAgcmV0dXJuIG1heGltdW1MaW5lV2lkdGggKyBtYXhpbXVtRmxvYXRXaWR0aDsKK30KKwor
dm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUludHJpbnNpY1dpZHRoRm9yRm9y
bWF0dGluZ1Jvb3QoY29uc3QgQm94JiBmb3JtYXR0aW5nUm9vdCkKK3sKKyAgICBBU1NFUlQoZm9y
bWF0dGluZ1Jvb3QuZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKKyAgICBhdXRvIGNv
bnN0cmFpbnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07CisgICAgaWYgKGF1dG8g
Zml4ZWRXaWR0aCA9IGdlb21ldHJ5KCkuZml4ZWRWYWx1ZShmb3JtYXR0aW5nUm9vdC5zdHlsZSgp
LmxvZ2ljYWxXaWR0aCgpKSkKKyAgICAgICAgY29uc3RyYWludHMgPSB7ICpmaXhlZFdpZHRoLCAq
Zml4ZWRXaWR0aCB9OworICAgIGVsc2UgeworICAgICAgICBhdXRvIGhhc0luZmxvd09yRmxvYXRp
bmdDb250ZW50ID0gaXM8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nUm9vdCkgJiYgZG93bmNhc3Q8
Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nUm9vdCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7
CisgICAgICAgIC8vIFRoZSBpbnRyaW5zaWMgc2l6ZXMgb2YgdGhlIHNpemUgY29udGFpbm1lbnQg
Ym94IGFyZSBkZXRlcm1pbmVkIGFzIGlmIHRoZSBlbGVtZW50IGhhZCBubyBjb250ZW50LgorICAg
ICAgICBhdXRvIHNob3VsZElnbm9yZUNoaWxkQ29udGVudCA9IGZvcm1hdHRpbmdSb290LmlzU2l6
ZUNvbnRhaW5tZW50Qm94KCk7CisgICAgICAgIGlmIChoYXNJbmZsb3dPckZsb2F0aW5nQ29udGVu
dCAmJiAhc2hvdWxkSWdub3JlQ2hpbGRDb250ZW50KQorICAgICAgICAgICAgY29uc3RyYWludHMg
PSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChkb3duY2FzdDxDb250YWlu
ZXJCb3g+KGZvcm1hdHRpbmdSb290KSwgbGF5b3V0U3RhdGUoKSktPmNvbXB1dGVkSW50cmluc2lj
V2lkdGhDb25zdHJhaW50cygpOworICAgIH0KKyAgICBjb25zdHJhaW50cyA9IGdlb21ldHJ5KCku
Y29uc3RyYWluQnlNaW5NYXhXaWR0aChmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWludHMpOworICAg
IGNvbnN0cmFpbnRzLmV4cGFuZChnZW9tZXRyeUZvckJveChmb3JtYXR0aW5nUm9vdCkuaG9yaXpv
bnRhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKSk7CisgICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0
SW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWlu
dHMpOworfQorCit2b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlSG9yaXpvbnRh
bE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiBob3Jpem9udGFsQ29uc3RyYWludHMpCit7CisgICAgYXV0byBjb21wdXRlZEhvcml6b250YWxN
YXJnaW4gPSBnZW9tZXRyeSgpLmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihsYXlvdXRCb3gsIGhv
cml6b250YWxDb25zdHJhaW50cyk7CisgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnko
bGF5b3V0Qm94KS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigw
KSB9KTsKK30KKwordm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZVdpZHRoQW5k
TWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMm
IGhvcml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBhdXRvIGNvbXB1dGUgPSBbJl0oT3B0aW9u
YWw8TGF5b3V0VW5pdD4gdXNlZFdpZHRoKSB7CisgICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9h
dGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmZsb2F0aW5n
Q29udGVudFdpZHRoQW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7
IHVzZWRXaWR0aCwgeyB9IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxvY2tC
b3goKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZUJsb2NrQ29udGVudFdp
ZHRoQW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IHVzZWRXaWR0
aCwgeyB9IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKKyAgICAg
ICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFy
Z2luKGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWlu
dHMsIHsgfSwgeyB1c2VkV2lkdGgsIHsgfSB9KTsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgICAgIHJldHVybiBDb250ZW50V2lkdGhBbmRNYXJnaW4geyB9OworICAgIH07CisK
KyAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUoeyB9KTsKKworICAgIGF1
dG8gYXZhaWxhYmxlV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoOwor
ICAgIGlmIChhdXRvIG1heFdpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1heFdpZHRoKGxheW91
dEJveCwgYXZhaWxhYmxlV2lkdGgpKSB7CisgICAgICAgIGF1dG8gbWF4V2lkdGhBbmRNYXJnaW4g
PSBjb21wdXRlKG1heFdpZHRoKTsKKyAgICAgICAgaWYgKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5j
b250ZW50V2lkdGggPiBtYXhXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCisgICAgICAgICAg
ICBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBtYXhXaWR0aEFuZE1hcmdpbjsKKyAgICB9CisKKyAg
ICBhdXRvIG1pbldpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbldpZHRoKGxheW91dEJveCwg
YXZhaWxhYmxlV2lkdGgpLnZhbHVlT3IoMCk7CisgICAgYXV0byBtaW5XaWR0aEFuZE1hcmdpbiA9
IGNvbXB1dGUobWluV2lkdGgpOworICAgIGlmIChjb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVu
dFdpZHRoIDwgbWluV2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQorICAgICAgICBjb250ZW50
V2lkdGhBbmRNYXJnaW4gPSBtaW5XaWR0aEFuZE1hcmdpbjsKKworICAgIGF1dG8mIGJveEdlb21l
dHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsKKyAgICBib3hH
ZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRX
aWR0aCk7CisgICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IGNvbnRlbnRXaWR0
aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0LCBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1h
cmdpbi5lbmQgfSk7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVI
ZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQoreworICAgIGF1dG8gY29tcHV0ZSA9IFsm
XShPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkSGVpZ2h0KSB7CisgICAgICAgIGlmIChsYXlvdXRC
b3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgp
LmZsb2F0aW5nQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cywgeyB1c2VkSGVpZ2h0IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94LmlzSW5saW5l
QmxvY2tCb3goKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZUJsb2NrQ29u
dGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgeyB1
c2VkSGVpZ2h0IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKKyAg
ICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZVJlcGxhY2VkQ29udGVudEhlaWdodEFu
ZE1hcmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0
cmFpbnRzLCB7IH0sIHsgdXNlZEhlaWdodCB9KTsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgICAgIHJldHVybiBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIHsgfTsKKyAgICB9Owor
CisgICAgYXV0byBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZSh7IH0pOworICAgIGlm
IChhdXRvIG1heEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQobGF5b3V0Qm94
KSkgeworICAgICAgICBhdXRvIG1heEhlaWdodEFuZE1hcmdpbiA9IGNvbXB1dGUobWF4SGVpZ2h0
KTsKKyAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCA+IG1h
eEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KQorICAgICAgICAgICAgY29udGVudEhlaWdo
dEFuZE1hcmdpbiA9IG1heEhlaWdodEFuZE1hcmdpbjsKKyAgICB9CisKKyAgICBpZiAoYXV0byBt
aW5IZWlnaHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluSGVpZ2h0KGxheW91dEJveCkpIHsKKyAg
ICAgICAgYXV0byBtaW5IZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRlKG1pbkhlaWdodCk7CisgICAg
ICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPCBtaW5IZWlnaHRB
bmRNYXJnaW4uY29udGVudEhlaWdodCkKKyAgICAgICAgICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJn
aW4gPSBtaW5IZWlnaHRBbmRNYXJnaW47CisgICAgfQorICAgIGF1dG8mIGJveEdlb21ldHJ5ID0g
Zm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsKKyAgICBib3hHZW9tZXRy
eS5zZXRDb250ZW50Qm94SGVpZ2h0KGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdo
dCk7CisgICAgYm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyBjb250ZW50SGVpZ2h0QW5k
TWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbi5iZWZvcmUsIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4u
bm9uQ29sbGFwc2VkTWFyZ2luLmFmdGVyIH0pOworfQorCit2b2lkIElubGluZUZvcm1hdHRpbmdD
b250ZXh0Ojpjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCkKK3sKKyAgICBhdXRvJiBmb3Jt
YXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5nU3RhdGUoKTsKKyAgICBpZiAoIWZvcm1hdHRp
bmdTdGF0ZS5pbmxpbmVJdGVtcygpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIC8v
IFRyYXZlcnNlIHRoZSB0cmVlIGFuZCBjcmVhdGUgaW5saW5lIGl0ZW1zIG91dCBvZiBpbmxpbmUg
Ym94ZXMgYW5kIGxlYWYgbm9kZXMuIFRoaXMgZXNzZW50aWFsbHkgdHVybnMgdGhlIHRyZWUgaW5s
aW5lIHN0cnVjdHVyZSBpbnRvIGEgZmxhdCBvbmUuCisgICAgLy8gPHNwYW4+dGV4dDxzcGFuPjwv
c3Bhbj48aW1nPjwvc3Bhbj4gLT4gW0lubGluZUJveFN0YXJ0XVtJbmxpbmVMZXZlbEJveF1bSW5s
aW5lQm94U3RhcnRdW0lubGluZUJveEVuZF1bSW5saW5lTGV2ZWxCb3hdW0lubGluZUJveEVuZF0K
KyAgICBBU1NFUlQocm9vdCgpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKTsKKyAgICBMYXlv
dXRRdWV1ZSBsYXlvdXRRdWV1ZTsKKyAgICBsYXlvdXRRdWV1ZS5hcHBlbmQocm9vdCgpLmZpcnN0
SW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpOworICAgIHdoaWxlICghbGF5b3V0UXVldWUuaXNFbXB0
eSgpKSB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBhdXRvJiBsYXlvdXRC
b3ggPSAqbGF5b3V0UXVldWUubGFzdCgpOworICAgICAgICAgICAgYXV0byBpc0JveFdpdGhJbmxp
bmVDb250ZW50ID0gbGF5b3V0Qm94LmlzSW5saW5lQm94KCkgJiYgIWxheW91dEJveC5pc0lubGlu
ZVRleHRCb3goKSAmJiAhbGF5b3V0Qm94LmlzTGluZUJyZWFrQm94KCk7CisgICAgICAgICAgICBp
ZiAoIWlzQm94V2l0aElubGluZUNvbnRlbnQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAvLyBUaGlzIGlzIHRoZSBzdGFydCBvZiBhbiBpbmxpbmUgYm94IChlLmcuIDxzcGFu
PikuCisgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkSW5saW5lSXRlbSh7IGxheW91dEJv
eCwgSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94U3RhcnQgfSk7CisgICAgICAgICAgICBhdXRv
JiBpbmxpbmVCb3hXaXRoSW5saW5lQ29udGVudCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5
b3V0Qm94KTsKKyAgICAgICAgICAgIGlmICghaW5saW5lQm94V2l0aElubGluZUNvbnRlbnQuaGFz
SW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBsYXlvdXRRdWV1ZS5hcHBlbmQoaW5saW5lQm94V2l0aElubGluZUNvbnRlbnQuZmlyc3RJ
bkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoIWxh
eW91dFF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKmxh
eW91dFF1ZXVlLnRha2VMYXN0KCk7CisgICAgICAgICAgICBpZiAoaXM8TGluZUJyZWFrQm94Pihs
YXlvdXRCb3gpKSB7CisgICAgICAgICAgICAgICAgYXV0byYgbGluZUJyZWFrQm94ID0gZG93bmNh
c3Q8TGluZUJyZWFrQm94PihsYXlvdXRCb3gpOworICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdT
dGF0ZS5hZGRJbmxpbmVJdGVtKHsgbGF5b3V0Qm94LCBsaW5lQnJlYWtCb3guaXNPcHRpb25hbCgp
ID8gSW5saW5lSXRlbTo6VHlwZTo6V29yZEJyZWFrT3Bwb3J0dW5pdHkgOiBJbmxpbmVJdGVtOjpU
eXBlOjpIYXJkTGluZUJyZWFrIH0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRCb3gu
aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUu
YWRkSW5saW5lSXRlbSh7IGxheW91dEJveCwgSW5saW5lSXRlbTo6VHlwZTo6RmxvYXQgfSk7Cisg
ICAgICAgICAgICBlbHNlIGlmIChsYXlvdXRCb3guaXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKQor
ICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRJbmxpbmVJdGVtKHsgbGF5b3V0Qm94
LCBJbmxpbmVJdGVtOjpUeXBlOjpCb3ggfSk7CisgICAgICAgICAgICBlbHNlIGlmIChsYXlvdXRC
b3guaXNJbmxpbmVUZXh0Qm94KCkpIHsKKyAgICAgICAgICAgICAgICBJbmxpbmVUZXh0SXRlbTo6
Y3JlYXRlQW5kQXBwZW5kVGV4dEl0ZW1zKGZvcm1hdHRpbmdTdGF0ZS5pbmxpbmVJdGVtcygpLCBk
b3duY2FzdDxJbmxpbmVUZXh0Qm94PihsYXlvdXRCb3gpKTsKKyAgICAgICAgICAgIH0gZWxzZSBp
ZiAobGF5b3V0Qm94LmlzSW5saW5lQm94KCkpCisgICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0
YXRlLmFkZElubGluZUl0ZW0oeyBsYXlvdXRCb3gsIElubGluZUl0ZW06OlR5cGU6OklubGluZUJv
eEVuZCB9KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKworICAgICAgICAgICAgaWYgKGF1dG8qIG5leHRTaWJsaW5nID0gbGF5b3V0Qm94
Lm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7CisgICAgICAgICAgICAgICAgbGF5b3V0
UXVldWUuYXBwZW5kKG5leHRTaWJsaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworSW5saW5lUmVjdCBJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dDo6Y29tcHV0ZUdlb21ldHJ5Rm9yTGluZUNvbnRlbnQoY29uc3QgTGluZUJ1aWxk
ZXI6OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiBob3Jpem9udGFsQ29uc3RyYWludHMpCit7CisgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0g
dGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7CisgICAgYXV0byBnZW9tZXRyeSA9IHRoaXMtPmdlb21l
dHJ5KCk7CisKKyAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZUJveChnZW9tZXRyeS5saW5lQm94
Rm9yTGluZUNvbnRlbnQobGluZUNvbnRlbnQpKTsKKyAgICBjb25zdCBhdXRvJiBsaW5lQm94ID0g
Zm9ybWF0dGluZ1N0YXRlLmxpbmVCb3hlcygpLmxhc3QoKTsKKyAgICBhdXRvIGxpbmVJbmRleCA9
IGZvcm1hdHRpbmdTdGF0ZS5saW5lcygpLnNpemUoKTsKKyAgICBhdXRvJiBsaW5lQm94TG9naWNh
bFJlY3QgPSBsaW5lQm94LmxvZ2ljYWxSZWN0KCk7CisgICAgaWYgKCFsaW5lQm94Lmhhc0NvbnRl
bnQoKSkgeworICAgICAgICAvLyBGYXN0IHBhdGggZm9yIGxpbmVzIHdpdGggbm8gY29udGVudCBl
LmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2Rpdj4gb3IgPHNwYW4+PGRpdj48
L2Rpdj48L3NwYW4+IHdoZXJlIHdlIGNvbnN0cnVjdCBlbXB0eSBwcmUgYW5kIHBvc3QgYmxvY2tz
LgorICAgICAgICBBU1NFUlQoIWxpbmVCb3guY29udGVudExvZ2ljYWxXaWR0aCgpICYmICFsaW5l
Qm94TG9naWNhbFJlY3QuaGVpZ2h0KCkpOworICAgICAgICBhdXRvIHVwZGF0ZUlubGluZUJveGVz
R2VvbWV0cnlJZkFwcGxpY2FibGUgPSBbJl0geworICAgICAgICAgICAgaWYgKCFsaW5lQm94Lmhh
c0lubGluZUJveCgpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFZlY3Rv
cjxjb25zdCBCb3gqPiBsYXlvdXRCb3hMaXN0OworICAgICAgICAgICAgLy8gQ29sbGVjdCB0aGUg
ZW1wdHkgaW5saW5lIGJveGVzIHRoYXQgc2hvd2VkIHVwIGZpcnN0IG9uIHRoaXMgbGluZS4KKyAg
ICAgICAgICAgIC8vIE5vdGUgdGhhdCBhbiBpbmxpbmUgYm94IGVuZCBvbiBhbiBlbXB0eSBsaW5l
IGRvZXMgbm90IG1ha2UgdGhlIGlubGluZSBib3ggdGFsbGVyLgorICAgICAgICAgICAgLy8gKGUu
Zy4gPGRpdj50ZXh0PHNwYW4+PGJyPjwvc3Bhbj48L2Rpdj4pIDwtIHRoZSA8c3Bhbj4gaW5saW5l
IGJveCBpcyBhcyB0YWxsIGFzIHRoZSBsaW5lIGV2ZW4gdGhvdWdoIHRoZSA8L3NwYW4+IGlzIGFm
dGVyIGEgPGJyPiBzbyB0ZWNobmljYWxseSBpcyBvbiB0aGUgZm9sbG93aW5nIChlbXB0eSlsaW5l
LgorICAgICAgICAgICAgZm9yIChhdXRvJiBsaW5lUnVuIDogbGluZUNvbnRlbnQucnVucykgewor
ICAgICAgICAgICAgICAgIGlmIChsaW5lUnVuLmlzSW5saW5lQm94U3RhcnQoKSkKKyAgICAgICAg
ICAgICAgICAgICAgbGF5b3V0Qm94TGlzdC5hcHBlbmQoJmxpbmVSdW4ubGF5b3V0Qm94KCkpOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChhdXRvKiBsYXlvdXRCb3ggOiBsYXlvdXRC
b3hMaXN0KSB7CisgICAgICAgICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5n
U3RhdGUuYm94R2VvbWV0cnkoKmxheW91dEJveCk7CisgICAgICAgICAgICAgICAgYXV0byBpbmxp
bmVCb3hMb2dpY2FsSGVpZ2h0ID0gTGF5b3V0VW5pdDo6ZnJvbUZsb2F0Q2VpbChsaW5lQm94Lmxv
Z2ljYWxCb3JkZXJCb3hGb3JJbmxpbmVCb3goKmxheW91dEJveCwgYm94R2VvbWV0cnkpLmhlaWdo
dCgpKTsKKyAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGlu
bGluZUJveExvZ2ljYWxIZWlnaHQpOworICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENv
bnRlbnRCb3hXaWR0aCh7IH0pOworICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldExvZ2lj
YWxUb3BMZWZ0KHRvTGF5b3V0UG9pbnQobGluZUJveExvZ2ljYWxSZWN0LnRvcExlZnQoKSkpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB1cGRhdGVJbmxpbmVCb3hlc0dlb21l
dHJ5SWZBcHBsaWNhYmxlKCk7CisgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lKHsgbGlu
ZUJveExvZ2ljYWxSZWN0LCB7IHsgfSwgeyB9IH0sIHsgfSwgeyB9LCB7IH0gfSk7CisgICAgICAg
IHJldHVybiBsaW5lQm94TG9naWNhbFJlY3Q7CisgICAgfQorCisgICAgYXV0byByb290SW5saW5l
Qm94TG9naWNhbFJlY3QgPSBsaW5lQm94LmxvZ2ljYWxSZWN0Rm9yUm9vdElubGluZUJveCgpOwor
ICAgIGF1dG8gZW5jbG9zaW5nVG9wQW5kQm90dG9tID0gSW5saW5lTGluZUdlb21ldHJ5OjpFbmNs
b3NpbmdUb3BBbmRCb3R0b20geyByb290SW5saW5lQm94TG9naWNhbFJlY3QudG9wKCksIHJvb3RJ
bmxpbmVCb3hMb2dpY2FsUmVjdC5ib3R0b20oKSB9OworICAgIEhhc2hTZXQ8Y29uc3QgQm94Kj4g
aW5saW5lQm94U3RhcnRTZXQ7CisgICAgSGFzaFNldDxjb25zdCBCb3gqPiBpbmxpbmVCb3hFbmRT
ZXQ7CisKKyAgICBhdXRvIGNvbnN0cnVjdExpbmVSdW5zQW5kVXBkYXRlQm94R2VvbWV0cnkgPSBb
Jl0geworICAgICAgICAvLyBDcmVhdGUgdGhlIGlubGluZSBydW5zIG9uIHRoZSBjdXJyZW50IGxp
bmUuIFRoaXMgaXMgbW9zdGx5IHRleHQgYW5kIGF0b21pYyBpbmxpbmUgcnVucy4KKyAgICAgICAg
Zm9yIChhdXRvJiBsaW5lUnVuIDogbGluZUNvbnRlbnQucnVucykgeworICAgICAgICAgICAgLy8g
RklYTUU6IFdlIHNob3VsZCBub3QgbmVlZCB0byBjb25zdHJ1Y3QgYSBsaW5lIHJ1biBmb3IgPGJy
Pi4KKyAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9IGxpbmVSdW4ubGF5b3V0Qm94KCk7Cisg
ICAgICAgICAgICBpZiAobGluZVJ1bi5pc1RleHQoKSkgeworICAgICAgICAgICAgICAgIGZvcm1h
dHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gsIGxpbmVCb3gubG9n
aWNhbFJlY3RGb3JUZXh0UnVuKGxpbmVSdW4pLCBsaW5lUnVuLmV4cGFuc2lvbigpLCBsaW5lUnVu
LnRleHRDb250ZW50KCkgfSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiAobGluZVJ1bi5pc0xpbmVCcmVhaygpKSB7CisgICAgICAgICAg
ICAgICAgaWYgKGxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKSB7CisgICAgICAgICAgICAgICAg
ICAgIC8vIE9ubHkgaGFyZCBsaW5lYnJlYWtzIGhhdmUgYXNzb2NpYXRlZCBsYXlvdXQgYm94ZXMu
CisgICAgICAgICAgICAgICAgICAgIGF1dG8gbGluZUJyZWFrQm94UmVjdCA9IGxpbmVCb3gubG9n
aWNhbFJlY3RGb3JMaW5lQnJlYWtCb3gobGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICAgICAg
Zm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBsaW5lSW5kZXgsIGxheW91dEJveCwgbGluZUJy
ZWFrQm94UmVjdCwgbGluZVJ1bi5leHBhbnNpb24oKSwgeyB9IH0pOworCisgICAgICAgICAgICAg
ICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxh
eW91dEJveCk7CisgICAgICAgICAgICAgICAgICAgIGxpbmVCcmVha0JveFJlY3QubW92ZUJ5KGxp
bmVCb3hMb2dpY2FsUmVjdC50b3BMZWZ0KCkpOworICAgICAgICAgICAgICAgICAgICBib3hHZW9t
ZXRyeS5zZXRMb2dpY2FsVG9wTGVmdCh0b0xheW91dFBvaW50KGxpbmVCcmVha0JveFJlY3QudG9w
TGVmdCgpKSk7CisgICAgICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hI
ZWlnaHQodG9MYXlvdXRVbml0KGxpbmVCcmVha0JveFJlY3QuaGVpZ2h0KCkpKTsKKyAgICAgICAg
ICAgICAgICB9IGVsc2UgCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRM
aW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gsIGxpbmVCb3gubG9naWNhbFJlY3RGb3JUZXh0
UnVuKGxpbmVSdW4pLCBsaW5lUnVuLmV4cGFuc2lvbigpLCBsaW5lUnVuLnRleHRDb250ZW50KCkg
fSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBpZiAobGluZVJ1bi5pc0JveCgpKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKGxheW91dEJv
eC5pc0F0b21pY0lubGluZUxldmVsQm94KCkpOworICAgICAgICAgICAgICAgIGF1dG8mIGJveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7CisgICAgICAg
ICAgICAgICAgYXV0byBsb2dpY2FsQm9yZGVyQm94ID0gbGluZUJveC5sb2dpY2FsQm9yZGVyQm94
Rm9yQXRvbWljSW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94LCBib3hHZW9tZXRyeSk7CisgICAgICAg
ICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBsaW5lSW5kZXgsIGxheW91dEJv
eCwgbG9naWNhbEJvcmRlckJveCwgbGluZVJ1bi5leHBhbnNpb24oKSwgeyB9IH0pOworCisgICAg
ICAgICAgICAgICAgYXV0byBib3JkZXJCb3hMb2dpY2FsVG9wTGVmdCA9IGxvZ2ljYWxCb3JkZXJC
b3gudG9wTGVmdCgpOworICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBpbmxpbmUgYm94ZXMg
YXJlIHJlbGF0aXZlIHRvIHRoZSBsaW5lIGFuZCB0aGVpciB0b3AgcG9zaXRpb24gY2FuIGJlIG5l
Z2F0aXZlLgorICAgICAgICAgICAgICAgIGJvcmRlckJveExvZ2ljYWxUb3BMZWZ0Lm1vdmVCeShs
aW5lQm94TG9naWNhbFJlY3QudG9wTGVmdCgpKTsKKyAgICAgICAgICAgICAgICBpZiAobGF5b3V0
Qm94LmlzSW5GbG93UG9zaXRpb25lZCgpKQorICAgICAgICAgICAgICAgICAgICBib3JkZXJCb3hM
b2dpY2FsVG9wTGVmdCArPSBnZW9tZXRyeS5pbkZsb3dQb3NpdGlvbmVkUG9zaXRpb25PZmZzZXQo
bGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAgICAgICAgICAgIC8vIEF0
b21pYyBpbmxpbmUgYm94ZXMgYXJlIGFsbCBzZXQuIFRoZWlyIG1hcmdpbi9ib3JkZXIvY29udGVu
dCBib3ggZ2VvbWV0cmllcyBhcmUgYWxyZWFkeSBjb21wdXRlZC4gV2UganVzdCBoYXZlIHRvIHBv
c2l0aW9uIHRoZW0gaGVyZS4KKyAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2Fs
VG9wTGVmdCh0b0xheW91dFBvaW50KGJvcmRlckJveExvZ2ljYWxUb3BMZWZ0KSk7CisKKyAgICAg
ICAgICAgICAgICBhdXRvIGJvcmRlckJveFRvcCA9IGJvcmRlckJveExvZ2ljYWxUb3BMZWZ0Lnko
KTsKKyAgICAgICAgICAgICAgICBhdXRvIGJvcmRlckJveEJvdHRvbSA9IGJvcmRlckJveFRvcCAr
IGJveEdlb21ldHJ5LmJvcmRlckJveEhlaWdodCgpOworICAgICAgICAgICAgICAgIGVuY2xvc2lu
Z1RvcEFuZEJvdHRvbS50b3AgPSBzdGQ6Om1pbihlbmNsb3NpbmdUb3BBbmRCb3R0b20udG9wLCBi
b3JkZXJCb3hUb3ApOworICAgICAgICAgICAgICAgIGVuY2xvc2luZ1RvcEFuZEJvdHRvbS5ib3R0
b20gPSBzdGQ6Om1heChlbmNsb3NpbmdUb3BBbmRCb3R0b20uYm90dG9tLCBib3JkZXJCb3hCb3R0
b20pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgaWYgKGxpbmVSdW4uaXNJbmxpbmVCb3hTdGFydCgpKSB7CisgICAgICAgICAgICAgICAgYXV0
byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsK
KyAgICAgICAgICAgICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxSZWN0ID0gbGluZUJveC5sb2dp
Y2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KGxheW91dEJveCwgYm94R2VvbWV0cnkpOworICAgICAg
ICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRC
b3gsIGlubGluZUJveExvZ2ljYWxSZWN0LCBsaW5lUnVuLmV4cGFuc2lvbigpLCB7IH0gfSk7Cisg
ICAgICAgICAgICAgICAgaW5saW5lQm94U3RhcnRTZXQuYWRkKCZsYXlvdXRCb3gpOworICAgICAg
ICAgICAgICAgIGVuY2xvc2luZ1RvcEFuZEJvdHRvbS50b3AgPSBzdGQ6Om1pbihlbmNsb3NpbmdU
b3BBbmRCb3R0b20udG9wLCBpbmxpbmVCb3hMb2dpY2FsUmVjdC50b3AoKSk7CisgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZVJ1bi5p
c0lubGluZUJveEVuZCgpKSB7CisgICAgICAgICAgICAgICAgaW5saW5lQm94RW5kU2V0LmFkZCgm
bGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICBpZiAoIWlubGluZUJveFN0YXJ0U2V0LmNvbnRh
aW5zKCZsYXlvdXRCb3gpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFuIGlubGluZSBib3gg
Y2FuIHNwYW4gbXVsdGlwbGUgbGluZXMuIFVzZSB0aGUgW2lubGluZSBib3ggZW5kXSBzaWduYWwg
dG8gaW5jbHVkZSBpdCBpbiB0aGUgZW5jbG9zaW5nIGdlb21ldHJ5CisgICAgICAgICAgICAgICAg
ICAgIC8vIG9ubHkgd2hlbiBpdCBzdGFydHMgYXQgYSBwcmV2aW91cyBsaW5lLgorICAgICAgICAg
ICAgICAgICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxSZWN0ID0gbGluZUJveC5sb2dpY2FsQm9y
ZGVyQm94Rm9ySW5saW5lQm94KGxheW91dEJveCwgZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5
KGxheW91dEJveCkpOworICAgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdUb3BBbmRCb3R0b20u
Ym90dG9tID0gc3RkOjptYXgoZW5jbG9zaW5nVG9wQW5kQm90dG9tLmJvdHRvbSwgaW5saW5lQm94
TG9naWNhbFJlY3QuYm90dG9tKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVChsaW5lUnVuLmlz
V29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7CisgICAgICAgIH0KKyAgICB9OworICAgIGNvbnN0cnVj
dExpbmVSdW5zQW5kVXBkYXRlQm94R2VvbWV0cnkoKTsKKworICAgIGF1dG8gdXBkYXRlQm94R2Vv
bWV0cnlGb3JJbmxpbmVCb3hlcyA9IFsmXSB7CisgICAgICAgIC8vIEZJWE1FOiBXZSBtYXkgd2Fu
dCB0byBrZWVwIGFyb3VuZCBhbiBpbmxpbmUgYm94IG9ubHkgc2V0LgorICAgICAgICBpZiAoIWxp
bmVCb3guaGFzSW5saW5lQm94KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8vIEdy
YWIgdGhlIGlubGluZSBib3hlcyAoZXZlbiB0aG9zZSB0aGF0IGRvbid0IGhhdmUgYXNzb2NpYXRl
ZCBsYXlvdXQgYm94ZXMgb24gdGhlIGN1cnJlbnQgbGluZSBkdWUgdG8gbGluZSB3cmFwcGluZykK
KyAgICAgICAgLy8gYW5kIHVwZGF0ZSB0aGVpciBnZW9tZXRyaWVzLgorICAgICAgICBmb3IgKGF1
dG8mIGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hlcygpKSB7
CisgICAgICAgICAgICBpZiAoIWlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkpCisgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBpbmxpbmVM
ZXZlbEJveC5sYXlvdXRCb3goKTsKKyAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9y
bWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7CisgICAgICAgICAgICAvLyBJbmxp
bmUgYm94ZXMgbWF5IG9yIG1heSBub3QgYmUgd3JhcHBlZCBhbmQgaGF2ZSBydW5zIG9uIG11bHRp
cGxlIGxpbmVzIChlLmcuIDxzcGFuPmZpcnN0IGxpbmU8YnI+c2Vjb25kIGxpbmU8YnI+dGhpcmQg
bGluZTwvc3Bhbj4pCisgICAgICAgICAgICBhdXRvIGlubGluZUJveEJvcmRlckJveCA9IGxpbmVC
b3gubG9naWNhbEJvcmRlckJveEZvcklubGluZUJveChsYXlvdXRCb3gsIGJveEdlb21ldHJ5KTsK
KyAgICAgICAgICAgIGF1dG8gaW5saW5lQm94U2l6ZSA9IExheW91dFNpemUgeyBMYXlvdXRVbml0
Ojpmcm9tRmxvYXRDZWlsKGlubGluZUJveEJvcmRlckJveC53aWR0aCgpKSwgTGF5b3V0VW5pdDo6
ZnJvbUZsb2F0Q2VpbChpbmxpbmVCb3hCb3JkZXJCb3guaGVpZ2h0KCkpIH07CisgICAgICAgICAg
ICBhdXRvIGxvZ2ljYWxSZWN0ID0gUmVjdCB7IExheW91dFBvaW50IHsgaW5saW5lQm94Qm9yZGVy
Qm94LnRvcExlZnQoKSB9LCBpbmxpbmVCb3hTaXplIH07CisgICAgICAgICAgICBsb2dpY2FsUmVj
dC5tb3ZlQnkoTGF5b3V0UG9pbnQgeyBsaW5lQm94TG9naWNhbFJlY3QudG9wTGVmdCgpIH0pOwor
ICAgICAgICAgICAgaWYgKGlubGluZUJveFN0YXJ0U2V0LmNvbnRhaW5zKCZsYXlvdXRCb3gpKSB7
CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpbmxpbmUgYm94IHNob3dlZCB1cCBmaXJzdCBvbiB0
aGlzIGxpbmUuCisgICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQo
bG9naWNhbFJlY3QudG9wTGVmdCgpKTsKKyAgICAgICAgICAgICAgICBhdXRvIGNvbnRlbnRCb3hI
ZWlnaHQgPSBsb2dpY2FsUmVjdC5oZWlnaHQoKSAtIChib3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRl
cigpICsgYm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KSk7CisgICAg
ICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodChjb250ZW50Qm94SGVp
Z2h0KTsKKyAgICAgICAgICAgICAgICBhdXRvIGNvbnRlbnRCb3hXaWR0aCA9IGxvZ2ljYWxSZWN0
LndpZHRoKCkgLSAoYm94R2VvbWV0cnkuaG9yaXpvbnRhbEJvcmRlcigpICsgYm94R2VvbWV0cnku
aG9yaXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKTsKKyAgICAgICAgICAgICAgICBib3hH
ZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudEJveFdpZHRoKTsKKyAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE1pZGRsZSBvciBl
bmQgb2YgdGhlIGlubGluZSBib3guIExldCdzIHN0cmV0Y2ggdGhlIGJveCBhcyBuZWVkZWQuCisg
ICAgICAgICAgICBhdXRvIGVuY2xvc2luZ0JvcmRlckJveFJlY3QgPSBCb3hHZW9tZXRyeTo6Ym9y
ZGVyQm94UmVjdChib3hHZW9tZXRyeSk7CisgICAgICAgICAgICBlbmNsb3NpbmdCb3JkZXJCb3hS
ZWN0LmV4cGFuZFRvQ29udGFpbihsb2dpY2FsUmVjdCk7CisgICAgICAgICAgICBib3hHZW9tZXRy
eS5zZXRMb2dpY2FsTGVmdChlbmNsb3NpbmdCb3JkZXJCb3hSZWN0LmxlZnQoKSk7CisKKyAgICAg
ICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoZW5jbG9zaW5nQm9yZGVyQm94
UmVjdC5oZWlnaHQoKSAtIChib3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgYm94R2VvbWV0
cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KSkpOworICAgICAgICAgICAgYm94R2Vv
bWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGVuY2xvc2luZ0JvcmRlckJveFJlY3Qud2lkdGgoKSAt
IChib3hHZW9tZXRyeS5ob3Jpem9udGFsQm9yZGVyKCkgKyBib3hHZW9tZXRyeS5ob3Jpem9udGFs
UGFkZGluZygpLnZhbHVlT3IoMF9sdSkpKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdXBkYXRl
Qm94R2VvbWV0cnlGb3JJbmxpbmVCb3hlcygpOworCisgICAgYXV0byBjb25zdHJ1Y3RMaW5lR2Vv
bWV0cnkgPSBbJl0geworICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZSh7IGxpbmVCb3hM
b2dpY2FsUmVjdCwgZW5jbG9zaW5nVG9wQW5kQm90dG9tLCBsaW5lQm94LmFsaWdubWVudEJhc2Vs
aW5lKCksIHJvb3RJbmxpbmVCb3hMb2dpY2FsUmVjdC5sZWZ0KCksIGxpbmVDb250ZW50LmNvbnRl
bnRMb2dpY2FsV2lkdGggfSk7CisgICAgfTsKKyAgICBjb25zdHJ1Y3RMaW5lR2VvbWV0cnkoKTsK
KworICAgIHJldHVybiBsaW5lQm94TG9naWNhbFJlY3Q7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0
dGluZ0NvbnRleHQ6OmludmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoY29uc3QgSW52YWxpZGF0aW9u
U3RhdGUmKQoreworICAgIC8vIEZpbmQgb3V0IHdoYXQgd2UgbmVlZCB0byBpbnZhbGlkYXRlLiBU
aGlzIGlzIHdoZXJlIHdlIGFkZCBzb21lIHNtYXJ0cyB0byBkbyBwYXJ0aWFsIGxpbmUgbGF5b3V0
LgorICAgIC8vIEZvciBub3cgbGV0J3MganVzdCBjbGVhciB0aGUgcnVucy4KKyAgICBmb3JtYXR0
aW5nU3RhdGUoKS5jbGVhckxpbmVBbmRSdW5zKCk7CisgICAgLy8gRklYTUU6IFRoaXMgaXMgYWxz
byB3aGVyZSB3ZSB3b3VsZCBkZWxldGUgaW5saW5lIGl0ZW1zIGlmIHRoZWlyIGNvbnRlbnQgY2hh
bmdlZC4KK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5n
Q29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxp
bmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYWQ3ZWM5
NzIzN2MxZTg4ZDc4ODYwMjY3YTE4MDdlMjA0OGFmNDMyZQotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9J
bmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKwor
I2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJ1aWxk
ZXIuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBJbmxpbmVGb3JtYXR0aW5nU3RhdGU7CitjbGFz
cyBJbnZhbGlkYXRpb25TdGF0ZTsKK2NsYXNzIExpbmVCb3g7CisKKy8vIFRoaXMgY2xhc3MgaW1w
bGVtZW50cyB0aGUgbGF5b3V0IGxvZ2ljIGZvciBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0cy4K
Ky8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi92aXN1cmVuLmh0bWwjaW5saW5lLWZvcm1h
dHRpbmcKK2NsYXNzIElubGluZUZvcm1hdHRpbmdDb250ZXh0IGZpbmFsIDogcHVibGljIEZvcm1h
dHRpbmdDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKElubGluZUZvcm1hdHRp
bmdDb250ZXh0KTsKK3B1YmxpYzoKKyAgICBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dChjb25zdCBD
b250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgSW5saW5lRm9ybWF0dGluZ1N0YXRl
Jik7CisgICAgdm9pZCBsYXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiwgY29u
c3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jikgb3ZlcnJpZGU7CisgICAgTGF5b3V0VW5p
dCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgY2xhc3MgUXVpcmtz
IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgeworICAgIHB1YmxpYzoKKyAgICAg
ICAgSW5saW5lTGF5b3V0VW5pdCBpbml0aWFsTGluZUhlaWdodCgpIGNvbnN0OworICAgICAgICBi
b29sIGhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdlKCkgY29uc3Q7CisgICAgICAgIGJvb2wg
aW5saW5lTGV2ZWxCb3hBZmZlY3RzTGluZUJveChjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJv
eCYsIGNvbnN0IExpbmVCb3gmKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIGZyaWVu
ZCBjbGFzcyBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKKyAgICAgICAgUXVpcmtzKGNvbnN0IElu
bGluZUZvcm1hdHRpbmdDb250ZXh0Jik7CisKKyAgICAgICAgY29uc3QgSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8SW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OmZvcm1hdHRp
bmdDb250ZXh0KCkpOyB9CisKKyAgICB9OworICAgIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpR
dWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4gUXVpcmtzKCp0aGlzKTsgfQorCisgICAgY29u
c3QgSW5saW5lRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVy
biBkb3duY2FzdDxJbmxpbmVGb3JtYXR0aW5nU3RhdGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3Jt
YXR0aW5nU3RhdGUoKSk7IH0KKyAgICBJbmxpbmVGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdT
dGF0ZSgpIHsgcmV0dXJuIGRvd25jYXN0PElubGluZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGlu
Z0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQorCisgICAgdm9pZCBsaW5lTGF5b3V0Rm9y
SW50ZXJncmF0aW9uKEludmFsaWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZs
b3dDb250ZW50Jik7CisKK3ByaXZhdGU6CisgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBj
b21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSBvdmVycmlkZTsKKworICAgIGNsYXNz
IEdlb21ldHJ5IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSB7CisgICAgcHVi
bGljOgorICAgICAgICBMaW5lQm94IGxpbmVCb3hGb3JMaW5lQ29udGVudChjb25zdCBMaW5lQnVp
bGRlcjo6TGluZUNvbnRlbnQmKTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsVG9w
Rm9yTmV4dExpbmUoY29uc3QgTGluZUJ1aWxkZXI6OkxpbmVDb250ZW50JiwgSW5saW5lTGF5b3V0
VW5pdCBwcmV2aW91c0xpbmVMb2dpY2FsQm90dG9tLCBjb25zdCBGbG9hdGluZ0NvbnRleHQmKSBj
b25zdDsKKworICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGlubGluZUJsb2NrQ29udGVu
dEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMm
LCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKSBjb25zdDsKKyAgICAgICAgQ29udGVu
dFdpZHRoQW5kTWFyZ2luIGlubGluZUJsb2NrQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJv
eCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9u
dGFsVmFsdWVzJik7CisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgY2xhc3MgSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQ7CisgICAgICAgIEdlb21ldHJ5KGNvbnN0IElubGluZUZvcm1hdHRp
bmdDb250ZXh0Jik7CisKKyAgICAgICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGZv
cm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8SW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Zm9ybWF0dGluZ0NvbnRleHQo
KSk7IH0KKworICAgIH07CisgICAgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdl
b21ldHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMpOyB9CisKKyAgICB2b2lkIGxp
bmVMYXlvdXQoSW5saW5lSXRlbXMmLCBMaW5lQnVpbGRlcjo6SW5saW5lSXRlbVJhbmdlLCBjb25z
dCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsKKworICAgIHZvaWQgY29tcHV0ZUludHJp
bnNpY1dpZHRoRm9yRm9ybWF0dGluZ1Jvb3QoY29uc3QgQm94Jik7CisgICAgSW5saW5lTGF5b3V0
VW5pdCBjb21wdXRlZEludHJpbnNpY1dpZHRoRm9yQ29uc3RyYWludChJbmxpbmVMYXlvdXRVbml0
IGF2YWlsYWJsZVdpZHRoKSBjb25zdDsKKworICAgIHZvaWQgY29tcHV0ZUhvcml6b250YWxNYXJn
aW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7CisgICAgdm9pZCBj
b21wdXRlSGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYpOworICAgIHZvaWQgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0
IEhvcml6b250YWxDb25zdHJhaW50cyYpOworCisgICAgdm9pZCBjb2xsZWN0SW5saW5lQ29udGVu
dElmTmVlZGVkKCk7CisgICAgSW5saW5lUmVjdCBjb21wdXRlR2VvbWV0cnlGb3JMaW5lQ29udGVu
dChjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmLCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmKTsKKyAgICB2b2lkIGludmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoY29uc3QgSW52YWxp
ZGF0aW9uU3RhdGUmKTsKK307CisKK2lubGluZSBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnk6Okdlb21ldHJ5KGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dCkKKyAgICA6IEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeShpbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworaW5saW5lIElubGluZUZvcm1hdHRpbmdDb250ZXh0
OjpRdWlya3M6OlF1aXJrcyhjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5lRm9y
bWF0dGluZ0NvbnRleHQpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzKGlubGluZUZv
cm1hdHRpbmdDb250ZXh0KQoreworfQorCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNf
TEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCwgaXNJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dCgpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dEdlb21l
dHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5iMjRlNzg4MzMzODBmYjRjYzIwNTEzNTlhMzZiNTA0OTU0OWI5
YWQwCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnku
Y3BwCkBAIC0wLDAgKzEsNzI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisg
KiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICog
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VU
X0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgorI2lu
Y2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgor
I2luY2x1ZGUgIkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgor
I2luY2x1ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCisjaW5jbHVkZSAiTGVuZ3RoRnVuY3Rpb25z
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBM
aW5lQm94QnVpbGRlciB7CitwdWJsaWM6CisgICAgTGluZUJveEJ1aWxkZXIoY29uc3QgSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQmKTsKKyAgICBMaW5lQm94IGJ1aWxkKGNvbnN0IExpbmVCdWlsZGVy
OjpMaW5lQ29udGVudCYpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBTaW1wbGlmaWVkVmVydGlj
YWxBbGlnbm1lbnQgeworICAgICAgICBTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQoY29uc3Qg
TGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gpOworCisgICAgICAgIHN0YXRp
YyBib29sIGNhblVzZVNpbXBsaWZpZWRBbGlnbm1lbnQoY29uc3QgTGluZUJveDo6SW5saW5lTGV2
ZWxCb3gmIHJvb3RJbmxpbmVCb3gsIGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiwgT3B0
aW9uYWw8Y29uc3QgQm94R2VvbWV0cnk+IGlubGluZUxldmVsQm94R2VvbWV0cnkpOworCisgICAg
ICAgIHZvaWQgYWxpZ24oTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmKTsKKworICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IHJvb3RJbmxpbmVCb3hMb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbV9y
b290SW5saW5lQm94TG9naWNhbFRvcDsgfQorICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxpbmVC
b3hIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hMb2dpY2FsQm90dG9tIC0gbV9saW5l
Qm94TG9naWNhbFRvcDsgfQorCisgICAgICAgIHZvaWQgc2V0RW5hYmxlZChib29sIGVuYWJsZWQp
IHsgbV9pc0VuYWJsZWQgPSBlbmFibGVkOyB9CisgICAgICAgIGJvb2wgaXNFbmFibGVkKCkgY29u
c3QgeyByZXR1cm4gbV9pc0VuYWJsZWQ7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQg
YWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94Jik7CisKKyAgICAgICAgY29uc3Qg
TGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIG1fcm9vdElubGluZUJveDsKKyAgICAgICAgYm9vbCBt
X2lzRW5hYmxlZCB7IHRydWUgfTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2xpbmVCb3hM
b2dpY2FsVG9wIHsgMCB9OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fbGluZUJveExvZ2lj
YWxCb3R0b20geyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9yb290SW5saW5lQm94
TG9naWNhbFRvcCB7IDAgfTsKKyAgICB9OworCisgICAgdm9pZCBzZXRWZXJ0aWNhbEdlb21ldHJ5
Rm9ySW5saW5lQm94KExpbmVCb3g6OklubGluZUxldmVsQm94JikgY29uc3Q7CisgICAgdm9pZCBj
b25zdHJ1Y3RBbmRBbGlnbklubGluZUxldmVsQm94ZXMoTGluZUJveCYsIGNvbnN0IExpbmU6OlJ1
bkxpc3QmKTsKKyAgICB2b2lkIGNvbXB1dGVMaW5lQm94SGVpZ2h0QW5kQWxpZ25JbmxpbmVMZXZl
bEJveGVzVmVydGljYWxseShMaW5lQm94Jik7CisKKyAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2lubGluZUZvcm1h
dHRpbmdDb250ZXh0OyB9CisgICAgY29uc3QgQm94JiByb290Qm94KCkgY29uc3QgeyByZXR1cm4g
Zm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCk7IH0KKyAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3Rh
dGUoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmxheW91dFN0YXRlKCk7IH0K
KworICAgIGJvb2wgaXNSb290TGF5b3V0Qm94KGNvbnN0IENvbnRhaW5lckJveCYgY29udGFpbmVy
Qm94KSBjb25zdCB7IHJldHVybiAmY29udGFpbmVyQm94ID09ICZyb290Qm94KCk7IH0KKworcHJp
dmF0ZToKKyAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgbV9pbmxpbmVGb3JtYXR0
aW5nQ29udGV4dDsKK307CisKK3N0cnVjdCBIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVu
dCB7CitwdWJsaWM6CisgICAgdm9pZCByZXNldCgpOworCisgICAgSW5saW5lTGF5b3V0VW5pdCB3
aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fd2lkdGg7IH0KKyAgICBib29sIGlzQ29uZGl0aW9uYWwo
KSBjb25zdCB7IHJldHVybiBtX2lzQ29uZGl0aW9uYWw7IH0KKworICAgIHZvaWQgc2V0SXNDb25k
aXRpb25hbCgpIHsgbV9pc0NvbmRpdGlvbmFsID0gdHJ1ZTsgfQorICAgIHZvaWQgZXhwYW5kKElu
bGluZUxheW91dFVuaXQgd2lkdGgpIHsgbV93aWR0aCArPSB3aWR0aDsgfQorCitwcml2YXRlOgor
ICAgIGJvb2wgbV9pc0NvbmRpdGlvbmFsIHsgZmFsc2UgfTsKKyAgICBJbmxpbmVMYXlvdXRVbml0
IG1fd2lkdGggeyAwIH07Cit9OworCit2b2lkIEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250
ZW50OjpyZXNldCgpCit7CisgICAgbV9pc0NvbmRpdGlvbmFsID0gZmFsc2U7CisgICAgbV93aWR0
aCA9ICAwOworfQorCitzdGF0aWMgSGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQgY29s
bGVjdEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50KGNvbnN0IExpbmU6OlJ1bkxpc3Qm
IHJ1bnMsIGJvb2wgaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KQoreworICAgIGF1dG8gaGFu
Z2luZ0NvbnRlbnQgPSBIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVudCB7IH07CisgICAg
aWYgKGlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudCkKKyAgICAgICAgaGFuZ2luZ0NvbnRlbnQu
c2V0SXNDb25kaXRpb25hbCgpOworICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJz
ZWRSYW5nZShydW5zKSkgeworICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94U3RhcnQoKSB8fCBy
dW4uaXNJbmxpbmVCb3hFbmQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAo
cnVuLmlzTGluZUJyZWFrKCkpIHsKKyAgICAgICAgICAgIGhhbmdpbmdDb250ZW50LnNldElzQ29u
ZGl0aW9uYWwoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlm
ICghcnVuLmhhc1RyYWlsaW5nV2hpdGVzcGFjZSgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBwcmVzZXJ2ZWQgb3IgaHVuZyB3aGl0ZXNwYWNlLgor
ICAgICAgICBpZiAocnVuLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9IFdoaXRlU3BhY2U6OlByZVdy
YXApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gVGhpcyBpcyBlaXRoZXIgYSBub3Jt
YWwgb3IgY29uZGl0aW9uYWxseSBoYW5naW5nIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICAg
IGhhbmdpbmdDb250ZW50LmV4cGFuZChydW4udHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoKSk7Cisg
ICAgfQorICAgIHJldHVybiBoYW5naW5nQ29udGVudDsKK30KKworc3RhdGljIE9wdGlvbmFsPElu
bGluZUxheW91dFVuaXQ+IGhvcml6b250YWxBbGlnbm1lbnRPZmZzZXQoY29uc3QgTGluZTo6UnVu
TGlzdCYgcnVucywgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24sIElubGluZUxheW91dFVuaXQgbGlu
ZUxvZ2ljYWxXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoLCBib29s
IGlzTGFzdExpbmUpCit7CisgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGxpbmVMb2dpY2FsV2lk
dGggLSBjb250ZW50TG9naWNhbFdpZHRoOworICAgIGF1dG8gaGFuZ2luZ1RyYWlsaW5nV2hpdGVz
cGFjZUNvbnRlbnQgPSBjb2xsZWN0SGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQocnVu
cywgaXNMYXN0TGluZSk7CisgICAgYXZhaWxhYmxlV2lkdGggKz0gaGFuZ2luZ1RyYWlsaW5nV2hp
dGVzcGFjZUNvbnRlbnQud2lkdGgoKTsKKyAgICBpZiAoYXZhaWxhYmxlV2lkdGggPD0gMCkKKyAg
ICAgICAgcmV0dXJuIHsgfTsKKworICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsQWxpZ25tZW50
ID0gWyZdIHsKKyAgICAgICAgaWYgKHRleHRBbGlnbiAhPSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5
KQorICAgICAgICAgICAgcmV0dXJuIHRleHRBbGlnbjsKKyAgICAgICAgLy8gVGV4dCBpcyBqdXN0
aWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBtZXRob2Qgc3BlY2lmaWVkIGJ5IHRoZSB0ZXh0LWp1c3Rp
ZnkgcHJvcGVydHksCisgICAgICAgIC8vIGluIG9yZGVyIHRvIGV4YWN0bHkgZmlsbCB0aGUgbGlu
ZSBib3guIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRleHQtYWxpZ24tbGFzdCwKKyAg
ICAgICAgLy8gdGhlIGxhc3QgbGluZSBiZWZvcmUgYSBmb3JjZWQgYnJlYWsgb3IgdGhlIGVuZCBv
ZiB0aGUgYmxvY2sgaXMgc3RhcnQtYWxpZ25lZC4KKyAgICAgICAgaWYgKGlzTGFzdExpbmUgfHwg
KCFydW5zLmlzRW1wdHkoKSAmJiBydW5zLmxhc3QoKS5pc0xpbmVCcmVhaygpKSkKKyAgICAgICAg
ICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpTdGFydDsKKyAgICAgICAgcmV0dXJuIFRleHRBbGln
bk1vZGU6Okp1c3RpZnk7CisgICAgfTsKKworICAgIHN3aXRjaCAoY29tcHV0ZWRIb3Jpem9udGFs
QWxpZ25tZW50KCkpIHsKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OkxlZnQ6CisgICAgY2FzZSBU
ZXh0QWxpZ25Nb2RlOjpXZWJLaXRMZWZ0OgorICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6U3RhcnQ6
CisgICAgICAgIHJldHVybiB7IH07CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpSaWdodDoKKyAg
ICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0OgorICAgIGNhc2UgVGV4dEFsaWduTW9k
ZTo6RW5kOgorICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgY2FzZSBUZXh0QWxp
Z25Nb2RlOjpDZW50ZXI6CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRDZW50ZXI6Cisg
ICAgICAgIHJldHVybiBhdmFpbGFibGVXaWR0aCAvIDI7CisgICAgY2FzZSBUZXh0QWxpZ25Nb2Rl
OjpKdXN0aWZ5OgorICAgICAgICAvLyBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5IGlzIGEgcnVuIGFs
aWdubWVudCAoYW5kIHdlIG9ubHkgZG8gaW5saW5lIGJveCBhbGlnbm1lbnQgaGVyZSkKKyAgICAg
ICAgcmV0dXJuIHsgfTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVO
VEVEX1lFVCgpOworICAgICAgICByZXR1cm4geyB9OworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICByZXR1cm4geyB9OworfQorCitMaW5lQm94QnVpbGRlcjo6TGluZUJveEJ1
aWxkZXIoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1hdHRpbmdDb250
ZXh0KQorICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dCkKK3sKK30KKworTGluZUJveCBMaW5lQm94QnVpbGRlcjo6YnVpbGQoY29uc3QgTGluZUJ1
aWxkZXI6OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCkKK3sKKyAgICBhdXRvJiBydW5zID0gbGlu
ZUNvbnRlbnQucnVuczsKKyAgICBhdXRvIGxpbmVMb2dpY2FsV2lkdGggPSBsaW5lQ29udGVudC5s
aW5lTG9naWNhbFdpZHRoOworICAgIGF1dG8gY29udGVudExvZ2ljYWxXaWR0aCA9IGxpbmVDb250
ZW50LmNvbnRlbnRMb2dpY2FsV2lkdGg7CisgICAgYXV0byBob3Jpem9udGFsQWxpZ25tZW50T2Zm
c2V0ID0gTGF5b3V0Ojpob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0KHJ1bnMsIHJvb3RCb3goKS5z
dHlsZSgpLnRleHRBbGlnbigpLCBsaW5lTG9naWNhbFdpZHRoLCBjb250ZW50TG9naWNhbFdpZHRo
LCBsaW5lQ29udGVudC5pc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQpOworICAgIGF1dG8gbGlu
ZUJveCA9IExpbmVCb3ggeyByb290Qm94KCksIGxpbmVDb250ZW50LmxvZ2ljYWxUb3BMZWZ0LCBs
aW5lTG9naWNhbFdpZHRoLCBob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0LnZhbHVlT3IoSW5saW5l
TGF5b3V0VW5pdCB7IH0pLCBjb250ZW50TG9naWNhbFdpZHRoLCBsaW5lQ29udGVudC5ub25TcGFu
bmluZ0lubGluZUxldmVsQm94Q291bnQgfTsKKyAgICBjb25zdHJ1Y3RBbmRBbGlnbklubGluZUxl
dmVsQm94ZXMobGluZUJveCwgcnVucyk7CisgICAgcmV0dXJuIGxpbmVCb3g7Cit9CisKK3ZvaWQg
TGluZUJveEJ1aWxkZXI6OnNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3goTGluZUJveDo6
SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94KSBjb25zdAoreworICAgIEFTU0VSVChpbmxp
bmVMZXZlbEJveC5pc0lubGluZUJveCgpIHx8IGlubGluZUxldmVsQm94LmlzTGluZUJyZWFrQm94
KCkpOworICAgIGF1dG8mIGZvbnRNZXRyaWNzID0gaW5saW5lTGV2ZWxCb3guc3R5bGUoKS5mb250
TWV0cmljcygpOworICAgIElubGluZUxheW91dFVuaXQgYXNjZW50ID0gZm9udE1ldHJpY3MuYXNj
ZW50KCk7CisgICAgSW5saW5lTGF5b3V0VW5pdCBkZXNjZW50ID0gZm9udE1ldHJpY3MuZGVzY2Vu
dCgpOworICAgIGF1dG8gbG9naWNhbEhlaWdodCA9IGFzY2VudCArIGRlc2NlbnQ7CisgICAgLy8g
V2UgbmVlZCBmbG9vci9jZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlvdXQgaW50ZWdyYWwgcG9zaXRp
b25pbmcuCisgICAgaW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUoZmxvb3JmKGFzY2VudCkpOwor
ICAgIGlubGluZUxldmVsQm94LnNldERlc2NlbnQoY2VpbChkZXNjZW50KSk7CisgICAgaW5saW5l
TGV2ZWxCb3guc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KTsKKworICAgIC8vIEZJWE1F
OiBBZGp1c3QgbGF5b3V0IGJvdW5kcyB3aXRoIGZhbGxiYWNrIGZvbnQgd2hlbiBhcHBsaWNhYmxl
LgorICAgIGF1dG8mIHN0eWxlID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5bGUoKTsK
KyAgICBhdXRvIGxpbmVIZWlnaHQgPSBzdHlsZS5saW5lSGVpZ2h0KCk7CisgICAgaWYgKGxpbmVI
ZWlnaHQuaXNOZWdhdGl2ZSgpKSB7CisgICAgICAgIC8vIElmIGxpbmUtaGVpZ2h0IGNvbXB1dGVz
IHRvIG5vcm1hbCBhbmQgZWl0aGVyIHRleHQtZWRnZSBpcyBsZWFkaW5nIG9yIHRoaXMgaXMgdGhl
IHJvb3QgaW5saW5lIGJveCwKKyAgICAgICAgLy8gdGhlIGZvbnTigJlzIGxpbmUgZ2FwIG1ldHJp
YyBtYXkgYWxzbyBiZSBpbmNvcnBvcmF0ZWQgaW50byBBIGFuZCBEIGJ5IGFkZGluZyBoYWxmIHRv
IGVhY2ggc2lkZSBhcyBoYWxmLWxlYWRpbmcuCisgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9y
Zy9UUi9jc3MtaW5saW5lLTMvI2lubGluZS1oZWlnaHQKKyAgICAgICAgLy8gU2luY2UgdGV4dC1l
ZGdlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSBpcyBsZWFkaW5n
LCB3ZSBzaG91bGQganVzdCBhcHBseSBpdCB0bworICAgICAgICAvLyBhbGwgaW5saW5lIGJveGVz
LgorICAgICAgICBhdXRvIGhhbGZMaW5lR2FwID0gKGZvbnRNZXRyaWNzLmxpbmVTcGFjaW5nKCkg
LSBsb2dpY2FsSGVpZ2h0KSAvIDI7CisgICAgICAgIGFzY2VudCArPSBoYWxmTGluZUdhcDsKKyAg
ICAgICAgZGVzY2VudCArPSBoYWxmTGluZUdhcDsKKyAgICB9IGVsc2UgeworICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IGxpbmVIZWlnaHQgPSBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKTsKKyAg
ICAgICAgSW5saW5lTGF5b3V0VW5pdCBoYWxmTGVhZGluZyA9IChsaW5lSGVpZ2h0IC0gKGFzY2Vu
dCArIGRlc2NlbnQpKSAvIDI7CisgICAgICAgIGFzY2VudCArPSBoYWxmTGVhZGluZzsKKyAgICAg
ICAgZGVzY2VudCArPSBoYWxmTGVhZGluZzsKKyAgICB9CisgICAgLy8gV2UgbmVlZCBmbG9vci9j
ZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlvdXQgaW50ZWdyYWwgcG9zaXRpb25pbmcuCisgICAgaW5s
aW5lTGV2ZWxCb3guc2V0TGF5b3V0Qm91bmRzKExpbmVCb3g6OklubGluZUxldmVsQm94OjpMYXlv
dXRCb3VuZHMgeyBmbG9vcmYoYXNjZW50KSwgY2VpbChkZXNjZW50KSB9KTsKK30KKwordm9pZCBM
aW5lQm94QnVpbGRlcjo6Y29uc3RydWN0QW5kQWxpZ25JbmxpbmVMZXZlbEJveGVzKExpbmVCb3gm
IGxpbmVCb3gsIGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnMpCit7CisgICAgYXV0byYgcm9vdElu
bGluZUJveCA9IGxpbmVCb3gucm9vdElubGluZUJveCgpOworICAgIHNldFZlcnRpY2FsR2VvbWV0
cnlGb3JJbmxpbmVCb3gocm9vdElubGluZUJveCk7CisKKyAgICBhdXRvIHNpbXBsaWZpZWRWZXJ0
aWNhbEFsaWdubWVudCA9IFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudCB7IHJvb3RJbmxpbmVC
b3ggfTsKKyAgICAvLyBGSVhNRTogQWRkIGZhc3QgcGF0aCBzdXBwb3J0IGZvciBsaW5lLWhlaWdo
dCBjb250ZW50LgorICAgIHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5zZXRFbmFibGVkKGxh
eW91dFN0YXRlKCkuaW5TdGFuZGFyZHNNb2RlKCkgJiYgcm9vdEJveCgpLnN0eWxlKCkubGluZUhl
aWdodCgpLmlzTmVnYXRpdmUoKSk7CisKKyAgICBhdXRvIHNpbXBsaWZpZWRBbGlnblZlcnRpY2Fs
bHlJZkFwcGxpY2FibGUgPSBbJl0oYXV0byYgaW5saW5lTGV2ZWxCb3gsIE9wdGlvbmFsPGNvbnN0
IEJveEdlb21ldHJ5PiBib3hHZW9tZXRyeSkgeworICAgICAgICBpZiAoIXNpbXBsaWZpZWRWZXJ0
aWNhbEFsaWdubWVudC5pc0VuYWJsZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
aWYgKCFTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OmNhblVzZVNpbXBsaWZpZWRBbGlnbm1l
bnQocm9vdElubGluZUJveCwgaW5saW5lTGV2ZWxCb3gsIGJveEdlb21ldHJ5KSkgeworICAgICAg
ICAgICAgc2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50LnNldEVuYWJsZWQoZmFsc2UpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNpbXBsaWZpZWRWZXJ0aWNhbEFs
aWdubWVudC5hbGlnbihpbmxpbmVMZXZlbEJveCk7CisgICAgfTsKKworICAgIGF1dG8gY3JlYXRl
V3JhcHBlZElubGluZUJveGVzID0gWyZdIHsKKyAgICAgICAgaWYgKHJ1bnMuaXNFbXB0eSgpKQor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBBbiBpbmxpbmUgYm94IG1heSBub3QgbmVj
ZXNzYXJpbHkgc3RhcnQgb24gdGhlIGN1cnJlbnQgbGluZToKKyAgICAgICAgLy8gPHNwYW4gaWQ9
b3V0ZXI+bGluZSBicmVhazxicj50aGlzIGNvbnRlbnQncyBwYXJlbnQgaW5saW5lIGJveCgnb3V0
ZXInKSA8c3BhbiBpZD1pbm5lcj5zdGFydHMgb24gdGhlIHByZXZpb3VzIGxpbmU8L3NwYW4+PC9z
cGFuPgorICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlJ3MgYW4gTGlu
ZUJveDo6SW5saW5lTGV2ZWxCb3ggZm9yIGV2ZXJ5IGlubGluZSBib3ggdGhhdCdzIHByZXNlbnQg
b24gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgLy8gSW4gbmVzdGluZyBjYXNlIHdlIG5lZWQg
dG8gY3JlYXRlIExpbmVCb3g6OklubGluZUxldmVsQm94ZXMgZm9yIHRoZSBpbmxpbmUgYm94IGFu
Y2VzdG9ycy4KKyAgICAgICAgLy8gV2Ugb25seSBoYXZlIHRvIGRvIGl0IG9uIHRoZSBmaXJzdCBy
dW4gYXMgYW55IHN1YnNlcXVlbnQgaW5saW5lIGNvbnRlbnQgaXMgZWl0aGVyIGF0IHRoZSBzYW1l
L2hpZ2hlciBuZXN0aW5nIGxldmVsIG9yCisgICAgICAgIC8vIG5lc3RlZCB3aXRoIGEgW2lubGlu
ZSBib3ggc3RhcnRdIHJ1bi4KKyAgICAgICAgYXV0byYgZmlyc3RSdW4gPSBydW5zWzBdOworICAg
ICAgICBhdXRvJiBmaXJzdFJ1blBhcmVudExheW91dEJveCA9IGZpcnN0UnVuLmxheW91dEJveCgp
LnBhcmVudCgpOworICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGlzIHRoZSBmb3JtYXR0aW5nIHJv
b3QsIHdlIGNhbiBzdG9wIGhlcmUuIFRoaXMgaXMgcm9vdCBpbmxpbmUgYm94IGNvbnRlbnQsIHRo
ZXJlJ3Mgbm8gbmVzdGluZyBpbmxpbmUgYm94IGZyb20gdGhlIHByZXZpb3VzIGxpbmUocykKKyAg
ICAgICAgLy8gdW5sZXNzIHRoZSBpbmxpbmUgYm94IGNsb3NpbmcgaXMgZm9yY2VkIG92ZXIgdG8g
dGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgLy8gZS5nLgorICAgICAgICAvLyA8c3Bhbj5ub3Jt
YWxseSB0aGUgaW5saW5lIGJveCBjbG9zaW5nIGZvcm1zIGEgY29udGludW91cyBjb250ZW50PC9z
cGFuPgorICAgICAgICAvLyA8c3Bhbj51bmxlc3MgaXQncyBmb3JjZWQgdG8gdGhlIG5leHQgbGlu
ZTxicj48L3NwYW4+CisgICAgICAgIGF1dG8gZmlyc3RSdW5OZWVkc0lubGluZUJveCA9IGZpcnN0
UnVuLmlzSW5saW5lQm94RW5kKCk7CisgICAgICAgIGlmICghZmlyc3RSdW5OZWVkc0lubGluZUJv
eCAmJiBpc1Jvb3RMYXlvdXRCb3goZmlyc3RSdW5QYXJlbnRMYXlvdXRCb3gpKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICBWZWN0b3I8Y29uc3QgQm94Kj4gbGF5b3V0Qm94ZXNXaXRob3V0
SW5saW5lQm94ZXM7CisgICAgICAgIGlmIChmaXJzdFJ1bk5lZWRzSW5saW5lQm94KQorICAgICAg
ICAgICAgbGF5b3V0Qm94ZXNXaXRob3V0SW5saW5lQm94ZXMuYXBwZW5kKCZmaXJzdFJ1bi5sYXlv
dXRCb3goKSk7CisgICAgICAgIGF1dG8qIGFuY2VzdG9yID0gJmZpcnN0UnVuUGFyZW50TGF5b3V0
Qm94OworICAgICAgICB3aGlsZSAoIWlzUm9vdExheW91dEJveCgqYW5jZXN0b3IpKSB7CisgICAg
ICAgICAgICBsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVCb3hlcy5hcHBlbmQoYW5jZXN0b3IpOwor
ICAgICAgICAgICAgYW5jZXN0b3IgPSAmYW5jZXN0b3ItPnBhcmVudCgpOworICAgICAgICB9Cisg
ICAgICAgIC8vIENvbnN0cnVjdCB0aGUgbWlzc2luZyBMaW5lQm94OjpJbmxpbmVCb3hlcyBzdGFy
dGluZyB3aXRoIHRoZSB0b3Btb3N0IGxheW91dCBib3guCisgICAgICAgIGZvciAoYXV0byogbGF5
b3V0Qm94IDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVC
b3hlcykpIHsKKyAgICAgICAgICAgIGF1dG8gaW5saW5lQm94ID0gTGluZUJveDo6SW5saW5lTGV2
ZWxCb3g6OmNyZWF0ZUlubGluZUJveCgqbGF5b3V0Qm94LCByb290SW5saW5lQm94LmxvZ2ljYWxM
ZWZ0KCksIGxpbmVCb3guY29udGVudExvZ2ljYWxXaWR0aCgpKTsKKyAgICAgICAgICAgIHNldFZl
cnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3goaW5saW5lQm94KTsKKyAgICAgICAgICAgIHNpbXBs
aWZpZWRBbGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUoaW5saW5lQm94LCB7IH0pOworICAgICAg
ICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChXVEZNb3ZlKGlubGluZUJveCkpOworICAg
ICAgICB9CisgICAgfTsKKyAgICBjcmVhdGVXcmFwcGVkSW5saW5lQm94ZXMoKTsKKworICAgIGF1
dG8gbGluZUhhc0NvbnRlbnQgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8mIHJ1biA6IHJ1bnMpIHsK
KyAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gcnVuLmxheW91dEJveCgpOworICAgICAgICBhdXRv
IHJ1bkhhc0NvbnRlbnQgPSBbJl0gKCkgLT4gYm9vbCB7CisgICAgICAgICAgICBBU1NFUlQoIWxp
bmVIYXNDb250ZW50KTsKKyAgICAgICAgICAgIGlmIChydW4uaXNUZXh0KCkgfHwgcnVuLmlzQm94
KCkgfHwgcnVuLmlzU29mdExpbmVCcmVhaygpIHx8IHJ1bi5pc0hhcmRMaW5lQnJlYWsoKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGF1dG8mIGlubGluZUJveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwor
ICAgICAgICAgICAgLy8gRXZlbiBuZWdhdGl2ZSBob3Jpem9udGFsIG1hcmdpbiBtYWtlcyB0aGUg
bGluZSAiY29udGVudGZ1bCIuCisgICAgICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94U3RhcnQo
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5saW5lQm94R2VvbWV0cnkubWFyZ2luU3RhcnQo
KSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCkgfHwgaW5saW5lQm94R2VvbWV0cnku
cGFkZGluZ0xlZnQoKS52YWx1ZU9yKDBfbHUpOworICAgICAgICAgICAgaWYgKHJ1bi5pc0lubGlu
ZUJveEVuZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVCb3hHZW9tZXRyeS5tYXJn
aW5FbmQoKSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJSaWdodCgpIHx8IGlubGluZUJveEdl
b21ldHJ5LnBhZGRpbmdSaWdodCgpLnZhbHVlT3IoMF9sdSk7CisgICAgICAgICAgICBpZiAocnVu
LmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9OworICAgICAgICBsaW5lSGFzQ29udGVudCA9IGxpbmVIYXNDb250ZW50
IHx8IHJ1bkhhc0NvbnRlbnQoKTsKKyAgICAgICAgYXV0byBsb2dpY2FsTGVmdCA9IHJvb3RJbmxp
bmVCb3gubG9naWNhbExlZnQoKSArIHJ1bi5sb2dpY2FsTGVmdCgpOworICAgICAgICBpZiAocnVu
LmlzQm94KCkpIHsKKyAgICAgICAgICAgIGF1dG8mIGlubGluZUxldmVsQm94R2VvbWV0cnkgPSBm
b3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAgICAgICAg
ICBhdXRvIG1hcmdpbkJveEhlaWdodCA9IGlubGluZUxldmVsQm94R2VvbWV0cnkubWFyZ2luQm94
SGVpZ2h0KCk7CisgICAgICAgICAgICBhdXRvIGFzY2VudCA9IElubGluZUxheW91dFVuaXQgeyB9
OworICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlKCkuc2hvdWxkTm90U3ludGhlc2l6ZUlubGlu
ZUJsb2NrQmFzZWxpbmUoKSkgeworICAgICAgICAgICAgICAgIC8vIEludGVncmF0aW9uIGNvZGVw
YXRoIGNvbnN0cnVjdHMgcmVwbGFjZWQgYm94ZXMgZm9yIGlubGluZS1ibG9jayBjb250ZW50Lgor
ICAgICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKKyAgICAg
ICAgICAgICAgICBhc2NlbnQgPSAqZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCkuYmFz
ZWxpbmUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxvY2tC
b3goKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlbGluZSBvZiBhbiAnaW5saW5lLWJs
b2NrJyBpcyB0aGUgYmFzZWxpbmUgb2YgaXRzIGxhc3QgbGluZSBib3ggaW4gdGhlIG5vcm1hbCBm
bG93LCB1bmxlc3MgaXQgaGFzIGVpdGhlciBubyBpbi1mbG93IGxpbmUgYm94ZXMgb3IKKyAgICAg
ICAgICAgICAgICAvLyBpZiBpdHMgJ292ZXJmbG93JyBwcm9wZXJ0eSBoYXMgYSBjb21wdXRlZCB2
YWx1ZSBvdGhlciB0aGFuICd2aXNpYmxlJywgaW4gd2hpY2ggY2FzZSB0aGUgYmFzZWxpbmUgaXMg
dGhlIGJvdHRvbSBtYXJnaW4gZWRnZS4KKyAgICAgICAgICAgICAgICBhdXRvIHN5bnRoZXNpemVC
YXNlbGluZSA9ICFsYXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgp
IHx8ICFsYXlvdXRCb3guc3R5bGUoKS5pc092ZXJmbG93VmlzaWJsZSgpOworICAgICAgICAgICAg
ICAgIGlmIChzeW50aGVzaXplQmFzZWxpbmUpCisgICAgICAgICAgICAgICAgICAgIGFzY2VudCA9
IG1hcmdpbkJveEhlaWdodDsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZElu
bGluZUZvcm1hdHRpbmdTdGF0ZShkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkpOwor
ICAgICAgICAgICAgICAgICAgICBhdXRvJiBsYXN0TGluZSA9IGZvcm1hdHRpbmdTdGF0ZS5saW5l
cygpLmxhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpbmxpbmVCbG9ja0Jhc2VsaW5l
ID0gbGFzdExpbmUubGluZUJveExvZ2ljYWxSZWN0KCkudG9wKCkgKyBsYXN0TGluZS5iYXNlbGlu
ZSgpOworICAgICAgICAgICAgICAgICAgICBhc2NlbnQgPSBpbmxpbmVMZXZlbEJveEdlb21ldHJ5
Lm1hcmdpbkJlZm9yZSgpICsgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS5ib3JkZXJUb3AoKSArIGlu
bGluZUxldmVsQm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCkgKyBpbmxpbmVCbG9j
a0Jhc2VsaW5lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5
b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKKyAgICAgICAgICAgICAgICBhc2NlbnQgPSBkb3duY2Fz
dDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KS5iYXNlbGluZSgpLnZhbHVlT3IobWFyZ2luQm94SGVp
Z2h0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhc2NlbnQgPSBtYXJnaW5C
b3hIZWlnaHQ7CisgICAgICAgICAgICBsb2dpY2FsTGVmdCArPSBzdGQ6Om1heCgwX2x1LCBpbmxp
bmVMZXZlbEJveEdlb21ldHJ5Lm1hcmdpblN0YXJ0KCkpOworICAgICAgICAgICAgYXV0byBhdG9t
aWNJbmxpbmVMZXZlbEJveCA9IExpbmVCb3g6OklubGluZUxldmVsQm94OjpjcmVhdGVBdG9taWNJ
bmxpbmVMZXZlbEJveChsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCB7IGlubGluZUxldmVsQm94R2Vv
bWV0cnkuYm9yZGVyQm94V2lkdGgoKSwgbWFyZ2luQm94SGVpZ2h0IH0pOworICAgICAgICAgICAg
YXRvbWljSW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUoYXNjZW50KTsKKyAgICAgICAgICAgIGF0
b21pY0lubGluZUxldmVsQm94LnNldExheW91dEJvdW5kcyhMaW5lQm94OjpJbmxpbmVMZXZlbEJv
eDo6TGF5b3V0Qm91bmRzIHsgYXNjZW50LCBtYXJnaW5Cb3hIZWlnaHQgLSBhc2NlbnQgfSk7Cisg
ICAgICAgICAgICBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNhbGx5SWZBcHBsaWNhYmxlKGF0b21pY0lu
bGluZUxldmVsQm94LCBpbmxpbmVMZXZlbEJveEdlb21ldHJ5KTsKKyAgICAgICAgICAgIGxpbmVC
b3guYWRkSW5saW5lTGV2ZWxCb3goV1RGTW92ZShhdG9taWNJbmxpbmVMZXZlbEJveCkpOworICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bi5pc0lubGluZUJv
eFN0YXJ0KCkpIHsKKyAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgZG9uJ3Qga25vdyB5
ZXQgaG93IHdpZGUgdGhpcyBpbmxpbmUgYm94IGlzLiBMZXQncyBhc3N1bWUgaXQncyBhcyBsb25n
IGFzIHRoZSBsaW5lIGlzCisgICAgICAgICAgICAvLyBhbmQgYWRqdXN0IGl0IGxhdGVyIGlmIHdl
IGNvbWUgYWNyb3NzIGFuIGlubGluZUJveEVuZCBydW4gKHNlZSBiZWxvdykuCisgICAgICAgICAg
ICBhdXRvIGluaXRpYWxMb2dpY2FsV2lkdGggPSBsaW5lQm94LmNvbnRlbnRMb2dpY2FsV2lkdGgo
KSAtIHJ1bi5sb2dpY2FsTGVmdCgpOworICAgICAgICAgICAgQVNTRVJUKGluaXRpYWxMb2dpY2Fs
V2lkdGggPj0gMCk7CisgICAgICAgICAgICAvLyBJbmxpbmUgYm94IHJ1biBpcyBiYXNlZCBvbiBt
YXJnaW4gYm94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBib3guCisgICAgICAgICAgICBh
dXRvIG1hcmdpblN0YXJ0ID0gc3RkOjptYXgoMF9sdSwgZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9t
ZXRyeUZvckJveChsYXlvdXRCb3gpLm1hcmdpblN0YXJ0KCkpOworICAgICAgICAgICAgbG9naWNh
bExlZnQgKz0gbWFyZ2luU3RhcnQ7CisgICAgICAgICAgICBpbml0aWFsTG9naWNhbFdpZHRoIC09
IG1hcmdpblN0YXJ0OworICAgICAgICAgICAgYXV0byBpbmxpbmVCb3ggPSBMaW5lQm94OjpJbmxp
bmVMZXZlbEJveDo6Y3JlYXRlSW5saW5lQm94KGxheW91dEJveCwgbG9naWNhbExlZnQsIGluaXRp
YWxMb2dpY2FsV2lkdGgpOworICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRyeUZvcklubGlu
ZUJveChpbmxpbmVCb3gpOworICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlm
QXBwbGljYWJsZShpbmxpbmVCb3gsIHsgfSk7CisgICAgICAgICAgICBsaW5lQm94LmFkZElubGlu
ZUxldmVsQm94KFdURk1vdmUoaW5saW5lQm94KSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94RW5kKCkpIHsKKyAgICAgICAgICAg
IC8vIEFkanVzdCB0aGUgbG9naWNhbCB3aWR0aCB3aGVuIHRoZSBpbmxpbmUgYm94IGNsb3NlcyBv
biB0aGlzIGxpbmUuCisgICAgICAgICAgICBhdXRvJiBpbmxpbmVCb3ggPSBsaW5lQm94LmlubGlu
ZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7CisgICAgICAgICAgICBBU1NFUlQoaW5s
aW5lQm94LmlzSW5saW5lQm94KCkpOworICAgICAgICAgICAgLy8gSW5saW5lIGJveCBydW4gaXMg
YmFzZWQgb24gbWFyZ2luIGJveC4gTGV0J3MgY29udmVydCBpdCB0byBib3JkZXIgYm94LgorICAg
ICAgICAgICAgYXV0byBtYXJnaW5FbmQgPSBzdGQ6Om1heCgwX2x1LCBmb3JtYXR0aW5nQ29udGV4
dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCkubWFyZ2luRW5kKCkpOworICAgICAgICAgICAg
YXV0byBpbmxpbmVCb3hMb2dpY2FsUmlnaHQgPSBsb2dpY2FsTGVmdCArIHJ1bi5sb2dpY2FsV2lk
dGgoKSAtIG1hcmdpbkVuZDsKKyAgICAgICAgICAgIGlubGluZUJveC5zZXRMb2dpY2FsV2lkdGgo
aW5saW5lQm94TG9naWNhbFJpZ2h0IC0gaW5saW5lQm94LmxvZ2ljYWxMZWZ0KCkpOworICAgICAg
ICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGljYWJsZShpbmxpbmVCb3gsIHsg
fSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVuLmlz
VGV4dCgpIHx8IHJ1bi5pc1NvZnRMaW5lQnJlYWsoKSkgeworICAgICAgICAgICAgLy8gRklYTUU6
IEFkanVzdCBub24tZW1wdHkgaW5saW5lIGJveCBoZWlnaHQgd2hlbiBnbHlwaHMgZnJvbSB0aGUg
bm9uLXByaW1hcnkgZm9udCBzdHJldGNoIHRoZSBib3guCisgICAgICAgICAgICBsaW5lQm94Lmlu
bGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSkuc2V0SGFzQ29udGVu
dCgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bi5p
c0hhcmRMaW5lQnJlYWsoKSkgeworICAgICAgICAgICAgYXV0byBsaW5lQnJlYWtCb3ggPSBMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlTGluZUJyZWFrQm94KGxheW91dEJveCwgbG9naWNh
bExlZnQpOworICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRyeUZvcklubGluZUJveChsaW5l
QnJlYWtCb3gpOworICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGlj
YWJsZShsaW5lQnJlYWtCb3gsIHsgfSk7CisgICAgICAgICAgICBsaW5lQm94LmFkZElubGluZUxl
dmVsQm94KFdURk1vdmUobGluZUJyZWFrQm94KSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorICAgICAgICBpZiAocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkgeworICAg
ICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChMaW5lQm94OjpJbmxpbmVMZXZlbEJv
eDo6Y3JlYXRlR2VuZXJpY0lubGluZUxldmVsQm94KGxheW91dEJveCwgbG9naWNhbExlZnQpKTsK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOworICAgIH0KKworICAgIGxpbmVCb3guc2V0SGFzQ29udGVudChsaW5lSGFzQ29udGVu
dCk7CisgICAgaWYgKHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5pc0VuYWJsZWQoKSB8fCAh
bGluZUhhc0NvbnRlbnQpIHsKKyAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRv
IGV4ZXJjaXNlIHRoZSBmYXN0IHBhdGggd2hlbiB0aGUgbGluZSBoYXMgbm8gY29udGVudCBhdCBh
bGwsIGV2ZW4gaW4gbm9uLXN0YW5kYXJkcyBtb2RlIG9yIHdpdGggbGluZS1oZWlnaHQgc2V0Lgor
ICAgICAgICByb290SW5saW5lQm94LnNldExvZ2ljYWxUb3AobGluZUhhc0NvbnRlbnQgPyBzaW1w
bGlmaWVkVmVydGljYWxBbGlnbm1lbnQucm9vdElubGluZUJveExvZ2ljYWxUb3AoKSA6IC1yb290
SW5saW5lQm94LmJhc2VsaW5lKCkpOworICAgICAgICBsaW5lQm94LnNldExvZ2ljYWxIZWlnaHQo
bGluZUhhc0NvbnRlbnQgPyBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQubGluZUJveEhlaWdo
dCgpIDogSW5saW5lTGF5b3V0VW5pdCgpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgY29tcHV0ZUxp
bmVCb3hIZWlnaHRBbmRBbGlnbklubGluZUxldmVsQm94ZXNWZXJ0aWNhbGx5KGxpbmVCb3gpOwor
fQorCit2b2lkIExpbmVCb3hCdWlsZGVyOjpjb21wdXRlTGluZUJveEhlaWdodEFuZEFsaWduSW5s
aW5lTGV2ZWxCb3hlc1ZlcnRpY2FsbHkoTGluZUJveCYgbGluZUJveCkKK3sKKyAgICBBU1NFUlQo
bGluZUJveC5oYXNDb250ZW50KCkpOworICAgIC8vIFRoaXMgZnVuY3Rpb24gKHBhcnRpYWxseSkg
aW1wbGVtZW50czoKKyAgICAvLyAyLjIuIExheW91dCBXaXRoaW4gTGluZSBCb3hlcworICAgIC8v
IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xpbmUtbGF5b3V0CisgICAgLy8g
MS4gQ29tcHV0ZSB0aGUgbGluZSBib3ggaGVpZ2h0IHVzaW5nIHRoZSBsYXlvdXQgYm91bmRzIGdl
b21ldHJ5LiBUaGlzIGhlaWdodCBjb21wdXRhdGlvbiBzdHJpY3RseSB1c2VzIGxheW91dCBib3Vu
ZHMgYW5kIG5vdCBub3JtYWwgaW5saW5lIGxldmVsIGJveCBnZW9tZXRyaWVzLgorICAgIC8vIDIu
IENvbXB1dGUgdGhlIGJhc2VsaW5lL2xvZ2ljYWwgdG9wIHBvc2l0aW9uIG9mIHRoZSByb290IGlu
bGluZSBib3guIEFsaWduZWQgYm94ZXMgcHVzaCB0aGUgcm9vdCBpbmxpbmUgYm94IGFyb3VuZCBp
bnNpZGUgdGhlIGxpbmUgYm94LgorICAgIC8vIDMuIEZpbmFsbHkgYWxpZ24gdGhlIGlubGluZSBs
ZXZlbCBib3hlcyB1c2luZyAobW9zdGx5KSBub3JtYWwgaW5saW5lIGxldmVsIGJveCBnZW9tZXRy
aWVzLgorICAgIGF1dG8gcXVpcmtzID0gZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKTsKKyAg
ICBhdXRvJiByb290SW5saW5lQm94ID0gbGluZUJveC5yb290SW5saW5lQm94KCk7CisKKyAgICBh
dXRvIGNvbXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCA9IFsmXSB7CisgICAgICAgIC8vIExpbmUg
Ym94IGhlaWdodCBjb21wdXRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgbGF5b3V0IGJvdW5kcyBvZiB0
aGUgaW5saW5lIGJveGVzIGFuZCBub3QgdGhlaXIgbG9naWNhbCAoYXNjZW50L2Rlc2NlbnQpIGRp
bWVuc2lvbnMuCisgICAgICAgIHN0cnVjdCBBYnNvbHV0ZVRvcEFuZEJvdHRvbSB7CisgICAgICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IHRvcCB7IDAgfTsKKyAgICAgICAgICAgIElubGluZUxheW91
dFVuaXQgYm90dG9tIHsgMCB9OworICAgICAgICB9OworICAgICAgICBIYXNoTWFwPGNvbnN0IExp
bmVCb3g6OklubGluZUxldmVsQm94KiwgQWJzb2x1dGVUb3BBbmRCb3R0b20+IGlubGluZUxldmVs
Qm94QWJzb2x1dGVUb3BBbmRCb3R0b21NYXA7CisKKyAgICAgICAgYXV0byBtaW5pbXVtTG9naWNh
bFRvcCA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKKyAgICAgICAgYXV0byBtYXhp
bXVtTG9naWNhbEJvdHRvbSA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKKyAgICAg
ICAgaWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KHJvb3RJbmxpbmVCb3gs
IGxpbmVCb3gpKSB7CisgICAgICAgICAgICBtaW5pbXVtTG9naWNhbFRvcCA9IElubGluZUxheW91
dFVuaXQgeyB9OworICAgICAgICAgICAgbWF4aW11bUxvZ2ljYWxCb3R0b20gPSByb290SW5saW5l
Qm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpOworICAgICAgICAgICAgaW5saW5lTGV2ZWxCb3hB
YnNvbHV0ZVRvcEFuZEJvdHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVCb3gsIEFic29sdXRlVG9wQW5k
Qm90dG9tIHsgKm1pbmltdW1Mb2dpY2FsVG9wLCAqbWF4aW11bUxvZ2ljYWxCb3R0b20gfSk7Cisg
ICAgICAgIH0gZWxzZQorICAgICAgICAgICAgaW5saW5lTGV2ZWxCb3hBYnNvbHV0ZVRvcEFuZEJv
dHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVCb3gsIEFic29sdXRlVG9wQW5kQm90dG9tIHsgfSk7CisK
KyAgICAgICAgVmVjdG9yPExpbmVCb3g6OklubGluZUxldmVsQm94Kj4gbGluZUJveFJlbGF0aXZl
SW5saW5lTGV2ZWxCb3hlczsKKyAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxp
bmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgeworICAgICAgICAgICAgYXV0byYgbGF5
b3V0Qm94ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7CisgICAgICAgICAgICBpZiAoaW5s
aW5lTGV2ZWxCb3guaGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpIHsKKyAgICAgICAgICAg
ICAgICBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveGVzLmFwcGVuZCgmaW5saW5lTGV2ZWxC
b3gpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgYXV0byYgcGFyZW50SW5saW5lQm94ID0gbGluZUJveC5pbmxpbmVMZXZlbEJveEZvckxheW91
dEJveChsYXlvdXRCb3gucGFyZW50KCkpOworICAgICAgICAgICAgLy8gTG9naWNhbCB0b3AgaXMg
cmVsYXRpdmUgdG8gdGhlIHBhcmVudCBpbmxpbmUgYm94J3MgbGF5b3V0IGJvdW5kcy4KKyAgICAg
ICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGxvZ2ljYWwgdG9wIGlzIG5vdCB0aGUgZmluYWwgbG9n
aWNhbCB0b3Agb2YgdGhlIGlubGluZSBsZXZlbCBib3guCisgICAgICAgICAgICAvLyBUaGlzIGlz
IHRoZSBsb2dpY2FsIHRvcCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbGF5b3V0IGJvdW5kcyBnZW9t
ZXRyeSB3aGljaCBtYXkgYmUgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgaW5saW5lIGJveCdzIG5v
cm1hbCBnZW9tZXRyeS4KKyAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcCA9IElubGluZUxheW91
dFVuaXQgeyB9OworICAgICAgICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFs
aWduKCkpIHsKKyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmU6IHsKKyAg
ICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBp
bmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAgICAgICAgICAgICAgbG9n
aWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBsb2dpY2Fs
VG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6IHsKKyAg
ICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBp
bmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSAvIDIgKyBwYXJlbnRJbmxpbmVC
b3guc3R5bGUoKS5mb250TWV0cmljcygpLnhIZWlnaHQoKSAvIDI7CisgICAgICAgICAgICAgICAg
bG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBsb2dp
Y2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZU1p
ZGRsZTogeworICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRC
YXNlbGluZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpIC8gMjsKKyAg
ICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5kcygp
LmFzY2VudCAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246Okxlbmd0aDogeworICAgICAgICAgICAgICAgIGF1dG8mIHN0eWxlID0gaW5saW5lTGV2ZWxC
b3guc3R5bGUoKTsKKyAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFy
ZW50QmFzZWxpbmUgPSBmbG9hdFZhbHVlRm9yTGVuZ3RoKHN0eWxlLnZlcnRpY2FsQWxpZ25MZW5n
dGgoKSwgc3R5bGUuY29tcHV0ZWRMaW5lSGVpZ2h0KCkpICsgaW5saW5lTGV2ZWxCb3gubGF5b3V0
Qm91bmRzKCkuYXNjZW50OworICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxp
bmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRC
YXNlbGluZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VGV4dFRvcDogeworICAgICAgICAgICAgICAgIC8vIE5v
dGUgdGhhdCB0ZXh0LXRvcCBhbGlnbnMgd2l0aCB0aGUgaW5saW5lIGJveCdzIGZvbnQgbWV0cmlj
cyB0b3AgKGFzY2VudCkgYW5kIG5vdCB0aGUgbGF5b3V0IGJvdW5kcyB0b3AuCisgICAgICAgICAg
ICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQg
LSBwYXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VGV4dEJvdHRvbTog
eworICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0ZXh0LWJvdHRvbSBhbGlnbnMgd2l0aCB0
aGUgaW5saW5lIGJveCdzIGZvbnQgbWV0cmljcyBib3R0b20gKGRlc2NlbnQpIGFuZCBub3QgdGhl
IGxheW91dCBib3VuZHMgYm90dG9tLgorICAgICAgICAgICAgICAgIGF1dG8gcGFyZW50SW5saW5l
Qm94TGF5b3V0Qm91bmRzID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5kcygpOworICAgICAg
ICAgICAgICAgIGF1dG8gcGFyZW50SW5saW5lQm94TG9naWNhbEJvdHRvbSA9IHBhcmVudElubGlu
ZUJveExheW91dEJvdW5kcy5oZWlnaHQoKSAtIHBhcmVudElubGluZUJveExheW91dEJvdW5kcy5k
ZXNjZW50ICsgcGFyZW50SW5saW5lQm94LmRlc2NlbnQoKS52YWx1ZU9yKElubGluZUxheW91dFVu
aXQoKSk7CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveExvZ2lj
YWxCb3R0b20gLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKTsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gcGFyZW50SW5saW5l
Qm94QWJzb2x1dGVUb3BBbmRCb3R0b20gPSBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9wQW5kQm90
dG9tTWFwLmdldCgmcGFyZW50SW5saW5lQm94KTsKKyAgICAgICAgICAgIGF1dG8gYWJzb2x1dGVM
b2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94QWJzb2x1dGVUb3BBbmRCb3R0b20udG9wICsgbG9n
aWNhbFRvcDsKKyAgICAgICAgICAgIGF1dG8gYWJzb2x1dGVMb2dpY2FsQm90dG9tID0gYWJzb2x1
dGVMb2dpY2FsVG9wICsgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCk7Cisg
ICAgICAgICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9wQW5kQm90dG9tTWFwLmFkZCgmaW5s
aW5lTGV2ZWxCb3gsIEFic29sdXRlVG9wQW5kQm90dG9tIHsgYWJzb2x1dGVMb2dpY2FsVG9wLCBh
YnNvbHV0ZUxvZ2ljYWxCb3R0b20gfSk7CisgICAgICAgICAgICAvLyBTdHJldGNoIHRoZSBtaW4v
bWF4IGFic29sdXRlIHZhbHVlcyBpZiBhcHBsaWNhYmxlLgorICAgICAgICAgICAgaWYgKHF1aXJr
cy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGlubGluZUxldmVsQm94LCBsaW5lQm94KSkg
eworICAgICAgICAgICAgICAgIG1pbmltdW1Mb2dpY2FsVG9wID0gc3RkOjptaW4obWluaW11bUxv
Z2ljYWxUb3AudmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxUb3ApLCBhYnNvbHV0ZUxvZ2ljYWxUb3Ap
OworICAgICAgICAgICAgICAgIG1heGltdW1Mb2dpY2FsQm90dG9tID0gc3RkOjptYXgobWF4aW11
bUxvZ2ljYWxCb3R0b20udmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxCb3R0b20pLCBhYnNvbHV0ZUxv
Z2ljYWxCb3R0b20pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRoZSBs
aW5lIGJveCBoZWlnaHQgY29tcHV0YXRpb24gaXMgYXMgZm9sbG93czoKKyAgICAgICAgLy8gMS4g
U3RyZXRjaCB0aGUgbGluZSBib3ggd2l0aCB0aGUgbm9uLWxpbmUtYm94IHJlbGF0aXZlIGFsaWdu
ZWQgaW5saW5lIGJveCBhYnNvbHV0ZSB0b3AgYW5kIGJvdHRvbSB2YWx1ZXMuCisgICAgICAgIC8v
IDIuIENoZWNrIGlmIHRoZSBsaW5lIGJveCByZWxhdGl2ZSBhbGlnbmVkIGlubGluZSBib3hlcyAo
dG9wLCBib3R0b20gZXRjKSBoYXZlIGVub3VnaCByb29tIGFuZCBzdHJldGNoIHRoZSBsaW5lIGJv
eCBmdXJ0aGVyIGlmIG5lZWRlZC4KKyAgICAgICAgYXV0byBsaW5lQm94TG9naWNhbEhlaWdodCA9
IG1heGltdW1Mb2dpY2FsQm90dG9tLnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCgpKSAtIG1pbmlt
dW1Mb2dpY2FsVG9wLnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCgpKTsKKyAgICAgICAgZm9yIChh
dXRvKiBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveCA6IGxpbmVCb3hSZWxhdGl2ZUlubGlu
ZUxldmVsQm94ZXMpIHsKKyAgICAgICAgICAgIGlmICghcXVpcmtzLmlubGluZUxldmVsQm94QWZm
ZWN0c0xpbmVCb3goKmxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94LCBsaW5lQm94KSkKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGxpbmVCb3hMb2dpY2FsSGVpZ2h0
ID0gc3RkOjptYXgobGluZUJveExvZ2ljYWxIZWlnaHQsIGxpbmVCb3hSZWxhdGl2ZUlubGluZUxl
dmVsQm94LT5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgbGlu
ZUJveC5zZXRMb2dpY2FsSGVpZ2h0KGxpbmVCb3hMb2dpY2FsSGVpZ2h0KTsKKyAgICB9OworICAg
IGNvbXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCgpOworCisgICAgYXV0byBjb21wdXRlUm9vdElu
bGluZUJveFZlcnRpY2FsUG9zaXRpb24gPSBbJl0geworICAgICAgICBIYXNoTWFwPGNvbnN0IExp
bmVCb3g6OklubGluZUxldmVsQm94KiwgSW5saW5lTGF5b3V0VW5pdD4gaW5saW5lTGV2ZWxCb3hB
YnNvbHV0ZUJhc2VsaW5lT2Zmc2V0TWFwOworICAgICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRl
QmFzZWxpbmVPZmZzZXRNYXAuYWRkKCZyb290SW5saW5lQm94LCBJbmxpbmVMYXlvdXRVbml0IHsg
fSk7CisKKyAgICAgICAgYXV0byBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNl
bGluZSA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKKyAgICAgICAgaWYgKHF1aXJr
cy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KHJvb3RJbmxpbmVCb3gsIGxpbmVCb3gpKQor
ICAgICAgICAgICAgbWF4aW11bVRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxpbmUgPSBy
b290SW5saW5lQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKKworICAgICAgICBmb3IgKGF1dG8m
IGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hlcygpKSB7Cisg
ICAgICAgICAgICBhdXRvIGFic29sdXRlQmFzZWxpbmVPZmZzZXQgPSBJbmxpbmVMYXlvdXRVbml0
IHsgfTsKKyAgICAgICAgICAgIGlmICghaW5saW5lTGV2ZWxCb3guaGFzTGluZUJveFJlbGF0aXZl
QWxpZ25tZW50KCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBpbmxpbmVM
ZXZlbEJveC5sYXlvdXRCb3goKTsKKyAgICAgICAgICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVC
b3ggPSBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQo
KSk7CisgICAgICAgICAgICAgICAgYXV0byBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGlu
ZSA9IElubGluZUxheW91dFVuaXQgeyB9OworCisgICAgICAgICAgICAgICAgc3dpdGNoIChpbmxp
bmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnRp
Y2FsQWxpZ246OkJhc2VsaW5lOgorICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldEZy
b21QYXJlbnRCYXNlbGluZSA9IHsgfTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6IHsKKyAgICAgICAgICAgICAg
ICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gKGlubGluZUxl
dmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpIC8gMiArIHBhcmVudElubGluZUJveC5zdHls
ZSgpLmZvbnRNZXRyaWNzKCkueEhlaWdodCgpIC8gMik7CisgICAgICAgICAgICAgICAgICAgIGJh
c2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJl
bnRCYXNlbGluZSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKKyAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmVNaWRkbGU6IHsKKyAgICAgICAgICAgICAgICAg
ICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gaW5saW5lTGV2ZWxC
b3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCkgLyAyOworICAgICAgICAgICAgICAgICAgICBiYXNl
bGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50
QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBj
YXNlIFZlcnRpY2FsQWxpZ246Okxlbmd0aDogeworICAgICAgICAgICAgICAgICAgICBhdXRvJiBz
dHlsZSA9IGlubGluZUxldmVsQm94LnN0eWxlKCk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8g
dmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5ndGgoc3R5bGUudmVydGljYWxB
bGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKSk7CisgICAgICAgICAgICAg
ICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHZlcnRpY2Fs
QWxpZ25PZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOworICAgICAgICAgICAgICAg
ICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxUb3BPZmZzZXRG
cm9tUGFyZW50QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOworICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2Fz
ZSBWZXJ0aWNhbEFsaWduOjpUZXh0VG9wOgorICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9m
ZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OworICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRCb3R0b206Cisg
ICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtICpwYXJlbnRJbmxpbmVCb3guZGVz
Y2VudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZh
dWx0OgorICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOwor
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgYWJzb2x1dGVCYXNlbGluZU9mZnNldCA9IGlubGluZUxldmVsQm94QWJzb2x1dGVCYXNl
bGluZU9mZnNldE1hcC5nZXQoJnBhcmVudElubGluZUJveCkgKyBiYXNlbGluZU9mZnNldEZyb21Q
YXJlbnRCYXNlbGluZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dp
dGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKKyAgICAgICAgICAgICAgICBj
YXNlIFZlcnRpY2FsQWxpZ246OlRvcDogeworICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUJh
c2VsaW5lT2Zmc2V0ID0gcm9vdElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBpbmxp
bmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246OkJvdHRvbTogeworICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0
ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtIHJvb3RJbmxpbmVCb3gu
bGF5b3V0Qm91bmRzKCkuZGVzY2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAg
ICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7CisgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlubGlu
ZUxldmVsQm94QWJzb2x1dGVCYXNlbGluZU9mZnNldE1hcC5hZGQoJmlubGluZUxldmVsQm94LCBh
YnNvbHV0ZUJhc2VsaW5lT2Zmc2V0KTsKKyAgICAgICAgICAgIGF1dG8gYWZmZWN0c1Jvb3RJbmxp
bmVCb3hWZXJ0aWNhbFBvc2l0aW9uID0gcXVpcmtzLmlubGluZUxldmVsQm94QWZmZWN0c0xpbmVC
b3goaW5saW5lTGV2ZWxCb3gsIGxpbmVCb3gpOworICAgICAgICAgICAgaWYgKGFmZmVjdHNSb290
SW5saW5lQm94VmVydGljYWxQb3NpdGlvbikgeworICAgICAgICAgICAgICAgIGF1dG8gdG9wT2Zm
c2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IGFic29sdXRlQmFzZWxpbmVPZmZzZXQgKyBp
bmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAgICAgICAgICAgICAgaWYg
KG1heGltdW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2VsaW5lKQorICAgICAgICAgICAg
ICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IHN0ZDo6
bWF4KCptYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSwgdG9wT2Zmc2V0
RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSk7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAg
ICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpcyBxdWlyayBtb2RlIGFuZCB0aGUgcm9vdCBpbmxp
bmUgYm94IGhhcyBubyBjb250ZW50LiBUaGUgcm9vdCBpbmxpbmUgYm94J3MgYmFzZWxpbmUgaXMg
YW5jaG9yZWQgYXQgMC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBuZWdhdGl2ZSBh
c2NlbnQgKGUuZyBuZWdhdGl2ZSB0b3AgbWFyZ2luKSBjYW4gInB1c2giIHRoZSByb290IGlubGlu
ZSBib3ggdXB3YXJkcyBhbmQgaGF2ZSBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAgICAgICAgICAg
ICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IGlubGluZUxl
dmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudCA+PSAwCisgICAgICAgICAgICAgICAgICAgICAg
ICA/IHN0ZDo6bWF4KDAuMGYsIHRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxpbmUpCisg
ICAgICAgICAgICAgICAgICAgICAgICA6IHRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxp
bmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IGF1dG8gcm9vdElubGluZUJveExvZ2ljYWxUb3AgPSBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJ
bmxpbmVCb3hCYXNlbGluZS52YWx1ZU9yKDAuZikgLSByb290SW5saW5lQm94LmJhc2VsaW5lKCk7
CisgICAgICAgIHJvb3RJbmxpbmVCb3guc2V0TG9naWNhbFRvcChyb290SW5saW5lQm94TG9naWNh
bFRvcCk7CisgICAgfTsKKyAgICBjb21wdXRlUm9vdElubGluZUJveFZlcnRpY2FsUG9zaXRpb24o
KTsKKworICAgIGF1dG8gYWxpZ25JbmxpbmVMZXZlbEJveGVzID0gWyZdIHsKKyAgICAgICAgZm9y
IChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMo
KSkgeworICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0
Qm94KCk7CisgICAgICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVCb3ggPSBsaW5lQm94LmlubGlu
ZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSk7CisgICAgICAgICAgICBh
dXRvIGxvZ2ljYWxUb3AgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKKyAgICAgICAgICAgIHN3aXRj
aCAoaW5saW5lTGV2ZWxCb3gudmVydGljYWxBbGlnbigpKSB7CisgICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246OkJhc2VsaW5lOgorICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJl
bnRJbmxpbmVCb3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Ok1pZGRs
ZTogeworICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNl
bGluZSA9IChpbmxpbmVMZXZlbEJveC5sb2dpY2FsSGVpZ2h0KCkgLyAyICsgcGFyZW50SW5saW5l
Qm94LnN0eWxlKCkuZm9udE1ldHJpY3MoKS54SGVpZ2h0KCkgLyAyKTsKKyAgICAgICAgICAgICAg
ICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmJhc2VsaW5lKCkgLSBsb2dpY2FsVG9wT2Zm
c2V0RnJvbVBhcmVudEJhc2VsaW5lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZU1pZGRsZTogewor
ICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9
IGlubGluZUxldmVsQm94LmxvZ2ljYWxIZWlnaHQoKSAvIDI7CisgICAgICAgICAgICAgICAgbG9n
aWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6TGVuZ3RoOiB7CisgICAgICAgICAgICAg
ICAgYXV0byYgc3R5bGUgPSBpbmxpbmVMZXZlbEJveC5zdHlsZSgpOworICAgICAgICAgICAgICAg
IGF1dG8gdmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5ndGgoc3R5bGUudmVy
dGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKSk7CisgICAgICAg
ICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gdmVydGlj
YWxBbGlnbk9mZnNldCArIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7CisgICAgICAgICAgICAg
ICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gbG9naWNhbFRvcE9m
ZnNldEZyb21QYXJlbnRCYXNlbGluZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCAodGV4dCl0b3AvYm90dG9tIGFsaWduIHRo
ZWlyIGxheW91dCBib3VuZHMuCisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRU
b3A6CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94LmxheW91dEJv
dW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRCb3R0b206Cisg
ICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sb2dpY2FsSGVpZ2h0
KCkgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5kZXNjZW50IC0gaW5saW5lTGV2ZWxC
b3guYmFzZWxpbmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ug
VmVydGljYWxBbGlnbjo6VG9wOgorICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGxv
Z2ljYWwgdG9wIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGlubGluZSBib3guCisgICAg
ICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFz
Y2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJvdHRvbToKKyAgICAgICAgICAgICAg
ICAvLyBOb3RlIHRoYXQgdGhpcyBsb2dpY2FsIHRvcCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHBh
cmVudCBpbmxpbmUgYm94LgorICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBsaW5lQm94Lmxv
Z2ljYWxIZWlnaHQoKSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmRlc2NlbnQgLSBp
bmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lF
VCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
aW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChsb2dpY2FsVG9wKTsKKyAgICAgICAgfQorICAg
IH07CisgICAgYWxpZ25JbmxpbmVMZXZlbEJveGVzKCk7Cit9CisKK0xpbmVCb3hCdWlsZGVyOjpT
aW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OlNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudChj
b25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgcm9vdElubGluZUJveCkKKyAgICA6IG1fcm9v
dElubGluZUJveChyb290SW5saW5lQm94KQoreworICAgIGFkanVzdChyb290SW5saW5lQm94KTsK
K30KKworYm9vbCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50Ojpj
YW5Vc2VTaW1wbGlmaWVkQWxpZ25tZW50KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiBy
b290SW5saW5lQm94LCBjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxC
b3gsIE9wdGlvbmFsPGNvbnN0IEJveEdlb21ldHJ5PiBpbmxpbmVMZXZlbEJveEdlb21ldHJ5KQor
eworICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0F0b21pY0lubGluZUxldmVsQm94KCkpIHsKKyAg
ICAgICAgQVNTRVJUKGlubGluZUxldmVsQm94R2VvbWV0cnkpOworICAgICAgICAvLyBCYXNlbGlu
ZSBhbGlnbmVkLCBub24tc3RyZXRjaHkgZGlyZWN0IGNoaWxkcmVuIGFyZSBjb25zaWRlcmVkIHRv
IGJlIHNpbXBsZSBmb3Igbm93LgorICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBpbmxpbmVMZXZl
bEJveC5sYXlvdXRCb3goKTsKKyAgICAgICAgcmV0dXJuICZsYXlvdXRCb3gucGFyZW50KCkgPT0g
JnJvb3RJbmxpbmVCb3gubGF5b3V0Qm94KCkKKyAgICAgICAgICAgICYmIGxheW91dEJveC5zdHls
ZSgpLnZlcnRpY2FsQWxpZ24oKSA9PSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZQorICAgICAgICAg
ICAgJiYgIWlubGluZUxldmVsQm94R2VvbWV0cnktPm1hcmdpbkJlZm9yZSgpCisgICAgICAgICAg
ICAmJiAhaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQWZ0ZXIoKQorICAgICAgICAgICAg
JiYgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQm94SGVpZ2h0KCkgPD0gcm9vdElubGlu
ZUJveC5iYXNlbGluZSgpOworICAgIH0KKyAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNMaW5lQnJl
YWtCb3goKSkgeworICAgICAgICAvLyBCYXNlbGluZSBhbGlnbmVkLCBub24tc3RyZXRjaHkgbGlu
ZSBicmVha3MgZS5nLiA8ZGl2PjxzcGFuPjxicj48L3NwYW4+PC9kaXY+IGJ1dCBub3QgPGRpdj48
c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMDBweDsiPjxicj48L3NwYW4+PC9kaXY+LgorICAgICAg
ICByZXR1cm4gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5bGUoKS52ZXJ0aWNhbEFsaWdu
KCkgPT0gVmVydGljYWxBbGlnbjo6QmFzZWxpbmUgJiYgaW5saW5lTGV2ZWxCb3guYmFzZWxpbmUo
KSA8PSByb290SW5saW5lQm94LmJhc2VsaW5lKCk7CisgICAgfQorICAgIGlmIChpbmxpbmVMZXZl
bEJveC5pc0lubGluZUJveCgpKSB7CisgICAgICAgIC8vIEJhc2VsaW5lIGFsaWduZWQsIG5vbi1z
dHJldGNoeSBpbmxpbmUgYm94ZXMgZS5nLiA8ZGl2PjxzcGFuPjwvc3Bhbj48L2Rpdj4gYnV0IG5v
dCA8ZGl2PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwMHB4OyI+PC9zcGFuPjwvZGl2Pi4KKyAg
ICAgICAgcmV0dXJuIGlubGluZUxldmVsQm94LmxheW91dEJveCgpLnN0eWxlKCkudmVydGljYWxB
bGlnbigpID09IFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lICYmIGlubGluZUxldmVsQm94LmxheW91
dEJvdW5kcygpID09IHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCk7CisgICAgfQorICAgIHJl
dHVybiBmYWxzZTsKK30KKwordm9pZCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmllZFZlcnRpY2Fs
QWxpZ25tZW50OjphbGlnbihMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3gp
Cit7CisgICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSB8fCBp
bmxpbmVMZXZlbEJveC5pc0xpbmVCcmVha0JveCgpIHx8IGlubGluZUxldmVsQm94LmlzSW5saW5l
Qm94KCkpIHsKKyAgICAgICAgLy8gT25seSBiYXNlbGluZSBhbGlnbm1lbnQgZm9yIG5vdy4KKyAg
ICAgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChtX3Jvb3RJbmxpbmVCb3guYmFzZWxp
bmUoKSAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCkpOworICAgICAgICBhZGp1c3QoaW5saW5l
TGV2ZWxCb3gpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT1RfSU1QTEVN
RU5URURfWUVUKCk7Cit9CisKK3ZvaWQgTGluZUJveEJ1aWxkZXI6OlNpbXBsaWZpZWRWZXJ0aWNh
bEFsaWdubWVudDo6YWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiBpbmxpbmVM
ZXZlbEJveCkKK3sKKyAgICBhdXRvIGxheW91dEJvdW5kc0xvZ2ljYWxUb3AgPSBtX3Jvb3RJbmxp
bmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRz
KCkuYXNjZW50OworICAgIG1fbGluZUJveExvZ2ljYWxUb3AgPSBzdGQ6Om1pbihtX2xpbmVCb3hM
b2dpY2FsVG9wLCBsYXlvdXRCb3VuZHNMb2dpY2FsVG9wKTsKKyAgICBtX2xpbmVCb3hMb2dpY2Fs
Qm90dG9tID0gc3RkOjptYXgobV9saW5lQm94TG9naWNhbEJvdHRvbSwgbGF5b3V0Qm91bmRzTG9n
aWNhbFRvcCArIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpKTsKKyAgICBt
X3Jvb3RJbmxpbmVCb3hMb2dpY2FsVG9wID0gc3RkOjptYXgobV9yb290SW5saW5lQm94TG9naWNh
bFRvcCwgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbV9yb290SW5saW5l
Qm94LmJhc2VsaW5lKCkpOworfQorCitMaW5lQm94IElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpH
ZW9tZXRyeTo6bGluZUJveEZvckxpbmVDb250ZW50KGNvbnN0IExpbmVCdWlsZGVyOjpMaW5lQ29u
dGVudCYgbGluZUNvbnRlbnQpCit7CisgICAgcmV0dXJuIExpbmVCb3hCdWlsZGVyKGZvcm1hdHRp
bmdDb250ZXh0KCkpLmJ1aWxkKGxpbmVDb250ZW50KTsKK30KKworSW5saW5lTGF5b3V0VW5pdCBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmxvZ2ljYWxUb3BGb3JOZXh0TGluZShj
b25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250ZW50LCBJbmxpbmVMYXlvdXRV
bml0IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIGNvbnN0IEZsb2F0aW5nQ29udGV4dCYgZmxv
YXRpbmdDb250ZXh0KSBjb25zdAoreworICAgIC8vIE5vcm1hbGx5IHRoZSBuZXh0IGxpbmUncyBs
b2dpY2FsIHRvcCBpcyB0aGUgcHJldmlvdXMgbGluZSdzIGxvZ2ljYWwgYm90dG9tLCBidXQgd2hl
biB0aGUgbGluZSBlbmRzCisgICAgLy8gd2l0aCB0aGUgY2xlYXIgcHJvcGVydHkgc2V0LCB0aGUg
bmV4dCBsaW5lIG5lZWRzIHRvIGNsZWFyIHRoZSBleGlzdGluZyBmbG9hdHMuCisgICAgaWYgKGxp
bmVDb250ZW50LnJ1bnMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gcHJldmlvdXNMaW5lTG9n
aWNhbEJvdHRvbTsKKyAgICBhdXRvJiBsYXN0UnVuTGF5b3V0Qm94ID0gbGluZUNvbnRlbnQucnVu
cy5sYXN0KCkubGF5b3V0Qm94KCk7IAorICAgIGlmIChsYXN0UnVuTGF5b3V0Qm94LnN0eWxlKCku
Y2xlYXIoKSA9PSBDbGVhcjo6Tm9uZSkKKyAgICAgICAgcmV0dXJuIHByZXZpb3VzTGluZUxvZ2lj
YWxCb3R0b207CisgICAgYXV0byBwb3NpdGlvbldpdGhDbGVhcmFuY2UgPSBmbG9hdGluZ0NvbnRl
eHQudmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UobGFzdFJ1bkxheW91dEJveCk7CisgICAg
aWYgKCFwb3NpdGlvbldpdGhDbGVhcmFuY2UpCisgICAgICAgIHJldHVybiBwcmV2aW91c0xpbmVM
b2dpY2FsQm90dG9tOworICAgIHJldHVybiBzdGQ6Om1heChwcmV2aW91c0xpbmVMb2dpY2FsQm90
dG9tLCBJbmxpbmVMYXlvdXRVbml0KHBvc2l0aW9uV2l0aENsZWFyYW5jZS0+cG9zaXRpb24pKTsK
K30KKworQ29udGVudFdpZHRoQW5kTWFyZ2luIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeTo6aW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiBmb3JtYXR0
aW5nQ29udGV4dFJvb3QsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhv
cml6b250YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGZvcm1hdHRpbmdDb250ZXh0Um9vdC5pc0lu
RmxvdygpKTsKKworICAgIC8vIDEwLjMuMTAgJ0lubGluZS1ibG9jaycsIHJlcGxhY2VkIGVsZW1l
bnRzIGluIG5vcm1hbCBmbG93CisKKyAgICAvLyBFeGFjdGx5IGFzIGlubGluZSByZXBsYWNlZCBl
bGVtZW50cy4KKyAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHRSb290LmlzUmVwbGFjZWRCb3goKSkK
KyAgICAgICAgcmV0dXJuIGlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGRvd25j
YXN0PFJlcGxhY2VkQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3QpLCBob3Jpem9udGFsQ29uc3Ry
YWludHMsIHsgfSwgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOworCisgICAgLy8gMTAuMy45
ICdJbmxpbmUtYmxvY2snLCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cKKwor
ICAgIC8vIElmICd3aWR0aCcgaXMgJ2F1dG8nLCB0aGUgdXNlZCB2YWx1ZSBpcyB0aGUgc2hyaW5r
LXRvLWZpdCB3aWR0aCBhcyBmb3IgZmxvYXRpbmcgZWxlbWVudHMuCisgICAgLy8gQSBjb21wdXRl
ZCB2YWx1ZSBvZiAnYXV0bycgZm9yICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgYmVj
b21lcyBhIHVzZWQgdmFsdWUgb2YgJzAnLgorICAgIC8vICMxCisgICAgYXV0byB3aWR0aCA9IGNv
bXB1dGVkVmFsdWUoZm9ybWF0dGluZ0NvbnRleHRSb290LnN0eWxlKCkubG9naWNhbFdpZHRoKCks
IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOworICAgIGlmICghd2lkdGgpCisg
ICAgICAgIHdpZHRoID0gc2hyaW5rVG9GaXRXaWR0aChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGhv
cml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOworCisgICAgLy8gIzIKKyAgICBhdXRv
IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6b250YWxN
YXJnaW4oZm9ybWF0dGluZ0NvbnRleHRSb290LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworCisg
ICAgcmV0dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7ICp3aWR0aCwgeyBjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwX2x1KSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LmVuZC52YWx1ZU9yKDBfbHUpIH0gfTsKK30KKworQ29udGVudEhlaWdodEFuZE1hcmdpbiBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmlubGluZUJsb2NrQ29udGVudEhlaWdodEFu
ZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYg
b3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3gu
aXNJbkZsb3coKSk7CisKKyAgICAvLyAxMC42LjIgSW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLCBi
bG9jay1sZXZlbCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdywgJ2lubGluZS1ibG9j
aycgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZsb2F0aW5nIHJlcGxhY2Vk
IGVsZW1lbnRzCisgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCisgICAgICAgIHJl
dHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFj
ZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBvdmVycmlkZGVu
VmVydGljYWxWYWx1ZXMpOworCisgICAgLy8gMTAuNi42IENvbXBsaWNhdGVkIGNhc2VzCisgICAg
Ly8gLSAnSW5saW5lLWJsb2NrJywgbm9uLXJlcGxhY2VkIGVsZW1lbnRzLgorICAgIHJldHVybiBj
b21wbGljYXRlZENhc2VzKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlk
ZGVuVmVydGljYWxWYWx1ZXMpOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4
dFF1aXJrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTFiZTY1ZGFkNWNjNWY1NmIyOWViMDcwM2U2Y2RjOTQz
OTBhYzJhNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dFF1aXJr
cy5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycK
KyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisg
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0lubGluZUxheW91
dFVuaXQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6aW5pdGlhbExpbmVIZWlnaHQo
KSBjb25zdAoreworICAgIC8vIE5lZ2F0aXZlIGxpbmVIZWlnaHQgdmFsdWUgbWVhbnMgdGhlIGxp
bmUtaGVpZ2h0IGlzIG5vdCBzZXQKKyAgICBhdXRvJiByb290ID0gZm9ybWF0dGluZ0NvbnRleHQo
KS5yb290KCk7CisgICAgaWYgKGxheW91dFN0YXRlKCkuaW5TdGFuZGFyZHNNb2RlKCkgfHwgIXJv
b3Quc3R5bGUoKS5saW5lSGVpZ2h0KCkuaXNOZWdhdGl2ZSgpKQorICAgICAgICByZXR1cm4gcm9v
dC5zdHlsZSgpLmNvbXB1dGVkTGluZUhlaWdodCgpOworICAgIHJldHVybiByb290LnN0eWxlKCku
Zm9udE1ldHJpY3MoKS5mbG9hdEhlaWdodCgpOworfQorCitib29sIElubGluZUZvcm1hdHRpbmdD
b250ZXh0OjpRdWlya3M6OmlubGluZUxldmVsQm94QWZmZWN0c0xpbmVCb3goY29uc3QgTGluZUJv
eDo6SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94LCBjb25zdCBMaW5lQm94JiBsaW5lQm94
KSBjb25zdAoreworICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0xpbmVCcmVha0JveCgpKSB7Cisg
ICAgICAgIGlmIChsYXlvdXRTdGF0ZSgpLmluU3RhbmRhcmRzTW9kZSgpKQorICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIC8vIEluIHF1aXJrcyBtb2RlIGxpbmVicmVhayBib3hlcyAo
PGJyPikgc3RvcCBhZmZlY3RpbmcgdGhlIGxpbmUgYm94IHdoZW4gKGFzc3VtZSA8YnI+IGlzIG5l
c3RlZCBlLmcuIDxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwMHB4Ij48YnI+PC9zcGFuPikKKyAg
ICAgICAgLy8gMS4gdGhlIHJvb3QgaW5saW5lIGJveCBoYXMgY29udGVudCA8ZGl2PmNvbnRlbnQ8
YnI+L2Rpdj4KKyAgICAgICAgLy8gMi4gdGhlcmUncyBhdCBsZWFzdCBvbmUgYXRvbWljIGlubGlu
ZSBsZXZlbCBib3ggb24gdGhlIGxpbmUgZS5nIDxkaXY+PGltZz48YnI+PC9kaXY+IG9yIDxkaXY+
PHNwYW4+PGltZz48L3NwYW4+PGJyPjwvZGl2PgorICAgICAgICAvLyAzLiB0aGVyZSdzIGF0IGxl
YXN0IG9uZSBpbmxpbmUgYm94IHdpdGggY29udGVudCBlLmcuIDxkaXY+PHNwYW4+Y29udGVudDwv
c3Bhbj48YnI+PC9kaXY+CisgICAgICAgIGlmIChsaW5lQm94LnJvb3RJbmxpbmVCb3goKS5oYXND
b250ZW50KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChsaW5lQm94
Lmhhc0F0b21pY0lubGluZUxldmVsQm94KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgZWl0aGVyIGhhdmUgb25seSB0aGUgPGJyPiBvbiB0
aGUgbGluZSBvciBpbmxpbmUgYm94ZXMgd2l0aCBvciB3aXRob3V0IGNvbnRlbnQuCisgICAgICAg
IGF1dG8mIGlubGluZUxldmVsQm94ZXMgPSBsaW5lQm94Lm5vblJvb3RJbmxpbmVMZXZlbEJveGVz
KCk7CisgICAgICAgIEFTU0VSVCghaW5saW5lTGV2ZWxCb3hlcy5pc0VtcHR5KCkpOworICAgICAg
ICBpZiAoaW5saW5lTGV2ZWxCb3hlcy5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICBmb3IgKGF1dG8mIGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290
SW5saW5lTGV2ZWxCb3hlcygpKSB7CisgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGVtcHR5IGlu
bGluZSBib3hlcyBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48YnI+PC9kaXY+
CisgICAgICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNJbmxpbmVCb3goKSAmJiBpbmxpbmVM
ZXZlbEJveC5oYXNDb250ZW50KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoaW5saW5lTGV2ZWxC
b3guaXNJbmxpbmVCb3goKSkgeworICAgICAgICAvLyBJbmxpbmUgYm94ZXMgKGUuZy4gcm9vdCBp
bmxpbmUgYm94IG9yIDxzcGFuPikgYWZmZWN0cyBsaW5lIGJveGVzIGVpdGhlciB0aHJvdWdoIHRo
ZSBzdHJ1dCBvciBhY3R1YWwgY29udGVudC4KKyAgICAgICAgYXV0byBpbmxpbmVCb3hIYXNJbWFn
aW5hcnlTdHJ1dCA9IGxheW91dFN0YXRlKCkuaW5TdGFuZGFyZHNNb2RlKCk7CisgICAgICAgIGlm
IChpbmxpbmVMZXZlbEJveC5oYXNDb250ZW50KCkgfHwgaW5saW5lQm94SGFzSW1hZ2luYXJ5U3Ry
dXQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlubGluZUxldmVsQm94
LmlzUm9vdElubGluZUJveCgpKSB7CisgICAgICAgICAgICBhdXRvIHNob3VsZFJvb3RJbmxpbmVC
b3hXaXRoTm9Db250ZW50U3RyZXRjaExpbmVCb3ggPSBbJl0geworICAgICAgICAgICAgICAgIGlm
IChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKS5zdHlsZSgpLmxpbmVIZWlnaHQoKS5pc05lZ2F0
aXZlKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAg
ICAvLyBUaGUgcm9vdCBpbmxpbmUgYm94IHdpdGggbm9uLWluaXRpYWwgbGluZSBoZWlnaHQgdmFs
dWUgc3RyZXRjaGVzIHRoZSBsaW5lIGJveCBldmVuIHdoZW4gcm9vdCBoYXMgbm8gY29udGVudAor
ICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBpbmxpbmUgYm94IHdp
dGggY29udGVudC4KKyAgICAgICAgICAgICAgICAvLyBlLmcuIDxkaXYgc3R5bGU9ImxpbmUtaGVp
Z2h0OiAxMDBweDsiPjxzcGFuPmNvbnRlbnQ8L3NwYW4+PC9kaXY+CisgICAgICAgICAgICAgICAg
aWYgKCFsaW5lQm94Lmhhc0lubGluZUJveCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVC
b3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAo
IWlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUxldmVsQm94Lmhhc0NvbnRl
bnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9OworICAg
ICAgICAgICAgcmV0dXJuIHNob3VsZFJvb3RJbmxpbmVCb3hXaXRoTm9Db250ZW50U3RyZXRjaExp
bmVCb3goKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOb24tcm9vdCBpbmxpbmUgYm94ZXMgKGUu
Zy4gPHNwYW4+KS4KKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4
dCgpLmdlb21ldHJ5Rm9yQm94KGlubGluZUxldmVsQm94LmxheW91dEJveCgpKTsKKyAgICAgICAg
aWYgKGJveEdlb21ldHJ5Lmhvcml6b250YWxCb3JkZXIoKSB8fCBib3hHZW9tZXRyeS5ob3Jpem9u
dGFsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpIHsKKyAgICAgICAgICAgIC8vIEhvcml6b250YWwg
Ym9yZGVyIGFuZCBwYWRkaW5nIG1ha2UgdGhlIGlubGluZSBib3ggc3RyZXRjaCB0aGUgbGluZSAo
ZS5nLiA8c3BhbiBzdHlsZT0icGFkZGluZzogMTBweDsiPjwvc3Bhbj4pLgorICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAg
ICBpZiAoaW5saW5lTGV2ZWxCb3guaXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKSB7CisgICAgICAg
IGlmIChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSkKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICAvLyBXaGlsZSBpbiBwcmFjdGljZSB3aGVuIHRoZSBuZWdh
dGl2ZSB2ZXJ0aWNhbCBtYXJnaW4gbWFrZXMgdGhlIGxheW91dCBib3VuZHMgZW1wdHkgKGUuZzog
aGVpZ2h0OiAxMDBweDsgbWFyZ2luLXRvcDogLTEwMHB4OyksIGFuZCB0aGlzIGlubGluZQorICAg
ICAgICAvLyBsZXZlbCBib3ggY29udHJpYnV0ZXMgMHB4IHRvIHRoZSBsaW5lIGJveCBoZWlnaHQs
IGl0IHN0aWxsIG5lZWRzIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCB3aGlsZSBjb21wdXRpbmcg
bGluZSBib3ggZ2VvbWV0cmllcy4KKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0
aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGlubGluZUxldmVsQm94LmxheW91dEJveCgpKTsK
KyAgICAgICAgcmV0dXJuIGJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpIHx8IGJveEdlb21ldHJ5
Lm1hcmdpbkFmdGVyKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpoYXNTb2Z0V3JhcE9wcG9ydHVuaXR5QXRJbWFn
ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICFmb3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKS5pc1Rh
YmxlQ2VsbCgpOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1h
dHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44
N2I2Yzk1YzE1NDVkNjQ1Y2RiZDRiMDU0NmFlYzE4NmNmM2NjZjVkCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0
aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisg
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQor
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUu
aCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSA8
d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNl
IExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChJbmxpbmVGb3JtYXR0aW5n
U3RhdGUpOworCitJbmxpbmVGb3JtYXR0aW5nU3RhdGU6OklubGluZUZvcm1hdHRpbmdTdGF0ZShS
ZWY8RmxvYXRpbmdTdGF0ZT4mJiBmbG9hdGluZ1N0YXRlLCBMYXlvdXRTdGF0ZSYgbGF5b3V0U3Rh
dGUpCisgICAgOiBGb3JtYXR0aW5nU3RhdGUoV1RGTW92ZShmbG9hdGluZ1N0YXRlKSwgVHlwZTo6
SW5saW5lLCBsYXlvdXRTdGF0ZSkKK3sKK30KKworSW5saW5lRm9ybWF0dGluZ1N0YXRlOjp+SW5s
aW5lRm9ybWF0dGluZ1N0YXRlKCkKK3sKK30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcv
SW5saW5lRm9ybWF0dGluZ1N0YXRlLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uMzYzYjE2MDM2ODRlNTk0MDA3YTA4MjdiYzk0Y2I5N2I0YmEwMTc0ZgotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5l
Zm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuaApAQCAtMCwwICsxLDEwOSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NP
TlRFWFQpCisKKyNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbmxpbmVJ
dGVtLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgorI2luY2x1ZGUgIklubGluZUxpbmVH
ZW9tZXRyeS5oIgorI2luY2x1ZGUgIklubGluZUxpbmVSdW4uaCIKKyNpbmNsdWRlIDx3dGYvSXNv
TWFsbG9jLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCit1
c2luZyBJbmxpbmVJdGVtcyA9IFZlY3RvcjxJbmxpbmVJdGVtPjsKK3VzaW5nIElubGluZUxpbmVz
ID0gVmVjdG9yPElubGluZUxpbmVHZW9tZXRyeT47Cit1c2luZyBJbmxpbmVMaW5lQm94ZXMgPSBW
ZWN0b3I8TGluZUJveD47Cit1c2luZyBJbmxpbmVMaW5lUnVucyA9IFZlY3RvcjxMaW5lUnVuPjsK
KworLy8gSW5saW5lRm9ybWF0dGluZ1N0YXRlIGhvbGRzIHRoZSBzdGF0ZSBmb3IgYSBwYXJ0aWN1
bGFyIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgdHJlZS4KK2NsYXNzIElubGluZUZvcm1hdHRp
bmdTdGF0ZSA6IHB1YmxpYyBGb3JtYXR0aW5nU3RhdGUgeworICAgIFdURl9NQUtFX0lTT19BTExP
Q0FURUQoSW5saW5lRm9ybWF0dGluZ1N0YXRlKTsKK3B1YmxpYzoKKyAgICBJbmxpbmVGb3JtYXR0
aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRlJik7CisgICAgfklubGlu
ZUZvcm1hdHRpbmdTdGF0ZSgpOworCisgICAgSW5saW5lSXRlbXMmIGlubGluZUl0ZW1zKCkgeyBy
ZXR1cm4gbV9pbmxpbmVJdGVtczsgfQorICAgIGNvbnN0IElubGluZUl0ZW1zJiBpbmxpbmVJdGVt
cygpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lSXRlbXM7IH0KKyAgICB2b2lkIGFkZElubGluZUl0
ZW0oSW5saW5lSXRlbSYmIGlubGluZUl0ZW0pIHsgbV9pbmxpbmVJdGVtcy5hcHBlbmQoV1RGTW92
ZShpbmxpbmVJdGVtKSk7IH0KKworICAgIGNvbnN0IElubGluZUxpbmVzJiBsaW5lcygpIGNvbnN0
IHsgcmV0dXJuIG1fbGluZXM7IH0KKyAgICBJbmxpbmVMaW5lcyYgbGluZXMoKSB7IHJldHVybiBt
X2xpbmVzOyB9CisgICAgdm9pZCBhZGRMaW5lKGNvbnN0IElubGluZUxpbmVHZW9tZXRyeSYgbGlu
ZSkgeyBtX2xpbmVzLmFwcGVuZChsaW5lKTsgfQorCisgICAgY29uc3QgSW5saW5lTGluZUJveGVz
JiBsaW5lQm94ZXMoKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlczsgfQorICAgIHZvaWQgYWRk
TGluZUJveChMaW5lQm94JiYgbGluZUJveCkgeyBtX2xpbmVCb3hlcy5hcHBlbmQoV1RGTW92ZShs
aW5lQm94KSk7IH0KKworICAgIGNvbnN0IElubGluZUxpbmVSdW5zJiBsaW5lUnVucygpIGNvbnN0
IHsgcmV0dXJuIG1fbGluZVJ1bnM7IH0KKyAgICBJbmxpbmVMaW5lUnVucyYgbGluZVJ1bnMoKSB7
IHJldHVybiBtX2xpbmVSdW5zOyB9CisgICAgdm9pZCBhZGRMaW5lUnVuKExpbmVSdW4mJiBydW4p
IHsgbV9saW5lUnVucy5hcHBlbmQoV1RGTW92ZShydW4pKTsgfQorCisgICAgdm9pZCBzZXRDbGVh
ckdhcEFmdGVyTGFzdExpbmUoSW5saW5lTGF5b3V0VW5pdCB2ZXJ0aWNhbEdhcCk7CisgICAgSW5s
aW5lTGF5b3V0VW5pdCBjbGVhckdhcEFmdGVyTGFzdExpbmUoKSBjb25zdCB7IHJldHVybiBtX2Ns
ZWFyR2FwQWZ0ZXJMYXN0TGluZTsgfQorCisgICAgdm9pZCBjbGVhckxpbmVBbmRSdW5zKCk7Cisg
ICAgdm9pZCBzaHJpbmtUb0ZpdCgpOworCitwcml2YXRlOgorICAgIC8vIENhY2hlYWJsZSBpbnB1
dCB0byBsaW5lIGxheW91dC4KKyAgICBJbmxpbmVJdGVtcyBtX2lubGluZUl0ZW1zOworICAgIElu
bGluZUxpbmVzIG1fbGluZXM7CisgICAgSW5saW5lTGluZUJveGVzIG1fbGluZUJveGVzOworICAg
IElubGluZUxpbmVSdW5zIG1fbGluZVJ1bnM7CisgICAgSW5saW5lTGF5b3V0VW5pdCBtX2NsZWFy
R2FwQWZ0ZXJMYXN0TGluZSB7IDAgfTsKK307CisKK2lubGluZSB2b2lkIElubGluZUZvcm1hdHRp
bmdTdGF0ZTo6c2V0Q2xlYXJHYXBBZnRlckxhc3RMaW5lKElubGluZUxheW91dFVuaXQgdmVydGlj
YWxHYXApCit7CisgICAgQVNTRVJUKHZlcnRpY2FsR2FwID49IDApOworICAgIG1fY2xlYXJHYXBB
ZnRlckxhc3RMaW5lID0gdmVydGljYWxHYXA7Cit9CisKK2lubGluZSB2b2lkIElubGluZUZvcm1h
dHRpbmdTdGF0ZTo6Y2xlYXJMaW5lQW5kUnVucygpCit7CisgICAgbV9saW5lcy5jbGVhcigpOwor
ICAgIG1fbGluZUJveGVzLmNsZWFyKCk7CisgICAgbV9saW5lUnVucy5jbGVhcigpOworICAgIG1f
Y2xlYXJHYXBBZnRlckxhc3RMaW5lID0geyB9OworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVGb3Jt
YXR0aW5nU3RhdGU6OnNocmlua1RvRml0KCkKK3sKKyAgICBtX2lubGluZUl0ZW1zLnNocmlua1Rv
Rml0KCk7CisgICAgbV9saW5lcy5zaHJpbmtUb0ZpdCgpOworICAgIG1fbGluZUJveGVzLnNocmlu
a1RvRml0KCk7CisgICAgbV9saW5lUnVucy5zaHJpbmtUb0ZpdCgpOworfQorCit9Cit9CisKK1NQ
RUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUoSW5saW5lRm9ybWF0
dGluZ1N0YXRlLCBpc0lubGluZUZvcm1hdHRpbmdTdGF0ZSgpKQorCisjZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0
dGluZy9JbmxpbmVJdGVtLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wNjA2ZjE4
NDliNWE5YTYxODQ5YTIwZWJkNDE5NjVhNmFkZDhlYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUl0ZW0uY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
CisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
KyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiSW5saW5lSXRlbS5oIgorCisjaW5jbHVkZSAiSW5saW5lVGV4dEl0
ZW0uaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworc3RydWN0IFNhbWVTaXplQXNJbmxp
bmVJdGVtIHsKKyAgICB2b2lkKiBsYXlvdXRCb3g7CisgICAgdWludDhfdCBlbnVtMTsKKyAgICB1
aW50OF90IGVudW0yOworICAgIGJvb2wgd2lkdGhCb29sOworICAgIGJvb2wgc29mdEh5cGhlbkJv
b2w7CisgICAgYm9vbCBpc1dvcmRTZXBhcmF0b3I7CisgICAgSW5saW5lTGF5b3V0VW5pdCB3aWR0
aDsKKyAgICB1bnNpZ25lZCBzdGFydDsKKyAgICB1bnNpZ25lZCBsZW5ndGg7Cit9OworCitzdGF0
aWNfYXNzZXJ0KHNpemVvZihJbmxpbmVJdGVtKSA9PSBzaXplb2YoU2FtZVNpemVBc0lubGluZUl0
ZW0pLCAiIik7CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUl0ZW0uaCBiL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9J
bmxpbmVJdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzJhZTI0YTYxMjY4NDU4ODc0YzcyMDk5NDM4MmJhYjgy
OTFkZGM0ZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmgKQEAgLTAsMCArMSw4NiBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRU
SU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRV
bml0cy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xh
c3MgSW5saW5lSXRlbSB7CitwdWJsaWM6CisgICAgZW51bSBjbGFzcyBUeXBlIDogdWludDhfdCB7
IFRleHQsIEhhcmRMaW5lQnJlYWssIFNvZnRMaW5lQnJlYWssIFdvcmRCcmVha09wcG9ydHVuaXR5
LCBCb3gsIEZsb2F0LCBJbmxpbmVCb3hTdGFydCwgSW5saW5lQm94RW5kIH07CisgICAgSW5saW5l
SXRlbShjb25zdCBCb3gmIGxheW91dEJveCwgVHlwZSk7CisKKyAgICBUeXBlIHR5cGUoKSBjb25z
dCB7IHJldHVybiBtX3R5cGU7IH0KKyAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsg
cmV0dXJuICptX2xheW91dEJveDsgfQorICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSgpIGNv
bnN0IHsgcmV0dXJuIGxheW91dEJveCgpLnN0eWxlKCk7IH0KKworICAgIGJvb2wgaXNUZXh0KCkg
Y29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OlRleHQ7IH0KKyAgICBib29sIGlzQm94KCkg
Y29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OkJveDsgfQorICAgIGJvb2wgaXNGbG9hdCgp
IGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBUeXBlOjpGbG9hdDsgfQorICAgIGJvb2wgaXNMaW5l
QnJlYWsoKSBjb25zdCB7IHJldHVybiBpc1NvZnRMaW5lQnJlYWsoKSB8fCBpc0hhcmRMaW5lQnJl
YWsoKTsgfQorICAgIGJvb2wgaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgpIGNvbnN0IHsgcmV0dXJu
IHR5cGUoKSA9PSBUeXBlOjpXb3JkQnJlYWtPcHBvcnR1bml0eTsgfQorICAgIGJvb2wgaXNTb2Z0
TGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OlNvZnRMaW5lQnJlYWs7
IH0KKyAgICBib29sIGlzSGFyZExpbmVCcmVhaygpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBU
eXBlOjpIYXJkTGluZUJyZWFrOyB9CisgICAgYm9vbCBpc0lubGluZUJveFN0YXJ0KCkgY29uc3Qg
eyByZXR1cm4gdHlwZSgpID09IFR5cGU6OklubGluZUJveFN0YXJ0OyB9CisgICAgYm9vbCBpc0lu
bGluZUJveEVuZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBUeXBlOjpJbmxpbmVCb3hFbmQ7
IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBCb3gqIG1fbGF5b3V0Qm94IHsgbnVsbHB0ciB9Owor
ICAgIFR5cGUgbV90eXBlIHsgfTsKKworcHJvdGVjdGVkOgorICAgIC8vIEZvciBJbmxpbmVUZXh0
SXRlbQorICAgIGVudW0gY2xhc3MgVGV4dEl0ZW1UeXBlICA6IHVpbnQ4X3QgeyBVbmRlZmluZWQs
IFdoaXRlc3BhY2UsIE5vbldoaXRlc3BhY2UgfTsKKyAgICBUZXh0SXRlbVR5cGUgbV90ZXh0SXRl
bVR5cGUgeyBUZXh0SXRlbVR5cGU6OlVuZGVmaW5lZCB9OworICAgIGJvb2wgbV9oYXNXaWR0aCB7
IGZhbHNlIH07CisgICAgYm9vbCBtX2hhc1RyYWlsaW5nU29mdEh5cGhlbiB7IGZhbHNlIH07Cisg
ICAgYm9vbCBtX2lzV29yZFNlcGFyYXRvciB7IGZhbHNlIH07CisgICAgSW5saW5lTGF5b3V0VW5p
dCBtX3dpZHRoIHsgfTsKKyAgICB1bnNpZ25lZCBtX2xlbmd0aCB7IDAgfTsKKworICAgIC8vIEZv
ciBJbmxpbmVUZXh0SXRlbSBhbmQgSW5saW5lU29mdExpbmVCcmVha0l0ZW0KKyAgICB1bnNpZ25l
ZCBtX3N0YXJ0T3JQb3NpdGlvbiB7IDAgfTsKK307CisKK2lubGluZSBJbmxpbmVJdGVtOjpJbmxp
bmVJdGVtKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBUeXBlIHR5cGUpCisgICAgOiBtX2xheW91dEJv
eCgmbGF5b3V0Qm94KQorICAgICwgbV90eXBlKHR5cGUpCit7Cit9CisKKyNkZWZpbmUgU1BFQ0lB
TElaRV9UWVBFX1RSQUlUU19JTkxJTkVfSVRFTShUb1ZhbHVlVHlwZU5hbWUsIHByZWRpY2F0ZSkg
XAorU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19CRUdJTihXZWJDb3JlOjpMYXlvdXQ6OlRvVmFsdWVU
eXBlTmFtZSkgXAorICAgIHN0YXRpYyBib29sIGlzVHlwZShjb25zdCBXZWJDb3JlOjpMYXlvdXQ6
OklubGluZUl0ZW0mIGlubGluZUl0ZW0pIHsgcmV0dXJuIGlubGluZUl0ZW0ucHJlZGljYXRlOyB9
IFwKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfRU5EKCkKKworfQorfQorI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1h
dHRpbmcvSW5saW5lTGluZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNWIzMzVi
YzQwZWVmYzljMjgzM2Q0ZDEzN2I0YTU4NDc4NzA3NTJmYwotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9J
bmxpbmVMaW5lLmNwcApAQCAtMCwwICsxLDUzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
OSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJJbmxpbmVMaW5lLmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZP
Uk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisjaW5jbHVkZSAi
SW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbmxpbmVTb2Z0TGluZUJyZWFr
SXRlbS5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVkZSAiUnVudGlt
ZUVuYWJsZWRGZWF0dXJlcy5oIgorI2luY2x1ZGUgIlRleHRGbGFncy5oIgorI2luY2x1ZGUgIlRl
eHRVdGlsLmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0xpbmU6OkxpbmUoY29uc3QgSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQorICAgIDogbV9pbmxp
bmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1fdHJp
bW1hYmxlVHJhaWxpbmdDb250ZW50KG1fcnVucykKK3sKK30KKworTGluZTo6fkxpbmUoKQorewor
fQorCit2b2lkIExpbmU6OmluaXRpYWxpemUoKQoreworICAgIG1fbm9uU3Bhbm5pbmdJbmxpbmVM
ZXZlbEJveENvdW50ID0gMDsKKyAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggPSB7IH07CisgICAg
bV9ydW5zLmNsZWFyKCk7CisgICAgbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IHsgfTsKKyAg
ICBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudC5yZXNldCgpOworfQorCit2b2lkIExpbmU6OnJl
bW92ZUNvbGxhcHNpYmxlQ29udGVudChJbmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNw
YWNlKQoreworICAgIHJlbW92ZVRyYWlsaW5nVHJpbW1hYmxlQ29udGVudCgpOworICAgIHZpc3Vh
bGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KGV4dHJhSG9yaXpvbnRhbFNwYWNlKTsK
K30KKwordm9pZCBMaW5lOjphcHBseVJ1bkV4cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGV4dHJh
SG9yaXpvbnRhbFNwYWNlKQoreworICAgIEFTU0VSVChmb3JtYXR0aW5nQ29udGV4dCgpLnJvb3Qo
KS5zdHlsZSgpLnRleHRBbGlnbigpID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkpOworICAgIC8v
IFRleHQgaXMganVzdGlmaWVkIGFjY29yZGluZyB0byB0aGUgbWV0aG9kIHNwZWNpZmllZCBieSB0
aGUgdGV4dC1qdXN0aWZ5IHByb3BlcnR5LAorICAgIC8vIGluIG9yZGVyIHRvIGV4YWN0bHkgZmls
bCB0aGUgbGluZSBib3guIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRleHQtYWxpZ24t
bGFzdCwKKyAgICAvLyB0aGUgbGFzdCBsaW5lIGJlZm9yZSBhIGZvcmNlZCBicmVhayBvciB0aGUg
ZW5kIG9mIHRoZSBibG9jayBpcyBzdGFydC1hbGlnbmVkLgorICAgIGlmIChtX3J1bnMuaXNFbXB0
eSgpIHx8IG1fcnVucy5sYXN0KCkuaXNMaW5lQnJlYWsoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgYXV0byBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50ID0gMDsKKyAgICBSdW4qIGxhc3RSdW5X
aXRoQ29udGVudCA9IG51bGxwdHI7CisgICAgLy8gQ29sbGVjdCBhbmQgZGlzdHJpYnV0ZSB0aGUg
ZXhwYW5zaW9uIG9wcG9ydHVuaXRpZXMuCisgICAgZm9yIChhdXRvJiBydW4gOiBtX3J1bnMpIHsK
KyAgICAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCArPSBydW4uZXhwYW5zaW9uT3Bwb3J0
dW5pdHlDb3VudCgpOworICAgICAgICBpZiAocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc0JveCgpKQor
ICAgICAgICAgICAgbGFzdFJ1bldpdGhDb250ZW50ID0gJnJ1bjsKKyAgICB9CisgICAgLy8gTmVl
ZCB0byBmaXggdXAgdGhlIGxhc3QgcnVuJ3MgdHJhaWxpbmcgZXhwYW5zaW9uLgorICAgIGlmIChs
YXN0UnVuV2l0aENvbnRlbnQgJiYgbGFzdFJ1bldpdGhDb250ZW50LT5oYXNFeHBhbnNpb25PcHBv
cnR1bml0eSgpKSB7CisgICAgICAgIC8vIFR1cm4gb2ZmIHRoZSB0cmFpbGluZyBiaXRzIGZpcnN0
IGFuZCBhZGQgdGhlIGZvcmJpZCB0cmFpbGluZyBleHBhbnNpb24uCisgICAgICAgIGF1dG8gbGVh
ZGluZ0V4cGFuc2lvbiA9IGxhc3RSdW5XaXRoQ29udGVudC0+ZXhwYW5zaW9uQmVoYXZpb3IoKSAm
IExlZnRFeHBhbnNpb25NYXNrOworICAgICAgICBsYXN0UnVuV2l0aENvbnRlbnQtPnNldEV4cGFu
c2lvbkJlaGF2aW9yKGxlYWRpbmdFeHBhbnNpb24gfCBGb3JiaWRSaWdodEV4cGFuc2lvbik7Cisg
ICAgfQorICAgIC8vIEFueXRoaW5nIHRvIGRpc3RyaWJ1dGU/CisgICAgaWYgKCFleHBhbnNpb25P
cHBvcnR1bml0eUNvdW50IHx8ICFleHRyYUhvcml6b250YWxTcGFjZSkKKyAgICAgICAgcmV0dXJu
OworICAgIC8vIERpc3RyaWJ1dGUgdGhlIGV4dHJhIHNwYWNlLgorICAgIGF1dG8gZXhwYW5zaW9u
VG9EaXN0cmlidXRlID0gZXh0cmFIb3Jpem9udGFsU3BhY2UgLyBleHBhbnNpb25PcHBvcnR1bml0
eUNvdW50OworICAgIGF1dG8gYWNjdW11bGF0ZWRFeHBhbnNpb24gPSBJbmxpbmVMYXlvdXRVbml0
IHsgfTsKKyAgICBmb3IgKGF1dG8mIHJ1biA6IG1fcnVucykgeworICAgICAgICAvLyBFeHBhbmQg
YW5kIG1vdmUgcnVucyBieSB0aGUgYWNjdW11bGF0ZWQgZXhwYW5zaW9uLgorICAgICAgICBydW4u
bW92ZUhvcml6b250YWxseShhY2N1bXVsYXRlZEV4cGFuc2lvbik7CisgICAgICAgIGlmICghcnVu
Lmhhc0V4cGFuc2lvbk9wcG9ydHVuaXR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgQVNTRVJUKHJ1bi5leHBhbnNpb25PcHBvcnR1bml0eUNvdW50KCkpOworICAgICAgICBhdXRv
IGNvbXB1dGVkRXhwYW5zaW9uID0gZXhwYW5zaW9uVG9EaXN0cmlidXRlICogcnVuLmV4cGFuc2lv
bk9wcG9ydHVuaXR5Q291bnQoKTsKKyAgICAgICAgLy8gRklYTUU6IENoZWNrIHdoeSB3ZSBuZWVk
IHRvIHNldCBib3RoLgorICAgICAgICBydW4uc2V0SG9yaXpvbnRhbEV4cGFuc2lvbihjb21wdXRl
ZEV4cGFuc2lvbik7CisgICAgICAgIHJ1bi5zaHJpbmtIb3Jpem9udGFsbHkoLWNvbXB1dGVkRXhw
YW5zaW9uKTsKKyAgICAgICAgYWNjdW11bGF0ZWRFeHBhbnNpb24gKz0gY29tcHV0ZWRFeHBhbnNp
b247CisgICAgfQorICAgIC8vIENvbnRlbnQgZ3Jvd3MgYXMgcnVucyBleHBhbmQuCisgICAgbV9j
b250ZW50TG9naWNhbFdpZHRoICs9IGFjY3VtdWxhdGVkRXhwYW5zaW9uOworfQorCit2b2lkIExp
bmU6OnJlbW92ZVRyYWlsaW5nVHJpbW1hYmxlQ29udGVudCgpCit7CisgICAgaWYgKG1fdHJpbW1h
YmxlVHJhaWxpbmdDb250ZW50LmlzRW1wdHkoKSB8fCBtX3J1bnMuaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICAvLyBDb21wbGV4IGxpbmUgbGF5b3V0IHF1aXJrOiBrZWVwIHRoZSB0
cmFpbGluZyB3aGl0ZXNwYWNlIGFyb3VuZCB3aGVuIGl0IGlzIGZvbGxvd2VkIGJ5IGEgbGluZSBi
cmVhaywgdW5sZXNzIHRoZSBjb250ZW50IG92ZXJmbG93cyB0aGUgbGluZS4KKyAgICBpZiAoUnVu
dGltZUVuYWJsZWRGZWF0dXJlczo6c2hhcmVkRmVhdHVyZXMoKS5sYXlvdXRGb3JtYXR0aW5nQ29u
dGV4dEludGVncmF0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgIGF1dG8gaXNUZXh0QWxpZ25SaWdo
dCA9IFsmXSB7CisgICAgICAgICAgICBhdXRvIHRleHRBbGlnbiA9IGZvcm1hdHRpbmdDb250ZXh0
KCkucm9vdCgpLnN0eWxlKCkudGV4dEFsaWduKCk7CisgICAgICAgICAgICByZXR1cm4gdGV4dEFs
aWduID09IFRleHRBbGlnbk1vZGU6OlJpZ2h0CisgICAgICAgICAgICAgICAgfHwgdGV4dEFsaWdu
ID09IFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0CisgICAgICAgICAgICAgICAgfHwgdGV4dEFs
aWduID09IFRleHRBbGlnbk1vZGU6OkVuZDsKKyAgICAgICAgICAgIH0oKTsKKworICAgICAgICBp
ZiAobV9ydW5zLmxhc3QoKS5pc0xpbmVCcmVhaygpICYmICFpc1RleHRBbGlnblJpZ2h0KSB7Cisg
ICAgICAgICAgICBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudC5yZXNldCgpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbV9jb250ZW50TG9naWNhbFdpZHRo
IC09IG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlbW92ZSgpOworfQorCit2b2lkIExpbmU6
OnZpc3VhbGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KElubGluZUxheW91dFVuaXQg
ZXh0cmFIb3Jpem9udGFsU3BhY2UpCit7CisgICAgQVNTRVJUKG1fdHJpbW1hYmxlVHJhaWxpbmdD
b250ZW50LmlzRW1wdHkoKSk7CisgICAgLy8gSWYgd2hpdGUtc3BhY2UgaXMgc2V0IHRvIHByZS13
cmFwLCB0aGUgVUEgbXVzdAorICAgIC8vIC4uLgorICAgIC8vIEl0IG1heSBhbHNvIHZpc3VhbGx5
IGNvbGxhcHNlIHRoZSBjaGFyYWN0ZXIgYWR2YW5jZSB3aWR0aHMgb2YgYW55IHRoYXQgd291bGQg
b3RoZXJ3aXNlIG92ZXJmbG93LgorICAgIGF1dG8gb3ZlcmZsb3dXaWR0aCA9IC1leHRyYUhvcml6
b250YWxTcGFjZTsKKyAgICBpZiAob3ZlcmZsb3dXaWR0aCA8PSAwKQorICAgICAgICByZXR1cm47
CisgICAgLy8gTGV0J3MganVzdCBmaW5kIHRoZSB0cmFpbGluZyBwcmUtd3JhcCB3aGl0ZXNwYWNl
IGNvbnRlbnQgZm9yIG5vdyAoZS5nIGNoZWNrIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB0cmFpbGlu
ZyBydW5zIHdpdGgKKyAgICAvLyBkaWZmZXJlbnQgc2V0IG9mIHdoaXRlLXNwYWNlIHZhbHVlcyBh
bmQgZGVjaWRlIGlmIHRoZSBpbi1iZXR3ZWVuIHByZS13cmFwIGNvbnRlbnQgc2hvdWxkIGJlIGNv
bGxhcHNlZCBhcyB3ZWxsLikKKyAgICBJbmxpbmVMYXlvdXRVbml0IHRyaW1tZWRDb250ZW50V2lk
dGggPSAwOworICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShtX3J1
bnMpKSB7CisgICAgICAgIGlmIChydW4uc3R5bGUoKS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFj
ZTo6UHJlV3JhcCkgeworICAgICAgICAgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBw
cmUtd3JhcCB0cmFpbGluZyBjb250ZW50LgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICAgICAgYXV0byBwcmVXcmFwVmlzdWFsbHlDb2xsYXBzaWJsZUlubGluZUl0ZW0gPSBydW4u
aXNJbmxpbmVCb3hTdGFydCgpIHx8IHJ1bi5pc0lubGluZUJveEVuZCgpIHx8IHJ1bi5oYXNUcmFp
bGluZ1doaXRlc3BhY2UoKTsKKyAgICAgICAgaWYgKCFwcmVXcmFwVmlzdWFsbHlDb2xsYXBzaWJs
ZUlubGluZUl0ZW0pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgQVNTRVJUKCFydW4uaGFz
Q29sbGFwc2libGVUcmFpbGluZ1doaXRlc3BhY2UoKSk7CisgICAgICAgIElubGluZUxheW91dFVu
aXQgdHJpbW1hYmxlV2lkdGggPSB7IH07CisgICAgICAgIGlmIChydW4uaXNUZXh0KCkpIHsKKyAg
ICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgYWx3YXlzIGNvbGxhcHNlIHRoZSBydW4gYXQg
YSBnbHlwaCBib3VuZGFyeSBhcyB0aGUgc3BlYyBpbmRpY2F0ZXM6ICJjb2xsYXBzZSB0aGUgY2hh
cmFjdGVyIGFkdmFuY2Ugd2lkdGhzIG9mIGFueSB0aGF0IHdvdWxkIG90aGVyd2lzZSBvdmVyZmxv
dyIKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgdHJpbW1lZCB3aWR0aCBzaG91bGQgYmUgY2FwcGVk
IGF0IHN0ZDo6bWluKHJ1bi50cmFpbGluZ1doaXRlc3BhY2VXaWR0aCgpLCBvdmVyZmxvd1dpZHRo
KSBmb3IgdGV4dCBydW5zLiBCb3RoIEZGIGFuZCBDaHJvbWUgYWdyZWUuCisgICAgICAgICAgICB0
cmltbWFibGVXaWR0aCA9IHJ1bi50cmFpbGluZ1doaXRlc3BhY2VXaWR0aCgpOworICAgICAgICAg
ICAgcnVuLnZpc3VhbGx5Q29sbGFwc2VUcmFpbGluZ1doaXRlc3BhY2UoKTsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIHRyaW1tYWJsZVdpZHRoID0gcnVuLmxvZ2ljYWxXaWR0aCgpOwor
ICAgICAgICAgICAgcnVuLnNocmlua0hvcml6b250YWxseSh0cmltbWFibGVXaWR0aCk7CisgICAg
ICAgIH0KKyAgICAgICAgdHJpbW1lZENvbnRlbnRXaWR0aCArPSB0cmltbWFibGVXaWR0aDsKKyAg
ICAgICAgb3ZlcmZsb3dXaWR0aCAtPSB0cmltbWFibGVXaWR0aDsKKyAgICAgICAgaWYgKG92ZXJm
bG93V2lkdGggPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX2NvbnRlbnRM
b2dpY2FsV2lkdGggLT0gdHJpbW1lZENvbnRlbnRXaWR0aDsKK30KKwordm9pZCBMaW5lOjphcHBl
bmQoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
V2lkdGgpCit7CisgICAgaWYgKGlubGluZUl0ZW0uaXNUZXh0KCkpCisgICAgICAgIGFwcGVuZFRl
eHRDb250ZW50KGRvd25jYXN0PElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKSwgbG9naWNhbFdp
ZHRoKTsKKyAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkpCisgICAgICAgIGFw
cGVuZExpbmVCcmVhayhpbmxpbmVJdGVtKTsKKyAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmlzV29y
ZEJyZWFrT3Bwb3J0dW5pdHkoKSkKKyAgICAgICAgYXBwZW5kV29yZEJyZWFrT3Bwb3J0dW5pdHko
aW5saW5lSXRlbSk7CisgICAgZWxzZSBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkp
CisgICAgICAgIGFwcGVuZElubGluZUJveFN0YXJ0KGlubGluZUl0ZW0sIGxvZ2ljYWxXaWR0aCk7
CisgICAgZWxzZSBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQorICAgICAgICBhcHBl
bmRJbmxpbmVCb3hFbmQoaW5saW5lSXRlbSwgbG9naWNhbFdpZHRoKTsKKyAgICBlbHNlIGlmIChp
bmxpbmVJdGVtLmxheW91dEJveCgpLmlzUmVwbGFjZWRCb3goKSkKKyAgICAgICAgYXBwZW5kUmVw
bGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgpOworICAgIGVsc2Ug
aWYgKGlubGluZUl0ZW0uaXNCb3goKSkKKyAgICAgICAgYXBwZW5kTm9uUmVwbGFjZWRJbmxpbmVM
ZXZlbEJveChpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgpOworICAgIGVsc2UKKyAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK3ZvaWQgTGluZTo6YXBwZW5kTm9uQnJlYWthYmxlU3Bh
Y2UoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
TGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7CisgICAgbV9ydW5zLmFwcGVu
ZCh7IGlubGluZUl0ZW0sIGxvZ2ljYWxMZWZ0LCBsb2dpY2FsV2lkdGggfSk7CisgICAgbV9jb250
ZW50TG9naWNhbFdpZHRoICs9IGxvZ2ljYWxXaWR0aDsKK30KKwordm9pZCBMaW5lOjphcHBlbmRJ
bmxpbmVCb3hTdGFydChjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxXaWR0aCkKK3sKKyAgICAvLyBUaGlzIGlzIHJlYWxseSBqdXN0IGEgcGxhY2Vo
b2xkZXIgdG8gbWFyayB0aGUgc3RhcnQgb2YgdGhlIGlubGluZSBib3ggPHNwYW4+LgorICAgIGF1
dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxp
bmVJdGVtLmxheW91dEJveCgpKTsKKyAgICBhdXRvIGFkanVzdGVkUnVuU3RhcnQgPSBjb250ZW50
TG9naWNhbFJpZ2h0KCkgKyBzdGQ6Om1pbihib3hHZW9tZXRyeS5tYXJnaW5TdGFydCgpLCAwX2x1
KTsKKyAgICArK21fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50OworICAgIGFwcGVuZE5v
bkJyZWFrYWJsZVNwYWNlKGlubGluZUl0ZW0sIGFkanVzdGVkUnVuU3RhcnQsIGxvZ2ljYWxXaWR0
aCk7Cit9CisKK3ZvaWQgTGluZTo6YXBwZW5kSW5saW5lQm94RW5kKGNvbnN0IElubGluZUl0ZW0m
IGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQoreworICAgIC8vIFRo
aXMgaXMgcmVhbGx5IGp1c3QgYSBwbGFjZWhvbGRlciB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGlu
bGluZSBib3ggPC9zcGFuPi4KKyAgICBhdXRvIHJlbW92ZVRyYWlsaW5nTGV0dGVyU3BhY2luZyA9
IFsmXSB7CisgICAgICAgIGlmICghbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuaXNUcmFpbGlu
Z1J1blBhcnRpYWxseVRyaW1tYWJsZSgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBt
X2NvbnRlbnRMb2dpY2FsV2lkdGggLT0gbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQucmVtb3Zl
UGFydGlhbGx5VHJpbW1hYmxlQ29udGVudCgpOworICAgIH07CisgICAgLy8gUHJldmVudCB0cmFp
bGluZyBsZXR0ZXItc3BhY2luZyBmcm9tIHNwaWxsaW5nIG91dCBvZiB0aGUgaW5saW5lIGJveC4K
KyAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jbGV0dGVyLXNwYWNp
bmctcHJvcGVydHkgU2VlIGV4YW1wbGUgMjEuCisgICAgcmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFj
aW5nKCk7CisgICAgYXBwZW5kTm9uQnJlYWthYmxlU3BhY2UoaW5saW5lSXRlbSwgY29udGVudExv
Z2ljYWxXaWR0aCgpLCBsb2dpY2FsV2lkdGgpOworfQorCit2b2lkIExpbmU6OmFwcGVuZFRleHRD
b250ZW50KGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsV2lkdGgpCit7CisgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVUZXh0SXRlbS5z
dHlsZSgpOworICAgIGF1dG8gd2lsbENvbGxhcHNlQ29tcGxldGVseSA9IFsmXSB7CisgICAgICAg
IGlmIChpbmxpbmVUZXh0SXRlbS5pc0VtcHR5Q29udGVudCgpKQorICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIGlmICghaW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChJbmxpbmVUZXh0SXRlbTo6c2hvdWxk
UHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxhc3QgaXRlbSBpcyBjb2xsYXBzZWQg
YXMgd2VsbC4KKyAgICAgICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdl
KG1fcnVucykpIHsKKyAgICAgICAgICAgIGlmIChydW4uaXNCb3goKSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcv
Y3NzLXRleHQtMy8jd2hpdGUtc3BhY2UtcGhhc2UtMQorICAgICAgICAgICAgLy8gQW55IGNvbGxh
cHNpYmxlIHNwYWNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhbm90aGVyIGNvbGxhcHNpYmxlIHNw
YWNl4oCUZXZlbiBvbmUgb3V0c2lkZSB0aGUgYm91bmRhcnkgb2YgdGhlIGlubGluZSBjb250YWlu
aW5nIHRoYXQgc3BhY2UsCisgICAgICAgICAgICAvLyBwcm92aWRlZCBib3RoIHNwYWNlcyBhcmUg
d2l0aGluIHRoZSBzYW1lIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHTigJRpcyBjb2xsYXBzZWQg
dG8gaGF2ZSB6ZXJvIGFkdmFuY2Ugd2lkdGguCisgICAgICAgICAgICAvLyA6ICI8c3Bhbj4gIDwv
c3Bhbj4gIiA8LSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSBjb2xsYXBzZXMgY29tcGxldGVseS4K
KyAgICAgICAgICAgIC8vIE5vdCB0aGF0IHdoZW4gdGhlIGlubGluZSBib3ggaGFzIHByZXNlcnZl
IHdoaXRlc3BhY2Ugc3R5bGUsICI8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IHByZSI+ICA8L3Nw
YW4+ICIgPC0gdGhpcyB3aGl0ZXNwYWNlIHN0YXlzIGFyb3VuZC4KKyAgICAgICAgICAgIGlmIChy
dW4uaXNUZXh0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bi5oYXNDb2xsYXBzaWJsZVRy
YWlsaW5nV2hpdGVzcGFjZSgpOworICAgICAgICAgICAgQVNTRVJUKHJ1bi5pc0lubGluZUJveFN0
YXJ0KCkgfHwgcnVuLmlzSW5saW5lQm94RW5kKCkgfHwgcnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5p
dHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTGVhZGluZyB3aGl0ZXNwYWNlLgorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgaWYgKHdpbGxDb2xsYXBzZUNvbXBsZXRlbHko
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byBuZWVkc05ld1J1biA9IFsmXSB7CisgICAg
ICAgIGlmIChtX3J1bnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIGF1dG8mIGxhc3RSdW4gPSBtX3J1bnMubGFzdCgpOworICAgICAgICBpZiAoJmxhc3RSdW4u
bGF5b3V0Qm94KCkgIT0gJmlubGluZVRleHRJdGVtLmxheW91dEJveCgpKQorICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIGlmICghbGFzdFJ1bi5pc1RleHQoKSkKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBpZiAobGFzdFJ1bi5oYXNDb2xsYXBzZWRUcmFpbGluZ1do
aXRlc3BhY2UoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoaW5saW5l
VGV4dEl0ZW0uaXNXb3JkU2VwYXJhdG9yKCkgJiYgc3R5bGUuZm9udENhc2NhZGUoKS53b3JkU3Bh
Y2luZygpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9KCk7CisgICAgYXV0byBvbGRDb250ZW50TG9naWNhbFdpZHRoID0gY29udGVudExvZ2lj
YWxXaWR0aCgpOworICAgIGlmIChuZWVkc05ld1J1bikgeworICAgICAgICAvLyBOb3RlLCBuZWdh
dGl2ZSB3b3JkcyBzcGFjaW5nIG1heSBjYXVzZSBnbHlwaCBvdmVybGFwLgorICAgICAgICBhdXRv
IHJ1bkxvZ2ljYWxMZWZ0ID0gY29udGVudExvZ2ljYWxSaWdodCgpICsgKGlubGluZVRleHRJdGVt
LmlzV29yZFNlcGFyYXRvcigpID8gc3R5bGUuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpIDog
MC4wZik7CisgICAgICAgIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVUZXh0SXRlbSwgcnVuTG9naWNh
bExlZnQsIGxvZ2ljYWxXaWR0aCB9KTsKKyAgICAgICAgbV9jb250ZW50TG9naWNhbFdpZHRoID0g
c3RkOjptYXgob2xkQ29udGVudExvZ2ljYWxXaWR0aCwgcnVuTG9naWNhbExlZnQgKyBsb2dpY2Fs
V2lkdGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fcnVucy5sYXN0KCkuZXhwYW5kKGlubGlu
ZVRleHRJdGVtLCBsb2dpY2FsV2lkdGgpOworICAgICAgICAvLyBEbyBub3QgbGV0IG5lZ2F0aXZl
IGxldHRlciBzcGFjaW5nIG1ha2UgdGhlIGNvbnRlbnQgc2hvcnRlciB0aGFuIGl0IGFscmVhZHkg
aXMuCisgICAgICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCArPSBzdGQ6Om1heCgwLjBmLCBsb2dp
Y2FsV2lkdGgpOworICAgIH0KKyAgICAvLyBTZXQgdGhlIHRyYWlsaW5nIHRyaW1tYWJsZSBjb250
ZW50LgorICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4
dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpIHsKKyAg
ICAgICAgbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuYWRkRnVsbHlUcmltbWFibGVDb250ZW50
KG1fcnVucy5zaXplKCkgLSAxLCBjb250ZW50TG9naWNhbFdpZHRoKCkgLSBvbGRDb250ZW50TG9n
aWNhbFdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBBbnkgbm9uLXdoaXRl
c3BhY2UsIG5vLXRyaW1tYWJsZSBjb250ZW50IHJlc2V0cyB0aGUgZXhpc3RpbmcgdHJpbW1hYmxl
LgorICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlc2V0KCk7CisgICAgaWYgKCFmb3Jt
YXR0aW5nQ29udGV4dCgpLmxheW91dFN0YXRlKCkuc2hvdWxkSWdub3JlVHJhaWxpbmdMZXR0ZXJT
cGFjaW5nKCkgJiYgIWlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpICYmIHN0eWxlLmxldHRl
clNwYWNpbmcoKSA+IDApCisgICAgICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmFkZFBh
cnRpYWxseVRyaW1tYWJsZUNvbnRlbnQobV9ydW5zLnNpemUoKSAtIDEsIHN0eWxlLmxldHRlclNw
YWNpbmcoKSk7CisgICAgbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IGlubGluZVRleHRJdGVt
Lmhhc1RyYWlsaW5nU29mdEh5cGhlbigpID8gbWFrZU9wdGlvbmFsKHN0eWxlLmZvbnRDYXNjYWRl
KCkud2lkdGgoVGV4dFJ1biB7IFN0cmluZ1ZpZXcgeyBzdHlsZS5oeXBoZW5TdHJpbmcoKSB9IH0p
KSA6IFdURjo6bnVsbG9wdDsKK30KKwordm9pZCBMaW5lOjphcHBlbmROb25SZXBsYWNlZElubGlu
ZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQg
bWFyZ2luQm94TG9naWNhbFdpZHRoKQoreworICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50
LnJlc2V0KCk7CisgICAgbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IHsgfTsKKyAgICBtX2Nv
bnRlbnRMb2dpY2FsV2lkdGggKz0gbWFyZ2luQm94TG9naWNhbFdpZHRoOworICAgICsrbV9ub25T
cGFubmluZ0lubGluZUxldmVsQm94Q291bnQ7CisgICAgYXV0byBtYXJnaW5TdGFydCA9IGZvcm1h
dHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goaW5saW5lSXRlbS5sYXlvdXRCb3goKSkubWFy
Z2luU3RhcnQoKTsKKyAgICBpZiAobWFyZ2luU3RhcnQgPj0gMCkgeworICAgICAgICBtX3J1bnMu
YXBwZW5kKHsgaW5saW5lSXRlbSwgY29udGVudExvZ2ljYWxSaWdodCgpLCBtYXJnaW5Cb3hMb2dp
Y2FsV2lkdGggfSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gTmVnYXRpdmUgbWFy
Z2luLXN0YXJ0IHB1bGxzIHRoZSBjb250ZW50IHRvIHRoZSBsb2dpY2FsIGxlZnQgZGlyZWN0aW9u
LgorICAgIC8vIE5lZ2F0aXZlIG1hcmdpbiBhbHNvIHNxdWVlemVzIHRoZSBtYXJnaW4gYm94LCB3
ZSBuZWVkIHRvIHN0cmV0Y2ggaXQgdG8gbWFrZSBzdXJlIHRoZSBzdWJzZXF1ZW50IGNvbnRlbnQg
d29uJ3Qgb3ZlcmxhcC4KKyAgICAvLyBlLmcuIDxpbWcgc3R5bGU9IndpZHRoOiAxMDBweDsgbWFy
Z2luLWxlZnQ6IC0xMDBweDsiPiBwdWxscyB0aGUgcmVwbGFjZWQgYm94IHRvIC0xMDBweCB3aXRo
IHRoZSBtYXJnaW4gYm94IHdpZHRoIG9mIDBweC4KKyAgICAvLyBJbnN0ZWFkIHdlIG5lZWQgdG8g
cG9zaXRpb24gaXQgYXQgLTEwMHB4IGFuZCBzaXplIGl0IHRvIDEwMHB4IHNvIHRoZSBzdWJzZXF1
ZW50IGNvbnRlbnQgc3RhcnRzIGF0IDBweC4gCisgICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0
ZW0sIGNvbnRlbnRMb2dpY2FsUmlnaHQoKSArIG1hcmdpblN0YXJ0LCBtYXJnaW5Cb3hMb2dpY2Fs
V2lkdGggLSBtYXJnaW5TdGFydCB9KTsKK30KKwordm9pZCBMaW5lOjphcHBlbmRSZXBsYWNlZElu
bGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVu
aXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKQoreworICAgIEFTU0VSVChpbmxpbmVJdGVtLmxheW91
dEJveCgpLmlzUmVwbGFjZWRCb3goKSk7CisgICAgLy8gRklYTUU6IFN1cmVseSByZXBsYWNlZCBi
b3hlcyBiZWhhdmUgZGlmZmVyZW50bHkuCisgICAgYXBwZW5kTm9uUmVwbGFjZWRJbmxpbmVMZXZl
bEJveChpbmxpbmVJdGVtLCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGgpOworfQorCit2b2lkIExpbmU6
OmFwcGVuZExpbmVCcmVhayhjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQoreworICAgIG1f
dHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPSB7IH07CisgICAgaWYgKGlubGluZUl0ZW0uaXNIYXJk
TGluZUJyZWFrKCkpIHsKKyAgICAgICAgKyttX25vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3Vu
dDsKKyAgICAgICAgcmV0dXJuIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBjb250ZW50TG9n
aWNhbFJpZ2h0KCksIDBfbHUgfSk7CisgICAgfQorICAgIC8vIFNvZnQgbGluZSBicmVha3MgKHBy
ZXNlcnZlZCBuZXcgbGluZSBjaGFyYWN0ZXJzKSByZXF1aXJlIGlubGluZSB0ZXh0IGJveGVzIGZv
ciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCisgICAgQVNTRVJUKGlubGluZUl0ZW0uaXNTb2Z0TGlu
ZUJyZWFrKCkpOworICAgIG1fcnVucy5hcHBlbmQoeyBkb3duY2FzdDxJbmxpbmVTb2Z0TGluZUJy
ZWFrSXRlbT4oaW5saW5lSXRlbSksIGNvbnRlbnRMb2dpY2FsUmlnaHQoKSB9KTsKK30KKwordm9p
ZCBMaW5lOjphcHBlbmRXb3JkQnJlYWtPcHBvcnR1bml0eShjb25zdCBJbmxpbmVJdGVtJiBpbmxp
bmVJdGVtKQoreworICAgIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBjb250ZW50TG9naWNh
bFJpZ2h0KCksIDBfbHUgfSk7Cit9CisKK3ZvaWQgTGluZTo6YWRkVHJhaWxpbmdIeXBoZW4oSW5s
aW5lTGF5b3V0VW5pdCBoeXBoZW5Mb2dpY2FsV2lkdGgpCit7CisgICAgZm9yIChhdXRvJiBydW4g
OiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKG1fcnVucykpIHsKKyAgICAgICAgaWYgKCFydW4uaXNU
ZXh0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcnVuLnNldE5lZWRzSHlwaGVu
KGh5cGhlbkxvZ2ljYWxXaWR0aCk7CisgICAgICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCArPSBo
eXBoZW5Mb2dpY2FsV2lkdGg7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7Cit9CisKK2NvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBMaW5lOjpm
b3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQ7Cit9CisKK0xpbmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6VHJpbW1hYmxl
VHJhaWxpbmdDb250ZW50KFJ1bkxpc3QmIHJ1bnMpCisgICAgOiBtX3J1bnMocnVucykKK3sKK30K
Kwordm9pZCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OmFkZEZ1bGx5VHJpbW1hYmxl
Q29udGVudChzaXplX3QgcnVuSW5kZXgsIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgp
Cit7CisgICAgLy8gQW55IHN1YnNlcXVlbnQgdHJpbW1hYmxlIHdoaXRlc3BhY2Ugc2hvdWxkIGNv
bGxhcHNlIHRvIHplcm8gYWR2YW5jZWQgd2lkdGggYW5kIGlnbm9yZWQgYXQgOjphcHBlbmRUZXh0
Q29udGVudCgpLgorICAgIEFTU0VSVCghbV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQpOworICAg
IG1fZnVsbHlUcmltbWFibGVXaWR0aCA9IHRyaW1tYWJsZVdpZHRoOworICAgIC8vIE5vdGUgdGhh
dCBqdXN0IGJlY2F1c2UgdGhlIHRyaW1tYWJsZSB3aWR0aCBpcyAwIChmb250LXNpemU6IDBweCks
IGl0IGRvZXMgbm90IG1lYW4gd2UgZG9uJ3QgaGF2ZSBhIHRyaW1tYWJsZSB0cmFpbGluZyBjb250
ZW50LgorICAgIG1faGFzRnVsbHlUcmltbWFibGVDb250ZW50ID0gdHJ1ZTsKKyAgICBtX2ZpcnN0
VHJpbW1hYmxlUnVuSW5kZXggPSBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXgudmFsdWVPcihydW5J
bmRleCk7Cit9CisKK3ZvaWQgTGluZTo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50OjphZGRQYXJ0
aWFsbHlUcmltbWFibGVDb250ZW50KHNpemVfdCBydW5JbmRleCwgSW5saW5lTGF5b3V0VW5pdCB0
cmltbWFibGVXaWR0aCkKK3sKKyAgICAvLyBEbyBub3QgYWRkIHRyaW1tYWJsZSBsZXR0ZXIgc3Bh
Y2luZyBhZnRlciBhIGZ1bGx5IHRyaW1tYWJsZSB3aGl0ZXNwYWNlLgorICAgIEFTU0VSVCghbV9m
aXJzdFRyaW1tYWJsZVJ1bkluZGV4KTsKKyAgICBBU1NFUlQoIW1faGFzRnVsbHlUcmltbWFibGVD
b250ZW50KTsKKyAgICBBU1NFUlQoIW1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGgpOworICAgIEFT
U0VSVCh0cmltbWFibGVXaWR0aCk7CisgICAgbV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aCA9IHRy
aW1tYWJsZVdpZHRoOworICAgIG1fZmlyc3RUcmltbWFibGVSdW5JbmRleCA9IHJ1bkluZGV4Owor
fQorCitJbmxpbmVMYXlvdXRVbml0IExpbmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6cmVt
b3ZlKCkKK3sKKyAgICAvLyBSZW1vdmUgdHJpbW1hYmxlIHRyYWlsaW5nIGNvbnRlbnQgYW5kIG1v
dmUgYWxsIHRoZSBzdWJzZXF1ZW50IHRyYWlsaW5nIHJ1bnMuCisgICAgLy8gPHNwYW4+IDwvc3Bh
bj48c3Bhbj48L3NwYW4+CisgICAgLy8gW3RyYWlsaW5nIHdoaXRlc3BhY2VdW2lubGluZSBib3gg
ZW5kXVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF0KKyAgICAvLyBUcmltIHRoZSB3
aGl0ZXNwYWNlIHJ1biBhbmQgbW92ZSB0aGUgdHJhaWxpbmcgaW5saW5lIGJveCBydW5zIHRvIHRo
ZSBsb2dpY2FsIGxlZnQuCisgICAgQVNTRVJUKCFpc0VtcHR5KCkpOworICAgIGF1dG8mIHRyaW1t
YWJsZVJ1biA9IG1fcnVuc1sqbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4XTsKKyAgICBBU1NFUlQo
dHJpbW1hYmxlUnVuLmlzVGV4dCgpKTsKKworICAgIGlmIChtX2hhc0Z1bGx5VHJpbW1hYmxlQ29u
dGVudCkKKyAgICAgICAgdHJpbW1hYmxlUnVuLnJlbW92ZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwor
ICAgIGlmIChtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRoKQorICAgICAgICB0cmltbWFibGVSdW4u
cmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7CisKKyAgICBhdXRvIHRyaW1tYWJsZVdpZHRo
ID0gd2lkdGgoKTsKKyAgICAvLyBXaGVuIHRoZSB0cmltbWFibGUgcnVuIGlzIGZvbGxvd2VkIGJ5
IHNvbWUgbm9uLWNvbnRlbnQgcnVucywgd2UgbmVlZCB0byBhZGp1c3QgdGhlaXIgaG9yaXpvbnRh
bCBwb3NpdGlvbnMuCisgICAgLy8gZS5nLiA8ZGl2PnRleHQgaXMgZm9sbG93ZWQgYnkgdHJpbW1h
YmxlIGNvbnRlbnQgICAgPHNwYW4+IDwvc3Bhbj48L2Rpdj4KKyAgICAvLyBXaGVuIHRoZSBbdGV4
dC4uLl0gcnVuIGlzIHRyaW1tZWQgKHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCksIGJv
dGggIjxzcGFuPiIgYW5kICI8L3NwYW4+IiBydW5zCisgICAgLy8gbmVlZCB0byBiZSBtb3ZlZCBo
b3Jpem9udGFsbHkgdG8gY2F0Y2ggdXAgd2l0aCB0aGUgW3RleHQuLi5dIHJ1bi4gTm90ZSB0aGF0
IHRoZSB3aGl0ZXNwYWNlIGluc2lkZSB0aGUgPHNwYW4+IGRvZXMKKyAgICAvLyBub3QgcHJvZHVj
ZSBhIHJ1biBzaW5jZSBpbiA6OmFwcGVuZFRleHQoKSB3ZSBzZWUgaXQgYXMgYSBmdWxseSBjb2xs
YXBzaWJsZSBydW4uCisgICAgZm9yIChhdXRvIGluZGV4ID0gKm1fZmlyc3RUcmltbWFibGVSdW5J
bmRleCArIDE7IGluZGV4IDwgbV9ydW5zLnNpemUoKTsgKytpbmRleCkgeworICAgICAgICBhdXRv
JiBydW4gPSBtX3J1bnNbaW5kZXhdOworICAgICAgICBBU1NFUlQocnVuLmlzV29yZEJyZWFrT3Bw
b3J0dW5pdHkoKSB8fCBydW4uaXNJbmxpbmVCb3hTdGFydCgpIHx8IHJ1bi5pc0lubGluZUJveEVu
ZCgpIHx8IHJ1bi5pc0xpbmVCcmVhaygpKTsKKyAgICAgICAgcnVuLm1vdmVIb3Jpem9udGFsbHko
LXRyaW1tYWJsZVdpZHRoKTsKKyAgICB9CisgICAgaWYgKCF0cmltbWFibGVSdW4udGV4dENvbnRl
bnQoKS0+bGVuZ3RoKCkpIHsKKyAgICAgICAgLy8gVGhpcyB0cmltbWFibGUgcnVuIGlzIGZ1bGx5
IGNvbGxhcHNlZCBub3cgKGUuZy4gPGRpdj48aW1nPiAgICA8c3Bhbj48L3NwYW4+PC9kaXY+KS4K
KyAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBrZWVwIGl0IGFyb3VuZCBhbnltb3JlLgorICAg
ICAgICBtX3J1bnMucmVtb3ZlKCptX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXgpOworICAgIH0KKyAg
ICByZXNldCgpOworICAgIHJldHVybiB0cmltbWFibGVXaWR0aDsKK30KKworSW5saW5lTGF5b3V0
VW5pdCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OnJlbW92ZVBhcnRpYWxseVRyaW1t
YWJsZUNvbnRlbnQoKQoreworICAgIC8vIFBhcnRpYWxseSB0cmltbWFibGUgY29udGVudCBpcyBh
bHdheXMgZ2F0ZWQgYnkgYSBmdWxseSB0cmltbWFibGUgY29udGVudC4KKyAgICAvLyBXZSBjYW4n
dCBqdXN0IHRyaW0gc3BhY2luZyBpbiB0aGUgbWlkZGxlLgorICAgIEFTU0VSVCghbV9mdWxseVRy
aW1tYWJsZVdpZHRoKTsKKyAgICByZXR1cm4gcmVtb3ZlKCk7Cit9CisKK0xpbmU6OlJ1bjo6UnVu
KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbExl
ZnQsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQorICAgIDogbV90eXBlKGlubGluZUl0
ZW0udHlwZSgpKQorICAgICwgbV9sYXlvdXRCb3goJmlubGluZUl0ZW0ubGF5b3V0Qm94KCkpCisg
ICAgLCBtX2xvZ2ljYWxMZWZ0KGxvZ2ljYWxMZWZ0KQorICAgICwgbV9sb2dpY2FsV2lkdGgobG9n
aWNhbFdpZHRoKQoreworfQorCitMaW5lOjpSdW46OlJ1bihjb25zdCBJbmxpbmVTb2Z0TGluZUJy
ZWFrSXRlbSYgc29mdExpbmVCcmVha0l0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQp
CisgICAgOiBtX3R5cGUoc29mdExpbmVCcmVha0l0ZW0udHlwZSgpKQorICAgICwgbV9sYXlvdXRC
b3goJnNvZnRMaW5lQnJlYWtJdGVtLmxheW91dEJveCgpKQorICAgICwgbV9sb2dpY2FsTGVmdChs
b2dpY2FsTGVmdCkKKyAgICAsIG1fdGV4dENvbnRlbnQoeyBzb2Z0TGluZUJyZWFrSXRlbS5wb3Np
dGlvbigpLCAxLCBzb2Z0TGluZUJyZWFrSXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpIH0p
Cit7Cit9CisKK0xpbmU6OlJ1bjo6UnVuKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0
SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dp
Y2FsV2lkdGgpCisgICAgOiBtX3R5cGUoSW5saW5lSXRlbTo6VHlwZTo6VGV4dCkKKyAgICAsIG1f
bGF5b3V0Qm94KCZpbmxpbmVUZXh0SXRlbS5sYXlvdXRCb3goKSkKKyAgICAsIG1fbG9naWNhbExl
ZnQobG9naWNhbExlZnQpCisgICAgLCBtX2xvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGgpCisgICAg
LCBtX3doaXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9ydHVuaXR5KCFUZXh0VXRpbDo6c2hvdWxkUHJl
c2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtLmxheW91dEJveCgpKSkKKyAgICAsIG1f
dHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSh0cmFpbGluZ1doaXRlc3BhY2VUeXBlKGlubGluZVRleHRJ
dGVtKSkKKyAgICAsIG1fdGV4dENvbnRlbnQoeyBpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBtX3Ry
YWlsaW5nV2hpdGVzcGFjZVR5cGUgPT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQgPyAx
IDogaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCksIGlubGluZVRleHRJdGVtLmlubGluZVRleHRCb3go
KS5jb250ZW50KCkgfSkKK3sKKyAgICBpZiAobV90cmFpbGluZ1doaXRlc3BhY2VUeXBlICE9IFRy
YWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSkgeworICAgICAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdp
ZHRoID0gbG9naWNhbFdpZHRoOworICAgICAgICBpZiAobV93aGl0ZXNwYWNlSXNFeHBhbnNpb25P
cHBvcnR1bml0eSkKKyAgICAgICAgICAgIG1fZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCA9IDE7
CisgICAgfQorfQorCit2b2lkIExpbmU6OlJ1bjo6ZXhwYW5kKGNvbnN0IElubGluZVRleHRJdGVt
JiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7CisgICAg
Ly8gRklYTUU6IFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBleHBhbnNpb24gbWVyZ2UuIFdlIHNob3Vs
ZCBldmVudHVhbGx5IHN3aXRjaCBvdmVyIHRvIEZvbnRDYXNjYWRlOjpleHBhbnNpb25PcHBvcnR1
bml0eUNvdW50LgorICAgIEFTU0VSVCghaGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCkp
OworICAgIEFTU0VSVChpc1RleHQoKSAmJiBpbmxpbmVUZXh0SXRlbS5pc1RleHQoKSk7CisgICAg
QVNTRVJUKG1fbGF5b3V0Qm94ID09ICZpbmxpbmVUZXh0SXRlbS5sYXlvdXRCb3goKSk7CisKKyAg
ICBtX2xvZ2ljYWxXaWR0aCArPSBsb2dpY2FsV2lkdGg7CisgICAgbV90cmFpbGluZ1doaXRlc3Bh
Y2VUeXBlID0gdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZShpbmxpbmVUZXh0SXRlbSk7CisKKyAgICBp
ZiAobV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSkg
eworICAgICAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0geyB9OworICAgICAgICBzZXRF
eHBhbnNpb25CZWhhdmlvcihBbGxvd0xlZnRFeHBhbnNpb24gfCBBbGxvd1JpZ2h0RXhwYW5zaW9u
KTsKKyAgICAgICAgbV90ZXh0Q29udGVudC0+ZXhwYW5kKGlubGluZVRleHRJdGVtLmxlbmd0aCgp
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRo
ICs9IGxvZ2ljYWxXaWR0aDsKKyAgICBpZiAobV93aGl0ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1
bml0eSkKKyAgICAgICAgKyttX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7CisgICAgc2V0RXhw
YW5zaW9uQmVoYXZpb3IoRGVmYXVsdEV4cGFuc2lvbik7CisgICAgbV90ZXh0Q29udGVudC0+ZXhw
YW5kKG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9PSBUcmFpbGluZ1doaXRlc3BhY2U6OkNvbGxh
cHNlZCA/IDEgOiBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSk7Cit9CisKK2Jvb2wgTGluZTo6UnVu
OjpoYXNUcmFpbGluZ0xldHRlclNwYWNpbmcoKSBjb25zdAoreworICAgIHJldHVybiAhaGFzVHJh
aWxpbmdXaGl0ZXNwYWNlKCkgJiYgc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCkgPiAwOworfQorCitJ
bmxpbmVMYXlvdXRVbml0IExpbmU6OlJ1bjo6dHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgY29uc3QK
K3sKKyAgICBpZiAoIWhhc1RyYWlsaW5nTGV0dGVyU3BhY2luZygpKQorICAgICAgICByZXR1cm4g
eyB9OworICAgIHJldHVybiBJbmxpbmVMYXlvdXRVbml0IHsgc3R5bGUoKS5sZXR0ZXJTcGFjaW5n
KCkgfTsKK30KKwordm9pZCBMaW5lOjpSdW46OnJlbW92ZVRyYWlsaW5nTGV0dGVyU3BhY2luZygp
Cit7CisgICAgQVNTRVJUKGhhc1RyYWlsaW5nTGV0dGVyU3BhY2luZygpKTsKKyAgICBzaHJpbmtI
b3Jpem9udGFsbHkodHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkpOworICAgIEFTU0VSVChsb2dpY2Fs
V2lkdGgoKSA+IDAgfHwgKCFsb2dpY2FsV2lkdGgoKSAmJiBzdHlsZSgpLmxldHRlclNwYWNpbmco
KSA+PSBzdGF0aWNfY2FzdDxmbG9hdD4oaW50TWF4Rm9yTGF5b3V0VW5pdCkpKTsKK30KKwordm9p
ZCBMaW5lOjpSdW46OnJlbW92ZVRyYWlsaW5nV2hpdGVzcGFjZSgpCit7CisgICAgLy8gQWNjb3Jk
aW5nIHRvIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9w
ZXJ0eSBtYXRyaXgKKyAgICAvLyBUcmltbWFibGUgd2hpdGVzcGFjZSBpcyBhbHdheXMgY29sbGFw
c2libGUgc28gdGhlIGxlbmd0aCBvZiB0aGUgdHJhaWxpbmcgdHJpbW1hYmxlIHdoaXRlc3BhY2Ug
aXMgYWx3YXlzIDEgKG9yIG5vbi1leGlzdGVudCkuCisgICAgQVNTRVJUKG1fdGV4dENvbnRlbnQt
Pmxlbmd0aCgpKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IHRyYWlsaW5nVHJpbW1hYmxlQ29udGVu
dExlbmd0aCA9IDE7CisgICAgbV90ZXh0Q29udGVudC0+c2hyaW5rKHRyYWlsaW5nVHJpbW1hYmxl
Q29udGVudExlbmd0aCk7CisgICAgdmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgp
OworfQorCit2b2lkIExpbmU6OlJ1bjo6dmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFj
ZSgpCit7CisgICAgLy8gVGhpcyBpcyBqdXN0IGEgdmlzdWFsIGFkanVzdG1lbnQsIHRoZSB0ZXh0
IGxlbmd0aCBzaG91bGQgcmVtYWluIHRoZSBzYW1lLgorICAgIHNocmlua0hvcml6b250YWxseSht
X3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKTsKKyAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRo
ID0geyB9OworICAgIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9IFRyYWlsaW5nV2hpdGVzcGFj
ZTo6Tm9uZTsKKworICAgIGlmIChtX3doaXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9ydHVuaXR5KSB7
CisgICAgICAgIEFTU0VSVChtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpOworICAgICAgICBt
X2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQtLTsKKyAgICB9CisgICAgc2V0RXhwYW5zaW9uQmVo
YXZpb3IoQWxsb3dMZWZ0RXhwYW5zaW9uIHwgQWxsb3dSaWdodEV4cGFuc2lvbik7Cit9CisKK3Zv
aWQgTGluZTo6UnVuOjpzZXRFeHBhbnNpb25CZWhhdmlvcihFeHBhbnNpb25CZWhhdmlvciBleHBh
bnNpb25CZWhhdmlvcikKK3sKKyAgICBBU1NFUlQoaXNUZXh0KCkpOworICAgIG1fZXhwYW5zaW9u
LmJlaGF2aW9yID0gZXhwYW5zaW9uQmVoYXZpb3I7Cit9CisKK0V4cGFuc2lvbkJlaGF2aW9yIExp
bmU6OlJ1bjo6ZXhwYW5zaW9uQmVoYXZpb3IoKSBjb25zdAoreworICAgIEFTU0VSVChpc1RleHQo
KSk7CisgICAgcmV0dXJuIG1fZXhwYW5zaW9uLmJlaGF2aW9yOworfQorCit2b2lkIExpbmU6OlJ1
bjo6c2V0SG9yaXpvbnRhbEV4cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxFeHBhbnNp
b24pCit7CisgICAgQVNTRVJUKGlzVGV4dCgpKTsKKyAgICBBU1NFUlQoaGFzRXhwYW5zaW9uT3Bw
b3J0dW5pdHkoKSk7CisgICAgbV9leHBhbnNpb24uaG9yaXpvbnRhbEV4cGFuc2lvbiA9IGxvZ2lj
YWxFeHBhbnNpb247Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGlu
ZS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mZTMzNTE5NTIxYWE5ZTRmOTZhNzkzNGFl
ZDhjMDMyY2M5ZTc5M2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUuaApAQCAtMCww
ICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
CisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9V
VF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVJdGVtLmgiCisjaW5jbHVk
ZSAiSW5saW5lTGluZVJ1bi5oIgorI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dDsKK2NsYXNzIElubGluZVNvZnRMaW5lQnJlYWtJdGVtOworCitjbGFzcyBMaW5l
IHsKK3B1YmxpYzoKKyAgICBMaW5lKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Jik7Cisg
ICAgfkxpbmUoKTsKKworICAgIHZvaWQgaW5pdGlhbGl6ZSgpOworCisgICAgdm9pZCBhcHBlbmQo
Y29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKworICAg
IElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1f
Y29udGVudExvZ2ljYWxXaWR0aDsgfQorICAgIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2lj
YWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fcnVucy5pc0VtcHR5KCkgPyAwLjBmIDogbV9ydW5z
Lmxhc3QoKS5sb2dpY2FsUmlnaHQoKTsgfQorICAgIHNpemVfdCBub25TcGFubmluZ0lubGluZUxl
dmVsQm94Q291bnQoKSBjb25zdCB7IHJldHVybiBtX25vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hD
b3VudDsgfQorCisgICAgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVUcmFpbGluZ1dpZHRoKCkg
Y29uc3QgeyByZXR1cm4gbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQud2lkdGgoKTsgfQorICAg
IGJvb2wgaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxlKCkgY29uc3QgeyByZXR1cm4gbV90cmlt
bWFibGVUcmFpbGluZ0NvbnRlbnQuaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxlKCk7IH0KKwor
ICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCkg
Y29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aDsgfQorICAgIHZvaWQgYWRk
VHJhaWxpbmdIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBoeXBoZW5Mb2dpY2FsV2lkdGgpOworCisg
ICAgdm9pZCByZW1vdmVDb2xsYXBzaWJsZUNvbnRlbnQoSW5saW5lTGF5b3V0VW5pdCBleHRyYUhv
cml6b250YWxTcGFjZSk7CisgICAgdm9pZCBhcHBseVJ1bkV4cGFuc2lvbihJbmxpbmVMYXlvdXRV
bml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKTsKKworICAgIHN0cnVjdCBSdW4geworICAgICAgICBi
b29sIGlzVGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpUeXBlOjpU
ZXh0OyB9CisgICAgICAgIGJvb2wgaXNCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gSW5s
aW5lSXRlbTo6VHlwZTo6Qm94OyB9CisgICAgICAgIGJvb2wgaXNMaW5lQnJlYWsoKSBjb25zdCB7
IHJldHVybiBpc0hhcmRMaW5lQnJlYWsoKSB8fCBpc1NvZnRMaW5lQnJlYWsoKTsgfQorICAgICAg
ICBib29sIGlzU29mdExpbmVCcmVhaygpIGNvbnN0ICB7IHJldHVybiBtX3R5cGUgPT0gSW5saW5l
SXRlbTo6VHlwZTo6U29mdExpbmVCcmVhazsgfQorICAgICAgICBib29sIGlzSGFyZExpbmVCcmVh
aygpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpUeXBlOjpIYXJkTGluZUJy
ZWFrOyB9CisgICAgICAgIGJvb2wgaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgpIGNvbnN0IHsgcmV0
dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpUeXBlOjpXb3JkQnJlYWtPcHBvcnR1bml0eTsgfQor
ICAgICAgICBib29sIGlzSW5saW5lQm94U3RhcnQoKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0g
SW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94U3RhcnQ7IH0KKyAgICAgICAgYm9vbCBpc0lubGlu
ZUJveEVuZCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpUeXBlOjpJbmxp
bmVCb3hFbmQ7IH0KKworICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0
dXJuICptX2xheW91dEJveDsgfQorICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUoKSBj
b25zdCB7IHJldHVybiBtX2xheW91dEJveC0+c3R5bGUoKTsgfQorICAgICAgICBjb25zdCBPcHRp
b25hbDxMaW5lUnVuOjpUZXh0PiYgdGV4dENvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX3RleHRD
b250ZW50OyB9CisKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25z
dCB7IHJldHVybiBtX2xvZ2ljYWxXaWR0aDsgfQorICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxv
Z2ljYWxMZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsTGVmdDsgfQorICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxMZWZ0KCkg
KyBsb2dpY2FsV2lkdGgoKTsgfQorCisgICAgICAgIGNvbnN0IExpbmVSdW46OkV4cGFuc2lvbiYg
ZXhwYW5zaW9uKCkgY29uc3QgeyByZXR1cm4gbV9leHBhbnNpb247IH0KKyAgICAgICAgYm9vbCBo
YXNFeHBhbnNpb25PcHBvcnR1bml0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwYW5zaW9uT3Bwb3J0
dW5pdHlDb3VudDsgfQorICAgICAgICBFeHBhbnNpb25CZWhhdmlvciBleHBhbnNpb25CZWhhdmlv
cigpIGNvbnN0OworICAgICAgICB1bnNpZ25lZCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KCkg
Y29uc3QgeyByZXR1cm4gbV9leHBhbnNpb25PcHBvcnR1bml0eUNvdW50OyB9CisKKyAgICAgICAg
Ym9vbCBoYXNUcmFpbGluZ1doaXRlc3BhY2UoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nV2hp
dGVzcGFjZVR5cGUgIT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25lOyB9CisgICAgICAgIElubGlu
ZUxheW91dFVuaXQgdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX3Ry
YWlsaW5nV2hpdGVzcGFjZVdpZHRoOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQg
Y2xhc3MgTGluZTsKKworICAgICAgICBSdW4oY29uc3QgSW5saW5lVGV4dEl0ZW0mLCBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Cisg
ICAgICAgIFJ1bihjb25zdCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSYsIElubGluZUxheW91dFVu
aXQgbG9naWNhbExlZnQpOworICAgICAgICBSdW4oY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxh
eW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKwor
ICAgICAgICB2b2lkIGV4cGFuZChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIElubGluZUxheW91dFVu
aXQgbG9naWNhbFdpZHRoKTsKKyAgICAgICAgdm9pZCBtb3ZlSG9yaXpvbnRhbGx5KElubGluZUxh
eW91dFVuaXQgb2Zmc2V0KSB7IG1fbG9naWNhbExlZnQgKz0gb2Zmc2V0OyB9CisgICAgICAgIHZv
aWQgc2hyaW5rSG9yaXpvbnRhbGx5KElubGluZUxheW91dFVuaXQgd2lkdGgpIHsgbV9sb2dpY2Fs
V2lkdGggLT0gd2lkdGg7IH0KKyAgICAgICAgdm9pZCBzZXRFeHBhbnNpb25CZWhhdmlvcihFeHBh
bnNpb25CZWhhdmlvcik7CisgICAgICAgIHZvaWQgc2V0SG9yaXpvbnRhbEV4cGFuc2lvbihJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxFeHBhbnNpb24pOworICAgICAgICB2b2lkIHNldE5lZWRzSHlw
aGVuKElubGluZUxheW91dFVuaXQgaHlwaGVuTG9naWNhbFdpZHRoKTsKKworICAgICAgICBlbnVt
IGNsYXNzIFRyYWlsaW5nV2hpdGVzcGFjZSB7CisgICAgICAgICAgICBOb25lLAorICAgICAgICAg
ICAgTm90Q29sbGFwc2libGUsCisgICAgICAgICAgICBDb2xsYXBzaWJsZSwKKyAgICAgICAgICAg
IENvbGxhcHNlZAorICAgICAgICB9OworICAgICAgICBib29sIGhhc0NvbGxhcHNpYmxlVHJhaWxp
bmdXaGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID09
IFRyYWlsaW5nV2hpdGVzcGFjZTo6Q29sbGFwc2libGUgfHwgaGFzQ29sbGFwc2VkVHJhaWxpbmdX
aGl0ZXNwYWNlKCk7IH0KKyAgICAgICAgYm9vbCBoYXNDb2xsYXBzZWRUcmFpbGluZ1doaXRlc3Bh
Y2UoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nV2hpdGVzcGFjZVR5cGUgPT0gVHJhaWxpbmdX
aGl0ZXNwYWNlOjpDb2xsYXBzZWQ7IH0KKyAgICAgICAgVHJhaWxpbmdXaGl0ZXNwYWNlIHRyYWls
aW5nV2hpdGVzcGFjZVR5cGUoY29uc3QgSW5saW5lVGV4dEl0ZW0mKSBjb25zdDsKKyAgICAgICAg
dm9pZCByZW1vdmVUcmFpbGluZ1doaXRlc3BhY2UoKTsKKyAgICAgICAgdm9pZCB2aXN1YWxseUNv
bGxhcHNlVHJhaWxpbmdXaGl0ZXNwYWNlKCk7CisKKyAgICAgICAgYm9vbCBoYXNUcmFpbGluZ0xl
dHRlclNwYWNpbmcoKSBjb25zdDsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB0cmFpbGluZ0xl
dHRlclNwYWNpbmcoKSBjb25zdDsKKyAgICAgICAgdm9pZCByZW1vdmVUcmFpbGluZ0xldHRlclNw
YWNpbmcoKTsKKworICAgICAgICBJbmxpbmVJdGVtOjpUeXBlIG1fdHlwZSB7IElubGluZUl0ZW06
OlR5cGU6OlRleHQgfTsKKyAgICAgICAgY29uc3QgQm94KiBtX2xheW91dEJveCB7IG51bGxwdHIg
fTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2xvZ2ljYWxMZWZ0IHsgMCB9OworICAgICAg
ICBJbmxpbmVMYXlvdXRVbml0IG1fbG9naWNhbFdpZHRoIHsgMCB9OworICAgICAgICBib29sIG1f
d2hpdGVzcGFjZUlzRXhwYW5zaW9uT3Bwb3J0dW5pdHkgeyBmYWxzZSB9OworICAgICAgICBUcmFp
bGluZ1doaXRlc3BhY2UgbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlIHsgVHJhaWxpbmdXaGl0ZXNw
YWNlOjpOb25lIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV90cmFpbGluZ1doaXRlc3Bh
Y2VXaWR0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8TGluZVJ1bjo6VGV4dD4gbV90ZXh0Q29u
dGVudDsKKyAgICAgICAgTGluZVJ1bjo6RXhwYW5zaW9uIG1fZXhwYW5zaW9uOworICAgICAgICB1
bnNpZ25lZCBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQgeyAwIH07CisgICAgfTsKKyAgICB1
c2luZyBSdW5MaXN0ID0gVmVjdG9yPFJ1biwgMTA+OworICAgIGNvbnN0IFJ1bkxpc3QmIHJ1bnMo
KSBjb25zdCB7IHJldHVybiBtX3J1bnM7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGFwcGVuZE5v
bkJyZWFrYWJsZVNwYWNlKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7CisgICAgdm9pZCBhcHBlbmRU
ZXh0Q29udGVudChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNh
bFdpZHRoKTsKKyAgICB2b2lkIGFwcGVuZE5vblJlcGxhY2VkSW5saW5lTGV2ZWxCb3goY29uc3Qg
SW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKTsKKyAg
ICB2b2lkIGFwcGVuZFJlcGxhY2VkSW5saW5lTGV2ZWxCb3goY29uc3QgSW5saW5lSXRlbSYsIElu
bGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKTsKKyAgICB2b2lkIGFwcGVuZElu
bGluZUJveFN0YXJ0KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxX
aWR0aCk7CisgICAgdm9pZCBhcHBlbmRJbmxpbmVCb3hFbmQoY29uc3QgSW5saW5lSXRlbSYsIElu
bGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICB2b2lkIGFwcGVuZExpbmVCcmVhayhj
b25zdCBJbmxpbmVJdGVtJik7CisgICAgdm9pZCBhcHBlbmRXb3JkQnJlYWtPcHBvcnR1bml0eShj
b25zdCBJbmxpbmVJdGVtJik7CisKKyAgICB2b2lkIHJlbW92ZVRyYWlsaW5nVHJpbW1hYmxlQ29u
dGVudCgpOworICAgIHZvaWQgdmlzdWFsbHlDb2xsYXBzZVByZVdyYXBPdmVyZmxvd0NvbnRlbnQo
SW5saW5lTGF5b3V0VW5pdCBleHRyYUhvcml6b250YWxTcGFjZSk7CisKKyAgICBjb25zdCBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdDsKKworICAgIHN0
cnVjdCBUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQgeworICAgICAgICBUcmltbWFibGVUcmFpbGlu
Z0NvbnRlbnQoUnVuTGlzdCYpOworCisgICAgICAgIHZvaWQgYWRkRnVsbHlUcmltbWFibGVDb250
ZW50KHNpemVfdCBydW5JbmRleCwgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVXaWR0aCk7Cisg
ICAgICAgIHZvaWQgYWRkUGFydGlhbGx5VHJpbW1hYmxlQ29udGVudChzaXplX3QgcnVuSW5kZXgs
IElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpOworICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IHJlbW92ZSgpOworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHJlbW92ZVBhcnRpYWxseVRy
aW1tYWJsZUNvbnRlbnQoKTsKKworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHdpZHRoKCkgY29u
c3QgeyByZXR1cm4gbV9mdWxseVRyaW1tYWJsZVdpZHRoICsgbV9wYXJ0aWFsbHlUcmltbWFibGVX
aWR0aDsgfQorICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhbV9maXJzdFRy
aW1tYWJsZVJ1bkluZGV4Lmhhc1ZhbHVlKCk7IH0KKyAgICAgICAgYm9vbCBpc1RyYWlsaW5nUnVu
RnVsbHlUcmltbWFibGUoKSBjb25zdCB7IHJldHVybiBtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVu
dDsgfQorICAgICAgICBib29sIGlzVHJhaWxpbmdSdW5QYXJ0aWFsbHlUcmltbWFibGUoKSBjb25z
dCB7IHJldHVybiBtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRoOyB9CisKKyAgICAgICAgdm9pZCBy
ZXNldCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUnVuTGlzdCYgbV9ydW5zOworICAgICAg
ICBPcHRpb25hbDxzaXplX3Q+IG1fZmlyc3RUcmltbWFibGVSdW5JbmRleDsKKyAgICAgICAgYm9v
bCBtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCB7IGZhbHNlIH07CisgICAgICAgIElubGluZUxh
eW91dFVuaXQgbV9mdWxseVRyaW1tYWJsZVdpZHRoIHsgMCB9OworICAgICAgICBJbmxpbmVMYXlv
dXRVbml0IG1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGggeyAwIH07CisgICAgfTsKKworICAgIGNv
bnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0Owor
ICAgIFJ1bkxpc3QgbV9ydW5zOworICAgIFRyaW1tYWJsZVRyYWlsaW5nQ29udGVudCBtX3RyaW1t
YWJsZVRyYWlsaW5nQ29udGVudDsKKyAgICBJbmxpbmVMYXlvdXRVbml0IG1fY29udGVudExvZ2lj
YWxXaWR0aCB7IDAgfTsKKyAgICBzaXplX3QgbV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291
bnQgeyAwIH07CisgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gbV90cmFpbGluZ1NvZnRI
eXBoZW5XaWR0aCB7IDAgfTsKK307CisKK2lubGluZSB2b2lkIExpbmU6OlRyaW1tYWJsZVRyYWls
aW5nQ29udGVudDo6cmVzZXQoKQoreworICAgIG1faGFzRnVsbHlUcmltbWFibGVDb250ZW50ID0g
ZmFsc2U7CisgICAgbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4ID0geyB9OworICAgIG1fZnVsbHlU
cmltbWFibGVXaWR0aCA9IHsgfTsKKyAgICBtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRoID0geyB9
OworfQorCitpbmxpbmUgTGluZTo6UnVuOjpUcmFpbGluZ1doaXRlc3BhY2UgTGluZTo6UnVuOjp0
cmFpbGluZ1doaXRlc3BhY2VUeXBlKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRl
bSkgY29uc3QKK3sKKyAgICBpZiAoIWlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpKQorICAg
ICAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25lOworICAgIGlmIChJbmxpbmVUZXh0
SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtKSkKKyAgICAg
ICAgcmV0dXJuIFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm90Q29sbGFwc2libGU7CisgICAgaWYgKGlu
bGluZVRleHRJdGVtLmxlbmd0aCgpID09IDEpCisgICAgICAgIHJldHVybiBUcmFpbGluZ1doaXRl
c3BhY2U6OkNvbGxhcHNpYmxlOworICAgIHJldHVybiBUcmFpbGluZ1doaXRlc3BhY2U6OkNvbGxh
cHNlZDsKK30KKworaW5saW5lIHZvaWQgTGluZTo6UnVuOjpzZXROZWVkc0h5cGhlbihJbmxpbmVM
YXlvdXRVbml0IGh5cGhlbkxvZ2ljYWxXaWR0aCkKK3sKKyAgICBBU1NFUlQobV90ZXh0Q29udGVu
dCk7CisgICAgbV90ZXh0Q29udGVudC0+c2V0TmVlZHNIeXBoZW4oKTsKKyAgICBtX2xvZ2ljYWxX
aWR0aCArPSBoeXBoZW5Mb2dpY2FsV2lkdGg7Cit9CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0
aW5nL0lubGluZUxpbmVCb3guY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmVk
MjEzYWUwMWNhYTM5NWE3OTg0MjExOGI5OTk3MjMxZThkMjBlMjkKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRp
bmcvSW5saW5lTGluZUJveC5jcHAKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgorCisjaWYgRU5BQkxF
KExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRy
eS5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OklubGlu
ZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxM
ZWZ0LCBJbmxpbmVMYXlvdXRTaXplIGxvZ2ljYWxTaXplLCBUeXBlIHR5cGUpCisgICAgOiBtX2xh
eW91dEJveChtYWtlV2Vha1B0cihsYXlvdXRCb3gpKQorICAgICwgbV9sb2dpY2FsUmVjdCh7IH0s
IGxvZ2ljYWxMZWZ0LCBsb2dpY2FsU2l6ZS53aWR0aCgpLCBsb2dpY2FsU2l6ZS5oZWlnaHQoKSkK
KyAgICAsIG1fdHlwZSh0eXBlKQoreworfQorCit2b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94
OjpzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKQoreworICAgIC8vIEZJWE1F
OiBSZW1vdmUgbGVnYWN5IHJvdW5kaW5nLgorICAgIG1fYmFzZWxpbmUgPSByb3VuZFRvSW50KGJh
c2VsaW5lKTsKK30KKwordm9pZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0RGVzY2VudChJ
bmxpbmVMYXlvdXRVbml0IGRlc2NlbnQpCit7CisgICAgLy8gRklYTUU6IFJlbW92ZSBsZWdhY3kg
cm91bmRpbmcuCisgICAgbV9kZXNjZW50ID0gcm91bmRUb0ludChkZXNjZW50KTsKK30KKwordm9p
ZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0TGF5b3V0Qm91bmRzKGNvbnN0IExheW91dEJv
dW5kcyYgbGF5b3V0Qm91bmRzKQoreworICAgIC8vIEZJWE1FOiBSZW1vdmUgbGVnYWN5IHJvdW5k
aW5nLgorICAgIG1fbGF5b3V0Qm91bmRzID0geyBJbmxpbmVMYXlvdXRVbml0KHJvdW5kVG9JbnQo
bGF5b3V0Qm91bmRzLmFzY2VudCkpLCBJbmxpbmVMYXlvdXRVbml0KHJvdW5kVG9JbnQobGF5b3V0
Qm91bmRzLmRlc2NlbnQpKSB9OworfQorCit2b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94Ojpz
ZXRMb2dpY2FsVG9wKElubGluZUxheW91dFVuaXQgbG9naWNhbFRvcCkKK3sKKyAgICAvLyBGSVhN
RTogUmVtb3ZlIGxlZ2FjeSByb3VuZGluZy4KKyAgICBtX2xvZ2ljYWxSZWN0LnNldFRvcChyb3Vu
ZFRvSW50KGxvZ2ljYWxUb3ApKTsKK30KKwordm9pZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6
c2V0TG9naWNhbEhlaWdodChJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQpCit7CisgICAg
Ly8gRklYTUU6IFJlbW92ZSBsZWdhY3kgcm91bmRpbmcuCisgICAgbV9sb2dpY2FsUmVjdC5zZXRI
ZWlnaHQocm91bmRUb0ludChsb2dpY2FsSGVpZ2h0KSk7Cit9CisKK3ZvaWQgTGluZUJveDo6SW5s
aW5lTGV2ZWxCb3g6OnNldEhhc0NvbnRlbnQoKQoreworICAgIEFTU0VSVChpc0lubGluZUJveCgp
KTsKKyAgICBtX2hhc0NvbnRlbnQgPSB0cnVlOworfQorCitib29sIExpbmVCb3g6OklubGluZUxl
dmVsQm94OjpoYXNMaW5lQm94UmVsYXRpdmVBbGlnbm1lbnQoKSBjb25zdAoreworICAgIGF1dG8g
dmVydGljYWxBbGlnbm1lbnQgPSBsYXlvdXRCb3goKS5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKTsK
KyAgICByZXR1cm4gdmVydGljYWxBbGlnbm1lbnQgPT0gVmVydGljYWxBbGlnbjo6VG9wIHx8IHZl
cnRpY2FsQWxpZ25tZW50ID09IFZlcnRpY2FsQWxpZ246OkJvdHRvbTsKK30KKworTGluZUJveDo6
TGluZUJveChjb25zdCBCb3gmIHJvb3RMYXlvdXRCb3gsIGNvbnN0IElubGluZUxheW91dFBvaW50
JiBsb2dpY2FsVG9wbGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsaW5lTG9naWNhbFdpZHRoLCBJbmxp
bmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50
TG9naWNhbFdpZHRoLCBzaXplX3Qgbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50KQorICAg
IDogbV9sb2dpY2FsUmVjdChsb2dpY2FsVG9wbGVmdCwgSW5saW5lTGF5b3V0U2l6ZSB7IGxpbmVM
b2dpY2FsV2lkdGgsIHsgfSB9KQorICAgICwgbV9jb250ZW50TG9naWNhbFdpZHRoKGNvbnRlbnRM
b2dpY2FsV2lkdGgpCisgICAgLCBtX3Jvb3RJbmxpbmVCb3gocm9vdExheW91dEJveCwgY29udGVu
dExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgY29udGVudExvZ2ljYWxXaWR0aCwgeyB9
IH0sIElubGluZUxldmVsQm94OjpUeXBlOjpSb290SW5saW5lQm94KQoreworICAgIG1fbm9uUm9v
dElubGluZUxldmVsQm94TGlzdC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG5vblNwYW5uaW5nSW5s
aW5lTGV2ZWxCb3hDb3VudCk7CisgICAgbV9ub25Sb290SW5saW5lTGV2ZWxCb3hNYXAucmVzZXJ2
ZUluaXRpYWxDYXBhY2l0eShub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQpOworfQorCit2
b2lkIExpbmVCb3g6OmFkZElubGluZUxldmVsQm94KElubGluZUxldmVsQm94JiYgaW5saW5lTGV2
ZWxCb3gpCit7CisgICAgbV9ib3hUeXBlcy5hZGQoaW5saW5lTGV2ZWxCb3gudHlwZSgpKTsKKyAg
ICBtX25vblJvb3RJbmxpbmVMZXZlbEJveE1hcC5zZXQoJmlubGluZUxldmVsQm94LmxheW91dEJv
eCgpLCBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Quc2l6ZSgpKTsKKyAgICBtX25vblJvb3RJ
bmxpbmVMZXZlbEJveExpc3QuYXBwZW5kKFdURk1vdmUoaW5saW5lTGV2ZWxCb3gpKTsKK30KKwor
SW5saW5lUmVjdCBMaW5lQm94Ojpsb2dpY2FsUmVjdEZvclRleHRSdW4oY29uc3QgTGluZTo6UnVu
JiBydW4pIGNvbnN0Cit7CisgICAgQVNTRVJUKHJ1bi5pc1RleHQoKSB8fCBydW4uaXNTb2Z0TGlu
ZUJyZWFrKCkpOworICAgIGF1dG8qIHBhcmVudElubGluZUJveCA9ICZpbmxpbmVMZXZlbEJveEZv
ckxheW91dEJveChydW4ubGF5b3V0Qm94KCkucGFyZW50KCkpOworICAgIEFTU0VSVChwYXJlbnRJ
bmxpbmVCb3gtPmlzSW5saW5lQm94KCkpOworICAgIGF1dG8mIGZvbnRNZXRyaWNzID0gcGFyZW50
SW5saW5lQm94LT5zdHlsZSgpLmZvbnRNZXRyaWNzKCk7CisgICAgYXV0byBydW5sb2dpY2FsVG9w
ID0gcGFyZW50SW5saW5lQm94LT5sb2dpY2FsVG9wKCkgKyBwYXJlbnRJbmxpbmVCb3gtPmJhc2Vs
aW5lKCkgLSBmb250TWV0cmljcy5hc2NlbnQoKTsKKworICAgIHdoaWxlIChwYXJlbnRJbmxpbmVC
b3ggIT0gJm1fcm9vdElubGluZUJveCAmJiAhcGFyZW50SW5saW5lQm94LT5oYXNMaW5lQm94UmVs
YXRpdmVBbGlnbm1lbnQoKSkgeworICAgICAgICBwYXJlbnRJbmxpbmVCb3ggPSAmaW5saW5lTGV2
ZWxCb3hGb3JMYXlvdXRCb3gocGFyZW50SW5saW5lQm94LT5sYXlvdXRCb3goKS5wYXJlbnQoKSk7
CisgICAgICAgIEFTU0VSVChwYXJlbnRJbmxpbmVCb3gtPmlzSW5saW5lQm94KCkpOworICAgICAg
ICBydW5sb2dpY2FsVG9wICs9IHBhcmVudElubGluZUJveC0+bG9naWNhbFRvcCgpOworICAgIH0K
KyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQgPSBmb250TWV0cmljcy5oZWlnaHQo
KTsKKyAgICByZXR1cm4geyBydW5sb2dpY2FsVG9wLCBtX3Jvb3RJbmxpbmVCb3gubG9naWNhbExl
ZnQoKSArIHJ1bi5sb2dpY2FsTGVmdCgpLCBydW4ubG9naWNhbFdpZHRoKCksIGxvZ2ljYWxIZWln
aHQgfTsKK30KKworSW5saW5lUmVjdCBMaW5lQm94Ojpsb2dpY2FsUmVjdEZvckxpbmVCcmVha0Jv
eChjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94Lmlz
TGluZUJyZWFrQm94KCkpOworICAgIHJldHVybiBsb2dpY2FsUmVjdEZvcklubGluZUxldmVsQm94
KGxheW91dEJveCk7Cit9CisKK0lubGluZVJlY3QgTGluZUJveDo6bG9naWNhbFJlY3RGb3JJbmxp
bmVMZXZlbEJveChjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5
b3V0Qm94LmlzSW5saW5lTGV2ZWxCb3goKSB8fCBsYXlvdXRCb3guaXNMaW5lQnJlYWtCb3goKSk7
CisgICAgLy8gSW5saW5lIGxldmVsIGJveGVzIGFyZSByZWxhdGl2ZSB0byB0aGVpciBwYXJlbnQg
dW5sZXNzIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgbWFrZXMgdGhlbSByZWxhdGl2ZSB0byB0aGUg
bGluZSBib3ggKGUuZy4gdG9wLCBib3R0b20pLgorICAgIGF1dG8qIGlubGluZUJveCA9ICZpbmxp
bmVMZXZlbEJveEZvckxheW91dEJveChsYXlvdXRCb3gpOworICAgIGF1dG8gaW5saW5lQm94TG9n
aWNhbFJlY3QgPSBpbmxpbmVCb3gtPmxvZ2ljYWxSZWN0KCk7CisgICAgaWYgKGlubGluZUJveC0+
aGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpCisgICAgICAgIHJldHVybiBpbmxpbmVCb3hM
b2dpY2FsUmVjdDsKKworICAgIC8vIEZhc3QgcGF0aCBmb3IgaW5saW5lIGxldmVsIGJveGVzIG9u
IHRoZSByb290IGlubGluZSBib3ggKGUuZyA8ZGl2PjxpbWc+PC9kaXY+KS4KKyAgICBpZiAoJmxh
eW91dEJveC5wYXJlbnQoKSA9PSAmbV9yb290SW5saW5lQm94LmxheW91dEJveCgpKSB7CisgICAg
ICAgIGlubGluZUJveExvZ2ljYWxSZWN0Lm1vdmVWZXJ0aWNhbGx5KG1fcm9vdElubGluZUJveC5s
b2dpY2FsVG9wKCkpOworICAgICAgICByZXR1cm4gaW5saW5lQm94TG9naWNhbFJlY3Q7CisgICAg
fQorCisgICAgLy8gZS5nIDxkaXY+PHNwYW4+PGltZz48L3NwYW4+PC9kaXY+CisgICAgYXV0byBp
bmxpbmVCb3hBYnNvbHV0ZWxvZ2ljYWxUb3AgPSBpbmxpbmVCb3hMb2dpY2FsUmVjdC50b3AoKTsK
KyAgICB3aGlsZSAoaW5saW5lQm94ICE9ICZtX3Jvb3RJbmxpbmVCb3ggJiYgIWlubGluZUJveC0+
aGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpIHsKKyAgICAgICAgaW5saW5lQm94ID0gJmlu
bGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGlubGluZUJveC0+bGF5b3V0Qm94KCkucGFyZW50KCkp
OworICAgICAgICBBU1NFUlQoaW5saW5lQm94LT5pc0lubGluZUJveCgpKTsKKyAgICAgICAgaW5s
aW5lQm94QWJzb2x1dGVsb2dpY2FsVG9wICs9IGlubGluZUJveC0+bG9naWNhbFRvcCgpOworICAg
IH0KKyAgICByZXR1cm4gSW5saW5lUmVjdCB7IGlubGluZUJveEFic29sdXRlbG9naWNhbFRvcCwg
aW5saW5lQm94TG9naWNhbFJlY3QubGVmdCgpLCBpbmxpbmVCb3hMb2dpY2FsUmVjdC53aWR0aCgp
LCBpbmxpbmVCb3hMb2dpY2FsUmVjdC5oZWlnaHQoKSB9OworfQorCitJbmxpbmVSZWN0IExpbmVC
b3g6OmxvZ2ljYWxCb3JkZXJCb3hGb3JBdG9taWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmIGxh
eW91dEJveCwgY29uc3QgQm94R2VvbWV0cnkmIGJveEdlb21ldHJ5KSBjb25zdAoreworICAgIEFT
U0VSVChsYXlvdXRCb3guaXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKTsKKyAgICBhdXRvIGxvZ2lj
YWxSZWN0ID0gbG9naWNhbFJlY3RGb3JJbmxpbmVMZXZlbEJveChsYXlvdXRCb3gpOworICAgIC8v
IElubGluZSBsZXZlbCBib3hlcyB1c2UgdGhlaXIgbWFyZ2luIGJveCBmb3IgdmVydGljYWwgYWxp
Z25tZW50LiBMZXQncyBjb3ZlcnQgdGhlbSB0byBib3JkZXIgYm94ZXMuCisgICAgbG9naWNhbFJl
Y3QubW92ZVZlcnRpY2FsbHkoYm94R2VvbWV0cnkubWFyZ2luQmVmb3JlKCkpOworICAgIGF1dG8g
dmVydGljYWxNYXJnaW4gPSBib3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUoKSArIGJveEdlb21ldHJ5
Lm1hcmdpbkFmdGVyKCk7CisgICAgbG9naWNhbFJlY3QuZXhwYW5kVmVydGljYWxseSgtdmVydGlj
YWxNYXJnaW4pOworICAgIHJldHVybiBsb2dpY2FsUmVjdDsKK30KKworSW5saW5lUmVjdCBMaW5l
Qm94Ojpsb2dpY2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBj
b25zdCBCb3hHZW9tZXRyeSYgYm94R2VvbWV0cnkpIGNvbnN0Cit7CisgICAgYXV0byBsb2dpY2Fs
UmVjdCA9IGxvZ2ljYWxSZWN0Rm9ySW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94KTsKKyAgICAvLyBU
aGlzIGxvZ2ljYWwgcmVjdCBpcyBhcyB0YWxsIGFzIHRoZSAidGV4dCIgY29udGVudCBpcy4gTGV0
J3MgYWRqdXN0IHdpdGggdmVydGljYWwgYm9yZGVyIGFuZCBwYWRkaW5nLgorICAgIGF1dG8gdmVy
dGljYWxCb3JkZXJBbmRQYWRkaW5nID0gYm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGJv
eEdlb21ldHJ5LnZlcnRpY2FsUGFkZGluZygpLnZhbHVlT3IoMF9sdSk7CisgICAgbG9naWNhbFJl
Y3QuZXhwYW5kVmVydGljYWxseSh2ZXJ0aWNhbEJvcmRlckFuZFBhZGRpbmcpOworICAgIGxvZ2lj
YWxSZWN0Lm1vdmVWZXJ0aWNhbGx5KC0oYm94R2VvbWV0cnkuYm9yZGVyVG9wKCkgKyBib3hHZW9t
ZXRyeS5wYWRkaW5nVG9wKCkudmFsdWVPcigwX2x1KSkpOworICAgIHJldHVybiBsb2dpY2FsUmVj
dDsKK30KKworfSAvLyBuYW1lc3BhY2UgTGF5b3V0Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250
ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guaCBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94LmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uNjkyZTk2NjM4MzhlZDMyYThkZGIxOWI1ZmVhZDI0Njk3OTlmMWMxMAotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94LmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQorCisjaW5jbHVkZSAiSW5saW5lTGluZS5oIgorI2luY2x1ZGUgIklubGluZVJlY3QuaCIK
KyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorI2luY2x1ZGUgPHd0Zi9VbmlxdWVS
ZWYuaD4KKyNpbmNsdWRlIDx3dGYvV2Vha1B0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7Citu
YW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgQm94R2VvbWV0cnk7CitjbGFzcyBJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dDsKK2NsYXNzIExpbmVCb3hCdWlsZGVyOworc3RydWN0IFNpbXBsaWZpZWRW
ZXJ0aWNhbEFsaWdubWVudDsKKworLy8gICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX18gTGluZSBCb3gKKy8vIHwgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gfCAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAorLy8gfCAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0t
LS0tLS0tLS0gUm9vdCBJbmxpbmUgQm94CisvLyB8fCAgIF9fX19fICAgIF9fXyAgICAgIF9fXyAg
ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisvLyB8fCAgfCAgICAgICAgLyAgIFwgICAg
LyAgIFwgICAgICAgICB8ICBJbmxpbmUgTGV2ZWwgQm94ICB8CisvLyB8fCAgfF9fX19fICB8ICAg
ICB8ICB8ICAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgIGFzY2VudAorLy8g
fHwgIHwgICAgICAgfCAgICAgfCAgfCAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAg
fAorLy8gfHxfX3xfX19fX19fX1xfX18vX19fX1xfX18vX19fX19fX19ffF9fX19fX19fX19fX19f
X19fX19ffF9fX19fX18gYWxpZ25tZW50X2Jhc2VsaW5lCisvLyB8fAorLy8gfHwgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW50CisvLyB8
fF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fXworLy8gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX18KKy8vIFRoZSByZXN1bHRpbmcgcmVjdGFuZ3VsYXIgYXJlYSB0
aGF0IGNvbnRhaW5zIHRoZSBib3hlcyB0aGF0IGZvcm0gYSBzaW5nbGUgbGluZSBvZiBpbmxpbmUt
bGV2ZWwgY29udGVudCBpcyBjYWxsZWQgYSBsaW5lIGJveC4KKy8vIGh0dHBzOi8vd3d3LnczLm9y
Zy9UUi9jc3MtaW5saW5lLTMvI21vZGVsCitjbGFzcyBMaW5lQm94IHsKKyAgICBXVEZfTUFLRV9G
QVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgSW5saW5lTGV2ZWxCb3ggeworICAg
IHB1YmxpYzoKKyAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGluZUxldmVsQm94IGNyZWF0ZUlu
bGluZUJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7CisgICAgICAgIHN0YXRpYyBMaW5lQm94OjpJbmxpbmVM
ZXZlbEJveCBjcmVhdGVBdG9taWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplKTsKKyAgICAgICAgc3RhdGljIExp
bmVCb3g6OklubGluZUxldmVsQm94IGNyZWF0ZUxpbmVCcmVha0JveChjb25zdCBCb3gmLCBJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KTsKKyAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGlu
ZUxldmVsQm94IGNyZWF0ZUdlbmVyaWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxMZWZ0KTsKKworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJhc2Vs
aW5lKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlbGluZTsgfQorICAgICAgICBPcHRpb25hbDxJbmxp
bmVMYXlvdXRVbml0PiBkZXNjZW50KCkgY29uc3QgeyByZXR1cm4gbV9kZXNjZW50OyB9CisgICAg
ICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWlubGluZS0zLyNsYXlvdXQtYm91
bmRzCisgICAgICAgIHN0cnVjdCBMYXlvdXRCb3VuZHMgeworICAgICAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBhc2NlbnQgKyBkZXNjZW50OyB9CisgICAg
ICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGF5b3V0Qm91bmRzJiBvdGhlcikgY29uc3Qg
eyByZXR1cm4gYXNjZW50ID09IG90aGVyLmFzY2VudCAmJiBkZXNjZW50ID09IG90aGVyLmRlc2Nl
bnQ7IH0KKworICAgICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBhc2NlbnQgeyAwIH07CisgICAg
ICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGRlc2NlbnQgeyAwIH07CisgICAgICAgIH07CisgICAg
ICAgIExheW91dEJvdW5kcyBsYXlvdXRCb3VuZHMoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJv
dW5kczsgfQorCisgICAgICAgIGJvb2wgaGFzQ29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1faGFz
Q29udGVudDsgfQorICAgICAgICB2b2lkIHNldEhhc0NvbnRlbnQoKTsKKworICAgICAgICBWZXJ0
aWNhbEFsaWduIHZlcnRpY2FsQWxpZ24oKSBjb25zdCB7IHJldHVybiBsYXlvdXRCb3goKS5zdHls
ZSgpLnZlcnRpY2FsQWxpZ24oKTsgfQorICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNv
bnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQorICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYg
c3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJveC0+c3R5bGUoKTsgfQorCisgICAgICAg
IGJvb2wgaXNJbmxpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gVHlwZTo6SW5saW5l
Qm94IHx8IG1fdHlwZSA9PSBUeXBlOjpSb290SW5saW5lQm94OyB9CisgICAgICAgIGJvb2wgaXNS
b290SW5saW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IFR5cGU6OlJvb3RJbmxpbmVC
b3g7IH0KKyAgICAgICAgYm9vbCBpc0F0b21pY0lubGluZUxldmVsQm94KCkgY29uc3QgeyByZXR1
cm4gbV90eXBlID09IFR5cGU6OkF0b21pY0lubGluZUxldmVsQm94OyB9CisgICAgICAgIGJvb2wg
aXNMaW5lQnJlYWtCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gVHlwZTo6TGluZUJyZWFr
Qm94OyB9CisgICAgICAgIGJvb2wgaGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkgY29uc3Q7
CisKKyAgICAgICAgZW51bSBjbGFzcyBUeXBlIDogdWludDhfdCB7CisgICAgICAgICAgICBJbmxp
bmVCb3ggICAgICAgICAgICAgPSAxIDw8IDAsCisgICAgICAgICAgICBSb290SW5saW5lQm94ICAg
ICAgICAgPSAxIDw8IDEsCisgICAgICAgICAgICBBdG9taWNJbmxpbmVMZXZlbEJveCAgPSAxIDw8
IDIsCisgICAgICAgICAgICBMaW5lQnJlYWtCb3ggICAgICAgICAgPSAxIDw8IDMsCisgICAgICAg
ICAgICBHZW5lcmljSW5saW5lTGV2ZWxCb3ggPSAxIDw8IDQKKyAgICAgICAgfTsKKyAgICAgICAg
VHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9CisKKyAgICAgICAgSW5saW5lTGV2
ZWxCb3goY29uc3QgQm94JiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5
b3V0U2l6ZSwgVHlwZSk7CisgICAgICAgIElubGluZUxldmVsQm94KCkgPSBkZWZhdWx0OworCisg
ICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBTaW1wbGlmaWVkVmVydGljYWxBbGln
bm1lbnQ7CisgICAgICAgIGZyaWVuZCBjbGFzcyBMaW5lQm94QnVpbGRlcjsKKyAgICAgICAgZnJp
ZW5kIGNsYXNzIExpbmVCb3g7CisKKyAgICAgICAgY29uc3QgSW5saW5lUmVjdCYgbG9naWNhbFJl
Y3QoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0OyB9CisgICAgICAgIElubGluZUxheW91
dFVuaXQgbG9naWNhbFRvcCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3QudG9wKCk7IH0K
KyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsQm90dG9tKCkgY29uc3QgeyByZXR1cm4g
bV9sb2dpY2FsUmVjdC5ib3R0b20oKTsgfQorICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxMZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5sZWZ0KCk7IH0KKyAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxS
ZWN0LndpZHRoKCk7IH0KKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KCkg
Y29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5oZWlnaHQoKTsgfQorCisgICAgICAgIHZvaWQg
c2V0TG9naWNhbFdpZHRoKElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKSB7IG1fbG9naWNh
bFJlY3Quc2V0V2lkdGgobG9naWNhbFdpZHRoKTsgfQorICAgICAgICB2b2lkIHNldExvZ2ljYWxI
ZWlnaHQoSW5saW5lTGF5b3V0VW5pdCk7CisgICAgICAgIHZvaWQgc2V0TG9naWNhbFRvcChJbmxp
bmVMYXlvdXRVbml0KTsKKyAgICAgICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0
KTsKKyAgICAgICAgdm9pZCBzZXREZXNjZW50KElubGluZUxheW91dFVuaXQpOworICAgICAgICB2
b2lkIHNldExheW91dEJvdW5kcyhjb25zdCBMYXlvdXRCb3VuZHMmKTsKKworICAgIHByaXZhdGU6
CisgICAgICAgIFdlYWtQdHI8Y29uc3QgQm94PiBtX2xheW91dEJveDsKKyAgICAgICAgLy8gVGhp
cyBpcyB0aGUgY29tYmluYXRpb24gb2YgbWFyZ2luIGFuZCBib3JkZXIgYm94ZXMuIElubGluZSBs
ZXZlbCBib3hlcyBhcmUgdmVydGljYWxseSBhbGlnbmVkIHVzaW5nIHRoZWlyIG1hcmdpbiBib3hl
cy4KKyAgICAgICAgSW5saW5lUmVjdCBtX2xvZ2ljYWxSZWN0OworICAgICAgICBMYXlvdXRCb3Vu
ZHMgbV9sYXlvdXRCb3VuZHM7CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9iYXNlbGluZSB7
IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gbV9kZXNjZW50OworICAg
ICAgICBib29sIG1faGFzQ29udGVudCB7IGZhbHNlIH07CisgICAgICAgIFR5cGUgbV90eXBlIHsg
VHlwZTo6SW5saW5lQm94IH07CisgICAgfTsKKworICAgIExpbmVCb3goY29uc3QgQm94JiByb290
TGF5b3V0Qm94LCBjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgbG9naWNhbFRvcExlZnQsIElubGlu
ZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxpbmVMb2dp
Y2FsV2lkdGgsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCwgc2l6ZV90IG5v
blNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCk7CisKKyAgICBjb25zdCBJbmxpbmVSZWN0JiBs
b2dpY2FsUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3Q7IH0KKyAgICBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxTaXplKCkud2lk
dGgoKTsgfQorICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbEhlaWdodCgpIGNvbnN0IHsgcmV0
dXJuIGxvZ2ljYWxTaXplKCkuaGVpZ2h0KCk7IH0KKyAgICBJbmxpbmVMYXlvdXRQb2ludCBsb2dp
Y2FsVG9wTGVmdCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkudG9wTGVmdCgpOyB9Cisg
ICAgSW5saW5lTGF5b3V0U2l6ZSBsb2dpY2FsU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxS
ZWN0KCkuc2l6ZSgpOyB9CisgICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRo
KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50TG9naWNhbFdpZHRoOyB9CisKKyAgICAvLyBOb3Rl
IHRoYXQgdGhlIGxpbmUgY2FuIGhhdmUgbWFueSBpbmxpbmUgYm94ZXMgYW5kIGJlICJlbXB0eSIg
dGhlIHNhbWUgdGltZSBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2Rpdj4K
KyAgICBib29sIGhhc0NvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX2hhc0NvbnRlbnQ7IH0KKyAg
ICBib29sIGhhc0lubGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYm94VHlwZXMuY29udGFpbnMo
SW5saW5lTGV2ZWxCb3g6OlR5cGU6OklubGluZUJveCk7IH0KKyAgICBib29sIGhhc05vbklubGlu
ZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYm94VHlwZXMuY29udGFpbnNBbnkoeyBJbmxpbmVMZXZl
bEJveDo6VHlwZTo6QXRvbWljSW5saW5lTGV2ZWxCb3gsIElubGluZUxldmVsQm94OjpUeXBlOjpM
aW5lQnJlYWtCb3gsIElubGluZUxldmVsQm94OjpUeXBlOjpHZW5lcmljSW5saW5lTGV2ZWxCb3gg
fSk7IH0KKyAgICBib29sIGhhc0F0b21pY0lubGluZUxldmVsQm94KCkgY29uc3QgeyByZXR1cm4g
bV9ib3hUeXBlcy5jb250YWlucyhJbmxpbmVMZXZlbEJveDo6VHlwZTo6QXRvbWljSW5saW5lTGV2
ZWxCb3gpOyB9CisKKyAgICBjb25zdCBJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3hGb3JM
YXlvdXRCb3goY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8
TGluZUJveCY+KCp0aGlzKS5pbmxpbmVMZXZlbEJveEZvckxheW91dEJveChsYXlvdXRCb3gpOyB9
CisKKyAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9yVGV4dFJ1bihjb25zdCBMaW5lOjpSdW4m
KSBjb25zdDsKKyAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9yTGluZUJyZWFrQm94KGNvbnN0
IEJveCYpIGNvbnN0OworICAgIElubGluZVJlY3QgbG9naWNhbFJlY3RGb3JSb290SW5saW5lQm94
KCkgY29uc3QgeyByZXR1cm4gbV9yb290SW5saW5lQm94LmxvZ2ljYWxSZWN0KCk7IH0KKyAgICBJ
bmxpbmVSZWN0IGxvZ2ljYWxCb3JkZXJCb3hGb3JBdG9taWNJbmxpbmVMZXZlbEJveChjb25zdCBC
b3gmLCBjb25zdCBCb3hHZW9tZXRyeSYpIGNvbnN0OworICAgIElubGluZVJlY3QgbG9naWNhbEJv
cmRlckJveEZvcklubGluZUJveChjb25zdCBCb3gmLCBjb25zdCBCb3hHZW9tZXRyeSYpIGNvbnN0
OworCisgICAgY29uc3QgSW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3goKSBjb25zdCB7IHJl
dHVybiBtX3Jvb3RJbmxpbmVCb3g7IH0KKyAgICB1c2luZyBJbmxpbmVMZXZlbEJveExpc3QgPSBW
ZWN0b3I8SW5saW5lTGV2ZWxCb3g+OworICAgIGNvbnN0IElubGluZUxldmVsQm94TGlzdCYgbm9u
Um9vdElubGluZUxldmVsQm94ZXMoKSBjb25zdCB7IHJldHVybiBtX25vblJvb3RJbmxpbmVMZXZl
bEJveExpc3Q7IH0KKworICAgIElubGluZUxheW91dFVuaXQgYWxpZ25tZW50QmFzZWxpbmUoKSBj
b25zdCB7IHJldHVybiBtX3Jvb3RJbmxpbmVCb3gubG9naWNhbFRvcCgpICsgbV9yb290SW5saW5l
Qm94LmJhc2VsaW5lKCk7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgTGluZUJveEJ1
aWxkZXI7CisKKyAgICB2b2lkIHNldExvZ2ljYWxIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCBsb2dp
Y2FsSGVpZ2h0KSB7IG1fbG9naWNhbFJlY3Quc2V0SGVpZ2h0KGxvZ2ljYWxIZWlnaHQpOyB9CisK
KyAgICB2b2lkIGFkZElubGluZUxldmVsQm94KElubGluZUxldmVsQm94JiYpOworICAgIElubGlu
ZUxldmVsQm94TGlzdCYgbm9uUm9vdElubGluZUxldmVsQm94ZXMoKSB7IHJldHVybiBtX25vblJv
b3RJbmxpbmVMZXZlbEJveExpc3Q7IH0KKworICAgIElubGluZUxldmVsQm94JiByb290SW5saW5l
Qm94KCkgeyByZXR1cm4gbV9yb290SW5saW5lQm94OyB9CisKKyAgICBJbmxpbmVMZXZlbEJveCYg
aW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3goY29uc3QgQm94JiBsYXlvdXRCb3gpIHsgcmV0dXJu
ICZsYXlvdXRCb3ggPT0gJm1fcm9vdElubGluZUJveC5sYXlvdXRCb3goKSA/IG1fcm9vdElubGlu
ZUJveCA6IG1fbm9uUm9vdElubGluZUxldmVsQm94TGlzdFttX25vblJvb3RJbmxpbmVMZXZlbEJv
eE1hcC5nZXQoJmxheW91dEJveCldOyB9CisgICAgSW5saW5lUmVjdCBsb2dpY2FsUmVjdEZvcklu
bGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdDsKKworICAgIHZvaWQgc2V0
SGFzQ29udGVudChib29sIGhhc0NvbnRlbnQpIHsgbV9oYXNDb250ZW50ID0gaGFzQ29udGVudDsg
fQorCitwcml2YXRlOgorICAgIElubGluZVJlY3QgbV9sb2dpY2FsUmVjdDsKKyAgICBJbmxpbmVM
YXlvdXRVbml0IG1fY29udGVudExvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICBib29sIG1faGFzQ29u
dGVudCB7IGZhbHNlIH07CisgICAgT3B0aW9uU2V0PElubGluZUxldmVsQm94OjpUeXBlPiBtX2Jv
eFR5cGVzOworCisgICAgSW5saW5lTGV2ZWxCb3ggbV9yb290SW5saW5lQm94OworICAgIElubGlu
ZUxldmVsQm94TGlzdCBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Q7CisKKyAgICBIYXNoTWFw
PGNvbnN0IEJveCosIHNpemVfdD4gbV9ub25Sb290SW5saW5lTGV2ZWxCb3hNYXA7Cit9OworCitp
bmxpbmUgTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNy
ZWF0ZUF0b21pY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIGxvZ2ljYWxTaXplKQoreworICAg
IHJldHVybiBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCB7IGxheW91dEJveCwgbG9naWNhbExlZnQs
IGxvZ2ljYWxTaXplLCBUeXBlOjpBdG9taWNJbmxpbmVMZXZlbEJveCB9OworfQorCitpbmxpbmUg
TGluZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUlu
bGluZUJveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVm
dCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7CisgICAgcmV0dXJuIExpbmVCb3g6
OklubGluZUxldmVsQm94IHsgbGF5b3V0Qm94LCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0U2l6
ZSB7IGxvZ2ljYWxXaWR0aCwgeyB9IH0sIFR5cGU6OklubGluZUJveCB9OworfQorCitpbmxpbmUg
TGluZUJveDo6SW5saW5lTGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUxp
bmVCcmVha0JveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
TGVmdCkKK3sKKyAgICByZXR1cm4gTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggeyBsYXlvdXRCb3gs
IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgfSwgVHlwZTo6TGluZUJyZWFrQm94IH07
Cit9CisKK2lubGluZSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveDo6Y3JlYXRlR2VuZXJpY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KQoreworICAgIHJldHVybiBMaW5lQm94OjpJbmxp
bmVMZXZlbEJveCB7IGxheW91dEJveCwgbG9naWNhbExlZnQsIElubGluZUxheW91dFNpemUgeyB9
LCBUeXBlOjpHZW5lcmljSW5saW5lTGV2ZWxCb3ggfTsKK30KKworfQorfQorCisjZW5kaWYKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5l
Zm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxkZXIuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjZjNjI2ZWEwZWU1YTYzYTRhOTYyYjE1NWNlNjEwNjUzMGZjZTIyZjIKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxkZXIuY3BwCkBAIC0wLDAgKzEsODU3IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklubGluZUxpbmVC
dWlsZGVyLmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2lu
Y2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250
ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0
cnkuaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUgIlRleHRVdGlsLmgiCisj
aW5jbHVkZSA8d3RmL3VuaWNvZGUvQ2hhcmFjdGVyTmFtZXMuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBlbmRzV2l0aFNv
ZnRXcmFwT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5lVGV4dEl0ZW0mIGN1cnJlbnRUZXh0SXRlbSwg
Y29uc3QgSW5saW5lVGV4dEl0ZW0mIG5leHRJbmxpbmVUZXh0SXRlbSkKK3sKKyAgICBBU1NFUlQo
IW5leHRJbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSk7CisgICAgLy8gV2UgYXJlIGF0IHRo
ZSBwb3NpdGlvbiBhZnRlciBhIHdoaXRlc3BhY2UuCisgICAgaWYgKGN1cnJlbnRUZXh0SXRlbS5p
c1doaXRlc3BhY2UoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gV2hlbiBib3RoIHRo
ZXNlIG5vbi13aGl0ZXNwYWNlIHJ1bnMgYmVsb25nIHRvIHRoZSBzYW1lIGxheW91dCBib3gsIGl0
J3MgZ3VhcmFudGVlZCB0aGF0CisgICAgLy8gdGhleSBhcmUgc3BsaXQgYXQgYSBzb2Z0IGJyZWFr
aW5nIG9wcG9ydHVuaXR5LiBTZWUgSW5saW5lVGV4dEl0ZW06Om1vdmVUb05leHRCcmVha2FibGVQ
b3NpdGlvbi4KKyAgICBpZiAoJmN1cnJlbnRUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkgPT0gJm5l
eHRJbmxpbmVUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkpCisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGNvbGxlY3QgYXQgbGVhc3QgMyBhZGphY2VudCBjaGFyYWN0
ZXJzIHRvIGJlIGFibGUgdG8gbWFrZSBhIGRlY2lzaW9uIHdoZXRoZXIgdGhlIHByZXZpb3VzIHRl
eHQgaXRlbSBlbmRzIHdpdGggYnJlYWtpbmcgb3Bwb3J0dW5pdHkuCisgICAgLy8gW2V4LV1bYW1w
bGVdIDwtIHNlY29uZCB0byBsYXN0W3hdIGxhc3RbLV0gY3VycmVudFthXQorICAgIC8vIFdlIG5l
ZWQgYXQgbGVhc3QgMSBjaGFyYWN0ZXIgaW4gdGhlIGN1cnJlbnQgaW5saW5lIHRleHQgaXRlbSBh
bmQgMiBtb3JlIGZyb20gcHJldmlvdXMgaW5saW5lIGl0ZW1zLgorICAgIGF1dG8gcHJldmlvdXND
b250ZW50ID0gY3VycmVudFRleHRJdGVtLmlubGluZVRleHRCb3goKS5jb250ZW50KCk7CisgICAg
YXV0byBsaW5lQnJlYWtJdGVyYXRvciA9IExhenlMaW5lQnJlYWtJdGVyYXRvciB7IG5leHRJbmxp
bmVUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpIH07CisgICAgYXV0byBwcmV2aW91
c0NvbnRlbnRMZW5ndGggPSBwcmV2aW91c0NvbnRlbnQubGVuZ3RoKCk7CisgICAgLy8gRklYTUU6
IFdlIHNob3VsZCBsb29rIGludG8gdGhlIGVudGlyZSB1bmNvbW1pdHRlZCBjb250ZW50IGZvciBt
b3JlIHRleHQgY29udGV4dC4KKyAgICBVQ2hhciBsYXN0Q2hhcmFjdGVyID0gcHJldmlvdXNDb250
ZW50TGVuZ3RoID8gcHJldmlvdXNDb250ZW50W3ByZXZpb3VzQ29udGVudExlbmd0aCAtIDFdIDog
MDsKKyAgICBpZiAobGFzdENoYXJhY3RlciA9PSBzb2Z0SHlwaGVuICYmIGN1cnJlbnRUZXh0SXRl
bS5zdHlsZSgpLmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpOb25lKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgVUNoYXIgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gcHJldmlvdXNDb250ZW50TGVu
Z3RoID4gMSA/IHByZXZpb3VzQ29udGVudFtwcmV2aW91c0NvbnRlbnRMZW5ndGggLSAyXSA6IDA7
CisgICAgbGluZUJyZWFrSXRlcmF0b3Iuc2V0UHJpb3JDb250ZXh0KGxhc3RDaGFyYWN0ZXIsIHNl
Y29uZFRvTGFzdENoYXJhY3Rlcik7CisgICAgLy8gTm93IGNoZWNrIGlmIHdlIGNhbiBicmVhayBy
aWdodCBhdCB0aGUgaW5saW5lIGl0ZW0gYm91bmRhcnkuCisgICAgLy8gV2l0aCB0aGUgW2V4LWFt
cGxlXSwgZmluZE5leHRCcmVha2FibGVQb3NpdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBzdGFydFBv
c2l0aW9uICgwKS4KKyAgICAvLyBGSVhNRTogQ2hlY2sgaWYgdGhlcmUncyBhIG1vcmUgY29ycmVj
dCB3YXkgb2YgZmluZGluZyBicmVha2luZyBvcHBvcnR1bml0aWVzLgorICAgIHJldHVybiAhVGV4
dFV0aWw6OmZpbmROZXh0QnJlYWthYmxlUG9zaXRpb24obGluZUJyZWFrSXRlcmF0b3IsIDAsIG5l
eHRJbmxpbmVUZXh0SXRlbS5zdHlsZSgpKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzQXRT
b2Z0V3JhcE9wcG9ydHVuaXR5KGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCwgY29uc3QgSW5saW5lSXRlbSYgY3VycmVudCwgY29uc3QgSW5saW5l
SXRlbSYgbmV4dCkKK3sKKyAgICAvLyAiaXMgYXQiIHNpbXBsZSBtZWFucyB0aGF0IHRoZXJlJ3Mg
YSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgcmlnaHQgYWZ0ZXIgdGhlIFtjdXJyZW50XS4KKyAgICAv
LyBbdGV4dF1bIF1bdGV4dF1baW5saW5lIGJveCBzdGFydF0uLi4gKDxkaXY+dGV4dCBjb250ZW50
PHNwYW4+Li48L2Rpdj4pCisgICAgLy8gc29mdCB3cmFwIGluZGV4ZXM6IDAgYW5kIDEgZGVmaW5p
dGVseSwgMiBkZXBlbmRzIG9uIHRoZSBjb250ZW50IGFmdGVyIHRoZSBbaW5saW5lIGJveCBzdGFy
dF0uCisKKyAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jbGluZS1i
cmVhay1kZXRhaWxzCisgICAgLy8gRmlndXJlIG91dCBpZiB0aGUgbmV3IGluY29taW5nIGNvbnRl
bnQgcHV0cyB0aGUgdW5jb21taXR0ZWQgY29udGVudCBvbiBhIHNvZnQgd3JhcCBvcHBvcnR1bml0
eS4KKyAgICAvLyBlLmcuIFtpbmxpbmUgYm94IHN0YXJ0XVtwcmlvcl9jb250aW51b3VzX2NvbnRl
bnRdW2lubGluZSBib3ggZW5kXSAoPHNwYW4+cHJpb3JfY29udGludW91c19jb250ZW50PC9zcGFu
PikKKyAgICAvLyBBbiBpbmNvbWluZyA8aW1nPiBib3ggd291bGQgZW5hYmxlIHVzIHRvIGNvbW1p
dCB0aGUgIjxzcGFuPnByaW9yX2NvbnRpbnVvdXNfY29udGVudDwvc3Bhbj4iIGNvbnRlbnQKKyAg
ICAvLyBidXQgYW4gaW5jb21pbmcgdGV4dCBjb250ZW50IHdvdWxkIG5vdCBuZWNlc3NhcmlseS4K
KyAgICBBU1NFUlQoY3VycmVudC5pc1RleHQoKSB8fCBjdXJyZW50LmlzQm94KCkgfHwgY3VycmVu
dC5pc0Zsb2F0KCkpOworICAgIEFTU0VSVChuZXh0LmlzVGV4dCgpIHx8IG5leHQuaXNCb3goKSB8
fCBuZXh0LmlzRmxvYXQoKSk7CisgICAgaWYgKGN1cnJlbnQuaXNUZXh0KCkgJiYgbmV4dC5pc1Rl
eHQoKSkgeworICAgICAgICBhdXRvJiBjdXJyZW50SW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJ
bmxpbmVUZXh0SXRlbT4oY3VycmVudCk7CisgICAgICAgIGF1dG8mIG5leHRJbmxpbmVUZXh0SXRl
bSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihuZXh0KTsKKyAgICAgICAgaWYgKGN1cnJlbnRJ
bmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkgeworICAgICAgICAgICAgLy8gWyBdW3RleHRd
IDogYWZ0ZXIgW3doaXRlc3BhY2VdIHBvc2l0aW9uIGlzIGEgc29mdCB3cmFwIG9wcG9ydHVuaXR5
LgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5leHRJ
bmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkgeworICAgICAgICAgICAgLy8gW3RleHRdWyBd
ICg8c3Bhbj50ZXh0PC9zcGFuPiApCisgICAgICAgICAgICAvLyB3aGl0ZS1zcGFjZTogYnJlYWst
c3BhY2VzOiBsaW5lIGJyZWFraW5nIG9wcG9ydHVuaXR5IGV4aXN0cyBhZnRlciBldmVyeSBwcmVz
ZXJ2ZWQgd2hpdGUgc3BhY2UgY2hhcmFjdGVyLCBidXQgbm90IGJlZm9yZS4KKyAgICAgICAgICAg
IHJldHVybiBuZXh0SW5saW5lVGV4dEl0ZW0uc3R5bGUoKS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVT
cGFjZTo6QnJlYWtTcGFjZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnQuc3R5bGUo
KS5saW5lQnJlYWsoKSA9PSBMaW5lQnJlYWs6OkFueXdoZXJlIHx8IG5leHQuc3R5bGUoKS5saW5l
QnJlYWsoKSA9PSBMaW5lQnJlYWs6OkFueXdoZXJlKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBp
cyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBhcm91bmQgZXZlcnkgdHlwb2dyYXBoaWMgY2hhcmFj
dGVyIHVuaXQsIGluY2x1ZGluZyBhcm91bmQgYW55IHB1bmN0dWF0aW9uIGNoYXJhY3RlcgorICAg
ICAgICAgICAgLy8gb3IgcHJlc2VydmVkIHdoaXRlIHNwYWNlcywgb3IgaW4gdGhlIG1pZGRsZSBv
ZiB3b3Jkcy4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC8v
IEJvdGggY3VycmVudCBhbmQgbmV4dCBpdGVtcyBhcmUgbm9uLXdoaXRlc3BhY2UgdGV4dC4KKyAg
ICAgICAgLy8gW3RleHRdW3RleHRdIDogaXMgYSBjb250aW51b3VzIGNvbnRlbnQuCisgICAgICAg
IC8vIFt0ZXh0LV1bdGV4dF0gOiBhZnRlciBbaHlwaGVuXSBwb3NpdGlvbiBpcyBhIHNvZnQgd3Jh
cCBvcHBvcnR1bml0eS4KKyAgICAgICAgcmV0dXJuIGVuZHNXaXRoU29mdFdyYXBPcHBvcnR1bml0
eShjdXJyZW50SW5saW5lVGV4dEl0ZW0sIG5leHRJbmxpbmVUZXh0SXRlbSk7CisgICAgfQorICAg
IGlmIChjdXJyZW50LmlzRmxvYXQoKSB8fCBuZXh0LmlzRmxvYXQoKSkgeworICAgICAgICAvLyBX
aGlsZSBmbG9hdHMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBpbmxpbmUgY29udGVudCBhbmQgdGhleSBh
cmUgbm90IHN1cHBvc2VkIHRvIGludHJvZHVjZSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdGllcywKKyAg
ICAgICAgLy8gZS5nLiBbdGV4dF1bZmxvYXQgYm94XVtmbG9hdCBib3hdW3RleHRdW2Zsb2F0IGJv
eF1bdGV4dF0gaXMgZXNzZW50aWFsbHkganVzdCBbdGV4dF1bdGV4dF1bdGV4dF0KKyAgICAgICAg
Ly8gZmlndXJpbmcgb3V0IHdoZXRoZXIgYSBmbG9hdCAob3Igc2V0IG9mIGZsb2F0cykgc2hvdWxk
IHN0YXkgb24gdGhlIGxpbmUgb3Igbm90IChhbmQgaGFuZGxlIHBvdGVudGlhbGx5IG91dCBvZiBv
cmRlciBpbmxpbmUgaXRlbXMpCisgICAgICAgIC8vIGJyaW5ncyBpbiB1bm5lY2Vzc2FyeSBjb21w
bGV4aXR5LgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGN1cnJlbnQuaXNC
b3goKSB8fCBuZXh0LmlzQm94KCkpIHsKKyAgICAgICAgYXV0byBpc0ltYWdlQ29udGVudCA9IGN1
cnJlbnQubGF5b3V0Qm94KCkuaXNJbWFnZSgpIHx8IG5leHQubGF5b3V0Qm94KCkuaXNJbWFnZSgp
OworICAgICAgICBpZiAoaXNJbWFnZUNvbnRlbnQpCisgICAgICAgICAgICByZXR1cm4gaW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQucXVpcmtzKCkuaGFzU29mdFdyYXBPcHBvcnR1bml0eUF0SW1hZ2Uo
KTsKKyAgICAgICAgLy8gW3RleHRdW2lubGluZSBib3ggc3RhcnRdW2lubGluZSBib3ggZW5kXVtp
bmxpbmUgYm94XSAodGV4dDxzcGFuPjwvc3Bhbj48aW1nPikgOiB0aGVyZSdzIGEgc29mdCB3cmFw
IG9wcG9ydHVuaXR5IGJldHdlZW4gdGhlIFt0ZXh0XSBhbmQgW2ltZ10uCisgICAgICAgIC8vIFRo
ZSBsaW5lIGJyZWFraW5nIGJlaGF2aW9yIG9mIGEgcmVwbGFjZWQgZWxlbWVudCBvciBvdGhlciBh
dG9taWMgaW5saW5lIGlzIGVxdWl2YWxlbnQgdG8gYW4gaWRlb2dyYXBoaWMgY2hhcmFjdGVyLgor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3N0cnVjdCBMaW5lQ2FuZGlkYXRlIHsKKyAgICBMaW5lQ2Fu
ZGlkYXRlKGJvb2wgaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKTsKKworICAgIHZvaWQgcmVz
ZXQoKTsKKworICAgIHN0cnVjdCBJbmxpbmVDb250ZW50IHsKKyAgICAgICAgSW5saW5lQ29udGVu
dChib29sIGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZyk7CisKKyAgICAgICAgY29uc3QgSW5s
aW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCgp
IGNvbnN0IHsgcmV0dXJuIG1fY29udGludW91c0NvbnRlbnQ7IH0KKyAgICAgICAgY29uc3QgSW5s
aW5lSXRlbSogdHJhaWxpbmdMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nTGlu
ZUJyZWFrOyB9CisgICAgICAgIGNvbnN0IElubGluZUl0ZW0qIHRyYWlsaW5nV29yZEJyZWFrT3Bw
b3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHk7
IH0KKworICAgICAgICB2b2lkIGFwcGVuZElubGluZUl0ZW0oY29uc3QgSW5saW5lSXRlbSYsIElu
bGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICAgICAgdm9pZCBhcHBlbmRUcmFpbGlu
Z0xpbmVCcmVhayhjb25zdCBJbmxpbmVJdGVtJiBsaW5lQnJlYWtJdGVtKSB7IG1fdHJhaWxpbmdM
aW5lQnJlYWsgPSAmbGluZUJyZWFrSXRlbTsgfQorICAgICAgICB2b2lkIGFwcGVuZHRyYWlsaW5n
V29yZEJyZWFrT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5lSXRlbSYgd29yZEJyZWFrSXRlbSkgeyBt
X3RyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkgPSAmd29yZEJyZWFrSXRlbTsgfQorICAgICAg
ICB2b2lkIHJlc2V0KCk7CisgICAgICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1f
Y29udGludW91c0NvbnRlbnQucnVucygpLmlzRW1wdHkoKSAmJiAhdHJhaWxpbmdXb3JkQnJlYWtP
cHBvcnR1bml0eSgpICYmICF0cmFpbGluZ0xpbmVCcmVhaygpOyB9CisgICAgICAgIGJvb2wgaGFz
SW5saW5lTGV2ZWxCb3goKSBjb25zdCB7IHJldHVybiBtX2hhc0lubGluZUxldmVsQm94OyB9CisK
KyAgICAgICAgdm9pZCBzZXRIYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoYm9vbCBoYXNU
cmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkpIHsgbV9oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0
dW5pdHkgPSBoYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHk7IH0KKyAgICAgICAgYm9vbCBo
YXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX2hhc1RyYWls
aW5nU29mdFdyYXBPcHBvcnR1bml0eTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBt
X2lnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZyB7IGZhbHNlIH07CisKKyAgICAgICAgSW5saW5l
Q29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50IG1fY29udGludW91c0NvbnRlbnQ7Cisg
ICAgICAgIGNvbnN0IElubGluZUl0ZW0qIG1fdHJhaWxpbmdMaW5lQnJlYWsgeyBudWxscHRyIH07
CisgICAgICAgIGNvbnN0IElubGluZUl0ZW0qIG1fdHJhaWxpbmdXb3JkQnJlYWtPcHBvcnR1bml0
eSB7IG51bGxwdHIgfTsKKyAgICAgICAgYm9vbCBtX2hhc0lubGluZUxldmVsQm94IHsgZmFsc2Ug
fTsKKyAgICAgICAgYm9vbCBtX2hhc1RyYWlsaW5nU29mdFdyYXBPcHBvcnR1bml0eSB7IGZhbHNl
IH07CisgICAgfTsKKworICAgIC8vIENhbmRpZGF0ZSBjb250ZW50IGlzIGEgY29sbGVjdGlvbiBv
ZiBpbmxpbmUgY29udGVudCBvciBhIGZsb2F0IGJveC4KKyAgICBJbmxpbmVDb250ZW50IGlubGlu
ZUNvbnRlbnQ7CisgICAgY29uc3QgSW5saW5lSXRlbSogZmxvYXRJdGVtIHsgbnVsbHB0ciB9Owor
fTsKKworTGluZUNhbmRpZGF0ZTo6TGluZUNhbmRpZGF0ZShib29sIGlnbm9yZVRyYWlsaW5nTGV0
dGVyU3BhY2luZykKKyAgICA6IGlubGluZUNvbnRlbnQoaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFj
aW5nKQoreworfQorCitMaW5lQ2FuZGlkYXRlOjpJbmxpbmVDb250ZW50OjpJbmxpbmVDb250ZW50
KGJvb2wgaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKQorICAgIDogbV9pZ25vcmVUcmFpbGlu
Z0xldHRlclNwYWNpbmcoaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKQoreworfQorCitpbmxp
bmUgdm9pZCBMaW5lQ2FuZGlkYXRlOjpJbmxpbmVDb250ZW50OjphcHBlbmRJbmxpbmVJdGVtKGNv
bnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRo
KQoreworICAgIEFTU0VSVChpbmxpbmVJdGVtLmlzVGV4dCgpIHx8IGlubGluZUl0ZW0uaXNCb3go
KSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5l
Qm94RW5kKCkpOworICAgIGF1dG8gY29sbGFwc2libGVXaWR0aCA9IFsmXSgpIC0+IE9wdGlvbmFs
PElubGluZUxheW91dFVuaXQ+IHsKKyAgICAgICAgaWYgKCFpbmxpbmVJdGVtLmlzVGV4dCgpKQor
ICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgYXV0byYgaW5saW5lVGV4dEl0ZW0gPSBk
b3duY2FzdDxJbmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSk7CisgICAgICAgIGlmIChpbmxpbmVU
ZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZl
U3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpIHsKKyAgICAgICAgICAgIC8vIEZ1bGx5IGNv
bGxhcHNpYmxlIHRyYWlsaW5nIGNvbnRlbnQuCisgICAgICAgICAgICByZXR1cm4gbG9naWNhbFdp
ZHRoOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIGZvciBwYXJ0aWFsbHkgY29sbGFwc2li
bGUgY29udGVudC4KKyAgICAgICAgaWYgKG1faWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKQor
ICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgYXV0byBsZXR0ZXJTcGFjaW5nID0gaW5s
aW5lSXRlbS5zdHlsZSgpLmxldHRlclNwYWNpbmcoKTsKKyAgICAgICAgaWYgKGxldHRlclNwYWNp
bmcgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgIEFTU0VSVChsb2dpY2Fs
V2lkdGggPiBsZXR0ZXJTcGFjaW5nKTsKKyAgICAgICAgcmV0dXJuIGxldHRlclNwYWNpbmc7Cisg
ICAgfTsKKyAgICBtX2NvbnRpbnVvdXNDb250ZW50LmFwcGVuZChpbmxpbmVJdGVtLCBsb2dpY2Fs
V2lkdGgsIGNvbGxhcHNpYmxlV2lkdGgoKSk7CisgICAgbV9oYXNJbmxpbmVMZXZlbEJveCA9IG1f
aGFzSW5saW5lTGV2ZWxCb3ggfHwgaW5saW5lSXRlbS5pc0JveCgpIHx8IGlubGluZUl0ZW0uaXNJ
bmxpbmVCb3hTdGFydCgpOworfQorCitpbmxpbmUgdm9pZCBMaW5lQ2FuZGlkYXRlOjpJbmxpbmVD
b250ZW50OjpyZXNldCgpCit7CisgICAgbV9jb250aW51b3VzQ29udGVudC5yZXNldCgpOworICAg
IG1fdHJhaWxpbmdMaW5lQnJlYWsgPSB7IH07CisgICAgbV90cmFpbGluZ1dvcmRCcmVha09wcG9y
dHVuaXR5ID0geyB9OworICAgIG1faGFzSW5saW5lTGV2ZWxCb3ggPSBmYWxzZTsKK30KKworaW5s
aW5lIHZvaWQgTGluZUNhbmRpZGF0ZTo6cmVzZXQoKQoreworICAgIGZsb2F0SXRlbSA9IG51bGxw
dHI7CisgICAgaW5saW5lQ29udGVudC5yZXNldCgpOworfQorCitJbmxpbmVMYXlvdXRVbml0IExp
bmVCdWlsZGVyOjppbmxpbmVJdGVtV2lkdGgoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwg
SW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpIGNvbnN0Cit7CisgICAgaWYgKGlz
PElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKSkgeworICAgICAgICBhdXRvJiBpbmxpbmVUZXh0
SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKTsKKyAgICAgICAgaWYg
KGF1dG8gY29udGVudFdpZHRoID0gaW5saW5lVGV4dEl0ZW0ud2lkdGgoKSkKKyAgICAgICAgICAg
IHJldHVybiAqY29udGVudFdpZHRoOworICAgICAgICBpZiAoIWlubGluZVRleHRJdGVtLmlzV2hp
dGVzcGFjZSgpIHx8IElubGluZVRleHRJdGVtOjpzaG91bGRQcmVzZXJ2ZVNwYWNlc0FuZFRhYnMo
aW5saW5lVGV4dEl0ZW0pKQorICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlsOjp3aWR0aChpbmxp
bmVUZXh0SXRlbSwgY29udGVudExvZ2ljYWxMZWZ0KTsKKyAgICAgICAgcmV0dXJuIFRleHRVdGls
Ojp3aWR0aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwgaW5saW5lVGV4
dEl0ZW0uc3RhcnQoKSArIDEsIGNvbnRlbnRMb2dpY2FsTGVmdCk7CisgICAgfQorCisgICAgaWYg
KGlubGluZUl0ZW0uaXNMaW5lQnJlYWsoKSB8fCBpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0
dW5pdHkoKSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIGF1dG8mIGxheW91dEJveCA9IGlu
bGluZUl0ZW0ubGF5b3V0Qm94KCk7CisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBtX2lubGluZUZv
cm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisKKyAgICBpZiAobGF5
b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCisgICAgICAgIHJldHVybiBib3hHZW9tZXRy
eS5tYXJnaW5Cb3hXaWR0aCgpOworCisgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkp
CisgICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5Cb3hXaWR0aCgpOworCisgICAgaWYg
KGlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpKQorICAgICAgICByZXR1cm4gYm94R2VvbWV0
cnkubWFyZ2luU3RhcnQoKSArIGJveEdlb21ldHJ5LmJvcmRlckxlZnQoKSArIGJveEdlb21ldHJ5
LnBhZGRpbmdMZWZ0KCkudmFsdWVPcigwKTsKKworICAgIGlmIChpbmxpbmVJdGVtLmlzSW5saW5l
Qm94RW5kKCkpCisgICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5FbmQoKSArIGJveEdl
b21ldHJ5LmJvcmRlclJpZ2h0KCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nUmlnaHQoKS52YWx1ZU9y
KDApOworCisgICAgLy8gTm9uLXJlcGxhY2VkIGlubGluZSBib3ggKGUuZy4gaW5saW5lLWJsb2Nr
KQorICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5Cb3hXaWR0aCgpOworfQorCitMaW5lQnVp
bGRlcjo6TGluZUJ1aWxkZXIoSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1hdHRp
bmdDb250ZXh0LCBGbG9hdGluZ1N0YXRlJiBmbG9hdGluZ1N0YXRlLCBIb3Jpem9udGFsQ29uc3Ry
YWludHMgcm9vdEhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgSW5saW5lSXRlbXMmIGlubGlu
ZUl0ZW1zKQorICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCkKKyAgICAsIG1faW5saW5lRm9ybWF0dGluZ1N0YXRlKCZpbmxpbmVGb3JtYXR0aW5n
Q29udGV4dC5mb3JtYXR0aW5nU3RhdGUoKSkKKyAgICAsIG1fZmxvYXRpbmdTdGF0ZSgmZmxvYXRp
bmdTdGF0ZSkKKyAgICAsIG1fcm9vdEhvcml6b250YWxDb25zdHJhaW50cyhyb290SG9yaXpvbnRh
bENvbnN0cmFpbnRzKQorICAgICwgbV9saW5lKGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQorICAg
ICwgbV9pbmxpbmVJdGVtcyhpbmxpbmVJdGVtcykKK3sKK30KKworTGluZUJ1aWxkZXI6OkxpbmVC
dWlsZGVyKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dCwgY29uc3QgSW5saW5lSXRlbXMmIGlubGluZUl0ZW1zKQorICAgIDogbV9pbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1fbGluZShpbmxp
bmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1faW5saW5lSXRlbXMoaW5saW5lSXRlbXMpCit7
Cit9CisKK0xpbmVCdWlsZGVyOjpMaW5lQ29udGVudCBMaW5lQnVpbGRlcjo6bGF5b3V0SW5saW5l
Q29udGVudChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2UsIHNpemVfdCBw
YXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IG92
ZXJmbG93TG9naWNhbFdpZHRoLCBjb25zdCBJbmxpbmVSZWN0JiBpbml0aWFsTGluZUxvZ2ljYWxS
ZWN0LCBib29sIGlzRmlyc3RMaW5lKQoreworICAgIGluaXRpYWxpemUoaW5pdGlhbENvbnN0cmFp
bnRzRm9yTGluZShpbml0aWFsTGluZUxvZ2ljYWxSZWN0LCBpc0ZpcnN0TGluZSkpOworCisgICAg
YXV0byBjb21taXR0ZWRDb250ZW50ID0gcGxhY2VJbmxpbmVDb250ZW50KG5lZWRzTGF5b3V0UmFu
Z2UsIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCwgb3ZlcmZsb3dMb2dpY2FsV2lkdGgpOwor
ICAgIGF1dG8gY29tbWl0dGVkUmFuZ2UgPSBjbG9zZShuZWVkc0xheW91dFJhbmdlLCBjb21taXR0
ZWRDb250ZW50KTsKKworICAgIGF1dG8gaXNMYXN0TGluZSA9IGlzTGFzdExpbmVXaXRoSW5saW5l
Q29udGVudChjb21taXR0ZWRSYW5nZSwgbmVlZHNMYXlvdXRSYW5nZS5lbmQsIGNvbW1pdHRlZENv
bnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCk7CisgICAgcmV0dXJuIExpbmVDb250
ZW50IHsgY29tbWl0dGVkUmFuZ2UsIGNvbW1pdHRlZENvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29u
dGVudExlbmd0aCwgY29tbWl0dGVkQ29udGVudC5vdmVyZmxvd0xvZ2ljYWxXaWR0aCwgbV9mbG9h
dHMsIG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0CisgICAgICAgICwgbV9saW5lTG9naWNh
bFJlY3QudG9wTGVmdCgpCisgICAgICAgICwgbV9saW5lTG9naWNhbFJlY3Qud2lkdGgoKQorICAg
ICAgICAsIG1fbGluZS5jb250ZW50TG9naWNhbFdpZHRoKCkKKyAgICAgICAgLCBpc0xhc3RMaW5l
CisgICAgICAgICwgbV9saW5lLm5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCgpCisgICAg
ICAgICwgbV9saW5lLnJ1bnMoKX07Cit9CisKK0xpbmVCdWlsZGVyOjpJbnRyaW5zaWNDb250ZW50
IExpbmVCdWlsZGVyOjpjb21wdXRlZEludHJpbnNpY1dpZHRoKGNvbnN0IElubGluZUl0ZW1SYW5n
ZSYgbmVlZHNMYXlvdXRSYW5nZSwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCkKK3sK
KyAgICBpbml0aWFsaXplKHsgeyB7IH0sIHsgYXZhaWxhYmxlV2lkdGgsIG1heElubGluZUxheW91
dFVuaXQoKSB9IH0sIGZhbHNlIH0pOworICAgIGF1dG8gY29tbWl0dGVkQ29udGVudCA9IHBsYWNl
SW5saW5lQ29udGVudChuZWVkc0xheW91dFJhbmdlLCB7IH0sIHsgfSk7CisgICAgYXV0byBjb21t
aXR0ZWRSYW5nZSA9IGNsb3NlKG5lZWRzTGF5b3V0UmFuZ2UsIGNvbW1pdHRlZENvbnRlbnQpOwor
ICAgIHJldHVybiB7IGNvbW1pdHRlZFJhbmdlLCBtX2xpbmUuY29udGVudExvZ2ljYWxXaWR0aCgp
LCBtX2Zsb2F0cyB9OworfQorCit2b2lkIExpbmVCdWlsZGVyOjppbml0aWFsaXplKGNvbnN0IFVz
ZWRDb25zdHJhaW50cyYgbGluZUNvbnN0cmFpbnRzKQoreworICAgIG1fZmxvYXRzLmNsZWFyKCk7
CisgICAgbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtID0geyB9OworICAgIG1fd3JhcE9wcG9ydHVu
aXR5TGlzdC5jbGVhcigpOworCisgICAgbV9saW5lLmluaXRpYWxpemUoKTsKKyAgICBtX2xpbmVM
b2dpY2FsUmVjdCA9IGxpbmVDb25zdHJhaW50cy5sb2dpY2FsUmVjdDsKKyAgICBtX2NvbnRlbnRJ
c0NvbnN0cmFpbmVkQnlGbG9hdCA9IGxpbmVDb25zdHJhaW50cy5pc0NvbnN0cmFpbmVkQnlGbG9h
dDsKK30KKworTGluZUJ1aWxkZXI6OkNvbW1pdHRlZENvbnRlbnQgTGluZUJ1aWxkZXI6OnBsYWNl
SW5saW5lQ29udGVudChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2UsIHNp
emVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91dFVu
aXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgpCit7CisgICAgYXV0byBsaW5lQ2FuZGlkYXRlID0gTGlu
ZUNhbmRpZGF0ZSB7IGxheW91dFN0YXRlKCkuc2hvdWxkSWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFj
aW5nKCkgfTsKKyAgICBhdXRvIGlubGluZUNvbnRlbnRCcmVha2VyID0gSW5saW5lQ29udGVudEJy
ZWFrZXIgeyB9OworCisgICAgYXV0byBjdXJyZW50SXRlbUluZGV4ID0gbmVlZHNMYXlvdXRSYW5n
ZS5zdGFydDsKKyAgICBzaXplX3QgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50ID0gMDsKKyAgICB3
aGlsZSAoY3VycmVudEl0ZW1JbmRleCA8IG5lZWRzTGF5b3V0UmFuZ2UuZW5kKSB7CisgICAgICAg
IC8vIDEuIENvbGxlY3QgdGhlIHNldCBvZiBydW5zIHRoYXQgd2UgY2FuIGNvbW1pdCB0byB0aGUg
bGluZSBhcyBvbmUgZW50aXR5IGUuZy4gPHNwYW4+dGV4dF9hbmRfc3Bhbl9zdGFydF9zcGFuX2Vu
ZDwvc3Bhbj4uCisgICAgICAgIC8vIDIuIEFwcGx5IGZsb2F0cyBhbmQgc2hyaW5rIHRoZSBhdmFp
bGFibGUgaG9yaXpvbnRhbCBzcGFjZSBlLmcuIDxzcGFuPmludHJ1XzxkaXYgc3R5bGU9ImZsb2F0
OiBsZWZ0Ij48L2Rpdj5zaXZlX2Zsb2F0PC9zcGFuPi4KKyAgICAgICAgLy8gMy4gQ2hlY2sgaWYg
dGhlIGNvbnRlbnQgZml0cyB0aGUgbGluZSBhbmQgY29tbWl0IHRoZSBjb250ZW50IGFjY29yZGlu
Z2x5IChmdWxsLCBwYXJ0aWFsIG9yIG5vdCBjb21taXQgYXQgYWxsKS4KKyAgICAgICAgLy8gNC4g
UmV0dXJuIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGVpdGhlciBieSBub3QgYmVp
bmcgYWJsZSB0byBmaXQgbW9yZSBjb250ZW50IG9yIGJlY2F1c2Ugb2YgYW4gZXhwbGljaXQgbGlu
ZSBicmVhay4KKyAgICAgICAgY2FuZGlkYXRlQ29udGVudEZvckxpbmUobGluZUNhbmRpZGF0ZSwg
Y3VycmVudEl0ZW1JbmRleCwgbmVlZHNMYXlvdXRSYW5nZSwgcGFydGlhbExlYWRpbmdDb250ZW50
TGVuZ3RoLCBzdGQ6OmV4Y2hhbmdlKGxlYWRpbmdMb2dpY2FsV2lkdGgsIFdURjo6bnVsbG9wdCks
IG1fbGluZS5jb250ZW50TG9naWNhbFJpZ2h0KCkpOworICAgICAgICAvLyBOb3cgY2hlY2sgaWYg
d2UgY2FuIHB1dCB0aGlzIGNvbnRlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgYXV0
byByZXN1bHQgPSBSZXN1bHQgeyB9OworICAgICAgICBpZiAobGluZUNhbmRpZGF0ZS5mbG9hdEl0
ZW0pIHsKKyAgICAgICAgICAgIEFTU0VSVChsaW5lQ2FuZGlkYXRlLmlubGluZUNvbnRlbnQuaXNF
bXB0eSgpKTsKKyAgICAgICAgICAgIGhhbmRsZUZsb2F0Q29udGVudCgqbGluZUNhbmRpZGF0ZS5m
bG9hdEl0ZW0pOworICAgICAgICAgICAgLy8gRmxvYXRzIG5ldmVyIHRlcm1pbmF0ZSB0aGUgbGlu
ZS4KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVJbmxpbmVDb250
ZW50KGlubGluZUNvbnRlbnRCcmVha2VyLCBuZWVkc0xheW91dFJhbmdlLCBsaW5lQ2FuZGlkYXRl
KTsKKyAgICAgICAgYXV0byBpc0VuZE9mTGluZSA9IHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxp
bmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllczsKKyAgICAgICAgaWYgKCFyZXN1bHQu
Y29tbWl0dGVkQ291bnQuaXNSZXZlcnQpIHsKKyAgICAgICAgICAgIGNvbW1pdHRlZElubGluZUl0
ZW1Db3VudCArPSByZXN1bHQuY29tbWl0dGVkQ291bnQudmFsdWU7CisgICAgICAgICAgICBhdXRv
JiBpbmxpbmVDb250ZW50ID0gbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50OworICAgICAgICAg
ICAgYXV0byBpbmxpbmVDb250ZW50SXNGdWxseUNvbW1pdHRlZCA9IGlubGluZUNvbnRlbnQuY29u
dGludW91c0NvbnRlbnQoKS5ydW5zKCkuc2l6ZSgpID09IHJlc3VsdC5jb21taXR0ZWRDb3VudC52
YWx1ZSAmJiAhcmVzdWx0LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGg7CisgICAgICAgICAg
ICBpZiAoaW5saW5lQ29udGVudElzRnVsbHlDb21taXR0ZWQpIHsKKyAgICAgICAgICAgICAgICBp
ZiAoYXV0byogd29yZEJyZWFrT3Bwb3J0dW5pdHkgPSBpbmxpbmVDb250ZW50LnRyYWlsaW5nV29y
ZEJyZWFrT3Bwb3J0dW5pdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyA8d2JyPiBuZWVk
cyB0byBiZSBvbiB0aGUgbGluZSBhcyBhbiBlbXB0eSBydW4gc28gdGhhdCB3ZSBjYW4gY29uc3Ry
dWN0IGFuIGlubGluZSBib3ggYW5kIGNvbXB1dGUgYmFzaWMgZ2VvbWV0cnkuCisgICAgICAgICAg
ICAgICAgICAgICsrY29tbWl0dGVkSW5saW5lSXRlbUNvdW50OworICAgICAgICAgICAgICAgICAg
ICBtX2xpbmUuYXBwZW5kKCp3b3JkQnJlYWtPcHBvcnR1bml0eSwgeyB9KTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlubGluZUNvbnRlbnQudHJhaWxpbmdMaW5lQnJl
YWsoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGdWxseSBjb21taXR0ZWQgKG9yIGVtcHR5
KSBjb250ZW50IGZvbGxvd2VkIGJ5IGEgbGluZSBicmVhayBtZWFucyAiZW5kIG9mIGxpbmUiLgor
ICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyB3aWxsIHB1dCB0aGUgbGluZSBicmVh
ayBib3ggYXQgdGhlIGVuZCBvZiB0aGUgbGluZSB3aGlsZSBpbiBjYXNlIG9mIHNvbWUgaW5saW5l
IGJveGVzLCB0aGUgbGluZSBicmVhaworICAgICAgICAgICAgICAgICAgICAvLyBjb3VsZCB2ZXJ5
IHdlbGwgYmUgYXQgYW4gZWFybGllciBwb3NpdGlvbi4gVGhpcyBoYXMgbm8gdmlzdWFsIGltcGxp
Y2F0aW9ucyBhdCB0aGlzIHBvaW50IHRob3VnaCAob25seSBnZW9tZXRyeSBjb3JyZWN0bmVzcyBv
biB0aGUgbGluZSBicmVhayBib3gpLgorICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIDxzcGFu
IHN0eWxlPSJib3JkZXItcmlnaHQ6IDEwcHggc29saWQgZ3JlZW4iPnRleHQ8YnI+PC9zcGFuPiB3
aGVyZSB0aGUgPGJyPidzIGhvcml6b250YWwgcG9zaXRpb24gaXMgYmVmb3JlIHRoZSByaWdodCBi
b3JkZXIgYW5kIG5vdCBhZnRlci4KKyAgICAgICAgICAgICAgICAgICAgbV9saW5lLmFwcGVuZCgq
aW5saW5lQ29udGVudC50cmFpbGluZ0xpbmVCcmVhaygpLCB7IH0pOworICAgICAgICAgICAgICAg
ICAgICArK2NvbW1pdHRlZElubGluZUl0ZW1Db3VudDsKKyAgICAgICAgICAgICAgICAgICAgaXNF
bmRPZkxpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfSBlbHNlCisgICAgICAgICAgICBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgPSByZXN1bHQu
Y29tbWl0dGVkQ291bnQudmFsdWU7CisKKyAgICAgICAgaWYgKGlzRW5kT2ZMaW5lKSB7CisgICAg
ICAgICAgICAvLyBXZSBjYW4ndCBwbGFjZSBhbnkgbW9yZSBpdGVtcyBvbiB0aGUgY3VycmVudCBs
aW5lLgorICAgICAgICAgICAgcmV0dXJuIHsgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50LCByZXN1
bHQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCwgcmVzdWx0Lm92ZXJmbG93TG9naWNhbFdp
ZHRoIH07CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudEl0ZW1JbmRleCA9IG5lZWRzTGF5b3V0
UmFuZ2Uuc3RhcnQgKyBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgKyBtX2Zsb2F0cy5zaXplKCk7
CisgICAgICAgIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCA9IHsgfTsKKyAgICB9CisgICAg
Ly8gTG9va3MgbGlrZSB3ZSd2ZSBydW4gb3V0IG9mIHJ1bnMuCisgICAgcmV0dXJuIHsgY29tbWl0
dGVkSW5saW5lSXRlbUNvdW50LCB7IH0gfTsKK30KKworTGluZUJ1aWxkZXI6OklubGluZUl0ZW1S
YW5nZSBMaW5lQnVpbGRlcjo6Y2xvc2UoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91
dFJhbmdlLCBjb25zdCBDb21taXR0ZWRDb250ZW50JiBjb21taXR0ZWRDb250ZW50KQoreworICAg
IEFTU0VSVChjb21taXR0ZWRDb250ZW50LmlubGluZUl0ZW1Db3VudCB8fCAhbV9mbG9hdHMuaXNF
bXB0eSgpIHx8IG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0KTsKKyAgICBhdXRvIG51bWJl
ck9mQ29tbWl0dGVkSXRlbXMgPSBjb21taXR0ZWRDb250ZW50LmlubGluZUl0ZW1Db3VudCArIG1f
ZmxvYXRzLnNpemUoKTsKKyAgICBhdXRvIHRyYWlsaW5nSW5saW5lSXRlbUluZGV4ID0gbmVlZHNM
YXlvdXRSYW5nZS5zdGFydCArIG51bWJlck9mQ29tbWl0dGVkSXRlbXMgLSAxOworICAgIGF1dG8g
bGluZVJhbmdlID0gSW5saW5lSXRlbVJhbmdlIHsgbmVlZHNMYXlvdXRSYW5nZS5zdGFydCwgdHJh
aWxpbmdJbmxpbmVJdGVtSW5kZXggKyAxIH07CisgICAgQVNTRVJUKGxpbmVSYW5nZS5lbmQgPD0g
bmVlZHNMYXlvdXRSYW5nZS5lbmQpOworICAgIGlmICghY29tbWl0dGVkQ29udGVudC5pbmxpbmVJ
dGVtQ291bnQpIHsKKyAgICAgICAgLy8gTGluZSBpcyBlbXB0eSwgd2Ugb25seSBtYW5hZ2VkIHRv
IHBsYWNlIGZsb2F0IGJveGVzLgorICAgICAgICByZXR1cm4gbGluZVJhbmdlOworICAgIH0KKyAg
ICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gbV9saW5lTG9naWNhbFJlY3Qud2lkdGgoKSAtIG1fbGlu
ZS5jb250ZW50TG9naWNhbFJpZ2h0KCk7CisgICAgbV9saW5lLnJlbW92ZUNvbGxhcHNpYmxlQ29u
dGVudChhdmFpbGFibGVXaWR0aCk7CisgICAgYXV0byBob3Jpem9udGFsQWxpZ25tZW50ID0gcm9v
dCgpLnN0eWxlKCkudGV4dEFsaWduKCk7CisgICAgYXV0byBydW5zRXhwYW5kSG9yaXpvbnRhbGx5
ID0gaG9yaXpvbnRhbEFsaWdubWVudCA9PSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5ICYmICFpc0xh
c3RMaW5lV2l0aElubGluZUNvbnRlbnQobGluZVJhbmdlLCBuZWVkc0xheW91dFJhbmdlLmVuZCwg
Y29tbWl0dGVkQ29udGVudC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoKTsKKyAgICBpZiAo
cnVuc0V4cGFuZEhvcml6b250YWxseSkKKyAgICAgICAgbV9saW5lLmFwcGx5UnVuRXhwYW5zaW9u
KG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkgLSBtX2xpbmUuY29udGVudExvZ2ljYWxSaWdodCgp
KTsKKyAgICBhdXRvIGxpbmVFbmRzV2l0aEh5cGhlbiA9IGZhbHNlOworICAgIGlmICghbV9saW5l
LnJ1bnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgYXV0byYgbGFzdFRleHRDb250ZW50ID0gbV9s
aW5lLnJ1bnMoKS5sYXN0KCkudGV4dENvbnRlbnQoKTsKKyAgICAgICAgbGluZUVuZHNXaXRoSHlw
aGVuID0gbGFzdFRleHRDb250ZW50ICYmIGxhc3RUZXh0Q29udGVudC0+bmVlZHNIeXBoZW4oKTsK
KyAgICB9CisgICAgbV9zdWNjZXNzaXZlSHlwaGVuYXRlZExpbmVDb3VudCA9IGxpbmVFbmRzV2l0
aEh5cGhlbiA/IG1fc3VjY2Vzc2l2ZUh5cGhlbmF0ZWRMaW5lQ291bnQgKyAxIDogMDsKKyAgICBy
ZXR1cm4gbGluZVJhbmdlOworfQorCitPcHRpb25hbDxIb3Jpem9udGFsQ29uc3RyYWludHM+IExp
bmVCdWlsZGVyOjpmbG9hdENvbnN0cmFpbnRzKGNvbnN0IElubGluZVJlY3QmIGxpbmVMb2dpY2Fs
UmVjdCkgY29uc3QKK3sKKyAgICBhdXRvKiBmbG9hdGluZ1N0YXRlID0gdGhpcy0+ZmxvYXRpbmdT
dGF0ZSgpOworICAgIGlmICghZmxvYXRpbmdTdGF0ZSB8fCBmbG9hdGluZ1N0YXRlLT5mbG9hdHMo
KS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICAvLyBDaGVjayBmb3IgaW50
cnVkaW5nIGZsb2F0cyBhbmQgYWRqdXN0IGxvZ2ljYWwgbGVmdC9hdmFpbGFibGUgd2lkdGggZm9y
IHRoaXMgbGluZSBhY2NvcmRpbmdseS4KKyAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0
aW5nQ29udGV4dCB7IGZvcm1hdHRpbmdDb250ZXh0KCksICpmbG9hdGluZ1N0YXRlIH07CisgICAg
YXV0byBjb25zdHJhaW50cyA9IGZsb2F0aW5nQ29udGV4dC5jb25zdHJhaW50cyh0b0xheW91dFVu
aXQobGluZUxvZ2ljYWxSZWN0LnRvcCgpKSwgdG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmVjdC5i
b3R0b20oKSkpOworICAgIC8vIENoZWNrIGlmIHRoZXNlIHZhbHVlcyBhY3R1YWxseSBjb25zdHJh
aW4gdGhlIGxpbmUuCisgICAgaWYgKGNvbnN0cmFpbnRzLmxlZnQgJiYgY29uc3RyYWludHMubGVm
dC0+eCA8PSBsaW5lTG9naWNhbFJlY3QubGVmdCgpKQorICAgICAgICBjb25zdHJhaW50cy5sZWZ0
ID0geyB9OworCisgICAgaWYgKGNvbnN0cmFpbnRzLnJpZ2h0ICYmIGNvbnN0cmFpbnRzLnJpZ2h0
LT54ID49IGxpbmVMb2dpY2FsUmVjdC5yaWdodCgpKQorICAgICAgICBjb25zdHJhaW50cy5yaWdo
dCA9IHsgfTsKKworICAgIGlmICghY29uc3RyYWludHMubGVmdCAmJiAhY29uc3RyYWludHMucmln
aHQpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICBhdXRvIGxpbmVMb2dpY2FsTGVmdCA9IGxp
bmVMb2dpY2FsUmVjdC5sZWZ0KCk7CisgICAgYXV0byBsaW5lTG9naWNhbFJpZ2h0ID0gbGluZUxv
Z2ljYWxSZWN0LnJpZ2h0KCk7CisgICAgaWYgKGNvbnN0cmFpbnRzLmxlZnQgJiYgY29uc3RyYWlu
dHMucmlnaHQpIHsKKyAgICAgICAgbGluZUxvZ2ljYWxSaWdodCA9IGNvbnN0cmFpbnRzLnJpZ2h0
LT54OworICAgICAgICBsaW5lTG9naWNhbExlZnQgPSBjb25zdHJhaW50cy5sZWZ0LT54OworICAg
IH0gZWxzZSBpZiAoY29uc3RyYWludHMubGVmdCkgeworICAgICAgICBBU1NFUlQoY29uc3RyYWlu
dHMubGVmdC0+eCA+PSBsaW5lTG9naWNhbExlZnQpOworICAgICAgICBsaW5lTG9naWNhbExlZnQg
PSBjb25zdHJhaW50cy5sZWZ0LT54OworICAgIH0gZWxzZSBpZiAoY29uc3RyYWludHMucmlnaHQp
IHsKKyAgICAgICAgLy8gUmlnaHQgZmxvYXQgYm94ZXMgbWF5IG92ZXJmbG93IHRoZSBjb250YWlu
aW5nIGJsb2NrIG9uIHRoZSBsZWZ0LgorICAgICAgICBsaW5lTG9naWNhbFJpZ2h0ID0gc3RkOjpt
YXg8SW5saW5lTGF5b3V0VW5pdD4obGluZUxvZ2ljYWxMZWZ0LCBjb25zdHJhaW50cy5yaWdodC0+
eCk7CisgICAgfQorICAgIHJldHVybiBIb3Jpem9udGFsQ29uc3RyYWludHMgeyB0b0xheW91dFVu
aXQobGluZUxvZ2ljYWxMZWZ0KSwgdG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmlnaHQgLSBsaW5l
TG9naWNhbExlZnQpIH07Cit9CisKK0xpbmVCdWlsZGVyOjpVc2VkQ29uc3RyYWludHMgTGluZUJ1
aWxkZXI6OmluaXRpYWxDb25zdHJhaW50c0ZvckxpbmUoY29uc3QgSW5saW5lUmVjdCYgaW5pdGlh
bExpbmVMb2dpY2FsUmVjdCwgYm9vbCBpc0ZpcnN0TGluZSkgY29uc3QKK3sKKyAgICBhdXRvIGxp
bmVMb2dpY2FsTGVmdCA9IGluaXRpYWxMaW5lTG9naWNhbFJlY3QubGVmdCgpOworICAgIGF1dG8g
bGluZUxvZ2ljYWxSaWdodCA9IGluaXRpYWxMaW5lTG9naWNhbFJlY3QucmlnaHQoKTsKKyAgICBh
dXRvIGxpbmVJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IGZhbHNlOworCisgICAgaWYgKGF1dG8gbGlu
ZUNvbnN0cmFpbnRzID0gZmxvYXRDb25zdHJhaW50cyhpbml0aWFsTGluZUxvZ2ljYWxSZWN0KSkg
eworICAgICAgICBsaW5lTG9naWNhbExlZnQgPSBsaW5lQ29uc3RyYWludHMtPmxvZ2ljYWxMZWZ0
OworICAgICAgICBsaW5lTG9naWNhbFJpZ2h0ID0gbGluZUNvbnN0cmFpbnRzLT5sb2dpY2FsUmln
aHQoKTsKKyAgICAgICAgbGluZUlzQ29uc3RyYWluZWRCeUZsb2F0ID0gdHJ1ZTsKKyAgICB9CisK
KyAgICBhdXRvIGNvbXB1dGVkVGV4dEluZGVudCA9IFsmXSgpIC0+IElubGluZUxheW91dFVuaXQg
eworICAgICAgICAvLyB0ZXh0LWluZGVudCBwcm9wZXJ0eSBzcGVjaWZpZXMgdGhlIGluZGVudGF0
aW9uIGFwcGxpZWQgdG8gbGluZXMgb2YgaW5saW5lIGNvbnRlbnQgaW4gYSBibG9jay4KKyAgICAg
ICAgLy8gVGhlIGluZGVudCBpcyB0cmVhdGVkIGFzIGEgbWFyZ2luIGFwcGxpZWQgdG8gdGhlIHN0
YXJ0IGVkZ2Ugb2YgdGhlIGxpbmUgYm94LgorICAgICAgICAvLyBVbmxlc3Mgb3RoZXJ3aXNlIHNw
ZWNpZmllZCwgb25seSBsaW5lcyB0aGF0IGFyZSB0aGUgZmlyc3QgZm9ybWF0dGVkIGxpbmUgb2Yg
YW4gZWxlbWVudCBhcmUgYWZmZWN0ZWQuCisgICAgICAgIC8vIEZvciBleGFtcGxlLCB0aGUgZmly
c3QgbGluZSBvZiBhbiBhbm9ueW1vdXMgYmxvY2sgYm94IGlzIG9ubHkgYWZmZWN0ZWQgaWYgaXQg
aXMgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJlbnQgZWxlbWVudC4KKyAgICAgICAgLy8gRklY
TUU6IEFkZCBzdXBwb3J0IGZvciBlYWNoLWxpbmUuCisgICAgICAgIC8vIFtJbnRlZ3JhdGlvbl0g
cm9vdCgpLT5wYXJlbnQoKSB3b3VsZCBub3JtYWxseSBwcm9kdWNlIGEgdmFsaWQgbGF5b3V0IGJv
eC4KKyAgICAgICAgYXV0byYgcm9vdCA9IHRoaXMtPnJvb3QoKTsKKyAgICAgICAgYXV0byBpc0Zv
cm1hdHRpbmdDb250ZXh0Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCA9ICFyb290LmlzQW5vbnlt
b3VzKCk7CisgICAgICAgIGlmIChyb290LmlzQW5vbnltb3VzKCkpIHsKKyAgICAgICAgICAgIC8v
IFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRoZSBlYWNoLWxpbmUgYW5kL29yIGhhbmdp
bmcga2V5d29yZHMsIG9ubHkgbGluZXMgdGhhdCBhcmUgdGhlIGZpcnN0IGZvcm1hdHRlZCBsaW5l
CisgICAgICAgICAgICAvLyBvZiBhbiBlbGVtZW50IGFyZSBhZmZlY3RlZC4KKyAgICAgICAgICAg
IC8vIEZvciBleGFtcGxlLCB0aGUgZmlyc3QgbGluZSBvZiBhbiBhbm9ueW1vdXMgYmxvY2sgYm94
IGlzIG9ubHkgYWZmZWN0ZWQgaWYgaXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJlbnQg
ZWxlbWVudC4KKyAgICAgICAgICAgIGF1dG8gaXNJbnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQg
PSBsYXlvdXRTdGF0ZSgpLmlzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkKCk7CisgICAgICAg
ICAgICBpZiAoaXNJbnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQgPT0gTGF5b3V0U3RhdGU6Oklz
SW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkOjpOb3RBcHBsaWNhYmxlKQorICAgICAgICAgICAg
ICAgIGlzRm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9UZXh0SW5kZW50ID0gcm9vdC5w
YXJlbnQoKS5maXJzdEluRmxvd0NoaWxkKCkgPT0gJnJvb3Q7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgaXNGb3JtYXR0aW5nQ29udGV4dFJvb3RDYW5kaWRhdGVUb1RleHRJbmRl
bnQgPSBpc0ludGVncmF0ZWRSb290Qm94Rmlyc3RDaGlsZCA9PSBMYXlvdXRTdGF0ZTo6SXNJbnRl
Z3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQ6OlllczsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlz
Rm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9UZXh0SW5kZW50KQorICAgICAgICAgICAg
cmV0dXJuIHsgfTsKKyAgICAgICAgYXV0byBpbnZlcnRMaW5lUmFuZ2UgPSByb290LnN0eWxlKCku
dGV4dEluZGVudFR5cGUoKSA9PSBUZXh0SW5kZW50VHlwZTo6SGFuZ2luZzsKKyAgICAgICAgLy8g
dGV4dC1pbmRlbnQ6IGhhbmdpbmcgaW52ZXJ0cyB3aGljaCBsaW5lcyBhcmUgYWZmZWN0ZWQuCisg
ICAgICAgIC8vIGludmVydGVkIGxpbmUgcmFuZ2UgLT4gYWxsIHRoZSBsaW5lcyBleGNlcHQgdGhl
IGZpcnN0IG9uZS4KKyAgICAgICAgLy8gIWludmVydGVkIGxpbmUgcmFuZ2UgLT4gZmlyc3QgbGlu
ZSBnZXRzIHRoZSBpbmRlbnQuCisgICAgICAgIGF1dG8gc2hvdWxkSW5kZW50ID0gaW52ZXJ0TGlu
ZVJhbmdlICE9IGlzRmlyc3RMaW5lOworICAgICAgICBpZiAoIXNob3VsZEluZGVudCkKKyAgICAg
ICAgICAgIHJldHVybiB7IH07CisKKyAgICAgICAgYXV0byB0ZXh0SW5kZW50ID0gcm9vdC5zdHls
ZSgpLnRleHRJbmRlbnQoKTsKKyAgICAgICAgaWYgKHRleHRJbmRlbnQgPT0gUmVuZGVyU3R5bGU6
OmluaXRpYWxUZXh0SW5kZW50KCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICBy
ZXR1cm4geyBtaW5pbXVtVmFsdWVGb3JMZW5ndGgodGV4dEluZGVudCwgaW5pdGlhbExpbmVMb2dp
Y2FsUmVjdC53aWR0aCgpKSB9OworICAgIH07CisgICAgbGluZUxvZ2ljYWxMZWZ0ICs9IGNvbXB1
dGVkVGV4dEluZGVudCgpOworICAgIHJldHVybiBVc2VkQ29uc3RyYWludHMgeyB7IGluaXRpYWxM
aW5lTG9naWNhbFJlY3QudG9wKCksIGxpbmVMb2dpY2FsTGVmdCwgbGluZUxvZ2ljYWxSaWdodCAt
IGxpbmVMb2dpY2FsTGVmdCwgaW5pdGlhbExpbmVMb2dpY2FsUmVjdC5oZWlnaHQoKSB9LCBsaW5l
SXNDb25zdHJhaW5lZEJ5RmxvYXQgfTsKK30KKwordm9pZCBMaW5lQnVpbGRlcjo6Y2FuZGlkYXRl
Q29udGVudEZvckxpbmUoTGluZUNhbmRpZGF0ZSYgbGluZUNhbmRpZGF0ZSwgc2l6ZV90IGN1cnJl
bnRJbmxpbmVJdGVtSW5kZXgsIGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFuZ2UsIHNp
emVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91dFVu
aXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgsIElubGluZUxheW91dFVuaXQgY3VycmVudExvZ2ljYWxS
aWdodCkKK3sKKyAgICBBU1NFUlQoY3VycmVudElubGluZUl0ZW1JbmRleCA8IGxheW91dFJhbmdl
LmVuZCk7CisgICAgbGluZUNhbmRpZGF0ZS5yZXNldCgpOworICAgIC8vIDEuIFNpbXBseSBhZGQg
YW55IG92ZXJmbG93IGNvbnRlbnQgZnJvbSB0aGUgcHJldmlvdXMgbGluZSB0byB0aGUgY2FuZGlk
YXRlIGNvbnRlbnQuIEl0J3MgYWx3YXlzIGEgdGV4dCBjb250ZW50LgorICAgIC8vIDIuIEZpbmQg
dGhlIG5leHQgc29mdCB3cmFwIHBvc2l0aW9uIG9yIGV4cGxpY2l0IGxpbmUgYnJlYWsuCisgICAg
Ly8gMy4gQ29sbGVjdCBmbG9hdHMgYmV0d2VlbiB0aGUgaW5saW5lIGNvbnRlbnQuCisgICAgYXV0
byBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggPSBuZXh0V3JhcE9wcG9ydHVuaXR5KGN1cnJlbnRJ
bmxpbmVJdGVtSW5kZXgsIGxheW91dFJhbmdlKTsKKyAgICAvLyBzb2Z0V3JhcE9wcG9ydHVuaXR5
SW5kZXggPT0gbGF5b3V0UmFuZ2UuZW5kIG1lYW5zIHdlIGRvbid0IGhhdmUgYW55IHdyYXAgb3Bw
b3J0dW5pdHkgaW4gdGhpcyBjb250ZW50LgorICAgIEFTU0VSVChzb2Z0V3JhcE9wcG9ydHVuaXR5
SW5kZXggPD0gbGF5b3V0UmFuZ2UuZW5kKTsKKworICAgIGlmIChwYXJ0aWFsTGVhZGluZ0NvbnRl
bnRMZW5ndGgpIHsKKyAgICAgICAgLy8gSGFuZGxlIGxlYWRpbmcgcGFydGlhbCBjb250ZW50IGZp
cnN0IChvdmVyZmxvd2luZyB0ZXh0IGZyb20gdGhlIHByZXZpb3VzIGxpbmUpLgorICAgICAgICAv
LyBDb25zdHJ1Y3QgYSBwYXJ0aWFsIGxlYWRpbmcgaW5saW5lIGl0ZW0uCisgICAgICAgIG1fcGFy
dGlhbExlYWRpbmdUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihtX2lubGluZUl0
ZW1zW2N1cnJlbnRJbmxpbmVJdGVtSW5kZXhdKS5yaWdodChwYXJ0aWFsTGVhZGluZ0NvbnRlbnRM
ZW5ndGgpOworICAgICAgICBhdXRvIGl0ZW1XaWR0aCA9IGxlYWRpbmdMb2dpY2FsV2lkdGggPyAq
c3RkOjpleGNoYW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6Om51bGxvcHQpIDogaW5saW5l
SXRlbVdpZHRoKCptX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0sIGN1cnJlbnRMb2dpY2FsUmlnaHQp
OworICAgICAgICBsaW5lQ2FuZGlkYXRlLmlubGluZUNvbnRlbnQuYXBwZW5kSW5saW5lSXRlbSgq
bV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtLCBpdGVtV2lkdGgpOworICAgICAgICBjdXJyZW50TG9n
aWNhbFJpZ2h0ICs9IGl0ZW1XaWR0aDsKKyAgICAgICAgKytjdXJyZW50SW5saW5lSXRlbUluZGV4
OworICAgIH0KKworICAgIGZvciAoYXV0byBpbmRleCA9IGN1cnJlbnRJbmxpbmVJdGVtSW5kZXg7
IGluZGV4IDwgc29mdFdyYXBPcHBvcnR1bml0eUluZGV4OyArK2luZGV4KSB7CisgICAgICAgIGF1
dG8mIGlubGluZUl0ZW0gPSBtX2lubGluZUl0ZW1zW2luZGV4XTsKKyAgICAgICAgaWYgKGlubGlu
ZUl0ZW0uaXNGbG9hdCgpKSB7CisgICAgICAgICAgICBsaW5lQ2FuZGlkYXRlLmZsb2F0SXRlbSA9
ICZpbmxpbmVJdGVtOworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1
bml0eSwgbXVzdCBiZSB0aGUgb25seSBpdGVtIGluIHRoZSBsaXN0LgorICAgICAgICAgICAgQVNT
RVJUKGN1cnJlbnRJbmxpbmVJdGVtSW5kZXggKyAxID09IHNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRl
eCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5saW5l
SXRlbS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJ
dGVtLmlzSW5saW5lQm94RW5kKCkgfHwgaW5saW5lSXRlbS5pc0JveCgpKSB7CisgICAgICAgICAg
ICBBU1NFUlQoIWxlYWRpbmdMb2dpY2FsV2lkdGggfHwgaW5saW5lSXRlbS5pc1RleHQoKSk7Cisg
ICAgICAgICAgICBhdXRvIGxvZ2ljYWxXaWR0aCA9IGxlYWRpbmdMb2dpY2FsV2lkdGggPyAqc3Rk
OjpleGNoYW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6Om51bGxvcHQpIDogaW5saW5lSXRl
bVdpZHRoKGlubGluZUl0ZW0sIGN1cnJlbnRMb2dpY2FsUmlnaHQpOworICAgICAgICAgICAgbGlu
ZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmFwcGVuZElubGluZUl0ZW0oaW5saW5lSXRlbSwgbG9n
aWNhbFdpZHRoKTsKKyAgICAgICAgICAgIGN1cnJlbnRMb2dpY2FsUmlnaHQgKz0gbG9naWNhbFdp
ZHRoOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlubGlu
ZUl0ZW0uaXNMaW5lQnJlYWsoKSB8fCBpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHko
KSkgeworICAgICAgICAgICAgLy8gU2luY2UgYm90aCA8YnI+IGFuZCA8d2JyPiBhcmUgZXhwbGlj
aXQgd29yZCBicmVhayBvcHBvcnR1bml0aWVzIHRoZXkgaGF2ZSB0byBiZSB0cmFpbGluZyBpdGVt
cyBpbiB0aGlzIGNhbmRpZGF0ZSBydW4gbGlzdCB1bmxlc3MgdGhleSBhcmUgZW1iZWRkZWQgaW4g
aW5saW5lIGJveGVzLgorICAgICAgICAgICAgLy8gZS5nLiA8c3Bhbj48d2JyPjwvc3Bhbj4KKyNp
ZiBBU1NFUlRfRU5BQkxFRAorICAgICAgICAgICAgZm9yIChhdXRvIGkgPSBpbmRleCArIDE7IGkg
PCBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXg7ICsraSkKKyAgICAgICAgICAgICAgICBBU1NFUlQo
bV9pbmxpbmVJdGVtc1tpXS5pc0lubGluZUJveEVuZCgpKTsKKyNlbmRpZgorICAgICAgICAgICAg
aW5saW5lSXRlbS5pc0xpbmVCcmVhaygpID8gbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmFw
cGVuZFRyYWlsaW5nTGluZUJyZWFrKGlubGluZUl0ZW0pIDogbGluZUNhbmRpZGF0ZS5pbmxpbmVD
b250ZW50LmFwcGVuZHRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoaW5saW5lSXRlbSk7Cisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICB9CisgICAgYXV0byBpbmxpbmVDb250ZW50RW5kc0luU29mdFdyYXBPcHBvcnR1
bml0eSA9IFsmXSB7CisgICAgICAgIGlmICghc29mdFdyYXBPcHBvcnR1bml0eUluZGV4IHx8IHNv
ZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCA9PSBsYXlvdXRSYW5nZS5lbmQpIHsKKyAgICAgICAgICAg
IC8vIFRoaXMgY2FuZGlkYXRlIGlubGluZSBjb250ZW50IGVuZHMgYmVjYXVzZSB0aGUgZW50aXJl
IGNvbnRlbnQgZW5kcyBhbmQgbm90IGJlY2F1c2UgdGhlcmUncyBhIHNvZnQgd3JhcCBvcHBvcnR1
bml0eS4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAo
bV9pbmxpbmVJdGVtc1tzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggLSAxXS5pc0Zsb2F0KCkpIHsK
KyAgICAgICAgICAgIC8vIFdoaWxlIHdlIHN0b3AgYXQgZmxvYXRzLCB0aGV5IGFyZSBub3QgY29u
c2lkZXJlZCByZWFsIHNvZnQgd3JhcCBvcHBvcnR1bml0aWVzLiAKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RS
L2Nzcy10ZXh0LTMvI2xpbmUtYnJlYWstZGV0YWlscworICAgICAgICBhdXRvJiB0cmFpbGluZ0lu
bGluZUl0ZW0gPSBtX2lubGluZUl0ZW1zW3NvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCAtIDFdOwor
ICAgICAgICBpZiAodHJhaWxpbmdJbmxpbmVJdGVtLmlzQm94KCkgfHwgdHJhaWxpbmdJbmxpbmVJ
dGVtLmlzTGluZUJyZWFrKCkgfHwgdHJhaWxpbmdJbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0
dW5pdHkoKSB8fCB0cmFpbGluZ0lubGluZUl0ZW0uaXNJbmxpbmVCb3hFbmQoKSkgeworICAgICAg
ICAgICAgLy8gRm9yIFdlYi1jb21wYXRpYmlsaXR5IHRoZXJlIGlzIGEgc29mdCB3cmFwIG9wcG9y
dHVuaXR5IGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCByZXBsYWNlZCBlbGVtZW50IG9yIG90aGVyIGF0
b21pYyBpbmxpbmUuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAg
ICBpZiAodHJhaWxpbmdJbmxpbmVJdGVtLmlzVGV4dCgpKSB7CisgICAgICAgICAgICBhdXRvJiBp
bmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPih0cmFpbGluZ0lubGluZUl0
ZW0pOworICAgICAgICAgICAgaWYgKGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpKQorICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgLy8gTm93IGluIGNhc2Ugb2Yg
bm9uLXdoaXRlc3BhY2UgdHJhaWxpbmcgY29udGVudCwgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUg
YWN0dWFsIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBiZWxvbmdzIHRvIHRoZSBuZXh0IHNldC4KKyAg
ICAgICAgICAgIC8vIGUuZy4gInRoaXNfaXNfdGhlX3RyYWlsaW5nX3J1bjxzcGFuPiA8LWJ1dF90
aGlzX3NwYWNlX2hlcmVfaXNfdGhlX3NvZnRfd3JhcF9vcHBvcnR1bml0eSIKKyAgICAgICAgICAg
IC8vIFdoZW4gdGhlcmUncyBhbiBpbmxpbmUgYm94IHN0YXJ0KDxzcGFuPikvZW5kKDwvc3Bhbj4p
IGJldHdlZW4gdGhlIHRyYWlsaW5nIGFuZCB0aGUgKG5leHQpbGVhZGluZyBydW4sIHdoaWxlIHdl
IGJyZWFrIGJlZm9yZSB0aGUgaW5saW5lIGJveCBzdGFydCAoPHNwYW4+KQorICAgICAgICAgICAg
Ly8gdGhlIGFjdHVhbCBzb2Z0IHdyYXAgcG9zaXRpb24gaXMgYWZ0ZXIgdGhlIGlubGluZSBib3gg
c3RhcnQgKDxzcGFuPikgYnV0IGluIHRlcm1zIG9mIGxpbmUgYnJlYWtpbmcgY29udGludWl0eSB0
aGUgaW5saW5lIGJveCBzdGFydCAoPHNwYW4+KSBhbmQgdGhlIHdoaXRlc3BhY2UgcnVuIGJlbG9u
ZyB0b2dldGhlci4KKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKGxheW91dFJhbmdlLmVuZCA8
PSBtX2lubGluZUl0ZW1zLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGF1dG8gaW5kZXggPSBz
b2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXg7IGluZGV4IDwgbGF5b3V0UmFuZ2UuZW5kOyArK2luZGV4
KSB7CisgICAgICAgICAgICAgICAgaWYgKG1faW5saW5lSXRlbXNbaW5kZXhdLmlzSW5saW5lQm94
U3RhcnQoKSB8fCBtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJveEVuZCgpKQorICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogQ2hlY2sg
aWYgW25vbi13aGl0ZXNwYWNlXVtpbmxpbmUtYm94XVtuby13aGl0ZXNwYWNlXSBjb250ZW50IGhh
cyBydWxlcyBhYm91dCBpdC4KKyAgICAgICAgICAgICAgICAvLyBGb3Igbm93IGxldCdzIHNheSB0
aGUgc29mdCB3cmFwIHBvc2l0aW9uIGJlbG9uZ3MgdG8gdGhlIG5leHQgc2V0IG9mIHJ1bnMgd2hl
biBbbm9uLXdoaXRlc3BhY2VdW2lubGluZS1ib3hdW3doaXRlc3BhY2VdLCBbbm9uLXdoaXRlc3Bh
Y2VdW2lubGluZS1ib3hdW2JveF0gZXRjLgorICAgICAgICAgICAgICAgIHJldHVybiBtX2lubGlu
ZUl0ZW1zW2luZGV4XS5pc1RleHQoKSAmJiAhZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KG1faW5s
aW5lSXRlbXNbaW5kZXhdKS5pc1doaXRlc3BhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworICAgIGxpbmVDYW5kaWRhdGUuaW5saW5l
Q29udGVudC5zZXRIYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoaW5saW5lQ29udGVudEVu
ZHNJblNvZnRXcmFwT3Bwb3J0dW5pdHkoKSk7Cit9CisKK3NpemVfdCBMaW5lQnVpbGRlcjo6bmV4
dFdyYXBPcHBvcnR1bml0eShzaXplX3Qgc3RhcnRJbmRleCwgY29uc3QgTGluZUJ1aWxkZXI6Oklu
bGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFuZ2UpIGNvbnN0Cit7CisgICAgLy8gMS4gRmluZCB0aGUg
c3RhcnQgY2FuZGlkYXRlIGJ5IHNraXBwaW5nIGxlYWRpbmcgbm9uLWNvbnRlbnQgaXRlbXMgZS5n
ICI8c3Bhbj48c3Bhbj5zdGFydCIuIE9wcG9ydHVuaXR5IGlzIGFmdGVyICI8c3Bhbj48c3Bhbj4i
LgorICAgIC8vIDIuIEZpbmQgdGhlIGVuZCBjYW5kaWRhdGUgYnkgc2tpcHBpbmcgbm9uLWNvbnRl
bnQgaXRlbXMgaW5iZXR3ZWVuIGUuZy4gIjxzcGFuPjxzcGFuPnN0YXJ0PC9zcGFuPmVuZCIuIE9w
cG9ydHVuaXR5IGlzIGFmdGVyICI8L3NwYW4+Ii4KKyAgICAvLyAzLiBDaGVjayBpZiB0aGVyZSdz
IGEgc29mdCB3cmFwIG9wcG9ydHVuaXR5IGJldHdlZW4gdGhlIDIgY2FuZGlkYXRlIGlubGluZSBp
dGVtcyBhbmQgcmVwZWF0LgorICAgIC8vIDQuIEFueSBmb3JjZSBsaW5lIGJyZWFrL2V4cGxpY2l0
IHdyYXAgY29udGVudCBpbmJldHdlZW4gaXMgY29uc2lkZXJlZCBhcyB3cmFwIG9wcG9ydHVuaXR5
LgorCisgICAgLy8gW2V4LV1baW5saW5lIGJveCBzdGFydF1baW5saW5lIGJveCBlbmRdW2Zsb2F0
XVthbXBsZV0gKGV4LTxzcGFuPjwvc3Bhbj48ZGl2IHN0eWxlPSJmbG9hdDpsZWZ0Ij48L2Rpdj5h
bXBsZSkuIFdyYXAgaW5kZXggaXMgYXQgW2V4LV0uCisgICAgLy8gW2V4XVtpbmxpbmUgYm94IHN0
YXJ0XVthbXAtXVtpbmxpbmUgYm94IHN0YXJ0XVtsZV0gKGV4PHNwYW4+YW1wLTxzcGFuPmFtcGxl
KS4gV3JhcCBpbmRleCBpcyBhdCBbYW1wLV0uCisgICAgLy8gW2V4LV1baW5saW5lIGJveCBzdGFy
dF1bbGluZSBicmVha11bYW1wbGVdIChleC08c3Bhbj48YnI+YW1wbGUpLiBXcmFwIGluZGV4IGlz
IGFmdGVyIFticl0uCisgICAgYXV0byBwcmV2aW91c0lubGluZUl0ZW1JbmRleCA9IE9wdGlvbmFs
PHNpemVfdD4geyB9OworICAgIGZvciAoYXV0byBpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDwg
bGF5b3V0UmFuZ2UuZW5kOyArK2luZGV4KSB7CisgICAgICAgIGF1dG8mIGlubGluZUl0ZW0gPSBt
X2lubGluZUl0ZW1zW2luZGV4XTsKKyAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNMaW5lQnJlYWso
KSB8fCBpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkgeworICAgICAgICAgICAg
Ly8gV2UgYWx3YXlzIHN0b3AgYXQgZXhwbGljaXQgd3JhcHBpbmcgb3Bwb3J0dW5pdGllcyBlLmcu
IDxicj4uIEhvd2V2ZXIgdGhlIHdyYXAgcG9zaXRpb24gbWF5IGJlIGF0IGxhdGVyIHBvc2l0aW9u
LgorICAgICAgICAgICAgLy8gZS5nLiA8c3Bhbj48c3Bhbj48YnI+PC9zcGFuPjwvc3Bhbj4gPC0g
d3JhcCBwb3NpdGlvbiBpcyBhZnRlciB0aGUgc2Vjb25kIDwvc3Bhbj4KKyAgICAgICAgICAgIC8v
IGJ1dCBpbiBjYXNlIG9mIDxzcGFuPjxicj48c3Bhbj48L3NwYW4+PC9zcGFuPiA8LSB3cmFwIHBv
c2l0aW9uIGlzIHJpZ2h0IGFmdGVyIDxicj4uCisgICAgICAgICAgICBmb3IgKCsraW5kZXg7IGlu
ZGV4IDwgbGF5b3V0UmFuZ2UuZW5kICYmIG1faW5saW5lSXRlbXNbaW5kZXhdLmlzSW5saW5lQm94
RW5kKCk7ICsraW5kZXgpIHsgfQorICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9
CisgICAgICAgIGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVt
LmlzSW5saW5lQm94RW5kKCkpIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gc2VlIHdoYXQgY29t
ZXMgbmV4dCB0byBkZWNpZGUuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAg
ICAgICBBU1NFUlQoaW5saW5lSXRlbS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlzQm94KCkgfHwg
aW5saW5lSXRlbS5pc0Zsb2F0KCkpOworICAgICAgICBpZiAoIXByZXZpb3VzSW5saW5lSXRlbUlu
ZGV4KSB7CisgICAgICAgICAgICBwcmV2aW91c0lubGluZUl0ZW1JbmRleCA9IGluZGV4OworICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBw
cmV2aW91cyBhbmQgY3VycmVudCBpdGVtcyBhcmUgbm90IG5lY2Vzc2FyaWx5IGFkamFjZW50IGl0
ZW1zIGUuZyAicHJldmlvdXM8c3Bhbj5jdXJyZW50PC9zcGFuPiIKKyAgICAgICAgYXV0byYgcHJl
dmlvdXNJdGVtID0gbV9pbmxpbmVJdGVtc1sqcHJldmlvdXNJbmxpbmVJdGVtSW5kZXhdOworICAg
ICAgICBhdXRvJiBjdXJyZW50SXRlbSA9IG1faW5saW5lSXRlbXNbaW5kZXhdOworICAgICAgICBp
ZiAoaXNBdFNvZnRXcmFwT3Bwb3J0dW5pdHkobV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dCwgcHJl
dmlvdXNJdGVtLCBjdXJyZW50SXRlbSkpIHsKKyAgICAgICAgICAgIGlmICgqcHJldmlvdXNJbmxp
bmVJdGVtSW5kZXggKyAxID09IGluZGV4ICYmICghcHJldmlvdXNJdGVtLmlzVGV4dCgpIHx8ICFj
dXJyZW50SXRlbS5pc1RleHQoKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGtub3cg
dGhlIGV4YWN0IHNvZnQgd3JhcCBvcHBvcnR1bml0eSBpbmRleCB3aGVuIHRoZSBwcmV2aW91cyBh
bmQgY3VycmVudCBpdGVtcyBhcmUgbmV4dCB0byBlYWNoIG90aGVyLgorICAgICAgICAgICAgICAg
IHJldHVybiBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRoZXJlJ3MgYSBz
b2Z0IHdyYXAgb3Bwb3J0dW5pdHkgYmV0d2VlbiAncHJldmlvdXNJbmxpbmVJdGVtSW5kZXgnIGFu
ZCAnaW5kZXgnLgorICAgICAgICAgICAgLy8gTm93IGZvcndhcmQtZmluZCBmcm9tIHRoZSBzdGFy
dCBwb3NpdGlvbiB0byBzZWUgd2hlcmUgd2UgY2FuIGFjdHVhbGx5IHdyYXAuCisgICAgICAgICAg
ICAvLyBbZXgtXVthbXBsZV0gdnMuIFtleC1dW2lubGluZSBib3ggc3RhcnRdW2lubGluZSBib3gg
ZW5kXVthbXBsZV0KKyAgICAgICAgICAgIC8vIHdoZXJlIFtleC1dIGlzIHN0YXJ0Q29udGVudCBh
bmQgW2FtcGxlXSBpcyB0aGUgbmV4dENvbnRlbnQuCisgICAgICAgICAgICBmb3IgKGF1dG8gY2Fu
ZGlkYXRlSW5kZXggPSAqcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggKyAxOyBjYW5kaWRhdGVJbmRl
eCA8IGluZGV4OyArK2NhbmRpZGF0ZUluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKG1faW5s
aW5lSXRlbXNbY2FuZGlkYXRlSW5kZXhdLmlzSW5saW5lQm94U3RhcnQoKSkgeworICAgICAgICAg
ICAgICAgICAgICAvLyBpbmxpbmUgY29udGVudCBhbmQgW2lubGluZSBib3ggc3RhcnRdIGFuZCBb
aW5saW5lIGJveCBlbmRdIGZvcm0gdW5icmVha2FibGUgY29udGVudC4KKyAgICAgICAgICAgICAg
ICAgICAgLy8gZXgtPHNwYW4+PC9zcGFuPmFtcGxlICA6IHdyYXAgb3Bwb3J0dW5pdHkgaXMgYWZ0
ZXIgImV4LSIuCisgICAgICAgICAgICAgICAgICAgIC8vIGV4LTwvc3Bhbj48L3NwYW4+YW1wbGUg
OiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC08L3NwYW4+PC9zcGFuPiIuCisgICAgICAg
ICAgICAgICAgICAgIC8vIGV4LTwvc3Bhbj48c3Bhbj5hbXBsZTwvc3Bhbj4gOiB3cmFwIG9wcG9y
dHVuaXR5IGlzIGFmdGVyICJleC08L3NwYW4+Ii4KKyAgICAgICAgICAgICAgICAgICAgLy8gZXgt
PHNwYW4+PHNwYW4+YW1wbGU8L3NwYW4+PC9zcGFuPiA6IHdyYXAgb3Bwb3J0dW5pdHkgaXMgYWZ0
ZXIgImV4LSIuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVJbmRleDsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5kZXg7
CisgICAgICAgIH0KKyAgICAgICAgcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBpbmRleDsKKyAg
ICB9CisgICAgcmV0dXJuIGxheW91dFJhbmdlLmVuZDsKK30KKwordm9pZCBMaW5lQnVpbGRlcjo6
aGFuZGxlRmxvYXRDb250ZW50KGNvbnN0IElubGluZUl0ZW0mIGZsb2F0SXRlbSkKK3sKKyAgICBh
dXRvJiBmbG9hdEJveCA9IGZsb2F0SXRlbS5sYXlvdXRCb3goKTsKKyAgICBtX2Zsb2F0cy5hcHBl
bmQoJmZsb2F0Qm94KTsKKworICAgIGF1dG8qIGZsb2F0aW5nU3RhdGUgPSB0aGlzLT5mbG9hdGlu
Z1N0YXRlKCk7CisgICAgaWYgKCFmbG9hdGluZ1N0YXRlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBBU1NFUlQoZm9ybWF0dGluZ1N0YXRlKCkpOworICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9y
bWF0dGluZ1N0YXRlKCktPmJveEdlb21ldHJ5KGZsb2F0Qm94KTsKKyAgICAvLyBTZXQgc3RhdGlj
IHBvc2l0aW9uIGZpcnN0LgorICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KExheW91
dFBvaW50IHsgbV9saW5lTG9naWNhbFJlY3QudG9wTGVmdCgpIH0pOworICAgIC8vIEZsb2F0IGl0
LgorICAgIEFTU0VSVChtX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHMpOworICAgIGF1dG8gZmxv
YXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250ZXh0IHsgZm9ybWF0dGluZ0NvbnRleHQoKSwgKmZs
b2F0aW5nU3RhdGUgfTsKKyAgICBhdXRvIGZsb2F0aW5nUG9zaXRpb24gPSBmbG9hdGluZ0NvbnRl
eHQucG9zaXRpb25Gb3JGbG9hdChmbG9hdEJveCwgKm1fcm9vdEhvcml6b250YWxDb25zdHJhaW50
cyk7CisgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQoZmxvYXRpbmdQb3NpdGlvbik7
CisgICAgZmxvYXRpbmdTdGF0ZS0+YXBwZW5kKGZsb2F0aW5nQ29udGV4dC50b0Zsb2F0SXRlbShm
bG9hdEJveCkpOworICAgIC8vIENoZWNrIGlmIHRoaXMgZmxvYXQgc2hyaW5rcyB0aGUgbGluZSAo
dGhleSBkb24ndCBnZXQgcG9zaXRpb25lZCBoaWdoZXIgdGhhbiB0aGUgbGluZSkuCisgICAgaWYg
KGZsb2F0aW5nUG9zaXRpb24ueSgpID4gbV9saW5lTG9naWNhbFJlY3QuYm90dG9tKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0ID0gdHJ1ZTsK
KyAgICBhdXRvIGZsb2F0Qm94V2lkdGggPSBpbmxpbmVJdGVtV2lkdGgoZmxvYXRJdGVtLCB7IH0p
OworICAgIGlmIChmbG9hdEJveC5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAg
bV9saW5lTG9naWNhbFJlY3Quc2V0TGVmdChtX2xpbmVMb2dpY2FsUmVjdC5sZWZ0KCkgKyBmbG9h
dEJveFdpZHRoKTsgICAgCisgICAgbV9saW5lTG9naWNhbFJlY3QuZXhwYW5kSG9yaXpvbnRhbGx5
KC1mbG9hdEJveFdpZHRoKTsKK30KKworTGluZUJ1aWxkZXI6OlJlc3VsdCBMaW5lQnVpbGRlcjo6
aGFuZGxlSW5saW5lQ29udGVudChJbmxpbmVDb250ZW50QnJlYWtlciYgaW5saW5lQ29udGVudEJy
ZWFrZXIsIGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFuZ2UsIGNvbnN0IExpbmVDYW5k
aWRhdGUmIGxpbmVDYW5kaWRhdGUpCit7CisgICAgYXV0byYgaW5saW5lQ29udGVudCA9IGxpbmVD
YW5kaWRhdGUuaW5saW5lQ29udGVudDsKKyAgICBpZiAoaW5saW5lQ29udGVudC5jb250aW51b3Vz
Q29udGVudCgpLnJ1bnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgQVNTRVJUKGlubGluZUNvbnRl
bnQudHJhaWxpbmdMaW5lQnJlYWsoKSB8fCBpbmxpbmVDb250ZW50LnRyYWlsaW5nV29yZEJyZWFr
T3Bwb3J0dW5pdHkoKSk7CisgICAgICAgIHJldHVybiB7IGlubGluZUNvbnRlbnQudHJhaWxpbmdM
aW5lQnJlYWsoKSA/IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzIDogSW5s
aW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9OworICAgIH0KKyAgICBhdXRvIHNo
b3VsZERpc2FibGVIeXBoZW5hdGlvbiA9IFsmXSB7CisgICAgICAgIGF1dG8mIHN0eWxlID0gcm9v
dCgpLnN0eWxlKCk7CisgICAgICAgIHVuc2lnbmVkIGxpbWl0TGluZXMgPSBzdHlsZS5oeXBoZW5h
dGlvbkxpbWl0TGluZXMoKSA9PSBSZW5kZXJTdHlsZTo6aW5pdGlhbEh5cGhlbmF0aW9uTGltaXRM
aW5lcygpID8gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpIDogc3R5bGUuaHlw
aGVuYXRpb25MaW1pdExpbmVzKCk7CisgICAgICAgIHJldHVybiBtX3N1Y2Nlc3NpdmVIeXBoZW5h
dGVkTGluZUNvdW50ID49IGxpbWl0TGluZXM7CisgICAgfTsKKyAgICBpZiAoc2hvdWxkRGlzYWJs
ZUh5cGhlbmF0aW9uKCkpCisgICAgICAgIGlubGluZUNvbnRlbnRCcmVha2VyLnNldEh5cGhlbmF0
aW9uRGlzYWJsZWQoKTsKKworICAgIGF1dG8mIGNvbnRpbnVvdXNJbmxpbmVDb250ZW50ID0gbGlu
ZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmNvbnRpbnVvdXNDb250ZW50KCk7CisgICAgYXV0byBs
aW5lTG9naWNhbFJlY3RGb3JDYW5kaWRhdGVDb250ZW50ID0gWyZdIHsKKyAgICAgICAgLy8gQ2hl
Y2sgaWYgdGhlIGNhbmRpZGF0ZSBjb250ZW50IHdvdWxkIHN0cmV0Y2ggdGhlIGxpbmUgYW5kIHdo
ZXRoZXIgYWRkaXRpb25hbCBmbG9hdHMgYXJlIGdldHRpbmcgaW4gdGhlIHdheS4KKyAgICAgICAg
aWYgKCFmbG9hdGluZ1N0YXRlKCkgfHwgIWlubGluZUNvbnRlbnQuaGFzSW5saW5lTGV2ZWxCb3go
KSkKKyAgICAgICAgICAgIHJldHVybiBtX2xpbmVMb2dpY2FsUmVjdDsKKyAgICAgICAgYXV0byBt
YXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQgPSBtX2xpbmVMb2dpY2FsUmVjdC5oZWlnaHQoKTsKKyAg
ICAgICAgZm9yIChhdXRvJiBydW4gOiBjb250aW51b3VzSW5saW5lQ29udGVudC5ydW5zKCkpIHsK
KyAgICAgICAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3IgaW5saW5lIGJveGVzIHRvby4K
KyAgICAgICAgICAgIGlmICghcnVuLmlubGluZUl0ZW0uaXNCb3goKSkKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIG1heGltdW1MaW5lTG9naWNhbEhlaWdodCA9IHN0ZDo6
bWF4KG1heGltdW1MaW5lTG9naWNhbEhlaWdodCwgSW5saW5lTGF5b3V0VW5pdCB7IGZvcm1hdHRp
bmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gocnVuLmlubGluZUl0ZW0ubGF5b3V0Qm94KCkpLm1h
cmdpbkJveEhlaWdodCgpIH0pOworICAgICAgICB9CisgICAgICAgIGlmIChtYXhpbXVtTGluZUxv
Z2ljYWxIZWlnaHQgPT0gbV9saW5lTG9naWNhbFJlY3QuaGVpZ2h0KCkpCisgICAgICAgICAgICBy
ZXR1cm4gbV9saW5lTG9naWNhbFJlY3Q7CisgICAgICAgIGF1dG8gYWRqdXN0ZWRMaW5lTG9naWNh
bFJlY3QgPSBJbmxpbmVSZWN0IHsgbV9saW5lTG9naWNhbFJlY3QudG9wKCksIG1fbGluZUxvZ2lj
YWxSZWN0LmxlZnQoKSwgbV9saW5lTG9naWNhbFJlY3Qud2lkdGgoKSwgbWF4aW11bUxpbmVMb2dp
Y2FsSGVpZ2h0IH07CisgICAgICAgIGlmIChhdXRvIGhvcml6b250YWxDb25zdHJhaW50cyA9IGZs
b2F0Q29uc3RyYWludHMoYWRqdXN0ZWRMaW5lTG9naWNhbFJlY3QpKSB7CisgICAgICAgICAgICBh
ZGp1c3RlZExpbmVMb2dpY2FsUmVjdC5zZXRMZWZ0KGhvcml6b250YWxDb25zdHJhaW50cy0+bG9n
aWNhbExlZnQpOworICAgICAgICAgICAgYWRqdXN0ZWRMaW5lTG9naWNhbFJlY3Quc2V0V2lkdGgo
aG9yaXpvbnRhbENvbnN0cmFpbnRzLT5sb2dpY2FsV2lkdGgpOworICAgICAgICB9CisgICAgICAg
IHJldHVybiBhZGp1c3RlZExpbmVMb2dpY2FsUmVjdDsKKyAgICB9KCk7CisgICAgYXV0byBhdmFp
bGFibGVXaWR0aCA9IFsmXSB7CisgICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGhGb3JDb250ZW50
ID0gbGluZUxvZ2ljYWxSZWN0Rm9yQ2FuZGlkYXRlQ29udGVudC53aWR0aCgpIC0gbV9saW5lLmNv
bnRlbnRMb2dpY2FsUmlnaHQoKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6aXNuYW4oYXZhaWxhYmxl
V2lkdGhGb3JDb250ZW50KSA/IG1heElubGluZUxheW91dFVuaXQoKSA6IGF2YWlsYWJsZVdpZHRo
Rm9yQ29udGVudDsKKyAgICB9KCk7CisgICAgLy8gV2hpbGUgdGhlIGZsb2F0cyBhcmUgbm90IGNv
bnNpZGVyZWQgdG8gYmUgb24gdGhlIGxpbmUsIHRoZXkgbWFrZSB0aGUgbGluZSBjb250ZW50ZnVs
IGZvciBsaW5lIGJyZWFraW5nLgorICAgIGF1dG8gbGluZUhhc0NvbnRlbnQgPSAhbV9saW5lLnJ1
bnMoKS5pc0VtcHR5KCkgfHwgbV9jb250ZW50SXNDb25zdHJhaW5lZEJ5RmxvYXQ7CisgICAgYXV0
byBsaW5lU3RhdHVzID0gSW5saW5lQ29udGVudEJyZWFrZXI6OkxpbmVTdGF0dXMgeyBtX2xpbmUu
Y29udGVudExvZ2ljYWxSaWdodCgpLCBhdmFpbGFibGVXaWR0aCwgbV9saW5lLnRyaW1tYWJsZVRy
YWlsaW5nV2lkdGgoKSwgbV9saW5lLnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCksIG1fbGluZS5p
c1RyYWlsaW5nUnVuRnVsbHlUcmltbWFibGUoKSwgbGluZUhhc0NvbnRlbnQsICFtX3dyYXBPcHBv
cnR1bml0eUxpc3QuaXNFbXB0eSgpIH07CisgICAgYXV0byByZXN1bHQgPSBpbmxpbmVDb250ZW50
QnJlYWtlci5wcm9jZXNzSW5saW5lQ29udGVudChjb250aW51b3VzSW5saW5lQ29udGVudCwgbGlu
ZVN0YXR1cyk7CisgICAgYXV0byYgY2FuZGlkYXRlUnVucyA9IGNvbnRpbnVvdXNJbmxpbmVDb250
ZW50LnJ1bnMoKTsKKyAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250ZW50QnJlYWtl
cjo6UmVzdWx0OjpBY3Rpb246OktlZXApIHsKKyAgICAgICAgLy8gVGhpcyBjb250aW51b3VzIGNv
bnRlbnQgY2FuIGJlIGZ1bGx5IHBsYWNlZCBvbiB0aGUgY3VycmVudCBsaW5lLgorICAgICAgICBt
X2xpbmVMb2dpY2FsUmVjdCA9IGxpbmVMb2dpY2FsUmVjdEZvckNhbmRpZGF0ZUNvbnRlbnQ7Cisg
ICAgICAgIGZvciAoYXV0byYgcnVuIDogY2FuZGlkYXRlUnVucykKKyAgICAgICAgICAgIG1fbGlu
ZS5hcHBlbmQocnVuLmlubGluZUl0ZW0sIHJ1bi5sb2dpY2FsV2lkdGgpOworICAgICAgICBpZiAo
bGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50Lmhhc1RyYWlsaW5nU29mdFdyYXBPcHBvcnR1bml0
eSgpKSB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgYWxsb3dlZCB0byB3cmFwIGF0
IHRoaXMgcG9zaXRpb24uCisgICAgICAgICAgICBhdXRvJiB0cmFpbGluZ0l0ZW0gPSBjYW5kaWRh
dGVSdW5zLmxhc3QoKS5pbmxpbmVJdGVtOworICAgICAgICAgICAgLy8gRklYTUU6IFRoZXJlIG11
c3QgYmUgYSB3YXkgdG8gZGVjaWRlIGlmIHRoZSB0cmFpbGluZyBydW4gYWN0dWFsbHkgZW5kZWQg
dXAgb24gdGhlIGxpbmUuCisgICAgICAgICAgICAvLyBMZXQncyBqdXN0IGRlYWwgd2l0aCBjb2xs
YXBzZWQgbGVhZGluZyB3aGl0ZXNwYWNlIGZvciBub3cuCisgICAgICAgICAgICBpZiAoIW1fbGlu
ZS5ydW5zKCkuaXNFbXB0eSgpICYmIElubGluZUNvbnRlbnRCcmVha2VyOjppc1dyYXBwaW5nQWxs
b3dlZCh0cmFpbGluZ0l0ZW0pKQorICAgICAgICAgICAgICAgIG1fd3JhcE9wcG9ydHVuaXR5TGlz
dC5hcHBlbmQoJnRyYWlsaW5nSXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHsgcmVz
dWx0LmlzRW5kT2ZMaW5lLCB7IGNhbmRpZGF0ZVJ1bnMuc2l6ZSgpLCBmYWxzZSB9IH07CisgICAg
fQorCisgICAgYXV0byBlbGlnaWJsZU92ZXJmbG93V2lkdGhBc0xlYWRpbmcgPSBbJl0gKCkgLT4g
T3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geworICAgICAgICAvLyBGSVhNRTogQWRkIHN1cHBv
cnQgZm9yIG90aGVyIHR5cGVzIG9mIGNvbnRpbnVvdXMgY29udGVudC4KKyAgICAgICAgQVNTRVJU
KHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpX
cmFwIHx8IHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0
aW9uOjpCcmVhayk7CisgICAgICAgIGlmIChjYW5kaWRhdGVSdW5zLnNpemUoKSAhPSAxIHx8ICFj
YW5kaWRhdGVSdW5zLmZpcnN0KCkuaW5saW5lSXRlbS5pc1RleHQoKSkKKyAgICAgICAgICAgIHJl
dHVybiB7IH07CisgICAgICAgIGF1dG8mIGlubGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5l
VGV4dEl0ZW0+KGNhbmRpZGF0ZVJ1bnMuZmlyc3QoKS5pbmxpbmVJdGVtKTsKKyAgICAgICAgaWYg
KGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsK
KyAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3Vs
dDo6QWN0aW9uOjpXcmFwKQorICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVJ1bnMuZmlyc3Qo
KS5sb2dpY2FsV2lkdGg7CisgICAgICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRl
bnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6QnJlYWsgJiYgcmVzdWx0LnBhcnRpYWxUcmFpbGlu
Z0NvbnRlbnQtPnBhcnRpYWxSdW4pCisgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlUnVucy5m
aXJzdCgpLmxvZ2ljYWxXaWR0aCAtIHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50LT5wYXJ0
aWFsUnVuLT5sb2dpY2FsV2lkdGg7CisgICAgICAgIHJldHVybiB7IH07CisgICAgfTsKKworICAg
IGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlv
bjo6V3JhcCkgeworICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09IElubGluZUNv
bnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKKyAgICAgICAgLy8gVGhpcyBjb250aW51
b3VzIGNvbnRlbnQgY2FuJ3QgYmUgcGxhY2VkIG9uIHRoZSBjdXJyZW50IGxpbmUuIE5vdGhpbmcg
dG8gY29tbWl0IGF0IHRoaXMgdGltZS4KKyAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJy
ZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgfSwgeyB9LCBlbGlnaWJsZU92ZXJmbG93V2lkdGhB
c0xlYWRpbmcoKSB9OworICAgIH0KKyAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250
ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rpb246OldyYXBXaXRoSHlwaGVuKSB7CisgICAgICAgIEFT
U0VSVChyZXN1bHQuaXNFbmRPZkxpbmUgPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZM
aW5lOjpZZXMpOworICAgICAgICAvLyBUaGlzIGNvbnRpbnVvdXMgY29udGVudCBjYW4ndCBiZSBw
bGFjZWQgb24gdGhlIGN1cnJlbnQgbGluZSwgbm90aGluZyB0byBjb21taXQuCisgICAgICAgIC8v
IEhvd2V2ZXIgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY3VycmVudCBsaW5lIGdhaW5z
IGEgdHJhaWxpbmcgaHlwaGVuLgorICAgICAgICBBU1NFUlQobV9saW5lLnRyYWlsaW5nU29mdEh5
cGhlbldpZHRoKCkpOworICAgICAgICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBoZW4oKm1fbGluZS50
cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpKTsKKyAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29udGVu
dEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMgfTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5hY3Rp
b24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xhc3RX
cmFwT3Bwb3J0dW5pdHkpIHsKKyAgICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJ
bmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olllcyk7CisgICAgICAgIC8vIE5vdCBv
bmx5IHRoaXMgY29udGVudCBjYW4ndCBiZSBwbGFjZWQgb24gdGhlIGN1cnJlbnQgbGluZSwgYnV0
IHdlIGV2ZW4gbmVlZCB0byByZXZlcnQgdGhlIGxpbmUgYmFjayB0byBhbiBlYXJsaWVyIHBvc2l0
aW9uLgorICAgICAgICBBU1NFUlQoIW1fd3JhcE9wcG9ydHVuaXR5TGlzdC5pc0VtcHR5KCkpOwor
ICAgICAgICByZXR1cm4geyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olllcywg
eyByZWJ1aWxkTGluZShsYXlvdXRSYW5nZSwgKm1fd3JhcE9wcG9ydHVuaXR5TGlzdC5sYXN0KCkp
LCB0cnVlIH0gfTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVu
dEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xhc3ROb25PdmVyZmxvd2luZ1dyYXBP
cHBvcnR1bml0eSkgeworICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09IElubGlu
ZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKKyAgICAgICAgQVNTRVJUKCFtX3dy
YXBPcHBvcnR1bml0eUxpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29u
dGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgcmVidWlsZExpbmVGb3JUcmFpbGluZ1Nv
ZnRIeXBoZW4obGF5b3V0UmFuZ2UpLCB0cnVlIH0gfTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5h
Y3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpCcmVhaykgewor
ICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09IElubGluZUNvbnRlbnRCcmVha2Vy
OjpJc0VuZE9mTGluZTo6WWVzKTsKKyAgICAgICAgLy8gQ29tbWl0IHRoZSBjb21iaW5hdGlvbiBv
ZiBmdWxsIGFuZCBwYXJ0aWFsIGNvbnRlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAg
QVNTRVJUKHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50KTsKKyAgICAgICAgY29tbWl0UGFy
dGlhbENvbnRlbnQoY2FuZGlkYXRlUnVucywgKnJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50
KTsKKyAgICAgICAgLy8gV2hlbiBicmVha2luZyBtdWx0aXBsZSBydW5zIDxzcGFuIHN0eWxlPSJ3
b3JkLWJyZWFrOiBicmVhay1hbGwiPnRleHQ8L3NwYW4+PHNwYW4+Y29udGVudDwvc3Bhbj4sIHdl
IG1pZ2h0IGVuZCB1cCBicmVha2luZyB0aGVtIGF0IHJ1biBib3VuZGFyeS4KKyAgICAgICAgLy8g
SXQgc2ltcGx5IG1lYW5zIHdlIGRvbid0IHJlYWxseSBoYXZlIGEgcGFydGlhbCBydW4uIFBhcnRp
YWwgY29udGVudCB5ZXMsIGJ1dCBub3QgcGFydGlhbCBydW4uCisgICAgICAgIGF1dG8gdHJhaWxp
bmdSdW5JbmRleCA9IHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50LT50cmFpbGluZ1J1bklu
ZGV4OworICAgICAgICBhdXRvIGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCA9IHRyYWlsaW5nUnVu
SW5kZXggKyAxOworICAgICAgICBpZiAoIXJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50LT5w
YXJ0aWFsUnVuKQorICAgICAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6Oklz
RW5kT2ZMaW5lOjpZZXMsIHsgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50LCBmYWxzZSB9IH07CisK
KyAgICAgICAgYXV0byBwYXJ0aWFsUnVuID0gKnJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50
LT5wYXJ0aWFsUnVuOworICAgICAgICBhdXRvJiB0cmFpbGluZ0lubGluZVRleHRJdGVtID0gZG93
bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGNhbmRpZGF0ZVJ1bnNbdHJhaWxpbmdSdW5JbmRleF0uaW5s
aW5lSXRlbSk7CisgICAgICAgIEFTU0VSVChwYXJ0aWFsUnVuLmxlbmd0aCA8IHRyYWlsaW5nSW5s
aW5lVGV4dEl0ZW0ubGVuZ3RoKCkpOworICAgICAgICBhdXRvIG92ZXJmbG93TGVuZ3RoID0gdHJh
aWxpbmdJbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSAtIHBhcnRpYWxSdW4ubGVuZ3RoOworICAgICAg
ICByZXR1cm4geyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllcywgeyBjb21t
aXR0ZWRJbmxpbmVJdGVtQ291bnQsIGZhbHNlIH0sIG92ZXJmbG93TGVuZ3RoLCBlbGlnaWJsZU92
ZXJmbG93V2lkdGhBc0xlYWRpbmcoKSB9OworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICByZXR1cm4geyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Ok5vIH07
Cit9CisKK3ZvaWQgTGluZUJ1aWxkZXI6OmNvbW1pdFBhcnRpYWxDb250ZW50KGNvbnN0IElubGlu
ZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudDo6UnVuTGlzdCYgcnVucywgY29uc3Qg
SW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6UGFydGlhbFRyYWlsaW5nQ29udGVudCYgcGFy
dGlhbFRyYWlsaW5nQ29udGVudCkKK3sKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4
IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgYXV0byYgcnVuID0gcnVuc1tpbmRl
eF07CisgICAgICAgIGlmIChwYXJ0aWFsVHJhaWxpbmdDb250ZW50LnRyYWlsaW5nUnVuSW5kZXgg
PT0gaW5kZXgpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgY29tbWl0IHBhcnRpYWwgdHJh
aWxpbmcgaXRlbS4KKyAgICAgICAgICAgIGlmIChhdXRvIHBhcnRpYWxSdW4gPSBwYXJ0aWFsVHJh
aWxpbmdDb250ZW50LnBhcnRpYWxSdW4pIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQocnVuLmlu
bGluZUl0ZW0uaXNUZXh0KCkpOworICAgICAgICAgICAgICAgIGF1dG8mIHRyYWlsaW5nSW5saW5l
VGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4ocnVuc1twYXJ0aWFsVHJhaWxpbmdD
b250ZW50LnRyYWlsaW5nUnVuSW5kZXhdLmlubGluZUl0ZW0pOworICAgICAgICAgICAgICAgIGF1
dG8gcGFydGlhbFRyYWlsaW5nVGV4dEl0ZW0gPSB0cmFpbGluZ0lubGluZVRleHRJdGVtLmxlZnQo
cGFydGlhbFJ1bi0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtX2xpbmUuYXBwZW5kKHBhcnRp
YWxUcmFpbGluZ1RleHRJdGVtLCBwYXJ0aWFsUnVuLT5sb2dpY2FsV2lkdGgpOworICAgICAgICAg
ICAgICAgIGlmIChhdXRvIGh5cGhlbldpZHRoID0gcGFydGlhbFJ1bi0+aHlwaGVuV2lkdGgpCisg
ICAgICAgICAgICAgICAgICAgIG1fbGluZS5hZGRUcmFpbGluZ0h5cGhlbigqaHlwaGVuV2lkdGgp
OworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8v
IFRoZSBwYXJ0aWFsIHJ1biBpcyB0aGUgbGFzdCBjb250ZW50IHRvIGNvbW1pdC4KKyAgICAgICAg
ICAgIG1fbGluZS5hcHBlbmQocnVuLmlubGluZUl0ZW0sIHJ1bi5sb2dpY2FsV2lkdGgpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1fbGluZS5hcHBlbmQocnVuLmlu
bGluZUl0ZW0sIHJ1bi5sb2dpY2FsV2lkdGgpOworICAgIH0KK30KKworc2l6ZV90IExpbmVCdWls
ZGVyOjpyZWJ1aWxkTGluZShjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBjb25z
dCBJbmxpbmVJdGVtJiBsYXN0SW5saW5lSXRlbVRvQWRkKQoreworICAgIEFTU0VSVCghbV93cmFw
T3Bwb3J0dW5pdHlMaXN0LmlzRW1wdHkoKSk7CisgICAgLy8gV2UgbWlnaHQgYWxyZWFkeSBoYXZl
IGFkZGVkIGZsb2F0cy4gVGhleSBzaHJpbmsgdGhlIGF2YWlsYWJsZSBob3Jpem9udGFsIHNwYWNl
IGZvciB0aGUgbGluZS4KKyAgICAvLyBMZXQncyBqdXN0IHJldXNlIHdoYXQgdGhlIGxpbmUgaGFz
IGF0IHRoaXMgcG9pbnQuCisgICAgbV9saW5lLmluaXRpYWxpemUoKTsKKyAgICBhdXRvIGN1cnJl
bnRJdGVtSW5kZXggPSBsYXlvdXRSYW5nZS5zdGFydDsKKyAgICBpZiAobV9wYXJ0aWFsTGVhZGlu
Z1RleHRJdGVtKSB7CisgICAgICAgIG1fbGluZS5hcHBlbmQoKm1fcGFydGlhbExlYWRpbmdUZXh0
SXRlbSwgaW5saW5lSXRlbVdpZHRoKCptX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0sIHsgfSkpOwor
ICAgICAgICBpZiAoJm1fcGFydGlhbExlYWRpbmdUZXh0SXRlbS52YWx1ZSgpID09ICZsYXN0SW5s
aW5lSXRlbVRvQWRkKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICsrY3VycmVudEl0
ZW1JbmRleDsKKyAgICB9CisgICAgZm9yICg7IGN1cnJlbnRJdGVtSW5kZXggPCBsYXlvdXRSYW5n
ZS5lbmQ7ICsrY3VycmVudEl0ZW1JbmRleCkgeworICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0g
bV9pbmxpbmVJdGVtc1tjdXJyZW50SXRlbUluZGV4XTsKKyAgICAgICAgbV9saW5lLmFwcGVuZChp
bmxpbmVJdGVtLCBpbmxpbmVJdGVtV2lkdGgoaW5saW5lSXRlbSwgbV9saW5lLmNvbnRlbnRMb2dp
Y2FsUmlnaHQoKSkpOworICAgICAgICBpZiAoJmlubGluZUl0ZW0gPT0gJmxhc3RJbmxpbmVJdGVt
VG9BZGQpCisgICAgICAgICAgICByZXR1cm4gY3VycmVudEl0ZW1JbmRleCAtIGxheW91dFJhbmdl
LnN0YXJ0ICsgMTsKKyAgICB9CisgICAgcmV0dXJuIGxheW91dFJhbmdlLnNpemUoKTsKK30KKwor
c2l6ZV90IExpbmVCdWlsZGVyOjpyZWJ1aWxkTGluZUZvclRyYWlsaW5nU29mdEh5cGhlbihjb25z
dCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlKQoreworICAgIEFTU0VSVCghbV93cmFwT3Bw
b3J0dW5pdHlMaXN0LmlzRW1wdHkoKSk7CisgICAgLy8gUmV2ZXJ0IGFsbCB0aGUgd2F5IGJhY2sg
dG8gYSB3cmFwIG9wcG9ydHVuaXR5IHdoZW4gZWl0aGVyIGEgc29mdCBoeXBoZW4gZml0cyBvciBu
byBoeXBoZW4gaXMgcmVxdWlyZWQuCisgICAgZm9yIChhdXRvIGkgPSBtX3dyYXBPcHBvcnR1bml0
eUxpc3Quc2l6ZSgpOyBpLS0gPiAxOykgeworICAgICAgICBhdXRvJiBzb2Z0V3JhcE9wcG9ydHVu
aXR5SXRlbSA9ICptX3dyYXBPcHBvcnR1bml0eUxpc3RbaV07CisgICAgICAgIC8vIEZJWE1FOiBJ
ZiB0aGlzIHR1cm5zIG91dCB0byBiZSBhIHBlcmYgaXNzdWUsIHdlIGNvdWxkIGFsc28gdHJhdmVy
c2UgdGhlIHdyYXAgbGlzdCBhbmQga2VlcCBhZGRpbmcgdGhlIGl0ZW1zCisgICAgICAgIC8vIHdo
aWxlIHdhdGNoaW5nIHRoZSBhdmFpbGFibGUgd2lkdGggdmVyeSBjbG9zZWx5LgorICAgICAgICBh
dXRvIGNvbW1pdHRlZENvdW50ID0gcmVidWlsZExpbmUobGF5b3V0UmFuZ2UsIHNvZnRXcmFwT3Bw
b3J0dW5pdHlJdGVtKTsKKyAgICAgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IG1fbGluZUxvZ2lj
YWxSZWN0LndpZHRoKCkgLSBtX2xpbmUuY29udGVudExvZ2ljYWxSaWdodCgpOworICAgICAgICBh
dXRvIHRyYWlsaW5nU29mdEh5cGhlbldpZHRoID0gbV9saW5lLnRyYWlsaW5nU29mdEh5cGhlbldp
ZHRoKCk7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpbGluZyBoeXBoZW4gbm93IGZpdHMg
dGhlIGxpbmUgKG9yIHdlIGRvbid0IG5lZWQgaHloZW4gYW55bW9yZSkuCisgICAgICAgIGlmICgh
dHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggfHwgdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPD0gYXZh
aWxhYmxlV2lkdGgpIHsKKyAgICAgICAgICAgIGlmICh0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCkK
KyAgICAgICAgICAgICAgICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBoZW4oKnRyYWlsaW5nU29mdEh5
cGhlbldpZHRoKTsKKyAgICAgICAgICAgIHJldHVybiBjb21taXR0ZWRDb3VudDsKKyAgICAgICAg
fQorICAgIH0KKyAgICAvLyBIYXZlIGF0IGxlYXN0IHNvbWUgY29udGVudCBvbiB0aGUgbGluZS4K
KyAgICBhdXRvIGNvbW1pdHRlZENvdW50ID0gcmVidWlsZExpbmUobGF5b3V0UmFuZ2UsICptX3dy
YXBPcHBvcnR1bml0eUxpc3QuZmlyc3QoKSk7CisgICAgaWYgKGF1dG8gdHJhaWxpbmdTb2Z0SHlw
aGVuV2lkdGggPSBtX2xpbmUudHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgoKSkKKyAgICAgICAgbV9s
aW5lLmFkZFRyYWlsaW5nSHlwaGVuKCp0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCk7CisgICAgcmV0
dXJuIGNvbW1pdHRlZENvdW50OworfQorCitib29sIExpbmVCdWlsZGVyOjppc0xhc3RMaW5lV2l0
aElubGluZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsaW5lUmFuZ2UsIHNpemVfdCBs
YXN0SW5saW5lSXRlbUluZGV4LCBib29sIGhhc1BhcnRpYWxUcmFpbGluZ0NvbnRlbnQpIGNvbnN0
Cit7CisgICAgaWYgKGhhc1BhcnRpYWxUcmFpbGluZ0NvbnRlbnQpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBpZiAobGluZVJhbmdlLmVuZCA9PSBsYXN0SW5saW5lSXRlbUluZGV4KQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBPbWl0IGZsb2F0cyB0byBzZWUgaWYgdGhpcyBpcyB0
aGUgbGFzdCBsaW5lIHdpdGggaW5saW5lIGNvbnRlbnQuCisgICAgZm9yIChhdXRvIGkgPSBsYXN0
SW5saW5lSXRlbUluZGV4OyBpLS07KSB7CisgICAgICAgIGlmICghbV9pbmxpbmVJdGVtc1tpXS5p
c0Zsb2F0KCkpCisgICAgICAgICAgICByZXR1cm4gaSA9PSBsaW5lUmFuZ2UuZW5kIC0gMTsKKyAg
ICB9CisgICAgLy8gVGhlcmUgaGFzIHRvIGJlIGF0IGxlYXN0IG9uZSBub24tZmxvYXQgaXRlbS4K
KyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2NvbnN0
IENvbnRhaW5lckJveCYgTGluZUJ1aWxkZXI6OnJvb3QoKSBjb25zdAoreworICAgIHJldHVybiBm
b3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKTsKK30KKworY29uc3QgTGF5b3V0U3RhdGUmIExpbmVC
dWlsZGVyOjpsYXlvdXRTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZvcm1hdHRpbmdDb250
ZXh0KCkubGF5b3V0U3RhdGUoKTsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9J
bmxpbmVMaW5lQnVpbGRlci5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250
ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGUy
MTcxNTA1ZWZmYjQyZmRmMGIzMjE2NDNiMzQzZDhjNTVmY2FlZgotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVMaW5lQnVpbGRlci5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3By
YWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2lu
Y2x1ZGUgIklubGluZUNvbnRlbnRCcmVha2VyLmgiCisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGlu
Z1N0YXRlLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgRmxvYXRpbmdDb250ZXh0Oworc3RydWN0IExp
bmVDYW5kaWRhdGU7CisKK2NsYXNzIExpbmVCdWlsZGVyIHsKK3B1YmxpYzoKKyAgICBMaW5lQnVp
bGRlcihJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYsIEZsb2F0aW5nU3RhdGUmLCBIb3Jpem9udGFs
Q29uc3RyYWludHMgcm9vdEhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgSW5saW5lSXRlbXMm
KTsKKyAgICBMaW5lQnVpbGRlcihjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYsIGNvbnN0
IElubGluZUl0ZW1zJik7CisKKyAgICBzdHJ1Y3QgSW5saW5lSXRlbVJhbmdlIHsKKyAgICAgICAg
Ym9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gc3RhcnQgPT0gZW5kOyB9CisgICAgICAgIHNp
emVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gZW5kIC0gc3RhcnQ7IH0KKyAgICAgICAgc2l6ZV90
IHN0YXJ0IHsgMCB9OworICAgICAgICBzaXplX3QgZW5kIHsgMCB9OworICAgIH07CisgICAgdXNp
bmcgRmxvYXRMaXN0ID0gVmVjdG9yPGNvbnN0IEJveCo+OworICAgIHN0cnVjdCBMaW5lQ29udGVu
dCB7CisgICAgICAgIElubGluZUl0ZW1SYW5nZSBpbmxpbmVJdGVtUmFuZ2U7CisgICAgICAgIHNp
emVfdCBwYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoIHsgMCB9OworICAgICAgICBPcHRpb25h
bDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxvd0xvZ2ljYWxXaWR0aDsKKyAgICAgICAgY29uc3Qg
RmxvYXRMaXN0JiBmbG9hdHM7CisgICAgICAgIGJvb2wgaGFzSW50cnVzaXZlRmxvYXQgeyBmYWxz
ZSB9OworICAgICAgICBJbmxpbmVMYXlvdXRQb2ludCBsb2dpY2FsVG9wTGVmdDsKKyAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCBsaW5lTG9naWNhbFdpZHRoOworICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IGNvbnRlbnRMb2dpY2FsV2lkdGg7CisgICAgICAgIGJvb2wgaXNMYXN0TGluZVdpdGhJbmxp
bmVDb250ZW50IHsgdHJ1ZSB9OworICAgICAgICBzaXplX3Qgbm9uU3Bhbm5pbmdJbmxpbmVMZXZl
bEJveENvdW50IHsgMCB9OworICAgICAgICBjb25zdCBMaW5lOjpSdW5MaXN0JiBydW5zOworICAg
IH07CisgICAgTGluZUNvbnRlbnQgbGF5b3V0SW5saW5lQ29udGVudChjb25zdCBJbmxpbmVJdGVt
UmFuZ2UmLCBzaXplX3QgcGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxp
bmVMYXlvdXRVbml0PiBsZWFkaW5nTG9naWNhbFdpZHRoLCBjb25zdCBJbmxpbmVSZWN0JiBpbml0
aWFsTGluZUxvZ2ljYWxSZWN0LCBib29sIGlzRmlyc3RMaW5lKTsKKworICAgIHN0cnVjdCBJbnRy
aW5zaWNDb250ZW50IHsKKyAgICAgICAgSW5saW5lSXRlbVJhbmdlIGlubGluZUl0ZW1SYW5nZTsK
KyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGggeyAwIH07CisgICAgICAgIGNv
bnN0IEZsb2F0TGlzdCYgZmxvYXRzOworICAgIH07CisgICAgSW50cmluc2ljQ29udGVudCBjb21w
dXRlZEludHJpbnNpY1dpZHRoKGNvbnN0IElubGluZUl0ZW1SYW5nZSYsIElubGluZUxheW91dFVu
aXQgYXZhaWxhYmxlV2lkdGgpOworCitwcml2YXRlOgorICAgIHZvaWQgY2FuZGlkYXRlQ29udGVu
dEZvckxpbmUoTGluZUNhbmRpZGF0ZSYsIHNpemVfdCBpbmxpbmVJdGVtSW5kZXgsIGNvbnN0IElu
bGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgc2l6ZV90IG92ZXJmbG93TGVuZ3RoLCBP
cHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBsZWFkaW5nTG9naWNhbFdpZHRoLCBJbmxpbmVMYXlv
dXRVbml0IGN1cnJlbnRMb2dpY2FsUmlnaHQpOworICAgIHNpemVfdCBuZXh0V3JhcE9wcG9ydHVu
aXR5KHNpemVfdCBzdGFydEluZGV4LCBjb25zdCBMaW5lQnVpbGRlcjo6SW5saW5lSXRlbVJhbmdl
JiBsYXlvdXRSYW5nZSkgY29uc3Q7CisKKyAgICBzdHJ1Y3QgUmVzdWx0IHsKKyAgICAgICAgSW5s
aW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lIGlzRW5kT2ZMaW5lIHsgSW5saW5lQ29udGVu
dEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9OworICAgICAgICBzdHJ1Y3QgQ29tbWl0dGVkQ29u
dGVudENvdW50IHsKKyAgICAgICAgICAgIHNpemVfdCB2YWx1ZSB7IDAgfTsKKyAgICAgICAgICAg
IGJvb2wgaXNSZXZlcnQgeyBmYWxzZSB9OworICAgICAgICB9OworICAgICAgICBDb21taXR0ZWRD
b250ZW50Q291bnQgY29tbWl0dGVkQ291bnQgeyB9OworICAgICAgICBzaXplX3QgcGFydGlhbFRy
YWlsaW5nQ29udGVudExlbmd0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0
VW5pdD4gb3ZlcmZsb3dMb2dpY2FsV2lkdGggeyB9OworICAgIH07CisgICAgc3RydWN0IFVzZWRD
b25zdHJhaW50cyB7CisgICAgICAgIElubGluZVJlY3QgbG9naWNhbFJlY3Q7CisgICAgICAgIGJv
b2wgaXNDb25zdHJhaW5lZEJ5RmxvYXQgeyBmYWxzZSB9OworICAgIH07CisgICAgVXNlZENvbnN0
cmFpbnRzIGluaXRpYWxDb25zdHJhaW50c0ZvckxpbmUoY29uc3QgSW5saW5lUmVjdCYgaW5pdGlh
bExpbmVMb2dpY2FsUmVjdCwgYm9vbCBpc0ZpcnN0TGluZSkgY29uc3Q7CisgICAgT3B0aW9uYWw8
SG9yaXpvbnRhbENvbnN0cmFpbnRzPiBmbG9hdENvbnN0cmFpbnRzKGNvbnN0IElubGluZVJlY3Qm
IGxpbmVMb2dpY2FsUmVjdCkgY29uc3Q7CisKKyAgICB2b2lkIGhhbmRsZUZsb2F0Q29udGVudChj
b25zdCBJbmxpbmVJdGVtJik7CisgICAgUmVzdWx0IGhhbmRsZUlubGluZUNvbnRlbnQoSW5saW5l
Q29udGVudEJyZWFrZXImLCBjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2Us
IGNvbnN0IExpbmVDYW5kaWRhdGUmKTsKKyAgICBzaXplX3QgcmVidWlsZExpbmUoY29uc3QgSW5s
aW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBjb25zdCBJbmxpbmVJdGVtJiBsYXN0SW5s
aW5lSXRlbVRvQWRkKTsKKyAgICBzaXplX3QgcmVidWlsZExpbmVGb3JUcmFpbGluZ1NvZnRIeXBo
ZW4oY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsYXlvdXRSYW5nZSk7CisgICAgdm9pZCBjb21taXRQ
YXJ0aWFsQ29udGVudChjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRl
bnQ6OlJ1bkxpc3QmLCBjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0OjpQYXJ0aWFs
VHJhaWxpbmdDb250ZW50Jik7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFVzZWRDb25zdHJh
aW50cyYpOworICAgIHN0cnVjdCBDb21taXR0ZWRDb250ZW50IHsKKyAgICAgICAgc2l6ZV90IGlu
bGluZUl0ZW1Db3VudCB7IDAgfTsKKyAgICAgICAgc2l6ZV90IHBhcnRpYWxUcmFpbGluZ0NvbnRl
bnRMZW5ndGggeyAwIH07CisgICAgICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IG92ZXJm
bG93TG9naWNhbFdpZHRoIHsgfTsKKyAgICB9OworICAgIENvbW1pdHRlZENvbnRlbnQgcGxhY2VJ
bmxpbmVDb250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5nZSYsIHNpemVfdCBwYXJ0aWFsTGVhZGlu
Z0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IG92ZXJmbG93TG9naWNh
bFdpZHRoKTsKKyAgICBJbmxpbmVJdGVtUmFuZ2UgY2xvc2UoY29uc3QgSW5saW5lSXRlbVJhbmdl
JiBuZWVkc0xheW91dFJhbmdlLCBjb25zdCBDb21taXR0ZWRDb250ZW50Jik7CisKKyAgICBJbmxp
bmVMYXlvdXRVbml0IGlubGluZUl0ZW1XaWR0aChjb25zdCBJbmxpbmVJdGVtJiwgSW5saW5lTGF5
b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpIGNvbnN0OworICAgIGJvb2wgaXNMYXN0TGluZVdp
dGhJbmxpbmVDb250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGluZVJhbmdlLCBzaXplX3Qg
bGFzdElubGluZUl0ZW1JbmRleCwgYm9vbCBoYXNQYXJ0aWFsVHJhaWxpbmdDb250ZW50KSBjb25z
dDsKKworICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4
dCgpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7IH0KKyAgICBJbmxp
bmVGb3JtYXR0aW5nU3RhdGUqIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIG1faW5saW5lRm9y
bWF0dGluZ1N0YXRlOyB9CisgICAgRmxvYXRpbmdTdGF0ZSogZmxvYXRpbmdTdGF0ZSgpIHsgcmV0
dXJuIG1fZmxvYXRpbmdTdGF0ZTsgfQorICAgIGNvbnN0IEZsb2F0aW5nU3RhdGUqIGZsb2F0aW5n
U3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nU3RhdGU7IH0KKyAgICBjb25zdCBDb250
YWluZXJCb3gmIHJvb3QoKSBjb25zdDsKKyAgICBjb25zdCBMYXlvdXRTdGF0ZSYgbGF5b3V0U3Rh
dGUoKSBjb25zdDsKKworICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBtX2lubGlu
ZUZvcm1hdHRpbmdDb250ZXh0OworICAgIElubGluZUZvcm1hdHRpbmdTdGF0ZSogbV9pbmxpbmVG
b3JtYXR0aW5nU3RhdGUgeyBudWxscHRyIH07CisgICAgRmxvYXRpbmdTdGF0ZSogbV9mbG9hdGlu
Z1N0YXRlIHsgbnVsbHB0ciB9OworICAgIE9wdGlvbmFsPEhvcml6b250YWxDb25zdHJhaW50cz4g
bV9yb290SG9yaXpvbnRhbENvbnN0cmFpbnRzOworCisgICAgTGluZSBtX2xpbmU7CisgICAgSW5s
aW5lUmVjdCBtX2xpbmVMb2dpY2FsUmVjdDsKKyAgICBjb25zdCBJbmxpbmVJdGVtcyYgbV9pbmxp
bmVJdGVtczsKKyAgICBGbG9hdExpc3QgbV9mbG9hdHM7CisgICAgT3B0aW9uYWw8SW5saW5lVGV4
dEl0ZW0+IG1fcGFydGlhbExlYWRpbmdUZXh0SXRlbTsKKyAgICBWZWN0b3I8Y29uc3QgSW5saW5l
SXRlbSo+IG1fd3JhcE9wcG9ydHVuaXR5TGlzdDsKKyAgICB1bnNpZ25lZCBtX3N1Y2Nlc3NpdmVI
eXBoZW5hdGVkTGluZUNvdW50IHsgMCB9OworICAgIGJvb2wgbV9jb250ZW50SXNDb25zdHJhaW5l
ZEJ5RmxvYXQgeyBmYWxzZSB9OworfTsKKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5s
aW5lTGluZUdlb21ldHJ5LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUdlb21ldHJ5LmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZDZh
MmM1OGEwNzZlNDljMmNkM2M5ZTJmOTJhYjM2ZDAzZjI3MjllNQotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVMaW5lR2VvbWV0cnkuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3By
YWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2lu
Y2x1ZGUgIklubGluZVJlY3QuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExh
eW91dCB7CisKK2NsYXNzIElubGluZUxpbmVHZW9tZXRyeSB7CisgICAgV1RGX01BS0VfRkFTVF9B
TExPQ0FURUQ7CitwdWJsaWM6CisgICAgc3RydWN0IEVuY2xvc2luZ1RvcEFuZEJvdHRvbSB7Cisg
ICAgICAgIC8vIFRoaXMgdmFsdWVzIGVuY2xvc2VzIHRoZSByb290IGlubGluZSBib3ggYW5kIGFu
eSBvdGhlciBpbmxpbmUgbGV2ZWwgYm94J3MgYm9yZGVyIGJveC4KKyAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCB0b3AgeyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgYm90dG9tIHsgMCB9
OworICAgIH07CisgICAgSW5saW5lTGluZUdlb21ldHJ5KGNvbnN0IElubGluZVJlY3QmIGxpbmVC
b3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tLCBJbmxpbmVMYXlvdXRVbml0IGFs
aWdtZW50QmFzZWxpbmUsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxp
bmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgpOworCisgICAgY29uc3QgSW5saW5lUmVj
dCYgbGluZUJveExvZ2ljYWxSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94TG9naWNhbFJl
Y3Q7IH0KKworICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBlbmNsb3NpbmdUb3BBbmRCb3R0b20o
KSBjb25zdCB7IHJldHVybiBtX2VuY2xvc2luZ1RvcEFuZEJvdHRvbTsgfQorCisgICAgSW5saW5l
TGF5b3V0VW5pdCBiYXNlbGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fYWxpZ21lbnRCYXNlbGluZTsg
fQorCisgICAgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQoKSBjb25zdCB7IHJl
dHVybiBtX2NvbnRlbnRMb2dpY2FsTGVmdDsgfQorICAgIElubGluZUxheW91dFVuaXQgY29udGVu
dExvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudExvZ2ljYWxXaWR0aDsgfQor
CisgICAgdm9pZCBtb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkgeyBtX2xp
bmVCb3hMb2dpY2FsUmVjdC5tb3ZlVmVydGljYWxseShvZmZzZXQpOyB9CisKK3ByaXZhdGU6Cisg
ICAgLy8gVGhpcyBpcyBsaW5lIGJveCBnZW9tZXRyeSAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9U
Ui9jc3MtaW5saW5lLTMvI2xpbmUtYm94KS4KKyAgICBJbmxpbmVSZWN0IG1fbGluZUJveExvZ2lj
YWxSZWN0OworICAgIC8vIEVuY2xvc2luZyB0b3AgYW5kIGJvdHRvbSBpbmNsdWRlcyBhbGwgaW5s
aW5lIGxldmVsIGJveGVzIChib3JkZXIgYm94KSB2ZXJ0aWNhbGx5LgorICAgIC8vIFdoaWxlIHRo
ZSBsaW5lIGJveCB1c3VhbGx5IGVuY2xvc2UgdGhlbSBhcyB3ZWxsLCBpdHMgdmVydGljYWwgZ2Vv
bWV0cnkgaXMgYmFzZWQgb24KKyAgICAvLyB0aGUgbGF5b3V0IGJvdW5kcyBvZiB0aGUgaW5saW5l
IGxldmVsIGJveGVzIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgd2hlbiBsaW5lLWhlaWdodCBpcyBw
cmVzZW50LgorICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBtX2VuY2xvc2luZ1RvcEFuZEJvdHRv
bTsKKyAgICBJbmxpbmVMYXlvdXRVbml0IG1fYWxpZ21lbnRCYXNlbGluZSB7IDAgfTsKKyAgICBJ
bmxpbmVMYXlvdXRVbml0IG1fY29udGVudExvZ2ljYWxMZWZ0IHsgMCB9OworICAgIElubGluZUxh
eW91dFVuaXQgbV9jb250ZW50TG9naWNhbFdpZHRoIHsgMCB9OworfTsKKworaW5saW5lIElubGlu
ZUxpbmVHZW9tZXRyeTo6SW5saW5lTGluZUdlb21ldHJ5KGNvbnN0IElubGluZVJlY3QmIGxpbmVC
b3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tIGVuY2xvc2luZ1RvcEFuZEJvdHRv
bSwgSW5saW5lTGF5b3V0VW5pdCBhbGlnbWVudEJhc2VsaW5lLCBJbmxpbmVMYXlvdXRVbml0IGNv
bnRlbnRMb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoKQor
ICAgIDogbV9saW5lQm94TG9naWNhbFJlY3QobGluZUJveExvZ2ljYWxSZWN0KQorICAgICwgbV9l
bmNsb3NpbmdUb3BBbmRCb3R0b20oZW5jbG9zaW5nVG9wQW5kQm90dG9tKQorICAgICwgbV9hbGln
bWVudEJhc2VsaW5lKGFsaWdtZW50QmFzZWxpbmUpCisgICAgLCBtX2NvbnRlbnRMb2dpY2FsTGVm
dChjb250ZW50TG9naWNhbExlZnQpCisgICAgLCBtX2NvbnRlbnRMb2dpY2FsV2lkdGgoY29udGVu
dExvZ2ljYWxXaWR0aCkKK3sKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVMaW5lUnVuLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lTGluZVJ1bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBiMGVlMTRkZWQwYmUy
Y2NkNTJkMzQzM2IwODg0NTQ2YzFmMGQyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGlu
ZVJ1bi5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
CisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwor
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICog
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNp
ZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIklubGluZVJl
Y3QuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJUZXh0RmxhZ3MuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3N0cnVjdCBMaW5lUnVu
IHsKKyAgICBXVEZfTUFLRV9TVFJVQ1RfRkFTVF9BTExPQ0FURUQ7CisgICAgc3RydWN0IFRleHQg
eworICAgICAgICBXVEZfTUFLRV9TVFJVQ1RfRkFTVF9BTExPQ0FURUQ7CisgICAgcHVibGljOgor
ICAgICAgICBUZXh0KHNpemVfdCBwb3NpdGlvbiwgc2l6ZV90IGxlbmd0aCwgY29uc3QgU3RyaW5n
Jik7CisKKyAgICAgICAgc2l6ZV90IHN0YXJ0KCkgY29uc3QgeyByZXR1cm4gbV9zdGFydDsgfQor
ICAgICAgICBzaXplX3QgZW5kKCkgY29uc3QgeyByZXR1cm4gc3RhcnQoKSArIGxlbmd0aCgpOyB9
CisgICAgICAgIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2xlbmd0aDsgfQorICAg
ICAgICBTdHJpbmcgY29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudFN0cmluZzsgfQor
CisgICAgICAgIGJvb2wgbmVlZHNIeXBoZW4oKSBjb25zdCB7IHJldHVybiBtX25lZWRzSHlwaGVu
OyB9CisgICAgICAgIHZvaWQgc2V0TmVlZHNIeXBoZW4oKSB7IG1fbmVlZHNIeXBoZW4gPSB0cnVl
OyB9CisKKyAgICAgICAgdm9pZCBleHBhbmQoc2l6ZV90IGRlbHRhKSB7IG1fbGVuZ3RoICs9IGRl
bHRhOyB9CisgICAgICAgIHZvaWQgc2hyaW5rKHNpemVfdCBkZWx0YSkgeyBtX2xlbmd0aCAtPSBk
ZWx0YTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc2l6ZV90IG1fc3RhcnQgeyAwIH07Cisg
ICAgICAgIHNpemVfdCBtX2xlbmd0aCB7IDAgfTsKKyAgICAgICAgYm9vbCBtX25lZWRzSHlwaGVu
IHsgZmFsc2UgfTsKKyAgICAgICAgU3RyaW5nIG1fY29udGVudFN0cmluZzsKKyAgICB9OworCisg
ICAgc3RydWN0IEV4cGFuc2lvbjsKKyAgICBMaW5lUnVuKHNpemVfdCBsaW5lSW5kZXgsIGNvbnN0
IEJveCYsIGNvbnN0IElubGluZVJlY3QmLCBFeHBhbnNpb24sIE9wdGlvbmFsPFRleHQ+ID0gV1RG
OjpudWxsb3B0KTsKKworICAgIGNvbnN0IElubGluZVJlY3QmIGxvZ2ljYWxSZWN0KCkgY29uc3Qg
eyByZXR1cm4gbV9sb2dpY2FsUmVjdDsgfQorCisgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
VG9wKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS50b3AoKTsgfQorICAgIElubGluZUxh
eW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkuYm90
dG9tKCk7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KCkgY29uc3QgeyByZXR1
cm4gbG9naWNhbFJlY3QoKS5sZWZ0KCk7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxS
aWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkucmlnaHQoKTsgfQorCisgICAgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVjdCgp
LndpZHRoKCk7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQoKSBjb25zdCB7
IHJldHVybiBsb2dpY2FsUmVjdCgpLmhlaWdodCgpOyB9CisKKyAgICB2b2lkIG1vdmVWZXJ0aWNh
bGx5KElubGluZUxheW91dFVuaXQgb2Zmc2V0KSB7IG1fbG9naWNhbFJlY3QubW92ZVZlcnRpY2Fs
bHkob2Zmc2V0KTsgfQorICAgIE9wdGlvbmFsPFRleHQ+JiB0ZXh0KCkgeyByZXR1cm4gbV90ZXh0
OyB9CisgICAgY29uc3QgT3B0aW9uYWw8VGV4dD4mIHRleHQoKSBjb25zdCB7IHJldHVybiBtX3Rl
eHQ7IH0KKworICAgIHN0cnVjdCBFeHBhbnNpb24geworICAgICAgICBFeHBhbnNpb25CZWhhdmlv
ciBiZWhhdmlvciB7IERlZmF1bHRFeHBhbnNpb24gfTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5p
dCBob3Jpem9udGFsRXhwYW5zaW9uIHsgMCB9OworICAgIH07CisgICAgRXhwYW5zaW9uIGV4cGFu
c2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fZXhwYW5zaW9uOyB9CisKKyAgICBjb25zdCBCb3gmIGxh
eW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQorICAgIHNpemVfdCBsaW5l
SW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2xpbmVJbmRleDsgfQorCitwcml2YXRlOgorICAgIGNv
bnN0IHNpemVfdCBtX2xpbmVJbmRleDsKKyAgICBXZWFrUHRyPGNvbnN0IExheW91dDo6Qm94PiBt
X2xheW91dEJveDsKKyAgICBJbmxpbmVSZWN0IG1fbG9naWNhbFJlY3Q7CisgICAgRXhwYW5zaW9u
IG1fZXhwYW5zaW9uOworICAgIE9wdGlvbmFsPFRleHQ+IG1fdGV4dDsKK307CisKK2lubGluZSBM
aW5lUnVuOjpMaW5lUnVuKHNpemVfdCBsaW5lSW5kZXgsIGNvbnN0IExheW91dDo6Qm94JiBsYXlv
dXRCb3gsIGNvbnN0IElubGluZVJlY3QmIGxvZ2ljYWxSZWN0LCBFeHBhbnNpb24gZXhwYW5zaW9u
LCBPcHRpb25hbDxUZXh0PiB0ZXh0KQorICAgIDogbV9saW5lSW5kZXgobGluZUluZGV4KQorICAg
ICwgbV9sYXlvdXRCb3gobWFrZVdlYWtQdHIobGF5b3V0Qm94KSkKKyAgICAsIG1fbG9naWNhbFJl
Y3QobG9naWNhbFJlY3QpCisgICAgLCBtX2V4cGFuc2lvbihleHBhbnNpb24pCisgICAgLCBtX3Rl
eHQodGV4dCkKK3sKK30KKworaW5saW5lIExpbmVSdW46OlRleHQ6OlRleHQoc2l6ZV90IHN0YXJ0
LCBzaXplX3QgbGVuZ3RoLCBjb25zdCBTdHJpbmcmIGNvbnRlbnRTdHJpbmcpCisgICAgOiBtX3N0
YXJ0KHN0YXJ0KQorICAgICwgbV9sZW5ndGgobGVuZ3RoKQorICAgICwgbV9jb250ZW50U3RyaW5n
KGNvbnRlbnRTdHJpbmcpCit7Cit9CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZVJlY3QuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5l
Zm9ybWF0dGluZy9JbmxpbmVSZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYWNkMDlhYjFlNzEwMWFhNmVjZjQz
M2QyNjQwMDRmZmU4ZmI3YThjNAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVSZWN0LmgKQEAg
LTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShM
QVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIElubGluZVJl
Y3QgeworcHVibGljOgorICAgIElubGluZVJlY3QoKSA9IGRlZmF1bHQ7CisgICAgSW5saW5lUmVj
dChJbmxpbmVMYXlvdXRVbml0IHRvcCwgSW5saW5lTGF5b3V0VW5pdCBsZWZ0LCBJbmxpbmVMYXlv
dXRVbml0IHdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCk7CisgICAgSW5saW5lUmVjdChj
b25zdCBJbmxpbmVMYXlvdXRQb2ludCYgdG9wTGVmdCwgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCwg
SW5saW5lTGF5b3V0VW5pdCBoZWlnaHQpOworICAgIElubGluZVJlY3QoY29uc3QgSW5saW5lTGF5
b3V0UG9pbnQmIHRvcExlZnQsIGNvbnN0IElubGluZUxheW91dFNpemUmKTsKKyAgICAKKyAgICBJ
bmxpbmVMYXlvdXRVbml0IHRvcCgpIGNvbnN0OworICAgIElubGluZUxheW91dFVuaXQgbGVmdCgp
IGNvbnN0OworICAgIElubGluZUxheW91dFBvaW50IHRvcExlZnQoKSBjb25zdDsKKworICAgIElu
bGluZUxheW91dFVuaXQgYm90dG9tKCkgY29uc3Q7CisgICAgSW5saW5lTGF5b3V0VW5pdCByaWdo
dCgpIGNvbnN0OyAgICAgICAgCisKKyAgICBJbmxpbmVMYXlvdXRVbml0IHdpZHRoKCkgY29uc3Q7
CisgICAgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQoKSBjb25zdDsKKyAgICBJbmxpbmVMYXlvdXRT
aXplIHNpemUoKSBjb25zdDsKKworICAgIHZvaWQgc2V0VG9wKElubGluZUxheW91dFVuaXQpOwor
ICAgIHZvaWQgc2V0Qm90dG9tKElubGluZUxheW91dFVuaXQpOworICAgIHZvaWQgc2V0TGVmdChJ
bmxpbmVMYXlvdXRVbml0KTsKKyAgICB2b2lkIHNldFRvcExlZnQoY29uc3QgSW5saW5lTGF5b3V0
UG9pbnQmKTsKKyAgICB2b2lkIHNldFdpZHRoKElubGluZUxheW91dFVuaXQpOworICAgIHZvaWQg
c2V0SGVpZ2h0KElubGluZUxheW91dFVuaXQpOworCisgICAgdm9pZCBtb3ZlSG9yaXpvbnRhbGx5
KElubGluZUxheW91dFVuaXQpOworICAgIHZvaWQgbW92ZVZlcnRpY2FsbHkoSW5saW5lTGF5b3V0
VW5pdCk7CisgICAgdm9pZCBtb3ZlQnkoSW5saW5lTGF5b3V0UG9pbnQpOworCisgICAgdm9pZCBl
eHBhbmQoT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4sIE9wdGlvbmFsPElubGluZUxheW91dFVu
aXQ+KTsKKyAgICB2b2lkIGV4cGFuZFRvQ29udGFpbihjb25zdCBJbmxpbmVSZWN0Jik7CisgICAg
dm9pZCBleHBhbmRIb3Jpem9udGFsbHkoSW5saW5lTGF5b3V0VW5pdCBkZWx0YSkgeyBleHBhbmQo
ZGVsdGEsIHsgfSk7IH0KKyAgICB2b2lkIGV4cGFuZFZlcnRpY2FsbHkoSW5saW5lTGF5b3V0VW5p
dCBkZWx0YSkgeyBleHBhbmQoeyB9LCBkZWx0YSk7IH0KKyAgICB2b2lkIGV4cGFuZFZlcnRpY2Fs
bHlUb0NvbnRhaW4oY29uc3QgSW5saW5lUmVjdCYpOworICAgIHZvaWQgaW5mbGF0ZShJbmxpbmVM
YXlvdXRVbml0KTsKKworICAgIG9wZXJhdG9yIElubGluZUxheW91dFJlY3QoKSBjb25zdDsKKwor
cHJpdmF0ZToKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIHZvaWQgaW52YWxpZGF0ZVRvcCgpIHsg
bV9oYXNWYWxpZFRvcCA9IGZhbHNlOyB9CisgICAgdm9pZCBpbnZhbGlkYXRlTGVmdCgpIHsgbV9o
YXNWYWxpZExlZnQgPSBmYWxzZTsgfQorICAgIHZvaWQgaW52YWxpZGF0ZVdpZHRoKCkgeyBtX2hh
c1ZhbGlkV2lkdGggPSBmYWxzZTsgfQorICAgIHZvaWQgaW52YWxpZGF0ZUhlaWdodCgpIHsgbV9o
YXNWYWxpZEhlaWdodCA9IGZhbHNlOyB9CisgICAgdm9pZCBpbnZhbGlkYXRlUG9zaXRpb24oKTsK
KworICAgIGJvb2wgaGFzVmFsaWRQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1faGFzVmFsaWRU
b3AgJiYgbV9oYXNWYWxpZExlZnQ7IH0KKyAgICBib29sIGhhc1ZhbGlkU2l6ZSgpIGNvbnN0IHsg
cmV0dXJuIG1faGFzVmFsaWRXaWR0aCAmJiBtX2hhc1ZhbGlkSGVpZ2h0OyB9CisgICAgYm9vbCBo
YXNWYWxpZEdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gaGFzVmFsaWRQb3NpdGlvbigpICYmIGhh
c1ZhbGlkU2l6ZSgpOyB9CisKKyAgICB2b2lkIHNldEhhc1ZhbGlkUG9zaXRpb24oKTsKKyAgICB2
b2lkIHNldEhhc1ZhbGlkU2l6ZSgpOworCisgICAgYm9vbCBtX2hhc1ZhbGlkVG9wIHsgZmFsc2Ug
fTsKKyAgICBib29sIG1faGFzVmFsaWRMZWZ0IHsgZmFsc2UgfTsKKyAgICBib29sIG1faGFzVmFs
aWRXaWR0aCB7IGZhbHNlIH07CisgICAgYm9vbCBtX2hhc1ZhbGlkSGVpZ2h0IHsgZmFsc2UgfTsK
KyNlbmRpZiAvLyBBU1NFUlRfRU5BQkxFRAorICAgIElubGluZUxheW91dFJlY3QgbV9yZWN0Owor
fTsKKworaW5saW5lIElubGluZVJlY3Q6OklubGluZVJlY3QoSW5saW5lTGF5b3V0VW5pdCB0b3As
IElubGluZUxheW91dFVuaXQgbGVmdCwgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCwgSW5saW5lTGF5
b3V0VW5pdCBoZWlnaHQpCisgICAgOiBtX3JlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KQor
eworI2lmIEFTU0VSVF9FTkFCTEVECisgICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7CisgICAgbV9o
YXNWYWxpZExlZnQgPSB0cnVlOworICAgIG1faGFzVmFsaWRXaWR0aCA9IHRydWU7CisgICAgbV9o
YXNWYWxpZEhlaWdodCA9IHRydWU7CisjZW5kaWYKK30KKworaW5saW5lIElubGluZVJlY3Q6Oklu
bGluZVJlY3QoY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIHRvcExlZnQsIElubGluZUxheW91dFVu
aXQgd2lkdGgsIElubGluZUxheW91dFVuaXQgaGVpZ2h0KQorICAgIDogSW5saW5lUmVjdCh0b3BM
ZWZ0LnkoKSwgdG9wTGVmdC54KCksIHdpZHRoLCBoZWlnaHQpCit7Cit9CisKK2lubGluZSBJbmxp
bmVSZWN0OjpJbmxpbmVSZWN0KGNvbnN0IElubGluZUxheW91dFBvaW50JiB0b3BMZWZ0LCBjb25z
dCBJbmxpbmVMYXlvdXRTaXplJiBzaXplKQorICAgIDogSW5saW5lUmVjdCh0b3BMZWZ0LnkoKSwg
dG9wTGVmdC54KCksIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSkKK3sKK30KKworI2lmIEFT
U0VSVF9FTkFCTEVECitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjppbnZhbGlkYXRlUG9zaXRpb24o
KQoreworICAgIGludmFsaWRhdGVUb3AoKTsKKyAgICBpbnZhbGlkYXRlTGVmdCgpOworfQorCitp
bmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRIYXNWYWxpZFBvc2l0aW9uKCkKK3sKKyAgICBtX2hh
c1ZhbGlkVG9wID0gdHJ1ZTsKKyAgICBtX2hhc1ZhbGlkTGVmdCA9IHRydWU7Cit9CisKK2lubGlu
ZSB2b2lkIElubGluZVJlY3Q6OnNldEhhc1ZhbGlkU2l6ZSgpCit7CisgICAgbV9oYXNWYWxpZFdp
ZHRoID0gdHJ1ZTsKKyAgICBtX2hhc1ZhbGlkSGVpZ2h0ID0gdHJ1ZTsKK30KKyNlbmRpZiAvLyBB
U1NFUlRfRU5BQkxFRAorCitpbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVSZWN0Ojp0b3Ao
KSBjb25zdAoreworICAgIEFTU0VSVChtX2hhc1ZhbGlkVG9wKTsKKyAgICByZXR1cm4gbV9yZWN0
LnkoKTsKK30KKworaW5saW5lIElubGluZUxheW91dFVuaXQgSW5saW5lUmVjdDo6bGVmdCgpIGNv
bnN0Cit7CisgICAgQVNTRVJUKG1faGFzVmFsaWRMZWZ0KTsKKyAgICByZXR1cm4gbV9yZWN0Lngo
KTsKK30KKworaW5saW5lIElubGluZUxheW91dFVuaXQgSW5saW5lUmVjdDo6Ym90dG9tKCkgY29u
c3QKK3sKKyAgICBBU1NFUlQobV9oYXNWYWxpZFRvcCAmJiBtX2hhc1ZhbGlkSGVpZ2h0KTsKKyAg
ICByZXR1cm4gbV9yZWN0Lm1heFkoKTsKK30KKworaW5saW5lIElubGluZUxheW91dFVuaXQgSW5s
aW5lUmVjdDo6cmlnaHQoKSBjb25zdAoreworICAgIEFTU0VSVChtX2hhc1ZhbGlkTGVmdCAmJiBt
X2hhc1ZhbGlkV2lkdGgpOworICAgIHJldHVybiBtX3JlY3QubWF4WCgpOworfQorCitpbmxpbmUg
SW5saW5lTGF5b3V0UG9pbnQgSW5saW5lUmVjdDo6dG9wTGVmdCgpIGNvbnN0Cit7CisgICAgQVNT
RVJUKGhhc1ZhbGlkUG9zaXRpb24oKSk7CisgICAgcmV0dXJuIG1fcmVjdC5taW5YTWluWUNvcm5l
cigpOworfQorCitpbmxpbmUgSW5saW5lTGF5b3V0U2l6ZSBJbmxpbmVSZWN0OjpzaXplKCkgY29u
c3QKK3sKKyAgICBBU1NFUlQoaGFzVmFsaWRTaXplKCkpOworICAgIHJldHVybiBtX3JlY3Quc2l6
ZSgpOworfQorCitpbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVSZWN0Ojp3aWR0aCgpIGNv
bnN0Cit7CisgICAgQVNTRVJUKG1faGFzVmFsaWRXaWR0aCk7CisgICAgcmV0dXJuIG1fcmVjdC53
aWR0aCgpOworfQorCitpbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVSZWN0OjpoZWlnaHQo
KSBjb25zdAoreworICAgIEFTU0VSVChtX2hhc1ZhbGlkSGVpZ2h0KTsKKyAgICByZXR1cm4gbV9y
ZWN0LmhlaWdodCgpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRUb3BMZWZ0KGNv
bnN0IElubGluZUxheW91dFBvaW50JiB0b3BMZWZ0KQoreworI2lmIEFTU0VSVF9FTkFCTEVECisg
ICAgc2V0SGFzVmFsaWRQb3NpdGlvbigpOworI2VuZGlmCisgICAgbV9yZWN0LnNldExvY2F0aW9u
KHRvcExlZnQpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRUb3AoSW5saW5lTGF5
b3V0VW5pdCB0b3ApCit7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICBtX2hhc1ZhbGlkVG9wID0g
dHJ1ZTsKKyNlbmRpZgorICAgIG1fcmVjdC5zZXRZKHRvcCk7Cit9CisKK2lubGluZSB2b2lkIElu
bGluZVJlY3Q6OnNldEJvdHRvbShJbmxpbmVMYXlvdXRVbml0IGJvdHRvbSkKK3sKKyNpZiBBU1NF
UlRfRU5BQkxFRAorICAgIG1faGFzVmFsaWRUb3AgPSB0cnVlOworICAgIG1faGFzVmFsaWRIZWln
aHQgPSB0cnVlOworI2VuZGlmCisgICAgbV9yZWN0LnNoaWZ0TWF4WUVkZ2VUbyhib3R0b20pOwor
fQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRMZWZ0KElubGluZUxheW91dFVuaXQgbGVm
dCkKK3sKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIG1faGFzVmFsaWRMZWZ0ID0gdHJ1ZTsKKyNl
bmRpZgorICAgIG1fcmVjdC5zZXRYKGxlZnQpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0
OjpzZXRXaWR0aChJbmxpbmVMYXlvdXRVbml0IHdpZHRoKQoreworI2lmIEFTU0VSVF9FTkFCTEVE
CisgICAgbV9oYXNWYWxpZFdpZHRoID0gdHJ1ZTsKKyNlbmRpZgorICAgIG1fcmVjdC5zZXRXaWR0
aCh3aWR0aCk7Cit9CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6OnNldEhlaWdodChJbmxpbmVM
YXlvdXRVbml0IGhlaWdodCkKK3sKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIG1faGFzVmFsaWRI
ZWlnaHQgPSB0cnVlOworI2VuZGlmCisgICAgbV9yZWN0LnNldEhlaWdodChoZWlnaHQpOworfQor
CitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0Ojptb3ZlSG9yaXpvbnRhbGx5KElubGluZUxheW91dFVu
aXQgb2Zmc2V0KQoreworICAgIEFTU0VSVChtX2hhc1ZhbGlkTGVmdCk7CisgICAgbV9yZWN0Lm1v
dmUoSW5saW5lTGF5b3V0U2l6ZSB7IG9mZnNldCwgMCB9KTsKK30KKworaW5saW5lIHZvaWQgSW5s
aW5lUmVjdDo6bW92ZVZlcnRpY2FsbHkoSW5saW5lTGF5b3V0VW5pdCBvZmZzZXQpCit7CisgICAg
QVNTRVJUKG1faGFzVmFsaWRUb3ApOworICAgIG1fcmVjdC5tb3ZlKElubGluZUxheW91dFNpemUg
eyAwLCBvZmZzZXQgfSk7Cit9CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6Om1vdmVCeShJbmxp
bmVMYXlvdXRQb2ludCBvZmZzZXQpCit7CisgICAgQVNTRVJUKG1faGFzVmFsaWRUb3ApOworICAg
IEFTU0VSVChtX2hhc1ZhbGlkTGVmdCk7CisgICAgbV9yZWN0Lm1vdmVCeShvZmZzZXQpOworfQor
CitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpleHBhbmQoT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5p
dD4gd2lkdGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGhlaWdodCkKK3sKKyAgICBBU1NF
UlQoIXdpZHRoIHx8IG1faGFzVmFsaWRXaWR0aCk7CisgICAgQVNTRVJUKCFoZWlnaHQgfHwgbV9o
YXNWYWxpZEhlaWdodCk7CisgICAgbV9yZWN0LmV4cGFuZCh3aWR0aC52YWx1ZU9yKDApLCBoZWln
aHQudmFsdWVPcigwKSk7Cit9CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6OmV4cGFuZFRvQ29u
dGFpbihjb25zdCBJbmxpbmVSZWN0JiBvdGhlcikKK3sKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAg
IG1faGFzVmFsaWRUb3AgPSB0cnVlOworICAgIG1faGFzVmFsaWRMZWZ0ID0gdHJ1ZTsKKyAgICBt
X2hhc1ZhbGlkV2lkdGggPSB0cnVlOworICAgIG1faGFzVmFsaWRIZWlnaHQgPSB0cnVlOworI2Vu
ZGlmCisgICAgbV9yZWN0LnVuaXRlRXZlbklmRW1wdHkob3RoZXIpOworfQorCitpbmxpbmUgdm9p
ZCBJbmxpbmVSZWN0OjpleHBhbmRWZXJ0aWNhbGx5VG9Db250YWluKGNvbnN0IElubGluZVJlY3Qm
IG90aGVyKQoreworICAgIGF1dG8gY29udGFpblRvcCA9IHN0ZDo6bWluKHRvcCgpLCBvdGhlci50
b3AoKSk7CisgICAgYXV0byBjb250YWluQm90dG9tID0gc3RkOjptYXgoYm90dG9tKCksIG90aGVy
LmJvdHRvbSgpKTsKKyAgICBzZXRUb3AoY29udGFpblRvcCk7CisgICAgc2V0Qm90dG9tKGNvbnRh
aW5Cb3R0b20pOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjppbmZsYXRlKElubGluZUxh
eW91dFVuaXQgaW5mbGF0ZSkKK3sKKyAgICBBU1NFUlQoaGFzVmFsaWRHZW9tZXRyeSgpKTsKKyAg
ICBtX3JlY3QuaW5mbGF0ZShpbmZsYXRlKTsKK30KKworaW5saW5lIElubGluZVJlY3Q6Om9wZXJh
dG9yIElubGluZUxheW91dFJlY3QoKSBjb25zdAoreworICAgIEFTU0VSVChoYXNWYWxpZEdlb21l
dHJ5KCkpOyAKKyAgICByZXR1cm4gbV9yZWN0OworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0
dGluZy9JbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVNvZnRMaW5lQnJlYWtJdGVt
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uOWVhMDZmYmNkZDE3ODI0MmJhYjU0NzNhOTRhMTNhYzMwYmM3OTcwYgot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oCkBAIC0wLDAgKzEs
NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisg
KiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICog
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9S
TUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiSW5saW5lSXRlbS5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgSW5saW5lU29mdExpbmVCcmVh
a0l0ZW0gOiBwdWJsaWMgSW5saW5lSXRlbSB7CitwdWJsaWM6CisgICAgc3RhdGljIElubGluZVNv
ZnRMaW5lQnJlYWtJdGVtIGNyZWF0ZVNvZnRMaW5lQnJlYWtJdGVtKGNvbnN0IElubGluZVRleHRC
b3gmLCB1bnNpZ25lZCBwb3NpdGlvbik7CisKKyAgICB1bnNpZ25lZCBwb3NpdGlvbigpIGNvbnN0
IHsgcmV0dXJuIG1fc3RhcnRPclBvc2l0aW9uOyB9CisgICAgY29uc3QgSW5saW5lVGV4dEJveCYg
aW5saW5lVGV4dEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PElubGluZVRleHRCb3g+KGxh
eW91dEJveCgpKTsgfQorCisgICAgSW5saW5lU29mdExpbmVCcmVha0l0ZW0oY29uc3QgSW5saW5l
VGV4dEJveCYsIHVuc2lnbmVkIHBvc2l0aW9uKTsKK307CisKK2lubGluZSBJbmxpbmVTb2Z0TGlu
ZUJyZWFrSXRlbSBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbTo6Y3JlYXRlU29mdExpbmVCcmVha0l0
ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgcG9zaXRpb24p
Cit7CisgICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgcG9zaXRpb24gfTsKK30KKworaW5saW5l
IElubGluZVNvZnRMaW5lQnJlYWtJdGVtOjpJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbShjb25zdCBJ
bmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBwb3NpdGlvbikKKyAgICA6IElu
bGluZUl0ZW0oaW5saW5lVGV4dEJveCwgVHlwZTo6U29mdExpbmVCcmVhaykKK3sKKyAgICBtX3N0
YXJ0T3JQb3NpdGlvbiA9IHBvc2l0aW9uOworfQorCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9U
UkFJVFNfSU5MSU5FX0lURU0oSW5saW5lU29mdExpbmVCcmVha0l0ZW0sIGlzU29mdExpbmVCcmVh
aygpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVUZXh0SXRlbS5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5l
VGV4dEl0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjljNzM3YWYwYmRiYTk1YTVmNDA1ZWNiNDk0NWZjY2Qx
OWNkOGJjMzkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uY3BwCkBAIC0wLDAg
KzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4K
KyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklu
bGluZVRleHRJdGVtLmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkK
KworI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisjaW5jbHVkZSAiSW5saW5lU29mdExpbmVCcmVh
a0l0ZW0uaCIKKyNpbmNsdWRlICJUZXh0VXRpbC5oIgorI2luY2x1ZGUgPHd0Zi91bmljb2RlL0No
YXJhY3Rlck5hbWVzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQg
eworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihJbmxpbmVJdGVtKSA9PSBzaXplb2YoSW5saW5lVGV4
dEl0ZW0pLCAiIik7CisKK3N0cnVjdCBXaGl0ZXNwYWNlQ29udGVudCB7CisgICAgc2l6ZV90IGxl
bmd0aCB7IDAgfTsKKyAgICBib29sIGlzV29yZFNlcGFyYXRvciB7IHRydWUgfTsKK307CitzdGF0
aWMgT3B0aW9uYWw8V2hpdGVzcGFjZUNvbnRlbnQ+IG1vdmVUb05leHROb25XaGl0ZXNwYWNlUG9z
aXRpb24oY29uc3QgU3RyaW5nVmlldyYgdGV4dENvbnRlbnQsIHNpemVfdCBzdGFydFBvc2l0aW9u
LCBib29sIHByZXNlcnZlTmV3bGluZSwgYm9vbCBwcmVzZXJ2ZVRhYikKK3sKKyAgICBhdXRvIGhh
c1dvcmRTZXBhcmF0b3JDaGFyYWN0ZXIgPSBmYWxzZTsKKyAgICBhdXRvIGlzV2hpdGVzcGFjZUNo
YXJhY3RlciA9IFsmXShhdXRvIGNoYXJhY3RlcikgeworICAgICAgICAvLyB3aGl0ZSBzcGFjZSBw
cm9jZXNzaW5nIGluIENTUyBhZmZlY3RzIG9ubHkgdGhlIGRvY3VtZW50IHdoaXRlIHNwYWNlIGNo
YXJhY3RlcnM6IHNwYWNlcyAoVSswMDIwKSwgdGFicyAoVSswMDA5KSwgYW5kIHNlZ21lbnQgYnJl
YWtzLgorICAgICAgICBhdXRvIGlzVHJlYXRlZEFzU3BhY2VDaGFyYWN0ZXIgPSBjaGFyYWN0ZXIg
PT0gc3BhY2UgfHwgKGNoYXJhY3RlciA9PSBuZXdsaW5lQ2hhcmFjdGVyICYmICFwcmVzZXJ2ZU5l
d2xpbmUpIHx8IChjaGFyYWN0ZXIgPT0gdGFiQ2hhcmFjdGVyICYmICFwcmVzZXJ2ZVRhYik7Cisg
ICAgICAgIGhhc1dvcmRTZXBhcmF0b3JDaGFyYWN0ZXIgPSBoYXNXb3JkU2VwYXJhdG9yQ2hhcmFj
dGVyIHx8IGlzVHJlYXRlZEFzU3BhY2VDaGFyYWN0ZXI7CisgICAgICAgIHJldHVybiBpc1RyZWF0
ZWRBc1NwYWNlQ2hhcmFjdGVyIHx8IGNoYXJhY3RlciA9PSB0YWJDaGFyYWN0ZXI7CisgICAgfTsK
KyAgICBhdXRvIG5leHROb25XaGl0ZVNwYWNlUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uOworICAg
IHdoaWxlIChuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uIDwgdGV4dENvbnRlbnQubGVuZ3RoKCkg
JiYgaXNXaGl0ZXNwYWNlQ2hhcmFjdGVyKHRleHRDb250ZW50W25leHROb25XaGl0ZVNwYWNlUG9z
aXRpb25dKSkKKyAgICAgICAgKytuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uOworICAgIHJldHVy
biBuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uID09IHN0YXJ0UG9zaXRpb24gPyBXVEY6Om51bGxv
cHQgOiBtYWtlT3B0aW9uYWwoV2hpdGVzcGFjZUNvbnRlbnQgeyBuZXh0Tm9uV2hpdGVTcGFjZVBv
c2l0aW9uIC0gc3RhcnRQb3NpdGlvbiwgaGFzV29yZFNlcGFyYXRvckNoYXJhY3RlciB9KTsKK30K
Kworc3RhdGljIHVuc2lnbmVkIG1vdmVUb05leHRCcmVha2FibGVQb3NpdGlvbih1bnNpZ25lZCBz
dGFydFBvc2l0aW9uLCBMYXp5TGluZUJyZWFrSXRlcmF0b3ImIGxpbmVCcmVha0l0ZXJhdG9yLCBj
b25zdCBSZW5kZXJTdHlsZSYgc3R5bGUpCit7CisgICAgYXV0byB0ZXh0TGVuZ3RoID0gbGluZUJy
ZWFrSXRlcmF0b3Iuc3RyaW5nVmlldygpLmxlbmd0aCgpOworICAgIGF1dG8gc3RhcnRQb3NpdGlv
bkZvck5leHRCcmVha2FibGVQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb247CisgICAgd2hpbGUgKHN0
YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb24gPCB0ZXh0TGVuZ3RoKSB7CisgICAg
ICAgIGF1dG8gbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gVGV4dFV0aWw6OmZpbmROZXh0QnJlYWth
YmxlUG9zaXRpb24obGluZUJyZWFrSXRlcmF0b3IsIHN0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWth
YmxlUG9zaXRpb24sIHN0eWxlKTsKKyAgICAgICAgLy8gT2Z0ZW50aW1lcyB0aGUgbmV4dCBicmVh
a2FibGUgcG9zaXRpb24gY29tZXMgYmFjayBhcyB0aGUgc3RhcnQgcG9zaXRpb24gKG1vc3Qgbm90
YWJseSBoeXBoZW5zKS4KKyAgICAgICAgaWYgKG5leHRCcmVha2FibGVQb3NpdGlvbiAhPSBzdGFy
dFBvc2l0aW9uKQorICAgICAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbiAtIHN0
YXJ0UG9zaXRpb247CisgICAgICAgICsrc3RhcnRQb3NpdGlvbkZvck5leHRCcmVha2FibGVQb3Np
dGlvbjsKKyAgICB9CisgICAgcmV0dXJuIHRleHRMZW5ndGggLSBzdGFydFBvc2l0aW9uOworfQor
Cit2b2lkIElubGluZVRleHRJdGVtOjpjcmVhdGVBbmRBcHBlbmRUZXh0SXRlbXMoSW5saW5lSXRl
bXMmIGlubGluZUNvbnRlbnQsIGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRCb3gpCit7
CisgICAgYXV0byB0ZXh0ID0gaW5saW5lVGV4dEJveC5jb250ZW50KCk7CisgICAgaWYgKCF0ZXh0
Lmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gaW5saW5lQ29udGVudC5hcHBlbmQoSW5saW5lVGV4
dEl0ZW06OmNyZWF0ZUVtcHR5SXRlbShpbmxpbmVUZXh0Qm94KSk7CisKKyAgICBhdXRvJiBzdHls
ZSA9IGlubGluZVRleHRCb3guc3R5bGUoKTsKKyAgICBhdXRvJiBmb250ID0gc3R5bGUuZm9udENh
c2NhZGUoKTsKKyAgICBhdXRvIHdoaXRlc3BhY2VDb250ZW50SXNUcmVhdGVkQXNTaW5nbGVTcGFj
ZSA9ICFUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRCb3gp
OworICAgIGF1dG8gc2hvdWxkUHJlc2VydmVOZXdsaW5lID0gVGV4dFV0aWw6OnNob3VsZFByZXNl
cnZlTmV3bGluZShpbmxpbmVUZXh0Qm94KTsKKyAgICBhdXRvIGxpbmVCcmVha0l0ZXJhdG9yID0g
TGF6eUxpbmVCcmVha0l0ZXJhdG9yIHsgdGV4dCwgc3R5bGUuY29tcHV0ZWRMb2NhbGUoKSwgVGV4
dFV0aWw6OmxpbmVCcmVha0l0ZXJhdG9yTW9kZShzdHlsZS5saW5lQnJlYWsoKSkgfTsKKyAgICB1
bnNpZ25lZCBjdXJyZW50UG9zaXRpb24gPSAwOworCisgICAgYXV0byBpbmxpbmVJdGVtV2lkdGgg
PSBbJl0oYXV0byBzdGFydFBvc2l0aW9uLCBhdXRvIGxlbmd0aCkgLT4gT3B0aW9uYWw8SW5saW5l
TGF5b3V0VW5pdD4geworICAgICAgICBpZiAoIWlubGluZVRleHRCb3guY2FuVXNlU2ltcGxpZmll
ZENvbnRlbnRNZWFzdXJpbmcoKSkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgIHJl
dHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEJveCwgc3RhcnRQb3NpdGlvbiwgc3RhcnRQ
b3NpdGlvbiArIGxlbmd0aCwgeyB9KTsKKyAgICB9OworCisgICAgd2hpbGUgKGN1cnJlbnRQb3Np
dGlvbiA8IHRleHQubGVuZ3RoKCkpIHsKKyAgICAgICAgYXV0byBpc1NlZ21lbnRCcmVha0NhbmRp
ZGF0ZSA9IFtdKGF1dG8gY2hhcmFjdGVyKSB7CisgICAgICAgICAgICByZXR1cm4gY2hhcmFjdGVy
ID09ICdcbic7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gU2VnbWVudCBicmVha3Mgd2l0aCBw
cmVzZXJ2ZSBuZXcgbGluZSBzdHlsZSAod2hpdGUtc3BhY2U6IHByZSwgcHJlLXdyYXAsIGJyZWFr
LXNwYWNlcyBhbmQgcHJlLWxpbmUpIGNvbXB1dGUgdG8gZm9yY2VkIGxpbmUgYnJlYWsuCisgICAg
ICAgIGlmIChpc1NlZ21lbnRCcmVha0NhbmRpZGF0ZSh0ZXh0W2N1cnJlbnRQb3NpdGlvbl0pICYm
IHNob3VsZFByZXNlcnZlTmV3bGluZSkgeworICAgICAgICAgICAgaW5saW5lQ29udGVudC5hcHBl
bmQoSW5saW5lU29mdExpbmVCcmVha0l0ZW06OmNyZWF0ZVNvZnRMaW5lQnJlYWtJdGVtKGlubGlu
ZVRleHRCb3gsIGN1cnJlbnRQb3NpdGlvbikpOworICAgICAgICAgICAgKytjdXJyZW50UG9zaXRp
b247CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdXRv
IHdoaXRlc3BhY2VDb250ZW50ID0gbW92ZVRvTmV4dE5vbldoaXRlc3BhY2VQb3NpdGlvbih0ZXh0
LCBjdXJyZW50UG9zaXRpb24sIHNob3VsZFByZXNlcnZlTmV3bGluZSwgIXdoaXRlc3BhY2VDb250
ZW50SXNUcmVhdGVkQXNTaW5nbGVTcGFjZSkpIHsKKyAgICAgICAgICAgIEFTU0VSVCh3aGl0ZXNw
YWNlQ29udGVudC0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGF1dG8gYXBwZW5kV2hpdGVzcGFjZUl0
ZW0gPSBbJl0gKGF1dG8gc3RhcnRQb3NpdGlvbiwgYXV0byBpdGVtTGVuZ3RoKSB7CisgICAgICAg
ICAgICAgICAgYXV0byBzaW1wbGVTaW5nbGVXaGl0ZXNwYWNlQ29udGVudCA9IGlubGluZVRleHRC
b3guY2FuVXNlU2ltcGxpZmllZENvbnRlbnRNZWFzdXJpbmcoKSAmJiAoaXRlbUxlbmd0aCA9PSAx
IHx8IHdoaXRlc3BhY2VDb250ZW50SXNUcmVhdGVkQXNTaW5nbGVTcGFjZSk7CisgICAgICAgICAg
ICAgICAgYXV0byB3aWR0aCA9IHNpbXBsZVNpbmdsZVdoaXRlc3BhY2VDb250ZW50ID8gbWFrZU9w
dGlvbmFsKElubGluZUxheW91dFVuaXQgeyBmb250LnNwYWNlV2lkdGgoKSB9KSA6IGlubGluZUl0
ZW1XaWR0aChzdGFydFBvc2l0aW9uLCBpdGVtTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpbmxp
bmVDb250ZW50LmFwcGVuZChJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlV2hpdGVzcGFjZUl0ZW0oaW5s
aW5lVGV4dEJveCwgc3RhcnRQb3NpdGlvbiwgaXRlbUxlbmd0aCwgd2hpdGVzcGFjZUNvbnRlbnQt
PmlzV29yZFNlcGFyYXRvciwgd2lkdGgpKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBp
ZiAoc3R5bGUud2hpdGVTcGFjZSgpID09IFdoaXRlU3BhY2U6OkJyZWFrU3BhY2VzKSB7CisgICAg
ICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10ZXh0LTMvI3doaXRlLXNw
YWNlLXBoYXNlLTEKKyAgICAgICAgICAgICAgICAvLyBGb3IgYnJlYWstc3BhY2VzLCBhIHNvZnQg
d3JhcCBvcHBvcnR1bml0eSBleGlzdHMgYWZ0ZXIgZXZlcnkgc3BhY2UgYW5kIGV2ZXJ5IHRhYi4K
KyAgICAgICAgICAgICAgICAvLyBGSVhNRTogaWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgYSBwZXJm
IGhpdCB3aXRoIHRvbyBtYW55IGluZGl2aWR1YWwgd2hpdGVzcGFjZSBpbmxpbmUgaXRlbXMsIHdl
IHNob3VsZCB0cmFuc2l0aW9uIHRoaXMgbG9naWMgdG8gbGluZSBicmVha2luZy4KKyAgICAgICAg
ICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdoaXRlc3BhY2VDb250ZW50LT5sZW5ndGg7
ICsraSkKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kV2hpdGVzcGFjZUl0ZW0oY3VycmVudFBv
c2l0aW9uICsgaSwgMSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBhcHBl
bmRXaGl0ZXNwYWNlSXRlbShjdXJyZW50UG9zaXRpb24sIHdoaXRlc3BhY2VDb250ZW50LT5sZW5n
dGgpOworICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uICs9IHdoaXRlc3BhY2VDb250ZW50LT5s
ZW5ndGg7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8g
aGFzVHJhaWxpbmdTb2Z0SHlwaGVuID0gZmFsc2U7CisgICAgICAgIGF1dG8gaW5pdGlhbE5vbldo
aXRlc3BhY2VQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjsKKyAgICAgICAgYXV0byBpc0F0U29m
dEh5cGhlbiA9IFsmXShhdXRvIHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gdGV4dFtw
b3NpdGlvbl0gPT0gc29mdEh5cGhlbjsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKHN0eWxlLmh5
cGhlbnMoKSA9PSBIeXBoZW5zOjpOb25lKSB7CisgICAgICAgICAgICAvLyBMZXQncyBtZXJnZSBj
YW5kaWRhdGUgSW5saW5lVGV4dEl0ZW1zIHNlcGFyYXRlZCBieSBzb2Z0IGh5cGhlbiB3aGVuIHRo
ZSBzdHlsZSBzYXlzIHNvLgorICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRQb3NpdGlvbiA8IHRl
eHQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIG5vbldoaXRlU3BhY2VMZW5ndGgg
PSBtb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24oY3VycmVudFBvc2l0aW9uLCBsaW5lQnJlYWtJ
dGVyYXRvciwgc3R5bGUpOworICAgICAgICAgICAgICAgIEFTU0VSVChub25XaGl0ZVNwYWNlTGVu
Z3RoKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24gKz0gbm9uV2hpdGVTcGFjZUxl
bmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQXRTb2Z0SHlwaGVuKGN1cnJlbnRQb3NpdGlv
biAtIDEpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF1dG8gbm9uV2hpdGVTcGFjZUxlbmd0aCA9IG1vdmVU
b05leHRCcmVha2FibGVQb3NpdGlvbihpbml0aWFsTm9uV2hpdGVzcGFjZVBvc2l0aW9uLCBsaW5l
QnJlYWtJdGVyYXRvciwgc3R5bGUpOworICAgICAgICAgICAgQVNTRVJUKG5vbldoaXRlU3BhY2VM
ZW5ndGgpOworICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uICs9IG5vbldoaXRlU3BhY2VMZW5n
dGg7CisgICAgICAgICAgICBoYXNUcmFpbGluZ1NvZnRIeXBoZW4gPSBpc0F0U29mdEh5cGhlbihj
dXJyZW50UG9zaXRpb24gLSAxKTsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlQoaW5pdGlhbE5v
bldoaXRlc3BhY2VQb3NpdGlvbiA8IGN1cnJlbnRQb3NpdGlvbik7CisgICAgICAgIEFTU0VSVF9J
TVBMSUVTKHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpOb25lLCAhaGFzVHJhaWxpbmdTb2Z0
SHlwaGVuKTsKKyAgICAgICAgYXV0byBsZW5ndGggPSBjdXJyZW50UG9zaXRpb24gLSBpbml0aWFs
Tm9uV2hpdGVzcGFjZVBvc2l0aW9uOworICAgICAgICBpbmxpbmVDb250ZW50LmFwcGVuZChJbmxp
bmVUZXh0SXRlbTo6Y3JlYXRlTm9uV2hpdGVzcGFjZUl0ZW0oaW5saW5lVGV4dEJveCwgaW5pdGlh
bE5vbldoaXRlc3BhY2VQb3NpdGlvbiwgbGVuZ3RoLCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIGlu
bGluZUl0ZW1XaWR0aChpbml0aWFsTm9uV2hpdGVzcGFjZVBvc2l0aW9uLCBsZW5ndGgpKSk7Cisg
ICAgfQorfQorCitib29sIElubGluZVRleHRJdGVtOjppc0VtcHR5Q29udGVudCgpIGNvbnN0Cit7
CisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBjaGVjayBmb3IgbW9yZSB6ZXJvIHdpZHRoIGNvbnRl
bnQgYW5kIG5vdCBqdXN0IFUrMjAwQi4KKyAgICByZXR1cm4gIW1fbGVuZ3RoIHx8IChtX2xlbmd0
aCA9PSAxICYmIGlubGluZVRleHRCb3goKS5jb250ZW50KClbc3RhcnQoKV0gPT0gemVyb1dpZHRo
U3BhY2UpOyAKK30KKworYm9vbCBJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNB
bmRUYWJzKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSkKK3sKKyAgICBBU1NF
UlQoaW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpOworICAgIHJldHVybiBUZXh0VXRpbDo6
c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtLmxheW91dEJveCgpKTsK
K30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uaCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVUZXh0SXRlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjUyZGM5OGRjZjA2YTE5YWEwNWZjNGFhMGFhMjRkOTgz
YTViN2NkMTUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uaApAQCAtMCwwICsx
LDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
KyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisg
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9G
T1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVJdGVtLmgiCisjaW5jbHVkZSAi
TGF5b3V0SW5saW5lVGV4dEJveC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2Ug
TGF5b3V0IHsKKwordXNpbmcgSW5saW5lSXRlbXMgPSBWZWN0b3I8SW5saW5lSXRlbT47CisKK2Ns
YXNzIElubGluZVRleHRJdGVtIDogcHVibGljIElubGluZUl0ZW0geworcHVibGljOgorICAgIHN0
YXRpYyB2b2lkIGNyZWF0ZUFuZEFwcGVuZFRleHRJdGVtcyhJbmxpbmVJdGVtcyYsIGNvbnN0IElu
bGluZVRleHRCb3gmKTsKKworICAgIHVuc2lnbmVkIHN0YXJ0KCkgY29uc3QgeyByZXR1cm4gbV9z
dGFydE9yUG9zaXRpb247IH0KKyAgICB1bnNpZ25lZCBlbmQoKSBjb25zdCB7IHJldHVybiBzdGFy
dCgpICsgbGVuZ3RoKCk7IH0KKyAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBt
X2xlbmd0aDsgfQorCisgICAgYm9vbCBpc1doaXRlc3BhY2UoKSBjb25zdCB7IHJldHVybiBtX3Rl
eHRJdGVtVHlwZSA9PSBUZXh0SXRlbVR5cGU6OldoaXRlc3BhY2U7IH0KKyAgICBib29sIGlzV29y
ZFNlcGFyYXRvcigpIGNvbnN0IHsgcmV0dXJuIG1faXNXb3JkU2VwYXJhdG9yOyB9CisgICAgYm9v
bCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4oKSBjb25zdCB7IHJldHVybiBtX2hhc1RyYWlsaW5nU29m
dEh5cGhlbjsgfQorICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRoKCkgY29uc3Qg
eyByZXR1cm4gbV9oYXNXaWR0aCA/IG1ha2VPcHRpb25hbChtX3dpZHRoKSA6IE9wdGlvbmFsPElu
bGluZUxheW91dFVuaXQ+IHsgfTsgfQorICAgIGJvb2wgaXNFbXB0eUNvbnRlbnQoKSBjb25zdDsK
KworICAgIGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRCb3goKSBjb25zdCB7IHJldHVy
biBkb3duY2FzdDxJbmxpbmVUZXh0Qm94PihsYXlvdXRCb3goKSk7IH0KKworICAgIElubGluZVRl
eHRJdGVtIGxlZnQodW5zaWduZWQgbGVuZ3RoKSBjb25zdDsKKyAgICBJbmxpbmVUZXh0SXRlbSBy
aWdodCh1bnNpZ25lZCBsZW5ndGgpIGNvbnN0OworCisgICAgc3RhdGljIGJvb2wgc2hvdWxkUHJl
c2VydmVTcGFjZXNBbmRUYWJzKGNvbnN0IElubGluZVRleHRJdGVtJik7CisKK3ByaXZhdGU6Cisg
ICAgdXNpbmcgSW5saW5lSXRlbTo6VGV4dEl0ZW1UeXBlOworCisgICAgSW5saW5lVGV4dEl0ZW0o
Y29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJv
b2wgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBib29sIGlzV29yZFNlcGFyYXRvciwgT3B0aW9uYWw8
SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgsIFRleHRJdGVtVHlwZSk7CisgICAgZXhwbGljaXQgSW5s
aW5lVGV4dEl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYpOworCisgICAgc3RhdGljIElubGluZVRl
eHRJdGVtIGNyZWF0ZVdoaXRlc3BhY2VJdGVtKGNvbnN0IElubGluZVRleHRCb3gmLCB1bnNpZ25l
ZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGlzV29yZFNlcGFyYXRvciwgT3B0aW9uYWw8
SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgpOworICAgIHN0YXRpYyBJbmxpbmVUZXh0SXRlbSBjcmVh
dGVOb25XaGl0ZXNwYWNlSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWduZWQgc3RhcnQs
IHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIE9wdGlvbmFsPElu
bGluZUxheW91dFVuaXQ+IHdpZHRoKTsKKyAgICBzdGF0aWMgSW5saW5lVGV4dEl0ZW0gY3JlYXRl
RW1wdHlJdGVtKGNvbnN0IElubGluZVRleHRCb3gmKTsKK307CisKK2lubGluZSBJbmxpbmVUZXh0
SXRlbSBJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlV2hpdGVzcGFjZUl0ZW0oY29uc3QgSW5saW5lVGV4
dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCwgYm9v
bCBpc1dvcmRTZXBhcmF0b3IsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRoKQorewor
ICAgIHJldHVybiB7IGlubGluZVRleHRCb3gsIHN0YXJ0LCBsZW5ndGgsIGZhbHNlLCBpc1dvcmRT
ZXBhcmF0b3IsIHdpZHRoLCBUZXh0SXRlbVR5cGU6OldoaXRlc3BhY2UgfTsKK30KKworaW5saW5l
IElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpjcmVhdGVOb25XaGl0ZXNwYWNlSXRlbShj
b25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBzdGFydCwgdW5zaWdu
ZWQgbGVuZ3RoLCBib29sIGhhc1RyYWlsaW5nU29mdEh5cGhlbiwgT3B0aW9uYWw8SW5saW5lTGF5
b3V0VW5pdD4gd2lkdGgpCit7CisgICAgLy8gRklYTUU6IFVzZSB0aGUgZm9sbG93aW5nIGxpc3Qg
b2Ygbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBzZXQgdGhlICJpc1dvcmRTZXBhcmF0b3Ii
IGJpdDogbm9CcmVha1NwYWNlLCBldGhpb3BpY1dvcmRzcGFjZSwgYWVnZWFuV29yZFNlcGFyYXRv
ckxpbmUgYWVnZWFuV29yZFNlcGFyYXRvckRvdCB1Z2FyaXRpY1dvcmREaXZpZGVyLgorICAgIHJl
dHVybiB7IGlubGluZVRleHRCb3gsIHN0YXJ0LCBsZW5ndGgsIGhhc1RyYWlsaW5nU29mdEh5cGhl
biwgZmFsc2UsIHdpZHRoLCBUZXh0SXRlbVR5cGU6Ok5vbldoaXRlc3BhY2UgfTsKK30KKworaW5s
aW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpjcmVhdGVFbXB0eUl0ZW0oY29uc3Qg
SW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCkKK3sKKyAgICByZXR1cm4gSW5saW5lVGV4dEl0
ZW0geyBpbmxpbmVUZXh0Qm94IH07Cit9CisKK2lubGluZSBJbmxpbmVUZXh0SXRlbTo6SW5saW5l
VGV4dEl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgc3Rh
cnQsIHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIGJvb2wgaXNX
b3JkU2VwYXJhdG9yLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCwgVGV4dEl0ZW1U
eXBlIHRleHRJdGVtVHlwZSkKKyAgICA6IElubGluZUl0ZW0oaW5saW5lVGV4dEJveCwgVHlwZTo6
VGV4dCkKK3sKKyAgICBtX3N0YXJ0T3JQb3NpdGlvbiA9IHN0YXJ0OworICAgIG1fbGVuZ3RoID0g
bGVuZ3RoOworICAgIG1faGFzV2lkdGggPSAhIXdpZHRoOworICAgIG1faGFzVHJhaWxpbmdTb2Z0
SHlwaGVuID0gaGFzVHJhaWxpbmdTb2Z0SHlwaGVuOworICAgIG1faXNXb3JkU2VwYXJhdG9yID0g
aXNXb3JkU2VwYXJhdG9yOworICAgIG1fd2lkdGggPSB3aWR0aC52YWx1ZU9yKDApOworICAgIG1f
dGV4dEl0ZW1UeXBlID0gdGV4dEl0ZW1UeXBlOworfQorCitpbmxpbmUgSW5saW5lVGV4dEl0ZW06
OklubGluZVRleHRJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRCb3gpCisgICAg
OiBJbmxpbmVJdGVtKGlubGluZVRleHRCb3gsIFR5cGU6OlRleHQpCit7Cit9CisKK2lubGluZSBJ
bmxpbmVUZXh0SXRlbSBJbmxpbmVUZXh0SXRlbTo6bGVmdCh1bnNpZ25lZCBsZW5ndGgpIGNvbnN0
Cit7CisgICAgUkVMRUFTRV9BU1NFUlQobGVuZ3RoIDw9IHRoaXMtPmxlbmd0aCgpKTsKKyAgICBB
U1NFUlQobV90ZXh0SXRlbVR5cGUgIT0gVGV4dEl0ZW1UeXBlOjpVbmRlZmluZWQpOworICAgIEFT
U0VSVChsZW5ndGgpOworICAgIHJldHVybiB7IGlubGluZVRleHRCb3goKSwgc3RhcnQoKSwgbGVu
Z3RoLCBmYWxzZSwgaXNXb3JkU2VwYXJhdG9yKCksIFdURjo6bnVsbG9wdCwgbV90ZXh0SXRlbVR5
cGUgfTsKK30KKworaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpyaWdodCh1
bnNpZ25lZCBsZW5ndGgpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlQobGVuZ3RoIDw9IHRo
aXMtPmxlbmd0aCgpKTsKKyAgICBBU1NFUlQobV90ZXh0SXRlbVR5cGUgIT0gVGV4dEl0ZW1UeXBl
OjpVbmRlZmluZWQpOworICAgIEFTU0VSVChsZW5ndGgpOworICAgIHJldHVybiB7IGlubGluZVRl
eHRCb3goKSwgZW5kKCkgLSBsZW5ndGgsIGxlbmd0aCwgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuKCks
IGlzV29yZFNlcGFyYXRvcigpLCBXVEY6Om51bGxvcHQsIG1fdGV4dEl0ZW1UeXBlIH07Cit9CisK
K30KK30KKworU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19JTkxJTkVfSVRFTShJbmxpbmVUZXh0SXRl
bSwgaXNUZXh0KCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuY3BwIGIv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5n
L3RleHQvVGV4dFV0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjdlNTc1YmNlNzI4NTNhOGM5ZGJmMzYyZjRm
YzliMTk5NzZhYjI1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvdGV4dC9UZXh0VXRpbC5jcHAKQEAg
LTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiVGV4dFV0aWwuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQor
CisjaW5jbHVkZSAiQnJlYWtMaW5lcy5oIgorI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisjaW5j
bHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIKKyNpbmNsdWRlICJMYXlvdXRJbmxpbmVUZXh0Qm94Lmgi
CisjaW5jbHVkZSAiUmVuZGVyQm94LmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0lubGluZUxheW91dFVuaXQg
VGV4dFV0aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5s
aW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpCit7CisgICAgcmV0dXJuIFRleHRVdGls
Ojp3aWR0aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwgaW5saW5lVGV4
dEl0ZW0uZW5kKCksIGNvbnRlbnRMb2dpY2FsTGVmdCk7Cit9CisKK0lubGluZUxheW91dFVuaXQg
VGV4dFV0aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgdW5z
aWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxM
ZWZ0KQoreworICAgIFJFTEVBU0VfQVNTRVJUKGZyb20gPj0gaW5saW5lVGV4dEl0ZW0uc3RhcnQo
KSk7CisgICAgUkVMRUFTRV9BU1NFUlQodG8gPD0gaW5saW5lVGV4dEl0ZW0uZW5kKCkpOworICAg
IGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4dEl0ZW06OnNo
b3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpIHsKKyAgICAgICAgYXV0
byBzcGFjZVdpZHRoID0gaW5saW5lVGV4dEl0ZW0uc3R5bGUoKS5mb250Q2FzY2FkZSgpLnNwYWNl
V2lkdGgoKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6aXNuYW4oc3BhY2VXaWR0aCkgPyAwLjBmIDog
c3RkOjppc2luZihzcGFjZVdpZHRoKSA/IG1heElubGluZUxheW91dFVuaXQoKSA6IHNwYWNlV2lk
dGg7CisgICAgfQorICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0uaW5s
aW5lVGV4dEJveCgpLCBmcm9tLCB0bywgY29udGVudExvZ2ljYWxMZWZ0KTsKK30KKworSW5saW5l
TGF5b3V0VW5pdCBUZXh0VXRpbDo6d2lkdGgoY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4
dEJveCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91dFVuaXQgY29udGVu
dExvZ2ljYWxMZWZ0KQoreworICAgIGlmIChmcm9tID09IHRvKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIGF1dG8mIHN0eWxlID0gaW5saW5lVGV4dEJveC5zdHlsZSgpOworICAgIGF1dG8mIGZv
bnQgPSBzdHlsZS5mb250Q2FzY2FkZSgpOworICAgIGF1dG8gdGV4dCA9IGlubGluZVRleHRCb3gu
Y29udGVudCgpOworICAgIEFTU0VSVCh0byA8PSB0ZXh0Lmxlbmd0aCgpKTsKKyAgICBhdXRvIGhh
c0tlcm5pbmdPckxpZ2F0dXJlcyA9IGZvbnQuZW5hYmxlS2VybmluZygpIHx8IGZvbnQucmVxdWly
ZXNTaGFwaW5nKCk7CisgICAgYXV0byBtZWFzdXJlV2l0aEVuZFNwYWNlID0gaGFzS2VybmluZ09y
TGlnYXR1cmVzICYmIHRvIDwgdGV4dC5sZW5ndGgoKSAmJiB0ZXh0W3RvXSA9PSAnICc7CisgICAg
aWYgKG1lYXN1cmVXaXRoRW5kU3BhY2UpCisgICAgICAgICsrdG87CisgICAgZmxvYXQgd2lkdGgg
PSAwOworICAgIGlmIChpbmxpbmVUZXh0Qm94LmNhblVzZVNpbXBsaWZpZWRDb250ZW50TWVhc3Vy
aW5nKCkpCisgICAgICAgIHdpZHRoID0gZm9udC53aWR0aEZvclNpbXBsZVRleHQoU3RyaW5nVmll
dyh0ZXh0KS5zdWJzdHJpbmcoZnJvbSwgdG8gLSBmcm9tKSk7CisgICAgZWxzZSB7CisgICAgICAg
IGF1dG8gdGFiV2lkdGggPSBzdHlsZS5jb2xsYXBzZVdoaXRlU3BhY2UoKSA/IFRhYlNpemUoMCkg
OiBzdHlsZS50YWJTaXplKCk7CisgICAgICAgIFdlYkNvcmU6OlRleHRSdW4gcnVuKFN0cmluZ1Zp
ZXcodGV4dCkuc3Vic3RyaW5nKGZyb20sIHRvIC0gZnJvbSksIGNvbnRlbnRMb2dpY2FsTGVmdCk7
CisgICAgICAgIGlmICh0YWJXaWR0aCkKKyAgICAgICAgICAgIHJ1bi5zZXRUYWJTaXplKHRydWUs
IHRhYldpZHRoKTsKKyAgICAgICAgd2lkdGggPSBmb250LndpZHRoKHJ1bik7CisgICAgfQorCisg
ICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2UpCisgICAgICAgIHdpZHRoIC09IChmb250LnNwYWNl
V2lkdGgoKSArIGZvbnQud29yZFNwYWNpbmcoKSk7CisKKyAgICByZXR1cm4gc3RkOjppc25hbih3
aWR0aCkgPyAwLjBmIDogc3RkOjppc2luZih3aWR0aCkgPyBtYXhJbmxpbmVMYXlvdXRVbml0KCkg
OiB3aWR0aDsKK30KKworVGV4dFV0aWw6OlNwbGl0RGF0YSBUZXh0VXRpbDo6c3BsaXQoY29uc3Qg
SW5saW5lVGV4dEl0ZW0mIGlubGluZVRleHRJdGVtLCBJbmxpbmVMYXlvdXRVbml0IHRleHRXaWR0
aCwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250
ZW50TG9naWNhbExlZnQpCit7CisgICAgQVNTRVJUKGF2YWlsYWJsZVdpZHRoID49IDApOworICAg
IGF1dG8gc3RhcnRQb3NpdGlvbiA9IGlubGluZVRleHRJdGVtLnN0YXJ0KCk7CisgICAgYXV0byBs
ZW5ndGggPSBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKTsKKyAgICBBU1NFUlQobGVuZ3RoKTsKKwor
ICAgIGF1dG8gbGVmdCA9IHN0YXJ0UG9zaXRpb247CisgICAgLy8gUGF0aG9sb2dpY2FsIGNhc2Ug
b2YgKGV4dHJlbWVseSlsb25nIHN0cmluZyBhbmQgbmFycm93IGxpbmVzLgorICAgIC8vIEFkanVz
dCB0aGUgcmFuZ2Ugc28gdGhhdCB3ZSBjYW4gcGljayBhIHJlYXNvbmFibGUgbWlkcG9pbnQuCisg
ICAgSW5saW5lTGF5b3V0VW5pdCBhdmVyYWdlQ2hhcmFjdGVyV2lkdGggPSB0ZXh0V2lkdGggLyBs
ZW5ndGg7CisgICAgdW5zaWduZWQgb2Zmc2V0ID0gdG9MYXlvdXRVbml0KDIgKiBhdmFpbGFibGVX
aWR0aCAvIGF2ZXJhZ2VDaGFyYWN0ZXJXaWR0aCkudG9VbnNpZ25lZCgpOworICAgIGF1dG8gcmln
aHQgPSBzdGQ6Om1pbjx1bnNpZ25lZD4obGVmdCArIG9mZnNldCwgKHN0YXJ0UG9zaXRpb24gKyBs
ZW5ndGggLSAxKSk7CisgICAgLy8gUHJlc2VydmUgdGhlIGxlZnQgd2lkdGggZm9yIHRoZSBmaW5h
bCBzcGxpdCBwb3NpdGlvbiBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gcmVtZWFzdXJlIHRoZSBs
ZWZ0IHNpZGUgYWdhaW4uCisgICAgSW5saW5lTGF5b3V0VW5pdCBsZWZ0U2lkZVdpZHRoID0gMDsK
KyAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7CisgICAgICAgIGF1dG8gbWlkZGxlID0gKGxlZnQg
KyByaWdodCkgLyAyOworICAgICAgICBhdXRvIHdpZHRoID0gVGV4dFV0aWw6OndpZHRoKGlubGlu
ZVRleHRJdGVtLCBzdGFydFBvc2l0aW9uLCBtaWRkbGUgKyAxLCBjb250ZW50TG9naWNhbExlZnQp
OworICAgICAgICBpZiAod2lkdGggPCBhdmFpbGFibGVXaWR0aCkgeworICAgICAgICAgICAgbGVm
dCA9IG1pZGRsZSArIDE7CisgICAgICAgICAgICBsZWZ0U2lkZVdpZHRoID0gd2lkdGg7CisgICAg
ICAgIH0gZWxzZSBpZiAod2lkdGggPiBhdmFpbGFibGVXaWR0aCkKKyAgICAgICAgICAgIHJpZ2h0
ID0gbWlkZGxlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlICsg
MTsKKyAgICAgICAgICAgIGxlZnRTaWRlV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB7IHN0YXJ0UG9zaXRpb24sIHJpZ2h0IC0g
c3RhcnRQb3NpdGlvbiwgbGVmdFNpZGVXaWR0aCB9OworfQorCit1bnNpZ25lZCBUZXh0VXRpbDo6
ZmluZE5leHRCcmVha2FibGVQb3NpdGlvbihMYXp5TGluZUJyZWFrSXRlcmF0b3ImIGxpbmVCcmVh
a0l0ZXJhdG9yLCB1bnNpZ25lZCBzdGFydFBvc2l0aW9uLCBjb25zdCBSZW5kZXJTdHlsZSYgc3R5
bGUpCit7CisgICAgYXV0byBrZWVwQWxsV29yZHNGb3JDSksgPSBzdHlsZS53b3JkQnJlYWsoKSA9
PSBXb3JkQnJlYWs6OktlZXBBbGw7CisgICAgYXV0byBicmVha05CU1AgPSBzdHlsZS5hdXRvV3Jh
cCgpICYmIHN0eWxlLm5ic3BNb2RlKCkgPT0gTkJTUE1vZGU6OlNwYWNlOworCisgICAgaWYgKGtl
ZXBBbGxXb3Jkc0ZvckNKSykgeworICAgICAgICBpZiAoYnJlYWtOQlNQKQorICAgICAgICAgICAg
cmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbktlZXBpbmdBbGxXb3JkcyhsaW5lQnJlYWtJdGVy
YXRvciwgc3RhcnRQb3NpdGlvbik7CisgICAgICAgIHJldHVybiBuZXh0QnJlYWthYmxlUG9zaXRp
b25LZWVwaW5nQWxsV29yZHNJZ25vcmluZ05CU1AobGluZUJyZWFrSXRlcmF0b3IsIHN0YXJ0UG9z
aXRpb24pOworICAgIH0KKworICAgIGlmIChsaW5lQnJlYWtJdGVyYXRvci5tb2RlKCkgPT0gTGlu
ZUJyZWFrSXRlcmF0b3JNb2RlOjpEZWZhdWx0KSB7CisgICAgICAgIGlmIChicmVha05CU1ApCisg
ICAgICAgICAgICByZXR1cm4gV2ViQ29yZTo6bmV4dEJyZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVh
a0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9uKTsKKyAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQ
b3NpdGlvbklnbm9yaW5nTkJTUChsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Cisg
ICAgfQorCisgICAgaWYgKGJyZWFrTkJTUCkKKyAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQ
b3NpdGlvbldpdGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7
CisgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbklnbm9yaW5nTkJTUFdpdGhvdXRTaG9y
dGN1dChsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Cit9CisKK2Jvb2wgVGV4dFV0
aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhjb25zdCBCb3gmIGxheW91dEJveCkKK3sK
KyAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXRleHQtMy8jd2hpdGUtc3BhY2UtcHJv
cGVydHkKKyAgICBhdXRvIHdoaXRlc3BhY2UgPSBsYXlvdXRCb3guc3R5bGUoKS53aGl0ZVNwYWNl
KCk7CisgICAgcmV0dXJuIHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlIHx8IHdoaXRlc3Bh
Y2UgPT0gV2hpdGVTcGFjZTo6UHJlV3JhcCB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OkJy
ZWFrU3BhY2VzOworfQorCitib29sIFRleHRVdGlsOjpzaG91bGRQcmVzZXJ2ZU5ld2xpbmUoY29u
c3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgYXV0byB3aGl0ZXNwYWNlID0gbGF5b3V0Qm94LnN0
eWxlKCkud2hpdGVTcGFjZSgpOworICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4
dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eQorICAgIHJldHVybiB3aGl0ZXNwYWNlID09IFdoaXRl
U3BhY2U6OlByZSB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZVdyYXAgfHwgd2hpdGVz
cGFjZSA9PSBXaGl0ZVNwYWNlOjpCcmVha1NwYWNlcyB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3Bh
Y2U6OlByZUxpbmU7IAorfQorCitMaW5lQnJlYWtJdGVyYXRvck1vZGUgVGV4dFV0aWw6OmxpbmVC
cmVha0l0ZXJhdG9yTW9kZShMaW5lQnJlYWsgbGluZUJyZWFrKQoreworICAgIHN3aXRjaCAobGlu
ZUJyZWFrKSB7CisgICAgY2FzZSBMaW5lQnJlYWs6OkF1dG86CisgICAgY2FzZSBMaW5lQnJlYWs6
OkFmdGVyV2hpdGVTcGFjZToKKyAgICBjYXNlIExpbmVCcmVhazo6QW55d2hlcmU6CisgICAgICAg
IHJldHVybiBMaW5lQnJlYWtJdGVyYXRvck1vZGU6OkRlZmF1bHQ7CisgICAgY2FzZSBMaW5lQnJl
YWs6Okxvb3NlOgorICAgICAgICByZXR1cm4gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpMb29zZTsK
KyAgICBjYXNlIExpbmVCcmVhazo6Tm9ybWFsOgorICAgICAgICByZXR1cm4gTGluZUJyZWFrSXRl
cmF0b3JNb2RlOjpOb3JtYWw7CisgICAgY2FzZSBMaW5lQnJlYWs6OlN0cmljdDoKKyAgICAgICAg
cmV0dXJuIExpbmVCcmVha0l0ZXJhdG9yTW9kZTo6U3RyaWN0OworICAgIH0KKyAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpEZWZhdWx0
OworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRVdGlsLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvdGV4
dC9UZXh0VXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFmNTg0ZmE3OTgxYmQ0MzgzY2Y0M2UyM2E0YmZhZWI4
MjBjZTMyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvdGV4dC9UZXh0VXRpbC5oCkBAIC0wLDAgKzEs
NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisg
KiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICog
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9S
TUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiSW5saW5lSXRlbS5oIgorI2luY2x1ZGUgIkxh
eW91dFVuaXRzLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvVGV4dEJyZWFrSXRlcmF0b3IuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSZW5kZXJTdHlsZTsKKworbmFtZXNwYWNlIExh
eW91dCB7CisKK2NsYXNzIElubGluZVRleHRCb3g7CitjbGFzcyBJbmxpbmVUZXh0SXRlbTsKKwor
Y2xhc3MgVGV4dFV0aWwgeworcHVibGljOgorICAgIHN0YXRpYyBJbmxpbmVMYXlvdXRVbml0IHdp
ZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNh
bExlZnQpOworICAgIHN0YXRpYyBJbmxpbmVMYXlvdXRVbml0IHdpZHRoKGNvbnN0IElubGluZVRl
eHRJdGVtJiwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91dFVuaXQgY29u
dGVudExvZ2ljYWxMZWZ0KTsKKyAgICBzdGF0aWMgSW5saW5lTGF5b3V0VW5pdCB3aWR0aChjb25z
dCBJbmxpbmVUZXh0Qm94JiwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91
dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KTsKKworICAgIHN0cnVjdCBTcGxpdERhdGEgeworICAg
ICAgICB1bnNpZ25lZCBzdGFydCB7IDAgfTsKKyAgICAgICAgdW5zaWduZWQgbGVuZ3RoIHsgMCB9
OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICB9Owor
ICAgIHN0YXRpYyBTcGxpdERhdGEgc3BsaXQoY29uc3QgSW5saW5lVGV4dEl0ZW0mLCBJbmxpbmVM
YXlvdXRVbml0IHRleHRXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCwgSW5s
aW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpOworCisgICAgc3RhdGljIHVuc2lnbmVk
IGZpbmROZXh0QnJlYWthYmxlUG9zaXRpb24oTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiwgdW5zaWdu
ZWQgc3RhcnRQb3NpdGlvbiwgY29uc3QgUmVuZGVyU3R5bGUmKTsKKyAgICBzdGF0aWMgTGluZUJy
ZWFrSXRlcmF0b3JNb2RlIGxpbmVCcmVha0l0ZXJhdG9yTW9kZShMaW5lQnJlYWspOworCisgICAg
c3RhdGljIGJvb2wgc2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGNvbnN0IEJveCYpOworICAg
IHN0YXRpYyBib29sIHNob3VsZFByZXNlcnZlTmV3bGluZShjb25zdCBCb3gmKTsKK307CisKK30K
K30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJs
ZUZvcm1hdHRpbmdDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45MDJhZjdjNWVkODhkNTA0Y2FjNDI1
YTEzNTIxMDA4YjZlNThiOWFjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29u
dGV4dC5jcHAKQEAgLTAsMCArMSw1MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
CisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisg
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExB
WU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0
ZS5oIgorI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0
aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbnZhbGlkYXRpb25TdGF0ZS5oIgorI2luY2x1ZGUgIkxh
eW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVkZSAiTGF5
b3V0Q2hpbGRJdGVyYXRvci5oIgorI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKKyNpbmNsdWRl
ICJMYXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0
aW5nU3RhdGUuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworV1RGX01BS0VfSVNPX0FMTE9DQVRF
RF9JTVBMKFRhYmxlRm9ybWF0dGluZ0NvbnRleHQpOworCisvLyBodHRwczovL3d3dy53My5vcmcv
VFIvY3NzLXRhYmxlcy0zLyN0YWJsZS1sYXlvdXQtYWxnb3JpdGhtCitUYWJsZUZvcm1hdHRpbmdD
b250ZXh0OjpUYWJsZUZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9ybWF0
dGluZ0NvbnRleHRSb290LCBUYWJsZUZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKQor
ICAgIDogRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHRSb290LCBmb3JtYXR0aW5n
U3RhdGUpCit7Cit9CisKK3ZvaWQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0SW5GbG93
Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29u
dGVudCYgY29uc3RyYWludHMpCit7CisgICAgYXV0byBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2Ug
PSBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxXaWR0aDsKKyAgICBhdXRvIGF2YWlsYWJs
ZVZlcnRpY2FsU3BhY2UgPSBjb25zdHJhaW50cy52ZXJ0aWNhbC5sb2dpY2FsSGVpZ2h0OworICAg
IC8vIDEuIENvbXB1dGUgd2lkdGggYW5kIGhlaWdodCBmb3IgdGhlIGdyaWQuCisgICAgY29tcHV0
ZUFuZERpc3RyaWJ1dGVFeHRyYVNwYWNlKGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSwgYXZhaWxh
YmxlVmVydGljYWxTcGFjZSk7CisgICAgLy8gMi4gRmluYWxpemUgY2VsbHMuCisgICAgc2V0VXNl
ZEdlb21ldHJ5Rm9yQ2VsbHMoYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKKyAgICAvLyAzLiBG
aW5hbGl6ZSByb3dzLgorICAgIHNldFVzZWRHZW9tZXRyeUZvclJvd3MoYXZhaWxhYmxlSG9yaXpv
bnRhbFNwYWNlKTsKKyAgICAvLyA0LiBGaW5hbGl6ZSBzZWN0aW9ucy4KKyAgICBzZXRVc2VkR2Vv
bWV0cnlGb3JTZWN0aW9ucyhjb25zdHJhaW50cyk7Cit9CisKK0xheW91dFVuaXQgVGFibGVGb3Jt
YXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdAoreworICAgIC8vIFRhYmxl
IGhhcyB0byBoYXZlIHNvbWUgc2VjdGlvbiBjb250ZW50LCBhdCBsZWFzdCBvbmUgPHRib2R5Pi4K
KyAgICBhdXRvIHRvcCA9IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KGdlb21ldHJ5Rm9yQm94
KCpyb290KCkuZmlyc3RJbkZsb3dDaGlsZCgpKSkudG9wKCk7CisgICAgYXV0byBib3R0b20gPSBC
b3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9tZXRyeUZvckJveCgqcm9vdCgpLmxhc3RJbkZs
b3dDaGlsZCgpKSkuYm90dG9tKCk7CisgICAgcmV0dXJuIGJvdHRvbSAtIHRvcDsKK30KKwordm9p
ZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpzZXRVc2VkR2VvbWV0cnlGb3JDZWxscyhMYXlvdXRV
bml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSkKK3sKKyAgICBhdXRvJiBncmlkID0gZm9ybWF0
dGluZ1N0YXRlKCkudGFibGVHcmlkKCk7CisgICAgYXV0byYgY29sdW1uTGlzdCA9IGdyaWQuY29s
dW1ucygpLmxpc3QoKTsKKyAgICBhdXRvJiByb3dMaXN0ID0gZ3JpZC5yb3dzKCkubGlzdCgpOwor
ICAgIC8vIEZpbmFsIHRhYmxlIGNlbGwgbGF5b3V0LiBBdCB0aGlzIHBvaW50IGFsbCBwZXJjZW50
YWdlIHZhbHVlcyBjYW4gYmUgcmVzb2x2ZWQuCisgICAgYXV0byBzZWN0aW9uT2Zmc2V0ID0gTGF5
b3V0VW5pdCB7IH07CisgICAgYXV0byogY3VycmVudFNlY3Rpb24gPSAmcm93TGlzdC5maXJzdCgp
LmJveCgpLnBhcmVudCgpOworICAgIGZvciAoYXV0byYgY2VsbCA6IGdyaWQuY2VsbHMoKSkgewor
ICAgICAgICBhdXRvJiBjZWxsQm94ID0gY2VsbC0+Ym94KCk7CisgICAgICAgIGF1dG8mIGNlbGxC
b3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGNlbGxCb3gpOworICAg
ICAgICBhdXRvJiBzZWN0aW9uID0gcm93TGlzdFtjZWxsLT5zdGFydFJvdygpXS5ib3goKS5wYXJl
bnQoKTsKKyAgICAgICAgaWYgKCZzZWN0aW9uICE9IGN1cnJlbnRTZWN0aW9uKSB7CisgICAgICAg
ICAgICBjdXJyZW50U2VjdGlvbiA9ICZzZWN0aW9uOworICAgICAgICAgICAgLy8gV2hpbGUgdGhl
IGdyaWQgaXMgYSBjb250aW51b3VzIGZsb3cgb2Ygcm93cywgaW4gdGhlIGRpc3BsYXkgdHJlZSB0
aGV5IGFyZSByZWxhdGl2ZSB0byB0aGVpciBzZWN0aW9ucy4KKyAgICAgICAgICAgIHNlY3Rpb25P
ZmZzZXQgPSByb3dMaXN0W2NlbGwtPnN0YXJ0Um93KCldLmxvZ2ljYWxUb3AoKTsKKyAgICAgICAg
fQorICAgICAgICBjZWxsQm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcChyb3dMaXN0W2NlbGwtPnN0
YXJ0Um93KCldLmxvZ2ljYWxUb3AoKSAtIHNlY3Rpb25PZmZzZXQpOworICAgICAgICBjZWxsQm94
R2VvbWV0cnkuc2V0TG9naWNhbExlZnQoY29sdW1uTGlzdFtjZWxsLT5zdGFydENvbHVtbigpXS5s
b2dpY2FsTGVmdCgpKTsKKyAgICAgICAgYXV0byBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlID0gcm93
TGlzdFtjZWxsLT5zdGFydFJvdygpXS5sb2dpY2FsSGVpZ2h0KCk7CisgICAgICAgIGZvciAoc2l6
ZV90IHJvd0luZGV4ID0gY2VsbC0+c3RhcnRSb3coKSArIDE7IHJvd0luZGV4IDwgY2VsbC0+ZW5k
Um93KCk7ICsrcm93SW5kZXgpCisgICAgICAgICAgICBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlICs9
IHJvd0xpc3Rbcm93SW5kZXhdLmxvZ2ljYWxIZWlnaHQoKTsKKyAgICAgICAgYXZhaWxhYmxlVmVy
dGljYWxTcGFjZSArPSAoY2VsbC0+cm93U3BhbigpIC0gMSkgKiBncmlkLnZlcnRpY2FsU3BhY2lu
ZygpOworICAgICAgICBsYXlvdXRDZWxsKCpjZWxsLCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2Us
IGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpOworICAgICAgICAvLyBGSVhNRTogRmluZCBvdXQgaWYg
aXQgaXMgb2sgdG8gdXNlIHRoZSByZWd1bGFyIHBhZGRpbmcgaGVyZSB0byBhbGlnbiB0aGUgY29u
dGVudCBib3ggaW5zaWRlIGEgdGFsbCBjZWxsIG9yIHdlIG5lZWQgdG8gCisgICAgICAgIC8vIHVz
ZSBzb21lIGtpbmQgb2YgaW50cmluc2ljIHBhZGRpbmcgc2ltaWxhciB0byBSZW5kZXJUYWJsZUNl
bGwuCisgICAgICAgIGF1dG8gcGFkZGluZ1RvcCA9IGNlbGxCb3hHZW9tZXRyeS5wYWRkaW5nVG9w
KCkudmFsdWVPcihMYXlvdXRVbml0IHsgfSk7CisgICAgICAgIGF1dG8gcGFkZGluZ0JvdHRvbSA9
IGNlbGxCb3hHZW9tZXRyeS5wYWRkaW5nQm90dG9tKCkudmFsdWVPcihMYXlvdXRVbml0IHsgfSk7
CisgICAgICAgIGF1dG8gaW50cmluc2ljUGFkZGluZ1RvcCA9IExheW91dFVuaXQgeyB9OworICAg
ICAgICBhdXRvIGludHJpbnNpY1BhZGRpbmdCb3R0b20gPSBMYXlvdXRVbml0IHsgfTsKKworICAg
ICAgICBzd2l0Y2ggKGNlbGxCb3guc3R5bGUoKS52ZXJ0aWNhbEFsaWduKCkpIHsKKyAgICAgICAg
Y2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6IHsKKyAgICAgICAgICAgIGF1dG8gaW50cmluc2lj
VmVydGljYWxQYWRkaW5nID0gc3RkOjptYXgoMF9sdSwgYXZhaWxhYmxlVmVydGljYWxTcGFjZSAt
IGNlbGxCb3hHZW9tZXRyeS52ZXJ0aWNhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKSAtIGNlbGxC
b3hHZW9tZXRyeS5jb250ZW50Qm94SGVpZ2h0KCkpOworICAgICAgICAgICAgaW50cmluc2ljUGFk
ZGluZ1RvcCA9IGludHJpbnNpY1ZlcnRpY2FsUGFkZGluZyAvIDI7CisgICAgICAgICAgICBpbnRy
aW5zaWNQYWRkaW5nQm90dG9tID0gaW50cmluc2ljVmVydGljYWxQYWRkaW5nIC8gMjsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFz
ZWxpbmU6IHsKKyAgICAgICAgICAgIGF1dG8gcm93QmFzZWxpbmUgPSBMYXlvdXRVbml0IHsgcm93
TGlzdFtjZWxsLT5zdGFydFJvdygpXS5iYXNlbGluZSgpIH07CisgICAgICAgICAgICBhdXRvIGNl
bGxCYXNlbGluZSA9IExheW91dFVuaXQgeyBjZWxsLT5iYXNlbGluZSgpIH07CisgICAgICAgICAg
ICBpbnRyaW5zaWNQYWRkaW5nVG9wID0gc3RkOjptYXgoMF9sdSwgcm93QmFzZWxpbmUgLSBjZWxs
QmFzZWxpbmUgLSBjZWxsQm94R2VvbWV0cnkuYm9yZGVyVG9wKCkpOworICAgICAgICAgICAgaW50
cmluc2ljUGFkZGluZ0JvdHRvbSA9IHN0ZDo6bWF4KDBfbHUsIGF2YWlsYWJsZVZlcnRpY2FsU3Bh
Y2UgLSBjZWxsQm94R2VvbWV0cnkudmVydGljYWxNYXJnaW5Cb3JkZXJBbmRQYWRkaW5nKCkgLSBp
bnRyaW5zaWNQYWRkaW5nVG9wIC0gY2VsbEJveEdlb21ldHJ5LmNvbnRlbnRCb3hIZWlnaHQoKSk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgIGlmIChpbnRyaW5zaWNQYWRkaW5nVG9wICYmIGNlbGxCb3guaGFz
SW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpIHsKKyAgICAgICAgICAgIGF1dG8gYWRqdXN0Q2VsbENv
bnRlbnRXaXRoSW5zdHJpbnNpY1BhZGRpbmdCZWZvcmUgPSBbJl0geworICAgICAgICAgICAgICAg
IC8vIENoaWxkIGJveGVzIChhbmQgcnVucykgYXJlIGFsd2F5cyBpbiB0aGUgY29vcmRpbmF0ZSBz
eXN0ZW0gb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBib3JkZXIgYm94LgorICAgICAgICAgICAg
ICAgIC8vIFRoZSBjb250ZW50IGJveCAod2hlcmUgdGhlIGNoaWxkIGNvbnRlbnQgbGl2ZXMpIGlz
IGluc2lkZSB0aGUgcGFkZGluZyBib3gsIHdoaWNoIGlzIGluc2lkZSB0aGUgYm9yZGVyIGJveC4K
KyAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBjb21wdXRlIHRoZSBjaGlsZCBib3ggdG9w
L2xlZnQgcG9zaXRpb24sIHdlIG5lZWQgdG8ga25vdyBib3RoIHRoZSBwYWRkaW5nIGFuZCB0aGUg
Ym9yZGVyIG9mZnNldHMuICAKKyAgICAgICAgICAgICAgICAvLyBOb3JtYWxseSBieSB0aGUgdGlt
ZSB3ZSBzdGFydCBwb3NpdGlvbmluZyB0aGUgY2hpbGQgY29udGVudCwgd2UgYWxyZWFkeSBoYXZl
IGNvbXB1dGVkIGJvcmRlcnMgYW5kIHBhZGRpbmcgZm9yIHRoZSBjb250YWluaW5nIGJsb2NrLgor
ICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZGlmZmVyZW50IHdpdGggdGFibGUgY2VsbHMgd2hl
cmUgdGhlIGZpbmFsIHBhZGRpbmcgb2Zmc2V0IGRlcGVuZHMgb24gdGhlIGNvbnRlbnQgaGVpZ2h0
IGFzIHdlIHVzZQorICAgICAgICAgICAgICAgIC8vIHRoZSBwYWRkaW5nIGJveCB0byB2ZXJ0aWNh
bGx5IGFsaWduIHRoZSB0YWJsZSBjZWxsIGNvbnRlbnQuCisgICAgICAgICAgICAgICAgYXV0byYg
Zm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZEZvcm1hdHRpbmdTdGF0
ZShjZWxsQm94KTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8qIGNoaWxkID0gY2VsbEJveC5m
aXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dElu
Rmxvd09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxk
LT5pc0lubGluZVRleHRCb3goKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkoKmNoaWxkKS5t
b3ZlVmVydGljYWxseShpbnRyaW5zaWNQYWRkaW5nVG9wKTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgaWYgKGNlbGxCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGlubGluZUZvcm1hdHRpbmdTdGF0
ZWUgPSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkSW5saW5lRm9ybWF0dGluZ1N0YXRlKGNlbGxC
b3gpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHJ1biA6IGlubGluZUZvcm1hdHRp
bmdTdGF0ZWUubGluZVJ1bnMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bi5tb3ZlVmVy
dGljYWxseShpbnRyaW5zaWNQYWRkaW5nVG9wKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChh
dXRvJiBsaW5lIDogaW5saW5lRm9ybWF0dGluZ1N0YXRlZS5saW5lcygpKQorICAgICAgICAgICAg
ICAgICAgICAgICAgbGluZS5tb3ZlVmVydGljYWxseShpbnRyaW5zaWNQYWRkaW5nVG9wKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYWRqdXN0Q2VsbENv
bnRlbnRXaXRoSW5zdHJpbnNpY1BhZGRpbmdCZWZvcmUoKTsKKyAgICAgICAgfQorICAgICAgICBj
ZWxsQm94R2VvbWV0cnkuc2V0VmVydGljYWxQYWRkaW5nKHsgcGFkZGluZ1RvcCArIGludHJpbnNp
Y1BhZGRpbmdUb3AsIHBhZGRpbmdCb3R0b20gKyBpbnRyaW5zaWNQYWRkaW5nQm90dG9tIH0pOwor
ICAgIH0KK30KKwordm9pZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpzZXRVc2VkR2VvbWV0cnlG
b3JSb3dzKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKQoreworICAgIGF1dG8m
IGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsKKyAgICBhdXRvJiByb3dzID0g
Z3JpZC5yb3dzKCkubGlzdCgpOworCisgICAgYXV0byByb3dMb2dpY2FsVG9wID0gZ3JpZC52ZXJ0
aWNhbFNwYWNpbmcoKTsKKyAgICBjb25zdCBDb250YWluZXJCb3gqIHByZXZpb3VzUm93ID0gbnVs
bHB0cjsKKyAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXpl
KCk7ICsrcm93SW5kZXgpIHsKKyAgICAgICAgYXV0byYgcm93ID0gcm93c1tyb3dJbmRleF07Cisg
ICAgICAgIGF1dG8mIHJvd0JveCA9IHJvdy5ib3goKTsKKyAgICAgICAgYXV0byYgcm93Qm94R2Vv
bWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShyb3dCb3gpOworCisgICAgICAg
IHJvd0JveEdlb21ldHJ5LnNldFBhZGRpbmcoZ2VvbWV0cnkoKS5jb21wdXRlZFBhZGRpbmcocm93
Qm94LCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpKTsKKyAgICAgICAgLy8gSW50ZXJuYWwgdGFi
bGUgZWxlbWVudHMgZG8gbm90IGhhdmUgbWFyZ2lucy4KKyAgICAgICAgcm93Qm94R2VvbWV0cnku
c2V0SG9yaXpvbnRhbE1hcmdpbih7IH0pOworICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRWZXJ0
aWNhbE1hcmdpbih7IH0pOworCisgICAgICAgIGF1dG8gY29tcHV0ZWRSb3dCb3JkZXIgPSBbJl0g
eworICAgICAgICAgICAgYXV0byBib3JkZXIgPSBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKHJv
d0JveCk7CisgICAgICAgICAgICBpZiAoIWdyaWQuY29sbGFwc2VkQm9yZGVyKCkpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIGJvcmRlcjsKKyAgICAgICAgICAgIC8vIEJvcmRlciBjb2xsYXBzaW5n
IGRlbGVnYXRlcyBib3JkZXJzIHRvIHRhYmxlL2NlbGxzLgorICAgICAgICAgICAgYm9yZGVyLmhv
cml6b250YWwgPSB7IH07CisgICAgICAgICAgICBpZiAoIXJvd0luZGV4KQorICAgICAgICAgICAg
ICAgIGJvcmRlci52ZXJ0aWNhbC50b3AgPSB7IH07CisgICAgICAgICAgICBpZiAocm93SW5kZXgg
PT0gcm93cy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgIGJvcmRlci52ZXJ0aWNhbC5ib3R0
b20gPSB7IH07CisgICAgICAgICAgICByZXR1cm4gYm9yZGVyOworICAgICAgICB9KCk7CisgICAg
ICAgIGlmIChjb21wdXRlZFJvd0JvcmRlci5oZWlnaHQoKSA+IHJvdy5sb2dpY2FsSGVpZ2h0KCkp
IHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGFuIG9kZCBxdWlyayB3aGVuIHRoZSBy
b3cgYm9yZGVyIG92ZXJmbG93cyB0aGUgcm93LgorICAgICAgICAgICAgLy8gV2UgZG9uJ3QgcGFp
bnQgcm93IGJvcmRlcnMgc28gaXQgZG9lcyBub3QgbWF0dGVyIHRvbyBtdWNoLCBidXQgaWYgd2Ug
ZG9uJ3QKKyAgICAgICAgICAgIC8vIHNldCB0aGlzIGZha2UgYm9yZGVyIHZhbHVlLCB0aGFuIHdl
IGVpdGhlciBlbmQgdXAgd2l0aCBhIG5lZ2F0aXZlIGNvbnRlbnQgYm94CisgICAgICAgICAgICAv
LyBvciB3aXRoIGEgd2lkZSBmcmFtZSBib3guCisgICAgICAgICAgICAvLyBJZiBpdCBoYXBwZW5z
IHRvIGNhdXNlIGlzc3VlcyBpbiB0aGUgZGlzcGxheSB0cmVlLCB3ZSBjb3VsZCBhbHNvIGNvbnNp
ZGVyCisgICAgICAgICAgICAvLyBhIHNwZWNpYWwgZnJhbWUgYm94IG92ZXJyaWRlLCB3aGVyZSBw
YWRkaW5nIGJveCArIGJvcmRlciAhPSBmcmFtZSBib3guCisgICAgICAgICAgICBjb21wdXRlZFJv
d0JvcmRlci52ZXJ0aWNhbC50b3AgPSB7IH07CisgICAgICAgICAgICBjb21wdXRlZFJvd0JvcmRl
ci52ZXJ0aWNhbC5ib3R0b20gPSB7IH07CisgICAgICAgIH0KKyAgICAgICAgcm93Qm94R2VvbWV0
cnkuc2V0Q29udGVudEJveEhlaWdodChyb3cubG9naWNhbEhlaWdodCgpIC0gY29tcHV0ZWRSb3dC
b3JkZXIuaGVpZ2h0KCkpOworCisgICAgICAgIGF1dG8gcm93TG9naWNhbFdpZHRoID0gZ3JpZC5j
b2x1bW5zKCkubG9naWNhbFdpZHRoKCkgKyAyICogZ3JpZC5ob3Jpem9udGFsU3BhY2luZygpOwor
ICAgICAgICBpZiAoY29tcHV0ZWRSb3dCb3JkZXIud2lkdGgoKSA+IHJvd0xvZ2ljYWxXaWR0aCkg
eworICAgICAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdmUuCisgICAgICAgICAgICBjb21wdXRl
ZFJvd0JvcmRlci5ob3Jpem9udGFsLmxlZnQgPSB7IH07CisgICAgICAgICAgICBjb21wdXRlZFJv
d0JvcmRlci5ob3Jpem9udGFsLnJpZ2h0ID0geyB9OworICAgICAgICB9CisgICAgICAgIHJvd0Jv
eEdlb21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aChyb3dMb2dpY2FsV2lkdGggLSBjb21wdXRlZFJv
d0JvcmRlci53aWR0aCgpKTsKKyAgICAgICAgcm93Qm94R2VvbWV0cnkuc2V0Qm9yZGVyKGNvbXB1
dGVkUm93Qm9yZGVyKTsKKworICAgICAgICBpZiAocHJldmlvdXNSb3cgJiYgJnByZXZpb3VzUm93
LT5wYXJlbnQoKSAhPSAmcm93Qm94LnBhcmVudCgpKSB7CisgICAgICAgICAgICAvLyBUaGlzIHJv
dyBpcyBpbiBhIGRpZmZlcmVudCBzZWN0aW9uLgorICAgICAgICAgICAgcm93TG9naWNhbFRvcCA9
IHsgfTsKKyAgICAgICAgfQorICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHJv
d0xvZ2ljYWxUb3ApOworICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRMb2dpY2FsTGVmdCh7IH0p
OworCisgICAgICAgIHJvd0xvZ2ljYWxUb3AgKz0gcm93LmxvZ2ljYWxIZWlnaHQoKSArIGdyaWQu
dmVydGljYWxTcGFjaW5nKCk7CisgICAgICAgIHByZXZpb3VzUm93ID0gJnJvd0JveDsKKyAgICB9
CisKKyAgICBhdXRvJiBjb2x1bW5zID0gZ3JpZC5jb2x1bW5zKCk7CisgICAgVmVjdG9yPElubGlu
ZUxheW91dFVuaXQ+IHJvd0Jhc2VsaW5lcyhyb3dzLnNpemUoKSwgMCk7CisgICAgLy8gTm93IHRo
YXQgY2VsbHMgYXJlIGxhaWQgb3V0LCBsZXQncyBjb21wdXRlIHRoZSByb3cgYmFzZWxpbmVzLgor
ICAgIGZvciAoc2l6ZV90IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dzLnNpemUoKTsgKyty
b3dJbmRleCkgeworICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbklu
ZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGF1dG8m
IHNsb3QgPSAqZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0pOworICAgICAgICAg
ICAgaWYgKHNsb3QuaXNSb3dTcGFubmVkKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICBpZiAoc2xvdC5oYXNSb3dTcGFuKCkpCisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICBhdXRvJiBjZWxsID0gc2xvdC5jZWxsKCk7CisgICAgICAgICAgICBy
b3dCYXNlbGluZXNbcm93SW5kZXhdID0gc3RkOjptYXgocm93QmFzZWxpbmVzW3Jvd0luZGV4XSwg
Y2VsbC5iYXNlbGluZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCByb3dJ
bmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpCisgICAgICAgIHJv
d3Nbcm93SW5kZXhdLnNldEJhc2VsaW5lKHJvd0Jhc2VsaW5lc1tyb3dJbmRleF0pOworfQorCit2
b2lkIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OnNldFVzZWRHZW9tZXRyeUZvclNlY3Rpb25zKGNv
bnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgYXV0
byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpOworICAgIGF1dG8mIHRhYmxl
Qm94ID0gcm9vdCgpOworICAgIGF1dG8gc2VjdGlvbldpZHRoID0gZ3JpZC5jb2x1bW5zKCkubG9n
aWNhbFdpZHRoKCkgKyAyICogZ3JpZC5ob3Jpem9udGFsU3BhY2luZygpOworICAgIGF1dG8gbG9n
aWNhbFRvcCA9IGNvbnN0cmFpbnRzLnZlcnRpY2FsLmxvZ2ljYWxUb3A7CisgICAgYXV0byB2ZXJ0
aWNhbFNwYWNpbmcgPSBncmlkLnZlcnRpY2FsU3BhY2luZygpOworICAgIGF1dG8gcGFkZGluZ0Jl
Zm9yZSA9IE9wdGlvbmFsPExheW91dFVuaXQ+IHsgdmVydGljYWxTcGFjaW5nIH07CisgICAgYXV0
byBwYWRkaW5nQWZ0ZXIgPSB2ZXJ0aWNhbFNwYWNpbmc7CisgICAgZm9yIChhdXRvJiBzZWN0aW9u
Qm94IDogY2hpbGRyZW5PZlR5cGU8Q29udGFpbmVyQm94Pih0YWJsZUJveCkpIHsKKyAgICAgICAg
YXV0byYgc2VjdGlvbkJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnko
c2VjdGlvbkJveCk7CisgICAgICAgIC8vIFNlY3Rpb24gYm9yZGVycyBhcmUgZWl0aGVyIGNvbGxh
cHNlZCBvciBpZ25vcmVkLgorICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0Qm9yZGVyKHsg
fSk7CisgICAgICAgIC8vIFVzZSBmYWtlIHZlcnRpY2FsIHBhZGRpbmcgdG8gc3BhY2Ugb3V0IHRo
ZSBzZWN0aW9ucy4KKyAgICAgICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldFBhZGRpbmcoRWRnZXMg
eyB7IH0sIHsgcGFkZGluZ0JlZm9yZS52YWx1ZU9yKDBfbHUpLCBwYWRkaW5nQWZ0ZXIgfSB9KTsK
KyAgICAgICAgcGFkZGluZ0JlZm9yZSA9IFdURjo6bnVsbG9wdDsKKyAgICAgICAgLy8gSW50ZXJu
YWwgdGFibGUgZWxlbWVudHMgZG8gbm90IGhhdmUgbWFyZ2lucy4KKyAgICAgICAgc2VjdGlvbkJv
eEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyB9KTsKKyAgICAgICAgc2VjdGlvbkJveEdl
b21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7CisKKyAgICAgICAgc2VjdGlvbkJveEdlb21l
dHJ5LnNldENvbnRlbnRCb3hXaWR0aChzZWN0aW9uV2lkdGgpOworICAgICAgICBhdXRvIHNlY3Rp
b25Db250ZW50SGVpZ2h0ID0gTGF5b3V0VW5pdCB7IH07CisgICAgICAgIHNpemVfdCByb3dDb3Vu
dCA9IDA7CisgICAgICAgIGZvciAoYXV0byYgcm93Qm94IDogY2hpbGRyZW5PZlR5cGU8Q29udGFp
bmVyQm94PihzZWN0aW9uQm94KSkgeworICAgICAgICAgICAgc2VjdGlvbkNvbnRlbnRIZWlnaHQg
Kz0gZ2VvbWV0cnlGb3JCb3gocm93Qm94KS5ib3JkZXJCb3hIZWlnaHQoKTsKKyAgICAgICAgICAg
ICsrcm93Q291bnQ7CisgICAgICAgIH0KKyAgICAgICAgc2VjdGlvbkNvbnRlbnRIZWlnaHQgKz0g
dmVydGljYWxTcGFjaW5nICogKHJvd0NvdW50IC0gMSk7CisgICAgICAgIHNlY3Rpb25Cb3hHZW9t
ZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KHNlY3Rpb25Db250ZW50SGVpZ2h0KTsKKyAgICAgICAg
c2VjdGlvbkJveEdlb21ldHJ5LnNldExvZ2ljYWxMZWZ0KGNvbnN0cmFpbnRzLmhvcml6b250YWwu
bG9naWNhbExlZnQpOworICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcChs
b2dpY2FsVG9wKTsKKworICAgICAgICBsb2dpY2FsVG9wICs9IHNlY3Rpb25Cb3hHZW9tZXRyeS5i
b3JkZXJCb3hIZWlnaHQoKTsKKyAgICB9Cit9CisKK3ZvaWQgVGFibGVGb3JtYXR0aW5nQ29udGV4
dDo6bGF5b3V0Q2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwsIExheW91dFVuaXQgYXZh
aWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkQ2VsbEhlaWdo
dCkKK3sKKyAgICBBU1NFUlQoY2VsbC5ib3goKS5lc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0Nv
bnRleHQoKSk7CisKKyAgICBhdXRvJiBncmlkID0gZm9ybWF0dGluZ1N0YXRlKCkudGFibGVHcmlk
KCk7CisgICAgYXV0byYgY2VsbEJveCA9IGNlbGwuYm94KCk7CisgICAgYXV0byYgY2VsbEJveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoY2VsbEJveCk7CisKKyAgICBj
ZWxsQm94R2VvbWV0cnkuc2V0Qm9yZGVyKGdlb21ldHJ5KCkuY29tcHV0ZWRDZWxsQm9yZGVyKGNl
bGwpKTsKKyAgICBjZWxsQm94R2VvbWV0cnkuc2V0UGFkZGluZyhnZW9tZXRyeSgpLmNvbXB1dGVk
UGFkZGluZyhjZWxsQm94LCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpKTsKKyAgICAvLyBJbnRl
cm5hbCB0YWJsZSBlbGVtZW50cyBkbyBub3QgaGF2ZSBtYXJnaW5zLgorICAgIGNlbGxCb3hHZW9t
ZXRyeS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgfSk7CisgICAgY2VsbEJveEdlb21ldHJ5LnNldFZl
cnRpY2FsTWFyZ2luKHsgfSk7CisKKyAgICBhdXRvIGF2YWlsYWJsZVNwYWNlRm9yQ29udGVudCA9
IFsmXSB7CisgICAgICAgIGF1dG8mIGNvbHVtbkxpc3QgPSBncmlkLmNvbHVtbnMoKS5saXN0KCk7
CisgICAgICAgIGF1dG8gbG9naWNhbFdpZHRoID0gTGF5b3V0VW5pdCB7IH07CisgICAgICAgIGZv
ciAoYXV0byBjb2x1bW5JbmRleCA9IGNlbGwuc3RhcnRDb2x1bW4oKTsgY29sdW1uSW5kZXggPCBj
ZWxsLmVuZENvbHVtbigpOyArK2NvbHVtbkluZGV4KQorICAgICAgICAgICAgbG9naWNhbFdpZHRo
ICs9IGNvbHVtbkxpc3QuYXQoY29sdW1uSW5kZXgpLmxvZ2ljYWxXaWR0aCgpOworICAgICAgICAv
LyBObyBjb2x1bW4gc3BhY2luZyB3aGVuIHNwYW5uaW5nLgorICAgICAgICBsb2dpY2FsV2lkdGgg
Kz0gKGNlbGwuY29sdW1uU3BhbigpIC0gMSkgKiBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7Cisg
ICAgICAgIHJldHVybiBsb2dpY2FsV2lkdGggLSBjZWxsQm94R2VvbWV0cnkuaG9yaXpvbnRhbE1h
cmdpbkJvcmRlckFuZFBhZGRpbmcoKTsKKyAgICB9KCk7CisgICAgY2VsbEJveEdlb21ldHJ5LnNl
dENvbnRlbnRCb3hXaWR0aChhdmFpbGFibGVTcGFjZUZvckNvbnRlbnQpOworCisgICAgaWYgKGNl
bGxCb3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpIHsKKyAgICAgICAgYXV0byBjb25zdHJh
aW50c0ZvckNlbGxDb250ZW50ID0gZ2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRl
bnQoY2VsbEJveCk7CisgICAgICAgIGNvbnN0cmFpbnRzRm9yQ2VsbENvbnRlbnQudmVydGljYWwu
bG9naWNhbEhlaWdodCA9IHVzZWRDZWxsSGVpZ2h0OworICAgICAgICBhdXRvIGludmFsaWRhdGlv
blN0YXRlID0gSW52YWxpZGF0aW9uU3RhdGUgeyB9OworICAgICAgICAvLyBGSVhNRTogVGhpcyBz
aG91bGQgcHJvYmFibHkgYmUgcGFydCBvZiB0aGUgaW52YWxpZGF0aW9uIHN0YXRlIHRvIGluZGlj
YXRlIHdoZW4gd2UgcmUtbGF5b3V0IHRoZSBjZWxsCisgICAgICAgIC8vIG11bHRpcGxlIHRpbWVz
IGFzIHBhcnQgb2YgdGhlIG11bHRpLXBhc3MgdGFibGUgYWxnb3JpdGhtLgorICAgICAgICBhdXRv
JiBmbG9hdGluZ1N0YXRlRm9yQ2VsbENvbnRlbnQgPSBsYXlvdXRTdGF0ZSgpLmVuc3VyZUJsb2Nr
Rm9ybWF0dGluZ1N0YXRlKGNlbGxCb3gpLmZsb2F0aW5nU3RhdGUoKTsKKyAgICAgICAgZmxvYXRp
bmdTdGF0ZUZvckNlbGxDb250ZW50LmNsZWFyKCk7CisgICAgICAgIExheW91dENvbnRleHQ6OmNy
ZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGNlbGxCb3gsIGxheW91dFN0YXRlKCkpLT5sYXlvdXRJbkZs
b3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBjb25zdHJhaW50c0ZvckNlbGxDb250ZW50KTsK
KyAgICB9CisgICAgY2VsbEJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoZ2VvbWV0cnko
KS5jZWxsSGVpZ2goY2VsbEJveCkpOworfQorCitGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2lj
V2lkdGhDb25zdHJhaW50cyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlZEludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMoKQoreworICAgIEFTU0VSVCghcm9vdCgpLmlzU2l6ZUNvbnRhaW5t
ZW50Qm94KCkpOworICAgIC8vIFRhYmxlcyBoYXZlIGEgc2xpZ2h0eSBkaWZmZXJlbnQgY29uY2Vw
dCBvZiBzaHJpbmsgdG8gZml0LiBJdCdzIHJlYWxseSBvbmx5IGRpZmZlcmVudCB3aXRoIG5vbi1h
dXRvICJ3aWR0aCIgdmFsdWVzLCB3aGVyZQorICAgIC8vIGEgZ2VuZXJpYyBzaHJpbmstdG8gZml0
IGJsb2NrIGxldmVsIGJveCBsaWtlIGEgZmxvYXQgYm94IHdvdWxkIGJlIGp1c3Qgc2l6ZWQgdG8g
dGhlIGNvbXB1dGVkIHZhbHVlIG9mICJ3aWR0aCIsIHRhYmxlcworICAgIC8vIGNhbiBhY3R1YWxs
eSBiZSBzdHJlY2hlZCB3YXkgb3Zlci4KKyAgICBhdXRvJiBncmlkID0gZm9ybWF0dGluZ1N0YXRl
KCkudGFibGVHcmlkKCk7CisgICAgaWYgKGF1dG8gY29tcHV0ZWRXaWR0aENvbnN0cmFpbnRzID0g
Z3JpZC53aWR0aENvbnN0cmFpbnRzKCkpCisgICAgICAgIHJldHVybiAqY29tcHV0ZWRXaWR0aENv
bnN0cmFpbnRzOworCisgICAgLy8gQ29tcHV0ZSB0aGUgbWluaW11bS9tYXhpbXVtIHdpZHRoIG9m
IGVhY2ggY29sdW1uLgorICAgIGF1dG8gY29tcHV0ZWRXaWR0aENvbnN0cmFpbnRzID0gY29tcHV0
ZWRQcmVmZXJyZWRXaWR0aEZvckNvbHVtbnMoKTsKKyAgICBncmlkLnNldFdpZHRoQ29uc3RyYWlu
dHMoY29tcHV0ZWRXaWR0aENvbnN0cmFpbnRzKTsKKyAgICByZXR1cm4gY29tcHV0ZWRXaWR0aENv
bnN0cmFpbnRzOworfQorCitVbmlxdWVSZWY8VGFibGVHcmlkPiBUYWJsZUZvcm1hdHRpbmdDb250
ZXh0OjplbnN1cmVUYWJsZUdyaWQoY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCkKK3sKKyAg
ICBhdXRvIHRhYmxlR3JpZCA9IG1ha2VVbmlxdWVSZWY8VGFibGVHcmlkPigpOworICAgIGF1dG8m
IHRhYmxlU3R5bGUgPSB0YWJsZUJveC5zdHlsZSgpOworICAgIGF1dG8gc2hvdWxkQXBwbHlCb3Jk
ZXJTcGFjaW5nID0gdGFibGVTdHlsZS5ib3JkZXJDb2xsYXBzZSgpID09IEJvcmRlckNvbGxhcHNl
OjpTZXBhcmF0ZTsKKyAgICB0YWJsZUdyaWQtPnNldEhvcml6b250YWxTcGFjaW5nKExheW91dFVu
aXQgeyBzaG91bGRBcHBseUJvcmRlclNwYWNpbmcgPyB0YWJsZVN0eWxlLmhvcml6b250YWxCb3Jk
ZXJTcGFjaW5nKCkgOiAwIH0pOworICAgIHRhYmxlR3JpZC0+c2V0VmVydGljYWxTcGFjaW5nKExh
eW91dFVuaXQgeyBzaG91bGRBcHBseUJvcmRlclNwYWNpbmcgPyB0YWJsZVN0eWxlLnZlcnRpY2Fs
Qm9yZGVyU3BhY2luZygpIDogMCB9KTsKKworICAgIGF1dG8qIGZpcnN0Q2hpbGQgPSB0YWJsZUJv
eC5maXJzdENoaWxkKCk7CisgICAgaWYgKCFmaXJzdENoaWxkKSB7CisgICAgICAgIC8vIFRoZSBy
YXJlIGNhc2Ugb2YgZW1wdHkgdGFibGUuCisgICAgICAgIHJldHVybiB0YWJsZUdyaWQ7CisgICAg
fQorCisgICAgY29uc3QgQm94KiB0YWJsZUNhcHRpb24gPSBudWxscHRyOworICAgIGNvbnN0IEJv
eCogY29sZ3JvdXAgPSBudWxscHRyOworICAgIC8vIFRhYmxlIGNhcHRpb24gaXMgYW4gb3B0aW9u
YWwgZWxlbWVudDsgaWYgdXNlZCwgaXQgaXMgYWx3YXlzIHRoZSBmaXJzdCBjaGlsZCBvZiBhIDx0
YWJsZT4uCisgICAgaWYgKGZpcnN0Q2hpbGQtPmlzVGFibGVDYXB0aW9uKCkpCisgICAgICAgIHRh
YmxlQ2FwdGlvbiA9IGZpcnN0Q2hpbGQ7CisgICAgLy8gVGhlIDxjb2xncm91cD4gbXVzdCBhcHBl
YXIgYWZ0ZXIgYW55IG9wdGlvbmFsIDxjYXB0aW9uPiBlbGVtZW50IGJ1dCBiZWZvcmUgYW55IDx0
aGVhZD4sIDx0aD4sIDx0Ym9keT4sIDx0Zm9vdD4gYW5kIDx0cj4gZWxlbWVudC4KKyAgICBhdXRv
KiBjb2xncm91cENhbmRpZGF0ZSA9IGZpcnN0Q2hpbGQ7CisgICAgaWYgKHRhYmxlQ2FwdGlvbikK
KyAgICAgICAgY29sZ3JvdXBDYW5kaWRhdGUgPSB0YWJsZUNhcHRpb24tPm5leHRTaWJsaW5nKCk7
CisgICAgaWYgKGNvbGdyb3VwQ2FuZGlkYXRlLT5pc1RhYmxlQ29sdW1uR3JvdXAoKSkKKyAgICAg
ICAgY29sZ3JvdXAgPSBjb2xncm91cENhbmRpZGF0ZTsKKworICAgIGlmIChjb2xncm91cCkgewor
ICAgICAgICBhdXRvJiBjb2x1bW5zID0gdGFibGVHcmlkLT5jb2x1bW5zKCk7CisgICAgICAgIGZv
ciAoYXV0byogY29sdW1uID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PigqY29sZ3JvdXApLmZpcnN0
Q2hpbGQoKTsgY29sdW1uOyBjb2x1bW4gPSBjb2x1bW4tPm5leHRTaWJsaW5nKCkpIHsKKyAgICAg
ICAgICAgIEFTU0VSVChjb2x1bW4tPmlzVGFibGVDb2x1bW4oKSk7CisgICAgICAgICAgICBhdXRv
IGNvbHVtblNwYW5Db3VudCA9IGNvbHVtbi0+Y29sdW1uU3BhbigpOworICAgICAgICAgICAgQVNT
RVJUKGNvbHVtblNwYW5Db3VudCA+IDApOworICAgICAgICAgICAgd2hpbGUgKGNvbHVtblNwYW5D
b3VudC0tKQorICAgICAgICAgICAgICAgIGNvbHVtbnMuYWRkQ29sdW1uKGRvd25jYXN0PENvbnRh
aW5lckJveD4oKmNvbHVtbikpOworICAgICAgICB9CisgICAgfQorCisgICAgYXV0byogZmlyc3RT
ZWN0aW9uID0gY29sZ3JvdXAgPyBjb2xncm91cC0+bmV4dFNpYmxpbmcoKSA6IHRhYmxlQ2FwdGlv
biA/IHRhYmxlQ2FwdGlvbi0+bmV4dFNpYmxpbmcoKSA6IGZpcnN0Q2hpbGQ7CisgICAgZm9yIChh
dXRvKiBzZWN0aW9uID0gZmlyc3RTZWN0aW9uOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+
bmV4dFNpYmxpbmcoKSkgeworICAgICAgICBBU1NFUlQoc2VjdGlvbi0+aXNUYWJsZUhlYWRlcigp
IHx8IHNlY3Rpb24tPmlzVGFibGVCb2R5KCkgfHwgc2VjdGlvbi0+aXNUYWJsZUZvb3RlcigpKTsK
KyAgICAgICAgZm9yIChhdXRvKiByb3cgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KCpzZWN0aW9u
KS5maXJzdENoaWxkKCk7IHJvdzsgcm93ID0gcm93LT5uZXh0U2libGluZygpKSB7CisgICAgICAg
ICAgICBBU1NFUlQocm93LT5pc1RhYmxlUm93KCkpOworICAgICAgICAgICAgZm9yIChhdXRvKiBj
ZWxsID0gZG93bmNhc3Q8Q29udGFpbmVyQm94Pigqcm93KS5maXJzdENoaWxkKCk7IGNlbGw7IGNl
bGwgPSBjZWxsLT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKGNlbGwt
PmlzVGFibGVDZWxsKCkpOworICAgICAgICAgICAgICAgIHRhYmxlR3JpZC0+YXBwZW5kQ2VsbChk
b3duY2FzdDxDb250YWluZXJCb3g+KCpjZWxsKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICB9CisgICAgcmV0dXJuIHRhYmxlR3JpZDsKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6Oklu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRQ
cmVmZXJyZWRXaWR0aEZvckNvbHVtbnMoKQoreworICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9
IHRoaXMtPmZvcm1hdHRpbmdTdGF0ZSgpOworICAgIGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3Rh
dGUudGFibGVHcmlkKCk7CisgICAgQVNTRVJUKCFncmlkLndpZHRoQ29uc3RyYWludHMoKSk7CisK
KyAgICAvLyBDb2x1bW4gcHJlZmVycmVkIHdpZHRoIGNvbXB1dGF0aW9uIGFzIGZvbGxvd3M6Cisg
ICAgLy8gMS4gQ29sbGVjdCBlYWNoIGNlbGxzJyB3aWR0aCBjb25zdHJhaW50cworICAgIC8vIDIu
IENvbGxlY3QgZml4ZWQgY29sdW1uIHdpZHRocyBzZXQgYnkgPGNvbGdyb3VwPidzIGFuZCA8Y29s
PnMKKyAgICAvLyAzLiBGaW5kIHRoZSBtaW4vbWF4IHdpZHRoIGZvciBlYWNoIGNvbHVtbnMgdXNp
bmcgdGhlIGNlbGwgY29uc3RyYWludHMgYW5kIHRoZSA8Y29sPiBmaXhlZCB3aWR0aHMgYnV0IGln
bm9yZSBjb2x1bW4gc3BhbnMuCisgICAgLy8gNC4gRGlzdHJpYnV0ZSBjb2x1bW4gc3Bhbm5pbmcg
Y2VsbHMgbWluL21heCB3aWR0aHMuCisgICAgLy8gNS4gQWRkIHRoZW0gYWxsIHVwIGFuZCByZXR1
cm4gdGhlIGNvbXB1dGVkIG1pbi9tYXggd2lkdGhzLgorICAgIGZvciAoYXV0byYgY2VsbCA6IGdy
aWQuY2VsbHMoKSkgeworICAgICAgICBhdXRvJiBjZWxsQm94ID0gY2VsbC0+Ym94KCk7CisgICAg
ICAgIEFTU0VSVChjZWxsQm94LmVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpKTsK
KworICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRoID0gZm9ybWF0dGluZ1N0YXRlLmludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHNGb3JCb3goY2VsbEJveCk7CisgICAgICAgIGlmICghaW50cmluc2lj
V2lkdGgpIHsKKyAgICAgICAgICAgIGludHJpbnNpY1dpZHRoID0gZ2VvbWV0cnkoKS5pbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzRm9yQ2VsbCgqY2VsbCk7CisgICAgICAgICAgICBmb3JtYXR0aW5n
U3RhdGUuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChjZWxsQm94LCAqaW50cmlu
c2ljV2lkdGgpOworICAgICAgICB9CisgICAgICAgIC8vIFNwYW5uZXIgY2VsbHMgcHV0IHRoZWly
IGludHJpbnNpYyB3aWR0aHMgb24gdGhlIGluaXRpYWwgc2xvdHMuCisgICAgICAgIGdyaWQuc2xv
dChjZWxsLT5wb3NpdGlvbigpKS0+c2V0V2lkdGhDb25zdHJhaW50cygqaW50cmluc2ljV2lkdGgp
OworICAgIH0KKworICAgIC8vIDIuIENvbGxlY3QgdGhlIGZpeGVkIHdpZHRoIDxjb2w+cy4KKyAg
ICBhdXRvJiBjb2x1bW5MaXN0ID0gZ3JpZC5jb2x1bW5zKCkubGlzdCgpOworICAgIFZlY3RvcjxP
cHRpb25hbDxMYXlvdXRVbml0Pj4gZml4ZWRXaWR0aENvbHVtbnM7CisgICAgZm9yIChhdXRvJiBj
b2x1bW4gOiBjb2x1bW5MaXN0KSB7CisgICAgICAgIGF1dG8gZml4ZWRXaWR0aCA9IFsmXSAoKSAt
PiBPcHRpb25hbDxMYXlvdXRVbml0PiB7CisgICAgICAgICAgICBhdXRvKiBjb2x1bW5Cb3ggPSBj
b2x1bW4uYm94KCk7CisgICAgICAgICAgICBpZiAoIWNvbHVtbkJveCkgeworICAgICAgICAgICAg
ICAgIC8vIEFub3lubW91cyBjb2x1bW5zIGRvbid0IGhhdmUgYXNzb2NpYXRlZCBsYXlvdXQgYm94
ZXMgYW5kIGNhbid0IGhhdmUgZml4ZWQgY29sIHNpemUuCisgICAgICAgICAgICAgICAgcmV0dXJu
IHsgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdXRvIHdpZHRoID0gY29sdW1u
Qm94LT5jb2x1bW5XaWR0aCgpKQorICAgICAgICAgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICAg
ICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmNvbXB1dGVkQ29sdW1uV2lkdGgoKmNvbHVtbkJveCk7
CisgICAgICAgIH07CisgICAgICAgIGZpeGVkV2lkdGhDb2x1bW5zLmFwcGVuZChmaXhlZFdpZHRo
KCkpOworICAgIH0KKworICAgIFZlY3RvcjxGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lk
dGhDb25zdHJhaW50cz4gY29sdW1uSW50cmluc2ljV2lkdGhzKGNvbHVtbkxpc3Quc2l6ZSgpKTsK
KyAgICAvLyAzLiBDb2xsZWN0IGhlIG1pbi9tYXggd2lkdGggZm9yIGVhY2ggY29sdW1uIGJ1dCBp
Z25vcmUgY29sdW1uIHNwYW5zIGZvciBub3cuCisgICAgVmVjdG9yPFNsb3RQb3NpdGlvbj4gc3Bh
bm5pbmdDZWxsUG9zaXRpb25MaXN0OworICAgIHNpemVfdCBudW1iZXJPZkFjdHVhbENvbHVtbnMg
PSAwOworICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1
bW5MaXN0LnNpemUoKTsgKytjb2x1bW5JbmRleCkgeworICAgICAgICBhdXRvIGNvbHVtbkhhc05v
blNwYW5uZWRDZWxsID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IHJvd0luZGV4ID0gMDsg
cm93SW5kZXggPCBncmlkLnJvd3MoKS5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAgICAgICAgICAg
IGF1dG8mIHNsb3QgPSAqZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0pOworICAg
ICAgICAgICAgaWYgKHNsb3QuaXNDb2x1bW5TcGFubmVkKCkpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICBjb2x1bW5IYXNOb25TcGFubmVkQ2VsbCA9IHRydWU7CisgICAg
ICAgICAgICBpZiAoc2xvdC5oYXNDb2x1bW5TcGFuKCkpIHsKKyAgICAgICAgICAgICAgICBzcGFu
bmluZ0NlbGxQb3NpdGlvbkxpc3QuYXBwZW5kKHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0pOwor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0
byBjb2x1bW5GaXhlZFdpZHRoID0gZml4ZWRXaWR0aENvbHVtbnNbY29sdW1uSW5kZXhdOworICAg
ICAgICAgICAgYXV0byB3aWR0aENvbnN0cmFpbnRzID0gIWNvbHVtbkZpeGVkV2lkdGggPyBzbG90
LndpZHRoQ29uc3RyYWludHMoKSA6IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzIHsgKmNvbHVtbkZpeGVkV2lkdGgsICpjb2x1bW5GaXhlZFdpZHRoIH07CisgICAg
ICAgICAgICBjb2x1bW5JbnRyaW5zaWNXaWR0aHNbY29sdW1uSW5kZXhdLm1pbmltdW0gPSBzdGQ6
Om1heCh3aWR0aENvbnN0cmFpbnRzLm1pbmltdW0sIGNvbHVtbkludHJpbnNpY1dpZHRoc1tjb2x1
bW5JbmRleF0ubWluaW11bSk7CisgICAgICAgICAgICBjb2x1bW5JbnRyaW5zaWNXaWR0aHNbY29s
dW1uSW5kZXhdLm1heGltdW0gPSBzdGQ6Om1heCh3aWR0aENvbnN0cmFpbnRzLm1heGltdW0sIGNv
bHVtbkludHJpbnNpY1dpZHRoc1tjb2x1bW5JbmRleF0ubWF4aW11bSk7CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKGNvbHVtbkhhc05vblNwYW5uZWRDZWxsKQorICAgICAgICAgICAgKytudW1iZXJP
ZkFjdHVhbENvbHVtbnM7CisgICAgfQorCisgICAgLy8gNC4gRGlzdHJpYnV0ZSB0aGUgc3Bhbm5p
bmcgbWluL21heCB3aWR0aHMuCisgICAgZm9yIChhdXRvIHNwYW5uaW5nQ2VsbFBvc2l0aW9uIDog
c3Bhbm5pbmdDZWxsUG9zaXRpb25MaXN0KSB7CisgICAgICAgIGF1dG8mIHNsb3QgPSAqZ3JpZC5z
bG90KHNwYW5uaW5nQ2VsbFBvc2l0aW9uKTsKKyAgICAgICAgYXV0byYgY2VsbCA9IHNsb3QuY2Vs
bCgpOworICAgICAgICBBU1NFUlQoc2xvdC5oYXNDb2x1bW5TcGFuKCkpOworICAgICAgICBhdXRv
IHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUgPSBzbG90LndpZHRoQ29uc3RyYWludHMoKTsK
KyAgICAgICAgZm9yIChzaXplX3QgY29sdW1uU3BhbkluZGV4ID0gY2VsbC5zdGFydENvbHVtbigp
OyBjb2x1bW5TcGFuSW5kZXggPCBjZWxsLmVuZENvbHVtbigpOyArK2NvbHVtblNwYW5JbmRleCkK
KyAgICAgICAgICAgIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUgLT0gY29sdW1uSW50cmlu
c2ljV2lkdGhzW2NvbHVtblNwYW5JbmRleF07CisgICAgICAgIC8vIDx0YWJsZSBzdHlsZT0iYm9y
ZGVyLXNwYWNpbmc6IDUwcHgiPjx0cj48dGQgY29sc3Bhbj0yPmxvbmcgbG9uZyB0ZXh0PC90ZD48
L3RyPjx0cj48dGQ+bG88L3RkPjx0ZD54dDwvdGQ+PHRyPjwvdGFibGU+CisgICAgICAgIC8vIFts
b25nIGxvbmcgdGV4dF0KKyAgICAgICAgLy8gW2xvXSAgICAgICAgW3h0XQorICAgICAgICAvLyBX
aGlsZSBpdCBsb29rcyBsaWtlIHRoZSBzcGFubmluZyBjZWxsIGhhcyB0byBkaXN0cmlidXRlIGFs
bCBpdHMgc3Bhbm5pbmcgd2lkdGgsIHRoZSBib3JkZXItc3BhY2luZyB0YWtlcyBtb3N0IG9mIHRo
ZSBzcGFjZSBhbmQKKyAgICAgICAgLy8gbm8gZGlzdHJpYnV0aW9uIGlzIG5lZWRlZCBhdCBhbGwu
CisgICAgICAgIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUgLT0gKGNlbGwuY29sdW1uU3Bh
bigpIC0gMSkgKiBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7CisgICAgICAgIC8vIEZJWE1FOiBD
aGVjayBpZiBmaXhlZCB3aWR0aCBjb2x1bW5zIHNob3VsZCBiZSBza2lwcGVkIGhlcmUuCisgICAg
ICAgIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWluaW11bSA9IHN0ZDo6bWF4KExheW91
dFVuaXQgeyB9LCB3aWR0aENvbnN0cmFpbnRzVG9EaXN0cmlidXRlLm1pbmltdW0gLyBjZWxsLmNv
bHVtblNwYW4oKSk7CisgICAgICAgIHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWF4aW11
bSA9IHN0ZDo6bWF4KExheW91dFVuaXQgeyB9LCB3aWR0aENvbnN0cmFpbnRzVG9EaXN0cmlidXRl
Lm1heGltdW0gLyBjZWxsLmNvbHVtblNwYW4oKSk7CisgICAgICAgIGlmICh3aWR0aENvbnN0cmFp
bnRzVG9EaXN0cmlidXRlLm1pbmltdW0gfHwgd2lkdGhDb25zdHJhaW50c1RvRGlzdHJpYnV0ZS5t
YXhpbXVtKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW5TcGFuSW5kZXggPSBjZWxs
LnN0YXJ0Q29sdW1uKCk7IGNvbHVtblNwYW5JbmRleCA8IGNlbGwuZW5kQ29sdW1uKCk7ICsrY29s
dW1uU3BhbkluZGV4KQorICAgICAgICAgICAgICAgIGNvbHVtbkludHJpbnNpY1dpZHRoc1tjb2x1
bW5TcGFuSW5kZXhdICs9IHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGU7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICAvLyA1LiBUaGUgZmluYWwgdGFibGUgbWluL21heCB3aWR0aHMgaXMganVz
dCB0aGUgYWNjdW11bGF0ZWQgY29sdW1uIGNvbnN0cmFpbnRzLgorICAgIGF1dG8gdGFibGVXaWR0
aENvbnN0cmFpbnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07CisgICAgZm9yIChh
dXRvJiBjb2x1bW5JbnRyaW5zaWNXaWR0aCA6IGNvbHVtbkludHJpbnNpY1dpZHRocykKKyAgICAg
ICAgdGFibGVXaWR0aENvbnN0cmFpbnRzICs9IGNvbHVtbkludHJpbnNpY1dpZHRoOworICAgIC8v
IEV4YXBhbmQgdGhlIHByZWZlcnJlZCB3aWR0aCB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGNl
bGwgc3BhY2luZyAobm90ZSB0aGF0IGNvbHVtbiBzcGFubmVycyBjb3VudCBhcyBvbmUgY2VsbCku
CisgICAgdGFibGVXaWR0aENvbnN0cmFpbnRzICs9IChudW1iZXJPZkFjdHVhbENvbHVtbnMgKyAx
KSAqIGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKKyAgICByZXR1cm4gdGFibGVXaWR0aENvbnN0
cmFpbnRzOworfQorCit2b2lkIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVBbmREaXN0
cmlidXRlRXh0cmFTcGFjZShMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSwgT3B0
aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlVmVydGljYWxTcGFjZSkKK3sKKyAgICAvLyBDb21w
dXRlIGFuZCBiYWxhbmNlIHRoZSBjb2x1bW4gYW5kIHJvdyBzcGFjZXMuCisgICAgYXV0byYgZ3Jp
ZCA9IGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpOworICAgIGF1dG8mIGNvbHVtbnMgPSBn
cmlkLmNvbHVtbnMoKS5saXN0KCk7CisgICAgYXV0byB0YWJsZUxheW91dCA9IHRoaXMtPnRhYmxl
TGF5b3V0KCk7CisKKyAgICAvLyBDb2x1bW5zIGZpcnN0LgorICAgIGF1dG8gZGlzdHJpYnV0ZWRI
b3Jpem9udGFsU3BhY2VzID0gdGFibGVMYXlvdXQuZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2Uo
YXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKKyAgICBBU1NFUlQoZGlzdHJpYnV0ZWRIb3Jpem9u
dGFsU3BhY2VzLnNpemUoKSA9PSBjb2x1bW5zLnNpemUoKSk7CisgICAgYXV0byBjb2x1bW5Mb2dp
Y2FsTGVmdCA9IGdyaWQuaG9yaXpvbnRhbFNwYWNpbmcoKTsKKyAgICBmb3IgKHNpemVfdCBjb2x1
bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29sdW1uSW5kZXgp
IHsKKyAgICAgICAgYXV0byYgY29sdW1uID0gY29sdW1uc1tjb2x1bW5JbmRleF07CisgICAgICAg
IGNvbHVtbi5zZXRMb2dpY2FsTGVmdChjb2x1bW5Mb2dpY2FsTGVmdCk7CisgICAgICAgIGNvbHVt
bi5zZXRMb2dpY2FsV2lkdGgoZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2VzW2NvbHVtbkluZGV4
XSk7CisgICAgICAgIGNvbHVtbkxvZ2ljYWxMZWZ0ICs9IGRpc3RyaWJ1dGVkSG9yaXpvbnRhbFNw
YWNlc1tjb2x1bW5JbmRleF0gKyBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7CisgICAgfQorCisg
ICAgLy8gUm93cyBzZWNvbmQuCisgICAgYXV0byYgcm93cyA9IGdyaWQucm93cygpLmxpc3QoKTsK
KyAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsr
cm93SW5kZXgpIHsKKyAgICAgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5J
bmRleCA8IGNvbHVtbnMuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBhdXRv
JiBzbG90ID0gKmdyaWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsKKyAgICAgICAg
ICAgIGlmIChzbG90LmlzUm93U3Bhbm5lZCgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgbGF5b3V0Q2VsbChzbG90LmNlbGwoKSwgYXZhaWxhYmxlSG9yaXpvbnRhbFNw
YWNlKTsKKyAgICAgICAgICAgIGlmIChzbG90Lmhhc1Jvd1NwYW4oKSkKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIFRoZSBtaW5pbXVtIGhlaWdodCBvZiBhIHJvdyAo
d2l0aG91dCBzcGFubmluZy1yZWxhdGVkIGhlaWdodCBkaXN0cmlidXRpb24pIGlzIGRlZmluZWQg
YXMgdGhlIGhlaWdodCBvZiBhbiBoeXBvdGhldGljYWwKKyAgICAgICAgICAgIC8vIGxpbmVib3gg
Y29udGFpbmluZyB0aGUgY2VsbHMgb3JpZ2luYXRpbmcgaW4gdGhlIHJvdy4KKyAgICAgICAgICAg
IGF1dG8mIGNlbGwgPSBzbG90LmNlbGwoKTsKKyAgICAgICAgICAgIGNlbGwuc2V0QmFzZWxpbmUo
Z2VvbWV0cnkoKS51c2VkQmFzZWxpbmVGb3JDZWxsKGNlbGwuYm94KCkpKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIGF1dG8gZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNlcyA9IHRhYmxlTGF5b3V0
LmRpc3RyaWJ1dGVkVmVydGljYWxTcGFjZShhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKTsKKyAgICBB
U1NFUlQoZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNlcy5zaXplKCkgPT0gcm93cy5zaXplKCkpOwor
ICAgIGF1dG8gcm93TG9naWNhbFRvcCA9IGdyaWQudmVydGljYWxTcGFjaW5nKCk7CisgICAgZm9y
IChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4
KSB7CisgICAgICAgIGF1dG8mIHJvdyA9IHJvd3Nbcm93SW5kZXhdOworICAgICAgICByb3cuc2V0
TG9naWNhbEhlaWdodChkaXN0cmlidXRlZFZlcnRpY2FsU3BhY2VzW3Jvd0luZGV4XSk7CisgICAg
ICAgIHJvdy5zZXRMb2dpY2FsVG9wKHJvd0xvZ2ljYWxUb3ApOworICAgICAgICByb3dMb2dpY2Fs
VG9wICs9IGRpc3RyaWJ1dGVkVmVydGljYWxTcGFjZXNbcm93SW5kZXhdICsgZ3JpZC52ZXJ0aWNh
bFNwYWNpbmcoKTsKKyAgICB9Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJs
ZUZvcm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uMWYzMGRlMTM1NDU2NjU1ODFlYjk0OWEyN2I4MGRmNGUxMjIyNWU2ZgotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3Jt
YXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQuaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
CisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRF
WFQpCisKKyNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIlRhYmxlRm9y
bWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiVGFibGVHcmlkLmgiCisjaW5jbHVkZSA8d3RmL0lz
b01hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIEludmFsaWRhdGlvblN0YXRlOworLy8g
VGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBsYXlvdXQgbG9naWMgZm9yIHRhYmxlIGZvcm1hdHRp
bmcgY29udGV4dHMuCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjIvdGFibGVzLmh0bWwK
K2NsYXNzIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQgZmluYWwgOiBwdWJsaWMgRm9ybWF0dGluZ0Nv
bnRleHQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVGb3JtYXR0aW5nQ29udGV4
dCk7CitwdWJsaWM6CisgICAgVGFibGVGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJC
b3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgVGFibGVGb3JtYXR0aW5nU3RhdGUmKTsKKyAgICB2
b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJh
aW50c0ZvckluRmxvd0NvbnRlbnQmKSBvdmVycmlkZTsKKyAgICBMYXlvdXRVbml0IHVzZWRDb250
ZW50SGVpZ2h0KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgVW5pcXVlUmVmPFRhYmxl
R3JpZD4gZW5zdXJlVGFibGVHcmlkKGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gpOworCitw
cml2YXRlOgorICAgIGNsYXNzIFRhYmxlTGF5b3V0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRh
YmxlTGF5b3V0KGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmLCBjb25zdCBUYWJsZUdyaWQm
KTsKKworICAgICAgICB1c2luZyBEaXN0cmlidXRlZFNwYWNlcyA9IFZlY3RvcjxMYXlvdXRVbml0
PjsKKyAgICAgICAgRGlzdHJpYnV0ZWRTcGFjZXMgZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2Uo
TGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOworICAgICAgICBEaXN0cmlidXRl
ZFNwYWNlcyBkaXN0cmlidXRlZFZlcnRpY2FsU3BhY2UoT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZh
aWxhYmxlVmVydGljYWxTcGFjZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBUYWJs
ZUZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1f
Zm9ybWF0dGluZ0NvbnRleHQ7IH0KKworICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250
ZXh0JiBtX2Zvcm1hdHRpbmdDb250ZXh0OworICAgICAgICBjb25zdCBUYWJsZUdyaWQmIG1fZ3Jp
ZDsKKyAgICB9OworCisgICAgY2xhc3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIExheW91dFVuaXQgY2VsbEhlaWdo
KGNvbnN0IENvbnRhaW5lckJveCYpIGNvbnN0OworICAgICAgICBFZGdlcyBjb21wdXRlZENlbGxC
b3JkZXIoY29uc3QgVGFibGVHcmlkOjpDZWxsJikgY29uc3Q7CisgICAgICAgIE9wdGlvbmFsPExh
eW91dFVuaXQ+IGNvbXB1dGVkQ29sdW1uV2lkdGgoY29uc3QgQ29udGFpbmVyQm94JiBjb2x1bW5C
b3gpOworICAgICAgICBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50
cyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQ2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwm
KTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB1c2VkQmFzZWxpbmVGb3JDZWxsKGNvbnN0IENv
bnRhaW5lckJveCYgY2VsbEJveCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgY2xh
c3MgVGFibGVGb3JtYXR0aW5nQ29udGV4dDsKKyAgICAgICAgR2VvbWV0cnkoY29uc3QgVGFibGVG
b3JtYXR0aW5nQ29udGV4dCYsIGNvbnN0IFRhYmxlR3JpZCYpOworCisgICAgICAgIGNvbnN0IFRh
YmxlRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4g
ZG93bmNhc3Q8VGFibGVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5Ojpmb3JtYXR0aW5nQ29udGV4dCgpKTsgfQorICAgICAgICBjb25zdCBUYWJsZUdyaWQmIG1f
Z3JpZDsKKyAgICB9OworICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21l
dHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMsIGZvcm1hdHRpbmdTdGF0ZSgpLnRh
YmxlR3JpZCgpKTsgfQorCisgICAgY2xhc3MgUXVpcmtzIDogcHVibGljIEZvcm1hdHRpbmdDb250
ZXh0OjpRdWlya3MgeworICAgIHB1YmxpYzoKKyAgICAgICAgUXVpcmtzKGNvbnN0IFRhYmxlRm9y
bWF0dGluZ0NvbnRleHQmKTsKKworICAgICAgICBib29sIHNob3VsZElnbm9yZUNoaWxkQ29udGVu
dFZlcnRpY2FsTWFyZ2luKGNvbnN0IENvbnRhaW5lckJveCYpIGNvbnN0OworCisgICAgICAgIGNv
bnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyBy
ZXR1cm4gZG93bmNhc3Q8VGFibGVGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6
OlF1aXJrczo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KKyAgICAgICAgVGFibGVGb3JtYXR0aW5n
Q29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29u
dGV4dCgpLmdlb21ldHJ5KCk7IH0KKyAgICB9OworICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6
OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9CisKKyAgICBU
YWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dCB0YWJsZUxheW91dCgpIGNvbnN0IHsg
cmV0dXJuIFRhYmxlTGF5b3V0KCp0aGlzLCBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKSk7
IH0KKworICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBsYXlvdXRDZWxsKGNvbnN0IFRhYmxl
R3JpZDo6Q2VsbCYsIExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25h
bDxMYXlvdXRVbml0PiB1c2VkQ2VsbEhlaWdodCA9IFdURjo6bnVsbG9wdCk7CisgICAgdm9pZCBz
ZXRVc2VkR2VvbWV0cnlGb3JDZWxscyhMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFj
ZSk7CisgICAgdm9pZCBzZXRVc2VkR2VvbWV0cnlGb3JSb3dzKExheW91dFVuaXQgYXZhaWxhYmxl
SG9yaXpvbnRhbFNwYWNlKTsKKyAgICB2b2lkIHNldFVzZWRHZW9tZXRyeUZvclNlY3Rpb25zKGNv
bnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOworCisgICAgSW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyBjb21wdXRlZFByZWZlcnJlZFdpZHRoRm9yQ29sdW1ucygpOworICAgIHZvaWQg
Y29tcHV0ZUFuZERpc3RyaWJ1dGVFeHRyYVNwYWNlKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpv
bnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKTsK
KworICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25z
dCB7IHJldHVybiBkb3duY2FzdDxUYWJsZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRl
eHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQorICAgIFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3Jt
YXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3duY2FzdDxUYWJsZUZvcm1hdHRpbmdTdGF0ZT4oRm9y
bWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQorfTsKKworaW5saW5lIFRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpHZW9tZXRyeShjb25zdCBUYWJsZUZvcm1hdHRp
bmdDb250ZXh0JiB0YWJsZUZvcm1hdHRpbmdDb250ZXh0LCBjb25zdCBUYWJsZUdyaWQmIGdyaWQp
CisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkodGFibGVGb3JtYXR0aW5nQ29udGV4
dCkKKyAgICAsIG1fZ3JpZChncmlkKQoreworfQorCitpbmxpbmUgVGFibGVGb3JtYXR0aW5nQ29u
dGV4dDo6UXVpcmtzOjpRdWlya3MoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYgdGFibGVG
b3JtYXR0aW5nQ29udGV4dCkKKyAgICA6IEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3ModGFibGVG
b3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworfQorfQorCitTUEVDSUFMSVpFX1RZUEVfVFJBSVRT
X0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoVGFibGVGb3JtYXR0aW5nQ29udGV4dCwgaXNUYWJs
ZUZvcm1hdHRpbmdDb250ZXh0KCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0
aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uZDczMjM5MjY5NGY2ZTdhODI0MjljMjBhNWU2MTA5ODQwZTJhZWRjOAot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKQEAg
LTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRU
SU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNs
dWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKKyNp
bmNsdWRlICJMYXlvdXREZXNjZW5kYW50SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJMYXlvdXRJbml0
aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0xheW91dFVuaXQg
VGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNlbGxIZWlnaChjb25zdCBDb250YWlu
ZXJCb3gmIGNlbGxCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGNlbGxCb3guaXNJbkZsb3coKSk7
CisgICAgYXV0byBjb250ZW50SGVpZ2h0ID0gTGF5b3V0VW5pdCB7IH07CisgICAgaWYgKGZvcm1h
dHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkSWdub3JlQ2hpbGRDb250ZW50VmVydGljYWxN
YXJnaW4oY2VsbEJveCkpIHsKKyAgICAgICAgQVNTRVJUKGNlbGxCb3guZmlyc3RJbkZsb3dDaGls
ZCgpKTsKKyAgICAgICAgYXV0byBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdD
b250ZXh0KCk7CisgICAgICAgIGF1dG8mIGZpcnN0SW5GbG93Q2hpbGQgPSAqY2VsbEJveC5maXJz
dEluRmxvd0NoaWxkKCk7CisgICAgICAgIGF1dG8mIGxhc3RJbkZsb3dDaGlsZCA9ICpjZWxsQm94
Lmxhc3RJbkZsb3dDaGlsZCgpOworICAgICAgICBhdXRvJiBmaXJzdEluRmxvd0NoaWxkR2VvbWV0
cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChmaXJzdEluRmxvd0NoaWxkLCBF
c2NhcGVSZWFzb246OlRhYmxlUXVpcmtOZWVkc0dlb21ldHJ5RnJvbUVzdGFibGlzaGVkRm9ybWF0
dGluZ0NvbnRleHQpOworICAgICAgICBhdXRvJiBsYXN0SW5GbG93Q2hpbGRHZW9tZXRyeSA9IGZv
cm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxhc3RJbkZsb3dDaGlsZCwgRXNjYXBlUmVh
c29uOjpUYWJsZVF1aXJrTmVlZHNHZW9tZXRyeUZyb21Fc3RhYmxpc2hlZEZvcm1hdHRpbmdDb250
ZXh0KTsKKworICAgICAgICBhdXRvIHRvcCA9IGZpcnN0SW5GbG93Q2hpbGQuc3R5bGUoKS5oYXNN
YXJnaW5CZWZvcmVRdWlyaygpID8gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QoZmlyc3RJbkZs
b3dDaGlsZEdlb21ldHJ5KS50b3AoKSA6IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KGZpcnN0
SW5GbG93Q2hpbGRHZW9tZXRyeSkudG9wKCk7CisgICAgICAgIGF1dG8gYm90dG9tID0gbGFzdElu
Rmxvd0NoaWxkLnN0eWxlKCkuaGFzTWFyZ2luQWZ0ZXJRdWlyaygpID8gQm94R2VvbWV0cnk6OmJv
cmRlckJveFJlY3QobGFzdEluRmxvd0NoaWxkR2VvbWV0cnkpLmJvdHRvbSgpIDogQm94R2VvbWV0
cnk6Om1hcmdpbkJveFJlY3QobGFzdEluRmxvd0NoaWxkR2VvbWV0cnkpLmJvdHRvbSgpOworICAg
ICAgICBjb250ZW50SGVpZ2h0ID0gYm90dG9tIC0gdG9wOworICAgIH0gZWxzZQorICAgICAgICBj
b250ZW50SGVpZ2h0ID0gY29udGVudEhlaWdodEZvckZvcm1hdHRpbmdDb250ZXh0Um9vdChjZWxs
Qm94KTsKKyAgICByZXR1cm4gc3RkOjptYXgoY29tcHV0ZWRIZWlnaHQoY2VsbEJveCkudmFsdWVP
cigwX2x1KSwgY29udGVudEhlaWdodCk7Cit9CisKK0VkZ2VzIFRhYmxlRm9ybWF0dGluZ0NvbnRl
eHQ6Okdlb21ldHJ5Ojpjb21wdXRlZENlbGxCb3JkZXIoY29uc3QgVGFibGVHcmlkOjpDZWxsJiBj
ZWxsKSBjb25zdAoreworICAgIGF1dG8mIGNlbGxCb3ggPSBjZWxsLmJveCgpOworICAgIGF1dG8g
Ym9yZGVyID0gY29tcHV0ZWRCb3JkZXIoY2VsbEJveCk7CisgICAgYXV0byBjb2xsYXBzZWRCb3Jk
ZXIgPSBtX2dyaWQuY29sbGFwc2VkQm9yZGVyKCk7CisgICAgaWYgKCFjb2xsYXBzZWRCb3JkZXIp
CisgICAgICAgIHJldHVybiBib3JkZXI7CisKKyAgICAvLyBXZSBtaWdodCB3YW50IHRvIGNhY2hl
IHRoZXNlIGNvbGxhcHNlZCBib3JkZXJzIG9uIHRoZSBncmlkLgorICAgIGF1dG8gY2VsbFBvc2l0
aW9uID0gY2VsbC5wb3NpdGlvbigpOworICAgIC8vIENvbGxhcHNlZCBib3JkZXIgbGVmdCBmcm9t
IHRhYmxlIGFuZCBhZGphY2VudCBjZWxscy4KKyAgICBpZiAoIWNlbGxQb3NpdGlvbi5jb2x1bW4p
CisgICAgICAgIGJvcmRlci5ob3Jpem9udGFsLmxlZnQgPSBjb2xsYXBzZWRCb3JkZXItPmhvcml6
b250YWwubGVmdCAvIDI7CisgICAgZWxzZSB7CisgICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJS
aWdodCA9IGNvbXB1dGVkQm9yZGVyKG1fZ3JpZC5zbG90KHsgY2VsbFBvc2l0aW9uLmNvbHVtbiAt
IDEsIGNlbGxQb3NpdGlvbi5yb3cgfSktPmNlbGwoKS5ib3goKSkuaG9yaXpvbnRhbC5yaWdodDsK
KyAgICAgICAgYm9yZGVyLmhvcml6b250YWwubGVmdCA9IHN0ZDo6bWF4KGJvcmRlci5ob3Jpem9u
dGFsLmxlZnQsIGFkamFjZW50Qm9yZGVyUmlnaHQpIC8gMjsKKyAgICB9CisgICAgLy8gQ29sbGFw
c2VkIGJvcmRlciByaWdodCBmcm9tIHRhYmxlIGFuZCBhZGphY2VudCBjZWxscy4KKyAgICBpZiAo
Y2VsbFBvc2l0aW9uLmNvbHVtbiA9PSBtX2dyaWQuY29sdW1ucygpLnNpemUoKSAtIDEpCisgICAg
ICAgIGJvcmRlci5ob3Jpem9udGFsLnJpZ2h0ID0gY29sbGFwc2VkQm9yZGVyLT5ob3Jpem9udGFs
LnJpZ2h0IC8gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgYXV0byBhZGphY2VudEJvcmRlckxlZnQg
PSBjb21wdXRlZEJvcmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4gKyAxLCBj
ZWxsUG9zaXRpb24ucm93IH0pLT5jZWxsKCkuYm94KCkpLmhvcml6b250YWwubGVmdDsKKyAgICAg
ICAgYm9yZGVyLmhvcml6b250YWwucmlnaHQgPSBzdGQ6Om1heChib3JkZXIuaG9yaXpvbnRhbC5y
aWdodCwgYWRqYWNlbnRCb3JkZXJMZWZ0KSAvIDI7CisgICAgfQorICAgIC8vIENvbGxhcHNlZCBi
b3JkZXIgdG9wIGZyb20gdGFibGUsIHJvdyBhbmQgYWRqYWNlbnQgY2VsbHMuCisgICAgYXV0byYg
cm93cyA9IG1fZ3JpZC5yb3dzKCkubGlzdCgpOworICAgIGlmICghY2VsbFBvc2l0aW9uLnJvdykK
KyAgICAgICAgYm9yZGVyLnZlcnRpY2FsLnRvcCA9IGNvbGxhcHNlZEJvcmRlci0+dmVydGljYWwu
dG9wIC8gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgYXV0byBhZGphY2VudEJvcmRlckJvdHRvbSA9
IGNvbXB1dGVkQm9yZGVyKG1fZ3JpZC5zbG90KHsgY2VsbFBvc2l0aW9uLmNvbHVtbiwgY2VsbFBv
c2l0aW9uLnJvdyAtIDEgfSktPmNlbGwoKS5ib3goKSkudmVydGljYWwuYm90dG9tOworICAgICAg
ICBhdXRvIGFkamFjZW50Um93Qm90dG9tID0gY29tcHV0ZWRCb3JkZXIocm93c1tjZWxsUG9zaXRp
b24ucm93IC0gMV0uYm94KCkpLnZlcnRpY2FsLmJvdHRvbTsKKyAgICAgICAgYXV0byBhZGphY2Vu
dENvbGxhcHNlZEJvcmRlciA9IHN0ZDo6bWF4KGFkamFjZW50Qm9yZGVyQm90dG9tLCBhZGphY2Vu
dFJvd0JvdHRvbSk7CisgICAgICAgIGJvcmRlci52ZXJ0aWNhbC50b3AgPSBzdGQ6Om1heChib3Jk
ZXIudmVydGljYWwudG9wLCBhZGphY2VudENvbGxhcHNlZEJvcmRlcikgLyAyOworICAgIH0KKyAg
ICAvLyBDb2xsYXBzZWQgYm9yZGVyIGJvdHRvbSBmcm9tIHRhYmxlLCByb3cgYW5kIGFkamFjZW50
IGNlbGxzLgorICAgIGlmIChjZWxsUG9zaXRpb24ucm93ID09IG1fZ3JpZC5yb3dzKCkuc2l6ZSgp
IC0gMSkKKyAgICAgICAgYm9yZGVyLnZlcnRpY2FsLmJvdHRvbSA9IGNvbGxhcHNlZEJvcmRlci0+
dmVydGljYWwuYm90dG9tIC8gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgYXV0byBhZGphY2VudEJv
cmRlclRvcCA9IGNvbXB1dGVkQm9yZGVyKG1fZ3JpZC5zbG90KHsgY2VsbFBvc2l0aW9uLmNvbHVt
biwgY2VsbFBvc2l0aW9uLnJvdyArIDEgfSktPmNlbGwoKS5ib3goKSkudmVydGljYWwudG9wOwor
ICAgICAgICBhdXRvIGFkamFjZW50Um93VG9wID0gY29tcHV0ZWRCb3JkZXIocm93c1tjZWxsUG9z
aXRpb24ucm93ICsgMV0uYm94KCkpLnZlcnRpY2FsLnRvcDsKKyAgICAgICAgYXV0byBhZGphY2Vu
dENvbGxhcHNlZEJvcmRlciA9IHN0ZDo6bWF4KGFkamFjZW50Qm9yZGVyVG9wLCBhZGphY2VudFJv
d1RvcCk7CisgICAgICAgIGJvcmRlci52ZXJ0aWNhbC5ib3R0b20gPSBzdGQ6Om1heChib3JkZXIu
dmVydGljYWwuYm90dG9tLCBhZGphY2VudENvbGxhcHNlZEJvcmRlcikgLyAyOworICAgIH0KKyAg
ICByZXR1cm4gYm9yZGVyOworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBUYWJsZUZvcm1hdHRp
bmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRDb2x1bW5XaWR0aChjb25zdCBDb250YWluZXJC
b3gmIGNvbHVtbkJveCkKK3sKKyAgICAvLyBDaGVjayBib3RoIHN0eWxlIGFuZCA8Y29sPidzIHdp
ZHRoIGF0dHJpYnV0ZS4KKyAgICAvLyBGSVhNRTogRmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGgg
Y2FsY3VsYXRlZCB2YWx1ZXMsIGxpa2UgPGNvbCBzdHlsZT0id2lkdGg6IDEwJSI+LgorICAgIGlm
IChhdXRvIGNvbXB1dGVkV2lkdGhWYWx1ZSA9IGNvbXB1dGVkV2lkdGgoY29sdW1uQm94LCB7IH0p
KQorICAgICAgICByZXR1cm4gY29tcHV0ZWRXaWR0aFZhbHVlOworICAgIHJldHVybiBjb2x1bW5C
b3guY29sdW1uV2lkdGgoKTsKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHNGb3JDZWxsKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkKK3sKKyAg
ICBhdXRvJiBjZWxsQm94ID0gY2VsbC5ib3goKTsKKyAgICBhdXRvJiBzdHlsZSA9IGNlbGxCb3gu
c3R5bGUoKTsKKworICAgIGF1dG8gY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0g
WyZdKCkgLT4gRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgewor
ICAgICAgICAvLyBFdmVuIGZpeGVkIHdpZHRoIGNlbGxzIGV4cGFuZCB0byB0aGVpciBtaW5pbXVt
IGNvbnRlbnQgd2lkdGgKKyAgICAgICAgLy8gPHRkIHN0eWxlPSJ3aWR0aDogMTBweCI+dGVzdF9j
b250ZW50PC90ZD4gd2lsbCBzaXplIHRvIG1heChtaW5pbXVtIGNvbnRlbnQgd2lkdGgsIGNvbXB1
dGVkIHdpZHRoKS4KKyAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gRm9y
bWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9OworICAgICAgICBp
ZiAoY2VsbEJveC5oYXNDaGlsZCgpKQorICAgICAgICAgICAgaW50cmluc2ljV2lkdGhDb25zdHJh
aW50cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGNlbGxCb3gsIGxh
eW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKKyAgICAg
ICAgaWYgKGF1dG8gZml4ZWRXaWR0aCA9IGZpeGVkVmFsdWUoc3R5bGUubG9naWNhbFdpZHRoKCkp
KQorICAgICAgICAgICAgcmV0dXJuIHsgc3RkOjptYXgoaW50cmluc2ljV2lkdGhDb25zdHJhaW50
cy5taW5pbXVtLCAqZml4ZWRXaWR0aCksIHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMubWluaW11bSwgKmZpeGVkV2lkdGgpIH07CisgICAgICAgIHJldHVybiBpbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzOworICAgIH07CisgICAgLy8gRklYTUUgQ2hlY2sgZm9yIGJveC1zaXppbmc6
IGJvcmRlci1ib3g7CisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gY29uc3Ry
YWluQnlNaW5NYXhXaWR0aChjZWxsQm94LCBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMoKSk7CisgICAgLy8gRXhwYW5kIHdpdGggYm9yZGVyCisgICAgaW50cmluc2ljV2lkdGhDb25z
dHJhaW50cy5leHBhbmQoY29tcHV0ZWRDZWxsQm9yZGVyKGNlbGwpLndpZHRoKCkpOworICAgIC8v
IHBhZGRpbmcKKyAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLmV4cGFuZChmaXhlZFZhbHVl
KHN0eWxlLnBhZGRpbmdMZWZ0KCkpLnZhbHVlT3IoMCkgKyBmaXhlZFZhbHVlKHN0eWxlLnBhZGRp
bmdSaWdodCgpKS52YWx1ZU9yKDApKTsKKyAgICAvLyBhbmQgbWFyZ2luCisgICAgaW50cmluc2lj
V2lkdGhDb25zdHJhaW50cy5leHBhbmQoZml4ZWRWYWx1ZShzdHlsZS5tYXJnaW5TdGFydCgpKS52
YWx1ZU9yKDApICsgZml4ZWRWYWx1ZShzdHlsZS5tYXJnaW5FbmQoKSkudmFsdWVPcigwKSk7Cisg
ICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Cit9CisKKworSW5saW5lTGF5b3V0
VW5pdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6dXNlZEJhc2VsaW5lRm9yQ2Vs
bChjb25zdCBDb250YWluZXJCb3gmIGNlbGxCb3gpCit7CisgICAgLy8gVGhlIGJhc2VsaW5lIG9m
IGEgY2VsbCBpcyBkZWZpbmVkIGFzIHRoZSBiYXNlbGluZSBvZiB0aGUgZmlyc3QgaW4tZmxvdyBs
aW5lIGJveCBpbiB0aGUgY2VsbCwKKyAgICAvLyBvciB0aGUgZmlyc3QgaW4tZmxvdyB0YWJsZS1y
b3cgaW4gdGhlIGNlbGwsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KKyAgICAvLyBJZiB0aGVyZSBp
cyBubyBzdWNoIGxpbmUgYm94LCB0aGUgYmFzZWxpbmUgaXMgdGhlIGJvdHRvbSBvZiBjb250ZW50
IGVkZ2Ugb2YgdGhlIGNlbGwgYm94LgorICAgIGlmIChjZWxsQm94LmVzdGFibGlzaGVzSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQoKSkKKyAgICAgICAgcmV0dXJuIGxheW91dFN0YXRlKCkuZXN0YWJs
aXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUoY2VsbEJveCkubGluZXMoKVswXS5iYXNlbGluZSgp
OworICAgIGZvciAoYXV0byYgY2VsbERlc2NlbmRhbnQgOiBkZXNjZW5kYW50c09mVHlwZTxDb250
YWluZXJCb3g+KGNlbGxCb3gpKSB7CisgICAgICAgIGlmIChjZWxsRGVzY2VuZGFudC5lc3RhYmxp
c2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgICAgIGF1dG8mIGlubGlu
ZUZvcm1hdHRpbmdTdGF0ZUZvckNlbGwgPSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkSW5saW5l
Rm9ybWF0dGluZ1N0YXRlKGNlbGxEZXNjZW5kYW50KTsKKyAgICAgICAgICAgIGlmICghaW5saW5l
Rm9ybWF0dGluZ1N0YXRlRm9yQ2VsbC5saW5lcygpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gaW5saW5lRm9ybWF0dGluZ1N0YXRlRm9yQ2VsbC5saW5lcygpWzBdLmJhc2VsaW5l
KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNlbGxEZXNjZW5kYW50LmVzdGFibGlzaGVzVGFi
bGVGb3JtYXR0aW5nQ29udGV4dCgpKQorICAgICAgICAgICAgcmV0dXJuIGxheW91dFN0YXRlKCku
ZXN0YWJsaXNoZWRUYWJsZUZvcm1hdHRpbmdTdGF0ZShjZWxsRGVzY2VuZGFudCkudGFibGVHcmlk
KCkucm93cygpLmxpc3QoKVswXS5iYXNlbGluZSgpOworICAgIH0KKyAgICByZXR1cm4gZm9ybWF0
dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChjZWxsQm94KS5jb250ZW50Qm94Qm90dG9tKCk7
Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0
UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFi
bGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LmI2NGE2MmRmZjA3MTRhZDY4ZmE3ODk2ODVmYmJiMjEzNzRmZjE1MzIKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0
dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApAQCAtMCwwICsxLDU3IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisj
aW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCisj
aW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNl
IExheW91dCB7CisKK2Jvb2wgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpzaG91bGRJ
Z25vcmVDaGlsZENvbnRlbnRWZXJ0aWNhbE1hcmdpbihjb25zdCBDb250YWluZXJCb3gmIGNlbGxC
b3gpIGNvbnN0Cit7CisgICAgLy8gTm9ybWFsbHkgQkZDIHJvb3QgY29udGVudCBoZWlnaHQgdGFr
ZXMgdGhlIG1hcmdpbiBib3ggb2YgdGhlIGNoaWxkIGNvbnRlbnQgYXMgdmVydGljYWwgbWFyZ2lu
cyBkb24ndCBjb2xsYXBzZSB3aXRoIEJGQyByb290cywKKyAgICAvLyBidXQgdGFibGUgY2VsbCBi
b3hlcyBkbyBjb2xsYXBzZSB0aGVpciAobm9uLWV4aXN0aW5nKSBtYXJnaW5zIHdpdGggY2hpbGQg
cXVpcmsgbWFyZ2lucyAoc28gbXVjaCBxdWlyayksIHNvIGhlcmUgd2UgY2hlY2sKKyAgICAvLyBp
ZiB0aGUgY29udGVudCBoZWlnaHQgc2hvdWxkIGluY2x1ZGUgbWFyZ2lucyBvciBub3QuCisgICAg
Ly8gZS5nIDx0YWJsZT48dHI+PHRkPjxwPnRleHQgY29udGVudDwvdGQ+PC90cj48L3RhYmxlPiA8
LSA8cD4ncyBxdWlyayBtYXJnaW4gY29sbGFwc2VzIHdpdGggdGhlIDx0ZD4gc28gaXRzIGNvbnRl
bnQKKyAgICAvLyBoZWlnaHQgc2hvdWxkIG5vdCBpbmNsdWRlIHZlcnRpY2FsIG1hcmdpbnMuCisg
ICAgaWYgKCFsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgaWYgKGNlbGxCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFjZWxsQm94Lmhhc0luRmxvd0NoaWxk
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gY2VsbEJveC5maXJzdEluRmxv
d0NoaWxkKCktPnN0eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSB8fCBjZWxsQm94Lmxhc3RJ
bkZsb3dDaGlsZCgpLT5zdHlsZSgpLmhhc01hcmdpbkFmdGVyUXVpcmsoKTsKK30KKworfQorfQor
CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9y
bWF0dGluZ1N0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xMzEwZWY1ZTEzMjYwZDFhMzFmYjFkOWU4NmUy
YzZiNjIzYTY1OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuY3Bw
CkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQorCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgorI2lu
Y2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25h
bWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoVGFibGVGb3Jt
YXR0aW5nU3RhdGUpOworCitUYWJsZUZvcm1hdHRpbmdTdGF0ZTo6VGFibGVGb3JtYXR0aW5nU3Rh
dGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91
dFN0YXRlLCBjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KQorICAgIDogRm9ybWF0dGluZ1N0
YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OlRhYmxlLCBsYXlvdXRTdGF0ZSkKKyAg
ICAsIG1fdGFibGVHcmlkKFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmVuc3VyZVRhYmxlR3JpZCh0
YWJsZUJveCkpCit7Cit9CisKK1RhYmxlRm9ybWF0dGluZ1N0YXRlOjp+VGFibGVGb3JtYXR0aW5n
U3RhdGUoKQoreworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGlu
Z1N0YXRlLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxl
Zm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjdkMWU0YWYwYjk2
YWNjNGQzNDM0NWFhOWNmNmQ4M2Y3OGQ1M2M3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZv
cm1hdHRpbmdTdGF0ZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9u
Y2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAi
Rm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiVGFibGVHcmlkLmgiCisjaW5jbHVkZSA8d3Rm
L0lzb01hbGxvYy5oPgorI2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKKy8vIFRhYmxlRm9ybWF0dGluZ1N0YXRlIGhv
bGRzIHRoZSBzdGF0ZSBmb3IgYSBwYXJ0aWN1bGFyIHRhYmxlIGZvcm1hdHRpbmcgY29udGV4dCB0
cmVlLgorY2xhc3MgVGFibGVGb3JtYXR0aW5nU3RhdGUgOiBwdWJsaWMgRm9ybWF0dGluZ1N0YXRl
IHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKFRhYmxlRm9ybWF0dGluZ1N0YXRlKTsKK3B1
YmxpYzoKKyAgICBUYWJsZUZvcm1hdHRpbmdTdGF0ZShSZWY8RmxvYXRpbmdTdGF0ZT4mJiwgTGF5
b3V0U3RhdGUmLCBjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KTsKKyAgICB+VGFibGVGb3Jt
YXR0aW5nU3RhdGUoKTsKKworICAgIFRhYmxlR3JpZCYgdGFibGVHcmlkKCkgeyByZXR1cm4gbV90
YWJsZUdyaWQ7IH0KKyAgICBjb25zdCBUYWJsZUdyaWQmIHRhYmxlR3JpZCgpIGNvbnN0IHsgcmV0
dXJuIG1fdGFibGVHcmlkOyB9CisKK3ByaXZhdGU6CisgICAgVW5pcXVlUmVmPFRhYmxlR3JpZD4g
bV90YWJsZUdyaWQ7Cit9OworCit9Cit9CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VU
X0ZPUk1BVFRJTkdfU1RBVEUoVGFibGVGb3JtYXR0aW5nU3RhdGUsIGlzVGFibGVGb3JtYXR0aW5n
U3RhdGUoKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuY3BwIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlk
LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi4zYzQxZDhkMDhhNTI1ZTc1NmFiY2RjYjFhMjE1YzlmNDY1NmFjZmI2
Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250
ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmNwcApAQCAtMCwwICsxLDE5NyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJUYWJsZUdyaWQuaCIKKwor
I2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSA8d3RmL0lz
b01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91
dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChUYWJsZUdyaWQpOworCitUYWJsZUdy
aWQ6OkNvbHVtbjo6Q29sdW1uKGNvbnN0IENvbnRhaW5lckJveCogY29sdW1uQm94KQorICAgIDog
bV9sYXlvdXRCb3gobWFrZVdlYWtQdHIoY29sdW1uQm94KSkKK3sKK30KKwordm9pZCBUYWJsZUdy
aWQ6OkNvbHVtbjo6c2V0TG9naWNhbFdpZHRoKExheW91dFVuaXQgY29tcHV0ZWRMb2dpY2FsV2lk
dGgpCit7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICBtX2hhc0NvbXB1dGVkV2lkdGggPSB0cnVl
OworI2VuZGlmCisgICAgbV9jb21wdXRlZExvZ2ljYWxXaWR0aCA9IGNvbXB1dGVkTG9naWNhbFdp
ZHRoOworfQorCitMYXlvdXRVbml0IFRhYmxlR3JpZDo6Q29sdW1uOjpsb2dpY2FsV2lkdGgoKSBj
b25zdAoreworICAgIEFTU0VSVChtX2hhc0NvbXB1dGVkV2lkdGgpOworICAgIHJldHVybiBtX2Nv
bXB1dGVkTG9naWNhbFdpZHRoOworfQorCit2b2lkIFRhYmxlR3JpZDo6Q29sdW1uOjpzZXRMb2dp
Y2FsTGVmdChMYXlvdXRVbml0IGNvbXB1dGVkTG9naWNhbExlZnQpCit7CisjaWYgQVNTRVJUX0VO
QUJMRUQKKyAgICBtX2hhc0NvbXB1dGVkTGVmdCA9IHRydWU7CisjZW5kaWYKKyAgICBtX2NvbXB1
dGVkTG9naWNhbExlZnQgPSBjb21wdXRlZExvZ2ljYWxMZWZ0OworfQorCitMYXlvdXRVbml0IFRh
YmxlR3JpZDo6Q29sdW1uOjpsb2dpY2FsTGVmdCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1faGFz
Q29tcHV0ZWRMZWZ0KTsKKyAgICByZXR1cm4gbV9jb21wdXRlZExvZ2ljYWxMZWZ0OworfQorCiti
b29sIFRhYmxlR3JpZDo6Q29sdW1uOjppc0ZpeGVkV2lkdGgoKSBjb25zdAoreworICAgIHJldHVy
biBoYXNGaXhlZFdpZHRoQ2VsbCgpIHx8IChib3goKSAmJiBib3goKS0+Y29sdW1uV2lkdGgoKSk7
Cit9CisKK3ZvaWQgVGFibGVHcmlkOjpDb2x1bW5zOjphZGRDb2x1bW4oY29uc3QgQ29udGFpbmVy
Qm94JiBjb2x1bW5Cb3gpCit7CisgICAgbV9jb2x1bW5MaXN0LmFwcGVuZCh7ICZjb2x1bW5Cb3gg
fSk7Cit9CisKK3ZvaWQgVGFibGVHcmlkOjpDb2x1bW5zOjphZGRBbm9ueW1vdXNDb2x1bW4oKQor
eworICAgIG1fY29sdW1uTGlzdC5hcHBlbmQoeyBudWxscHRyIH0pOworfQorCitib29sIFRhYmxl
R3JpZDo6Q29sdW1uczo6aGFzRml4ZWRDb2x1bW5zT25seSgpIGNvbnN0Cit7CisgICAgZm9yIChh
dXRvJiBjb2x1bW4gOiBtX2NvbHVtbkxpc3QpIHsKKyAgICAgICAgaWYgKCFjb2x1bW4uaXNGaXhl
ZFdpZHRoKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0
cnVlOworfQorCit2b2lkIFRhYmxlR3JpZDo6Um93czo6YWRkUm93KGNvbnN0IENvbnRhaW5lckJv
eCYgcm93Qm94KQoreworICAgIG1fcm93TGlzdC5hcHBlbmQoeyByb3dCb3ggfSk7Cit9CisKK1Rh
YmxlR3JpZDo6Um93OjpSb3coY29uc3QgQ29udGFpbmVyQm94JiByb3dCb3gpCisgICAgOiBtX2xh
eW91dEJveChtYWtlV2Vha1B0cihyb3dCb3gpKQoreworfQorCitUYWJsZUdyaWQ6OkNlbGw6OkNl
bGwoY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94LCBTbG90UG9zaXRpb24gcG9zaXRpb24sIENl
bGxTcGFuIHNwYW4pCisgICAgOiBtX2xheW91dEJveChtYWtlV2Vha1B0cihjZWxsQm94KSkKKyAg
ICAsIG1fcG9zaXRpb24ocG9zaXRpb24pCisgICAgLCBtX3NwYW4oc3BhbikKK3sKK30KKworYm9v
bCBUYWJsZUdyaWQ6OkNlbGw6OmlzRml4ZWRXaWR0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGJv
eCgpLnN0eWxlKCkubG9naWNhbFdpZHRoKCkuaXNGaXhlZCgpOworfQorCitUYWJsZUdyaWQ6OlNs
b3Q6OlNsb3QoQ2VsbCYgY2VsbCwgYm9vbCBpc0NvbHVtblNwYW5uZWQsIGJvb2wgaXNSb3dTcGFu
bmVkKQorICAgIDogbV9jZWxsKG1ha2VXZWFrUHRyKGNlbGwpKQorICAgICwgbV9pc0NvbHVtblNw
YW5uZWQoaXNDb2x1bW5TcGFubmVkKQorICAgICwgbV9pc1Jvd1NwYW5uZWQoaXNSb3dTcGFubmVk
KQoreworfQorCitUYWJsZUdyaWQ6OlRhYmxlR3JpZCgpCit7Cit9CisKK1RhYmxlR3JpZDo6U2xv
dCogVGFibGVHcmlkOjpzbG90KFNsb3RQb3NpdGlvbiBwb3NpdGlvbikKK3sKKyAgICByZXR1cm4g
bV9zbG90TWFwLmdldChwb3NpdGlvbik7Cit9CisKK3ZvaWQgVGFibGVHcmlkOjphcHBlbmRDZWxs
KGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCkKK3sKKyAgICBhdXRvIHJvd1NwYW4gPSBjZWxs
Qm94LnJvd1NwYW4oKTsKKyAgICBhdXRvIGNvbHVtblNwYW4gPSBjZWxsQm94LmNvbHVtblNwYW4o
KTsKKyAgICBhdXRvIGlzSW5OZXdSb3cgPSAhY2VsbEJveC5wcmV2aW91c1NpYmxpbmcoKTsKKyAg
ICBhdXRvIGluaXRpYWxTbG90UG9zaXRpb24gPSBTbG90UG9zaXRpb24geyB9OworCisgICAgaWYg
KCFtX2NlbGxzLmlzRW1wdHkoKSkgeworICAgICAgICBhdXRvJiBsYXN0Q2VsbCA9IG1fY2VsbHMu
bGFzdCgpOworICAgICAgICBhdXRvIGxhc3RTbG90UG9zaXRpb24gPSBsYXN0Q2VsbC0+cG9zaXRp
b24oKTsKKyAgICAgICAgLy8gRmlyc3QgdGFibGUgY2VsbCBpbiB0aGlzIHJvdz8KKyAgICAgICAg
aWYgKGlzSW5OZXdSb3cpCisgICAgICAgICAgICBpbml0aWFsU2xvdFBvc2l0aW9uID0gU2xvdFBv
c2l0aW9uIHsgMCwgbGFzdFNsb3RQb3NpdGlvbi5yb3cgKyAxIH07CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIGluaXRpYWxTbG90UG9zaXRpb24gPSBTbG90UG9zaXRpb24geyBsYXN0U2xvdFBv
c2l0aW9uLmNvbHVtbiArIDEsIGxhc3RTbG90UG9zaXRpb24ucm93IH07CisKKyAgICAgICAgLy8g
UGljayB0aGUgbmV4dCBhdmFpbGFibGUgc2xvdCBieSBhdm9pZGluZyByb3cgYW5kIGNvbHVtbiBz
cGFubmVycy4KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmICghbV9zbG90
TWFwLmNvbnRhaW5zKGluaXRpYWxTbG90UG9zaXRpb24pKQorICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgKytpbml0aWFsU2xvdFBvc2l0aW9uLmNvbHVtbjsKKyAgICAgICAgfQor
ICAgIH0KKyAgICBhdXRvIGNlbGwgPSBtYWtlVW5pcXVlPENlbGw+KGNlbGxCb3gsIGluaXRpYWxT
bG90UG9zaXRpb24sIENlbGxTcGFuIHsgY29sdW1uU3Bhbiwgcm93U3BhbiB9KTsKKyAgICAvLyBS
b3cgYW5kIGNvbHVtbiBzcGFubmVycyBjcmVhdGUgYWRkaXRpb25hbCBzbG90cy4KKyAgICBmb3Ig
KHNpemVfdCByb3cgPSAwOyByb3cgPCByb3dTcGFuOyArK3JvdykgeworICAgICAgICBmb3IgKGF1
dG8gY29sdW1uID0gY2VsbC0+c3RhcnRDb2x1bW4oKTsgY29sdW1uIDwgY2VsbC0+ZW5kQ29sdW1u
KCk7ICsrY29sdW1uKSB7CisgICAgICAgICAgICBhdXRvIHBvc2l0aW9uID0gU2xvdFBvc2l0aW9u
IHsgY29sdW1uLCBjZWxsLT5zdGFydFJvdygpICsgcm93IH07CisgICAgICAgICAgICBBU1NFUlQo
IW1fc2xvdE1hcC5jb250YWlucyhwb3NpdGlvbikpOworICAgICAgICAgICAgLy8gVGhpcyBzbG90
IGlzIHNwYW5uZWQgYnkgYSBjZWxsIGF0IHRoZSBpbml0aWFsIHNsb3cgcG9zaXRpb24uCisgICAg
ICAgICAgICBhdXRvIGlzQ29sdW1uU3Bhbm5lZCA9IGNvbHVtbiAhPSBjZWxsLT5zdGFydENvbHVt
bigpOworICAgICAgICAgICAgYXV0byBpc1Jvd1NwYW5uZWQgPSAhIXJvdzsKKyAgICAgICAgICAg
IG1fc2xvdE1hcC5hZGQocG9zaXRpb24sIG1ha2VVbmlxdWU8U2xvdD4oKmNlbGwsIGlzQ29sdW1u
U3Bhbm5lZCwgaXNSb3dTcGFubmVkKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSW5pdGlh
bGl6ZSBjb2x1bW5zL3Jvd3MgaWYgbmVlZGVkLgorICAgIGF1dG8gbWlzc2luZ051bWJlck9mQ29s
dW1ucyA9IHN0ZDo6bWF4PGludD4oMCwgaW5pdGlhbFNsb3RQb3NpdGlvbi5jb2x1bW4gKyBjb2x1
bW5TcGFuIC0gbV9jb2x1bW5zLnNpemUoKSk7CisgICAgZm9yIChhdXRvIGNvbHVtbiA9IDA7IGNv
bHVtbiA8IG1pc3NpbmdOdW1iZXJPZkNvbHVtbnM7ICsrY29sdW1uKQorICAgICAgICBtX2NvbHVt
bnMuYWRkQW5vbnltb3VzQ29sdW1uKCk7CisKKyAgICBpZiAoY2VsbC0+aXNGaXhlZFdpZHRoKCkp
IHsKKyAgICAgICAgZm9yIChhdXRvIGNvbHVtbiA9IGNlbGwtPnN0YXJ0Q29sdW1uKCk7IGNvbHVt
biA8IGNlbGwtPmVuZENvbHVtbigpOyArK2NvbHVtbikKKyAgICAgICAgICAgIG1fY29sdW1ucy5s
aXN0KClbY29sdW1uXS5zZXRIYXNGaXhlZFdpZHRoQ2VsbCgpOworICAgIH0KKworICAgIGlmIChp
c0luTmV3Um93KQorICAgICAgICBtX3Jvd3MuYWRkUm93KGNlbGxCb3gucGFyZW50KCkpOworCisg
ICAgbV9jZWxscy5hZGQoV1RGTW92ZShjZWxsKSk7Cit9CisKK3ZvaWQgVGFibGVHcmlkOjppbnNl
cnRDZWxsKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCwgY29uc3QgQ29udGFpbmVyQm94JiBi
ZWZvcmUpCit7CisgICAgVU5VU0VEX1BBUkFNKGNlbGxCb3gpOworICAgIFVOVVNFRF9QQVJBTShi
ZWZvcmUpOworfQorCit2b2lkIFRhYmxlR3JpZDo6cmVtb3ZlQ2VsbChjb25zdCBDb250YWluZXJC
b3gmIGNlbGxCb3gpCit7CisgICAgVU5VU0VEX1BBUkFNKGNlbGxCb3gpOworfQorCit9Cit9Cisj
ZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlR3JpZC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
NjI1YTNmNDRiZjYyMjFjZTQ2NTI1OTQwOTEzZWNlMTBiMDZhYWNlZgotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0
aW5nL1RhYmxlR3JpZC5oCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBv
bmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUg
IkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKKyNpbmNsdWRl
IDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKyNpbmNsdWRlIDx3
dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorI2luY2x1ZGUgPHd0Zi9MaXN0SGFzaFNldC5oPgorI2lu
Y2x1ZGUgPHd0Zi9XZWFrUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBM
YXlvdXQgeworY2xhc3MgQm94OworY2xhc3MgQ29udGFpbmVyQm94OworCitjbGFzcyBUYWJsZUdy
aWQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVHcmlkKTsKK3B1YmxpYzoKKyAg
ICBUYWJsZUdyaWQoKTsKKworICAgIHZvaWQgYXBwZW5kQ2VsbChjb25zdCBDb250YWluZXJCb3gm
KTsKKyAgICB2b2lkIGluc2VydENlbGwoY29uc3QgQ29udGFpbmVyQm94JiwgY29uc3QgQ29udGFp
bmVyQm94JiBiZWZvcmUpOworICAgIHZvaWQgcmVtb3ZlQ2VsbChjb25zdCBDb250YWluZXJCb3gm
KTsKKworICAgIHZvaWQgc2V0SG9yaXpvbnRhbFNwYWNpbmcoTGF5b3V0VW5pdCBob3Jpem9udGFs
U3BhY2luZykgeyBtX2hvcml6b250YWxTcGFjaW5nID0gaG9yaXpvbnRhbFNwYWNpbmc7IH0KKyAg
ICBMYXlvdXRVbml0IGhvcml6b250YWxTcGFjaW5nKCkgY29uc3QgeyByZXR1cm4gbV9ob3Jpem9u
dGFsU3BhY2luZzsgfQorCisgICAgdm9pZCBzZXRWZXJ0aWNhbFNwYWNpbmcoTGF5b3V0VW5pdCB2
ZXJ0aWNhbFNwYWNpbmcpIHsgbV92ZXJ0aWNhbFNwYWNpbmcgPSB2ZXJ0aWNhbFNwYWNpbmc7IH0K
KyAgICBMYXlvdXRVbml0IHZlcnRpY2FsU3BhY2luZygpIGNvbnN0IHsgcmV0dXJuIG1fdmVydGlj
YWxTcGFjaW5nOyB9CisKKyAgICB2b2lkIHNldENvbGxhcHNlZEJvcmRlcihjb25zdCBFZGdlcyYg
Y29sbGFwc2VkQm9yZGVyKSB7IG1fY29sbGFwc2VkQm9yZGVyID0gY29sbGFwc2VkQm9yZGVyOyB9
CisgICAgT3B0aW9uYWw8RWRnZXM+IGNvbGxhcHNlZEJvcmRlcigpIGNvbnN0IHsgcmV0dXJuIG1f
Y29sbGFwc2VkQm9yZGVyOyB9CisKKyAgICB2b2lkIHNldFdpZHRoQ29uc3RyYWludHMoRm9ybWF0
dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2ljV2lkdGhDb25z
dHJhaW50cykgeyBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBpbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzOyB9CisgICAgT3B0aW9uYWw8Rm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHM+IHdpZHRoQ29uc3RyYWludHMoKSBjb25zdCB7IHJldHVybiBtX2ludHJp
bnNpY1dpZHRoQ29uc3RyYWludHM7IH0KKworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0
dXJuIG1fc2xvdE1hcC5pc0VtcHR5KCk7IH0KKyAgICAvLyBDb2x1bW4gcmVwcmVzZW50cyBhIHZl
cnRpY2FsIHNldCBvZiBzbG90cyBpbiB0aGUgZ3JpZC4gQSBjb2x1bW4gaGFzIGhvcml6b250YWwg
cG9zaXRpb24gYW5kIHdpZHRoLgorICAgIGNsYXNzIENvbHVtbiB7CisgICAgcHVibGljOgorICAg
ICAgICBDb2x1bW4oY29uc3QgQ29udGFpbmVyQm94Kik7CisKKyAgICAgICAgdm9pZCBzZXRMb2dp
Y2FsTGVmdChMYXlvdXRVbml0KTsKKyAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgpIGNv
bnN0OworICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxv
Z2ljYWxMZWZ0KCkgKyBsb2dpY2FsV2lkdGgoKTsgfQorICAgICAgICB2b2lkIHNldExvZ2ljYWxX
aWR0aChMYXlvdXRVbml0KTsKKyAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25z
dDsKKworICAgICAgICBib29sIGlzRml4ZWRXaWR0aCgpIGNvbnN0OworCisgICAgICAgIHZvaWQg
c2V0SGFzRml4ZWRXaWR0aENlbGwoKSB7IG1faGFzRml4ZWRXaWR0aENlbGwgPSB0cnVlOyB9Cisg
ICAgICAgIGNvbnN0IENvbnRhaW5lckJveCogYm94KCkgY29uc3QgeyByZXR1cm4gbV9sYXlvdXRC
b3guZ2V0KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgaGFzRml4ZWRXaWR0aENl
bGwoKSBjb25zdCB7IHJldHVybiBtX2hhc0ZpeGVkV2lkdGhDZWxsOyB9CisKKyAgICAgICAgTGF5
b3V0VW5pdCBtX2NvbXB1dGVkTG9naWNhbFdpZHRoOworICAgICAgICBMYXlvdXRVbml0IG1fY29t
cHV0ZWRMb2dpY2FsTGVmdDsKKyAgICAgICAgV2Vha1B0cjxjb25zdCBDb250YWluZXJCb3g+IG1f
bGF5b3V0Qm94OworICAgICAgICBib29sIG1faGFzRml4ZWRXaWR0aENlbGwgeyBmYWxzZSB9Owor
CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICAgICAgYm9vbCBtX2hhc0NvbXB1dGVkV2lkdGggeyBm
YWxzZSB9OworICAgICAgICBib29sIG1faGFzQ29tcHV0ZWRMZWZ0IHsgZmFsc2UgfTsKKyNlbmRp
ZgorICAgIH07CisKKyAgICBjbGFzcyBDb2x1bW5zIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHVz
aW5nIENvbHVtbkxpc3QgPSBWZWN0b3I8Q29sdW1uPjsKKyAgICAgICAgQ29sdW1uTGlzdCYgbGlz
dCgpIHsgcmV0dXJuIG1fY29sdW1uTGlzdDsgfQorICAgICAgICBjb25zdCBDb2x1bW5MaXN0JiBs
aXN0KCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0OyB9CisgICAgICAgIHNpemVfdCBzaXpl
KCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0LnNpemUoKTsgfQorCisgICAgICAgIHZvaWQg
YWRkQ29sdW1uKGNvbnN0IENvbnRhaW5lckJveCYpOworICAgICAgICB2b2lkIGFkZEFub255bW91
c0NvbHVtbigpOworCisgICAgICAgIExheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyBy
ZXR1cm4gbV9jb2x1bW5MaXN0Lmxhc3QoKS5sb2dpY2FsUmlnaHQoKSAtIG1fY29sdW1uTGlzdC5m
aXJzdCgpLmxvZ2ljYWxMZWZ0KCk7IH0KKyAgICAgICAgYm9vbCBoYXNGaXhlZENvbHVtbnNPbmx5
KCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBDb2x1bW5MaXN0IG1fY29sdW1uTGlz
dDsKKyAgICB9OworCisgICAgY2xhc3MgUm93IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJvdyhj
b25zdCBDb250YWluZXJCb3gmKTsKKworICAgICAgICB2b2lkIHNldExvZ2ljYWxUb3AoTGF5b3V0
VW5pdCBsb2dpY2FsVG9wKSB7IG1fbG9naWNhbFRvcCA9IGxvZ2ljYWxUb3A7IH0KKyAgICAgICAg
TGF5b3V0VW5pdCBsb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsVG9wOyB9Cisg
ICAgICAgIExheW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxU
b3AoKSArIGxvZ2ljYWxIZWlnaHQoKTsgfQorCisgICAgICAgIHZvaWQgc2V0TG9naWNhbEhlaWdo
dChMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQpIHsgbV9sb2dpY2FsSGVpZ2h0ID0gbG9naWNhbEhl
aWdodDsgfQorICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQoKSBjb25zdCB7IHJldHVy
biBtX2xvZ2ljYWxIZWlnaHQ7IH0KKworICAgICAgICB2b2lkIHNldEJhc2VsaW5lKElubGluZUxh
eW91dFVuaXQgYmFzZWxpbmUpIHsgbV9iYXNlbGluZSA9IGJhc2VsaW5lOyB9CisgICAgICAgIElu
bGluZUxheW91dFVuaXQgYmFzZWxpbmUoKSBjb25zdCB7IHJldHVybiBtX2Jhc2VsaW5lOyB9CisK
KyAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlv
dXRCb3guZ2V0KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIExheW91dFVuaXQgbV9sb2dp
Y2FsVG9wOworICAgICAgICBMYXlvdXRVbml0IG1fbG9naWNhbEhlaWdodDsKKyAgICAgICAgSW5s
aW5lTGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OworICAgICAgICBXZWFrUHRyPGNvbnN0IENv
bnRhaW5lckJveD4gbV9sYXlvdXRCb3g7CisgICAgfTsKKworICAgIGNsYXNzIFJvd3MgeworICAg
IHB1YmxpYzoKKyAgICAgICAgdXNpbmcgUm93TGlzdCA9IFZlY3RvcjxSb3c+OworICAgICAgICBS
b3dMaXN0JiBsaXN0KCkgeyByZXR1cm4gbV9yb3dMaXN0OyB9CisgICAgICAgIGNvbnN0IFJvd0xp
c3QmIGxpc3QoKSBjb25zdCB7IHJldHVybiBtX3Jvd0xpc3Q7IH0KKworICAgICAgICB2b2lkIGFk
ZFJvdyhjb25zdCBDb250YWluZXJCb3gmKTsKKworICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fcm93TGlzdC5zaXplKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFJv
d0xpc3QgbV9yb3dMaXN0OworICAgIH07CisKKyAgICAvLyBDZWxsIHJlcHJlc2VudHMgYSA8dGQ+
IG9yIDx0aD4uIEl0IGNhbiBzcGFuIG11bHRpcGxlIHNsb3RzIGluIHRoZSBncmlkLgorICAgIGNs
YXNzIENlbGwgOiBwdWJsaWMgQ2FuTWFrZVdlYWtQdHI8Q2VsbD4geworICAgICAgICBXVEZfTUFL
RV9JU09fQUxMT0NBVEVEX0lOTElORShDZWxsKTsKKyAgICBwdWJsaWM6CisgICAgICAgIENlbGwo
Y29uc3QgQ29udGFpbmVyQm94JiwgU2xvdFBvc2l0aW9uLCBDZWxsU3Bhbik7CisKKyAgICAgICAg
c2l6ZV90IHN0YXJ0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbi5jb2x1bW47IH0K
KyAgICAgICAgc2l6ZV90IGVuZENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb24uY29s
dW1uICsgbV9zcGFuLmNvbHVtbjsgfQorCisgICAgICAgIHNpemVfdCBzdGFydFJvdygpIGNvbnN0
IHsgcmV0dXJuIG1fcG9zaXRpb24ucm93OyB9CisgICAgICAgIHNpemVfdCBlbmRSb3coKSBjb25z
dCB7IHJldHVybiBtX3Bvc2l0aW9uLnJvdyArIG1fc3Bhbi5yb3c7IH0KKworICAgICAgICBzaXpl
X3QgY29sdW1uU3BhbigpIGNvbnN0IHsgcmV0dXJuIG1fc3Bhbi5jb2x1bW47IH0KKyAgICAgICAg
c2l6ZV90IHJvd1NwYW4oKSBjb25zdCB7IHJldHVybiBtX3NwYW4ucm93OyB9CisKKyAgICAgICAg
U2xvdFBvc2l0aW9uIHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbjsgfQorICAg
ICAgICBDZWxsU3BhbiBzcGFuKCkgY29uc3QgeyByZXR1cm4gbV9zcGFuOyB9CisKKyAgICAgICAg
dm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKSB7IG1fYmFzZWxpbmUg
PSBiYXNlbGluZTsgfQorICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKCkgY29uc3Qg
eyByZXR1cm4gbV9iYXNlbGluZTsgfQorCisgICAgICAgIGJvb2wgaXNGaXhlZFdpZHRoKCkgY29u
c3Q7CisKKyAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25zdCB7IHJldHVybiAq
bV9sYXlvdXRCb3guZ2V0KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFdlYWtQdHI8Y29u
c3QgQ29udGFpbmVyQm94PiBtX2xheW91dEJveDsKKyAgICAgICAgU2xvdFBvc2l0aW9uIG1fcG9z
aXRpb247CisgICAgICAgIENlbGxTcGFuIG1fc3BhbjsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5p
dCBtX2Jhc2VsaW5lIHsgMCB9OworICAgIH07CisKKyAgICBjbGFzcyBTbG90IHsKKyAgICBwdWJs
aWM6CisgICAgICAgIFdURl9NQUtFX1NUUlVDVF9GQVNUX0FMTE9DQVRFRDsKKyAgICAgICAgU2xv
dCgpID0gZGVmYXVsdDsKKyAgICAgICAgU2xvdChDZWxsJiwgYm9vbCBpc0NvbHVtblNwYW5uZWQs
IGJvb2wgaXNSb3dTcGFubmVkKTsKKworICAgICAgICBjb25zdCBDZWxsJiBjZWxsKCkgY29uc3Qg
eyByZXR1cm4gKm1fY2VsbDsgfQorICAgICAgICBDZWxsJiBjZWxsKCkgeyByZXR1cm4gKm1fY2Vs
bDsgfQorCisgICAgICAgIGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzJiB3aWR0aENvbnN0cmFpbnRzKCkgY29uc3QgeyByZXR1cm4gbV93aWR0aENvbnN0
cmFpbnRzOyB9CisgICAgICAgIHZvaWQgc2V0V2lkdGhDb25zdHJhaW50cyhjb25zdCBGb3JtYXR0
aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgd2lkdGhDb25zdHJhaW50cykg
eyBtX3dpZHRoQ29uc3RyYWludHMgPSB3aWR0aENvbnN0cmFpbnRzOyB9CisKKyAgICAgICAgLy8g
SW5pdGlhbCBzbG90IHBvc2l0aW9uIGZvciBhIHNwYW5uaW5nIGNlbGwuCisgICAgICAgIC8vIDx0
ZD48L3RkPjx0ZCBjb2xzcGFuPTI+PC90ZD4gWzEsIDBdIHNsb3QgaGFzIGNvbHVtbiBzcGFuIG9m
IDIuCisgICAgICAgIGJvb2wgaGFzQ29sdW1uU3BhbigpIGNvbnN0IHsgcmV0dXJuIG1fY2VsbC0+
Y29sdW1uU3BhbigpID4gMSAmJiAhaXNDb2x1bW5TcGFubmVkKCk7IH0KKyAgICAgICAgYm9vbCBo
YXNSb3dTcGFuKCkgY29uc3QgeyByZXR1cm4gbV9jZWxsLT5yb3dTcGFuKCkgPiAxICYmICFpc1Jv
d1NwYW5uZWQoKTsgfQorCisgICAgICAgIC8vIE5vbi1pbml0aWFsIHNwYW5uZWQgc2xvdC4KKyAg
ICAgICAgLy8gPHRkPjwvdGQ+PHRkIGNvbHNwYW49Mj48L3RkPiBbMiwgMF0gc2xvdCBpcyBjb2x1
bW4gc3Bhbm5lZCBieSBbMSwgMF0uCisgICAgICAgIC8vIDx0ZD48L3RkPjx0ZD48L3RkPjx0ZD48
L3RkPgorICAgICAgICBib29sIGlzQ29sdW1uU3Bhbm5lZCgpIGNvbnN0IHsgcmV0dXJuIG1faXND
b2x1bW5TcGFubmVkOyB9CisgICAgICAgIGJvb2wgaXNSb3dTcGFubmVkKCkgY29uc3QgeyByZXR1
cm4gbV9pc1Jvd1NwYW5uZWQ7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFdlYWtQdHI8Q2Vs
bD4gbV9jZWxsOworICAgICAgICBib29sIG1faXNDb2x1bW5TcGFubmVkIHsgZmFsc2UgfTsKKyAg
ICAgICAgYm9vbCBtX2lzUm93U3Bhbm5lZCB7IGZhbHNlIH07CisgICAgICAgIEZvcm1hdHRpbmdD
b250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIG1fd2lkdGhDb25zdHJhaW50czsKKyAg
ICB9OworCisgICAgY29uc3QgQ29sdW1ucyYgY29sdW1ucygpIGNvbnN0IHsgcmV0dXJuIG1fY29s
dW1uczsgfQorICAgIENvbHVtbnMmIGNvbHVtbnMoKSB7IHJldHVybiBtX2NvbHVtbnM7IH0KKwor
ICAgIGNvbnN0IFJvd3MmIHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3M7IH0KKyAgICBSb3dz
JiByb3dzKCkgeyByZXR1cm4gbV9yb3dzOyB9CisKKyAgICB1c2luZyBDZWxscyA9IFdURjo6TGlz
dEhhc2hTZXQ8c3RkOjp1bmlxdWVfcHRyPENlbGw+PjsKKyAgICBDZWxscyYgY2VsbHMoKSB7IHJl
dHVybiBtX2NlbGxzOyB9CisKKyAgICBTbG90KiBzbG90KFNsb3RQb3NpdGlvbik7CisgICAgY29u
c3QgU2xvdCogc2xvdChTbG90UG9zaXRpb24gcG9zaXRpb24pIGNvbnN0IHsgcmV0dXJuIG1fc2xv
dE1hcC5nZXQocG9zaXRpb24pOyB9CisgICAgYm9vbCBpc1NwYW5uZWQoU2xvdFBvc2l0aW9uKTsK
KworcHJpdmF0ZToKKyAgICB1c2luZyBTbG90TWFwID0gV1RGOjpIYXNoTWFwPFNsb3RQb3NpdGlv
biwgc3RkOjp1bmlxdWVfcHRyPFNsb3Q+PjsKKworICAgIENvbHVtbnMgbV9jb2x1bW5zOworICAg
IFJvd3MgbV9yb3dzOworICAgIENlbGxzIG1fY2VsbHM7CisgICAgU2xvdE1hcCBtX3Nsb3RNYXA7
CisKKyAgICBMYXlvdXRVbml0IG1faG9yaXpvbnRhbFNwYWNpbmc7CisgICAgTGF5b3V0VW5pdCBt
X3ZlcnRpY2FsU3BhY2luZzsKKyAgICBPcHRpb25hbDxGb3JtYXR0aW5nQ29udGV4dDo6SW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cz4gbV9pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOworICAgIE9w
dGlvbmFsPEVkZ2VzPiBtX2NvbGxhcHNlZEJvcmRlcjsKK307CisKK30KK30KKworI2VuZGlmCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxl
Zm9ybWF0dGluZy9UYWJsZUxheW91dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUxheW91dC5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
MjMzNTJjNWExN2Y4YzBiM2QzZDI0NGU5MjVhN2VmMjQ4MTk4YThkMwotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0
aW5nL1RhYmxlTGF5b3V0LmNwcApAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNp
ZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkxheW91dEJv
eC5oIgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKK25hbWVzcGFjZSBMYXlvdXQgeworCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXRh
Ymxlcy0zLyN0YWJsZS1sYXlvdXQtYWxnb3JpdGhtCitUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpU
YWJsZUxheW91dDo6VGFibGVMYXlvdXQoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYgZm9y
bWF0dGluZ0NvbnRleHQsIGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkKKyAgICA6IG1fZm9ybWF0dGlu
Z0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHQpCisgICAgLCBtX2dyaWQoZ3JpZCkKK3sKK30KKwor
c3RydWN0IENvbHVtblNwYW4geworICAgIHN0YXRpYyBzaXplX3QgaGFzU3Bhbihjb25zdCBUYWJs
ZUdyaWQ6OlNsb3QmIHNsb3QpIHsgcmV0dXJuIHNsb3QuaGFzQ29sdW1uU3BhbigpOyB9CisgICAg
c3RhdGljIHNpemVfdCBpc1NwYW5uZWQoY29uc3QgVGFibGVHcmlkOjpTbG90JiBzbG90KSB7IHJl
dHVybiBzbG90LmlzQ29sdW1uU3Bhbm5lZCgpOyB9CisKKyAgICBzdGF0aWMgc2l6ZV90IHNwYW5D
b3VudChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJuIGNlbGwuY29sdW1uU3Bh
bigpOyB9CisgICAgc3RhdGljIHNpemVfdCBzdGFydFNwYW4oY29uc3QgVGFibGVHcmlkOjpDZWxs
JiBjZWxsKSB7IHJldHVybiBjZWxsLnN0YXJ0Q29sdW1uKCk7IH0KKyAgICBzdGF0aWMgc2l6ZV90
IGVuZFNwYW4oY29uc3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBjZWxsLmVuZENv
bHVtbigpOyB9CisKKyAgICBzdGF0aWMgc2l6ZV90IGluZGV4KHNpemVfdCBjb2x1bW5JbmRleCwg
c2l6ZV90IC8qcm93SW5kZXgqLykgeyByZXR1cm4gY29sdW1uSW5kZXg7IH0KKyAgICBzdGF0aWMg
c2l6ZV90IHNpemUoY29uc3QgVGFibGVHcmlkJiBncmlkKSB7IHJldHVybiBncmlkLmNvbHVtbnMo
KS5zaXplKCk7IH0KKworICAgIHN0YXRpYyBMYXlvdXRVbml0IHNwYWNpbmcoY29uc3QgVGFibGVH
cmlkJiBncmlkKSB7IHJldHVybiBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7IH0KK307CisKK3N0
cnVjdCBSb3dTcGFuIHsKKyAgICBzdGF0aWMgc2l6ZV90IGhhc1NwYW4oY29uc3QgVGFibGVHcmlk
OjpTbG90JiBzbG90KSB7IHJldHVybiBzbG90Lmhhc1Jvd1NwYW4oKTsgfQorICAgIHN0YXRpYyBz
aXplX3QgaXNTcGFubmVkKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCkgeyByZXR1cm4gc2xv
dC5pc1Jvd1NwYW5uZWQoKTsgfQorCisgICAgc3RhdGljIHNpemVfdCBzcGFuQ291bnQoY29uc3Qg
VGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBjZWxsLnJvd1NwYW4oKTsgfQorICAgIHN0
YXRpYyBzaXplX3Qgc3RhcnRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1
cm4gY2VsbC5zdGFydFJvdygpOyB9CisgICAgc3RhdGljIHNpemVfdCBlbmRTcGFuKGNvbnN0IFRh
YmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5lbmRSb3coKTsgfQorCisgICAgc3Rh
dGljIHNpemVfdCBpbmRleChzaXplX3QgLypjb2x1bW5JbmRleCovLCBzaXplX3Qgcm93SW5kZXgp
IHsgcmV0dXJuIHJvd0luZGV4OyB9CisgICAgc3RhdGljIHNpemVfdCBzaXplKGNvbnN0IFRhYmxl
R3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5yb3dzKCkuc2l6ZSgpOyB9CisKKyAgICBzdGF0aWMg
TGF5b3V0VW5pdCBzcGFjaW5nKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC52
ZXJ0aWNhbFNwYWNpbmcoKTsgfQorfTsKKworc3RydWN0IEdyaWRTcGFjZSB7CisgICAgYm9vbCBp
c0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIXZhbHVlOyB9CisKKyAgICAvLyBJbml0aWFsIHdpZHRo
L2hlaWdodCBmb3IgY29sdW1uL3JvdyB3ZSBzdGFydCB0aGUgZGlzdHJpYnV0aW9uIHdpZHRoICh1
c3VhbGx5IGEgbWludW11bSB3aWR0aCkuCisgICAgZmxvYXQgdmFsdWUgeyAwIH07CisgICAgLy8g
VGhlIGJhc2UgdG8gY29tcHV0ZSB0aGUgZGlzdHJpYnV0aW9uIHJhdGlvLiBJdCBub3JtYWxseSBt
YXRjaGVzIHRoZSBbdmFsdWVdIGJ1dCBpbiBzb21lIGNhc2VzIHdlIHVzZSB0aGUgbWF4aW11bSB2
YWx1ZSB0byBkaXN0cmlidXRlIHRoZSBleHRyYSBzcGFjZS4gCisgICAgZmxvYXQgZGlzdHJpYnV0
aW9uQmFzZSB7IDAgfTsKK307CisKK2lubGluZSBzdGF0aWMgR3JpZFNwYWNlIG1heChjb25zdCBH
cmlkU3BhY2UmIGEsIGNvbnN0IEdyaWRTcGFjZSYgYikKK3sKKyAgICByZXR1cm4geyBzdGQ6Om1h
eChhLnZhbHVlLCBiLnZhbHVlKSwgc3RkOjptYXgoYS5kaXN0cmlidXRpb25CYXNlLCBiLmRpc3Ry
aWJ1dGlvbkJhc2UpIH07Cit9CisKK2lubGluZSBzdGF0aWMgR3JpZFNwYWNlJiBvcGVyYXRvci0o
R3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCit7CisgICAgYS52YWx1ZSA9IHN0ZDo6
bWF4KDAuMGYsIGEudmFsdWUgLSBiLnZhbHVlKTsKKyAgICBhLmRpc3RyaWJ1dGlvbkJhc2UgPSBz
dGQ6Om1heCgwLjBmLCBhLmRpc3RyaWJ1dGlvbkJhc2UgLSBiLmRpc3RyaWJ1dGlvbkJhc2UpOwor
ICAgIHJldHVybiBhOworfQorCitpbmxpbmUgc3RhdGljIEdyaWRTcGFjZSYgb3BlcmF0b3IrPShH
cmlkU3BhY2UmIGEsIGNvbnN0IEdyaWRTcGFjZSYgYikKK3sKKyAgICBhLnZhbHVlICs9IGIudmFs
dWU7CisgICAgYS5kaXN0cmlidXRpb25CYXNlICs9IGIuZGlzdHJpYnV0aW9uQmFzZTsKKyAgICBy
ZXR1cm4gYTsKK30KKworaW5saW5lIHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJhdG9yLT0oR3JpZFNw
YWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCit7CisgICAgcmV0dXJuIGEgLSBiOworfQorCitp
bmxpbmUgc3RhdGljIEdyaWRTcGFjZSYgb3BlcmF0b3IvKEdyaWRTcGFjZSYgYSwgdW5zaWduZWQg
dmFsdWUpCit7CisgICAgYS52YWx1ZSAvPSB2YWx1ZTsKKyAgICBhLmRpc3RyaWJ1dGlvbkJhc2Ug
Lz0gdmFsdWU7CisgICAgcmV0dXJuIGE7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcGFuVHlw
ZT4KK3N0YXRpYyBWZWN0b3I8TGF5b3V0VW5pdD4gZGlzdHJpYnV0ZUF2YWlsYWJsZVNwYWNlKGNv
bnN0IFRhYmxlR3JpZCYgZ3JpZCwgTGF5b3V0VW5pdCBhdmFpbGFibGVTcGFjZSwgY29uc3QgV1RG
OjpGdW5jdGlvbjxHcmlkU3BhY2UoY29uc3QgVGFibGVHcmlkOjpTbG90Jiwgc2l6ZV90KT4mIHNs
b3RTcGFjZSkKK3sKKyAgICBzdHJ1Y3QgUmVzb2x2ZWRJdGVtIHsKKyAgICAgICAgR3JpZFNwYWNl
IHNsb3RTcGFjZTsKKyAgICAgICAgYm9vbCBpc0ZpeGVkIHsgZmFsc2UgfTsKKyAgICB9OworCisg
ICAgYXV0byYgY29sdW1ucyA9IGdyaWQuY29sdW1ucygpOworICAgIGF1dG8mIHJvd3MgPSBncmlk
LnJvd3MoKTsKKyAgICAvLyAxLiBDb2xsZWN0IHRoZSBub24tc3Bhbm5pbmcgc3BhY2VzIGZpcnN0
LiBUaGV5IGFyZSB1c2VkIGZvciB0aGUgZmluYWwgZGlzdHJpYnV0aW9uIGFzIHdlbGwgYXMgZm9y
IGRpc3RyaWJ1dGluZyB0aGUgc3Bhbm5pbmcgc3BhY2UuCisgICAgVmVjdG9yPE9wdGlvbmFsPFJl
c29sdmVkSXRlbT4+IHJlc29sdmVkSXRlbXMoU3BhblR5cGU6OnNpemUoZ3JpZCkpOworICAgIGZv
ciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1bW5zLnNpemUoKTsg
Kytjb2x1bW5JbmRleCkgeworICAgICAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0lu
ZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAgICAgICAgICAgIGF1dG8mIHNsb3Qg
PSAqZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0pOworICAgICAgICAgICAgaWYg
KFNwYW5UeXBlOjpoYXNTcGFuKHNsb3QpIHx8IFNwYW5UeXBlOjppc1NwYW5uZWQoc2xvdCkpCisg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhdXRvIGluZGV4ID0gU3BhblR5
cGU6OmluZGV4KGNvbHVtbkluZGV4LCByb3dJbmRleCk7CisgICAgICAgICAgICBpZiAoIXJlc29s
dmVkSXRlbXNbaW5kZXhdKQorICAgICAgICAgICAgICAgIHJlc29sdmVkSXRlbXNbaW5kZXhdID0g
UmVzb2x2ZWRJdGVtIHsgfTsKKyAgICAgICAgICAgIHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90
U3BhY2UgPSBtYXgocmVzb2x2ZWRJdGVtc1tpbmRleF0tPnNsb3RTcGFjZSwgc2xvdFNwYWNlKHNs
b3QsIGluZGV4KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAyLiBDb2xsZWN0IHRoZSBz
cGFubmluZyBjZWxscy4KKyAgICBzdHJ1Y3QgU3Bhbm5pbmdDZWxsIHsKKyAgICAgICAgU2xvdFBv
c2l0aW9uIHBvc2l0aW9uOworICAgICAgICBHcmlkU3BhY2UgdW5yZXNvbHZlZFNwYWNlOworICAg
IH07CisgICAgVmVjdG9yPFNwYW5uaW5nQ2VsbD4gc3Bhbm5pbmdDZWxsczsKKyAgICBmb3IgKHNp
emVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsK
KyAgICAgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IGNvbHVt
bnMuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBhdXRvJiBzbG90ID0gKmdy
aWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsKKyAgICAgICAgICAgIGlmIChTcGFu
VHlwZTo6aGFzU3BhbihzbG90KSkKKyAgICAgICAgICAgICAgICBzcGFubmluZ0NlbGxzLmFwcGVu
ZCh7IHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0sIHNsb3RTcGFjZShzbG90LCBTcGFuVHlwZTo6
aW5kZXgoY29sdW1uSW5kZXgsIHJvd0luZGV4KSkgfSk7CisgICAgICAgIH0KKyAgICB9CisgICAg
Ly8gV2UgbmVlZCB0aGVzZSBzcGFubmluZyBjZWxscyBpbiB0aGUgb3JkZXIgb2YgdGhlIG51bWJl
ciBvZiBjb2x1bW5zL3Jvd3MgdGhleSBzcGFuIHNvIHRoYXQKKyAgICAvLyB3ZSBjYW4gcmVzb2x2
ZSBvdmVybGFwcGluZyBzcGFucyBzdGFydGluZyB3aXRoIHRoZSBzaG9ydGVyIG9uZXMgZS5nLgor
ICAgIC8vIDx0ZCBjb2xzcGFuPTQ+I2E8L3RkPjx0ZD4jYjwvdGQ+CisgICAgLy8gPHRkIGNvbHNw
YW49Mj4jYzwvdGQ+PHRkIGNvbHNwYW49Mz4jZDwvdGQ+CisgICAgc3RkOjpzb3J0KHNwYW5uaW5n
Q2VsbHMuYmVnaW4oKSwgc3Bhbm5pbmdDZWxscy5lbmQoKSwgWyZdIChhdXRvJiBhLCBhdXRvJiBi
KSB7CisgICAgICAgIHJldHVybiBTcGFuVHlwZTo6c3BhbkNvdW50KGdyaWQuc2xvdChhLnBvc2l0
aW9uKS0+Y2VsbCgpKSA8IFNwYW5UeXBlOjpzcGFuQ291bnQoZ3JpZC5zbG90KGIucG9zaXRpb24p
LT5jZWxsKCkpOworICAgIH0pOworCisgICAgLy8gMy4gRGlzdHJpYnV0ZSB0aGUgc3Bhbm5pbmcg
Y2VsbHMnIG1pbWltdW0gc3BhY2UgYWNyb3NzIHRoZSBjb2x1bW5zL3Jvd3MgdXNpbmcgdGhlIG5v
bi1zcGFubmluZyBzcGFjZXMuCisgICAgLy8gZS5nLiBbIDEgXVsgNSBdWyAxIF0KKyAgICAvLyAg
ICAgIFsgICAgOSAgIF1bIDEgXQorICAgIC8vIFRoZSBpbml0aWFsIHdpZHRocyBhcmU6IFsgMiBd
WyA3IF1bIDEgXQorICAgIGZvciAoYXV0byBzcGFubmluZ0NlbGwgOiBzcGFubmluZ0NlbGxzKSB7
CisgICAgICAgIGF1dG8mIGNlbGwgPSBncmlkLnNsb3Qoc3Bhbm5pbmdDZWxsLnBvc2l0aW9uKS0+
Y2VsbCgpOworICAgICAgICBhdXRvIHVucmVzb2x2ZWRTcGFubmluZ1NwYWNlID0gc3Bhbm5pbmdD
ZWxsLnVucmVzb2x2ZWRTcGFjZTsKKyAgICAgICAgaWYgKCFyZXNvbHZlZEl0ZW1zW1NwYW5UeXBl
OjpzdGFydFNwYW4oY2VsbCldIHx8ICFyZXNvbHZlZEl0ZW1zW1NwYW5UeXBlOjplbmRTcGFuKGNl
bGwpIC0gMV0pIHsKKyAgICAgICAgICAgIC8vIDx0ZCBjb2xzcGFuPTQ+I2E8L3RkPjx0ZD4jYjwv
dGQ+CisgICAgICAgICAgICAvLyA8dGQgY29sc3Bhbj0yPiNjPC90ZD48dGQgY29sc3Bhbj0zPiNk
PC90ZD4KKyAgICAgICAgICAgIC8vIFVucmVzb2x2ZWQgY29sdW1ucyBhcmU6IDEgMiAzIDQKKyAg
ICAgICAgICAgIC8vIDEuIFRha2UgY29sc3Bhbj0yIChzaG9ydGVzdCBzcGFuKSBhbmQgcmVzb2x2
ZSBjb2x1bW4gMSBhbmQgMgorICAgICAgICAgICAgLy8gMi4gVGFrZSBjb2xzcGFuPTMgYW5kIHJl
c29sdmUgY29sdW1uIDMgYW5kIDQgKDUgaXMgcmVzb2x2ZWQgYmVjYXVzZSBpdCBhbHJlYWR5IGhh
cyBhIG5vbi1zcGFubmluZyBjZWxsKS4KKyAgICAgICAgICAgIC8vIDMuIGNvbHNwYW49NCBuZWVk
cyBubyByZXNvbHZpbmcgYmVjYXVzZSBhbGwgdGhlIHNwYW5uZWQgY29sdW1ucyAoMSAyIDMgNCkg
aGF2ZSBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuCisgICAgICAgICAgICBhdXRvIHVucmVzb2x2ZWRD
b2x1bW5Db3VudCA9IGNlbGwuY29sdW1uU3BhbigpOworICAgICAgICAgICAgZm9yIChhdXRvIHNw
YW5JbmRleCA9IFNwYW5UeXBlOjpzdGFydFNwYW4oY2VsbCk7IHNwYW5JbmRleCA8IFNwYW5UeXBl
OjplbmRTcGFuKGNlbGwpOyArK3NwYW5JbmRleCkgeworICAgICAgICAgICAgICAgIGlmICghcmVz
b2x2ZWRJdGVtc1tzcGFuSW5kZXhdKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgICAgICAgICBBU1NFUlQodW5yZXNvbHZlZENvbHVtbkNvdW50KTsKKyAgICAgICAgICAg
ICAgICAtLXVucmVzb2x2ZWRDb2x1bW5Db3VudDsKKyAgICAgICAgICAgICAgICB1bnJlc29sdmVk
U3Bhbm5pbmdTcGFjZSAtPSByZXNvbHZlZEl0ZW1zW3NwYW5JbmRleF0tPnNsb3RTcGFjZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVCh1bnJlc29sdmVkQ29sdW1uQ291bnQpOwor
ICAgICAgICAgICAgYXV0byBlcXVhbFNwYWNlRm9yU3Bhbm5lZENvbHVtbnMgPSB1bnJlc29sdmVk
U3Bhbm5pbmdTcGFjZSAvIHVucmVzb2x2ZWRDb2x1bW5Db3VudDsKKyAgICAgICAgICAgIGZvciAo
YXV0byBzcGFuSW5kZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpOyBzcGFuSW5kZXggPCBT
cGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBp
ZiAocmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdKQorICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1zW3NwYW5JbmRleF0gPSBSZXNvbHZlZEl0
ZW0geyBlcXVhbFNwYWNlRm9yU3Bhbm5lZENvbHVtbnMsIGZhbHNlIH07CisgICAgICAgICAgICB9
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyAxLiBDb2xsZWN0IHRoZSBub24tc3Bh
bmluZyByZXNvbHZlZCBzcGFjZXMuCisgICAgICAgICAgICAvLyAyLiBEaXN0cmlidXRlIHRoZSBl
eHRyYSBzcGFjZSBhbW9uZyB0aGUgc3Bhbm5lZCBjb2x1bW5zL3Jvd3MgYmFzZWQgb24gdGhlIHJl
c29sdmVkIHNwYWNlIHZhbHVlcy4KKyAgICAgICAgICAgIC8vIGUuZy4gc3Bhbm5pbmcgd2lkdGg6
IFsgICA5ICAgXS4gUmVzb2x2ZWQgd2lkdGhzIGZvciB0aGUgc3Bhbm5lZCBjb2x1bW5zOiBbIDEg
XSBbIDIgXQorICAgICAgICAgICAgLy8gTmV3IHJlc29sdmVkIHdpZHRoczogWyAzIF0gWyA2IF0u
CisgICAgICAgICAgICBhdXRvIHJlc29sdmVkU3Bhbm5pbmdTcGFjZSA9IEdyaWRTcGFjZSB7IH07
CisgICAgICAgICAgICBmb3IgKGF1dG8gc3BhbkluZGV4ID0gU3BhblR5cGU6OnN0YXJ0U3Bhbihj
ZWxsKTsgc3BhbkluZGV4IDwgU3BhblR5cGU6OmVuZFNwYW4oY2VsbCk7ICsrc3BhbkluZGV4KQor
ICAgICAgICAgICAgICAgIHJlc29sdmVkU3Bhbm5pbmdTcGFjZSArPSByZXNvbHZlZEl0ZW1zW3Nw
YW5JbmRleF0tPnNsb3RTcGFjZTsKKyAgICAgICAgICAgIGlmIChyZXNvbHZlZFNwYW5uaW5nU3Bh
Y2UudmFsdWUgPj0gdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UudmFsdWUpIHsKKyAgICAgICAgICAg
ICAgICAvLyBUaGUgc3Bhbm5pbmcgY2VsbCBmaXRzIHRoZSBzcGFubmVkIGNvbHVtbnMvcm93cyBq
dXN0IGZpbmUuIE5vdGhpbmcgdG8gZGlzdHJpYnV0ZS4KKyAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gc3BhY2luZyA9IFNwYW5UeXBlOjpz
cGFjaW5nKGdyaWQpICogKFNwYW5UeXBlOjpzcGFuQ291bnQoY2VsbCkgLSAxKTsKKyAgICAgICAg
ICAgIGF1dG8gc3BhY2VUb0Rpc3RyaWJ1dGUgPSB1bnJlc29sdmVkU3Bhbm5pbmdTcGFjZSAtIEdy
aWRTcGFjZSB7IHNwYWNpbmcsIHNwYWNpbmcgfSAtIHJlc29sdmVkU3Bhbm5pbmdTcGFjZTsgCisg
ICAgICAgICAgICBpZiAoIXNwYWNlVG9EaXN0cmlidXRlLmlzRW1wdHkoKSkgeworICAgICAgICAg
ICAgICAgIGF1dG8gZGlzdHJpYnV0aW9uUmF0aW8gPSBzcGFjZVRvRGlzdHJpYnV0ZS5kaXN0cmli
dXRpb25CYXNlIC8gcmVzb2x2ZWRTcGFubmluZ1NwYWNlLmRpc3RyaWJ1dGlvbkJhc2U7CisgICAg
ICAgICAgICAgICAgZm9yIChhdXRvIHNwYW5JbmRleCA9IFNwYW5UeXBlOjpzdGFydFNwYW4oY2Vs
bCk7IHNwYW5JbmRleCA8IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwpOyArK3NwYW5JbmRleCkKKyAg
ICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2UgKz0g
R3JpZFNwYWNlIHsgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2UudmFsdWUgKiBk
aXN0cmlidXRpb25SYXRpbywgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2UuZGlz
dHJpYnV0aW9uQmFzZSAqIGRpc3RyaWJ1dGlvblJhdGlvfTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0KKyAgICAvLyA0LiBEaXN0cmlidXRlIHRoZSBleHRyYSBzcGFjZSB1c2luZyB0
aGUgZmluYWwgcmVzb2x2ZWQgd2lkdGhzLgorI2lmIEFTU0VSVF9FTkFCTEVECisgICAgLy8gV2Ug
aGF2ZSB0byBoYXZlIGFsbCB0aGUgc3BhY2VzIHJlc29sdmVkIGF0IHRoaXMgcG9pbnQuCisgICAg
Zm9yIChhdXRvJiByZXNvbHZlZEl0ZW0gOiByZXNvbHZlZEl0ZW1zKQorICAgICAgICBBU1NFUlQo
cmVzb2x2ZWRJdGVtKTsKKyNlbmRpZgorICAgIC8vIEZpeGVkIHNpemUgY2VsbHMgZG9uJ3QgcGFy
dGljaXBhdGUgaW4gYXZhaWxhYmxlIHNwYWNlIGRpc3RyaWJ1dGlvbi4KKyAgICBhdXRvIGFkanVz
dGFibGVkU3BhY2UgPSBHcmlkU3BhY2UgeyB9OworICAgIGZvciAoYXV0byYgcmVzb2x2ZWRJdGVt
IDogcmVzb2x2ZWRJdGVtcykgeworICAgICAgICBpZiAocmVzb2x2ZWRJdGVtLT5pc0ZpeGVkKQor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGFkanVzdGFibGVkU3BhY2UgKz0gcmVzb2x2
ZWRJdGVtLT5zbG90U3BhY2U7CisgICAgfQorCisgICAgVmVjdG9yPExheW91dFVuaXQ+IGRpc3Ry
aWJ1dGVkU3BhY2VzKHJlc29sdmVkSXRlbXMuc2l6ZSgpKTsKKyAgICBmbG9hdCBzcGFjZVRvRGlz
dHJpYnV0ZSA9IGF2YWlsYWJsZVNwYWNlIC0gYWRqdXN0YWJsZWRTcGFjZS52YWx1ZSAtICgocmVz
b2x2ZWRJdGVtcy5zaXplKCkgKyAxKSAqIFNwYW5UeXBlOjpzcGFjaW5nKGdyaWQpKTsKKyAgICAv
LyBFc3NlbnRpYWxseSB0aGUgcmVtYWluaW5nIHNwYWNlIHRvIGRpc3RyaWJ1dGUgc2hvdWxkIG5l
dmVyIGJlIG5lZ2F0aXZlLiBMYXlvdXRVbml0OjplcHNpbG9uKCkgaXMgcmVxdWlyZWQgdG8gY29t
cGVuc2F0ZSBmb3IgTGF5b3V0VW5pdCdzIGxvdyBwcmVjaXNpb24uCisgICAgQVNTRVJUKHNwYWNl
VG9EaXN0cmlidXRlID49IC1MYXlvdXRVbml0OjplcHNpbG9uKCkgKiByZXNvbHZlZEl0ZW1zLnNp
emUoKSk7CisgICAgLy8gRGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UgYmFzZWQgb24gdGhlIHJl
c29sdmVkIHNwYWNlcy4KKyAgICBhdXRvIGRpc3RyaWJ1dGlvblJhdGlvID0gc3BhY2VUb0Rpc3Ry
aWJ1dGUgLyBhZGp1c3RhYmxlZFNwYWNlLmRpc3RyaWJ1dGlvbkJhc2U7CisgICAgZm9yIChzaXpl
X3QgaW5kZXggPSAwOyBpbmRleCA8IHJlc29sdmVkSXRlbXMuc2l6ZSgpOyArK2luZGV4KSB7Cisg
ICAgICAgIGF1dG8gc2xvdFNwYWNlID0gcmVzb2x2ZWRJdGVtc1tpbmRleF0tPnNsb3RTcGFjZS52
YWx1ZTsKKyAgICAgICAgYXV0byBuZWVkc1NwYWNlRGlzdHJpYnV0aW9uID0gc3BhY2VUb0Rpc3Ry
aWJ1dGUgJiYgIXJlc29sdmVkSXRlbXNbaW5kZXhdLT5pc0ZpeGVkOworICAgICAgICBkaXN0cmli
dXRlZFNwYWNlc1tpbmRleF0gPSBMYXlvdXRVbml0IHsgc2xvdFNwYWNlIH07CisgICAgICAgIGlm
ICghbmVlZHNTcGFjZURpc3RyaWJ1dGlvbikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICBkaXN0cmlidXRlZFNwYWNlc1tpbmRleF0gKz0gTGF5b3V0VW5pdCB7IHJlc29sdmVkSXRlbXNb
aW5kZXhdLT5zbG90U3BhY2UuZGlzdHJpYnV0aW9uQmFzZSAqIGRpc3RyaWJ1dGlvblJhdGlvIH07
CisgICAgfQorICAgIHJldHVybiBkaXN0cmlidXRlZFNwYWNlczsKK30KKworVGFibGVGb3JtYXR0
aW5nQ29udGV4dDo6VGFibGVMYXlvdXQ6OkRpc3RyaWJ1dGVkU3BhY2VzIFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQ6OlRhYmxlTGF5b3V0OjpkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZShMYXlvdXRV
bml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSkKK3sKKyAgICBlbnVtIGNsYXNzIENvbHVtbldp
ZHRoQmFsYW5jaW5nQmFzZSB7IE1pbmltdW1XaWR0aCwgTWF4aW11bVdpZHRoIH07CisgICAgYXV0
byBjb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UgPSBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UgPj0g
bV9ncmlkLndpZHRoQ29uc3RyYWludHMoKS0+bWF4aW11bSA/IENvbHVtbldpZHRoQmFsYW5jaW5n
QmFzZTo6TWF4aW11bVdpZHRoIDogQ29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlOjpNaW5pbXVtV2lk
dGg7CisgICAgcmV0dXJuIGRpc3RyaWJ1dGVBdmFpbGFibGVTcGFjZTxDb2x1bW5TcGFuPihtX2dy
aWQsIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSwgWyZdIChjb25zdCBUYWJsZUdyaWQ6OlNsb3Qm
IHNsb3QsIHNpemVfdCBjb2x1bW5JbmRleCkgeworICAgICAgICBhdXRvJiBjb2x1bW4gPSBtX2dy
aWQuY29sdW1ucygpLmxpc3QoKVtjb2x1bW5JbmRleF07CisgICAgICAgIGF1dG8gY29sdW1uQm94
Rml4ZWRXaWR0aCA9IGNvbHVtbi5ib3goKSA/IGNvbHVtbi5ib3goKS0+Y29sdW1uV2lkdGgoKS52
YWx1ZU9yKDBfbHUpIDogMF9sdTsKKyAgICAgICAgYXV0byBtaW5pbXVtV2lkdGggPSBzdGQ6Om1h
eDxmbG9hdD4oc2xvdC53aWR0aENvbnN0cmFpbnRzKCkubWluaW11bSwgY29sdW1uQm94Rml4ZWRX
aWR0aCk7CisgICAgICAgIGF1dG8gbWF4aW11bVdpZHRoID0gc3RkOjptYXg8ZmxvYXQ+KHNsb3Qu
d2lkdGhDb25zdHJhaW50cygpLm1heGltdW0sIGNvbHVtbkJveEZpeGVkV2lkdGgpOworCisgICAg
ICAgIGlmIChjb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UgPT0gQ29sdW1uV2lkdGhCYWxhbmNpbmdC
YXNlOjpNaW5pbXVtV2lkdGgpIHsKKyAgICAgICAgICAgIEFTU0VSVChtYXhpbXVtV2lkdGggPj0g
bWluaW11bVdpZHRoKTsKKyAgICAgICAgICAgIHJldHVybiBHcmlkU3BhY2UgeyBtaW5pbXVtV2lk
dGgsIG1heGltdW1XaWR0aCAtIG1pbmltdW1XaWR0aCB9OworICAgICAgICB9CisgICAgICAgIC8v
IFdoZW4gdGhlIGNvbHVtbiBoYXMgYSBmaXhlZCB3aWR0aCBjZWxsLCB0aGUgbWF4aW11bSB3aWR0
aCBiYWxhbmNpbmcgaXMgYmFzZWQgb24gdGhlIG1pbmltdW0gd2lkdGguCisgICAgICAgIGlmIChj
b2x1bW4uaXNGaXhlZFdpZHRoKCkpCisgICAgICAgICAgICByZXR1cm4gR3JpZFNwYWNlIHsgbWlu
aW11bVdpZHRoLCBtYXhpbXVtV2lkdGggfTsKKyAgICAgICAgcmV0dXJuIEdyaWRTcGFjZSB7IG1h
eGltdW1XaWR0aCwgbWF4aW11bVdpZHRoIH07CisgICAgfSk7Cit9CisKK1RhYmxlRm9ybWF0dGlu
Z0NvbnRleHQ6OlRhYmxlTGF5b3V0OjpEaXN0cmlidXRlZFNwYWNlcyBUYWJsZUZvcm1hdHRpbmdD
b250ZXh0OjpUYWJsZUxheW91dDo6ZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNlKE9wdGlvbmFsPExh
eW91dFVuaXQ+IGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpCit7CisgICAgYXV0byYgcm93cyA9IG1f
Z3JpZC5yb3dzKCk7CisgICAgYXV0byYgY29sdW1ucyA9IG1fZ3JpZC5jb2x1bW5zKCk7CisKKyAg
ICBWZWN0b3I8TGF5b3V0VW5pdD4gcm93SGVpZ2h0KHJvd3Muc2l6ZSgpKTsKKyAgICBhdXRvIHRh
YmxlVXNlZEhlaWdodCA9IExheW91dFVuaXQgeyB9OworICAgIC8vIDIuIENvbGxlY3QgaW5pdGlh
bCwgYmFzZWxpbmUgYWxpZ25lZCByb3cgaGVpZ2h0cy4KKyAgICBmb3IgKHNpemVfdCByb3dJbmRl
eCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAgICAgICAgYXV0
byBtYXhpbXVtQ29sdW1uQXNjZW50ID0gSW5saW5lTGF5b3V0VW5pdCB7IH07CisgICAgICAgIGF1
dG8gbWF4aW11bUNvbHVtbkRlc2NlbnQgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKKyAgICAgICAg
Ly8gSW5pdGlhbCBtaW5pbXVtIGhlaWdodCBpcyB0aGUgY29tcHV0ZWQgaGVpZ2h0IGlmIGF2YWls
YWJsZSA8dHIgc3R5bGU9ImhlaWdodDogMTAwcHgiPjx0ZD48L3RkPjwvdHI+CisgICAgICAgIHJv
d0hlaWdodFtyb3dJbmRleF0gPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCkuY29tcHV0
ZWRIZWlnaHQocm93cy5saXN0KClbcm93SW5kZXhdLmJveCgpLCBhdmFpbGFibGVWZXJ0aWNhbFNw
YWNlKS52YWx1ZU9yKDBfbHUpOworICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7
IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29sdW1uSW5kZXgpIHsKKyAgICAgICAg
ICAgIGF1dG8mIHNsb3QgPSAqbV9ncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7
CisgICAgICAgICAgICBpZiAoc2xvdC5pc1Jvd1NwYW5uZWQoKSkKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIGlmIChzbG90Lmhhc1Jvd1NwYW4oKSkKKyAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIFRoZSBtaW5pbXVtIGhlaWdodCBvZiBhIHJv
dyAod2l0aG91dCBzcGFubmluZy1yZWxhdGVkIGhlaWdodCBkaXN0cmlidXRpb24pIGlzIGRlZmlu
ZWQgYXMgdGhlIGhlaWdodCBvZiBhbiBoeXBvdGhldGljYWwKKyAgICAgICAgICAgIC8vIGxpbmVi
b3ggY29udGFpbmluZyB0aGUgY2VsbHMgb3JpZ2luYXRpbmcgaW4gdGhlIHJvdy4KKyAgICAgICAg
ICAgIGF1dG8mIGNlbGwgPSBzbG90LmNlbGwoKTsKKyAgICAgICAgICAgIGF1dG8mIGNlbGxCb3gg
PSBjZWxsLmJveCgpOworICAgICAgICAgICAgYXV0byBoZWlnaHQgPSBmb3JtYXR0aW5nQ29udGV4
dCgpLmdlb21ldHJ5Rm9yQm94KGNlbGxCb3gpLmJvcmRlckJveEhlaWdodCgpOworICAgICAgICAg
ICAgaWYgKGNlbGxCb3guc3R5bGUoKS52ZXJ0aWNhbEFsaWduKCkgPT0gVmVydGljYWxBbGlnbjo6
QmFzZWxpbmUpIHsKKyAgICAgICAgICAgICAgICBtYXhpbXVtQ29sdW1uQXNjZW50ID0gc3RkOjpt
YXgobWF4aW11bUNvbHVtbkFzY2VudCwgY2VsbC5iYXNlbGluZSgpKTsKKyAgICAgICAgICAgICAg
ICBtYXhpbXVtQ29sdW1uRGVzY2VudCA9IHN0ZDo6bWF4KG1heGltdW1Db2x1bW5EZXNjZW50LCBo
ZWlnaHQgLSBjZWxsLmJhc2VsaW5lKCkpOworICAgICAgICAgICAgICAgIHJvd0hlaWdodFtyb3dJ
bmRleF0gPSBzdGQ6Om1heChyb3dIZWlnaHRbcm93SW5kZXhdLCBMYXlvdXRVbml0IHsgbWF4aW11
bUNvbHVtbkFzY2VudCArIG1heGltdW1Db2x1bW5EZXNjZW50IH0pOworICAgICAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICAgICAgcm93SGVpZ2h0W3Jvd0luZGV4XSA9IHN0ZDo6bWF4KHJvd0hl
aWdodFtyb3dJbmRleF0sIGhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgdGFibGVVc2VkSGVp
Z2h0ICs9IHJvd0hlaWdodFtyb3dJbmRleF07CisgICAgfQorICAgIC8vIEZJWE1FOiBDb2xsZWN0
IHNwYW5uaW5nIHJvdyBtYXhpbXVtIGhlaWdodHMuCisKKyAgICB0YWJsZVVzZWRIZWlnaHQgKz0g
KHJvd3Muc2l6ZSgpICsgMSkgKiBtX2dyaWQudmVydGljYWxTcGFjaW5nKCk7CisgICAgYXV0byBh
dmFpbGFibGVTcGFjZSA9IHN0ZDo6bWF4KGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UudmFsdWVPcigw
X2x1KSwgdGFibGVVc2VkSGVpZ2h0KTsKKyAgICAvLyBEaXN0cmlidXRlIGV4dHJhIHNwYWNlIGlm
IHRoZSB0YWJsZSBpcyBzdXBwb3NlZCB0byBiZSB0YWxsZXIgdGhhbiB0aGUgc3VtIG9mIHRoZSBy
b3cgaGVpZ2h0cy4KKyAgICByZXR1cm4gZGlzdHJpYnV0ZUF2YWlsYWJsZVNwYWNlPFJvd1NwYW4+
KG1fZ3JpZCwgYXZhaWxhYmxlU3BhY2UsIFsmXSAoY29uc3QgVGFibGVHcmlkOjpTbG90JiBzbG90
LCBzaXplX3Qgcm93SW5kZXgpIHsKKyAgICAgICAgaWYgKHNsb3QuaGFzUm93U3BhbigpKQorICAg
ICAgICAgICAgcmV0dXJuIEdyaWRTcGFjZSB7IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlG
b3JCb3goc2xvdC5jZWxsKCkuYm94KCkpLmJvcmRlckJveEhlaWdodCgpLCBmb3JtYXR0aW5nQ29u
dGV4dCgpLmdlb21ldHJ5Rm9yQm94KHNsb3QuY2VsbCgpLmJveCgpKS5ib3JkZXJCb3hIZWlnaHQo
KSB9OworICAgICAgICBhdXRvJiByb3dzID0gbV9ncmlkLnJvd3MoKTsKKyAgICAgICAgYXV0byBj
b21wdXRlZFJvd0hlaWdodCA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnkoKS5jb21wdXRl
ZEhlaWdodChyb3dzLmxpc3QoKVtyb3dJbmRleF0uYm94KCksIHsgfSk7CisgICAgICAgIGF1dG8g
aGVpZ2h0ID0gc3RkOjptYXg8ZmxvYXQ+KHJvd0hlaWdodFtyb3dJbmRleF0sIGNvbXB1dGVkUm93
SGVpZ2h0LnZhbHVlT3IoMF9sdSkpOworICAgICAgICByZXR1cm4gR3JpZFNwYWNlIHsgaGVpZ2h0
LCBoZWlnaHQgfTsKKyAgICB9KTsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2Vy
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRl
bnRCcmVha2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwYTZkYTlmOWMx
NGYwMTQ0NTFmYWRhMjQ2ZmIwZWJjZDEyZDJiOC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVDb250ZW50QnJlYWtlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MzEgKzAsMCBA
QAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJJbmxpbmVDb250
ZW50QnJlYWtlci5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0K
LSNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgotI2luY2x1ZGUgIkh5cGhlbmF0aW9uLmgiCi0jaW5j
bHVkZSAiSW5saW5lSXRlbS5oIgotI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgiCi0jaW5jbHVk
ZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCi0jaW5jbHVkZSAiVGV4dFV0aWwuaCIKLQotbmFtZXNw
YWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLQotI2lmIEFTU0VSVF9FTkFCTEVE
Ci1zdGF0aWMgaW5saW5lIGJvb2wgaGFzVHJhaWxpbmdUZXh0Q29udGVudChjb25zdCBJbmxpbmVD
b250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250ZW50KQotewot
ICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShjb250aW51b3VzQ29u
dGVudC5ydW5zKCkpKSB7Ci0gICAgICAgIGF1dG8mIGlubGluZUl0ZW0gPSBydW4uaW5saW5lSXRl
bTsKLSAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpIHx8IGlubGluZUl0
ZW0uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICByZXR1
cm4gaW5saW5lSXRlbS5pc1RleHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotI2Vu
ZGlmCi0KLXN0YXRpYyBpbmxpbmUgYm9vbCBoYXNMZWFkaW5nVGV4dENvbnRlbnQoY29uc3QgSW5s
aW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkK
LXsKLSAgICBmb3IgKGF1dG8mIHJ1biA6IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKSkgewotICAg
ICAgICBhdXRvJiBpbmxpbmVJdGVtID0gcnVuLmlubGluZUl0ZW07Ci0gICAgICAgIGlmIChpbmxp
bmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkp
Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcmV0dXJuIGlubGluZUl0ZW0uaXNUZXh0
KCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGhh
c1RleHRSdW4oY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50JiBj
b250aW51b3VzQ29udGVudCkKLXsKLSAgICAvLyA8c3Bhbj50ZXh0PC9zcGFuPiBpcyBjb25zaWRl
cmVkIGEgdGV4dCBydW4gZXZlbiB3aXRoIHRoZSBbaW5saW5lIGJveCBzdGFydF1baW5saW5lIGJv
eCBlbmRdIGlubGluZSBpdGVtcy4KLSAgICAvLyBCYXNlZCBvbiBzdGFuZGFyZHMgY29tbWl0IGJv
dW5kYXJ5IHJ1bGVzIGl0IHdvdWxkIGJlIGVub3VnaCB0byBjaGVjayB0aGUgZmlyc3QgaW5saW5l
IGl0ZW0sIGJ1dCBkdWUgdG8gdGhlIHRhYmxlIHF1aXJrLCB3ZSBjYW4gaGF2ZQotICAgIC8vIGlt
YWdlIGFuZCB0ZXh0IG5leHQgdG8gZWFjaCBvdGhlciBpbnNpZGUgYSBjb250aW51b3VzIHNldCBv
ZiBydW5zIChzZWUgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6aGFzU29mdFdyYXBP
cHBvcnR1bml0eUF0SW1hZ2UpLgotICAgIGZvciAoYXV0byYgcnVuIDogY29udGludW91c0NvbnRl
bnQucnVucygpKSB7Ci0gICAgICAgIGlmIChydW4uaW5saW5lSXRlbS5pc1RleHQoKSkKLSAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRp
YyBpbmxpbmUgYm9vbCBpc1Zpc3VhbGx5RW1wdHlXaGl0ZXNwYWNlQ29udGVudChjb25zdCBJbmxp
bmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250ZW50KQot
ewotICAgIC8vIFs8c3Bhbj48L3NwYW4+IF0gWzxzcGFuPiA8L3NwYW4+XSBbIDxzcGFuIHN0eWxl
PSJwYWRkaW5nOiAwcHg7Ij48L3NwYW4+XSBhcmUgYWxsIGNvbnNpZGVyZWQgdmlzdWFsbHkgZW1w
dHkgd2hpdGVzcGFjZSBjb250ZW50LgotICAgIC8vIFs8c3BhbiBzdHlsZT0iYm9yZGVyOiAxcHgg
c29saWQgcmVkIj48L3NwYW4+IF0gd2hpbGUgdGhpcyBpcyB3aGl0ZXNwYWNlIGNvbnRlbnQgb25s
eSwgaXQgaXMgbm90IGNvbnNpZGVyZWQgdmlzdWFsbHkgZW1wdHkuCi0gICAgLy8gRHVlIHRvIGNv
bW1pdCBib3VuZGFyeSBydWxlcywgd2UganVzdCBuZWVkIHRvIGNoZWNrIHRoZSBmaXJzdCBub24t
dHlwZWxlc3MgaW5saW5lIGl0ZW0gKGNhbid0IGhhdmUgYm90aCBbaW1nXSBhbmQgW3RleHRdKQot
ICAgIGZvciAoYXV0byYgcnVuIDogY29udGludW91c0NvbnRlbnQucnVucygpKSB7Ci0gICAgICAg
IGF1dG8mIGlubGluZUl0ZW0gPSBydW4uaW5saW5lSXRlbTsKLSAgICAgICAgLy8gRklYTUU6IGNo
ZWNrIGZvciBwYWRkaW5nIGJvcmRlciBldGMuCi0gICAgICAgIGlmIChpbmxpbmVJdGVtLmlzSW5s
aW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpCi0gICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgcmV0dXJuIGlubGluZUl0ZW0uaXNUZXh0KCkgJiYgZG93bmNh
c3Q8SW5saW5lVGV4dEl0ZW0+KGlubGluZUl0ZW0pLmlzV2hpdGVzcGFjZSgpOwotICAgIH0KLSAg
ICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc05vbkNvbnRlbnRSdW5z
T25seShjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQmIGNvbnRp
bnVvdXNDb250ZW50KQotewotICAgIC8vIDxzcGFuPjwvc3Bhbj4gPC0gbm9uIGNvbnRlbnQgcnVu
cy4KLSAgICBmb3IgKGF1dG8mIHJ1biA6IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKSkgewotICAg
ICAgICBhdXRvJiBpbmxpbmVJdGVtID0gcnVuLmlubGluZUl0ZW07Ci0gICAgICAgIGlmIChpbmxp
bmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkp
Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSBPcHRpb25hbDxzaXplX3Q+IGZpcnN0
VGV4dFJ1bkluZGV4KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVu
dCYgY29udGludW91c0NvbnRlbnQpCi17Ci0gICAgYXV0byYgcnVucyA9IGNvbnRpbnVvdXNDb250
ZW50LnJ1bnMoKTsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcnVucy5zaXpl
KCk7ICsraW5kZXgpIHsKLSAgICAgICAgaWYgKHJ1bnNbaW5kZXhdLmlubGluZUl0ZW0uaXNUZXh0
KCkpCi0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIHJldHVybiB7IH07Ci19
Ci0KLWJvb2wgSW5saW5lQ29udGVudEJyZWFrZXI6OmlzV3JhcHBpbmdBbGxvd2VkKGNvbnN0IElu
bGluZUl0ZW0mIGlubGluZUl0ZW0pCi17Ci0gICAgYXV0byYgc3R5bGVUb1VzZSA9IGlubGluZUl0
ZW0uaXNCb3goKSA/IGlubGluZUl0ZW0ubGF5b3V0Qm94KCkucGFyZW50KCkuc3R5bGUoKSA6IGlu
bGluZUl0ZW0ubGF5b3V0Qm94KCkuc3R5bGUoKTsgCi0gICAgLy8gRG8gbm90IHRyeSB0byB3cmFw
IG92ZXJmbG93biAncHJlJyBhbmQgJ25vLXdyYXAnIGNvbnRlbnQgdG8gbmV4dCBsaW5lLgotICAg
IHJldHVybiBzdHlsZVRvVXNlLndoaXRlU3BhY2UoKSAhPSBXaGl0ZVNwYWNlOjpQcmUgJiYgc3R5
bGVUb1VzZS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6Tm9XcmFwOwotfQotCi1ib29sIElu
bGluZUNvbnRlbnRCcmVha2VyOjpzaG91bGRLZWVwRW5kT2ZMaW5lV2hpdGVzcGFjZShjb25zdCBD
b250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQpIGNvbnN0Ci17Ci0gICAgLy8gR3Jh
YiB0aGUgc3R5bGUgYW5kIGNoZWNrIGZvciB3aGl0ZS1zcGFjZSBwcm9wZXJ0eSB0byBkZWNpZGUg
d2hldGhlciB3ZSBzaG91bGQgbGV0IHRoaXMgd2hpdGVzcGFjZSBjb250ZW50IG92ZXJmbG93IHRo
ZSBjdXJyZW50IGxpbmUuCi0gICAgLy8gTm90ZSB0aGF0IHRoZSAia2VlcCIgaW4gdGhpcyBjb250
ZXh0IG1lYW5zIHdlIGxldCB0aGUgd2hpdGVzcGFjZSBjb250ZW50IHNpdCBvbiB0aGUgY3VycmVu
dCBsaW5lLgotICAgIC8vIEl0IG1pZ2h0IHZlcnkgd2VsbCBnZXQgY29sbGFwc2VkIHdoZW4gd2Ug
Y2xvc2UgdGhlIGxpbmUgKG5vcm1hbC9ub3dyYXAvcHJlLWxpbmUpLgotICAgIC8vIFNlZSBodHRw
czovL3d3dy53My5vcmcvVFIvY3NzLXRleHQtMy8jd2hpdGUtc3BhY2UtcHJvcGVydHkKLSAgICBh
dXRvIHdoaXRlc3BhY2UgPSBjb250aW51b3VzQ29udGVudC5ydW5zKClbKmZpcnN0VGV4dFJ1bklu
ZGV4KGNvbnRpbnVvdXNDb250ZW50KV0uaW5saW5lSXRlbS5zdHlsZSgpLndoaXRlU3BhY2UoKTsK
LSAgICByZXR1cm4gd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpOb3JtYWwgfHwgd2hpdGVzcGFj
ZSA9PSBXaGl0ZVNwYWNlOjpOb1dyYXAgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpQcmVX
cmFwIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlTGluZTsKLX0KLQotSW5saW5lQ29u
dGVudEJyZWFrZXI6OlJlc3VsdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6cHJvY2Vzc0lubGluZUNv
bnRlbnQoY29uc3QgQ29udGludW91c0NvbnRlbnQmIGNhbmRpZGF0ZUNvbnRlbnQsIGNvbnN0IExp
bmVTdGF0dXMmIGxpbmVTdGF0dXMpCi17Ci0gICAgQVNTRVJUKCFzdGQ6OmlzbmFuKGxpbmVTdGF0
dXMuYXZhaWxhYmxlV2lkdGgpKTsKLSAgICBhdXRvIHByb2Nlc3NDYW5kaWRhdGVDb250ZW50ID0g
WyZdIHsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZUNvbnRlbnQubG9naWNhbFdpZHRoKCkgPD0gbGlu
ZVN0YXR1cy5hdmFpbGFibGVXaWR0aCkKLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBSZXN1
bHQ6OkFjdGlvbjo6S2VlcCB9OwotI2lmIFVTRV9GTE9BVF9BU19JTkxJTkVfTEFZT1VUX1VOSVQK
LSAgICAgICAgLy8gUHJlZmVycmVkIHdpZHRoIGNvbXB1dGF0aW9uIHN1bXMgdXAgZmxvYXRzIHdo
aWxlIGxpbmUgYnJlYWtlciBzdWJ0cmFjdHMgdGhlbS4gVGhpcyBjYW4gbGVhZCB0byBlcHNpbG9u
LXNjYWxlIGRpZmZlcmVuY2VzLgotICAgICAgICBpZiAoV1RGOjphcmVFc3NlbnRpYWxseUVxdWFs
KGNhbmRpZGF0ZUNvbnRlbnQubG9naWNhbFdpZHRoKCksIGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lk
dGgpKQotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdCB7IFJlc3VsdDo6QWN0aW9uOjpLZWVwIH07
Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnQoY2FuZGlk
YXRlQ29udGVudCwgbGluZVN0YXR1cyk7Ci0gICAgfTsKLQotICAgIGF1dG8gcmVzdWx0ID0gcHJv
Y2Vzc0NhbmRpZGF0ZUNvbnRlbnQoKTsKLSAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBSZXN1bHQ6
OkFjdGlvbjo6V3JhcCAmJiBsaW5lU3RhdHVzLnRyYWlsaW5nU29mdEh5cGhlbldpZHRoICYmIGhh
c0xlYWRpbmdUZXh0Q29udGVudChjYW5kaWRhdGVDb250ZW50KSkgewotICAgICAgICAvLyBBIHRy
YWlsaW5nIHNvZnQgaHlwaGVuIHdpdGggYSB3cmFwcGVkIHRleHQgY29udGVudCB0dXJucyBpbnRv
IGEgdmlzaWJsZSBoeXBoZW4uCi0gICAgICAgIC8vIExldCdzIGNoZWNrIGlmIHRoZXJlJ3MgZW5v
dWdoIHNwYWNlIGZvciB0aGUgaHlwaGVuIGNoYXJhY3Rlci4KLSAgICAgICAgYXV0byBoeXBoZW5P
dmVyZmxvd3MgPSAqbGluZVN0YXR1cy50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA+IGxpbmVTdGF0
dXMuYXZhaWxhYmxlV2lkdGg7Ci0gICAgICAgIGF1dG8gYWN0aW9uID0gaHlwaGVuT3ZlcmZsb3dz
ID8gUmVzdWx0OjpBY3Rpb246OlJldmVydFRvTGFzdE5vbk92ZXJmbG93aW5nV3JhcE9wcG9ydHVu
aXR5IDogUmVzdWx0OjpBY3Rpb246OldyYXBXaXRoSHlwaGVuOwotICAgICAgICByZXN1bHQgPSB7
IGFjdGlvbiwgSXNFbmRPZkxpbmU6OlllcyB9OwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0Owot
fQotCi1zdHJ1Y3QgT3ZlcmZsb3dpbmdUZXh0Q29udGVudCB7Ci0gICAgc2l6ZV90IHJ1bkluZGV4
IHsgMCB9OyAvLyBPdmVyZmxvd2luZyBydW4gaW5kZXguIFRoZXJlJ3MgYWx3YXlzIGFuIG92ZXJm
bG93aW5nIHJ1bi4KLSAgICBzdHJ1Y3QgQnJlYWtpbmdQb3NpdGlvbiB7Ci0gICAgICAgIHNpemVf
dCBydW5JbmRleCB7IDAgfTsKLSAgICAgICAgc3RydWN0IFRyYWlsaW5nQ29udGVudCB7Ci0gICAg
ICAgICAgICAvLyBUcmFpbGluZyBjb250ZW50IGlzIGVpdGhlciB0aGUgcnVuJ3MgbGVmdCBzaWRl
ICh3aGVuIHdlIGJyZWFrIHRoZSBydW4gc29tZXdoZXJlIGluIHRoZSBtaWRkbGUpIG9yIHRoZSBw
cmV2aW91cyBydW4uCi0gICAgICAgICAgICAvLyBTb21ldGltZXMgdGhlIGJyZWFraW5nIHBvc2l0
aW9uIGlzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgZmlyc3QgcnVuLCBzbyB0aGVyZSdz
IG5vIHRyYWlsaW5nIHJ1biBhdCBhbGwuCi0gICAgICAgICAgICBib29sIG92ZXJmbG93cyB7IGZh
bHNlIH07Ci0gICAgICAgICAgICBPcHRpb25hbDxJbmxpbmVDb250ZW50QnJlYWtlcjo6UGFydGlh
bFJ1bj4gcGFydGlhbFJ1biB7IH07Ci0gICAgICAgIH07Ci0gICAgICAgIE9wdGlvbmFsPFRyYWls
aW5nQ29udGVudD4gdHJhaWxpbmdDb250ZW50IHsgfTsKLSAgICB9OwotICAgIE9wdGlvbmFsPEJy
ZWFraW5nUG9zaXRpb24+IGJyZWFraW5nUG9zaXRpb24geyB9OyAvLyBXaGVyZSB3ZSBhY3R1YWxs
eSBicmVhayB0aGlzIG92ZXJmbG93aW5nIGNvbnRlbnQuCi19OwotCi1JbmxpbmVDb250ZW50QnJl
YWtlcjo6UmVzdWx0IElubGluZUNvbnRlbnRCcmVha2VyOjpwcm9jZXNzT3ZlcmZsb3dpbmdDb250
ZW50KGNvbnN0IENvbnRpbnVvdXNDb250ZW50JiBvdmVyZmxvd0NvbnRlbnQsIGNvbnN0IExpbmVT
dGF0dXMmIGxpbmVTdGF0dXMpIGNvbnN0Ci17Ci0gICAgYXV0byBjb250aW51b3VzQ29udGVudCA9
IENvbnRpbnVvdXNDb250ZW50IHsgb3ZlcmZsb3dDb250ZW50IH07Ci0gICAgQVNTRVJUKCFjb250
aW51b3VzQ29udGVudC5ydW5zKCkuaXNFbXB0eSgpKTsKLQotICAgIEFTU0VSVChjb250aW51b3Vz
Q29udGVudC5sb2dpY2FsV2lkdGgoKSA+IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGgpOwotICAg
IGlmIChjb250aW51b3VzQ29udGVudC5oYXNUcmFpbGluZ0NvbGxhcHNpYmxlQ29udGVudCgpKSB7
Ci0gICAgICAgIEFTU0VSVChoYXNUcmFpbGluZ1RleHRDb250ZW50KG92ZXJmbG93Q29udGVudCkp
OwotICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgY29udGVudCBmaXRzIHdpdGhvdXQgdGhl
IHRyYWlsaW5nIGNvbGxhcHNpYmxlIHBhcnQuCi0gICAgICAgIGlmIChjb250aW51b3VzQ29udGVu
dC5ub25Db2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCgpIDw9IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lk
dGgpCi0gICAgICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCwgSXNFbmRPZkxp
bmU6Ok5vIH07Ci0gICAgICAgIC8vIE5vdyBjaGVjayBpZiB3ZSBjYW4gdHJpbSB0aGUgbGluZSB0
b28uCi0gICAgICAgIGlmIChsaW5lU3RhdHVzLmhhc0Z1bGx5Q29sbGFwc2libGVUcmFpbGluZ1J1
biAmJiBjb250aW51b3VzQ29udGVudC5pc0Z1bGx5Q29sbGFwc2libGUoKSkgewotICAgICAgICAg
ICAgLy8gSWYgdGhpcyBuZXcgY29udGVudCBpcyBmdWxseSBjb2xsYXBzaWJsZSwgaXQgc2hvdWxk
IHN1cmVseSBmaXQuCi0gICAgICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCwg
SXNFbmRPZkxpbmU6Ok5vIH07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGxpbmVTdGF0dXMu
Y29sbGFwc2libGVXaWR0aCAmJiBpc05vbkNvbnRlbnRSdW5zT25seShjb250aW51b3VzQ29udGVu
dCkpIHsKLSAgICAgICAgLy8gTGV0J3Mgc2VlIGlmIHRoZSBub24tY29udGVudCBydW5zIGZpdCB3
aGVuIHRoZSBsaW5lIGhhcyB0cmFpbGluZyBjb2xsYXBzaWJsZSBjb250ZW50LgotICAgICAgICAv
LyAidGV4dCBjb250ZW50IDxzcGFuIHN0eWxlPSJwYWRkaW5nOiAxcHgiPjwvc3Bhbj4iIDwtIHRo
ZSA8c3Bhbj48L3NwYW4+IHJ1bnMgY291bGQgZml0IGFmdGVyIGNvbGxhcHNpbmcgdGhlIHRyYWls
aW5nIHdoaXRlc3BhY2UuCi0gICAgICAgIGlmIChjb250aW51b3VzQ29udGVudC5sb2dpY2FsV2lk
dGgoKSA8PSBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoICsgbGluZVN0YXR1cy5jb2xsYXBzaWJs
ZVdpZHRoKQotICAgICAgICAgICAgcmV0dXJuIHsgUmVzdWx0OjpBY3Rpb246OktlZXAgfTsKLSAg
ICB9Ci0gICAgaWYgKGlzVmlzdWFsbHlFbXB0eVdoaXRlc3BhY2VDb250ZW50KGNvbnRpbnVvdXND
b250ZW50KSAmJiBzaG91bGRLZWVwRW5kT2ZMaW5lV2hpdGVzcGFjZShjb250aW51b3VzQ29udGVu
dCkpIHsKLSAgICAgICAgLy8gVGhpcyBvdmVyZmxvd2luZyBjb250ZW50IGFwcGFyZW50bHkgZmFs
bHMgaW50byB0aGUgcmVtb3ZlL2hhbmcgZW5kLW9mLWxpbmUtc3BhY2VzIGNhdGVnb3J5LgotICAg
ICAgICAvLyBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10ZXh0LTMvI3doaXRlLXNwYWNl
LXByb3BlcnR5IG1hdHJpeAotICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCB9
OwotICAgIH0KLQotICAgIHNpemVfdCBvdmVyZmxvd2luZ1J1bkluZGV4ID0gMDsKLSAgICBpZiAo
aGFzVGV4dFJ1bihjb250aW51b3VzQ29udGVudCkpIHsKLSAgICAgICAgYXV0byB0cnlCcmVha2lu
Z0NvbnRlbnRXaXRoVGV4dCA9IFsmXSgpIC0+IE9wdGlvbmFsPFJlc3VsdD4gewotICAgICAgICAg
ICAgLy8gMS4gVGhpcyB0ZXh0IGNvbnRlbnQgaXMgbm90IGJyZWFrYWJsZS4KLSAgICAgICAgICAg
IC8vIDIuIFRoaXMgYnJlYWthYmxlIHRleHQgY29udGVudCBkb2VzIG5vdCBmaXQgYXQgYWxsLiBO
b3QgZXZlbiB0aGUgZmlyc3QgZ2x5cGguIFRoaXMgaXMgYSB2ZXJ5IHNwZWNpYWwgY2FzZS4KLSAg
ICAgICAgICAgIC8vIDMuIFdlIGNhbiBicmVhayB0aGUgY29udGVudCBidXQgaXQgc3RpbGwgb3Zl
cmZsb3dzLgotICAgICAgICAgICAgLy8gNC4gTWFuYWdlZCB0byBicmVhayB0aGUgY29udGVudCBi
ZWZvcmUgdGhlIG92ZXJmbG93IHBvaW50LgotICAgICAgICAgICAgYXV0byBvdmVyZmxvd2luZ0Nv
bnRlbnQgPSBwcm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50V2l0aFRleHQoY29udGludW91c0NvbnRl
bnQsIGxpbmVTdGF0dXMpOwotICAgICAgICAgICAgb3ZlcmZsb3dpbmdSdW5JbmRleCA9IG92ZXJm
bG93aW5nQ29udGVudC5ydW5JbmRleDsKLSAgICAgICAgICAgIGlmICghb3ZlcmZsb3dpbmdDb250
ZW50LmJyZWFraW5nUG9zaXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAg
ICAgICAgIGF1dG8gdHJhaWxpbmdDb250ZW50ID0gb3ZlcmZsb3dpbmdDb250ZW50LmJyZWFraW5n
UG9zaXRpb24tPnRyYWlsaW5nQ29udGVudDsKLSAgICAgICAgICAgIGlmICghdHJhaWxpbmdDb250
ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgdHJpZWQgdG8gYnJlYWsgdGhlIGNvbnRlbnQg
YnV0IHRoZSBhdmFpbGFibGUgc3BhY2UgY2FuJ3QgZXZlbiBhY2NvbW1vZGF0ZSB0aGUgZmlyc3Qg
Z2x5cGguCi0gICAgICAgICAgICAgICAgLy8gMS4gV3JhcCB0aGUgY29udGVudCBvdmVyIHRvIHRo
ZSBuZXh0IGxpbmUgd2hlbiB3ZSd2ZSBnb3QgY29udGVudCBvbiB0aGUgbGluZSBhbHJlYWR5Lgot
ICAgICAgICAgICAgICAgIC8vIDIuIEtlZXAgdGhlIGZpcnN0IGdseXBoIG9uIHRoZSBlbXB0eSBs
aW5lIChvciBrZWVwIHRoZSB3aG9sZSBydW4gaWYgaXQgaGFzIG9ubHkgb25lIGdseXBoL2NvbXBs
ZXRlbHkgZW1wdHkpLgotICAgICAgICAgICAgICAgIGlmIChsaW5lU3RhdHVzLmhhc0NvbnRlbnQp
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6OkFjdGlvbjo6V3Jh
cCwgSXNFbmRPZkxpbmU6OlllcyB9OwotICAgICAgICAgICAgICAgIGF1dG8gbGVhZGluZ1RleHRS
dW5JbmRleCA9ICpmaXJzdFRleHRSdW5JbmRleChjb250aW51b3VzQ29udGVudCk7Ci0gICAgICAg
ICAgICAgICAgYXV0byYgaW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4o
Y29udGludW91c0NvbnRlbnQucnVucygpW2xlYWRpbmdUZXh0UnVuSW5kZXhdLmlubGluZUl0ZW0p
OwotICAgICAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSA8PSAxKQotICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246OktlZXAsIElz
RW5kT2ZMaW5lOjpZZXMgfTsKLSAgICAgICAgICAgICAgICBhdXRvIGZpcnN0Q2hhcmFjdGVyV2lk
dGggPSBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0sIGlubGluZVRleHRJdGVtLnN0YXJ0
KCksIGlubGluZVRleHRJdGVtLnN0YXJ0KCkgKyAxLCBsaW5lU3RhdHVzLmNvbnRlbnRMb2dpY2Fs
UmlnaHQpOwotICAgICAgICAgICAgICAgIGF1dG8gZmlyc3RDaGFyYWN0ZXJSdW4gPSBQYXJ0aWFs
UnVuIHsgMSwgZmlyc3RDaGFyYWN0ZXJXaWR0aCB9OwotICAgICAgICAgICAgICAgIHJldHVybiBS
ZXN1bHQgeyBSZXN1bHQ6OkFjdGlvbjo6QnJlYWssIElzRW5kT2ZMaW5lOjpZZXMsIFJlc3VsdDo6
UGFydGlhbFRyYWlsaW5nQ29udGVudCB7IGxlYWRpbmdUZXh0UnVuSW5kZXgsIGZpcnN0Q2hhcmFj
dGVyUnVuIH0gfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0cmFpbGluZ0NvbnRl
bnQtPm92ZXJmbG93cyAmJiBsaW5lU3RhdHVzLmhhc0NvbnRlbnQpIHsKLSAgICAgICAgICAgICAg
ICAvLyBXZSBtYW5hZ2VkIHRvIGJyZWFrIGEgcnVuIHdpdGggb3ZlcmZsb3cgYnV0IHRoZSBsaW5l
IGFscmVhZHkgaGFzIGNvbnRlbnQuIExldCdzIHdyYXAgaXQgdG8gdGhlIG5leHQgbGluZS4KLSAg
ICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246OldyYXAsIElzRW5k
T2ZMaW5lOjpZZXMgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEVpdGhlciB3ZSBt
YW5hZ2VkIHRvIGJyZWFrIHdpdGggbm8gb3ZlcmZsb3cgb3IgdGhlIGxpbmUgaXMgZW1wdHkuCi0g
ICAgICAgICAgICBhdXRvIHRyYWlsaW5nUGFydGlhbENvbnRlbnQgPSBSZXN1bHQ6OlBhcnRpYWxU
cmFpbGluZ0NvbnRlbnQgeyBvdmVyZmxvd2luZ0NvbnRlbnQuYnJlYWtpbmdQb3NpdGlvbi0+cnVu
SW5kZXgsIHRyYWlsaW5nQ29udGVudC0+cGFydGlhbFJ1biB9OwotICAgICAgICAgICAgcmV0dXJu
IFJlc3VsdCB7IFJlc3VsdDo6QWN0aW9uOjpCcmVhaywgSXNFbmRPZkxpbmU6OlllcywgdHJhaWxp
bmdQYXJ0aWFsQ29udGVudCB9OwotICAgICAgICB9OwotICAgICAgICBpZiAoYXV0byByZXN1bHQg
PSB0cnlCcmVha2luZ0NvbnRlbnRXaXRoVGV4dCgpKQotICAgICAgICAgICAgcmV0dXJuICpyZXN1
bHQ7Ci0gICAgfSBlbHNlIGlmIChjb250aW51b3VzQ29udGVudC5ydW5zKCkuc2l6ZSgpID4gMSkg
ewotICAgICAgICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIHZhcmlvdXMgY29udGVudC4KLSAg
ICAgICAgYXV0byYgcnVucyA9IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKTsKLSAgICAgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBydW5zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAo
cnVuc1tpXS5pbmxpbmVJdGVtLmlzQm94KCkpIHsKLSAgICAgICAgICAgICAgICBvdmVyZmxvd2lu
Z1J1bkluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHdlIGFyZSBub3QgYWxsb3dlZCB0byBicmVhayB0
aGlzIG92ZXJmbG93aW5nIGNvbnRlbnQsIHdlIHN0aWxsIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIg
a2VlcCBpdCBvciB3cmFwIGl0IHRvIHRoZSBuZXh0IGxpbmUuCi0gICAgaWYgKCFsaW5lU3RhdHVz
Lmhhc0NvbnRlbnQpCi0gICAgICAgIHJldHVybiB7IFJlc3VsdDo6QWN0aW9uOjpLZWVwLCBJc0Vu
ZE9mTGluZTo6Tm8gfTsKLSAgICAvLyBOb3cgZWl0aGVyIHdyYXAgdGhpcyBjb250ZW50IG92ZXIg
dG8gdGhlIG5leHQgbGluZSBvciByZXZlcnQgYmFjayB0byBhbiBlYXJsaWVyIHdyYXBwaW5nIG9w
cG9ydHVuaXR5LCBvciBub3Qgd3JhcCBhdCBhbGwuCi0gICAgYXV0byBzaG91bGRXcmFwVW5icmVh
a2FibGVDb250ZW50VG9OZXh0TGluZSA9IFsmXSB7Ci0gICAgICAgIC8vIFRoZSBpbmRpdmlkdWFs
IHJ1bnMgaW4gdGhpcyBjb250aW51b3VzIGNvbnRlbnQgZG9uJ3QgYnJlYWssIGxldCdzIGNoZWNr
IGlmIHdlIGFyZSBhbGxvd2VkIHRvIHdyYXAgdGhpcyBjb250ZW50IHRvIG5leHQgbGluZSAoZS5n
LiBwcmUgd291bGQgcHJldmVudCB1cyBmcm9tIHdyYXBwaW5nKS4KLSAgICAgICAgLy8gUGFyZW50
IHN0eWxlIGRyaXZlcyB0aGUgd3JhcHBpbmcgYmVoYXZpb3IgaGVyZS4KLSAgICAgICAgLy8gZS5n
LiA8ZGl2IHN0eWxlPSJ3aGl0ZS1zcGFjZTogbm93cmFwIj5zb21lIHRleHQ8ZGl2IHN0eWxlPSJk
aXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcCI+PC9kaXY+PC9kaXY+
LgotICAgICAgICAvLyBXaGlsZSB0aGUgaW5saW5lLWJsb2NrIGhhcyBwcmUtd3JhcCB3aGljaCBh
bGxvd3Mgd3JhcHBpbmcsIHRoZSBjb250ZW50IGxpdmVzIGluIGEgbm93cmFwIGNvbnRleHQuCi0g
ICAgICAgIHJldHVybiBpc1dyYXBwaW5nQWxsb3dlZChjb250aW51b3VzQ29udGVudC5ydW5zKClb
b3ZlcmZsb3dpbmdSdW5JbmRleF0uaW5saW5lSXRlbSk7Ci0gICAgfTsKLSAgICBpZiAoc2hvdWxk
V3JhcFVuYnJlYWthYmxlQ29udGVudFRvTmV4dExpbmUoKSkKLSAgICAgICAgcmV0dXJuIHsgUmVz
dWx0OjpBY3Rpb246OldyYXAsIElzRW5kT2ZMaW5lOjpZZXMgfTsKLSAgICBpZiAobGluZVN0YXR1
cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pCi0gICAgICAgIHJldHVybiB7
IFJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xhc3RXcmFwT3Bwb3J0dW5pdHksIElzRW5kT2ZMaW5l
OjpZZXMgfTsKLSAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6S2VlcCwgSXNFbmRPZkxpbmU6
Ok5vIH07Ci19Ci0KLU92ZXJmbG93aW5nVGV4dENvbnRlbnQgSW5saW5lQ29udGVudEJyZWFrZXI6
OnByb2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnRXaXRoVGV4dChjb25zdCBDb250aW51b3VzQ29udGVu
dCYgY29udGludW91c0NvbnRlbnQsIGNvbnN0IExpbmVTdGF0dXMmIGxpbmVTdGF0dXMpIGNvbnN0
Ci17Ci0gICAgYXV0byYgcnVucyA9IGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKTsKLSAgICBBU1NF
UlQoIXJ1bnMuaXNFbXB0eSgpKTsKLQotICAgIGF1dG8gaXNCcmVha2FibGVSdW4gPSBbXSAoYXV0
byYgcnVuKSB7Ci0gICAgICAgIEFTU0VSVChydW4uaW5saW5lSXRlbS5pc1RleHQoKSB8fCBydW4u
aW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgcnVuLmlubGluZUl0ZW0uaXNJbmxpbmVC
b3hFbmQoKSB8fCBydW4uaW5saW5lSXRlbS5sYXlvdXRCb3goKS5pc0ltYWdlKCkpOwotICAgICAg
ICBpZiAoIXJ1bi5pbmxpbmVJdGVtLmlzVGV4dCgpKSB7Ci0gICAgICAgICAgICAvLyBDYW4ndCBi
cmVhayBob3Jpem9udGFsIHNwYWNpbmcgLT4gZS5nLiA8c3BhbiBzdHlsZT0icGFkZGluZy1yaWdo
dDogMTAwcHg7Ij50ZXh0Y29udGVudDwvc3Bhbj4sIGlmIHRoZSBbaW5saW5lIGJveCBlbmRdIGlz
IHRoZSBvdmVyZmxvd24gaW5saW5lIGl0ZW0KLSAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gY2hl
Y2sgaWYgdGhlcmUncyBhbm90aGVyIGlubGluZSBpdGVtIGJleW9uZCB0aGUgW2lubGluZSBib3gg
ZW5kXSB0byBzcGxpdC4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAg
ICAgICAvLyBDaGVjayBpZiB0aGlzIHRleHQgcnVuIG5lZWRzIHRvIHN0YXkgb24gdGhlIGN1cnJl
bnQgbGluZS4gIAotICAgICAgICByZXR1cm4gaXNXcmFwcGluZ0FsbG93ZWQocnVuLmlubGluZUl0
ZW0pOwotICAgIH07Ci0KLSAgICBhdXRvIGZpbmRUcmFpbGluZ1J1bkluZGV4ID0gWyZdIChhdXRv
IGJyZWFrYWJsZVJ1bkluZGV4KSAtPiBPcHRpb25hbDxzaXplX3Q+IHsKLSAgICAgICAgLy8gV2hl
biB0aGUgYnJlYWtpbmcgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcnVuLCB0
aGUgdHJhaWxpbmcgcnVuIGlzIHRoZSBwcmV2aW91cyBvbmUuCi0gICAgICAgIGlmICghYnJlYWth
YmxlUnVuSW5kZXgpCi0gICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAvLyBUcnkgbm90
IGJyZWFrIGNvbnRlbnQgYXQgaW5saW5lIGJveCBib3VuZGFyeQotICAgICAgICAvLyBlLmcuIDxz
cGFuPmZpdHM8L3NwYW4+PHNwYW4+b3ZlcmZsb3dzPC9zcGFuPgotICAgICAgICAvLyB3aGVuIHRo
ZSB0ZXh0ICJvdmVyZmxvd3MiIGNvbXBsZXRlbHkgb3ZlcmZsb3dzLCBsZXQncyBicmVhayB0aGUg
Y29udGVudCByaWdodCBiZWZvcmUgdGhlICc8c3Bhbj4nLgotICAgICAgICAvLyBGSVhNRTogQWRk
IHN1cHBvcnQgZm9yIHN1YnNlcXVlbnQgZW1wdHkgaW5saW5lIGJveGVzIGUuZy4KLSAgICAgICAg
YXV0byB0cmFpbGluZ0NhbmRpZGF0ZUluZGV4ID0gYnJlYWthYmxlUnVuSW5kZXggLSAxOwotICAg
ICAgICBhdXRvIGlzQXRJbmxpbmVCb3ggPSBydW5zW3RyYWlsaW5nQ2FuZGlkYXRlSW5kZXhdLmlu
bGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpOwotICAgICAgICByZXR1cm4gIWlzQXRJbmxpbmVC
b3ggPyB0cmFpbGluZ0NhbmRpZGF0ZUluZGV4IDogdHJhaWxpbmdDYW5kaWRhdGVJbmRleCA/IG1h
a2VPcHRpb25hbCh0cmFpbGluZ0NhbmRpZGF0ZUluZGV4IC0gMSkgOiBXVEY6Om51bGxvcHQ7Ci0g
ICAgfTsKLQotICAgIC8vIENoZWNrIHdoZXJlIHRoZSBvdmVyZmxvdyBvY2N1cnMgYW5kIHVzZSB0
aGUgY29ycmVzcG9uZGluZyBzdHlsZSB0byBmaWd1cmUgb3V0IHRoZSBicmVha2luZyBiZWhhdmlv
dXIuCi0gICAgLy8gPHNwYW4gc3R5bGU9IndvcmQtYnJlYWs6IG5vcm1hbCI+Zmlyc3Q8L3NwYW4+
PHNwYW4gc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLWFsbCI+c2Vjb25kPC9zcGFuPjxzcGFuIHN0
eWxlPSJ3b3JkLWJyZWFrOiBub3JtYWwiPnRoaXJkPC9zcGFuPgotCi0gICAgLy8gRmlyc3QgZmlu
ZCB0aGUgb3ZlcmZsb3dpbmcgcnVuLiAKLSAgICBhdXRvIGFjY3VtdWxhdGVkQ29udGVudFdpZHRo
ID0gSW5saW5lTGF5b3V0VW5pdCB7IH07Ci0gICAgYXV0byBvdmVyZmxvd2luZ1J1bkluZGV4ID0g
cnVucy5zaXplKCk7IAotICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBydW5zLnNp
emUoKTsgKytpbmRleCkgewotICAgICAgICBhdXRvIHJ1bkxvZ2ljYWxXaWR0aCA9IHJ1bnNbaW5k
ZXhdLmxvZ2ljYWxXaWR0aDsKLSAgICAgICAgaWYgKGFjY3VtdWxhdGVkQ29udGVudFdpZHRoICsg
cnVuTG9naWNhbFdpZHRoICA+IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGgpIHsKLSAgICAgICAg
ICAgIG92ZXJmbG93aW5nUnVuSW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0gICAgICAgIGFjY3VtdWxhdGVkQ29udGVudFdpZHRoICs9IHJ1bkxvZ2ljYWxXaWR0
aDsKLSAgICB9Ci0gICAgLy8gV2UgaGF2ZSB0byBoYXZlIGFuIG92ZXJmbG93aW5nIHJ1bi4KLSAg
ICBSRUxFQVNFX0FTU0VSVChvdmVyZmxvd2luZ1J1bkluZGV4IDwgcnVucy5zaXplKCkpOwotCi0g
ICAgYXV0byB0cnlCcmVha2luZ092ZXJmbG93aW5nUnVuID0gWyZdKCkgLT4gT3B0aW9uYWw8T3Zl
cmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbj4gewotICAgICAgICBhdXRvIG92
ZXJmbG93aW5nUnVuID0gcnVuc1tvdmVyZmxvd2luZ1J1bkluZGV4XTsKLSAgICAgICAgaWYgKCFp
c0JyZWFrYWJsZVJ1bihvdmVyZmxvd2luZ1J1bikpCi0gICAgICAgICAgICByZXR1cm4geyB9Owot
ICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gdHJ5QnJlYWtpbmdUZXh0UnVuKG92ZXJmbG93
aW5nUnVuLCBsaW5lU3RhdHVzLmNvbnRlbnRMb2dpY2FsUmlnaHQgKyBhY2N1bXVsYXRlZENvbnRl
bnRXaWR0aCwgc3RkOjptYXgoMC4wZiwgbGluZVN0YXR1cy5hdmFpbGFibGVXaWR0aCAtIGFjY3Vt
dWxhdGVkQ29udGVudFdpZHRoKSwgbGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZp
b3VzUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICBpZiAocGFydGlhbFJ1bi0+bGVuZ3RoKQotICAg
ICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0
aW9uIHsgb3ZlcmZsb3dpbmdSdW5JbmRleCwgT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtp
bmdQb3NpdGlvbjo6VHJhaWxpbmdDb250ZW50IHsgZmFsc2UsIHBhcnRpYWxSdW4gfSB9OwotICAg
ICAgICAgICAgLy8gV2hlbiB0aGUgYnJlYWtpbmcgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmlu
ZyBvZiB0aGUgcnVuLCB0aGUgdHJhaWxpbmcgcnVuIGlzIHRoZSBwcmV2aW91cyBvbmUuCi0gICAg
ICAgICAgICBpZiAoYXV0byB0cmFpbGluZ1J1bkluZGV4ID0gZmluZFRyYWlsaW5nUnVuSW5kZXgo
b3ZlcmZsb3dpbmdSdW5JbmRleCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE92ZXJmbG93aW5n
VGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb24geyAqdHJhaWxpbmdSdW5JbmRleCwgT3ZlcmZs
b3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbjo6VHJhaWxpbmdDb250ZW50IHsgfSB9
OwotICAgICAgICAgICAgLy8gU29tZXRpbWVzIHdlIGNhbid0IGFjY29tbW9kYXRlIGV2ZW4gdGhl
IHZlcnkgZmlyc3QgY2hhcmFjdGVyLiAKLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlz
IGRpZmZlcmVudCBmcm9tIHdoZW4gdGhlcmUncyBubyBicmVha2FibGUgcnVuIGluIHRoaXMgc2V0
LgotICAgICAgICAgICAgcmV0dXJuIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9z
aXRpb24geyB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB7IH07Ci0gICAgfTsKLSAgICAv
LyBDaGVjayBpZiB3ZSBhY3R1YWxseSBicmVhayB0aGlzIHJ1bi4KLSAgICBpZiAoYXV0byBicmVh
a2luZ1Bvc2l0aW9uID0gdHJ5QnJlYWtpbmdPdmVyZmxvd2luZ1J1bigpKQotICAgICAgICByZXR1
cm4geyBvdmVyZmxvd2luZ1J1bkluZGV4LCBicmVha2luZ1Bvc2l0aW9uIH07Ci0KLSAgICBhdXRv
IHRyeUJyZWFraW5nUHJldmlvdXNOb25PdmVyZmxvd2luZ1J1bnMgPSBbJl0oKSAtPiBPcHRpb25h
bDxPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uPiB7Ci0gICAgICAgIGF1
dG8gcHJldmlvdXNDb250ZW50V2lkdGggPSBhY2N1bXVsYXRlZENvbnRlbnRXaWR0aDsKLSAgICAg
ICAgZm9yIChhdXRvIGluZGV4ID0gb3ZlcmZsb3dpbmdSdW5JbmRleDsgaW5kZXgtLTspIHsKLSAg
ICAgICAgICAgIGF1dG8mIHJ1biA9IHJ1bnNbaW5kZXhdOwotICAgICAgICAgICAgcHJldmlvdXND
b250ZW50V2lkdGggLT0gcnVuLmxvZ2ljYWxXaWR0aDsKLSAgICAgICAgICAgIGlmICghaXNCcmVh
a2FibGVSdW4ocnVuKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIEFT
U0VSVChydW4uaW5saW5lSXRlbS5pc1RleHQoKSk7Ci0gICAgICAgICAgICBpZiAoYXV0byBwYXJ0
aWFsUnVuID0gdHJ5QnJlYWtpbmdUZXh0UnVuKHJ1biwgbGluZVN0YXR1cy5jb250ZW50TG9naWNh
bFJpZ2h0ICsgcHJldmlvdXNDb250ZW50V2lkdGgsIHsgfSwgbGluZVN0YXR1cy5oYXNXcmFwT3Bw
b3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2Uga25v
dyB0aGlzIHJ1biBmaXRzLCBzbyBpZiBicmVha2luZyBpcyBhbGxvd2VkIG9uIHRoZSBydW4sIGl0
IHNob3VsZCByZXR1cm4gYSBub24tZW1wdHkgbGVmdC1zaWRlCi0gICAgICAgICAgICAgICAgLy8g
c2luY2UgaXQncyBlaXRoZXIgYXQgaHlwaGVuIHBvc2l0aW9uIG9yIHRoZSBlbnRpcmUgcnVuIGlz
IHJldHVybmVkLgotICAgICAgICAgICAgICAgIEFTU0VSVChwYXJ0aWFsUnVuLT5sZW5ndGgpOwot
ICAgICAgICAgICAgICAgIGF1dG8gcnVuSXNGdWxseUFjY29tbW9kYXRlZCA9IHBhcnRpYWxSdW4t
Pmxlbmd0aCA9PSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4ocnVuLmlubGluZUl0ZW0pLmxlbmd0
aCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVh
a2luZ1Bvc2l0aW9uIHsgaW5kZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9z
aXRpb246OlRyYWlsaW5nQ29udGVudCB7IGZhbHNlLCBydW5Jc0Z1bGx5QWNjb21tb2RhdGVkID8g
V1RGOjpudWxsb3B0IDogcGFydGlhbFJ1biB9IH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICB9OwotICAgIC8vIFdlIGRpZCBub3QgbWFuYWdlIHRv
IGJyZWFrIHRoZSBydW4gdGhhdCBhY3R1YWxseSBvdmVyZmxvd3MgdGhlIGxpbmUuCi0gICAgLy8g
TGV0J3MgdHJ5IHRvIGZpbmQgYSBwcmV2aW91cyBicmVha2luZyBwb3NpdGlvbiBzdGFydGluZyBm
cm9tIHRoZSBvdmVyZmxvd2luZyBydW4uIEl0IHN1cmVseSBmaXRzLgotICAgIGlmIChhdXRvIGJy
ZWFraW5nUG9zaXRpb24gPSB0cnlCcmVha2luZ1ByZXZpb3VzTm9uT3ZlcmZsb3dpbmdSdW5zKCkp
Ci0gICAgICAgIHJldHVybiB7IG92ZXJmbG93aW5nUnVuSW5kZXgsIGJyZWFraW5nUG9zaXRpb24g
fTsKLQotICAgIGF1dG8gdHJ5QnJlYWtpbmdOZXh0T3ZlcmZsb3dpbmdSdW5zID0gWyZdKCkgLT4g
T3B0aW9uYWw8T3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbj4gewotICAg
ICAgICBhdXRvIG5leHRDb250ZW50V2lkdGggPSBhY2N1bXVsYXRlZENvbnRlbnRXaWR0aCArIHJ1
bnNbb3ZlcmZsb3dpbmdSdW5JbmRleF0ubG9naWNhbFdpZHRoOwotICAgICAgICBmb3IgKGF1dG8g
aW5kZXggPSBvdmVyZmxvd2luZ1J1bkluZGV4ICsgMTsgaW5kZXggPCBydW5zLnNpemUoKTsgKytp
bmRleCkgewotICAgICAgICAgICAgYXV0byYgcnVuID0gcnVuc1tpbmRleF07Ci0gICAgICAgICAg
ICBpZiAoaXNCcmVha2FibGVSdW4ocnVuKSkgewotICAgICAgICAgICAgICAgIEFTU0VSVChydW4u
aW5saW5lSXRlbS5pc1RleHQoKSk7Ci0gICAgICAgICAgICAgICAgLy8gV2Uga25vdyB0aGF0IHRo
aXMgcnVuIGRvZXMgbm90IGZpdCB0aGUgYXZhaWxhYmxlIHNwYWNlLiBJZiB3ZSBjYW4gYnJlYWsg
aXQgYXQgYW55IHBvc2l0aW9uLCBsZXQncyBqdXN0IHVzZSB0aGUgc3RhcnQgb2YgdGhlIHJ1bi4K
LSAgICAgICAgICAgICAgICBpZiAod29yZEJyZWFrQmVoYXZpb3IocnVuLmlubGluZUl0ZW0uc3R5
bGUoKSwgbGluZVN0YXR1cy5oYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pID09
IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICAg
ICAgLy8gV2UgbXVzdCBiZSBvbiBhbiBpbmxpbmUgYm94IGJvdW5kYXJ5LiBMZXQncyBnbyBiYWNr
IHRvIHRoZSBydW4gaW4gZnJvbnQgb2YgdGhlIGlubGluZSBib3ggc3RhcnQgcnVuLgotICAgICAg
ICAgICAgICAgICAgICAvLyBlLmcuIDxzcGFuPnVuYnJlYWthYmxlX2FuZF9vdmVyZmxvdzxzcGFu
IHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay1hbGwiPmJyZWFrYWJsZTwvc3Bhbj4KLSAgICAgICAg
ICAgICAgICAgICAgLy8gV2UgYXJlIGF0ICJicmVha2FibGUiLCA8c3Bhbj4gaXMgYXQgaW5kZXgg
LSAxIGFuZCB0aGUgdHJhaWxpbmcgcnVuIGlzIGF0IGluZGV4IC0gMi4KLSAgICAgICAgICAgICAg
ICAgICAgQVNTRVJUKHJ1bnNbaW5kZXggLSAxXS5pbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQo
KSk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8gdHJhaWxpbmdSdW5JbmRleCA9IGZpbmRUcmFp
bGluZ1J1bkluZGV4KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFpbGluZ1J1
bkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNvbnRpbnVvdXMgY29u
dGVudCBkaWQgbm90IGZpdCBmcm9tIHRoZSBnZXQtZ28uIE5vIHRyYWlsaW5nIHJ1bi4KLSAgICAg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2lu
Z1Bvc2l0aW9uIHsgfTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAg
ICAvLyBBdCB3b3JzdCB3ZSBhcmUgYmFjayB0byB0aGUgb3ZlcmZsb3dpbmcgcnVuLCBsaWtlIGlu
IHRoZSBleGFtcGxlIGFib3ZlLgotICAgICAgICAgICAgICAgICAgICBBU1NFUlQoKnRyYWlsaW5n
UnVuSW5kZXggPj0gb3ZlcmZsb3dpbmdSdW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgKnRyYWlsaW5n
UnVuSW5kZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb246OlRyYWls
aW5nQ29udGVudCB7IHRydWUgfSB9OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gdHJ5QnJlYWtpbmdUZXh0UnVuKHJ1biwgbGluZVN0YXR1
cy5jb250ZW50TG9naWNhbFJpZ2h0ICsgbmV4dENvbnRlbnRXaWR0aCwgeyB9LCBsaW5lU3RhdHVz
Lmhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikpIHsKLSAgICAgICAgICAgICAg
ICAgICAgQVNTRVJUKHBhcnRpYWxSdW4tPmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIC8v
IFdlIG1hbmFnZWQgdG8gYnJlYWsgdGhpcyB0ZXh0IHJ1biBtaWQgY29udGVudC4gSXQgaGFzIHRv
IGJlIGEgaHlwaGVuIGJyZWFrLgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3ZlcmZsb3dp
bmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IGluZGV4LCBPdmVyZmxvd2luZ1RleHRD
b250ZW50OjpCcmVha2luZ1Bvc2l0aW9uOjpUcmFpbGluZ0NvbnRlbnQgeyB0cnVlLCBwYXJ0aWFs
UnVuIH0gfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBu
ZXh0Q29udGVudFdpZHRoICs9IHJ1bi5sb2dpY2FsV2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAg
cmV0dXJuIHsgfTsKLSAgICB9OwotICAgIC8vIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHRo
ZXJlJ3Mgbm8gYnJlYWthYmxlIHJ1biBhbGwgdGhlIHdheSB0byB0aGUgb3ZlcmZsb3dpbmcgcnVu
LgotICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGFueSBydW4gYWZ0ZXIgdGhlIG92ZXJm
bG93aW5nIGNvbnRlbnQgY2FuIGJyZWFrLgotICAgIC8vIGUuZy4gPHNwYW4+dGhpc19jb250ZW50
X292ZXJmbG93c19idXRfbm90X2JyZWFrYWJsZTxzcGFuPjxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFr
OiBicmVhay1hbGwiPmJ1dF90aGlzX2lzX2JyZWFrYWJsZTwvc3Bhbj4KLSAgICBpZiAoYXV0byBi
cmVha2luZ1Bvc2l0aW9uID0gdHJ5QnJlYWtpbmdOZXh0T3ZlcmZsb3dpbmdSdW5zKCkpCi0gICAg
ICAgIHJldHVybiB7IG92ZXJmbG93aW5nUnVuSW5kZXgsIGJyZWFraW5nUG9zaXRpb24gfTsKLQot
ICAgIC8vIEdpdmUgdXAsIHRoZXJlJ3Mgbm8gYnJlYWthYmxlIHJ1biBpbiBoZXJlLgotICAgIHJl
dHVybiB7IG92ZXJmbG93aW5nUnVuSW5kZXggfTsKLX0KLQotT3B0aW9uU2V0PElubGluZUNvbnRl
bnRCcmVha2VyOjpXb3JkQnJlYWtSdWxlPiBJbmxpbmVDb250ZW50QnJlYWtlcjo6d29yZEJyZWFr
QmVoYXZpb3IoY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlLCBib29sIGhhc1dyYXBPcHBvcnR1bml0
eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3QKLXsKLSAgICAvLyBEaXNyZWdhcmQgYW55IHByb2hp
Yml0aW9uIGFnYWluc3QgbGluZSBicmVha3MgbWFuZGF0ZWQgYnkgdGhlIHdvcmQtYnJlYWsgcHJv
cGVydHkuCi0gICAgLy8gVGhlIGRpZmZlcmVudCB3cmFwcGluZyBvcHBvcnR1bml0aWVzIG11c3Qg
bm90IGJlIHByaW9yaXRpemVkLiBIeXBoZW5hdGlvbiBpcyBub3QgYXBwbGllZC4KLSAgICBpZiAo
c3R5bGUubGluZUJyZWFrKCkgPT0gTGluZUJyZWFrOjpBbnl3aGVyZSkKLSAgICAgICAgcmV0dXJu
IHsgV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbiB9OwotICAgIC8vIEJyZWFraW5n
IGlzIGFsbG93ZWQgd2l0aGluIOKAnHdvcmRz4oCdLgotICAgIGlmIChzdHlsZS53b3JkQnJlYWso
KSA9PSBXb3JkQnJlYWs6OkJyZWFrQWxsKQotICAgICAgICByZXR1cm4geyBXb3JkQnJlYWtSdWxl
OjpBdEFyYml0cmFyeVBvc2l0aW9uIH07Ci0gICAgLy8gQnJlYWtpbmcgaXMgZm9yYmlkZGVuIHdp
dGhpbiDigJx3b3Jkc+KAnS4KLSAgICBpZiAoc3R5bGUud29yZEJyZWFrKCkgPT0gV29yZEJyZWFr
OjpLZWVwQWxsKQotICAgICAgICByZXR1cm4geyB9OwotCi0gICAgYXV0byBicmVha1J1bGVzID0g
T3B0aW9uU2V0PFdvcmRCcmVha1J1bGU+IHsgfTsKLSAgICBhdXRvIGh5cGhlbmF0aW9uSXNBbGxv
d2VkID0gIW5faHlwaGVuYXRpb25Jc0Rpc2FibGVkICYmIHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBo
ZW5zOjpBdXRvICYmIGNhbkh5cGhlbmF0ZShzdHlsZS5jb21wdXRlZExvY2FsZSgpKTsKLSAgICBp
ZiAoaHlwaGVuYXRpb25Jc0FsbG93ZWQpCi0gICAgICAgIGJyZWFrUnVsZXMuYWRkKHsgV29yZEJy
ZWFrUnVsZTo6QXRIeXBoZW5hdGlvbk9wcG9ydHVuaXRpZXMgfSk7Ci0gICAgLy8gRm9yIGNvbXBh
dGliaWxpdHkgd2l0aCBsZWdhY3kgY29udGVudCwgdGhlIHdvcmQtYnJlYWsgcHJvcGVydHkgYWxz
byBzdXBwb3J0cyBhIGRlcHJlY2F0ZWQgYnJlYWstd29yZCBrZXl3b3JkLgotICAgIC8vIFdoZW4g
c3BlY2lmaWVkLCB0aGlzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgd29yZC1icmVhazogbm9ybWFs
IGFuZCBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZSwgcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsIHZh
bHVlIG9mIHRoZSBvdmVyZmxvdy13cmFwIHByb3BlcnR5LgotICAgIGlmIChzdHlsZS53b3JkQnJl
YWsoKSA9PSBXb3JkQnJlYWs6OkJyZWFrV29yZCAmJiAhaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2
aW91c1Bvc2l0aW9uKSB7Ci0gICAgICAgIGJyZWFrUnVsZXMuYWRkKHsgV29yZEJyZWFrUnVsZTo6
QXRBcmJpdHJhcnlQb3NpdGlvbiB9KTsKLSAgICAgICAgcmV0dXJuIGJyZWFrUnVsZXM7Ci0gICAg
fQotICAgIC8vIE92ZXJmbG93V3JhcDo6QnJlYWs6IEFuIG90aGVyd2lzZSB1bmJyZWFrYWJsZSBz
ZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIG1heSBiZSBicm9rZW4gYXQgYW4gYXJiaXRyYXJ5IHBvaW50
IGlmIHRoZXJlIGFyZSBubyBvdGhlcndpc2UtYWNjZXB0YWJsZSBicmVhayBwb2ludHMgaW4gdGhl
IGxpbmUuCi0gICAgaWYgKHN0eWxlLm92ZXJmbG93V3JhcCgpID09IE92ZXJmbG93V3JhcDo6QnJl
YWsgJiYgIWhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgewotICAgICAgICBi
cmVha1J1bGVzLmFkZCh7IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRpb24gfSk7Ci0g
ICAgICAgIHJldHVybiBicmVha1J1bGVzOwotICAgIH0KLSAgICByZXR1cm4gYnJlYWtSdWxlczsK
LX0KLQotT3B0aW9uYWw8SW5saW5lQ29udGVudEJyZWFrZXI6OlBhcnRpYWxSdW4+IElubGluZUNv
bnRlbnRCcmVha2VyOjp0cnlCcmVha2luZ1RleHRSdW4oY29uc3QgQ29udGludW91c0NvbnRlbnQ6
OlJ1biYgb3ZlcmZsb3dpbmdSdW4sIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIE9wdGlv
bmFsPElubGluZUxheW91dFVuaXQ+IGF2YWlsYWJsZVdpZHRoLCBib29sIGhhc1dyYXBPcHBvcnR1
bml0eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3QKLXsKLSAgICBBU1NFUlQob3ZlcmZsb3dpbmdS
dW4uaW5saW5lSXRlbS5pc1RleHQoKSk7Ci0gICAgYXV0byYgaW5saW5lVGV4dEl0ZW0gPSBkb3du
Y2FzdDxJbmxpbmVUZXh0SXRlbT4ob3ZlcmZsb3dpbmdSdW4uaW5saW5lSXRlbSk7Ci0gICAgYXV0
byYgc3R5bGUgPSBpbmxpbmVUZXh0SXRlbS5zdHlsZSgpOwotICAgIGF1dG8gYXZhaWxhYmxlU3Bh
Y2VJc0luZmluaXRlID0gIWF2YWlsYWJsZVdpZHRoLmhhc1ZhbHVlKCk7Ci0KLSAgICBhdXRvIGJy
ZWFrUnVsZXMgPSB3b3JkQnJlYWtCZWhhdmlvcihzdHlsZSwgaGFzV3JhcE9wcG9ydHVuaXR5QXRQ
cmV2aW91c1Bvc2l0aW9uKTsKLSAgICBpZiAoYnJlYWtSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAg
IHJldHVybiB7IH07Ci0KLSAgICBpZiAoYnJlYWtSdWxlcy5jb250YWlucyhXb3JkQnJlYWtSdWxl
OjpBdEh5cGhlbmF0aW9uT3Bwb3J0dW5pdGllcykpIHsKLSAgICAgICAgYXV0byB0cnlCcmVha2lu
Z0F0SHlwaGVuYXRpb25PcHBvcnR1bml0eSA9IFsmXSgpIC0+IE9wdGlvbmFsPFBhcnRpYWxSdW4+
IHsKLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIGh5cGhlbiBwb3NpdGlvbiBhcyBmb2xsb3dzOgot
ICAgICAgICAgICAgLy8gMS4gU3BsaXQgdGhlIHRleHQgYnkgdGFraW5nIHRoZSBoeXBoZW4gd2lk
dGggaW50byBhY2NvdW50Ci0gICAgICAgICAgICAvLyAyLiBGaW5kIHRoZSBsYXN0IGh5cGhlbiBw
b3NpdGlvbiBiZWZvcmUgdGhlIHNwbGl0IHBvc2l0aW9uCi0gICAgICAgICAgICBpZiAoIWF2YWls
YWJsZVNwYWNlSXNJbmZpbml0ZSAmJiAhKmF2YWlsYWJsZVdpZHRoKSB7Ci0gICAgICAgICAgICAg
ICAgLy8gV2Ugd29uJ3QgYmUgYWJsZSB0byBmaW5kIGh5cGhlbiBsb2NhdGlvbiB3aGVuIHRoZXJl
J3Mgbm8gYXZhaWxhYmxlIHNwYWNlLgotICAgICAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIHJ1bkxlbmd0aCA9IGlubGluZVRleHRJdGVtLmxl
bmd0aCgpOwotICAgICAgICAgICAgdW5zaWduZWQgbGltaXRCZWZvcmUgPSBzdHlsZS5oeXBoZW5h
dGlvbkxpbWl0QmVmb3JlKCkgPT0gUmVuZGVyU3R5bGU6OmluaXRpYWxIeXBoZW5hdGlvbkxpbWl0
QmVmb3JlKCkgPyAwIDogc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpOwotICAgICAgICAg
ICAgdW5zaWduZWQgbGltaXRBZnRlciA9IHN0eWxlLmh5cGhlbmF0aW9uTGltaXRBZnRlcigpID09
IFJlbmRlclN0eWxlOjppbml0aWFsSHlwaGVuYXRpb25MaW1pdEFmdGVyKCkgPyAwIDogc3R5bGUu
aHlwaGVuYXRpb25MaW1pdEFmdGVyKCk7Ci0gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHJ1
biBjYW4gYWNjb21tb2RhdGUgdGhlIGJlZm9yZS9hZnRlciBsaW1pdHMgYXQgYWxsIGJlZm9yZSBz
dGFydCBtZWFzdXJpbmcgdGV4dC4KLSAgICAgICAgICAgIGlmIChsaW1pdEJlZm9yZSA+PSBydW5M
ZW5ndGggfHwgbGltaXRBZnRlciA+PSBydW5MZW5ndGggfHwgbGltaXRCZWZvcmUgKyBsaW1pdEFm
dGVyID4gcnVuTGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiB7IH07Ci0KLSAgICAgICAg
ICAgIHVuc2lnbmVkIGxlZnRTaWRlTGVuZ3RoID0gcnVuTGVuZ3RoOwotICAgICAgICAgICAgYXV0
byYgZm9udENhc2NhZGUgPSBzdHlsZS5mb250Q2FzY2FkZSgpOwotICAgICAgICAgICAgYXV0byBo
eXBoZW5XaWR0aCA9IElubGluZUxheW91dFVuaXQgeyBmb250Q2FzY2FkZS53aWR0aChUZXh0UnVu
IHsgU3RyaW5nVmlldyB7IHN0eWxlLmh5cGhlblN0cmluZygpIH0gfSkgfTsKLSAgICAgICAgICAg
IGlmICghYXZhaWxhYmxlU3BhY2VJc0luZmluaXRlKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBh
dmFpbGFibGVXaWR0aEV4Y2x1ZGluZ0h5cGhlbiA9ICphdmFpbGFibGVXaWR0aCAtIGh5cGhlbldp
ZHRoOwotICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVXaWR0aEV4Y2x1ZGluZ0h5cGhlbiA8
PSAwIHx8ICFlbm91Z2hXaWR0aEZvckh5cGhlbmF0aW9uKGF2YWlsYWJsZVdpZHRoRXhjbHVkaW5n
SHlwaGVuLCBmb250Q2FzY2FkZS5waXhlbFNpemUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiB7IH07Ci0gICAgICAgICAgICAgICAgbGVmdFNpZGVMZW5ndGggPSBUZXh0VXRpbDo6c3Bs
aXQoaW5saW5lVGV4dEl0ZW0sIG92ZXJmbG93aW5nUnVuLmxvZ2ljYWxXaWR0aCwgYXZhaWxhYmxl
V2lkdGhFeGNsdWRpbmdIeXBoZW4sIGxvZ2ljYWxMZWZ0KS5sZW5ndGg7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBpZiAobGVmdFNpZGVMZW5ndGggPCBsaW1pdEJlZm9yZSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAgICAgLy8gQWRqdXN0IGJlZm9yZSBpbmRleCB0
byBhY2NvbW1vZGF0ZSB0aGUgbGltaXQtYWZ0ZXIgdmFsdWUgKGl0J3MgdGhlIGxhc3QgcG90ZW50
aWFsIGh5cGhlbiBsb2NhdGlvbiBpbiB0aGlzIHJ1bikuCi0gICAgICAgICAgICBhdXRvIGh5cGhl
bkJlZm9yZSA9IHN0ZDo6bWluKGxlZnRTaWRlTGVuZ3RoLCBydW5MZW5ndGggLSBsaW1pdEFmdGVy
KSArIDE7Ci0gICAgICAgICAgICB1bnNpZ25lZCBoeXBoZW5Mb2NhdGlvbiA9IGxhc3RIeXBoZW5M
b2NhdGlvbihTdHJpbmdWaWV3KGlubGluZVRleHRJdGVtLmlubGluZVRleHRCb3goKS5jb250ZW50
KCkpLnN1YnN0cmluZyhpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBpbmxpbmVUZXh0SXRlbS5sZW5n
dGgoKSksIGh5cGhlbkJlZm9yZSwgc3R5bGUuY29tcHV0ZWRMb2NhbGUoKSk7Ci0gICAgICAgICAg
ICBpZiAoIWh5cGhlbkxvY2F0aW9uIHx8IGh5cGhlbkxvY2F0aW9uIDwgbGltaXRCZWZvcmUpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgICAgIC8vIGh5cGhlbkxvY2F0aW9u
IGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGlzIElubGluZUl0ZW1UZXh0LgotICAgICAg
ICAgICAgQVNTRVJUKGlubGluZVRleHRJdGVtLnN0YXJ0KCkgKyBoeXBoZW5Mb2NhdGlvbiA8IGlu
bGluZVRleHRJdGVtLmVuZCgpKTsKLSAgICAgICAgICAgIGF1dG8gdHJhaWxpbmdQYXJ0aWFsUnVu
V2lkdGhXaXRoSHlwaGVuID0gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRJdGVtLCBpbmxpbmVU
ZXh0SXRlbS5zdGFydCgpLCBpbmxpbmVUZXh0SXRlbS5zdGFydCgpICsgaHlwaGVuTG9jYXRpb24s
IGxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgICAgIHJldHVybiBQYXJ0aWFsUnVuIHsgaHlwaGVuTG9j
YXRpb24sIHRyYWlsaW5nUGFydGlhbFJ1bldpZHRoV2l0aEh5cGhlbiwgaHlwaGVuV2lkdGggfTsK
LSAgICAgICAgfTsKLSAgICAgICAgaWYgKGF1dG8gcGFydGlhbFJ1biA9IHRyeUJyZWFraW5nQXRI
eXBoZW5hdGlvbk9wcG9ydHVuaXR5KCkpCi0gICAgICAgICAgICByZXR1cm4gcGFydGlhbFJ1bjsK
LSAgICB9Ci0KLSAgICBpZiAoYnJlYWtSdWxlcy5jb250YWlucyhXb3JkQnJlYWtSdWxlOjpBdEFy
Yml0cmFyeVBvc2l0aW9uKSkgewotICAgICAgICBhdXRvIHRyeUJyZWFraW5nQXRBcmJpdHJhcnlQ
b3NpdGlvbiA9IFsmXSgpIC0+IFBhcnRpYWxSdW4gewotICAgICAgICAgICAgaWYgKCFpbmxpbmVU
ZXh0SXRlbS5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIC8vIEVtcHR5IHRleHQgcnVucyBt
YXkgYmUgYnJlYWthYmxlIGJhc2VkIG9uIHN0eWxlLCBidXQgaW4gcHJhY3RpY2Ugd2UgY2FuJ3Qg
cmVhbGx5IHNwbGl0IHRoZW0gYW55IGZ1cnRoZXIuCi0gICAgICAgICAgICAgICAgcmV0dXJuIHsg
fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdmFpbGFibGVTcGFjZUlzSW5maW5p
dGUpIHsKLSAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBydW4gY2FuIGJlIHNwbGl0IGF0IGFy
Yml0cmFyeSBwb3NpdGlvbiBsZXQncyBqdXN0IHJldHVybiB0aGUgZW50aXJlIHJ1biB3aGVuIGl0
IGlzIGludGVuZGVkIHRvIGZpdCBvbiB0aGUgbGluZS4KLSAgICAgICAgICAgICAgICBBU1NFUlQo
aW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGF1dG8gdHJhaWxpbmdQ
YXJ0aWFsUnVuV2lkdGggPSBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0sIGxvZ2ljYWxM
ZWZ0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4geyBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSwg
dHJhaWxpbmdQYXJ0aWFsUnVuV2lkdGggfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlm
ICghKmF2YWlsYWJsZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoIGZvciBj
YXNlcyB3aGVuIHRoZXJlJ3Mgbm8gcm9vbSBhdCBhbGwuIFRoZSBjb250ZW50IGlzIGJyZWFrYWJs
ZSBidXQgd2UgZG9uJ3QgaGF2ZSBzcGFjZSBmb3IgaXQuCi0gICAgICAgICAgICAgICAgcmV0dXJu
IHsgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dG8gc3BsaXREYXRhID0gVGV4dFV0
aWw6OnNwbGl0KGlubGluZVRleHRJdGVtLCBvdmVyZmxvd2luZ1J1bi5sb2dpY2FsV2lkdGgsICph
dmFpbGFibGVXaWR0aCwgbG9naWNhbExlZnQpOwotICAgICAgICAgICAgcmV0dXJuIHsgc3BsaXRE
YXRhLmxlbmd0aCwgc3BsaXREYXRhLmxvZ2ljYWxXaWR0aCB9OwotICAgICAgICB9OwotICAgICAg
ICAvLyBXaXRoIGFyYml0cmFyeSBicmVha2luZyB0aGVyZSdzIGFsd2F5cyBhIHZhbGlkIGJyZWFr
aW5nIHBvc2l0aW9uIChldmVuIGlmIGl0IGlzIGJlZm9yZSB0aGUgZmlyc3QgcG9zaXRpb24pLgot
ICAgICAgICByZXR1cm4gdHJ5QnJlYWtpbmdBdEFyYml0cmFyeVBvc2l0aW9uKCk7Ci0gICAgfQot
ICAgIHJldHVybiB7IH07Ci19Ci0KLXZvaWQgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVv
dXNDb250ZW50OjphcHBlbmQoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsV2lkdGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGNvbGxhcHNp
YmxlV2lkdGgpCi17Ci0gICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGxvZ2ljYWxXaWR0
aCB9KTsKLSAgICBtX2xvZ2ljYWxXaWR0aCA9IGNsYW1wVG88SW5saW5lTGF5b3V0VW5pdD4obV9s
b2dpY2FsV2lkdGggKyBsb2dpY2FsV2lkdGgpOwotICAgIGlmICghY29sbGFwc2libGVXaWR0aCkg
ewotICAgICAgICBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoID0geyB9OwotICAgICAgICByZXR1
cm47Ci0gICAgfQotICAgIGlmICgqY29sbGFwc2libGVXaWR0aCA9PSBsb2dpY2FsV2lkdGgpIHsK
LSAgICAgICAgLy8gRnVsbHkgY29sbGFwc2libGUgcnVuLgotICAgICAgICBtX2NvbGxhcHNpYmxl
TG9naWNhbFdpZHRoICs9IGxvZ2ljYWxXaWR0aDsKLSAgICAgICAgQVNTRVJUKG1fY29sbGFwc2li
bGVMb2dpY2FsV2lkdGggPD0gbV9sb2dpY2FsV2lkdGgpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotICAgIC8vIFBhcnRpYWxseSBjb2xsYXBzaWJsZSBydW4uCi0gICAgbV9jb2xsYXBzaWJsZUxv
Z2ljYWxXaWR0aCA9ICpjb2xsYXBzaWJsZVdpZHRoOwotICAgIEFTU0VSVChtX2NvbGxhcHNpYmxl
TG9naWNhbFdpZHRoIDw9IG1fbG9naWNhbFdpZHRoKTsKLX0KLQotdm9pZCBJbmxpbmVDb250ZW50
QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OnJlc2V0KCkKLXsKLSAgICBtX2xvZ2ljYWxXaWR0
aCA9IHsgfTsKLSAgICBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoID0geyB9OwotICAgIG1fcnVu
cy5jbGVhcigpOwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2VyLmggYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250ZW50QnJlYWtlci5oCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDJkNGQ2Y2U4YzE4OTMxZDVmZThiNTBhMzcz
MDFkNGFjYThlN2Q5Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRlbnRC
cmVha2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNw
cmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNp
bmNsdWRlICJMYXlvdXRVbml0cy5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIFJl
bmRlclN0eWxlOwotCi1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgSW5saW5lSXRlbTsKLXN0
cnVjdCBPdmVyZmxvd2luZ1RleHRDb250ZW50OwotCi1jbGFzcyBJbmxpbmVDb250ZW50QnJlYWtl
ciB7Ci1wdWJsaWM6Ci0gICAgc3RydWN0IFBhcnRpYWxSdW4gewotICAgICAgICBzaXplX3QgbGVu
Z3RoIHsgMCB9OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCB7IDAgfTsK
LSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gaHlwaGVuV2lkdGggeyB9OwotICAg
IH07Ci0gICAgZW51bSBjbGFzcyBJc0VuZE9mTGluZSB7IE5vLCBZZXMgfTsKLSAgICBzdHJ1Y3Qg
UmVzdWx0IHsKLSAgICAgICAgZW51bSBjbGFzcyBBY3Rpb24gewotICAgICAgICAgICAgS2VlcCwg
Ly8gS2VlcCBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAgICAgICBCcmVhaywg
Ly8gUGFydGlhbCBjb250ZW50IGlzIG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAgICAgICBX
cmFwLCAvLyBDb250ZW50IGlzIHdyYXBwZWQgdG8gdGhlIG5leHQgbGluZS4KLSAgICAgICAgICAg
IFdyYXBXaXRoSHlwaGVuLCAvLyBDb250ZW50IGlzIHdyYXBwZWQgdG8gdGhlIG5leHQgbGluZSBh
bmQgdGhlIGN1cnJlbnQgbGluZSBlbmRzIHdpdGggYSB2aXNpYmxlIGh5cGhlbi4KLSAgICAgICAg
ICAgIC8vIFRoZSBjdXJyZW50IGNvbnRlbnQgb3ZlcmZsb3dzIGFuZCBjYW4ndCBnZXQgYnJva2Vu
IHVwIGludG8gc21hbGxlciBiaXRzLgotICAgICAgICAgICAgUmV2ZXJ0VG9MYXN0V3JhcE9wcG9y
dHVuaXR5LCAvLyBUaGUgY29udGVudCBuZWVkcyB0byBiZSByZXZlcnRlZCBiYWNrIHRvIHRoZSBs
YXN0IHdyYXAgb3Bwb3J0dW5pdHkuCi0gICAgICAgICAgICBSZXZlcnRUb0xhc3ROb25PdmVyZmxv
d2luZ1dyYXBPcHBvcnR1bml0eSAvLyBUaGUgY29udGVudCBuZWVkcyB0byBiZSByZXZlcnRlZCBi
YWNrIHRvIGEgd3JhcCBvcHBvcnR1bml0eSB0aGF0IHN0aWxsIGZpdHMgdGhlIGxpbmUuCi0gICAg
ICAgIH07Ci0gICAgICAgIHN0cnVjdCBQYXJ0aWFsVHJhaWxpbmdDb250ZW50IHsKLSAgICAgICAg
ICAgIHNpemVfdCB0cmFpbGluZ1J1bkluZGV4IHsgMCB9OwotICAgICAgICAgICAgT3B0aW9uYWw8
UGFydGlhbFJ1bj4gcGFydGlhbFJ1bjsgLy8gbnVsbG9wdCBwYXJ0aWFsIHJ1biBtZWFucyB0aGUg
dHJhaWxpbmcgcnVuIGlzIGEgY29tcGxldGUgcnVuLgotICAgICAgICB9OwotICAgICAgICBBY3Rp
b24gYWN0aW9uIHsgQWN0aW9uOjpLZWVwIH07Ci0gICAgICAgIElzRW5kT2ZMaW5lIGlzRW5kT2ZM
aW5lIHsgSXNFbmRPZkxpbmU6Ok5vIH07Ci0gICAgICAgIE9wdGlvbmFsPFBhcnRpYWxUcmFpbGlu
Z0NvbnRlbnQ+IHBhcnRpYWxUcmFpbGluZ0NvbnRlbnQgeyB9OwotICAgICAgICBjb25zdCBJbmxp
bmVJdGVtKiBsYXN0V3JhcE9wcG9ydHVuaXR5SXRlbSB7IG51bGxwdHIgfTsKLSAgICB9OwotCi0g
ICAgLy8gVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIGNvbnRpbnVvdXMgY29u
dGVudCBjb21taXR0ZWQgdG8gY29udGVudCBicmVha2luZyBhdCBhIHRpbWUgKG5vIGluLWJldHdl
ZW4gd3JhcCBvcHBvcnR1bml0aWVzKS4KLSAgICAvLyBlLmcuCi0gICAgLy8gPGRpdj50ZXh0IGNv
bnRlbnQgPHNwYW4+c3BhbjE8L3NwYW4+YmV0d2VlbjxzcGFuPnNwYW4yPC9zcGFuPjwvZGl2Pgot
ICAgIC8vIFt0ZXh0XVsgXVtjb250ZW50XVsgXVtpbmxpbmUgYm94IHN0YXJ0XVtzcGFuMV1baW5s
aW5lIGJveCBlbmRdW2JldHdlZW5dW2lubGluZSBib3ggc3RhcnRdW3NwYW4yXVtpbmxpbmUgYm94
IGVuZF0KLSAgICAvLyBjb250aW51b3VzIGNhbmRpZGF0ZSBjb250ZW50IGF0IGEgdGltZToKLSAg
ICAvLyAxLiBbdGV4dF0KLSAgICAvLyAyLiBbIF0KLSAgICAvLyAzLiBbY29udGVudF0KLSAgICAv
LyA0LiBbIF0KLSAgICAvLyA1LiBbaW5saW5lIGJveCBzdGFydF1bc3BhbjFdW2lubGluZSBib3gg
ZW5kXVtiZXR3ZWVuXVtpbmxpbmUgYm94IHN0YXJ0XVtzcGFuMl1baW5saW5lIGJveCBlbmRdCi0g
ICAgLy8gc2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdGV4dC0zLyNsaW5lLWJyZWFr
LWRldGFpbHMKLSAgICBzdHJ1Y3QgQ29udGludW91c0NvbnRlbnQgewotICAgICAgICBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFdpZHRoOyB9
Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgY29sbGFwc2libGVMb2dpY2FsV2lkdGgoKSBjb25z
dCB7IHJldHVybiBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoOyB9Ci0gICAgICAgIElubGluZUxh
eW91dFVuaXQgbm9uQ29sbGFwc2libGVMb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBsb2dp
Y2FsV2lkdGgoKSAtIGNvbGxhcHNpYmxlTG9naWNhbFdpZHRoKCk7IH0KLSAgICAgICAgYm9vbCBo
YXNUcmFpbGluZ0NvbGxhcHNpYmxlQ29udGVudCgpIGNvbnN0IHsgcmV0dXJuICEhY29sbGFwc2li
bGVMb2dpY2FsV2lkdGgoKTsgfQotICAgICAgICBib29sIGlzRnVsbHlDb2xsYXBzaWJsZSgpIGNv
bnN0IHsgcmV0dXJuIGxvZ2ljYWxXaWR0aCgpID09IGNvbGxhcHNpYmxlTG9naWNhbFdpZHRoKCk7
IH0KLQotICAgICAgICB2b2lkIGFwcGVuZChjb25zdCBJbmxpbmVJdGVtJiwgSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsV2lkdGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGNvbGxhcHNpYmxl
V2lkdGgpOwotICAgICAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICAgICAgc3RydWN0IFJ1biB7Ci0g
ICAgICAgICAgICBSdW4oY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNh
bFdpZHRoKTsKLSAgICAgICAgICAgIFJ1bihjb25zdCBSdW4mKTsKLSAgICAgICAgICAgIFJ1biYg
b3BlcmF0b3I9KGNvbnN0IFJ1biYpOwotCi0gICAgICAgICAgICBjb25zdCBJbmxpbmVJdGVtJiBp
bmxpbmVJdGVtOwotICAgICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGggeyAw
IH07Ci0gICAgICAgIH07Ci0gICAgICAgIHVzaW5nIFJ1bkxpc3QgPSBWZWN0b3I8UnVuLCAzPjsK
LSAgICAgICAgY29uc3QgUnVuTGlzdCYgcnVucygpIGNvbnN0IHsgcmV0dXJuIG1fcnVuczsgfQot
Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgUnVuTGlzdCBtX3J1bnM7Ci0gICAgICAgIElubGluZUxh
eW91dFVuaXQgbV9sb2dpY2FsV2lkdGggeyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQg
bV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICB9OwotCi0gICAgc3RydWN0IExp
bmVTdGF0dXMgewotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsUmlnaHQg
eyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGggeyAwIH07Ci0g
ICAgICAgIElubGluZUxheW91dFVuaXQgY29sbGFwc2libGVXaWR0aCB7IDAgfTsKLSAgICAgICAg
T3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGg7Ci0gICAg
ICAgIGJvb2wgaGFzRnVsbHlDb2xsYXBzaWJsZVRyYWlsaW5nUnVuIHsgZmFsc2UgfTsKLSAgICAg
ICAgYm9vbCBoYXNDb250ZW50IHsgZmFsc2UgfTsKLSAgICAgICAgYm9vbCBoYXNXcmFwT3Bwb3J0
dW5pdHlBdFByZXZpb3VzUG9zaXRpb24geyBmYWxzZSB9OwotICAgIH07Ci0gICAgUmVzdWx0IHBy
b2Nlc3NJbmxpbmVDb250ZW50KGNvbnN0IENvbnRpbnVvdXNDb250ZW50JiwgY29uc3QgTGluZVN0
YXR1cyYpOwotICAgIHZvaWQgc2V0SHlwaGVuYXRpb25EaXNhYmxlZCgpIHsgbl9oeXBoZW5hdGlv
bklzRGlzYWJsZWQgPSB0cnVlOyB9Ci0KLSAgICBzdGF0aWMgYm9vbCBpc1dyYXBwaW5nQWxsb3dl
ZChjb25zdCBJbmxpbmVJdGVtJik7Ci0KLXByaXZhdGU6Ci0gICAgUmVzdWx0IHByb2Nlc3NPdmVy
Zmxvd2luZ0NvbnRlbnQoY29uc3QgQ29udGludW91c0NvbnRlbnQmLCBjb25zdCBMaW5lU3RhdHVz
JikgY29uc3Q7Ci0gICAgT3ZlcmZsb3dpbmdUZXh0Q29udGVudCBwcm9jZXNzT3ZlcmZsb3dpbmdD
b250ZW50V2l0aFRleHQoY29uc3QgQ29udGludW91c0NvbnRlbnQmLCBjb25zdCBMaW5lU3RhdHVz
JikgY29uc3Q7Ci0gICAgT3B0aW9uYWw8UGFydGlhbFJ1bj4gdHJ5QnJlYWtpbmdUZXh0UnVuKGNv
bnN0IENvbnRpbnVvdXNDb250ZW50OjpSdW4mIG92ZXJmbG93UnVuLCBJbmxpbmVMYXlvdXRVbml0
IGxvZ2ljYWxMZWZ0LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBhdmFpbGFibGVXaWR0aCwg
Ym9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pIGNvbnN0OwotCi0gICAg
ZW51bSBjbGFzcyBXb3JkQnJlYWtSdWxlIHsKLSAgICAgICAgQXRBcmJpdHJhcnlQb3NpdGlvbiAg
ICAgICAgPSAxIDw8IDAsCi0gICAgICAgIEF0SHlwaGVuYXRpb25PcHBvcnR1bml0aWVzID0gMSA8
PCAxCi0gICAgfTsKLSAgICBPcHRpb25TZXQ8V29yZEJyZWFrUnVsZT4gd29yZEJyZWFrQmVoYXZp
b3IoY29uc3QgUmVuZGVyU3R5bGUmLCBib29sIGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQ
b3NpdGlvbikgY29uc3Q7Ci0gICAgYm9vbCBzaG91bGRLZWVwRW5kT2ZMaW5lV2hpdGVzcGFjZShj
b25zdCBDb250aW51b3VzQ29udGVudCYpIGNvbnN0OwotCi0gICAgYm9vbCBuX2h5cGhlbmF0aW9u
SXNEaXNhYmxlZCB7IGZhbHNlIH07Ci19OwotCi1pbmxpbmUgSW5saW5lQ29udGVudEJyZWFrZXI6
OkNvbnRpbnVvdXNDb250ZW50OjpSdW46OlJ1bihjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVt
LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKLSAgICA6IGlubGluZUl0ZW0oaW5saW5l
SXRlbSkKLSAgICAsIGxvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGgpCi17Ci19Ci0KLWlubGluZSBJ
bmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OlJ1bjo6UnVuKGNvbnN0IFJ1
biYgb3RoZXIpCi0gICAgOiBpbmxpbmVJdGVtKG90aGVyLmlubGluZUl0ZW0pCi0gICAgLCBsb2dp
Y2FsV2lkdGgob3RoZXIubG9naWNhbFdpZHRoKQotewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1h
dHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5n
L0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggYTUxZWFmZmNkYTNlZWNjNDNlMjE1ZDFkOTY0NjEwNmMwY2M1YTk3Mi4uMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5jcHAKKysrIC9kZXYvbnVs
bApAQCAtMSw2MTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAq
IGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNp
bmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9G
T1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGbG9hdGluZ0NvbnRleHQuaCIKLSNpbmNs
dWRlICJGb250Q2FzY2FkZS5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgot
I2luY2x1ZGUgIklubGluZUxpbmVCb3guaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5lUnVuLmgiCi0j
aW5jbHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIKLSNpbmNsdWRlICJJbnZhbGlkYXRpb25TdGF0ZS5o
IgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5o
IgotI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKLSNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29u
dGFpbmluZ0Jsb2NrLmgiCi0jaW5jbHVkZSAiTGF5b3V0SW5saW5lVGV4dEJveC5oIgotI2luY2x1
ZGUgIkxheW91dExpbmVCcmVha0JveC5oIgotI2luY2x1ZGUgIkxheW91dFJlcGxhY2VkQm94Lmgi
Ci0jaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKLSNpbmNsdWRlICJMb2dnaW5nLmgiCi0jaW5jbHVk
ZSAiUnVudGltZUVuYWJsZWRGZWF0dXJlcy5oIgotI2luY2x1ZGUgIlRleHRVdGlsLmgiCi0jaW5j
bHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9UZXh0U3Ry
ZWFtLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1XVEZf
TUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoSW5saW5lRm9ybWF0dGluZ0NvbnRleHQpOwotCi1Jbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDo6SW5saW5lRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFp
bmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIElubGluZUZvcm1hdHRpbmdTdGF0ZSYgZm9y
bWF0dGluZ1N0YXRlKQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHRS
b290LCBmb3JtYXR0aW5nU3RhdGUpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgY29uc3QgQm94KiBu
ZXh0SW5saW5lTGV2ZWxCb3hUb0xheW91dChjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQ29u
dGFpbmVyQm94JiBzdGF5V2l0aGluKQotewotICAgIC8vIEF0b21pYyBpbmxpbmUtbGV2ZWwgYm94
ZXMgYW5kIGZsb2F0cyBhcmUgb3BhcXVlIGJveGVzIG1lYW5pbmcgdGhhdCB0aGV5IGFyZQotICAg
IC8vIHJlc3BvbnNpYmxlIGZvciB0aGVpciBvd24gY29udGVudCAoZG8gbm90IG5lZWQgdG8gZGVz
Y2VuZCBpbnRvIHRoZWlyIHN1YnRyZWVzKS4KLSAgICAvLyBPbmx5IGlubGluZSBib3hlcyBtYXkg
aGF2ZSByZWxldmFudCBkZXNjZW5kYW50IGNvbnRlbnQuCi0gICAgaWYgKGxheW91dEJveC5pc0lu
bGluZUJveCgpKSB7Ci0gICAgICAgIGlmIChpczxDb250YWluZXJCb3g+KGxheW91dEJveCkgJiYg
ZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxvd09yRmxvYXRpbmdDaGls
ZCgpKSB7Ci0gICAgICAgICAgICAvLyBBbm9ueW1vdXMgaW5saW5lIHRleHQgYm94ZXMvbGluZSBi
cmVha3MgY2FuJ3QgaGF2ZSBkZXNjZW5kYW50IGNvbnRlbnQgYnkgZGVmaW5pdGlvbi4KLSAgICAg
ICAgICAgIEFTU0VSVCghbGF5b3V0Qm94LmlzSW5saW5lVGV4dEJveCgpICYmICFsYXlvdXRCb3gu
aXNMaW5lQnJlYWtCb3goKSk7Ci0gICAgICAgICAgICByZXR1cm4gZG93bmNhc3Q8Q29udGFpbmVy
Qm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICBmb3IgKGF1dG8qIG5leHRJblByZU9yZGVyID0gJmxheW91dEJveDsgbmV4
dEluUHJlT3JkZXIgJiYgbmV4dEluUHJlT3JkZXIgIT0gJnN0YXlXaXRoaW47IG5leHRJblByZU9y
ZGVyID0gJm5leHRJblByZU9yZGVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoYXV0byogbmV4
dFNpYmxpbmcgPSBuZXh0SW5QcmVPcmRlci0+bmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkp
Ci0gICAgICAgICAgICByZXR1cm4gbmV4dFNpYmxpbmc7Ci0gICAgfQotICAgIHJldHVybiBudWxs
cHRyOwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRJbkZsb3dDb250
ZW50KEludmFsaWRhdGlvblN0YXRlJiBpbnZhbGlkYXRpb25TdGF0ZSwgY29uc3QgQ29uc3RyYWlu
dHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBMT0dfV0lUSF9TVFJFQU0o
Rm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1N0YXJ0XSAtPiBpbmxpbmUgZm9y
bWF0dGluZyBjb250ZXh0IC0+IGZvcm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsK
LSAgICBBU1NFUlQocm9vdCgpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKTsKLQotICAgIGlu
dmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoaW52YWxpZGF0aW9uU3RhdGUpOwotICAgIGF1dG8qIGxh
eW91dEJveCA9IHJvb3QoKS5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpOwotICAgIC8vIDEu
IFZpc2l0IGVhY2ggaW5saW5lIGJveCBhbmQgcGFydGlhbGx5IGNvbXB1dGUgdGhlaXIgZ2VvbWV0
cnkgKG1hcmdpbnMsIHBhZGRpbmcgYW5kIGJvcmRlcnMpLgotICAgIC8vIDIuIENvbGxlY3QgdGhl
IGlubGluZSBpdGVtcyAoZmxhdHRlbiB0aGUgdGhlIGxheW91dCB0cmVlKSBhbmQgcGxhY2UgdGhl
bSBvbiBsaW5lcyBpbiBiaWRpcmVjdGlvbmFsIG9yZGVyLiAKLSAgICB3aGlsZSAobGF5b3V0Qm94
KSB7Ci0gICAgICAgIEFTU0VSVChsYXlvdXRCb3gtPmlzSW5saW5lTGV2ZWxCb3goKSB8fCBsYXlv
dXRCb3gtPmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpOwotCi0gICAgICAgIGlmIChsYXlvdXRCb3gt
PmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSB8fCBsYXlvdXRCb3gtPmlzRmxvYXRpbmdQb3NpdGlv
bmVkKCkpIHsKLSAgICAgICAgICAgIC8vIElubGluZS1ibG9ja3MsIGlubGluZS10YWJsZXMgYW5k
IHJlcGxhY2VkIGVsZW1lbnRzIChpbWcsIHZpZGVvKSBjYW4gYmUgc2l6ZWQgYnV0IG5vdCB5ZXQg
cG9zaXRpb25lZC4KLSAgICAgICAgICAgIGlmIChpczxDb250YWluZXJCb3g+KGxheW91dEJveCkg
JiYgbGF5b3V0Qm94LT5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpIHsKLSAgICAgICAg
ICAgICAgICBBU1NFUlQobGF5b3V0Qm94LT5pc0lubGluZUJsb2NrQm94KCkgfHwgbGF5b3V0Qm94
LT5pc0lubGluZVRhYmxlQm94KCkgfHwgbGF5b3V0Qm94LT5pc0Zsb2F0aW5nUG9zaXRpb25lZCgp
KTsKLSAgICAgICAgICAgICAgICBhdXRvJiBmb3JtYXR0aW5nUm9vdCA9IGRvd25jYXN0PENvbnRh
aW5lckJveD4oKmxheW91dEJveCk7Ci0gICAgICAgICAgICAgICAgY29tcHV0ZUJvcmRlckFuZFBh
ZGRpbmcoZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwotICAgICAgICAg
ICAgICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbihmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWludHMu
aG9yaXpvbnRhbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ1Jvb3QuaGFzQ2hp
bGQoKSkgewotICAgICAgICAgICAgICAgICAgICBhdXRvIGZvcm1hdHRpbmdDb250ZXh0ID0gTGF5
b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ1Jvb3QsIGxheW91
dFN0YXRlKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0dGluZ1Jvb3QuaGFzSW5G
bG93T3JGbG9hdGluZ0NoaWxkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5n
Q29udGV4dC0+bGF5b3V0SW5GbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnko
KS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoZm9ybWF0dGluZ1Jvb3QpKTsKLSAgICAgICAg
ICAgICAgICAgICAgY29tcHV0ZUhlaWdodEFuZE1hcmdpbihmb3JtYXR0aW5nUm9vdCwgY29uc3Ry
YWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdDb250ZXh0
LT5sYXlvdXRPdXRPZkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBnZW9tZXRyeSgpLmNv
bnN0cmFpbnRzRm9yT3V0T2ZGbG93Q29udGVudChmb3JtYXR0aW5nUm9vdCkpOwotICAgICAgICAg
ICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBjb21wdXRlSGVpZ2h0QW5kTWFyZ2lu
KGZvcm1hdHRpbmdSb290LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICAgICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVwbGFjZWQgYW5kIG90aGVyIHR5cGUgb2YgbGVh
ZiBhdG9taWMgaW5saW5lIGJveGVzLgotICAgICAgICAgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQ
YWRkaW5nKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwotICAgICAgICAgICAg
ICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbigqbGF5b3V0Qm94LCBjb25zdHJhaW50cy5ob3Jpem9u
dGFsKTsKLSAgICAgICAgICAgICAgICBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKCpsYXlvdXRCb3gs
IGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2Ug
aWYgKGxheW91dEJveC0+aXNMaW5lQnJlYWtCb3goKSkgewotICAgICAgICAgICAgYXV0byYgYm94
R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSgqbGF5b3V0Qm94KTsKLSAg
ICAgICAgICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyB9KTsKLSAgICAgICAg
ICAgIGJveEdlb21ldHJ5LnNldEJvcmRlcih7IH0pOwotICAgICAgICAgICAgYm94R2VvbWV0cnku
c2V0UGFkZGluZyh7IH0pOwotICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdp
ZHRoKHsgfSk7Ci0gICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IH0p
OwotICAgICAgICB9IGVsc2UgaWYgKGxheW91dEJveC0+aXNJbmxpbmVCb3goKSkgewotICAgICAg
ICAgICAgLy8gVGV4dCB3cmFwcGVyIGJveGVzIChhbm9ueW1vdXMgaW5saW5lIGxldmVsIGJveGVz
KSBkb24ndCBoYXZlIGJveCBnZW9tZXRyaWVzICh0aGV5IG9ubHkgZ2VuZXJhdGUgcnVucykuCi0g
ICAgICAgICAgICBpZiAoIWxheW91dEJveC0+aXNJbmxpbmVUZXh0Qm94KCkpIHsKLSAgICAgICAg
ICAgICAgICAvLyBJbmxpbmUgYm94ZXMgKDxzcGFuPikgY2FuJ3QgZ2V0IHNpemVkL3Bvc2l0aW9u
ZWQgeWV0LiBBdCB0aGlzIHBvaW50IHdlIGNhbiBvbmx5IGNvbXB1dGUgdGhlaXIgbWFyZ2lucywg
Ym9yZGVycyBhbmQgcGFkZGluZy4KLSAgICAgICAgICAgICAgICBjb21wdXRlQm9yZGVyQW5kUGFk
ZGluZygqbGF5b3V0Qm94LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICAgICAgICAgICAg
ICBjb21wdXRlSG9yaXpvbnRhbE1hcmdpbigqbGF5b3V0Qm94LCBjb25zdHJhaW50cy5ob3Jpem9u
dGFsKTsKLSAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSgqbGF5
b3V0Qm94KS5zZXRWZXJ0aWNhbE1hcmdpbih7IH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9
IGVsc2UKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotCi0gICAgICAgIGxheW91
dEJveCA9IG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KCpsYXlvdXRCb3gsIHJvb3QoKSk7Ci0g
ICAgfQotCi0gICAgY29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgpOwotCi0gICAgYXV0byYg
aW5saW5lSXRlbXMgPSBmb3JtYXR0aW5nU3RhdGUoKS5pbmxpbmVJdGVtcygpOwotICAgIGxpbmVM
YXlvdXQoaW5saW5lSXRlbXMsIHsgMCwgaW5saW5lSXRlbXMuc2l6ZSgpIH0sIGNvbnN0cmFpbnRz
KTsKLSAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8
PCAiW0VuZF0gLT4gaW5saW5lIGZvcm1hdHRpbmcgY29udGV4dCAtPiBmb3JtYXR0aW5nIHJvb3Qo
IiA8PCAmcm9vdCgpIDw8ICIpIik7Ci19Ci0KLXZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6
OmxpbmVMYXlvdXRGb3JJbnRlcmdyYXRpb24oSW52YWxpZGF0aW9uU3RhdGUmIGludmFsaWRhdGlv
blN0YXRlLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQot
ewotICAgIGludmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoaW52YWxpZGF0aW9uU3RhdGUpOwotICAg
IGNvbGxlY3RJbmxpbmVDb250ZW50SWZOZWVkZWQoKTsKLSAgICBhdXRvJiBpbmxpbmVJdGVtcyA9
IGZvcm1hdHRpbmdTdGF0ZSgpLmlubGluZUl0ZW1zKCk7Ci0gICAgbGluZUxheW91dChpbmxpbmVJ
dGVtcywgeyAwLCBpbmxpbmVJdGVtcy5zaXplKCkgfSwgY29uc3RyYWludHMpOwotfQotCi1MYXlv
dXRVbml0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojp1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0
Ci17Ci0gICAgLy8gMTAuNi43ICdBdXRvJyBoZWlnaHRzIGZvciBibG9jayBmb3JtYXR0aW5nIGNv
bnRleHQgcm9vdHMKLQotICAgIC8vIElmIGl0IG9ubHkgaGFzIGlubGluZS1sZXZlbCBjaGlsZHJl
biwgdGhlIGhlaWdodCBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdG9wIG9mIHRoZSB0b3Bt
b3N0IGxpbmUgYm94IGFuZCB0aGUgYm90dG9tIG9mIHRoZSBib3R0b21tb3N0IGxpbmUgYm94Lgot
Ci0gICAgLy8gSW4gYWRkaXRpb24sIGlmIHRoZSBlbGVtZW50IGhhcyBhbnkgZmxvYXRpbmcgZGVz
Y2VuZGFudHMgd2hvc2UgYm90dG9tIG1hcmdpbiBlZGdlIGlzIGJlbG93IHRoZSBlbGVtZW50J3Mg
Ym90dG9tIGNvbnRlbnQgZWRnZSwKLSAgICAvLyB0aGVuIHRoZSBoZWlnaHQgaXMgaW5jcmVhc2Vk
IHRvIGluY2x1ZGUgdGhvc2UgZWRnZXMuIE9ubHkgZmxvYXRzIHRoYXQgcGFydGljaXBhdGUgaW4g
dGhpcyBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgYXJlIHRha2VuCi0gICAgLy8gaW50byBhY2Nv
dW50LCBlLmcuLCBmbG9hdHMgaW5zaWRlIGFic29sdXRlbHkgcG9zaXRpb25lZCBkZXNjZW5kYW50
cyBvciBvdGhlciBmbG9hdHMgYXJlIG5vdC4KLSAgICBhdXRvJiBsaW5lcyA9IGZvcm1hdHRpbmdT
dGF0ZSgpLmxpbmVzKCk7Ci0gICAgLy8gRXZlbiBlbXB0eSBjb250ZW50IGdlbmVyYXRlcyBhIGxp
bmUuCi0gICAgQVNTRVJUKCFsaW5lcy5pc0VtcHR5KCkpOwotICAgIGF1dG8gdG9wID0gTGF5b3V0
VW5pdCB7IGxpbmVzLmZpcnN0KCkubGluZUJveExvZ2ljYWxSZWN0KCkudG9wKCkgfTsKLSAgICBh
dXRvIGJvdHRvbSA9IExheW91dFVuaXQgeyBsaW5lcy5sYXN0KCkubGluZUJveExvZ2ljYWxSZWN0
KCkuYm90dG9tKCkgKyBmb3JtYXR0aW5nU3RhdGUoKS5jbGVhckdhcEFmdGVyTGFzdExpbmUoKSB9
OwotCi0gICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhpcywg
Zm9ybWF0dGluZ1N0YXRlKCkuZmxvYXRpbmdTdGF0ZSgpIH07Ci0gICAgaWYgKGF1dG8gZmxvYXRC
b3R0b20gPSBmbG9hdGluZ0NvbnRleHQuYm90dG9tKCkpIHsKLSAgICAgICAgYm90dG9tID0gc3Rk
OjptYXgoKmZsb2F0Qm90dG9tLCBib3R0b20pOwotICAgICAgICB0b3AgPSBzdGQ6Om1pbigqZmxv
YXRpbmdDb250ZXh0LnRvcCgpLCB0b3ApOwotICAgIH0KLSAgICByZXR1cm4gYm90dG9tIC0gdG9w
OwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpsaW5lTGF5b3V0KElubGluZUl0
ZW1zJiBpbmxpbmVJdGVtcywgTGluZUJ1aWxkZXI6OklubGluZUl0ZW1SYW5nZSBuZWVkc0xheW91
dFJhbmdlLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQot
ewotICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1hdHRpbmdTdGF0ZSgpOwot
ICAgIGZvcm1hdHRpbmdTdGF0ZS5saW5lUnVucygpLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoZm9y
bWF0dGluZ1N0YXRlLmlubGluZUl0ZW1zKCkuc2l6ZSgpKTsKLSAgICBJbmxpbmVMYXlvdXRVbml0
IGxpbmVMb2dpY2FsVG9wID0gY29uc3RyYWludHMudmVydGljYWwubG9naWNhbFRvcDsKLSAgICBz
dHJ1Y3QgUHJldmlvdXNMaW5lIHsKLSAgICAgICAgTGluZUJ1aWxkZXI6OklubGluZUl0ZW1SYW5n
ZSByYW5nZTsKLSAgICAgICAgc2l6ZV90IG92ZXJmbG93Q29udGVudExlbmd0aCB7IDAgfTsKLSAg
ICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gb3ZlcmZsb3dMb2dpY2FsV2lkdGg7Ci0g
ICAgfTsKLSAgICBPcHRpb25hbDxQcmV2aW91c0xpbmU+IHByZXZpb3VzTGluZTsKLSAgICBhdXRv
JiBmbG9hdGluZ1N0YXRlID0gZm9ybWF0dGluZ1N0YXRlLmZsb2F0aW5nU3RhdGUoKTsKLSAgICBh
dXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7ICp0aGlzLCBmbG9hdGluZ1N0
YXRlIH07Ci0gICAgYXV0byBpc0ZpcnN0TGluZSA9IGZvcm1hdHRpbmdTdGF0ZS5saW5lcygpLmlz
RW1wdHkoKTsKLQotICAgIGF1dG8gbGluZUJ1aWxkZXIgPSBMaW5lQnVpbGRlciB7ICp0aGlzLCBm
bG9hdGluZ1N0YXRlLCBjb25zdHJhaW50cy5ob3Jpem9udGFsLCBpbmxpbmVJdGVtcyB9OwotICAg
IHdoaWxlICghbmVlZHNMYXlvdXRSYW5nZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgLy8gVHVybiBw
cmV2aW91cyBsaW5lJ3Mgb3ZlcmZsb3cgY29udGVudCBsZW5ndGggaW50byB0aGUgbmV4dCBsaW5l
J3MgbGVhZGluZyBjb250ZW50IHBhcnRpYWwgbGVuZ3RoLgotICAgICAgICAvLyAic3BbPC1saW5l
IGJyZWFrLT5dbGl0X2NvbnRlbnQiIC0+IG92ZXJmbG93IGxlbmd0aDogMTEgLT4gbGVhZGluZyBw
YXJ0aWFsIGNvbnRlbnQgbGVuZ3RoOiAxMS4KLSAgICAgICAgYXV0byBwYXJ0aWFsTGVhZGluZ0Nv
bnRlbnRMZW5ndGggPSBwcmV2aW91c0xpbmUgPyBwcmV2aW91c0xpbmUtPm92ZXJmbG93Q29udGVu
dExlbmd0aCA6IDA7Ci0gICAgICAgIGF1dG8gbGVhZGluZ0xvZ2ljYWxXaWR0aCA9IHByZXZpb3Vz
TGluZSA/IHByZXZpb3VzTGluZS0+b3ZlcmZsb3dMb2dpY2FsV2lkdGggOiBXVEY6Om51bGxvcHQ7
Ci0gICAgICAgIGF1dG8gaW5pdGlhbExpbmVDb25zdHJhaW50cyA9IElubGluZVJlY3QgeyBsaW5l
TG9naWNhbFRvcCwgY29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dpY2FsTGVmdCwgY29uc3RyYWlu
dHMuaG9yaXpvbnRhbC5sb2dpY2FsV2lkdGgsIHF1aXJrcygpLmluaXRpYWxMaW5lSGVpZ2h0KCkg
fTsKLSAgICAgICAgYXV0byBsaW5lQ29udGVudCA9IGxpbmVCdWlsZGVyLmxheW91dElubGluZUNv
bnRlbnQobmVlZHNMYXlvdXRSYW5nZSwgcGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBsZWFk
aW5nTG9naWNhbFdpZHRoLCBpbml0aWFsTGluZUNvbnN0cmFpbnRzLCBpc0ZpcnN0TGluZSk7Ci0g
ICAgICAgIGF1dG8gbGluZUxvZ2ljYWxSZWN0ID0gY29tcHV0ZUdlb21ldHJ5Rm9yTGluZUNvbnRl
bnQobGluZUNvbnRlbnQsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwotCi0gICAgICAgIGF1dG8g
bGluZUNvbnRlbnRSYW5nZSA9IGxpbmVDb250ZW50LmlubGluZUl0ZW1SYW5nZTsKLSAgICAgICAg
aWYgKCFsaW5lQ29udGVudFJhbmdlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQVNTRVJUKG5l
ZWRzTGF5b3V0UmFuZ2Uuc3RhcnQgPCBsaW5lQ29udGVudFJhbmdlLmVuZCk7Ci0gICAgICAgICAg
ICBpc0ZpcnN0TGluZSA9IGZhbHNlOwotICAgICAgICAgICAgbGluZUxvZ2ljYWxUb3AgPSBnZW9t
ZXRyeSgpLmxvZ2ljYWxUb3BGb3JOZXh0TGluZShsaW5lQ29udGVudCwgbGluZUxvZ2ljYWxSZWN0
LmJvdHRvbSgpLCBmbG9hdGluZ0NvbnRleHQpOwotICAgICAgICAgICAgaWYgKGxpbmVDb250ZW50
LmlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBm
aW5hbCBjb250ZW50IGhlaWdodCBvZiB0aGlzIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgc2hv
dWxkIGluY2x1ZGUgdGhlIGNsZWFyZWQgZmxvYXRzIGFzIHdlbGwuCi0gICAgICAgICAgICAgICAg
Zm9ybWF0dGluZ1N0YXRlLnNldENsZWFyR2FwQWZ0ZXJMYXN0TGluZShsaW5lTG9naWNhbFRvcCAt
IGxpbmVMb2dpY2FsUmVjdC5ib3R0b20oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAv
LyBXaGVuIHRoZSB0cmFpbGluZyBjb250ZW50IGlzIHBhcnRpYWwsIHdlIG5lZWQgdG8gcmV1c2Ug
dGhlIGxhc3QgSW5saW5lVGV4dEl0ZW0uCi0gICAgICAgICAgICBhdXRvIGxhc3RJbmxpbmVJdGVt
TmVlZHNQYXJ0aWFsTGF5b3V0ID0gbGluZUNvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVudExl
bmd0aDsKLSAgICAgICAgICAgIGlmIChsYXN0SW5saW5lSXRlbU5lZWRzUGFydGlhbExheW91dCkg
ewotICAgICAgICAgICAgICAgIGF1dG8gbGluZUxheW91dEhhc0FkdmFuY2VkID0gIXByZXZpb3Vz
TGluZQotICAgICAgICAgICAgICAgICAgICB8fCBsaW5lQ29udGVudFJhbmdlLmVuZCA+IHByZXZp
b3VzTGluZS0+cmFuZ2UuZW5kCi0gICAgICAgICAgICAgICAgICAgIHx8IChwcmV2aW91c0xpbmUt
Pm92ZXJmbG93Q29udGVudExlbmd0aCAmJiBwcmV2aW91c0xpbmUtPm92ZXJmbG93Q29udGVudExl
bmd0aCA+IGxpbmVDb250ZW50LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgpOwotICAgICAg
ICAgICAgICAgIGlmICghbGluZUxheW91dEhhc0FkdmFuY2VkKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG92
ZXIgdG8gdGhlIG5leHQgcnVuIGlmIHdlIGFyZSBzdHVjayBvbiB0aGlzIHBhcnRpYWwgY29udGVu
dCAod2hlbiB0aGUgb3ZlcmZsb3cgY29udGVudCBsZW5ndGggcmVtYWlucyB0aGUgc2FtZSkuCi0g
ICAgICAgICAgICAgICAgICAgIC8vIFdlIGNlcnRhaW5seSBsb3NlIHNvbWUgY29udGVudCwgYnV0
IHdlIHdvdWxkIGJlIGJ1c3kgbG9vcGluZyBvdGhlcndpc2UuCi0gICAgICAgICAgICAgICAgICAg
IGxhc3RJbmxpbmVJdGVtTmVlZHNQYXJ0aWFsTGF5b3V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmVlZHNMYXlvdXRSYW5nZS5zdGFydCA9
IGxhc3RJbmxpbmVJdGVtTmVlZHNQYXJ0aWFsTGF5b3V0ID8gbGluZUNvbnRlbnRSYW5nZS5lbmQg
LSAxIDogbGluZUNvbnRlbnRSYW5nZS5lbmQ7Ci0gICAgICAgICAgICBwcmV2aW91c0xpbmUgPSBQ
cmV2aW91c0xpbmUgeyBsaW5lQ29udGVudFJhbmdlLCBsaW5lQ29udGVudC5wYXJ0aWFsVHJhaWxp
bmdDb250ZW50TGVuZ3RoLCBsaW5lQ29udGVudC5vdmVyZmxvd0xvZ2ljYWxXaWR0aCB9OwotICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRmxvYXRzIHByZXZlbnRl
ZCB1cyBwbGFjaW5nIGFueSBjb250ZW50IG9uIHRoZSBsaW5lLgotICAgICAgICBBU1NFUlQobGlu
ZUNvbnRlbnQucnVucy5pc0VtcHR5KCkpOwotICAgICAgICBBU1NFUlQobGluZUNvbnRlbnQuaGFz
SW50cnVzaXZlRmxvYXQpOwotICAgICAgICAvLyBNb3ZlIHRoZSBuZXh0IGxpbmUgYmVsb3cgdGhl
IGludHJ1c2l2ZSBmbG9hdC4KLSAgICAgICAgYXV0byBmbG9hdENvbnN0cmFpbnRzID0gZmxvYXRp
bmdDb250ZXh0LmNvbnN0cmFpbnRzKHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFRvcCksIHRvTGF5
b3V0VW5pdChsaW5lTG9naWNhbFJlY3QuYm90dG9tKCkpKTsKLSAgICAgICAgQVNTRVJUKGZsb2F0
Q29uc3RyYWludHMubGVmdCB8fCBmbG9hdENvbnN0cmFpbnRzLnJpZ2h0KTsKLSAgICAgICAgc3Rh
dGljIGF1dG8gaW5pZml0ZVBvaW50ID0gUG9pbnRJbkNvbnRleHRSb290OjptYXgoKTsKLSAgICAg
ICAgLy8gSW4gY2FzZSBvZiBsZWZ0IGFuZCByaWdodCBjb25zdHJhaW50cywgd2UgbmVlZCB0byBw
aWNrIHRoZSBvbmUgdGhhdCdzIGNsb3NlciB0byB0aGUgY3VycmVudCBsaW5lLgotICAgICAgICBs
aW5lTG9naWNhbFRvcCA9IHN0ZDo6bWluKGZsb2F0Q29uc3RyYWludHMubGVmdC52YWx1ZU9yKGlu
aWZpdGVQb2ludCkueSwgZmxvYXRDb25zdHJhaW50cy5yaWdodC52YWx1ZU9yKGluaWZpdGVQb2lu
dCkueSk7Ci0gICAgICAgIEFTU0VSVChsaW5lTG9naWNhbFRvcCA8IGluaWZpdGVQb2ludC55KTsK
LSAgICB9Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
IElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMoKQotewotICAgIGF1dG8mIGxheW91dFN0YXRlID0gdGhpcy0+bGF5b3V0U3RhdGUoKTsKLSAg
ICBBU1NFUlQoIWZvcm1hdHRpbmdTdGF0ZSgpLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSk7
Ci0KLSAgICBpZiAoIXJvb3QoKS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkgewotICAgICAg
ICBhdXRvIGNvbnN0cmFpbnRzID0gZ2VvbWV0cnkoKS5jb25zdHJhaW5CeU1pbk1heFdpZHRoKHJv
b3QoKSwgeyB9KTsKLSAgICAgICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0SW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyhjb25zdHJhaW50cyk7Ci0gICAgICAgIHJldHVybiBjb25zdHJhaW50czsKLSAg
ICB9Ci0KLSAgICBWZWN0b3I8Y29uc3QgQm94Kj4gZm9ybWF0dGluZ0NvbnRleHRSb290TGlzdDsK
LSAgICBhdXRvIGhvcml6b250YWxDb25zdHJhaW50cyA9IEhvcml6b250YWxDb25zdHJhaW50cyB7
IDBfbHUsIDBfbHUgfTsKLSAgICBhdXRvKiBsYXlvdXRCb3ggPSByb290KCkuZmlyc3RJbkZsb3dP
ckZsb2F0aW5nQ2hpbGQoKTsKLSAgICAvLyBJbiBvcmRlciB0byBjb21wdXRlIHRoZSBtYXgvbWlu
IHdpZHRocywgd2UgbmVlZCB0byBjb21wdXRlIG1hcmdpbnMsIGJvcmRlcnMgYW5kIHBhZGRpbmcg
Zm9yIGNlcnRhaW4gaW5saW5lIGJveGVzIGZpcnN0LgotICAgIHdoaWxlIChsYXlvdXRCb3gpIHsK
LSAgICAgICAgaWYgKGxheW91dEJveC0+aXNJbmxpbmVUZXh0Qm94KCkpIHsKLSAgICAgICAgICAg
IGxheW91dEJveCA9IG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KCpsYXlvdXRCb3gsIHJvb3Qo
KSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGF5b3V0
Qm94LT5pc1JlcGxhY2VkQm94KCkpIHsKLSAgICAgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRk
aW5nKCpsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgICAgICAgICBjb21w
dXRlV2lkdGhBbmRNYXJnaW4oKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAg
ICAgICAgfSBlbHNlIGlmIChsYXlvdXRCb3gtPmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkgfHwgbGF5
b3V0Qm94LT5pc0F0b21pY0lubGluZUxldmVsQm94KCkpIHsKLSAgICAgICAgICAgIEFTU0VSVChs
YXlvdXRCb3gtPmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7Ci0gICAgICAgICAgICBm
b3JtYXR0aW5nQ29udGV4dFJvb3RMaXN0LmFwcGVuZChsYXlvdXRCb3gpOwotCi0gICAgICAgICAg
ICBjb21wdXRlQm9yZGVyQW5kUGFkZGluZygqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWlu
dHMpOwotICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxNYXJnaW4oKmxheW91dEJveCwgaG9y
aXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgICAgIGNvbXB1dGVJbnRyaW5zaWNXaWR0aEZv
ckZvcm1hdHRpbmdSb290KCpsYXlvdXRCb3gpOwotICAgICAgICB9IGVsc2UgaWYgKGxheW91dEJv
eC0+aXNJbmxpbmVCb3goKSkgewotICAgICAgICAgICAgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmco
KmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgICAgIGNvbXB1dGVI
b3Jpem9udGFsTWFyZ2luKCpsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAg
ICAgIH0gZWxzZQotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIGxh
eW91dEJveCA9IG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KCpsYXlvdXRCb3gsIHJvb3QoKSk7
Ci0gICAgfQotCi0gICAgY29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgpOwotCi0gICAgYXV0
byBtYXhpbXVtTGluZVdpZHRoID0gWyZdKGF1dG8gYXZhaWxhYmxlV2lkdGgpIHsKLSAgICAgICAg
Ly8gU3dpdGNoIHRvIHRoZSBtaW4vbWF4IGZvcm1hdHRpbmcgcm9vdCB3aWR0aCB2YWx1ZXMgYmVm
b3JlIGZvcm1hdHRpbmcgdGhlIGxpbmVzLgotICAgICAgICBmb3IgKGF1dG8qIGZvcm1hdHRpbmdS
b290IDogZm9ybWF0dGluZ0NvbnRleHRSb290TGlzdCkgewotICAgICAgICAgICAgYXV0byBpbnRy
aW5zaWNXaWR0aHMgPSBsYXlvdXRTdGF0ZS5mb3JtYXR0aW5nU3RhdGVGb3JCb3goKmZvcm1hdHRp
bmdSb290KS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KCpmb3JtYXR0aW5nUm9vdCk7
Ci0gICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdl
b21ldHJ5KCpmb3JtYXR0aW5nUm9vdCk7Ci0gICAgICAgICAgICBhdXRvIGNvbnRlbnRXaWR0aCA9
IChhdmFpbGFibGVXaWR0aCA/IGludHJpbnNpY1dpZHRocy0+bWF4aW11bSA6IGludHJpbnNpY1dp
ZHRocy0+bWluaW11bSkgLSBib3hHZW9tZXRyeS5ob3Jpem9udGFsTWFyZ2luQm9yZGVyQW5kUGFk
ZGluZygpOwotICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGNvbnRl
bnRXaWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXB1dGVkSW50cmluc2ljV2lk
dGhGb3JDb25zdHJhaW50KGF2YWlsYWJsZVdpZHRoKTsKLSAgICB9OwotCi0gICAgYXV0byBtaW5p
bXVtQ29udGVudFdpZHRoID0gY2VpbGVkTGF5b3V0VW5pdChtYXhpbXVtTGluZVdpZHRoKDApKTsK
LSAgICBhdXRvIG1heGltdW1Db250ZW50V2lkdGggPSBjZWlsZWRMYXlvdXRVbml0KG1heGltdW1M
aW5lV2lkdGgobWF4SW5saW5lTGF5b3V0VW5pdCgpKSk7Ci0gICAgYXV0byBjb25zdHJhaW50cyA9
IGdlb21ldHJ5KCkuY29uc3RyYWluQnlNaW5NYXhXaWR0aChyb290KCksIHsgbWluaW11bUNvbnRl
bnRXaWR0aCwgbWF4aW11bUNvbnRlbnRXaWR0aCB9KTsKLSAgICBmb3JtYXR0aW5nU3RhdGUoKS5z
ZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKTsKLSAgICByZXR1cm4gY29u
c3RyYWludHM7Ci19Ci0KLUlubGluZUxheW91dFVuaXQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6
OmNvbXB1dGVkSW50cmluc2ljV2lkdGhGb3JDb25zdHJhaW50KElubGluZUxheW91dFVuaXQgYXZh
aWxhYmxlV2lkdGgpIGNvbnN0Ci17Ci0gICAgYXV0byYgaW5saW5lSXRlbXMgPSBmb3JtYXR0aW5n
U3RhdGUoKS5pbmxpbmVJdGVtcygpOwotICAgIGF1dG8gbGluZUJ1aWxkZXIgPSBMaW5lQnVpbGRl
ciB7ICp0aGlzLCBpbmxpbmVJdGVtcyB9OwotICAgIGF1dG8gbGF5b3V0UmFuZ2UgPSBMaW5lQnVp
bGRlcjo6SW5saW5lSXRlbVJhbmdlIHsgMCAsIGlubGluZUl0ZW1zLnNpemUoKSB9OwotICAgIGF1
dG8gbWF4aW11bUxpbmVXaWR0aCA9IElubGluZUxheW91dFVuaXQgeyB9OwotICAgIGF1dG8gbWF4
aW11bUZsb2F0V2lkdGggPSBMYXlvdXRVbml0IHsgfTsKLSAgICB3aGlsZSAoIWxheW91dFJhbmdl
LmlzRW1wdHkoKSkgewotICAgICAgICBhdXRvIGludHJpbnNpY0NvbnRlbnQgPSBsaW5lQnVpbGRl
ci5jb21wdXRlZEludHJpbnNpY1dpZHRoKGxheW91dFJhbmdlLCBhdmFpbGFibGVXaWR0aCk7Ci0g
ICAgICAgIGxheW91dFJhbmdlLnN0YXJ0ID0gaW50cmluc2ljQ29udGVudC5pbmxpbmVJdGVtUmFu
Z2UuZW5kOwotICAgICAgICBtYXhpbXVtTGluZVdpZHRoID0gc3RkOjptYXgobWF4aW11bUxpbmVX
aWR0aCwgaW50cmluc2ljQ29udGVudC5sb2dpY2FsV2lkdGgpOwotICAgICAgICAvLyBGSVhNRTog
QWRkIHN1cHBvcnQgZm9yIGNsZWFyLgotICAgICAgICBmb3IgKGF1dG8qIGZsb2F0Qm94IDogaW50
cmluc2ljQ29udGVudC5mbG9hdHMpCi0gICAgICAgICAgICBtYXhpbXVtRmxvYXRXaWR0aCArPSBn
ZW9tZXRyeUZvckJveCgqZmxvYXRCb3gpLm1hcmdpbkJveFdpZHRoKCk7Ci0gICAgfQotICAgIHJl
dHVybiBtYXhpbXVtTGluZVdpZHRoICsgbWF4aW11bUZsb2F0V2lkdGg7Ci19Ci0KLXZvaWQgSW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVJbnRyaW5zaWNXaWR0aEZvckZvcm1hdHRpbmdS
b290KGNvbnN0IEJveCYgZm9ybWF0dGluZ1Jvb3QpCi17Ci0gICAgQVNTRVJUKGZvcm1hdHRpbmdS
b290LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7Ci0gICAgYXV0byBjb25zdHJhaW50
cyA9IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9OwotICAgIGlmIChhdXRvIGZpeGVkV2lk
dGggPSBnZW9tZXRyeSgpLmZpeGVkVmFsdWUoZm9ybWF0dGluZ1Jvb3Quc3R5bGUoKS5sb2dpY2Fs
V2lkdGgoKSkpCi0gICAgICAgIGNvbnN0cmFpbnRzID0geyAqZml4ZWRXaWR0aCwgKmZpeGVkV2lk
dGggfTsKLSAgICBlbHNlIHsKLSAgICAgICAgYXV0byBoYXNJbmZsb3dPckZsb2F0aW5nQ29udGVu
dCA9IGlzPENvbnRhaW5lckJveD4oZm9ybWF0dGluZ1Jvb3QpICYmIGRvd25jYXN0PENvbnRhaW5l
ckJveD4oZm9ybWF0dGluZ1Jvb3QpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpOwotICAgICAg
ICAvLyBUaGUgaW50cmluc2ljIHNpemVzIG9mIHRoZSBzaXplIGNvbnRhaW5tZW50IGJveCBhcmUg
ZGV0ZXJtaW5lZCBhcyBpZiB0aGUgZWxlbWVudCBoYWQgbm8gY29udGVudC4KLSAgICAgICAgYXV0
byBzaG91bGRJZ25vcmVDaGlsZENvbnRlbnQgPSBmb3JtYXR0aW5nUm9vdC5pc1NpemVDb250YWlu
bWVudEJveCgpOwotICAgICAgICBpZiAoaGFzSW5mbG93T3JGbG9hdGluZ0NvbnRlbnQgJiYgIXNo
b3VsZElnbm9yZUNoaWxkQ29udGVudCkKLSAgICAgICAgICAgIGNvbnN0cmFpbnRzID0gTGF5b3V0
Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZG93bmNhc3Q8Q29udGFpbmVyQm94Pihm
b3JtYXR0aW5nUm9vdCksIGxheW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMoKTsKLSAgICB9Ci0gICAgY29uc3RyYWludHMgPSBnZW9tZXRyeSgpLmNvbnN0cmFp
bkJ5TWluTWF4V2lkdGgoZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzKTsKLSAgICBjb25zdHJh
aW50cy5leHBhbmQoZ2VvbWV0cnlGb3JCb3goZm9ybWF0dGluZ1Jvb3QpLmhvcml6b250YWxNYXJn
aW5Cb3JkZXJBbmRQYWRkaW5nKCkpOwotICAgIGZvcm1hdHRpbmdTdGF0ZSgpLnNldEludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHNGb3JCb3goZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzKTsKLX0K
LQotdm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUhvcml6b250YWxNYXJnaW4o
Y29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpv
bnRhbENvbnN0cmFpbnRzKQotewotICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0g
Z2VvbWV0cnkoKS5jb21wdXRlZEhvcml6b250YWxNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFs
Q29uc3RyYWludHMpOwotICAgIGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJv
eCkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52
YWx1ZU9yKDApLCBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMCkgfSk7Ci19
Ci0KLXZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVXaWR0aEFuZE1hcmdpbihj
b25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9u
dGFsQ29uc3RyYWludHMpCi17Ci0gICAgYXV0byBjb21wdXRlID0gWyZdKE9wdGlvbmFsPExheW91
dFVuaXQ+IHVzZWRXaWR0aCkgewotICAgICAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3Np
dGlvbmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5mbG9hdGluZ0NvbnRlbnRX
aWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgeyB1c2VkV2lk
dGgsIHsgfSB9KTsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc0lubGluZUJsb2NrQm94KCkpCi0g
ICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbmxpbmVCbG9ja0NvbnRlbnRXaWR0aEFuZE1h
cmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgeyB1c2VkV2lkdGgsIHsgfSB9
KTsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0gICAgICAgICAgICBy
ZXR1cm4gZ2VvbWV0cnkoKS5pbmxpbmVSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihkb3du
Y2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IH0s
IHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAg
ICAgICByZXR1cm4gQ29udGVudFdpZHRoQW5kTWFyZ2luIHsgfTsKLSAgICB9OwotCi0gICAgYXV0
byBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBjb21wdXRlKHsgfSk7Ci0KLSAgICBhdXRvIGF2YWls
YWJsZVdpZHRoID0gaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAgICBpZiAo
YXV0byBtYXhXaWR0aCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhXaWR0aChsYXlvdXRCb3gsIGF2
YWlsYWJsZVdpZHRoKSkgewotICAgICAgICBhdXRvIG1heFdpZHRoQW5kTWFyZ2luID0gY29tcHV0
ZShtYXhXaWR0aCk7Ci0gICAgICAgIGlmIChjb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdp
ZHRoID4gbWF4V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQotICAgICAgICAgICAgY29udGVu
dFdpZHRoQW5kTWFyZ2luID0gbWF4V2lkdGhBbmRNYXJnaW47Ci0gICAgfQotCi0gICAgYXV0byBt
aW5XaWR0aCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNaW5XaWR0aChsYXlvdXRCb3gsIGF2YWlsYWJs
ZVdpZHRoKS52YWx1ZU9yKDApOwotICAgIGF1dG8gbWluV2lkdGhBbmRNYXJnaW4gPSBjb21wdXRl
KG1pbldpZHRoKTsKLSAgICBpZiAoY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA8
IG1pbldpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkKLSAgICAgICAgY29udGVudFdpZHRoQW5k
TWFyZ2luID0gbWluV2lkdGhBbmRNYXJnaW47Ci0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZv
cm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgYm94R2VvbWV0cnku
c2V0Q29udGVudEJveFdpZHRoKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOwot
ICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyBjb250ZW50V2lkdGhBbmRNYXJn
aW4udXNlZE1hcmdpbi5zdGFydCwgY29udGVudFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5k
IH0pOwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlSGVpZ2h0QW5k
TWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMm
IGhvcml6b250YWxDb25zdHJhaW50cykKLXsKLSAgICBhdXRvIGNvbXB1dGUgPSBbJl0oT3B0aW9u
YWw8TGF5b3V0VW5pdD4gdXNlZEhlaWdodCkgewotICAgICAgICBpZiAobGF5b3V0Qm94LmlzRmxv
YXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5mbG9hdGlu
Z0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMs
IHsgdXNlZEhlaWdodCB9KTsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc0lubGluZUJsb2NrQm94
KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbmxpbmVCbG9ja0NvbnRlbnRIZWln
aHRBbmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIHsgdXNlZEhlaWdo
dCB9KTsKLSAgICAgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0gICAgICAgICAg
ICByZXR1cm4gZ2VvbWV0cnkoKS5pbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4o
ZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywg
eyB9LCB7IHVzZWRIZWlnaHQgfSk7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAg
ICAgICByZXR1cm4gQ29udGVudEhlaWdodEFuZE1hcmdpbiB7IH07Ci0gICAgfTsKLQotICAgIGF1
dG8gY29udGVudEhlaWdodEFuZE1hcmdpbiA9IGNvbXB1dGUoeyB9KTsKLSAgICBpZiAoYXV0byBt
YXhIZWlnaHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWF4SGVpZ2h0KGxheW91dEJveCkpIHsKLSAg
ICAgICAgYXV0byBtYXhIZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRlKG1heEhlaWdodCk7Ci0gICAg
ICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPiBtYXhIZWlnaHRB
bmRNYXJnaW4uY29udGVudEhlaWdodCkKLSAgICAgICAgICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJn
aW4gPSBtYXhIZWlnaHRBbmRNYXJnaW47Ci0gICAgfQotCi0gICAgaWYgKGF1dG8gbWluSGVpZ2h0
ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbkhlaWdodChsYXlvdXRCb3gpKSB7Ci0gICAgICAgIGF1
dG8gbWluSGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZShtaW5IZWlnaHQpOwotICAgICAgICBpZiAo
Y29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0IDwgbWluSGVpZ2h0QW5kTWFyZ2lu
LmNvbnRlbnRIZWlnaHQpCi0gICAgICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gbWlu
SGVpZ2h0QW5kTWFyZ2luOwotICAgIH0KLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRp
bmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgYm94R2VvbWV0cnkuc2V0Q29u
dGVudEJveEhlaWdodChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpOwotICAg
IGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgY29udGVudEhlaWdodEFuZE1hcmdpbi5u
b25Db2xsYXBzZWRNYXJnaW4uYmVmb3JlLCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxh
cHNlZE1hcmdpbi5hZnRlciB9KTsKLX0KLQotdm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6
Y29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgpCi17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0
YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgaWYgKCFmb3JtYXR0aW5nU3RhdGUu
aW5saW5lSXRlbXMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAvLyBUcmF2ZXJz
ZSB0aGUgdHJlZSBhbmQgY3JlYXRlIGlubGluZSBpdGVtcyBvdXQgb2YgaW5saW5lIGJveGVzIGFu
ZCBsZWFmIG5vZGVzLiBUaGlzIGVzc2VudGlhbGx5IHR1cm5zIHRoZSB0cmVlIGlubGluZSBzdHJ1
Y3R1cmUgaW50byBhIGZsYXQgb25lLgotICAgIC8vIDxzcGFuPnRleHQ8c3Bhbj48L3NwYW4+PGlt
Zz48L3NwYW4+IC0+IFtJbmxpbmVCb3hTdGFydF1bSW5saW5lTGV2ZWxCb3hdW0lubGluZUJveFN0
YXJ0XVtJbmxpbmVCb3hFbmRdW0lubGluZUxldmVsQm94XVtJbmxpbmVCb3hFbmRdCi0gICAgQVNT
RVJUKHJvb3QoKS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7Ci0gICAgTGF5b3V0UXVldWUg
bGF5b3V0UXVldWU7Ci0gICAgbGF5b3V0UXVldWUuYXBwZW5kKHJvb3QoKS5maXJzdEluRmxvd09y
RmxvYXRpbmdDaGlsZCgpKTsKLSAgICB3aGlsZSAoIWxheW91dFF1ZXVlLmlzRW1wdHkoKSkgewot
ICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKmxh
eW91dFF1ZXVlLmxhc3QoKTsKLSAgICAgICAgICAgIGF1dG8gaXNCb3hXaXRoSW5saW5lQ29udGVu
dCA9IGxheW91dEJveC5pc0lubGluZUJveCgpICYmICFsYXlvdXRCb3guaXNJbmxpbmVUZXh0Qm94
KCkgJiYgIWxheW91dEJveC5pc0xpbmVCcmVha0JveCgpOwotICAgICAgICAgICAgaWYgKCFpc0Jv
eFdpdGhJbmxpbmVDb250ZW50KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
Ly8gVGhpcyBpcyB0aGUgc3RhcnQgb2YgYW4gaW5saW5lIGJveCAoZS5nLiA8c3Bhbj4pLgotICAg
ICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZElubGluZUl0ZW0oeyBsYXlvdXRCb3gsIElubGlu
ZUl0ZW06OlR5cGU6OklubGluZUJveFN0YXJ0IH0pOwotICAgICAgICAgICAgYXV0byYgaW5saW5l
Qm94V2l0aElubGluZUNvbnRlbnQgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7
Ci0gICAgICAgICAgICBpZiAoIWlubGluZUJveFdpdGhJbmxpbmVDb250ZW50Lmhhc0luRmxvd09y
RmxvYXRpbmdDaGlsZCgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgbGF5
b3V0UXVldWUuYXBwZW5kKGlubGluZUJveFdpdGhJbmxpbmVDb250ZW50LmZpcnN0SW5GbG93T3JG
bG9hdGluZ0NoaWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFsYXlvdXRRdWV1
ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9ICpsYXlvdXRRdWV1
ZS50YWtlTGFzdCgpOwotICAgICAgICAgICAgaWYgKGlzPExpbmVCcmVha0JveD4obGF5b3V0Qm94
KSkgewotICAgICAgICAgICAgICAgIGF1dG8mIGxpbmVCcmVha0JveCA9IGRvd25jYXN0PExpbmVC
cmVha0JveD4obGF5b3V0Qm94KTsKLSAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRk
SW5saW5lSXRlbSh7IGxheW91dEJveCwgbGluZUJyZWFrQm94LmlzT3B0aW9uYWwoKSA/IElubGlu
ZUl0ZW06OlR5cGU6OldvcmRCcmVha09wcG9ydHVuaXR5IDogSW5saW5lSXRlbTo6VHlwZTo6SGFy
ZExpbmVCcmVhayB9KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LmlzRmxvYXRp
bmdQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZElubGlu
ZUl0ZW0oeyBsYXlvdXRCb3gsIElubGluZUl0ZW06OlR5cGU6OkZsb2F0IH0pOwotICAgICAgICAg
ICAgZWxzZSBpZiAobGF5b3V0Qm94LmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSkKLSAgICAgICAg
ICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkSW5saW5lSXRlbSh7IGxheW91dEJveCwgSW5saW5l
SXRlbTo6VHlwZTo6Qm94IH0pOwotICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0Qm94LmlzSW5s
aW5lVGV4dEJveCgpKSB7Ci0gICAgICAgICAgICAgICAgSW5saW5lVGV4dEl0ZW06OmNyZWF0ZUFu
ZEFwcGVuZFRleHRJdGVtcyhmb3JtYXR0aW5nU3RhdGUuaW5saW5lSXRlbXMoKSwgZG93bmNhc3Q8
SW5saW5lVGV4dEJveD4obGF5b3V0Qm94KSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxheW91
dEJveC5pc0lubGluZUJveCgpKQotICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRJ
bmxpbmVJdGVtKHsgbGF5b3V0Qm94LCBJbmxpbmVJdGVtOjpUeXBlOjpJbmxpbmVCb3hFbmQgfSk7
Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
Ci0KLSAgICAgICAgICAgIGlmIChhdXRvKiBuZXh0U2libGluZyA9IGxheW91dEJveC5uZXh0SW5G
bG93T3JGbG9hdGluZ1NpYmxpbmcoKSkgewotICAgICAgICAgICAgICAgIGxheW91dFF1ZXVlLmFw
cGVuZChuZXh0U2libGluZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLUlubGluZVJlY3QgSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQ6OmNvbXB1dGVHZW9tZXRyeUZvckxpbmVDb250ZW50KGNvbnN0IExpbmVCdWlsZGVyOjpMaW5l
Q29udGVudCYgbGluZUNvbnRlbnQsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpv
bnRhbENvbnN0cmFpbnRzKQotewotICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZv
cm1hdHRpbmdTdGF0ZSgpOwotICAgIGF1dG8gZ2VvbWV0cnkgPSB0aGlzLT5nZW9tZXRyeSgpOwot
Ci0gICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVCb3goZ2VvbWV0cnkubGluZUJveEZvckxpbmVD
b250ZW50KGxpbmVDb250ZW50KSk7Ci0gICAgY29uc3QgYXV0byYgbGluZUJveCA9IGZvcm1hdHRp
bmdTdGF0ZS5saW5lQm94ZXMoKS5sYXN0KCk7Ci0gICAgYXV0byBsaW5lSW5kZXggPSBmb3JtYXR0
aW5nU3RhdGUubGluZXMoKS5zaXplKCk7Ci0gICAgYXV0byYgbGluZUJveExvZ2ljYWxSZWN0ID0g
bGluZUJveC5sb2dpY2FsUmVjdCgpOwotICAgIGlmICghbGluZUJveC5oYXNDb250ZW50KCkpIHsK
LSAgICAgICAgLy8gRmFzdCBwYXRoIGZvciBsaW5lcyB3aXRoIG5vIGNvbnRlbnQgZS5nLiA8ZGl2
PjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PC9kaXY+IG9yIDxzcGFuPjxkaXY+PC9kaXY+PC9z
cGFuPiB3aGVyZSB3ZSBjb25zdHJ1Y3QgZW1wdHkgcHJlIGFuZCBwb3N0IGJsb2Nrcy4KLSAgICAg
ICAgQVNTRVJUKCFsaW5lQm94LmNvbnRlbnRMb2dpY2FsV2lkdGgoKSAmJiAhbGluZUJveExvZ2lj
YWxSZWN0LmhlaWdodCgpKTsKLSAgICAgICAgYXV0byB1cGRhdGVJbmxpbmVCb3hlc0dlb21ldHJ5
SWZBcHBsaWNhYmxlID0gWyZdIHsKLSAgICAgICAgICAgIGlmICghbGluZUJveC5oYXNJbmxpbmVC
b3goKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBWZWN0b3I8Y29uc3Qg
Qm94Kj4gbGF5b3V0Qm94TGlzdDsKLSAgICAgICAgICAgIC8vIENvbGxlY3QgdGhlIGVtcHR5IGlu
bGluZSBib3hlcyB0aGF0IHNob3dlZCB1cCBmaXJzdCBvbiB0aGlzIGxpbmUuCi0gICAgICAgICAg
ICAvLyBOb3RlIHRoYXQgYW4gaW5saW5lIGJveCBlbmQgb24gYW4gZW1wdHkgbGluZSBkb2VzIG5v
dCBtYWtlIHRoZSBpbmxpbmUgYm94IHRhbGxlci4KLSAgICAgICAgICAgIC8vIChlLmcuIDxkaXY+
dGV4dDxzcGFuPjxicj48L3NwYW4+PC9kaXY+KSA8LSB0aGUgPHNwYW4+IGlubGluZSBib3ggaXMg
YXMgdGFsbCBhcyB0aGUgbGluZSBldmVuIHRob3VnaCB0aGUgPC9zcGFuPiBpcyBhZnRlciBhIDxi
cj4gc28gdGVjaG5pY2FsbHkgaXMgb24gdGhlIGZvbGxvd2luZyAoZW1wdHkpbGluZS4KLSAgICAg
ICAgICAgIGZvciAoYXV0byYgbGluZVJ1biA6IGxpbmVDb250ZW50LnJ1bnMpIHsKLSAgICAgICAg
ICAgICAgICBpZiAobGluZVJ1bi5pc0lubGluZUJveFN0YXJ0KCkpCi0gICAgICAgICAgICAgICAg
ICAgIGxheW91dEJveExpc3QuYXBwZW5kKCZsaW5lUnVuLmxheW91dEJveCgpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGZvciAoYXV0byogbGF5b3V0Qm94IDogbGF5b3V0Qm94TGlzdCkg
ewotICAgICAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJv
eEdlb21ldHJ5KCpsYXlvdXRCb3gpOwotICAgICAgICAgICAgICAgIGF1dG8gaW5saW5lQm94TG9n
aWNhbEhlaWdodCA9IExheW91dFVuaXQ6OmZyb21GbG9hdENlaWwobGluZUJveC5sb2dpY2FsQm9y
ZGVyQm94Rm9ySW5saW5lQm94KCpsYXlvdXRCb3gsIGJveEdlb21ldHJ5KS5oZWlnaHQoKSk7Ci0g
ICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodChpbmxpbmVCb3hM
b2dpY2FsSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94
V2lkdGgoeyB9KTsKLSAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVm
dCh0b0xheW91dFBvaW50KGxpbmVCb3hMb2dpY2FsUmVjdC50b3BMZWZ0KCkpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgdXBkYXRlSW5saW5lQm94ZXNHZW9tZXRyeUlmQXBw
bGljYWJsZSgpOwotICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZSh7IGxpbmVCb3hMb2dp
Y2FsUmVjdCwgeyB7IH0sIHsgfSB9LCB7IH0sIHsgfSwgeyB9IH0pOwotICAgICAgICByZXR1cm4g
bGluZUJveExvZ2ljYWxSZWN0OwotICAgIH0KLQotICAgIGF1dG8gcm9vdElubGluZUJveExvZ2lj
YWxSZWN0ID0gbGluZUJveC5sb2dpY2FsUmVjdEZvclJvb3RJbmxpbmVCb3goKTsKLSAgICBhdXRv
IGVuY2xvc2luZ1RvcEFuZEJvdHRvbSA9IElubGluZUxpbmVHZW9tZXRyeTo6RW5jbG9zaW5nVG9w
QW5kQm90dG9tIHsgcm9vdElubGluZUJveExvZ2ljYWxSZWN0LnRvcCgpLCByb290SW5saW5lQm94
TG9naWNhbFJlY3QuYm90dG9tKCkgfTsKLSAgICBIYXNoU2V0PGNvbnN0IEJveCo+IGlubGluZUJv
eFN0YXJ0U2V0OwotICAgIEhhc2hTZXQ8Y29uc3QgQm94Kj4gaW5saW5lQm94RW5kU2V0OwotCi0g
ICAgYXV0byBjb25zdHJ1Y3RMaW5lUnVuc0FuZFVwZGF0ZUJveEdlb21ldHJ5ID0gWyZdIHsKLSAg
ICAgICAgLy8gQ3JlYXRlIHRoZSBpbmxpbmUgcnVucyBvbiB0aGUgY3VycmVudCBsaW5lLiBUaGlz
IGlzIG1vc3RseSB0ZXh0IGFuZCBhdG9taWMgaW5saW5lIHJ1bnMuCi0gICAgICAgIGZvciAoYXV0
byYgbGluZVJ1biA6IGxpbmVDb250ZW50LnJ1bnMpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBX
ZSBzaG91bGQgbm90IG5lZWQgdG8gY29uc3RydWN0IGEgbGluZSBydW4gZm9yIDxicj4uCi0gICAg
ICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBsaW5lUnVuLmxheW91dEJveCgpOwotICAgICAgICAg
ICAgaWYgKGxpbmVSdW4uaXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3Rh
dGUuYWRkTGluZVJ1bih7IGxpbmVJbmRleCwgbGF5b3V0Qm94LCBsaW5lQm94LmxvZ2ljYWxSZWN0
Rm9yVGV4dFJ1bihsaW5lUnVuKSwgbGluZVJ1bi5leHBhbnNpb24oKSwgbGluZVJ1bi50ZXh0Q29u
dGVudCgpIH0pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgaWYgKGxpbmVSdW4uaXNMaW5lQnJlYWsoKSkgewotICAgICAgICAgICAgICAgIGlm
IChsYXlvdXRCb3guaXNMaW5lQnJlYWtCb3goKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBP
bmx5IGhhcmQgbGluZWJyZWFrcyBoYXZlIGFzc29jaWF0ZWQgbGF5b3V0IGJveGVzLgotICAgICAg
ICAgICAgICAgICAgICBhdXRvIGxpbmVCcmVha0JveFJlY3QgPSBsaW5lQm94LmxvZ2ljYWxSZWN0
Rm9yTGluZUJyZWFrQm94KGxheW91dEJveCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdHRp
bmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gsIGxpbmVCcmVha0JveFJl
Y3QsIGxpbmVSdW4uZXhwYW5zaW9uKCksIHsgfSB9KTsKLQotICAgICAgICAgICAgICAgICAgICBh
dXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gp
OwotICAgICAgICAgICAgICAgICAgICBsaW5lQnJlYWtCb3hSZWN0Lm1vdmVCeShsaW5lQm94TG9n
aWNhbFJlY3QudG9wTGVmdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0
TG9naWNhbFRvcExlZnQodG9MYXlvdXRQb2ludChsaW5lQnJlYWtCb3hSZWN0LnRvcExlZnQoKSkp
OwotICAgICAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KHRv
TGF5b3V0VW5pdChsaW5lQnJlYWtCb3hSZWN0LmhlaWdodCgpKSk7Ci0gICAgICAgICAgICAgICAg
fSBlbHNlIAotICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZVJ1bih7
IGxpbmVJbmRleCwgbGF5b3V0Qm94LCBsaW5lQm94LmxvZ2ljYWxSZWN0Rm9yVGV4dFJ1bihsaW5l
UnVuKSwgbGluZVJ1bi5leHBhbnNpb24oKSwgbGluZVJ1bi50ZXh0Q29udGVudCgpIH0pOwotICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxp
bmVSdW4uaXNCb3goKSkgewotICAgICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3guaXNBdG9t
aWNJbmxpbmVMZXZlbEJveCgpKTsKLSAgICAgICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9
IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAgICAgICAgICAgICAg
IGF1dG8gbG9naWNhbEJvcmRlckJveCA9IGxpbmVCb3gubG9naWNhbEJvcmRlckJveEZvckF0b21p
Y0lubGluZUxldmVsQm94KGxheW91dEJveCwgYm94R2VvbWV0cnkpOwotICAgICAgICAgICAgICAg
IGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gsIGxvZ2lj
YWxCb3JkZXJCb3gsIGxpbmVSdW4uZXhwYW5zaW9uKCksIHsgfSB9KTsKLQotICAgICAgICAgICAg
ICAgIGF1dG8gYm9yZGVyQm94TG9naWNhbFRvcExlZnQgPSBsb2dpY2FsQm9yZGVyQm94LnRvcExl
ZnQoKTsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgaW5saW5lIGJveGVzIGFyZSByZWxh
dGl2ZSB0byB0aGUgbGluZSBhbmQgdGhlaXIgdG9wIHBvc2l0aW9uIGNhbiBiZSBuZWdhdGl2ZS4K
LSAgICAgICAgICAgICAgICBib3JkZXJCb3hMb2dpY2FsVG9wTGVmdC5tb3ZlQnkobGluZUJveExv
Z2ljYWxSZWN0LnRvcExlZnQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dEJveC5pc0lu
Rmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgYm9yZGVyQm94TG9naWNhbFRv
cExlZnQgKz0gZ2VvbWV0cnkuaW5GbG93UG9zaXRpb25lZFBvc2l0aW9uT2Zmc2V0KGxheW91dEJv
eCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgICAgICAgICAvLyBBdG9taWMgaW5s
aW5lIGJveGVzIGFyZSBhbGwgc2V0LiBUaGVpciBtYXJnaW4vYm9yZGVyL2NvbnRlbnQgYm94IGdl
b21ldHJpZXMgYXJlIGFscmVhZHkgY29tcHV0ZWQuIFdlIGp1c3QgaGF2ZSB0byBwb3NpdGlvbiB0
aGVtIGhlcmUuCi0gICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQo
dG9MYXlvdXRQb2ludChib3JkZXJCb3hMb2dpY2FsVG9wTGVmdCkpOwotCi0gICAgICAgICAgICAg
ICAgYXV0byBib3JkZXJCb3hUb3AgPSBib3JkZXJCb3hMb2dpY2FsVG9wTGVmdC55KCk7Ci0gICAg
ICAgICAgICAgICAgYXV0byBib3JkZXJCb3hCb3R0b20gPSBib3JkZXJCb3hUb3AgKyBib3hHZW9t
ZXRyeS5ib3JkZXJCb3hIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBlbmNsb3NpbmdUb3BBbmRC
b3R0b20udG9wID0gc3RkOjptaW4oZW5jbG9zaW5nVG9wQW5kQm90dG9tLnRvcCwgYm9yZGVyQm94
VG9wKTsKLSAgICAgICAgICAgICAgICBlbmNsb3NpbmdUb3BBbmRCb3R0b20uYm90dG9tID0gc3Rk
OjptYXgoZW5jbG9zaW5nVG9wQW5kQm90dG9tLmJvdHRvbSwgYm9yZGVyQm94Qm90dG9tKTsKLSAg
ICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChs
aW5lUnVuLmlzSW5saW5lQm94U3RhcnQoKSkgewotICAgICAgICAgICAgICAgIGF1dG8mIGJveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgICAg
ICAgICAgICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmVjdCA9IGxpbmVCb3gubG9naWNhbEJvcmRl
ckJveEZvcklubGluZUJveChsYXlvdXRCb3gsIGJveEdlb21ldHJ5KTsKLSAgICAgICAgICAgICAg
ICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZVJ1bih7IGxpbmVJbmRleCwgbGF5b3V0Qm94LCBpbmxp
bmVCb3hMb2dpY2FsUmVjdCwgbGluZVJ1bi5leHBhbnNpb24oKSwgeyB9IH0pOwotICAgICAgICAg
ICAgICAgIGlubGluZUJveFN0YXJ0U2V0LmFkZCgmbGF5b3V0Qm94KTsKLSAgICAgICAgICAgICAg
ICBlbmNsb3NpbmdUb3BBbmRCb3R0b20udG9wID0gc3RkOjptaW4oZW5jbG9zaW5nVG9wQW5kQm90
dG9tLnRvcCwgaW5saW5lQm94TG9naWNhbFJlY3QudG9wKCkpOwotICAgICAgICAgICAgICAgIGNv
bnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmVSdW4uaXNJbmxpbmVC
b3hFbmQoKSkgewotICAgICAgICAgICAgICAgIGlubGluZUJveEVuZFNldC5hZGQoJmxheW91dEJv
eCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbmxpbmVCb3hTdGFydFNldC5jb250YWlucygmbGF5
b3V0Qm94KSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBbiBpbmxpbmUgYm94IGNhbiBzcGFu
IG11bHRpcGxlIGxpbmVzLiBVc2UgdGhlIFtpbmxpbmUgYm94IGVuZF0gc2lnbmFsIHRvIGluY2x1
ZGUgaXQgaW4gdGhlIGVuY2xvc2luZyBnZW9tZXRyeQotICAgICAgICAgICAgICAgICAgICAvLyBv
bmx5IHdoZW4gaXQgc3RhcnRzIGF0IGEgcHJldmlvdXMgbGluZS4KLSAgICAgICAgICAgICAgICAg
ICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmVjdCA9IGxpbmVCb3gubG9naWNhbEJvcmRlckJveEZv
cklubGluZUJveChsYXlvdXRCb3gsIGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRC
b3gpKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nVG9wQW5kQm90dG9tLmJvdHRvbSA9
IHN0ZDo6bWF4KGVuY2xvc2luZ1RvcEFuZEJvdHRvbS5ib3R0b20sIGlubGluZUJveExvZ2ljYWxS
ZWN0LmJvdHRvbSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBU1NFUlQobGluZVJ1bi5pc1dvcmRCcmVh
a09wcG9ydHVuaXR5KCkpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBjb25zdHJ1Y3RMaW5lUnVu
c0FuZFVwZGF0ZUJveEdlb21ldHJ5KCk7Ci0KLSAgICBhdXRvIHVwZGF0ZUJveEdlb21ldHJ5Rm9y
SW5saW5lQm94ZXMgPSBbJl0gewotICAgICAgICAvLyBGSVhNRTogV2UgbWF5IHdhbnQgdG8ga2Vl
cCBhcm91bmQgYW4gaW5saW5lIGJveCBvbmx5IHNldC4KLSAgICAgICAgaWYgKCFsaW5lQm94Lmhh
c0lubGluZUJveCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvLyBHcmFiIHRoZSBp
bmxpbmUgYm94ZXMgKGV2ZW4gdGhvc2UgdGhhdCBkb24ndCBoYXZlIGFzc29jaWF0ZWQgbGF5b3V0
IGJveGVzIG9uIHRoZSBjdXJyZW50IGxpbmUgZHVlIHRvIGxpbmUgd3JhcHBpbmcpCi0gICAgICAg
IC8vIGFuZCB1cGRhdGUgdGhlaXIgZ2VvbWV0cmllcy4KLSAgICAgICAgZm9yIChhdXRvJiBpbmxp
bmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgewotICAgICAg
ICAgICAgaWYgKCFpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpKQotICAgICAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5saW5lTGV2ZWxCb3gu
bGF5b3V0Qm94KCk7Ci0gICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdT
dGF0ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOwotICAgICAgICAgICAgLy8gSW5saW5lIGJveGVz
IG1heSBvciBtYXkgbm90IGJlIHdyYXBwZWQgYW5kIGhhdmUgcnVucyBvbiBtdWx0aXBsZSBsaW5l
cyAoZS5nLiA8c3Bhbj5maXJzdCBsaW5lPGJyPnNlY29uZCBsaW5lPGJyPnRoaXJkIGxpbmU8L3Nw
YW4+KQotICAgICAgICAgICAgYXV0byBpbmxpbmVCb3hCb3JkZXJCb3ggPSBsaW5lQm94LmxvZ2lj
YWxCb3JkZXJCb3hGb3JJbmxpbmVCb3gobGF5b3V0Qm94LCBib3hHZW9tZXRyeSk7Ci0gICAgICAg
ICAgICBhdXRvIGlubGluZUJveFNpemUgPSBMYXlvdXRTaXplIHsgTGF5b3V0VW5pdDo6ZnJvbUZs
b2F0Q2VpbChpbmxpbmVCb3hCb3JkZXJCb3gud2lkdGgoKSksIExheW91dFVuaXQ6OmZyb21GbG9h
dENlaWwoaW5saW5lQm94Qm9yZGVyQm94LmhlaWdodCgpKSB9OwotICAgICAgICAgICAgYXV0byBs
b2dpY2FsUmVjdCA9IFJlY3QgeyBMYXlvdXRQb2ludCB7IGlubGluZUJveEJvcmRlckJveC50b3BM
ZWZ0KCkgfSwgaW5saW5lQm94U2l6ZSB9OwotICAgICAgICAgICAgbG9naWNhbFJlY3QubW92ZUJ5
KExheW91dFBvaW50IHsgbGluZUJveExvZ2ljYWxSZWN0LnRvcExlZnQoKSB9KTsKLSAgICAgICAg
ICAgIGlmIChpbmxpbmVCb3hTdGFydFNldC5jb250YWlucygmbGF5b3V0Qm94KSkgewotICAgICAg
ICAgICAgICAgIC8vIFRoaXMgaW5saW5lIGJveCBzaG93ZWQgdXAgZmlyc3Qgb24gdGhpcyBsaW5l
LgotICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KGxvZ2ljYWxS
ZWN0LnRvcExlZnQoKSk7Ci0gICAgICAgICAgICAgICAgYXV0byBjb250ZW50Qm94SGVpZ2h0ID0g
bG9naWNhbFJlY3QuaGVpZ2h0KCkgLSAoYm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGJv
eEdlb21ldHJ5LnZlcnRpY2FsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpOwotICAgICAgICAgICAg
ICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoY29udGVudEJveEhlaWdodCk7Ci0g
ICAgICAgICAgICAgICAgYXV0byBjb250ZW50Qm94V2lkdGggPSBsb2dpY2FsUmVjdC53aWR0aCgp
IC0gKGJveEdlb21ldHJ5Lmhvcml6b250YWxCb3JkZXIoKSArIGJveEdlb21ldHJ5Lmhvcml6b250
YWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KSk7Ci0gICAgICAgICAgICAgICAgYm94R2VvbWV0cnku
c2V0Q29udGVudEJveFdpZHRoKGNvbnRlbnRCb3hXaWR0aCk7Ci0gICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBNaWRkbGUgb3IgZW5kIG9mIHRo
ZSBpbmxpbmUgYm94LiBMZXQncyBzdHJldGNoIHRoZSBib3ggYXMgbmVlZGVkLgotICAgICAgICAg
ICAgYXV0byBlbmNsb3NpbmdCb3JkZXJCb3hSZWN0ID0gQm94R2VvbWV0cnk6OmJvcmRlckJveFJl
Y3QoYm94R2VvbWV0cnkpOwotICAgICAgICAgICAgZW5jbG9zaW5nQm9yZGVyQm94UmVjdC5leHBh
bmRUb0NvbnRhaW4obG9naWNhbFJlY3QpOwotICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9n
aWNhbExlZnQoZW5jbG9zaW5nQm9yZGVyQm94UmVjdC5sZWZ0KCkpOwotCi0gICAgICAgICAgICBi
b3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGVuY2xvc2luZ0JvcmRlckJveFJlY3QuaGVp
Z2h0KCkgLSAoYm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGJveEdlb21ldHJ5LnZlcnRp
Y2FsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpKTsKLSAgICAgICAgICAgIGJveEdlb21ldHJ5LnNl
dENvbnRlbnRCb3hXaWR0aChlbmNsb3NpbmdCb3JkZXJCb3hSZWN0LndpZHRoKCkgLSAoYm94R2Vv
bWV0cnkuaG9yaXpvbnRhbEJvcmRlcigpICsgYm94R2VvbWV0cnkuaG9yaXpvbnRhbFBhZGRpbmco
KS52YWx1ZU9yKDBfbHUpKSk7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIHVwZGF0ZUJveEdlb21l
dHJ5Rm9ySW5saW5lQm94ZXMoKTsKLQotICAgIGF1dG8gY29uc3RydWN0TGluZUdlb21ldHJ5ID0g
WyZdIHsKLSAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmUoeyBsaW5lQm94TG9naWNhbFJl
Y3QsIGVuY2xvc2luZ1RvcEFuZEJvdHRvbSwgbGluZUJveC5hbGlnbm1lbnRCYXNlbGluZSgpLCBy
b290SW5saW5lQm94TG9naWNhbFJlY3QubGVmdCgpLCBsaW5lQ29udGVudC5jb250ZW50TG9naWNh
bFdpZHRoIH0pOwotICAgIH07Ci0gICAgY29uc3RydWN0TGluZUdlb21ldHJ5KCk7Ci0KLSAgICBy
ZXR1cm4gbGluZUJveExvZ2ljYWxSZWN0OwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250
ZXh0OjppbnZhbGlkYXRlRm9ybWF0dGluZ1N0YXRlKGNvbnN0IEludmFsaWRhdGlvblN0YXRlJikK
LXsKLSAgICAvLyBGaW5kIG91dCB3aGF0IHdlIG5lZWQgdG8gaW52YWxpZGF0ZS4gVGhpcyBpcyB3
aGVyZSB3ZSBhZGQgc29tZSBzbWFydHMgdG8gZG8gcGFydGlhbCBsaW5lIGxheW91dC4KLSAgICAv
LyBGb3Igbm93IGxldCdzIGp1c3QgY2xlYXIgdGhlIHJ1bnMuCi0gICAgZm9ybWF0dGluZ1N0YXRl
KCkuY2xlYXJMaW5lQW5kUnVucygpOwotICAgIC8vIEZJWE1FOiBUaGlzIGlzIGFsc28gd2hlcmUg
d2Ugd291bGQgZGVsZXRlIGlubGluZSBpdGVtcyBpZiB0aGVpciBjb250ZW50IGNoYW5nZWQuCi19
Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5s
aW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaApkZWxldGVk
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3ZWM5NzIzN2MxZTg4ZDc4ODYwMjY3YTE4MDdlMjA0
OGFmNDMyZS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJh
Z21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5j
bHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5lQnVpbGRlci5o
IgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFt
ZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIElubGluZUZvcm1hdHRpbmdTdGF0ZTsKLWNsYXNzIElu
dmFsaWRhdGlvblN0YXRlOwotY2xhc3MgTGluZUJveDsKLQotLy8gVGhpcyBjbGFzcyBpbXBsZW1l
bnRzIHRoZSBsYXlvdXQgbG9naWMgZm9yIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHRzLgotLy8g
aHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIyL3Zpc3VyZW4uaHRtbCNpbmxpbmUtZm9ybWF0dGlu
ZwotY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQgZmluYWwgOiBwdWJsaWMgRm9ybWF0dGlu
Z0NvbnRleHQgewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQpOwotcHVibGljOgotICAgIElubGluZUZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRh
aW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBJbmxpbmVGb3JtYXR0aW5nU3RhdGUmKTsK
LSAgICB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBD
b25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSBvdmVycmlkZTsKLSAgICBMYXlvdXRVbml0IHVz
ZWRDb250ZW50SGVpZ2h0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICBjbGFzcyBRdWlya3MgOiBw
dWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyB7Ci0gICAgcHVibGljOgotICAgICAgICBJ
bmxpbmVMYXlvdXRVbml0IGluaXRpYWxMaW5lSGVpZ2h0KCkgY29uc3Q7Ci0gICAgICAgIGJvb2wg
aGFzU29mdFdyYXBPcHBvcnR1bml0eUF0SW1hZ2UoKSBjb25zdDsKLSAgICAgICAgYm9vbCBpbmxp
bmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94Jiwg
Y29uc3QgTGluZUJveCYpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNs
YXNzIElubGluZUZvcm1hdHRpbmdDb250ZXh0OwotICAgICAgICBRdWlya3MoY29uc3QgSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQmKTsKLQotICAgICAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6Zm9ybWF0dGluZ0Nv
bnRleHQoKSk7IH0KLQotICAgIH07Ci0gICAgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJr
cyBxdWlya3MoKSBjb25zdCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9Ci0KLSAgICBjb25zdCBJ
bmxpbmVGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRv
d25jYXN0PElubGluZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRp
bmdTdGF0ZSgpKTsgfQotICAgIElubGluZUZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRl
KCkgeyByZXR1cm4gZG93bmNhc3Q8SW5saW5lRm9ybWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29u
dGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9Ci0KLSAgICB2b2lkIGxpbmVMYXlvdXRGb3JJbnRl
cmdyYXRpb24oSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0Nv
bnRlbnQmKTsKLQotcHJpdmF0ZToKLSAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbXB1
dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpIG92ZXJyaWRlOwotCi0gICAgY2xhc3MgR2Vv
bWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKLSAgICBwdWJsaWM6
Ci0gICAgICAgIExpbmVCb3ggbGluZUJveEZvckxpbmVDb250ZW50KGNvbnN0IExpbmVCdWlsZGVy
OjpMaW5lQ29udGVudCYpOwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxUb3BGb3JO
ZXh0TGluZShjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmLCBJbmxpbmVMYXlvdXRVbml0
IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIGNvbnN0IEZsb2F0aW5nQ29udGV4dCYpIGNvbnN0
OwotCi0gICAgICAgIENvbnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5saW5lQmxvY2tDb250ZW50SGVp
Z2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNv
bnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpIGNvbnN0OwotICAgICAgICBDb250ZW50V2lk
dGhBbmRNYXJnaW4gaW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94Jiwg
Y29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxW
YWx1ZXMmKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dDsKLSAgICAgICAgR2VvbWV0cnkoY29uc3QgSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQmKTsKLQotICAgICAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0
dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpmb3JtYXR0aW5nQ29udGV4dCgpKTsg
fQotCi0gICAgfTsKLSAgICBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0
cnkoKSBjb25zdCB7IHJldHVybiBHZW9tZXRyeSgqdGhpcyk7IH0KLQotICAgIHZvaWQgbGluZUxh
eW91dChJbmxpbmVJdGVtcyYsIExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UsIGNvbnN0IENv
bnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOwotCi0gICAgdm9pZCBjb21wdXRlSW50cmluc2lj
V2lkdGhGb3JGb3JtYXR0aW5nUm9vdChjb25zdCBCb3gmKTsKLSAgICBJbmxpbmVMYXlvdXRVbml0
IGNvbXB1dGVkSW50cmluc2ljV2lkdGhGb3JDb25zdHJhaW50KElubGluZUxheW91dFVuaXQgYXZh
aWxhYmxlV2lkdGgpIGNvbnN0OwotCi0gICAgdm9pZCBjb21wdXRlSG9yaXpvbnRhbE1hcmdpbihj
b25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmKTsKLSAgICB2b2lkIGNvbXB1
dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
Jik7Ci0gICAgdm9pZCBjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9y
aXpvbnRhbENvbnN0cmFpbnRzJik7Ci0KLSAgICB2b2lkIGNvbGxlY3RJbmxpbmVDb250ZW50SWZO
ZWVkZWQoKTsKLSAgICBJbmxpbmVSZWN0IGNvbXB1dGVHZW9tZXRyeUZvckxpbmVDb250ZW50KGNv
bnN0IExpbmVCdWlsZGVyOjpMaW5lQ29udGVudCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYpOwotICAgIHZvaWQgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShjb25zdCBJbnZhbGlkYXRp
b25TdGF0ZSYpOwotfTsKLQotaW5saW5lIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRy
eTo6R2VvbWV0cnkoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1hdHRp
bmdDb250ZXh0KQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5KGlubGluZUZvcm1h
dHRpbmdDb250ZXh0KQotewotfQotCi1pbmxpbmUgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1
aXJrczo6UXVpcmtzKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCkKLSAgICA6IEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MoaW5saW5lRm9ybWF0
dGluZ0NvbnRleHQpCi17Ci19Ci0KLX0KLX0KLQotU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19MQVlP
VVRfRk9STUFUVElOR19DT05URVhUKElubGluZUZvcm1hdHRpbmdDb250ZXh0LCBpc0lubGluZUZv
cm1hdHRpbmdDb250ZXh0KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0
aW5nQ29udGV4dEdlb21ldHJ5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0
ZTc4ODMzMzgwZmI0Y2MyMDUxMzU5YTM2YjUwNDk1NDliOWFkMC4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5l
Zm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorKysgL2Rldi9u
dWxsCkBAIC0xLDcyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0g
KiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICog
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgot
I2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VU
X0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgotI2lu
Y2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgot
I2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgot
I2luY2x1ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCi0jaW5jbHVkZSAiTGVuZ3RoRnVuY3Rpb25z
LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBM
aW5lQm94QnVpbGRlciB7Ci1wdWJsaWM6Ci0gICAgTGluZUJveEJ1aWxkZXIoY29uc3QgSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQmKTsKLSAgICBMaW5lQm94IGJ1aWxkKGNvbnN0IExpbmVCdWlsZGVy
OjpMaW5lQ29udGVudCYpOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBTaW1wbGlmaWVkVmVydGlj
YWxBbGlnbm1lbnQgewotICAgICAgICBTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQoY29uc3Qg
TGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gpOwotCi0gICAgICAgIHN0YXRp
YyBib29sIGNhblVzZVNpbXBsaWZpZWRBbGlnbm1lbnQoY29uc3QgTGluZUJveDo6SW5saW5lTGV2
ZWxCb3gmIHJvb3RJbmxpbmVCb3gsIGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiwgT3B0
aW9uYWw8Y29uc3QgQm94R2VvbWV0cnk+IGlubGluZUxldmVsQm94R2VvbWV0cnkpOwotCi0gICAg
ICAgIHZvaWQgYWxpZ24oTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmKTsKLQotICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IHJvb3RJbmxpbmVCb3hMb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbV9y
b290SW5saW5lQm94TG9naWNhbFRvcDsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxpbmVC
b3hIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hMb2dpY2FsQm90dG9tIC0gbV9saW5l
Qm94TG9naWNhbFRvcDsgfQotCi0gICAgICAgIHZvaWQgc2V0RW5hYmxlZChib29sIGVuYWJsZWQp
IHsgbV9pc0VuYWJsZWQgPSBlbmFibGVkOyB9Ci0gICAgICAgIGJvb2wgaXNFbmFibGVkKCkgY29u
c3QgeyByZXR1cm4gbV9pc0VuYWJsZWQ7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHZvaWQg
YWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94Jik7Ci0KLSAgICAgICAgY29uc3Qg
TGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIG1fcm9vdElubGluZUJveDsKLSAgICAgICAgYm9vbCBt
X2lzRW5hYmxlZCB7IHRydWUgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2xpbmVCb3hM
b2dpY2FsVG9wIHsgMCB9OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fbGluZUJveExvZ2lj
YWxCb3R0b20geyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbV9yb290SW5saW5lQm94
TG9naWNhbFRvcCB7IDAgfTsKLSAgICB9OwotCi0gICAgdm9pZCBzZXRWZXJ0aWNhbEdlb21ldHJ5
Rm9ySW5saW5lQm94KExpbmVCb3g6OklubGluZUxldmVsQm94JikgY29uc3Q7Ci0gICAgdm9pZCBj
b25zdHJ1Y3RBbmRBbGlnbklubGluZUxldmVsQm94ZXMoTGluZUJveCYsIGNvbnN0IExpbmU6OlJ1
bkxpc3QmKTsKLSAgICB2b2lkIGNvbXB1dGVMaW5lQm94SGVpZ2h0QW5kQWxpZ25JbmxpbmVMZXZl
bEJveGVzVmVydGljYWxseShMaW5lQm94Jik7Ci0KLSAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2lubGluZUZvcm1h
dHRpbmdDb250ZXh0OyB9Ci0gICAgY29uc3QgQm94JiByb290Qm94KCkgY29uc3QgeyByZXR1cm4g
Zm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCk7IH0KLSAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3Rh
dGUoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmxheW91dFN0YXRlKCk7IH0K
LQotICAgIGJvb2wgaXNSb290TGF5b3V0Qm94KGNvbnN0IENvbnRhaW5lckJveCYgY29udGFpbmVy
Qm94KSBjb25zdCB7IHJldHVybiAmY29udGFpbmVyQm94ID09ICZyb290Qm94KCk7IH0KLQotcHJp
dmF0ZToKLSAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgbV9pbmxpbmVGb3JtYXR0
aW5nQ29udGV4dDsKLX07Ci0KLXN0cnVjdCBIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVu
dCB7Ci1wdWJsaWM6Ci0gICAgdm9pZCByZXNldCgpOwotCi0gICAgSW5saW5lTGF5b3V0VW5pdCB3
aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fd2lkdGg7IH0KLSAgICBib29sIGlzQ29uZGl0aW9uYWwo
KSBjb25zdCB7IHJldHVybiBtX2lzQ29uZGl0aW9uYWw7IH0KLQotICAgIHZvaWQgc2V0SXNDb25k
aXRpb25hbCgpIHsgbV9pc0NvbmRpdGlvbmFsID0gdHJ1ZTsgfQotICAgIHZvaWQgZXhwYW5kKElu
bGluZUxheW91dFVuaXQgd2lkdGgpIHsgbV93aWR0aCArPSB3aWR0aDsgfQotCi1wcml2YXRlOgot
ICAgIGJvb2wgbV9pc0NvbmRpdGlvbmFsIHsgZmFsc2UgfTsKLSAgICBJbmxpbmVMYXlvdXRVbml0
IG1fd2lkdGggeyAwIH07Ci19OwotCi12b2lkIEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250
ZW50OjpyZXNldCgpCi17Ci0gICAgbV9pc0NvbmRpdGlvbmFsID0gZmFsc2U7Ci0gICAgbV93aWR0
aCA9ICAwOwotfQotCi1zdGF0aWMgSGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQgY29s
bGVjdEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50KGNvbnN0IExpbmU6OlJ1bkxpc3Qm
IHJ1bnMsIGJvb2wgaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KQotewotICAgIGF1dG8gaGFu
Z2luZ0NvbnRlbnQgPSBIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVudCB7IH07Ci0gICAg
aWYgKGlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudCkKLSAgICAgICAgaGFuZ2luZ0NvbnRlbnQu
c2V0SXNDb25kaXRpb25hbCgpOwotICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJz
ZWRSYW5nZShydW5zKSkgewotICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94U3RhcnQoKSB8fCBy
dW4uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAo
cnVuLmlzTGluZUJyZWFrKCkpIHsKLSAgICAgICAgICAgIGhhbmdpbmdDb250ZW50LnNldElzQ29u
ZGl0aW9uYWwoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlm
ICghcnVuLmhhc1RyYWlsaW5nV2hpdGVzcGFjZSgpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBwcmVzZXJ2ZWQgb3IgaHVuZyB3aGl0ZXNwYWNlLgot
ICAgICAgICBpZiAocnVuLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9IFdoaXRlU3BhY2U6OlByZVdy
YXApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLy8gVGhpcyBpcyBlaXRoZXIgYSBub3Jt
YWwgb3IgY29uZGl0aW9uYWxseSBoYW5naW5nIHRyYWlsaW5nIHdoaXRlc3BhY2UuCi0gICAgICAg
IGhhbmdpbmdDb250ZW50LmV4cGFuZChydW4udHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoKSk7Ci0g
ICAgfQotICAgIHJldHVybiBoYW5naW5nQ29udGVudDsKLX0KLQotc3RhdGljIE9wdGlvbmFsPElu
bGluZUxheW91dFVuaXQ+IGhvcml6b250YWxBbGlnbm1lbnRPZmZzZXQoY29uc3QgTGluZTo6UnVu
TGlzdCYgcnVucywgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24sIElubGluZUxheW91dFVuaXQgbGlu
ZUxvZ2ljYWxXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoLCBib29s
IGlzTGFzdExpbmUpCi17Ci0gICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGxpbmVMb2dpY2FsV2lk
dGggLSBjb250ZW50TG9naWNhbFdpZHRoOwotICAgIGF1dG8gaGFuZ2luZ1RyYWlsaW5nV2hpdGVz
cGFjZUNvbnRlbnQgPSBjb2xsZWN0SGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQocnVu
cywgaXNMYXN0TGluZSk7Ci0gICAgYXZhaWxhYmxlV2lkdGggKz0gaGFuZ2luZ1RyYWlsaW5nV2hp
dGVzcGFjZUNvbnRlbnQud2lkdGgoKTsKLSAgICBpZiAoYXZhaWxhYmxlV2lkdGggPD0gMCkKLSAg
ICAgICAgcmV0dXJuIHsgfTsKLQotICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsQWxpZ25tZW50
ID0gWyZdIHsKLSAgICAgICAgaWYgKHRleHRBbGlnbiAhPSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5
KQotICAgICAgICAgICAgcmV0dXJuIHRleHRBbGlnbjsKLSAgICAgICAgLy8gVGV4dCBpcyBqdXN0
aWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBtZXRob2Qgc3BlY2lmaWVkIGJ5IHRoZSB0ZXh0LWp1c3Rp
ZnkgcHJvcGVydHksCi0gICAgICAgIC8vIGluIG9yZGVyIHRvIGV4YWN0bHkgZmlsbCB0aGUgbGlu
ZSBib3guIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRleHQtYWxpZ24tbGFzdCwKLSAg
ICAgICAgLy8gdGhlIGxhc3QgbGluZSBiZWZvcmUgYSBmb3JjZWQgYnJlYWsgb3IgdGhlIGVuZCBv
ZiB0aGUgYmxvY2sgaXMgc3RhcnQtYWxpZ25lZC4KLSAgICAgICAgaWYgKGlzTGFzdExpbmUgfHwg
KCFydW5zLmlzRW1wdHkoKSAmJiBydW5zLmxhc3QoKS5pc0xpbmVCcmVhaygpKSkKLSAgICAgICAg
ICAgIHJldHVybiBUZXh0QWxpZ25Nb2RlOjpTdGFydDsKLSAgICAgICAgcmV0dXJuIFRleHRBbGln
bk1vZGU6Okp1c3RpZnk7Ci0gICAgfTsKLQotICAgIHN3aXRjaCAoY29tcHV0ZWRIb3Jpem9udGFs
QWxpZ25tZW50KCkpIHsKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OkxlZnQ6Ci0gICAgY2FzZSBU
ZXh0QWxpZ25Nb2RlOjpXZWJLaXRMZWZ0OgotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6U3RhcnQ6
Ci0gICAgICAgIHJldHVybiB7IH07Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpSaWdodDoKLSAg
ICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0OgotICAgIGNhc2UgVGV4dEFsaWduTW9k
ZTo6RW5kOgotICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7Ci0gICAgY2FzZSBUZXh0QWxp
Z25Nb2RlOjpDZW50ZXI6Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRDZW50ZXI6Ci0g
ICAgICAgIHJldHVybiBhdmFpbGFibGVXaWR0aCAvIDI7Ci0gICAgY2FzZSBUZXh0QWxpZ25Nb2Rl
OjpKdXN0aWZ5OgotICAgICAgICAvLyBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5IGlzIGEgcnVuIGFs
aWdubWVudCAoYW5kIHdlIG9ubHkgZG8gaW5saW5lIGJveCBhbGlnbm1lbnQgaGVyZSkKLSAgICAg
ICAgcmV0dXJuIHsgfTsKLSAgICBkZWZhdWx0OgotICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVO
VEVEX1lFVCgpOwotICAgICAgICByZXR1cm4geyB9OwotICAgIH0KLSAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKLSAgICByZXR1cm4geyB9OwotfQotCi1MaW5lQm94QnVpbGRlcjo6TGluZUJveEJ1
aWxkZXIoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1hdHRpbmdDb250
ZXh0KQotICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dCkKLXsKLX0KLQotTGluZUJveCBMaW5lQm94QnVpbGRlcjo6YnVpbGQoY29uc3QgTGluZUJ1
aWxkZXI6OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCkKLXsKLSAgICBhdXRvJiBydW5zID0gbGlu
ZUNvbnRlbnQucnVuczsKLSAgICBhdXRvIGxpbmVMb2dpY2FsV2lkdGggPSBsaW5lQ29udGVudC5s
aW5lTG9naWNhbFdpZHRoOwotICAgIGF1dG8gY29udGVudExvZ2ljYWxXaWR0aCA9IGxpbmVDb250
ZW50LmNvbnRlbnRMb2dpY2FsV2lkdGg7Ci0gICAgYXV0byBob3Jpem9udGFsQWxpZ25tZW50T2Zm
c2V0ID0gTGF5b3V0Ojpob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0KHJ1bnMsIHJvb3RCb3goKS5z
dHlsZSgpLnRleHRBbGlnbigpLCBsaW5lTG9naWNhbFdpZHRoLCBjb250ZW50TG9naWNhbFdpZHRo
LCBsaW5lQ29udGVudC5pc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQpOwotICAgIGF1dG8gbGlu
ZUJveCA9IExpbmVCb3ggeyByb290Qm94KCksIGxpbmVDb250ZW50LmxvZ2ljYWxUb3BMZWZ0LCBs
aW5lTG9naWNhbFdpZHRoLCBob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0LnZhbHVlT3IoSW5saW5l
TGF5b3V0VW5pdCB7IH0pLCBjb250ZW50TG9naWNhbFdpZHRoLCBsaW5lQ29udGVudC5ub25TcGFu
bmluZ0lubGluZUxldmVsQm94Q291bnQgfTsKLSAgICBjb25zdHJ1Y3RBbmRBbGlnbklubGluZUxl
dmVsQm94ZXMobGluZUJveCwgcnVucyk7Ci0gICAgcmV0dXJuIGxpbmVCb3g7Ci19Ci0KLXZvaWQg
TGluZUJveEJ1aWxkZXI6OnNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3goTGluZUJveDo6
SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94KSBjb25zdAotewotICAgIEFTU0VSVChpbmxp
bmVMZXZlbEJveC5pc0lubGluZUJveCgpIHx8IGlubGluZUxldmVsQm94LmlzTGluZUJyZWFrQm94
KCkpOwotICAgIGF1dG8mIGZvbnRNZXRyaWNzID0gaW5saW5lTGV2ZWxCb3guc3R5bGUoKS5mb250
TWV0cmljcygpOwotICAgIElubGluZUxheW91dFVuaXQgYXNjZW50ID0gZm9udE1ldHJpY3MuYXNj
ZW50KCk7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBkZXNjZW50ID0gZm9udE1ldHJpY3MuZGVzY2Vu
dCgpOwotICAgIGF1dG8gbG9naWNhbEhlaWdodCA9IGFzY2VudCArIGRlc2NlbnQ7Ci0gICAgLy8g
V2UgbmVlZCBmbG9vci9jZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlvdXQgaW50ZWdyYWwgcG9zaXRp
b25pbmcuCi0gICAgaW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUoZmxvb3JmKGFzY2VudCkpOwot
ICAgIGlubGluZUxldmVsQm94LnNldERlc2NlbnQoY2VpbChkZXNjZW50KSk7Ci0gICAgaW5saW5l
TGV2ZWxCb3guc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KTsKLQotICAgIC8vIEZJWE1F
OiBBZGp1c3QgbGF5b3V0IGJvdW5kcyB3aXRoIGZhbGxiYWNrIGZvbnQgd2hlbiBhcHBsaWNhYmxl
LgotICAgIGF1dG8mIHN0eWxlID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5bGUoKTsK
LSAgICBhdXRvIGxpbmVIZWlnaHQgPSBzdHlsZS5saW5lSGVpZ2h0KCk7Ci0gICAgaWYgKGxpbmVI
ZWlnaHQuaXNOZWdhdGl2ZSgpKSB7Ci0gICAgICAgIC8vIElmIGxpbmUtaGVpZ2h0IGNvbXB1dGVz
IHRvIG5vcm1hbCBhbmQgZWl0aGVyIHRleHQtZWRnZSBpcyBsZWFkaW5nIG9yIHRoaXMgaXMgdGhl
IHJvb3QgaW5saW5lIGJveCwKLSAgICAgICAgLy8gdGhlIGZvbnTigJlzIGxpbmUgZ2FwIG1ldHJp
YyBtYXkgYWxzbyBiZSBpbmNvcnBvcmF0ZWQgaW50byBBIGFuZCBEIGJ5IGFkZGluZyBoYWxmIHRv
IGVhY2ggc2lkZSBhcyBoYWxmLWxlYWRpbmcuCi0gICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9y
Zy9UUi9jc3MtaW5saW5lLTMvI2lubGluZS1oZWlnaHQKLSAgICAgICAgLy8gU2luY2UgdGV4dC1l
ZGdlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSBpcyBsZWFkaW5n
LCB3ZSBzaG91bGQganVzdCBhcHBseSBpdCB0bwotICAgICAgICAvLyBhbGwgaW5saW5lIGJveGVz
LgotICAgICAgICBhdXRvIGhhbGZMaW5lR2FwID0gKGZvbnRNZXRyaWNzLmxpbmVTcGFjaW5nKCkg
LSBsb2dpY2FsSGVpZ2h0KSAvIDI7Ci0gICAgICAgIGFzY2VudCArPSBoYWxmTGluZUdhcDsKLSAg
ICAgICAgZGVzY2VudCArPSBoYWxmTGluZUdhcDsKLSAgICB9IGVsc2UgewotICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IGxpbmVIZWlnaHQgPSBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKTsKLSAg
ICAgICAgSW5saW5lTGF5b3V0VW5pdCBoYWxmTGVhZGluZyA9IChsaW5lSGVpZ2h0IC0gKGFzY2Vu
dCArIGRlc2NlbnQpKSAvIDI7Ci0gICAgICAgIGFzY2VudCArPSBoYWxmTGVhZGluZzsKLSAgICAg
ICAgZGVzY2VudCArPSBoYWxmTGVhZGluZzsKLSAgICB9Ci0gICAgLy8gV2UgbmVlZCBmbG9vci9j
ZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlvdXQgaW50ZWdyYWwgcG9zaXRpb25pbmcuCi0gICAgaW5s
aW5lTGV2ZWxCb3guc2V0TGF5b3V0Qm91bmRzKExpbmVCb3g6OklubGluZUxldmVsQm94OjpMYXlv
dXRCb3VuZHMgeyBmbG9vcmYoYXNjZW50KSwgY2VpbChkZXNjZW50KSB9KTsKLX0KLQotdm9pZCBM
aW5lQm94QnVpbGRlcjo6Y29uc3RydWN0QW5kQWxpZ25JbmxpbmVMZXZlbEJveGVzKExpbmVCb3gm
IGxpbmVCb3gsIGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnMpCi17Ci0gICAgYXV0byYgcm9vdElu
bGluZUJveCA9IGxpbmVCb3gucm9vdElubGluZUJveCgpOwotICAgIHNldFZlcnRpY2FsR2VvbWV0
cnlGb3JJbmxpbmVCb3gocm9vdElubGluZUJveCk7Ci0KLSAgICBhdXRvIHNpbXBsaWZpZWRWZXJ0
aWNhbEFsaWdubWVudCA9IFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudCB7IHJvb3RJbmxpbmVC
b3ggfTsKLSAgICAvLyBGSVhNRTogQWRkIGZhc3QgcGF0aCBzdXBwb3J0IGZvciBsaW5lLWhlaWdo
dCBjb250ZW50LgotICAgIHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5zZXRFbmFibGVkKGxh
eW91dFN0YXRlKCkuaW5TdGFuZGFyZHNNb2RlKCkgJiYgcm9vdEJveCgpLnN0eWxlKCkubGluZUhl
aWdodCgpLmlzTmVnYXRpdmUoKSk7Ci0KLSAgICBhdXRvIHNpbXBsaWZpZWRBbGlnblZlcnRpY2Fs
bHlJZkFwcGxpY2FibGUgPSBbJl0oYXV0byYgaW5saW5lTGV2ZWxCb3gsIE9wdGlvbmFsPGNvbnN0
IEJveEdlb21ldHJ5PiBib3hHZW9tZXRyeSkgewotICAgICAgICBpZiAoIXNpbXBsaWZpZWRWZXJ0
aWNhbEFsaWdubWVudC5pc0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAg
aWYgKCFTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OmNhblVzZVNpbXBsaWZpZWRBbGlnbm1l
bnQocm9vdElubGluZUJveCwgaW5saW5lTGV2ZWxCb3gsIGJveEdlb21ldHJ5KSkgewotICAgICAg
ICAgICAgc2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50LnNldEVuYWJsZWQoZmFsc2UpOwotICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNpbXBsaWZpZWRWZXJ0aWNhbEFs
aWdubWVudC5hbGlnbihpbmxpbmVMZXZlbEJveCk7Ci0gICAgfTsKLQotICAgIGF1dG8gY3JlYXRl
V3JhcHBlZElubGluZUJveGVzID0gWyZdIHsKLSAgICAgICAgaWYgKHJ1bnMuaXNFbXB0eSgpKQot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAvLyBBbiBpbmxpbmUgYm94IG1heSBub3QgbmVj
ZXNzYXJpbHkgc3RhcnQgb24gdGhlIGN1cnJlbnQgbGluZToKLSAgICAgICAgLy8gPHNwYW4gaWQ9
b3V0ZXI+bGluZSBicmVhazxicj50aGlzIGNvbnRlbnQncyBwYXJlbnQgaW5saW5lIGJveCgnb3V0
ZXInKSA8c3BhbiBpZD1pbm5lcj5zdGFydHMgb24gdGhlIHByZXZpb3VzIGxpbmU8L3NwYW4+PC9z
cGFuPgotICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlJ3MgYW4gTGlu
ZUJveDo6SW5saW5lTGV2ZWxCb3ggZm9yIGV2ZXJ5IGlubGluZSBib3ggdGhhdCdzIHByZXNlbnQg
b24gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAgLy8gSW4gbmVzdGluZyBjYXNlIHdlIG5lZWQg
dG8gY3JlYXRlIExpbmVCb3g6OklubGluZUxldmVsQm94ZXMgZm9yIHRoZSBpbmxpbmUgYm94IGFu
Y2VzdG9ycy4KLSAgICAgICAgLy8gV2Ugb25seSBoYXZlIHRvIGRvIGl0IG9uIHRoZSBmaXJzdCBy
dW4gYXMgYW55IHN1YnNlcXVlbnQgaW5saW5lIGNvbnRlbnQgaXMgZWl0aGVyIGF0IHRoZSBzYW1l
L2hpZ2hlciBuZXN0aW5nIGxldmVsIG9yCi0gICAgICAgIC8vIG5lc3RlZCB3aXRoIGEgW2lubGlu
ZSBib3ggc3RhcnRdIHJ1bi4KLSAgICAgICAgYXV0byYgZmlyc3RSdW4gPSBydW5zWzBdOwotICAg
ICAgICBhdXRvJiBmaXJzdFJ1blBhcmVudExheW91dEJveCA9IGZpcnN0UnVuLmxheW91dEJveCgp
LnBhcmVudCgpOwotICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGlzIHRoZSBmb3JtYXR0aW5nIHJv
b3QsIHdlIGNhbiBzdG9wIGhlcmUuIFRoaXMgaXMgcm9vdCBpbmxpbmUgYm94IGNvbnRlbnQsIHRo
ZXJlJ3Mgbm8gbmVzdGluZyBpbmxpbmUgYm94IGZyb20gdGhlIHByZXZpb3VzIGxpbmUocykKLSAg
ICAgICAgLy8gdW5sZXNzIHRoZSBpbmxpbmUgYm94IGNsb3NpbmcgaXMgZm9yY2VkIG92ZXIgdG8g
dGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAgLy8gZS5nLgotICAgICAgICAvLyA8c3Bhbj5ub3Jt
YWxseSB0aGUgaW5saW5lIGJveCBjbG9zaW5nIGZvcm1zIGEgY29udGludW91cyBjb250ZW50PC9z
cGFuPgotICAgICAgICAvLyA8c3Bhbj51bmxlc3MgaXQncyBmb3JjZWQgdG8gdGhlIG5leHQgbGlu
ZTxicj48L3NwYW4+Ci0gICAgICAgIGF1dG8gZmlyc3RSdW5OZWVkc0lubGluZUJveCA9IGZpcnN0
UnVuLmlzSW5saW5lQm94RW5kKCk7Ci0gICAgICAgIGlmICghZmlyc3RSdW5OZWVkc0lubGluZUJv
eCAmJiBpc1Jvb3RMYXlvdXRCb3goZmlyc3RSdW5QYXJlbnRMYXlvdXRCb3gpKQotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICBWZWN0b3I8Y29uc3QgQm94Kj4gbGF5b3V0Qm94ZXNXaXRob3V0
SW5saW5lQm94ZXM7Ci0gICAgICAgIGlmIChmaXJzdFJ1bk5lZWRzSW5saW5lQm94KQotICAgICAg
ICAgICAgbGF5b3V0Qm94ZXNXaXRob3V0SW5saW5lQm94ZXMuYXBwZW5kKCZmaXJzdFJ1bi5sYXlv
dXRCb3goKSk7Ci0gICAgICAgIGF1dG8qIGFuY2VzdG9yID0gJmZpcnN0UnVuUGFyZW50TGF5b3V0
Qm94OwotICAgICAgICB3aGlsZSAoIWlzUm9vdExheW91dEJveCgqYW5jZXN0b3IpKSB7Ci0gICAg
ICAgICAgICBsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVCb3hlcy5hcHBlbmQoYW5jZXN0b3IpOwot
ICAgICAgICAgICAgYW5jZXN0b3IgPSAmYW5jZXN0b3ItPnBhcmVudCgpOwotICAgICAgICB9Ci0g
ICAgICAgIC8vIENvbnN0cnVjdCB0aGUgbWlzc2luZyBMaW5lQm94OjpJbmxpbmVCb3hlcyBzdGFy
dGluZyB3aXRoIHRoZSB0b3Btb3N0IGxheW91dCBib3guCi0gICAgICAgIGZvciAoYXV0byogbGF5
b3V0Qm94IDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVC
b3hlcykpIHsKLSAgICAgICAgICAgIGF1dG8gaW5saW5lQm94ID0gTGluZUJveDo6SW5saW5lTGV2
ZWxCb3g6OmNyZWF0ZUlubGluZUJveCgqbGF5b3V0Qm94LCByb290SW5saW5lQm94LmxvZ2ljYWxM
ZWZ0KCksIGxpbmVCb3guY29udGVudExvZ2ljYWxXaWR0aCgpKTsKLSAgICAgICAgICAgIHNldFZl
cnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3goaW5saW5lQm94KTsKLSAgICAgICAgICAgIHNpbXBs
aWZpZWRBbGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUoaW5saW5lQm94LCB7IH0pOwotICAgICAg
ICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChXVEZNb3ZlKGlubGluZUJveCkpOwotICAg
ICAgICB9Ci0gICAgfTsKLSAgICBjcmVhdGVXcmFwcGVkSW5saW5lQm94ZXMoKTsKLQotICAgIGF1
dG8gbGluZUhhc0NvbnRlbnQgPSBmYWxzZTsKLSAgICBmb3IgKGF1dG8mIHJ1biA6IHJ1bnMpIHsK
LSAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gcnVuLmxheW91dEJveCgpOwotICAgICAgICBhdXRv
IHJ1bkhhc0NvbnRlbnQgPSBbJl0gKCkgLT4gYm9vbCB7Ci0gICAgICAgICAgICBBU1NFUlQoIWxp
bmVIYXNDb250ZW50KTsKLSAgICAgICAgICAgIGlmIChydW4uaXNUZXh0KCkgfHwgcnVuLmlzQm94
KCkgfHwgcnVuLmlzU29mdExpbmVCcmVhaygpIHx8IHJ1bi5pc0hhcmRMaW5lQnJlYWsoKSkKLSAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGF1dG8mIGlubGluZUJveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwot
ICAgICAgICAgICAgLy8gRXZlbiBuZWdhdGl2ZSBob3Jpem9udGFsIG1hcmdpbiBtYWtlcyB0aGUg
bGluZSAiY29udGVudGZ1bCIuCi0gICAgICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94U3RhcnQo
KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5saW5lQm94R2VvbWV0cnkubWFyZ2luU3RhcnQo
KSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCkgfHwgaW5saW5lQm94R2VvbWV0cnku
cGFkZGluZ0xlZnQoKS52YWx1ZU9yKDBfbHUpOwotICAgICAgICAgICAgaWYgKHJ1bi5pc0lubGlu
ZUJveEVuZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVCb3hHZW9tZXRyeS5tYXJn
aW5FbmQoKSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJSaWdodCgpIHx8IGlubGluZUJveEdl
b21ldHJ5LnBhZGRpbmdSaWdodCgpLnZhbHVlT3IoMF9sdSk7Ci0gICAgICAgICAgICBpZiAocnVu
LmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgIHJldHVybiB0
cnVlOwotICAgICAgICB9OwotICAgICAgICBsaW5lSGFzQ29udGVudCA9IGxpbmVIYXNDb250ZW50
IHx8IHJ1bkhhc0NvbnRlbnQoKTsKLSAgICAgICAgYXV0byBsb2dpY2FsTGVmdCA9IHJvb3RJbmxp
bmVCb3gubG9naWNhbExlZnQoKSArIHJ1bi5sb2dpY2FsTGVmdCgpOwotICAgICAgICBpZiAocnVu
LmlzQm94KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGlubGluZUxldmVsQm94R2VvbWV0cnkgPSBm
b3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0gICAgICAgICAg
ICBhdXRvIG1hcmdpbkJveEhlaWdodCA9IGlubGluZUxldmVsQm94R2VvbWV0cnkubWFyZ2luQm94
SGVpZ2h0KCk7Ci0gICAgICAgICAgICBhdXRvIGFzY2VudCA9IElubGluZUxheW91dFVuaXQgeyB9
OwotICAgICAgICAgICAgaWYgKGxheW91dFN0YXRlKCkuc2hvdWxkTm90U3ludGhlc2l6ZUlubGlu
ZUJsb2NrQmFzZWxpbmUoKSkgewotICAgICAgICAgICAgICAgIC8vIEludGVncmF0aW9uIGNvZGVw
YXRoIGNvbnN0cnVjdHMgcmVwbGFjZWQgYm94ZXMgZm9yIGlubGluZS1ibG9jayBjb250ZW50Lgot
ICAgICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKLSAgICAg
ICAgICAgICAgICBhc2NlbnQgPSAqZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCkuYmFz
ZWxpbmUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxvY2tC
b3goKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlbGluZSBvZiBhbiAnaW5saW5lLWJs
b2NrJyBpcyB0aGUgYmFzZWxpbmUgb2YgaXRzIGxhc3QgbGluZSBib3ggaW4gdGhlIG5vcm1hbCBm
bG93LCB1bmxlc3MgaXQgaGFzIGVpdGhlciBubyBpbi1mbG93IGxpbmUgYm94ZXMgb3IKLSAgICAg
ICAgICAgICAgICAvLyBpZiBpdHMgJ292ZXJmbG93JyBwcm9wZXJ0eSBoYXMgYSBjb21wdXRlZCB2
YWx1ZSBvdGhlciB0aGFuICd2aXNpYmxlJywgaW4gd2hpY2ggY2FzZSB0aGUgYmFzZWxpbmUgaXMg
dGhlIGJvdHRvbSBtYXJnaW4gZWRnZS4KLSAgICAgICAgICAgICAgICBhdXRvIHN5bnRoZXNpemVC
YXNlbGluZSA9ICFsYXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgp
IHx8ICFsYXlvdXRCb3guc3R5bGUoKS5pc092ZXJmbG93VmlzaWJsZSgpOwotICAgICAgICAgICAg
ICAgIGlmIChzeW50aGVzaXplQmFzZWxpbmUpCi0gICAgICAgICAgICAgICAgICAgIGFzY2VudCA9
IG1hcmdpbkJveEhlaWdodDsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAg
ICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZElu
bGluZUZvcm1hdHRpbmdTdGF0ZShkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkpOwot
ICAgICAgICAgICAgICAgICAgICBhdXRvJiBsYXN0TGluZSA9IGZvcm1hdHRpbmdTdGF0ZS5saW5l
cygpLmxhc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBpbmxpbmVCbG9ja0Jhc2VsaW5l
ID0gbGFzdExpbmUubGluZUJveExvZ2ljYWxSZWN0KCkudG9wKCkgKyBsYXN0TGluZS5iYXNlbGlu
ZSgpOwotICAgICAgICAgICAgICAgICAgICBhc2NlbnQgPSBpbmxpbmVMZXZlbEJveEdlb21ldHJ5
Lm1hcmdpbkJlZm9yZSgpICsgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS5ib3JkZXJUb3AoKSArIGlu
bGluZUxldmVsQm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCkgKyBpbmxpbmVCbG9j
a0Jhc2VsaW5lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5
b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKLSAgICAgICAgICAgICAgICBhc2NlbnQgPSBkb3duY2Fz
dDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KS5iYXNlbGluZSgpLnZhbHVlT3IobWFyZ2luQm94SGVp
Z2h0KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhc2NlbnQgPSBtYXJnaW5C
b3hIZWlnaHQ7Ci0gICAgICAgICAgICBsb2dpY2FsTGVmdCArPSBzdGQ6Om1heCgwX2x1LCBpbmxp
bmVMZXZlbEJveEdlb21ldHJ5Lm1hcmdpblN0YXJ0KCkpOwotICAgICAgICAgICAgYXV0byBhdG9t
aWNJbmxpbmVMZXZlbEJveCA9IExpbmVCb3g6OklubGluZUxldmVsQm94OjpjcmVhdGVBdG9taWNJ
bmxpbmVMZXZlbEJveChsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCB7IGlubGluZUxldmVsQm94R2Vv
bWV0cnkuYm9yZGVyQm94V2lkdGgoKSwgbWFyZ2luQm94SGVpZ2h0IH0pOwotICAgICAgICAgICAg
YXRvbWljSW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUoYXNjZW50KTsKLSAgICAgICAgICAgIGF0
b21pY0lubGluZUxldmVsQm94LnNldExheW91dEJvdW5kcyhMaW5lQm94OjpJbmxpbmVMZXZlbEJv
eDo6TGF5b3V0Qm91bmRzIHsgYXNjZW50LCBtYXJnaW5Cb3hIZWlnaHQgLSBhc2NlbnQgfSk7Ci0g
ICAgICAgICAgICBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNhbGx5SWZBcHBsaWNhYmxlKGF0b21pY0lu
bGluZUxldmVsQm94LCBpbmxpbmVMZXZlbEJveEdlb21ldHJ5KTsKLSAgICAgICAgICAgIGxpbmVC
b3guYWRkSW5saW5lTGV2ZWxCb3goV1RGTW92ZShhdG9taWNJbmxpbmVMZXZlbEJveCkpOwotICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJ1bi5pc0lubGluZUJv
eFN0YXJ0KCkpIHsKLSAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgZG9uJ3Qga25vdyB5
ZXQgaG93IHdpZGUgdGhpcyBpbmxpbmUgYm94IGlzLiBMZXQncyBhc3N1bWUgaXQncyBhcyBsb25n
IGFzIHRoZSBsaW5lIGlzCi0gICAgICAgICAgICAvLyBhbmQgYWRqdXN0IGl0IGxhdGVyIGlmIHdl
IGNvbWUgYWNyb3NzIGFuIGlubGluZUJveEVuZCBydW4gKHNlZSBiZWxvdykuCi0gICAgICAgICAg
ICBhdXRvIGluaXRpYWxMb2dpY2FsV2lkdGggPSBsaW5lQm94LmNvbnRlbnRMb2dpY2FsV2lkdGgo
KSAtIHJ1bi5sb2dpY2FsTGVmdCgpOwotICAgICAgICAgICAgQVNTRVJUKGluaXRpYWxMb2dpY2Fs
V2lkdGggPj0gMCk7Ci0gICAgICAgICAgICAvLyBJbmxpbmUgYm94IHJ1biBpcyBiYXNlZCBvbiBt
YXJnaW4gYm94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBib3guCi0gICAgICAgICAgICBh
dXRvIG1hcmdpblN0YXJ0ID0gc3RkOjptYXgoMF9sdSwgZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9t
ZXRyeUZvckJveChsYXlvdXRCb3gpLm1hcmdpblN0YXJ0KCkpOwotICAgICAgICAgICAgbG9naWNh
bExlZnQgKz0gbWFyZ2luU3RhcnQ7Ci0gICAgICAgICAgICBpbml0aWFsTG9naWNhbFdpZHRoIC09
IG1hcmdpblN0YXJ0OwotICAgICAgICAgICAgYXV0byBpbmxpbmVCb3ggPSBMaW5lQm94OjpJbmxp
bmVMZXZlbEJveDo6Y3JlYXRlSW5saW5lQm94KGxheW91dEJveCwgbG9naWNhbExlZnQsIGluaXRp
YWxMb2dpY2FsV2lkdGgpOwotICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRyeUZvcklubGlu
ZUJveChpbmxpbmVCb3gpOwotICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlm
QXBwbGljYWJsZShpbmxpbmVCb3gsIHsgfSk7Ci0gICAgICAgICAgICBsaW5lQm94LmFkZElubGlu
ZUxldmVsQm94KFdURk1vdmUoaW5saW5lQm94KSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgfQotICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94RW5kKCkpIHsKLSAgICAgICAgICAg
IC8vIEFkanVzdCB0aGUgbG9naWNhbCB3aWR0aCB3aGVuIHRoZSBpbmxpbmUgYm94IGNsb3NlcyBv
biB0aGlzIGxpbmUuCi0gICAgICAgICAgICBhdXRvJiBpbmxpbmVCb3ggPSBsaW5lQm94LmlubGlu
ZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0gICAgICAgICAgICBBU1NFUlQoaW5s
aW5lQm94LmlzSW5saW5lQm94KCkpOwotICAgICAgICAgICAgLy8gSW5saW5lIGJveCBydW4gaXMg
YmFzZWQgb24gbWFyZ2luIGJveC4gTGV0J3MgY29udmVydCBpdCB0byBib3JkZXIgYm94LgotICAg
ICAgICAgICAgYXV0byBtYXJnaW5FbmQgPSBzdGQ6Om1heCgwX2x1LCBmb3JtYXR0aW5nQ29udGV4
dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCkubWFyZ2luRW5kKCkpOwotICAgICAgICAgICAg
YXV0byBpbmxpbmVCb3hMb2dpY2FsUmlnaHQgPSBsb2dpY2FsTGVmdCArIHJ1bi5sb2dpY2FsV2lk
dGgoKSAtIG1hcmdpbkVuZDsKLSAgICAgICAgICAgIGlubGluZUJveC5zZXRMb2dpY2FsV2lkdGgo
aW5saW5lQm94TG9naWNhbFJpZ2h0IC0gaW5saW5lQm94LmxvZ2ljYWxMZWZ0KCkpOwotICAgICAg
ICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGljYWJsZShpbmxpbmVCb3gsIHsg
fSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnVuLmlz
VGV4dCgpIHx8IHJ1bi5pc1NvZnRMaW5lQnJlYWsoKSkgewotICAgICAgICAgICAgLy8gRklYTUU6
IEFkanVzdCBub24tZW1wdHkgaW5saW5lIGJveCBoZWlnaHQgd2hlbiBnbHlwaHMgZnJvbSB0aGUg
bm9uLXByaW1hcnkgZm9udCBzdHJldGNoIHRoZSBib3guCi0gICAgICAgICAgICBsaW5lQm94Lmlu
bGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSkuc2V0SGFzQ29udGVu
dCgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJ1bi5p
c0hhcmRMaW5lQnJlYWsoKSkgewotICAgICAgICAgICAgYXV0byBsaW5lQnJlYWtCb3ggPSBMaW5l
Qm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlTGluZUJyZWFrQm94KGxheW91dEJveCwgbG9naWNh
bExlZnQpOwotICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRyeUZvcklubGluZUJveChsaW5l
QnJlYWtCb3gpOwotICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGlj
YWJsZShsaW5lQnJlYWtCb3gsIHsgfSk7Ci0gICAgICAgICAgICBsaW5lQm94LmFkZElubGluZUxl
dmVsQm94KFdURk1vdmUobGluZUJyZWFrQm94KSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgfQotICAgICAgICBpZiAocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkgewotICAg
ICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChMaW5lQm94OjpJbmxpbmVMZXZlbEJv
eDo6Y3JlYXRlR2VuZXJpY0lubGluZUxldmVsQm94KGxheW91dEJveCwgbG9naWNhbExlZnQpKTsK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOwotICAgIH0KLQotICAgIGxpbmVCb3guc2V0SGFzQ29udGVudChsaW5lSGFzQ29udGVu
dCk7Ci0gICAgaWYgKHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5pc0VuYWJsZWQoKSB8fCAh
bGluZUhhc0NvbnRlbnQpIHsKLSAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRv
IGV4ZXJjaXNlIHRoZSBmYXN0IHBhdGggd2hlbiB0aGUgbGluZSBoYXMgbm8gY29udGVudCBhdCBh
bGwsIGV2ZW4gaW4gbm9uLXN0YW5kYXJkcyBtb2RlIG9yIHdpdGggbGluZS1oZWlnaHQgc2V0Lgot
ICAgICAgICByb290SW5saW5lQm94LnNldExvZ2ljYWxUb3AobGluZUhhc0NvbnRlbnQgPyBzaW1w
bGlmaWVkVmVydGljYWxBbGlnbm1lbnQucm9vdElubGluZUJveExvZ2ljYWxUb3AoKSA6IC1yb290
SW5saW5lQm94LmJhc2VsaW5lKCkpOwotICAgICAgICBsaW5lQm94LnNldExvZ2ljYWxIZWlnaHQo
bGluZUhhc0NvbnRlbnQgPyBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQubGluZUJveEhlaWdo
dCgpIDogSW5saW5lTGF5b3V0VW5pdCgpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgY29tcHV0ZUxp
bmVCb3hIZWlnaHRBbmRBbGlnbklubGluZUxldmVsQm94ZXNWZXJ0aWNhbGx5KGxpbmVCb3gpOwot
fQotCi12b2lkIExpbmVCb3hCdWlsZGVyOjpjb21wdXRlTGluZUJveEhlaWdodEFuZEFsaWduSW5s
aW5lTGV2ZWxCb3hlc1ZlcnRpY2FsbHkoTGluZUJveCYgbGluZUJveCkKLXsKLSAgICBBU1NFUlQo
bGluZUJveC5oYXNDb250ZW50KCkpOwotICAgIC8vIFRoaXMgZnVuY3Rpb24gKHBhcnRpYWxseSkg
aW1wbGVtZW50czoKLSAgICAvLyAyLjIuIExheW91dCBXaXRoaW4gTGluZSBCb3hlcwotICAgIC8v
IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xpbmUtbGF5b3V0Ci0gICAgLy8g
MS4gQ29tcHV0ZSB0aGUgbGluZSBib3ggaGVpZ2h0IHVzaW5nIHRoZSBsYXlvdXQgYm91bmRzIGdl
b21ldHJ5LiBUaGlzIGhlaWdodCBjb21wdXRhdGlvbiBzdHJpY3RseSB1c2VzIGxheW91dCBib3Vu
ZHMgYW5kIG5vdCBub3JtYWwgaW5saW5lIGxldmVsIGJveCBnZW9tZXRyaWVzLgotICAgIC8vIDIu
IENvbXB1dGUgdGhlIGJhc2VsaW5lL2xvZ2ljYWwgdG9wIHBvc2l0aW9uIG9mIHRoZSByb290IGlu
bGluZSBib3guIEFsaWduZWQgYm94ZXMgcHVzaCB0aGUgcm9vdCBpbmxpbmUgYm94IGFyb3VuZCBp
bnNpZGUgdGhlIGxpbmUgYm94LgotICAgIC8vIDMuIEZpbmFsbHkgYWxpZ24gdGhlIGlubGluZSBs
ZXZlbCBib3hlcyB1c2luZyAobW9zdGx5KSBub3JtYWwgaW5saW5lIGxldmVsIGJveCBnZW9tZXRy
aWVzLgotICAgIGF1dG8gcXVpcmtzID0gZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKTsKLSAg
ICBhdXRvJiByb290SW5saW5lQm94ID0gbGluZUJveC5yb290SW5saW5lQm94KCk7Ci0KLSAgICBh
dXRvIGNvbXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCA9IFsmXSB7Ci0gICAgICAgIC8vIExpbmUg
Ym94IGhlaWdodCBjb21wdXRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgbGF5b3V0IGJvdW5kcyBvZiB0
aGUgaW5saW5lIGJveGVzIGFuZCBub3QgdGhlaXIgbG9naWNhbCAoYXNjZW50L2Rlc2NlbnQpIGRp
bWVuc2lvbnMuCi0gICAgICAgIHN0cnVjdCBBYnNvbHV0ZVRvcEFuZEJvdHRvbSB7Ci0gICAgICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IHRvcCB7IDAgfTsKLSAgICAgICAgICAgIElubGluZUxheW91
dFVuaXQgYm90dG9tIHsgMCB9OwotICAgICAgICB9OwotICAgICAgICBIYXNoTWFwPGNvbnN0IExp
bmVCb3g6OklubGluZUxldmVsQm94KiwgQWJzb2x1dGVUb3BBbmRCb3R0b20+IGlubGluZUxldmVs
Qm94QWJzb2x1dGVUb3BBbmRCb3R0b21NYXA7Ci0KLSAgICAgICAgYXV0byBtaW5pbXVtTG9naWNh
bFRvcCA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKLSAgICAgICAgYXV0byBtYXhp
bXVtTG9naWNhbEJvdHRvbSA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKLSAgICAg
ICAgaWYgKHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KHJvb3RJbmxpbmVCb3gs
IGxpbmVCb3gpKSB7Ci0gICAgICAgICAgICBtaW5pbXVtTG9naWNhbFRvcCA9IElubGluZUxheW91
dFVuaXQgeyB9OwotICAgICAgICAgICAgbWF4aW11bUxvZ2ljYWxCb3R0b20gPSByb290SW5saW5l
Qm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpOwotICAgICAgICAgICAgaW5saW5lTGV2ZWxCb3hB
YnNvbHV0ZVRvcEFuZEJvdHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVCb3gsIEFic29sdXRlVG9wQW5k
Qm90dG9tIHsgKm1pbmltdW1Mb2dpY2FsVG9wLCAqbWF4aW11bUxvZ2ljYWxCb3R0b20gfSk7Ci0g
ICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaW5saW5lTGV2ZWxCb3hBYnNvbHV0ZVRvcEFuZEJv
dHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVCb3gsIEFic29sdXRlVG9wQW5kQm90dG9tIHsgfSk7Ci0K
LSAgICAgICAgVmVjdG9yPExpbmVCb3g6OklubGluZUxldmVsQm94Kj4gbGluZUJveFJlbGF0aXZl
SW5saW5lTGV2ZWxCb3hlczsKLSAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxp
bmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgewotICAgICAgICAgICAgYXV0byYgbGF5
b3V0Qm94ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7Ci0gICAgICAgICAgICBpZiAoaW5s
aW5lTGV2ZWxCb3guaGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpIHsKLSAgICAgICAgICAg
ICAgICBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveGVzLmFwcGVuZCgmaW5saW5lTGV2ZWxC
b3gpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgYXV0byYgcGFyZW50SW5saW5lQm94ID0gbGluZUJveC5pbmxpbmVMZXZlbEJveEZvckxheW91
dEJveChsYXlvdXRCb3gucGFyZW50KCkpOwotICAgICAgICAgICAgLy8gTG9naWNhbCB0b3AgaXMg
cmVsYXRpdmUgdG8gdGhlIHBhcmVudCBpbmxpbmUgYm94J3MgbGF5b3V0IGJvdW5kcy4KLSAgICAg
ICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGxvZ2ljYWwgdG9wIGlzIG5vdCB0aGUgZmluYWwgbG9n
aWNhbCB0b3Agb2YgdGhlIGlubGluZSBsZXZlbCBib3guCi0gICAgICAgICAgICAvLyBUaGlzIGlz
IHRoZSBsb2dpY2FsIHRvcCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbGF5b3V0IGJvdW5kcyBnZW9t
ZXRyeSB3aGljaCBtYXkgYmUgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgaW5saW5lIGJveCdzIG5v
cm1hbCBnZW9tZXRyeS4KLSAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcCA9IElubGluZUxheW91
dFVuaXQgeyB9OwotICAgICAgICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFs
aWduKCkpIHsKLSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmU6IHsKLSAg
ICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBp
bmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0gICAgICAgICAgICAgICAgbG9n
aWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBsb2dpY2Fs
VG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6IHsKLSAg
ICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBp
bmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSAvIDIgKyBwYXJlbnRJbmxpbmVC
b3guc3R5bGUoKS5mb250TWV0cmljcygpLnhIZWlnaHQoKSAvIDI7Ci0gICAgICAgICAgICAgICAg
bG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBsb2dp
Y2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZU1p
ZGRsZTogewotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRC
YXNlbGluZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpIC8gMjsKLSAg
ICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5kcygp
LmFzY2VudCAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7Ci0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246Okxlbmd0aDogewotICAgICAgICAgICAgICAgIGF1dG8mIHN0eWxlID0gaW5saW5lTGV2ZWxC
b3guc3R5bGUoKTsKLSAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFy
ZW50QmFzZWxpbmUgPSBmbG9hdFZhbHVlRm9yTGVuZ3RoKHN0eWxlLnZlcnRpY2FsQWxpZ25MZW5n
dGgoKSwgc3R5bGUuY29tcHV0ZWRMaW5lSGVpZ2h0KCkpICsgaW5saW5lTGV2ZWxCb3gubGF5b3V0
Qm91bmRzKCkuYXNjZW50OwotICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxp
bmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRC
YXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VGV4dFRvcDogewotICAgICAgICAgICAgICAgIC8vIE5v
dGUgdGhhdCB0ZXh0LXRvcCBhbGlnbnMgd2l0aCB0aGUgaW5saW5lIGJveCdzIGZvbnQgbWV0cmlj
cyB0b3AgKGFzY2VudCkgYW5kIG5vdCB0aGUgbGF5b3V0IGJvdW5kcyB0b3AuCi0gICAgICAgICAg
ICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQg
LSBwYXJlbnRJbmxpbmVCb3guYmFzZWxpbmUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VGV4dEJvdHRvbTog
ewotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0ZXh0LWJvdHRvbSBhbGlnbnMgd2l0aCB0
aGUgaW5saW5lIGJveCdzIGZvbnQgbWV0cmljcyBib3R0b20gKGRlc2NlbnQpIGFuZCBub3QgdGhl
IGxheW91dCBib3VuZHMgYm90dG9tLgotICAgICAgICAgICAgICAgIGF1dG8gcGFyZW50SW5saW5l
Qm94TGF5b3V0Qm91bmRzID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5kcygpOwotICAgICAg
ICAgICAgICAgIGF1dG8gcGFyZW50SW5saW5lQm94TG9naWNhbEJvdHRvbSA9IHBhcmVudElubGlu
ZUJveExheW91dEJvdW5kcy5oZWlnaHQoKSAtIHBhcmVudElubGluZUJveExheW91dEJvdW5kcy5k
ZXNjZW50ICsgcGFyZW50SW5saW5lQm94LmRlc2NlbnQoKS52YWx1ZU9yKElubGluZUxheW91dFVu
aXQoKSk7Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveExvZ2lj
YWxCb3R0b20gLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKTsKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0g
ICAgICAgICAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKLSAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dG8gcGFyZW50SW5saW5l
Qm94QWJzb2x1dGVUb3BBbmRCb3R0b20gPSBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9wQW5kQm90
dG9tTWFwLmdldCgmcGFyZW50SW5saW5lQm94KTsKLSAgICAgICAgICAgIGF1dG8gYWJzb2x1dGVM
b2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94QWJzb2x1dGVUb3BBbmRCb3R0b20udG9wICsgbG9n
aWNhbFRvcDsKLSAgICAgICAgICAgIGF1dG8gYWJzb2x1dGVMb2dpY2FsQm90dG9tID0gYWJzb2x1
dGVMb2dpY2FsVG9wICsgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCk7Ci0g
ICAgICAgICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9wQW5kQm90dG9tTWFwLmFkZCgmaW5s
aW5lTGV2ZWxCb3gsIEFic29sdXRlVG9wQW5kQm90dG9tIHsgYWJzb2x1dGVMb2dpY2FsVG9wLCBh
YnNvbHV0ZUxvZ2ljYWxCb3R0b20gfSk7Ci0gICAgICAgICAgICAvLyBTdHJldGNoIHRoZSBtaW4v
bWF4IGFic29sdXRlIHZhbHVlcyBpZiBhcHBsaWNhYmxlLgotICAgICAgICAgICAgaWYgKHF1aXJr
cy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGlubGluZUxldmVsQm94LCBsaW5lQm94KSkg
ewotICAgICAgICAgICAgICAgIG1pbmltdW1Mb2dpY2FsVG9wID0gc3RkOjptaW4obWluaW11bUxv
Z2ljYWxUb3AudmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxUb3ApLCBhYnNvbHV0ZUxvZ2ljYWxUb3Ap
OwotICAgICAgICAgICAgICAgIG1heGltdW1Mb2dpY2FsQm90dG9tID0gc3RkOjptYXgobWF4aW11
bUxvZ2ljYWxCb3R0b20udmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxCb3R0b20pLCBhYnNvbHV0ZUxv
Z2ljYWxCb3R0b20pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBs
aW5lIGJveCBoZWlnaHQgY29tcHV0YXRpb24gaXMgYXMgZm9sbG93czoKLSAgICAgICAgLy8gMS4g
U3RyZXRjaCB0aGUgbGluZSBib3ggd2l0aCB0aGUgbm9uLWxpbmUtYm94IHJlbGF0aXZlIGFsaWdu
ZWQgaW5saW5lIGJveCBhYnNvbHV0ZSB0b3AgYW5kIGJvdHRvbSB2YWx1ZXMuCi0gICAgICAgIC8v
IDIuIENoZWNrIGlmIHRoZSBsaW5lIGJveCByZWxhdGl2ZSBhbGlnbmVkIGlubGluZSBib3hlcyAo
dG9wLCBib3R0b20gZXRjKSBoYXZlIGVub3VnaCByb29tIGFuZCBzdHJldGNoIHRoZSBsaW5lIGJv
eCBmdXJ0aGVyIGlmIG5lZWRlZC4KLSAgICAgICAgYXV0byBsaW5lQm94TG9naWNhbEhlaWdodCA9
IG1heGltdW1Mb2dpY2FsQm90dG9tLnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCgpKSAtIG1pbmlt
dW1Mb2dpY2FsVG9wLnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCgpKTsKLSAgICAgICAgZm9yIChh
dXRvKiBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveCA6IGxpbmVCb3hSZWxhdGl2ZUlubGlu
ZUxldmVsQm94ZXMpIHsKLSAgICAgICAgICAgIGlmICghcXVpcmtzLmlubGluZUxldmVsQm94QWZm
ZWN0c0xpbmVCb3goKmxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94LCBsaW5lQm94KSkKLSAg
ICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGxpbmVCb3hMb2dpY2FsSGVpZ2h0
ID0gc3RkOjptYXgobGluZUJveExvZ2ljYWxIZWlnaHQsIGxpbmVCb3hSZWxhdGl2ZUlubGluZUxl
dmVsQm94LT5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbGlu
ZUJveC5zZXRMb2dpY2FsSGVpZ2h0KGxpbmVCb3hMb2dpY2FsSGVpZ2h0KTsKLSAgICB9OwotICAg
IGNvbXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCgpOwotCi0gICAgYXV0byBjb21wdXRlUm9vdElu
bGluZUJveFZlcnRpY2FsUG9zaXRpb24gPSBbJl0gewotICAgICAgICBIYXNoTWFwPGNvbnN0IExp
bmVCb3g6OklubGluZUxldmVsQm94KiwgSW5saW5lTGF5b3V0VW5pdD4gaW5saW5lTGV2ZWxCb3hB
YnNvbHV0ZUJhc2VsaW5lT2Zmc2V0TWFwOwotICAgICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRl
QmFzZWxpbmVPZmZzZXRNYXAuYWRkKCZyb290SW5saW5lQm94LCBJbmxpbmVMYXlvdXRVbml0IHsg
fSk7Ci0KLSAgICAgICAgYXV0byBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNl
bGluZSA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKLSAgICAgICAgaWYgKHF1aXJr
cy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KHJvb3RJbmxpbmVCb3gsIGxpbmVCb3gpKQot
ICAgICAgICAgICAgbWF4aW11bVRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxpbmUgPSBy
b290SW5saW5lQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKLQotICAgICAgICBmb3IgKGF1dG8m
IGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hlcygpKSB7Ci0g
ICAgICAgICAgICBhdXRvIGFic29sdXRlQmFzZWxpbmVPZmZzZXQgPSBJbmxpbmVMYXlvdXRVbml0
IHsgfTsKLSAgICAgICAgICAgIGlmICghaW5saW5lTGV2ZWxCb3guaGFzTGluZUJveFJlbGF0aXZl
QWxpZ25tZW50KCkpIHsKLSAgICAgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBpbmxpbmVM
ZXZlbEJveC5sYXlvdXRCb3goKTsKLSAgICAgICAgICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVC
b3ggPSBsaW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQo
KSk7Ci0gICAgICAgICAgICAgICAgYXV0byBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGlu
ZSA9IElubGluZUxheW91dFVuaXQgeyB9OwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChpbmxp
bmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFZlcnRp
Y2FsQWxpZ246OkJhc2VsaW5lOgotICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldEZy
b21QYXJlbnRCYXNlbGluZSA9IHsgfTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6IHsKLSAgICAgICAgICAgICAg
ICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gKGlubGluZUxl
dmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpIC8gMiArIHBhcmVudElubGluZUJveC5zdHls
ZSgpLmZvbnRNZXRyaWNzKCkueEhlaWdodCgpIC8gMik7Ci0gICAgICAgICAgICAgICAgICAgIGJh
c2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJl
bnRCYXNlbGluZSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKLSAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmVNaWRkbGU6IHsKLSAgICAgICAgICAgICAgICAg
ICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gaW5saW5lTGV2ZWxC
b3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCkgLyAyOwotICAgICAgICAgICAgICAgICAgICBiYXNl
bGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50
QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0gICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBj
YXNlIFZlcnRpY2FsQWxpZ246Okxlbmd0aDogewotICAgICAgICAgICAgICAgICAgICBhdXRvJiBz
dHlsZSA9IGlubGluZUxldmVsQm94LnN0eWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8g
dmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5ndGgoc3R5bGUudmVydGljYWxB
bGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKSk7Ci0gICAgICAgICAgICAg
ICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHZlcnRpY2Fs
QWxpZ25PZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOwotICAgICAgICAgICAgICAg
ICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxUb3BPZmZzZXRG
cm9tUGFyZW50QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOwotICAgICAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2Fz
ZSBWZXJ0aWNhbEFsaWduOjpUZXh0VG9wOgotICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9m
ZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OwotICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRCb3R0b206Ci0g
ICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtICpwYXJlbnRJbmxpbmVCb3guZGVz
Y2VudCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZh
dWx0OgotICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOwot
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgYWJzb2x1dGVCYXNlbGluZU9mZnNldCA9IGlubGluZUxldmVsQm94QWJzb2x1dGVCYXNl
bGluZU9mZnNldE1hcC5nZXQoJnBhcmVudElubGluZUJveCkgKyBiYXNlbGluZU9mZnNldEZyb21Q
YXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3dp
dGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKLSAgICAgICAgICAgICAgICBj
YXNlIFZlcnRpY2FsQWxpZ246OlRvcDogewotICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUJh
c2VsaW5lT2Zmc2V0ID0gcm9vdElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBpbmxp
bmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246OkJvdHRvbTogewotICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0
ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtIHJvb3RJbmxpbmVCb3gu
bGF5b3V0Qm91bmRzKCkuZGVzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAg
ICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlubGlu
ZUxldmVsQm94QWJzb2x1dGVCYXNlbGluZU9mZnNldE1hcC5hZGQoJmlubGluZUxldmVsQm94LCBh
YnNvbHV0ZUJhc2VsaW5lT2Zmc2V0KTsKLSAgICAgICAgICAgIGF1dG8gYWZmZWN0c1Jvb3RJbmxp
bmVCb3hWZXJ0aWNhbFBvc2l0aW9uID0gcXVpcmtzLmlubGluZUxldmVsQm94QWZmZWN0c0xpbmVC
b3goaW5saW5lTGV2ZWxCb3gsIGxpbmVCb3gpOwotICAgICAgICAgICAgaWYgKGFmZmVjdHNSb290
SW5saW5lQm94VmVydGljYWxQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIGF1dG8gdG9wT2Zm
c2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IGFic29sdXRlQmFzZWxpbmVPZmZzZXQgKyBp
bmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0gICAgICAgICAgICAgICAgaWYg
KG1heGltdW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2VsaW5lKQotICAgICAgICAgICAg
ICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IHN0ZDo6
bWF4KCptYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSwgdG9wT2Zmc2V0
RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAg
ICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpcyBxdWlyayBtb2RlIGFuZCB0aGUgcm9vdCBpbmxp
bmUgYm94IGhhcyBubyBjb250ZW50LiBUaGUgcm9vdCBpbmxpbmUgYm94J3MgYmFzZWxpbmUgaXMg
YW5jaG9yZWQgYXQgMC4KLSAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBuZWdhdGl2ZSBh
c2NlbnQgKGUuZyBuZWdhdGl2ZSB0b3AgbWFyZ2luKSBjYW4gInB1c2giIHRoZSByb290IGlubGlu
ZSBib3ggdXB3YXJkcyBhbmQgaGF2ZSBhIG5lZ2F0aXZlIHZhbHVlLgotICAgICAgICAgICAgICAg
ICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IGlubGluZUxl
dmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudCA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAg
ICA/IHN0ZDo6bWF4KDAuMGYsIHRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxpbmUpCi0g
ICAgICAgICAgICAgICAgICAgICAgICA6IHRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxp
bmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAg
IGF1dG8gcm9vdElubGluZUJveExvZ2ljYWxUb3AgPSBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJ
bmxpbmVCb3hCYXNlbGluZS52YWx1ZU9yKDAuZikgLSByb290SW5saW5lQm94LmJhc2VsaW5lKCk7
Ci0gICAgICAgIHJvb3RJbmxpbmVCb3guc2V0TG9naWNhbFRvcChyb290SW5saW5lQm94TG9naWNh
bFRvcCk7Ci0gICAgfTsKLSAgICBjb21wdXRlUm9vdElubGluZUJveFZlcnRpY2FsUG9zaXRpb24o
KTsKLQotICAgIGF1dG8gYWxpZ25JbmxpbmVMZXZlbEJveGVzID0gWyZdIHsKLSAgICAgICAgZm9y
IChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMo
KSkgewotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0
Qm94KCk7Ci0gICAgICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVCb3ggPSBsaW5lQm94LmlubGlu
ZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSk7Ci0gICAgICAgICAgICBh
dXRvIGxvZ2ljYWxUb3AgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAgICAgICAgICAgIHN3aXRj
aCAoaW5saW5lTGV2ZWxCb3gudmVydGljYWxBbGlnbigpKSB7Ci0gICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246OkJhc2VsaW5lOgotICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJl
bnRJbmxpbmVCb3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7Ci0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Ok1pZGRs
ZTogewotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNl
bGluZSA9IChpbmxpbmVMZXZlbEJveC5sb2dpY2FsSGVpZ2h0KCkgLyAyICsgcGFyZW50SW5saW5l
Qm94LnN0eWxlKCkuZm9udE1ldHJpY3MoKS54SGVpZ2h0KCkgLyAyKTsKLSAgICAgICAgICAgICAg
ICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmJhc2VsaW5lKCkgLSBsb2dpY2FsVG9wT2Zm
c2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZU1pZGRsZTogewot
ICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9
IGlubGluZUxldmVsQm94LmxvZ2ljYWxIZWlnaHQoKSAvIDI7Ci0gICAgICAgICAgICAgICAgbG9n
aWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6TGVuZ3RoOiB7Ci0gICAgICAgICAgICAg
ICAgYXV0byYgc3R5bGUgPSBpbmxpbmVMZXZlbEJveC5zdHlsZSgpOwotICAgICAgICAgICAgICAg
IGF1dG8gdmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5ndGgoc3R5bGUudmVy
dGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKSk7Ci0gICAgICAg
ICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gdmVydGlj
YWxBbGlnbk9mZnNldCArIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7Ci0gICAgICAgICAgICAg
ICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gbG9naWNhbFRvcE9m
ZnNldEZyb21QYXJlbnRCYXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCAodGV4dCl0b3AvYm90dG9tIGFsaWduIHRo
ZWlyIGxheW91dCBib3VuZHMuCi0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRU
b3A6Ci0gICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94LmxheW91dEJv
dW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7Ci0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRCb3R0b206Ci0g
ICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sb2dpY2FsSGVpZ2h0
KCkgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5kZXNjZW50IC0gaW5saW5lTGV2ZWxC
b3guYmFzZWxpbmUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2Ug
VmVydGljYWxBbGlnbjo6VG9wOgotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGxv
Z2ljYWwgdG9wIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGlubGluZSBib3guCi0gICAg
ICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFz
Y2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJvdHRvbToKLSAgICAgICAgICAgICAg
ICAvLyBOb3RlIHRoYXQgdGhpcyBsb2dpY2FsIHRvcCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHBh
cmVudCBpbmxpbmUgYm94LgotICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBsaW5lQm94Lmxv
Z2ljYWxIZWlnaHQoKSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmRlc2NlbnQgLSBp
bmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lF
VCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
aW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChsb2dpY2FsVG9wKTsKLSAgICAgICAgfQotICAg
IH07Ci0gICAgYWxpZ25JbmxpbmVMZXZlbEJveGVzKCk7Ci19Ci0KLUxpbmVCb3hCdWlsZGVyOjpT
aW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OlNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudChj
b25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgcm9vdElubGluZUJveCkKLSAgICA6IG1fcm9v
dElubGluZUJveChyb290SW5saW5lQm94KQotewotICAgIGFkanVzdChyb290SW5saW5lQm94KTsK
LX0KLQotYm9vbCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50Ojpj
YW5Vc2VTaW1wbGlmaWVkQWxpZ25tZW50KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiBy
b290SW5saW5lQm94LCBjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxC
b3gsIE9wdGlvbmFsPGNvbnN0IEJveEdlb21ldHJ5PiBpbmxpbmVMZXZlbEJveEdlb21ldHJ5KQot
ewotICAgIGlmIChpbmxpbmVMZXZlbEJveC5pc0F0b21pY0lubGluZUxldmVsQm94KCkpIHsKLSAg
ICAgICAgQVNTRVJUKGlubGluZUxldmVsQm94R2VvbWV0cnkpOwotICAgICAgICAvLyBCYXNlbGlu
ZSBhbGlnbmVkLCBub24tc3RyZXRjaHkgZGlyZWN0IGNoaWxkcmVuIGFyZSBjb25zaWRlcmVkIHRv
IGJlIHNpbXBsZSBmb3Igbm93LgotICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBpbmxpbmVMZXZl
bEJveC5sYXlvdXRCb3goKTsKLSAgICAgICAgcmV0dXJuICZsYXlvdXRCb3gucGFyZW50KCkgPT0g
JnJvb3RJbmxpbmVCb3gubGF5b3V0Qm94KCkKLSAgICAgICAgICAgICYmIGxheW91dEJveC5zdHls
ZSgpLnZlcnRpY2FsQWxpZ24oKSA9PSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZQotICAgICAgICAg
ICAgJiYgIWlubGluZUxldmVsQm94R2VvbWV0cnktPm1hcmdpbkJlZm9yZSgpCi0gICAgICAgICAg
ICAmJiAhaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQWZ0ZXIoKQotICAgICAgICAgICAg
JiYgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQm94SGVpZ2h0KCkgPD0gcm9vdElubGlu
ZUJveC5iYXNlbGluZSgpOwotICAgIH0KLSAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNMaW5lQnJl
YWtCb3goKSkgewotICAgICAgICAvLyBCYXNlbGluZSBhbGlnbmVkLCBub24tc3RyZXRjaHkgbGlu
ZSBicmVha3MgZS5nLiA8ZGl2PjxzcGFuPjxicj48L3NwYW4+PC9kaXY+IGJ1dCBub3QgPGRpdj48
c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMDBweDsiPjxicj48L3NwYW4+PC9kaXY+LgotICAgICAg
ICByZXR1cm4gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5bGUoKS52ZXJ0aWNhbEFsaWdu
KCkgPT0gVmVydGljYWxBbGlnbjo6QmFzZWxpbmUgJiYgaW5saW5lTGV2ZWxCb3guYmFzZWxpbmUo
KSA8PSByb290SW5saW5lQm94LmJhc2VsaW5lKCk7Ci0gICAgfQotICAgIGlmIChpbmxpbmVMZXZl
bEJveC5pc0lubGluZUJveCgpKSB7Ci0gICAgICAgIC8vIEJhc2VsaW5lIGFsaWduZWQsIG5vbi1z
dHJldGNoeSBpbmxpbmUgYm94ZXMgZS5nLiA8ZGl2PjxzcGFuPjwvc3Bhbj48L2Rpdj4gYnV0IG5v
dCA8ZGl2PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwMHB4OyI+PC9zcGFuPjwvZGl2Pi4KLSAg
ICAgICAgcmV0dXJuIGlubGluZUxldmVsQm94LmxheW91dEJveCgpLnN0eWxlKCkudmVydGljYWxB
bGlnbigpID09IFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lICYmIGlubGluZUxldmVsQm94LmxheW91
dEJvdW5kcygpID09IHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCk7Ci0gICAgfQotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotdm9pZCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmllZFZlcnRpY2Fs
QWxpZ25tZW50OjphbGlnbihMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3gp
Ci17Ci0gICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSB8fCBp
bmxpbmVMZXZlbEJveC5pc0xpbmVCcmVha0JveCgpIHx8IGlubGluZUxldmVsQm94LmlzSW5saW5l
Qm94KCkpIHsKLSAgICAgICAgLy8gT25seSBiYXNlbGluZSBhbGlnbm1lbnQgZm9yIG5vdy4KLSAg
ICAgICAgaW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChtX3Jvb3RJbmxpbmVCb3guYmFzZWxp
bmUoKSAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCkpOwotICAgICAgICBhZGp1c3QoaW5saW5l
TGV2ZWxCb3gpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfSU1QTEVN
RU5URURfWUVUKCk7Ci19Ci0KLXZvaWQgTGluZUJveEJ1aWxkZXI6OlNpbXBsaWZpZWRWZXJ0aWNh
bEFsaWdubWVudDo6YWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiBpbmxpbmVM
ZXZlbEJveCkKLXsKLSAgICBhdXRvIGxheW91dEJvdW5kc0xvZ2ljYWxUb3AgPSBtX3Jvb3RJbmxp
bmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRz
KCkuYXNjZW50OwotICAgIG1fbGluZUJveExvZ2ljYWxUb3AgPSBzdGQ6Om1pbihtX2xpbmVCb3hM
b2dpY2FsVG9wLCBsYXlvdXRCb3VuZHNMb2dpY2FsVG9wKTsKLSAgICBtX2xpbmVCb3hMb2dpY2Fs
Qm90dG9tID0gc3RkOjptYXgobV9saW5lQm94TG9naWNhbEJvdHRvbSwgbGF5b3V0Qm91bmRzTG9n
aWNhbFRvcCArIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpKTsKLSAgICBt
X3Jvb3RJbmxpbmVCb3hMb2dpY2FsVG9wID0gc3RkOjptYXgobV9yb290SW5saW5lQm94TG9naWNh
bFRvcCwgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbV9yb290SW5saW5l
Qm94LmJhc2VsaW5lKCkpOwotfQotCi1MaW5lQm94IElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpH
ZW9tZXRyeTo6bGluZUJveEZvckxpbmVDb250ZW50KGNvbnN0IExpbmVCdWlsZGVyOjpMaW5lQ29u
dGVudCYgbGluZUNvbnRlbnQpCi17Ci0gICAgcmV0dXJuIExpbmVCb3hCdWlsZGVyKGZvcm1hdHRp
bmdDb250ZXh0KCkpLmJ1aWxkKGxpbmVDb250ZW50KTsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmxvZ2ljYWxUb3BGb3JOZXh0TGluZShj
b25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250ZW50LCBJbmxpbmVMYXlvdXRV
bml0IHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIGNvbnN0IEZsb2F0aW5nQ29udGV4dCYgZmxv
YXRpbmdDb250ZXh0KSBjb25zdAotewotICAgIC8vIE5vcm1hbGx5IHRoZSBuZXh0IGxpbmUncyBs
b2dpY2FsIHRvcCBpcyB0aGUgcHJldmlvdXMgbGluZSdzIGxvZ2ljYWwgYm90dG9tLCBidXQgd2hl
biB0aGUgbGluZSBlbmRzCi0gICAgLy8gd2l0aCB0aGUgY2xlYXIgcHJvcGVydHkgc2V0LCB0aGUg
bmV4dCBsaW5lIG5lZWRzIHRvIGNsZWFyIHRoZSBleGlzdGluZyBmbG9hdHMuCi0gICAgaWYgKGxp
bmVDb250ZW50LnJ1bnMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gcHJldmlvdXNMaW5lTG9n
aWNhbEJvdHRvbTsKLSAgICBhdXRvJiBsYXN0UnVuTGF5b3V0Qm94ID0gbGluZUNvbnRlbnQucnVu
cy5sYXN0KCkubGF5b3V0Qm94KCk7IAotICAgIGlmIChsYXN0UnVuTGF5b3V0Qm94LnN0eWxlKCku
Y2xlYXIoKSA9PSBDbGVhcjo6Tm9uZSkKLSAgICAgICAgcmV0dXJuIHByZXZpb3VzTGluZUxvZ2lj
YWxCb3R0b207Ci0gICAgYXV0byBwb3NpdGlvbldpdGhDbGVhcmFuY2UgPSBmbG9hdGluZ0NvbnRl
eHQudmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UobGFzdFJ1bkxheW91dEJveCk7Ci0gICAg
aWYgKCFwb3NpdGlvbldpdGhDbGVhcmFuY2UpCi0gICAgICAgIHJldHVybiBwcmV2aW91c0xpbmVM
b2dpY2FsQm90dG9tOwotICAgIHJldHVybiBzdGQ6Om1heChwcmV2aW91c0xpbmVMb2dpY2FsQm90
dG9tLCBJbmxpbmVMYXlvdXRVbml0KHBvc2l0aW9uV2l0aENsZWFyYW5jZS0+cG9zaXRpb24pKTsK
LX0KLQotQ29udGVudFdpZHRoQW5kTWFyZ2luIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeTo6aW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiBmb3JtYXR0
aW5nQ29udGV4dFJvb3QsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhv
cml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGZvcm1hdHRpbmdDb250ZXh0Um9vdC5pc0lu
RmxvdygpKTsKLQotICAgIC8vIDEwLjMuMTAgJ0lubGluZS1ibG9jaycsIHJlcGxhY2VkIGVsZW1l
bnRzIGluIG5vcm1hbCBmbG93Ci0KLSAgICAvLyBFeGFjdGx5IGFzIGlubGluZSByZXBsYWNlZCBl
bGVtZW50cy4KLSAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHRSb290LmlzUmVwbGFjZWRCb3goKSkK
LSAgICAgICAgcmV0dXJuIGlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGRvd25j
YXN0PFJlcGxhY2VkQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3QpLCBob3Jpem9udGFsQ29uc3Ry
YWludHMsIHsgfSwgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOwotCi0gICAgLy8gMTAuMy45
ICdJbmxpbmUtYmxvY2snLCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cKLQot
ICAgIC8vIElmICd3aWR0aCcgaXMgJ2F1dG8nLCB0aGUgdXNlZCB2YWx1ZSBpcyB0aGUgc2hyaW5r
LXRvLWZpdCB3aWR0aCBhcyBmb3IgZmxvYXRpbmcgZWxlbWVudHMuCi0gICAgLy8gQSBjb21wdXRl
ZCB2YWx1ZSBvZiAnYXV0bycgZm9yICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgYmVj
b21lcyBhIHVzZWQgdmFsdWUgb2YgJzAnLgotICAgIC8vICMxCi0gICAgYXV0byB3aWR0aCA9IGNv
bXB1dGVkVmFsdWUoZm9ybWF0dGluZ0NvbnRleHRSb290LnN0eWxlKCkubG9naWNhbFdpZHRoKCks
IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOwotICAgIGlmICghd2lkdGgpCi0g
ICAgICAgIHdpZHRoID0gc2hyaW5rVG9GaXRXaWR0aChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGhv
cml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOwotCi0gICAgLy8gIzIKLSAgICBhdXRv
IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6b250YWxN
YXJnaW4oZm9ybWF0dGluZ0NvbnRleHRSb290LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotCi0g
ICAgcmV0dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7ICp3aWR0aCwgeyBjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwX2x1KSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LmVuZC52YWx1ZU9yKDBfbHUpIH0gfTsKLX0KLQotQ29udGVudEhlaWdodEFuZE1hcmdpbiBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmlubGluZUJsb2NrQ29udGVudEhlaWdodEFu
ZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRz
JiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYg
b3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3gu
aXNJbkZsb3coKSk7Ci0KLSAgICAvLyAxMC42LjIgSW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLCBi
bG9jay1sZXZlbCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdywgJ2lubGluZS1ibG9j
aycgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZsb2F0aW5nIHJlcGxhY2Vk
IGVsZW1lbnRzCi0gICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0gICAgICAgIHJl
dHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFj
ZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBvdmVycmlkZGVu
VmVydGljYWxWYWx1ZXMpOwotCi0gICAgLy8gMTAuNi42IENvbXBsaWNhdGVkIGNhc2VzCi0gICAg
Ly8gLSAnSW5saW5lLWJsb2NrJywgbm9uLXJlcGxhY2VkIGVsZW1lbnRzLgotICAgIHJldHVybiBj
b21wbGljYXRlZENhc2VzKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlk
ZGVuVmVydGljYWxWYWx1ZXMpOwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHRRdWlya3MuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5s
aW5lRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCA5MWJlNjVkYWQ1Y2M1ZjU2YjI5ZWIwNzAzZTZjZGM5NDM5MGFjMmE3Li4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcAorKysg
L2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwot
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0g
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBFTkFCTEUo
TEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5
LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1JbmxpbmVM
YXlvdXRVbml0IElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OmluaXRpYWxMaW5lSGVp
Z2h0KCkgY29uc3QKLXsKLSAgICAvLyBOZWdhdGl2ZSBsaW5lSGVpZ2h0IHZhbHVlIG1lYW5zIHRo
ZSBsaW5lLWhlaWdodCBpcyBub3Qgc2V0Ci0gICAgYXV0byYgcm9vdCA9IGZvcm1hdHRpbmdDb250
ZXh0KCkucm9vdCgpOwotICAgIGlmIChsYXlvdXRTdGF0ZSgpLmluU3RhbmRhcmRzTW9kZSgpIHx8
ICFyb290LnN0eWxlKCkubGluZUhlaWdodCgpLmlzTmVnYXRpdmUoKSkKLSAgICAgICAgcmV0dXJu
IHJvb3Quc3R5bGUoKS5jb21wdXRlZExpbmVIZWlnaHQoKTsKLSAgICByZXR1cm4gcm9vdC5zdHls
ZSgpLmZvbnRNZXRyaWNzKCkuZmxvYXRIZWlnaHQoKTsKLX0KLQotYm9vbCBJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dDo6UXVpcmtzOjppbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGNvbnN0IExp
bmVCb3g6OklubGluZUxldmVsQm94JiBpbmxpbmVMZXZlbEJveCwgY29uc3QgTGluZUJveCYgbGlu
ZUJveCkgY29uc3QKLXsKLSAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNMaW5lQnJlYWtCb3goKSkg
ewotICAgICAgICBpZiAobGF5b3V0U3RhdGUoKS5pblN0YW5kYXJkc01vZGUoKSkKLSAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgICAgICAvLyBJbiBxdWlya3MgbW9kZSBsaW5lYnJlYWsgYm94
ZXMgKDxicj4pIHN0b3AgYWZmZWN0aW5nIHRoZSBsaW5lIGJveCB3aGVuIChhc3N1bWUgPGJyPiBp
cyBuZXN0ZWQgZS5nLiA8c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMDBweCI+PGJyPjwvc3Bhbj4p
Ci0gICAgICAgIC8vIDEuIHRoZSByb290IGlubGluZSBib3ggaGFzIGNvbnRlbnQgPGRpdj5jb250
ZW50PGJyPi9kaXY+Ci0gICAgICAgIC8vIDIuIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGF0b21pYyBp
bmxpbmUgbGV2ZWwgYm94IG9uIHRoZSBsaW5lIGUuZyA8ZGl2PjxpbWc+PGJyPjwvZGl2PiBvciA8
ZGl2PjxzcGFuPjxpbWc+PC9zcGFuPjxicj48L2Rpdj4KLSAgICAgICAgLy8gMy4gdGhlcmUncyBh
dCBsZWFzdCBvbmUgaW5saW5lIGJveCB3aXRoIGNvbnRlbnQgZS5nLiA8ZGl2PjxzcGFuPmNvbnRl
bnQ8L3NwYW4+PGJyPjwvZGl2PgotICAgICAgICBpZiAobGluZUJveC5yb290SW5saW5lQm94KCku
aGFzQ29udGVudCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobGlu
ZUJveC5oYXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGVpdGhlciBoYXZlIG9ubHkgdGhlIDxicj4g
b24gdGhlIGxpbmUgb3IgaW5saW5lIGJveGVzIHdpdGggb3Igd2l0aG91dCBjb250ZW50LgotICAg
ICAgICBhdXRvJiBpbmxpbmVMZXZlbEJveGVzID0gbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxC
b3hlcygpOwotICAgICAgICBBU1NFUlQoIWlubGluZUxldmVsQm94ZXMuaXNFbXB0eSgpKTsKLSAg
ICAgICAgaWYgKGlubGluZUxldmVsQm94ZXMuc2l6ZSgpID09IDEpCi0gICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9u
Um9vdElubGluZUxldmVsQm94ZXMoKSkgewotICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBlbXB0
eSBpbmxpbmUgYm94ZXMgZS5nLiA8ZGl2PjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PGJyPjwv
ZGl2PgotICAgICAgICAgICAgaWYgKGlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkgJiYgaW5s
aW5lTGV2ZWxCb3guaGFzQ29udGVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGlubGluZUxl
dmVsQm94LmlzSW5saW5lQm94KCkpIHsKLSAgICAgICAgLy8gSW5saW5lIGJveGVzIChlLmcuIHJv
b3QgaW5saW5lIGJveCBvciA8c3Bhbj4pIGFmZmVjdHMgbGluZSBib3hlcyBlaXRoZXIgdGhyb3Vn
aCB0aGUgc3RydXQgb3IgYWN0dWFsIGNvbnRlbnQuCi0gICAgICAgIGF1dG8gaW5saW5lQm94SGFz
SW1hZ2luYXJ5U3RydXQgPSBsYXlvdXRTdGF0ZSgpLmluU3RhbmRhcmRzTW9kZSgpOwotICAgICAg
ICBpZiAoaW5saW5lTGV2ZWxCb3guaGFzQ29udGVudCgpIHx8IGlubGluZUJveEhhc0ltYWdpbmFy
eVN0cnV0KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChpbmxpbmVMZXZl
bEJveC5pc1Jvb3RJbmxpbmVCb3goKSkgewotICAgICAgICAgICAgYXV0byBzaG91bGRSb290SW5s
aW5lQm94V2l0aE5vQ29udGVudFN0cmV0Y2hMaW5lQm94ID0gWyZdIHsKLSAgICAgICAgICAgICAg
ICBpZiAoaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5bGUoKS5saW5lSGVpZ2h0KCkuaXNO
ZWdhdGl2ZSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAg
ICAgICAgLy8gVGhlIHJvb3QgaW5saW5lIGJveCB3aXRoIG5vbi1pbml0aWFsIGxpbmUgaGVpZ2h0
IHZhbHVlIHN0cmV0Y2hlcyB0aGUgbGluZSBib3ggZXZlbiB3aGVuIHJvb3QgaGFzIG5vIGNvbnRl
bnQKLSAgICAgICAgICAgICAgICAvLyBidXQgdGhlcmUncyBhdCBsZWFzdCBvbmUgaW5saW5lIGJv
eCB3aXRoIGNvbnRlbnQuCi0gICAgICAgICAgICAgICAgLy8gZS5nLiA8ZGl2IHN0eWxlPSJsaW5l
LWhlaWdodDogMTAwcHg7Ij48c3Bhbj5jb250ZW50PC9zcGFuPjwvZGl2PgotICAgICAgICAgICAg
ICAgIGlmICghbGluZUJveC5oYXNJbmxpbmVCb3goKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byYgaW5saW5lTGV2ZWxCb3ggOiBs
aW5lQm94Lm5vblJvb3RJbmxpbmVMZXZlbEJveGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAg
aWYgKCFpbmxpbmVMZXZlbEJveC5pc0lubGluZUJveCgpKQotICAgICAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5oYXND
b250ZW50KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfTsK
LSAgICAgICAgICAgIHJldHVybiBzaG91bGRSb290SW5saW5lQm94V2l0aE5vQ29udGVudFN0cmV0
Y2hMaW5lQm94KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm9uLXJvb3QgaW5saW5lIGJveGVz
IChlLmcuIDxzcGFuPikuCi0gICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0Nv
bnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKSk7Ci0gICAg
ICAgIGlmIChib3hHZW9tZXRyeS5ob3Jpem9udGFsQm9yZGVyKCkgfHwgYm94R2VvbWV0cnkuaG9y
aXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKSB7Ci0gICAgICAgICAgICAvLyBIb3Jpem9u
dGFsIGJvcmRlciBhbmQgcGFkZGluZyBtYWtlIHRoZSBpbmxpbmUgYm94IHN0cmV0Y2ggdGhlIGxp
bmUgKGUuZy4gPHNwYW4gc3R5bGU9InBhZGRpbmc6IDEwcHg7Ij48L3NwYW4+KS4KLSAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9
Ci0gICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSkgewotICAg
ICAgICBpZiAoaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCkpCi0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgLy8gV2hpbGUgaW4gcHJhY3RpY2Ugd2hlbiB0aGUg
bmVnYXRpdmUgdmVydGljYWwgbWFyZ2luIG1ha2VzIHRoZSBsYXlvdXQgYm91bmRzIGVtcHR5IChl
Lmc6IGhlaWdodDogMTAwcHg7IG1hcmdpbi10b3A6IC0xMDBweDspLCBhbmQgdGhpcyBpbmxpbmUK
LSAgICAgICAgLy8gbGV2ZWwgYm94IGNvbnRyaWJ1dGVzIDBweCB0byB0aGUgbGluZSBib3ggaGVp
Z2h0LCBpdCBzdGlsbCBuZWVkcyB0byBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hpbGUgY29tcHV0
aW5nIGxpbmUgYm94IGdlb21ldHJpZXMuCi0gICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9y
bWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3go
KSk7Ci0gICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUoKSB8fCBib3hHZW9t
ZXRyeS5tYXJnaW5BZnRlcigpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wg
SW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6aGFzU29mdFdyYXBPcHBvcnR1bml0eUF0
SW1hZ2UoKSBjb25zdAotewotICAgIHJldHVybiAhZm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCku
aXNUYWJsZUNlbGwoKTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5n
U3RhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2I2Yzk1YzE1NDVkNjQ1
Y2RiZDRiMDU0NmFlYzE4NmNmM2NjZjVkLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0v
KgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
LSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRp
bmdTdGF0ZS5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNp
bmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1u
YW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKElubGluZUZv
cm1hdHRpbmdTdGF0ZSk7Ci0KLUlubGluZUZvcm1hdHRpbmdTdGF0ZTo6SW5saW5lRm9ybWF0dGlu
Z1N0YXRlKFJlZjxGbG9hdGluZ1N0YXRlPiYmIGZsb2F0aW5nU3RhdGUsIExheW91dFN0YXRlJiBs
YXlvdXRTdGF0ZSkKLSAgICA6IEZvcm1hdHRpbmdTdGF0ZShXVEZNb3ZlKGZsb2F0aW5nU3RhdGUp
LCBUeXBlOjpJbmxpbmUsIGxheW91dFN0YXRlKQotewotfQotCi1JbmxpbmVGb3JtYXR0aW5nU3Rh
dGU6On5JbmxpbmVGb3JtYXR0aW5nU3RhdGUoKQotewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1h
dHRpbmdTdGF0ZS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5s
aW5lRm9ybWF0dGluZ1N0YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2M2Ix
NjAzNjg0ZTU5NDAwN2EwODI3YmM5NGNiOTdiNGJhMDE3NGYuLjAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZv
cm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkg
KzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0g
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
LSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
Ci0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
LSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0g
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9G
T1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNs
dWRlICJJbmxpbmVJdGVtLmgiCi0jaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgotI2luY2x1ZGUg
IklubGluZUxpbmVHZW9tZXRyeS5oIgotI2luY2x1ZGUgIklubGluZUxpbmVSdW4uaCIKLSNpbmNs
dWRlIDx3dGYvSXNvTWFsbG9jLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi11c2luZyBJbmxpbmVJdGVtcyA9IFZlY3RvcjxJbmxpbmVJdGVtPjsKLXVzaW5n
IElubGluZUxpbmVzID0gVmVjdG9yPElubGluZUxpbmVHZW9tZXRyeT47Ci11c2luZyBJbmxpbmVM
aW5lQm94ZXMgPSBWZWN0b3I8TGluZUJveD47Ci11c2luZyBJbmxpbmVMaW5lUnVucyA9IFZlY3Rv
cjxMaW5lUnVuPjsKLQotLy8gSW5saW5lRm9ybWF0dGluZ1N0YXRlIGhvbGRzIHRoZSBzdGF0ZSBm
b3IgYSBwYXJ0aWN1bGFyIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgdHJlZS4KLWNsYXNzIElu
bGluZUZvcm1hdHRpbmdTdGF0ZSA6IHB1YmxpYyBGb3JtYXR0aW5nU3RhdGUgewotICAgIFdURl9N
QUtFX0lTT19BTExPQ0FURUQoSW5saW5lRm9ybWF0dGluZ1N0YXRlKTsKLXB1YmxpYzoKLSAgICBJ
bmxpbmVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRlJik7
Ci0gICAgfklubGluZUZvcm1hdHRpbmdTdGF0ZSgpOwotCi0gICAgSW5saW5lSXRlbXMmIGlubGlu
ZUl0ZW1zKCkgeyByZXR1cm4gbV9pbmxpbmVJdGVtczsgfQotICAgIGNvbnN0IElubGluZUl0ZW1z
JiBpbmxpbmVJdGVtcygpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lSXRlbXM7IH0KLSAgICB2b2lk
IGFkZElubGluZUl0ZW0oSW5saW5lSXRlbSYmIGlubGluZUl0ZW0pIHsgbV9pbmxpbmVJdGVtcy5h
cHBlbmQoV1RGTW92ZShpbmxpbmVJdGVtKSk7IH0KLQotICAgIGNvbnN0IElubGluZUxpbmVzJiBs
aW5lcygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZXM7IH0KLSAgICBJbmxpbmVMaW5lcyYgbGluZXMo
KSB7IHJldHVybiBtX2xpbmVzOyB9Ci0gICAgdm9pZCBhZGRMaW5lKGNvbnN0IElubGluZUxpbmVH
ZW9tZXRyeSYgbGluZSkgeyBtX2xpbmVzLmFwcGVuZChsaW5lKTsgfQotCi0gICAgY29uc3QgSW5s
aW5lTGluZUJveGVzJiBsaW5lQm94ZXMoKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlczsgfQot
ICAgIHZvaWQgYWRkTGluZUJveChMaW5lQm94JiYgbGluZUJveCkgeyBtX2xpbmVCb3hlcy5hcHBl
bmQoV1RGTW92ZShsaW5lQm94KSk7IH0KLQotICAgIGNvbnN0IElubGluZUxpbmVSdW5zJiBsaW5l
UnVucygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZVJ1bnM7IH0KLSAgICBJbmxpbmVMaW5lUnVucyYg
bGluZVJ1bnMoKSB7IHJldHVybiBtX2xpbmVSdW5zOyB9Ci0gICAgdm9pZCBhZGRMaW5lUnVuKExp
bmVSdW4mJiBydW4pIHsgbV9saW5lUnVucy5hcHBlbmQoV1RGTW92ZShydW4pKTsgfQotCi0gICAg
dm9pZCBzZXRDbGVhckdhcEFmdGVyTGFzdExpbmUoSW5saW5lTGF5b3V0VW5pdCB2ZXJ0aWNhbEdh
cCk7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBjbGVhckdhcEFmdGVyTGFzdExpbmUoKSBjb25zdCB7
IHJldHVybiBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZTsgfQotCi0gICAgdm9pZCBjbGVhckxpbmVB
bmRSdW5zKCk7Ci0gICAgdm9pZCBzaHJpbmtUb0ZpdCgpOwotCi1wcml2YXRlOgotICAgIC8vIENh
Y2hlYWJsZSBpbnB1dCB0byBsaW5lIGxheW91dC4KLSAgICBJbmxpbmVJdGVtcyBtX2lubGluZUl0
ZW1zOwotICAgIElubGluZUxpbmVzIG1fbGluZXM7Ci0gICAgSW5saW5lTGluZUJveGVzIG1fbGlu
ZUJveGVzOwotICAgIElubGluZUxpbmVSdW5zIG1fbGluZVJ1bnM7Ci0gICAgSW5saW5lTGF5b3V0
VW5pdCBtX2NsZWFyR2FwQWZ0ZXJMYXN0TGluZSB7IDAgfTsKLX07Ci0KLWlubGluZSB2b2lkIElu
bGluZUZvcm1hdHRpbmdTdGF0ZTo6c2V0Q2xlYXJHYXBBZnRlckxhc3RMaW5lKElubGluZUxheW91
dFVuaXQgdmVydGljYWxHYXApCi17Ci0gICAgQVNTRVJUKHZlcnRpY2FsR2FwID49IDApOwotICAg
IG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lID0gdmVydGljYWxHYXA7Ci19Ci0KLWlubGluZSB2b2lk
IElubGluZUZvcm1hdHRpbmdTdGF0ZTo6Y2xlYXJMaW5lQW5kUnVucygpCi17Ci0gICAgbV9saW5l
cy5jbGVhcigpOwotICAgIG1fbGluZUJveGVzLmNsZWFyKCk7Ci0gICAgbV9saW5lUnVucy5jbGVh
cigpOwotICAgIG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lID0geyB9OwotfQotCi1pbmxpbmUgdm9p
ZCBJbmxpbmVGb3JtYXR0aW5nU3RhdGU6OnNocmlua1RvRml0KCkKLXsKLSAgICBtX2lubGluZUl0
ZW1zLnNocmlua1RvRml0KCk7Ci0gICAgbV9saW5lcy5zaHJpbmtUb0ZpdCgpOwotICAgIG1fbGlu
ZUJveGVzLnNocmlua1RvRml0KCk7Ci0gICAgbV9saW5lUnVucy5zaHJpbmtUb0ZpdCgpOwotfQot
Ci19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUo
SW5saW5lRm9ybWF0dGluZ1N0YXRlLCBpc0lubGluZUZvcm1hdHRpbmdTdGF0ZSgpKQotCi0jZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUl0ZW0uY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5s
aW5lSXRlbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MDZmMTg0OWI1YTlh
NjE4NDlhMjBlYmQ0MTk2NWE2YWRkOGVjODYuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcv
SW5saW5lSXRlbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
LSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0g
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGluZUl0ZW0uaCIKLQotI2luY2x1
ZGUgIklubGluZVRleHRJdGVtLmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09O
VEVYVCkKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLXN0cnVj
dCBTYW1lU2l6ZUFzSW5saW5lSXRlbSB7Ci0gICAgdm9pZCogbGF5b3V0Qm94OwotICAgIHVpbnQ4
X3QgZW51bTE7Ci0gICAgdWludDhfdCBlbnVtMjsKLSAgICBib29sIHdpZHRoQm9vbDsKLSAgICBi
b29sIHNvZnRIeXBoZW5Cb29sOwotICAgIGJvb2wgaXNXb3JkU2VwYXJhdG9yOwotICAgIElubGlu
ZUxheW91dFVuaXQgd2lkdGg7Ci0gICAgdW5zaWduZWQgc3RhcnQ7Ci0gICAgdW5zaWduZWQgbGVu
Z3RoOwotfTsKLQotc3RhdGljX2Fzc2VydChzaXplb2YoSW5saW5lSXRlbSkgPT0gc2l6ZW9mKFNh
bWVTaXplQXNJbmxpbmVJdGVtKSwgIiIpOwotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUl0ZW0uaCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUl0ZW0uaApkZWxldGVkIGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhZTI0YTYxMjY4NDU4ODc0YzcyMDk5NDM4MmJhYjgyOTFk
ZGM0ZC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmgKKysrIC9kZXYv
bnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0g
KiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICog
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBF
TkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkxheW91dEJveC5o
IgotI2luY2x1ZGUgIkxheW91dFVuaXRzLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVz
cGFjZSBMYXlvdXQgewotCi1jbGFzcyBJbmxpbmVJdGVtIHsKLXB1YmxpYzoKLSAgICBlbnVtIGNs
YXNzIFR5cGUgOiB1aW50OF90IHsgVGV4dCwgSGFyZExpbmVCcmVhaywgU29mdExpbmVCcmVhaywg
V29yZEJyZWFrT3Bwb3J0dW5pdHksIEJveCwgRmxvYXQsIElubGluZUJveFN0YXJ0LCBJbmxpbmVC
b3hFbmQgfTsKLSAgICBJbmxpbmVJdGVtKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBUeXBlKTsKLQot
ICAgIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQotICAgIGNvbnN0IEJveCYg
bGF5b3V0Qm94KCkgY29uc3QgeyByZXR1cm4gKm1fbGF5b3V0Qm94OyB9Ci0gICAgY29uc3QgUmVu
ZGVyU3R5bGUmIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbGF5b3V0Qm94KCkuc3R5bGUoKTsgfQot
Ci0gICAgYm9vbCBpc1RleHQoKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0gVHlwZTo6VGV4dDsg
fQotICAgIGJvb2wgaXNCb3goKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0gVHlwZTo6Qm94OyB9
Ci0gICAgYm9vbCBpc0Zsb2F0KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OkZsb2F0
OyB9Ci0gICAgYm9vbCBpc0xpbmVCcmVhaygpIGNvbnN0IHsgcmV0dXJuIGlzU29mdExpbmVCcmVh
aygpIHx8IGlzSGFyZExpbmVCcmVhaygpOyB9Ci0gICAgYm9vbCBpc1dvcmRCcmVha09wcG9ydHVu
aXR5KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OldvcmRCcmVha09wcG9ydHVuaXR5
OyB9Ci0gICAgYm9vbCBpc1NvZnRMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0g
VHlwZTo6U29mdExpbmVCcmVhazsgfQotICAgIGJvb2wgaXNIYXJkTGluZUJyZWFrKCkgY29uc3Qg
eyByZXR1cm4gdHlwZSgpID09IFR5cGU6OkhhcmRMaW5lQnJlYWs7IH0KLSAgICBib29sIGlzSW5s
aW5lQm94U3RhcnQoKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0gVHlwZTo6SW5saW5lQm94U3Rh
cnQ7IH0KLSAgICBib29sIGlzSW5saW5lQm94RW5kKCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09
IFR5cGU6OklubGluZUJveEVuZDsgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IEJveCogbV9sYXlv
dXRCb3ggeyBudWxscHRyIH07Ci0gICAgVHlwZSBtX3R5cGUgeyB9OwotCi1wcm90ZWN0ZWQ6Ci0g
ICAgLy8gRm9yIElubGluZVRleHRJdGVtCi0gICAgZW51bSBjbGFzcyBUZXh0SXRlbVR5cGUgIDog
dWludDhfdCB7IFVuZGVmaW5lZCwgV2hpdGVzcGFjZSwgTm9uV2hpdGVzcGFjZSB9OwotICAgIFRl
eHRJdGVtVHlwZSBtX3RleHRJdGVtVHlwZSB7IFRleHRJdGVtVHlwZTo6VW5kZWZpbmVkIH07Ci0g
ICAgYm9vbCBtX2hhc1dpZHRoIHsgZmFsc2UgfTsKLSAgICBib29sIG1faGFzVHJhaWxpbmdTb2Z0
SHlwaGVuIHsgZmFsc2UgfTsKLSAgICBib29sIG1faXNXb3JkU2VwYXJhdG9yIHsgZmFsc2UgfTsK
LSAgICBJbmxpbmVMYXlvdXRVbml0IG1fd2lkdGggeyB9OwotICAgIHVuc2lnbmVkIG1fbGVuZ3Ro
IHsgMCB9OwotCi0gICAgLy8gRm9yIElubGluZVRleHRJdGVtIGFuZCBJbmxpbmVTb2Z0TGluZUJy
ZWFrSXRlbQotICAgIHVuc2lnbmVkIG1fc3RhcnRPclBvc2l0aW9uIHsgMCB9OwotfTsKLQotaW5s
aW5lIElubGluZUl0ZW06OklubGluZUl0ZW0oY29uc3QgQm94JiBsYXlvdXRCb3gsIFR5cGUgdHlw
ZSkKLSAgICA6IG1fbGF5b3V0Qm94KCZsYXlvdXRCb3gpCi0gICAgLCBtX3R5cGUodHlwZSkKLXsK
LX0KLQotI2RlZmluZSBTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0lOTElORV9JVEVNKFRvVmFsdWVU
eXBlTmFtZSwgcHJlZGljYXRlKSBcCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0JFR0lOKFdlYkNv
cmU6OkxheW91dDo6VG9WYWx1ZVR5cGVOYW1lKSBcCi0gICAgc3RhdGljIGJvb2wgaXNUeXBlKGNv
bnN0IFdlYkNvcmU6OkxheW91dDo6SW5saW5lSXRlbSYgaW5saW5lSXRlbSkgeyByZXR1cm4gaW5s
aW5lSXRlbS5wcmVkaWNhdGU7IH0gXAotU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19FTkQoKQotCi19
Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUxpbmUuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1h
dHRpbmcvSW5saW5lTGluZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzM1
YmM0MGVlZmM5YzI4MzNkNGQxMzdiNGE1ODQ3ODcwNzUyZmMuLjAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZv
cm1hdHRpbmcvSW5saW5lTGluZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MzkgKzAsMCBAQAot
LyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5lLmgi
Ci0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZv
bnRDYXNjYWRlLmgiCi0jaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNpbmNs
dWRlICJJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oIgotI2luY2x1ZGUgIkxheW91dEJveEdlb21l
dHJ5LmgiCi0jaW5jbHVkZSAiUnVudGltZUVuYWJsZWRGZWF0dXJlcy5oIgotI2luY2x1ZGUgIlRl
eHRGbGFncy5oIgotI2luY2x1ZGUgIlRleHRVdGlsLmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxv
Y0lubGluZXMuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0K
LUxpbmU6OkxpbmUoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1hdHRp
bmdDb250ZXh0KQotICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCkKLSAgICAsIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KG1fcnVucykKLXsK
LX0KLQotTGluZTo6fkxpbmUoKQotewotfQotCi12b2lkIExpbmU6OmluaXRpYWxpemUoKQotewot
ICAgIG1fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50ID0gMDsKLSAgICBtX2NvbnRlbnRM
b2dpY2FsV2lkdGggPSB7IH07Ci0gICAgbV9ydW5zLmNsZWFyKCk7Ci0gICAgbV90cmFpbGluZ1Nv
ZnRIeXBoZW5XaWR0aCA9IHsgfTsKLSAgICBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudC5yZXNl
dCgpOwotfQotCi12b2lkIExpbmU6OnJlbW92ZUNvbGxhcHNpYmxlQ29udGVudChJbmxpbmVMYXlv
dXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKQotewotICAgIHJlbW92ZVRyYWlsaW5nVHJpbW1h
YmxlQ29udGVudCgpOwotICAgIHZpc3VhbGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50
KGV4dHJhSG9yaXpvbnRhbFNwYWNlKTsKLX0KLQotdm9pZCBMaW5lOjphcHBseVJ1bkV4cGFuc2lv
bihJbmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKQotewotICAgIEFTU0VSVChm
b3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKS5zdHlsZSgpLnRleHRBbGlnbigpID09IFRleHRBbGln
bk1vZGU6Okp1c3RpZnkpOwotICAgIC8vIFRleHQgaXMganVzdGlmaWVkIGFjY29yZGluZyB0byB0
aGUgbWV0aG9kIHNwZWNpZmllZCBieSB0aGUgdGV4dC1qdXN0aWZ5IHByb3BlcnR5LAotICAgIC8v
IGluIG9yZGVyIHRvIGV4YWN0bHkgZmlsbCB0aGUgbGluZSBib3guIFVubGVzcyBvdGhlcndpc2Ug
c3BlY2lmaWVkIGJ5IHRleHQtYWxpZ24tbGFzdCwKLSAgICAvLyB0aGUgbGFzdCBsaW5lIGJlZm9y
ZSBhIGZvcmNlZCBicmVhayBvciB0aGUgZW5kIG9mIHRoZSBibG9jayBpcyBzdGFydC1hbGlnbmVk
LgotICAgIGlmIChtX3J1bnMuaXNFbXB0eSgpIHx8IG1fcnVucy5sYXN0KCkuaXNMaW5lQnJlYWso
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYXV0byBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50
ID0gMDsKLSAgICBSdW4qIGxhc3RSdW5XaXRoQ29udGVudCA9IG51bGxwdHI7Ci0gICAgLy8gQ29s
bGVjdCBhbmQgZGlzdHJpYnV0ZSB0aGUgZXhwYW5zaW9uIG9wcG9ydHVuaXRpZXMuCi0gICAgZm9y
IChhdXRvJiBydW4gOiBtX3J1bnMpIHsKLSAgICAgICAgZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3Vu
dCArPSBydW4uZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCgpOwotICAgICAgICBpZiAocnVuLmlz
VGV4dCgpIHx8IHJ1bi5pc0JveCgpKQotICAgICAgICAgICAgbGFzdFJ1bldpdGhDb250ZW50ID0g
JnJ1bjsKLSAgICB9Ci0gICAgLy8gTmVlZCB0byBmaXggdXAgdGhlIGxhc3QgcnVuJ3MgdHJhaWxp
bmcgZXhwYW5zaW9uLgotICAgIGlmIChsYXN0UnVuV2l0aENvbnRlbnQgJiYgbGFzdFJ1bldpdGhD
b250ZW50LT5oYXNFeHBhbnNpb25PcHBvcnR1bml0eSgpKSB7Ci0gICAgICAgIC8vIFR1cm4gb2Zm
IHRoZSB0cmFpbGluZyBiaXRzIGZpcnN0IGFuZCBhZGQgdGhlIGZvcmJpZCB0cmFpbGluZyBleHBh
bnNpb24uCi0gICAgICAgIGF1dG8gbGVhZGluZ0V4cGFuc2lvbiA9IGxhc3RSdW5XaXRoQ29udGVu
dC0+ZXhwYW5zaW9uQmVoYXZpb3IoKSAmIExlZnRFeHBhbnNpb25NYXNrOwotICAgICAgICBsYXN0
UnVuV2l0aENvbnRlbnQtPnNldEV4cGFuc2lvbkJlaGF2aW9yKGxlYWRpbmdFeHBhbnNpb24gfCBG
b3JiaWRSaWdodEV4cGFuc2lvbik7Ci0gICAgfQotICAgIC8vIEFueXRoaW5nIHRvIGRpc3RyaWJ1
dGU/Ci0gICAgaWYgKCFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50IHx8ICFleHRyYUhvcml6b250
YWxTcGFjZSkKLSAgICAgICAgcmV0dXJuOwotICAgIC8vIERpc3RyaWJ1dGUgdGhlIGV4dHJhIHNw
YWNlLgotICAgIGF1dG8gZXhwYW5zaW9uVG9EaXN0cmlidXRlID0gZXh0cmFIb3Jpem9udGFsU3Bh
Y2UgLyBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50OwotICAgIGF1dG8gYWNjdW11bGF0ZWRFeHBh
bnNpb24gPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAgICBmb3IgKGF1dG8mIHJ1biA6IG1fcnVu
cykgewotICAgICAgICAvLyBFeHBhbmQgYW5kIG1vdmUgcnVucyBieSB0aGUgYWNjdW11bGF0ZWQg
ZXhwYW5zaW9uLgotICAgICAgICBydW4ubW92ZUhvcml6b250YWxseShhY2N1bXVsYXRlZEV4cGFu
c2lvbik7Ci0gICAgICAgIGlmICghcnVuLmhhc0V4cGFuc2lvbk9wcG9ydHVuaXR5KCkpCi0gICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgQVNTRVJUKHJ1bi5leHBhbnNpb25PcHBvcnR1bml0
eUNvdW50KCkpOwotICAgICAgICBhdXRvIGNvbXB1dGVkRXhwYW5zaW9uID0gZXhwYW5zaW9uVG9E
aXN0cmlidXRlICogcnVuLmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQoKTsKLSAgICAgICAgLy8g
RklYTUU6IENoZWNrIHdoeSB3ZSBuZWVkIHRvIHNldCBib3RoLgotICAgICAgICBydW4uc2V0SG9y
aXpvbnRhbEV4cGFuc2lvbihjb21wdXRlZEV4cGFuc2lvbik7Ci0gICAgICAgIHJ1bi5zaHJpbmtI
b3Jpem9udGFsbHkoLWNvbXB1dGVkRXhwYW5zaW9uKTsKLSAgICAgICAgYWNjdW11bGF0ZWRFeHBh
bnNpb24gKz0gY29tcHV0ZWRFeHBhbnNpb247Ci0gICAgfQotICAgIC8vIENvbnRlbnQgZ3Jvd3Mg
YXMgcnVucyBleHBhbmQuCi0gICAgbV9jb250ZW50TG9naWNhbFdpZHRoICs9IGFjY3VtdWxhdGVk
RXhwYW5zaW9uOwotfQotCi12b2lkIExpbmU6OnJlbW92ZVRyYWlsaW5nVHJpbW1hYmxlQ29udGVu
dCgpCi17Ci0gICAgaWYgKG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmlzRW1wdHkoKSB8fCBt
X3J1bnMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBDb21wbGV4IGxpbmUg
bGF5b3V0IHF1aXJrOiBrZWVwIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGFyb3VuZCB3aGVuIGl0
IGlzIGZvbGxvd2VkIGJ5IGEgbGluZSBicmVhaywgdW5sZXNzIHRoZSBjb250ZW50IG92ZXJmbG93
cyB0aGUgbGluZS4KLSAgICBpZiAoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c2hhcmVkRmVhdHVy
ZXMoKS5sYXlvdXRGb3JtYXR0aW5nQ29udGV4dEludGVncmF0aW9uRW5hYmxlZCgpKSB7Ci0gICAg
ICAgIGF1dG8gaXNUZXh0QWxpZ25SaWdodCA9IFsmXSB7Ci0gICAgICAgICAgICBhdXRvIHRleHRB
bGlnbiA9IGZvcm1hdHRpbmdDb250ZXh0KCkucm9vdCgpLnN0eWxlKCkudGV4dEFsaWduKCk7Ci0g
ICAgICAgICAgICByZXR1cm4gdGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6OlJpZ2h0Ci0gICAg
ICAgICAgICAgICAgfHwgdGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0Ci0g
ICAgICAgICAgICAgICAgfHwgdGV4dEFsaWduID09IFRleHRBbGlnbk1vZGU6OkVuZDsKLSAgICAg
ICAgICAgIH0oKTsKLQotICAgICAgICBpZiAobV9ydW5zLmxhc3QoKS5pc0xpbmVCcmVhaygpICYm
ICFpc1RleHRBbGlnblJpZ2h0KSB7Ci0gICAgICAgICAgICBtX3RyaW1tYWJsZVRyYWlsaW5nQ29u
dGVudC5yZXNldCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgbV9jb250ZW50TG9naWNhbFdpZHRoIC09IG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJl
bW92ZSgpOwotfQotCi12b2lkIExpbmU6OnZpc3VhbGx5Q29sbGFwc2VQcmVXcmFwT3ZlcmZsb3dD
b250ZW50KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFsU3BhY2UpCi17Ci0gICAgQVNT
RVJUKG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmlzRW1wdHkoKSk7Ci0gICAgLy8gSWYgd2hp
dGUtc3BhY2UgaXMgc2V0IHRvIHByZS13cmFwLCB0aGUgVUEgbXVzdAotICAgIC8vIC4uLgotICAg
IC8vIEl0IG1heSBhbHNvIHZpc3VhbGx5IGNvbGxhcHNlIHRoZSBjaGFyYWN0ZXIgYWR2YW5jZSB3
aWR0aHMgb2YgYW55IHRoYXQgd291bGQgb3RoZXJ3aXNlIG92ZXJmbG93LgotICAgIGF1dG8gb3Zl
cmZsb3dXaWR0aCA9IC1leHRyYUhvcml6b250YWxTcGFjZTsKLSAgICBpZiAob3ZlcmZsb3dXaWR0
aCA8PSAwKQotICAgICAgICByZXR1cm47Ci0gICAgLy8gTGV0J3MganVzdCBmaW5kIHRoZSB0cmFp
bGluZyBwcmUtd3JhcCB3aGl0ZXNwYWNlIGNvbnRlbnQgZm9yIG5vdyAoZS5nIGNoZWNrIGlmIHRo
ZXJlIGFyZSBtdWx0aXBsZSB0cmFpbGluZyBydW5zIHdpdGgKLSAgICAvLyBkaWZmZXJlbnQgc2V0
IG9mIHdoaXRlLXNwYWNlIHZhbHVlcyBhbmQgZGVjaWRlIGlmIHRoZSBpbi1iZXR3ZWVuIHByZS13
cmFwIGNvbnRlbnQgc2hvdWxkIGJlIGNvbGxhcHNlZCBhcyB3ZWxsLikKLSAgICBJbmxpbmVMYXlv
dXRVbml0IHRyaW1tZWRDb250ZW50V2lkdGggPSAwOwotICAgIGZvciAoYXV0byYgcnVuIDogV1RG
OjptYWtlUmV2ZXJzZWRSYW5nZShtX3J1bnMpKSB7Ci0gICAgICAgIGlmIChydW4uc3R5bGUoKS53
aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6UHJlV3JhcCkgewotICAgICAgICAgICAgLy8gV2Ug
YXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBwcmUtd3JhcCB0cmFpbGluZyBjb250ZW50LgotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYXV0byBwcmVXcmFwVmlzdWFsbHlDb2xs
YXBzaWJsZUlubGluZUl0ZW0gPSBydW4uaXNJbmxpbmVCb3hTdGFydCgpIHx8IHJ1bi5pc0lubGlu
ZUJveEVuZCgpIHx8IHJ1bi5oYXNUcmFpbGluZ1doaXRlc3BhY2UoKTsKLSAgICAgICAgaWYgKCFw
cmVXcmFwVmlzdWFsbHlDb2xsYXBzaWJsZUlubGluZUl0ZW0pCi0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgQVNTRVJUKCFydW4uaGFzQ29sbGFwc2libGVUcmFpbGluZ1doaXRlc3BhY2UoKSk7
Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGggPSB7IH07Ci0gICAgICAg
IGlmIChydW4uaXNUZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgYWx3
YXlzIGNvbGxhcHNlIHRoZSBydW4gYXQgYSBnbHlwaCBib3VuZGFyeSBhcyB0aGUgc3BlYyBpbmRp
Y2F0ZXM6ICJjb2xsYXBzZSB0aGUgY2hhcmFjdGVyIGFkdmFuY2Ugd2lkdGhzIG9mIGFueSB0aGF0
IHdvdWxkIG90aGVyd2lzZSBvdmVyZmxvdyIKLSAgICAgICAgICAgIC8vIGFuZCB0aGUgdHJpbW1l
ZCB3aWR0aCBzaG91bGQgYmUgY2FwcGVkIGF0IHN0ZDo6bWluKHJ1bi50cmFpbGluZ1doaXRlc3Bh
Y2VXaWR0aCgpLCBvdmVyZmxvd1dpZHRoKSBmb3IgdGV4dCBydW5zLiBCb3RoIEZGIGFuZCBDaHJv
bWUgYWdyZWUuCi0gICAgICAgICAgICB0cmltbWFibGVXaWR0aCA9IHJ1bi50cmFpbGluZ1doaXRl
c3BhY2VXaWR0aCgpOwotICAgICAgICAgICAgcnVuLnZpc3VhbGx5Q29sbGFwc2VUcmFpbGluZ1do
aXRlc3BhY2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyaW1tYWJsZVdpZHRo
ID0gcnVuLmxvZ2ljYWxXaWR0aCgpOwotICAgICAgICAgICAgcnVuLnNocmlua0hvcml6b250YWxs
eSh0cmltbWFibGVXaWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJpbW1lZENvbnRlbnRXaWR0
aCArPSB0cmltbWFibGVXaWR0aDsKLSAgICAgICAgb3ZlcmZsb3dXaWR0aCAtPSB0cmltbWFibGVX
aWR0aDsKLSAgICAgICAgaWYgKG92ZXJmbG93V2lkdGggPD0gMCkKLSAgICAgICAgICAgIGJyZWFr
OwotICAgIH0KLSAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggLT0gdHJpbW1lZENvbnRlbnRXaWR0
aDsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmQoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwg
SW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgaWYgKGlubGluZUl0ZW0uaXNU
ZXh0KCkpCi0gICAgICAgIGFwcGVuZFRleHRDb250ZW50KGRvd25jYXN0PElubGluZVRleHRJdGVt
PihpbmxpbmVJdGVtKSwgbG9naWNhbFdpZHRoKTsKLSAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmlz
TGluZUJyZWFrKCkpCi0gICAgICAgIGFwcGVuZExpbmVCcmVhayhpbmxpbmVJdGVtKTsKLSAgICBl
bHNlIGlmIChpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkKLSAgICAgICAgYXBw
ZW5kV29yZEJyZWFrT3Bwb3J0dW5pdHkoaW5saW5lSXRlbSk7Ci0gICAgZWxzZSBpZiAoaW5saW5l
SXRlbS5pc0lubGluZUJveFN0YXJ0KCkpCi0gICAgICAgIGFwcGVuZElubGluZUJveFN0YXJ0KGlu
bGluZUl0ZW0sIGxvZ2ljYWxXaWR0aCk7Ci0gICAgZWxzZSBpZiAoaW5saW5lSXRlbS5pc0lubGlu
ZUJveEVuZCgpKQotICAgICAgICBhcHBlbmRJbmxpbmVCb3hFbmQoaW5saW5lSXRlbSwgbG9naWNh
bFdpZHRoKTsKLSAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmxheW91dEJveCgpLmlzUmVwbGFjZWRC
b3goKSkKLSAgICAgICAgYXBwZW5kUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVtLCBs
b2dpY2FsV2lkdGgpOwotICAgIGVsc2UgaWYgKGlubGluZUl0ZW0uaXNCb3goKSkKLSAgICAgICAg
YXBwZW5kTm9uUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgp
OwotICAgIGVsc2UKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci19Ci0KLXZvaWQgTGlu
ZTo6YXBwZW5kTm9uQnJlYWthYmxlU3BhY2UoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwg
SW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lk
dGgpCi17Ci0gICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGxvZ2ljYWxMZWZ0LCBsb2dp
Y2FsV2lkdGggfSk7Ci0gICAgbV9jb250ZW50TG9naWNhbFdpZHRoICs9IGxvZ2ljYWxXaWR0aDsK
LX0KLQotdm9pZCBMaW5lOjphcHBlbmRJbmxpbmVCb3hTdGFydChjb25zdCBJbmxpbmVJdGVtJiBp
bmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKLXsKLSAgICAvLyBUaGlz
IGlzIHJlYWxseSBqdXN0IGEgcGxhY2Vob2xkZXIgdG8gbWFyayB0aGUgc3RhcnQgb2YgdGhlIGlu
bGluZSBib3ggPHNwYW4+LgotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRl
eHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVJdGVtLmxheW91dEJveCgpKTsKLSAgICBhdXRvIGFk
anVzdGVkUnVuU3RhcnQgPSBjb250ZW50TG9naWNhbFJpZ2h0KCkgKyBzdGQ6Om1pbihib3hHZW9t
ZXRyeS5tYXJnaW5TdGFydCgpLCAwX2x1KTsKLSAgICArK21fbm9uU3Bhbm5pbmdJbmxpbmVMZXZl
bEJveENvdW50OwotICAgIGFwcGVuZE5vbkJyZWFrYWJsZVNwYWNlKGlubGluZUl0ZW0sIGFkanVz
dGVkUnVuU3RhcnQsIGxvZ2ljYWxXaWR0aCk7Ci19Ci0KLXZvaWQgTGluZTo6YXBwZW5kSW5saW5l
Qm94RW5kKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9n
aWNhbFdpZHRoKQotewotICAgIC8vIFRoaXMgaXMgcmVhbGx5IGp1c3QgYSBwbGFjZWhvbGRlciB0
byBtYXJrIHRoZSBlbmQgb2YgdGhlIGlubGluZSBib3ggPC9zcGFuPi4KLSAgICBhdXRvIHJlbW92
ZVRyYWlsaW5nTGV0dGVyU3BhY2luZyA9IFsmXSB7Ci0gICAgICAgIGlmICghbV90cmltbWFibGVU
cmFpbGluZ0NvbnRlbnQuaXNUcmFpbGluZ1J1blBhcnRpYWxseVRyaW1tYWJsZSgpKQotICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggLT0gbV90cmltbWFi
bGVUcmFpbGluZ0NvbnRlbnQucmVtb3ZlUGFydGlhbGx5VHJpbW1hYmxlQ29udGVudCgpOwotICAg
IH07Ci0gICAgLy8gUHJldmVudCB0cmFpbGluZyBsZXR0ZXItc3BhY2luZyBmcm9tIHNwaWxsaW5n
IG91dCBvZiB0aGUgaW5saW5lIGJveC4KLSAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcv
Y3NzLXRleHQtMy8jbGV0dGVyLXNwYWNpbmctcHJvcGVydHkgU2VlIGV4YW1wbGUgMjEuCi0gICAg
cmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7Ci0gICAgYXBwZW5kTm9uQnJlYWthYmxlU3Bh
Y2UoaW5saW5lSXRlbSwgY29udGVudExvZ2ljYWxXaWR0aCgpLCBsb2dpY2FsV2lkdGgpOwotfQot
Ci12b2lkIExpbmU6OmFwcGVuZFRleHRDb250ZW50KGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxp
bmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgYXV0byYg
c3R5bGUgPSBpbmxpbmVUZXh0SXRlbS5zdHlsZSgpOwotICAgIGF1dG8gd2lsbENvbGxhcHNlQ29t
cGxldGVseSA9IFsmXSB7Ci0gICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc0VtcHR5Q29udGVu
dCgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmICghaW5saW5lVGV4dEl0
ZW0uaXNXaGl0ZXNwYWNlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlm
IChJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJ
dGVtKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhl
IGxhc3QgaXRlbSBpcyBjb2xsYXBzZWQgYXMgd2VsbC4KLSAgICAgICAgZm9yIChhdXRvJiBydW4g
OiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKG1fcnVucykpIHsKLSAgICAgICAgICAgIGlmIChydW4u
aXNCb3goKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAvLyBo
dHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jd2hpdGUtc3BhY2UtcGhhc2UtMQot
ICAgICAgICAgICAgLy8gQW55IGNvbGxhcHNpYmxlIHNwYWNlIGltbWVkaWF0ZWx5IGZvbGxvd2lu
ZyBhbm90aGVyIGNvbGxhcHNpYmxlIHNwYWNl4oCUZXZlbiBvbmUgb3V0c2lkZSB0aGUgYm91bmRh
cnkgb2YgdGhlIGlubGluZSBjb250YWluaW5nIHRoYXQgc3BhY2UsCi0gICAgICAgICAgICAvLyBw
cm92aWRlZCBib3RoIHNwYWNlcyBhcmUgd2l0aGluIHRoZSBzYW1lIGlubGluZSBmb3JtYXR0aW5n
IGNvbnRleHTigJRpcyBjb2xsYXBzZWQgdG8gaGF2ZSB6ZXJvIGFkdmFuY2Ugd2lkdGguCi0gICAg
ICAgICAgICAvLyA6ICI8c3Bhbj4gIDwvc3Bhbj4gIiA8LSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFj
ZSBjb2xsYXBzZXMgY29tcGxldGVseS4KLSAgICAgICAgICAgIC8vIE5vdCB0aGF0IHdoZW4gdGhl
IGlubGluZSBib3ggaGFzIHByZXNlcnZlIHdoaXRlc3BhY2Ugc3R5bGUsICI8c3BhbiBzdHlsZT0i
d2hpdGUtc3BhY2U6IHByZSI+ICA8L3NwYW4+ICIgPC0gdGhpcyB3aGl0ZXNwYWNlIHN0YXlzIGFy
b3VuZC4KLSAgICAgICAgICAgIGlmIChydW4uaXNUZXh0KCkpCi0gICAgICAgICAgICAgICAgcmV0
dXJuIHJ1bi5oYXNDb2xsYXBzaWJsZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwotICAgICAgICAgICAg
QVNTRVJUKHJ1bi5pc0lubGluZUJveFN0YXJ0KCkgfHwgcnVuLmlzSW5saW5lQm94RW5kKCkgfHwg
cnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTGVh
ZGluZyB3aGl0ZXNwYWNlLgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9OwotCi0gICAgaWYg
KHdpbGxDb2xsYXBzZUNvbXBsZXRlbHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYXV0byBu
ZWVkc05ld1J1biA9IFsmXSB7Ci0gICAgICAgIGlmIChtX3J1bnMuaXNFbXB0eSgpKQotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGF1dG8mIGxhc3RSdW4gPSBtX3J1bnMubGFzdCgp
OwotICAgICAgICBpZiAoJmxhc3RSdW4ubGF5b3V0Qm94KCkgIT0gJmlubGluZVRleHRJdGVtLmxh
eW91dEJveCgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmICghbGFzdFJ1
bi5pc1RleHQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAobGFzdFJ1
bi5oYXNDb2xsYXBzZWRUcmFpbGluZ1doaXRlc3BhY2UoKSkKLSAgICAgICAgICAgIHJldHVybiB0
cnVlOwotICAgICAgICBpZiAoaW5saW5lVGV4dEl0ZW0uaXNXb3JkU2VwYXJhdG9yKCkgJiYgc3R5
bGUuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9KCk7Ci0gICAgYXV0byBvbGRDb250ZW50TG9n
aWNhbFdpZHRoID0gY29udGVudExvZ2ljYWxXaWR0aCgpOwotICAgIGlmIChuZWVkc05ld1J1bikg
ewotICAgICAgICAvLyBOb3RlLCBuZWdhdGl2ZSB3b3JkcyBzcGFjaW5nIG1heSBjYXVzZSBnbHlw
aCBvdmVybGFwLgotICAgICAgICBhdXRvIHJ1bkxvZ2ljYWxMZWZ0ID0gY29udGVudExvZ2ljYWxS
aWdodCgpICsgKGlubGluZVRleHRJdGVtLmlzV29yZFNlcGFyYXRvcigpID8gc3R5bGUuZm9udENh
c2NhZGUoKS53b3JkU3BhY2luZygpIDogMC4wZik7Ci0gICAgICAgIG1fcnVucy5hcHBlbmQoeyBp
bmxpbmVUZXh0SXRlbSwgcnVuTG9naWNhbExlZnQsIGxvZ2ljYWxXaWR0aCB9KTsKLSAgICAgICAg
bV9jb250ZW50TG9naWNhbFdpZHRoID0gc3RkOjptYXgob2xkQ29udGVudExvZ2ljYWxXaWR0aCwg
cnVuTG9naWNhbExlZnQgKyBsb2dpY2FsV2lkdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1f
cnVucy5sYXN0KCkuZXhwYW5kKGlubGluZVRleHRJdGVtLCBsb2dpY2FsV2lkdGgpOwotICAgICAg
ICAvLyBEbyBub3QgbGV0IG5lZ2F0aXZlIGxldHRlciBzcGFjaW5nIG1ha2UgdGhlIGNvbnRlbnQg
c2hvcnRlciB0aGFuIGl0IGFscmVhZHkgaXMuCi0gICAgICAgIG1fY29udGVudExvZ2ljYWxXaWR0
aCArPSBzdGQ6Om1heCgwLjBmLCBsb2dpY2FsV2lkdGgpOwotICAgIH0KLSAgICAvLyBTZXQgdGhl
IHRyYWlsaW5nIHRyaW1tYWJsZSBjb250ZW50LgotICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1do
aXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFi
cyhpbmxpbmVUZXh0SXRlbSkpIHsKLSAgICAgICAgbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQu
YWRkRnVsbHlUcmltbWFibGVDb250ZW50KG1fcnVucy5zaXplKCkgLSAxLCBjb250ZW50TG9naWNh
bFdpZHRoKCkgLSBvbGRDb250ZW50TG9naWNhbFdpZHRoKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICAvLyBBbnkgbm9uLXdoaXRlc3BhY2UsIG5vLXRyaW1tYWJsZSBjb250ZW50IHJlc2V0
cyB0aGUgZXhpc3RpbmcgdHJpbW1hYmxlLgotICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50
LnJlc2V0KCk7Ci0gICAgaWYgKCFmb3JtYXR0aW5nQ29udGV4dCgpLmxheW91dFN0YXRlKCkuc2hv
dWxkSWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgJiYgIWlubGluZVRleHRJdGVtLmlzV2hp
dGVzcGFjZSgpICYmIHN0eWxlLmxldHRlclNwYWNpbmcoKSA+IDApCi0gICAgICAgIG1fdHJpbW1h
YmxlVHJhaWxpbmdDb250ZW50LmFkZFBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQobV9ydW5zLnNp
emUoKSAtIDEsIHN0eWxlLmxldHRlclNwYWNpbmcoKSk7Ci0gICAgbV90cmFpbGluZ1NvZnRIeXBo
ZW5XaWR0aCA9IGlubGluZVRleHRJdGVtLmhhc1RyYWlsaW5nU29mdEh5cGhlbigpID8gbWFrZU9w
dGlvbmFsKHN0eWxlLmZvbnRDYXNjYWRlKCkud2lkdGgoVGV4dFJ1biB7IFN0cmluZ1ZpZXcgeyBz
dHlsZS5oeXBoZW5TdHJpbmcoKSB9IH0pKSA6IFdURjo6bnVsbG9wdDsKLX0KLQotdm9pZCBMaW5l
OjphcHBlbmROb25SZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mIGlubGlu
ZUl0ZW0sIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKQotewotICAgIG1f
dHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlc2V0KCk7Ci0gICAgbV90cmFpbGluZ1NvZnRIeXBo
ZW5XaWR0aCA9IHsgfTsKLSAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggKz0gbWFyZ2luQm94TG9n
aWNhbFdpZHRoOwotICAgICsrbV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQ7Ci0gICAg
YXV0byBtYXJnaW5TdGFydCA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goaW5s
aW5lSXRlbS5sYXlvdXRCb3goKSkubWFyZ2luU3RhcnQoKTsKLSAgICBpZiAobWFyZ2luU3RhcnQg
Pj0gMCkgewotICAgICAgICBtX3J1bnMuYXBwZW5kKHsgaW5saW5lSXRlbSwgY29udGVudExvZ2lj
YWxSaWdodCgpLCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGggfSk7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0gICAgLy8gTmVnYXRpdmUgbWFyZ2luLXN0YXJ0IHB1bGxzIHRoZSBjb250ZW50IHRvIHRo
ZSBsb2dpY2FsIGxlZnQgZGlyZWN0aW9uLgotICAgIC8vIE5lZ2F0aXZlIG1hcmdpbiBhbHNvIHNx
dWVlemVzIHRoZSBtYXJnaW4gYm94LCB3ZSBuZWVkIHRvIHN0cmV0Y2ggaXQgdG8gbWFrZSBzdXJl
IHRoZSBzdWJzZXF1ZW50IGNvbnRlbnQgd29uJ3Qgb3ZlcmxhcC4KLSAgICAvLyBlLmcuIDxpbWcg
c3R5bGU9IndpZHRoOiAxMDBweDsgbWFyZ2luLWxlZnQ6IC0xMDBweDsiPiBwdWxscyB0aGUgcmVw
bGFjZWQgYm94IHRvIC0xMDBweCB3aXRoIHRoZSBtYXJnaW4gYm94IHdpZHRoIG9mIDBweC4KLSAg
ICAvLyBJbnN0ZWFkIHdlIG5lZWQgdG8gcG9zaXRpb24gaXQgYXQgLTEwMHB4IGFuZCBzaXplIGl0
IHRvIDEwMHB4IHNvIHRoZSBzdWJzZXF1ZW50IGNvbnRlbnQgc3RhcnRzIGF0IDBweC4gCi0gICAg
bV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGNvbnRlbnRMb2dpY2FsUmlnaHQoKSArIG1hcmdp
blN0YXJ0LCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGggLSBtYXJnaW5TdGFydCB9KTsKLX0KLQotdm9p
ZCBMaW5lOjphcHBlbmRSZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mIGlu
bGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKQotewotICAg
IEFTU0VSVChpbmxpbmVJdGVtLmxheW91dEJveCgpLmlzUmVwbGFjZWRCb3goKSk7Ci0gICAgLy8g
RklYTUU6IFN1cmVseSByZXBsYWNlZCBib3hlcyBiZWhhdmUgZGlmZmVyZW50bHkuCi0gICAgYXBw
ZW5kTm9uUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVtLCBtYXJnaW5Cb3hMb2dpY2Fs
V2lkdGgpOwotfQotCi12b2lkIExpbmU6OmFwcGVuZExpbmVCcmVhayhjb25zdCBJbmxpbmVJdGVt
JiBpbmxpbmVJdGVtKQotewotICAgIG1fdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPSB7IH07Ci0g
ICAgaWYgKGlubGluZUl0ZW0uaXNIYXJkTGluZUJyZWFrKCkpIHsKLSAgICAgICAgKyttX25vblNw
YW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudDsKLSAgICAgICAgcmV0dXJuIG1fcnVucy5hcHBlbmQo
eyBpbmxpbmVJdGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIDBfbHUgfSk7Ci0gICAgfQotICAg
IC8vIFNvZnQgbGluZSBicmVha3MgKHByZXNlcnZlZCBuZXcgbGluZSBjaGFyYWN0ZXJzKSByZXF1
aXJlIGlubGluZSB0ZXh0IGJveGVzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCi0gICAgQVNT
RVJUKGlubGluZUl0ZW0uaXNTb2Z0TGluZUJyZWFrKCkpOwotICAgIG1fcnVucy5hcHBlbmQoeyBk
b3duY2FzdDxJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbT4oaW5saW5lSXRlbSksIGNvbnRlbnRMb2dp
Y2FsUmlnaHQoKSB9KTsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmRXb3JkQnJlYWtPcHBvcnR1bml0
eShjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQotewotICAgIG1fcnVucy5hcHBlbmQoeyBp
bmxpbmVJdGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIDBfbHUgfSk7Ci19Ci0KLXZvaWQgTGlu
ZTo6YWRkVHJhaWxpbmdIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBoeXBoZW5Mb2dpY2FsV2lkdGgp
Ci17Ci0gICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKG1fcnVucykp
IHsKLSAgICAgICAgaWYgKCFydW4uaXNUZXh0KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgcnVuLnNldE5lZWRzSHlwaGVuKGh5cGhlbkxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIG1f
Y29udGVudExvZ2ljYWxXaWR0aCArPSBoeXBoZW5Mb2dpY2FsV2lkdGg7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci19Ci0KLWNvbnN0IElubGluZUZv
cm1hdHRpbmdDb250ZXh0JiBMaW5lOjpmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Ci19Ci0KLUxpbmU6OlRyaW1tYWJsZVRy
YWlsaW5nQ29udGVudDo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KFJ1bkxpc3QmIHJ1bnMpCi0g
ICAgOiBtX3J1bnMocnVucykKLXsKLX0KLQotdm9pZCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0Nv
bnRlbnQ6OmFkZEZ1bGx5VHJpbW1hYmxlQ29udGVudChzaXplX3QgcnVuSW5kZXgsIElubGluZUxh
eW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpCi17Ci0gICAgLy8gQW55IHN1YnNlcXVlbnQgdHJpbW1h
YmxlIHdoaXRlc3BhY2Ugc2hvdWxkIGNvbGxhcHNlIHRvIHplcm8gYWR2YW5jZWQgd2lkdGggYW5k
IGlnbm9yZWQgYXQgOjphcHBlbmRUZXh0Q29udGVudCgpLgotICAgIEFTU0VSVCghbV9oYXNGdWxs
eVRyaW1tYWJsZUNvbnRlbnQpOwotICAgIG1fZnVsbHlUcmltbWFibGVXaWR0aCA9IHRyaW1tYWJs
ZVdpZHRoOwotICAgIC8vIE5vdGUgdGhhdCBqdXN0IGJlY2F1c2UgdGhlIHRyaW1tYWJsZSB3aWR0
aCBpcyAwIChmb250LXNpemU6IDBweCksIGl0IGRvZXMgbm90IG1lYW4gd2UgZG9uJ3QgaGF2ZSBh
IHRyaW1tYWJsZSB0cmFpbGluZyBjb250ZW50LgotICAgIG1faGFzRnVsbHlUcmltbWFibGVDb250
ZW50ID0gdHJ1ZTsKLSAgICBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXggPSBtX2ZpcnN0VHJpbW1h
YmxlUnVuSW5kZXgudmFsdWVPcihydW5JbmRleCk7Ci19Ci0KLXZvaWQgTGluZTo6VHJpbW1hYmxl
VHJhaWxpbmdDb250ZW50OjphZGRQYXJ0aWFsbHlUcmltbWFibGVDb250ZW50KHNpemVfdCBydW5J
bmRleCwgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVXaWR0aCkKLXsKLSAgICAvLyBEbyBub3Qg
YWRkIHRyaW1tYWJsZSBsZXR0ZXIgc3BhY2luZyBhZnRlciBhIGZ1bGx5IHRyaW1tYWJsZSB3aGl0
ZXNwYWNlLgotICAgIEFTU0VSVCghbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4KTsKLSAgICBBU1NF
UlQoIW1faGFzRnVsbHlUcmltbWFibGVDb250ZW50KTsKLSAgICBBU1NFUlQoIW1fcGFydGlhbGx5
VHJpbW1hYmxlV2lkdGgpOwotICAgIEFTU0VSVCh0cmltbWFibGVXaWR0aCk7Ci0gICAgbV9wYXJ0
aWFsbHlUcmltbWFibGVXaWR0aCA9IHRyaW1tYWJsZVdpZHRoOwotICAgIG1fZmlyc3RUcmltbWFi
bGVSdW5JbmRleCA9IHJ1bkluZGV4OwotfQotCi1JbmxpbmVMYXlvdXRVbml0IExpbmU6OlRyaW1t
YWJsZVRyYWlsaW5nQ29udGVudDo6cmVtb3ZlKCkKLXsKLSAgICAvLyBSZW1vdmUgdHJpbW1hYmxl
IHRyYWlsaW5nIGNvbnRlbnQgYW5kIG1vdmUgYWxsIHRoZSBzdWJzZXF1ZW50IHRyYWlsaW5nIHJ1
bnMuCi0gICAgLy8gPHNwYW4+IDwvc3Bhbj48c3Bhbj48L3NwYW4+Ci0gICAgLy8gW3RyYWlsaW5n
IHdoaXRlc3BhY2VdW2lubGluZSBib3ggZW5kXVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94
IGVuZF0KLSAgICAvLyBUcmltIHRoZSB3aGl0ZXNwYWNlIHJ1biBhbmQgbW92ZSB0aGUgdHJhaWxp
bmcgaW5saW5lIGJveCBydW5zIHRvIHRoZSBsb2dpY2FsIGxlZnQuCi0gICAgQVNTRVJUKCFpc0Vt
cHR5KCkpOwotICAgIGF1dG8mIHRyaW1tYWJsZVJ1biA9IG1fcnVuc1sqbV9maXJzdFRyaW1tYWJs
ZVJ1bkluZGV4XTsKLSAgICBBU1NFUlQodHJpbW1hYmxlUnVuLmlzVGV4dCgpKTsKLQotICAgIGlm
IChtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCkKLSAgICAgICAgdHJpbW1hYmxlUnVuLnJlbW92
ZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwotICAgIGlmIChtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRo
KQotICAgICAgICB0cmltbWFibGVSdW4ucmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7Ci0K
LSAgICBhdXRvIHRyaW1tYWJsZVdpZHRoID0gd2lkdGgoKTsKLSAgICAvLyBXaGVuIHRoZSB0cmlt
bWFibGUgcnVuIGlzIGZvbGxvd2VkIGJ5IHNvbWUgbm9uLWNvbnRlbnQgcnVucywgd2UgbmVlZCB0
byBhZGp1c3QgdGhlaXIgaG9yaXpvbnRhbCBwb3NpdGlvbnMuCi0gICAgLy8gZS5nLiA8ZGl2PnRl
eHQgaXMgZm9sbG93ZWQgYnkgdHJpbW1hYmxlIGNvbnRlbnQgICAgPHNwYW4+IDwvc3Bhbj48L2Rp
dj4KLSAgICAvLyBXaGVuIHRoZSBbdGV4dC4uLl0gcnVuIGlzIHRyaW1tZWQgKHRyYWlsaW5nIHdo
aXRlc3BhY2UgaXMgcmVtb3ZlZCksIGJvdGggIjxzcGFuPiIgYW5kICI8L3NwYW4+IiBydW5zCi0g
ICAgLy8gbmVlZCB0byBiZSBtb3ZlZCBob3Jpem9udGFsbHkgdG8gY2F0Y2ggdXAgd2l0aCB0aGUg
W3RleHQuLi5dIHJ1bi4gTm90ZSB0aGF0IHRoZSB3aGl0ZXNwYWNlIGluc2lkZSB0aGUgPHNwYW4+
IGRvZXMKLSAgICAvLyBub3QgcHJvZHVjZSBhIHJ1biBzaW5jZSBpbiA6OmFwcGVuZFRleHQoKSB3
ZSBzZWUgaXQgYXMgYSBmdWxseSBjb2xsYXBzaWJsZSBydW4uCi0gICAgZm9yIChhdXRvIGluZGV4
ID0gKm1fZmlyc3RUcmltbWFibGVSdW5JbmRleCArIDE7IGluZGV4IDwgbV9ydW5zLnNpemUoKTsg
KytpbmRleCkgewotICAgICAgICBhdXRvJiBydW4gPSBtX3J1bnNbaW5kZXhdOwotICAgICAgICBB
U1NFUlQocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSB8fCBydW4uaXNJbmxpbmVCb3hTdGFy
dCgpIHx8IHJ1bi5pc0lubGluZUJveEVuZCgpIHx8IHJ1bi5pc0xpbmVCcmVhaygpKTsKLSAgICAg
ICAgcnVuLm1vdmVIb3Jpem9udGFsbHkoLXRyaW1tYWJsZVdpZHRoKTsKLSAgICB9Ci0gICAgaWYg
KCF0cmltbWFibGVSdW4udGV4dENvbnRlbnQoKS0+bGVuZ3RoKCkpIHsKLSAgICAgICAgLy8gVGhp
cyB0cmltbWFibGUgcnVuIGlzIGZ1bGx5IGNvbGxhcHNlZCBub3cgKGUuZy4gPGRpdj48aW1nPiAg
ICA8c3Bhbj48L3NwYW4+PC9kaXY+KS4KLSAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBrZWVw
IGl0IGFyb3VuZCBhbnltb3JlLgotICAgICAgICBtX3J1bnMucmVtb3ZlKCptX2ZpcnN0VHJpbW1h
YmxlUnVuSW5kZXgpOwotICAgIH0KLSAgICByZXNldCgpOwotICAgIHJldHVybiB0cmltbWFibGVX
aWR0aDsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRl
bnQ6OnJlbW92ZVBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQoKQotewotICAgIC8vIFBhcnRpYWxs
eSB0cmltbWFibGUgY29udGVudCBpcyBhbHdheXMgZ2F0ZWQgYnkgYSBmdWxseSB0cmltbWFibGUg
Y29udGVudC4KLSAgICAvLyBXZSBjYW4ndCBqdXN0IHRyaW0gc3BhY2luZyBpbiB0aGUgbWlkZGxl
LgotICAgIEFTU0VSVCghbV9mdWxseVRyaW1tYWJsZVdpZHRoKTsKLSAgICByZXR1cm4gcmVtb3Zl
KCk7Ci19Ci0KLUxpbmU6OlJ1bjo6UnVuKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElu
bGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRo
KQotICAgIDogbV90eXBlKGlubGluZUl0ZW0udHlwZSgpKQotICAgICwgbV9sYXlvdXRCb3goJmlu
bGluZUl0ZW0ubGF5b3V0Qm94KCkpCi0gICAgLCBtX2xvZ2ljYWxMZWZ0KGxvZ2ljYWxMZWZ0KQot
ICAgICwgbV9sb2dpY2FsV2lkdGgobG9naWNhbFdpZHRoKQotewotfQotCi1MaW5lOjpSdW46OlJ1
bihjb25zdCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSYgc29mdExpbmVCcmVha0l0ZW0sIElubGlu
ZUxheW91dFVuaXQgbG9naWNhbExlZnQpCi0gICAgOiBtX3R5cGUoc29mdExpbmVCcmVha0l0ZW0u
dHlwZSgpKQotICAgICwgbV9sYXlvdXRCb3goJnNvZnRMaW5lQnJlYWtJdGVtLmxheW91dEJveCgp
KQotICAgICwgbV9sb2dpY2FsTGVmdChsb2dpY2FsTGVmdCkKLSAgICAsIG1fdGV4dENvbnRlbnQo
eyBzb2Z0TGluZUJyZWFrSXRlbS5wb3NpdGlvbigpLCAxLCBzb2Z0TGluZUJyZWFrSXRlbS5pbmxp
bmVUZXh0Qm94KCkuY29udGVudCgpIH0pCi17Ci19Ci0KLUxpbmU6OlJ1bjo6UnVuKGNvbnN0IElu
bGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVm
dCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi0gICAgOiBtX3R5cGUoSW5saW5lSXRl
bTo6VHlwZTo6VGV4dCkKLSAgICAsIG1fbGF5b3V0Qm94KCZpbmxpbmVUZXh0SXRlbS5sYXlvdXRC
b3goKSkKLSAgICAsIG1fbG9naWNhbExlZnQobG9naWNhbExlZnQpCi0gICAgLCBtX2xvZ2ljYWxX
aWR0aChsb2dpY2FsV2lkdGgpCi0gICAgLCBtX3doaXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9ydHVu
aXR5KCFUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVt
LmxheW91dEJveCgpKSkKLSAgICAsIG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSh0cmFpbGluZ1do
aXRlc3BhY2VUeXBlKGlubGluZVRleHRJdGVtKSkKLSAgICAsIG1fdGV4dENvbnRlbnQoeyBpbmxp
bmVUZXh0SXRlbS5zdGFydCgpLCBtX3RyYWlsaW5nV2hpdGVzcGFjZVR5cGUgPT0gVHJhaWxpbmdX
aGl0ZXNwYWNlOjpDb2xsYXBzZWQgPyAxIDogaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCksIGlubGlu
ZVRleHRJdGVtLmlubGluZVRleHRCb3goKS5jb250ZW50KCkgfSkKLXsKLSAgICBpZiAobV90cmFp
bGluZ1doaXRlc3BhY2VUeXBlICE9IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSkgewotICAgICAg
ICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0gbG9naWNhbFdpZHRoOwotICAgICAgICBpZiAo
bV93aGl0ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1bml0eSkKLSAgICAgICAgICAgIG1fZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudCA9IDE7Ci0gICAgfQotfQotCi12b2lkIExpbmU6OlJ1bjo6ZXhw
YW5kKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBl
eHBhbnNpb24gbWVyZ2UuIFdlIHNob3VsZCBldmVudHVhbGx5IHN3aXRjaCBvdmVyIHRvIEZvbnRD
YXNjYWRlOjpleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LgotICAgIEFTU0VSVCghaGFzQ29sbGFw
c2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCkpOwotICAgIEFTU0VSVChpc1RleHQoKSAmJiBpbmxpbmVU
ZXh0SXRlbS5pc1RleHQoKSk7Ci0gICAgQVNTRVJUKG1fbGF5b3V0Qm94ID09ICZpbmxpbmVUZXh0
SXRlbS5sYXlvdXRCb3goKSk7Ci0KLSAgICBtX2xvZ2ljYWxXaWR0aCArPSBsb2dpY2FsV2lkdGg7
Ci0gICAgbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID0gdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZShp
bmxpbmVUZXh0SXRlbSk7Ci0KLSAgICBpZiAobV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID09IFRy
YWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSkgewotICAgICAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdp
ZHRoID0geyB9OwotICAgICAgICBzZXRFeHBhbnNpb25CZWhhdmlvcihBbGxvd0xlZnRFeHBhbnNp
b24gfCBBbGxvd1JpZ2h0RXhwYW5zaW9uKTsKLSAgICAgICAgbV90ZXh0Q29udGVudC0+ZXhwYW5k
KGlubGluZVRleHRJdGVtLmxlbmd0aCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBt
X3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoICs9IGxvZ2ljYWxXaWR0aDsKLSAgICBpZiAobV93aGl0
ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1bml0eSkKLSAgICAgICAgKyttX2V4cGFuc2lvbk9wcG9y
dHVuaXR5Q291bnQ7Ci0gICAgc2V0RXhwYW5zaW9uQmVoYXZpb3IoRGVmYXVsdEV4cGFuc2lvbik7
Ci0gICAgbV90ZXh0Q29udGVudC0+ZXhwYW5kKG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9PSBU
cmFpbGluZ1doaXRlc3BhY2U6OkNvbGxhcHNlZCA/IDEgOiBpbmxpbmVUZXh0SXRlbS5sZW5ndGgo
KSk7Ci19Ci0KLWJvb2wgTGluZTo6UnVuOjpoYXNUcmFpbGluZ0xldHRlclNwYWNpbmcoKSBjb25z
dAotewotICAgIHJldHVybiAhaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkgJiYgc3R5bGUoKS5sZXR0
ZXJTcGFjaW5nKCkgPiAwOwotfQotCi1JbmxpbmVMYXlvdXRVbml0IExpbmU6OlJ1bjo6dHJhaWxp
bmdMZXR0ZXJTcGFjaW5nKCkgY29uc3QKLXsKLSAgICBpZiAoIWhhc1RyYWlsaW5nTGV0dGVyU3Bh
Y2luZygpKQotICAgICAgICByZXR1cm4geyB9OwotICAgIHJldHVybiBJbmxpbmVMYXlvdXRVbml0
IHsgc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCkgfTsKLX0KLQotdm9pZCBMaW5lOjpSdW46OnJlbW92
ZVRyYWlsaW5nTGV0dGVyU3BhY2luZygpCi17Ci0gICAgQVNTRVJUKGhhc1RyYWlsaW5nTGV0dGVy
U3BhY2luZygpKTsKLSAgICBzaHJpbmtIb3Jpem9udGFsbHkodHJhaWxpbmdMZXR0ZXJTcGFjaW5n
KCkpOwotICAgIEFTU0VSVChsb2dpY2FsV2lkdGgoKSA+IDAgfHwgKCFsb2dpY2FsV2lkdGgoKSAm
JiBzdHlsZSgpLmxldHRlclNwYWNpbmcoKSA+PSBzdGF0aWNfY2FzdDxmbG9hdD4oaW50TWF4Rm9y
TGF5b3V0VW5pdCkpKTsKLX0KLQotdm9pZCBMaW5lOjpSdW46OnJlbW92ZVRyYWlsaW5nV2hpdGVz
cGFjZSgpCi17Ci0gICAgLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mt
dGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eSBtYXRyaXgKLSAgICAvLyBUcmltbWFibGUgd2hp
dGVzcGFjZSBpcyBhbHdheXMgY29sbGFwc2libGUgc28gdGhlIGxlbmd0aCBvZiB0aGUgdHJhaWxp
bmcgdHJpbW1hYmxlIHdoaXRlc3BhY2UgaXMgYWx3YXlzIDEgKG9yIG5vbi1leGlzdGVudCkuCi0g
ICAgQVNTRVJUKG1fdGV4dENvbnRlbnQtPmxlbmd0aCgpKTsKLSAgICBjb25zdGV4cHIgc2l6ZV90
IHRyYWlsaW5nVHJpbW1hYmxlQ29udGVudExlbmd0aCA9IDE7Ci0gICAgbV90ZXh0Q29udGVudC0+
c2hyaW5rKHRyYWlsaW5nVHJpbW1hYmxlQ29udGVudExlbmd0aCk7Ci0gICAgdmlzdWFsbHlDb2xs
YXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwotfQotCi12b2lkIExpbmU6OlJ1bjo6dmlzdWFsbHlD
b2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgpCi17Ci0gICAgLy8gVGhpcyBpcyBqdXN0IGEgdmlz
dWFsIGFkanVzdG1lbnQsIHRoZSB0ZXh0IGxlbmd0aCBzaG91bGQgcmVtYWluIHRoZSBzYW1lLgot
ICAgIHNocmlua0hvcml6b250YWxseShtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKTsKLSAgICBt
X3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0geyB9OwotICAgIG1fdHJhaWxpbmdXaGl0ZXNwYWNl
VHlwZSA9IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZTsKLQotICAgIGlmIChtX3doaXRlc3BhY2VJ
c0V4cGFuc2lvbk9wcG9ydHVuaXR5KSB7Ci0gICAgICAgIEFTU0VSVChtX2V4cGFuc2lvbk9wcG9y
dHVuaXR5Q291bnQpOwotICAgICAgICBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQtLTsKLSAg
ICB9Ci0gICAgc2V0RXhwYW5zaW9uQmVoYXZpb3IoQWxsb3dMZWZ0RXhwYW5zaW9uIHwgQWxsb3dS
aWdodEV4cGFuc2lvbik7Ci19Ci0KLXZvaWQgTGluZTo6UnVuOjpzZXRFeHBhbnNpb25CZWhhdmlv
cihFeHBhbnNpb25CZWhhdmlvciBleHBhbnNpb25CZWhhdmlvcikKLXsKLSAgICBBU1NFUlQoaXNU
ZXh0KCkpOwotICAgIG1fZXhwYW5zaW9uLmJlaGF2aW9yID0gZXhwYW5zaW9uQmVoYXZpb3I7Ci19
Ci0KLUV4cGFuc2lvbkJlaGF2aW9yIExpbmU6OlJ1bjo6ZXhwYW5zaW9uQmVoYXZpb3IoKSBjb25z
dAotewotICAgIEFTU0VSVChpc1RleHQoKSk7Ci0gICAgcmV0dXJuIG1fZXhwYW5zaW9uLmJlaGF2
aW9yOwotfQotCi12b2lkIExpbmU6OlJ1bjo6c2V0SG9yaXpvbnRhbEV4cGFuc2lvbihJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxFeHBhbnNpb24pCi17Ci0gICAgQVNTRVJUKGlzVGV4dCgpKTsKLSAg
ICBBU1NFUlQoaGFzRXhwYW5zaW9uT3Bwb3J0dW5pdHkoKSk7Ci0gICAgbV9leHBhbnNpb24uaG9y
aXpvbnRhbEV4cGFuc2lvbiA9IGxvZ2ljYWxFeHBhbnNpb247Ci19Ci0KLX0KLX0KLQotI2VuZGlm
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVMaW5lLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVM
aW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMzM1MTk1MjFhYTllNGY5NmE3
OTM0YWVkOGMwMzJjYzllNzkzZjUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5l
TGluZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJh
Z21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5j
bHVkZSAiSW5saW5lSXRlbS5oIgotI2luY2x1ZGUgIklubGluZUxpbmVSdW4uaCIKLSNpbmNsdWRl
ICJJbmxpbmVUZXh0SXRlbS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5
b3V0IHsKLQotY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Ci1jbGFzcyBJbmxpbmVTb2Z0
TGluZUJyZWFrSXRlbTsKLQotY2xhc3MgTGluZSB7Ci1wdWJsaWM6Ci0gICAgTGluZShjb25zdCBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dCYpOwotICAgIH5MaW5lKCk7Ci0KLSAgICB2b2lkIGluaXRp
YWxpemUoKTsKLQotICAgIHZvaWQgYXBwZW5kKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0KLSAgICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dp
Y2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRMb2dpY2FsV2lkdGg7IH0KLSAgICBJ
bmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsUmlnaHQoKSBjb25zdCB7IHJldHVybiBtX3J1
bnMuaXNFbXB0eSgpID8gMC4wZiA6IG1fcnVucy5sYXN0KCkubG9naWNhbFJpZ2h0KCk7IH0KLSAg
ICBzaXplX3Qgbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50KCkgY29uc3QgeyByZXR1cm4g
bV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQ7IH0KLQotICAgIElubGluZUxheW91dFVu
aXQgdHJpbW1hYmxlVHJhaWxpbmdXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fdHJpbW1hYmxlVHJh
aWxpbmdDb250ZW50LndpZHRoKCk7IH0KLSAgICBib29sIGlzVHJhaWxpbmdSdW5GdWxseVRyaW1t
YWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmlzVHJhaWxp
bmdSdW5GdWxseVRyaW1tYWJsZSgpOyB9Ci0KLSAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0
PiB0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fdHJhaWxpbmdTb2Z0
SHlwaGVuV2lkdGg7IH0KLSAgICB2b2lkIGFkZFRyYWlsaW5nSHlwaGVuKElubGluZUxheW91dFVu
aXQgaHlwaGVuTG9naWNhbFdpZHRoKTsKLQotICAgIHZvaWQgcmVtb3ZlQ29sbGFwc2libGVDb250
ZW50KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFsU3BhY2UpOwotICAgIHZvaWQgYXBw
bHlSdW5FeHBhbnNpb24oSW5saW5lTGF5b3V0VW5pdCBleHRyYUhvcml6b250YWxTcGFjZSk7Ci0K
LSAgICBzdHJ1Y3QgUnVuIHsKLSAgICAgICAgYm9vbCBpc1RleHQoKSBjb25zdCB7IHJldHVybiBt
X3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6VGV4dDsgfQotICAgICAgICBib29sIGlzQm94KCkg
Y29uc3QgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5cGU6OkJveDsgfQotICAgICAg
ICBib29sIGlzTGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gaXNIYXJkTGluZUJyZWFrKCkgfHwg
aXNTb2Z0TGluZUJyZWFrKCk7IH0KLSAgICAgICAgYm9vbCBpc1NvZnRMaW5lQnJlYWsoKSBjb25z
dCAgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5cGU6OlNvZnRMaW5lQnJlYWs7IH0K
LSAgICAgICAgYm9vbCBpc0hhcmRMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0g
SW5saW5lSXRlbTo6VHlwZTo6SGFyZExpbmVCcmVhazsgfQotICAgICAgICBib29sIGlzV29yZEJy
ZWFrT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlw
ZTo6V29yZEJyZWFrT3Bwb3J0dW5pdHk7IH0KLSAgICAgICAgYm9vbCBpc0lubGluZUJveFN0YXJ0
KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IElubGluZUl0ZW06OlR5cGU6OklubGluZUJveFN0
YXJ0OyB9Ci0gICAgICAgIGJvb2wgaXNJbmxpbmVCb3hFbmQoKSBjb25zdCB7IHJldHVybiBtX3R5
cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94RW5kOyB9Ci0KLSAgICAgICAgY29uc3Qg
Qm94JiBsYXlvdXRCb3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRCb3g7IH0KLSAgICAgICAg
Y29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9sYXlvdXRCb3gtPnN0
eWxlKCk7IH0KLSAgICAgICAgY29uc3QgT3B0aW9uYWw8TGluZVJ1bjo6VGV4dD4mIHRleHRDb250
ZW50KCkgY29uc3QgeyByZXR1cm4gbV90ZXh0Q29udGVudDsgfQotCi0gICAgICAgIElubGluZUxh
eW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsV2lkdGg7IH0K
LSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgpIGNvbnN0IHsgcmV0dXJuIG1f
bG9naWNhbExlZnQ7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsUmlnaHQoKSBj
b25zdCB7IHJldHVybiBsb2dpY2FsTGVmdCgpICsgbG9naWNhbFdpZHRoKCk7IH0KLQotICAgICAg
ICBjb25zdCBMaW5lUnVuOjpFeHBhbnNpb24mIGV4cGFuc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1f
ZXhwYW5zaW9uOyB9Ci0gICAgICAgIGJvb2wgaGFzRXhwYW5zaW9uT3Bwb3J0dW5pdHkoKSBjb25z
dCB7IHJldHVybiBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7IH0KLSAgICAgICAgRXhwYW5z
aW9uQmVoYXZpb3IgZXhwYW5zaW9uQmVoYXZpb3IoKSBjb25zdDsKLSAgICAgICAgdW5zaWduZWQg
ZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwYW5zaW9uT3Bw
b3J0dW5pdHlDb3VudDsgfQotCi0gICAgICAgIGJvb2wgaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkg
Y29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlICE9IFRyYWlsaW5nV2hpdGVz
cGFjZTo6Tm9uZTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHRyYWlsaW5nV2hpdGVzcGFj
ZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3BhY2VXaWR0aDsgfQotCi0g
ICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNsYXNzIExpbmU7Ci0KLSAgICAgICAgUnVuKGNv
bnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5l
TGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOwotICAgICAgICBSdW4oY29uc3QgSW5saW5lU29mdExp
bmVCcmVha0l0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgUnVu
KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0KLSAgICAgICAgdm9pZCBleHBhbmQoY29uc3QgSW5s
aW5lVGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIHZv
aWQgbW92ZUhvcml6b250YWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkgeyBtX2xvZ2ljYWxM
ZWZ0ICs9IG9mZnNldDsgfQotICAgICAgICB2b2lkIHNocmlua0hvcml6b250YWxseShJbmxpbmVM
YXlvdXRVbml0IHdpZHRoKSB7IG1fbG9naWNhbFdpZHRoIC09IHdpZHRoOyB9Ci0gICAgICAgIHZv
aWQgc2V0RXhwYW5zaW9uQmVoYXZpb3IoRXhwYW5zaW9uQmVoYXZpb3IpOwotICAgICAgICB2b2lk
IHNldEhvcml6b250YWxFeHBhbnNpb24oSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsRXhwYW5zaW9u
KTsKLSAgICAgICAgdm9pZCBzZXROZWVkc0h5cGhlbihJbmxpbmVMYXlvdXRVbml0IGh5cGhlbkxv
Z2ljYWxXaWR0aCk7Ci0KLSAgICAgICAgZW51bSBjbGFzcyBUcmFpbGluZ1doaXRlc3BhY2Ugewot
ICAgICAgICAgICAgTm9uZSwKLSAgICAgICAgICAgIE5vdENvbGxhcHNpYmxlLAotICAgICAgICAg
ICAgQ29sbGFwc2libGUsCi0gICAgICAgICAgICBDb2xsYXBzZWQKLSAgICAgICAgfTsKLSAgICAg
ICAgYm9vbCBoYXNDb2xsYXBzaWJsZVRyYWlsaW5nV2hpdGVzcGFjZSgpIGNvbnN0IHsgcmV0dXJu
IG1fdHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9PSBUcmFpbGluZ1doaXRlc3BhY2U6OkNvbGxhcHNp
YmxlIHx8IGhhc0NvbGxhcHNlZFRyYWlsaW5nV2hpdGVzcGFjZSgpOyB9Ci0gICAgICAgIGJvb2wg
aGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGlu
Z1doaXRlc3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Q29sbGFwc2VkOyB9Ci0gICAg
ICAgIFRyYWlsaW5nV2hpdGVzcGFjZSB0cmFpbGluZ1doaXRlc3BhY2VUeXBlKGNvbnN0IElubGlu
ZVRleHRJdGVtJikgY29uc3Q7Ci0gICAgICAgIHZvaWQgcmVtb3ZlVHJhaWxpbmdXaGl0ZXNwYWNl
KCk7Ci0gICAgICAgIHZvaWQgdmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwot
Ci0gICAgICAgIGJvb2wgaGFzVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgY29uc3Q7Ci0gICAgICAg
IElubGluZUxheW91dFVuaXQgdHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgY29uc3Q7Ci0gICAgICAg
IHZvaWQgcmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7Ci0KLSAgICAgICAgSW5saW5lSXRl
bTo6VHlwZSBtX3R5cGUgeyBJbmxpbmVJdGVtOjpUeXBlOjpUZXh0IH07Ci0gICAgICAgIGNvbnN0
IEJveCogbV9sYXlvdXRCb3ggeyBudWxscHRyIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQg
bV9sb2dpY2FsTGVmdCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2xvZ2ljYWxX
aWR0aCB7IDAgfTsKLSAgICAgICAgYm9vbCBtX3doaXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9ydHVu
aXR5IHsgZmFsc2UgfTsKLSAgICAgICAgVHJhaWxpbmdXaGl0ZXNwYWNlIG1fdHJhaWxpbmdXaGl0
ZXNwYWNlVHlwZSB7IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSB9OwotICAgICAgICBJbmxpbmVM
YXlvdXRVbml0IG1fdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGggeyAwIH07Ci0gICAgICAgIE9wdGlv
bmFsPExpbmVSdW46OlRleHQ+IG1fdGV4dENvbnRlbnQ7Ci0gICAgICAgIExpbmVSdW46OkV4cGFu
c2lvbiBtX2V4cGFuc2lvbjsKLSAgICAgICAgdW5zaWduZWQgbV9leHBhbnNpb25PcHBvcnR1bml0
eUNvdW50IHsgMCB9OwotICAgIH07Ci0gICAgdXNpbmcgUnVuTGlzdCA9IFZlY3RvcjxSdW4sIDEw
PjsKLSAgICBjb25zdCBSdW5MaXN0JiBydW5zKCkgY29uc3QgeyByZXR1cm4gbV9ydW5zOyB9Ci0K
LXByaXZhdGU6Ci0gICAgdm9pZCBhcHBlbmROb25CcmVha2FibGVTcGFjZShjb25zdCBJbmxpbmVJ
dGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dp
Y2FsV2lkdGgpOwotICAgIHZvaWQgYXBwZW5kVGV4dENvbnRlbnQoY29uc3QgSW5saW5lVGV4dEl0
ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBlbmROb25S
ZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0
IG1hcmdpbkJveExvZ2ljYWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBlbmRSZXBsYWNlZElubGluZUxl
dmVsQm94KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IG1hcmdpbkJveExvZ2lj
YWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBlbmRJbmxpbmVCb3hTdGFydChjb25zdCBJbmxpbmVJdGVt
JiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOwotICAgIHZvaWQgYXBwZW5kSW5saW5l
Qm94RW5kKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7
Ci0gICAgdm9pZCBhcHBlbmRMaW5lQnJlYWsoY29uc3QgSW5saW5lSXRlbSYpOwotICAgIHZvaWQg
YXBwZW5kV29yZEJyZWFrT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5lSXRlbSYpOwotCi0gICAgdm9p
ZCByZW1vdmVUcmFpbGluZ1RyaW1tYWJsZUNvbnRlbnQoKTsKLSAgICB2b2lkIHZpc3VhbGx5Q29s
bGFwc2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9u
dGFsU3BhY2UpOwotCi0gICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRp
bmdDb250ZXh0KCkgY29uc3Q7Ci0KLSAgICBzdHJ1Y3QgVHJpbW1hYmxlVHJhaWxpbmdDb250ZW50
IHsKLSAgICAgICAgVHJpbW1hYmxlVHJhaWxpbmdDb250ZW50KFJ1bkxpc3QmKTsKLQotICAgICAg
ICB2b2lkIGFkZEZ1bGx5VHJpbW1hYmxlQ29udGVudChzaXplX3QgcnVuSW5kZXgsIElubGluZUxh
eW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpOwotICAgICAgICB2b2lkIGFkZFBhcnRpYWxseVRyaW1t
YWJsZUNvbnRlbnQoc2l6ZV90IHJ1bkluZGV4LCBJbmxpbmVMYXlvdXRVbml0IHRyaW1tYWJsZVdp
ZHRoKTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCByZW1vdmUoKTsKLSAgICAgICAgSW5saW5l
TGF5b3V0VW5pdCByZW1vdmVQYXJ0aWFsbHlUcmltbWFibGVDb250ZW50KCk7Ci0KLSAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fZnVsbHlUcmltbWFibGVX
aWR0aCArIG1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGg7IH0KLSAgICAgICAgYm9vbCBpc0VtcHR5
KCkgY29uc3QgeyByZXR1cm4gIW1fZmlyc3RUcmltbWFibGVSdW5JbmRleC5oYXNWYWx1ZSgpOyB9
Ci0gICAgICAgIGJvb2wgaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxlKCkgY29uc3QgeyByZXR1
cm4gbV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQ7IH0KLSAgICAgICAgYm9vbCBpc1RyYWlsaW5n
UnVuUGFydGlhbGx5VHJpbW1hYmxlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJ0aWFsbHlUcmltbWFi
bGVXaWR0aDsgfQotCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLQotICAgIHByaXZhdGU6Ci0gICAg
ICAgIFJ1bkxpc3QmIG1fcnVuczsKLSAgICAgICAgT3B0aW9uYWw8c2l6ZV90PiBtX2ZpcnN0VHJp
bW1hYmxlUnVuSW5kZXg7Ci0gICAgICAgIGJvb2wgbV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQg
eyBmYWxzZSB9OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fZnVsbHlUcmltbWFibGVXaWR0
aCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX3BhcnRpYWxseVRyaW1tYWJsZVdp
ZHRoIHsgMCB9OwotICAgIH07Ci0KLSAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYg
bV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKLSAgICBSdW5MaXN0IG1fcnVuczsKLSAgICBUcmlt
bWFibGVUcmFpbGluZ0NvbnRlbnQgbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQ7Ci0gICAgSW5s
aW5lTGF5b3V0VW5pdCBtX2NvbnRlbnRMb2dpY2FsV2lkdGggeyAwIH07Ci0gICAgc2l6ZV90IG1f
bm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50IHsgMCB9OwotICAgIE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+IG1fdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggeyAwIH07Ci19OwotCi1pbmxp
bmUgdm9pZCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OnJlc2V0KCkKLXsKLSAgICBt
X2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCA9IGZhbHNlOwotICAgIG1fZmlyc3RUcmltbWFibGVS
dW5JbmRleCA9IHsgfTsKLSAgICBtX2Z1bGx5VHJpbW1hYmxlV2lkdGggPSB7IH07Ci0gICAgbV9w
YXJ0aWFsbHlUcmltbWFibGVXaWR0aCA9IHsgfTsKLX0KLQotaW5saW5lIExpbmU6OlJ1bjo6VHJh
aWxpbmdXaGl0ZXNwYWNlIExpbmU6OlJ1bjo6dHJhaWxpbmdXaGl0ZXNwYWNlVHlwZShjb25zdCBJ
bmxpbmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0ZW0pIGNvbnN0Ci17Ci0gICAgaWYgKCFpbmxpbmVU
ZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKLSAgICAgICAgcmV0dXJuIFRyYWlsaW5nV2hpdGVzcGFj
ZTo6Tm9uZTsKLSAgICBpZiAoSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5k
VGFicyhpbmxpbmVUZXh0SXRlbSkpCi0gICAgICAgIHJldHVybiBUcmFpbGluZ1doaXRlc3BhY2U6
Ok5vdENvbGxhcHNpYmxlOwotICAgIGlmIChpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSA9PSAxKQot
ICAgICAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzaWJsZTsKLSAgICByZXR1
cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQ7Ci19Ci0KLWlubGluZSB2b2lkIExpbmU6
OlJ1bjo6c2V0TmVlZHNIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBoeXBoZW5Mb2dpY2FsV2lkdGgp
Ci17Ci0gICAgQVNTRVJUKG1fdGV4dENvbnRlbnQpOwotICAgIG1fdGV4dENvbnRlbnQtPnNldE5l
ZWRzSHlwaGVuKCk7Ci0gICAgbV9sb2dpY2FsV2lkdGggKz0gaHlwaGVuTG9naWNhbFdpZHRoOwot
fQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxp
bmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lu
bGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IGVkMjEzYWUwMWNhYTM5NWE3OTg0MjExOGI5OTk3MjMxZThkMjBlMjkuLjAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5jcHAKKysrIC9kZXYvbnVsbApAQCAt
MSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBt
ZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRl
ICJJbmxpbmVMaW5lQm94LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKLQotI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29u
dGFpbmVyQm94LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewot
Ci1MaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6SW5saW5lTGV2ZWxCb3goY29uc3QgQm94JiBsYXlv
dXRCb3gsIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFNpemUgbG9n
aWNhbFNpemUsIFR5cGUgdHlwZSkKLSAgICA6IG1fbGF5b3V0Qm94KG1ha2VXZWFrUHRyKGxheW91
dEJveCkpCi0gICAgLCBtX2xvZ2ljYWxSZWN0KHsgfSwgbG9naWNhbExlZnQsIGxvZ2ljYWxTaXpl
LndpZHRoKCksIGxvZ2ljYWxTaXplLmhlaWdodCgpKQotICAgICwgbV90eXBlKHR5cGUpCi17Ci19
Ci0KLXZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldEJhc2VsaW5lKElubGluZUxheW91
dFVuaXQgYmFzZWxpbmUpCi17Ci0gICAgLy8gRklYTUU6IFJlbW92ZSBsZWdhY3kgcm91bmRpbmcu
Ci0gICAgbV9iYXNlbGluZSA9IHJvdW5kVG9JbnQoYmFzZWxpbmUpOwotfQotCi12b2lkIExpbmVC
b3g6OklubGluZUxldmVsQm94OjpzZXREZXNjZW50KElubGluZUxheW91dFVuaXQgZGVzY2VudCkK
LXsKLSAgICAvLyBGSVhNRTogUmVtb3ZlIGxlZ2FjeSByb3VuZGluZy4KLSAgICBtX2Rlc2NlbnQg
PSByb3VuZFRvSW50KGRlc2NlbnQpOwotfQotCi12b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94
OjpzZXRMYXlvdXRCb3VuZHMoY29uc3QgTGF5b3V0Qm91bmRzJiBsYXlvdXRCb3VuZHMpCi17Ci0g
ICAgLy8gRklYTUU6IFJlbW92ZSBsZWdhY3kgcm91bmRpbmcuCi0gICAgbV9sYXlvdXRCb3VuZHMg
PSB7IElubGluZUxheW91dFVuaXQocm91bmRUb0ludChsYXlvdXRCb3VuZHMuYXNjZW50KSksIElu
bGluZUxheW91dFVuaXQocm91bmRUb0ludChsYXlvdXRCb3VuZHMuZGVzY2VudCkpIH07Ci19Ci0K
LXZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldExvZ2ljYWxUb3AoSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsVG9wKQotewotICAgIC8vIEZJWE1FOiBSZW1vdmUgbGVnYWN5IHJvdW5kaW5n
LgotICAgIG1fbG9naWNhbFJlY3Quc2V0VG9wKHJvdW5kVG9JbnQobG9naWNhbFRvcCkpOwotfQot
Ci12b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94OjpzZXRMb2dpY2FsSGVpZ2h0KElubGluZUxh
eW91dFVuaXQgbG9naWNhbEhlaWdodCkKLXsKLSAgICAvLyBGSVhNRTogUmVtb3ZlIGxlZ2FjeSBy
b3VuZGluZy4KLSAgICBtX2xvZ2ljYWxSZWN0LnNldEhlaWdodChyb3VuZFRvSW50KGxvZ2ljYWxI
ZWlnaHQpKTsKLX0KLQotdm9pZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0SGFzQ29udGVu
dCgpCi17Ci0gICAgQVNTRVJUKGlzSW5saW5lQm94KCkpOwotICAgIG1faGFzQ29udGVudCA9IHRy
dWU7Ci19Ci0KLWJvb2wgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6Omhhc0xpbmVCb3hSZWxhdGl2
ZUFsaWdubWVudCgpIGNvbnN0Ci17Ci0gICAgYXV0byB2ZXJ0aWNhbEFsaWdubWVudCA9IGxheW91
dEJveCgpLnN0eWxlKCkudmVydGljYWxBbGlnbigpOwotICAgIHJldHVybiB2ZXJ0aWNhbEFsaWdu
bWVudCA9PSBWZXJ0aWNhbEFsaWduOjpUb3AgfHwgdmVydGljYWxBbGlnbm1lbnQgPT0gVmVydGlj
YWxBbGlnbjo6Qm90dG9tOwotfQotCi1MaW5lQm94OjpMaW5lQm94KGNvbnN0IEJveCYgcm9vdExh
eW91dEJveCwgY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIGxvZ2ljYWxUb3BsZWZ0LCBJbmxpbmVM
YXlvdXRVbml0IGxpbmVMb2dpY2FsV2lkdGgsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2lj
YWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgsIHNpemVfdCBub25T
cGFubmluZ0lubGluZUxldmVsQm94Q291bnQpCi0gICAgOiBtX2xvZ2ljYWxSZWN0KGxvZ2ljYWxU
b3BsZWZ0LCBJbmxpbmVMYXlvdXRTaXplIHsgbGluZUxvZ2ljYWxXaWR0aCwgeyB9IH0pCi0gICAg
LCBtX2NvbnRlbnRMb2dpY2FsV2lkdGgoY29udGVudExvZ2ljYWxXaWR0aCkKLSAgICAsIG1fcm9v
dElubGluZUJveChyb290TGF5b3V0Qm94LCBjb250ZW50TG9naWNhbExlZnQsIElubGluZUxheW91
dFNpemUgeyBjb250ZW50TG9naWNhbFdpZHRoLCB7IH0gfSwgSW5saW5lTGV2ZWxCb3g6OlR5cGU6
OlJvb3RJbmxpbmVCb3gpCi17Ci0gICAgbV9ub25Sb290SW5saW5lTGV2ZWxCb3hMaXN0LnJlc2Vy
dmVJbml0aWFsQ2FwYWNpdHkobm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50KTsKLSAgICBt
X25vblJvb3RJbmxpbmVMZXZlbEJveE1hcC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG5vblNwYW5u
aW5nSW5saW5lTGV2ZWxCb3hDb3VudCk7Ci19Ci0KLXZvaWQgTGluZUJveDo6YWRkSW5saW5lTGV2
ZWxCb3goSW5saW5lTGV2ZWxCb3gmJiBpbmxpbmVMZXZlbEJveCkKLXsKLSAgICBtX2JveFR5cGVz
LmFkZChpbmxpbmVMZXZlbEJveC50eXBlKCkpOwotICAgIG1fbm9uUm9vdElubGluZUxldmVsQm94
TWFwLnNldCgmaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCksIG1fbm9uUm9vdElubGluZUxldmVs
Qm94TGlzdC5zaXplKCkpOwotICAgIG1fbm9uUm9vdElubGluZUxldmVsQm94TGlzdC5hcHBlbmQo
V1RGTW92ZShpbmxpbmVMZXZlbEJveCkpOwotfQotCi1JbmxpbmVSZWN0IExpbmVCb3g6OmxvZ2lj
YWxSZWN0Rm9yVGV4dFJ1bihjb25zdCBMaW5lOjpSdW4mIHJ1bikgY29uc3QKLXsKLSAgICBBU1NF
UlQocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc1NvZnRMaW5lQnJlYWsoKSk7Ci0gICAgYXV0byogcGFy
ZW50SW5saW5lQm94ID0gJmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KHJ1bi5sYXlvdXRCb3go
KS5wYXJlbnQoKSk7Ci0gICAgQVNTRVJUKHBhcmVudElubGluZUJveC0+aXNJbmxpbmVCb3goKSk7
Ci0gICAgYXV0byYgZm9udE1ldHJpY3MgPSBwYXJlbnRJbmxpbmVCb3gtPnN0eWxlKCkuZm9udE1l
dHJpY3MoKTsKLSAgICBhdXRvIHJ1bmxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxpbmVCb3gtPmxvZ2lj
YWxUb3AoKSArIHBhcmVudElubGluZUJveC0+YmFzZWxpbmUoKSAtIGZvbnRNZXRyaWNzLmFzY2Vu
dCgpOwotCi0gICAgd2hpbGUgKHBhcmVudElubGluZUJveCAhPSAmbV9yb290SW5saW5lQm94ICYm
ICFwYXJlbnRJbmxpbmVCb3gtPmhhc0xpbmVCb3hSZWxhdGl2ZUFsaWdubWVudCgpKSB7Ci0gICAg
ICAgIHBhcmVudElubGluZUJveCA9ICZpbmxpbmVMZXZlbEJveEZvckxheW91dEJveChwYXJlbnRJ
bmxpbmVCb3gtPmxheW91dEJveCgpLnBhcmVudCgpKTsKLSAgICAgICAgQVNTRVJUKHBhcmVudElu
bGluZUJveC0+aXNJbmxpbmVCb3goKSk7Ci0gICAgICAgIHJ1bmxvZ2ljYWxUb3AgKz0gcGFyZW50
SW5saW5lQm94LT5sb2dpY2FsVG9wKCk7Ci0gICAgfQotICAgIElubGluZUxheW91dFVuaXQgbG9n
aWNhbEhlaWdodCA9IGZvbnRNZXRyaWNzLmhlaWdodCgpOwotICAgIHJldHVybiB7IHJ1bmxvZ2lj
YWxUb3AsIG1fcm9vdElubGluZUJveC5sb2dpY2FsTGVmdCgpICsgcnVuLmxvZ2ljYWxMZWZ0KCks
IHJ1bi5sb2dpY2FsV2lkdGgoKSwgbG9naWNhbEhlaWdodCB9OwotfQotCi1JbmxpbmVSZWN0IExp
bmVCb3g6OmxvZ2ljYWxSZWN0Rm9yTGluZUJyZWFrQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBj
b25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNMaW5lQnJlYWtCb3goKSk7Ci0gICAgcmV0
dXJuIGxvZ2ljYWxSZWN0Rm9ySW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94KTsKLX0KLQotSW5saW5l
UmVjdCBMaW5lQm94Ojpsb2dpY2FsUmVjdEZvcklubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5
b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbmxpbmVMZXZlbEJveCgp
IHx8IGxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKTsKLSAgICAvLyBJbmxpbmUgbGV2ZWwgYm94
ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZWlyIHBhcmVudCB1bmxlc3MgdGhlIHZlcnRpY2FsIGFsaWdu
bWVudCBtYWtlcyB0aGVtIHJlbGF0aXZlIHRvIHRoZSBsaW5lIGJveCAoZS5nLiB0b3AsIGJvdHRv
bSkuCi0gICAgYXV0byogaW5saW5lQm94ID0gJmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxh
eW91dEJveCk7Ci0gICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsUmVjdCA9IGlubGluZUJveC0+bG9n
aWNhbFJlY3QoKTsKLSAgICBpZiAoaW5saW5lQm94LT5oYXNMaW5lQm94UmVsYXRpdmVBbGlnbm1l
bnQoKSkKLSAgICAgICAgcmV0dXJuIGlubGluZUJveExvZ2ljYWxSZWN0OwotCi0gICAgLy8gRmFz
dCBwYXRoIGZvciBpbmxpbmUgbGV2ZWwgYm94ZXMgb24gdGhlIHJvb3QgaW5saW5lIGJveCAoZS5n
IDxkaXY+PGltZz48L2Rpdj4pLgotICAgIGlmICgmbGF5b3V0Qm94LnBhcmVudCgpID09ICZtX3Jv
b3RJbmxpbmVCb3gubGF5b3V0Qm94KCkpIHsKLSAgICAgICAgaW5saW5lQm94TG9naWNhbFJlY3Qu
bW92ZVZlcnRpY2FsbHkobV9yb290SW5saW5lQm94LmxvZ2ljYWxUb3AoKSk7Ci0gICAgICAgIHJl
dHVybiBpbmxpbmVCb3hMb2dpY2FsUmVjdDsKLSAgICB9Ci0KLSAgICAvLyBlLmcgPGRpdj48c3Bh
bj48aW1nPjwvc3Bhbj48L2Rpdj4KLSAgICBhdXRvIGlubGluZUJveEFic29sdXRlbG9naWNhbFRv
cCA9IGlubGluZUJveExvZ2ljYWxSZWN0LnRvcCgpOwotICAgIHdoaWxlIChpbmxpbmVCb3ggIT0g
Jm1fcm9vdElubGluZUJveCAmJiAhaW5saW5lQm94LT5oYXNMaW5lQm94UmVsYXRpdmVBbGlnbm1l
bnQoKSkgewotICAgICAgICBpbmxpbmVCb3ggPSAmaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3go
aW5saW5lQm94LT5sYXlvdXRCb3goKS5wYXJlbnQoKSk7Ci0gICAgICAgIEFTU0VSVChpbmxpbmVC
b3gtPmlzSW5saW5lQm94KCkpOwotICAgICAgICBpbmxpbmVCb3hBYnNvbHV0ZWxvZ2ljYWxUb3Ag
Kz0gaW5saW5lQm94LT5sb2dpY2FsVG9wKCk7Ci0gICAgfQotICAgIHJldHVybiBJbmxpbmVSZWN0
IHsgaW5saW5lQm94QWJzb2x1dGVsb2dpY2FsVG9wLCBpbmxpbmVCb3hMb2dpY2FsUmVjdC5sZWZ0
KCksIGlubGluZUJveExvZ2ljYWxSZWN0LndpZHRoKCksIGlubGluZUJveExvZ2ljYWxSZWN0Lmhl
aWdodCgpIH07Ci19Ci0KLUlubGluZVJlY3QgTGluZUJveDo6bG9naWNhbEJvcmRlckJveEZvckF0
b21pY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBCb3hHZW9tZXRy
eSYgYm94R2VvbWV0cnkpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0F0b21pY0lu
bGluZUxldmVsQm94KCkpOwotICAgIGF1dG8gbG9naWNhbFJlY3QgPSBsb2dpY2FsUmVjdEZvcklu
bGluZUxldmVsQm94KGxheW91dEJveCk7Ci0gICAgLy8gSW5saW5lIGxldmVsIGJveGVzIHVzZSB0
aGVpciBtYXJnaW4gYm94IGZvciB2ZXJ0aWNhbCBhbGlnbm1lbnQuIExldCdzIGNvdmVydCB0aGVt
IHRvIGJvcmRlciBib3hlcy4KLSAgICBsb2dpY2FsUmVjdC5tb3ZlVmVydGljYWxseShib3hHZW9t
ZXRyeS5tYXJnaW5CZWZvcmUoKSk7Ci0gICAgYXV0byB2ZXJ0aWNhbE1hcmdpbiA9IGJveEdlb21l
dHJ5Lm1hcmdpbkJlZm9yZSgpICsgYm94R2VvbWV0cnkubWFyZ2luQWZ0ZXIoKTsKLSAgICBsb2dp
Y2FsUmVjdC5leHBhbmRWZXJ0aWNhbGx5KC12ZXJ0aWNhbE1hcmdpbik7Ci0gICAgcmV0dXJuIGxv
Z2ljYWxSZWN0OwotfQotCi1JbmxpbmVSZWN0IExpbmVCb3g6OmxvZ2ljYWxCb3JkZXJCb3hGb3JJ
bmxpbmVCb3goY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEJveEdlb21ldHJ5JiBib3hHZW9t
ZXRyeSkgY29uc3QKLXsKLSAgICBhdXRvIGxvZ2ljYWxSZWN0ID0gbG9naWNhbFJlY3RGb3JJbmxp
bmVMZXZlbEJveChsYXlvdXRCb3gpOwotICAgIC8vIFRoaXMgbG9naWNhbCByZWN0IGlzIGFzIHRh
bGwgYXMgdGhlICJ0ZXh0IiBjb250ZW50IGlzLiBMZXQncyBhZGp1c3Qgd2l0aCB2ZXJ0aWNhbCBi
b3JkZXIgYW5kIHBhZGRpbmcuCi0gICAgYXV0byB2ZXJ0aWNhbEJvcmRlckFuZFBhZGRpbmcgPSBi
b3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgYm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5n
KCkudmFsdWVPcigwX2x1KTsKLSAgICBsb2dpY2FsUmVjdC5leHBhbmRWZXJ0aWNhbGx5KHZlcnRp
Y2FsQm9yZGVyQW5kUGFkZGluZyk7Ci0gICAgbG9naWNhbFJlY3QubW92ZVZlcnRpY2FsbHkoLShi
b3hHZW9tZXRyeS5ib3JkZXJUb3AoKSArIGJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9y
KDBfbHUpKSk7Ci0gICAgcmV0dXJuIGxvZ2ljYWxSZWN0OwotfQotCi19IC8vIG5hbWVzcGFjZSBM
YXlvdXQKLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94LmggYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94LmgKZGVsZXRl
ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MmU5NjYzODM4ZWQzMmE4ZGRiMTliNWZlYWQyNDY5
Nzk5ZjFjMTAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5oCisr
KyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
Ci0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
LSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UK
LQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiSW5s
aW5lTGluZS5oIgotI2luY2x1ZGUgIklubGluZVJlY3QuaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFs
bG9jSW5saW5lcy5oPgotI2luY2x1ZGUgPHd0Zi9VbmlxdWVSZWYuaD4KLSNpbmNsdWRlIDx3dGYv
V2Vha1B0ci5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQot
Y2xhc3MgQm94R2VvbWV0cnk7Ci1jbGFzcyBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKLWNsYXNz
IExpbmVCb3hCdWlsZGVyOwotc3RydWN0IFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudDsKLQot
Ly8gICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX18gTGluZSBCb3gKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAtLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAotLy8gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0gUm9vdCBJbmxpbmUg
Qm94Ci0vLyB8fCAgIF9fX19fICAgIF9fXyAgICAgIF9fXyAgICAgICAgICB8ICAgICAgICAgICAg
ICAgICAgICB8Ci0vLyB8fCAgfCAgICAgICAgLyAgIFwgICAgLyAgIFwgICAgICAgICB8ICBJbmxp
bmUgTGV2ZWwgQm94ICB8Ci0vLyB8fCAgfF9fX19fICB8ICAgICB8ICB8ICAgICB8ICAgICAgICB8
ICAgICAgICAgICAgICAgICAgICB8ICAgIGFzY2VudAotLy8gfHwgIHwgICAgICAgfCAgICAgfCAg
fCAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAotLy8gfHxfX3xfX19fX19fX1xf
X18vX19fX1xfX18vX19fX19fX19ffF9fX19fX19fX19fX19fX19fX19ffF9fX19fX18gYWxpZ25t
ZW50X2Jhc2VsaW5lCi0vLyB8fAotLy8gfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW50Ci0vLyB8fF9fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotLy8gfF9fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K
LS8vIFRoZSByZXN1bHRpbmcgcmVjdGFuZ3VsYXIgYXJlYSB0aGF0IGNvbnRhaW5zIHRoZSBib3hl
cyB0aGF0IGZvcm0gYSBzaW5nbGUgbGluZSBvZiBpbmxpbmUtbGV2ZWwgY29udGVudCBpcyBjYWxs
ZWQgYSBsaW5lIGJveC4KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI21v
ZGVsCi1jbGFzcyBMaW5lQm94IHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1Ymxp
YzoKLSAgICBzdHJ1Y3QgSW5saW5lTGV2ZWxCb3ggewotICAgIHB1YmxpYzoKLSAgICAgICAgc3Rh
dGljIExpbmVCb3g6OklubGluZUxldmVsQm94IGNyZWF0ZUlubGluZUJveChjb25zdCBCb3gmLCBJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0
aCk7Ci0gICAgICAgIHN0YXRpYyBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBjcmVhdGVBdG9taWNJ
bmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJ
bmxpbmVMYXlvdXRTaXplKTsKLSAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGluZUxldmVsQm94
IGNyZWF0ZUxpbmVCcmVha0JveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxM
ZWZ0KTsKLSAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGluZUxldmVsQm94IGNyZWF0ZUdlbmVy
aWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0
KTsKLQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKCkgY29uc3QgeyByZXR1cm4g
bV9iYXNlbGluZTsgfQotICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBkZXNjZW50
KCkgY29uc3QgeyByZXR1cm4gbV9kZXNjZW50OyB9Ci0gICAgICAgIC8vIFNlZSBodHRwczovL3d3
dy53My5vcmcvVFIvY3NzLWlubGluZS0zLyNsYXlvdXQtYm91bmRzCi0gICAgICAgIHN0cnVjdCBM
YXlvdXRCb3VuZHMgewotICAgICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQoKSBjb25z
dCB7IHJldHVybiBhc2NlbnQgKyBkZXNjZW50OyB9Ci0gICAgICAgICAgICBib29sIG9wZXJhdG9y
PT0oY29uc3QgTGF5b3V0Qm91bmRzJiBvdGhlcikgY29uc3QgeyByZXR1cm4gYXNjZW50ID09IG90
aGVyLmFzY2VudCAmJiBkZXNjZW50ID09IG90aGVyLmRlc2NlbnQ7IH0KLQotICAgICAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCBhc2NlbnQgeyAwIH07Ci0gICAgICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IGRlc2NlbnQgeyAwIH07Ci0gICAgICAgIH07Ci0gICAgICAgIExheW91dEJvdW5kcyBsYXlv
dXRCb3VuZHMoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJvdW5kczsgfQotCi0gICAgICAgIGJv
b2wgaGFzQ29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzQ29udGVudDsgfQotICAgICAgICB2
b2lkIHNldEhhc0NvbnRlbnQoKTsKLQotICAgICAgICBWZXJ0aWNhbEFsaWduIHZlcnRpY2FsQWxp
Z24oKSBjb25zdCB7IHJldHVybiBsYXlvdXRCb3goKS5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKTsg
fQotICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91
dEJveDsgfQotICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUoKSBjb25zdCB7IHJldHVy
biBtX2xheW91dEJveC0+c3R5bGUoKTsgfQotCi0gICAgICAgIGJvb2wgaXNJbmxpbmVCb3goKSBj
b25zdCB7IHJldHVybiBtX3R5cGUgPT0gVHlwZTo6SW5saW5lQm94IHx8IG1fdHlwZSA9PSBUeXBl
OjpSb290SW5saW5lQm94OyB9Ci0gICAgICAgIGJvb2wgaXNSb290SW5saW5lQm94KCkgY29uc3Qg
eyByZXR1cm4gbV90eXBlID09IFR5cGU6OlJvb3RJbmxpbmVCb3g7IH0KLSAgICAgICAgYm9vbCBp
c0F0b21pY0lubGluZUxldmVsQm94KCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IFR5cGU6OkF0
b21pY0lubGluZUxldmVsQm94OyB9Ci0gICAgICAgIGJvb2wgaXNMaW5lQnJlYWtCb3goKSBjb25z
dCB7IHJldHVybiBtX3R5cGUgPT0gVHlwZTo6TGluZUJyZWFrQm94OyB9Ci0gICAgICAgIGJvb2wg
aGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkgY29uc3Q7Ci0KLSAgICAgICAgZW51bSBjbGFz
cyBUeXBlIDogdWludDhfdCB7Ci0gICAgICAgICAgICBJbmxpbmVCb3ggICAgICAgICAgICAgPSAx
IDw8IDAsCi0gICAgICAgICAgICBSb290SW5saW5lQm94ICAgICAgICAgPSAxIDw8IDEsCi0gICAg
ICAgICAgICBBdG9taWNJbmxpbmVMZXZlbEJveCAgPSAxIDw8IDIsCi0gICAgICAgICAgICBMaW5l
QnJlYWtCb3ggICAgICAgICAgPSAxIDw8IDMsCi0gICAgICAgICAgICBHZW5lcmljSW5saW5lTGV2
ZWxCb3ggPSAxIDw8IDQKLSAgICAgICAgfTsKLSAgICAgICAgVHlwZSB0eXBlKCkgY29uc3QgeyBy
ZXR1cm4gbV90eXBlOyB9Ci0KLSAgICAgICAgSW5saW5lTGV2ZWxCb3goY29uc3QgQm94JiwgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0U2l6ZSwgVHlwZSk7Ci0gICAg
ICAgIElubGluZUxldmVsQm94KCkgPSBkZWZhdWx0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAg
ZnJpZW5kIHN0cnVjdCBTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ7Ci0gICAgICAgIGZyaWVu
ZCBjbGFzcyBMaW5lQm94QnVpbGRlcjsKLSAgICAgICAgZnJpZW5kIGNsYXNzIExpbmVCb3g7Ci0K
LSAgICAgICAgY29uc3QgSW5saW5lUmVjdCYgbG9naWNhbFJlY3QoKSBjb25zdCB7IHJldHVybiBt
X2xvZ2ljYWxSZWN0OyB9Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFRvcCgpIGNv
bnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3QudG9wKCk7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsQm90dG9tKCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC5ib3R0b20o
KTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KCkgY29uc3QgeyByZXR1
cm4gbV9sb2dpY2FsUmVjdC5sZWZ0KCk7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dp
Y2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0LndpZHRoKCk7IH0KLSAgICAg
ICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dp
Y2FsUmVjdC5oZWlnaHQoKTsgfQotCi0gICAgICAgIHZvaWQgc2V0TG9naWNhbFdpZHRoKElubGlu
ZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKSB7IG1fbG9naWNhbFJlY3Quc2V0V2lkdGgobG9naWNh
bFdpZHRoKTsgfQotICAgICAgICB2b2lkIHNldExvZ2ljYWxIZWlnaHQoSW5saW5lTGF5b3V0VW5p
dCk7Ci0gICAgICAgIHZvaWQgc2V0TG9naWNhbFRvcChJbmxpbmVMYXlvdXRVbml0KTsKLSAgICAg
ICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0KTsKLSAgICAgICAgdm9pZCBzZXRE
ZXNjZW50KElubGluZUxheW91dFVuaXQpOwotICAgICAgICB2b2lkIHNldExheW91dEJvdW5kcyhj
b25zdCBMYXlvdXRCb3VuZHMmKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFdlYWtQdHI8Y29u
c3QgQm94PiBtX2xheW91dEJveDsKLSAgICAgICAgLy8gVGhpcyBpcyB0aGUgY29tYmluYXRpb24g
b2YgbWFyZ2luIGFuZCBib3JkZXIgYm94ZXMuIElubGluZSBsZXZlbCBib3hlcyBhcmUgdmVydGlj
YWxseSBhbGlnbmVkIHVzaW5nIHRoZWlyIG1hcmdpbiBib3hlcy4KLSAgICAgICAgSW5saW5lUmVj
dCBtX2xvZ2ljYWxSZWN0OwotICAgICAgICBMYXlvdXRCb3VuZHMgbV9sYXlvdXRCb3VuZHM7Ci0g
ICAgICAgIElubGluZUxheW91dFVuaXQgbV9iYXNlbGluZSB7IDAgfTsKLSAgICAgICAgT3B0aW9u
YWw8SW5saW5lTGF5b3V0VW5pdD4gbV9kZXNjZW50OwotICAgICAgICBib29sIG1faGFzQ29udGVu
dCB7IGZhbHNlIH07Ci0gICAgICAgIFR5cGUgbV90eXBlIHsgVHlwZTo6SW5saW5lQm94IH07Ci0g
ICAgfTsKLQotICAgIExpbmVCb3goY29uc3QgQm94JiByb290TGF5b3V0Qm94LCBjb25zdCBJbmxp
bmVMYXlvdXRQb2ludCYgbG9naWNhbFRvcExlZnQsIElubGluZUxheW91dFVuaXQgY29udGVudExv
Z2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxpbmVMb2dpY2FsV2lkdGgsIElubGluZUxheW91
dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCwgc2l6ZV90IG5vblNwYW5uaW5nSW5saW5lTGV2ZWxC
b3hDb3VudCk7Ci0KLSAgICBjb25zdCBJbmxpbmVSZWN0JiBsb2dpY2FsUmVjdCgpIGNvbnN0IHsg
cmV0dXJuIG1fbG9naWNhbFJlY3Q7IH0KLSAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0
aCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxTaXplKCkud2lkdGgoKTsgfQotICAgIElubGluZUxh
eW91dFVuaXQgbG9naWNhbEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxTaXplKCkuaGVp
Z2h0KCk7IH0KLSAgICBJbmxpbmVMYXlvdXRQb2ludCBsb2dpY2FsVG9wTGVmdCgpIGNvbnN0IHsg
cmV0dXJuIGxvZ2ljYWxSZWN0KCkudG9wTGVmdCgpOyB9Ci0gICAgSW5saW5lTGF5b3V0U2l6ZSBs
b2dpY2FsU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkuc2l6ZSgpOyB9Ci0gICAg
SW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9j
b250ZW50TG9naWNhbFdpZHRoOyB9Ci0KLSAgICAvLyBOb3RlIHRoYXQgdGhlIGxpbmUgY2FuIGhh
dmUgbWFueSBpbmxpbmUgYm94ZXMgYW5kIGJlICJlbXB0eSIgdGhlIHNhbWUgdGltZSBlLmcuIDxk
aXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2Rpdj4KLSAgICBib29sIGhhc0NvbnRlbnQo
KSBjb25zdCB7IHJldHVybiBtX2hhc0NvbnRlbnQ7IH0KLSAgICBib29sIGhhc0lubGluZUJveCgp
IGNvbnN0IHsgcmV0dXJuIG1fYm94VHlwZXMuY29udGFpbnMoSW5saW5lTGV2ZWxCb3g6OlR5cGU6
OklubGluZUJveCk7IH0KLSAgICBib29sIGhhc05vbklubGluZUJveCgpIGNvbnN0IHsgcmV0dXJu
IG1fYm94VHlwZXMuY29udGFpbnNBbnkoeyBJbmxpbmVMZXZlbEJveDo6VHlwZTo6QXRvbWljSW5s
aW5lTGV2ZWxCb3gsIElubGluZUxldmVsQm94OjpUeXBlOjpMaW5lQnJlYWtCb3gsIElubGluZUxl
dmVsQm94OjpUeXBlOjpHZW5lcmljSW5saW5lTGV2ZWxCb3ggfSk7IH0KLSAgICBib29sIGhhc0F0
b21pY0lubGluZUxldmVsQm94KCkgY29uc3QgeyByZXR1cm4gbV9ib3hUeXBlcy5jb250YWlucyhJ
bmxpbmVMZXZlbEJveDo6VHlwZTo6QXRvbWljSW5saW5lTGV2ZWxCb3gpOyB9Ci0KLSAgICBjb25z
dCBJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3goY29uc3QgQm94JiBs
YXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8TGluZUJveCY+KCp0aGlzKS5pbmxp
bmVMZXZlbEJveEZvckxheW91dEJveChsYXlvdXRCb3gpOyB9Ci0KLSAgICBJbmxpbmVSZWN0IGxv
Z2ljYWxSZWN0Rm9yVGV4dFJ1bihjb25zdCBMaW5lOjpSdW4mKSBjb25zdDsKLSAgICBJbmxpbmVS
ZWN0IGxvZ2ljYWxSZWN0Rm9yTGluZUJyZWFrQm94KGNvbnN0IEJveCYpIGNvbnN0OwotICAgIElu
bGluZVJlY3QgbG9naWNhbFJlY3RGb3JSb290SW5saW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV9y
b290SW5saW5lQm94LmxvZ2ljYWxSZWN0KCk7IH0KLSAgICBJbmxpbmVSZWN0IGxvZ2ljYWxCb3Jk
ZXJCb3hGb3JBdG9taWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmLCBjb25zdCBCb3hHZW9tZXRy
eSYpIGNvbnN0OwotICAgIElubGluZVJlY3QgbG9naWNhbEJvcmRlckJveEZvcklubGluZUJveChj
b25zdCBCb3gmLCBjb25zdCBCb3hHZW9tZXRyeSYpIGNvbnN0OwotCi0gICAgY29uc3QgSW5saW5l
TGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX3Jvb3RJbmxpbmVCb3g7
IH0KLSAgICB1c2luZyBJbmxpbmVMZXZlbEJveExpc3QgPSBWZWN0b3I8SW5saW5lTGV2ZWxCb3g+
OwotICAgIGNvbnN0IElubGluZUxldmVsQm94TGlzdCYgbm9uUm9vdElubGluZUxldmVsQm94ZXMo
KSBjb25zdCB7IHJldHVybiBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Q7IH0KLQotICAgIElu
bGluZUxheW91dFVuaXQgYWxpZ25tZW50QmFzZWxpbmUoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RJ
bmxpbmVCb3gubG9naWNhbFRvcCgpICsgbV9yb290SW5saW5lQm94LmJhc2VsaW5lKCk7IH0KLQot
cHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgTGluZUJveEJ1aWxkZXI7Ci0KLSAgICB2b2lkIHNl
dExvZ2ljYWxIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KSB7IG1fbG9naWNh
bFJlY3Quc2V0SGVpZ2h0KGxvZ2ljYWxIZWlnaHQpOyB9Ci0KLSAgICB2b2lkIGFkZElubGluZUxl
dmVsQm94KElubGluZUxldmVsQm94JiYpOwotICAgIElubGluZUxldmVsQm94TGlzdCYgbm9uUm9v
dElubGluZUxldmVsQm94ZXMoKSB7IHJldHVybiBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Q7
IH0KLQotICAgIElubGluZUxldmVsQm94JiByb290SW5saW5lQm94KCkgeyByZXR1cm4gbV9yb290
SW5saW5lQm94OyB9Ci0KLSAgICBJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3hGb3JMYXlv
dXRCb3goY29uc3QgQm94JiBsYXlvdXRCb3gpIHsgcmV0dXJuICZsYXlvdXRCb3ggPT0gJm1fcm9v
dElubGluZUJveC5sYXlvdXRCb3goKSA/IG1fcm9vdElubGluZUJveCA6IG1fbm9uUm9vdElubGlu
ZUxldmVsQm94TGlzdFttX25vblJvb3RJbmxpbmVMZXZlbEJveE1hcC5nZXQoJmxheW91dEJveCld
OyB9Ci0gICAgSW5saW5lUmVjdCBsb2dpY2FsUmVjdEZvcklubGluZUxldmVsQm94KGNvbnN0IEJv
eCYgbGF5b3V0Qm94KSBjb25zdDsKLQotICAgIHZvaWQgc2V0SGFzQ29udGVudChib29sIGhhc0Nv
bnRlbnQpIHsgbV9oYXNDb250ZW50ID0gaGFzQ29udGVudDsgfQotCi1wcml2YXRlOgotICAgIElu
bGluZVJlY3QgbV9sb2dpY2FsUmVjdDsKLSAgICBJbmxpbmVMYXlvdXRVbml0IG1fY29udGVudExv
Z2ljYWxXaWR0aCB7IDAgfTsKLSAgICBib29sIG1faGFzQ29udGVudCB7IGZhbHNlIH07Ci0gICAg
T3B0aW9uU2V0PElubGluZUxldmVsQm94OjpUeXBlPiBtX2JveFR5cGVzOwotCi0gICAgSW5saW5l
TGV2ZWxCb3ggbV9yb290SW5saW5lQm94OwotICAgIElubGluZUxldmVsQm94TGlzdCBtX25vblJv
b3RJbmxpbmVMZXZlbEJveExpc3Q7Ci0KLSAgICBIYXNoTWFwPGNvbnN0IEJveCosIHNpemVfdD4g
bV9ub25Sb290SW5saW5lTGV2ZWxCb3hNYXA7Ci19OwotCi1pbmxpbmUgTGluZUJveDo6SW5saW5l
TGV2ZWxCb3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUF0b21pY0lubGluZUxldmVs
Qm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJ
bmxpbmVMYXlvdXRTaXplIGxvZ2ljYWxTaXplKQotewotICAgIHJldHVybiBMaW5lQm94OjpJbmxp
bmVMZXZlbEJveCB7IGxheW91dEJveCwgbG9naWNhbExlZnQsIGxvZ2ljYWxTaXplLCBUeXBlOjpB
dG9taWNJbmxpbmVMZXZlbEJveCB9OwotfQotCi1pbmxpbmUgTGluZUJveDo6SW5saW5lTGV2ZWxC
b3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUlubGluZUJveChjb25zdCBCb3gmIGxh
eW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBs
b2dpY2FsV2lkdGgpCi17Ci0gICAgcmV0dXJuIExpbmVCb3g6OklubGluZUxldmVsQm94IHsgbGF5
b3V0Qm94LCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0U2l6ZSB7IGxvZ2ljYWxXaWR0aCwgeyB9
IH0sIFR5cGU6OklubGluZUJveCB9OwotfQotCi1pbmxpbmUgTGluZUJveDo6SW5saW5lTGV2ZWxC
b3ggTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OmNyZWF0ZUxpbmVCcmVha0JveChjb25zdCBCb3gm
IGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCkKLXsKLSAgICByZXR1cm4g
TGluZUJveDo6SW5saW5lTGV2ZWxCb3ggeyBsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCBJbmxpbmVM
YXlvdXRTaXplIHsgfSwgVHlwZTo6TGluZUJyZWFrQm94IH07Ci19Ci0KLWlubGluZSBMaW5lQm94
OjpJbmxpbmVMZXZlbEJveCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlR2VuZXJpY0lu
bGluZUxldmVsQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxMZWZ0KQotewotICAgIHJldHVybiBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCB7IGxheW91dEJv
eCwgbG9naWNhbExlZnQsIElubGluZUxheW91dFNpemUgeyB9LCBUeXBlOjpHZW5lcmljSW5saW5l
TGV2ZWxCb3ggfTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCdWlsZGVyLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCdWlsZGVyLmNwcApk
ZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2MjZlYTBlZTVhNjNhNGE5NjJiMTU1Y2U2
MTA2NTMwZmNlMjJmMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVp
bGRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNp
bmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJJbmxpbmVMaW5lQnVpbGRlci5oIgotCi0jaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGbG9hdGluZ0Nv
bnRleHQuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUg
IkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAi
TGF5b3V0U3RhdGUuaCIKLSNpbmNsdWRlICJUZXh0VXRpbC5oIgotI2luY2x1ZGUgPHd0Zi91bmlj
b2RlL0NoYXJhY3Rlck5hbWVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1zdGF0aWMgaW5saW5lIGJvb2wgZW5kc1dpdGhTb2Z0V3JhcE9wcG9ydHVuaXR5
KGNvbnN0IElubGluZVRleHRJdGVtJiBjdXJyZW50VGV4dEl0ZW0sIGNvbnN0IElubGluZVRleHRJ
dGVtJiBuZXh0SW5saW5lVGV4dEl0ZW0pCi17Ci0gICAgQVNTRVJUKCFuZXh0SW5saW5lVGV4dEl0
ZW0uaXNXaGl0ZXNwYWNlKCkpOwotICAgIC8vIFdlIGFyZSBhdCB0aGUgcG9zaXRpb24gYWZ0ZXIg
YSB3aGl0ZXNwYWNlLgotICAgIGlmIChjdXJyZW50VGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpCi0g
ICAgICAgIHJldHVybiB0cnVlOwotICAgIC8vIFdoZW4gYm90aCB0aGVzZSBub24td2hpdGVzcGFj
ZSBydW5zIGJlbG9uZyB0byB0aGUgc2FtZSBsYXlvdXQgYm94LCBpdCdzIGd1YXJhbnRlZWQgdGhh
dAotICAgIC8vIHRoZXkgYXJlIHNwbGl0IGF0IGEgc29mdCBicmVha2luZyBvcHBvcnR1bml0eS4g
U2VlIElubGluZVRleHRJdGVtOjptb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24uCi0gICAgaWYg
KCZjdXJyZW50VGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpID09ICZuZXh0SW5saW5lVGV4dEl0ZW0u
aW5saW5lVGV4dEJveCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAvLyBOb3cgd2UgbmVl
ZCB0byBjb2xsZWN0IGF0IGxlYXN0IDMgYWRqYWNlbnQgY2hhcmFjdGVycyB0byBiZSBhYmxlIHRv
IG1ha2UgYSBkZWNpc2lvbiB3aGV0aGVyIHRoZSBwcmV2aW91cyB0ZXh0IGl0ZW0gZW5kcyB3aXRo
IGJyZWFraW5nIG9wcG9ydHVuaXR5LgotICAgIC8vIFtleC1dW2FtcGxlXSA8LSBzZWNvbmQgdG8g
bGFzdFt4XSBsYXN0Wy1dIGN1cnJlbnRbYV0KLSAgICAvLyBXZSBuZWVkIGF0IGxlYXN0IDEgY2hh
cmFjdGVyIGluIHRoZSBjdXJyZW50IGlubGluZSB0ZXh0IGl0ZW0gYW5kIDIgbW9yZSBmcm9tIHBy
ZXZpb3VzIGlubGluZSBpdGVtcy4KLSAgICBhdXRvIHByZXZpb3VzQ29udGVudCA9IGN1cnJlbnRU
ZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpOwotICAgIGF1dG8gbGluZUJyZWFrSXRl
cmF0b3IgPSBMYXp5TGluZUJyZWFrSXRlcmF0b3IgeyBuZXh0SW5saW5lVGV4dEl0ZW0uaW5saW5l
VGV4dEJveCgpLmNvbnRlbnQoKSB9OwotICAgIGF1dG8gcHJldmlvdXNDb250ZW50TGVuZ3RoID0g
cHJldmlvdXNDb250ZW50Lmxlbmd0aCgpOwotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgbG9vayBp
bnRvIHRoZSBlbnRpcmUgdW5jb21taXR0ZWQgY29udGVudCBmb3IgbW9yZSB0ZXh0IGNvbnRleHQu
Ci0gICAgVUNoYXIgbGFzdENoYXJhY3RlciA9IHByZXZpb3VzQ29udGVudExlbmd0aCA/IHByZXZp
b3VzQ29udGVudFtwcmV2aW91c0NvbnRlbnRMZW5ndGggLSAxXSA6IDA7Ci0gICAgaWYgKGxhc3RD
aGFyYWN0ZXIgPT0gc29mdEh5cGhlbiAmJiBjdXJyZW50VGV4dEl0ZW0uc3R5bGUoKS5oeXBoZW5z
KCkgPT0gSHlwaGVuczo6Tm9uZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFVDaGFyIHNl
Y29uZFRvTGFzdENoYXJhY3RlciA9IHByZXZpb3VzQ29udGVudExlbmd0aCA+IDEgPyBwcmV2aW91
c0NvbnRlbnRbcHJldmlvdXNDb250ZW50TGVuZ3RoIC0gMl0gOiAwOwotICAgIGxpbmVCcmVha0l0
ZXJhdG9yLnNldFByaW9yQ29udGV4dChsYXN0Q2hhcmFjdGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0
ZXIpOwotICAgIC8vIE5vdyBjaGVjayBpZiB3ZSBjYW4gYnJlYWsgcmlnaHQgYXQgdGhlIGlubGlu
ZSBpdGVtIGJvdW5kYXJ5LgotICAgIC8vIFdpdGggdGhlIFtleC1hbXBsZV0sIGZpbmROZXh0QnJl
YWthYmxlUG9zaXRpb24gc2hvdWxkIHJldHVybiB0aGUgc3RhcnRQb3NpdGlvbiAoMCkuCi0gICAg
Ly8gRklYTUU6IENoZWNrIGlmIHRoZXJlJ3MgYSBtb3JlIGNvcnJlY3Qgd2F5IG9mIGZpbmRpbmcg
YnJlYWtpbmcgb3Bwb3J0dW5pdGllcy4KLSAgICByZXR1cm4gIVRleHRVdGlsOjpmaW5kTmV4dEJy
ZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCAwLCBuZXh0SW5saW5lVGV4dEl0ZW0u
c3R5bGUoKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0F0U29mdFdyYXBPcHBvcnR1bml0
eShjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5lRm9ybWF0dGluZ0NvbnRleHQs
IGNvbnN0IElubGluZUl0ZW0mIGN1cnJlbnQsIGNvbnN0IElubGluZUl0ZW0mIG5leHQpCi17Ci0g
ICAgLy8gImlzIGF0IiBzaW1wbGUgbWVhbnMgdGhhdCB0aGVyZSdzIGEgc29mdCB3cmFwIG9wcG9y
dHVuaXR5IHJpZ2h0IGFmdGVyIHRoZSBbY3VycmVudF0uCi0gICAgLy8gW3RleHRdWyBdW3RleHRd
W2lubGluZSBib3ggc3RhcnRdLi4uICg8ZGl2PnRleHQgY29udGVudDxzcGFuPi4uPC9kaXY+KQot
ICAgIC8vIHNvZnQgd3JhcCBpbmRleGVzOiAwIGFuZCAxIGRlZmluaXRlbHksIDIgZGVwZW5kcyBv
biB0aGUgY29udGVudCBhZnRlciB0aGUgW2lubGluZSBib3ggc3RhcnRdLgotCi0gICAgLy8gaHR0
cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy10ZXh0LTMvI2xpbmUtYnJlYWstZGV0YWlscwotICAg
IC8vIEZpZ3VyZSBvdXQgaWYgdGhlIG5ldyBpbmNvbWluZyBjb250ZW50IHB1dHMgdGhlIHVuY29t
bWl0dGVkIGNvbnRlbnQgb24gYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkuCi0gICAgLy8gZS5nLiBb
aW5saW5lIGJveCBzdGFydF1bcHJpb3JfY29udGludW91c19jb250ZW50XVtpbmxpbmUgYm94IGVu
ZF0gKDxzcGFuPnByaW9yX2NvbnRpbnVvdXNfY29udGVudDwvc3Bhbj4pCi0gICAgLy8gQW4gaW5j
b21pbmcgPGltZz4gYm94IHdvdWxkIGVuYWJsZSB1cyB0byBjb21taXQgdGhlICI8c3Bhbj5wcmlv
cl9jb250aW51b3VzX2NvbnRlbnQ8L3NwYW4+IiBjb250ZW50Ci0gICAgLy8gYnV0IGFuIGluY29t
aW5nIHRleHQgY29udGVudCB3b3VsZCBub3QgbmVjZXNzYXJpbHkuCi0gICAgQVNTRVJUKGN1cnJl
bnQuaXNUZXh0KCkgfHwgY3VycmVudC5pc0JveCgpIHx8IGN1cnJlbnQuaXNGbG9hdCgpKTsKLSAg
ICBBU1NFUlQobmV4dC5pc1RleHQoKSB8fCBuZXh0LmlzQm94KCkgfHwgbmV4dC5pc0Zsb2F0KCkp
OwotICAgIGlmIChjdXJyZW50LmlzVGV4dCgpICYmIG5leHQuaXNUZXh0KCkpIHsKLSAgICAgICAg
YXV0byYgY3VycmVudElubGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGN1
cnJlbnQpOwotICAgICAgICBhdXRvJiBuZXh0SW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxp
bmVUZXh0SXRlbT4obmV4dCk7Ci0gICAgICAgIGlmIChjdXJyZW50SW5saW5lVGV4dEl0ZW0uaXNX
aGl0ZXNwYWNlKCkpIHsKLSAgICAgICAgICAgIC8vIFsgXVt0ZXh0XSA6IGFmdGVyIFt3aGl0ZXNw
YWNlXSBwb3NpdGlvbiBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eS4KLSAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZXh0SW5saW5lVGV4dEl0ZW0uaXNX
aGl0ZXNwYWNlKCkpIHsKLSAgICAgICAgICAgIC8vIFt0ZXh0XVsgXSAoPHNwYW4+dGV4dDwvc3Bh
bj4gKQotICAgICAgICAgICAgLy8gd2hpdGUtc3BhY2U6IGJyZWFrLXNwYWNlczogbGluZSBicmVh
a2luZyBvcHBvcnR1bml0eSBleGlzdHMgYWZ0ZXIgZXZlcnkgcHJlc2VydmVkIHdoaXRlIHNwYWNl
IGNoYXJhY3RlciwgYnV0IG5vdCBiZWZvcmUuCi0gICAgICAgICAgICByZXR1cm4gbmV4dElubGlu
ZVRleHRJdGVtLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9IFdoaXRlU3BhY2U6OkJyZWFrU3BhY2Vz
OwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50LnN0eWxlKCkubGluZUJyZWFrKCkgPT0g
TGluZUJyZWFrOjpBbnl3aGVyZSB8fCBuZXh0LnN0eWxlKCkubGluZUJyZWFrKCkgPT0gTGluZUJy
ZWFrOjpBbnl3aGVyZSkgewotICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBzb2Z0IHdyYXAgb3Bw
b3J0dW5pdHkgYXJvdW5kIGV2ZXJ5IHR5cG9ncmFwaGljIGNoYXJhY3RlciB1bml0LCBpbmNsdWRp
bmcgYXJvdW5kIGFueSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIKLSAgICAgICAgICAgIC8vIG9yIHBy
ZXNlcnZlZCB3aGl0ZSBzcGFjZXMsIG9yIGluIHRoZSBtaWRkbGUgb2Ygd29yZHMuCi0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBCb3RoIGN1cnJlbnQgYW5k
IG5leHQgaXRlbXMgYXJlIG5vbi13aGl0ZXNwYWNlIHRleHQuCi0gICAgICAgIC8vIFt0ZXh0XVt0
ZXh0XSA6IGlzIGEgY29udGludW91cyBjb250ZW50LgotICAgICAgICAvLyBbdGV4dC1dW3RleHRd
IDogYWZ0ZXIgW2h5cGhlbl0gcG9zaXRpb24gaXMgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkuCi0g
ICAgICAgIHJldHVybiBlbmRzV2l0aFNvZnRXcmFwT3Bwb3J0dW5pdHkoY3VycmVudElubGluZVRl
eHRJdGVtLCBuZXh0SW5saW5lVGV4dEl0ZW0pOwotICAgIH0KLSAgICBpZiAoY3VycmVudC5pc0Zs
b2F0KCkgfHwgbmV4dC5pc0Zsb2F0KCkpIHsKLSAgICAgICAgLy8gV2hpbGUgZmxvYXRzIGFyZSBu
b3QgcGFydCBvZiB0aGUgaW5saW5lIGNvbnRlbnQgYW5kIHRoZXkgYXJlIG5vdCBzdXBwb3NlZCB0
byBpbnRyb2R1Y2Ugc29mdCB3cmFwIG9wcG9ydHVuaXRpZXMsCi0gICAgICAgIC8vIGUuZy4gW3Rl
eHRdW2Zsb2F0IGJveF1bZmxvYXQgYm94XVt0ZXh0XVtmbG9hdCBib3hdW3RleHRdIGlzIGVzc2Vu
dGlhbGx5IGp1c3QgW3RleHRdW3RleHRdW3RleHRdCi0gICAgICAgIC8vIGZpZ3VyaW5nIG91dCB3
aGV0aGVyIGEgZmxvYXQgKG9yIHNldCBvZiBmbG9hdHMpIHNob3VsZCBzdGF5IG9uIHRoZSBsaW5l
IG9yIG5vdCAoYW5kIGhhbmRsZSBwb3RlbnRpYWxseSBvdXQgb2Ygb3JkZXIgaW5saW5lIGl0ZW1z
KQotICAgICAgICAvLyBicmluZ3MgaW4gdW5uZWNlc3NhcnkgY29tcGxleGl0eS4KLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChjdXJyZW50LmlzQm94KCkgfHwgbmV4dC5pc0Jv
eCgpKSB7Ci0gICAgICAgIGF1dG8gaXNJbWFnZUNvbnRlbnQgPSBjdXJyZW50LmxheW91dEJveCgp
LmlzSW1hZ2UoKSB8fCBuZXh0LmxheW91dEJveCgpLmlzSW1hZ2UoKTsKLSAgICAgICAgaWYgKGlz
SW1hZ2VDb250ZW50KQotICAgICAgICAgICAgcmV0dXJuIGlubGluZUZvcm1hdHRpbmdDb250ZXh0
LnF1aXJrcygpLmhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdlKCk7Ci0gICAgICAgIC8vIFt0
ZXh0XVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF1baW5saW5lIGJveF0gKHRleHQ8
c3Bhbj48L3NwYW4+PGltZz4pIDogdGhlcmUncyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBiZXR3
ZWVuIHRoZSBbdGV4dF0gYW5kIFtpbWddLgotICAgICAgICAvLyBUaGUgbGluZSBicmVha2luZyBi
ZWhhdmlvciBvZiBhIHJlcGxhY2VkIGVsZW1lbnQgb3Igb3RoZXIgYXRvbWljIGlubGluZSBpcyBl
cXVpdmFsZW50IHRvIGFuIGlkZW9ncmFwaGljIGNoYXJhY3Rlci4KLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiB0cnVlOwot
fQotCi1zdHJ1Y3QgTGluZUNhbmRpZGF0ZSB7Ci0gICAgTGluZUNhbmRpZGF0ZShib29sIGlnbm9y
ZVRyYWlsaW5nTGV0dGVyU3BhY2luZyk7Ci0KLSAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICBzdHJ1
Y3QgSW5saW5lQ29udGVudCB7Ci0gICAgICAgIElubGluZUNvbnRlbnQoYm9vbCBpZ25vcmVUcmFp
bGluZ0xldHRlclNwYWNpbmcpOwotCi0gICAgICAgIGNvbnN0IElubGluZUNvbnRlbnRCcmVha2Vy
OjpDb250aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQoKSBjb25zdCB7IHJldHVybiBt
X2NvbnRpbnVvdXNDb250ZW50OyB9Ci0gICAgICAgIGNvbnN0IElubGluZUl0ZW0qIHRyYWlsaW5n
TGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ0xpbmVCcmVhazsgfQotICAgICAg
ICBjb25zdCBJbmxpbmVJdGVtKiB0cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5KCkgY29uc3Qg
eyByZXR1cm4gbV90cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5OyB9Ci0KLSAgICAgICAgdm9p
ZCBhcHBlbmRJbmxpbmVJdGVtKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxv
Z2ljYWxXaWR0aCk7Ci0gICAgICAgIHZvaWQgYXBwZW5kVHJhaWxpbmdMaW5lQnJlYWsoY29uc3Qg
SW5saW5lSXRlbSYgbGluZUJyZWFrSXRlbSkgeyBtX3RyYWlsaW5nTGluZUJyZWFrID0gJmxpbmVC
cmVha0l0ZW07IH0KLSAgICAgICAgdm9pZCBhcHBlbmR0cmFpbGluZ1dvcmRCcmVha09wcG9ydHVu
aXR5KGNvbnN0IElubGluZUl0ZW0mIHdvcmRCcmVha0l0ZW0pIHsgbV90cmFpbGluZ1dvcmRCcmVh
a09wcG9ydHVuaXR5ID0gJndvcmRCcmVha0l0ZW07IH0KLSAgICAgICAgdm9pZCByZXNldCgpOwot
ICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2NvbnRpbnVvdXNDb250ZW50
LnJ1bnMoKS5pc0VtcHR5KCkgJiYgIXRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSAmJiAh
dHJhaWxpbmdMaW5lQnJlYWsoKTsgfQotICAgICAgICBib29sIGhhc0lubGluZUxldmVsQm94KCkg
Y29uc3QgeyByZXR1cm4gbV9oYXNJbmxpbmVMZXZlbEJveDsgfQotCi0gICAgICAgIHZvaWQgc2V0
SGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KGJvb2wgaGFzVHJhaWxpbmdTb2Z0V3JhcE9w
cG9ydHVuaXR5KSB7IG1faGFzVHJhaWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5ID0gaGFzVHJhaWxp
bmdTb2Z0V3JhcE9wcG9ydHVuaXR5OyB9Ci0gICAgICAgIGJvb2wgaGFzVHJhaWxpbmdTb2Z0V3Jh
cE9wcG9ydHVuaXR5KCkgY29uc3QgeyByZXR1cm4gbV9oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0
dW5pdHk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgbV9pZ25vcmVUcmFpbGluZ0xl
dHRlclNwYWNpbmcgeyBmYWxzZSB9OwotCi0gICAgICAgIElubGluZUNvbnRlbnRCcmVha2VyOjpD
b250aW51b3VzQ29udGVudCBtX2NvbnRpbnVvdXNDb250ZW50OwotICAgICAgICBjb25zdCBJbmxp
bmVJdGVtKiBtX3RyYWlsaW5nTGluZUJyZWFrIHsgbnVsbHB0ciB9OwotICAgICAgICBjb25zdCBJ
bmxpbmVJdGVtKiBtX3RyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkgeyBudWxscHRyIH07Ci0g
ICAgICAgIGJvb2wgbV9oYXNJbmxpbmVMZXZlbEJveCB7IGZhbHNlIH07Ci0gICAgICAgIGJvb2wg
bV9oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkgeyBmYWxzZSB9OwotICAgIH07Ci0KLSAg
ICAvLyBDYW5kaWRhdGUgY29udGVudCBpcyBhIGNvbGxlY3Rpb24gb2YgaW5saW5lIGNvbnRlbnQg
b3IgYSBmbG9hdCBib3guCi0gICAgSW5saW5lQ29udGVudCBpbmxpbmVDb250ZW50OwotICAgIGNv
bnN0IElubGluZUl0ZW0qIGZsb2F0SXRlbSB7IG51bGxwdHIgfTsKLX07Ci0KLUxpbmVDYW5kaWRh
dGU6OkxpbmVDYW5kaWRhdGUoYm9vbCBpZ25vcmVUcmFpbGluZ0xldHRlclNwYWNpbmcpCi0gICAg
OiBpbmxpbmVDb250ZW50KGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKLXsKLX0KLQotTGlu
ZUNhbmRpZGF0ZTo6SW5saW5lQ29udGVudDo6SW5saW5lQ29udGVudChib29sIGlnbm9yZVRyYWls
aW5nTGV0dGVyU3BhY2luZykKLSAgICA6IG1faWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKGln
bm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKLXsKLX0KLQotaW5saW5lIHZvaWQgTGluZUNhbmRp
ZGF0ZTo6SW5saW5lQ29udGVudDo6YXBwZW5kSW5saW5lSXRlbShjb25zdCBJbmxpbmVJdGVtJiBp
bmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKLXsKLSAgICBBU1NFUlQo
aW5saW5lSXRlbS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlzQm94KCkgfHwgaW5saW5lSXRlbS5p
c0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKTsKLSAgICBh
dXRvIGNvbGxhcHNpYmxlV2lkdGggPSBbJl0oKSAtPiBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0
PiB7Ci0gICAgICAgIGlmICghaW5saW5lSXRlbS5pc1RleHQoKSkKLSAgICAgICAgICAgIHJldHVy
biB7IH07Ci0gICAgICAgIGF1dG8mIGlubGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4
dEl0ZW0+KGlubGluZUl0ZW0pOwotICAgICAgICBpZiAoaW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNw
YWNlKCkgJiYgIUlubGluZVRleHRJdGVtOjpzaG91bGRQcmVzZXJ2ZVNwYWNlc0FuZFRhYnMoaW5s
aW5lVGV4dEl0ZW0pKSB7Ci0gICAgICAgICAgICAvLyBGdWxseSBjb2xsYXBzaWJsZSB0cmFpbGlu
ZyBjb250ZW50LgotICAgICAgICAgICAgcmV0dXJuIGxvZ2ljYWxXaWR0aDsKLSAgICAgICAgfQot
ICAgICAgICAvLyBDaGVjayBmb3IgcGFydGlhbGx5IGNvbGxhcHNpYmxlIGNvbnRlbnQuCi0gICAg
ICAgIGlmIChtX2lnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKLSAgICAgICAgICAgIHJldHVy
biB7IH07Ci0gICAgICAgIGF1dG8gbGV0dGVyU3BhY2luZyA9IGlubGluZUl0ZW0uc3R5bGUoKS5s
ZXR0ZXJTcGFjaW5nKCk7Ci0gICAgICAgIGlmIChsZXR0ZXJTcGFjaW5nIDw9IDApCi0gICAgICAg
ICAgICByZXR1cm4geyB9OwotICAgICAgICBBU1NFUlQobG9naWNhbFdpZHRoID4gbGV0dGVyU3Bh
Y2luZyk7Ci0gICAgICAgIHJldHVybiBsZXR0ZXJTcGFjaW5nOwotICAgIH07Ci0gICAgbV9jb250
aW51b3VzQ29udGVudC5hcHBlbmQoaW5saW5lSXRlbSwgbG9naWNhbFdpZHRoLCBjb2xsYXBzaWJs
ZVdpZHRoKCkpOwotICAgIG1faGFzSW5saW5lTGV2ZWxCb3ggPSBtX2hhc0lubGluZUxldmVsQm94
IHx8IGlubGluZUl0ZW0uaXNCb3goKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKTsK
LX0KLQotaW5saW5lIHZvaWQgTGluZUNhbmRpZGF0ZTo6SW5saW5lQ29udGVudDo6cmVzZXQoKQot
ewotICAgIG1fY29udGludW91c0NvbnRlbnQucmVzZXQoKTsKLSAgICBtX3RyYWlsaW5nTGluZUJy
ZWFrID0geyB9OwotICAgIG1fdHJhaWxpbmdXb3JkQnJlYWtPcHBvcnR1bml0eSA9IHsgfTsKLSAg
ICBtX2hhc0lubGluZUxldmVsQm94ID0gZmFsc2U7Ci19Ci0KLWlubGluZSB2b2lkIExpbmVDYW5k
aWRhdGU6OnJlc2V0KCkKLXsKLSAgICBmbG9hdEl0ZW0gPSBudWxscHRyOwotICAgIGlubGluZUNv
bnRlbnQucmVzZXQoKTsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBMaW5lQnVpbGRlcjo6aW5saW5l
SXRlbVdpZHRoKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQg
Y29udGVudExvZ2ljYWxMZWZ0KSBjb25zdAotewotICAgIGlmIChpczxJbmxpbmVUZXh0SXRlbT4o
aW5saW5lSXRlbSkpIHsKLSAgICAgICAgYXV0byYgaW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJ
bmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSk7Ci0gICAgICAgIGlmIChhdXRvIGNvbnRlbnRXaWR0
aCA9IGlubGluZVRleHRJdGVtLndpZHRoKCkpCi0gICAgICAgICAgICByZXR1cm4gKmNvbnRlbnRX
aWR0aDsKLSAgICAgICAgaWYgKCFpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSB8fCBJbmxp
bmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtKSkK
LSAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0sIGNvbnRl
bnRMb2dpY2FsTGVmdCk7Ci0gICAgICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4
dEl0ZW0sIGlubGluZVRleHRJdGVtLnN0YXJ0KCksIGlubGluZVRleHRJdGVtLnN0YXJ0KCkgKyAx
LCBjb250ZW50TG9naWNhbExlZnQpOwotICAgIH0KLQotICAgIGlmIChpbmxpbmVJdGVtLmlzTGlu
ZUJyZWFrKCkgfHwgaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkpCi0gICAgICAg
IHJldHVybiB7IH07Ci0KLSAgICBhdXRvJiBsYXlvdXRCb3ggPSBpbmxpbmVJdGVtLmxheW91dEJv
eCgpOwotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5n
ZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOwotCi0gICAgaWYgKGxheW91dEJveC5pc0Zsb2F0aW5n
UG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luQm94V2lkdGgo
KTsKLQotICAgIGlmIChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQotICAgICAgICByZXR1cm4g
Ym94R2VvbWV0cnkubWFyZ2luQm94V2lkdGgoKTsKLQotICAgIGlmIChpbmxpbmVJdGVtLmlzSW5s
aW5lQm94U3RhcnQoKSkKLSAgICAgICAgcmV0dXJuIGJveEdlb21ldHJ5Lm1hcmdpblN0YXJ0KCkg
KyBib3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nTGVmdCgpLnZh
bHVlT3IoMCk7Ci0KLSAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQotICAgICAg
ICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luRW5kKCkgKyBib3hHZW9tZXRyeS5ib3JkZXJSaWdo
dCgpICsgYm94R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVPcigwKTsKLQotICAgIC8vIE5v
bi1yZXBsYWNlZCBpbmxpbmUgYm94IChlLmcuIGlubGluZS1ibG9jaykKLSAgICByZXR1cm4gYm94
R2VvbWV0cnkubWFyZ2luQm94V2lkdGgoKTsKLX0KLQotTGluZUJ1aWxkZXI6OkxpbmVCdWlsZGVy
KElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCwgRmxvYXRp
bmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSwgSG9yaXpvbnRhbENvbnN0cmFpbnRzIHJvb3RIb3Jpem9u
dGFsQ29uc3RyYWludHMsIGNvbnN0IElubGluZUl0ZW1zJiBpbmxpbmVJdGVtcykKLSAgICA6IG1f
aW5saW5lRm9ybWF0dGluZ0NvbnRleHQoaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCi0gICAgLCBt
X2lubGluZUZvcm1hdHRpbmdTdGF0ZSgmaW5saW5lRm9ybWF0dGluZ0NvbnRleHQuZm9ybWF0dGlu
Z1N0YXRlKCkpCi0gICAgLCBtX2Zsb2F0aW5nU3RhdGUoJmZsb2F0aW5nU3RhdGUpCi0gICAgLCBt
X3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHMocm9vdEhvcml6b250YWxDb25zdHJhaW50cykKLSAg
ICAsIG1fbGluZShpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICAsIG1faW5saW5lSXRlbXMo
aW5saW5lSXRlbXMpCi17Ci19Ci0KLUxpbmVCdWlsZGVyOjpMaW5lQnVpbGRlcihjb25zdCBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dCYgaW5saW5lRm9ybWF0dGluZ0NvbnRleHQsIGNvbnN0IElubGlu
ZUl0ZW1zJiBpbmxpbmVJdGVtcykKLSAgICA6IG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQoaW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQpCi0gICAgLCBtX2xpbmUoaW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQpCi0gICAgLCBtX2lubGluZUl0ZW1zKGlubGluZUl0ZW1zKQotewotfQotCi1MaW5lQnVpbGRl
cjo6TGluZUNvbnRlbnQgTGluZUJ1aWxkZXI6OmxheW91dElubGluZUNvbnRlbnQoY29uc3QgSW5s
aW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBzaXplX3QgcGFydGlhbExlYWRpbmdDb250
ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxvd0xvZ2ljYWxXaWR0
aCwgY29uc3QgSW5saW5lUmVjdCYgaW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgYm9vbCBpc0ZpcnN0
TGluZSkKLXsKLSAgICBpbml0aWFsaXplKGluaXRpYWxDb25zdHJhaW50c0ZvckxpbmUoaW5pdGlh
bExpbmVMb2dpY2FsUmVjdCwgaXNGaXJzdExpbmUpKTsKLQotICAgIGF1dG8gY29tbWl0dGVkQ29u
dGVudCA9IHBsYWNlSW5saW5lQ29udGVudChuZWVkc0xheW91dFJhbmdlLCBwYXJ0aWFsTGVhZGlu
Z0NvbnRlbnRMZW5ndGgsIG92ZXJmbG93TG9naWNhbFdpZHRoKTsKLSAgICBhdXRvIGNvbW1pdHRl
ZFJhbmdlID0gY2xvc2UobmVlZHNMYXlvdXRSYW5nZSwgY29tbWl0dGVkQ29udGVudCk7Ci0KLSAg
ICBhdXRvIGlzTGFzdExpbmUgPSBpc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQoY29tbWl0dGVk
UmFuZ2UsIG5lZWRzTGF5b3V0UmFuZ2UuZW5kLCBjb21taXR0ZWRDb250ZW50LnBhcnRpYWxUcmFp
bGluZ0NvbnRlbnRMZW5ndGgpOwotICAgIHJldHVybiBMaW5lQ29udGVudCB7IGNvbW1pdHRlZFJh
bmdlLCBjb21taXR0ZWRDb250ZW50LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgsIGNvbW1p
dHRlZENvbnRlbnQub3ZlcmZsb3dMb2dpY2FsV2lkdGgsIG1fZmxvYXRzLCBtX2NvbnRlbnRJc0Nv
bnN0cmFpbmVkQnlGbG9hdAotICAgICAgICAsIG1fbGluZUxvZ2ljYWxSZWN0LnRvcExlZnQoKQot
ICAgICAgICAsIG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkKLSAgICAgICAgLCBtX2xpbmUuY29u
dGVudExvZ2ljYWxXaWR0aCgpCi0gICAgICAgICwgaXNMYXN0TGluZQotICAgICAgICAsIG1fbGlu
ZS5ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQoKQotICAgICAgICAsIG1fbGluZS5ydW5z
KCl9OwotfQotCi1MaW5lQnVpbGRlcjo6SW50cmluc2ljQ29udGVudCBMaW5lQnVpbGRlcjo6Y29t
cHV0ZWRJbnRyaW5zaWNXaWR0aChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFu
Z2UsIElubGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGgpCi17Ci0gICAgaW5pdGlhbGl6ZSh7
IHsgeyB9LCB7IGF2YWlsYWJsZVdpZHRoLCBtYXhJbmxpbmVMYXlvdXRVbml0KCkgfSB9LCBmYWxz
ZSB9KTsKLSAgICBhdXRvIGNvbW1pdHRlZENvbnRlbnQgPSBwbGFjZUlubGluZUNvbnRlbnQobmVl
ZHNMYXlvdXRSYW5nZSwgeyB9LCB7IH0pOwotICAgIGF1dG8gY29tbWl0dGVkUmFuZ2UgPSBjbG9z
ZShuZWVkc0xheW91dFJhbmdlLCBjb21taXR0ZWRDb250ZW50KTsKLSAgICByZXR1cm4geyBjb21t
aXR0ZWRSYW5nZSwgbV9saW5lLmNvbnRlbnRMb2dpY2FsV2lkdGgoKSwgbV9mbG9hdHMgfTsKLX0K
LQotdm9pZCBMaW5lQnVpbGRlcjo6aW5pdGlhbGl6ZShjb25zdCBVc2VkQ29uc3RyYWludHMmIGxp
bmVDb25zdHJhaW50cykKLXsKLSAgICBtX2Zsb2F0cy5jbGVhcigpOwotICAgIG1fcGFydGlhbExl
YWRpbmdUZXh0SXRlbSA9IHsgfTsKLSAgICBtX3dyYXBPcHBvcnR1bml0eUxpc3QuY2xlYXIoKTsK
LQotICAgIG1fbGluZS5pbml0aWFsaXplKCk7Ci0gICAgbV9saW5lTG9naWNhbFJlY3QgPSBsaW5l
Q29uc3RyYWludHMubG9naWNhbFJlY3Q7Ci0gICAgbV9jb250ZW50SXNDb25zdHJhaW5lZEJ5Rmxv
YXQgPSBsaW5lQ29uc3RyYWludHMuaXNDb25zdHJhaW5lZEJ5RmxvYXQ7Ci19Ci0KLUxpbmVCdWls
ZGVyOjpDb21taXR0ZWRDb250ZW50IExpbmVCdWlsZGVyOjpwbGFjZUlubGluZUNvbnRlbnQoY29u
c3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBzaXplX3QgcGFydGlhbExlYWRp
bmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBsZWFkaW5nTG9naWNh
bFdpZHRoKQotewotICAgIGF1dG8gbGluZUNhbmRpZGF0ZSA9IExpbmVDYW5kaWRhdGUgeyBsYXlv
dXRTdGF0ZSgpLnNob3VsZElnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZygpIH07Ci0gICAgYXV0
byBpbmxpbmVDb250ZW50QnJlYWtlciA9IElubGluZUNvbnRlbnRCcmVha2VyIHsgfTsKLQotICAg
IGF1dG8gY3VycmVudEl0ZW1JbmRleCA9IG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQ7Ci0gICAgc2l6
ZV90IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCA9IDA7Ci0gICAgd2hpbGUgKGN1cnJlbnRJdGVt
SW5kZXggPCBuZWVkc0xheW91dFJhbmdlLmVuZCkgewotICAgICAgICAvLyAxLiBDb2xsZWN0IHRo
ZSBzZXQgb2YgcnVucyB0aGF0IHdlIGNhbiBjb21taXQgdG8gdGhlIGxpbmUgYXMgb25lIGVudGl0
eSBlLmcuIDxzcGFuPnRleHRfYW5kX3NwYW5fc3RhcnRfc3Bhbl9lbmQ8L3NwYW4+LgotICAgICAg
ICAvLyAyLiBBcHBseSBmbG9hdHMgYW5kIHNocmluayB0aGUgYXZhaWxhYmxlIGhvcml6b250YWwg
c3BhY2UgZS5nLiA8c3Bhbj5pbnRydV88ZGl2IHN0eWxlPSJmbG9hdDogbGVmdCI+PC9kaXY+c2l2
ZV9mbG9hdDwvc3Bhbj4uCi0gICAgICAgIC8vIDMuIENoZWNrIGlmIHRoZSBjb250ZW50IGZpdHMg
dGhlIGxpbmUgYW5kIGNvbW1pdCB0aGUgY29udGVudCBhY2NvcmRpbmdseSAoZnVsbCwgcGFydGlh
bCBvciBub3QgY29tbWl0IGF0IGFsbCkuCi0gICAgICAgIC8vIDQuIFJldHVybiBpZiB3ZSBhcmUg
YXQgdGhlIGVuZCBvZiB0aGUgbGluZSBlaXRoZXIgYnkgbm90IGJlaW5nIGFibGUgdG8gZml0IG1v
cmUgY29udGVudCBvciBiZWNhdXNlIG9mIGFuIGV4cGxpY2l0IGxpbmUgYnJlYWsuCi0gICAgICAg
IGNhbmRpZGF0ZUNvbnRlbnRGb3JMaW5lKGxpbmVDYW5kaWRhdGUsIGN1cnJlbnRJdGVtSW5kZXgs
IG5lZWRzTGF5b3V0UmFuZ2UsIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCwgc3RkOjpleGNo
YW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6Om51bGxvcHQpLCBtX2xpbmUuY29udGVudExv
Z2ljYWxSaWdodCgpKTsKLSAgICAgICAgLy8gTm93IGNoZWNrIGlmIHdlIGNhbiBwdXQgdGhpcyBj
b250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAgIGF1dG8gcmVzdWx0ID0gUmVzdWx0
IHsgfTsKLSAgICAgICAgaWYgKGxpbmVDYW5kaWRhdGUuZmxvYXRJdGVtKSB7Ci0gICAgICAgICAg
ICBBU1NFUlQobGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmlzRW1wdHkoKSk7Ci0gICAgICAg
ICAgICBoYW5kbGVGbG9hdENvbnRlbnQoKmxpbmVDYW5kaWRhdGUuZmxvYXRJdGVtKTsKLSAgICAg
ICAgICAgIC8vIEZsb2F0cyBuZXZlciB0ZXJtaW5hdGUgdGhlIGxpbmUuCi0gICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlSW5saW5lQ29udGVudChpbmxpbmVDb250ZW50
QnJlYWtlciwgbmVlZHNMYXlvdXRSYW5nZSwgbGluZUNhbmRpZGF0ZSk7Ci0gICAgICAgIGF1dG8g
aXNFbmRPZkxpbmUgPSByZXN1bHQuaXNFbmRPZkxpbmUgPT0gSW5saW5lQ29udGVudEJyZWFrZXI6
OklzRW5kT2ZMaW5lOjpZZXM7Ci0gICAgICAgIGlmICghcmVzdWx0LmNvbW1pdHRlZENvdW50Lmlz
UmV2ZXJ0KSB7Ci0gICAgICAgICAgICBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgKz0gcmVzdWx0
LmNvbW1pdHRlZENvdW50LnZhbHVlOwotICAgICAgICAgICAgYXV0byYgaW5saW5lQ29udGVudCA9
IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudDsKLSAgICAgICAgICAgIGF1dG8gaW5saW5lQ29u
dGVudElzRnVsbHlDb21taXR0ZWQgPSBpbmxpbmVDb250ZW50LmNvbnRpbnVvdXNDb250ZW50KCku
cnVucygpLnNpemUoKSA9PSByZXN1bHQuY29tbWl0dGVkQ291bnQudmFsdWUgJiYgIXJlc3VsdC5w
YXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoOwotICAgICAgICAgICAgaWYgKGlubGluZUNvbnRl
bnRJc0Z1bGx5Q29tbWl0dGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF1dG8qIHdvcmRCcmVh
a09wcG9ydHVuaXR5ID0gaW5saW5lQ29udGVudC50cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5
KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gPHdicj4gbmVlZHMgdG8gYmUgb24gdGhlIGxp
bmUgYXMgYW4gZW1wdHkgcnVuIHNvIHRoYXQgd2UgY2FuIGNvbnN0cnVjdCBhbiBpbmxpbmUgYm94
IGFuZCBjb21wdXRlIGJhc2ljIGdlb21ldHJ5LgotICAgICAgICAgICAgICAgICAgICArK2NvbW1p
dHRlZElubGluZUl0ZW1Db3VudDsKLSAgICAgICAgICAgICAgICAgICAgbV9saW5lLmFwcGVuZCgq
d29yZEJyZWFrT3Bwb3J0dW5pdHksIHsgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIGlmIChpbmxpbmVDb250ZW50LnRyYWlsaW5nTGluZUJyZWFrKCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgLy8gRnVsbHkgY29tbWl0dGVkIChvciBlbXB0eSkgY29udGVudCBmb2xsb3dl
ZCBieSBhIGxpbmUgYnJlYWsgbWVhbnMgImVuZCBvZiBsaW5lIi4KLSAgICAgICAgICAgICAgICAg
ICAgLy8gRklYTUU6IFRoaXMgd2lsbCBwdXQgdGhlIGxpbmUgYnJlYWsgYm94IGF0IHRoZSBlbmQg
b2YgdGhlIGxpbmUgd2hpbGUgaW4gY2FzZSBvZiBzb21lIGlubGluZSBib3hlcywgdGhlIGxpbmUg
YnJlYWsKLSAgICAgICAgICAgICAgICAgICAgLy8gY291bGQgdmVyeSB3ZWxsIGJlIGF0IGFuIGVh
cmxpZXIgcG9zaXRpb24uIFRoaXMgaGFzIG5vIHZpc3VhbCBpbXBsaWNhdGlvbnMgYXQgdGhpcyBw
b2ludCB0aG91Z2ggKG9ubHkgZ2VvbWV0cnkgY29ycmVjdG5lc3Mgb24gdGhlIGxpbmUgYnJlYWsg
Ym94KS4KLSAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiA8c3BhbiBzdHlsZT0iYm9yZGVyLXJp
Z2h0OiAxMHB4IHNvbGlkIGdyZWVuIj50ZXh0PGJyPjwvc3Bhbj4gd2hlcmUgdGhlIDxicj4ncyBo
b3Jpem9udGFsIHBvc2l0aW9uIGlzIGJlZm9yZSB0aGUgcmlnaHQgYm9yZGVyIGFuZCBub3QgYWZ0
ZXIuCi0gICAgICAgICAgICAgICAgICAgIG1fbGluZS5hcHBlbmQoKmlubGluZUNvbnRlbnQudHJh
aWxpbmdMaW5lQnJlYWsoKSwgeyB9KTsKLSAgICAgICAgICAgICAgICAgICAgKytjb21taXR0ZWRJ
bmxpbmVJdGVtQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlzRW5kT2ZMaW5lID0gdHJ1ZTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAg
ICAgICAgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50ID0gcmVzdWx0LmNvbW1pdHRlZENvdW50LnZh
bHVlOwotCi0gICAgICAgIGlmIChpc0VuZE9mTGluZSkgewotICAgICAgICAgICAgLy8gV2UgY2Fu
J3QgcGxhY2UgYW55IG1vcmUgaXRlbXMgb24gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAgICAg
IHJldHVybiB7IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCwgcmVzdWx0LnBhcnRpYWxUcmFpbGlu
Z0NvbnRlbnRMZW5ndGgsIHJlc3VsdC5vdmVyZmxvd0xvZ2ljYWxXaWR0aCB9OwotICAgICAgICB9
Ci0gICAgICAgIGN1cnJlbnRJdGVtSW5kZXggPSBuZWVkc0xheW91dFJhbmdlLnN0YXJ0ICsgY29t
bWl0dGVkSW5saW5lSXRlbUNvdW50ICsgbV9mbG9hdHMuc2l6ZSgpOwotICAgICAgICBwYXJ0aWFs
TGVhZGluZ0NvbnRlbnRMZW5ndGggPSB7IH07Ci0gICAgfQotICAgIC8vIExvb2tzIGxpa2Ugd2Un
dmUgcnVuIG91dCBvZiBydW5zLgotICAgIHJldHVybiB7IGNvbW1pdHRlZElubGluZUl0ZW1Db3Vu
dCwgeyB9IH07Ci19Ci0KLUxpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UgTGluZUJ1aWxkZXI6
OmNsb3NlKGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgY29uc3QgQ29t
bWl0dGVkQ29udGVudCYgY29tbWl0dGVkQ29udGVudCkKLXsKLSAgICBBU1NFUlQoY29tbWl0dGVk
Q29udGVudC5pbmxpbmVJdGVtQ291bnQgfHwgIW1fZmxvYXRzLmlzRW1wdHkoKSB8fCBtX2NvbnRl
bnRJc0NvbnN0cmFpbmVkQnlGbG9hdCk7Ci0gICAgYXV0byBudW1iZXJPZkNvbW1pdHRlZEl0ZW1z
ID0gY29tbWl0dGVkQ29udGVudC5pbmxpbmVJdGVtQ291bnQgKyBtX2Zsb2F0cy5zaXplKCk7Ci0g
ICAgYXV0byB0cmFpbGluZ0lubGluZUl0ZW1JbmRleCA9IG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQg
KyBudW1iZXJPZkNvbW1pdHRlZEl0ZW1zIC0gMTsKLSAgICBhdXRvIGxpbmVSYW5nZSA9IElubGlu
ZUl0ZW1SYW5nZSB7IG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQsIHRyYWlsaW5nSW5saW5lSXRlbUlu
ZGV4ICsgMSB9OwotICAgIEFTU0VSVChsaW5lUmFuZ2UuZW5kIDw9IG5lZWRzTGF5b3V0UmFuZ2Uu
ZW5kKTsKLSAgICBpZiAoIWNvbW1pdHRlZENvbnRlbnQuaW5saW5lSXRlbUNvdW50KSB7Ci0gICAg
ICAgIC8vIExpbmUgaXMgZW1wdHksIHdlIG9ubHkgbWFuYWdlZCB0byBwbGFjZSBmbG9hdCBib3hl
cy4KLSAgICAgICAgcmV0dXJuIGxpbmVSYW5nZTsKLSAgICB9Ci0gICAgYXV0byBhdmFpbGFibGVX
aWR0aCA9IG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkgLSBtX2xpbmUuY29udGVudExvZ2ljYWxS
aWdodCgpOwotICAgIG1fbGluZS5yZW1vdmVDb2xsYXBzaWJsZUNvbnRlbnQoYXZhaWxhYmxlV2lk
dGgpOwotICAgIGF1dG8gaG9yaXpvbnRhbEFsaWdubWVudCA9IHJvb3QoKS5zdHlsZSgpLnRleHRB
bGlnbigpOwotICAgIGF1dG8gcnVuc0V4cGFuZEhvcml6b250YWxseSA9IGhvcml6b250YWxBbGln
bm1lbnQgPT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSAmJiAhaXNMYXN0TGluZVdpdGhJbmxpbmVD
b250ZW50KGxpbmVSYW5nZSwgbmVlZHNMYXlvdXRSYW5nZS5lbmQsIGNvbW1pdHRlZENvbnRlbnQu
cGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCk7Ci0gICAgaWYgKHJ1bnNFeHBhbmRIb3Jpem9u
dGFsbHkpCi0gICAgICAgIG1fbGluZS5hcHBseVJ1bkV4cGFuc2lvbihtX2xpbmVMb2dpY2FsUmVj
dC53aWR0aCgpIC0gbV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKSk7Ci0gICAgYXV0byBsaW5l
RW5kc1dpdGhIeXBoZW4gPSBmYWxzZTsKLSAgICBpZiAoIW1fbGluZS5ydW5zKCkuaXNFbXB0eSgp
KSB7Ci0gICAgICAgIGF1dG8mIGxhc3RUZXh0Q29udGVudCA9IG1fbGluZS5ydW5zKCkubGFzdCgp
LnRleHRDb250ZW50KCk7Ci0gICAgICAgIGxpbmVFbmRzV2l0aEh5cGhlbiA9IGxhc3RUZXh0Q29u
dGVudCAmJiBsYXN0VGV4dENvbnRlbnQtPm5lZWRzSHlwaGVuKCk7Ci0gICAgfQotICAgIG1fc3Vj
Y2Vzc2l2ZUh5cGhlbmF0ZWRMaW5lQ291bnQgPSBsaW5lRW5kc1dpdGhIeXBoZW4gPyBtX3N1Y2Nl
c3NpdmVIeXBoZW5hdGVkTGluZUNvdW50ICsgMSA6IDA7Ci0gICAgcmV0dXJuIGxpbmVSYW5nZTsK
LX0KLQotT3B0aW9uYWw8SG9yaXpvbnRhbENvbnN0cmFpbnRzPiBMaW5lQnVpbGRlcjo6ZmxvYXRD
b25zdHJhaW50cyhjb25zdCBJbmxpbmVSZWN0JiBsaW5lTG9naWNhbFJlY3QpIGNvbnN0Ci17Ci0g
ICAgYXV0byogZmxvYXRpbmdTdGF0ZSA9IHRoaXMtPmZsb2F0aW5nU3RhdGUoKTsKLSAgICBpZiAo
IWZsb2F0aW5nU3RhdGUgfHwgZmxvYXRpbmdTdGF0ZS0+ZmxvYXRzKCkuaXNFbXB0eSgpKQotICAg
ICAgICByZXR1cm4geyB9OwotCi0gICAgLy8gQ2hlY2sgZm9yIGludHJ1ZGluZyBmbG9hdHMgYW5k
IGFkanVzdCBsb2dpY2FsIGxlZnQvYXZhaWxhYmxlIHdpZHRoIGZvciB0aGlzIGxpbmUgYWNjb3Jk
aW5nbHkuCi0gICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyBmb3Jt
YXR0aW5nQ29udGV4dCgpLCAqZmxvYXRpbmdTdGF0ZSB9OwotICAgIGF1dG8gY29uc3RyYWludHMg
PSBmbG9hdGluZ0NvbnRleHQuY29uc3RyYWludHModG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmVj
dC50b3AoKSksIHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFJlY3QuYm90dG9tKCkpKTsKLSAgICAv
LyBDaGVjayBpZiB0aGVzZSB2YWx1ZXMgYWN0dWFsbHkgY29uc3RyYWluIHRoZSBsaW5lLgotICAg
IGlmIChjb25zdHJhaW50cy5sZWZ0ICYmIGNvbnN0cmFpbnRzLmxlZnQtPnggPD0gbGluZUxvZ2lj
YWxSZWN0LmxlZnQoKSkKLSAgICAgICAgY29uc3RyYWludHMubGVmdCA9IHsgfTsKLQotICAgIGlm
IChjb25zdHJhaW50cy5yaWdodCAmJiBjb25zdHJhaW50cy5yaWdodC0+eCA+PSBsaW5lTG9naWNh
bFJlY3QucmlnaHQoKSkKLSAgICAgICAgY29uc3RyYWludHMucmlnaHQgPSB7IH07Ci0KLSAgICBp
ZiAoIWNvbnN0cmFpbnRzLmxlZnQgJiYgIWNvbnN0cmFpbnRzLnJpZ2h0KQotICAgICAgICByZXR1
cm4geyB9OwotCi0gICAgYXV0byBsaW5lTG9naWNhbExlZnQgPSBsaW5lTG9naWNhbFJlY3QubGVm
dCgpOwotICAgIGF1dG8gbGluZUxvZ2ljYWxSaWdodCA9IGxpbmVMb2dpY2FsUmVjdC5yaWdodCgp
OwotICAgIGlmIChjb25zdHJhaW50cy5sZWZ0ICYmIGNvbnN0cmFpbnRzLnJpZ2h0KSB7Ci0gICAg
ICAgIGxpbmVMb2dpY2FsUmlnaHQgPSBjb25zdHJhaW50cy5yaWdodC0+eDsKLSAgICAgICAgbGlu
ZUxvZ2ljYWxMZWZ0ID0gY29uc3RyYWludHMubGVmdC0+eDsKLSAgICB9IGVsc2UgaWYgKGNvbnN0
cmFpbnRzLmxlZnQpIHsKLSAgICAgICAgQVNTRVJUKGNvbnN0cmFpbnRzLmxlZnQtPnggPj0gbGlu
ZUxvZ2ljYWxMZWZ0KTsKLSAgICAgICAgbGluZUxvZ2ljYWxMZWZ0ID0gY29uc3RyYWludHMubGVm
dC0+eDsKLSAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnRzLnJpZ2h0KSB7Ci0gICAgICAgIC8vIFJp
Z2h0IGZsb2F0IGJveGVzIG1heSBvdmVyZmxvdyB0aGUgY29udGFpbmluZyBibG9jayBvbiB0aGUg
bGVmdC4KLSAgICAgICAgbGluZUxvZ2ljYWxSaWdodCA9IHN0ZDo6bWF4PElubGluZUxheW91dFVu
aXQ+KGxpbmVMb2dpY2FsTGVmdCwgY29uc3RyYWludHMucmlnaHQtPngpOwotICAgIH0KLSAgICBy
ZXR1cm4gSG9yaXpvbnRhbENvbnN0cmFpbnRzIHsgdG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsTGVm
dCksIHRvTGF5b3V0VW5pdChsaW5lTG9naWNhbFJpZ2h0IC0gbGluZUxvZ2ljYWxMZWZ0KSB9Owot
fQotCi1MaW5lQnVpbGRlcjo6VXNlZENvbnN0cmFpbnRzIExpbmVCdWlsZGVyOjppbml0aWFsQ29u
c3RyYWludHNGb3JMaW5lKGNvbnN0IElubGluZVJlY3QmIGluaXRpYWxMaW5lTG9naWNhbFJlY3Qs
IGJvb2wgaXNGaXJzdExpbmUpIGNvbnN0Ci17Ci0gICAgYXV0byBsaW5lTG9naWNhbExlZnQgPSBp
bml0aWFsTGluZUxvZ2ljYWxSZWN0LmxlZnQoKTsKLSAgICBhdXRvIGxpbmVMb2dpY2FsUmlnaHQg
PSBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LnJpZ2h0KCk7Ci0gICAgYXV0byBsaW5lSXNDb25zdHJh
aW5lZEJ5RmxvYXQgPSBmYWxzZTsKLQotICAgIGlmIChhdXRvIGxpbmVDb25zdHJhaW50cyA9IGZs
b2F0Q29uc3RyYWludHMoaW5pdGlhbExpbmVMb2dpY2FsUmVjdCkpIHsKLSAgICAgICAgbGluZUxv
Z2ljYWxMZWZ0ID0gbGluZUNvbnN0cmFpbnRzLT5sb2dpY2FsTGVmdDsKLSAgICAgICAgbGluZUxv
Z2ljYWxSaWdodCA9IGxpbmVDb25zdHJhaW50cy0+bG9naWNhbFJpZ2h0KCk7Ci0gICAgICAgIGxp
bmVJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IHRydWU7Ci0gICAgfQotCi0gICAgYXV0byBjb21wdXRl
ZFRleHRJbmRlbnQgPSBbJl0oKSAtPiBJbmxpbmVMYXlvdXRVbml0IHsKLSAgICAgICAgLy8gdGV4
dC1pbmRlbnQgcHJvcGVydHkgc3BlY2lmaWVzIHRoZSBpbmRlbnRhdGlvbiBhcHBsaWVkIHRvIGxp
bmVzIG9mIGlubGluZSBjb250ZW50IGluIGEgYmxvY2suCi0gICAgICAgIC8vIFRoZSBpbmRlbnQg
aXMgdHJlYXRlZCBhcyBhIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBzdGFydCBlZGdlIG9mIHRoZSBs
aW5lIGJveC4KLSAgICAgICAgLy8gVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIG9ubHkgbGlu
ZXMgdGhhdCBhcmUgdGhlIGZpcnN0IGZvcm1hdHRlZCBsaW5lIG9mIGFuIGVsZW1lbnQgYXJlIGFm
ZmVjdGVkLgotICAgICAgICAvLyBGb3IgZXhhbXBsZSwgdGhlIGZpcnN0IGxpbmUgb2YgYW4gYW5v
bnltb3VzIGJsb2NrIGJveCBpcyBvbmx5IGFmZmVjdGVkIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGls
ZCBvZiBpdHMgcGFyZW50IGVsZW1lbnQuCi0gICAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBm
b3IgZWFjaC1saW5lLgotICAgICAgICAvLyBbSW50ZWdyYXRpb25dIHJvb3QoKS0+cGFyZW50KCkg
d291bGQgbm9ybWFsbHkgcHJvZHVjZSBhIHZhbGlkIGxheW91dCBib3guCi0gICAgICAgIGF1dG8m
IHJvb3QgPSB0aGlzLT5yb290KCk7Ci0gICAgICAgIGF1dG8gaXNGb3JtYXR0aW5nQ29udGV4dFJv
b3RDYW5kaWRhdGVUb1RleHRJbmRlbnQgPSAhcm9vdC5pc0Fub255bW91cygpOwotICAgICAgICBp
ZiAocm9vdC5pc0Fub255bW91cygpKSB7Ci0gICAgICAgICAgICAvLyBVbmxlc3Mgb3RoZXJ3aXNl
IHNwZWNpZmllZCBieSB0aGUgZWFjaC1saW5lIGFuZC9vciBoYW5naW5nIGtleXdvcmRzLCBvbmx5
IGxpbmVzIHRoYXQgYXJlIHRoZSBmaXJzdCBmb3JtYXR0ZWQgbGluZQotICAgICAgICAgICAgLy8g
b2YgYW4gZWxlbWVudCBhcmUgYWZmZWN0ZWQuCi0gICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwg
dGhlIGZpcnN0IGxpbmUgb2YgYW4gYW5vbnltb3VzIGJsb2NrIGJveCBpcyBvbmx5IGFmZmVjdGVk
IGlmIGl0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50IGVsZW1lbnQuCi0gICAgICAg
ICAgICBhdXRvIGlzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkID0gbGF5b3V0U3RhdGUoKS5p
c0ludGVncmF0ZWRSb290Qm94Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgaWYgKGlzSW50ZWdy
YXRlZFJvb3RCb3hGaXJzdENoaWxkID09IExheW91dFN0YXRlOjpJc0ludGVncmF0ZWRSb290Qm94
Rmlyc3RDaGlsZDo6Tm90QXBwbGljYWJsZSkKLSAgICAgICAgICAgICAgICBpc0Zvcm1hdHRpbmdD
b250ZXh0Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCA9IHJvb3QucGFyZW50KCkuZmlyc3RJbkZs
b3dDaGlsZCgpID09ICZyb290OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlz
Rm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9UZXh0SW5kZW50ID0gaXNJbnRlZ3JhdGVk
Um9vdEJveEZpcnN0Q2hpbGQgPT0gTGF5b3V0U3RhdGU6OklzSW50ZWdyYXRlZFJvb3RCb3hGaXJz
dENoaWxkOjpZZXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc0Zvcm1hdHRpbmdDb250ZXh0
Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAg
ICAgIGF1dG8gaW52ZXJ0TGluZVJhbmdlID0gcm9vdC5zdHlsZSgpLnRleHRJbmRlbnRUeXBlKCkg
PT0gVGV4dEluZGVudFR5cGU6Okhhbmdpbmc7Ci0gICAgICAgIC8vIHRleHQtaW5kZW50OiBoYW5n
aW5nIGludmVydHMgd2hpY2ggbGluZXMgYXJlIGFmZmVjdGVkLgotICAgICAgICAvLyBpbnZlcnRl
ZCBsaW5lIHJhbmdlIC0+IGFsbCB0aGUgbGluZXMgZXhjZXB0IHRoZSBmaXJzdCBvbmUuCi0gICAg
ICAgIC8vICFpbnZlcnRlZCBsaW5lIHJhbmdlIC0+IGZpcnN0IGxpbmUgZ2V0cyB0aGUgaW5kZW50
LgotICAgICAgICBhdXRvIHNob3VsZEluZGVudCA9IGludmVydExpbmVSYW5nZSAhPSBpc0ZpcnN0
TGluZTsKLSAgICAgICAgaWYgKCFzaG91bGRJbmRlbnQpCi0gICAgICAgICAgICByZXR1cm4geyB9
OwotCi0gICAgICAgIGF1dG8gdGV4dEluZGVudCA9IHJvb3Quc3R5bGUoKS50ZXh0SW5kZW50KCk7
Ci0gICAgICAgIGlmICh0ZXh0SW5kZW50ID09IFJlbmRlclN0eWxlOjppbml0aWFsVGV4dEluZGVu
dCgpKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgcmV0dXJuIHsgbWluaW11bVZh
bHVlRm9yTGVuZ3RoKHRleHRJbmRlbnQsIGluaXRpYWxMaW5lTG9naWNhbFJlY3Qud2lkdGgoKSkg
fTsKLSAgICB9OwotICAgIGxpbmVMb2dpY2FsTGVmdCArPSBjb21wdXRlZFRleHRJbmRlbnQoKTsK
LSAgICByZXR1cm4gVXNlZENvbnN0cmFpbnRzIHsgeyBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LnRv
cCgpLCBsaW5lTG9naWNhbExlZnQsIGxpbmVMb2dpY2FsUmlnaHQgLSBsaW5lTG9naWNhbExlZnQs
IGluaXRpYWxMaW5lTG9naWNhbFJlY3QuaGVpZ2h0KCkgfSwgbGluZUlzQ29uc3RyYWluZWRCeUZs
b2F0IH07Ci19Ci0KLXZvaWQgTGluZUJ1aWxkZXI6OmNhbmRpZGF0ZUNvbnRlbnRGb3JMaW5lKExp
bmVDYW5kaWRhdGUmIGxpbmVDYW5kaWRhdGUsIHNpemVfdCBjdXJyZW50SW5saW5lSXRlbUluZGV4
LCBjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBzaXplX3QgcGFydGlhbExlYWRp
bmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBsZWFkaW5nTG9naWNh
bFdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGN1cnJlbnRMb2dpY2FsUmlnaHQpCi17Ci0gICAgQVNT
RVJUKGN1cnJlbnRJbmxpbmVJdGVtSW5kZXggPCBsYXlvdXRSYW5nZS5lbmQpOwotICAgIGxpbmVD
YW5kaWRhdGUucmVzZXQoKTsKLSAgICAvLyAxLiBTaW1wbHkgYWRkIGFueSBvdmVyZmxvdyBjb250
ZW50IGZyb20gdGhlIHByZXZpb3VzIGxpbmUgdG8gdGhlIGNhbmRpZGF0ZSBjb250ZW50LiBJdCdz
IGFsd2F5cyBhIHRleHQgY29udGVudC4KLSAgICAvLyAyLiBGaW5kIHRoZSBuZXh0IHNvZnQgd3Jh
cCBwb3NpdGlvbiBvciBleHBsaWNpdCBsaW5lIGJyZWFrLgotICAgIC8vIDMuIENvbGxlY3QgZmxv
YXRzIGJldHdlZW4gdGhlIGlubGluZSBjb250ZW50LgotICAgIGF1dG8gc29mdFdyYXBPcHBvcnR1
bml0eUluZGV4ID0gbmV4dFdyYXBPcHBvcnR1bml0eShjdXJyZW50SW5saW5lSXRlbUluZGV4LCBs
YXlvdXRSYW5nZSk7Ci0gICAgLy8gc29mdFdyYXBPcHBvcnR1bml0eUluZGV4ID09IGxheW91dFJh
bmdlLmVuZCBtZWFucyB3ZSBkb24ndCBoYXZlIGFueSB3cmFwIG9wcG9ydHVuaXR5IGluIHRoaXMg
Y29udGVudC4KLSAgICBBU1NFUlQoc29mdFdyYXBPcHBvcnR1bml0eUluZGV4IDw9IGxheW91dFJh
bmdlLmVuZCk7Ci0KLSAgICBpZiAocGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoKSB7Ci0gICAg
ICAgIC8vIEhhbmRsZSBsZWFkaW5nIHBhcnRpYWwgY29udGVudCBmaXJzdCAob3ZlcmZsb3dpbmcg
dGV4dCBmcm9tIHRoZSBwcmV2aW91cyBsaW5lKS4KLSAgICAgICAgLy8gQ29uc3RydWN0IGEgcGFy
dGlhbCBsZWFkaW5nIGlubGluZSBpdGVtLgotICAgICAgICBtX3BhcnRpYWxMZWFkaW5nVGV4dEl0
ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4obV9pbmxpbmVJdGVtc1tjdXJyZW50SW5saW5l
SXRlbUluZGV4XSkucmlnaHQocGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoKTsKLSAgICAgICAg
YXV0byBpdGVtV2lkdGggPSBsZWFkaW5nTG9naWNhbFdpZHRoID8gKnN0ZDo6ZXhjaGFuZ2UobGVh
ZGluZ0xvZ2ljYWxXaWR0aCwgV1RGOjpudWxsb3B0KSA6IGlubGluZUl0ZW1XaWR0aCgqbV9wYXJ0
aWFsTGVhZGluZ1RleHRJdGVtLCBjdXJyZW50TG9naWNhbFJpZ2h0KTsKLSAgICAgICAgbGluZUNh
bmRpZGF0ZS5pbmxpbmVDb250ZW50LmFwcGVuZElubGluZUl0ZW0oKm1fcGFydGlhbExlYWRpbmdU
ZXh0SXRlbSwgaXRlbVdpZHRoKTsKLSAgICAgICAgY3VycmVudExvZ2ljYWxSaWdodCArPSBpdGVt
V2lkdGg7Ci0gICAgICAgICsrY3VycmVudElubGluZUl0ZW1JbmRleDsKLSAgICB9Ci0KLSAgICBm
b3IgKGF1dG8gaW5kZXggPSBjdXJyZW50SW5saW5lSXRlbUluZGV4OyBpbmRleCA8IHNvZnRXcmFw
T3Bwb3J0dW5pdHlJbmRleDsgKytpbmRleCkgewotICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0g
bV9pbmxpbmVJdGVtc1tpbmRleF07Ci0gICAgICAgIGlmIChpbmxpbmVJdGVtLmlzRmxvYXQoKSkg
ewotICAgICAgICAgICAgbGluZUNhbmRpZGF0ZS5mbG9hdEl0ZW0gPSAmaW5saW5lSXRlbTsKLSAg
ICAgICAgICAgIC8vIFRoaXMgaXMgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHksIG11c3QgYmUgdGhl
IG9ubHkgaXRlbSBpbiB0aGUgbGlzdC4KLSAgICAgICAgICAgIEFTU0VSVChjdXJyZW50SW5saW5l
SXRlbUluZGV4ICsgMSA9PSBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXgpOwotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNUZXh0KCkgfHwg
aW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVu
ZCgpIHx8IGlubGluZUl0ZW0uaXNCb3goKSkgewotICAgICAgICAgICAgQVNTRVJUKCFsZWFkaW5n
TG9naWNhbFdpZHRoIHx8IGlubGluZUl0ZW0uaXNUZXh0KCkpOwotICAgICAgICAgICAgYXV0byBs
b2dpY2FsV2lkdGggPSBsZWFkaW5nTG9naWNhbFdpZHRoID8gKnN0ZDo6ZXhjaGFuZ2UobGVhZGlu
Z0xvZ2ljYWxXaWR0aCwgV1RGOjpudWxsb3B0KSA6IGlubGluZUl0ZW1XaWR0aChpbmxpbmVJdGVt
LCBjdXJyZW50TG9naWNhbFJpZ2h0KTsKLSAgICAgICAgICAgIGxpbmVDYW5kaWRhdGUuaW5saW5l
Q29udGVudC5hcHBlbmRJbmxpbmVJdGVtKGlubGluZUl0ZW0sIGxvZ2ljYWxXaWR0aCk7Ci0gICAg
ICAgICAgICBjdXJyZW50TG9naWNhbFJpZ2h0ICs9IGxvZ2ljYWxXaWR0aDsKLSAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmxpbmVJdGVtLmlzTGluZUJyZWFr
KCkgfHwgaW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkpIHsKLSAgICAgICAgICAg
IC8vIFNpbmNlIGJvdGggPGJyPiBhbmQgPHdicj4gYXJlIGV4cGxpY2l0IHdvcmQgYnJlYWsgb3Bw
b3J0dW5pdGllcyB0aGV5IGhhdmUgdG8gYmUgdHJhaWxpbmcgaXRlbXMgaW4gdGhpcyBjYW5kaWRh
dGUgcnVuIGxpc3QgdW5sZXNzIHRoZXkgYXJlIGVtYmVkZGVkIGluIGlubGluZSBib3hlcy4KLSAg
ICAgICAgICAgIC8vIGUuZy4gPHNwYW4+PHdicj48L3NwYW4+Ci0jaWYgQVNTRVJUX0VOQUJMRUQK
LSAgICAgICAgICAgIGZvciAoYXV0byBpID0gaW5kZXggKyAxOyBpIDwgc29mdFdyYXBPcHBvcnR1
bml0eUluZGV4OyArK2kpCi0gICAgICAgICAgICAgICAgQVNTRVJUKG1faW5saW5lSXRlbXNbaV0u
aXNJbmxpbmVCb3hFbmQoKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlubGluZUl0ZW0uaXNMaW5l
QnJlYWsoKSA/IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5hcHBlbmRUcmFpbGluZ0xpbmVC
cmVhayhpbmxpbmVJdGVtKSA6IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5hcHBlbmR0cmFp
bGluZ1dvcmRCcmVha09wcG9ydHVuaXR5KGlubGluZUl0ZW0pOwotICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotICAg
IGF1dG8gaW5saW5lQ29udGVudEVuZHNJblNvZnRXcmFwT3Bwb3J0dW5pdHkgPSBbJl0gewotICAg
ICAgICBpZiAoIXNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCB8fCBzb2Z0V3JhcE9wcG9ydHVuaXR5
SW5kZXggPT0gbGF5b3V0UmFuZ2UuZW5kKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNhbmRpZGF0
ZSBpbmxpbmUgY29udGVudCBlbmRzIGJlY2F1c2UgdGhlIGVudGlyZSBjb250ZW50IGVuZHMgYW5k
IG5vdCBiZWNhdXNlIHRoZXJlJ3MgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkuCi0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1faW5saW5lSXRlbXNbc29m
dFdyYXBPcHBvcnR1bml0eUluZGV4IC0gMV0uaXNGbG9hdCgpKSB7Ci0gICAgICAgICAgICAvLyBX
aGlsZSB3ZSBzdG9wIGF0IGZsb2F0cywgdGhleSBhcmUgbm90IGNvbnNpZGVyZWQgcmVhbCBzb2Z0
IHdyYXAgb3Bwb3J0dW5pdGllcy4gCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
IH0KLSAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyNsaW5l
LWJyZWFrLWRldGFpbHMKLSAgICAgICAgYXV0byYgdHJhaWxpbmdJbmxpbmVJdGVtID0gbV9pbmxp
bmVJdGVtc1tzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggLSAxXTsKLSAgICAgICAgaWYgKHRyYWls
aW5nSW5saW5lSXRlbS5pc0JveCgpIHx8IHRyYWlsaW5nSW5saW5lSXRlbS5pc0xpbmVCcmVhaygp
IHx8IHRyYWlsaW5nSW5saW5lSXRlbS5pc1dvcmRCcmVha09wcG9ydHVuaXR5KCkgfHwgdHJhaWxp
bmdJbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpIHsKLSAgICAgICAgICAgIC8vIEZvciBXZWIt
Y29tcGF0aWJpbGl0eSB0aGVyZSBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBiZWZvcmUgYW5k
IGFmdGVyIGVhY2ggcmVwbGFjZWQgZWxlbWVudCBvciBvdGhlciBhdG9taWMgaW5saW5lLgotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRyYWlsaW5nSW5s
aW5lSXRlbS5pc1RleHQoKSkgewotICAgICAgICAgICAgYXV0byYgaW5saW5lVGV4dEl0ZW0gPSBk
b3duY2FzdDxJbmxpbmVUZXh0SXRlbT4odHJhaWxpbmdJbmxpbmVJdGVtKTsKLSAgICAgICAgICAg
IGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKLSAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgICAgIC8vIE5vdyBpbiBjYXNlIG9mIG5vbi13aGl0ZXNwYWNlIHRy
YWlsaW5nIGNvbnRlbnQsIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGFjdHVhbCBzb2Z0IHdyYXAg
b3Bwb3J0dW5pdHkgYmVsb25ncyB0byB0aGUgbmV4dCBzZXQuCi0gICAgICAgICAgICAvLyBlLmcu
ICJ0aGlzX2lzX3RoZV90cmFpbGluZ19ydW48c3Bhbj4gPC1idXRfdGhpc19zcGFjZV9oZXJlX2lz
X3RoZV9zb2Z0X3dyYXBfb3Bwb3J0dW5pdHkiCi0gICAgICAgICAgICAvLyBXaGVuIHRoZXJlJ3Mg
YW4gaW5saW5lIGJveCBzdGFydCg8c3Bhbj4pL2VuZCg8L3NwYW4+KSBiZXR3ZWVuIHRoZSB0cmFp
bGluZyBhbmQgdGhlIChuZXh0KWxlYWRpbmcgcnVuLCB3aGlsZSB3ZSBicmVhayBiZWZvcmUgdGhl
IGlubGluZSBib3ggc3RhcnQgKDxzcGFuPikKLSAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc29m
dCB3cmFwIHBvc2l0aW9uIGlzIGFmdGVyIHRoZSBpbmxpbmUgYm94IHN0YXJ0ICg8c3Bhbj4pIGJ1
dCBpbiB0ZXJtcyBvZiBsaW5lIGJyZWFraW5nIGNvbnRpbnVpdHkgdGhlIGlubGluZSBib3ggc3Rh
cnQgKDxzcGFuPikgYW5kIHRoZSB3aGl0ZXNwYWNlIHJ1biBiZWxvbmcgdG9nZXRoZXIuCi0gICAg
ICAgICAgICBSRUxFQVNFX0FTU0VSVChsYXlvdXRSYW5nZS5lbmQgPD0gbV9pbmxpbmVJdGVtcy5z
aXplKCkpOwotICAgICAgICAgICAgZm9yIChhdXRvIGluZGV4ID0gc29mdFdyYXBPcHBvcnR1bml0
eUluZGV4OyBpbmRleCA8IGxheW91dFJhbmdlLmVuZDsgKytpbmRleCkgewotICAgICAgICAgICAg
ICAgIGlmIChtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJveFN0YXJ0KCkgfHwgbV9pbmxp
bmVJdGVtc1tpbmRleF0uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAgICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IENoZWNrIGlmIFtub24td2hpdGVzcGFj
ZV1baW5saW5lLWJveF1bbm8td2hpdGVzcGFjZV0gY29udGVudCBoYXMgcnVsZXMgYWJvdXQgaXQu
Ci0gICAgICAgICAgICAgICAgLy8gRm9yIG5vdyBsZXQncyBzYXkgdGhlIHNvZnQgd3JhcCBwb3Np
dGlvbiBiZWxvbmdzIHRvIHRoZSBuZXh0IHNldCBvZiBydW5zIHdoZW4gW25vbi13aGl0ZXNwYWNl
XVtpbmxpbmUtYm94XVt3aGl0ZXNwYWNlXSwgW25vbi13aGl0ZXNwYWNlXVtpbmxpbmUtYm94XVti
b3hdIGV0Yy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbV9pbmxpbmVJdGVtc1tpbmRleF0uaXNU
ZXh0KCkgJiYgIWRvd25jYXN0PElubGluZVRleHRJdGVtPihtX2lubGluZUl0ZW1zW2luZGV4XSku
aXNXaGl0ZXNwYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICAgICAgfQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJu
IHRydWU7Ci0gICAgfTsKLSAgICBsaW5lQ2FuZGlkYXRlLmlubGluZUNvbnRlbnQuc2V0SGFzVHJh
aWxpbmdTb2Z0V3JhcE9wcG9ydHVuaXR5KGlubGluZUNvbnRlbnRFbmRzSW5Tb2Z0V3JhcE9wcG9y
dHVuaXR5KCkpOwotfQotCi1zaXplX3QgTGluZUJ1aWxkZXI6Om5leHRXcmFwT3Bwb3J0dW5pdHko
c2l6ZV90IHN0YXJ0SW5kZXgsIGNvbnN0IExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UmIGxh
eW91dFJhbmdlKSBjb25zdAotewotICAgIC8vIDEuIEZpbmQgdGhlIHN0YXJ0IGNhbmRpZGF0ZSBi
eSBza2lwcGluZyBsZWFkaW5nIG5vbi1jb250ZW50IGl0ZW1zIGUuZyAiPHNwYW4+PHNwYW4+c3Rh
cnQiLiBPcHBvcnR1bml0eSBpcyBhZnRlciAiPHNwYW4+PHNwYW4+Ii4KLSAgICAvLyAyLiBGaW5k
IHRoZSBlbmQgY2FuZGlkYXRlIGJ5IHNraXBwaW5nIG5vbi1jb250ZW50IGl0ZW1zIGluYmV0d2Vl
biBlLmcuICI8c3Bhbj48c3Bhbj5zdGFydDwvc3Bhbj5lbmQiLiBPcHBvcnR1bml0eSBpcyBhZnRl
ciAiPC9zcGFuPiIuCi0gICAgLy8gMy4gQ2hlY2sgaWYgdGhlcmUncyBhIHNvZnQgd3JhcCBvcHBv
cnR1bml0eSBiZXR3ZWVuIHRoZSAyIGNhbmRpZGF0ZSBpbmxpbmUgaXRlbXMgYW5kIHJlcGVhdC4K
LSAgICAvLyA0LiBBbnkgZm9yY2UgbGluZSBicmVhay9leHBsaWNpdCB3cmFwIGNvbnRlbnQgaW5i
ZXR3ZWVuIGlzIGNvbnNpZGVyZWQgYXMgd3JhcCBvcHBvcnR1bml0eS4KLQotICAgIC8vIFtleC1d
W2lubGluZSBib3ggc3RhcnRdW2lubGluZSBib3ggZW5kXVtmbG9hdF1bYW1wbGVdIChleC08c3Bh
bj48L3NwYW4+PGRpdiBzdHlsZT0iZmxvYXQ6bGVmdCI+PC9kaXY+YW1wbGUpLiBXcmFwIGluZGV4
IGlzIGF0IFtleC1dLgotICAgIC8vIFtleF1baW5saW5lIGJveCBzdGFydF1bYW1wLV1baW5saW5l
IGJveCBzdGFydF1bbGVdIChleDxzcGFuPmFtcC08c3Bhbj5hbXBsZSkuIFdyYXAgaW5kZXggaXMg
YXQgW2FtcC1dLgotICAgIC8vIFtleC1dW2lubGluZSBib3ggc3RhcnRdW2xpbmUgYnJlYWtdW2Ft
cGxlXSAoZXgtPHNwYW4+PGJyPmFtcGxlKS4gV3JhcCBpbmRleCBpcyBhZnRlciBbYnJdLgotICAg
IGF1dG8gcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBPcHRpb25hbDxzaXplX3Q+IHsgfTsKLSAg
ICBmb3IgKGF1dG8gaW5kZXggPSBzdGFydEluZGV4OyBpbmRleCA8IGxheW91dFJhbmdlLmVuZDsg
KytpbmRleCkgewotICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gbV9pbmxpbmVJdGVtc1tpbmRl
eF07Ci0gICAgICAgIGlmIChpbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkgfHwgaW5saW5lSXRlbS5p
c1dvcmRCcmVha09wcG9ydHVuaXR5KCkpIHsKLSAgICAgICAgICAgIC8vIFdlIGFsd2F5cyBzdG9w
IGF0IGV4cGxpY2l0IHdyYXBwaW5nIG9wcG9ydHVuaXRpZXMgZS5nLiA8YnI+LiBIb3dldmVyIHRo
ZSB3cmFwIHBvc2l0aW9uIG1heSBiZSBhdCBsYXRlciBwb3NpdGlvbi4KLSAgICAgICAgICAgIC8v
IGUuZy4gPHNwYW4+PHNwYW4+PGJyPjwvc3Bhbj48L3NwYW4+IDwtIHdyYXAgcG9zaXRpb24gaXMg
YWZ0ZXIgdGhlIHNlY29uZCA8L3NwYW4+Ci0gICAgICAgICAgICAvLyBidXQgaW4gY2FzZSBvZiA8
c3Bhbj48YnI+PHNwYW4+PC9zcGFuPjwvc3Bhbj4gPC0gd3JhcCBwb3NpdGlvbiBpcyByaWdodCBh
ZnRlciA8YnI+LgotICAgICAgICAgICAgZm9yICgrK2luZGV4OyBpbmRleCA8IGxheW91dFJhbmdl
LmVuZCAmJiBtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJveEVuZCgpOyArK2luZGV4KSB7
IH0KLSAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5s
aW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgp
KSB7Ci0gICAgICAgICAgICAvLyBOZWVkIHRvIHNlZSB3aGF0IGNvbWVzIG5leHQgdG8gZGVjaWRl
LgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUKGlubGlu
ZUl0ZW0uaXNUZXh0KCkgfHwgaW5saW5lSXRlbS5pc0JveCgpIHx8IGlubGluZUl0ZW0uaXNGbG9h
dCgpKTsKLSAgICAgICAgaWYgKCFwcmV2aW91c0lubGluZUl0ZW1JbmRleCkgewotICAgICAgICAg
ICAgcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICB9Ci0gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgcHJldmlvdXMgYW5kIGN1cnJl
bnQgaXRlbXMgYXJlIG5vdCBuZWNlc3NhcmlseSBhZGphY2VudCBpdGVtcyBlLmcgInByZXZpb3Vz
PHNwYW4+Y3VycmVudDwvc3Bhbj4iCi0gICAgICAgIGF1dG8mIHByZXZpb3VzSXRlbSA9IG1faW5s
aW5lSXRlbXNbKnByZXZpb3VzSW5saW5lSXRlbUluZGV4XTsKLSAgICAgICAgYXV0byYgY3VycmVu
dEl0ZW0gPSBtX2lubGluZUl0ZW1zW2luZGV4XTsKLSAgICAgICAgaWYgKGlzQXRTb2Z0V3JhcE9w
cG9ydHVuaXR5KG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQsIHByZXZpb3VzSXRlbSwgY3VycmVu
dEl0ZW0pKSB7Ci0gICAgICAgICAgICBpZiAoKnByZXZpb3VzSW5saW5lSXRlbUluZGV4ICsgMSA9
PSBpbmRleCAmJiAoIXByZXZpb3VzSXRlbS5pc1RleHQoKSB8fCAhY3VycmVudEl0ZW0uaXNUZXh0
KCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugb25seSBrbm93IHRoZSBleGFjdCBzb2Z0IHdy
YXAgb3Bwb3J0dW5pdHkgaW5kZXggd2hlbiB0aGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgaXRlbXMg
YXJlIG5leHQgdG8gZWFjaCBvdGhlci4KLSAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGVyZSdzIGEgc29mdCB3cmFwIG9wcG9ydHVu
aXR5IGJldHdlZW4gJ3ByZXZpb3VzSW5saW5lSXRlbUluZGV4JyBhbmQgJ2luZGV4Jy4KLSAgICAg
ICAgICAgIC8vIE5vdyBmb3J3YXJkLWZpbmQgZnJvbSB0aGUgc3RhcnQgcG9zaXRpb24gdG8gc2Vl
IHdoZXJlIHdlIGNhbiBhY3R1YWxseSB3cmFwLgotICAgICAgICAgICAgLy8gW2V4LV1bYW1wbGVd
IHZzLiBbZXgtXVtpbmxpbmUgYm94IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF1bYW1wbGVdCi0gICAg
ICAgICAgICAvLyB3aGVyZSBbZXgtXSBpcyBzdGFydENvbnRlbnQgYW5kIFthbXBsZV0gaXMgdGhl
IG5leHRDb250ZW50LgotICAgICAgICAgICAgZm9yIChhdXRvIGNhbmRpZGF0ZUluZGV4ID0gKnBy
ZXZpb3VzSW5saW5lSXRlbUluZGV4ICsgMTsgY2FuZGlkYXRlSW5kZXggPCBpbmRleDsgKytjYW5k
aWRhdGVJbmRleCkgewotICAgICAgICAgICAgICAgIGlmIChtX2lubGluZUl0ZW1zW2NhbmRpZGF0
ZUluZGV4XS5pc0lubGluZUJveFN0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaW5s
aW5lIGNvbnRlbnQgYW5kIFtpbmxpbmUgYm94IHN0YXJ0XSBhbmQgW2lubGluZSBib3ggZW5kXSBm
b3JtIHVuYnJlYWthYmxlIGNvbnRlbnQuCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4LTxzcGFu
Pjwvc3Bhbj5hbXBsZSAgOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC0iLgotICAgICAg
ICAgICAgICAgICAgICAvLyBleC08L3NwYW4+PC9zcGFuPmFtcGxlIDogd3JhcCBvcHBvcnR1bml0
eSBpcyBhZnRlciAiZXgtPC9zcGFuPjwvc3Bhbj4iLgotICAgICAgICAgICAgICAgICAgICAvLyBl
eC08L3NwYW4+PHNwYW4+YW1wbGU8L3NwYW4+IDogd3JhcCBvcHBvcnR1bml0eSBpcyBhZnRlciAi
ZXgtPC9zcGFuPiIuCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4LTxzcGFuPjxzcGFuPmFtcGxl
PC9zcGFuPjwvc3Bhbj4gOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC0iLgotICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlSW5kZXg7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0gICAg
ICAgIHByZXZpb3VzSW5saW5lSXRlbUluZGV4ID0gaW5kZXg7Ci0gICAgfQotICAgIHJldHVybiBs
YXlvdXRSYW5nZS5lbmQ7Ci19Ci0KLXZvaWQgTGluZUJ1aWxkZXI6OmhhbmRsZUZsb2F0Q29udGVu
dChjb25zdCBJbmxpbmVJdGVtJiBmbG9hdEl0ZW0pCi17Ci0gICAgYXV0byYgZmxvYXRCb3ggPSBm
bG9hdEl0ZW0ubGF5b3V0Qm94KCk7Ci0gICAgbV9mbG9hdHMuYXBwZW5kKCZmbG9hdEJveCk7Ci0K
LSAgICBhdXRvKiBmbG9hdGluZ1N0YXRlID0gdGhpcy0+ZmxvYXRpbmdTdGF0ZSgpOwotICAgIGlm
ICghZmxvYXRpbmdTdGF0ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNTRVJUKGZvcm1hdHRp
bmdTdGF0ZSgpKTsKLSAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLT5i
b3hHZW9tZXRyeShmbG9hdEJveCk7Ci0gICAgLy8gU2V0IHN0YXRpYyBwb3NpdGlvbiBmaXJzdC4K
LSAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVmdChMYXlvdXRQb2ludCB7IG1fbGluZUxv
Z2ljYWxSZWN0LnRvcExlZnQoKSB9KTsKLSAgICAvLyBGbG9hdCBpdC4KLSAgICBBU1NFUlQobV9y
b290SG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZs
b2F0aW5nQ29udGV4dCB7IGZvcm1hdHRpbmdDb250ZXh0KCksICpmbG9hdGluZ1N0YXRlIH07Ci0g
ICAgYXV0byBmbG9hdGluZ1Bvc2l0aW9uID0gZmxvYXRpbmdDb250ZXh0LnBvc2l0aW9uRm9yRmxv
YXQoZmxvYXRCb3gsICptX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgIGJveEdlb21l
dHJ5LnNldExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nUG9zaXRpb24pOwotICAgIGZsb2F0aW5nU3Rh
dGUtPmFwcGVuZChmbG9hdGluZ0NvbnRleHQudG9GbG9hdEl0ZW0oZmxvYXRCb3gpKTsKLSAgICAv
LyBDaGVjayBpZiB0aGlzIGZsb2F0IHNocmlua3MgdGhlIGxpbmUgKHRoZXkgZG9uJ3QgZ2V0IHBv
c2l0aW9uZWQgaGlnaGVyIHRoYW4gdGhlIGxpbmUpLgotICAgIGlmIChmbG9hdGluZ1Bvc2l0aW9u
LnkoKSA+IG1fbGluZUxvZ2ljYWxSZWN0LmJvdHRvbSgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IHRydWU7Ci0gICAgYXV0byBmbG9hdEJv
eFdpZHRoID0gaW5saW5lSXRlbVdpZHRoKGZsb2F0SXRlbSwgeyB9KTsKLSAgICBpZiAoZmxvYXRC
b3guaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgIG1fbGluZUxvZ2ljYWxSZWN0
LnNldExlZnQobV9saW5lTG9naWNhbFJlY3QubGVmdCgpICsgZmxvYXRCb3hXaWR0aCk7ICAgIAot
ICAgIG1fbGluZUxvZ2ljYWxSZWN0LmV4cGFuZEhvcml6b250YWxseSgtZmxvYXRCb3hXaWR0aCk7
Ci19Ci0KLUxpbmVCdWlsZGVyOjpSZXN1bHQgTGluZUJ1aWxkZXI6OmhhbmRsZUlubGluZUNvbnRl
bnQoSW5saW5lQ29udGVudEJyZWFrZXImIGlubGluZUNvbnRlbnRCcmVha2VyLCBjb25zdCBJbmxp
bmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBjb25zdCBMaW5lQ2FuZGlkYXRlJiBsaW5lQ2FuZGlk
YXRlKQotewotICAgIGF1dG8mIGlubGluZUNvbnRlbnQgPSBsaW5lQ2FuZGlkYXRlLmlubGluZUNv
bnRlbnQ7Ci0gICAgaWYgKGlubGluZUNvbnRlbnQuY29udGludW91c0NvbnRlbnQoKS5ydW5zKCku
aXNFbXB0eSgpKSB7Ci0gICAgICAgIEFTU0VSVChpbmxpbmVDb250ZW50LnRyYWlsaW5nTGluZUJy
ZWFrKCkgfHwgaW5saW5lQ29udGVudC50cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5KCkpOwot
ICAgICAgICByZXR1cm4geyBpbmxpbmVDb250ZW50LnRyYWlsaW5nTGluZUJyZWFrKCkgPyBJbmxp
bmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllcyA6IElubGluZUNvbnRlbnRCcmVha2Vy
OjpJc0VuZE9mTGluZTo6Tm8gfTsKLSAgICB9Ci0gICAgYXV0byBzaG91bGREaXNhYmxlSHlwaGVu
YXRpb24gPSBbJl0gewotICAgICAgICBhdXRvJiBzdHlsZSA9IHJvb3QoKS5zdHlsZSgpOwotICAg
ICAgICB1bnNpZ25lZCBsaW1pdExpbmVzID0gc3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCkg
PT0gUmVuZGVyU3R5bGU6OmluaXRpYWxIeXBoZW5hdGlvbkxpbWl0TGluZXMoKSA/IHN0ZDo6bnVt
ZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSA6IHN0eWxlLmh5cGhlbmF0aW9uTGltaXRMaW5l
cygpOwotICAgICAgICByZXR1cm4gbV9zdWNjZXNzaXZlSHlwaGVuYXRlZExpbmVDb3VudCA+PSBs
aW1pdExpbmVzOwotICAgIH07Ci0gICAgaWYgKHNob3VsZERpc2FibGVIeXBoZW5hdGlvbigpKQot
ICAgICAgICBpbmxpbmVDb250ZW50QnJlYWtlci5zZXRIeXBoZW5hdGlvbkRpc2FibGVkKCk7Ci0K
LSAgICBhdXRvJiBjb250aW51b3VzSW5saW5lQ29udGVudCA9IGxpbmVDYW5kaWRhdGUuaW5saW5l
Q29udGVudC5jb250aW51b3VzQ29udGVudCgpOwotICAgIGF1dG8gbGluZUxvZ2ljYWxSZWN0Rm9y
Q2FuZGlkYXRlQ29udGVudCA9IFsmXSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjYW5kaWRh
dGUgY29udGVudCB3b3VsZCBzdHJldGNoIHRoZSBsaW5lIGFuZCB3aGV0aGVyIGFkZGl0aW9uYWwg
ZmxvYXRzIGFyZSBnZXR0aW5nIGluIHRoZSB3YXkuCi0gICAgICAgIGlmICghZmxvYXRpbmdTdGF0
ZSgpIHx8ICFpbmxpbmVDb250ZW50Lmhhc0lubGluZUxldmVsQm94KCkpCi0gICAgICAgICAgICBy
ZXR1cm4gbV9saW5lTG9naWNhbFJlY3Q7Ci0gICAgICAgIGF1dG8gbWF4aW11bUxpbmVMb2dpY2Fs
SGVpZ2h0ID0gbV9saW5lTG9naWNhbFJlY3QuaGVpZ2h0KCk7Ci0gICAgICAgIGZvciAoYXV0byYg
cnVuIDogY29udGludW91c0lubGluZUNvbnRlbnQucnVucygpKSB7Ci0gICAgICAgICAgICAvLyBG
SVhNRTogQWRkIHN1cHBvcnQgZm9yIGlubGluZSBib3hlcyB0b28uCi0gICAgICAgICAgICBpZiAo
IXJ1bi5pbmxpbmVJdGVtLmlzQm94KCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgICAgICBtYXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQgPSBzdGQ6Om1heChtYXhpbXVtTGluZUxv
Z2ljYWxIZWlnaHQsIElubGluZUxheW91dFVuaXQgeyBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21l
dHJ5Rm9yQm94KHJ1bi5pbmxpbmVJdGVtLmxheW91dEJveCgpKS5tYXJnaW5Cb3hIZWlnaHQoKSB9
KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF4aW11bUxpbmVMb2dpY2FsSGVpZ2h0ID09IG1f
bGluZUxvZ2ljYWxSZWN0LmhlaWdodCgpKQotICAgICAgICAgICAgcmV0dXJuIG1fbGluZUxvZ2lj
YWxSZWN0OwotICAgICAgICBhdXRvIGFkanVzdGVkTGluZUxvZ2ljYWxSZWN0ID0gSW5saW5lUmVj
dCB7IG1fbGluZUxvZ2ljYWxSZWN0LnRvcCgpLCBtX2xpbmVMb2dpY2FsUmVjdC5sZWZ0KCksIG1f
bGluZUxvZ2ljYWxSZWN0LndpZHRoKCksIG1heGltdW1MaW5lTG9naWNhbEhlaWdodCB9OwotICAg
ICAgICBpZiAoYXV0byBob3Jpem9udGFsQ29uc3RyYWludHMgPSBmbG9hdENvbnN0cmFpbnRzKGFk
anVzdGVkTGluZUxvZ2ljYWxSZWN0KSkgewotICAgICAgICAgICAgYWRqdXN0ZWRMaW5lTG9naWNh
bFJlY3Quc2V0TGVmdChob3Jpem9udGFsQ29uc3RyYWludHMtPmxvZ2ljYWxMZWZ0KTsKLSAgICAg
ICAgICAgIGFkanVzdGVkTGluZUxvZ2ljYWxSZWN0LnNldFdpZHRoKGhvcml6b250YWxDb25zdHJh
aW50cy0+bG9naWNhbFdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWRqdXN0ZWRM
aW5lTG9naWNhbFJlY3Q7Ci0gICAgfSgpOwotICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBbJl0g
ewotICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoRm9yQ29udGVudCA9IGxpbmVMb2dpY2FsUmVj
dEZvckNhbmRpZGF0ZUNvbnRlbnQud2lkdGgoKSAtIG1fbGluZS5jb250ZW50TG9naWNhbFJpZ2h0
KCk7Ci0gICAgICAgIHJldHVybiBzdGQ6OmlzbmFuKGF2YWlsYWJsZVdpZHRoRm9yQ29udGVudCkg
PyBtYXhJbmxpbmVMYXlvdXRVbml0KCkgOiBhdmFpbGFibGVXaWR0aEZvckNvbnRlbnQ7Ci0gICAg
fSgpOwotICAgIC8vIFdoaWxlIHRoZSBmbG9hdHMgYXJlIG5vdCBjb25zaWRlcmVkIHRvIGJlIG9u
IHRoZSBsaW5lLCB0aGV5IG1ha2UgdGhlIGxpbmUgY29udGVudGZ1bCBmb3IgbGluZSBicmVha2lu
Zy4KLSAgICBhdXRvIGxpbmVIYXNDb250ZW50ID0gIW1fbGluZS5ydW5zKCkuaXNFbXB0eSgpIHx8
IG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0OwotICAgIGF1dG8gbGluZVN0YXR1cyA9IElu
bGluZUNvbnRlbnRCcmVha2VyOjpMaW5lU3RhdHVzIHsgbV9saW5lLmNvbnRlbnRMb2dpY2FsUmln
aHQoKSwgYXZhaWxhYmxlV2lkdGgsIG1fbGluZS50cmltbWFibGVUcmFpbGluZ1dpZHRoKCksIG1f
bGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpLCBtX2xpbmUuaXNUcmFpbGluZ1J1bkZ1bGx5
VHJpbW1hYmxlKCksIGxpbmVIYXNDb250ZW50LCAhbV93cmFwT3Bwb3J0dW5pdHlMaXN0LmlzRW1w
dHkoKSB9OwotICAgIGF1dG8gcmVzdWx0ID0gaW5saW5lQ29udGVudEJyZWFrZXIucHJvY2Vzc0lu
bGluZUNvbnRlbnQoY29udGludW91c0lubGluZUNvbnRlbnQsIGxpbmVTdGF0dXMpOwotICAgIGF1
dG8mIGNhbmRpZGF0ZVJ1bnMgPSBjb250aW51b3VzSW5saW5lQ29udGVudC5ydW5zKCk7Ci0gICAg
aWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9u
OjpLZWVwKSB7Ci0gICAgICAgIC8vIFRoaXMgY29udGludW91cyBjb250ZW50IGNhbiBiZSBmdWxs
eSBwbGFjZWQgb24gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAgbV9saW5lTG9naWNhbFJlY3Qg
PSBsaW5lTG9naWNhbFJlY3RGb3JDYW5kaWRhdGVDb250ZW50OwotICAgICAgICBmb3IgKGF1dG8m
IHJ1biA6IGNhbmRpZGF0ZVJ1bnMpCi0gICAgICAgICAgICBtX2xpbmUuYXBwZW5kKHJ1bi5pbmxp
bmVJdGVtLCBydW4ubG9naWNhbFdpZHRoKTsKLSAgICAgICAgaWYgKGxpbmVDYW5kaWRhdGUuaW5s
aW5lQ29udGVudC5oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoKSkgewotICAgICAgICAg
ICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGFsbG93ZWQgdG8gd3JhcCBhdCB0aGlzIHBvc2l0aW9uLgot
ICAgICAgICAgICAgYXV0byYgdHJhaWxpbmdJdGVtID0gY2FuZGlkYXRlUnVucy5sYXN0KCkuaW5s
aW5lSXRlbTsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBUaGVyZSBtdXN0IGJlIGEgd2F5IHRvIGRl
Y2lkZSBpZiB0aGUgdHJhaWxpbmcgcnVuIGFjdHVhbGx5IGVuZGVkIHVwIG9uIHRoZSBsaW5lLgot
ICAgICAgICAgICAgLy8gTGV0J3MganVzdCBkZWFsIHdpdGggY29sbGFwc2VkIGxlYWRpbmcgd2hp
dGVzcGFjZSBmb3Igbm93LgotICAgICAgICAgICAgaWYgKCFtX2xpbmUucnVucygpLmlzRW1wdHko
KSAmJiBJbmxpbmVDb250ZW50QnJlYWtlcjo6aXNXcmFwcGluZ0FsbG93ZWQodHJhaWxpbmdJdGVt
KSkKLSAgICAgICAgICAgICAgICBtX3dyYXBPcHBvcnR1bml0eUxpc3QuYXBwZW5kKCZ0cmFpbGlu
Z0l0ZW0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB7IHJlc3VsdC5pc0VuZE9mTGluZSwg
eyBjYW5kaWRhdGVSdW5zLnNpemUoKSwgZmFsc2UgfSB9OwotICAgIH0KLQotICAgIGF1dG8gZWxp
Z2libGVPdmVyZmxvd1dpZHRoQXNMZWFkaW5nID0gWyZdICgpIC0+IE9wdGlvbmFsPElubGluZUxh
eW91dFVuaXQ+IHsKLSAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBvdGhlciB0eXBl
cyBvZiBjb250aW51b3VzIGNvbnRlbnQuCi0gICAgICAgIEFTU0VSVChyZXN1bHQuYWN0aW9uID09
IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6V3JhcCB8fCByZXN1bHQuYWN0
aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6QnJlYWspOwotICAg
ICAgICBpZiAoY2FuZGlkYXRlUnVucy5zaXplKCkgIT0gMSB8fCAhY2FuZGlkYXRlUnVucy5maXJz
dCgpLmlubGluZUl0ZW0uaXNUZXh0KCkpCi0gICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAg
ICBhdXRvJiBpbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihjYW5kaWRh
dGVSdW5zLmZpcnN0KCkuaW5saW5lSXRlbSk7Ci0gICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5p
c1doaXRlc3BhY2UoKSkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIGlmIChyZXN1
bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6V3JhcCkK
LSAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVSdW5zLmZpcnN0KCkubG9naWNhbFdpZHRoOwot
ICAgICAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0
OjpBY3Rpb246OkJyZWFrICYmIHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50LT5wYXJ0aWFs
UnVuKQotICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVJ1bnMuZmlyc3QoKS5sb2dpY2FsV2lk
dGggLSByZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+cGFydGlhbFJ1bi0+bG9naWNhbFdp
ZHRoOwotICAgICAgICByZXR1cm4geyB9OwotICAgIH07Ci0KLSAgICBpZiAocmVzdWx0LmFjdGlv
biA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rpb246OldyYXApIHsKLSAgICAg
ICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNF
bmRPZkxpbmU6Olllcyk7Ci0gICAgICAgIC8vIFRoaXMgY29udGludW91cyBjb250ZW50IGNhbid0
IGJlIHBsYWNlZCBvbiB0aGUgY3VycmVudCBsaW5lLiBOb3RoaW5nIHRvIGNvbW1pdCBhdCB0aGlz
IHRpbWUuCi0gICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGlu
ZTo6WWVzLCB7IH0sIHsgfSwgZWxpZ2libGVPdmVyZmxvd1dpZHRoQXNMZWFkaW5nKCkgfTsKLSAg
ICB9Ci0gICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3Vs
dDo6QWN0aW9uOjpXcmFwV2l0aEh5cGhlbikgewotICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5k
T2ZMaW5lID09IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKLSAgICAg
ICAgLy8gVGhpcyBjb250aW51b3VzIGNvbnRlbnQgY2FuJ3QgYmUgcGxhY2VkIG9uIHRoZSBjdXJy
ZW50IGxpbmUsIG5vdGhpbmcgdG8gY29tbWl0LgotICAgICAgICAvLyBIb3dldmVyIHdlIG5lZWQg
dG8gbWFrZSBzdXJlIHRoYXQgdGhlIGN1cnJlbnQgbGluZSBnYWlucyBhIHRyYWlsaW5nIGh5cGhl
bi4KLSAgICAgICAgQVNTRVJUKG1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpKTsKLSAg
ICAgICAgbV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCptX2xpbmUudHJhaWxpbmdTb2Z0SHlwaGVu
V2lkdGgoKSk7Ci0gICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9m
TGluZTo6WWVzIH07Ci0gICAgfQotICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRl
bnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0V3JhcE9wcG9ydHVuaXR5KSB7
Ci0gICAgICAgIEFTU0VSVChyZXN1bHQuaXNFbmRPZkxpbmUgPT0gSW5saW5lQ29udGVudEJyZWFr
ZXI6OklzRW5kT2ZMaW5lOjpZZXMpOwotICAgICAgICAvLyBOb3Qgb25seSB0aGlzIGNvbnRlbnQg
Y2FuJ3QgYmUgcGxhY2VkIG9uIHRoZSBjdXJyZW50IGxpbmUsIGJ1dCB3ZSBldmVuIG5lZWQgdG8g
cmV2ZXJ0IHRoZSBsaW5lIGJhY2sgdG8gYW4gZWFybGllciBwb3NpdGlvbi4KLSAgICAgICAgQVNT
RVJUKCFtX3dyYXBPcHBvcnR1bml0eUxpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgcmV0dXJuIHsg
SW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgcmVidWlsZExpbmUobGF5
b3V0UmFuZ2UsICptX3dyYXBPcHBvcnR1bml0eUxpc3QubGFzdCgpKSwgdHJ1ZSB9IH07Ci0gICAg
fQotICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6
OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0Tm9uT3ZlcmZsb3dpbmdXcmFwT3Bwb3J0dW5pdHkpIHsKLSAg
ICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6
SXNFbmRPZkxpbmU6Olllcyk7Ci0gICAgICAgIEFTU0VSVCghbV93cmFwT3Bwb3J0dW5pdHlMaXN0
LmlzRW1wdHkoKSk7Ci0gICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0Vu
ZE9mTGluZTo6WWVzLCB7IHJlYnVpbGRMaW5lRm9yVHJhaWxpbmdTb2Z0SHlwaGVuKGxheW91dFJh
bmdlKSwgdHJ1ZSB9IH07Ci0gICAgfQotICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNv
bnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6QnJlYWspIHsKLSAgICAgICAgQVNTRVJUKHJl
c3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olll
cyk7Ci0gICAgICAgIC8vIENvbW1pdCB0aGUgY29tYmluYXRpb24gb2YgZnVsbCBhbmQgcGFydGlh
bCBjb250ZW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAgIEFTU0VSVChyZXN1bHQucGFy
dGlhbFRyYWlsaW5nQ29udGVudCk7Ci0gICAgICAgIGNvbW1pdFBhcnRpYWxDb250ZW50KGNhbmRp
ZGF0ZVJ1bnMsICpyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudCk7Ci0gICAgICAgIC8vIFdo
ZW4gYnJlYWtpbmcgbXVsdGlwbGUgcnVucyA8c3BhbiBzdHlsZT0id29yZC1icmVhazogYnJlYWst
YWxsIj50ZXh0PC9zcGFuPjxzcGFuPmNvbnRlbnQ8L3NwYW4+LCB3ZSBtaWdodCBlbmQgdXAgYnJl
YWtpbmcgdGhlbSBhdCBydW4gYm91bmRhcnkuCi0gICAgICAgIC8vIEl0IHNpbXBseSBtZWFucyB3
ZSBkb24ndCByZWFsbHkgaGF2ZSBhIHBhcnRpYWwgcnVuLiBQYXJ0aWFsIGNvbnRlbnQgeWVzLCBi
dXQgbm90IHBhcnRpYWwgcnVuLgotICAgICAgICBhdXRvIHRyYWlsaW5nUnVuSW5kZXggPSByZXN1
bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+dHJhaWxpbmdSdW5JbmRleDsKLSAgICAgICAgYXV0
byBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgPSB0cmFpbGluZ1J1bkluZGV4ICsgMTsKLSAgICAg
ICAgaWYgKCFyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+cGFydGlhbFJ1bikKLSAgICAg
ICAgICAgIHJldHVybiB7IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzLCB7
IGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCwgZmFsc2UgfSB9OwotCi0gICAgICAgIGF1dG8gcGFy
dGlhbFJ1biA9ICpyZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudC0+cGFydGlhbFJ1bjsKLSAg
ICAgICAgYXV0byYgdHJhaWxpbmdJbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJ
dGVtPihjYW5kaWRhdGVSdW5zW3RyYWlsaW5nUnVuSW5kZXhdLmlubGluZUl0ZW0pOwotICAgICAg
ICBBU1NFUlQocGFydGlhbFJ1bi5sZW5ndGggPCB0cmFpbGluZ0lubGluZVRleHRJdGVtLmxlbmd0
aCgpKTsKLSAgICAgICAgYXV0byBvdmVyZmxvd0xlbmd0aCA9IHRyYWlsaW5nSW5saW5lVGV4dEl0
ZW0ubGVuZ3RoKCkgLSBwYXJ0aWFsUnVuLmxlbmd0aDsKLSAgICAgICAgcmV0dXJuIHsgSW5saW5l
Q29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgY29tbWl0dGVkSW5saW5lSXRlbUNv
dW50LCBmYWxzZSB9LCBvdmVyZmxvd0xlbmd0aCwgZWxpZ2libGVPdmVyZmxvd1dpZHRoQXNMZWFk
aW5nKCkgfTsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIHsg
SW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9OwotfQotCi12b2lkIExpbmVC
dWlsZGVyOjpjb21taXRQYXJ0aWFsQ29udGVudChjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6
Q29udGludW91c0NvbnRlbnQ6OlJ1bkxpc3QmIHJ1bnMsIGNvbnN0IElubGluZUNvbnRlbnRCcmVh
a2VyOjpSZXN1bHQ6OlBhcnRpYWxUcmFpbGluZ0NvbnRlbnQmIHBhcnRpYWxUcmFpbGluZ0NvbnRl
bnQpCi17Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJ1bnMuc2l6ZSgpOyAr
K2luZGV4KSB7Ci0gICAgICAgIGF1dG8mIHJ1biA9IHJ1bnNbaW5kZXhdOwotICAgICAgICBpZiAo
cGFydGlhbFRyYWlsaW5nQ29udGVudC50cmFpbGluZ1J1bkluZGV4ID09IGluZGV4KSB7Ci0gICAg
ICAgICAgICAvLyBDcmVhdGUgYW5kIGNvbW1pdCBwYXJ0aWFsIHRyYWlsaW5nIGl0ZW0uCi0gICAg
ICAgICAgICBpZiAoYXV0byBwYXJ0aWFsUnVuID0gcGFydGlhbFRyYWlsaW5nQ29udGVudC5wYXJ0
aWFsUnVuKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHJ1bi5pbmxpbmVJdGVtLmlzVGV4dCgp
KTsKLSAgICAgICAgICAgICAgICBhdXRvJiB0cmFpbGluZ0lubGluZVRleHRJdGVtID0gZG93bmNh
c3Q8SW5saW5lVGV4dEl0ZW0+KHJ1bnNbcGFydGlhbFRyYWlsaW5nQ29udGVudC50cmFpbGluZ1J1
bkluZGV4XS5pbmxpbmVJdGVtKTsKLSAgICAgICAgICAgICAgICBhdXRvIHBhcnRpYWxUcmFpbGlu
Z1RleHRJdGVtID0gdHJhaWxpbmdJbmxpbmVUZXh0SXRlbS5sZWZ0KHBhcnRpYWxSdW4tPmxlbmd0
aCk7Ci0gICAgICAgICAgICAgICAgbV9saW5lLmFwcGVuZChwYXJ0aWFsVHJhaWxpbmdUZXh0SXRl
bSwgcGFydGlhbFJ1bi0+bG9naWNhbFdpZHRoKTsKLSAgICAgICAgICAgICAgICBpZiAoYXV0byBo
eXBoZW5XaWR0aCA9IHBhcnRpYWxSdW4tPmh5cGhlbldpZHRoKQotICAgICAgICAgICAgICAgICAg
ICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBoZW4oKmh5cGhlbldpZHRoKTsKLSAgICAgICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGUgcGFydGlhbCBydW4g
aXMgdGhlIGxhc3QgY29udGVudCB0byBjb21taXQuCi0gICAgICAgICAgICBtX2xpbmUuYXBwZW5k
KHJ1bi5pbmxpbmVJdGVtLCBydW4ubG9naWNhbFdpZHRoKTsKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgfQotICAgICAgICBtX2xpbmUuYXBwZW5kKHJ1bi5pbmxpbmVJdGVtLCBydW4ubG9n
aWNhbFdpZHRoKTsKLSAgICB9Ci19Ci0KLXNpemVfdCBMaW5lQnVpbGRlcjo6cmVidWlsZExpbmUo
Y29uc3QgSW5saW5lSXRlbVJhbmdlJiBsYXlvdXRSYW5nZSwgY29uc3QgSW5saW5lSXRlbSYgbGFz
dElubGluZUl0ZW1Ub0FkZCkKLXsKLSAgICBBU1NFUlQoIW1fd3JhcE9wcG9ydHVuaXR5TGlzdC5p
c0VtcHR5KCkpOwotICAgIC8vIFdlIG1pZ2h0IGFscmVhZHkgaGF2ZSBhZGRlZCBmbG9hdHMuIFRo
ZXkgc2hyaW5rIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFjZSBmb3IgdGhlIGxpbmUuCi0g
ICAgLy8gTGV0J3MganVzdCByZXVzZSB3aGF0IHRoZSBsaW5lIGhhcyBhdCB0aGlzIHBvaW50Lgot
ICAgIG1fbGluZS5pbml0aWFsaXplKCk7Ci0gICAgYXV0byBjdXJyZW50SXRlbUluZGV4ID0gbGF5
b3V0UmFuZ2Uuc3RhcnQ7Ci0gICAgaWYgKG1fcGFydGlhbExlYWRpbmdUZXh0SXRlbSkgewotICAg
ICAgICBtX2xpbmUuYXBwZW5kKCptX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0sIGlubGluZUl0ZW1X
aWR0aCgqbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtLCB7IH0pKTsKLSAgICAgICAgaWYgKCZtX3Bh
cnRpYWxMZWFkaW5nVGV4dEl0ZW0udmFsdWUoKSA9PSAmbGFzdElubGluZUl0ZW1Ub0FkZCkKLSAg
ICAgICAgICAgIHJldHVybiAxOwotICAgICAgICArK2N1cnJlbnRJdGVtSW5kZXg7Ci0gICAgfQot
ICAgIGZvciAoOyBjdXJyZW50SXRlbUluZGV4IDwgbGF5b3V0UmFuZ2UuZW5kOyArK2N1cnJlbnRJ
dGVtSW5kZXgpIHsKLSAgICAgICAgYXV0byYgaW5saW5lSXRlbSA9IG1faW5saW5lSXRlbXNbY3Vy
cmVudEl0ZW1JbmRleF07Ci0gICAgICAgIG1fbGluZS5hcHBlbmQoaW5saW5lSXRlbSwgaW5saW5l
SXRlbVdpZHRoKGlubGluZUl0ZW0sIG1fbGluZS5jb250ZW50TG9naWNhbFJpZ2h0KCkpKTsKLSAg
ICAgICAgaWYgKCZpbmxpbmVJdGVtID09ICZsYXN0SW5saW5lSXRlbVRvQWRkKQotICAgICAgICAg
ICAgcmV0dXJuIGN1cnJlbnRJdGVtSW5kZXggLSBsYXlvdXRSYW5nZS5zdGFydCArIDE7Ci0gICAg
fQotICAgIHJldHVybiBsYXlvdXRSYW5nZS5zaXplKCk7Ci19Ci0KLXNpemVfdCBMaW5lQnVpbGRl
cjo6cmVidWlsZExpbmVGb3JUcmFpbGluZ1NvZnRIeXBoZW4oY29uc3QgSW5saW5lSXRlbVJhbmdl
JiBsYXlvdXRSYW5nZSkKLXsKLSAgICBBU1NFUlQoIW1fd3JhcE9wcG9ydHVuaXR5TGlzdC5pc0Vt
cHR5KCkpOwotICAgIC8vIFJldmVydCBhbGwgdGhlIHdheSBiYWNrIHRvIGEgd3JhcCBvcHBvcnR1
bml0eSB3aGVuIGVpdGhlciBhIHNvZnQgaHlwaGVuIGZpdHMgb3Igbm8gaHlwaGVuIGlzIHJlcXVp
cmVkLgotICAgIGZvciAoYXV0byBpID0gbV93cmFwT3Bwb3J0dW5pdHlMaXN0LnNpemUoKTsgaS0t
ID4gMTspIHsKLSAgICAgICAgYXV0byYgc29mdFdyYXBPcHBvcnR1bml0eUl0ZW0gPSAqbV93cmFw
T3Bwb3J0dW5pdHlMaXN0W2ldOwotICAgICAgICAvLyBGSVhNRTogSWYgdGhpcyB0dXJucyBvdXQg
dG8gYmUgYSBwZXJmIGlzc3VlLCB3ZSBjb3VsZCBhbHNvIHRyYXZlcnNlIHRoZSB3cmFwIGxpc3Qg
YW5kIGtlZXAgYWRkaW5nIHRoZSBpdGVtcwotICAgICAgICAvLyB3aGlsZSB3YXRjaGluZyB0aGUg
YXZhaWxhYmxlIHdpZHRoIHZlcnkgY2xvc2VseS4KLSAgICAgICAgYXV0byBjb21taXR0ZWRDb3Vu
dCA9IHJlYnVpbGRMaW5lKGxheW91dFJhbmdlLCBzb2Z0V3JhcE9wcG9ydHVuaXR5SXRlbSk7Ci0g
ICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBtX2xpbmVMb2dpY2FsUmVjdC53aWR0aCgpIC0g
bV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKTsKLSAgICAgICAgYXV0byB0cmFpbGluZ1NvZnRI
eXBoZW5XaWR0aCA9IG1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpOwotICAgICAgICAv
LyBDaGVjayBpZiB0aGUgdHJhaWxpbmcgaHlwaGVuIG5vdyBmaXRzIHRoZSBsaW5lIChvciB3ZSBk
b24ndCBuZWVkIGh5aGVuIGFueW1vcmUpLgotICAgICAgICBpZiAoIXRyYWlsaW5nU29mdEh5cGhl
bldpZHRoIHx8IHRyYWlsaW5nU29mdEh5cGhlbldpZHRoIDw9IGF2YWlsYWJsZVdpZHRoKSB7Ci0g
ICAgICAgICAgICBpZiAodHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgpCi0gICAgICAgICAgICAgICAg
bV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCp0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCk7Ci0gICAg
ICAgICAgICByZXR1cm4gY29tbWl0dGVkQ291bnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8g
SGF2ZSBhdCBsZWFzdCBzb21lIGNvbnRlbnQgb24gdGhlIGxpbmUuCi0gICAgYXV0byBjb21taXR0
ZWRDb3VudCA9IHJlYnVpbGRMaW5lKGxheW91dFJhbmdlLCAqbV93cmFwT3Bwb3J0dW5pdHlMaXN0
LmZpcnN0KCkpOwotICAgIGlmIChhdXRvIHRyYWlsaW5nU29mdEh5cGhlbldpZHRoID0gbV9saW5l
LnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCkpCi0gICAgICAgIG1fbGluZS5hZGRUcmFpbGluZ0h5
cGhlbigqdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgpOwotICAgIHJldHVybiBjb21taXR0ZWRDb3Vu
dDsKLX0KLQotYm9vbCBMaW5lQnVpbGRlcjo6aXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KGNv
bnN0IElubGluZUl0ZW1SYW5nZSYgbGluZVJhbmdlLCBzaXplX3QgbGFzdElubGluZUl0ZW1JbmRl
eCwgYm9vbCBoYXNQYXJ0aWFsVHJhaWxpbmdDb250ZW50KSBjb25zdAotewotICAgIGlmIChoYXNQ
YXJ0aWFsVHJhaWxpbmdDb250ZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGxp
bmVSYW5nZS5lbmQgPT0gbGFzdElubGluZUl0ZW1JbmRleCkKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgLy8gT21pdCBmbG9hdHMgdG8gc2VlIGlmIHRoaXMgaXMgdGhlIGxhc3QgbGluZSB3aXRo
IGlubGluZSBjb250ZW50LgotICAgIGZvciAoYXV0byBpID0gbGFzdElubGluZUl0ZW1JbmRleDsg
aS0tOykgewotICAgICAgICBpZiAoIW1faW5saW5lSXRlbXNbaV0uaXNGbG9hdCgpKQotICAgICAg
ICAgICAgcmV0dXJuIGkgPT0gbGluZVJhbmdlLmVuZCAtIDE7Ci0gICAgfQotICAgIC8vIFRoZXJl
IGhhcyB0byBiZSBhdCBsZWFzdCBvbmUgbm9uLWZsb2F0IGl0ZW0uCi0gICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1jb25zdCBDb250YWluZXJCb3gmIExp
bmVCdWlsZGVyOjpyb290KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZm9ybWF0dGluZ0NvbnRleHQo
KS5yb290KCk7Ci19Ci0KLWNvbnN0IExheW91dFN0YXRlJiBMaW5lQnVpbGRlcjo6bGF5b3V0U3Rh
dGUoKSBjb25zdAotewotICAgIHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmxheW91dFN0YXRl
KCk7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5oIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1aWxkZXIuaApkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMGUyMTcxNTA1ZWZmYjQyZmRmMGIzMjE2NDNiMzQzZDhjNTVmY2Fl
Zi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5oCisrKyAv
ZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
Ci0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0g
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQot
I2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiSW5saW5l
Q29udGVudEJyZWFrZXIuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKLSNp
bmNsdWRlICJJbmxpbmVMaW5lLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1jbGFzcyBGbG9hdGluZ0NvbnRleHQ7Ci1zdHJ1Y3QgTGluZUNhbmRpZGF0ZTsK
LQotY2xhc3MgTGluZUJ1aWxkZXIgewotcHVibGljOgotICAgIExpbmVCdWlsZGVyKElubGluZUZv
cm1hdHRpbmdDb250ZXh0JiwgRmxvYXRpbmdTdGF0ZSYsIEhvcml6b250YWxDb25zdHJhaW50cyBy
b290SG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBJbmxpbmVJdGVtcyYpOwotICAgIExpbmVC
dWlsZGVyKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiwgY29uc3QgSW5saW5lSXRlbXMm
KTsKLQotICAgIHN0cnVjdCBJbmxpbmVJdGVtUmFuZ2UgewotICAgICAgICBib29sIGlzRW1wdHko
KSBjb25zdCB7IHJldHVybiBzdGFydCA9PSBlbmQ7IH0KLSAgICAgICAgc2l6ZV90IHNpemUoKSBj
b25zdCB7IHJldHVybiBlbmQgLSBzdGFydDsgfQotICAgICAgICBzaXplX3Qgc3RhcnQgeyAwIH07
Ci0gICAgICAgIHNpemVfdCBlbmQgeyAwIH07Ci0gICAgfTsKLSAgICB1c2luZyBGbG9hdExpc3Qg
PSBWZWN0b3I8Y29uc3QgQm94Kj47Ci0gICAgc3RydWN0IExpbmVDb250ZW50IHsKLSAgICAgICAg
SW5saW5lSXRlbVJhbmdlIGlubGluZUl0ZW1SYW5nZTsKLSAgICAgICAgc2l6ZV90IHBhcnRpYWxU
cmFpbGluZ0NvbnRlbnRMZW5ndGggeyAwIH07Ci0gICAgICAgIE9wdGlvbmFsPElubGluZUxheW91
dFVuaXQ+IG92ZXJmbG93TG9naWNhbFdpZHRoOwotICAgICAgICBjb25zdCBGbG9hdExpc3QmIGZs
b2F0czsKLSAgICAgICAgYm9vbCBoYXNJbnRydXNpdmVGbG9hdCB7IGZhbHNlIH07Ci0gICAgICAg
IElubGluZUxheW91dFBvaW50IGxvZ2ljYWxUb3BMZWZ0OwotICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IGxpbmVMb2dpY2FsV2lkdGg7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgY29udGVudExv
Z2ljYWxXaWR0aDsKLSAgICAgICAgYm9vbCBpc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQgeyB0
cnVlIH07Ci0gICAgICAgIHNpemVfdCBub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQgeyAw
IH07Ci0gICAgICAgIGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnM7Ci0gICAgfTsKLSAgICBMaW5l
Q29udGVudCBsYXlvdXRJbmxpbmVDb250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5nZSYsIHNpemVf
dCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+
IGxlYWRpbmdMb2dpY2FsV2lkdGgsIGNvbnN0IElubGluZVJlY3QmIGluaXRpYWxMaW5lTG9naWNh
bFJlY3QsIGJvb2wgaXNGaXJzdExpbmUpOwotCi0gICAgc3RydWN0IEludHJpbnNpY0NvbnRlbnQg
ewotICAgICAgICBJbmxpbmVJdGVtUmFuZ2UgaW5saW5lSXRlbVJhbmdlOwotICAgICAgICBJbmxp
bmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICAgICAgY29uc3QgRmxvYXRMaXN0
JiBmbG9hdHM7Ci0gICAgfTsKLSAgICBJbnRyaW5zaWNDb250ZW50IGNvbXB1dGVkSW50cmluc2lj
V2lkdGgoY29uc3QgSW5saW5lSXRlbVJhbmdlJiwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVX
aWR0aCk7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBjYW5kaWRhdGVDb250ZW50Rm9yTGluZShMaW5l
Q2FuZGlkYXRlJiwgc2l6ZV90IGlubGluZUl0ZW1JbmRleCwgY29uc3QgSW5saW5lSXRlbVJhbmdl
JiBuZWVkc0xheW91dFJhbmdlLCBzaXplX3Qgb3ZlcmZsb3dMZW5ndGgsIE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgsIElubGluZUxheW91dFVuaXQgY3VycmVu
dExvZ2ljYWxSaWdodCk7Ci0gICAgc2l6ZV90IG5leHRXcmFwT3Bwb3J0dW5pdHkoc2l6ZV90IHN0
YXJ0SW5kZXgsIGNvbnN0IExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdl
KSBjb25zdDsKLQotICAgIHN0cnVjdCBSZXN1bHQgewotICAgICAgICBJbmxpbmVDb250ZW50QnJl
YWtlcjo6SXNFbmRPZkxpbmUgaXNFbmRPZkxpbmUgeyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNF
bmRPZkxpbmU6Ok5vIH07Ci0gICAgICAgIHN0cnVjdCBDb21taXR0ZWRDb250ZW50Q291bnQgewot
ICAgICAgICAgICAgc2l6ZV90IHZhbHVlIHsgMCB9OwotICAgICAgICAgICAgYm9vbCBpc1JldmVy
dCB7IGZhbHNlIH07Ci0gICAgICAgIH07Ci0gICAgICAgIENvbW1pdHRlZENvbnRlbnRDb3VudCBj
b21taXR0ZWRDb3VudCB7IH07Ci0gICAgICAgIHNpemVfdCBwYXJ0aWFsVHJhaWxpbmdDb250ZW50
TGVuZ3RoIHsgMCB9OwotICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxv
d0xvZ2ljYWxXaWR0aCB7IH07Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVXNlZENvbnN0cmFpbnRzIHsK
LSAgICAgICAgSW5saW5lUmVjdCBsb2dpY2FsUmVjdDsKLSAgICAgICAgYm9vbCBpc0NvbnN0cmFp
bmVkQnlGbG9hdCB7IGZhbHNlIH07Ci0gICAgfTsKLSAgICBVc2VkQ29uc3RyYWludHMgaW5pdGlh
bENvbnN0cmFpbnRzRm9yTGluZShjb25zdCBJbmxpbmVSZWN0JiBpbml0aWFsTGluZUxvZ2ljYWxS
ZWN0LCBib29sIGlzRmlyc3RMaW5lKSBjb25zdDsKLSAgICBPcHRpb25hbDxIb3Jpem9udGFsQ29u
c3RyYWludHM+IGZsb2F0Q29uc3RyYWludHMoY29uc3QgSW5saW5lUmVjdCYgbGluZUxvZ2ljYWxS
ZWN0KSBjb25zdDsKLQotICAgIHZvaWQgaGFuZGxlRmxvYXRDb250ZW50KGNvbnN0IElubGluZUl0
ZW0mKTsKLSAgICBSZXN1bHQgaGFuZGxlSW5saW5lQ29udGVudChJbmxpbmVDb250ZW50QnJlYWtl
ciYsIGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgY29uc3QgTGluZUNh
bmRpZGF0ZSYpOwotICAgIHNpemVfdCByZWJ1aWxkTGluZShjb25zdCBJbmxpbmVJdGVtUmFuZ2Um
IG5lZWRzTGF5b3V0UmFuZ2UsIGNvbnN0IElubGluZUl0ZW0mIGxhc3RJbmxpbmVJdGVtVG9BZGQp
OwotICAgIHNpemVfdCByZWJ1aWxkTGluZUZvclRyYWlsaW5nU29mdEh5cGhlbihjb25zdCBJbmxp
bmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlKTsKLSAgICB2b2lkIGNvbW1pdFBhcnRpYWxDb250ZW50
KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudDo6UnVuTGlzdCYs
IGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OlBhcnRpYWxUcmFpbGluZ0NvbnRl
bnQmKTsKLSAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgVXNlZENvbnN0cmFpbnRzJik7Ci0gICAg
c3RydWN0IENvbW1pdHRlZENvbnRlbnQgewotICAgICAgICBzaXplX3QgaW5saW5lSXRlbUNvdW50
IHsgMCB9OwotICAgICAgICBzaXplX3QgcGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCB7IDAg
fTsKLSAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gb3ZlcmZsb3dMb2dpY2FsV2lk
dGggeyB9OwotICAgIH07Ci0gICAgQ29tbWl0dGVkQ29udGVudCBwbGFjZUlubGluZUNvbnRlbnQo
Y29uc3QgSW5saW5lSXRlbVJhbmdlJiwgc2l6ZV90IHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0
aCwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gb3ZlcmZsb3dMb2dpY2FsV2lkdGgpOwotICAg
IElubGluZUl0ZW1SYW5nZSBjbG9zZShjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0
UmFuZ2UsIGNvbnN0IENvbW1pdHRlZENvbnRlbnQmKTsKLQotICAgIElubGluZUxheW91dFVuaXQg
aW5saW5lSXRlbVdpZHRoKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRl
bnRMb2dpY2FsTGVmdCkgY29uc3Q7Ci0gICAgYm9vbCBpc0xhc3RMaW5lV2l0aElubGluZUNvbnRl
bnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsaW5lUmFuZ2UsIHNpemVfdCBsYXN0SW5saW5lSXRl
bUluZGV4LCBib29sIGhhc1BhcnRpYWxUcmFpbGluZ0NvbnRlbnQpIGNvbnN0OwotCi0gICAgY29u
c3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyBy
ZXR1cm4gbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsgfQotICAgIElubGluZUZvcm1hdHRpbmdT
dGF0ZSogZm9ybWF0dGluZ1N0YXRlKCkgeyByZXR1cm4gbV9pbmxpbmVGb3JtYXR0aW5nU3RhdGU7
IH0KLSAgICBGbG9hdGluZ1N0YXRlKiBmbG9hdGluZ1N0YXRlKCkgeyByZXR1cm4gbV9mbG9hdGlu
Z1N0YXRlOyB9Ci0gICAgY29uc3QgRmxvYXRpbmdTdGF0ZSogZmxvYXRpbmdTdGF0ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fZmxvYXRpbmdTdGF0ZTsgfQotICAgIGNvbnN0IENvbnRhaW5lckJveCYgcm9v
dCgpIGNvbnN0OwotICAgIGNvbnN0IExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0Owot
Ci0gICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIG1faW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQ7Ci0gICAgSW5saW5lRm9ybWF0dGluZ1N0YXRlKiBtX2lubGluZUZvcm1hdHRpbmdTdGF0
ZSB7IG51bGxwdHIgfTsKLSAgICBGbG9hdGluZ1N0YXRlKiBtX2Zsb2F0aW5nU3RhdGUgeyBudWxs
cHRyIH07Ci0gICAgT3B0aW9uYWw8SG9yaXpvbnRhbENvbnN0cmFpbnRzPiBtX3Jvb3RIb3Jpem9u
dGFsQ29uc3RyYWludHM7Ci0KLSAgICBMaW5lIG1fbGluZTsKLSAgICBJbmxpbmVSZWN0IG1fbGlu
ZUxvZ2ljYWxSZWN0OwotICAgIGNvbnN0IElubGluZUl0ZW1zJiBtX2lubGluZUl0ZW1zOwotICAg
IEZsb2F0TGlzdCBtX2Zsb2F0czsKLSAgICBPcHRpb25hbDxJbmxpbmVUZXh0SXRlbT4gbV9wYXJ0
aWFsTGVhZGluZ1RleHRJdGVtOwotICAgIFZlY3Rvcjxjb25zdCBJbmxpbmVJdGVtKj4gbV93cmFw
T3Bwb3J0dW5pdHlMaXN0OwotICAgIHVuc2lnbmVkIG1fc3VjY2Vzc2l2ZUh5cGhlbmF0ZWRMaW5l
Q291bnQgeyAwIH07Ci0gICAgYm9vbCBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdCB7IGZh
bHNlIH07Ci19OwotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVHZW9tZXRyeS5oIGIvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUdlb21ldHJ5LmgKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTJjNThhMDc2ZTQ5YzJjZDNjOWUyZjkyYWIzNmQwM2Yy
NzI5ZTUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUdlb21ldHJ5LmgK
KysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIw
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
Ci0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNl
Ci0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIklu
bGluZVJlY3QuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0K
LWNsYXNzIElubGluZUxpbmVHZW9tZXRyeSB7Ci0gICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7
Ci1wdWJsaWM6Ci0gICAgc3RydWN0IEVuY2xvc2luZ1RvcEFuZEJvdHRvbSB7Ci0gICAgICAgIC8v
IFRoaXMgdmFsdWVzIGVuY2xvc2VzIHRoZSByb290IGlubGluZSBib3ggYW5kIGFueSBvdGhlciBp
bmxpbmUgbGV2ZWwgYm94J3MgYm9yZGVyIGJveC4KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB0
b3AgeyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgYm90dG9tIHsgMCB9OwotICAgIH07
Ci0gICAgSW5saW5lTGluZUdlb21ldHJ5KGNvbnN0IElubGluZVJlY3QmIGxpbmVCb3hMb2dpY2Fs
UmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tLCBJbmxpbmVMYXlvdXRVbml0IGFsaWdtZW50QmFz
ZWxpbmUsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRV
bml0IGNvbnRlbnRMb2dpY2FsV2lkdGgpOwotCi0gICAgY29uc3QgSW5saW5lUmVjdCYgbGluZUJv
eExvZ2ljYWxSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94TG9naWNhbFJlY3Q7IH0KLQot
ICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBlbmNsb3NpbmdUb3BBbmRCb3R0b20oKSBjb25zdCB7
IHJldHVybiBtX2VuY2xvc2luZ1RvcEFuZEJvdHRvbTsgfQotCi0gICAgSW5saW5lTGF5b3V0VW5p
dCBiYXNlbGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fYWxpZ21lbnRCYXNlbGluZTsgfQotCi0gICAg
SW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQoKSBjb25zdCB7IHJldHVybiBtX2Nv
bnRlbnRMb2dpY2FsTGVmdDsgfQotICAgIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxX
aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudExvZ2ljYWxXaWR0aDsgfQotCi0gICAgdm9p
ZCBtb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkgeyBtX2xpbmVCb3hMb2dp
Y2FsUmVjdC5tb3ZlVmVydGljYWxseShvZmZzZXQpOyB9Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhp
cyBpcyBsaW5lIGJveCBnZW9tZXRyeSAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5s
aW5lLTMvI2xpbmUtYm94KS4KLSAgICBJbmxpbmVSZWN0IG1fbGluZUJveExvZ2ljYWxSZWN0Owot
ICAgIC8vIEVuY2xvc2luZyB0b3AgYW5kIGJvdHRvbSBpbmNsdWRlcyBhbGwgaW5saW5lIGxldmVs
IGJveGVzIChib3JkZXIgYm94KSB2ZXJ0aWNhbGx5LgotICAgIC8vIFdoaWxlIHRoZSBsaW5lIGJv
eCB1c3VhbGx5IGVuY2xvc2UgdGhlbSBhcyB3ZWxsLCBpdHMgdmVydGljYWwgZ2VvbWV0cnkgaXMg
YmFzZWQgb24KLSAgICAvLyB0aGUgbGF5b3V0IGJvdW5kcyBvZiB0aGUgaW5saW5lIGxldmVsIGJv
eGVzIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgd2hlbiBsaW5lLWhlaWdodCBpcyBwcmVzZW50Lgot
ICAgIEVuY2xvc2luZ1RvcEFuZEJvdHRvbSBtX2VuY2xvc2luZ1RvcEFuZEJvdHRvbTsKLSAgICBJ
bmxpbmVMYXlvdXRVbml0IG1fYWxpZ21lbnRCYXNlbGluZSB7IDAgfTsKLSAgICBJbmxpbmVMYXlv
dXRVbml0IG1fY29udGVudExvZ2ljYWxMZWZ0IHsgMCB9OwotICAgIElubGluZUxheW91dFVuaXQg
bV9jb250ZW50TG9naWNhbFdpZHRoIHsgMCB9OwotfTsKLQotaW5saW5lIElubGluZUxpbmVHZW9t
ZXRyeTo6SW5saW5lTGluZUdlb21ldHJ5KGNvbnN0IElubGluZVJlY3QmIGxpbmVCb3hMb2dpY2Fs
UmVjdCwgRW5jbG9zaW5nVG9wQW5kQm90dG9tIGVuY2xvc2luZ1RvcEFuZEJvdHRvbSwgSW5saW5l
TGF5b3V0VW5pdCBhbGlnbWVudEJhc2VsaW5lLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dp
Y2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoKQotICAgIDogbV9s
aW5lQm94TG9naWNhbFJlY3QobGluZUJveExvZ2ljYWxSZWN0KQotICAgICwgbV9lbmNsb3NpbmdU
b3BBbmRCb3R0b20oZW5jbG9zaW5nVG9wQW5kQm90dG9tKQotICAgICwgbV9hbGlnbWVudEJhc2Vs
aW5lKGFsaWdtZW50QmFzZWxpbmUpCi0gICAgLCBtX2NvbnRlbnRMb2dpY2FsTGVmdChjb250ZW50
TG9naWNhbExlZnQpCi0gICAgLCBtX2NvbnRlbnRMb2dpY2FsV2lkdGgoY29udGVudExvZ2ljYWxX
aWR0aCkKLXsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVSdW4uaCBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVSdW4uaApkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMGIwZWUxNGRlZDBiZTJjY2Q1MmQzNDMzYjA4ODQ1NDZjMWYwZDJiMi4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lUnVuLmgKKysrIC9kZXYvbnVs
bApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAq
IGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5B
QkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJJbmxpbmVSZWN0Lmgi
Ci0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiVGV4dEZsYWdzLmgiCi0KLW5hbWVz
cGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1zdHJ1Y3QgTGluZVJ1biB7Ci0g
ICAgV1RGX01BS0VfU1RSVUNUX0ZBU1RfQUxMT0NBVEVEOwotICAgIHN0cnVjdCBUZXh0IHsKLSAg
ICAgICAgV1RGX01BS0VfU1RSVUNUX0ZBU1RfQUxMT0NBVEVEOwotICAgIHB1YmxpYzoKLSAgICAg
ICAgVGV4dChzaXplX3QgcG9zaXRpb24sIHNpemVfdCBsZW5ndGgsIGNvbnN0IFN0cmluZyYpOwot
Ci0gICAgICAgIHNpemVfdCBzdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnQ7IH0KLSAgICAg
ICAgc2l6ZV90IGVuZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0KCkgKyBsZW5ndGgoKTsgfQotICAg
ICAgICBzaXplX3QgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9sZW5ndGg7IH0KLSAgICAgICAg
U3RyaW5nIGNvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRTdHJpbmc7IH0KLQotICAg
ICAgICBib29sIG5lZWRzSHlwaGVuKCkgY29uc3QgeyByZXR1cm4gbV9uZWVkc0h5cGhlbjsgfQot
ICAgICAgICB2b2lkIHNldE5lZWRzSHlwaGVuKCkgeyBtX25lZWRzSHlwaGVuID0gdHJ1ZTsgfQot
Ci0gICAgICAgIHZvaWQgZXhwYW5kKHNpemVfdCBkZWx0YSkgeyBtX2xlbmd0aCArPSBkZWx0YTsg
fQotICAgICAgICB2b2lkIHNocmluayhzaXplX3QgZGVsdGEpIHsgbV9sZW5ndGggLT0gZGVsdGE7
IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNpemVfdCBtX3N0YXJ0IHsgMCB9OwotICAgICAg
ICBzaXplX3QgbV9sZW5ndGggeyAwIH07Ci0gICAgICAgIGJvb2wgbV9uZWVkc0h5cGhlbiB7IGZh
bHNlIH07Ci0gICAgICAgIFN0cmluZyBtX2NvbnRlbnRTdHJpbmc7Ci0gICAgfTsKLQotICAgIHN0
cnVjdCBFeHBhbnNpb247Ci0gICAgTGluZVJ1bihzaXplX3QgbGluZUluZGV4LCBjb25zdCBCb3gm
LCBjb25zdCBJbmxpbmVSZWN0JiwgRXhwYW5zaW9uLCBPcHRpb25hbDxUZXh0PiA9IFdURjo6bnVs
bG9wdCk7Ci0KLSAgICBjb25zdCBJbmxpbmVSZWN0JiBsb2dpY2FsUmVjdCgpIGNvbnN0IHsgcmV0
dXJuIG1fbG9naWNhbFJlY3Q7IH0KLQotICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFRvcCgp
IGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkudG9wKCk7IH0KLSAgICBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxCb3R0b20oKSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVjdCgpLmJvdHRvbSgp
OyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgpIGNvbnN0IHsgcmV0dXJuIGxv
Z2ljYWxSZWN0KCkubGVmdCgpOyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsUmlnaHQo
KSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVjdCgpLnJpZ2h0KCk7IH0KLQotICAgIElubGluZUxh
eW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS53aWR0
aCgpOyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KCkgY29uc3QgeyByZXR1
cm4gbG9naWNhbFJlY3QoKS5oZWlnaHQoKTsgfQotCi0gICAgdm9pZCBtb3ZlVmVydGljYWxseShJ
bmxpbmVMYXlvdXRVbml0IG9mZnNldCkgeyBtX2xvZ2ljYWxSZWN0Lm1vdmVWZXJ0aWNhbGx5KG9m
ZnNldCk7IH0KLSAgICBPcHRpb25hbDxUZXh0PiYgdGV4dCgpIHsgcmV0dXJuIG1fdGV4dDsgfQot
ICAgIGNvbnN0IE9wdGlvbmFsPFRleHQ+JiB0ZXh0KCkgY29uc3QgeyByZXR1cm4gbV90ZXh0OyB9
Ci0KLSAgICBzdHJ1Y3QgRXhwYW5zaW9uIHsKLSAgICAgICAgRXhwYW5zaW9uQmVoYXZpb3IgYmVo
YXZpb3IgeyBEZWZhdWx0RXhwYW5zaW9uIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgaG9y
aXpvbnRhbEV4cGFuc2lvbiB7IDAgfTsKLSAgICB9OwotICAgIEV4cGFuc2lvbiBleHBhbnNpb24o
KSBjb25zdCB7IHJldHVybiBtX2V4cGFuc2lvbjsgfQotCi0gICAgY29uc3QgQm94JiBsYXlvdXRC
b3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRCb3g7IH0KLSAgICBzaXplX3QgbGluZUluZGV4
KCkgY29uc3QgeyByZXR1cm4gbV9saW5lSW5kZXg7IH0KLQotcHJpdmF0ZToKLSAgICBjb25zdCBz
aXplX3QgbV9saW5lSW5kZXg7Ci0gICAgV2Vha1B0cjxjb25zdCBMYXlvdXQ6OkJveD4gbV9sYXlv
dXRCb3g7Ci0gICAgSW5saW5lUmVjdCBtX2xvZ2ljYWxSZWN0OwotICAgIEV4cGFuc2lvbiBtX2V4
cGFuc2lvbjsKLSAgICBPcHRpb25hbDxUZXh0PiBtX3RleHQ7Ci19OwotCi1pbmxpbmUgTGluZVJ1
bjo6TGluZVJ1bihzaXplX3QgbGluZUluZGV4LCBjb25zdCBMYXlvdXQ6OkJveCYgbGF5b3V0Qm94
LCBjb25zdCBJbmxpbmVSZWN0JiBsb2dpY2FsUmVjdCwgRXhwYW5zaW9uIGV4cGFuc2lvbiwgT3B0
aW9uYWw8VGV4dD4gdGV4dCkKLSAgICA6IG1fbGluZUluZGV4KGxpbmVJbmRleCkKLSAgICAsIG1f
bGF5b3V0Qm94KG1ha2VXZWFrUHRyKGxheW91dEJveCkpCi0gICAgLCBtX2xvZ2ljYWxSZWN0KGxv
Z2ljYWxSZWN0KQotICAgICwgbV9leHBhbnNpb24oZXhwYW5zaW9uKQotICAgICwgbV90ZXh0KHRl
eHQpCi17Ci19Ci0KLWlubGluZSBMaW5lUnVuOjpUZXh0OjpUZXh0KHNpemVfdCBzdGFydCwgc2l6
ZV90IGxlbmd0aCwgY29uc3QgU3RyaW5nJiBjb250ZW50U3RyaW5nKQotICAgIDogbV9zdGFydChz
dGFydCkKLSAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKLSAgICAsIG1fY29udGVudFN0cmluZyhjb250
ZW50U3RyaW5nKQotewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVJlY3QuaCBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVJlY3QuaApkZWxldGVkIGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggYWNkMDlhYjFlNzEwMWFhNmVjZjQzM2QyNjQwMDRmZmU4ZmI3YThjNC4uMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVSZWN0LmgKKysrIC9kZXYvbnVsbApAQCAt
MSwyOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBt
ZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKExB
WU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgotCi1u
YW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgSW5saW5lUmVj
dCB7Ci1wdWJsaWM6Ci0gICAgSW5saW5lUmVjdCgpID0gZGVmYXVsdDsKLSAgICBJbmxpbmVSZWN0
KElubGluZUxheW91dFVuaXQgdG9wLCBJbmxpbmVMYXlvdXRVbml0IGxlZnQsIElubGluZUxheW91
dFVuaXQgd2lkdGgsIElubGluZUxheW91dFVuaXQgaGVpZ2h0KTsKLSAgICBJbmxpbmVSZWN0KGNv
bnN0IElubGluZUxheW91dFBvaW50JiB0b3BMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IHdpZHRoLCBJ
bmxpbmVMYXlvdXRVbml0IGhlaWdodCk7Ci0gICAgSW5saW5lUmVjdChjb25zdCBJbmxpbmVMYXlv
dXRQb2ludCYgdG9wTGVmdCwgY29uc3QgSW5saW5lTGF5b3V0U2l6ZSYpOwotICAgIAotICAgIElu
bGluZUxheW91dFVuaXQgdG9wKCkgY29uc3Q7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsZWZ0KCkg
Y29uc3Q7Ci0gICAgSW5saW5lTGF5b3V0UG9pbnQgdG9wTGVmdCgpIGNvbnN0OwotCi0gICAgSW5s
aW5lTGF5b3V0VW5pdCBib3R0b20oKSBjb25zdDsKLSAgICBJbmxpbmVMYXlvdXRVbml0IHJpZ2h0
KCkgY29uc3Q7ICAgICAgICAKLQotICAgIElubGluZUxheW91dFVuaXQgd2lkdGgoKSBjb25zdDsK
LSAgICBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCgpIGNvbnN0OwotICAgIElubGluZUxheW91dFNp
emUgc2l6ZSgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRUb3AoSW5saW5lTGF5b3V0VW5pdCk7Ci0g
ICAgdm9pZCBzZXRCb3R0b20oSW5saW5lTGF5b3V0VW5pdCk7Ci0gICAgdm9pZCBzZXRMZWZ0KElu
bGluZUxheW91dFVuaXQpOwotICAgIHZvaWQgc2V0VG9wTGVmdChjb25zdCBJbmxpbmVMYXlvdXRQ
b2ludCYpOwotICAgIHZvaWQgc2V0V2lkdGgoSW5saW5lTGF5b3V0VW5pdCk7Ci0gICAgdm9pZCBz
ZXRIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCk7Ci0KLSAgICB2b2lkIG1vdmVIb3Jpem9udGFsbHko
SW5saW5lTGF5b3V0VW5pdCk7Ci0gICAgdm9pZCBtb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRV
bml0KTsKLSAgICB2b2lkIG1vdmVCeShJbmxpbmVMYXlvdXRQb2ludCk7Ci0KLSAgICB2b2lkIGV4
cGFuZChPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5p
dD4pOwotICAgIHZvaWQgZXhwYW5kVG9Db250YWluKGNvbnN0IElubGluZVJlY3QmKTsKLSAgICB2
b2lkIGV4cGFuZEhvcml6b250YWxseShJbmxpbmVMYXlvdXRVbml0IGRlbHRhKSB7IGV4cGFuZChk
ZWx0YSwgeyB9KTsgfQotICAgIHZvaWQgZXhwYW5kVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0
IGRlbHRhKSB7IGV4cGFuZCh7IH0sIGRlbHRhKTsgfQotICAgIHZvaWQgZXhwYW5kVmVydGljYWxs
eVRvQ29udGFpbihjb25zdCBJbmxpbmVSZWN0Jik7Ci0gICAgdm9pZCBpbmZsYXRlKElubGluZUxh
eW91dFVuaXQpOwotCi0gICAgb3BlcmF0b3IgSW5saW5lTGF5b3V0UmVjdCgpIGNvbnN0OwotCi1w
cml2YXRlOgotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAgdm9pZCBpbnZhbGlkYXRlVG9wKCkgeyBt
X2hhc1ZhbGlkVG9wID0gZmFsc2U7IH0KLSAgICB2b2lkIGludmFsaWRhdGVMZWZ0KCkgeyBtX2hh
c1ZhbGlkTGVmdCA9IGZhbHNlOyB9Ci0gICAgdm9pZCBpbnZhbGlkYXRlV2lkdGgoKSB7IG1faGFz
VmFsaWRXaWR0aCA9IGZhbHNlOyB9Ci0gICAgdm9pZCBpbnZhbGlkYXRlSGVpZ2h0KCkgeyBtX2hh
c1ZhbGlkSGVpZ2h0ID0gZmFsc2U7IH0KLSAgICB2b2lkIGludmFsaWRhdGVQb3NpdGlvbigpOwot
Ci0gICAgYm9vbCBoYXNWYWxpZFBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9oYXNWYWxpZFRv
cCAmJiBtX2hhc1ZhbGlkTGVmdDsgfQotICAgIGJvb2wgaGFzVmFsaWRTaXplKCkgY29uc3QgeyBy
ZXR1cm4gbV9oYXNWYWxpZFdpZHRoICYmIG1faGFzVmFsaWRIZWlnaHQ7IH0KLSAgICBib29sIGhh
c1ZhbGlkR2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBoYXNWYWxpZFBvc2l0aW9uKCkgJiYgaGFz
VmFsaWRTaXplKCk7IH0KLQotICAgIHZvaWQgc2V0SGFzVmFsaWRQb3NpdGlvbigpOwotICAgIHZv
aWQgc2V0SGFzVmFsaWRTaXplKCk7Ci0KLSAgICBib29sIG1faGFzVmFsaWRUb3AgeyBmYWxzZSB9
OwotICAgIGJvb2wgbV9oYXNWYWxpZExlZnQgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9oYXNWYWxp
ZFdpZHRoIHsgZmFsc2UgfTsKLSAgICBib29sIG1faGFzVmFsaWRIZWlnaHQgeyBmYWxzZSB9Owot
I2VuZGlmIC8vIEFTU0VSVF9FTkFCTEVECi0gICAgSW5saW5lTGF5b3V0UmVjdCBtX3JlY3Q7Ci19
OwotCi1pbmxpbmUgSW5saW5lUmVjdDo6SW5saW5lUmVjdChJbmxpbmVMYXlvdXRVbml0IHRvcCwg
SW5saW5lTGF5b3V0VW5pdCBsZWZ0LCBJbmxpbmVMYXlvdXRVbml0IHdpZHRoLCBJbmxpbmVMYXlv
dXRVbml0IGhlaWdodCkKLSAgICA6IG1fcmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpCi17
Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICBtX2hhc1ZhbGlkVG9wID0gdHJ1ZTsKLSAgICBtX2hh
c1ZhbGlkTGVmdCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZFdpZHRoID0gdHJ1ZTsKLSAgICBtX2hh
c1ZhbGlkSGVpZ2h0ID0gdHJ1ZTsKLSNlbmRpZgotfQotCi1pbmxpbmUgSW5saW5lUmVjdDo6SW5s
aW5lUmVjdChjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgdG9wTGVmdCwgSW5saW5lTGF5b3V0VW5p
dCB3aWR0aCwgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQpCi0gICAgOiBJbmxpbmVSZWN0KHRvcExl
ZnQueSgpLCB0b3BMZWZ0LngoKSwgd2lkdGgsIGhlaWdodCkKLXsKLX0KLQotaW5saW5lIElubGlu
ZVJlY3Q6OklubGluZVJlY3QoY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIHRvcExlZnQsIGNvbnN0
IElubGluZUxheW91dFNpemUmIHNpemUpCi0gICAgOiBJbmxpbmVSZWN0KHRvcExlZnQueSgpLCB0
b3BMZWZ0LngoKSwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKQotewotfQotCi0jaWYgQVNT
RVJUX0VOQUJMRUQKLWlubGluZSB2b2lkIElubGluZVJlY3Q6OmludmFsaWRhdGVQb3NpdGlvbigp
Ci17Ci0gICAgaW52YWxpZGF0ZVRvcCgpOwotICAgIGludmFsaWRhdGVMZWZ0KCk7Ci19Ci0KLWlu
bGluZSB2b2lkIElubGluZVJlY3Q6OnNldEhhc1ZhbGlkUG9zaXRpb24oKQotewotICAgIG1faGFz
VmFsaWRUb3AgPSB0cnVlOwotICAgIG1faGFzVmFsaWRMZWZ0ID0gdHJ1ZTsKLX0KLQotaW5saW5l
IHZvaWQgSW5saW5lUmVjdDo6c2V0SGFzVmFsaWRTaXplKCkKLXsKLSAgICBtX2hhc1ZhbGlkV2lk
dGggPSB0cnVlOwotICAgIG1faGFzVmFsaWRIZWlnaHQgPSB0cnVlOwotfQotI2VuZGlmIC8vIEFT
U0VSVF9FTkFCTEVECi0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0IElubGluZVJlY3Q6OnRvcCgp
IGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRUb3ApOwotICAgIHJldHVybiBtX3JlY3Qu
eSgpOwotfQotCi1pbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVSZWN0OjpsZWZ0KCkgY29u
c3QKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZExlZnQpOwotICAgIHJldHVybiBtX3JlY3QueCgp
OwotfQotCi1pbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVSZWN0Ojpib3R0b20oKSBjb25z
dAotewotICAgIEFTU0VSVChtX2hhc1ZhbGlkVG9wICYmIG1faGFzVmFsaWRIZWlnaHQpOwotICAg
IHJldHVybiBtX3JlY3QubWF4WSgpOwotfQotCi1pbmxpbmUgSW5saW5lTGF5b3V0VW5pdCBJbmxp
bmVSZWN0OjpyaWdodCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRMZWZ0ICYmIG1f
aGFzVmFsaWRXaWR0aCk7Ci0gICAgcmV0dXJuIG1fcmVjdC5tYXhYKCk7Ci19Ci0KLWlubGluZSBJ
bmxpbmVMYXlvdXRQb2ludCBJbmxpbmVSZWN0Ojp0b3BMZWZ0KCkgY29uc3QKLXsKLSAgICBBU1NF
UlQoaGFzVmFsaWRQb3NpdGlvbigpKTsKLSAgICByZXR1cm4gbV9yZWN0Lm1pblhNaW5ZQ29ybmVy
KCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRTaXplIElubGluZVJlY3Q6OnNpemUoKSBjb25z
dAotewotICAgIEFTU0VSVChoYXNWYWxpZFNpemUoKSk7Ci0gICAgcmV0dXJuIG1fcmVjdC5zaXpl
KCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0IElubGluZVJlY3Q6OndpZHRoKCkgY29u
c3QKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZFdpZHRoKTsKLSAgICByZXR1cm4gbV9yZWN0Lndp
ZHRoKCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0IElubGluZVJlY3Q6OmhlaWdodCgp
IGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRIZWlnaHQpOwotICAgIHJldHVybiBtX3Jl
Y3QuaGVpZ2h0KCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OnNldFRvcExlZnQoY29u
c3QgSW5saW5lTGF5b3V0UG9pbnQmIHRvcExlZnQpCi17Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAg
ICBzZXRIYXNWYWxpZFBvc2l0aW9uKCk7Ci0jZW5kaWYKLSAgICBtX3JlY3Quc2V0TG9jYXRpb24o
dG9wTGVmdCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OnNldFRvcChJbmxpbmVMYXlv
dXRVbml0IHRvcCkKLXsKLSNpZiBBU1NFUlRfRU5BQkxFRAotICAgIG1faGFzVmFsaWRUb3AgPSB0
cnVlOwotI2VuZGlmCi0gICAgbV9yZWN0LnNldFkodG9wKTsKLX0KLQotaW5saW5lIHZvaWQgSW5s
aW5lUmVjdDo6c2V0Qm90dG9tKElubGluZUxheW91dFVuaXQgYm90dG9tKQotewotI2lmIEFTU0VS
VF9FTkFCTEVECi0gICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZEhlaWdo
dCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX3JlY3Quc2hpZnRNYXhZRWRnZVRvKGJvdHRvbSk7Ci19
Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OnNldExlZnQoSW5saW5lTGF5b3V0VW5pdCBsZWZ0
KQotewotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAgbV9oYXNWYWxpZExlZnQgPSB0cnVlOwotI2Vu
ZGlmCi0gICAgbV9yZWN0LnNldFgobGVmdCk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6
OnNldFdpZHRoKElubGluZUxheW91dFVuaXQgd2lkdGgpCi17Ci0jaWYgQVNTRVJUX0VOQUJMRUQK
LSAgICBtX2hhc1ZhbGlkV2lkdGggPSB0cnVlOwotI2VuZGlmCi0gICAgbV9yZWN0LnNldFdpZHRo
KHdpZHRoKTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0SGVpZ2h0KElubGluZUxh
eW91dFVuaXQgaGVpZ2h0KQotewotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAgbV9oYXNWYWxpZEhl
aWdodCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX3JlY3Quc2V0SGVpZ2h0KGhlaWdodCk7Ci19Ci0K
LWlubGluZSB2b2lkIElubGluZVJlY3Q6Om1vdmVIb3Jpem9udGFsbHkoSW5saW5lTGF5b3V0VW5p
dCBvZmZzZXQpCi17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRMZWZ0KTsKLSAgICBtX3JlY3QubW92
ZShJbmxpbmVMYXlvdXRTaXplIHsgb2Zmc2V0LCAwIH0pOwotfQotCi1pbmxpbmUgdm9pZCBJbmxp
bmVSZWN0Ojptb3ZlVmVydGljYWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkKLXsKLSAgICBB
U1NFUlQobV9oYXNWYWxpZFRvcCk7Ci0gICAgbV9yZWN0Lm1vdmUoSW5saW5lTGF5b3V0U2l6ZSB7
IDAsIG9mZnNldCB9KTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6bW92ZUJ5KElubGlu
ZUxheW91dFBvaW50IG9mZnNldCkKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZFRvcCk7Ci0gICAg
QVNTRVJUKG1faGFzVmFsaWRMZWZ0KTsKLSAgICBtX3JlY3QubW92ZUJ5KG9mZnNldCk7Ci19Ci0K
LWlubGluZSB2b2lkIElubGluZVJlY3Q6OmV4cGFuZChPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0
PiB3aWR0aCwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gaGVpZ2h0KQotewotICAgIEFTU0VS
VCghd2lkdGggfHwgbV9oYXNWYWxpZFdpZHRoKTsKLSAgICBBU1NFUlQoIWhlaWdodCB8fCBtX2hh
c1ZhbGlkSGVpZ2h0KTsKLSAgICBtX3JlY3QuZXhwYW5kKHdpZHRoLnZhbHVlT3IoMCksIGhlaWdo
dC52YWx1ZU9yKDApKTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6ZXhwYW5kVG9Db250
YWluKGNvbnN0IElubGluZVJlY3QmIG90aGVyKQotewotI2lmIEFTU0VSVF9FTkFCTEVECi0gICAg
bV9oYXNWYWxpZFRvcCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZExlZnQgPSB0cnVlOwotICAgIG1f
aGFzVmFsaWRXaWR0aCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZEhlaWdodCA9IHRydWU7Ci0jZW5k
aWYKLSAgICBtX3JlY3QudW5pdGVFdmVuSWZFbXB0eShvdGhlcik7Ci19Ci0KLWlubGluZSB2b2lk
IElubGluZVJlY3Q6OmV4cGFuZFZlcnRpY2FsbHlUb0NvbnRhaW4oY29uc3QgSW5saW5lUmVjdCYg
b3RoZXIpCi17Ci0gICAgYXV0byBjb250YWluVG9wID0gc3RkOjptaW4odG9wKCksIG90aGVyLnRv
cCgpKTsKLSAgICBhdXRvIGNvbnRhaW5Cb3R0b20gPSBzdGQ6Om1heChib3R0b20oKSwgb3RoZXIu
Ym90dG9tKCkpOwotICAgIHNldFRvcChjb250YWluVG9wKTsKLSAgICBzZXRCb3R0b20oY29udGFp
bkJvdHRvbSk7Ci19Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6OmluZmxhdGUoSW5saW5lTGF5
b3V0VW5pdCBpbmZsYXRlKQotewotICAgIEFTU0VSVChoYXNWYWxpZEdlb21ldHJ5KCkpOwotICAg
IG1fcmVjdC5pbmZsYXRlKGluZmxhdGUpOwotfQotCi1pbmxpbmUgSW5saW5lUmVjdDo6b3BlcmF0
b3IgSW5saW5lTGF5b3V0UmVjdCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGhhc1ZhbGlkR2VvbWV0
cnkoKSk7IAotICAgIHJldHVybiBtX3JlY3Q7Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lU29mdExpbmVC
cmVha0l0ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZVNvZnRMaW5lQnJlYWtJdGVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYTA2
ZmJjZGQxNzgyNDJiYWI1NDczYTk0YTEzYWMzMGJjNzk3MGIuLjAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2lubGluZWZv
cm1hdHRpbmcvSW5saW5lU29mdExpbmVCcmVha0l0ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDYx
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0Ogot
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
Ci0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
Ci0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgot
ICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRf
Rk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiSW5saW5lSXRlbS5oIgotCi1uYW1lc3Bh
Y2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgSW5saW5lU29mdExpbmVC
cmVha0l0ZW0gOiBwdWJsaWMgSW5saW5lSXRlbSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIElubGlu
ZVNvZnRMaW5lQnJlYWtJdGVtIGNyZWF0ZVNvZnRMaW5lQnJlYWtJdGVtKGNvbnN0IElubGluZVRl
eHRCb3gmLCB1bnNpZ25lZCBwb3NpdGlvbik7Ci0KLSAgICB1bnNpZ25lZCBwb3NpdGlvbigpIGNv
bnN0IHsgcmV0dXJuIG1fc3RhcnRPclBvc2l0aW9uOyB9Ci0gICAgY29uc3QgSW5saW5lVGV4dEJv
eCYgaW5saW5lVGV4dEJveCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PElubGluZVRleHRCb3g+
KGxheW91dEJveCgpKTsgfQotCi0gICAgSW5saW5lU29mdExpbmVCcmVha0l0ZW0oY29uc3QgSW5s
aW5lVGV4dEJveCYsIHVuc2lnbmVkIHBvc2l0aW9uKTsKLX07Ci0KLWlubGluZSBJbmxpbmVTb2Z0
TGluZUJyZWFrSXRlbSBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbTo6Y3JlYXRlU29mdExpbmVCcmVh
a0l0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgcG9zaXRp
b24pCi17Ci0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgcG9zaXRpb24gfTsKLX0KLQotaW5s
aW5lIElubGluZVNvZnRMaW5lQnJlYWtJdGVtOjpJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbShjb25z
dCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBwb3NpdGlvbikKLSAgICA6
IElubGluZUl0ZW0oaW5saW5lVGV4dEJveCwgVHlwZTo6U29mdExpbmVCcmVhaykKLXsKLSAgICBt
X3N0YXJ0T3JQb3NpdGlvbiA9IHBvc2l0aW9uOwotfQotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQ
RV9UUkFJVFNfSU5MSU5FX0lURU0oSW5saW5lU29mdExpbmVCcmVha0l0ZW0sIGlzU29mdExpbmVC
cmVhaygpKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9pbmxp
bmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggOWM3MzdhZjBiZGJhOTVhNWY0MDVlY2I0OTQ1ZmNjZDE5Y2Q4YmMzOS4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVUZXh0SXRlbS5jcHAKKysrIC9kZXYvbnVsbApA
QCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFy
ZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNs
dWRlICJJbmxpbmVUZXh0SXRlbS5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NP
TlRFWFQpCi0KLSNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgotI2luY2x1ZGUgIklubGluZVNvZnRM
aW5lQnJlYWtJdGVtLmgiCi0jaW5jbHVkZSAiVGV4dFV0aWwuaCIKLSNpbmNsdWRlIDx3dGYvdW5p
Y29kZS9DaGFyYWN0ZXJOYW1lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2Ug
TGF5b3V0IHsKLQotc3RhdGljX2Fzc2VydChzaXplb2YoSW5saW5lSXRlbSkgPT0gc2l6ZW9mKElu
bGluZVRleHRJdGVtKSwgIiIpOwotCi1zdHJ1Y3QgV2hpdGVzcGFjZUNvbnRlbnQgewotICAgIHNp
emVfdCBsZW5ndGggeyAwIH07Ci0gICAgYm9vbCBpc1dvcmRTZXBhcmF0b3IgeyB0cnVlIH07Ci19
Owotc3RhdGljIE9wdGlvbmFsPFdoaXRlc3BhY2VDb250ZW50PiBtb3ZlVG9OZXh0Tm9uV2hpdGVz
cGFjZVBvc2l0aW9uKGNvbnN0IFN0cmluZ1ZpZXcmIHRleHRDb250ZW50LCBzaXplX3Qgc3RhcnRQ
b3NpdGlvbiwgYm9vbCBwcmVzZXJ2ZU5ld2xpbmUsIGJvb2wgcHJlc2VydmVUYWIpCi17Ci0gICAg
YXV0byBoYXNXb3JkU2VwYXJhdG9yQ2hhcmFjdGVyID0gZmFsc2U7Ci0gICAgYXV0byBpc1doaXRl
c3BhY2VDaGFyYWN0ZXIgPSBbJl0oYXV0byBjaGFyYWN0ZXIpIHsKLSAgICAgICAgLy8gd2hpdGUg
c3BhY2UgcHJvY2Vzc2luZyBpbiBDU1MgYWZmZWN0cyBvbmx5IHRoZSBkb2N1bWVudCB3aGl0ZSBz
cGFjZSBjaGFyYWN0ZXJzOiBzcGFjZXMgKFUrMDAyMCksIHRhYnMgKFUrMDAwOSksIGFuZCBzZWdt
ZW50IGJyZWFrcy4KLSAgICAgICAgYXV0byBpc1RyZWF0ZWRBc1NwYWNlQ2hhcmFjdGVyID0gY2hh
cmFjdGVyID09IHNwYWNlIHx8IChjaGFyYWN0ZXIgPT0gbmV3bGluZUNoYXJhY3RlciAmJiAhcHJl
c2VydmVOZXdsaW5lKSB8fCAoY2hhcmFjdGVyID09IHRhYkNoYXJhY3RlciAmJiAhcHJlc2VydmVU
YWIpOwotICAgICAgICBoYXNXb3JkU2VwYXJhdG9yQ2hhcmFjdGVyID0gaGFzV29yZFNlcGFyYXRv
ckNoYXJhY3RlciB8fCBpc1RyZWF0ZWRBc1NwYWNlQ2hhcmFjdGVyOwotICAgICAgICByZXR1cm4g
aXNUcmVhdGVkQXNTcGFjZUNoYXJhY3RlciB8fCBjaGFyYWN0ZXIgPT0gdGFiQ2hhcmFjdGVyOwot
ICAgIH07Ci0gICAgYXV0byBuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uID0gc3RhcnRQb3NpdGlv
bjsKLSAgICB3aGlsZSAobmV4dE5vbldoaXRlU3BhY2VQb3NpdGlvbiA8IHRleHRDb250ZW50Lmxl
bmd0aCgpICYmIGlzV2hpdGVzcGFjZUNoYXJhY3Rlcih0ZXh0Q29udGVudFtuZXh0Tm9uV2hpdGVT
cGFjZVBvc2l0aW9uXSkpCi0gICAgICAgICsrbmV4dE5vbldoaXRlU3BhY2VQb3NpdGlvbjsKLSAg
ICByZXR1cm4gbmV4dE5vbldoaXRlU3BhY2VQb3NpdGlvbiA9PSBzdGFydFBvc2l0aW9uID8gV1RG
OjpudWxsb3B0IDogbWFrZU9wdGlvbmFsKFdoaXRlc3BhY2VDb250ZW50IHsgbmV4dE5vbldoaXRl
U3BhY2VQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24sIGhhc1dvcmRTZXBhcmF0b3JDaGFyYWN0ZXIg
fSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBtb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24odW5z
aWduZWQgc3RhcnRQb3NpdGlvbiwgTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiBsaW5lQnJlYWtJdGVy
YXRvciwgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKQotewotICAgIGF1dG8gdGV4dExlbmd0aCA9
IGxpbmVCcmVha0l0ZXJhdG9yLnN0cmluZ1ZpZXcoKS5sZW5ndGgoKTsKLSAgICBhdXRvIHN0YXJ0
UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uOwotICAgIHdo
aWxlIChzdGFydFBvc2l0aW9uRm9yTmV4dEJyZWFrYWJsZVBvc2l0aW9uIDwgdGV4dExlbmd0aCkg
ewotICAgICAgICBhdXRvIG5leHRCcmVha2FibGVQb3NpdGlvbiA9IFRleHRVdGlsOjpmaW5kTmV4
dEJyZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9uRm9yTmV4
dEJyZWFrYWJsZVBvc2l0aW9uLCBzdHlsZSk7Ci0gICAgICAgIC8vIE9mdGVudGltZXMgdGhlIG5l
eHQgYnJlYWthYmxlIHBvc2l0aW9uIGNvbWVzIGJhY2sgYXMgdGhlIHN0YXJ0IHBvc2l0aW9uICht
b3N0IG5vdGFibHkgaHlwaGVucykuCi0gICAgICAgIGlmIChuZXh0QnJlYWthYmxlUG9zaXRpb24g
IT0gc3RhcnRQb3NpdGlvbikKLSAgICAgICAgICAgIHJldHVybiBuZXh0QnJlYWthYmxlUG9zaXRp
b24gLSBzdGFydFBvc2l0aW9uOwotICAgICAgICArK3N0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWth
YmxlUG9zaXRpb247Ci0gICAgfQotICAgIHJldHVybiB0ZXh0TGVuZ3RoIC0gc3RhcnRQb3NpdGlv
bjsKLX0KLQotdm9pZCBJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlQW5kQXBwZW5kVGV4dEl0ZW1zKElu
bGluZUl0ZW1zJiBpbmxpbmVDb250ZW50LCBjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0
Qm94KQotewotICAgIGF1dG8gdGV4dCA9IGlubGluZVRleHRCb3guY29udGVudCgpOwotICAgIGlm
ICghdGV4dC5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIGlubGluZUNvbnRlbnQuYXBwZW5kKElu
bGluZVRleHRJdGVtOjpjcmVhdGVFbXB0eUl0ZW0oaW5saW5lVGV4dEJveCkpOwotCi0gICAgYXV0
byYgc3R5bGUgPSBpbmxpbmVUZXh0Qm94LnN0eWxlKCk7Ci0gICAgYXV0byYgZm9udCA9IHN0eWxl
LmZvbnRDYXNjYWRlKCk7Ci0gICAgYXV0byB3aGl0ZXNwYWNlQ29udGVudElzVHJlYXRlZEFzU2lu
Z2xlU3BhY2UgPSAhVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVU
ZXh0Qm94KTsKLSAgICBhdXRvIHNob3VsZFByZXNlcnZlTmV3bGluZSA9IFRleHRVdGlsOjpzaG91
bGRQcmVzZXJ2ZU5ld2xpbmUoaW5saW5lVGV4dEJveCk7Ci0gICAgYXV0byBsaW5lQnJlYWtJdGVy
YXRvciA9IExhenlMaW5lQnJlYWtJdGVyYXRvciB7IHRleHQsIHN0eWxlLmNvbXB1dGVkTG9jYWxl
KCksIFRleHRVdGlsOjpsaW5lQnJlYWtJdGVyYXRvck1vZGUoc3R5bGUubGluZUJyZWFrKCkpIH07
Ci0gICAgdW5zaWduZWQgY3VycmVudFBvc2l0aW9uID0gMDsKLQotICAgIGF1dG8gaW5saW5lSXRl
bVdpZHRoID0gWyZdKGF1dG8gc3RhcnRQb3NpdGlvbiwgYXV0byBsZW5ndGgpIC0+IE9wdGlvbmFs
PElubGluZUxheW91dFVuaXQ+IHsKLSAgICAgICAgaWYgKCFpbmxpbmVUZXh0Qm94LmNhblVzZVNp
bXBsaWZpZWRDb250ZW50TWVhc3VyaW5nKCkpCi0gICAgICAgICAgICByZXR1cm4geyB9OwotICAg
ICAgICByZXR1cm4gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRCb3gsIHN0YXJ0UG9zaXRpb24s
IHN0YXJ0UG9zaXRpb24gKyBsZW5ndGgsIHsgfSk7Ci0gICAgfTsKLQotICAgIHdoaWxlIChjdXJy
ZW50UG9zaXRpb24gPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgIGF1dG8gaXNTZWdtZW50QnJl
YWtDYW5kaWRhdGUgPSBbXShhdXRvIGNoYXJhY3RlcikgewotICAgICAgICAgICAgcmV0dXJuIGNo
YXJhY3RlciA9PSAnXG4nOwotICAgICAgICB9OwotCi0gICAgICAgIC8vIFNlZ21lbnQgYnJlYWtz
IHdpdGggcHJlc2VydmUgbmV3IGxpbmUgc3R5bGUgKHdoaXRlLXNwYWNlOiBwcmUsIHByZS13cmFw
LCBicmVhay1zcGFjZXMgYW5kIHByZS1saW5lKSBjb21wdXRlIHRvIGZvcmNlZCBsaW5lIGJyZWFr
LgotICAgICAgICBpZiAoaXNTZWdtZW50QnJlYWtDYW5kaWRhdGUodGV4dFtjdXJyZW50UG9zaXRp
b25dKSAmJiBzaG91bGRQcmVzZXJ2ZU5ld2xpbmUpIHsKLSAgICAgICAgICAgIGlubGluZUNvbnRl
bnQuYXBwZW5kKElubGluZVNvZnRMaW5lQnJlYWtJdGVtOjpjcmVhdGVTb2Z0TGluZUJyZWFrSXRl
bShpbmxpbmVUZXh0Qm94LCBjdXJyZW50UG9zaXRpb24pKTsKLSAgICAgICAgICAgICsrY3VycmVu
dFBvc2l0aW9uOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoYXV0byB3aGl0ZXNwYWNlQ29udGVudCA9IG1vdmVUb05leHROb25XaGl0ZXNwYWNlUG9zaXRp
b24odGV4dCwgY3VycmVudFBvc2l0aW9uLCBzaG91bGRQcmVzZXJ2ZU5ld2xpbmUsICF3aGl0ZXNw
YWNlQ29udGVudElzVHJlYXRlZEFzU2luZ2xlU3BhY2UpKSB7Ci0gICAgICAgICAgICBBU1NFUlQo
d2hpdGVzcGFjZUNvbnRlbnQtPmxlbmd0aCk7Ci0gICAgICAgICAgICBhdXRvIGFwcGVuZFdoaXRl
c3BhY2VJdGVtID0gWyZdIChhdXRvIHN0YXJ0UG9zaXRpb24sIGF1dG8gaXRlbUxlbmd0aCkgewot
ICAgICAgICAgICAgICAgIGF1dG8gc2ltcGxlU2luZ2xlV2hpdGVzcGFjZUNvbnRlbnQgPSBpbmxp
bmVUZXh0Qm94LmNhblVzZVNpbXBsaWZpZWRDb250ZW50TWVhc3VyaW5nKCkgJiYgKGl0ZW1MZW5n
dGggPT0gMSB8fCB3aGl0ZXNwYWNlQ29udGVudElzVHJlYXRlZEFzU2luZ2xlU3BhY2UpOwotICAg
ICAgICAgICAgICAgIGF1dG8gd2lkdGggPSBzaW1wbGVTaW5nbGVXaGl0ZXNwYWNlQ29udGVudCA/
IG1ha2VPcHRpb25hbChJbmxpbmVMYXlvdXRVbml0IHsgZm9udC5zcGFjZVdpZHRoKCkgfSkgOiBp
bmxpbmVJdGVtV2lkdGgoc3RhcnRQb3NpdGlvbiwgaXRlbUxlbmd0aCk7Ci0gICAgICAgICAgICAg
ICAgaW5saW5lQ29udGVudC5hcHBlbmQoSW5saW5lVGV4dEl0ZW06OmNyZWF0ZVdoaXRlc3BhY2VJ
dGVtKGlubGluZVRleHRCb3gsIHN0YXJ0UG9zaXRpb24sIGl0ZW1MZW5ndGgsIHdoaXRlc3BhY2VD
b250ZW50LT5pc1dvcmRTZXBhcmF0b3IsIHdpZHRoKSk7Ci0gICAgICAgICAgICB9OwotICAgICAg
ICAgICAgaWYgKHN0eWxlLndoaXRlU3BhY2UoKSA9PSBXaGl0ZVNwYWNlOjpCcmVha1NwYWNlcykg
ewotICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3
aGl0ZS1zcGFjZS1waGFzZS0xCi0gICAgICAgICAgICAgICAgLy8gRm9yIGJyZWFrLXNwYWNlcywg
YSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgZXhpc3RzIGFmdGVyIGV2ZXJ5IHNwYWNlIGFuZCBldmVy
eSB0YWIuCi0gICAgICAgICAgICAgICAgLy8gRklYTUU6IGlmIHRoaXMgdHVybnMgb3V0IHRvIGJl
IGEgcGVyZiBoaXQgd2l0aCB0b28gbWFueSBpbmRpdmlkdWFsIHdoaXRlc3BhY2UgaW5saW5lIGl0
ZW1zLCB3ZSBzaG91bGQgdHJhbnNpdGlvbiB0aGlzIGxvZ2ljIHRvIGxpbmUgYnJlYWtpbmcuCi0g
ICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3aGl0ZXNwYWNlQ29udGVudC0+
bGVuZ3RoOyArK2kpCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZFdoaXRlc3BhY2VJdGVtKGN1
cnJlbnRQb3NpdGlvbiArIGksIDEpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAg
ICAgYXBwZW5kV2hpdGVzcGFjZUl0ZW0oY3VycmVudFBvc2l0aW9uLCB3aGl0ZXNwYWNlQ29udGVu
dC0+bGVuZ3RoKTsKLSAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiArPSB3aGl0ZXNwYWNlQ29u
dGVudC0+bGVuZ3RoOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAg
ICBhdXRvIGhhc1RyYWlsaW5nU29mdEh5cGhlbiA9IGZhbHNlOwotICAgICAgICBhdXRvIGluaXRp
YWxOb25XaGl0ZXNwYWNlUG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb247Ci0gICAgICAgIGF1dG8g
aXNBdFNvZnRIeXBoZW4gPSBbJl0oYXV0byBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJu
IHRleHRbcG9zaXRpb25dID09IHNvZnRIeXBoZW47Ci0gICAgICAgIH07Ci0gICAgICAgIGlmIChz
dHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVuczo6Tm9uZSkgewotICAgICAgICAgICAgLy8gTGV0J3Mg
bWVyZ2UgY2FuZGlkYXRlIElubGluZVRleHRJdGVtcyBzZXBhcmF0ZWQgYnkgc29mdCBoeXBoZW4g
d2hlbiB0aGUgc3R5bGUgc2F5cyBzby4KLSAgICAgICAgICAgIHdoaWxlIChjdXJyZW50UG9zaXRp
b24gPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBub25XaGl0ZVNwYWNl
TGVuZ3RoID0gbW92ZVRvTmV4dEJyZWFrYWJsZVBvc2l0aW9uKGN1cnJlbnRQb3NpdGlvbiwgbGlu
ZUJyZWFrSXRlcmF0b3IsIHN0eWxlKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQobm9uV2hpdGVT
cGFjZUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uICs9IG5vbldoaXRl
U3BhY2VMZW5ndGg7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0F0U29mdEh5cGhlbihjdXJyZW50
UG9zaXRpb24gLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdXRvIG5vbldoaXRlU3BhY2VMZW5ndGgg
PSBtb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24oaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlv
biwgbGluZUJyZWFrSXRlcmF0b3IsIHN0eWxlKTsKLSAgICAgICAgICAgIEFTU0VSVChub25XaGl0
ZVNwYWNlTGVuZ3RoKTsKLSAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiArPSBub25XaGl0ZVNw
YWNlTGVuZ3RoOwotICAgICAgICAgICAgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuID0gaXNBdFNvZnRI
eXBoZW4oY3VycmVudFBvc2l0aW9uIC0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUKGlu
aXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRpb24gPCBjdXJyZW50UG9zaXRpb24pOwotICAgICAgICBB
U1NFUlRfSU1QTElFUyhzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVuczo6Tm9uZSwgIWhhc1RyYWls
aW5nU29mdEh5cGhlbik7Ci0gICAgICAgIGF1dG8gbGVuZ3RoID0gY3VycmVudFBvc2l0aW9uIC0g
aW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbjsKLSAgICAgICAgaW5saW5lQ29udGVudC5hcHBl
bmQoSW5saW5lVGV4dEl0ZW06OmNyZWF0ZU5vbldoaXRlc3BhY2VJdGVtKGlubGluZVRleHRCb3gs
IGluaXRpYWxOb25XaGl0ZXNwYWNlUG9zaXRpb24sIGxlbmd0aCwgaGFzVHJhaWxpbmdTb2Z0SHlw
aGVuLCBpbmxpbmVJdGVtV2lkdGgoaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiwgbGVuZ3Ro
KSkpOwotICAgIH0KLX0KLQotYm9vbCBJbmxpbmVUZXh0SXRlbTo6aXNFbXB0eUNvbnRlbnQoKSBj
b25zdAotewotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgZm9yIG1vcmUgemVybyB3aWR0
aCBjb250ZW50IGFuZCBub3QganVzdCBVKzIwMEIuCi0gICAgcmV0dXJuICFtX2xlbmd0aCB8fCAo
bV9sZW5ndGggPT0gMSAmJiBpbmxpbmVUZXh0Qm94KCkuY29udGVudCgpW3N0YXJ0KCldID09IHpl
cm9XaWR0aFNwYWNlKTsgCi19Ci0KLWJvb2wgSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZl
U3BhY2VzQW5kVGFicyhjb25zdCBJbmxpbmVUZXh0SXRlbSYgaW5saW5lVGV4dEl0ZW0pCi17Ci0g
ICAgQVNTRVJUKGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpKTsKLSAgICByZXR1cm4gVGV4
dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbS5sYXlvdXRC
b3goKSk7Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVtLmgKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDUyZGM5OGRjZjA2YTE5YWEwNWZjNGFhMGFhMjRkOTgzYTViN2NkMTUuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lVGV4dEl0ZW0uaAorKysgL2Rldi9udWxs
CkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICog
YXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFC
TEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIklubGluZUl0ZW0uaCIK
LSNpbmNsdWRlICJMYXlvdXRJbmxpbmVUZXh0Qm94LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsK
LW5hbWVzcGFjZSBMYXlvdXQgewotCi11c2luZyBJbmxpbmVJdGVtcyA9IFZlY3RvcjxJbmxpbmVJ
dGVtPjsKLQotY2xhc3MgSW5saW5lVGV4dEl0ZW0gOiBwdWJsaWMgSW5saW5lSXRlbSB7Ci1wdWJs
aWM6Ci0gICAgc3RhdGljIHZvaWQgY3JlYXRlQW5kQXBwZW5kVGV4dEl0ZW1zKElubGluZUl0ZW1z
JiwgY29uc3QgSW5saW5lVGV4dEJveCYpOwotCi0gICAgdW5zaWduZWQgc3RhcnQoKSBjb25zdCB7
IHJldHVybiBtX3N0YXJ0T3JQb3NpdGlvbjsgfQotICAgIHVuc2lnbmVkIGVuZCgpIGNvbnN0IHsg
cmV0dXJuIHN0YXJ0KCkgKyBsZW5ndGgoKTsgfQotICAgIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0
IHsgcmV0dXJuIG1fbGVuZ3RoOyB9Ci0KLSAgICBib29sIGlzV2hpdGVzcGFjZSgpIGNvbnN0IHsg
cmV0dXJuIG1fdGV4dEl0ZW1UeXBlID09IFRleHRJdGVtVHlwZTo6V2hpdGVzcGFjZTsgfQotICAg
IGJvb2wgaXNXb3JkU2VwYXJhdG9yKCkgY29uc3QgeyByZXR1cm4gbV9pc1dvcmRTZXBhcmF0b3I7
IH0KLSAgICBib29sIGhhc1RyYWlsaW5nU29mdEh5cGhlbigpIGNvbnN0IHsgcmV0dXJuIG1faGFz
VHJhaWxpbmdTb2Z0SHlwaGVuOyB9Ci0gICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gd2lk
dGgoKSBjb25zdCB7IHJldHVybiBtX2hhc1dpZHRoID8gbWFrZU9wdGlvbmFsKG1fd2lkdGgpIDog
T3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geyB9OyB9Ci0gICAgYm9vbCBpc0VtcHR5Q29udGVu
dCgpIGNvbnN0OwotCi0gICAgY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCgpIGNv
bnN0IHsgcmV0dXJuIGRvd25jYXN0PElubGluZVRleHRCb3g+KGxheW91dEJveCgpKTsgfQotCi0g
ICAgSW5saW5lVGV4dEl0ZW0gbGVmdCh1bnNpZ25lZCBsZW5ndGgpIGNvbnN0OwotICAgIElubGlu
ZVRleHRJdGVtIHJpZ2h0KHVuc2lnbmVkIGxlbmd0aCkgY29uc3Q7Ci0KLSAgICBzdGF0aWMgYm9v
bCBzaG91bGRQcmVzZXJ2ZVNwYWNlc0FuZFRhYnMoY29uc3QgSW5saW5lVGV4dEl0ZW0mKTsKLQot
cHJpdmF0ZToKLSAgICB1c2luZyBJbmxpbmVJdGVtOjpUZXh0SXRlbVR5cGU7Ci0KLSAgICBJbmxp
bmVUZXh0SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVk
IGxlbmd0aCwgYm9vbCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIGJvb2wgaXNXb3JkU2VwYXJhdG9y
LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCwgVGV4dEl0ZW1UeXBlKTsKLSAgICBl
eHBsaWNpdCBJbmxpbmVUZXh0SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94Jik7Ci0KLSAgICBzdGF0
aWMgSW5saW5lVGV4dEl0ZW0gY3JlYXRlV2hpdGVzcGFjZUl0ZW0oY29uc3QgSW5saW5lVGV4dEJv
eCYsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wgaXNXb3JkU2VwYXJhdG9y
LCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCk7Ci0gICAgc3RhdGljIElubGluZVRl
eHRJdGVtIGNyZWF0ZU5vbldoaXRlc3BhY2VJdGVtKGNvbnN0IElubGluZVRleHRCb3gmLCB1bnNp
Z25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGhhc1RyYWlsaW5nU29mdEh5cGhlbiwg
T3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgpOwotICAgIHN0YXRpYyBJbmxpbmVUZXh0
SXRlbSBjcmVhdGVFbXB0eUl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYpOwotfTsKLQotaW5saW5l
IElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpjcmVhdGVXaGl0ZXNwYWNlSXRlbShjb25z
dCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQg
bGVuZ3RoLCBib29sIGlzV29yZFNlcGFyYXRvciwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4g
d2lkdGgpCi17Ci0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgc3RhcnQsIGxlbmd0aCwgZmFs
c2UsIGlzV29yZFNlcGFyYXRvciwgd2lkdGgsIFRleHRJdGVtVHlwZTo6V2hpdGVzcGFjZSB9Owot
fQotCi1pbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5saW5lVGV4dEl0ZW06OmNyZWF0ZU5vbldoaXRl
c3BhY2VJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRCb3gsIHVuc2lnbmVkIHN0
YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBPcHRpb25h
bDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCkKLXsKLSAgICAvLyBGSVhNRTogVXNlIHRoZSBmb2xs
b3dpbmcgbGlzdCBvZiBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHNldCB0aGUgImlzV29y
ZFNlcGFyYXRvciIgYml0OiBub0JyZWFrU3BhY2UsIGV0aGlvcGljV29yZHNwYWNlLCBhZWdlYW5X
b3JkU2VwYXJhdG9yTGluZSBhZWdlYW5Xb3JkU2VwYXJhdG9yRG90IHVnYXJpdGljV29yZERpdmlk
ZXIuCi0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCwgc3RhcnQsIGxlbmd0aCwgaGFzVHJhaWxp
bmdTb2Z0SHlwaGVuLCBmYWxzZSwgd2lkdGgsIFRleHRJdGVtVHlwZTo6Tm9uV2hpdGVzcGFjZSB9
OwotfQotCi1pbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5saW5lVGV4dEl0ZW06OmNyZWF0ZUVtcHR5
SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94KQotewotICAgIHJldHVybiBJ
bmxpbmVUZXh0SXRlbSB7IGlubGluZVRleHRCb3ggfTsKLX0KLQotaW5saW5lIElubGluZVRleHRJ
dGVtOjpJbmxpbmVUZXh0SXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1
bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGhhc1RyYWlsaW5nU29mdEh5cGhl
biwgYm9vbCBpc1dvcmRTZXBhcmF0b3IsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRo
LCBUZXh0SXRlbVR5cGUgdGV4dEl0ZW1UeXBlKQotICAgIDogSW5saW5lSXRlbShpbmxpbmVUZXh0
Qm94LCBUeXBlOjpUZXh0KQotewotICAgIG1fc3RhcnRPclBvc2l0aW9uID0gc3RhcnQ7Ci0gICAg
bV9sZW5ndGggPSBsZW5ndGg7Ci0gICAgbV9oYXNXaWR0aCA9ICEhd2lkdGg7Ci0gICAgbV9oYXNU
cmFpbGluZ1NvZnRIeXBoZW4gPSBoYXNUcmFpbGluZ1NvZnRIeXBoZW47Ci0gICAgbV9pc1dvcmRT
ZXBhcmF0b3IgPSBpc1dvcmRTZXBhcmF0b3I7Ci0gICAgbV93aWR0aCA9IHdpZHRoLnZhbHVlT3Io
MCk7Ci0gICAgbV90ZXh0SXRlbVR5cGUgPSB0ZXh0SXRlbVR5cGU7Ci19Ci0KLWlubGluZSBJbmxp
bmVUZXh0SXRlbTo6SW5saW5lVGV4dEl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4
dEJveCkKLSAgICA6IElubGluZUl0ZW0oaW5saW5lVGV4dEJveCwgVHlwZTo6VGV4dCkKLXsKLX0K
LQotaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpsZWZ0KHVuc2lnbmVkIGxl
bmd0aCkgY29uc3QKLXsKLSAgICBSRUxFQVNFX0FTU0VSVChsZW5ndGggPD0gdGhpcy0+bGVuZ3Ro
KCkpOwotICAgIEFTU0VSVChtX3RleHRJdGVtVHlwZSAhPSBUZXh0SXRlbVR5cGU6OlVuZGVmaW5l
ZCk7Ci0gICAgQVNTRVJUKGxlbmd0aCk7Ci0gICAgcmV0dXJuIHsgaW5saW5lVGV4dEJveCgpLCBz
dGFydCgpLCBsZW5ndGgsIGZhbHNlLCBpc1dvcmRTZXBhcmF0b3IoKSwgV1RGOjpudWxsb3B0LCBt
X3RleHRJdGVtVHlwZSB9OwotfQotCi1pbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5saW5lVGV4dEl0
ZW06OnJpZ2h0KHVuc2lnbmVkIGxlbmd0aCkgY29uc3QKLXsKLSAgICBSRUxFQVNFX0FTU0VSVChs
ZW5ndGggPD0gdGhpcy0+bGVuZ3RoKCkpOwotICAgIEFTU0VSVChtX3RleHRJdGVtVHlwZSAhPSBU
ZXh0SXRlbVR5cGU6OlVuZGVmaW5lZCk7Ci0gICAgQVNTRVJUKGxlbmd0aCk7Ci0gICAgcmV0dXJu
IHsgaW5saW5lVGV4dEJveCgpLCBlbmQoKSAtIGxlbmd0aCwgbGVuZ3RoLCBoYXNUcmFpbGluZ1Nv
ZnRIeXBoZW4oKSwgaXNXb3JkU2VwYXJhdG9yKCksIFdURjo6bnVsbG9wdCwgbV90ZXh0SXRlbVR5
cGUgfTsKLX0KLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0lOTElORV9JVEVNKElu
bGluZVRleHRJdGVtLCBpc1RleHQoKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRVdGlsLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuY3BwCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTU3NWJjZTcyODUzYThjOWRiZjM2MmY0ZmM5YjE5OTc2
YWIyNTIwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuY3BwCisr
KyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTgg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
Ci0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
LSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29u
ZmlnLmgiCi0jaW5jbHVkZSAiVGV4dFV0aWwuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFU
VElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQnJlYWtMaW5lcy5oIgotI2luY2x1ZGUgIkZvbnRD
YXNjYWRlLmgiCi0jaW5jbHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIKLSNpbmNsdWRlICJMYXlvdXRJ
bmxpbmVUZXh0Qm94LmgiCi0jaW5jbHVkZSAiUmVuZGVyQm94LmgiCi0jaW5jbHVkZSAiUmVuZGVy
U3R5bGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLUlu
bGluZUxheW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxp
bmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpCi17Ci0gICAg
cmV0dXJuIFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4dEl0ZW0uc3Rh
cnQoKSwgaW5saW5lVGV4dEl0ZW0uZW5kKCksIGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci19Ci0KLUlu
bGluZUxheW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxp
bmVUZXh0SXRlbSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91dFVuaXQg
Y29udGVudExvZ2ljYWxMZWZ0KQotewotICAgIFJFTEVBU0VfQVNTRVJUKGZyb20gPj0gaW5saW5l
VGV4dEl0ZW0uc3RhcnQoKSk7Ci0gICAgUkVMRUFTRV9BU1NFUlQodG8gPD0gaW5saW5lVGV4dEl0
ZW0uZW5kKCkpOwotICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAhSW5s
aW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkp
IHsKLSAgICAgICAgYXV0byBzcGFjZVdpZHRoID0gaW5saW5lVGV4dEl0ZW0uc3R5bGUoKS5mb250
Q2FzY2FkZSgpLnNwYWNlV2lkdGgoKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6aXNuYW4oc3BhY2VX
aWR0aCkgPyAwLjBmIDogc3RkOjppc2luZihzcGFjZVdpZHRoKSA/IG1heElubGluZUxheW91dFVu
aXQoKSA6IHNwYWNlV2lkdGg7Ci0gICAgfQotICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5s
aW5lVGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpLCBmcm9tLCB0bywgY29udGVudExvZ2ljYWxMZWZ0
KTsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBUZXh0VXRpbDo6d2lkdGgoY29uc3QgSW5saW5lVGV4
dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxh
eW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KQotewotICAgIGlmIChmcm9tID09IHRvKQotICAg
ICAgICByZXR1cm4gMDsKLQotICAgIGF1dG8mIHN0eWxlID0gaW5saW5lVGV4dEJveC5zdHlsZSgp
OwotICAgIGF1dG8mIGZvbnQgPSBzdHlsZS5mb250Q2FzY2FkZSgpOwotICAgIGF1dG8gdGV4dCA9
IGlubGluZVRleHRCb3guY29udGVudCgpOwotICAgIEFTU0VSVCh0byA8PSB0ZXh0Lmxlbmd0aCgp
KTsKLSAgICBhdXRvIGhhc0tlcm5pbmdPckxpZ2F0dXJlcyA9IGZvbnQuZW5hYmxlS2VybmluZygp
IHx8IGZvbnQucmVxdWlyZXNTaGFwaW5nKCk7Ci0gICAgYXV0byBtZWFzdXJlV2l0aEVuZFNwYWNl
ID0gaGFzS2VybmluZ09yTGlnYXR1cmVzICYmIHRvIDwgdGV4dC5sZW5ndGgoKSAmJiB0ZXh0W3Rv
XSA9PSAnICc7Ci0gICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2UpCi0gICAgICAgICsrdG87Ci0g
ICAgZmxvYXQgd2lkdGggPSAwOwotICAgIGlmIChpbmxpbmVUZXh0Qm94LmNhblVzZVNpbXBsaWZp
ZWRDb250ZW50TWVhc3VyaW5nKCkpCi0gICAgICAgIHdpZHRoID0gZm9udC53aWR0aEZvclNpbXBs
ZVRleHQoU3RyaW5nVmlldyh0ZXh0KS5zdWJzdHJpbmcoZnJvbSwgdG8gLSBmcm9tKSk7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIGF1dG8gdGFiV2lkdGggPSBzdHlsZS5jb2xsYXBzZVdoaXRlU3BhY2Uo
KSA/IFRhYlNpemUoMCkgOiBzdHlsZS50YWJTaXplKCk7Ci0gICAgICAgIFdlYkNvcmU6OlRleHRS
dW4gcnVuKFN0cmluZ1ZpZXcodGV4dCkuc3Vic3RyaW5nKGZyb20sIHRvIC0gZnJvbSksIGNvbnRl
bnRMb2dpY2FsTGVmdCk7Ci0gICAgICAgIGlmICh0YWJXaWR0aCkKLSAgICAgICAgICAgIHJ1bi5z
ZXRUYWJTaXplKHRydWUsIHRhYldpZHRoKTsKLSAgICAgICAgd2lkdGggPSBmb250LndpZHRoKHJ1
bik7Ci0gICAgfQotCi0gICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2UpCi0gICAgICAgIHdpZHRo
IC09IChmb250LnNwYWNlV2lkdGgoKSArIGZvbnQud29yZFNwYWNpbmcoKSk7Ci0KLSAgICByZXR1
cm4gc3RkOjppc25hbih3aWR0aCkgPyAwLjBmIDogc3RkOjppc2luZih3aWR0aCkgPyBtYXhJbmxp
bmVMYXlvdXRVbml0KCkgOiB3aWR0aDsKLX0KLQotVGV4dFV0aWw6OlNwbGl0RGF0YSBUZXh0VXRp
bDo6c3BsaXQoY29uc3QgSW5saW5lVGV4dEl0ZW0mIGlubGluZVRleHRJdGVtLCBJbmxpbmVMYXlv
dXRVbml0IHRleHRXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCwgSW5saW5l
TGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpCi17Ci0gICAgQVNTRVJUKGF2YWlsYWJsZVdp
ZHRoID49IDApOwotICAgIGF1dG8gc3RhcnRQb3NpdGlvbiA9IGlubGluZVRleHRJdGVtLnN0YXJ0
KCk7Ci0gICAgYXV0byBsZW5ndGggPSBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKTsKLSAgICBBU1NF
UlQobGVuZ3RoKTsKLQotICAgIGF1dG8gbGVmdCA9IHN0YXJ0UG9zaXRpb247Ci0gICAgLy8gUGF0
aG9sb2dpY2FsIGNhc2Ugb2YgKGV4dHJlbWVseSlsb25nIHN0cmluZyBhbmQgbmFycm93IGxpbmVz
LgotICAgIC8vIEFkanVzdCB0aGUgcmFuZ2Ugc28gdGhhdCB3ZSBjYW4gcGljayBhIHJlYXNvbmFi
bGUgbWlkcG9pbnQuCi0gICAgSW5saW5lTGF5b3V0VW5pdCBhdmVyYWdlQ2hhcmFjdGVyV2lkdGgg
PSB0ZXh0V2lkdGggLyBsZW5ndGg7Ci0gICAgdW5zaWduZWQgb2Zmc2V0ID0gdG9MYXlvdXRVbml0
KDIgKiBhdmFpbGFibGVXaWR0aCAvIGF2ZXJhZ2VDaGFyYWN0ZXJXaWR0aCkudG9VbnNpZ25lZCgp
OwotICAgIGF1dG8gcmlnaHQgPSBzdGQ6Om1pbjx1bnNpZ25lZD4obGVmdCArIG9mZnNldCwgKHN0
YXJ0UG9zaXRpb24gKyBsZW5ndGggLSAxKSk7Ci0gICAgLy8gUHJlc2VydmUgdGhlIGxlZnQgd2lk
dGggZm9yIHRoZSBmaW5hbCBzcGxpdCBwb3NpdGlvbiBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8g
cmVtZWFzdXJlIHRoZSBsZWZ0IHNpZGUgYWdhaW4uCi0gICAgSW5saW5lTGF5b3V0VW5pdCBsZWZ0
U2lkZVdpZHRoID0gMDsKLSAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7Ci0gICAgICAgIGF1dG8g
bWlkZGxlID0gKGxlZnQgKyByaWdodCkgLyAyOwotICAgICAgICBhdXRvIHdpZHRoID0gVGV4dFV0
aWw6OndpZHRoKGlubGluZVRleHRJdGVtLCBzdGFydFBvc2l0aW9uLCBtaWRkbGUgKyAxLCBjb250
ZW50TG9naWNhbExlZnQpOwotICAgICAgICBpZiAod2lkdGggPCBhdmFpbGFibGVXaWR0aCkgewot
ICAgICAgICAgICAgbGVmdCA9IG1pZGRsZSArIDE7Ci0gICAgICAgICAgICBsZWZ0U2lkZVdpZHRo
ID0gd2lkdGg7Ci0gICAgICAgIH0gZWxzZSBpZiAod2lkdGggPiBhdmFpbGFibGVXaWR0aCkKLSAg
ICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJp
Z2h0ID0gbWlkZGxlICsgMTsKLSAgICAgICAgICAgIGxlZnRTaWRlV2lkdGggPSB3aWR0aDsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB7IHN0YXJ0UG9z
aXRpb24sIHJpZ2h0IC0gc3RhcnRQb3NpdGlvbiwgbGVmdFNpZGVXaWR0aCB9OwotfQotCi11bnNp
Z25lZCBUZXh0VXRpbDo6ZmluZE5leHRCcmVha2FibGVQb3NpdGlvbihMYXp5TGluZUJyZWFrSXRl
cmF0b3ImIGxpbmVCcmVha0l0ZXJhdG9yLCB1bnNpZ25lZCBzdGFydFBvc2l0aW9uLCBjb25zdCBS
ZW5kZXJTdHlsZSYgc3R5bGUpCi17Ci0gICAgYXV0byBrZWVwQWxsV29yZHNGb3JDSksgPSBzdHls
ZS53b3JkQnJlYWsoKSA9PSBXb3JkQnJlYWs6OktlZXBBbGw7Ci0gICAgYXV0byBicmVha05CU1Ag
PSBzdHlsZS5hdXRvV3JhcCgpICYmIHN0eWxlLm5ic3BNb2RlKCkgPT0gTkJTUE1vZGU6OlNwYWNl
OwotCi0gICAgaWYgKGtlZXBBbGxXb3Jkc0ZvckNKSykgewotICAgICAgICBpZiAoYnJlYWtOQlNQ
KQotICAgICAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbktlZXBpbmdBbGxXb3Jk
cyhsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Ci0gICAgICAgIHJldHVybiBuZXh0
QnJlYWthYmxlUG9zaXRpb25LZWVwaW5nQWxsV29yZHNJZ25vcmluZ05CU1AobGluZUJyZWFrSXRl
cmF0b3IsIHN0YXJ0UG9zaXRpb24pOwotICAgIH0KLQotICAgIGlmIChsaW5lQnJlYWtJdGVyYXRv
ci5tb2RlKCkgPT0gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpEZWZhdWx0KSB7Ci0gICAgICAgIGlm
IChicmVha05CU1ApCi0gICAgICAgICAgICByZXR1cm4gV2ViQ29yZTo6bmV4dEJyZWFrYWJsZVBv
c2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9uKTsKLSAgICAgICAgcmV0dXJu
IG5leHRCcmVha2FibGVQb3NpdGlvbklnbm9yaW5nTkJTUChsaW5lQnJlYWtJdGVyYXRvciwgc3Rh
cnRQb3NpdGlvbik7Ci0gICAgfQotCi0gICAgaWYgKGJyZWFrTkJTUCkKLSAgICAgICAgcmV0dXJu
IG5leHRCcmVha2FibGVQb3NpdGlvbldpdGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJdGVyYXRvciwg
c3RhcnRQb3NpdGlvbik7Ci0gICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbklnbm9yaW5n
TkJTUFdpdGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Ci19
Ci0KLWJvb2wgVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhjb25zdCBCb3gm
IGxheW91dEJveCkKLXsKLSAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXRleHQtMy8j
d2hpdGUtc3BhY2UtcHJvcGVydHkKLSAgICBhdXRvIHdoaXRlc3BhY2UgPSBsYXlvdXRCb3guc3R5
bGUoKS53aGl0ZVNwYWNlKCk7Ci0gICAgcmV0dXJuIHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6
UHJlIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlV3JhcCB8fCB3aGl0ZXNwYWNlID09
IFdoaXRlU3BhY2U6OkJyZWFrU3BhY2VzOwotfQotCi1ib29sIFRleHRVdGlsOjpzaG91bGRQcmVz
ZXJ2ZU5ld2xpbmUoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAgYXV0byB3aGl0ZXNwYWNl
ID0gbGF5b3V0Qm94LnN0eWxlKCkud2hpdGVTcGFjZSgpOwotICAgIC8vIGh0dHBzOi8vd3d3Lncz
Lm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eQotICAgIHJldHVybiB3aGl0
ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZSB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlBy
ZVdyYXAgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpCcmVha1NwYWNlcyB8fCB3aGl0ZXNw
YWNlID09IFdoaXRlU3BhY2U6OlByZUxpbmU7IAotfQotCi1MaW5lQnJlYWtJdGVyYXRvck1vZGUg
VGV4dFV0aWw6OmxpbmVCcmVha0l0ZXJhdG9yTW9kZShMaW5lQnJlYWsgbGluZUJyZWFrKQotewot
ICAgIHN3aXRjaCAobGluZUJyZWFrKSB7Ci0gICAgY2FzZSBMaW5lQnJlYWs6OkF1dG86Ci0gICAg
Y2FzZSBMaW5lQnJlYWs6OkFmdGVyV2hpdGVTcGFjZToKLSAgICBjYXNlIExpbmVCcmVhazo6QW55
d2hlcmU6Ci0gICAgICAgIHJldHVybiBMaW5lQnJlYWtJdGVyYXRvck1vZGU6OkRlZmF1bHQ7Ci0g
ICAgY2FzZSBMaW5lQnJlYWs6Okxvb3NlOgotICAgICAgICByZXR1cm4gTGluZUJyZWFrSXRlcmF0
b3JNb2RlOjpMb29zZTsKLSAgICBjYXNlIExpbmVCcmVhazo6Tm9ybWFsOgotICAgICAgICByZXR1
cm4gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpOb3JtYWw7Ci0gICAgY2FzZSBMaW5lQnJlYWs6OlN0
cmljdDoKLSAgICAgICAgcmV0dXJuIExpbmVCcmVha0l0ZXJhdG9yTW9kZTo6U3RyaWN0OwotICAg
IH0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gTGluZUJyZWFrSXRlcmF0
b3JNb2RlOjpEZWZhdWx0OwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuaCBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9pbmxpbmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuaApkZWxldGVkIGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1ODRmYTc5ODFiZDQzODNjZjQzZTIzYTRiZmFlYjgyMGNl
MzJmMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRVdGlsLmgKKysrIC9k
ZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAot
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
Ci0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwot
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICog
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNp
ZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIklubGluZUl0
ZW0uaCIKLSNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgotI2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRC
cmVha0l0ZXJhdG9yLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotY2xhc3MgUmVuZGVyU3R5
bGU7Ci0KLW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBJbmxpbmVUZXh0Qm94OwotY2xhc3Mg
SW5saW5lVGV4dEl0ZW07Ci0KLWNsYXNzIFRleHRVdGlsIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMg
SW5saW5lTGF5b3V0VW5pdCB3aWR0aChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIElubGluZUxheW91
dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KTsKLSAgICBzdGF0aWMgSW5saW5lTGF5b3V0VW5pdCB3
aWR0aChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvLCBJ
bmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0gICAgc3RhdGljIElubGluZUxh
eW91dFVuaXQgd2lkdGgoY29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIGZyb20sIHVuc2ln
bmVkIHRvLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0KLSAgICBzdHJ1
Y3QgU3BsaXREYXRhIHsKLSAgICAgICAgdW5zaWduZWQgc3RhcnQgeyAwIH07Ci0gICAgICAgIHVu
c2lnbmVkIGxlbmd0aCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lk
dGggeyAwIH07Ci0gICAgfTsKLSAgICBzdGF0aWMgU3BsaXREYXRhIHNwbGl0KGNvbnN0IElubGlu
ZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCB0ZXh0V2lkdGgsIElubGluZUxheW91dFVuaXQg
YXZhaWxhYmxlV2lkdGgsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KTsKLQot
ICAgIHN0YXRpYyB1bnNpZ25lZCBmaW5kTmV4dEJyZWFrYWJsZVBvc2l0aW9uKExhenlMaW5lQnJl
YWtJdGVyYXRvciYsIHVuc2lnbmVkIHN0YXJ0UG9zaXRpb24sIGNvbnN0IFJlbmRlclN0eWxlJik7
Ci0gICAgc3RhdGljIExpbmVCcmVha0l0ZXJhdG9yTW9kZSBsaW5lQnJlYWtJdGVyYXRvck1vZGUo
TGluZUJyZWFrKTsKLQotICAgIHN0YXRpYyBib29sIHNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFi
cyhjb25zdCBCb3gmKTsKLSAgICBzdGF0aWMgYm9vbCBzaG91bGRQcmVzZXJ2ZU5ld2xpbmUoY29u
c3QgQm94Jik7Ci19OwotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQu
Y3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDJhZjdjNWVkODhkNTA0Y2FjNDI1
YTEzNTIxMDA4YjZlNThiOWFjLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3Jt
YXR0aW5nQ29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
Ci0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgot
ICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdDb250
ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1
ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiRmxvYXRpbmdTdGF0ZS5oIgot
I2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkludmFsaWRhdGlv
blN0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2Vv
bWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRDaGlsZEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGF5
b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIK
LSNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxs
b2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewot
Ci1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoVGFibGVGb3JtYXR0aW5nQ29udGV4dCk7Ci0K
LS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGFibGVzLTMvI3RhYmxlLWxheW91dC1hbGdv
cml0aG0KLVRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlRm9ybWF0dGluZ0NvbnRleHQoY29u
c3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIFRhYmxlRm9ybWF0dGluZ1N0
YXRlJiBmb3JtYXR0aW5nU3RhdGUpCi0gICAgOiBGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5n
Q29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKLXsKLX0KLQotdm9pZCBUYWJsZUZvcm1hdHRp
bmdDb250ZXh0OjpsYXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRlJiwgY29uc3Qg
Q29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICBhdXRvIGF2
YWlsYWJsZUhvcml6b250YWxTcGFjZSA9IGNvbnN0cmFpbnRzLmhvcml6b250YWwubG9naWNhbFdp
ZHRoOwotICAgIGF1dG8gYXZhaWxhYmxlVmVydGljYWxTcGFjZSA9IGNvbnN0cmFpbnRzLnZlcnRp
Y2FsLmxvZ2ljYWxIZWlnaHQ7Ci0gICAgLy8gMS4gQ29tcHV0ZSB3aWR0aCBhbmQgaGVpZ2h0IGZv
ciB0aGUgZ3JpZC4KLSAgICBjb21wdXRlQW5kRGlzdHJpYnV0ZUV4dHJhU3BhY2UoYXZhaWxhYmxl
SG9yaXpvbnRhbFNwYWNlLCBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKTsKLSAgICAvLyAyLiBGaW5h
bGl6ZSBjZWxscy4KLSAgICBzZXRVc2VkR2VvbWV0cnlGb3JDZWxscyhhdmFpbGFibGVIb3Jpem9u
dGFsU3BhY2UpOwotICAgIC8vIDMuIEZpbmFsaXplIHJvd3MuCi0gICAgc2V0VXNlZEdlb21ldHJ5
Rm9yUm93cyhhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAgIC8vIDQuIEZpbmFsaXplIHNl
Y3Rpb25zLgotICAgIHNldFVzZWRHZW9tZXRyeUZvclNlY3Rpb25zKGNvbnN0cmFpbnRzKTsKLX0K
LQotTGF5b3V0VW5pdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0Ojp1c2VkQ29udGVudEhlaWdodCgp
IGNvbnN0Ci17Ci0gICAgLy8gVGFibGUgaGFzIHRvIGhhdmUgc29tZSBzZWN0aW9uIGNvbnRlbnQs
IGF0IGxlYXN0IG9uZSA8dGJvZHk+LgotICAgIGF1dG8gdG9wID0gQm94R2VvbWV0cnk6Om1hcmdp
bkJveFJlY3QoZ2VvbWV0cnlGb3JCb3goKnJvb3QoKS5maXJzdEluRmxvd0NoaWxkKCkpKS50b3Ao
KTsKLSAgICBhdXRvIGJvdHRvbSA9IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KGdlb21ldHJ5
Rm9yQm94KCpyb290KCkubGFzdEluRmxvd0NoaWxkKCkpKS5ib3R0b20oKTsKLSAgICByZXR1cm4g
Ym90dG9tIC0gdG9wOwotfQotCi12b2lkIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OnNldFVzZWRH
ZW9tZXRyeUZvckNlbGxzKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKQotewot
ICAgIGF1dG8mIGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsKLSAgICBhdXRv
JiBjb2x1bW5MaXN0ID0gZ3JpZC5jb2x1bW5zKCkubGlzdCgpOwotICAgIGF1dG8mIHJvd0xpc3Qg
PSBncmlkLnJvd3MoKS5saXN0KCk7Ci0gICAgLy8gRmluYWwgdGFibGUgY2VsbCBsYXlvdXQuIEF0
IHRoaXMgcG9pbnQgYWxsIHBlcmNlbnRhZ2UgdmFsdWVzIGNhbiBiZSByZXNvbHZlZC4KLSAgICBh
dXRvIHNlY3Rpb25PZmZzZXQgPSBMYXlvdXRVbml0IHsgfTsKLSAgICBhdXRvKiBjdXJyZW50U2Vj
dGlvbiA9ICZyb3dMaXN0LmZpcnN0KCkuYm94KCkucGFyZW50KCk7Ci0gICAgZm9yIChhdXRvJiBj
ZWxsIDogZ3JpZC5jZWxscygpKSB7Ci0gICAgICAgIGF1dG8mIGNlbGxCb3ggPSBjZWxsLT5ib3go
KTsKLSAgICAgICAgYXV0byYgY2VsbEJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94
R2VvbWV0cnkoY2VsbEJveCk7Ci0gICAgICAgIGF1dG8mIHNlY3Rpb24gPSByb3dMaXN0W2NlbGwt
PnN0YXJ0Um93KCldLmJveCgpLnBhcmVudCgpOwotICAgICAgICBpZiAoJnNlY3Rpb24gIT0gY3Vy
cmVudFNlY3Rpb24pIHsKLSAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uID0gJnNlY3Rpb247Ci0g
ICAgICAgICAgICAvLyBXaGlsZSB0aGUgZ3JpZCBpcyBhIGNvbnRpbnVvdXMgZmxvdyBvZiByb3dz
LCBpbiB0aGUgZGlzcGxheSB0cmVlIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZWlyIHNlY3Rpb25z
LgotICAgICAgICAgICAgc2VjdGlvbk9mZnNldCA9IHJvd0xpc3RbY2VsbC0+c3RhcnRSb3coKV0u
bG9naWNhbFRvcCgpOwotICAgICAgICB9Ci0gICAgICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRMb2dp
Y2FsVG9wKHJvd0xpc3RbY2VsbC0+c3RhcnRSb3coKV0ubG9naWNhbFRvcCgpIC0gc2VjdGlvbk9m
ZnNldCk7Ci0gICAgICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRMb2dpY2FsTGVmdChjb2x1bW5MaXN0
W2NlbGwtPnN0YXJ0Q29sdW1uKCldLmxvZ2ljYWxMZWZ0KCkpOwotICAgICAgICBhdXRvIGF2YWls
YWJsZVZlcnRpY2FsU3BhY2UgPSByb3dMaXN0W2NlbGwtPnN0YXJ0Um93KCldLmxvZ2ljYWxIZWln
aHQoKTsKLSAgICAgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSBjZWxsLT5zdGFydFJvdygpICsg
MTsgcm93SW5kZXggPCBjZWxsLT5lbmRSb3coKTsgKytyb3dJbmRleCkKLSAgICAgICAgICAgIGF2
YWlsYWJsZVZlcnRpY2FsU3BhY2UgKz0gcm93TGlzdFtyb3dJbmRleF0ubG9naWNhbEhlaWdodCgp
OwotICAgICAgICBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlICs9IChjZWxsLT5yb3dTcGFuKCkgLSAx
KSAqIGdyaWQudmVydGljYWxTcGFjaW5nKCk7Ci0gICAgICAgIGxheW91dENlbGwoKmNlbGwsIGF2
YWlsYWJsZUhvcml6b250YWxTcGFjZSwgYXZhaWxhYmxlVmVydGljYWxTcGFjZSk7Ci0gICAgICAg
IC8vIEZJWE1FOiBGaW5kIG91dCBpZiBpdCBpcyBvayB0byB1c2UgdGhlIHJlZ3VsYXIgcGFkZGlu
ZyBoZXJlIHRvIGFsaWduIHRoZSBjb250ZW50IGJveCBpbnNpZGUgYSB0YWxsIGNlbGwgb3Igd2Ug
bmVlZCB0byAKLSAgICAgICAgLy8gdXNlIHNvbWUga2luZCBvZiBpbnRyaW5zaWMgcGFkZGluZyBz
aW1pbGFyIHRvIFJlbmRlclRhYmxlQ2VsbC4KLSAgICAgICAgYXV0byBwYWRkaW5nVG9wID0gY2Vs
bEJveEdlb21ldHJ5LnBhZGRpbmdUb3AoKS52YWx1ZU9yKExheW91dFVuaXQgeyB9KTsKLSAgICAg
ICAgYXV0byBwYWRkaW5nQm90dG9tID0gY2VsbEJveEdlb21ldHJ5LnBhZGRpbmdCb3R0b20oKS52
YWx1ZU9yKExheW91dFVuaXQgeyB9KTsKLSAgICAgICAgYXV0byBpbnRyaW5zaWNQYWRkaW5nVG9w
ID0gTGF5b3V0VW5pdCB7IH07Ci0gICAgICAgIGF1dG8gaW50cmluc2ljUGFkZGluZ0JvdHRvbSA9
IExheW91dFVuaXQgeyB9OwotCi0gICAgICAgIHN3aXRjaCAoY2VsbEJveC5zdHlsZSgpLnZlcnRp
Y2FsQWxpZ24oKSkgewotICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Ok1pZGRsZTogewotICAg
ICAgICAgICAgYXV0byBpbnRyaW5zaWNWZXJ0aWNhbFBhZGRpbmcgPSBzdGQ6Om1heCgwX2x1LCBh
dmFpbGFibGVWZXJ0aWNhbFNwYWNlIC0gY2VsbEJveEdlb21ldHJ5LnZlcnRpY2FsTWFyZ2luQm9y
ZGVyQW5kUGFkZGluZygpIC0gY2VsbEJveEdlb21ldHJ5LmNvbnRlbnRCb3hIZWlnaHQoKSk7Ci0g
ICAgICAgICAgICBpbnRyaW5zaWNQYWRkaW5nVG9wID0gaW50cmluc2ljVmVydGljYWxQYWRkaW5n
IC8gMjsKLSAgICAgICAgICAgIGludHJpbnNpY1BhZGRpbmdCb3R0b20gPSBpbnRyaW5zaWNWZXJ0
aWNhbFBhZGRpbmcgLyAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAg
Y2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZTogewotICAgICAgICAgICAgYXV0byByb3dCYXNl
bGluZSA9IExheW91dFVuaXQgeyByb3dMaXN0W2NlbGwtPnN0YXJ0Um93KCldLmJhc2VsaW5lKCkg
fTsKLSAgICAgICAgICAgIGF1dG8gY2VsbEJhc2VsaW5lID0gTGF5b3V0VW5pdCB7IGNlbGwtPmJh
c2VsaW5lKCkgfTsKLSAgICAgICAgICAgIGludHJpbnNpY1BhZGRpbmdUb3AgPSBzdGQ6Om1heCgw
X2x1LCByb3dCYXNlbGluZSAtIGNlbGxCYXNlbGluZSAtIGNlbGxCb3hHZW9tZXRyeS5ib3JkZXJU
b3AoKSk7Ci0gICAgICAgICAgICBpbnRyaW5zaWNQYWRkaW5nQm90dG9tID0gc3RkOjptYXgoMF9s
dSwgYXZhaWxhYmxlVmVydGljYWxTcGFjZSAtIGNlbGxCb3hHZW9tZXRyeS52ZXJ0aWNhbE1hcmdp
bkJvcmRlckFuZFBhZGRpbmcoKSAtIGludHJpbnNpY1BhZGRpbmdUb3AgLSBjZWxsQm94R2VvbWV0
cnkuY29udGVudEJveEhlaWdodCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0g
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGludHJpbnNpY1Bh
ZGRpbmdUb3AgJiYgY2VsbEJveC5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkgewotICAgICAg
ICAgICAgYXV0byBhZGp1c3RDZWxsQ29udGVudFdpdGhJbnN0cmluc2ljUGFkZGluZ0JlZm9yZSA9
IFsmXSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hpbGQgYm94ZXMgKGFuZCBydW5zKSBhcmUgYWx3
YXlzIGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgY29udGFpbmluZyBibG9jaydzIGJv
cmRlciBib3guCi0gICAgICAgICAgICAgICAgLy8gVGhlIGNvbnRlbnQgYm94ICh3aGVyZSB0aGUg
Y2hpbGQgY29udGVudCBsaXZlcykgaXMgaW5zaWRlIHRoZSBwYWRkaW5nIGJveCwgd2hpY2ggaXMg
aW5zaWRlIHRoZSBib3JkZXIgYm94LgotICAgICAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGNv
bXB1dGUgdGhlIGNoaWxkIGJveCB0b3AvbGVmdCBwb3NpdGlvbiwgd2UgbmVlZCB0byBrbm93IGJv
dGggdGhlIHBhZGRpbmcgYW5kIHRoZSBib3JkZXIgb2Zmc2V0cy4gIAotICAgICAgICAgICAgICAg
IC8vIE5vcm1hbGx5IGJ5IHRoZSB0aW1lIHdlIHN0YXJ0IHBvc2l0aW9uaW5nIHRoZSBjaGlsZCBj
b250ZW50LCB3ZSBhbHJlYWR5IGhhdmUgY29tcHV0ZWQgYm9yZGVycyBhbmQgcGFkZGluZyBmb3Ig
dGhlIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBkaWZmZXJl
bnQgd2l0aCB0YWJsZSBjZWxscyB3aGVyZSB0aGUgZmluYWwgcGFkZGluZyBvZmZzZXQgZGVwZW5k
cyBvbiB0aGUgY29udGVudCBoZWlnaHQgYXMgd2UgdXNlCi0gICAgICAgICAgICAgICAgLy8gdGhl
IHBhZGRpbmcgYm94IHRvIHZlcnRpY2FsbHkgYWxpZ24gdGhlIHRhYmxlIGNlbGwgY29udGVudC4K
LSAgICAgICAgICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSBsYXlvdXRTdGF0ZSgpLmVz
dGFibGlzaGVkRm9ybWF0dGluZ1N0YXRlKGNlbGxCb3gpOwotICAgICAgICAgICAgICAgIGZvciAo
YXV0byogY2hpbGQgPSBjZWxsQm94LmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7IGNoaWxk
OyBjaGlsZCA9IGNoaWxkLT5uZXh0SW5GbG93T3JGbG9hdGluZ1NpYmxpbmcoKSkgewotICAgICAg
ICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzSW5saW5lVGV4dEJveCgpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0
ZS5ib3hHZW9tZXRyeSgqY2hpbGQpLm1vdmVWZXJ0aWNhbGx5KGludHJpbnNpY1BhZGRpbmdUb3Ap
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2VsbEJveC5lc3RhYmxp
c2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXV0
byYgaW5saW5lRm9ybWF0dGluZ1N0YXRlZSA9IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRJbmxp
bmVGb3JtYXR0aW5nU3RhdGUoY2VsbEJveCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoYXV0
byYgcnVuIDogaW5saW5lRm9ybWF0dGluZ1N0YXRlZS5saW5lUnVucygpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgcnVuLm1vdmVWZXJ0aWNhbGx5KGludHJpbnNpY1BhZGRpbmdUb3ApOwotICAg
ICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGxpbmUgOiBpbmxpbmVGb3JtYXR0aW5nU3RhdGVl
LmxpbmVzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLm1vdmVWZXJ0aWNhbGx5KGlu
dHJpbnNpY1BhZGRpbmdUb3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0g
ICAgICAgICAgICBhZGp1c3RDZWxsQ29udGVudFdpdGhJbnN0cmluc2ljUGFkZGluZ0JlZm9yZSgp
OwotICAgICAgICB9Ci0gICAgICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRWZXJ0aWNhbFBhZGRpbmco
eyBwYWRkaW5nVG9wICsgaW50cmluc2ljUGFkZGluZ1RvcCwgcGFkZGluZ0JvdHRvbSArIGludHJp
bnNpY1BhZGRpbmdCb3R0b20gfSk7Ci0gICAgfQotfQotCi12b2lkIFRhYmxlRm9ybWF0dGluZ0Nv
bnRleHQ6OnNldFVzZWRHZW9tZXRyeUZvclJvd3MoTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9u
dGFsU3BhY2UpCi17Ci0gICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3Jp
ZCgpOwotICAgIGF1dG8mIHJvd3MgPSBncmlkLnJvd3MoKS5saXN0KCk7Ci0KLSAgICBhdXRvIHJv
d0xvZ2ljYWxUb3AgPSBncmlkLnZlcnRpY2FsU3BhY2luZygpOwotICAgIGNvbnN0IENvbnRhaW5l
ckJveCogcHJldmlvdXNSb3cgPSBudWxscHRyOwotICAgIGZvciAoc2l6ZV90IHJvd0luZGV4ID0g
MDsgcm93SW5kZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkgewotICAgICAgICBhdXRvJiBy
b3cgPSByb3dzW3Jvd0luZGV4XTsKLSAgICAgICAgYXV0byYgcm93Qm94ID0gcm93LmJveCgpOwot
ICAgICAgICBhdXRvJiByb3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21l
dHJ5KHJvd0JveCk7Ci0KLSAgICAgICAgcm93Qm94R2VvbWV0cnkuc2V0UGFkZGluZyhnZW9tZXRy
eSgpLmNvbXB1dGVkUGFkZGluZyhyb3dCb3gsIGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSkpOwot
ICAgICAgICAvLyBJbnRlcm5hbCB0YWJsZSBlbGVtZW50cyBkbyBub3QgaGF2ZSBtYXJnaW5zLgot
ICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgfSk7Ci0gICAgICAg
IHJvd0JveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7Ci0KLSAgICAgICAgYXV0byBj
b21wdXRlZFJvd0JvcmRlciA9IFsmXSB7Ci0gICAgICAgICAgICBhdXRvIGJvcmRlciA9IGdlb21l
dHJ5KCkuY29tcHV0ZWRCb3JkZXIocm93Qm94KTsKLSAgICAgICAgICAgIGlmICghZ3JpZC5jb2xs
YXBzZWRCb3JkZXIoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYm9yZGVyOwotICAgICAgICAg
ICAgLy8gQm9yZGVyIGNvbGxhcHNpbmcgZGVsZWdhdGVzIGJvcmRlcnMgdG8gdGFibGUvY2VsbHMu
Ci0gICAgICAgICAgICBib3JkZXIuaG9yaXpvbnRhbCA9IHsgfTsKLSAgICAgICAgICAgIGlmICgh
cm93SW5kZXgpCi0gICAgICAgICAgICAgICAgYm9yZGVyLnZlcnRpY2FsLnRvcCA9IHsgfTsKLSAg
ICAgICAgICAgIGlmIChyb3dJbmRleCA9PSByb3dzLnNpemUoKSAtIDEpCi0gICAgICAgICAgICAg
ICAgYm9yZGVyLnZlcnRpY2FsLmJvdHRvbSA9IHsgfTsKLSAgICAgICAgICAgIHJldHVybiBib3Jk
ZXI7Ci0gICAgICAgIH0oKTsKLSAgICAgICAgaWYgKGNvbXB1dGVkUm93Qm9yZGVyLmhlaWdodCgp
ID4gcm93LmxvZ2ljYWxIZWlnaHQoKSkgewotICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMg
YW4gb2RkIHF1aXJrIHdoZW4gdGhlIHJvdyBib3JkZXIgb3ZlcmZsb3dzIHRoZSByb3cuCi0gICAg
ICAgICAgICAvLyBXZSBkb24ndCBwYWludCByb3cgYm9yZGVycyBzbyBpdCBkb2VzIG5vdCBtYXR0
ZXIgdG9vIG11Y2gsIGJ1dCBpZiB3ZSBkb24ndAotICAgICAgICAgICAgLy8gc2V0IHRoaXMgZmFr
ZSBib3JkZXIgdmFsdWUsIHRoYW4gd2UgZWl0aGVyIGVuZCB1cCB3aXRoIGEgbmVnYXRpdmUgY29u
dGVudCBib3gKLSAgICAgICAgICAgIC8vIG9yIHdpdGggYSB3aWRlIGZyYW1lIGJveC4KLSAgICAg
ICAgICAgIC8vIElmIGl0IGhhcHBlbnMgdG8gY2F1c2UgaXNzdWVzIGluIHRoZSBkaXNwbGF5IHRy
ZWUsIHdlIGNvdWxkIGFsc28gY29uc2lkZXIKLSAgICAgICAgICAgIC8vIGEgc3BlY2lhbCBmcmFt
ZSBib3ggb3ZlcnJpZGUsIHdoZXJlIHBhZGRpbmcgYm94ICsgYm9yZGVyICE9IGZyYW1lIGJveC4K
LSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLnZlcnRpY2FsLnRvcCA9IHsgfTsKLSAgICAg
ICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLnZlcnRpY2FsLmJvdHRvbSA9IHsgfTsKLSAgICAgICAg
fQotICAgICAgICByb3dCb3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KHJvdy5sb2dpY2Fs
SGVpZ2h0KCkgLSBjb21wdXRlZFJvd0JvcmRlci5oZWlnaHQoKSk7Ci0KLSAgICAgICAgYXV0byBy
b3dMb2dpY2FsV2lkdGggPSBncmlkLmNvbHVtbnMoKS5sb2dpY2FsV2lkdGgoKSArIDIgKiBncmlk
Lmhvcml6b250YWxTcGFjaW5nKCk7Ci0gICAgICAgIGlmIChjb21wdXRlZFJvd0JvcmRlci53aWR0
aCgpID4gcm93TG9naWNhbFdpZHRoKSB7Ci0gICAgICAgICAgICAvLyBTZWUgY29tbWVudCBhYm92
ZS4KLSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLmhvcml6b250YWwubGVmdCA9IHsgfTsK
LSAgICAgICAgICAgIGNvbXB1dGVkUm93Qm9yZGVyLmhvcml6b250YWwucmlnaHQgPSB7IH07Ci0g
ICAgICAgIH0KLSAgICAgICAgcm93Qm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKHJvd0xv
Z2ljYWxXaWR0aCAtIGNvbXB1dGVkUm93Qm9yZGVyLndpZHRoKCkpOwotICAgICAgICByb3dCb3hH
ZW9tZXRyeS5zZXRCb3JkZXIoY29tcHV0ZWRSb3dCb3JkZXIpOwotCi0gICAgICAgIGlmIChwcmV2
aW91c1JvdyAmJiAmcHJldmlvdXNSb3ctPnBhcmVudCgpICE9ICZyb3dCb3gucGFyZW50KCkpIHsK
LSAgICAgICAgICAgIC8vIFRoaXMgcm93IGlzIGluIGEgZGlmZmVyZW50IHNlY3Rpb24uCi0gICAg
ICAgICAgICByb3dMb2dpY2FsVG9wID0geyB9OwotICAgICAgICB9Ci0gICAgICAgIHJvd0JveEdl
b21ldHJ5LnNldExvZ2ljYWxUb3Aocm93TG9naWNhbFRvcCk7Ci0gICAgICAgIHJvd0JveEdlb21l
dHJ5LnNldExvZ2ljYWxMZWZ0KHsgfSk7Ci0KLSAgICAgICAgcm93TG9naWNhbFRvcCArPSByb3cu
bG9naWNhbEhlaWdodCgpICsgZ3JpZC52ZXJ0aWNhbFNwYWNpbmcoKTsKLSAgICAgICAgcHJldmlv
dXNSb3cgPSAmcm93Qm94OwotICAgIH0KLQotICAgIGF1dG8mIGNvbHVtbnMgPSBncmlkLmNvbHVt
bnMoKTsKLSAgICBWZWN0b3I8SW5saW5lTGF5b3V0VW5pdD4gcm93QmFzZWxpbmVzKHJvd3Muc2l6
ZSgpLCAwKTsKLSAgICAvLyBOb3cgdGhhdCBjZWxscyBhcmUgbGFpZCBvdXQsIGxldCdzIGNvbXB1
dGUgdGhlIHJvdyBiYXNlbGluZXMuCi0gICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJ
bmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGNv
bHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1bW5zLnNpemUoKTsgKytjb2x1bW5JbmRl
eCkgewotICAgICAgICAgICAgYXV0byYgc2xvdCA9ICpncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwg
cm93SW5kZXggfSk7Ci0gICAgICAgICAgICBpZiAoc2xvdC5pc1Jvd1NwYW5uZWQoKSkKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChzbG90Lmhhc1Jvd1NwYW4oKSkK
LSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGF1dG8mIGNlbGwgPSBzbG90
LmNlbGwoKTsKLSAgICAgICAgICAgIHJvd0Jhc2VsaW5lc1tyb3dJbmRleF0gPSBzdGQ6Om1heChy
b3dCYXNlbGluZXNbcm93SW5kZXhdLCBjZWxsLmJhc2VsaW5lKCkpOwotICAgICAgICB9Ci0gICAg
fQotICAgIGZvciAoc2l6ZV90IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dzLnNpemUoKTsg
Kytyb3dJbmRleCkKLSAgICAgICAgcm93c1tyb3dJbmRleF0uc2V0QmFzZWxpbmUocm93QmFzZWxp
bmVzW3Jvd0luZGV4XSk7Ci19Ci0KLXZvaWQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6c2V0VXNl
ZEdlb21ldHJ5Rm9yU2VjdGlvbnMoY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBj
b25zdHJhaW50cykKLXsKLSAgICBhdXRvJiBncmlkID0gZm9ybWF0dGluZ1N0YXRlKCkudGFibGVH
cmlkKCk7Ci0gICAgYXV0byYgdGFibGVCb3ggPSByb290KCk7Ci0gICAgYXV0byBzZWN0aW9uV2lk
dGggPSBncmlkLmNvbHVtbnMoKS5sb2dpY2FsV2lkdGgoKSArIDIgKiBncmlkLmhvcml6b250YWxT
cGFjaW5nKCk7Ci0gICAgYXV0byBsb2dpY2FsVG9wID0gY29uc3RyYWludHMudmVydGljYWwubG9n
aWNhbFRvcDsKLSAgICBhdXRvIHZlcnRpY2FsU3BhY2luZyA9IGdyaWQudmVydGljYWxTcGFjaW5n
KCk7Ci0gICAgYXV0byBwYWRkaW5nQmVmb3JlID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB2ZXJ0
aWNhbFNwYWNpbmcgfTsKLSAgICBhdXRvIHBhZGRpbmdBZnRlciA9IHZlcnRpY2FsU3BhY2luZzsK
LSAgICBmb3IgKGF1dG8mIHNlY3Rpb25Cb3ggOiBjaGlsZHJlbk9mVHlwZTxDb250YWluZXJCb3g+
KHRhYmxlQm94KSkgewotICAgICAgICBhdXRvJiBzZWN0aW9uQm94R2VvbWV0cnkgPSBmb3JtYXR0
aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShzZWN0aW9uQm94KTsKLSAgICAgICAgLy8gU2VjdGlvbiBi
b3JkZXJzIGFyZSBlaXRoZXIgY29sbGFwc2VkIG9yIGlnbm9yZWQuCi0gICAgICAgIHNlY3Rpb25C
b3hHZW9tZXRyeS5zZXRCb3JkZXIoeyB9KTsKLSAgICAgICAgLy8gVXNlIGZha2UgdmVydGljYWwg
cGFkZGluZyB0byBzcGFjZSBvdXQgdGhlIHNlY3Rpb25zLgotICAgICAgICBzZWN0aW9uQm94R2Vv
bWV0cnkuc2V0UGFkZGluZyhFZGdlcyB7IHsgfSwgeyBwYWRkaW5nQmVmb3JlLnZhbHVlT3IoMF9s
dSksIHBhZGRpbmdBZnRlciB9IH0pOwotICAgICAgICBwYWRkaW5nQmVmb3JlID0gV1RGOjpudWxs
b3B0OwotICAgICAgICAvLyBJbnRlcm5hbCB0YWJsZSBlbGVtZW50cyBkbyBub3QgaGF2ZSBtYXJn
aW5zLgotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IH0p
OwotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyB9KTsKLQot
ICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKHNlY3Rpb25XaWR0
aCk7Ci0gICAgICAgIGF1dG8gc2VjdGlvbkNvbnRlbnRIZWlnaHQgPSBMYXlvdXRVbml0IHsgfTsK
LSAgICAgICAgc2l6ZV90IHJvd0NvdW50ID0gMDsKLSAgICAgICAgZm9yIChhdXRvJiByb3dCb3gg
OiBjaGlsZHJlbk9mVHlwZTxDb250YWluZXJCb3g+KHNlY3Rpb25Cb3gpKSB7Ci0gICAgICAgICAg
ICBzZWN0aW9uQ29udGVudEhlaWdodCArPSBnZW9tZXRyeUZvckJveChyb3dCb3gpLmJvcmRlckJv
eEhlaWdodCgpOwotICAgICAgICAgICAgKytyb3dDb3VudDsKLSAgICAgICAgfQotICAgICAgICBz
ZWN0aW9uQ29udGVudEhlaWdodCArPSB2ZXJ0aWNhbFNwYWNpbmcgKiAocm93Q291bnQgLSAxKTsK
LSAgICAgICAgc2VjdGlvbkJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoc2VjdGlvbkNv
bnRlbnRIZWlnaHQpOwotICAgICAgICBzZWN0aW9uQm94R2VvbWV0cnkuc2V0TG9naWNhbExlZnQo
Y29uc3RyYWludHMuaG9yaXpvbnRhbC5sb2dpY2FsTGVmdCk7Ci0gICAgICAgIHNlY3Rpb25Cb3hH
ZW9tZXRyeS5zZXRMb2dpY2FsVG9wKGxvZ2ljYWxUb3ApOwotCi0gICAgICAgIGxvZ2ljYWxUb3Ag
Kz0gc2VjdGlvbkJveEdlb21ldHJ5LmJvcmRlckJveEhlaWdodCgpOwotICAgIH0KLX0KLQotdm9p
ZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRDZWxsKGNvbnN0IFRhYmxlR3JpZDo6Q2Vs
bCYgY2VsbCwgTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UsIE9wdGlvbmFsPExh
eW91dFVuaXQ+IHVzZWRDZWxsSGVpZ2h0KQotewotICAgIEFTU0VSVChjZWxsLmJveCgpLmVzdGFi
bGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dCgpKTsKLQotICAgIGF1dG8mIGdyaWQgPSBmb3Jt
YXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsKLSAgICBhdXRvJiBjZWxsQm94ID0gY2VsbC5ib3go
KTsKLSAgICBhdXRvJiBjZWxsQm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9t
ZXRyeShjZWxsQm94KTsKLQotICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRCb3JkZXIoZ2VvbWV0cnko
KS5jb21wdXRlZENlbGxCb3JkZXIoY2VsbCkpOwotICAgIGNlbGxCb3hHZW9tZXRyeS5zZXRQYWRk
aW5nKGdlb21ldHJ5KCkuY29tcHV0ZWRQYWRkaW5nKGNlbGxCb3gsIGF2YWlsYWJsZUhvcml6b250
YWxTcGFjZSkpOwotICAgIC8vIEludGVybmFsIHRhYmxlIGVsZW1lbnRzIGRvIG5vdCBoYXZlIG1h
cmdpbnMuCi0gICAgY2VsbEJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyB9KTsKLSAg
ICBjZWxsQm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyB9KTsKLQotICAgIGF1dG8gYXZh
aWxhYmxlU3BhY2VGb3JDb250ZW50ID0gWyZdIHsKLSAgICAgICAgYXV0byYgY29sdW1uTGlzdCA9
IGdyaWQuY29sdW1ucygpLmxpc3QoKTsKLSAgICAgICAgYXV0byBsb2dpY2FsV2lkdGggPSBMYXlv
dXRVbml0IHsgfTsKLSAgICAgICAgZm9yIChhdXRvIGNvbHVtbkluZGV4ID0gY2VsbC5zdGFydENv
bHVtbigpOyBjb2x1bW5JbmRleCA8IGNlbGwuZW5kQ29sdW1uKCk7ICsrY29sdW1uSW5kZXgpCi0g
ICAgICAgICAgICBsb2dpY2FsV2lkdGggKz0gY29sdW1uTGlzdC5hdChjb2x1bW5JbmRleCkubG9n
aWNhbFdpZHRoKCk7Ci0gICAgICAgIC8vIE5vIGNvbHVtbiBzcGFjaW5nIHdoZW4gc3Bhbm5pbmcu
Ci0gICAgICAgIGxvZ2ljYWxXaWR0aCArPSAoY2VsbC5jb2x1bW5TcGFuKCkgLSAxKSAqIGdyaWQu
aG9yaXpvbnRhbFNwYWNpbmcoKTsKLSAgICAgICAgcmV0dXJuIGxvZ2ljYWxXaWR0aCAtIGNlbGxC
b3hHZW9tZXRyeS5ob3Jpem9udGFsTWFyZ2luQm9yZGVyQW5kUGFkZGluZygpOwotICAgIH0oKTsK
LSAgICBjZWxsQm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGF2YWlsYWJsZVNwYWNlRm9y
Q29udGVudCk7Ci0KLSAgICBpZiAoY2VsbEJveC5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkg
ewotICAgICAgICBhdXRvIGNvbnN0cmFpbnRzRm9yQ2VsbENvbnRlbnQgPSBnZW9tZXRyeSgpLmNv
bnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChjZWxsQm94KTsKLSAgICAgICAgY29uc3RyYWludHNG
b3JDZWxsQ29udGVudC52ZXJ0aWNhbC5sb2dpY2FsSGVpZ2h0ID0gdXNlZENlbGxIZWlnaHQ7Ci0g
ICAgICAgIGF1dG8gaW52YWxpZGF0aW9uU3RhdGUgPSBJbnZhbGlkYXRpb25TdGF0ZSB7IH07Ci0g
ICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBwYXJ0IG9mIHRoZSBpbnZh
bGlkYXRpb24gc3RhdGUgdG8gaW5kaWNhdGUgd2hlbiB3ZSByZS1sYXlvdXQgdGhlIGNlbGwKLSAg
ICAgICAgLy8gbXVsdGlwbGUgdGltZXMgYXMgcGFydCBvZiB0aGUgbXVsdGktcGFzcyB0YWJsZSBh
bGdvcml0aG0uCi0gICAgICAgIGF1dG8mIGZsb2F0aW5nU3RhdGVGb3JDZWxsQ29udGVudCA9IGxh
eW91dFN0YXRlKCkuZW5zdXJlQmxvY2tGb3JtYXR0aW5nU3RhdGUoY2VsbEJveCkuZmxvYXRpbmdT
dGF0ZSgpOwotICAgICAgICBmbG9hdGluZ1N0YXRlRm9yQ2VsbENvbnRlbnQuY2xlYXIoKTsKLSAg
ICAgICAgTGF5b3V0Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY2VsbEJveCwgbGF5
b3V0U3RhdGUoKSktPmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGNvbnN0
cmFpbnRzRm9yQ2VsbENvbnRlbnQpOwotICAgIH0KLSAgICBjZWxsQm94R2VvbWV0cnkuc2V0Q29u
dGVudEJveEhlaWdodChnZW9tZXRyeSgpLmNlbGxIZWlnaChjZWxsQm94KSk7Ci19Ci0KLUZvcm1h
dHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIFRhYmxlRm9ybWF0dGluZ0Nv
bnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpCi17Ci0gICAgQVNTRVJU
KCFyb290KCkuaXNTaXplQ29udGFpbm1lbnRCb3goKSk7Ci0gICAgLy8gVGFibGVzIGhhdmUgYSBz
bGlnaHR5IGRpZmZlcmVudCBjb25jZXB0IG9mIHNocmluayB0byBmaXQuIEl0J3MgcmVhbGx5IG9u
bHkgZGlmZmVyZW50IHdpdGggbm9uLWF1dG8gIndpZHRoIiB2YWx1ZXMsIHdoZXJlCi0gICAgLy8g
YSBnZW5lcmljIHNocmluay10byBmaXQgYmxvY2sgbGV2ZWwgYm94IGxpa2UgYSBmbG9hdCBib3gg
d291bGQgYmUganVzdCBzaXplZCB0byB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgIndpZHRoIiwgdGFi
bGVzCi0gICAgLy8gY2FuIGFjdHVhbGx5IGJlIHN0cmVjaGVkIHdheSBvdmVyLgotICAgIGF1dG8m
IGdyaWQgPSBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsKLSAgICBpZiAoYXV0byBjb21w
dXRlZFdpZHRoQ29uc3RyYWludHMgPSBncmlkLndpZHRoQ29uc3RyYWludHMoKSkKLSAgICAgICAg
cmV0dXJuICpjb21wdXRlZFdpZHRoQ29uc3RyYWludHM7Ci0KLSAgICAvLyBDb21wdXRlIHRoZSBt
aW5pbXVtL21heGltdW0gd2lkdGggb2YgZWFjaCBjb2x1bW4uCi0gICAgYXV0byBjb21wdXRlZFdp
ZHRoQ29uc3RyYWludHMgPSBjb21wdXRlZFByZWZlcnJlZFdpZHRoRm9yQ29sdW1ucygpOwotICAg
IGdyaWQuc2V0V2lkdGhDb25zdHJhaW50cyhjb21wdXRlZFdpZHRoQ29uc3RyYWludHMpOwotICAg
IHJldHVybiBjb21wdXRlZFdpZHRoQ29uc3RyYWludHM7Ci19Ci0KLVVuaXF1ZVJlZjxUYWJsZUdy
aWQ+IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmVuc3VyZVRhYmxlR3JpZChjb25zdCBDb250YWlu
ZXJCb3gmIHRhYmxlQm94KQotewotICAgIGF1dG8gdGFibGVHcmlkID0gbWFrZVVuaXF1ZVJlZjxU
YWJsZUdyaWQ+KCk7Ci0gICAgYXV0byYgdGFibGVTdHlsZSA9IHRhYmxlQm94LnN0eWxlKCk7Ci0g
ICAgYXV0byBzaG91bGRBcHBseUJvcmRlclNwYWNpbmcgPSB0YWJsZVN0eWxlLmJvcmRlckNvbGxh
cHNlKCkgPT0gQm9yZGVyQ29sbGFwc2U6OlNlcGFyYXRlOwotICAgIHRhYmxlR3JpZC0+c2V0SG9y
aXpvbnRhbFNwYWNpbmcoTGF5b3V0VW5pdCB7IHNob3VsZEFwcGx5Qm9yZGVyU3BhY2luZyA/IHRh
YmxlU3R5bGUuaG9yaXpvbnRhbEJvcmRlclNwYWNpbmcoKSA6IDAgfSk7Ci0gICAgdGFibGVHcmlk
LT5zZXRWZXJ0aWNhbFNwYWNpbmcoTGF5b3V0VW5pdCB7IHNob3VsZEFwcGx5Qm9yZGVyU3BhY2lu
ZyA/IHRhYmxlU3R5bGUudmVydGljYWxCb3JkZXJTcGFjaW5nKCkgOiAwIH0pOwotCi0gICAgYXV0
byogZmlyc3RDaGlsZCA9IHRhYmxlQm94LmZpcnN0Q2hpbGQoKTsKLSAgICBpZiAoIWZpcnN0Q2hp
bGQpIHsKLSAgICAgICAgLy8gVGhlIHJhcmUgY2FzZSBvZiBlbXB0eSB0YWJsZS4KLSAgICAgICAg
cmV0dXJuIHRhYmxlR3JpZDsKLSAgICB9Ci0KLSAgICBjb25zdCBCb3gqIHRhYmxlQ2FwdGlvbiA9
IG51bGxwdHI7Ci0gICAgY29uc3QgQm94KiBjb2xncm91cCA9IG51bGxwdHI7Ci0gICAgLy8gVGFi
bGUgY2FwdGlvbiBpcyBhbiBvcHRpb25hbCBlbGVtZW50OyBpZiB1c2VkLCBpdCBpcyBhbHdheXMg
dGhlIGZpcnN0IGNoaWxkIG9mIGEgPHRhYmxlPi4KLSAgICBpZiAoZmlyc3RDaGlsZC0+aXNUYWJs
ZUNhcHRpb24oKSkKLSAgICAgICAgdGFibGVDYXB0aW9uID0gZmlyc3RDaGlsZDsKLSAgICAvLyBU
aGUgPGNvbGdyb3VwPiBtdXN0IGFwcGVhciBhZnRlciBhbnkgb3B0aW9uYWwgPGNhcHRpb24+IGVs
ZW1lbnQgYnV0IGJlZm9yZSBhbnkgPHRoZWFkPiwgPHRoPiwgPHRib2R5PiwgPHRmb290PiBhbmQg
PHRyPiBlbGVtZW50LgotICAgIGF1dG8qIGNvbGdyb3VwQ2FuZGlkYXRlID0gZmlyc3RDaGlsZDsK
LSAgICBpZiAodGFibGVDYXB0aW9uKQotICAgICAgICBjb2xncm91cENhbmRpZGF0ZSA9IHRhYmxl
Q2FwdGlvbi0+bmV4dFNpYmxpbmcoKTsKLSAgICBpZiAoY29sZ3JvdXBDYW5kaWRhdGUtPmlzVGFi
bGVDb2x1bW5Hcm91cCgpKQotICAgICAgICBjb2xncm91cCA9IGNvbGdyb3VwQ2FuZGlkYXRlOwot
Ci0gICAgaWYgKGNvbGdyb3VwKSB7Ci0gICAgICAgIGF1dG8mIGNvbHVtbnMgPSB0YWJsZUdyaWQt
PmNvbHVtbnMoKTsKLSAgICAgICAgZm9yIChhdXRvKiBjb2x1bW4gPSBkb3duY2FzdDxDb250YWlu
ZXJCb3g+KCpjb2xncm91cCkuZmlyc3RDaGlsZCgpOyBjb2x1bW47IGNvbHVtbiA9IGNvbHVtbi0+
bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgQVNTRVJUKGNvbHVtbi0+aXNUYWJsZUNvbHVt
bigpKTsKLSAgICAgICAgICAgIGF1dG8gY29sdW1uU3BhbkNvdW50ID0gY29sdW1uLT5jb2x1bW5T
cGFuKCk7Ci0gICAgICAgICAgICBBU1NFUlQoY29sdW1uU3BhbkNvdW50ID4gMCk7Ci0gICAgICAg
ICAgICB3aGlsZSAoY29sdW1uU3BhbkNvdW50LS0pCi0gICAgICAgICAgICAgICAgY29sdW1ucy5h
ZGRDb2x1bW4oZG93bmNhc3Q8Q29udGFpbmVyQm94PigqY29sdW1uKSk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICBhdXRvKiBmaXJzdFNlY3Rpb24gPSBjb2xncm91cCA/IGNvbGdyb3VwLT5uZXh0
U2libGluZygpIDogdGFibGVDYXB0aW9uID8gdGFibGVDYXB0aW9uLT5uZXh0U2libGluZygpIDog
Zmlyc3RDaGlsZDsKLSAgICBmb3IgKGF1dG8qIHNlY3Rpb24gPSBmaXJzdFNlY3Rpb247IHNlY3Rp
b247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIEFTU0VSVChz
ZWN0aW9uLT5pc1RhYmxlSGVhZGVyKCkgfHwgc2VjdGlvbi0+aXNUYWJsZUJvZHkoKSB8fCBzZWN0
aW9uLT5pc1RhYmxlRm9vdGVyKCkpOwotICAgICAgICBmb3IgKGF1dG8qIHJvdyA9IGRvd25jYXN0
PENvbnRhaW5lckJveD4oKnNlY3Rpb24pLmZpcnN0Q2hpbGQoKTsgcm93OyByb3cgPSByb3ctPm5l
eHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIEFTU0VSVChyb3ctPmlzVGFibGVSb3coKSk7Ci0g
ICAgICAgICAgICBmb3IgKGF1dG8qIGNlbGwgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KCpyb3cp
LmZpcnN0Q2hpbGQoKTsgY2VsbDsgY2VsbCA9IGNlbGwtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAg
ICAgICAgICAgICBBU1NFUlQoY2VsbC0+aXNUYWJsZUNlbGwoKSk7Ci0gICAgICAgICAgICAgICAg
dGFibGVHcmlkLT5hcHBlbmRDZWxsKGRvd25jYXN0PENvbnRhaW5lckJveD4oKmNlbGwpKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdGFibGVHcmlkOwotfQot
Ci1Gb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBUYWJsZUZvcm1h
dHRpbmdDb250ZXh0Ojpjb21wdXRlZFByZWZlcnJlZFdpZHRoRm9yQ29sdW1ucygpCi17Ci0gICAg
YXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgYXV0
byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZS50YWJsZUdyaWQoKTsKLSAgICBBU1NFUlQoIWdyaWQu
d2lkdGhDb25zdHJhaW50cygpKTsKLQotICAgIC8vIENvbHVtbiBwcmVmZXJyZWQgd2lkdGggY29t
cHV0YXRpb24gYXMgZm9sbG93czoKLSAgICAvLyAxLiBDb2xsZWN0IGVhY2ggY2VsbHMnIHdpZHRo
IGNvbnN0cmFpbnRzCi0gICAgLy8gMi4gQ29sbGVjdCBmaXhlZCBjb2x1bW4gd2lkdGhzIHNldCBi
eSA8Y29sZ3JvdXA+J3MgYW5kIDxjb2w+cwotICAgIC8vIDMuIEZpbmQgdGhlIG1pbi9tYXggd2lk
dGggZm9yIGVhY2ggY29sdW1ucyB1c2luZyB0aGUgY2VsbCBjb25zdHJhaW50cyBhbmQgdGhlIDxj
b2w+IGZpeGVkIHdpZHRocyBidXQgaWdub3JlIGNvbHVtbiBzcGFucy4KLSAgICAvLyA0LiBEaXN0
cmlidXRlIGNvbHVtbiBzcGFubmluZyBjZWxscyBtaW4vbWF4IHdpZHRocy4KLSAgICAvLyA1LiBB
ZGQgdGhlbSBhbGwgdXAgYW5kIHJldHVybiB0aGUgY29tcHV0ZWQgbWluL21heCB3aWR0aHMuCi0g
ICAgZm9yIChhdXRvJiBjZWxsIDogZ3JpZC5jZWxscygpKSB7Ci0gICAgICAgIGF1dG8mIGNlbGxC
b3ggPSBjZWxsLT5ib3goKTsKLSAgICAgICAgQVNTRVJUKGNlbGxCb3guZXN0YWJsaXNoZXNCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0KCkpOwotCi0gICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGggPSBm
b3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChjZWxsQm94KTsK
LSAgICAgICAgaWYgKCFpbnRyaW5zaWNXaWR0aCkgewotICAgICAgICAgICAgaW50cmluc2ljV2lk
dGggPSBnZW9tZXRyeSgpLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JDZWxsKCpjZWxsKTsK
LSAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
Rm9yQm94KGNlbGxCb3gsICppbnRyaW5zaWNXaWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8g
U3Bhbm5lciBjZWxscyBwdXQgdGhlaXIgaW50cmluc2ljIHdpZHRocyBvbiB0aGUgaW5pdGlhbCBz
bG90cy4KLSAgICAgICAgZ3JpZC5zbG90KGNlbGwtPnBvc2l0aW9uKCkpLT5zZXRXaWR0aENvbnN0
cmFpbnRzKCppbnRyaW5zaWNXaWR0aCk7Ci0gICAgfQotCi0gICAgLy8gMi4gQ29sbGVjdCB0aGUg
Zml4ZWQgd2lkdGggPGNvbD5zLgotICAgIGF1dG8mIGNvbHVtbkxpc3QgPSBncmlkLmNvbHVtbnMo
KS5saXN0KCk7Ci0gICAgVmVjdG9yPE9wdGlvbmFsPExheW91dFVuaXQ+PiBmaXhlZFdpZHRoQ29s
dW1uczsKLSAgICBmb3IgKGF1dG8mIGNvbHVtbiA6IGNvbHVtbkxpc3QpIHsKLSAgICAgICAgYXV0
byBmaXhlZFdpZHRoID0gWyZdICgpIC0+IE9wdGlvbmFsPExheW91dFVuaXQ+IHsKLSAgICAgICAg
ICAgIGF1dG8qIGNvbHVtbkJveCA9IGNvbHVtbi5ib3goKTsKLSAgICAgICAgICAgIGlmICghY29s
dW1uQm94KSB7Ci0gICAgICAgICAgICAgICAgLy8gQW5veW5tb3VzIGNvbHVtbnMgZG9uJ3QgaGF2
ZSBhc3NvY2lhdGVkIGxheW91dCBib3hlcyBhbmQgY2FuJ3QgaGF2ZSBmaXhlZCBjb2wgc2l6ZS4K
LSAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
aWYgKGF1dG8gd2lkdGggPSBjb2x1bW5Cb3gtPmNvbHVtbldpZHRoKCkpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIHdpZHRoOwotICAgICAgICAgICAgcmV0dXJuIGdlb21ldHJ5KCkuY29tcHV0ZWRD
b2x1bW5XaWR0aCgqY29sdW1uQm94KTsKLSAgICAgICAgfTsKLSAgICAgICAgZml4ZWRXaWR0aENv
bHVtbnMuYXBwZW5kKGZpeGVkV2lkdGgoKSk7Ci0gICAgfQotCi0gICAgVmVjdG9yPEZvcm1hdHRp
bmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzPiBjb2x1bW5JbnRyaW5zaWNXaWR0
aHMoY29sdW1uTGlzdC5zaXplKCkpOwotICAgIC8vIDMuIENvbGxlY3QgaGUgbWluL21heCB3aWR0
aCBmb3IgZWFjaCBjb2x1bW4gYnV0IGlnbm9yZSBjb2x1bW4gc3BhbnMgZm9yIG5vdy4KLSAgICBW
ZWN0b3I8U2xvdFBvc2l0aW9uPiBzcGFubmluZ0NlbGxQb3NpdGlvbkxpc3Q7Ci0gICAgc2l6ZV90
IG51bWJlck9mQWN0dWFsQ29sdW1ucyA9IDA7Ci0gICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXgg
PSAwOyBjb2x1bW5JbmRleCA8IGNvbHVtbkxpc3Quc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7Ci0g
ICAgICAgIGF1dG8gY29sdW1uSGFzTm9uU3Bhbm5lZENlbGwgPSBmYWxzZTsKLSAgICAgICAgZm9y
IChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IGdyaWQucm93cygpLnNpemUoKTsgKyty
b3dJbmRleCkgewotICAgICAgICAgICAgYXV0byYgc2xvdCA9ICpncmlkLnNsb3QoeyBjb2x1bW5J
bmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICBpZiAoc2xvdC5pc0NvbHVtblNwYW5uZWQo
KSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNvbHVtbkhhc05vblNw
YW5uZWRDZWxsID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChzbG90Lmhhc0NvbHVtblNwYW4oKSkg
ewotICAgICAgICAgICAgICAgIHNwYW5uaW5nQ2VsbFBvc2l0aW9uTGlzdC5hcHBlbmQoeyBjb2x1
bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBhdXRvIGNvbHVtbkZpeGVkV2lkdGggPSBmaXhlZFdpZHRoQ29s
dW1uc1tjb2x1bW5JbmRleF07Ci0gICAgICAgICAgICBhdXRvIHdpZHRoQ29uc3RyYWludHMgPSAh
Y29sdW1uRml4ZWRXaWR0aCA/IHNsb3Qud2lkdGhDb25zdHJhaW50cygpIDogRm9ybWF0dGluZ0Nv
bnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyAqY29sdW1uRml4ZWRXaWR0aCwgKmNv
bHVtbkZpeGVkV2lkdGggfTsKLSAgICAgICAgICAgIGNvbHVtbkludHJpbnNpY1dpZHRoc1tjb2x1
bW5JbmRleF0ubWluaW11bSA9IHN0ZDo6bWF4KHdpZHRoQ29uc3RyYWludHMubWluaW11bSwgY29s
dW1uSW50cmluc2ljV2lkdGhzW2NvbHVtbkluZGV4XS5taW5pbXVtKTsKLSAgICAgICAgICAgIGNv
bHVtbkludHJpbnNpY1dpZHRoc1tjb2x1bW5JbmRleF0ubWF4aW11bSA9IHN0ZDo6bWF4KHdpZHRo
Q29uc3RyYWludHMubWF4aW11bSwgY29sdW1uSW50cmluc2ljV2lkdGhzW2NvbHVtbkluZGV4XS5t
YXhpbXVtKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29sdW1uSGFzTm9uU3Bhbm5lZENlbGwp
Ci0gICAgICAgICAgICArK251bWJlck9mQWN0dWFsQ29sdW1uczsKLSAgICB9Ci0KLSAgICAvLyA0
LiBEaXN0cmlidXRlIHRoZSBzcGFubmluZyBtaW4vbWF4IHdpZHRocy4KLSAgICBmb3IgKGF1dG8g
c3Bhbm5pbmdDZWxsUG9zaXRpb24gOiBzcGFubmluZ0NlbGxQb3NpdGlvbkxpc3QpIHsKLSAgICAg
ICAgYXV0byYgc2xvdCA9ICpncmlkLnNsb3Qoc3Bhbm5pbmdDZWxsUG9zaXRpb24pOwotICAgICAg
ICBhdXRvJiBjZWxsID0gc2xvdC5jZWxsKCk7Ci0gICAgICAgIEFTU0VSVChzbG90Lmhhc0NvbHVt
blNwYW4oKSk7Ci0gICAgICAgIGF1dG8gd2lkdGhDb25zdHJhaW50c1RvRGlzdHJpYnV0ZSA9IHNs
b3Qud2lkdGhDb25zdHJhaW50cygpOwotICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW5TcGFuSW5k
ZXggPSBjZWxsLnN0YXJ0Q29sdW1uKCk7IGNvbHVtblNwYW5JbmRleCA8IGNlbGwuZW5kQ29sdW1u
KCk7ICsrY29sdW1uU3BhbkluZGV4KQotICAgICAgICAgICAgd2lkdGhDb25zdHJhaW50c1RvRGlz
dHJpYnV0ZSAtPSBjb2x1bW5JbnRyaW5zaWNXaWR0aHNbY29sdW1uU3BhbkluZGV4XTsKLSAgICAg
ICAgLy8gPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogNTBweCI+PHRyPjx0ZCBjb2xzcGFu
PTI+bG9uZyBsb25nIHRleHQ8L3RkPjwvdHI+PHRyPjx0ZD5sbzwvdGQ+PHRkPnh0PC90ZD48dHI+
PC90YWJsZT4KLSAgICAgICAgLy8gW2xvbmcgbG9uZyB0ZXh0XQotICAgICAgICAvLyBbbG9dICAg
ICAgICBbeHRdCi0gICAgICAgIC8vIFdoaWxlIGl0IGxvb2tzIGxpa2UgdGhlIHNwYW5uaW5nIGNl
bGwgaGFzIHRvIGRpc3RyaWJ1dGUgYWxsIGl0cyBzcGFubmluZyB3aWR0aCwgdGhlIGJvcmRlci1z
cGFjaW5nIHRha2VzIG1vc3Qgb2YgdGhlIHNwYWNlIGFuZAotICAgICAgICAvLyBubyBkaXN0cmli
dXRpb24gaXMgbmVlZGVkIGF0IGFsbC4KLSAgICAgICAgd2lkdGhDb25zdHJhaW50c1RvRGlzdHJp
YnV0ZSAtPSAoY2VsbC5jb2x1bW5TcGFuKCkgLSAxKSAqIGdyaWQuaG9yaXpvbnRhbFNwYWNpbmco
KTsKLSAgICAgICAgLy8gRklYTUU6IENoZWNrIGlmIGZpeGVkIHdpZHRoIGNvbHVtbnMgc2hvdWxk
IGJlIHNraXBwZWQgaGVyZS4KLSAgICAgICAgd2lkdGhDb25zdHJhaW50c1RvRGlzdHJpYnV0ZS5t
aW5pbXVtID0gc3RkOjptYXgoTGF5b3V0VW5pdCB7IH0sIHdpZHRoQ29uc3RyYWludHNUb0Rpc3Ry
aWJ1dGUubWluaW11bSAvIGNlbGwuY29sdW1uU3BhbigpKTsKLSAgICAgICAgd2lkdGhDb25zdHJh
aW50c1RvRGlzdHJpYnV0ZS5tYXhpbXVtID0gc3RkOjptYXgoTGF5b3V0VW5pdCB7IH0sIHdpZHRo
Q29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWF4aW11bSAvIGNlbGwuY29sdW1uU3BhbigpKTsKLSAg
ICAgICAgaWYgKHdpZHRoQ29uc3RyYWludHNUb0Rpc3RyaWJ1dGUubWluaW11bSB8fCB3aWR0aENv
bnN0cmFpbnRzVG9EaXN0cmlidXRlLm1heGltdW0pIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90
IGNvbHVtblNwYW5JbmRleCA9IGNlbGwuc3RhcnRDb2x1bW4oKTsgY29sdW1uU3BhbkluZGV4IDwg
Y2VsbC5lbmRDb2x1bW4oKTsgKytjb2x1bW5TcGFuSW5kZXgpCi0gICAgICAgICAgICAgICAgY29s
dW1uSW50cmluc2ljV2lkdGhzW2NvbHVtblNwYW5JbmRleF0gKz0gd2lkdGhDb25zdHJhaW50c1Rv
RGlzdHJpYnV0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIDUuIFRoZSBmaW5hbCB0YWJs
ZSBtaW4vbWF4IHdpZHRocyBpcyBqdXN0IHRoZSBhY2N1bXVsYXRlZCBjb2x1bW4gY29uc3RyYWlu
dHMuCi0gICAgYXV0byB0YWJsZVdpZHRoQ29uc3RyYWludHMgPSBJbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzIHsgfTsKLSAgICBmb3IgKGF1dG8mIGNvbHVtbkludHJpbnNpY1dpZHRoIDogY29sdW1u
SW50cmluc2ljV2lkdGhzKQotICAgICAgICB0YWJsZVdpZHRoQ29uc3RyYWludHMgKz0gY29sdW1u
SW50cmluc2ljV2lkdGg7Ci0gICAgLy8gRXhhcGFuZCB0aGUgcHJlZmVycmVkIHdpZHRoIHdpdGgg
bGVhZGluZyBhbmQgdHJhaWxpbmcgY2VsbCBzcGFjaW5nIChub3RlIHRoYXQgY29sdW1uIHNwYW5u
ZXJzIGNvdW50IGFzIG9uZSBjZWxsKS4KLSAgICB0YWJsZVdpZHRoQ29uc3RyYWludHMgKz0gKG51
bWJlck9mQWN0dWFsQ29sdW1ucyArIDEpICogZ3JpZC5ob3Jpem9udGFsU3BhY2luZygpOwotICAg
IHJldHVybiB0YWJsZVdpZHRoQ29uc3RyYWludHM7Ci19Ci0KLXZvaWQgVGFibGVGb3JtYXR0aW5n
Q29udGV4dDo6Y29tcHV0ZUFuZERpc3RyaWJ1dGVFeHRyYVNwYWNlKExheW91dFVuaXQgYXZhaWxh
YmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVWZXJ0aWNh
bFNwYWNlKQotewotICAgIC8vIENvbXB1dGUgYW5kIGJhbGFuY2UgdGhlIGNvbHVtbiBhbmQgcm93
IHNwYWNlcy4KLSAgICBhdXRvJiBncmlkID0gZm9ybWF0dGluZ1N0YXRlKCkudGFibGVHcmlkKCk7
Ci0gICAgYXV0byYgY29sdW1ucyA9IGdyaWQuY29sdW1ucygpLmxpc3QoKTsKLSAgICBhdXRvIHRh
YmxlTGF5b3V0ID0gdGhpcy0+dGFibGVMYXlvdXQoKTsKLQotICAgIC8vIENvbHVtbnMgZmlyc3Qu
Ci0gICAgYXV0byBkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZXMgPSB0YWJsZUxheW91dC5kaXN0
cmlidXRlZEhvcml6b250YWxTcGFjZShhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAgIEFT
U0VSVChkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZXMuc2l6ZSgpID09IGNvbHVtbnMuc2l6ZSgp
KTsKLSAgICBhdXRvIGNvbHVtbkxvZ2ljYWxMZWZ0ID0gZ3JpZC5ob3Jpem9udGFsU3BhY2luZygp
OwotICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1bW5z
LnNpemUoKTsgKytjb2x1bW5JbmRleCkgewotICAgICAgICBhdXRvJiBjb2x1bW4gPSBjb2x1bW5z
W2NvbHVtbkluZGV4XTsKLSAgICAgICAgY29sdW1uLnNldExvZ2ljYWxMZWZ0KGNvbHVtbkxvZ2lj
YWxMZWZ0KTsKLSAgICAgICAgY29sdW1uLnNldExvZ2ljYWxXaWR0aChkaXN0cmlidXRlZEhvcml6
b250YWxTcGFjZXNbY29sdW1uSW5kZXhdKTsKLSAgICAgICAgY29sdW1uTG9naWNhbExlZnQgKz0g
ZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2VzW2NvbHVtbkluZGV4XSArIGdyaWQuaG9yaXpvbnRh
bFNwYWNpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBSb3dzIHNlY29uZC4KLSAgICBhdXRvJiByb3dz
ID0gZ3JpZC5yb3dzKCkubGlzdCgpOwotICAgIGZvciAoc2l6ZV90IHJvd0luZGV4ID0gMDsgcm93
SW5kZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkgewotICAgICAgICBmb3IgKHNpemVfdCBj
b2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29sdW1uSW5k
ZXgpIHsKLSAgICAgICAgICAgIGF1dG8mIHNsb3QgPSAqZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgs
IHJvd0luZGV4IH0pOwotICAgICAgICAgICAgaWYgKHNsb3QuaXNSb3dTcGFubmVkKCkpCi0gICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBsYXlvdXRDZWxsKHNsb3QuY2VsbCgp
LCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpOwotICAgICAgICAgICAgaWYgKHNsb3QuaGFzUm93
U3BhbigpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgLy8gVGhlIG1p
bmltdW0gaGVpZ2h0IG9mIGEgcm93ICh3aXRob3V0IHNwYW5uaW5nLXJlbGF0ZWQgaGVpZ2h0IGRp
c3RyaWJ1dGlvbikgaXMgZGVmaW5lZCBhcyB0aGUgaGVpZ2h0IG9mIGFuIGh5cG90aGV0aWNhbAot
ICAgICAgICAgICAgLy8gbGluZWJveCBjb250YWluaW5nIHRoZSBjZWxscyBvcmlnaW5hdGluZyBp
biB0aGUgcm93LgotICAgICAgICAgICAgYXV0byYgY2VsbCA9IHNsb3QuY2VsbCgpOwotICAgICAg
ICAgICAgY2VsbC5zZXRCYXNlbGluZShnZW9tZXRyeSgpLnVzZWRCYXNlbGluZUZvckNlbGwoY2Vs
bC5ib3goKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXV0byBkaXN0cmlidXRlZFZlcnRp
Y2FsU3BhY2VzID0gdGFibGVMYXlvdXQuZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNlKGF2YWlsYWJs
ZVZlcnRpY2FsU3BhY2UpOwotICAgIEFTU0VSVChkaXN0cmlidXRlZFZlcnRpY2FsU3BhY2VzLnNp
emUoKSA9PSByb3dzLnNpemUoKSk7Ci0gICAgYXV0byByb3dMb2dpY2FsVG9wID0gZ3JpZC52ZXJ0
aWNhbFNwYWNpbmcoKTsKLSAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwg
cm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKLSAgICAgICAgYXV0byYgcm93ID0gcm93c1tyb3dJ
bmRleF07Ci0gICAgICAgIHJvdy5zZXRMb2dpY2FsSGVpZ2h0KGRpc3RyaWJ1dGVkVmVydGljYWxT
cGFjZXNbcm93SW5kZXhdKTsKLSAgICAgICAgcm93LnNldExvZ2ljYWxUb3Aocm93TG9naWNhbFRv
cCk7Ci0gICAgICAgIHJvd0xvZ2ljYWxUb3AgKz0gZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNlc1ty
b3dJbmRleF0gKyBncmlkLnZlcnRpY2FsU3BhY2luZygpOwotICAgIH0KLX0KLQotfQotfQotCi0j
ZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcv
VGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9y
bWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDFmMzBkZTEzNTQ1NjY1NTgxZWI5NDlhMjdiODBkZjRlMTIyMjVlNmYuLjAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgKKysrIC9kZXYvbnVs
bApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAq
IGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5B
QkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29u
dGV4dC5oIgotI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiVGFi
bGVHcmlkLmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgotI2luY2x1ZGUgPHd0Zi9Vbmlx
dWVSZWYuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNs
YXNzIEludmFsaWRhdGlvblN0YXRlOwotLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBsYXlv
dXQgbG9naWMgZm9yIHRhYmxlIGZvcm1hdHRpbmcgY29udGV4dHMuCi0vLyBodHRwczovL3d3dy53
My5vcmcvVFIvQ1NTMjIvdGFibGVzLmh0bWwKLWNsYXNzIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQg
ZmluYWwgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQgewotICAgIFdURl9NQUtFX0lTT19BTExP
Q0FURUQoVGFibGVGb3JtYXR0aW5nQ29udGV4dCk7Ci1wdWJsaWM6Ci0gICAgVGFibGVGb3JtYXR0
aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgVGFi
bGVGb3JtYXR0aW5nU3RhdGUmKTsKLSAgICB2b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxp
ZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKSBvdmVycmlk
ZTsKLSAgICBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0K
LSAgICBzdGF0aWMgVW5pcXVlUmVmPFRhYmxlR3JpZD4gZW5zdXJlVGFibGVHcmlkKGNvbnN0IENv
bnRhaW5lckJveCYgdGFibGVCb3gpOwotCi1wcml2YXRlOgotICAgIGNsYXNzIFRhYmxlTGF5b3V0
IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFRhYmxlTGF5b3V0KGNvbnN0IFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQmLCBjb25zdCBUYWJsZUdyaWQmKTsKLQotICAgICAgICB1c2luZyBEaXN0cmlidXRl
ZFNwYWNlcyA9IFZlY3RvcjxMYXlvdXRVbml0PjsKLSAgICAgICAgRGlzdHJpYnV0ZWRTcGFjZXMg
ZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2UoTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFs
U3BhY2UpOwotICAgICAgICBEaXN0cmlidXRlZFNwYWNlcyBkaXN0cmlidXRlZFZlcnRpY2FsU3Bh
Y2UoT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlVmVydGljYWxTcGFjZSk7Ci0KLSAgICBw
cml2YXRlOgotICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5n
Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRleHQ7IH0KLQotICAgICAg
ICBjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiBtX2Zvcm1hdHRpbmdDb250ZXh0OwotICAg
ICAgICBjb25zdCBUYWJsZUdyaWQmIG1fZ3JpZDsKLSAgICB9OwotCi0gICAgY2xhc3MgR2VvbWV0
cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKLSAgICBwdWJsaWM6Ci0g
ICAgICAgIExheW91dFVuaXQgY2VsbEhlaWdoKGNvbnN0IENvbnRhaW5lckJveCYpIGNvbnN0Owot
ICAgICAgICBFZGdlcyBjb21wdXRlZENlbGxCb3JkZXIoY29uc3QgVGFibGVHcmlkOjpDZWxsJikg
Y29uc3Q7Ci0gICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbXB1dGVkQ29sdW1uV2lkdGgo
Y29uc3QgQ29udGFpbmVyQm94JiBjb2x1bW5Cb3gpOwotICAgICAgICBGb3JtYXR0aW5nQ29udGV4
dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9y
Q2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmKTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB1
c2VkQmFzZWxpbmVGb3JDZWxsKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCk7Ci0KLSAgICBw
cml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgVGFibGVGb3JtYXR0aW5nQ29udGV4dDsKLSAg
ICAgICAgR2VvbWV0cnkoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYsIGNvbnN0IFRhYmxl
R3JpZCYpOwotCi0gICAgICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRp
bmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8VGFibGVGb3JtYXR0aW5nQ29udGV4
dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpmb3JtYXR0aW5nQ29udGV4dCgpKTsgfQot
ICAgICAgICBjb25zdCBUYWJsZUdyaWQmIG1fZ3JpZDsKLSAgICB9OwotICAgIFRhYmxlRm9ybWF0
dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnko
KnRoaXMsIGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpKTsgfQotCi0gICAgY2xhc3MgUXVp
cmtzIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgewotICAgIHB1YmxpYzoKLSAg
ICAgICAgUXVpcmtzKGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmKTsKLQotICAgICAgICBi
b29sIHNob3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luKGNvbnN0IENvbnRhaW5l
ckJveCYpIGNvbnN0OwotCi0gICAgICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmIGZv
cm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8VGFibGVGb3JtYXR0aW5n
Q29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7
IH0KLSAgICAgICAgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBj
b25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCk7IH0KLSAgICB9Owot
ICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyBxdWlya3MoKSBjb25zdCB7IHJldHVy
biBRdWlya3MoKnRoaXMpOyB9Ci0KLSAgICBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUxh
eW91dCB0YWJsZUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIFRhYmxlTGF5b3V0KCp0aGlzLCBmb3Jt
YXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKSk7IH0KLQotICAgIEludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJpZGU7Ci0gICAg
dm9pZCBsYXlvdXRDZWxsKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYsIExheW91dFVuaXQgYXZhaWxh
YmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkQ2VsbEhlaWdodCA9
IFdURjo6bnVsbG9wdCk7Ci0gICAgdm9pZCBzZXRVc2VkR2VvbWV0cnlGb3JDZWxscyhMYXlvdXRV
bml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSk7Ci0gICAgdm9pZCBzZXRVc2VkR2VvbWV0cnlG
b3JSb3dzKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKLSAgICB2b2lkIHNl
dFVzZWRHZW9tZXRyeUZvclNlY3Rpb25zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVu
dCYpOwotCi0gICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBjb21wdXRlZFByZWZlcnJlZFdp
ZHRoRm9yQ29sdW1ucygpOwotICAgIHZvaWQgY29tcHV0ZUFuZERpc3RyaWJ1dGVFeHRyYVNwYWNl
KExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0
PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKTsKLQotICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ1N0
YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxUYWJsZUZvcm1h
dHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQotICAg
IFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3duY2Fz
dDxUYWJsZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0
ZSgpKTsgfQotfTsKLQotaW5saW5lIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpH
ZW9tZXRyeShjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiB0YWJsZUZvcm1hdHRpbmdDb250
ZXh0LCBjb25zdCBUYWJsZUdyaWQmIGdyaWQpCi0gICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnkodGFibGVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICAsIG1fZ3JpZChncmlkKQotewotfQot
Ci1pbmxpbmUgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpRdWlya3MoY29uc3QgVGFi
bGVGb3JtYXR0aW5nQ29udGV4dCYgdGFibGVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICA6IEZvcm1h
dHRpbmdDb250ZXh0OjpRdWlya3ModGFibGVGb3JtYXR0aW5nQ29udGV4dCkKLXsKLX0KLQotfQot
fQotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoVGFi
bGVGb3JtYXR0aW5nQ29udGV4dCwgaXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkpCi0KLSNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJs
ZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L3Rh
YmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzMyMzkyNjk0ZjZlN2E4MjQyOWMyMGE1ZTYxMDk4NDBl
MmFlZGM4Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4
dEdlb21ldHJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
LSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0g
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ0NvbnRleHQu
aCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAi
SW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIK
LSNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCi0jaW5jbHVkZSAiTGF5b3V0RGVzY2VuZGFudEl0
ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRhaW5pbmdCbG9jay5oIgotI2lu
Y2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi1MYXlvdXRVbml0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5OjpjZWxsSGVpZ2goY29uc3QgQ29udGFpbmVyQm94JiBjZWxsQm94KSBjb25zdAotewot
ICAgIEFTU0VSVChjZWxsQm94LmlzSW5GbG93KCkpOwotICAgIGF1dG8gY29udGVudEhlaWdodCA9
IExheW91dFVuaXQgeyB9OwotICAgIGlmIChmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJrcygpLnNo
b3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luKGNlbGxCb3gpKSB7Ci0gICAgICAg
IEFTU0VSVChjZWxsQm94LmZpcnN0SW5GbG93Q2hpbGQoKSk7Ci0gICAgICAgIGF1dG8gZm9ybWF0
dGluZ0NvbnRleHQgPSB0aGlzLT5mb3JtYXR0aW5nQ29udGV4dCgpOwotICAgICAgICBhdXRvJiBm
aXJzdEluRmxvd0NoaWxkID0gKmNlbGxCb3guZmlyc3RJbkZsb3dDaGlsZCgpOwotICAgICAgICBh
dXRvJiBsYXN0SW5GbG93Q2hpbGQgPSAqY2VsbEJveC5sYXN0SW5GbG93Q2hpbGQoKTsKLSAgICAg
ICAgYXV0byYgZmlyc3RJbkZsb3dDaGlsZEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2Vv
bWV0cnlGb3JCb3goZmlyc3RJbkZsb3dDaGlsZCwgRXNjYXBlUmVhc29uOjpUYWJsZVF1aXJrTmVl
ZHNHZW9tZXRyeUZyb21Fc3RhYmxpc2hlZEZvcm1hdHRpbmdDb250ZXh0KTsKLSAgICAgICAgYXV0
byYgbGFzdEluRmxvd0NoaWxkR2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZv
ckJveChsYXN0SW5GbG93Q2hpbGQsIEVzY2FwZVJlYXNvbjo6VGFibGVRdWlya05lZWRzR2VvbWV0
cnlGcm9tRXN0YWJsaXNoZWRGb3JtYXR0aW5nQ29udGV4dCk7Ci0KLSAgICAgICAgYXV0byB0b3Ag
PSBmaXJzdEluRmxvd0NoaWxkLnN0eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSA/IEJveEdl
b21ldHJ5Ojpib3JkZXJCb3hSZWN0KGZpcnN0SW5GbG93Q2hpbGRHZW9tZXRyeSkudG9wKCkgOiBC
b3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChmaXJzdEluRmxvd0NoaWxkR2VvbWV0cnkpLnRvcCgp
OwotICAgICAgICBhdXRvIGJvdHRvbSA9IGxhc3RJbkZsb3dDaGlsZC5zdHlsZSgpLmhhc01hcmdp
bkFmdGVyUXVpcmsoKSA/IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGxhc3RJbkZsb3dDaGls
ZEdlb21ldHJ5KS5ib3R0b20oKSA6IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KGxhc3RJbkZs
b3dDaGlsZEdlb21ldHJ5KS5ib3R0b20oKTsKLSAgICAgICAgY29udGVudEhlaWdodCA9IGJvdHRv
bSAtIHRvcDsKLSAgICB9IGVsc2UKLSAgICAgICAgY29udGVudEhlaWdodCA9IGNvbnRlbnRIZWln
aHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QoY2VsbEJveCk7Ci0gICAgcmV0dXJuIHN0ZDo6bWF4
KGNvbXB1dGVkSGVpZ2h0KGNlbGxCb3gpLnZhbHVlT3IoMF9sdSksIGNvbnRlbnRIZWlnaHQpOwot
fQotCi1FZGdlcyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRDZWxs
Qm9yZGVyKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgY29uc3QKLXsKLSAgICBhdXRvJiBj
ZWxsQm94ID0gY2VsbC5ib3goKTsKLSAgICBhdXRvIGJvcmRlciA9IGNvbXB1dGVkQm9yZGVyKGNl
bGxCb3gpOwotICAgIGF1dG8gY29sbGFwc2VkQm9yZGVyID0gbV9ncmlkLmNvbGxhcHNlZEJvcmRl
cigpOwotICAgIGlmICghY29sbGFwc2VkQm9yZGVyKQotICAgICAgICByZXR1cm4gYm9yZGVyOwot
Ci0gICAgLy8gV2UgbWlnaHQgd2FudCB0byBjYWNoZSB0aGVzZSBjb2xsYXBzZWQgYm9yZGVycyBv
biB0aGUgZ3JpZC4KLSAgICBhdXRvIGNlbGxQb3NpdGlvbiA9IGNlbGwucG9zaXRpb24oKTsKLSAg
ICAvLyBDb2xsYXBzZWQgYm9yZGVyIGxlZnQgZnJvbSB0YWJsZSBhbmQgYWRqYWNlbnQgY2VsbHMu
Ci0gICAgaWYgKCFjZWxsUG9zaXRpb24uY29sdW1uKQotICAgICAgICBib3JkZXIuaG9yaXpvbnRh
bC5sZWZ0ID0gY29sbGFwc2VkQm9yZGVyLT5ob3Jpem9udGFsLmxlZnQgLyAyOwotICAgIGVsc2Ug
ewotICAgICAgICBhdXRvIGFkamFjZW50Qm9yZGVyUmlnaHQgPSBjb21wdXRlZEJvcmRlcihtX2dy
aWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4gLSAxLCBjZWxsUG9zaXRpb24ucm93IH0pLT5j
ZWxsKCkuYm94KCkpLmhvcml6b250YWwucmlnaHQ7Ci0gICAgICAgIGJvcmRlci5ob3Jpem9udGFs
LmxlZnQgPSBzdGQ6Om1heChib3JkZXIuaG9yaXpvbnRhbC5sZWZ0LCBhZGphY2VudEJvcmRlclJp
Z2h0KSAvIDI7Ci0gICAgfQotICAgIC8vIENvbGxhcHNlZCBib3JkZXIgcmlnaHQgZnJvbSB0YWJs
ZSBhbmQgYWRqYWNlbnQgY2VsbHMuCi0gICAgaWYgKGNlbGxQb3NpdGlvbi5jb2x1bW4gPT0gbV9n
cmlkLmNvbHVtbnMoKS5zaXplKCkgLSAxKQotICAgICAgICBib3JkZXIuaG9yaXpvbnRhbC5yaWdo
dCA9IGNvbGxhcHNlZEJvcmRlci0+aG9yaXpvbnRhbC5yaWdodCAvIDI7Ci0gICAgZWxzZSB7Ci0g
ICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJMZWZ0ID0gY29tcHV0ZWRCb3JkZXIobV9ncmlkLnNs
b3QoeyBjZWxsUG9zaXRpb24uY29sdW1uICsgMSwgY2VsbFBvc2l0aW9uLnJvdyB9KS0+Y2VsbCgp
LmJveCgpKS5ob3Jpem9udGFsLmxlZnQ7Ci0gICAgICAgIGJvcmRlci5ob3Jpem9udGFsLnJpZ2h0
ID0gc3RkOjptYXgoYm9yZGVyLmhvcml6b250YWwucmlnaHQsIGFkamFjZW50Qm9yZGVyTGVmdCkg
LyAyOwotICAgIH0KLSAgICAvLyBDb2xsYXBzZWQgYm9yZGVyIHRvcCBmcm9tIHRhYmxlLCByb3cg
YW5kIGFkamFjZW50IGNlbGxzLgotICAgIGF1dG8mIHJvd3MgPSBtX2dyaWQucm93cygpLmxpc3Qo
KTsKLSAgICBpZiAoIWNlbGxQb3NpdGlvbi5yb3cpCi0gICAgICAgIGJvcmRlci52ZXJ0aWNhbC50
b3AgPSBjb2xsYXBzZWRCb3JkZXItPnZlcnRpY2FsLnRvcCAvIDI7Ci0gICAgZWxzZSB7Ci0gICAg
ICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJCb3R0b20gPSBjb21wdXRlZEJvcmRlcihtX2dyaWQuc2xv
dCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4sIGNlbGxQb3NpdGlvbi5yb3cgLSAxIH0pLT5jZWxsKCku
Ym94KCkpLnZlcnRpY2FsLmJvdHRvbTsKLSAgICAgICAgYXV0byBhZGphY2VudFJvd0JvdHRvbSA9
IGNvbXB1dGVkQm9yZGVyKHJvd3NbY2VsbFBvc2l0aW9uLnJvdyAtIDFdLmJveCgpKS52ZXJ0aWNh
bC5ib3R0b207Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIgPSBzdGQ6Om1h
eChhZGphY2VudEJvcmRlckJvdHRvbSwgYWRqYWNlbnRSb3dCb3R0b20pOwotICAgICAgICBib3Jk
ZXIudmVydGljYWwudG9wID0gc3RkOjptYXgoYm9yZGVyLnZlcnRpY2FsLnRvcCwgYWRqYWNlbnRD
b2xsYXBzZWRCb3JkZXIpIC8gMjsKLSAgICB9Ci0gICAgLy8gQ29sbGFwc2VkIGJvcmRlciBib3R0
b20gZnJvbSB0YWJsZSwgcm93IGFuZCBhZGphY2VudCBjZWxscy4KLSAgICBpZiAoY2VsbFBvc2l0
aW9uLnJvdyA9PSBtX2dyaWQucm93cygpLnNpemUoKSAtIDEpCi0gICAgICAgIGJvcmRlci52ZXJ0
aWNhbC5ib3R0b20gPSBjb2xsYXBzZWRCb3JkZXItPnZlcnRpY2FsLmJvdHRvbSAvIDI7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRCb3JkZXJUb3AgPSBjb21wdXRlZEJvcmRlciht
X2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4sIGNlbGxQb3NpdGlvbi5yb3cgKyAxIH0p
LT5jZWxsKCkuYm94KCkpLnZlcnRpY2FsLnRvcDsKLSAgICAgICAgYXV0byBhZGphY2VudFJvd1Rv
cCA9IGNvbXB1dGVkQm9yZGVyKHJvd3NbY2VsbFBvc2l0aW9uLnJvdyArIDFdLmJveCgpKS52ZXJ0
aWNhbC50b3A7Ci0gICAgICAgIGF1dG8gYWRqYWNlbnRDb2xsYXBzZWRCb3JkZXIgPSBzdGQ6Om1h
eChhZGphY2VudEJvcmRlclRvcCwgYWRqYWNlbnRSb3dUb3ApOwotICAgICAgICBib3JkZXIudmVy
dGljYWwuYm90dG9tID0gc3RkOjptYXgoYm9yZGVyLnZlcnRpY2FsLmJvdHRvbSwgYWRqYWNlbnRD
b2xsYXBzZWRCb3JkZXIpIC8gMjsKLSAgICB9Ci0gICAgcmV0dXJuIGJvcmRlcjsKLX0KLQotT3B0
aW9uYWw8TGF5b3V0VW5pdD4gVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1
dGVkQ29sdW1uV2lkdGgoY29uc3QgQ29udGFpbmVyQm94JiBjb2x1bW5Cb3gpCi17Ci0gICAgLy8g
Q2hlY2sgYm90aCBzdHlsZSBhbmQgPGNvbD4ncyB3aWR0aCBhdHRyaWJ1dGUuCi0gICAgLy8gRklY
TUU6IEZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIGNhbGN1bGF0ZWQgdmFsdWVzLCBsaWtlIDxj
b2wgc3R5bGU9IndpZHRoOiAxMCUiPi4KLSAgICBpZiAoYXV0byBjb21wdXRlZFdpZHRoVmFsdWUg
PSBjb21wdXRlZFdpZHRoKGNvbHVtbkJveCwgeyB9KSkKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVk
V2lkdGhWYWx1ZTsKLSAgICByZXR1cm4gY29sdW1uQm94LmNvbHVtbldpZHRoKCk7Ci19Ci0KLUZv
cm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5OjppbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQ2VsbChjb25z
dCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpCi17Ci0gICAgYXV0byYgY2VsbEJveCA9IGNlbGwuYm94
KCk7Ci0gICAgYXV0byYgc3R5bGUgPSBjZWxsQm94LnN0eWxlKCk7Ci0KLSAgICBhdXRvIGNvbXB1
dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IFsmXSgpIC0+IEZvcm1hdHRpbmdDb250ZXh0
OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsKLSAgICAgICAgLy8gRXZlbiBmaXhlZCB3aWR0
aCBjZWxscyBleHBhbmQgdG8gdGhlaXIgbWluaW11bSBjb250ZW50IHdpZHRoCi0gICAgICAgIC8v
IDx0ZCBzdHlsZT0id2lkdGg6IDEwcHgiPnRlc3RfY29udGVudDwvdGQ+IHdpbGwgc2l6ZSB0byBt
YXgobWluaW11bSBjb250ZW50IHdpZHRoLCBjb21wdXRlZCB3aWR0aCkuCi0gICAgICAgIGF1dG8g
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzIHsgfTsKLSAgICAgICAgaWYgKGNlbGxCb3guaGFzQ2hpbGQoKSkKLSAg
ICAgICAgICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBMYXlvdXRDb250ZXh0OjpjcmVh
dGVGb3JtYXR0aW5nQ29udGV4dChjZWxsQm94LCBsYXlvdXRTdGF0ZSgpKS0+Y29tcHV0ZWRJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGlmIChhdXRvIGZpeGVkV2lkdGggPSBm
aXhlZFZhbHVlKHN0eWxlLmxvZ2ljYWxXaWR0aCgpKSkKLSAgICAgICAgICAgIHJldHVybiB7IHN0
ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgKmZpeGVkV2lkdGgpLCBz
dGQ6Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0sICpmaXhlZFdpZHRoKSB9
OwotICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsKLSAgICB9OwotICAg
IC8vIEZJWE1FIENoZWNrIGZvciBib3gtc2l6aW5nOiBib3JkZXItYm94OwotICAgIGF1dG8gaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGNvbnN0cmFpbkJ5TWluTWF4V2lkdGgoY2VsbEJveCwg
Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkpOwotICAgIC8vIEV4cGFuZCB3aXRo
IGJvcmRlcgotICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMuZXhwYW5kKGNvbXB1dGVkQ2Vs
bEJvcmRlcihjZWxsKS53aWR0aCgpKTsKLSAgICAvLyBwYWRkaW5nCi0gICAgaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cy5leHBhbmQoZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nTGVmdCgpKS52YWx1
ZU9yKDApICsgZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nUmlnaHQoKSkudmFsdWVPcigwKSk7Ci0g
ICAgLy8gYW5kIG1hcmdpbgotICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMuZXhwYW5kKGZp
eGVkVmFsdWUoc3R5bGUubWFyZ2luU3RhcnQoKSkudmFsdWVPcigwKSArIGZpeGVkVmFsdWUoc3R5
bGUubWFyZ2luRW5kKCkpLnZhbHVlT3IoMCkpOwotICAgIHJldHVybiBpbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzOwotfQotCi0KLUlubGluZUxheW91dFVuaXQgVGFibGVGb3JtYXR0aW5nQ29udGV4
dDo6R2VvbWV0cnk6OnVzZWRCYXNlbGluZUZvckNlbGwoY29uc3QgQ29udGFpbmVyQm94JiBjZWxs
Qm94KQotewotICAgIC8vIFRoZSBiYXNlbGluZSBvZiBhIGNlbGwgaXMgZGVmaW5lZCBhcyB0aGUg
YmFzZWxpbmUgb2YgdGhlIGZpcnN0IGluLWZsb3cgbGluZSBib3ggaW4gdGhlIGNlbGwsCi0gICAg
Ly8gb3IgdGhlIGZpcnN0IGluLWZsb3cgdGFibGUtcm93IGluIHRoZSBjZWxsLCB3aGljaGV2ZXIg
Y29tZXMgZmlyc3QuCi0gICAgLy8gSWYgdGhlcmUgaXMgbm8gc3VjaCBsaW5lIGJveCwgdGhlIGJh
c2VsaW5lIGlzIHRoZSBib3R0b20gb2YgY29udGVudCBlZGdlIG9mIHRoZSBjZWxsIGJveC4KLSAg
ICBpZiAoY2VsbEJveC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpCi0gICAg
ICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkSW5saW5lRm9ybWF0dGluZ1N0YXRl
KGNlbGxCb3gpLmxpbmVzKClbMF0uYmFzZWxpbmUoKTsKLSAgICBmb3IgKGF1dG8mIGNlbGxEZXNj
ZW5kYW50IDogZGVzY2VuZGFudHNPZlR5cGU8Q29udGFpbmVyQm94PihjZWxsQm94KSkgewotICAg
ICAgICBpZiAoY2VsbERlc2NlbmRhbnQuZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dCgpKSB7Ci0gICAgICAgICAgICBhdXRvJiBpbmxpbmVGb3JtYXR0aW5nU3RhdGVGb3JDZWxsID0g
bGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZElubGluZUZvcm1hdHRpbmdTdGF0ZShjZWxsRGVzY2Vu
ZGFudCk7Ci0gICAgICAgICAgICBpZiAoIWlubGluZUZvcm1hdHRpbmdTdGF0ZUZvckNlbGwubGlu
ZXMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGlubGluZUZvcm1hdHRpbmdT
dGF0ZUZvckNlbGwubGluZXMoKVswXS5iYXNlbGluZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlm
IChjZWxsRGVzY2VuZGFudC5lc3RhYmxpc2hlc1RhYmxlRm9ybWF0dGluZ0NvbnRleHQoKSkKLSAg
ICAgICAgICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkVGFibGVGb3JtYXR0aW5n
U3RhdGUoY2VsbERlc2NlbmRhbnQpLnRhYmxlR3JpZCgpLnJvd3MoKS5saXN0KClbMF0uYmFzZWxp
bmUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JC
b3goY2VsbEJveCkuY29udGVudEJveEJvdHRvbSgpOwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1h
dHRpbmdDb250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1h
dHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IGI2NGE2MmRmZjA3MTRhZDY4ZmE3ODk2ODVmYmJiMjEzNzRmZjE1MzIuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNw
cAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAi
Y29uZmlnLmgiCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0jaWYgRU5B
QkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJMYXlvdXRCb3guaCIK
LSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRTdGF0ZS5o
IgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotYm9vbCBUYWJs
ZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OnNob3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRp
Y2FsTWFyZ2luKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCkgY29uc3QKLXsKLSAgICAvLyBO
b3JtYWxseSBCRkMgcm9vdCBjb250ZW50IGhlaWdodCB0YWtlcyB0aGUgbWFyZ2luIGJveCBvZiB0
aGUgY2hpbGQgY29udGVudCBhcyB2ZXJ0aWNhbCBtYXJnaW5zIGRvbid0IGNvbGxhcHNlIHdpdGgg
QkZDIHJvb3RzLAotICAgIC8vIGJ1dCB0YWJsZSBjZWxsIGJveGVzIGRvIGNvbGxhcHNlIHRoZWly
IChub24tZXhpc3RpbmcpIG1hcmdpbnMgd2l0aCBjaGlsZCBxdWlyayBtYXJnaW5zIChzbyBtdWNo
IHF1aXJrKSwgc28gaGVyZSB3ZSBjaGVjawotICAgIC8vIGlmIHRoZSBjb250ZW50IGhlaWdodCBz
aG91bGQgaW5jbHVkZSBtYXJnaW5zIG9yIG5vdC4KLSAgICAvLyBlLmcgPHRhYmxlPjx0cj48dGQ+
PHA+dGV4dCBjb250ZW50PC90ZD48L3RyPjwvdGFibGU+IDwtIDxwPidzIHF1aXJrIG1hcmdpbiBj
b2xsYXBzZXMgd2l0aCB0aGUgPHRkPiBzbyBpdHMgY29udGVudAotICAgIC8vIGhlaWdodCBzaG91
bGQgbm90IGluY2x1ZGUgdmVydGljYWwgbWFyZ2lucy4KLSAgICBpZiAoIWxheW91dFN0YXRlKCku
aW5RdWlya3NNb2RlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoY2VsbEJveC5l
c3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICBpZiAoIWNlbGxCb3guaGFzSW5GbG93Q2hpbGQoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIHJldHVybiBjZWxsQm94LmZpcnN0SW5GbG93Q2hpbGQoKS0+c3R5bGUoKS5oYXNN
YXJnaW5CZWZvcmVRdWlyaygpIHx8IGNlbGxCb3gubGFzdEluRmxvd0NoaWxkKCktPnN0eWxlKCku
aGFzTWFyZ2luQWZ0ZXJRdWlyaygpOwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdTdGF0
ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0
dGluZ1N0YXRlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxMGVmNWUxMzI2
MGQxYTMxZmIxZDllODZlMmM2YjYyM2E2NTk4Ny4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5n
L1RhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAK
LS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0
aW5nU3RhdGUuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0j
aW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxs
b2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewot
Ci1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoVGFibGVGb3JtYXR0aW5nU3RhdGUpOwotCi1U
YWJsZUZvcm1hdHRpbmdTdGF0ZTo6VGFibGVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3Rh
dGU+JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBjb25zdCBDb250
YWluZXJCb3gmIHRhYmxlQm94KQotICAgIDogRm9ybWF0dGluZ1N0YXRlKFdURk1vdmUoZmxvYXRp
bmdTdGF0ZSksIFR5cGU6OlRhYmxlLCBsYXlvdXRTdGF0ZSkKLSAgICAsIG1fdGFibGVHcmlkKFRh
YmxlRm9ybWF0dGluZ0NvbnRleHQ6OmVuc3VyZVRhYmxlR3JpZCh0YWJsZUJveCkpCi17Ci19Ci0K
LVRhYmxlRm9ybWF0dGluZ1N0YXRlOjp+VGFibGVGb3JtYXR0aW5nU3RhdGUoKQotewotfQotCi19
Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1h
dHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJs
ZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggN2QxZTRhZjBiOTZhY2M0ZDM0MzQ1YWE5Y2Y2ZDgzZjc4ZDUzYzc2Zi4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmgKKysrIC9kZXYvbnVs
bApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICog
YXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFC
TEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZvcm1hdHRpbmdTdGF0
ZS5oIgotI2luY2x1ZGUgIlRhYmxlR3JpZC5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4K
LSNpbmNsdWRlIDx3dGYvVW5pcXVlUmVmLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVz
cGFjZSBMYXlvdXQgewotCi0vLyBUYWJsZUZvcm1hdHRpbmdTdGF0ZSBob2xkcyB0aGUgc3RhdGUg
Zm9yIGEgcGFydGljdWxhciB0YWJsZSBmb3JtYXR0aW5nIGNvbnRleHQgdHJlZS4KLWNsYXNzIFRh
YmxlRm9ybWF0dGluZ1N0YXRlIDogcHVibGljIEZvcm1hdHRpbmdTdGF0ZSB7Ci0gICAgV1RGX01B
S0VfSVNPX0FMTE9DQVRFRChUYWJsZUZvcm1hdHRpbmdTdGF0ZSk7Ci1wdWJsaWM6Ci0gICAgVGFi
bGVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0YXRlJiwgY29u
c3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCk7Ci0gICAgflRhYmxlRm9ybWF0dGluZ1N0YXRlKCk7
Ci0KLSAgICBUYWJsZUdyaWQmIHRhYmxlR3JpZCgpIHsgcmV0dXJuIG1fdGFibGVHcmlkOyB9Ci0g
ICAgY29uc3QgVGFibGVHcmlkJiB0YWJsZUdyaWQoKSBjb25zdCB7IHJldHVybiBtX3RhYmxlR3Jp
ZDsgfQotCi1wcml2YXRlOgotICAgIFVuaXF1ZVJlZjxUYWJsZUdyaWQ+IG1fdGFibGVHcmlkOwot
fTsKLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX1NU
QVRFKFRhYmxlRm9ybWF0dGluZ1N0YXRlLCBpc1RhYmxlRm9ybWF0dGluZ1N0YXRlKCkpCi0KLSNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9U
YWJsZUdyaWQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJs
ZUdyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQxZDhkMDhhNTI1ZTc1
NmFiY2RjYjFhMjE1YzlmNDY1NmFjZmI2Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFi
bGVHcmlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
Ci0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAq
Ci0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQot
I2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlRhYmxlR3JpZC5oIgotCi0jaWYgRU5BQkxF
KExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5s
aW5lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RG
X01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKFRhYmxlR3JpZCk7Ci0KLVRhYmxlR3JpZDo6Q29sdW1u
OjpDb2x1bW4oY29uc3QgQ29udGFpbmVyQm94KiBjb2x1bW5Cb3gpCi0gICAgOiBtX2xheW91dEJv
eChtYWtlV2Vha1B0cihjb2x1bW5Cb3gpKQotewotfQotCi12b2lkIFRhYmxlR3JpZDo6Q29sdW1u
OjpzZXRMb2dpY2FsV2lkdGgoTGF5b3V0VW5pdCBjb21wdXRlZExvZ2ljYWxXaWR0aCkKLXsKLSNp
ZiBBU1NFUlRfRU5BQkxFRAotICAgIG1faGFzQ29tcHV0ZWRXaWR0aCA9IHRydWU7Ci0jZW5kaWYK
LSAgICBtX2NvbXB1dGVkTG9naWNhbFdpZHRoID0gY29tcHV0ZWRMb2dpY2FsV2lkdGg7Ci19Ci0K
LUxheW91dFVuaXQgVGFibGVHcmlkOjpDb2x1bW46OmxvZ2ljYWxXaWR0aCgpIGNvbnN0Ci17Ci0g
ICAgQVNTRVJUKG1faGFzQ29tcHV0ZWRXaWR0aCk7Ci0gICAgcmV0dXJuIG1fY29tcHV0ZWRMb2dp
Y2FsV2lkdGg7Ci19Ci0KLXZvaWQgVGFibGVHcmlkOjpDb2x1bW46OnNldExvZ2ljYWxMZWZ0KExh
eW91dFVuaXQgY29tcHV0ZWRMb2dpY2FsTGVmdCkKLXsKLSNpZiBBU1NFUlRfRU5BQkxFRAotICAg
IG1faGFzQ29tcHV0ZWRMZWZ0ID0gdHJ1ZTsKLSNlbmRpZgotICAgIG1fY29tcHV0ZWRMb2dpY2Fs
TGVmdCA9IGNvbXB1dGVkTG9naWNhbExlZnQ7Ci19Ci0KLUxheW91dFVuaXQgVGFibGVHcmlkOjpD
b2x1bW46OmxvZ2ljYWxMZWZ0KCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9oYXNDb21wdXRlZExl
ZnQpOwotICAgIHJldHVybiBtX2NvbXB1dGVkTG9naWNhbExlZnQ7Ci19Ci0KLWJvb2wgVGFibGVH
cmlkOjpDb2x1bW46OmlzRml4ZWRXaWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0ZpeGVk
V2lkdGhDZWxsKCkgfHwgKGJveCgpICYmIGJveCgpLT5jb2x1bW5XaWR0aCgpKTsKLX0KLQotdm9p
ZCBUYWJsZUdyaWQ6OkNvbHVtbnM6OmFkZENvbHVtbihjb25zdCBDb250YWluZXJCb3gmIGNvbHVt
bkJveCkKLXsKLSAgICBtX2NvbHVtbkxpc3QuYXBwZW5kKHsgJmNvbHVtbkJveCB9KTsKLX0KLQot
dm9pZCBUYWJsZUdyaWQ6OkNvbHVtbnM6OmFkZEFub255bW91c0NvbHVtbigpCi17Ci0gICAgbV9j
b2x1bW5MaXN0LmFwcGVuZCh7IG51bGxwdHIgfSk7Ci19Ci0KLWJvb2wgVGFibGVHcmlkOjpDb2x1
bW5zOjpoYXNGaXhlZENvbHVtbnNPbmx5KCkgY29uc3QKLXsKLSAgICBmb3IgKGF1dG8mIGNvbHVt
biA6IG1fY29sdW1uTGlzdCkgewotICAgICAgICBpZiAoIWNvbHVtbi5pc0ZpeGVkV2lkdGgoKSkK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LXZvaWQgVGFibGVHcmlkOjpSb3dzOjphZGRSb3coY29uc3QgQ29udGFpbmVyQm94JiByb3dCb3gp
Ci17Ci0gICAgbV9yb3dMaXN0LmFwcGVuZCh7IHJvd0JveCB9KTsKLX0KLQotVGFibGVHcmlkOjpS
b3c6OlJvdyhjb25zdCBDb250YWluZXJCb3gmIHJvd0JveCkKLSAgICA6IG1fbGF5b3V0Qm94KG1h
a2VXZWFrUHRyKHJvd0JveCkpCi17Ci19Ci0KLVRhYmxlR3JpZDo6Q2VsbDo6Q2VsbChjb25zdCBD
b250YWluZXJCb3gmIGNlbGxCb3gsIFNsb3RQb3NpdGlvbiBwb3NpdGlvbiwgQ2VsbFNwYW4gc3Bh
bikKLSAgICA6IG1fbGF5b3V0Qm94KG1ha2VXZWFrUHRyKGNlbGxCb3gpKQotICAgICwgbV9wb3Np
dGlvbihwb3NpdGlvbikKLSAgICAsIG1fc3BhbihzcGFuKQotewotfQotCi1ib29sIFRhYmxlR3Jp
ZDo6Q2VsbDo6aXNGaXhlZFdpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gYm94KCkuc3R5bGUo
KS5sb2dpY2FsV2lkdGgoKS5pc0ZpeGVkKCk7Ci19Ci0KLVRhYmxlR3JpZDo6U2xvdDo6U2xvdChD
ZWxsJiBjZWxsLCBib29sIGlzQ29sdW1uU3Bhbm5lZCwgYm9vbCBpc1Jvd1NwYW5uZWQpCi0gICAg
OiBtX2NlbGwobWFrZVdlYWtQdHIoY2VsbCkpCi0gICAgLCBtX2lzQ29sdW1uU3Bhbm5lZChpc0Nv
bHVtblNwYW5uZWQpCi0gICAgLCBtX2lzUm93U3Bhbm5lZChpc1Jvd1NwYW5uZWQpCi17Ci19Ci0K
LVRhYmxlR3JpZDo6VGFibGVHcmlkKCkKLXsKLX0KLQotVGFibGVHcmlkOjpTbG90KiBUYWJsZUdy
aWQ6OnNsb3QoU2xvdFBvc2l0aW9uIHBvc2l0aW9uKQotewotICAgIHJldHVybiBtX3Nsb3RNYXAu
Z2V0KHBvc2l0aW9uKTsKLX0KLQotdm9pZCBUYWJsZUdyaWQ6OmFwcGVuZENlbGwoY29uc3QgQ29u
dGFpbmVyQm94JiBjZWxsQm94KQotewotICAgIGF1dG8gcm93U3BhbiA9IGNlbGxCb3gucm93U3Bh
bigpOwotICAgIGF1dG8gY29sdW1uU3BhbiA9IGNlbGxCb3guY29sdW1uU3BhbigpOwotICAgIGF1
dG8gaXNJbk5ld1JvdyA9ICFjZWxsQm94LnByZXZpb3VzU2libGluZygpOwotICAgIGF1dG8gaW5p
dGlhbFNsb3RQb3NpdGlvbiA9IFNsb3RQb3NpdGlvbiB7IH07Ci0KLSAgICBpZiAoIW1fY2VsbHMu
aXNFbXB0eSgpKSB7Ci0gICAgICAgIGF1dG8mIGxhc3RDZWxsID0gbV9jZWxscy5sYXN0KCk7Ci0g
ICAgICAgIGF1dG8gbGFzdFNsb3RQb3NpdGlvbiA9IGxhc3RDZWxsLT5wb3NpdGlvbigpOwotICAg
ICAgICAvLyBGaXJzdCB0YWJsZSBjZWxsIGluIHRoaXMgcm93PwotICAgICAgICBpZiAoaXNJbk5l
d1JvdykKLSAgICAgICAgICAgIGluaXRpYWxTbG90UG9zaXRpb24gPSBTbG90UG9zaXRpb24geyAw
LCBsYXN0U2xvdFBvc2l0aW9uLnJvdyArIDEgfTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAg
aW5pdGlhbFNsb3RQb3NpdGlvbiA9IFNsb3RQb3NpdGlvbiB7IGxhc3RTbG90UG9zaXRpb24uY29s
dW1uICsgMSwgbGFzdFNsb3RQb3NpdGlvbi5yb3cgfTsKLQotICAgICAgICAvLyBQaWNrIHRoZSBu
ZXh0IGF2YWlsYWJsZSBzbG90IGJ5IGF2b2lkaW5nIHJvdyBhbmQgY29sdW1uIHNwYW5uZXJzLgot
ICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaWYgKCFtX3Nsb3RNYXAuY29udGFp
bnMoaW5pdGlhbFNsb3RQb3NpdGlvbikpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICArK2luaXRpYWxTbG90UG9zaXRpb24uY29sdW1uOwotICAgICAgICB9Ci0gICAgfQotICAg
IGF1dG8gY2VsbCA9IG1ha2VVbmlxdWU8Q2VsbD4oY2VsbEJveCwgaW5pdGlhbFNsb3RQb3NpdGlv
biwgQ2VsbFNwYW4geyBjb2x1bW5TcGFuLCByb3dTcGFuIH0pOwotICAgIC8vIFJvdyBhbmQgY29s
dW1uIHNwYW5uZXJzIGNyZWF0ZSBhZGRpdGlvbmFsIHNsb3RzLgotICAgIGZvciAoc2l6ZV90IHJv
dyA9IDA7IHJvdyA8IHJvd1NwYW47ICsrcm93KSB7Ci0gICAgICAgIGZvciAoYXV0byBjb2x1bW4g
PSBjZWxsLT5zdGFydENvbHVtbigpOyBjb2x1bW4gPCBjZWxsLT5lbmRDb2x1bW4oKTsgKytjb2x1
bW4pIHsKLSAgICAgICAgICAgIGF1dG8gcG9zaXRpb24gPSBTbG90UG9zaXRpb24geyBjb2x1bW4s
IGNlbGwtPnN0YXJ0Um93KCkgKyByb3cgfTsKLSAgICAgICAgICAgIEFTU0VSVCghbV9zbG90TWFw
LmNvbnRhaW5zKHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAvLyBUaGlzIHNsb3QgaXMgc3Bhbm5l
ZCBieSBhIGNlbGwgYXQgdGhlIGluaXRpYWwgc2xvdyBwb3NpdGlvbi4KLSAgICAgICAgICAgIGF1
dG8gaXNDb2x1bW5TcGFubmVkID0gY29sdW1uICE9IGNlbGwtPnN0YXJ0Q29sdW1uKCk7Ci0gICAg
ICAgICAgICBhdXRvIGlzUm93U3Bhbm5lZCA9ICEhcm93OwotICAgICAgICAgICAgbV9zbG90TWFw
LmFkZChwb3NpdGlvbiwgbWFrZVVuaXF1ZTxTbG90PigqY2VsbCwgaXNDb2x1bW5TcGFubmVkLCBp
c1Jvd1NwYW5uZWQpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBJbml0aWFsaXplIGNvbHVt
bnMvcm93cyBpZiBuZWVkZWQuCi0gICAgYXV0byBtaXNzaW5nTnVtYmVyT2ZDb2x1bW5zID0gc3Rk
OjptYXg8aW50PigwLCBpbml0aWFsU2xvdFBvc2l0aW9uLmNvbHVtbiArIGNvbHVtblNwYW4gLSBt
X2NvbHVtbnMuc2l6ZSgpKTsKLSAgICBmb3IgKGF1dG8gY29sdW1uID0gMDsgY29sdW1uIDwgbWlz
c2luZ051bWJlck9mQ29sdW1uczsgKytjb2x1bW4pCi0gICAgICAgIG1fY29sdW1ucy5hZGRBbm9u
eW1vdXNDb2x1bW4oKTsKLQotICAgIGlmIChjZWxsLT5pc0ZpeGVkV2lkdGgoKSkgewotICAgICAg
ICBmb3IgKGF1dG8gY29sdW1uID0gY2VsbC0+c3RhcnRDb2x1bW4oKTsgY29sdW1uIDwgY2VsbC0+
ZW5kQ29sdW1uKCk7ICsrY29sdW1uKQotICAgICAgICAgICAgbV9jb2x1bW5zLmxpc3QoKVtjb2x1
bW5dLnNldEhhc0ZpeGVkV2lkdGhDZWxsKCk7Ci0gICAgfQotCi0gICAgaWYgKGlzSW5OZXdSb3cp
Ci0gICAgICAgIG1fcm93cy5hZGRSb3coY2VsbEJveC5wYXJlbnQoKSk7Ci0KLSAgICBtX2NlbGxz
LmFkZChXVEZNb3ZlKGNlbGwpKTsKLX0KLQotdm9pZCBUYWJsZUdyaWQ6Omluc2VydENlbGwoY29u
c3QgQ29udGFpbmVyQm94JiBjZWxsQm94LCBjb25zdCBDb250YWluZXJCb3gmIGJlZm9yZSkKLXsK
LSAgICBVTlVTRURfUEFSQU0oY2VsbEJveCk7Ci0gICAgVU5VU0VEX1BBUkFNKGJlZm9yZSk7Ci19
Ci0KLXZvaWQgVGFibGVHcmlkOjpyZW1vdmVDZWxsKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJv
eCkKLXsKLSAgICBVTlVTRURfUEFSQU0oY2VsbEJveCk7Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQu
aCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmgKZGVs
ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNWEzZjQ0YmY2MjIxY2U0NjUyNTk0MDkxM2Vj
ZTEwYjA2YWFjZWYuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0t
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuaAorKysg
L2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwot
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0g
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0K
LSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZvcm1h
dHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKLSNpbmNsdWRlIDx3dGYv
SGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLSNpbmNsdWRlIDx3dGYvSXNv
TWFsbG9jSW5saW5lcy5oPgotI2luY2x1ZGUgPHd0Zi9MaXN0SGFzaFNldC5oPgotI2luY2x1ZGUg
PHd0Zi9XZWFrUHRyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQg
ewotY2xhc3MgQm94OwotY2xhc3MgQ29udGFpbmVyQm94OwotCi1jbGFzcyBUYWJsZUdyaWQgewot
ICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoVGFibGVHcmlkKTsKLXB1YmxpYzoKLSAgICBUYWJs
ZUdyaWQoKTsKLQotICAgIHZvaWQgYXBwZW5kQ2VsbChjb25zdCBDb250YWluZXJCb3gmKTsKLSAg
ICB2b2lkIGluc2VydENlbGwoY29uc3QgQ29udGFpbmVyQm94JiwgY29uc3QgQ29udGFpbmVyQm94
JiBiZWZvcmUpOwotICAgIHZvaWQgcmVtb3ZlQ2VsbChjb25zdCBDb250YWluZXJCb3gmKTsKLQot
ICAgIHZvaWQgc2V0SG9yaXpvbnRhbFNwYWNpbmcoTGF5b3V0VW5pdCBob3Jpem9udGFsU3BhY2lu
ZykgeyBtX2hvcml6b250YWxTcGFjaW5nID0gaG9yaXpvbnRhbFNwYWNpbmc7IH0KLSAgICBMYXlv
dXRVbml0IGhvcml6b250YWxTcGFjaW5nKCkgY29uc3QgeyByZXR1cm4gbV9ob3Jpem9udGFsU3Bh
Y2luZzsgfQotCi0gICAgdm9pZCBzZXRWZXJ0aWNhbFNwYWNpbmcoTGF5b3V0VW5pdCB2ZXJ0aWNh
bFNwYWNpbmcpIHsgbV92ZXJ0aWNhbFNwYWNpbmcgPSB2ZXJ0aWNhbFNwYWNpbmc7IH0KLSAgICBM
YXlvdXRVbml0IHZlcnRpY2FsU3BhY2luZygpIGNvbnN0IHsgcmV0dXJuIG1fdmVydGljYWxTcGFj
aW5nOyB9Ci0KLSAgICB2b2lkIHNldENvbGxhcHNlZEJvcmRlcihjb25zdCBFZGdlcyYgY29sbGFw
c2VkQm9yZGVyKSB7IG1fY29sbGFwc2VkQm9yZGVyID0gY29sbGFwc2VkQm9yZGVyOyB9Ci0gICAg
T3B0aW9uYWw8RWRnZXM+IGNvbGxhcHNlZEJvcmRlcigpIGNvbnN0IHsgcmV0dXJuIG1fY29sbGFw
c2VkQm9yZGVyOyB9Ci0KLSAgICB2b2lkIHNldFdpZHRoQ29uc3RyYWludHMoRm9ybWF0dGluZ0Nv
bnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2ljV2lkdGhDb25zdHJhaW50
cykgeyBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzOyB9Ci0gICAgT3B0aW9uYWw8Rm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29u
c3RyYWludHM+IHdpZHRoQ29uc3RyYWludHMoKSBjb25zdCB7IHJldHVybiBtX2ludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHM7IH0KLQotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1f
c2xvdE1hcC5pc0VtcHR5KCk7IH0KLSAgICAvLyBDb2x1bW4gcmVwcmVzZW50cyBhIHZlcnRpY2Fs
IHNldCBvZiBzbG90cyBpbiB0aGUgZ3JpZC4gQSBjb2x1bW4gaGFzIGhvcml6b250YWwgcG9zaXRp
b24gYW5kIHdpZHRoLgotICAgIGNsYXNzIENvbHVtbiB7Ci0gICAgcHVibGljOgotICAgICAgICBD
b2x1bW4oY29uc3QgQ29udGFpbmVyQm94Kik7Ci0KLSAgICAgICAgdm9pZCBzZXRMb2dpY2FsTGVm
dChMYXlvdXRVbml0KTsKLSAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgpIGNvbnN0Owot
ICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxM
ZWZ0KCkgKyBsb2dpY2FsV2lkdGgoKTsgfQotICAgICAgICB2b2lkIHNldExvZ2ljYWxXaWR0aChM
YXlvdXRVbml0KTsKLSAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdDsKLQot
ICAgICAgICBib29sIGlzRml4ZWRXaWR0aCgpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgc2V0SGFz
Rml4ZWRXaWR0aENlbGwoKSB7IG1faGFzRml4ZWRXaWR0aENlbGwgPSB0cnVlOyB9Ci0gICAgICAg
IGNvbnN0IENvbnRhaW5lckJveCogYm94KCkgY29uc3QgeyByZXR1cm4gbV9sYXlvdXRCb3guZ2V0
KCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgaGFzRml4ZWRXaWR0aENlbGwoKSBj
b25zdCB7IHJldHVybiBtX2hhc0ZpeGVkV2lkdGhDZWxsOyB9Ci0KLSAgICAgICAgTGF5b3V0VW5p
dCBtX2NvbXB1dGVkTG9naWNhbFdpZHRoOwotICAgICAgICBMYXlvdXRVbml0IG1fY29tcHV0ZWRM
b2dpY2FsTGVmdDsKLSAgICAgICAgV2Vha1B0cjxjb25zdCBDb250YWluZXJCb3g+IG1fbGF5b3V0
Qm94OwotICAgICAgICBib29sIG1faGFzRml4ZWRXaWR0aENlbGwgeyBmYWxzZSB9OwotCi0jaWYg
QVNTRVJUX0VOQUJMRUQKLSAgICAgICAgYm9vbCBtX2hhc0NvbXB1dGVkV2lkdGggeyBmYWxzZSB9
OwotICAgICAgICBib29sIG1faGFzQ29tcHV0ZWRMZWZ0IHsgZmFsc2UgfTsKLSNlbmRpZgotICAg
IH07Ci0KLSAgICBjbGFzcyBDb2x1bW5zIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHVzaW5nIENv
bHVtbkxpc3QgPSBWZWN0b3I8Q29sdW1uPjsKLSAgICAgICAgQ29sdW1uTGlzdCYgbGlzdCgpIHsg
cmV0dXJuIG1fY29sdW1uTGlzdDsgfQotICAgICAgICBjb25zdCBDb2x1bW5MaXN0JiBsaXN0KCkg
Y29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0OyB9Ci0gICAgICAgIHNpemVfdCBzaXplKCkgY29u
c3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0LnNpemUoKTsgfQotCi0gICAgICAgIHZvaWQgYWRkQ29s
dW1uKGNvbnN0IENvbnRhaW5lckJveCYpOwotICAgICAgICB2b2lkIGFkZEFub255bW91c0NvbHVt
bigpOwotCi0gICAgICAgIExheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4g
bV9jb2x1bW5MaXN0Lmxhc3QoKS5sb2dpY2FsUmlnaHQoKSAtIG1fY29sdW1uTGlzdC5maXJzdCgp
LmxvZ2ljYWxMZWZ0KCk7IH0KLSAgICAgICAgYm9vbCBoYXNGaXhlZENvbHVtbnNPbmx5KCkgY29u
c3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBDb2x1bW5MaXN0IG1fY29sdW1uTGlzdDsKLSAg
ICB9OwotCi0gICAgY2xhc3MgUm93IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFJvdyhjb25zdCBD
b250YWluZXJCb3gmKTsKLQotICAgICAgICB2b2lkIHNldExvZ2ljYWxUb3AoTGF5b3V0VW5pdCBs
b2dpY2FsVG9wKSB7IG1fbG9naWNhbFRvcCA9IGxvZ2ljYWxUb3A7IH0KLSAgICAgICAgTGF5b3V0
VW5pdCBsb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsVG9wOyB9Ci0gICAgICAg
IExheW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxUb3AoKSAr
IGxvZ2ljYWxIZWlnaHQoKTsgfQotCi0gICAgICAgIHZvaWQgc2V0TG9naWNhbEhlaWdodChMYXlv
dXRVbml0IGxvZ2ljYWxIZWlnaHQpIHsgbV9sb2dpY2FsSGVpZ2h0ID0gbG9naWNhbEhlaWdodDsg
fQotICAgICAgICBMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2xv
Z2ljYWxIZWlnaHQ7IH0KLQotICAgICAgICB2b2lkIHNldEJhc2VsaW5lKElubGluZUxheW91dFVu
aXQgYmFzZWxpbmUpIHsgbV9iYXNlbGluZSA9IGJhc2VsaW5lOyB9Ci0gICAgICAgIElubGluZUxh
eW91dFVuaXQgYmFzZWxpbmUoKSBjb25zdCB7IHJldHVybiBtX2Jhc2VsaW5lOyB9Ci0KLSAgICAg
ICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRCb3gu
Z2V0KCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIExheW91dFVuaXQgbV9sb2dpY2FsVG9w
OwotICAgICAgICBMYXlvdXRVbml0IG1fbG9naWNhbEhlaWdodDsKLSAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OwotICAgICAgICBXZWFrUHRyPGNvbnN0IENvbnRhaW5l
ckJveD4gbV9sYXlvdXRCb3g7Ci0gICAgfTsKLQotICAgIGNsYXNzIFJvd3MgewotICAgIHB1Ymxp
YzoKLSAgICAgICAgdXNpbmcgUm93TGlzdCA9IFZlY3RvcjxSb3c+OwotICAgICAgICBSb3dMaXN0
JiBsaXN0KCkgeyByZXR1cm4gbV9yb3dMaXN0OyB9Ci0gICAgICAgIGNvbnN0IFJvd0xpc3QmIGxp
c3QoKSBjb25zdCB7IHJldHVybiBtX3Jvd0xpc3Q7IH0KLQotICAgICAgICB2b2lkIGFkZFJvdyhj
b25zdCBDb250YWluZXJCb3gmKTsKLQotICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fcm93TGlzdC5zaXplKCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFJvd0xpc3Qg
bV9yb3dMaXN0OwotICAgIH07Ci0KLSAgICAvLyBDZWxsIHJlcHJlc2VudHMgYSA8dGQ+IG9yIDx0
aD4uIEl0IGNhbiBzcGFuIG11bHRpcGxlIHNsb3RzIGluIHRoZSBncmlkLgotICAgIGNsYXNzIENl
bGwgOiBwdWJsaWMgQ2FuTWFrZVdlYWtQdHI8Q2VsbD4gewotICAgICAgICBXVEZfTUFLRV9JU09f
QUxMT0NBVEVEX0lOTElORShDZWxsKTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIENlbGwoY29uc3Qg
Q29udGFpbmVyQm94JiwgU2xvdFBvc2l0aW9uLCBDZWxsU3Bhbik7Ci0KLSAgICAgICAgc2l6ZV90
IHN0YXJ0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbi5jb2x1bW47IH0KLSAgICAg
ICAgc2l6ZV90IGVuZENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb24uY29sdW1uICsg
bV9zcGFuLmNvbHVtbjsgfQotCi0gICAgICAgIHNpemVfdCBzdGFydFJvdygpIGNvbnN0IHsgcmV0
dXJuIG1fcG9zaXRpb24ucm93OyB9Ci0gICAgICAgIHNpemVfdCBlbmRSb3coKSBjb25zdCB7IHJl
dHVybiBtX3Bvc2l0aW9uLnJvdyArIG1fc3Bhbi5yb3c7IH0KLQotICAgICAgICBzaXplX3QgY29s
dW1uU3BhbigpIGNvbnN0IHsgcmV0dXJuIG1fc3Bhbi5jb2x1bW47IH0KLSAgICAgICAgc2l6ZV90
IHJvd1NwYW4oKSBjb25zdCB7IHJldHVybiBtX3NwYW4ucm93OyB9Ci0KLSAgICAgICAgU2xvdFBv
c2l0aW9uIHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbjsgfQotICAgICAgICBD
ZWxsU3BhbiBzcGFuKCkgY29uc3QgeyByZXR1cm4gbV9zcGFuOyB9Ci0KLSAgICAgICAgdm9pZCBz
ZXRCYXNlbGluZShJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKSB7IG1fYmFzZWxpbmUgPSBiYXNl
bGluZTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKCkgY29uc3QgeyByZXR1
cm4gbV9iYXNlbGluZTsgfQotCi0gICAgICAgIGJvb2wgaXNGaXhlZFdpZHRoKCkgY29uc3Q7Ci0K
LSAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBib3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlv
dXRCb3guZ2V0KCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFdlYWtQdHI8Y29uc3QgQ29u
dGFpbmVyQm94PiBtX2xheW91dEJveDsKLSAgICAgICAgU2xvdFBvc2l0aW9uIG1fcG9zaXRpb247
Ci0gICAgICAgIENlbGxTcGFuIG1fc3BhbjsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2Jh
c2VsaW5lIHsgMCB9OwotICAgIH07Ci0KLSAgICBjbGFzcyBTbG90IHsKLSAgICBwdWJsaWM6Ci0g
ICAgICAgIFdURl9NQUtFX1NUUlVDVF9GQVNUX0FMTE9DQVRFRDsKLSAgICAgICAgU2xvdCgpID0g
ZGVmYXVsdDsKLSAgICAgICAgU2xvdChDZWxsJiwgYm9vbCBpc0NvbHVtblNwYW5uZWQsIGJvb2wg
aXNSb3dTcGFubmVkKTsKLQotICAgICAgICBjb25zdCBDZWxsJiBjZWxsKCkgY29uc3QgeyByZXR1
cm4gKm1fY2VsbDsgfQotICAgICAgICBDZWxsJiBjZWxsKCkgeyByZXR1cm4gKm1fY2VsbDsgfQot
Ci0gICAgICAgIGNvbnN0IEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzJiB3aWR0aENvbnN0cmFpbnRzKCkgY29uc3QgeyByZXR1cm4gbV93aWR0aENvbnN0cmFpbnRz
OyB9Ci0gICAgICAgIHZvaWQgc2V0V2lkdGhDb25zdHJhaW50cyhjb25zdCBGb3JtYXR0aW5nQ29u
dGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyYgd2lkdGhDb25zdHJhaW50cykgeyBtX3dp
ZHRoQ29uc3RyYWludHMgPSB3aWR0aENvbnN0cmFpbnRzOyB9Ci0KLSAgICAgICAgLy8gSW5pdGlh
bCBzbG90IHBvc2l0aW9uIGZvciBhIHNwYW5uaW5nIGNlbGwuCi0gICAgICAgIC8vIDx0ZD48L3Rk
Pjx0ZCBjb2xzcGFuPTI+PC90ZD4gWzEsIDBdIHNsb3QgaGFzIGNvbHVtbiBzcGFuIG9mIDIuCi0g
ICAgICAgIGJvb2wgaGFzQ29sdW1uU3BhbigpIGNvbnN0IHsgcmV0dXJuIG1fY2VsbC0+Y29sdW1u
U3BhbigpID4gMSAmJiAhaXNDb2x1bW5TcGFubmVkKCk7IH0KLSAgICAgICAgYm9vbCBoYXNSb3dT
cGFuKCkgY29uc3QgeyByZXR1cm4gbV9jZWxsLT5yb3dTcGFuKCkgPiAxICYmICFpc1Jvd1NwYW5u
ZWQoKTsgfQotCi0gICAgICAgIC8vIE5vbi1pbml0aWFsIHNwYW5uZWQgc2xvdC4KLSAgICAgICAg
Ly8gPHRkPjwvdGQ+PHRkIGNvbHNwYW49Mj48L3RkPiBbMiwgMF0gc2xvdCBpcyBjb2x1bW4gc3Bh
bm5lZCBieSBbMSwgMF0uCi0gICAgICAgIC8vIDx0ZD48L3RkPjx0ZD48L3RkPjx0ZD48L3RkPgot
ICAgICAgICBib29sIGlzQ29sdW1uU3Bhbm5lZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNDb2x1bW5T
cGFubmVkOyB9Ci0gICAgICAgIGJvb2wgaXNSb3dTcGFubmVkKCkgY29uc3QgeyByZXR1cm4gbV9p
c1Jvd1NwYW5uZWQ7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFdlYWtQdHI8Q2VsbD4gbV9j
ZWxsOwotICAgICAgICBib29sIG1faXNDb2x1bW5TcGFubmVkIHsgZmFsc2UgfTsKLSAgICAgICAg
Ym9vbCBtX2lzUm93U3Bhbm5lZCB7IGZhbHNlIH07Ci0gICAgICAgIEZvcm1hdHRpbmdDb250ZXh0
OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIG1fd2lkdGhDb25zdHJhaW50czsKLSAgICB9Owot
Ci0gICAgY29uc3QgQ29sdW1ucyYgY29sdW1ucygpIGNvbnN0IHsgcmV0dXJuIG1fY29sdW1uczsg
fQotICAgIENvbHVtbnMmIGNvbHVtbnMoKSB7IHJldHVybiBtX2NvbHVtbnM7IH0KLQotICAgIGNv
bnN0IFJvd3MmIHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3M7IH0KLSAgICBSb3dzJiByb3dz
KCkgeyByZXR1cm4gbV9yb3dzOyB9Ci0KLSAgICB1c2luZyBDZWxscyA9IFdURjo6TGlzdEhhc2hT
ZXQ8c3RkOjp1bmlxdWVfcHRyPENlbGw+PjsKLSAgICBDZWxscyYgY2VsbHMoKSB7IHJldHVybiBt
X2NlbGxzOyB9Ci0KLSAgICBTbG90KiBzbG90KFNsb3RQb3NpdGlvbik7Ci0gICAgY29uc3QgU2xv
dCogc2xvdChTbG90UG9zaXRpb24gcG9zaXRpb24pIGNvbnN0IHsgcmV0dXJuIG1fc2xvdE1hcC5n
ZXQocG9zaXRpb24pOyB9Ci0gICAgYm9vbCBpc1NwYW5uZWQoU2xvdFBvc2l0aW9uKTsKLQotcHJp
dmF0ZToKLSAgICB1c2luZyBTbG90TWFwID0gV1RGOjpIYXNoTWFwPFNsb3RQb3NpdGlvbiwgc3Rk
Ojp1bmlxdWVfcHRyPFNsb3Q+PjsKLQotICAgIENvbHVtbnMgbV9jb2x1bW5zOwotICAgIFJvd3Mg
bV9yb3dzOwotICAgIENlbGxzIG1fY2VsbHM7Ci0gICAgU2xvdE1hcCBtX3Nsb3RNYXA7Ci0KLSAg
ICBMYXlvdXRVbml0IG1faG9yaXpvbnRhbFNwYWNpbmc7Ci0gICAgTGF5b3V0VW5pdCBtX3ZlcnRp
Y2FsU3BhY2luZzsKLSAgICBPcHRpb25hbDxGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lk
dGhDb25zdHJhaW50cz4gbV9pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOwotICAgIE9wdGlvbmFs
PEVkZ2VzPiBtX2NvbGxhcHNlZEJvcmRlcjsKLX07Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlTGF5b3V0LmNw
cCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVMYXlvdXQuY3Bw
CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM1MmM1YTE3ZjhjMGIzZDNkMjQ0ZTky
NWE3ZWYyNDgxOThhOGQzLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVMYXlvdXQu
Y3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAot
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVk
ZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0jaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJMYXlvdXRCb3gu
aCIKLSNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7
Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10YWJs
ZXMtMy8jdGFibGUtbGF5b3V0LWFsZ29yaXRobQotVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6VGFi
bGVMYXlvdXQ6OlRhYmxlTGF5b3V0KGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1h
dHRpbmdDb250ZXh0LCBjb25zdCBUYWJsZUdyaWQmIGdyaWQpCi0gICAgOiBtX2Zvcm1hdHRpbmdD
b250ZXh0KGZvcm1hdHRpbmdDb250ZXh0KQotICAgICwgbV9ncmlkKGdyaWQpCi17Ci19Ci0KLXN0
cnVjdCBDb2x1bW5TcGFuIHsKLSAgICBzdGF0aWMgc2l6ZV90IGhhc1NwYW4oY29uc3QgVGFibGVH
cmlkOjpTbG90JiBzbG90KSB7IHJldHVybiBzbG90Lmhhc0NvbHVtblNwYW4oKTsgfQotICAgIHN0
YXRpYyBzaXplX3QgaXNTcGFubmVkKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCkgeyByZXR1
cm4gc2xvdC5pc0NvbHVtblNwYW5uZWQoKTsgfQotCi0gICAgc3RhdGljIHNpemVfdCBzcGFuQ291
bnQoY29uc3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBjZWxsLmNvbHVtblNwYW4o
KTsgfQotICAgIHN0YXRpYyBzaXplX3Qgc3RhcnRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYg
Y2VsbCkgeyByZXR1cm4gY2VsbC5zdGFydENvbHVtbigpOyB9Ci0gICAgc3RhdGljIHNpemVfdCBl
bmRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5lbmRDb2x1
bW4oKTsgfQotCi0gICAgc3RhdGljIHNpemVfdCBpbmRleChzaXplX3QgY29sdW1uSW5kZXgsIHNp
emVfdCAvKnJvd0luZGV4Ki8pIHsgcmV0dXJuIGNvbHVtbkluZGV4OyB9Ci0gICAgc3RhdGljIHNp
emVfdCBzaXplKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5jb2x1bW5zKCku
c2l6ZSgpOyB9Ci0KLSAgICBzdGF0aWMgTGF5b3V0VW5pdCBzcGFjaW5nKGNvbnN0IFRhYmxlR3Jp
ZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5ob3Jpem9udGFsU3BhY2luZygpOyB9Ci19OwotCi1zdHJ1
Y3QgUm93U3BhbiB7Ci0gICAgc3RhdGljIHNpemVfdCBoYXNTcGFuKGNvbnN0IFRhYmxlR3JpZDo6
U2xvdCYgc2xvdCkgeyByZXR1cm4gc2xvdC5oYXNSb3dTcGFuKCk7IH0KLSAgICBzdGF0aWMgc2l6
ZV90IGlzU3Bhbm5lZChjb25zdCBUYWJsZUdyaWQ6OlNsb3QmIHNsb3QpIHsgcmV0dXJuIHNsb3Qu
aXNSb3dTcGFubmVkKCk7IH0KLQotICAgIHN0YXRpYyBzaXplX3Qgc3BhbkNvdW50KGNvbnN0IFRh
YmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5yb3dTcGFuKCk7IH0KLSAgICBzdGF0
aWMgc2l6ZV90IHN0YXJ0U3Bhbihjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJu
IGNlbGwuc3RhcnRSb3coKTsgfQotICAgIHN0YXRpYyBzaXplX3QgZW5kU3Bhbihjb25zdCBUYWJs
ZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJuIGNlbGwuZW5kUm93KCk7IH0KLQotICAgIHN0YXRp
YyBzaXplX3QgaW5kZXgoc2l6ZV90IC8qY29sdW1uSW5kZXgqLywgc2l6ZV90IHJvd0luZGV4KSB7
IHJldHVybiByb3dJbmRleDsgfQotICAgIHN0YXRpYyBzaXplX3Qgc2l6ZShjb25zdCBUYWJsZUdy
aWQmIGdyaWQpIHsgcmV0dXJuIGdyaWQucm93cygpLnNpemUoKTsgfQotCi0gICAgc3RhdGljIExh
eW91dFVuaXQgc3BhY2luZyhjb25zdCBUYWJsZUdyaWQmIGdyaWQpIHsgcmV0dXJuIGdyaWQudmVy
dGljYWxTcGFjaW5nKCk7IH0KLX07Ci0KLXN0cnVjdCBHcmlkU3BhY2UgewotICAgIGJvb2wgaXNF
bXB0eSgpIGNvbnN0IHsgcmV0dXJuICF2YWx1ZTsgfQotCi0gICAgLy8gSW5pdGlhbCB3aWR0aC9o
ZWlnaHQgZm9yIGNvbHVtbi9yb3cgd2Ugc3RhcnQgdGhlIGRpc3RyaWJ1dGlvbiB3aWR0aCAodXN1
YWxseSBhIG1pbnVtdW0gd2lkdGgpLgotICAgIGZsb2F0IHZhbHVlIHsgMCB9OwotICAgIC8vIFRo
ZSBiYXNlIHRvIGNvbXB1dGUgdGhlIGRpc3RyaWJ1dGlvbiByYXRpby4gSXQgbm9ybWFsbHkgbWF0
Y2hlcyB0aGUgW3ZhbHVlXSBidXQgaW4gc29tZSBjYXNlcyB3ZSB1c2UgdGhlIG1heGltdW0gdmFs
dWUgdG8gZGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UuIAotICAgIGZsb2F0IGRpc3RyaWJ1dGlv
bkJhc2UgeyAwIH07Ci19OwotCi1pbmxpbmUgc3RhdGljIEdyaWRTcGFjZSBtYXgoY29uc3QgR3Jp
ZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCi17Ci0gICAgcmV0dXJuIHsgc3RkOjptYXgo
YS52YWx1ZSwgYi52YWx1ZSksIHN0ZDo6bWF4KGEuZGlzdHJpYnV0aW9uQmFzZSwgYi5kaXN0cmli
dXRpb25CYXNlKSB9OwotfQotCi1pbmxpbmUgc3RhdGljIEdyaWRTcGFjZSYgb3BlcmF0b3ItKEdy
aWRTcGFjZSYgYSwgY29uc3QgR3JpZFNwYWNlJiBiKQotewotICAgIGEudmFsdWUgPSBzdGQ6Om1h
eCgwLjBmLCBhLnZhbHVlIC0gYi52YWx1ZSk7Ci0gICAgYS5kaXN0cmlidXRpb25CYXNlID0gc3Rk
OjptYXgoMC4wZiwgYS5kaXN0cmlidXRpb25CYXNlIC0gYi5kaXN0cmlidXRpb25CYXNlKTsKLSAg
ICByZXR1cm4gYTsKLX0KLQotaW5saW5lIHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJhdG9yKz0oR3Jp
ZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCi17Ci0gICAgYS52YWx1ZSArPSBiLnZhbHVl
OwotICAgIGEuZGlzdHJpYnV0aW9uQmFzZSArPSBiLmRpc3RyaWJ1dGlvbkJhc2U7Ci0gICAgcmV0
dXJuIGE7Ci19Ci0KLWlubGluZSBzdGF0aWMgR3JpZFNwYWNlJiBvcGVyYXRvci09KEdyaWRTcGFj
ZSYgYSwgY29uc3QgR3JpZFNwYWNlJiBiKQotewotICAgIHJldHVybiBhIC0gYjsKLX0KLQotaW5s
aW5lIHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJhdG9yLyhHcmlkU3BhY2UmIGEsIHVuc2lnbmVkIHZh
bHVlKQotewotICAgIGEudmFsdWUgLz0gdmFsdWU7Ci0gICAgYS5kaXN0cmlidXRpb25CYXNlIC89
IHZhbHVlOwotICAgIHJldHVybiBhOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3BhblR5cGU+
Ci1zdGF0aWMgVmVjdG9yPExheW91dFVuaXQ+IGRpc3RyaWJ1dGVBdmFpbGFibGVTcGFjZShjb25z
dCBUYWJsZUdyaWQmIGdyaWQsIExheW91dFVuaXQgYXZhaWxhYmxlU3BhY2UsIGNvbnN0IFdURjo6
RnVuY3Rpb248R3JpZFNwYWNlKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYsIHNpemVfdCk+JiBzbG90
U3BhY2UpCi17Ci0gICAgc3RydWN0IFJlc29sdmVkSXRlbSB7Ci0gICAgICAgIEdyaWRTcGFjZSBz
bG90U3BhY2U7Ci0gICAgICAgIGJvb2wgaXNGaXhlZCB7IGZhbHNlIH07Ci0gICAgfTsKLQotICAg
IGF1dG8mIGNvbHVtbnMgPSBncmlkLmNvbHVtbnMoKTsKLSAgICBhdXRvJiByb3dzID0gZ3JpZC5y
b3dzKCk7Ci0gICAgLy8gMS4gQ29sbGVjdCB0aGUgbm9uLXNwYW5uaW5nIHNwYWNlcyBmaXJzdC4g
VGhleSBhcmUgdXNlZCBmb3IgdGhlIGZpbmFsIGRpc3RyaWJ1dGlvbiBhcyB3ZWxsIGFzIGZvciBk
aXN0cmlidXRpbmcgdGhlIHNwYW5uaW5nIHNwYWNlLgotICAgIFZlY3RvcjxPcHRpb25hbDxSZXNv
bHZlZEl0ZW0+PiByZXNvbHZlZEl0ZW1zKFNwYW5UeXBlOjpzaXplKGdyaWQpKTsKLSAgICBmb3Ig
KHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsr
Y29sdW1uSW5kZXgpIHsKLSAgICAgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRl
eCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7Ci0gICAgICAgICAgICBhdXRvJiBzbG90ID0g
KmdyaWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsKLSAgICAgICAgICAgIGlmIChT
cGFuVHlwZTo6aGFzU3BhbihzbG90KSB8fCBTcGFuVHlwZTo6aXNTcGFubmVkKHNsb3QpKQotICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYXV0byBpbmRleCA9IFNwYW5UeXBl
OjppbmRleChjb2x1bW5JbmRleCwgcm93SW5kZXgpOwotICAgICAgICAgICAgaWYgKCFyZXNvbHZl
ZEl0ZW1zW2luZGV4XSkKLSAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1zW2luZGV4XSA9IFJl
c29sdmVkSXRlbSB7IH07Ci0gICAgICAgICAgICByZXNvbHZlZEl0ZW1zW2luZGV4XS0+c2xvdFNw
YWNlID0gbWF4KHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90U3BhY2UsIHNsb3RTcGFjZShzbG90
LCBpbmRleCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gMi4gQ29sbGVjdCB0aGUgc3Bh
bm5pbmcgY2VsbHMuCi0gICAgc3RydWN0IFNwYW5uaW5nQ2VsbCB7Ci0gICAgICAgIFNsb3RQb3Np
dGlvbiBwb3NpdGlvbjsKLSAgICAgICAgR3JpZFNwYWNlIHVucmVzb2x2ZWRTcGFjZTsKLSAgICB9
OwotICAgIFZlY3RvcjxTcGFubmluZ0NlbGw+IHNwYW5uaW5nQ2VsbHM7Ci0gICAgZm9yIChzaXpl
X3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7Ci0g
ICAgICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1bW5z
LnNpemUoKTsgKytjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgYXV0byYgc2xvdCA9ICpncmlk
LnNsb3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Ci0gICAgICAgICAgICBpZiAoU3BhblR5
cGU6Omhhc1NwYW4oc2xvdCkpCi0gICAgICAgICAgICAgICAgc3Bhbm5pbmdDZWxscy5hcHBlbmQo
eyB7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9LCBzbG90U3BhY2Uoc2xvdCwgU3BhblR5cGU6Omlu
ZGV4KGNvbHVtbkluZGV4LCByb3dJbmRleCkpIH0pOwotICAgICAgICB9Ci0gICAgfQotICAgIC8v
IFdlIG5lZWQgdGhlc2Ugc3Bhbm5pbmcgY2VsbHMgaW4gdGhlIG9yZGVyIG9mIHRoZSBudW1iZXIg
b2YgY29sdW1ucy9yb3dzIHRoZXkgc3BhbiBzbyB0aGF0Ci0gICAgLy8gd2UgY2FuIHJlc29sdmUg
b3ZlcmxhcHBpbmcgc3BhbnMgc3RhcnRpbmcgd2l0aCB0aGUgc2hvcnRlciBvbmVzIGUuZy4KLSAg
ICAvLyA8dGQgY29sc3Bhbj00PiNhPC90ZD48dGQ+I2I8L3RkPgotICAgIC8vIDx0ZCBjb2xzcGFu
PTI+I2M8L3RkPjx0ZCBjb2xzcGFuPTM+I2Q8L3RkPgotICAgIHN0ZDo6c29ydChzcGFubmluZ0Nl
bGxzLmJlZ2luKCksIHNwYW5uaW5nQ2VsbHMuZW5kKCksIFsmXSAoYXV0byYgYSwgYXV0byYgYikg
ewotICAgICAgICByZXR1cm4gU3BhblR5cGU6OnNwYW5Db3VudChncmlkLnNsb3QoYS5wb3NpdGlv
biktPmNlbGwoKSkgPCBTcGFuVHlwZTo6c3BhbkNvdW50KGdyaWQuc2xvdChiLnBvc2l0aW9uKS0+
Y2VsbCgpKTsKLSAgICB9KTsKLQotICAgIC8vIDMuIERpc3RyaWJ1dGUgdGhlIHNwYW5uaW5nIGNl
bGxzJyBtaW1pbXVtIHNwYWNlIGFjcm9zcyB0aGUgY29sdW1ucy9yb3dzIHVzaW5nIHRoZSBub24t
c3Bhbm5pbmcgc3BhY2VzLgotICAgIC8vIGUuZy4gWyAxIF1bIDUgXVsgMSBdCi0gICAgLy8gICAg
ICBbICAgIDkgICBdWyAxIF0KLSAgICAvLyBUaGUgaW5pdGlhbCB3aWR0aHMgYXJlOiBbIDIgXVsg
NyBdWyAxIF0KLSAgICBmb3IgKGF1dG8gc3Bhbm5pbmdDZWxsIDogc3Bhbm5pbmdDZWxscykgewot
ICAgICAgICBhdXRvJiBjZWxsID0gZ3JpZC5zbG90KHNwYW5uaW5nQ2VsbC5wb3NpdGlvbiktPmNl
bGwoKTsKLSAgICAgICAgYXV0byB1bnJlc29sdmVkU3Bhbm5pbmdTcGFjZSA9IHNwYW5uaW5nQ2Vs
bC51bnJlc29sdmVkU3BhY2U7Ci0gICAgICAgIGlmICghcmVzb2x2ZWRJdGVtc1tTcGFuVHlwZTo6
c3RhcnRTcGFuKGNlbGwpXSB8fCAhcmVzb2x2ZWRJdGVtc1tTcGFuVHlwZTo6ZW5kU3BhbihjZWxs
KSAtIDFdKSB7Ci0gICAgICAgICAgICAvLyA8dGQgY29sc3Bhbj00PiNhPC90ZD48dGQ+I2I8L3Rk
PgotICAgICAgICAgICAgLy8gPHRkIGNvbHNwYW49Mj4jYzwvdGQ+PHRkIGNvbHNwYW49Mz4jZDwv
dGQ+Ci0gICAgICAgICAgICAvLyBVbnJlc29sdmVkIGNvbHVtbnMgYXJlOiAxIDIgMyA0Ci0gICAg
ICAgICAgICAvLyAxLiBUYWtlIGNvbHNwYW49MiAoc2hvcnRlc3Qgc3BhbikgYW5kIHJlc29sdmUg
Y29sdW1uIDEgYW5kIDIKLSAgICAgICAgICAgIC8vIDIuIFRha2UgY29sc3Bhbj0zIGFuZCByZXNv
bHZlIGNvbHVtbiAzIGFuZCA0ICg1IGlzIHJlc29sdmVkIGJlY2F1c2UgaXQgYWxyZWFkeSBoYXMg
YSBub24tc3Bhbm5pbmcgY2VsbCkuCi0gICAgICAgICAgICAvLyAzLiBjb2xzcGFuPTQgbmVlZHMg
bm8gcmVzb2x2aW5nIGJlY2F1c2UgYWxsIHRoZSBzcGFubmVkIGNvbHVtbnMgKDEgMiAzIDQpIGhh
dmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkLgotICAgICAgICAgICAgYXV0byB1bnJlc29sdmVkQ29s
dW1uQ291bnQgPSBjZWxsLmNvbHVtblNwYW4oKTsKLSAgICAgICAgICAgIGZvciAoYXV0byBzcGFu
SW5kZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpOyBzcGFuSW5kZXggPCBTcGFuVHlwZTo6
ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXJlc29s
dmVkSXRlbXNbc3BhbkluZGV4XSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgICAgICAgICAgQVNTRVJUKHVucmVzb2x2ZWRDb2x1bW5Db3VudCk7Ci0gICAgICAgICAgICAg
ICAgLS11bnJlc29sdmVkQ29sdW1uQ291bnQ7Ci0gICAgICAgICAgICAgICAgdW5yZXNvbHZlZFNw
YW5uaW5nU3BhY2UgLT0gcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2U7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBBU1NFUlQodW5yZXNvbHZlZENvbHVtbkNvdW50KTsKLSAg
ICAgICAgICAgIGF1dG8gZXF1YWxTcGFjZUZvclNwYW5uZWRDb2x1bW5zID0gdW5yZXNvbHZlZFNw
YW5uaW5nU3BhY2UgLyB1bnJlc29sdmVkQ29sdW1uQ291bnQ7Ci0gICAgICAgICAgICBmb3IgKGF1
dG8gc3BhbkluZGV4ID0gU3BhblR5cGU6OnN0YXJ0U3BhbihjZWxsKTsgc3BhbkluZGV4IDwgU3Bh
blR5cGU6OmVuZFNwYW4oY2VsbCk7ICsrc3BhbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYg
KHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdID0gUmVzb2x2ZWRJdGVt
IHsgZXF1YWxTcGFjZUZvclNwYW5uZWRDb2x1bW5zLCBmYWxzZSB9OwotICAgICAgICAgICAgfQot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gMS4gQ29sbGVjdCB0aGUgbm9uLXNwYW5p
bmcgcmVzb2x2ZWQgc3BhY2VzLgotICAgICAgICAgICAgLy8gMi4gRGlzdHJpYnV0ZSB0aGUgZXh0
cmEgc3BhY2UgYW1vbmcgdGhlIHNwYW5uZWQgY29sdW1ucy9yb3dzIGJhc2VkIG9uIHRoZSByZXNv
bHZlZCBzcGFjZSB2YWx1ZXMuCi0gICAgICAgICAgICAvLyBlLmcuIHNwYW5uaW5nIHdpZHRoOiBb
ICAgOSAgIF0uIFJlc29sdmVkIHdpZHRocyBmb3IgdGhlIHNwYW5uZWQgY29sdW1uczogWyAxIF0g
WyAyIF0KLSAgICAgICAgICAgIC8vIE5ldyByZXNvbHZlZCB3aWR0aHM6IFsgMyBdIFsgNiBdLgot
ICAgICAgICAgICAgYXV0byByZXNvbHZlZFNwYW5uaW5nU3BhY2UgPSBHcmlkU3BhY2UgeyB9Owot
ICAgICAgICAgICAgZm9yIChhdXRvIHNwYW5JbmRleCA9IFNwYW5UeXBlOjpzdGFydFNwYW4oY2Vs
bCk7IHNwYW5JbmRleCA8IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwpOyArK3NwYW5JbmRleCkKLSAg
ICAgICAgICAgICAgICByZXNvbHZlZFNwYW5uaW5nU3BhY2UgKz0gcmVzb2x2ZWRJdGVtc1tzcGFu
SW5kZXhdLT5zbG90U3BhY2U7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRTcGFubmluZ1NwYWNl
LnZhbHVlID49IHVucmVzb2x2ZWRTcGFubmluZ1NwYWNlLnZhbHVlKSB7Ci0gICAgICAgICAgICAg
ICAgLy8gVGhlIHNwYW5uaW5nIGNlbGwgZml0cyB0aGUgc3Bhbm5lZCBjb2x1bW5zL3Jvd3MganVz
dCBmaW5lLiBOb3RoaW5nIHRvIGRpc3RyaWJ1dGUuCi0gICAgICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvIHNwYWNpbmcgPSBTcGFuVHlwZTo6c3Bh
Y2luZyhncmlkKSAqIChTcGFuVHlwZTo6c3BhbkNvdW50KGNlbGwpIC0gMSk7Ci0gICAgICAgICAg
ICBhdXRvIHNwYWNlVG9EaXN0cmlidXRlID0gdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UgLSBHcmlk
U3BhY2UgeyBzcGFjaW5nLCBzcGFjaW5nIH0gLSByZXNvbHZlZFNwYW5uaW5nU3BhY2U7IAotICAg
ICAgICAgICAgaWYgKCFzcGFjZVRvRGlzdHJpYnV0ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAg
ICAgICBhdXRvIGRpc3RyaWJ1dGlvblJhdGlvID0gc3BhY2VUb0Rpc3RyaWJ1dGUuZGlzdHJpYnV0
aW9uQmFzZSAvIHJlc29sdmVkU3Bhbm5pbmdTcGFjZS5kaXN0cmlidXRpb25CYXNlOwotICAgICAg
ICAgICAgICAgIGZvciAoYXV0byBzcGFuSW5kZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwp
OyBzcGFuSW5kZXggPCBTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5kZXgpCi0gICAg
ICAgICAgICAgICAgICAgIHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xvdFNwYWNlICs9IEdy
aWRTcGFjZSB7IHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xvdFNwYWNlLnZhbHVlICogZGlz
dHJpYnV0aW9uUmF0aW8sIHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xvdFNwYWNlLmRpc3Ry
aWJ1dGlvbkJhc2UgKiBkaXN0cmlidXRpb25SYXRpb307Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0gICAgLy8gNC4gRGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UgdXNpbmcgdGhl
IGZpbmFsIHJlc29sdmVkIHdpZHRocy4KLSNpZiBBU1NFUlRfRU5BQkxFRAotICAgIC8vIFdlIGhh
dmUgdG8gaGF2ZSBhbGwgdGhlIHNwYWNlcyByZXNvbHZlZCBhdCB0aGlzIHBvaW50LgotICAgIGZv
ciAoYXV0byYgcmVzb2x2ZWRJdGVtIDogcmVzb2x2ZWRJdGVtcykKLSAgICAgICAgQVNTRVJUKHJl
c29sdmVkSXRlbSk7Ci0jZW5kaWYKLSAgICAvLyBGaXhlZCBzaXplIGNlbGxzIGRvbid0IHBhcnRp
Y2lwYXRlIGluIGF2YWlsYWJsZSBzcGFjZSBkaXN0cmlidXRpb24uCi0gICAgYXV0byBhZGp1c3Rh
YmxlZFNwYWNlID0gR3JpZFNwYWNlIHsgfTsKLSAgICBmb3IgKGF1dG8mIHJlc29sdmVkSXRlbSA6
IHJlc29sdmVkSXRlbXMpIHsKLSAgICAgICAgaWYgKHJlc29sdmVkSXRlbS0+aXNGaXhlZCkKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBhZGp1c3RhYmxlZFNwYWNlICs9IHJlc29sdmVk
SXRlbS0+c2xvdFNwYWNlOwotICAgIH0KLQotICAgIFZlY3RvcjxMYXlvdXRVbml0PiBkaXN0cmli
dXRlZFNwYWNlcyhyZXNvbHZlZEl0ZW1zLnNpemUoKSk7Ci0gICAgZmxvYXQgc3BhY2VUb0Rpc3Ry
aWJ1dGUgPSBhdmFpbGFibGVTcGFjZSAtIGFkanVzdGFibGVkU3BhY2UudmFsdWUgLSAoKHJlc29s
dmVkSXRlbXMuc2l6ZSgpICsgMSkgKiBTcGFuVHlwZTo6c3BhY2luZyhncmlkKSk7Ci0gICAgLy8g
RXNzZW50aWFsbHkgdGhlIHJlbWFpbmluZyBzcGFjZSB0byBkaXN0cmlidXRlIHNob3VsZCBuZXZl
ciBiZSBuZWdhdGl2ZS4gTGF5b3V0VW5pdDo6ZXBzaWxvbigpIGlzIHJlcXVpcmVkIHRvIGNvbXBl
bnNhdGUgZm9yIExheW91dFVuaXQncyBsb3cgcHJlY2lzaW9uLgotICAgIEFTU0VSVChzcGFjZVRv
RGlzdHJpYnV0ZSA+PSAtTGF5b3V0VW5pdDo6ZXBzaWxvbigpICogcmVzb2x2ZWRJdGVtcy5zaXpl
KCkpOwotICAgIC8vIERpc3RyaWJ1dGUgdGhlIGV4dHJhIHNwYWNlIGJhc2VkIG9uIHRoZSByZXNv
bHZlZCBzcGFjZXMuCi0gICAgYXV0byBkaXN0cmlidXRpb25SYXRpbyA9IHNwYWNlVG9EaXN0cmli
dXRlIC8gYWRqdXN0YWJsZWRTcGFjZS5kaXN0cmlidXRpb25CYXNlOwotICAgIGZvciAoc2l6ZV90
IGluZGV4ID0gMDsgaW5kZXggPCByZXNvbHZlZEl0ZW1zLnNpemUoKTsgKytpbmRleCkgewotICAg
ICAgICBhdXRvIHNsb3RTcGFjZSA9IHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90U3BhY2UudmFs
dWU7Ci0gICAgICAgIGF1dG8gbmVlZHNTcGFjZURpc3RyaWJ1dGlvbiA9IHNwYWNlVG9EaXN0cmli
dXRlICYmICFyZXNvbHZlZEl0ZW1zW2luZGV4XS0+aXNGaXhlZDsKLSAgICAgICAgZGlzdHJpYnV0
ZWRTcGFjZXNbaW5kZXhdID0gTGF5b3V0VW5pdCB7IHNsb3RTcGFjZSB9OwotICAgICAgICBpZiAo
IW5lZWRzU3BhY2VEaXN0cmlidXRpb24pCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ZGlzdHJpYnV0ZWRTcGFjZXNbaW5kZXhdICs9IExheW91dFVuaXQgeyByZXNvbHZlZEl0ZW1zW2lu
ZGV4XS0+c2xvdFNwYWNlLmRpc3RyaWJ1dGlvbkJhc2UgKiBkaXN0cmlidXRpb25SYXRpbyB9Owot
ICAgIH0KLSAgICByZXR1cm4gZGlzdHJpYnV0ZWRTcGFjZXM7Ci19Ci0KLVRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQ6OlRhYmxlTGF5b3V0OjpEaXN0cmlidXRlZFNwYWNlcyBUYWJsZUZvcm1hdHRpbmdD
b250ZXh0OjpUYWJsZUxheW91dDo6ZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2UoTGF5b3V0VW5p
dCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpCi17Ci0gICAgZW51bSBjbGFzcyBDb2x1bW5XaWR0
aEJhbGFuY2luZ0Jhc2UgeyBNaW5pbXVtV2lkdGgsIE1heGltdW1XaWR0aCB9OwotICAgIGF1dG8g
Y29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlID0gYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlID49IG1f
Z3JpZC53aWR0aENvbnN0cmFpbnRzKCktPm1heGltdW0gPyBDb2x1bW5XaWR0aEJhbGFuY2luZ0Jh
c2U6Ok1heGltdW1XaWR0aCA6IENvbHVtbldpZHRoQmFsYW5jaW5nQmFzZTo6TWluaW11bVdpZHRo
OwotICAgIHJldHVybiBkaXN0cmlidXRlQXZhaWxhYmxlU3BhY2U8Q29sdW1uU3Bhbj4obV9ncmlk
LCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UsIFsmXSAoY29uc3QgVGFibGVHcmlkOjpTbG90JiBz
bG90LCBzaXplX3QgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgYXV0byYgY29sdW1uID0gbV9ncmlk
LmNvbHVtbnMoKS5saXN0KClbY29sdW1uSW5kZXhdOwotICAgICAgICBhdXRvIGNvbHVtbkJveEZp
eGVkV2lkdGggPSBjb2x1bW4uYm94KCkgPyBjb2x1bW4uYm94KCktPmNvbHVtbldpZHRoKCkudmFs
dWVPcigwX2x1KSA6IDBfbHU7Ci0gICAgICAgIGF1dG8gbWluaW11bVdpZHRoID0gc3RkOjptYXg8
ZmxvYXQ+KHNsb3Qud2lkdGhDb25zdHJhaW50cygpLm1pbmltdW0sIGNvbHVtbkJveEZpeGVkV2lk
dGgpOwotICAgICAgICBhdXRvIG1heGltdW1XaWR0aCA9IHN0ZDo6bWF4PGZsb2F0PihzbG90Lndp
ZHRoQ29uc3RyYWludHMoKS5tYXhpbXVtLCBjb2x1bW5Cb3hGaXhlZFdpZHRoKTsKLQotICAgICAg
ICBpZiAoY29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlID09IENvbHVtbldpZHRoQmFsYW5jaW5nQmFz
ZTo6TWluaW11bVdpZHRoKSB7Ci0gICAgICAgICAgICBBU1NFUlQobWF4aW11bVdpZHRoID49IG1p
bmltdW1XaWR0aCk7Ci0gICAgICAgICAgICByZXR1cm4gR3JpZFNwYWNlIHsgbWluaW11bVdpZHRo
LCBtYXhpbXVtV2lkdGggLSBtaW5pbXVtV2lkdGggfTsKLSAgICAgICAgfQotICAgICAgICAvLyBX
aGVuIHRoZSBjb2x1bW4gaGFzIGEgZml4ZWQgd2lkdGggY2VsbCwgdGhlIG1heGltdW0gd2lkdGgg
YmFsYW5jaW5nIGlzIGJhc2VkIG9uIHRoZSBtaW5pbXVtIHdpZHRoLgotICAgICAgICBpZiAoY29s
dW1uLmlzRml4ZWRXaWR0aCgpKQotICAgICAgICAgICAgcmV0dXJuIEdyaWRTcGFjZSB7IG1pbmlt
dW1XaWR0aCwgbWF4aW11bVdpZHRoIH07Ci0gICAgICAgIHJldHVybiBHcmlkU3BhY2UgeyBtYXhp
bXVtV2lkdGgsIG1heGltdW1XaWR0aCB9OwotICAgIH0pOwotfQotCi1UYWJsZUZvcm1hdHRpbmdD
b250ZXh0OjpUYWJsZUxheW91dDo6RGlzdHJpYnV0ZWRTcGFjZXMgVGFibGVGb3JtYXR0aW5nQ29u
dGV4dDo6VGFibGVMYXlvdXQ6OmRpc3RyaWJ1dGVkVmVydGljYWxTcGFjZShPcHRpb25hbDxMYXlv
dXRVbml0PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKQotewotICAgIGF1dG8mIHJvd3MgPSBtX2dy
aWQucm93cygpOwotICAgIGF1dG8mIGNvbHVtbnMgPSBtX2dyaWQuY29sdW1ucygpOwotCi0gICAg
VmVjdG9yPExheW91dFVuaXQ+IHJvd0hlaWdodChyb3dzLnNpemUoKSk7Ci0gICAgYXV0byB0YWJs
ZVVzZWRIZWlnaHQgPSBMYXlvdXRVbml0IHsgfTsKLSAgICAvLyAyLiBDb2xsZWN0IGluaXRpYWws
IGJhc2VsaW5lIGFsaWduZWQgcm93IGhlaWdodHMuCi0gICAgZm9yIChzaXplX3Qgcm93SW5kZXgg
PSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7Ci0gICAgICAgIGF1dG8g
bWF4aW11bUNvbHVtbkFzY2VudCA9IElubGluZUxheW91dFVuaXQgeyB9OwotICAgICAgICBhdXRv
IG1heGltdW1Db2x1bW5EZXNjZW50ID0gSW5saW5lTGF5b3V0VW5pdCB7IH07Ci0gICAgICAgIC8v
IEluaXRpYWwgbWluaW11bSBoZWlnaHQgaXMgdGhlIGNvbXB1dGVkIGhlaWdodCBpZiBhdmFpbGFi
bGUgPHRyIHN0eWxlPSJoZWlnaHQ6IDEwMHB4Ij48dGQ+PC90ZD48L3RyPgotICAgICAgICByb3dI
ZWlnaHRbcm93SW5kZXhdID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeSgpLmNvbXB1dGVk
SGVpZ2h0KHJvd3MubGlzdCgpW3Jvd0luZGV4XS5ib3goKSwgYXZhaWxhYmxlVmVydGljYWxTcGFj
ZSkudmFsdWVPcigwX2x1KTsKLSAgICAgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBj
b2x1bW5JbmRleCA8IGNvbHVtbnMuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7Ci0gICAgICAgICAg
ICBhdXRvJiBzbG90ID0gKm1fZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0pOwot
ICAgICAgICAgICAgaWYgKHNsb3QuaXNSb3dTcGFubmVkKCkpCi0gICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICBpZiAoc2xvdC5oYXNSb3dTcGFuKCkpCi0gICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICAvLyBUaGUgbWluaW11bSBoZWlnaHQgb2YgYSByb3cg
KHdpdGhvdXQgc3Bhbm5pbmctcmVsYXRlZCBoZWlnaHQgZGlzdHJpYnV0aW9uKSBpcyBkZWZpbmVk
IGFzIHRoZSBoZWlnaHQgb2YgYW4gaHlwb3RoZXRpY2FsCi0gICAgICAgICAgICAvLyBsaW5lYm94
IGNvbnRhaW5pbmcgdGhlIGNlbGxzIG9yaWdpbmF0aW5nIGluIHRoZSByb3cuCi0gICAgICAgICAg
ICBhdXRvJiBjZWxsID0gc2xvdC5jZWxsKCk7Ci0gICAgICAgICAgICBhdXRvJiBjZWxsQm94ID0g
Y2VsbC5ib3goKTsKLSAgICAgICAgICAgIGF1dG8gaGVpZ2h0ID0gZm9ybWF0dGluZ0NvbnRleHQo
KS5nZW9tZXRyeUZvckJveChjZWxsQm94KS5ib3JkZXJCb3hIZWlnaHQoKTsKLSAgICAgICAgICAg
IGlmIChjZWxsQm94LnN0eWxlKCkudmVydGljYWxBbGlnbigpID09IFZlcnRpY2FsQWxpZ246OkJh
c2VsaW5lKSB7Ci0gICAgICAgICAgICAgICAgbWF4aW11bUNvbHVtbkFzY2VudCA9IHN0ZDo6bWF4
KG1heGltdW1Db2x1bW5Bc2NlbnQsIGNlbGwuYmFzZWxpbmUoKSk7Ci0gICAgICAgICAgICAgICAg
bWF4aW11bUNvbHVtbkRlc2NlbnQgPSBzdGQ6Om1heChtYXhpbXVtQ29sdW1uRGVzY2VudCwgaGVp
Z2h0IC0gY2VsbC5iYXNlbGluZSgpKTsKLSAgICAgICAgICAgICAgICByb3dIZWlnaHRbcm93SW5k
ZXhdID0gc3RkOjptYXgocm93SGVpZ2h0W3Jvd0luZGV4XSwgTGF5b3V0VW5pdCB7IG1heGltdW1D
b2x1bW5Bc2NlbnQgKyBtYXhpbXVtQ29sdW1uRGVzY2VudCB9KTsKLSAgICAgICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgICAgIHJvd0hlaWdodFtyb3dJbmRleF0gPSBzdGQ6Om1heChyb3dIZWln
aHRbcm93SW5kZXhdLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIHRhYmxlVXNlZEhlaWdo
dCArPSByb3dIZWlnaHRbcm93SW5kZXhdOwotICAgIH0KLSAgICAvLyBGSVhNRTogQ29sbGVjdCBz
cGFubmluZyByb3cgbWF4aW11bSBoZWlnaHRzLgotCi0gICAgdGFibGVVc2VkSGVpZ2h0ICs9IChy
b3dzLnNpemUoKSArIDEpICogbV9ncmlkLnZlcnRpY2FsU3BhY2luZygpOwotICAgIGF1dG8gYXZh
aWxhYmxlU3BhY2UgPSBzdGQ6Om1heChhdmFpbGFibGVWZXJ0aWNhbFNwYWNlLnZhbHVlT3IoMF9s
dSksIHRhYmxlVXNlZEhlaWdodCk7Ci0gICAgLy8gRGlzdHJpYnV0ZSBleHRyYSBzcGFjZSBpZiB0
aGUgdGFibGUgaXMgc3VwcG9zZWQgdG8gYmUgdGFsbGVyIHRoYW4gdGhlIHN1bSBvZiB0aGUgcm93
IGhlaWdodHMuCi0gICAgcmV0dXJuIGRpc3RyaWJ1dGVBdmFpbGFibGVTcGFjZTxSb3dTcGFuPiht
X2dyaWQsIGF2YWlsYWJsZVNwYWNlLCBbJl0gKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCwg
c2l6ZV90IHJvd0luZGV4KSB7Ci0gICAgICAgIGlmIChzbG90Lmhhc1Jvd1NwYW4oKSkKLSAgICAg
ICAgICAgIHJldHVybiBHcmlkU3BhY2UgeyBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9y
Qm94KHNsb3QuY2VsbCgpLmJveCgpKS5ib3JkZXJCb3hIZWlnaHQoKSwgZm9ybWF0dGluZ0NvbnRl
eHQoKS5nZW9tZXRyeUZvckJveChzbG90LmNlbGwoKS5ib3goKSkuYm9yZGVyQm94SGVpZ2h0KCkg
fTsKLSAgICAgICAgYXV0byYgcm93cyA9IG1fZ3JpZC5yb3dzKCk7Ci0gICAgICAgIGF1dG8gY29t
cHV0ZWRSb3dIZWlnaHQgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCkuY29tcHV0ZWRI
ZWlnaHQocm93cy5saXN0KClbcm93SW5kZXhdLmJveCgpLCB7IH0pOwotICAgICAgICBhdXRvIGhl
aWdodCA9IHN0ZDo6bWF4PGZsb2F0Pihyb3dIZWlnaHRbcm93SW5kZXhdLCBjb21wdXRlZFJvd0hl
aWdodC52YWx1ZU9yKDBfbHUpKTsKLSAgICAgICAgcmV0dXJuIEdyaWRTcGFjZSB7IGhlaWdodCwg
aGVpZ2h0IH07Ci0gICAgfSk7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>