<?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>225275</bug_id>
          
          <creation_ts>2021-05-01 21:01:08 -0700</creation_ts>
          <short_desc>[LFC] Rename block(inline/table/flex)formattingContext directories to block(inline/table/flex)</short_desc>
          <delta_ts>2021-05-02 10:01:14 -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>1756019</commentid>
    <comment_count>0</comment_count>
    <who name="alan">zalan</who>
    <bug_when>2021-05-01 21:01:08 -0700</bug_when>
    <thetext>the formattingContext postfix is redundant as they are all under the /formattingContexts directory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1756020</commentid>
    <comment_count>1</comment_count>
      <attachid>427518</attachid>
    <who name="alan">zalan</who>
    <bug_when>2021-05-01 21:03:53 -0700</bug_when>
    <thetext>Created attachment 427518
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1756059</commentid>
    <comment_count>2</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2021-05-02 10:00:04 -0700</bug_when>
    <thetext>Committed r276886 (237232@main): &lt;https://commits.webkit.org/237232@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 427518.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1756060</commentid>
    <comment_count>3</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-05-02 10:01:14 -0700</bug_when>
    <thetext>&lt;rdar://problem/77435864&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>427518</attachid>
            <date>2021-05-01 21:03:53 -0700</date>
            <delta_ts>2021-05-02 10:00:06 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-225275-20210501210352.patch</filename>
            <type>text/plain</type>
            <size>1085215</size>
            <attacher name="alan">zalan</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc2ODc3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggODIwZjg0MGFiMzRlNDM3
YzYwZGIzNThiZWJlMDdlZWUzNzAxMTFmMS4uMzNjZDIzNGExZjRkNTBiNTdlMjFiYTQwNjU3MDA5
YTZlNmE5OWQ2ZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE3IEBACisyMDIxLTA1LTAxICBaYWxh
biBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CisKKyAgICAgICAgW0xGQ10gUmVuYW1lIGJsb2Nr
KGlubGluZS90YWJsZS9mbGV4KWZvcm1hdHRpbmdDb250ZXh0IGRpcmVjdG9yaWVzIHRvIGJsb2Nr
KGlubGluZS90YWJsZS9mbGV4KQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MjI1Mjc1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgVGhlIGZvcm1hdHRpbmdDb250ZXh0IHBvc3RmaXggaXMgcmVkdW5kYW50IGFz
IHRoZXkgYXJlIGFsbCB1bmRlciB0aGUgL2Zvcm1hdHRpbmdDb250ZXh0cyBkaXJlY3RvcnkuCisK
KyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAgKiBIZWFkZXJzLmNtYWtlOgorICAg
ICAgICAqIFNvdXJjZXMudHh0OgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvajoKKwogMjAyMS0wNS0wMSAgU2FtIFdlaW5pZyAgPHdlaW5pZ0BhcHBsZS5jb20+CiAK
ICAgICAgICAgVXBkYXRlIG9wZXJhdGlvbnMgaW4gQ2FudmFzSW1hZ2VEYXRhLmlkbCB0byB1c2Ug
bG9uZyByYXRoZXIgdGhhbiBmbG9hdCBhcyBwZXIgc3BlYwpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvQ01ha2VMaXN0cy50eHQgYi9Tb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAppbmRl
eCAwZmFhYmYzYzA3MWMxYzQzZDE1MDc2Zjk5MGE1ZDRiYWI4NTYwYTMyLi5hZTNmY2ZlZDI2MWE2
YjQ2OGM3ODRlZDUxMGI0NzQzMzVjNDIzMjU1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9D
TWFrZUxpc3RzLnR4dAorKysgYi9Tb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dApAQCAtMTAy
LDE2ICsxMDIsMTYgQEAgc2V0KFdlYkNvcmVfUFJJVkFURV9JTkNMVURFX0RJUkVDVE9SSUVTCiAg
ICAgIiR7V0VCQ09SRV9ESVJ9L2luc3BlY3Rvci9hZ2VudHMvd29ya2VyIgogICAgICIke1dFQkNP
UkVfRElSfS9sYXlvdXQiCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMiCi0gICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxv
Y2tmb3JtYXR0aW5nIgotICAgICIke1dFQkNPUkVfRElSfS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIiCi0gICAgIiR7V0VCQ09SRV9ESVJ9L2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmciCisgICAgIiR7V0VCQ09SRV9E
SVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2siCisgICAgIiR7V0VCQ09SRV9ESVJ9
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2svdGFibGV3cmFwcGVyIgorICAgICIke1dF
QkNPUkVfRElSfS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXgiCiAgICAgIiR7V0VCQ09S
RV9ESVJ9L2xheW91dC9mbG9hdHMiCi0gICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZyIKLSAgICAiJHtXRUJDT1JFX0RJUn0vbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL3RleHQiCisgICAgIiR7V0VCQ09S
RV9ESVJ9L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lIgorICAgICIke1dFQkNPUkVf
RElSfS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS90ZXh0IgogICAgICIke1dFQkNP
UkVfRElSfS9sYXlvdXQvaW50ZWdyYXRpb24iCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9p
bnZhbGlkYXRpb24iCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xheW91dC9sYXlvdXR0cmVlIgotICAg
ICIke1dFQkNPUkVfRElSfS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGlu
ZyIKKyAgICAiJHtXRUJDT1JFX0RJUn0vbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZSIK
ICAgICAiJHtXRUJDT1JFX0RJUn0vbG9hZGVyIgogICAgICIke1dFQkNPUkVfRElSfS9sb2FkZXIv
YXBwY2FjaGUiCiAgICAgIiR7V0VCQ09SRV9ESVJ9L2xvYWRlci9hcmNoaXZlIgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvSGVhZGVycy5jbWFrZSBiL1NvdXJjZS9XZWJDb3JlL0hlYWRlcnMu
Y21ha2UKaW5kZXggOTBkYWJiOTExM2I5MGQ3MmZkMDEyNDRkOTcwMTE5Y2E2ZTYyOThhMi4uMmYw
NjU1NWRlZjQ4NTE0MTYwODMwZDEyNjBmNzk0YjJiMzdmZWQ0YyAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvSGVhZGVycy5jbWFrZQorKysgYi9Tb3VyY2UvV2ViQ29yZS9IZWFkZXJzLmNtYWtl
CkBAIC03NTQsNyArNzU0LDcgQEAgc2V0KFdlYkNvcmVfUFJJVkFURV9GUkFNRVdPUktfSEVBREVS
UwogICAgIGxheW91dC9MYXlvdXRVbml0cy5oCiAgICAgbGF5b3V0L01hcmdpblR5cGVzLmgKIAot
ICAgIGxheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVSZWN0
LmgKKyAgICBsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVSZWN0LmgKIAog
ICAgIGxheW91dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbklubGluZUNvbnRlbnQuaAog
ICAgIGxheW91dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbkxpbmUuaApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvU291cmNlcy50eHQgYi9Tb3VyY2UvV2ViQ29yZS9Tb3VyY2VzLnR4
dAppbmRleCAyZDkwNjE0OTNhNGYyNTA3Y2FhNGRmN2NkODc1MmZiMmEyNjI5YWJlLi5mOWUxMmVk
ODE5MmM5ODBhMzY0N2VmNGE1YTdlMzZiYTQ5MTA4M2E2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9Tb3VyY2VzLnR4dAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Tb3VyY2VzLnR4dApAQCAtMTUx
NywzMSArMTUxNywzMSBAQCBsYXlvdXQvTGF5b3V0UGhhc2UuY3BwCiBsYXlvdXQvTGF5b3V0U3Rh
dGUuY3BwCiBsYXlvdXQvTGF5b3V0VW5pdHMuY3BwCiBsYXlvdXQvVmVyaWZpY2F0aW9uLmNwcAot
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5n
Q29udGV4dC5jcHAKLWxheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Js
b2NrRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKLWxheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCi1sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdTdGF0
ZS5jcHAKLWxheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrTWFy
Z2luQ29sbGFwc2UuY3BwCi1sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGlu
Zy9QcmVjb21wdXRlZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCi1sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dC5jcHAKLWxheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0
aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtz
LmNwcAotbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0
dGluZ0NvbnRleHQuY3BwCi1sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5n
L0ZsZXhGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAotbGF5b3V0L2Zvcm1hdHRpbmdDb250
ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ1N0YXRlLmNwcAorbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9ibG9jay9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcAorbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9ibG9jay9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3Bw
CitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRR
dWlya3MuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrL0Jsb2NrRm9ybWF0dGlu
Z1N0YXRlLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9jay9CbG9ja01hcmdpbkNv
bGxhcHNlLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9jay9QcmVjb21wdXRlZEJs
b2NrTWFyZ2luQ29sbGFwc2UuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrL3Rh
Ymxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcAorbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9jay90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tG
b3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxl
eC9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Zs
ZXgvRmxleEZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2ZsZXgvRmxleEZvcm1hdHRpbmdTdGF0ZS5jcHAKIGxheW91dC9mbG9hdHMvRmxvYXRB
dm9pZGVyLmNwcAogbGF5b3V0L2Zsb2F0cy9GbG9hdGluZ0NvbnRleHQuY3BwCiBsYXlvdXQvZmxv
YXRzL0Zsb2F0aW5nU3RhdGUuY3BwCi1sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZv
cm1hdHRpbmcvSW5saW5lQ29udGVudEJyZWFrZXIuY3BwCi1sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuY3BwCi1sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHRHZW9tZXRyeS5jcHAKLWxheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKLWxheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuY3BwCi1sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lSXRlbS5jcHAKLWxheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lLmNwcAotbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3Bw
Ci1sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJ1
aWxkZXIuY3BwCi1sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5s
aW5lVGV4dEl0ZW0uY3BwCi1sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRp
bmcvdGV4dC9UZXh0VXRpbC5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL0lu
bGluZUNvbnRlbnRCcmVha2VyLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUv
SW5saW5lRm9ybWF0dGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lu
bGluZS9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9pbmxpbmUvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCitsYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuY3BwCits
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVJdGVtLmNwcAorbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5lTGluZS5jcHAKK2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvaW5saW5lL0lubGluZUxpbmVCb3guY3BwCitsYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2lubGluZS9JbmxpbmVMaW5lQnVpbGRlci5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvaW5saW5lL0lubGluZVRleHRJdGVtLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9p
bmxpbmUvdGV4dC9UZXh0VXRpbC5jcHAKIGxheW91dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3Jh
dGlvbkJveFRyZWUuY3BwCiBsYXlvdXQvaW50ZWdyYXRpb24vTGF5b3V0SW50ZWdyYXRpb25Db3Zl
cmFnZS5jcHAKIGxheW91dC9pbnRlZ3JhdGlvbi9MYXlvdXRJbnRlZ3JhdGlvbklubGluZUNvbnRl
bnRCdWlsZGVyLmNwcApAQCAtMTU2MCwxMiArMTU2MCwxMiBAQCBsYXlvdXQvbGF5b3V0dHJlZS9M
YXlvdXRJbmxpbmVUZXh0Qm94LmNwcAogbGF5b3V0L2xheW91dHRyZWUvTGF5b3V0TGluZUJyZWFr
Qm94LmNwcAogbGF5b3V0L2xheW91dHRyZWUvTGF5b3V0UmVwbGFjZWRCb3guY3BwCiBsYXlvdXQv
bGF5b3V0dHJlZS9MYXlvdXRUcmVlQnVpbGRlci5jcHAKLWxheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQuY3BwCi1sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2Vv
bWV0cnkuY3BwCi1sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJs
ZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcAotbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90
YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuY3BwCi1sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuY3BwCi1sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUxheW91dC5jcHAKK2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvdGFibGUvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAKK2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvdGFibGUvVGFibGVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAor
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZS9UYWJsZUZvcm1hdHRpbmdDb250ZXh0UXVp
cmtzLmNwcAorbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZS9UYWJsZUZvcm1hdHRpbmdT
dGF0ZS5jcHAKK2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGUvVGFibGVHcmlkLmNwcAor
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZS9UYWJsZUxheW91dC5jcHAKIGxvYWRlci9Q
cml2YXRlQ2xpY2tNZWFzdXJlbWVudC5jcHAKIGxvYWRlci9BcHBsaWNhdGlvbk1hbmlmZXN0TG9h
ZGVyLmNwcAogbG9hZGVyL0NhbnZhc0FjdGl2aXR5UmVjb3JkLmNwcApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvU291cmNlL1dl
YkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IDY2ZDRmZGY1ZjM0
Nzg5NThlNzg5YzMwMzEyZTM2MzAzMmRkZTIyNDcuLjA3Yjg2YmJjNmM1NzgyMTdlOTU5MmE0MGVh
ZTIxNzRiOWMxZGI3ZjkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oKQEAgLTE4MjI3LDcgKzE4MjI3LDcgQEAKIAkJCXBhdGggPSBsYXlv
dXR0cmVlOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKIAkJfTsKLQkJMTE1Q0ZBOTkyMDhC
QzA5QTAwMUU2OTkxIC8qIGJsb2NrZm9ybWF0dGluZyAqLyA9IHsKKwkJMTE1Q0ZBOTkyMDhCQzA5
QTAwMUU2OTkxIC8qIGJsb2NrICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJl
biA9ICgKIAkJCQk2RkQ0RkUzRTI0NzBCM0FEMDA3Mzc0Q0MgLyogdGFibGV3cmFwcGVyICovLApA
QCAtMTgyNDAsMTAgKzE4MjQwLDEwIEBACiAJCQkJMTE1Q0ZBODkyMDhCOTIxQTAwMUU2OTkxIC8q
IEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwICovLAogCQkJCTZGQUUxNkJBMjQwNkRFN0UwMEE0ODQx
NCAvKiBQcmVjb21wdXRlZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwICovLAogCQkJKTsKLQkJCXBh
dGggPSBibG9ja2Zvcm1hdHRpbmc7CisJCQlwYXRoID0gYmxvY2s7CiAJCQlzb3VyY2VUcmVlID0g
Ijxncm91cD4iOwogCQl9OwotCQkxMTVDRkE5QTIwOEJDMTQwMDAxRTY5OTEgLyogaW5saW5lZm9y
bWF0dGluZyAqLyA9IHsKKwkJMTE1Q0ZBOUEyMDhCQzE0MDAwMUU2OTkxIC8qIGlubGluZSAqLyA9
IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCiAJCQkJNkZFN0REREQyMEVD
NkU4QjAwOEI1QjRFIC8qIHRleHQgKi8sCkBAIC0xODI3MCw3ICsxODI3MCw3IEBACiAJCQkJNkYx
Q0MxREMyMjVGOEI0MTAwNzIwQUQyIC8qIElubGluZVRleHRJdGVtLmNwcCAqLywKIAkJCQk2RjFD
QzFERDIyNUY4QjQyMDA3MjBBRDIgLyogSW5saW5lVGV4dEl0ZW0uaCAqLywKIAkJCSk7Ci0JCQlw
YXRoID0gaW5saW5lZm9ybWF0dGluZzsKKwkJCXBhdGggPSBpbmxpbmU7CiAJCQlzb3VyY2VUcmVl
ID0gIjxncm91cD4iOwogCQl9OwogCQkxMjIxRTA1ODFDMDJCNDA5MDA2QTFBMDAgLyogQW5pbWF0
aW9uICovID0gewpAQCAtMjI1OTcsMTAgKzIyNTk3LDEwIEBACiAJCTZGODQ0RjdGMjYzRDkxNjEw
MEY5MTM3MCAvKiBmb3JtYXR0aW5nQ29udGV4dHMgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsK
IAkJCWNoaWxkcmVuID0gKAotCQkJCTExNUNGQTk5MjA4QkMwOUEwMDFFNjk5MSAvKiBibG9ja2Zv
cm1hdHRpbmcgKi8sCi0JCQkJNkZCN0QyRDUyNTBGRDdCNTAwMDIwN0FBIC8qIGZsZXhmb3JtYXR0
aW5nICovLAotCQkJCTExNUNGQTlBMjA4QkMxNDAwMDFFNjk5MSAvKiBpbmxpbmVmb3JtYXR0aW5n
ICovLAotCQkJCTZGQzVDQTkxMjJFMzU5MzMwMEIxM0UxMSAvKiB0YWJsZWZvcm1hdHRpbmcgKi8s
CisJCQkJMTE1Q0ZBOTkyMDhCQzA5QTAwMUU2OTkxIC8qIGJsb2NrICovLAorCQkJCTZGQjdEMkQ1
MjUwRkQ3QjUwMDAyMDdBQSAvKiBmbGV4ICovLAorCQkJCTExNUNGQTlBMjA4QkMxNDAwMDFFNjk5
MSAvKiBpbmxpbmUgKi8sCisJCQkJNkZDNUNBOTEyMkUzNTkzMzAwQjEzRTExIC8qIHRhYmxlICov
LAogCQkJCTExNUNGQTY5MjA4QUY3RDAwMDFFNjk5MSAvKiBGb3JtYXR0aW5nQ29udGV4dC5jcHAg
Ki8sCiAJCQkJMTE1Q0ZBNjgyMDhBRjdEMDAwMUU2OTkxIC8qIEZvcm1hdHRpbmdDb250ZXh0Lmgg
Ki8sCiAJCQkJNkZCQjg2MDUyMEI0NjRCNjAwREFEOTM4IC8qIEZvcm1hdHRpbmdDb250ZXh0R2Vv
bWV0cnkuY3BwICovLApAQCAtMjI2MjAsNyArMjI2MjAsNyBAQAogCQkJcGF0aCA9IGludmFsaWRh
dGlvbjsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CiAJCX07Ci0JCTZGQjdEMkQ1MjUwRkQ3
QjUwMDAyMDdBQSAvKiBmbGV4Zm9ybWF0dGluZyAqLyA9IHsKKwkJNkZCN0QyRDUyNTBGRDdCNTAw
MDIwN0FBIC8qIGZsZXggKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0g
KAogCQkJCTZGQjdEMkQ3MjUwRkQ3RTUwMDAyMDdBQSAvKiBGbGV4Rm9ybWF0dGluZ0NvbnRleHQu
Y3BwICovLApAQCAtMjI2MjksMTAgKzIyNjI5LDEwIEBACiAJCQkJNkZCN0QyRDgyNTBGRDdFRjAw
MDIwN0FBIC8qIEZsZXhGb3JtYXR0aW5nU3RhdGUuY3BwICovLAogCQkJCTZGQjdEMkRBMjUwRkQ3
RkMwMDAyMDdBQSAvKiBGbGV4Rm9ybWF0dGluZ1N0YXRlLmggKi8sCiAJCQkpOwotCQkJcGF0aCA9
IGZsZXhmb3JtYXR0aW5nOworCQkJcGF0aCA9IGZsZXg7CiAJCQlzb3VyY2VUcmVlID0gIjxncm91
cD4iOwogCQl9OwotCQk2RkM1Q0E5MTIyRTM1OTMzMDBCMTNFMTEgLyogdGFibGVmb3JtYXR0aW5n
ICovID0geworCQk2RkM1Q0E5MTIyRTM1OTMzMDBCMTNFMTEgLyogdGFibGUgKi8gPSB7CiAJCQlp
c2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKAogCQkJCTZGQzVDQTk0MjJFMzU5OTQwMEIx
M0UxMSAvKiBUYWJsZUZvcm1hdHRpbmdDb250ZXh0LmNwcCAqLywKQEAgLTIyNjQ1LDcgKzIyNjQ1
LDcgQEAKIAkJCQk2RkIyMkUzMDIzMDA5N0UzMDBDMjA4NjYgLyogVGFibGVHcmlkLmggKi8sCiAJ
CQkJNkZGOUYxQkUyNDZEOTY2QzAwNDM1MDgzIC8qIFRhYmxlTGF5b3V0LmNwcCAqLywKIAkJCSk7
Ci0JCQlwYXRoID0gdGFibGVmb3JtYXR0aW5nOworCQkJcGF0aCA9IHRhYmxlOwogCQkJc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsKIAkJfTsKIAkJNkZDRkMwNTUyMTJEQUNDMjAwNzY5NUQyIC8qIGZs
b2F0cyAqLyA9IHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvYmxvY2svQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjBmNTU1ZjgxOTM4MWU3M2FmM2UxOWMwMmYzOGIwZmNmM2JkMTIwNGIK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2Jsb2NrL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCkBAIC0wLDAgKzEsNTYzIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
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
aW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJGbG9hdGluZ0NvbnRl
eHQuaCIKKyNpbmNsdWRlICJGbG9hdGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiSW52YWxpZGF0aW9u
U3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRDaGlsZEl0
ZXJhdG9yLmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCisjaW5jbHVkZSAiTGF5
b3V0Q29udGV4dC5oIgorI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIK
KyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRl
ICJUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL0lz
b01hbGxvY0lubGluZXMuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9UZXh0U3RyZWFtLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxM
T0NBVEVEX0lNUEwoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCk7CisKK0Jsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6OkJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0
aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCisg
ICAgOiBGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdT
dGF0ZSkKK3sKK30KKwordm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRJbkZsb3dD
b250ZW50KEludmFsaWRhdGlvblN0YXRlJiBpbnZhbGlkYXRpb25TdGF0ZSwgY29uc3QgQ29uc3Ry
YWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKK3sKKyAgICAvLyA5LjQuMSBCbG9j
ayBmb3JtYXR0aW5nIGNvbnRleHRzCisgICAgLy8gSW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRl
eHQsIGJveGVzIGFyZSBsYWlkIG91dCBvbmUgYWZ0ZXIgdGhlIG90aGVyLCB2ZXJ0aWNhbGx5LCBi
ZWdpbm5pbmcgYXQgdGhlIHRvcCBvZiBhIGNvbnRhaW5pbmcgYmxvY2suCisgICAgLy8gVGhlIHZl
cnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNpYmxpbmcgYm94ZXMgaXMgZGV0ZXJtaW5lZCBi
eSB0aGUgJ21hcmdpbicgcHJvcGVydGllcy4KKyAgICAvLyBWZXJ0aWNhbCBtYXJnaW5zIGJldHdl
ZW4gYWRqYWNlbnQgYmxvY2stbGV2ZWwgYm94ZXMgaW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRl
eHQgY29sbGFwc2UuCisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0
LCBzdHJlYW0gPDwgIltTdGFydF0gLT4gYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IC0+IGZvcm1h
dHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKKyAgICBhdXRvJiBmb3JtYXR0aW5nUm9v
dCA9IHJvb3QoKTsKKyAgICBBU1NFUlQoZm9ybWF0dGluZ1Jvb3QuaGFzSW5GbG93T3JGbG9hdGlu
Z0NoaWxkKCkpOworICAgIGF1dG8mIGZsb2F0aW5nU3RhdGUgPSBmb3JtYXR0aW5nU3RhdGUoKS5m
bG9hdGluZ1N0YXRlKCk7CisgICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRl
eHQgeyAqdGhpcywgZmxvYXRpbmdTdGF0ZSB9OworCisgICAgTGF5b3V0UXVldWUgbGF5b3V0UXVl
dWU7CisgICAgZW51bSBjbGFzcyBMYXlvdXREaXJlY3Rpb24geyBDaGlsZCwgU2libGluZyB9Owor
ICAgIGF1dG8gYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUgPSBbJl0gKGNvbnN0IGF1dG8mIGxheW91
dEJveCwgYXV0byBkaXJlY3Rpb24pIHsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBMYXlvdXRE
aXJlY3Rpb246OkNoaWxkKSB7CisgICAgICAgICAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5
b3V0Qm94KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBmb3Ig
KGF1dG8qIGNoaWxkID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0SW5G
bG93T3JGbG9hdGluZ0NoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0SW5GbG93T3JG
bG9hdGluZ1NpYmxpbmcoKSkgeworICAgICAgICAgICAgICAgIGlmICghaW52YWxpZGF0aW9uU3Rh
dGUubmVlZHNMYXlvdXQoKmNoaWxkKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICAgICAgbGF5b3V0UXVldWUuYXBwZW5kKGNoaWxkKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorCisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gTGF5b3V0RGlyZWN0aW9uOjpT
aWJsaW5nKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8qIG5leHRTaWJsaW5nID0gbGF5b3V0Qm94
Lm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpOyBuZXh0U2libGluZzsgbmV4dFNpYmxpbmcg
PSBuZXh0U2libGluZy0+bmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKKyAgICAgICAg
ICAgICAgICBpZiAoIWludmFsaWRhdGlvblN0YXRlLm5lZWRzTGF5b3V0KCpuZXh0U2libGluZykp
CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGxheW91dFF1
ZXVlLmFwcGVuZChuZXh0U2libGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Owor
CisgICAgYXV0byBjb25zdHJhaW50c0ZvckxheW91dEJveCA9IFsmXSAoY29uc3QgYXV0byYgbGF5
b3V0Qm94KSB7CisgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxheW91dEJveC5jb250
YWluaW5nQmxvY2soKTsKKyAgICAgICAgcmV0dXJuICZjb250YWluaW5nQmxvY2sgPT0gJmZvcm1h
dHRpbmdSb290ID8gY29uc3RyYWludHMgOiBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93
Q29udGVudChjb250YWluaW5nQmxvY2spOworICAgIH07CisKKyAgICAvLyBUaGlzIGlzIGEgcG9z
dC1vcmRlciB0cmVlIHRyYXZlcnNhbCBsYXlvdXQuCisgICAgLy8gVGhlIHJvb3QgY29udGFpbmVy
IGxheW91dCBpcyBkb25lIGluIHRoZSBmb3JtYXR0aW5nIGNvbnRleHQgaXQgbGl2ZXMgaW4sIG5v
dCB0aGF0IG9uZSBpdCBjcmVhdGVzLCBzbyBsZXQncyBzdGFydCB3aXRoIHRoZSBmaXJzdCBjaGls
ZC4KKyAgICBhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShmb3JtYXR0aW5nUm9vdCwgTGF5b3V0RGly
ZWN0aW9uOjpDaGlsZCk7CisgICAgLy8gMS4gR28gYWxsIHRoZSB3YXkgZG93biB0byB0aGUgbGVh
ZiBub2RlCisgICAgLy8gMi4gQ29tcHV0ZSBzdGF0aWMgcG9zaXRpb24gYW5kIHdpZHRoIGFzIHdl
IHRyYXZlcnNlIGRvd24KKyAgICAvLyAzLiBBcyB3ZSBjbGltYiBiYWNrIG9uIHRoZSB0cmVlLCBj
b21wdXRlIGhlaWdodCBhbmQgZmluaWFsaXplIHBvc2l0aW9uCisgICAgLy8gKEFueSBzdWJ0cmVl
cyB3aXRoIG5ldyBmb3JtYXR0aW5nIGNvbnRleHRzIG5lZWQgdG8gbGF5b3V0IHN5bmNocm9ub3Vz
bHkpCisgICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gVHJh
dmVyc2UgZG93biBvbiB0aGUgZGVzY2VuZGFudHMgYW5kIGNvbXB1dGUgd2lkdGgvc3RhdGljIHBv
c2l0aW9uIHVudGlsIHdlIGZpbmQgYSBsZWFmIG5vZGUuCisgICAgICAgIHdoaWxlICh0cnVlKSB7
CisgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSAqbGF5b3V0UXVldWUubGFzdCgpOworICAg
ICAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzRm9y
TGF5b3V0Qm94KGxheW91dEJveCk7CisKKyAgICAgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRk
aW5nKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9yaXpvbnRhbCk7Cisg
ICAgICAgICAgICBjb21wdXRlU3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIGNvbnRh
aW5pbmdCbG9ja0NvbnN0cmFpbnRzLnZlcnRpY2FsKTsKKyAgICAgICAgICAgIGNvbXB1dGVXaWR0
aEFuZE1hcmdpbihmbG9hdGluZ0NvbnRleHQsIGxheW91dEJveCwgeyBjb25zdHJhaW50cywgY29u
dGFpbmluZ0Jsb2NrQ29uc3RyYWludHMgfSk7CisgICAgICAgICAgICBjb21wdXRlU3RhdGljSG9y
aXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9y
aXpvbnRhbCk7CisgICAgICAgICAgICBjb21wdXRlUG9zaXRpb25Ub0F2b2lkRmxvYXRzKGZsb2F0
aW5nQ29udGV4dCwgbGF5b3V0Qm94LCB7IGNvbnN0cmFpbnRzLCBjb250YWluaW5nQmxvY2tDb25z
dHJhaW50cyB9KTsKKworICAgICAgICAgICAgaWYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1h
dHRpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXM8Q29udGFpbmVyQm94Pihs
YXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dP
ckZsb2F0aW5nQ2hpbGQoKSkgeworICAgICAgICAgICAgICAgICAgICBhdXRvJiBjb250YWluZXJC
b3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7CisgICAgICAgICAgICAgICAg
ICAgIGlmIChjb250YWluZXJCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgp
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJRkNzIGluaGVyaXQgZmxvYXRzIGZyb20g
cGFyZW50IEZDcy4gV2UgbmVlZCBmaW5hbCB2ZXJ0aWNhbCBwb3NpdGlvbiB0byBmaW5kIGludHJ1
ZGluZyBmbG9hdHMuCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb21wdXRlVmVydGljYWxQ
b3NpdGlvbkZvckJveEFuZEFuY2VzdG9ycyhjb250YWluZXJCb3gsIHsgY29uc3RyYWludHMsIGNv
bnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIC8vIExheW91dCB0aGUgaW5mbG93IGRlc2NlbmRhbnRzIG9mIHRoaXMg
Zm9ybWF0dGluZyBjb250ZXh0IHJvb3QuCisgICAgICAgICAgICAgICAgICAgIGF1dG8gZm9ybWF0
dGluZ0NvbnRleHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjb250
YWluZXJCb3gsIGxheW91dFN0YXRlKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFp
bmVyQm94LmlzVGFibGVXcmFwcGVyQm94KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBkb3du
Y2FzdDxUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0PigqZm9ybWF0dGluZ0NvbnRl
eHQpLnNldEhvcml6b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxvYXRzKGNvbnRhaW5pbmdCbG9j
a0NvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5n
Q29udGV4dC0+bGF5b3V0SW5GbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnko
KS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgaWYgKCFhcHBlbmROZXh0VG9MYXlvdXRRdWV1ZShsYXlvdXRCb3gsIExheW91dERpcmVjdGlv
bjo6Q2hpbGQpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gQ2xpbWIgYmFjayBvbiB0aGUgYW5jZXN0b3JzIGFuZCBjb21wdXRlIGhlaWdodC9maW5hbCBw
b3NpdGlvbi4KKyAgICAgICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgICAgIGF1dG8mIGxheW91dEJveCA9ICpsYXlvdXRRdWV1ZS50YWtlTGFzdCgpOworICAgICAg
ICAgICAgYXV0byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzRm9yTGF5
b3V0Qm94KGxheW91dEJveCk7CisKKyAgICAgICAgICAgIC8vIEFsbCBpbmZsb3cgZGVzY2VuZGFu
dHMgKGlmIHRoZXJlIGFyZSBhbnkpIGFyZSBsYWlkIG91dCBieSBub3cuIExldCdzIGNvbXB1dGUg
dGhlIGJveCdzIGhlaWdodCBhbmQgdmVydGljYWwgbWFyZ2luLgorICAgICAgICAgICAgY29tcHV0
ZUhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzKTsK
KyAgICAgICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAg
ICAgICAgICAgICBmbG9hdGluZ1N0YXRlLmFwcGVuZChmbG9hdGluZ0NvbnRleHQudG9GbG9hdEl0
ZW0obGF5b3V0Qm94KSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBB
ZGp1c3QgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG5vdyB0aGF0IHdlJ3ZlIGdvdCBmaW5hbCBtYXJn
aW4gdmFsdWVzIGZvciBub24tZmxvYXQgYXZvaWRlciBib3hlcy4KKyAgICAgICAgICAgICAgICAv
LyBGbG9hdCBhdm9pZGVycyBoYXZlIHByZS1jb21wdXRlZCB2ZXJ0aWNhbCBwb3NpdGlvbnMgd2hl
biBmbG9hdHMgYXJlIHByZXNlbnQuCisgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCb3guaXNG
bG9hdEF2b2lkZXIoKSB8fCBmbG9hdGluZ0NvbnRleHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAg
ICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1hdHRpbmdTdGF0ZSgp
OworICAgICAgICAgICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0
ZS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOworICAgICAgICAgICAgICAgICAgICBib3hHZW9tZXRy
eS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGxheW91dEJveCwgZm9y
bWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpLCBjb250YWluaW5nQmxv
Y2tDb25zdHJhaW50cy52ZXJ0aWNhbCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGF1dG8gZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCA9IGxheW91
dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCk7IAorICAgICAgICAgICAgaWYgKGVz
dGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3cgdGhh
dCB3ZSBjb21wdXRlZCB0aGUgYm94J3MgaGVpZ2h0LCB3ZSBjYW4gbGF5b3V0IHRoZSBvdXQtb2Yt
ZmxvdyBkZXNjZW5kYW50cy4KKyAgICAgICAgICAgICAgICBpZiAoaXM8Q29udGFpbmVyQm94Pihs
YXlvdXRCb3gpICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNDaGlsZCgp
KSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5lckJveCA9IGRvd25jYXN0PENv
bnRhaW5lckJveD4obGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0Q29udGV4
dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmVyQm94LCBsYXlvdXRTdGF0ZSgpKS0+
bGF5b3V0T3V0T2ZGbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5jb25z
dHJhaW50c0Zvck91dE9mRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFlc3RhYmxpc2hlc0Zvcm1hdHRp
bmdDb250ZXh0ICYmIGlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkKKyAgICAgICAgICAgICAg
ICBwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihkb3duY2FzdDxDb250YWluZXJCb3g+KGxh
eW91dEJveCksIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmhvcml6b250YWwpOworCisgICAg
ICAgICAgICBpZiAoYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUobGF5b3V0Qm94LCBMYXlvdXREaXJl
Y3Rpb246OlNpYmxpbmcpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
fQorICAgIC8vIFBsYWNlIHRoZSBpbmZsb3cgcG9zaXRpb25lZCBjaGlsZHJlbi4KKyAgICBwbGFj
ZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWludHMuaG9y
aXpvbnRhbCk7CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBz
dHJlYW0gPDwgIltFbmRdIC0+IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCAtPiBmb3JtYXR0aW5n
IHJvb3QoIiA8PCAmcm9vdCgpIDw8ICIpIik7Cit9CisKK0xheW91dFVuaXQgQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdAoreworICAgIC8vIDEwLjYuNyAn
QXV0bycgaGVpZ2h0cyBmb3IgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHJvb3RzCisKKyAgICAv
LyBJZiBpdCBoYXMgYmxvY2stbGV2ZWwgY2hpbGRyZW4sIHRoZSBoZWlnaHQgaXMgdGhlIGRpc3Rh
bmNlIGJldHdlZW4gdGhlIHRvcCBtYXJnaW4tZWRnZSBvZiB0aGUgdG9wbW9zdCBibG9jay1sZXZl
bAorICAgIC8vIGNoaWxkIGJveCBhbmQgdGhlIGJvdHRvbSBtYXJnaW4tZWRnZSBvZiB0aGUgYm90
dG9tbW9zdCBibG9jay1sZXZlbCBjaGlsZCBib3guCisKKyAgICAvLyBJbiBhZGRpdGlvbiwgaWYg
dGhlIGVsZW1lbnQgaGFzIGFueSBmbG9hdGluZyBkZXNjZW5kYW50cyB3aG9zZSBib3R0b20gbWFy
Z2luIGVkZ2UgaXMgYmVsb3cgdGhlIGVsZW1lbnQncyBib3R0b20gY29udGVudCBlZGdlLAorICAg
IC8vIHRoZW4gdGhlIGhlaWdodCBpcyBpbmNyZWFzZWQgdG8gaW5jbHVkZSB0aG9zZSBlZGdlcy4g
T25seSBmbG9hdHMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiB0aGlzIGJsb2NrIGZvcm1hdHRpbmcgY29u
dGV4dCBhcmUgdGFrZW4KKyAgICAvLyBpbnRvIGFjY291bnQsIGUuZy4sIGZsb2F0cyBpbnNpZGUg
YWJzb2x1dGVseSBwb3NpdGlvbmVkIGRlc2NlbmRhbnRzIG9yIG90aGVyIGZsb2F0cyBhcmUgbm90
LgorICAgIGF1dG8gdG9wID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OworICAgIGF1dG8gYm90
dG9tID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OworICAgIGlmIChyb290KCkuaGFzSW5GbG93
Q2hpbGQoKSkgeworICAgICAgICB0b3AgPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9t
ZXRyeUZvckJveCgqcm9vdCgpLmZpcnN0SW5GbG93Q2hpbGQoKSkpLnRvcCgpOworICAgICAgICBi
b3R0b20gPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9tZXRyeUZvckJveCgqcm9vdCgp
Lmxhc3RJbkZsb3dDaGlsZCgpKSkuYm90dG9tKCk7CisgICAgfQorCisgICAgYXV0byBmbG9hdGlu
Z0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhpcywgZm9ybWF0dGluZ1N0YXRlKCkuZmxv
YXRpbmdTdGF0ZSgpIH07CisgICAgaWYgKGF1dG8gZmxvYXRUb3AgPSBmbG9hdGluZ0NvbnRleHQu
dG9wKCkpIHsKKyAgICAgICAgdG9wID0gc3RkOjptaW4oKmZsb2F0VG9wLCB0b3AudmFsdWVPcigq
ZmxvYXRUb3ApKTsKKyAgICAgICAgYXV0byBmbG9hdEJvdHRvbSA9ICpmbG9hdGluZ0NvbnRleHQu
Ym90dG9tKCk7CisgICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4KGZsb2F0Qm90dG9tLCBib3R0b20u
dmFsdWVPcihmbG9hdEJvdHRvbSkpOworICAgIH0KKyAgICByZXR1cm4gKmJvdHRvbSAtICp0b3A7
Cit9CisKK09wdGlvbmFsPExheW91dFVuaXQ+IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OnVzZWRB
dmFpbGFibGVXaWR0aEZvckZsb2F0QXZvaWRlcihjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0
aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYg
Y29uc3RyYWludHNQYWlyKQoreworICAgIC8vIE5vcm1hbGx5IHRoZSBhdmFpbGFibGUgd2lkdGgg
Zm9yIGFuIGluLWZsb3cgYmxvY2sgbGV2ZWwgYm94IGlzIHRoZSB3aWR0aCBvZiB0aGUgY29udGFp
bmluZyBibG9jaydzIGNvbnRlbnQgYm94LgorICAgIC8vIEhvd2V2ZXIgKGFuZCBjYW4ndCBmaW5k
IGl0IGFueXdoZXJlIGluIHRoZSBzcGVjKSBub24tZmxvYXRpbmcgcG9zaXRpb25lZCBmbG9hdCBh
dm9pZGVyIGJsb2NrIGxldmVsIGJveGVzIGFyZSBjb25zdHJhaW5lZCBieSBleGlzdGluZyBmbG9h
dHMuCisgICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpKTsKKyAgICBpZiAoZmxv
YXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAvLyBGbG9h
dCBjbGVhciBwdXNoZXMgdGhlIGJsb2NrIGxldmVsIGJveCBlaXRoZXIgYmVsb3cgdGhlIGZsb2F0
cywgb3IganVzdCBvbmUgc2lkZSBiZWxvdyBidXQgdGhlIG90aGVyIHNpZGUgY291bGQgb3Zlcmxh
cC4KKyAgICAvLyBXaGF0IGl0IG1lYW5zIGlzIHRoYXQgdGhlIHVzZWQgYXZhaWxhYmxlIHdpZHRo
IGFsd2F5cyBtYXRjaGVzIHRoZSBjb250YWluaW5nIGJsb2NrJ3MgY29uc3RyYWludC4KKyAgICBp
ZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKKyAgICAgICAgcmV0dXJuIHsgfTsKKworICAg
IEFTU0VSVChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKKyAgICAv
LyBWZXJ0aWNhbCBzdGF0aWMgcG9zaXRpb24gaXMgbm90IGNvbXB1dGVkIHlldCBmb3IgdGhpcyBm
b3JtYXR0aW5nIGNvbnRleHQgcm9vdCwgc28gbGV0J3MganVzdCBwcmUtY29tcHV0ZSBpdCBmb3Ig
bm93LgorICAgIHByZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGxh
eW91dEJveCwgY29uc3RyYWludHNQYWlyKTsKKworICAgIGF1dG8gbG9naWNhbFRvcEluRm9ybWF0
dGluZ0NvbnRleHRSb290Q29vcmRpbmF0ZSA9IFsmXSAoYXV0byYgZmxvYXRBdm9pZGVyKSB7Cisg
ICAgICAgIGF1dG8gdG9wID0gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChnZW9tZXRyeUZvckJv
eChmbG9hdEF2b2lkZXIpKTsKKyAgICAgICAgZm9yIChhdXRvKiBhbmNlc3RvciA9ICZmbG9hdEF2
b2lkZXIuY29udGFpbmluZ0Jsb2NrKCk7IGFuY2VzdG9yICE9ICZyb290KCk7IGFuY2VzdG9yID0g
JmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkKKyAgICAgICAgICAgIHRvcCArPSBCb3hHZW9t
ZXRyeTo6Ym9yZGVyQm94VG9wKGdlb21ldHJ5Rm9yQm94KCphbmNlc3RvcikpOworICAgICAgICBy
ZXR1cm4gdG9wOworICAgIH07CisKKyAgICBhdXRvIGZsb2F0Q29uc3RyYWludHNJbkNvbnRhaW5p
bmdCbG9ja0Nvb3JkaW5hdGUgPSBbJl0gKGF1dG8gZmxvYXRDb25zdHJhaW50cykgeworICAgICAg
ICBpZiAoIWZsb2F0Q29uc3RyYWludHMubGVmdCAmJiAhZmxvYXRDb25zdHJhaW50cy5yaWdodCkK
KyAgICAgICAgICAgIHJldHVybiBGbG9hdGluZ0NvbnRleHQ6OkNvbnN0cmFpbnRzIHsgfTsKKyAg
ICAgICAgYXV0byBvZmZzZXQgPSBMYXlvdXRTaXplIHsgfTsKKyAgICAgICAgZm9yIChhdXRvKiBh
bmNlc3RvciA9ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7IGFuY2VzdG9yICE9ICZyb290
KCk7IGFuY2VzdG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkKKyAgICAgICAgICAg
IG9mZnNldCArPSB0b0xheW91dFNpemUoQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcExlZnQoZ2Vv
bWV0cnlGb3JCb3goKmFuY2VzdG9yKSkpOworICAgICAgICBpZiAoZmxvYXRDb25zdHJhaW50cy5s
ZWZ0KQorICAgICAgICAgICAgZmxvYXRDb25zdHJhaW50cy5sZWZ0ID0gUG9pbnRJbkNvbnRleHRS
b290IHsgKmZsb2F0Q29uc3RyYWludHMubGVmdCAtIG9mZnNldCB9OworICAgICAgICBpZiAoZmxv
YXRDb25zdHJhaW50cy5yaWdodCkKKyAgICAgICAgICAgIGZsb2F0Q29uc3RyYWludHMucmlnaHQg
PSBQb2ludEluQ29udGV4dFJvb3QgeyAqZmxvYXRDb25zdHJhaW50cy5yaWdodCAtIG9mZnNldCB9
OworICAgICAgICByZXR1cm4gZmxvYXRDb25zdHJhaW50czsKKyAgICB9OworCisgICAgLy8gRklY
TUU6IENoZWNrIGlmIHRoZSBub24teWV0LWNvbXB1dGVkIGhlaWdodCBhZmZlY3RzIHRoaXMgY29t
cHV0YXRpb24gLSBhbmQgd2hldGhlciB3ZSBoYXZlIHRvIHJlc29sdmUgaXQgYXQgYSBsYXRlciBw
b2ludC4KKyAgICBhdXRvIGxvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wSW5Gb3JtYXR0aW5nQ29udGV4
dFJvb3RDb29yZGluYXRlKGxheW91dEJveCk7CisgICAgYXV0byBjb25zdHJhaW50cyA9IGZsb2F0
Q29uc3RyYWludHNJbkNvbnRhaW5pbmdCbG9ja0Nvb3JkaW5hdGUoZmxvYXRpbmdDb250ZXh0LmNv
bnN0cmFpbnRzKGxvZ2ljYWxUb3AsIGxvZ2ljYWxUb3ApKTsKKyAgICBpZiAoIWNvbnN0cmFpbnRz
LmxlZnQgJiYgIWNvbnN0cmFpbnRzLnJpZ2h0KQorICAgICAgICByZXR1cm4geyB9OworICAgIC8v
IFNocmluayB0aGUgYXZhaWxhYmxlIHNwYWNlIGlmIHRoZSBmbG9hdHMgYXJlIGFjdHVhbGx5IGlu
dHJ1ZGluZyBhdCB0aGlzIHZlcnRpY2FsIHBvc2l0aW9uLgorICAgIGF1dG8gYXZhaWxhYmxlV2lk
dGggPSBjb25zdHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250YWwubG9naWNhbFdp
ZHRoOworICAgIGlmIChjb25zdHJhaW50cy5sZWZ0KQorICAgICAgICBhdmFpbGFibGVXaWR0aCAt
PSBjb25zdHJhaW50cy5sZWZ0LT54OworICAgIGlmIChjb25zdHJhaW50cy5yaWdodCkKKyAgICAg
ICAgYXZhaWxhYmxlV2lkdGggLT0gc3RkOjptYXgoMF9sdSwgY29uc3RyYWludHNQYWlyLmNvbnRh
aW5pbmdCbG9jay5ob3Jpem9udGFsLmxvZ2ljYWxSaWdodCgpIC0gY29uc3RyYWludHMucmlnaHQt
PngpOworICAgIHJldHVybiBhdmFpbGFibGVXaWR0aDsKK30KKwordm9pZCBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0OjpwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihjb25zdCBDb250YWluZXJC
b3gmIGNvbnRhaW5lckJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFs
Q29uc3RyYWludHMpCit7CisgICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5
b3V0LCBzdHJlYW0gPDwgIlN0YXJ0OiBtb3ZlIGluLWZsb3cgcG9zaXRpb25lZCBjaGlsZHJlbiAt
PiBwYXJlbnQ6ICIgPDwgJmNvbnRhaW5lckJveCk7CisgICAgZm9yIChhdXRvJiBjaGlsZEJveCA6
IGNoaWxkcmVuT2ZUeXBlPEJveD4oY29udGFpbmVyQm94KSkgeworICAgICAgICBpZiAoIWNoaWxk
Qm94LmlzSW5GbG93UG9zaXRpb25lZCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IGF1dG8gcG9zaXRpb25PZmZzZXQgPSBnZW9tZXRyeSgpLmluRmxvd1Bvc2l0aW9uZWRQb3NpdGlv
bk9mZnNldChjaGlsZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICAgICAgZm9ybWF0
dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoY2hpbGRCb3gpLm1vdmUocG9zaXRpb25PZmZzZXQpOwor
ICAgIH0KKyAgICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVh
bSA8PCAiRW5kOiBtb3ZlIGluLWZsb3cgcG9zaXRpb25lZCBjaGlsZHJlbiAtPiBwYXJlbnQ6ICIg
PDwgJmNvbnRhaW5lckJveCk7Cit9CisKK3ZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29t
cHV0ZVN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IFZl
cnRpY2FsQ29uc3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpCit7CisgICAgZm9ybWF0dGlu
Z1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRMb2dpY2FsVG9wKGdlb21ldHJ5KCku
c3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIHZlcnRpY2FsQ29uc3RyYWludHMpKTsK
K30KKwordm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlU3RhdGljSG9yaXpvbnRh
bFBvc2l0aW9uKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmIGhvcml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hH
ZW9tZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxMZWZ0KGdlb21ldHJ5KCkuc3RhdGljSG9yaXpv
bnRhbFBvc2l0aW9uKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSk7Cit9CisKK3Zv
aWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6cHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JC
b3hBbmRBbmNlc3RvcnMoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzUGFp
ciYgY29uc3RyYWludHNQYWlyKQoreworICAgIC8vIEluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgd2hl
dGhlciBhIGJveCBzaG91bGQgYXZvaWQgYSBmbG9hdCwgd2UgbmVlZCB0byBrbm93IHRoZSBmaW5h
bCBwb3NpdGlvbnMgb2YgYm90aCAoaWdub3JlIHJlbGF0aXZlIHBvc2l0aW9uaW5nIGZvciBub3cp
LgorICAgIC8vIEluIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCB0aGUgZmluYWwgcG9zaXRpb24g
Zm9yIGEgbm9ybWFsIGZsb3cgYm94IGluY2x1ZGVzCisgICAgLy8gMS4gdGhlIHN0YXRpYyBwb3Np
dGlvbiBhbmQKKyAgICAvLyAyLiB0aGUgY29ycmVzcG9uZGluZyAobm9uKWNvbGxhcHNlZCBtYXJn
aW5zLgorICAgIC8vIE5vdyB0aGUgdmVydGljYWwgbWFyZ2lucyBhcmUgY29tcHV0ZWQgd2hlbiBh
bGwgdGhlIGRlc2NlbmRhbnRzIGFyZSBmaW5hbGl6ZWQsIGJlY2F1c2UgdGhlIG1hcmdpbiB2YWx1
ZXMgbWlnaHQgYmUgZGVwZW5kaW5nIG9uIHRoZSBoZWlnaHQgb2YgdGhlIGJveAorICAgIC8vIChh
bmQgdGhlIGhlaWdodCBtaWdodCBiZSBiYXNlZCBvbiB0aGUgY29udGVudCkuCisgICAgLy8gU28g
d2hlbiB3ZSBnZXQgdG8gdGhlIHBvaW50IHdoZXJlIHdlIGludGVyc2VjdCB0aGUgYm94IHdpdGgg
dGhlIGZsb2F0IHRvIGRlY2lkZSBpZiB0aGUgYm94IG5lZWRzIHRvIG1vdmUsIHdlIGRvbid0IHll
dCBoYXZlIHRoZSBmaW5hbCB2ZXJ0aWNhbCBwb3NpdGlvbi4KKyAgICAvLworICAgIC8vIFRoZSBp
ZGVhIGhlcmUgaXMgdGhhdCBhcyBsb25nIGFzIHdlIGRvbid0IGNyb3NzIHRoZSBibG9jayBmb3Jt
YXR0aW5nIGNvbnRleHQgYm91bmRhcnksIHdlIHNob3VsZCBiZSBhYmxlIHRvIHByZS1jb21wdXRl
IHRoZSBmaW5hbCB0b3AgcG9zaXRpb24uCisgICAgLy8gRklYTUU6IHdlIGN1cnJlbnRseSBkb24n
dCBhY2NvdW50IGZvciB0aGUgImNsZWFyIiBwcm9wZXJ0eSB3aGVuIGNvbXB1dGluZyB0aGUgZmlu
YWwgcG9zaXRpb24gZm9yIGFuIGFuY2VzdG9yLgorICAgIGZvciAoYXV0byogYW5jZXN0b3IgPSAm
bGF5b3V0Qm94OyBhbmNlc3RvciAmJiBhbmNlc3RvciAhPSAmcm9vdCgpOyBhbmNlc3RvciA9ICZh
bmNlc3Rvci0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKKyAgICAgICAgYXV0byBjb25zdHJhaW50c0Zv
ckFuY2VzdG9yID0gWyZdIHsKKyAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGFu
Y2VzdG9yLT5jb250YWluaW5nQmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybiAmY29udGFpbmlu
Z0Jsb2NrID09ICZyb290KCkgPyBjb25zdHJhaW50c1BhaXIuZm9ybWF0dGluZ0NvbnRleHRSb290
IDogZ2VvbWV0cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29udGFpbmluZ0Jsb2Nr
KTsKKyAgICAgICAgfSgpOworCisgICAgICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9
IGdlb21ldHJ5KCkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbigqYW5jZXN0b3IsIGNvbnN0cmFpbnRz
Rm9yQW5jZXN0b3IuaG9yaXpvbnRhbCk7CisgICAgICAgIGF1dG8gdXNlZE5vbkNvbGxhcHNlZE1h
cmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIHsgY29tcHV0ZWRW
ZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5h
ZnRlci52YWx1ZU9yKDApIH07CisgICAgICAgIGF1dG8gcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUg
PSBtYXJnaW5Db2xsYXBzZSgpLnByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKCphbmNlc3RvciwgdXNl
ZE5vbkNvbGxhcHNlZE1hcmdpbik7CisKKyAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3Jt
YXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeSgqYW5jZXN0b3IpOworICAgICAgICBhdXRvIG5vbkNv
bGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIHsg
cHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUubm9uQ29sbGFwc2VkVmFsdWUsIHsgfSB9OworICAgICAg
ICBhdXRvIGNvbGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Q29sbGFwc2VkVmFs
dWVzIHsgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUuY29sbGFwc2VkVmFsdWUsIHsgfSwgZmFsc2Ug
fTsKKyAgICAgICAgYXV0byB2ZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbiB7IG5v
bkNvbGxhcHNlZFZhbHVlcywgY29sbGFwc2VkVmFsdWVzLCB7IHByZWNvbXB1dGVkTWFyZ2luQmVm
b3JlLnBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW5CZWZvcmUsIHsgfSB9IH07CisKKyAgICAgICAg
Zm9ybWF0dGluZ1N0YXRlKCkuc2V0VXNlZFZlcnRpY2FsTWFyZ2luKCphbmNlc3RvciwgdmVydGlj
YWxNYXJnaW4pOworICAgICAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdp
bkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsK
KyAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcCh2ZXJ0aWNhbFBvc2l0aW9uV2l0aE1h
cmdpbigqYW5jZXN0b3IsIHZlcnRpY2FsTWFyZ2luLCBjb25zdHJhaW50c0ZvckFuY2VzdG9yLnZl
cnRpY2FsKSk7CisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICAgICAgc2V0UHJlY29tcHV0ZWRNYXJn
aW5CZWZvcmUoKmFuY2VzdG9yLCBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZSk7CisgICAgICAgIGJv
eEdlb21ldHJ5LnNldEhhc1ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKCk7CisjZW5kaWYKKyAgICB9
Cit9CisKK3ZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZVBvc2l0aW9uVG9Bdm9p
ZEZsb2F0cyhjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94
JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQorewor
ICAgIGlmICghbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkpCisgICAgICAgIHJldHVybjsKKyAg
ICAvLyBJbiBvcmRlciB0byBwb3NpdGlvbiBhIGZsb2F0IGF2b2lkZXIgd2UgbmVlZCB0byBrbm93
IGl0cyB2ZXJ0aWNhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byBpdHMgZm9ybWF0dGluZyBjb250ZXh0
IHJvb3QgKGFuZCBub3QganVzdCBpdHMgY29udGFpbmluZyBibG9jayksCisgICAgLy8gYmVjYXVz
ZSBhbGwgdGhlIGFscmVhZHktcGxhY2VkIGZsb2F0cyAoZmxvYXRzIHRoYXQgd2UgYXJlIHRyeWlu
ZyB0byBhdm9pZCBoZXJlKSBpbiB0aGlzIEJGQyBtaWdodCBiZWxvbmcKKyAgICAvLyB0byBhIGRp
ZmZlcmVudCBzZXQgb2YgY29udGFpbmluZyBibG9ja3MgKGJ1dCB0aGV5IGFsbCBkZXNjZW5kYW50
cyBvZiB0aGUgQkZDIHJvb3QpLgorICAgIC8vIEhvd2V2ZXIgYWNjb3JkaW5nIHRvIHRoZSBCRkMg
cnVsZXMsIGF0IHRoaXMgcG9pbnQgb2YgdGhlIGxheW91dCBmbG93IHdlIGRvbid0IHlldCBoYXZl
IGNvbXB1dGVkIHZlcnRpY2FsIHBvc2l0aW9ucyBmb3IgdGhlIGFuY2VzdG9ycy4KKyAgICBpZiAo
bGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgcHJlY29tcHV0ZVZl
cnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMobGF5b3V0Qm94LCBjb25zdHJhaW50c1Bh
aXIpOworICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpLnNl
dExvZ2ljYWxUb3BMZWZ0KGZsb2F0aW5nQ29udGV4dC5wb3NpdGlvbkZvckZsb2F0KGxheW91dEJv
eCwgY29uc3RyYWludHNQYWlyLmNvbnRhaW5pbmdCbG9jay5ob3Jpem9udGFsKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgLy8gTm9uLWZsb2F0IHBvc2l0aW9uZWQgZmxvYXQgYXZvaWRl
cnMgKGZvcm1hdHRpbmcgY29udGV4dCByb290cyBhbmQgY2xlYXIgYm94ZXMpIHNob3VsZCBiZSBm
aW5lIHVubGVzcyB0aGVyZSBhcmUgZmxvYXRzIGluIHRoaXMgY29udGV4dC4KKyAgICBpZiAoZmxv
YXRpbmdDb250ZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHByZWNvbXB1dGVW
ZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGxheW91dEJveCwgY29uc3RyYWludHNQ
YWlyKTsKKyAgICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKKyAgICAgICAgcmV0dXJu
IGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihmbG9hdGluZ0NvbnRleHQsIGxh
eW91dEJveCk7CisKKyAgICBBU1NFUlQobGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0Nv
bnRleHQoKSk7CisgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KS5z
ZXRMb2dpY2FsVG9wTGVmdChmbG9hdGluZ0NvbnRleHQucG9zaXRpb25Gb3JOb25GbG9hdGluZ0Zs
b2F0QXZvaWRlcihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzUGFpci5jb250YWluaW5nQmxvY2suaG9y
aXpvbnRhbCkpOworfQorCit2b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVWZXJ0
aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0aW5n
Q29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgQVNTRVJUKGxheW91dEJveC5o
YXNGbG9hdENsZWFyKCkpOworICAgIGlmIChmbG9hdGluZ0NvbnRleHQuaXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm47CisgICAgYXV0byB2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJhbmNlID0gZmxv
YXRpbmdDb250ZXh0LnZlcnRpY2FsUG9zaXRpb25XaXRoQ2xlYXJhbmNlKGxheW91dEJveCk7Cisg
ICAgaWYgKCF2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJhbmNlKQorICAgICAgICByZXR1cm47CisK
KyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxh
eW91dEJveCk7CisgICAgQVNTRVJUKHZlcnRpY2FsUG9zaXRpb25BbmRDbGVhcmFuY2UtPnBvc2l0
aW9uID49IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hUb3AoYm94R2VvbWV0cnkpKTsKKyAgICBib3hH
ZW9tZXRyeS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25BbmRDbGVhcmFuY2UtPnBvc2l0
aW9uKTsKKyAgICBpZiAodmVydGljYWxQb3NpdGlvbkFuZENsZWFyYW5jZS0+Y2xlYXJhbmNlKQor
ICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRIYXNDbGVhcmFuY2UobGF5b3V0Qm94KTsKKyAg
ICAvLyBGSVhNRTogUmVzZXQgdGhlIG1hcmdpbiB2YWx1ZXMgb24gdGhlIGFuY2VzdG9ycy9wcmV2
aW91cyBzaWJsaW5ncyBub3cgdGhhdCB0aGUgZmxvYXQgYXZvaWRlciB3aXRoIGNsZWFyYW5jZSBk
b2VzIG5vdCBtYXJnaW4gY29sbGFwc2UgYW55bW9yZS4KK30KKwordm9pZCBCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0Ojpjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3QgRmxvYXRpbmdDb250ZXh0JiBm
bG9hdGluZ0NvbnRleHQsIGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBDb25zdHJhaW50c1Bh
aXImIGNvbnN0cmFpbnRzUGFpcikKK3sKKyAgICBhdXRvIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9p
ZGVyID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OworICAgIGlmIChsYXlvdXRCb3guaXNGbG9h
dEF2b2lkZXIoKSkgeworICAgICAgICAvLyBGbG9hdCBhdm9pZGVycycgYXZhaWxhYmxlIHdpZHRo
IG1pZ2h0IGJlIHNocnVuayBieSBleGlzdGluZyBmbG9hdHMgaW4gdGhlIGNvbnRleHQuCisgICAg
ICAgIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyID0gdXNlZEF2YWlsYWJsZVdpZHRoRm9yRmxv
YXRBdm9pZGVyKGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCBjb25zdHJhaW50c1BhaXIpOwor
ICAgIH0KKyAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGdlb21ldHJ5KCkuY29tcHV0
ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBjb25zdHJhaW50c1BhaXIuY29udGFp
bmluZ0Jsb2NrLmhvcml6b250YWwsIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyKTsKKyAgICBh
dXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJv
eCk7CisgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGNvbnRlbnRXaWR0aEFuZE1h
cmdpbi5jb250ZW50V2lkdGgpOworICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4o
eyBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCwgY29udGVudFdpZHRoQW5k
TWFyZ2luLnVzZWRNYXJnaW4uZW5kIH0pOworfQorCit2b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6OmNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENv
bnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCit7CisgICAgYXV0byBjb21w
dXRlID0gWyZdKE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRIZWlnaHQpIC0+IENvbnRlbnRIZWln
aHRBbmRNYXJnaW4geworICAgICAgICBpZiAobGF5b3V0Qm94LmlzSW5GbG93KCkpCisgICAgICAg
ICAgICByZXR1cm4gZ2VvbWV0cnkoKS5pbkZsb3dDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGxheW91
dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCwgeyB1c2VkSGVpZ2h0IH0pOworCisgICAgICAg
IGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVy
biBnZW9tZXRyeSgpLmZsb2F0aW5nQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGNv
bnN0cmFpbnRzLmhvcml6b250YWwsIHsgdXNlZEhlaWdodCB9KTsKKworICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICB9OworCisgICAgYXV0byBj
b250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZSh7IH0pOworICAgIGlmIChhdXRvIG1heEhl
aWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQobGF5b3V0Qm94KSkgeworICAgICAg
ICBpZiAoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID4gKm1heEhlaWdodCkg
eworICAgICAgICAgICAgYXV0byBtYXhIZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRlKG1heEhlaWdo
dCk7CisgICAgICAgICAgICAvLyBVc2VkIGhlaWdodCBzaG91bGQgcmVtYWluIHRoZSBzYW1lLgor
ICAgICAgICAgICAgQVNTRVJUKChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpICYmIChsYXlv
dXRCb3guaXNCb2R5Qm94KCkgfHwgbGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSkpIHx8IG1heEhl
aWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID09ICptYXhIZWlnaHQpOworICAgICAgICAgICAg
Y29udGVudEhlaWdodEFuZE1hcmdpbiA9IHsgKm1heEhlaWdodCwgbWF4SGVpZ2h0QW5kTWFyZ2lu
Lm5vbkNvbGxhcHNlZE1hcmdpbiB9OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF1dG8g
bWluSGVpZ2h0ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbkhlaWdodChsYXlvdXRCb3gpKSB7Cisg
ICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPCAqbWluSGVp
Z2h0KSB7CisgICAgICAgICAgICBhdXRvIG1pbkhlaWdodEFuZE1hcmdpbiA9IGNvbXB1dGUobWlu
SGVpZ2h0KTsKKyAgICAgICAgICAgIC8vIFVzZWQgaGVpZ2h0IHNob3VsZCByZW1haW4gdGhlIHNh
bWUuCisgICAgICAgICAgICBBU1NFUlQoKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkgJiYg
KGxheW91dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpKSkgfHwg
bWluSGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPT0gKm1pbkhlaWdodCk7CisgICAgICAg
ICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0geyAqbWluSGVpZ2h0LCBtaW5IZWlnaHRBbmRN
YXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAx
LiBDb21wdXRlIGNvbGxhcHNlZCBtYXJnaW5zLgorICAgIC8vIDIuIEFkanVzdCB2ZXJ0aWNhbCBw
b3NpdGlvbiB1c2luZyB0aGUgY29sbGFwc2VkIHZhbHVlcy4KKyAgICAvLyAzLiBBZGp1c3QgcHJl
dmlvdXMgaW4tZmxvdyBzaWJsaW5nIG1hcmdpbiBhZnRlciB1c2luZyB0aGlzIG1hcmdpbi4KKyAg
ICBhdXRvIG1hcmdpbkNvbGxhcHNlID0gdGhpcy0+bWFyZ2luQ29sbGFwc2UoKTsKKyAgICBhdXRv
IHZlcnRpY2FsTWFyZ2luID0gbWFyZ2luQ29sbGFwc2UuY29sbGFwc2VkVmVydGljYWxWYWx1ZXMo
bGF5b3V0Qm94LCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbik7Cisg
ICAgLy8gQ2FjaGUgdGhlIGNvbXB1dGVkIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFs
dWUgcGFpci4KKyAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRVc2VkVmVydGljYWxNYXJnaW4obGF5
b3V0Qm94LCB2ZXJ0aWNhbE1hcmdpbik7CisKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIGlmICho
YXNQcmVjb21wdXRlZE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpICYmIHByZWNvbXB1dGVkTWFyZ2lu
QmVmb3JlKGxheW91dEJveCkudXNlZFZhbHVlKCkgIT0gbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFy
Z2luKSkgeworICAgICAgICAvLyBXaGVuIHRoZSBwcmUtY29tcHV0ZWQgbWFyZ2luIHR1cm5zIG91
dCB0byBiZSBpbmNvcnJlY3QsIHdlIG5lZWQgdG8gcmUtbGF5b3V0IHRoaXMgc3VidHJlZSB3aXRo
IHRoZSBjb3JyZWN0IG1hcmdpbiB2YWx1ZXMuCisgICAgICAgIC8vIDxkaXYgc3R5bGU9ImZsb2F0
OiBsZWZ0Ij48L2Rpdj4KKyAgICAgICAgLy8gPGRpdj4KKyAgICAgICAgLy8gICA8ZGl2IHN0eWxl
PSJtYXJnaW4tYm90dG9tOiAyMDBweCI+PC9kaXY+CisgICAgICAgIC8vIDwvZGl2PgorICAgICAg
ICAvLyBUaGUgZmxvYXQgYm94IHRyaWdnZXJzIG1hcmdpbiBiZWZvcmUgY29tcHV0YXRpb24gb24g
dGhlIGFuY2VzdG9yIGNoYWluIHRvIGJlIGFibGUgdG8gaW50ZXJzZWN0IHdpdGggb3RoZXIgZmxv
YXRzIGluIHRoZSBzYW1lIGZsb2F0aW5nIGNvbnRleHQuCisgICAgICAgIC8vIEhvd2V2ZXIgaW4g
c29tZSBjYXNlcyB0aGUgcGFyZW50IG1hcmdpbi10b3AgY29sbGFwc2VzIHdpdGggc29tZSBuZXh0
IHNpYmxpbmdzIChuZXBoZXdzKSBhbmQgdGhlcmUncyBubyB3YXkgdG8gYmUgYWJsZSB0byBwcm9w
ZXJseQorICAgICAgICAvLyBhY2NvdW50IGZvciB0aGF0IHdpdGhvdXQgbGF5aW5nIG91dCBldmVy
eSBub2RlIGluIHRoZSBGQyAoaW4gdGhlIGV4YW1wbGUsIHRoZSBtYXJnaW4tYm90dG9tIHB1c2hl
cyBkb3duIHRoZSBmbG9hdCkuCisgICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7
CisgICAgfQorI2VuZGlmCisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUo
KS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpOworICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hI
ZWlnaHQoY29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KTsKKyAgICBib3hHZW9t
ZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiksIG1h
cmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsKKyAgICAvLyBBZGp1c3QgdGhlIHByZXZpb3Vz
IHNpYmxpbmcncyBtYXJnaW4gYm90dG9tIG5vdyB0aGF0IHRoaXMgYm94J3MgdmVydGljYWwgbWFy
Z2luIGlzIGNvbXB1dGVkLgorICAgIE1hcmdpbkNvbGxhcHNlOjp1cGRhdGVNYXJnaW5BZnRlckZv
clByZXZpb3VzU2libGluZygqdGhpcywgbWFyZ2luQ29sbGFwc2UsIGxheW91dEJveCk7Cit9CisK
K0Zvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIEJsb2NrRm9ybWF0
dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpCit7CisgICAg
YXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7CisgICAgQVNT
RVJUKCFmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpKTsKKyAgICAv
LyBWaXNpdCB0aGUgaW4tZmxvdyBkZXNjZW5kYW50cyBhbmQgY29tcHV0ZSB0aGVpciBtaW4vbWF4
IGludHJpbnNpYyB3aWR0aCBpZiBuZWVkZWQuCisgICAgLy8gMS4gR28gYWxsIHRoZSB3YXkgZG93
biB0byB0aGUgbGVhZiBub2RlCisgICAgLy8gMi4gQ2hlY2sgaWYgYWN0dWFsbHkgbmVlZCB0byB2
aXNpdCBhbGwgdGhlIGJveGVzIGFzIHdlIHRyYXZlcnNlIGRvd24gKGFscmVhZHkgY29tcHV0ZWQs
IGNvbnRhaW5lcidzIG1pbi9tYXggZG9lcyBub3QgZGVwZW5kIG9uIGRlc2NlbmRhbnRzIGV0YykK
KyAgICAvLyAzLiBBcyB3ZSBjbGltYiBiYWNrIG9uIHRoZSB0cmVlLCBjb21wdXRlIG1pbi9tYXgg
aW50cmluc2ljIHdpZHRoCisgICAgLy8gKEFueSBzdWJ0cmVlcyB3aXRoIG5ldyBmb3JtYXR0aW5n
IGNvbnRleHRzIG5lZWQgdG8gbGF5b3V0IHN5bmNocm9ub3VzbHkpCisgICAgVmVjdG9yPGNvbnN0
IEJveCo+IHF1ZXVlOworICAgIGlmIChyb290KCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkp
CisgICAgICAgIHF1ZXVlLmFwcGVuZChyb290KCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQo
KSk7CisKKyAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbnN0cmFpbnRzOworICAgIGF1
dG8gbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoID0gTGF5b3V0VW5pdCB7IH07CisgICAg
YXV0byBjdXJyZW50SG9yaXpvbnRhbFN0YWNraW5nV2lkdGggPSBMYXlvdXRVbml0IHsgfTsKKyAg
ICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAg
ICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBkZWFsIHdpdGggZGVzY2VuZGFudCBjb250
ZW50LgorICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKnF1ZXVlLmxhc3QoKTsKKyAgICAg
ICAgICAgIC8vIEZsb2F0IGF2b2lkZXJzIGFyZSBhbGwgZXN0YWJsaXNoIGEgbmV3IGZvcm1hdHRp
bmcgY29udGV4dC4gTm8gbmVlZCB0byBsb29rIGluc2lkZSB0aGVtLgorICAgICAgICAgICAgaWYg
KGxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpICYmICFsYXlvdXRCb3guaGFzRmxvYXRDbGVhcigp
KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gTm9uLWZsb2F0aW5nIGJs
b2NrIGxldmVsIGJveGVzIHJlc2V0IHRoZSBjdXJyZW50IGhvcml6b250YWwgZmxvYXQgc3RhY2tp
bmcuCisgICAgICAgICAgICAvLyBTUEVDOiBUaGlzIGlzIGEgYml0IG9kZCBhcyBmbG9hdGluZyBw
b3NpdGlvbmluZyBpcyBhIGZvcm1hdHRpbmcgY29udGV4dCBsZXZlbCBjb25jZXB0OgorICAgICAg
ICAgICAgLy8gZS5nLgorICAgICAgICAgICAgLy8gPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdp
ZHRoOiAxMHB4OyI+PC9kaXY+CisgICAgICAgICAgICAvLyA8ZGl2PjwvZGl2PgorICAgICAgICAg
ICAgLy8gPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiA0MHB4OyI+PC9kaXY+CisgICAg
ICAgICAgICAvLyAuLi53aWxsIHByb2R1Y2UgYSBtYXggd2lkdGggb2YgNDBweCB3aGljaCBtYWtl
cyB0aGUgZmxvYXRzIHZlcnRpY2FsbHkgc3RhY2tlZC4KKyAgICAgICAgICAgIC8vIFZlcnRpY2Fs
bHkgc3RhY2tlZCBmbG9hdHMgbWFrZXMgbWUgdGhpbmsgd2UgaGF2ZW4ndCBtYW5hZ2VkIHRvIHBy
b3ZpZGUgdGhlIG1heGltdW0gcHJlZmVycmVkIHdpZHRoIGZvciB0aGUgY29udGVudC4KKyAgICAg
ICAgICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHN0ZDo6bWF4KGN1cnJlbnRI
b3Jpem9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsK
KyAgICAgICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHsgfTsKKyAgICAg
ICAgICAgIC8vIEFscmVhZHkgaGFzIGNvbXB1dGVkIGludHJpbnNpYyBjb25zdHJhaW50cy4KKyAg
ICAgICAgICAgIGlmIChmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50c0Zv
ckJveChsYXlvdXRCb3gpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8g
Qm94IHdpdGggZml4ZWQgd2lkdGggZGVmaW5lcyB0aGVpciBkZXNjZW5kYW50IGNvbnRlbnQgaW50
cmluc2ljIHdpZHRoLgorICAgICAgICAgICAgaWYgKGxheW91dEJveC5zdHlsZSgpLndpZHRoKCku
aXNGaXhlZCgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gTm9uLWZs
b2F0IGF2b2lkZXIgZm9ybWF0dGluZyBjb250ZXh0IHJvb3RzIGFyZSBvcGFxdWUgdG8gaW50cmlu
c2ljIHdpZHRoIGNvbXB1dGF0aW9uLgorICAgICAgICAgICAgaWYgKGxheW91dEJveC5lc3RhYmxp
c2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAvLyBObyByZWxldmFudCBjaGlsZCBjb250ZW50LgorICAgICAgICAgICAgaWYgKCFpczxD
b250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0
Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJv
eCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8g
Q29tcHV0ZSBtaW4vbWF4IGludHJpbnNpYyB3aWR0aCBib3R0b20gdXAgaWYgbmVlZGVkLgorICAg
ICAgICB3aGlsZSAoIXF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXV0byYgbGF5b3V0
Qm94ID0gKnF1ZXVlLnRha2VMYXN0KCk7CisgICAgICAgICAgICBhdXRvIGRlc2RlbmRhbnRDb25z
dHJhaW50cyA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94
KGxheW91dEJveCk7CisgICAgICAgICAgICBpZiAoIWRlc2RlbmRhbnRDb25zdHJhaW50cykgewor
ICAgICAgICAgICAgICAgIGRlc2RlbmRhbnRDb25zdHJhaW50cyA9IGdlb21ldHJ5KCkuaW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyhsYXlvdXRCb3gpOworICAgICAgICAgICAgICAgIGZvcm1hdHRp
bmdTdGF0ZS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGxheW91dEJveCwgKmRl
c2RlbmRhbnRDb25zdHJhaW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdHJh
aW50cy5taW5pbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMubWluaW11bSwgZGVzZGVuZGFudENv
bnN0cmFpbnRzLT5taW5pbXVtKTsKKyAgICAgICAgICAgIGF1dG8gd2lsbFN0YWNrSG9yaXpvbnRh
bGx5ID0gbGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkgJiYgIWxheW91dEJveC5oYXNGbG9hdENs
ZWFyKCk7CisgICAgICAgICAgICBpZiAod2lsbFN0YWNrSG9yaXpvbnRhbGx5KQorICAgICAgICAg
ICAgICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCArPSBkZXNkZW5kYW50Q29uc3Ry
YWludHMtPm1heGltdW07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29uc3Ry
YWludHMubWF4aW11bSA9IHN0ZDo6bWF4KGNvbnN0cmFpbnRzLm1heGltdW0sIGRlc2RlbmRhbnRD
b25zdHJhaW50cy0+bWF4aW11bSk7CisgICAgICAgICAgICAvLyBNb3ZlIG92ZXIgdG8gdGhlIG5l
eHQgc2libGluZyBvciB0YWtlIHRoZSBuZXh0IGJveCBpbiB0aGUgcXVldWUuCisgICAgICAgICAg
ICBpZiAoYXV0byogbmV4dFNpYmxpbmcgPSBsYXlvdXRCb3gubmV4dEluRmxvd09yRmxvYXRpbmdT
aWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQobmV4dFNpYmxpbmcpOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQor
ICAgIG1heGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHN0ZDo6bWF4KGN1cnJlbnRIb3Jp
em9udGFsU3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsKKyAg
ICBjb25zdHJhaW50cy5tYXhpbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMubWF4aW11bSwgbWF4
aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsKKyAgICBmb3JtYXR0aW5nU3RhdGUuc2V0SW50
cmluc2ljV2lkdGhDb25zdHJhaW50cyhjb25zdHJhaW50cyk7CisgICAgcmV0dXJuIGNvbnN0cmFp
bnRzOworfQorCitMYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OnZlcnRpY2FsUG9z
aXRpb25XaXRoTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBVc2VkVmVydGljYWxN
YXJnaW4mIHZlcnRpY2FsTWFyZ2luLCAgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVydGlj
YWxDb25zdHJhaW50cykgY29uc3QKK3sKKyAgICBBU1NFUlQoIWxheW91dEJveC5pc091dE9mRmxv
d1Bvc2l0aW9uZWQoKSk7CisgICAgLy8gTm93IHRoYXQgd2UndmUgY29tcHV0ZWQgdGhlIGZpbmFs
IG1hcmdpbiBiZWZvcmUsIGxldCdzIHNoaWZ0IHRoZSBib3gncyB2ZXJ0aWNhbCBwb3NpdGlvbiBp
ZiBuZWVkZWQuCisgICAgLy8gMS4gQ2hlY2sgaWYgdGhlIGJveCBoYXMgY2xlYXJhbmNlLiBJZiBz
bywgd2UndmUgYWxyZWFkeSBwcmVjb21wdXRlZC9maW5hbGl6ZWQgdGhlIHRvcCB2YWx1ZSBhbmQg
dmVydGljYWwgbWFyZ2luIGRvZXMgbm90IGltcGFjdCBpdCBhbnltb3JlLgorICAgIC8vIDIuIENo
ZWNrIGlmIHRoZSBtYXJnaW4gYmVmb3JlIGNvbGxhcHNlcyB3aXRoIHRoZSBwcmV2aW91cyBib3gn
cyBtYXJnaW4gYWZ0ZXIuIGlmIG5vdCAtPiByZXR1cm4gcHJldmlvdXMgYm94J3MgYm90dG9tIGlu
Y2x1ZGluZyBtYXJnaW4gYWZ0ZXIgKyBtYXJnaW5CZWZvcmUKKyAgICAvLyAzLiBDaGVjayBpZiB0
aGUgcHJldmlvdXMgYm94J3MgbWFyZ2lucyBjb2xsYXBzZSB0aHJvdWdoLiBJZiBub3QgLT4gcmV0
dXJuIHByZXZpb3VzIGJveCcgYm90dG9tIGV4Y2x1ZGluZyBtYXJnaW4gYWZ0ZXIgKyBtYXJnaW5C
ZWZvcmUgKHRoZXkgYXJlIHN1cHBvc2VkIHRvIGJlIGVxdWFsKQorICAgIC8vIDQuIEdvIHRvIHBy
ZXZpb3VzIGJveCBhbmQgc3RhcnQgZnJvbSBzdGVwICMxIHVudGlsIHdlIGhpdCB0aGUgcGFyZW50
IGJveC4KKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7
CisgICAgaWYgKGZvcm1hdHRpbmdTdGF0ZSgpLmhhc0NsZWFyYW5jZShsYXlvdXRCb3gpKQorICAg
ICAgICByZXR1cm4gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChib3hHZW9tZXRyeSk7CisKKyAg
ICBhdXRvKiBjdXJyZW50TGF5b3V0Qm94ID0gJmxheW91dEJveDsKKyAgICB3aGlsZSAoY3VycmVu
dExheW91dEJveCkgeworICAgICAgICBpZiAoIWN1cnJlbnRMYXlvdXRCb3gtPnByZXZpb3VzSW5G
bG93U2libGluZygpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGF1dG8mIHByZXZpb3Vz
SW5GbG93U2libGluZyA9ICpjdXJyZW50TGF5b3V0Qm94LT5wcmV2aW91c0luRmxvd1NpYmxpbmco
KTsKKyAgICAgICAgaWYgKCFtYXJnaW5Db2xsYXBzZSgpLm1hcmdpbkJlZm9yZUNvbGxhcHNlc1dp
dGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVudExheW91dEJveCkpIHsKKyAgICAg
ICAgICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9tZXRyeUZvckJveChwcmV2aW91
c0luRmxvd1NpYmxpbmcpOworICAgICAgICAgICAgcmV0dXJuIEJveEdlb21ldHJ5OjptYXJnaW5C
b3hSZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsgbWFyZ2luQmVmb3JlKHZlcnRp
Y2FsTWFyZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbWFyZ2luQ29sbGFwc2UoKS5t
YXJnaW5zQ29sbGFwc2VUaHJvdWdoKHByZXZpb3VzSW5GbG93U2libGluZykpIHsKKyAgICAgICAg
ICAgIGF1dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9tZXRyeUZvckJveChwcmV2aW91c0lu
Rmxvd1NpYmxpbmcpOworICAgICAgICAgICAgcmV0dXJuIEJveEdlb21ldHJ5Ojpib3JkZXJCb3hS
ZWN0KHByZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsgbWFyZ2luQmVmb3JlKHZlcnRpY2Fs
TWFyZ2luKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50TGF5b3V0Qm94ID0gJnByZXZpb3Vz
SW5GbG93U2libGluZzsKKyAgICB9CisKKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRC
b3hUb3AgPSB2ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7CisgICAgLy8gQWRqdXN0IHZl
cnRpY2FsIHBvc2l0aW9uIGRlcGVuZGluZyB3aGV0aGVyIHRoaXMgYm94IGRpcmVjdGx5IG9yIGlu
ZGlyZWN0bHkgYWRqb2lucyB3aXRoIGl0cyBwYXJlbnQuCisgICAgYXV0byBkaXJlY3RseUFkam9p
bnNQYXJlbnQgPSAhbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpOworICAgIGlmIChk
aXJlY3RseUFkam9pbnNQYXJlbnQpIHsKKyAgICAgICAgLy8gSWYgdGhlIHRvcCBhbmQgYm90dG9t
IG1hcmdpbnMgb2YgYSBib3ggYXJlIGFkam9pbmluZywgdGhlbiBpdCBpcyBwb3NzaWJsZSBmb3Ig
bWFyZ2lucyB0byBjb2xsYXBzZSB0aHJvdWdoIGl0LgorICAgICAgICAvLyBJbiB0aGlzIGNhc2Us
IHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBkZXBlbmRzIG9uIGl0cyByZWxhdGlvbnNoaXAg
d2l0aCB0aGUgb3RoZXIgZWxlbWVudHMgd2hvc2UgbWFyZ2lucyBhcmUgYmVpbmcgY29sbGFwc2Vk
LgorICAgICAgICBpZiAodmVydGljYWxNYXJnaW4uY29sbGFwc2VkVmFsdWVzLmlzQ29sbGFwc2Vk
VGhyb3VnaCkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQncyBtYXJnaW5zIGFyZSBj
b2xsYXBzZWQgd2l0aCBpdHMgcGFyZW50J3MgdG9wIG1hcmdpbiwgdGhlIHRvcCBib3JkZXIgZWRn
ZSBvZiB0aGUgYm94IGlzIGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHBhcmVudCdzLgor
ICAgICAgICAgICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0
aFBhcmVudE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQorICAgICAgICAgICAgICAgIHJldHVybiBj
b250YWluaW5nQmxvY2tDb250ZW50Qm94VG9wOworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBl
aXRoZXIgdGhlIGVsZW1lbnQncyBwYXJlbnQgaXMgbm90IHRha2luZyBwYXJ0IGluIHRoZSBtYXJn
aW4gY29sbGFwc2luZywgb3Igb25seSB0aGUgcGFyZW50J3MgYm90dG9tIG1hcmdpbiBpcyBpbnZv
bHZlZC4KKyAgICAgICAgICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCdzIHRvcCBi
b3JkZXIgZWRnZSBpcyB0aGUgc2FtZSBhcyBpdCB3b3VsZCBoYXZlIGJlZW4gaWYgdGhlIGVsZW1l
bnQgaGFkIGEgbm9uLXplcm8gYm90dG9tIGJvcmRlci4KKyAgICAgICAgICAgIGF1dG8gYmVmb3Jl
TWFyZ2luV2l0aEJvdHRvbUJvcmRlciA9IG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlSWdu
b3JpbmdDb2xsYXBzaW5nVGhyb3VnaChsYXlvdXRCb3gsIHZlcnRpY2FsTWFyZ2luLm5vbkNvbGxh
cHNlZFZhbHVlcyk7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrQ29udGVudEJv
eFRvcCArIGJlZm9yZU1hcmdpbldpdGhCb3R0b21Cb3JkZXI7CisgICAgICAgIH0KKyAgICAgICAg
Ly8gTm9uLWNvbGxhcHNlZCB0aHJvdWdoIGJveCB2ZXJ0aWNhbCBwb3NpdGlvbiBkZXBlbmRpbmcg
d2hldGhlciB0aGUgbWFyZ2luIGNvbGxhcHNlcy4KKyAgICAgICAgaWYgKG1hcmdpbkNvbGxhcHNl
KCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXlvdXRCb3gp
KQorICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3A7CisKKyAg
ICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgKyBtYXJnaW5CZWZvcmUo
dmVydGljYWxNYXJnaW4pOworICAgIH0KKyAgICAvLyBBdCB0aGlzIHBvaW50IHRoaXMgYm94IGlu
ZGlyZWN0bHkgKHZpYSBjb2xsYXBzZWQgdGhyb3VnaCBwcmV2aW91cyBpbi1mbG93IHNpYmxpbmdz
KSBhZGpvaW5zIHRoZSBwYXJlbnQuIExldCdzIGNoZWNrIGlmIGl0IG1hcmdpbiBjb2xsYXBzZXMg
d2l0aCB0aGUgcGFyZW50LgorICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxheW91dEJveC5j
b250YWluaW5nQmxvY2soKTsKKyAgICBBU1NFUlQoY29udGFpbmluZ0Jsb2NrLmZpcnN0SW5GbG93
Q2hpbGQoKSk7CisgICAgQVNTRVJUKGNvbnRhaW5pbmdCbG9jay5maXJzdEluRmxvd0NoaWxkKCkg
IT0gJmxheW91dEJveCk7CisgICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29s
bGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZSgqY29udGFpbmluZ0Jsb2NrLmZpcnN0SW5GbG93
Q2hpbGQoKSkpCisgICAgICAgIHJldHVybiBjb250YWluaW5nQmxvY2tDb250ZW50Qm94VG9wOwor
CisgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgKyBtYXJnaW5CZWZvcmUo
dmVydGljYWxNYXJnaW4pOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9jay9CbG9ja0Zvcm1hdHRpbmdD
b250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2Nr
L0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42M2Q5OTY5M2U4N2NkMGIwZjEz
MmVhYzcxMzY5MGUwYjcwNTJlMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9jay9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgK
QEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJM
RShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5n
U3RhdGUuaCIKKyNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPHd0Zi9I
YXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2NsYXNzIExheW91dFVuaXQ7CisKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBC
b3g7CitjbGFzcyBGbG9hdGluZ0NvbnRleHQ7CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0
aGUgbGF5b3V0IGxvZ2ljIGZvciBibG9jayBmb3JtYXR0aW5nIGNvbnRleHRzLgorLy8gaHR0cHM6
Ly93d3cudzMub3JnL1RSL0NTUzIyL3Zpc3VyZW4uaHRtbCNibG9jay1mb3JtYXR0aW5nCitjbGFz
cyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0IHsKKyAg
ICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKEJsb2NrRm9ybWF0dGluZ0NvbnRleHQpOworcHVibGlj
OgorICAgIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0
aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJik7CisKKyAgICB2b2lkIGxheW91
dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0Zvcklu
Rmxvd0NvbnRlbnQmKSBvdmVycmlkZTsKKyAgICBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0
KCkgY29uc3Qgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzdHJ1Y3QgQ29uc3RyYWludHNQ
YWlyIHsKKyAgICAgICAgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IGZvcm1hdHRpbmdDb250
ZXh0Um9vdDsKKyAgICAgICAgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IGNvbnRhaW5pbmdC
bG9jazsKKyAgICB9OworICAgIHZvaWQgcGxhY2VJbkZsb3dQb3NpdGlvbmVkQ2hpbGRyZW4oY29u
c3QgQ29udGFpbmVyQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7CisKKyAgICB2
b2lkIGNvbXB1dGVXaWR0aEFuZE1hcmdpbihjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBC
b3gmLCBjb25zdCBDb25zdHJhaW50c1BhaXImKTsKKyAgICB2b2lkIGNvbXB1dGVIZWlnaHRBbmRN
YXJnaW4oY29uc3QgQm94JiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jik7CisK
KyAgICB2b2lkIGNvbXB1dGVTdGF0aWNIb3Jpem9udGFsUG9zaXRpb24oY29uc3QgQm94JiwgY29u
c3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJik7CisgICAgdm9pZCBjb21wdXRlU3RhdGljVmVydGlj
YWxQb3NpdGlvbihjb25zdCBCb3gmLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJik7CisgICAg
dm9pZCBjb21wdXRlUG9zaXRpb25Ub0F2b2lkRmxvYXRzKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYs
IGNvbnN0IEJveCYsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYpOworICAgIHZvaWQgY29tcHV0ZVZl
cnRpY2FsUG9zaXRpb25Gb3JGbG9hdENsZWFyKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNvbnN0
IEJveCYpOworCisgICAgdm9pZCBwcmVjb21wdXRlVmVydGljYWxQb3NpdGlvbkZvckJveEFuZEFu
Y2VzdG9ycyhjb25zdCBCb3gmLCBjb25zdCBDb25zdHJhaW50c1BhaXImKTsKKworICAgIEludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkg
b3ZlcnJpZGU7CisKKyAgICBMYXlvdXRVbml0IHZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGNv
bnN0IEJveCYsIGNvbnN0IFVzZWRWZXJ0aWNhbE1hcmdpbiYsIGNvbnN0IFZlcnRpY2FsQ29uc3Ry
YWludHMmKSBjb25zdDsKKworICAgIC8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBwb3NpdGlvbmlu
ZyBhbmQgc2l6aW5nIGZvciBib3hlcyBwYXJ0aWNpcGF0aW5nIGluIGEgYmxvY2sgZm9ybWF0dGlu
ZyBjb250ZXh0LgorICAgIGNsYXNzIEdlb21ldHJ5IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeSB7CisgICAgcHVibGljOgorICAgICAgICBHZW9tZXRyeShjb25zdCBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0Jik7CisKKyAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBpbkZs
b3dDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYpOworICAgICAgICBDb250
ZW50V2lkdGhBbmRNYXJnaW4gaW5GbG93Q29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFs
VmFsdWVzJik7CisKKyAgICAgICAgUG9pbnQgc3RhdGljUG9zaXRpb24oY29uc3QgQm94JiwgY29u
c3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYpIGNv
bnN0OworICAgICAgICBMYXlvdXRVbml0IHN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94
JiwgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYpIGNvbnN0OworICAgICAgICBMYXlvdXRVbml0
IHN0YXRpY0hvcml6b250YWxQb3NpdGlvbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29u
c3RyYWludHMmKSBjb25zdDsKKworICAgICAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3QgQm94Jik7CisKKyAgICAgICAgQ29udGVudFdp
ZHRoQW5kTWFyZ2luIGNvbXB1dGVkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNv
bnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIE9wdGlvbmFsPExheW91dFVuaXQ+IGF2YWlsYWJs
ZVdpZHRoRmxvYXRBdm9pZGVyKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIENvbnRlbnRIZWln
aHRBbmRNYXJnaW4gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0
IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0
aWNhbFZhbHVlcyYpOworICAgICAgICBDb250ZW50V2lkdGhBbmRNYXJnaW4gaW5GbG93Tm9uUmVw
bGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKyAgICAgICAg
Q29udGVudFdpZHRoQW5kTWFyZ2luIGluRmxvd1JlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2lu
KGNvbnN0IFJlcGxhY2VkQm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiwgY29uc3Qg
T3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmKTsKKworICAgICAgICBjb25zdCBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0
PEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Zm9y
bWF0dGluZ0NvbnRleHQoKSk7IH0KKyAgICB9OworICAgIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnkoKnRoaXMpOyB9CisK
KyAgICAvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgbWFyZ2luIGNvbGxhcHNpbmcgZm9yIGJsb2Nr
IGZvcm1hdHRpbmcgY29udGV4dC4KKyAgICBjbGFzcyBNYXJnaW5Db2xsYXBzZSB7CisgICAgcHVi
bGljOgorICAgICAgICBVc2VkVmVydGljYWxNYXJnaW4gY29sbGFwc2VkVmVydGljYWxWYWx1ZXMo
Y29uc3QgQm94JiwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpOworCisg
ICAgICAgIFByZWNvbXB1dGVkTWFyZ2luQmVmb3JlIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNv
bnN0IEJveCYsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsKKyAgICAg
ICAgTGF5b3V0VW5pdCBtYXJnaW5CZWZvcmVJZ25vcmluZ0NvbGxhcHNpbmdUaHJvdWdoKGNvbnN0
IEJveCYsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzKTsKKyAgICAgICAg
c3RhdGljIHZvaWQgdXBkYXRlTWFyZ2luQWZ0ZXJGb3JQcmV2aW91c1NpYmxpbmcoQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dCYsIGNvbnN0IE1hcmdpbkNvbGxhcHNlJiwgY29uc3QgQm94Jik7CisKKyAg
ICAgICAgYm9vbCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNv
bnN0IEJveCYpIGNvbnN0OworICAgICAgICBib29sIG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhG
aXJzdEluRmxvd0NoaWxkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OworICAgICAgICBi
b29sIG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gm
KSBjb25zdDsKKyAgICAgICAgYm9vbCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNT
aWJsaW5nTWFyZ2luQWZ0ZXIoY29uc3QgQm94JikgY29uc3Q7CisKKyAgICAgICAgYm9vbCBtYXJn
aW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmKSBjb25zdDsK
KyAgICAgICAgYm9vbCBtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhMYXN0SW5GbG93Q2hpbGRNYXJn
aW5BZnRlcihjb25zdCBCb3gmKSBjb25zdDsKKyAgICAgICAgYm9vbCBtYXJnaW5BZnRlckNvbGxh
cHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUoY29uc3QgQm94JikgY29uc3Q7CisgICAgICAgIGJv
b2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoTmV4dFNpYmxpbmdNYXJnaW5CZWZvcmUoY29uc3Qg
Qm94JikgY29uc3Q7CisgICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoU2libGlu
Z01hcmdpbkJlZm9yZVdpdGhDbGVhcmFuY2UoY29uc3QgQm94JikgY29uc3Q7CisKKyAgICAgICAg
Ym9vbCBtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKGNvbnN0IEJveCYpIGNvbnN0OworCisgICAgcHJp
dmF0ZToKKyAgICAgICAgZnJpZW5kIGNsYXNzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ7CisgICAg
ICAgIE1hcmdpbkNvbGxhcHNlKGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsKKworICAg
ICAgICBlbnVtIGNsYXNzIE1hcmdpblR5cGUgeyBCZWZvcmUsIEFmdGVyIH07CisgICAgICAgIFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBwb3NpdGl2
ZU5lZ2F0aXZlVmFsdWVzKGNvbnN0IEJveCYsIE1hcmdpblR5cGUpIGNvbnN0OworICAgICAgICBV
c2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcG9zaXRp
dmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShjb25zdCBCb3gmLCBVc2VkVmVydGljYWxNYXJnaW46Ok5v
bkNvbGxhcHNlZFZhbHVlcykgY29uc3Q7CisgICAgICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9z
aXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBwb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQWZ0ZXIo
Y29uc3QgQm94JiwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0
OworCisgICAgICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6
OlZhbHVlcyBwcmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUoY29uc3QgQm94
JiwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0OworICAgICAg
ICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcHJl
Y29tcHV0ZWRQb3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKGNvbnN0IEJveCYpIGNvbnN0OworCisgICAg
ICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBj
b21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4oVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3Np
dGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzLCBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZl
QW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMpIGNvbnN0OworICAgICAgICBPcHRpb25hbDxMYXlvdXRV
bml0PiBtYXJnaW5WYWx1ZShVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQ
YWlyOjpWYWx1ZXMpIGNvbnN0OworCisgICAgICAgIGJvb2wgaGFzQ2xlYXJhbmNlKGNvbnN0IEJv
eCYpIGNvbnN0OworCisgICAgICAgIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIHsgcmV0dXJu
IG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4dC5sYXlvdXRTdGF0ZSgpOyB9CisgICAgICAgIGNvbnN0
IExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tGb3JtYXR0
aW5nQ29udGV4dC5sYXlvdXRTdGF0ZSgpOyB9CisgICAgICAgIGNvbnN0IEJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja0Zvcm1h
dHRpbmdDb250ZXh0OyB9CisKKyAgICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYg
bV9ibG9ja0Zvcm1hdHRpbmdDb250ZXh0OworICAgIH07CisgICAgTWFyZ2luQ29sbGFwc2UgbWFy
Z2luQ29sbGFwc2UoKSBjb25zdCB7IHJldHVybiBNYXJnaW5Db2xsYXBzZSgqdGhpcyk7IH0KKwor
ICAgIGNsYXNzIFF1aXJrcyA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzIHsKKyAg
ICBwdWJsaWM6CisgICAgICAgIFF1aXJrcyhjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Jik7
CisKKyAgICAgICAgYm9vbCBuZWVkc1N0cmV0Y2hpbmcoY29uc3QgQm94JikgY29uc3Q7CisgICAg
ICAgIExheW91dFVuaXQgc3RyZXRjaGVkSW5GbG93SGVpZ2h0KGNvbnN0IEJveCYsIENvbnRlbnRI
ZWlnaHRBbmRNYXJnaW4pOworCisgICAgICAgIGJvb2wgc2hvdWxkSWdub3JlQ29sbGFwc2VkUXVp
cmtNYXJnaW4oY29uc3QgQm94JikgY29uc3Q7CisgICAgICAgIGJvb2wgc2hvdWxkQ29sbGFwc2VN
YXJnaW5CZWZvcmVXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OworICAg
ICAgICBib29sIHNob3VsZENvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoUGFyZW50TWFyZ2luQWZ0ZXIo
Y29uc3QgQm94JikgY29uc3Q7CisKKyAgICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0PihGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpmb3JtYXR0aW5nQ29udGV4
dCgpKTsgfQorICAgICAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSBnZW9tZXRy
eSgpIGNvbnN0IHsgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnkoKTsgfQorCisg
ICAgfTsKKyAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3Qg
eyByZXR1cm4gUXVpcmtzKCp0aGlzKTsgfQorCisgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNl
ZEF2YWlsYWJsZVdpZHRoRm9yRmxvYXRBdm9pZGVyKGNvbnN0IEZsb2F0aW5nQ29udGV4dCYsIGNv
bnN0IEJveCYsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYpOworCisgICAgY29uc3QgQmxvY2tGb3Jt
YXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEJs
b2NrRm9ybWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkp
OyB9CisgICAgQmxvY2tGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJu
IGRvd25jYXN0PEJsb2NrRm9ybWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0
dGluZ1N0YXRlKCkpOyB9CisKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIHZvaWQgc2V0UHJlY29t
cHV0ZWRNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IFByZWNvbXB1dGVk
TWFyZ2luQmVmb3JlJiBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZSkgeyBtX3ByZWNvbXB1dGVkTWFy
Z2luQmVmb3JlTGlzdC5zZXQoJmxheW91dEJveCwgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUpOyB9
CisgICAgUHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUgcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUoY29u
c3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fcHJlY29tcHV0ZWRNYXJnaW5CZWZv
cmVMaXN0LmdldCgmbGF5b3V0Qm94KTsgfQorICAgIGJvb2wgaGFzUHJlY29tcHV0ZWRNYXJnaW5C
ZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0IHsgcmV0dXJuIG1fcHJlY29tcHV0ZWRN
YXJnaW5CZWZvcmVMaXN0LmNvbnRhaW5zKCZsYXlvdXRCb3gpOyB9CisjZW5kaWYKK3ByaXZhdGU6
CisgICAgSGFzaE1hcDxjb25zdCBCb3gqLCBQcmVjb21wdXRlZE1hcmdpbkJlZm9yZT4gbV9wcmVj
b21wdXRlZE1hcmdpbkJlZm9yZUxpc3Q7Cit9OworCitpbmxpbmUgQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6Okdlb21ldHJ5KGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJs
b2NrRm9ybWF0dGluZ0NvbnRleHQpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnko
YmxvY2tGb3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworaW5saW5lIEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6OlF1aXJrczo6UXVpcmtzKGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzKGJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQpCit7Cit9CisKK2lubGluZSBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpNYXJnaW5Db2xsYXBzZTo6TWFyZ2luQ29sbGFwc2UoY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dCYgYmxvY2tGb3JtYXR0aW5nQ29udGV4dCkKKyAgICA6IG1fYmxvY2tGb3JtYXR0aW5nQ29u
dGV4dChibG9ja0Zvcm1hdHRpbmdDb250ZXh0KQoreworfQorCit9Cit9CisKK1NQRUNJQUxJWkVf
VFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0LCBpc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrL0Jsb2NrRm9ybWF0
dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL2Jsb2NrL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uMGExYTJiNDE2YzY3ZGU1ZjI0NWQ1MmMxNWRiNjM0MzU4ZGNjYjViMQotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2sv
QmxvY2tGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApAQCAtMCwwICsxLDQwMSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2lu
Y2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRl
eHQuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlv
dXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENoaWxkSXRlcmF0b3IuaCIKKyNpbmNs
dWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0SW5pdGlhbENvbnRhaW5pbmdC
bG9jay5oIgorI2luY2x1ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCisjaW5jbHVkZSAiTG9nZ2lu
Zy5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4gQmxvY2tG
b3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd05vblJlcGxhY2VkQ29udGVudEhlaWdo
dEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVl
cyYgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKQoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNJ
bkZsb3coKSAmJiAhbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSk7CisgICAgQVNTRVJUKGxheW91
dEJveC5pc092ZXJmbG93VmlzaWJsZSgpKTsKKworICAgIGF1dG8gY29tcHV0ZSA9IFsmXShjb25z
dCBhdXRvJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIC0+IENvbnRlbnRIZWlnaHRBbmRNYXJn
aW4geworCisgICAgICAgIC8vIDEwLjYuMyBCbG9jay1sZXZlbCBub24tcmVwbGFjZWQgZWxlbWVu
dHMgaW4gbm9ybWFsIGZsb3cgd2hlbiAnb3ZlcmZsb3cnIGNvbXB1dGVzIHRvICd2aXNpYmxlJwor
ICAgICAgICAvLworICAgICAgICAvLyBJZiAnbWFyZ2luLXRvcCcsIG9yICdtYXJnaW4tYm90dG9t
JyBhcmUgJ2F1dG8nLCB0aGVpciB1c2VkIHZhbHVlIGlzIDAuCisgICAgICAgIC8vIElmICdoZWln
aHQnIGlzICdhdXRvJywgdGhlIGhlaWdodCBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGVsZW1lbnQg
aGFzIGFueSBibG9jay1sZXZlbCBjaGlsZHJlbiBhbmQgd2hldGhlciBpdCBoYXMgcGFkZGluZyBv
ciBib3JkZXJzOgorICAgICAgICAvLyBUaGUgZWxlbWVudCdzIGhlaWdodCBpcyB0aGUgZGlzdGFu
Y2UgZnJvbSBpdHMgdG9wIGNvbnRlbnQgZWRnZSB0byB0aGUgZmlyc3QgYXBwbGljYWJsZSBvZiB0
aGUgZm9sbG93aW5nOgorICAgICAgICAvLyAxLiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGxhc3Qg
bGluZSBib3gsIGlmIHRoZSBib3ggZXN0YWJsaXNoZXMgYSBpbmxpbmUgZm9ybWF0dGluZyBjb250
ZXh0IHdpdGggb25lIG9yIG1vcmUgbGluZXMKKyAgICAgICAgLy8gMi4gdGhlIGJvdHRvbSBlZGdl
IG9mIHRoZSBib3R0b20gKHBvc3NpYmx5IGNvbGxhcHNlZCkgbWFyZ2luIG9mIGl0cyBsYXN0IGlu
LWZsb3cgY2hpbGQsIGlmIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4KKyAgICAgICAgLy8gICAg
ZG9lcyBub3QgY29sbGFwc2Ugd2l0aCB0aGUgZWxlbWVudCdzIGJvdHRvbSBtYXJnaW4KKyAgICAg
ICAgLy8gMy4gdGhlIGJvdHRvbSBib3JkZXIgZWRnZSBvZiB0aGUgbGFzdCBpbi1mbG93IGNoaWxk
IHdob3NlIHRvcCBtYXJnaW4gZG9lc24ndCBjb2xsYXBzZSB3aXRoIHRoZSBlbGVtZW50J3MgYm90
dG9tIG1hcmdpbgorICAgICAgICAvLyA0LiB6ZXJvLCBvdGhlcndpc2UKKyAgICAgICAgLy8gT25s
eSBjaGlsZHJlbiBpbiB0aGUgbm9ybWFsIGZsb3cgYXJlIHRha2VuIGludG8gYWNjb3VudCAoaS5l
LiwgZmxvYXRpbmcgYm94ZXMgYW5kIGFic29sdXRlbHkgcG9zaXRpb25lZCBib3hlcyBhcmUgaWdu
b3JlZCwKKyAgICAgICAgLy8gYW5kIHJlbGF0aXZlbHkgcG9zaXRpb25lZCBib3hlcyBhcmUgY29u
c2lkZXJlZCB3aXRob3V0IHRoZWlyIG9mZnNldCkuIE5vdGUgdGhhdCB0aGUgY2hpbGQgYm94IG1h
eSBiZSBhbiBhbm9ueW1vdXMgYmxvY2sgYm94LgorCisgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5
ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOworICAgICAg
ICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRWZXJ0aWNh
bE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgICAgIGF1dG8g
bm9uQ29sbGFwc2VkTWFyZ2luID0gVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1
ZXMgeyBjb21wdXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDApLCBjb21wdXRlZFZl
cnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCkgfTsgCisgICAgICAgIGF1dG8gYm9yZGVyQW5k
UGFkZGluZ1RvcCA9IGJveEdlb21ldHJ5LmJvcmRlclRvcCgpICsgYm94R2VvbWV0cnkucGFkZGlu
Z1RvcCgpLnZhbHVlT3IoMCk7CisgICAgICAgIGF1dG8gaGVpZ2h0ID0gb3ZlcnJpZGRlblZlcnRp
Y2FsVmFsdWVzLmhlaWdodCA/IG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcy5oZWlnaHQudmFsdWUo
KSA6IGNvbXB1dGVkSGVpZ2h0KGxheW91dEJveCk7CisKKyAgICAgICAgaWYgKGhlaWdodCkKKyAg
ICAgICAgICAgIHJldHVybiB7ICpoZWlnaHQsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OworCisgICAg
ICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxDb250YWlu
ZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKKyAgICAgICAgICAgIHJldHVybiB7
IDAsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OworCisgICAgICAgIC8vIDEuIHRoZSBib3R0b20gZWRn
ZSBvZiB0aGUgbGFzdCBsaW5lIGJveCwgaWYgdGhlIGJveCBlc3RhYmxpc2hlcyBhIGlubGluZSBm
b3JtYXR0aW5nIGNvbnRleHQgd2l0aCBvbmUgb3IgbW9yZSBsaW5lcworICAgICAgICBhdXRvJiBs
YXlvdXRDb250YWluZXIgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7CisgICAg
ICAgIGlmIChsYXlvdXRDb250YWluZXIuZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dCgpKSB7CisgICAgICAgICAgICBhdXRvJiBpbmxpbmVGb3JtYXR0aW5nU3RhdGUgPSBsYXlvdXRT
dGF0ZSgpLmVzdGFibGlzaGVkSW5saW5lRm9ybWF0dGluZ1N0YXRlKGxheW91dENvbnRhaW5lcik7
CisgICAgICAgICAgICBhdXRvJiBsaW5lcyA9IGlubGluZUZvcm1hdHRpbmdTdGF0ZS5saW5lcygp
OworICAgICAgICAgICAgLy8gRXZlbiBlbXB0eSBjb250YWluZXJzIGdlbmVyYXRlIG9uZSBsaW5l
LiAKKyAgICAgICAgICAgIEFTU0VSVCghbGluZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHJl
dHVybiB7IHRvTGF5b3V0VW5pdChsaW5lcy5sYXN0KCkubGluZUJveExvZ2ljYWxSZWN0KCkuYm90
dG9tKCkgKyBpbmxpbmVGb3JtYXR0aW5nU3RhdGUuY2xlYXJHYXBBZnRlckxhc3RMaW5lKCkpIC0g
Ym9yZGVyQW5kUGFkZGluZ1RvcCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07CisgICAgICAgIH0KKwor
ICAgICAgICAvLyAyLiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGJvdHRvbSAocG9zc2libHkgY29s
bGFwc2VkKSBtYXJnaW4gb2YgaXRzIGxhc3QgaW4tZmxvdyBjaGlsZCwgaWYgdGhlIGNoaWxkJ3Mg
Ym90dG9tIG1hcmdpbi4uLgorICAgICAgICBhdXRvJiBsYXN0SW5GbG93Q2hpbGQgPSAqbGF5b3V0
Q29udGFpbmVyLmxhc3RJbkZsb3dDaGlsZCgpOworICAgICAgICBpZiAoIWZvcm1hdHRpbmdDb250
ZXh0KCkubWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJn
aW5BZnRlcihsYXN0SW5GbG93Q2hpbGQpKSB7CisgICAgICAgICAgICBhdXRvJiBsYXN0SW5GbG93
Qm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxhc3RJbkZs
b3dDaGlsZCk7CisgICAgICAgICAgICBhdXRvIGJvdHRvbUVkZ2VPZkJvdHRvbU1hcmdpbiA9IEJv
eEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGxhc3RJbkZsb3dCb3hHZW9tZXRyeSkuYm90dG9tKCkg
KyBsYXN0SW5GbG93Qm94R2VvbWV0cnkubWFyZ2luQWZ0ZXIoKTsKKyAgICAgICAgICAgIHJldHVy
biB7IGJvdHRvbUVkZ2VPZkJvdHRvbU1hcmdpbiAtIGJvcmRlckFuZFBhZGRpbmdUb3AsIG5vbkNv
bGxhcHNlZE1hcmdpbiB9OworICAgICAgICB9CisKKyAgICAgICAgLy8gMy4gdGhlIGJvdHRvbSBi
b3JkZXIgZWRnZSBvZiB0aGUgbGFzdCBpbi1mbG93IGNoaWxkIHdob3NlIHRvcCBtYXJnaW4gZG9l
c24ndCBjb2xsYXBzZSB3aXRoIHRoZSBlbGVtZW50J3MgYm90dG9tIG1hcmdpbgorICAgICAgICBh
dXRvKiBpbkZsb3dDaGlsZCA9ICZsYXN0SW5GbG93Q2hpbGQ7CisgICAgICAgIHdoaWxlIChpbkZs
b3dDaGlsZCAmJiBmb3JtYXR0aW5nQ29udGV4dCgpLm1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVm
b3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKCppbkZsb3dDaGlsZCkpCisgICAgICAg
ICAgICBpbkZsb3dDaGlsZCA9IGluRmxvd0NoaWxkLT5wcmV2aW91c0luRmxvd1NpYmxpbmcoKTsK
KyAgICAgICAgaWYgKGluRmxvd0NoaWxkKSB7CisgICAgICAgICAgICBhdXRvJiBpbkZsb3dCb3hH
ZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goKmluRmxvd0NoaWxk
KTsKKyAgICAgICAgICAgIHJldHVybiB7IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hUb3AoaW5GbG93
Qm94R2VvbWV0cnkpICsgaW5GbG93Qm94R2VvbWV0cnkuYm9yZGVyQm94KCkuaGVpZ2h0KCkgLSBi
b3JkZXJBbmRQYWRkaW5nVG9wLCBub25Db2xsYXBzZWRNYXJnaW4gfTsKKyAgICAgICAgfQorCisg
ICAgICAgIC8vIDQuIHplcm8sIG90aGVyd2lzZQorICAgICAgICByZXR1cm4geyAwLCBub25Db2xs
YXBzZWRNYXJnaW4gfTsKKyAgICB9OworCisgICAgLy8gMTAuNi43ICdBdXRvJyBoZWlnaHRzIGZv
ciBibG9jay1sZXZlbCBmb3JtYXR0aW5nIGNvbnRleHQgYm94ZXMuCisgICAgYXV0byBpc0F1dG9I
ZWlnaHQgPSAhb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodCAmJiAhY29tcHV0ZWRIZWln
aHQobGF5b3V0Qm94KTsKKyAgICBpZiAoaXNBdXRvSGVpZ2h0ICYmIChsYXlvdXRCb3guZXN0YWJs
aXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpICYmICFsYXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCgpKSkKKyAgICAgICAgcmV0dXJuIGNvbXB1dGUoIE92ZXJyaWRkZW5W
ZXJ0aWNhbFZhbHVlcyB7IGNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3QoZG93
bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpKSB9KTsKKyAgICByZXR1cm4gY29tcHV0ZShv
dmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOworfQorCitDb250ZW50V2lkdGhBbmRNYXJnaW4gQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd05vblJlcGxhY2VkQ29udGVudFdp
ZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxW
YWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQoreworICAgIEFTU0VSVChsYXlvdXRC
b3guaXNJbkZsb3coKSk7CisKKyAgICBhdXRvIGNvbXB1dGUgPSBbJl0oKSB7CisKKyAgICAgICAg
Ly8gMTAuMy4zIEJsb2NrLWxldmVsLCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZs
b3cKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb25zdHJhaW50cyBtdXN0
IGhvbGQgYW1vbmcgdGhlIHVzZWQgdmFsdWVzIG9mIHRoZSBvdGhlciBwcm9wZXJ0aWVzOgorICAg
ICAgICAvLyAnbWFyZ2luLWxlZnQnICsgJ2JvcmRlci1sZWZ0LXdpZHRoJyArICdwYWRkaW5nLWxl
ZnQnICsgJ3dpZHRoJyArICdwYWRkaW5nLXJpZ2h0JyArICdib3JkZXItcmlnaHQtd2lkdGgnICsg
J21hcmdpbi1yaWdodCcgPSB3aWR0aCBvZiBjb250YWluaW5nIGJsb2NrCisgICAgICAgIC8vCisg
ICAgICAgIC8vIDEuIElmICd3aWR0aCcgaXMgbm90ICdhdXRvJyBhbmQgJ2JvcmRlci1sZWZ0LXdp
ZHRoJyArICdwYWRkaW5nLWxlZnQnICsgJ3dpZHRoJyArICdwYWRkaW5nLXJpZ2h0JyArICdib3Jk
ZXItcmlnaHQtd2lkdGgnIAorICAgICAgICAvLyAgICAocGx1cyBhbnkgb2YgJ21hcmdpbi1sZWZ0
JyBvciAnbWFyZ2luLXJpZ2h0JyB0aGF0IGFyZSBub3QgJ2F1dG8nKSBpcyBsYXJnZXIgdGhhbiB0
aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2ssIHRoZW4KKyAgICAgICAgLy8gICAgYW55
ICdhdXRvJyB2YWx1ZXMgZm9yICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgYXJlLCBm
b3IgdGhlIGZvbGxvd2luZyBydWxlcywgdHJlYXRlZCBhcyB6ZXJvLgorICAgICAgICAvLworICAg
ICAgICAvLyAyLiBJZiBhbGwgb2YgdGhlIGFib3ZlIGhhdmUgYSBjb21wdXRlZCB2YWx1ZSBvdGhl
ciB0aGFuICdhdXRvJywgdGhlIHZhbHVlcyBhcmUgc2FpZCB0byBiZSAib3Zlci1jb25zdHJhaW5l
ZCIgYW5kIG9uZSBvZiB0aGUgdXNlZCB2YWx1ZXMgd2lsbAorICAgICAgICAvLyAgICBoYXZlIHRv
IGJlIGRpZmZlcmVudCBmcm9tIGl0cyBjb21wdXRlZCB2YWx1ZS4gSWYgdGhlICdkaXJlY3Rpb24n
IHByb3BlcnR5IG9mIHRoZSBjb250YWluaW5nIGJsb2NrIGhhcyB0aGUgdmFsdWUgJ2x0cicsIHRo
ZSBzcGVjaWZpZWQgdmFsdWUKKyAgICAgICAgLy8gICAgb2YgJ21hcmdpbi1yaWdodCcgaXMgaWdu
b3JlZCBhbmQgdGhlIHZhbHVlIGlzIGNhbGN1bGF0ZWQgc28gYXMgdG8gbWFrZSB0aGUgZXF1YWxp
dHkgdHJ1ZS4gSWYgdGhlIHZhbHVlIG9mICdkaXJlY3Rpb24nIGlzICdydGwnLAorICAgICAgICAv
LyAgICB0aGlzIGhhcHBlbnMgdG8gJ21hcmdpbi1sZWZ0JyBpbnN0ZWFkLgorICAgICAgICAvLwor
ICAgICAgICAvLyAzLiBJZiB0aGVyZSBpcyBleGFjdGx5IG9uZSB2YWx1ZSBzcGVjaWZpZWQgYXMg
J2F1dG8nLCBpdHMgdXNlZCB2YWx1ZSBmb2xsb3dzIGZyb20gdGhlIGVxdWFsaXR5LgorICAgICAg
ICAvLworICAgICAgICAvLyA0LiBJZiAnd2lkdGgnIGlzIHNldCB0byAnYXV0bycsIGFueSBvdGhl
ciAnYXV0bycgdmFsdWVzIGJlY29tZSAnMCcgYW5kICd3aWR0aCcgZm9sbG93cyBmcm9tIHRoZSBy
ZXN1bHRpbmcgZXF1YWxpdHkuCisgICAgICAgIC8vCisgICAgICAgIC8vIDUuIElmIGJvdGggJ21h
cmdpbi1sZWZ0JyBhbmQgJ21hcmdpbi1yaWdodCcgYXJlICdhdXRvJywgdGhlaXIgdXNlZCB2YWx1
ZXMgYXJlIGVxdWFsLiBUaGlzIGhvcml6b250YWxseSBjZW50ZXJzIHRoZSBlbGVtZW50IHdpdGgg
cmVzcGVjdCB0byB0aGUKKyAgICAgICAgLy8gICAgZWRnZXMgb2YgdGhlIGNvbnRhaW5pbmcgYmxv
Y2suCisKKyAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tXaWR0aCA9IGhvcml6b250YWxDb25z
dHJhaW50cy5sb2dpY2FsV2lkdGg7CisgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9ja1N0eWxl
ID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLnN0eWxlKCk7CisgICAgICAgIGF1dG8mIGJv
eEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gp
OworCisgICAgICAgIGF1dG8gd2lkdGggPSBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcy53aWR0
aCA/IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndpZHRoIDogY29tcHV0ZWRXaWR0aChsYXlv
dXRCb3gsIGNvbnRhaW5pbmdCbG9ja1dpZHRoKTsKKyAgICAgICAgYXV0byBjb21wdXRlZEhvcml6
b250YWxNYXJnaW4gPSBHZW9tZXRyeTo6Y29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKGxheW91dEJv
eCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICAgICAgVXNlZEhvcml6b250YWxNYXJnaW4g
dXNlZEhvcml6b250YWxNYXJnaW47CisgICAgICAgIGF1dG8gYm9yZGVyTGVmdCA9IGJveEdlb21l
dHJ5LmJvcmRlckxlZnQoKTsKKyAgICAgICAgYXV0byBib3JkZXJSaWdodCA9IGJveEdlb21ldHJ5
LmJvcmRlclJpZ2h0KCk7CisgICAgICAgIGF1dG8gcGFkZGluZ0xlZnQgPSBib3hHZW9tZXRyeS5w
YWRkaW5nTGVmdCgpLnZhbHVlT3IoMCk7CisgICAgICAgIGF1dG8gcGFkZGluZ1JpZ2h0ID0gYm94
R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVPcigwKTsKKworICAgICAgICAvLyAjMQorICAg
ICAgICBpZiAod2lkdGgpIHsKKyAgICAgICAgICAgIGF1dG8gaG9yaXpvbnRhbFNwYWNlRm9yTWFy
Z2luID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0
YXJ0LnZhbHVlT3IoMCkgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lkdGggKyBwYWRk
aW5nUmlnaHQgKyBib3JkZXJSaWdodCArIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFs
dWVPcigwKSk7CisgICAgICAgICAgICBpZiAoaG9yaXpvbnRhbFNwYWNlRm9yTWFyZ2luIDwgMCkK
KyAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgY29tcHV0ZWRIb3Jpem9u
dGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQu
dmFsdWVPcigwKSB9OworICAgICAgICB9CisKKyAgICAgICAgLy8gIzIKKyAgICAgICAgaWYgKHdp
ZHRoICYmIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiBjb21wdXRlZEhvcml6b250
YWxNYXJnaW4uZW5kKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmluZ0Jsb2NrU3R5bGUuaXNM
ZWZ0VG9SaWdodERpcmVjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgdXNlZEhvcml6b250YWxN
YXJnaW4uc3RhcnQgPSAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0OworICAgICAgICAg
ICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0g
KHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsg
KndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQpOworICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgPSAqY29tcHV0ZWRI
b3Jpem9udGFsTWFyZ2luLmVuZDsKKyAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdp
bi5zdGFydCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKGJvcmRlckxlZnQgKyBwYWRkaW5nTGVm
dCArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNlZEhvcml6b250YWxN
YXJnaW4uZW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vICMzCisg
ICAgICAgIGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmIHdpZHRoICYmIGNv
bXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQpIHsKKyAgICAgICAgICAgIHVzZWRIb3Jpem9udGFs
TWFyZ2luLmVuZCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kOworICAgICAgICAgICAg
dXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtIChib3Jk
ZXJMZWZ0ICsgcGFkZGluZ0xlZnQgICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmln
aHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOworICAgICAgICB9IGVsc2UgaWYgKGNvbXB1
dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiAhd2lkdGggJiYgY29tcHV0ZWRIb3Jpem9udGFs
TWFyZ2luLmVuZCkgeworICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4gPSB7ICpjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQsICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5k
IH07CisgICAgICAgICAgICB3aWR0aCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jp
em9udGFsTWFyZ2luLnN0YXJ0ICsgYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1Jp
Z2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOworICAgICAgICB9
IGVsc2UgaWYgKGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCAmJiB3aWR0aCAmJiAhY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgeworICAgICAgICAgICAgdXNlZEhvcml6b250YWxN
YXJnaW4uc3RhcnQgPSAqY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0OworICAgICAgICAg
ICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAodXNl
ZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyAqd2lk
dGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7CisgICAgICAgIH0KKworICAgICAgICAv
LyAjNAorICAgICAgICBpZiAoIXdpZHRoKSB7CisgICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1h
cmdpbiA9IHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1
dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9OworICAgICAgICAgICAgd2lkdGgg
PSBjb250YWluaW5nQmxvY2tXaWR0aCAtICh1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJv
cmRlckxlZnQgKyBwYWRkaW5nTGVmdCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgdXNl
ZEhvcml6b250YWxNYXJnaW4uZW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICM1CisgICAg
ICAgIGlmICghY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmICFjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uZW5kKSB7CisgICAgICAgICAgICBhdXRvIGhvcml6b250YWxTcGFjZUZvck1h
cmdpbiA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCAg
KyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7CisgICAgICAgICAgICB1c2Vk
SG9yaXpvbnRhbE1hcmdpbiA9IHsgaG9yaXpvbnRhbFNwYWNlRm9yTWFyZ2luIC8gMiwgaG9yaXpv
bnRhbFNwYWNlRm9yTWFyZ2luIC8gMiB9OworICAgICAgICB9CisKKyAgICAgICAgYXV0byBzaG91
bGRBcHBseUNlbnRlckFsaWduRm9yQmxvY2tDb250ZW50ID0gY29udGFpbmluZ0Jsb2NrU3R5bGUu
dGV4dEFsaWduKCkgPT0gVGV4dEFsaWduTW9kZTo6V2ViS2l0Q2VudGVyICYmIChjb21wdXRlZEhv
cml6b250YWxNYXJnaW4uc3RhcnQgfHwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7Cisg
ICAgICAgIGlmIChzaG91bGRBcHBseUNlbnRlckFsaWduRm9yQmxvY2tDb250ZW50KSB7CisgICAg
ICAgICAgICBhdXRvIGJvcmRlckJveFdpZHRoID0gKGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCAg
KyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7CisgICAgICAgICAgICBhdXRv
IG1hcmdpblN0YXJ0ID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCk7
CisgICAgICAgICAgICBhdXRvIG1hcmdpbkVuZCA9IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5l
bmQudmFsdWVPcigwKTsKKyAgICAgICAgICAgIGF1dG8gY2VudGVyZWRMb2dpY2FsTGVmdEZvck1h
cmdpbkJveCA9IHN0ZDo6bWF4KChjb250YWluaW5nQmxvY2tXaWR0aCAtIGJvcmRlckJveFdpZHRo
IC0gbWFyZ2luU3RhcnQgLSBtYXJnaW5FbmQpIC8gMiwgMF9sdSk7CisgICAgICAgICAgICB1c2Vk
SG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNlbnRlcmVkTG9naWNhbExlZnRGb3JNYXJnaW5Cb3gg
KyBtYXJnaW5TdGFydDsKKyAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9IGNv
bnRhaW5pbmdCbG9ja1dpZHRoIC0gYm9yZGVyQm94V2lkdGggLSBtYXJnaW5TdGFydCArIG1hcmdp
bkVuZDsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlQod2lkdGgpOworCisgICAgICAgIHJldHVy
biBDb250ZW50V2lkdGhBbmRNYXJnaW4geyAqd2lkdGgsIHVzZWRIb3Jpem9udGFsTWFyZ2luIH07
CisgICAgfTsKKworICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFyZ2luID0gY29tcHV0ZSgpOwor
ICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJb
V2lkdGhdW01hcmdpbl0gLT4gaW5mbG93IG5vbi1yZXBsYWNlZCAtPiB3aWR0aCgiIDw8IGNvbnRl
bnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGggPDwgInB4KSBtYXJnaW4oIiA8PCBjb250ZW50
V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCA8PCAicHgsICIgPDwgY29udGVudFdpZHRo
QW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJmxheW91
dEJveCA8PCAiKSIpOworICAgIHJldHVybiBjb250ZW50V2lkdGhBbmRNYXJnaW47Cit9CisKK0Nv
bnRlbnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5G
bG93UmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgUmVwbGFjZWRCb3gmIHJlcGxh
Y2VkQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50
cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFs
VmFsdWVzKQoreworICAgIEFTU0VSVChyZXBsYWNlZEJveC5pc0luRmxvdygpKTsKKworICAgIC8v
IDEwLjMuNCBCbG9jay1sZXZlbCwgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cKKyAg
ICAvLworICAgIC8vIDEuIFRoZSB1c2VkIHZhbHVlIG9mICd3aWR0aCcgaXMgZGV0ZXJtaW5lZCBh
cyBmb3IgaW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLgorICAgIC8vIDIuIFRoZW4gdGhlIHJ1bGVz
IGZvciBub24tcmVwbGFjZWQgYmxvY2stbGV2ZWwgZWxlbWVudHMgYXJlIGFwcGxpZWQgdG8gZGV0
ZXJtaW5lIHRoZSBtYXJnaW5zLgorCisgICAgLy8gIzEKKyAgICBhdXRvIHVzZWRXaWR0aCA9IGlu
bGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFs
Q29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpLmNvbnRlbnRXaWR0
aDsKKyAgICAvLyAjMgorICAgIGF1dG8gbm9uUmVwbGFjZWRXaWR0aEFuZE1hcmdpbiA9IGluRmxv
d05vblJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKHJlcGxhY2VkQm94LCBob3Jpem9udGFs
Q29uc3RyYWludHMsIE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzIHsgdXNlZFdpZHRoLCBvdmVy
cmlkZGVuSG9yaXpvbnRhbFZhbHVlcy5tYXJnaW4gfSk7CisKKyAgICBMT0dfV0lUSF9TVFJFQU0o
Rm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW1dpZHRoXVtNYXJnaW5dIC0+IGlu
ZmxvdyByZXBsYWNlZCAtPiB3aWR0aCgiIDw8IHVzZWRXaWR0aCAgPDwgInB4KSBtYXJnaW4oIiA8
PCBub25SZXBsYWNlZFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uc3RhcnQgPDwgInB4LCAiIDw8
IG5vblJlcGxhY2VkV2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgPDwgInB4KSAtPiBsYXlv
dXRCb3goIiA8PCAmcmVwbGFjZWRCb3ggPDwgIikiKTsKKyAgICByZXR1cm4geyB1c2VkV2lkdGgs
IG5vblJlcGxhY2VkV2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbiB9OworfQorCitMYXlvdXRVbml0
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNWZXJ0aWNhbFBvc2l0aW9u
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJiB2ZXJ0aWNh
bENvbnN0cmFpbnRzKSBjb25zdAoreworICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1My
Mi92aXN1cmVuLmh0bWwjYmxvY2stZm9ybWF0dGluZworICAgIC8vIEluIGEgYmxvY2sgZm9ybWF0
dGluZyBjb250ZXh0LCBib3hlcyBhcmUgbGFpZCBvdXQgb25lIGFmdGVyIHRoZSBvdGhlciwgdmVy
dGljYWxseSwgYmVnaW5uaW5nIGF0IHRoZSB0b3Agb2YgYSBjb250YWluaW5nIGJsb2NrLgorICAg
IC8vIFRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzaWJsaW5nIGJveGVzIGlzIGRl
dGVybWluZWQgYnkgdGhlICdtYXJnaW4nIHByb3BlcnRpZXMuCisgICAgLy8gVmVydGljYWwgbWFy
Z2lucyBiZXR3ZWVuIGFkamFjZW50IGJsb2NrLWxldmVsIGJveGVzIGluIGEgYmxvY2sgZm9ybWF0
dGluZyBjb250ZXh0IGNvbGxhcHNlLgorICAgIGlmIChhdXRvKiBwcmV2aW91c0luRmxvd1NpYmxp
bmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkpIHsKKyAgICAgICAgYXV0byYg
cHJldmlvdXNJbkZsb3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlG
b3JCb3goKnByZXZpb3VzSW5GbG93U2libGluZyk7CisgICAgICAgIHJldHVybiBCb3hHZW9tZXRy
eTo6Ym9yZGVyQm94UmVjdChwcmV2aW91c0luRmxvd0JveEdlb21ldHJ5KS5ib3R0b20oKSArIHBy
ZXZpb3VzSW5GbG93Qm94R2VvbWV0cnkubWFyZ2luQWZ0ZXIoKTsKKyAgICB9CisgICAgcmV0dXJu
IHZlcnRpY2FsQ29uc3RyYWludHMubG9naWNhbFRvcDsKK30KKworTGF5b3V0VW5pdCBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6c3RhdGljSG9yaXpvbnRhbFBvc2l0aW9uKGNvbnN0
IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxD
b25zdHJhaW50cykgY29uc3QKK3sKKyAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjIv
dmlzdXJlbi5odG1sI2Jsb2NrLWZvcm1hdHRpbmcKKyAgICAvLyBJbiBhIGJsb2NrIGZvcm1hdHRp
bmcgY29udGV4dCwgZWFjaCBib3gncyBsZWZ0IG91dGVyIGVkZ2UgdG91Y2hlcyB0aGUgbGVmdCBl
ZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrIChmb3IgcmlnaHQtdG8tbGVmdCBmb3JtYXR0aW5n
LCByaWdodCBlZGdlcyB0b3VjaCkuCisgICAgcmV0dXJuIGhvcml6b250YWxDb25zdHJhaW50cy5s
b2dpY2FsTGVmdCArIGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94
KS5tYXJnaW5TdGFydCgpOworfQorCitQb2ludCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeTo6c3RhdGljUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBWZXJ0aWNhbENvbnN0
cmFpbnRzJiB2ZXJ0aWNhbENvbnN0cmFpbnRzKSBjb25zdAoreworICAgIHJldHVybiB7IHN0YXRp
Y0hvcml6b250YWxQb3NpdGlvbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyksIHN0
YXRpY1ZlcnRpY2FsUG9zaXRpb24obGF5b3V0Qm94LCB2ZXJ0aWNhbENvbnN0cmFpbnRzKSB9Owor
fQorCitDb250ZW50SGVpZ2h0QW5kTWFyZ2luIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5OjppbkZsb3dDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBj
b25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3Qg
T3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpCit7Cisg
ICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpKTsKKworICAgIC8vIDEwLjYuMiBJbmxpbmUg
cmVwbGFjZWQgZWxlbWVudHMsIGJsb2NrLWxldmVsIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1h
bCBmbG93LCAnaW5saW5lLWJsb2NrJworICAgIC8vIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1h
bCBmbG93IGFuZCBmbG9hdGluZyByZXBsYWNlZCBlbGVtZW50cworICAgIGlmIChsYXlvdXRCb3gu
aXNSZXBsYWNlZEJveCgpKQorICAgICAgICByZXR1cm4gaW5saW5lUmVwbGFjZWRDb250ZW50SGVp
Z2h0QW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFs
Q29uc3RyYWludHMsIHsgfSwgb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzKTsKKworICAgIENvbnRl
bnRIZWlnaHRBbmRNYXJnaW4gY29udGVudEhlaWdodEFuZE1hcmdpbjsKKyAgICBpZiAobGF5b3V0
Qm94LmlzT3ZlcmZsb3dWaXNpYmxlKCkgJiYgIWxheW91dEJveC5pc0RvY3VtZW50Qm94KCkpIHsK
KyAgICAgICAgLy8gVE9ETzogRmlndXJlIG91dCB0aGUgY2FzZSBmb3IgdGhlIGRvY3VtZW50IGVs
ZW1lbnQuIExldCdzIGp1c3QgY29tcGxpY2F0ZWQtY2FzZSBpdCBmb3Igbm93LgorICAgICAgICBj
b250ZW50SGVpZ2h0QW5kTWFyZ2luID0gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50SGVpZ2h0QW5k
TWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuVmVydGlj
YWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIDEwLjYuNiBDb21wbGljYXRlZCBj
YXNlcworICAgICAgICAvLyBCbG9jay1sZXZlbCwgbm9uLXJlcGxhY2VkIGVsZW1lbnRzIGluIG5v
cm1hbCBmbG93IHdoZW4gJ292ZXJmbG93JyBkb2VzIG5vdCBjb21wdXRlIHRvICd2aXNpYmxlJyAo
ZXhjZXB0IGlmIHRoZSAnb3ZlcmZsb3cnIHByb3BlcnR5J3MgdmFsdWUgaGFzIGJlZW4gcHJvcGFn
YXRlZCB0byB0aGUgdmlld3BvcnQpLgorICAgICAgICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0g
Y29tcGxpY2F0ZWRDYXNlcyhsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJp
ZGRlblZlcnRpY2FsVmFsdWVzKTsKKyAgICB9CisKKyAgICBhdXRvIHF1aXJrcyA9IGZvcm1hdHRp
bmdDb250ZXh0KCkucXVpcmtzKCk7CisgICAgaWYgKCFxdWlya3MubmVlZHNTdHJldGNoaW5nKGxh
eW91dEJveCkpCisgICAgICAgIHJldHVybiBjb250ZW50SGVpZ2h0QW5kTWFyZ2luOworCisgICAg
Y29udGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID0gcXVpcmtzLnN0cmV0Y2hlZElu
Rmxvd0hlaWdodChsYXlvdXRCb3gsIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4pOworCisgICAgTE9H
X1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwgIltIZWlnaHRd
W01hcmdpbl0gLT4gaW5mbG93IG5vbi1yZXBsYWNlZCAtPiBzdHJlY2hlZCB0byB2aWV3cG9ydCAt
PiBoZWlnaHQoIiA8PCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPDwgInB4
KSBtYXJnaW4oIiA8PCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbi5i
ZWZvcmUgPDwgInB4LCAiIDw8IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFy
Z2luLmFmdGVyIDw8ICJweCkgLT4gbGF5b3V0Qm94KCIgPDwgJmxheW91dEJveCA8PCAiKSIpOwor
ICAgIHJldHVybiBjb250ZW50SGVpZ2h0QW5kTWFyZ2luOworfQorCitDb250ZW50V2lkdGhBbmRN
YXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmluRmxvd0NvbnRlbnRXaWR0
aEFuZE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFp
bnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFs
dWVzJiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94
LmlzSW5GbG93KCkpOworCisgICAgaWYgKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQorICAg
ICAgICByZXR1cm4gaW5GbG93Tm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0
Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKTsK
KyAgICByZXR1cm4gaW5GbG93UmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4oZG93bmNhc3Q8
UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRl
bkhvcml6b250YWxWYWx1ZXMpOworfQorCitDb250ZW50V2lkdGhBbmRNYXJnaW4gQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNvbXB1dGVkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNv
bnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250
YWxDb25zdHJhaW50cywgT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlV2lkdGhGbG9hdEF2
b2lkZXIpCit7CisgICAgYXV0byBjb21wdXRlID0gWyZdIChhdXRvIGNvbnN0cmFpbnRzRm9yV2lk
dGgsIE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRXaWR0aCkgeworICAgICAgICBpZiAobGF5b3V0
Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCisgICAgICAgICAgICByZXR1cm4gZmxvYXRpbmdD
b250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBjb25zdHJhaW50c0ZvcldpZHRoLCB7IHVz
ZWRXaWR0aCwgeyB9IH0pOworCisgICAgICAgIGlmIChsYXlvdXRCb3guaXNJbkZsb3coKSkKKyAg
ICAgICAgICAgIHJldHVybiBpbkZsb3dDb250ZW50V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBj
b25zdHJhaW50c0ZvcldpZHRoLCB7IHVzZWRXaWR0aCwgeyB9IH0pOworCisgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gQ29udGVudFdpZHRoQW5kTWFyZ2luIHsg
fTsKKyAgICB9OworCisgICAgYXV0byBob3Jpem9udGFsQ29uc3RyYWludHNGb3JXaWR0aCA9IGhv
cml6b250YWxDb25zdHJhaW50czsKKyAgICBpZiAobGF5b3V0Qm94LnN0eWxlKCkubG9naWNhbFdp
ZHRoKCkuaXNBdXRvKCkgJiYgYXZhaWxhYmxlV2lkdGhGbG9hdEF2b2lkZXIpIHsKKyAgICAgICAg
Ly8gV2hpbGUgdGhlIG5vbi1hdXRvIHdpZHRoIHZhbHVlcyBzaG91bGQgYWxsIGJlIHJlc29sdmVk
IGFnYWluc3QgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0aCwgd2hlbgorICAgICAgICAvLyB0
aGUgd2lkdGggaXMgYXV0byB0aGUgYXZhaWxhYmxlIGhvcml6b250YWwgc3BhY2UgaXMgc2hydW5r
IGJ5IG5laWdoYm9yaW5nIGZsb2F0cy4KKyAgICAgICAgaG9yaXpvbnRhbENvbnN0cmFpbnRzRm9y
V2lkdGgubG9naWNhbFdpZHRoID0gKmF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyOworICAgIH0K
KyAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUoaG9yaXpvbnRhbENvbnN0
cmFpbnRzRm9yV2lkdGgsIHsgfSk7CisgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGhvcml6b250
YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7CisgICAgaWYgKGF1dG8gbWF4V2lkdGggPSBjb21w
dXRlZE1heFdpZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpKSB7CisgICAgICAgIGF1dG8g
bWF4V2lkdGhBbmRNYXJnaW4gPSBjb21wdXRlKGhvcml6b250YWxDb25zdHJhaW50cywgbWF4V2lk
dGgpOworICAgICAgICBpZiAoY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA+IG1h
eFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkKKyAgICAgICAgICAgIGNvbnRlbnRXaWR0aEFu
ZE1hcmdpbiA9IG1heFdpZHRoQW5kTWFyZ2luOworICAgIH0KKworICAgIGF1dG8gbWluV2lkdGgg
PSBjb21wdXRlZE1pbldpZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpLnZhbHVlT3IoMCk7
CisgICAgYXV0byBtaW5XaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUoaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCBtaW5XaWR0aCk7CisgICAgaWYgKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lk
dGggPCBtaW5XaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCisgICAgICAgIGNvbnRlbnRXaWR0
aEFuZE1hcmdpbiA9IG1pbldpZHRoQW5kTWFyZ2luOworICAgIHJldHVybiBjb250ZW50V2lkdGhB
bmRNYXJnaW47Cit9CisKK0Zvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzKGNvbnN0IEJveCYgbGF5b3V0Qm94KQoreworICAgIGF1dG8gZml4ZWRNYXJnaW5Cb3Jk
ZXJBbmRQYWRkaW5nID0gWyZdKGF1dG8mIGxheW91dEJveCkgeworICAgICAgICBhdXRvJiBzdHls
ZSA9IGxheW91dEJveC5zdHlsZSgpOworICAgICAgICByZXR1cm4gZml4ZWRWYWx1ZShzdHlsZS5t
YXJnaW5TdGFydCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIExheW91dFVuaXQgeyBzdHls
ZS5ib3JkZXJMZWZ0V2lkdGgoKSB9CisgICAgICAgICAgICArIGZpeGVkVmFsdWUoc3R5bGUucGFk
ZGluZ0xlZnQoKSkudmFsdWVPcigwKQorICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0eWxlLnBh
ZGRpbmdSaWdodCgpKS52YWx1ZU9yKDApCisgICAgICAgICAgICArIExheW91dFVuaXQgeyBzdHls
ZS5ib3JkZXJSaWdodFdpZHRoKCkgfQorICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0eWxlLm1h
cmdpbkVuZCgpKS52YWx1ZU9yKDApOworICAgIH07CisKKyAgICBhdXRvIGNvbXB1dGVkSW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cyA9IFsmXSgpIC0+IEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMg
eworICAgICAgICBhdXRvIGxvZ2ljYWxXaWR0aCA9IGxheW91dEJveC5zdHlsZSgpLmxvZ2ljYWxX
aWR0aCgpOworICAgICAgICAvLyBNaW5pbXVtL21heGltdW0gd2lkdGggY2FuJ3QgYmUgZGVwZW5k
aW5nIG9uIHRoZSBjb250YWluaW5nIGJsb2NrJ3Mgd2lkdGguCisgICAgICAgIGF1dG8gbmVlZHNS
ZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRoID0gbG9naWNhbFdpZHRoLmlzQ2FsY3VsYXRlZCgp
IHx8IGxvZ2ljYWxXaWR0aC5pc1BlcmNlbnQoKSB8fCBsb2dpY2FsV2lkdGguaXNSZWxhdGl2ZSgp
OworICAgICAgICBpZiAobmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRoKQorICAgICAg
ICAgICAgcmV0dXJuIHsgfTsKKworICAgICAgICBpZiAoYXV0byB3aWR0aCA9IGZpeGVkVmFsdWUo
bG9naWNhbFdpZHRoKSkKKyAgICAgICAgICAgIHJldHVybiB7ICp3aWR0aCwgKndpZHRoIH07CisK
KyAgICAgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpIHsKKyAgICAgICAgICAgIGF1
dG8mIHJlcGxhY2VkQm94ID0gZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCk7CisgICAg
ICAgICAgICBpZiAocmVwbGFjZWRCb3guaGFzSW50cmluc2ljV2lkdGgoKSkgeworICAgICAgICAg
ICAgICAgIGF1dG8gcmVwbGFjZWRXaWR0aCA9IHJlcGxhY2VkQm94LmludHJpbnNpY1dpZHRoKCk7
CisgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVwbGFjZWRXaWR0aCwgcmVwbGFjZWRXaWR0aCB9
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgfQorCisg
ICAgICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxDb250
YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCisgICAgICAg
ICAgICByZXR1cm4geyB9OworCisgICAgICAgIGlmIChsYXlvdXRCb3guaXNTaXplQ29udGFpbm1l
bnRCb3goKSkgeworICAgICAgICAgICAgLy8gVGhlIGludHJpbnNpYyBzaXplcyBvZiB0aGUgc2l6
ZSBjb250YWlubWVudCBib3ggYXJlIGRldGVybWluZWQgYXMgaWYgdGhlIGVsZW1lbnQgaGFkIG5v
IGNvbnRlbnQsCisgICAgICAgICAgICAvLyBmb2xsb3dpbmcgdGhlIHNhbWUgbG9naWMgYXMgd2hl
biBzaXppbmcgYXMgaWYgZW1wdHkuCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICB9
CisKKyAgICAgICAgaWYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkp
IHsKKyAgICAgICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IExheW91dENv
bnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5
b3V0Qm94KSwgbGF5b3V0U3RhdGUoKSktPmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cygpOworICAgICAgICAgICAgaWYgKGxvZ2ljYWxXaWR0aC5pc01pbkNvbnRlbnQoKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4geyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0sIGlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSB9OworICAgICAgICAgICAgaWYgKGxvZ2lj
YWxXaWR0aC5pc01heENvbnRlbnQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4geyBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWF4
aW11bSB9OworICAgICAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Cisg
ICAgICAgIH0KKworICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKKyAgICAgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRl
ID0gbGF5b3V0U3RhdGUoKS5mb3JtYXR0aW5nU3RhdGVGb3JCb3gobGF5b3V0Qm94KTsKKyAgICAg
ICAgZm9yIChhdXRvJiBjaGlsZCA6IGNoaWxkcmVuT2ZUeXBlPEJveD4oZG93bmNhc3Q8Q29udGFp
bmVyQm94PihsYXlvdXRCb3gpKSkgeworICAgICAgICAgICAgaWYgKGNoaWxkLmlzT3V0T2ZGbG93
UG9zaXRpb25lZCgpIHx8IChjaGlsZC5pc0Zsb2F0QXZvaWRlcigpICYmICFjaGlsZC5oYXNGbG9h
dENsZWFyKCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYXV0byBj
aGlsZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBmb3JtYXR0aW5nU3RhdGUuaW50cmluc2lj
V2lkdGhDb25zdHJhaW50c0ZvckJveChjaGlsZCk7CisgICAgICAgICAgICBBU1NFUlQoY2hpbGRJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKTsKKworICAgICAgICAgICAgaW50cmluc2ljV2lkdGhD
b25zdHJhaW50cy5taW5pbXVtID0gc3RkOjptYXgoaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5t
aW5pbXVtLCBjaGlsZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMtPm1pbmltdW0pOworICAgICAg
ICAgICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtID0gc3RkOjptYXgoaW50cmlu
c2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtLCBjaGlsZEludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMtPm1heGltdW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzOworICAgIH07CisgICAgLy8gRklYTUUgQ2hlY2sgZm9yIGJveC1zaXppbmc6IGJv
cmRlci1ib3g7CisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gY29uc3RyYWlu
QnlNaW5NYXhXaWR0aChsYXlvdXRCb3gsIGNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cygpKTsKKyAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLmV4cGFuZChmaXhlZE1hcmdpbkJv
cmRlckFuZFBhZGRpbmcobGF5b3V0Qm94KSk7CisgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHM7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRR
dWlya3MuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9j
ay9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43MWIwODg0MjAz
ZGM4NmE2NzM2YWJjOGViZGFmMmE1ZWYxZDU4NmFlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9jay9CbG9ja0Zvcm1hdHRpbmdD
b250ZXh0UXVpcmtzLmNwcApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBF
TkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkJsb2NrRm9ybWF0
dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94
R2VvbWV0cnkuaCIKKyNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNsdWRlICJM
YXlvdXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3N0YXRpYyBib29s
IGlzUXVpcmtDb250YWluZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgcmV0dXJuIGxh
eW91dEJveC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpIHx8IGxheW91
dEJveC5pc1RhYmxlQ2VsbCgpOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1
aXJrczo6bmVlZHNTdHJldGNoaW5nKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAg
IEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSk7CisgICAgLy8gSW4gcXVpcmtzIG1vZGUsIGlu
LWZsb3cgYm9keSBhbmQgaHRtbCBzdHJldGNoIHRvIHRoZSBpbml0aWFsIGNvbnRhaW5pbmcgYmxv
Y2sgKGhlaWdodDogYXV0byBvbmx5KS4KKyAgICBpZiAoIWxheW91dFN0YXRlKCkuaW5RdWlya3NN
b2RlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghbGF5b3V0Qm94LmlzRG9j
dW1lbnRCb3goKSAmJiAhbGF5b3V0Qm94LmlzQm9keUJveCgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICByZXR1cm4gbGF5b3V0Qm94LnN0eWxlKCkubG9naWNhbEhlaWdodCgpLmlzQXV0
bygpOworfQorCitMYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6c3Ry
ZXRjaGVkSW5GbG93SGVpZ2h0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBDb250ZW50SGVpZ2h0QW5k
TWFyZ2luIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4pCit7CisgICAgQVNTRVJUKG5lZWRzU3RyZXRj
aGluZyhsYXlvdXRCb3gpKTsKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZv
cm1hdHRpbmdDb250ZXh0KCk7CisgICAgYXV0byBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiA9
IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSArIGNvbnRl
bnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmFmdGVyOworCisgICAgaWYgKGxh
eW91dEJveC5pc0RvY3VtZW50Qm94KCkpIHsKKyAgICAgICAgLy8gTGV0J3Mgc3RyZXRjaCB0aGUg
aW5mbG93IGRvY3VtZW50IGJveCg8aHRtbD4pIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGluaXRpYWwg
Y29udGFpbmluZyBibG9jayAodmlldykuCisgICAgICAgIGF1dG8gZG9jdW1lbnRCb3hDb250ZW50
SGVpZ2h0ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LmluaXRp
YWxDb250YWluaW5nQmxvY2soKSwgRXNjYXBlUmVhc29uOjpEb2N1bWVudEJveFN0cmV0Y2hlc1Rv
Vmlld3BvcnRRdWlyaykuY29udGVudEJveEhlaWdodCgpOworICAgICAgICAvLyBEb2N1bWVudCBi
b3gncyBvd24gdmVydGljYWwgbWFyZ2luL2JvcmRlci9wYWRkaW5nIHZhbHVlcyBhbHdheXMgc2hy
aW5rIHRoZSBjb250ZW50IGhlaWdodC4KKyAgICAgICAgYXV0byYgZG9jdW1lbnRCb3hHZW9tZXRy
eSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAgICAg
IGRvY3VtZW50Qm94Q29udGVudEhlaWdodCAtPSBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiAr
IGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50Qm94R2VvbWV0
cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWF4
KGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCwgIGRvY3VtZW50Qm94Q29udGVu
dEhlaWdodCk7CisgICAgfQorCisgICAgLy8gSGVyZSBpcyB0aGUgcXVpcmt5IHBhcnQgZm9yIGJv
ZHkgYm94IHdoZW4gaXQgc3RyZXRjaGVzIGFsbCB0aGUgd2F5IHRvIHRoZSBJQ0IgZXZlbiB3aGVu
IHRoZSBkb2N1bWVudCBib3ggZG9lcyBub3QgKGUuZy4gb3V0LW9mLWZsb3cgcG9zaXRpb25lZCku
CisgICAgQVNTRVJUKGxheW91dEJveC5pc0JvZHlCb3goKSk7CisgICAgYXV0byYgaW5pdGlhbENv
bnRhaW5pbmdCbG9jayA9IGxheW91dEJveC5pbml0aWFsQ29udGFpbmluZ0Jsb2NrKCk7CisgICAg
YXV0byYgaW5pdGlhbENvbnRhaW5pbmdCbG9ja0dlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQu
Z2VvbWV0cnlGb3JCb3goaW5pdGlhbENvbnRhaW5pbmdCbG9jaywgRXNjYXBlUmVhc29uOjpCb2R5
U3RyZXRjaGVzVG9WaWV3cG9ydFF1aXJrKTsKKyAgICAvLyBTdGFydCB0aGUgY29udGVudCBoZWln
aHQgd2l0aCB0aGUgSUNCLgorICAgIGF1dG8gYm9keUJveENvbnRlbnRIZWlnaHQgPSBpbml0aWFs
Q29udGFpbmluZ0Jsb2NrR2VvbWV0cnkuY29udGVudEJveEhlaWdodCgpOworICAgIC8vIEJvZHkg
Ym94J3Mgb3duIGJvcmRlciBhbmQgcGFkZGluZyBzaHJpbmsgdGhlIGNvbnRlbnQgaGVpZ2h0Lgor
ICAgIGF1dG8mIGJvZHlCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9y
Qm94KGxheW91dEJveCk7CisgICAgYm9keUJveENvbnRlbnRIZWlnaHQgLT0gYm9keUJveEdlb21l
dHJ5LnZlcnRpY2FsQm9yZGVyKCkgKyBib2R5Qm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCku
dmFsdWVPcigwKTsKKyAgICAvLyBCb2R5IGJveCBuZXZlciBjb2xsYXBzZXMgaXRzIHZlcnRpY2Fs
IG1hcmdpbnMgd2l0aCB0aGUgZG9jdW1lbnQgYm94IGJ1dCBpdCBtaWdodCBjb2xsYXBzZSBpdHMg
bWFyZ2luIHdpdGggaXRzIGRlc2NlbmRhbnRzLgorICAgIGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2lu
ID0gY29udGVudEhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJnaW47CisgICAgYXV0byBj
b2xsYXBzZWRNYXJnaW4gPSBmb3JtYXR0aW5nQ29udGV4dC5tYXJnaW5Db2xsYXBzZSgpLmNvbGxh
cHNlZFZlcnRpY2FsVmFsdWVzKGxheW91dEJveCwgbm9uQ29sbGFwc2VkTWFyZ2luKS5jb2xsYXBz
ZWRWYWx1ZXM7CisgICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBjb2xsYXBzZWRNYXJnaW4u
YmVmb3JlLnZhbHVlT3Iobm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSk7CisgICAgdXNlZFZlcnRp
Y2FsTWFyZ2luICs9IGNvbGxhcHNlZE1hcmdpbi5pc0NvbGxhcHNlZFRocm91Z2ggPyBub25Db2xs
YXBzZWRNYXJnaW4uYWZ0ZXIgOiBjb2xsYXBzZWRNYXJnaW4uYWZ0ZXIudmFsdWVPcihub25Db2xs
YXBzZWRNYXJnaW4uYWZ0ZXIpOworICAgIGJvZHlCb3hDb250ZW50SGVpZ2h0IC09IHVzZWRWZXJ0
aWNhbE1hcmdpbjsKKyAgICAvLyBEb2N1bWVudCBib3gncyBwYWRkaW5nIGFuZCBib3JkZXIgYWxz
byBzaHJpbmsgdGhlIGJvZHkgYm94J3MgY29udGVudCBoZWlnaHQuCisgICAgYXV0byYgZG9jdW1l
bnRCb3ggPSBsYXlvdXRCb3gucGFyZW50KCk7CisgICAgYXV0byYgZG9jdW1lbnRCb3hHZW9tZXRy
eSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGRvY3VtZW50Qm94LCBFc2NhcGVS
ZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspOworICAgIGJvZHlCb3hDb250ZW50
SGVpZ2h0IC09IGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50
Qm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKKyAgICAvLyBIb3dldmVy
IHRoZSBub24taW4tZmxvdyBkb2N1bWVudCBib3gncyB2ZXJ0aWNhbCBtYXJnaW5zIGFyZSBpZ25v
cmVkLiBUaGV5IGRvbid0IGFmZmVjdCB0aGUgYm9keSBib3gncyBjb250ZW50IGhlaWdodC4KKyAg
ICBpZiAoZG9jdW1lbnRCb3guaXNJbkZsb3coKSkgeworICAgICAgICBhdXRvIGdlb21ldHJ5ID0g
dGhpcy0+Z2VvbWV0cnkoKTsKKyAgICAgICAgYXV0byBwcmVjb21wdXRlRG9jdW1lbnRCb3hWZXJ0
aWNhbE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkVmVydGljYWxNYXJnaW4oZG9jdW1lbnRCb3gs
IGdlb21ldHJ5LmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChpbml0aWFsQ29udGFpbmluZ0Js
b2NrLCBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspLmhvcml6b250
YWwpOworICAgICAgICBib2R5Qm94Q29udGVudEhlaWdodCAtPSBwcmVjb21wdXRlRG9jdW1lbnRC
b3hWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigwKSArIHByZWNvbXB1dGVEb2N1bWVudEJv
eFZlcnRpY2FsTWFyZ2luLmFmdGVyLnZhbHVlT3IoMCk7CisgICAgfQorICAgIHJldHVybiBzdGQ6
Om1heChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQsICBib2R5Qm94Q29udGVu
dEhlaWdodCk7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpzaG91
bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbGF5b3V0U3RhdGUoKS5pblF1aXJrc01vZGUoKSAmJiBpc1F1aXJrQ29u
dGFpbmVyKGxheW91dEJveCk7Cit9CisKK2VudW0gY2xhc3MgVmVydGljYWxNYXJnaW4geyBCZWZv
cmUsIEFmdGVyIH07CitzdGF0aWMgaW5saW5lIGJvb2wgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNl
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBWZXJ0aWNhbE1hcmdpbiB2ZXJ0aWNhbE1hcmdpbikKK3sK
KyAgICBpZiAoIWxheW91dEJveC5pc0luRmxvdygpKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICByZXR1cm4gKHZlcnRpY2Fs
TWFyZ2luID09IFZlcnRpY2FsTWFyZ2luOjpCZWZvcmUgJiYgc3R5bGUuaGFzTWFyZ2luQmVmb3Jl
UXVpcmsoKSkgfHwgKHZlcnRpY2FsTWFyZ2luID09IFZlcnRpY2FsTWFyZ2luOjpBZnRlciAmJiBz
dHlsZS5oYXNNYXJnaW5BZnRlclF1aXJrKCkpOworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQ6OlF1aXJrczo6c2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50TWFyZ2lu
QmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIHJldHVybiBsYXlvdXRT
dGF0ZSgpLmluUXVpcmtzTW9kZSgpICYmIGhhc1F1aXJrTWFyZ2luVG9Db2xsYXBzZShsYXlvdXRC
b3gsIFZlcnRpY2FsTWFyZ2luOjpCZWZvcmUpICYmIGlzUXVpcmtDb250YWluZXIobGF5b3V0Qm94
LmNvbnRhaW5pbmdCbG9jaygpKTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpR
dWlya3M6OnNob3VsZENvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29u
c3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxheW91dFN0YXRlKCkuaW5R
dWlya3NNb2RlKCkgJiYgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGxheW91dEJveCwgVmVydGlj
YWxNYXJnaW46OkFmdGVyKSAmJiBpc1F1aXJrQ29udGFpbmVyKGxheW91dEJveC5jb250YWluaW5n
QmxvY2soKSk7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2svQmxvY2tG
b3JtYXR0aW5nU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmI3NGE1MGZmNjkxM2FkMTJhMDhkNTJlMzkw
Mjc1OTEwNzdmMjMzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmNwcApAQCAtMCww
ICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4K
KyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJs
b2NrRm9ybWF0dGluZ1N0YXRlLmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09O
VEVYVCkKKworI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lN
UEwoQmxvY2tGb3JtYXR0aW5nU3RhdGUpOworCitCbG9ja0Zvcm1hdHRpbmdTdGF0ZTo6QmxvY2tG
b3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0
U3RhdGUmIGxheW91dFN0YXRlKQorICAgIDogRm9ybWF0dGluZ1N0YXRlKFdURk1vdmUoZmxvYXRp
bmdTdGF0ZSksIFR5cGU6OkJsb2NrLCBsYXlvdXRTdGF0ZSkKK3sKK30KKworQmxvY2tGb3JtYXR0
aW5nU3RhdGU6On5CbG9ja0Zvcm1hdHRpbmdTdGF0ZSgpCit7Cit9CisKK30KK30KKyNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9j
ay9CbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9ibG9jay9CbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFlNmNk
NjE5ZGQzMTZmNTliM2Y0MDliZjM1ZDcwOTZkOWZiN2M4YjEKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrL0Jsb2NrRm9ybWF0
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
cm1hdHRpbmdDb250ZXh0cy9ibG9jay9CbG9ja01hcmdpbkNvbGxhcHNlLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2svQmxvY2tNYXJnaW5Db2xsYXBz
ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uZjFmZDViYmUyMmExYWI5MmU4NTFkODUwZGUwZjRhNmFkMTg3MTBk
YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvYmxvY2svQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAKQEAgLTAsMCArMSw2MDcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5n
Q29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNp
bmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUu
aCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRC
b3guaCIKKyNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRV
bml0LmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
bmFtZXNwYWNlIExheW91dCB7CisKK3N0YXRpYyBib29sIGhhc0JvcmRlcihjb25zdCBCb3JkZXJW
YWx1ZSYgYm9yZGVyVmFsdWUpCit7CisgICAgaWYgKGJvcmRlclZhbHVlLnN0eWxlKCkgPT0gQm9y
ZGVyU3R5bGU6Ok5vbmUgfHwgYm9yZGVyVmFsdWUuc3R5bGUoKSA9PSBCb3JkZXJTdHlsZTo6SGlk
ZGVuKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuICEhYm9yZGVyVmFsdWUud2lk
dGgoKTsKK30KKworc3RhdGljIGJvb2wgaGFzUGFkZGluZyhjb25zdCBMZW5ndGgmIHBhZGRpbmdW
YWx1ZSkKK3sKKyAgICAvLyBGSVhNRTogQ2hlY2sgaWYgcGVyY2VudCB2YWx1ZSBuZWVkcyB0byBi
ZSByZXNvbHZlZC4KKyAgICByZXR1cm4gIXBhZGRpbmdWYWx1ZS5pc1plcm8oKTsKK30KKworc3Rh
dGljIGJvb2wgaGFzQm9yZGVyQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KQoreworICAgIHJl
dHVybiBoYXNCb3JkZXIobGF5b3V0Qm94LnN0eWxlKCkuYm9yZGVyQmVmb3JlKCkpOworfQorCitz
dGF0aWMgYm9vbCBoYXNCb3JkZXJBZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICBy
ZXR1cm4gaGFzQm9yZGVyKGxheW91dEJveC5zdHlsZSgpLmJvcmRlckFmdGVyKCkpOworfQorCitz
dGF0aWMgYm9vbCBoYXNQYWRkaW5nQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KQoreworICAg
IHJldHVybiBoYXNQYWRkaW5nKGxheW91dEJveC5zdHlsZSgpLnBhZGRpbmdCZWZvcmUoKSk7Cit9
CisKK3N0YXRpYyBib29sIGhhc1BhZGRpbmdBZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkKK3sK
KyAgICByZXR1cm4gaGFzUGFkZGluZyhsYXlvdXRCb3guc3R5bGUoKS5wYWRkaW5nQWZ0ZXIoKSk7
Cit9CisKK3N0YXRpYyBib29sIGVzdGFibGlzaGVzQmxvY2tGb3JtYXR0aW5nQ29udGV4dChjb25z
dCBCb3gmIGxheW91dEJveCkKK3sKKyAgICAvLyBXZWJLaXQgdHJlYXRzIHRoZSBkb2N1bWVudCBl
bGVtZW50IHJlbmRlcmVyIGFzIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QuIEl0IHBy
b2JhYmx5IG9ubHkgaW1wYWN0cyBtYXJnaW4gY29sbGFwc2luZywgc28gbGV0J3Mgbm90IGRvCisg
ICAgLy8gYSBsYXlvdXQgd2lkZSBxdWlyayBvbiB0aGlzIGZvciBub3cuCisgICAgaWYgKGxheW91
dEJveC5pc0RvY3VtZW50Qm94KCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBs
YXlvdXRCb3guZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCk7Cit9CisKK2Jvb2wg
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Omhhc0NsZWFyYW5jZShjb25z
dCBCb3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBpZiAoIWxheW91dEJveC5oYXNGbG9hdENs
ZWFyKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBGSVhNRTogcHJlY29tcHV0ZWRW
ZXJ0aWNhbFBvc2l0aW9uRm9yRm9ybWF0dGluZ1Jvb3QgbG9naWMgZW5kcyB1cCBjYWxsaW5nIGlu
dG8gdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBsYXlvdXRCb3ggKGZpcnN0IGluZmxvdyBjaGlsZCkg
aGFzCisgICAgLy8gbm90IGJlZW4gbGFpZCBvdXQuCisgICAgcmV0dXJuIGZvcm1hdHRpbmdDb250
ZXh0KCkuZm9ybWF0dGluZ1N0YXRlKCkuaGFzQ2xlYXJhbmNlKGxheW91dEJveCk7Cit9CisKK2Jv
b2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUNv
bGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QK
K3sKKyAgICAvLyAxLiBUaGlzIGlzIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgYW5kIGl0cyBtYXJn
aW5zIGNvbGxhcHNlIHRocm91Z2ggYW5kIHRoZSBtYXJnaW4gYWZ0ZXIgY29sbGFwc2VzIHdpdGgg
cGFyZW50J3MgbWFyZ2luIGFmdGVyIG9yCisgICAgLy8gMi4gVGhpcyBib3gncyBtYXJnaW4gYWZ0
ZXIgY29sbGFwc2VzIHdpdGggdGhlIG5leHQgc2libGluZydzIG1hcmdpbiBiZWZvcmUgYW5kIHRo
YXQgc2libGluZyBjb2xsYXBzZXMgdGhyb3VnaCBhbmQKKyAgICAvLyB3ZSBjYW4gZ2V0IHRvIHRo
ZSBsYXN0IGluLWZsb3cgY2hpbGQgbGlrZSB0aGF0LgorICAgIGF1dG8qIGxhc3RJbkZsb3dDaGls
ZCA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5sYXN0SW5GbG93Q2hpbGQoKTsKKyAgICBm
b3IgKGF1dG8qIGN1cnJlbnRCb3ggPSAmbGF5b3V0Qm94OyBjdXJyZW50Qm94OyBjdXJyZW50Qm94
ID0gY3VycmVudEJveC0+bmV4dEluRmxvd1NpYmxpbmcoKSkgeworICAgICAgICBpZiAoIW1hcmdp
bnNDb2xsYXBzZVRocm91Z2goKmN1cnJlbnRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICBpZiAoY3VycmVudEJveCA9PSBsYXN0SW5GbG93Q2hpbGQpCisgICAgICAgICAg
ICByZXR1cm4gbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoKmN1cnJl
bnRCb3gpOyAKKyAgICAgICAgaWYgKCFtYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhOZXh0U2libGlu
Z01hcmdpbkJlZm9yZSgqY3VycmVudEJveCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKwor
Ym9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVmb3Jl
Q29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCkgY29u
c3QKK3sKKyAgICAvLyBUaGUgZmlyc3QgaW5mbG93IGNoaWxkIGNvdWxkIHByb3BhZ2F0ZSBpdHMg
dG9wIG1hcmdpbiB0byBwYXJlbnQuCisgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIx
L2JveC5odG1sI2NvbGxhcHNpbmctbWFyZ2lucworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9j
a0xldmVsQm94KCkpOworCisgICAgaWYgKGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hv
dWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxheW91dEJveCkp
CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gTWFyZ2lucyBiZXR3ZWVuIGEgZmxvYXRl
ZCBib3ggYW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxhcHNlLgorICAgIGlmIChsYXlvdXRC
b3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Ly8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNl
LgorICAgIGlmIChsYXlvdXRCb3guaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIC8vIE1hcmdpbnMgb2YgaW5saW5lLWJsb2NrIGJveGVzIGRvIG5v
dCBjb2xsYXBzZS4KKyAgICBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxvY2tCb3goKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gT25seSB0aGUgZmlyc3QgaW5sZmxvdyBjaGlsZCBj
b2xsYXBzZXMgd2l0aCBwYXJlbnQuCisgICAgaWYgKGxheW91dEJveC5wcmV2aW91c0luRmxvd1Np
YmxpbmcoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYXV0byYgY29udGFpbmluZ0Js
b2NrID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpOworICAgIC8vIE1hcmdpbnMgb2YgZWxl
bWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90
IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJlbgorICAgIGlmIChlc3RhYmxpc2hl
c0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmluZ0Jsb2NrKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKGhhc0JvcmRlckJlZm9yZShjb250YWluaW5nQmxvY2spKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShjb250YWluaW5n
QmxvY2spKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyAuLi5hbmQgdGhlIGNoaWxk
IGhhcyBubyBjbGVhcmFuY2UuCisgICAgaWYgKGhhc0NsZWFyYW5jZShsYXlvdXRCb3gpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0
aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAor
eworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworCisgICAgaWYgKCFs
YXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2libGluZyA9ICpsYXlvdXRCb3gucHJldmlvdXNJ
bkZsb3dTaWJsaW5nKCk7CisgICAgLy8gTWFyZ2lucyBiZXR3ZWVuIGEgZmxvYXRlZCBib3ggYW5k
IGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxhcHNlLgorICAgIGlmIChsYXlvdXRCb3guaXNGbG9h
dGluZ1Bvc2l0aW9uZWQoKSB8fCBwcmV2aW91c0luRmxvd1NpYmxpbmcuaXNGbG9hdGluZ1Bvc2l0
aW9uZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTWFyZ2lucyBvZiBhYnNv
bHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgorICAgIGlmICgobGF5b3V0
Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFsYXlvdXRCb3guc3R5bGUoKS50b3AoKS5p
c0F1dG8oKSkKKyAgICAgICAgfHwgKHByZXZpb3VzSW5GbG93U2libGluZy5pc091dE9mRmxvd1Bv
c2l0aW9uZWQoKSAmJiAhcHJldmlvdXNJbkZsb3dTaWJsaW5nLnN0eWxlKCkuYm90dG9tKCkuaXNB
dXRvKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBNYXJnaW5zIG9mIGlubGlu
ZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCisgICAgaWYgKGxheW91dEJveC5pc0lubGlu
ZUJsb2NrQm94KCkgfHwgcHJldmlvdXNJbkZsb3dTaWJsaW5nLmlzSW5saW5lQmxvY2tCb3goKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4g
aW4tZmxvdyBibG9jay1sZXZlbCBlbGVtZW50IGFsd2F5cyBjb2xsYXBzZXMgd2l0aCB0aGUgdG9w
IG1hcmdpbiBvZgorICAgIC8vIGl0cyBuZXh0IGluLWZsb3cgYmxvY2stbGV2ZWwgc2libGluZywg
dW5sZXNzIHRoYXQgc2libGluZyBoYXMgY2xlYXJhbmNlLgorICAgIGlmIChoYXNDbGVhcmFuY2Uo
bGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9
CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJl
Zm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYg
bGF5b3V0Qm94KSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94
KCkpOworICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2Nr
IGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBj
aGlsZHJlbi4KKyAgICBpZiAoZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGxheW91
dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFRoZSB0b3AgbWFyZ2luIG9m
IGFuIGluLWZsb3cgYmxvY2sgZWxlbWVudCBjb2xsYXBzZXMgd2l0aCBpdHMgZmlyc3QgaW4tZmxv
dyBibG9jay1sZXZlbAorICAgIC8vIGNoaWxkJ3MgdG9wIG1hcmdpbiBpZiB0aGUgZWxlbWVudCBo
YXMgbm8gdG9wIGJvcmRlci4uLgorICAgIGlmIChoYXNCb3JkZXJCZWZvcmUobGF5b3V0Qm94KSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gLi4ubm8gdG9wIHBhZGRpbmcKKyAgICBp
ZiAoaGFzUGFkZGluZ0JlZm9yZShsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSB8fCAhZG93bmNhc3Q8Q29udGFp
bmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxvd0NoaWxkKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGF1dG8mIGZpcnN0SW5GbG93Q2hpbGQgPSAqZG93bmNhc3Q8Q29udGFpbmVyQm94
PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93Q2hpbGQoKTsKKyAgICBpZiAoIWZpcnN0SW5GbG93Q2hp
bGQuaXNCbG9ja0xldmVsQm94KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIC4u
LmFuZCB0aGUgY2hpbGQgaGFzIG5vIGNsZWFyYW5jZS4KKyAgICBpZiAoaGFzQ2xlYXJhbmNlKGZp
cnN0SW5GbG93Q2hpbGQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBNYXJnaW5z
IG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCisgICAgaWYgKGZpcnN0SW5G
bG93Q2hpbGQuaXNJbmxpbmVCbG9ja0JveCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5D
b2xsYXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoU2libGluZ01hcmdpbkJlZm9yZVdpdGhD
bGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgLy8gSWYgdGhlIHRv
cCBhbmQgYm90dG9tIG1hcmdpbnMgb2YgYW4gZWxlbWVudCB3aXRoIGNsZWFyYW5jZSBhcmUgYWRq
b2luaW5nLCBpdHMgbWFyZ2lucyBjb2xsYXBzZSB3aXRoIHRoZSBhZGpvaW5pbmcgbWFyZ2lucwor
ICAgIC8vIG9mIGZvbGxvd2luZyBzaWJsaW5ncyBidXQgdGhhdCByZXN1bHRpbmcgbWFyZ2luIGRv
ZXMgbm90IGNvbGxhcHNlIHdpdGggdGhlIGJvdHRvbSBtYXJnaW4gb2YgdGhlIHBhcmVudCBibG9j
ay4KKyAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2gobGF5b3V0Qm94KSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgZm9yIChhdXRvKiBwcmV2aW91c1NpYmxpbmcgPSBsYXlvdXRC
b3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7IHByZXZpb3VzU2libGluZzsgcHJldmlvdXNTaWJs
aW5nID0gcHJldmlvdXNTaWJsaW5nLT5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkgeworICAgICAg
ICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKnByZXZpb3VzU2libGluZykpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChoYXNDbGVhcmFuY2UoKnByZXZpb3VzU2li
bGluZykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNl
OworfQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJn
aW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRC
b3gpIGNvbnN0Cit7CisgICAgLy8gMS4gVGhpcyBpcyB0aGUgZmlyc3QgaW4tZmxvdyBjaGlsZCBh
bmQgaXRzIG1hcmdpbnMgY29sbGFwc2UgdGhyb3VnaCBhbmQgdGhlIG1hcmdpbiBiZWZvcmUgY29s
bGFwc2VzIHdpdGggcGFyZW50J3MgbWFyZ2luIGJlZm9yZSBvcgorICAgIC8vIDIuIFRoaXMgYm94
J3MgbWFyZ2luIGJlZm9yZSBjb2xsYXBzZXMgd2l0aCB0aGUgcHJldmlvdXMgc2libGluZydzIG1h
cmdpbiBhZnRlciBhbmQgdGhhdCBzaWJsaW5nIGNvbGxhcHNlcyB0aHJvdWdoIGFuZAorICAgIC8v
IHdlIGNhbiBnZXQgdG8gdGhlIGZpcnN0IGluLWZsb3cgY2hpbGQgbGlrZSB0aGF0LgorICAgIGF1
dG8qIGZpcnN0SW5GbG93Q2hpbGQgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkuZmlyc3RJ
bkZsb3dDaGlsZCgpOworICAgIGZvciAoYXV0byogY3VycmVudEJveCA9ICZsYXlvdXRCb3g7IGN1
cnJlbnRCb3g7IGN1cnJlbnRCb3ggPSBjdXJyZW50Qm94LT5wcmV2aW91c0luRmxvd1NpYmxpbmco
KSkgeworICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKmN1cnJlbnRCb3gpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoY3VycmVudEJveCA9PSBmaXJz
dEluRmxvd0NoaWxkKQorICAgICAgICAgICAgcmV0dXJuIG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dp
dGhQYXJlbnRNYXJnaW5CZWZvcmUoKmN1cnJlbnRCb3gpOyAKKyAgICAgICAgaWYgKCFtYXJnaW5C
ZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5nTWFyZ2luQWZ0ZXIoKmN1cnJlbnRCb3gp
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkFm
dGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3gu
aXNCbG9ja0xldmVsQm94KCkpOworCisgICAgaWYgKGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtz
KCkuc2hvdWxkQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhQYXJlbnRNYXJnaW5BZnRlcihsYXlvdXRC
b3gpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE1hcmdpbnMgYmV0d2VlbiBhIGZs
b2F0ZWQgYm94IGFuZCBhbnkgb3RoZXIgYm94IGRvIG5vdCBjb2xsYXBzZS4KKyAgICBpZiAobGF5
b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIC8vIE1hcmdpbnMgb2YgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJveGVzIGRvIG5vdCBjb2xs
YXBzZS4KKyAgICBpZiAobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBk
byBub3QgY29sbGFwc2UuCisgICAgaWYgKGxheW91dEJveC5pc0lubGluZUJsb2NrQm94KCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE9ubHkgdGhlIGxhc3QgaW5sZmxvdyBjaGls
ZCBjb2xsYXBzZXMgd2l0aCBwYXJlbnQuCisgICAgaWYgKGxheW91dEJveC5uZXh0SW5GbG93U2li
bGluZygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBhdXRvJiBjb250YWluaW5nQmxv
Y2sgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7CisgICAgLy8gTWFyZ2lucyBvZiBlbGVt
ZW50cyB0aGF0IGVzdGFibGlzaCBuZXcgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0cyBkbyBub3Qg
Y29sbGFwc2Ugd2l0aCB0aGVpciBpbi1mbG93IGNoaWxkcmVuLgorICAgIGlmIChlc3RhYmxpc2hl
c0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmluZ0Jsb2NrKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jayBi
b3ggd2l0aCBhICdoZWlnaHQnIG9mICdhdXRvJyBjb2xsYXBzZXMgd2l0aCBpdHMgbGFzdCBpbi1m
bG93IGJsb2NrLWxldmVsIGNoaWxkJ3MgYm90dG9tIG1hcmdpbiwgaWY6CisgICAgaWYgKCFjb250
YWluaW5nQmxvY2suc3R5bGUoKS5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIHBhZGRpbmcsIGFuZAorICAgIGlm
IChoYXNQYWRkaW5nQWZ0ZXIoY29udGFpbmluZ0Jsb2NrKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIGJvcmRlciwgYW5kCisgICAgaWYgKGhh
c0JvcmRlckFmdGVyKGNvbnRhaW5pbmdCbG9jaykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIC8vIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4gbmVpdGhlciBjb2xsYXBzZXMgd2l0aCBh
IHRvcCBtYXJnaW4gdGhhdCBoYXMgY2xlYXJhbmNlLi4uCisgICAgaWYgKG1hcmdpbkFmdGVyQ29s
bGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGxheW91dEJveCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIG5vciAoaWYgdGhlIGJveCdzIG1pbi1oZWln
aHQgaXMgbm9uLXplcm8pIHdpdGggdGhlIGJveCdzIHRvcCBtYXJnaW4uCisgICAgYXV0byBjb21w
dXRlZE1pbkhlaWdodCA9IGNvbnRhaW5pbmdCbG9jay5zdHlsZSgpLmxvZ2ljYWxNaW5IZWlnaHQo
KTsKKyAgICBpZiAoIWNvbXB1dGVkTWluSGVpZ2h0LmlzQXV0bygpICYmIGNvbXB1dGVkTWluSGVp
Z2h0LnZhbHVlKCkgJiYgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3Jl
KGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOwor
fQorCitib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5B
ZnRlckNvbGxhcHNlc1dpdGhMYXN0SW5GbG93Q2hpbGRNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxh
eW91dEJveCkgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgp
KTsKKworICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2Nr
IGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBj
aGlsZHJlbi4KKyAgICBpZiAoZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGxheW91
dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghaXM8Q29udGFpbmVyQm94
PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5G
bG93Q2hpbGQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYXV0byYgbGFzdEluRmxv
d0NoaWxkID0gKmRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5sYXN0SW5GbG93Q2hp
bGQoKTsKKyAgICBpZiAoIWxhc3RJbkZsb3dDaGlsZC5pc0Jsb2NrTGV2ZWxCb3goKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxv
dyBibG9jayBib3ggd2l0aCBhICdoZWlnaHQnIG9mICdhdXRvJyBjb2xsYXBzZXMgd2l0aCBpdHMg
bGFzdCBpbi1mbG93IGJsb2NrLWxldmVsIGNoaWxkJ3MgYm90dG9tIG1hcmdpbiwgaWY6CisgICAg
aWYgKCFsYXlvdXRCb3guc3R5bGUoKS5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIHBhZGRpbmcsIGFuZAorICAg
IGlmIChoYXNQYWRkaW5nQWZ0ZXIobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIGJvcmRlciwgYW5kCisgICAgaWYgKGhhc0Jv
cmRlckFmdGVyKGxheW91dEJveCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIHRo
ZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4gbmVpdGhlciBjb2xsYXBzZXMgd2l0aCBhIHRvcCBtYXJn
aW4gdGhhdCBoYXMgY2xlYXJhbmNlLi4uCisgICAgaWYgKG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0
aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGxhc3RJbkZsb3dDaGlsZCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIG5vciAoaWYgdGhlIGJveCdzIG1pbi1oZWlnaHQg
aXMgbm9uLXplcm8pIHdpdGggdGhlIGJveCdzIHRvcCBtYXJnaW4uCisgICAgYXV0byBjb21wdXRl
ZE1pbkhlaWdodCA9IGxheW91dEJveC5zdHlsZSgpLmxvZ2ljYWxNaW5IZWlnaHQoKTsKKyAgICBp
ZiAoIWNvbXB1dGVkTWluSGVpZ2h0LmlzQXV0bygpICYmIGNvbXB1dGVkTWluSGVpZ2h0LnZhbHVl
KCkKKyAgICAgICAgJiYgKG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9y
ZShsYXN0SW5GbG93Q2hpbGQpIHx8IGhhc0NsZWFyYW5jZShsYXN0SW5GbG93Q2hpbGQpKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTWFyZ2lucyBvZiBpbmxpbmUtYmxvY2sgYm94
ZXMgZG8gbm90IGNvbGxhcHNlLgorICAgIGlmIChsYXN0SW5GbG93Q2hpbGQuaXNJbmxpbmVCbG9j
a0JveCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUaGlzIGlzIGEgcXVpcmsg
YmVoYXZpb3I6IFdoZW4gdGhlIG1hcmdpbiBhZnRlciBvZiB0aGUgbGFzdCBpbmZsb3cgY2hpbGQg
KG9yIGEgcHJldmlvdXMgc2libGluZyB3aXRoIGNvbGxhcHNlZCB0aHJvdWdoIG1hcmdpbnMpCisg
ICAgLy8gY29sbGFwc2VzIHdpdGggYSBxdWlyayBwYXJlbnQncyB0aGUgbWFyZ2luIGJlZm9yZSwg
dGhlbiB0aGUgc2FtZSBtYXJnaW4gYWZ0ZXIgZG9lcyBub3QgY29sbGFwc2VzIHdpdGggdGhlIHBh
cmVudCdzIG1hcmdpbiBhZnRlci4KKyAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3Mo
KS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihsYXlvdXRCb3gpICYmIG1hcmdpbkFm
dGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXN0SW5GbG93Q2hpbGQpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRo
TmV4dFNpYmxpbmdNYXJnaW5CZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7Cisg
ICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7CisKKyAgICBpZiAoIWxheW91
dEJveC5uZXh0SW5GbG93U2libGluZygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBy
ZXR1cm4gbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVy
KCpsYXlvdXRCb3gubmV4dEluRmxvd1NpYmxpbmcoKSk7Cit9CisKK2Jvb2wgQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbnNDb2xsYXBzZVRocm91Z2goY29uc3Qg
Qm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2
ZWxCb3goKSk7CisKKyAgICAvLyBBIGJveCdzIG93biBtYXJnaW5zIGNvbGxhcHNlIGlmIHRoZSAn
bWluLWhlaWdodCcgcHJvcGVydHkgaXMgemVybywgYW5kIGl0IGhhcyBuZWl0aGVyIHRvcCBvciBi
b3R0b20gYm9yZGVycyBub3IgdG9wIG9yIGJvdHRvbSBwYWRkaW5nLAorICAgIC8vIGFuZCBpdCBo
YXMgYSAnaGVpZ2h0JyBvZiBlaXRoZXIgMCBvciAnYXV0bycsIGFuZCBpdCBkb2VzIG5vdCBjb250
YWluIGEgbGluZSBib3gsIGFuZCBhbGwgb2YgaXRzIGluLWZsb3cgY2hpbGRyZW4ncyBtYXJnaW5z
IChpZiBhbnkpIGNvbGxhcHNlLgorICAgIGlmIChoYXNCb3JkZXJCZWZvcmUobGF5b3V0Qm94KSB8
fCBoYXNCb3JkZXJBZnRlcihsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBpZiAoaGFzUGFkZGluZ0JlZm9yZShsYXlvdXRCb3gpIHx8IGhhc1BhZGRpbmdBZnRlcihsYXlv
dXRCb3gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBNYXJnaW5zIGFyZSBub3Qg
YWRqb2luaW5nIHdoZW4gdGhlIGJveCBoYXMgY2xlYXJhbmNlLgorICAgIGlmIChoYXNDbGVhcmFu
Y2UobGF5b3V0Qm94KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYXV0byYgc3R5bGUg
PSBsYXlvdXRCb3guc3R5bGUoKTsKKyAgICBhdXRvIGNvbXB1dGVkSGVpZ2h0VmFsdWVJc1plcm8g
PSBzdHlsZS5oZWlnaHQoKS5pc0ZpeGVkKCkgJiYgIXN0eWxlLmhlaWdodCgpLnZhbHVlKCk7Cisg
ICAgaWYgKCEoc3R5bGUuaGVpZ2h0KCkuaXNBdXRvKCkgfHwgY29tcHV0ZWRIZWlnaHRWYWx1ZUlz
WmVybykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEZJWE1FOiBDaGVjayBmb3Ig
Y29tcHV0ZWQgMCBoZWlnaHQuCisgICAgaWYgKCFzdHlsZS5taW5IZWlnaHQoKS5pc0F1dG8oKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6IEJsb2NrIHJlcGxhY2VkIGJv
eGVzIGNsZWFybHkgZG9uJ3QgY29sbGFwc2UgdGhyb3VnaCB0aGVpciBtYXJnaW5zLCBidXQgSSBj
b3VsZG4ndCBmaW5kIGl0IGluIHRoZSBzcGVjIHlldCAoYW5kIG5vLCBpdCdzIG5vdCBhIHF1aXJr
KS4KKyAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkpCisgICAgICAgIHJl
dHVybiB0cnVlOworCisgICAgaWYgKCFkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCku
aGFzSW5GbG93Q2hpbGQoKSkKKyAgICAgICAgcmV0dXJuICFlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0
dGluZ0NvbnRleHQobGF5b3V0Qm94KTsKKworICAgIGlmIChsYXlvdXRCb3guZXN0YWJsaXNoZXNG
b3JtYXR0aW5nQ29udGV4dCgpKSB7CisgICAgICAgIGlmIChsYXlvdXRCb3guZXN0YWJsaXNoZXNJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7CisgICAgICAgICAgICBhdXRvJiBsYXlvdXRTdGF0
ZSA9IHRoaXMtPmxheW91dFN0YXRlKCk7CisgICAgICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB0
aHJvdWdoIG1hcmdpbiBlc3RpbWF0aW9uLCB3ZSBkb24ndCBuZWNlc3NhcmlseSBoYXZlIGFuIGFj
dHVhbCBzdGF0ZSBmb3IgdGhpcyBsYXlvdXQgYm94IHNpbmNlCisgICAgICAgICAgICAvLyB3ZSBo
YXZlbid0IHN0YXJ0ZWQgbGF5aW5nIGl0IG91dCB5ZXQuCisgICAgICAgICAgICBhdXRvJiBjb250
YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7CisgICAgICAgICAg
ICBpZiAoIWxheW91dFN0YXRlLmhhc0lubGluZUZvcm1hdHRpbmdTdGF0ZShjb250YWluZXJCb3gp
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgYXV0byBpc0Nv
bnNpZGVyZWRFbXB0eSA9IFsmXSB7CisgICAgICAgICAgICAgICAgYXV0byYgaW5saW5lRm9ybWF0
dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUuZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUo
Y29udGFpbmVyQm94KTsKKyAgICAgICAgICAgICAgICBpZiAoIWlubGluZUZvcm1hdHRpbmdTdGF0
ZS5saW5lcygpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAgICAgICAgIC8vIEFueSBmbG9hdCBib3ggaW4gdGhpcyBmb3JtYXR0aW5nIGNvbnRl
eHQgcHJldmVudHMgY29sbGFwc2luZyB0aHJvdWdoLgorICAgICAgICAgICAgICAgIGF1dG8mIGZs
b2F0cyA9IGlubGluZUZvcm1hdHRpbmdTdGF0ZS5mbG9hdGluZ1N0YXRlKCkuZmxvYXRzKCk7Cisg
ICAgICAgICAgICAgICAgZm9yIChhdXRvJiBmbG9hdEl0ZW0gOiBmbG9hdHMpIHsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKGZsb2F0SXRlbS5pc0luRm9ybWF0dGluZ0NvbnRleHRPZihjb250YWlu
ZXJCb3gpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH07Cisg
ICAgICAgICAgICByZXR1cm4gaXNDb25zaWRlcmVkRW1wdHkoKTsKKyAgICAgICAgfQorCisgICAg
ICAgIC8vIEEgcm9vdCBvZiBhIG5vbi1pbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0ICh0YWJsZSwg
ZmxleCBldGMpIHdpdGggaW5mbG93IGRlc2NlbmRhbnRzIHNob3VsZCBub3QgY29sbGFwc2UgdGhy
b3VnaC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoYXV0byogaW5m
bG93Q2hpbGQgPSBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dP
ckZsb2F0aW5nQ2hpbGQoKTsgaW5mbG93Q2hpbGQ7IGluZmxvd0NoaWxkID0gaW5mbG93Q2hpbGQt
Pm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7CisgICAgICAgIGlmIChlc3RhYmxpc2hl
c0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKmluZmxvd0NoaWxkKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgaWYgKCFtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKCppbmZsb3dDaGls
ZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOwor
fQorCitVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMg
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OmNvbXB1dGVkUG9zaXRpdmVB
bmROZWdhdGl2ZU1hcmdpbihVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQ
YWlyOjpWYWx1ZXMgYSwgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFp
cjo6VmFsdWVzIGIpIGNvbnN0Cit7CisgICAgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFu
ZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIGNvbXB1dGVkVmFsdWVzOworICAgIGlmIChhLnBvc2l0aXZl
ICYmIGIucG9zaXRpdmUpCisgICAgICAgIGNvbXB1dGVkVmFsdWVzLnBvc2l0aXZlID0gc3RkOjpt
YXgoKmEucG9zaXRpdmUsICpiLnBvc2l0aXZlKTsKKyAgICBlbHNlCisgICAgICAgIGNvbXB1dGVk
VmFsdWVzLnBvc2l0aXZlID0gYS5wb3NpdGl2ZSA/IGEucG9zaXRpdmUgOiBiLnBvc2l0aXZlOwor
CisgICAgaWYgKGEubmVnYXRpdmUgJiYgYi5uZWdhdGl2ZSkKKyAgICAgICAgY29tcHV0ZWRWYWx1
ZXMubmVnYXRpdmUgPSBzdGQ6Om1pbigqYS5uZWdhdGl2ZSwgKmIubmVnYXRpdmUpOworICAgIGVs
c2UKKyAgICAgICAgY29tcHV0ZWRWYWx1ZXMubmVnYXRpdmUgPSBhLm5lZ2F0aXZlID8gYS5uZWdh
dGl2ZSA6IGIubmVnYXRpdmU7CisKKyAgICBpZiAoYS5pc05vblplcm8oKSAmJiBiLmlzTm9uWmVy
bygpKQorICAgICAgICBjb21wdXRlZFZhbHVlcy5pc1F1aXJrID0gYS5pc1F1aXJrIHx8IGIuaXNR
dWlyazsKKyAgICBlbHNlIGlmIChhLmlzTm9uWmVybygpKQorICAgICAgICBjb21wdXRlZFZhbHVl
cy5pc1F1aXJrID0gYS5pc1F1aXJrOworICAgIGVsc2UKKyAgICAgICAgY29tcHV0ZWRWYWx1ZXMu
aXNRdWlyayA9IGIuaXNRdWlyazsKKworICAgIHJldHVybiBjb21wdXRlZFZhbHVlczsKK30KKwor
T3B0aW9uYWw8TGF5b3V0VW5pdD4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFw
c2U6Om1hcmdpblZhbHVlKFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBh
aXI6OlZhbHVlcyBtYXJnaW5WYWx1ZXMpIGNvbnN0Cit7CisgICAgLy8gV2hlbiB0d28gb3IgbW9y
ZSBtYXJnaW5zIGNvbGxhcHNlLCB0aGUgcmVzdWx0aW5nIG1hcmdpbiB3aWR0aCBpcyB0aGUgbWF4
aW11bSBvZiB0aGUgY29sbGFwc2luZyBtYXJnaW5zJyB3aWR0aHMuCisgICAgLy8gSW4gdGhlIGNh
c2Ugb2YgbmVnYXRpdmUgbWFyZ2lucywgdGhlIG1heGltdW0gb2YgdGhlIGFic29sdXRlIHZhbHVl
cyBvZiB0aGUgbmVnYXRpdmUgYWRqb2luaW5nIG1hcmdpbnMgaXMgZGVkdWN0ZWQgZnJvbSB0aGUg
bWF4aW11bQorICAgIC8vIG9mIHRoZSBwb3NpdGl2ZSBhZGpvaW5pbmcgbWFyZ2lucy4gSWYgdGhl
cmUgYXJlIG5vIHBvc2l0aXZlIG1hcmdpbnMsIHRoZSBtYXhpbXVtIG9mIHRoZSBhYnNvbHV0ZSB2
YWx1ZXMgb2YgdGhlIGFkam9pbmluZyBtYXJnaW5zIGlzIGRlZHVjdGVkIGZyb20gemVyby4KKyAg
ICBpZiAoIW1hcmdpblZhbHVlcy5uZWdhdGl2ZSkKKyAgICAgICAgcmV0dXJuIG1hcmdpblZhbHVl
cy5wb3NpdGl2ZTsKKworICAgIGlmICghbWFyZ2luVmFsdWVzLnBvc2l0aXZlKQorICAgICAgICBy
ZXR1cm4gbWFyZ2luVmFsdWVzLm5lZ2F0aXZlOworCisgICAgcmV0dXJuICptYXJnaW5WYWx1ZXMu
cG9zaXRpdmUgKyAqbWFyZ2luVmFsdWVzLm5lZ2F0aXZlOworfQorCit2b2lkIEJsb2NrRm9ybWF0
dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjp1cGRhdGVNYXJnaW5BZnRlckZvclByZXZpb3Vz
U2libGluZyhCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBibG9ja0Zvcm1hdHRpbmdDb250ZXh0LCBj
b25zdCBNYXJnaW5Db2xsYXBzZSYgbWFyZ2luQ29sbGFwc2UsIGNvbnN0IEJveCYgbGF5b3V0Qm94
KQoreworICAgIC8vIDEuIEdldCB0aGUgbWFyZ2luIGJlZm9yZSB2YWx1ZSBmcm9tIHRoZSBuZXh0
IGluLWZsb3cgc2libGluZy4gVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGlzIGJveCdzIG1hcmdpbiBh
ZnRlciB2YWx1ZSBub3cgc2luY2UgdGhleSBhcmUgY29sbGFwc2VkLgorICAgIC8vIDIuIFVwZGF0
ZSB0aGUgY29sbGFwc2VkIG1hcmdpbiBhZnRlciB2YWx1ZSBhcyB3ZWxsIGFzIHRoZSBwb3NpdGl2
ZS9uZWdhdGl2ZSBjYWNoZS4KKyAgICAvLyAzLiBDaGVjayBpZiB0aGUgYm94J3MgbWFyZ2lucyBj
b2xsYXBzZSB0aHJvdWdoLgorICAgIC8vIDQuIElmIHNvLCB1cGRhdGUgdGhlIHBvc2l0aXZlL25l
Z2F0aXZlIGNhY2hlLgorICAgIC8vIDUuIEluIGNhc2Ugb2YgY29sbGFwc2VkIHRocm91Z2ggbWFy
Z2lucyBjaGVjayBpZiB0aGUgYmVmb3JlIG1hcmdpbiBjb2xsYXBlcyB3aXRoIHRoZSBwcmV2aW91
cyBpbmZsb3cgc2libGluZydzIGFmdGVyIG1hcmdpbi4KKyAgICAvLyA2LiBJZiBzbywganVtcCB0
byAjMi4KKyAgICAvLyA3LiBObyBuZWVkIHRvIHByb3BhZ2F0ZSB0byBwYXJlbnQgYmVjYXVzZSBp
dHMgbWFyZ2luIGlzIG5vdCBjb21wdXRlZCB5ZXQgKHByZS1jb21wdXRlZCBhdCBtb3N0KS4KKyAg
ICBhdXRvKiBjdXJyZW50Qm94ID0gJmxheW91dEJveDsKKyAgICBhdXRvJiBibG9ja0Zvcm1hdHRp
bmdTdGF0ZSA9IGJsb2NrRm9ybWF0dGluZ0NvbnRleHQuZm9ybWF0dGluZ1N0YXRlKCk7CisgICAg
d2hpbGUgKG1hcmdpbkNvbGxhcHNlLm1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1Np
YmxpbmdNYXJnaW5BZnRlcigqY3VycmVudEJveCkpIHsKKyAgICAgICAgYXV0byYgcHJldmlvdXNT
aWJsaW5nID0gKmN1cnJlbnRCb3gtPnByZXZpb3VzSW5GbG93U2libGluZygpOworICAgICAgICBh
dXRvIHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luID0gYmxvY2tGb3JtYXR0aW5nU3RhdGUu
dXNlZFZlcnRpY2FsTWFyZ2luKHByZXZpb3VzU2libGluZyk7CisKKyAgICAgICAgYXV0byBjb2xs
YXBzZWRWZXJ0aWNhbE1hcmdpbkJlZm9yZSA9IHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2lu
LmNvbGxhcHNlZFZhbHVlcy5iZWZvcmU7CisgICAgICAgIGF1dG8gY29sbGFwc2VkVmVydGljYWxN
YXJnaW5BZnRlciA9IGJsb2NrRm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goKmN1cnJl
bnRCb3gpLm1hcmdpbkJlZm9yZSgpOworCisgICAgICAgIGF1dG8gbWFyZ2luc0NvbGxhcHNlVGhy
b3VnaCA9IG1hcmdpbkNvbGxhcHNlLm1hcmdpbnNDb2xsYXBzZVRocm91Z2gocHJldmlvdXNTaWJs
aW5nKTsKKyAgICAgICAgaWYgKG1hcmdpbnNDb2xsYXBzZVRocm91Z2gpCisgICAgICAgICAgICBj
b2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkJlZm9yZSA9IGNvbGxhcHNlZFZlcnRpY2FsTWFyZ2luQWZ0
ZXI7CisKKyAgICAgICAgLy8gVXBkYXRlIHBvc2l0aXZlL25lZ2F0aXZlIGNhY2hlLgorICAgICAg
ICBhdXRvIHByZXZpb3VzU2libGluZ1Bvc2l0aXZlTmVnYXRpdmVNYXJnaW4gPSBibG9ja0Zvcm1h
dHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNTaWJsaW5nKS5wb3NpdGl2ZUFu
ZE5lZ2F0aXZlVmFsdWVzOworICAgICAgICBhdXRvIHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZv
cmUgPSBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4oKmN1cnJlbnRCb3gp
LnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlOworCisgICAgICAgIGF1dG8gYWRqdXN0
ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbiA9IHByZXZpb3VzU2libGluZ1ZlcnRpY2Fs
TWFyZ2luOworICAgICAgICBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBv
c2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0ZXIgPSBtYXJnaW5Db2xsYXBzZS5jb21wdXRlZFBv
c2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4ocG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSwgcHJl
dmlvdXNTaWJsaW5nUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbi5hZnRlcik7CisgICAgICAgIGlmICht
YXJnaW5zQ29sbGFwc2VUaHJvdWdoKSB7CisgICAgICAgICAgICBhZGp1c3RlZFByZXZpb3VzU2li
bGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3JlID0gbWFy
Z2luQ29sbGFwc2UuY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKHByZXZpb3VzU2li
bGluZ1Bvc2l0aXZlTmVnYXRpdmVNYXJnaW4uYmVmb3JlLCBhZGp1c3RlZFByZXZpb3VzU2libGlu
Z1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0ZXIpOworICAgICAg
ICAgICAgYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbi5wb3NpdGl2ZUFuZE5l
Z2F0aXZlVmFsdWVzLmFmdGVyID0gYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdp
bi5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmJlZm9yZTsKKyAgICAgICAgfQorICAgICAgICBi
bG9ja0Zvcm1hdHRpbmdTdGF0ZS5zZXRVc2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNTaWJsaW5n
LCBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luKTsKKworICAgICAgICBpZiAo
IW1hcmdpbnNDb2xsYXBzZVRocm91Z2gpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBj
dXJyZW50Qm94ID0gJnByZXZpb3VzU2libGluZzsKKyAgICB9Cit9CisKK1VzZWRWZXJ0aWNhbE1h
cmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdhdGl2ZVZhbHVlcyhjb25zdCBCb3gmIGxh
eW91dEJveCwgTWFyZ2luVHlwZSBtYXJnaW5UeXBlKSBjb25zdAoreworICAgIGF1dG8mIGZvcm1h
dHRpbmdTdGF0ZSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZm9ybWF0dGluZ1N0YXRlKCk7CisgICAg
Ly8gQnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUgaW4gQkZDIGxheW91dCB0byBnYXRoZXIgcG9zaXRp
dmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZm9yIGVpdGhlciBhIHByZXZpb3VzIHNpYmxp
bmcgb3IgYSBjaGlsZCBib3gsCisgICAgLy8gd2UgbXVzaCBoYXZlIGNvbXB1dGVkIGFuZCBjYWNo
ZWQgdGhvc2UgdmFsdWVzLgorICAgIEFTU0VSVChmb3JtYXR0aW5nU3RhdGUuaGFzVXNlZFZlcnRp
Y2FsTWFyZ2luKGxheW91dEJveCkpOworICAgIGF1dG8gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRp
Y2FsTWFyZ2luID0gZm9ybWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gp
LnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXM7CisgICAgcmV0dXJuIG1hcmdpblR5cGUgPT0gTWFy
Z2luVHlwZTo6QmVmb3JlID8gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9y
ZSA6IHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5hZnRlcjsgCit9CisKK1VzZWRW
ZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9y
ZShjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRW
YWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAoreworICAgIGF1dG8gZmlyc3RDaGlsZENv
bGxhcHNlZE1hcmdpbkJlZm9yZSA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRp
dmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7CisgICAgICAgIGlmICghbWFyZ2luQmVmb3JlQ29s
bGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJnaW5CZWZvcmUobGF5b3V0Qm94KSkKKyAgICAg
ICAgICAgIHJldHVybiB7IH07CisgICAgICAgIHJldHVybiBwb3NpdGl2ZU5lZ2F0aXZlVmFsdWVz
KCpkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dDaGlsZCgpLCBN
YXJnaW5UeXBlOjpCZWZvcmUpOworICAgIH07CisKKyAgICBhdXRvIHByZXZpb3VTaWJsaW5nQ29s
bGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZl
QW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgeworICAgICAgICBpZiAoIW1hcmdpbkJlZm9yZUNvbGxh
cHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcihsYXlvdXRCb3gpKQorICAgICAgICAg
ICAgcmV0dXJuIHsgfTsKKyAgICAgICAgcmV0dXJuIHBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMoKmxh
eW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSwgTWFyZ2luVHlwZTo6QWZ0ZXIpOworICAg
IH07CisKKyAgICAvLyAxLiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1
ZXMgZnJvbSBmaXJzdCBjaGlsZCBpZiBtYXJnaW5zIGFyZSBhZGpvaW5pbmcuCisgICAgLy8gMi4g
R2F0aGVyIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWVzIGZyb20gcHJldmlvdXMg
aW5mbG93IHNpYmxpbmcgaWYgbWFyZ2lucyBhcmUgYWRqb2luaW5nLgorICAgIC8vIDMuIENvbXB1
dGUgbWluL21heCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgY29sbGFwc2VkIG1hcmdpbiB2YWx1ZXMg
dXNpbmcgbm9uLWNvbGxwYXNlZCBjb21wdXRlZCBtYXJnaW4gYmVmb3JlLgorICAgIGF1dG8gY29s
bGFwc2VkTWFyZ2luQmVmb3JlID0gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKGZp
cnN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5CZWZvcmUoKSwgcHJldmlvdVNpYmxpbmdDb2xsYXBzZWRN
YXJnaW5BZnRlcigpKTsKKyAgICBpZiAoY29sbGFwc2VkTWFyZ2luQmVmb3JlLmlzUXVpcmsgJiYg
Zm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01h
cmdpbihsYXlvdXRCb3gpKQorICAgICAgICBjb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSB7IH07CisK
KyAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMg
bm9uQ29sbGFwc2VkQmVmb3JlOworICAgIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlID4g
MCkKKyAgICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0geyBub25Db2xsYXBzZWRWYWx1ZXMuYmVm
b3JlLCB7IH0sIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkgfTsKKyAg
ICBlbHNlIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlIDwgMCkKKyAgICAgICAgbm9uQ29s
bGFwc2VkQmVmb3JlID0geyB7IH0sIG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUsIGxheW91dEJv
eC5zdHlsZSgpLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkgfTsKKworICAgIHJldHVybiBjb21wdXRl
ZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4oY29sbGFwc2VkTWFyZ2luQmVmb3JlLCBub25Db2xs
YXBzZWRCZWZvcmUpOworfQorCitVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRp
dmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6OnBv
c2l0aXZlTmVnYXRpdmVNYXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRp
Y2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAor
eworICAgIGF1dG8gbGFzdENoaWxkQ29sbGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2Vk
VmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgeworICAgICAg
ICBpZiAoIW1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFmdGVy
KGxheW91dEJveCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICByZXR1cm4gcG9z
aXRpdmVOZWdhdGl2ZVZhbHVlcygqZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmxh
c3RJbkZsb3dDaGlsZCgpLCBNYXJnaW5UeXBlOjpBZnRlcik7CisgICAgfTsKKworICAgIC8vIFdl
IGRvbid0IGtub3cgeWV0IHRoZSBtYXJnaW4gYmVmb3JlIHZhbHVlIG9mIHRoZSBuZXh0IHNpYmxp
bmcuIExldCdzIGp1c3QgcHJldGVuZCBpdCBkb2VzIG5vdCBoYXZlIG9uZSBhbmQgCisgICAgLy8g
dXBkYXRlIGl0IGxhdGVyIHdoZW4gd2UgY29tcHV0ZSB0aGUgbmV4dCBzaWJsaW5nJ3MgbWFyZ2lu
IGJlZm9yZS4gU2VlIHVwZGF0ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nLgorICAgIFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBub25Db2xs
YXBzZWRBZnRlcjsKKyAgICBpZiAobm9uQ29sbGFwc2VkVmFsdWVzLmFmdGVyID4gMCkKKyAgICAg
ICAgbm9uQ29sbGFwc2VkQWZ0ZXIgPSB7IG5vbkNvbGxhcHNlZFZhbHVlcy5hZnRlciwgeyB9LCBs
YXlvdXRCb3guc3R5bGUoKS5oYXNNYXJnaW5BZnRlclF1aXJrKCkgfTsKKyAgICBlbHNlIGlmIChu
b25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIgPCAwKQorICAgICAgICBub25Db2xsYXBzZWRBZnRlciA9
IHsgeyB9LCBub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIsIGxheW91dEJveC5zdHlsZSgpLmhhc01h
cmdpbkFmdGVyUXVpcmsoKSB9OworCisgICAgcmV0dXJuIGNvbXB1dGVkUG9zaXRpdmVBbmROZWdh
dGl2ZU1hcmdpbihsYXN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5BZnRlcigpLCBub25Db2xsYXBzZWRB
ZnRlcik7Cit9CisKK0xheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29s
bGFwc2U6Om1hcmdpbkJlZm9yZUlnbm9yaW5nQ29sbGFwc2luZ1Rocm91Z2goY29uc3QgQm94JiBs
YXlvdXRCb3gsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIG5vbkNvbGxh
cHNlZFZhbHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsK
KyAgICByZXR1cm4gbWFyZ2luVmFsdWUocG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShsYXlv
dXRCb3gsIG5vbkNvbGxhcHNlZFZhbHVlcykpLnZhbHVlT3Iobm9uQ29sbGFwc2VkVmFsdWVzLmJl
Zm9yZSk7Cit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpN
YXJnaW5Db2xsYXBzZTo6Y29sbGFwc2VkVmVydGljYWxWYWx1ZXMoY29uc3QgQm94JiBsYXlvdXRC
b3gsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIG5vbkNvbGxhcHNlZFZh
bHVlcykKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKKyAgICAv
LyAxLiBHZXQgbWluL21heCBtYXJnaW4gdG9wIHZhbHVlcyBmcm9tIHRoZSBmaXJzdCBpbi1mbG93
IGNoaWxkIGlmIHdlIGFyZSBjb2xsYXBzaW5nIG1hcmdpbiB0b3Agd2l0aCBpdC4KKyAgICAvLyAy
LiBHZXQgbWluL21heCBtYXJnaW4gdG9wIHZhbHVlcyBmcm9tIHRoZSBwcmV2aW91cyBpbi1mbG93
IHNpYmxpbmcsIGlmIHdlIGFyZSBjb2xsYXBzaW5nIG1hcmdpbiB0b3Agd2l0aCBpdC4KKyAgICAv
LyAzLiBHZXQgdGhpcyBsYXlvdXQgYm94J3MgY29tcHV0ZWQgbWFyZ2luIHRvcCB2YWx1ZS4KKyAg
ICAvLyA0LiBVcGRhdGUgdGhlIG1pbi9tYXggdmFsdWUgYW5kIGNvbXB1dGUgdGhlIGZpbmFsIG1h
cmdpbi4KKyAgICBhdXRvIHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbiA9IFVzZWRW
ZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXIgeyB0aGlzLT5wb3NpdGl2ZU5l
Z2F0aXZlTWFyZ2luQmVmb3JlKGxheW91dEJveCwgbm9uQ29sbGFwc2VkVmFsdWVzKSwgdGhpcy0+
cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkFmdGVyKGxheW91dEJveCwgbm9uQ29sbGFwc2VkVmFsdWVz
KSB9OworCisgICAgYXV0byBtYXJnaW5zQ29sbGFwc2VUaHJvdWdoID0gdGhpcy0+bWFyZ2luc0Nv
bGxhcHNlVGhyb3VnaChsYXlvdXRCb3gpOworICAgIGlmIChtYXJnaW5zQ29sbGFwc2VUaHJvdWdo
KSB7CisgICAgICAgIHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPSBj
b21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4ocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRp
Y2FsTWFyZ2luLmJlZm9yZSwgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVy
KTsKKyAgICAgICAgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyID0gcG9z
aXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZTsKKyAgICB9CisKKyAgICBhdXRv
IGhhc0NvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJz
dEluRmxvd0NoaWxkTWFyZ2luQmVmb3JlKGxheW91dEJveCkgfHwgbWFyZ2luQmVmb3JlQ29sbGFw
c2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGxheW91dEJveCk7CisgICAgYXV0byBo
YXNDb2xsYXBzZWRNYXJnaW5BZnRlciA9IG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aExhc3RJbkZs
b3dDaGlsZE1hcmdpbkFmdGVyKGxheW91dEJveCk7CisgICAgYXV0byB1c2VkVmVydGljYWxNYXJn
aW4gPSBVc2VkVmVydGljYWxNYXJnaW4geyBub25Db2xsYXBzZWRWYWx1ZXMsIHsgfSwgcG9zaXRp
dmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luIH07CisKKyAgICBpZiAoKGhhc0NvbGxhcHNlZE1h
cmdpbkJlZm9yZSAmJiBoYXNDb2xsYXBzZWRNYXJnaW5BZnRlcikgfHwgbWFyZ2luc0NvbGxhcHNl
VGhyb3VnaCkKKyAgICAgICAgdXNlZFZlcnRpY2FsTWFyZ2luLmNvbGxhcHNlZFZhbHVlcyA9IHsg
bWFyZ2luVmFsdWUocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSksIG1h
cmdpblZhbHVlKHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5hZnRlciksIG1hcmdp
bnNDb2xsYXBzZVRocm91Z2ggfTsKKyAgICBlbHNlIGlmIChoYXNDb2xsYXBzZWRNYXJnaW5CZWZv
cmUpCisgICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1ZXMgPSB7IG1hcmdp
blZhbHVlKHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1hcmdpbi5iZWZvcmUpLCB7IH0sIGZh
bHNlIH07CisgICAgZWxzZSBpZiAoaGFzQ29sbGFwc2VkTWFyZ2luQWZ0ZXIpCisgICAgICAgIHVz
ZWRWZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1ZXMgPSB7IHsgfSwgbWFyZ2luVmFsdWUocG9z
aXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyKSwgZmFsc2UgfTsKKyAgICByZXR1
cm4gdXNlZFZlcnRpY2FsTWFyZ2luOworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2svUHJlY29tcHV0ZWRC
bG9ja01hcmdpbkNvbGxhcHNlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvYmxvY2svUHJlY29tcHV0ZWRCbG9ja01hcmdpbkNvbGxhcHNlLmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi5kZWZiM2Q1NTRmZTY4ZGU0MjczMWZmOGUyZDRiMjBlYWJmNjU5ZWMyCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9jay9Q
cmVjb21wdXRlZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCkBAIC0wLDAgKzEsMTAwIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5j
bHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNp
bmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgor
I2luY2x1ZGUgIkxheW91dFVuaXQuaCIKKyNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworVXNlZFZlcnRpY2FsTWFyZ2lu
OjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
Ok1hcmdpbkNvbGxhcHNlOjpwcmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMoY29uc3Qg
Qm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgYXV0byYgYmxvY2tGb3JtYXR0aW5nU3RhdGUg
PSBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4obGF5b3V0U3RhdGUoKS5mb3JtYXR0aW5n
U3RhdGVGb3JCb3gobGF5b3V0Qm94KSk7CisgICAgaWYgKGJsb2NrRm9ybWF0dGluZ1N0YXRlLmhh
c1VzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpKQorICAgICAgICByZXR1cm4gYmxvY2tGb3Jt
YXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCkucG9zaXRpdmVBbmROZWdh
dGl2ZVZhbHVlcy5iZWZvcmU7CisKKyAgICBhdXRvIGdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRl
eHQoKS5nZW9tZXRyeSgpOworICAgIGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRzID0gZ2VvbWV0
cnkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KGxheW91dEJveC5jb250YWluaW5nQmxvY2so
KSkuaG9yaXpvbnRhbDsKKyAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBnZW9tZXRy
eS5jb21wdXRlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
KTsKKyAgICBhdXRvIG5vbkNvbGxhcHNlZE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9u
Q29sbGFwc2VkVmFsdWVzIHsgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5iZWZvcmUudmFsdWVPcigw
KSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1ZU9yKDApIH07CisgICAgcmV0dXJu
IHByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gsIG5vbkNv
bGxhcHNlZE1hcmdpbik7Cit9CisKK1VzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdh
dGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6
cHJlY29tcHV0ZWRQb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0
Qm94LCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyBub25Db2xsYXBzZWRW
YWx1ZXMpIGNvbnN0Cit7CisgICAgYXV0byBmaXJzdENoaWxkQ29sbGFwc2VkTWFyZ2luQmVmb3Jl
ID0gWyZdKCkgLT4gVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6
VmFsdWVzIHsKKyAgICAgICAgaWYgKCFtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoRmlyc3RJbkZs
b3dDaGlsZE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsK
KyAgICAgICAgcmV0dXJuIHByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZVZhbHVlcygqZG93bmNh
c3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93Q2hpbGQoKSk7CisgICAgfTsK
KworICAgIGF1dG8gcHJldmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5BZnRlciA9IFsmXSgpIC0+
IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7Cisg
ICAgICAgIGlmICghbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdp
bkFmdGVyKGxheW91dEJveCkpCisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICBhdXRv
JiBwcmV2aW91c0luRmxvd1NpYmxpbmcgPSAqbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGlu
ZygpOworICAgICAgICBhdXRvJiBibG9ja0Zvcm1hdHRpbmdTdGF0ZSA9IGRvd25jYXN0PEJsb2Nr
Rm9ybWF0dGluZ1N0YXRlPihsYXlvdXRTdGF0ZSgpLmZvcm1hdHRpbmdTdGF0ZUZvckJveChwcmV2
aW91c0luRmxvd1NpYmxpbmcpKTsKKyAgICAgICAgcmV0dXJuIGJsb2NrRm9ybWF0dGluZ1N0YXRl
LnVzZWRWZXJ0aWNhbE1hcmdpbihwcmV2aW91c0luRmxvd1NpYmxpbmcpLnBvc2l0aXZlQW5kTmVn
YXRpdmVWYWx1ZXMuYWZ0ZXI7CisgICAgfTsKKworICAgIC8vIDEuIEdhdGhlciBwb3NpdGl2ZSBh
bmQgbmVnYXRpdmUgbWFyZ2luIHZhbHVlcyBmcm9tIGZpcnN0IGNoaWxkIGlmIG1hcmdpbnMgYXJl
IGFkam9pbmluZy4KKyAgICAvLyAyLiBHYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdp
biB2YWx1ZXMgZnJvbSBwcmV2aW91cyBpbmZsb3cgc2libGluZyBpZiBtYXJnaW5zIGFyZSBhZGpv
aW5pbmcuCisgICAgLy8gMy4gQ29tcHV0ZSBtaW4vbWF4IHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBj
b2xsYXBzZWQgbWFyZ2luIHZhbHVlcyB1c2luZyBub24tY29sbHBhc2VkIGNvbXB1dGVkIG1hcmdp
biBiZWZvcmUuCisgICAgYXV0byBjb2xsYXBzZWRNYXJnaW5CZWZvcmUgPSBjb21wdXRlZFBvc2l0
aXZlQW5kTmVnYXRpdmVNYXJnaW4oZmlyc3RDaGlsZENvbGxhcHNlZE1hcmdpbkJlZm9yZSgpLCBw
cmV2aW91U2libGluZ0NvbGxhcHNlZE1hcmdpbkFmdGVyKCkpOworICAgIGlmIChjb2xsYXBzZWRN
YXJnaW5CZWZvcmUuaXNRdWlyayAmJiBmb3JtYXR0aW5nQ29udGV4dCgpLnF1aXJrcygpLnNob3Vs
ZElnbm9yZUNvbGxhcHNlZFF1aXJrTWFyZ2luKGxheW91dEJveCkpCisgICAgICAgIGNvbGxhcHNl
ZE1hcmdpbkJlZm9yZSA9IHsgfTsKKworICAgIGF1dG8gbm9uQ29sbGFwc2VkQmVmb3JlID0gVXNl
ZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHsgfTsKKyAg
ICBpZiAobm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSA+IDApCisgICAgICAgIG5vbkNvbGxhcHNl
ZEJlZm9yZSA9IHsgbm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSwgeyB9LCBsYXlvdXRCb3guc3R5
bGUoKS5oYXNNYXJnaW5CZWZvcmVRdWlyaygpIH07CisgICAgZWxzZSBpZiAobm9uQ29sbGFwc2Vk
VmFsdWVzLmJlZm9yZSA8IDApCisgICAgICAgIG5vbkNvbGxhcHNlZEJlZm9yZSA9IHsgeyB9LCBu
b25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlLCBsYXlvdXRCb3guc3R5bGUoKS5oYXNNYXJnaW5CZWZv
cmVRdWlyaygpIH07CisKKyAgICByZXR1cm4gY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFy
Z2luKGNvbGxhcHNlZE1hcmdpbkJlZm9yZSwgbm9uQ29sbGFwc2VkQmVmb3JlKTsKK30KKworUHJl
Y29tcHV0ZWRNYXJnaW5CZWZvcmUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFw
c2U6OnByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBVc2VkVmVy
dGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZhbHVlcyB1c2VkTm9uQ29sbGFwc2VkTWFyZ2luKQor
eworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOworICAgIC8vIERvbid0
IHByZS1jb21wdXRlIHZlcnRpY2FsIG1hcmdpbnMgZm9yIG91dCBvZiBmbG93IGJveGVzLgorICAg
IEFTU0VSVChsYXlvdXRCb3guaXNJbkZsb3coKSB8fCBsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0
aW9uZWQoKSk7CisgICAgQVNTRVJUKCFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKKworICAg
IGF1dG8gcG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IHByZWNvbXB1dGVkUG9zaXRpdmVO
ZWdhdGl2ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gsIHVzZWROb25Db2xsYXBzZWRNYXJnaW4pOwor
ICAgIGF1dG8gY29sbGFwc2VkTWFyZ2luQmVmb3JlID0gbWFyZ2luVmFsdWUocG9zaXRpdmVOZWdh
dGl2ZU1hcmdpbkJlZm9yZSk7CisgICAgcmV0dXJuIHsgdXNlZE5vbkNvbGxhcHNlZE1hcmdpbi5i
ZWZvcmUsIGNvbGxhcHNlZE1hcmdpbkJlZm9yZSwgcG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9y
ZSB9OworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2svdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9ibG9jay90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uYWM2ZGY2NWNhNGJiNzEzNjA0ZWFiNzAwMTZjZjdkZWYxYzIy
ZjA0ZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvYmxvY2svdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0Nv
bnRleHQuY3BwCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwor
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisg
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIlRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaCIKKwor
I2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tG
b3JtYXR0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJJbnZhbGlkYXRpb25TdGF0ZS5oIgorI2luY2x1
ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVkZSAiTGF5b3V0Q2hpbGRJdGVyYXRvci5o
IgorI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKKyNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29u
dGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgorI2lu
Y2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25h
bWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoVGFibGVXcmFw
cGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCk7CisKK1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQ6OlRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFp
bmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBmb3Jt
YXR0aW5nU3RhdGUpCisgICAgOiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGZvcm1hdHRpbmdDb250
ZXh0Um9vdCwgZm9ybWF0dGluZ1N0YXRlKQoreworfQorCit2b2lkIFRhYmxlV3JhcHBlckJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUm
LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAg
IC8vIFRoZSB0YWJsZSBnZW5lcmF0ZXMgYSBwcmluY2lwYWwgYmxvY2sgY29udGFpbmVyIGJveCBj
YWxsZWQgdGhlIHRhYmxlIHdyYXBwZXIgYm94IHRoYXQgY29udGFpbnMgdGhlIHRhYmxlIGJveCBp
dHNlbGYgYW5kIGFueSBjYXB0aW9uIGJveGVzCisgICAgLy8gKGluIGRvY3VtZW50IG9yZGVyKS4g
VGhlIHRhYmxlIGJveCBpcyBhIGJsb2NrLWxldmVsIGJveCB0aGF0IGNvbnRhaW5zIHRoZSB0YWJs
ZSdzIGludGVybmFsIHRhYmxlIGJveGVzLgorICAgIC8vIFRoZSBjYXB0aW9uIGJveGVzIGFyZSBw
cmluY2lwYWwgYmxvY2stbGV2ZWwgYm94ZXMgdGhhdCByZXRhaW4gdGhlaXIgb3duIGNvbnRlbnQs
IHBhZGRpbmcsIG1hcmdpbiwgYW5kIGJvcmRlciBhcmVhcywgYW5kIGFyZSByZW5kZXJlZAorICAg
IC8vIGFzIG5vcm1hbCBibG9jayBib3hlcyBpbnNpZGUgdGhlIHRhYmxlIHdyYXBwZXIgYm94LiBX
aGV0aGVyIHRoZSBjYXB0aW9uIGJveGVzIGFyZSBwbGFjZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSB0
YWJsZSBib3ggaXMgZGVjaWRlZCBieQorICAgIC8vIHRoZSAnY2FwdGlvbi1zaWRlJyBwcm9wZXJ0
eSwgYXMgZGVzY3JpYmVkIGJlbG93LgorICAgIGZvciAoYXV0byYgY2hpbGQgOiBjaGlsZHJlbk9m
VHlwZTxDb250YWluZXJCb3g+KHJvb3QoKSkpIHsKKyAgICAgICAgaWYgKGNoaWxkLmlzVGFibGVC
b3goKSkKKyAgICAgICAgICAgIGxheW91dFRhYmxlQm94KGNoaWxkLCBjb25zdHJhaW50cyk7Cisg
ICAgICAgIGVsc2UgaWYgKGNoaWxkLmlzVGFibGVDYXB0aW9uKCkpCisgICAgICAgICAgICBBU1NF
UlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9Cit9CisKK3ZvaWQgVGFibGVXcmFwcGVyQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dDo6bGF5b3V0VGFibGVCb3goY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJv
eCwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKK3sKKyAg
ICBsYXlvdXRTdGF0ZSgpLmVuc3VyZVRhYmxlRm9ybWF0dGluZ1N0YXRlKHRhYmxlQm94KTsKKwor
ICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nRm9yVGFibGVCb3godGFibGVCb3gsIGNvbnN0cmFp
bnRzLmhvcml6b250YWwpOworICAgIGNvbXB1dGVTdGF0aWNWZXJ0aWNhbFBvc2l0aW9uKHRhYmxl
Qm94LCBjb25zdHJhaW50cy52ZXJ0aWNhbCk7CisgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luRm9y
VGFibGVCb3godGFibGVCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgIGNvbXB1dGVT
dGF0aWNIb3Jpem9udGFsUG9zaXRpb24odGFibGVCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwp
OworCisgICAgaWYgKHRhYmxlQm94Lmhhc0NoaWxkKCkpIHsKKyAgICAgICAgYXV0byBpbnZhbGlk
YXRpb25TdGF0ZSA9IEludmFsaWRhdGlvblN0YXRlIHsgfTsKKyAgICAgICAgTGF5b3V0Q29udGV4
dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQodGFibGVCb3gsIGxheW91dFN0YXRlKCkpLT5sYXlv
dXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBnZW9tZXRyeSgpLmNvbnN0cmFpbnRz
Rm9ySW5GbG93Q29udGVudCh0YWJsZUJveCkpOworICAgIH0KKworICAgIGNvbXB1dGVIZWlnaHRB
bmRNYXJnaW5Gb3JUYWJsZUJveCh0YWJsZUJveCwgY29uc3RyYWludHMpOworfQorCit2b2lkIFRh
YmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVCb3JkZXJBbmRQYWRkaW5n
Rm9yVGFibGVCb3goY29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCit7CisgICAgQVNTRVJUKHRhYmxl
Qm94LmlzVGFibGVCb3goKSk7CisgICAgaWYgKCF0YWJsZUJveC5oYXNDaGlsZCgpIHx8IHRhYmxl
Qm94LnN0eWxlKCkuYm9yZGVyQ29sbGFwc2UoKSA9PSBCb3JkZXJDb2xsYXBzZTo6U2VwYXJhdGUp
IHsKKyAgICAgICAgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUJvcmRlckFuZFBhZGRp
bmcodGFibGVCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisgICAgLy8gVUFzIG11c3QgY29tcHV0ZSBhbiBpbml0aWFsIGxlZnQgYW5kIHJpZ2h0IGJv
cmRlciB3aWR0aCBmb3IgdGhlIHRhYmxlIGJ5IGV4YW1pbmluZworICAgIC8vIHRoZSBmaXJzdCBh
bmQgbGFzdCBjZWxscyBpbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSB0YWJsZS4KKyAgICAvLyBUaGUg
bGVmdCBib3JkZXIgd2lkdGggb2YgdGhlIHRhYmxlIGlzIGhhbGYgb2YgdGhlIGZpcnN0IGNlbGwn
cyBjb2xsYXBzZWQgbGVmdCBib3JkZXIsCisgICAgLy8gYW5kIHRoZSByaWdodCBib3JkZXIgd2lk
dGggb2YgdGhlIHRhYmxlIGlzIGhhbGYgb2YgdGhlIGxhc3QgY2VsbCdzIGNvbGxhcHNlZCByaWdo
dCBib3JkZXIuCisgICAgLy8gVGhlIHRvcCBib3JkZXIgd2lkdGggb2YgdGhlIHRhYmxlIGlzIGNv
bXB1dGVkIGJ5IGV4YW1pbmluZyBhbGwgY2VsbHMgd2hvIGNvbGxhcHNlIHRoZWlyIHRvcAorICAg
IC8vIGJvcmRlcnMgd2l0aCB0aGUgdG9wIGJvcmRlciBvZiB0aGUgdGFibGUuIFRoZSB0b3AgYm9y
ZGVyIHdpZHRoIG9mIHRoZSB0YWJsZSBpcyBlcXVhbCB0byBoYWxmIG9mIHRoZQorICAgIC8vIG1h
eGltdW0gY29sbGFwc2VkIHRvcCBib3JkZXIuIFRoZSBib3R0b20gYm9yZGVyIHdpZHRoIGlzIGNv
bXB1dGVkIGJ5IGV4YW1pbmluZyBhbGwgY2VsbHMgd2hvc2UgYm90dG9tIGJvcmRlcnMgY29sbGFw
c2UKKyAgICAvLyB3aXRoIHRoZSBib3R0b20gb2YgdGhlIHRhYmxlLiBUaGUgYm90dG9tIGJvcmRl
ciB3aWR0aCBpcyBlcXVhbCB0byBoYWxmIG9mIHRoZSBtYXhpbXVtIGNvbGxhcHNlZCBib3R0b20g
Ym9yZGVyLgorICAgIGF1dG8mIGdyaWQgPSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVkVGFibGVG
b3JtYXR0aW5nU3RhdGUodGFibGVCb3gpLnRhYmxlR3JpZCgpOworICAgIGF1dG8gdGFibGVCb3Jk
ZXIgPSBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKHRhYmxlQm94KTsKKworICAgIGF1dG8mIGZp
cnN0Q29sdW1uRmlyc3RSb3dCb3ggPSBncmlkLnNsb3QoeyAwICwgMCB9KS0+Y2VsbCgpLmJveCgp
OworICAgIGF1dG8gbGVmdEJvcmRlciA9IHN0ZDo6bWF4KHRhYmxlQm9yZGVyLmhvcml6b250YWwu
bGVmdCwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihmaXJzdENvbHVtbkZpcnN0Um93Qm94KS5o
b3Jpem9udGFsLmxlZnQpOworCisgICAgYXV0byYgbGFzdENvbHVtbkZpcnN0Um93ID0gZ3JpZC5z
bG90KHsgZ3JpZC5jb2x1bW5zKCkuc2l6ZSgpIC0gMSwgMCB9KS0+Y2VsbCgpLmJveCgpOworICAg
IGF1dG8gcmlnaHRCb3JkZXIgPSBzdGQ6Om1heCh0YWJsZUJvcmRlci5ob3Jpem9udGFsLnJpZ2h0
LCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKGxhc3RDb2x1bW5GaXJzdFJvdykuaG9yaXpvbnRh
bC5yaWdodCk7CisKKyAgICBhdXRvIHRvcEJvcmRlciA9IHRhYmxlQm9yZGVyLnZlcnRpY2FsLnRv
cDsKKyAgICBhdXRvIGJvdHRvbUJvcmRlciA9IHRhYmxlQm9yZGVyLnZlcnRpY2FsLmJvdHRvbTsK
KyAgICBhdXRvIGxhc3RSb3dJbmRleCA9IGdyaWQucm93cygpLnNpemUoKSAtIDE7CisgICAgZm9y
IChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IGdyaWQuY29sdW1ucygpLnNp
emUoKTsgKytjb2x1bW5JbmRleCkgeworICAgICAgICBhdXRvJiBib3hJbkZpcnN0Um94ID0gZ3Jp
ZC5zbG90KHsgY29sdW1uSW5kZXgsIDAgfSktPmNlbGwoKS5ib3goKTsKKyAgICAgICAgYXV0byYg
Ym94SW5MYXN0Um93ID0gZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIGxhc3RSb3dJbmRleCB9KS0+
Y2VsbCgpLmJveCgpOworCisgICAgICAgIHRvcEJvcmRlciA9IHN0ZDo6bWF4KHRvcEJvcmRlciwg
Z2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihib3hJbkZpcnN0Um94KS52ZXJ0aWNhbC50b3ApOwor
ICAgICAgICBib3R0b21Cb3JkZXIgPSBzdGQ6Om1heChib3R0b21Cb3JkZXIsIGdlb21ldHJ5KCku
Y29tcHV0ZWRCb3JkZXIoYm94SW5MYXN0Um93KS52ZXJ0aWNhbC5ib3R0b20pOworICAgIH0KKwor
ICAgIHRvcEJvcmRlciA9IHN0ZDo6bWF4KHRvcEJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJv
cmRlcigqdGFibGVCb3guZmlyc3RDaGlsZCgpKS52ZXJ0aWNhbC50b3ApOworICAgIGZvciAoYXV0
byYgc2VjdGlvbiA6IGNoaWxkcmVuT2ZUeXBlPENvbnRhaW5lckJveD4odGFibGVCb3gpKSB7Cisg
ICAgICAgIGF1dG8gaG9yaXp0b25hbEJvcmRlciA9IGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIo
c2VjdGlvbikuaG9yaXpvbnRhbDsKKyAgICAgICAgbGVmdEJvcmRlciA9IHN0ZDo6bWF4KGxlZnRC
b3JkZXIsIGhvcml6dG9uYWxCb3JkZXIubGVmdCk7CisgICAgICAgIHJpZ2h0Qm9yZGVyID0gc3Rk
OjptYXgocmlnaHRCb3JkZXIsIGhvcml6dG9uYWxCb3JkZXIucmlnaHQpOworICAgIH0KKyAgICBi
b3R0b21Cb3JkZXIgPSBzdGQ6Om1heChib3R0b21Cb3JkZXIsIGdlb21ldHJ5KCkuY29tcHV0ZWRC
b3JkZXIoKnRhYmxlQm94Lmxhc3RDaGlsZCgpKS52ZXJ0aWNhbC5ib3R0b20pOworCisgICAgYXV0
byYgcm93cyA9IGdyaWQucm93cygpLmxpc3QoKTsKKyAgICB0b3BCb3JkZXIgPSBzdGQ6Om1heCh0
b3BCb3JkZXIsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIocm93cy5maXJzdCgpLmJveCgpKS52
ZXJ0aWNhbC50b3ApOworICAgIGZvciAoYXV0byYgcm93IDogcm93cykgeworICAgICAgICBhdXRv
IGhvcml6dG9uYWxCb3JkZXIgPSBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKHJvdy5ib3goKSku
aG9yaXpvbnRhbDsKKyAgICAgICAgbGVmdEJvcmRlciA9IHN0ZDo6bWF4KGxlZnRCb3JkZXIsIGhv
cml6dG9uYWxCb3JkZXIubGVmdCk7CisgICAgICAgIHJpZ2h0Qm9yZGVyID0gc3RkOjptYXgocmln
aHRCb3JkZXIsIGhvcml6dG9uYWxCb3JkZXIucmlnaHQpOworICAgIH0KKyAgICBib3R0b21Cb3Jk
ZXIgPSBzdGQ6Om1heChib3R0b21Cb3JkZXIsIGdlb21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIocm93
cy5sYXN0KCkuYm94KCkpLnZlcnRpY2FsLmJvdHRvbSk7CisKKyAgICBhdXRvIGNvbGxhcHNlZEJv
cmRlciA9IEVkZ2VzIHsgeyBsZWZ0Qm9yZGVyLCByaWdodEJvcmRlciB9LCB7IHRvcEJvcmRlciwg
Ym90dG9tQm9yZGVyIH0gfTsKKyAgICBncmlkLnNldENvbGxhcHNlZEJvcmRlcihjb2xsYXBzZWRC
b3JkZXIpOworCisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hH
ZW9tZXRyeSh0YWJsZUJveCk7CisgICAgYm94R2VvbWV0cnkuc2V0Qm9yZGVyKGNvbGxhcHNlZEJv
cmRlciAvIDIpOworICAgIGJveEdlb21ldHJ5LnNldFBhZGRpbmcoZ2VvbWV0cnkoKS5jb21wdXRl
ZFBhZGRpbmcodGFibGVCb3gsIGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpKTsK
K30KKwordm9pZCBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlV2lk
dGhBbmRNYXJnaW5Gb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBB
U1NFUlQodGFibGVCb3guaXNUYWJsZUJveCgpKTsKKyAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCB0
YWJsZSAiZml0LWNvbnRlbnQgc2l6ZSIgYmVoYXZpb3IgaGFuZGxpbmcuIE5vdCBpbiB0aGUgc3Bl
YyB0aG91Z2guCisgICAgLy8gVGFibGUgcmV0dXJucyBpdHMgZmluYWwgd2lkdGggYXMgbWluL21h
eC4gVXNlIHRoaXMgZmluYWwgd2lkdGggdmFsdWUgdG8gY29tcHV0ZWQgaG9yaXpvbnRhbCBtYXJn
aW5zIGV0Yy4KKyAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGVGb3JUYWJsZUJveCA9IGxheW91dFN0
YXRlKCkuZXN0YWJsaXNoZWRUYWJsZUZvcm1hdHRpbmdTdGF0ZSh0YWJsZUJveCk7CisgICAgYXV0
byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7
IH07CisgICAgaWYgKGF1dG8gcHJlY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0g
Zm9ybWF0dGluZ1N0YXRlRm9yVGFibGVCb3guaW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpKQor
ICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gKnByZWNvbXB1dGVkSW50cmluc2lj
V2lkdGhDb25zdHJhaW50czsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHRhYmxlQm94Lmhhc0No
aWxkKCkpCisgICAgICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gTGF5b3V0Q29u
dGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQodGFibGVCb3gsIGxheW91dFN0YXRlKCkpLT5j
b21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsKKyAgICAgICAgZm9ybWF0dGluZ1N0
YXRlRm9yVGFibGVCb3guc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhpbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzKTsKKyAgICB9CisKKyAgICBhdXRvIGF2YWlsYWJsZUhvcml6b250YWxTcGFj
ZSA9IGhvcml6b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGg7CisgICAgLy8gMS4gVGhlIHRh
YmxlIGdlbmVyYXRlcyBhIHByaW5jaXBhbCBibG9jayBjb250YWluZXIgYm94IGNhbGxlZCB0aGUg
dGFibGUgd3JhcHBlciBib3ggdGhhdCBjb250YWlucyB0aGUgdGFibGUgYm94IGl0c2VsZiBhbmQg
YW55IGNhcHRpb24gYm94ZXMuCisgICAgLy8gMi4gVGhlIHRhYmxlIHdyYXBwZXIgYm94IGVzdGFi
bGlzaGVzIGEgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0LCBhbmQgdGhlIHRhYmxlIGJveCBlc3Rh
Ymxpc2hlcyBhIHRhYmxlIGZvcm1hdHRpbmcgY29udGV4dC4KKyAgICAvLyAzLiBUaGUgY29tcHV0
ZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMgJ3Bvc2l0aW9uJywgJ2Zsb2F0JywgJ21hcmdpbi0qJywg
J3RvcCcsICdyaWdodCcsICdib3R0b20nLCBhbmQgJ2xlZnQnIG9uCisgICAgLy8gICAgdGhlIHRh
YmxlIGVsZW1lbnQgYXJlIHVzZWQgb24gdGhlIHRhYmxlIHdyYXBwZXIgYm94IGFuZCBub3QgdGhl
IHRhYmxlIGJveDsgYWxsIG90aGVyIHZhbHVlcyBvZiBub24taW5oZXJpdGFibGUKKyAgICAvLyAg
ICBwcm9wZXJ0aWVzIGFyZSB1c2VkIG9uIHRoZSB0YWJsZSBib3ggYW5kIG5vdCB0aGUgdGFibGUg
d3JhcHBlciBib3guCisgICAgLy8gNC4gSW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGVh
Y2ggYm94J3MgbGVmdCBvdXRlciBlZGdlIHRvdWNoZXMgdGhlIGxlZnQgZWRnZSBvZiB0aGUgY29u
dGFpbmluZyBibG9jay4KKyAgICAvLyAgICBUaGlzIGlzIHRydWUgZXZlbiBpbiB0aGUgcHJlc2Vu
Y2Ugb2YgZmxvYXRzLCB1bmxlc3MgdGhlIGJveCBlc3RhYmxpc2hlcyBhIG5ldyBibG9jayBmb3Jt
YXR0aW5nIGNvbnRleHQgKGluIHdoaWNoIGNhc2UgdGhlCisgICAgLy8gICAgYm94IGl0c2VsZiBt
YXkgYmVjb21lIG5hcnJvd2VyIGR1ZSB0byB0aGUgZmxvYXRzKQorICAgIC8vCisgICAgLy8gTm93
IGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY2FzZToKKyAgICAvLyA8ZGl2IHN0eWxlPSJkaXNwbGF5
OiBibG9jazsgd2lkdGg6IDUwMHB4OyI+CisgICAgLy8gICAgIDxkaXYgc3R5bGU9ImZsb2F0OiBs
ZWZ0OyB3aWR0aDogMTAwcHg7Ij48L2Rpdj4KKyAgICAvLyAgICAgICAgIDxkaXYgc3R5bGU9ImRp
c3BsYXk6IHRhYmxlOyB3aWR0aDogMTAlOyI+PC9kaXY+CisgICAgLy8gICAgIDwvZGl2PgorICAg
IC8vIDwvZGl2PgorICAgIC8vIDEuIFdlIGNyZWF0ZSBhIHRhYmxlIHdyYXBwZXIgYm94IHRvIHdy
YXAgdGhlICJkaXNwbGF5OiB0YWJsZSIgYmxvY2sgbGV2ZWwgYm94ICgjMSkuCisgICAgLy8gMi4g
VGhlIHRhYmxlIHdyYXBwZXIgYm94J3Mgd2lkdGggcHJvcGVydHkgaXMgc2V0IHRvIGF1dG8gKCMz
KS4KKyAgICAvLyAzLiBTaW5jZSBpdCBlc3RhYmxpc2hlcyBhIG5ldyBibG9jayBmb3JtYXR0aW5n
IGNvbnRleHQsIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFjZSBnZXRzIHNocnVuayBieSB0
aGUgZmxvYXQgKCM0KQorICAgIC8vIDQuIFRoZSB0YWJsZSB3cmFwcGVyIGJveCdzIHVzZWQgd2lk
dGggY29tcHV0ZXMgdG8gNTAwcHggLSAxMDBweCAtPiA0MDBweDsKKyAgICAvLworICAgIC8vIE5v
dyB3ZSBhcmUgaW5zaWRlIHRoZSBCRkMgZXN0YWJsaXNoZWQgYnkgdGhlIHRhYmxlIHdyYXBwZXIg
Ym94IGFuZCB0cnkgdG8gcmVzb2x2ZSB0aGUgdGFibGUncyB3aWR0aCAtPiAlMTAuCisgICAgLy8g
QWNjb3JkaW5nIHRvIHRoZSBub3JtYWwgQkZDIHJ1bGVzLCBpdCBzaG91bGQgY29tcHV0ZSB0byAx
MCUgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBsb2dpY2FsIHdpZHRoOiA0MDBweCAtPiA0MHB4
LgorICAgIC8vIEhvd2V2ZXIgaW4gcHJhY3RpY2UgaXQgY29tcHV0ZXMgdG8gNTBweCAoMTAlIG9m
IDUwMHB4KS4KKyAgICAvLyBTaW1pbGFyIHNldHVwIHdpdGggbm9uLXRhYmxlIGNvbnRlbnQgd291
bGQgcmVzb2x2ZSB0aGUgaW5uZXIgYmxvY2sgbGV2ZWwgYm94J3Mgd2lkdGggdG8gNDBweDsKKyAg
ICAvLyBUaGlzIG5lZWRzIGNsYXJpZmljYXRpb24gaW4gdGhlIHNwZWMuCisgICAgYXV0byBob3Jp
em9udGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRoID0gbV9ob3Jpem9udGFsQ29uc3RyYWlu
dHNJZ25vcmluZ0Zsb2F0cy5sb2dpY2FsV2lkdGg7CisgICAgYXV0byBnZW9tZXRyeSA9IHRoaXMt
Pmdlb21ldHJ5KCk7CisgICAgYXV0byBjb21wdXRlZFdpZHRoID0gZ2VvbWV0cnkuY29tcHV0ZWRX
aWR0aCh0YWJsZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRGb3JSZXNvbHZpbmdXaWR0aCk7Cisg
ICAgYXV0byBjb21wdXRlZE1heFdpZHRoID0gZ2VvbWV0cnkuY29tcHV0ZWRNYXhXaWR0aCh0YWJs
ZUJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRGb3JSZXNvbHZpbmdXaWR0aCk7CisgICAgYXV0byBj
b21wdXRlZE1pbldpZHRoID0gZ2VvbWV0cnkuY29tcHV0ZWRNaW5XaWR0aCh0YWJsZUJveCwgaG9y
aXpvbnRhbENvbnN0cmFpbnRGb3JSZXNvbHZpbmdXaWR0aCk7CisgICAgLy8gVXNlIHRoZSBnZW5l
cmljIHNocmluay10by1maXQtd2lkdGggbG9naWMgYXMgdGhlIGluaXRpYWwgd2lkdGggZm9yIHRo
ZSB0YWJsZS4KKyAgICBhdXRvIHVzZWRXaWR0aCA9IHN0ZDo6bWluKHN0ZDo6bWF4KGludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMubWluaW11bSwgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKSwgaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtKTsKKyAgICBpZiAoY29tcHV0ZWRXaWR0aCB8
fCBjb21wdXRlZE1pbldpZHRoIHx8IGNvbXB1dGVkTWF4V2lkdGgpIHsKKyAgICAgICAgaWYgKGNv
bXB1dGVkV2lkdGgpIHsKKyAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgY29tcHV0ZWQgd2lk
dGggdmFsdWUgZmlyc3QuCisgICAgICAgICAgICBpZiAoY29tcHV0ZWRNYXhXaWR0aCAmJiAqY29t
cHV0ZWRXaWR0aCA+ICpjb21wdXRlZE1heFdpZHRoKQorICAgICAgICAgICAgICAgIGNvbXB1dGVk
V2lkdGggPSBjb21wdXRlZE1heFdpZHRoOworICAgICAgICAgICAgaWYgKGNvbXB1dGVkTWluV2lk
dGggJiYgKmNvbXB1dGVkV2lkdGggPCAqY29tcHV0ZWRNaW5XaWR0aCkKKyAgICAgICAgICAgICAg
ICBjb21wdXRlZFdpZHRoID0gY29tcHV0ZWRNaW5XaWR0aDsKKyAgICAgICAgICAgIHVzZWRXaWR0
aCA9ICpjb21wdXRlZFdpZHRoIDwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtID8g
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtIDogKmNvbXB1dGVkV2lkdGg7CisgICAg
ICAgIH0KKworICAgICAgICBpZiAoY29tcHV0ZWRNYXhXaWR0aCAmJiAqY29tcHV0ZWRNYXhXaWR0
aCA8IHVzZWRXaWR0aCkKKyAgICAgICAgICAgIHVzZWRXaWR0aCA9IGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMubWluaW11bTsKKyAgICAgICAgaWYgKGNvbXB1dGVkTWluV2lkdGggJiYgKmNvbXB1
dGVkTWluV2lkdGggPiB1c2VkV2lkdGgpCisgICAgICAgICAgICB1c2VkV2lkdGggPSAqY29tcHV0
ZWRNaW5XaWR0aDsKKyAgICB9CisKKyAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGdl
b21ldHJ5LmluRmxvd0NvbnRlbnRXaWR0aEFuZE1hcmdpbih0YWJsZUJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyB7IHVzZWRXaWR0aCwgeyB9IH0p
OworCisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRy
eSh0YWJsZUJveCk7CisgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGNvbnRlbnRX
aWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpOworICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250
YWxNYXJnaW4oeyBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCwgY29udGVu
dFdpZHRoQW5kTWFyZ2luLnVzZWRNYXJnaW4uZW5kIH0pOworfQorCit2b2lkIFRhYmxlV3JhcHBl
ckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVIZWlnaHRBbmRNYXJnaW5Gb3JUYWJsZUJv
eChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxv
d0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAgIEFTU0VSVCh0YWJsZUJveC5pc1RhYmxlQm94
KCkpOworICAgIC8vIFRhYmxlIGlzIGEgc3BlY2lhbCBCRkMgY29udGVudC4gSXRzIGhlaWdodCBp
cyBtYWlubHkgZHJpdmVuIGJ5IHRoZSBjb250ZW50LiBDb21wdXRlZCBoZWlnaHQsIG1pbi1oZWln
aHQgYW5kIG1heC1oZWlnaHQgYXJlIGFsbAorICAgIC8vIGFscmVhZHkgYmVlbiB0YWtlbiBpbnRv
IGFjY291bnQgZHVyaW5nIHRoZSBURkMgbGF5b3V0LgorICAgIGF1dG8gaGVpZ2h0QW5kTWFyZ2lu
ID0gZ2VvbWV0cnkoKS5pbkZsb3dDb250ZW50SGVpZ2h0QW5kTWFyZ2luKHRhYmxlQm94LCBjb25z
dHJhaW50cy5ob3Jpem9udGFsLCB7IHF1aXJrcygpLm92ZXJyaWRkZW5UYWJsZUhlaWdodCh0YWJs
ZUJveCkgfSk7CisKKyAgICBhdXRvIG1hcmdpbkNvbGxhcHNlID0gdGhpcy0+bWFyZ2luQ29sbGFw
c2UoKTsKKyAgICBhdXRvIHZlcnRpY2FsTWFyZ2luID0gbWFyZ2luQ29sbGFwc2UuY29sbGFwc2Vk
VmVydGljYWxWYWx1ZXModGFibGVCb3gsIGhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRNYXJn
aW4pOworICAgIC8vIENhY2hlIHRoZSBjb21wdXRlZCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgbWFy
Z2luIHZhbHVlIHBhaXIuCisgICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0VXNlZFZlcnRpY2FsTWFy
Z2luKHRhYmxlQm94LCB2ZXJ0aWNhbE1hcmdpbik7CisKKyAgICBhdXRvJiBib3hHZW9tZXRyeSA9
IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KHRhYmxlQm94KTsKKyAgICBib3hHZW9tZXRy
eS5zZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKHRhYmxlQm94LCB2ZXJ0
aWNhbE1hcmdpbiwgY29uc3RyYWludHMudmVydGljYWwpKTsKKyAgICBib3hHZW9tZXRyeS5zZXRD
b250ZW50Qm94SGVpZ2h0KGhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KTsKKyAgICBib3hH
ZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiks
IG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsKKyAgICAvLyBBZGp1c3QgdGhlIHByZXZp
b3VzIHNpYmxpbmcncyBtYXJnaW4gYm90dG9tIG5vdyB0aGF0IHRoaXMgYm94J3MgdmVydGljYWwg
bWFyZ2luIGlzIGNvbXB1dGVkLgorICAgIE1hcmdpbkNvbGxhcHNlOjp1cGRhdGVNYXJnaW5BZnRl
ckZvclByZXZpb3VzU2libGluZygqdGhpcywgbWFyZ2luQ29sbGFwc2UsIHRhYmxlQm94KTsKK30K
KworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvYmxvY2svdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0
dGluZ0NvbnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
YmxvY2svdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi4wZGVhMTU3Y2M1MjE2Zjg4NGZkMjg5ODM0YTNjODY2OTUzNzQyN2E1Ci0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9i
bG9jay90YWJsZXdyYXBwZXIvVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oCkBA
IC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShM
QVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworbmFtZXNwYWNlIExheW91dCB7CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgc3Bl
Y2lhbCBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgbGF5b3V0IGxvZ2ljIGZvciB0aGUgdGFibGUg
d3JhcHBlci4KKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi90YWJsZXMuaHRtbCNtb2Rl
bAorY2xhc3MgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCBmaW5hbCA6IHB1Ymxp
YyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKFRh
YmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQpOworcHVibGljOgorICAgIFRhYmxlV3Jh
cHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5n
Q29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJik7CisKKyAgICB2b2lkIGxheW91dElu
Rmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxv
d0NvbnRlbnQmKSBmaW5hbDsKKworICAgIHZvaWQgc2V0SG9yaXpvbnRhbENvbnN0cmFpbnRzSWdu
b3JpbmdGbG9hdHMoY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3Ry
YWludHMpIHsgbV9ob3Jpem9udGFsQ29uc3RyYWludHNJZ25vcmluZ0Zsb2F0cyA9IGhvcml6b250
YWxDb25zdHJhaW50czsgfQorCitwcml2YXRlOgorICAgIGNsYXNzIFF1aXJrcyA6IHB1YmxpYyBC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgeworICAgIHB1YmxpYzoKKyAgICAgICAgUXVp
cmtzKGNvbnN0IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQmKTsKKworICAgICAg
ICBPcHRpb25hbDxMYXlvdXRVbml0PiBvdmVycmlkZGVuVGFibGVIZWlnaHQoY29uc3QgQ29udGFp
bmVyQm94JiB0YWJsZUJveCkgY29uc3Q7CisgICAgfTsKKyAgICBUYWJsZVdyYXBwZXJCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4gUXVpcmtzKCp0
aGlzKTsgfQorCisgICAgdm9pZCBsYXlvdXRUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRh
YmxlQm94LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsKKworICAgIHZvaWQg
Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmdGb3JUYWJsZUJveChjb25zdCBDb250YWluZXJCb3gmLCBj
b25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmKTsKKyAgICB2b2lkIGNvbXB1dGVXaWR0aEFuZE1h
cmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYpOworICAgIHZvaWQgY29tcHV0ZUhlaWdodEFuZE1hcmdpbkZvclRhYmxlQm94KGNv
bnN0IENvbnRhaW5lckJveCYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOwor
Citwcml2YXRlOgorICAgIEhvcml6b250YWxDb25zdHJhaW50cyBtX2hvcml6b250YWxDb25zdHJh
aW50c0lnbm9yaW5nRmxvYXRzOworfTsKKworaW5saW5lIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0
dGluZ0NvbnRleHQ6OlF1aXJrczo6UXVpcmtzKGNvbnN0IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0
dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KQorICAgIDogQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6UXVpcmtzKGZvcm1hdHRpbmdDb250ZXh0KQoreworfQorCit9Cit9CisKK1NQRUNJQUxJ
WkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChUYWJsZVdyYXBwZXJCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0LCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQo
KSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL2Jsb2NrL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0UXVpcmtzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvYmxvY2svdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHRR
dWlya3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLmVhZGE5MmVkMjhmNzk3ZjNiODI2YjBmYjkxNTQyNWViNzg5
YmI5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL2Jsb2NrL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0UXVpcmtzLmNwcApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIlRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQu
aCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAi
TGF5b3V0U3RhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7
CisKK09wdGlvbmFsPExheW91dFVuaXQ+IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6OlF1aXJrczo6b3ZlcnJpZGRlblRhYmxlSGVpZ2h0KGNvbnN0IENvbnRhaW5lckJveCYgdGFi
bGVCb3gpIGNvbnN0Cit7CisgICAgaWYgKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpIHsK
KyAgICAgICAgLy8gSW4gcXVpcmtzIG1vZGUgYWx3YXlzIHVzZSB0aGUgY29udGVudCBoZWlnaHQu
IE5vdGUgdGhhdCB0aGUgdGFibGVzIHdpdGggY29udGVudCB0YWtlIGNvbXB1dGVkIHZhbHVlcyBp
bnRvIGFjY291bnQuCisgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmNvbnRlbnRIZWlnaHRGb3JG
b3JtYXR0aW5nQ29udGV4dFJvb3QodGFibGVCb3gpOworICAgIH0KKyAgICByZXR1cm4gdGFibGVC
b3guaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkgPyBnZW9tZXRyeSgpLmNvbnRlbnRIZWlnaHRG
b3JGb3JtYXR0aW5nQ29udGV4dFJvb3QodGFibGVCb3gpIDogT3B0aW9uYWw8TGF5b3V0VW5pdD4g
eyB9OworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2Nr
Zm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMGY1NTVmODE5MzgxZTczYWYzZTE5YzAyZjM4YjBmY2YzYmQxMjA0Yi4uMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRp
bmdDb250ZXh0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
LSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0g
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ0NvbnRleHQu
aCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAi
QmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJGbG9hdGluZ0NvbnRleHQuaCIKLSNp
bmNsdWRlICJGbG9hdGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiSW52YWxpZGF0aW9uU3RhdGUuaCIK
LSNpbmNsdWRlICJMYXlvdXRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRDaGlsZEl0ZXJhdG9yLmgi
Ci0jaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGV4
dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKLSNpbmNsdWRl
ICJMYXlvdXRTdGF0ZS5oIgotI2luY2x1ZGUgIkxvZ2dpbmcuaCIKLSNpbmNsdWRlICJUYWJsZVdy
YXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lu
bGluZXMuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9UZXh0U3RyZWFtLmg+Ci0KLW5hbWVzcGFjZSBX
ZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lN
UEwoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCk7Ci0KLUJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OkJs
b2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4
dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCi0gICAgOiBGb3Jt
YXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKLXsK
LX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRJbkZsb3dDb250ZW50KElu
dmFsaWRhdGlvblN0YXRlJiBpbnZhbGlkYXRpb25TdGF0ZSwgY29uc3QgQ29uc3RyYWludHNGb3JJ
bkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKLXsKLSAgICAvLyA5LjQuMSBCbG9jayBmb3JtYXR0
aW5nIGNvbnRleHRzCi0gICAgLy8gSW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQsIGJveGVz
IGFyZSBsYWlkIG91dCBvbmUgYWZ0ZXIgdGhlIG90aGVyLCB2ZXJ0aWNhbGx5LCBiZWdpbm5pbmcg
YXQgdGhlIHRvcCBvZiBhIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgLy8gVGhlIHZlcnRpY2FsIGRp
c3RhbmNlIGJldHdlZW4gdHdvIHNpYmxpbmcgYm94ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgJ21h
cmdpbicgcHJvcGVydGllcy4KLSAgICAvLyBWZXJ0aWNhbCBtYXJnaW5zIGJldHdlZW4gYWRqYWNl
bnQgYmxvY2stbGV2ZWwgYm94ZXMgaW4gYSBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgY29sbGFw
c2UuCi0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0g
PDwgIltTdGFydF0gLT4gYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IC0+IGZvcm1hdHRpbmcgcm9v
dCgiIDw8ICZyb290KCkgPDwgIikiKTsKLSAgICBhdXRvJiBmb3JtYXR0aW5nUm9vdCA9IHJvb3Qo
KTsKLSAgICBBU1NFUlQoZm9ybWF0dGluZ1Jvb3QuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkp
OwotICAgIGF1dG8mIGZsb2F0aW5nU3RhdGUgPSBmb3JtYXR0aW5nU3RhdGUoKS5mbG9hdGluZ1N0
YXRlKCk7Ci0gICAgYXV0byBmbG9hdGluZ0NvbnRleHQgPSBGbG9hdGluZ0NvbnRleHQgeyAqdGhp
cywgZmxvYXRpbmdTdGF0ZSB9OwotCi0gICAgTGF5b3V0UXVldWUgbGF5b3V0UXVldWU7Ci0gICAg
ZW51bSBjbGFzcyBMYXlvdXREaXJlY3Rpb24geyBDaGlsZCwgU2libGluZyB9OwotICAgIGF1dG8g
YXBwZW5kTmV4dFRvTGF5b3V0UXVldWUgPSBbJl0gKGNvbnN0IGF1dG8mIGxheW91dEJveCwgYXV0
byBkaXJlY3Rpb24pIHsKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBMYXlvdXREaXJlY3Rpb246
OkNoaWxkKSB7Ci0gICAgICAgICAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGF1dG8qIGNo
aWxkID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93T3JGbG9h
dGluZ0NoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0SW5GbG93T3JGbG9hdGluZ1Np
YmxpbmcoKSkgewotICAgICAgICAgICAgICAgIGlmICghaW52YWxpZGF0aW9uU3RhdGUubmVlZHNM
YXlvdXQoKmNoaWxkKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICAgICAgbGF5b3V0UXVldWUuYXBwZW5kKGNoaWxkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
fQotCi0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gTGF5b3V0RGlyZWN0aW9uOjpTaWJsaW5nKSB7
Ci0gICAgICAgICAgICBmb3IgKGF1dG8qIG5leHRTaWJsaW5nID0gbGF5b3V0Qm94Lm5leHRJbkZs
b3dPckZsb2F0aW5nU2libGluZygpOyBuZXh0U2libGluZzsgbmV4dFNpYmxpbmcgPSBuZXh0U2li
bGluZy0+bmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBp
ZiAoIWludmFsaWRhdGlvblN0YXRlLm5lZWRzTGF5b3V0KCpuZXh0U2libGluZykpCi0gICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGxheW91dFF1ZXVlLmFwcGVu
ZChuZXh0U2libGluZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9OwotCi0gICAgYXV0
byBjb25zdHJhaW50c0ZvckxheW91dEJveCA9IFsmXSAoY29uc3QgYXV0byYgbGF5b3V0Qm94KSB7
Ci0gICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxheW91dEJveC5jb250YWluaW5nQmxv
Y2soKTsKLSAgICAgICAgcmV0dXJuICZjb250YWluaW5nQmxvY2sgPT0gJmZvcm1hdHRpbmdSb290
ID8gY29uc3RyYWludHMgOiBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChj
b250YWluaW5nQmxvY2spOwotICAgIH07Ci0KLSAgICAvLyBUaGlzIGlzIGEgcG9zdC1vcmRlciB0
cmVlIHRyYXZlcnNhbCBsYXlvdXQuCi0gICAgLy8gVGhlIHJvb3QgY29udGFpbmVyIGxheW91dCBp
cyBkb25lIGluIHRoZSBmb3JtYXR0aW5nIGNvbnRleHQgaXQgbGl2ZXMgaW4sIG5vdCB0aGF0IG9u
ZSBpdCBjcmVhdGVzLCBzbyBsZXQncyBzdGFydCB3aXRoIHRoZSBmaXJzdCBjaGlsZC4KLSAgICBh
cHBlbmROZXh0VG9MYXlvdXRRdWV1ZShmb3JtYXR0aW5nUm9vdCwgTGF5b3V0RGlyZWN0aW9uOjpD
aGlsZCk7Ci0gICAgLy8gMS4gR28gYWxsIHRoZSB3YXkgZG93biB0byB0aGUgbGVhZiBub2RlCi0g
ICAgLy8gMi4gQ29tcHV0ZSBzdGF0aWMgcG9zaXRpb24gYW5kIHdpZHRoIGFzIHdlIHRyYXZlcnNl
IGRvd24KLSAgICAvLyAzLiBBcyB3ZSBjbGltYiBiYWNrIG9uIHRoZSB0cmVlLCBjb21wdXRlIGhl
aWdodCBhbmQgZmluaWFsaXplIHBvc2l0aW9uCi0gICAgLy8gKEFueSBzdWJ0cmVlcyB3aXRoIG5l
dyBmb3JtYXR0aW5nIGNvbnRleHRzIG5lZWQgdG8gbGF5b3V0IHN5bmNocm9ub3VzbHkpCi0gICAg
d2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgLy8gVHJhdmVyc2UgZG93
biBvbiB0aGUgZGVzY2VuZGFudHMgYW5kIGNvbXB1dGUgd2lkdGgvc3RhdGljIHBvc2l0aW9uIHVu
dGlsIHdlIGZpbmQgYSBsZWFmIG5vZGUuCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAg
ICAgICBhdXRvJiBsYXlvdXRCb3ggPSAqbGF5b3V0UXVldWUubGFzdCgpOwotICAgICAgICAgICAg
YXV0byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94
KGxheW91dEJveCk7Ci0KLSAgICAgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKGxheW91
dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAg
ICBjb21wdXRlU3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9j
a0NvbnN0cmFpbnRzLnZlcnRpY2FsKTsKLSAgICAgICAgICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdp
bihmbG9hdGluZ0NvbnRleHQsIGxheW91dEJveCwgeyBjb25zdHJhaW50cywgY29udGFpbmluZ0Js
b2NrQ29uc3RyYWludHMgfSk7Ci0gICAgICAgICAgICBjb21wdXRlU3RhdGljSG9yaXpvbnRhbFBv
c2l0aW9uKGxheW91dEJveCwgY29udGFpbmluZ0Jsb2NrQ29uc3RyYWludHMuaG9yaXpvbnRhbCk7
Ci0gICAgICAgICAgICBjb21wdXRlUG9zaXRpb25Ub0F2b2lkRmxvYXRzKGZsb2F0aW5nQ29udGV4
dCwgbGF5b3V0Qm94LCB7IGNvbnN0cmFpbnRzLCBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyB9
KTsKLQotICAgICAgICAgICAgaWYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250
ZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gp
ICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5n
Q2hpbGQoKSkgewotICAgICAgICAgICAgICAgICAgICBhdXRvJiBjb250YWluZXJCb3ggPSBkb3du
Y2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChj
b250YWluZXJCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAvLyBJRkNzIGluaGVyaXQgZmxvYXRzIGZyb20gcGFyZW50IEZD
cy4gV2UgbmVlZCBmaW5hbCB2ZXJ0aWNhbCBwb3NpdGlvbiB0byBmaW5kIGludHJ1ZGluZyBmbG9h
dHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb21wdXRlVmVydGljYWxQb3NpdGlvbkZv
ckJveEFuZEFuY2VzdG9ycyhjb250YWluZXJCb3gsIHsgY29uc3RyYWludHMsIGNvbnRhaW5pbmdC
bG9ja0NvbnN0cmFpbnRzIH0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgICAgIC8vIExheW91dCB0aGUgaW5mbG93IGRlc2NlbmRhbnRzIG9mIHRoaXMgZm9ybWF0dGlu
ZyBjb250ZXh0IHJvb3QuCi0gICAgICAgICAgICAgICAgICAgIGF1dG8gZm9ybWF0dGluZ0NvbnRl
eHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChjb250YWluZXJCb3gs
IGxheW91dFN0YXRlKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyQm94Lmlz
VGFibGVXcmFwcGVyQm94KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3duY2FzdDxUYWJs
ZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0PigqZm9ybWF0dGluZ0NvbnRleHQpLnNldEhv
cml6b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxvYXRzKGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFp
bnRzLmhvcml6b250YWwpOwotICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nQ29udGV4dC0+
bGF5b3V0SW5GbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5jb25zdHJh
aW50c0ZvckluRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFh
cHBlbmROZXh0VG9MYXlvdXRRdWV1ZShsYXlvdXRCb3gsIExheW91dERpcmVjdGlvbjo6Q2hpbGQp
KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xpbWIg
YmFjayBvbiB0aGUgYW5jZXN0b3JzIGFuZCBjb21wdXRlIGhlaWdodC9maW5hbCBwb3NpdGlvbi4K
LSAgICAgICAgd2hpbGUgKCFsYXlvdXRRdWV1ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGF1
dG8mIGxheW91dEJveCA9ICpsYXlvdXRRdWV1ZS50YWtlTGFzdCgpOwotICAgICAgICAgICAgYXV0
byBjb250YWluaW5nQmxvY2tDb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzRm9yTGF5b3V0Qm94KGxh
eW91dEJveCk7Ci0KLSAgICAgICAgICAgIC8vIEFsbCBpbmZsb3cgZGVzY2VuZGFudHMgKGlmIHRo
ZXJlIGFyZSBhbnkpIGFyZSBsYWlkIG91dCBieSBub3cuIExldCdzIGNvbXB1dGUgdGhlIGJveCdz
IGhlaWdodCBhbmQgdmVydGljYWwgbWFyZ2luLgotICAgICAgICAgICAgY29tcHV0ZUhlaWdodEFu
ZE1hcmdpbihsYXlvdXRCb3gsIGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzKTsKLSAgICAgICAg
ICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgICAg
ICBmbG9hdGluZ1N0YXRlLmFwcGVuZChmbG9hdGluZ0NvbnRleHQudG9GbG9hdEl0ZW0obGF5b3V0
Qm94KSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBBZGp1c3QgdGhl
IHZlcnRpY2FsIHBvc2l0aW9uIG5vdyB0aGF0IHdlJ3ZlIGdvdCBmaW5hbCBtYXJnaW4gdmFsdWVz
IGZvciBub24tZmxvYXQgYXZvaWRlciBib3hlcy4KLSAgICAgICAgICAgICAgICAvLyBGbG9hdCBh
dm9pZGVycyBoYXZlIHByZS1jb21wdXRlZCB2ZXJ0aWNhbCBwb3NpdGlvbnMgd2hlbiBmbG9hdHMg
YXJlIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRCb3guaXNGbG9hdEF2b2lk
ZXIoKSB8fCBmbG9hdGluZ0NvbnRleHQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1hdHRpbmdTdGF0ZSgpOwotICAgICAg
ICAgICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9t
ZXRyeShsYXlvdXRCb3gpOwotICAgICAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dp
Y2FsVG9wKHZlcnRpY2FsUG9zaXRpb25XaXRoTWFyZ2luKGxheW91dEJveCwgZm9ybWF0dGluZ1N0
YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpLCBjb250YWluaW5nQmxvY2tDb25zdHJh
aW50cy52ZXJ0aWNhbCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGF1dG8gZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCA9IGxheW91dEJveC5lc3Rh
Ymxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCk7IAotICAgICAgICAgICAgaWYgKGVzdGFibGlzaGVz
Rm9ybWF0dGluZ0NvbnRleHQpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBjb21w
dXRlZCB0aGUgYm94J3MgaGVpZ2h0LCB3ZSBjYW4gbGF5b3V0IHRoZSBvdXQtb2YtZmxvdyBkZXNj
ZW5kYW50cy4KLSAgICAgICAgICAgICAgICBpZiAoaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gp
ICYmIGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNDaGlsZCgpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5lckJveCA9IGRvd25jYXN0PENvbnRhaW5lckJv
eD4obGF5b3V0Qm94KTsKLSAgICAgICAgICAgICAgICAgICAgTGF5b3V0Q29udGV4dDo6Y3JlYXRl
Rm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmVyQm94LCBsYXlvdXRTdGF0ZSgpKS0+bGF5b3V0T3V0
T2ZGbG93Q29udGVudChpbnZhbGlkYXRpb25TdGF0ZSwgZ2VvbWV0cnkoKS5jb25zdHJhaW50c0Zv
ck91dE9mRmxvd0NvbnRlbnQoY29udGFpbmVyQm94KSk7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFlc3RhYmxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0
ICYmIGlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94KSkKLSAgICAgICAgICAgICAgICBwbGFjZUlu
Rmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCks
IGNvbnRhaW5pbmdCbG9ja0NvbnN0cmFpbnRzLmhvcml6b250YWwpOwotCi0gICAgICAgICAgICBp
ZiAoYXBwZW5kTmV4dFRvTGF5b3V0UXVldWUobGF5b3V0Qm94LCBMYXlvdXREaXJlY3Rpb246OlNp
YmxpbmcpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIC8v
IFBsYWNlIHRoZSBpbmZsb3cgcG9zaXRpb25lZCBjaGlsZHJlbi4KLSAgICBwbGFjZUluRmxvd1Bv
c2l0aW9uZWRDaGlsZHJlbihmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7
Ci0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwg
IltFbmRdIC0+IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCAtPiBmb3JtYXR0aW5nIHJvb3QoIiA8
PCAmcm9vdCgpIDw8ICIpIik7Ci19Ci0KLUxheW91dFVuaXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdAotewotICAgIC8vIDEwLjYuNyAnQXV0bycgaGVp
Z2h0cyBmb3IgYmxvY2sgZm9ybWF0dGluZyBjb250ZXh0IHJvb3RzCi0KLSAgICAvLyBJZiBpdCBo
YXMgYmxvY2stbGV2ZWwgY2hpbGRyZW4sIHRoZSBoZWlnaHQgaXMgdGhlIGRpc3RhbmNlIGJldHdl
ZW4gdGhlIHRvcCBtYXJnaW4tZWRnZSBvZiB0aGUgdG9wbW9zdCBibG9jay1sZXZlbAotICAgIC8v
IGNoaWxkIGJveCBhbmQgdGhlIGJvdHRvbSBtYXJnaW4tZWRnZSBvZiB0aGUgYm90dG9tbW9zdCBi
bG9jay1sZXZlbCBjaGlsZCBib3guCi0KLSAgICAvLyBJbiBhZGRpdGlvbiwgaWYgdGhlIGVsZW1l
bnQgaGFzIGFueSBmbG9hdGluZyBkZXNjZW5kYW50cyB3aG9zZSBib3R0b20gbWFyZ2luIGVkZ2Ug
aXMgYmVsb3cgdGhlIGVsZW1lbnQncyBib3R0b20gY29udGVudCBlZGdlLAotICAgIC8vIHRoZW4g
dGhlIGhlaWdodCBpcyBpbmNyZWFzZWQgdG8gaW5jbHVkZSB0aG9zZSBlZGdlcy4gT25seSBmbG9h
dHMgdGhhdCBwYXJ0aWNpcGF0ZSBpbiB0aGlzIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBhcmUg
dGFrZW4KLSAgICAvLyBpbnRvIGFjY291bnQsIGUuZy4sIGZsb2F0cyBpbnNpZGUgYWJzb2x1dGVs
eSBwb3NpdGlvbmVkIGRlc2NlbmRhbnRzIG9yIG90aGVyIGZsb2F0cyBhcmUgbm90LgotICAgIGF1
dG8gdG9wID0gT3B0aW9uYWw8TGF5b3V0VW5pdD4geyB9OwotICAgIGF1dG8gYm90dG9tID0gT3B0
aW9uYWw8TGF5b3V0VW5pdD4geyB9OwotICAgIGlmIChyb290KCkuaGFzSW5GbG93Q2hpbGQoKSkg
ewotICAgICAgICB0b3AgPSBCb3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9tZXRyeUZvckJv
eCgqcm9vdCgpLmZpcnN0SW5GbG93Q2hpbGQoKSkpLnRvcCgpOwotICAgICAgICBib3R0b20gPSBC
b3hHZW9tZXRyeTo6bWFyZ2luQm94UmVjdChnZW9tZXRyeUZvckJveCgqcm9vdCgpLmxhc3RJbkZs
b3dDaGlsZCgpKSkuYm90dG9tKCk7Ci0gICAgfQotCi0gICAgYXV0byBmbG9hdGluZ0NvbnRleHQg
PSBGbG9hdGluZ0NvbnRleHQgeyAqdGhpcywgZm9ybWF0dGluZ1N0YXRlKCkuZmxvYXRpbmdTdGF0
ZSgpIH07Ci0gICAgaWYgKGF1dG8gZmxvYXRUb3AgPSBmbG9hdGluZ0NvbnRleHQudG9wKCkpIHsK
LSAgICAgICAgdG9wID0gc3RkOjptaW4oKmZsb2F0VG9wLCB0b3AudmFsdWVPcigqZmxvYXRUb3Ap
KTsKLSAgICAgICAgYXV0byBmbG9hdEJvdHRvbSA9ICpmbG9hdGluZ0NvbnRleHQuYm90dG9tKCk7
Ci0gICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4KGZsb2F0Qm90dG9tLCBib3R0b20udmFsdWVPcihm
bG9hdEJvdHRvbSkpOwotICAgIH0KLSAgICByZXR1cm4gKmJvdHRvbSAtICp0b3A7Ci19Ci0KLU9w
dGlvbmFsPExheW91dFVuaXQ+IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OnVzZWRBdmFpbGFibGVX
aWR0aEZvckZsb2F0QXZvaWRlcihjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4
dCwgY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWlu
dHNQYWlyKQotewotICAgIC8vIE5vcm1hbGx5IHRoZSBhdmFpbGFibGUgd2lkdGggZm9yIGFuIGlu
LWZsb3cgYmxvY2sgbGV2ZWwgYm94IGlzIHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmluZyBibG9j
aydzIGNvbnRlbnQgYm94LgotICAgIC8vIEhvd2V2ZXIgKGFuZCBjYW4ndCBmaW5kIGl0IGFueXdo
ZXJlIGluIHRoZSBzcGVjKSBub24tZmxvYXRpbmcgcG9zaXRpb25lZCBmbG9hdCBhdm9pZGVyIGJs
b2NrIGxldmVsIGJveGVzIGFyZSBjb25zdHJhaW5lZCBieSBleGlzdGluZyBmbG9hdHMuCi0gICAg
QVNTRVJUKGxheW91dEJveC5pc0Zsb2F0QXZvaWRlcigpKTsKLSAgICBpZiAoZmxvYXRpbmdDb250
ZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAvLyBGbG9hdCBjbGVhciBw
dXNoZXMgdGhlIGJsb2NrIGxldmVsIGJveCBlaXRoZXIgYmVsb3cgdGhlIGZsb2F0cywgb3IganVz
dCBvbmUgc2lkZSBiZWxvdyBidXQgdGhlIG90aGVyIHNpZGUgY291bGQgb3ZlcmxhcC4KLSAgICAv
LyBXaGF0IGl0IG1lYW5zIGlzIHRoYXQgdGhlIHVzZWQgYXZhaWxhYmxlIHdpZHRoIGFsd2F5cyBt
YXRjaGVzIHRoZSBjb250YWluaW5nIGJsb2NrJ3MgY29uc3RyYWludC4KLSAgICBpZiAobGF5b3V0
Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKLSAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgIEFTU0VSVChs
YXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKLSAgICAvLyBWZXJ0aWNh
bCBzdGF0aWMgcG9zaXRpb24gaXMgbm90IGNvbXB1dGVkIHlldCBmb3IgdGhpcyBmb3JtYXR0aW5n
IGNvbnRleHQgcm9vdCwgc28gbGV0J3MganVzdCBwcmUtY29tcHV0ZSBpdCBmb3Igbm93LgotICAg
IHByZWNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGxheW91dEJveCwg
Y29uc3RyYWludHNQYWlyKTsKLQotICAgIGF1dG8gbG9naWNhbFRvcEluRm9ybWF0dGluZ0NvbnRl
eHRSb290Q29vcmRpbmF0ZSA9IFsmXSAoYXV0byYgZmxvYXRBdm9pZGVyKSB7Ci0gICAgICAgIGF1
dG8gdG9wID0gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChnZW9tZXRyeUZvckJveChmbG9hdEF2
b2lkZXIpKTsKLSAgICAgICAgZm9yIChhdXRvKiBhbmNlc3RvciA9ICZmbG9hdEF2b2lkZXIuY29u
dGFpbmluZ0Jsb2NrKCk7IGFuY2VzdG9yICE9ICZyb290KCk7IGFuY2VzdG9yID0gJmFuY2VzdG9y
LT5jb250YWluaW5nQmxvY2soKSkKLSAgICAgICAgICAgIHRvcCArPSBCb3hHZW9tZXRyeTo6Ym9y
ZGVyQm94VG9wKGdlb21ldHJ5Rm9yQm94KCphbmNlc3RvcikpOwotICAgICAgICByZXR1cm4gdG9w
OwotICAgIH07Ci0KLSAgICBhdXRvIGZsb2F0Q29uc3RyYWludHNJbkNvbnRhaW5pbmdCbG9ja0Nv
b3JkaW5hdGUgPSBbJl0gKGF1dG8gZmxvYXRDb25zdHJhaW50cykgewotICAgICAgICBpZiAoIWZs
b2F0Q29uc3RyYWludHMubGVmdCAmJiAhZmxvYXRDb25zdHJhaW50cy5yaWdodCkKLSAgICAgICAg
ICAgIHJldHVybiBGbG9hdGluZ0NvbnRleHQ6OkNvbnN0cmFpbnRzIHsgfTsKLSAgICAgICAgYXV0
byBvZmZzZXQgPSBMYXlvdXRTaXplIHsgfTsKLSAgICAgICAgZm9yIChhdXRvKiBhbmNlc3RvciA9
ICZsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7IGFuY2VzdG9yICE9ICZyb290KCk7IGFuY2Vz
dG9yID0gJmFuY2VzdG9yLT5jb250YWluaW5nQmxvY2soKSkKLSAgICAgICAgICAgIG9mZnNldCAr
PSB0b0xheW91dFNpemUoQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcExlZnQoZ2VvbWV0cnlGb3JC
b3goKmFuY2VzdG9yKSkpOwotICAgICAgICBpZiAoZmxvYXRDb25zdHJhaW50cy5sZWZ0KQotICAg
ICAgICAgICAgZmxvYXRDb25zdHJhaW50cy5sZWZ0ID0gUG9pbnRJbkNvbnRleHRSb290IHsgKmZs
b2F0Q29uc3RyYWludHMubGVmdCAtIG9mZnNldCB9OwotICAgICAgICBpZiAoZmxvYXRDb25zdHJh
aW50cy5yaWdodCkKLSAgICAgICAgICAgIGZsb2F0Q29uc3RyYWludHMucmlnaHQgPSBQb2ludElu
Q29udGV4dFJvb3QgeyAqZmxvYXRDb25zdHJhaW50cy5yaWdodCAtIG9mZnNldCB9OwotICAgICAg
ICByZXR1cm4gZmxvYXRDb25zdHJhaW50czsKLSAgICB9OwotCi0gICAgLy8gRklYTUU6IENoZWNr
IGlmIHRoZSBub24teWV0LWNvbXB1dGVkIGhlaWdodCBhZmZlY3RzIHRoaXMgY29tcHV0YXRpb24g
LSBhbmQgd2hldGhlciB3ZSBoYXZlIHRvIHJlc29sdmUgaXQgYXQgYSBsYXRlciBwb2ludC4KLSAg
ICBhdXRvIGxvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wSW5Gb3JtYXR0aW5nQ29udGV4dFJvb3RDb29y
ZGluYXRlKGxheW91dEJveCk7Ci0gICAgYXV0byBjb25zdHJhaW50cyA9IGZsb2F0Q29uc3RyYWlu
dHNJbkNvbnRhaW5pbmdCbG9ja0Nvb3JkaW5hdGUoZmxvYXRpbmdDb250ZXh0LmNvbnN0cmFpbnRz
KGxvZ2ljYWxUb3AsIGxvZ2ljYWxUb3ApKTsKLSAgICBpZiAoIWNvbnN0cmFpbnRzLmxlZnQgJiYg
IWNvbnN0cmFpbnRzLnJpZ2h0KQotICAgICAgICByZXR1cm4geyB9OwotICAgIC8vIFNocmluayB0
aGUgYXZhaWxhYmxlIHNwYWNlIGlmIHRoZSBmbG9hdHMgYXJlIGFjdHVhbGx5IGludHJ1ZGluZyBh
dCB0aGlzIHZlcnRpY2FsIHBvc2l0aW9uLgotICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBjb25z
dHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2NrLmhvcml6b250YWwubG9naWNhbFdpZHRoOwotICAg
IGlmIChjb25zdHJhaW50cy5sZWZ0KQotICAgICAgICBhdmFpbGFibGVXaWR0aCAtPSBjb25zdHJh
aW50cy5sZWZ0LT54OwotICAgIGlmIChjb25zdHJhaW50cy5yaWdodCkKLSAgICAgICAgYXZhaWxh
YmxlV2lkdGggLT0gc3RkOjptYXgoMF9sdSwgY29uc3RyYWludHNQYWlyLmNvbnRhaW5pbmdCbG9j
ay5ob3Jpem9udGFsLmxvZ2ljYWxSaWdodCgpIC0gY29uc3RyYWludHMucmlnaHQtPngpOwotICAg
IHJldHVybiBhdmFpbGFibGVXaWR0aDsKLX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpwbGFjZUluRmxvd1Bvc2l0aW9uZWRDaGlsZHJlbihjb25zdCBDb250YWluZXJCb3gmIGNvbnRh
aW5lckJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWlu
dHMpCi17Ci0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJl
YW0gPDwgIlN0YXJ0OiBtb3ZlIGluLWZsb3cgcG9zaXRpb25lZCBjaGlsZHJlbiAtPiBwYXJlbnQ6
ICIgPDwgJmNvbnRhaW5lckJveCk7Ci0gICAgZm9yIChhdXRvJiBjaGlsZEJveCA6IGNoaWxkcmVu
T2ZUeXBlPEJveD4oY29udGFpbmVyQm94KSkgewotICAgICAgICBpZiAoIWNoaWxkQm94LmlzSW5G
bG93UG9zaXRpb25lZCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGF1dG8gcG9z
aXRpb25PZmZzZXQgPSBnZW9tZXRyeSgpLmluRmxvd1Bvc2l0aW9uZWRQb3NpdGlvbk9mZnNldChj
aGlsZEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgZm9ybWF0dGluZ1N0YXRl
KCkuYm94R2VvbWV0cnkoY2hpbGRCb3gpLm1vdmUocG9zaXRpb25PZmZzZXQpOwotICAgIH0KLSAg
ICBMT0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiRW5k
OiBtb3ZlIGluLWZsb3cgcG9zaXRpb25lZCBjaGlsZHJlbiAtPiBwYXJlbnQ6ICIgPDwgJmNvbnRh
aW5lckJveCk7Ci19Ci0KLXZvaWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZVN0YXRp
Y1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IFZlcnRpY2FsQ29u
c3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpCi17Ci0gICAgZm9ybWF0dGluZ1N0YXRlKCku
Ym94R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRMb2dpY2FsVG9wKGdlb21ldHJ5KCkuc3RhdGljVmVy
dGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIHZlcnRpY2FsQ29uc3RyYWludHMpKTsKLX0KLQotdm9p
ZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlU3RhdGljSG9yaXpvbnRhbFBvc2l0aW9u
KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6
b250YWxDb25zdHJhaW50cykKLXsKLSAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShs
YXlvdXRCb3gpLnNldExvZ2ljYWxMZWZ0KGdlb21ldHJ5KCkuc3RhdGljSG9yaXpvbnRhbFBvc2l0
aW9uKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSk7Ci19Ci0KLXZvaWQgQmxvY2tG
b3JtYXR0aW5nQ29udGV4dDo6cHJlY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNl
c3RvcnMoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYgY29uc3Ry
YWludHNQYWlyKQotewotICAgIC8vIEluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgd2hldGhlciBhIGJv
eCBzaG91bGQgYXZvaWQgYSBmbG9hdCwgd2UgbmVlZCB0byBrbm93IHRoZSBmaW5hbCBwb3NpdGlv
bnMgb2YgYm90aCAoaWdub3JlIHJlbGF0aXZlIHBvc2l0aW9uaW5nIGZvciBub3cpLgotICAgIC8v
IEluIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCB0aGUgZmluYWwgcG9zaXRpb24gZm9yIGEgbm9y
bWFsIGZsb3cgYm94IGluY2x1ZGVzCi0gICAgLy8gMS4gdGhlIHN0YXRpYyBwb3NpdGlvbiBhbmQK
LSAgICAvLyAyLiB0aGUgY29ycmVzcG9uZGluZyAobm9uKWNvbGxhcHNlZCBtYXJnaW5zLgotICAg
IC8vIE5vdyB0aGUgdmVydGljYWwgbWFyZ2lucyBhcmUgY29tcHV0ZWQgd2hlbiBhbGwgdGhlIGRl
c2NlbmRhbnRzIGFyZSBmaW5hbGl6ZWQsIGJlY2F1c2UgdGhlIG1hcmdpbiB2YWx1ZXMgbWlnaHQg
YmUgZGVwZW5kaW5nIG9uIHRoZSBoZWlnaHQgb2YgdGhlIGJveAotICAgIC8vIChhbmQgdGhlIGhl
aWdodCBtaWdodCBiZSBiYXNlZCBvbiB0aGUgY29udGVudCkuCi0gICAgLy8gU28gd2hlbiB3ZSBn
ZXQgdG8gdGhlIHBvaW50IHdoZXJlIHdlIGludGVyc2VjdCB0aGUgYm94IHdpdGggdGhlIGZsb2F0
IHRvIGRlY2lkZSBpZiB0aGUgYm94IG5lZWRzIHRvIG1vdmUsIHdlIGRvbid0IHlldCBoYXZlIHRo
ZSBmaW5hbCB2ZXJ0aWNhbCBwb3NpdGlvbi4KLSAgICAvLwotICAgIC8vIFRoZSBpZGVhIGhlcmUg
aXMgdGhhdCBhcyBsb25nIGFzIHdlIGRvbid0IGNyb3NzIHRoZSBibG9jayBmb3JtYXR0aW5nIGNv
bnRleHQgYm91bmRhcnksIHdlIHNob3VsZCBiZSBhYmxlIHRvIHByZS1jb21wdXRlIHRoZSBmaW5h
bCB0b3AgcG9zaXRpb24uCi0gICAgLy8gRklYTUU6IHdlIGN1cnJlbnRseSBkb24ndCBhY2NvdW50
IGZvciB0aGUgImNsZWFyIiBwcm9wZXJ0eSB3aGVuIGNvbXB1dGluZyB0aGUgZmluYWwgcG9zaXRp
b24gZm9yIGFuIGFuY2VzdG9yLgotICAgIGZvciAoYXV0byogYW5jZXN0b3IgPSAmbGF5b3V0Qm94
OyBhbmNlc3RvciAmJiBhbmNlc3RvciAhPSAmcm9vdCgpOyBhbmNlc3RvciA9ICZhbmNlc3Rvci0+
Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAgICAgYXV0byBjb25zdHJhaW50c0ZvckFuY2VzdG9y
ID0gWyZdIHsKLSAgICAgICAgICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGFuY2VzdG9yLT5j
b250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgIHJldHVybiAmY29udGFpbmluZ0Jsb2NrID09
ICZyb290KCkgPyBjb25zdHJhaW50c1BhaXIuZm9ybWF0dGluZ0NvbnRleHRSb290IDogZ2VvbWV0
cnkoKS5jb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQoY29udGFpbmluZ0Jsb2NrKTsKLSAgICAg
ICAgfSgpOwotCi0gICAgICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5
KCkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbigqYW5jZXN0b3IsIGNvbnN0cmFpbnRzRm9yQW5jZXN0
b3IuaG9yaXpvbnRhbCk7Ci0gICAgICAgIGF1dG8gdXNlZE5vbkNvbGxhcHNlZE1hcmdpbiA9IFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIHsgY29tcHV0ZWRWZXJ0aWNhbE1h
cmdpbi5iZWZvcmUudmFsdWVPcigwKSwgY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbi5hZnRlci52YWx1
ZU9yKDApIH07Ci0gICAgICAgIGF1dG8gcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUgPSBtYXJnaW5D
b2xsYXBzZSgpLnByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKCphbmNlc3RvciwgdXNlZE5vbkNvbGxh
cHNlZE1hcmdpbik7Ci0KLSAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3Rh
dGUoKS5ib3hHZW9tZXRyeSgqYW5jZXN0b3IpOwotICAgICAgICBhdXRvIG5vbkNvbGxhcHNlZFZh
bHVlcyA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFwc2VkVmFsdWVzIHsgcHJlY29tcHV0
ZWRNYXJnaW5CZWZvcmUubm9uQ29sbGFwc2VkVmFsdWUsIHsgfSB9OwotICAgICAgICBhdXRvIGNv
bGxhcHNlZFZhbHVlcyA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6Q29sbGFwc2VkVmFsdWVzIHsgcHJl
Y29tcHV0ZWRNYXJnaW5CZWZvcmUuY29sbGFwc2VkVmFsdWUsIHsgfSwgZmFsc2UgfTsKLSAgICAg
ICAgYXV0byB2ZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbiB7IG5vbkNvbGxhcHNl
ZFZhbHVlcywgY29sbGFwc2VkVmFsdWVzLCB7IHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlLnBvc2l0
aXZlQW5kTmVnYXRpdmVNYXJnaW5CZWZvcmUsIHsgfSB9IH07Ci0KLSAgICAgICAgZm9ybWF0dGlu
Z1N0YXRlKCkuc2V0VXNlZFZlcnRpY2FsTWFyZ2luKCphbmNlc3RvciwgdmVydGljYWxNYXJnaW4p
OwotICAgICAgICBib3hHZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9yZSh2
ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVyKHZlcnRpY2FsTWFyZ2luKSB9KTsKLSAgICAgICAg
Ym94R2VvbWV0cnkuc2V0TG9naWNhbFRvcCh2ZXJ0aWNhbFBvc2l0aW9uV2l0aE1hcmdpbigqYW5j
ZXN0b3IsIHZlcnRpY2FsTWFyZ2luLCBjb25zdHJhaW50c0ZvckFuY2VzdG9yLnZlcnRpY2FsKSk7
Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICAgICAgc2V0UHJlY29tcHV0ZWRNYXJnaW5CZWZvcmUo
KmFuY2VzdG9yLCBwcmVjb21wdXRlZE1hcmdpbkJlZm9yZSk7Ci0gICAgICAgIGJveEdlb21ldHJ5
LnNldEhhc1ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKCk7Ci0jZW5kaWYKLSAgICB9Ci19Ci0KLXZv
aWQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZVBvc2l0aW9uVG9Bdm9pZEZsb2F0cyhj
b25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCwgY29uc3QgQm94JiBsYXlvdXRC
b3gsIGNvbnN0IENvbnN0cmFpbnRzUGFpciYgY29uc3RyYWludHNQYWlyKQotewotICAgIGlmICgh
bGF5b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAvLyBJbiBv
cmRlciB0byBwb3NpdGlvbiBhIGZsb2F0IGF2b2lkZXIgd2UgbmVlZCB0byBrbm93IGl0cyB2ZXJ0
aWNhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byBpdHMgZm9ybWF0dGluZyBjb250ZXh0IHJvb3QgKGFu
ZCBub3QganVzdCBpdHMgY29udGFpbmluZyBibG9jayksCi0gICAgLy8gYmVjYXVzZSBhbGwgdGhl
IGFscmVhZHktcGxhY2VkIGZsb2F0cyAoZmxvYXRzIHRoYXQgd2UgYXJlIHRyeWluZyB0byBhdm9p
ZCBoZXJlKSBpbiB0aGlzIEJGQyBtaWdodCBiZWxvbmcKLSAgICAvLyB0byBhIGRpZmZlcmVudCBz
ZXQgb2YgY29udGFpbmluZyBibG9ja3MgKGJ1dCB0aGV5IGFsbCBkZXNjZW5kYW50cyBvZiB0aGUg
QkZDIHJvb3QpLgotICAgIC8vIEhvd2V2ZXIgYWNjb3JkaW5nIHRvIHRoZSBCRkMgcnVsZXMsIGF0
IHRoaXMgcG9pbnQgb2YgdGhlIGxheW91dCBmbG93IHdlIGRvbid0IHlldCBoYXZlIGNvbXB1dGVk
IHZlcnRpY2FsIHBvc2l0aW9ucyBmb3IgdGhlIGFuY2VzdG9ycy4KLSAgICBpZiAobGF5b3V0Qm94
LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgcHJlY29tcHV0ZVZlcnRpY2FsUG9z
aXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMobGF5b3V0Qm94LCBjb25zdHJhaW50c1BhaXIpOwotICAg
ICAgICBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9tZXRyeShsYXlvdXRCb3gpLnNldExvZ2ljYWxU
b3BMZWZ0KGZsb2F0aW5nQ29udGV4dC5wb3NpdGlvbkZvckZsb2F0KGxheW91dEJveCwgY29uc3Ry
YWludHNQYWlyLmNvbnRhaW5pbmdCbG9jay5ob3Jpem9udGFsKSk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0gICAgLy8gTm9uLWZsb2F0IHBvc2l0aW9uZWQgZmxvYXQgYXZvaWRlcnMgKGZvcm1h
dHRpbmcgY29udGV4dCByb290cyBhbmQgY2xlYXIgYm94ZXMpIHNob3VsZCBiZSBmaW5lIHVubGVz
cyB0aGVyZSBhcmUgZmxvYXRzIGluIHRoaXMgY29udGV4dC4KLSAgICBpZiAoZmxvYXRpbmdDb250
ZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIHByZWNvbXB1dGVWZXJ0aWNhbFBv
c2l0aW9uRm9yQm94QW5kQW5jZXN0b3JzKGxheW91dEJveCwgY29uc3RyYWludHNQYWlyKTsKLSAg
ICBpZiAobGF5b3V0Qm94Lmhhc0Zsb2F0Q2xlYXIoKSkKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVW
ZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihmbG9hdGluZ0NvbnRleHQsIGxheW91dEJveCk7
Ci0KLSAgICBBU1NFUlQobGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7
Ci0gICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRMb2dpY2Fs
VG9wTGVmdChmbG9hdGluZ0NvbnRleHQucG9zaXRpb25Gb3JOb25GbG9hdGluZ0Zsb2F0QXZvaWRl
cihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzUGFpci5jb250YWluaW5nQmxvY2suaG9yaXpvbnRhbCkp
OwotfQotCi12b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVWZXJ0aWNhbFBvc2l0
aW9uRm9yRmxvYXRDbGVhcihjb25zdCBGbG9hdGluZ0NvbnRleHQmIGZsb2F0aW5nQ29udGV4dCwg
Y29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAgQVNTRVJUKGxheW91dEJveC5oYXNGbG9hdENs
ZWFyKCkpOwotICAgIGlmIChmbG9hdGluZ0NvbnRleHQuaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm47Ci0gICAgYXV0byB2ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJhbmNlID0gZmxvYXRpbmdDb250
ZXh0LnZlcnRpY2FsUG9zaXRpb25XaXRoQ2xlYXJhbmNlKGxheW91dEJveCk7Ci0gICAgaWYgKCF2
ZXJ0aWNhbFBvc2l0aW9uQW5kQ2xlYXJhbmNlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBhdXRv
JiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7
Ci0gICAgQVNTRVJUKHZlcnRpY2FsUG9zaXRpb25BbmRDbGVhcmFuY2UtPnBvc2l0aW9uID49IEJv
eEdlb21ldHJ5Ojpib3JkZXJCb3hUb3AoYm94R2VvbWV0cnkpKTsKLSAgICBib3hHZW9tZXRyeS5z
ZXRMb2dpY2FsVG9wKHZlcnRpY2FsUG9zaXRpb25BbmRDbGVhcmFuY2UtPnBvc2l0aW9uKTsKLSAg
ICBpZiAodmVydGljYWxQb3NpdGlvbkFuZENsZWFyYW5jZS0+Y2xlYXJhbmNlKQotICAgICAgICBm
b3JtYXR0aW5nU3RhdGUoKS5zZXRIYXNDbGVhcmFuY2UobGF5b3V0Qm94KTsKLSAgICAvLyBGSVhN
RTogUmVzZXQgdGhlIG1hcmdpbiB2YWx1ZXMgb24gdGhlIGFuY2VzdG9ycy9wcmV2aW91cyBzaWJs
aW5ncyBub3cgdGhhdCB0aGUgZmxvYXQgYXZvaWRlciB3aXRoIGNsZWFyYW5jZSBkb2VzIG5vdCBt
YXJnaW4gY29sbGFwc2UgYW55bW9yZS4KLX0KLQotdm9pZCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
Ojpjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3QgRmxvYXRpbmdDb250ZXh0JiBmbG9hdGluZ0Nv
bnRleHQsIGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBDb25zdHJhaW50c1BhaXImIGNvbnN0
cmFpbnRzUGFpcikKLXsKLSAgICBhdXRvIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyID0gT3B0
aW9uYWw8TGF5b3V0VW5pdD4geyB9OwotICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdEF2b2lkZXIo
KSkgewotICAgICAgICAvLyBGbG9hdCBhdm9pZGVycycgYXZhaWxhYmxlIHdpZHRoIG1pZ2h0IGJl
IHNocnVuayBieSBleGlzdGluZyBmbG9hdHMgaW4gdGhlIGNvbnRleHQuCi0gICAgICAgIGF2YWls
YWJsZVdpZHRoRmxvYXRBdm9pZGVyID0gdXNlZEF2YWlsYWJsZVdpZHRoRm9yRmxvYXRBdm9pZGVy
KGZsb2F0aW5nQ29udGV4dCwgbGF5b3V0Qm94LCBjb25zdHJhaW50c1BhaXIpOwotICAgIH0KLSAg
ICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGdlb21ldHJ5KCkuY29tcHV0ZWRDb250ZW50
V2lkdGhBbmRNYXJnaW4obGF5b3V0Qm94LCBjb25zdHJhaW50c1BhaXIuY29udGFpbmluZ0Jsb2Nr
Lmhvcml6b250YWwsIGF2YWlsYWJsZVdpZHRoRmxvYXRBdm9pZGVyKTsKLSAgICBhdXRvJiBib3hH
ZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAg
Ym94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250
ZW50V2lkdGgpOwotICAgIGJveEdlb21ldHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyBjb250ZW50
V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCwgY29udGVudFdpZHRoQW5kTWFyZ2luLnVz
ZWRNYXJnaW4uZW5kIH0pOwotfQotCi12b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1
dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IENvbnN0cmFpbnRz
Rm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgYXV0byBjb21wdXRlID0gWyZd
KE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRIZWlnaHQpIC0+IENvbnRlbnRIZWlnaHRBbmRNYXJn
aW4gewotICAgICAgICBpZiAobGF5b3V0Qm94LmlzSW5GbG93KCkpCi0gICAgICAgICAgICByZXR1
cm4gZ2VvbWV0cnkoKS5pbkZsb3dDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGxheW91dEJveCwgY29u
c3RyYWludHMuaG9yaXpvbnRhbCwgeyB1c2VkSGVpZ2h0IH0pOwotCi0gICAgICAgIGlmIChsYXlv
dXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBnZW9tZXRy
eSgpLmZsb2F0aW5nQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnN0cmFpbnRz
Lmhvcml6b250YWwsIHsgdXNlZEhlaWdodCB9KTsKLQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKLSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICB9OwotCi0gICAgYXV0byBjb250ZW50SGVp
Z2h0QW5kTWFyZ2luID0gY29tcHV0ZSh7IH0pOwotICAgIGlmIChhdXRvIG1heEhlaWdodCA9IGdl
b21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQobGF5b3V0Qm94KSkgewotICAgICAgICBpZiAoY29u
dGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0ID4gKm1heEhlaWdodCkgewotICAgICAg
ICAgICAgYXV0byBtYXhIZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRlKG1heEhlaWdodCk7Ci0gICAg
ICAgICAgICAvLyBVc2VkIGhlaWdodCBzaG91bGQgcmVtYWluIHRoZSBzYW1lLgotICAgICAgICAg
ICAgQVNTRVJUKChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpICYmIChsYXlvdXRCb3guaXNC
b2R5Qm94KCkgfHwgbGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSkpIHx8IG1heEhlaWdodEFuZE1h
cmdpbi5jb250ZW50SGVpZ2h0ID09ICptYXhIZWlnaHQpOwotICAgICAgICAgICAgY29udGVudEhl
aWdodEFuZE1hcmdpbiA9IHsgKm1heEhlaWdodCwgbWF4SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxh
cHNlZE1hcmdpbiB9OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGF1dG8gbWluSGVpZ2h0
ID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbkhlaWdodChsYXlvdXRCb3gpKSB7Ci0gICAgICAgIGlm
IChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPCAqbWluSGVpZ2h0KSB7Ci0g
ICAgICAgICAgICBhdXRvIG1pbkhlaWdodEFuZE1hcmdpbiA9IGNvbXB1dGUobWluSGVpZ2h0KTsK
LSAgICAgICAgICAgIC8vIFVzZWQgaGVpZ2h0IHNob3VsZCByZW1haW4gdGhlIHNhbWUuCi0gICAg
ICAgICAgICBBU1NFUlQoKGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkgJiYgKGxheW91dEJv
eC5pc0JvZHlCb3goKSB8fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpKSkgfHwgbWluSGVpZ2h0
QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPT0gKm1pbkhlaWdodCk7Ci0gICAgICAgICAgICBjb250
ZW50SGVpZ2h0QW5kTWFyZ2luID0geyAqbWluSGVpZ2h0LCBtaW5IZWlnaHRBbmRNYXJnaW4ubm9u
Q29sbGFwc2VkTWFyZ2luIH07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAxLiBDb21wdXRl
IGNvbGxhcHNlZCBtYXJnaW5zLgotICAgIC8vIDIuIEFkanVzdCB2ZXJ0aWNhbCBwb3NpdGlvbiB1
c2luZyB0aGUgY29sbGFwc2VkIHZhbHVlcy4KLSAgICAvLyAzLiBBZGp1c3QgcHJldmlvdXMgaW4t
ZmxvdyBzaWJsaW5nIG1hcmdpbiBhZnRlciB1c2luZyB0aGlzIG1hcmdpbi4KLSAgICBhdXRvIG1h
cmdpbkNvbGxhcHNlID0gdGhpcy0+bWFyZ2luQ29sbGFwc2UoKTsKLSAgICBhdXRvIHZlcnRpY2Fs
TWFyZ2luID0gbWFyZ2luQ29sbGFwc2UuY29sbGFwc2VkVmVydGljYWxWYWx1ZXMobGF5b3V0Qm94
LCBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbik7Ci0gICAgLy8gQ2Fj
aGUgdGhlIGNvbXB1dGVkIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWUgcGFpci4K
LSAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRVc2VkVmVydGljYWxNYXJnaW4obGF5b3V0Qm94LCB2
ZXJ0aWNhbE1hcmdpbik7Ci0KLSNpZiBBU1NFUlRfRU5BQkxFRAotICAgIGlmIChoYXNQcmVjb21w
dXRlZE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpICYmIHByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGxh
eW91dEJveCkudXNlZFZhbHVlKCkgIT0gbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKSkgewot
ICAgICAgICAvLyBXaGVuIHRoZSBwcmUtY29tcHV0ZWQgbWFyZ2luIHR1cm5zIG91dCB0byBiZSBp
bmNvcnJlY3QsIHdlIG5lZWQgdG8gcmUtbGF5b3V0IHRoaXMgc3VidHJlZSB3aXRoIHRoZSBjb3Jy
ZWN0IG1hcmdpbiB2YWx1ZXMuCi0gICAgICAgIC8vIDxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0Ij48
L2Rpdj4KLSAgICAgICAgLy8gPGRpdj4KLSAgICAgICAgLy8gICA8ZGl2IHN0eWxlPSJtYXJnaW4t
Ym90dG9tOiAyMDBweCI+PC9kaXY+Ci0gICAgICAgIC8vIDwvZGl2PgotICAgICAgICAvLyBUaGUg
ZmxvYXQgYm94IHRyaWdnZXJzIG1hcmdpbiBiZWZvcmUgY29tcHV0YXRpb24gb24gdGhlIGFuY2Vz
dG9yIGNoYWluIHRvIGJlIGFibGUgdG8gaW50ZXJzZWN0IHdpdGggb3RoZXIgZmxvYXRzIGluIHRo
ZSBzYW1lIGZsb2F0aW5nIGNvbnRleHQuCi0gICAgICAgIC8vIEhvd2V2ZXIgaW4gc29tZSBjYXNl
cyB0aGUgcGFyZW50IG1hcmdpbi10b3AgY29sbGFwc2VzIHdpdGggc29tZSBuZXh0IHNpYmxpbmdz
IChuZXBoZXdzKSBhbmQgdGhlcmUncyBubyB3YXkgdG8gYmUgYWJsZSB0byBwcm9wZXJseQotICAg
ICAgICAvLyBhY2NvdW50IGZvciB0aGF0IHdpdGhvdXQgbGF5aW5nIG91dCBldmVyeSBub2RlIGlu
IHRoZSBGQyAoaW4gdGhlIGV4YW1wbGUsIHRoZSBtYXJnaW4tYm90dG9tIHB1c2hlcyBkb3duIHRo
ZSBmbG9hdCkuCi0gICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci0gICAgfQot
I2VuZGlmCi0gICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUoKS5ib3hHZW9t
ZXRyeShsYXlvdXRCb3gpOwotICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoY29u
dGVudEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KTsKLSAgICBib3hHZW9tZXRyeS5zZXRW
ZXJ0aWNhbE1hcmdpbih7IG1hcmdpbkJlZm9yZSh2ZXJ0aWNhbE1hcmdpbiksIG1hcmdpbkFmdGVy
KHZlcnRpY2FsTWFyZ2luKSB9KTsKLSAgICAvLyBBZGp1c3QgdGhlIHByZXZpb3VzIHNpYmxpbmcn
cyBtYXJnaW4gYm90dG9tIG5vdyB0aGF0IHRoaXMgYm94J3MgdmVydGljYWwgbWFyZ2luIGlzIGNv
bXB1dGVkLgotICAgIE1hcmdpbkNvbGxhcHNlOjp1cGRhdGVNYXJnaW5BZnRlckZvclByZXZpb3Vz
U2libGluZygqdGhpcywgbWFyZ2luQ29sbGFwc2UsIGxheW91dEJveCk7Ci19Ci0KLUZvcm1hdHRp
bmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpCi17Ci0gICAgYXV0byYgZm9y
bWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgQVNTRVJUKCFmb3Jt
YXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpKTsKLSAgICAvLyBWaXNpdCB0
aGUgaW4tZmxvdyBkZXNjZW5kYW50cyBhbmQgY29tcHV0ZSB0aGVpciBtaW4vbWF4IGludHJpbnNp
YyB3aWR0aCBpZiBuZWVkZWQuCi0gICAgLy8gMS4gR28gYWxsIHRoZSB3YXkgZG93biB0byB0aGUg
bGVhZiBub2RlCi0gICAgLy8gMi4gQ2hlY2sgaWYgYWN0dWFsbHkgbmVlZCB0byB2aXNpdCBhbGwg
dGhlIGJveGVzIGFzIHdlIHRyYXZlcnNlIGRvd24gKGFscmVhZHkgY29tcHV0ZWQsIGNvbnRhaW5l
cidzIG1pbi9tYXggZG9lcyBub3QgZGVwZW5kIG9uIGRlc2NlbmRhbnRzIGV0YykKLSAgICAvLyAz
LiBBcyB3ZSBjbGltYiBiYWNrIG9uIHRoZSB0cmVlLCBjb21wdXRlIG1pbi9tYXggaW50cmluc2lj
IHdpZHRoCi0gICAgLy8gKEFueSBzdWJ0cmVlcyB3aXRoIG5ldyBmb3JtYXR0aW5nIGNvbnRleHRz
IG5lZWQgdG8gbGF5b3V0IHN5bmNocm9ub3VzbHkpCi0gICAgVmVjdG9yPGNvbnN0IEJveCo+IHF1
ZXVlOwotICAgIGlmIChyb290KCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCi0gICAgICAg
IHF1ZXVlLmFwcGVuZChyb290KCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7Ci0KLSAg
ICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbnN0cmFpbnRzOwotICAgIGF1dG8gbWF4aW11
bUhvcml6b250YWxTdGFja2luZ1dpZHRoID0gTGF5b3V0VW5pdCB7IH07Ci0gICAgYXV0byBjdXJy
ZW50SG9yaXpvbnRhbFN0YWNraW5nV2lkdGggPSBMYXlvdXRVbml0IHsgfTsKLSAgICB3aGlsZSAo
IXF1ZXVlLmlzRW1wdHkoKSkgewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAg
Ly8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBkZWFsIHdpdGggZGVzY2VuZGFudCBjb250ZW50LgotICAg
ICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKnF1ZXVlLmxhc3QoKTsKLSAgICAgICAgICAgIC8v
IEZsb2F0IGF2b2lkZXJzIGFyZSBhbGwgZXN0YWJsaXNoIGEgbmV3IGZvcm1hdHRpbmcgY29udGV4
dC4gTm8gbmVlZCB0byBsb29rIGluc2lkZSB0aGVtLgotICAgICAgICAgICAgaWYgKGxheW91dEJv
eC5pc0Zsb2F0QXZvaWRlcigpICYmICFsYXlvdXRCb3guaGFzRmxvYXRDbGVhcigpKQotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLy8gTm9uLWZsb2F0aW5nIGJsb2NrIGxldmVs
IGJveGVzIHJlc2V0IHRoZSBjdXJyZW50IGhvcml6b250YWwgZmxvYXQgc3RhY2tpbmcuCi0gICAg
ICAgICAgICAvLyBTUEVDOiBUaGlzIGlzIGEgYml0IG9kZCBhcyBmbG9hdGluZyBwb3NpdGlvbmlu
ZyBpcyBhIGZvcm1hdHRpbmcgY29udGV4dCBsZXZlbCBjb25jZXB0OgotICAgICAgICAgICAgLy8g
ZS5nLgotICAgICAgICAgICAgLy8gPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiAxMHB4
OyI+PC9kaXY+Ci0gICAgICAgICAgICAvLyA8ZGl2PjwvZGl2PgotICAgICAgICAgICAgLy8gPGRp
diBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiA0MHB4OyI+PC9kaXY+Ci0gICAgICAgICAgICAv
LyAuLi53aWxsIHByb2R1Y2UgYSBtYXggd2lkdGggb2YgNDBweCB3aGljaCBtYWtlcyB0aGUgZmxv
YXRzIHZlcnRpY2FsbHkgc3RhY2tlZC4KLSAgICAgICAgICAgIC8vIFZlcnRpY2FsbHkgc3RhY2tl
ZCBmbG9hdHMgbWFrZXMgbWUgdGhpbmsgd2UgaGF2ZW4ndCBtYW5hZ2VkIHRvIHByb3ZpZGUgdGhl
IG1heGltdW0gcHJlZmVycmVkIHdpZHRoIGZvciB0aGUgY29udGVudC4KLSAgICAgICAgICAgIG1h
eGltdW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHN0ZDo6bWF4KGN1cnJlbnRIb3Jpem9udGFs
U3RhY2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsKLSAgICAgICAg
ICAgIGN1cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHsgfTsKLSAgICAgICAgICAgIC8v
IEFscmVhZHkgaGFzIGNvbXB1dGVkIGludHJpbnNpYyBjb25zdHJhaW50cy4KLSAgICAgICAgICAg
IGlmIChmb3JtYXR0aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChsYXlv
dXRCb3gpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLy8gQm94IHdpdGgg
Zml4ZWQgd2lkdGggZGVmaW5lcyB0aGVpciBkZXNjZW5kYW50IGNvbnRlbnQgaW50cmluc2ljIHdp
ZHRoLgotICAgICAgICAgICAgaWYgKGxheW91dEJveC5zdHlsZSgpLndpZHRoKCkuaXNGaXhlZCgp
KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLy8gTm9uLWZsb2F0IGF2b2lk
ZXIgZm9ybWF0dGluZyBjb250ZXh0IHJvb3RzIGFyZSBvcGFxdWUgdG8gaW50cmluc2ljIHdpZHRo
IGNvbXB1dGF0aW9uLgotICAgICAgICAgICAgaWYgKGxheW91dEJveC5lc3RhYmxpc2hlc0Zvcm1h
dHRpbmdDb250ZXh0KCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvLyBO
byByZWxldmFudCBjaGlsZCBjb250ZW50LgotICAgICAgICAgICAgaWYgKCFpczxDb250YWluZXJC
b3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJ
bkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIHF1ZXVlLmFwcGVuZChkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJ
bkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ29tcHV0ZSBt
aW4vbWF4IGludHJpbnNpYyB3aWR0aCBib3R0b20gdXAgaWYgbmVlZGVkLgotICAgICAgICB3aGls
ZSAoIXF1ZXVlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKnF1
ZXVlLnRha2VMYXN0KCk7Ci0gICAgICAgICAgICBhdXRvIGRlc2RlbmRhbnRDb25zdHJhaW50cyA9
IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGxheW91dEJv
eCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2RlbmRhbnRDb25zdHJhaW50cykgewotICAgICAgICAg
ICAgICAgIGRlc2RlbmRhbnRDb25zdHJhaW50cyA9IGdlb21ldHJ5KCkuaW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyhsYXlvdXRCb3gpOwotICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5z
ZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGxheW91dEJveCwgKmRlc2RlbmRhbnRD
b25zdHJhaW50cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25zdHJhaW50cy5taW5p
bXVtID0gc3RkOjptYXgoY29uc3RyYWludHMubWluaW11bSwgZGVzZGVuZGFudENvbnN0cmFpbnRz
LT5taW5pbXVtKTsKLSAgICAgICAgICAgIGF1dG8gd2lsbFN0YWNrSG9yaXpvbnRhbGx5ID0gbGF5
b3V0Qm94LmlzRmxvYXRBdm9pZGVyKCkgJiYgIWxheW91dEJveC5oYXNGbG9hdENsZWFyKCk7Ci0g
ICAgICAgICAgICBpZiAod2lsbFN0YWNrSG9yaXpvbnRhbGx5KQotICAgICAgICAgICAgICAgIGN1
cnJlbnRIb3Jpem9udGFsU3RhY2tpbmdXaWR0aCArPSBkZXNkZW5kYW50Q29uc3RyYWludHMtPm1h
eGltdW07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY29uc3RyYWludHMubWF4
aW11bSA9IHN0ZDo6bWF4KGNvbnN0cmFpbnRzLm1heGltdW0sIGRlc2RlbmRhbnRDb25zdHJhaW50
cy0+bWF4aW11bSk7Ci0gICAgICAgICAgICAvLyBNb3ZlIG92ZXIgdG8gdGhlIG5leHQgc2libGlu
ZyBvciB0YWtlIHRoZSBuZXh0IGJveCBpbiB0aGUgcXVldWUuCi0gICAgICAgICAgICBpZiAoYXV0
byogbmV4dFNpYmxpbmcgPSBsYXlvdXRCb3gubmV4dEluRmxvd09yRmxvYXRpbmdTaWJsaW5nKCkp
IHsKLSAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQobmV4dFNpYmxpbmcpOwotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1heGlt
dW1Ib3Jpem9udGFsU3RhY2tpbmdXaWR0aCA9IHN0ZDo6bWF4KGN1cnJlbnRIb3Jpem9udGFsU3Rh
Y2tpbmdXaWR0aCwgbWF4aW11bUhvcml6b250YWxTdGFja2luZ1dpZHRoKTsKLSAgICBjb25zdHJh
aW50cy5tYXhpbXVtID0gc3RkOjptYXgoY29uc3RyYWludHMubWF4aW11bSwgbWF4aW11bUhvcml6
b250YWxTdGFja2luZ1dpZHRoKTsKLSAgICBmb3JtYXR0aW5nU3RhdGUuc2V0SW50cmluc2ljV2lk
dGhDb25zdHJhaW50cyhjb25zdHJhaW50cyk7Ci0gICAgcmV0dXJuIGNvbnN0cmFpbnRzOwotfQot
Ci1MYXlvdXRVbml0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OnZlcnRpY2FsUG9zaXRpb25XaXRo
TWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBVc2VkVmVydGljYWxNYXJnaW4mIHZl
cnRpY2FsTWFyZ2luLCAgY29uc3QgVmVydGljYWxDb25zdHJhaW50cyYgdmVydGljYWxDb25zdHJh
aW50cykgY29uc3QKLXsKLSAgICBBU1NFUlQoIWxheW91dEJveC5pc091dE9mRmxvd1Bvc2l0aW9u
ZWQoKSk7Ci0gICAgLy8gTm93IHRoYXQgd2UndmUgY29tcHV0ZWQgdGhlIGZpbmFsIG1hcmdpbiBi
ZWZvcmUsIGxldCdzIHNoaWZ0IHRoZSBib3gncyB2ZXJ0aWNhbCBwb3NpdGlvbiBpZiBuZWVkZWQu
Ci0gICAgLy8gMS4gQ2hlY2sgaWYgdGhlIGJveCBoYXMgY2xlYXJhbmNlLiBJZiBzbywgd2UndmUg
YWxyZWFkeSBwcmVjb21wdXRlZC9maW5hbGl6ZWQgdGhlIHRvcCB2YWx1ZSBhbmQgdmVydGljYWwg
bWFyZ2luIGRvZXMgbm90IGltcGFjdCBpdCBhbnltb3JlLgotICAgIC8vIDIuIENoZWNrIGlmIHRo
ZSBtYXJnaW4gYmVmb3JlIGNvbGxhcHNlcyB3aXRoIHRoZSBwcmV2aW91cyBib3gncyBtYXJnaW4g
YWZ0ZXIuIGlmIG5vdCAtPiByZXR1cm4gcHJldmlvdXMgYm94J3MgYm90dG9tIGluY2x1ZGluZyBt
YXJnaW4gYWZ0ZXIgKyBtYXJnaW5CZWZvcmUKLSAgICAvLyAzLiBDaGVjayBpZiB0aGUgcHJldmlv
dXMgYm94J3MgbWFyZ2lucyBjb2xsYXBzZSB0aHJvdWdoLiBJZiBub3QgLT4gcmV0dXJuIHByZXZp
b3VzIGJveCcgYm90dG9tIGV4Y2x1ZGluZyBtYXJnaW4gYWZ0ZXIgKyBtYXJnaW5CZWZvcmUgKHRo
ZXkgYXJlIHN1cHBvc2VkIHRvIGJlIGVxdWFsKQotICAgIC8vIDQuIEdvIHRvIHByZXZpb3VzIGJv
eCBhbmQgc3RhcnQgZnJvbSBzdGVwICMxIHVudGlsIHdlIGhpdCB0aGUgcGFyZW50IGJveC4KLSAg
ICBhdXRvJiBib3hHZW9tZXRyeSA9IGdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0gICAgaWYg
KGZvcm1hdHRpbmdTdGF0ZSgpLmhhc0NsZWFyYW5jZShsYXlvdXRCb3gpKQotICAgICAgICByZXR1
cm4gQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChib3hHZW9tZXRyeSk7Ci0KLSAgICBhdXRvKiBj
dXJyZW50TGF5b3V0Qm94ID0gJmxheW91dEJveDsKLSAgICB3aGlsZSAoY3VycmVudExheW91dEJv
eCkgewotICAgICAgICBpZiAoIWN1cnJlbnRMYXlvdXRCb3gtPnByZXZpb3VzSW5GbG93U2libGlu
ZygpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2li
bGluZyA9ICpjdXJyZW50TGF5b3V0Qm94LT5wcmV2aW91c0luRmxvd1NpYmxpbmcoKTsKLSAgICAg
ICAgaWYgKCFtYXJnaW5Db2xsYXBzZSgpLm1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91
c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVudExheW91dEJveCkpIHsKLSAgICAgICAgICAgIGF1
dG8mIHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9tZXRyeUZvckJveChwcmV2aW91c0luRmxvd1Np
YmxpbmcpOwotICAgICAgICAgICAgcmV0dXJuIEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0KHBy
ZXZpb3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsgbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2lu
KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5zQ29s
bGFwc2VUaHJvdWdoKHByZXZpb3VzSW5GbG93U2libGluZykpIHsKLSAgICAgICAgICAgIGF1dG8m
IHByZXZpb3VzQm94R2VvbWV0cnkgPSBnZW9tZXRyeUZvckJveChwcmV2aW91c0luRmxvd1NpYmxp
bmcpOwotICAgICAgICAgICAgcmV0dXJuIEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KHByZXZp
b3VzQm94R2VvbWV0cnkpLmJvdHRvbSgpICsgbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKTsK
LSAgICAgICAgfQotICAgICAgICBjdXJyZW50TGF5b3V0Qm94ID0gJnByZXZpb3VzSW5GbG93U2li
bGluZzsKLSAgICB9Ci0KLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgPSB2
ZXJ0aWNhbENvbnN0cmFpbnRzLmxvZ2ljYWxUb3A7Ci0gICAgLy8gQWRqdXN0IHZlcnRpY2FsIHBv
c2l0aW9uIGRlcGVuZGluZyB3aGV0aGVyIHRoaXMgYm94IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkg
YWRqb2lucyB3aXRoIGl0cyBwYXJlbnQuCi0gICAgYXV0byBkaXJlY3RseUFkam9pbnNQYXJlbnQg
PSAhbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpOwotICAgIGlmIChkaXJlY3RseUFk
am9pbnNQYXJlbnQpIHsKLSAgICAgICAgLy8gSWYgdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMg
b2YgYSBib3ggYXJlIGFkam9pbmluZywgdGhlbiBpdCBpcyBwb3NzaWJsZSBmb3IgbWFyZ2lucyB0
byBjb2xsYXBzZSB0aHJvdWdoIGl0LgotICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBwb3Np
dGlvbiBvZiB0aGUgZWxlbWVudCBkZXBlbmRzIG9uIGl0cyByZWxhdGlvbnNoaXAgd2l0aCB0aGUg
b3RoZXIgZWxlbWVudHMgd2hvc2UgbWFyZ2lucyBhcmUgYmVpbmcgY29sbGFwc2VkLgotICAgICAg
ICBpZiAodmVydGljYWxNYXJnaW4uY29sbGFwc2VkVmFsdWVzLmlzQ29sbGFwc2VkVGhyb3VnaCkg
ewotICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQncyBtYXJnaW5zIGFyZSBjb2xsYXBzZWQg
d2l0aCBpdHMgcGFyZW50J3MgdG9wIG1hcmdpbiwgdGhlIHRvcCBib3JkZXIgZWRnZSBvZiB0aGUg
Ym94IGlzIGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHBhcmVudCdzLgotICAgICAgICAg
ICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1h
cmdpbkJlZm9yZShsYXlvdXRCb3gpKQotICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluaW5n
QmxvY2tDb250ZW50Qm94VG9wOwotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBlaXRoZXIgdGhl
IGVsZW1lbnQncyBwYXJlbnQgaXMgbm90IHRha2luZyBwYXJ0IGluIHRoZSBtYXJnaW4gY29sbGFw
c2luZywgb3Igb25seSB0aGUgcGFyZW50J3MgYm90dG9tIG1hcmdpbiBpcyBpbnZvbHZlZC4KLSAg
ICAgICAgICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCdzIHRvcCBib3JkZXIgZWRn
ZSBpcyB0aGUgc2FtZSBhcyBpdCB3b3VsZCBoYXZlIGJlZW4gaWYgdGhlIGVsZW1lbnQgaGFkIGEg
bm9uLXplcm8gYm90dG9tIGJvcmRlci4KLSAgICAgICAgICAgIGF1dG8gYmVmb3JlTWFyZ2luV2l0
aEJvdHRvbUJvcmRlciA9IG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlSWdub3JpbmdDb2xs
YXBzaW5nVGhyb3VnaChsYXlvdXRCb3gsIHZlcnRpY2FsTWFyZ2luLm5vbkNvbGxhcHNlZFZhbHVl
cyk7Ci0gICAgICAgICAgICByZXR1cm4gY29udGFpbmluZ0Jsb2NrQ29udGVudEJveFRvcCArIGJl
Zm9yZU1hcmdpbldpdGhCb3R0b21Cb3JkZXI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm9uLWNv
bGxhcHNlZCB0aHJvdWdoIGJveCB2ZXJ0aWNhbCBwb3NpdGlvbiBkZXBlbmRpbmcgd2hldGhlciB0
aGUgbWFyZ2luIGNvbGxhcHNlcy4KLSAgICAgICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2lu
QmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXlvdXRCb3gpKQotICAgICAg
ICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3A7Ci0KLSAgICAgICAgcmV0
dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgKyBtYXJnaW5CZWZvcmUodmVydGljYWxN
YXJnaW4pOwotICAgIH0KLSAgICAvLyBBdCB0aGlzIHBvaW50IHRoaXMgYm94IGluZGlyZWN0bHkg
KHZpYSBjb2xsYXBzZWQgdGhyb3VnaCBwcmV2aW91cyBpbi1mbG93IHNpYmxpbmdzKSBhZGpvaW5z
IHRoZSBwYXJlbnQuIExldCdzIGNoZWNrIGlmIGl0IG1hcmdpbiBjb2xsYXBzZXMgd2l0aCB0aGUg
cGFyZW50LgotICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9jayA9IGxheW91dEJveC5jb250YWluaW5n
QmxvY2soKTsKLSAgICBBU1NFUlQoY29udGFpbmluZ0Jsb2NrLmZpcnN0SW5GbG93Q2hpbGQoKSk7
Ci0gICAgQVNTRVJUKGNvbnRhaW5pbmdCbG9jay5maXJzdEluRmxvd0NoaWxkKCkgIT0gJmxheW91
dEJveCk7Ci0gICAgaWYgKG1hcmdpbkNvbGxhcHNlKCkubWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0
aFBhcmVudE1hcmdpbkJlZm9yZSgqY29udGFpbmluZ0Jsb2NrLmZpcnN0SW5GbG93Q2hpbGQoKSkp
Ci0gICAgICAgIHJldHVybiBjb250YWluaW5nQmxvY2tDb250ZW50Qm94VG9wOwotCi0gICAgcmV0
dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hUb3AgKyBtYXJnaW5CZWZvcmUodmVydGljYWxN
YXJnaW4pOwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5n
Q29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9j
a2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCA2M2Q5OTY5M2U4N2NkMGIwZjEzMmVhYzcxMzY5MGUwYjcwNTJlMTI5Li4wMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGlu
Z0NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogQ29weXJp
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
I2luY2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0Nv
bnRleHQuaCIKLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxs
b2MuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1jbGFzcyBMYXlvdXRVbml0OwotCi1uYW1l
c3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgQm94OwotY2xhc3MgRmxvYXRpbmdDb250ZXh0OwotCi0v
LyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGxheW91dCBsb2dpYyBmb3IgYmxvY2sgZm9ybWF0
dGluZyBjb250ZXh0cy4KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi92aXN1cmVuLmh0
bWwjYmxvY2stZm9ybWF0dGluZwotY2xhc3MgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCA6IHB1Ymxp
YyBGb3JtYXR0aW5nQ29udGV4dCB7Ci0gICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0KTsKLXB1YmxpYzoKLSAgICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KGNv
bnN0IENvbnRhaW5lckJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBCbG9ja0Zvcm1hdHRpbmdT
dGF0ZSYpOwotCi0gICAgdm9pZCBsYXlvdXRJbkZsb3dDb250ZW50KEludmFsaWRhdGlvblN0YXRl
JiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jikgb3ZlcnJpZGU7Ci0gICAgTGF5
b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0IG92ZXJyaWRlOwotCi1wcm90ZWN0ZWQ6
Ci0gICAgc3RydWN0IENvbnN0cmFpbnRzUGFpciB7Ci0gICAgICAgIENvbnN0cmFpbnRzRm9ySW5G
bG93Q29udGVudCBmb3JtYXR0aW5nQ29udGV4dFJvb3Q7Ci0gICAgICAgIENvbnN0cmFpbnRzRm9y
SW5GbG93Q29udGVudCBjb250YWluaW5nQmxvY2s7Ci0gICAgfTsKLSAgICB2b2lkIHBsYWNlSW5G
bG93UG9zaXRpb25lZENoaWxkcmVuKGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhvcml6b250
YWxDb25zdHJhaW50cyYpOwotCi0gICAgdm9pZCBjb21wdXRlV2lkdGhBbmRNYXJnaW4oY29uc3Qg
RmxvYXRpbmdDb250ZXh0JiwgY29uc3QgQm94JiwgY29uc3QgQ29uc3RyYWludHNQYWlyJik7Ci0g
ICAgdm9pZCBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IENvbnN0cmFp
bnRzRm9ySW5GbG93Q29udGVudCYpOwotCi0gICAgdm9pZCBjb21wdXRlU3RhdGljSG9yaXpvbnRh
bFBvc2l0aW9uKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOwotICAg
IHZvaWQgY29tcHV0ZVN0YXRpY1ZlcnRpY2FsUG9zaXRpb24oY29uc3QgQm94JiwgY29uc3QgVmVy
dGljYWxDb25zdHJhaW50cyYpOwotICAgIHZvaWQgY29tcHV0ZVBvc2l0aW9uVG9Bdm9pZEZsb2F0
cyhjb25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBCb3gmLCBjb25zdCBDb25zdHJhaW50c1Bh
aXImKTsKLSAgICB2b2lkIGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uRm9yRmxvYXRDbGVhcihjb25z
dCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBCb3gmKTsKLQotICAgIHZvaWQgcHJlY29tcHV0ZVZl
cnRpY2FsUG9zaXRpb25Gb3JCb3hBbmRBbmNlc3RvcnMoY29uc3QgQm94JiwgY29uc3QgQ29uc3Ry
YWludHNQYWlyJik7Ci0KLSAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNvbXB1dGVkSW50
cmluc2ljV2lkdGhDb25zdHJhaW50cygpIG92ZXJyaWRlOwotCi0gICAgTGF5b3V0VW5pdCB2ZXJ0
aWNhbFBvc2l0aW9uV2l0aE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBVc2VkVmVydGljYWxNYXJn
aW4mLCBjb25zdCBWZXJ0aWNhbENvbnN0cmFpbnRzJikgY29uc3Q7Ci0KLSAgICAvLyBUaGlzIGNs
YXNzIGltcGxlbWVudHMgcG9zaXRpb25pbmcgYW5kIHNpemluZyBmb3IgYm94ZXMgcGFydGljaXBh
dGluZyBpbiBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dC4KLSAgICBjbGFzcyBHZW9tZXRyeSA6
IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgewotICAgIHB1YmxpYzoKLSAgICAg
ICAgR2VvbWV0cnkoY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0gICAgICAgIENv
bnRlbnRIZWlnaHRBbmRNYXJnaW4gaW5GbG93Q29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBC
b3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGlj
YWxWYWx1ZXMmKTsKLSAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGluRmxvd0NvbnRlbnRX
aWR0aEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBj
b25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYpOwotCi0gICAgICAgIFBvaW50IHN0YXRp
Y1Bvc2l0aW9uKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0
IFZlcnRpY2FsQ29uc3RyYWludHMmKSBjb25zdDsKLSAgICAgICAgTGF5b3V0VW5pdCBzdGF0aWNW
ZXJ0aWNhbFBvc2l0aW9uKGNvbnN0IEJveCYsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmKSBj
b25zdDsKLSAgICAgICAgTGF5b3V0VW5pdCBzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24oY29uc3Qg
Qm94JiwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJikgY29uc3Q7Ci0KLSAgICAgICAgSW50
cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0IEJv
eCYpOwotCi0gICAgICAgIENvbnRlbnRXaWR0aEFuZE1hcmdpbiBjb21wdXRlZENvbnRlbnRXaWR0
aEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBPcHRp
b25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVXaWR0aEZsb2F0QXZvaWRlcik7Ci0KLSAgICBwcml2
YXRlOgotICAgICAgICBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGluRmxvd05vblJlcGxhY2VkQ29u
dGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWlu
dHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmKTsKLSAgICAgICAgQ29udGVudFdp
ZHRoQW5kTWFyZ2luIGluRmxvd05vblJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGNvbnN0
IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jp
em9udGFsVmFsdWVzJik7Ci0gICAgICAgIENvbnRlbnRXaWR0aEFuZE1hcmdpbiBpbkZsb3dSZXBs
YWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYsIGNvbnN0IEhvcml6
b250YWxDb25zdHJhaW50cyYsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7Ci0K
LSAgICAgICAgY29uc3QgQmxvY2tGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQo
KSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdDb250ZXh0PihGb3JtYXR0
aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZvcm1hdHRpbmdDb250ZXh0KCkpOyB9Ci0gICAgfTsKLSAg
ICBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0
dXJuIEdlb21ldHJ5KCp0aGlzKTsgfQotCi0gICAgLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIG1h
cmdpbiBjb2xsYXBzaW5nIGZvciBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQuCi0gICAgY2xhc3Mg
TWFyZ2luQ29sbGFwc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgVXNlZFZlcnRpY2FsTWFyZ2lu
IGNvbGxhcHNlZFZlcnRpY2FsVmFsdWVzKGNvbnN0IEJveCYsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6
Tm9uQ29sbGFwc2VkVmFsdWVzKTsKLQotICAgICAgICBQcmVjb21wdXRlZE1hcmdpbkJlZm9yZSBw
cmVjb21wdXRlZE1hcmdpbkJlZm9yZShjb25zdCBCb3gmLCBVc2VkVmVydGljYWxNYXJnaW46Ok5v
bkNvbGxhcHNlZFZhbHVlcyk7Ci0gICAgICAgIExheW91dFVuaXQgbWFyZ2luQmVmb3JlSWdub3Jp
bmdDb2xsYXBzaW5nVGhyb3VnaChjb25zdCBCb3gmLCBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNv
bGxhcHNlZFZhbHVlcyk7Ci0gICAgICAgIHN0YXRpYyB2b2lkIHVwZGF0ZU1hcmdpbkFmdGVyRm9y
UHJldmlvdXNTaWJsaW5nKEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmLCBjb25zdCBNYXJnaW5Db2xs
YXBzZSYsIGNvbnN0IEJveCYpOwotCi0gICAgICAgIGJvb2wgbWFyZ2luQmVmb3JlQ29sbGFwc2Vz
V2l0aFBhcmVudE1hcmdpbkJlZm9yZShjb25zdCBCb3gmKSBjb25zdDsKLSAgICAgICAgYm9vbCBt
YXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoRmlyc3RJbkZsb3dDaGlsZE1hcmdpbkJlZm9yZShjb25z
dCBCb3gmKSBjb25zdDsKLSAgICAgICAgYm9vbCBtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUGFy
ZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94JikgY29uc3Q7Ci0gICAgICAgIGJvb2wgbWFyZ2luQmVm
b3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGNvbnN0IEJveCYpIGNv
bnN0OwotCi0gICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2lu
QWZ0ZXIoY29uc3QgQm94JikgY29uc3Q7Ci0gICAgICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBz
ZXNXaXRoTGFzdEluRmxvd0NoaWxkTWFyZ2luQWZ0ZXIoY29uc3QgQm94JikgY29uc3Q7Ci0gICAg
ICAgIGJvb2wgbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0
IEJveCYpIGNvbnN0OwotICAgICAgICBib29sIG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aE5leHRT
aWJsaW5nTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYpIGNvbnN0OwotICAgICAgICBib29sIG1hcmdp
bkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNlKGNvbnN0
IEJveCYpIGNvbnN0OwotCi0gICAgICAgIGJvb2wgbWFyZ2luc0NvbGxhcHNlVGhyb3VnaChjb25z
dCBCb3gmKSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OwotICAgICAgICBNYXJnaW5Db2xsYXBzZShjb25zdCBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0Jik7Ci0KLSAgICAgICAgZW51bSBjbGFzcyBNYXJnaW5UeXBlIHsgQmVm
b3JlLCBBZnRlciB9OwotICAgICAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVn
YXRpdmVQYWlyOjpWYWx1ZXMgcG9zaXRpdmVOZWdhdGl2ZVZhbHVlcyhjb25zdCBCb3gmLCBNYXJn
aW5UeXBlKSBjb25zdDsKLSAgICAgICAgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5l
Z2F0aXZlUGFpcjo6VmFsdWVzIHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUoY29uc3QgQm94
JiwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMpIGNvbnN0OwotICAgICAg
ICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcG9z
aXRpdmVOZWdhdGl2ZU1hcmdpbkFmdGVyKGNvbnN0IEJveCYsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6
Tm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdDsKLQotICAgICAgICBVc2VkVmVydGljYWxNYXJnaW46
OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgcHJlY29tcHV0ZWRQb3NpdGl2ZU5lZ2F0
aXZlTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFw
c2VkVmFsdWVzKSBjb25zdDsKLSAgICAgICAgVXNlZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFu
ZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIHByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZVZhbHVlcyhj
b25zdCBCb3gmKSBjb25zdDsKLQotICAgICAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZl
QW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgY29tcHV0ZWRQb3NpdGl2ZUFuZE5lZ2F0aXZlTWFyZ2lu
KFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcywgVXNl
ZFZlcnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzKSBjb25zdDsK
LSAgICAgICAgT3B0aW9uYWw8TGF5b3V0VW5pdD4gbWFyZ2luVmFsdWUoVXNlZFZlcnRpY2FsTWFy
Z2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzKSBjb25zdDsKLQotICAgICAgICBi
b29sIGhhc0NsZWFyYW5jZShjb25zdCBCb3gmKSBjb25zdDsKLQotICAgICAgICBMYXlvdXRTdGF0
ZSYgbGF5b3V0U3RhdGUoKSB7IHJldHVybiBtX2Jsb2NrRm9ybWF0dGluZ0NvbnRleHQubGF5b3V0
U3RhdGUoKTsgfQotICAgICAgICBjb25zdCBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSBjb25z
dCB7IHJldHVybiBtX2Jsb2NrRm9ybWF0dGluZ0NvbnRleHQubGF5b3V0U3RhdGUoKTsgfQotICAg
ICAgICBjb25zdCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNv
bnN0IHsgcmV0dXJuIG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4dDsgfQotCi0gICAgICAgIGNvbnN0
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIG1fYmxvY2tGb3JtYXR0aW5nQ29udGV4dDsKLSAgICB9
OwotICAgIE1hcmdpbkNvbGxhcHNlIG1hcmdpbkNvbGxhcHNlKCkgY29uc3QgeyByZXR1cm4gTWFy
Z2luQ29sbGFwc2UoKnRoaXMpOyB9Ci0KLSAgICBjbGFzcyBRdWlya3MgOiBwdWJsaWMgRm9ybWF0
dGluZ0NvbnRleHQ6OlF1aXJrcyB7Ci0gICAgcHVibGljOgotICAgICAgICBRdWlya3MoY29uc3Qg
QmxvY2tGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0gICAgICAgIGJvb2wgbmVlZHNTdHJldGNoaW5n
KGNvbnN0IEJveCYpIGNvbnN0OwotICAgICAgICBMYXlvdXRVbml0IHN0cmV0Y2hlZEluRmxvd0hl
aWdodChjb25zdCBCb3gmLCBDb250ZW50SGVpZ2h0QW5kTWFyZ2luKTsKLQotICAgICAgICBib29s
IHNob3VsZElnbm9yZUNvbGxhcHNlZFF1aXJrTWFyZ2luKGNvbnN0IEJveCYpIGNvbnN0OwotICAg
ICAgICBib29sIHNob3VsZENvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aFBhcmVudE1hcmdpbkJlZm9y
ZShjb25zdCBCb3gmKSBjb25zdDsKLSAgICAgICAgYm9vbCBzaG91bGRDb2xsYXBzZU1hcmdpbkFm
dGVyV2l0aFBhcmVudE1hcmdpbkFmdGVyKGNvbnN0IEJveCYpIGNvbnN0OwotCi0gICAgICAgIGNv
bnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyBy
ZXR1cm4gZG93bmNhc3Q8QmxvY2tGb3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6
OlF1aXJrczo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KLSAgICAgICAgQmxvY2tGb3JtYXR0aW5n
Q29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29u
dGV4dCgpLmdlb21ldHJ5KCk7IH0KLQotICAgIH07Ci0gICAgQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6UXVpcmtzIHF1aXJrcygpIGNvbnN0IHsgcmV0dXJuIFF1aXJrcygqdGhpcyk7IH0KLQotICAg
IE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRBdmFpbGFibGVXaWR0aEZvckZsb2F0QXZvaWRlcihj
b25zdCBGbG9hdGluZ0NvbnRleHQmLCBjb25zdCBCb3gmLCBjb25zdCBDb25zdHJhaW50c1BhaXIm
KTsKLQotICAgIGNvbnN0IEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBj
b25zdCB7IHJldHVybiBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0Nv
bnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQotICAgIEJsb2NrRm9ybWF0dGluZ1N0YXRlJiBm
b3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3duY2FzdDxCbG9ja0Zvcm1hdHRpbmdTdGF0ZT4o
Rm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQotCi0jaWYgQVNTRVJUX0VO
QUJMRUQKLSAgICB2b2lkIHNldFByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBjb25zdCBQcmVjb21wdXRlZE1hcmdpbkJlZm9yZSYgcHJlY29tcHV0ZWRNYXJnaW5C
ZWZvcmUpIHsgbV9wcmVjb21wdXRlZE1hcmdpbkJlZm9yZUxpc3Quc2V0KCZsYXlvdXRCb3gsIHBy
ZWNvbXB1dGVkTWFyZ2luQmVmb3JlKTsgfQotICAgIFByZWNvbXB1dGVkTWFyZ2luQmVmb3JlIHBy
ZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdCB7IHJldHVy
biBtX3ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlTGlzdC5nZXQoJmxheW91dEJveCk7IH0KLSAgICBi
b29sIGhhc1ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25z
dCB7IHJldHVybiBtX3ByZWNvbXB1dGVkTWFyZ2luQmVmb3JlTGlzdC5jb250YWlucygmbGF5b3V0
Qm94KTsgfQotI2VuZGlmCi1wcml2YXRlOgotICAgIEhhc2hNYXA8Y29uc3QgQm94KiwgUHJlY29t
cHV0ZWRNYXJnaW5CZWZvcmU+IG1fcHJlY29tcHV0ZWRNYXJnaW5CZWZvcmVMaXN0OwotfTsKLQot
aW5saW5lIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpHZW9tZXRyeShjb25zdCBC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBibG9ja0Zvcm1hdHRpbmdDb250ZXh0KQotICAgIDogRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5KGJsb2NrRm9ybWF0dGluZ0NvbnRleHQpCi17Ci19Ci0K
LWlubGluZSBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OlF1aXJrcyhjb25zdCBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0JiBibG9ja0Zvcm1hdHRpbmdDb250ZXh0KQotICAgIDogRm9ybWF0
dGluZ0NvbnRleHQ6OlF1aXJrcyhibG9ja0Zvcm1hdHRpbmdDb250ZXh0KQotewotfQotCi1pbmxp
bmUgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Ok1hcmdpbkNvbGxhcHNl
KGNvbnN0IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGJsb2NrRm9ybWF0dGluZ0NvbnRleHQpCi0g
ICAgOiBtX2Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoYmxvY2tGb3JtYXR0aW5nQ29udGV4dCkKLXsK
LX0KLQotfQotfQotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NP
TlRFWFQoQmxvY2tGb3JtYXR0aW5nQ29udGV4dCwgaXNCbG9ja0Zvcm1hdHRpbmdDb250ZXh0KCkp
Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNw
cCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0
aW5nL0Jsb2NrRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDBhMWEyYjQxNmM2N2RlNWYyNDVkNTJjMTVkYjYzNDM1OGRjY2I1YjEuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0
aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0v
KgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
LSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkJsb2NrRm9ybWF0dGlu
Z0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0j
aW5jbHVkZSAiQmxvY2tGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29u
dGV4dC5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkxh
eW91dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q2hpbGRJdGVyYXRvci5oIgotI2lu
Y2x1ZGUgIkxheW91dENvbnRleHQuaCIKLSNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmlu
Z0Jsb2NrLmgiCi0jaW5jbHVkZSAiTGF5b3V0UmVwbGFjZWRCb3guaCIKLSNpbmNsdWRlICJMb2dn
aW5nLmgiCi0jaW5jbHVkZSA8d3RmL3RleHQvVGV4dFN0cmVhbS5oPgotCi1uYW1lc3BhY2UgV2Vi
Q29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotQ29udGVudEhlaWdodEFuZE1hcmdpbiBCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93Tm9uUmVwbGFjZWRDb250ZW50SGVp
Z2h0QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFs
dWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGxheW91dEJveC5p
c0luRmxvdygpICYmICFsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKLSAgICBBU1NFUlQobGF5
b3V0Qm94LmlzT3ZlcmZsb3dWaXNpYmxlKCkpOwotCi0gICAgYXV0byBjb21wdXRlID0gWyZdKGNv
bnN0IGF1dG8mIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykgLT4gQ29udGVudEhlaWdodEFuZE1h
cmdpbiB7Ci0KLSAgICAgICAgLy8gMTAuNi4zIEJsb2NrLWxldmVsIG5vbi1yZXBsYWNlZCBlbGVt
ZW50cyBpbiBub3JtYWwgZmxvdyB3aGVuICdvdmVyZmxvdycgY29tcHV0ZXMgdG8gJ3Zpc2libGUn
Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIElmICdtYXJnaW4tdG9wJywgb3IgJ21hcmdpbi1ib3R0
b20nIGFyZSAnYXV0bycsIHRoZWlyIHVzZWQgdmFsdWUgaXMgMC4KLSAgICAgICAgLy8gSWYgJ2hl
aWdodCcgaXMgJ2F1dG8nLCB0aGUgaGVpZ2h0IGRlcGVuZHMgb24gd2hldGhlciB0aGUgZWxlbWVu
dCBoYXMgYW55IGJsb2NrLWxldmVsIGNoaWxkcmVuIGFuZCB3aGV0aGVyIGl0IGhhcyBwYWRkaW5n
IG9yIGJvcmRlcnM6Ci0gICAgICAgIC8vIFRoZSBlbGVtZW50J3MgaGVpZ2h0IGlzIHRoZSBkaXN0
YW5jZSBmcm9tIGl0cyB0b3AgY29udGVudCBlZGdlIHRvIHRoZSBmaXJzdCBhcHBsaWNhYmxlIG9m
IHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vIDEuIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgbGFz
dCBsaW5lIGJveCwgaWYgdGhlIGJveCBlc3RhYmxpc2hlcyBhIGlubGluZSBmb3JtYXR0aW5nIGNv
bnRleHQgd2l0aCBvbmUgb3IgbW9yZSBsaW5lcwotICAgICAgICAvLyAyLiB0aGUgYm90dG9tIGVk
Z2Ugb2YgdGhlIGJvdHRvbSAocG9zc2libHkgY29sbGFwc2VkKSBtYXJnaW4gb2YgaXRzIGxhc3Qg
aW4tZmxvdyBjaGlsZCwgaWYgdGhlIGNoaWxkJ3MgYm90dG9tIG1hcmdpbgotICAgICAgICAvLyAg
ICBkb2VzIG5vdCBjb2xsYXBzZSB3aXRoIHRoZSBlbGVtZW50J3MgYm90dG9tIG1hcmdpbgotICAg
ICAgICAvLyAzLiB0aGUgYm90dG9tIGJvcmRlciBlZGdlIG9mIHRoZSBsYXN0IGluLWZsb3cgY2hp
bGQgd2hvc2UgdG9wIG1hcmdpbiBkb2Vzbid0IGNvbGxhcHNlIHdpdGggdGhlIGVsZW1lbnQncyBi
b3R0b20gbWFyZ2luCi0gICAgICAgIC8vIDQuIHplcm8sIG90aGVyd2lzZQotICAgICAgICAvLyBP
bmx5IGNoaWxkcmVuIGluIHRoZSBub3JtYWwgZmxvdyBhcmUgdGFrZW4gaW50byBhY2NvdW50IChp
LmUuLCBmbG9hdGluZyBib3hlcyBhbmQgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGJveGVzIGFyZSBp
Z25vcmVkLAotICAgICAgICAvLyBhbmQgcmVsYXRpdmVseSBwb3NpdGlvbmVkIGJveGVzIGFyZSBj
b25zaWRlcmVkIHdpdGhvdXQgdGhlaXIgb2Zmc2V0KS4gTm90ZSB0aGF0IHRoZSBjaGlsZCBib3gg
bWF5IGJlIGFuIGFub255bW91cyBibG9jayBib3guCi0KLSAgICAgICAgYXV0byYgYm94R2VvbWV0
cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0gICAg
ICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZFZlcnRp
Y2FsTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKLSAgICAgICAgYXV0
byBub25Db2xsYXBzZWRNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW46Ok5vbkNvbGxhcHNlZFZh
bHVlcyB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3IoMCksIGNvbXB1dGVk
VmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OyAKLSAgICAgICAgYXV0byBib3JkZXJB
bmRQYWRkaW5nVG9wID0gYm94R2VvbWV0cnkuYm9yZGVyVG9wKCkgKyBib3hHZW9tZXRyeS5wYWRk
aW5nVG9wKCkudmFsdWVPcigwKTsKLSAgICAgICAgYXV0byBoZWlnaHQgPSBvdmVycmlkZGVuVmVy
dGljYWxWYWx1ZXMuaGVpZ2h0ID8gb3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzLmhlaWdodC52YWx1
ZSgpIDogY29tcHV0ZWRIZWlnaHQobGF5b3V0Qm94KTsKLQotICAgICAgICBpZiAoaGVpZ2h0KQot
ICAgICAgICAgICAgcmV0dXJuIHsgKmhlaWdodCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0KLSAg
ICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENvbnRh
aW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dDaGlsZCgpKQotICAgICAgICAgICAgcmV0dXJu
IHsgMCwgbm9uQ29sbGFwc2VkTWFyZ2luIH07Ci0KLSAgICAgICAgLy8gMS4gdGhlIGJvdHRvbSBl
ZGdlIG9mIHRoZSBsYXN0IGxpbmUgYm94LCBpZiB0aGUgYm94IGVzdGFibGlzaGVzIGEgaW5saW5l
IGZvcm1hdHRpbmcgY29udGV4dCB3aXRoIG9uZSBvciBtb3JlIGxpbmVzCi0gICAgICAgIGF1dG8m
IGxheW91dENvbnRhaW5lciA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KTsKLSAg
ICAgICAgaWYgKGxheW91dENvbnRhaW5lci5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250
ZXh0KCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGlubGluZUZvcm1hdHRpbmdTdGF0ZSA9IGxheW91
dFN0YXRlKCkuZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUobGF5b3V0Q29udGFpbmVy
KTsKLSAgICAgICAgICAgIGF1dG8mIGxpbmVzID0gaW5saW5lRm9ybWF0dGluZ1N0YXRlLmxpbmVz
KCk7Ci0gICAgICAgICAgICAvLyBFdmVuIGVtcHR5IGNvbnRhaW5lcnMgZ2VuZXJhdGUgb25lIGxp
bmUuIAotICAgICAgICAgICAgQVNTRVJUKCFsaW5lcy5pc0VtcHR5KCkpOwotICAgICAgICAgICAg
cmV0dXJuIHsgdG9MYXlvdXRVbml0KGxpbmVzLmxhc3QoKS5saW5lQm94TG9naWNhbFJlY3QoKS5i
b3R0b20oKSArIGlubGluZUZvcm1hdHRpbmdTdGF0ZS5jbGVhckdhcEFmdGVyTGFzdExpbmUoKSkg
LSBib3JkZXJBbmRQYWRkaW5nVG9wLCBub25Db2xsYXBzZWRNYXJnaW4gfTsKLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIDIuIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgYm90dG9tIChwb3NzaWJseSBj
b2xsYXBzZWQpIG1hcmdpbiBvZiBpdHMgbGFzdCBpbi1mbG93IGNoaWxkLCBpZiB0aGUgY2hpbGQn
cyBib3R0b20gbWFyZ2luLi4uCi0gICAgICAgIGF1dG8mIGxhc3RJbkZsb3dDaGlsZCA9ICpsYXlv
dXRDb250YWluZXIubGFzdEluRmxvd0NoaWxkKCk7Ci0gICAgICAgIGlmICghZm9ybWF0dGluZ0Nv
bnRleHQoKS5tYXJnaW5Db2xsYXBzZSgpLm1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1h
cmdpbkFmdGVyKGxhc3RJbkZsb3dDaGlsZCkpIHsKLSAgICAgICAgICAgIGF1dG8mIGxhc3RJbkZs
b3dCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGFzdElu
Rmxvd0NoaWxkKTsKLSAgICAgICAgICAgIGF1dG8gYm90dG9tRWRnZU9mQm90dG9tTWFyZ2luID0g
Qm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QobGFzdEluRmxvd0JveEdlb21ldHJ5KS5ib3R0b20o
KSArIGxhc3RJbkZsb3dCb3hHZW9tZXRyeS5tYXJnaW5BZnRlcigpOwotICAgICAgICAgICAgcmV0
dXJuIHsgYm90dG9tRWRnZU9mQm90dG9tTWFyZ2luIC0gYm9yZGVyQW5kUGFkZGluZ1RvcCwgbm9u
Q29sbGFwc2VkTWFyZ2luIH07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAzLiB0aGUgYm90dG9t
IGJvcmRlciBlZGdlIG9mIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgd2hvc2UgdG9wIG1hcmdpbiBk
b2Vzbid0IGNvbGxhcHNlIHdpdGggdGhlIGVsZW1lbnQncyBib3R0b20gbWFyZ2luCi0gICAgICAg
IGF1dG8qIGluRmxvd0NoaWxkID0gJmxhc3RJbkZsb3dDaGlsZDsKLSAgICAgICAgd2hpbGUgKGlu
Rmxvd0NoaWxkICYmIGZvcm1hdHRpbmdDb250ZXh0KCkubWFyZ2luQ29sbGFwc2UoKS5tYXJnaW5C
ZWZvcmVDb2xsYXBzZXNXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoKmluRmxvd0NoaWxkKSkKLSAgICAg
ICAgICAgIGluRmxvd0NoaWxkID0gaW5GbG93Q2hpbGQtPnByZXZpb3VzSW5GbG93U2libGluZygp
OwotICAgICAgICBpZiAoaW5GbG93Q2hpbGQpIHsKLSAgICAgICAgICAgIGF1dG8mIGluRmxvd0Jv
eEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveCgqaW5GbG93Q2hp
bGQpOwotICAgICAgICAgICAgcmV0dXJuIHsgQm94R2VvbWV0cnk6OmJvcmRlckJveFRvcChpbkZs
b3dCb3hHZW9tZXRyeSkgKyBpbkZsb3dCb3hHZW9tZXRyeS5ib3JkZXJCb3goKS5oZWlnaHQoKSAt
IGJvcmRlckFuZFBhZGRpbmdUb3AsIG5vbkNvbGxhcHNlZE1hcmdpbiB9OwotICAgICAgICB9Ci0K
LSAgICAgICAgLy8gNC4gemVybywgb3RoZXJ3aXNlCi0gICAgICAgIHJldHVybiB7IDAsIG5vbkNv
bGxhcHNlZE1hcmdpbiB9OwotICAgIH07Ci0KLSAgICAvLyAxMC42LjcgJ0F1dG8nIGhlaWdodHMg
Zm9yIGJsb2NrLWxldmVsIGZvcm1hdHRpbmcgY29udGV4dCBib3hlcy4KLSAgICBhdXRvIGlzQXV0
b0hlaWdodCA9ICFvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMuaGVpZ2h0ICYmICFjb21wdXRlZEhl
aWdodChsYXlvdXRCb3gpOwotICAgIGlmIChpc0F1dG9IZWlnaHQgJiYgKGxheW91dEJveC5lc3Rh
Ymxpc2hlc0Zvcm1hdHRpbmdDb250ZXh0KCkgJiYgIWxheW91dEJveC5lc3RhYmxpc2hlc0lubGlu
ZUZvcm1hdHRpbmdDb250ZXh0KCkpKQotICAgICAgICByZXR1cm4gY29tcHV0ZSggT3ZlcnJpZGRl
blZlcnRpY2FsVmFsdWVzIHsgY29udGVudEhlaWdodEZvckZvcm1hdHRpbmdDb250ZXh0Um9vdChk
b3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkpIH0pOwotICAgIHJldHVybiBjb21wdXRl
KG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93Tm9uUmVwbGFjZWRDb250ZW50
V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25z
dHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRh
bFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKGxheW91
dEJveC5pc0luRmxvdygpKTsKLQotICAgIGF1dG8gY29tcHV0ZSA9IFsmXSgpIHsKLQotICAgICAg
ICAvLyAxMC4zLjMgQmxvY2stbGV2ZWwsIG5vbi1yZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwg
ZmxvdwotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIG11
c3QgaG9sZCBhbW9uZyB0aGUgdXNlZCB2YWx1ZXMgb2YgdGhlIG90aGVyIHByb3BlcnRpZXM6Ci0g
ICAgICAgIC8vICdtYXJnaW4tbGVmdCcgKyAnYm9yZGVyLWxlZnQtd2lkdGgnICsgJ3BhZGRpbmct
bGVmdCcgKyAnd2lkdGgnICsgJ3BhZGRpbmctcmlnaHQnICsgJ2JvcmRlci1yaWdodC13aWR0aCcg
KyAnbWFyZ2luLXJpZ2h0JyA9IHdpZHRoIG9mIGNvbnRhaW5pbmcgYmxvY2sKLSAgICAgICAgLy8K
LSAgICAgICAgLy8gMS4gSWYgJ3dpZHRoJyBpcyBub3QgJ2F1dG8nIGFuZCAnYm9yZGVyLWxlZnQt
d2lkdGgnICsgJ3BhZGRpbmctbGVmdCcgKyAnd2lkdGgnICsgJ3BhZGRpbmctcmlnaHQnICsgJ2Jv
cmRlci1yaWdodC13aWR0aCcgCi0gICAgICAgIC8vICAgIChwbHVzIGFueSBvZiAnbWFyZ2luLWxl
ZnQnIG9yICdtYXJnaW4tcmlnaHQnIHRoYXQgYXJlIG5vdCAnYXV0bycpIGlzIGxhcmdlciB0aGFu
IHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmluZyBibG9jaywgdGhlbgotICAgICAgICAvLyAgICBh
bnkgJ2F1dG8nIHZhbHVlcyBmb3IgJ21hcmdpbi1sZWZ0JyBvciAnbWFyZ2luLXJpZ2h0JyBhcmUs
IGZvciB0aGUgZm9sbG93aW5nIHJ1bGVzLCB0cmVhdGVkIGFzIHplcm8uCi0gICAgICAgIC8vCi0g
ICAgICAgIC8vIDIuIElmIGFsbCBvZiB0aGUgYWJvdmUgaGF2ZSBhIGNvbXB1dGVkIHZhbHVlIG90
aGVyIHRoYW4gJ2F1dG8nLCB0aGUgdmFsdWVzIGFyZSBzYWlkIHRvIGJlICJvdmVyLWNvbnN0cmFp
bmVkIiBhbmQgb25lIG9mIHRoZSB1c2VkIHZhbHVlcyB3aWxsCi0gICAgICAgIC8vICAgIGhhdmUg
dG8gYmUgZGlmZmVyZW50IGZyb20gaXRzIGNvbXB1dGVkIHZhbHVlLiBJZiB0aGUgJ2RpcmVjdGlv
bicgcHJvcGVydHkgb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgaGFzIHRoZSB2YWx1ZSAnbHRyJywg
dGhlIHNwZWNpZmllZCB2YWx1ZQotICAgICAgICAvLyAgICBvZiAnbWFyZ2luLXJpZ2h0JyBpcyBp
Z25vcmVkIGFuZCB0aGUgdmFsdWUgaXMgY2FsY3VsYXRlZCBzbyBhcyB0byBtYWtlIHRoZSBlcXVh
bGl0eSB0cnVlLiBJZiB0aGUgdmFsdWUgb2YgJ2RpcmVjdGlvbicgaXMgJ3J0bCcsCi0gICAgICAg
IC8vICAgIHRoaXMgaGFwcGVucyB0byAnbWFyZ2luLWxlZnQnIGluc3RlYWQuCi0gICAgICAgIC8v
Ci0gICAgICAgIC8vIDMuIElmIHRoZXJlIGlzIGV4YWN0bHkgb25lIHZhbHVlIHNwZWNpZmllZCBh
cyAnYXV0bycsIGl0cyB1c2VkIHZhbHVlIGZvbGxvd3MgZnJvbSB0aGUgZXF1YWxpdHkuCi0gICAg
ICAgIC8vCi0gICAgICAgIC8vIDQuIElmICd3aWR0aCcgaXMgc2V0IHRvICdhdXRvJywgYW55IG90
aGVyICdhdXRvJyB2YWx1ZXMgYmVjb21lICcwJyBhbmQgJ3dpZHRoJyBmb2xsb3dzIGZyb20gdGhl
IHJlc3VsdGluZyBlcXVhbGl0eS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gNS4gSWYgYm90aCAn
bWFyZ2luLWxlZnQnIGFuZCAnbWFyZ2luLXJpZ2h0JyBhcmUgJ2F1dG8nLCB0aGVpciB1c2VkIHZh
bHVlcyBhcmUgZXF1YWwuIFRoaXMgaG9yaXpvbnRhbGx5IGNlbnRlcnMgdGhlIGVsZW1lbnQgd2l0
aCByZXNwZWN0IHRvIHRoZQotICAgICAgICAvLyAgICBlZGdlcyBvZiB0aGUgY29udGFpbmluZyBi
bG9jay4KLQotICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1dpZHRoID0gaG9yaXpvbnRhbENv
bnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAgICAgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrU3R5
bGUgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkuc3R5bGUoKTsKLSAgICAgICAgYXV0byYg
Ym94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJv
eCk7Ci0KLSAgICAgICAgYXV0byB3aWR0aCA9IG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLndp
ZHRoID8gb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMud2lkdGggOiBjb21wdXRlZFdpZHRoKGxh
eW91dEJveCwgY29udGFpbmluZ0Jsb2NrV2lkdGgpOwotICAgICAgICBhdXRvIGNvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6b250YWxNYXJnaW4obGF5b3V0
Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgICAgICBVc2VkSG9yaXpvbnRhbE1hcmdp
biB1c2VkSG9yaXpvbnRhbE1hcmdpbjsKLSAgICAgICAgYXV0byBib3JkZXJMZWZ0ID0gYm94R2Vv
bWV0cnkuYm9yZGVyTGVmdCgpOwotICAgICAgICBhdXRvIGJvcmRlclJpZ2h0ID0gYm94R2VvbWV0
cnkuYm9yZGVyUmlnaHQoKTsKLSAgICAgICAgYXV0byBwYWRkaW5nTGVmdCA9IGJveEdlb21ldHJ5
LnBhZGRpbmdMZWZ0KCkudmFsdWVPcigwKTsKLSAgICAgICAgYXV0byBwYWRkaW5nUmlnaHQgPSBi
b3hHZW9tZXRyeS5wYWRkaW5nUmlnaHQoKS52YWx1ZU9yKDApOwotCi0gICAgICAgIC8vICMxCi0g
ICAgICAgIGlmICh3aWR0aCkgewotICAgICAgICAgICAgYXV0byBob3Jpem9udGFsU3BhY2VGb3JN
YXJnaW4gPSBjb250YWluaW5nQmxvY2tXaWR0aCAtIChjb21wdXRlZEhvcml6b250YWxNYXJnaW4u
c3RhcnQudmFsdWVPcigwKSArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3aWR0aCArIHBh
ZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0ICsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52
YWx1ZU9yKDApKTsKLSAgICAgICAgICAgIGlmIChob3Jpem9udGFsU3BhY2VGb3JNYXJnaW4gPCAw
KQotICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luID0geyBjb21wdXRlZEhvcml6
b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVu
ZC52YWx1ZU9yKDApIH07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAjMgotICAgICAgICBpZiAo
d2lkdGggJiYgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmIGNvbXB1dGVkSG9yaXpv
bnRhbE1hcmdpbi5lbmQpIHsKLSAgICAgICAgICAgIGlmIChjb250YWluaW5nQmxvY2tTdHlsZS5p
c0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICB1c2VkSG9yaXpvbnRh
bE1hcmdpbi5zdGFydCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQ7Ci0gICAgICAg
ICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0gY29udGFpbmluZ0Jsb2NrV2lkdGgg
LSAodXNlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQg
KyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJSaWdodCk7Ci0gICAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCA9ICpjb21wdXRl
ZEhvcml6b250YWxNYXJnaW4uZW5kOwotICAgICAgICAgICAgICAgIHVzZWRIb3Jpem9udGFsTWFy
Z2luLnN0YXJ0ID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoYm9yZGVyTGVmdCArIHBhZGRpbmdM
ZWZ0ICsgKndpZHRoICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1c2VkSG9yaXpvbnRh
bE1hcmdpbi5lbmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIzMK
LSAgICAgICAgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgJiYgd2lkdGggJiYg
Y29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZCkgewotICAgICAgICAgICAgdXNlZEhvcml6b250
YWxNYXJnaW4uZW5kID0gKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQ7Ci0gICAgICAgICAg
ICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKGJv
cmRlckxlZnQgKyBwYWRkaW5nTGVmdCAgKyAqd2lkdGggKyBwYWRkaW5nUmlnaHQgKyBib3JkZXJS
aWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmICF3aWR0aCAmJiBjb21wdXRlZEhvcml6b250
YWxNYXJnaW4uZW5kKSB7Ci0gICAgICAgICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbiA9IHsgKmNv
bXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCwgKmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5l
bmQgfTsKLSAgICAgICAgICAgIHdpZHRoID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAodXNlZEhv
cml6b250YWxNYXJnaW4uc3RhcnQgKyBib3JkZXJMZWZ0ICsgcGFkZGluZ0xlZnQgKyBwYWRkaW5n
UmlnaHQgKyBib3JkZXJSaWdodCArIHVzZWRIb3Jpem9udGFsTWFyZ2luLmVuZCk7Ci0gICAgICAg
IH0gZWxzZSBpZiAoY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICYmIHdpZHRoICYmICFj
b21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKSB7Ci0gICAgICAgICAgICB1c2VkSG9yaXpvbnRh
bE1hcmdpbi5zdGFydCA9ICpjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQ7Ci0gICAgICAg
ICAgICB1c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQgPSBjb250YWluaW5nQmxvY2tXaWR0aCAtICh1
c2VkSG9yaXpvbnRhbE1hcmdpbi5zdGFydCArIGJvcmRlckxlZnQgKyBwYWRkaW5nTGVmdCArICp3
aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAg
IC8vICM0Ci0gICAgICAgIGlmICghd2lkdGgpIHsKLSAgICAgICAgICAgIHVzZWRIb3Jpem9udGFs
TWFyZ2luID0geyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigwKSwgY29t
cHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDApIH07Ci0gICAgICAgICAgICB3aWR0
aCA9IGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gKHVzZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ICsg
Ym9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgYm9yZGVyUmlnaHQgKyB1
c2VkSG9yaXpvbnRhbE1hcmdpbi5lbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIzUKLSAg
ICAgICAgaWYgKCFjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQgJiYgIWNvbXB1dGVkSG9y
aXpvbnRhbE1hcmdpbi5lbmQpIHsKLSAgICAgICAgICAgIGF1dG8gaG9yaXpvbnRhbFNwYWNlRm9y
TWFyZ2luID0gY29udGFpbmluZ0Jsb2NrV2lkdGggLSAoYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0
ICArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0KTsKLSAgICAgICAgICAgIHVz
ZWRIb3Jpem9udGFsTWFyZ2luID0geyBob3Jpem9udGFsU3BhY2VGb3JNYXJnaW4gLyAyLCBob3Jp
em9udGFsU3BhY2VGb3JNYXJnaW4gLyAyIH07Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIHNo
b3VsZEFwcGx5Q2VudGVyQWxpZ25Gb3JCbG9ja0NvbnRlbnQgPSBjb250YWluaW5nQmxvY2tTdHls
ZS50ZXh0QWxpZ24oKSA9PSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRDZW50ZXIgJiYgKGNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbi5zdGFydCB8fCBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kKTsK
LSAgICAgICAgaWYgKHNob3VsZEFwcGx5Q2VudGVyQWxpZ25Gb3JCbG9ja0NvbnRlbnQpIHsKLSAg
ICAgICAgICAgIGF1dG8gYm9yZGVyQm94V2lkdGggPSAoYm9yZGVyTGVmdCArIHBhZGRpbmdMZWZ0
ICArICp3aWR0aCArIHBhZGRpbmdSaWdodCArIGJvcmRlclJpZ2h0KTsKLSAgICAgICAgICAgIGF1
dG8gbWFyZ2luU3RhcnQgPSBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQudmFsdWVPcigw
KTsKLSAgICAgICAgICAgIGF1dG8gbWFyZ2luRW5kID0gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
LmVuZC52YWx1ZU9yKDApOwotICAgICAgICAgICAgYXV0byBjZW50ZXJlZExvZ2ljYWxMZWZ0Rm9y
TWFyZ2luQm94ID0gc3RkOjptYXgoKGNvbnRhaW5pbmdCbG9ja1dpZHRoIC0gYm9yZGVyQm94V2lk
dGggLSBtYXJnaW5TdGFydCAtIG1hcmdpbkVuZCkgLyAyLCAwX2x1KTsKLSAgICAgICAgICAgIHVz
ZWRIb3Jpem9udGFsTWFyZ2luLnN0YXJ0ID0gY2VudGVyZWRMb2dpY2FsTGVmdEZvck1hcmdpbkJv
eCArIG1hcmdpblN0YXJ0OwotICAgICAgICAgICAgdXNlZEhvcml6b250YWxNYXJnaW4uZW5kID0g
Y29udGFpbmluZ0Jsb2NrV2lkdGggLSBib3JkZXJCb3hXaWR0aCAtIG1hcmdpblN0YXJ0ICsgbWFy
Z2luRW5kOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVCh3aWR0aCk7Ci0KLSAgICAgICAgcmV0
dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7ICp3aWR0aCwgdXNlZEhvcml6b250YWxNYXJnaW4g
fTsKLSAgICB9OwotCi0gICAgYXV0byBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBjb21wdXRlKCk7
Ci0gICAgTE9HX1dJVEhfU1RSRUFNKEZvcm1hdHRpbmdDb250ZXh0TGF5b3V0LCBzdHJlYW0gPDwg
IltXaWR0aF1bTWFyZ2luXSAtPiBpbmZsb3cgbm9uLXJlcGxhY2VkIC0+IHdpZHRoKCIgPDwgY29u
dGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCA8PCAicHgpIG1hcmdpbigiIDw8IGNvbnRl
bnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0IDw8ICJweCwgIiA8PCBjb250ZW50V2lk
dGhBbmRNYXJnaW4udXNlZE1hcmdpbi5lbmQgPDwgInB4KSAtPiBsYXlvdXRCb3goIiA8PCAmbGF5
b3V0Qm94IDw8ICIpIik7Ci0gICAgcmV0dXJuIGNvbnRlbnRXaWR0aEFuZE1hcmdpbjsKLX0KLQot
Q29udGVudFdpZHRoQW5kTWFyZ2luIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpp
bkZsb3dSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihjb25zdCBSZXBsYWNlZEJveCYgcmVw
bGFjZWRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250
YWxWYWx1ZXMpCi17Ci0gICAgQVNTRVJUKHJlcGxhY2VkQm94LmlzSW5GbG93KCkpOwotCi0gICAg
Ly8gMTAuMy40IEJsb2NrLWxldmVsLCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdwot
ICAgIC8vCi0gICAgLy8gMS4gVGhlIHVzZWQgdmFsdWUgb2YgJ3dpZHRoJyBpcyBkZXRlcm1pbmVk
IGFzIGZvciBpbmxpbmUgcmVwbGFjZWQgZWxlbWVudHMuCi0gICAgLy8gMi4gVGhlbiB0aGUgcnVs
ZXMgZm9yIG5vbi1yZXBsYWNlZCBibG9jay1sZXZlbCBlbGVtZW50cyBhcmUgYXBwbGllZCB0byBk
ZXRlcm1pbmUgdGhlIG1hcmdpbnMuCi0KLSAgICAvLyAjMQotICAgIGF1dG8gdXNlZFdpZHRoID0g
aW5saW5lUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250
YWxDb25zdHJhaW50cywgeyB9LCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykuY29udGVudFdp
ZHRoOwotICAgIC8vICMyCi0gICAgYXV0byBub25SZXBsYWNlZFdpZHRoQW5kTWFyZ2luID0gaW5G
bG93Tm9uUmVwbGFjZWRDb250ZW50V2lkdGhBbmRNYXJnaW4ocmVwbGFjZWRCb3gsIGhvcml6b250
YWxDb25zdHJhaW50cywgT3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMgeyB1c2VkV2lkdGgsIG92
ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzLm1hcmdpbiB9KTsKLQotICAgIExPR19XSVRIX1NUUkVB
TShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbV2lkdGhdW01hcmdpbl0gLT4g
aW5mbG93IHJlcGxhY2VkIC0+IHdpZHRoKCIgPDwgdXNlZFdpZHRoICA8PCAicHgpIG1hcmdpbigi
IDw8IG5vblJlcGxhY2VkV2lkdGhBbmRNYXJnaW4udXNlZE1hcmdpbi5zdGFydCA8PCAicHgsICIg
PDwgbm9uUmVwbGFjZWRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLmVuZCA8PCAicHgpIC0+IGxh
eW91dEJveCgiIDw8ICZyZXBsYWNlZEJveCA8PCAiKSIpOwotICAgIHJldHVybiB7IHVzZWRXaWR0
aCwgbm9uUmVwbGFjZWRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luIH07Ci19Ci0KLUxheW91dFVu
aXQgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OnN0YXRpY1ZlcnRpY2FsUG9zaXRp
b24oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IFZlcnRpY2FsQ29uc3RyYWludHMmIHZlcnRp
Y2FsQ29uc3RyYWludHMpIGNvbnN0Ci17Ci0gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NT
UzIyL3Zpc3VyZW4uaHRtbCNibG9jay1mb3JtYXR0aW5nCi0gICAgLy8gSW4gYSBibG9jayBmb3Jt
YXR0aW5nIGNvbnRleHQsIGJveGVzIGFyZSBsYWlkIG91dCBvbmUgYWZ0ZXIgdGhlIG90aGVyLCB2
ZXJ0aWNhbGx5LCBiZWdpbm5pbmcgYXQgdGhlIHRvcCBvZiBhIGNvbnRhaW5pbmcgYmxvY2suCi0g
ICAgLy8gVGhlIHZlcnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNpYmxpbmcgYm94ZXMgaXMg
ZGV0ZXJtaW5lZCBieSB0aGUgJ21hcmdpbicgcHJvcGVydGllcy4KLSAgICAvLyBWZXJ0aWNhbCBt
YXJnaW5zIGJldHdlZW4gYWRqYWNlbnQgYmxvY2stbGV2ZWwgYm94ZXMgaW4gYSBibG9jayBmb3Jt
YXR0aW5nIGNvbnRleHQgY29sbGFwc2UuCi0gICAgaWYgKGF1dG8qIHByZXZpb3VzSW5GbG93U2li
bGluZyA9IGxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkgewotICAgICAgICBhdXRv
JiBwcmV2aW91c0luRmxvd0JveEdlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRy
eUZvckJveCgqcHJldmlvdXNJbkZsb3dTaWJsaW5nKTsKLSAgICAgICAgcmV0dXJuIEJveEdlb21l
dHJ5Ojpib3JkZXJCb3hSZWN0KHByZXZpb3VzSW5GbG93Qm94R2VvbWV0cnkpLmJvdHRvbSgpICsg
cHJldmlvdXNJbkZsb3dCb3hHZW9tZXRyeS5tYXJnaW5BZnRlcigpOwotICAgIH0KLSAgICByZXR1
cm4gdmVydGljYWxDb25zdHJhaW50cy5sb2dpY2FsVG9wOwotfQotCi1MYXlvdXRVbml0IEJsb2Nr
Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpzdGF0aWNIb3Jpem9udGFsUG9zaXRpb24oY29u
c3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRh
bENvbnN0cmFpbnRzKSBjb25zdAotewotICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1My
Mi92aXN1cmVuLmh0bWwjYmxvY2stZm9ybWF0dGluZwotICAgIC8vIEluIGEgYmxvY2sgZm9ybWF0
dGluZyBjb250ZXh0LCBlYWNoIGJveCdzIGxlZnQgb3V0ZXIgZWRnZSB0b3VjaGVzIHRoZSBsZWZ0
IGVkZ2Ugb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2sgKGZvciByaWdodC10by1sZWZ0IGZvcm1hdHRp
bmcsIHJpZ2h0IGVkZ2VzIHRvdWNoKS4KLSAgICByZXR1cm4gaG9yaXpvbnRhbENvbnN0cmFpbnRz
LmxvZ2ljYWxMZWZ0ICsgZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRC
b3gpLm1hcmdpblN0YXJ0KCk7Ci19Ci0KLVBvaW50IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5OjpzdGF0aWNQb3NpdGlvbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IFZlcnRpY2FsQ29u
c3RyYWludHMmIHZlcnRpY2FsQ29uc3RyYWludHMpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHsgc3Rh
dGljSG9yaXpvbnRhbFBvc2l0aW9uKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKSwg
c3RhdGljVmVydGljYWxQb3NpdGlvbihsYXlvdXRCb3gsIHZlcnRpY2FsQ29uc3RyYWludHMpIH07
Ci19Ci0KLUNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnk6OmluRmxvd0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBjb25z
dCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMmIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcykKLXsK
LSAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5GbG93KCkpOwotCi0gICAgLy8gMTAuNi4yIElubGlu
ZSByZXBsYWNlZCBlbGVtZW50cywgYmxvY2stbGV2ZWwgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9y
bWFsIGZsb3csICdpbmxpbmUtYmxvY2snCi0gICAgLy8gcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9y
bWFsIGZsb3cgYW5kIGZsb2F0aW5nIHJlcGxhY2VkIGVsZW1lbnRzCi0gICAgaWYgKGxheW91dEJv
eC5pc1JlcGxhY2VkQm94KCkpCi0gICAgICAgIHJldHVybiBpbmxpbmVSZXBsYWNlZENvbnRlbnRI
ZWlnaHRBbmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCksIGhvcml6b250
YWxDb25zdHJhaW50cywgeyB9LCBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpOwotCi0gICAgQ29u
dGVudEhlaWdodEFuZE1hcmdpbiBjb250ZW50SGVpZ2h0QW5kTWFyZ2luOwotICAgIGlmIChsYXlv
dXRCb3guaXNPdmVyZmxvd1Zpc2libGUoKSAmJiAhbGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSkg
ewotICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHRoZSBjYXNlIGZvciB0aGUgZG9jdW1lbnQg
ZWxlbWVudC4gTGV0J3MganVzdCBjb21wbGljYXRlZC1jYXNlIGl0IGZvciBub3cuCi0gICAgICAg
IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4gPSBpbkZsb3dOb25SZXBsYWNlZENvbnRlbnRIZWlnaHRB
bmRNYXJnaW4obGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0
aWNhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gMTAuNi42IENvbXBsaWNhdGVk
IGNhc2VzCi0gICAgICAgIC8vIEJsb2NrLWxldmVsLCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4g
bm9ybWFsIGZsb3cgd2hlbiAnb3ZlcmZsb3cnIGRvZXMgbm90IGNvbXB1dGUgdG8gJ3Zpc2libGUn
IChleGNlcHQgaWYgdGhlICdvdmVyZmxvdycgcHJvcGVydHkncyB2YWx1ZSBoYXMgYmVlbiBwcm9w
YWdhdGVkIHRvIHRoZSB2aWV3cG9ydCkuCi0gICAgICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4g
PSBjb21wbGljYXRlZENhc2VzKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVy
cmlkZGVuVmVydGljYWxWYWx1ZXMpOwotICAgIH0KLQotICAgIGF1dG8gcXVpcmtzID0gZm9ybWF0
dGluZ0NvbnRleHQoKS5xdWlya3MoKTsKLSAgICBpZiAoIXF1aXJrcy5uZWVkc1N0cmV0Y2hpbmco
bGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW47Ci0KLSAg
ICBjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPSBxdWlya3Muc3RyZXRjaGVk
SW5GbG93SGVpZ2h0KGxheW91dEJveCwgY29udGVudEhlaWdodEFuZE1hcmdpbik7Ci0KLSAgICBM
T0dfV0lUSF9TVFJFQU0oRm9ybWF0dGluZ0NvbnRleHRMYXlvdXQsIHN0cmVhbSA8PCAiW0hlaWdo
dF1bTWFyZ2luXSAtPiBpbmZsb3cgbm9uLXJlcGxhY2VkIC0+IHN0cmVjaGVkIHRvIHZpZXdwb3J0
IC0+IGhlaWdodCgiIDw8IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCA8PCAi
cHgpIG1hcmdpbigiIDw8IGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2lu
LmJlZm9yZSA8PCAicHgsICIgPDwgY29udGVudEhlaWdodEFuZE1hcmdpbi5ub25Db2xsYXBzZWRN
YXJnaW4uYWZ0ZXIgPDwgInB4KSAtPiBsYXlvdXRCb3goIiA8PCAmbGF5b3V0Qm94IDw8ICIpIik7
Ci0gICAgcmV0dXJuIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW47Ci19Ci0KLUNvbnRlbnRXaWR0aEFu
ZE1hcmdpbiBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5GbG93Q29udGVudFdp
ZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3Ry
YWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJpZGRlbkhvcml6b250YWxW
YWx1ZXMmIG92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzKQotewotICAgIEFTU0VSVChsYXlvdXRC
b3guaXNJbkZsb3coKSk7Ci0KLSAgICBpZiAoIWxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCi0g
ICAgICAgIHJldHVybiBpbkZsb3dOb25SZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlv
dXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMp
OwotICAgIHJldHVybiBpbkZsb3dSZXBsYWNlZENvbnRlbnRXaWR0aEFuZE1hcmdpbihkb3duY2Fz
dDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlk
ZGVuSG9yaXpvbnRhbFZhbHVlcyk7Ci19Ci0KLUNvbnRlbnRXaWR0aEFuZE1hcmdpbiBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRDb250ZW50V2lkdGhBbmRNYXJnaW4o
Y29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpv
bnRhbENvbnN0cmFpbnRzLCBPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVXaWR0aEZsb2F0
QXZvaWRlcikKLXsKLSAgICBhdXRvIGNvbXB1dGUgPSBbJl0gKGF1dG8gY29uc3RyYWludHNGb3JX
aWR0aCwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZFdpZHRoKSB7Ci0gICAgICAgIGlmIChsYXlv
dXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBmbG9hdGlu
Z0NvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gsIGNvbnN0cmFpbnRzRm9yV2lkdGgsIHsg
dXNlZFdpZHRoLCB7IH0gfSk7Ci0KLSAgICAgICAgaWYgKGxheW91dEJveC5pc0luRmxvdygpKQot
ICAgICAgICAgICAgcmV0dXJuIGluRmxvd0NvbnRlbnRXaWR0aEFuZE1hcmdpbihsYXlvdXRCb3gs
IGNvbnN0cmFpbnRzRm9yV2lkdGgsIHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0KLSAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBDb250ZW50V2lkdGhBbmRNYXJnaW4g
eyB9OwotICAgIH07Ci0KLSAgICBhdXRvIGhvcml6b250YWxDb25zdHJhaW50c0ZvcldpZHRoID0g
aG9yaXpvbnRhbENvbnN0cmFpbnRzOwotICAgIGlmIChsYXlvdXRCb3guc3R5bGUoKS5sb2dpY2Fs
V2lkdGgoKS5pc0F1dG8oKSAmJiBhdmFpbGFibGVXaWR0aEZsb2F0QXZvaWRlcikgewotICAgICAg
ICAvLyBXaGlsZSB0aGUgbm9uLWF1dG8gd2lkdGggdmFsdWVzIHNob3VsZCBhbGwgYmUgcmVzb2x2
ZWQgYWdhaW5zdCB0aGUgY29udGFpbmluZyBibG9jaydzIHdpZHRoLCB3aGVuCi0gICAgICAgIC8v
IHRoZSB3aWR0aCBpcyBhdXRvIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFjZSBpcyBzaHJ1
bmsgYnkgbmVpZ2hib3JpbmcgZmxvYXRzLgotICAgICAgICBob3Jpem9udGFsQ29uc3RyYWludHNG
b3JXaWR0aC5sb2dpY2FsV2lkdGggPSAqYXZhaWxhYmxlV2lkdGhGbG9hdEF2b2lkZXI7Ci0gICAg
fQotICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFyZ2luID0gY29tcHV0ZShob3Jpem9udGFsQ29u
c3RyYWludHNGb3JXaWR0aCwgeyB9KTsKLSAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gaG9yaXpv
bnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aDsKLSAgICBpZiAoYXV0byBtYXhXaWR0aCA9IGNv
bXB1dGVkTWF4V2lkdGgobGF5b3V0Qm94LCBhdmFpbGFibGVXaWR0aCkpIHsKLSAgICAgICAgYXV0
byBtYXhXaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUoaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBtYXhX
aWR0aCk7Ci0gICAgICAgIGlmIChjb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoID4g
bWF4V2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQotICAgICAgICAgICAgY29udGVudFdpZHRo
QW5kTWFyZ2luID0gbWF4V2lkdGhBbmRNYXJnaW47Ci0gICAgfQotCi0gICAgYXV0byBtaW5XaWR0
aCA9IGNvbXB1dGVkTWluV2lkdGgobGF5b3V0Qm94LCBhdmFpbGFibGVXaWR0aCkudmFsdWVPcigw
KTsKLSAgICBhdXRvIG1pbldpZHRoQW5kTWFyZ2luID0gY29tcHV0ZShob3Jpem9udGFsQ29uc3Ry
YWludHMsIG1pbldpZHRoKTsKLSAgICBpZiAoY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRX
aWR0aCA8IG1pbldpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0aCkKLSAgICAgICAgY29udGVudFdp
ZHRoQW5kTWFyZ2luID0gbWluV2lkdGhBbmRNYXJnaW47Ci0gICAgcmV0dXJuIGNvbnRlbnRXaWR0
aEFuZE1hcmdpbjsKLX0KLQotRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMoY29uc3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAgYXV0byBmaXhlZE1hcmdpbkJv
cmRlckFuZFBhZGRpbmcgPSBbJl0oYXV0byYgbGF5b3V0Qm94KSB7Ci0gICAgICAgIGF1dG8mIHN0
eWxlID0gbGF5b3V0Qm94LnN0eWxlKCk7Ci0gICAgICAgIHJldHVybiBmaXhlZFZhbHVlKHN0eWxl
Lm1hcmdpblN0YXJ0KCkpLnZhbHVlT3IoMCkKLSAgICAgICAgICAgICsgTGF5b3V0VW5pdCB7IHN0
eWxlLmJvcmRlckxlZnRXaWR0aCgpIH0KLSAgICAgICAgICAgICsgZml4ZWRWYWx1ZShzdHlsZS5w
YWRkaW5nTGVmdCgpKS52YWx1ZU9yKDApCi0gICAgICAgICAgICArIGZpeGVkVmFsdWUoc3R5bGUu
cGFkZGluZ1JpZ2h0KCkpLnZhbHVlT3IoMCkKLSAgICAgICAgICAgICsgTGF5b3V0VW5pdCB7IHN0
eWxlLmJvcmRlclJpZ2h0V2lkdGgoKSB9Ci0gICAgICAgICAgICArIGZpeGVkVmFsdWUoc3R5bGUu
bWFyZ2luRW5kKCkpLnZhbHVlT3IoMCk7Ci0gICAgfTsKLQotICAgIGF1dG8gY29tcHV0ZWRJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzID0gWyZdKCkgLT4gSW50cmluc2ljV2lkdGhDb25zdHJhaW50
cyB7Ci0gICAgICAgIGF1dG8gbG9naWNhbFdpZHRoID0gbGF5b3V0Qm94LnN0eWxlKCkubG9naWNh
bFdpZHRoKCk7Ci0gICAgICAgIC8vIE1pbmltdW0vbWF4aW11bSB3aWR0aCBjYW4ndCBiZSBkZXBl
bmRpbmcgb24gdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0aC4KLSAgICAgICAgYXV0byBuZWVk
c1Jlc29sdmVkQ29udGFpbmluZ0Jsb2NrV2lkdGggPSBsb2dpY2FsV2lkdGguaXNDYWxjdWxhdGVk
KCkgfHwgbG9naWNhbFdpZHRoLmlzUGVyY2VudCgpIHx8IGxvZ2ljYWxXaWR0aC5pc1JlbGF0aXZl
KCk7Ci0gICAgICAgIGlmIChuZWVkc1Jlc29sdmVkQ29udGFpbmluZ0Jsb2NrV2lkdGgpCi0gICAg
ICAgICAgICByZXR1cm4geyB9OwotCi0gICAgICAgIGlmIChhdXRvIHdpZHRoID0gZml4ZWRWYWx1
ZShsb2dpY2FsV2lkdGgpKQotICAgICAgICAgICAgcmV0dXJuIHsgKndpZHRoLCAqd2lkdGggfTsK
LQotICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkgewotICAgICAgICAgICAg
YXV0byYgcmVwbGFjZWRCb3ggPSBkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KTsKLSAg
ICAgICAgICAgIGlmIChyZXBsYWNlZEJveC5oYXNJbnRyaW5zaWNXaWR0aCgpKSB7Ci0gICAgICAg
ICAgICAgICAgYXV0byByZXBsYWNlZFdpZHRoID0gcmVwbGFjZWRCb3guaW50cmluc2ljV2lkdGgo
KTsKLSAgICAgICAgICAgICAgICByZXR1cm4geyByZXBsYWNlZFdpZHRoLCByZXBsYWNlZFdpZHRo
IH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKCFpczxDb250YWluZXJCb3g+KGxheW91dEJveCkgfHwgIWRvd25jYXN0PENv
bnRhaW5lckJveD4obGF5b3V0Qm94KS5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKLSAgICAg
ICAgICAgIHJldHVybiB7IH07Ci0KLSAgICAgICAgaWYgKGxheW91dEJveC5pc1NpemVDb250YWlu
bWVudEJveCgpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgaW50cmluc2ljIHNpemVzIG9mIHRoZSBz
aXplIGNvbnRhaW5tZW50IGJveCBhcmUgZGV0ZXJtaW5lZCBhcyBpZiB0aGUgZWxlbWVudCBoYWQg
bm8gY29udGVudCwKLSAgICAgICAgICAgIC8vIGZvbGxvd2luZyB0aGUgc2FtZSBsb2dpYyBhcyB3
aGVuIHNpemluZyBhcyBpZiBlbXB0eS4KLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAg
IH0KLQotICAgICAgICBpZiAobGF5b3V0Qm94LmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQo
KSkgewotICAgICAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gTGF5b3V0
Q29udGV4dDo6Y3JlYXRlRm9ybWF0dGluZ0NvbnRleHQoZG93bmNhc3Q8Q29udGFpbmVyQm94Pihs
YXlvdXRCb3gpLCBsYXlvdXRTdGF0ZSgpKS0+Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzKCk7Ci0gICAgICAgICAgICBpZiAobG9naWNhbFdpZHRoLmlzTWluQ29udGVudCgpKQotICAg
ICAgICAgICAgICAgIHJldHVybiB7IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSwg
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtIH07Ci0gICAgICAgICAgICBpZiAobG9n
aWNhbFdpZHRoLmlzTWF4Q29udGVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiB7IGludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMubWF4aW11bSwgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5t
YXhpbXVtIH07Ci0gICAgICAgICAgICByZXR1cm4gaW50cmluc2ljV2lkdGhDb25zdHJhaW50czsK
LSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IElu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9OwotICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3Rh
dGUgPSBsYXlvdXRTdGF0ZSgpLmZvcm1hdHRpbmdTdGF0ZUZvckJveChsYXlvdXRCb3gpOwotICAg
ICAgICBmb3IgKGF1dG8mIGNoaWxkIDogY2hpbGRyZW5PZlR5cGU8Qm94Pihkb3duY2FzdDxDb250
YWluZXJCb3g+KGxheW91dEJveCkpKSB7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuaXNPdXRPZkZs
b3dQb3NpdGlvbmVkKCkgfHwgKGNoaWxkLmlzRmxvYXRBdm9pZGVyKCkgJiYgIWNoaWxkLmhhc0Zs
b2F0Q2xlYXIoKSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBhdXRv
IGNoaWxkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzRm9yQm94KGNoaWxkKTsKLSAgICAgICAgICAgIEFTU0VSVChjaGls
ZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMpOwotCi0gICAgICAgICAgICBpbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzLm1pbmltdW0gPSBzdGQ6Om1heChpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
Lm1pbmltdW0sIGNoaWxkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cy0+bWluaW11bSk7Ci0gICAg
ICAgICAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0gPSBzdGQ6Om1heChpbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0sIGNoaWxkSW50cmluc2ljV2lkdGhDb25zdHJh
aW50cy0+bWF4aW11bSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRo
Q29uc3RyYWludHM7Ci0gICAgfTsKLSAgICAvLyBGSVhNRSBDaGVjayBmb3IgYm94LXNpemluZzog
Ym9yZGVyLWJveDsKLSAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBjb25zdHJh
aW5CeU1pbk1heFdpZHRoKGxheW91dEJveCwgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzKCkpOwotICAgIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMuZXhwYW5kKGZpeGVkTWFyZ2lu
Qm9yZGVyQW5kUGFkZGluZyhsYXlvdXRCb3gpKTsKLSAgICByZXR1cm4gaW50cmluc2ljV2lkdGhD
b25zdHJhaW50czsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0
dGluZ0NvbnRleHRRdWlya3MuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjA4ODQyMDNkYzg2YTY3MzZhYmM4ZWJk
YWYyYTVlZjFkNTg2YWUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1h
dHRpbmcvQmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKKysrIC9kZXYvbnVsbApAQCAt
MSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCBy
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
ZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRl
ICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRJbml0aWFsQ29udGFpbmlu
Z0Jsb2NrLmgiCi0jaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUg
ewotbmFtZXNwYWNlIExheW91dCB7Ci0KLXN0YXRpYyBib29sIGlzUXVpcmtDb250YWluZXIoY29u
c3QgQm94JiBsYXlvdXRCb3gpCi17Ci0gICAgcmV0dXJuIGxheW91dEJveC5pc0JvZHlCb3goKSB8
fCBsYXlvdXRCb3guaXNEb2N1bWVudEJveCgpIHx8IGxheW91dEJveC5pc1RhYmxlQ2VsbCgpOwot
fQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6bmVlZHNTdHJldGNoaW5n
KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNJ
bkZsb3coKSk7Ci0gICAgLy8gSW4gcXVpcmtzIG1vZGUsIGluLWZsb3cgYm9keSBhbmQgaHRtbCBz
dHJldGNoIHRvIHRoZSBpbml0aWFsIGNvbnRhaW5pbmcgYmxvY2sgKGhlaWdodDogYXV0byBvbmx5
KS4KLSAgICBpZiAoIWxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIGlmICghbGF5b3V0Qm94LmlzRG9jdW1lbnRCb3goKSAmJiAhbGF5b3V0
Qm94LmlzQm9keUJveCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gbGF5
b3V0Qm94LnN0eWxlKCkubG9naWNhbEhlaWdodCgpLmlzQXV0bygpOwotfQotCi1MYXlvdXRVbml0
IEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6c3RyZXRjaGVkSW5GbG93SGVpZ2h0KGNv
bnN0IEJveCYgbGF5b3V0Qm94LCBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIGNvbnRlbnRIZWlnaHRB
bmRNYXJnaW4pCi17Ci0gICAgQVNTRVJUKG5lZWRzU3RyZXRjaGluZyhsYXlvdXRCb3gpKTsKLSAg
ICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1hdHRpbmdDb250ZXh0KCk7Ci0g
ICAgYXV0byBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiA9IGNvbnRlbnRIZWlnaHRBbmRNYXJn
aW4ubm9uQ29sbGFwc2VkTWFyZ2luLmJlZm9yZSArIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9u
Q29sbGFwc2VkTWFyZ2luLmFmdGVyOwotCi0gICAgaWYgKGxheW91dEJveC5pc0RvY3VtZW50Qm94
KCkpIHsKLSAgICAgICAgLy8gTGV0J3Mgc3RyZXRjaCB0aGUgaW5mbG93IGRvY3VtZW50IGJveCg8
aHRtbD4pIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGluaXRpYWwgY29udGFpbmluZyBibG9jayAodmll
dykuCi0gICAgICAgIGF1dG8gZG9jdW1lbnRCb3hDb250ZW50SGVpZ2h0ID0gZm9ybWF0dGluZ0Nv
bnRleHQuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94LmluaXRpYWxDb250YWluaW5nQmxvY2soKSwg
RXNjYXBlUmVhc29uOjpEb2N1bWVudEJveFN0cmV0Y2hlc1RvVmlld3BvcnRRdWlyaykuY29udGVu
dEJveEhlaWdodCgpOwotICAgICAgICAvLyBEb2N1bWVudCBib3gncyBvd24gdmVydGljYWwgbWFy
Z2luL2JvcmRlci9wYWRkaW5nIHZhbHVlcyBhbHdheXMgc2hyaW5rIHRoZSBjb250ZW50IGhlaWdo
dC4KLSAgICAgICAgYXV0byYgZG9jdW1lbnRCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0
Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0gICAgICAgIGRvY3VtZW50Qm94Q29udGVudEhl
aWdodCAtPSBub25Db2xsYXBzZWRWZXJ0aWNhbE1hcmdpbiArIGRvY3VtZW50Qm94R2VvbWV0cnku
dmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCku
dmFsdWVPcigwKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KGNvbnRlbnRIZWlnaHRBbmRNYXJn
aW4uY29udGVudEhlaWdodCwgIGRvY3VtZW50Qm94Q29udGVudEhlaWdodCk7Ci0gICAgfQotCi0g
ICAgLy8gSGVyZSBpcyB0aGUgcXVpcmt5IHBhcnQgZm9yIGJvZHkgYm94IHdoZW4gaXQgc3RyZXRj
aGVzIGFsbCB0aGUgd2F5IHRvIHRoZSBJQ0IgZXZlbiB3aGVuIHRoZSBkb2N1bWVudCBib3ggZG9l
cyBub3QgKGUuZy4gb3V0LW9mLWZsb3cgcG9zaXRpb25lZCkuCi0gICAgQVNTRVJUKGxheW91dEJv
eC5pc0JvZHlCb3goKSk7Ci0gICAgYXV0byYgaW5pdGlhbENvbnRhaW5pbmdCbG9jayA9IGxheW91
dEJveC5pbml0aWFsQ29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgYXV0byYgaW5pdGlhbENvbnRhaW5p
bmdCbG9ja0dlb21ldHJ5ID0gZm9ybWF0dGluZ0NvbnRleHQuZ2VvbWV0cnlGb3JCb3goaW5pdGlh
bENvbnRhaW5pbmdCbG9jaywgRXNjYXBlUmVhc29uOjpCb2R5U3RyZXRjaGVzVG9WaWV3cG9ydFF1
aXJrKTsKLSAgICAvLyBTdGFydCB0aGUgY29udGVudCBoZWlnaHQgd2l0aCB0aGUgSUNCLgotICAg
IGF1dG8gYm9keUJveENvbnRlbnRIZWlnaHQgPSBpbml0aWFsQ29udGFpbmluZ0Jsb2NrR2VvbWV0
cnkuY29udGVudEJveEhlaWdodCgpOwotICAgIC8vIEJvZHkgYm94J3Mgb3duIGJvcmRlciBhbmQg
cGFkZGluZyBzaHJpbmsgdGhlIGNvbnRlbnQgaGVpZ2h0LgotICAgIGF1dG8mIGJvZHlCb3hHZW9t
ZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0gICAg
Ym9keUJveENvbnRlbnRIZWlnaHQgLT0gYm9keUJveEdlb21ldHJ5LnZlcnRpY2FsQm9yZGVyKCkg
KyBib2R5Qm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwKTsKLSAgICAvLyBC
b2R5IGJveCBuZXZlciBjb2xsYXBzZXMgaXRzIHZlcnRpY2FsIG1hcmdpbnMgd2l0aCB0aGUgZG9j
dW1lbnQgYm94IGJ1dCBpdCBtaWdodCBjb2xsYXBzZSBpdHMgbWFyZ2luIHdpdGggaXRzIGRlc2Nl
bmRhbnRzLgotICAgIGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0gY29udGVudEhlaWdodEFuZE1h
cmdpbi5ub25Db2xsYXBzZWRNYXJnaW47Ci0gICAgYXV0byBjb2xsYXBzZWRNYXJnaW4gPSBmb3Jt
YXR0aW5nQ29udGV4dC5tYXJnaW5Db2xsYXBzZSgpLmNvbGxhcHNlZFZlcnRpY2FsVmFsdWVzKGxh
eW91dEJveCwgbm9uQ29sbGFwc2VkTWFyZ2luKS5jb2xsYXBzZWRWYWx1ZXM7Ci0gICAgYXV0byB1
c2VkVmVydGljYWxNYXJnaW4gPSBjb2xsYXBzZWRNYXJnaW4uYmVmb3JlLnZhbHVlT3Iobm9uQ29s
bGFwc2VkTWFyZ2luLmJlZm9yZSk7Ci0gICAgdXNlZFZlcnRpY2FsTWFyZ2luICs9IGNvbGxhcHNl
ZE1hcmdpbi5pc0NvbGxhcHNlZFRocm91Z2ggPyBub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIgOiBj
b2xsYXBzZWRNYXJnaW4uYWZ0ZXIudmFsdWVPcihub25Db2xsYXBzZWRNYXJnaW4uYWZ0ZXIpOwot
ICAgIGJvZHlCb3hDb250ZW50SGVpZ2h0IC09IHVzZWRWZXJ0aWNhbE1hcmdpbjsKLSAgICAvLyBE
b2N1bWVudCBib3gncyBwYWRkaW5nIGFuZCBib3JkZXIgYWxzbyBzaHJpbmsgdGhlIGJvZHkgYm94
J3MgY29udGVudCBoZWlnaHQuCi0gICAgYXV0byYgZG9jdW1lbnRCb3ggPSBsYXlvdXRCb3gucGFy
ZW50KCk7Ci0gICAgYXV0byYgZG9jdW1lbnRCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0
Lmdlb21ldHJ5Rm9yQm94KGRvY3VtZW50Qm94LCBFc2NhcGVSZWFzb246OkJvZHlTdHJldGNoZXNU
b1ZpZXdwb3J0UXVpcmspOwotICAgIGJvZHlCb3hDb250ZW50SGVpZ2h0IC09IGRvY3VtZW50Qm94
R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGRvY3VtZW50Qm94R2VvbWV0cnkudmVydGljYWxQ
YWRkaW5nKCkudmFsdWVPcigwKTsKLSAgICAvLyBIb3dldmVyIHRoZSBub24taW4tZmxvdyBkb2N1
bWVudCBib3gncyB2ZXJ0aWNhbCBtYXJnaW5zIGFyZSBpZ25vcmVkLiBUaGV5IGRvbid0IGFmZmVj
dCB0aGUgYm9keSBib3gncyBjb250ZW50IGhlaWdodC4KLSAgICBpZiAoZG9jdW1lbnRCb3guaXNJ
bkZsb3coKSkgewotICAgICAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2VvbWV0cnkoKTsKLSAg
ICAgICAgYXV0byBwcmVjb21wdXRlRG9jdW1lbnRCb3hWZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5
LmNvbXB1dGVkVmVydGljYWxNYXJnaW4oZG9jdW1lbnRCb3gsIGdlb21ldHJ5LmNvbnN0cmFpbnRz
Rm9ySW5GbG93Q29udGVudChpbml0aWFsQ29udGFpbmluZ0Jsb2NrLCBFc2NhcGVSZWFzb246OkJv
ZHlTdHJldGNoZXNUb1ZpZXdwb3J0UXVpcmspLmhvcml6b250YWwpOwotICAgICAgICBib2R5Qm94
Q29udGVudEhlaWdodCAtPSBwcmVjb21wdXRlRG9jdW1lbnRCb3hWZXJ0aWNhbE1hcmdpbi5iZWZv
cmUudmFsdWVPcigwKSArIHByZWNvbXB1dGVEb2N1bWVudEJveFZlcnRpY2FsTWFyZ2luLmFmdGVy
LnZhbHVlT3IoMCk7Ci0gICAgfQotICAgIHJldHVybiBzdGQ6Om1heChjb250ZW50SGVpZ2h0QW5k
TWFyZ2luLmNvbnRlbnRIZWlnaHQsICBib2R5Qm94Q29udGVudEhlaWdodCk7Ci19Ci0KLWJvb2wg
QmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpzaG91bGRJZ25vcmVDb2xsYXBzZWRRdWly
a01hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAgICByZXR1cm4gbGF5b3V0
U3RhdGUoKS5pblF1aXJrc01vZGUoKSAmJiBpc1F1aXJrQ29udGFpbmVyKGxheW91dEJveCk7Ci19
Ci0KLWVudW0gY2xhc3MgVmVydGljYWxNYXJnaW4geyBCZWZvcmUsIEFmdGVyIH07Ci1zdGF0aWMg
aW5saW5lIGJvb2wgaGFzUXVpcmtNYXJnaW5Ub0NvbGxhcHNlKGNvbnN0IEJveCYgbGF5b3V0Qm94
LCBWZXJ0aWNhbE1hcmdpbiB2ZXJ0aWNhbE1hcmdpbikKLXsKLSAgICBpZiAoIWxheW91dEJveC5p
c0luRmxvdygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgYXV0byYgc3R5bGUgPSBsYXlv
dXRCb3guc3R5bGUoKTsKLSAgICByZXR1cm4gKHZlcnRpY2FsTWFyZ2luID09IFZlcnRpY2FsTWFy
Z2luOjpCZWZvcmUgJiYgc3R5bGUuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSkgfHwgKHZlcnRpY2Fs
TWFyZ2luID09IFZlcnRpY2FsTWFyZ2luOjpBZnRlciAmJiBzdHlsZS5oYXNNYXJnaW5BZnRlclF1
aXJrKCkpOwotfQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6c2hvdWxk
Q29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5
b3V0Qm94KSBjb25zdAotewotICAgIHJldHVybiBsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgp
ICYmIGhhc1F1aXJrTWFyZ2luVG9Db2xsYXBzZShsYXlvdXRCb3gsIFZlcnRpY2FsTWFyZ2luOjpC
ZWZvcmUpICYmIGlzUXVpcmtDb250YWluZXIobGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpKTsK
LX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OnNob3VsZENvbGxhcHNl
TWFyZ2luQWZ0ZXJXaXRoUGFyZW50TWFyZ2luQWZ0ZXIoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGxheW91dFN0YXRlKCkuaW5RdWlya3NNb2RlKCkgJiYgaGFzUXVp
cmtNYXJnaW5Ub0NvbGxhcHNlKGxheW91dEJveCwgVmVydGljYWxNYXJnaW46OkFmdGVyKSAmJiBp
c1F1aXJrQ29udGFpbmVyKGxheW91dEJveC5jb250YWluaW5nQmxvY2soKSk7Ci19Ci0KLX0KLX0K
LQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zvcm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zv
cm1hdHRpbmdTdGF0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NGE1MGZm
NjkxM2FkMTJhMDhkNTJlMzkwMjc1OTEwNzdmMjMzNWIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuY3BwCisrKyAvZGV2
L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwot
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIK
LSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9G
T1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgot
Ci1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNP
X0FMTE9DQVRFRF9JTVBMKEJsb2NrRm9ybWF0dGluZ1N0YXRlKTsKLQotQmxvY2tGb3JtYXR0aW5n
U3RhdGU6OkJsb2NrRm9ybWF0dGluZ1N0YXRlKFJlZjxGbG9hdGluZ1N0YXRlPiYmIGZsb2F0aW5n
U3RhdGUsIExheW91dFN0YXRlJiBsYXlvdXRTdGF0ZSkKLSAgICA6IEZvcm1hdHRpbmdTdGF0ZShX
VEZNb3ZlKGZsb2F0aW5nU3RhdGUpLCBUeXBlOjpCbG9jaywgbGF5b3V0U3RhdGUpCi17Ci19Ci0K
LUJsb2NrRm9ybWF0dGluZ1N0YXRlOjp+QmxvY2tGb3JtYXR0aW5nU3RhdGUoKQotewotfQotCi19
Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmggYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja0Zv
cm1hdHRpbmdTdGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTZjZDYxOWRk
MzE2ZjU5YjNmNDA5YmYzNWQ3MDk2ZDlmYjdjOGIxLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmgKKysrIC9kZXYvbnVs
bApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4g
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
ZS5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLSNpbmNsdWRlIDx3dGYvV2Vha0hhc2hT
ZXQuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLS8vIEJs
b2NrRm9ybWF0dGluZ1N0YXRlIGhvbGRzIHRoZSBzdGF0ZSBmb3IgYSBwYXJ0aWN1bGFyIGJsb2Nr
IGZvcm1hdHRpbmcgY29udGV4dCB0cmVlLgotY2xhc3MgQmxvY2tGb3JtYXR0aW5nU3RhdGUgOiBw
dWJsaWMgRm9ybWF0dGluZ1N0YXRlIHsKLSAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKEJsb2Nr
Rm9ybWF0dGluZ1N0YXRlKTsKLXB1YmxpYzoKLSAgICBCbG9ja0Zvcm1hdHRpbmdTdGF0ZShSZWY8
RmxvYXRpbmdTdGF0ZT4mJiwgTGF5b3V0U3RhdGUmKTsKLSAgICB+QmxvY2tGb3JtYXR0aW5nU3Rh
dGUoKTsKLQotICAgIHZvaWQgc2V0VXNlZFZlcnRpY2FsTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0
Qm94LCBjb25zdCBVc2VkVmVydGljYWxNYXJnaW4mIHVzZWRWZXJ0aWNhbE1hcmdpbikgeyBtX3Vz
ZWRWZXJ0aWNhbE1hcmdpbnMuc2V0KCZsYXlvdXRCb3gsIHVzZWRWZXJ0aWNhbE1hcmdpbik7IH0K
LSAgICBVc2VkVmVydGljYWxNYXJnaW4gdXNlZFZlcnRpY2FsTWFyZ2luKGNvbnN0IEJveCYgbGF5
b3V0Qm94KSBjb25zdCB7IHJldHVybiBtX3VzZWRWZXJ0aWNhbE1hcmdpbnMuZ2V0KCZsYXlvdXRC
b3gpOyB9Ci0gICAgYm9vbCBoYXNVc2VkVmVydGljYWxNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRC
b3gpIGNvbnN0IHsgcmV0dXJuIG1fdXNlZFZlcnRpY2FsTWFyZ2lucy5jb250YWlucygmbGF5b3V0
Qm94KTsgfQotCi0gICAgdm9pZCBzZXRIYXNDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gp
IHsgbV9jbGVhcmFuY2VTZXQuYWRkKGxheW91dEJveCk7IH0KLSAgICB2b2lkIGNsZWFySGFzQ2xl
YXJhbmNlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSB7IG1fY2xlYXJhbmNlU2V0LnJlbW92ZShsYXlv
dXRCb3gpOyB9Ci0gICAgYm9vbCBoYXNDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNv
bnN0IHsgcmV0dXJuIG1fY2xlYXJhbmNlU2V0LmNvbnRhaW5zKGxheW91dEJveCk7IH0KLQotcHJp
dmF0ZToKLSAgICBIYXNoTWFwPGNvbnN0IEJveCosIFVzZWRWZXJ0aWNhbE1hcmdpbj4gbV91c2Vk
VmVydGljYWxNYXJnaW5zOwotICAgIFdlYWtIYXNoU2V0PGNvbnN0IEJveD4gbV9jbGVhcmFuY2VT
ZXQ7Ci19OwotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJ
TkdfU1RBVEUoQmxvY2tGb3JtYXR0aW5nU3RhdGUsIGlzQmxvY2tGb3JtYXR0aW5nU3RhdGUoKSkK
LQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2Jsb2NrZm9ybWF0dGluZy9CbG9ja01hcmdpbkNvbGxhcHNlLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrTWFy
Z2luQ29sbGFwc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZkNWJiZTIy
YTFhYjkyZTg1MWQ4NTBkZTBmNGE2YWQxODcxMGRiLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCisrKyAvZGV2L251
bGwKQEAgLTEsNjA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5j
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
I2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3Rh
dGUuaCIKLSNpbmNsdWRlICJMYXlvdXRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJC
b3guaCIKLSNpbmNsdWRlICJMYXlvdXRVbml0LmgiCi0jaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIK
LQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLXN0YXRpYyBib29s
IGhhc0JvcmRlcihjb25zdCBCb3JkZXJWYWx1ZSYgYm9yZGVyVmFsdWUpCi17Ci0gICAgaWYgKGJv
cmRlclZhbHVlLnN0eWxlKCkgPT0gQm9yZGVyU3R5bGU6Ok5vbmUgfHwgYm9yZGVyVmFsdWUuc3R5
bGUoKSA9PSBCb3JkZXJTdHlsZTo6SGlkZGVuKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
cmV0dXJuICEhYm9yZGVyVmFsdWUud2lkdGgoKTsKLX0KLQotc3RhdGljIGJvb2wgaGFzUGFkZGlu
Zyhjb25zdCBMZW5ndGgmIHBhZGRpbmdWYWx1ZSkKLXsKLSAgICAvLyBGSVhNRTogQ2hlY2sgaWYg
cGVyY2VudCB2YWx1ZSBuZWVkcyB0byBiZSByZXNvbHZlZC4KLSAgICByZXR1cm4gIXBhZGRpbmdW
YWx1ZS5pc1plcm8oKTsKLX0KLQotc3RhdGljIGJvb2wgaGFzQm9yZGVyQmVmb3JlKGNvbnN0IEJv
eCYgbGF5b3V0Qm94KQotewotICAgIHJldHVybiBoYXNCb3JkZXIobGF5b3V0Qm94LnN0eWxlKCku
Ym9yZGVyQmVmb3JlKCkpOwotfQotCi1zdGF0aWMgYm9vbCBoYXNCb3JkZXJBZnRlcihjb25zdCBC
b3gmIGxheW91dEJveCkKLXsKLSAgICByZXR1cm4gaGFzQm9yZGVyKGxheW91dEJveC5zdHlsZSgp
LmJvcmRlckFmdGVyKCkpOwotfQotCi1zdGF0aWMgYm9vbCBoYXNQYWRkaW5nQmVmb3JlKGNvbnN0
IEJveCYgbGF5b3V0Qm94KQotewotICAgIHJldHVybiBoYXNQYWRkaW5nKGxheW91dEJveC5zdHls
ZSgpLnBhZGRpbmdCZWZvcmUoKSk7Ci19Ci0KLXN0YXRpYyBib29sIGhhc1BhZGRpbmdBZnRlcihj
b25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICByZXR1cm4gaGFzUGFkZGluZyhsYXlvdXRCb3gu
c3R5bGUoKS5wYWRkaW5nQWZ0ZXIoKSk7Ci19Ci0KLXN0YXRpYyBib29sIGVzdGFibGlzaGVzQmxv
Y2tGb3JtYXR0aW5nQ29udGV4dChjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICAvLyBXZWJL
aXQgdHJlYXRzIHRoZSBkb2N1bWVudCBlbGVtZW50IHJlbmRlcmVyIGFzIGEgYmxvY2sgZm9ybWF0
dGluZyBjb250ZXh0IHJvb3QuIEl0IHByb2JhYmx5IG9ubHkgaW1wYWN0cyBtYXJnaW4gY29sbGFw
c2luZywgc28gbGV0J3Mgbm90IGRvCi0gICAgLy8gYSBsYXlvdXQgd2lkZSBxdWlyayBvbiB0aGlz
IGZvciBub3cuCi0gICAgaWYgKGxheW91dEJveC5pc0RvY3VtZW50Qm94KCkpCi0gICAgICAgIHJl
dHVybiB0cnVlOwotICAgIHJldHVybiBsYXlvdXRCb3guZXN0YWJsaXNoZXNCbG9ja0Zvcm1hdHRp
bmdDb250ZXh0KCk7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29s
bGFwc2U6Omhhc0NsZWFyYW5jZShjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAgICBp
ZiAoIWxheW91dEJveC5oYXNGbG9hdENsZWFyKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAvLyBGSVhNRTogcHJlY29tcHV0ZWRWZXJ0aWNhbFBvc2l0aW9uRm9yRm9ybWF0dGluZ1Jvb3Qg
bG9naWMgZW5kcyB1cCBjYWxsaW5nIGludG8gdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBsYXlvdXRC
b3ggKGZpcnN0IGluZmxvdyBjaGlsZCkgaGFzCi0gICAgLy8gbm90IGJlZW4gbGFpZCBvdXQuCi0g
ICAgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkuZm9ybWF0dGluZ1N0YXRlKCkuaGFzQ2xlYXJh
bmNlKGxheW91dEJveCk7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2lu
Q29sbGFwc2U6Om1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5BZnRlcihjb25z
dCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAgICAvLyAxLiBUaGlzIGlzIHRoZSBsYXN0IGlu
LWZsb3cgY2hpbGQgYW5kIGl0cyBtYXJnaW5zIGNvbGxhcHNlIHRocm91Z2ggYW5kIHRoZSBtYXJn
aW4gYWZ0ZXIgY29sbGFwc2VzIHdpdGggcGFyZW50J3MgbWFyZ2luIGFmdGVyIG9yCi0gICAgLy8g
Mi4gVGhpcyBib3gncyBtYXJnaW4gYWZ0ZXIgY29sbGFwc2VzIHdpdGggdGhlIG5leHQgc2libGlu
ZydzIG1hcmdpbiBiZWZvcmUgYW5kIHRoYXQgc2libGluZyBjb2xsYXBzZXMgdGhyb3VnaCBhbmQK
LSAgICAvLyB3ZSBjYW4gZ2V0IHRvIHRoZSBsYXN0IGluLWZsb3cgY2hpbGQgbGlrZSB0aGF0Lgot
ICAgIGF1dG8qIGxhc3RJbkZsb3dDaGlsZCA9IGxheW91dEJveC5jb250YWluaW5nQmxvY2soKS5s
YXN0SW5GbG93Q2hpbGQoKTsKLSAgICBmb3IgKGF1dG8qIGN1cnJlbnRCb3ggPSAmbGF5b3V0Qm94
OyBjdXJyZW50Qm94OyBjdXJyZW50Qm94ID0gY3VycmVudEJveC0+bmV4dEluRmxvd1NpYmxpbmco
KSkgewotICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKmN1cnJlbnRCb3gpKQot
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoY3VycmVudEJveCA9PSBsYXN0
SW5GbG93Q2hpbGQpCi0gICAgICAgICAgICByZXR1cm4gbWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRo
UGFyZW50TWFyZ2luQWZ0ZXIoKmN1cnJlbnRCb3gpOyAKLSAgICAgICAgaWYgKCFtYXJnaW5BZnRl
ckNvbGxhcHNlc1dpdGhOZXh0U2libGluZ01hcmdpbkJlZm9yZSgqY3VycmVudEJveCkpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwot
ICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJn
aW5Db2xsYXBzZTo6bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShj
b25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAgICAvLyBUaGUgZmlyc3QgaW5mbG93IGNo
aWxkIGNvdWxkIHByb3BhZ2F0ZSBpdHMgdG9wIG1hcmdpbiB0byBwYXJlbnQuCi0gICAgLy8gaHR0
cHM6Ly93d3cudzMub3JnL1RSL0NTUzIxL2JveC5odG1sI2NvbGxhcHNpbmctbWFyZ2lucwotICAg
IEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwotCi0gICAgaWYgKGZvcm1hdHRp
bmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoUGFyZW50
TWFyZ2luQmVmb3JlKGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8g
TWFyZ2lucyBiZXR3ZWVuIGEgZmxvYXRlZCBib3ggYW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNv
bGxhcHNlLgotICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9u
ZWQgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgotICAgIGlmIChsYXlvdXRCb3guaXNPdXRPZkZsb3dQ
b3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIE1hcmdpbnMgb2Yg
aW5saW5lLWJsb2NrIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KLSAgICBpZiAobGF5b3V0Qm94Lmlz
SW5saW5lQmxvY2tCb3goKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gT25seSB0
aGUgZmlyc3QgaW5sZmxvdyBjaGlsZCBjb2xsYXBzZXMgd2l0aCBwYXJlbnQuCi0gICAgaWYgKGxh
eW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgYXV0byYgY29udGFpbmluZ0Jsb2NrID0gbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygp
OwotICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMgdGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZv
cm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxhcHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGls
ZHJlbgotICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmlu
Z0Jsb2NrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGhhc0JvcmRlckJlZm9y
ZShjb250YWluaW5nQmxvY2spKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoaGFz
UGFkZGluZ0JlZm9yZShjb250YWluaW5nQmxvY2spKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAvLyAuLi5hbmQgdGhlIGNoaWxkIGhhcyBubyBjbGVhcmFuY2UuCi0gICAgaWYgKGhhc0Ns
ZWFyYW5jZShsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6
bWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKGNvbnN0
IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xl
dmVsQm94KCkpOwotCi0gICAgaWYgKCFsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGF1dG8mIHByZXZpb3VzSW5GbG93U2libGlu
ZyA9ICpsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7Ci0gICAgLy8gTWFyZ2lucyBi
ZXR3ZWVuIGEgZmxvYXRlZCBib3ggYW5kIGFueSBvdGhlciBib3ggZG8gbm90IGNvbGxhcHNlLgot
ICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSB8fCBwcmV2aW91c0luRmxv
d1NpYmxpbmcuaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgLy8gTWFyZ2lucyBvZiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYm94ZXMgZG8gbm90IGNv
bGxhcHNlLgotICAgIGlmICgobGF5b3V0Qm94LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFs
YXlvdXRCb3guc3R5bGUoKS50b3AoKS5pc0F1dG8oKSkKLSAgICAgICAgfHwgKHByZXZpb3VzSW5G
bG93U2libGluZy5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhcHJldmlvdXNJbkZsb3dTaWJs
aW5nLnN0eWxlKCkuYm90dG9tKCkuaXNBdXRvKCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCi0g
ICAgaWYgKGxheW91dEJveC5pc0lubGluZUJsb2NrQm94KCkgfHwgcHJldmlvdXNJbkZsb3dTaWJs
aW5nLmlzSW5saW5lQmxvY2tCb3goKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8g
VGhlIGJvdHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jay1sZXZlbCBlbGVtZW50IGFsd2F5
cyBjb2xsYXBzZXMgd2l0aCB0aGUgdG9wIG1hcmdpbiBvZgotICAgIC8vIGl0cyBuZXh0IGluLWZs
b3cgYmxvY2stbGV2ZWwgc2libGluZywgdW5sZXNzIHRoYXQgc2libGluZyBoYXMgY2xlYXJhbmNl
LgotICAgIGlmIChoYXNDbGVhcmFuY2UobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6
TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxk
TWFyZ2luQmVmb3JlKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChs
YXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwotICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMg
dGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxh
cHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJlbi4KLSAgICBpZiAoZXN0YWJsaXNoZXNCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0KGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIC8vIFRoZSB0b3AgbWFyZ2luIG9mIGFuIGluLWZsb3cgYmxvY2sgZWxlbWVudCBjb2xsYXBz
ZXMgd2l0aCBpdHMgZmlyc3QgaW4tZmxvdyBibG9jay1sZXZlbAotICAgIC8vIGNoaWxkJ3MgdG9w
IG1hcmdpbiBpZiB0aGUgZWxlbWVudCBoYXMgbm8gdG9wIGJvcmRlci4uLgotICAgIGlmIChoYXNC
b3JkZXJCZWZvcmUobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8g
Li4ubm8gdG9wIHBhZGRpbmcKLSAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShsYXlvdXRCb3gpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIWlzPENvbnRhaW5lckJveD4obGF5b3V0
Qm94KSB8fCAhZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmhhc0luRmxvd0NoaWxk
KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGF1dG8mIGZpcnN0SW5GbG93Q2hpbGQg
PSAqZG93bmNhc3Q8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpLmZpcnN0SW5GbG93Q2hpbGQoKTsK
LSAgICBpZiAoIWZpcnN0SW5GbG93Q2hpbGQuaXNCbG9ja0xldmVsQm94KCkpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIC8vIC4uLmFuZCB0aGUgY2hpbGQgaGFzIG5vIGNsZWFyYW5jZS4K
LSAgICBpZiAoaGFzQ2xlYXJhbmNlKGZpcnN0SW5GbG93Q2hpbGQpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5zIG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29s
bGFwc2UuCi0gICAgaWYgKGZpcnN0SW5GbG93Q2hpbGQuaXNJbmxpbmVCbG9ja0JveCgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBCbG9ja0Zv
cm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRo
U2libGluZ01hcmdpbkJlZm9yZVdpdGhDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNv
bnN0Ci17Ci0gICAgLy8gSWYgdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgb2YgYW4gZWxlbWVu
dCB3aXRoIGNsZWFyYW5jZSBhcmUgYWRqb2luaW5nLCBpdHMgbWFyZ2lucyBjb2xsYXBzZSB3aXRo
IHRoZSBhZGpvaW5pbmcgbWFyZ2lucwotICAgIC8vIG9mIGZvbGxvd2luZyBzaWJsaW5ncyBidXQg
dGhhdCByZXN1bHRpbmcgbWFyZ2luIGRvZXMgbm90IGNvbGxhcHNlIHdpdGggdGhlIGJvdHRvbSBt
YXJnaW4gb2YgdGhlIHBhcmVudCBibG9jay4KLSAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91
Z2gobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yIChhdXRvKiBw
cmV2aW91c1NpYmxpbmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCk7IHByZXZp
b3VzU2libGluZzsgcHJldmlvdXNTaWJsaW5nID0gcHJldmlvdXNTaWJsaW5nLT5wcmV2aW91c0lu
Rmxvd1NpYmxpbmcoKSkgewotICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2goKnBy
ZXZpb3VzU2libGluZykpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICho
YXNDbGVhcmFuY2UoKnByZXZpb3VzU2libGluZykpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQ6Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5C
ZWZvcmUoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgLy8gMS4gVGhpcyBpcyB0
aGUgZmlyc3QgaW4tZmxvdyBjaGlsZCBhbmQgaXRzIG1hcmdpbnMgY29sbGFwc2UgdGhyb3VnaCBh
bmQgdGhlIG1hcmdpbiBiZWZvcmUgY29sbGFwc2VzIHdpdGggcGFyZW50J3MgbWFyZ2luIGJlZm9y
ZSBvcgotICAgIC8vIDIuIFRoaXMgYm94J3MgbWFyZ2luIGJlZm9yZSBjb2xsYXBzZXMgd2l0aCB0
aGUgcHJldmlvdXMgc2libGluZydzIG1hcmdpbiBhZnRlciBhbmQgdGhhdCBzaWJsaW5nIGNvbGxh
cHNlcyB0aHJvdWdoIGFuZAotICAgIC8vIHdlIGNhbiBnZXQgdG8gdGhlIGZpcnN0IGluLWZsb3cg
Y2hpbGQgbGlrZSB0aGF0LgotICAgIGF1dG8qIGZpcnN0SW5GbG93Q2hpbGQgPSBsYXlvdXRCb3gu
Y29udGFpbmluZ0Jsb2NrKCkuZmlyc3RJbkZsb3dDaGlsZCgpOwotICAgIGZvciAoYXV0byogY3Vy
cmVudEJveCA9ICZsYXlvdXRCb3g7IGN1cnJlbnRCb3g7IGN1cnJlbnRCb3ggPSBjdXJyZW50Qm94
LT5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSkgewotICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBz
ZVRocm91Z2goKmN1cnJlbnRCb3gpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICBpZiAoY3VycmVudEJveCA9PSBmaXJzdEluRmxvd0NoaWxkKQotICAgICAgICAgICAgcmV0dXJu
IG1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQYXJlbnRNYXJnaW5CZWZvcmUoKmN1cnJlbnRCb3gp
OyAKLSAgICAgICAgaWYgKCFtYXJnaW5CZWZvcmVDb2xsYXBzZXNXaXRoUHJldmlvdXNTaWJsaW5n
TWFyZ2luQWZ0ZXIoKmN1cnJlbnRCb3gpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IH0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJv
b2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkFmdGVyQ29s
bGFwc2VzV2l0aFBhcmVudE1hcmdpbkFmdGVyKGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAot
ewotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwotCi0gICAgaWYgKGZv
cm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhQ
YXJlbnRNYXJnaW5BZnRlcihsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAg
IC8vIE1hcmdpbnMgYmV0d2VlbiBhIGZsb2F0ZWQgYm94IGFuZCBhbnkgb3RoZXIgYm94IGRvIG5v
dCBjb2xsYXBzZS4KLSAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIE1hcmdpbnMgb2YgYWJzb2x1dGVseSBwb3Np
dGlvbmVkIGJveGVzIGRvIG5vdCBjb2xsYXBzZS4KLSAgICBpZiAobGF5b3V0Qm94LmlzT3V0T2ZG
bG93UG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBNYXJnaW5z
IG9mIGlubGluZS1ibG9jayBib3hlcyBkbyBub3QgY29sbGFwc2UuCi0gICAgaWYgKGxheW91dEJv
eC5pc0lubGluZUJsb2NrQm94KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIE9u
bHkgdGhlIGxhc3QgaW5sZmxvdyBjaGlsZCBjb2xsYXBzZXMgd2l0aCBwYXJlbnQuCi0gICAgaWYg
KGxheW91dEJveC5uZXh0SW5GbG93U2libGluZygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBhdXRvJiBjb250YWluaW5nQmxvY2sgPSBsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCk7
Ci0gICAgLy8gTWFyZ2lucyBvZiBlbGVtZW50cyB0aGF0IGVzdGFibGlzaCBuZXcgYmxvY2sgZm9y
bWF0dGluZyBjb250ZXh0cyBkbyBub3QgY29sbGFwc2Ugd2l0aCB0aGVpciBpbi1mbG93IGNoaWxk
cmVuLgotICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29udGFpbmlu
Z0Jsb2NrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gVGhlIGJvdHRvbSBtYXJn
aW4gb2YgYW4gaW4tZmxvdyBibG9jayBib3ggd2l0aCBhICdoZWlnaHQnIG9mICdhdXRvJyBjb2xs
YXBzZXMgd2l0aCBpdHMgbGFzdCBpbi1mbG93IGJsb2NrLWxldmVsIGNoaWxkJ3MgYm90dG9tIG1h
cmdpbiwgaWY6Ci0gICAgaWYgKCFjb250YWluaW5nQmxvY2suc3R5bGUoKS5oZWlnaHQoKS5pc0F1
dG8oKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gdGhlIGJveCBoYXMgbm8gYm90
dG9tIHBhZGRpbmcsIGFuZAotICAgIGlmIChoYXNQYWRkaW5nQWZ0ZXIoY29udGFpbmluZ0Jsb2Nr
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9t
IGJvcmRlciwgYW5kCi0gICAgaWYgKGhhc0JvcmRlckFmdGVyKGNvbnRhaW5pbmdCbG9jaykpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4g
bmVpdGhlciBjb2xsYXBzZXMgd2l0aCBhIHRvcCBtYXJnaW4gdGhhdCBoYXMgY2xlYXJhbmNlLi4u
Ci0gICAgaWYgKG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRo
Q2xlYXJhbmNlKGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIG5v
ciAoaWYgdGhlIGJveCdzIG1pbi1oZWlnaHQgaXMgbm9uLXplcm8pIHdpdGggdGhlIGJveCdzIHRv
cCBtYXJnaW4uCi0gICAgYXV0byBjb21wdXRlZE1pbkhlaWdodCA9IGNvbnRhaW5pbmdCbG9jay5z
dHlsZSgpLmxvZ2ljYWxNaW5IZWlnaHQoKTsKLSAgICBpZiAoIWNvbXB1dGVkTWluSGVpZ2h0Lmlz
QXV0bygpICYmIGNvbXB1dGVkTWluSGVpZ2h0LnZhbHVlKCkgJiYgbWFyZ2luQWZ0ZXJDb2xsYXBz
ZXNXaXRoUGFyZW50TWFyZ2luQmVmb3JlKGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6
Ok1hcmdpbkNvbGxhcHNlOjptYXJnaW5BZnRlckNvbGxhcHNlc1dpdGhMYXN0SW5GbG93Q2hpbGRN
YXJnaW5BZnRlcihjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QKLXsKLSAgICBBU1NFUlQobGF5
b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLQotICAgIC8vIE1hcmdpbnMgb2YgZWxlbWVudHMg
dGhhdCBlc3RhYmxpc2ggbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dHMgZG8gbm90IGNvbGxh
cHNlIHdpdGggdGhlaXIgaW4tZmxvdyBjaGlsZHJlbi4KLSAgICBpZiAoZXN0YWJsaXNoZXNCbG9j
a0Zvcm1hdHRpbmdDb250ZXh0KGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIGlmICghaXM8Q29udGFpbmVyQm94PihsYXlvdXRCb3gpIHx8ICFkb3duY2FzdDxDb250YWlu
ZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgYXV0byYgbGFzdEluRmxvd0NoaWxkID0gKmRvd25jYXN0PENvbnRhaW5lckJveD4o
bGF5b3V0Qm94KS5sYXN0SW5GbG93Q2hpbGQoKTsKLSAgICBpZiAoIWxhc3RJbkZsb3dDaGlsZC5p
c0Jsb2NrTGV2ZWxCb3goKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gVGhlIGJv
dHRvbSBtYXJnaW4gb2YgYW4gaW4tZmxvdyBibG9jayBib3ggd2l0aCBhICdoZWlnaHQnIG9mICdh
dXRvJyBjb2xsYXBzZXMgd2l0aCBpdHMgbGFzdCBpbi1mbG93IGJsb2NrLWxldmVsIGNoaWxkJ3Mg
Ym90dG9tIG1hcmdpbiwgaWY6Ci0gICAgaWYgKCFsYXlvdXRCb3guc3R5bGUoKS5oZWlnaHQoKS5p
c0F1dG8oKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gdGhlIGJveCBoYXMgbm8g
Ym90dG9tIHBhZGRpbmcsIGFuZAotICAgIGlmIChoYXNQYWRkaW5nQWZ0ZXIobGF5b3V0Qm94KSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gdGhlIGJveCBoYXMgbm8gYm90dG9tIGJv
cmRlciwgYW5kCi0gICAgaWYgKGhhc0JvcmRlckFmdGVyKGxheW91dEJveCkpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIC8vIHRoZSBjaGlsZCdzIGJvdHRvbSBtYXJnaW4gbmVpdGhlciBj
b2xsYXBzZXMgd2l0aCBhIHRvcCBtYXJnaW4gdGhhdCBoYXMgY2xlYXJhbmNlLi4uCi0gICAgaWYg
KG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFNpYmxpbmdNYXJnaW5CZWZvcmVXaXRoQ2xlYXJhbmNl
KGxhc3RJbkZsb3dDaGlsZCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIG5vciAo
aWYgdGhlIGJveCdzIG1pbi1oZWlnaHQgaXMgbm9uLXplcm8pIHdpdGggdGhlIGJveCdzIHRvcCBt
YXJnaW4uCi0gICAgYXV0byBjb21wdXRlZE1pbkhlaWdodCA9IGxheW91dEJveC5zdHlsZSgpLmxv
Z2ljYWxNaW5IZWlnaHQoKTsKLSAgICBpZiAoIWNvbXB1dGVkTWluSGVpZ2h0LmlzQXV0bygpICYm
IGNvbXB1dGVkTWluSGVpZ2h0LnZhbHVlKCkKLSAgICAgICAgJiYgKG1hcmdpbkFmdGVyQ29sbGFw
c2VzV2l0aFBhcmVudE1hcmdpbkJlZm9yZShsYXN0SW5GbG93Q2hpbGQpIHx8IGhhc0NsZWFyYW5j
ZShsYXN0SW5GbG93Q2hpbGQpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gTWFy
Z2lucyBvZiBpbmxpbmUtYmxvY2sgYm94ZXMgZG8gbm90IGNvbGxhcHNlLgotICAgIGlmIChsYXN0
SW5GbG93Q2hpbGQuaXNJbmxpbmVCbG9ja0JveCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAvLyBUaGlzIGlzIGEgcXVpcmsgYmVoYXZpb3I6IFdoZW4gdGhlIG1hcmdpbiBhZnRlciBv
ZiB0aGUgbGFzdCBpbmZsb3cgY2hpbGQgKG9yIGEgcHJldmlvdXMgc2libGluZyB3aXRoIGNvbGxh
cHNlZCB0aHJvdWdoIG1hcmdpbnMpCi0gICAgLy8gY29sbGFwc2VzIHdpdGggYSBxdWlyayBwYXJl
bnQncyB0aGUgbWFyZ2luIGJlZm9yZSwgdGhlbiB0aGUgc2FtZSBtYXJnaW4gYWZ0ZXIgZG9lcyBu
b3QgY29sbGFwc2VzIHdpdGggdGhlIHBhcmVudCdzIG1hcmdpbiBhZnRlci4KLSAgICBpZiAoZm9y
bWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdp
bihsYXlvdXRCb3gpICYmIG1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aFBhcmVudE1hcmdpbkJlZm9y
ZShsYXN0SW5GbG93Q2hpbGQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotYm9vbCBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6
bWFyZ2luQWZ0ZXJDb2xsYXBzZXNXaXRoTmV4dFNpYmxpbmdNYXJnaW5CZWZvcmUoY29uc3QgQm94
JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxC
b3goKSk7Ci0KLSAgICBpZiAoIWxheW91dEJveC5uZXh0SW5GbG93U2libGluZygpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFBy
ZXZpb3VzU2libGluZ01hcmdpbkFmdGVyKCpsYXlvdXRCb3gubmV4dEluRmxvd1NpYmxpbmcoKSk7
Ci19Ci0KLWJvb2wgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdp
bnNDb2xsYXBzZVRocm91Z2goY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNT
RVJUKGxheW91dEJveC5pc0Jsb2NrTGV2ZWxCb3goKSk7Ci0KLSAgICAvLyBBIGJveCdzIG93biBt
YXJnaW5zIGNvbGxhcHNlIGlmIHRoZSAnbWluLWhlaWdodCcgcHJvcGVydHkgaXMgemVybywgYW5k
IGl0IGhhcyBuZWl0aGVyIHRvcCBvciBib3R0b20gYm9yZGVycyBub3IgdG9wIG9yIGJvdHRvbSBw
YWRkaW5nLAotICAgIC8vIGFuZCBpdCBoYXMgYSAnaGVpZ2h0JyBvZiBlaXRoZXIgMCBvciAnYXV0
bycsIGFuZCBpdCBkb2VzIG5vdCBjb250YWluIGEgbGluZSBib3gsIGFuZCBhbGwgb2YgaXRzIGlu
LWZsb3cgY2hpbGRyZW4ncyBtYXJnaW5zIChpZiBhbnkpIGNvbGxhcHNlLgotICAgIGlmIChoYXNC
b3JkZXJCZWZvcmUobGF5b3V0Qm94KSB8fCBoYXNCb3JkZXJBZnRlcihsYXlvdXRCb3gpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoaGFzUGFkZGluZ0JlZm9yZShsYXlvdXRCb3gp
IHx8IGhhc1BhZGRpbmdBZnRlcihsYXlvdXRCb3gpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAvLyBNYXJnaW5zIGFyZSBub3QgYWRqb2luaW5nIHdoZW4gdGhlIGJveCBoYXMgY2xlYXJh
bmNlLgotICAgIGlmIChoYXNDbGVhcmFuY2UobGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICBhdXRvIGNv
bXB1dGVkSGVpZ2h0VmFsdWVJc1plcm8gPSBzdHlsZS5oZWlnaHQoKS5pc0ZpeGVkKCkgJiYgIXN0
eWxlLmhlaWdodCgpLnZhbHVlKCk7Ci0gICAgaWYgKCEoc3R5bGUuaGVpZ2h0KCkuaXNBdXRvKCkg
fHwgY29tcHV0ZWRIZWlnaHRWYWx1ZUlzWmVybykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIC8vIEZJWE1FOiBDaGVjayBmb3IgY29tcHV0ZWQgMCBoZWlnaHQuCi0gICAgaWYgKCFzdHls
ZS5taW5IZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8g
RklYTUU6IEJsb2NrIHJlcGxhY2VkIGJveGVzIGNsZWFybHkgZG9uJ3QgY29sbGFwc2UgdGhyb3Vn
aCB0aGVpciBtYXJnaW5zLCBidXQgSSBjb3VsZG4ndCBmaW5kIGl0IGluIHRoZSBzcGVjIHlldCAo
YW5kIG5vLCBpdCdzIG5vdCBhIHF1aXJrKS4KLSAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRC
b3goKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFpczxDb250YWluZXJCb3g+
KGxheW91dEJveCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKCFkb3duY2FzdDxD
b250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93Q2hpbGQoKSkKLSAgICAgICAgcmV0dXJu
ICFlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQobGF5b3V0Qm94KTsKLQotICAgIGlm
IChsYXlvdXRCb3guZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAgICAgIGlm
IChsYXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKSB7Ci0gICAg
ICAgICAgICBhdXRvJiBsYXlvdXRTdGF0ZSA9IHRoaXMtPmxheW91dFN0YXRlKCk7Ci0gICAgICAg
ICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB0aHJvdWdoIG1hcmdpbiBlc3RpbWF0aW9uLCB3ZSBkb24n
dCBuZWNlc3NhcmlseSBoYXZlIGFuIGFjdHVhbCBzdGF0ZSBmb3IgdGhpcyBsYXlvdXQgYm94IHNp
bmNlCi0gICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHN0YXJ0ZWQgbGF5aW5nIGl0IG91dCB5ZXQu
Ci0gICAgICAgICAgICBhdXRvJiBjb250YWluZXJCb3ggPSBkb3duY2FzdDxDb250YWluZXJCb3g+
KGxheW91dEJveCk7Ci0gICAgICAgICAgICBpZiAoIWxheW91dFN0YXRlLmhhc0lubGluZUZvcm1h
dHRpbmdTdGF0ZShjb250YWluZXJCb3gpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgICAgICAgICAgYXV0byBpc0NvbnNpZGVyZWRFbXB0eSA9IFsmXSB7Ci0gICAgICAgICAg
ICAgICAgYXV0byYgaW5saW5lRm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUuZXN0YWJsaXNo
ZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUoY29udGFpbmVyQm94KTsKLSAgICAgICAgICAgICAgICBp
ZiAoIWlubGluZUZvcm1hdHRpbmdTdGF0ZS5saW5lcygpLmlzRW1wdHkoKSkKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIC8vIEFueSBmbG9hdCBib3gg
aW4gdGhpcyBmb3JtYXR0aW5nIGNvbnRleHQgcHJldmVudHMgY29sbGFwc2luZyB0aHJvdWdoLgot
ICAgICAgICAgICAgICAgIGF1dG8mIGZsb2F0cyA9IGlubGluZUZvcm1hdHRpbmdTdGF0ZS5mbG9h
dGluZ1N0YXRlKCkuZmxvYXRzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChhdXRvJiBmbG9hdEl0
ZW0gOiBmbG9hdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZsb2F0SXRlbS5pc0luRm9y
bWF0dGluZ0NvbnRleHRPZihjb250YWluZXJCb3gpKQotICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICByZXR1cm4gaXNDb25zaWRlcmVkRW1w
dHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEEgcm9vdCBvZiBhIG5vbi1pbmxpbmUgZm9y
bWF0dGluZyBjb250ZXh0ICh0YWJsZSwgZmxleCBldGMpIHdpdGggaW5mbG93IGRlc2NlbmRhbnRz
IHNob3VsZCBub3QgY29sbGFwc2UgdGhyb3VnaC4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IH0KLQotICAgIGZvciAoYXV0byogaW5mbG93Q2hpbGQgPSBkb3duY2FzdDxDb250YWluZXJCb3g+
KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsgaW5mbG93Q2hpbGQ7IGlu
Zmxvd0NoaWxkID0gaW5mbG93Q2hpbGQtPm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7
Ci0gICAgICAgIGlmIChlc3RhYmxpc2hlc0Jsb2NrRm9ybWF0dGluZ0NvbnRleHQoKmluZmxvd0No
aWxkKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCFtYXJnaW5zQ29s
bGFwc2VUaHJvdWdoKCppbmZsb3dDaGlsZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1Vc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZl
QW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29s
bGFwc2U6OmNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihVc2VkVmVydGljYWxNYXJn
aW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgYSwgVXNlZFZlcnRpY2FsTWFyZ2lu
OjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIGIpIGNvbnN0Ci17Ci0gICAgVXNlZFZl
cnRpY2FsTWFyZ2luOjpQb3NpdGl2ZUFuZE5lZ2F0aXZlUGFpcjo6VmFsdWVzIGNvbXB1dGVkVmFs
dWVzOwotICAgIGlmIChhLnBvc2l0aXZlICYmIGIucG9zaXRpdmUpCi0gICAgICAgIGNvbXB1dGVk
VmFsdWVzLnBvc2l0aXZlID0gc3RkOjptYXgoKmEucG9zaXRpdmUsICpiLnBvc2l0aXZlKTsKLSAg
ICBlbHNlCi0gICAgICAgIGNvbXB1dGVkVmFsdWVzLnBvc2l0aXZlID0gYS5wb3NpdGl2ZSA/IGEu
cG9zaXRpdmUgOiBiLnBvc2l0aXZlOwotCi0gICAgaWYgKGEubmVnYXRpdmUgJiYgYi5uZWdhdGl2
ZSkKLSAgICAgICAgY29tcHV0ZWRWYWx1ZXMubmVnYXRpdmUgPSBzdGQ6Om1pbigqYS5uZWdhdGl2
ZSwgKmIubmVnYXRpdmUpOwotICAgIGVsc2UKLSAgICAgICAgY29tcHV0ZWRWYWx1ZXMubmVnYXRp
dmUgPSBhLm5lZ2F0aXZlID8gYS5uZWdhdGl2ZSA6IGIubmVnYXRpdmU7Ci0KLSAgICBpZiAoYS5p
c05vblplcm8oKSAmJiBiLmlzTm9uWmVybygpKQotICAgICAgICBjb21wdXRlZFZhbHVlcy5pc1F1
aXJrID0gYS5pc1F1aXJrIHx8IGIuaXNRdWlyazsKLSAgICBlbHNlIGlmIChhLmlzTm9uWmVybygp
KQotICAgICAgICBjb21wdXRlZFZhbHVlcy5pc1F1aXJrID0gYS5pc1F1aXJrOwotICAgIGVsc2UK
LSAgICAgICAgY29tcHV0ZWRWYWx1ZXMuaXNRdWlyayA9IGIuaXNRdWlyazsKLQotICAgIHJldHVy
biBjb21wdXRlZFZhbHVlczsKLX0KLQotT3B0aW9uYWw8TGF5b3V0VW5pdD4gQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpblZhbHVlKFVzZWRWZXJ0aWNhbE1hcmdp
bjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBtYXJnaW5WYWx1ZXMpIGNvbnN0Ci17
Ci0gICAgLy8gV2hlbiB0d28gb3IgbW9yZSBtYXJnaW5zIGNvbGxhcHNlLCB0aGUgcmVzdWx0aW5n
IG1hcmdpbiB3aWR0aCBpcyB0aGUgbWF4aW11bSBvZiB0aGUgY29sbGFwc2luZyBtYXJnaW5zJyB3
aWR0aHMuCi0gICAgLy8gSW4gdGhlIGNhc2Ugb2YgbmVnYXRpdmUgbWFyZ2lucywgdGhlIG1heGlt
dW0gb2YgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgbmVnYXRpdmUgYWRqb2luaW5nIG1hcmdp
bnMgaXMgZGVkdWN0ZWQgZnJvbSB0aGUgbWF4aW11bQotICAgIC8vIG9mIHRoZSBwb3NpdGl2ZSBh
ZGpvaW5pbmcgbWFyZ2lucy4gSWYgdGhlcmUgYXJlIG5vIHBvc2l0aXZlIG1hcmdpbnMsIHRoZSBt
YXhpbXVtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGFkam9pbmluZyBtYXJnaW5zIGlz
IGRlZHVjdGVkIGZyb20gemVyby4KLSAgICBpZiAoIW1hcmdpblZhbHVlcy5uZWdhdGl2ZSkKLSAg
ICAgICAgcmV0dXJuIG1hcmdpblZhbHVlcy5wb3NpdGl2ZTsKLQotICAgIGlmICghbWFyZ2luVmFs
dWVzLnBvc2l0aXZlKQotICAgICAgICByZXR1cm4gbWFyZ2luVmFsdWVzLm5lZ2F0aXZlOwotCi0g
ICAgcmV0dXJuICptYXJnaW5WYWx1ZXMucG9zaXRpdmUgKyAqbWFyZ2luVmFsdWVzLm5lZ2F0aXZl
OwotfQotCi12b2lkIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxhcHNlOjp1cGRh
dGVNYXJnaW5BZnRlckZvclByZXZpb3VzU2libGluZyhCbG9ja0Zvcm1hdHRpbmdDb250ZXh0JiBi
bG9ja0Zvcm1hdHRpbmdDb250ZXh0LCBjb25zdCBNYXJnaW5Db2xsYXBzZSYgbWFyZ2luQ29sbGFw
c2UsIGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAgIC8vIDEuIEdldCB0aGUgbWFyZ2luIGJl
Zm9yZSB2YWx1ZSBmcm9tIHRoZSBuZXh0IGluLWZsb3cgc2libGluZy4gVGhpcyBpcyB0aGUgc2Ft
ZSBhcyB0aGlzIGJveCdzIG1hcmdpbiBhZnRlciB2YWx1ZSBub3cgc2luY2UgdGhleSBhcmUgY29s
bGFwc2VkLgotICAgIC8vIDIuIFVwZGF0ZSB0aGUgY29sbGFwc2VkIG1hcmdpbiBhZnRlciB2YWx1
ZSBhcyB3ZWxsIGFzIHRoZSBwb3NpdGl2ZS9uZWdhdGl2ZSBjYWNoZS4KLSAgICAvLyAzLiBDaGVj
ayBpZiB0aGUgYm94J3MgbWFyZ2lucyBjb2xsYXBzZSB0aHJvdWdoLgotICAgIC8vIDQuIElmIHNv
LCB1cGRhdGUgdGhlIHBvc2l0aXZlL25lZ2F0aXZlIGNhY2hlLgotICAgIC8vIDUuIEluIGNhc2Ug
b2YgY29sbGFwc2VkIHRocm91Z2ggbWFyZ2lucyBjaGVjayBpZiB0aGUgYmVmb3JlIG1hcmdpbiBj
b2xsYXBlcyB3aXRoIHRoZSBwcmV2aW91cyBpbmZsb3cgc2libGluZydzIGFmdGVyIG1hcmdpbi4K
LSAgICAvLyA2LiBJZiBzbywganVtcCB0byAjMi4KLSAgICAvLyA3LiBObyBuZWVkIHRvIHByb3Bh
Z2F0ZSB0byBwYXJlbnQgYmVjYXVzZSBpdHMgbWFyZ2luIGlzIG5vdCBjb21wdXRlZCB5ZXQgKHBy
ZS1jb21wdXRlZCBhdCBtb3N0KS4KLSAgICBhdXRvKiBjdXJyZW50Qm94ID0gJmxheW91dEJveDsK
LSAgICBhdXRvJiBibG9ja0Zvcm1hdHRpbmdTdGF0ZSA9IGJsb2NrRm9ybWF0dGluZ0NvbnRleHQu
Zm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgd2hpbGUgKG1hcmdpbkNvbGxhcHNlLm1hcmdpbkJlZm9y
ZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRlcigqY3VycmVudEJveCkpIHsK
LSAgICAgICAgYXV0byYgcHJldmlvdXNTaWJsaW5nID0gKmN1cnJlbnRCb3gtPnByZXZpb3VzSW5G
bG93U2libGluZygpOwotICAgICAgICBhdXRvIHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2lu
ID0gYmxvY2tGb3JtYXR0aW5nU3RhdGUudXNlZFZlcnRpY2FsTWFyZ2luKHByZXZpb3VzU2libGlu
Zyk7Ci0KLSAgICAgICAgYXV0byBjb2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkJlZm9yZSA9IHByZXZp
b3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLmNvbGxhcHNlZFZhbHVlcy5iZWZvcmU7Ci0gICAgICAg
IGF1dG8gY29sbGFwc2VkVmVydGljYWxNYXJnaW5BZnRlciA9IGJsb2NrRm9ybWF0dGluZ0NvbnRl
eHQuZ2VvbWV0cnlGb3JCb3goKmN1cnJlbnRCb3gpLm1hcmdpbkJlZm9yZSgpOwotCi0gICAgICAg
IGF1dG8gbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCA9IG1hcmdpbkNvbGxhcHNlLm1hcmdpbnNDb2xs
YXBzZVRocm91Z2gocHJldmlvdXNTaWJsaW5nKTsKLSAgICAgICAgaWYgKG1hcmdpbnNDb2xsYXBz
ZVRocm91Z2gpCi0gICAgICAgICAgICBjb2xsYXBzZWRWZXJ0aWNhbE1hcmdpbkJlZm9yZSA9IGNv
bGxhcHNlZFZlcnRpY2FsTWFyZ2luQWZ0ZXI7Ci0KLSAgICAgICAgLy8gVXBkYXRlIHBvc2l0aXZl
L25lZ2F0aXZlIGNhY2hlLgotICAgICAgICBhdXRvIHByZXZpb3VzU2libGluZ1Bvc2l0aXZlTmVn
YXRpdmVNYXJnaW4gPSBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVydGljYWxNYXJnaW4ocHJl
dmlvdXNTaWJsaW5nKS5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzOwotICAgICAgICBhdXRvIHBv
c2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUgPSBibG9ja0Zvcm1hdHRpbmdTdGF0ZS51c2VkVmVy
dGljYWxNYXJnaW4oKmN1cnJlbnRCb3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYmVmb3Jl
OwotCi0gICAgICAgIGF1dG8gYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbiA9
IHByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luOwotICAgICAgICBhZGp1c3RlZFByZXZpb3Vz
U2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXMuYWZ0ZXIgPSBt
YXJnaW5Db2xsYXBzZS5jb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4ocG9zaXRpdmVO
ZWdhdGl2ZU1hcmdpbkJlZm9yZSwgcHJldmlvdXNTaWJsaW5nUG9zaXRpdmVOZWdhdGl2ZU1hcmdp
bi5hZnRlcik7Ci0gICAgICAgIGlmIChtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKSB7Ci0gICAgICAg
ICAgICBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVn
YXRpdmVWYWx1ZXMuYmVmb3JlID0gbWFyZ2luQ29sbGFwc2UuY29tcHV0ZWRQb3NpdGl2ZUFuZE5l
Z2F0aXZlTWFyZ2luKHByZXZpb3VzU2libGluZ1Bvc2l0aXZlTmVnYXRpdmVNYXJnaW4uYmVmb3Jl
LCBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2FsTWFyZ2luLnBvc2l0aXZlQW5kTmVnYXRp
dmVWYWx1ZXMuYWZ0ZXIpOwotICAgICAgICAgICAgYWRqdXN0ZWRQcmV2aW91c1NpYmxpbmdWZXJ0
aWNhbE1hcmdpbi5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmFmdGVyID0gYWRqdXN0ZWRQcmV2
aW91c1NpYmxpbmdWZXJ0aWNhbE1hcmdpbi5wb3NpdGl2ZUFuZE5lZ2F0aXZlVmFsdWVzLmJlZm9y
ZTsKLSAgICAgICAgfQotICAgICAgICBibG9ja0Zvcm1hdHRpbmdTdGF0ZS5zZXRVc2VkVmVydGlj
YWxNYXJnaW4ocHJldmlvdXNTaWJsaW5nLCBhZGp1c3RlZFByZXZpb3VzU2libGluZ1ZlcnRpY2Fs
TWFyZ2luKTsKLQotICAgICAgICBpZiAoIW1hcmdpbnNDb2xsYXBzZVRocm91Z2gpCi0gICAgICAg
ICAgICBicmVhazsKLQotICAgICAgICBjdXJyZW50Qm94ID0gJnByZXZpb3VzU2libGluZzsKLSAg
ICB9Ci19Ci0KLVVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZh
bHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9zaXRpdmVOZWdh
dGl2ZVZhbHVlcyhjb25zdCBCb3gmIGxheW91dEJveCwgTWFyZ2luVHlwZSBtYXJnaW5UeXBlKSBj
b25zdAotewotICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IGZvcm1hdHRpbmdDb250ZXh0KCku
Zm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgLy8gQnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUgaW4gQkZD
IGxheW91dCB0byBnYXRoZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZm9y
IGVpdGhlciBhIHByZXZpb3VzIHNpYmxpbmcgb3IgYSBjaGlsZCBib3gsCi0gICAgLy8gd2UgbXVz
aCBoYXZlIGNvbXB1dGVkIGFuZCBjYWNoZWQgdGhvc2UgdmFsdWVzLgotICAgIEFTU0VSVChmb3Jt
YXR0aW5nU3RhdGUuaGFzVXNlZFZlcnRpY2FsTWFyZ2luKGxheW91dEJveCkpOwotICAgIGF1dG8g
cG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luID0gZm9ybWF0dGluZ1N0YXRlLnVzZWRW
ZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpLnBvc2l0aXZlQW5kTmVnYXRpdmVWYWx1ZXM7Ci0gICAg
cmV0dXJuIG1hcmdpblR5cGUgPT0gTWFyZ2luVHlwZTo6QmVmb3JlID8gcG9zaXRpdmVBbmROZWdh
dGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSA6IHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNhbE1h
cmdpbi5hZnRlcjsgCi19Ci0KLVVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2
ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6cG9z
aXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZlcnRp
Y2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2VkVmFsdWVzKSBjb25zdAot
ewotICAgIGF1dG8gZmlyc3RDaGlsZENvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IFsmXSgpIC0+IFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7Ci0gICAg
ICAgIGlmICghbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aEZpcnN0SW5GbG93Q2hpbGRNYXJnaW5C
ZWZvcmUobGF5b3V0Qm94KSkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIHJldHVy
biBwb3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKCpkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJv
eCkuZmlyc3RJbkZsb3dDaGlsZCgpLCBNYXJnaW5UeXBlOjpCZWZvcmUpOwotICAgIH07Ci0KLSAg
ICBhdXRvIHByZXZpb3VTaWJsaW5nQ29sbGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2Vk
VmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgewotICAgICAg
ICBpZiAoIW1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJnaW5BZnRl
cihsYXlvdXRCb3gpKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgcmV0dXJuIHBv
c2l0aXZlTmVnYXRpdmVWYWx1ZXMoKmxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxpbmcoKSwg
TWFyZ2luVHlwZTo6QWZ0ZXIpOwotICAgIH07Ci0KLSAgICAvLyAxLiBHYXRoZXIgcG9zaXRpdmUg
YW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZnJvbSBmaXJzdCBjaGlsZCBpZiBtYXJnaW5zIGFy
ZSBhZGpvaW5pbmcuCi0gICAgLy8gMi4gR2F0aGVyIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJn
aW4gdmFsdWVzIGZyb20gcHJldmlvdXMgaW5mbG93IHNpYmxpbmcgaWYgbWFyZ2lucyBhcmUgYWRq
b2luaW5nLgotICAgIC8vIDMuIENvbXB1dGUgbWluL21heCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUg
Y29sbGFwc2VkIG1hcmdpbiB2YWx1ZXMgdXNpbmcgbm9uLWNvbGxwYXNlZCBjb21wdXRlZCBtYXJn
aW4gYmVmb3JlLgotICAgIGF1dG8gY29sbGFwc2VkTWFyZ2luQmVmb3JlID0gY29tcHV0ZWRQb3Np
dGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKGZpcnN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5CZWZvcmUoKSwg
cHJldmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5BZnRlcigpKTsKLSAgICBpZiAoY29sbGFwc2Vk
TWFyZ2luQmVmb3JlLmlzUXVpcmsgJiYgZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91
bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihsYXlvdXRCb3gpKQotICAgICAgICBjb2xsYXBz
ZWRNYXJnaW5CZWZvcmUgPSB7IH07Ci0KLSAgICBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZl
QW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgbm9uQ29sbGFwc2VkQmVmb3JlOwotICAgIGlmIChub25D
b2xsYXBzZWRWYWx1ZXMuYmVmb3JlID4gMCkKLSAgICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0g
eyBub25Db2xsYXBzZWRWYWx1ZXMuYmVmb3JlLCB7IH0sIGxheW91dEJveC5zdHlsZSgpLmhhc01h
cmdpbkJlZm9yZVF1aXJrKCkgfTsKLSAgICBlbHNlIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYmVm
b3JlIDwgMCkKLSAgICAgICAgbm9uQ29sbGFwc2VkQmVmb3JlID0geyB7IH0sIG5vbkNvbGxhcHNl
ZFZhbHVlcy5iZWZvcmUsIGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkg
fTsKLQotICAgIHJldHVybiBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4oY29sbGFw
c2VkTWFyZ2luQmVmb3JlLCBub25Db2xsYXBzZWRCZWZvcmUpOwotfQotCi1Vc2VkVmVydGljYWxN
YXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29u
dGV4dDo6TWFyZ2luQ29sbGFwc2U6OnBvc2l0aXZlTmVnYXRpdmVNYXJnaW5BZnRlcihjb25zdCBC
b3gmIGxheW91dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9u
Q29sbGFwc2VkVmFsdWVzKSBjb25zdAotewotICAgIGF1dG8gbGFzdENoaWxkQ29sbGFwc2VkTWFy
Z2luQWZ0ZXIgPSBbJl0oKSAtPiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRp
dmVQYWlyOjpWYWx1ZXMgewotICAgICAgICBpZiAoIW1hcmdpbkFmdGVyQ29sbGFwc2VzV2l0aExh
c3RJbkZsb3dDaGlsZE1hcmdpbkFmdGVyKGxheW91dEJveCkpCi0gICAgICAgICAgICByZXR1cm4g
eyB9OwotICAgICAgICByZXR1cm4gcG9zaXRpdmVOZWdhdGl2ZVZhbHVlcygqZG93bmNhc3Q8Q29u
dGFpbmVyQm94PihsYXlvdXRCb3gpLmxhc3RJbkZsb3dDaGlsZCgpLCBNYXJnaW5UeXBlOjpBZnRl
cik7Ci0gICAgfTsKLQotICAgIC8vIFdlIGRvbid0IGtub3cgeWV0IHRoZSBtYXJnaW4gYmVmb3Jl
IHZhbHVlIG9mIHRoZSBuZXh0IHNpYmxpbmcuIExldCdzIGp1c3QgcHJldGVuZCBpdCBkb2VzIG5v
dCBoYXZlIG9uZSBhbmQgCi0gICAgLy8gdXBkYXRlIGl0IGxhdGVyIHdoZW4gd2UgY29tcHV0ZSB0
aGUgbmV4dCBzaWJsaW5nJ3MgbWFyZ2luIGJlZm9yZS4gU2VlIHVwZGF0ZU1hcmdpbkFmdGVyRm9y
UHJldmlvdXNTaWJsaW5nLgotICAgIFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdh
dGl2ZVBhaXI6OlZhbHVlcyBub25Db2xsYXBzZWRBZnRlcjsKLSAgICBpZiAobm9uQ29sbGFwc2Vk
VmFsdWVzLmFmdGVyID4gMCkKLSAgICAgICAgbm9uQ29sbGFwc2VkQWZ0ZXIgPSB7IG5vbkNvbGxh
cHNlZFZhbHVlcy5hZnRlciwgeyB9LCBsYXlvdXRCb3guc3R5bGUoKS5oYXNNYXJnaW5BZnRlclF1
aXJrKCkgfTsKLSAgICBlbHNlIGlmIChub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIgPCAwKQotICAg
ICAgICBub25Db2xsYXBzZWRBZnRlciA9IHsgeyB9LCBub25Db2xsYXBzZWRWYWx1ZXMuYWZ0ZXIs
IGxheW91dEJveC5zdHlsZSgpLmhhc01hcmdpbkFmdGVyUXVpcmsoKSB9OwotCi0gICAgcmV0dXJu
IGNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1hcmdpbihsYXN0Q2hpbGRDb2xsYXBzZWRNYXJn
aW5BZnRlcigpLCBub25Db2xsYXBzZWRBZnRlcik7Ci19Ci0KLUxheW91dFVuaXQgQmxvY2tGb3Jt
YXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6Om1hcmdpbkJlZm9yZUlnbm9yaW5nQ29sbGFw
c2luZ1Rocm91Z2goY29uc3QgQm94JiBsYXlvdXRCb3gsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9u
Q29sbGFwc2VkVmFsdWVzIG5vbkNvbGxhcHNlZFZhbHVlcykKLXsKLSAgICBBU1NFUlQobGF5b3V0
Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLSAgICByZXR1cm4gbWFyZ2luVmFsdWUocG9zaXRpdmVO
ZWdhdGl2ZU1hcmdpbkJlZm9yZShsYXlvdXRCb3gsIG5vbkNvbGxhcHNlZFZhbHVlcykpLnZhbHVl
T3Iobm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSk7Ci19Ci0KLVVzZWRWZXJ0aWNhbE1hcmdpbiBC
bG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpNYXJnaW5Db2xsYXBzZTo6Y29sbGFwc2VkVmVydGljYWxW
YWx1ZXMoY29uc3QgQm94JiBsYXlvdXRCb3gsIFVzZWRWZXJ0aWNhbE1hcmdpbjo6Tm9uQ29sbGFw
c2VkVmFsdWVzIG5vbkNvbGxhcHNlZFZhbHVlcykKLXsKLSAgICBBU1NFUlQobGF5b3V0Qm94Lmlz
QmxvY2tMZXZlbEJveCgpKTsKLSAgICAvLyAxLiBHZXQgbWluL21heCBtYXJnaW4gdG9wIHZhbHVl
cyBmcm9tIHRoZSBmaXJzdCBpbi1mbG93IGNoaWxkIGlmIHdlIGFyZSBjb2xsYXBzaW5nIG1hcmdp
biB0b3Agd2l0aCBpdC4KLSAgICAvLyAyLiBHZXQgbWluL21heCBtYXJnaW4gdG9wIHZhbHVlcyBm
cm9tIHRoZSBwcmV2aW91cyBpbi1mbG93IHNpYmxpbmcsIGlmIHdlIGFyZSBjb2xsYXBzaW5nIG1h
cmdpbiB0b3Agd2l0aCBpdC4KLSAgICAvLyAzLiBHZXQgdGhpcyBsYXlvdXQgYm94J3MgY29tcHV0
ZWQgbWFyZ2luIHRvcCB2YWx1ZS4KLSAgICAvLyA0LiBVcGRhdGUgdGhlIG1pbi9tYXggdmFsdWUg
YW5kIGNvbXB1dGUgdGhlIGZpbmFsIG1hcmdpbi4KLSAgICBhdXRvIHBvc2l0aXZlQW5kTmVnYXRp
dmVWZXJ0aWNhbE1hcmdpbiA9IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2
ZVBhaXIgeyB0aGlzLT5wb3NpdGl2ZU5lZ2F0aXZlTWFyZ2luQmVmb3JlKGxheW91dEJveCwgbm9u
Q29sbGFwc2VkVmFsdWVzKSwgdGhpcy0+cG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkFmdGVyKGxheW91
dEJveCwgbm9uQ29sbGFwc2VkVmFsdWVzKSB9OwotCi0gICAgYXV0byBtYXJnaW5zQ29sbGFwc2VU
aHJvdWdoID0gdGhpcy0+bWFyZ2luc0NvbGxhcHNlVGhyb3VnaChsYXlvdXRCb3gpOwotICAgIGlm
IChtYXJnaW5zQ29sbGFwc2VUaHJvdWdoKSB7Ci0gICAgICAgIHBvc2l0aXZlQW5kTmVnYXRpdmVW
ZXJ0aWNhbE1hcmdpbi5iZWZvcmUgPSBjb21wdXRlZFBvc2l0aXZlQW5kTmVnYXRpdmVNYXJnaW4o
cG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJlZm9yZSwgcG9zaXRpdmVBbmROZWdh
dGl2ZVZlcnRpY2FsTWFyZ2luLmFmdGVyKTsKLSAgICAgICAgcG9zaXRpdmVBbmROZWdhdGl2ZVZl
cnRpY2FsTWFyZ2luLmFmdGVyID0gcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmJl
Zm9yZTsKLSAgICB9Ci0KLSAgICBhdXRvIGhhc0NvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IG1hcmdp
bkJlZm9yZUNvbGxhcHNlc1dpdGhGaXJzdEluRmxvd0NoaWxkTWFyZ2luQmVmb3JlKGxheW91dEJv
eCkgfHwgbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aFByZXZpb3VzU2libGluZ01hcmdpbkFmdGVy
KGxheW91dEJveCk7Ci0gICAgYXV0byBoYXNDb2xsYXBzZWRNYXJnaW5BZnRlciA9IG1hcmdpbkFm
dGVyQ29sbGFwc2VzV2l0aExhc3RJbkZsb3dDaGlsZE1hcmdpbkFmdGVyKGxheW91dEJveCk7Ci0g
ICAgYXV0byB1c2VkVmVydGljYWxNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW4geyBub25Db2xs
YXBzZWRWYWx1ZXMsIHsgfSwgcG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luIH07Ci0K
LSAgICBpZiAoKGhhc0NvbGxhcHNlZE1hcmdpbkJlZm9yZSAmJiBoYXNDb2xsYXBzZWRNYXJnaW5B
ZnRlcikgfHwgbWFyZ2luc0NvbGxhcHNlVGhyb3VnaCkKLSAgICAgICAgdXNlZFZlcnRpY2FsTWFy
Z2luLmNvbGxhcHNlZFZhbHVlcyA9IHsgbWFyZ2luVmFsdWUocG9zaXRpdmVBbmROZWdhdGl2ZVZl
cnRpY2FsTWFyZ2luLmJlZm9yZSksIG1hcmdpblZhbHVlKHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0
aWNhbE1hcmdpbi5hZnRlciksIG1hcmdpbnNDb2xsYXBzZVRocm91Z2ggfTsKLSAgICBlbHNlIGlm
IChoYXNDb2xsYXBzZWRNYXJnaW5CZWZvcmUpCi0gICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5j
b2xsYXBzZWRWYWx1ZXMgPSB7IG1hcmdpblZhbHVlKHBvc2l0aXZlQW5kTmVnYXRpdmVWZXJ0aWNh
bE1hcmdpbi5iZWZvcmUpLCB7IH0sIGZhbHNlIH07Ci0gICAgZWxzZSBpZiAoaGFzQ29sbGFwc2Vk
TWFyZ2luQWZ0ZXIpCi0gICAgICAgIHVzZWRWZXJ0aWNhbE1hcmdpbi5jb2xsYXBzZWRWYWx1ZXMg
PSB7IHsgfSwgbWFyZ2luVmFsdWUocG9zaXRpdmVBbmROZWdhdGl2ZVZlcnRpY2FsTWFyZ2luLmFm
dGVyKSwgZmFsc2UgfTsKLSAgICByZXR1cm4gdXNlZFZlcnRpY2FsTWFyZ2luOwotfQotCi19Ci19
Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvYmxvY2tmb3JtYXR0aW5nL1ByZWNvbXB1dGVkQmxvY2tNYXJnaW5Db2xsYXBzZS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGlu
Zy9QcmVjb21wdXRlZEJsb2NrTWFyZ2luQ29sbGFwc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCBkZWZiM2Q1NTRmZTY4ZGU0MjczMWZmOGUyZDRiMjBlYWJmNjU5ZWMyLi4wMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0aW5nL1ByZWNvbXB1dGVkQmxv
Y2tNYXJnaW5Db2xsYXBzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoK
LSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0g
KgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAot
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdD
b250ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2lu
Y2x1ZGUgIkJsb2NrRm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0j
aW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIK
LSNpbmNsdWRlICJMYXlvdXRVbml0LmgiCi0jaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKLQotbmFt
ZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLVVzZWRWZXJ0aWNhbE1hcmdp
bjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0
OjpNYXJnaW5Db2xsYXBzZTo6cHJlY29tcHV0ZWRQb3NpdGl2ZU5lZ2F0aXZlVmFsdWVzKGNvbnN0
IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewotICAgIGF1dG8mIGJsb2NrRm9ybWF0dGluZ1N0YXRl
ID0gZG93bmNhc3Q8QmxvY2tGb3JtYXR0aW5nU3RhdGU+KGxheW91dFN0YXRlKCkuZm9ybWF0dGlu
Z1N0YXRlRm9yQm94KGxheW91dEJveCkpOwotICAgIGlmIChibG9ja0Zvcm1hdHRpbmdTdGF0ZS5o
YXNVc2VkVmVydGljYWxNYXJnaW4obGF5b3V0Qm94KSkKLSAgICAgICAgcmV0dXJuIGJsb2NrRm9y
bWF0dGluZ1N0YXRlLnVzZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gpLnBvc2l0aXZlQW5kTmVn
YXRpdmVWYWx1ZXMuYmVmb3JlOwotCi0gICAgYXV0byBnZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250
ZXh0KCkuZ2VvbWV0cnkoKTsKLSAgICBhdXRvIGhvcml6b250YWxDb25zdHJhaW50cyA9IGdlb21l
dHJ5LmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChsYXlvdXRCb3guY29udGFpbmluZ0Jsb2Nr
KCkpLmhvcml6b250YWw7Ci0gICAgYXV0byBjb21wdXRlZFZlcnRpY2FsTWFyZ2luID0gZ2VvbWV0
cnkuY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50
cyk7Ci0gICAgYXV0byBub25Db2xsYXBzZWRNYXJnaW4gPSBVc2VkVmVydGljYWxNYXJnaW46Ok5v
bkNvbGxhcHNlZFZhbHVlcyB7IGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYmVmb3JlLnZhbHVlT3Io
MCksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFsdWVPcigwKSB9OwotICAgIHJldHVy
biBwcmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUobGF5b3V0Qm94LCBub25D
b2xsYXBzZWRNYXJnaW4pOwotfQotCi1Vc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVn
YXRpdmVQYWlyOjpWYWx1ZXMgQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6TWFyZ2luQ29sbGFwc2U6
OnByZWNvbXB1dGVkUG9zaXRpdmVOZWdhdGl2ZU1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91
dEJveCwgVXNlZFZlcnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgbm9uQ29sbGFwc2Vk
VmFsdWVzKSBjb25zdAotewotICAgIGF1dG8gZmlyc3RDaGlsZENvbGxhcHNlZE1hcmdpbkJlZm9y
ZSA9IFsmXSgpIC0+IFVzZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6
OlZhbHVlcyB7Ci0gICAgICAgIGlmICghbWFyZ2luQmVmb3JlQ29sbGFwc2VzV2l0aEZpcnN0SW5G
bG93Q2hpbGRNYXJnaW5CZWZvcmUobGF5b3V0Qm94KSkKLSAgICAgICAgICAgIHJldHVybiB7IH07
Ci0gICAgICAgIHJldHVybiBwcmVjb21wdXRlZFBvc2l0aXZlTmVnYXRpdmVWYWx1ZXMoKmRvd25j
YXN0PENvbnRhaW5lckJveD4obGF5b3V0Qm94KS5maXJzdEluRmxvd0NoaWxkKCkpOwotICAgIH07
Ci0KLSAgICBhdXRvIHByZXZpb3VTaWJsaW5nQ29sbGFwc2VkTWFyZ2luQWZ0ZXIgPSBbJl0oKSAt
PiBVc2VkVmVydGljYWxNYXJnaW46OlBvc2l0aXZlQW5kTmVnYXRpdmVQYWlyOjpWYWx1ZXMgewot
ICAgICAgICBpZiAoIW1hcmdpbkJlZm9yZUNvbGxhcHNlc1dpdGhQcmV2aW91c1NpYmxpbmdNYXJn
aW5BZnRlcihsYXlvdXRCb3gpKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgYXV0
byYgcHJldmlvdXNJbkZsb3dTaWJsaW5nID0gKmxheW91dEJveC5wcmV2aW91c0luRmxvd1NpYmxp
bmcoKTsKLSAgICAgICAgYXV0byYgYmxvY2tGb3JtYXR0aW5nU3RhdGUgPSBkb3duY2FzdDxCbG9j
a0Zvcm1hdHRpbmdTdGF0ZT4obGF5b3V0U3RhdGUoKS5mb3JtYXR0aW5nU3RhdGVGb3JCb3gocHJl
dmlvdXNJbkZsb3dTaWJsaW5nKSk7Ci0gICAgICAgIHJldHVybiBibG9ja0Zvcm1hdHRpbmdTdGF0
ZS51c2VkVmVydGljYWxNYXJnaW4ocHJldmlvdXNJbkZsb3dTaWJsaW5nKS5wb3NpdGl2ZUFuZE5l
Z2F0aXZlVmFsdWVzLmFmdGVyOwotICAgIH07Ci0KLSAgICAvLyAxLiBHYXRoZXIgcG9zaXRpdmUg
YW5kIG5lZ2F0aXZlIG1hcmdpbiB2YWx1ZXMgZnJvbSBmaXJzdCBjaGlsZCBpZiBtYXJnaW5zIGFy
ZSBhZGpvaW5pbmcuCi0gICAgLy8gMi4gR2F0aGVyIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJn
aW4gdmFsdWVzIGZyb20gcHJldmlvdXMgaW5mbG93IHNpYmxpbmcgaWYgbWFyZ2lucyBhcmUgYWRq
b2luaW5nLgotICAgIC8vIDMuIENvbXB1dGUgbWluL21heCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUg
Y29sbGFwc2VkIG1hcmdpbiB2YWx1ZXMgdXNpbmcgbm9uLWNvbGxwYXNlZCBjb21wdXRlZCBtYXJn
aW4gYmVmb3JlLgotICAgIGF1dG8gY29sbGFwc2VkTWFyZ2luQmVmb3JlID0gY29tcHV0ZWRQb3Np
dGl2ZUFuZE5lZ2F0aXZlTWFyZ2luKGZpcnN0Q2hpbGRDb2xsYXBzZWRNYXJnaW5CZWZvcmUoKSwg
cHJldmlvdVNpYmxpbmdDb2xsYXBzZWRNYXJnaW5BZnRlcigpKTsKLSAgICBpZiAoY29sbGFwc2Vk
TWFyZ2luQmVmb3JlLmlzUXVpcmsgJiYgZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKS5zaG91
bGRJZ25vcmVDb2xsYXBzZWRRdWlya01hcmdpbihsYXlvdXRCb3gpKQotICAgICAgICBjb2xsYXBz
ZWRNYXJnaW5CZWZvcmUgPSB7IH07Ci0KLSAgICBhdXRvIG5vbkNvbGxhcHNlZEJlZm9yZSA9IFVz
ZWRWZXJ0aWNhbE1hcmdpbjo6UG9zaXRpdmVBbmROZWdhdGl2ZVBhaXI6OlZhbHVlcyB7IH07Ci0g
ICAgaWYgKG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUgPiAwKQotICAgICAgICBub25Db2xsYXBz
ZWRCZWZvcmUgPSB7IG5vbkNvbGxhcHNlZFZhbHVlcy5iZWZvcmUsIHsgfSwgbGF5b3V0Qm94LnN0
eWxlKCkuaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSB9OwotICAgIGVsc2UgaWYgKG5vbkNvbGxhcHNl
ZFZhbHVlcy5iZWZvcmUgPCAwKQotICAgICAgICBub25Db2xsYXBzZWRCZWZvcmUgPSB7IHsgfSwg
bm9uQ29sbGFwc2VkVmFsdWVzLmJlZm9yZSwgbGF5b3V0Qm94LnN0eWxlKCkuaGFzTWFyZ2luQmVm
b3JlUXVpcmsoKSB9OwotCi0gICAgcmV0dXJuIGNvbXB1dGVkUG9zaXRpdmVBbmROZWdhdGl2ZU1h
cmdpbihjb2xsYXBzZWRNYXJnaW5CZWZvcmUsIG5vbkNvbGxhcHNlZEJlZm9yZSk7Ci19Ci0KLVBy
ZWNvbXB1dGVkTWFyZ2luQmVmb3JlIEJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6Ok1hcmdpbkNvbGxh
cHNlOjpwcmVjb21wdXRlZE1hcmdpbkJlZm9yZShjb25zdCBCb3gmIGxheW91dEJveCwgVXNlZFZl
cnRpY2FsTWFyZ2luOjpOb25Db2xsYXBzZWRWYWx1ZXMgdXNlZE5vbkNvbGxhcHNlZE1hcmdpbikK
LXsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLSAgICAvLyBEb24n
dCBwcmUtY29tcHV0ZSB2ZXJ0aWNhbCBtYXJnaW5zIGZvciBvdXQgb2YgZmxvdyBib3hlcy4KLSAg
ICBBU1NFUlQobGF5b3V0Qm94LmlzSW5GbG93KCkgfHwgbGF5b3V0Qm94LmlzRmxvYXRpbmdQb3Np
dGlvbmVkKCkpOwotICAgIEFTU0VSVCghbGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSk7Ci0KLSAg
ICBhdXRvIHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZvcmUgPSBwcmVjb21wdXRlZFBvc2l0aXZl
TmVnYXRpdmVNYXJnaW5CZWZvcmUobGF5b3V0Qm94LCB1c2VkTm9uQ29sbGFwc2VkTWFyZ2luKTsK
LSAgICBhdXRvIGNvbGxhcHNlZE1hcmdpbkJlZm9yZSA9IG1hcmdpblZhbHVlKHBvc2l0aXZlTmVn
YXRpdmVNYXJnaW5CZWZvcmUpOwotICAgIHJldHVybiB7IHVzZWROb25Db2xsYXBzZWRNYXJnaW4u
YmVmb3JlLCBjb2xsYXBzZWRNYXJnaW5CZWZvcmUsIHBvc2l0aXZlTmVnYXRpdmVNYXJnaW5CZWZv
cmUgfTsKLX0KLQotfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVX
cmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVXcmFw
cGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IGFjNmRmNjVjYTRiYjcxMzYwNGVhYjcwMDE2Y2Y3ZGVmMWMyMmYwNGQuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3Jh
cHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICsw
LDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0g
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAot
ICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0g
KiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICog
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGFibGVX
cmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JN
QVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJCbG9ja0Zvcm1hdHRpbmdTdGF0ZS5oIgotI2lu
Y2x1ZGUgIkludmFsaWRhdGlvblN0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnku
aCIKLSNpbmNsdWRlICJMYXlvdXRDaGlsZEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29u
dGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKLSNpbmNs
dWRlICJUYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5n
U3RhdGUuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLVdU
Rl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250
ZXh0KTsKLQotVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6VGFibGVXcmFwcGVy
QmxvY2tGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250
ZXh0Um9vdCwgQmxvY2tGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSkKLSAgICA6IEJs
b2NrRm9ybWF0dGluZ0NvbnRleHQoZm9ybWF0dGluZ0NvbnRleHRSb290LCBmb3JtYXR0aW5nU3Rh
dGUpCi17Ci19Ci0KLXZvaWQgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dDo6bGF5
b3V0SW5GbG93Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9y
SW5GbG93Q29udGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgLy8gVGhlIHRhYmxlIGdlbmVyYXRl
cyBhIHByaW5jaXBhbCBibG9jayBjb250YWluZXIgYm94IGNhbGxlZCB0aGUgdGFibGUgd3JhcHBl
ciBib3ggdGhhdCBjb250YWlucyB0aGUgdGFibGUgYm94IGl0c2VsZiBhbmQgYW55IGNhcHRpb24g
Ym94ZXMKLSAgICAvLyAoaW4gZG9jdW1lbnQgb3JkZXIpLiBUaGUgdGFibGUgYm94IGlzIGEgYmxv
Y2stbGV2ZWwgYm94IHRoYXQgY29udGFpbnMgdGhlIHRhYmxlJ3MgaW50ZXJuYWwgdGFibGUgYm94
ZXMuCi0gICAgLy8gVGhlIGNhcHRpb24gYm94ZXMgYXJlIHByaW5jaXBhbCBibG9jay1sZXZlbCBi
b3hlcyB0aGF0IHJldGFpbiB0aGVpciBvd24gY29udGVudCwgcGFkZGluZywgbWFyZ2luLCBhbmQg
Ym9yZGVyIGFyZWFzLCBhbmQgYXJlIHJlbmRlcmVkCi0gICAgLy8gYXMgbm9ybWFsIGJsb2NrIGJv
eGVzIGluc2lkZSB0aGUgdGFibGUgd3JhcHBlciBib3guIFdoZXRoZXIgdGhlIGNhcHRpb24gYm94
ZXMgYXJlIHBsYWNlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHRhYmxlIGJveCBpcyBkZWNpZGVkIGJ5
Ci0gICAgLy8gdGhlICdjYXB0aW9uLXNpZGUnIHByb3BlcnR5LCBhcyBkZXNjcmliZWQgYmVsb3cu
Ci0gICAgZm9yIChhdXRvJiBjaGlsZCA6IGNoaWxkcmVuT2ZUeXBlPENvbnRhaW5lckJveD4ocm9v
dCgpKSkgewotICAgICAgICBpZiAoY2hpbGQuaXNUYWJsZUJveCgpKQotICAgICAgICAgICAgbGF5
b3V0VGFibGVCb3goY2hpbGQsIGNvbnN0cmFpbnRzKTsKLSAgICAgICAgZWxzZSBpZiAoY2hpbGQu
aXNUYWJsZUNhcHRpb24oKSkKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVU
KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAg
IH0KLX0KLQotdm9pZCBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpsYXlvdXRU
YWJsZUJveChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94LCBjb25zdCBDb25zdHJhaW50c0Zv
ckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQotewotICAgIGxheW91dFN0YXRlKCkuZW5zdXJl
VGFibGVGb3JtYXR0aW5nU3RhdGUodGFibGVCb3gpOwotCi0gICAgY29tcHV0ZUJvcmRlckFuZFBh
ZGRpbmdGb3JUYWJsZUJveCh0YWJsZUJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAg
Y29tcHV0ZVN0YXRpY1ZlcnRpY2FsUG9zaXRpb24odGFibGVCb3gsIGNvbnN0cmFpbnRzLnZlcnRp
Y2FsKTsKLSAgICBjb21wdXRlV2lkdGhBbmRNYXJnaW5Gb3JUYWJsZUJveCh0YWJsZUJveCwgY29u
c3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgY29tcHV0ZVN0YXRpY0hvcml6b250YWxQb3NpdGlv
bih0YWJsZUJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0KLSAgICBpZiAodGFibGVCb3gu
aGFzQ2hpbGQoKSkgewotICAgICAgICBhdXRvIGludmFsaWRhdGlvblN0YXRlID0gSW52YWxpZGF0
aW9uU3RhdGUgeyB9OwotICAgICAgICBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29u
dGV4dCh0YWJsZUJveCwgbGF5b3V0U3RhdGUoKSktPmxheW91dEluRmxvd0NvbnRlbnQoaW52YWxp
ZGF0aW9uU3RhdGUsIGdlb21ldHJ5KCkuY29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50KHRhYmxl
Qm94KSk7Ci0gICAgfQotCi0gICAgY29tcHV0ZUhlaWdodEFuZE1hcmdpbkZvclRhYmxlQm94KHRh
YmxlQm94LCBjb25zdHJhaW50cyk7Ci19Ci0KLXZvaWQgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0
aW5nQ29udGV4dDo6Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmdGb3JUYWJsZUJveChjb25zdCBDb250
YWluZXJCb3gmIHRhYmxlQm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250
YWxDb25zdHJhaW50cykKLXsKLSAgICBBU1NFUlQodGFibGVCb3guaXNUYWJsZUJveCgpKTsKLSAg
ICBpZiAoIXRhYmxlQm94Lmhhc0NoaWxkKCkgfHwgdGFibGVCb3guc3R5bGUoKS5ib3JkZXJDb2xs
YXBzZSgpID09IEJvcmRlckNvbGxhcHNlOjpTZXBhcmF0ZSkgewotICAgICAgICBCbG9ja0Zvcm1h
dHRpbmdDb250ZXh0Ojpjb21wdXRlQm9yZGVyQW5kUGFkZGluZyh0YWJsZUJveCwgaG9yaXpvbnRh
bENvbnN0cmFpbnRzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBVQXMgbXVzdCBj
b21wdXRlIGFuIGluaXRpYWwgbGVmdCBhbmQgcmlnaHQgYm9yZGVyIHdpZHRoIGZvciB0aGUgdGFi
bGUgYnkgZXhhbWluaW5nCi0gICAgLy8gdGhlIGZpcnN0IGFuZCBsYXN0IGNlbGxzIGluIHRoZSBm
aXJzdCByb3cgb2YgdGhlIHRhYmxlLgotICAgIC8vIFRoZSBsZWZ0IGJvcmRlciB3aWR0aCBvZiB0
aGUgdGFibGUgaXMgaGFsZiBvZiB0aGUgZmlyc3QgY2VsbCdzIGNvbGxhcHNlZCBsZWZ0IGJvcmRl
ciwKLSAgICAvLyBhbmQgdGhlIHJpZ2h0IGJvcmRlciB3aWR0aCBvZiB0aGUgdGFibGUgaXMgaGFs
ZiBvZiB0aGUgbGFzdCBjZWxsJ3MgY29sbGFwc2VkIHJpZ2h0IGJvcmRlci4KLSAgICAvLyBUaGUg
dG9wIGJvcmRlciB3aWR0aCBvZiB0aGUgdGFibGUgaXMgY29tcHV0ZWQgYnkgZXhhbWluaW5nIGFs
bCBjZWxscyB3aG8gY29sbGFwc2UgdGhlaXIgdG9wCi0gICAgLy8gYm9yZGVycyB3aXRoIHRoZSB0
b3AgYm9yZGVyIG9mIHRoZSB0YWJsZS4gVGhlIHRvcCBib3JkZXIgd2lkdGggb2YgdGhlIHRhYmxl
IGlzIGVxdWFsIHRvIGhhbGYgb2YgdGhlCi0gICAgLy8gbWF4aW11bSBjb2xsYXBzZWQgdG9wIGJv
cmRlci4gVGhlIGJvdHRvbSBib3JkZXIgd2lkdGggaXMgY29tcHV0ZWQgYnkgZXhhbWluaW5nIGFs
bCBjZWxscyB3aG9zZSBib3R0b20gYm9yZGVycyBjb2xsYXBzZQotICAgIC8vIHdpdGggdGhlIGJv
dHRvbSBvZiB0aGUgdGFibGUuIFRoZSBib3R0b20gYm9yZGVyIHdpZHRoIGlzIGVxdWFsIHRvIGhh
bGYgb2YgdGhlIG1heGltdW0gY29sbGFwc2VkIGJvdHRvbSBib3JkZXIuCi0gICAgYXV0byYgZ3Jp
ZCA9IGxheW91dFN0YXRlKCkuZXN0YWJsaXNoZWRUYWJsZUZvcm1hdHRpbmdTdGF0ZSh0YWJsZUJv
eCkudGFibGVHcmlkKCk7Ci0gICAgYXV0byB0YWJsZUJvcmRlciA9IGdlb21ldHJ5KCkuY29tcHV0
ZWRCb3JkZXIodGFibGVCb3gpOwotCi0gICAgYXV0byYgZmlyc3RDb2x1bW5GaXJzdFJvd0JveCA9
IGdyaWQuc2xvdCh7IDAgLCAwIH0pLT5jZWxsKCkuYm94KCk7Ci0gICAgYXV0byBsZWZ0Qm9yZGVy
ID0gc3RkOjptYXgodGFibGVCb3JkZXIuaG9yaXpvbnRhbC5sZWZ0LCBnZW9tZXRyeSgpLmNvbXB1
dGVkQm9yZGVyKGZpcnN0Q29sdW1uRmlyc3RSb3dCb3gpLmhvcml6b250YWwubGVmdCk7Ci0KLSAg
ICBhdXRvJiBsYXN0Q29sdW1uRmlyc3RSb3cgPSBncmlkLnNsb3QoeyBncmlkLmNvbHVtbnMoKS5z
aXplKCkgLSAxLCAwIH0pLT5jZWxsKCkuYm94KCk7Ci0gICAgYXV0byByaWdodEJvcmRlciA9IHN0
ZDo6bWF4KHRhYmxlQm9yZGVyLmhvcml6b250YWwucmlnaHQsIGdlb21ldHJ5KCkuY29tcHV0ZWRC
b3JkZXIobGFzdENvbHVtbkZpcnN0Um93KS5ob3Jpem9udGFsLnJpZ2h0KTsKLQotICAgIGF1dG8g
dG9wQm9yZGVyID0gdGFibGVCb3JkZXIudmVydGljYWwudG9wOwotICAgIGF1dG8gYm90dG9tQm9y
ZGVyID0gdGFibGVCb3JkZXIudmVydGljYWwuYm90dG9tOwotICAgIGF1dG8gbGFzdFJvd0luZGV4
ID0gZ3JpZC5yb3dzKCkuc2l6ZSgpIC0gMTsKLSAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9
IDA7IGNvbHVtbkluZGV4IDwgZ3JpZC5jb2x1bW5zKCkuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7
Ci0gICAgICAgIGF1dG8mIGJveEluRmlyc3RSb3ggPSBncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwg
MCB9KS0+Y2VsbCgpLmJveCgpOwotICAgICAgICBhdXRvJiBib3hJbkxhc3RSb3cgPSBncmlkLnNs
b3QoeyBjb2x1bW5JbmRleCwgbGFzdFJvd0luZGV4IH0pLT5jZWxsKCkuYm94KCk7Ci0KLSAgICAg
ICAgdG9wQm9yZGVyID0gc3RkOjptYXgodG9wQm9yZGVyLCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9y
ZGVyKGJveEluRmlyc3RSb3gpLnZlcnRpY2FsLnRvcCk7Ci0gICAgICAgIGJvdHRvbUJvcmRlciA9
IHN0ZDo6bWF4KGJvdHRvbUJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihib3hJbkxh
c3RSb3cpLnZlcnRpY2FsLmJvdHRvbSk7Ci0gICAgfQotCi0gICAgdG9wQm9yZGVyID0gc3RkOjpt
YXgodG9wQm9yZGVyLCBnZW9tZXRyeSgpLmNvbXB1dGVkQm9yZGVyKCp0YWJsZUJveC5maXJzdENo
aWxkKCkpLnZlcnRpY2FsLnRvcCk7Ci0gICAgZm9yIChhdXRvJiBzZWN0aW9uIDogY2hpbGRyZW5P
ZlR5cGU8Q29udGFpbmVyQm94Pih0YWJsZUJveCkpIHsKLSAgICAgICAgYXV0byBob3JpenRvbmFs
Qm9yZGVyID0gZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihzZWN0aW9uKS5ob3Jpem9udGFsOwot
ICAgICAgICBsZWZ0Qm9yZGVyID0gc3RkOjptYXgobGVmdEJvcmRlciwgaG9yaXp0b25hbEJvcmRl
ci5sZWZ0KTsKLSAgICAgICAgcmlnaHRCb3JkZXIgPSBzdGQ6Om1heChyaWdodEJvcmRlciwgaG9y
aXp0b25hbEJvcmRlci5yaWdodCk7Ci0gICAgfQotICAgIGJvdHRvbUJvcmRlciA9IHN0ZDo6bWF4
KGJvdHRvbUJvcmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcigqdGFibGVCb3gubGFzdENo
aWxkKCkpLnZlcnRpY2FsLmJvdHRvbSk7Ci0KLSAgICBhdXRvJiByb3dzID0gZ3JpZC5yb3dzKCku
bGlzdCgpOwotICAgIHRvcEJvcmRlciA9IHN0ZDo6bWF4KHRvcEJvcmRlciwgZ2VvbWV0cnkoKS5j
b21wdXRlZEJvcmRlcihyb3dzLmZpcnN0KCkuYm94KCkpLnZlcnRpY2FsLnRvcCk7Ci0gICAgZm9y
IChhdXRvJiByb3cgOiByb3dzKSB7Ci0gICAgICAgIGF1dG8gaG9yaXp0b25hbEJvcmRlciA9IGdl
b21ldHJ5KCkuY29tcHV0ZWRCb3JkZXIocm93LmJveCgpKS5ob3Jpem9udGFsOwotICAgICAgICBs
ZWZ0Qm9yZGVyID0gc3RkOjptYXgobGVmdEJvcmRlciwgaG9yaXp0b25hbEJvcmRlci5sZWZ0KTsK
LSAgICAgICAgcmlnaHRCb3JkZXIgPSBzdGQ6Om1heChyaWdodEJvcmRlciwgaG9yaXp0b25hbEJv
cmRlci5yaWdodCk7Ci0gICAgfQotICAgIGJvdHRvbUJvcmRlciA9IHN0ZDo6bWF4KGJvdHRvbUJv
cmRlciwgZ2VvbWV0cnkoKS5jb21wdXRlZEJvcmRlcihyb3dzLmxhc3QoKS5ib3goKSkudmVydGlj
YWwuYm90dG9tKTsKLQotICAgIGF1dG8gY29sbGFwc2VkQm9yZGVyID0gRWRnZXMgeyB7IGxlZnRC
b3JkZXIsIHJpZ2h0Qm9yZGVyIH0sIHsgdG9wQm9yZGVyLCBib3R0b21Cb3JkZXIgfSB9OwotICAg
IGdyaWQuc2V0Q29sbGFwc2VkQm9yZGVyKGNvbGxhcHNlZEJvcmRlcik7Ci0KLSAgICBhdXRvJiBi
b3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KHRhYmxlQm94KTsKLSAg
ICBib3hHZW9tZXRyeS5zZXRCb3JkZXIoY29sbGFwc2VkQm9yZGVyIC8gMik7Ci0gICAgYm94R2Vv
bWV0cnkuc2V0UGFkZGluZyhnZW9tZXRyeSgpLmNvbXB1dGVkUGFkZGluZyh0YWJsZUJveCwgaG9y
aXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aCkpOwotfQotCi12b2lkIFRhYmxlV3JhcHBl
ckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVXaWR0aEFuZE1hcmdpbkZvclRhYmxlQm94
KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQotewotICAgIEFTU0VSVCh0YWJsZUJveC5pc1RhYmxl
Qm94KCkpOwotICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIHRhYmxlICJmaXQtY29udGVudCBzaXpl
IiBiZWhhdmlvciBoYW5kbGluZy4gTm90IGluIHRoZSBzcGVjIHRob3VnaC4KLSAgICAvLyBUYWJs
ZSByZXR1cm5zIGl0cyBmaW5hbCB3aWR0aCBhcyBtaW4vbWF4LiBVc2UgdGhpcyBmaW5hbCB3aWR0
aCB2YWx1ZSB0byBjb21wdXRlZCBob3Jpem9udGFsIG1hcmdpbnMgZXRjLgotICAgIGF1dG8mIGZv
cm1hdHRpbmdTdGF0ZUZvclRhYmxlQm94ID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZFRhYmxl
Rm9ybWF0dGluZ1N0YXRlKHRhYmxlQm94KTsKLSAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMgPSBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsgfTsKLSAgICBpZiAoYXV0byBwcmVj
b21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBmb3JtYXR0aW5nU3RhdGVGb3JUYWJs
ZUJveC5pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkpCi0gICAgICAgIGludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMgPSAqcHJlY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOwotICAg
IGVsc2UgewotICAgICAgICBpZiAodGFibGVCb3guaGFzQ2hpbGQoKSkKLSAgICAgICAgICAgIGlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5n
Q29udGV4dCh0YWJsZUJveCwgbGF5b3V0U3RhdGUoKSktPmNvbXB1dGVkSW50cmluc2ljV2lkdGhD
b25zdHJhaW50cygpOwotICAgICAgICBmb3JtYXR0aW5nU3RhdGVGb3JUYWJsZUJveC5zZXRJbnRy
aW5zaWNXaWR0aENvbnN0cmFpbnRzKGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMpOwotICAgIH0K
LQotICAgIGF1dG8gYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlID0gaG9yaXpvbnRhbENvbnN0cmFp
bnRzLmxvZ2ljYWxXaWR0aDsKLSAgICAvLyAxLiBUaGUgdGFibGUgZ2VuZXJhdGVzIGEgcHJpbmNp
cGFsIGJsb2NrIGNvbnRhaW5lciBib3ggY2FsbGVkIHRoZSB0YWJsZSB3cmFwcGVyIGJveCB0aGF0
IGNvbnRhaW5zIHRoZSB0YWJsZSBib3ggaXRzZWxmIGFuZCBhbnkgY2FwdGlvbiBib3hlcy4KLSAg
ICAvLyAyLiBUaGUgdGFibGUgd3JhcHBlciBib3ggZXN0YWJsaXNoZXMgYSBibG9jayBmb3JtYXR0
aW5nIGNvbnRleHQsIGFuZCB0aGUgdGFibGUgYm94IGVzdGFibGlzaGVzIGEgdGFibGUgZm9ybWF0
dGluZyBjb250ZXh0LgotICAgIC8vIDMuIFRoZSBjb21wdXRlZCB2YWx1ZXMgb2YgcHJvcGVydGll
cyAncG9zaXRpb24nLCAnZmxvYXQnLCAnbWFyZ2luLSonLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRv
bScsIGFuZCAnbGVmdCcgb24KLSAgICAvLyAgICB0aGUgdGFibGUgZWxlbWVudCBhcmUgdXNlZCBv
biB0aGUgdGFibGUgd3JhcHBlciBib3ggYW5kIG5vdCB0aGUgdGFibGUgYm94OyBhbGwgb3RoZXIg
dmFsdWVzIG9mIG5vbi1pbmhlcml0YWJsZQotICAgIC8vICAgIHByb3BlcnRpZXMgYXJlIHVzZWQg
b24gdGhlIHRhYmxlIGJveCBhbmQgbm90IHRoZSB0YWJsZSB3cmFwcGVyIGJveC4KLSAgICAvLyA0
LiBJbiBhIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCwgZWFjaCBib3gncyBsZWZ0IG91dGVyIGVk
Z2UgdG91Y2hlcyB0aGUgbGVmdCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrLgotICAgIC8v
ICAgIFRoaXMgaXMgdHJ1ZSBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiBmbG9hdHMsIHVubGVzcyB0
aGUgYm94IGVzdGFibGlzaGVzIGEgbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCAoaW4gd2hp
Y2ggY2FzZSB0aGUKLSAgICAvLyAgICBib3ggaXRzZWxmIG1heSBiZWNvbWUgbmFycm93ZXIgZHVl
IHRvIHRoZSBmbG9hdHMpCi0gICAgLy8KLSAgICAvLyBOb3cgY29uc2lkZXIgdGhlIGZvbGxvd2lu
ZyBjYXNlOgotICAgIC8vIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyB3aWR0aDogNTAwcHg7
Ij4KLSAgICAvLyAgICAgPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiAxMDBweDsiPjwv
ZGl2PgotICAgIC8vICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogdGFibGU7IHdpZHRoOiAx
MCU7Ij48L2Rpdj4KLSAgICAvLyAgICAgPC9kaXY+Ci0gICAgLy8gPC9kaXY+Ci0gICAgLy8gMS4g
V2UgY3JlYXRlIGEgdGFibGUgd3JhcHBlciBib3ggdG8gd3JhcCB0aGUgImRpc3BsYXk6IHRhYmxl
IiBibG9jayBsZXZlbCBib3ggKCMxKS4KLSAgICAvLyAyLiBUaGUgdGFibGUgd3JhcHBlciBib3gn
cyB3aWR0aCBwcm9wZXJ0eSBpcyBzZXQgdG8gYXV0byAoIzMpLgotICAgIC8vIDMuIFNpbmNlIGl0
IGVzdGFibGlzaGVzIGEgbmV3IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCwgdGhlIGF2YWlsYWJs
ZSBob3Jpem9udGFsIHNwYWNlIGdldHMgc2hydW5rIGJ5IHRoZSBmbG9hdCAoIzQpCi0gICAgLy8g
NC4gVGhlIHRhYmxlIHdyYXBwZXIgYm94J3MgdXNlZCB3aWR0aCBjb21wdXRlcyB0byA1MDBweCAt
IDEwMHB4IC0+IDQwMHB4OwotICAgIC8vCi0gICAgLy8gTm93IHdlIGFyZSBpbnNpZGUgdGhlIEJG
QyBlc3RhYmxpc2hlZCBieSB0aGUgdGFibGUgd3JhcHBlciBib3ggYW5kIHRyeSB0byByZXNvbHZl
IHRoZSB0YWJsZSdzIHdpZHRoIC0+ICUxMC4KLSAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIG5vcm1h
bCBCRkMgcnVsZXMsIGl0IHNob3VsZCBjb21wdXRlIHRvIDEwJSBvZiB0aGUgY29udGFpbmluZyBi
bG9jaydzIGxvZ2ljYWwgd2lkdGg6IDQwMHB4IC0+IDQwcHguCi0gICAgLy8gSG93ZXZlciBpbiBw
cmFjdGljZSBpdCBjb21wdXRlcyB0byA1MHB4ICgxMCUgb2YgNTAwcHgpLgotICAgIC8vIFNpbWls
YXIgc2V0dXAgd2l0aCBub24tdGFibGUgY29udGVudCB3b3VsZCByZXNvbHZlIHRoZSBpbm5lciBi
bG9jayBsZXZlbCBib3gncyB3aWR0aCB0byA0MHB4OwotICAgIC8vIFRoaXMgbmVlZHMgY2xhcmlm
aWNhdGlvbiBpbiB0aGUgc3BlYy4KLSAgICBhdXRvIGhvcml6b250YWxDb25zdHJhaW50Rm9yUmVz
b2x2aW5nV2lkdGggPSBtX2hvcml6b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxvYXRzLmxvZ2lj
YWxXaWR0aDsKLSAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2VvbWV0cnkoKTsKLSAgICBhdXRv
IGNvbXB1dGVkV2lkdGggPSBnZW9tZXRyeS5jb21wdXRlZFdpZHRoKHRhYmxlQm94LCBob3Jpem9u
dGFsQ29uc3RyYWludEZvclJlc29sdmluZ1dpZHRoKTsKLSAgICBhdXRvIGNvbXB1dGVkTWF4V2lk
dGggPSBnZW9tZXRyeS5jb21wdXRlZE1heFdpZHRoKHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3Ry
YWludEZvclJlc29sdmluZ1dpZHRoKTsKLSAgICBhdXRvIGNvbXB1dGVkTWluV2lkdGggPSBnZW9t
ZXRyeS5jb21wdXRlZE1pbldpZHRoKHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludEZvclJl
c29sdmluZ1dpZHRoKTsKLSAgICAvLyBVc2UgdGhlIGdlbmVyaWMgc2hyaW5rLXRvLWZpdC13aWR0
aCBsb2dpYyBhcyB0aGUgaW5pdGlhbCB3aWR0aCBmb3IgdGhlIHRhYmxlLgotICAgIGF1dG8gdXNl
ZFdpZHRoID0gc3RkOjptaW4oc3RkOjptYXgoaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5p
bXVtLCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UpLCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
Lm1heGltdW0pOwotICAgIGlmIChjb21wdXRlZFdpZHRoIHx8IGNvbXB1dGVkTWluV2lkdGggfHwg
Y29tcHV0ZWRNYXhXaWR0aCkgewotICAgICAgICBpZiAoY29tcHV0ZWRXaWR0aCkgewotICAgICAg
ICAgICAgLy8gTm9ybWFsaXplIHRoZSBjb21wdXRlZCB3aWR0aCB2YWx1ZSBmaXJzdC4KLSAgICAg
ICAgICAgIGlmIChjb21wdXRlZE1heFdpZHRoICYmICpjb21wdXRlZFdpZHRoID4gKmNvbXB1dGVk
TWF4V2lkdGgpCi0gICAgICAgICAgICAgICAgY29tcHV0ZWRXaWR0aCA9IGNvbXB1dGVkTWF4V2lk
dGg7Ci0gICAgICAgICAgICBpZiAoY29tcHV0ZWRNaW5XaWR0aCAmJiAqY29tcHV0ZWRXaWR0aCA8
ICpjb21wdXRlZE1pbldpZHRoKQotICAgICAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggPSBjb21w
dXRlZE1pbldpZHRoOwotICAgICAgICAgICAgdXNlZFdpZHRoID0gKmNvbXB1dGVkV2lkdGggPCBp
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0gPyBpbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzLm1pbmltdW0gOiAqY29tcHV0ZWRXaWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChj
b21wdXRlZE1heFdpZHRoICYmICpjb21wdXRlZE1heFdpZHRoIDwgdXNlZFdpZHRoKQotICAgICAg
ICAgICAgdXNlZFdpZHRoID0gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5taW5pbXVtOwotICAg
ICAgICBpZiAoY29tcHV0ZWRNaW5XaWR0aCAmJiAqY29tcHV0ZWRNaW5XaWR0aCA+IHVzZWRXaWR0
aCkKLSAgICAgICAgICAgIHVzZWRXaWR0aCA9ICpjb21wdXRlZE1pbldpZHRoOwotICAgIH0KLQot
ICAgIGF1dG8gY29udGVudFdpZHRoQW5kTWFyZ2luID0gZ2VvbWV0cnkuaW5GbG93Q29udGVudFdp
ZHRoQW5kTWFyZ2luKHRhYmxlQm94LCBob3Jpem9udGFsQ29uc3RyYWludHMsIE92ZXJyaWRkZW5I
b3Jpem9udGFsVmFsdWVzIHsgdXNlZFdpZHRoLCB7IH0gfSk7Ci0KLSAgICBhdXRvJiBib3hHZW9t
ZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KHRhYmxlQm94KTsKLSAgICBib3hH
ZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRX
aWR0aCk7Ci0gICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IGNvbnRlbnRXaWR0
aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0LCBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1h
cmdpbi5lbmQgfSk7Ci19Ci0KLXZvaWQgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4
dDo6Y29tcHV0ZUhlaWdodEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYg
dGFibGVCb3gsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWludHMp
Ci17Ci0gICAgQVNTRVJUKHRhYmxlQm94LmlzVGFibGVCb3goKSk7Ci0gICAgLy8gVGFibGUgaXMg
YSBzcGVjaWFsIEJGQyBjb250ZW50LiBJdHMgaGVpZ2h0IGlzIG1haW5seSBkcml2ZW4gYnkgdGhl
IGNvbnRlbnQuIENvbXB1dGVkIGhlaWdodCwgbWluLWhlaWdodCBhbmQgbWF4LWhlaWdodCBhcmUg
YWxsCi0gICAgLy8gYWxyZWFkeSBiZWVuIHRha2VuIGludG8gYWNjb3VudCBkdXJpbmcgdGhlIFRG
QyBsYXlvdXQuCi0gICAgYXV0byBoZWlnaHRBbmRNYXJnaW4gPSBnZW9tZXRyeSgpLmluRmxvd0Nv
bnRlbnRIZWlnaHRBbmRNYXJnaW4odGFibGVCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIHsg
cXVpcmtzKCkub3ZlcnJpZGRlblRhYmxlSGVpZ2h0KHRhYmxlQm94KSB9KTsKLQotICAgIGF1dG8g
bWFyZ2luQ29sbGFwc2UgPSB0aGlzLT5tYXJnaW5Db2xsYXBzZSgpOwotICAgIGF1dG8gdmVydGlj
YWxNYXJnaW4gPSBtYXJnaW5Db2xsYXBzZS5jb2xsYXBzZWRWZXJ0aWNhbFZhbHVlcyh0YWJsZUJv
eCwgaGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbik7Ci0gICAgLy8gQ2FjaGUgdGhl
IGNvbXB1dGVkIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdmFsdWUgcGFpci4KLSAgICBm
b3JtYXR0aW5nU3RhdGUoKS5zZXRVc2VkVmVydGljYWxNYXJnaW4odGFibGVCb3gsIHZlcnRpY2Fs
TWFyZ2luKTsKLQotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94
R2VvbWV0cnkodGFibGVCb3gpOwotICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3AodmVydGlj
YWxQb3NpdGlvbldpdGhNYXJnaW4odGFibGVCb3gsIHZlcnRpY2FsTWFyZ2luLCBjb25zdHJhaW50
cy52ZXJ0aWNhbCkpOwotICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoaGVpZ2h0
QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQpOwotICAgIGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFy
Z2luKHsgbWFyZ2luQmVmb3JlKHZlcnRpY2FsTWFyZ2luKSwgbWFyZ2luQWZ0ZXIodmVydGljYWxN
YXJnaW4pIH0pOwotICAgIC8vIEFkanVzdCB0aGUgcHJldmlvdXMgc2libGluZydzIG1hcmdpbiBi
b3R0b20gbm93IHRoYXQgdGhpcyBib3gncyB2ZXJ0aWNhbCBtYXJnaW4gaXMgY29tcHV0ZWQuCi0g
ICAgTWFyZ2luQ29sbGFwc2U6OnVwZGF0ZU1hcmdpbkFmdGVyRm9yUHJldmlvdXNTaWJsaW5nKCp0
aGlzLCBtYXJnaW5Db2xsYXBzZSwgdGFibGVCb3gpOwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zv
cm1hdHRpbmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQu
aCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvYmxvY2tmb3JtYXR0
aW5nL3RhYmxld3JhcHBlci9UYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgKZGVs
ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZWExNTdjYzUyMTZmODg0ZmQyODk4MzRhM2M4
NjY5NTM3NDI3YTUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0t
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRp
bmcvdGFibGV3cmFwcGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQuaAorKysg
L2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
Ci0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0g
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQot
I2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiQmxvY2tG
b3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLQotbmFtZXNw
YWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLS8vIFRoaXMgY2xhc3MgaW1wbGVt
ZW50cyB0aGUgc3BlY2lhbCBibG9jayBmb3JtYXR0aW5nIGNvbnRleHQgbGF5b3V0IGxvZ2ljIGZv
ciB0aGUgdGFibGUgd3JhcHBlci4KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi90YWJs
ZXMuaHRtbCNtb2RlbAotY2xhc3MgVGFibGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dCBm
aW5hbCA6IHB1YmxpYyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0IHsKLSAgICBXVEZfTUFLRV9JU09f
QUxMT0NBVEVEKFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQpOwotcHVibGljOgot
ICAgIFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94
JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIEJsb2NrRm9ybWF0dGluZ1N0YXRlJik7Ci0KLSAgICB2
b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJh
aW50c0ZvckluRmxvd0NvbnRlbnQmKSBmaW5hbDsKLQotICAgIHZvaWQgc2V0SG9yaXpvbnRhbENv
bnN0cmFpbnRzSWdub3JpbmdGbG9hdHMoY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jp
em9udGFsQ29uc3RyYWludHMpIHsgbV9ob3Jpem9udGFsQ29uc3RyYWludHNJZ25vcmluZ0Zsb2F0
cyA9IGhvcml6b250YWxDb25zdHJhaW50czsgfQotCi1wcml2YXRlOgotICAgIGNsYXNzIFF1aXJr
cyA6IHB1YmxpYyBCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgewotICAgIHB1YmxpYzoK
LSAgICAgICAgUXVpcmtzKGNvbnN0IFRhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHQm
KTsKLQotICAgICAgICBPcHRpb25hbDxMYXlvdXRVbml0PiBvdmVycmlkZGVuVGFibGVIZWlnaHQo
Y29uc3QgQ29udGFpbmVyQm94JiB0YWJsZUJveCkgY29uc3Q7Ci0gICAgfTsKLSAgICBUYWJsZVdy
YXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1
cm4gUXVpcmtzKCp0aGlzKTsgfQotCi0gICAgdm9pZCBsYXlvdXRUYWJsZUJveChjb25zdCBDb250
YWluZXJCb3gmIHRhYmxlQm94LCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsK
LQotICAgIHZvaWQgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmdGb3JUYWJsZUJveChjb25zdCBDb250
YWluZXJCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmKTsKLSAgICB2b2lkIGNvbXB1
dGVXaWR0aEFuZE1hcmdpbkZvclRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYpOwotICAgIHZvaWQgY29tcHV0ZUhlaWdodEFuZE1hcmdpbkZv
clRhYmxlQm94KGNvbnN0IENvbnRhaW5lckJveCYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93
Q29udGVudCYpOwotCi1wcml2YXRlOgotICAgIEhvcml6b250YWxDb25zdHJhaW50cyBtX2hvcml6
b250YWxDb25zdHJhaW50c0lnbm9yaW5nRmxvYXRzOwotfTsKLQotaW5saW5lIFRhYmxlV3JhcHBl
ckJsb2NrRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6UXVpcmtzKGNvbnN0IFRhYmxlV3JhcHBl
ckJsb2NrRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KQotICAgIDogQmxvY2tG
b3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzKGZvcm1hdHRpbmdDb250ZXh0KQotewotfQotCi19Ci19
Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChUYWJs
ZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LCBpc1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0
dGluZ0NvbnRleHQoKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFibGVX
cmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2Jsb2NrZm9ybWF0dGluZy90YWJsZXdyYXBwZXIvVGFi
bGVXcmFwcGVyQmxvY2tGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKZGVsZXRlZCBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IGVhZGE5MmVkMjhmNzk3ZjNiODI2YjBmYjkxNTQyNWViNzg5YmI5OTUu
LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9ibG9ja2Zvcm1hdHRpbmcvdGFibGV3cmFw
cGVyL1RhYmxlV3JhcHBlckJsb2NrRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCisrKyAvZGV2
L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwot
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIK
LSNpbmNsdWRlICJUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0LmgiCi0KLSNpZiBF
TkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkxheW91dFN0YXRl
LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1PcHRpb25h
bDxMYXlvdXRVbml0PiBUYWJsZVdyYXBwZXJCbG9ja0Zvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6
Om92ZXJyaWRkZW5UYWJsZUhlaWdodChjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KSBjb25z
dAotewotICAgIGlmIChsYXlvdXRTdGF0ZSgpLmluUXVpcmtzTW9kZSgpKSB7Ci0gICAgICAgIC8v
IEluIHF1aXJrcyBtb2RlIGFsd2F5cyB1c2UgdGhlIGNvbnRlbnQgaGVpZ2h0LiBOb3RlIHRoYXQg
dGhlIHRhYmxlcyB3aXRoIGNvbnRlbnQgdGFrZSBjb21wdXRlZCB2YWx1ZXMgaW50byBhY2NvdW50
LgotICAgICAgICByZXR1cm4gZ2VvbWV0cnkoKS5jb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGluZ0Nv
bnRleHRSb290KHRhYmxlQm94KTsKLSAgICB9Ci0gICAgcmV0dXJuIHRhYmxlQm94Lmhhc0luRmxv
d09yRmxvYXRpbmdDaGlsZCgpID8gZ2VvbWV0cnkoKS5jb250ZW50SGVpZ2h0Rm9yRm9ybWF0dGlu
Z0NvbnRleHRSb290KHRhYmxlQm94KSA6IE9wdGlvbmFsPExheW91dFVuaXQ+IHsgfTsKLX0KLQot
fQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvZmxleC9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4L0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uMzE1N2ZkNjk5MDQyODY5N2U4NWQxNzFmNmQzYWM4ZDU4N2FjYWNmOAot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvZmxleC9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuY3BwCkBAIC0wLDAgKzEsMTIzIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZsZXhGb3JtYXR0aW5nQ29u
dGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNs
dWRlICJGbGV4Rm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiSW5saW5lUmVjdC5oIgorI2lu
Y2x1ZGUgIkludmFsaWRhdGlvblN0YXRlLmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnku
aCIKKyNpbmNsdWRlICJMYXlvdXRDaGlsZEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiTGF5b3V0Q29u
dGV4dC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lN
UEwoRmxleEZvcm1hdHRpbmdDb250ZXh0KTsKKworRmxleEZvcm1hdHRpbmdDb250ZXh0OjpGbGV4
Rm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJv
b3QsIEZsZXhGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSkKKyAgICA6IEZvcm1hdHRp
bmdDb250ZXh0KGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgZm9ybWF0dGluZ1N0YXRlKQoreworfQor
Cit2b2lkIEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0SW5GbG93Q29udGVudChJbnZhbGlk
YXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWlu
dHMpCit7CisgICAgY29tcHV0ZUludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JGbGV4SXRlbXMo
KTsKKyAgICBzaXplQW5kUGxhY2VGbGV4SXRlbXMoY29uc3RyYWludHMpOworfQorCitMYXlvdXRV
bml0IEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6dXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdAorewor
ICAgIGF1dG8mIGxpbmVzID0gZm9ybWF0dGluZ1N0YXRlKCkubGluZXMoKTsKKyAgICByZXR1cm4g
TGF5b3V0VW5pdCB7IGxpbmVzLmxhc3QoKS5ib3R0b20oKSAtIGxpbmVzLmZpcnN0KCkudG9wKCkg
fTsKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgRmxl
eEZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKQor
eworICAgIHJldHVybiB7IH07Cit9CisKK3ZvaWQgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpzaXpl
QW5kUGxhY2VGbGV4SXRlbXMoY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25z
dHJhaW50cykKK3sKKyAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5n
U3RhdGUoKTsKKyAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+Z2VvbWV0cnkoKTsKKyAgICBhdXRv
IGZsZXhJdGVtTWFpbkF4aXNTdGFydCA9IGNvbnN0cmFpbnRzLmhvcml6b250YWwubG9naWNhbExl
ZnQ7CisgICAgYXV0byBmbGV4SXRlbU1haW5BeGlzRW5kID0gZmxleEl0ZW1NYWluQXhpc1N0YXJ0
OworICAgIGF1dG8gZmxleEl0ZW1Dcm9zQXhpc1N0YXJ0ID0gY29uc3RyYWludHMudmVydGljYWwu
bG9naWNhbFRvcDsKKyAgICBhdXRvIGZsZXhJdGVtQ3Jvc0F4aXNFbmQgPSBmbGV4SXRlbUNyb3NB
eGlzU3RhcnQ7CisgICAgZm9yIChhdXRvJiBmbGV4SXRlbSA6IGNoaWxkcmVuT2ZUeXBlPENvbnRh
aW5lckJveD4ocm9vdCgpKSkgeworICAgICAgICBBU1NFUlQoZmxleEl0ZW0uZXN0YWJsaXNoZXNG
b3JtYXR0aW5nQ29udGV4dCgpKTsKKyAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMganVzdCBhIHNp
bXBsZSwgbGV0J3MgbGF5b3V0IHRoZSBmbGV4IGl0ZW1zIGFuZCBwbGFjZSB0aGVtIG5leHQgdG8g
ZWFjaCBvdGhlciBzZXR1cC4KKyAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aHMgPSBmb3JtYXR0
aW5nU3RhdGUuaW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChmbGV4SXRlbSk7CisgICAg
ICAgIGF1dG8gZmxleEl0ZW1Mb2dpY2FsV2lkdGggPSBzdGQ6Om1pbihzdGQ6Om1heChpbnRyaW5z
aWNXaWR0aHMtPm1pbmltdW0sIGNvbnN0cmFpbnRzLmhvcml6b250YWwubG9naWNhbFdpZHRoKSwg
aW50cmluc2ljV2lkdGhzLT5tYXhpbXVtKTsKKyAgICAgICAgYXV0byBmbGV4SXRlbUNvbnN0cmFp
bnRzID0gQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50IHsgeyB7IH0sIGZsZXhJdGVtTG9naWNh
bFdpZHRoIH0sIHsgfSB9OworCisgICAgICAgIGF1dG8gaW52YWxpZGF0aW9uU3RhdGUgPSBJbnZh
bGlkYXRpb25TdGF0ZSB7IH07CisgICAgICAgIExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRp
bmdDb250ZXh0KGZsZXhJdGVtLCBsYXlvdXRTdGF0ZSgpKS0+bGF5b3V0SW5GbG93Q29udGVudChp
bnZhbGlkYXRpb25TdGF0ZSwgZmxleEl0ZW1Db25zdHJhaW50cyk7CisKKyAgICAgICAgYXV0byBj
b21wdXRlRmxleEl0ZW1HZW9tZXRyeSA9IFsmXSB7CisgICAgICAgICAgICBhdXRvJiBmbGV4SXRl
bUdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGZsZXhJdGVtKTsKKworICAg
ICAgICAgICAgZmxleEl0ZW1HZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVmdChMYXlvdXRQb2ludCB7
IGZsZXhJdGVtTWFpbkF4aXNFbmQsIGZsZXhJdGVtQ3Jvc0F4aXNTdGFydCB9KTsKKworICAgICAg
ICAgICAgZmxleEl0ZW1HZW9tZXRyeS5zZXRCb3JkZXIoZ2VvbWV0cnkuY29tcHV0ZWRCb3JkZXIo
ZmxleEl0ZW0pKTsKKyAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0UGFkZGluZyhnZW9t
ZXRyeS5jb21wdXRlZFBhZGRpbmcoZmxleEl0ZW0sIGNvbnN0cmFpbnRzLmhvcml6b250YWwubG9n
aWNhbFdpZHRoKSk7CisKKyAgICAgICAgICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2lu
ID0gZ2VvbWV0cnkuY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luKGZsZXhJdGVtLCBjb25zdHJhaW50
cy5ob3Jpem9udGFsKTsKKyAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0SG9yaXpvbnRh
bE1hcmdpbih7IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDBfbHUpLCBj
b21wdXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMF9sdSkgfSk7CisKKyAgICAgICAg
ICAgIGF1dG8gY29tcHV0ZWRWZXJ0aWNhbE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkVmVydGlj
YWxNYXJnaW4oZmxleEl0ZW0sIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAgICAg
ZmxleEl0ZW1HZW9tZXRyeS5zZXRWZXJ0aWNhbE1hcmdpbih7IGNvbXB1dGVkVmVydGljYWxNYXJn
aW4uYmVmb3JlLnZhbHVlT3IoMF9sdSksIGNvbXB1dGVkVmVydGljYWxNYXJnaW4uYWZ0ZXIudmFs
dWVPcigwX2x1KSB9KTsKKworICAgICAgICAgICAgZmxleEl0ZW1HZW9tZXRyeS5zZXRDb250ZW50
Qm94SGVpZ2h0KGdlb21ldHJ5LmNvbnRlbnRIZWlnaHRGb3JGb3JtYXR0aW5nQ29udGV4dFJvb3Qo
ZmxleEl0ZW0pKTsKKyAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0Q29udGVudEJveFdp
ZHRoKGZsZXhJdGVtTG9naWNhbFdpZHRoKTsKKyAgICAgICAgICAgIGZsZXhJdGVtTWFpbkF4aXNF
bmQ9IEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGZsZXhJdGVtR2VvbWV0cnkpLnJpZ2h0KCk7
CisgICAgICAgICAgICBmbGV4SXRlbUNyb3NBeGlzRW5kID0gc3RkOjptYXgoZmxleEl0ZW1Dcm9z
QXhpc0VuZCwgQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QoZmxleEl0ZW1HZW9tZXRyeSkuYm90
dG9tKCkpOworICAgICAgICB9OworICAgICAgICBjb21wdXRlRmxleEl0ZW1HZW9tZXRyeSgpOwor
ICAgIH0KKyAgICBhdXRvIGZsZXhMaW5lID0gSW5saW5lUmVjdCB7IGZsZXhJdGVtQ3Jvc0F4aXNT
dGFydCwgZmxleEl0ZW1NYWluQXhpc1N0YXJ0LCBmbGV4SXRlbU1haW5BeGlzRW5kIC0gZmxleEl0
ZW1NYWluQXhpc1N0YXJ0LCBmbGV4SXRlbUNyb3NBeGlzRW5kIC0gZmxleEl0ZW1Dcm9zQXhpc1N0
YXJ0IH07CisgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmUoZmxleExpbmUpOworfQorCit2b2lk
IEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUludHJpbnNpY1dpZHRoQ29uc3RyYWludHNG
b3JGbGV4SXRlbXMoKQoreworICAgIGF1dG8mIGZvcm1hdHRpbmdTdGF0ZSA9IHRoaXMtPmZvcm1h
dHRpbmdTdGF0ZSgpOworICAgIGF1dG8gZ2VvbWV0cnkgPSB0aGlzLT5nZW9tZXRyeSgpOworICAg
IGZvciAoYXV0byYgZmxleEl0ZW0gOiBjaGlsZHJlbk9mVHlwZTxDb250YWluZXJCb3g+KHJvb3Qo
KSkpIHsKKyAgICAgICAgaWYgKGZvcm1hdHRpbmdTdGF0ZS5pbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzRm9yQm94KGZsZXhJdGVtKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3Jt
YXR0aW5nU3RhdGUuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChmbGV4SXRlbSwg
Z2VvbWV0cnkuaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyhmbGV4SXRlbSkpOworICAgIH0KK30K
KworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvZmxleC9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuaCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleC9GbGV4Rm9ybWF0dGluZ0NvbnRleHQu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi44MWEwZTQwNjlmZmQxMDI5Njg4Y2M1MTZjZmQ5NTkwY2NjOTM2NTJiCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9mbGV4L0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgor
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
KyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhU
KQorCisjaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkZvcm1hdHRp
bmdDb250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgSW52YWxpZGF0aW9uU3RhdGU7Cisv
LyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGxheW91dCBsb2dpYyBmb3IgZmxleCBmb3JtYXR0
aW5nIGNvbnRleHRzLgorLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1mbGV4Ym94LTEvCitj
bGFzcyBGbGV4Rm9ybWF0dGluZ0NvbnRleHQgZmluYWwgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRl
eHQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoRmxleEZvcm1hdHRpbmdDb250ZXh0KTsK
K3B1YmxpYzoKKyAgICBGbGV4Rm9ybWF0dGluZ0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBm
b3JtYXR0aW5nQ29udGV4dFJvb3QsIEZsZXhGb3JtYXR0aW5nU3RhdGUmKTsKKyAgICB2b2lkIGxh
eW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0Zv
ckluRmxvd0NvbnRlbnQmKSBvdmVycmlkZTsKKyAgICBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVp
Z2h0KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGNv
bXB1dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpIG92ZXJyaWRlOworCitwcml2YXRlOgor
ICAgIC8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBwb3NpdGlvbmluZyBhbmQgc2l6aW5nIGZvciBm
bGV4IGl0ZW1zLgorICAgIGNsYXNzIEdlb21ldHJ5IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0
OjpHZW9tZXRyeSB7CisgICAgcHVibGljOgorICAgICAgICBHZW9tZXRyeShjb25zdCBGbGV4Rm9y
bWF0dGluZ0NvbnRleHQmKTsKKworICAgICAgICBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGlu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3QgQ29udGFpbmVyQm94Jik7CisKKyAgICBwcml2
YXRlOgorICAgICAgICBjb25zdCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250
ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8RmxleEZvcm1hdHRpbmdDb250ZXh0PihGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZvcm1hdHRpbmdDb250ZXh0KCkpOyB9CisgICAgfTsK
KyAgICBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29uc3QgeyBy
ZXR1cm4gR2VvbWV0cnkoKnRoaXMpOyB9CisKKyAgICB2b2lkIHNpemVBbmRQbGFjZUZsZXhJdGVt
cyhjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsKKyAgICB2b2lkIGNvbXB1dGVJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzRm9yRmxleEl0ZW1zKCk7CisKKyAgICBjb25zdCBGbGV4
Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBkb3duY2Fz
dDxGbGV4Rm9ybWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRl
KCkpOyB9CisgICAgRmxleEZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRlKCkgeyByZXR1
cm4gZG93bmNhc3Q8RmxleEZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1h
dHRpbmdTdGF0ZSgpKTsgfQorfTsKKworaW5saW5lIEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnk6Okdlb21ldHJ5KGNvbnN0IEZsZXhGb3JtYXR0aW5nQ29udGV4dCYgZmxleEZvcm1hdHRp
bmdDb250ZXh0KQorICAgIDogRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5KGZsZXhGb3JtYXR0
aW5nQ29udGV4dCkKK3sKK30KKworfQorfQorCitTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9V
VF9GT1JNQVRUSU5HX0NPTlRFWFQoRmxleEZvcm1hdHRpbmdDb250ZXh0LCBpc0ZsZXhGb3JtYXR0
aW5nQ29udGV4dCgpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleC9GbGV4Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXgvRmxleEZv
cm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRjN2M4ZGQwOTgwOWQxZDBi
NTg0YWJmZjc4ZGQxNzkxYmZmNDY4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXgvRmxleEZvcm1hdHRpbmdDb250ZXh0R2Vv
bWV0cnkuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
CisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisg
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZ
T1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsZXhGb3JtYXR0aW5nU3RhdGUu
aCIKKyNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIkxheW91dENvbnRl
eHQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0Zvcm1h
dHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIEZsZXhGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnk6OmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3QgQ29udGFpbmVy
Qm94JiBmbGV4SXRlbSkKK3sKKyAgICBhdXRvIGZpeGVkTWFyZ2luQm9yZGVyQW5kUGFkZGluZyA9
IFsmXShhdXRvJiBsYXlvdXRCb3gpIHsKKyAgICAgICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3gu
c3R5bGUoKTsKKyAgICAgICAgcmV0dXJuIGZpeGVkVmFsdWUoc3R5bGUubWFyZ2luU3RhcnQoKSku
dmFsdWVPcigwKQorICAgICAgICAgICAgKyBMYXlvdXRVbml0IHsgc3R5bGUuYm9yZGVyTGVmdFdp
ZHRoKCkgfQorICAgICAgICAgICAgKyBmaXhlZFZhbHVlKHN0eWxlLnBhZGRpbmdMZWZ0KCkpLnZh
bHVlT3IoMCkKKyAgICAgICAgICAgICsgZml4ZWRWYWx1ZShzdHlsZS5wYWRkaW5nUmlnaHQoKSku
dmFsdWVPcigwKQorICAgICAgICAgICAgKyBMYXlvdXRVbml0IHsgc3R5bGUuYm9yZGVyUmlnaHRX
aWR0aCgpIH0KKyAgICAgICAgICAgICsgZml4ZWRWYWx1ZShzdHlsZS5tYXJnaW5FbmQoKSkudmFs
dWVPcigwKTsKKyAgICB9OworCisgICAgYXV0byBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMgPSBbJl0oKSAtPiBJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIHsKKyAgICAgICAgYXV0
byBsb2dpY2FsV2lkdGggPSBmbGV4SXRlbS5zdHlsZSgpLmxvZ2ljYWxXaWR0aCgpOworICAgICAg
ICAvLyBNaW5pbXVtL21heGltdW0gd2lkdGggY2FuJ3QgYmUgZGVwZW5kaW5nIG9uIHRoZSBjb250
YWluaW5nIGJsb2NrJ3Mgd2lkdGguCisgICAgICAgIGF1dG8gbmVlZHNSZXNvbHZlZENvbnRhaW5p
bmdCbG9ja1dpZHRoID0gbG9naWNhbFdpZHRoLmlzQ2FsY3VsYXRlZCgpIHx8IGxvZ2ljYWxXaWR0
aC5pc1BlcmNlbnQoKSB8fCBsb2dpY2FsV2lkdGguaXNSZWxhdGl2ZSgpOworICAgICAgICBpZiAo
bmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRoKQorICAgICAgICAgICAgcmV0dXJuIHsg
fTsKKworICAgICAgICBpZiAoYXV0byB3aWR0aCA9IGZpeGVkVmFsdWUobG9naWNhbFdpZHRoKSkK
KyAgICAgICAgICAgIHJldHVybiB7ICp3aWR0aCwgKndpZHRoIH07CisKKyAgICAgICAgQVNTRVJU
KGZsZXhJdGVtLmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7CisgICAgICAgIGF1dG8g
aW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRp
bmdDb250ZXh0KGZsZXhJdGVtLCBsYXlvdXRTdGF0ZSgpKS0+Y29tcHV0ZWRJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzKCk7CisgICAgICAgIGlmIChsb2dpY2FsV2lkdGguaXNNaW5Db250ZW50KCkp
CisgICAgICAgICAgICByZXR1cm4geyBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0s
IGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWluaW11bSB9OworICAgICAgICBpZiAobG9naWNh
bFdpZHRoLmlzTWF4Q29udGVudCgpKQorICAgICAgICAgICAgcmV0dXJuIHsgaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cy5tYXhpbXVtLCBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0g
fTsKKyAgICAgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7CisgICAgfTsKKyAg
ICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBjb25zdHJhaW5CeU1pbk1heFdpZHRo
KGZsZXhJdGVtLCBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKSk7CisgICAgaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQoZml4ZWRNYXJnaW5Cb3JkZXJBbmRQYWRkaW5n
KGZsZXhJdGVtKSk7CisgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Cit9CisK
K30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2ZsZXgvRmxleEZvcm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXgvRmxleEZvcm1hdHRpbmdTdGF0ZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uZDU5ZmM4NWEwMzg1MmQzMzUyNjEzODQwZjMxMjJjNzMzYzU0ZmFhMAotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
ZmxleC9GbGV4Rm9ybWF0dGluZ1N0YXRlLmNwcApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisg
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZsZXhGb3JtYXR0aW5nU3RhdGUuaCIK
KworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSA8d3Rm
L0lzb01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExh
eW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChGbGV4Rm9ybWF0dGluZ1N0YXRl
KTsKKworRmxleEZvcm1hdHRpbmdTdGF0ZTo6RmxleEZvcm1hdHRpbmdTdGF0ZShSZWY8RmxvYXRp
bmdTdGF0ZT4mJiBmbG9hdGluZ1N0YXRlLCBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCisgICAg
OiBGb3JtYXR0aW5nU3RhdGUoV1RGTW92ZShmbG9hdGluZ1N0YXRlKSwgVHlwZTo6RmxleCwgbGF5
b3V0U3RhdGUpCit7Cit9CisKK0ZsZXhGb3JtYXR0aW5nU3RhdGU6On5GbGV4Rm9ybWF0dGluZ1N0
YXRlKCkKK3sKK30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXgvRmxleEZvcm1hdHRpbmdTdGF0ZS5oIGIvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4L0ZsZXhGb3JtYXR0aW5n
U3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5hMDYzYjlkYTJhNWI4ZGMyNzAyMDg3OTRhNDgzNjU0NDE2MDll
M2EzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9mbGV4L0ZsZXhGb3JtYXR0aW5nU3RhdGUuaApAQCAtMCwwICsxLDU1IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09O
VEVYVCkKKworI2luY2x1ZGUgIkZvcm1hdHRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIklubGluZVJl
Y3QuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBGbGV4Rm9ybWF0dGluZ1N0YXRlIDogcHVibGlj
IEZvcm1hdHRpbmdTdGF0ZSB7CisgICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChGbGV4Rm9ybWF0
dGluZ1N0YXRlKTsKK3B1YmxpYzoKKyAgICBGbGV4Rm9ybWF0dGluZ1N0YXRlKFJlZjxGbG9hdGlu
Z1N0YXRlPiYmLCBMYXlvdXRTdGF0ZSYpOworICAgIH5GbGV4Rm9ybWF0dGluZ1N0YXRlKCk7CisK
KyAgICBjb25zdCBhdXRvJiBsaW5lcygpIGNvbnN0IHsgcmV0dXJuIG1fbGluZXM7IH0KKyAgICB2
b2lkIGFkZExpbmUoY29uc3QgSW5saW5lUmVjdCYgbGluZSkgeyBtX2xpbmVzLmFwcGVuZChsaW5l
KTsgfQorCitwcml2YXRlOgorICAgIFZlY3RvcjxJbmxpbmVSZWN0PiBtX2xpbmVzOworfTsKKwor
fQorfQorCitTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX1NUQVRFKEZs
ZXhGb3JtYXR0aW5nU3RhdGUsIGlzRmxleEZvcm1hdHRpbmdTdGF0ZSgpKQorCisjZW5kaWYKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZv
cm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvZmxleGZvcm1hdHRpbmcvRmxleEZvcm1hdHRpbmdDb250ZXh0
LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1N2ZkNjk5MDQyODY5N2U4NWQx
NzFmNmQzYWM4ZDU4N2FjYWNmOC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhm
b3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwx
MjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6
Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
Ci0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJG
bGV4Rm9ybWF0dGluZ0NvbnRleHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19D
T05URVhUKQotCi0jaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIklu
bGluZVJlY3QuaCIKLSNpbmNsdWRlICJJbnZhbGlkYXRpb25TdGF0ZS5oIgotI2luY2x1ZGUgIkxh
eW91dEJveEdlb21ldHJ5LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q2hpbGRJdGVyYXRvci5oIgotI2lu
Y2x1ZGUgIkxheW91dENvbnRleHQuaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5o
PgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0Vf
SVNPX0FMTE9DQVRFRF9JTVBMKEZsZXhGb3JtYXR0aW5nQ29udGV4dCk7Ci0KLUZsZXhGb3JtYXR0
aW5nQ29udGV4dDo6RmxleEZvcm1hdHRpbmdDb250ZXh0KGNvbnN0IENvbnRhaW5lckJveCYgZm9y
bWF0dGluZ0NvbnRleHRSb290LCBGbGV4Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUp
Ci0gICAgOiBGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRp
bmdTdGF0ZSkKLXsKLX0KLQotdm9pZCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dEluRmxv
d0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0Nv
bnRlbnQmIGNvbnN0cmFpbnRzKQotewotICAgIGNvbXB1dGVJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzRm9yRmxleEl0ZW1zKCk7Ci0gICAgc2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0cmFpbnRz
KTsKLX0KLQotTGF5b3V0VW5pdCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OnVzZWRDb250ZW50SGVp
Z2h0KCkgY29uc3QKLXsKLSAgICBhdXRvJiBsaW5lcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmxpbmVz
KCk7Ci0gICAgcmV0dXJuIExheW91dFVuaXQgeyBsaW5lcy5sYXN0KCkuYm90dG9tKCkgLSBsaW5l
cy5maXJzdCgpLnRvcCgpIH07Ci19Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzIEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzKCkKLXsKLSAgICByZXR1cm4geyB9OwotfQotCi12b2lkIEZsZXhGb3JtYXR0
aW5nQ29udGV4dDo6c2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5G
bG93Q29udGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0g
dGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgYXV0byBnZW9tZXRyeSA9IHRoaXMtPmdlb21l
dHJ5KCk7Ci0gICAgYXV0byBmbGV4SXRlbU1haW5BeGlzU3RhcnQgPSBjb25zdHJhaW50cy5ob3Jp
em9udGFsLmxvZ2ljYWxMZWZ0OwotICAgIGF1dG8gZmxleEl0ZW1NYWluQXhpc0VuZCA9IGZsZXhJ
dGVtTWFpbkF4aXNTdGFydDsKLSAgICBhdXRvIGZsZXhJdGVtQ3Jvc0F4aXNTdGFydCA9IGNvbnN0
cmFpbnRzLnZlcnRpY2FsLmxvZ2ljYWxUb3A7Ci0gICAgYXV0byBmbGV4SXRlbUNyb3NBeGlzRW5k
ID0gZmxleEl0ZW1Dcm9zQXhpc1N0YXJ0OwotICAgIGZvciAoYXV0byYgZmxleEl0ZW0gOiBjaGls
ZHJlbk9mVHlwZTxDb250YWluZXJCb3g+KHJvb3QoKSkpIHsKLSAgICAgICAgQVNTRVJUKGZsZXhJ
dGVtLmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSk7Ci0gICAgICAgIC8vIEZJWE1FOiBU
aGlzIGlzIGp1c3QgYSBzaW1wbGUsIGxldCdzIGxheW91dCB0aGUgZmxleCBpdGVtcyBhbmQgcGxh
Y2UgdGhlbSBuZXh0IHRvIGVhY2ggb3RoZXIgc2V0dXAuCi0gICAgICAgIGF1dG8gaW50cmluc2lj
V2lkdGhzID0gZm9ybWF0dGluZ1N0YXRlLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3go
ZmxleEl0ZW0pOwotICAgICAgICBhdXRvIGZsZXhJdGVtTG9naWNhbFdpZHRoID0gc3RkOjptaW4o
c3RkOjptYXgoaW50cmluc2ljV2lkdGhzLT5taW5pbXVtLCBjb25zdHJhaW50cy5ob3Jpem9udGFs
LmxvZ2ljYWxXaWR0aCksIGludHJpbnNpY1dpZHRocy0+bWF4aW11bSk7Ci0gICAgICAgIGF1dG8g
ZmxleEl0ZW1Db25zdHJhaW50cyA9IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCB7IHsgeyB9
LCBmbGV4SXRlbUxvZ2ljYWxXaWR0aCB9LCB7IH0gfTsKLQotICAgICAgICBhdXRvIGludmFsaWRh
dGlvblN0YXRlID0gSW52YWxpZGF0aW9uU3RhdGUgeyB9OwotICAgICAgICBMYXlvdXRDb250ZXh0
OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChmbGV4SXRlbSwgbGF5b3V0U3RhdGUoKSktPmxheW91
dEluRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGZsZXhJdGVtQ29uc3RyYWludHMpOwot
Ci0gICAgICAgIGF1dG8gY29tcHV0ZUZsZXhJdGVtR2VvbWV0cnkgPSBbJl0gewotICAgICAgICAg
ICAgYXV0byYgZmxleEl0ZW1HZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZS5ib3hHZW9tZXRyeShm
bGV4SXRlbSk7Ci0KLSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0TG9naWNhbFRvcExl
ZnQoTGF5b3V0UG9pbnQgeyBmbGV4SXRlbU1haW5BeGlzRW5kLCBmbGV4SXRlbUNyb3NBeGlzU3Rh
cnQgfSk7Ci0KLSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0Qm9yZGVyKGdlb21ldHJ5
LmNvbXB1dGVkQm9yZGVyKGZsZXhJdGVtKSk7Ci0gICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5
LnNldFBhZGRpbmcoZ2VvbWV0cnkuY29tcHV0ZWRQYWRkaW5nKGZsZXhJdGVtLCBjb25zdHJhaW50
cy5ob3Jpem9udGFsLmxvZ2ljYWxXaWR0aCkpOwotCi0gICAgICAgICAgICBhdXRvIGNvbXB1dGVk
SG9yaXpvbnRhbE1hcmdpbiA9IGdlb21ldHJ5LmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihmbGV4
SXRlbSwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAgICBmbGV4SXRlbUdlb21l
dHJ5LnNldEhvcml6b250YWxNYXJnaW4oeyBjb21wdXRlZEhvcml6b250YWxNYXJnaW4uc3RhcnQu
dmFsdWVPcigwX2x1KSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52YWx1ZU9yKDBfbHUp
IH0pOwotCi0gICAgICAgICAgICBhdXRvIGNvbXB1dGVkVmVydGljYWxNYXJnaW4gPSBnZW9tZXRy
eS5jb21wdXRlZFZlcnRpY2FsTWFyZ2luKGZsZXhJdGVtLCBjb25zdHJhaW50cy5ob3Jpem9udGFs
KTsKLSAgICAgICAgICAgIGZsZXhJdGVtR2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyBjb21w
dXRlZFZlcnRpY2FsTWFyZ2luLmJlZm9yZS52YWx1ZU9yKDBfbHUpLCBjb21wdXRlZFZlcnRpY2Fs
TWFyZ2luLmFmdGVyLnZhbHVlT3IoMF9sdSkgfSk7Ci0KLSAgICAgICAgICAgIGZsZXhJdGVtR2Vv
bWV0cnkuc2V0Q29udGVudEJveEhlaWdodChnZW9tZXRyeS5jb250ZW50SGVpZ2h0Rm9yRm9ybWF0
dGluZ0NvbnRleHRSb290KGZsZXhJdGVtKSk7Ci0gICAgICAgICAgICBmbGV4SXRlbUdlb21ldHJ5
LnNldENvbnRlbnRCb3hXaWR0aChmbGV4SXRlbUxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgICAgICBm
bGV4SXRlbU1haW5BeGlzRW5kPSBCb3hHZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChmbGV4SXRlbUdl
b21ldHJ5KS5yaWdodCgpOwotICAgICAgICAgICAgZmxleEl0ZW1Dcm9zQXhpc0VuZCA9IHN0ZDo6
bWF4KGZsZXhJdGVtQ3Jvc0F4aXNFbmQsIEJveEdlb21ldHJ5Ojpib3JkZXJCb3hSZWN0KGZsZXhJ
dGVtR2VvbWV0cnkpLmJvdHRvbSgpKTsKLSAgICAgICAgfTsKLSAgICAgICAgY29tcHV0ZUZsZXhJ
dGVtR2VvbWV0cnkoKTsKLSAgICB9Ci0gICAgYXV0byBmbGV4TGluZSA9IElubGluZVJlY3QgeyBm
bGV4SXRlbUNyb3NBeGlzU3RhcnQsIGZsZXhJdGVtTWFpbkF4aXNTdGFydCwgZmxleEl0ZW1NYWlu
QXhpc0VuZCAtIGZsZXhJdGVtTWFpbkF4aXNTdGFydCwgZmxleEl0ZW1Dcm9zQXhpc0VuZCAtIGZs
ZXhJdGVtQ3Jvc0F4aXNTdGFydCB9OwotICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lKGZsZXhM
aW5lKTsKLX0KLQotdm9pZCBGbGV4Rm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzRm9yRmxleEl0ZW1zKCkKLXsKLSAgICBhdXRvJiBmb3JtYXR0aW5nU3Rh
dGUgPSB0aGlzLT5mb3JtYXR0aW5nU3RhdGUoKTsKLSAgICBhdXRvIGdlb21ldHJ5ID0gdGhpcy0+
Z2VvbWV0cnkoKTsKLSAgICBmb3IgKGF1dG8mIGZsZXhJdGVtIDogY2hpbGRyZW5PZlR5cGU8Q29u
dGFpbmVyQm94Pihyb290KCkpKSB7Ci0gICAgICAgIGlmIChmb3JtYXR0aW5nU3RhdGUuaW50cmlu
c2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChmbGV4SXRlbSkpCi0gICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgZm9ybWF0dGluZ1N0YXRlLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHNG
b3JCb3goZmxleEl0ZW0sIGdlb21ldHJ5LmludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoZmxleEl0
ZW0pKTsKLSAgICB9Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0
aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9m
bGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggODFhMGU0MDY5ZmZkMTAyOTY4OGNjNTE2Y2ZkOTU5MGNjYzkzNjUyYi4uMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5n
Q29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNw
cmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNp
bmNsdWRlICJGbGV4Rm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRl
eHQuaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsK
LW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKLS8vIFRoaXMg
Y2xhc3MgaW1wbGVtZW50cyB0aGUgbGF5b3V0IGxvZ2ljIGZvciBmbGV4IGZvcm1hdHRpbmcgY29u
dGV4dHMuCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWZsZXhib3gtMS8KLWNsYXNzIEZs
ZXhGb3JtYXR0aW5nQ29udGV4dCBmaW5hbCA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dCB7Ci0g
ICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChGbGV4Rm9ybWF0dGluZ0NvbnRleHQpOwotcHVibGlj
OgotICAgIEZsZXhGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRp
bmdDb250ZXh0Um9vdCwgRmxleEZvcm1hdHRpbmdTdGF0ZSYpOwotICAgIHZvaWQgbGF5b3V0SW5G
bG93Q29udGVudChJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93
Q29udGVudCYpIG92ZXJyaWRlOwotICAgIExheW91dFVuaXQgdXNlZENvbnRlbnRIZWlnaHQoKSBj
b25zdCBvdmVycmlkZTsKLQotICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJ
bnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgLy8g
VGhpcyBjbGFzcyBpbXBsZW1lbnRzIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcgZm9yIGZsZXggaXRl
bXMuCi0gICAgY2xhc3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21l
dHJ5IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEdlb21ldHJ5KGNvbnN0IEZsZXhGb3JtYXR0aW5n
Q29udGV4dCYpOwotCi0gICAgICAgIEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgaW50cmluc2lj
V2lkdGhDb25zdHJhaW50cyhjb25zdCBDb250YWluZXJCb3gmKTsKLQotICAgIHByaXZhdGU6Ci0g
ICAgICAgIGNvbnN0IEZsZXhGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBj
b25zdCB7IHJldHVybiBkb3duY2FzdDxGbGV4Rm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdD
b250ZXh0OjpHZW9tZXRyeTo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KLSAgICB9OwotICAgIEZs
ZXhGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2VvbWV0cnkoKSBjb25zdCB7IHJldHVybiBH
ZW9tZXRyeSgqdGhpcyk7IH0KLQotICAgIHZvaWQgc2l6ZUFuZFBsYWNlRmxleEl0ZW1zKGNvbnN0
IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOwotICAgIHZvaWQgY29tcHV0ZUludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHNGb3JGbGV4SXRlbXMoKTsKLQotICAgIGNvbnN0IEZsZXhGb3JtYXR0
aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PEZsZXhG
b3JtYXR0aW5nU3RhdGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0K
LSAgICBGbGV4Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3du
Y2FzdDxGbGV4Rm9ybWF0dGluZ1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0
YXRlKCkpOyB9Ci19OwotCi1pbmxpbmUgRmxleEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6
R2VvbWV0cnkoY29uc3QgRmxleEZvcm1hdHRpbmdDb250ZXh0JiBmbGV4Rm9ybWF0dGluZ0NvbnRl
eHQpCi0gICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkoZmxleEZvcm1hdHRpbmdDb250
ZXh0KQotewotfQotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1B
VFRJTkdfQ09OVEVYVChGbGV4Rm9ybWF0dGluZ0NvbnRleHQsIGlzRmxleEZvcm1hdHRpbmdDb250
ZXh0KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ0NvbnRleHRHZW9tZXRy
eS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3Jt
YXR0aW5nL0ZsZXhGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcApkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggZGM3YzhkZDA5ODA5ZDFkMGI1ODRhYmZmNzhkZDE3OTFiZmY0Njg5OC4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0
aW5nQ29udGV4dEdlb21ldHJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgot
ICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBB
TkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRmxleEZvcm1hdHRpbmdD
b250ZXh0LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2lu
Y2x1ZGUgIkZsZXhGb3JtYXR0aW5nU3RhdGUuaCIKLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4
dC5oIgotI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewot
bmFtZXNwYWNlIExheW91dCB7Ci0KLUZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENv
bnN0cmFpbnRzIEZsZXhGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMoY29uc3QgQ29udGFpbmVyQm94JiBmbGV4SXRlbSkKLXsKLSAgICBhdXRvIGZp
eGVkTWFyZ2luQm9yZGVyQW5kUGFkZGluZyA9IFsmXShhdXRvJiBsYXlvdXRCb3gpIHsKLSAgICAg
ICAgYXV0byYgc3R5bGUgPSBsYXlvdXRCb3guc3R5bGUoKTsKLSAgICAgICAgcmV0dXJuIGZpeGVk
VmFsdWUoc3R5bGUubWFyZ2luU3RhcnQoKSkudmFsdWVPcigwKQotICAgICAgICAgICAgKyBMYXlv
dXRVbml0IHsgc3R5bGUuYm9yZGVyTGVmdFdpZHRoKCkgfQotICAgICAgICAgICAgKyBmaXhlZFZh
bHVlKHN0eWxlLnBhZGRpbmdMZWZ0KCkpLnZhbHVlT3IoMCkKLSAgICAgICAgICAgICsgZml4ZWRW
YWx1ZShzdHlsZS5wYWRkaW5nUmlnaHQoKSkudmFsdWVPcigwKQotICAgICAgICAgICAgKyBMYXlv
dXRVbml0IHsgc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCgpIH0KLSAgICAgICAgICAgICsgZml4ZWRW
YWx1ZShzdHlsZS5tYXJnaW5FbmQoKSkudmFsdWVPcigwKTsKLSAgICB9OwotCi0gICAgYXV0byBj
b21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgPSBbJl0oKSAtPiBJbnRyaW5zaWNXaWR0
aENvbnN0cmFpbnRzIHsKLSAgICAgICAgYXV0byBsb2dpY2FsV2lkdGggPSBmbGV4SXRlbS5zdHls
ZSgpLmxvZ2ljYWxXaWR0aCgpOwotICAgICAgICAvLyBNaW5pbXVtL21heGltdW0gd2lkdGggY2Fu
J3QgYmUgZGVwZW5kaW5nIG9uIHRoZSBjb250YWluaW5nIGJsb2NrJ3Mgd2lkdGguCi0gICAgICAg
IGF1dG8gbmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dpZHRoID0gbG9naWNhbFdpZHRoLmlz
Q2FsY3VsYXRlZCgpIHx8IGxvZ2ljYWxXaWR0aC5pc1BlcmNlbnQoKSB8fCBsb2dpY2FsV2lkdGgu
aXNSZWxhdGl2ZSgpOwotICAgICAgICBpZiAobmVlZHNSZXNvbHZlZENvbnRhaW5pbmdCbG9ja1dp
ZHRoKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgICAgICBpZiAoYXV0byB3aWR0aCA9
IGZpeGVkVmFsdWUobG9naWNhbFdpZHRoKSkKLSAgICAgICAgICAgIHJldHVybiB7ICp3aWR0aCwg
KndpZHRoIH07Ci0KLSAgICAgICAgQVNTRVJUKGZsZXhJdGVtLmVzdGFibGlzaGVzRm9ybWF0dGlu
Z0NvbnRleHQoKSk7Ci0gICAgICAgIGF1dG8gaW50cmluc2ljV2lkdGhDb25zdHJhaW50cyA9IExh
eW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGZsZXhJdGVtLCBsYXlvdXRTdGF0
ZSgpKS0+Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGlmIChs
b2dpY2FsV2lkdGguaXNNaW5Db250ZW50KCkpCi0gICAgICAgICAgICByZXR1cm4geyBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzLm1pbmltdW0sIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHMubWlu
aW11bSB9OwotICAgICAgICBpZiAobG9naWNhbFdpZHRoLmlzTWF4Q29udGVudCgpKQotICAgICAg
ICAgICAgcmV0dXJuIHsgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5tYXhpbXVtLCBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzLm1heGltdW0gfTsKLSAgICAgICAgcmV0dXJuIGludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHM7Ci0gICAgfTsKLSAgICBhdXRvIGludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMgPSBjb25zdHJhaW5CeU1pbk1heFdpZHRoKGZsZXhJdGVtLCBjb21wdXRlZEludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMoKSk7Ci0gICAgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQo
Zml4ZWRNYXJnaW5Cb3JkZXJBbmRQYWRkaW5nKGZsZXhJdGVtKSk7Ci0gICAgcmV0dXJuIGludHJp
bnNpY1dpZHRoQ29uc3RyYWludHM7Ci19Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0Zs
ZXhGb3JtYXR0aW5nU3RhdGUuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGluZ1N0YXRlLmNwcApkZWxldGVkIGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5ZmM4NWEwMzg1MmQzMzUyNjEzODQwZjMxMjJjNzMzYzU0
ZmFhMC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhG
b3JtYXR0aW5nU3RhdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
Ci0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgot
ICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJGbGV4Rm9ybWF0dGluZ1N0YXRl
LmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUg
PHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFj
ZSBMYXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoRmxleEZvcm1hdHRpbmdT
dGF0ZSk7Ci0KLUZsZXhGb3JtYXR0aW5nU3RhdGU6OkZsZXhGb3JtYXR0aW5nU3RhdGUoUmVmPEZs
b2F0aW5nU3RhdGU+JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQot
ICAgIDogRm9ybWF0dGluZ1N0YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OkZsZXgs
IGxheW91dFN0YXRlKQotewotfQotCi1GbGV4Rm9ybWF0dGluZ1N0YXRlOjp+RmxleEZvcm1hdHRp
bmdTdGF0ZSgpCi17Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9mbGV4Zm9ybWF0dGluZy9GbGV4Rm9ybWF0dGlu
Z1N0YXRlLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhm
b3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggYTA2M2I5ZGEyYTViOGRjMjcwMjA4Nzk0YTQ4MzY1NDQxNjA5ZTNhMy4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2ZsZXhmb3JtYXR0aW5nL0ZsZXhGb3JtYXR0aW5nU3RhdGUu
aAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9u
Y2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAi
Rm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiSW5saW5lUmVjdC5oIgotI2luY2x1ZGUgPHd0
Zi9Jc29NYWxsb2MuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7
Ci0KLWNsYXNzIEZsZXhGb3JtYXR0aW5nU3RhdGUgOiBwdWJsaWMgRm9ybWF0dGluZ1N0YXRlIHsK
LSAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKEZsZXhGb3JtYXR0aW5nU3RhdGUpOwotcHVibGlj
OgotICAgIEZsZXhGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYsIExheW91dFN0
YXRlJik7Ci0gICAgfkZsZXhGb3JtYXR0aW5nU3RhdGUoKTsKLQotICAgIGNvbnN0IGF1dG8mIGxp
bmVzKCkgY29uc3QgeyByZXR1cm4gbV9saW5lczsgfQotICAgIHZvaWQgYWRkTGluZShjb25zdCBJ
bmxpbmVSZWN0JiBsaW5lKSB7IG1fbGluZXMuYXBwZW5kKGxpbmUpOyB9Ci0KLXByaXZhdGU6Ci0g
ICAgVmVjdG9yPElubGluZVJlY3Q+IG1fbGluZXM7Ci19OwotCi19Ci19Ci0KLVNQRUNJQUxJWkVf
VFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUoRmxleEZvcm1hdHRpbmdTdGF0ZSwg
aXNGbGV4Rm9ybWF0dGluZ1N0YXRlKCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5lQ29udGVudEJyZWFr
ZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUv
SW5saW5lQ29udGVudEJyZWFrZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjk0MGE2ZGE5ZjljMTRmMDE0NDUx
ZmFkYTI0NmZiMGViY2QxMmQyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVDb250ZW50QnJlYWtlci5jcHAK
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
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVD
b250ZW50QnJlYWtlci5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9pbmxpbmUvSW5saW5lQ29udGVudEJyZWFrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41ZDJkNGQ2Y2U4YzE4
OTMxZDVmZThiNTBhMzczMDFkNGFjYThlN2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5lQ29udGVudEJyZWFr
ZXIuaApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRVbml0
cy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFJlbmRlclN0eWxlOworCituYW1l
c3BhY2UgTGF5b3V0IHsKKworY2xhc3MgSW5saW5lSXRlbTsKK3N0cnVjdCBPdmVyZmxvd2luZ1Rl
eHRDb250ZW50OworCitjbGFzcyBJbmxpbmVDb250ZW50QnJlYWtlciB7CitwdWJsaWM6CisgICAg
c3RydWN0IFBhcnRpYWxSdW4geworICAgICAgICBzaXplX3QgbGVuZ3RoIHsgMCB9OworICAgICAg
ICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8
SW5saW5lTGF5b3V0VW5pdD4gaHlwaGVuV2lkdGggeyB9OworICAgIH07CisgICAgZW51bSBjbGFz
cyBJc0VuZE9mTGluZSB7IE5vLCBZZXMgfTsKKyAgICBzdHJ1Y3QgUmVzdWx0IHsKKyAgICAgICAg
ZW51bSBjbGFzcyBBY3Rpb24geworICAgICAgICAgICAgS2VlcCwgLy8gS2VlcCBjb250ZW50IG9u
IHRoZSBjdXJyZW50IGxpbmUuCisgICAgICAgICAgICBCcmVhaywgLy8gUGFydGlhbCBjb250ZW50
IGlzIG9uIHRoZSBjdXJyZW50IGxpbmUuCisgICAgICAgICAgICBXcmFwLCAvLyBDb250ZW50IGlz
IHdyYXBwZWQgdG8gdGhlIG5leHQgbGluZS4KKyAgICAgICAgICAgIFdyYXBXaXRoSHlwaGVuLCAv
LyBDb250ZW50IGlzIHdyYXBwZWQgdG8gdGhlIG5leHQgbGluZSBhbmQgdGhlIGN1cnJlbnQgbGlu
ZSBlbmRzIHdpdGggYSB2aXNpYmxlIGh5cGhlbi4KKyAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50
IGNvbnRlbnQgb3ZlcmZsb3dzIGFuZCBjYW4ndCBnZXQgYnJva2VuIHVwIGludG8gc21hbGxlciBi
aXRzLgorICAgICAgICAgICAgUmV2ZXJ0VG9MYXN0V3JhcE9wcG9ydHVuaXR5LCAvLyBUaGUgY29u
dGVudCBuZWVkcyB0byBiZSByZXZlcnRlZCBiYWNrIHRvIHRoZSBsYXN0IHdyYXAgb3Bwb3J0dW5p
dHkuCisgICAgICAgICAgICBSZXZlcnRUb0xhc3ROb25PdmVyZmxvd2luZ1dyYXBPcHBvcnR1bml0
eSAvLyBUaGUgY29udGVudCBuZWVkcyB0byBiZSByZXZlcnRlZCBiYWNrIHRvIGEgd3JhcCBvcHBv
cnR1bml0eSB0aGF0IHN0aWxsIGZpdHMgdGhlIGxpbmUuCisgICAgICAgIH07CisgICAgICAgIHN0
cnVjdCBQYXJ0aWFsVHJhaWxpbmdDb250ZW50IHsKKyAgICAgICAgICAgIHNpemVfdCB0cmFpbGlu
Z1J1bkluZGV4IHsgMCB9OworICAgICAgICAgICAgT3B0aW9uYWw8UGFydGlhbFJ1bj4gcGFydGlh
bFJ1bjsgLy8gbnVsbG9wdCBwYXJ0aWFsIHJ1biBtZWFucyB0aGUgdHJhaWxpbmcgcnVuIGlzIGEg
Y29tcGxldGUgcnVuLgorICAgICAgICB9OworICAgICAgICBBY3Rpb24gYWN0aW9uIHsgQWN0aW9u
OjpLZWVwIH07CisgICAgICAgIElzRW5kT2ZMaW5lIGlzRW5kT2ZMaW5lIHsgSXNFbmRPZkxpbmU6
Ok5vIH07CisgICAgICAgIE9wdGlvbmFsPFBhcnRpYWxUcmFpbGluZ0NvbnRlbnQ+IHBhcnRpYWxU
cmFpbGluZ0NvbnRlbnQgeyB9OworICAgICAgICBjb25zdCBJbmxpbmVJdGVtKiBsYXN0V3JhcE9w
cG9ydHVuaXR5SXRlbSB7IG51bGxwdHIgfTsKKyAgICB9OworCisgICAgLy8gVGhpcyBzdHJ1Y3Qg
cmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIGNvbnRpbnVvdXMgY29udGVudCBjb21taXR0ZWQgdG8g
Y29udGVudCBicmVha2luZyBhdCBhIHRpbWUgKG5vIGluLWJldHdlZW4gd3JhcCBvcHBvcnR1bml0
aWVzKS4KKyAgICAvLyBlLmcuCisgICAgLy8gPGRpdj50ZXh0IGNvbnRlbnQgPHNwYW4+c3BhbjE8
L3NwYW4+YmV0d2VlbjxzcGFuPnNwYW4yPC9zcGFuPjwvZGl2PgorICAgIC8vIFt0ZXh0XVsgXVtj
b250ZW50XVsgXVtpbmxpbmUgYm94IHN0YXJ0XVtzcGFuMV1baW5saW5lIGJveCBlbmRdW2JldHdl
ZW5dW2lubGluZSBib3ggc3RhcnRdW3NwYW4yXVtpbmxpbmUgYm94IGVuZF0KKyAgICAvLyBjb250
aW51b3VzIGNhbmRpZGF0ZSBjb250ZW50IGF0IGEgdGltZToKKyAgICAvLyAxLiBbdGV4dF0KKyAg
ICAvLyAyLiBbIF0KKyAgICAvLyAzLiBbY29udGVudF0KKyAgICAvLyA0LiBbIF0KKyAgICAvLyA1
LiBbaW5saW5lIGJveCBzdGFydF1bc3BhbjFdW2lubGluZSBib3ggZW5kXVtiZXR3ZWVuXVtpbmxp
bmUgYm94IHN0YXJ0XVtzcGFuMl1baW5saW5lIGJveCBlbmRdCisgICAgLy8gc2VlIGh0dHBzOi8v
ZHJhZnRzLmNzc3dnLm9yZy9jc3MtdGV4dC0zLyNsaW5lLWJyZWFrLWRldGFpbHMKKyAgICBzdHJ1
Y3QgQ29udGludW91c0NvbnRlbnQgeworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxX
aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFdpZHRoOyB9CisgICAgICAgIElubGluZUxh
eW91dFVuaXQgY29sbGFwc2libGVMb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2NvbGxh
cHNpYmxlTG9naWNhbFdpZHRoOyB9CisgICAgICAgIElubGluZUxheW91dFVuaXQgbm9uQ29sbGFw
c2libGVMb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsV2lkdGgoKSAtIGNvbGxh
cHNpYmxlTG9naWNhbFdpZHRoKCk7IH0KKyAgICAgICAgYm9vbCBoYXNUcmFpbGluZ0NvbGxhcHNp
YmxlQ29udGVudCgpIGNvbnN0IHsgcmV0dXJuICEhY29sbGFwc2libGVMb2dpY2FsV2lkdGgoKTsg
fQorICAgICAgICBib29sIGlzRnVsbHlDb2xsYXBzaWJsZSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2lj
YWxXaWR0aCgpID09IGNvbGxhcHNpYmxlTG9naWNhbFdpZHRoKCk7IH0KKworICAgICAgICB2b2lk
IGFwcGVuZChjb25zdCBJbmxpbmVJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgs
IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGNvbGxhcHNpYmxlV2lkdGgpOworICAgICAgICB2
b2lkIHJlc2V0KCk7CisKKyAgICAgICAgc3RydWN0IFJ1biB7CisgICAgICAgICAgICBSdW4oY29u
c3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICAgICAg
ICAgIFJ1bihjb25zdCBSdW4mKTsKKyAgICAgICAgICAgIFJ1biYgb3BlcmF0b3I9KGNvbnN0IFJ1
biYpOworCisgICAgICAgICAgICBjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtOworICAgICAg
ICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGggeyAwIH07CisgICAgICAgIH07Cisg
ICAgICAgIHVzaW5nIFJ1bkxpc3QgPSBWZWN0b3I8UnVuLCAzPjsKKyAgICAgICAgY29uc3QgUnVu
TGlzdCYgcnVucygpIGNvbnN0IHsgcmV0dXJuIG1fcnVuczsgfQorCisgICAgcHJpdmF0ZToKKyAg
ICAgICAgUnVuTGlzdCBtX3J1bnM7CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9sb2dpY2Fs
V2lkdGggeyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9jb2xsYXBzaWJsZUxvZ2lj
YWxXaWR0aCB7IDAgfTsKKyAgICB9OworCisgICAgc3RydWN0IExpbmVTdGF0dXMgeworICAgICAg
ICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsUmlnaHQgeyAwIH07CisgICAgICAgIElu
bGluZUxheW91dFVuaXQgYXZhaWxhYmxlV2lkdGggeyAwIH07CisgICAgICAgIElubGluZUxheW91
dFVuaXQgY29sbGFwc2libGVXaWR0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5lTGF5
b3V0VW5pdD4gdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGg7CisgICAgICAgIGJvb2wgaGFzRnVsbHlD
b2xsYXBzaWJsZVRyYWlsaW5nUnVuIHsgZmFsc2UgfTsKKyAgICAgICAgYm9vbCBoYXNDb250ZW50
IHsgZmFsc2UgfTsKKyAgICAgICAgYm9vbCBoYXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9z
aXRpb24geyBmYWxzZSB9OworICAgIH07CisgICAgUmVzdWx0IHByb2Nlc3NJbmxpbmVDb250ZW50
KGNvbnN0IENvbnRpbnVvdXNDb250ZW50JiwgY29uc3QgTGluZVN0YXR1cyYpOworICAgIHZvaWQg
c2V0SHlwaGVuYXRpb25EaXNhYmxlZCgpIHsgbl9oeXBoZW5hdGlvbklzRGlzYWJsZWQgPSB0cnVl
OyB9CisKKyAgICBzdGF0aWMgYm9vbCBpc1dyYXBwaW5nQWxsb3dlZChjb25zdCBJbmxpbmVJdGVt
Jik7CisKK3ByaXZhdGU6CisgICAgUmVzdWx0IHByb2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnQoY29u
c3QgQ29udGludW91c0NvbnRlbnQmLCBjb25zdCBMaW5lU3RhdHVzJikgY29uc3Q7CisgICAgT3Zl
cmZsb3dpbmdUZXh0Q29udGVudCBwcm9jZXNzT3ZlcmZsb3dpbmdDb250ZW50V2l0aFRleHQoY29u
c3QgQ29udGludW91c0NvbnRlbnQmLCBjb25zdCBMaW5lU3RhdHVzJikgY29uc3Q7CisgICAgT3B0
aW9uYWw8UGFydGlhbFJ1bj4gdHJ5QnJlYWtpbmdUZXh0UnVuKGNvbnN0IENvbnRpbnVvdXNDb250
ZW50OjpSdW4mIG92ZXJmbG93UnVuLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBPcHRp
b25hbDxJbmxpbmVMYXlvdXRVbml0PiBhdmFpbGFibGVXaWR0aCwgYm9vbCBoYXNXcmFwT3Bwb3J0
dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pIGNvbnN0OworCisgICAgZW51bSBjbGFzcyBXb3JkQnJl
YWtSdWxlIHsKKyAgICAgICAgQXRBcmJpdHJhcnlQb3NpdGlvbiAgICAgICAgPSAxIDw8IDAsCisg
ICAgICAgIEF0SHlwaGVuYXRpb25PcHBvcnR1bml0aWVzID0gMSA8PCAxCisgICAgfTsKKyAgICBP
cHRpb25TZXQ8V29yZEJyZWFrUnVsZT4gd29yZEJyZWFrQmVoYXZpb3IoY29uc3QgUmVuZGVyU3R5
bGUmLCBib29sIGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikgY29uc3Q7Cisg
ICAgYm9vbCBzaG91bGRLZWVwRW5kT2ZMaW5lV2hpdGVzcGFjZShjb25zdCBDb250aW51b3VzQ29u
dGVudCYpIGNvbnN0OworCisgICAgYm9vbCBuX2h5cGhlbmF0aW9uSXNEaXNhYmxlZCB7IGZhbHNl
IH07Cit9OworCitpbmxpbmUgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50
OjpSdW46OlJ1bihjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0
IGxvZ2ljYWxXaWR0aCkKKyAgICA6IGlubGluZUl0ZW0oaW5saW5lSXRlbSkKKyAgICAsIGxvZ2lj
YWxXaWR0aChsb2dpY2FsV2lkdGgpCit7Cit9CisKK2lubGluZSBJbmxpbmVDb250ZW50QnJlYWtl
cjo6Q29udGludW91c0NvbnRlbnQ6OlJ1bjo6UnVuKGNvbnN0IFJ1biYgb3RoZXIpCisgICAgOiBp
bmxpbmVJdGVtKG90aGVyLmlubGluZUl0ZW0pCisgICAgLCBsb2dpY2FsV2lkdGgob3RoZXIubG9n
aWNhbFdpZHRoKQoreworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL0lubGluZUZvcm1hdHRpbmdDb250
ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5l
L0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hNTFlYWZmY2RhM2VlY2M0
M2UyMTVkMWQ5NjQ2MTA2YzBjYzVhOTcyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQuY3BwCkBAIC0wLDAgKzEsNjExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
CisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwor
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICog
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZ
T1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgor
I2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ1N0YXRl
LmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgorI2luY2x1ZGUgIklubGluZUxpbmVSdW4u
aCIKKyNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgorI2luY2x1ZGUgIkludmFsaWRhdGlvblN0
YXRlLmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVy
Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgorI2luY2x1ZGUgIkxheW91dEluaXRp
YWxDb250YWluaW5nQmxvY2suaCIKKyNpbmNsdWRlICJMYXlvdXRJbmxpbmVUZXh0Qm94LmgiCisj
aW5jbHVkZSAiTGF5b3V0TGluZUJyZWFrQm94LmgiCisjaW5jbHVkZSAiTGF5b3V0UmVwbGFjZWRC
b3guaCIKKyNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNp
bmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmgiCisjaW5jbHVkZSAiVGV4dFV0aWwuaCIK
KyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1Rl
eHRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisK
K1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCk7CisK
K0lubGluZUZvcm1hdHRpbmdDb250ZXh0OjpJbmxpbmVGb3JtYXR0aW5nQ29udGV4dChjb25zdCBD
b250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgSW5saW5lRm9ybWF0dGluZ1N0YXRl
JiBmb3JtYXR0aW5nU3RhdGUpCisgICAgOiBGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nQ29u
dGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKK3sKK30KKworc3RhdGljIGlubGluZSBjb25zdCBC
b3gqIG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25z
dCBDb250YWluZXJCb3gmIHN0YXlXaXRoaW4pCit7CisgICAgLy8gQXRvbWljIGlubGluZS1sZXZl
bCBib3hlcyBhbmQgZmxvYXRzIGFyZSBvcGFxdWUgYm94ZXMgbWVhbmluZyB0aGF0IHRoZXkgYXJl
CisgICAgLy8gcmVzcG9uc2libGUgZm9yIHRoZWlyIG93biBjb250ZW50IChkbyBub3QgbmVlZCB0
byBkZXNjZW5kIGludG8gdGhlaXIgc3VidHJlZXMpLgorICAgIC8vIE9ubHkgaW5saW5lIGJveGVz
IG1heSBoYXZlIHJlbGV2YW50IGRlc2NlbmRhbnQgY29udGVudC4KKyAgICBpZiAobGF5b3V0Qm94
LmlzSW5saW5lQm94KCkpIHsKKyAgICAgICAgaWYgKGlzPENvbnRhaW5lckJveD4obGF5b3V0Qm94
KSAmJiBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFzSW5GbG93T3JGbG9hdGlu
Z0NoaWxkKCkpIHsKKyAgICAgICAgICAgIC8vIEFub255bW91cyBpbmxpbmUgdGV4dCBib3hlcy9s
aW5lIGJyZWFrcyBjYW4ndCBoYXZlIGRlc2NlbmRhbnQgY29udGVudCBieSBkZWZpbml0aW9uLgor
ICAgICAgICAgICAgQVNTRVJUKCFsYXlvdXRCb3guaXNJbmxpbmVUZXh0Qm94KCkgJiYgIWxheW91
dEJveC5pc0xpbmVCcmVha0JveCgpKTsKKyAgICAgICAgICAgIHJldHVybiBkb3duY2FzdDxDb250
YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byogbmV4dEluUHJlT3JkZXIgPSAmbGF5b3V0Qm94
OyBuZXh0SW5QcmVPcmRlciAmJiBuZXh0SW5QcmVPcmRlciAhPSAmc3RheVdpdGhpbjsgbmV4dElu
UHJlT3JkZXIgPSAmbmV4dEluUHJlT3JkZXItPnBhcmVudCgpKSB7CisgICAgICAgIGlmIChhdXRv
KiBuZXh0U2libGluZyA9IG5leHRJblByZU9yZGVyLT5uZXh0SW5GbG93T3JGbG9hdGluZ1NpYmxp
bmcoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXh0U2libGluZzsKKyAgICB9CisgICAgcmV0dXJu
IG51bGxwdHI7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmxheW91dEluRmxv
d0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmIGludmFsaWRhdGlvblN0YXRlLCBjb25zdCBDb25z
dHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQoreworICAgIExPR19XSVRIX1NU
UkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJbU3RhcnRdIC0+IGlubGlu
ZSBmb3JtYXR0aW5nIGNvbnRleHQgLT4gZm9ybWF0dGluZyByb290KCIgPDwgJnJvb3QoKSA8PCAi
KSIpOworICAgIEFTU0VSVChyb290KCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpOworCisg
ICAgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShpbnZhbGlkYXRpb25TdGF0ZSk7CisgICAgYXV0
byogbGF5b3V0Qm94ID0gcm9vdCgpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7CisgICAg
Ly8gMS4gVmlzaXQgZWFjaCBpbmxpbmUgYm94IGFuZCBwYXJ0aWFsbHkgY29tcHV0ZSB0aGVpciBn
ZW9tZXRyeSAobWFyZ2lucywgcGFkZGluZyBhbmQgYm9yZGVycykuCisgICAgLy8gMi4gQ29sbGVj
dCB0aGUgaW5saW5lIGl0ZW1zIChmbGF0dGVuIHRoZSB0aGUgbGF5b3V0IHRyZWUpIGFuZCBwbGFj
ZSB0aGVtIG9uIGxpbmVzIGluIGJpZGlyZWN0aW9uYWwgb3JkZXIuIAorICAgIHdoaWxlIChsYXlv
dXRCb3gpIHsKKyAgICAgICAgQVNTRVJUKGxheW91dEJveC0+aXNJbmxpbmVMZXZlbEJveCgpIHx8
IGxheW91dEJveC0+aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7CisKKyAgICAgICAgaWYgKGxheW91
dEJveC0+aXNBdG9taWNJbmxpbmVMZXZlbEJveCgpIHx8IGxheW91dEJveC0+aXNGbG9hdGluZ1Bv
c2l0aW9uZWQoKSkgeworICAgICAgICAgICAgLy8gSW5saW5lLWJsb2NrcywgaW5saW5lLXRhYmxl
cyBhbmQgcmVwbGFjZWQgZWxlbWVudHMgKGltZywgdmlkZW8pIGNhbiBiZSBzaXplZCBidXQgbm90
IHlldCBwb3NpdGlvbmVkLgorICAgICAgICAgICAgaWYgKGlzPENvbnRhaW5lckJveD4obGF5b3V0
Qm94KSAmJiBsYXlvdXRCb3gtPmVzdGFibGlzaGVzRm9ybWF0dGluZ0NvbnRleHQoKSkgeworICAg
ICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3gtPmlzSW5saW5lQmxvY2tCb3goKSB8fCBsYXlv
dXRCb3gtPmlzSW5saW5lVGFibGVCb3goKSB8fCBsYXlvdXRCb3gtPmlzRmxvYXRpbmdQb3NpdGlv
bmVkKCkpOworICAgICAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdSb290ID0gZG93bmNhc3Q8
Q29udGFpbmVyQm94PigqbGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICBjb21wdXRlQm9yZGVy
QW5kUGFkZGluZyhmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAg
ICAgICAgICAgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKGZvcm1hdHRpbmdSb290LCBjb25zdHJh
aW50cy5ob3Jpem9udGFsKTsKKworICAgICAgICAgICAgICAgIGlmIChmb3JtYXR0aW5nUm9vdC5o
YXNDaGlsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gZm9ybWF0dGluZ0NvbnRleHQg
PSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChmb3JtYXR0aW5nUm9vdCwg
bGF5b3V0U3RhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXR0aW5nUm9vdC5o
YXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1h
dHRpbmdDb250ZXh0LT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRhdGlvblN0YXRlLCBnZW9t
ZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChmb3JtYXR0aW5nUm9vdCkpOworICAg
ICAgICAgICAgICAgICAgICBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKGZvcm1hdHRpbmdSb290LCBj
b25zdHJhaW50cy5ob3Jpem9udGFsKTsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZ0Nv
bnRleHQtPmxheW91dE91dE9mRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9uU3RhdGUsIGdlb21ldHJ5
KCkuY29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50KGZvcm1hdHRpbmdSb290KSk7CisgICAg
ICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVIZWlnaHRBbmRN
YXJnaW4oZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBSZXBsYWNlZCBhbmQgb3RoZXIgdHlwZSBv
ZiBsZWFmIGF0b21pYyBpbmxpbmUgYm94ZXMuCisgICAgICAgICAgICAgICAgY29tcHV0ZUJvcmRl
ckFuZFBhZGRpbmcoKmxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAgICAg
ICAgICAgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhv
cml6b250YWwpOworICAgICAgICAgICAgICAgIGNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oKmxheW91
dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0g
ZWxzZSBpZiAobGF5b3V0Qm94LT5pc0xpbmVCcmVha0JveCgpKSB7CisgICAgICAgICAgICBhdXRv
JiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5KCpsYXlvdXRCb3gp
OworICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IH0pOworICAg
ICAgICAgICAgYm94R2VvbWV0cnkuc2V0Qm9yZGVyKHsgfSk7CisgICAgICAgICAgICBib3hHZW9t
ZXRyeS5zZXRQYWRkaW5nKHsgfSk7CisgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50
Qm94V2lkdGgoeyB9KTsKKyAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldFZlcnRpY2FsTWFyZ2lu
KHsgfSk7CisgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LT5pc0lubGluZUJveCgpKSB7Cisg
ICAgICAgICAgICAvLyBUZXh0IHdyYXBwZXIgYm94ZXMgKGFub255bW91cyBpbmxpbmUgbGV2ZWwg
Ym94ZXMpIGRvbid0IGhhdmUgYm94IGdlb21ldHJpZXMgKHRoZXkgb25seSBnZW5lcmF0ZSBydW5z
KS4KKyAgICAgICAgICAgIGlmICghbGF5b3V0Qm94LT5pc0lubGluZVRleHRCb3goKSkgeworICAg
ICAgICAgICAgICAgIC8vIElubGluZSBib3hlcyAoPHNwYW4+KSBjYW4ndCBnZXQgc2l6ZWQvcG9z
aXRpb25lZCB5ZXQuIEF0IHRoaXMgcG9pbnQgd2UgY2FuIG9ubHkgY29tcHV0ZSB0aGVpciBtYXJn
aW5zLCBib3JkZXJzIGFuZCBwYWRkaW5nLgorICAgICAgICAgICAgICAgIGNvbXB1dGVCb3JkZXJB
bmRQYWRkaW5nKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250YWwpOworICAgICAgICAg
ICAgICAgIGNvbXB1dGVIb3Jpem9udGFsTWFyZ2luKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhv
cml6b250YWwpOworICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21ldHJ5
KCpsYXlvdXRCb3gpLnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0gZWxzZQorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisKKyAgICAgICAg
bGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlvdXQoKmxheW91dEJveCwgcm9vdCgp
KTsKKyAgICB9CisKKyAgICBjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCk7CisKKyAgICBh
dXRvJiBpbmxpbmVJdGVtcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmlubGluZUl0ZW1zKCk7CisgICAg
bGluZUxheW91dChpbmxpbmVJdGVtcywgeyAwLCBpbmxpbmVJdGVtcy5zaXplKCkgfSwgY29uc3Ry
YWludHMpOworICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3Ry
ZWFtIDw8ICJbRW5kXSAtPiBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0IC0+IGZvcm1hdHRpbmcg
cm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKK30KKwordm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dDo6bGluZUxheW91dEZvckludGVyZ3JhdGlvbihJbnZhbGlkYXRpb25TdGF0ZSYgaW52YWxp
ZGF0aW9uU3RhdGUsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWlu
dHMpCit7CisgICAgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShpbnZhbGlkYXRpb25TdGF0ZSk7
CisgICAgY29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgpOworICAgIGF1dG8mIGlubGluZUl0
ZW1zID0gZm9ybWF0dGluZ1N0YXRlKCkuaW5saW5lSXRlbXMoKTsKKyAgICBsaW5lTGF5b3V0KGlu
bGluZUl0ZW1zLCB7IDAsIGlubGluZUl0ZW1zLnNpemUoKSB9LCBjb25zdHJhaW50cyk7Cit9CisK
K0xheW91dFVuaXQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OnVzZWRDb250ZW50SGVpZ2h0KCkg
Y29uc3QKK3sKKyAgICAvLyAxMC42LjcgJ0F1dG8nIGhlaWdodHMgZm9yIGJsb2NrIGZvcm1hdHRp
bmcgY29udGV4dCByb290cworCisgICAgLy8gSWYgaXQgb25seSBoYXMgaW5saW5lLWxldmVsIGNo
aWxkcmVuLCB0aGUgaGVpZ2h0IGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0b3Agb2YgdGhl
IHRvcG1vc3QgbGluZSBib3ggYW5kIHRoZSBib3R0b20gb2YgdGhlIGJvdHRvbW1vc3QgbGluZSBi
b3guCisKKyAgICAvLyBJbiBhZGRpdGlvbiwgaWYgdGhlIGVsZW1lbnQgaGFzIGFueSBmbG9hdGlu
ZyBkZXNjZW5kYW50cyB3aG9zZSBib3R0b20gbWFyZ2luIGVkZ2UgaXMgYmVsb3cgdGhlIGVsZW1l
bnQncyBib3R0b20gY29udGVudCBlZGdlLAorICAgIC8vIHRoZW4gdGhlIGhlaWdodCBpcyBpbmNy
ZWFzZWQgdG8gaW5jbHVkZSB0aG9zZSBlZGdlcy4gT25seSBmbG9hdHMgdGhhdCBwYXJ0aWNpcGF0
ZSBpbiB0aGlzIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBhcmUgdGFrZW4KKyAgICAvLyBpbnRv
IGFjY291bnQsIGUuZy4sIGZsb2F0cyBpbnNpZGUgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGRlc2Nl
bmRhbnRzIG9yIG90aGVyIGZsb2F0cyBhcmUgbm90LgorICAgIGF1dG8mIGxpbmVzID0gZm9ybWF0
dGluZ1N0YXRlKCkubGluZXMoKTsKKyAgICAvLyBFdmVuIGVtcHR5IGNvbnRlbnQgZ2VuZXJhdGVz
IGEgbGluZS4KKyAgICBBU1NFUlQoIWxpbmVzLmlzRW1wdHkoKSk7CisgICAgYXV0byB0b3AgPSBM
YXlvdXRVbml0IHsgbGluZXMuZmlyc3QoKS5saW5lQm94TG9naWNhbFJlY3QoKS50b3AoKSB9Owor
ICAgIGF1dG8gYm90dG9tID0gTGF5b3V0VW5pdCB7IGxpbmVzLmxhc3QoKS5saW5lQm94TG9naWNh
bFJlY3QoKS5ib3R0b20oKSArIGZvcm1hdHRpbmdTdGF0ZSgpLmNsZWFyR2FwQWZ0ZXJMYXN0TGlu
ZSgpIH07CisKKyAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7ICp0
aGlzLCBmb3JtYXR0aW5nU3RhdGUoKS5mbG9hdGluZ1N0YXRlKCkgfTsKKyAgICBpZiAoYXV0byBm
bG9hdEJvdHRvbSA9IGZsb2F0aW5nQ29udGV4dC5ib3R0b20oKSkgeworICAgICAgICBib3R0b20g
PSBzdGQ6Om1heCgqZmxvYXRCb3R0b20sIGJvdHRvbSk7CisgICAgICAgIHRvcCA9IHN0ZDo6bWlu
KCpmbG9hdGluZ0NvbnRleHQudG9wKCksIHRvcCk7CisgICAgfQorICAgIHJldHVybiBib3R0b20g
LSB0b3A7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmxpbmVMYXlvdXQoSW5s
aW5lSXRlbXMmIGlubGluZUl0ZW1zLCBMaW5lQnVpbGRlcjo6SW5saW5lSXRlbVJhbmdlIG5lZWRz
TGF5b3V0UmFuZ2UsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYgY29uc3RyYWlu
dHMpCit7CisgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRl
KCk7CisgICAgZm9ybWF0dGluZ1N0YXRlLmxpbmVSdW5zKCkucmVzZXJ2ZUluaXRpYWxDYXBhY2l0
eShmb3JtYXR0aW5nU3RhdGUuaW5saW5lSXRlbXMoKS5zaXplKCkpOworICAgIElubGluZUxheW91
dFVuaXQgbGluZUxvZ2ljYWxUb3AgPSBjb25zdHJhaW50cy52ZXJ0aWNhbC5sb2dpY2FsVG9wOwor
ICAgIHN0cnVjdCBQcmV2aW91c0xpbmUgeworICAgICAgICBMaW5lQnVpbGRlcjo6SW5saW5lSXRl
bVJhbmdlIHJhbmdlOworICAgICAgICBzaXplX3Qgb3ZlcmZsb3dDb250ZW50TGVuZ3RoIHsgMCB9
OworICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxvd0xvZ2ljYWxXaWR0
aDsKKyAgICB9OworICAgIE9wdGlvbmFsPFByZXZpb3VzTGluZT4gcHJldmlvdXNMaW5lOworICAg
IGF1dG8mIGZsb2F0aW5nU3RhdGUgPSBmb3JtYXR0aW5nU3RhdGUuZmxvYXRpbmdTdGF0ZSgpOwor
ICAgIGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250ZXh0IHsgKnRoaXMsIGZsb2F0
aW5nU3RhdGUgfTsKKyAgICBhdXRvIGlzRmlyc3RMaW5lID0gZm9ybWF0dGluZ1N0YXRlLmxpbmVz
KCkuaXNFbXB0eSgpOworCisgICAgYXV0byBsaW5lQnVpbGRlciA9IExpbmVCdWlsZGVyIHsgKnRo
aXMsIGZsb2F0aW5nU3RhdGUsIGNvbnN0cmFpbnRzLmhvcml6b250YWwsIGlubGluZUl0ZW1zIH07
CisgICAgd2hpbGUgKCFuZWVkc0xheW91dFJhbmdlLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBU
dXJuIHByZXZpb3VzIGxpbmUncyBvdmVyZmxvdyBjb250ZW50IGxlbmd0aCBpbnRvIHRoZSBuZXh0
IGxpbmUncyBsZWFkaW5nIGNvbnRlbnQgcGFydGlhbCBsZW5ndGguCisgICAgICAgIC8vICJzcFs8
LWxpbmUgYnJlYWstPl1saXRfY29udGVudCIgLT4gb3ZlcmZsb3cgbGVuZ3RoOiAxMSAtPiBsZWFk
aW5nIHBhcnRpYWwgY29udGVudCBsZW5ndGg6IDExLgorICAgICAgICBhdXRvIHBhcnRpYWxMZWFk
aW5nQ29udGVudExlbmd0aCA9IHByZXZpb3VzTGluZSA/IHByZXZpb3VzTGluZS0+b3ZlcmZsb3dD
b250ZW50TGVuZ3RoIDogMDsKKyAgICAgICAgYXV0byBsZWFkaW5nTG9naWNhbFdpZHRoID0gcHJl
dmlvdXNMaW5lID8gcHJldmlvdXNMaW5lLT5vdmVyZmxvd0xvZ2ljYWxXaWR0aCA6IFdURjo6bnVs
bG9wdDsKKyAgICAgICAgYXV0byBpbml0aWFsTGluZUNvbnN0cmFpbnRzID0gSW5saW5lUmVjdCB7
IGxpbmVMb2dpY2FsVG9wLCBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxMZWZ0LCBjb25z
dHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxXaWR0aCwgcXVpcmtzKCkuaW5pdGlhbExpbmVIZWln
aHQoKSB9OworICAgICAgICBhdXRvIGxpbmVDb250ZW50ID0gbGluZUJ1aWxkZXIubGF5b3V0SW5s
aW5lQ29udGVudChuZWVkc0xheW91dFJhbmdlLCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgs
IGxlYWRpbmdMb2dpY2FsV2lkdGgsIGluaXRpYWxMaW5lQ29uc3RyYWludHMsIGlzRmlyc3RMaW5l
KTsKKyAgICAgICAgYXV0byBsaW5lTG9naWNhbFJlY3QgPSBjb21wdXRlR2VvbWV0cnlGb3JMaW5l
Q29udGVudChsaW5lQ29udGVudCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7CisKKyAgICAgICAg
YXV0byBsaW5lQ29udGVudFJhbmdlID0gbGluZUNvbnRlbnQuaW5saW5lSXRlbVJhbmdlOworICAg
ICAgICBpZiAoIWxpbmVDb250ZW50UmFuZ2UuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBU1NF
UlQobmVlZHNMYXlvdXRSYW5nZS5zdGFydCA8IGxpbmVDb250ZW50UmFuZ2UuZW5kKTsKKyAgICAg
ICAgICAgIGlzRmlyc3RMaW5lID0gZmFsc2U7CisgICAgICAgICAgICBsaW5lTG9naWNhbFRvcCA9
IGdlb21ldHJ5KCkubG9naWNhbFRvcEZvck5leHRMaW5lKGxpbmVDb250ZW50LCBsaW5lTG9naWNh
bFJlY3QuYm90dG9tKCksIGZsb2F0aW5nQ29udGV4dCk7CisgICAgICAgICAgICBpZiAobGluZUNv
bnRlbnQuaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KSB7CisgICAgICAgICAgICAgICAgLy8g
VGhlIGZpbmFsIGNvbnRlbnQgaGVpZ2h0IG9mIHRoaXMgaW5saW5lIGZvcm1hdHRpbmcgY29udGV4
dCBzaG91bGQgaW5jbHVkZSB0aGUgY2xlYXJlZCBmbG9hdHMgYXMgd2VsbC4KKyAgICAgICAgICAg
ICAgICBmb3JtYXR0aW5nU3RhdGUuc2V0Q2xlYXJHYXBBZnRlckxhc3RMaW5lKGxpbmVMb2dpY2Fs
VG9wIC0gbGluZUxvZ2ljYWxSZWN0LmJvdHRvbSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIC8vIFdoZW4gdGhlIHRyYWlsaW5nIGNvbnRlbnQgaXMgcGFydGlhbCwgd2UgbmVlZCB0byBy
ZXVzZSB0aGUgbGFzdCBJbmxpbmVUZXh0SXRlbS4KKyAgICAgICAgICAgIGF1dG8gbGFzdElubGlu
ZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPSBsaW5lQ29udGVudC5wYXJ0aWFsVHJhaWxpbmdDb250
ZW50TGVuZ3RoOworICAgICAgICAgICAgaWYgKGxhc3RJbmxpbmVJdGVtTmVlZHNQYXJ0aWFsTGF5
b3V0KSB7CisgICAgICAgICAgICAgICAgYXV0byBsaW5lTGF5b3V0SGFzQWR2YW5jZWQgPSAhcHJl
dmlvdXNMaW5lCisgICAgICAgICAgICAgICAgICAgIHx8IGxpbmVDb250ZW50UmFuZ2UuZW5kID4g
cHJldmlvdXNMaW5lLT5yYW5nZS5lbmQKKyAgICAgICAgICAgICAgICAgICAgfHwgKHByZXZpb3Vz
TGluZS0+b3ZlcmZsb3dDb250ZW50TGVuZ3RoICYmIHByZXZpb3VzTGluZS0+b3ZlcmZsb3dDb250
ZW50TGVuZ3RoID4gbGluZUNvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCk7Cisg
ICAgICAgICAgICAgICAgaWYgKCFsaW5lTGF5b3V0SGFzQWR2YW5jZWQpIHsKKyAgICAgICAgICAg
ICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIE1v
dmUgb3ZlciB0byB0aGUgbmV4dCBydW4gaWYgd2UgYXJlIHN0dWNrIG9uIHRoaXMgcGFydGlhbCBj
b250ZW50ICh3aGVuIHRoZSBvdmVyZmxvdyBjb250ZW50IGxlbmd0aCByZW1haW5zIHRoZSBzYW1l
KS4KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2VydGFpbmx5IGxvc2Ugc29tZSBjb250ZW50
LCBidXQgd2Ugd291bGQgYmUgYnVzeSBsb29waW5nIG90aGVyd2lzZS4KKyAgICAgICAgICAgICAg
ICAgICAgbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPSBmYWxzZTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZWVkc0xheW91dFJhbmdlLnN0
YXJ0ID0gbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPyBsaW5lQ29udGVudFJhbmdl
LmVuZCAtIDEgOiBsaW5lQ29udGVudFJhbmdlLmVuZDsKKyAgICAgICAgICAgIHByZXZpb3VzTGlu
ZSA9IFByZXZpb3VzTGluZSB7IGxpbmVDb250ZW50UmFuZ2UsIGxpbmVDb250ZW50LnBhcnRpYWxU
cmFpbGluZ0NvbnRlbnRMZW5ndGgsIGxpbmVDb250ZW50Lm92ZXJmbG93TG9naWNhbFdpZHRoIH07
CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBGbG9hdHMgcHJl
dmVudGVkIHVzIHBsYWNpbmcgYW55IGNvbnRlbnQgb24gdGhlIGxpbmUuCisgICAgICAgIEFTU0VS
VChsaW5lQ29udGVudC5ydW5zLmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVChsaW5lQ29udGVu
dC5oYXNJbnRydXNpdmVGbG9hdCk7CisgICAgICAgIC8vIE1vdmUgdGhlIG5leHQgbGluZSBiZWxv
dyB0aGUgaW50cnVzaXZlIGZsb2F0LgorICAgICAgICBhdXRvIGZsb2F0Q29uc3RyYWludHMgPSBm
bG9hdGluZ0NvbnRleHQuY29uc3RyYWludHModG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsVG9wKSwg
dG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmVjdC5ib3R0b20oKSkpOworICAgICAgICBBU1NFUlQo
ZmxvYXRDb25zdHJhaW50cy5sZWZ0IHx8IGZsb2F0Q29uc3RyYWludHMucmlnaHQpOworICAgICAg
ICBzdGF0aWMgYXV0byBpbmlmaXRlUG9pbnQgPSBQb2ludEluQ29udGV4dFJvb3Q6Om1heCgpOwor
ICAgICAgICAvLyBJbiBjYXNlIG9mIGxlZnQgYW5kIHJpZ2h0IGNvbnN0cmFpbnRzLCB3ZSBuZWVk
IHRvIHBpY2sgdGhlIG9uZSB0aGF0J3MgY2xvc2VyIHRvIHRoZSBjdXJyZW50IGxpbmUuCisgICAg
ICAgIGxpbmVMb2dpY2FsVG9wID0gc3RkOjptaW4oZmxvYXRDb25zdHJhaW50cy5sZWZ0LnZhbHVl
T3IoaW5pZml0ZVBvaW50KS55LCBmbG9hdENvbnN0cmFpbnRzLnJpZ2h0LnZhbHVlT3IoaW5pZml0
ZVBvaW50KS55KTsKKyAgICAgICAgQVNTRVJUKGxpbmVMb2dpY2FsVG9wIDwgaW5pZml0ZVBvaW50
LnkpOworICAgIH0KK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3Ry
YWludHMgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50cmluc2ljV2lkdGhDb25z
dHJhaW50cygpCit7CisgICAgYXV0byYgbGF5b3V0U3RhdGUgPSB0aGlzLT5sYXlvdXRTdGF0ZSgp
OworICAgIEFTU0VSVCghZm9ybWF0dGluZ1N0YXRlKCkuaW50cmluc2ljV2lkdGhDb25zdHJhaW50
cygpKTsKKworICAgIGlmICghcm9vdCgpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKSB7Cisg
ICAgICAgIGF1dG8gY29uc3RyYWludHMgPSBnZW9tZXRyeSgpLmNvbnN0cmFpbkJ5TWluTWF4V2lk
dGgocm9vdCgpLCB7IH0pOworICAgICAgICBmb3JtYXR0aW5nU3RhdGUoKS5zZXRJbnRyaW5zaWNX
aWR0aENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRz
OworICAgIH0KKworICAgIFZlY3Rvcjxjb25zdCBCb3gqPiBmb3JtYXR0aW5nQ29udGV4dFJvb3RM
aXN0OworICAgIGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRzID0gSG9yaXpvbnRhbENvbnN0cmFp
bnRzIHsgMF9sdSwgMF9sdSB9OworICAgIGF1dG8qIGxheW91dEJveCA9IHJvb3QoKS5maXJzdElu
Rmxvd09yRmxvYXRpbmdDaGlsZCgpOworICAgIC8vIEluIG9yZGVyIHRvIGNvbXB1dGUgdGhlIG1h
eC9taW4gd2lkdGhzLCB3ZSBuZWVkIHRvIGNvbXB1dGUgbWFyZ2lucywgYm9yZGVycyBhbmQgcGFk
ZGluZyBmb3IgY2VydGFpbiBpbmxpbmUgYm94ZXMgZmlyc3QuCisgICAgd2hpbGUgKGxheW91dEJv
eCkgeworICAgICAgICBpZiAobGF5b3V0Qm94LT5pc0lubGluZVRleHRCb3goKSkgeworICAgICAg
ICAgICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlvdXQoKmxheW91dEJveCwg
cm9vdCgpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChs
YXlvdXRCb3gtPmlzUmVwbGFjZWRCb3goKSkgeworICAgICAgICAgICAgY29tcHV0ZUJvcmRlckFu
ZFBhZGRpbmcoKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsKKyAgICAgICAgICAg
IGNvbXB1dGVXaWR0aEFuZE1hcmdpbigqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMp
OworICAgICAgICB9IGVsc2UgaWYgKGxheW91dEJveC0+aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSB8
fCBsYXlvdXRCb3gtPmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSkgeworICAgICAgICAgICAgQVNT
RVJUKGxheW91dEJveC0+ZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKKyAgICAgICAg
ICAgIGZvcm1hdHRpbmdDb250ZXh0Um9vdExpc3QuYXBwZW5kKGxheW91dEJveCk7CisKKyAgICAg
ICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cyk7CisgICAgICAgICAgICBjb21wdXRlSG9yaXpvbnRhbE1hcmdpbigqbGF5b3V0Qm94
LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAgICAgICAgY29tcHV0ZUludHJpbnNpY1dp
ZHRoRm9yRm9ybWF0dGluZ1Jvb3QoKmxheW91dEJveCk7CisgICAgICAgIH0gZWxzZSBpZiAobGF5
b3V0Qm94LT5pc0lubGluZUJveCgpKSB7CisgICAgICAgICAgICBjb21wdXRlQm9yZGVyQW5kUGFk
ZGluZygqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAgICAgICAgY29t
cHV0ZUhvcml6b250YWxNYXJnaW4oKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzKTsK
KyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAg
ICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlvdXQoKmxheW91dEJveCwgcm9v
dCgpKTsKKyAgICB9CisKKyAgICBjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCk7CisKKyAg
ICBhdXRvIG1heGltdW1MaW5lV2lkdGggPSBbJl0oYXV0byBhdmFpbGFibGVXaWR0aCkgeworICAg
ICAgICAvLyBTd2l0Y2ggdG8gdGhlIG1pbi9tYXggZm9ybWF0dGluZyByb290IHdpZHRoIHZhbHVl
cyBiZWZvcmUgZm9ybWF0dGluZyB0aGUgbGluZXMuCisgICAgICAgIGZvciAoYXV0byogZm9ybWF0
dGluZ1Jvb3QgOiBmb3JtYXR0aW5nQ29udGV4dFJvb3RMaXN0KSB7CisgICAgICAgICAgICBhdXRv
IGludHJpbnNpY1dpZHRocyA9IGxheW91dFN0YXRlLmZvcm1hdHRpbmdTdGF0ZUZvckJveCgqZm9y
bWF0dGluZ1Jvb3QpLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JCb3goKmZvcm1hdHRpbmdS
b290KTsKKyAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCku
Ym94R2VvbWV0cnkoKmZvcm1hdHRpbmdSb290KTsKKyAgICAgICAgICAgIGF1dG8gY29udGVudFdp
ZHRoID0gKGF2YWlsYWJsZVdpZHRoID8gaW50cmluc2ljV2lkdGhzLT5tYXhpbXVtIDogaW50cmlu
c2ljV2lkdGhzLT5taW5pbXVtKSAtIGJveEdlb21ldHJ5Lmhvcml6b250YWxNYXJnaW5Cb3JkZXJB
bmRQYWRkaW5nKCk7CisgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgo
Y29udGVudFdpZHRoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tcHV0ZWRJbnRyaW5z
aWNXaWR0aEZvckNvbnN0cmFpbnQoYXZhaWxhYmxlV2lkdGgpOworICAgIH07CisKKyAgICBhdXRv
IG1pbmltdW1Db250ZW50V2lkdGggPSBjZWlsZWRMYXlvdXRVbml0KG1heGltdW1MaW5lV2lkdGgo
MCkpOworICAgIGF1dG8gbWF4aW11bUNvbnRlbnRXaWR0aCA9IGNlaWxlZExheW91dFVuaXQobWF4
aW11bUxpbmVXaWR0aChtYXhJbmxpbmVMYXlvdXRVbml0KCkpKTsKKyAgICBhdXRvIGNvbnN0cmFp
bnRzID0gZ2VvbWV0cnkoKS5jb25zdHJhaW5CeU1pbk1heFdpZHRoKHJvb3QoKSwgeyBtaW5pbXVt
Q29udGVudFdpZHRoLCBtYXhpbXVtQ29udGVudFdpZHRoIH0pOworICAgIGZvcm1hdHRpbmdTdGF0
ZSgpLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3RyYWludHMpOworICAgIHJldHVy
biBjb25zdHJhaW50czsKK30KKworSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aEZvckNvbnN0cmFpbnQoSW5saW5lTGF5b3V0VW5p
dCBhdmFpbGFibGVXaWR0aCkgY29uc3QKK3sKKyAgICBhdXRvJiBpbmxpbmVJdGVtcyA9IGZvcm1h
dHRpbmdTdGF0ZSgpLmlubGluZUl0ZW1zKCk7CisgICAgYXV0byBsaW5lQnVpbGRlciA9IExpbmVC
dWlsZGVyIHsgKnRoaXMsIGlubGluZUl0ZW1zIH07CisgICAgYXV0byBsYXlvdXRSYW5nZSA9IExp
bmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UgeyAwICwgaW5saW5lSXRlbXMuc2l6ZSgpIH07Cisg
ICAgYXV0byBtYXhpbXVtTGluZVdpZHRoID0gSW5saW5lTGF5b3V0VW5pdCB7IH07CisgICAgYXV0
byBtYXhpbXVtRmxvYXRXaWR0aCA9IExheW91dFVuaXQgeyB9OworICAgIHdoaWxlICghbGF5b3V0
UmFuZ2UuaXNFbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaW50cmluc2ljQ29udGVudCA9IGxpbmVC
dWlsZGVyLmNvbXB1dGVkSW50cmluc2ljV2lkdGgobGF5b3V0UmFuZ2UsIGF2YWlsYWJsZVdpZHRo
KTsKKyAgICAgICAgbGF5b3V0UmFuZ2Uuc3RhcnQgPSBpbnRyaW5zaWNDb250ZW50LmlubGluZUl0
ZW1SYW5nZS5lbmQ7CisgICAgICAgIG1heGltdW1MaW5lV2lkdGggPSBzdGQ6Om1heChtYXhpbXVt
TGluZVdpZHRoLCBpbnRyaW5zaWNDb250ZW50LmxvZ2ljYWxXaWR0aCk7CisgICAgICAgIC8vIEZJ
WE1FOiBBZGQgc3VwcG9ydCBmb3IgY2xlYXIuCisgICAgICAgIGZvciAoYXV0byogZmxvYXRCb3gg
OiBpbnRyaW5zaWNDb250ZW50LmZsb2F0cykKKyAgICAgICAgICAgIG1heGltdW1GbG9hdFdpZHRo
ICs9IGdlb21ldHJ5Rm9yQm94KCpmbG9hdEJveCkubWFyZ2luQm94V2lkdGgoKTsKKyAgICB9Cisg
ICAgcmV0dXJuIG1heGltdW1MaW5lV2lkdGggKyBtYXhpbXVtRmxvYXRXaWR0aDsKK30KKwordm9p
ZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUludHJpbnNpY1dpZHRoRm9yRm9ybWF0
dGluZ1Jvb3QoY29uc3QgQm94JiBmb3JtYXR0aW5nUm9vdCkKK3sKKyAgICBBU1NFUlQoZm9ybWF0
dGluZ1Jvb3QuZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsKKyAgICBhdXRvIGNvbnN0
cmFpbnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07CisgICAgaWYgKGF1dG8gZml4
ZWRXaWR0aCA9IGdlb21ldHJ5KCkuZml4ZWRWYWx1ZShmb3JtYXR0aW5nUm9vdC5zdHlsZSgpLmxv
Z2ljYWxXaWR0aCgpKSkKKyAgICAgICAgY29uc3RyYWludHMgPSB7ICpmaXhlZFdpZHRoLCAqZml4
ZWRXaWR0aCB9OworICAgIGVsc2UgeworICAgICAgICBhdXRvIGhhc0luZmxvd09yRmxvYXRpbmdD
b250ZW50ID0gaXM8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nUm9vdCkgJiYgZG93bmNhc3Q8Q29u
dGFpbmVyQm94Pihmb3JtYXR0aW5nUm9vdCkuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCk7Cisg
ICAgICAgIC8vIFRoZSBpbnRyaW5zaWMgc2l6ZXMgb2YgdGhlIHNpemUgY29udGFpbm1lbnQgYm94
IGFyZSBkZXRlcm1pbmVkIGFzIGlmIHRoZSBlbGVtZW50IGhhZCBubyBjb250ZW50LgorICAgICAg
ICBhdXRvIHNob3VsZElnbm9yZUNoaWxkQ29udGVudCA9IGZvcm1hdHRpbmdSb290LmlzU2l6ZUNv
bnRhaW5tZW50Qm94KCk7CisgICAgICAgIGlmIChoYXNJbmZsb3dPckZsb2F0aW5nQ29udGVudCAm
JiAhc2hvdWxkSWdub3JlQ2hpbGRDb250ZW50KQorICAgICAgICAgICAgY29uc3RyYWludHMgPSBM
YXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChkb3duY2FzdDxDb250YWluZXJC
b3g+KGZvcm1hdHRpbmdSb290KSwgbGF5b3V0U3RhdGUoKSktPmNvbXB1dGVkSW50cmluc2ljV2lk
dGhDb25zdHJhaW50cygpOworICAgIH0KKyAgICBjb25zdHJhaW50cyA9IGdlb21ldHJ5KCkuY29u
c3RyYWluQnlNaW5NYXhXaWR0aChmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWludHMpOworICAgIGNv
bnN0cmFpbnRzLmV4cGFuZChnZW9tZXRyeUZvckJveChmb3JtYXR0aW5nUm9vdCkuaG9yaXpvbnRh
bE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKSk7CisgICAgZm9ybWF0dGluZ1N0YXRlKCkuc2V0SW50
cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWludHMp
OworfQorCit2b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlSG9yaXpvbnRhbE1h
cmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBo
b3Jpem9udGFsQ29uc3RyYWludHMpCit7CisgICAgYXV0byBjb21wdXRlZEhvcml6b250YWxNYXJn
aW4gPSBnZW9tZXRyeSgpLmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihsYXlvdXRCb3gsIGhvcml6
b250YWxDb25zdHJhaW50cyk7CisgICAgZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5
b3V0Qm94KS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLnN0
YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5lbmQudmFsdWVPcigwKSB9
KTsKK30KKwordm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZVdpZHRoQW5kTWFy
Z2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmIGhv
cml6b250YWxDb25zdHJhaW50cykKK3sKKyAgICBhdXRvIGNvbXB1dGUgPSBbJl0oT3B0aW9uYWw8
TGF5b3V0VW5pdD4gdXNlZFdpZHRoKSB7CisgICAgICAgIGlmIChsYXlvdXRCb3guaXNGbG9hdGlu
Z1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmZsb2F0aW5nQ29u
dGVudFdpZHRoQW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IHVz
ZWRXaWR0aCwgeyB9IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxvY2tCb3go
KSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZUJsb2NrQ29udGVudFdpZHRo
QW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCB7IHVzZWRXaWR0aCwg
eyB9IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKKyAgICAgICAg
ICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2lu
KGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jpem9udGFsQ29uc3RyYWludHMs
IHsgfSwgeyB1c2VkV2lkdGgsIHsgfSB9KTsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgICAgIHJldHVybiBDb250ZW50V2lkdGhBbmRNYXJnaW4geyB9OworICAgIH07CisKKyAg
ICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUoeyB9KTsKKworICAgIGF1dG8g
YXZhaWxhYmxlV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9naWNhbFdpZHRoOworICAg
IGlmIChhdXRvIG1heFdpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1heFdpZHRoKGxheW91dEJv
eCwgYXZhaWxhYmxlV2lkdGgpKSB7CisgICAgICAgIGF1dG8gbWF4V2lkdGhBbmRNYXJnaW4gPSBj
b21wdXRlKG1heFdpZHRoKTsKKyAgICAgICAgaWYgKGNvbnRlbnRXaWR0aEFuZE1hcmdpbi5jb250
ZW50V2lkdGggPiBtYXhXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgpCisgICAgICAgICAgICBj
b250ZW50V2lkdGhBbmRNYXJnaW4gPSBtYXhXaWR0aEFuZE1hcmdpbjsKKyAgICB9CisKKyAgICBh
dXRvIG1pbldpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbldpZHRoKGxheW91dEJveCwgYXZh
aWxhYmxlV2lkdGgpLnZhbHVlT3IoMCk7CisgICAgYXV0byBtaW5XaWR0aEFuZE1hcmdpbiA9IGNv
bXB1dGUobWluV2lkdGgpOworICAgIGlmIChjb250ZW50V2lkdGhBbmRNYXJnaW4uY29udGVudFdp
ZHRoIDwgbWluV2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQorICAgICAgICBjb250ZW50V2lk
dGhBbmRNYXJnaW4gPSBtaW5XaWR0aEFuZE1hcmdpbjsKKworICAgIGF1dG8mIGJveEdlb21ldHJ5
ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsKKyAgICBib3hHZW9t
ZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudFdpZHRoQW5kTWFyZ2luLmNvbnRlbnRXaWR0
aCk7CisgICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7IGNvbnRlbnRXaWR0aEFu
ZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0LCBjb250ZW50V2lkdGhBbmRNYXJnaW4udXNlZE1hcmdp
bi5lbmQgfSk7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVIZWln
aHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhvcml6b250YWxDb25zdHJh
aW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQoreworICAgIGF1dG8gY29tcHV0ZSA9IFsmXShP
cHRpb25hbDxMYXlvdXRVbml0PiB1c2VkSGVpZ2h0KSB7CisgICAgICAgIGlmIChsYXlvdXRCb3gu
aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmZs
b2F0aW5nQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJh
aW50cywgeyB1c2VkSGVpZ2h0IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxv
Y2tCb3goKSkKKyAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZUJsb2NrQ29udGVu
dEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cywgeyB1c2Vk
SGVpZ2h0IH0pOworICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRCb3goKSkKKyAgICAg
ICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZVJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1h
cmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCB7IH0sIHsgdXNlZEhlaWdodCB9KTsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgICAgIHJldHVybiBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIHsgfTsKKyAgICB9OworCisg
ICAgYXV0byBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZSh7IH0pOworICAgIGlmIChh
dXRvIG1heEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWlnaHQobGF5b3V0Qm94KSkg
eworICAgICAgICBhdXRvIG1heEhlaWdodEFuZE1hcmdpbiA9IGNvbXB1dGUobWF4SGVpZ2h0KTsK
KyAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCA+IG1heEhl
aWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KQorICAgICAgICAgICAgY29udGVudEhlaWdodEFu
ZE1hcmdpbiA9IG1heEhlaWdodEFuZE1hcmdpbjsKKyAgICB9CisKKyAgICBpZiAoYXV0byBtaW5I
ZWlnaHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluSGVpZ2h0KGxheW91dEJveCkpIHsKKyAgICAg
ICAgYXV0byBtaW5IZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRlKG1pbkhlaWdodCk7CisgICAgICAg
IGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQgPCBtaW5IZWlnaHRBbmRN
YXJnaW4uY29udGVudEhlaWdodCkKKyAgICAgICAgICAgIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4g
PSBtaW5IZWlnaHRBbmRNYXJnaW47CisgICAgfQorICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9y
bWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsKKyAgICBib3hHZW9tZXRyeS5z
ZXRDb250ZW50Qm94SGVpZ2h0KGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCk7
CisgICAgYm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyBjb250ZW50SGVpZ2h0QW5kTWFy
Z2luLm5vbkNvbGxhcHNlZE1hcmdpbi5iZWZvcmUsIGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4ubm9u
Q29sbGFwc2VkTWFyZ2luLmFmdGVyIH0pOworfQorCit2b2lkIElubGluZUZvcm1hdHRpbmdDb250
ZXh0Ojpjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCkKK3sKKyAgICBhdXRvJiBmb3JtYXR0
aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5nU3RhdGUoKTsKKyAgICBpZiAoIWZvcm1hdHRpbmdT
dGF0ZS5pbmxpbmVJdGVtcygpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIC8vIFRy
YXZlcnNlIHRoZSB0cmVlIGFuZCBjcmVhdGUgaW5saW5lIGl0ZW1zIG91dCBvZiBpbmxpbmUgYm94
ZXMgYW5kIGxlYWYgbm9kZXMuIFRoaXMgZXNzZW50aWFsbHkgdHVybnMgdGhlIHRyZWUgaW5saW5l
IHN0cnVjdHVyZSBpbnRvIGEgZmxhdCBvbmUuCisgICAgLy8gPHNwYW4+dGV4dDxzcGFuPjwvc3Bh
bj48aW1nPjwvc3Bhbj4gLT4gW0lubGluZUJveFN0YXJ0XVtJbmxpbmVMZXZlbEJveF1bSW5saW5l
Qm94U3RhcnRdW0lubGluZUJveEVuZF1bSW5saW5lTGV2ZWxCb3hdW0lubGluZUJveEVuZF0KKyAg
ICBBU1NFUlQocm9vdCgpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgpKTsKKyAgICBMYXlvdXRR
dWV1ZSBsYXlvdXRRdWV1ZTsKKyAgICBsYXlvdXRRdWV1ZS5hcHBlbmQocm9vdCgpLmZpcnN0SW5G
bG93T3JGbG9hdGluZ0NoaWxkKCkpOworICAgIHdoaWxlICghbGF5b3V0UXVldWUuaXNFbXB0eSgp
KSB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3gg
PSAqbGF5b3V0UXVldWUubGFzdCgpOworICAgICAgICAgICAgYXV0byBpc0JveFdpdGhJbmxpbmVD
b250ZW50ID0gbGF5b3V0Qm94LmlzSW5saW5lQm94KCkgJiYgIWxheW91dEJveC5pc0lubGluZVRl
eHRCb3goKSAmJiAhbGF5b3V0Qm94LmlzTGluZUJyZWFrQm94KCk7CisgICAgICAgICAgICBpZiAo
IWlzQm94V2l0aElubGluZUNvbnRlbnQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAvLyBUaGlzIGlzIHRoZSBzdGFydCBvZiBhbiBpbmxpbmUgYm94IChlLmcuIDxzcGFuPiku
CisgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkSW5saW5lSXRlbSh7IGxheW91dEJveCwg
SW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94U3RhcnQgfSk7CisgICAgICAgICAgICBhdXRvJiBp
bmxpbmVCb3hXaXRoSW5saW5lQ29udGVudCA9IGRvd25jYXN0PENvbnRhaW5lckJveD4obGF5b3V0
Qm94KTsKKyAgICAgICAgICAgIGlmICghaW5saW5lQm94V2l0aElubGluZUNvbnRlbnQuaGFzSW5G
bG93T3JGbG9hdGluZ0NoaWxkKCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICBsYXlvdXRRdWV1ZS5hcHBlbmQoaW5saW5lQm94V2l0aElubGluZUNvbnRlbnQuZmlyc3RJbkZs
b3dPckZsb2F0aW5nQ2hpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoIWxheW91
dFF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gKmxheW91
dFF1ZXVlLnRha2VMYXN0KCk7CisgICAgICAgICAgICBpZiAoaXM8TGluZUJyZWFrQm94PihsYXlv
dXRCb3gpKSB7CisgICAgICAgICAgICAgICAgYXV0byYgbGluZUJyZWFrQm94ID0gZG93bmNhc3Q8
TGluZUJyZWFrQm94PihsYXlvdXRCb3gpOworICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0
ZS5hZGRJbmxpbmVJdGVtKHsgbGF5b3V0Qm94LCBsaW5lQnJlYWtCb3guaXNPcHRpb25hbCgpID8g
SW5saW5lSXRlbTo6VHlwZTo6V29yZEJyZWFrT3Bwb3J0dW5pdHkgOiBJbmxpbmVJdGVtOjpUeXBl
OjpIYXJkTGluZUJyZWFrIH0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRCb3guaXNG
bG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRk
SW5saW5lSXRlbSh7IGxheW91dEJveCwgSW5saW5lSXRlbTo6VHlwZTo6RmxvYXQgfSk7CisgICAg
ICAgICAgICBlbHNlIGlmIChsYXlvdXRCb3guaXNBdG9taWNJbmxpbmVMZXZlbEJveCgpKQorICAg
ICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRJbmxpbmVJdGVtKHsgbGF5b3V0Qm94LCBJ
bmxpbmVJdGVtOjpUeXBlOjpCb3ggfSk7CisgICAgICAgICAgICBlbHNlIGlmIChsYXlvdXRCb3gu
aXNJbmxpbmVUZXh0Qm94KCkpIHsKKyAgICAgICAgICAgICAgICBJbmxpbmVUZXh0SXRlbTo6Y3Jl
YXRlQW5kQXBwZW5kVGV4dEl0ZW1zKGZvcm1hdHRpbmdTdGF0ZS5pbmxpbmVJdGVtcygpLCBkb3du
Y2FzdDxJbmxpbmVUZXh0Qm94PihsYXlvdXRCb3gpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAo
bGF5b3V0Qm94LmlzSW5saW5lQm94KCkpCisgICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRl
LmFkZElubGluZUl0ZW0oeyBsYXlvdXRCb3gsIElubGluZUl0ZW06OlR5cGU6OklubGluZUJveEVu
ZCB9KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKworICAgICAgICAgICAgaWYgKGF1dG8qIG5leHRTaWJsaW5nID0gbGF5b3V0Qm94Lm5l
eHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7CisgICAgICAgICAgICAgICAgbGF5b3V0UXVl
dWUuYXBwZW5kKG5leHRTaWJsaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworSW5saW5lUmVjdCBJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dDo6Y29tcHV0ZUdlb21ldHJ5Rm9yTGluZUNvbnRlbnQoY29uc3QgTGluZUJ1aWxkZXI6
OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBo
b3Jpem9udGFsQ29uc3RyYWludHMpCit7CisgICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhp
cy0+Zm9ybWF0dGluZ1N0YXRlKCk7CisgICAgYXV0byBnZW9tZXRyeSA9IHRoaXMtPmdlb21ldHJ5
KCk7CisKKyAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZUJveChnZW9tZXRyeS5saW5lQm94Rm9y
TGluZUNvbnRlbnQobGluZUNvbnRlbnQpKTsKKyAgICBjb25zdCBhdXRvJiBsaW5lQm94ID0gZm9y
bWF0dGluZ1N0YXRlLmxpbmVCb3hlcygpLmxhc3QoKTsKKyAgICBhdXRvIGxpbmVJbmRleCA9IGZv
cm1hdHRpbmdTdGF0ZS5saW5lcygpLnNpemUoKTsKKyAgICBhdXRvJiBsaW5lQm94TG9naWNhbFJl
Y3QgPSBsaW5lQm94LmxvZ2ljYWxSZWN0KCk7CisgICAgaWYgKCFsaW5lQm94Lmhhc0NvbnRlbnQo
KSkgeworICAgICAgICAvLyBGYXN0IHBhdGggZm9yIGxpbmVzIHdpdGggbm8gY29udGVudCBlLmcu
IDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2Rpdj4gb3IgPHNwYW4+PGRpdj48L2Rp
dj48L3NwYW4+IHdoZXJlIHdlIGNvbnN0cnVjdCBlbXB0eSBwcmUgYW5kIHBvc3QgYmxvY2tzLgor
ICAgICAgICBBU1NFUlQoIWxpbmVCb3guY29udGVudExvZ2ljYWxXaWR0aCgpICYmICFsaW5lQm94
TG9naWNhbFJlY3QuaGVpZ2h0KCkpOworICAgICAgICBhdXRvIHVwZGF0ZUlubGluZUJveGVzR2Vv
bWV0cnlJZkFwcGxpY2FibGUgPSBbJl0geworICAgICAgICAgICAgaWYgKCFsaW5lQm94Lmhhc0lu
bGluZUJveCgpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFZlY3Rvcjxj
b25zdCBCb3gqPiBsYXlvdXRCb3hMaXN0OworICAgICAgICAgICAgLy8gQ29sbGVjdCB0aGUgZW1w
dHkgaW5saW5lIGJveGVzIHRoYXQgc2hvd2VkIHVwIGZpcnN0IG9uIHRoaXMgbGluZS4KKyAgICAg
ICAgICAgIC8vIE5vdGUgdGhhdCBhbiBpbmxpbmUgYm94IGVuZCBvbiBhbiBlbXB0eSBsaW5lIGRv
ZXMgbm90IG1ha2UgdGhlIGlubGluZSBib3ggdGFsbGVyLgorICAgICAgICAgICAgLy8gKGUuZy4g
PGRpdj50ZXh0PHNwYW4+PGJyPjwvc3Bhbj48L2Rpdj4pIDwtIHRoZSA8c3Bhbj4gaW5saW5lIGJv
eCBpcyBhcyB0YWxsIGFzIHRoZSBsaW5lIGV2ZW4gdGhvdWdoIHRoZSA8L3NwYW4+IGlzIGFmdGVy
IGEgPGJyPiBzbyB0ZWNobmljYWxseSBpcyBvbiB0aGUgZm9sbG93aW5nIChlbXB0eSlsaW5lLgor
ICAgICAgICAgICAgZm9yIChhdXRvJiBsaW5lUnVuIDogbGluZUNvbnRlbnQucnVucykgeworICAg
ICAgICAgICAgICAgIGlmIChsaW5lUnVuLmlzSW5saW5lQm94U3RhcnQoKSkKKyAgICAgICAgICAg
ICAgICAgICAgbGF5b3V0Qm94TGlzdC5hcHBlbmQoJmxpbmVSdW4ubGF5b3V0Qm94KCkpOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChhdXRvKiBsYXlvdXRCb3ggOiBsYXlvdXRCb3hM
aXN0KSB7CisgICAgICAgICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3Rh
dGUuYm94R2VvbWV0cnkoKmxheW91dEJveCk7CisgICAgICAgICAgICAgICAgYXV0byBpbmxpbmVC
b3hMb2dpY2FsSGVpZ2h0ID0gTGF5b3V0VW5pdDo6ZnJvbUZsb2F0Q2VpbChsaW5lQm94LmxvZ2lj
YWxCb3JkZXJCb3hGb3JJbmxpbmVCb3goKmxheW91dEJveCwgYm94R2VvbWV0cnkpLmhlaWdodCgp
KTsKKyAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGlubGlu
ZUJveExvZ2ljYWxIZWlnaHQpOworICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRl
bnRCb3hXaWR0aCh7IH0pOworICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxU
b3BMZWZ0KHRvTGF5b3V0UG9pbnQobGluZUJveExvZ2ljYWxSZWN0LnRvcExlZnQoKSkpOworICAg
ICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB1cGRhdGVJbmxpbmVCb3hlc0dlb21ldHJ5
SWZBcHBsaWNhYmxlKCk7CisgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lKHsgbGluZUJv
eExvZ2ljYWxSZWN0LCB7IHsgfSwgeyB9IH0sIHsgfSwgeyB9LCB7IH0gfSk7CisgICAgICAgIHJl
dHVybiBsaW5lQm94TG9naWNhbFJlY3Q7CisgICAgfQorCisgICAgYXV0byByb290SW5saW5lQm94
TG9naWNhbFJlY3QgPSBsaW5lQm94LmxvZ2ljYWxSZWN0Rm9yUm9vdElubGluZUJveCgpOworICAg
IGF1dG8gZW5jbG9zaW5nVG9wQW5kQm90dG9tID0gSW5saW5lTGluZUdlb21ldHJ5OjpFbmNsb3Np
bmdUb3BBbmRCb3R0b20geyByb290SW5saW5lQm94TG9naWNhbFJlY3QudG9wKCksIHJvb3RJbmxp
bmVCb3hMb2dpY2FsUmVjdC5ib3R0b20oKSB9OworICAgIEhhc2hTZXQ8Y29uc3QgQm94Kj4gaW5s
aW5lQm94U3RhcnRTZXQ7CisgICAgSGFzaFNldDxjb25zdCBCb3gqPiBpbmxpbmVCb3hFbmRTZXQ7
CisKKyAgICBhdXRvIGNvbnN0cnVjdExpbmVSdW5zQW5kVXBkYXRlQm94R2VvbWV0cnkgPSBbJl0g
eworICAgICAgICAvLyBDcmVhdGUgdGhlIGlubGluZSBydW5zIG9uIHRoZSBjdXJyZW50IGxpbmUu
IFRoaXMgaXMgbW9zdGx5IHRleHQgYW5kIGF0b21pYyBpbmxpbmUgcnVucy4KKyAgICAgICAgZm9y
IChhdXRvJiBsaW5lUnVuIDogbGluZUNvbnRlbnQucnVucykgeworICAgICAgICAgICAgLy8gRklY
TUU6IFdlIHNob3VsZCBub3QgbmVlZCB0byBjb25zdHJ1Y3QgYSBsaW5lIHJ1biBmb3IgPGJyPi4K
KyAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9IGxpbmVSdW4ubGF5b3V0Qm94KCk7CisgICAg
ICAgICAgICBpZiAobGluZVJ1bi5pc1RleHQoKSkgeworICAgICAgICAgICAgICAgIGZvcm1hdHRp
bmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gsIGxpbmVCb3gubG9naWNh
bFJlY3RGb3JUZXh0UnVuKGxpbmVSdW4pLCBsaW5lUnVuLmV4cGFuc2lvbigpLCBsaW5lUnVuLnRl
eHRDb250ZW50KCkgfSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBpZiAobGluZVJ1bi5pc0xpbmVCcmVhaygpKSB7CisgICAgICAgICAgICAg
ICAgaWYgKGxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKSB7CisgICAgICAgICAgICAgICAgICAg
IC8vIE9ubHkgaGFyZCBsaW5lYnJlYWtzIGhhdmUgYXNzb2NpYXRlZCBsYXlvdXQgYm94ZXMuCisg
ICAgICAgICAgICAgICAgICAgIGF1dG8gbGluZUJyZWFrQm94UmVjdCA9IGxpbmVCb3gubG9naWNh
bFJlY3RGb3JMaW5lQnJlYWtCb3gobGF5b3V0Qm94KTsKKyAgICAgICAgICAgICAgICAgICAgZm9y
bWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBsaW5lSW5kZXgsIGxheW91dEJveCwgbGluZUJyZWFr
Qm94UmVjdCwgbGluZVJ1bi5leHBhbnNpb24oKSwgeyB9IH0pOworCisgICAgICAgICAgICAgICAg
ICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91
dEJveCk7CisgICAgICAgICAgICAgICAgICAgIGxpbmVCcmVha0JveFJlY3QubW92ZUJ5KGxpbmVC
b3hMb2dpY2FsUmVjdC50b3BMZWZ0KCkpOworICAgICAgICAgICAgICAgICAgICBib3hHZW9tZXRy
eS5zZXRMb2dpY2FsVG9wTGVmdCh0b0xheW91dFBvaW50KGxpbmVCcmVha0JveFJlY3QudG9wTGVm
dCgpKSk7CisgICAgICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWln
aHQodG9MYXlvdXRVbml0KGxpbmVCcmVha0JveFJlY3QuaGVpZ2h0KCkpKTsKKyAgICAgICAgICAg
ICAgICB9IGVsc2UgCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5l
UnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gsIGxpbmVCb3gubG9naWNhbFJlY3RGb3JUZXh0UnVu
KGxpbmVSdW4pLCBsaW5lUnVuLmV4cGFuc2lvbigpLCBsaW5lUnVuLnRleHRDb250ZW50KCkgfSk7
CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBp
ZiAobGluZVJ1bi5pc0JveCgpKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKGxheW91dEJveC5p
c0F0b21pY0lubGluZUxldmVsQm94KCkpOworICAgICAgICAgICAgICAgIGF1dG8mIGJveEdlb21l
dHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7CisgICAgICAgICAg
ICAgICAgYXV0byBsb2dpY2FsQm9yZGVyQm94ID0gbGluZUJveC5sb2dpY2FsQm9yZGVyQm94Rm9y
QXRvbWljSW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94LCBib3hHZW9tZXRyeSk7CisgICAgICAgICAg
ICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBsaW5lSW5kZXgsIGxheW91dEJveCwg
bG9naWNhbEJvcmRlckJveCwgbGluZVJ1bi5leHBhbnNpb24oKSwgeyB9IH0pOworCisgICAgICAg
ICAgICAgICAgYXV0byBib3JkZXJCb3hMb2dpY2FsVG9wTGVmdCA9IGxvZ2ljYWxCb3JkZXJCb3gu
dG9wTGVmdCgpOworICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBpbmxpbmUgYm94ZXMgYXJl
IHJlbGF0aXZlIHRvIHRoZSBsaW5lIGFuZCB0aGVpciB0b3AgcG9zaXRpb24gY2FuIGJlIG5lZ2F0
aXZlLgorICAgICAgICAgICAgICAgIGJvcmRlckJveExvZ2ljYWxUb3BMZWZ0Lm1vdmVCeShsaW5l
Qm94TG9naWNhbFJlY3QudG9wTGVmdCgpKTsKKyAgICAgICAgICAgICAgICBpZiAobGF5b3V0Qm94
LmlzSW5GbG93UG9zaXRpb25lZCgpKQorICAgICAgICAgICAgICAgICAgICBib3JkZXJCb3hMb2dp
Y2FsVG9wTGVmdCArPSBnZW9tZXRyeS5pbkZsb3dQb3NpdGlvbmVkUG9zaXRpb25PZmZzZXQobGF5
b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworICAgICAgICAgICAgICAgIC8vIEF0b21p
YyBpbmxpbmUgYm94ZXMgYXJlIGFsbCBzZXQuIFRoZWlyIG1hcmdpbi9ib3JkZXIvY29udGVudCBi
b3ggZ2VvbWV0cmllcyBhcmUgYWxyZWFkeSBjb21wdXRlZC4gV2UganVzdCBoYXZlIHRvIHBvc2l0
aW9uIHRoZW0gaGVyZS4KKyAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9w
TGVmdCh0b0xheW91dFBvaW50KGJvcmRlckJveExvZ2ljYWxUb3BMZWZ0KSk7CisKKyAgICAgICAg
ICAgICAgICBhdXRvIGJvcmRlckJveFRvcCA9IGJvcmRlckJveExvZ2ljYWxUb3BMZWZ0LnkoKTsK
KyAgICAgICAgICAgICAgICBhdXRvIGJvcmRlckJveEJvdHRvbSA9IGJvcmRlckJveFRvcCArIGJv
eEdlb21ldHJ5LmJvcmRlckJveEhlaWdodCgpOworICAgICAgICAgICAgICAgIGVuY2xvc2luZ1Rv
cEFuZEJvdHRvbS50b3AgPSBzdGQ6Om1pbihlbmNsb3NpbmdUb3BBbmRCb3R0b20udG9wLCBib3Jk
ZXJCb3hUb3ApOworICAgICAgICAgICAgICAgIGVuY2xvc2luZ1RvcEFuZEJvdHRvbS5ib3R0b20g
PSBzdGQ6Om1heChlbmNsb3NpbmdUb3BBbmRCb3R0b20uYm90dG9tLCBib3JkZXJCb3hCb3R0b20p
OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
aWYgKGxpbmVSdW4uaXNJbmxpbmVCb3hTdGFydCgpKSB7CisgICAgICAgICAgICAgICAgYXV0byYg
Ym94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsKKyAg
ICAgICAgICAgICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxSZWN0ID0gbGluZUJveC5sb2dpY2Fs
Qm9yZGVyQm94Rm9ySW5saW5lQm94KGxheW91dEJveCwgYm94R2VvbWV0cnkpOworICAgICAgICAg
ICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gs
IGlubGluZUJveExvZ2ljYWxSZWN0LCBsaW5lUnVuLmV4cGFuc2lvbigpLCB7IH0gfSk7CisgICAg
ICAgICAgICAgICAgaW5saW5lQm94U3RhcnRTZXQuYWRkKCZsYXlvdXRCb3gpOworICAgICAgICAg
ICAgICAgIGVuY2xvc2luZ1RvcEFuZEJvdHRvbS50b3AgPSBzdGQ6Om1pbihlbmNsb3NpbmdUb3BB
bmRCb3R0b20udG9wLCBpbmxpbmVCb3hMb2dpY2FsUmVjdC50b3AoKSk7CisgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZVJ1bi5pc0lu
bGluZUJveEVuZCgpKSB7CisgICAgICAgICAgICAgICAgaW5saW5lQm94RW5kU2V0LmFkZCgmbGF5
b3V0Qm94KTsKKyAgICAgICAgICAgICAgICBpZiAoIWlubGluZUJveFN0YXJ0U2V0LmNvbnRhaW5z
KCZsYXlvdXRCb3gpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFuIGlubGluZSBib3ggY2Fu
IHNwYW4gbXVsdGlwbGUgbGluZXMuIFVzZSB0aGUgW2lubGluZSBib3ggZW5kXSBzaWduYWwgdG8g
aW5jbHVkZSBpdCBpbiB0aGUgZW5jbG9zaW5nIGdlb21ldHJ5CisgICAgICAgICAgICAgICAgICAg
IC8vIG9ubHkgd2hlbiBpdCBzdGFydHMgYXQgYSBwcmV2aW91cyBsaW5lLgorICAgICAgICAgICAg
ICAgICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxSZWN0ID0gbGluZUJveC5sb2dpY2FsQm9yZGVy
Qm94Rm9ySW5saW5lQm94KGxheW91dEJveCwgZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxh
eW91dEJveCkpOworICAgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdUb3BBbmRCb3R0b20uYm90
dG9tID0gc3RkOjptYXgoZW5jbG9zaW5nVG9wQW5kQm90dG9tLmJvdHRvbSwgaW5saW5lQm94TG9n
aWNhbFJlY3QuYm90dG9tKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVChsaW5lUnVuLmlzV29y
ZEJyZWFrT3Bwb3J0dW5pdHkoKSk7CisgICAgICAgIH0KKyAgICB9OworICAgIGNvbnN0cnVjdExp
bmVSdW5zQW5kVXBkYXRlQm94R2VvbWV0cnkoKTsKKworICAgIGF1dG8gdXBkYXRlQm94R2VvbWV0
cnlGb3JJbmxpbmVCb3hlcyA9IFsmXSB7CisgICAgICAgIC8vIEZJWE1FOiBXZSBtYXkgd2FudCB0
byBrZWVwIGFyb3VuZCBhbiBpbmxpbmUgYm94IG9ubHkgc2V0LgorICAgICAgICBpZiAoIWxpbmVC
b3guaGFzSW5saW5lQm94KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8vIEdyYWIg
dGhlIGlubGluZSBib3hlcyAoZXZlbiB0aG9zZSB0aGF0IGRvbid0IGhhdmUgYXNzb2NpYXRlZCBs
YXlvdXQgYm94ZXMgb24gdGhlIGN1cnJlbnQgbGluZSBkdWUgdG8gbGluZSB3cmFwcGluZykKKyAg
ICAgICAgLy8gYW5kIHVwZGF0ZSB0aGVpciBnZW9tZXRyaWVzLgorICAgICAgICBmb3IgKGF1dG8m
IGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hlcygpKSB7Cisg
ICAgICAgICAgICBpZiAoIWlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkpCisgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBpbmxpbmVMZXZl
bEJveC5sYXlvdXRCb3goKTsKKyAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0
dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7CisgICAgICAgICAgICAvLyBJbmxpbmUg
Ym94ZXMgbWF5IG9yIG1heSBub3QgYmUgd3JhcHBlZCBhbmQgaGF2ZSBydW5zIG9uIG11bHRpcGxl
IGxpbmVzIChlLmcuIDxzcGFuPmZpcnN0IGxpbmU8YnI+c2Vjb25kIGxpbmU8YnI+dGhpcmQgbGlu
ZTwvc3Bhbj4pCisgICAgICAgICAgICBhdXRvIGlubGluZUJveEJvcmRlckJveCA9IGxpbmVCb3gu
bG9naWNhbEJvcmRlckJveEZvcklubGluZUJveChsYXlvdXRCb3gsIGJveEdlb21ldHJ5KTsKKyAg
ICAgICAgICAgIGF1dG8gaW5saW5lQm94U2l6ZSA9IExheW91dFNpemUgeyBMYXlvdXRVbml0Ojpm
cm9tRmxvYXRDZWlsKGlubGluZUJveEJvcmRlckJveC53aWR0aCgpKSwgTGF5b3V0VW5pdDo6ZnJv
bUZsb2F0Q2VpbChpbmxpbmVCb3hCb3JkZXJCb3guaGVpZ2h0KCkpIH07CisgICAgICAgICAgICBh
dXRvIGxvZ2ljYWxSZWN0ID0gUmVjdCB7IExheW91dFBvaW50IHsgaW5saW5lQm94Qm9yZGVyQm94
LnRvcExlZnQoKSB9LCBpbmxpbmVCb3hTaXplIH07CisgICAgICAgICAgICBsb2dpY2FsUmVjdC5t
b3ZlQnkoTGF5b3V0UG9pbnQgeyBsaW5lQm94TG9naWNhbFJlY3QudG9wTGVmdCgpIH0pOworICAg
ICAgICAgICAgaWYgKGlubGluZUJveFN0YXJ0U2V0LmNvbnRhaW5zKCZsYXlvdXRCb3gpKSB7Cisg
ICAgICAgICAgICAgICAgLy8gVGhpcyBpbmxpbmUgYm94IHNob3dlZCB1cCBmaXJzdCBvbiB0aGlz
IGxpbmUuCisgICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQobG9n
aWNhbFJlY3QudG9wTGVmdCgpKTsKKyAgICAgICAgICAgICAgICBhdXRvIGNvbnRlbnRCb3hIZWln
aHQgPSBsb2dpY2FsUmVjdC5oZWlnaHQoKSAtIChib3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigp
ICsgYm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KSk7CisgICAgICAg
ICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodChjb250ZW50Qm94SGVpZ2h0
KTsKKyAgICAgICAgICAgICAgICBhdXRvIGNvbnRlbnRCb3hXaWR0aCA9IGxvZ2ljYWxSZWN0Lndp
ZHRoKCkgLSAoYm94R2VvbWV0cnkuaG9yaXpvbnRhbEJvcmRlcigpICsgYm94R2VvbWV0cnkuaG9y
aXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKTsKKyAgICAgICAgICAgICAgICBib3hHZW9t
ZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudEJveFdpZHRoKTsKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE1pZGRsZSBvciBlbmQg
b2YgdGhlIGlubGluZSBib3guIExldCdzIHN0cmV0Y2ggdGhlIGJveCBhcyBuZWVkZWQuCisgICAg
ICAgICAgICBhdXRvIGVuY2xvc2luZ0JvcmRlckJveFJlY3QgPSBCb3hHZW9tZXRyeTo6Ym9yZGVy
Qm94UmVjdChib3hHZW9tZXRyeSk7CisgICAgICAgICAgICBlbmNsb3NpbmdCb3JkZXJCb3hSZWN0
LmV4cGFuZFRvQ29udGFpbihsb2dpY2FsUmVjdCk7CisgICAgICAgICAgICBib3hHZW9tZXRyeS5z
ZXRMb2dpY2FsTGVmdChlbmNsb3NpbmdCb3JkZXJCb3hSZWN0LmxlZnQoKSk7CisKKyAgICAgICAg
ICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoZW5jbG9zaW5nQm9yZGVyQm94UmVj
dC5oZWlnaHQoKSAtIChib3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigpICsgYm94R2VvbWV0cnku
dmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KSkpOworICAgICAgICAgICAgYm94R2VvbWV0
cnkuc2V0Q29udGVudEJveFdpZHRoKGVuY2xvc2luZ0JvcmRlckJveFJlY3Qud2lkdGgoKSAtIChi
b3hHZW9tZXRyeS5ob3Jpem9udGFsQm9yZGVyKCkgKyBib3hHZW9tZXRyeS5ob3Jpem9udGFsUGFk
ZGluZygpLnZhbHVlT3IoMF9sdSkpKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdXBkYXRlQm94
R2VvbWV0cnlGb3JJbmxpbmVCb3hlcygpOworCisgICAgYXV0byBjb25zdHJ1Y3RMaW5lR2VvbWV0
cnkgPSBbJl0geworICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZSh7IGxpbmVCb3hMb2dp
Y2FsUmVjdCwgZW5jbG9zaW5nVG9wQW5kQm90dG9tLCBsaW5lQm94LmFsaWdubWVudEJhc2VsaW5l
KCksIHJvb3RJbmxpbmVCb3hMb2dpY2FsUmVjdC5sZWZ0KCksIGxpbmVDb250ZW50LmNvbnRlbnRM
b2dpY2FsV2lkdGggfSk7CisgICAgfTsKKyAgICBjb25zdHJ1Y3RMaW5lR2VvbWV0cnkoKTsKKwor
ICAgIHJldHVybiBsaW5lQm94TG9naWNhbFJlY3Q7Cit9CisKK3ZvaWQgSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQ6OmludmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoY29uc3QgSW52YWxpZGF0aW9uU3Rh
dGUmKQoreworICAgIC8vIEZpbmQgb3V0IHdoYXQgd2UgbmVlZCB0byBpbnZhbGlkYXRlLiBUaGlz
IGlzIHdoZXJlIHdlIGFkZCBzb21lIHNtYXJ0cyB0byBkbyBwYXJ0aWFsIGxpbmUgbGF5b3V0Lgor
ICAgIC8vIEZvciBub3cgbGV0J3MganVzdCBjbGVhciB0aGUgcnVucy4KKyAgICBmb3JtYXR0aW5n
U3RhdGUoKS5jbGVhckxpbmVBbmRSdW5zKCk7CisgICAgLy8gRklYTUU6IFRoaXMgaXMgYWxzbyB3
aGVyZSB3ZSB3b3VsZCBkZWxldGUgaW5saW5lIGl0ZW1zIGlmIHRoZWlyIGNvbnRlbnQgY2hhbmdl
ZC4KK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmggYi9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmFkN2VjOTcyMzdjMWU4OGQ3ODg2MDI2N2ExODA3
ZTIwNDhhZjQzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5oCkBAIC0wLDAg
KzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4K
KyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VU
X0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCisj
aW5jbHVkZSAiSW5saW5lTGluZUJ1aWxkZXIuaCIKKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBJbmxp
bmVGb3JtYXR0aW5nU3RhdGU7CitjbGFzcyBJbnZhbGlkYXRpb25TdGF0ZTsKK2NsYXNzIExpbmVC
b3g7CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbGF5b3V0IGxvZ2ljIGZvciBpbmxp
bmUgZm9ybWF0dGluZyBjb250ZXh0cy4KKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1MyMi92
aXN1cmVuLmh0bWwjaW5saW5lLWZvcm1hdHRpbmcKK2NsYXNzIElubGluZUZvcm1hdHRpbmdDb250
ZXh0IGZpbmFsIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9JU09f
QUxMT0NBVEVEKElubGluZUZvcm1hdHRpbmdDb250ZXh0KTsKK3B1YmxpYzoKKyAgICBJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9v
dCwgSW5saW5lRm9ybWF0dGluZ1N0YXRlJik7CisgICAgdm9pZCBsYXlvdXRJbkZsb3dDb250ZW50
KEludmFsaWRhdGlvblN0YXRlJiwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jikg
b3ZlcnJpZGU7CisgICAgTGF5b3V0VW5pdCB1c2VkQ29udGVudEhlaWdodCgpIGNvbnN0IG92ZXJy
aWRlOworCisgICAgY2xhc3MgUXVpcmtzIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpRdWly
a3MgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBpbml0aWFsTGluZUhl
aWdodCgpIGNvbnN0OworICAgICAgICBib29sIGhhc1NvZnRXcmFwT3Bwb3J0dW5pdHlBdEltYWdl
KCkgY29uc3Q7CisgICAgICAgIGJvb2wgaW5saW5lTGV2ZWxCb3hBZmZlY3RzTGluZUJveChjb25z
dCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYsIGNvbnN0IExpbmVCb3gmKSBjb25zdDsKKworICAg
IHByaXZhdGU6CisgICAgICAgIGZyaWVuZCBjbGFzcyBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsK
KyAgICAgICAgUXVpcmtzKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Jik7CisKKyAgICAg
ICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29u
c3QgeyByZXR1cm4gZG93bmNhc3Q8SW5saW5lRm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdD
b250ZXh0OjpRdWlya3M6OmZvcm1hdHRpbmdDb250ZXh0KCkpOyB9CisKKyAgICB9OworICAgIElu
bGluZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgcXVpcmtzKCkgY29uc3QgeyByZXR1cm4gUXVp
cmtzKCp0aGlzKTsgfQorCisgICAgY29uc3QgSW5saW5lRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0
aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxJbmxpbmVGb3JtYXR0aW5nU3RhdGU+
KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KKyAgICBJbmxpbmVGb3Jt
YXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIGRvd25jYXN0PElubGluZUZv
cm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgpKTsgfQor
CisgICAgdm9pZCBsaW5lTGF5b3V0Rm9ySW50ZXJncmF0aW9uKEludmFsaWRhdGlvblN0YXRlJiwg
Y29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jik7CisKK3ByaXZhdGU6CisgICAgSW50
cmluc2ljV2lkdGhDb25zdHJhaW50cyBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMo
KSBvdmVycmlkZTsKKworICAgIGNsYXNzIEdlb21ldHJ5IDogcHVibGljIEZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeSB7CisgICAgcHVibGljOgorICAgICAgICBMaW5lQm94IGxpbmVCb3hGb3JM
aW5lQ29udGVudChjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmKTsKKyAgICAgICAgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsVG9wRm9yTmV4dExpbmUoY29uc3QgTGluZUJ1aWxkZXI6Okxp
bmVDb250ZW50JiwgSW5saW5lTGF5b3V0VW5pdCBwcmV2aW91c0xpbmVMb2dpY2FsQm90dG9tLCBj
b25zdCBGbG9hdGluZ0NvbnRleHQmKSBjb25zdDsKKworICAgICAgICBDb250ZW50SGVpZ2h0QW5k
TWFyZ2luIGlubGluZUJsb2NrQ29udGVudEhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25z
dCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBPdmVycmlkZGVuVmVydGljYWxWYWx1ZXMm
KSBjb25zdDsKKyAgICAgICAgQ29udGVudFdpZHRoQW5kTWFyZ2luIGlubGluZUJsb2NrQ29udGVu
dFdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYs
IGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFsVmFsdWVzJik7CisKKyAgICBwcml2YXRlOgorICAg
ICAgICBmcmllbmQgY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7CisgICAgICAgIEdlb21l
dHJ5KGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Jik7CisKKyAgICAgICAgY29uc3QgSW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4g
ZG93bmNhc3Q8SW5saW5lRm9ybWF0dGluZ0NvbnRleHQ+KEZvcm1hdHRpbmdDb250ZXh0OjpHZW9t
ZXRyeTo6Zm9ybWF0dGluZ0NvbnRleHQoKSk7IH0KKworICAgIH07CisgICAgSW5saW5lRm9ybWF0
dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4gR2VvbWV0cnko
KnRoaXMpOyB9CisKKyAgICB2b2lkIGxpbmVMYXlvdXQoSW5saW5lSXRlbXMmLCBMaW5lQnVpbGRl
cjo6SW5saW5lSXRlbVJhbmdlLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmKTsK
KworICAgIHZvaWQgY29tcHV0ZUludHJpbnNpY1dpZHRoRm9yRm9ybWF0dGluZ1Jvb3QoY29uc3Qg
Qm94Jik7CisgICAgSW5saW5lTGF5b3V0VW5pdCBjb21wdXRlZEludHJpbnNpY1dpZHRoRm9yQ29u
c3RyYWludChJbmxpbmVMYXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKSBjb25zdDsKKworICAgIHZv
aWQgY29tcHV0ZUhvcml6b250YWxNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpvbnRhbENv
bnN0cmFpbnRzJik7CisgICAgdm9pZCBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYs
IGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOworICAgIHZvaWQgY29tcHV0ZVdpZHRoQW5k
TWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYpOworCisgICAg
dm9pZCBjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCk7CisgICAgSW5saW5lUmVjdCBjb21w
dXRlR2VvbWV0cnlGb3JMaW5lQ29udGVudChjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQm
LCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmKTsKKyAgICB2b2lkIGludmFsaWRhdGVGb3Jt
YXR0aW5nU3RhdGUoY29uc3QgSW52YWxpZGF0aW9uU3RhdGUmKTsKK307CisKK2lubGluZSBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6Okdlb21ldHJ5KGNvbnN0IElubGluZUZvcm1h
dHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICA6IEZvcm1hdHRpbmdD
b250ZXh0OjpHZW9tZXRyeShpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKK3sKK30KKworaW5saW5l
IElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OlF1aXJrcyhjb25zdCBJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dCYgaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCisgICAgOiBGb3JtYXR0aW5n
Q29udGV4dDo6UXVpcmtzKGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQoreworfQorCit9Cit9CisK
K1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVChJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCwgaXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKQorCisjZW5kaWYK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5s
aW5lL0lubGluZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRH
ZW9tZXRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjI0ZTc4ODMzMzgwZmI0Y2MyMDUxMzU5YTM2YjUwNDk1
NDliOWFkMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lL0lubGluZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCkBA
IC0wLDAgKzEsNzI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1B
VFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUg
IkZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgorI2luY2x1
ZGUgIkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91dENvbnRhaW5lckJveC5oIgorI2luY2x1
ZGUgIkxheW91dFJlcGxhY2VkQm94LmgiCisjaW5jbHVkZSAiTGVuZ3RoRnVuY3Rpb25zLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBMaW5lQm94
QnVpbGRlciB7CitwdWJsaWM6CisgICAgTGluZUJveEJ1aWxkZXIoY29uc3QgSW5saW5lRm9ybWF0
dGluZ0NvbnRleHQmKTsKKyAgICBMaW5lQm94IGJ1aWxkKGNvbnN0IExpbmVCdWlsZGVyOjpMaW5l
Q29udGVudCYpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBTaW1wbGlmaWVkVmVydGljYWxBbGln
bm1lbnQgeworICAgICAgICBTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQoY29uc3QgTGluZUJv
eDo6SW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gpOworCisgICAgICAgIHN0YXRpYyBib29s
IGNhblVzZVNpbXBsaWZpZWRBbGlnbm1lbnQoY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gm
IHJvb3RJbmxpbmVCb3gsIGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiwgT3B0aW9uYWw8
Y29uc3QgQm94R2VvbWV0cnk+IGlubGluZUxldmVsQm94R2VvbWV0cnkpOworCisgICAgICAgIHZv
aWQgYWxpZ24oTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmKTsKKworICAgICAgICBJbmxpbmVMYXlv
dXRVbml0IHJvb3RJbmxpbmVCb3hMb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbV9yb290SW5s
aW5lQm94TG9naWNhbFRvcDsgfQorICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxpbmVCb3hIZWln
aHQoKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hMb2dpY2FsQm90dG9tIC0gbV9saW5lQm94TG9n
aWNhbFRvcDsgfQorCisgICAgICAgIHZvaWQgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpIHsgbV9p
c0VuYWJsZWQgPSBlbmFibGVkOyB9CisgICAgICAgIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgeyBy
ZXR1cm4gbV9pc0VuYWJsZWQ7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgYWRqdXN0
KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94Jik7CisKKyAgICAgICAgY29uc3QgTGluZUJv
eDo6SW5saW5lTGV2ZWxCb3gmIG1fcm9vdElubGluZUJveDsKKyAgICAgICAgYm9vbCBtX2lzRW5h
YmxlZCB7IHRydWUgfTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2xpbmVCb3hMb2dpY2Fs
VG9wIHsgMCB9OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fbGluZUJveExvZ2ljYWxCb3R0
b20geyAwIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV9yb290SW5saW5lQm94TG9naWNh
bFRvcCB7IDAgfTsKKyAgICB9OworCisgICAgdm9pZCBzZXRWZXJ0aWNhbEdlb21ldHJ5Rm9ySW5s
aW5lQm94KExpbmVCb3g6OklubGluZUxldmVsQm94JikgY29uc3Q7CisgICAgdm9pZCBjb25zdHJ1
Y3RBbmRBbGlnbklubGluZUxldmVsQm94ZXMoTGluZUJveCYsIGNvbnN0IExpbmU6OlJ1bkxpc3Qm
KTsKKyAgICB2b2lkIGNvbXB1dGVMaW5lQm94SGVpZ2h0QW5kQWxpZ25JbmxpbmVMZXZlbEJveGVz
VmVydGljYWxseShMaW5lQm94Jik7CisKKyAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2lubGluZUZvcm1hdHRpbmdD
b250ZXh0OyB9CisgICAgY29uc3QgQm94JiByb290Qm94KCkgY29uc3QgeyByZXR1cm4gZm9ybWF0
dGluZ0NvbnRleHQoKS5yb290KCk7IH0KKyAgICBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUoKSBj
b25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmxheW91dFN0YXRlKCk7IH0KKworICAg
IGJvb2wgaXNSb290TGF5b3V0Qm94KGNvbnN0IENvbnRhaW5lckJveCYgY29udGFpbmVyQm94KSBj
b25zdCB7IHJldHVybiAmY29udGFpbmVyQm94ID09ICZyb290Qm94KCk7IH0KKworcHJpdmF0ZToK
KyAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgbV9pbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dDsKK307CisKK3N0cnVjdCBIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVudCB7Citw
dWJsaWM6CisgICAgdm9pZCByZXNldCgpOworCisgICAgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCgp
IGNvbnN0IHsgcmV0dXJuIG1fd2lkdGg7IH0KKyAgICBib29sIGlzQ29uZGl0aW9uYWwoKSBjb25z
dCB7IHJldHVybiBtX2lzQ29uZGl0aW9uYWw7IH0KKworICAgIHZvaWQgc2V0SXNDb25kaXRpb25h
bCgpIHsgbV9pc0NvbmRpdGlvbmFsID0gdHJ1ZTsgfQorICAgIHZvaWQgZXhwYW5kKElubGluZUxh
eW91dFVuaXQgd2lkdGgpIHsgbV93aWR0aCArPSB3aWR0aDsgfQorCitwcml2YXRlOgorICAgIGJv
b2wgbV9pc0NvbmRpdGlvbmFsIHsgZmFsc2UgfTsKKyAgICBJbmxpbmVMYXlvdXRVbml0IG1fd2lk
dGggeyAwIH07Cit9OworCit2b2lkIEhhbmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50Ojpy
ZXNldCgpCit7CisgICAgbV9pc0NvbmRpdGlvbmFsID0gZmFsc2U7CisgICAgbV93aWR0aCA9ICAw
OworfQorCitzdGF0aWMgSGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQgY29sbGVjdEhh
bmdpbmdUcmFpbGluZ1doaXRlc3BhY2VDb250ZW50KGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnMs
IGJvb2wgaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KQoreworICAgIGF1dG8gaGFuZ2luZ0Nv
bnRlbnQgPSBIYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVudCB7IH07CisgICAgaWYgKGlz
TGFzdExpbmVXaXRoSW5saW5lQ29udGVudCkKKyAgICAgICAgaGFuZ2luZ0NvbnRlbnQuc2V0SXND
b25kaXRpb25hbCgpOworICAgIGZvciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJzZWRSYW5n
ZShydW5zKSkgeworICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94U3RhcnQoKSB8fCBydW4uaXNJ
bmxpbmVCb3hFbmQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAocnVuLmlz
TGluZUJyZWFrKCkpIHsKKyAgICAgICAgICAgIGhhbmdpbmdDb250ZW50LnNldElzQ29uZGl0aW9u
YWwoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICghcnVu
Lmhhc1RyYWlsaW5nV2hpdGVzcGFjZSgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8v
IENoZWNrIGlmIHdlIGhhdmUgYSBwcmVzZXJ2ZWQgb3IgaHVuZyB3aGl0ZXNwYWNlLgorICAgICAg
ICBpZiAocnVuLnN0eWxlKCkud2hpdGVTcGFjZSgpICE9IFdoaXRlU3BhY2U6OlByZVdyYXApCisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gVGhpcyBpcyBlaXRoZXIgYSBub3JtYWwgb3Ig
Y29uZGl0aW9uYWxseSBoYW5naW5nIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICAgIGhhbmdp
bmdDb250ZW50LmV4cGFuZChydW4udHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoKSk7CisgICAgfQor
ICAgIHJldHVybiBoYW5naW5nQ29udGVudDsKK30KKworc3RhdGljIE9wdGlvbmFsPElubGluZUxh
eW91dFVuaXQ+IGhvcml6b250YWxBbGlnbm1lbnRPZmZzZXQoY29uc3QgTGluZTo6UnVuTGlzdCYg
cnVucywgVGV4dEFsaWduTW9kZSB0ZXh0QWxpZ24sIElubGluZUxheW91dFVuaXQgbGluZUxvZ2lj
YWxXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoLCBib29sIGlzTGFz
dExpbmUpCit7CisgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IGxpbmVMb2dpY2FsV2lkdGggLSBj
b250ZW50TG9naWNhbFdpZHRoOworICAgIGF1dG8gaGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNv
bnRlbnQgPSBjb2xsZWN0SGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQocnVucywgaXNM
YXN0TGluZSk7CisgICAgYXZhaWxhYmxlV2lkdGggKz0gaGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFj
ZUNvbnRlbnQud2lkdGgoKTsKKyAgICBpZiAoYXZhaWxhYmxlV2lkdGggPD0gMCkKKyAgICAgICAg
cmV0dXJuIHsgfTsKKworICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsQWxpZ25tZW50ID0gWyZd
IHsKKyAgICAgICAgaWYgKHRleHRBbGlnbiAhPSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5KQorICAg
ICAgICAgICAgcmV0dXJuIHRleHRBbGlnbjsKKyAgICAgICAgLy8gVGV4dCBpcyBqdXN0aWZpZWQg
YWNjb3JkaW5nIHRvIHRoZSBtZXRob2Qgc3BlY2lmaWVkIGJ5IHRoZSB0ZXh0LWp1c3RpZnkgcHJv
cGVydHksCisgICAgICAgIC8vIGluIG9yZGVyIHRvIGV4YWN0bHkgZmlsbCB0aGUgbGluZSBib3gu
IFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRleHQtYWxpZ24tbGFzdCwKKyAgICAgICAg
Ly8gdGhlIGxhc3QgbGluZSBiZWZvcmUgYSBmb3JjZWQgYnJlYWsgb3IgdGhlIGVuZCBvZiB0aGUg
YmxvY2sgaXMgc3RhcnQtYWxpZ25lZC4KKyAgICAgICAgaWYgKGlzTGFzdExpbmUgfHwgKCFydW5z
LmlzRW1wdHkoKSAmJiBydW5zLmxhc3QoKS5pc0xpbmVCcmVhaygpKSkKKyAgICAgICAgICAgIHJl
dHVybiBUZXh0QWxpZ25Nb2RlOjpTdGFydDsKKyAgICAgICAgcmV0dXJuIFRleHRBbGlnbk1vZGU6
Okp1c3RpZnk7CisgICAgfTsKKworICAgIHN3aXRjaCAoY29tcHV0ZWRIb3Jpem9udGFsQWxpZ25t
ZW50KCkpIHsKKyAgICBjYXNlIFRleHRBbGlnbk1vZGU6OkxlZnQ6CisgICAgY2FzZSBUZXh0QWxp
Z25Nb2RlOjpXZWJLaXRMZWZ0OgorICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6U3RhcnQ6CisgICAg
ICAgIHJldHVybiB7IH07CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpSaWdodDoKKyAgICBjYXNl
IFRleHRBbGlnbk1vZGU6OldlYktpdFJpZ2h0OgorICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6RW5k
OgorICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgY2FzZSBUZXh0QWxpZ25Nb2Rl
OjpDZW50ZXI6CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpXZWJLaXRDZW50ZXI6CisgICAgICAg
IHJldHVybiBhdmFpbGFibGVXaWR0aCAvIDI7CisgICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpKdXN0
aWZ5OgorICAgICAgICAvLyBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5IGlzIGEgcnVuIGFsaWdubWVu
dCAoYW5kIHdlIG9ubHkgZG8gaW5saW5lIGJveCBhbGlnbm1lbnQgaGVyZSkKKyAgICAgICAgcmV0
dXJuIHsgfTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lF
VCgpOworICAgICAgICByZXR1cm4geyB9OworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICByZXR1cm4geyB9OworfQorCitMaW5lQm94QnVpbGRlcjo6TGluZUJveEJ1aWxkZXIo
Y29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQor
ICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkK
K3sKK30KKworTGluZUJveCBMaW5lQm94QnVpbGRlcjo6YnVpbGQoY29uc3QgTGluZUJ1aWxkZXI6
OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCkKK3sKKyAgICBhdXRvJiBydW5zID0gbGluZUNvbnRl
bnQucnVuczsKKyAgICBhdXRvIGxpbmVMb2dpY2FsV2lkdGggPSBsaW5lQ29udGVudC5saW5lTG9n
aWNhbFdpZHRoOworICAgIGF1dG8gY29udGVudExvZ2ljYWxXaWR0aCA9IGxpbmVDb250ZW50LmNv
bnRlbnRMb2dpY2FsV2lkdGg7CisgICAgYXV0byBob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0ID0g
TGF5b3V0Ojpob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0KHJ1bnMsIHJvb3RCb3goKS5zdHlsZSgp
LnRleHRBbGlnbigpLCBsaW5lTG9naWNhbFdpZHRoLCBjb250ZW50TG9naWNhbFdpZHRoLCBsaW5l
Q29udGVudC5pc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQpOworICAgIGF1dG8gbGluZUJveCA9
IExpbmVCb3ggeyByb290Qm94KCksIGxpbmVDb250ZW50LmxvZ2ljYWxUb3BMZWZ0LCBsaW5lTG9n
aWNhbFdpZHRoLCBob3Jpem9udGFsQWxpZ25tZW50T2Zmc2V0LnZhbHVlT3IoSW5saW5lTGF5b3V0
VW5pdCB7IH0pLCBjb250ZW50TG9naWNhbFdpZHRoLCBsaW5lQ29udGVudC5ub25TcGFubmluZ0lu
bGluZUxldmVsQm94Q291bnQgfTsKKyAgICBjb25zdHJ1Y3RBbmRBbGlnbklubGluZUxldmVsQm94
ZXMobGluZUJveCwgcnVucyk7CisgICAgcmV0dXJuIGxpbmVCb3g7Cit9CisKK3ZvaWQgTGluZUJv
eEJ1aWxkZXI6OnNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3goTGluZUJveDo6SW5saW5l
TGV2ZWxCb3gmIGlubGluZUxldmVsQm94KSBjb25zdAoreworICAgIEFTU0VSVChpbmxpbmVMZXZl
bEJveC5pc0lubGluZUJveCgpIHx8IGlubGluZUxldmVsQm94LmlzTGluZUJyZWFrQm94KCkpOwor
ICAgIGF1dG8mIGZvbnRNZXRyaWNzID0gaW5saW5lTGV2ZWxCb3guc3R5bGUoKS5mb250TWV0cmlj
cygpOworICAgIElubGluZUxheW91dFVuaXQgYXNjZW50ID0gZm9udE1ldHJpY3MuYXNjZW50KCk7
CisgICAgSW5saW5lTGF5b3V0VW5pdCBkZXNjZW50ID0gZm9udE1ldHJpY3MuZGVzY2VudCgpOwor
ICAgIGF1dG8gbG9naWNhbEhlaWdodCA9IGFzY2VudCArIGRlc2NlbnQ7CisgICAgLy8gV2UgbmVl
ZCBmbG9vci9jZWlsIHRvIG1hdGNoIGxlZ2FjeSBsYXlvdXQgaW50ZWdyYWwgcG9zaXRpb25pbmcu
CisgICAgaW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUoZmxvb3JmKGFzY2VudCkpOworICAgIGlu
bGluZUxldmVsQm94LnNldERlc2NlbnQoY2VpbChkZXNjZW50KSk7CisgICAgaW5saW5lTGV2ZWxC
b3guc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KTsKKworICAgIC8vIEZJWE1FOiBBZGp1
c3QgbGF5b3V0IGJvdW5kcyB3aXRoIGZhbGxiYWNrIGZvbnQgd2hlbiBhcHBsaWNhYmxlLgorICAg
IGF1dG8mIHN0eWxlID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5bGUoKTsKKyAgICBh
dXRvIGxpbmVIZWlnaHQgPSBzdHlsZS5saW5lSGVpZ2h0KCk7CisgICAgaWYgKGxpbmVIZWlnaHQu
aXNOZWdhdGl2ZSgpKSB7CisgICAgICAgIC8vIElmIGxpbmUtaGVpZ2h0IGNvbXB1dGVzIHRvIG5v
cm1hbCBhbmQgZWl0aGVyIHRleHQtZWRnZSBpcyBsZWFkaW5nIG9yIHRoaXMgaXMgdGhlIHJvb3Qg
aW5saW5lIGJveCwKKyAgICAgICAgLy8gdGhlIGZvbnTigJlzIGxpbmUgZ2FwIG1ldHJpYyBtYXkg
YWxzbyBiZSBpbmNvcnBvcmF0ZWQgaW50byBBIGFuZCBEIGJ5IGFkZGluZyBoYWxmIHRvIGVhY2gg
c2lkZSBhcyBoYWxmLWxlYWRpbmcuCisgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9j
c3MtaW5saW5lLTMvI2lubGluZS1oZWlnaHQKKyAgICAgICAgLy8gU2luY2UgdGV4dC1lZGdlIGlz
IG5vdCBzdXBwb3J0ZWQgeWV0IGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSBpcyBsZWFkaW5nLCB3ZSBz
aG91bGQganVzdCBhcHBseSBpdCB0bworICAgICAgICAvLyBhbGwgaW5saW5lIGJveGVzLgorICAg
ICAgICBhdXRvIGhhbGZMaW5lR2FwID0gKGZvbnRNZXRyaWNzLmxpbmVTcGFjaW5nKCkgLSBsb2dp
Y2FsSGVpZ2h0KSAvIDI7CisgICAgICAgIGFzY2VudCArPSBoYWxmTGluZUdhcDsKKyAgICAgICAg
ZGVzY2VudCArPSBoYWxmTGluZUdhcDsKKyAgICB9IGVsc2UgeworICAgICAgICBJbmxpbmVMYXlv
dXRVbml0IGxpbmVIZWlnaHQgPSBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKTsKKyAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCBoYWxmTGVhZGluZyA9IChsaW5lSGVpZ2h0IC0gKGFzY2VudCArIGRl
c2NlbnQpKSAvIDI7CisgICAgICAgIGFzY2VudCArPSBoYWxmTGVhZGluZzsKKyAgICAgICAgZGVz
Y2VudCArPSBoYWxmTGVhZGluZzsKKyAgICB9CisgICAgLy8gV2UgbmVlZCBmbG9vci9jZWlsIHRv
IG1hdGNoIGxlZ2FjeSBsYXlvdXQgaW50ZWdyYWwgcG9zaXRpb25pbmcuCisgICAgaW5saW5lTGV2
ZWxCb3guc2V0TGF5b3V0Qm91bmRzKExpbmVCb3g6OklubGluZUxldmVsQm94OjpMYXlvdXRCb3Vu
ZHMgeyBmbG9vcmYoYXNjZW50KSwgY2VpbChkZXNjZW50KSB9KTsKK30KKwordm9pZCBMaW5lQm94
QnVpbGRlcjo6Y29uc3RydWN0QW5kQWxpZ25JbmxpbmVMZXZlbEJveGVzKExpbmVCb3gmIGxpbmVC
b3gsIGNvbnN0IExpbmU6OlJ1bkxpc3QmIHJ1bnMpCit7CisgICAgYXV0byYgcm9vdElubGluZUJv
eCA9IGxpbmVCb3gucm9vdElubGluZUJveCgpOworICAgIHNldFZlcnRpY2FsR2VvbWV0cnlGb3JJ
bmxpbmVCb3gocm9vdElubGluZUJveCk7CisKKyAgICBhdXRvIHNpbXBsaWZpZWRWZXJ0aWNhbEFs
aWdubWVudCA9IFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudCB7IHJvb3RJbmxpbmVCb3ggfTsK
KyAgICAvLyBGSVhNRTogQWRkIGZhc3QgcGF0aCBzdXBwb3J0IGZvciBsaW5lLWhlaWdodCBjb250
ZW50LgorICAgIHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5zZXRFbmFibGVkKGxheW91dFN0
YXRlKCkuaW5TdGFuZGFyZHNNb2RlKCkgJiYgcm9vdEJveCgpLnN0eWxlKCkubGluZUhlaWdodCgp
LmlzTmVnYXRpdmUoKSk7CisKKyAgICBhdXRvIHNpbXBsaWZpZWRBbGlnblZlcnRpY2FsbHlJZkFw
cGxpY2FibGUgPSBbJl0oYXV0byYgaW5saW5lTGV2ZWxCb3gsIE9wdGlvbmFsPGNvbnN0IEJveEdl
b21ldHJ5PiBib3hHZW9tZXRyeSkgeworICAgICAgICBpZiAoIXNpbXBsaWZpZWRWZXJ0aWNhbEFs
aWdubWVudC5pc0VuYWJsZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKCFT
aW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OmNhblVzZVNpbXBsaWZpZWRBbGlnbm1lbnQocm9v
dElubGluZUJveCwgaW5saW5lTGV2ZWxCb3gsIGJveEdlb21ldHJ5KSkgeworICAgICAgICAgICAg
c2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50LnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVu
dC5hbGlnbihpbmxpbmVMZXZlbEJveCk7CisgICAgfTsKKworICAgIGF1dG8gY3JlYXRlV3JhcHBl
ZElubGluZUJveGVzID0gWyZdIHsKKyAgICAgICAgaWYgKHJ1bnMuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICAvLyBBbiBpbmxpbmUgYm94IG1heSBub3QgbmVjZXNzYXJp
bHkgc3RhcnQgb24gdGhlIGN1cnJlbnQgbGluZToKKyAgICAgICAgLy8gPHNwYW4gaWQ9b3V0ZXI+
bGluZSBicmVhazxicj50aGlzIGNvbnRlbnQncyBwYXJlbnQgaW5saW5lIGJveCgnb3V0ZXInKSA8
c3BhbiBpZD1pbm5lcj5zdGFydHMgb24gdGhlIHByZXZpb3VzIGxpbmU8L3NwYW4+PC9zcGFuPgor
ICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlJ3MgYW4gTGluZUJveDo6
SW5saW5lTGV2ZWxCb3ggZm9yIGV2ZXJ5IGlubGluZSBib3ggdGhhdCdzIHByZXNlbnQgb24gdGhl
IGN1cnJlbnQgbGluZS4KKyAgICAgICAgLy8gSW4gbmVzdGluZyBjYXNlIHdlIG5lZWQgdG8gY3Jl
YXRlIExpbmVCb3g6OklubGluZUxldmVsQm94ZXMgZm9yIHRoZSBpbmxpbmUgYm94IGFuY2VzdG9y
cy4KKyAgICAgICAgLy8gV2Ugb25seSBoYXZlIHRvIGRvIGl0IG9uIHRoZSBmaXJzdCBydW4gYXMg
YW55IHN1YnNlcXVlbnQgaW5saW5lIGNvbnRlbnQgaXMgZWl0aGVyIGF0IHRoZSBzYW1lL2hpZ2hl
ciBuZXN0aW5nIGxldmVsIG9yCisgICAgICAgIC8vIG5lc3RlZCB3aXRoIGEgW2lubGluZSBib3gg
c3RhcnRdIHJ1bi4KKyAgICAgICAgYXV0byYgZmlyc3RSdW4gPSBydW5zWzBdOworICAgICAgICBh
dXRvJiBmaXJzdFJ1blBhcmVudExheW91dEJveCA9IGZpcnN0UnVuLmxheW91dEJveCgpLnBhcmVu
dCgpOworICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGlzIHRoZSBmb3JtYXR0aW5nIHJvb3QsIHdl
IGNhbiBzdG9wIGhlcmUuIFRoaXMgaXMgcm9vdCBpbmxpbmUgYm94IGNvbnRlbnQsIHRoZXJlJ3Mg
bm8gbmVzdGluZyBpbmxpbmUgYm94IGZyb20gdGhlIHByZXZpb3VzIGxpbmUocykKKyAgICAgICAg
Ly8gdW5sZXNzIHRoZSBpbmxpbmUgYm94IGNsb3NpbmcgaXMgZm9yY2VkIG92ZXIgdG8gdGhlIGN1
cnJlbnQgbGluZS4KKyAgICAgICAgLy8gZS5nLgorICAgICAgICAvLyA8c3Bhbj5ub3JtYWxseSB0
aGUgaW5saW5lIGJveCBjbG9zaW5nIGZvcm1zIGEgY29udGludW91cyBjb250ZW50PC9zcGFuPgor
ICAgICAgICAvLyA8c3Bhbj51bmxlc3MgaXQncyBmb3JjZWQgdG8gdGhlIG5leHQgbGluZTxicj48
L3NwYW4+CisgICAgICAgIGF1dG8gZmlyc3RSdW5OZWVkc0lubGluZUJveCA9IGZpcnN0UnVuLmlz
SW5saW5lQm94RW5kKCk7CisgICAgICAgIGlmICghZmlyc3RSdW5OZWVkc0lubGluZUJveCAmJiBp
c1Jvb3RMYXlvdXRCb3goZmlyc3RSdW5QYXJlbnRMYXlvdXRCb3gpKQorICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICBWZWN0b3I8Y29uc3QgQm94Kj4gbGF5b3V0Qm94ZXNXaXRob3V0SW5saW5l
Qm94ZXM7CisgICAgICAgIGlmIChmaXJzdFJ1bk5lZWRzSW5saW5lQm94KQorICAgICAgICAgICAg
bGF5b3V0Qm94ZXNXaXRob3V0SW5saW5lQm94ZXMuYXBwZW5kKCZmaXJzdFJ1bi5sYXlvdXRCb3go
KSk7CisgICAgICAgIGF1dG8qIGFuY2VzdG9yID0gJmZpcnN0UnVuUGFyZW50TGF5b3V0Qm94Owor
ICAgICAgICB3aGlsZSAoIWlzUm9vdExheW91dEJveCgqYW5jZXN0b3IpKSB7CisgICAgICAgICAg
ICBsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVCb3hlcy5hcHBlbmQoYW5jZXN0b3IpOworICAgICAg
ICAgICAgYW5jZXN0b3IgPSAmYW5jZXN0b3ItPnBhcmVudCgpOworICAgICAgICB9CisgICAgICAg
IC8vIENvbnN0cnVjdCB0aGUgbWlzc2luZyBMaW5lQm94OjpJbmxpbmVCb3hlcyBzdGFydGluZyB3
aXRoIHRoZSB0b3Btb3N0IGxheW91dCBib3guCisgICAgICAgIGZvciAoYXV0byogbGF5b3V0Qm94
IDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVCb3hlcykp
IHsKKyAgICAgICAgICAgIGF1dG8gaW5saW5lQm94ID0gTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6
OmNyZWF0ZUlubGluZUJveCgqbGF5b3V0Qm94LCByb290SW5saW5lQm94LmxvZ2ljYWxMZWZ0KCks
IGxpbmVCb3guY29udGVudExvZ2ljYWxXaWR0aCgpKTsKKyAgICAgICAgICAgIHNldFZlcnRpY2Fs
R2VvbWV0cnlGb3JJbmxpbmVCb3goaW5saW5lQm94KTsKKyAgICAgICAgICAgIHNpbXBsaWZpZWRB
bGlnblZlcnRpY2FsbHlJZkFwcGxpY2FibGUoaW5saW5lQm94LCB7IH0pOworICAgICAgICAgICAg
bGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChXVEZNb3ZlKGlubGluZUJveCkpOworICAgICAgICB9
CisgICAgfTsKKyAgICBjcmVhdGVXcmFwcGVkSW5saW5lQm94ZXMoKTsKKworICAgIGF1dG8gbGlu
ZUhhc0NvbnRlbnQgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8mIHJ1biA6IHJ1bnMpIHsKKyAgICAg
ICAgYXV0byYgbGF5b3V0Qm94ID0gcnVuLmxheW91dEJveCgpOworICAgICAgICBhdXRvIHJ1bkhh
c0NvbnRlbnQgPSBbJl0gKCkgLT4gYm9vbCB7CisgICAgICAgICAgICBBU1NFUlQoIWxpbmVIYXND
b250ZW50KTsKKyAgICAgICAgICAgIGlmIChydW4uaXNUZXh0KCkgfHwgcnVuLmlzQm94KCkgfHwg
cnVuLmlzU29mdExpbmVCcmVhaygpIHx8IHJ1bi5pc0hhcmRMaW5lQnJlYWsoKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGF1dG8mIGlubGluZUJveEdlb21ldHJ5
ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChsYXlvdXRCb3gpOworICAgICAg
ICAgICAgLy8gRXZlbiBuZWdhdGl2ZSBob3Jpem9udGFsIG1hcmdpbiBtYWtlcyB0aGUgbGluZSAi
Y29udGVudGZ1bCIuCisgICAgICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94U3RhcnQoKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gaW5saW5lQm94R2VvbWV0cnkubWFyZ2luU3RhcnQoKSB8fCBp
bmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJMZWZ0KCkgfHwgaW5saW5lQm94R2VvbWV0cnkucGFkZGlu
Z0xlZnQoKS52YWx1ZU9yKDBfbHUpOworICAgICAgICAgICAgaWYgKHJ1bi5pc0lubGluZUJveEVu
ZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVCb3hHZW9tZXRyeS5tYXJnaW5FbmQo
KSB8fCBpbmxpbmVCb3hHZW9tZXRyeS5ib3JkZXJSaWdodCgpIHx8IGlubGluZUJveEdlb21ldHJ5
LnBhZGRpbmdSaWdodCgpLnZhbHVlT3IoMF9sdSk7CisgICAgICAgICAgICBpZiAocnVuLmlzV29y
ZEJyZWFrT3Bwb3J0dW5pdHkoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICB9OworICAgICAgICBsaW5lSGFzQ29udGVudCA9IGxpbmVIYXNDb250ZW50IHx8IHJ1
bkhhc0NvbnRlbnQoKTsKKyAgICAgICAgYXV0byBsb2dpY2FsTGVmdCA9IHJvb3RJbmxpbmVCb3gu
bG9naWNhbExlZnQoKSArIHJ1bi5sb2dpY2FsTGVmdCgpOworICAgICAgICBpZiAocnVuLmlzQm94
KCkpIHsKKyAgICAgICAgICAgIGF1dG8mIGlubGluZUxldmVsQm94R2VvbWV0cnkgPSBmb3JtYXR0
aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7CisgICAgICAgICAgICBhdXRv
IG1hcmdpbkJveEhlaWdodCA9IGlubGluZUxldmVsQm94R2VvbWV0cnkubWFyZ2luQm94SGVpZ2h0
KCk7CisgICAgICAgICAgICBhdXRvIGFzY2VudCA9IElubGluZUxheW91dFVuaXQgeyB9OworICAg
ICAgICAgICAgaWYgKGxheW91dFN0YXRlKCkuc2hvdWxkTm90U3ludGhlc2l6ZUlubGluZUJsb2Nr
QmFzZWxpbmUoKSkgeworICAgICAgICAgICAgICAgIC8vIEludGVncmF0aW9uIGNvZGVwYXRoIGNv
bnN0cnVjdHMgcmVwbGFjZWQgYm94ZXMgZm9yIGlubGluZS1ibG9jayBjb250ZW50LgorICAgICAg
ICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKTsKKyAgICAgICAgICAg
ICAgICBhc2NlbnQgPSAqZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGxheW91dEJveCkuYmFzZWxpbmUo
KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LmlzSW5saW5lQmxvY2tCb3goKSkg
eworICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlbGluZSBvZiBhbiAnaW5saW5lLWJsb2NrJyBp
cyB0aGUgYmFzZWxpbmUgb2YgaXRzIGxhc3QgbGluZSBib3ggaW4gdGhlIG5vcm1hbCBmbG93LCB1
bmxlc3MgaXQgaGFzIGVpdGhlciBubyBpbi1mbG93IGxpbmUgYm94ZXMgb3IKKyAgICAgICAgICAg
ICAgICAvLyBpZiBpdHMgJ292ZXJmbG93JyBwcm9wZXJ0eSBoYXMgYSBjb21wdXRlZCB2YWx1ZSBv
dGhlciB0aGFuICd2aXNpYmxlJywgaW4gd2hpY2ggY2FzZSB0aGUgYmFzZWxpbmUgaXMgdGhlIGJv
dHRvbSBtYXJnaW4gZWRnZS4KKyAgICAgICAgICAgICAgICBhdXRvIHN5bnRoZXNpemVCYXNlbGlu
ZSA9ICFsYXlvdXRCb3guZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpIHx8ICFs
YXlvdXRCb3guc3R5bGUoKS5pc092ZXJmbG93VmlzaWJsZSgpOworICAgICAgICAgICAgICAgIGlm
IChzeW50aGVzaXplQmFzZWxpbmUpCisgICAgICAgICAgICAgICAgICAgIGFzY2VudCA9IG1hcmdp
bkJveEhlaWdodDsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAg
YXV0byYgZm9ybWF0dGluZ1N0YXRlID0gbGF5b3V0U3RhdGUoKS5lc3RhYmxpc2hlZElubGluZUZv
cm1hdHRpbmdTdGF0ZShkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkpOworICAgICAg
ICAgICAgICAgICAgICBhdXRvJiBsYXN0TGluZSA9IGZvcm1hdHRpbmdTdGF0ZS5saW5lcygpLmxh
c3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpbmxpbmVCbG9ja0Jhc2VsaW5lID0gbGFz
dExpbmUubGluZUJveExvZ2ljYWxSZWN0KCkudG9wKCkgKyBsYXN0TGluZS5iYXNlbGluZSgpOwor
ICAgICAgICAgICAgICAgICAgICBhc2NlbnQgPSBpbmxpbmVMZXZlbEJveEdlb21ldHJ5Lm1hcmdp
bkJlZm9yZSgpICsgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS5ib3JkZXJUb3AoKSArIGlubGluZUxl
dmVsQm94R2VvbWV0cnkucGFkZGluZ1RvcCgpLnZhbHVlT3IoMCkgKyBpbmxpbmVCbG9ja0Jhc2Vs
aW5lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94
LmlzUmVwbGFjZWRCb3goKSkKKyAgICAgICAgICAgICAgICBhc2NlbnQgPSBkb3duY2FzdDxSZXBs
YWNlZEJveD4obGF5b3V0Qm94KS5iYXNlbGluZSgpLnZhbHVlT3IobWFyZ2luQm94SGVpZ2h0KTsK
KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhc2NlbnQgPSBtYXJnaW5Cb3hIZWln
aHQ7CisgICAgICAgICAgICBsb2dpY2FsTGVmdCArPSBzdGQ6Om1heCgwX2x1LCBpbmxpbmVMZXZl
bEJveEdlb21ldHJ5Lm1hcmdpblN0YXJ0KCkpOworICAgICAgICAgICAgYXV0byBhdG9taWNJbmxp
bmVMZXZlbEJveCA9IExpbmVCb3g6OklubGluZUxldmVsQm94OjpjcmVhdGVBdG9taWNJbmxpbmVM
ZXZlbEJveChsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCB7IGlubGluZUxldmVsQm94R2VvbWV0cnku
Ym9yZGVyQm94V2lkdGgoKSwgbWFyZ2luQm94SGVpZ2h0IH0pOworICAgICAgICAgICAgYXRvbWlj
SW5saW5lTGV2ZWxCb3guc2V0QmFzZWxpbmUoYXNjZW50KTsKKyAgICAgICAgICAgIGF0b21pY0lu
bGluZUxldmVsQm94LnNldExheW91dEJvdW5kcyhMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6TGF5
b3V0Qm91bmRzIHsgYXNjZW50LCBtYXJnaW5Cb3hIZWlnaHQgLSBhc2NlbnQgfSk7CisgICAgICAg
ICAgICBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNhbGx5SWZBcHBsaWNhYmxlKGF0b21pY0lubGluZUxl
dmVsQm94LCBpbmxpbmVMZXZlbEJveEdlb21ldHJ5KTsKKyAgICAgICAgICAgIGxpbmVCb3guYWRk
SW5saW5lTGV2ZWxCb3goV1RGTW92ZShhdG9taWNJbmxpbmVMZXZlbEJveCkpOworICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bi5pc0lubGluZUJveFN0YXJ0
KCkpIHsKKyAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgZG9uJ3Qga25vdyB5ZXQgaG93
IHdpZGUgdGhpcyBpbmxpbmUgYm94IGlzLiBMZXQncyBhc3N1bWUgaXQncyBhcyBsb25nIGFzIHRo
ZSBsaW5lIGlzCisgICAgICAgICAgICAvLyBhbmQgYWRqdXN0IGl0IGxhdGVyIGlmIHdlIGNvbWUg
YWNyb3NzIGFuIGlubGluZUJveEVuZCBydW4gKHNlZSBiZWxvdykuCisgICAgICAgICAgICBhdXRv
IGluaXRpYWxMb2dpY2FsV2lkdGggPSBsaW5lQm94LmNvbnRlbnRMb2dpY2FsV2lkdGgoKSAtIHJ1
bi5sb2dpY2FsTGVmdCgpOworICAgICAgICAgICAgQVNTRVJUKGluaXRpYWxMb2dpY2FsV2lkdGgg
Pj0gMCk7CisgICAgICAgICAgICAvLyBJbmxpbmUgYm94IHJ1biBpcyBiYXNlZCBvbiBtYXJnaW4g
Ym94LiBMZXQncyBjb252ZXJ0IGl0IHRvIGJvcmRlciBib3guCisgICAgICAgICAgICBhdXRvIG1h
cmdpblN0YXJ0ID0gc3RkOjptYXgoMF9sdSwgZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZv
ckJveChsYXlvdXRCb3gpLm1hcmdpblN0YXJ0KCkpOworICAgICAgICAgICAgbG9naWNhbExlZnQg
Kz0gbWFyZ2luU3RhcnQ7CisgICAgICAgICAgICBpbml0aWFsTG9naWNhbFdpZHRoIC09IG1hcmdp
blN0YXJ0OworICAgICAgICAgICAgYXV0byBpbmxpbmVCb3ggPSBMaW5lQm94OjpJbmxpbmVMZXZl
bEJveDo6Y3JlYXRlSW5saW5lQm94KGxheW91dEJveCwgbG9naWNhbExlZnQsIGluaXRpYWxMb2dp
Y2FsV2lkdGgpOworICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRyeUZvcklubGluZUJveChp
bmxpbmVCb3gpOworICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGlj
YWJsZShpbmxpbmVCb3gsIHsgfSk7CisgICAgICAgICAgICBsaW5lQm94LmFkZElubGluZUxldmVs
Qm94KFdURk1vdmUoaW5saW5lQm94KSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
fQorICAgICAgICBpZiAocnVuLmlzSW5saW5lQm94RW5kKCkpIHsKKyAgICAgICAgICAgIC8vIEFk
anVzdCB0aGUgbG9naWNhbCB3aWR0aCB3aGVuIHRoZSBpbmxpbmUgYm94IGNsb3NlcyBvbiB0aGlz
IGxpbmUuCisgICAgICAgICAgICBhdXRvJiBpbmxpbmVCb3ggPSBsaW5lQm94LmlubGluZUxldmVs
Qm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7CisgICAgICAgICAgICBBU1NFUlQoaW5saW5lQm94
LmlzSW5saW5lQm94KCkpOworICAgICAgICAgICAgLy8gSW5saW5lIGJveCBydW4gaXMgYmFzZWQg
b24gbWFyZ2luIGJveC4gTGV0J3MgY29udmVydCBpdCB0byBib3JkZXIgYm94LgorICAgICAgICAg
ICAgYXV0byBtYXJnaW5FbmQgPSBzdGQ6Om1heCgwX2x1LCBmb3JtYXR0aW5nQ29udGV4dCgpLmdl
b21ldHJ5Rm9yQm94KGxheW91dEJveCkubWFyZ2luRW5kKCkpOworICAgICAgICAgICAgYXV0byBp
bmxpbmVCb3hMb2dpY2FsUmlnaHQgPSBsb2dpY2FsTGVmdCArIHJ1bi5sb2dpY2FsV2lkdGgoKSAt
IG1hcmdpbkVuZDsKKyAgICAgICAgICAgIGlubGluZUJveC5zZXRMb2dpY2FsV2lkdGgoaW5saW5l
Qm94TG9naWNhbFJpZ2h0IC0gaW5saW5lQm94LmxvZ2ljYWxMZWZ0KCkpOworICAgICAgICAgICAg
c2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGljYWJsZShpbmxpbmVCb3gsIHsgfSk7Cisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVuLmlzVGV4dCgp
IHx8IHJ1bi5pc1NvZnRMaW5lQnJlYWsoKSkgeworICAgICAgICAgICAgLy8gRklYTUU6IEFkanVz
dCBub24tZW1wdHkgaW5saW5lIGJveCBoZWlnaHQgd2hlbiBnbHlwaHMgZnJvbSB0aGUgbm9uLXBy
aW1hcnkgZm9udCBzdHJldGNoIHRoZSBib3guCisgICAgICAgICAgICBsaW5lQm94LmlubGluZUxl
dmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSkuc2V0SGFzQ29udGVudCgpOwor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bi5pc0hhcmRM
aW5lQnJlYWsoKSkgeworICAgICAgICAgICAgYXV0byBsaW5lQnJlYWtCb3ggPSBMaW5lQm94OjpJ
bmxpbmVMZXZlbEJveDo6Y3JlYXRlTGluZUJyZWFrQm94KGxheW91dEJveCwgbG9naWNhbExlZnQp
OworICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRyeUZvcklubGluZUJveChsaW5lQnJlYWtC
b3gpOworICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGljYWJsZShs
aW5lQnJlYWtCb3gsIHsgfSk7CisgICAgICAgICAgICBsaW5lQm94LmFkZElubGluZUxldmVsQm94
KFdURk1vdmUobGluZUJyZWFrQm94KSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
fQorICAgICAgICBpZiAocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkgeworICAgICAgICAg
ICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3Jl
YXRlR2VuZXJpY0lubGluZUxldmVsQm94KGxheW91dEJveCwgbG9naWNhbExlZnQpKTsKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgIH0KKworICAgIGxpbmVCb3guc2V0SGFzQ29udGVudChsaW5lSGFzQ29udGVudCk7Cisg
ICAgaWYgKHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5pc0VuYWJsZWQoKSB8fCAhbGluZUhh
c0NvbnRlbnQpIHsKKyAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIGV4ZXJj
aXNlIHRoZSBmYXN0IHBhdGggd2hlbiB0aGUgbGluZSBoYXMgbm8gY29udGVudCBhdCBhbGwsIGV2
ZW4gaW4gbm9uLXN0YW5kYXJkcyBtb2RlIG9yIHdpdGggbGluZS1oZWlnaHQgc2V0LgorICAgICAg
ICByb290SW5saW5lQm94LnNldExvZ2ljYWxUb3AobGluZUhhc0NvbnRlbnQgPyBzaW1wbGlmaWVk
VmVydGljYWxBbGlnbm1lbnQucm9vdElubGluZUJveExvZ2ljYWxUb3AoKSA6IC1yb290SW5saW5l
Qm94LmJhc2VsaW5lKCkpOworICAgICAgICBsaW5lQm94LnNldExvZ2ljYWxIZWlnaHQobGluZUhh
c0NvbnRlbnQgPyBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQubGluZUJveEhlaWdodCgpIDog
SW5saW5lTGF5b3V0VW5pdCgpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgY29tcHV0ZUxpbmVCb3hI
ZWlnaHRBbmRBbGlnbklubGluZUxldmVsQm94ZXNWZXJ0aWNhbGx5KGxpbmVCb3gpOworfQorCit2
b2lkIExpbmVCb3hCdWlsZGVyOjpjb21wdXRlTGluZUJveEhlaWdodEFuZEFsaWduSW5saW5lTGV2
ZWxCb3hlc1ZlcnRpY2FsbHkoTGluZUJveCYgbGluZUJveCkKK3sKKyAgICBBU1NFUlQobGluZUJv
eC5oYXNDb250ZW50KCkpOworICAgIC8vIFRoaXMgZnVuY3Rpb24gKHBhcnRpYWxseSkgaW1wbGVt
ZW50czoKKyAgICAvLyAyLjIuIExheW91dCBXaXRoaW4gTGluZSBCb3hlcworICAgIC8vIGh0dHBz
Oi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xpbmUtbGF5b3V0CisgICAgLy8gMS4gQ29t
cHV0ZSB0aGUgbGluZSBib3ggaGVpZ2h0IHVzaW5nIHRoZSBsYXlvdXQgYm91bmRzIGdlb21ldHJ5
LiBUaGlzIGhlaWdodCBjb21wdXRhdGlvbiBzdHJpY3RseSB1c2VzIGxheW91dCBib3VuZHMgYW5k
IG5vdCBub3JtYWwgaW5saW5lIGxldmVsIGJveCBnZW9tZXRyaWVzLgorICAgIC8vIDIuIENvbXB1
dGUgdGhlIGJhc2VsaW5lL2xvZ2ljYWwgdG9wIHBvc2l0aW9uIG9mIHRoZSByb290IGlubGluZSBi
b3guIEFsaWduZWQgYm94ZXMgcHVzaCB0aGUgcm9vdCBpbmxpbmUgYm94IGFyb3VuZCBpbnNpZGUg
dGhlIGxpbmUgYm94LgorICAgIC8vIDMuIEZpbmFsbHkgYWxpZ24gdGhlIGlubGluZSBsZXZlbCBi
b3hlcyB1c2luZyAobW9zdGx5KSBub3JtYWwgaW5saW5lIGxldmVsIGJveCBnZW9tZXRyaWVzLgor
ICAgIGF1dG8gcXVpcmtzID0gZm9ybWF0dGluZ0NvbnRleHQoKS5xdWlya3MoKTsKKyAgICBhdXRv
JiByb290SW5saW5lQm94ID0gbGluZUJveC5yb290SW5saW5lQm94KCk7CisKKyAgICBhdXRvIGNv
bXB1dGVMaW5lQm94TG9naWNhbEhlaWdodCA9IFsmXSB7CisgICAgICAgIC8vIExpbmUgYm94IGhl
aWdodCBjb21wdXRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgbGF5b3V0IGJvdW5kcyBvZiB0aGUgaW5s
aW5lIGJveGVzIGFuZCBub3QgdGhlaXIgbG9naWNhbCAoYXNjZW50L2Rlc2NlbnQpIGRpbWVuc2lv
bnMuCisgICAgICAgIHN0cnVjdCBBYnNvbHV0ZVRvcEFuZEJvdHRvbSB7CisgICAgICAgICAgICBJ
bmxpbmVMYXlvdXRVbml0IHRvcCB7IDAgfTsKKyAgICAgICAgICAgIElubGluZUxheW91dFVuaXQg
Ym90dG9tIHsgMCB9OworICAgICAgICB9OworICAgICAgICBIYXNoTWFwPGNvbnN0IExpbmVCb3g6
OklubGluZUxldmVsQm94KiwgQWJzb2x1dGVUb3BBbmRCb3R0b20+IGlubGluZUxldmVsQm94QWJz
b2x1dGVUb3BBbmRCb3R0b21NYXA7CisKKyAgICAgICAgYXV0byBtaW5pbXVtTG9naWNhbFRvcCA9
IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKKyAgICAgICAgYXV0byBtYXhpbXVtTG9n
aWNhbEJvdHRvbSA9IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKKyAgICAgICAgaWYg
KHF1aXJrcy5pbmxpbmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KHJvb3RJbmxpbmVCb3gsIGxpbmVC
b3gpKSB7CisgICAgICAgICAgICBtaW5pbXVtTG9naWNhbFRvcCA9IElubGluZUxheW91dFVuaXQg
eyB9OworICAgICAgICAgICAgbWF4aW11bUxvZ2ljYWxCb3R0b20gPSByb290SW5saW5lQm94Lmxh
eW91dEJvdW5kcygpLmhlaWdodCgpOworICAgICAgICAgICAgaW5saW5lTGV2ZWxCb3hBYnNvbHV0
ZVRvcEFuZEJvdHRvbU1hcC5hZGQoJnJvb3RJbmxpbmVCb3gsIEFic29sdXRlVG9wQW5kQm90dG9t
IHsgKm1pbmltdW1Mb2dpY2FsVG9wLCAqbWF4aW11bUxvZ2ljYWxCb3R0b20gfSk7CisgICAgICAg
IH0gZWxzZQorICAgICAgICAgICAgaW5saW5lTGV2ZWxCb3hBYnNvbHV0ZVRvcEFuZEJvdHRvbU1h
cC5hZGQoJnJvb3RJbmxpbmVCb3gsIEFic29sdXRlVG9wQW5kQm90dG9tIHsgfSk7CisKKyAgICAg
ICAgVmVjdG9yPExpbmVCb3g6OklubGluZUxldmVsQm94Kj4gbGluZUJveFJlbGF0aXZlSW5saW5l
TGV2ZWxCb3hlczsKKyAgICAgICAgZm9yIChhdXRvJiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gu
bm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgeworICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94
ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7CisgICAgICAgICAgICBpZiAoaW5saW5lTGV2
ZWxCb3guaGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkpIHsKKyAgICAgICAgICAgICAgICBs
aW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveGVzLmFwcGVuZCgmaW5saW5lTGV2ZWxCb3gpOwor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0
byYgcGFyZW50SW5saW5lQm94ID0gbGluZUJveC5pbmxpbmVMZXZlbEJveEZvckxheW91dEJveChs
YXlvdXRCb3gucGFyZW50KCkpOworICAgICAgICAgICAgLy8gTG9naWNhbCB0b3AgaXMgcmVsYXRp
dmUgdG8gdGhlIHBhcmVudCBpbmxpbmUgYm94J3MgbGF5b3V0IGJvdW5kcy4KKyAgICAgICAgICAg
IC8vIE5vdGUgdGhhdCB0aGlzIGxvZ2ljYWwgdG9wIGlzIG5vdCB0aGUgZmluYWwgbG9naWNhbCB0
b3Agb2YgdGhlIGlubGluZSBsZXZlbCBib3guCisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBs
b2dpY2FsIHRvcCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbGF5b3V0IGJvdW5kcyBnZW9tZXRyeSB3
aGljaCBtYXkgYmUgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgaW5saW5lIGJveCdzIG5vcm1hbCBn
ZW9tZXRyeS4KKyAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcCA9IElubGluZUxheW91dFVuaXQg
eyB9OworICAgICAgICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkp
IHsKKyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmU6IHsKKyAgICAgICAg
ICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBpbmxpbmVM
ZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAgICAgICAgICAgICAgbG9naWNhbFRv
cCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBsb2dpY2FsVG9wT2Zm
c2V0RnJvbVBhcmVudEJhc2VsaW5lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6IHsKKyAgICAgICAg
ICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBpbmxpbmVM
ZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSAvIDIgKyBwYXJlbnRJbmxpbmVCb3guc3R5
bGUoKS5mb250TWV0cmljcygpLnhIZWlnaHQoKSAvIDI7CisgICAgICAgICAgICAgICAgbG9naWNh
bFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBsb2dpY2FsVG9w
T2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZU1pZGRsZTog
eworICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGlu
ZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpIC8gMjsKKyAgICAgICAg
ICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5kcygpLmFzY2Vu
dCAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Okxl
bmd0aDogeworICAgICAgICAgICAgICAgIGF1dG8mIHN0eWxlID0gaW5saW5lTGV2ZWxCb3guc3R5
bGUoKTsKKyAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFz
ZWxpbmUgPSBmbG9hdFZhbHVlRm9yTGVuZ3RoKHN0eWxlLnZlcnRpY2FsQWxpZ25MZW5ndGgoKSwg
c3R5bGUuY29tcHV0ZWRMaW5lSGVpZ2h0KCkpICsgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRz
KCkuYXNjZW50OworICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxpbmVCb3gu
bGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGlu
ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNh
c2UgVmVydGljYWxBbGlnbjo6VGV4dFRvcDogeworICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhh
dCB0ZXh0LXRvcCBhbGlnbnMgd2l0aCB0aGUgaW5saW5lIGJveCdzIGZvbnQgbWV0cmljcyB0b3Ag
KGFzY2VudCkgYW5kIG5vdCB0aGUgbGF5b3V0IGJvdW5kcyB0b3AuCisgICAgICAgICAgICAgICAg
bG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBwYXJl
bnRJbmxpbmVCb3guYmFzZWxpbmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VGV4dEJvdHRvbTogeworICAg
ICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0ZXh0LWJvdHRvbSBhbGlnbnMgd2l0aCB0aGUgaW5s
aW5lIGJveCdzIGZvbnQgbWV0cmljcyBib3R0b20gKGRlc2NlbnQpIGFuZCBub3QgdGhlIGxheW91
dCBib3VuZHMgYm90dG9tLgorICAgICAgICAgICAgICAgIGF1dG8gcGFyZW50SW5saW5lQm94TGF5
b3V0Qm91bmRzID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5kcygpOworICAgICAgICAgICAg
ICAgIGF1dG8gcGFyZW50SW5saW5lQm94TG9naWNhbEJvdHRvbSA9IHBhcmVudElubGluZUJveExh
eW91dEJvdW5kcy5oZWlnaHQoKSAtIHBhcmVudElubGluZUJveExheW91dEJvdW5kcy5kZXNjZW50
ICsgcGFyZW50SW5saW5lQm94LmRlc2NlbnQoKS52YWx1ZU9yKElubGluZUxheW91dFVuaXQoKSk7
CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveExvZ2ljYWxCb3R0
b20gLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gcGFyZW50SW5saW5lQm94QWJz
b2x1dGVUb3BBbmRCb3R0b20gPSBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9wQW5kQm90dG9tTWFw
LmdldCgmcGFyZW50SW5saW5lQm94KTsKKyAgICAgICAgICAgIGF1dG8gYWJzb2x1dGVMb2dpY2Fs
VG9wID0gcGFyZW50SW5saW5lQm94QWJzb2x1dGVUb3BBbmRCb3R0b20udG9wICsgbG9naWNhbFRv
cDsKKyAgICAgICAgICAgIGF1dG8gYWJzb2x1dGVMb2dpY2FsQm90dG9tID0gYWJzb2x1dGVMb2dp
Y2FsVG9wICsgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCk7CisgICAgICAg
ICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9wQW5kQm90dG9tTWFwLmFkZCgmaW5saW5lTGV2
ZWxCb3gsIEFic29sdXRlVG9wQW5kQm90dG9tIHsgYWJzb2x1dGVMb2dpY2FsVG9wLCBhYnNvbHV0
ZUxvZ2ljYWxCb3R0b20gfSk7CisgICAgICAgICAgICAvLyBTdHJldGNoIHRoZSBtaW4vbWF4IGFi
c29sdXRlIHZhbHVlcyBpZiBhcHBsaWNhYmxlLgorICAgICAgICAgICAgaWYgKHF1aXJrcy5pbmxp
bmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KGlubGluZUxldmVsQm94LCBsaW5lQm94KSkgeworICAg
ICAgICAgICAgICAgIG1pbmltdW1Mb2dpY2FsVG9wID0gc3RkOjptaW4obWluaW11bUxvZ2ljYWxU
b3AudmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxUb3ApLCBhYnNvbHV0ZUxvZ2ljYWxUb3ApOworICAg
ICAgICAgICAgICAgIG1heGltdW1Mb2dpY2FsQm90dG9tID0gc3RkOjptYXgobWF4aW11bUxvZ2lj
YWxCb3R0b20udmFsdWVPcihhYnNvbHV0ZUxvZ2ljYWxCb3R0b20pLCBhYnNvbHV0ZUxvZ2ljYWxC
b3R0b20pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRoZSBsaW5lIGJv
eCBoZWlnaHQgY29tcHV0YXRpb24gaXMgYXMgZm9sbG93czoKKyAgICAgICAgLy8gMS4gU3RyZXRj
aCB0aGUgbGluZSBib3ggd2l0aCB0aGUgbm9uLWxpbmUtYm94IHJlbGF0aXZlIGFsaWduZWQgaW5s
aW5lIGJveCBhYnNvbHV0ZSB0b3AgYW5kIGJvdHRvbSB2YWx1ZXMuCisgICAgICAgIC8vIDIuIENo
ZWNrIGlmIHRoZSBsaW5lIGJveCByZWxhdGl2ZSBhbGlnbmVkIGlubGluZSBib3hlcyAodG9wLCBi
b3R0b20gZXRjKSBoYXZlIGVub3VnaCByb29tIGFuZCBzdHJldGNoIHRoZSBsaW5lIGJveCBmdXJ0
aGVyIGlmIG5lZWRlZC4KKyAgICAgICAgYXV0byBsaW5lQm94TG9naWNhbEhlaWdodCA9IG1heGlt
dW1Mb2dpY2FsQm90dG9tLnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCgpKSAtIG1pbmltdW1Mb2dp
Y2FsVG9wLnZhbHVlT3IoSW5saW5lTGF5b3V0VW5pdCgpKTsKKyAgICAgICAgZm9yIChhdXRvKiBs
aW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveCA6IGxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVs
Qm94ZXMpIHsKKyAgICAgICAgICAgIGlmICghcXVpcmtzLmlubGluZUxldmVsQm94QWZmZWN0c0xp
bmVCb3goKmxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94LCBsaW5lQm94KSkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGxpbmVCb3hMb2dpY2FsSGVpZ2h0ID0gc3Rk
OjptYXgobGluZUJveExvZ2ljYWxIZWlnaHQsIGxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94
LT5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgbGluZUJveC5z
ZXRMb2dpY2FsSGVpZ2h0KGxpbmVCb3hMb2dpY2FsSGVpZ2h0KTsKKyAgICB9OworICAgIGNvbXB1
dGVMaW5lQm94TG9naWNhbEhlaWdodCgpOworCisgICAgYXV0byBjb21wdXRlUm9vdElubGluZUJv
eFZlcnRpY2FsUG9zaXRpb24gPSBbJl0geworICAgICAgICBIYXNoTWFwPGNvbnN0IExpbmVCb3g6
OklubGluZUxldmVsQm94KiwgSW5saW5lTGF5b3V0VW5pdD4gaW5saW5lTGV2ZWxCb3hBYnNvbHV0
ZUJhc2VsaW5lT2Zmc2V0TWFwOworICAgICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRlQmFzZWxp
bmVPZmZzZXRNYXAuYWRkKCZyb290SW5saW5lQm94LCBJbmxpbmVMYXlvdXRVbml0IHsgfSk7CisK
KyAgICAgICAgYXV0byBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9
IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsgfTsKKyAgICAgICAgaWYgKHF1aXJrcy5pbmxp
bmVMZXZlbEJveEFmZmVjdHNMaW5lQm94KHJvb3RJbmxpbmVCb3gsIGxpbmVCb3gpKQorICAgICAg
ICAgICAgbWF4aW11bVRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxpbmUgPSByb290SW5s
aW5lQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKKworICAgICAgICBmb3IgKGF1dG8mIGlubGlu
ZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hlcygpKSB7CisgICAgICAg
ICAgICBhdXRvIGFic29sdXRlQmFzZWxpbmVPZmZzZXQgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsK
KyAgICAgICAgICAgIGlmICghaW5saW5lTGV2ZWxCb3guaGFzTGluZUJveFJlbGF0aXZlQWxpZ25t
ZW50KCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBpbmxpbmVMZXZlbEJv
eC5sYXlvdXRCb3goKTsKKyAgICAgICAgICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVCb3ggPSBs
aW5lQm94LmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSk7Cisg
ICAgICAgICAgICAgICAgYXV0byBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IElu
bGluZUxheW91dFVuaXQgeyB9OworCisgICAgICAgICAgICAgICAgc3dpdGNoIChpbmxpbmVMZXZl
bEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxp
Z246OkJhc2VsaW5lOgorICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldEZyb21QYXJl
bnRCYXNlbGluZSA9IHsgfTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpNaWRkbGU6IHsKKyAgICAgICAgICAgICAgICAgICAg
YXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gKGlubGluZUxldmVsQm94
LmxheW91dEJvdW5kcygpLmhlaWdodCgpIC8gMiArIHBhcmVudElubGluZUJveC5zdHlsZSgpLmZv
bnRNZXRyaWNzKCkueEhlaWdodCgpIC8gMik7CisgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5l
T2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNl
bGluZSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKKyAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Ug
VmVydGljYWxBbGlnbjo6QmFzZWxpbmVNaWRkbGU6IHsKKyAgICAgICAgICAgICAgICAgICAgYXV0
byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gaW5saW5lTGV2ZWxCb3gubGF5
b3V0Qm91bmRzKCkuaGVpZ2h0KCkgLyAyOworICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9m
ZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxp
bmUgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246Okxlbmd0aDogeworICAgICAgICAgICAgICAgICAgICBhdXRvJiBzdHlsZSA9
IGlubGluZUxldmVsQm94LnN0eWxlKCk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gdmVydGlj
YWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5ndGgoc3R5bGUudmVydGljYWxBbGlnbkxl
bmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAg
IGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IHZlcnRpY2FsQWxpZ25P
ZmZzZXQgKyBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOworICAgICAgICAgICAgICAgICAgICBi
YXNlbGluZU9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFy
ZW50QmFzZWxpbmUgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOworICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBWZXJ0
aWNhbEFsaWduOjpUZXh0VG9wOgorICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldEZy
b21QYXJlbnRCYXNlbGluZSA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gaW5saW5lTGV2
ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRCb3R0b206CisgICAgICAg
ICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gaW5saW5lTGV2
ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtICpwYXJlbnRJbmxpbmVCb3guZGVzY2VudCgp
OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0Ogor
ICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOworICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
YWJzb2x1dGVCYXNlbGluZU9mZnNldCA9IGlubGluZUxldmVsQm94QWJzb2x1dGVCYXNlbGluZU9m
ZnNldE1hcC5nZXQoJnBhcmVudElubGluZUJveCkgKyBiYXNlbGluZU9mZnNldEZyb21QYXJlbnRC
YXNlbGluZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChp
bmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFZl
cnRpY2FsQWxpZ246OlRvcDogeworICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUJhc2VsaW5l
T2Zmc2V0ID0gcm9vdElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBpbmxpbmVMZXZl
bEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJv
dHRvbTogeworICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0ID0gaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuZGVzY2VudCAtIHJvb3RJbmxpbmVCb3gubGF5b3V0
Qm91bmRzKCkuZGVzY2VudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFT
U0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlubGluZUxldmVs
Qm94QWJzb2x1dGVCYXNlbGluZU9mZnNldE1hcC5hZGQoJmlubGluZUxldmVsQm94LCBhYnNvbHV0
ZUJhc2VsaW5lT2Zmc2V0KTsKKyAgICAgICAgICAgIGF1dG8gYWZmZWN0c1Jvb3RJbmxpbmVCb3hW
ZXJ0aWNhbFBvc2l0aW9uID0gcXVpcmtzLmlubGluZUxldmVsQm94QWZmZWN0c0xpbmVCb3goaW5s
aW5lTGV2ZWxCb3gsIGxpbmVCb3gpOworICAgICAgICAgICAgaWYgKGFmZmVjdHNSb290SW5saW5l
Qm94VmVydGljYWxQb3NpdGlvbikgeworICAgICAgICAgICAgICAgIGF1dG8gdG9wT2Zmc2V0RnJv
bVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IGFic29sdXRlQmFzZWxpbmVPZmZzZXQgKyBpbmxpbmVM
ZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7CisgICAgICAgICAgICAgICAgaWYgKG1heGlt
dW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2VsaW5lKQorICAgICAgICAgICAgICAgICAg
ICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IHN0ZDo6bWF4KCpt
YXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSwgdG9wT2Zmc2V0RnJvbVJv
b3RJbmxpbmVCb3hCYXNlbGluZSk7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAg
ICAgICAgICAgIC8vIFdlIGFyZSBpcyBxdWlyayBtb2RlIGFuZCB0aGUgcm9vdCBpbmxpbmUgYm94
IGhhcyBubyBjb250ZW50LiBUaGUgcm9vdCBpbmxpbmUgYm94J3MgYmFzZWxpbmUgaXMgYW5jaG9y
ZWQgYXQgMC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBuZWdhdGl2ZSBhc2NlbnQg
KGUuZyBuZWdhdGl2ZSB0b3AgbWFyZ2luKSBjYW4gInB1c2giIHRoZSByb290IGlubGluZSBib3gg
dXB3YXJkcyBhbmQgaGF2ZSBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICBt
YXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVCb3hCYXNlbGluZSA9IGlubGluZUxldmVsQm94
LmxheW91dEJvdW5kcygpLmFzY2VudCA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICA/IHN0
ZDo6bWF4KDAuMGYsIHRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxpbmUpCisgICAgICAg
ICAgICAgICAgICAgICAgICA6IHRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFzZWxpbmU7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF1dG8g
cm9vdElubGluZUJveExvZ2ljYWxUb3AgPSBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJbmxpbmVC
b3hCYXNlbGluZS52YWx1ZU9yKDAuZikgLSByb290SW5saW5lQm94LmJhc2VsaW5lKCk7CisgICAg
ICAgIHJvb3RJbmxpbmVCb3guc2V0TG9naWNhbFRvcChyb290SW5saW5lQm94TG9naWNhbFRvcCk7
CisgICAgfTsKKyAgICBjb21wdXRlUm9vdElubGluZUJveFZlcnRpY2FsUG9zaXRpb24oKTsKKwor
ICAgIGF1dG8gYWxpZ25JbmxpbmVMZXZlbEJveGVzID0gWyZdIHsKKyAgICAgICAgZm9yIChhdXRv
JiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgewor
ICAgICAgICAgICAgYXV0byYgbGF5b3V0Qm94ID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCk7
CisgICAgICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVCb3ggPSBsaW5lQm94LmlubGluZUxldmVs
Qm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSk7CisgICAgICAgICAgICBhdXRvIGxv
Z2ljYWxUb3AgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKKyAgICAgICAgICAgIHN3aXRjaCAoaW5s
aW5lTGV2ZWxCb3gudmVydGljYWxBbGlnbigpKSB7CisgICAgICAgICAgICBjYXNlIFZlcnRpY2Fs
QWxpZ246OkJhc2VsaW5lOgorICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxp
bmVCb3guYmFzZWxpbmUoKSAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Ok1pZGRsZTogewor
ICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9
IChpbmxpbmVMZXZlbEJveC5sb2dpY2FsSGVpZ2h0KCkgLyAyICsgcGFyZW50SW5saW5lQm94LnN0
eWxlKCkuZm9udE1ldHJpY3MoKS54SGVpZ2h0KCkgLyAyKTsKKyAgICAgICAgICAgICAgICBsb2dp
Y2FsVG9wID0gcGFyZW50SW5saW5lQm94LmJhc2VsaW5lKCkgLSBsb2dpY2FsVG9wT2Zmc2V0RnJv
bVBhcmVudEJhc2VsaW5lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZU1pZGRsZTogeworICAgICAg
ICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGlubGlu
ZUxldmVsQm94LmxvZ2ljYWxIZWlnaHQoKSAvIDI7CisgICAgICAgICAgICAgICAgbG9naWNhbFRv
cCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJl
bnRCYXNlbGluZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6TGVuZ3RoOiB7CisgICAgICAgICAgICAgICAgYXV0
byYgc3R5bGUgPSBpbmxpbmVMZXZlbEJveC5zdHlsZSgpOworICAgICAgICAgICAgICAgIGF1dG8g
dmVydGljYWxBbGlnbk9mZnNldCA9IGZsb2F0VmFsdWVGb3JMZW5ndGgoc3R5bGUudmVydGljYWxB
bGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKSk7CisgICAgICAgICAgICAg
ICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gdmVydGljYWxBbGln
bk9mZnNldCArIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7CisgICAgICAgICAgICAgICAgbG9n
aWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCAodGV4dCl0b3AvYm90dG9tIGFsaWduIHRoZWlyIGxh
eW91dCBib3VuZHMuCisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRUb3A6Cisg
ICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygp
LmFzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRCb3R0b206CisgICAgICAg
ICAgICAgICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sb2dpY2FsSGVpZ2h0KCkgLSBp
bmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5kZXNjZW50IC0gaW5saW5lTGV2ZWxCb3guYmFz
ZWxpbmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVmVydGlj
YWxBbGlnbjo6VG9wOgorICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGxvZ2ljYWwg
dG9wIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGlubGluZSBib3guCisgICAgICAgICAg
ICAgICAgbG9naWNhbFRvcCA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudCAt
IGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OkJvdHRvbToKKyAgICAgICAgICAgICAgICAvLyBO
b3RlIHRoYXQgdGhpcyBsb2dpY2FsIHRvcCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBp
bmxpbmUgYm94LgorICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBsaW5lQm94LmxvZ2ljYWxI
ZWlnaHQoKSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmRlc2NlbnQgLSBpbmxpbmVM
ZXZlbEJveC5iYXNlbGluZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
ZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVEX1lFVCgpOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5saW5l
TGV2ZWxCb3guc2V0TG9naWNhbFRvcChsb2dpY2FsVG9wKTsKKyAgICAgICAgfQorICAgIH07Cisg
ICAgYWxpZ25JbmxpbmVMZXZlbEJveGVzKCk7Cit9CisKK0xpbmVCb3hCdWlsZGVyOjpTaW1wbGlm
aWVkVmVydGljYWxBbGlnbm1lbnQ6OlNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudChjb25zdCBM
aW5lQm94OjpJbmxpbmVMZXZlbEJveCYgcm9vdElubGluZUJveCkKKyAgICA6IG1fcm9vdElubGlu
ZUJveChyb290SW5saW5lQm94KQoreworICAgIGFkanVzdChyb290SW5saW5lQm94KTsKK30KKwor
Ym9vbCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50OjpjYW5Vc2VT
aW1wbGlmaWVkQWxpZ25tZW50KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiByb290SW5s
aW5lQm94LCBjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3gsIE9w
dGlvbmFsPGNvbnN0IEJveEdlb21ldHJ5PiBpbmxpbmVMZXZlbEJveEdlb21ldHJ5KQoreworICAg
IGlmIChpbmxpbmVMZXZlbEJveC5pc0F0b21pY0lubGluZUxldmVsQm94KCkpIHsKKyAgICAgICAg
QVNTRVJUKGlubGluZUxldmVsQm94R2VvbWV0cnkpOworICAgICAgICAvLyBCYXNlbGluZSBhbGln
bmVkLCBub24tc3RyZXRjaHkgZGlyZWN0IGNoaWxkcmVuIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNp
bXBsZSBmb3Igbm93LgorICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBpbmxpbmVMZXZlbEJveC5s
YXlvdXRCb3goKTsKKyAgICAgICAgcmV0dXJuICZsYXlvdXRCb3gucGFyZW50KCkgPT0gJnJvb3RJ
bmxpbmVCb3gubGF5b3V0Qm94KCkKKyAgICAgICAgICAgICYmIGxheW91dEJveC5zdHlsZSgpLnZl
cnRpY2FsQWxpZ24oKSA9PSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZQorICAgICAgICAgICAgJiYg
IWlubGluZUxldmVsQm94R2VvbWV0cnktPm1hcmdpbkJlZm9yZSgpCisgICAgICAgICAgICAmJiAh
aW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQWZ0ZXIoKQorICAgICAgICAgICAgJiYgaW5s
aW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2luQm94SGVpZ2h0KCkgPD0gcm9vdElubGluZUJveC5i
YXNlbGluZSgpOworICAgIH0KKyAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNMaW5lQnJlYWtCb3go
KSkgeworICAgICAgICAvLyBCYXNlbGluZSBhbGlnbmVkLCBub24tc3RyZXRjaHkgbGluZSBicmVh
a3MgZS5nLiA8ZGl2PjxzcGFuPjxicj48L3NwYW4+PC9kaXY+IGJ1dCBub3QgPGRpdj48c3BhbiBz
dHlsZT0iZm9udC1zaXplOiAxMDBweDsiPjxicj48L3NwYW4+PC9kaXY+LgorICAgICAgICByZXR1
cm4gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94KCkuc3R5bGUoKS52ZXJ0aWNhbEFsaWduKCkgPT0g
VmVydGljYWxBbGlnbjo6QmFzZWxpbmUgJiYgaW5saW5lTGV2ZWxCb3guYmFzZWxpbmUoKSA8PSBy
b290SW5saW5lQm94LmJhc2VsaW5lKCk7CisgICAgfQorICAgIGlmIChpbmxpbmVMZXZlbEJveC5p
c0lubGluZUJveCgpKSB7CisgICAgICAgIC8vIEJhc2VsaW5lIGFsaWduZWQsIG5vbi1zdHJldGNo
eSBpbmxpbmUgYm94ZXMgZS5nLiA8ZGl2PjxzcGFuPjwvc3Bhbj48L2Rpdj4gYnV0IG5vdCA8ZGl2
PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwMHB4OyI+PC9zcGFuPjwvZGl2Pi4KKyAgICAgICAg
cmV0dXJuIGlubGluZUxldmVsQm94LmxheW91dEJveCgpLnN0eWxlKCkudmVydGljYWxBbGlnbigp
ID09IFZlcnRpY2FsQWxpZ246OkJhc2VsaW5lICYmIGlubGluZUxldmVsQm94LmxheW91dEJvdW5k
cygpID09IHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCk7CisgICAgfQorICAgIHJldHVybiBm
YWxzZTsKK30KKwordm9pZCBMaW5lQm94QnVpbGRlcjo6U2ltcGxpZmllZFZlcnRpY2FsQWxpZ25t
ZW50OjphbGlnbihMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3gpCit7Cisg
ICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSB8fCBpbmxpbmVM
ZXZlbEJveC5pc0xpbmVCcmVha0JveCgpIHx8IGlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkp
IHsKKyAgICAgICAgLy8gT25seSBiYXNlbGluZSBhbGlnbm1lbnQgZm9yIG5vdy4KKyAgICAgICAg
aW5saW5lTGV2ZWxCb3guc2V0TG9naWNhbFRvcChtX3Jvb3RJbmxpbmVCb3guYmFzZWxpbmUoKSAt
IGlubGluZUxldmVsQm94LmJhc2VsaW5lKCkpOworICAgICAgICBhZGp1c3QoaW5saW5lTGV2ZWxC
b3gpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9OT1RfSU1QTEVNRU5URURf
WUVUKCk7Cit9CisKK3ZvaWQgTGluZUJveEJ1aWxkZXI6OlNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdu
bWVudDo6YWRqdXN0KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiBpbmxpbmVMZXZlbEJv
eCkKK3sKKyAgICBhdXRvIGxheW91dEJvdW5kc0xvZ2ljYWxUb3AgPSBtX3Jvb3RJbmxpbmVCb3gu
bGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNj
ZW50OworICAgIG1fbGluZUJveExvZ2ljYWxUb3AgPSBzdGQ6Om1pbihtX2xpbmVCb3hMb2dpY2Fs
VG9wLCBsYXlvdXRCb3VuZHNMb2dpY2FsVG9wKTsKKyAgICBtX2xpbmVCb3hMb2dpY2FsQm90dG9t
ID0gc3RkOjptYXgobV9saW5lQm94TG9naWNhbEJvdHRvbSwgbGF5b3V0Qm91bmRzTG9naWNhbFRv
cCArIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgpKTsKKyAgICBtX3Jvb3RJ
bmxpbmVCb3hMb2dpY2FsVG9wID0gc3RkOjptYXgobV9yb290SW5saW5lQm94TG9naWNhbFRvcCwg
aW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbV9yb290SW5saW5lQm94LmJh
c2VsaW5lKCkpOworfQorCitMaW5lQm94IElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRy
eTo6bGluZUJveEZvckxpbmVDb250ZW50KGNvbnN0IExpbmVCdWlsZGVyOjpMaW5lQ29udGVudCYg
bGluZUNvbnRlbnQpCit7CisgICAgcmV0dXJuIExpbmVCb3hCdWlsZGVyKGZvcm1hdHRpbmdDb250
ZXh0KCkpLmJ1aWxkKGxpbmVDb250ZW50KTsKK30KKworSW5saW5lTGF5b3V0VW5pdCBJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmxvZ2ljYWxUb3BGb3JOZXh0TGluZShjb25zdCBM
aW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250ZW50LCBJbmxpbmVMYXlvdXRVbml0IHBy
ZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIGNvbnN0IEZsb2F0aW5nQ29udGV4dCYgZmxvYXRpbmdD
b250ZXh0KSBjb25zdAoreworICAgIC8vIE5vcm1hbGx5IHRoZSBuZXh0IGxpbmUncyBsb2dpY2Fs
IHRvcCBpcyB0aGUgcHJldmlvdXMgbGluZSdzIGxvZ2ljYWwgYm90dG9tLCBidXQgd2hlbiB0aGUg
bGluZSBlbmRzCisgICAgLy8gd2l0aCB0aGUgY2xlYXIgcHJvcGVydHkgc2V0LCB0aGUgbmV4dCBs
aW5lIG5lZWRzIHRvIGNsZWFyIHRoZSBleGlzdGluZyBmbG9hdHMuCisgICAgaWYgKGxpbmVDb250
ZW50LnJ1bnMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gcHJldmlvdXNMaW5lTG9naWNhbEJv
dHRvbTsKKyAgICBhdXRvJiBsYXN0UnVuTGF5b3V0Qm94ID0gbGluZUNvbnRlbnQucnVucy5sYXN0
KCkubGF5b3V0Qm94KCk7IAorICAgIGlmIChsYXN0UnVuTGF5b3V0Qm94LnN0eWxlKCkuY2xlYXIo
KSA9PSBDbGVhcjo6Tm9uZSkKKyAgICAgICAgcmV0dXJuIHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0
b207CisgICAgYXV0byBwb3NpdGlvbldpdGhDbGVhcmFuY2UgPSBmbG9hdGluZ0NvbnRleHQudmVy
dGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UobGFzdFJ1bkxheW91dEJveCk7CisgICAgaWYgKCFw
b3NpdGlvbldpdGhDbGVhcmFuY2UpCisgICAgICAgIHJldHVybiBwcmV2aW91c0xpbmVMb2dpY2Fs
Qm90dG9tOworICAgIHJldHVybiBzdGQ6Om1heChwcmV2aW91c0xpbmVMb2dpY2FsQm90dG9tLCBJ
bmxpbmVMYXlvdXRVbml0KHBvc2l0aW9uV2l0aENsZWFyYW5jZS0+cG9zaXRpb24pKTsKK30KKwor
Q29udGVudFdpZHRoQW5kTWFyZ2luIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6
aW5saW5lQmxvY2tDb250ZW50V2lkdGhBbmRNYXJnaW4oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29u
dGV4dFJvb3QsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCBjb25zdCBPdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYgb3ZlcnJpZGRlbkhvcml6b250
YWxWYWx1ZXMpCit7CisgICAgQVNTRVJUKGZvcm1hdHRpbmdDb250ZXh0Um9vdC5pc0luRmxvdygp
KTsKKworICAgIC8vIDEwLjMuMTAgJ0lubGluZS1ibG9jaycsIHJlcGxhY2VkIGVsZW1lbnRzIGlu
IG5vcm1hbCBmbG93CisKKyAgICAvLyBFeGFjdGx5IGFzIGlubGluZSByZXBsYWNlZCBlbGVtZW50
cy4KKyAgICBpZiAoZm9ybWF0dGluZ0NvbnRleHRSb290LmlzUmVwbGFjZWRCb3goKSkKKyAgICAg
ICAgcmV0dXJuIGlubGluZVJlcGxhY2VkQ29udGVudFdpZHRoQW5kTWFyZ2luKGRvd25jYXN0PFJl
cGxhY2VkQm94Pihmb3JtYXR0aW5nQ29udGV4dFJvb3QpLCBob3Jpem9udGFsQ29uc3RyYWludHMs
IHsgfSwgb3ZlcnJpZGRlbkhvcml6b250YWxWYWx1ZXMpOworCisgICAgLy8gMTAuMy45ICdJbmxp
bmUtYmxvY2snLCBub24tcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cKKworICAgIC8v
IElmICd3aWR0aCcgaXMgJ2F1dG8nLCB0aGUgdXNlZCB2YWx1ZSBpcyB0aGUgc2hyaW5rLXRvLWZp
dCB3aWR0aCBhcyBmb3IgZmxvYXRpbmcgZWxlbWVudHMuCisgICAgLy8gQSBjb21wdXRlZCB2YWx1
ZSBvZiAnYXV0bycgZm9yICdtYXJnaW4tbGVmdCcgb3IgJ21hcmdpbi1yaWdodCcgYmVjb21lcyBh
IHVzZWQgdmFsdWUgb2YgJzAnLgorICAgIC8vICMxCisgICAgYXV0byB3aWR0aCA9IGNvbXB1dGVk
VmFsdWUoZm9ybWF0dGluZ0NvbnRleHRSb290LnN0eWxlKCkubG9naWNhbFdpZHRoKCksIGhvcml6
b250YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOworICAgIGlmICghd2lkdGgpCisgICAgICAg
IHdpZHRoID0gc2hyaW5rVG9GaXRXaWR0aChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGhvcml6b250
YWxDb25zdHJhaW50cy5sb2dpY2FsV2lkdGgpOworCisgICAgLy8gIzIKKyAgICBhdXRvIGNvbXB1
dGVkSG9yaXpvbnRhbE1hcmdpbiA9IEdlb21ldHJ5Ojpjb21wdXRlZEhvcml6b250YWxNYXJnaW4o
Zm9ybWF0dGluZ0NvbnRleHRSb290LCBob3Jpem9udGFsQ29uc3RyYWludHMpOworCisgICAgcmV0
dXJuIENvbnRlbnRXaWR0aEFuZE1hcmdpbiB7ICp3aWR0aCwgeyBjb21wdXRlZEhvcml6b250YWxN
YXJnaW4uc3RhcnQudmFsdWVPcigwX2x1KSwgY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luLmVuZC52
YWx1ZU9yKDBfbHUpIH0gfTsKK30KKworQ29udGVudEhlaWdodEFuZE1hcmdpbiBJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmlubGluZUJsb2NrQ29udGVudEhlaWdodEFuZE1hcmdp
bihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRhbENvbnN0cmFpbnRzJiBob3Jp
em9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyYgb3ZlcnJp
ZGRlblZlcnRpY2FsVmFsdWVzKSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNJbkZs
b3coKSk7CisKKyAgICAvLyAxMC42LjIgSW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLCBibG9jay1s
ZXZlbCByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdywgJ2lubGluZS1ibG9jaycgcmVw
bGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cgYW5kIGZsb2F0aW5nIHJlcGxhY2VkIGVsZW1l
bnRzCisgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCisgICAgICAgIHJldHVybiBp
bmxpbmVSZXBsYWNlZENvbnRlbnRIZWlnaHRBbmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+
KGxheW91dEJveCksIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBvdmVycmlkZGVuVmVydGlj
YWxWYWx1ZXMpOworCisgICAgLy8gMTAuNi42IENvbXBsaWNhdGVkIGNhc2VzCisgICAgLy8gLSAn
SW5saW5lLWJsb2NrJywgbm9uLXJlcGxhY2VkIGVsZW1lbnRzLgorICAgIHJldHVybiBjb21wbGlj
YXRlZENhc2VzKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLCBvdmVycmlkZGVuVmVy
dGljYWxWYWx1ZXMpOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHRRdWlya3MuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9pbmxpbmUvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjkx
YmU2NWRhZDVjYzVmNTZiMjllYjA3MDNlNmNkYzk0MzkwYWMyYTcKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVG
b3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAq
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ0NvbnRleHQu
aCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAi
TGF5b3V0Qm94R2VvbWV0cnkuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExh
eW91dCB7CisKK0lubGluZUxheW91dFVuaXQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJr
czo6aW5pdGlhbExpbmVIZWlnaHQoKSBjb25zdAoreworICAgIC8vIE5lZ2F0aXZlIGxpbmVIZWln
aHQgdmFsdWUgbWVhbnMgdGhlIGxpbmUtaGVpZ2h0IGlzIG5vdCBzZXQKKyAgICBhdXRvJiByb290
ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCk7CisgICAgaWYgKGxheW91dFN0YXRlKCkuaW5T
dGFuZGFyZHNNb2RlKCkgfHwgIXJvb3Quc3R5bGUoKS5saW5lSGVpZ2h0KCkuaXNOZWdhdGl2ZSgp
KQorICAgICAgICByZXR1cm4gcm9vdC5zdHlsZSgpLmNvbXB1dGVkTGluZUhlaWdodCgpOworICAg
IHJldHVybiByb290LnN0eWxlKCkuZm9udE1ldHJpY3MoKS5mbG9hdEhlaWdodCgpOworfQorCiti
b29sIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OmlubGluZUxldmVsQm94QWZmZWN0
c0xpbmVCb3goY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94LCBj
b25zdCBMaW5lQm94JiBsaW5lQm94KSBjb25zdAoreworICAgIGlmIChpbmxpbmVMZXZlbEJveC5p
c0xpbmVCcmVha0JveCgpKSB7CisgICAgICAgIGlmIChsYXlvdXRTdGF0ZSgpLmluU3RhbmRhcmRz
TW9kZSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIC8vIEluIHF1aXJrcyBt
b2RlIGxpbmVicmVhayBib3hlcyAoPGJyPikgc3RvcCBhZmZlY3RpbmcgdGhlIGxpbmUgYm94IHdo
ZW4gKGFzc3VtZSA8YnI+IGlzIG5lc3RlZCBlLmcuIDxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEw
MHB4Ij48YnI+PC9zcGFuPikKKyAgICAgICAgLy8gMS4gdGhlIHJvb3QgaW5saW5lIGJveCBoYXMg
Y29udGVudCA8ZGl2PmNvbnRlbnQ8YnI+L2Rpdj4KKyAgICAgICAgLy8gMi4gdGhlcmUncyBhdCBs
ZWFzdCBvbmUgYXRvbWljIGlubGluZSBsZXZlbCBib3ggb24gdGhlIGxpbmUgZS5nIDxkaXY+PGlt
Zz48YnI+PC9kaXY+IG9yIDxkaXY+PHNwYW4+PGltZz48L3NwYW4+PGJyPjwvZGl2PgorICAgICAg
ICAvLyAzLiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBpbmxpbmUgYm94IHdpdGggY29udGVudCBlLmcu
IDxkaXY+PHNwYW4+Y29udGVudDwvc3Bhbj48YnI+PC9kaXY+CisgICAgICAgIGlmIChsaW5lQm94
LnJvb3RJbmxpbmVCb3goKS5oYXNDb250ZW50KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIGlmIChsaW5lQm94Lmhhc0F0b21pY0lubGluZUxldmVsQm94KCkpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgZWl0aGVyIGhh
dmUgb25seSB0aGUgPGJyPiBvbiB0aGUgbGluZSBvciBpbmxpbmUgYm94ZXMgd2l0aCBvciB3aXRo
b3V0IGNvbnRlbnQuCisgICAgICAgIGF1dG8mIGlubGluZUxldmVsQm94ZXMgPSBsaW5lQm94Lm5v
blJvb3RJbmxpbmVMZXZlbEJveGVzKCk7CisgICAgICAgIEFTU0VSVCghaW5saW5lTGV2ZWxCb3hl
cy5pc0VtcHR5KCkpOworICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3hlcy5zaXplKCkgPT0gMSkK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBmb3IgKGF1dG8mIGlubGluZUxldmVs
Qm94IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hlcygpKSB7CisgICAgICAgICAgICAv
LyBGaWx0ZXIgb3V0IGVtcHR5IGlubGluZSBib3hlcyBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxz
cGFuPjwvc3Bhbj48YnI+PC9kaXY+CisgICAgICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNJ
bmxpbmVCb3goKSAmJiBpbmxpbmVMZXZlbEJveC5oYXNDb250ZW50KCkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KyAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNJbmxpbmVCb3goKSkgeworICAgICAgICAvLyBJbmxp
bmUgYm94ZXMgKGUuZy4gcm9vdCBpbmxpbmUgYm94IG9yIDxzcGFuPikgYWZmZWN0cyBsaW5lIGJv
eGVzIGVpdGhlciB0aHJvdWdoIHRoZSBzdHJ1dCBvciBhY3R1YWwgY29udGVudC4KKyAgICAgICAg
YXV0byBpbmxpbmVCb3hIYXNJbWFnaW5hcnlTdHJ1dCA9IGxheW91dFN0YXRlKCkuaW5TdGFuZGFy
ZHNNb2RlKCk7CisgICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5oYXNDb250ZW50KCkgfHwgaW5s
aW5lQm94SGFzSW1hZ2luYXJ5U3RydXQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgaWYgKGlubGluZUxldmVsQm94LmlzUm9vdElubGluZUJveCgpKSB7CisgICAgICAgICAgICBh
dXRvIHNob3VsZFJvb3RJbmxpbmVCb3hXaXRoTm9Db250ZW50U3RyZXRjaExpbmVCb3ggPSBbJl0g
eworICAgICAgICAgICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKS5zdHlsZSgp
LmxpbmVIZWlnaHQoKS5pc05lZ2F0aXZlKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgICAgICAgICAvLyBUaGUgcm9vdCBpbmxpbmUgYm94IHdpdGggbm9uLWlu
aXRpYWwgbGluZSBoZWlnaHQgdmFsdWUgc3RyZXRjaGVzIHRoZSBsaW5lIGJveCBldmVuIHdoZW4g
cm9vdCBoYXMgbm8gY29udGVudAorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGVyZSdzIGF0IGxl
YXN0IG9uZSBpbmxpbmUgYm94IHdpdGggY29udGVudC4KKyAgICAgICAgICAgICAgICAvLyBlLmcu
IDxkaXYgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxMDBweDsiPjxzcGFuPmNvbnRlbnQ8L3NwYW4+PC9k
aXY+CisgICAgICAgICAgICAgICAgaWYgKCFsaW5lQm94Lmhhc0lubGluZUJveCgpKQorICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBp
bmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgeworICAg
ICAgICAgICAgICAgICAgICBpZiAoIWlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkpCisgICAg
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlu
bGluZUxldmVsQm94Lmhhc0NvbnRlbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICB9OworICAgICAgICAgICAgcmV0dXJuIHNob3VsZFJvb3RJbmxpbmVCb3hX
aXRoTm9Db250ZW50U3RyZXRjaExpbmVCb3goKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOb24t
cm9vdCBpbmxpbmUgYm94ZXMgKGUuZy4gPHNwYW4+KS4KKyAgICAgICAgYXV0byYgYm94R2VvbWV0
cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGlubGluZUxldmVsQm94Lmxh
eW91dEJveCgpKTsKKyAgICAgICAgaWYgKGJveEdlb21ldHJ5Lmhvcml6b250YWxCb3JkZXIoKSB8
fCBib3hHZW9tZXRyeS5ob3Jpem9udGFsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpIHsKKyAgICAg
ICAgICAgIC8vIEhvcml6b250YWwgYm9yZGVyIGFuZCBwYWRkaW5nIG1ha2UgdGhlIGlubGluZSBi
b3ggc3RyZXRjaCB0aGUgbGluZSAoZS5nLiA8c3BhbiBzdHlsZT0icGFkZGluZzogMTBweDsiPjwv
c3Bhbj4pLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNBdG9taWNJbmxpbmVM
ZXZlbEJveCgpKSB7CisgICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5o
ZWlnaHQoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAvLyBXaGlsZSBpbiBw
cmFjdGljZSB3aGVuIHRoZSBuZWdhdGl2ZSB2ZXJ0aWNhbCBtYXJnaW4gbWFrZXMgdGhlIGxheW91
dCBib3VuZHMgZW1wdHkgKGUuZzogaGVpZ2h0OiAxMDBweDsgbWFyZ2luLXRvcDogLTEwMHB4Oyks
IGFuZCB0aGlzIGlubGluZQorICAgICAgICAvLyBsZXZlbCBib3ggY29udHJpYnV0ZXMgMHB4IHRv
IHRoZSBsaW5lIGJveCBoZWlnaHQsIGl0IHN0aWxsIG5lZWRzIHRvIGJlIHRha2VuIGludG8gYWNj
b3VudCB3aGlsZSBjb21wdXRpbmcgbGluZSBib3ggZ2VvbWV0cmllcy4KKyAgICAgICAgYXV0byYg
Ym94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGlubGluZUxl
dmVsQm94LmxheW91dEJveCgpKTsKKyAgICAgICAgcmV0dXJuIGJveEdlb21ldHJ5Lm1hcmdpbkJl
Zm9yZSgpIHx8IGJveEdlb21ldHJ5Lm1hcmdpbkFmdGVyKCk7CisgICAgfQorICAgIHJldHVybiBm
YWxzZTsKK30KKworYm9vbCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpoYXNTb2Z0
V3JhcE9wcG9ydHVuaXR5QXRJbWFnZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICFmb3JtYXR0aW5n
Q29udGV4dCgpLnJvb3QoKS5pc1RhYmxlQ2VsbCgpOworfQorCit9Cit9CisKKyNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUv
SW5saW5lRm9ybWF0dGluZ1N0YXRlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ODdiNmM5NWMxNTQ1ZDY0NWNkYmQ0YjA1NDZhZWMxODZjZjNjY2Y1ZAotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL0lubGlu
ZUZvcm1hdHRpbmdTdGF0ZS5jcHAKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIKKworI2lm
IEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSA8d3RmL0lzb01h
bGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7
CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChJbmxpbmVGb3JtYXR0aW5nU3RhdGUpOwor
CitJbmxpbmVGb3JtYXR0aW5nU3RhdGU6OklubGluZUZvcm1hdHRpbmdTdGF0ZShSZWY8RmxvYXRp
bmdTdGF0ZT4mJiBmbG9hdGluZ1N0YXRlLCBMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUpCisgICAg
OiBGb3JtYXR0aW5nU3RhdGUoV1RGTW92ZShmbG9hdGluZ1N0YXRlKSwgVHlwZTo6SW5saW5lLCBs
YXlvdXRTdGF0ZSkKK3sKK30KKworSW5saW5lRm9ybWF0dGluZ1N0YXRlOjp+SW5saW5lRm9ybWF0
dGluZ1N0YXRlKCkKK3sKK30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVGb3JtYXR0aW5nU3Rh
dGUuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL0lu
bGluZUZvcm1hdHRpbmdTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjM2M2IxNjAzNjg0ZTU5NDAwN2EwODI3
YmM5NGNiOTdiNGJhMDE3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuaApAQCAt
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
dGV4dHMvaW5saW5lL0lubGluZUl0ZW0uY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5lSXRlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDYwNmYxODQ5
YjVhOWE2MTg0OWEyMGViZDQxOTY1YTZhZGQ4ZWM4NgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL0lubGluZUl0ZW0uY3Bw
CkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiSW5saW5lSXRlbS5oIgorCisjaW5jbHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIKKworI2lm
IEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCituYW1lc3BhY2UgV2ViQ29yZSB7
CituYW1lc3BhY2UgTGF5b3V0IHsKKworc3RydWN0IFNhbWVTaXplQXNJbmxpbmVJdGVtIHsKKyAg
ICB2b2lkKiBsYXlvdXRCb3g7CisgICAgdWludDhfdCBlbnVtMTsKKyAgICB1aW50OF90IGVudW0y
OworICAgIGJvb2wgd2lkdGhCb29sOworICAgIGJvb2wgc29mdEh5cGhlbkJvb2w7CisgICAgYm9v
bCBpc1dvcmRTZXBhcmF0b3I7CisgICAgSW5saW5lTGF5b3V0VW5pdCB3aWR0aDsKKyAgICB1bnNp
Z25lZCBzdGFydDsKKyAgICB1bnNpZ25lZCBsZW5ndGg7Cit9OworCitzdGF0aWNfYXNzZXJ0KHNp
emVvZihJbmxpbmVJdGVtKSA9PSBzaXplb2YoU2FtZVNpemVBc0lubGluZUl0ZW0pLCAiIik7CisK
K30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9pbmxpbmUvSW5saW5lSXRlbS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5lSXRlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmMyYWUyNGE2
MTI2ODQ1ODg3NGM3MjA5OTQzODJiYWI4MjkxZGRjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVJdGVtLmgK
QEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxF
KExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNp
bmNsdWRlICJMYXlvdXRVbml0cy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2Ug
TGF5b3V0IHsKKworY2xhc3MgSW5saW5lSXRlbSB7CitwdWJsaWM6CisgICAgZW51bSBjbGFzcyBU
eXBlIDogdWludDhfdCB7IFRleHQsIEhhcmRMaW5lQnJlYWssIFNvZnRMaW5lQnJlYWssIFdvcmRC
cmVha09wcG9ydHVuaXR5LCBCb3gsIEZsb2F0LCBJbmxpbmVCb3hTdGFydCwgSW5saW5lQm94RW5k
IH07CisgICAgSW5saW5lSXRlbShjb25zdCBCb3gmIGxheW91dEJveCwgVHlwZSk7CisKKyAgICBU
eXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KKyAgICBjb25zdCBCb3gmIGxheW91
dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQorICAgIGNvbnN0IFJlbmRlclN0
eWxlJiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIGxheW91dEJveCgpLnN0eWxlKCk7IH0KKworICAg
IGJvb2wgaXNUZXh0KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OlRleHQ7IH0KKyAg
ICBib29sIGlzQm94KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OkJveDsgfQorICAg
IGJvb2wgaXNGbG9hdCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBUeXBlOjpGbG9hdDsgfQor
ICAgIGJvb2wgaXNMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiBpc1NvZnRMaW5lQnJlYWsoKSB8
fCBpc0hhcmRMaW5lQnJlYWsoKTsgfQorICAgIGJvb2wgaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgp
IGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBUeXBlOjpXb3JkQnJlYWtPcHBvcnR1bml0eTsgfQor
ICAgIGJvb2wgaXNTb2Z0TGluZUJyZWFrKCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6
OlNvZnRMaW5lQnJlYWs7IH0KKyAgICBib29sIGlzSGFyZExpbmVCcmVhaygpIGNvbnN0IHsgcmV0
dXJuIHR5cGUoKSA9PSBUeXBlOjpIYXJkTGluZUJyZWFrOyB9CisgICAgYm9vbCBpc0lubGluZUJv
eFN0YXJ0KCkgY29uc3QgeyByZXR1cm4gdHlwZSgpID09IFR5cGU6OklubGluZUJveFN0YXJ0OyB9
CisgICAgYm9vbCBpc0lubGluZUJveEVuZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBUeXBl
OjpJbmxpbmVCb3hFbmQ7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBCb3gqIG1fbGF5b3V0Qm94
IHsgbnVsbHB0ciB9OworICAgIFR5cGUgbV90eXBlIHsgfTsKKworcHJvdGVjdGVkOgorICAgIC8v
IEZvciBJbmxpbmVUZXh0SXRlbQorICAgIGVudW0gY2xhc3MgVGV4dEl0ZW1UeXBlICA6IHVpbnQ4
X3QgeyBVbmRlZmluZWQsIFdoaXRlc3BhY2UsIE5vbldoaXRlc3BhY2UgfTsKKyAgICBUZXh0SXRl
bVR5cGUgbV90ZXh0SXRlbVR5cGUgeyBUZXh0SXRlbVR5cGU6OlVuZGVmaW5lZCB9OworICAgIGJv
b2wgbV9oYXNXaWR0aCB7IGZhbHNlIH07CisgICAgYm9vbCBtX2hhc1RyYWlsaW5nU29mdEh5cGhl
biB7IGZhbHNlIH07CisgICAgYm9vbCBtX2lzV29yZFNlcGFyYXRvciB7IGZhbHNlIH07CisgICAg
SW5saW5lTGF5b3V0VW5pdCBtX3dpZHRoIHsgfTsKKyAgICB1bnNpZ25lZCBtX2xlbmd0aCB7IDAg
fTsKKworICAgIC8vIEZvciBJbmxpbmVUZXh0SXRlbSBhbmQgSW5saW5lU29mdExpbmVCcmVha0l0
ZW0KKyAgICB1bnNpZ25lZCBtX3N0YXJ0T3JQb3NpdGlvbiB7IDAgfTsKK307CisKK2lubGluZSBJ
bmxpbmVJdGVtOjpJbmxpbmVJdGVtKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBUeXBlIHR5cGUpCisg
ICAgOiBtX2xheW91dEJveCgmbGF5b3V0Qm94KQorICAgICwgbV90eXBlKHR5cGUpCit7Cit9CisK
KyNkZWZpbmUgU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19JTkxJTkVfSVRFTShUb1ZhbHVlVHlwZU5h
bWUsIHByZWRpY2F0ZSkgXAorU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19CRUdJTihXZWJDb3JlOjpM
YXlvdXQ6OlRvVmFsdWVUeXBlTmFtZSkgXAorICAgIHN0YXRpYyBib29sIGlzVHlwZShjb25zdCBX
ZWJDb3JlOjpMYXlvdXQ6OklubGluZUl0ZW0mIGlubGluZUl0ZW0pIHsgcmV0dXJuIGlubGluZUl0
ZW0ucHJlZGljYXRlOyB9IFwKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfRU5EKCkKKworfQorfQor
I2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRl
eHRzL2lubGluZS9JbmxpbmVMaW5lLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lL0lubGluZUxpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjViMzM1YmM0MGVl
ZmM5YzI4MzNkNGQxMzdiNGE1ODQ3ODcwNzUyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVMaW5lLmNwcApA
QCAtMCwwICsxLDUzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJJbmxpbmVMaW5lLmgiCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVY
VCkKKworI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisjaW5jbHVkZSAiSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oIgorI2luY2x1
ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisjaW5jbHVkZSAiUnVudGltZUVuYWJsZWRGZWF0dXJl
cy5oIgorI2luY2x1ZGUgIlRleHRGbGFncy5oIgorI2luY2x1ZGUgIlRleHRVdGlsLmgiCisjaW5j
bHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFt
ZXNwYWNlIExheW91dCB7CisKK0xpbmU6OkxpbmUoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQmIGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQorICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dChpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1fdHJpbW1hYmxlVHJhaWxpbmdD
b250ZW50KG1fcnVucykKK3sKK30KKworTGluZTo6fkxpbmUoKQoreworfQorCit2b2lkIExpbmU6
OmluaXRpYWxpemUoKQoreworICAgIG1fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50ID0g
MDsKKyAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggPSB7IH07CisgICAgbV9ydW5zLmNsZWFyKCk7
CisgICAgbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IHsgfTsKKyAgICBtX3RyaW1tYWJsZVRy
YWlsaW5nQ29udGVudC5yZXNldCgpOworfQorCit2b2lkIExpbmU6OnJlbW92ZUNvbGxhcHNpYmxl
Q29udGVudChJbmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKQoreworICAgIHJl
bW92ZVRyYWlsaW5nVHJpbW1hYmxlQ29udGVudCgpOworICAgIHZpc3VhbGx5Q29sbGFwc2VQcmVX
cmFwT3ZlcmZsb3dDb250ZW50KGV4dHJhSG9yaXpvbnRhbFNwYWNlKTsKK30KKwordm9pZCBMaW5l
OjphcHBseVJ1bkV4cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNl
KQoreworICAgIEFTU0VSVChmb3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKS5zdHlsZSgpLnRleHRB
bGlnbigpID09IFRleHRBbGlnbk1vZGU6Okp1c3RpZnkpOworICAgIC8vIFRleHQgaXMganVzdGlm
aWVkIGFjY29yZGluZyB0byB0aGUgbWV0aG9kIHNwZWNpZmllZCBieSB0aGUgdGV4dC1qdXN0aWZ5
IHByb3BlcnR5LAorICAgIC8vIGluIG9yZGVyIHRvIGV4YWN0bHkgZmlsbCB0aGUgbGluZSBib3gu
IFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRleHQtYWxpZ24tbGFzdCwKKyAgICAvLyB0
aGUgbGFzdCBsaW5lIGJlZm9yZSBhIGZvcmNlZCBicmVhayBvciB0aGUgZW5kIG9mIHRoZSBibG9j
ayBpcyBzdGFydC1hbGlnbmVkLgorICAgIGlmIChtX3J1bnMuaXNFbXB0eSgpIHx8IG1fcnVucy5s
YXN0KCkuaXNMaW5lQnJlYWsoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXV0byBleHBhbnNp
b25PcHBvcnR1bml0eUNvdW50ID0gMDsKKyAgICBSdW4qIGxhc3RSdW5XaXRoQ29udGVudCA9IG51
bGxwdHI7CisgICAgLy8gQ29sbGVjdCBhbmQgZGlzdHJpYnV0ZSB0aGUgZXhwYW5zaW9uIG9wcG9y
dHVuaXRpZXMuCisgICAgZm9yIChhdXRvJiBydW4gOiBtX3J1bnMpIHsKKyAgICAgICAgZXhwYW5z
aW9uT3Bwb3J0dW5pdHlDb3VudCArPSBydW4uZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCgpOwor
ICAgICAgICBpZiAocnVuLmlzVGV4dCgpIHx8IHJ1bi5pc0JveCgpKQorICAgICAgICAgICAgbGFz
dFJ1bldpdGhDb250ZW50ID0gJnJ1bjsKKyAgICB9CisgICAgLy8gTmVlZCB0byBmaXggdXAgdGhl
IGxhc3QgcnVuJ3MgdHJhaWxpbmcgZXhwYW5zaW9uLgorICAgIGlmIChsYXN0UnVuV2l0aENvbnRl
bnQgJiYgbGFzdFJ1bldpdGhDb250ZW50LT5oYXNFeHBhbnNpb25PcHBvcnR1bml0eSgpKSB7Cisg
ICAgICAgIC8vIFR1cm4gb2ZmIHRoZSB0cmFpbGluZyBiaXRzIGZpcnN0IGFuZCBhZGQgdGhlIGZv
cmJpZCB0cmFpbGluZyBleHBhbnNpb24uCisgICAgICAgIGF1dG8gbGVhZGluZ0V4cGFuc2lvbiA9
IGxhc3RSdW5XaXRoQ29udGVudC0+ZXhwYW5zaW9uQmVoYXZpb3IoKSAmIExlZnRFeHBhbnNpb25N
YXNrOworICAgICAgICBsYXN0UnVuV2l0aENvbnRlbnQtPnNldEV4cGFuc2lvbkJlaGF2aW9yKGxl
YWRpbmdFeHBhbnNpb24gfCBGb3JiaWRSaWdodEV4cGFuc2lvbik7CisgICAgfQorICAgIC8vIEFu
eXRoaW5nIHRvIGRpc3RyaWJ1dGU/CisgICAgaWYgKCFleHBhbnNpb25PcHBvcnR1bml0eUNvdW50
IHx8ICFleHRyYUhvcml6b250YWxTcGFjZSkKKyAgICAgICAgcmV0dXJuOworICAgIC8vIERpc3Ry
aWJ1dGUgdGhlIGV4dHJhIHNwYWNlLgorICAgIGF1dG8gZXhwYW5zaW9uVG9EaXN0cmlidXRlID0g
ZXh0cmFIb3Jpem9udGFsU3BhY2UgLyBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50OworICAgIGF1
dG8gYWNjdW11bGF0ZWRFeHBhbnNpb24gPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKKyAgICBmb3Ig
KGF1dG8mIHJ1biA6IG1fcnVucykgeworICAgICAgICAvLyBFeHBhbmQgYW5kIG1vdmUgcnVucyBi
eSB0aGUgYWNjdW11bGF0ZWQgZXhwYW5zaW9uLgorICAgICAgICBydW4ubW92ZUhvcml6b250YWxs
eShhY2N1bXVsYXRlZEV4cGFuc2lvbik7CisgICAgICAgIGlmICghcnVuLmhhc0V4cGFuc2lvbk9w
cG9ydHVuaXR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgQVNTRVJUKHJ1bi5l
eHBhbnNpb25PcHBvcnR1bml0eUNvdW50KCkpOworICAgICAgICBhdXRvIGNvbXB1dGVkRXhwYW5z
aW9uID0gZXhwYW5zaW9uVG9EaXN0cmlidXRlICogcnVuLmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQoKTsKKyAgICAgICAgLy8gRklYTUU6IENoZWNrIHdoeSB3ZSBuZWVkIHRvIHNldCBib3RoLgor
ICAgICAgICBydW4uc2V0SG9yaXpvbnRhbEV4cGFuc2lvbihjb21wdXRlZEV4cGFuc2lvbik7Cisg
ICAgICAgIHJ1bi5zaHJpbmtIb3Jpem9udGFsbHkoLWNvbXB1dGVkRXhwYW5zaW9uKTsKKyAgICAg
ICAgYWNjdW11bGF0ZWRFeHBhbnNpb24gKz0gY29tcHV0ZWRFeHBhbnNpb247CisgICAgfQorICAg
IC8vIENvbnRlbnQgZ3Jvd3MgYXMgcnVucyBleHBhbmQuCisgICAgbV9jb250ZW50TG9naWNhbFdp
ZHRoICs9IGFjY3VtdWxhdGVkRXhwYW5zaW9uOworfQorCit2b2lkIExpbmU6OnJlbW92ZVRyYWls
aW5nVHJpbW1hYmxlQ29udGVudCgpCit7CisgICAgaWYgKG1fdHJpbW1hYmxlVHJhaWxpbmdDb250
ZW50LmlzRW1wdHkoKSB8fCBtX3J1bnMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBDb21wbGV4IGxpbmUgbGF5b3V0IHF1aXJrOiBrZWVwIHRoZSB0cmFpbGluZyB3aGl0ZXNw
YWNlIGFyb3VuZCB3aGVuIGl0IGlzIGZvbGxvd2VkIGJ5IGEgbGluZSBicmVhaywgdW5sZXNzIHRo
ZSBjb250ZW50IG92ZXJmbG93cyB0aGUgbGluZS4KKyAgICBpZiAoUnVudGltZUVuYWJsZWRGZWF0
dXJlczo6c2hhcmVkRmVhdHVyZXMoKS5sYXlvdXRGb3JtYXR0aW5nQ29udGV4dEludGVncmF0aW9u
RW5hYmxlZCgpKSB7CisgICAgICAgIGF1dG8gaXNUZXh0QWxpZ25SaWdodCA9IFsmXSB7CisgICAg
ICAgICAgICBhdXRvIHRleHRBbGlnbiA9IGZvcm1hdHRpbmdDb250ZXh0KCkucm9vdCgpLnN0eWxl
KCkudGV4dEFsaWduKCk7CisgICAgICAgICAgICByZXR1cm4gdGV4dEFsaWduID09IFRleHRBbGln
bk1vZGU6OlJpZ2h0CisgICAgICAgICAgICAgICAgfHwgdGV4dEFsaWduID09IFRleHRBbGlnbk1v
ZGU6OldlYktpdFJpZ2h0CisgICAgICAgICAgICAgICAgfHwgdGV4dEFsaWduID09IFRleHRBbGln
bk1vZGU6OkVuZDsKKyAgICAgICAgICAgIH0oKTsKKworICAgICAgICBpZiAobV9ydW5zLmxhc3Qo
KS5pc0xpbmVCcmVhaygpICYmICFpc1RleHRBbGlnblJpZ2h0KSB7CisgICAgICAgICAgICBtX3Ry
aW1tYWJsZVRyYWlsaW5nQ29udGVudC5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CisgICAgfQorCisgICAgbV9jb250ZW50TG9naWNhbFdpZHRoIC09IG1fdHJpbW1hYmxl
VHJhaWxpbmdDb250ZW50LnJlbW92ZSgpOworfQorCit2b2lkIExpbmU6OnZpc3VhbGx5Q29sbGFw
c2VQcmVXcmFwT3ZlcmZsb3dDb250ZW50KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFs
U3BhY2UpCit7CisgICAgQVNTRVJUKG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmlzRW1wdHko
KSk7CisgICAgLy8gSWYgd2hpdGUtc3BhY2UgaXMgc2V0IHRvIHByZS13cmFwLCB0aGUgVUEgbXVz
dAorICAgIC8vIC4uLgorICAgIC8vIEl0IG1heSBhbHNvIHZpc3VhbGx5IGNvbGxhcHNlIHRoZSBj
aGFyYWN0ZXIgYWR2YW5jZSB3aWR0aHMgb2YgYW55IHRoYXQgd291bGQgb3RoZXJ3aXNlIG92ZXJm
bG93LgorICAgIGF1dG8gb3ZlcmZsb3dXaWR0aCA9IC1leHRyYUhvcml6b250YWxTcGFjZTsKKyAg
ICBpZiAob3ZlcmZsb3dXaWR0aCA8PSAwKQorICAgICAgICByZXR1cm47CisgICAgLy8gTGV0J3Mg
anVzdCBmaW5kIHRoZSB0cmFpbGluZyBwcmUtd3JhcCB3aGl0ZXNwYWNlIGNvbnRlbnQgZm9yIG5v
dyAoZS5nIGNoZWNrIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB0cmFpbGluZyBydW5zIHdpdGgKKyAg
ICAvLyBkaWZmZXJlbnQgc2V0IG9mIHdoaXRlLXNwYWNlIHZhbHVlcyBhbmQgZGVjaWRlIGlmIHRo
ZSBpbi1iZXR3ZWVuIHByZS13cmFwIGNvbnRlbnQgc2hvdWxkIGJlIGNvbGxhcHNlZCBhcyB3ZWxs
LikKKyAgICBJbmxpbmVMYXlvdXRVbml0IHRyaW1tZWRDb250ZW50V2lkdGggPSAwOworICAgIGZv
ciAoYXV0byYgcnVuIDogV1RGOjptYWtlUmV2ZXJzZWRSYW5nZShtX3J1bnMpKSB7CisgICAgICAg
IGlmIChydW4uc3R5bGUoKS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6UHJlV3JhcCkgewor
ICAgICAgICAgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBwcmUtd3JhcCB0cmFpbGlu
ZyBjb250ZW50LgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBw
cmVXcmFwVmlzdWFsbHlDb2xsYXBzaWJsZUlubGluZUl0ZW0gPSBydW4uaXNJbmxpbmVCb3hTdGFy
dCgpIHx8IHJ1bi5pc0lubGluZUJveEVuZCgpIHx8IHJ1bi5oYXNUcmFpbGluZ1doaXRlc3BhY2Uo
KTsKKyAgICAgICAgaWYgKCFwcmVXcmFwVmlzdWFsbHlDb2xsYXBzaWJsZUlubGluZUl0ZW0pCisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgQVNTRVJUKCFydW4uaGFzQ29sbGFwc2libGVUcmFp
bGluZ1doaXRlc3BhY2UoKSk7CisgICAgICAgIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lk
dGggPSB7IH07CisgICAgICAgIGlmIChydW4uaXNUZXh0KCkpIHsKKyAgICAgICAgICAgIC8vIEZJ
WE1FOiBXZSBzaG91bGQgYWx3YXlzIGNvbGxhcHNlIHRoZSBydW4gYXQgYSBnbHlwaCBib3VuZGFy
eSBhcyB0aGUgc3BlYyBpbmRpY2F0ZXM6ICJjb2xsYXBzZSB0aGUgY2hhcmFjdGVyIGFkdmFuY2Ug
d2lkdGhzIG9mIGFueSB0aGF0IHdvdWxkIG90aGVyd2lzZSBvdmVyZmxvdyIKKyAgICAgICAgICAg
IC8vIGFuZCB0aGUgdHJpbW1lZCB3aWR0aCBzaG91bGQgYmUgY2FwcGVkIGF0IHN0ZDo6bWluKHJ1
bi50cmFpbGluZ1doaXRlc3BhY2VXaWR0aCgpLCBvdmVyZmxvd1dpZHRoKSBmb3IgdGV4dCBydW5z
LiBCb3RoIEZGIGFuZCBDaHJvbWUgYWdyZWUuCisgICAgICAgICAgICB0cmltbWFibGVXaWR0aCA9
IHJ1bi50cmFpbGluZ1doaXRlc3BhY2VXaWR0aCgpOworICAgICAgICAgICAgcnVuLnZpc3VhbGx5
Q29sbGFwc2VUcmFpbGluZ1doaXRlc3BhY2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgIHRyaW1tYWJsZVdpZHRoID0gcnVuLmxvZ2ljYWxXaWR0aCgpOworICAgICAgICAgICAgcnVu
LnNocmlua0hvcml6b250YWxseSh0cmltbWFibGVXaWR0aCk7CisgICAgICAgIH0KKyAgICAgICAg
dHJpbW1lZENvbnRlbnRXaWR0aCArPSB0cmltbWFibGVXaWR0aDsKKyAgICAgICAgb3ZlcmZsb3dX
aWR0aCAtPSB0cmltbWFibGVXaWR0aDsKKyAgICAgICAgaWYgKG92ZXJmbG93V2lkdGggPD0gMCkK
KyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggLT0g
dHJpbW1lZENvbnRlbnRXaWR0aDsKK30KKwordm9pZCBMaW5lOjphcHBlbmQoY29uc3QgSW5saW5l
SXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7CisgICAg
aWYgKGlubGluZUl0ZW0uaXNUZXh0KCkpCisgICAgICAgIGFwcGVuZFRleHRDb250ZW50KGRvd25j
YXN0PElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKSwgbG9naWNhbFdpZHRoKTsKKyAgICBlbHNl
IGlmIChpbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkpCisgICAgICAgIGFwcGVuZExpbmVCcmVhayhp
bmxpbmVJdGVtKTsKKyAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5p
dHkoKSkKKyAgICAgICAgYXBwZW5kV29yZEJyZWFrT3Bwb3J0dW5pdHkoaW5saW5lSXRlbSk7Cisg
ICAgZWxzZSBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCkpCisgICAgICAgIGFwcGVu
ZElubGluZUJveFN0YXJ0KGlubGluZUl0ZW0sIGxvZ2ljYWxXaWR0aCk7CisgICAgZWxzZSBpZiAo
aW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQorICAgICAgICBhcHBlbmRJbmxpbmVCb3hFbmQo
aW5saW5lSXRlbSwgbG9naWNhbFdpZHRoKTsKKyAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmxheW91
dEJveCgpLmlzUmVwbGFjZWRCb3goKSkKKyAgICAgICAgYXBwZW5kUmVwbGFjZWRJbmxpbmVMZXZl
bEJveChpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgpOworICAgIGVsc2UgaWYgKGlubGluZUl0ZW0u
aXNCb3goKSkKKyAgICAgICAgYXBwZW5kTm9uUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJ
dGVtLCBsb2dpY2FsV2lkdGgpOworICAgIGVsc2UKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7Cit9CisKK3ZvaWQgTGluZTo6YXBwZW5kTm9uQnJlYWthYmxlU3BhY2UoY29uc3QgSW5saW5l
SXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7CisgICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0s
IGxvZ2ljYWxMZWZ0LCBsb2dpY2FsV2lkdGggfSk7CisgICAgbV9jb250ZW50TG9naWNhbFdpZHRo
ICs9IGxvZ2ljYWxXaWR0aDsKK30KKwordm9pZCBMaW5lOjphcHBlbmRJbmxpbmVCb3hTdGFydChj
b25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0
aCkKK3sKKyAgICAvLyBUaGlzIGlzIHJlYWxseSBqdXN0IGEgcGxhY2Vob2xkZXIgdG8gbWFyayB0
aGUgc3RhcnQgb2YgdGhlIGlubGluZSBib3ggPHNwYW4+LgorICAgIGF1dG8mIGJveEdlb21ldHJ5
ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChpbmxpbmVJdGVtLmxheW91dEJv
eCgpKTsKKyAgICBhdXRvIGFkanVzdGVkUnVuU3RhcnQgPSBjb250ZW50TG9naWNhbFJpZ2h0KCkg
KyBzdGQ6Om1pbihib3hHZW9tZXRyeS5tYXJnaW5TdGFydCgpLCAwX2x1KTsKKyAgICArK21fbm9u
U3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50OworICAgIGFwcGVuZE5vbkJyZWFrYWJsZVNwYWNl
KGlubGluZUl0ZW0sIGFkanVzdGVkUnVuU3RhcnQsIGxvZ2ljYWxXaWR0aCk7Cit9CisKK3ZvaWQg
TGluZTo6YXBwZW5kSW5saW5lQm94RW5kKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElu
bGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQoreworICAgIC8vIFRoaXMgaXMgcmVhbGx5IGp1
c3QgYSBwbGFjZWhvbGRlciB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGlubGluZSBib3ggPC9zcGFu
Pi4KKyAgICBhdXRvIHJlbW92ZVRyYWlsaW5nTGV0dGVyU3BhY2luZyA9IFsmXSB7CisgICAgICAg
IGlmICghbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuaXNUcmFpbGluZ1J1blBhcnRpYWxseVRy
aW1tYWJsZSgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBtX2NvbnRlbnRMb2dpY2Fs
V2lkdGggLT0gbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQucmVtb3ZlUGFydGlhbGx5VHJpbW1h
YmxlQ29udGVudCgpOworICAgIH07CisgICAgLy8gUHJldmVudCB0cmFpbGluZyBsZXR0ZXItc3Bh
Y2luZyBmcm9tIHNwaWxsaW5nIG91dCBvZiB0aGUgaW5saW5lIGJveC4KKyAgICAvLyBodHRwczov
L2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jbGV0dGVyLXNwYWNpbmctcHJvcGVydHkgU2Vl
IGV4YW1wbGUgMjEuCisgICAgcmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCk7CisgICAgYXBw
ZW5kTm9uQnJlYWthYmxlU3BhY2UoaW5saW5lSXRlbSwgY29udGVudExvZ2ljYWxXaWR0aCgpLCBs
b2dpY2FsV2lkdGgpOworfQorCit2b2lkIExpbmU6OmFwcGVuZFRleHRDb250ZW50KGNvbnN0IElu
bGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lk
dGgpCit7CisgICAgYXV0byYgc3R5bGUgPSBpbmxpbmVUZXh0SXRlbS5zdHlsZSgpOworICAgIGF1
dG8gd2lsbENvbGxhcHNlQ29tcGxldGVseSA9IFsmXSB7CisgICAgICAgIGlmIChpbmxpbmVUZXh0
SXRlbS5pc0VtcHR5Q29udGVudCgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
IGlmICghaW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIGlmIChJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNB
bmRUYWJzKGlubGluZVRleHRJdGVtKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgLy8gQ2hlY2sgaWYgdGhlIGxhc3QgaXRlbSBpcyBjb2xsYXBzZWQgYXMgd2VsbC4KKyAgICAg
ICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKG1fcnVucykpIHsKKyAg
ICAgICAgICAgIGlmIChydW4uaXNCb3goKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jd2hp
dGUtc3BhY2UtcGhhc2UtMQorICAgICAgICAgICAgLy8gQW55IGNvbGxhcHNpYmxlIHNwYWNlIGlt
bWVkaWF0ZWx5IGZvbGxvd2luZyBhbm90aGVyIGNvbGxhcHNpYmxlIHNwYWNl4oCUZXZlbiBvbmUg
b3V0c2lkZSB0aGUgYm91bmRhcnkgb2YgdGhlIGlubGluZSBjb250YWluaW5nIHRoYXQgc3BhY2Us
CisgICAgICAgICAgICAvLyBwcm92aWRlZCBib3RoIHNwYWNlcyBhcmUgd2l0aGluIHRoZSBzYW1l
IGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHTigJRpcyBjb2xsYXBzZWQgdG8gaGF2ZSB6ZXJvIGFk
dmFuY2Ugd2lkdGguCisgICAgICAgICAgICAvLyA6ICI8c3Bhbj4gIDwvc3Bhbj4gIiA8LSB0aGUg
dHJhaWxpbmcgd2hpdGVzcGFjZSBjb2xsYXBzZXMgY29tcGxldGVseS4KKyAgICAgICAgICAgIC8v
IE5vdCB0aGF0IHdoZW4gdGhlIGlubGluZSBib3ggaGFzIHByZXNlcnZlIHdoaXRlc3BhY2Ugc3R5
bGUsICI8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IHByZSI+ICA8L3NwYW4+ICIgPC0gdGhpcyB3
aGl0ZXNwYWNlIHN0YXlzIGFyb3VuZC4KKyAgICAgICAgICAgIGlmIChydW4uaXNUZXh0KCkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIHJ1bi5oYXNDb2xsYXBzaWJsZVRyYWlsaW5nV2hpdGVzcGFj
ZSgpOworICAgICAgICAgICAgQVNTRVJUKHJ1bi5pc0lubGluZUJveFN0YXJ0KCkgfHwgcnVuLmlz
SW5saW5lQm94RW5kKCkgfHwgcnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7CisgICAgICAg
IH0KKyAgICAgICAgLy8gTGVhZGluZyB3aGl0ZXNwYWNlLgorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9OworCisgICAgaWYgKHdpbGxDb2xsYXBzZUNvbXBsZXRlbHkoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgYXV0byBuZWVkc05ld1J1biA9IFsmXSB7CisgICAgICAgIGlmIChtX3J1bnMu
aXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGF1dG8mIGxhc3RS
dW4gPSBtX3J1bnMubGFzdCgpOworICAgICAgICBpZiAoJmxhc3RSdW4ubGF5b3V0Qm94KCkgIT0g
JmlubGluZVRleHRJdGVtLmxheW91dEJveCgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIGlmICghbGFzdFJ1bi5pc1RleHQoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICBpZiAobGFzdFJ1bi5oYXNDb2xsYXBzZWRUcmFpbGluZ1doaXRlc3BhY2UoKSkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoaW5saW5lVGV4dEl0ZW0uaXNXb3Jk
U2VwYXJhdG9yKCkgJiYgc3R5bGUuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpKQorICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9KCk7CisgICAg
YXV0byBvbGRDb250ZW50TG9naWNhbFdpZHRoID0gY29udGVudExvZ2ljYWxXaWR0aCgpOworICAg
IGlmIChuZWVkc05ld1J1bikgeworICAgICAgICAvLyBOb3RlLCBuZWdhdGl2ZSB3b3JkcyBzcGFj
aW5nIG1heSBjYXVzZSBnbHlwaCBvdmVybGFwLgorICAgICAgICBhdXRvIHJ1bkxvZ2ljYWxMZWZ0
ID0gY29udGVudExvZ2ljYWxSaWdodCgpICsgKGlubGluZVRleHRJdGVtLmlzV29yZFNlcGFyYXRv
cigpID8gc3R5bGUuZm9udENhc2NhZGUoKS53b3JkU3BhY2luZygpIDogMC4wZik7CisgICAgICAg
IG1fcnVucy5hcHBlbmQoeyBpbmxpbmVUZXh0SXRlbSwgcnVuTG9naWNhbExlZnQsIGxvZ2ljYWxX
aWR0aCB9KTsKKyAgICAgICAgbV9jb250ZW50TG9naWNhbFdpZHRoID0gc3RkOjptYXgob2xkQ29u
dGVudExvZ2ljYWxXaWR0aCwgcnVuTG9naWNhbExlZnQgKyBsb2dpY2FsV2lkdGgpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIG1fcnVucy5sYXN0KCkuZXhwYW5kKGlubGluZVRleHRJdGVtLCBsb2dp
Y2FsV2lkdGgpOworICAgICAgICAvLyBEbyBub3QgbGV0IG5lZ2F0aXZlIGxldHRlciBzcGFjaW5n
IG1ha2UgdGhlIGNvbnRlbnQgc2hvcnRlciB0aGFuIGl0IGFscmVhZHkgaXMuCisgICAgICAgIG1f
Y29udGVudExvZ2ljYWxXaWR0aCArPSBzdGQ6Om1heCgwLjBmLCBsb2dpY2FsV2lkdGgpOworICAg
IH0KKyAgICAvLyBTZXQgdGhlIHRyYWlsaW5nIHRyaW1tYWJsZSBjb250ZW50LgorICAgIGlmIChp
bmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFBy
ZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpIHsKKyAgICAgICAgbV90cmltbWFi
bGVUcmFpbGluZ0NvbnRlbnQuYWRkRnVsbHlUcmltbWFibGVDb250ZW50KG1fcnVucy5zaXplKCkg
LSAxLCBjb250ZW50TG9naWNhbFdpZHRoKCkgLSBvbGRDb250ZW50TG9naWNhbFdpZHRoKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBBbnkgbm9uLXdoaXRlc3BhY2UsIG5vLXRyaW1t
YWJsZSBjb250ZW50IHJlc2V0cyB0aGUgZXhpc3RpbmcgdHJpbW1hYmxlLgorICAgIG1fdHJpbW1h
YmxlVHJhaWxpbmdDb250ZW50LnJlc2V0KCk7CisgICAgaWYgKCFmb3JtYXR0aW5nQ29udGV4dCgp
LmxheW91dFN0YXRlKCkuc2hvdWxkSWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgJiYgIWlu
bGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpICYmIHN0eWxlLmxldHRlclNwYWNpbmcoKSA+IDAp
CisgICAgICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LmFkZFBhcnRpYWxseVRyaW1tYWJs
ZUNvbnRlbnQobV9ydW5zLnNpemUoKSAtIDEsIHN0eWxlLmxldHRlclNwYWNpbmcoKSk7CisgICAg
bV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IGlubGluZVRleHRJdGVtLmhhc1RyYWlsaW5nU29m
dEh5cGhlbigpID8gbWFrZU9wdGlvbmFsKHN0eWxlLmZvbnRDYXNjYWRlKCkud2lkdGgoVGV4dFJ1
biB7IFN0cmluZ1ZpZXcgeyBzdHlsZS5oeXBoZW5TdHJpbmcoKSB9IH0pKSA6IFdURjo6bnVsbG9w
dDsKK30KKwordm9pZCBMaW5lOjphcHBlbmROb25SZXBsYWNlZElubGluZUxldmVsQm94KGNvbnN0
IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNh
bFdpZHRoKQoreworICAgIG1fdHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlc2V0KCk7CisgICAg
bV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCA9IHsgfTsKKyAgICBtX2NvbnRlbnRMb2dpY2FsV2lk
dGggKz0gbWFyZ2luQm94TG9naWNhbFdpZHRoOworICAgICsrbV9ub25TcGFubmluZ0lubGluZUxl
dmVsQm94Q291bnQ7CisgICAgYXV0byBtYXJnaW5TdGFydCA9IGZvcm1hdHRpbmdDb250ZXh0KCku
Z2VvbWV0cnlGb3JCb3goaW5saW5lSXRlbS5sYXlvdXRCb3goKSkubWFyZ2luU3RhcnQoKTsKKyAg
ICBpZiAobWFyZ2luU3RhcnQgPj0gMCkgeworICAgICAgICBtX3J1bnMuYXBwZW5kKHsgaW5saW5l
SXRlbSwgY29udGVudExvZ2ljYWxSaWdodCgpLCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGggfSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gTmVnYXRpdmUgbWFyZ2luLXN0YXJ0IHB1bGxz
IHRoZSBjb250ZW50IHRvIHRoZSBsb2dpY2FsIGxlZnQgZGlyZWN0aW9uLgorICAgIC8vIE5lZ2F0
aXZlIG1hcmdpbiBhbHNvIHNxdWVlemVzIHRoZSBtYXJnaW4gYm94LCB3ZSBuZWVkIHRvIHN0cmV0
Y2ggaXQgdG8gbWFrZSBzdXJlIHRoZSBzdWJzZXF1ZW50IGNvbnRlbnQgd29uJ3Qgb3ZlcmxhcC4K
KyAgICAvLyBlLmcuIDxpbWcgc3R5bGU9IndpZHRoOiAxMDBweDsgbWFyZ2luLWxlZnQ6IC0xMDBw
eDsiPiBwdWxscyB0aGUgcmVwbGFjZWQgYm94IHRvIC0xMDBweCB3aXRoIHRoZSBtYXJnaW4gYm94
IHdpZHRoIG9mIDBweC4KKyAgICAvLyBJbnN0ZWFkIHdlIG5lZWQgdG8gcG9zaXRpb24gaXQgYXQg
LTEwMHB4IGFuZCBzaXplIGl0IHRvIDEwMHB4IHNvIHRoZSBzdWJzZXF1ZW50IGNvbnRlbnQgc3Rh
cnRzIGF0IDBweC4gCisgICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGNvbnRlbnRMb2dp
Y2FsUmlnaHQoKSArIG1hcmdpblN0YXJ0LCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGggLSBtYXJnaW5T
dGFydCB9KTsKK30KKwordm9pZCBMaW5lOjphcHBlbmRSZXBsYWNlZElubGluZUxldmVsQm94KGNv
bnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9n
aWNhbFdpZHRoKQoreworICAgIEFTU0VSVChpbmxpbmVJdGVtLmxheW91dEJveCgpLmlzUmVwbGFj
ZWRCb3goKSk7CisgICAgLy8gRklYTUU6IFN1cmVseSByZXBsYWNlZCBib3hlcyBiZWhhdmUgZGlm
ZmVyZW50bHkuCisgICAgYXBwZW5kTm9uUmVwbGFjZWRJbmxpbmVMZXZlbEJveChpbmxpbmVJdGVt
LCBtYXJnaW5Cb3hMb2dpY2FsV2lkdGgpOworfQorCit2b2lkIExpbmU6OmFwcGVuZExpbmVCcmVh
ayhjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQoreworICAgIG1fdHJhaWxpbmdTb2Z0SHlw
aGVuV2lkdGggPSB7IH07CisgICAgaWYgKGlubGluZUl0ZW0uaXNIYXJkTGluZUJyZWFrKCkpIHsK
KyAgICAgICAgKyttX25vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudDsKKyAgICAgICAgcmV0
dXJuIG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIDBf
bHUgfSk7CisgICAgfQorICAgIC8vIFNvZnQgbGluZSBicmVha3MgKHByZXNlcnZlZCBuZXcgbGlu
ZSBjaGFyYWN0ZXJzKSByZXF1aXJlIGlubGluZSB0ZXh0IGJveGVzIGZvciBjb21wYXRpYmlsaXR5
IHJlYXNvbnMuCisgICAgQVNTRVJUKGlubGluZUl0ZW0uaXNTb2Z0TGluZUJyZWFrKCkpOworICAg
IG1fcnVucy5hcHBlbmQoeyBkb3duY2FzdDxJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbT4oaW5saW5l
SXRlbSksIGNvbnRlbnRMb2dpY2FsUmlnaHQoKSB9KTsKK30KKwordm9pZCBMaW5lOjphcHBlbmRX
b3JkQnJlYWtPcHBvcnR1bml0eShjb25zdCBJbmxpbmVJdGVtJiBpbmxpbmVJdGVtKQoreworICAg
IG1fcnVucy5hcHBlbmQoeyBpbmxpbmVJdGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIDBfbHUg
fSk7Cit9CisKK3ZvaWQgTGluZTo6YWRkVHJhaWxpbmdIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBo
eXBoZW5Mb2dpY2FsV2lkdGgpCit7CisgICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZl
cnNlZFJhbmdlKG1fcnVucykpIHsKKyAgICAgICAgaWYgKCFydW4uaXNUZXh0KCkpCisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgcnVuLnNldE5lZWRzSHlwaGVuKGh5cGhlbkxvZ2ljYWxX
aWR0aCk7CisgICAgICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCArPSBoeXBoZW5Mb2dpY2FsV2lk
dGg7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9
CisKK2NvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBMaW5lOjpmb3JtYXR0aW5nQ29udGV4
dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Cit9CisK
K0xpbmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50
KFJ1bkxpc3QmIHJ1bnMpCisgICAgOiBtX3J1bnMocnVucykKK3sKK30KKwordm9pZCBMaW5lOjpU
cmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OmFkZEZ1bGx5VHJpbW1hYmxlQ29udGVudChzaXplX3Qg
cnVuSW5kZXgsIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpCit7CisgICAgLy8gQW55
IHN1YnNlcXVlbnQgdHJpbW1hYmxlIHdoaXRlc3BhY2Ugc2hvdWxkIGNvbGxhcHNlIHRvIHplcm8g
YWR2YW5jZWQgd2lkdGggYW5kIGlnbm9yZWQgYXQgOjphcHBlbmRUZXh0Q29udGVudCgpLgorICAg
IEFTU0VSVCghbV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQpOworICAgIG1fZnVsbHlUcmltbWFi
bGVXaWR0aCA9IHRyaW1tYWJsZVdpZHRoOworICAgIC8vIE5vdGUgdGhhdCBqdXN0IGJlY2F1c2Ug
dGhlIHRyaW1tYWJsZSB3aWR0aCBpcyAwIChmb250LXNpemU6IDBweCksIGl0IGRvZXMgbm90IG1l
YW4gd2UgZG9uJ3QgaGF2ZSBhIHRyaW1tYWJsZSB0cmFpbGluZyBjb250ZW50LgorICAgIG1faGFz
RnVsbHlUcmltbWFibGVDb250ZW50ID0gdHJ1ZTsKKyAgICBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5k
ZXggPSBtX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXgudmFsdWVPcihydW5JbmRleCk7Cit9CisKK3Zv
aWQgTGluZTo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50OjphZGRQYXJ0aWFsbHlUcmltbWFibGVD
b250ZW50KHNpemVfdCBydW5JbmRleCwgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVXaWR0aCkK
K3sKKyAgICAvLyBEbyBub3QgYWRkIHRyaW1tYWJsZSBsZXR0ZXIgc3BhY2luZyBhZnRlciBhIGZ1
bGx5IHRyaW1tYWJsZSB3aGl0ZXNwYWNlLgorICAgIEFTU0VSVCghbV9maXJzdFRyaW1tYWJsZVJ1
bkluZGV4KTsKKyAgICBBU1NFUlQoIW1faGFzRnVsbHlUcmltbWFibGVDb250ZW50KTsKKyAgICBB
U1NFUlQoIW1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGgpOworICAgIEFTU0VSVCh0cmltbWFibGVX
aWR0aCk7CisgICAgbV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aCA9IHRyaW1tYWJsZVdpZHRoOwor
ICAgIG1fZmlyc3RUcmltbWFibGVSdW5JbmRleCA9IHJ1bkluZGV4OworfQorCitJbmxpbmVMYXlv
dXRVbml0IExpbmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6cmVtb3ZlKCkKK3sKKyAgICAv
LyBSZW1vdmUgdHJpbW1hYmxlIHRyYWlsaW5nIGNvbnRlbnQgYW5kIG1vdmUgYWxsIHRoZSBzdWJz
ZXF1ZW50IHRyYWlsaW5nIHJ1bnMuCisgICAgLy8gPHNwYW4+IDwvc3Bhbj48c3Bhbj48L3NwYW4+
CisgICAgLy8gW3RyYWlsaW5nIHdoaXRlc3BhY2VdW2lubGluZSBib3ggZW5kXVtpbmxpbmUgYm94
IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF0KKyAgICAvLyBUcmltIHRoZSB3aGl0ZXNwYWNlIHJ1biBh
bmQgbW92ZSB0aGUgdHJhaWxpbmcgaW5saW5lIGJveCBydW5zIHRvIHRoZSBsb2dpY2FsIGxlZnQu
CisgICAgQVNTRVJUKCFpc0VtcHR5KCkpOworICAgIGF1dG8mIHRyaW1tYWJsZVJ1biA9IG1fcnVu
c1sqbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4XTsKKyAgICBBU1NFUlQodHJpbW1hYmxlUnVuLmlz
VGV4dCgpKTsKKworICAgIGlmIChtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCkKKyAgICAgICAg
dHJpbW1hYmxlUnVuLnJlbW92ZVRyYWlsaW5nV2hpdGVzcGFjZSgpOworICAgIGlmIChtX3BhcnRp
YWxseVRyaW1tYWJsZVdpZHRoKQorICAgICAgICB0cmltbWFibGVSdW4ucmVtb3ZlVHJhaWxpbmdM
ZXR0ZXJTcGFjaW5nKCk7CisKKyAgICBhdXRvIHRyaW1tYWJsZVdpZHRoID0gd2lkdGgoKTsKKyAg
ICAvLyBXaGVuIHRoZSB0cmltbWFibGUgcnVuIGlzIGZvbGxvd2VkIGJ5IHNvbWUgbm9uLWNvbnRl
bnQgcnVucywgd2UgbmVlZCB0byBhZGp1c3QgdGhlaXIgaG9yaXpvbnRhbCBwb3NpdGlvbnMuCisg
ICAgLy8gZS5nLiA8ZGl2PnRleHQgaXMgZm9sbG93ZWQgYnkgdHJpbW1hYmxlIGNvbnRlbnQgICAg
PHNwYW4+IDwvc3Bhbj48L2Rpdj4KKyAgICAvLyBXaGVuIHRoZSBbdGV4dC4uLl0gcnVuIGlzIHRy
aW1tZWQgKHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCksIGJvdGggIjxzcGFuPiIgYW5k
ICI8L3NwYW4+IiBydW5zCisgICAgLy8gbmVlZCB0byBiZSBtb3ZlZCBob3Jpem9udGFsbHkgdG8g
Y2F0Y2ggdXAgd2l0aCB0aGUgW3RleHQuLi5dIHJ1bi4gTm90ZSB0aGF0IHRoZSB3aGl0ZXNwYWNl
IGluc2lkZSB0aGUgPHNwYW4+IGRvZXMKKyAgICAvLyBub3QgcHJvZHVjZSBhIHJ1biBzaW5jZSBp
biA6OmFwcGVuZFRleHQoKSB3ZSBzZWUgaXQgYXMgYSBmdWxseSBjb2xsYXBzaWJsZSBydW4uCisg
ICAgZm9yIChhdXRvIGluZGV4ID0gKm1fZmlyc3RUcmltbWFibGVSdW5JbmRleCArIDE7IGluZGV4
IDwgbV9ydW5zLnNpemUoKTsgKytpbmRleCkgeworICAgICAgICBhdXRvJiBydW4gPSBtX3J1bnNb
aW5kZXhdOworICAgICAgICBBU1NFUlQocnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSB8fCBy
dW4uaXNJbmxpbmVCb3hTdGFydCgpIHx8IHJ1bi5pc0lubGluZUJveEVuZCgpIHx8IHJ1bi5pc0xp
bmVCcmVhaygpKTsKKyAgICAgICAgcnVuLm1vdmVIb3Jpem9udGFsbHkoLXRyaW1tYWJsZVdpZHRo
KTsKKyAgICB9CisgICAgaWYgKCF0cmltbWFibGVSdW4udGV4dENvbnRlbnQoKS0+bGVuZ3RoKCkp
IHsKKyAgICAgICAgLy8gVGhpcyB0cmltbWFibGUgcnVuIGlzIGZ1bGx5IGNvbGxhcHNlZCBub3cg
KGUuZy4gPGRpdj48aW1nPiAgICA8c3Bhbj48L3NwYW4+PC9kaXY+KS4KKyAgICAgICAgLy8gV2Ug
ZG9uJ3QgbmVlZCB0byBrZWVwIGl0IGFyb3VuZCBhbnltb3JlLgorICAgICAgICBtX3J1bnMucmVt
b3ZlKCptX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXgpOworICAgIH0KKyAgICByZXNldCgpOworICAg
IHJldHVybiB0cmltbWFibGVXaWR0aDsKK30KKworSW5saW5lTGF5b3V0VW5pdCBMaW5lOjpUcmlt
bWFibGVUcmFpbGluZ0NvbnRlbnQ6OnJlbW92ZVBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQoKQor
eworICAgIC8vIFBhcnRpYWxseSB0cmltbWFibGUgY29udGVudCBpcyBhbHdheXMgZ2F0ZWQgYnkg
YSBmdWxseSB0cmltbWFibGUgY29udGVudC4KKyAgICAvLyBXZSBjYW4ndCBqdXN0IHRyaW0gc3Bh
Y2luZyBpbiB0aGUgbWlkZGxlLgorICAgIEFTU0VSVCghbV9mdWxseVRyaW1tYWJsZVdpZHRoKTsK
KyAgICByZXR1cm4gcmVtb3ZlKCk7Cit9CisKK0xpbmU6OlJ1bjo6UnVuKGNvbnN0IElubGluZUl0
ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91
dFVuaXQgbG9naWNhbFdpZHRoKQorICAgIDogbV90eXBlKGlubGluZUl0ZW0udHlwZSgpKQorICAg
ICwgbV9sYXlvdXRCb3goJmlubGluZUl0ZW0ubGF5b3V0Qm94KCkpCisgICAgLCBtX2xvZ2ljYWxM
ZWZ0KGxvZ2ljYWxMZWZ0KQorICAgICwgbV9sb2dpY2FsV2lkdGgobG9naWNhbFdpZHRoKQorewor
fQorCitMaW5lOjpSdW46OlJ1bihjb25zdCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSYgc29mdExp
bmVCcmVha0l0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQpCisgICAgOiBtX3R5cGUo
c29mdExpbmVCcmVha0l0ZW0udHlwZSgpKQorICAgICwgbV9sYXlvdXRCb3goJnNvZnRMaW5lQnJl
YWtJdGVtLmxheW91dEJveCgpKQorICAgICwgbV9sb2dpY2FsTGVmdChsb2dpY2FsTGVmdCkKKyAg
ICAsIG1fdGV4dENvbnRlbnQoeyBzb2Z0TGluZUJyZWFrSXRlbS5wb3NpdGlvbigpLCAxLCBzb2Z0
TGluZUJyZWFrSXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpIH0pCit7Cit9CisKK0xpbmU6
OlJ1bjo6UnVuKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCisgICAg
OiBtX3R5cGUoSW5saW5lSXRlbTo6VHlwZTo6VGV4dCkKKyAgICAsIG1fbGF5b3V0Qm94KCZpbmxp
bmVUZXh0SXRlbS5sYXlvdXRCb3goKSkKKyAgICAsIG1fbG9naWNhbExlZnQobG9naWNhbExlZnQp
CisgICAgLCBtX2xvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGgpCisgICAgLCBtX3doaXRlc3BhY2VJ
c0V4cGFuc2lvbk9wcG9ydHVuaXR5KCFUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRU
YWJzKGlubGluZVRleHRJdGVtLmxheW91dEJveCgpKSkKKyAgICAsIG1fdHJhaWxpbmdXaGl0ZXNw
YWNlVHlwZSh0cmFpbGluZ1doaXRlc3BhY2VUeXBlKGlubGluZVRleHRJdGVtKSkKKyAgICAsIG1f
dGV4dENvbnRlbnQoeyBpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBtX3RyYWlsaW5nV2hpdGVzcGFj
ZVR5cGUgPT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQgPyAxIDogaW5saW5lVGV4dEl0
ZW0ubGVuZ3RoKCksIGlubGluZVRleHRJdGVtLmlubGluZVRleHRCb3goKS5jb250ZW50KCkgfSkK
K3sKKyAgICBpZiAobV90cmFpbGluZ1doaXRlc3BhY2VUeXBlICE9IFRyYWlsaW5nV2hpdGVzcGFj
ZTo6Tm9uZSkgeworICAgICAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0gbG9naWNhbFdp
ZHRoOworICAgICAgICBpZiAobV93aGl0ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1bml0eSkKKyAg
ICAgICAgICAgIG1fZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCA9IDE7CisgICAgfQorfQorCit2
b2lkIExpbmU6OlJ1bjo6ZXhwYW5kKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRl
bSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCit7CisgICAgLy8gRklYTUU6IFRoaXMg
aXMgYSB2ZXJ5IHNpbXBsZSBleHBhbnNpb24gbWVyZ2UuIFdlIHNob3VsZCBldmVudHVhbGx5IHN3
aXRjaCBvdmVyIHRvIEZvbnRDYXNjYWRlOjpleHBhbnNpb25PcHBvcnR1bml0eUNvdW50LgorICAg
IEFTU0VSVCghaGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCkpOworICAgIEFTU0VSVChp
c1RleHQoKSAmJiBpbmxpbmVUZXh0SXRlbS5pc1RleHQoKSk7CisgICAgQVNTRVJUKG1fbGF5b3V0
Qm94ID09ICZpbmxpbmVUZXh0SXRlbS5sYXlvdXRCb3goKSk7CisKKyAgICBtX2xvZ2ljYWxXaWR0
aCArPSBsb2dpY2FsV2lkdGg7CisgICAgbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID0gdHJhaWxp
bmdXaGl0ZXNwYWNlVHlwZShpbmxpbmVUZXh0SXRlbSk7CisKKyAgICBpZiAobV90cmFpbGluZ1do
aXRlc3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZSkgeworICAgICAgICBtX3Ry
YWlsaW5nV2hpdGVzcGFjZVdpZHRoID0geyB9OworICAgICAgICBzZXRFeHBhbnNpb25CZWhhdmlv
cihBbGxvd0xlZnRFeHBhbnNpb24gfCBBbGxvd1JpZ2h0RXhwYW5zaW9uKTsKKyAgICAgICAgbV90
ZXh0Q29udGVudC0+ZXhwYW5kKGlubGluZVRleHRJdGVtLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoICs9IGxvZ2ljYWxXaWR0
aDsKKyAgICBpZiAobV93aGl0ZXNwYWNlSXNFeHBhbnNpb25PcHBvcnR1bml0eSkKKyAgICAgICAg
KyttX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7CisgICAgc2V0RXhwYW5zaW9uQmVoYXZpb3Io
RGVmYXVsdEV4cGFuc2lvbik7CisgICAgbV90ZXh0Q29udGVudC0+ZXhwYW5kKG1fdHJhaWxpbmdX
aGl0ZXNwYWNlVHlwZSA9PSBUcmFpbGluZ1doaXRlc3BhY2U6OkNvbGxhcHNlZCA/IDEgOiBpbmxp
bmVUZXh0SXRlbS5sZW5ndGgoKSk7Cit9CisKK2Jvb2wgTGluZTo6UnVuOjpoYXNUcmFpbGluZ0xl
dHRlclNwYWNpbmcoKSBjb25zdAoreworICAgIHJldHVybiAhaGFzVHJhaWxpbmdXaGl0ZXNwYWNl
KCkgJiYgc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCkgPiAwOworfQorCitJbmxpbmVMYXlvdXRVbml0
IExpbmU6OlJ1bjo6dHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgY29uc3QKK3sKKyAgICBpZiAoIWhh
c1RyYWlsaW5nTGV0dGVyU3BhY2luZygpKQorICAgICAgICByZXR1cm4geyB9OworICAgIHJldHVy
biBJbmxpbmVMYXlvdXRVbml0IHsgc3R5bGUoKS5sZXR0ZXJTcGFjaW5nKCkgfTsKK30KKwordm9p
ZCBMaW5lOjpSdW46OnJlbW92ZVRyYWlsaW5nTGV0dGVyU3BhY2luZygpCit7CisgICAgQVNTRVJU
KGhhc1RyYWlsaW5nTGV0dGVyU3BhY2luZygpKTsKKyAgICBzaHJpbmtIb3Jpem9udGFsbHkodHJh
aWxpbmdMZXR0ZXJTcGFjaW5nKCkpOworICAgIEFTU0VSVChsb2dpY2FsV2lkdGgoKSA+IDAgfHwg
KCFsb2dpY2FsV2lkdGgoKSAmJiBzdHlsZSgpLmxldHRlclNwYWNpbmcoKSA+PSBzdGF0aWNfY2Fz
dDxmbG9hdD4oaW50TWF4Rm9yTGF5b3V0VW5pdCkpKTsKK30KKwordm9pZCBMaW5lOjpSdW46OnJl
bW92ZVRyYWlsaW5nV2hpdGVzcGFjZSgpCit7CisgICAgLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8v
d3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eSBtYXRyaXgKKyAg
ICAvLyBUcmltbWFibGUgd2hpdGVzcGFjZSBpcyBhbHdheXMgY29sbGFwc2libGUgc28gdGhlIGxl
bmd0aCBvZiB0aGUgdHJhaWxpbmcgdHJpbW1hYmxlIHdoaXRlc3BhY2UgaXMgYWx3YXlzIDEgKG9y
IG5vbi1leGlzdGVudCkuCisgICAgQVNTRVJUKG1fdGV4dENvbnRlbnQtPmxlbmd0aCgpKTsKKyAg
ICBjb25zdGV4cHIgc2l6ZV90IHRyYWlsaW5nVHJpbW1hYmxlQ29udGVudExlbmd0aCA9IDE7Cisg
ICAgbV90ZXh0Q29udGVudC0+c2hyaW5rKHRyYWlsaW5nVHJpbW1hYmxlQ29udGVudExlbmd0aCk7
CisgICAgdmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgpOworfQorCit2b2lkIExp
bmU6OlJ1bjo6dmlzdWFsbHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgpCit7CisgICAgLy8g
VGhpcyBpcyBqdXN0IGEgdmlzdWFsIGFkanVzdG1lbnQsIHRoZSB0ZXh0IGxlbmd0aCBzaG91bGQg
cmVtYWluIHRoZSBzYW1lLgorICAgIHNocmlua0hvcml6b250YWxseShtX3RyYWlsaW5nV2hpdGVz
cGFjZVdpZHRoKTsKKyAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoID0geyB9OworICAgIG1f
dHJhaWxpbmdXaGl0ZXNwYWNlVHlwZSA9IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm9uZTsKKworICAg
IGlmIChtX3doaXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9ydHVuaXR5KSB7CisgICAgICAgIEFTU0VS
VChtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQpOworICAgICAgICBtX2V4cGFuc2lvbk9wcG9y
dHVuaXR5Q291bnQtLTsKKyAgICB9CisgICAgc2V0RXhwYW5zaW9uQmVoYXZpb3IoQWxsb3dMZWZ0
RXhwYW5zaW9uIHwgQWxsb3dSaWdodEV4cGFuc2lvbik7Cit9CisKK3ZvaWQgTGluZTo6UnVuOjpz
ZXRFeHBhbnNpb25CZWhhdmlvcihFeHBhbnNpb25CZWhhdmlvciBleHBhbnNpb25CZWhhdmlvcikK
K3sKKyAgICBBU1NFUlQoaXNUZXh0KCkpOworICAgIG1fZXhwYW5zaW9uLmJlaGF2aW9yID0gZXhw
YW5zaW9uQmVoYXZpb3I7Cit9CisKK0V4cGFuc2lvbkJlaGF2aW9yIExpbmU6OlJ1bjo6ZXhwYW5z
aW9uQmVoYXZpb3IoKSBjb25zdAoreworICAgIEFTU0VSVChpc1RleHQoKSk7CisgICAgcmV0dXJu
IG1fZXhwYW5zaW9uLmJlaGF2aW9yOworfQorCit2b2lkIExpbmU6OlJ1bjo6c2V0SG9yaXpvbnRh
bEV4cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxFeHBhbnNpb24pCit7CisgICAgQVNT
RVJUKGlzVGV4dCgpKTsKKyAgICBBU1NFUlQoaGFzRXhwYW5zaW9uT3Bwb3J0dW5pdHkoKSk7Cisg
ICAgbV9leHBhbnNpb24uaG9yaXpvbnRhbEV4cGFuc2lvbiA9IGxvZ2ljYWxFeHBhbnNpb247Cit9
CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVMaW5lLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVMaW5lLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZmUz
MzUxOTUyMWFhOWU0Zjk2YTc5MzRhZWQ4YzAzMmNjOWU3OTNmNQotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL0lubGluZUxp
bmUuaApAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVJdGVt
LmgiCisjaW5jbHVkZSAiSW5saW5lTGluZVJ1bi5oIgorI2luY2x1ZGUgIklubGluZVRleHRJdGVt
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKK2NsYXNzIElubGluZVNvZnRMaW5lQnJlYWtJdGVtOwor
CitjbGFzcyBMaW5lIHsKK3B1YmxpYzoKKyAgICBMaW5lKGNvbnN0IElubGluZUZvcm1hdHRpbmdD
b250ZXh0Jik7CisgICAgfkxpbmUoKTsKKworICAgIHZvaWQgaW5pdGlhbGl6ZSgpOworCisgICAg
dm9pZCBhcHBlbmQoY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdp
ZHRoKTsKKworICAgIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCgpIGNvbnN0
IHsgcmV0dXJuIG1fY29udGVudExvZ2ljYWxXaWR0aDsgfQorICAgIElubGluZUxheW91dFVuaXQg
Y29udGVudExvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fcnVucy5pc0VtcHR5KCkgPyAw
LjBmIDogbV9ydW5zLmxhc3QoKS5sb2dpY2FsUmlnaHQoKTsgfQorICAgIHNpemVfdCBub25TcGFu
bmluZ0lubGluZUxldmVsQm94Q291bnQoKSBjb25zdCB7IHJldHVybiBtX25vblNwYW5uaW5nSW5s
aW5lTGV2ZWxCb3hDb3VudDsgfQorCisgICAgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVUcmFp
bGluZ1dpZHRoKCkgY29uc3QgeyByZXR1cm4gbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQud2lk
dGgoKTsgfQorICAgIGJvb2wgaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxlKCkgY29uc3QgeyBy
ZXR1cm4gbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1h
YmxlKCk7IH0KKworICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHRyYWlsaW5nU29mdEh5
cGhlbldpZHRoKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aDsgfQor
ICAgIHZvaWQgYWRkVHJhaWxpbmdIeXBoZW4oSW5saW5lTGF5b3V0VW5pdCBoeXBoZW5Mb2dpY2Fs
V2lkdGgpOworCisgICAgdm9pZCByZW1vdmVDb2xsYXBzaWJsZUNvbnRlbnQoSW5saW5lTGF5b3V0
VW5pdCBleHRyYUhvcml6b250YWxTcGFjZSk7CisgICAgdm9pZCBhcHBseVJ1bkV4cGFuc2lvbihJ
bmxpbmVMYXlvdXRVbml0IGV4dHJhSG9yaXpvbnRhbFNwYWNlKTsKKworICAgIHN0cnVjdCBSdW4g
eworICAgICAgICBib29sIGlzVGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJ
dGVtOjpUeXBlOjpUZXh0OyB9CisgICAgICAgIGJvb2wgaXNCb3goKSBjb25zdCB7IHJldHVybiBt
X3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6Qm94OyB9CisgICAgICAgIGJvb2wgaXNMaW5lQnJl
YWsoKSBjb25zdCB7IHJldHVybiBpc0hhcmRMaW5lQnJlYWsoKSB8fCBpc1NvZnRMaW5lQnJlYWso
KTsgfQorICAgICAgICBib29sIGlzU29mdExpbmVCcmVhaygpIGNvbnN0ICB7IHJldHVybiBtX3R5
cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6U29mdExpbmVCcmVhazsgfQorICAgICAgICBib29sIGlz
SGFyZExpbmVCcmVhaygpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpUeXBl
OjpIYXJkTGluZUJyZWFrOyB9CisgICAgICAgIGJvb2wgaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgp
IGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpUeXBlOjpXb3JkQnJlYWtPcHBv
cnR1bml0eTsgfQorICAgICAgICBib29sIGlzSW5saW5lQm94U3RhcnQoKSBjb25zdCB7IHJldHVy
biBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94U3RhcnQ7IH0KKyAgICAgICAg
Ym9vbCBpc0lubGluZUJveEVuZCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVt
OjpUeXBlOjpJbmxpbmVCb3hFbmQ7IH0KKworICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgp
IGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQorICAgICAgICBjb25zdCBSZW5kZXJTdHls
ZSYgc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2xheW91dEJveC0+c3R5bGUoKTsgfQorICAgICAg
ICBjb25zdCBPcHRpb25hbDxMaW5lUnVuOjpUZXh0PiYgdGV4dENvbnRlbnQoKSBjb25zdCB7IHJl
dHVybiBtX3RleHRDb250ZW50OyB9CisKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2Fs
V2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxXaWR0aDsgfQorICAgICAgICBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxMZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsTGVmdDsgfQor
ICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxv
Z2ljYWxMZWZ0KCkgKyBsb2dpY2FsV2lkdGgoKTsgfQorCisgICAgICAgIGNvbnN0IExpbmVSdW46
OkV4cGFuc2lvbiYgZXhwYW5zaW9uKCkgY29uc3QgeyByZXR1cm4gbV9leHBhbnNpb247IH0KKyAg
ICAgICAgYm9vbCBoYXNFeHBhbnNpb25PcHBvcnR1bml0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhw
YW5zaW9uT3Bwb3J0dW5pdHlDb3VudDsgfQorICAgICAgICBFeHBhbnNpb25CZWhhdmlvciBleHBh
bnNpb25CZWhhdmlvcigpIGNvbnN0OworICAgICAgICB1bnNpZ25lZCBleHBhbnNpb25PcHBvcnR1
bml0eUNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9leHBhbnNpb25PcHBvcnR1bml0eUNvdW50OyB9
CisKKyAgICAgICAgYm9vbCBoYXNUcmFpbGluZ1doaXRlc3BhY2UoKSBjb25zdCB7IHJldHVybiBt
X3RyYWlsaW5nV2hpdGVzcGFjZVR5cGUgIT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25lOyB9Cisg
ICAgICAgIElubGluZUxheW91dFVuaXQgdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoKSBjb25zdCB7
IHJldHVybiBtX3RyYWlsaW5nV2hpdGVzcGFjZVdpZHRoOyB9CisKKyAgICBwcml2YXRlOgorICAg
ICAgICBmcmllbmQgY2xhc3MgTGluZTsKKworICAgICAgICBSdW4oY29uc3QgSW5saW5lVGV4dEl0
ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxXaWR0aCk7CisgICAgICAgIFJ1bihjb25zdCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSYsIElu
bGluZUxheW91dFVuaXQgbG9naWNhbExlZnQpOworICAgICAgICBSdW4oY29uc3QgSW5saW5lSXRl
bSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQgbG9naWNh
bFdpZHRoKTsKKworICAgICAgICB2b2lkIGV4cGFuZChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIElu
bGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICAgICAgdm9pZCBtb3ZlSG9yaXpvbnRh
bGx5KElubGluZUxheW91dFVuaXQgb2Zmc2V0KSB7IG1fbG9naWNhbExlZnQgKz0gb2Zmc2V0OyB9
CisgICAgICAgIHZvaWQgc2hyaW5rSG9yaXpvbnRhbGx5KElubGluZUxheW91dFVuaXQgd2lkdGgp
IHsgbV9sb2dpY2FsV2lkdGggLT0gd2lkdGg7IH0KKyAgICAgICAgdm9pZCBzZXRFeHBhbnNpb25C
ZWhhdmlvcihFeHBhbnNpb25CZWhhdmlvcik7CisgICAgICAgIHZvaWQgc2V0SG9yaXpvbnRhbEV4
cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxFeHBhbnNpb24pOworICAgICAgICB2b2lk
IHNldE5lZWRzSHlwaGVuKElubGluZUxheW91dFVuaXQgaHlwaGVuTG9naWNhbFdpZHRoKTsKKwor
ICAgICAgICBlbnVtIGNsYXNzIFRyYWlsaW5nV2hpdGVzcGFjZSB7CisgICAgICAgICAgICBOb25l
LAorICAgICAgICAgICAgTm90Q29sbGFwc2libGUsCisgICAgICAgICAgICBDb2xsYXBzaWJsZSwK
KyAgICAgICAgICAgIENvbGxhcHNlZAorICAgICAgICB9OworICAgICAgICBib29sIGhhc0NvbGxh
cHNpYmxlVHJhaWxpbmdXaGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRl
c3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Q29sbGFwc2libGUgfHwgaGFzQ29sbGFw
c2VkVHJhaWxpbmdXaGl0ZXNwYWNlKCk7IH0KKyAgICAgICAgYm9vbCBoYXNDb2xsYXBzZWRUcmFp
bGluZ1doaXRlc3BhY2UoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nV2hpdGVzcGFjZVR5cGUg
PT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpDb2xsYXBzZWQ7IH0KKyAgICAgICAgVHJhaWxpbmdXaGl0
ZXNwYWNlIHRyYWlsaW5nV2hpdGVzcGFjZVR5cGUoY29uc3QgSW5saW5lVGV4dEl0ZW0mKSBjb25z
dDsKKyAgICAgICAgdm9pZCByZW1vdmVUcmFpbGluZ1doaXRlc3BhY2UoKTsKKyAgICAgICAgdm9p
ZCB2aXN1YWxseUNvbGxhcHNlVHJhaWxpbmdXaGl0ZXNwYWNlKCk7CisKKyAgICAgICAgYm9vbCBo
YXNUcmFpbGluZ0xldHRlclNwYWNpbmcoKSBjb25zdDsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5p
dCB0cmFpbGluZ0xldHRlclNwYWNpbmcoKSBjb25zdDsKKyAgICAgICAgdm9pZCByZW1vdmVUcmFp
bGluZ0xldHRlclNwYWNpbmcoKTsKKworICAgICAgICBJbmxpbmVJdGVtOjpUeXBlIG1fdHlwZSB7
IElubGluZUl0ZW06OlR5cGU6OlRleHQgfTsKKyAgICAgICAgY29uc3QgQm94KiBtX2xheW91dEJv
eCB7IG51bGxwdHIgfTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2xvZ2ljYWxMZWZ0IHsg
MCB9OworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1fbG9naWNhbFdpZHRoIHsgMCB9OworICAg
ICAgICBib29sIG1fd2hpdGVzcGFjZUlzRXhwYW5zaW9uT3Bwb3J0dW5pdHkgeyBmYWxzZSB9Owor
ICAgICAgICBUcmFpbGluZ1doaXRlc3BhY2UgbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlIHsgVHJh
aWxpbmdXaGl0ZXNwYWNlOjpOb25lIH07CisgICAgICAgIElubGluZUxheW91dFVuaXQgbV90cmFp
bGluZ1doaXRlc3BhY2VXaWR0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8TGluZVJ1bjo6VGV4
dD4gbV90ZXh0Q29udGVudDsKKyAgICAgICAgTGluZVJ1bjo6RXhwYW5zaW9uIG1fZXhwYW5zaW9u
OworICAgICAgICB1bnNpZ25lZCBtX2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQgeyAwIH07Cisg
ICAgfTsKKyAgICB1c2luZyBSdW5MaXN0ID0gVmVjdG9yPFJ1biwgMTA+OworICAgIGNvbnN0IFJ1
bkxpc3QmIHJ1bnMoKSBjb25zdCB7IHJldHVybiBtX3J1bnM7IH0KKworcHJpdmF0ZToKKyAgICB2
b2lkIGFwcGVuZE5vbkJyZWFrYWJsZVNwYWNlKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7CisgICAg
dm9pZCBhcHBlbmRUZXh0Q29udGVudChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIElubGluZUxheW91
dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICB2b2lkIGFwcGVuZE5vblJlcGxhY2VkSW5saW5lTGV2
ZWxCb3goY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNh
bFdpZHRoKTsKKyAgICB2b2lkIGFwcGVuZFJlcGxhY2VkSW5saW5lTGV2ZWxCb3goY29uc3QgSW5s
aW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKTsKKyAgICB2
b2lkIGFwcGVuZElubGluZUJveFN0YXJ0KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxXaWR0aCk7CisgICAgdm9pZCBhcHBlbmRJbmxpbmVCb3hFbmQoY29uc3QgSW5s
aW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKKyAgICB2b2lkIGFwcGVu
ZExpbmVCcmVhayhjb25zdCBJbmxpbmVJdGVtJik7CisgICAgdm9pZCBhcHBlbmRXb3JkQnJlYWtP
cHBvcnR1bml0eShjb25zdCBJbmxpbmVJdGVtJik7CisKKyAgICB2b2lkIHJlbW92ZVRyYWlsaW5n
VHJpbW1hYmxlQ29udGVudCgpOworICAgIHZvaWQgdmlzdWFsbHlDb2xsYXBzZVByZVdyYXBPdmVy
Zmxvd0NvbnRlbnQoSW5saW5lTGF5b3V0VW5pdCBleHRyYUhvcml6b250YWxTcGFjZSk7CisKKyAg
ICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25z
dDsKKworICAgIHN0cnVjdCBUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQgeworICAgICAgICBUcmlt
bWFibGVUcmFpbGluZ0NvbnRlbnQoUnVuTGlzdCYpOworCisgICAgICAgIHZvaWQgYWRkRnVsbHlU
cmltbWFibGVDb250ZW50KHNpemVfdCBydW5JbmRleCwgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFi
bGVXaWR0aCk7CisgICAgICAgIHZvaWQgYWRkUGFydGlhbGx5VHJpbW1hYmxlQ29udGVudChzaXpl
X3QgcnVuSW5kZXgsIElubGluZUxheW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpOworICAgICAgICBJ
bmxpbmVMYXlvdXRVbml0IHJlbW92ZSgpOworICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHJlbW92
ZVBhcnRpYWxseVRyaW1tYWJsZUNvbnRlbnQoKTsKKworICAgICAgICBJbmxpbmVMYXlvdXRVbml0
IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9mdWxseVRyaW1tYWJsZVdpZHRoICsgbV9wYXJ0aWFs
bHlUcmltbWFibGVXaWR0aDsgfQorICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVy
biAhbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4Lmhhc1ZhbHVlKCk7IH0KKyAgICAgICAgYm9vbCBp
c1RyYWlsaW5nUnVuRnVsbHlUcmltbWFibGUoKSBjb25zdCB7IHJldHVybiBtX2hhc0Z1bGx5VHJp
bW1hYmxlQ29udGVudDsgfQorICAgICAgICBib29sIGlzVHJhaWxpbmdSdW5QYXJ0aWFsbHlUcmlt
bWFibGUoKSBjb25zdCB7IHJldHVybiBtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRoOyB9CisKKyAg
ICAgICAgdm9pZCByZXNldCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUnVuTGlzdCYgbV9y
dW5zOworICAgICAgICBPcHRpb25hbDxzaXplX3Q+IG1fZmlyc3RUcmltbWFibGVSdW5JbmRleDsK
KyAgICAgICAgYm9vbCBtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCB7IGZhbHNlIH07CisgICAg
ICAgIElubGluZUxheW91dFVuaXQgbV9mdWxseVRyaW1tYWJsZVdpZHRoIHsgMCB9OworICAgICAg
ICBJbmxpbmVMYXlvdXRVbml0IG1fcGFydGlhbGx5VHJpbW1hYmxlV2lkdGggeyAwIH07CisgICAg
fTsKKworICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBtX2lubGluZUZvcm1hdHRp
bmdDb250ZXh0OworICAgIFJ1bkxpc3QgbV9ydW5zOworICAgIFRyaW1tYWJsZVRyYWlsaW5nQ29u
dGVudCBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudDsKKyAgICBJbmxpbmVMYXlvdXRVbml0IG1f
Y29udGVudExvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICBzaXplX3QgbV9ub25TcGFubmluZ0lubGlu
ZUxldmVsQm94Q291bnQgeyAwIH07CisgICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gbV90
cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCB7IDAgfTsKK307CisKK2lubGluZSB2b2lkIExpbmU6OlRy
aW1tYWJsZVRyYWlsaW5nQ29udGVudDo6cmVzZXQoKQoreworICAgIG1faGFzRnVsbHlUcmltbWFi
bGVDb250ZW50ID0gZmFsc2U7CisgICAgbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4ID0geyB9Owor
ICAgIG1fZnVsbHlUcmltbWFibGVXaWR0aCA9IHsgfTsKKyAgICBtX3BhcnRpYWxseVRyaW1tYWJs
ZVdpZHRoID0geyB9OworfQorCitpbmxpbmUgTGluZTo6UnVuOjpUcmFpbGluZ1doaXRlc3BhY2Ug
TGluZTo6UnVuOjp0cmFpbGluZ1doaXRlc3BhY2VUeXBlKGNvbnN0IElubGluZVRleHRJdGVtJiBp
bmxpbmVUZXh0SXRlbSkgY29uc3QKK3sKKyAgICBpZiAoIWlubGluZVRleHRJdGVtLmlzV2hpdGVz
cGFjZSgpKQorICAgICAgICByZXR1cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25lOworICAgIGlm
IChJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJ
dGVtKSkKKyAgICAgICAgcmV0dXJuIFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm90Q29sbGFwc2libGU7
CisgICAgaWYgKGlubGluZVRleHRJdGVtLmxlbmd0aCgpID09IDEpCisgICAgICAgIHJldHVybiBU
cmFpbGluZ1doaXRlc3BhY2U6OkNvbGxhcHNpYmxlOworICAgIHJldHVybiBUcmFpbGluZ1doaXRl
c3BhY2U6OkNvbGxhcHNlZDsKK30KKworaW5saW5lIHZvaWQgTGluZTo6UnVuOjpzZXROZWVkc0h5
cGhlbihJbmxpbmVMYXlvdXRVbml0IGh5cGhlbkxvZ2ljYWxXaWR0aCkKK3sKKyAgICBBU1NFUlQo
bV90ZXh0Q29udGVudCk7CisgICAgbV90ZXh0Q29udGVudC0+c2V0TmVlZHNIeXBoZW4oKTsKKyAg
ICBtX2xvZ2ljYWxXaWR0aCArPSBoeXBoZW5Mb2dpY2FsV2lkdGg7Cit9CisKK30KK30KKyNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9p
bmxpbmUvSW5saW5lTGluZUJveC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGlu
Z0NvbnRleHRzL2lubGluZS9JbmxpbmVMaW5lQm94LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lZDIxM2FlMDFj
YWEzOTVhNzk4NDIxMThiOTk5NzIzMWU4ZDIwZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5lTGluZUJveC5j
cHAKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5H
X0NPTlRFWFQpCisKKyNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxh
eW91dENvbnRhaW5lckJveC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5
b3V0IHsKKworTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OklubGluZUxldmVsQm94KGNvbnN0IEJv
eCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRT
aXplIGxvZ2ljYWxTaXplLCBUeXBlIHR5cGUpCisgICAgOiBtX2xheW91dEJveChtYWtlV2Vha1B0
cihsYXlvdXRCb3gpKQorICAgICwgbV9sb2dpY2FsUmVjdCh7IH0sIGxvZ2ljYWxMZWZ0LCBsb2dp
Y2FsU2l6ZS53aWR0aCgpLCBsb2dpY2FsU2l6ZS5oZWlnaHQoKSkKKyAgICAsIG1fdHlwZSh0eXBl
KQoreworfQorCit2b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94OjpzZXRCYXNlbGluZShJbmxp
bmVMYXlvdXRVbml0IGJhc2VsaW5lKQoreworICAgIC8vIEZJWE1FOiBSZW1vdmUgbGVnYWN5IHJv
dW5kaW5nLgorICAgIG1fYmFzZWxpbmUgPSByb3VuZFRvSW50KGJhc2VsaW5lKTsKK30KKwordm9p
ZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0RGVzY2VudChJbmxpbmVMYXlvdXRVbml0IGRl
c2NlbnQpCit7CisgICAgLy8gRklYTUU6IFJlbW92ZSBsZWdhY3kgcm91bmRpbmcuCisgICAgbV9k
ZXNjZW50ID0gcm91bmRUb0ludChkZXNjZW50KTsKK30KKwordm9pZCBMaW5lQm94OjpJbmxpbmVM
ZXZlbEJveDo6c2V0TGF5b3V0Qm91bmRzKGNvbnN0IExheW91dEJvdW5kcyYgbGF5b3V0Qm91bmRz
KQoreworICAgIC8vIEZJWE1FOiBSZW1vdmUgbGVnYWN5IHJvdW5kaW5nLgorICAgIG1fbGF5b3V0
Qm91bmRzID0geyBJbmxpbmVMYXlvdXRVbml0KHJvdW5kVG9JbnQobGF5b3V0Qm91bmRzLmFzY2Vu
dCkpLCBJbmxpbmVMYXlvdXRVbml0KHJvdW5kVG9JbnQobGF5b3V0Qm91bmRzLmRlc2NlbnQpKSB9
OworfQorCit2b2lkIExpbmVCb3g6OklubGluZUxldmVsQm94OjpzZXRMb2dpY2FsVG9wKElubGlu
ZUxheW91dFVuaXQgbG9naWNhbFRvcCkKK3sKKyAgICAvLyBGSVhNRTogUmVtb3ZlIGxlZ2FjeSBy
b3VuZGluZy4KKyAgICBtX2xvZ2ljYWxSZWN0LnNldFRvcChyb3VuZFRvSW50KGxvZ2ljYWxUb3Ap
KTsKK30KKwordm9pZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0TG9naWNhbEhlaWdodChJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQpCit7CisgICAgLy8gRklYTUU6IFJlbW92ZSBs
ZWdhY3kgcm91bmRpbmcuCisgICAgbV9sb2dpY2FsUmVjdC5zZXRIZWlnaHQocm91bmRUb0ludChs
b2dpY2FsSGVpZ2h0KSk7Cit9CisKK3ZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldEhh
c0NvbnRlbnQoKQoreworICAgIEFTU0VSVChpc0lubGluZUJveCgpKTsKKyAgICBtX2hhc0NvbnRl
bnQgPSB0cnVlOworfQorCitib29sIExpbmVCb3g6OklubGluZUxldmVsQm94OjpoYXNMaW5lQm94
UmVsYXRpdmVBbGlnbm1lbnQoKSBjb25zdAoreworICAgIGF1dG8gdmVydGljYWxBbGlnbm1lbnQg
PSBsYXlvdXRCb3goKS5zdHlsZSgpLnZlcnRpY2FsQWxpZ24oKTsKKyAgICByZXR1cm4gdmVydGlj
YWxBbGlnbm1lbnQgPT0gVmVydGljYWxBbGlnbjo6VG9wIHx8IHZlcnRpY2FsQWxpZ25tZW50ID09
IFZlcnRpY2FsQWxpZ246OkJvdHRvbTsKK30KKworTGluZUJveDo6TGluZUJveChjb25zdCBCb3gm
IHJvb3RMYXlvdXRCb3gsIGNvbnN0IElubGluZUxheW91dFBvaW50JiBsb2dpY2FsVG9wbGVmdCwg
SW5saW5lTGF5b3V0VW5pdCBsaW5lTG9naWNhbFdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRl
bnRMb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoLCBzaXpl
X3Qgbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50KQorICAgIDogbV9sb2dpY2FsUmVjdChs
b2dpY2FsVG9wbGVmdCwgSW5saW5lTGF5b3V0U2l6ZSB7IGxpbmVMb2dpY2FsV2lkdGgsIHsgfSB9
KQorICAgICwgbV9jb250ZW50TG9naWNhbFdpZHRoKGNvbnRlbnRMb2dpY2FsV2lkdGgpCisgICAg
LCBtX3Jvb3RJbmxpbmVCb3gocm9vdExheW91dEJveCwgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxp
bmVMYXlvdXRTaXplIHsgY29udGVudExvZ2ljYWxXaWR0aCwgeyB9IH0sIElubGluZUxldmVsQm94
OjpUeXBlOjpSb290SW5saW5lQm94KQoreworICAgIG1fbm9uUm9vdElubGluZUxldmVsQm94TGlz
dC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCk7
CisgICAgbV9ub25Sb290SW5saW5lTGV2ZWxCb3hNYXAucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShu
b25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQpOworfQorCit2b2lkIExpbmVCb3g6OmFkZElu
bGluZUxldmVsQm94KElubGluZUxldmVsQm94JiYgaW5saW5lTGV2ZWxCb3gpCit7CisgICAgbV9i
b3hUeXBlcy5hZGQoaW5saW5lTGV2ZWxCb3gudHlwZSgpKTsKKyAgICBtX25vblJvb3RJbmxpbmVM
ZXZlbEJveE1hcC5zZXQoJmlubGluZUxldmVsQm94LmxheW91dEJveCgpLCBtX25vblJvb3RJbmxp
bmVMZXZlbEJveExpc3Quc2l6ZSgpKTsKKyAgICBtX25vblJvb3RJbmxpbmVMZXZlbEJveExpc3Qu
YXBwZW5kKFdURk1vdmUoaW5saW5lTGV2ZWxCb3gpKTsKK30KKworSW5saW5lUmVjdCBMaW5lQm94
Ojpsb2dpY2FsUmVjdEZvclRleHRSdW4oY29uc3QgTGluZTo6UnVuJiBydW4pIGNvbnN0Cit7Cisg
ICAgQVNTRVJUKHJ1bi5pc1RleHQoKSB8fCBydW4uaXNTb2Z0TGluZUJyZWFrKCkpOworICAgIGF1
dG8qIHBhcmVudElubGluZUJveCA9ICZpbmxpbmVMZXZlbEJveEZvckxheW91dEJveChydW4ubGF5
b3V0Qm94KCkucGFyZW50KCkpOworICAgIEFTU0VSVChwYXJlbnRJbmxpbmVCb3gtPmlzSW5saW5l
Qm94KCkpOworICAgIGF1dG8mIGZvbnRNZXRyaWNzID0gcGFyZW50SW5saW5lQm94LT5zdHlsZSgp
LmZvbnRNZXRyaWNzKCk7CisgICAgYXV0byBydW5sb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94
LT5sb2dpY2FsVG9wKCkgKyBwYXJlbnRJbmxpbmVCb3gtPmJhc2VsaW5lKCkgLSBmb250TWV0cmlj
cy5hc2NlbnQoKTsKKworICAgIHdoaWxlIChwYXJlbnRJbmxpbmVCb3ggIT0gJm1fcm9vdElubGlu
ZUJveCAmJiAhcGFyZW50SW5saW5lQm94LT5oYXNMaW5lQm94UmVsYXRpdmVBbGlnbm1lbnQoKSkg
eworICAgICAgICBwYXJlbnRJbmxpbmVCb3ggPSAmaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3go
cGFyZW50SW5saW5lQm94LT5sYXlvdXRCb3goKS5wYXJlbnQoKSk7CisgICAgICAgIEFTU0VSVChw
YXJlbnRJbmxpbmVCb3gtPmlzSW5saW5lQm94KCkpOworICAgICAgICBydW5sb2dpY2FsVG9wICs9
IHBhcmVudElubGluZUJveC0+bG9naWNhbFRvcCgpOworICAgIH0KKyAgICBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxIZWlnaHQgPSBmb250TWV0cmljcy5oZWlnaHQoKTsKKyAgICByZXR1cm4geyBy
dW5sb2dpY2FsVG9wLCBtX3Jvb3RJbmxpbmVCb3gubG9naWNhbExlZnQoKSArIHJ1bi5sb2dpY2Fs
TGVmdCgpLCBydW4ubG9naWNhbFdpZHRoKCksIGxvZ2ljYWxIZWlnaHQgfTsKK30KKworSW5saW5l
UmVjdCBMaW5lQm94Ojpsb2dpY2FsUmVjdEZvckxpbmVCcmVha0JveChjb25zdCBCb3gmIGxheW91
dEJveCkgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzTGluZUJyZWFrQm94KCkpOwor
ICAgIHJldHVybiBsb2dpY2FsUmVjdEZvcklubGluZUxldmVsQm94KGxheW91dEJveCk7Cit9CisK
K0lubGluZVJlY3QgTGluZUJveDo6bG9naWNhbFJlY3RGb3JJbmxpbmVMZXZlbEJveChjb25zdCBC
b3gmIGxheW91dEJveCkgY29uc3QKK3sKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzSW5saW5lTGV2
ZWxCb3goKSB8fCBsYXlvdXRCb3guaXNMaW5lQnJlYWtCb3goKSk7CisgICAgLy8gSW5saW5lIGxl
dmVsIGJveGVzIGFyZSByZWxhdGl2ZSB0byB0aGVpciBwYXJlbnQgdW5sZXNzIHRoZSB2ZXJ0aWNh
bCBhbGlnbm1lbnQgbWFrZXMgdGhlbSByZWxhdGl2ZSB0byB0aGUgbGluZSBib3ggKGUuZy4gdG9w
LCBib3R0b20pLgorICAgIGF1dG8qIGlubGluZUJveCA9ICZpbmxpbmVMZXZlbEJveEZvckxheW91
dEJveChsYXlvdXRCb3gpOworICAgIGF1dG8gaW5saW5lQm94TG9naWNhbFJlY3QgPSBpbmxpbmVC
b3gtPmxvZ2ljYWxSZWN0KCk7CisgICAgaWYgKGlubGluZUJveC0+aGFzTGluZUJveFJlbGF0aXZl
QWxpZ25tZW50KCkpCisgICAgICAgIHJldHVybiBpbmxpbmVCb3hMb2dpY2FsUmVjdDsKKworICAg
IC8vIEZhc3QgcGF0aCBmb3IgaW5saW5lIGxldmVsIGJveGVzIG9uIHRoZSByb290IGlubGluZSBi
b3ggKGUuZyA8ZGl2PjxpbWc+PC9kaXY+KS4KKyAgICBpZiAoJmxheW91dEJveC5wYXJlbnQoKSA9
PSAmbV9yb290SW5saW5lQm94LmxheW91dEJveCgpKSB7CisgICAgICAgIGlubGluZUJveExvZ2lj
YWxSZWN0Lm1vdmVWZXJ0aWNhbGx5KG1fcm9vdElubGluZUJveC5sb2dpY2FsVG9wKCkpOworICAg
ICAgICByZXR1cm4gaW5saW5lQm94TG9naWNhbFJlY3Q7CisgICAgfQorCisgICAgLy8gZS5nIDxk
aXY+PHNwYW4+PGltZz48L3NwYW4+PC9kaXY+CisgICAgYXV0byBpbmxpbmVCb3hBYnNvbHV0ZWxv
Z2ljYWxUb3AgPSBpbmxpbmVCb3hMb2dpY2FsUmVjdC50b3AoKTsKKyAgICB3aGlsZSAoaW5saW5l
Qm94ICE9ICZtX3Jvb3RJbmxpbmVCb3ggJiYgIWlubGluZUJveC0+aGFzTGluZUJveFJlbGF0aXZl
QWxpZ25tZW50KCkpIHsKKyAgICAgICAgaW5saW5lQm94ID0gJmlubGluZUxldmVsQm94Rm9yTGF5
b3V0Qm94KGlubGluZUJveC0+bGF5b3V0Qm94KCkucGFyZW50KCkpOworICAgICAgICBBU1NFUlQo
aW5saW5lQm94LT5pc0lubGluZUJveCgpKTsKKyAgICAgICAgaW5saW5lQm94QWJzb2x1dGVsb2dp
Y2FsVG9wICs9IGlubGluZUJveC0+bG9naWNhbFRvcCgpOworICAgIH0KKyAgICByZXR1cm4gSW5s
aW5lUmVjdCB7IGlubGluZUJveEFic29sdXRlbG9naWNhbFRvcCwgaW5saW5lQm94TG9naWNhbFJl
Y3QubGVmdCgpLCBpbmxpbmVCb3hMb2dpY2FsUmVjdC53aWR0aCgpLCBpbmxpbmVCb3hMb2dpY2Fs
UmVjdC5oZWlnaHQoKSB9OworfQorCitJbmxpbmVSZWN0IExpbmVCb3g6OmxvZ2ljYWxCb3JkZXJC
b3hGb3JBdG9taWNJbmxpbmVMZXZlbEJveChjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQm94
R2VvbWV0cnkmIGJveEdlb21ldHJ5KSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNB
dG9taWNJbmxpbmVMZXZlbEJveCgpKTsKKyAgICBhdXRvIGxvZ2ljYWxSZWN0ID0gbG9naWNhbFJl
Y3RGb3JJbmxpbmVMZXZlbEJveChsYXlvdXRCb3gpOworICAgIC8vIElubGluZSBsZXZlbCBib3hl
cyB1c2UgdGhlaXIgbWFyZ2luIGJveCBmb3IgdmVydGljYWwgYWxpZ25tZW50LiBMZXQncyBjb3Zl
cnQgdGhlbSB0byBib3JkZXIgYm94ZXMuCisgICAgbG9naWNhbFJlY3QubW92ZVZlcnRpY2FsbHko
Ym94R2VvbWV0cnkubWFyZ2luQmVmb3JlKCkpOworICAgIGF1dG8gdmVydGljYWxNYXJnaW4gPSBi
b3hHZW9tZXRyeS5tYXJnaW5CZWZvcmUoKSArIGJveEdlb21ldHJ5Lm1hcmdpbkFmdGVyKCk7Cisg
ICAgbG9naWNhbFJlY3QuZXhwYW5kVmVydGljYWxseSgtdmVydGljYWxNYXJnaW4pOworICAgIHJl
dHVybiBsb2dpY2FsUmVjdDsKK30KKworSW5saW5lUmVjdCBMaW5lQm94Ojpsb2dpY2FsQm9yZGVy
Qm94Rm9ySW5saW5lQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBCb3hHZW9tZXRyeSYg
Ym94R2VvbWV0cnkpIGNvbnN0Cit7CisgICAgYXV0byBsb2dpY2FsUmVjdCA9IGxvZ2ljYWxSZWN0
Rm9ySW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94KTsKKyAgICAvLyBUaGlzIGxvZ2ljYWwgcmVjdCBp
cyBhcyB0YWxsIGFzIHRoZSAidGV4dCIgY29udGVudCBpcy4gTGV0J3MgYWRqdXN0IHdpdGggdmVy
dGljYWwgYm9yZGVyIGFuZCBwYWRkaW5nLgorICAgIGF1dG8gdmVydGljYWxCb3JkZXJBbmRQYWRk
aW5nID0gYm94R2VvbWV0cnkudmVydGljYWxCb3JkZXIoKSArIGJveEdlb21ldHJ5LnZlcnRpY2Fs
UGFkZGluZygpLnZhbHVlT3IoMF9sdSk7CisgICAgbG9naWNhbFJlY3QuZXhwYW5kVmVydGljYWxs
eSh2ZXJ0aWNhbEJvcmRlckFuZFBhZGRpbmcpOworICAgIGxvZ2ljYWxSZWN0Lm1vdmVWZXJ0aWNh
bGx5KC0oYm94R2VvbWV0cnkuYm9yZGVyVG9wKCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nVG9wKCku
dmFsdWVPcigwX2x1KSkpOworICAgIHJldHVybiBsb2dpY2FsUmVjdDsKK30KKworfSAvLyBuYW1l
c3BhY2UgTGF5b3V0Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5l
TGluZUJveC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxp
bmUvSW5saW5lTGluZUJveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjY5MmU5NjYzODM4ZWQzMmE4ZGRiMTliNWZl
YWQyNDY5Nzk5ZjFjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVMaW5lQm94LmgKQEAgLTAsMCArMSwyMTUg
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
dHMvaW5saW5lL0lubGluZUxpbmVCdWlsZGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL0lubGluZUxpbmVCdWlsZGVyLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li42YzYyNmVhMGVlNWE2M2E0YTk2MmIxNTVjZTYxMDY1MzBmY2UyMmYyCi0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5s
aW5lTGluZUJ1aWxkZXIuY3BwCkBAIC0wLDAgKzEsODU3IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklubGluZUxpbmVCdWlsZGVyLmgiCisKKyNpZiBFTkFC
TEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4
dC5oIgorI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdDb250ZXh0LmgiCisjaW5jbHVkZSAiTGF5
b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKKyNpbmNsdWRlICJMYXlv
dXRTdGF0ZS5oIgorI2luY2x1ZGUgIlRleHRVdGlsLmgiCisjaW5jbHVkZSA8d3RmL3VuaWNvZGUv
Q2hhcmFjdGVyTmFtZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91
dCB7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBlbmRzV2l0aFNvZnRXcmFwT3Bwb3J0dW5pdHkoY29u
c3QgSW5saW5lVGV4dEl0ZW0mIGN1cnJlbnRUZXh0SXRlbSwgY29uc3QgSW5saW5lVGV4dEl0ZW0m
IG5leHRJbmxpbmVUZXh0SXRlbSkKK3sKKyAgICBBU1NFUlQoIW5leHRJbmxpbmVUZXh0SXRlbS5p
c1doaXRlc3BhY2UoKSk7CisgICAgLy8gV2UgYXJlIGF0IHRoZSBwb3NpdGlvbiBhZnRlciBhIHdo
aXRlc3BhY2UuCisgICAgaWYgKGN1cnJlbnRUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgLy8gV2hlbiBib3RoIHRoZXNlIG5vbi13aGl0ZXNwYWNlIHJ1
bnMgYmVsb25nIHRvIHRoZSBzYW1lIGxheW91dCBib3gsIGl0J3MgZ3VhcmFudGVlZCB0aGF0Cisg
ICAgLy8gdGhleSBhcmUgc3BsaXQgYXQgYSBzb2Z0IGJyZWFraW5nIG9wcG9ydHVuaXR5LiBTZWUg
SW5saW5lVGV4dEl0ZW06Om1vdmVUb05leHRCcmVha2FibGVQb3NpdGlvbi4KKyAgICBpZiAoJmN1
cnJlbnRUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkgPT0gJm5leHRJbmxpbmVUZXh0SXRlbS5pbmxp
bmVUZXh0Qm94KCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIC8vIE5vdyB3ZSBuZWVkIHRv
IGNvbGxlY3QgYXQgbGVhc3QgMyBhZGphY2VudCBjaGFyYWN0ZXJzIHRvIGJlIGFibGUgdG8gbWFr
ZSBhIGRlY2lzaW9uIHdoZXRoZXIgdGhlIHByZXZpb3VzIHRleHQgaXRlbSBlbmRzIHdpdGggYnJl
YWtpbmcgb3Bwb3J0dW5pdHkuCisgICAgLy8gW2V4LV1bYW1wbGVdIDwtIHNlY29uZCB0byBsYXN0
W3hdIGxhc3RbLV0gY3VycmVudFthXQorICAgIC8vIFdlIG5lZWQgYXQgbGVhc3QgMSBjaGFyYWN0
ZXIgaW4gdGhlIGN1cnJlbnQgaW5saW5lIHRleHQgaXRlbSBhbmQgMiBtb3JlIGZyb20gcHJldmlv
dXMgaW5saW5lIGl0ZW1zLgorICAgIGF1dG8gcHJldmlvdXNDb250ZW50ID0gY3VycmVudFRleHRJ
dGVtLmlubGluZVRleHRCb3goKS5jb250ZW50KCk7CisgICAgYXV0byBsaW5lQnJlYWtJdGVyYXRv
ciA9IExhenlMaW5lQnJlYWtJdGVyYXRvciB7IG5leHRJbmxpbmVUZXh0SXRlbS5pbmxpbmVUZXh0
Qm94KCkuY29udGVudCgpIH07CisgICAgYXV0byBwcmV2aW91c0NvbnRlbnRMZW5ndGggPSBwcmV2
aW91c0NvbnRlbnQubGVuZ3RoKCk7CisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBsb29rIGludG8g
dGhlIGVudGlyZSB1bmNvbW1pdHRlZCBjb250ZW50IGZvciBtb3JlIHRleHQgY29udGV4dC4KKyAg
ICBVQ2hhciBsYXN0Q2hhcmFjdGVyID0gcHJldmlvdXNDb250ZW50TGVuZ3RoID8gcHJldmlvdXND
b250ZW50W3ByZXZpb3VzQ29udGVudExlbmd0aCAtIDFdIDogMDsKKyAgICBpZiAobGFzdENoYXJh
Y3RlciA9PSBzb2Z0SHlwaGVuICYmIGN1cnJlbnRUZXh0SXRlbS5zdHlsZSgpLmh5cGhlbnMoKSA9
PSBIeXBoZW5zOjpOb25lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgVUNoYXIgc2Vjb25k
VG9MYXN0Q2hhcmFjdGVyID0gcHJldmlvdXNDb250ZW50TGVuZ3RoID4gMSA/IHByZXZpb3VzQ29u
dGVudFtwcmV2aW91c0NvbnRlbnRMZW5ndGggLSAyXSA6IDA7CisgICAgbGluZUJyZWFrSXRlcmF0
b3Iuc2V0UHJpb3JDb250ZXh0KGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rlcik7
CisgICAgLy8gTm93IGNoZWNrIGlmIHdlIGNhbiBicmVhayByaWdodCBhdCB0aGUgaW5saW5lIGl0
ZW0gYm91bmRhcnkuCisgICAgLy8gV2l0aCB0aGUgW2V4LWFtcGxlXSwgZmluZE5leHRCcmVha2Fi
bGVQb3NpdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBzdGFydFBvc2l0aW9uICgwKS4KKyAgICAvLyBG
SVhNRTogQ2hlY2sgaWYgdGhlcmUncyBhIG1vcmUgY29ycmVjdCB3YXkgb2YgZmluZGluZyBicmVh
a2luZyBvcHBvcnR1bml0aWVzLgorICAgIHJldHVybiAhVGV4dFV0aWw6OmZpbmROZXh0QnJlYWth
YmxlUG9zaXRpb24obGluZUJyZWFrSXRlcmF0b3IsIDAsIG5leHRJbmxpbmVUZXh0SXRlbS5zdHls
ZSgpKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzQXRTb2Z0V3JhcE9wcG9ydHVuaXR5KGNv
bnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCwgY29u
c3QgSW5saW5lSXRlbSYgY3VycmVudCwgY29uc3QgSW5saW5lSXRlbSYgbmV4dCkKK3sKKyAgICAv
LyAiaXMgYXQiIHNpbXBsZSBtZWFucyB0aGF0IHRoZXJlJ3MgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5p
dHkgcmlnaHQgYWZ0ZXIgdGhlIFtjdXJyZW50XS4KKyAgICAvLyBbdGV4dF1bIF1bdGV4dF1baW5s
aW5lIGJveCBzdGFydF0uLi4gKDxkaXY+dGV4dCBjb250ZW50PHNwYW4+Li48L2Rpdj4pCisgICAg
Ly8gc29mdCB3cmFwIGluZGV4ZXM6IDAgYW5kIDEgZGVmaW5pdGVseSwgMiBkZXBlbmRzIG9uIHRo
ZSBjb250ZW50IGFmdGVyIHRoZSBbaW5saW5lIGJveCBzdGFydF0uCisKKyAgICAvLyBodHRwczov
L2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jbGluZS1icmVhay1kZXRhaWxzCisgICAgLy8g
RmlndXJlIG91dCBpZiB0aGUgbmV3IGluY29taW5nIGNvbnRlbnQgcHV0cyB0aGUgdW5jb21taXR0
ZWQgY29udGVudCBvbiBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eS4KKyAgICAvLyBlLmcuIFtpbmxp
bmUgYm94IHN0YXJ0XVtwcmlvcl9jb250aW51b3VzX2NvbnRlbnRdW2lubGluZSBib3ggZW5kXSAo
PHNwYW4+cHJpb3JfY29udGludW91c19jb250ZW50PC9zcGFuPikKKyAgICAvLyBBbiBpbmNvbWlu
ZyA8aW1nPiBib3ggd291bGQgZW5hYmxlIHVzIHRvIGNvbW1pdCB0aGUgIjxzcGFuPnByaW9yX2Nv
bnRpbnVvdXNfY29udGVudDwvc3Bhbj4iIGNvbnRlbnQKKyAgICAvLyBidXQgYW4gaW5jb21pbmcg
dGV4dCBjb250ZW50IHdvdWxkIG5vdCBuZWNlc3NhcmlseS4KKyAgICBBU1NFUlQoY3VycmVudC5p
c1RleHQoKSB8fCBjdXJyZW50LmlzQm94KCkgfHwgY3VycmVudC5pc0Zsb2F0KCkpOworICAgIEFT
U0VSVChuZXh0LmlzVGV4dCgpIHx8IG5leHQuaXNCb3goKSB8fCBuZXh0LmlzRmxvYXQoKSk7Cisg
ICAgaWYgKGN1cnJlbnQuaXNUZXh0KCkgJiYgbmV4dC5pc1RleHQoKSkgeworICAgICAgICBhdXRv
JiBjdXJyZW50SW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4oY3VycmVu
dCk7CisgICAgICAgIGF1dG8mIG5leHRJbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRl
eHRJdGVtPihuZXh0KTsKKyAgICAgICAgaWYgKGN1cnJlbnRJbmxpbmVUZXh0SXRlbS5pc1doaXRl
c3BhY2UoKSkgeworICAgICAgICAgICAgLy8gWyBdW3RleHRdIDogYWZ0ZXIgW3doaXRlc3BhY2Vd
IHBvc2l0aW9uIGlzIGEgc29mdCB3cmFwIG9wcG9ydHVuaXR5LgorICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5leHRJbmxpbmVUZXh0SXRlbS5pc1doaXRl
c3BhY2UoKSkgeworICAgICAgICAgICAgLy8gW3RleHRdWyBdICg8c3Bhbj50ZXh0PC9zcGFuPiAp
CisgICAgICAgICAgICAvLyB3aGl0ZS1zcGFjZTogYnJlYWstc3BhY2VzOiBsaW5lIGJyZWFraW5n
IG9wcG9ydHVuaXR5IGV4aXN0cyBhZnRlciBldmVyeSBwcmVzZXJ2ZWQgd2hpdGUgc3BhY2UgY2hh
cmFjdGVyLCBidXQgbm90IGJlZm9yZS4KKyAgICAgICAgICAgIHJldHVybiBuZXh0SW5saW5lVGV4
dEl0ZW0uc3R5bGUoKS53aGl0ZVNwYWNlKCkgIT0gV2hpdGVTcGFjZTo6QnJlYWtTcGFjZXM7Cisg
ICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnQuc3R5bGUoKS5saW5lQnJlYWsoKSA9PSBMaW5l
QnJlYWs6OkFueXdoZXJlIHx8IG5leHQuc3R5bGUoKS5saW5lQnJlYWsoKSA9PSBMaW5lQnJlYWs6
OkFueXdoZXJlKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1
bml0eSBhcm91bmQgZXZlcnkgdHlwb2dyYXBoaWMgY2hhcmFjdGVyIHVuaXQsIGluY2x1ZGluZyBh
cm91bmQgYW55IHB1bmN0dWF0aW9uIGNoYXJhY3RlcgorICAgICAgICAgICAgLy8gb3IgcHJlc2Vy
dmVkIHdoaXRlIHNwYWNlcywgb3IgaW4gdGhlIG1pZGRsZSBvZiB3b3Jkcy4KKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC8vIEJvdGggY3VycmVudCBhbmQgbmV4
dCBpdGVtcyBhcmUgbm9uLXdoaXRlc3BhY2UgdGV4dC4KKyAgICAgICAgLy8gW3RleHRdW3RleHRd
IDogaXMgYSBjb250aW51b3VzIGNvbnRlbnQuCisgICAgICAgIC8vIFt0ZXh0LV1bdGV4dF0gOiBh
ZnRlciBbaHlwaGVuXSBwb3NpdGlvbiBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eS4KKyAgICAg
ICAgcmV0dXJuIGVuZHNXaXRoU29mdFdyYXBPcHBvcnR1bml0eShjdXJyZW50SW5saW5lVGV4dEl0
ZW0sIG5leHRJbmxpbmVUZXh0SXRlbSk7CisgICAgfQorICAgIGlmIChjdXJyZW50LmlzRmxvYXQo
KSB8fCBuZXh0LmlzRmxvYXQoKSkgeworICAgICAgICAvLyBXaGlsZSBmbG9hdHMgYXJlIG5vdCBw
YXJ0IG9mIHRoZSBpbmxpbmUgY29udGVudCBhbmQgdGhleSBhcmUgbm90IHN1cHBvc2VkIHRvIGlu
dHJvZHVjZSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdGllcywKKyAgICAgICAgLy8gZS5nLiBbdGV4dF1b
ZmxvYXQgYm94XVtmbG9hdCBib3hdW3RleHRdW2Zsb2F0IGJveF1bdGV4dF0gaXMgZXNzZW50aWFs
bHkganVzdCBbdGV4dF1bdGV4dF1bdGV4dF0KKyAgICAgICAgLy8gZmlndXJpbmcgb3V0IHdoZXRo
ZXIgYSBmbG9hdCAob3Igc2V0IG9mIGZsb2F0cykgc2hvdWxkIHN0YXkgb24gdGhlIGxpbmUgb3Ig
bm90IChhbmQgaGFuZGxlIHBvdGVudGlhbGx5IG91dCBvZiBvcmRlciBpbmxpbmUgaXRlbXMpCisg
ICAgICAgIC8vIGJyaW5ncyBpbiB1bm5lY2Vzc2FyeSBjb21wbGV4aXR5LgorICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGN1cnJlbnQuaXNCb3goKSB8fCBuZXh0LmlzQm94KCkp
IHsKKyAgICAgICAgYXV0byBpc0ltYWdlQ29udGVudCA9IGN1cnJlbnQubGF5b3V0Qm94KCkuaXNJ
bWFnZSgpIHx8IG5leHQubGF5b3V0Qm94KCkuaXNJbWFnZSgpOworICAgICAgICBpZiAoaXNJbWFn
ZUNvbnRlbnQpCisgICAgICAgICAgICByZXR1cm4gaW5saW5lRm9ybWF0dGluZ0NvbnRleHQucXVp
cmtzKCkuaGFzU29mdFdyYXBPcHBvcnR1bml0eUF0SW1hZ2UoKTsKKyAgICAgICAgLy8gW3RleHRd
W2lubGluZSBib3ggc3RhcnRdW2lubGluZSBib3ggZW5kXVtpbmxpbmUgYm94XSAodGV4dDxzcGFu
Pjwvc3Bhbj48aW1nPikgOiB0aGVyZSdzIGEgc29mdCB3cmFwIG9wcG9ydHVuaXR5IGJldHdlZW4g
dGhlIFt0ZXh0XSBhbmQgW2ltZ10uCisgICAgICAgIC8vIFRoZSBsaW5lIGJyZWFraW5nIGJlaGF2
aW9yIG9mIGEgcmVwbGFjZWQgZWxlbWVudCBvciBvdGhlciBhdG9taWMgaW5saW5lIGlzIGVxdWl2
YWxlbnQgdG8gYW4gaWRlb2dyYXBoaWMgY2hhcmFjdGVyLgorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K3N0cnVjdCBMaW5lQ2FuZGlkYXRlIHsKKyAgICBMaW5lQ2FuZGlkYXRlKGJvb2wgaWdub3JlVHJh
aWxpbmdMZXR0ZXJTcGFjaW5nKTsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHN0cnVjdCBJ
bmxpbmVDb250ZW50IHsKKyAgICAgICAgSW5saW5lQ29udGVudChib29sIGlnbm9yZVRyYWlsaW5n
TGV0dGVyU3BhY2luZyk7CisKKyAgICAgICAgY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNv
bnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1fY29u
dGludW91c0NvbnRlbnQ7IH0KKyAgICAgICAgY29uc3QgSW5saW5lSXRlbSogdHJhaWxpbmdMaW5l
QnJlYWsoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nTGluZUJyZWFrOyB9CisgICAgICAgIGNv
bnN0IElubGluZUl0ZW0qIHRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJl
dHVybiBtX3RyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHk7IH0KKworICAgICAgICB2b2lkIGFw
cGVuZElubGluZUl0ZW0oY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNh
bFdpZHRoKTsKKyAgICAgICAgdm9pZCBhcHBlbmRUcmFpbGluZ0xpbmVCcmVhayhjb25zdCBJbmxp
bmVJdGVtJiBsaW5lQnJlYWtJdGVtKSB7IG1fdHJhaWxpbmdMaW5lQnJlYWsgPSAmbGluZUJyZWFr
SXRlbTsgfQorICAgICAgICB2b2lkIGFwcGVuZHRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHko
Y29uc3QgSW5saW5lSXRlbSYgd29yZEJyZWFrSXRlbSkgeyBtX3RyYWlsaW5nV29yZEJyZWFrT3Bw
b3J0dW5pdHkgPSAmd29yZEJyZWFrSXRlbTsgfQorICAgICAgICB2b2lkIHJlc2V0KCk7CisgICAg
ICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGludW91c0NvbnRlbnQucnVu
cygpLmlzRW1wdHkoKSAmJiAhdHJhaWxpbmdXb3JkQnJlYWtPcHBvcnR1bml0eSgpICYmICF0cmFp
bGluZ0xpbmVCcmVhaygpOyB9CisgICAgICAgIGJvb2wgaGFzSW5saW5lTGV2ZWxCb3goKSBjb25z
dCB7IHJldHVybiBtX2hhc0lubGluZUxldmVsQm94OyB9CisKKyAgICAgICAgdm9pZCBzZXRIYXNU
cmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoYm9vbCBoYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0
dW5pdHkpIHsgbV9oYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkgPSBoYXNUcmFpbGluZ1Nv
ZnRXcmFwT3Bwb3J0dW5pdHk7IH0KKyAgICAgICAgYm9vbCBoYXNUcmFpbGluZ1NvZnRXcmFwT3Bw
b3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX2hhc1RyYWlsaW5nU29mdFdyYXBPcHBvcnR1bml0
eTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBtX2lnbm9yZVRyYWlsaW5nTGV0dGVy
U3BhY2luZyB7IGZhbHNlIH07CisKKyAgICAgICAgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRp
bnVvdXNDb250ZW50IG1fY29udGludW91c0NvbnRlbnQ7CisgICAgICAgIGNvbnN0IElubGluZUl0
ZW0qIG1fdHJhaWxpbmdMaW5lQnJlYWsgeyBudWxscHRyIH07CisgICAgICAgIGNvbnN0IElubGlu
ZUl0ZW0qIG1fdHJhaWxpbmdXb3JkQnJlYWtPcHBvcnR1bml0eSB7IG51bGxwdHIgfTsKKyAgICAg
ICAgYm9vbCBtX2hhc0lubGluZUxldmVsQm94IHsgZmFsc2UgfTsKKyAgICAgICAgYm9vbCBtX2hh
c1RyYWlsaW5nU29mdFdyYXBPcHBvcnR1bml0eSB7IGZhbHNlIH07CisgICAgfTsKKworICAgIC8v
IENhbmRpZGF0ZSBjb250ZW50IGlzIGEgY29sbGVjdGlvbiBvZiBpbmxpbmUgY29udGVudCBvciBh
IGZsb2F0IGJveC4KKyAgICBJbmxpbmVDb250ZW50IGlubGluZUNvbnRlbnQ7CisgICAgY29uc3Qg
SW5saW5lSXRlbSogZmxvYXRJdGVtIHsgbnVsbHB0ciB9OworfTsKKworTGluZUNhbmRpZGF0ZTo6
TGluZUNhbmRpZGF0ZShib29sIGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZykKKyAgICA6IGlu
bGluZUNvbnRlbnQoaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKQoreworfQorCitMaW5lQ2Fu
ZGlkYXRlOjpJbmxpbmVDb250ZW50OjpJbmxpbmVDb250ZW50KGJvb2wgaWdub3JlVHJhaWxpbmdM
ZXR0ZXJTcGFjaW5nKQorICAgIDogbV9pZ25vcmVUcmFpbGluZ0xldHRlclNwYWNpbmcoaWdub3Jl
VHJhaWxpbmdMZXR0ZXJTcGFjaW5nKQoreworfQorCitpbmxpbmUgdm9pZCBMaW5lQ2FuZGlkYXRl
OjpJbmxpbmVDb250ZW50OjphcHBlbmRJbmxpbmVJdGVtKGNvbnN0IElubGluZUl0ZW0mIGlubGlu
ZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQoreworICAgIEFTU0VSVChpbmxp
bmVJdGVtLmlzVGV4dCgpIHx8IGlubGluZUl0ZW0uaXNCb3goKSB8fCBpbmxpbmVJdGVtLmlzSW5s
aW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpOworICAgIGF1dG8g
Y29sbGFwc2libGVXaWR0aCA9IFsmXSgpIC0+IE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHsK
KyAgICAgICAgaWYgKCFpbmxpbmVJdGVtLmlzVGV4dCgpKQorICAgICAgICAgICAgcmV0dXJuIHsg
fTsKKyAgICAgICAgYXV0byYgaW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRl
bT4oaW5saW5lSXRlbSk7CisgICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2Uo
KSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVU
ZXh0SXRlbSkpIHsKKyAgICAgICAgICAgIC8vIEZ1bGx5IGNvbGxhcHNpYmxlIHRyYWlsaW5nIGNv
bnRlbnQuCisgICAgICAgICAgICByZXR1cm4gbG9naWNhbFdpZHRoOworICAgICAgICB9CisgICAg
ICAgIC8vIENoZWNrIGZvciBwYXJ0aWFsbHkgY29sbGFwc2libGUgY29udGVudC4KKyAgICAgICAg
aWYgKG1faWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKQorICAgICAgICAgICAgcmV0dXJuIHsg
fTsKKyAgICAgICAgYXV0byBsZXR0ZXJTcGFjaW5nID0gaW5saW5lSXRlbS5zdHlsZSgpLmxldHRl
clNwYWNpbmcoKTsKKyAgICAgICAgaWYgKGxldHRlclNwYWNpbmcgPD0gMCkKKyAgICAgICAgICAg
IHJldHVybiB7IH07CisgICAgICAgIEFTU0VSVChsb2dpY2FsV2lkdGggPiBsZXR0ZXJTcGFjaW5n
KTsKKyAgICAgICAgcmV0dXJuIGxldHRlclNwYWNpbmc7CisgICAgfTsKKyAgICBtX2NvbnRpbnVv
dXNDb250ZW50LmFwcGVuZChpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgsIGNvbGxhcHNpYmxlV2lk
dGgoKSk7CisgICAgbV9oYXNJbmxpbmVMZXZlbEJveCA9IG1faGFzSW5saW5lTGV2ZWxCb3ggfHwg
aW5saW5lSXRlbS5pc0JveCgpIHx8IGlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpOworfQor
CitpbmxpbmUgdm9pZCBMaW5lQ2FuZGlkYXRlOjpJbmxpbmVDb250ZW50OjpyZXNldCgpCit7Cisg
ICAgbV9jb250aW51b3VzQ29udGVudC5yZXNldCgpOworICAgIG1fdHJhaWxpbmdMaW5lQnJlYWsg
PSB7IH07CisgICAgbV90cmFpbGluZ1dvcmRCcmVha09wcG9ydHVuaXR5ID0geyB9OworICAgIG1f
aGFzSW5saW5lTGV2ZWxCb3ggPSBmYWxzZTsKK30KKworaW5saW5lIHZvaWQgTGluZUNhbmRpZGF0
ZTo6cmVzZXQoKQoreworICAgIGZsb2F0SXRlbSA9IG51bGxwdHI7CisgICAgaW5saW5lQ29udGVu
dC5yZXNldCgpOworfQorCitJbmxpbmVMYXlvdXRVbml0IExpbmVCdWlsZGVyOjppbmxpbmVJdGVt
V2lkdGgoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBjb250
ZW50TG9naWNhbExlZnQpIGNvbnN0Cit7CisgICAgaWYgKGlzPElubGluZVRleHRJdGVtPihpbmxp
bmVJdGVtKSkgeworICAgICAgICBhdXRvJiBpbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGlu
ZVRleHRJdGVtPihpbmxpbmVJdGVtKTsKKyAgICAgICAgaWYgKGF1dG8gY29udGVudFdpZHRoID0g
aW5saW5lVGV4dEl0ZW0ud2lkdGgoKSkKKyAgICAgICAgICAgIHJldHVybiAqY29udGVudFdpZHRo
OworICAgICAgICBpZiAoIWlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpIHx8IElubGluZVRl
eHRJdGVtOjpzaG91bGRQcmVzZXJ2ZVNwYWNlc0FuZFRhYnMoaW5saW5lVGV4dEl0ZW0pKQorICAg
ICAgICAgICAgcmV0dXJuIFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgY29udGVudExv
Z2ljYWxMZWZ0KTsKKyAgICAgICAgcmV0dXJuIFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRl
bSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSArIDEsIGNv
bnRlbnRMb2dpY2FsTGVmdCk7CisgICAgfQorCisgICAgaWYgKGlubGluZUl0ZW0uaXNMaW5lQnJl
YWsoKSB8fCBpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkKKyAgICAgICAgcmV0
dXJuIHsgfTsKKworICAgIGF1dG8mIGxheW91dEJveCA9IGlubGluZUl0ZW0ubGF5b3V0Qm94KCk7
CisgICAgYXV0byYgYm94R2VvbWV0cnkgPSBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0Lmdlb21l
dHJ5Rm9yQm94KGxheW91dEJveCk7CisKKyAgICBpZiAobGF5b3V0Qm94LmlzRmxvYXRpbmdQb3Np
dGlvbmVkKCkpCisgICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5Cb3hXaWR0aCgpOwor
CisgICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94KCkpCisgICAgICAgIHJldHVybiBib3hH
ZW9tZXRyeS5tYXJnaW5Cb3hXaWR0aCgpOworCisgICAgaWYgKGlubGluZUl0ZW0uaXNJbmxpbmVC
b3hTdGFydCgpKQorICAgICAgICByZXR1cm4gYm94R2VvbWV0cnkubWFyZ2luU3RhcnQoKSArIGJv
eEdlb21ldHJ5LmJvcmRlckxlZnQoKSArIGJveEdlb21ldHJ5LnBhZGRpbmdMZWZ0KCkudmFsdWVP
cigwKTsKKworICAgIGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpCisgICAgICAgIHJl
dHVybiBib3hHZW9tZXRyeS5tYXJnaW5FbmQoKSArIGJveEdlb21ldHJ5LmJvcmRlclJpZ2h0KCkg
KyBib3hHZW9tZXRyeS5wYWRkaW5nUmlnaHQoKS52YWx1ZU9yKDApOworCisgICAgLy8gTm9uLXJl
cGxhY2VkIGlubGluZSBib3ggKGUuZy4gaW5saW5lLWJsb2NrKQorICAgIHJldHVybiBib3hHZW9t
ZXRyeS5tYXJnaW5Cb3hXaWR0aCgpOworfQorCitMaW5lQnVpbGRlcjo6TGluZUJ1aWxkZXIoSW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1hdHRpbmdDb250ZXh0LCBGbG9hdGluZ1N0
YXRlJiBmbG9hdGluZ1N0YXRlLCBIb3Jpem9udGFsQ29uc3RyYWludHMgcm9vdEhvcml6b250YWxD
b25zdHJhaW50cywgY29uc3QgSW5saW5lSXRlbXMmIGlubGluZUl0ZW1zKQorICAgIDogbV9pbmxp
bmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1faW5s
aW5lRm9ybWF0dGluZ1N0YXRlKCZpbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5mb3JtYXR0aW5nU3Rh
dGUoKSkKKyAgICAsIG1fZmxvYXRpbmdTdGF0ZSgmZmxvYXRpbmdTdGF0ZSkKKyAgICAsIG1fcm9v
dEhvcml6b250YWxDb25zdHJhaW50cyhyb290SG9yaXpvbnRhbENvbnN0cmFpbnRzKQorICAgICwg
bV9saW5lKGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQorICAgICwgbV9pbmxpbmVJdGVtcyhpbmxp
bmVJdGVtcykKK3sKK30KKworTGluZUJ1aWxkZXI6OkxpbmVCdWlsZGVyKGNvbnN0IElubGluZUZv
cm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCwgY29uc3QgSW5saW5lSXRl
bXMmIGlubGluZUl0ZW1zKQorICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVG
b3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1fbGluZShpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkK
KyAgICAsIG1faW5saW5lSXRlbXMoaW5saW5lSXRlbXMpCit7Cit9CisKK0xpbmVCdWlsZGVyOjpM
aW5lQ29udGVudCBMaW5lQnVpbGRlcjo6bGF5b3V0SW5saW5lQ29udGVudChjb25zdCBJbmxpbmVJ
dGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2UsIHNpemVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRM
ZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IG92ZXJmbG93TG9naWNhbFdpZHRoLCBj
b25zdCBJbmxpbmVSZWN0JiBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LCBib29sIGlzRmlyc3RMaW5l
KQoreworICAgIGluaXRpYWxpemUoaW5pdGlhbENvbnN0cmFpbnRzRm9yTGluZShpbml0aWFsTGlu
ZUxvZ2ljYWxSZWN0LCBpc0ZpcnN0TGluZSkpOworCisgICAgYXV0byBjb21taXR0ZWRDb250ZW50
ID0gcGxhY2VJbmxpbmVDb250ZW50KG5lZWRzTGF5b3V0UmFuZ2UsIHBhcnRpYWxMZWFkaW5nQ29u
dGVudExlbmd0aCwgb3ZlcmZsb3dMb2dpY2FsV2lkdGgpOworICAgIGF1dG8gY29tbWl0dGVkUmFu
Z2UgPSBjbG9zZShuZWVkc0xheW91dFJhbmdlLCBjb21taXR0ZWRDb250ZW50KTsKKworICAgIGF1
dG8gaXNMYXN0TGluZSA9IGlzTGFzdExpbmVXaXRoSW5saW5lQ29udGVudChjb21taXR0ZWRSYW5n
ZSwgbmVlZHNMYXlvdXRSYW5nZS5lbmQsIGNvbW1pdHRlZENvbnRlbnQucGFydGlhbFRyYWlsaW5n
Q29udGVudExlbmd0aCk7CisgICAgcmV0dXJuIExpbmVDb250ZW50IHsgY29tbWl0dGVkUmFuZ2Us
IGNvbW1pdHRlZENvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCwgY29tbWl0dGVk
Q29udGVudC5vdmVyZmxvd0xvZ2ljYWxXaWR0aCwgbV9mbG9hdHMsIG1fY29udGVudElzQ29uc3Ry
YWluZWRCeUZsb2F0CisgICAgICAgICwgbV9saW5lTG9naWNhbFJlY3QudG9wTGVmdCgpCisgICAg
ICAgICwgbV9saW5lTG9naWNhbFJlY3Qud2lkdGgoKQorICAgICAgICAsIG1fbGluZS5jb250ZW50
TG9naWNhbFdpZHRoKCkKKyAgICAgICAgLCBpc0xhc3RMaW5lCisgICAgICAgICwgbV9saW5lLm5v
blNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCgpCisgICAgICAgICwgbV9saW5lLnJ1bnMoKX07
Cit9CisKK0xpbmVCdWlsZGVyOjpJbnRyaW5zaWNDb250ZW50IExpbmVCdWlsZGVyOjpjb21wdXRl
ZEludHJpbnNpY1dpZHRoKGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwg
SW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCkKK3sKKyAgICBpbml0aWFsaXplKHsgeyB7
IH0sIHsgYXZhaWxhYmxlV2lkdGgsIG1heElubGluZUxheW91dFVuaXQoKSB9IH0sIGZhbHNlIH0p
OworICAgIGF1dG8gY29tbWl0dGVkQ29udGVudCA9IHBsYWNlSW5saW5lQ29udGVudChuZWVkc0xh
eW91dFJhbmdlLCB7IH0sIHsgfSk7CisgICAgYXV0byBjb21taXR0ZWRSYW5nZSA9IGNsb3NlKG5l
ZWRzTGF5b3V0UmFuZ2UsIGNvbW1pdHRlZENvbnRlbnQpOworICAgIHJldHVybiB7IGNvbW1pdHRl
ZFJhbmdlLCBtX2xpbmUuY29udGVudExvZ2ljYWxXaWR0aCgpLCBtX2Zsb2F0cyB9OworfQorCit2
b2lkIExpbmVCdWlsZGVyOjppbml0aWFsaXplKGNvbnN0IFVzZWRDb25zdHJhaW50cyYgbGluZUNv
bnN0cmFpbnRzKQoreworICAgIG1fZmxvYXRzLmNsZWFyKCk7CisgICAgbV9wYXJ0aWFsTGVhZGlu
Z1RleHRJdGVtID0geyB9OworICAgIG1fd3JhcE9wcG9ydHVuaXR5TGlzdC5jbGVhcigpOworCisg
ICAgbV9saW5lLmluaXRpYWxpemUoKTsKKyAgICBtX2xpbmVMb2dpY2FsUmVjdCA9IGxpbmVDb25z
dHJhaW50cy5sb2dpY2FsUmVjdDsKKyAgICBtX2NvbnRlbnRJc0NvbnN0cmFpbmVkQnlGbG9hdCA9
IGxpbmVDb25zdHJhaW50cy5pc0NvbnN0cmFpbmVkQnlGbG9hdDsKK30KKworTGluZUJ1aWxkZXI6
OkNvbW1pdHRlZENvbnRlbnQgTGluZUJ1aWxkZXI6OnBsYWNlSW5saW5lQ29udGVudChjb25zdCBJ
bmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2UsIHNpemVfdCBwYXJ0aWFsTGVhZGluZ0Nv
bnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lk
dGgpCit7CisgICAgYXV0byBsaW5lQ2FuZGlkYXRlID0gTGluZUNhbmRpZGF0ZSB7IGxheW91dFN0
YXRlKCkuc2hvdWxkSWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkgfTsKKyAgICBhdXRvIGlu
bGluZUNvbnRlbnRCcmVha2VyID0gSW5saW5lQ29udGVudEJyZWFrZXIgeyB9OworCisgICAgYXV0
byBjdXJyZW50SXRlbUluZGV4ID0gbmVlZHNMYXlvdXRSYW5nZS5zdGFydDsKKyAgICBzaXplX3Qg
Y29tbWl0dGVkSW5saW5lSXRlbUNvdW50ID0gMDsKKyAgICB3aGlsZSAoY3VycmVudEl0ZW1JbmRl
eCA8IG5lZWRzTGF5b3V0UmFuZ2UuZW5kKSB7CisgICAgICAgIC8vIDEuIENvbGxlY3QgdGhlIHNl
dCBvZiBydW5zIHRoYXQgd2UgY2FuIGNvbW1pdCB0byB0aGUgbGluZSBhcyBvbmUgZW50aXR5IGUu
Zy4gPHNwYW4+dGV4dF9hbmRfc3Bhbl9zdGFydF9zcGFuX2VuZDwvc3Bhbj4uCisgICAgICAgIC8v
IDIuIEFwcGx5IGZsb2F0cyBhbmQgc2hyaW5rIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFj
ZSBlLmcuIDxzcGFuPmludHJ1XzxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0Ij48L2Rpdj5zaXZlX2Zs
b2F0PC9zcGFuPi4KKyAgICAgICAgLy8gMy4gQ2hlY2sgaWYgdGhlIGNvbnRlbnQgZml0cyB0aGUg
bGluZSBhbmQgY29tbWl0IHRoZSBjb250ZW50IGFjY29yZGluZ2x5IChmdWxsLCBwYXJ0aWFsIG9y
IG5vdCBjb21taXQgYXQgYWxsKS4KKyAgICAgICAgLy8gNC4gUmV0dXJuIGlmIHdlIGFyZSBhdCB0
aGUgZW5kIG9mIHRoZSBsaW5lIGVpdGhlciBieSBub3QgYmVpbmcgYWJsZSB0byBmaXQgbW9yZSBj
b250ZW50IG9yIGJlY2F1c2Ugb2YgYW4gZXhwbGljaXQgbGluZSBicmVhay4KKyAgICAgICAgY2Fu
ZGlkYXRlQ29udGVudEZvckxpbmUobGluZUNhbmRpZGF0ZSwgY3VycmVudEl0ZW1JbmRleCwgbmVl
ZHNMYXlvdXRSYW5nZSwgcGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBzdGQ6OmV4Y2hhbmdl
KGxlYWRpbmdMb2dpY2FsV2lkdGgsIFdURjo6bnVsbG9wdCksIG1fbGluZS5jb250ZW50TG9naWNh
bFJpZ2h0KCkpOworICAgICAgICAvLyBOb3cgY2hlY2sgaWYgd2UgY2FuIHB1dCB0aGlzIGNvbnRl
bnQgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgYXV0byByZXN1bHQgPSBSZXN1bHQgeyB9
OworICAgICAgICBpZiAobGluZUNhbmRpZGF0ZS5mbG9hdEl0ZW0pIHsKKyAgICAgICAgICAgIEFT
U0VSVChsaW5lQ2FuZGlkYXRlLmlubGluZUNvbnRlbnQuaXNFbXB0eSgpKTsKKyAgICAgICAgICAg
IGhhbmRsZUZsb2F0Q29udGVudCgqbGluZUNhbmRpZGF0ZS5mbG9hdEl0ZW0pOworICAgICAgICAg
ICAgLy8gRmxvYXRzIG5ldmVyIHRlcm1pbmF0ZSB0aGUgbGluZS4KKyAgICAgICAgfSBlbHNlCisg
ICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVJbmxpbmVDb250ZW50KGlubGluZUNvbnRlbnRCcmVh
a2VyLCBuZWVkc0xheW91dFJhbmdlLCBsaW5lQ2FuZGlkYXRlKTsKKyAgICAgICAgYXV0byBpc0Vu
ZE9mTGluZSA9IHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNF
bmRPZkxpbmU6OlllczsKKyAgICAgICAgaWYgKCFyZXN1bHQuY29tbWl0dGVkQ291bnQuaXNSZXZl
cnQpIHsKKyAgICAgICAgICAgIGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCArPSByZXN1bHQuY29t
bWl0dGVkQ291bnQudmFsdWU7CisgICAgICAgICAgICBhdXRvJiBpbmxpbmVDb250ZW50ID0gbGlu
ZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50OworICAgICAgICAgICAgYXV0byBpbmxpbmVDb250ZW50
SXNGdWxseUNvbW1pdHRlZCA9IGlubGluZUNvbnRlbnQuY29udGludW91c0NvbnRlbnQoKS5ydW5z
KCkuc2l6ZSgpID09IHJlc3VsdC5jb21taXR0ZWRDb3VudC52YWx1ZSAmJiAhcmVzdWx0LnBhcnRp
YWxUcmFpbGluZ0NvbnRlbnRMZW5ndGg7CisgICAgICAgICAgICBpZiAoaW5saW5lQ29udGVudElz
RnVsbHlDb21taXR0ZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXV0byogd29yZEJyZWFrT3Bw
b3J0dW5pdHkgPSBpbmxpbmVDb250ZW50LnRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkg
eworICAgICAgICAgICAgICAgICAgICAvLyA8d2JyPiBuZWVkcyB0byBiZSBvbiB0aGUgbGluZSBh
cyBhbiBlbXB0eSBydW4gc28gdGhhdCB3ZSBjYW4gY29uc3RydWN0IGFuIGlubGluZSBib3ggYW5k
IGNvbXB1dGUgYmFzaWMgZ2VvbWV0cnkuCisgICAgICAgICAgICAgICAgICAgICsrY29tbWl0dGVk
SW5saW5lSXRlbUNvdW50OworICAgICAgICAgICAgICAgICAgICBtX2xpbmUuYXBwZW5kKCp3b3Jk
QnJlYWtPcHBvcnR1bml0eSwgeyB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgaWYgKGlubGluZUNvbnRlbnQudHJhaWxpbmdMaW5lQnJlYWsoKSkgeworICAgICAgICAgICAg
ICAgICAgICAvLyBGdWxseSBjb21taXR0ZWQgKG9yIGVtcHR5KSBjb250ZW50IGZvbGxvd2VkIGJ5
IGEgbGluZSBicmVhayBtZWFucyAiZW5kIG9mIGxpbmUiLgorICAgICAgICAgICAgICAgICAgICAv
LyBGSVhNRTogVGhpcyB3aWxsIHB1dCB0aGUgbGluZSBicmVhayBib3ggYXQgdGhlIGVuZCBvZiB0
aGUgbGluZSB3aGlsZSBpbiBjYXNlIG9mIHNvbWUgaW5saW5lIGJveGVzLCB0aGUgbGluZSBicmVh
aworICAgICAgICAgICAgICAgICAgICAvLyBjb3VsZCB2ZXJ5IHdlbGwgYmUgYXQgYW4gZWFybGll
ciBwb3NpdGlvbi4gVGhpcyBoYXMgbm8gdmlzdWFsIGltcGxpY2F0aW9ucyBhdCB0aGlzIHBvaW50
IHRob3VnaCAob25seSBnZW9tZXRyeSBjb3JyZWN0bmVzcyBvbiB0aGUgbGluZSBicmVhayBib3gp
LgorICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIDxzcGFuIHN0eWxlPSJib3JkZXItcmlnaHQ6
IDEwcHggc29saWQgZ3JlZW4iPnRleHQ8YnI+PC9zcGFuPiB3aGVyZSB0aGUgPGJyPidzIGhvcml6
b250YWwgcG9zaXRpb24gaXMgYmVmb3JlIHRoZSByaWdodCBib3JkZXIgYW5kIG5vdCBhZnRlci4K
KyAgICAgICAgICAgICAgICAgICAgbV9saW5lLmFwcGVuZCgqaW5saW5lQ29udGVudC50cmFpbGlu
Z0xpbmVCcmVhaygpLCB7IH0pOworICAgICAgICAgICAgICAgICAgICArK2NvbW1pdHRlZElubGlu
ZUl0ZW1Db3VudDsKKyAgICAgICAgICAgICAgICAgICAgaXNFbmRPZkxpbmUgPSB0cnVlOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAg
ICBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgPSByZXN1bHQuY29tbWl0dGVkQ291bnQudmFsdWU7
CisKKyAgICAgICAgaWYgKGlzRW5kT2ZMaW5lKSB7CisgICAgICAgICAgICAvLyBXZSBjYW4ndCBw
bGFjZSBhbnkgbW9yZSBpdGVtcyBvbiB0aGUgY3VycmVudCBsaW5lLgorICAgICAgICAgICAgcmV0
dXJuIHsgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50LCByZXN1bHQucGFydGlhbFRyYWlsaW5nQ29u
dGVudExlbmd0aCwgcmVzdWx0Lm92ZXJmbG93TG9naWNhbFdpZHRoIH07CisgICAgICAgIH0KKyAg
ICAgICAgY3VycmVudEl0ZW1JbmRleCA9IG5lZWRzTGF5b3V0UmFuZ2Uuc3RhcnQgKyBjb21taXR0
ZWRJbmxpbmVJdGVtQ291bnQgKyBtX2Zsb2F0cy5zaXplKCk7CisgICAgICAgIHBhcnRpYWxMZWFk
aW5nQ29udGVudExlbmd0aCA9IHsgfTsKKyAgICB9CisgICAgLy8gTG9va3MgbGlrZSB3ZSd2ZSBy
dW4gb3V0IG9mIHJ1bnMuCisgICAgcmV0dXJuIHsgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50LCB7
IH0gfTsKK30KKworTGluZUJ1aWxkZXI6OklubGluZUl0ZW1SYW5nZSBMaW5lQnVpbGRlcjo6Y2xv
c2UoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBjb25zdCBDb21taXR0
ZWRDb250ZW50JiBjb21taXR0ZWRDb250ZW50KQoreworICAgIEFTU0VSVChjb21taXR0ZWRDb250
ZW50LmlubGluZUl0ZW1Db3VudCB8fCAhbV9mbG9hdHMuaXNFbXB0eSgpIHx8IG1fY29udGVudElz
Q29uc3RyYWluZWRCeUZsb2F0KTsKKyAgICBhdXRvIG51bWJlck9mQ29tbWl0dGVkSXRlbXMgPSBj
b21taXR0ZWRDb250ZW50LmlubGluZUl0ZW1Db3VudCArIG1fZmxvYXRzLnNpemUoKTsKKyAgICBh
dXRvIHRyYWlsaW5nSW5saW5lSXRlbUluZGV4ID0gbmVlZHNMYXlvdXRSYW5nZS5zdGFydCArIG51
bWJlck9mQ29tbWl0dGVkSXRlbXMgLSAxOworICAgIGF1dG8gbGluZVJhbmdlID0gSW5saW5lSXRl
bVJhbmdlIHsgbmVlZHNMYXlvdXRSYW5nZS5zdGFydCwgdHJhaWxpbmdJbmxpbmVJdGVtSW5kZXgg
KyAxIH07CisgICAgQVNTRVJUKGxpbmVSYW5nZS5lbmQgPD0gbmVlZHNMYXlvdXRSYW5nZS5lbmQp
OworICAgIGlmICghY29tbWl0dGVkQ29udGVudC5pbmxpbmVJdGVtQ291bnQpIHsKKyAgICAgICAg
Ly8gTGluZSBpcyBlbXB0eSwgd2Ugb25seSBtYW5hZ2VkIHRvIHBsYWNlIGZsb2F0IGJveGVzLgor
ICAgICAgICByZXR1cm4gbGluZVJhbmdlOworICAgIH0KKyAgICBhdXRvIGF2YWlsYWJsZVdpZHRo
ID0gbV9saW5lTG9naWNhbFJlY3Qud2lkdGgoKSAtIG1fbGluZS5jb250ZW50TG9naWNhbFJpZ2h0
KCk7CisgICAgbV9saW5lLnJlbW92ZUNvbGxhcHNpYmxlQ29udGVudChhdmFpbGFibGVXaWR0aCk7
CisgICAgYXV0byBob3Jpem9udGFsQWxpZ25tZW50ID0gcm9vdCgpLnN0eWxlKCkudGV4dEFsaWdu
KCk7CisgICAgYXV0byBydW5zRXhwYW5kSG9yaXpvbnRhbGx5ID0gaG9yaXpvbnRhbEFsaWdubWVu
dCA9PSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5ICYmICFpc0xhc3RMaW5lV2l0aElubGluZUNvbnRl
bnQobGluZVJhbmdlLCBuZWVkc0xheW91dFJhbmdlLmVuZCwgY29tbWl0dGVkQ29udGVudC5wYXJ0
aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoKTsKKyAgICBpZiAocnVuc0V4cGFuZEhvcml6b250YWxs
eSkKKyAgICAgICAgbV9saW5lLmFwcGx5UnVuRXhwYW5zaW9uKG1fbGluZUxvZ2ljYWxSZWN0Lndp
ZHRoKCkgLSBtX2xpbmUuY29udGVudExvZ2ljYWxSaWdodCgpKTsKKyAgICBhdXRvIGxpbmVFbmRz
V2l0aEh5cGhlbiA9IGZhbHNlOworICAgIGlmICghbV9saW5lLnJ1bnMoKS5pc0VtcHR5KCkpIHsK
KyAgICAgICAgYXV0byYgbGFzdFRleHRDb250ZW50ID0gbV9saW5lLnJ1bnMoKS5sYXN0KCkudGV4
dENvbnRlbnQoKTsKKyAgICAgICAgbGluZUVuZHNXaXRoSHlwaGVuID0gbGFzdFRleHRDb250ZW50
ICYmIGxhc3RUZXh0Q29udGVudC0+bmVlZHNIeXBoZW4oKTsKKyAgICB9CisgICAgbV9zdWNjZXNz
aXZlSHlwaGVuYXRlZExpbmVDb3VudCA9IGxpbmVFbmRzV2l0aEh5cGhlbiA/IG1fc3VjY2Vzc2l2
ZUh5cGhlbmF0ZWRMaW5lQ291bnQgKyAxIDogMDsKKyAgICByZXR1cm4gbGluZVJhbmdlOworfQor
CitPcHRpb25hbDxIb3Jpem9udGFsQ29uc3RyYWludHM+IExpbmVCdWlsZGVyOjpmbG9hdENvbnN0
cmFpbnRzKGNvbnN0IElubGluZVJlY3QmIGxpbmVMb2dpY2FsUmVjdCkgY29uc3QKK3sKKyAgICBh
dXRvKiBmbG9hdGluZ1N0YXRlID0gdGhpcy0+ZmxvYXRpbmdTdGF0ZSgpOworICAgIGlmICghZmxv
YXRpbmdTdGF0ZSB8fCBmbG9hdGluZ1N0YXRlLT5mbG9hdHMoKS5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiB7IH07CisKKyAgICAvLyBDaGVjayBmb3IgaW50cnVkaW5nIGZsb2F0cyBhbmQgYWRq
dXN0IGxvZ2ljYWwgbGVmdC9hdmFpbGFibGUgd2lkdGggZm9yIHRoaXMgbGluZSBhY2NvcmRpbmds
eS4KKyAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0aW5nQ29udGV4dCB7IGZvcm1hdHRp
bmdDb250ZXh0KCksICpmbG9hdGluZ1N0YXRlIH07CisgICAgYXV0byBjb25zdHJhaW50cyA9IGZs
b2F0aW5nQ29udGV4dC5jb25zdHJhaW50cyh0b0xheW91dFVuaXQobGluZUxvZ2ljYWxSZWN0LnRv
cCgpKSwgdG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmVjdC5ib3R0b20oKSkpOworICAgIC8vIENo
ZWNrIGlmIHRoZXNlIHZhbHVlcyBhY3R1YWxseSBjb25zdHJhaW4gdGhlIGxpbmUuCisgICAgaWYg
KGNvbnN0cmFpbnRzLmxlZnQgJiYgY29uc3RyYWludHMubGVmdC0+eCA8PSBsaW5lTG9naWNhbFJl
Y3QubGVmdCgpKQorICAgICAgICBjb25zdHJhaW50cy5sZWZ0ID0geyB9OworCisgICAgaWYgKGNv
bnN0cmFpbnRzLnJpZ2h0ICYmIGNvbnN0cmFpbnRzLnJpZ2h0LT54ID49IGxpbmVMb2dpY2FsUmVj
dC5yaWdodCgpKQorICAgICAgICBjb25zdHJhaW50cy5yaWdodCA9IHsgfTsKKworICAgIGlmICgh
Y29uc3RyYWludHMubGVmdCAmJiAhY29uc3RyYWludHMucmlnaHQpCisgICAgICAgIHJldHVybiB7
IH07CisKKyAgICBhdXRvIGxpbmVMb2dpY2FsTGVmdCA9IGxpbmVMb2dpY2FsUmVjdC5sZWZ0KCk7
CisgICAgYXV0byBsaW5lTG9naWNhbFJpZ2h0ID0gbGluZUxvZ2ljYWxSZWN0LnJpZ2h0KCk7Cisg
ICAgaWYgKGNvbnN0cmFpbnRzLmxlZnQgJiYgY29uc3RyYWludHMucmlnaHQpIHsKKyAgICAgICAg
bGluZUxvZ2ljYWxSaWdodCA9IGNvbnN0cmFpbnRzLnJpZ2h0LT54OworICAgICAgICBsaW5lTG9n
aWNhbExlZnQgPSBjb25zdHJhaW50cy5sZWZ0LT54OworICAgIH0gZWxzZSBpZiAoY29uc3RyYWlu
dHMubGVmdCkgeworICAgICAgICBBU1NFUlQoY29uc3RyYWludHMubGVmdC0+eCA+PSBsaW5lTG9n
aWNhbExlZnQpOworICAgICAgICBsaW5lTG9naWNhbExlZnQgPSBjb25zdHJhaW50cy5sZWZ0LT54
OworICAgIH0gZWxzZSBpZiAoY29uc3RyYWludHMucmlnaHQpIHsKKyAgICAgICAgLy8gUmlnaHQg
ZmxvYXQgYm94ZXMgbWF5IG92ZXJmbG93IHRoZSBjb250YWluaW5nIGJsb2NrIG9uIHRoZSBsZWZ0
LgorICAgICAgICBsaW5lTG9naWNhbFJpZ2h0ID0gc3RkOjptYXg8SW5saW5lTGF5b3V0VW5pdD4o
bGluZUxvZ2ljYWxMZWZ0LCBjb25zdHJhaW50cy5yaWdodC0+eCk7CisgICAgfQorICAgIHJldHVy
biBIb3Jpem9udGFsQ29uc3RyYWludHMgeyB0b0xheW91dFVuaXQobGluZUxvZ2ljYWxMZWZ0KSwg
dG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmlnaHQgLSBsaW5lTG9naWNhbExlZnQpIH07Cit9CisK
K0xpbmVCdWlsZGVyOjpVc2VkQ29uc3RyYWludHMgTGluZUJ1aWxkZXI6OmluaXRpYWxDb25zdHJh
aW50c0ZvckxpbmUoY29uc3QgSW5saW5lUmVjdCYgaW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgYm9v
bCBpc0ZpcnN0TGluZSkgY29uc3QKK3sKKyAgICBhdXRvIGxpbmVMb2dpY2FsTGVmdCA9IGluaXRp
YWxMaW5lTG9naWNhbFJlY3QubGVmdCgpOworICAgIGF1dG8gbGluZUxvZ2ljYWxSaWdodCA9IGlu
aXRpYWxMaW5lTG9naWNhbFJlY3QucmlnaHQoKTsKKyAgICBhdXRvIGxpbmVJc0NvbnN0cmFpbmVk
QnlGbG9hdCA9IGZhbHNlOworCisgICAgaWYgKGF1dG8gbGluZUNvbnN0cmFpbnRzID0gZmxvYXRD
b25zdHJhaW50cyhpbml0aWFsTGluZUxvZ2ljYWxSZWN0KSkgeworICAgICAgICBsaW5lTG9naWNh
bExlZnQgPSBsaW5lQ29uc3RyYWludHMtPmxvZ2ljYWxMZWZ0OworICAgICAgICBsaW5lTG9naWNh
bFJpZ2h0ID0gbGluZUNvbnN0cmFpbnRzLT5sb2dpY2FsUmlnaHQoKTsKKyAgICAgICAgbGluZUlz
Q29uc3RyYWluZWRCeUZsb2F0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBhdXRvIGNvbXB1dGVkVGV4
dEluZGVudCA9IFsmXSgpIC0+IElubGluZUxheW91dFVuaXQgeworICAgICAgICAvLyB0ZXh0LWlu
ZGVudCBwcm9wZXJ0eSBzcGVjaWZpZXMgdGhlIGluZGVudGF0aW9uIGFwcGxpZWQgdG8gbGluZXMg
b2YgaW5saW5lIGNvbnRlbnQgaW4gYSBibG9jay4KKyAgICAgICAgLy8gVGhlIGluZGVudCBpcyB0
cmVhdGVkIGFzIGEgbWFyZ2luIGFwcGxpZWQgdG8gdGhlIHN0YXJ0IGVkZ2Ugb2YgdGhlIGxpbmUg
Ym94LgorICAgICAgICAvLyBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgb25seSBsaW5lcyB0
aGF0IGFyZSB0aGUgZmlyc3QgZm9ybWF0dGVkIGxpbmUgb2YgYW4gZWxlbWVudCBhcmUgYWZmZWN0
ZWQuCisgICAgICAgIC8vIEZvciBleGFtcGxlLCB0aGUgZmlyc3QgbGluZSBvZiBhbiBhbm9ueW1v
dXMgYmxvY2sgYm94IGlzIG9ubHkgYWZmZWN0ZWQgaWYgaXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9m
IGl0cyBwYXJlbnQgZWxlbWVudC4KKyAgICAgICAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBl
YWNoLWxpbmUuCisgICAgICAgIC8vIFtJbnRlZ3JhdGlvbl0gcm9vdCgpLT5wYXJlbnQoKSB3b3Vs
ZCBub3JtYWxseSBwcm9kdWNlIGEgdmFsaWQgbGF5b3V0IGJveC4KKyAgICAgICAgYXV0byYgcm9v
dCA9IHRoaXMtPnJvb3QoKTsKKyAgICAgICAgYXV0byBpc0Zvcm1hdHRpbmdDb250ZXh0Um9vdENh
bmRpZGF0ZVRvVGV4dEluZGVudCA9ICFyb290LmlzQW5vbnltb3VzKCk7CisgICAgICAgIGlmIChy
b290LmlzQW5vbnltb3VzKCkpIHsKKyAgICAgICAgICAgIC8vIFVubGVzcyBvdGhlcndpc2Ugc3Bl
Y2lmaWVkIGJ5IHRoZSBlYWNoLWxpbmUgYW5kL29yIGhhbmdpbmcga2V5d29yZHMsIG9ubHkgbGlu
ZXMgdGhhdCBhcmUgdGhlIGZpcnN0IGZvcm1hdHRlZCBsaW5lCisgICAgICAgICAgICAvLyBvZiBh
biBlbGVtZW50IGFyZSBhZmZlY3RlZC4KKyAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCB0aGUg
Zmlyc3QgbGluZSBvZiBhbiBhbm9ueW1vdXMgYmxvY2sgYm94IGlzIG9ubHkgYWZmZWN0ZWQgaWYg
aXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJlbnQgZWxlbWVudC4KKyAgICAgICAgICAg
IGF1dG8gaXNJbnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQgPSBsYXlvdXRTdGF0ZSgpLmlzSW50
ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkKCk7CisgICAgICAgICAgICBpZiAoaXNJbnRlZ3JhdGVk
Um9vdEJveEZpcnN0Q2hpbGQgPT0gTGF5b3V0U3RhdGU6OklzSW50ZWdyYXRlZFJvb3RCb3hGaXJz
dENoaWxkOjpOb3RBcHBsaWNhYmxlKQorICAgICAgICAgICAgICAgIGlzRm9ybWF0dGluZ0NvbnRl
eHRSb290Q2FuZGlkYXRlVG9UZXh0SW5kZW50ID0gcm9vdC5wYXJlbnQoKS5maXJzdEluRmxvd0No
aWxkKCkgPT0gJnJvb3Q7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaXNGb3Jt
YXR0aW5nQ29udGV4dFJvb3RDYW5kaWRhdGVUb1RleHRJbmRlbnQgPSBpc0ludGVncmF0ZWRSb290
Qm94Rmlyc3RDaGlsZCA9PSBMYXlvdXRTdGF0ZTo6SXNJbnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hp
bGQ6OlllczsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzRm9ybWF0dGluZ0NvbnRleHRSb290
Q2FuZGlkYXRlVG9UZXh0SW5kZW50KQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAg
YXV0byBpbnZlcnRMaW5lUmFuZ2UgPSByb290LnN0eWxlKCkudGV4dEluZGVudFR5cGUoKSA9PSBU
ZXh0SW5kZW50VHlwZTo6SGFuZ2luZzsKKyAgICAgICAgLy8gdGV4dC1pbmRlbnQ6IGhhbmdpbmcg
aW52ZXJ0cyB3aGljaCBsaW5lcyBhcmUgYWZmZWN0ZWQuCisgICAgICAgIC8vIGludmVydGVkIGxp
bmUgcmFuZ2UgLT4gYWxsIHRoZSBsaW5lcyBleGNlcHQgdGhlIGZpcnN0IG9uZS4KKyAgICAgICAg
Ly8gIWludmVydGVkIGxpbmUgcmFuZ2UgLT4gZmlyc3QgbGluZSBnZXRzIHRoZSBpbmRlbnQuCisg
ICAgICAgIGF1dG8gc2hvdWxkSW5kZW50ID0gaW52ZXJ0TGluZVJhbmdlICE9IGlzRmlyc3RMaW5l
OworICAgICAgICBpZiAoIXNob3VsZEluZGVudCkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisK
KyAgICAgICAgYXV0byB0ZXh0SW5kZW50ID0gcm9vdC5zdHlsZSgpLnRleHRJbmRlbnQoKTsKKyAg
ICAgICAgaWYgKHRleHRJbmRlbnQgPT0gUmVuZGVyU3R5bGU6OmluaXRpYWxUZXh0SW5kZW50KCkp
CisgICAgICAgICAgICByZXR1cm4geyB9OworICAgICAgICByZXR1cm4geyBtaW5pbXVtVmFsdWVG
b3JMZW5ndGgodGV4dEluZGVudCwgaW5pdGlhbExpbmVMb2dpY2FsUmVjdC53aWR0aCgpKSB9Owor
ICAgIH07CisgICAgbGluZUxvZ2ljYWxMZWZ0ICs9IGNvbXB1dGVkVGV4dEluZGVudCgpOworICAg
IHJldHVybiBVc2VkQ29uc3RyYWludHMgeyB7IGluaXRpYWxMaW5lTG9naWNhbFJlY3QudG9wKCks
IGxpbmVMb2dpY2FsTGVmdCwgbGluZUxvZ2ljYWxSaWdodCAtIGxpbmVMb2dpY2FsTGVmdCwgaW5p
dGlhbExpbmVMb2dpY2FsUmVjdC5oZWlnaHQoKSB9LCBsaW5lSXNDb25zdHJhaW5lZEJ5RmxvYXQg
fTsKK30KKwordm9pZCBMaW5lQnVpbGRlcjo6Y2FuZGlkYXRlQ29udGVudEZvckxpbmUoTGluZUNh
bmRpZGF0ZSYgbGluZUNhbmRpZGF0ZSwgc2l6ZV90IGN1cnJlbnRJbmxpbmVJdGVtSW5kZXgsIGNv
bnN0IElubGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFuZ2UsIHNpemVfdCBwYXJ0aWFsTGVhZGluZ0Nv
bnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lk
dGgsIElubGluZUxheW91dFVuaXQgY3VycmVudExvZ2ljYWxSaWdodCkKK3sKKyAgICBBU1NFUlQo
Y3VycmVudElubGluZUl0ZW1JbmRleCA8IGxheW91dFJhbmdlLmVuZCk7CisgICAgbGluZUNhbmRp
ZGF0ZS5yZXNldCgpOworICAgIC8vIDEuIFNpbXBseSBhZGQgYW55IG92ZXJmbG93IGNvbnRlbnQg
ZnJvbSB0aGUgcHJldmlvdXMgbGluZSB0byB0aGUgY2FuZGlkYXRlIGNvbnRlbnQuIEl0J3MgYWx3
YXlzIGEgdGV4dCBjb250ZW50LgorICAgIC8vIDIuIEZpbmQgdGhlIG5leHQgc29mdCB3cmFwIHBv
c2l0aW9uIG9yIGV4cGxpY2l0IGxpbmUgYnJlYWsuCisgICAgLy8gMy4gQ29sbGVjdCBmbG9hdHMg
YmV0d2VlbiB0aGUgaW5saW5lIGNvbnRlbnQuCisgICAgYXV0byBzb2Z0V3JhcE9wcG9ydHVuaXR5
SW5kZXggPSBuZXh0V3JhcE9wcG9ydHVuaXR5KGN1cnJlbnRJbmxpbmVJdGVtSW5kZXgsIGxheW91
dFJhbmdlKTsKKyAgICAvLyBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggPT0gbGF5b3V0UmFuZ2Uu
ZW5kIG1lYW5zIHdlIGRvbid0IGhhdmUgYW55IHdyYXAgb3Bwb3J0dW5pdHkgaW4gdGhpcyBjb250
ZW50LgorICAgIEFTU0VSVChzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggPD0gbGF5b3V0UmFuZ2Uu
ZW5kKTsKKworICAgIGlmIChwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgpIHsKKyAgICAgICAg
Ly8gSGFuZGxlIGxlYWRpbmcgcGFydGlhbCBjb250ZW50IGZpcnN0IChvdmVyZmxvd2luZyB0ZXh0
IGZyb20gdGhlIHByZXZpb3VzIGxpbmUpLgorICAgICAgICAvLyBDb25zdHJ1Y3QgYSBwYXJ0aWFs
IGxlYWRpbmcgaW5saW5lIGl0ZW0uCisgICAgICAgIG1fcGFydGlhbExlYWRpbmdUZXh0SXRlbSA9
IGRvd25jYXN0PElubGluZVRleHRJdGVtPihtX2lubGluZUl0ZW1zW2N1cnJlbnRJbmxpbmVJdGVt
SW5kZXhdKS5yaWdodChwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgpOworICAgICAgICBhdXRv
IGl0ZW1XaWR0aCA9IGxlYWRpbmdMb2dpY2FsV2lkdGggPyAqc3RkOjpleGNoYW5nZShsZWFkaW5n
TG9naWNhbFdpZHRoLCBXVEY6Om51bGxvcHQpIDogaW5saW5lSXRlbVdpZHRoKCptX3BhcnRpYWxM
ZWFkaW5nVGV4dEl0ZW0sIGN1cnJlbnRMb2dpY2FsUmlnaHQpOworICAgICAgICBsaW5lQ2FuZGlk
YXRlLmlubGluZUNvbnRlbnQuYXBwZW5kSW5saW5lSXRlbSgqbV9wYXJ0aWFsTGVhZGluZ1RleHRJ
dGVtLCBpdGVtV2lkdGgpOworICAgICAgICBjdXJyZW50TG9naWNhbFJpZ2h0ICs9IGl0ZW1XaWR0
aDsKKyAgICAgICAgKytjdXJyZW50SW5saW5lSXRlbUluZGV4OworICAgIH0KKworICAgIGZvciAo
YXV0byBpbmRleCA9IGN1cnJlbnRJbmxpbmVJdGVtSW5kZXg7IGluZGV4IDwgc29mdFdyYXBPcHBv
cnR1bml0eUluZGV4OyArK2luZGV4KSB7CisgICAgICAgIGF1dG8mIGlubGluZUl0ZW0gPSBtX2lu
bGluZUl0ZW1zW2luZGV4XTsKKyAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNGbG9hdCgpKSB7Cisg
ICAgICAgICAgICBsaW5lQ2FuZGlkYXRlLmZsb2F0SXRlbSA9ICZpbmxpbmVJdGVtOworICAgICAg
ICAgICAgLy8gVGhpcyBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSwgbXVzdCBiZSB0aGUgb25s
eSBpdGVtIGluIHRoZSBsaXN0LgorICAgICAgICAgICAgQVNTRVJUKGN1cnJlbnRJbmxpbmVJdGVt
SW5kZXggKyAxID09IHNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCk7CisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5saW5lSXRlbS5pc1RleHQoKSB8fCBpbmxp
bmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkg
fHwgaW5saW5lSXRlbS5pc0JveCgpKSB7CisgICAgICAgICAgICBBU1NFUlQoIWxlYWRpbmdMb2dp
Y2FsV2lkdGggfHwgaW5saW5lSXRlbS5pc1RleHQoKSk7CisgICAgICAgICAgICBhdXRvIGxvZ2lj
YWxXaWR0aCA9IGxlYWRpbmdMb2dpY2FsV2lkdGggPyAqc3RkOjpleGNoYW5nZShsZWFkaW5nTG9n
aWNhbFdpZHRoLCBXVEY6Om51bGxvcHQpIDogaW5saW5lSXRlbVdpZHRoKGlubGluZUl0ZW0sIGN1
cnJlbnRMb2dpY2FsUmlnaHQpOworICAgICAgICAgICAgbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250
ZW50LmFwcGVuZElubGluZUl0ZW0oaW5saW5lSXRlbSwgbG9naWNhbFdpZHRoKTsKKyAgICAgICAg
ICAgIGN1cnJlbnRMb2dpY2FsUmlnaHQgKz0gbG9naWNhbFdpZHRoOworICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNMaW5lQnJlYWsoKSB8
fCBpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkgeworICAgICAgICAgICAgLy8g
U2luY2UgYm90aCA8YnI+IGFuZCA8d2JyPiBhcmUgZXhwbGljaXQgd29yZCBicmVhayBvcHBvcnR1
bml0aWVzIHRoZXkgaGF2ZSB0byBiZSB0cmFpbGluZyBpdGVtcyBpbiB0aGlzIGNhbmRpZGF0ZSBy
dW4gbGlzdCB1bmxlc3MgdGhleSBhcmUgZW1iZWRkZWQgaW4gaW5saW5lIGJveGVzLgorICAgICAg
ICAgICAgLy8gZS5nLiA8c3Bhbj48d2JyPjwvc3Bhbj4KKyNpZiBBU1NFUlRfRU5BQkxFRAorICAg
ICAgICAgICAgZm9yIChhdXRvIGkgPSBpbmRleCArIDE7IGkgPCBzb2Z0V3JhcE9wcG9ydHVuaXR5
SW5kZXg7ICsraSkKKyAgICAgICAgICAgICAgICBBU1NFUlQobV9pbmxpbmVJdGVtc1tpXS5pc0lu
bGluZUJveEVuZCgpKTsKKyNlbmRpZgorICAgICAgICAgICAgaW5saW5lSXRlbS5pc0xpbmVCcmVh
aygpID8gbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmFwcGVuZFRyYWlsaW5nTGluZUJyZWFr
KGlubGluZUl0ZW0pIDogbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmFwcGVuZHRyYWlsaW5n
V29yZEJyZWFrT3Bwb3J0dW5pdHkoaW5saW5lSXRlbSk7CisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgYXV0
byBpbmxpbmVDb250ZW50RW5kc0luU29mdFdyYXBPcHBvcnR1bml0eSA9IFsmXSB7CisgICAgICAg
IGlmICghc29mdFdyYXBPcHBvcnR1bml0eUluZGV4IHx8IHNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRl
eCA9PSBsYXlvdXRSYW5nZS5lbmQpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgY2FuZGlkYXRlIGlu
bGluZSBjb250ZW50IGVuZHMgYmVjYXVzZSB0aGUgZW50aXJlIGNvbnRlbnQgZW5kcyBhbmQgbm90
IGJlY2F1c2UgdGhlcmUncyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eS4KKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9pbmxpbmVJdGVtc1tzb2Z0V3Jh
cE9wcG9ydHVuaXR5SW5kZXggLSAxXS5pc0Zsb2F0KCkpIHsKKyAgICAgICAgICAgIC8vIFdoaWxl
IHdlIHN0b3AgYXQgZmxvYXRzLCB0aGV5IGFyZSBub3QgY29uc2lkZXJlZCByZWFsIHNvZnQgd3Jh
cCBvcHBvcnR1bml0aWVzLiAKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQor
ICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10ZXh0LTMvI2xpbmUtYnJl
YWstZGV0YWlscworICAgICAgICBhdXRvJiB0cmFpbGluZ0lubGluZUl0ZW0gPSBtX2lubGluZUl0
ZW1zW3NvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCAtIDFdOworICAgICAgICBpZiAodHJhaWxpbmdJ
bmxpbmVJdGVtLmlzQm94KCkgfHwgdHJhaWxpbmdJbmxpbmVJdGVtLmlzTGluZUJyZWFrKCkgfHwg
dHJhaWxpbmdJbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSB8fCB0cmFpbGluZ0lu
bGluZUl0ZW0uaXNJbmxpbmVCb3hFbmQoKSkgeworICAgICAgICAgICAgLy8gRm9yIFdlYi1jb21w
YXRpYmlsaXR5IHRoZXJlIGlzIGEgc29mdCB3cmFwIG9wcG9ydHVuaXR5IGJlZm9yZSBhbmQgYWZ0
ZXIgZWFjaCByZXBsYWNlZCBlbGVtZW50IG9yIG90aGVyIGF0b21pYyBpbmxpbmUuCisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhaWxpbmdJbmxpbmVJ
dGVtLmlzVGV4dCgpKSB7CisgICAgICAgICAgICBhdXRvJiBpbmxpbmVUZXh0SXRlbSA9IGRvd25j
YXN0PElubGluZVRleHRJdGVtPih0cmFpbGluZ0lubGluZUl0ZW0pOworICAgICAgICAgICAgaWYg
KGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICAgICAgLy8gTm93IGluIGNhc2Ugb2Ygbm9uLXdoaXRlc3BhY2UgdHJhaWxp
bmcgY29udGVudCwgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgYWN0dWFsIHNvZnQgd3JhcCBvcHBv
cnR1bml0eSBiZWxvbmdzIHRvIHRoZSBuZXh0IHNldC4KKyAgICAgICAgICAgIC8vIGUuZy4gInRo
aXNfaXNfdGhlX3RyYWlsaW5nX3J1bjxzcGFuPiA8LWJ1dF90aGlzX3NwYWNlX2hlcmVfaXNfdGhl
X3NvZnRfd3JhcF9vcHBvcnR1bml0eSIKKyAgICAgICAgICAgIC8vIFdoZW4gdGhlcmUncyBhbiBp
bmxpbmUgYm94IHN0YXJ0KDxzcGFuPikvZW5kKDwvc3Bhbj4pIGJldHdlZW4gdGhlIHRyYWlsaW5n
IGFuZCB0aGUgKG5leHQpbGVhZGluZyBydW4sIHdoaWxlIHdlIGJyZWFrIGJlZm9yZSB0aGUgaW5s
aW5lIGJveCBzdGFydCAoPHNwYW4+KQorICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzb2Z0IHdy
YXAgcG9zaXRpb24gaXMgYWZ0ZXIgdGhlIGlubGluZSBib3ggc3RhcnQgKDxzcGFuPikgYnV0IGlu
IHRlcm1zIG9mIGxpbmUgYnJlYWtpbmcgY29udGludWl0eSB0aGUgaW5saW5lIGJveCBzdGFydCAo
PHNwYW4+KSBhbmQgdGhlIHdoaXRlc3BhY2UgcnVuIGJlbG9uZyB0b2dldGhlci4KKyAgICAgICAg
ICAgIFJFTEVBU0VfQVNTRVJUKGxheW91dFJhbmdlLmVuZCA8PSBtX2lubGluZUl0ZW1zLnNpemUo
KSk7CisgICAgICAgICAgICBmb3IgKGF1dG8gaW5kZXggPSBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5k
ZXg7IGluZGV4IDwgbGF5b3V0UmFuZ2UuZW5kOyArK2luZGV4KSB7CisgICAgICAgICAgICAgICAg
aWYgKG1faW5saW5lSXRlbXNbaW5kZXhdLmlzSW5saW5lQm94U3RhcnQoKSB8fCBtX2lubGluZUl0
ZW1zW2luZGV4XS5pc0lubGluZUJveEVuZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogQ2hlY2sgaWYgW25vbi13aGl0ZXNwYWNlXVtp
bmxpbmUtYm94XVtuby13aGl0ZXNwYWNlXSBjb250ZW50IGhhcyBydWxlcyBhYm91dCBpdC4KKyAg
ICAgICAgICAgICAgICAvLyBGb3Igbm93IGxldCdzIHNheSB0aGUgc29mdCB3cmFwIHBvc2l0aW9u
IGJlbG9uZ3MgdG8gdGhlIG5leHQgc2V0IG9mIHJ1bnMgd2hlbiBbbm9uLXdoaXRlc3BhY2VdW2lu
bGluZS1ib3hdW3doaXRlc3BhY2VdLCBbbm9uLXdoaXRlc3BhY2VdW2lubGluZS1ib3hdW2JveF0g
ZXRjLgorICAgICAgICAgICAgICAgIHJldHVybiBtX2lubGluZUl0ZW1zW2luZGV4XS5pc1RleHQo
KSAmJiAhZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KG1faW5saW5lSXRlbXNbaW5kZXhdKS5pc1do
aXRlc3BhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICB9CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9OworICAgIGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVudC5zZXRIYXNUcmFpbGlu
Z1NvZnRXcmFwT3Bwb3J0dW5pdHkoaW5saW5lQ29udGVudEVuZHNJblNvZnRXcmFwT3Bwb3J0dW5p
dHkoKSk7Cit9CisKK3NpemVfdCBMaW5lQnVpbGRlcjo6bmV4dFdyYXBPcHBvcnR1bml0eShzaXpl
X3Qgc3RhcnRJbmRleCwgY29uc3QgTGluZUJ1aWxkZXI6OklubGluZUl0ZW1SYW5nZSYgbGF5b3V0
UmFuZ2UpIGNvbnN0Cit7CisgICAgLy8gMS4gRmluZCB0aGUgc3RhcnQgY2FuZGlkYXRlIGJ5IHNr
aXBwaW5nIGxlYWRpbmcgbm9uLWNvbnRlbnQgaXRlbXMgZS5nICI8c3Bhbj48c3Bhbj5zdGFydCIu
IE9wcG9ydHVuaXR5IGlzIGFmdGVyICI8c3Bhbj48c3Bhbj4iLgorICAgIC8vIDIuIEZpbmQgdGhl
IGVuZCBjYW5kaWRhdGUgYnkgc2tpcHBpbmcgbm9uLWNvbnRlbnQgaXRlbXMgaW5iZXR3ZWVuIGUu
Zy4gIjxzcGFuPjxzcGFuPnN0YXJ0PC9zcGFuPmVuZCIuIE9wcG9ydHVuaXR5IGlzIGFmdGVyICI8
L3NwYW4+Ii4KKyAgICAvLyAzLiBDaGVjayBpZiB0aGVyZSdzIGEgc29mdCB3cmFwIG9wcG9ydHVu
aXR5IGJldHdlZW4gdGhlIDIgY2FuZGlkYXRlIGlubGluZSBpdGVtcyBhbmQgcmVwZWF0LgorICAg
IC8vIDQuIEFueSBmb3JjZSBsaW5lIGJyZWFrL2V4cGxpY2l0IHdyYXAgY29udGVudCBpbmJldHdl
ZW4gaXMgY29uc2lkZXJlZCBhcyB3cmFwIG9wcG9ydHVuaXR5LgorCisgICAgLy8gW2V4LV1baW5s
aW5lIGJveCBzdGFydF1baW5saW5lIGJveCBlbmRdW2Zsb2F0XVthbXBsZV0gKGV4LTxzcGFuPjwv
c3Bhbj48ZGl2IHN0eWxlPSJmbG9hdDpsZWZ0Ij48L2Rpdj5hbXBsZSkuIFdyYXAgaW5kZXggaXMg
YXQgW2V4LV0uCisgICAgLy8gW2V4XVtpbmxpbmUgYm94IHN0YXJ0XVthbXAtXVtpbmxpbmUgYm94
IHN0YXJ0XVtsZV0gKGV4PHNwYW4+YW1wLTxzcGFuPmFtcGxlKS4gV3JhcCBpbmRleCBpcyBhdCBb
YW1wLV0uCisgICAgLy8gW2V4LV1baW5saW5lIGJveCBzdGFydF1bbGluZSBicmVha11bYW1wbGVd
IChleC08c3Bhbj48YnI+YW1wbGUpLiBXcmFwIGluZGV4IGlzIGFmdGVyIFticl0uCisgICAgYXV0
byBwcmV2aW91c0lubGluZUl0ZW1JbmRleCA9IE9wdGlvbmFsPHNpemVfdD4geyB9OworICAgIGZv
ciAoYXV0byBpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDwgbGF5b3V0UmFuZ2UuZW5kOyArK2lu
ZGV4KSB7CisgICAgICAgIGF1dG8mIGlubGluZUl0ZW0gPSBtX2lubGluZUl0ZW1zW2luZGV4XTsK
KyAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNMaW5lQnJlYWsoKSB8fCBpbmxpbmVJdGVtLmlzV29y
ZEJyZWFrT3Bwb3J0dW5pdHkoKSkgeworICAgICAgICAgICAgLy8gV2UgYWx3YXlzIHN0b3AgYXQg
ZXhwbGljaXQgd3JhcHBpbmcgb3Bwb3J0dW5pdGllcyBlLmcuIDxicj4uIEhvd2V2ZXIgdGhlIHdy
YXAgcG9zaXRpb24gbWF5IGJlIGF0IGxhdGVyIHBvc2l0aW9uLgorICAgICAgICAgICAgLy8gZS5n
LiA8c3Bhbj48c3Bhbj48YnI+PC9zcGFuPjwvc3Bhbj4gPC0gd3JhcCBwb3NpdGlvbiBpcyBhZnRl
ciB0aGUgc2Vjb25kIDwvc3Bhbj4KKyAgICAgICAgICAgIC8vIGJ1dCBpbiBjYXNlIG9mIDxzcGFu
Pjxicj48c3Bhbj48L3NwYW4+PC9zcGFuPiA8LSB3cmFwIHBvc2l0aW9uIGlzIHJpZ2h0IGFmdGVy
IDxicj4uCisgICAgICAgICAgICBmb3IgKCsraW5kZXg7IGluZGV4IDwgbGF5b3V0UmFuZ2UuZW5k
ICYmIG1faW5saW5lSXRlbXNbaW5kZXhdLmlzSW5saW5lQm94RW5kKCk7ICsraW5kZXgpIHsgfQor
ICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CisgICAgICAgIGlmIChpbmxpbmVJ
dGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpIHsK
KyAgICAgICAgICAgIC8vIE5lZWQgdG8gc2VlIHdoYXQgY29tZXMgbmV4dCB0byBkZWNpZGUuCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlQoaW5saW5lSXRl
bS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlzQm94KCkgfHwgaW5saW5lSXRlbS5pc0Zsb2F0KCkp
OworICAgICAgICBpZiAoIXByZXZpb3VzSW5saW5lSXRlbUluZGV4KSB7CisgICAgICAgICAgICBw
cmV2aW91c0lubGluZUl0ZW1JbmRleCA9IGluZGV4OworICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBwcmV2aW91cyBhbmQgY3VycmVudCBp
dGVtcyBhcmUgbm90IG5lY2Vzc2FyaWx5IGFkamFjZW50IGl0ZW1zIGUuZyAicHJldmlvdXM8c3Bh
bj5jdXJyZW50PC9zcGFuPiIKKyAgICAgICAgYXV0byYgcHJldmlvdXNJdGVtID0gbV9pbmxpbmVJ
dGVtc1sqcHJldmlvdXNJbmxpbmVJdGVtSW5kZXhdOworICAgICAgICBhdXRvJiBjdXJyZW50SXRl
bSA9IG1faW5saW5lSXRlbXNbaW5kZXhdOworICAgICAgICBpZiAoaXNBdFNvZnRXcmFwT3Bwb3J0
dW5pdHkobV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dCwgcHJldmlvdXNJdGVtLCBjdXJyZW50SXRl
bSkpIHsKKyAgICAgICAgICAgIGlmICgqcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggKyAxID09IGlu
ZGV4ICYmICghcHJldmlvdXNJdGVtLmlzVGV4dCgpIHx8ICFjdXJyZW50SXRlbS5pc1RleHQoKSkp
IHsKKyAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGtub3cgdGhlIGV4YWN0IHNvZnQgd3JhcCBv
cHBvcnR1bml0eSBpbmRleCB3aGVuIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBpdGVtcyBhcmUg
bmV4dCB0byBlYWNoIG90aGVyLgorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRoZXJlJ3MgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkg
YmV0d2VlbiAncHJldmlvdXNJbmxpbmVJdGVtSW5kZXgnIGFuZCAnaW5kZXgnLgorICAgICAgICAg
ICAgLy8gTm93IGZvcndhcmQtZmluZCBmcm9tIHRoZSBzdGFydCBwb3NpdGlvbiB0byBzZWUgd2hl
cmUgd2UgY2FuIGFjdHVhbGx5IHdyYXAuCisgICAgICAgICAgICAvLyBbZXgtXVthbXBsZV0gdnMu
IFtleC1dW2lubGluZSBib3ggc3RhcnRdW2lubGluZSBib3ggZW5kXVthbXBsZV0KKyAgICAgICAg
ICAgIC8vIHdoZXJlIFtleC1dIGlzIHN0YXJ0Q29udGVudCBhbmQgW2FtcGxlXSBpcyB0aGUgbmV4
dENvbnRlbnQuCisgICAgICAgICAgICBmb3IgKGF1dG8gY2FuZGlkYXRlSW5kZXggPSAqcHJldmlv
dXNJbmxpbmVJdGVtSW5kZXggKyAxOyBjYW5kaWRhdGVJbmRleCA8IGluZGV4OyArK2NhbmRpZGF0
ZUluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKG1faW5saW5lSXRlbXNbY2FuZGlkYXRlSW5k
ZXhdLmlzSW5saW5lQm94U3RhcnQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUg
Y29udGVudCBhbmQgW2lubGluZSBib3ggc3RhcnRdIGFuZCBbaW5saW5lIGJveCBlbmRdIGZvcm0g
dW5icmVha2FibGUgY29udGVudC4KKyAgICAgICAgICAgICAgICAgICAgLy8gZXgtPHNwYW4+PC9z
cGFuPmFtcGxlICA6IHdyYXAgb3Bwb3J0dW5pdHkgaXMgYWZ0ZXIgImV4LSIuCisgICAgICAgICAg
ICAgICAgICAgIC8vIGV4LTwvc3Bhbj48L3NwYW4+YW1wbGUgOiB3cmFwIG9wcG9ydHVuaXR5IGlz
IGFmdGVyICJleC08L3NwYW4+PC9zcGFuPiIuCisgICAgICAgICAgICAgICAgICAgIC8vIGV4LTwv
c3Bhbj48c3Bhbj5hbXBsZTwvc3Bhbj4gOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC08
L3NwYW4+Ii4KKyAgICAgICAgICAgICAgICAgICAgLy8gZXgtPHNwYW4+PHNwYW4+YW1wbGU8L3Nw
YW4+PC9zcGFuPiA6IHdyYXAgb3Bwb3J0dW5pdHkgaXMgYWZ0ZXIgImV4LSIuCisgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVJbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAg
cHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBpbmRleDsKKyAgICB9CisgICAgcmV0dXJuIGxheW91
dFJhbmdlLmVuZDsKK30KKwordm9pZCBMaW5lQnVpbGRlcjo6aGFuZGxlRmxvYXRDb250ZW50KGNv
bnN0IElubGluZUl0ZW0mIGZsb2F0SXRlbSkKK3sKKyAgICBhdXRvJiBmbG9hdEJveCA9IGZsb2F0
SXRlbS5sYXlvdXRCb3goKTsKKyAgICBtX2Zsb2F0cy5hcHBlbmQoJmZsb2F0Qm94KTsKKworICAg
IGF1dG8qIGZsb2F0aW5nU3RhdGUgPSB0aGlzLT5mbG9hdGluZ1N0YXRlKCk7CisgICAgaWYgKCFm
bG9hdGluZ1N0YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQoZm9ybWF0dGluZ1N0
YXRlKCkpOworICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCktPmJveEdl
b21ldHJ5KGZsb2F0Qm94KTsKKyAgICAvLyBTZXQgc3RhdGljIHBvc2l0aW9uIGZpcnN0LgorICAg
IGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KExheW91dFBvaW50IHsgbV9saW5lTG9naWNh
bFJlY3QudG9wTGVmdCgpIH0pOworICAgIC8vIEZsb2F0IGl0LgorICAgIEFTU0VSVChtX3Jvb3RI
b3Jpem9udGFsQ29uc3RyYWludHMpOworICAgIGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRp
bmdDb250ZXh0IHsgZm9ybWF0dGluZ0NvbnRleHQoKSwgKmZsb2F0aW5nU3RhdGUgfTsKKyAgICBh
dXRvIGZsb2F0aW5nUG9zaXRpb24gPSBmbG9hdGluZ0NvbnRleHQucG9zaXRpb25Gb3JGbG9hdChm
bG9hdEJveCwgKm1fcm9vdEhvcml6b250YWxDb25zdHJhaW50cyk7CisgICAgYm94R2VvbWV0cnku
c2V0TG9naWNhbFRvcExlZnQoZmxvYXRpbmdQb3NpdGlvbik7CisgICAgZmxvYXRpbmdTdGF0ZS0+
YXBwZW5kKGZsb2F0aW5nQ29udGV4dC50b0Zsb2F0SXRlbShmbG9hdEJveCkpOworICAgIC8vIENo
ZWNrIGlmIHRoaXMgZmxvYXQgc2hyaW5rcyB0aGUgbGluZSAodGhleSBkb24ndCBnZXQgcG9zaXRp
b25lZCBoaWdoZXIgdGhhbiB0aGUgbGluZSkuCisgICAgaWYgKGZsb2F0aW5nUG9zaXRpb24ueSgp
ID4gbV9saW5lTG9naWNhbFJlY3QuYm90dG9tKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
Y29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0ID0gdHJ1ZTsKKyAgICBhdXRvIGZsb2F0Qm94V2lk
dGggPSBpbmxpbmVJdGVtV2lkdGgoZmxvYXRJdGVtLCB7IH0pOworICAgIGlmIChmbG9hdEJveC5p
c0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgbV9saW5lTG9naWNhbFJlY3Quc2V0
TGVmdChtX2xpbmVMb2dpY2FsUmVjdC5sZWZ0KCkgKyBmbG9hdEJveFdpZHRoKTsgICAgCisgICAg
bV9saW5lTG9naWNhbFJlY3QuZXhwYW5kSG9yaXpvbnRhbGx5KC1mbG9hdEJveFdpZHRoKTsKK30K
KworTGluZUJ1aWxkZXI6OlJlc3VsdCBMaW5lQnVpbGRlcjo6aGFuZGxlSW5saW5lQ29udGVudChJ
bmxpbmVDb250ZW50QnJlYWtlciYgaW5saW5lQ29udGVudEJyZWFrZXIsIGNvbnN0IElubGluZUl0
ZW1SYW5nZSYgbGF5b3V0UmFuZ2UsIGNvbnN0IExpbmVDYW5kaWRhdGUmIGxpbmVDYW5kaWRhdGUp
Cit7CisgICAgYXV0byYgaW5saW5lQ29udGVudCA9IGxpbmVDYW5kaWRhdGUuaW5saW5lQ29udGVu
dDsKKyAgICBpZiAoaW5saW5lQ29udGVudC5jb250aW51b3VzQ29udGVudCgpLnJ1bnMoKS5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgQVNTRVJUKGlubGluZUNvbnRlbnQudHJhaWxpbmdMaW5lQnJlYWso
KSB8fCBpbmxpbmVDb250ZW50LnRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7CisgICAg
ICAgIHJldHVybiB7IGlubGluZUNvbnRlbnQudHJhaWxpbmdMaW5lQnJlYWsoKSA/IElubGluZUNv
bnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzIDogSW5saW5lQ29udGVudEJyZWFrZXI6Oklz
RW5kT2ZMaW5lOjpObyB9OworICAgIH0KKyAgICBhdXRvIHNob3VsZERpc2FibGVIeXBoZW5hdGlv
biA9IFsmXSB7CisgICAgICAgIGF1dG8mIHN0eWxlID0gcm9vdCgpLnN0eWxlKCk7CisgICAgICAg
IHVuc2lnbmVkIGxpbWl0TGluZXMgPSBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMoKSA9PSBS
ZW5kZXJTdHlsZTo6aW5pdGlhbEh5cGhlbmF0aW9uTGltaXRMaW5lcygpID8gc3RkOjpudW1lcmlj
X2xpbWl0czx1bnNpZ25lZD46Om1heCgpIDogc3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCk7
CisgICAgICAgIHJldHVybiBtX3N1Y2Nlc3NpdmVIeXBoZW5hdGVkTGluZUNvdW50ID49IGxpbWl0
TGluZXM7CisgICAgfTsKKyAgICBpZiAoc2hvdWxkRGlzYWJsZUh5cGhlbmF0aW9uKCkpCisgICAg
ICAgIGlubGluZUNvbnRlbnRCcmVha2VyLnNldEh5cGhlbmF0aW9uRGlzYWJsZWQoKTsKKworICAg
IGF1dG8mIGNvbnRpbnVvdXNJbmxpbmVDb250ZW50ID0gbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250
ZW50LmNvbnRpbnVvdXNDb250ZW50KCk7CisgICAgYXV0byBsaW5lTG9naWNhbFJlY3RGb3JDYW5k
aWRhdGVDb250ZW50ID0gWyZdIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBj
b250ZW50IHdvdWxkIHN0cmV0Y2ggdGhlIGxpbmUgYW5kIHdoZXRoZXIgYWRkaXRpb25hbCBmbG9h
dHMgYXJlIGdldHRpbmcgaW4gdGhlIHdheS4KKyAgICAgICAgaWYgKCFmbG9hdGluZ1N0YXRlKCkg
fHwgIWlubGluZUNvbnRlbnQuaGFzSW5saW5lTGV2ZWxCb3goKSkKKyAgICAgICAgICAgIHJldHVy
biBtX2xpbmVMb2dpY2FsUmVjdDsKKyAgICAgICAgYXV0byBtYXhpbXVtTGluZUxvZ2ljYWxIZWln
aHQgPSBtX2xpbmVMb2dpY2FsUmVjdC5oZWlnaHQoKTsKKyAgICAgICAgZm9yIChhdXRvJiBydW4g
OiBjb250aW51b3VzSW5saW5lQ29udGVudC5ydW5zKCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1F
OiBBZGQgc3VwcG9ydCBmb3IgaW5saW5lIGJveGVzIHRvby4KKyAgICAgICAgICAgIGlmICghcnVu
LmlubGluZUl0ZW0uaXNCb3goKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIG1heGltdW1MaW5lTG9naWNhbEhlaWdodCA9IHN0ZDo6bWF4KG1heGltdW1MaW5lTG9naWNh
bEhlaWdodCwgSW5saW5lTGF5b3V0VW5pdCB7IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlG
b3JCb3gocnVuLmlubGluZUl0ZW0ubGF5b3V0Qm94KCkpLm1hcmdpbkJveEhlaWdodCgpIH0pOwor
ICAgICAgICB9CisgICAgICAgIGlmIChtYXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQgPT0gbV9saW5l
TG9naWNhbFJlY3QuaGVpZ2h0KCkpCisgICAgICAgICAgICByZXR1cm4gbV9saW5lTG9naWNhbFJl
Y3Q7CisgICAgICAgIGF1dG8gYWRqdXN0ZWRMaW5lTG9naWNhbFJlY3QgPSBJbmxpbmVSZWN0IHsg
bV9saW5lTG9naWNhbFJlY3QudG9wKCksIG1fbGluZUxvZ2ljYWxSZWN0LmxlZnQoKSwgbV9saW5l
TG9naWNhbFJlY3Qud2lkdGgoKSwgbWF4aW11bUxpbmVMb2dpY2FsSGVpZ2h0IH07CisgICAgICAg
IGlmIChhdXRvIGhvcml6b250YWxDb25zdHJhaW50cyA9IGZsb2F0Q29uc3RyYWludHMoYWRqdXN0
ZWRMaW5lTG9naWNhbFJlY3QpKSB7CisgICAgICAgICAgICBhZGp1c3RlZExpbmVMb2dpY2FsUmVj
dC5zZXRMZWZ0KGhvcml6b250YWxDb25zdHJhaW50cy0+bG9naWNhbExlZnQpOworICAgICAgICAg
ICAgYWRqdXN0ZWRMaW5lTG9naWNhbFJlY3Quc2V0V2lkdGgoaG9yaXpvbnRhbENvbnN0cmFpbnRz
LT5sb2dpY2FsV2lkdGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGp1c3RlZExpbmVM
b2dpY2FsUmVjdDsKKyAgICB9KCk7CisgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IFsmXSB7Cisg
ICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGhGb3JDb250ZW50ID0gbGluZUxvZ2ljYWxSZWN0Rm9y
Q2FuZGlkYXRlQ29udGVudC53aWR0aCgpIC0gbV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKTsK
KyAgICAgICAgcmV0dXJuIHN0ZDo6aXNuYW4oYXZhaWxhYmxlV2lkdGhGb3JDb250ZW50KSA/IG1h
eElubGluZUxheW91dFVuaXQoKSA6IGF2YWlsYWJsZVdpZHRoRm9yQ29udGVudDsKKyAgICB9KCk7
CisgICAgLy8gV2hpbGUgdGhlIGZsb2F0cyBhcmUgbm90IGNvbnNpZGVyZWQgdG8gYmUgb24gdGhl
IGxpbmUsIHRoZXkgbWFrZSB0aGUgbGluZSBjb250ZW50ZnVsIGZvciBsaW5lIGJyZWFraW5nLgor
ICAgIGF1dG8gbGluZUhhc0NvbnRlbnQgPSAhbV9saW5lLnJ1bnMoKS5pc0VtcHR5KCkgfHwgbV9j
b250ZW50SXNDb25zdHJhaW5lZEJ5RmxvYXQ7CisgICAgYXV0byBsaW5lU3RhdHVzID0gSW5saW5l
Q29udGVudEJyZWFrZXI6OkxpbmVTdGF0dXMgeyBtX2xpbmUuY29udGVudExvZ2ljYWxSaWdodCgp
LCBhdmFpbGFibGVXaWR0aCwgbV9saW5lLnRyaW1tYWJsZVRyYWlsaW5nV2lkdGgoKSwgbV9saW5l
LnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCksIG1fbGluZS5pc1RyYWlsaW5nUnVuRnVsbHlUcmlt
bWFibGUoKSwgbGluZUhhc0NvbnRlbnQsICFtX3dyYXBPcHBvcnR1bml0eUxpc3QuaXNFbXB0eSgp
IH07CisgICAgYXV0byByZXN1bHQgPSBpbmxpbmVDb250ZW50QnJlYWtlci5wcm9jZXNzSW5saW5l
Q29udGVudChjb250aW51b3VzSW5saW5lQ29udGVudCwgbGluZVN0YXR1cyk7CisgICAgYXV0byYg
Y2FuZGlkYXRlUnVucyA9IGNvbnRpbnVvdXNJbmxpbmVDb250ZW50LnJ1bnMoKTsKKyAgICBpZiAo
cmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rpb246Oktl
ZXApIHsKKyAgICAgICAgLy8gVGhpcyBjb250aW51b3VzIGNvbnRlbnQgY2FuIGJlIGZ1bGx5IHBs
YWNlZCBvbiB0aGUgY3VycmVudCBsaW5lLgorICAgICAgICBtX2xpbmVMb2dpY2FsUmVjdCA9IGxp
bmVMb2dpY2FsUmVjdEZvckNhbmRpZGF0ZUNvbnRlbnQ7CisgICAgICAgIGZvciAoYXV0byYgcnVu
IDogY2FuZGlkYXRlUnVucykKKyAgICAgICAgICAgIG1fbGluZS5hcHBlbmQocnVuLmlubGluZUl0
ZW0sIHJ1bi5sb2dpY2FsV2lkdGgpOworICAgICAgICBpZiAobGluZUNhbmRpZGF0ZS5pbmxpbmVD
b250ZW50Lmhhc1RyYWlsaW5nU29mdFdyYXBPcHBvcnR1bml0eSgpKSB7CisgICAgICAgICAgICAv
LyBDaGVjayBpZiB3ZSBhcmUgYWxsb3dlZCB0byB3cmFwIGF0IHRoaXMgcG9zaXRpb24uCisgICAg
ICAgICAgICBhdXRvJiB0cmFpbGluZ0l0ZW0gPSBjYW5kaWRhdGVSdW5zLmxhc3QoKS5pbmxpbmVJ
dGVtOworICAgICAgICAgICAgLy8gRklYTUU6IFRoZXJlIG11c3QgYmUgYSB3YXkgdG8gZGVjaWRl
IGlmIHRoZSB0cmFpbGluZyBydW4gYWN0dWFsbHkgZW5kZWQgdXAgb24gdGhlIGxpbmUuCisgICAg
ICAgICAgICAvLyBMZXQncyBqdXN0IGRlYWwgd2l0aCBjb2xsYXBzZWQgbGVhZGluZyB3aGl0ZXNw
YWNlIGZvciBub3cuCisgICAgICAgICAgICBpZiAoIW1fbGluZS5ydW5zKCkuaXNFbXB0eSgpICYm
IElubGluZUNvbnRlbnRCcmVha2VyOjppc1dyYXBwaW5nQWxsb3dlZCh0cmFpbGluZ0l0ZW0pKQor
ICAgICAgICAgICAgICAgIG1fd3JhcE9wcG9ydHVuaXR5TGlzdC5hcHBlbmQoJnRyYWlsaW5nSXRl
bSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHsgcmVzdWx0LmlzRW5kT2ZMaW5lLCB7IGNh
bmRpZGF0ZVJ1bnMuc2l6ZSgpLCBmYWxzZSB9IH07CisgICAgfQorCisgICAgYXV0byBlbGlnaWJs
ZU92ZXJmbG93V2lkdGhBc0xlYWRpbmcgPSBbJl0gKCkgLT4gT3B0aW9uYWw8SW5saW5lTGF5b3V0
VW5pdD4geworICAgICAgICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIG90aGVyIHR5cGVzIG9m
IGNvbnRpbnVvdXMgY29udGVudC4KKyAgICAgICAgQVNTRVJUKHJlc3VsdC5hY3Rpb24gPT0gSW5s
aW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpXcmFwIHx8IHJlc3VsdC5hY3Rpb24g
PT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpCcmVhayk7CisgICAgICAg
IGlmIChjYW5kaWRhdGVSdW5zLnNpemUoKSAhPSAxIHx8ICFjYW5kaWRhdGVSdW5zLmZpcnN0KCku
aW5saW5lSXRlbS5pc1RleHQoKSkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisgICAgICAgIGF1
dG8mIGlubGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGNhbmRpZGF0ZVJ1
bnMuZmlyc3QoKS5pbmxpbmVJdGVtKTsKKyAgICAgICAgaWYgKGlubGluZVRleHRJdGVtLmlzV2hp
dGVzcGFjZSgpKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKyAgICAgICAgaWYgKHJlc3VsdC5h
Y3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpXcmFwKQorICAg
ICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVJ1bnMuZmlyc3QoKS5sb2dpY2FsV2lkdGg7CisgICAg
ICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFj
dGlvbjo6QnJlYWsgJiYgcmVzdWx0LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnQtPnBhcnRpYWxSdW4p
CisgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlUnVucy5maXJzdCgpLmxvZ2ljYWxXaWR0aCAt
IHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50LT5wYXJ0aWFsUnVuLT5sb2dpY2FsV2lkdGg7
CisgICAgICAgIHJldHVybiB7IH07CisgICAgfTsKKworICAgIGlmIChyZXN1bHQuYWN0aW9uID09
IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6V3JhcCkgeworICAgICAgICBB
U1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9m
TGluZTo6WWVzKTsKKyAgICAgICAgLy8gVGhpcyBjb250aW51b3VzIGNvbnRlbnQgY2FuJ3QgYmUg
cGxhY2VkIG9uIHRoZSBjdXJyZW50IGxpbmUuIE5vdGhpbmcgdG8gY29tbWl0IGF0IHRoaXMgdGlt
ZS4KKyAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZ
ZXMsIHsgfSwgeyB9LCBlbGlnaWJsZU92ZXJmbG93V2lkdGhBc0xlYWRpbmcoKSB9OworICAgIH0K
KyAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0OjpB
Y3Rpb246OldyYXBXaXRoSHlwaGVuKSB7CisgICAgICAgIEFTU0VSVChyZXN1bHQuaXNFbmRPZkxp
bmUgPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMpOworICAgICAgICAv
LyBUaGlzIGNvbnRpbnVvdXMgY29udGVudCBjYW4ndCBiZSBwbGFjZWQgb24gdGhlIGN1cnJlbnQg
bGluZSwgbm90aGluZyB0byBjb21taXQuCisgICAgICAgIC8vIEhvd2V2ZXIgd2UgbmVlZCB0byBt
YWtlIHN1cmUgdGhhdCB0aGUgY3VycmVudCBsaW5lIGdhaW5zIGEgdHJhaWxpbmcgaHlwaGVuLgor
ICAgICAgICBBU1NFUlQobV9saW5lLnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCkpOworICAgICAg
ICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBoZW4oKm1fbGluZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0
aCgpKTsKKyAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5l
OjpZZXMgfTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJy
ZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xhc3RXcmFwT3Bwb3J0dW5pdHkpIHsKKyAg
ICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6
SXNFbmRPZkxpbmU6Olllcyk7CisgICAgICAgIC8vIE5vdCBvbmx5IHRoaXMgY29udGVudCBjYW4n
dCBiZSBwbGFjZWQgb24gdGhlIGN1cnJlbnQgbGluZSwgYnV0IHdlIGV2ZW4gbmVlZCB0byByZXZl
cnQgdGhlIGxpbmUgYmFjayB0byBhbiBlYXJsaWVyIHBvc2l0aW9uLgorICAgICAgICBBU1NFUlQo
IW1fd3JhcE9wcG9ydHVuaXR5TGlzdC5pc0VtcHR5KCkpOworICAgICAgICByZXR1cm4geyBJbmxp
bmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllcywgeyByZWJ1aWxkTGluZShsYXlvdXRS
YW5nZSwgKm1fd3JhcE9wcG9ydHVuaXR5TGlzdC5sYXN0KCkpLCB0cnVlIH0gfTsKKyAgICB9Cisg
ICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0
aW9uOjpSZXZlcnRUb0xhc3ROb25PdmVyZmxvd2luZ1dyYXBPcHBvcnR1bml0eSkgeworICAgICAg
ICBBU1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0Vu
ZE9mTGluZTo6WWVzKTsKKyAgICAgICAgQVNTRVJUKCFtX3dyYXBPcHBvcnR1bml0eUxpc3QuaXNF
bXB0eSgpKTsKKyAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZM
aW5lOjpZZXMsIHsgcmVidWlsZExpbmVGb3JUcmFpbGluZ1NvZnRIeXBoZW4obGF5b3V0UmFuZ2Up
LCB0cnVlIH0gfTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVu
dEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpCcmVhaykgeworICAgICAgICBBU1NFUlQocmVzdWx0
LmlzRW5kT2ZMaW5lID09IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsK
KyAgICAgICAgLy8gQ29tbWl0IHRoZSBjb21iaW5hdGlvbiBvZiBmdWxsIGFuZCBwYXJ0aWFsIGNv
bnRlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgQVNTRVJUKHJlc3VsdC5wYXJ0aWFs
VHJhaWxpbmdDb250ZW50KTsKKyAgICAgICAgY29tbWl0UGFydGlhbENvbnRlbnQoY2FuZGlkYXRl
UnVucywgKnJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50KTsKKyAgICAgICAgLy8gV2hlbiBi
cmVha2luZyBtdWx0aXBsZSBydW5zIDxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay1hbGwi
PnRleHQ8L3NwYW4+PHNwYW4+Y29udGVudDwvc3Bhbj4sIHdlIG1pZ2h0IGVuZCB1cCBicmVha2lu
ZyB0aGVtIGF0IHJ1biBib3VuZGFyeS4KKyAgICAgICAgLy8gSXQgc2ltcGx5IG1lYW5zIHdlIGRv
bid0IHJlYWxseSBoYXZlIGEgcGFydGlhbCBydW4uIFBhcnRpYWwgY29udGVudCB5ZXMsIGJ1dCBu
b3QgcGFydGlhbCBydW4uCisgICAgICAgIGF1dG8gdHJhaWxpbmdSdW5JbmRleCA9IHJlc3VsdC5w
YXJ0aWFsVHJhaWxpbmdDb250ZW50LT50cmFpbGluZ1J1bkluZGV4OworICAgICAgICBhdXRvIGNv
bW1pdHRlZElubGluZUl0ZW1Db3VudCA9IHRyYWlsaW5nUnVuSW5kZXggKyAxOworICAgICAgICBp
ZiAoIXJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50LT5wYXJ0aWFsUnVuKQorICAgICAgICAg
ICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgY29t
bWl0dGVkSW5saW5lSXRlbUNvdW50LCBmYWxzZSB9IH07CisKKyAgICAgICAgYXV0byBwYXJ0aWFs
UnVuID0gKnJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50LT5wYXJ0aWFsUnVuOworICAgICAg
ICBhdXRvJiB0cmFpbGluZ0lubGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+
KGNhbmRpZGF0ZVJ1bnNbdHJhaWxpbmdSdW5JbmRleF0uaW5saW5lSXRlbSk7CisgICAgICAgIEFT
U0VSVChwYXJ0aWFsUnVuLmxlbmd0aCA8IHRyYWlsaW5nSW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkp
OworICAgICAgICBhdXRvIG92ZXJmbG93TGVuZ3RoID0gdHJhaWxpbmdJbmxpbmVUZXh0SXRlbS5s
ZW5ndGgoKSAtIHBhcnRpYWxSdW4ubGVuZ3RoOworICAgICAgICByZXR1cm4geyBJbmxpbmVDb250
ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllcywgeyBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQs
IGZhbHNlIH0sIG92ZXJmbG93TGVuZ3RoLCBlbGlnaWJsZU92ZXJmbG93V2lkdGhBc0xlYWRpbmco
KSB9OworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4geyBJbmxp
bmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Ok5vIH07Cit9CisKK3ZvaWQgTGluZUJ1aWxk
ZXI6OmNvbW1pdFBhcnRpYWxDb250ZW50KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250
aW51b3VzQ29udGVudDo6UnVuTGlzdCYgcnVucywgY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6
OlJlc3VsdDo6UGFydGlhbFRyYWlsaW5nQ29udGVudCYgcGFydGlhbFRyYWlsaW5nQ29udGVudCkK
K3sKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcnVucy5zaXplKCk7ICsraW5k
ZXgpIHsKKyAgICAgICAgYXV0byYgcnVuID0gcnVuc1tpbmRleF07CisgICAgICAgIGlmIChwYXJ0
aWFsVHJhaWxpbmdDb250ZW50LnRyYWlsaW5nUnVuSW5kZXggPT0gaW5kZXgpIHsKKyAgICAgICAg
ICAgIC8vIENyZWF0ZSBhbmQgY29tbWl0IHBhcnRpYWwgdHJhaWxpbmcgaXRlbS4KKyAgICAgICAg
ICAgIGlmIChhdXRvIHBhcnRpYWxSdW4gPSBwYXJ0aWFsVHJhaWxpbmdDb250ZW50LnBhcnRpYWxS
dW4pIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQocnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpOwor
ICAgICAgICAgICAgICAgIGF1dG8mIHRyYWlsaW5nSW5saW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJ
bmxpbmVUZXh0SXRlbT4ocnVuc1twYXJ0aWFsVHJhaWxpbmdDb250ZW50LnRyYWlsaW5nUnVuSW5k
ZXhdLmlubGluZUl0ZW0pOworICAgICAgICAgICAgICAgIGF1dG8gcGFydGlhbFRyYWlsaW5nVGV4
dEl0ZW0gPSB0cmFpbGluZ0lubGluZVRleHRJdGVtLmxlZnQocGFydGlhbFJ1bi0+bGVuZ3RoKTsK
KyAgICAgICAgICAgICAgICBtX2xpbmUuYXBwZW5kKHBhcnRpYWxUcmFpbGluZ1RleHRJdGVtLCBw
YXJ0aWFsUnVuLT5sb2dpY2FsV2lkdGgpOworICAgICAgICAgICAgICAgIGlmIChhdXRvIGh5cGhl
bldpZHRoID0gcGFydGlhbFJ1bi0+aHlwaGVuV2lkdGgpCisgICAgICAgICAgICAgICAgICAgIG1f
bGluZS5hZGRUcmFpbGluZ0h5cGhlbigqaHlwaGVuV2lkdGgpOworICAgICAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRoZSBwYXJ0aWFsIHJ1biBpcyB0
aGUgbGFzdCBjb250ZW50IHRvIGNvbW1pdC4KKyAgICAgICAgICAgIG1fbGluZS5hcHBlbmQocnVu
LmlubGluZUl0ZW0sIHJ1bi5sb2dpY2FsV2lkdGgpOworICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CisgICAgICAgIG1fbGluZS5hcHBlbmQocnVuLmlubGluZUl0ZW0sIHJ1bi5sb2dpY2Fs
V2lkdGgpOworICAgIH0KK30KKworc2l6ZV90IExpbmVCdWlsZGVyOjpyZWJ1aWxkTGluZShjb25z
dCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBjb25zdCBJbmxpbmVJdGVtJiBsYXN0SW5s
aW5lSXRlbVRvQWRkKQoreworICAgIEFTU0VSVCghbV93cmFwT3Bwb3J0dW5pdHlMaXN0LmlzRW1w
dHkoKSk7CisgICAgLy8gV2UgbWlnaHQgYWxyZWFkeSBoYXZlIGFkZGVkIGZsb2F0cy4gVGhleSBz
aHJpbmsgdGhlIGF2YWlsYWJsZSBob3Jpem9udGFsIHNwYWNlIGZvciB0aGUgbGluZS4KKyAgICAv
LyBMZXQncyBqdXN0IHJldXNlIHdoYXQgdGhlIGxpbmUgaGFzIGF0IHRoaXMgcG9pbnQuCisgICAg
bV9saW5lLmluaXRpYWxpemUoKTsKKyAgICBhdXRvIGN1cnJlbnRJdGVtSW5kZXggPSBsYXlvdXRS
YW5nZS5zdGFydDsKKyAgICBpZiAobV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtKSB7CisgICAgICAg
IG1fbGluZS5hcHBlbmQoKm1fcGFydGlhbExlYWRpbmdUZXh0SXRlbSwgaW5saW5lSXRlbVdpZHRo
KCptX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0sIHsgfSkpOworICAgICAgICBpZiAoJm1fcGFydGlh
bExlYWRpbmdUZXh0SXRlbS52YWx1ZSgpID09ICZsYXN0SW5saW5lSXRlbVRvQWRkKQorICAgICAg
ICAgICAgcmV0dXJuIDE7CisgICAgICAgICsrY3VycmVudEl0ZW1JbmRleDsKKyAgICB9CisgICAg
Zm9yICg7IGN1cnJlbnRJdGVtSW5kZXggPCBsYXlvdXRSYW5nZS5lbmQ7ICsrY3VycmVudEl0ZW1J
bmRleCkgeworICAgICAgICBhdXRvJiBpbmxpbmVJdGVtID0gbV9pbmxpbmVJdGVtc1tjdXJyZW50
SXRlbUluZGV4XTsKKyAgICAgICAgbV9saW5lLmFwcGVuZChpbmxpbmVJdGVtLCBpbmxpbmVJdGVt
V2lkdGgoaW5saW5lSXRlbSwgbV9saW5lLmNvbnRlbnRMb2dpY2FsUmlnaHQoKSkpOworICAgICAg
ICBpZiAoJmlubGluZUl0ZW0gPT0gJmxhc3RJbmxpbmVJdGVtVG9BZGQpCisgICAgICAgICAgICBy
ZXR1cm4gY3VycmVudEl0ZW1JbmRleCAtIGxheW91dFJhbmdlLnN0YXJ0ICsgMTsKKyAgICB9Cisg
ICAgcmV0dXJuIGxheW91dFJhbmdlLnNpemUoKTsKK30KKworc2l6ZV90IExpbmVCdWlsZGVyOjpy
ZWJ1aWxkTGluZUZvclRyYWlsaW5nU29mdEh5cGhlbihjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxh
eW91dFJhbmdlKQoreworICAgIEFTU0VSVCghbV93cmFwT3Bwb3J0dW5pdHlMaXN0LmlzRW1wdHko
KSk7CisgICAgLy8gUmV2ZXJ0IGFsbCB0aGUgd2F5IGJhY2sgdG8gYSB3cmFwIG9wcG9ydHVuaXR5
IHdoZW4gZWl0aGVyIGEgc29mdCBoeXBoZW4gZml0cyBvciBubyBoeXBoZW4gaXMgcmVxdWlyZWQu
CisgICAgZm9yIChhdXRvIGkgPSBtX3dyYXBPcHBvcnR1bml0eUxpc3Quc2l6ZSgpOyBpLS0gPiAx
OykgeworICAgICAgICBhdXRvJiBzb2Z0V3JhcE9wcG9ydHVuaXR5SXRlbSA9ICptX3dyYXBPcHBv
cnR1bml0eUxpc3RbaV07CisgICAgICAgIC8vIEZJWE1FOiBJZiB0aGlzIHR1cm5zIG91dCB0byBi
ZSBhIHBlcmYgaXNzdWUsIHdlIGNvdWxkIGFsc28gdHJhdmVyc2UgdGhlIHdyYXAgbGlzdCBhbmQg
a2VlcCBhZGRpbmcgdGhlIGl0ZW1zCisgICAgICAgIC8vIHdoaWxlIHdhdGNoaW5nIHRoZSBhdmFp
bGFibGUgd2lkdGggdmVyeSBjbG9zZWx5LgorICAgICAgICBhdXRvIGNvbW1pdHRlZENvdW50ID0g
cmVidWlsZExpbmUobGF5b3V0UmFuZ2UsIHNvZnRXcmFwT3Bwb3J0dW5pdHlJdGVtKTsKKyAgICAg
ICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkgLSBtX2xp
bmUuY29udGVudExvZ2ljYWxSaWdodCgpOworICAgICAgICBhdXRvIHRyYWlsaW5nU29mdEh5cGhl
bldpZHRoID0gbV9saW5lLnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCk7CisgICAgICAgIC8vIENo
ZWNrIGlmIHRoZSB0cmFpbGluZyBoeXBoZW4gbm93IGZpdHMgdGhlIGxpbmUgKG9yIHdlIGRvbid0
IG5lZWQgaHloZW4gYW55bW9yZSkuCisgICAgICAgIGlmICghdHJhaWxpbmdTb2Z0SHlwaGVuV2lk
dGggfHwgdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPD0gYXZhaWxhYmxlV2lkdGgpIHsKKyAgICAg
ICAgICAgIGlmICh0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCkKKyAgICAgICAgICAgICAgICBtX2xp
bmUuYWRkVHJhaWxpbmdIeXBoZW4oKnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKTsKKyAgICAgICAg
ICAgIHJldHVybiBjb21taXR0ZWRDb3VudDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBIYXZl
IGF0IGxlYXN0IHNvbWUgY29udGVudCBvbiB0aGUgbGluZS4KKyAgICBhdXRvIGNvbW1pdHRlZENv
dW50ID0gcmVidWlsZExpbmUobGF5b3V0UmFuZ2UsICptX3dyYXBPcHBvcnR1bml0eUxpc3QuZmly
c3QoKSk7CisgICAgaWYgKGF1dG8gdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPSBtX2xpbmUudHJh
aWxpbmdTb2Z0SHlwaGVuV2lkdGgoKSkKKyAgICAgICAgbV9saW5lLmFkZFRyYWlsaW5nSHlwaGVu
KCp0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCk7CisgICAgcmV0dXJuIGNvbW1pdHRlZENvdW50Owor
fQorCitib29sIExpbmVCdWlsZGVyOjppc0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQoY29uc3Qg
SW5saW5lSXRlbVJhbmdlJiBsaW5lUmFuZ2UsIHNpemVfdCBsYXN0SW5saW5lSXRlbUluZGV4LCBi
b29sIGhhc1BhcnRpYWxUcmFpbGluZ0NvbnRlbnQpIGNvbnN0Cit7CisgICAgaWYgKGhhc1BhcnRp
YWxUcmFpbGluZ0NvbnRlbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAobGluZVJh
bmdlLmVuZCA9PSBsYXN0SW5saW5lSXRlbUluZGV4KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAvLyBPbWl0IGZsb2F0cyB0byBzZWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBsaW5lIHdpdGggaW5s
aW5lIGNvbnRlbnQuCisgICAgZm9yIChhdXRvIGkgPSBsYXN0SW5saW5lSXRlbUluZGV4OyBpLS07
KSB7CisgICAgICAgIGlmICghbV9pbmxpbmVJdGVtc1tpXS5pc0Zsb2F0KCkpCisgICAgICAgICAg
ICByZXR1cm4gaSA9PSBsaW5lUmFuZ2UuZW5kIC0gMTsKKyAgICB9CisgICAgLy8gVGhlcmUgaGFz
IHRvIGJlIGF0IGxlYXN0IG9uZSBub24tZmxvYXQgaXRlbS4KKyAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2NvbnN0IENvbnRhaW5lckJveCYgTGluZUJ1
aWxkZXI6OnJvb3QoKSBjb25zdAoreworICAgIHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLnJv
b3QoKTsKK30KKworY29uc3QgTGF5b3V0U3RhdGUmIExpbmVCdWlsZGVyOjpsYXlvdXRTdGF0ZSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0KCkubGF5b3V0U3RhdGUoKTsK
K30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL0lubGluZUxpbmVCdWlsZGVyLmggYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVMaW5lQnVpbGRlci5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjBlMjE3MTUwNWVmZmI0MmZkZjBiMzIxNjQzYjM0M2Q4YzU1ZmNhZWYKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2lubGluZS9JbmxpbmVMaW5lQnVpbGRlci5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29w
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
KworI2luY2x1ZGUgIklubGluZUNvbnRlbnRCcmVha2VyLmgiCisjaW5jbHVkZSAiSW5saW5lRm9y
bWF0dGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiSW5saW5lTGluZS5oIgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgRmxvYXRpbmdDb250ZXh0Oworc3Ry
dWN0IExpbmVDYW5kaWRhdGU7CisKK2NsYXNzIExpbmVCdWlsZGVyIHsKK3B1YmxpYzoKKyAgICBM
aW5lQnVpbGRlcihJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYsIEZsb2F0aW5nU3RhdGUmLCBIb3Jp
em9udGFsQ29uc3RyYWludHMgcm9vdEhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgSW5saW5l
SXRlbXMmKTsKKyAgICBMaW5lQnVpbGRlcihjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYs
IGNvbnN0IElubGluZUl0ZW1zJik7CisKKyAgICBzdHJ1Y3QgSW5saW5lSXRlbVJhbmdlIHsKKyAg
ICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gc3RhcnQgPT0gZW5kOyB9CisgICAg
ICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gZW5kIC0gc3RhcnQ7IH0KKyAgICAgICAg
c2l6ZV90IHN0YXJ0IHsgMCB9OworICAgICAgICBzaXplX3QgZW5kIHsgMCB9OworICAgIH07Cisg
ICAgdXNpbmcgRmxvYXRMaXN0ID0gVmVjdG9yPGNvbnN0IEJveCo+OworICAgIHN0cnVjdCBMaW5l
Q29udGVudCB7CisgICAgICAgIElubGluZUl0ZW1SYW5nZSBpbmxpbmVJdGVtUmFuZ2U7CisgICAg
ICAgIHNpemVfdCBwYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoIHsgMCB9OworICAgICAgICBP
cHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxvd0xvZ2ljYWxXaWR0aDsKKyAgICAgICAg
Y29uc3QgRmxvYXRMaXN0JiBmbG9hdHM7CisgICAgICAgIGJvb2wgaGFzSW50cnVzaXZlRmxvYXQg
eyBmYWxzZSB9OworICAgICAgICBJbmxpbmVMYXlvdXRQb2ludCBsb2dpY2FsVG9wTGVmdDsKKyAg
ICAgICAgSW5saW5lTGF5b3V0VW5pdCBsaW5lTG9naWNhbFdpZHRoOworICAgICAgICBJbmxpbmVM
YXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGg7CisgICAgICAgIGJvb2wgaXNMYXN0TGluZVdp
dGhJbmxpbmVDb250ZW50IHsgdHJ1ZSB9OworICAgICAgICBzaXplX3Qgbm9uU3Bhbm5pbmdJbmxp
bmVMZXZlbEJveENvdW50IHsgMCB9OworICAgICAgICBjb25zdCBMaW5lOjpSdW5MaXN0JiBydW5z
OworICAgIH07CisgICAgTGluZUNvbnRlbnQgbGF5b3V0SW5saW5lQ29udGVudChjb25zdCBJbmxp
bmVJdGVtUmFuZ2UmLCBzaXplX3QgcGFydGlhbExlYWRpbmdDb250ZW50TGVuZ3RoLCBPcHRpb25h
bDxJbmxpbmVMYXlvdXRVbml0PiBsZWFkaW5nTG9naWNhbFdpZHRoLCBjb25zdCBJbmxpbmVSZWN0
JiBpbml0aWFsTGluZUxvZ2ljYWxSZWN0LCBib29sIGlzRmlyc3RMaW5lKTsKKworICAgIHN0cnVj
dCBJbnRyaW5zaWNDb250ZW50IHsKKyAgICAgICAgSW5saW5lSXRlbVJhbmdlIGlubGluZUl0ZW1S
YW5nZTsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGggeyAwIH07CisgICAg
ICAgIGNvbnN0IEZsb2F0TGlzdCYgZmxvYXRzOworICAgIH07CisgICAgSW50cmluc2ljQ29udGVu
dCBjb21wdXRlZEludHJpbnNpY1dpZHRoKGNvbnN0IElubGluZUl0ZW1SYW5nZSYsIElubGluZUxh
eW91dFVuaXQgYXZhaWxhYmxlV2lkdGgpOworCitwcml2YXRlOgorICAgIHZvaWQgY2FuZGlkYXRl
Q29udGVudEZvckxpbmUoTGluZUNhbmRpZGF0ZSYsIHNpemVfdCBpbmxpbmVJdGVtSW5kZXgsIGNv
bnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgc2l6ZV90IG92ZXJmbG93TGVu
Z3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBsZWFkaW5nTG9naWNhbFdpZHRoLCBJbmxp
bmVMYXlvdXRVbml0IGN1cnJlbnRMb2dpY2FsUmlnaHQpOworICAgIHNpemVfdCBuZXh0V3JhcE9w
cG9ydHVuaXR5KHNpemVfdCBzdGFydEluZGV4LCBjb25zdCBMaW5lQnVpbGRlcjo6SW5saW5lSXRl
bVJhbmdlJiBsYXlvdXRSYW5nZSkgY29uc3Q7CisKKyAgICBzdHJ1Y3QgUmVzdWx0IHsKKyAgICAg
ICAgSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lIGlzRW5kT2ZMaW5lIHsgSW5saW5l
Q29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9OworICAgICAgICBzdHJ1Y3QgQ29tbWl0
dGVkQ29udGVudENvdW50IHsKKyAgICAgICAgICAgIHNpemVfdCB2YWx1ZSB7IDAgfTsKKyAgICAg
ICAgICAgIGJvb2wgaXNSZXZlcnQgeyBmYWxzZSB9OworICAgICAgICB9OworICAgICAgICBDb21t
aXR0ZWRDb250ZW50Q291bnQgY29tbWl0dGVkQ291bnQgeyB9OworICAgICAgICBzaXplX3QgcGFy
dGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCB7IDAgfTsKKyAgICAgICAgT3B0aW9uYWw8SW5saW5l
TGF5b3V0VW5pdD4gb3ZlcmZsb3dMb2dpY2FsV2lkdGggeyB9OworICAgIH07CisgICAgc3RydWN0
IFVzZWRDb25zdHJhaW50cyB7CisgICAgICAgIElubGluZVJlY3QgbG9naWNhbFJlY3Q7CisgICAg
ICAgIGJvb2wgaXNDb25zdHJhaW5lZEJ5RmxvYXQgeyBmYWxzZSB9OworICAgIH07CisgICAgVXNl
ZENvbnN0cmFpbnRzIGluaXRpYWxDb25zdHJhaW50c0ZvckxpbmUoY29uc3QgSW5saW5lUmVjdCYg
aW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgYm9vbCBpc0ZpcnN0TGluZSkgY29uc3Q7CisgICAgT3B0
aW9uYWw8SG9yaXpvbnRhbENvbnN0cmFpbnRzPiBmbG9hdENvbnN0cmFpbnRzKGNvbnN0IElubGlu
ZVJlY3QmIGxpbmVMb2dpY2FsUmVjdCkgY29uc3Q7CisKKyAgICB2b2lkIGhhbmRsZUZsb2F0Q29u
dGVudChjb25zdCBJbmxpbmVJdGVtJik7CisgICAgUmVzdWx0IGhhbmRsZUlubGluZUNvbnRlbnQo
SW5saW5lQ29udGVudEJyZWFrZXImLCBjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0
UmFuZ2UsIGNvbnN0IExpbmVDYW5kaWRhdGUmKTsKKyAgICBzaXplX3QgcmVidWlsZExpbmUoY29u
c3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBjb25zdCBJbmxpbmVJdGVtJiBs
YXN0SW5saW5lSXRlbVRvQWRkKTsKKyAgICBzaXplX3QgcmVidWlsZExpbmVGb3JUcmFpbGluZ1Nv
ZnRIeXBoZW4oY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsYXlvdXRSYW5nZSk7CisgICAgdm9pZCBj
b21taXRQYXJ0aWFsQ29udGVudChjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91
c0NvbnRlbnQ6OlJ1bkxpc3QmLCBjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0OjpQ
YXJ0aWFsVHJhaWxpbmdDb250ZW50Jik7CisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IFVzZWRD
b25zdHJhaW50cyYpOworICAgIHN0cnVjdCBDb21taXR0ZWRDb250ZW50IHsKKyAgICAgICAgc2l6
ZV90IGlubGluZUl0ZW1Db3VudCB7IDAgfTsKKyAgICAgICAgc2l6ZV90IHBhcnRpYWxUcmFpbGlu
Z0NvbnRlbnRMZW5ndGggeyAwIH07CisgICAgICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+
IG92ZXJmbG93TG9naWNhbFdpZHRoIHsgfTsKKyAgICB9OworICAgIENvbW1pdHRlZENvbnRlbnQg
cGxhY2VJbmxpbmVDb250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5nZSYsIHNpemVfdCBwYXJ0aWFs
TGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IG92ZXJmbG93
TG9naWNhbFdpZHRoKTsKKyAgICBJbmxpbmVJdGVtUmFuZ2UgY2xvc2UoY29uc3QgSW5saW5lSXRl
bVJhbmdlJiBuZWVkc0xheW91dFJhbmdlLCBjb25zdCBDb21taXR0ZWRDb250ZW50Jik7CisKKyAg
ICBJbmxpbmVMYXlvdXRVbml0IGlubGluZUl0ZW1XaWR0aChjb25zdCBJbmxpbmVJdGVtJiwgSW5s
aW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpIGNvbnN0OworICAgIGJvb2wgaXNMYXN0
TGluZVdpdGhJbmxpbmVDb250ZW50KGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGluZVJhbmdlLCBz
aXplX3QgbGFzdElubGluZUl0ZW1JbmRleCwgYm9vbCBoYXNQYXJ0aWFsVHJhaWxpbmdDb250ZW50
KSBjb25zdDsKKworICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5n
Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7IH0KKyAg
ICBJbmxpbmVGb3JtYXR0aW5nU3RhdGUqIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIG1faW5s
aW5lRm9ybWF0dGluZ1N0YXRlOyB9CisgICAgRmxvYXRpbmdTdGF0ZSogZmxvYXRpbmdTdGF0ZSgp
IHsgcmV0dXJuIG1fZmxvYXRpbmdTdGF0ZTsgfQorICAgIGNvbnN0IEZsb2F0aW5nU3RhdGUqIGZs
b2F0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nU3RhdGU7IH0KKyAgICBjb25z
dCBDb250YWluZXJCb3gmIHJvb3QoKSBjb25zdDsKKyAgICBjb25zdCBMYXlvdXRTdGF0ZSYgbGF5
b3V0U3RhdGUoKSBjb25zdDsKKworICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBt
X2lubGluZUZvcm1hdHRpbmdDb250ZXh0OworICAgIElubGluZUZvcm1hdHRpbmdTdGF0ZSogbV9p
bmxpbmVGb3JtYXR0aW5nU3RhdGUgeyBudWxscHRyIH07CisgICAgRmxvYXRpbmdTdGF0ZSogbV9m
bG9hdGluZ1N0YXRlIHsgbnVsbHB0ciB9OworICAgIE9wdGlvbmFsPEhvcml6b250YWxDb25zdHJh
aW50cz4gbV9yb290SG9yaXpvbnRhbENvbnN0cmFpbnRzOworCisgICAgTGluZSBtX2xpbmU7Cisg
ICAgSW5saW5lUmVjdCBtX2xpbmVMb2dpY2FsUmVjdDsKKyAgICBjb25zdCBJbmxpbmVJdGVtcyYg
bV9pbmxpbmVJdGVtczsKKyAgICBGbG9hdExpc3QgbV9mbG9hdHM7CisgICAgT3B0aW9uYWw8SW5s
aW5lVGV4dEl0ZW0+IG1fcGFydGlhbExlYWRpbmdUZXh0SXRlbTsKKyAgICBWZWN0b3I8Y29uc3Qg
SW5saW5lSXRlbSo+IG1fd3JhcE9wcG9ydHVuaXR5TGlzdDsKKyAgICB1bnNpZ25lZCBtX3N1Y2Nl
c3NpdmVIeXBoZW5hdGVkTGluZUNvdW50IHsgMCB9OworICAgIGJvb2wgbV9jb250ZW50SXNDb25z
dHJhaW5lZEJ5RmxvYXQgeyBmYWxzZSB9OworfTsKKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVM
aW5lR2VvbWV0cnkuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lL0lubGluZUxpbmVHZW9tZXRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQ2YTJjNThhMDc2ZTQ5YzJj
ZDNjOWUyZjkyYWIzNmQwM2YyNzI5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVMaW5lR2VvbWV0cnkuaApA
QCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUo
TEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIklubGluZVJlY3QuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIElubGluZUxp
bmVHZW9tZXRyeSB7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAg
c3RydWN0IEVuY2xvc2luZ1RvcEFuZEJvdHRvbSB7CisgICAgICAgIC8vIFRoaXMgdmFsdWVzIGVu
Y2xvc2VzIHRoZSByb290IGlubGluZSBib3ggYW5kIGFueSBvdGhlciBpbmxpbmUgbGV2ZWwgYm94
J3MgYm9yZGVyIGJveC4KKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB0b3AgeyAwIH07CisgICAg
ICAgIElubGluZUxheW91dFVuaXQgYm90dG9tIHsgMCB9OworICAgIH07CisgICAgSW5saW5lTGlu
ZUdlb21ldHJ5KGNvbnN0IElubGluZVJlY3QmIGxpbmVCb3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5n
VG9wQW5kQm90dG9tLCBJbmxpbmVMYXlvdXRVbml0IGFsaWdtZW50QmFzZWxpbmUsIElubGluZUxh
eW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dp
Y2FsV2lkdGgpOworCisgICAgY29uc3QgSW5saW5lUmVjdCYgbGluZUJveExvZ2ljYWxSZWN0KCkg
Y29uc3QgeyByZXR1cm4gbV9saW5lQm94TG9naWNhbFJlY3Q7IH0KKworICAgIEVuY2xvc2luZ1Rv
cEFuZEJvdHRvbSBlbmNsb3NpbmdUb3BBbmRCb3R0b20oKSBjb25zdCB7IHJldHVybiBtX2VuY2xv
c2luZ1RvcEFuZEJvdHRvbTsgfQorCisgICAgSW5saW5lTGF5b3V0VW5pdCBiYXNlbGluZSgpIGNv
bnN0IHsgcmV0dXJuIG1fYWxpZ21lbnRCYXNlbGluZTsgfQorCisgICAgSW5saW5lTGF5b3V0VW5p
dCBjb250ZW50TG9naWNhbExlZnQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRMb2dpY2FsTGVm
dDsgfQorICAgIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCgpIGNvbnN0IHsg
cmV0dXJuIG1fY29udGVudExvZ2ljYWxXaWR0aDsgfQorCisgICAgdm9pZCBtb3ZlVmVydGljYWxs
eShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkgeyBtX2xpbmVCb3hMb2dpY2FsUmVjdC5tb3ZlVmVy
dGljYWxseShvZmZzZXQpOyB9CisKK3ByaXZhdGU6CisgICAgLy8gVGhpcyBpcyBsaW5lIGJveCBn
ZW9tZXRyeSAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xpbmUtYm94
KS4KKyAgICBJbmxpbmVSZWN0IG1fbGluZUJveExvZ2ljYWxSZWN0OworICAgIC8vIEVuY2xvc2lu
ZyB0b3AgYW5kIGJvdHRvbSBpbmNsdWRlcyBhbGwgaW5saW5lIGxldmVsIGJveGVzIChib3JkZXIg
Ym94KSB2ZXJ0aWNhbGx5LgorICAgIC8vIFdoaWxlIHRoZSBsaW5lIGJveCB1c3VhbGx5IGVuY2xv
c2UgdGhlbSBhcyB3ZWxsLCBpdHMgdmVydGljYWwgZ2VvbWV0cnkgaXMgYmFzZWQgb24KKyAgICAv
LyB0aGUgbGF5b3V0IGJvdW5kcyBvZiB0aGUgaW5saW5lIGxldmVsIGJveGVzIHdoaWNoIG1heSBi
ZSBkaWZmZXJlbnQgd2hlbiBsaW5lLWhlaWdodCBpcyBwcmVzZW50LgorICAgIEVuY2xvc2luZ1Rv
cEFuZEJvdHRvbSBtX2VuY2xvc2luZ1RvcEFuZEJvdHRvbTsKKyAgICBJbmxpbmVMYXlvdXRVbml0
IG1fYWxpZ21lbnRCYXNlbGluZSB7IDAgfTsKKyAgICBJbmxpbmVMYXlvdXRVbml0IG1fY29udGVu
dExvZ2ljYWxMZWZ0IHsgMCB9OworICAgIElubGluZUxheW91dFVuaXQgbV9jb250ZW50TG9naWNh
bFdpZHRoIHsgMCB9OworfTsKKworaW5saW5lIElubGluZUxpbmVHZW9tZXRyeTo6SW5saW5lTGlu
ZUdlb21ldHJ5KGNvbnN0IElubGluZVJlY3QmIGxpbmVCb3hMb2dpY2FsUmVjdCwgRW5jbG9zaW5n
VG9wQW5kQm90dG9tIGVuY2xvc2luZ1RvcEFuZEJvdHRvbSwgSW5saW5lTGF5b3V0VW5pdCBhbGln
bWVudEJhc2VsaW5lLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCwgSW5saW5l
TGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoKQorICAgIDogbV9saW5lQm94TG9naWNhbFJl
Y3QobGluZUJveExvZ2ljYWxSZWN0KQorICAgICwgbV9lbmNsb3NpbmdUb3BBbmRCb3R0b20oZW5j
bG9zaW5nVG9wQW5kQm90dG9tKQorICAgICwgbV9hbGlnbWVudEJhc2VsaW5lKGFsaWdtZW50QmFz
ZWxpbmUpCisgICAgLCBtX2NvbnRlbnRMb2dpY2FsTGVmdChjb250ZW50TG9naWNhbExlZnQpCisg
ICAgLCBtX2NvbnRlbnRMb2dpY2FsV2lkdGgoY29udGVudExvZ2ljYWxXaWR0aCkKK3sKK30KKwor
fQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lL0lubGluZUxpbmVSdW4uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL0lubGluZUxpbmVSdW4uaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4w
YjBlZTE0ZGVkMGJlMmNjZDUyZDM0MzNiMDg4NDU0NmMxZjBkMmIyCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5l
TGluZVJ1bi5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwor
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisg
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisK
KyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIklubGlu
ZVJlY3QuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJUZXh0RmxhZ3MuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK3N0cnVjdCBMaW5l
UnVuIHsKKyAgICBXVEZfTUFLRV9TVFJVQ1RfRkFTVF9BTExPQ0FURUQ7CisgICAgc3RydWN0IFRl
eHQgeworICAgICAgICBXVEZfTUFLRV9TVFJVQ1RfRkFTVF9BTExPQ0FURUQ7CisgICAgcHVibGlj
OgorICAgICAgICBUZXh0KHNpemVfdCBwb3NpdGlvbiwgc2l6ZV90IGxlbmd0aCwgY29uc3QgU3Ry
aW5nJik7CisKKyAgICAgICAgc2l6ZV90IHN0YXJ0KCkgY29uc3QgeyByZXR1cm4gbV9zdGFydDsg
fQorICAgICAgICBzaXplX3QgZW5kKCkgY29uc3QgeyByZXR1cm4gc3RhcnQoKSArIGxlbmd0aCgp
OyB9CisgICAgICAgIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2xlbmd0aDsgfQor
ICAgICAgICBTdHJpbmcgY29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudFN0cmluZzsg
fQorCisgICAgICAgIGJvb2wgbmVlZHNIeXBoZW4oKSBjb25zdCB7IHJldHVybiBtX25lZWRzSHlw
aGVuOyB9CisgICAgICAgIHZvaWQgc2V0TmVlZHNIeXBoZW4oKSB7IG1fbmVlZHNIeXBoZW4gPSB0
cnVlOyB9CisKKyAgICAgICAgdm9pZCBleHBhbmQoc2l6ZV90IGRlbHRhKSB7IG1fbGVuZ3RoICs9
IGRlbHRhOyB9CisgICAgICAgIHZvaWQgc2hyaW5rKHNpemVfdCBkZWx0YSkgeyBtX2xlbmd0aCAt
PSBkZWx0YTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc2l6ZV90IG1fc3RhcnQgeyAwIH07
CisgICAgICAgIHNpemVfdCBtX2xlbmd0aCB7IDAgfTsKKyAgICAgICAgYm9vbCBtX25lZWRzSHlw
aGVuIHsgZmFsc2UgfTsKKyAgICAgICAgU3RyaW5nIG1fY29udGVudFN0cmluZzsKKyAgICB9Owor
CisgICAgc3RydWN0IEV4cGFuc2lvbjsKKyAgICBMaW5lUnVuKHNpemVfdCBsaW5lSW5kZXgsIGNv
bnN0IEJveCYsIGNvbnN0IElubGluZVJlY3QmLCBFeHBhbnNpb24sIE9wdGlvbmFsPFRleHQ+ID0g
V1RGOjpudWxsb3B0KTsKKworICAgIGNvbnN0IElubGluZVJlY3QmIGxvZ2ljYWxSZWN0KCkgY29u
c3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdDsgfQorCisgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dp
Y2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS50b3AoKTsgfQorICAgIElubGlu
ZUxheW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCku
Ym90dG9tKCk7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0KCkgY29uc3QgeyBy
ZXR1cm4gbG9naWNhbFJlY3QoKS5sZWZ0KCk7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkucmlnaHQoKTsgfQorCisgICAg
SW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVj
dCgpLndpZHRoKCk7IH0KKyAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQoKSBjb25z
dCB7IHJldHVybiBsb2dpY2FsUmVjdCgpLmhlaWdodCgpOyB9CisKKyAgICB2b2lkIG1vdmVWZXJ0
aWNhbGx5KElubGluZUxheW91dFVuaXQgb2Zmc2V0KSB7IG1fbG9naWNhbFJlY3QubW92ZVZlcnRp
Y2FsbHkob2Zmc2V0KTsgfQorICAgIE9wdGlvbmFsPFRleHQ+JiB0ZXh0KCkgeyByZXR1cm4gbV90
ZXh0OyB9CisgICAgY29uc3QgT3B0aW9uYWw8VGV4dD4mIHRleHQoKSBjb25zdCB7IHJldHVybiBt
X3RleHQ7IH0KKworICAgIHN0cnVjdCBFeHBhbnNpb24geworICAgICAgICBFeHBhbnNpb25CZWhh
dmlvciBiZWhhdmlvciB7IERlZmF1bHRFeHBhbnNpb24gfTsKKyAgICAgICAgSW5saW5lTGF5b3V0
VW5pdCBob3Jpem9udGFsRXhwYW5zaW9uIHsgMCB9OworICAgIH07CisgICAgRXhwYW5zaW9uIGV4
cGFuc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fZXhwYW5zaW9uOyB9CisKKyAgICBjb25zdCBCb3gm
IGxheW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQorICAgIHNpemVfdCBs
aW5lSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2xpbmVJbmRleDsgfQorCitwcml2YXRlOgorICAg
IGNvbnN0IHNpemVfdCBtX2xpbmVJbmRleDsKKyAgICBXZWFrUHRyPGNvbnN0IExheW91dDo6Qm94
PiBtX2xheW91dEJveDsKKyAgICBJbmxpbmVSZWN0IG1fbG9naWNhbFJlY3Q7CisgICAgRXhwYW5z
aW9uIG1fZXhwYW5zaW9uOworICAgIE9wdGlvbmFsPFRleHQ+IG1fdGV4dDsKK307CisKK2lubGlu
ZSBMaW5lUnVuOjpMaW5lUnVuKHNpemVfdCBsaW5lSW5kZXgsIGNvbnN0IExheW91dDo6Qm94JiBs
YXlvdXRCb3gsIGNvbnN0IElubGluZVJlY3QmIGxvZ2ljYWxSZWN0LCBFeHBhbnNpb24gZXhwYW5z
aW9uLCBPcHRpb25hbDxUZXh0PiB0ZXh0KQorICAgIDogbV9saW5lSW5kZXgobGluZUluZGV4KQor
ICAgICwgbV9sYXlvdXRCb3gobWFrZVdlYWtQdHIobGF5b3V0Qm94KSkKKyAgICAsIG1fbG9naWNh
bFJlY3QobG9naWNhbFJlY3QpCisgICAgLCBtX2V4cGFuc2lvbihleHBhbnNpb24pCisgICAgLCBt
X3RleHQodGV4dCkKK3sKK30KKworaW5saW5lIExpbmVSdW46OlRleHQ6OlRleHQoc2l6ZV90IHN0
YXJ0LCBzaXplX3QgbGVuZ3RoLCBjb25zdCBTdHJpbmcmIGNvbnRlbnRTdHJpbmcpCisgICAgOiBt
X3N0YXJ0KHN0YXJ0KQorICAgICwgbV9sZW5ndGgobGVuZ3RoKQorICAgICwgbV9jb250ZW50U3Ry
aW5nKGNvbnRlbnRTdHJpbmcpCit7Cit9CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5lUmVjdC5o
IGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5l
UmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLmFjZDA5YWIxZTcxMDFhYTZlY2Y0MzNkMjY0MDA0ZmZlOGZiN2E4
YzQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2lubGluZS9JbmxpbmVSZWN0LmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAq
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQor
CisjaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNw
YWNlIExheW91dCB7CisKK2NsYXNzIElubGluZVJlY3QgeworcHVibGljOgorICAgIElubGluZVJl
Y3QoKSA9IGRlZmF1bHQ7CisgICAgSW5saW5lUmVjdChJbmxpbmVMYXlvdXRVbml0IHRvcCwgSW5s
aW5lTGF5b3V0VW5pdCBsZWZ0LCBJbmxpbmVMYXlvdXRVbml0IHdpZHRoLCBJbmxpbmVMYXlvdXRV
bml0IGhlaWdodCk7CisgICAgSW5saW5lUmVjdChjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgdG9w
TGVmdCwgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCwgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQpOwor
ICAgIElubGluZVJlY3QoY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIHRvcExlZnQsIGNvbnN0IElu
bGluZUxheW91dFNpemUmKTsKKyAgICAKKyAgICBJbmxpbmVMYXlvdXRVbml0IHRvcCgpIGNvbnN0
OworICAgIElubGluZUxheW91dFVuaXQgbGVmdCgpIGNvbnN0OworICAgIElubGluZUxheW91dFBv
aW50IHRvcExlZnQoKSBjb25zdDsKKworICAgIElubGluZUxheW91dFVuaXQgYm90dG9tKCkgY29u
c3Q7CisgICAgSW5saW5lTGF5b3V0VW5pdCByaWdodCgpIGNvbnN0OyAgICAgICAgCisKKyAgICBJ
bmxpbmVMYXlvdXRVbml0IHdpZHRoKCkgY29uc3Q7CisgICAgSW5saW5lTGF5b3V0VW5pdCBoZWln
aHQoKSBjb25zdDsKKyAgICBJbmxpbmVMYXlvdXRTaXplIHNpemUoKSBjb25zdDsKKworICAgIHZv
aWQgc2V0VG9wKElubGluZUxheW91dFVuaXQpOworICAgIHZvaWQgc2V0Qm90dG9tKElubGluZUxh
eW91dFVuaXQpOworICAgIHZvaWQgc2V0TGVmdChJbmxpbmVMYXlvdXRVbml0KTsKKyAgICB2b2lk
IHNldFRvcExlZnQoY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmKTsKKyAgICB2b2lkIHNldFdpZHRo
KElubGluZUxheW91dFVuaXQpOworICAgIHZvaWQgc2V0SGVpZ2h0KElubGluZUxheW91dFVuaXQp
OworCisgICAgdm9pZCBtb3ZlSG9yaXpvbnRhbGx5KElubGluZUxheW91dFVuaXQpOworICAgIHZv
aWQgbW92ZVZlcnRpY2FsbHkoSW5saW5lTGF5b3V0VW5pdCk7CisgICAgdm9pZCBtb3ZlQnkoSW5s
aW5lTGF5b3V0UG9pbnQpOworCisgICAgdm9pZCBleHBhbmQoT3B0aW9uYWw8SW5saW5lTGF5b3V0
VW5pdD4sIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+KTsKKyAgICB2b2lkIGV4cGFuZFRvQ29u
dGFpbihjb25zdCBJbmxpbmVSZWN0Jik7CisgICAgdm9pZCBleHBhbmRIb3Jpem9udGFsbHkoSW5s
aW5lTGF5b3V0VW5pdCBkZWx0YSkgeyBleHBhbmQoZGVsdGEsIHsgfSk7IH0KKyAgICB2b2lkIGV4
cGFuZFZlcnRpY2FsbHkoSW5saW5lTGF5b3V0VW5pdCBkZWx0YSkgeyBleHBhbmQoeyB9LCBkZWx0
YSk7IH0KKyAgICB2b2lkIGV4cGFuZFZlcnRpY2FsbHlUb0NvbnRhaW4oY29uc3QgSW5saW5lUmVj
dCYpOworICAgIHZvaWQgaW5mbGF0ZShJbmxpbmVMYXlvdXRVbml0KTsKKworICAgIG9wZXJhdG9y
IElubGluZUxheW91dFJlY3QoKSBjb25zdDsKKworcHJpdmF0ZToKKyNpZiBBU1NFUlRfRU5BQkxF
RAorICAgIHZvaWQgaW52YWxpZGF0ZVRvcCgpIHsgbV9oYXNWYWxpZFRvcCA9IGZhbHNlOyB9Cisg
ICAgdm9pZCBpbnZhbGlkYXRlTGVmdCgpIHsgbV9oYXNWYWxpZExlZnQgPSBmYWxzZTsgfQorICAg
IHZvaWQgaW52YWxpZGF0ZVdpZHRoKCkgeyBtX2hhc1ZhbGlkV2lkdGggPSBmYWxzZTsgfQorICAg
IHZvaWQgaW52YWxpZGF0ZUhlaWdodCgpIHsgbV9oYXNWYWxpZEhlaWdodCA9IGZhbHNlOyB9Cisg
ICAgdm9pZCBpbnZhbGlkYXRlUG9zaXRpb24oKTsKKworICAgIGJvb2wgaGFzVmFsaWRQb3NpdGlv
bigpIGNvbnN0IHsgcmV0dXJuIG1faGFzVmFsaWRUb3AgJiYgbV9oYXNWYWxpZExlZnQ7IH0KKyAg
ICBib29sIGhhc1ZhbGlkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faGFzVmFsaWRXaWR0aCAmJiBt
X2hhc1ZhbGlkSGVpZ2h0OyB9CisgICAgYm9vbCBoYXNWYWxpZEdlb21ldHJ5KCkgY29uc3QgeyBy
ZXR1cm4gaGFzVmFsaWRQb3NpdGlvbigpICYmIGhhc1ZhbGlkU2l6ZSgpOyB9CisKKyAgICB2b2lk
IHNldEhhc1ZhbGlkUG9zaXRpb24oKTsKKyAgICB2b2lkIHNldEhhc1ZhbGlkU2l6ZSgpOworCisg
ICAgYm9vbCBtX2hhc1ZhbGlkVG9wIHsgZmFsc2UgfTsKKyAgICBib29sIG1faGFzVmFsaWRMZWZ0
IHsgZmFsc2UgfTsKKyAgICBib29sIG1faGFzVmFsaWRXaWR0aCB7IGZhbHNlIH07CisgICAgYm9v
bCBtX2hhc1ZhbGlkSGVpZ2h0IHsgZmFsc2UgfTsKKyNlbmRpZiAvLyBBU1NFUlRfRU5BQkxFRAor
ICAgIElubGluZUxheW91dFJlY3QgbV9yZWN0OworfTsKKworaW5saW5lIElubGluZVJlY3Q6Oklu
bGluZVJlY3QoSW5saW5lTGF5b3V0VW5pdCB0b3AsIElubGluZUxheW91dFVuaXQgbGVmdCwgSW5s
aW5lTGF5b3V0VW5pdCB3aWR0aCwgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQpCisgICAgOiBtX3Jl
Y3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KQoreworI2lmIEFTU0VSVF9FTkFCTEVECisgICAg
bV9oYXNWYWxpZFRvcCA9IHRydWU7CisgICAgbV9oYXNWYWxpZExlZnQgPSB0cnVlOworICAgIG1f
aGFzVmFsaWRXaWR0aCA9IHRydWU7CisgICAgbV9oYXNWYWxpZEhlaWdodCA9IHRydWU7CisjZW5k
aWYKK30KKworaW5saW5lIElubGluZVJlY3Q6OklubGluZVJlY3QoY29uc3QgSW5saW5lTGF5b3V0
UG9pbnQmIHRvcExlZnQsIElubGluZUxheW91dFVuaXQgd2lkdGgsIElubGluZUxheW91dFVuaXQg
aGVpZ2h0KQorICAgIDogSW5saW5lUmVjdCh0b3BMZWZ0LnkoKSwgdG9wTGVmdC54KCksIHdpZHRo
LCBoZWlnaHQpCit7Cit9CisKK2lubGluZSBJbmxpbmVSZWN0OjpJbmxpbmVSZWN0KGNvbnN0IElu
bGluZUxheW91dFBvaW50JiB0b3BMZWZ0LCBjb25zdCBJbmxpbmVMYXlvdXRTaXplJiBzaXplKQor
ICAgIDogSW5saW5lUmVjdCh0b3BMZWZ0LnkoKSwgdG9wTGVmdC54KCksIHNpemUud2lkdGgoKSwg
c2l6ZS5oZWlnaHQoKSkKK3sKK30KKworI2lmIEFTU0VSVF9FTkFCTEVECitpbmxpbmUgdm9pZCBJ
bmxpbmVSZWN0OjppbnZhbGlkYXRlUG9zaXRpb24oKQoreworICAgIGludmFsaWRhdGVUb3AoKTsK
KyAgICBpbnZhbGlkYXRlTGVmdCgpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRI
YXNWYWxpZFBvc2l0aW9uKCkKK3sKKyAgICBtX2hhc1ZhbGlkVG9wID0gdHJ1ZTsKKyAgICBtX2hh
c1ZhbGlkTGVmdCA9IHRydWU7Cit9CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6OnNldEhhc1Zh
bGlkU2l6ZSgpCit7CisgICAgbV9oYXNWYWxpZFdpZHRoID0gdHJ1ZTsKKyAgICBtX2hhc1ZhbGlk
SGVpZ2h0ID0gdHJ1ZTsKK30KKyNlbmRpZiAvLyBBU1NFUlRfRU5BQkxFRAorCitpbmxpbmUgSW5s
aW5lTGF5b3V0VW5pdCBJbmxpbmVSZWN0Ojp0b3AoKSBjb25zdAoreworICAgIEFTU0VSVChtX2hh
c1ZhbGlkVG9wKTsKKyAgICByZXR1cm4gbV9yZWN0LnkoKTsKK30KKworaW5saW5lIElubGluZUxh
eW91dFVuaXQgSW5saW5lUmVjdDo6bGVmdCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1faGFzVmFs
aWRMZWZ0KTsKKyAgICByZXR1cm4gbV9yZWN0LngoKTsKK30KKworaW5saW5lIElubGluZUxheW91
dFVuaXQgSW5saW5lUmVjdDo6Ym90dG9tKCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV9oYXNWYWxp
ZFRvcCAmJiBtX2hhc1ZhbGlkSGVpZ2h0KTsKKyAgICByZXR1cm4gbV9yZWN0Lm1heFkoKTsKK30K
KworaW5saW5lIElubGluZUxheW91dFVuaXQgSW5saW5lUmVjdDo6cmlnaHQoKSBjb25zdAorewor
ICAgIEFTU0VSVChtX2hhc1ZhbGlkTGVmdCAmJiBtX2hhc1ZhbGlkV2lkdGgpOworICAgIHJldHVy
biBtX3JlY3QubWF4WCgpOworfQorCitpbmxpbmUgSW5saW5lTGF5b3V0UG9pbnQgSW5saW5lUmVj
dDo6dG9wTGVmdCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKGhhc1ZhbGlkUG9zaXRpb24oKSk7Cisg
ICAgcmV0dXJuIG1fcmVjdC5taW5YTWluWUNvcm5lcigpOworfQorCitpbmxpbmUgSW5saW5lTGF5
b3V0U2l6ZSBJbmxpbmVSZWN0OjpzaXplKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaGFzVmFsaWRT
aXplKCkpOworICAgIHJldHVybiBtX3JlY3Quc2l6ZSgpOworfQorCitpbmxpbmUgSW5saW5lTGF5
b3V0VW5pdCBJbmxpbmVSZWN0Ojp3aWR0aCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1faGFzVmFs
aWRXaWR0aCk7CisgICAgcmV0dXJuIG1fcmVjdC53aWR0aCgpOworfQorCitpbmxpbmUgSW5saW5l
TGF5b3V0VW5pdCBJbmxpbmVSZWN0OjpoZWlnaHQoKSBjb25zdAoreworICAgIEFTU0VSVChtX2hh
c1ZhbGlkSGVpZ2h0KTsKKyAgICByZXR1cm4gbV9yZWN0LmhlaWdodCgpOworfQorCitpbmxpbmUg
dm9pZCBJbmxpbmVSZWN0OjpzZXRUb3BMZWZ0KGNvbnN0IElubGluZUxheW91dFBvaW50JiB0b3BM
ZWZ0KQoreworI2lmIEFTU0VSVF9FTkFCTEVECisgICAgc2V0SGFzVmFsaWRQb3NpdGlvbigpOwor
I2VuZGlmCisgICAgbV9yZWN0LnNldExvY2F0aW9uKHRvcExlZnQpOworfQorCitpbmxpbmUgdm9p
ZCBJbmxpbmVSZWN0OjpzZXRUb3AoSW5saW5lTGF5b3V0VW5pdCB0b3ApCit7CisjaWYgQVNTRVJU
X0VOQUJMRUQKKyAgICBtX2hhc1ZhbGlkVG9wID0gdHJ1ZTsKKyNlbmRpZgorICAgIG1fcmVjdC5z
ZXRZKHRvcCk7Cit9CisKK2lubGluZSB2b2lkIElubGluZVJlY3Q6OnNldEJvdHRvbShJbmxpbmVM
YXlvdXRVbml0IGJvdHRvbSkKK3sKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIG1faGFzVmFsaWRU
b3AgPSB0cnVlOworICAgIG1faGFzVmFsaWRIZWlnaHQgPSB0cnVlOworI2VuZGlmCisgICAgbV9y
ZWN0LnNoaWZ0TWF4WUVkZ2VUbyhib3R0b20pOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0
OjpzZXRMZWZ0KElubGluZUxheW91dFVuaXQgbGVmdCkKK3sKKyNpZiBBU1NFUlRfRU5BQkxFRAor
ICAgIG1faGFzVmFsaWRMZWZ0ID0gdHJ1ZTsKKyNlbmRpZgorICAgIG1fcmVjdC5zZXRYKGxlZnQp
OworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRXaWR0aChJbmxpbmVMYXlvdXRVbml0
IHdpZHRoKQoreworI2lmIEFTU0VSVF9FTkFCTEVECisgICAgbV9oYXNWYWxpZFdpZHRoID0gdHJ1
ZTsKKyNlbmRpZgorICAgIG1fcmVjdC5zZXRXaWR0aCh3aWR0aCk7Cit9CisKK2lubGluZSB2b2lk
IElubGluZVJlY3Q6OnNldEhlaWdodChJbmxpbmVMYXlvdXRVbml0IGhlaWdodCkKK3sKKyNpZiBB
U1NFUlRfRU5BQkxFRAorICAgIG1faGFzVmFsaWRIZWlnaHQgPSB0cnVlOworI2VuZGlmCisgICAg
bV9yZWN0LnNldEhlaWdodChoZWlnaHQpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0Ojpt
b3ZlSG9yaXpvbnRhbGx5KElubGluZUxheW91dFVuaXQgb2Zmc2V0KQoreworICAgIEFTU0VSVCht
X2hhc1ZhbGlkTGVmdCk7CisgICAgbV9yZWN0Lm1vdmUoSW5saW5lTGF5b3V0U2l6ZSB7IG9mZnNl
dCwgMCB9KTsKK30KKworaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6bW92ZVZlcnRpY2FsbHkoSW5s
aW5lTGF5b3V0VW5pdCBvZmZzZXQpCit7CisgICAgQVNTRVJUKG1faGFzVmFsaWRUb3ApOworICAg
IG1fcmVjdC5tb3ZlKElubGluZUxheW91dFNpemUgeyAwLCBvZmZzZXQgfSk7Cit9CisKK2lubGlu
ZSB2b2lkIElubGluZVJlY3Q6Om1vdmVCeShJbmxpbmVMYXlvdXRQb2ludCBvZmZzZXQpCit7Cisg
ICAgQVNTRVJUKG1faGFzVmFsaWRUb3ApOworICAgIEFTU0VSVChtX2hhc1ZhbGlkTGVmdCk7Cisg
ICAgbV9yZWN0Lm1vdmVCeShvZmZzZXQpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0Ojpl
eHBhbmQoT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gd2lkdGgsIE9wdGlvbmFsPElubGluZUxh
eW91dFVuaXQ+IGhlaWdodCkKK3sKKyAgICBBU1NFUlQoIXdpZHRoIHx8IG1faGFzVmFsaWRXaWR0
aCk7CisgICAgQVNTRVJUKCFoZWlnaHQgfHwgbV9oYXNWYWxpZEhlaWdodCk7CisgICAgbV9yZWN0
LmV4cGFuZCh3aWR0aC52YWx1ZU9yKDApLCBoZWlnaHQudmFsdWVPcigwKSk7Cit9CisKK2lubGlu
ZSB2b2lkIElubGluZVJlY3Q6OmV4cGFuZFRvQ29udGFpbihjb25zdCBJbmxpbmVSZWN0JiBvdGhl
cikKK3sKKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIG1faGFzVmFsaWRUb3AgPSB0cnVlOworICAg
IG1faGFzVmFsaWRMZWZ0ID0gdHJ1ZTsKKyAgICBtX2hhc1ZhbGlkV2lkdGggPSB0cnVlOworICAg
IG1faGFzVmFsaWRIZWlnaHQgPSB0cnVlOworI2VuZGlmCisgICAgbV9yZWN0LnVuaXRlRXZlbklm
RW1wdHkob3RoZXIpOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpleHBhbmRWZXJ0aWNh
bGx5VG9Db250YWluKGNvbnN0IElubGluZVJlY3QmIG90aGVyKQoreworICAgIGF1dG8gY29udGFp
blRvcCA9IHN0ZDo6bWluKHRvcCgpLCBvdGhlci50b3AoKSk7CisgICAgYXV0byBjb250YWluQm90
dG9tID0gc3RkOjptYXgoYm90dG9tKCksIG90aGVyLmJvdHRvbSgpKTsKKyAgICBzZXRUb3AoY29u
dGFpblRvcCk7CisgICAgc2V0Qm90dG9tKGNvbnRhaW5Cb3R0b20pOworfQorCitpbmxpbmUgdm9p
ZCBJbmxpbmVSZWN0OjppbmZsYXRlKElubGluZUxheW91dFVuaXQgaW5mbGF0ZSkKK3sKKyAgICBB
U1NFUlQoaGFzVmFsaWRHZW9tZXRyeSgpKTsKKyAgICBtX3JlY3QuaW5mbGF0ZShpbmZsYXRlKTsK
K30KKworaW5saW5lIElubGluZVJlY3Q6Om9wZXJhdG9yIElubGluZUxheW91dFJlY3QoKSBjb25z
dAoreworICAgIEFTU0VSVChoYXNWYWxpZEdlb21ldHJ5KCkpOyAKKyAgICByZXR1cm4gbV9yZWN0
OworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL0lubGluZVNvZnRMaW5lQnJlYWtJdGVtLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVTb2Z0TGlu
ZUJyZWFrSXRlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjllYTA2ZmJjZGQxNzgyNDJiYWI1NDczYTk0YTEzYWMz
MGJjNzk3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oCkBAIC0wLDAgKzEs
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
aW5nQ29udGV4dHMvaW5saW5lL0lubGluZVRleHRJdGVtLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL0lubGluZVRleHRJdGVtLmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi45YzczN2FmMGJkYmE5NWE1ZjQwNWVjYjQ5NDVmY2NkMTljZDhiYzM5Ci0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUv
SW5saW5lVGV4dEl0ZW0uY3BwCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgiCisKKyNpZiBFTkFCTEUo
TEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisj
aW5jbHVkZSAiSW5saW5lU29mdExpbmVCcmVha0l0ZW0uaCIKKyNpbmNsdWRlICJUZXh0VXRpbC5o
IgorI2luY2x1ZGUgPHd0Zi91bmljb2RlL0NoYXJhY3Rlck5hbWVzLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihJbmxp
bmVJdGVtKSA9PSBzaXplb2YoSW5saW5lVGV4dEl0ZW0pLCAiIik7CisKK3N0cnVjdCBXaGl0ZXNw
YWNlQ29udGVudCB7CisgICAgc2l6ZV90IGxlbmd0aCB7IDAgfTsKKyAgICBib29sIGlzV29yZFNl
cGFyYXRvciB7IHRydWUgfTsKK307CitzdGF0aWMgT3B0aW9uYWw8V2hpdGVzcGFjZUNvbnRlbnQ+
IG1vdmVUb05leHROb25XaGl0ZXNwYWNlUG9zaXRpb24oY29uc3QgU3RyaW5nVmlldyYgdGV4dENv
bnRlbnQsIHNpemVfdCBzdGFydFBvc2l0aW9uLCBib29sIHByZXNlcnZlTmV3bGluZSwgYm9vbCBw
cmVzZXJ2ZVRhYikKK3sKKyAgICBhdXRvIGhhc1dvcmRTZXBhcmF0b3JDaGFyYWN0ZXIgPSBmYWxz
ZTsKKyAgICBhdXRvIGlzV2hpdGVzcGFjZUNoYXJhY3RlciA9IFsmXShhdXRvIGNoYXJhY3Rlcikg
eworICAgICAgICAvLyB3aGl0ZSBzcGFjZSBwcm9jZXNzaW5nIGluIENTUyBhZmZlY3RzIG9ubHkg
dGhlIGRvY3VtZW50IHdoaXRlIHNwYWNlIGNoYXJhY3RlcnM6IHNwYWNlcyAoVSswMDIwKSwgdGFi
cyAoVSswMDA5KSwgYW5kIHNlZ21lbnQgYnJlYWtzLgorICAgICAgICBhdXRvIGlzVHJlYXRlZEFz
U3BhY2VDaGFyYWN0ZXIgPSBjaGFyYWN0ZXIgPT0gc3BhY2UgfHwgKGNoYXJhY3RlciA9PSBuZXds
aW5lQ2hhcmFjdGVyICYmICFwcmVzZXJ2ZU5ld2xpbmUpIHx8IChjaGFyYWN0ZXIgPT0gdGFiQ2hh
cmFjdGVyICYmICFwcmVzZXJ2ZVRhYik7CisgICAgICAgIGhhc1dvcmRTZXBhcmF0b3JDaGFyYWN0
ZXIgPSBoYXNXb3JkU2VwYXJhdG9yQ2hhcmFjdGVyIHx8IGlzVHJlYXRlZEFzU3BhY2VDaGFyYWN0
ZXI7CisgICAgICAgIHJldHVybiBpc1RyZWF0ZWRBc1NwYWNlQ2hhcmFjdGVyIHx8IGNoYXJhY3Rl
ciA9PSB0YWJDaGFyYWN0ZXI7CisgICAgfTsKKyAgICBhdXRvIG5leHROb25XaGl0ZVNwYWNlUG9z
aXRpb24gPSBzdGFydFBvc2l0aW9uOworICAgIHdoaWxlIChuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0
aW9uIDwgdGV4dENvbnRlbnQubGVuZ3RoKCkgJiYgaXNXaGl0ZXNwYWNlQ2hhcmFjdGVyKHRleHRD
b250ZW50W25leHROb25XaGl0ZVNwYWNlUG9zaXRpb25dKSkKKyAgICAgICAgKytuZXh0Tm9uV2hp
dGVTcGFjZVBvc2l0aW9uOworICAgIHJldHVybiBuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uID09
IHN0YXJ0UG9zaXRpb24gPyBXVEY6Om51bGxvcHQgOiBtYWtlT3B0aW9uYWwoV2hpdGVzcGFjZUNv
bnRlbnQgeyBuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiwgaGFzV29y
ZFNlcGFyYXRvckNoYXJhY3RlciB9KTsKK30KKworc3RhdGljIHVuc2lnbmVkIG1vdmVUb05leHRC
cmVha2FibGVQb3NpdGlvbih1bnNpZ25lZCBzdGFydFBvc2l0aW9uLCBMYXp5TGluZUJyZWFrSXRl
cmF0b3ImIGxpbmVCcmVha0l0ZXJhdG9yLCBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUpCit7Cisg
ICAgYXV0byB0ZXh0TGVuZ3RoID0gbGluZUJyZWFrSXRlcmF0b3Iuc3RyaW5nVmlldygpLmxlbmd0
aCgpOworICAgIGF1dG8gc3RhcnRQb3NpdGlvbkZvck5leHRCcmVha2FibGVQb3NpdGlvbiA9IHN0
YXJ0UG9zaXRpb247CisgICAgd2hpbGUgKHN0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxlUG9z
aXRpb24gPCB0ZXh0TGVuZ3RoKSB7CisgICAgICAgIGF1dG8gbmV4dEJyZWFrYWJsZVBvc2l0aW9u
ID0gVGV4dFV0aWw6OmZpbmROZXh0QnJlYWthYmxlUG9zaXRpb24obGluZUJyZWFrSXRlcmF0b3Is
IHN0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb24sIHN0eWxlKTsKKyAgICAgICAg
Ly8gT2Z0ZW50aW1lcyB0aGUgbmV4dCBicmVha2FibGUgcG9zaXRpb24gY29tZXMgYmFjayBhcyB0
aGUgc3RhcnQgcG9zaXRpb24gKG1vc3Qgbm90YWJseSBoeXBoZW5zKS4KKyAgICAgICAgaWYgKG5l
eHRCcmVha2FibGVQb3NpdGlvbiAhPSBzdGFydFBvc2l0aW9uKQorICAgICAgICAgICAgcmV0dXJu
IG5leHRCcmVha2FibGVQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb247CisgICAgICAgICsrc3RhcnRQ
b3NpdGlvbkZvck5leHRCcmVha2FibGVQb3NpdGlvbjsKKyAgICB9CisgICAgcmV0dXJuIHRleHRM
ZW5ndGggLSBzdGFydFBvc2l0aW9uOworfQorCit2b2lkIElubGluZVRleHRJdGVtOjpjcmVhdGVB
bmRBcHBlbmRUZXh0SXRlbXMoSW5saW5lSXRlbXMmIGlubGluZUNvbnRlbnQsIGNvbnN0IElubGlu
ZVRleHRCb3gmIGlubGluZVRleHRCb3gpCit7CisgICAgYXV0byB0ZXh0ID0gaW5saW5lVGV4dEJv
eC5jb250ZW50KCk7CisgICAgaWYgKCF0ZXh0Lmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gaW5s
aW5lQ29udGVudC5hcHBlbmQoSW5saW5lVGV4dEl0ZW06OmNyZWF0ZUVtcHR5SXRlbShpbmxpbmVU
ZXh0Qm94KSk7CisKKyAgICBhdXRvJiBzdHlsZSA9IGlubGluZVRleHRCb3guc3R5bGUoKTsKKyAg
ICBhdXRvJiBmb250ID0gc3R5bGUuZm9udENhc2NhZGUoKTsKKyAgICBhdXRvIHdoaXRlc3BhY2VD
b250ZW50SXNUcmVhdGVkQXNTaW5nbGVTcGFjZSA9ICFUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVT
cGFjZXNBbmRUYWJzKGlubGluZVRleHRCb3gpOworICAgIGF1dG8gc2hvdWxkUHJlc2VydmVOZXds
aW5lID0gVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlTmV3bGluZShpbmxpbmVUZXh0Qm94KTsKKyAg
ICBhdXRvIGxpbmVCcmVha0l0ZXJhdG9yID0gTGF6eUxpbmVCcmVha0l0ZXJhdG9yIHsgdGV4dCwg
c3R5bGUuY29tcHV0ZWRMb2NhbGUoKSwgVGV4dFV0aWw6OmxpbmVCcmVha0l0ZXJhdG9yTW9kZShz
dHlsZS5saW5lQnJlYWsoKSkgfTsKKyAgICB1bnNpZ25lZCBjdXJyZW50UG9zaXRpb24gPSAwOwor
CisgICAgYXV0byBpbmxpbmVJdGVtV2lkdGggPSBbJl0oYXV0byBzdGFydFBvc2l0aW9uLCBhdXRv
IGxlbmd0aCkgLT4gT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geworICAgICAgICBpZiAoIWlu
bGluZVRleHRCb3guY2FuVXNlU2ltcGxpZmllZENvbnRlbnRNZWFzdXJpbmcoKSkKKyAgICAgICAg
ICAgIHJldHVybiB7IH07CisgICAgICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4
dEJveCwgc3RhcnRQb3NpdGlvbiwgc3RhcnRQb3NpdGlvbiArIGxlbmd0aCwgeyB9KTsKKyAgICB9
OworCisgICAgd2hpbGUgKGN1cnJlbnRQb3NpdGlvbiA8IHRleHQubGVuZ3RoKCkpIHsKKyAgICAg
ICAgYXV0byBpc1NlZ21lbnRCcmVha0NhbmRpZGF0ZSA9IFtdKGF1dG8gY2hhcmFjdGVyKSB7Cisg
ICAgICAgICAgICByZXR1cm4gY2hhcmFjdGVyID09ICdcbic7CisgICAgICAgIH07CisKKyAgICAg
ICAgLy8gU2VnbWVudCBicmVha3Mgd2l0aCBwcmVzZXJ2ZSBuZXcgbGluZSBzdHlsZSAod2hpdGUt
c3BhY2U6IHByZSwgcHJlLXdyYXAsIGJyZWFrLXNwYWNlcyBhbmQgcHJlLWxpbmUpIGNvbXB1dGUg
dG8gZm9yY2VkIGxpbmUgYnJlYWsuCisgICAgICAgIGlmIChpc1NlZ21lbnRCcmVha0NhbmRpZGF0
ZSh0ZXh0W2N1cnJlbnRQb3NpdGlvbl0pICYmIHNob3VsZFByZXNlcnZlTmV3bGluZSkgeworICAg
ICAgICAgICAgaW5saW5lQ29udGVudC5hcHBlbmQoSW5saW5lU29mdExpbmVCcmVha0l0ZW06OmNy
ZWF0ZVNvZnRMaW5lQnJlYWtJdGVtKGlubGluZVRleHRCb3gsIGN1cnJlbnRQb3NpdGlvbikpOwor
ICAgICAgICAgICAgKytjdXJyZW50UG9zaXRpb247CisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorCisgICAgICAgIGlmIChhdXRvIHdoaXRlc3BhY2VDb250ZW50ID0gbW92ZVRvTmV4
dE5vbldoaXRlc3BhY2VQb3NpdGlvbih0ZXh0LCBjdXJyZW50UG9zaXRpb24sIHNob3VsZFByZXNl
cnZlTmV3bGluZSwgIXdoaXRlc3BhY2VDb250ZW50SXNUcmVhdGVkQXNTaW5nbGVTcGFjZSkpIHsK
KyAgICAgICAgICAgIEFTU0VSVCh3aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoKTsKKyAgICAgICAg
ICAgIGF1dG8gYXBwZW5kV2hpdGVzcGFjZUl0ZW0gPSBbJl0gKGF1dG8gc3RhcnRQb3NpdGlvbiwg
YXV0byBpdGVtTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXV0byBzaW1wbGVTaW5nbGVXaGl0
ZXNwYWNlQ29udGVudCA9IGlubGluZVRleHRCb3guY2FuVXNlU2ltcGxpZmllZENvbnRlbnRNZWFz
dXJpbmcoKSAmJiAoaXRlbUxlbmd0aCA9PSAxIHx8IHdoaXRlc3BhY2VDb250ZW50SXNUcmVhdGVk
QXNTaW5nbGVTcGFjZSk7CisgICAgICAgICAgICAgICAgYXV0byB3aWR0aCA9IHNpbXBsZVNpbmds
ZVdoaXRlc3BhY2VDb250ZW50ID8gbWFrZU9wdGlvbmFsKElubGluZUxheW91dFVuaXQgeyBmb250
LnNwYWNlV2lkdGgoKSB9KSA6IGlubGluZUl0ZW1XaWR0aChzdGFydFBvc2l0aW9uLCBpdGVtTGVu
Z3RoKTsKKyAgICAgICAgICAgICAgICBpbmxpbmVDb250ZW50LmFwcGVuZChJbmxpbmVUZXh0SXRl
bTo6Y3JlYXRlV2hpdGVzcGFjZUl0ZW0oaW5saW5lVGV4dEJveCwgc3RhcnRQb3NpdGlvbiwgaXRl
bUxlbmd0aCwgd2hpdGVzcGFjZUNvbnRlbnQtPmlzV29yZFNlcGFyYXRvciwgd2lkdGgpKTsKKyAg
ICAgICAgICAgIH07CisgICAgICAgICAgICBpZiAoc3R5bGUud2hpdGVTcGFjZSgpID09IFdoaXRl
U3BhY2U6OkJyZWFrU3BhY2VzKSB7CisgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMu
b3JnL1RSL2Nzcy10ZXh0LTMvI3doaXRlLXNwYWNlLXBoYXNlLTEKKyAgICAgICAgICAgICAgICAv
LyBGb3IgYnJlYWstc3BhY2VzLCBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBleGlzdHMgYWZ0ZXIg
ZXZlcnkgc3BhY2UgYW5kIGV2ZXJ5IHRhYi4KKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogaWYg
dGhpcyB0dXJucyBvdXQgdG8gYmUgYSBwZXJmIGhpdCB3aXRoIHRvbyBtYW55IGluZGl2aWR1YWwg
d2hpdGVzcGFjZSBpbmxpbmUgaXRlbXMsIHdlIHNob3VsZCB0cmFuc2l0aW9uIHRoaXMgbG9naWMg
dG8gbGluZSBicmVha2luZy4KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHdoaXRlc3BhY2VDb250ZW50LT5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgYXBw
ZW5kV2hpdGVzcGFjZUl0ZW0oY3VycmVudFBvc2l0aW9uICsgaSwgMSk7CisgICAgICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgICAgICBhcHBlbmRXaGl0ZXNwYWNlSXRlbShjdXJyZW50UG9zaXRp
b24sIHdoaXRlc3BhY2VDb250ZW50LT5sZW5ndGgpOworICAgICAgICAgICAgY3VycmVudFBvc2l0
aW9uICs9IHdoaXRlc3BhY2VDb250ZW50LT5sZW5ndGg7CisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgfQorCisgICAgICAgIGF1dG8gaGFzVHJhaWxpbmdTb2Z0SHlwaGVuID0gZmFsc2U7
CisgICAgICAgIGF1dG8gaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiA9IGN1cnJlbnRQb3Np
dGlvbjsKKyAgICAgICAgYXV0byBpc0F0U29mdEh5cGhlbiA9IFsmXShhdXRvIHBvc2l0aW9uKSB7
CisgICAgICAgICAgICByZXR1cm4gdGV4dFtwb3NpdGlvbl0gPT0gc29mdEh5cGhlbjsKKyAgICAg
ICAgfTsKKyAgICAgICAgaWYgKHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpOb25lKSB7Cisg
ICAgICAgICAgICAvLyBMZXQncyBtZXJnZSBjYW5kaWRhdGUgSW5saW5lVGV4dEl0ZW1zIHNlcGFy
YXRlZCBieSBzb2Z0IGh5cGhlbiB3aGVuIHRoZSBzdHlsZSBzYXlzIHNvLgorICAgICAgICAgICAg
d2hpbGUgKGN1cnJlbnRQb3NpdGlvbiA8IHRleHQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAg
ICBhdXRvIG5vbldoaXRlU3BhY2VMZW5ndGggPSBtb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24o
Y3VycmVudFBvc2l0aW9uLCBsaW5lQnJlYWtJdGVyYXRvciwgc3R5bGUpOworICAgICAgICAgICAg
ICAgIEFTU0VSVChub25XaGl0ZVNwYWNlTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50
UG9zaXRpb24gKz0gbm9uV2hpdGVTcGFjZUxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWlz
QXRTb2Z0SHlwaGVuKGN1cnJlbnRQb3NpdGlvbiAtIDEpKQorICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF1dG8g
bm9uV2hpdGVTcGFjZUxlbmd0aCA9IG1vdmVUb05leHRCcmVha2FibGVQb3NpdGlvbihpbml0aWFs
Tm9uV2hpdGVzcGFjZVBvc2l0aW9uLCBsaW5lQnJlYWtJdGVyYXRvciwgc3R5bGUpOworICAgICAg
ICAgICAgQVNTRVJUKG5vbldoaXRlU3BhY2VMZW5ndGgpOworICAgICAgICAgICAgY3VycmVudFBv
c2l0aW9uICs9IG5vbldoaXRlU3BhY2VMZW5ndGg7CisgICAgICAgICAgICBoYXNUcmFpbGluZ1Nv
ZnRIeXBoZW4gPSBpc0F0U29mdEh5cGhlbihjdXJyZW50UG9zaXRpb24gLSAxKTsKKyAgICAgICAg
fQorICAgICAgICBBU1NFUlQoaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiA8IGN1cnJlbnRQ
b3NpdGlvbik7CisgICAgICAgIEFTU0VSVF9JTVBMSUVTKHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBo
ZW5zOjpOb25lLCAhaGFzVHJhaWxpbmdTb2Z0SHlwaGVuKTsKKyAgICAgICAgYXV0byBsZW5ndGgg
PSBjdXJyZW50UG9zaXRpb24gLSBpbml0aWFsTm9uV2hpdGVzcGFjZVBvc2l0aW9uOworICAgICAg
ICBpbmxpbmVDb250ZW50LmFwcGVuZChJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlTm9uV2hpdGVzcGFj
ZUl0ZW0oaW5saW5lVGV4dEJveCwgaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiwgbGVuZ3Ro
LCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIGlubGluZUl0ZW1XaWR0aChpbml0aWFsTm9uV2hpdGVz
cGFjZVBvc2l0aW9uLCBsZW5ndGgpKSk7CisgICAgfQorfQorCitib29sIElubGluZVRleHRJdGVt
Ojppc0VtcHR5Q29udGVudCgpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBjaGVj
ayBmb3IgbW9yZSB6ZXJvIHdpZHRoIGNvbnRlbnQgYW5kIG5vdCBqdXN0IFUrMjAwQi4KKyAgICBy
ZXR1cm4gIW1fbGVuZ3RoIHx8IChtX2xlbmd0aCA9PSAxICYmIGlubGluZVRleHRCb3goKS5jb250
ZW50KClbc3RhcnQoKV0gPT0gemVyb1dpZHRoU3BhY2UpOyAKK30KKworYm9vbCBJbmxpbmVUZXh0
SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGNvbnN0IElubGluZVRleHRJdGVtJiBp
bmxpbmVUZXh0SXRlbSkKK3sKKyAgICBBU1NFUlQoaW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNl
KCkpOworICAgIHJldHVybiBUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlu
bGluZVRleHRJdGVtLmxheW91dEJveCgpKTsKK30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS9JbmxpbmVU
ZXh0SXRlbS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxp
bmUvSW5saW5lVGV4dEl0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41MmRjOThkY2YwNmExOWFhMDVmYzRhYTBh
YTI0ZDk4M2E1YjdjZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvSW5saW5lVGV4dEl0ZW0uaApAQCAtMCwwICsxLDEy
NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAq
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JN
QVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVJdGVtLmgiCisjaW5jbHVkZSAiTGF5
b3V0SW5saW5lVGV4dEJveC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5
b3V0IHsKKwordXNpbmcgSW5saW5lSXRlbXMgPSBWZWN0b3I8SW5saW5lSXRlbT47CisKK2NsYXNz
IElubGluZVRleHRJdGVtIDogcHVibGljIElubGluZUl0ZW0geworcHVibGljOgorICAgIHN0YXRp
YyB2b2lkIGNyZWF0ZUFuZEFwcGVuZFRleHRJdGVtcyhJbmxpbmVJdGVtcyYsIGNvbnN0IElubGlu
ZVRleHRCb3gmKTsKKworICAgIHVuc2lnbmVkIHN0YXJ0KCkgY29uc3QgeyByZXR1cm4gbV9zdGFy
dE9yUG9zaXRpb247IH0KKyAgICB1bnNpZ25lZCBlbmQoKSBjb25zdCB7IHJldHVybiBzdGFydCgp
ICsgbGVuZ3RoKCk7IH0KKyAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2xl
bmd0aDsgfQorCisgICAgYm9vbCBpc1doaXRlc3BhY2UoKSBjb25zdCB7IHJldHVybiBtX3RleHRJ
dGVtVHlwZSA9PSBUZXh0SXRlbVR5cGU6OldoaXRlc3BhY2U7IH0KKyAgICBib29sIGlzV29yZFNl
cGFyYXRvcigpIGNvbnN0IHsgcmV0dXJuIG1faXNXb3JkU2VwYXJhdG9yOyB9CisgICAgYm9vbCBo
YXNUcmFpbGluZ1NvZnRIeXBoZW4oKSBjb25zdCB7IHJldHVybiBtX2hhc1RyYWlsaW5nU29mdEh5
cGhlbjsgfQorICAgIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRoKCkgY29uc3QgeyBy
ZXR1cm4gbV9oYXNXaWR0aCA/IG1ha2VPcHRpb25hbChtX3dpZHRoKSA6IE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+IHsgfTsgfQorICAgIGJvb2wgaXNFbXB0eUNvbnRlbnQoKSBjb25zdDsKKwor
ICAgIGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRCb3goKSBjb25zdCB7IHJldHVybiBk
b3duY2FzdDxJbmxpbmVUZXh0Qm94PihsYXlvdXRCb3goKSk7IH0KKworICAgIElubGluZVRleHRJ
dGVtIGxlZnQodW5zaWduZWQgbGVuZ3RoKSBjb25zdDsKKyAgICBJbmxpbmVUZXh0SXRlbSByaWdo
dCh1bnNpZ25lZCBsZW5ndGgpIGNvbnN0OworCisgICAgc3RhdGljIGJvb2wgc2hvdWxkUHJlc2Vy
dmVTcGFjZXNBbmRUYWJzKGNvbnN0IElubGluZVRleHRJdGVtJik7CisKK3ByaXZhdGU6CisgICAg
dXNpbmcgSW5saW5lSXRlbTo6VGV4dEl0ZW1UeXBlOworCisgICAgSW5saW5lVGV4dEl0ZW0oY29u
c3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wg
aGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBib29sIGlzV29yZFNlcGFyYXRvciwgT3B0aW9uYWw8SW5s
aW5lTGF5b3V0VW5pdD4gd2lkdGgsIFRleHRJdGVtVHlwZSk7CisgICAgZXhwbGljaXQgSW5saW5l
VGV4dEl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYpOworCisgICAgc3RhdGljIElubGluZVRleHRJ
dGVtIGNyZWF0ZVdoaXRlc3BhY2VJdGVtKGNvbnN0IElubGluZVRleHRCb3gmLCB1bnNpZ25lZCBz
dGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGlzV29yZFNlcGFyYXRvciwgT3B0aW9uYWw8SW5s
aW5lTGF5b3V0VW5pdD4gd2lkdGgpOworICAgIHN0YXRpYyBJbmxpbmVUZXh0SXRlbSBjcmVhdGVO
b25XaGl0ZXNwYWNlSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWduZWQgc3RhcnQsIHVu
c2lnbmVkIGxlbmd0aCwgYm9vbCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+IHdpZHRoKTsKKyAgICBzdGF0aWMgSW5saW5lVGV4dEl0ZW0gY3JlYXRlRW1w
dHlJdGVtKGNvbnN0IElubGluZVRleHRCb3gmKTsKK307CisKK2lubGluZSBJbmxpbmVUZXh0SXRl
bSBJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlV2hpdGVzcGFjZUl0ZW0oY29uc3QgSW5saW5lVGV4dEJv
eCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBp
c1dvcmRTZXBhcmF0b3IsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRoKQoreworICAg
IHJldHVybiB7IGlubGluZVRleHRCb3gsIHN0YXJ0LCBsZW5ndGgsIGZhbHNlLCBpc1dvcmRTZXBh
cmF0b3IsIHdpZHRoLCBUZXh0SXRlbVR5cGU6OldoaXRlc3BhY2UgfTsKK30KKworaW5saW5lIElu
bGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpjcmVhdGVOb25XaGl0ZXNwYWNlSXRlbShjb25z
dCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQg
bGVuZ3RoLCBib29sIGhhc1RyYWlsaW5nU29mdEh5cGhlbiwgT3B0aW9uYWw8SW5saW5lTGF5b3V0
VW5pdD4gd2lkdGgpCit7CisgICAgLy8gRklYTUU6IFVzZSB0aGUgZm9sbG93aW5nIGxpc3Qgb2Yg
bm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBzZXQgdGhlICJpc1dvcmRTZXBhcmF0b3IiIGJp
dDogbm9CcmVha1NwYWNlLCBldGhpb3BpY1dvcmRzcGFjZSwgYWVnZWFuV29yZFNlcGFyYXRvckxp
bmUgYWVnZWFuV29yZFNlcGFyYXRvckRvdCB1Z2FyaXRpY1dvcmREaXZpZGVyLgorICAgIHJldHVy
biB7IGlubGluZVRleHRCb3gsIHN0YXJ0LCBsZW5ndGgsIGhhc1RyYWlsaW5nU29mdEh5cGhlbiwg
ZmFsc2UsIHdpZHRoLCBUZXh0SXRlbVR5cGU6Ok5vbldoaXRlc3BhY2UgfTsKK30KKworaW5saW5l
IElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpjcmVhdGVFbXB0eUl0ZW0oY29uc3QgSW5s
aW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCkKK3sKKyAgICByZXR1cm4gSW5saW5lVGV4dEl0ZW0g
eyBpbmxpbmVUZXh0Qm94IH07Cit9CisKK2lubGluZSBJbmxpbmVUZXh0SXRlbTo6SW5saW5lVGV4
dEl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgc3RhcnQs
IHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIGJvb2wgaXNXb3Jk
U2VwYXJhdG9yLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCwgVGV4dEl0ZW1UeXBl
IHRleHRJdGVtVHlwZSkKKyAgICA6IElubGluZUl0ZW0oaW5saW5lVGV4dEJveCwgVHlwZTo6VGV4
dCkKK3sKKyAgICBtX3N0YXJ0T3JQb3NpdGlvbiA9IHN0YXJ0OworICAgIG1fbGVuZ3RoID0gbGVu
Z3RoOworICAgIG1faGFzV2lkdGggPSAhIXdpZHRoOworICAgIG1faGFzVHJhaWxpbmdTb2Z0SHlw
aGVuID0gaGFzVHJhaWxpbmdTb2Z0SHlwaGVuOworICAgIG1faXNXb3JkU2VwYXJhdG9yID0gaXNX
b3JkU2VwYXJhdG9yOworICAgIG1fd2lkdGggPSB3aWR0aC52YWx1ZU9yKDApOworICAgIG1fdGV4
dEl0ZW1UeXBlID0gdGV4dEl0ZW1UeXBlOworfQorCitpbmxpbmUgSW5saW5lVGV4dEl0ZW06Oklu
bGluZVRleHRJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRCb3gpCisgICAgOiBJ
bmxpbmVJdGVtKGlubGluZVRleHRCb3gsIFR5cGU6OlRleHQpCit7Cit9CisKK2lubGluZSBJbmxp
bmVUZXh0SXRlbSBJbmxpbmVUZXh0SXRlbTo6bGVmdCh1bnNpZ25lZCBsZW5ndGgpIGNvbnN0Cit7
CisgICAgUkVMRUFTRV9BU1NFUlQobGVuZ3RoIDw9IHRoaXMtPmxlbmd0aCgpKTsKKyAgICBBU1NF
UlQobV90ZXh0SXRlbVR5cGUgIT0gVGV4dEl0ZW1UeXBlOjpVbmRlZmluZWQpOworICAgIEFTU0VS
VChsZW5ndGgpOworICAgIHJldHVybiB7IGlubGluZVRleHRCb3goKSwgc3RhcnQoKSwgbGVuZ3Ro
LCBmYWxzZSwgaXNXb3JkU2VwYXJhdG9yKCksIFdURjo6bnVsbG9wdCwgbV90ZXh0SXRlbVR5cGUg
fTsKK30KKworaW5saW5lIElubGluZVRleHRJdGVtIElubGluZVRleHRJdGVtOjpyaWdodCh1bnNp
Z25lZCBsZW5ndGgpIGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlQobGVuZ3RoIDw9IHRoaXMt
Pmxlbmd0aCgpKTsKKyAgICBBU1NFUlQobV90ZXh0SXRlbVR5cGUgIT0gVGV4dEl0ZW1UeXBlOjpV
bmRlZmluZWQpOworICAgIEFTU0VSVChsZW5ndGgpOworICAgIHJldHVybiB7IGlubGluZVRleHRC
b3goKSwgZW5kKCkgLSBsZW5ndGgsIGxlbmd0aCwgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuKCksIGlz
V29yZFNlcGFyYXRvcigpLCBXVEY6Om51bGxvcHQsIG1fdGV4dEl0ZW1UeXBlIH07Cit9CisKK30K
K30KKworU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19JTkxJTkVfSVRFTShJbmxpbmVUZXh0SXRlbSwg
aXNUZXh0KCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvdGV4dC9UZXh0VXRpbC5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZS90ZXh0L1RleHRVdGlsLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi43ZTU3NWJjZTcyODUzYThjOWRiZjM2MmY0ZmM5YjE5OTc2YWIyNTIwCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxp
bmUvdGV4dC9UZXh0VXRpbC5jcHAKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGV4dFV0aWwuaCIKKworI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiQnJlYWtMaW5lcy5oIgorI2luY2x1
ZGUgIkZvbnRDYXNjYWRlLmgiCisjaW5jbHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIKKyNpbmNsdWRl
ICJMYXlvdXRJbmxpbmVUZXh0Qm94LmgiCisjaW5jbHVkZSAiUmVuZGVyQm94LmgiCisjaW5jbHVk
ZSAiUmVuZGVyU3R5bGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91
dCB7CisKK0lubGluZUxheW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRJ
dGVtJiBpbmxpbmVUZXh0SXRlbSwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQp
Cit7CisgICAgcmV0dXJuIFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4
dEl0ZW0uc3RhcnQoKSwgaW5saW5lVGV4dEl0ZW0uZW5kKCksIGNvbnRlbnRMb2dpY2FsTGVmdCk7
Cit9CisKK0lubGluZUxheW91dFVuaXQgVGV4dFV0aWw6OndpZHRoKGNvbnN0IElubGluZVRleHRJ
dGVtJiBpbmxpbmVUZXh0SXRlbSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxh
eW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KQoreworICAgIFJFTEVBU0VfQVNTRVJUKGZyb20g
Pj0gaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSk7CisgICAgUkVMRUFTRV9BU1NFUlQodG8gPD0gaW5s
aW5lVGV4dEl0ZW0uZW5kKCkpOworICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2Uo
KSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhpbmxpbmVU
ZXh0SXRlbSkpIHsKKyAgICAgICAgYXV0byBzcGFjZVdpZHRoID0gaW5saW5lVGV4dEl0ZW0uc3R5
bGUoKS5mb250Q2FzY2FkZSgpLnNwYWNlV2lkdGgoKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6aXNu
YW4oc3BhY2VXaWR0aCkgPyAwLjBmIDogc3RkOjppc2luZihzcGFjZVdpZHRoKSA/IG1heElubGlu
ZUxheW91dFVuaXQoKSA6IHNwYWNlV2lkdGg7CisgICAgfQorICAgIHJldHVybiBUZXh0VXRpbDo6
d2lkdGgoaW5saW5lVGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpLCBmcm9tLCB0bywgY29udGVudExv
Z2ljYWxMZWZ0KTsKK30KKworSW5saW5lTGF5b3V0VW5pdCBUZXh0VXRpbDo6d2lkdGgoY29uc3Qg
SW5saW5lVGV4dEJveCYgaW5saW5lVGV4dEJveCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8s
IElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KQoreworICAgIGlmIChmcm9tID09
IHRvKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGF1dG8mIHN0eWxlID0gaW5saW5lVGV4dEJv
eC5zdHlsZSgpOworICAgIGF1dG8mIGZvbnQgPSBzdHlsZS5mb250Q2FzY2FkZSgpOworICAgIGF1
dG8gdGV4dCA9IGlubGluZVRleHRCb3guY29udGVudCgpOworICAgIEFTU0VSVCh0byA8PSB0ZXh0
Lmxlbmd0aCgpKTsKKyAgICBhdXRvIGhhc0tlcm5pbmdPckxpZ2F0dXJlcyA9IGZvbnQuZW5hYmxl
S2VybmluZygpIHx8IGZvbnQucmVxdWlyZXNTaGFwaW5nKCk7CisgICAgYXV0byBtZWFzdXJlV2l0
aEVuZFNwYWNlID0gaGFzS2VybmluZ09yTGlnYXR1cmVzICYmIHRvIDwgdGV4dC5sZW5ndGgoKSAm
JiB0ZXh0W3RvXSA9PSAnICc7CisgICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2UpCisgICAgICAg
ICsrdG87CisgICAgZmxvYXQgd2lkdGggPSAwOworICAgIGlmIChpbmxpbmVUZXh0Qm94LmNhblVz
ZVNpbXBsaWZpZWRDb250ZW50TWVhc3VyaW5nKCkpCisgICAgICAgIHdpZHRoID0gZm9udC53aWR0
aEZvclNpbXBsZVRleHQoU3RyaW5nVmlldyh0ZXh0KS5zdWJzdHJpbmcoZnJvbSwgdG8gLSBmcm9t
KSk7CisgICAgZWxzZSB7CisgICAgICAgIGF1dG8gdGFiV2lkdGggPSBzdHlsZS5jb2xsYXBzZVdo
aXRlU3BhY2UoKSA/IFRhYlNpemUoMCkgOiBzdHlsZS50YWJTaXplKCk7CisgICAgICAgIFdlYkNv
cmU6OlRleHRSdW4gcnVuKFN0cmluZ1ZpZXcodGV4dCkuc3Vic3RyaW5nKGZyb20sIHRvIC0gZnJv
bSksIGNvbnRlbnRMb2dpY2FsTGVmdCk7CisgICAgICAgIGlmICh0YWJXaWR0aCkKKyAgICAgICAg
ICAgIHJ1bi5zZXRUYWJTaXplKHRydWUsIHRhYldpZHRoKTsKKyAgICAgICAgd2lkdGggPSBmb250
LndpZHRoKHJ1bik7CisgICAgfQorCisgICAgaWYgKG1lYXN1cmVXaXRoRW5kU3BhY2UpCisgICAg
ICAgIHdpZHRoIC09IChmb250LnNwYWNlV2lkdGgoKSArIGZvbnQud29yZFNwYWNpbmcoKSk7CisK
KyAgICByZXR1cm4gc3RkOjppc25hbih3aWR0aCkgPyAwLjBmIDogc3RkOjppc2luZih3aWR0aCkg
PyBtYXhJbmxpbmVMYXlvdXRVbml0KCkgOiB3aWR0aDsKK30KKworVGV4dFV0aWw6OlNwbGl0RGF0
YSBUZXh0VXRpbDo6c3BsaXQoY29uc3QgSW5saW5lVGV4dEl0ZW0mIGlubGluZVRleHRJdGVtLCBJ
bmxpbmVMYXlvdXRVbml0IHRleHRXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0
aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpCit7CisgICAgQVNTRVJUKGF2
YWlsYWJsZVdpZHRoID49IDApOworICAgIGF1dG8gc3RhcnRQb3NpdGlvbiA9IGlubGluZVRleHRJ
dGVtLnN0YXJ0KCk7CisgICAgYXV0byBsZW5ndGggPSBpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKTsK
KyAgICBBU1NFUlQobGVuZ3RoKTsKKworICAgIGF1dG8gbGVmdCA9IHN0YXJ0UG9zaXRpb247Cisg
ICAgLy8gUGF0aG9sb2dpY2FsIGNhc2Ugb2YgKGV4dHJlbWVseSlsb25nIHN0cmluZyBhbmQgbmFy
cm93IGxpbmVzLgorICAgIC8vIEFkanVzdCB0aGUgcmFuZ2Ugc28gdGhhdCB3ZSBjYW4gcGljayBh
IHJlYXNvbmFibGUgbWlkcG9pbnQuCisgICAgSW5saW5lTGF5b3V0VW5pdCBhdmVyYWdlQ2hhcmFj
dGVyV2lkdGggPSB0ZXh0V2lkdGggLyBsZW5ndGg7CisgICAgdW5zaWduZWQgb2Zmc2V0ID0gdG9M
YXlvdXRVbml0KDIgKiBhdmFpbGFibGVXaWR0aCAvIGF2ZXJhZ2VDaGFyYWN0ZXJXaWR0aCkudG9V
bnNpZ25lZCgpOworICAgIGF1dG8gcmlnaHQgPSBzdGQ6Om1pbjx1bnNpZ25lZD4obGVmdCArIG9m
ZnNldCwgKHN0YXJ0UG9zaXRpb24gKyBsZW5ndGggLSAxKSk7CisgICAgLy8gUHJlc2VydmUgdGhl
IGxlZnQgd2lkdGggZm9yIHRoZSBmaW5hbCBzcGxpdCBwb3NpdGlvbiBzbyB0aGF0IHdlIGRvbid0
IG5lZWQgdG8gcmVtZWFzdXJlIHRoZSBsZWZ0IHNpZGUgYWdhaW4uCisgICAgSW5saW5lTGF5b3V0
VW5pdCBsZWZ0U2lkZVdpZHRoID0gMDsKKyAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7CisgICAg
ICAgIGF1dG8gbWlkZGxlID0gKGxlZnQgKyByaWdodCkgLyAyOworICAgICAgICBhdXRvIHdpZHRo
ID0gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRJdGVtLCBzdGFydFBvc2l0aW9uLCBtaWRkbGUg
KyAxLCBjb250ZW50TG9naWNhbExlZnQpOworICAgICAgICBpZiAod2lkdGggPCBhdmFpbGFibGVX
aWR0aCkgeworICAgICAgICAgICAgbGVmdCA9IG1pZGRsZSArIDE7CisgICAgICAgICAgICBsZWZ0
U2lkZVdpZHRoID0gd2lkdGg7CisgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPiBhdmFpbGFibGVX
aWR0aCkKKyAgICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlOworICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICAgIHJpZ2h0ID0gbWlkZGxlICsgMTsKKyAgICAgICAgICAgIGxlZnRTaWRlV2lkdGggPSB3
aWR0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB7
IHN0YXJ0UG9zaXRpb24sIHJpZ2h0IC0gc3RhcnRQb3NpdGlvbiwgbGVmdFNpZGVXaWR0aCB9Owor
fQorCit1bnNpZ25lZCBUZXh0VXRpbDo6ZmluZE5leHRCcmVha2FibGVQb3NpdGlvbihMYXp5TGlu
ZUJyZWFrSXRlcmF0b3ImIGxpbmVCcmVha0l0ZXJhdG9yLCB1bnNpZ25lZCBzdGFydFBvc2l0aW9u
LCBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUpCit7CisgICAgYXV0byBrZWVwQWxsV29yZHNGb3JD
SksgPSBzdHlsZS53b3JkQnJlYWsoKSA9PSBXb3JkQnJlYWs6OktlZXBBbGw7CisgICAgYXV0byBi
cmVha05CU1AgPSBzdHlsZS5hdXRvV3JhcCgpICYmIHN0eWxlLm5ic3BNb2RlKCkgPT0gTkJTUE1v
ZGU6OlNwYWNlOworCisgICAgaWYgKGtlZXBBbGxXb3Jkc0ZvckNKSykgeworICAgICAgICBpZiAo
YnJlYWtOQlNQKQorICAgICAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbktlZXBp
bmdBbGxXb3JkcyhsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7CisgICAgICAgIHJl
dHVybiBuZXh0QnJlYWthYmxlUG9zaXRpb25LZWVwaW5nQWxsV29yZHNJZ25vcmluZ05CU1AobGlu
ZUJyZWFrSXRlcmF0b3IsIHN0YXJ0UG9zaXRpb24pOworICAgIH0KKworICAgIGlmIChsaW5lQnJl
YWtJdGVyYXRvci5tb2RlKCkgPT0gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpEZWZhdWx0KSB7Cisg
ICAgICAgIGlmIChicmVha05CU1ApCisgICAgICAgICAgICByZXR1cm4gV2ViQ29yZTo6bmV4dEJy
ZWFrYWJsZVBvc2l0aW9uKGxpbmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9uKTsKKyAgICAg
ICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbklnbm9yaW5nTkJTUChsaW5lQnJlYWtJdGVy
YXRvciwgc3RhcnRQb3NpdGlvbik7CisgICAgfQorCisgICAgaWYgKGJyZWFrTkJTUCkKKyAgICAg
ICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbldpdGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJ
dGVyYXRvciwgc3RhcnRQb3NpdGlvbik7CisgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlv
bklnbm9yaW5nTkJTUFdpdGhvdXRTaG9ydGN1dChsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3Np
dGlvbik7Cit9CisKK2Jvb2wgVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhj
b25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3Nz
LXRleHQtMy8jd2hpdGUtc3BhY2UtcHJvcGVydHkKKyAgICBhdXRvIHdoaXRlc3BhY2UgPSBsYXlv
dXRCb3guc3R5bGUoKS53aGl0ZVNwYWNlKCk7CisgICAgcmV0dXJuIHdoaXRlc3BhY2UgPT0gV2hp
dGVTcGFjZTo6UHJlIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlV3JhcCB8fCB3aGl0
ZXNwYWNlID09IFdoaXRlU3BhY2U6OkJyZWFrU3BhY2VzOworfQorCitib29sIFRleHRVdGlsOjpz
aG91bGRQcmVzZXJ2ZU5ld2xpbmUoY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgYXV0byB3
aGl0ZXNwYWNlID0gbGF5b3V0Qm94LnN0eWxlKCkud2hpdGVTcGFjZSgpOworICAgIC8vIGh0dHBz
Oi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eQorICAgIHJl
dHVybiB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZSB8fCB3aGl0ZXNwYWNlID09IFdoaXRl
U3BhY2U6OlByZVdyYXAgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpCcmVha1NwYWNlcyB8
fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OlByZUxpbmU7IAorfQorCitMaW5lQnJlYWtJdGVy
YXRvck1vZGUgVGV4dFV0aWw6OmxpbmVCcmVha0l0ZXJhdG9yTW9kZShMaW5lQnJlYWsgbGluZUJy
ZWFrKQoreworICAgIHN3aXRjaCAobGluZUJyZWFrKSB7CisgICAgY2FzZSBMaW5lQnJlYWs6OkF1
dG86CisgICAgY2FzZSBMaW5lQnJlYWs6OkFmdGVyV2hpdGVTcGFjZToKKyAgICBjYXNlIExpbmVC
cmVhazo6QW55d2hlcmU6CisgICAgICAgIHJldHVybiBMaW5lQnJlYWtJdGVyYXRvck1vZGU6OkRl
ZmF1bHQ7CisgICAgY2FzZSBMaW5lQnJlYWs6Okxvb3NlOgorICAgICAgICByZXR1cm4gTGluZUJy
ZWFrSXRlcmF0b3JNb2RlOjpMb29zZTsKKyAgICBjYXNlIExpbmVCcmVhazo6Tm9ybWFsOgorICAg
ICAgICByZXR1cm4gTGluZUJyZWFrSXRlcmF0b3JNb2RlOjpOb3JtYWw7CisgICAgY2FzZSBMaW5l
QnJlYWs6OlN0cmljdDoKKyAgICAgICAgcmV0dXJuIExpbmVCcmVha0l0ZXJhdG9yTW9kZTo6U3Ry
aWN0OworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gTGluZUJy
ZWFrSXRlcmF0b3JNb2RlOjpEZWZhdWx0OworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lL3RleHQvVGV4
dFV0aWwuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5l
L3RleHQvVGV4dFV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xZjU4NGZhNzk4MWJkNDM4M2NmNDNlMjNhNGJm
YWViODIwY2UzMmYyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy9pbmxpbmUvdGV4dC9UZXh0VXRpbC5oCkBAIC0wLDAgKzEsNjUgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElO
R19DT05URVhUKQorCisjaW5jbHVkZSAiSW5saW5lSXRlbS5oIgorI2luY2x1ZGUgIkxheW91dFVu
aXRzLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvVGV4dEJyZWFrSXRlcmF0b3IuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjbGFzcyBSZW5kZXJTdHlsZTsKKworbmFtZXNwYWNlIExheW91dCB7
CisKK2NsYXNzIElubGluZVRleHRCb3g7CitjbGFzcyBJbmxpbmVUZXh0SXRlbTsKKworY2xhc3Mg
VGV4dFV0aWwgeworcHVibGljOgorICAgIHN0YXRpYyBJbmxpbmVMYXlvdXRVbml0IHdpZHRoKGNv
bnN0IElubGluZVRleHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQp
OworICAgIHN0YXRpYyBJbmxpbmVMYXlvdXRVbml0IHdpZHRoKGNvbnN0IElubGluZVRleHRJdGVt
JiwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91dFVuaXQgY29udGVudExv
Z2ljYWxMZWZ0KTsKKyAgICBzdGF0aWMgSW5saW5lTGF5b3V0VW5pdCB3aWR0aChjb25zdCBJbmxp
bmVUZXh0Qm94JiwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91dFVuaXQg
Y29udGVudExvZ2ljYWxMZWZ0KTsKKworICAgIHN0cnVjdCBTcGxpdERhdGEgeworICAgICAgICB1
bnNpZ25lZCBzdGFydCB7IDAgfTsKKyAgICAgICAgdW5zaWduZWQgbGVuZ3RoIHsgMCB9OworICAg
ICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCB7IDAgfTsKKyAgICB9OworICAgIHN0
YXRpYyBTcGxpdERhdGEgc3BsaXQoY29uc3QgSW5saW5lVGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRV
bml0IHRleHRXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCwgSW5saW5lTGF5
b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpOworCisgICAgc3RhdGljIHVuc2lnbmVkIGZpbmRO
ZXh0QnJlYWthYmxlUG9zaXRpb24oTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiwgdW5zaWduZWQgc3Rh
cnRQb3NpdGlvbiwgY29uc3QgUmVuZGVyU3R5bGUmKTsKKyAgICBzdGF0aWMgTGluZUJyZWFrSXRl
cmF0b3JNb2RlIGxpbmVCcmVha0l0ZXJhdG9yTW9kZShMaW5lQnJlYWspOworCisgICAgc3RhdGlj
IGJvb2wgc2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGNvbnN0IEJveCYpOworICAgIHN0YXRp
YyBib29sIHNob3VsZFByZXNlcnZlTmV3bGluZShjb25zdCBCb3gmKTsKK307CisKK30KK30KKyNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2VyLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVDb250
ZW50QnJlYWtlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MGE2ZGE5Zjlj
MTRmMDE0NDUxZmFkYTI0NmZiMGViY2QxMmQyYjguLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250
ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2VyLmNwcAorKysgL2Rldi9u
dWxsCkBAIC0xLDUzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0g
KiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICog
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgot
I2luY2x1ZGUgIklubGluZUNvbnRlbnRCcmVha2VyLmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZP
Uk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCi0jaW5jbHVkZSAi
SHlwaGVuYXRpb24uaCIKLSNpbmNsdWRlICJJbmxpbmVJdGVtLmgiCi0jaW5jbHVkZSAiSW5saW5l
VGV4dEl0ZW0uaCIKLSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLSNpbmNsdWRlICJU
ZXh0VXRpbC5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQot
Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLXN0YXRpYyBpbmxpbmUgYm9vbCBoYXNUcmFpbGluZ1RleHRD
b250ZW50KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudCYgY29u
dGludW91c0NvbnRlbnQpCi17Ci0gICAgZm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZlcnNl
ZFJhbmdlKGNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKSkpIHsKLSAgICAgICAgYXV0byYgaW5saW5l
SXRlbSA9IHJ1bi5pbmxpbmVJdGVtOwotICAgICAgICBpZiAoaW5saW5lSXRlbS5pc0lubGluZUJv
eFN0YXJ0KCkgfHwgaW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpKQotICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgIHJldHVybiBpbmxpbmVJdGVtLmlzVGV4dCgpOwotICAgIH0KLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSBib29sIGhhc0xlYWRpbmdU
ZXh0Q29udGVudChjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQm
IGNvbnRpbnVvdXNDb250ZW50KQotewotICAgIGZvciAoYXV0byYgcnVuIDogY29udGludW91c0Nv
bnRlbnQucnVucygpKSB7Ci0gICAgICAgIGF1dG8mIGlubGluZUl0ZW0gPSBydW4uaW5saW5lSXRl
bTsKLSAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpIHx8IGlubGluZUl0
ZW0uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICByZXR1
cm4gaW5saW5lSXRlbS5pc1RleHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1z
dGF0aWMgaW5saW5lIGJvb2wgaGFzVGV4dFJ1bihjb25zdCBJbmxpbmVDb250ZW50QnJlYWtlcjo6
Q29udGludW91c0NvbnRlbnQmIGNvbnRpbnVvdXNDb250ZW50KQotewotICAgIC8vIDxzcGFuPnRl
eHQ8L3NwYW4+IGlzIGNvbnNpZGVyZWQgYSB0ZXh0IHJ1biBldmVuIHdpdGggdGhlIFtpbmxpbmUg
Ym94IHN0YXJ0XVtpbmxpbmUgYm94IGVuZF0gaW5saW5lIGl0ZW1zLgotICAgIC8vIEJhc2VkIG9u
IHN0YW5kYXJkcyBjb21taXQgYm91bmRhcnkgcnVsZXMgaXQgd291bGQgYmUgZW5vdWdoIHRvIGNo
ZWNrIHRoZSBmaXJzdCBpbmxpbmUgaXRlbSwgYnV0IGR1ZSB0byB0aGUgdGFibGUgcXVpcmssIHdl
IGNhbiBoYXZlCi0gICAgLy8gaW1hZ2UgYW5kIHRleHQgbmV4dCB0byBlYWNoIG90aGVyIGluc2lk
ZSBhIGNvbnRpbnVvdXMgc2V0IG9mIHJ1bnMgKHNlZSBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6
UXVpcmtzOjpoYXNTb2Z0V3JhcE9wcG9ydHVuaXR5QXRJbWFnZSkuCi0gICAgZm9yIChhdXRvJiBy
dW4gOiBjb250aW51b3VzQ29udGVudC5ydW5zKCkpIHsKLSAgICAgICAgaWYgKHJ1bi5pbmxpbmVJ
dGVtLmlzVGV4dCgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVy
biBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzVmlzdWFsbHlFbXB0eVdoaXRlc3Bh
Y2VDb250ZW50KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudCYg
Y29udGludW91c0NvbnRlbnQpCi17Ci0gICAgLy8gWzxzcGFuPjwvc3Bhbj4gXSBbPHNwYW4+IDwv
c3Bhbj5dIFsgPHNwYW4gc3R5bGU9InBhZGRpbmc6IDBweDsiPjwvc3Bhbj5dIGFyZSBhbGwgY29u
c2lkZXJlZCB2aXN1YWxseSBlbXB0eSB3aGl0ZXNwYWNlIGNvbnRlbnQuCi0gICAgLy8gWzxzcGFu
IHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCByZWQiPjwvc3Bhbj4gXSB3aGlsZSB0aGlzIGlzIHdo
aXRlc3BhY2UgY29udGVudCBvbmx5LCBpdCBpcyBub3QgY29uc2lkZXJlZCB2aXN1YWxseSBlbXB0
eS4KLSAgICAvLyBEdWUgdG8gY29tbWl0IGJvdW5kYXJ5IHJ1bGVzLCB3ZSBqdXN0IG5lZWQgdG8g
Y2hlY2sgdGhlIGZpcnN0IG5vbi10eXBlbGVzcyBpbmxpbmUgaXRlbSAoY2FuJ3QgaGF2ZSBib3Ro
IFtpbWddIGFuZCBbdGV4dF0pCi0gICAgZm9yIChhdXRvJiBydW4gOiBjb250aW51b3VzQ29udGVu
dC5ydW5zKCkpIHsKLSAgICAgICAgYXV0byYgaW5saW5lSXRlbSA9IHJ1bi5pbmxpbmVJdGVtOwot
ICAgICAgICAvLyBGSVhNRTogY2hlY2sgZm9yIHBhZGRpbmcgYm9yZGVyIGV0Yy4KLSAgICAgICAg
aWYgKGlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpIHx8IGlubGluZUl0ZW0uaXNJbmxpbmVC
b3hFbmQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICByZXR1cm4gaW5saW5lSXRl
bS5pc1RleHQoKSAmJiBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSkuaXNXaGl0
ZXNwYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSBi
b29sIGlzTm9uQ29udGVudFJ1bnNPbmx5KGNvbnN0IElubGluZUNvbnRlbnRCcmVha2VyOjpDb250
aW51b3VzQ29udGVudCYgY29udGludW91c0NvbnRlbnQpCi17Ci0gICAgLy8gPHNwYW4+PC9zcGFu
PiA8LSBub24gY29udGVudCBydW5zLgotICAgIGZvciAoYXV0byYgcnVuIDogY29udGludW91c0Nv
bnRlbnQucnVucygpKSB7Ci0gICAgICAgIGF1dG8mIGlubGluZUl0ZW0gPSBydW4uaW5saW5lSXRl
bTsKLSAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpIHx8IGlubGluZUl0
ZW0uaXNJbmxpbmVCb3hFbmQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIE9w
dGlvbmFsPHNpemVfdD4gZmlyc3RUZXh0UnVuSW5kZXgoY29uc3QgSW5saW5lQ29udGVudEJyZWFr
ZXI6OkNvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkKLXsKLSAgICBhdXRvJiBy
dW5zID0gY29udGludW91c0NvbnRlbnQucnVucygpOwotICAgIGZvciAoc2l6ZV90IGluZGV4ID0g
MDsgaW5kZXggPCBydW5zLnNpemUoKTsgKytpbmRleCkgewotICAgICAgICBpZiAocnVuc1tpbmRl
eF0uaW5saW5lSXRlbS5pc1RleHQoKSkKLSAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9
Ci0gICAgcmV0dXJuIHsgfTsKLX0KLQotYm9vbCBJbmxpbmVDb250ZW50QnJlYWtlcjo6aXNXcmFw
cGluZ0FsbG93ZWQoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSkKLXsKLSAgICBhdXRvJiBz
dHlsZVRvVXNlID0gaW5saW5lSXRlbS5pc0JveCgpID8gaW5saW5lSXRlbS5sYXlvdXRCb3goKS5w
YXJlbnQoKS5zdHlsZSgpIDogaW5saW5lSXRlbS5sYXlvdXRCb3goKS5zdHlsZSgpOyAKLSAgICAv
LyBEbyBub3QgdHJ5IHRvIHdyYXAgb3ZlcmZsb3duICdwcmUnIGFuZCAnbm8td3JhcCcgY29udGVu
dCB0byBuZXh0IGxpbmUuCi0gICAgcmV0dXJuIHN0eWxlVG9Vc2Uud2hpdGVTcGFjZSgpICE9IFdo
aXRlU3BhY2U6OlByZSAmJiBzdHlsZVRvVXNlLndoaXRlU3BhY2UoKSAhPSBXaGl0ZVNwYWNlOjpO
b1dyYXA7Ci19Ci0KLWJvb2wgSW5saW5lQ29udGVudEJyZWFrZXI6OnNob3VsZEtlZXBFbmRPZkxp
bmVXaGl0ZXNwYWNlKGNvbnN0IENvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCkg
Y29uc3QKLXsKLSAgICAvLyBHcmFiIHRoZSBzdHlsZSBhbmQgY2hlY2sgZm9yIHdoaXRlLXNwYWNl
IHByb3BlcnR5IHRvIGRlY2lkZSB3aGV0aGVyIHdlIHNob3VsZCBsZXQgdGhpcyB3aGl0ZXNwYWNl
IGNvbnRlbnQgb3ZlcmZsb3cgdGhlIGN1cnJlbnQgbGluZS4KLSAgICAvLyBOb3RlIHRoYXQgdGhl
ICJrZWVwIiBpbiB0aGlzIGNvbnRleHQgbWVhbnMgd2UgbGV0IHRoZSB3aGl0ZXNwYWNlIGNvbnRl
bnQgc2l0IG9uIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgLy8gSXQgbWlnaHQgdmVyeSB3ZWxsIGdl
dCBjb2xsYXBzZWQgd2hlbiB3ZSBjbG9zZSB0aGUgbGluZSAobm9ybWFsL25vd3JhcC9wcmUtbGlu
ZSkuCi0gICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1z
cGFjZS1wcm9wZXJ0eQotICAgIGF1dG8gd2hpdGVzcGFjZSA9IGNvbnRpbnVvdXNDb250ZW50LnJ1
bnMoKVsqZmlyc3RUZXh0UnVuSW5kZXgoY29udGludW91c0NvbnRlbnQpXS5pbmxpbmVJdGVtLnN0
eWxlKCkud2hpdGVTcGFjZSgpOwotICAgIHJldHVybiB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6
Ok5vcm1hbCB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6Ok5vV3JhcCB8fCB3aGl0ZXNwYWNl
ID09IFdoaXRlU3BhY2U6OlByZVdyYXAgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpQcmVM
aW5lOwotfQotCi1JbmxpbmVDb250ZW50QnJlYWtlcjo6UmVzdWx0IElubGluZUNvbnRlbnRCcmVh
a2VyOjpwcm9jZXNzSW5saW5lQ29udGVudChjb25zdCBDb250aW51b3VzQ29udGVudCYgY2FuZGlk
YXRlQ29udGVudCwgY29uc3QgTGluZVN0YXR1cyYgbGluZVN0YXR1cykKLXsKLSAgICBBU1NFUlQo
IXN0ZDo6aXNuYW4obGluZVN0YXR1cy5hdmFpbGFibGVXaWR0aCkpOwotICAgIGF1dG8gcHJvY2Vz
c0NhbmRpZGF0ZUNvbnRlbnQgPSBbJl0gewotICAgICAgICBpZiAoY2FuZGlkYXRlQ29udGVudC5s
b2dpY2FsV2lkdGgoKSA8PSBsaW5lU3RhdHVzLmF2YWlsYWJsZVdpZHRoKQotICAgICAgICAgICAg
cmV0dXJuIFJlc3VsdCB7IFJlc3VsdDo6QWN0aW9uOjpLZWVwIH07Ci0jaWYgVVNFX0ZMT0FUX0FT
X0lOTElORV9MQVlPVVRfVU5JVAotICAgICAgICAvLyBQcmVmZXJyZWQgd2lkdGggY29tcHV0YXRp
b24gc3VtcyB1cCBmbG9hdHMgd2hpbGUgbGluZSBicmVha2VyIHN1YnRyYWN0cyB0aGVtLiBUaGlz
IGNhbiBsZWFkIHRvIGVwc2lsb24tc2NhbGUgZGlmZmVyZW5jZXMuCi0gICAgICAgIGlmIChXVEY6
OmFyZUVzc2VudGlhbGx5RXF1YWwoY2FuZGlkYXRlQ29udGVudC5sb2dpY2FsV2lkdGgoKSwgbGlu
ZVN0YXR1cy5hdmFpbGFibGVXaWR0aCkpCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVz
dWx0OjpBY3Rpb246OktlZXAgfTsKLSNlbmRpZgotICAgICAgICByZXR1cm4gcHJvY2Vzc092ZXJm
bG93aW5nQ29udGVudChjYW5kaWRhdGVDb250ZW50LCBsaW5lU3RhdHVzKTsKLSAgICB9OwotCi0g
ICAgYXV0byByZXN1bHQgPSBwcm9jZXNzQ2FuZGlkYXRlQ29udGVudCgpOwotICAgIGlmIChyZXN1
bHQuYWN0aW9uID09IFJlc3VsdDo6QWN0aW9uOjpXcmFwICYmIGxpbmVTdGF0dXMudHJhaWxpbmdT
b2Z0SHlwaGVuV2lkdGggJiYgaGFzTGVhZGluZ1RleHRDb250ZW50KGNhbmRpZGF0ZUNvbnRlbnQp
KSB7Ci0gICAgICAgIC8vIEEgdHJhaWxpbmcgc29mdCBoeXBoZW4gd2l0aCBhIHdyYXBwZWQgdGV4
dCBjb250ZW50IHR1cm5zIGludG8gYSB2aXNpYmxlIGh5cGhlbi4KLSAgICAgICAgLy8gTGV0J3Mg
Y2hlY2sgaWYgdGhlcmUncyBlbm91Z2ggc3BhY2UgZm9yIHRoZSBoeXBoZW4gY2hhcmFjdGVyLgot
ICAgICAgICBhdXRvIGh5cGhlbk92ZXJmbG93cyA9ICpsaW5lU3RhdHVzLnRyYWlsaW5nU29mdEh5
cGhlbldpZHRoID4gbGluZVN0YXR1cy5hdmFpbGFibGVXaWR0aDsKLSAgICAgICAgYXV0byBhY3Rp
b24gPSBoeXBoZW5PdmVyZmxvd3MgPyBSZXN1bHQ6OkFjdGlvbjo6UmV2ZXJ0VG9MYXN0Tm9uT3Zl
cmZsb3dpbmdXcmFwT3Bwb3J0dW5pdHkgOiBSZXN1bHQ6OkFjdGlvbjo6V3JhcFdpdGhIeXBoZW47
Ci0gICAgICAgIHJlc3VsdCA9IHsgYWN0aW9uLCBJc0VuZE9mTGluZTo6WWVzIH07Ci0gICAgfQot
ICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cnVjdCBPdmVyZmxvd2luZ1RleHRDb250ZW50IHsK
LSAgICBzaXplX3QgcnVuSW5kZXggeyAwIH07IC8vIE92ZXJmbG93aW5nIHJ1biBpbmRleC4gVGhl
cmUncyBhbHdheXMgYW4gb3ZlcmZsb3dpbmcgcnVuLgotICAgIHN0cnVjdCBCcmVha2luZ1Bvc2l0
aW9uIHsKLSAgICAgICAgc2l6ZV90IHJ1bkluZGV4IHsgMCB9OwotICAgICAgICBzdHJ1Y3QgVHJh
aWxpbmdDb250ZW50IHsKLSAgICAgICAgICAgIC8vIFRyYWlsaW5nIGNvbnRlbnQgaXMgZWl0aGVy
IHRoZSBydW4ncyBsZWZ0IHNpZGUgKHdoZW4gd2UgYnJlYWsgdGhlIHJ1biBzb21ld2hlcmUgaW4g
dGhlIG1pZGRsZSkgb3IgdGhlIHByZXZpb3VzIHJ1bi4KLSAgICAgICAgICAgIC8vIFNvbWV0aW1l
cyB0aGUgYnJlYWtpbmcgcG9zaXRpb24gaXMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBm
aXJzdCBydW4sIHNvIHRoZXJlJ3Mgbm8gdHJhaWxpbmcgcnVuIGF0IGFsbC4KLSAgICAgICAgICAg
IGJvb2wgb3ZlcmZsb3dzIHsgZmFsc2UgfTsKLSAgICAgICAgICAgIE9wdGlvbmFsPElubGluZUNv
bnRlbnRCcmVha2VyOjpQYXJ0aWFsUnVuPiBwYXJ0aWFsUnVuIHsgfTsKLSAgICAgICAgfTsKLSAg
ICAgICAgT3B0aW9uYWw8VHJhaWxpbmdDb250ZW50PiB0cmFpbGluZ0NvbnRlbnQgeyB9OwotICAg
IH07Ci0gICAgT3B0aW9uYWw8QnJlYWtpbmdQb3NpdGlvbj4gYnJlYWtpbmdQb3NpdGlvbiB7IH07
IC8vIFdoZXJlIHdlIGFjdHVhbGx5IGJyZWFrIHRoaXMgb3ZlcmZsb3dpbmcgY29udGVudC4KLX07
Ci0KLUlubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQgSW5saW5lQ29udGVudEJyZWFrZXI6OnBy
b2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnQoY29uc3QgQ29udGludW91c0NvbnRlbnQmIG92ZXJmbG93
Q29udGVudCwgY29uc3QgTGluZVN0YXR1cyYgbGluZVN0YXR1cykgY29uc3QKLXsKLSAgICBhdXRv
IGNvbnRpbnVvdXNDb250ZW50ID0gQ29udGludW91c0NvbnRlbnQgeyBvdmVyZmxvd0NvbnRlbnQg
fTsKLSAgICBBU1NFUlQoIWNvbnRpbnVvdXNDb250ZW50LnJ1bnMoKS5pc0VtcHR5KCkpOwotCi0g
ICAgQVNTRVJUKGNvbnRpbnVvdXNDb250ZW50LmxvZ2ljYWxXaWR0aCgpID4gbGluZVN0YXR1cy5h
dmFpbGFibGVXaWR0aCk7Ci0gICAgaWYgKGNvbnRpbnVvdXNDb250ZW50Lmhhc1RyYWlsaW5nQ29s
bGFwc2libGVDb250ZW50KCkpIHsKLSAgICAgICAgQVNTRVJUKGhhc1RyYWlsaW5nVGV4dENvbnRl
bnQob3ZlcmZsb3dDb250ZW50KSk7Ci0gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZSBjb250
ZW50IGZpdHMgd2l0aG91dCB0aGUgdHJhaWxpbmcgY29sbGFwc2libGUgcGFydC4KLSAgICAgICAg
aWYgKGNvbnRpbnVvdXNDb250ZW50Lm5vbkNvbGxhcHNpYmxlTG9naWNhbFdpZHRoKCkgPD0gbGlu
ZVN0YXR1cy5hdmFpbGFibGVXaWR0aCkKLSAgICAgICAgICAgIHJldHVybiB7IFJlc3VsdDo6QWN0
aW9uOjpLZWVwLCBJc0VuZE9mTGluZTo6Tm8gfTsKLSAgICAgICAgLy8gTm93IGNoZWNrIGlmIHdl
IGNhbiB0cmltIHRoZSBsaW5lIHRvby4KLSAgICAgICAgaWYgKGxpbmVTdGF0dXMuaGFzRnVsbHlD
b2xsYXBzaWJsZVRyYWlsaW5nUnVuICYmIGNvbnRpbnVvdXNDb250ZW50LmlzRnVsbHlDb2xsYXBz
aWJsZSgpKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGlzIG5ldyBjb250ZW50IGlzIGZ1bGx5IGNv
bGxhcHNpYmxlLCBpdCBzaG91bGQgc3VyZWx5IGZpdC4KLSAgICAgICAgICAgIHJldHVybiB7IFJl
c3VsdDo6QWN0aW9uOjpLZWVwLCBJc0VuZE9mTGluZTo6Tm8gfTsKLSAgICAgICAgfQotICAgIH0g
ZWxzZSBpZiAobGluZVN0YXR1cy5jb2xsYXBzaWJsZVdpZHRoICYmIGlzTm9uQ29udGVudFJ1bnNP
bmx5KGNvbnRpbnVvdXNDb250ZW50KSkgewotICAgICAgICAvLyBMZXQncyBzZWUgaWYgdGhlIG5v
bi1jb250ZW50IHJ1bnMgZml0IHdoZW4gdGhlIGxpbmUgaGFzIHRyYWlsaW5nIGNvbGxhcHNpYmxl
IGNvbnRlbnQuCi0gICAgICAgIC8vICJ0ZXh0IGNvbnRlbnQgPHNwYW4gc3R5bGU9InBhZGRpbmc6
IDFweCI+PC9zcGFuPiIgPC0gdGhlIDxzcGFuPjwvc3Bhbj4gcnVucyBjb3VsZCBmaXQgYWZ0ZXIg
Y29sbGFwc2luZyB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZS4KLSAgICAgICAgaWYgKGNvbnRpbnVv
dXNDb250ZW50LmxvZ2ljYWxXaWR0aCgpIDw9IGxpbmVTdGF0dXMuYXZhaWxhYmxlV2lkdGggKyBs
aW5lU3RhdHVzLmNvbGxhcHNpYmxlV2lkdGgpCi0gICAgICAgICAgICByZXR1cm4geyBSZXN1bHQ6
OkFjdGlvbjo6S2VlcCB9OwotICAgIH0KLSAgICBpZiAoaXNWaXN1YWxseUVtcHR5V2hpdGVzcGFj
ZUNvbnRlbnQoY29udGludW91c0NvbnRlbnQpICYmIHNob3VsZEtlZXBFbmRPZkxpbmVXaGl0ZXNw
YWNlKGNvbnRpbnVvdXNDb250ZW50KSkgewotICAgICAgICAvLyBUaGlzIG92ZXJmbG93aW5nIGNv
bnRlbnQgYXBwYXJlbnRseSBmYWxscyBpbnRvIHRoZSByZW1vdmUvaGFuZyBlbmQtb2YtbGluZS1z
cGFjZXMgY2F0ZWdvcnkuCi0gICAgICAgIC8vIHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3Nz
LXRleHQtMy8jd2hpdGUtc3BhY2UtcHJvcGVydHkgbWF0cml4Ci0gICAgICAgIHJldHVybiB7IFJl
c3VsdDo6QWN0aW9uOjpLZWVwIH07Ci0gICAgfQotCi0gICAgc2l6ZV90IG92ZXJmbG93aW5nUnVu
SW5kZXggPSAwOwotICAgIGlmIChoYXNUZXh0UnVuKGNvbnRpbnVvdXNDb250ZW50KSkgewotICAg
ICAgICBhdXRvIHRyeUJyZWFraW5nQ29udGVudFdpdGhUZXh0ID0gWyZdKCkgLT4gT3B0aW9uYWw8
UmVzdWx0PiB7Ci0gICAgICAgICAgICAvLyAxLiBUaGlzIHRleHQgY29udGVudCBpcyBub3QgYnJl
YWthYmxlLgotICAgICAgICAgICAgLy8gMi4gVGhpcyBicmVha2FibGUgdGV4dCBjb250ZW50IGRv
ZXMgbm90IGZpdCBhdCBhbGwuIE5vdCBldmVuIHRoZSBmaXJzdCBnbHlwaC4gVGhpcyBpcyBhIHZl
cnkgc3BlY2lhbCBjYXNlLgotICAgICAgICAgICAgLy8gMy4gV2UgY2FuIGJyZWFrIHRoZSBjb250
ZW50IGJ1dCBpdCBzdGlsbCBvdmVyZmxvd3MuCi0gICAgICAgICAgICAvLyA0LiBNYW5hZ2VkIHRv
IGJyZWFrIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgb3ZlcmZsb3cgcG9pbnQuCi0gICAgICAgICAg
ICBhdXRvIG92ZXJmbG93aW5nQ29udGVudCA9IHByb2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnRXaXRo
VGV4dChjb250aW51b3VzQ29udGVudCwgbGluZVN0YXR1cyk7Ci0gICAgICAgICAgICBvdmVyZmxv
d2luZ1J1bkluZGV4ID0gb3ZlcmZsb3dpbmdDb250ZW50LnJ1bkluZGV4OwotICAgICAgICAgICAg
aWYgKCFvdmVyZmxvd2luZ0NvbnRlbnQuYnJlYWtpbmdQb3NpdGlvbikKLSAgICAgICAgICAgICAg
ICByZXR1cm4geyB9OwotICAgICAgICAgICAgYXV0byB0cmFpbGluZ0NvbnRlbnQgPSBvdmVyZmxv
d2luZ0NvbnRlbnQuYnJlYWtpbmdQb3NpdGlvbi0+dHJhaWxpbmdDb250ZW50OwotICAgICAgICAg
ICAgaWYgKCF0cmFpbGluZ0NvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSB0cmllZCB0
byBicmVhayB0aGUgY29udGVudCBidXQgdGhlIGF2YWlsYWJsZSBzcGFjZSBjYW4ndCBldmVuIGFj
Y29tbW9kYXRlIHRoZSBmaXJzdCBnbHlwaC4KLSAgICAgICAgICAgICAgICAvLyAxLiBXcmFwIHRo
ZSBjb250ZW50IG92ZXIgdG8gdGhlIG5leHQgbGluZSB3aGVuIHdlJ3ZlIGdvdCBjb250ZW50IG9u
IHRoZSBsaW5lIGFscmVhZHkuCi0gICAgICAgICAgICAgICAgLy8gMi4gS2VlcCB0aGUgZmlyc3Qg
Z2x5cGggb24gdGhlIGVtcHR5IGxpbmUgKG9yIGtlZXAgdGhlIHdob2xlIHJ1biBpZiBpdCBoYXMg
b25seSBvbmUgZ2x5cGgvY29tcGxldGVseSBlbXB0eSkuCi0gICAgICAgICAgICAgICAgaWYgKGxp
bmVTdGF0dXMuaGFzQ29udGVudCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdCB7
IFJlc3VsdDo6QWN0aW9uOjpXcmFwLCBJc0VuZE9mTGluZTo6WWVzIH07Ci0gICAgICAgICAgICAg
ICAgYXV0byBsZWFkaW5nVGV4dFJ1bkluZGV4ID0gKmZpcnN0VGV4dFJ1bkluZGV4KGNvbnRpbnVv
dXNDb250ZW50KTsKLSAgICAgICAgICAgICAgICBhdXRvJiBpbmxpbmVUZXh0SXRlbSA9IGRvd25j
YXN0PElubGluZVRleHRJdGVtPihjb250aW51b3VzQ29udGVudC5ydW5zKClbbGVhZGluZ1RleHRS
dW5JbmRleF0uaW5saW5lSXRlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlubGluZVRleHRJdGVt
Lmxlbmd0aCgpIDw9IDEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBSZXN1
bHQ6OkFjdGlvbjo6S2VlcCwgSXNFbmRPZkxpbmU6OlllcyB9OwotICAgICAgICAgICAgICAgIGF1
dG8gZmlyc3RDaGFyYWN0ZXJXaWR0aCA9IFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwg
aW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSArIDEsIGxpbmVT
dGF0dXMuY29udGVudExvZ2ljYWxSaWdodCk7Ci0gICAgICAgICAgICAgICAgYXV0byBmaXJzdENo
YXJhY3RlclJ1biA9IFBhcnRpYWxSdW4geyAxLCBmaXJzdENoYXJhY3RlcldpZHRoIH07Ci0gICAg
ICAgICAgICAgICAgcmV0dXJuIFJlc3VsdCB7IFJlc3VsdDo6QWN0aW9uOjpCcmVhaywgSXNFbmRP
ZkxpbmU6OlllcywgUmVzdWx0OjpQYXJ0aWFsVHJhaWxpbmdDb250ZW50IHsgbGVhZGluZ1RleHRS
dW5JbmRleCwgZmlyc3RDaGFyYWN0ZXJSdW4gfSB9OwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgaWYgKHRyYWlsaW5nQ29udGVudC0+b3ZlcmZsb3dzICYmIGxpbmVTdGF0dXMuaGFzQ29udGVu
dCkgewotICAgICAgICAgICAgICAgIC8vIFdlIG1hbmFnZWQgdG8gYnJlYWsgYSBydW4gd2l0aCBv
dmVyZmxvdyBidXQgdGhlIGxpbmUgYWxyZWFkeSBoYXMgY29udGVudC4gTGV0J3Mgd3JhcCBpdCB0
byB0aGUgbmV4dCBsaW5lLgotICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQgeyBSZXN1bHQ6
OkFjdGlvbjo6V3JhcCwgSXNFbmRPZkxpbmU6OlllcyB9OwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgLy8gRWl0aGVyIHdlIG1hbmFnZWQgdG8gYnJlYWsgd2l0aCBubyBvdmVyZmxvdyBvciB0
aGUgbGluZSBpcyBlbXB0eS4KLSAgICAgICAgICAgIGF1dG8gdHJhaWxpbmdQYXJ0aWFsQ29udGVu
dCA9IFJlc3VsdDo6UGFydGlhbFRyYWlsaW5nQ29udGVudCB7IG92ZXJmbG93aW5nQ29udGVudC5i
cmVha2luZ1Bvc2l0aW9uLT5ydW5JbmRleCwgdHJhaWxpbmdDb250ZW50LT5wYXJ0aWFsUnVuIH07
Ci0gICAgICAgICAgICByZXR1cm4gUmVzdWx0IHsgUmVzdWx0OjpBY3Rpb246OkJyZWFrLCBJc0Vu
ZE9mTGluZTo6WWVzLCB0cmFpbGluZ1BhcnRpYWxDb250ZW50IH07Ci0gICAgICAgIH07Ci0gICAg
ICAgIGlmIChhdXRvIHJlc3VsdCA9IHRyeUJyZWFraW5nQ29udGVudFdpdGhUZXh0KCkpCi0gICAg
ICAgICAgICByZXR1cm4gKnJlc3VsdDsKLSAgICB9IGVsc2UgaWYgKGNvbnRpbnVvdXNDb250ZW50
LnJ1bnMoKS5zaXplKCkgPiAxKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3Ig
dmFyaW91cyBjb250ZW50LgotICAgICAgICBhdXRvJiBydW5zID0gY29udGludW91c0NvbnRlbnQu
cnVucygpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJ1bnMuc2l6ZSgpOyArK2kp
IHsKLSAgICAgICAgICAgIGlmIChydW5zW2ldLmlubGluZUl0ZW0uaXNCb3goKSkgewotICAgICAg
ICAgICAgICAgIG92ZXJmbG93aW5nUnVuSW5kZXggPSBpOwotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgYXJlIG5v
dCBhbGxvd2VkIHRvIGJyZWFrIHRoaXMgb3ZlcmZsb3dpbmcgY29udGVudCwgd2Ugc3RpbGwgbmVl
ZCB0byBkZWNpZGUgd2hldGhlciBrZWVwIGl0IG9yIHdyYXAgaXQgdG8gdGhlIG5leHQgbGluZS4K
LSAgICBpZiAoIWxpbmVTdGF0dXMuaGFzQ29udGVudCkKLSAgICAgICAgcmV0dXJuIHsgUmVzdWx0
OjpBY3Rpb246OktlZXAsIElzRW5kT2ZMaW5lOjpObyB9OwotICAgIC8vIE5vdyBlaXRoZXIgd3Jh
cCB0aGlzIGNvbnRlbnQgb3ZlciB0byB0aGUgbmV4dCBsaW5lIG9yIHJldmVydCBiYWNrIHRvIGFu
IGVhcmxpZXIgd3JhcHBpbmcgb3Bwb3J0dW5pdHksIG9yIG5vdCB3cmFwIGF0IGFsbC4KLSAgICBh
dXRvIHNob3VsZFdyYXBVbmJyZWFrYWJsZUNvbnRlbnRUb05leHRMaW5lID0gWyZdIHsKLSAgICAg
ICAgLy8gVGhlIGluZGl2aWR1YWwgcnVucyBpbiB0aGlzIGNvbnRpbnVvdXMgY29udGVudCBkb24n
dCBicmVhaywgbGV0J3MgY2hlY2sgaWYgd2UgYXJlIGFsbG93ZWQgdG8gd3JhcCB0aGlzIGNvbnRl
bnQgdG8gbmV4dCBsaW5lIChlLmcuIHByZSB3b3VsZCBwcmV2ZW50IHVzIGZyb20gd3JhcHBpbmcp
LgotICAgICAgICAvLyBQYXJlbnQgc3R5bGUgZHJpdmVzIHRoZSB3cmFwcGluZyBiZWhhdmlvciBo
ZXJlLgotICAgICAgICAvLyBlLmcuIDxkaXYgc3R5bGU9IndoaXRlLXNwYWNlOiBub3dyYXAiPnNv
bWUgdGV4dDxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IHBy
ZS13cmFwIj48L2Rpdj48L2Rpdj4uCi0gICAgICAgIC8vIFdoaWxlIHRoZSBpbmxpbmUtYmxvY2sg
aGFzIHByZS13cmFwIHdoaWNoIGFsbG93cyB3cmFwcGluZywgdGhlIGNvbnRlbnQgbGl2ZXMgaW4g
YSBub3dyYXAgY29udGV4dC4KLSAgICAgICAgcmV0dXJuIGlzV3JhcHBpbmdBbGxvd2VkKGNvbnRp
bnVvdXNDb250ZW50LnJ1bnMoKVtvdmVyZmxvd2luZ1J1bkluZGV4XS5pbmxpbmVJdGVtKTsKLSAg
ICB9OwotICAgIGlmIChzaG91bGRXcmFwVW5icmVha2FibGVDb250ZW50VG9OZXh0TGluZSgpKQot
ICAgICAgICByZXR1cm4geyBSZXN1bHQ6OkFjdGlvbjo6V3JhcCwgSXNFbmRPZkxpbmU6OlllcyB9
OwotICAgIGlmIChsaW5lU3RhdHVzLmhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlv
bikKLSAgICAgICAgcmV0dXJuIHsgUmVzdWx0OjpBY3Rpb246OlJldmVydFRvTGFzdFdyYXBPcHBv
cnR1bml0eSwgSXNFbmRPZkxpbmU6OlllcyB9OwotICAgIHJldHVybiB7IFJlc3VsdDo6QWN0aW9u
OjpLZWVwLCBJc0VuZE9mTGluZTo6Tm8gfTsKLX0KLQotT3ZlcmZsb3dpbmdUZXh0Q29udGVudCBJ
bmxpbmVDb250ZW50QnJlYWtlcjo6cHJvY2Vzc092ZXJmbG93aW5nQ29udGVudFdpdGhUZXh0KGNv
bnN0IENvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVudCwgY29uc3QgTGluZVN0YXR1
cyYgbGluZVN0YXR1cykgY29uc3QKLXsKLSAgICBhdXRvJiBydW5zID0gY29udGludW91c0NvbnRl
bnQucnVucygpOwotICAgIEFTU0VSVCghcnVucy5pc0VtcHR5KCkpOwotCi0gICAgYXV0byBpc0Jy
ZWFrYWJsZVJ1biA9IFtdIChhdXRvJiBydW4pIHsKLSAgICAgICAgQVNTRVJUKHJ1bi5pbmxpbmVJ
dGVtLmlzVGV4dCgpIHx8IHJ1bi5pbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBydW4u
aW5saW5lSXRlbS5pc0lubGluZUJveEVuZCgpIHx8IHJ1bi5pbmxpbmVJdGVtLmxheW91dEJveCgp
LmlzSW1hZ2UoKSk7Ci0gICAgICAgIGlmICghcnVuLmlubGluZUl0ZW0uaXNUZXh0KCkpIHsKLSAg
ICAgICAgICAgIC8vIENhbid0IGJyZWFrIGhvcml6b250YWwgc3BhY2luZyAtPiBlLmcuIDxzcGFu
IHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMDBweDsiPnRleHRjb250ZW50PC9zcGFuPiwgaWYgdGhl
IFtpbmxpbmUgYm94IGVuZF0gaXMgdGhlIG92ZXJmbG93biBpbmxpbmUgaXRlbQotICAgICAgICAg
ICAgLy8gd2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSdzIGFub3RoZXIgaW5saW5lIGl0ZW0gYmV5
b25kIHRoZSBbaW5saW5lIGJveCBlbmRdIHRvIHNwbGl0LgotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgdGV4dCBydW4gbmVlZHMg
dG8gc3RheSBvbiB0aGUgY3VycmVudCBsaW5lLiAgCi0gICAgICAgIHJldHVybiBpc1dyYXBwaW5n
QWxsb3dlZChydW4uaW5saW5lSXRlbSk7Ci0gICAgfTsKLQotICAgIGF1dG8gZmluZFRyYWlsaW5n
UnVuSW5kZXggPSBbJl0gKGF1dG8gYnJlYWthYmxlUnVuSW5kZXgpIC0+IE9wdGlvbmFsPHNpemVf
dD4gewotICAgICAgICAvLyBXaGVuIHRoZSBicmVha2luZyBwb3NpdGlvbiBpcyBhdCB0aGUgYmVn
aW5uaW5nIG9mIHRoZSBydW4sIHRoZSB0cmFpbGluZyBydW4gaXMgdGhlIHByZXZpb3VzIG9uZS4K
LSAgICAgICAgaWYgKCFicmVha2FibGVSdW5JbmRleCkKLSAgICAgICAgICAgIHJldHVybiB7IH07
Ci0gICAgICAgIC8vIFRyeSBub3QgYnJlYWsgY29udGVudCBhdCBpbmxpbmUgYm94IGJvdW5kYXJ5
Ci0gICAgICAgIC8vIGUuZy4gPHNwYW4+Zml0czwvc3Bhbj48c3Bhbj5vdmVyZmxvd3M8L3NwYW4+
Ci0gICAgICAgIC8vIHdoZW4gdGhlIHRleHQgIm92ZXJmbG93cyIgY29tcGxldGVseSBvdmVyZmxv
d3MsIGxldCdzIGJyZWFrIHRoZSBjb250ZW50IHJpZ2h0IGJlZm9yZSB0aGUgJzxzcGFuPicuCi0g
ICAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3Igc3Vic2VxdWVudCBlbXB0eSBpbmxpbmUg
Ym94ZXMgZS5nLgotICAgICAgICBhdXRvIHRyYWlsaW5nQ2FuZGlkYXRlSW5kZXggPSBicmVha2Fi
bGVSdW5JbmRleCAtIDE7Ci0gICAgICAgIGF1dG8gaXNBdElubGluZUJveCA9IHJ1bnNbdHJhaWxp
bmdDYW5kaWRhdGVJbmRleF0uaW5saW5lSXRlbS5pc0lubGluZUJveFN0YXJ0KCk7Ci0gICAgICAg
IHJldHVybiAhaXNBdElubGluZUJveCA/IHRyYWlsaW5nQ2FuZGlkYXRlSW5kZXggOiB0cmFpbGlu
Z0NhbmRpZGF0ZUluZGV4ID8gbWFrZU9wdGlvbmFsKHRyYWlsaW5nQ2FuZGlkYXRlSW5kZXggLSAx
KSA6IFdURjo6bnVsbG9wdDsKLSAgICB9OwotCi0gICAgLy8gQ2hlY2sgd2hlcmUgdGhlIG92ZXJm
bG93IG9jY3VycyBhbmQgdXNlIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHRvIGZpZ3VyZSBvdXQg
dGhlIGJyZWFraW5nIGJlaGF2aW91ci4KLSAgICAvLyA8c3BhbiBzdHlsZT0id29yZC1icmVhazog
bm9ybWFsIj5maXJzdDwvc3Bhbj48c3BhbiBzdHlsZT0id29yZC1icmVhazogYnJlYWstYWxsIj5z
ZWNvbmQ8L3NwYW4+PHNwYW4gc3R5bGU9IndvcmQtYnJlYWs6IG5vcm1hbCI+dGhpcmQ8L3NwYW4+
Ci0KLSAgICAvLyBGaXJzdCBmaW5kIHRoZSBvdmVyZmxvd2luZyBydW4uIAotICAgIGF1dG8gYWNj
dW11bGF0ZWRDb250ZW50V2lkdGggPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAgICBhdXRvIG92
ZXJmbG93aW5nUnVuSW5kZXggPSBydW5zLnNpemUoKTsgCi0gICAgZm9yIChzaXplX3QgaW5kZXgg
PSAwOyBpbmRleCA8IHJ1bnMuc2l6ZSgpOyArK2luZGV4KSB7Ci0gICAgICAgIGF1dG8gcnVuTG9n
aWNhbFdpZHRoID0gcnVuc1tpbmRleF0ubG9naWNhbFdpZHRoOwotICAgICAgICBpZiAoYWNjdW11
bGF0ZWRDb250ZW50V2lkdGggKyBydW5Mb2dpY2FsV2lkdGggID4gbGluZVN0YXR1cy5hdmFpbGFi
bGVXaWR0aCkgewotICAgICAgICAgICAgb3ZlcmZsb3dpbmdSdW5JbmRleCA9IGluZGV4OwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYWNjdW11bGF0ZWRDb250ZW50V2lk
dGggKz0gcnVuTG9naWNhbFdpZHRoOwotICAgIH0KLSAgICAvLyBXZSBoYXZlIHRvIGhhdmUgYW4g
b3ZlcmZsb3dpbmcgcnVuLgotICAgIFJFTEVBU0VfQVNTRVJUKG92ZXJmbG93aW5nUnVuSW5kZXgg
PCBydW5zLnNpemUoKSk7Ci0KLSAgICBhdXRvIHRyeUJyZWFraW5nT3ZlcmZsb3dpbmdSdW4gPSBb
Jl0oKSAtPiBPcHRpb25hbDxPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9u
PiB7Ci0gICAgICAgIGF1dG8gb3ZlcmZsb3dpbmdSdW4gPSBydW5zW292ZXJmbG93aW5nUnVuSW5k
ZXhdOwotICAgICAgICBpZiAoIWlzQnJlYWthYmxlUnVuKG92ZXJmbG93aW5nUnVuKSkKLSAgICAg
ICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIGlmIChhdXRvIHBhcnRpYWxSdW4gPSB0cnlCcmVh
a2luZ1RleHRSdW4ob3ZlcmZsb3dpbmdSdW4sIGxpbmVTdGF0dXMuY29udGVudExvZ2ljYWxSaWdo
dCArIGFjY3VtdWxhdGVkQ29udGVudFdpZHRoLCBzdGQ6Om1heCgwLjBmLCBsaW5lU3RhdHVzLmF2
YWlsYWJsZVdpZHRoIC0gYWNjdW11bGF0ZWRDb250ZW50V2lkdGgpLCBsaW5lU3RhdHVzLmhhc1dy
YXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikpIHsKLSAgICAgICAgICAgIGlmIChwYXJ0
aWFsUnVuLT5sZW5ndGgpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE92ZXJmbG93aW5nVGV4dENv
bnRlbnQ6OkJyZWFraW5nUG9zaXRpb24geyBvdmVyZmxvd2luZ1J1bkluZGV4LCBPdmVyZmxvd2lu
Z1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uOjpUcmFpbGluZ0NvbnRlbnQgeyBmYWxzZSwg
cGFydGlhbFJ1biB9IH07Ci0gICAgICAgICAgICAvLyBXaGVuIHRoZSBicmVha2luZyBwb3NpdGlv
biBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBydW4sIHRoZSB0cmFpbGluZyBydW4gaXMgdGhl
IHByZXZpb3VzIG9uZS4KLSAgICAgICAgICAgIGlmIChhdXRvIHRyYWlsaW5nUnVuSW5kZXggPSBm
aW5kVHJhaWxpbmdSdW5JbmRleChvdmVyZmxvd2luZ1J1bkluZGV4KSkKLSAgICAgICAgICAgICAg
ICByZXR1cm4gT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7ICp0cmFp
bGluZ1J1bkluZGV4LCBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uOjpU
cmFpbGluZ0NvbnRlbnQgeyB9IH07Ci0gICAgICAgICAgICAvLyBTb21ldGltZXMgd2UgY2FuJ3Qg
YWNjb21tb2RhdGUgZXZlbiB0aGUgdmVyeSBmaXJzdCBjaGFyYWN0ZXIuIAotICAgICAgICAgICAg
Ly8gTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gd2hlbiB0aGVyZSdzIG5vIGJyZWFr
YWJsZSBydW4gaW4gdGhpcyBzZXQuCi0gICAgICAgICAgICByZXR1cm4gT3ZlcmZsb3dpbmdUZXh0
Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbiB7IH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJu
IHsgfTsKLSAgICB9OwotICAgIC8vIENoZWNrIGlmIHdlIGFjdHVhbGx5IGJyZWFrIHRoaXMgcnVu
LgotICAgIGlmIChhdXRvIGJyZWFraW5nUG9zaXRpb24gPSB0cnlCcmVha2luZ092ZXJmbG93aW5n
UnVuKCkpCi0gICAgICAgIHJldHVybiB7IG92ZXJmbG93aW5nUnVuSW5kZXgsIGJyZWFraW5nUG9z
aXRpb24gfTsKLQotICAgIGF1dG8gdHJ5QnJlYWtpbmdQcmV2aW91c05vbk92ZXJmbG93aW5nUnVu
cyA9IFsmXSgpIC0+IE9wdGlvbmFsPE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9z
aXRpb24+IHsKLSAgICAgICAgYXV0byBwcmV2aW91c0NvbnRlbnRXaWR0aCA9IGFjY3VtdWxhdGVk
Q29udGVudFdpZHRoOwotICAgICAgICBmb3IgKGF1dG8gaW5kZXggPSBvdmVyZmxvd2luZ1J1bklu
ZGV4OyBpbmRleC0tOykgewotICAgICAgICAgICAgYXV0byYgcnVuID0gcnVuc1tpbmRleF07Ci0g
ICAgICAgICAgICBwcmV2aW91c0NvbnRlbnRXaWR0aCAtPSBydW4ubG9naWNhbFdpZHRoOwotICAg
ICAgICAgICAgaWYgKCFpc0JyZWFrYWJsZVJ1bihydW4pKQotICAgICAgICAgICAgICAgIGNvbnRp
bnVlOwotICAgICAgICAgICAgQVNTRVJUKHJ1bi5pbmxpbmVJdGVtLmlzVGV4dCgpKTsKLSAgICAg
ICAgICAgIGlmIChhdXRvIHBhcnRpYWxSdW4gPSB0cnlCcmVha2luZ1RleHRSdW4ocnVuLCBsaW5l
U3RhdHVzLmNvbnRlbnRMb2dpY2FsUmlnaHQgKyBwcmV2aW91c0NvbnRlbnRXaWR0aCwgeyB9LCBs
aW5lU3RhdHVzLmhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbikpIHsKLSAgICAg
ICAgICAgICAgICAvLyBXZSBrbm93IHRoaXMgcnVuIGZpdHMsIHNvIGlmIGJyZWFraW5nIGlzIGFs
bG93ZWQgb24gdGhlIHJ1biwgaXQgc2hvdWxkIHJldHVybiBhIG5vbi1lbXB0eSBsZWZ0LXNpZGUK
LSAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCdzIGVpdGhlciBhdCBoeXBoZW4gcG9zaXRpb24g
b3IgdGhlIGVudGlyZSBydW4gaXMgcmV0dXJuZWQuCi0gICAgICAgICAgICAgICAgQVNTRVJUKHBh
cnRpYWxSdW4tPmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYXV0byBydW5Jc0Z1bGx5QWNjb21t
b2RhdGVkID0gcGFydGlhbFJ1bi0+bGVuZ3RoID09IGRvd25jYXN0PElubGluZVRleHRJdGVtPihy
dW4uaW5saW5lSXRlbSkubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE92ZXJmbG93
aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb24geyBpbmRleCwgT3ZlcmZsb3dpbmdUZXh0
Q29udGVudDo6QnJlYWtpbmdQb3NpdGlvbjo6VHJhaWxpbmdDb250ZW50IHsgZmFsc2UsIHJ1bklz
RnVsbHlBY2NvbW1vZGF0ZWQgPyBXVEY6Om51bGxvcHQgOiBwYXJ0aWFsUnVuIH0gfTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4geyB9OwotICAgIH07Ci0gICAgLy8g
V2UgZGlkIG5vdCBtYW5hZ2UgdG8gYnJlYWsgdGhlIHJ1biB0aGF0IGFjdHVhbGx5IG92ZXJmbG93
cyB0aGUgbGluZS4KLSAgICAvLyBMZXQncyB0cnkgdG8gZmluZCBhIHByZXZpb3VzIGJyZWFraW5n
IHBvc2l0aW9uIHN0YXJ0aW5nIGZyb20gdGhlIG92ZXJmbG93aW5nIHJ1bi4gSXQgc3VyZWx5IGZp
dHMuCi0gICAgaWYgKGF1dG8gYnJlYWtpbmdQb3NpdGlvbiA9IHRyeUJyZWFraW5nUHJldmlvdXNO
b25PdmVyZmxvd2luZ1J1bnMoKSkKLSAgICAgICAgcmV0dXJuIHsgb3ZlcmZsb3dpbmdSdW5JbmRl
eCwgYnJlYWtpbmdQb3NpdGlvbiB9OwotCi0gICAgYXV0byB0cnlCcmVha2luZ05leHRPdmVyZmxv
d2luZ1J1bnMgPSBbJl0oKSAtPiBPcHRpb25hbDxPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVh
a2luZ1Bvc2l0aW9uPiB7Ci0gICAgICAgIGF1dG8gbmV4dENvbnRlbnRXaWR0aCA9IGFjY3VtdWxh
dGVkQ29udGVudFdpZHRoICsgcnVuc1tvdmVyZmxvd2luZ1J1bkluZGV4XS5sb2dpY2FsV2lkdGg7
Ci0gICAgICAgIGZvciAoYXV0byBpbmRleCA9IG92ZXJmbG93aW5nUnVuSW5kZXggKyAxOyBpbmRl
eCA8IHJ1bnMuc2l6ZSgpOyArK2luZGV4KSB7Ci0gICAgICAgICAgICBhdXRvJiBydW4gPSBydW5z
W2luZGV4XTsKLSAgICAgICAgICAgIGlmIChpc0JyZWFrYWJsZVJ1bihydW4pKSB7Ci0gICAgICAg
ICAgICAgICAgQVNTRVJUKHJ1bi5pbmxpbmVJdGVtLmlzVGV4dCgpKTsKLSAgICAgICAgICAgICAg
ICAvLyBXZSBrbm93IHRoYXQgdGhpcyBydW4gZG9lcyBub3QgZml0IHRoZSBhdmFpbGFibGUgc3Bh
Y2UuIElmIHdlIGNhbiBicmVhayBpdCBhdCBhbnkgcG9zaXRpb24sIGxldCdzIGp1c3QgdXNlIHRo
ZSBzdGFydCBvZiB0aGUgcnVuLgotICAgICAgICAgICAgICAgIGlmICh3b3JkQnJlYWtCZWhhdmlv
cihydW4uaW5saW5lSXRlbS5zdHlsZSgpLCBsaW5lU3RhdHVzLmhhc1dyYXBPcHBvcnR1bml0eUF0
UHJldmlvdXNQb3NpdGlvbikgPT0gV29yZEJyZWFrUnVsZTo6QXRBcmJpdHJhcnlQb3NpdGlvbikg
ewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGJlIG9uIGFuIGlubGluZSBib3ggYm91
bmRhcnkuIExldCdzIGdvIGJhY2sgdG8gdGhlIHJ1biBpbiBmcm9udCBvZiB0aGUgaW5saW5lIGJv
eCBzdGFydCBydW4uCi0gICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gPHNwYW4+dW5icmVha2Fi
bGVfYW5kX292ZXJmbG93PHNwYW4gc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLWFsbCI+YnJlYWth
YmxlPC9zcGFuPgotICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgYXQgImJyZWFrYWJsZSIs
IDxzcGFuPiBpcyBhdCBpbmRleCAtIDEgYW5kIHRoZSB0cmFpbGluZyBydW4gaXMgYXQgaW5kZXgg
LSAyLgotICAgICAgICAgICAgICAgICAgICBBU1NFUlQocnVuc1tpbmRleCAtIDFdLmlubGluZUl0
ZW0uaXNJbmxpbmVCb3hTdGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXV0byB0cmFpbGlu
Z1J1bkluZGV4ID0gZmluZFRyYWlsaW5nUnVuSW5kZXgoaW5kZXgpOwotICAgICAgICAgICAgICAg
ICAgICBpZiAoIXRyYWlsaW5nUnVuSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8v
IFRoaXMgY29udGludW91cyBjb250ZW50IGRpZCBub3QgZml0IGZyb20gdGhlIGdldC1nby4gTm8g
dHJhaWxpbmcgcnVuLgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE92ZXJmbG93aW5n
VGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb24geyB9OwotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgICAgIC8vIEF0IHdvcnN0IHdlIGFyZSBiYWNrIHRvIHRoZSBvdmVy
Zmxvd2luZyBydW4sIGxpa2UgaW4gdGhlIGV4YW1wbGUgYWJvdmUuCi0gICAgICAgICAgICAgICAg
ICAgIEFTU0VSVCgqdHJhaWxpbmdSdW5JbmRleCA+PSBvdmVyZmxvd2luZ1J1bkluZGV4KTsKLSAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5n
UG9zaXRpb24geyAqdHJhaWxpbmdSdW5JbmRleCwgT3ZlcmZsb3dpbmdUZXh0Q29udGVudDo6QnJl
YWtpbmdQb3NpdGlvbjo6VHJhaWxpbmdDb250ZW50IHsgdHJ1ZSB9IH07Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIGlmIChhdXRvIHBhcnRpYWxSdW4gPSB0cnlCcmVha2luZ1Rl
eHRSdW4ocnVuLCBsaW5lU3RhdHVzLmNvbnRlbnRMb2dpY2FsUmlnaHQgKyBuZXh0Q29udGVudFdp
ZHRoLCB7IH0sIGxpbmVTdGF0dXMuaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9u
KSkgewotICAgICAgICAgICAgICAgICAgICBBU1NFUlQocGFydGlhbFJ1bi0+bGVuZ3RoKTsKLSAg
ICAgICAgICAgICAgICAgICAgLy8gV2UgbWFuYWdlZCB0byBicmVhayB0aGlzIHRleHQgcnVuIG1p
ZCBjb250ZW50LiBJdCBoYXMgdG8gYmUgYSBoeXBoZW4gYnJlYWsuCi0gICAgICAgICAgICAgICAg
ICAgIHJldHVybiBPdmVyZmxvd2luZ1RleHRDb250ZW50OjpCcmVha2luZ1Bvc2l0aW9uIHsgaW5k
ZXgsIE92ZXJmbG93aW5nVGV4dENvbnRlbnQ6OkJyZWFraW5nUG9zaXRpb246OlRyYWlsaW5nQ29u
dGVudCB7IHRydWUsIHBhcnRpYWxSdW4gfSB9OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIG5leHRDb250ZW50V2lkdGggKz0gcnVuLmxvZ2ljYWxXaWR0aDsK
LSAgICAgICAgfQotICAgICAgICByZXR1cm4geyB9OwotICAgIH07Ci0gICAgLy8gQXQgdGhpcyBw
b2ludCB3ZSBrbm93IHRoYXQgdGhlcmUncyBubyBicmVha2FibGUgcnVuIGFsbCB0aGUgd2F5IHRv
IHRoZSBvdmVyZmxvd2luZyBydW4uCi0gICAgLy8gTm93IHdlIG5lZWQgdG8gY2hlY2sgaWYgYW55
IHJ1biBhZnRlciB0aGUgb3ZlcmZsb3dpbmcgY29udGVudCBjYW4gYnJlYWsuCi0gICAgLy8gZS5n
LiA8c3Bhbj50aGlzX2NvbnRlbnRfb3ZlcmZsb3dzX2J1dF9ub3RfYnJlYWthYmxlPHNwYW4+PHNw
YW4gc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLWFsbCI+YnV0X3RoaXNfaXNfYnJlYWthYmxlPC9z
cGFuPgotICAgIGlmIChhdXRvIGJyZWFraW5nUG9zaXRpb24gPSB0cnlCcmVha2luZ05leHRPdmVy
Zmxvd2luZ1J1bnMoKSkKLSAgICAgICAgcmV0dXJuIHsgb3ZlcmZsb3dpbmdSdW5JbmRleCwgYnJl
YWtpbmdQb3NpdGlvbiB9OwotCi0gICAgLy8gR2l2ZSB1cCwgdGhlcmUncyBubyBicmVha2FibGUg
cnVuIGluIGhlcmUuCi0gICAgcmV0dXJuIHsgb3ZlcmZsb3dpbmdSdW5JbmRleCB9OwotfQotCi1P
cHRpb25TZXQ8SW5saW5lQ29udGVudEJyZWFrZXI6OldvcmRCcmVha1J1bGU+IElubGluZUNvbnRl
bnRCcmVha2VyOjp3b3JkQnJlYWtCZWhhdmlvcihjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUsIGJv
b2wgaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSBjb25zdAotewotICAgIC8v
IERpc3JlZ2FyZCBhbnkgcHJvaGliaXRpb24gYWdhaW5zdCBsaW5lIGJyZWFrcyBtYW5kYXRlZCBi
eSB0aGUgd29yZC1icmVhayBwcm9wZXJ0eS4KLSAgICAvLyBUaGUgZGlmZmVyZW50IHdyYXBwaW5n
IG9wcG9ydHVuaXRpZXMgbXVzdCBub3QgYmUgcHJpb3JpdGl6ZWQuIEh5cGhlbmF0aW9uIGlzIG5v
dCBhcHBsaWVkLgotICAgIGlmIChzdHlsZS5saW5lQnJlYWsoKSA9PSBMaW5lQnJlYWs6OkFueXdo
ZXJlKQotICAgICAgICByZXR1cm4geyBXb3JkQnJlYWtSdWxlOjpBdEFyYml0cmFyeVBvc2l0aW9u
IH07Ci0gICAgLy8gQnJlYWtpbmcgaXMgYWxsb3dlZCB3aXRoaW4g4oCcd29yZHPigJ0uCi0gICAg
aWYgKHN0eWxlLndvcmRCcmVhaygpID09IFdvcmRCcmVhazo6QnJlYWtBbGwpCi0gICAgICAgIHJl
dHVybiB7IFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRpb24gfTsKLSAgICAvLyBCcmVh
a2luZyBpcyBmb3JiaWRkZW4gd2l0aGluIOKAnHdvcmRz4oCdLgotICAgIGlmIChzdHlsZS53b3Jk
QnJlYWsoKSA9PSBXb3JkQnJlYWs6OktlZXBBbGwpCi0gICAgICAgIHJldHVybiB7IH07Ci0KLSAg
ICBhdXRvIGJyZWFrUnVsZXMgPSBPcHRpb25TZXQ8V29yZEJyZWFrUnVsZT4geyB9OwotICAgIGF1
dG8gaHlwaGVuYXRpb25Jc0FsbG93ZWQgPSAhbl9oeXBoZW5hdGlvbklzRGlzYWJsZWQgJiYgc3R5
bGUuaHlwaGVucygpID09IEh5cGhlbnM6OkF1dG8gJiYgY2FuSHlwaGVuYXRlKHN0eWxlLmNvbXB1
dGVkTG9jYWxlKCkpOwotICAgIGlmIChoeXBoZW5hdGlvbklzQWxsb3dlZCkKLSAgICAgICAgYnJl
YWtSdWxlcy5hZGQoeyBXb3JkQnJlYWtSdWxlOjpBdEh5cGhlbmF0aW9uT3Bwb3J0dW5pdGllcyB9
KTsKLSAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBjb250ZW50LCB0aGUgd29y
ZC1icmVhayBwcm9wZXJ0eSBhbHNvIHN1cHBvcnRzIGEgZGVwcmVjYXRlZCBicmVhay13b3JkIGtl
eXdvcmQuCi0gICAgLy8gV2hlbiBzcGVjaWZpZWQsIHRoaXMgaGFzIHRoZSBzYW1lIGVmZmVjdCBh
cyB3b3JkLWJyZWFrOiBub3JtYWwgYW5kIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlLCByZWdhcmRs
ZXNzIG9mIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIG92ZXJmbG93LXdyYXAgcHJvcGVydHkuCi0g
ICAgaWYgKHN0eWxlLndvcmRCcmVhaygpID09IFdvcmRCcmVhazo6QnJlYWtXb3JkICYmICFoYXNX
cmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pIHsKLSAgICAgICAgYnJlYWtSdWxlcy5h
ZGQoeyBXb3JkQnJlYWtSdWxlOjpBdEFyYml0cmFyeVBvc2l0aW9uIH0pOwotICAgICAgICByZXR1
cm4gYnJlYWtSdWxlczsKLSAgICB9Ci0gICAgLy8gT3ZlcmZsb3dXcmFwOjpCcmVhazogQW4gb3Ro
ZXJ3aXNlIHVuYnJlYWthYmxlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgbWF5IGJlIGJyb2tlbiBh
dCBhbiBhcmJpdHJhcnkgcG9pbnQgaWYgdGhlcmUgYXJlIG5vIG90aGVyd2lzZS1hY2NlcHRhYmxl
IGJyZWFrIHBvaW50cyBpbiB0aGUgbGluZS4KLSAgICBpZiAoc3R5bGUub3ZlcmZsb3dXcmFwKCkg
PT0gT3ZlcmZsb3dXcmFwOjpCcmVhayAmJiAhaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bv
c2l0aW9uKSB7Ci0gICAgICAgIGJyZWFrUnVsZXMuYWRkKHsgV29yZEJyZWFrUnVsZTo6QXRBcmJp
dHJhcnlQb3NpdGlvbiB9KTsKLSAgICAgICAgcmV0dXJuIGJyZWFrUnVsZXM7Ci0gICAgfQotICAg
IHJldHVybiBicmVha1J1bGVzOwotfQotCi1PcHRpb25hbDxJbmxpbmVDb250ZW50QnJlYWtlcjo6
UGFydGlhbFJ1bj4gSW5saW5lQ29udGVudEJyZWFrZXI6OnRyeUJyZWFraW5nVGV4dFJ1bihjb25z
dCBDb250aW51b3VzQ29udGVudDo6UnVuJiBvdmVyZmxvd2luZ1J1biwgSW5saW5lTGF5b3V0VW5p
dCBsb2dpY2FsTGVmdCwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gYXZhaWxhYmxlV2lkdGgs
IGJvb2wgaGFzV3JhcE9wcG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSBjb25zdAotewotICAg
IEFTU0VSVChvdmVyZmxvd2luZ1J1bi5pbmxpbmVJdGVtLmlzVGV4dCgpKTsKLSAgICBhdXRvJiBp
bmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihvdmVyZmxvd2luZ1J1bi5p
bmxpbmVJdGVtKTsKLSAgICBhdXRvJiBzdHlsZSA9IGlubGluZVRleHRJdGVtLnN0eWxlKCk7Ci0g
ICAgYXV0byBhdmFpbGFibGVTcGFjZUlzSW5maW5pdGUgPSAhYXZhaWxhYmxlV2lkdGguaGFzVmFs
dWUoKTsKLQotICAgIGF1dG8gYnJlYWtSdWxlcyA9IHdvcmRCcmVha0JlaGF2aW9yKHN0eWxlLCBo
YXNXcmFwT3Bwb3J0dW5pdHlBdFByZXZpb3VzUG9zaXRpb24pOwotICAgIGlmIChicmVha1J1bGVz
LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgIGlmIChicmVha1J1bGVzLmNv
bnRhaW5zKFdvcmRCcmVha1J1bGU6OkF0SHlwaGVuYXRpb25PcHBvcnR1bml0aWVzKSkgewotICAg
ICAgICBhdXRvIHRyeUJyZWFraW5nQXRIeXBoZW5hdGlvbk9wcG9ydHVuaXR5ID0gWyZdKCkgLT4g
T3B0aW9uYWw8UGFydGlhbFJ1bj4gewotICAgICAgICAgICAgLy8gRmluZCB0aGUgaHlwaGVuIHBv
c2l0aW9uIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICAvLyAxLiBTcGxpdCB0aGUgdGV4dCBieSB0
YWtpbmcgdGhlIGh5cGhlbiB3aWR0aCBpbnRvIGFjY291bnQKLSAgICAgICAgICAgIC8vIDIuIEZp
bmQgdGhlIGxhc3QgaHlwaGVuIHBvc2l0aW9uIGJlZm9yZSB0aGUgc3BsaXQgcG9zaXRpb24KLSAg
ICAgICAgICAgIGlmICghYXZhaWxhYmxlU3BhY2VJc0luZmluaXRlICYmICEqYXZhaWxhYmxlV2lk
dGgpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSB3b24ndCBiZSBhYmxlIHRvIGZpbmQgaHlwaGVu
IGxvY2F0aW9uIHdoZW4gdGhlcmUncyBubyBhdmFpbGFibGUgc3BhY2UuCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIHsgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dG8gcnVuTGVuZ3Ro
ID0gaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsaW1pdEJl
Zm9yZSA9IHN0eWxlLmh5cGhlbmF0aW9uTGltaXRCZWZvcmUoKSA9PSBSZW5kZXJTdHlsZTo6aW5p
dGlhbEh5cGhlbmF0aW9uTGltaXRCZWZvcmUoKSA/IDAgOiBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0
QmVmb3JlKCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsaW1pdEFmdGVyID0gc3R5bGUuaHlwaGVu
YXRpb25MaW1pdEFmdGVyKCkgPT0gUmVuZGVyU3R5bGU6OmluaXRpYWxIeXBoZW5hdGlvbkxpbWl0
QWZ0ZXIoKSA/IDAgOiBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QWZ0ZXIoKTsKLSAgICAgICAgICAg
IC8vIENoZWNrIGlmIHRoaXMgcnVuIGNhbiBhY2NvbW1vZGF0ZSB0aGUgYmVmb3JlL2FmdGVyIGxp
bWl0cyBhdCBhbGwgYmVmb3JlIHN0YXJ0IG1lYXN1cmluZyB0ZXh0LgotICAgICAgICAgICAgaWYg
KGxpbWl0QmVmb3JlID49IHJ1bkxlbmd0aCB8fCBsaW1pdEFmdGVyID49IHJ1bkxlbmd0aCB8fCBs
aW1pdEJlZm9yZSArIGxpbWl0QWZ0ZXIgPiBydW5MZW5ndGgpCi0gICAgICAgICAgICAgICAgcmV0
dXJuIHsgfTsKLQotICAgICAgICAgICAgdW5zaWduZWQgbGVmdFNpZGVMZW5ndGggPSBydW5MZW5n
dGg7Ci0gICAgICAgICAgICBhdXRvJiBmb250Q2FzY2FkZSA9IHN0eWxlLmZvbnRDYXNjYWRlKCk7
Ci0gICAgICAgICAgICBhdXRvIGh5cGhlbldpZHRoID0gSW5saW5lTGF5b3V0VW5pdCB7IGZvbnRD
YXNjYWRlLndpZHRoKFRleHRSdW4geyBTdHJpbmdWaWV3IHsgc3R5bGUuaHlwaGVuU3RyaW5nKCkg
fSB9KSB9OwotICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVTcGFjZUlzSW5maW5pdGUpIHsKLSAg
ICAgICAgICAgICAgICBhdXRvIGF2YWlsYWJsZVdpZHRoRXhjbHVkaW5nSHlwaGVuID0gKmF2YWls
YWJsZVdpZHRoIC0gaHlwaGVuV2lkdGg7Ci0gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVdp
ZHRoRXhjbHVkaW5nSHlwaGVuIDw9IDAgfHwgIWVub3VnaFdpZHRoRm9ySHlwaGVuYXRpb24oYXZh
aWxhYmxlV2lkdGhFeGNsdWRpbmdIeXBoZW4sIGZvbnRDYXNjYWRlLnBpeGVsU2l6ZSgpKSkKLSAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgICAgICAgICBsZWZ0U2lkZUxl
bmd0aCA9IFRleHRVdGlsOjpzcGxpdChpbmxpbmVUZXh0SXRlbSwgb3ZlcmZsb3dpbmdSdW4ubG9n
aWNhbFdpZHRoLCBhdmFpbGFibGVXaWR0aEV4Y2x1ZGluZ0h5cGhlbiwgbG9naWNhbExlZnQpLmxl
bmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsZWZ0U2lkZUxlbmd0aCA8IGxp
bWl0QmVmb3JlKQotICAgICAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgICAgICAvLyBB
ZGp1c3QgYmVmb3JlIGluZGV4IHRvIGFjY29tbW9kYXRlIHRoZSBsaW1pdC1hZnRlciB2YWx1ZSAo
aXQncyB0aGUgbGFzdCBwb3RlbnRpYWwgaHlwaGVuIGxvY2F0aW9uIGluIHRoaXMgcnVuKS4KLSAg
ICAgICAgICAgIGF1dG8gaHlwaGVuQmVmb3JlID0gc3RkOjptaW4obGVmdFNpZGVMZW5ndGgsIHJ1
bkxlbmd0aCAtIGxpbWl0QWZ0ZXIpICsgMTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGh5cGhlbkxv
Y2F0aW9uID0gbGFzdEh5cGhlbkxvY2F0aW9uKFN0cmluZ1ZpZXcoaW5saW5lVGV4dEl0ZW0uaW5s
aW5lVGV4dEJveCgpLmNvbnRlbnQoKSkuc3Vic3RyaW5nKGlubGluZVRleHRJdGVtLnN0YXJ0KCks
IGlubGluZVRleHRJdGVtLmxlbmd0aCgpKSwgaHlwaGVuQmVmb3JlLCBzdHlsZS5jb21wdXRlZExv
Y2FsZSgpKTsKLSAgICAgICAgICAgIGlmICghaHlwaGVuTG9jYXRpb24gfHwgaHlwaGVuTG9jYXRp
b24gPCBsaW1pdEJlZm9yZSkKLSAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAg
ICAgLy8gaHlwaGVuTG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgSW5s
aW5lSXRlbVRleHQuCi0gICAgICAgICAgICBBU1NFUlQoaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSAr
IGh5cGhlbkxvY2F0aW9uIDwgaW5saW5lVGV4dEl0ZW0uZW5kKCkpOwotICAgICAgICAgICAgYXV0
byB0cmFpbGluZ1BhcnRpYWxSdW5XaWR0aFdpdGhIeXBoZW4gPSBUZXh0VXRpbDo6d2lkdGgoaW5s
aW5lVGV4dEl0ZW0sIGlubGluZVRleHRJdGVtLnN0YXJ0KCksIGlubGluZVRleHRJdGVtLnN0YXJ0
KCkgKyBoeXBoZW5Mb2NhdGlvbiwgbG9naWNhbExlZnQpOwotICAgICAgICAgICAgcmV0dXJuIFBh
cnRpYWxSdW4geyBoeXBoZW5Mb2NhdGlvbiwgdHJhaWxpbmdQYXJ0aWFsUnVuV2lkdGhXaXRoSHlw
aGVuLCBoeXBoZW5XaWR0aCB9OwotICAgICAgICB9OwotICAgICAgICBpZiAoYXV0byBwYXJ0aWFs
UnVuID0gdHJ5QnJlYWtpbmdBdEh5cGhlbmF0aW9uT3Bwb3J0dW5pdHkoKSkKLSAgICAgICAgICAg
IHJldHVybiBwYXJ0aWFsUnVuOwotICAgIH0KLQotICAgIGlmIChicmVha1J1bGVzLmNvbnRhaW5z
KFdvcmRCcmVha1J1bGU6OkF0QXJiaXRyYXJ5UG9zaXRpb24pKSB7Ci0gICAgICAgIGF1dG8gdHJ5
QnJlYWtpbmdBdEFyYml0cmFyeVBvc2l0aW9uID0gWyZdKCkgLT4gUGFydGlhbFJ1biB7Ci0gICAg
ICAgICAgICBpZiAoIWlubGluZVRleHRJdGVtLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAg
Ly8gRW1wdHkgdGV4dCBydW5zIG1heSBiZSBicmVha2FibGUgYmFzZWQgb24gc3R5bGUsIGJ1dCBp
biBwcmFjdGljZSB3ZSBjYW4ndCByZWFsbHkgc3BsaXQgdGhlbSBhbnkgZnVydGhlci4KLSAgICAg
ICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF2
YWlsYWJsZVNwYWNlSXNJbmZpbml0ZSkgewotICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJ1
biBjYW4gYmUgc3BsaXQgYXQgYXJiaXRyYXJ5IHBvc2l0aW9uIGxldCdzIGp1c3QgcmV0dXJuIHRo
ZSBlbnRpcmUgcnVuIHdoZW4gaXQgaXMgaW50ZW5kZWQgdG8gZml0IG9uIHRoZSBsaW5lLgotICAg
ICAgICAgICAgICAgIEFTU0VSVChpbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSk7Ci0gICAgICAgICAg
ICAgICAgYXV0byB0cmFpbGluZ1BhcnRpYWxSdW5XaWR0aCA9IFRleHRVdGlsOjp3aWR0aChpbmxp
bmVUZXh0SXRlbSwgbG9naWNhbExlZnQpOwotICAgICAgICAgICAgICAgIHJldHVybiB7IGlubGlu
ZVRleHRJdGVtLmxlbmd0aCgpLCB0cmFpbGluZ1BhcnRpYWxSdW5XaWR0aCB9OwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgaWYgKCEqYXZhaWxhYmxlV2lkdGgpIHsKLSAgICAgICAgICAgICAg
ICAvLyBGYXN0IHBhdGggZm9yIGNhc2VzIHdoZW4gdGhlcmUncyBubyByb29tIGF0IGFsbC4gVGhl
IGNvbnRlbnQgaXMgYnJlYWthYmxlIGJ1dCB3ZSBkb24ndCBoYXZlIHNwYWNlIGZvciBpdC4KLSAg
ICAgICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXV0
byBzcGxpdERhdGEgPSBUZXh0VXRpbDo6c3BsaXQoaW5saW5lVGV4dEl0ZW0sIG92ZXJmbG93aW5n
UnVuLmxvZ2ljYWxXaWR0aCwgKmF2YWlsYWJsZVdpZHRoLCBsb2dpY2FsTGVmdCk7Ci0gICAgICAg
ICAgICByZXR1cm4geyBzcGxpdERhdGEubGVuZ3RoLCBzcGxpdERhdGEubG9naWNhbFdpZHRoIH07
Ci0gICAgICAgIH07Ci0gICAgICAgIC8vIFdpdGggYXJiaXRyYXJ5IGJyZWFraW5nIHRoZXJlJ3Mg
YWx3YXlzIGEgdmFsaWQgYnJlYWtpbmcgcG9zaXRpb24gKGV2ZW4gaWYgaXQgaXMgYmVmb3JlIHRo
ZSBmaXJzdCBwb3NpdGlvbikuCi0gICAgICAgIHJldHVybiB0cnlCcmVha2luZ0F0QXJiaXRyYXJ5
UG9zaXRpb24oKTsKLSAgICB9Ci0gICAgcmV0dXJuIHsgfTsKLX0KLQotdm9pZCBJbmxpbmVDb250
ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OmFwcGVuZChjb25zdCBJbmxpbmVJdGVtJiBp
bmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCwgT3B0aW9uYWw8SW5saW5l
TGF5b3V0VW5pdD4gY29sbGFwc2libGVXaWR0aCkKLXsKLSAgICBtX3J1bnMuYXBwZW5kKHsgaW5s
aW5lSXRlbSwgbG9naWNhbFdpZHRoIH0pOwotICAgIG1fbG9naWNhbFdpZHRoID0gY2xhbXBUbzxJ
bmxpbmVMYXlvdXRVbml0PihtX2xvZ2ljYWxXaWR0aCArIGxvZ2ljYWxXaWR0aCk7Ci0gICAgaWYg
KCFjb2xsYXBzaWJsZVdpZHRoKSB7Ci0gICAgICAgIG1fY29sbGFwc2libGVMb2dpY2FsV2lkdGgg
PSB7IH07Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCpjb2xsYXBzaWJsZVdpZHRo
ID09IGxvZ2ljYWxXaWR0aCkgewotICAgICAgICAvLyBGdWxseSBjb2xsYXBzaWJsZSBydW4uCi0g
ICAgICAgIG1fY29sbGFwc2libGVMb2dpY2FsV2lkdGggKz0gbG9naWNhbFdpZHRoOwotICAgICAg
ICBBU1NFUlQobV9jb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCA8PSBtX2xvZ2ljYWxXaWR0aCk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gUGFydGlhbGx5IGNvbGxhcHNpYmxlIHJ1bi4K
LSAgICBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoID0gKmNvbGxhcHNpYmxlV2lkdGg7Ci0gICAg
QVNTRVJUKG1fY29sbGFwc2libGVMb2dpY2FsV2lkdGggPD0gbV9sb2dpY2FsV2lkdGgpOwotfQot
Ci12b2lkIElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudDo6cmVzZXQoKQot
ewotICAgIG1fbG9naWNhbFdpZHRoID0geyB9OwotICAgIG1fY29sbGFwc2libGVMb2dpY2FsV2lk
dGggPSB7IH07Ci0gICAgbV9ydW5zLmNsZWFyKCk7Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUNvbnRlbnRCcmVha2VyLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lQ29udGVudEJyZWFrZXIuaApk
ZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyZDRkNmNlOGMxODkzMWQ1ZmU4YjUwYTM3
MzAxZDRhY2E4ZTdkOS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1h
dHRpbmcvSW5saW5lQ29udGVudEJyZWFrZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCww
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
VFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkxheW91dFVuaXRzLmgiCi0KLW5hbWVzcGFjZSBX
ZWJDb3JlIHsKLQotY2xhc3MgUmVuZGVyU3R5bGU7Ci0KLW5hbWVzcGFjZSBMYXlvdXQgewotCi1j
bGFzcyBJbmxpbmVJdGVtOwotc3RydWN0IE92ZXJmbG93aW5nVGV4dENvbnRlbnQ7Ci0KLWNsYXNz
IElubGluZUNvbnRlbnRCcmVha2VyIHsKLXB1YmxpYzoKLSAgICBzdHJ1Y3QgUGFydGlhbFJ1biB7
Ci0gICAgICAgIHNpemVfdCBsZW5ndGggeyAwIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQg
bG9naWNhbFdpZHRoIHsgMCB9OwotICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBo
eXBoZW5XaWR0aCB7IH07Ci0gICAgfTsKLSAgICBlbnVtIGNsYXNzIElzRW5kT2ZMaW5lIHsgTm8s
IFllcyB9OwotICAgIHN0cnVjdCBSZXN1bHQgewotICAgICAgICBlbnVtIGNsYXNzIEFjdGlvbiB7
Ci0gICAgICAgICAgICBLZWVwLCAvLyBLZWVwIGNvbnRlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4K
LSAgICAgICAgICAgIEJyZWFrLCAvLyBQYXJ0aWFsIGNvbnRlbnQgaXMgb24gdGhlIGN1cnJlbnQg
bGluZS4KLSAgICAgICAgICAgIFdyYXAsIC8vIENvbnRlbnQgaXMgd3JhcHBlZCB0byB0aGUgbmV4
dCBsaW5lLgotICAgICAgICAgICAgV3JhcFdpdGhIeXBoZW4sIC8vIENvbnRlbnQgaXMgd3JhcHBl
ZCB0byB0aGUgbmV4dCBsaW5lIGFuZCB0aGUgY3VycmVudCBsaW5lIGVuZHMgd2l0aCBhIHZpc2li
bGUgaHlwaGVuLgotICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgY29udGVudCBvdmVyZmxvd3Mg
YW5kIGNhbid0IGdldCBicm9rZW4gdXAgaW50byBzbWFsbGVyIGJpdHMuCi0gICAgICAgICAgICBS
ZXZlcnRUb0xhc3RXcmFwT3Bwb3J0dW5pdHksIC8vIFRoZSBjb250ZW50IG5lZWRzIHRvIGJlIHJl
dmVydGVkIGJhY2sgdG8gdGhlIGxhc3Qgd3JhcCBvcHBvcnR1bml0eS4KLSAgICAgICAgICAgIFJl
dmVydFRvTGFzdE5vbk92ZXJmbG93aW5nV3JhcE9wcG9ydHVuaXR5IC8vIFRoZSBjb250ZW50IG5l
ZWRzIHRvIGJlIHJldmVydGVkIGJhY2sgdG8gYSB3cmFwIG9wcG9ydHVuaXR5IHRoYXQgc3RpbGwg
Zml0cyB0aGUgbGluZS4KLSAgICAgICAgfTsKLSAgICAgICAgc3RydWN0IFBhcnRpYWxUcmFpbGlu
Z0NvbnRlbnQgewotICAgICAgICAgICAgc2l6ZV90IHRyYWlsaW5nUnVuSW5kZXggeyAwIH07Ci0g
ICAgICAgICAgICBPcHRpb25hbDxQYXJ0aWFsUnVuPiBwYXJ0aWFsUnVuOyAvLyBudWxsb3B0IHBh
cnRpYWwgcnVuIG1lYW5zIHRoZSB0cmFpbGluZyBydW4gaXMgYSBjb21wbGV0ZSBydW4uCi0gICAg
ICAgIH07Ci0gICAgICAgIEFjdGlvbiBhY3Rpb24geyBBY3Rpb246OktlZXAgfTsKLSAgICAgICAg
SXNFbmRPZkxpbmUgaXNFbmRPZkxpbmUgeyBJc0VuZE9mTGluZTo6Tm8gfTsKLSAgICAgICAgT3B0
aW9uYWw8UGFydGlhbFRyYWlsaW5nQ29udGVudD4gcGFydGlhbFRyYWlsaW5nQ29udGVudCB7IH07
Ci0gICAgICAgIGNvbnN0IElubGluZUl0ZW0qIGxhc3RXcmFwT3Bwb3J0dW5pdHlJdGVtIHsgbnVs
bHB0ciB9OwotICAgIH07Ci0KLSAgICAvLyBUaGlzIHN0cnVjdCByZXByZXNlbnRzIHRoZSBhbW91
bnQgb2YgY29udGludW91cyBjb250ZW50IGNvbW1pdHRlZCB0byBjb250ZW50IGJyZWFraW5nIGF0
IGEgdGltZSAobm8gaW4tYmV0d2VlbiB3cmFwIG9wcG9ydHVuaXRpZXMpLgotICAgIC8vIGUuZy4K
LSAgICAvLyA8ZGl2PnRleHQgY29udGVudCA8c3Bhbj5zcGFuMTwvc3Bhbj5iZXR3ZWVuPHNwYW4+
c3BhbjI8L3NwYW4+PC9kaXY+Ci0gICAgLy8gW3RleHRdWyBdW2NvbnRlbnRdWyBdW2lubGluZSBi
b3ggc3RhcnRdW3NwYW4xXVtpbmxpbmUgYm94IGVuZF1bYmV0d2Vlbl1baW5saW5lIGJveCBzdGFy
dF1bc3BhbjJdW2lubGluZSBib3ggZW5kXQotICAgIC8vIGNvbnRpbnVvdXMgY2FuZGlkYXRlIGNv
bnRlbnQgYXQgYSB0aW1lOgotICAgIC8vIDEuIFt0ZXh0XQotICAgIC8vIDIuIFsgXQotICAgIC8v
IDMuIFtjb250ZW50XQotICAgIC8vIDQuIFsgXQotICAgIC8vIDUuIFtpbmxpbmUgYm94IHN0YXJ0
XVtzcGFuMV1baW5saW5lIGJveCBlbmRdW2JldHdlZW5dW2lubGluZSBib3ggc3RhcnRdW3NwYW4y
XVtpbmxpbmUgYm94IGVuZF0KLSAgICAvLyBzZWUgaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nz
cy10ZXh0LTMvI2xpbmUtYnJlYWstZGV0YWlscwotICAgIHN0cnVjdCBDb250aW51b3VzQ29udGVu
dCB7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1
cm4gbV9sb2dpY2FsV2lkdGg7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBjb2xsYXBzaWJs
ZUxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fY29sbGFwc2libGVMb2dpY2FsV2lkdGg7
IH0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBub25Db2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCgp
IGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxXaWR0aCgpIC0gY29sbGFwc2libGVMb2dpY2FsV2lkdGgo
KTsgfQotICAgICAgICBib29sIGhhc1RyYWlsaW5nQ29sbGFwc2libGVDb250ZW50KCkgY29uc3Qg
eyByZXR1cm4gISFjb2xsYXBzaWJsZUxvZ2ljYWxXaWR0aCgpOyB9Ci0gICAgICAgIGJvb2wgaXNG
dWxseUNvbGxhcHNpYmxlKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFdpZHRoKCkgPT0gY29sbGFw
c2libGVMb2dpY2FsV2lkdGgoKTsgfQotCi0gICAgICAgIHZvaWQgYXBwZW5kKGNvbnN0IElubGlu
ZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCwgT3B0aW9uYWw8SW5saW5lTGF5
b3V0VW5pdD4gY29sbGFwc2libGVXaWR0aCk7Ci0gICAgICAgIHZvaWQgcmVzZXQoKTsKLQotICAg
ICAgICBzdHJ1Y3QgUnVuIHsKLSAgICAgICAgICAgIFJ1bihjb25zdCBJbmxpbmVJdGVtJiwgSW5s
aW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpOwotICAgICAgICAgICAgUnVuKGNvbnN0IFJ1biYp
OwotICAgICAgICAgICAgUnVuJiBvcGVyYXRvcj0oY29uc3QgUnVuJik7Ci0KLSAgICAgICAgICAg
IGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW07Ci0gICAgICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICAgICAgfTsKLSAgICAgICAgdXNpbmcgUnVuTGlz
dCA9IFZlY3RvcjxSdW4sIDM+OwotICAgICAgICBjb25zdCBSdW5MaXN0JiBydW5zKCkgY29uc3Qg
eyByZXR1cm4gbV9ydW5zOyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBSdW5MaXN0IG1fcnVu
czsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2xvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICAg
ICAgSW5saW5lTGF5b3V0VW5pdCBtX2NvbGxhcHNpYmxlTG9naWNhbFdpZHRoIHsgMCB9OwotICAg
IH07Ci0KLSAgICBzdHJ1Y3QgTGluZVN0YXR1cyB7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQg
Y29udGVudExvZ2ljYWxSaWdodCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBhdmFp
bGFibGVXaWR0aCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBjb2xsYXBzaWJsZVdp
ZHRoIHsgMCB9OwotICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB0cmFpbGluZ1Nv
ZnRIeXBoZW5XaWR0aDsKLSAgICAgICAgYm9vbCBoYXNGdWxseUNvbGxhcHNpYmxlVHJhaWxpbmdS
dW4geyBmYWxzZSB9OwotICAgICAgICBib29sIGhhc0NvbnRlbnQgeyBmYWxzZSB9OwotICAgICAg
ICBib29sIGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3NpdGlvbiB7IGZhbHNlIH07Ci0g
ICAgfTsKLSAgICBSZXN1bHQgcHJvY2Vzc0lubGluZUNvbnRlbnQoY29uc3QgQ29udGludW91c0Nv
bnRlbnQmLCBjb25zdCBMaW5lU3RhdHVzJik7Ci0gICAgdm9pZCBzZXRIeXBoZW5hdGlvbkRpc2Fi
bGVkKCkgeyBuX2h5cGhlbmF0aW9uSXNEaXNhYmxlZCA9IHRydWU7IH0KLQotICAgIHN0YXRpYyBi
b29sIGlzV3JhcHBpbmdBbGxvd2VkKGNvbnN0IElubGluZUl0ZW0mKTsKLQotcHJpdmF0ZToKLSAg
ICBSZXN1bHQgcHJvY2Vzc092ZXJmbG93aW5nQ29udGVudChjb25zdCBDb250aW51b3VzQ29udGVu
dCYsIGNvbnN0IExpbmVTdGF0dXMmKSBjb25zdDsKLSAgICBPdmVyZmxvd2luZ1RleHRDb250ZW50
IHByb2Nlc3NPdmVyZmxvd2luZ0NvbnRlbnRXaXRoVGV4dChjb25zdCBDb250aW51b3VzQ29udGVu
dCYsIGNvbnN0IExpbmVTdGF0dXMmKSBjb25zdDsKLSAgICBPcHRpb25hbDxQYXJ0aWFsUnVuPiB0
cnlCcmVha2luZ1RleHRSdW4oY29uc3QgQ29udGludW91c0NvbnRlbnQ6OlJ1biYgb3ZlcmZsb3dS
dW4sIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIE9wdGlvbmFsPElubGluZUxheW91dFVu
aXQ+IGF2YWlsYWJsZVdpZHRoLCBib29sIGhhc1dyYXBPcHBvcnR1bml0eUF0UHJldmlvdXNQb3Np
dGlvbikgY29uc3Q7Ci0KLSAgICBlbnVtIGNsYXNzIFdvcmRCcmVha1J1bGUgewotICAgICAgICBB
dEFyYml0cmFyeVBvc2l0aW9uICAgICAgICA9IDEgPDwgMCwKLSAgICAgICAgQXRIeXBoZW5hdGlv
bk9wcG9ydHVuaXRpZXMgPSAxIDw8IDEKLSAgICB9OwotICAgIE9wdGlvblNldDxXb3JkQnJlYWtS
dWxlPiB3b3JkQnJlYWtCZWhhdmlvcihjb25zdCBSZW5kZXJTdHlsZSYsIGJvb2wgaGFzV3JhcE9w
cG9ydHVuaXR5QXRQcmV2aW91c1Bvc2l0aW9uKSBjb25zdDsKLSAgICBib29sIHNob3VsZEtlZXBF
bmRPZkxpbmVXaGl0ZXNwYWNlKGNvbnN0IENvbnRpbnVvdXNDb250ZW50JikgY29uc3Q7Ci0KLSAg
ICBib29sIG5faHlwaGVuYXRpb25Jc0Rpc2FibGVkIHsgZmFsc2UgfTsKLX07Ci0KLWlubGluZSBJ
bmxpbmVDb250ZW50QnJlYWtlcjo6Q29udGludW91c0NvbnRlbnQ6OlJ1bjo6UnVuKGNvbnN0IElu
bGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKQotICAg
IDogaW5saW5lSXRlbShpbmxpbmVJdGVtKQotICAgICwgbG9naWNhbFdpZHRoKGxvZ2ljYWxXaWR0
aCkKLXsKLX0KLQotaW5saW5lIElubGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVu
dDo6UnVuOjpSdW4oY29uc3QgUnVuJiBvdGhlcikKLSAgICA6IGlubGluZUl0ZW0ob3RoZXIuaW5s
aW5lSXRlbSkKLSAgICAsIGxvZ2ljYWxXaWR0aChvdGhlci5sb2dpY2FsV2lkdGgpCi17Ci19Ci0K
LX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IGE1MWVhZmZjZGEzZWVjYzQzZTIxNWQxZDk2NDYxMDZjMGNjNWE5NzIuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250
ZXh0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0
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
aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCi0jaW5jbHVkZSAiSW5saW5l
Rm9ybWF0dGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiSW5saW5lTGluZUJveC5oIgotI2luY2x1ZGUg
IklubGluZUxpbmVSdW4uaCIKLSNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5oIgotI2luY2x1ZGUg
IkludmFsaWRhdGlvblN0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAi
TGF5b3V0Q29udGFpbmVyQm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1
ZGUgIkxheW91dEluaXRpYWxDb250YWluaW5nQmxvY2suaCIKLSNpbmNsdWRlICJMYXlvdXRJbmxp
bmVUZXh0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0TGluZUJyZWFrQm94LmgiCi0jaW5jbHVkZSAi
TGF5b3V0UmVwbGFjZWRCb3guaCIKLSNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgotI2luY2x1ZGUg
IkxvZ2dpbmcuaCIKLSNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmgiCi0jaW5jbHVk
ZSAiVGV4dFV0aWwuaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotI2luY2x1
ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNw
YWNlIExheW91dCB7Ci0KLVdURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCk7Ci0KLUlubGluZUZvcm1hdHRpbmdDb250ZXh0OjpJbmxpbmVGb3JtYXR0aW5n
Q29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgSW5saW5l
Rm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUpCi0gICAgOiBGb3JtYXR0aW5nQ29udGV4
dChmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGZvcm1hdHRpbmdTdGF0ZSkKLXsKLX0KLQotc3RhdGlj
IGlubGluZSBjb25zdCBCb3gqIG5leHRJbmxpbmVMZXZlbEJveFRvTGF5b3V0KGNvbnN0IEJveCYg
bGF5b3V0Qm94LCBjb25zdCBDb250YWluZXJCb3gmIHN0YXlXaXRoaW4pCi17Ci0gICAgLy8gQXRv
bWljIGlubGluZS1sZXZlbCBib3hlcyBhbmQgZmxvYXRzIGFyZSBvcGFxdWUgYm94ZXMgbWVhbmlu
ZyB0aGF0IHRoZXkgYXJlCi0gICAgLy8gcmVzcG9uc2libGUgZm9yIHRoZWlyIG93biBjb250ZW50
IChkbyBub3QgbmVlZCB0byBkZXNjZW5kIGludG8gdGhlaXIgc3VidHJlZXMpLgotICAgIC8vIE9u
bHkgaW5saW5lIGJveGVzIG1heSBoYXZlIHJlbGV2YW50IGRlc2NlbmRhbnQgY29udGVudC4KLSAg
ICBpZiAobGF5b3V0Qm94LmlzSW5saW5lQm94KCkpIHsKLSAgICAgICAgaWYgKGlzPENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KSAmJiBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuaGFz
SW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpIHsKLSAgICAgICAgICAgIC8vIEFub255bW91cyBpbmxp
bmUgdGV4dCBib3hlcy9saW5lIGJyZWFrcyBjYW4ndCBoYXZlIGRlc2NlbmRhbnQgY29udGVudCBi
eSBkZWZpbml0aW9uLgotICAgICAgICAgICAgQVNTRVJUKCFsYXlvdXRCb3guaXNJbmxpbmVUZXh0
Qm94KCkgJiYgIWxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKTsKLSAgICAgICAgICAgIHJldHVy
biBkb3duY2FzdDxDb250YWluZXJCb3g+KGxheW91dEJveCkuZmlyc3RJbkZsb3dPckZsb2F0aW5n
Q2hpbGQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoYXV0byogbmV4dEluUHJlT3Jk
ZXIgPSAmbGF5b3V0Qm94OyBuZXh0SW5QcmVPcmRlciAmJiBuZXh0SW5QcmVPcmRlciAhPSAmc3Rh
eVdpdGhpbjsgbmV4dEluUHJlT3JkZXIgPSAmbmV4dEluUHJlT3JkZXItPnBhcmVudCgpKSB7Ci0g
ICAgICAgIGlmIChhdXRvKiBuZXh0U2libGluZyA9IG5leHRJblByZU9yZGVyLT5uZXh0SW5GbG93
T3JGbG9hdGluZ1NpYmxpbmcoKSkKLSAgICAgICAgICAgIHJldHVybiBuZXh0U2libGluZzsKLSAg
ICB9Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQ6OmxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmIGludmFsaWRhdGlvblN0
YXRlLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQmIGNvbnN0cmFpbnRzKQotewot
ICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29udGV4dExheW91dCwgc3RyZWFtIDw8ICJb
U3RhcnRdIC0+IGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgLT4gZm9ybWF0dGluZyByb290KCIg
PDwgJnJvb3QoKSA8PCAiKSIpOwotICAgIEFTU0VSVChyb290KCkuaGFzSW5GbG93T3JGbG9hdGlu
Z0NoaWxkKCkpOwotCi0gICAgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShpbnZhbGlkYXRpb25T
dGF0ZSk7Ci0gICAgYXV0byogbGF5b3V0Qm94ID0gcm9vdCgpLmZpcnN0SW5GbG93T3JGbG9hdGlu
Z0NoaWxkKCk7Ci0gICAgLy8gMS4gVmlzaXQgZWFjaCBpbmxpbmUgYm94IGFuZCBwYXJ0aWFsbHkg
Y29tcHV0ZSB0aGVpciBnZW9tZXRyeSAobWFyZ2lucywgcGFkZGluZyBhbmQgYm9yZGVycykuCi0g
ICAgLy8gMi4gQ29sbGVjdCB0aGUgaW5saW5lIGl0ZW1zIChmbGF0dGVuIHRoZSB0aGUgbGF5b3V0
IHRyZWUpIGFuZCBwbGFjZSB0aGVtIG9uIGxpbmVzIGluIGJpZGlyZWN0aW9uYWwgb3JkZXIuIAot
ICAgIHdoaWxlIChsYXlvdXRCb3gpIHsKLSAgICAgICAgQVNTRVJUKGxheW91dEJveC0+aXNJbmxp
bmVMZXZlbEJveCgpIHx8IGxheW91dEJveC0+aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7Ci0KLSAg
ICAgICAgaWYgKGxheW91dEJveC0+aXNBdG9taWNJbmxpbmVMZXZlbEJveCgpIHx8IGxheW91dEJv
eC0+aXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkgewotICAgICAgICAgICAgLy8gSW5saW5lLWJsb2Nr
cywgaW5saW5lLXRhYmxlcyBhbmQgcmVwbGFjZWQgZWxlbWVudHMgKGltZywgdmlkZW8pIGNhbiBi
ZSBzaXplZCBidXQgbm90IHlldCBwb3NpdGlvbmVkLgotICAgICAgICAgICAgaWYgKGlzPENvbnRh
aW5lckJveD4obGF5b3V0Qm94KSAmJiBsYXlvdXRCb3gtPmVzdGFibGlzaGVzRm9ybWF0dGluZ0Nv
bnRleHQoKSkgewotICAgICAgICAgICAgICAgIEFTU0VSVChsYXlvdXRCb3gtPmlzSW5saW5lQmxv
Y2tCb3goKSB8fCBsYXlvdXRCb3gtPmlzSW5saW5lVGFibGVCb3goKSB8fCBsYXlvdXRCb3gtPmlz
RmxvYXRpbmdQb3NpdGlvbmVkKCkpOwotICAgICAgICAgICAgICAgIGF1dG8mIGZvcm1hdHRpbmdS
b290ID0gZG93bmNhc3Q8Q29udGFpbmVyQm94PigqbGF5b3V0Qm94KTsKLSAgICAgICAgICAgICAg
ICBjb21wdXRlQm9yZGVyQW5kUGFkZGluZyhmb3JtYXR0aW5nUm9vdCwgY29uc3RyYWludHMuaG9y
aXpvbnRhbCk7Ci0gICAgICAgICAgICAgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKGZvcm1hdHRp
bmdSb290LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKLQotICAgICAgICAgICAgICAgIGlmIChm
b3JtYXR0aW5nUm9vdC5oYXNDaGlsZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8gZm9y
bWF0dGluZ0NvbnRleHQgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChm
b3JtYXR0aW5nUm9vdCwgbGF5b3V0U3RhdGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChm
b3JtYXR0aW5nUm9vdC5oYXNJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGZvcm1hdHRpbmdDb250ZXh0LT5sYXlvdXRJbkZsb3dDb250ZW50KGludmFsaWRh
dGlvblN0YXRlLCBnZW9tZXRyeSgpLmNvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudChmb3JtYXR0
aW5nUm9vdCkpOwotICAgICAgICAgICAgICAgICAgICBjb21wdXRlSGVpZ2h0QW5kTWFyZ2luKGZv
cm1hdHRpbmdSb290LCBjb25zdHJhaW50cy5ob3Jpem9udGFsKTsKLSAgICAgICAgICAgICAgICAg
ICAgZm9ybWF0dGluZ0NvbnRleHQtPmxheW91dE91dE9mRmxvd0NvbnRlbnQoaW52YWxpZGF0aW9u
U3RhdGUsIGdlb21ldHJ5KCkuY29uc3RyYWludHNGb3JPdXRPZkZsb3dDb250ZW50KGZvcm1hdHRp
bmdSb290KSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNv
bXB1dGVIZWlnaHRBbmRNYXJnaW4oZm9ybWF0dGluZ1Jvb3QsIGNvbnN0cmFpbnRzLmhvcml6b250
YWwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBSZXBsYWNlZCBh
bmQgb3RoZXIgdHlwZSBvZiBsZWFmIGF0b21pYyBpbmxpbmUgYm94ZXMuCi0gICAgICAgICAgICAg
ICAgY29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoKmxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpv
bnRhbCk7Ci0gICAgICAgICAgICAgICAgY29tcHV0ZVdpZHRoQW5kTWFyZ2luKCpsYXlvdXRCb3gs
IGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwotICAgICAgICAgICAgICAgIGNvbXB1dGVIZWlnaHRB
bmRNYXJnaW4oKmxheW91dEJveCwgY29uc3RyYWludHMuaG9yaXpvbnRhbCk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LT5pc0xpbmVCcmVha0JveCgpKSB7Ci0g
ICAgICAgICAgICBhdXRvJiBib3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdTdGF0ZSgpLmJveEdlb21l
dHJ5KCpsYXlvdXRCb3gpOwotICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1h
cmdpbih7IH0pOwotICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Qm9yZGVyKHsgfSk7Ci0gICAg
ICAgICAgICBib3hHZW9tZXRyeS5zZXRQYWRkaW5nKHsgfSk7Ci0gICAgICAgICAgICBib3hHZW9t
ZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoeyB9KTsKLSAgICAgICAgICAgIGJveEdlb21ldHJ5LnNl
dFZlcnRpY2FsTWFyZ2luKHsgfSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LT5pc0lu
bGluZUJveCgpKSB7Ci0gICAgICAgICAgICAvLyBUZXh0IHdyYXBwZXIgYm94ZXMgKGFub255bW91
cyBpbmxpbmUgbGV2ZWwgYm94ZXMpIGRvbid0IGhhdmUgYm94IGdlb21ldHJpZXMgKHRoZXkgb25s
eSBnZW5lcmF0ZSBydW5zKS4KLSAgICAgICAgICAgIGlmICghbGF5b3V0Qm94LT5pc0lubGluZVRl
eHRCb3goKSkgewotICAgICAgICAgICAgICAgIC8vIElubGluZSBib3hlcyAoPHNwYW4+KSBjYW4n
dCBnZXQgc2l6ZWQvcG9zaXRpb25lZCB5ZXQuIEF0IHRoaXMgcG9pbnQgd2UgY2FuIG9ubHkgY29t
cHV0ZSB0aGVpciBtYXJnaW5zLCBib3JkZXJzIGFuZCBwYWRkaW5nLgotICAgICAgICAgICAgICAg
IGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gsIGNvbnN0cmFpbnRzLmhvcml6b250
YWwpOwotICAgICAgICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsTWFyZ2luKCpsYXlvdXRCb3gs
IGNvbnN0cmFpbnRzLmhvcml6b250YWwpOwotICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0
ZSgpLmJveEdlb21ldHJ5KCpsYXlvdXRCb3gpLnNldFZlcnRpY2FsTWFyZ2luKHsgfSk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7Ci0KLSAgICAgICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlvdXQoKmxh
eW91dEJveCwgcm9vdCgpKTsKLSAgICB9Ci0KLSAgICBjb2xsZWN0SW5saW5lQ29udGVudElmTmVl
ZGVkKCk7Ci0KLSAgICBhdXRvJiBpbmxpbmVJdGVtcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmlubGlu
ZUl0ZW1zKCk7Ci0gICAgbGluZUxheW91dChpbmxpbmVJdGVtcywgeyAwLCBpbmxpbmVJdGVtcy5z
aXplKCkgfSwgY29uc3RyYWludHMpOwotICAgIExPR19XSVRIX1NUUkVBTShGb3JtYXR0aW5nQ29u
dGV4dExheW91dCwgc3RyZWFtIDw8ICJbRW5kXSAtPiBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0
IC0+IGZvcm1hdHRpbmcgcm9vdCgiIDw8ICZyb290KCkgPDwgIikiKTsKLX0KLQotdm9pZCBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDo6bGluZUxheW91dEZvckludGVyZ3JhdGlvbihJbnZhbGlkYXRp
b25TdGF0ZSYgaW52YWxpZGF0aW9uU3RhdGUsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29u
dGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgaW52YWxpZGF0ZUZvcm1hdHRpbmdTdGF0ZShpbnZh
bGlkYXRpb25TdGF0ZSk7Ci0gICAgY29sbGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgpOwotICAg
IGF1dG8mIGlubGluZUl0ZW1zID0gZm9ybWF0dGluZ1N0YXRlKCkuaW5saW5lSXRlbXMoKTsKLSAg
ICBsaW5lTGF5b3V0KGlubGluZUl0ZW1zLCB7IDAsIGlubGluZUl0ZW1zLnNpemUoKSB9LCBjb25z
dHJhaW50cyk7Ci19Ci0KLUxheW91dFVuaXQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OnVzZWRD
b250ZW50SGVpZ2h0KCkgY29uc3QKLXsKLSAgICAvLyAxMC42LjcgJ0F1dG8nIGhlaWdodHMgZm9y
IGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCByb290cwotCi0gICAgLy8gSWYgaXQgb25seSBoYXMg
aW5saW5lLWxldmVsIGNoaWxkcmVuLCB0aGUgaGVpZ2h0IGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVu
IHRoZSB0b3Agb2YgdGhlIHRvcG1vc3QgbGluZSBib3ggYW5kIHRoZSBib3R0b20gb2YgdGhlIGJv
dHRvbW1vc3QgbGluZSBib3guCi0KLSAgICAvLyBJbiBhZGRpdGlvbiwgaWYgdGhlIGVsZW1lbnQg
aGFzIGFueSBmbG9hdGluZyBkZXNjZW5kYW50cyB3aG9zZSBib3R0b20gbWFyZ2luIGVkZ2UgaXMg
YmVsb3cgdGhlIGVsZW1lbnQncyBib3R0b20gY29udGVudCBlZGdlLAotICAgIC8vIHRoZW4gdGhl
IGhlaWdodCBpcyBpbmNyZWFzZWQgdG8gaW5jbHVkZSB0aG9zZSBlZGdlcy4gT25seSBmbG9hdHMg
dGhhdCBwYXJ0aWNpcGF0ZSBpbiB0aGlzIGJsb2NrIGZvcm1hdHRpbmcgY29udGV4dCBhcmUgdGFr
ZW4KLSAgICAvLyBpbnRvIGFjY291bnQsIGUuZy4sIGZsb2F0cyBpbnNpZGUgYWJzb2x1dGVseSBw
b3NpdGlvbmVkIGRlc2NlbmRhbnRzIG9yIG90aGVyIGZsb2F0cyBhcmUgbm90LgotICAgIGF1dG8m
IGxpbmVzID0gZm9ybWF0dGluZ1N0YXRlKCkubGluZXMoKTsKLSAgICAvLyBFdmVuIGVtcHR5IGNv
bnRlbnQgZ2VuZXJhdGVzIGEgbGluZS4KLSAgICBBU1NFUlQoIWxpbmVzLmlzRW1wdHkoKSk7Ci0g
ICAgYXV0byB0b3AgPSBMYXlvdXRVbml0IHsgbGluZXMuZmlyc3QoKS5saW5lQm94TG9naWNhbFJl
Y3QoKS50b3AoKSB9OwotICAgIGF1dG8gYm90dG9tID0gTGF5b3V0VW5pdCB7IGxpbmVzLmxhc3Qo
KS5saW5lQm94TG9naWNhbFJlY3QoKS5ib3R0b20oKSArIGZvcm1hdHRpbmdTdGF0ZSgpLmNsZWFy
R2FwQWZ0ZXJMYXN0TGluZSgpIH07Ci0KLSAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZsb2F0
aW5nQ29udGV4dCB7ICp0aGlzLCBmb3JtYXR0aW5nU3RhdGUoKS5mbG9hdGluZ1N0YXRlKCkgfTsK
LSAgICBpZiAoYXV0byBmbG9hdEJvdHRvbSA9IGZsb2F0aW5nQ29udGV4dC5ib3R0b20oKSkgewot
ICAgICAgICBib3R0b20gPSBzdGQ6Om1heCgqZmxvYXRCb3R0b20sIGJvdHRvbSk7Ci0gICAgICAg
IHRvcCA9IHN0ZDo6bWluKCpmbG9hdGluZ0NvbnRleHQudG9wKCksIHRvcCk7Ci0gICAgfQotICAg
IHJldHVybiBib3R0b20gLSB0b3A7Ci19Ci0KLXZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6
OmxpbmVMYXlvdXQoSW5saW5lSXRlbXMmIGlubGluZUl0ZW1zLCBMaW5lQnVpbGRlcjo6SW5saW5l
SXRlbVJhbmdlIG5lZWRzTGF5b3V0UmFuZ2UsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29u
dGVudCYgY29uc3RyYWludHMpCi17Ci0gICAgYXV0byYgZm9ybWF0dGluZ1N0YXRlID0gdGhpcy0+
Zm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgZm9ybWF0dGluZ1N0YXRlLmxpbmVSdW5zKCkucmVzZXJ2
ZUluaXRpYWxDYXBhY2l0eShmb3JtYXR0aW5nU3RhdGUuaW5saW5lSXRlbXMoKS5zaXplKCkpOwot
ICAgIElubGluZUxheW91dFVuaXQgbGluZUxvZ2ljYWxUb3AgPSBjb25zdHJhaW50cy52ZXJ0aWNh
bC5sb2dpY2FsVG9wOwotICAgIHN0cnVjdCBQcmV2aW91c0xpbmUgewotICAgICAgICBMaW5lQnVp
bGRlcjo6SW5saW5lSXRlbVJhbmdlIHJhbmdlOwotICAgICAgICBzaXplX3Qgb3ZlcmZsb3dDb250
ZW50TGVuZ3RoIHsgMCB9OwotICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVy
Zmxvd0xvZ2ljYWxXaWR0aDsKLSAgICB9OwotICAgIE9wdGlvbmFsPFByZXZpb3VzTGluZT4gcHJl
dmlvdXNMaW5lOwotICAgIGF1dG8mIGZsb2F0aW5nU3RhdGUgPSBmb3JtYXR0aW5nU3RhdGUuZmxv
YXRpbmdTdGF0ZSgpOwotICAgIGF1dG8gZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250ZXh0
IHsgKnRoaXMsIGZsb2F0aW5nU3RhdGUgfTsKLSAgICBhdXRvIGlzRmlyc3RMaW5lID0gZm9ybWF0
dGluZ1N0YXRlLmxpbmVzKCkuaXNFbXB0eSgpOwotCi0gICAgYXV0byBsaW5lQnVpbGRlciA9IExp
bmVCdWlsZGVyIHsgKnRoaXMsIGZsb2F0aW5nU3RhdGUsIGNvbnN0cmFpbnRzLmhvcml6b250YWws
IGlubGluZUl0ZW1zIH07Ci0gICAgd2hpbGUgKCFuZWVkc0xheW91dFJhbmdlLmlzRW1wdHkoKSkg
ewotICAgICAgICAvLyBUdXJuIHByZXZpb3VzIGxpbmUncyBvdmVyZmxvdyBjb250ZW50IGxlbmd0
aCBpbnRvIHRoZSBuZXh0IGxpbmUncyBsZWFkaW5nIGNvbnRlbnQgcGFydGlhbCBsZW5ndGguCi0g
ICAgICAgIC8vICJzcFs8LWxpbmUgYnJlYWstPl1saXRfY29udGVudCIgLT4gb3ZlcmZsb3cgbGVu
Z3RoOiAxMSAtPiBsZWFkaW5nIHBhcnRpYWwgY29udGVudCBsZW5ndGg6IDExLgotICAgICAgICBh
dXRvIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCA9IHByZXZpb3VzTGluZSA/IHByZXZpb3Vz
TGluZS0+b3ZlcmZsb3dDb250ZW50TGVuZ3RoIDogMDsKLSAgICAgICAgYXV0byBsZWFkaW5nTG9n
aWNhbFdpZHRoID0gcHJldmlvdXNMaW5lID8gcHJldmlvdXNMaW5lLT5vdmVyZmxvd0xvZ2ljYWxX
aWR0aCA6IFdURjo6bnVsbG9wdDsKLSAgICAgICAgYXV0byBpbml0aWFsTGluZUNvbnN0cmFpbnRz
ID0gSW5saW5lUmVjdCB7IGxpbmVMb2dpY2FsVG9wLCBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxv
Z2ljYWxMZWZ0LCBjb25zdHJhaW50cy5ob3Jpem9udGFsLmxvZ2ljYWxXaWR0aCwgcXVpcmtzKCku
aW5pdGlhbExpbmVIZWlnaHQoKSB9OwotICAgICAgICBhdXRvIGxpbmVDb250ZW50ID0gbGluZUJ1
aWxkZXIubGF5b3V0SW5saW5lQ29udGVudChuZWVkc0xheW91dFJhbmdlLCBwYXJ0aWFsTGVhZGlu
Z0NvbnRlbnRMZW5ndGgsIGxlYWRpbmdMb2dpY2FsV2lkdGgsIGluaXRpYWxMaW5lQ29uc3RyYWlu
dHMsIGlzRmlyc3RMaW5lKTsKLSAgICAgICAgYXV0byBsaW5lTG9naWNhbFJlY3QgPSBjb21wdXRl
R2VvbWV0cnlGb3JMaW5lQ29udGVudChsaW5lQ29udGVudCwgY29uc3RyYWludHMuaG9yaXpvbnRh
bCk7Ci0KLSAgICAgICAgYXV0byBsaW5lQ29udGVudFJhbmdlID0gbGluZUNvbnRlbnQuaW5saW5l
SXRlbVJhbmdlOwotICAgICAgICBpZiAoIWxpbmVDb250ZW50UmFuZ2UuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgICAgICBBU1NFUlQobmVlZHNMYXlvdXRSYW5nZS5zdGFydCA8IGxpbmVDb250ZW50UmFu
Z2UuZW5kKTsKLSAgICAgICAgICAgIGlzRmlyc3RMaW5lID0gZmFsc2U7Ci0gICAgICAgICAgICBs
aW5lTG9naWNhbFRvcCA9IGdlb21ldHJ5KCkubG9naWNhbFRvcEZvck5leHRMaW5lKGxpbmVDb250
ZW50LCBsaW5lTG9naWNhbFJlY3QuYm90dG9tKCksIGZsb2F0aW5nQ29udGV4dCk7Ci0gICAgICAg
ICAgICBpZiAobGluZUNvbnRlbnQuaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KSB7Ci0gICAg
ICAgICAgICAgICAgLy8gVGhlIGZpbmFsIGNvbnRlbnQgaGVpZ2h0IG9mIHRoaXMgaW5saW5lIGZv
cm1hdHRpbmcgY29udGV4dCBzaG91bGQgaW5jbHVkZSB0aGUgY2xlYXJlZCBmbG9hdHMgYXMgd2Vs
bC4KLSAgICAgICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuc2V0Q2xlYXJHYXBBZnRlckxhc3RM
aW5lKGxpbmVMb2dpY2FsVG9wIC0gbGluZUxvZ2ljYWxSZWN0LmJvdHRvbSgpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIC8vIFdoZW4gdGhlIHRyYWlsaW5nIGNvbnRlbnQgaXMgcGFydGlh
bCwgd2UgbmVlZCB0byByZXVzZSB0aGUgbGFzdCBJbmxpbmVUZXh0SXRlbS4KLSAgICAgICAgICAg
IGF1dG8gbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPSBsaW5lQ29udGVudC5wYXJ0
aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoOwotICAgICAgICAgICAgaWYgKGxhc3RJbmxpbmVJdGVt
TmVlZHNQYXJ0aWFsTGF5b3V0KSB7Ci0gICAgICAgICAgICAgICAgYXV0byBsaW5lTGF5b3V0SGFz
QWR2YW5jZWQgPSAhcHJldmlvdXNMaW5lCi0gICAgICAgICAgICAgICAgICAgIHx8IGxpbmVDb250
ZW50UmFuZ2UuZW5kID4gcHJldmlvdXNMaW5lLT5yYW5nZS5lbmQKLSAgICAgICAgICAgICAgICAg
ICAgfHwgKHByZXZpb3VzTGluZS0+b3ZlcmZsb3dDb250ZW50TGVuZ3RoICYmIHByZXZpb3VzTGlu
ZS0+b3ZlcmZsb3dDb250ZW50TGVuZ3RoID4gbGluZUNvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29u
dGVudExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFsaW5lTGF5b3V0SGFzQWR2YW5jZWQp
IHsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgICAg
ICAgICAgICAgIC8vIE1vdmUgb3ZlciB0byB0aGUgbmV4dCBydW4gaWYgd2UgYXJlIHN0dWNrIG9u
IHRoaXMgcGFydGlhbCBjb250ZW50ICh3aGVuIHRoZSBvdmVyZmxvdyBjb250ZW50IGxlbmd0aCBy
ZW1haW5zIHRoZSBzYW1lKS4KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2VydGFpbmx5IGxv
c2Ugc29tZSBjb250ZW50LCBidXQgd2Ugd291bGQgYmUgYnVzeSBsb29waW5nIG90aGVyd2lzZS4K
LSAgICAgICAgICAgICAgICAgICAgbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPSBm
YWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZWVk
c0xheW91dFJhbmdlLnN0YXJ0ID0gbGFzdElubGluZUl0ZW1OZWVkc1BhcnRpYWxMYXlvdXQgPyBs
aW5lQ29udGVudFJhbmdlLmVuZCAtIDEgOiBsaW5lQ29udGVudFJhbmdlLmVuZDsKLSAgICAgICAg
ICAgIHByZXZpb3VzTGluZSA9IFByZXZpb3VzTGluZSB7IGxpbmVDb250ZW50UmFuZ2UsIGxpbmVD
b250ZW50LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGgsIGxpbmVDb250ZW50Lm92ZXJmbG93
TG9naWNhbFdpZHRoIH07Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAg
ICAvLyBGbG9hdHMgcHJldmVudGVkIHVzIHBsYWNpbmcgYW55IGNvbnRlbnQgb24gdGhlIGxpbmUu
Ci0gICAgICAgIEFTU0VSVChsaW5lQ29udGVudC5ydW5zLmlzRW1wdHkoKSk7Ci0gICAgICAgIEFT
U0VSVChsaW5lQ29udGVudC5oYXNJbnRydXNpdmVGbG9hdCk7Ci0gICAgICAgIC8vIE1vdmUgdGhl
IG5leHQgbGluZSBiZWxvdyB0aGUgaW50cnVzaXZlIGZsb2F0LgotICAgICAgICBhdXRvIGZsb2F0
Q29uc3RyYWludHMgPSBmbG9hdGluZ0NvbnRleHQuY29uc3RyYWludHModG9MYXlvdXRVbml0KGxp
bmVMb2dpY2FsVG9wKSwgdG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmVjdC5ib3R0b20oKSkpOwot
ICAgICAgICBBU1NFUlQoZmxvYXRDb25zdHJhaW50cy5sZWZ0IHx8IGZsb2F0Q29uc3RyYWludHMu
cmlnaHQpOwotICAgICAgICBzdGF0aWMgYXV0byBpbmlmaXRlUG9pbnQgPSBQb2ludEluQ29udGV4
dFJvb3Q6Om1heCgpOwotICAgICAgICAvLyBJbiBjYXNlIG9mIGxlZnQgYW5kIHJpZ2h0IGNvbnN0
cmFpbnRzLCB3ZSBuZWVkIHRvIHBpY2sgdGhlIG9uZSB0aGF0J3MgY2xvc2VyIHRvIHRoZSBjdXJy
ZW50IGxpbmUuCi0gICAgICAgIGxpbmVMb2dpY2FsVG9wID0gc3RkOjptaW4oZmxvYXRDb25zdHJh
aW50cy5sZWZ0LnZhbHVlT3IoaW5pZml0ZVBvaW50KS55LCBmbG9hdENvbnN0cmFpbnRzLnJpZ2h0
LnZhbHVlT3IoaW5pZml0ZVBvaW50KS55KTsKLSAgICAgICAgQVNTRVJUKGxpbmVMb2dpY2FsVG9w
IDwgaW5pZml0ZVBvaW50LnkpOwotICAgIH0KLX0KLQotRm9ybWF0dGluZ0NvbnRleHQ6OkludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmNvbXB1dGVkSW50
cmluc2ljV2lkdGhDb25zdHJhaW50cygpCi17Ci0gICAgYXV0byYgbGF5b3V0U3RhdGUgPSB0aGlz
LT5sYXlvdXRTdGF0ZSgpOwotICAgIEFTU0VSVCghZm9ybWF0dGluZ1N0YXRlKCkuaW50cmluc2lj
V2lkdGhDb25zdHJhaW50cygpKTsKLQotICAgIGlmICghcm9vdCgpLmhhc0luRmxvd09yRmxvYXRp
bmdDaGlsZCgpKSB7Ci0gICAgICAgIGF1dG8gY29uc3RyYWludHMgPSBnZW9tZXRyeSgpLmNvbnN0
cmFpbkJ5TWluTWF4V2lkdGgocm9vdCgpLCB7IH0pOwotICAgICAgICBmb3JtYXR0aW5nU3RhdGUo
KS5zZXRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKTsKLSAgICAgICAgcmV0
dXJuIGNvbnN0cmFpbnRzOwotICAgIH0KLQotICAgIFZlY3Rvcjxjb25zdCBCb3gqPiBmb3JtYXR0
aW5nQ29udGV4dFJvb3RMaXN0OwotICAgIGF1dG8gaG9yaXpvbnRhbENvbnN0cmFpbnRzID0gSG9y
aXpvbnRhbENvbnN0cmFpbnRzIHsgMF9sdSwgMF9sdSB9OwotICAgIGF1dG8qIGxheW91dEJveCA9
IHJvb3QoKS5maXJzdEluRmxvd09yRmxvYXRpbmdDaGlsZCgpOwotICAgIC8vIEluIG9yZGVyIHRv
IGNvbXB1dGUgdGhlIG1heC9taW4gd2lkdGhzLCB3ZSBuZWVkIHRvIGNvbXB1dGUgbWFyZ2lucywg
Ym9yZGVycyBhbmQgcGFkZGluZyBmb3IgY2VydGFpbiBpbmxpbmUgYm94ZXMgZmlyc3QuCi0gICAg
d2hpbGUgKGxheW91dEJveCkgewotICAgICAgICBpZiAobGF5b3V0Qm94LT5pc0lubGluZVRleHRC
b3goKSkgewotICAgICAgICAgICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlv
dXQoKmxheW91dEJveCwgcm9vdCgpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9
Ci0gICAgICAgIGlmIChsYXlvdXRCb3gtPmlzUmVwbGFjZWRCb3goKSkgewotICAgICAgICAgICAg
Y29tcHV0ZUJvcmRlckFuZFBhZGRpbmcoKmxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
KTsKLSAgICAgICAgICAgIGNvbXB1dGVXaWR0aEFuZE1hcmdpbigqbGF5b3V0Qm94LCBob3Jpem9u
dGFsQ29uc3RyYWludHMpOwotICAgICAgICB9IGVsc2UgaWYgKGxheW91dEJveC0+aXNGbG9hdGlu
Z1Bvc2l0aW9uZWQoKSB8fCBsYXlvdXRCb3gtPmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSkgewot
ICAgICAgICAgICAgQVNTRVJUKGxheW91dEJveC0+ZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4
dCgpKTsKLSAgICAgICAgICAgIGZvcm1hdHRpbmdDb250ZXh0Um9vdExpc3QuYXBwZW5kKGxheW91
dEJveCk7Ci0KLSAgICAgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKCpsYXlvdXRCb3gs
IGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgICAgICAgICBjb21wdXRlSG9yaXpvbnRhbE1h
cmdpbigqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgICAgICAgICAgY29t
cHV0ZUludHJpbnNpY1dpZHRoRm9yRm9ybWF0dGluZ1Jvb3QoKmxheW91dEJveCk7Ci0gICAgICAg
IH0gZWxzZSBpZiAobGF5b3V0Qm94LT5pc0lubGluZUJveCgpKSB7Ci0gICAgICAgICAgICBjb21w
dXRlQm9yZGVyQW5kUGFkZGluZygqbGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwot
ICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxNYXJnaW4oKmxheW91dEJveCwgaG9yaXpvbnRh
bENvbnN0cmFpbnRzKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKLSAgICAgICAgbGF5b3V0Qm94ID0gbmV4dElubGluZUxldmVsQm94VG9MYXlvdXQo
KmxheW91dEJveCwgcm9vdCgpKTsKLSAgICB9Ci0KLSAgICBjb2xsZWN0SW5saW5lQ29udGVudElm
TmVlZGVkKCk7Ci0KLSAgICBhdXRvIG1heGltdW1MaW5lV2lkdGggPSBbJl0oYXV0byBhdmFpbGFi
bGVXaWR0aCkgewotICAgICAgICAvLyBTd2l0Y2ggdG8gdGhlIG1pbi9tYXggZm9ybWF0dGluZyBy
b290IHdpZHRoIHZhbHVlcyBiZWZvcmUgZm9ybWF0dGluZyB0aGUgbGluZXMuCi0gICAgICAgIGZv
ciAoYXV0byogZm9ybWF0dGluZ1Jvb3QgOiBmb3JtYXR0aW5nQ29udGV4dFJvb3RMaXN0KSB7Ci0g
ICAgICAgICAgICBhdXRvIGludHJpbnNpY1dpZHRocyA9IGxheW91dFN0YXRlLmZvcm1hdHRpbmdT
dGF0ZUZvckJveCgqZm9ybWF0dGluZ1Jvb3QpLmludHJpbnNpY1dpZHRoQ29uc3RyYWludHNGb3JC
b3goKmZvcm1hdHRpbmdSb290KTsKLSAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9y
bWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkoKmZvcm1hdHRpbmdSb290KTsKLSAgICAgICAgICAg
IGF1dG8gY29udGVudFdpZHRoID0gKGF2YWlsYWJsZVdpZHRoID8gaW50cmluc2ljV2lkdGhzLT5t
YXhpbXVtIDogaW50cmluc2ljV2lkdGhzLT5taW5pbXVtKSAtIGJveEdlb21ldHJ5Lmhvcml6b250
YWxNYXJnaW5Cb3JkZXJBbmRQYWRkaW5nKCk7Ci0gICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRD
b250ZW50Qm94V2lkdGgoY29udGVudFdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4g
Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aEZvckNvbnN0cmFpbnQoYXZhaWxhYmxlV2lkdGgpOwotICAg
IH07Ci0KLSAgICBhdXRvIG1pbmltdW1Db250ZW50V2lkdGggPSBjZWlsZWRMYXlvdXRVbml0KG1h
eGltdW1MaW5lV2lkdGgoMCkpOwotICAgIGF1dG8gbWF4aW11bUNvbnRlbnRXaWR0aCA9IGNlaWxl
ZExheW91dFVuaXQobWF4aW11bUxpbmVXaWR0aChtYXhJbmxpbmVMYXlvdXRVbml0KCkpKTsKLSAg
ICBhdXRvIGNvbnN0cmFpbnRzID0gZ2VvbWV0cnkoKS5jb25zdHJhaW5CeU1pbk1heFdpZHRoKHJv
b3QoKSwgeyBtaW5pbXVtQ29udGVudFdpZHRoLCBtYXhpbXVtQ29udGVudFdpZHRoIH0pOwotICAg
IGZvcm1hdHRpbmdTdGF0ZSgpLnNldEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoY29uc3RyYWlu
dHMpOwotICAgIHJldHVybiBjb25zdHJhaW50czsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBJbmxp
bmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZWRJbnRyaW5zaWNXaWR0aEZvckNvbnN0cmFpbnQo
SW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCkgY29uc3QKLXsKLSAgICBhdXRvJiBpbmxp
bmVJdGVtcyA9IGZvcm1hdHRpbmdTdGF0ZSgpLmlubGluZUl0ZW1zKCk7Ci0gICAgYXV0byBsaW5l
QnVpbGRlciA9IExpbmVCdWlsZGVyIHsgKnRoaXMsIGlubGluZUl0ZW1zIH07Ci0gICAgYXV0byBs
YXlvdXRSYW5nZSA9IExpbmVCdWlsZGVyOjpJbmxpbmVJdGVtUmFuZ2UgeyAwICwgaW5saW5lSXRl
bXMuc2l6ZSgpIH07Ci0gICAgYXV0byBtYXhpbXVtTGluZVdpZHRoID0gSW5saW5lTGF5b3V0VW5p
dCB7IH07Ci0gICAgYXV0byBtYXhpbXVtRmxvYXRXaWR0aCA9IExheW91dFVuaXQgeyB9OwotICAg
IHdoaWxlICghbGF5b3V0UmFuZ2UuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGF1dG8gaW50cmluc2lj
Q29udGVudCA9IGxpbmVCdWlsZGVyLmNvbXB1dGVkSW50cmluc2ljV2lkdGgobGF5b3V0UmFuZ2Us
IGF2YWlsYWJsZVdpZHRoKTsKLSAgICAgICAgbGF5b3V0UmFuZ2Uuc3RhcnQgPSBpbnRyaW5zaWND
b250ZW50LmlubGluZUl0ZW1SYW5nZS5lbmQ7Ci0gICAgICAgIG1heGltdW1MaW5lV2lkdGggPSBz
dGQ6Om1heChtYXhpbXVtTGluZVdpZHRoLCBpbnRyaW5zaWNDb250ZW50LmxvZ2ljYWxXaWR0aCk7
Ci0gICAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3IgY2xlYXIuCi0gICAgICAgIGZvciAo
YXV0byogZmxvYXRCb3ggOiBpbnRyaW5zaWNDb250ZW50LmZsb2F0cykKLSAgICAgICAgICAgIG1h
eGltdW1GbG9hdFdpZHRoICs9IGdlb21ldHJ5Rm9yQm94KCpmbG9hdEJveCkubWFyZ2luQm94V2lk
dGgoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1heGltdW1MaW5lV2lkdGggKyBtYXhpbXVtRmxvYXRX
aWR0aDsKLX0KLQotdm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUludHJpbnNp
Y1dpZHRoRm9yRm9ybWF0dGluZ1Jvb3QoY29uc3QgQm94JiBmb3JtYXR0aW5nUm9vdCkKLXsKLSAg
ICBBU1NFUlQoZm9ybWF0dGluZ1Jvb3QuZXN0YWJsaXNoZXNGb3JtYXR0aW5nQ29udGV4dCgpKTsK
LSAgICBhdXRvIGNvbnN0cmFpbnRzID0gSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyB7IH07Ci0g
ICAgaWYgKGF1dG8gZml4ZWRXaWR0aCA9IGdlb21ldHJ5KCkuZml4ZWRWYWx1ZShmb3JtYXR0aW5n
Um9vdC5zdHlsZSgpLmxvZ2ljYWxXaWR0aCgpKSkKLSAgICAgICAgY29uc3RyYWludHMgPSB7ICpm
aXhlZFdpZHRoLCAqZml4ZWRXaWR0aCB9OwotICAgIGVsc2UgewotICAgICAgICBhdXRvIGhhc0lu
Zmxvd09yRmxvYXRpbmdDb250ZW50ID0gaXM8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nUm9vdCkg
JiYgZG93bmNhc3Q8Q29udGFpbmVyQm94Pihmb3JtYXR0aW5nUm9vdCkuaGFzSW5GbG93T3JGbG9h
dGluZ0NoaWxkKCk7Ci0gICAgICAgIC8vIFRoZSBpbnRyaW5zaWMgc2l6ZXMgb2YgdGhlIHNpemUg
Y29udGFpbm1lbnQgYm94IGFyZSBkZXRlcm1pbmVkIGFzIGlmIHRoZSBlbGVtZW50IGhhZCBubyBj
b250ZW50LgotICAgICAgICBhdXRvIHNob3VsZElnbm9yZUNoaWxkQ29udGVudCA9IGZvcm1hdHRp
bmdSb290LmlzU2l6ZUNvbnRhaW5tZW50Qm94KCk7Ci0gICAgICAgIGlmIChoYXNJbmZsb3dPckZs
b2F0aW5nQ29udGVudCAmJiAhc2hvdWxkSWdub3JlQ2hpbGRDb250ZW50KQotICAgICAgICAgICAg
Y29uc3RyYWludHMgPSBMYXlvdXRDb250ZXh0OjpjcmVhdGVGb3JtYXR0aW5nQ29udGV4dChkb3du
Y2FzdDxDb250YWluZXJCb3g+KGZvcm1hdHRpbmdSb290KSwgbGF5b3V0U3RhdGUoKSktPmNvbXB1
dGVkSW50cmluc2ljV2lkdGhDb25zdHJhaW50cygpOwotICAgIH0KLSAgICBjb25zdHJhaW50cyA9
IGdlb21ldHJ5KCkuY29uc3RyYWluQnlNaW5NYXhXaWR0aChmb3JtYXR0aW5nUm9vdCwgY29uc3Ry
YWludHMpOwotICAgIGNvbnN0cmFpbnRzLmV4cGFuZChnZW9tZXRyeUZvckJveChmb3JtYXR0aW5n
Um9vdCkuaG9yaXpvbnRhbE1hcmdpbkJvcmRlckFuZFBhZGRpbmcoKSk7Ci0gICAgZm9ybWF0dGlu
Z1N0YXRlKCkuc2V0SW50cmluc2ljV2lkdGhDb25zdHJhaW50c0ZvckJveChmb3JtYXR0aW5nUm9v
dCwgY29uc3RyYWludHMpOwotfQotCi12b2lkIElubGluZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21w
dXRlSG9yaXpvbnRhbE1hcmdpbihjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCi17Ci0gICAgYXV0byBjb21wdXRl
ZEhvcml6b250YWxNYXJnaW4gPSBnZW9tZXRyeSgpLmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihs
YXlvdXRCb3gsIGhvcml6b250YWxDb25zdHJhaW50cyk7Ci0gICAgZm9ybWF0dGluZ1N0YXRlKCku
Ym94R2VvbWV0cnkobGF5b3V0Qm94KS5zZXRIb3Jpem9udGFsTWFyZ2luKHsgY29tcHV0ZWRIb3Jp
em9udGFsTWFyZ2luLnN0YXJ0LnZhbHVlT3IoMCksIGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5l
bmQudmFsdWVPcigwKSB9KTsKLX0KLQotdm9pZCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29t
cHV0ZVdpZHRoQW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBIb3Jpem9udGFs
Q29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cykKLXsKLSAgICBhdXRvIGNvbXB1dGUg
PSBbJl0oT3B0aW9uYWw8TGF5b3V0VW5pdD4gdXNlZFdpZHRoKSB7Ci0gICAgICAgIGlmIChsYXlv
dXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBnZW9tZXRy
eSgpLmZsb2F0aW5nQ29udGVudFdpZHRoQW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENv
bnN0cmFpbnRzLCB7IHVzZWRXaWR0aCwgeyB9IH0pOwotICAgICAgICBpZiAobGF5b3V0Qm94Lmlz
SW5saW5lQmxvY2tCb3goKSkKLSAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZUJs
b2NrQ29udGVudFdpZHRoQW5kTWFyZ2luKGxheW91dEJveCwgaG9yaXpvbnRhbENvbnN0cmFpbnRz
LCB7IHVzZWRXaWR0aCwgeyB9IH0pOwotICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFjZWRC
b3goKSkKLSAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZVJlcGxhY2VkQ29udGVu
dFdpZHRoQW5kTWFyZ2luKGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLCBob3Jpem9u
dGFsQ29uc3RyYWludHMsIHsgfSwgeyB1c2VkV2lkdGgsIHsgfSB9KTsKLSAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBDb250ZW50V2lkdGhBbmRNYXJnaW4geyB9
OwotICAgIH07Ci0KLSAgICBhdXRvIGNvbnRlbnRXaWR0aEFuZE1hcmdpbiA9IGNvbXB1dGUoeyB9
KTsKLQotICAgIGF1dG8gYXZhaWxhYmxlV2lkdGggPSBob3Jpem9udGFsQ29uc3RyYWludHMubG9n
aWNhbFdpZHRoOwotICAgIGlmIChhdXRvIG1heFdpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1h
eFdpZHRoKGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpKSB7Ci0gICAgICAgIGF1dG8gbWF4V2lk
dGhBbmRNYXJnaW4gPSBjb21wdXRlKG1heFdpZHRoKTsKLSAgICAgICAgaWYgKGNvbnRlbnRXaWR0
aEFuZE1hcmdpbi5jb250ZW50V2lkdGggPiBtYXhXaWR0aEFuZE1hcmdpbi5jb250ZW50V2lkdGgp
Ci0gICAgICAgICAgICBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBtYXhXaWR0aEFuZE1hcmdpbjsK
LSAgICB9Ci0KLSAgICBhdXRvIG1pbldpZHRoID0gZ2VvbWV0cnkoKS5jb21wdXRlZE1pbldpZHRo
KGxheW91dEJveCwgYXZhaWxhYmxlV2lkdGgpLnZhbHVlT3IoMCk7Ci0gICAgYXV0byBtaW5XaWR0
aEFuZE1hcmdpbiA9IGNvbXB1dGUobWluV2lkdGgpOwotICAgIGlmIChjb250ZW50V2lkdGhBbmRN
YXJnaW4uY29udGVudFdpZHRoIDwgbWluV2lkdGhBbmRNYXJnaW4uY29udGVudFdpZHRoKQotICAg
ICAgICBjb250ZW50V2lkdGhBbmRNYXJnaW4gPSBtaW5XaWR0aEFuZE1hcmdpbjsKLQotICAgIGF1
dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94
KTsKLSAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudFdpZHRoQW5kTWFy
Z2luLmNvbnRlbnRXaWR0aCk7Ci0gICAgYm94R2VvbWV0cnkuc2V0SG9yaXpvbnRhbE1hcmdpbih7
IGNvbnRlbnRXaWR0aEFuZE1hcmdpbi51c2VkTWFyZ2luLnN0YXJ0LCBjb250ZW50V2lkdGhBbmRN
YXJnaW4udXNlZE1hcmdpbi5lbmQgfSk7Ci19Ci0KLXZvaWQgSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQ6OmNvbXB1dGVIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEhv
cml6b250YWxDb25zdHJhaW50cyYgaG9yaXpvbnRhbENvbnN0cmFpbnRzKQotewotICAgIGF1dG8g
Y29tcHV0ZSA9IFsmXShPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkSGVpZ2h0KSB7Ci0gICAgICAg
IGlmIChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgIHJldHVy
biBnZW9tZXRyeSgpLmZsb2F0aW5nQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGhv
cml6b250YWxDb25zdHJhaW50cywgeyB1c2VkSGVpZ2h0IH0pOwotICAgICAgICBpZiAobGF5b3V0
Qm94LmlzSW5saW5lQmxvY2tCb3goKSkKLSAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlu
bGluZUJsb2NrQ29udGVudEhlaWdodEFuZE1hcmdpbihsYXlvdXRCb3gsIGhvcml6b250YWxDb25z
dHJhaW50cywgeyB1c2VkSGVpZ2h0IH0pOwotICAgICAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFj
ZWRCb3goKSkKLSAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeSgpLmlubGluZVJlcGxhY2VkQ29u
dGVudEhlaWdodEFuZE1hcmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9y
aXpvbnRhbENvbnN0cmFpbnRzLCB7IH0sIHsgdXNlZEhlaWdodCB9KTsKLSAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBDb250ZW50SGVpZ2h0QW5kTWFyZ2luIHsg
fTsKLSAgICB9OwotCi0gICAgYXV0byBjb250ZW50SGVpZ2h0QW5kTWFyZ2luID0gY29tcHV0ZSh7
IH0pOwotICAgIGlmIChhdXRvIG1heEhlaWdodCA9IGdlb21ldHJ5KCkuY29tcHV0ZWRNYXhIZWln
aHQobGF5b3V0Qm94KSkgewotICAgICAgICBhdXRvIG1heEhlaWdodEFuZE1hcmdpbiA9IGNvbXB1
dGUobWF4SGVpZ2h0KTsKLSAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4uY29udGVu
dEhlaWdodCA+IG1heEhlaWdodEFuZE1hcmdpbi5jb250ZW50SGVpZ2h0KQotICAgICAgICAgICAg
Y29udGVudEhlaWdodEFuZE1hcmdpbiA9IG1heEhlaWdodEFuZE1hcmdpbjsKLSAgICB9Ci0KLSAg
ICBpZiAoYXV0byBtaW5IZWlnaHQgPSBnZW9tZXRyeSgpLmNvbXB1dGVkTWluSGVpZ2h0KGxheW91
dEJveCkpIHsKLSAgICAgICAgYXV0byBtaW5IZWlnaHRBbmRNYXJnaW4gPSBjb21wdXRlKG1pbkhl
aWdodCk7Ci0gICAgICAgIGlmIChjb250ZW50SGVpZ2h0QW5kTWFyZ2luLmNvbnRlbnRIZWlnaHQg
PCBtaW5IZWlnaHRBbmRNYXJnaW4uY29udGVudEhlaWdodCkKLSAgICAgICAgICAgIGNvbnRlbnRI
ZWlnaHRBbmRNYXJnaW4gPSBtaW5IZWlnaHRBbmRNYXJnaW47Ci0gICAgfQotICAgIGF1dG8mIGJv
eEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlKCkuYm94R2VvbWV0cnkobGF5b3V0Qm94KTsKLSAg
ICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94SGVpZ2h0KGNvbnRlbnRIZWlnaHRBbmRNYXJnaW4u
Y29udGVudEhlaWdodCk7Ci0gICAgYm94R2VvbWV0cnkuc2V0VmVydGljYWxNYXJnaW4oeyBjb250
ZW50SGVpZ2h0QW5kTWFyZ2luLm5vbkNvbGxhcHNlZE1hcmdpbi5iZWZvcmUsIGNvbnRlbnRIZWln
aHRBbmRNYXJnaW4ubm9uQ29sbGFwc2VkTWFyZ2luLmFmdGVyIH0pOwotfQotCi12b2lkIElubGlu
ZUZvcm1hdHRpbmdDb250ZXh0Ojpjb2xsZWN0SW5saW5lQ29udGVudElmTmVlZGVkKCkKLXsKLSAg
ICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSB0aGlzLT5mb3JtYXR0aW5nU3RhdGUoKTsKLSAgICBp
ZiAoIWZvcm1hdHRpbmdTdGF0ZS5pbmxpbmVJdGVtcygpLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0
dXJuOwotICAgIC8vIFRyYXZlcnNlIHRoZSB0cmVlIGFuZCBjcmVhdGUgaW5saW5lIGl0ZW1zIG91
dCBvZiBpbmxpbmUgYm94ZXMgYW5kIGxlYWYgbm9kZXMuIFRoaXMgZXNzZW50aWFsbHkgdHVybnMg
dGhlIHRyZWUgaW5saW5lIHN0cnVjdHVyZSBpbnRvIGEgZmxhdCBvbmUuCi0gICAgLy8gPHNwYW4+
dGV4dDxzcGFuPjwvc3Bhbj48aW1nPjwvc3Bhbj4gLT4gW0lubGluZUJveFN0YXJ0XVtJbmxpbmVM
ZXZlbEJveF1bSW5saW5lQm94U3RhcnRdW0lubGluZUJveEVuZF1bSW5saW5lTGV2ZWxCb3hdW0lu
bGluZUJveEVuZF0KLSAgICBBU1NFUlQocm9vdCgpLmhhc0luRmxvd09yRmxvYXRpbmdDaGlsZCgp
KTsKLSAgICBMYXlvdXRRdWV1ZSBsYXlvdXRRdWV1ZTsKLSAgICBsYXlvdXRRdWV1ZS5hcHBlbmQo
cm9vdCgpLmZpcnN0SW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpOwotICAgIHdoaWxlICghbGF5b3V0
UXVldWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBh
dXRvJiBsYXlvdXRCb3ggPSAqbGF5b3V0UXVldWUubGFzdCgpOwotICAgICAgICAgICAgYXV0byBp
c0JveFdpdGhJbmxpbmVDb250ZW50ID0gbGF5b3V0Qm94LmlzSW5saW5lQm94KCkgJiYgIWxheW91
dEJveC5pc0lubGluZVRleHRCb3goKSAmJiAhbGF5b3V0Qm94LmlzTGluZUJyZWFrQm94KCk7Ci0g
ICAgICAgICAgICBpZiAoIWlzQm94V2l0aElubGluZUNvbnRlbnQpCi0gICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzdGFydCBvZiBhbiBpbmxpbmUgYm94
IChlLmcuIDxzcGFuPikuCi0gICAgICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkSW5saW5lSXRl
bSh7IGxheW91dEJveCwgSW5saW5lSXRlbTo6VHlwZTo6SW5saW5lQm94U3RhcnQgfSk7Ci0gICAg
ICAgICAgICBhdXRvJiBpbmxpbmVCb3hXaXRoSW5saW5lQ29udGVudCA9IGRvd25jYXN0PENvbnRh
aW5lckJveD4obGF5b3V0Qm94KTsKLSAgICAgICAgICAgIGlmICghaW5saW5lQm94V2l0aElubGlu
ZUNvbnRlbnQuaGFzSW5GbG93T3JGbG9hdGluZ0NoaWxkKCkpCi0gICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICBsYXlvdXRRdWV1ZS5hcHBlbmQoaW5saW5lQm94V2l0aElubGluZUNv
bnRlbnQuZmlyc3RJbkZsb3dPckZsb2F0aW5nQ2hpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAg
ICB3aGlsZSAoIWxheW91dFF1ZXVlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYXV0byYgbGF5
b3V0Qm94ID0gKmxheW91dFF1ZXVlLnRha2VMYXN0KCk7Ci0gICAgICAgICAgICBpZiAoaXM8TGlu
ZUJyZWFrQm94PihsYXlvdXRCb3gpKSB7Ci0gICAgICAgICAgICAgICAgYXV0byYgbGluZUJyZWFr
Qm94ID0gZG93bmNhc3Q8TGluZUJyZWFrQm94PihsYXlvdXRCb3gpOwotICAgICAgICAgICAgICAg
IGZvcm1hdHRpbmdTdGF0ZS5hZGRJbmxpbmVJdGVtKHsgbGF5b3V0Qm94LCBsaW5lQnJlYWtCb3gu
aXNPcHRpb25hbCgpID8gSW5saW5lSXRlbTo6VHlwZTo6V29yZEJyZWFrT3Bwb3J0dW5pdHkgOiBJ
bmxpbmVJdGVtOjpUeXBlOjpIYXJkTGluZUJyZWFrIH0pOwotICAgICAgICAgICAgfSBlbHNlIGlm
IChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgICAgICBmb3Jt
YXR0aW5nU3RhdGUuYWRkSW5saW5lSXRlbSh7IGxheW91dEJveCwgSW5saW5lSXRlbTo6VHlwZTo6
RmxvYXQgfSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChsYXlvdXRCb3guaXNBdG9taWNJbmxpbmVM
ZXZlbEJveCgpKQotICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRJbmxpbmVJdGVt
KHsgbGF5b3V0Qm94LCBJbmxpbmVJdGVtOjpUeXBlOjpCb3ggfSk7Ci0gICAgICAgICAgICBlbHNl
IGlmIChsYXlvdXRCb3guaXNJbmxpbmVUZXh0Qm94KCkpIHsKLSAgICAgICAgICAgICAgICBJbmxp
bmVUZXh0SXRlbTo6Y3JlYXRlQW5kQXBwZW5kVGV4dEl0ZW1zKGZvcm1hdHRpbmdTdGF0ZS5pbmxp
bmVJdGVtcygpLCBkb3duY2FzdDxJbmxpbmVUZXh0Qm94PihsYXlvdXRCb3gpKTsKLSAgICAgICAg
ICAgIH0gZWxzZSBpZiAobGF5b3V0Qm94LmlzSW5saW5lQm94KCkpCi0gICAgICAgICAgICAgICAg
Zm9ybWF0dGluZ1N0YXRlLmFkZElubGluZUl0ZW0oeyBsYXlvdXRCb3gsIElubGluZUl0ZW06OlR5
cGU6OklubGluZUJveEVuZCB9KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKLQotICAgICAgICAgICAgaWYgKGF1dG8qIG5leHRTaWJsaW5n
ID0gbGF5b3V0Qm94Lm5leHRJbkZsb3dPckZsb2F0aW5nU2libGluZygpKSB7Ci0gICAgICAgICAg
ICAgICAgbGF5b3V0UXVldWUuYXBwZW5kKG5leHRTaWJsaW5nKTsKLSAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotSW5saW5lUmVjdCBJ
bmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUdlb21ldHJ5Rm9yTGluZUNvbnRlbnQoY29u
c3QgTGluZUJ1aWxkZXI6OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCwgY29uc3QgSG9yaXpvbnRh
bENvbnN0cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMpCi17Ci0gICAgYXV0byYgZm9ybWF0
dGluZ1N0YXRlID0gdGhpcy0+Zm9ybWF0dGluZ1N0YXRlKCk7Ci0gICAgYXV0byBnZW9tZXRyeSA9
IHRoaXMtPmdlb21ldHJ5KCk7Ci0KLSAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGluZUJveChnZW9t
ZXRyeS5saW5lQm94Rm9yTGluZUNvbnRlbnQobGluZUNvbnRlbnQpKTsKLSAgICBjb25zdCBhdXRv
JiBsaW5lQm94ID0gZm9ybWF0dGluZ1N0YXRlLmxpbmVCb3hlcygpLmxhc3QoKTsKLSAgICBhdXRv
IGxpbmVJbmRleCA9IGZvcm1hdHRpbmdTdGF0ZS5saW5lcygpLnNpemUoKTsKLSAgICBhdXRvJiBs
aW5lQm94TG9naWNhbFJlY3QgPSBsaW5lQm94LmxvZ2ljYWxSZWN0KCk7Ci0gICAgaWYgKCFsaW5l
Qm94Lmhhc0NvbnRlbnQoKSkgewotICAgICAgICAvLyBGYXN0IHBhdGggZm9yIGxpbmVzIHdpdGgg
bm8gY29udGVudCBlLmcuIDxkaXY+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2Rpdj4gb3Ig
PHNwYW4+PGRpdj48L2Rpdj48L3NwYW4+IHdoZXJlIHdlIGNvbnN0cnVjdCBlbXB0eSBwcmUgYW5k
IHBvc3QgYmxvY2tzLgotICAgICAgICBBU1NFUlQoIWxpbmVCb3guY29udGVudExvZ2ljYWxXaWR0
aCgpICYmICFsaW5lQm94TG9naWNhbFJlY3QuaGVpZ2h0KCkpOwotICAgICAgICBhdXRvIHVwZGF0
ZUlubGluZUJveGVzR2VvbWV0cnlJZkFwcGxpY2FibGUgPSBbJl0gewotICAgICAgICAgICAgaWYg
KCFsaW5lQm94Lmhhc0lubGluZUJveCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgICAgIFZlY3Rvcjxjb25zdCBCb3gqPiBsYXlvdXRCb3hMaXN0OwotICAgICAgICAgICAgLy8g
Q29sbGVjdCB0aGUgZW1wdHkgaW5saW5lIGJveGVzIHRoYXQgc2hvd2VkIHVwIGZpcnN0IG9uIHRo
aXMgbGluZS4KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBhbiBpbmxpbmUgYm94IGVuZCBvbiBh
biBlbXB0eSBsaW5lIGRvZXMgbm90IG1ha2UgdGhlIGlubGluZSBib3ggdGFsbGVyLgotICAgICAg
ICAgICAgLy8gKGUuZy4gPGRpdj50ZXh0PHNwYW4+PGJyPjwvc3Bhbj48L2Rpdj4pIDwtIHRoZSA8
c3Bhbj4gaW5saW5lIGJveCBpcyBhcyB0YWxsIGFzIHRoZSBsaW5lIGV2ZW4gdGhvdWdoIHRoZSA8
L3NwYW4+IGlzIGFmdGVyIGEgPGJyPiBzbyB0ZWNobmljYWxseSBpcyBvbiB0aGUgZm9sbG93aW5n
IChlbXB0eSlsaW5lLgotICAgICAgICAgICAgZm9yIChhdXRvJiBsaW5lUnVuIDogbGluZUNvbnRl
bnQucnVucykgewotICAgICAgICAgICAgICAgIGlmIChsaW5lUnVuLmlzSW5saW5lQm94U3RhcnQo
KSkKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0Qm94TGlzdC5hcHBlbmQoJmxpbmVSdW4ubGF5
b3V0Qm94KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChhdXRvKiBsYXlvdXRC
b3ggOiBsYXlvdXRCb3hMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkg
PSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnkoKmxheW91dEJveCk7Ci0gICAgICAgICAgICAg
ICAgYXV0byBpbmxpbmVCb3hMb2dpY2FsSGVpZ2h0ID0gTGF5b3V0VW5pdDo6ZnJvbUZsb2F0Q2Vp
bChsaW5lQm94LmxvZ2ljYWxCb3JkZXJCb3hGb3JJbmxpbmVCb3goKmxheW91dEJveCwgYm94R2Vv
bWV0cnkpLmhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50
Qm94SGVpZ2h0KGlubGluZUJveExvZ2ljYWxIZWlnaHQpOwotICAgICAgICAgICAgICAgIGJveEdl
b21ldHJ5LnNldENvbnRlbnRCb3hXaWR0aCh7IH0pOwotICAgICAgICAgICAgICAgIGJveEdlb21l
dHJ5LnNldExvZ2ljYWxUb3BMZWZ0KHRvTGF5b3V0UG9pbnQobGluZUJveExvZ2ljYWxSZWN0LnRv
cExlZnQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB1cGRhdGVJbmxp
bmVCb3hlc0dlb21ldHJ5SWZBcHBsaWNhYmxlKCk7Ci0gICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5h
ZGRMaW5lKHsgbGluZUJveExvZ2ljYWxSZWN0LCB7IHsgfSwgeyB9IH0sIHsgfSwgeyB9LCB7IH0g
fSk7Ci0gICAgICAgIHJldHVybiBsaW5lQm94TG9naWNhbFJlY3Q7Ci0gICAgfQotCi0gICAgYXV0
byByb290SW5saW5lQm94TG9naWNhbFJlY3QgPSBsaW5lQm94LmxvZ2ljYWxSZWN0Rm9yUm9vdElu
bGluZUJveCgpOwotICAgIGF1dG8gZW5jbG9zaW5nVG9wQW5kQm90dG9tID0gSW5saW5lTGluZUdl
b21ldHJ5OjpFbmNsb3NpbmdUb3BBbmRCb3R0b20geyByb290SW5saW5lQm94TG9naWNhbFJlY3Qu
dG9wKCksIHJvb3RJbmxpbmVCb3hMb2dpY2FsUmVjdC5ib3R0b20oKSB9OwotICAgIEhhc2hTZXQ8
Y29uc3QgQm94Kj4gaW5saW5lQm94U3RhcnRTZXQ7Ci0gICAgSGFzaFNldDxjb25zdCBCb3gqPiBp
bmxpbmVCb3hFbmRTZXQ7Ci0KLSAgICBhdXRvIGNvbnN0cnVjdExpbmVSdW5zQW5kVXBkYXRlQm94
R2VvbWV0cnkgPSBbJl0gewotICAgICAgICAvLyBDcmVhdGUgdGhlIGlubGluZSBydW5zIG9uIHRo
ZSBjdXJyZW50IGxpbmUuIFRoaXMgaXMgbW9zdGx5IHRleHQgYW5kIGF0b21pYyBpbmxpbmUgcnVu
cy4KLSAgICAgICAgZm9yIChhdXRvJiBsaW5lUnVuIDogbGluZUNvbnRlbnQucnVucykgewotICAg
ICAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBub3QgbmVlZCB0byBjb25zdHJ1Y3QgYSBsaW5l
IHJ1biBmb3IgPGJyPi4KLSAgICAgICAgICAgIGF1dG8mIGxheW91dEJveCA9IGxpbmVSdW4ubGF5
b3V0Qm94KCk7Ci0gICAgICAgICAgICBpZiAobGluZVJ1bi5pc1RleHQoKSkgewotICAgICAgICAg
ICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gs
IGxpbmVCb3gubG9naWNhbFJlY3RGb3JUZXh0UnVuKGxpbmVSdW4pLCBsaW5lUnVuLmV4cGFuc2lv
bigpLCBsaW5lUnVuLnRleHRDb250ZW50KCkgfSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGluZVJ1bi5pc0xpbmVCcmVhaygpKSB7
Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dEJveC5pc0xpbmVCcmVha0JveCgpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIC8vIE9ubHkgaGFyZCBsaW5lYnJlYWtzIGhhdmUgYXNzb2NpYXRlZCBs
YXlvdXQgYm94ZXMuCi0gICAgICAgICAgICAgICAgICAgIGF1dG8gbGluZUJyZWFrQm94UmVjdCA9
IGxpbmVCb3gubG9naWNhbFJlY3RGb3JMaW5lQnJlYWtCb3gobGF5b3V0Qm94KTsKLSAgICAgICAg
ICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBsaW5lSW5kZXgsIGxheW91
dEJveCwgbGluZUJyZWFrQm94UmVjdCwgbGluZVJ1bi5leHBhbnNpb24oKSwgeyB9IH0pOwotCi0g
ICAgICAgICAgICAgICAgICAgIGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJv
eEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVCcmVha0JveFJl
Y3QubW92ZUJ5KGxpbmVCb3hMb2dpY2FsUmVjdC50b3BMZWZ0KCkpOwotICAgICAgICAgICAgICAg
ICAgICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsVG9wTGVmdCh0b0xheW91dFBvaW50KGxpbmVCcmVh
a0JveFJlY3QudG9wTGVmdCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJveEdlb21ldHJ5LnNl
dENvbnRlbnRCb3hIZWlnaHQodG9MYXlvdXRVbml0KGxpbmVCcmVha0JveFJlY3QuaGVpZ2h0KCkp
KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdHRp
bmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUluZGV4LCBsYXlvdXRCb3gsIGxpbmVCb3gubG9naWNh
bFJlY3RGb3JUZXh0UnVuKGxpbmVSdW4pLCBsaW5lUnVuLmV4cGFuc2lvbigpLCBsaW5lUnVuLnRl
eHRDb250ZW50KCkgfSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBpZiAobGluZVJ1bi5pc0JveCgpKSB7Ci0gICAgICAgICAgICAgICAgQVNT
RVJUKGxheW91dEJveC5pc0F0b21pY0lubGluZUxldmVsQm94KCkpOwotICAgICAgICAgICAgICAg
IGF1dG8mIGJveEdlb21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJv
eCk7Ci0gICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsQm9yZGVyQm94ID0gbGluZUJveC5sb2dp
Y2FsQm9yZGVyQm94Rm9yQXRvbWljSW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94LCBib3hHZW9tZXRy
eSk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGluZ1N0YXRlLmFkZExpbmVSdW4oeyBsaW5lSW5k
ZXgsIGxheW91dEJveCwgbG9naWNhbEJvcmRlckJveCwgbGluZVJ1bi5leHBhbnNpb24oKSwgeyB9
IH0pOwotCi0gICAgICAgICAgICAgICAgYXV0byBib3JkZXJCb3hMb2dpY2FsVG9wTGVmdCA9IGxv
Z2ljYWxCb3JkZXJCb3gudG9wTGVmdCgpOwotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBp
bmxpbmUgYm94ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBsaW5lIGFuZCB0aGVpciB0b3AgcG9zaXRp
b24gY2FuIGJlIG5lZ2F0aXZlLgotICAgICAgICAgICAgICAgIGJvcmRlckJveExvZ2ljYWxUb3BM
ZWZ0Lm1vdmVCeShsaW5lQm94TG9naWNhbFJlY3QudG9wTGVmdCgpKTsKLSAgICAgICAgICAgICAg
ICBpZiAobGF5b3V0Qm94LmlzSW5GbG93UG9zaXRpb25lZCgpKQotICAgICAgICAgICAgICAgICAg
ICBib3JkZXJCb3hMb2dpY2FsVG9wTGVmdCArPSBnZW9tZXRyeS5pbkZsb3dQb3NpdGlvbmVkUG9z
aXRpb25PZmZzZXQobGF5b3V0Qm94LCBob3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgICAgICAg
ICAgICAgIC8vIEF0b21pYyBpbmxpbmUgYm94ZXMgYXJlIGFsbCBzZXQuIFRoZWlyIG1hcmdpbi9i
b3JkZXIvY29udGVudCBib3ggZ2VvbWV0cmllcyBhcmUgYWxyZWFkeSBjb21wdXRlZC4gV2UganVz
dCBoYXZlIHRvIHBvc2l0aW9uIHRoZW0gaGVyZS4KLSAgICAgICAgICAgICAgICBib3hHZW9tZXRy
eS5zZXRMb2dpY2FsVG9wTGVmdCh0b0xheW91dFBvaW50KGJvcmRlckJveExvZ2ljYWxUb3BMZWZ0
KSk7Ci0KLSAgICAgICAgICAgICAgICBhdXRvIGJvcmRlckJveFRvcCA9IGJvcmRlckJveExvZ2lj
YWxUb3BMZWZ0LnkoKTsKLSAgICAgICAgICAgICAgICBhdXRvIGJvcmRlckJveEJvdHRvbSA9IGJv
cmRlckJveFRvcCArIGJveEdlb21ldHJ5LmJvcmRlckJveEhlaWdodCgpOwotICAgICAgICAgICAg
ICAgIGVuY2xvc2luZ1RvcEFuZEJvdHRvbS50b3AgPSBzdGQ6Om1pbihlbmNsb3NpbmdUb3BBbmRC
b3R0b20udG9wLCBib3JkZXJCb3hUb3ApOwotICAgICAgICAgICAgICAgIGVuY2xvc2luZ1RvcEFu
ZEJvdHRvbS5ib3R0b20gPSBzdGQ6Om1heChlbmNsb3NpbmdUb3BBbmRCb3R0b20uYm90dG9tLCBi
b3JkZXJCb3hCb3R0b20pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgaWYgKGxpbmVSdW4uaXNJbmxpbmVCb3hTdGFydCgpKSB7Ci0gICAgICAg
ICAgICAgICAgYXV0byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nU3RhdGUuYm94R2VvbWV0cnko
bGF5b3V0Qm94KTsKLSAgICAgICAgICAgICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxSZWN0ID0g
bGluZUJveC5sb2dpY2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KGxheW91dEJveCwgYm94R2VvbWV0
cnkpOwotICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdTdGF0ZS5hZGRMaW5lUnVuKHsgbGluZUlu
ZGV4LCBsYXlvdXRCb3gsIGlubGluZUJveExvZ2ljYWxSZWN0LCBsaW5lUnVuLmV4cGFuc2lvbigp
LCB7IH0gfSk7Ci0gICAgICAgICAgICAgICAgaW5saW5lQm94U3RhcnRTZXQuYWRkKCZsYXlvdXRC
b3gpOwotICAgICAgICAgICAgICAgIGVuY2xvc2luZ1RvcEFuZEJvdHRvbS50b3AgPSBzdGQ6Om1p
bihlbmNsb3NpbmdUb3BBbmRCb3R0b20udG9wLCBpbmxpbmVCb3hMb2dpY2FsUmVjdC50b3AoKSk7
Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBp
ZiAobGluZVJ1bi5pc0lubGluZUJveEVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgaW5saW5lQm94
RW5kU2V0LmFkZCgmbGF5b3V0Qm94KTsKLSAgICAgICAgICAgICAgICBpZiAoIWlubGluZUJveFN0
YXJ0U2V0LmNvbnRhaW5zKCZsYXlvdXRCb3gpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFu
IGlubGluZSBib3ggY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMuIFVzZSB0aGUgW2lubGluZSBib3gg
ZW5kXSBzaWduYWwgdG8gaW5jbHVkZSBpdCBpbiB0aGUgZW5jbG9zaW5nIGdlb21ldHJ5Ci0gICAg
ICAgICAgICAgICAgICAgIC8vIG9ubHkgd2hlbiBpdCBzdGFydHMgYXQgYSBwcmV2aW91cyBsaW5l
LgotICAgICAgICAgICAgICAgICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxSZWN0ID0gbGluZUJv
eC5sb2dpY2FsQm9yZGVyQm94Rm9ySW5saW5lQm94KGxheW91dEJveCwgZm9ybWF0dGluZ1N0YXRl
LmJveEdlb21ldHJ5KGxheW91dEJveCkpOwotICAgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdU
b3BBbmRCb3R0b20uYm90dG9tID0gc3RkOjptYXgoZW5jbG9zaW5nVG9wQW5kQm90dG9tLmJvdHRv
bSwgaW5saW5lQm94TG9naWNhbFJlY3QuYm90dG9tKCkpOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFTU0VS
VChsaW5lUnVuLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSk7Ci0gICAgICAgIH0KLSAgICB9Owot
ICAgIGNvbnN0cnVjdExpbmVSdW5zQW5kVXBkYXRlQm94R2VvbWV0cnkoKTsKLQotICAgIGF1dG8g
dXBkYXRlQm94R2VvbWV0cnlGb3JJbmxpbmVCb3hlcyA9IFsmXSB7Ci0gICAgICAgIC8vIEZJWE1F
OiBXZSBtYXkgd2FudCB0byBrZWVwIGFyb3VuZCBhbiBpbmxpbmUgYm94IG9ubHkgc2V0LgotICAg
ICAgICBpZiAoIWxpbmVCb3guaGFzSW5saW5lQm94KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIC8vIEdyYWIgdGhlIGlubGluZSBib3hlcyAoZXZlbiB0aG9zZSB0aGF0IGRvbid0IGhh
dmUgYXNzb2NpYXRlZCBsYXlvdXQgYm94ZXMgb24gdGhlIGN1cnJlbnQgbGluZSBkdWUgdG8gbGlu
ZSB3cmFwcGluZykKLSAgICAgICAgLy8gYW5kIHVwZGF0ZSB0aGVpciBnZW9tZXRyaWVzLgotICAg
ICAgICBmb3IgKGF1dG8mIGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2
ZWxCb3hlcygpKSB7Ci0gICAgICAgICAgICBpZiAoIWlubGluZUxldmVsQm94LmlzSW5saW5lQm94
KCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBhdXRvJiBsYXlvdXRC
b3ggPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKLSAgICAgICAgICAgIGF1dG8mIGJveEdl
b21ldHJ5ID0gZm9ybWF0dGluZ1N0YXRlLmJveEdlb21ldHJ5KGxheW91dEJveCk7Ci0gICAgICAg
ICAgICAvLyBJbmxpbmUgYm94ZXMgbWF5IG9yIG1heSBub3QgYmUgd3JhcHBlZCBhbmQgaGF2ZSBy
dW5zIG9uIG11bHRpcGxlIGxpbmVzIChlLmcuIDxzcGFuPmZpcnN0IGxpbmU8YnI+c2Vjb25kIGxp
bmU8YnI+dGhpcmQgbGluZTwvc3Bhbj4pCi0gICAgICAgICAgICBhdXRvIGlubGluZUJveEJvcmRl
ckJveCA9IGxpbmVCb3gubG9naWNhbEJvcmRlckJveEZvcklubGluZUJveChsYXlvdXRCb3gsIGJv
eEdlb21ldHJ5KTsKLSAgICAgICAgICAgIGF1dG8gaW5saW5lQm94U2l6ZSA9IExheW91dFNpemUg
eyBMYXlvdXRVbml0Ojpmcm9tRmxvYXRDZWlsKGlubGluZUJveEJvcmRlckJveC53aWR0aCgpKSwg
TGF5b3V0VW5pdDo6ZnJvbUZsb2F0Q2VpbChpbmxpbmVCb3hCb3JkZXJCb3guaGVpZ2h0KCkpIH07
Ci0gICAgICAgICAgICBhdXRvIGxvZ2ljYWxSZWN0ID0gUmVjdCB7IExheW91dFBvaW50IHsgaW5s
aW5lQm94Qm9yZGVyQm94LnRvcExlZnQoKSB9LCBpbmxpbmVCb3hTaXplIH07Ci0gICAgICAgICAg
ICBsb2dpY2FsUmVjdC5tb3ZlQnkoTGF5b3V0UG9pbnQgeyBsaW5lQm94TG9naWNhbFJlY3QudG9w
TGVmdCgpIH0pOwotICAgICAgICAgICAgaWYgKGlubGluZUJveFN0YXJ0U2V0LmNvbnRhaW5zKCZs
YXlvdXRCb3gpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpbmxpbmUgYm94IHNob3dlZCB1
cCBmaXJzdCBvbiB0aGlzIGxpbmUuCi0gICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0TG9n
aWNhbFRvcExlZnQobG9naWNhbFJlY3QudG9wTGVmdCgpKTsKLSAgICAgICAgICAgICAgICBhdXRv
IGNvbnRlbnRCb3hIZWlnaHQgPSBsb2dpY2FsUmVjdC5oZWlnaHQoKSAtIChib3hHZW9tZXRyeS52
ZXJ0aWNhbEJvcmRlcigpICsgYm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigw
X2x1KSk7Ci0gICAgICAgICAgICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveEhlaWdodChj
b250ZW50Qm94SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBhdXRvIGNvbnRlbnRCb3hXaWR0aCA9
IGxvZ2ljYWxSZWN0LndpZHRoKCkgLSAoYm94R2VvbWV0cnkuaG9yaXpvbnRhbEJvcmRlcigpICsg
Ym94R2VvbWV0cnkuaG9yaXpvbnRhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpKTsKLSAgICAgICAg
ICAgICAgICBib3hHZW9tZXRyeS5zZXRDb250ZW50Qm94V2lkdGgoY29udGVudEJveFdpZHRoKTsK
LSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8v
IE1pZGRsZSBvciBlbmQgb2YgdGhlIGlubGluZSBib3guIExldCdzIHN0cmV0Y2ggdGhlIGJveCBh
cyBuZWVkZWQuCi0gICAgICAgICAgICBhdXRvIGVuY2xvc2luZ0JvcmRlckJveFJlY3QgPSBCb3hH
ZW9tZXRyeTo6Ym9yZGVyQm94UmVjdChib3hHZW9tZXRyeSk7Ci0gICAgICAgICAgICBlbmNsb3Np
bmdCb3JkZXJCb3hSZWN0LmV4cGFuZFRvQ29udGFpbihsb2dpY2FsUmVjdCk7Ci0gICAgICAgICAg
ICBib3hHZW9tZXRyeS5zZXRMb2dpY2FsTGVmdChlbmNsb3NpbmdCb3JkZXJCb3hSZWN0LmxlZnQo
KSk7Ci0KLSAgICAgICAgICAgIGJveEdlb21ldHJ5LnNldENvbnRlbnRCb3hIZWlnaHQoZW5jbG9z
aW5nQm9yZGVyQm94UmVjdC5oZWlnaHQoKSAtIChib3hHZW9tZXRyeS52ZXJ0aWNhbEJvcmRlcigp
ICsgYm94R2VvbWV0cnkudmVydGljYWxQYWRkaW5nKCkudmFsdWVPcigwX2x1KSkpOwotICAgICAg
ICAgICAgYm94R2VvbWV0cnkuc2V0Q29udGVudEJveFdpZHRoKGVuY2xvc2luZ0JvcmRlckJveFJl
Y3Qud2lkdGgoKSAtIChib3hHZW9tZXRyeS5ob3Jpem9udGFsQm9yZGVyKCkgKyBib3hHZW9tZXRy
eS5ob3Jpem9udGFsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpKTsKLSAgICAgICAgfQotICAgIH07
Ci0gICAgdXBkYXRlQm94R2VvbWV0cnlGb3JJbmxpbmVCb3hlcygpOwotCi0gICAgYXV0byBjb25z
dHJ1Y3RMaW5lR2VvbWV0cnkgPSBbJl0gewotICAgICAgICBmb3JtYXR0aW5nU3RhdGUuYWRkTGlu
ZSh7IGxpbmVCb3hMb2dpY2FsUmVjdCwgZW5jbG9zaW5nVG9wQW5kQm90dG9tLCBsaW5lQm94LmFs
aWdubWVudEJhc2VsaW5lKCksIHJvb3RJbmxpbmVCb3hMb2dpY2FsUmVjdC5sZWZ0KCksIGxpbmVD
b250ZW50LmNvbnRlbnRMb2dpY2FsV2lkdGggfSk7Ci0gICAgfTsKLSAgICBjb25zdHJ1Y3RMaW5l
R2VvbWV0cnkoKTsKLQotICAgIHJldHVybiBsaW5lQm94TG9naWNhbFJlY3Q7Ci19Ci0KLXZvaWQg
SW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OmludmFsaWRhdGVGb3JtYXR0aW5nU3RhdGUoY29uc3Qg
SW52YWxpZGF0aW9uU3RhdGUmKQotewotICAgIC8vIEZpbmQgb3V0IHdoYXQgd2UgbmVlZCB0byBp
bnZhbGlkYXRlLiBUaGlzIGlzIHdoZXJlIHdlIGFkZCBzb21lIHNtYXJ0cyB0byBkbyBwYXJ0aWFs
IGxpbmUgbGF5b3V0LgotICAgIC8vIEZvciBub3cgbGV0J3MganVzdCBjbGVhciB0aGUgcnVucy4K
LSAgICBmb3JtYXR0aW5nU3RhdGUoKS5jbGVhckxpbmVBbmRSdW5zKCk7Ci0gICAgLy8gRklYTUU6
IFRoaXMgaXMgYWxzbyB3aGVyZSB3ZSB3b3VsZCBkZWxldGUgaW5saW5lIGl0ZW1zIGlmIHRoZWly
IGNvbnRlbnQgY2hhbmdlZC4KLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVGb3JtYXR0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmgKZGVsZXRl
ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkN2VjOTcyMzdjMWU4OGQ3ODg2MDI2N2ExODA3ZTIw
NDhhZjQzMmUuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5n
L0lubGluZUZvcm1hdHRpbmdDb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBA
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
SU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUg
IklubGluZUxpbmVCdWlsZGVyLmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgotCi1uYW1l
c3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgSW5saW5lRm9ybWF0
dGluZ1N0YXRlOwotY2xhc3MgSW52YWxpZGF0aW9uU3RhdGU7Ci1jbGFzcyBMaW5lQm94OwotCi0v
LyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGxheW91dCBsb2dpYyBmb3IgaW5saW5lIGZvcm1h
dHRpbmcgY29udGV4dHMuCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvQ1NTMjIvdmlzdXJlbi5o
dG1sI2lubGluZS1mb3JtYXR0aW5nCi1jbGFzcyBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCBmaW5h
bCA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dCB7Ci0gICAgV1RGX01BS0VfSVNPX0FMTE9DQVRF
RChJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCk7Ci1wdWJsaWM6Ci0gICAgSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQoY29uc3QgQ29udGFpbmVyQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIElubGlu
ZUZvcm1hdHRpbmdTdGF0ZSYpOwotICAgIHZvaWQgbGF5b3V0SW5GbG93Q29udGVudChJbnZhbGlk
YXRpb25TdGF0ZSYsIGNvbnN0IENvbnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpIG92ZXJyaWRl
OwotICAgIExheW91dFVuaXQgdXNlZENvbnRlbnRIZWlnaHQoKSBjb25zdCBvdmVycmlkZTsKLQot
ICAgIGNsYXNzIFF1aXJrcyA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzIHsKLSAg
ICBwdWJsaWM6Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgaW5pdGlhbExpbmVIZWlnaHQoKSBj
b25zdDsKLSAgICAgICAgYm9vbCBoYXNTb2Z0V3JhcE9wcG9ydHVuaXR5QXRJbWFnZSgpIGNvbnN0
OwotICAgICAgICBib29sIGlubGluZUxldmVsQm94QWZmZWN0c0xpbmVCb3goY29uc3QgTGluZUJv
eDo6SW5saW5lTGV2ZWxCb3gmLCBjb25zdCBMaW5lQm94JikgY29uc3Q7Ci0KLSAgICBwcml2YXRl
OgotICAgICAgICBmcmllbmQgY2xhc3MgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7Ci0gICAgICAg
IFF1aXJrcyhjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0gICAgICAgIGNvbnN0
IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0
dXJuIGRvd25jYXN0PElubGluZUZvcm1hdHRpbmdDb250ZXh0PihGb3JtYXR0aW5nQ29udGV4dDo6
UXVpcmtzOjpmb3JtYXR0aW5nQ29udGV4dCgpKTsgfQotCi0gICAgfTsKLSAgICBJbmxpbmVGb3Jt
YXR0aW5nQ29udGV4dDo6UXVpcmtzIHF1aXJrcygpIGNvbnN0IHsgcmV0dXJuIFF1aXJrcygqdGhp
cyk7IH0KLQotICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdTdGF0ZSYgZm9ybWF0dGluZ1N0YXRl
KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8SW5saW5lRm9ybWF0dGluZ1N0YXRlPihGb3JtYXR0
aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9Ci0gICAgSW5saW5lRm9ybWF0dGluZ1N0
YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBkb3duY2FzdDxJbmxpbmVGb3JtYXR0aW5n
U3RhdGU+KEZvcm1hdHRpbmdDb250ZXh0Ojpmb3JtYXR0aW5nU3RhdGUoKSk7IH0KLQotICAgIHZv
aWQgbGluZUxheW91dEZvckludGVyZ3JhdGlvbihJbnZhbGlkYXRpb25TdGF0ZSYsIGNvbnN0IENv
bnN0cmFpbnRzRm9ySW5GbG93Q29udGVudCYpOwotCi1wcml2YXRlOgotICAgIEludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJp
ZGU7Ci0KLSAgICBjbGFzcyBHZW9tZXRyeSA6IHB1YmxpYyBGb3JtYXR0aW5nQ29udGV4dDo6R2Vv
bWV0cnkgewotICAgIHB1YmxpYzoKLSAgICAgICAgTGluZUJveCBsaW5lQm94Rm9yTGluZUNvbnRl
bnQoY29uc3QgTGluZUJ1aWxkZXI6OkxpbmVDb250ZW50Jik7Ci0gICAgICAgIElubGluZUxheW91
dFVuaXQgbG9naWNhbFRvcEZvck5leHRMaW5lKGNvbnN0IExpbmVCdWlsZGVyOjpMaW5lQ29udGVu
dCYsIElubGluZUxheW91dFVuaXQgcHJldmlvdXNMaW5lTG9naWNhbEJvdHRvbSwgY29uc3QgRmxv
YXRpbmdDb250ZXh0JikgY29uc3Q7Ci0KLSAgICAgICAgQ29udGVudEhlaWdodEFuZE1hcmdpbiBp
bmxpbmVCbG9ja0NvbnRlbnRIZWlnaHRBbmRNYXJnaW4oY29uc3QgQm94JiwgY29uc3QgSG9yaXpv
bnRhbENvbnN0cmFpbnRzJiwgY29uc3QgT3ZlcnJpZGRlblZlcnRpY2FsVmFsdWVzJikgY29uc3Q7
Ci0gICAgICAgIENvbnRlbnRXaWR0aEFuZE1hcmdpbiBpbmxpbmVCbG9ja0NvbnRlbnRXaWR0aEFu
ZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmLCBjb25zdCBP
dmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcyYpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJp
ZW5kIGNsYXNzIElubGluZUZvcm1hdHRpbmdDb250ZXh0OwotICAgICAgICBHZW9tZXRyeShjb25z
dCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYpOwotCi0gICAgICAgIGNvbnN0IElubGluZUZvcm1h
dHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0
PElubGluZUZvcm1hdHRpbmdDb250ZXh0PihGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmZv
cm1hdHRpbmdDb250ZXh0KCkpOyB9Ci0KLSAgICB9OwotICAgIElubGluZUZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlzKTsg
fQotCi0gICAgdm9pZCBsaW5lTGF5b3V0KElubGluZUl0ZW1zJiwgTGluZUJ1aWxkZXI6OklubGlu
ZUl0ZW1SYW5nZSwgY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50Jik7Ci0KLSAgICB2
b2lkIGNvbXB1dGVJbnRyaW5zaWNXaWR0aEZvckZvcm1hdHRpbmdSb290KGNvbnN0IEJveCYpOwot
ICAgIElubGluZUxheW91dFVuaXQgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aEZvckNvbnN0cmFpbnQo
SW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCkgY29uc3Q7Ci0KLSAgICB2b2lkIGNvbXB1
dGVIb3Jpem9udGFsTWFyZ2luKGNvbnN0IEJveCYsIGNvbnN0IEhvcml6b250YWxDb25zdHJhaW50
cyYpOwotICAgIHZvaWQgY29tcHV0ZUhlaWdodEFuZE1hcmdpbihjb25zdCBCb3gmLCBjb25zdCBI
b3Jpem9udGFsQ29uc3RyYWludHMmKTsKLSAgICB2b2lkIGNvbXB1dGVXaWR0aEFuZE1hcmdpbihj
b25zdCBCb3gmLCBjb25zdCBIb3Jpem9udGFsQ29uc3RyYWludHMmKTsKLQotICAgIHZvaWQgY29s
bGVjdElubGluZUNvbnRlbnRJZk5lZWRlZCgpOwotICAgIElubGluZVJlY3QgY29tcHV0ZUdlb21l
dHJ5Rm9yTGluZUNvbnRlbnQoY29uc3QgTGluZUJ1aWxkZXI6OkxpbmVDb250ZW50JiwgY29uc3Qg
SG9yaXpvbnRhbENvbnN0cmFpbnRzJik7Ci0gICAgdm9pZCBpbnZhbGlkYXRlRm9ybWF0dGluZ1N0
YXRlKGNvbnN0IEludmFsaWRhdGlvblN0YXRlJik7Ci19OwotCi1pbmxpbmUgSW5saW5lRm9ybWF0
dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpHZW9tZXRyeShjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dCYgaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCi0gICAgOiBGb3JtYXR0aW5nQ29udGV4dDo6
R2VvbWV0cnkoaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCi17Ci19Ci0KLWlubGluZSBJbmxpbmVG
b3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpRdWlya3MoY29uc3QgSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHQmIGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQotICAgIDogRm9ybWF0dGluZ0NvbnRleHQ6
OlF1aXJrcyhpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLXsKLX0KLQotfQotfQotCi1TUEVDSUFM
SVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQoSW5saW5lRm9ybWF0dGlu
Z0NvbnRleHQsIGlzSW5saW5lRm9ybWF0dGluZ0NvbnRleHQoKSkKLQotI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1h
dHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0
dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIy
NGU3ODgzMzM4MGZiNGNjMjA1MTM1OWEzNmI1MDQ5NTQ5YjlhZDAuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1h
dHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdDb250ZXh0R2Vv
bWV0cnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoK
LSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0j
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ0NvbnRleHQuaCIK
LQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiRmxv
YXRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNpbmNsdWRl
ICJJbmxpbmVMaW5lQm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5
b3V0Q29udGFpbmVyQm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0UmVwbGFjZWRCb3guaCIKLSNpbmNs
dWRlICJMZW5ndGhGdW5jdGlvbnMuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNl
IExheW91dCB7Ci0KLWNsYXNzIExpbmVCb3hCdWlsZGVyIHsKLXB1YmxpYzoKLSAgICBMaW5lQm94
QnVpbGRlcihjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYpOwotICAgIExpbmVCb3ggYnVp
bGQoY29uc3QgTGluZUJ1aWxkZXI6OkxpbmVDb250ZW50Jik7Ci0KLXByaXZhdGU6Ci0gICAgc3Ry
dWN0IFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudCB7Ci0gICAgICAgIFNpbXBsaWZpZWRWZXJ0
aWNhbEFsaWdubWVudChjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgcm9vdElubGluZUJv
eCk7Ci0KLSAgICAgICAgc3RhdGljIGJvb2wgY2FuVXNlU2ltcGxpZmllZEFsaWdubWVudChjb25z
dCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgcm9vdElubGluZUJveCwgY29uc3QgTGluZUJveDo6
SW5saW5lTGV2ZWxCb3gmLCBPcHRpb25hbDxjb25zdCBCb3hHZW9tZXRyeT4gaW5saW5lTGV2ZWxC
b3hHZW9tZXRyeSk7Ci0KLSAgICAgICAgdm9pZCBhbGlnbihMaW5lQm94OjpJbmxpbmVMZXZlbEJv
eCYpOwotCi0gICAgICAgIElubGluZUxheW91dFVuaXQgcm9vdElubGluZUJveExvZ2ljYWxUb3Ao
KSBjb25zdCB7IHJldHVybiBtX3Jvb3RJbmxpbmVCb3hMb2dpY2FsVG9wOyB9Ci0gICAgICAgIElu
bGluZUxheW91dFVuaXQgbGluZUJveEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJveExv
Z2ljYWxCb3R0b20gLSBtX2xpbmVCb3hMb2dpY2FsVG9wOyB9Ci0KLSAgICAgICAgdm9pZCBzZXRF
bmFibGVkKGJvb2wgZW5hYmxlZCkgeyBtX2lzRW5hYmxlZCA9IGVuYWJsZWQ7IH0KLSAgICAgICAg
Ym9vbCBpc0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtX2lzRW5hYmxlZDsgfQotCi0gICAgcHJp
dmF0ZToKLSAgICAgICAgdm9pZCBhZGp1c3QoY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gm
KTsKLQotICAgICAgICBjb25zdCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgbV9yb290SW5saW5l
Qm94OwotICAgICAgICBib29sIG1faXNFbmFibGVkIHsgdHJ1ZSB9OwotICAgICAgICBJbmxpbmVM
YXlvdXRVbml0IG1fbGluZUJveExvZ2ljYWxUb3AgeyAwIH07Ci0gICAgICAgIElubGluZUxheW91
dFVuaXQgbV9saW5lQm94TG9naWNhbEJvdHRvbSB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0
VW5pdCBtX3Jvb3RJbmxpbmVCb3hMb2dpY2FsVG9wIHsgMCB9OwotICAgIH07Ci0KLSAgICB2b2lk
IHNldFZlcnRpY2FsR2VvbWV0cnlGb3JJbmxpbmVCb3goTGluZUJveDo6SW5saW5lTGV2ZWxCb3gm
KSBjb25zdDsKLSAgICB2b2lkIGNvbnN0cnVjdEFuZEFsaWduSW5saW5lTGV2ZWxCb3hlcyhMaW5l
Qm94JiwgY29uc3QgTGluZTo6UnVuTGlzdCYpOwotICAgIHZvaWQgY29tcHV0ZUxpbmVCb3hIZWln
aHRBbmRBbGlnbklubGluZUxldmVsQm94ZXNWZXJ0aWNhbGx5KExpbmVCb3gmKTsKLQotICAgIGNv
bnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBmb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsg
cmV0dXJuIG1faW5saW5lRm9ybWF0dGluZ0NvbnRleHQ7IH0KLSAgICBjb25zdCBCb3gmIHJvb3RC
b3goKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKTsgfQotICAgIExh
eW91dFN0YXRlJiBsYXlvdXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGZvcm1hdHRpbmdDb250ZXh0
KCkubGF5b3V0U3RhdGUoKTsgfQotCi0gICAgYm9vbCBpc1Jvb3RMYXlvdXRCb3goY29uc3QgQ29u
dGFpbmVyQm94JiBjb250YWluZXJCb3gpIGNvbnN0IHsgcmV0dXJuICZjb250YWluZXJCb3ggPT0g
JnJvb3RCb3goKTsgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250
ZXh0JiBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0OwotfTsKLQotc3RydWN0IEhhbmdpbmdUcmFp
bGluZ1doaXRlc3BhY2VDb250ZW50IHsKLXB1YmxpYzoKLSAgICB2b2lkIHJlc2V0KCk7Ci0KLSAg
ICBJbmxpbmVMYXlvdXRVbml0IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV93aWR0aDsgfQotICAg
IGJvb2wgaXNDb25kaXRpb25hbCgpIGNvbnN0IHsgcmV0dXJuIG1faXNDb25kaXRpb25hbDsgfQot
Ci0gICAgdm9pZCBzZXRJc0NvbmRpdGlvbmFsKCkgeyBtX2lzQ29uZGl0aW9uYWwgPSB0cnVlOyB9
Ci0gICAgdm9pZCBleHBhbmQoSW5saW5lTGF5b3V0VW5pdCB3aWR0aCkgeyBtX3dpZHRoICs9IHdp
ZHRoOyB9Ci0KLXByaXZhdGU6Ci0gICAgYm9vbCBtX2lzQ29uZGl0aW9uYWwgeyBmYWxzZSB9Owot
ICAgIElubGluZUxheW91dFVuaXQgbV93aWR0aCB7IDAgfTsKLX07Ci0KLXZvaWQgSGFuZ2luZ1Ry
YWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQ6OnJlc2V0KCkKLXsKLSAgICBtX2lzQ29uZGl0aW9uYWwg
PSBmYWxzZTsKLSAgICBtX3dpZHRoID0gIDA7Ci19Ci0KLXN0YXRpYyBIYW5naW5nVHJhaWxpbmdX
aGl0ZXNwYWNlQ29udGVudCBjb2xsZWN0SGFuZ2luZ1RyYWlsaW5nV2hpdGVzcGFjZUNvbnRlbnQo
Y29uc3QgTGluZTo6UnVuTGlzdCYgcnVucywgYm9vbCBpc0xhc3RMaW5lV2l0aElubGluZUNvbnRl
bnQpCi17Ci0gICAgYXV0byBoYW5naW5nQ29udGVudCA9IEhhbmdpbmdUcmFpbGluZ1doaXRlc3Bh
Y2VDb250ZW50IHsgfTsKLSAgICBpZiAoaXNMYXN0TGluZVdpdGhJbmxpbmVDb250ZW50KQotICAg
ICAgICBoYW5naW5nQ29udGVudC5zZXRJc0NvbmRpdGlvbmFsKCk7Ci0gICAgZm9yIChhdXRvJiBy
dW4gOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKHJ1bnMpKSB7Ci0gICAgICAgIGlmIChydW4uaXNJ
bmxpbmVCb3hTdGFydCgpIHx8IHJ1bi5pc0lubGluZUJveEVuZCgpKQotICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgIGlmIChydW4uaXNMaW5lQnJlYWsoKSkgewotICAgICAgICAgICAgaGFu
Z2luZ0NvbnRlbnQuc2V0SXNDb25kaXRpb25hbCgpOwotICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgIH0KLSAgICAgICAgaWYgKCFydW4uaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkpCi0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHByZXNlcnZlZCBv
ciBodW5nIHdoaXRlc3BhY2UuCi0gICAgICAgIGlmIChydW4uc3R5bGUoKS53aGl0ZVNwYWNlKCkg
IT0gV2hpdGVTcGFjZTo6UHJlV3JhcCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvLyBU
aGlzIGlzIGVpdGhlciBhIG5vcm1hbCBvciBjb25kaXRpb25hbGx5IGhhbmdpbmcgdHJhaWxpbmcg
d2hpdGVzcGFjZS4KLSAgICAgICAgaGFuZ2luZ0NvbnRlbnQuZXhwYW5kKHJ1bi50cmFpbGluZ1do
aXRlc3BhY2VXaWR0aCgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhbmdpbmdDb250ZW50OwotfQot
Ci1zdGF0aWMgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gaG9yaXpvbnRhbEFsaWdubWVudE9m
ZnNldChjb25zdCBMaW5lOjpSdW5MaXN0JiBydW5zLCBUZXh0QWxpZ25Nb2RlIHRleHRBbGlnbiwg
SW5saW5lTGF5b3V0VW5pdCBsaW5lTG9naWNhbFdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRl
bnRMb2dpY2FsV2lkdGgsIGJvb2wgaXNMYXN0TGluZSkKLXsKLSAgICBhdXRvIGF2YWlsYWJsZVdp
ZHRoID0gbGluZUxvZ2ljYWxXaWR0aCAtIGNvbnRlbnRMb2dpY2FsV2lkdGg7Ci0gICAgYXV0byBo
YW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVudCA9IGNvbGxlY3RIYW5naW5nVHJhaWxpbmdX
aGl0ZXNwYWNlQ29udGVudChydW5zLCBpc0xhc3RMaW5lKTsKLSAgICBhdmFpbGFibGVXaWR0aCAr
PSBoYW5naW5nVHJhaWxpbmdXaGl0ZXNwYWNlQ29udGVudC53aWR0aCgpOwotICAgIGlmIChhdmFp
bGFibGVXaWR0aCA8PSAwKQotICAgICAgICByZXR1cm4geyB9OwotCi0gICAgYXV0byBjb21wdXRl
ZEhvcml6b250YWxBbGlnbm1lbnQgPSBbJl0gewotICAgICAgICBpZiAodGV4dEFsaWduICE9IFRl
eHRBbGlnbk1vZGU6Okp1c3RpZnkpCi0gICAgICAgICAgICByZXR1cm4gdGV4dEFsaWduOwotICAg
ICAgICAvLyBUZXh0IGlzIGp1c3RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIG1ldGhvZCBzcGVjaWZp
ZWQgYnkgdGhlIHRleHQtanVzdGlmeSBwcm9wZXJ0eSwKLSAgICAgICAgLy8gaW4gb3JkZXIgdG8g
ZXhhY3RseSBmaWxsIHRoZSBsaW5lIGJveC4gVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgYnkg
dGV4dC1hbGlnbi1sYXN0LAotICAgICAgICAvLyB0aGUgbGFzdCBsaW5lIGJlZm9yZSBhIGZvcmNl
ZCBicmVhayBvciB0aGUgZW5kIG9mIHRoZSBibG9jayBpcyBzdGFydC1hbGlnbmVkLgotICAgICAg
ICBpZiAoaXNMYXN0TGluZSB8fCAoIXJ1bnMuaXNFbXB0eSgpICYmIHJ1bnMubGFzdCgpLmlzTGlu
ZUJyZWFrKCkpKQotICAgICAgICAgICAgcmV0dXJuIFRleHRBbGlnbk1vZGU6OlN0YXJ0OwotICAg
ICAgICByZXR1cm4gVGV4dEFsaWduTW9kZTo6SnVzdGlmeTsKLSAgICB9OwotCi0gICAgc3dpdGNo
IChjb21wdXRlZEhvcml6b250YWxBbGlnbm1lbnQoKSkgewotICAgIGNhc2UgVGV4dEFsaWduTW9k
ZTo6TGVmdDoKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OldlYktpdExlZnQ6Ci0gICAgY2FzZSBU
ZXh0QWxpZ25Nb2RlOjpTdGFydDoKLSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICBjYXNlIFRleHRB
bGlnbk1vZGU6OlJpZ2h0OgotICAgIGNhc2UgVGV4dEFsaWduTW9kZTo6V2ViS2l0UmlnaHQ6Ci0g
ICAgY2FzZSBUZXh0QWxpZ25Nb2RlOjpFbmQ6Ci0gICAgICAgIHJldHVybiBhdmFpbGFibGVXaWR0
aDsKLSAgICBjYXNlIFRleHRBbGlnbk1vZGU6OkNlbnRlcjoKLSAgICBjYXNlIFRleHRBbGlnbk1v
ZGU6OldlYktpdENlbnRlcjoKLSAgICAgICAgcmV0dXJuIGF2YWlsYWJsZVdpZHRoIC8gMjsKLSAg
ICBjYXNlIFRleHRBbGlnbk1vZGU6Okp1c3RpZnk6Ci0gICAgICAgIC8vIFRleHRBbGlnbk1vZGU6
Okp1c3RpZnkgaXMgYSBydW4gYWxpZ25tZW50IChhbmQgd2Ugb25seSBkbyBpbmxpbmUgYm94IGFs
aWdubWVudCBoZXJlKQotICAgICAgICByZXR1cm4geyB9OwotICAgIGRlZmF1bHQ6Ci0gICAgICAg
IEFTU0VSVF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci0gICAgICAgIHJldHVybiB7IH07Ci0gICAg
fQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiB7IH07Ci19Ci0KLUxpbmVC
b3hCdWlsZGVyOjpMaW5lQm94QnVpbGRlcihjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYg
aW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCi0gICAgOiBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0
KGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQotewotfQotCi1MaW5lQm94IExpbmVCb3hCdWlsZGVy
OjpidWlsZChjb25zdCBMaW5lQnVpbGRlcjo6TGluZUNvbnRlbnQmIGxpbmVDb250ZW50KQotewot
ICAgIGF1dG8mIHJ1bnMgPSBsaW5lQ29udGVudC5ydW5zOwotICAgIGF1dG8gbGluZUxvZ2ljYWxX
aWR0aCA9IGxpbmVDb250ZW50LmxpbmVMb2dpY2FsV2lkdGg7Ci0gICAgYXV0byBjb250ZW50TG9n
aWNhbFdpZHRoID0gbGluZUNvbnRlbnQuY29udGVudExvZ2ljYWxXaWR0aDsKLSAgICBhdXRvIGhv
cml6b250YWxBbGlnbm1lbnRPZmZzZXQgPSBMYXlvdXQ6Omhvcml6b250YWxBbGlnbm1lbnRPZmZz
ZXQocnVucywgcm9vdEJveCgpLnN0eWxlKCkudGV4dEFsaWduKCksIGxpbmVMb2dpY2FsV2lkdGgs
IGNvbnRlbnRMb2dpY2FsV2lkdGgsIGxpbmVDb250ZW50LmlzTGFzdExpbmVXaXRoSW5saW5lQ29u
dGVudCk7Ci0gICAgYXV0byBsaW5lQm94ID0gTGluZUJveCB7IHJvb3RCb3goKSwgbGluZUNvbnRl
bnQubG9naWNhbFRvcExlZnQsIGxpbmVMb2dpY2FsV2lkdGgsIGhvcml6b250YWxBbGlnbm1lbnRP
ZmZzZXQudmFsdWVPcihJbmxpbmVMYXlvdXRVbml0IHsgfSksIGNvbnRlbnRMb2dpY2FsV2lkdGgs
IGxpbmVDb250ZW50Lm5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCB9OwotICAgIGNvbnN0
cnVjdEFuZEFsaWduSW5saW5lTGV2ZWxCb3hlcyhsaW5lQm94LCBydW5zKTsKLSAgICByZXR1cm4g
bGluZUJveDsKLX0KLQotdm9pZCBMaW5lQm94QnVpbGRlcjo6c2V0VmVydGljYWxHZW9tZXRyeUZv
cklubGluZUJveChMaW5lQm94OjpJbmxpbmVMZXZlbEJveCYgaW5saW5lTGV2ZWxCb3gpIGNvbnN0
Ci17Ci0gICAgQVNTRVJUKGlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkgfHwgaW5saW5lTGV2
ZWxCb3guaXNMaW5lQnJlYWtCb3goKSk7Ci0gICAgYXV0byYgZm9udE1ldHJpY3MgPSBpbmxpbmVM
ZXZlbEJveC5zdHlsZSgpLmZvbnRNZXRyaWNzKCk7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBhc2Nl
bnQgPSBmb250TWV0cmljcy5hc2NlbnQoKTsKLSAgICBJbmxpbmVMYXlvdXRVbml0IGRlc2NlbnQg
PSBmb250TWV0cmljcy5kZXNjZW50KCk7Ci0gICAgYXV0byBsb2dpY2FsSGVpZ2h0ID0gYXNjZW50
ICsgZGVzY2VudDsKLSAgICAvLyBXZSBuZWVkIGZsb29yL2NlaWwgdG8gbWF0Y2ggbGVnYWN5IGxh
eW91dCBpbnRlZ3JhbCBwb3NpdGlvbmluZy4KLSAgICBpbmxpbmVMZXZlbEJveC5zZXRCYXNlbGlu
ZShmbG9vcmYoYXNjZW50KSk7Ci0gICAgaW5saW5lTGV2ZWxCb3guc2V0RGVzY2VudChjZWlsKGRl
c2NlbnQpKTsKLSAgICBpbmxpbmVMZXZlbEJveC5zZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWln
aHQpOwotCi0gICAgLy8gRklYTUU6IEFkanVzdCBsYXlvdXQgYm91bmRzIHdpdGggZmFsbGJhY2sg
Zm9udCB3aGVuIGFwcGxpY2FibGUuCi0gICAgYXV0byYgc3R5bGUgPSBpbmxpbmVMZXZlbEJveC5s
YXlvdXRCb3goKS5zdHlsZSgpOwotICAgIGF1dG8gbGluZUhlaWdodCA9IHN0eWxlLmxpbmVIZWln
aHQoKTsKLSAgICBpZiAobGluZUhlaWdodC5pc05lZ2F0aXZlKCkpIHsKLSAgICAgICAgLy8gSWYg
bGluZS1oZWlnaHQgY29tcHV0ZXMgdG8gbm9ybWFsIGFuZCBlaXRoZXIgdGV4dC1lZGdlIGlzIGxl
YWRpbmcgb3IgdGhpcyBpcyB0aGUgcm9vdCBpbmxpbmUgYm94LAotICAgICAgICAvLyB0aGUgZm9u
dOKAmXMgbGluZSBnYXAgbWV0cmljIG1heSBhbHNvIGJlIGluY29ycG9yYXRlZCBpbnRvIEEgYW5k
IEQgYnkgYWRkaW5nIGhhbGYgdG8gZWFjaCBzaWRlIGFzIGhhbGYtbGVhZGluZy4KLSAgICAgICAg
Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1pbmxpbmUtMy8jaW5saW5lLWhlaWdodAotICAg
ICAgICAvLyBTaW5jZSB0ZXh0LWVkZ2UgaXMgbm90IHN1cHBvcnRlZCB5ZXQgYW5kIHRoZSBpbml0
aWFsIHZhbHVlIGlzIGxlYWRpbmcsIHdlIHNob3VsZCBqdXN0IGFwcGx5IGl0IHRvCi0gICAgICAg
IC8vIGFsbCBpbmxpbmUgYm94ZXMuCi0gICAgICAgIGF1dG8gaGFsZkxpbmVHYXAgPSAoZm9udE1l
dHJpY3MubGluZVNwYWNpbmcoKSAtIGxvZ2ljYWxIZWlnaHQpIC8gMjsKLSAgICAgICAgYXNjZW50
ICs9IGhhbGZMaW5lR2FwOwotICAgICAgICBkZXNjZW50ICs9IGhhbGZMaW5lR2FwOwotICAgIH0g
ZWxzZSB7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbGluZUhlaWdodCA9IHN0eWxlLmNvbXB1
dGVkTGluZUhlaWdodCgpOwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGhhbGZMZWFkaW5nID0g
KGxpbmVIZWlnaHQgLSAoYXNjZW50ICsgZGVzY2VudCkpIC8gMjsKLSAgICAgICAgYXNjZW50ICs9
IGhhbGZMZWFkaW5nOwotICAgICAgICBkZXNjZW50ICs9IGhhbGZMZWFkaW5nOwotICAgIH0KLSAg
ICAvLyBXZSBuZWVkIGZsb29yL2NlaWwgdG8gbWF0Y2ggbGVnYWN5IGxheW91dCBpbnRlZ3JhbCBw
b3NpdGlvbmluZy4KLSAgICBpbmxpbmVMZXZlbEJveC5zZXRMYXlvdXRCb3VuZHMoTGluZUJveDo6
SW5saW5lTGV2ZWxCb3g6OkxheW91dEJvdW5kcyB7IGZsb29yZihhc2NlbnQpLCBjZWlsKGRlc2Nl
bnQpIH0pOwotfQotCi12b2lkIExpbmVCb3hCdWlsZGVyOjpjb25zdHJ1Y3RBbmRBbGlnbklubGlu
ZUxldmVsQm94ZXMoTGluZUJveCYgbGluZUJveCwgY29uc3QgTGluZTo6UnVuTGlzdCYgcnVucykK
LXsKLSAgICBhdXRvJiByb290SW5saW5lQm94ID0gbGluZUJveC5yb290SW5saW5lQm94KCk7Ci0g
ICAgc2V0VmVydGljYWxHZW9tZXRyeUZvcklubGluZUJveChyb290SW5saW5lQm94KTsKLQotICAg
IGF1dG8gc2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50ID0gU2ltcGxpZmllZFZlcnRpY2FsQWxp
Z25tZW50IHsgcm9vdElubGluZUJveCB9OwotICAgIC8vIEZJWE1FOiBBZGQgZmFzdCBwYXRoIHN1
cHBvcnQgZm9yIGxpbmUtaGVpZ2h0IGNvbnRlbnQuCi0gICAgc2ltcGxpZmllZFZlcnRpY2FsQWxp
Z25tZW50LnNldEVuYWJsZWQobGF5b3V0U3RhdGUoKS5pblN0YW5kYXJkc01vZGUoKSAmJiByb290
Qm94KCkuc3R5bGUoKS5saW5lSGVpZ2h0KCkuaXNOZWdhdGl2ZSgpKTsKLQotICAgIGF1dG8gc2lt
cGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGljYWJsZSA9IFsmXShhdXRvJiBpbmxpbmVMZXZl
bEJveCwgT3B0aW9uYWw8Y29uc3QgQm94R2VvbWV0cnk+IGJveEdlb21ldHJ5KSB7Ci0gICAgICAg
IGlmICghc2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50LmlzRW5hYmxlZCgpKQotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICBpZiAoIVNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudDo6Y2Fu
VXNlU2ltcGxpZmllZEFsaWdubWVudChyb290SW5saW5lQm94LCBpbmxpbmVMZXZlbEJveCwgYm94
R2VvbWV0cnkpKSB7Ci0gICAgICAgICAgICBzaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQuc2V0
RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAg
c2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50LmFsaWduKGlubGluZUxldmVsQm94KTsKLSAgICB9
OwotCi0gICAgYXV0byBjcmVhdGVXcmFwcGVkSW5saW5lQm94ZXMgPSBbJl0gewotICAgICAgICBp
ZiAocnVucy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC8vIEFuIGlu
bGluZSBib3ggbWF5IG5vdCBuZWNlc3NhcmlseSBzdGFydCBvbiB0aGUgY3VycmVudCBsaW5lOgot
ICAgICAgICAvLyA8c3BhbiBpZD1vdXRlcj5saW5lIGJyZWFrPGJyPnRoaXMgY29udGVudCdzIHBh
cmVudCBpbmxpbmUgYm94KCdvdXRlcicpIDxzcGFuIGlkPWlubmVyPnN0YXJ0cyBvbiB0aGUgcHJl
dmlvdXMgbGluZTwvc3Bhbj48L3NwYW4+Ci0gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJl
IHRoYXQgdGhlcmUncyBhbiBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBmb3IgZXZlcnkgaW5saW5l
IGJveCB0aGF0J3MgcHJlc2VudCBvbiB0aGUgY3VycmVudCBsaW5lLgotICAgICAgICAvLyBJbiBu
ZXN0aW5nIGNhc2Ugd2UgbmVlZCB0byBjcmVhdGUgTGluZUJveDo6SW5saW5lTGV2ZWxCb3hlcyBm
b3IgdGhlIGlubGluZSBib3ggYW5jZXN0b3JzLgotICAgICAgICAvLyBXZSBvbmx5IGhhdmUgdG8g
ZG8gaXQgb24gdGhlIGZpcnN0IHJ1biBhcyBhbnkgc3Vic2VxdWVudCBpbmxpbmUgY29udGVudCBp
cyBlaXRoZXIgYXQgdGhlIHNhbWUvaGlnaGVyIG5lc3RpbmcgbGV2ZWwgb3IKLSAgICAgICAgLy8g
bmVzdGVkIHdpdGggYSBbaW5saW5lIGJveCBzdGFydF0gcnVuLgotICAgICAgICBhdXRvJiBmaXJz
dFJ1biA9IHJ1bnNbMF07Ci0gICAgICAgIGF1dG8mIGZpcnN0UnVuUGFyZW50TGF5b3V0Qm94ID0g
Zmlyc3RSdW4ubGF5b3V0Qm94KCkucGFyZW50KCk7Ci0gICAgICAgIC8vIElmIHRoZSBwYXJlbnQg
aXMgdGhlIGZvcm1hdHRpbmcgcm9vdCwgd2UgY2FuIHN0b3AgaGVyZS4gVGhpcyBpcyByb290IGlu
bGluZSBib3ggY29udGVudCwgdGhlcmUncyBubyBuZXN0aW5nIGlubGluZSBib3ggZnJvbSB0aGUg
cHJldmlvdXMgbGluZShzKQotICAgICAgICAvLyB1bmxlc3MgdGhlIGlubGluZSBib3ggY2xvc2lu
ZyBpcyBmb3JjZWQgb3ZlciB0byB0aGUgY3VycmVudCBsaW5lLgotICAgICAgICAvLyBlLmcuCi0g
ICAgICAgIC8vIDxzcGFuPm5vcm1hbGx5IHRoZSBpbmxpbmUgYm94IGNsb3NpbmcgZm9ybXMgYSBj
b250aW51b3VzIGNvbnRlbnQ8L3NwYW4+Ci0gICAgICAgIC8vIDxzcGFuPnVubGVzcyBpdCdzIGZv
cmNlZCB0byB0aGUgbmV4dCBsaW5lPGJyPjwvc3Bhbj4KLSAgICAgICAgYXV0byBmaXJzdFJ1bk5l
ZWRzSW5saW5lQm94ID0gZmlyc3RSdW4uaXNJbmxpbmVCb3hFbmQoKTsKLSAgICAgICAgaWYgKCFm
aXJzdFJ1bk5lZWRzSW5saW5lQm94ICYmIGlzUm9vdExheW91dEJveChmaXJzdFJ1blBhcmVudExh
eW91dEJveCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIFZlY3Rvcjxjb25zdCBCb3gq
PiBsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVCb3hlczsKLSAgICAgICAgaWYgKGZpcnN0UnVuTmVl
ZHNJbmxpbmVCb3gpCi0gICAgICAgICAgICBsYXlvdXRCb3hlc1dpdGhvdXRJbmxpbmVCb3hlcy5h
cHBlbmQoJmZpcnN0UnVuLmxheW91dEJveCgpKTsKLSAgICAgICAgYXV0byogYW5jZXN0b3IgPSAm
Zmlyc3RSdW5QYXJlbnRMYXlvdXRCb3g7Ci0gICAgICAgIHdoaWxlICghaXNSb290TGF5b3V0Qm94
KCphbmNlc3RvcikpIHsKLSAgICAgICAgICAgIGxheW91dEJveGVzV2l0aG91dElubGluZUJveGVz
LmFwcGVuZChhbmNlc3Rvcik7Ci0gICAgICAgICAgICBhbmNlc3RvciA9ICZhbmNlc3Rvci0+cGFy
ZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBtaXNzaW5nIExpbmVC
b3g6OklubGluZUJveGVzIHN0YXJ0aW5nIHdpdGggdGhlIHRvcG1vc3QgbGF5b3V0IGJveC4KLSAg
ICAgICAgZm9yIChhdXRvKiBsYXlvdXRCb3ggOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKGxheW91
dEJveGVzV2l0aG91dElubGluZUJveGVzKSkgewotICAgICAgICAgICAgYXV0byBpbmxpbmVCb3gg
PSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlSW5saW5lQm94KCpsYXlvdXRCb3gsIHJv
b3RJbmxpbmVCb3gubG9naWNhbExlZnQoKSwgbGluZUJveC5jb250ZW50TG9naWNhbFdpZHRoKCkp
OwotICAgICAgICAgICAgc2V0VmVydGljYWxHZW9tZXRyeUZvcklubGluZUJveChpbmxpbmVCb3gp
OwotICAgICAgICAgICAgc2ltcGxpZmllZEFsaWduVmVydGljYWxseUlmQXBwbGljYWJsZShpbmxp
bmVCb3gsIHsgfSk7Ci0gICAgICAgICAgICBsaW5lQm94LmFkZElubGluZUxldmVsQm94KFdURk1v
dmUoaW5saW5lQm94KSk7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIGNyZWF0ZVdyYXBwZWRJbmxp
bmVCb3hlcygpOwotCi0gICAgYXV0byBsaW5lSGFzQ29udGVudCA9IGZhbHNlOwotICAgIGZvciAo
YXV0byYgcnVuIDogcnVucykgewotICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBydW4ubGF5b3V0
Qm94KCk7Ci0gICAgICAgIGF1dG8gcnVuSGFzQ29udGVudCA9IFsmXSAoKSAtPiBib29sIHsKLSAg
ICAgICAgICAgIEFTU0VSVCghbGluZUhhc0NvbnRlbnQpOwotICAgICAgICAgICAgaWYgKHJ1bi5p
c1RleHQoKSB8fCBydW4uaXNCb3goKSB8fCBydW4uaXNTb2Z0TGluZUJyZWFrKCkgfHwgcnVuLmlz
SGFyZExpbmVCcmVhaygpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAg
ICAgYXV0byYgaW5saW5lQm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5
Rm9yQm94KGxheW91dEJveCk7Ci0gICAgICAgICAgICAvLyBFdmVuIG5lZ2F0aXZlIGhvcml6b250
YWwgbWFyZ2luIG1ha2VzIHRoZSBsaW5lICJjb250ZW50ZnVsIi4KLSAgICAgICAgICAgIGlmIChy
dW4uaXNJbmxpbmVCb3hTdGFydCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVCb3hH
ZW9tZXRyeS5tYXJnaW5TdGFydCgpIHx8IGlubGluZUJveEdlb21ldHJ5LmJvcmRlckxlZnQoKSB8
fCBpbmxpbmVCb3hHZW9tZXRyeS5wYWRkaW5nTGVmdCgpLnZhbHVlT3IoMF9sdSk7Ci0gICAgICAg
ICAgICBpZiAocnVuLmlzSW5saW5lQm94RW5kKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGlu
bGluZUJveEdlb21ldHJ5Lm1hcmdpbkVuZCgpIHx8IGlubGluZUJveEdlb21ldHJ5LmJvcmRlclJp
Z2h0KCkgfHwgaW5saW5lQm94R2VvbWV0cnkucGFkZGluZ1JpZ2h0KCkudmFsdWVPcigwX2x1KTsK
LSAgICAgICAgICAgIGlmIChydW4uaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgpKQotICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwot
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH07Ci0gICAgICAgIGxpbmVIYXNDb250
ZW50ID0gbGluZUhhc0NvbnRlbnQgfHwgcnVuSGFzQ29udGVudCgpOwotICAgICAgICBhdXRvIGxv
Z2ljYWxMZWZ0ID0gcm9vdElubGluZUJveC5sb2dpY2FsTGVmdCgpICsgcnVuLmxvZ2ljYWxMZWZ0
KCk7Ci0gICAgICAgIGlmIChydW4uaXNCb3goKSkgewotICAgICAgICAgICAgYXV0byYgaW5saW5l
TGV2ZWxCb3hHZW9tZXRyeSA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGF5
b3V0Qm94KTsKLSAgICAgICAgICAgIGF1dG8gbWFyZ2luQm94SGVpZ2h0ID0gaW5saW5lTGV2ZWxC
b3hHZW9tZXRyeS5tYXJnaW5Cb3hIZWlnaHQoKTsKLSAgICAgICAgICAgIGF1dG8gYXNjZW50ID0g
SW5saW5lTGF5b3V0VW5pdCB7IH07Ci0gICAgICAgICAgICBpZiAobGF5b3V0U3RhdGUoKS5zaG91
bGROb3RTeW50aGVzaXplSW5saW5lQmxvY2tCYXNlbGluZSgpKSB7Ci0gICAgICAgICAgICAgICAg
Ly8gSW50ZWdyYXRpb24gY29kZXBhdGggY29uc3RydWN0cyByZXBsYWNlZCBib3hlcyBmb3IgaW5s
aW5lLWJsb2NrIGNvbnRlbnQuCi0gICAgICAgICAgICAgICAgQVNTRVJUKGxheW91dEJveC5pc1Jl
cGxhY2VkQm94KCkpOwotICAgICAgICAgICAgICAgIGFzY2VudCA9ICpkb3duY2FzdDxSZXBsYWNl
ZEJveD4obGF5b3V0Qm94KS5iYXNlbGluZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsYXlv
dXRCb3guaXNJbmxpbmVCbG9ja0JveCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGJhc2Vs
aW5lIG9mIGFuICdpbmxpbmUtYmxvY2snIGlzIHRoZSBiYXNlbGluZSBvZiBpdHMgbGFzdCBsaW5l
IGJveCBpbiB0aGUgbm9ybWFsIGZsb3csIHVubGVzcyBpdCBoYXMgZWl0aGVyIG5vIGluLWZsb3cg
bGluZSBib3hlcyBvcgotICAgICAgICAgICAgICAgIC8vIGlmIGl0cyAnb3ZlcmZsb3cnIHByb3Bl
cnR5IGhhcyBhIGNvbXB1dGVkIHZhbHVlIG90aGVyIHRoYW4gJ3Zpc2libGUnLCBpbiB3aGljaCBj
YXNlIHRoZSBiYXNlbGluZSBpcyB0aGUgYm90dG9tIG1hcmdpbiBlZGdlLgotICAgICAgICAgICAg
ICAgIGF1dG8gc3ludGhlc2l6ZUJhc2VsaW5lID0gIWxheW91dEJveC5lc3RhYmxpc2hlc0lubGlu
ZUZvcm1hdHRpbmdDb250ZXh0KCkgfHwgIWxheW91dEJveC5zdHlsZSgpLmlzT3ZlcmZsb3dWaXNp
YmxlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN5bnRoZXNpemVCYXNlbGluZSkKLSAgICAgICAg
ICAgICAgICAgICAgYXNjZW50ID0gbWFyZ2luQm94SGVpZ2h0OwotICAgICAgICAgICAgICAgIGVs
c2UgewotICAgICAgICAgICAgICAgICAgICBhdXRvJiBmb3JtYXR0aW5nU3RhdGUgPSBsYXlvdXRT
dGF0ZSgpLmVzdGFibGlzaGVkSW5saW5lRm9ybWF0dGluZ1N0YXRlKGRvd25jYXN0PENvbnRhaW5l
ckJveD4obGF5b3V0Qm94KSk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8mIGxhc3RMaW5lID0g
Zm9ybWF0dGluZ1N0YXRlLmxpbmVzKCkubGFzdCgpOwotICAgICAgICAgICAgICAgICAgICBhdXRv
IGlubGluZUJsb2NrQmFzZWxpbmUgPSBsYXN0TGluZS5saW5lQm94TG9naWNhbFJlY3QoKS50b3Ao
KSArIGxhc3RMaW5lLmJhc2VsaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzY2VudCA9IGlu
bGluZUxldmVsQm94R2VvbWV0cnkubWFyZ2luQmVmb3JlKCkgKyBpbmxpbmVMZXZlbEJveEdlb21l
dHJ5LmJvcmRlclRvcCgpICsgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS5wYWRkaW5nVG9wKCkudmFs
dWVPcigwKSArIGlubGluZUJsb2NrQmFzZWxpbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgfSBlbHNlIGlmIChsYXlvdXRCb3guaXNSZXBsYWNlZEJveCgpKQotICAgICAgICAgICAg
ICAgIGFzY2VudCA9IGRvd25jYXN0PFJlcGxhY2VkQm94PihsYXlvdXRCb3gpLmJhc2VsaW5lKCku
dmFsdWVPcihtYXJnaW5Cb3hIZWlnaHQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgIGFzY2VudCA9IG1hcmdpbkJveEhlaWdodDsKLSAgICAgICAgICAgIGxvZ2ljYWxMZWZ0ICs9
IHN0ZDo6bWF4KDBfbHUsIGlubGluZUxldmVsQm94R2VvbWV0cnkubWFyZ2luU3RhcnQoKSk7Ci0g
ICAgICAgICAgICBhdXRvIGF0b21pY0lubGluZUxldmVsQm94ID0gTGluZUJveDo6SW5saW5lTGV2
ZWxCb3g6OmNyZWF0ZUF0b21pY0lubGluZUxldmVsQm94KGxheW91dEJveCwgbG9naWNhbExlZnQs
IHsgaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS5ib3JkZXJCb3hXaWR0aCgpLCBtYXJnaW5Cb3hIZWln
aHQgfSk7Ci0gICAgICAgICAgICBhdG9taWNJbmxpbmVMZXZlbEJveC5zZXRCYXNlbGluZShhc2Nl
bnQpOwotICAgICAgICAgICAgYXRvbWljSW5saW5lTGV2ZWxCb3guc2V0TGF5b3V0Qm91bmRzKExp
bmVCb3g6OklubGluZUxldmVsQm94OjpMYXlvdXRCb3VuZHMgeyBhc2NlbnQsIG1hcmdpbkJveEhl
aWdodCAtIGFzY2VudCB9KTsKLSAgICAgICAgICAgIHNpbXBsaWZpZWRBbGlnblZlcnRpY2FsbHlJ
ZkFwcGxpY2FibGUoYXRvbWljSW5saW5lTGV2ZWxCb3gsIGlubGluZUxldmVsQm94R2VvbWV0cnkp
OwotICAgICAgICAgICAgbGluZUJveC5hZGRJbmxpbmVMZXZlbEJveChXVEZNb3ZlKGF0b21pY0lu
bGluZUxldmVsQm94KSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAg
ICBpZiAocnVuLmlzSW5saW5lQm94U3RhcnQoKSkgewotICAgICAgICAgICAgLy8gQXQgdGhpcyBw
b2ludCB3ZSBkb24ndCBrbm93IHlldCBob3cgd2lkZSB0aGlzIGlubGluZSBib3ggaXMuIExldCdz
IGFzc3VtZSBpdCdzIGFzIGxvbmcgYXMgdGhlIGxpbmUgaXMKLSAgICAgICAgICAgIC8vIGFuZCBh
ZGp1c3QgaXQgbGF0ZXIgaWYgd2UgY29tZSBhY3Jvc3MgYW4gaW5saW5lQm94RW5kIHJ1biAoc2Vl
IGJlbG93KS4KLSAgICAgICAgICAgIGF1dG8gaW5pdGlhbExvZ2ljYWxXaWR0aCA9IGxpbmVCb3gu
Y29udGVudExvZ2ljYWxXaWR0aCgpIC0gcnVuLmxvZ2ljYWxMZWZ0KCk7Ci0gICAgICAgICAgICBB
U1NFUlQoaW5pdGlhbExvZ2ljYWxXaWR0aCA+PSAwKTsKLSAgICAgICAgICAgIC8vIElubGluZSBi
b3ggcnVuIGlzIGJhc2VkIG9uIG1hcmdpbiBib3guIExldCdzIGNvbnZlcnQgaXQgdG8gYm9yZGVy
IGJveC4KLSAgICAgICAgICAgIGF1dG8gbWFyZ2luU3RhcnQgPSBzdGQ6Om1heCgwX2x1LCBmb3Jt
YXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCkubWFyZ2luU3RhcnQoKSk7
Ci0gICAgICAgICAgICBsb2dpY2FsTGVmdCArPSBtYXJnaW5TdGFydDsKLSAgICAgICAgICAgIGlu
aXRpYWxMb2dpY2FsV2lkdGggLT0gbWFyZ2luU3RhcnQ7Ci0gICAgICAgICAgICBhdXRvIGlubGlu
ZUJveCA9IExpbmVCb3g6OklubGluZUxldmVsQm94OjpjcmVhdGVJbmxpbmVCb3gobGF5b3V0Qm94
LCBsb2dpY2FsTGVmdCwgaW5pdGlhbExvZ2ljYWxXaWR0aCk7Ci0gICAgICAgICAgICBzZXRWZXJ0
aWNhbEdlb21ldHJ5Rm9ySW5saW5lQm94KGlubGluZUJveCk7Ci0gICAgICAgICAgICBzaW1wbGlm
aWVkQWxpZ25WZXJ0aWNhbGx5SWZBcHBsaWNhYmxlKGlubGluZUJveCwgeyB9KTsKLSAgICAgICAg
ICAgIGxpbmVCb3guYWRkSW5saW5lTGV2ZWxCb3goV1RGTW92ZShpbmxpbmVCb3gpKTsKLSAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChydW4uaXNJbmxpbmVCb3hF
bmQoKSkgewotICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBsb2dpY2FsIHdpZHRoIHdoZW4gdGhl
IGlubGluZSBib3ggY2xvc2VzIG9uIHRoaXMgbGluZS4KLSAgICAgICAgICAgIGF1dG8mIGlubGlu
ZUJveCA9IGxpbmVCb3guaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3gobGF5b3V0Qm94KTsKLSAg
ICAgICAgICAgIEFTU0VSVChpbmxpbmVCb3guaXNJbmxpbmVCb3goKSk7Ci0gICAgICAgICAgICAv
LyBJbmxpbmUgYm94IHJ1biBpcyBiYXNlZCBvbiBtYXJnaW4gYm94LiBMZXQncyBjb252ZXJ0IGl0
IHRvIGJvcmRlciBib3guCi0gICAgICAgICAgICBhdXRvIG1hcmdpbkVuZCA9IHN0ZDo6bWF4KDBf
bHUsIGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gobGF5b3V0Qm94KS5tYXJnaW5F
bmQoKSk7Ci0gICAgICAgICAgICBhdXRvIGlubGluZUJveExvZ2ljYWxSaWdodCA9IGxvZ2ljYWxM
ZWZ0ICsgcnVuLmxvZ2ljYWxXaWR0aCgpIC0gbWFyZ2luRW5kOwotICAgICAgICAgICAgaW5saW5l
Qm94LnNldExvZ2ljYWxXaWR0aChpbmxpbmVCb3hMb2dpY2FsUmlnaHQgLSBpbmxpbmVCb3gubG9n
aWNhbExlZnQoKSk7Ci0gICAgICAgICAgICBzaW1wbGlmaWVkQWxpZ25WZXJ0aWNhbGx5SWZBcHBs
aWNhYmxlKGlubGluZUJveCwgeyB9KTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9
Ci0gICAgICAgIGlmIChydW4uaXNUZXh0KCkgfHwgcnVuLmlzU29mdExpbmVCcmVhaygpKSB7Ci0g
ICAgICAgICAgICAvLyBGSVhNRTogQWRqdXN0IG5vbi1lbXB0eSBpbmxpbmUgYm94IGhlaWdodCB3
aGVuIGdseXBocyBmcm9tIHRoZSBub24tcHJpbWFyeSBmb250IHN0cmV0Y2ggdGhlIGJveC4KLSAg
ICAgICAgICAgIGxpbmVCb3guaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3gobGF5b3V0Qm94LnBh
cmVudCgpKS5zZXRIYXNDb250ZW50KCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
fQotICAgICAgICBpZiAocnVuLmlzSGFyZExpbmVCcmVhaygpKSB7Ci0gICAgICAgICAgICBhdXRv
IGxpbmVCcmVha0JveCA9IExpbmVCb3g6OklubGluZUxldmVsQm94OjpjcmVhdGVMaW5lQnJlYWtC
b3gobGF5b3V0Qm94LCBsb2dpY2FsTGVmdCk7Ci0gICAgICAgICAgICBzZXRWZXJ0aWNhbEdlb21l
dHJ5Rm9ySW5saW5lQm94KGxpbmVCcmVha0JveCk7Ci0gICAgICAgICAgICBzaW1wbGlmaWVkQWxp
Z25WZXJ0aWNhbGx5SWZBcHBsaWNhYmxlKGxpbmVCcmVha0JveCwgeyB9KTsKLSAgICAgICAgICAg
IGxpbmVCb3guYWRkSW5saW5lTGV2ZWxCb3goV1RGTW92ZShsaW5lQnJlYWtCb3gpKTsKLSAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChydW4uaXNXb3JkQnJlYWtP
cHBvcnR1bml0eSgpKSB7Ci0gICAgICAgICAgICBsaW5lQm94LmFkZElubGluZUxldmVsQm94KExp
bmVCb3g6OklubGluZUxldmVsQm94OjpjcmVhdGVHZW5lcmljSW5saW5lTGV2ZWxCb3gobGF5b3V0
Qm94LCBsb2dpY2FsTGVmdCkpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotCi0gICAgbGluZUJveC5zZXRIYXND
b250ZW50KGxpbmVIYXNDb250ZW50KTsKLSAgICBpZiAoc2ltcGxpZmllZFZlcnRpY2FsQWxpZ25t
ZW50LmlzRW5hYmxlZCgpIHx8ICFsaW5lSGFzQ29udGVudCkgewotICAgICAgICAvLyBXZSBzaG91
bGQgYWx3YXlzIGJlIGFibGUgdG8gZXhlcmNpc2UgdGhlIGZhc3QgcGF0aCB3aGVuIHRoZSBsaW5l
IGhhcyBubyBjb250ZW50IGF0IGFsbCwgZXZlbiBpbiBub24tc3RhbmRhcmRzIG1vZGUgb3Igd2l0
aCBsaW5lLWhlaWdodCBzZXQuCi0gICAgICAgIHJvb3RJbmxpbmVCb3guc2V0TG9naWNhbFRvcChs
aW5lSGFzQ29udGVudCA/IHNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudC5yb290SW5saW5lQm94
TG9naWNhbFRvcCgpIDogLXJvb3RJbmxpbmVCb3guYmFzZWxpbmUoKSk7Ci0gICAgICAgIGxpbmVC
b3guc2V0TG9naWNhbEhlaWdodChsaW5lSGFzQ29udGVudCA/IHNpbXBsaWZpZWRWZXJ0aWNhbEFs
aWdubWVudC5saW5lQm94SGVpZ2h0KCkgOiBJbmxpbmVMYXlvdXRVbml0KCkpOwotICAgIH0gZWxz
ZQotICAgICAgICBjb21wdXRlTGluZUJveEhlaWdodEFuZEFsaWduSW5saW5lTGV2ZWxCb3hlc1Zl
cnRpY2FsbHkobGluZUJveCk7Ci19Ci0KLXZvaWQgTGluZUJveEJ1aWxkZXI6OmNvbXB1dGVMaW5l
Qm94SGVpZ2h0QW5kQWxpZ25JbmxpbmVMZXZlbEJveGVzVmVydGljYWxseShMaW5lQm94JiBsaW5l
Qm94KQotewotICAgIEFTU0VSVChsaW5lQm94Lmhhc0NvbnRlbnQoKSk7Ci0gICAgLy8gVGhpcyBm
dW5jdGlvbiAocGFydGlhbGx5KSBpbXBsZW1lbnRzOgotICAgIC8vIDIuMi4gTGF5b3V0IFdpdGhp
biBMaW5lIEJveGVzCi0gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1pbmxpbmUtMy8j
bGluZS1sYXlvdXQKLSAgICAvLyAxLiBDb21wdXRlIHRoZSBsaW5lIGJveCBoZWlnaHQgdXNpbmcg
dGhlIGxheW91dCBib3VuZHMgZ2VvbWV0cnkuIFRoaXMgaGVpZ2h0IGNvbXB1dGF0aW9uIHN0cmlj
dGx5IHVzZXMgbGF5b3V0IGJvdW5kcyBhbmQgbm90IG5vcm1hbCBpbmxpbmUgbGV2ZWwgYm94IGdl
b21ldHJpZXMuCi0gICAgLy8gMi4gQ29tcHV0ZSB0aGUgYmFzZWxpbmUvbG9naWNhbCB0b3AgcG9z
aXRpb24gb2YgdGhlIHJvb3QgaW5saW5lIGJveC4gQWxpZ25lZCBib3hlcyBwdXNoIHRoZSByb290
IGlubGluZSBib3ggYXJvdW5kIGluc2lkZSB0aGUgbGluZSBib3guCi0gICAgLy8gMy4gRmluYWxs
eSBhbGlnbiB0aGUgaW5saW5lIGxldmVsIGJveGVzIHVzaW5nIChtb3N0bHkpIG5vcm1hbCBpbmxp
bmUgbGV2ZWwgYm94IGdlb21ldHJpZXMuCi0gICAgYXV0byBxdWlya3MgPSBmb3JtYXR0aW5nQ29u
dGV4dCgpLnF1aXJrcygpOwotICAgIGF1dG8mIHJvb3RJbmxpbmVCb3ggPSBsaW5lQm94LnJvb3RJ
bmxpbmVCb3goKTsKLQotICAgIGF1dG8gY29tcHV0ZUxpbmVCb3hMb2dpY2FsSGVpZ2h0ID0gWyZd
IHsKLSAgICAgICAgLy8gTGluZSBib3ggaGVpZ2h0IGNvbXB1dGF0aW9uIGlzIGJhc2VkIG9uIHRo
ZSBsYXlvdXQgYm91bmRzIG9mIHRoZSBpbmxpbmUgYm94ZXMgYW5kIG5vdCB0aGVpciBsb2dpY2Fs
IChhc2NlbnQvZGVzY2VudCkgZGltZW5zaW9ucy4KLSAgICAgICAgc3RydWN0IEFic29sdXRlVG9w
QW5kQm90dG9tIHsKLSAgICAgICAgICAgIElubGluZUxheW91dFVuaXQgdG9wIHsgMCB9OwotICAg
ICAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBib3R0b20geyAwIH07Ci0gICAgICAgIH07Ci0gICAg
ICAgIEhhc2hNYXA8Y29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gqLCBBYnNvbHV0ZVRvcEFu
ZEJvdHRvbT4gaW5saW5lTGV2ZWxCb3hBYnNvbHV0ZVRvcEFuZEJvdHRvbU1hcDsKLQotICAgICAg
ICBhdXRvIG1pbmltdW1Mb2dpY2FsVG9wID0gT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geyB9
OwotICAgICAgICBhdXRvIG1heGltdW1Mb2dpY2FsQm90dG9tID0gT3B0aW9uYWw8SW5saW5lTGF5
b3V0VW5pdD4geyB9OwotICAgICAgICBpZiAocXVpcmtzLmlubGluZUxldmVsQm94QWZmZWN0c0xp
bmVCb3gocm9vdElubGluZUJveCwgbGluZUJveCkpIHsKLSAgICAgICAgICAgIG1pbmltdW1Mb2dp
Y2FsVG9wID0gSW5saW5lTGF5b3V0VW5pdCB7IH07Ci0gICAgICAgICAgICBtYXhpbXVtTG9naWNh
bEJvdHRvbSA9IHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCk7Ci0gICAgICAg
ICAgICBpbmxpbmVMZXZlbEJveEFic29sdXRlVG9wQW5kQm90dG9tTWFwLmFkZCgmcm9vdElubGlu
ZUJveCwgQWJzb2x1dGVUb3BBbmRCb3R0b20geyAqbWluaW11bUxvZ2ljYWxUb3AsICptYXhpbXVt
TG9naWNhbEJvdHRvbSB9KTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpbmxpbmVMZXZl
bEJveEFic29sdXRlVG9wQW5kQm90dG9tTWFwLmFkZCgmcm9vdElubGluZUJveCwgQWJzb2x1dGVU
b3BBbmRCb3R0b20geyB9KTsKLQotICAgICAgICBWZWN0b3I8TGluZUJveDo6SW5saW5lTGV2ZWxC
b3gqPiBsaW5lQm94UmVsYXRpdmVJbmxpbmVMZXZlbEJveGVzOwotICAgICAgICBmb3IgKGF1dG8m
IGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hlcygpKSB7Ci0g
ICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsK
LSAgICAgICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5oYXNMaW5lQm94UmVsYXRpdmVBbGlnbm1l
bnQoKSkgewotICAgICAgICAgICAgICAgIGxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94ZXMu
YXBwZW5kKCZpbmxpbmVMZXZlbEJveCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBhdXRvJiBwYXJlbnRJbmxpbmVCb3ggPSBsaW5lQm94Lmlu
bGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveC5wYXJlbnQoKSk7Ci0gICAgICAgICAg
ICAvLyBMb2dpY2FsIHRvcCBpcyByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGlubGluZSBib3gncyBs
YXlvdXQgYm91bmRzLgotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbG9naWNhbCB0b3Ag
aXMgbm90IHRoZSBmaW5hbCBsb2dpY2FsIHRvcCBvZiB0aGUgaW5saW5lIGxldmVsIGJveC4KLSAg
ICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGxvZ2ljYWwgdG9wIGluIHRoZSBjb250ZXh0IG9mIHRo
ZSBsYXlvdXQgYm91bmRzIGdlb21ldHJ5IHdoaWNoIG1heSBiZSB2ZXJ5IGRpZmZlcmVudCBmcm9t
IHRoZSBpbmxpbmUgYm94J3Mgbm9ybWFsIGdlb21ldHJ5LgotICAgICAgICAgICAgYXV0byBsb2dp
Y2FsVG9wID0gSW5saW5lTGF5b3V0VW5pdCB7IH07Ci0gICAgICAgICAgICBzd2l0Y2ggKGlubGlu
ZUxldmVsQm94LnZlcnRpY2FsQWxpZ24oKSkgewotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFs
aWduOjpCYXNlbGluZTogewotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsK
LSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmxheW91dEJvdW5k
cygpLmFzY2VudCAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7Ci0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2Fs
QWxpZ246Ok1pZGRsZTogewotICAgICAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcE9mZnNldEZy
b21QYXJlbnRCYXNlbGluZSA9IGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmhlaWdodCgp
IC8gMiArIHBhcmVudElubGluZUJveC5zdHlsZSgpLmZvbnRNZXRyaWNzKCkueEhlaWdodCgpIC8g
MjsKLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmxheW91dEJv
dW5kcygpLmFzY2VudCAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7Ci0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFZlcnRp
Y2FsQWxpZ246OkJhc2VsaW5lTWlkZGxlOiB7Ci0gICAgICAgICAgICAgICAgYXV0byBsb2dpY2Fs
VG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRz
KCkuaGVpZ2h0KCkgLyAyOwotICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxp
bmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRC
YXNlbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGNhc2UgVmVydGljYWxBbGlnbjo6TGVuZ3RoOiB7Ci0gICAgICAgICAgICAgICAgYXV0byYg
c3R5bGUgPSBpbmxpbmVMZXZlbEJveC5zdHlsZSgpOwotICAgICAgICAgICAgICAgIGF1dG8gbG9n
aWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSA9IGZsb2F0VmFsdWVGb3JMZW5ndGgoc3R5
bGUudmVydGljYWxBbGlnbkxlbmd0aCgpLCBzdHlsZS5jb21wdXRlZExpbmVIZWlnaHQoKSkgKyBp
bmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0gICAgICAgICAgICAgICAgbG9n
aWNhbFRvcCA9IHBhcmVudElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBsb2dpY2Fs
VG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpUZXh0VG9wOiB7Ci0g
ICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRleHQtdG9wIGFsaWducyB3aXRoIHRoZSBpbmxp
bmUgYm94J3MgZm9udCBtZXRyaWNzIHRvcCAoYXNjZW50KSBhbmQgbm90IHRoZSBsYXlvdXQgYm91
bmRzIHRvcC4KLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94Lmxh
eW91dEJvdW5kcygpLmFzY2VudCAtIHBhcmVudElubGluZUJveC5iYXNlbGluZSgpOwotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNh
bEFsaWduOjpUZXh0Qm90dG9tOiB7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRleHQt
Ym90dG9tIGFsaWducyB3aXRoIHRoZSBpbmxpbmUgYm94J3MgZm9udCBtZXRyaWNzIGJvdHRvbSAo
ZGVzY2VudCkgYW5kIG5vdCB0aGUgbGF5b3V0IGJvdW5kcyBib3R0b20uCi0gICAgICAgICAgICAg
ICAgYXV0byBwYXJlbnRJbmxpbmVCb3hMYXlvdXRCb3VuZHMgPSBwYXJlbnRJbmxpbmVCb3gubGF5
b3V0Qm91bmRzKCk7Ci0gICAgICAgICAgICAgICAgYXV0byBwYXJlbnRJbmxpbmVCb3hMb2dpY2Fs
Qm90dG9tID0gcGFyZW50SW5saW5lQm94TGF5b3V0Qm91bmRzLmhlaWdodCgpIC0gcGFyZW50SW5s
aW5lQm94TGF5b3V0Qm91bmRzLmRlc2NlbnQgKyBwYXJlbnRJbmxpbmVCb3guZGVzY2VudCgpLnZh
bHVlT3IoSW5saW5lTGF5b3V0VW5pdCgpKTsKLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0g
cGFyZW50SW5saW5lQm94TG9naWNhbEJvdHRvbSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5k
cygpLmhlaWdodCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX0lNUExFTUVOVEVE
X1lFVCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgYXV0byBwYXJlbnRJbmxpbmVCb3hBYnNvbHV0ZVRvcEFuZEJvdHRvbSA9IGlubGluZUxldmVs
Qm94QWJzb2x1dGVUb3BBbmRCb3R0b21NYXAuZ2V0KCZwYXJlbnRJbmxpbmVCb3gpOwotICAgICAg
ICAgICAgYXV0byBhYnNvbHV0ZUxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxpbmVCb3hBYnNvbHV0ZVRv
cEFuZEJvdHRvbS50b3AgKyBsb2dpY2FsVG9wOwotICAgICAgICAgICAgYXV0byBhYnNvbHV0ZUxv
Z2ljYWxCb3R0b20gPSBhYnNvbHV0ZUxvZ2ljYWxUb3AgKyBpbmxpbmVMZXZlbEJveC5sYXlvdXRC
b3VuZHMoKS5oZWlnaHQoKTsKLSAgICAgICAgICAgIGlubGluZUxldmVsQm94QWJzb2x1dGVUb3BB
bmRCb3R0b21NYXAuYWRkKCZpbmxpbmVMZXZlbEJveCwgQWJzb2x1dGVUb3BBbmRCb3R0b20geyBh
YnNvbHV0ZUxvZ2ljYWxUb3AsIGFic29sdXRlTG9naWNhbEJvdHRvbSB9KTsKLSAgICAgICAgICAg
IC8vIFN0cmV0Y2ggdGhlIG1pbi9tYXggYWJzb2x1dGUgdmFsdWVzIGlmIGFwcGxpY2FibGUuCi0g
ICAgICAgICAgICBpZiAocXVpcmtzLmlubGluZUxldmVsQm94QWZmZWN0c0xpbmVCb3goaW5saW5l
TGV2ZWxCb3gsIGxpbmVCb3gpKSB7Ci0gICAgICAgICAgICAgICAgbWluaW11bUxvZ2ljYWxUb3Ag
PSBzdGQ6Om1pbihtaW5pbXVtTG9naWNhbFRvcC52YWx1ZU9yKGFic29sdXRlTG9naWNhbFRvcCks
IGFic29sdXRlTG9naWNhbFRvcCk7Ci0gICAgICAgICAgICAgICAgbWF4aW11bUxvZ2ljYWxCb3R0
b20gPSBzdGQ6Om1heChtYXhpbXVtTG9naWNhbEJvdHRvbS52YWx1ZU9yKGFic29sdXRlTG9naWNh
bEJvdHRvbSksIGFic29sdXRlTG9naWNhbEJvdHRvbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICAgICAgLy8gVGhlIGxpbmUgYm94IGhlaWdodCBjb21wdXRhdGlvbiBpcyBhcyBmb2xs
b3dzOgotICAgICAgICAvLyAxLiBTdHJldGNoIHRoZSBsaW5lIGJveCB3aXRoIHRoZSBub24tbGlu
ZS1ib3ggcmVsYXRpdmUgYWxpZ25lZCBpbmxpbmUgYm94IGFic29sdXRlIHRvcCBhbmQgYm90dG9t
IHZhbHVlcy4KLSAgICAgICAgLy8gMi4gQ2hlY2sgaWYgdGhlIGxpbmUgYm94IHJlbGF0aXZlIGFs
aWduZWQgaW5saW5lIGJveGVzICh0b3AsIGJvdHRvbSBldGMpIGhhdmUgZW5vdWdoIHJvb20gYW5k
IHN0cmV0Y2ggdGhlIGxpbmUgYm94IGZ1cnRoZXIgaWYgbmVlZGVkLgotICAgICAgICBhdXRvIGxp
bmVCb3hMb2dpY2FsSGVpZ2h0ID0gbWF4aW11bUxvZ2ljYWxCb3R0b20udmFsdWVPcihJbmxpbmVM
YXlvdXRVbml0KCkpIC0gbWluaW11bUxvZ2ljYWxUb3AudmFsdWVPcihJbmxpbmVMYXlvdXRVbml0
KCkpOwotICAgICAgICBmb3IgKGF1dG8qIGxpbmVCb3hSZWxhdGl2ZUlubGluZUxldmVsQm94IDog
bGluZUJveFJlbGF0aXZlSW5saW5lTGV2ZWxCb3hlcykgewotICAgICAgICAgICAgaWYgKCFxdWly
a3MuaW5saW5lTGV2ZWxCb3hBZmZlY3RzTGluZUJveCgqbGluZUJveFJlbGF0aXZlSW5saW5lTGV2
ZWxCb3gsIGxpbmVCb3gpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
bGluZUJveExvZ2ljYWxIZWlnaHQgPSBzdGQ6Om1heChsaW5lQm94TG9naWNhbEhlaWdodCwgbGlu
ZUJveFJlbGF0aXZlSW5saW5lTGV2ZWxCb3gtPmxheW91dEJvdW5kcygpLmhlaWdodCgpKTsKLSAg
ICAgICAgfQotICAgICAgICBsaW5lQm94LnNldExvZ2ljYWxIZWlnaHQobGluZUJveExvZ2ljYWxI
ZWlnaHQpOwotICAgIH07Ci0gICAgY29tcHV0ZUxpbmVCb3hMb2dpY2FsSGVpZ2h0KCk7Ci0KLSAg
ICBhdXRvIGNvbXB1dGVSb290SW5saW5lQm94VmVydGljYWxQb3NpdGlvbiA9IFsmXSB7Ci0gICAg
ICAgIEhhc2hNYXA8Y29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gqLCBJbmxpbmVMYXlvdXRV
bml0PiBpbmxpbmVMZXZlbEJveEFic29sdXRlQmFzZWxpbmVPZmZzZXRNYXA7Ci0gICAgICAgIGlu
bGluZUxldmVsQm94QWJzb2x1dGVCYXNlbGluZU9mZnNldE1hcC5hZGQoJnJvb3RJbmxpbmVCb3gs
IElubGluZUxheW91dFVuaXQgeyB9KTsKLQotICAgICAgICBhdXRvIG1heGltdW1Ub3BPZmZzZXRG
cm9tUm9vdElubGluZUJveEJhc2VsaW5lID0gT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4geyB9
OwotICAgICAgICBpZiAocXVpcmtzLmlubGluZUxldmVsQm94QWZmZWN0c0xpbmVCb3gocm9vdElu
bGluZUJveCwgbGluZUJveCkpCi0gICAgICAgICAgICBtYXhpbXVtVG9wT2Zmc2V0RnJvbVJvb3RJ
bmxpbmVCb3hCYXNlbGluZSA9IHJvb3RJbmxpbmVCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50Owot
Ci0gICAgICAgIGZvciAoYXV0byYgaW5saW5lTGV2ZWxCb3ggOiBsaW5lQm94Lm5vblJvb3RJbmxp
bmVMZXZlbEJveGVzKCkpIHsKLSAgICAgICAgICAgIGF1dG8gYWJzb2x1dGVCYXNlbGluZU9mZnNl
dCA9IElubGluZUxheW91dFVuaXQgeyB9OwotICAgICAgICAgICAgaWYgKCFpbmxpbmVMZXZlbEJv
eC5oYXNMaW5lQm94UmVsYXRpdmVBbGlnbm1lbnQoKSkgewotICAgICAgICAgICAgICAgIGF1dG8m
IGxheW91dEJveCA9IGlubGluZUxldmVsQm94LmxheW91dEJveCgpOwotICAgICAgICAgICAgICAg
IGF1dG8mIHBhcmVudElubGluZUJveCA9IGxpbmVCb3guaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRC
b3gobGF5b3V0Qm94LnBhcmVudCgpKTsKLSAgICAgICAgICAgICAgICBhdXRvIGJhc2VsaW5lT2Zm
c2V0RnJvbVBhcmVudEJhc2VsaW5lID0gSW5saW5lTGF5b3V0VW5pdCB7IH07Ci0KLSAgICAgICAg
ICAgICAgICBzd2l0Y2ggKGlubGluZUxldmVsQm94LnZlcnRpY2FsQWxpZ24oKSkgewotICAgICAg
ICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmU6Ci0gICAgICAgICAgICAgICAg
ICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0geyB9OwotICAgICAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246Ok1pZGRs
ZTogewotICAgICAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50
QmFzZWxpbmUgPSAoaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuaGVpZ2h0KCkgLyAyICsg
cGFyZW50SW5saW5lQm94LnN0eWxlKCkuZm9udE1ldHJpY3MoKS54SGVpZ2h0KCkgLyAyKTsKLSAg
ICAgICAgICAgICAgICAgICAgYmFzZWxpbmVPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmUgPSBsb2dp
Y2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lIC0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91
bmRzKCkuYXNjZW50OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZU1pZGRsZTog
ewotICAgICAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFz
ZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5oZWlnaHQoKSAvIDI7Ci0gICAg
ICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gbG9naWNh
bFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5k
cygpLmFzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6TGVuZ3RoOiB7Ci0gICAgICAg
ICAgICAgICAgICAgIGF1dG8mIHN0eWxlID0gaW5saW5lTGV2ZWxCb3guc3R5bGUoKTsKLSAgICAg
ICAgICAgICAgICAgICAgYXV0byB2ZXJ0aWNhbEFsaWduT2Zmc2V0ID0gZmxvYXRWYWx1ZUZvckxl
bmd0aChzdHlsZS52ZXJ0aWNhbEFsaWduTGVuZ3RoKCksIHN0eWxlLmNvbXB1dGVkTGluZUhlaWdo
dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVu
dEJhc2VsaW5lID0gdmVydGljYWxBbGlnbk9mZnNldCArIGlubGluZUxldmVsQm94LmJhc2VsaW5l
KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5l
ID0gbG9naWNhbFRvcE9mZnNldEZyb21QYXJlbnRCYXNlbGluZSAtIGlubGluZUxldmVsQm94LmJh
c2VsaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246OlRleHRUb3A6Ci0gICAgICAgICAg
ICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gcGFyZW50SW5saW5l
Qm94LmJhc2VsaW5lKCkgLSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0g
ICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxB
bGlnbjo6VGV4dEJvdHRvbToKLSAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmVPZmZzZXRGcm9t
UGFyZW50QmFzZWxpbmUgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5kZXNjZW50IC0g
KnBhcmVudElubGluZUJveC5kZXNjZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVF9OT1Rf
SU1QTEVNRU5URURfWUVUKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICBhYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0ID0gaW5saW5l
TGV2ZWxCb3hBYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0TWFwLmdldCgmcGFyZW50SW5saW5lQm94KSAr
IGJhc2VsaW5lT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgICBzd2l0Y2ggKGlubGluZUxldmVsQm94LnZlcnRpY2FsQWxpZ24oKSkg
ewotICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6VG9wOiB7Ci0gICAgICAgICAg
ICAgICAgICAgIGFic29sdXRlQmFzZWxpbmVPZmZzZXQgPSByb290SW5saW5lQm94LmxheW91dEJv
dW5kcygpLmFzY2VudCAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsKLSAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIGNhc2UgVmVydGljYWxBbGlnbjo6Qm90dG9tOiB7Ci0gICAgICAgICAgICAgICAgICAgIGFi
c29sdXRlQmFzZWxpbmVPZmZzZXQgPSBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5kZXNj
ZW50IC0gcm9vdElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5kZXNjZW50OwotICAgICAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVmYXVs
dDoKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKLSAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICAgICAgaW5saW5lTGV2ZWxCb3hBYnNvbHV0ZUJhc2VsaW5lT2Zmc2V0TWFwLmFk
ZCgmaW5saW5lTGV2ZWxCb3gsIGFic29sdXRlQmFzZWxpbmVPZmZzZXQpOwotICAgICAgICAgICAg
YXV0byBhZmZlY3RzUm9vdElubGluZUJveFZlcnRpY2FsUG9zaXRpb24gPSBxdWlya3MuaW5saW5l
TGV2ZWxCb3hBZmZlY3RzTGluZUJveChpbmxpbmVMZXZlbEJveCwgbGluZUJveCk7Ci0gICAgICAg
ICAgICBpZiAoYWZmZWN0c1Jvb3RJbmxpbmVCb3hWZXJ0aWNhbFBvc2l0aW9uKSB7Ci0gICAgICAg
ICAgICAgICAgYXV0byB0b3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2VsaW5lID0gYWJzb2x1
dGVCYXNlbGluZU9mZnNldCArIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmFzY2VudDsK
LSAgICAgICAgICAgICAgICBpZiAobWF4aW11bVRvcE9mZnNldEZyb21Sb290SW5saW5lQm94QmFz
ZWxpbmUpCi0gICAgICAgICAgICAgICAgICAgIG1heGltdW1Ub3BPZmZzZXRGcm9tUm9vdElubGlu
ZUJveEJhc2VsaW5lID0gc3RkOjptYXgoKm1heGltdW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJv
eEJhc2VsaW5lLCB0b3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2VsaW5lKTsKLSAgICAgICAg
ICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGlzIHF1aXJrIG1v
ZGUgYW5kIHRoZSByb290IGlubGluZSBib3ggaGFzIG5vIGNvbnRlbnQuIFRoZSByb290IGlubGlu
ZSBib3gncyBiYXNlbGluZSBpcyBhbmNob3JlZCBhdCAwLgotICAgICAgICAgICAgICAgICAgICAv
LyBIb3dldmVyIG5lZ2F0aXZlIGFzY2VudCAoZS5nIG5lZ2F0aXZlIHRvcCBtYXJnaW4pIGNhbiAi
cHVzaCIgdGhlIHJvb3QgaW5saW5lIGJveCB1cHdhcmRzIGFuZCBoYXZlIGEgbmVnYXRpdmUgdmFs
dWUuCi0gICAgICAgICAgICAgICAgICAgIG1heGltdW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJv
eEJhc2VsaW5lID0gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50ID49IDAKLSAg
ICAgICAgICAgICAgICAgICAgICAgID8gc3RkOjptYXgoMC4wZiwgdG9wT2Zmc2V0RnJvbVJvb3RJ
bmxpbmVCb3hCYXNlbGluZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogdG9wT2Zmc2V0RnJv
bVJvb3RJbmxpbmVCb3hCYXNlbGluZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgYXV0byByb290SW5saW5lQm94TG9naWNhbFRvcCA9IG1heGlt
dW1Ub3BPZmZzZXRGcm9tUm9vdElubGluZUJveEJhc2VsaW5lLnZhbHVlT3IoMC5mKSAtIHJvb3RJ
bmxpbmVCb3guYmFzZWxpbmUoKTsKLSAgICAgICAgcm9vdElubGluZUJveC5zZXRMb2dpY2FsVG9w
KHJvb3RJbmxpbmVCb3hMb2dpY2FsVG9wKTsKLSAgICB9OwotICAgIGNvbXB1dGVSb290SW5saW5l
Qm94VmVydGljYWxQb3NpdGlvbigpOwotCi0gICAgYXV0byBhbGlnbklubGluZUxldmVsQm94ZXMg
PSBbJl0gewotICAgICAgICBmb3IgKGF1dG8mIGlubGluZUxldmVsQm94IDogbGluZUJveC5ub25S
b290SW5saW5lTGV2ZWxCb3hlcygpKSB7Ci0gICAgICAgICAgICBhdXRvJiBsYXlvdXRCb3ggPSBp
bmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKTsKLSAgICAgICAgICAgIGF1dG8mIHBhcmVudElubGlu
ZUJveCA9IGxpbmVCb3guaW5saW5lTGV2ZWxCb3hGb3JMYXlvdXRCb3gobGF5b3V0Qm94LnBhcmVu
dCgpKTsKLSAgICAgICAgICAgIGF1dG8gbG9naWNhbFRvcCA9IElubGluZUxheW91dFVuaXQgeyB9
OwotICAgICAgICAgICAgc3dpdGNoIChpbmxpbmVMZXZlbEJveC52ZXJ0aWNhbEFsaWduKCkpIHsK
LSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6QmFzZWxpbmU6Ci0gICAgICAgICAgICAg
ICAgbG9naWNhbFRvcCA9IHBhcmVudElubGluZUJveC5iYXNlbGluZSgpIC0gaW5saW5lTGV2ZWxC
b3guYmFzZWxpbmUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2Ug
VmVydGljYWxBbGlnbjo6TWlkZGxlOiB7Ci0gICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9w
T2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lID0gKGlubGluZUxldmVsQm94LmxvZ2ljYWxIZWlnaHQo
KSAvIDIgKyBwYXJlbnRJbmxpbmVCb3guc3R5bGUoKS5mb250TWV0cmljcygpLnhIZWlnaHQoKSAv
IDIpOwotICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBwYXJlbnRJbmxpbmVCb3guYmFzZWxp
bmUoKSAtIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFyZW50QmFzZWxpbmU7Ci0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ246
OkJhc2VsaW5lTWlkZGxlOiB7Ci0gICAgICAgICAgICAgICAgYXV0byBsb2dpY2FsVG9wT2Zmc2V0
RnJvbVBhcmVudEJhc2VsaW5lID0gaW5saW5lTGV2ZWxCb3gubG9naWNhbEhlaWdodCgpIC8gMjsK
LSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmJhc2VsaW5lKCkg
LSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpMZW5n
dGg6IHsKLSAgICAgICAgICAgICAgICBhdXRvJiBzdHlsZSA9IGlubGluZUxldmVsQm94LnN0eWxl
KCk7Ci0gICAgICAgICAgICAgICAgYXV0byB2ZXJ0aWNhbEFsaWduT2Zmc2V0ID0gZmxvYXRWYWx1
ZUZvckxlbmd0aChzdHlsZS52ZXJ0aWNhbEFsaWduTGVuZ3RoKCksIHN0eWxlLmNvbXB1dGVkTGlu
ZUhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWxUb3BPZmZzZXRGcm9tUGFy
ZW50QmFzZWxpbmUgPSB2ZXJ0aWNhbEFsaWduT2Zmc2V0ICsgaW5saW5lTGV2ZWxCb3guYmFzZWxp
bmUoKTsKLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5saW5lQm94LmJhc2Vs
aW5lKCkgLSBsb2dpY2FsVG9wT2Zmc2V0RnJvbVBhcmVudEJhc2VsaW5lOwotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0ICh0ZXh0
KXRvcC9ib3R0b20gYWxpZ24gdGhlaXIgbGF5b3V0IGJvdW5kcy4KLSAgICAgICAgICAgIGNhc2Ug
VmVydGljYWxBbGlnbjo6VGV4dFRvcDoKLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gaW5s
aW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gaW5saW5lTGV2ZWxCb3guYmFzZWxp
bmUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVmVydGljYWxB
bGlnbjo6VGV4dEJvdHRvbToKLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gcGFyZW50SW5s
aW5lQm94LmxvZ2ljYWxIZWlnaHQoKSAtIGlubGluZUxldmVsQm94LmxheW91dEJvdW5kcygpLmRl
c2NlbnQgLSBpbmxpbmVMZXZlbEJveC5iYXNlbGluZSgpOwotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduOjpUb3A6Ci0gICAgICAgICAgICAgICAg
Ly8gTm90ZSB0aGF0IHRoaXMgbG9naWNhbCB0b3AgaXMgbm90IHJlbGF0aXZlIHRvIHRoZSBwYXJl
bnQgaW5saW5lIGJveC4KLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gaW5saW5lTGV2ZWxC
b3gubGF5b3V0Qm91bmRzKCkuYXNjZW50IC0gaW5saW5lTGV2ZWxCb3guYmFzZWxpbmUoKTsKLSAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbjo6Qm90
dG9tOgotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGxvZ2ljYWwgdG9wIGlzIG5v
dCByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGlubGluZSBib3guCi0gICAgICAgICAgICAgICAgbG9n
aWNhbFRvcCA9IGxpbmVCb3gubG9naWNhbEhlaWdodCgpIC0gaW5saW5lTGV2ZWxCb3gubGF5b3V0
Qm91bmRzKCkuZGVzY2VudCAtIGlubGluZUxldmVsQm94LmJhc2VsaW5lKCk7Ci0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFTU0VS
VF9OT1RfSU1QTEVNRU5URURfWUVUKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBpbmxpbmVMZXZlbEJveC5zZXRMb2dpY2FsVG9wKGxvZ2ljYWxU
b3ApOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBhbGlnbklubGluZUxldmVsQm94ZXMoKTsKLX0K
LQotTGluZUJveEJ1aWxkZXI6OlNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdubWVudDo6U2ltcGxpZmll
ZFZlcnRpY2FsQWxpZ25tZW50KGNvbnN0IExpbmVCb3g6OklubGluZUxldmVsQm94JiByb290SW5s
aW5lQm94KQotICAgIDogbV9yb290SW5saW5lQm94KHJvb3RJbmxpbmVCb3gpCi17Ci0gICAgYWRq
dXN0KHJvb3RJbmxpbmVCb3gpOwotfQotCi1ib29sIExpbmVCb3hCdWlsZGVyOjpTaW1wbGlmaWVk
VmVydGljYWxBbGlnbm1lbnQ6OmNhblVzZVNpbXBsaWZpZWRBbGlnbm1lbnQoY29uc3QgTGluZUJv
eDo6SW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVCb3gsIGNvbnN0IExpbmVCb3g6OklubGluZUxl
dmVsQm94JiBpbmxpbmVMZXZlbEJveCwgT3B0aW9uYWw8Y29uc3QgQm94R2VvbWV0cnk+IGlubGlu
ZUxldmVsQm94R2VvbWV0cnkpCi17Ci0gICAgaWYgKGlubGluZUxldmVsQm94LmlzQXRvbWljSW5s
aW5lTGV2ZWxCb3goKSkgewotICAgICAgICBBU1NFUlQoaW5saW5lTGV2ZWxCb3hHZW9tZXRyeSk7
Ci0gICAgICAgIC8vIEJhc2VsaW5lIGFsaWduZWQsIG5vbi1zdHJldGNoeSBkaXJlY3QgY2hpbGRy
ZW4gYXJlIGNvbnNpZGVyZWQgdG8gYmUgc2ltcGxlIGZvciBub3cuCi0gICAgICAgIGF1dG8mIGxh
eW91dEJveCA9IGlubGluZUxldmVsQm94LmxheW91dEJveCgpOwotICAgICAgICByZXR1cm4gJmxh
eW91dEJveC5wYXJlbnQoKSA9PSAmcm9vdElubGluZUJveC5sYXlvdXRCb3goKQotICAgICAgICAg
ICAgJiYgbGF5b3V0Qm94LnN0eWxlKCkudmVydGljYWxBbGlnbigpID09IFZlcnRpY2FsQWxpZ246
OkJhc2VsaW5lCi0gICAgICAgICAgICAmJiAhaW5saW5lTGV2ZWxCb3hHZW9tZXRyeS0+bWFyZ2lu
QmVmb3JlKCkKLSAgICAgICAgICAgICYmICFpbmxpbmVMZXZlbEJveEdlb21ldHJ5LT5tYXJnaW5B
ZnRlcigpCi0gICAgICAgICAgICAmJiBpbmxpbmVMZXZlbEJveEdlb21ldHJ5LT5tYXJnaW5Cb3hI
ZWlnaHQoKSA8PSByb290SW5saW5lQm94LmJhc2VsaW5lKCk7Ci0gICAgfQotICAgIGlmIChpbmxp
bmVMZXZlbEJveC5pc0xpbmVCcmVha0JveCgpKSB7Ci0gICAgICAgIC8vIEJhc2VsaW5lIGFsaWdu
ZWQsIG5vbi1zdHJldGNoeSBsaW5lIGJyZWFrcyBlLmcuIDxkaXY+PHNwYW4+PGJyPjwvc3Bhbj48
L2Rpdj4gYnV0IG5vdCA8ZGl2PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwMHB4OyI+PGJyPjwv
c3Bhbj48L2Rpdj4uCi0gICAgICAgIHJldHVybiBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKS5z
dHlsZSgpLnZlcnRpY2FsQWxpZ24oKSA9PSBWZXJ0aWNhbEFsaWduOjpCYXNlbGluZSAmJiBpbmxp
bmVMZXZlbEJveC5iYXNlbGluZSgpIDw9IHJvb3RJbmxpbmVCb3guYmFzZWxpbmUoKTsKLSAgICB9
Ci0gICAgaWYgKGlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkpIHsKLSAgICAgICAgLy8gQmFz
ZWxpbmUgYWxpZ25lZCwgbm9uLXN0cmV0Y2h5IGlubGluZSBib3hlcyBlLmcuIDxkaXY+PHNwYW4+
PC9zcGFuPjwvZGl2PiBidXQgbm90IDxkaXY+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTAwcHg7
Ij48L3NwYW4+PC9kaXY+LgotICAgICAgICByZXR1cm4gaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm94
KCkuc3R5bGUoKS52ZXJ0aWNhbEFsaWduKCkgPT0gVmVydGljYWxBbGlnbjo6QmFzZWxpbmUgJiYg
aW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRzKCkgPT0gcm9vdElubGluZUJveC5sYXlvdXRCb3Vu
ZHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIExpbmVCb3hCdWlsZGVy
OjpTaW1wbGlmaWVkVmVydGljYWxBbGlnbm1lbnQ6OmFsaWduKExpbmVCb3g6OklubGluZUxldmVs
Qm94JiBpbmxpbmVMZXZlbEJveCkKLXsKLSAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNBdG9taWNJ
bmxpbmVMZXZlbEJveCgpIHx8IGlubGluZUxldmVsQm94LmlzTGluZUJyZWFrQm94KCkgfHwgaW5s
aW5lTGV2ZWxCb3guaXNJbmxpbmVCb3goKSkgewotICAgICAgICAvLyBPbmx5IGJhc2VsaW5lIGFs
aWdubWVudCBmb3Igbm93LgotICAgICAgICBpbmxpbmVMZXZlbEJveC5zZXRMb2dpY2FsVG9wKG1f
cm9vdElubGluZUJveC5iYXNlbGluZSgpIC0gaW5saW5lTGV2ZWxCb3guYmFzZWxpbmUoKSk7Ci0g
ICAgICAgIGFkanVzdChpbmxpbmVMZXZlbEJveCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0g
ICAgQVNTRVJUX05PVF9JTVBMRU1FTlRFRF9ZRVQoKTsKLX0KLQotdm9pZCBMaW5lQm94QnVpbGRl
cjo6U2ltcGxpZmllZFZlcnRpY2FsQWxpZ25tZW50OjphZGp1c3QoY29uc3QgTGluZUJveDo6SW5s
aW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94KQotewotICAgIGF1dG8gbGF5b3V0Qm91bmRzTG9n
aWNhbFRvcCA9IG1fcm9vdElubGluZUJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQgLSBpbmxpbmVM
ZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5hc2NlbnQ7Ci0gICAgbV9saW5lQm94TG9naWNhbFRvcCA9
IHN0ZDo6bWluKG1fbGluZUJveExvZ2ljYWxUb3AsIGxheW91dEJvdW5kc0xvZ2ljYWxUb3ApOwot
ICAgIG1fbGluZUJveExvZ2ljYWxCb3R0b20gPSBzdGQ6Om1heChtX2xpbmVCb3hMb2dpY2FsQm90
dG9tLCBsYXlvdXRCb3VuZHNMb2dpY2FsVG9wICsgaW5saW5lTGV2ZWxCb3gubGF5b3V0Qm91bmRz
KCkuaGVpZ2h0KCkpOwotICAgIG1fcm9vdElubGluZUJveExvZ2ljYWxUb3AgPSBzdGQ6Om1heCht
X3Jvb3RJbmxpbmVCb3hMb2dpY2FsVG9wLCBpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMoKS5h
c2NlbnQgLSBtX3Jvb3RJbmxpbmVCb3guYmFzZWxpbmUoKSk7Ci19Ci0KLUxpbmVCb3ggSW5saW5l
Rm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjpsaW5lQm94Rm9yTGluZUNvbnRlbnQoY29uc3Qg
TGluZUJ1aWxkZXI6OkxpbmVDb250ZW50JiBsaW5lQ29udGVudCkKLXsKLSAgICByZXR1cm4gTGlu
ZUJveEJ1aWxkZXIoZm9ybWF0dGluZ0NvbnRleHQoKSkuYnVpbGQobGluZUNvbnRlbnQpOwotfQot
Ci1JbmxpbmVMYXlvdXRVbml0IElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6bG9n
aWNhbFRvcEZvck5leHRMaW5lKGNvbnN0IExpbmVCdWlsZGVyOjpMaW5lQ29udGVudCYgbGluZUNv
bnRlbnQsIElubGluZUxheW91dFVuaXQgcHJldmlvdXNMaW5lTG9naWNhbEJvdHRvbSwgY29uc3Qg
RmxvYXRpbmdDb250ZXh0JiBmbG9hdGluZ0NvbnRleHQpIGNvbnN0Ci17Ci0gICAgLy8gTm9ybWFs
bHkgdGhlIG5leHQgbGluZSdzIGxvZ2ljYWwgdG9wIGlzIHRoZSBwcmV2aW91cyBsaW5lJ3MgbG9n
aWNhbCBib3R0b20sIGJ1dCB3aGVuIHRoZSBsaW5lIGVuZHMKLSAgICAvLyB3aXRoIHRoZSBjbGVh
ciBwcm9wZXJ0eSBzZXQsIHRoZSBuZXh0IGxpbmUgbmVlZHMgdG8gY2xlYXIgdGhlIGV4aXN0aW5n
IGZsb2F0cy4KLSAgICBpZiAobGluZUNvbnRlbnQucnVucy5pc0VtcHR5KCkpCi0gICAgICAgIHJl
dHVybiBwcmV2aW91c0xpbmVMb2dpY2FsQm90dG9tOwotICAgIGF1dG8mIGxhc3RSdW5MYXlvdXRC
b3ggPSBsaW5lQ29udGVudC5ydW5zLmxhc3QoKS5sYXlvdXRCb3goKTsgCi0gICAgaWYgKGxhc3RS
dW5MYXlvdXRCb3guc3R5bGUoKS5jbGVhcigpID09IENsZWFyOjpOb25lKQotICAgICAgICByZXR1
cm4gcHJldmlvdXNMaW5lTG9naWNhbEJvdHRvbTsKLSAgICBhdXRvIHBvc2l0aW9uV2l0aENsZWFy
YW5jZSA9IGZsb2F0aW5nQ29udGV4dC52ZXJ0aWNhbFBvc2l0aW9uV2l0aENsZWFyYW5jZShsYXN0
UnVuTGF5b3V0Qm94KTsKLSAgICBpZiAoIXBvc2l0aW9uV2l0aENsZWFyYW5jZSkKLSAgICAgICAg
cmV0dXJuIHByZXZpb3VzTGluZUxvZ2ljYWxCb3R0b207Ci0gICAgcmV0dXJuIHN0ZDo6bWF4KHBy
ZXZpb3VzTGluZUxvZ2ljYWxCb3R0b20sIElubGluZUxheW91dFVuaXQocG9zaXRpb25XaXRoQ2xl
YXJhbmNlLT5wb3NpdGlvbikpOwotfQotCi1Db250ZW50V2lkdGhBbmRNYXJnaW4gSW5saW5lRm9y
bWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5OjppbmxpbmVCbG9ja0NvbnRlbnRXaWR0aEFuZE1hcmdp
bihjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgY29uc3QgSG9yaXpvbnRhbENvbnN0
cmFpbnRzJiBob3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IE92ZXJyaWRkZW5Ib3Jpem9udGFs
VmFsdWVzJiBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVlcykKLXsKLSAgICBBU1NFUlQoZm9ybWF0
dGluZ0NvbnRleHRSb290LmlzSW5GbG93KCkpOwotCi0gICAgLy8gMTAuMy4xMCAnSW5saW5lLWJs
b2NrJywgcmVwbGFjZWQgZWxlbWVudHMgaW4gbm9ybWFsIGZsb3cKLQotICAgIC8vIEV4YWN0bHkg
YXMgaW5saW5lIHJlcGxhY2VkIGVsZW1lbnRzLgotICAgIGlmIChmb3JtYXR0aW5nQ29udGV4dFJv
b3QuaXNSZXBsYWNlZEJveCgpKQotICAgICAgICByZXR1cm4gaW5saW5lUmVwbGFjZWRDb250ZW50
V2lkdGhBbmRNYXJnaW4oZG93bmNhc3Q8UmVwbGFjZWRCb3g+KGZvcm1hdHRpbmdDb250ZXh0Um9v
dCksIGhvcml6b250YWxDb25zdHJhaW50cywgeyB9LCBvdmVycmlkZGVuSG9yaXpvbnRhbFZhbHVl
cyk7Ci0KLSAgICAvLyAxMC4zLjkgJ0lubGluZS1ibG9jaycsIG5vbi1yZXBsYWNlZCBlbGVtZW50
cyBpbiBub3JtYWwgZmxvdwotCi0gICAgLy8gSWYgJ3dpZHRoJyBpcyAnYXV0bycsIHRoZSB1c2Vk
IHZhbHVlIGlzIHRoZSBzaHJpbmstdG8tZml0IHdpZHRoIGFzIGZvciBmbG9hdGluZyBlbGVtZW50
cy4KLSAgICAvLyBBIGNvbXB1dGVkIHZhbHVlIG9mICdhdXRvJyBmb3IgJ21hcmdpbi1sZWZ0JyBv
ciAnbWFyZ2luLXJpZ2h0JyBiZWNvbWVzIGEgdXNlZCB2YWx1ZSBvZiAnMCcuCi0gICAgLy8gIzEK
LSAgICBhdXRvIHdpZHRoID0gY29tcHV0ZWRWYWx1ZShmb3JtYXR0aW5nQ29udGV4dFJvb3Quc3R5
bGUoKS5sb2dpY2FsV2lkdGgoKSwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aCk7
Ci0gICAgaWYgKCF3aWR0aCkKLSAgICAgICAgd2lkdGggPSBzaHJpbmtUb0ZpdFdpZHRoKGZvcm1h
dHRpbmdDb250ZXh0Um9vdCwgaG9yaXpvbnRhbENvbnN0cmFpbnRzLmxvZ2ljYWxXaWR0aCk7Ci0K
LSAgICAvLyAjMgotICAgIGF1dG8gY29tcHV0ZWRIb3Jpem9udGFsTWFyZ2luID0gR2VvbWV0cnk6
OmNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbihmb3JtYXR0aW5nQ29udGV4dFJvb3QsIGhvcml6b250
YWxDb25zdHJhaW50cyk7Ci0KLSAgICByZXR1cm4gQ29udGVudFdpZHRoQW5kTWFyZ2luIHsgKndp
ZHRoLCB7IGNvbXB1dGVkSG9yaXpvbnRhbE1hcmdpbi5zdGFydC52YWx1ZU9yKDBfbHUpLCBjb21w
dXRlZEhvcml6b250YWxNYXJnaW4uZW5kLnZhbHVlT3IoMF9sdSkgfSB9OwotfQotCi1Db250ZW50
SGVpZ2h0QW5kTWFyZ2luIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6aW5saW5l
QmxvY2tDb250ZW50SGVpZ2h0QW5kTWFyZ2luKGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBI
b3Jpem9udGFsQ29uc3RyYWludHMmIGhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgT3ZlcnJp
ZGRlblZlcnRpY2FsVmFsdWVzJiBvdmVycmlkZGVuVmVydGljYWxWYWx1ZXMpIGNvbnN0Ci17Ci0g
ICAgQVNTRVJUKGxheW91dEJveC5pc0luRmxvdygpKTsKLQotICAgIC8vIDEwLjYuMiBJbmxpbmUg
cmVwbGFjZWQgZWxlbWVudHMsIGJsb2NrLWxldmVsIHJlcGxhY2VkIGVsZW1lbnRzIGluIG5vcm1h
bCBmbG93LCAnaW5saW5lLWJsb2NrJyByZXBsYWNlZCBlbGVtZW50cyBpbiBub3JtYWwgZmxvdyBh
bmQgZmxvYXRpbmcgcmVwbGFjZWQgZWxlbWVudHMKLSAgICBpZiAobGF5b3V0Qm94LmlzUmVwbGFj
ZWRCb3goKSkKLSAgICAgICAgcmV0dXJuIGlubGluZVJlcGxhY2VkQ29udGVudEhlaWdodEFuZE1h
cmdpbihkb3duY2FzdDxSZXBsYWNlZEJveD4obGF5b3V0Qm94KSwgaG9yaXpvbnRhbENvbnN0cmFp
bnRzLCB7IH0sIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci0KLSAgICAvLyAxMC42LjYgQ29t
cGxpY2F0ZWQgY2FzZXMKLSAgICAvLyAtICdJbmxpbmUtYmxvY2snLCBub24tcmVwbGFjZWQgZWxl
bWVudHMuCi0gICAgcmV0dXJuIGNvbXBsaWNhdGVkQ2FzZXMobGF5b3V0Qm94LCBob3Jpem9udGFs
Q29uc3RyYWludHMsIG92ZXJyaWRkZW5WZXJ0aWNhbFZhbHVlcyk7Ci19Ci0KLX0KLX0KLQotI2Vu
ZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0NvbnRleHRRdWlya3MuY3BwIGIvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggOTFiZTY1ZGFkNWNjNWY1NmIyOWViMDcwM2U2Y2RjOTQzOTBhYzJhNy4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ0Nv
bnRleHRRdWlya3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgot
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
LSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSW5saW5lRm9ybWF0dGluZ0NvbnRl
eHQuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVk
ZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNl
IExheW91dCB7Ci0KLUlubGluZUxheW91dFVuaXQgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQ6OlF1
aXJrczo6aW5pdGlhbExpbmVIZWlnaHQoKSBjb25zdAotewotICAgIC8vIE5lZ2F0aXZlIGxpbmVI
ZWlnaHQgdmFsdWUgbWVhbnMgdGhlIGxpbmUtaGVpZ2h0IGlzIG5vdCBzZXQKLSAgICBhdXRvJiBy
b290ID0gZm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCk7Ci0gICAgaWYgKGxheW91dFN0YXRlKCku
aW5TdGFuZGFyZHNNb2RlKCkgfHwgIXJvb3Quc3R5bGUoKS5saW5lSGVpZ2h0KCkuaXNOZWdhdGl2
ZSgpKQotICAgICAgICByZXR1cm4gcm9vdC5zdHlsZSgpLmNvbXB1dGVkTGluZUhlaWdodCgpOwot
ICAgIHJldHVybiByb290LnN0eWxlKCkuZm9udE1ldHJpY3MoKS5mbG9hdEhlaWdodCgpOwotfQot
Ci1ib29sIElubGluZUZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3M6OmlubGluZUxldmVsQm94QWZm
ZWN0c0xpbmVCb3goY29uc3QgTGluZUJveDo6SW5saW5lTGV2ZWxCb3gmIGlubGluZUxldmVsQm94
LCBjb25zdCBMaW5lQm94JiBsaW5lQm94KSBjb25zdAotewotICAgIGlmIChpbmxpbmVMZXZlbEJv
eC5pc0xpbmVCcmVha0JveCgpKSB7Ci0gICAgICAgIGlmIChsYXlvdXRTdGF0ZSgpLmluU3RhbmRh
cmRzTW9kZSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIC8vIEluIHF1aXJr
cyBtb2RlIGxpbmVicmVhayBib3hlcyAoPGJyPikgc3RvcCBhZmZlY3RpbmcgdGhlIGxpbmUgYm94
IHdoZW4gKGFzc3VtZSA8YnI+IGlzIG5lc3RlZCBlLmcuIDxzcGFuIHN0eWxlPSJmb250LXNpemU6
IDEwMHB4Ij48YnI+PC9zcGFuPikKLSAgICAgICAgLy8gMS4gdGhlIHJvb3QgaW5saW5lIGJveCBo
YXMgY29udGVudCA8ZGl2PmNvbnRlbnQ8YnI+L2Rpdj4KLSAgICAgICAgLy8gMi4gdGhlcmUncyBh
dCBsZWFzdCBvbmUgYXRvbWljIGlubGluZSBsZXZlbCBib3ggb24gdGhlIGxpbmUgZS5nIDxkaXY+
PGltZz48YnI+PC9kaXY+IG9yIDxkaXY+PHNwYW4+PGltZz48L3NwYW4+PGJyPjwvZGl2PgotICAg
ICAgICAvLyAzLiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBpbmxpbmUgYm94IHdpdGggY29udGVudCBl
LmcuIDxkaXY+PHNwYW4+Y29udGVudDwvc3Bhbj48YnI+PC9kaXY+Ci0gICAgICAgIGlmIChsaW5l
Qm94LnJvb3RJbmxpbmVCb3goKS5oYXNDb250ZW50KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgIGlmIChsaW5lQm94Lmhhc0F0b21pY0lubGluZUxldmVsQm94KCkpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgZWl0aGVy
IGhhdmUgb25seSB0aGUgPGJyPiBvbiB0aGUgbGluZSBvciBpbmxpbmUgYm94ZXMgd2l0aCBvciB3
aXRob3V0IGNvbnRlbnQuCi0gICAgICAgIGF1dG8mIGlubGluZUxldmVsQm94ZXMgPSBsaW5lQm94
Lm5vblJvb3RJbmxpbmVMZXZlbEJveGVzKCk7Ci0gICAgICAgIEFTU0VSVCghaW5saW5lTGV2ZWxC
b3hlcy5pc0VtcHR5KCkpOwotICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3hlcy5zaXplKCkgPT0g
MSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBmb3IgKGF1dG8mIGlubGluZUxl
dmVsQm94IDogbGluZUJveC5ub25Sb290SW5saW5lTGV2ZWxCb3hlcygpKSB7Ci0gICAgICAgICAg
ICAvLyBGaWx0ZXIgb3V0IGVtcHR5IGlubGluZSBib3hlcyBlLmcuIDxkaXY+PHNwYW4+PC9zcGFu
PjxzcGFuPjwvc3Bhbj48YnI+PC9kaXY+Ci0gICAgICAgICAgICBpZiAoaW5saW5lTGV2ZWxCb3gu
aXNJbmxpbmVCb3goKSAmJiBpbmxpbmVMZXZlbEJveC5oYXNDb250ZW50KCkpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAg
IH0KLSAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNJbmxpbmVCb3goKSkgewotICAgICAgICAvLyBJ
bmxpbmUgYm94ZXMgKGUuZy4gcm9vdCBpbmxpbmUgYm94IG9yIDxzcGFuPikgYWZmZWN0cyBsaW5l
IGJveGVzIGVpdGhlciB0aHJvdWdoIHRoZSBzdHJ1dCBvciBhY3R1YWwgY29udGVudC4KLSAgICAg
ICAgYXV0byBpbmxpbmVCb3hIYXNJbWFnaW5hcnlTdHJ1dCA9IGxheW91dFN0YXRlKCkuaW5TdGFu
ZGFyZHNNb2RlKCk7Ci0gICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5oYXNDb250ZW50KCkgfHwg
aW5saW5lQm94SGFzSW1hZ2luYXJ5U3RydXQpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgaWYgKGlubGluZUxldmVsQm94LmlzUm9vdElubGluZUJveCgpKSB7Ci0gICAgICAgICAg
ICBhdXRvIHNob3VsZFJvb3RJbmxpbmVCb3hXaXRoTm9Db250ZW50U3RyZXRjaExpbmVCb3ggPSBb
Jl0gewotICAgICAgICAgICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKS5zdHls
ZSgpLmxpbmVIZWlnaHQoKS5pc05lZ2F0aXZlKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgICAgICAgICAvLyBUaGUgcm9vdCBpbmxpbmUgYm94IHdpdGggbm9u
LWluaXRpYWwgbGluZSBoZWlnaHQgdmFsdWUgc3RyZXRjaGVzIHRoZSBsaW5lIGJveCBldmVuIHdo
ZW4gcm9vdCBoYXMgbm8gY29udGVudAotICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGVyZSdzIGF0
IGxlYXN0IG9uZSBpbmxpbmUgYm94IHdpdGggY29udGVudC4KLSAgICAgICAgICAgICAgICAvLyBl
LmcuIDxkaXYgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxMDBweDsiPjxzcGFuPmNvbnRlbnQ8L3NwYW4+
PC9kaXY+Ci0gICAgICAgICAgICAgICAgaWYgKCFsaW5lQm94Lmhhc0lubGluZUJveCgpKQotICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChhdXRv
JiBpbmxpbmVMZXZlbEJveCA6IGxpbmVCb3gubm9uUm9vdElubGluZUxldmVsQm94ZXMoKSkgewot
ICAgICAgICAgICAgICAgICAgICBpZiAoIWlubGluZUxldmVsQm94LmlzSW5saW5lQm94KCkpCi0g
ICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KGlubGluZUxldmVsQm94Lmhhc0NvbnRlbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgcmV0dXJuIHNob3VsZFJvb3RJbmxpbmVC
b3hXaXRoTm9Db250ZW50U3RyZXRjaExpbmVCb3goKTsKLSAgICAgICAgfQotICAgICAgICAvLyBO
b24tcm9vdCBpbmxpbmUgYm94ZXMgKGUuZy4gPHNwYW4+KS4KLSAgICAgICAgYXV0byYgYm94R2Vv
bWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGlubGluZUxldmVsQm94
LmxheW91dEJveCgpKTsKLSAgICAgICAgaWYgKGJveEdlb21ldHJ5Lmhvcml6b250YWxCb3JkZXIo
KSB8fCBib3hHZW9tZXRyeS5ob3Jpem9udGFsUGFkZGluZygpLnZhbHVlT3IoMF9sdSkpIHsKLSAg
ICAgICAgICAgIC8vIEhvcml6b250YWwgYm9yZGVyIGFuZCBwYWRkaW5nIG1ha2UgdGhlIGlubGlu
ZSBib3ggc3RyZXRjaCB0aGUgbGluZSAoZS5nLiA8c3BhbiBzdHlsZT0icGFkZGluZzogMTBweDsi
Pjwvc3Bhbj4pLgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoaW5saW5lTGV2ZWxCb3guaXNBdG9taWNJbmxp
bmVMZXZlbEJveCgpKSB7Ci0gICAgICAgIGlmIChpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3VuZHMo
KS5oZWlnaHQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAvLyBXaGlsZSBp
biBwcmFjdGljZSB3aGVuIHRoZSBuZWdhdGl2ZSB2ZXJ0aWNhbCBtYXJnaW4gbWFrZXMgdGhlIGxh
eW91dCBib3VuZHMgZW1wdHkgKGUuZzogaGVpZ2h0OiAxMDBweDsgbWFyZ2luLXRvcDogLTEwMHB4
OyksIGFuZCB0aGlzIGlubGluZQotICAgICAgICAvLyBsZXZlbCBib3ggY29udHJpYnV0ZXMgMHB4
IHRvIHRoZSBsaW5lIGJveCBoZWlnaHQsIGl0IHN0aWxsIG5lZWRzIHRvIGJlIHRha2VuIGludG8g
YWNjb3VudCB3aGlsZSBjb21wdXRpbmcgbGluZSBib3ggZ2VvbWV0cmllcy4KLSAgICAgICAgYXV0
byYgYm94R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGlubGlu
ZUxldmVsQm94LmxheW91dEJveCgpKTsKLSAgICAgICAgcmV0dXJuIGJveEdlb21ldHJ5Lm1hcmdp
bkJlZm9yZSgpIHx8IGJveEdlb21ldHJ5Lm1hcmdpbkFmdGVyKCk7Ci0gICAgfQotICAgIHJldHVy
biBmYWxzZTsKLX0KLQotYm9vbCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpoYXNT
b2Z0V3JhcE9wcG9ydHVuaXR5QXRJbWFnZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICFmb3JtYXR0
aW5nQ29udGV4dCgpLnJvb3QoKS5pc1RhYmxlQ2VsbCgpOwotfQotCi19Ci19Ci0KLSNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxp
bmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGlu
Z1N0YXRlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdiNmM5NWMxNTQ1ZDY0
NWNkYmQ0YjA1NDZhZWMxODZjZjNjY2Y1ZC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRz
L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0YXRlLmNwcAorKysgL2Rldi9udWxs
CkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBh
cmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5j
bHVkZSAiSW5saW5lRm9ybWF0dGluZ1N0YXRlLmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1B
VFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0KLW5h
bWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxM
T0NBVEVEX0lNUEwoSW5saW5lRm9ybWF0dGluZ1N0YXRlKTsKLQotSW5saW5lRm9ybWF0dGluZ1N0
YXRlOjpJbmxpbmVGb3JtYXR0aW5nU3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYgZmxvYXRpbmdT
dGF0ZSwgTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlKQotICAgIDogRm9ybWF0dGluZ1N0YXRlKFdU
Rk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OklubGluZSwgbGF5b3V0U3RhdGUpCi17Ci19Ci0K
LUlubGluZUZvcm1hdHRpbmdTdGF0ZTo6fklubGluZUZvcm1hdHRpbmdTdGF0ZSgpCi17Ci19Ci0K
LX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5oIGIvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUZvcm1hdHRpbmdTdGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjNi
MTYwMzY4NGU1OTQwMDdhMDgyN2JjOTRjYjk3YjRiYTAxNzRmLi4wMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nU3RhdGUuaAorKysg
L2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFw
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
dHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIklubGluZUl0ZW0uaCIKLSNpbmNsdWRlICJJbmxpbmVM
aW5lQm94LmgiCi0jaW5jbHVkZSAiSW5saW5lTGluZUdlb21ldHJ5LmgiCi0jaW5jbHVkZSAiSW5s
aW5lTGluZVJ1bi5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KLQotbmFtZXNwYWNlIFdl
YkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLXVzaW5nIElubGluZUl0ZW1zID0gVmVjdG9y
PElubGluZUl0ZW0+OwotdXNpbmcgSW5saW5lTGluZXMgPSBWZWN0b3I8SW5saW5lTGluZUdlb21l
dHJ5PjsKLXVzaW5nIElubGluZUxpbmVCb3hlcyA9IFZlY3RvcjxMaW5lQm94PjsKLXVzaW5nIElu
bGluZUxpbmVSdW5zID0gVmVjdG9yPExpbmVSdW4+OwotCi0vLyBJbmxpbmVGb3JtYXR0aW5nU3Rh
dGUgaG9sZHMgdGhlIHN0YXRlIGZvciBhIHBhcnRpY3VsYXIgaW5saW5lIGZvcm1hdHRpbmcgY29u
dGV4dCB0cmVlLgotY2xhc3MgSW5saW5lRm9ybWF0dGluZ1N0YXRlIDogcHVibGljIEZvcm1hdHRp
bmdTdGF0ZSB7Ci0gICAgV1RGX01BS0VfSVNPX0FMTE9DQVRFRChJbmxpbmVGb3JtYXR0aW5nU3Rh
dGUpOwotcHVibGljOgotICAgIElubGluZUZvcm1hdHRpbmdTdGF0ZShSZWY8RmxvYXRpbmdTdGF0
ZT4mJiwgTGF5b3V0U3RhdGUmKTsKLSAgICB+SW5saW5lRm9ybWF0dGluZ1N0YXRlKCk7Ci0KLSAg
ICBJbmxpbmVJdGVtcyYgaW5saW5lSXRlbXMoKSB7IHJldHVybiBtX2lubGluZUl0ZW1zOyB9Ci0g
ICAgY29uc3QgSW5saW5lSXRlbXMmIGlubGluZUl0ZW1zKCkgY29uc3QgeyByZXR1cm4gbV9pbmxp
bmVJdGVtczsgfQotICAgIHZvaWQgYWRkSW5saW5lSXRlbShJbmxpbmVJdGVtJiYgaW5saW5lSXRl
bSkgeyBtX2lubGluZUl0ZW1zLmFwcGVuZChXVEZNb3ZlKGlubGluZUl0ZW0pKTsgfQotCi0gICAg
Y29uc3QgSW5saW5lTGluZXMmIGxpbmVzKCkgY29uc3QgeyByZXR1cm4gbV9saW5lczsgfQotICAg
IElubGluZUxpbmVzJiBsaW5lcygpIHsgcmV0dXJuIG1fbGluZXM7IH0KLSAgICB2b2lkIGFkZExp
bmUoY29uc3QgSW5saW5lTGluZUdlb21ldHJ5JiBsaW5lKSB7IG1fbGluZXMuYXBwZW5kKGxpbmUp
OyB9Ci0KLSAgICBjb25zdCBJbmxpbmVMaW5lQm94ZXMmIGxpbmVCb3hlcygpIGNvbnN0IHsgcmV0
dXJuIG1fbGluZUJveGVzOyB9Ci0gICAgdm9pZCBhZGRMaW5lQm94KExpbmVCb3gmJiBsaW5lQm94
KSB7IG1fbGluZUJveGVzLmFwcGVuZChXVEZNb3ZlKGxpbmVCb3gpKTsgfQotCi0gICAgY29uc3Qg
SW5saW5lTGluZVJ1bnMmIGxpbmVSdW5zKCkgY29uc3QgeyByZXR1cm4gbV9saW5lUnVuczsgfQot
ICAgIElubGluZUxpbmVSdW5zJiBsaW5lUnVucygpIHsgcmV0dXJuIG1fbGluZVJ1bnM7IH0KLSAg
ICB2b2lkIGFkZExpbmVSdW4oTGluZVJ1biYmIHJ1bikgeyBtX2xpbmVSdW5zLmFwcGVuZChXVEZN
b3ZlKHJ1bikpOyB9Ci0KLSAgICB2b2lkIHNldENsZWFyR2FwQWZ0ZXJMYXN0TGluZShJbmxpbmVM
YXlvdXRVbml0IHZlcnRpY2FsR2FwKTsKLSAgICBJbmxpbmVMYXlvdXRVbml0IGNsZWFyR2FwQWZ0
ZXJMYXN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lOyB9Ci0K
LSAgICB2b2lkIGNsZWFyTGluZUFuZFJ1bnMoKTsKLSAgICB2b2lkIHNocmlua1RvRml0KCk7Ci0K
LXByaXZhdGU6Ci0gICAgLy8gQ2FjaGVhYmxlIGlucHV0IHRvIGxpbmUgbGF5b3V0LgotICAgIElu
bGluZUl0ZW1zIG1faW5saW5lSXRlbXM7Ci0gICAgSW5saW5lTGluZXMgbV9saW5lczsKLSAgICBJ
bmxpbmVMaW5lQm94ZXMgbV9saW5lQm94ZXM7Ci0gICAgSW5saW5lTGluZVJ1bnMgbV9saW5lUnVu
czsKLSAgICBJbmxpbmVMYXlvdXRVbml0IG1fY2xlYXJHYXBBZnRlckxhc3RMaW5lIHsgMCB9Owot
fTsKLQotaW5saW5lIHZvaWQgSW5saW5lRm9ybWF0dGluZ1N0YXRlOjpzZXRDbGVhckdhcEFmdGVy
TGFzdExpbmUoSW5saW5lTGF5b3V0VW5pdCB2ZXJ0aWNhbEdhcCkKLXsKLSAgICBBU1NFUlQodmVy
dGljYWxHYXAgPj0gMCk7Ci0gICAgbV9jbGVhckdhcEFmdGVyTGFzdExpbmUgPSB2ZXJ0aWNhbEdh
cDsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lRm9ybWF0dGluZ1N0YXRlOjpjbGVhckxpbmVBbmRS
dW5zKCkKLXsKLSAgICBtX2xpbmVzLmNsZWFyKCk7Ci0gICAgbV9saW5lQm94ZXMuY2xlYXIoKTsK
LSAgICBtX2xpbmVSdW5zLmNsZWFyKCk7Ci0gICAgbV9jbGVhckdhcEFmdGVyTGFzdExpbmUgPSB7
IH07Ci19Ci0KLWlubGluZSB2b2lkIElubGluZUZvcm1hdHRpbmdTdGF0ZTo6c2hyaW5rVG9GaXQo
KQotewotICAgIG1faW5saW5lSXRlbXMuc2hyaW5rVG9GaXQoKTsKLSAgICBtX2xpbmVzLnNocmlu
a1RvRml0KCk7Ci0gICAgbV9saW5lQm94ZXMuc2hyaW5rVG9GaXQoKTsKLSAgICBtX2xpbmVSdW5z
LnNocmlua1RvRml0KCk7Ci19Ci0KLX0KLX0KLQotU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19MQVlP
VVRfRk9STUFUVElOR19TVEFURShJbmxpbmVGb3JtYXR0aW5nU3RhdGUsIGlzSW5saW5lRm9ybWF0
dGluZ1N0YXRlKCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUl0ZW0uY3BwIGIvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUl0ZW0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjA2ZjE4NDliNWE5
YTYxODQ5YTIwZWJkNDE5NjVhNmFkZDhlYzg2Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4
dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUy
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0Ogot
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
Ci0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
Ci0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgot
ICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSW5s
aW5lSXRlbS5oIgotCi0jaW5jbHVkZSAiSW5saW5lVGV4dEl0ZW0uaCIKLQotI2lmIEVOQUJMRShM
QVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3Bh
Y2UgTGF5b3V0IHsKLQotc3RydWN0IFNhbWVTaXplQXNJbmxpbmVJdGVtIHsKLSAgICB2b2lkKiBs
YXlvdXRCb3g7Ci0gICAgdWludDhfdCBlbnVtMTsKLSAgICB1aW50OF90IGVudW0yOwotICAgIGJv
b2wgd2lkdGhCb29sOwotICAgIGJvb2wgc29mdEh5cGhlbkJvb2w7Ci0gICAgYm9vbCBpc1dvcmRT
ZXBhcmF0b3I7Ci0gICAgSW5saW5lTGF5b3V0VW5pdCB3aWR0aDsKLSAgICB1bnNpZ25lZCBzdGFy
dDsKLSAgICB1bnNpZ25lZCBsZW5ndGg7Ci19OwotCi1zdGF0aWNfYXNzZXJ0KHNpemVvZihJbmxp
bmVJdGVtKSA9PSBzaXplb2YoU2FtZVNpemVBc0lubGluZUl0ZW0pLCAiIik7Ci0KLX0KLX0KLSNl
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUl0ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVJdGVtLmgKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWUyNGE2MTI2ODQ1ODg3NGM3MjA5OTQzODJiYWI4Mjkx
ZGRjNGQuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lu
bGluZUl0ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
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
aW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKLQotbmFtZXNw
YWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIElubGluZUl0ZW0gewot
cHVibGljOgotICAgIGVudW0gY2xhc3MgVHlwZSA6IHVpbnQ4X3QgeyBUZXh0LCBIYXJkTGluZUJy
ZWFrLCBTb2Z0TGluZUJyZWFrLCBXb3JkQnJlYWtPcHBvcnR1bml0eSwgQm94LCBGbG9hdCwgSW5s
aW5lQm94U3RhcnQsIElubGluZUJveEVuZCB9OwotICAgIElubGluZUl0ZW0oY29uc3QgQm94JiBs
YXlvdXRCb3gsIFR5cGUpOwotCi0gICAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBl
OyB9Ci0gICAgY29uc3QgQm94JiBsYXlvdXRCb3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRC
b3g7IH0KLSAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUoKSBjb25zdCB7IHJldHVybiBsYXlv
dXRCb3goKS5zdHlsZSgpOyB9Ci0KLSAgICBib29sIGlzVGV4dCgpIGNvbnN0IHsgcmV0dXJuIHR5
cGUoKSA9PSBUeXBlOjpUZXh0OyB9Ci0gICAgYm9vbCBpc0JveCgpIGNvbnN0IHsgcmV0dXJuIHR5
cGUoKSA9PSBUeXBlOjpCb3g7IH0KLSAgICBib29sIGlzRmxvYXQoKSBjb25zdCB7IHJldHVybiB0
eXBlKCkgPT0gVHlwZTo6RmxvYXQ7IH0KLSAgICBib29sIGlzTGluZUJyZWFrKCkgY29uc3QgeyBy
ZXR1cm4gaXNTb2Z0TGluZUJyZWFrKCkgfHwgaXNIYXJkTGluZUJyZWFrKCk7IH0KLSAgICBib29s
IGlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0gVHlwZTo6
V29yZEJyZWFrT3Bwb3J0dW5pdHk7IH0KLSAgICBib29sIGlzU29mdExpbmVCcmVhaygpIGNvbnN0
IHsgcmV0dXJuIHR5cGUoKSA9PSBUeXBlOjpTb2Z0TGluZUJyZWFrOyB9Ci0gICAgYm9vbCBpc0hh
cmRMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiB0eXBlKCkgPT0gVHlwZTo6SGFyZExpbmVCcmVh
azsgfQotICAgIGJvb2wgaXNJbmxpbmVCb3hTdGFydCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9
PSBUeXBlOjpJbmxpbmVCb3hTdGFydDsgfQotICAgIGJvb2wgaXNJbmxpbmVCb3hFbmQoKSBjb25z
dCB7IHJldHVybiB0eXBlKCkgPT0gVHlwZTo6SW5saW5lQm94RW5kOyB9Ci0KLXByaXZhdGU6Ci0g
ICAgY29uc3QgQm94KiBtX2xheW91dEJveCB7IG51bGxwdHIgfTsKLSAgICBUeXBlIG1fdHlwZSB7
IH07Ci0KLXByb3RlY3RlZDoKLSAgICAvLyBGb3IgSW5saW5lVGV4dEl0ZW0KLSAgICBlbnVtIGNs
YXNzIFRleHRJdGVtVHlwZSAgOiB1aW50OF90IHsgVW5kZWZpbmVkLCBXaGl0ZXNwYWNlLCBOb25X
aGl0ZXNwYWNlIH07Ci0gICAgVGV4dEl0ZW1UeXBlIG1fdGV4dEl0ZW1UeXBlIHsgVGV4dEl0ZW1U
eXBlOjpVbmRlZmluZWQgfTsKLSAgICBib29sIG1faGFzV2lkdGggeyBmYWxzZSB9OwotICAgIGJv
b2wgbV9oYXNUcmFpbGluZ1NvZnRIeXBoZW4geyBmYWxzZSB9OwotICAgIGJvb2wgbV9pc1dvcmRT
ZXBhcmF0b3IgeyBmYWxzZSB9OwotICAgIElubGluZUxheW91dFVuaXQgbV93aWR0aCB7IH07Ci0g
ICAgdW5zaWduZWQgbV9sZW5ndGggeyAwIH07Ci0KLSAgICAvLyBGb3IgSW5saW5lVGV4dEl0ZW0g
YW5kIElubGluZVNvZnRMaW5lQnJlYWtJdGVtCi0gICAgdW5zaWduZWQgbV9zdGFydE9yUG9zaXRp
b24geyAwIH07Ci19OwotCi1pbmxpbmUgSW5saW5lSXRlbTo6SW5saW5lSXRlbShjb25zdCBCb3gm
IGxheW91dEJveCwgVHlwZSB0eXBlKQotICAgIDogbV9sYXlvdXRCb3goJmxheW91dEJveCkKLSAg
ICAsIG1fdHlwZSh0eXBlKQotewotfQotCi0jZGVmaW5lIFNQRUNJQUxJWkVfVFlQRV9UUkFJVFNf
SU5MSU5FX0lURU0oVG9WYWx1ZVR5cGVOYW1lLCBwcmVkaWNhdGUpIFwKLVNQRUNJQUxJWkVfVFlQ
RV9UUkFJVFNfQkVHSU4oV2ViQ29yZTo6TGF5b3V0OjpUb1ZhbHVlVHlwZU5hbWUpIFwKLSAgICBz
dGF0aWMgYm9vbCBpc1R5cGUoY29uc3QgV2ViQ29yZTo6TGF5b3V0OjpJbmxpbmVJdGVtJiBpbmxp
bmVJdGVtKSB7IHJldHVybiBpbmxpbmVJdGVtLnByZWRpY2F0ZTsgfSBcCi1TUEVDSUFMSVpFX1RZ
UEVfVFJBSVRTX0VORCgpCi0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmUu
Y3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUxpbmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjMz
NWJjNDBlZWZjOWMyODMzZDRkMTM3YjRhNTg0Nzg3MDc1MmZjLi4wMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lLmNwcAorKysgL2Rldi9udWxs
CkBAIC0xLDUzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICog
YXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2lu
Y2x1ZGUgIklubGluZUxpbmUuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQotCi0jaW5jbHVkZSAiRm9udENhc2NhZGUuaCIKLSNpbmNsdWRlICJJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIklubGluZVNvZnRMaW5lQnJlYWtJdGVtLmgiCi0jaW5j
bHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIKLSNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1
cmVzLmgiCi0jaW5jbHVkZSAiVGV4dEZsYWdzLmgiCi0jaW5jbHVkZSAiVGV4dFV0aWwuaCIKLSNp
bmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1u
YW1lc3BhY2UgTGF5b3V0IHsKLQotTGluZTo6TGluZShjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dCYgaW5saW5lRm9ybWF0dGluZ0NvbnRleHQpCi0gICAgOiBtX2lubGluZUZvcm1hdHRpbmdD
b250ZXh0KGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQotICAgICwgbV90cmltbWFibGVUcmFpbGlu
Z0NvbnRlbnQobV9ydW5zKQotewotfQotCi1MaW5lOjp+TGluZSgpCi17Ci19Ci0KLXZvaWQgTGlu
ZTo6aW5pdGlhbGl6ZSgpCi17Ci0gICAgbV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQg
PSAwOwotICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCA9IHsgfTsKLSAgICBtX3J1bnMuY2xlYXIo
KTsKLSAgICBtX3RyYWlsaW5nU29mdEh5cGhlbldpZHRoID0geyB9OwotICAgIG1fdHJpbW1hYmxl
VHJhaWxpbmdDb250ZW50LnJlc2V0KCk7Ci19Ci0KLXZvaWQgTGluZTo6cmVtb3ZlQ29sbGFwc2li
bGVDb250ZW50KElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFsU3BhY2UpCi17Ci0gICAg
cmVtb3ZlVHJhaWxpbmdUcmltbWFibGVDb250ZW50KCk7Ci0gICAgdmlzdWFsbHlDb2xsYXBzZVBy
ZVdyYXBPdmVyZmxvd0NvbnRlbnQoZXh0cmFIb3Jpem9udGFsU3BhY2UpOwotfQotCi12b2lkIExp
bmU6OmFwcGx5UnVuRXhwYW5zaW9uKElubGluZUxheW91dFVuaXQgZXh0cmFIb3Jpem9udGFsU3Bh
Y2UpCi17Ci0gICAgQVNTRVJUKGZvcm1hdHRpbmdDb250ZXh0KCkucm9vdCgpLnN0eWxlKCkudGV4
dEFsaWduKCkgPT0gVGV4dEFsaWduTW9kZTo6SnVzdGlmeSk7Ci0gICAgLy8gVGV4dCBpcyBqdXN0
aWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBtZXRob2Qgc3BlY2lmaWVkIGJ5IHRoZSB0ZXh0LWp1c3Rp
ZnkgcHJvcGVydHksCi0gICAgLy8gaW4gb3JkZXIgdG8gZXhhY3RseSBmaWxsIHRoZSBsaW5lIGJv
eC4gVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgYnkgdGV4dC1hbGlnbi1sYXN0LAotICAgIC8v
IHRoZSBsYXN0IGxpbmUgYmVmb3JlIGEgZm9yY2VkIGJyZWFrIG9yIHRoZSBlbmQgb2YgdGhlIGJs
b2NrIGlzIHN0YXJ0LWFsaWduZWQuCi0gICAgaWYgKG1fcnVucy5pc0VtcHR5KCkgfHwgbV9ydW5z
Lmxhc3QoKS5pc0xpbmVCcmVhaygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBhdXRvIGV4cGFu
c2lvbk9wcG9ydHVuaXR5Q291bnQgPSAwOwotICAgIFJ1biogbGFzdFJ1bldpdGhDb250ZW50ID0g
bnVsbHB0cjsKLSAgICAvLyBDb2xsZWN0IGFuZCBkaXN0cmlidXRlIHRoZSBleHBhbnNpb24gb3Bw
b3J0dW5pdGllcy4KLSAgICBmb3IgKGF1dG8mIHJ1biA6IG1fcnVucykgewotICAgICAgICBleHBh
bnNpb25PcHBvcnR1bml0eUNvdW50ICs9IHJ1bi5leHBhbnNpb25PcHBvcnR1bml0eUNvdW50KCk7
Ci0gICAgICAgIGlmIChydW4uaXNUZXh0KCkgfHwgcnVuLmlzQm94KCkpCi0gICAgICAgICAgICBs
YXN0UnVuV2l0aENvbnRlbnQgPSAmcnVuOwotICAgIH0KLSAgICAvLyBOZWVkIHRvIGZpeCB1cCB0
aGUgbGFzdCBydW4ncyB0cmFpbGluZyBleHBhbnNpb24uCi0gICAgaWYgKGxhc3RSdW5XaXRoQ29u
dGVudCAmJiBsYXN0UnVuV2l0aENvbnRlbnQtPmhhc0V4cGFuc2lvbk9wcG9ydHVuaXR5KCkpIHsK
LSAgICAgICAgLy8gVHVybiBvZmYgdGhlIHRyYWlsaW5nIGJpdHMgZmlyc3QgYW5kIGFkZCB0aGUg
Zm9yYmlkIHRyYWlsaW5nIGV4cGFuc2lvbi4KLSAgICAgICAgYXV0byBsZWFkaW5nRXhwYW5zaW9u
ID0gbGFzdFJ1bldpdGhDb250ZW50LT5leHBhbnNpb25CZWhhdmlvcigpICYgTGVmdEV4cGFuc2lv
bk1hc2s7Ci0gICAgICAgIGxhc3RSdW5XaXRoQ29udGVudC0+c2V0RXhwYW5zaW9uQmVoYXZpb3Io
bGVhZGluZ0V4cGFuc2lvbiB8IEZvcmJpZFJpZ2h0RXhwYW5zaW9uKTsKLSAgICB9Ci0gICAgLy8g
QW55dGhpbmcgdG8gZGlzdHJpYnV0ZT8KLSAgICBpZiAoIWV4cGFuc2lvbk9wcG9ydHVuaXR5Q291
bnQgfHwgIWV4dHJhSG9yaXpvbnRhbFNwYWNlKQotICAgICAgICByZXR1cm47Ci0gICAgLy8gRGlz
dHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UuCi0gICAgYXV0byBleHBhbnNpb25Ub0Rpc3RyaWJ1dGUg
PSBleHRyYUhvcml6b250YWxTcGFjZSAvIGV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQ7Ci0gICAg
YXV0byBhY2N1bXVsYXRlZEV4cGFuc2lvbiA9IElubGluZUxheW91dFVuaXQgeyB9OwotICAgIGZv
ciAoYXV0byYgcnVuIDogbV9ydW5zKSB7Ci0gICAgICAgIC8vIEV4cGFuZCBhbmQgbW92ZSBydW5z
IGJ5IHRoZSBhY2N1bXVsYXRlZCBleHBhbnNpb24uCi0gICAgICAgIHJ1bi5tb3ZlSG9yaXpvbnRh
bGx5KGFjY3VtdWxhdGVkRXhwYW5zaW9uKTsKLSAgICAgICAgaWYgKCFydW4uaGFzRXhwYW5zaW9u
T3Bwb3J0dW5pdHkoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBBU1NFUlQocnVu
LmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQoKSk7Ci0gICAgICAgIGF1dG8gY29tcHV0ZWRFeHBh
bnNpb24gPSBleHBhbnNpb25Ub0Rpc3RyaWJ1dGUgKiBydW4uZXhwYW5zaW9uT3Bwb3J0dW5pdHlD
b3VudCgpOwotICAgICAgICAvLyBGSVhNRTogQ2hlY2sgd2h5IHdlIG5lZWQgdG8gc2V0IGJvdGgu
Ci0gICAgICAgIHJ1bi5zZXRIb3Jpem9udGFsRXhwYW5zaW9uKGNvbXB1dGVkRXhwYW5zaW9uKTsK
LSAgICAgICAgcnVuLnNocmlua0hvcml6b250YWxseSgtY29tcHV0ZWRFeHBhbnNpb24pOwotICAg
ICAgICBhY2N1bXVsYXRlZEV4cGFuc2lvbiArPSBjb21wdXRlZEV4cGFuc2lvbjsKLSAgICB9Ci0g
ICAgLy8gQ29udGVudCBncm93cyBhcyBydW5zIGV4cGFuZC4KLSAgICBtX2NvbnRlbnRMb2dpY2Fs
V2lkdGggKz0gYWNjdW11bGF0ZWRFeHBhbnNpb247Ci19Ci0KLXZvaWQgTGluZTo6cmVtb3ZlVHJh
aWxpbmdUcmltbWFibGVDb250ZW50KCkKLXsKLSAgICBpZiAobV90cmltbWFibGVUcmFpbGluZ0Nv
bnRlbnQuaXNFbXB0eSgpIHx8IG1fcnVucy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIC8vIENvbXBsZXggbGluZSBsYXlvdXQgcXVpcms6IGtlZXAgdGhlIHRyYWlsaW5nIHdoaXRl
c3BhY2UgYXJvdW5kIHdoZW4gaXQgaXMgZm9sbG93ZWQgYnkgYSBsaW5lIGJyZWFrLCB1bmxlc3Mg
dGhlIGNvbnRlbnQgb3ZlcmZsb3dzIHRoZSBsaW5lLgotICAgIGlmIChSdW50aW1lRW5hYmxlZEZl
YXR1cmVzOjpzaGFyZWRGZWF0dXJlcygpLmxheW91dEZvcm1hdHRpbmdDb250ZXh0SW50ZWdyYXRp
b25FbmFibGVkKCkpIHsKLSAgICAgICAgYXV0byBpc1RleHRBbGlnblJpZ2h0ID0gWyZdIHsKLSAg
ICAgICAgICAgIGF1dG8gdGV4dEFsaWduID0gZm9ybWF0dGluZ0NvbnRleHQoKS5yb290KCkuc3R5
bGUoKS50ZXh0QWxpZ24oKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0QWxpZ24gPT0gVGV4dEFs
aWduTW9kZTo6UmlnaHQKLSAgICAgICAgICAgICAgICB8fCB0ZXh0QWxpZ24gPT0gVGV4dEFsaWdu
TW9kZTo6V2ViS2l0UmlnaHQKLSAgICAgICAgICAgICAgICB8fCB0ZXh0QWxpZ24gPT0gVGV4dEFs
aWduTW9kZTo6RW5kOwotICAgICAgICAgICAgfSgpOwotCi0gICAgICAgIGlmIChtX3J1bnMubGFz
dCgpLmlzTGluZUJyZWFrKCkgJiYgIWlzVGV4dEFsaWduUmlnaHQpIHsKLSAgICAgICAgICAgIG1f
dHJpbW1hYmxlVHJhaWxpbmdDb250ZW50LnJlc2V0KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggLT0gbV90cmltbWFi
bGVUcmFpbGluZ0NvbnRlbnQucmVtb3ZlKCk7Ci19Ci0KLXZvaWQgTGluZTo6dmlzdWFsbHlDb2xs
YXBzZVByZVdyYXBPdmVyZmxvd0NvbnRlbnQoSW5saW5lTGF5b3V0VW5pdCBleHRyYUhvcml6b250
YWxTcGFjZSkKLXsKLSAgICBBU1NFUlQobV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuaXNFbXB0
eSgpKTsKLSAgICAvLyBJZiB3aGl0ZS1zcGFjZSBpcyBzZXQgdG8gcHJlLXdyYXAsIHRoZSBVQSBt
dXN0Ci0gICAgLy8gLi4uCi0gICAgLy8gSXQgbWF5IGFsc28gdmlzdWFsbHkgY29sbGFwc2UgdGhl
IGNoYXJhY3RlciBhZHZhbmNlIHdpZHRocyBvZiBhbnkgdGhhdCB3b3VsZCBvdGhlcndpc2Ugb3Zl
cmZsb3cuCi0gICAgYXV0byBvdmVyZmxvd1dpZHRoID0gLWV4dHJhSG9yaXpvbnRhbFNwYWNlOwot
ICAgIGlmIChvdmVyZmxvd1dpZHRoIDw9IDApCi0gICAgICAgIHJldHVybjsKLSAgICAvLyBMZXQn
cyBqdXN0IGZpbmQgdGhlIHRyYWlsaW5nIHByZS13cmFwIHdoaXRlc3BhY2UgY29udGVudCBmb3Ig
bm93IChlLmcgY2hlY2sgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHRyYWlsaW5nIHJ1bnMgd2l0aAot
ICAgIC8vIGRpZmZlcmVudCBzZXQgb2Ygd2hpdGUtc3BhY2UgdmFsdWVzIGFuZCBkZWNpZGUgaWYg
dGhlIGluLWJldHdlZW4gcHJlLXdyYXAgY29udGVudCBzaG91bGQgYmUgY29sbGFwc2VkIGFzIHdl
bGwuKQotICAgIElubGluZUxheW91dFVuaXQgdHJpbW1lZENvbnRlbnRXaWR0aCA9IDA7Ci0gICAg
Zm9yIChhdXRvJiBydW4gOiBXVEY6Om1ha2VSZXZlcnNlZFJhbmdlKG1fcnVucykpIHsKLSAgICAg
ICAgaWYgKHJ1bi5zdHlsZSgpLndoaXRlU3BhY2UoKSAhPSBXaGl0ZVNwYWNlOjpQcmVXcmFwKSB7
Ci0gICAgICAgICAgICAvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHByZS13cmFwIHRyYWls
aW5nIGNvbnRlbnQuCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBhdXRv
IHByZVdyYXBWaXN1YWxseUNvbGxhcHNpYmxlSW5saW5lSXRlbSA9IHJ1bi5pc0lubGluZUJveFN0
YXJ0KCkgfHwgcnVuLmlzSW5saW5lQm94RW5kKCkgfHwgcnVuLmhhc1RyYWlsaW5nV2hpdGVzcGFj
ZSgpOwotICAgICAgICBpZiAoIXByZVdyYXBWaXN1YWxseUNvbGxhcHNpYmxlSW5saW5lSXRlbSkK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBBU1NFUlQoIXJ1bi5oYXNDb2xsYXBzaWJsZVRy
YWlsaW5nV2hpdGVzcGFjZSgpKTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVX
aWR0aCA9IHsgfTsKLSAgICAgICAgaWYgKHJ1bi5pc1RleHQoKSkgewotICAgICAgICAgICAgLy8g
RklYTUU6IFdlIHNob3VsZCBhbHdheXMgY29sbGFwc2UgdGhlIHJ1biBhdCBhIGdseXBoIGJvdW5k
YXJ5IGFzIHRoZSBzcGVjIGluZGljYXRlczogImNvbGxhcHNlIHRoZSBjaGFyYWN0ZXIgYWR2YW5j
ZSB3aWR0aHMgb2YgYW55IHRoYXQgd291bGQgb3RoZXJ3aXNlIG92ZXJmbG93IgotICAgICAgICAg
ICAgLy8gYW5kIHRoZSB0cmltbWVkIHdpZHRoIHNob3VsZCBiZSBjYXBwZWQgYXQgc3RkOjptaW4o
cnVuLnRyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKCksIG92ZXJmbG93V2lkdGgpIGZvciB0ZXh0IHJ1
bnMuIEJvdGggRkYgYW5kIENocm9tZSBhZ3JlZS4KLSAgICAgICAgICAgIHRyaW1tYWJsZVdpZHRo
ID0gcnVuLnRyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKCk7Ci0gICAgICAgICAgICBydW4udmlzdWFs
bHlDb2xsYXBzZVRyYWlsaW5nV2hpdGVzcGFjZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgdHJpbW1hYmxlV2lkdGggPSBydW4ubG9naWNhbFdpZHRoKCk7Ci0gICAgICAgICAgICBy
dW4uc2hyaW5rSG9yaXpvbnRhbGx5KHRyaW1tYWJsZVdpZHRoKTsKLSAgICAgICAgfQotICAgICAg
ICB0cmltbWVkQ29udGVudFdpZHRoICs9IHRyaW1tYWJsZVdpZHRoOwotICAgICAgICBvdmVyZmxv
d1dpZHRoIC09IHRyaW1tYWJsZVdpZHRoOwotICAgICAgICBpZiAob3ZlcmZsb3dXaWR0aCA8PSAw
KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG1fY29udGVudExvZ2ljYWxXaWR0aCAt
PSB0cmltbWVkQ29udGVudFdpZHRoOwotfQotCi12b2lkIExpbmU6OmFwcGVuZChjb25zdCBJbmxp
bmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKLXsKLSAg
ICBpZiAoaW5saW5lSXRlbS5pc1RleHQoKSkKLSAgICAgICAgYXBwZW5kVGV4dENvbnRlbnQoZG93
bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGlubGluZUl0ZW0pLCBsb2dpY2FsV2lkdGgpOwotICAgIGVs
c2UgaWYgKGlubGluZUl0ZW0uaXNMaW5lQnJlYWsoKSkKLSAgICAgICAgYXBwZW5kTGluZUJyZWFr
KGlubGluZUl0ZW0pOwotICAgIGVsc2UgaWYgKGlubGluZUl0ZW0uaXNXb3JkQnJlYWtPcHBvcnR1
bml0eSgpKQotICAgICAgICBhcHBlbmRXb3JkQnJlYWtPcHBvcnR1bml0eShpbmxpbmVJdGVtKTsK
LSAgICBlbHNlIGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSkKLSAgICAgICAgYXBw
ZW5kSW5saW5lQm94U3RhcnQoaW5saW5lSXRlbSwgbG9naWNhbFdpZHRoKTsKLSAgICBlbHNlIGlm
IChpbmxpbmVJdGVtLmlzSW5saW5lQm94RW5kKCkpCi0gICAgICAgIGFwcGVuZElubGluZUJveEVu
ZChpbmxpbmVJdGVtLCBsb2dpY2FsV2lkdGgpOwotICAgIGVsc2UgaWYgKGlubGluZUl0ZW0ubGF5
b3V0Qm94KCkuaXNSZXBsYWNlZEJveCgpKQotICAgICAgICBhcHBlbmRSZXBsYWNlZElubGluZUxl
dmVsQm94KGlubGluZUl0ZW0sIGxvZ2ljYWxXaWR0aCk7Ci0gICAgZWxzZSBpZiAoaW5saW5lSXRl
bS5pc0JveCgpKQotICAgICAgICBhcHBlbmROb25SZXBsYWNlZElubGluZUxldmVsQm94KGlubGlu
ZUl0ZW0sIGxvZ2ljYWxXaWR0aCk7Ci0gICAgZWxzZQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKLX0KLQotdm9pZCBMaW5lOjphcHBlbmROb25CcmVha2FibGVTcGFjZShjb25zdCBJbmxp
bmVJdGVtJiBpbmxpbmVJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKLXsKLSAgICBtX3J1bnMuYXBwZW5kKHsgaW5saW5lSXRl
bSwgbG9naWNhbExlZnQsIGxvZ2ljYWxXaWR0aCB9KTsKLSAgICBtX2NvbnRlbnRMb2dpY2FsV2lk
dGggKz0gbG9naWNhbFdpZHRoOwotfQotCi12b2lkIExpbmU6OmFwcGVuZElubGluZUJveFN0YXJ0
KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdp
ZHRoKQotewotICAgIC8vIFRoaXMgaXMgcmVhbGx5IGp1c3QgYSBwbGFjZWhvbGRlciB0byBtYXJr
IHRoZSBzdGFydCBvZiB0aGUgaW5saW5lIGJveCA8c3Bhbj4uCi0gICAgYXV0byYgYm94R2VvbWV0
cnkgPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGlubGluZUl0ZW0ubGF5b3V0
Qm94KCkpOwotICAgIGF1dG8gYWRqdXN0ZWRSdW5TdGFydCA9IGNvbnRlbnRMb2dpY2FsUmlnaHQo
KSArIHN0ZDo6bWluKGJveEdlb21ldHJ5Lm1hcmdpblN0YXJ0KCksIDBfbHUpOwotICAgICsrbV9u
b25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQ7Ci0gICAgYXBwZW5kTm9uQnJlYWthYmxlU3Bh
Y2UoaW5saW5lSXRlbSwgYWRqdXN0ZWRSdW5TdGFydCwgbG9naWNhbFdpZHRoKTsKLX0KLQotdm9p
ZCBMaW5lOjphcHBlbmRJbmxpbmVCb3hFbmQoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwg
SW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi17Ci0gICAgLy8gVGhpcyBpcyByZWFsbHkg
anVzdCBhIHBsYWNlaG9sZGVyIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgaW5saW5lIGJveCA8L3Nw
YW4+LgotICAgIGF1dG8gcmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nID0gWyZdIHsKLSAgICAg
ICAgaWYgKCFtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudC5pc1RyYWlsaW5nUnVuUGFydGlhbGx5
VHJpbW1hYmxlKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIG1fY29udGVudExvZ2lj
YWxXaWR0aCAtPSBtX3RyaW1tYWJsZVRyYWlsaW5nQ29udGVudC5yZW1vdmVQYXJ0aWFsbHlUcmlt
bWFibGVDb250ZW50KCk7Ci0gICAgfTsKLSAgICAvLyBQcmV2ZW50IHRyYWlsaW5nIGxldHRlci1z
cGFjaW5nIGZyb20gc3BpbGxpbmcgb3V0IG9mIHRoZSBpbmxpbmUgYm94LgotICAgIC8vIGh0dHBz
Oi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdGV4dC0zLyNsZXR0ZXItc3BhY2luZy1wcm9wZXJ0eSBT
ZWUgZXhhbXBsZSAyMS4KLSAgICByZW1vdmVUcmFpbGluZ0xldHRlclNwYWNpbmcoKTsKLSAgICBh
cHBlbmROb25CcmVha2FibGVTcGFjZShpbmxpbmVJdGVtLCBjb250ZW50TG9naWNhbFdpZHRoKCks
IGxvZ2ljYWxXaWR0aCk7Ci19Ci0KLXZvaWQgTGluZTo6YXBwZW5kVGV4dENvbnRlbnQoY29uc3Qg
SW5saW5lVGV4dEl0ZW0mIGlubGluZVRleHRJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxX
aWR0aCkKLXsKLSAgICBhdXRvJiBzdHlsZSA9IGlubGluZVRleHRJdGVtLnN0eWxlKCk7Ci0gICAg
YXV0byB3aWxsQ29sbGFwc2VDb21wbGV0ZWx5ID0gWyZdIHsKLSAgICAgICAgaWYgKGlubGluZVRl
eHRJdGVtLmlzRW1wdHlDb250ZW50KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgaWYgKCFpbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgaWYgKElubGluZVRleHRJdGVtOjpzaG91bGRQcmVzZXJ2ZVNwYWNl
c0FuZFRhYnMoaW5saW5lVGV4dEl0ZW0pKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICAvLyBDaGVjayBpZiB0aGUgbGFzdCBpdGVtIGlzIGNvbGxhcHNlZCBhcyB3ZWxsLgotICAg
ICAgICBmb3IgKGF1dG8mIHJ1biA6IFdURjo6bWFrZVJldmVyc2VkUmFuZ2UobV9ydW5zKSkgewot
ICAgICAgICAgICAgaWYgKHJ1bi5pc0JveCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgICAgIC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdGV4dC0zLyN3
aGl0ZS1zcGFjZS1waGFzZS0xCi0gICAgICAgICAgICAvLyBBbnkgY29sbGFwc2libGUgc3BhY2Ug
aW1tZWRpYXRlbHkgZm9sbG93aW5nIGFub3RoZXIgY29sbGFwc2libGUgc3BhY2XigJRldmVuIG9u
ZSBvdXRzaWRlIHRoZSBib3VuZGFyeSBvZiB0aGUgaW5saW5lIGNvbnRhaW5pbmcgdGhhdCBzcGFj
ZSwKLSAgICAgICAgICAgIC8vIHByb3ZpZGVkIGJvdGggc3BhY2VzIGFyZSB3aXRoaW4gdGhlIHNh
bWUgaW5saW5lIGZvcm1hdHRpbmcgY29udGV4dOKAlGlzIGNvbGxhcHNlZCB0byBoYXZlIHplcm8g
YWR2YW5jZSB3aWR0aC4KLSAgICAgICAgICAgIC8vIDogIjxzcGFuPiAgPC9zcGFuPiAiIDwtIHRo
ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGNvbGxhcHNlcyBjb21wbGV0ZWx5LgotICAgICAgICAgICAg
Ly8gTm90IHRoYXQgd2hlbiB0aGUgaW5saW5lIGJveCBoYXMgcHJlc2VydmUgd2hpdGVzcGFjZSBz
dHlsZSwgIjxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogcHJlIj4gIDwvc3Bhbj4gIiA8LSB0aGlz
IHdoaXRlc3BhY2Ugc3RheXMgYXJvdW5kLgotICAgICAgICAgICAgaWYgKHJ1bi5pc1RleHQoKSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gcnVuLmhhc0NvbGxhcHNpYmxlVHJhaWxpbmdXaGl0ZXNw
YWNlKCk7Ci0gICAgICAgICAgICBBU1NFUlQocnVuLmlzSW5saW5lQm94U3RhcnQoKSB8fCBydW4u
aXNJbmxpbmVCb3hFbmQoKSB8fCBydW4uaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgpKTsKLSAgICAg
ICAgfQotICAgICAgICAvLyBMZWFkaW5nIHdoaXRlc3BhY2UuCi0gICAgICAgIHJldHVybiB0cnVl
OwotICAgIH07Ci0KLSAgICBpZiAod2lsbENvbGxhcHNlQ29tcGxldGVseSgpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBhdXRvIG5lZWRzTmV3UnVuID0gWyZdIHsKLSAgICAgICAgaWYgKG1fcnVu
cy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgYXV0byYgbGFz
dFJ1biA9IG1fcnVucy5sYXN0KCk7Ci0gICAgICAgIGlmICgmbGFzdFJ1bi5sYXlvdXRCb3goKSAh
PSAmaW5saW5lVGV4dEl0ZW0ubGF5b3V0Qm94KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICAgICAgaWYgKCFsYXN0UnVuLmlzVGV4dCgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgICAgIGlmIChsYXN0UnVuLmhhc0NvbGxhcHNlZFRyYWlsaW5nV2hpdGVzcGFjZSgpKQot
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChpbmxpbmVUZXh0SXRlbS5pc1dv
cmRTZXBhcmF0b3IoKSAmJiBzdHlsZS5mb250Q2FzY2FkZSgpLndvcmRTcGFjaW5nKCkpCi0gICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0oKTsKLSAg
ICBhdXRvIG9sZENvbnRlbnRMb2dpY2FsV2lkdGggPSBjb250ZW50TG9naWNhbFdpZHRoKCk7Ci0g
ICAgaWYgKG5lZWRzTmV3UnVuKSB7Ci0gICAgICAgIC8vIE5vdGUsIG5lZ2F0aXZlIHdvcmRzIHNw
YWNpbmcgbWF5IGNhdXNlIGdseXBoIG92ZXJsYXAuCi0gICAgICAgIGF1dG8gcnVuTG9naWNhbExl
ZnQgPSBjb250ZW50TG9naWNhbFJpZ2h0KCkgKyAoaW5saW5lVGV4dEl0ZW0uaXNXb3JkU2VwYXJh
dG9yKCkgPyBzdHlsZS5mb250Q2FzY2FkZSgpLndvcmRTcGFjaW5nKCkgOiAwLjBmKTsKLSAgICAg
ICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZVRleHRJdGVtLCBydW5Mb2dpY2FsTGVmdCwgbG9naWNh
bFdpZHRoIH0pOwotICAgICAgICBtX2NvbnRlbnRMb2dpY2FsV2lkdGggPSBzdGQ6Om1heChvbGRD
b250ZW50TG9naWNhbFdpZHRoLCBydW5Mb2dpY2FsTGVmdCArIGxvZ2ljYWxXaWR0aCk7Ci0gICAg
fSBlbHNlIHsKLSAgICAgICAgbV9ydW5zLmxhc3QoKS5leHBhbmQoaW5saW5lVGV4dEl0ZW0sIGxv
Z2ljYWxXaWR0aCk7Ci0gICAgICAgIC8vIERvIG5vdCBsZXQgbmVnYXRpdmUgbGV0dGVyIHNwYWNp
bmcgbWFrZSB0aGUgY29udGVudCBzaG9ydGVyIHRoYW4gaXQgYWxyZWFkeSBpcy4KLSAgICAgICAg
bV9jb250ZW50TG9naWNhbFdpZHRoICs9IHN0ZDo6bWF4KDAuMGYsIGxvZ2ljYWxXaWR0aCk7Ci0g
ICAgfQotICAgIC8vIFNldCB0aGUgdHJhaWxpbmcgdHJpbW1hYmxlIGNvbnRlbnQuCi0gICAgaWYg
KGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpICYmICFJbmxpbmVUZXh0SXRlbTo6c2hvdWxk
UHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtKSkgewotICAgICAgICBtX3RyaW1t
YWJsZVRyYWlsaW5nQ29udGVudC5hZGRGdWxseVRyaW1tYWJsZUNvbnRlbnQobV9ydW5zLnNpemUo
KSAtIDEsIGNvbnRlbnRMb2dpY2FsV2lkdGgoKSAtIG9sZENvbnRlbnRMb2dpY2FsV2lkdGgpOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIEFueSBub24td2hpdGVzcGFjZSwgbm8tdHJp
bW1hYmxlIGNvbnRlbnQgcmVzZXRzIHRoZSBleGlzdGluZyB0cmltbWFibGUuCi0gICAgbV90cmlt
bWFibGVUcmFpbGluZ0NvbnRlbnQucmVzZXQoKTsKLSAgICBpZiAoIWZvcm1hdHRpbmdDb250ZXh0
KCkubGF5b3V0U3RhdGUoKS5zaG91bGRJZ25vcmVUcmFpbGluZ0xldHRlclNwYWNpbmcoKSAmJiAh
aW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNlKCkgJiYgc3R5bGUubGV0dGVyU3BhY2luZygpID4g
MCkKLSAgICAgICAgbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQuYWRkUGFydGlhbGx5VHJpbW1h
YmxlQ29udGVudChtX3J1bnMuc2l6ZSgpIC0gMSwgc3R5bGUubGV0dGVyU3BhY2luZygpKTsKLSAg
ICBtX3RyYWlsaW5nU29mdEh5cGhlbldpZHRoID0gaW5saW5lVGV4dEl0ZW0uaGFzVHJhaWxpbmdT
b2Z0SHlwaGVuKCkgPyBtYWtlT3B0aW9uYWwoc3R5bGUuZm9udENhc2NhZGUoKS53aWR0aChUZXh0
UnVuIHsgU3RyaW5nVmlldyB7IHN0eWxlLmh5cGhlblN0cmluZygpIH0gfSkpIDogV1RGOjpudWxs
b3B0OwotfQotCi12b2lkIExpbmU6OmFwcGVuZE5vblJlcGxhY2VkSW5saW5lTGV2ZWxCb3goY29u
c3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBtYXJnaW5Cb3hMb2dp
Y2FsV2lkdGgpCi17Ci0gICAgbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQucmVzZXQoKTsKLSAg
ICBtX3RyYWlsaW5nU29mdEh5cGhlbldpZHRoID0geyB9OwotICAgIG1fY29udGVudExvZ2ljYWxX
aWR0aCArPSBtYXJnaW5Cb3hMb2dpY2FsV2lkdGg7Ci0gICAgKyttX25vblNwYW5uaW5nSW5saW5l
TGV2ZWxCb3hDb3VudDsKLSAgICBhdXRvIG1hcmdpblN0YXJ0ID0gZm9ybWF0dGluZ0NvbnRleHQo
KS5nZW9tZXRyeUZvckJveChpbmxpbmVJdGVtLmxheW91dEJveCgpKS5tYXJnaW5TdGFydCgpOwot
ICAgIGlmIChtYXJnaW5TdGFydCA+PSAwKSB7Ci0gICAgICAgIG1fcnVucy5hcHBlbmQoeyBpbmxp
bmVJdGVtLCBjb250ZW50TG9naWNhbFJpZ2h0KCksIG1hcmdpbkJveExvZ2ljYWxXaWR0aCB9KTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBOZWdhdGl2ZSBtYXJnaW4tc3RhcnQgcHVs
bHMgdGhlIGNvbnRlbnQgdG8gdGhlIGxvZ2ljYWwgbGVmdCBkaXJlY3Rpb24uCi0gICAgLy8gTmVn
YXRpdmUgbWFyZ2luIGFsc28gc3F1ZWV6ZXMgdGhlIG1hcmdpbiBib3gsIHdlIG5lZWQgdG8gc3Ry
ZXRjaCBpdCB0byBtYWtlIHN1cmUgdGhlIHN1YnNlcXVlbnQgY29udGVudCB3b24ndCBvdmVybGFw
LgotICAgIC8vIGUuZy4gPGltZyBzdHlsZT0id2lkdGg6IDEwMHB4OyBtYXJnaW4tbGVmdDogLTEw
MHB4OyI+IHB1bGxzIHRoZSByZXBsYWNlZCBib3ggdG8gLTEwMHB4IHdpdGggdGhlIG1hcmdpbiBi
b3ggd2lkdGggb2YgMHB4LgotICAgIC8vIEluc3RlYWQgd2UgbmVlZCB0byBwb3NpdGlvbiBpdCBh
dCAtMTAwcHggYW5kIHNpemUgaXQgdG8gMTAwcHggc28gdGhlIHN1YnNlcXVlbnQgY29udGVudCBz
dGFydHMgYXQgMHB4LiAKLSAgICBtX3J1bnMuYXBwZW5kKHsgaW5saW5lSXRlbSwgY29udGVudExv
Z2ljYWxSaWdodCgpICsgbWFyZ2luU3RhcnQsIG1hcmdpbkJveExvZ2ljYWxXaWR0aCAtIG1hcmdp
blN0YXJ0IH0pOwotfQotCi12b2lkIExpbmU6OmFwcGVuZFJlcGxhY2VkSW5saW5lTGV2ZWxCb3go
Y29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBtYXJnaW5Cb3hM
b2dpY2FsV2lkdGgpCi17Ci0gICAgQVNTRVJUKGlubGluZUl0ZW0ubGF5b3V0Qm94KCkuaXNSZXBs
YWNlZEJveCgpKTsKLSAgICAvLyBGSVhNRTogU3VyZWx5IHJlcGxhY2VkIGJveGVzIGJlaGF2ZSBk
aWZmZXJlbnRseS4KLSAgICBhcHBlbmROb25SZXBsYWNlZElubGluZUxldmVsQm94KGlubGluZUl0
ZW0sIG1hcmdpbkJveExvZ2ljYWxXaWR0aCk7Ci19Ci0KLXZvaWQgTGluZTo6YXBwZW5kTGluZUJy
ZWFrKGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0pCi17Ci0gICAgbV90cmFpbGluZ1NvZnRI
eXBoZW5XaWR0aCA9IHsgfTsKLSAgICBpZiAoaW5saW5lSXRlbS5pc0hhcmRMaW5lQnJlYWsoKSkg
ewotICAgICAgICArK21fbm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50OwotICAgICAgICBy
ZXR1cm4gbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGNvbnRlbnRMb2dpY2FsUmlnaHQoKSwg
MF9sdSB9KTsKLSAgICB9Ci0gICAgLy8gU29mdCBsaW5lIGJyZWFrcyAocHJlc2VydmVkIG5ldyBs
aW5lIGNoYXJhY3RlcnMpIHJlcXVpcmUgaW5saW5lIHRleHQgYm94ZXMgZm9yIGNvbXBhdGliaWxp
dHkgcmVhc29ucy4KLSAgICBBU1NFUlQoaW5saW5lSXRlbS5pc1NvZnRMaW5lQnJlYWsoKSk7Ci0g
ICAgbV9ydW5zLmFwcGVuZCh7IGRvd25jYXN0PElubGluZVNvZnRMaW5lQnJlYWtJdGVtPihpbmxp
bmVJdGVtKSwgY29udGVudExvZ2ljYWxSaWdodCgpIH0pOwotfQotCi12b2lkIExpbmU6OmFwcGVu
ZFdvcmRCcmVha09wcG9ydHVuaXR5KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0pCi17Ci0g
ICAgbV9ydW5zLmFwcGVuZCh7IGlubGluZUl0ZW0sIGNvbnRlbnRMb2dpY2FsUmlnaHQoKSwgMF9s
dSB9KTsKLX0KLQotdm9pZCBMaW5lOjphZGRUcmFpbGluZ0h5cGhlbihJbmxpbmVMYXlvdXRVbml0
IGh5cGhlbkxvZ2ljYWxXaWR0aCkKLXsKLSAgICBmb3IgKGF1dG8mIHJ1biA6IFdURjo6bWFrZVJl
dmVyc2VkUmFuZ2UobV9ydW5zKSkgewotICAgICAgICBpZiAoIXJ1bi5pc1RleHQoKSkKLSAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICBydW4uc2V0TmVlZHNIeXBoZW4oaHlwaGVuTG9naWNh
bFdpZHRoKTsKLSAgICAgICAgbV9jb250ZW50TG9naWNhbFdpZHRoICs9IGh5cGhlbkxvZ2ljYWxX
aWR0aDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LX0KLQotY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIExpbmU6OmZvcm1hdHRpbmdDb250
ZXh0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKLX0K
LQotTGluZTo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50OjpUcmltbWFibGVUcmFpbGluZ0NvbnRl
bnQoUnVuTGlzdCYgcnVucykKLSAgICA6IG1fcnVucyhydW5zKQotewotfQotCi12b2lkIExpbmU6
OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVudDo6YWRkRnVsbHlUcmltbWFibGVDb250ZW50KHNpemVf
dCBydW5JbmRleCwgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVXaWR0aCkKLXsKLSAgICAvLyBB
bnkgc3Vic2VxdWVudCB0cmltbWFibGUgd2hpdGVzcGFjZSBzaG91bGQgY29sbGFwc2UgdG8gemVy
byBhZHZhbmNlZCB3aWR0aCBhbmQgaWdub3JlZCBhdCA6OmFwcGVuZFRleHRDb250ZW50KCkuCi0g
ICAgQVNTRVJUKCFtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudCk7Ci0gICAgbV9mdWxseVRyaW1t
YWJsZVdpZHRoID0gdHJpbW1hYmxlV2lkdGg7Ci0gICAgLy8gTm90ZSB0aGF0IGp1c3QgYmVjYXVz
ZSB0aGUgdHJpbW1hYmxlIHdpZHRoIGlzIDAgKGZvbnQtc2l6ZTogMHB4KSwgaXQgZG9lcyBub3Qg
bWVhbiB3ZSBkb24ndCBoYXZlIGEgdHJpbW1hYmxlIHRyYWlsaW5nIGNvbnRlbnQuCi0gICAgbV9o
YXNGdWxseVRyaW1tYWJsZUNvbnRlbnQgPSB0cnVlOwotICAgIG1fZmlyc3RUcmltbWFibGVSdW5J
bmRleCA9IG1fZmlyc3RUcmltbWFibGVSdW5JbmRleC52YWx1ZU9yKHJ1bkluZGV4KTsKLX0KLQot
dm9pZCBMaW5lOjpUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQ6OmFkZFBhcnRpYWxseVRyaW1tYWJs
ZUNvbnRlbnQoc2l6ZV90IHJ1bkluZGV4LCBJbmxpbmVMYXlvdXRVbml0IHRyaW1tYWJsZVdpZHRo
KQotewotICAgIC8vIERvIG5vdCBhZGQgdHJpbW1hYmxlIGxldHRlciBzcGFjaW5nIGFmdGVyIGEg
ZnVsbHkgdHJpbW1hYmxlIHdoaXRlc3BhY2UuCi0gICAgQVNTRVJUKCFtX2ZpcnN0VHJpbW1hYmxl
UnVuSW5kZXgpOwotICAgIEFTU0VSVCghbV9oYXNGdWxseVRyaW1tYWJsZUNvbnRlbnQpOwotICAg
IEFTU0VSVCghbV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aCk7Ci0gICAgQVNTRVJUKHRyaW1tYWJs
ZVdpZHRoKTsKLSAgICBtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRoID0gdHJpbW1hYmxlV2lkdGg7
Ci0gICAgbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4ID0gcnVuSW5kZXg7Ci19Ci0KLUlubGluZUxh
eW91dFVuaXQgTGluZTo6VHJpbW1hYmxlVHJhaWxpbmdDb250ZW50OjpyZW1vdmUoKQotewotICAg
IC8vIFJlbW92ZSB0cmltbWFibGUgdHJhaWxpbmcgY29udGVudCBhbmQgbW92ZSBhbGwgdGhlIHN1
YnNlcXVlbnQgdHJhaWxpbmcgcnVucy4KLSAgICAvLyA8c3Bhbj4gPC9zcGFuPjxzcGFuPjwvc3Bh
bj4KLSAgICAvLyBbdHJhaWxpbmcgd2hpdGVzcGFjZV1baW5saW5lIGJveCBlbmRdW2lubGluZSBi
b3ggc3RhcnRdW2lubGluZSBib3ggZW5kXQotICAgIC8vIFRyaW0gdGhlIHdoaXRlc3BhY2UgcnVu
IGFuZCBtb3ZlIHRoZSB0cmFpbGluZyBpbmxpbmUgYm94IHJ1bnMgdG8gdGhlIGxvZ2ljYWwgbGVm
dC4KLSAgICBBU1NFUlQoIWlzRW1wdHkoKSk7Ci0gICAgYXV0byYgdHJpbW1hYmxlUnVuID0gbV9y
dW5zWyptX2ZpcnN0VHJpbW1hYmxlUnVuSW5kZXhdOwotICAgIEFTU0VSVCh0cmltbWFibGVSdW4u
aXNUZXh0KCkpOwotCi0gICAgaWYgKG1faGFzRnVsbHlUcmltbWFibGVDb250ZW50KQotICAgICAg
ICB0cmltbWFibGVSdW4ucmVtb3ZlVHJhaWxpbmdXaGl0ZXNwYWNlKCk7Ci0gICAgaWYgKG1fcGFy
dGlhbGx5VHJpbW1hYmxlV2lkdGgpCi0gICAgICAgIHRyaW1tYWJsZVJ1bi5yZW1vdmVUcmFpbGlu
Z0xldHRlclNwYWNpbmcoKTsKLQotICAgIGF1dG8gdHJpbW1hYmxlV2lkdGggPSB3aWR0aCgpOwot
ICAgIC8vIFdoZW4gdGhlIHRyaW1tYWJsZSBydW4gaXMgZm9sbG93ZWQgYnkgc29tZSBub24tY29u
dGVudCBydW5zLCB3ZSBuZWVkIHRvIGFkanVzdCB0aGVpciBob3Jpem9udGFsIHBvc2l0aW9ucy4K
LSAgICAvLyBlLmcuIDxkaXY+dGV4dCBpcyBmb2xsb3dlZCBieSB0cmltbWFibGUgY29udGVudCAg
ICA8c3Bhbj4gPC9zcGFuPjwvZGl2PgotICAgIC8vIFdoZW4gdGhlIFt0ZXh0Li4uXSBydW4gaXMg
dHJpbW1lZCAodHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZW1vdmVkKSwgYm90aCAiPHNwYW4+IiBh
bmQgIjwvc3Bhbj4iIHJ1bnMKLSAgICAvLyBuZWVkIHRvIGJlIG1vdmVkIGhvcml6b250YWxseSB0
byBjYXRjaCB1cCB3aXRoIHRoZSBbdGV4dC4uLl0gcnVuLiBOb3RlIHRoYXQgdGhlIHdoaXRlc3Bh
Y2UgaW5zaWRlIHRoZSA8c3Bhbj4gZG9lcwotICAgIC8vIG5vdCBwcm9kdWNlIGEgcnVuIHNpbmNl
IGluIDo6YXBwZW5kVGV4dCgpIHdlIHNlZSBpdCBhcyBhIGZ1bGx5IGNvbGxhcHNpYmxlIHJ1bi4K
LSAgICBmb3IgKGF1dG8gaW5kZXggPSAqbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4ICsgMTsgaW5k
ZXggPCBtX3J1bnMuc2l6ZSgpOyArK2luZGV4KSB7Ci0gICAgICAgIGF1dG8mIHJ1biA9IG1fcnVu
c1tpbmRleF07Ci0gICAgICAgIEFTU0VSVChydW4uaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgpIHx8
IHJ1bi5pc0lubGluZUJveFN0YXJ0KCkgfHwgcnVuLmlzSW5saW5lQm94RW5kKCkgfHwgcnVuLmlz
TGluZUJyZWFrKCkpOwotICAgICAgICBydW4ubW92ZUhvcml6b250YWxseSgtdHJpbW1hYmxlV2lk
dGgpOwotICAgIH0KLSAgICBpZiAoIXRyaW1tYWJsZVJ1bi50ZXh0Q29udGVudCgpLT5sZW5ndGgo
KSkgewotICAgICAgICAvLyBUaGlzIHRyaW1tYWJsZSBydW4gaXMgZnVsbHkgY29sbGFwc2VkIG5v
dyAoZS5nLiA8ZGl2PjxpbWc+ICAgIDxzcGFuPjwvc3Bhbj48L2Rpdj4pLgotICAgICAgICAvLyBX
ZSBkb24ndCBuZWVkIHRvIGtlZXAgaXQgYXJvdW5kIGFueW1vcmUuCi0gICAgICAgIG1fcnVucy5y
ZW1vdmUoKm1fZmlyc3RUcmltbWFibGVSdW5JbmRleCk7Ci0gICAgfQotICAgIHJlc2V0KCk7Ci0g
ICAgcmV0dXJuIHRyaW1tYWJsZVdpZHRoOwotfQotCi1JbmxpbmVMYXlvdXRVbml0IExpbmU6OlRy
aW1tYWJsZVRyYWlsaW5nQ29udGVudDo6cmVtb3ZlUGFydGlhbGx5VHJpbW1hYmxlQ29udGVudCgp
Ci17Ci0gICAgLy8gUGFydGlhbGx5IHRyaW1tYWJsZSBjb250ZW50IGlzIGFsd2F5cyBnYXRlZCBi
eSBhIGZ1bGx5IHRyaW1tYWJsZSBjb250ZW50LgotICAgIC8vIFdlIGNhbid0IGp1c3QgdHJpbSBz
cGFjaW5nIGluIHRoZSBtaWRkbGUuCi0gICAgQVNTRVJUKCFtX2Z1bGx5VHJpbW1hYmxlV2lkdGgp
OwotICAgIHJldHVybiByZW1vdmUoKTsKLX0KLQotTGluZTo6UnVuOjpSdW4oY29uc3QgSW5saW5l
SXRlbSYgaW5saW5lSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsV2lkdGgpCi0gICAgOiBtX3R5cGUoaW5saW5lSXRlbS50eXBlKCkpCi0g
ICAgLCBtX2xheW91dEJveCgmaW5saW5lSXRlbS5sYXlvdXRCb3goKSkKLSAgICAsIG1fbG9naWNh
bExlZnQobG9naWNhbExlZnQpCi0gICAgLCBtX2xvZ2ljYWxXaWR0aChsb2dpY2FsV2lkdGgpCi17
Ci19Ci0KLUxpbmU6OlJ1bjo6UnVuKGNvbnN0IElubGluZVNvZnRMaW5lQnJlYWtJdGVtJiBzb2Z0
TGluZUJyZWFrSXRlbSwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCkKLSAgICA6IG1fdHlw
ZShzb2Z0TGluZUJyZWFrSXRlbS50eXBlKCkpCi0gICAgLCBtX2xheW91dEJveCgmc29mdExpbmVC
cmVha0l0ZW0ubGF5b3V0Qm94KCkpCi0gICAgLCBtX2xvZ2ljYWxMZWZ0KGxvZ2ljYWxMZWZ0KQot
ICAgICwgbV90ZXh0Q29udGVudCh7IHNvZnRMaW5lQnJlYWtJdGVtLnBvc2l0aW9uKCksIDEsIHNv
ZnRMaW5lQnJlYWtJdGVtLmlubGluZVRleHRCb3goKS5jb250ZW50KCkgfSkKLXsKLX0KLQotTGlu
ZTo6UnVuOjpSdW4oY29uc3QgSW5saW5lVGV4dEl0ZW0mIGlubGluZVRleHRJdGVtLCBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKLSAg
ICA6IG1fdHlwZShJbmxpbmVJdGVtOjpUeXBlOjpUZXh0KQotICAgICwgbV9sYXlvdXRCb3goJmlu
bGluZVRleHRJdGVtLmxheW91dEJveCgpKQotICAgICwgbV9sb2dpY2FsTGVmdChsb2dpY2FsTGVm
dCkKLSAgICAsIG1fbG9naWNhbFdpZHRoKGxvZ2ljYWxXaWR0aCkKLSAgICAsIG1fd2hpdGVzcGFj
ZUlzRXhwYW5zaW9uT3Bwb3J0dW5pdHkoIVRleHRVdGlsOjpzaG91bGRQcmVzZXJ2ZVNwYWNlc0Fu
ZFRhYnMoaW5saW5lVGV4dEl0ZW0ubGF5b3V0Qm94KCkpKQotICAgICwgbV90cmFpbGluZ1doaXRl
c3BhY2VUeXBlKHRyYWlsaW5nV2hpdGVzcGFjZVR5cGUoaW5saW5lVGV4dEl0ZW0pKQotICAgICwg
bV90ZXh0Q29udGVudCh7IGlubGluZVRleHRJdGVtLnN0YXJ0KCksIG1fdHJhaWxpbmdXaGl0ZXNw
YWNlVHlwZSA9PSBUcmFpbGluZ1doaXRlc3BhY2U6OkNvbGxhcHNlZCA/IDEgOiBpbmxpbmVUZXh0
SXRlbS5sZW5ndGgoKSwgaW5saW5lVGV4dEl0ZW0uaW5saW5lVGV4dEJveCgpLmNvbnRlbnQoKSB9
KQotewotICAgIGlmIChtX3RyYWlsaW5nV2hpdGVzcGFjZVR5cGUgIT0gVHJhaWxpbmdXaGl0ZXNw
YWNlOjpOb25lKSB7Ci0gICAgICAgIG1fdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGggPSBsb2dpY2Fs
V2lkdGg7Ci0gICAgICAgIGlmIChtX3doaXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9ydHVuaXR5KQot
ICAgICAgICAgICAgbV9leHBhbnNpb25PcHBvcnR1bml0eUNvdW50ID0gMTsKLSAgICB9Ci19Ci0K
LXZvaWQgTGluZTo6UnVuOjpleHBhbmQoY29uc3QgSW5saW5lVGV4dEl0ZW0mIGlubGluZVRleHRJ
dGVtLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKLXsKLSAgICAvLyBGSVhNRTogVGhp
cyBpcyBhIHZlcnkgc2ltcGxlIGV4cGFuc2lvbiBtZXJnZS4gV2Ugc2hvdWxkIGV2ZW50dWFsbHkg
c3dpdGNoIG92ZXIgdG8gRm9udENhc2NhZGU6OmV4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQuCi0g
ICAgQVNTRVJUKCFoYXNDb2xsYXBzZWRUcmFpbGluZ1doaXRlc3BhY2UoKSk7Ci0gICAgQVNTRVJU
KGlzVGV4dCgpICYmIGlubGluZVRleHRJdGVtLmlzVGV4dCgpKTsKLSAgICBBU1NFUlQobV9sYXlv
dXRCb3ggPT0gJmlubGluZVRleHRJdGVtLmxheW91dEJveCgpKTsKLQotICAgIG1fbG9naWNhbFdp
ZHRoICs9IGxvZ2ljYWxXaWR0aDsKLSAgICBtX3RyYWlsaW5nV2hpdGVzcGFjZVR5cGUgPSB0cmFp
bGluZ1doaXRlc3BhY2VUeXBlKGlubGluZVRleHRJdGVtKTsKLQotICAgIGlmIChtX3RyYWlsaW5n
V2hpdGVzcGFjZVR5cGUgPT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25lKSB7Ci0gICAgICAgIG1f
dHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGggPSB7IH07Ci0gICAgICAgIHNldEV4cGFuc2lvbkJlaGF2
aW9yKEFsbG93TGVmdEV4cGFuc2lvbiB8IEFsbG93UmlnaHRFeHBhbnNpb24pOwotICAgICAgICBt
X3RleHRDb250ZW50LT5leHBhbmQoaW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotICAgIG1fdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGggKz0gbG9naWNhbFdp
ZHRoOwotICAgIGlmIChtX3doaXRlc3BhY2VJc0V4cGFuc2lvbk9wcG9ydHVuaXR5KQotICAgICAg
ICArK21fZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudDsKLSAgICBzZXRFeHBhbnNpb25CZWhhdmlv
cihEZWZhdWx0RXhwYW5zaW9uKTsKLSAgICBtX3RleHRDb250ZW50LT5leHBhbmQobV90cmFpbGlu
Z1doaXRlc3BhY2VUeXBlID09IFRyYWlsaW5nV2hpdGVzcGFjZTo6Q29sbGFwc2VkID8gMSA6IGlu
bGluZVRleHRJdGVtLmxlbmd0aCgpKTsKLX0KLQotYm9vbCBMaW5lOjpSdW46Omhhc1RyYWlsaW5n
TGV0dGVyU3BhY2luZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICFoYXNUcmFpbGluZ1doaXRlc3Bh
Y2UoKSAmJiBzdHlsZSgpLmxldHRlclNwYWNpbmcoKSA+IDA7Ci19Ci0KLUlubGluZUxheW91dFVu
aXQgTGluZTo6UnVuOjp0cmFpbGluZ0xldHRlclNwYWNpbmcoKSBjb25zdAotewotICAgIGlmICgh
aGFzVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkpCi0gICAgICAgIHJldHVybiB7IH07Ci0gICAgcmV0
dXJuIElubGluZUxheW91dFVuaXQgeyBzdHlsZSgpLmxldHRlclNwYWNpbmcoKSB9OwotfQotCi12
b2lkIExpbmU6OlJ1bjo6cmVtb3ZlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkKLXsKLSAgICBBU1NF
UlQoaGFzVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKCkpOwotICAgIHNocmlua0hvcml6b250YWxseSh0
cmFpbGluZ0xldHRlclNwYWNpbmcoKSk7Ci0gICAgQVNTRVJUKGxvZ2ljYWxXaWR0aCgpID4gMCB8
fCAoIWxvZ2ljYWxXaWR0aCgpICYmIHN0eWxlKCkubGV0dGVyU3BhY2luZygpID49IHN0YXRpY19j
YXN0PGZsb2F0PihpbnRNYXhGb3JMYXlvdXRVbml0KSkpOwotfQotCi12b2lkIExpbmU6OlJ1bjo6
cmVtb3ZlVHJhaWxpbmdXaGl0ZXNwYWNlKCkKLXsKLSAgICAvLyBBY2NvcmRpbmcgdG8gaHR0cHM6
Ly93d3cudzMub3JnL1RSL2Nzcy10ZXh0LTMvI3doaXRlLXNwYWNlLXByb3BlcnR5IG1hdHJpeAot
ICAgIC8vIFRyaW1tYWJsZSB3aGl0ZXNwYWNlIGlzIGFsd2F5cyBjb2xsYXBzaWJsZSBzbyB0aGUg
bGVuZ3RoIG9mIHRoZSB0cmFpbGluZyB0cmltbWFibGUgd2hpdGVzcGFjZSBpcyBhbHdheXMgMSAo
b3Igbm9uLWV4aXN0ZW50KS4KLSAgICBBU1NFUlQobV90ZXh0Q29udGVudC0+bGVuZ3RoKCkpOwot
ICAgIGNvbnN0ZXhwciBzaXplX3QgdHJhaWxpbmdUcmltbWFibGVDb250ZW50TGVuZ3RoID0gMTsK
LSAgICBtX3RleHRDb250ZW50LT5zaHJpbmsodHJhaWxpbmdUcmltbWFibGVDb250ZW50TGVuZ3Ro
KTsKLSAgICB2aXN1YWxseUNvbGxhcHNlVHJhaWxpbmdXaGl0ZXNwYWNlKCk7Ci19Ci0KLXZvaWQg
TGluZTo6UnVuOjp2aXN1YWxseUNvbGxhcHNlVHJhaWxpbmdXaGl0ZXNwYWNlKCkKLXsKLSAgICAv
LyBUaGlzIGlzIGp1c3QgYSB2aXN1YWwgYWRqdXN0bWVudCwgdGhlIHRleHQgbGVuZ3RoIHNob3Vs
ZCByZW1haW4gdGhlIHNhbWUuCi0gICAgc2hyaW5rSG9yaXpvbnRhbGx5KG1fdHJhaWxpbmdXaGl0
ZXNwYWNlV2lkdGgpOwotICAgIG1fdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGggPSB7IH07Ci0gICAg
bV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25lOwotCi0g
ICAgaWYgKG1fd2hpdGVzcGFjZUlzRXhwYW5zaW9uT3Bwb3J0dW5pdHkpIHsKLSAgICAgICAgQVNT
RVJUKG1fZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3VudCk7Ci0gICAgICAgIG1fZXhwYW5zaW9uT3Bw
b3J0dW5pdHlDb3VudC0tOwotICAgIH0KLSAgICBzZXRFeHBhbnNpb25CZWhhdmlvcihBbGxvd0xl
ZnRFeHBhbnNpb24gfCBBbGxvd1JpZ2h0RXhwYW5zaW9uKTsKLX0KLQotdm9pZCBMaW5lOjpSdW46
OnNldEV4cGFuc2lvbkJlaGF2aW9yKEV4cGFuc2lvbkJlaGF2aW9yIGV4cGFuc2lvbkJlaGF2aW9y
KQotewotICAgIEFTU0VSVChpc1RleHQoKSk7Ci0gICAgbV9leHBhbnNpb24uYmVoYXZpb3IgPSBl
eHBhbnNpb25CZWhhdmlvcjsKLX0KLQotRXhwYW5zaW9uQmVoYXZpb3IgTGluZTo6UnVuOjpleHBh
bnNpb25CZWhhdmlvcigpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGlzVGV4dCgpKTsKLSAgICByZXR1
cm4gbV9leHBhbnNpb24uYmVoYXZpb3I7Ci19Ci0KLXZvaWQgTGluZTo6UnVuOjpzZXRIb3Jpem9u
dGFsRXhwYW5zaW9uKElubGluZUxheW91dFVuaXQgbG9naWNhbEV4cGFuc2lvbikKLXsKLSAgICBB
U1NFUlQoaXNUZXh0KCkpOwotICAgIEFTU0VSVChoYXNFeHBhbnNpb25PcHBvcnR1bml0eSgpKTsK
LSAgICBtX2V4cGFuc2lvbi5ob3Jpem9udGFsRXhwYW5zaW9uID0gbG9naWNhbEV4cGFuc2lvbjsK
LX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lLmggYi9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5l
TGluZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTMzNTE5NTIxYWE5ZTRmOTZh
NzkzNGFlZDhjMDMyY2M5ZTc5M2Y1Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5s
aW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBA
QAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRU
SU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJJbmxpbmVJdGVtLmgiCi0jaW5jbHVkZSAiSW5saW5l
TGluZVJ1bi5oIgotI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgiCi0KLW5hbWVzcGFjZSBXZWJD
b3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBJbmxpbmVGb3JtYXR0aW5nQ29udGV4
dDsKLWNsYXNzIElubGluZVNvZnRMaW5lQnJlYWtJdGVtOwotCi1jbGFzcyBMaW5lIHsKLXB1Ymxp
YzoKLSAgICBMaW5lKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0Jik7Ci0gICAgfkxpbmUo
KTsKLQotICAgIHZvaWQgaW5pdGlhbGl6ZSgpOwotCi0gICAgdm9pZCBhcHBlbmQoY29uc3QgSW5s
aW5lSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKLQotICAgIElubGluZUxh
eW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudExv
Z2ljYWxXaWR0aDsgfQotICAgIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxSaWdodCgp
IGNvbnN0IHsgcmV0dXJuIG1fcnVucy5pc0VtcHR5KCkgPyAwLjBmIDogbV9ydW5zLmxhc3QoKS5s
b2dpY2FsUmlnaHQoKTsgfQotICAgIHNpemVfdCBub25TcGFubmluZ0lubGluZUxldmVsQm94Q291
bnQoKSBjb25zdCB7IHJldHVybiBtX25vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudDsgfQot
Ci0gICAgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVUcmFpbGluZ1dpZHRoKCkgY29uc3QgeyBy
ZXR1cm4gbV90cmltbWFibGVUcmFpbGluZ0NvbnRlbnQud2lkdGgoKTsgfQotICAgIGJvb2wgaXNU
cmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxlKCkgY29uc3QgeyByZXR1cm4gbV90cmltbWFibGVUcmFp
bGluZ0NvbnRlbnQuaXNUcmFpbGluZ1J1bkZ1bGx5VHJpbW1hYmxlKCk7IH0KLQotICAgIE9wdGlv
bmFsPElubGluZUxheW91dFVuaXQ+IHRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCkgY29uc3QgeyBy
ZXR1cm4gbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0aDsgfQotICAgIHZvaWQgYWRkVHJhaWxpbmdI
eXBoZW4oSW5saW5lTGF5b3V0VW5pdCBoeXBoZW5Mb2dpY2FsV2lkdGgpOwotCi0gICAgdm9pZCBy
ZW1vdmVDb2xsYXBzaWJsZUNvbnRlbnQoSW5saW5lTGF5b3V0VW5pdCBleHRyYUhvcml6b250YWxT
cGFjZSk7Ci0gICAgdm9pZCBhcHBseVJ1bkV4cGFuc2lvbihJbmxpbmVMYXlvdXRVbml0IGV4dHJh
SG9yaXpvbnRhbFNwYWNlKTsKLQotICAgIHN0cnVjdCBSdW4gewotICAgICAgICBib29sIGlzVGV4
dCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpUeXBlOjpUZXh0OyB9Ci0g
ICAgICAgIGJvb2wgaXNCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6
VHlwZTo6Qm94OyB9Ci0gICAgICAgIGJvb2wgaXNMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiBp
c0hhcmRMaW5lQnJlYWsoKSB8fCBpc1NvZnRMaW5lQnJlYWsoKTsgfQotICAgICAgICBib29sIGlz
U29mdExpbmVCcmVhaygpIGNvbnN0ICB7IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRlbTo6VHlw
ZTo6U29mdExpbmVCcmVhazsgfQotICAgICAgICBib29sIGlzSGFyZExpbmVCcmVhaygpIGNvbnN0
IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpUeXBlOjpIYXJkTGluZUJyZWFrOyB9Ci0g
ICAgICAgIGJvb2wgaXNXb3JkQnJlYWtPcHBvcnR1bml0eSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlw
ZSA9PSBJbmxpbmVJdGVtOjpUeXBlOjpXb3JkQnJlYWtPcHBvcnR1bml0eTsgfQotICAgICAgICBi
b29sIGlzSW5saW5lQm94U3RhcnQoKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gSW5saW5lSXRl
bTo6VHlwZTo6SW5saW5lQm94U3RhcnQ7IH0KLSAgICAgICAgYm9vbCBpc0lubGluZUJveEVuZCgp
IGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBJbmxpbmVJdGVtOjpUeXBlOjpJbmxpbmVCb3hFbmQ7
IH0KLQotICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xh
eW91dEJveDsgfQotICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUoKSBjb25zdCB7IHJl
dHVybiBtX2xheW91dEJveC0+c3R5bGUoKTsgfQotICAgICAgICBjb25zdCBPcHRpb25hbDxMaW5l
UnVuOjpUZXh0PiYgdGV4dENvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX3RleHRDb250ZW50OyB9
Ci0KLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVy
biBtX2xvZ2ljYWxXaWR0aDsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0
KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsTGVmdDsgfQotICAgICAgICBJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxMZWZ0KCkgKyBsb2dpY2Fs
V2lkdGgoKTsgfQotCi0gICAgICAgIGNvbnN0IExpbmVSdW46OkV4cGFuc2lvbiYgZXhwYW5zaW9u
KCkgY29uc3QgeyByZXR1cm4gbV9leHBhbnNpb247IH0KLSAgICAgICAgYm9vbCBoYXNFeHBhbnNp
b25PcHBvcnR1bml0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwYW5zaW9uT3Bwb3J0dW5pdHlDb3Vu
dDsgfQotICAgICAgICBFeHBhbnNpb25CZWhhdmlvciBleHBhbnNpb25CZWhhdmlvcigpIGNvbnN0
OwotICAgICAgICB1bnNpZ25lZCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KCkgY29uc3QgeyBy
ZXR1cm4gbV9leHBhbnNpb25PcHBvcnR1bml0eUNvdW50OyB9Ci0KLSAgICAgICAgYm9vbCBoYXNU
cmFpbGluZ1doaXRlc3BhY2UoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nV2hpdGVzcGFjZVR5
cGUgIT0gVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25lOyB9Ci0gICAgICAgIElubGluZUxheW91dFVu
aXQgdHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nV2hp
dGVzcGFjZVdpZHRoOyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgTGlu
ZTsKLQotICAgICAgICBSdW4oY29uc3QgSW5saW5lVGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0
IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgICAgIFJ1
bihjb25zdCBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNh
bExlZnQpOwotICAgICAgICBSdW4oY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91dFVuaXQg
bG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKLQotICAgICAgICB2
b2lkIGV4cGFuZChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNh
bFdpZHRoKTsKLSAgICAgICAgdm9pZCBtb3ZlSG9yaXpvbnRhbGx5KElubGluZUxheW91dFVuaXQg
b2Zmc2V0KSB7IG1fbG9naWNhbExlZnQgKz0gb2Zmc2V0OyB9Ci0gICAgICAgIHZvaWQgc2hyaW5r
SG9yaXpvbnRhbGx5KElubGluZUxheW91dFVuaXQgd2lkdGgpIHsgbV9sb2dpY2FsV2lkdGggLT0g
d2lkdGg7IH0KLSAgICAgICAgdm9pZCBzZXRFeHBhbnNpb25CZWhhdmlvcihFeHBhbnNpb25CZWhh
dmlvcik7Ci0gICAgICAgIHZvaWQgc2V0SG9yaXpvbnRhbEV4cGFuc2lvbihJbmxpbmVMYXlvdXRV
bml0IGxvZ2ljYWxFeHBhbnNpb24pOwotICAgICAgICB2b2lkIHNldE5lZWRzSHlwaGVuKElubGlu
ZUxheW91dFVuaXQgaHlwaGVuTG9naWNhbFdpZHRoKTsKLQotICAgICAgICBlbnVtIGNsYXNzIFRy
YWlsaW5nV2hpdGVzcGFjZSB7Ci0gICAgICAgICAgICBOb25lLAotICAgICAgICAgICAgTm90Q29s
bGFwc2libGUsCi0gICAgICAgICAgICBDb2xsYXBzaWJsZSwKLSAgICAgICAgICAgIENvbGxhcHNl
ZAotICAgICAgICB9OwotICAgICAgICBib29sIGhhc0NvbGxhcHNpYmxlVHJhaWxpbmdXaGl0ZXNw
YWNlKCkgY29uc3QgeyByZXR1cm4gbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlID09IFRyYWlsaW5n
V2hpdGVzcGFjZTo6Q29sbGFwc2libGUgfHwgaGFzQ29sbGFwc2VkVHJhaWxpbmdXaGl0ZXNwYWNl
KCk7IH0KLSAgICAgICAgYm9vbCBoYXNDb2xsYXBzZWRUcmFpbGluZ1doaXRlc3BhY2UoKSBjb25z
dCB7IHJldHVybiBtX3RyYWlsaW5nV2hpdGVzcGFjZVR5cGUgPT0gVHJhaWxpbmdXaGl0ZXNwYWNl
OjpDb2xsYXBzZWQ7IH0KLSAgICAgICAgVHJhaWxpbmdXaGl0ZXNwYWNlIHRyYWlsaW5nV2hpdGVz
cGFjZVR5cGUoY29uc3QgSW5saW5lVGV4dEl0ZW0mKSBjb25zdDsKLSAgICAgICAgdm9pZCByZW1v
dmVUcmFpbGluZ1doaXRlc3BhY2UoKTsKLSAgICAgICAgdm9pZCB2aXN1YWxseUNvbGxhcHNlVHJh
aWxpbmdXaGl0ZXNwYWNlKCk7Ci0KLSAgICAgICAgYm9vbCBoYXNUcmFpbGluZ0xldHRlclNwYWNp
bmcoKSBjb25zdDsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCB0cmFpbGluZ0xldHRlclNwYWNp
bmcoKSBjb25zdDsKLSAgICAgICAgdm9pZCByZW1vdmVUcmFpbGluZ0xldHRlclNwYWNpbmcoKTsK
LQotICAgICAgICBJbmxpbmVJdGVtOjpUeXBlIG1fdHlwZSB7IElubGluZUl0ZW06OlR5cGU6OlRl
eHQgfTsKLSAgICAgICAgY29uc3QgQm94KiBtX2xheW91dEJveCB7IG51bGxwdHIgfTsKLSAgICAg
ICAgSW5saW5lTGF5b3V0VW5pdCBtX2xvZ2ljYWxMZWZ0IHsgMCB9OwotICAgICAgICBJbmxpbmVM
YXlvdXRVbml0IG1fbG9naWNhbFdpZHRoIHsgMCB9OwotICAgICAgICBib29sIG1fd2hpdGVzcGFj
ZUlzRXhwYW5zaW9uT3Bwb3J0dW5pdHkgeyBmYWxzZSB9OwotICAgICAgICBUcmFpbGluZ1doaXRl
c3BhY2UgbV90cmFpbGluZ1doaXRlc3BhY2VUeXBlIHsgVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25l
IH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbV90cmFpbGluZ1doaXRlc3BhY2VXaWR0aCB7
IDAgfTsKLSAgICAgICAgT3B0aW9uYWw8TGluZVJ1bjo6VGV4dD4gbV90ZXh0Q29udGVudDsKLSAg
ICAgICAgTGluZVJ1bjo6RXhwYW5zaW9uIG1fZXhwYW5zaW9uOwotICAgICAgICB1bnNpZ25lZCBt
X2V4cGFuc2lvbk9wcG9ydHVuaXR5Q291bnQgeyAwIH07Ci0gICAgfTsKLSAgICB1c2luZyBSdW5M
aXN0ID0gVmVjdG9yPFJ1biwgMTA+OwotICAgIGNvbnN0IFJ1bkxpc3QmIHJ1bnMoKSBjb25zdCB7
IHJldHVybiBtX3J1bnM7IH0KLQotcHJpdmF0ZToKLSAgICB2b2lkIGFwcGVuZE5vbkJyZWFrYWJs
ZVNwYWNlKGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0gICAgdm9pZCBhcHBlbmRUZXh0Q29udGVu
dChjb25zdCBJbmxpbmVUZXh0SXRlbSYsIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsK
LSAgICB2b2lkIGFwcGVuZE5vblJlcGxhY2VkSW5saW5lTGV2ZWxCb3goY29uc3QgSW5saW5lSXRl
bSYsIElubGluZUxheW91dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKTsKLSAgICB2b2lkIGFw
cGVuZFJlcGxhY2VkSW5saW5lTGV2ZWxCb3goY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91
dFVuaXQgbWFyZ2luQm94TG9naWNhbFdpZHRoKTsKLSAgICB2b2lkIGFwcGVuZElubGluZUJveFN0
YXJ0KGNvbnN0IElubGluZUl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCk7Ci0g
ICAgdm9pZCBhcHBlbmRJbmxpbmVCb3hFbmQoY29uc3QgSW5saW5lSXRlbSYsIElubGluZUxheW91
dFVuaXQgbG9naWNhbFdpZHRoKTsKLSAgICB2b2lkIGFwcGVuZExpbmVCcmVhayhjb25zdCBJbmxp
bmVJdGVtJik7Ci0gICAgdm9pZCBhcHBlbmRXb3JkQnJlYWtPcHBvcnR1bml0eShjb25zdCBJbmxp
bmVJdGVtJik7Ci0KLSAgICB2b2lkIHJlbW92ZVRyYWlsaW5nVHJpbW1hYmxlQ29udGVudCgpOwot
ICAgIHZvaWQgdmlzdWFsbHlDb2xsYXBzZVByZVdyYXBPdmVyZmxvd0NvbnRlbnQoSW5saW5lTGF5
b3V0VW5pdCBleHRyYUhvcml6b250YWxTcGFjZSk7Ci0KLSAgICBjb25zdCBJbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdDsKLQotICAgIHN0cnVjdCBUcmlt
bWFibGVUcmFpbGluZ0NvbnRlbnQgewotICAgICAgICBUcmltbWFibGVUcmFpbGluZ0NvbnRlbnQo
UnVuTGlzdCYpOwotCi0gICAgICAgIHZvaWQgYWRkRnVsbHlUcmltbWFibGVDb250ZW50KHNpemVf
dCBydW5JbmRleCwgSW5saW5lTGF5b3V0VW5pdCB0cmltbWFibGVXaWR0aCk7Ci0gICAgICAgIHZv
aWQgYWRkUGFydGlhbGx5VHJpbW1hYmxlQ29udGVudChzaXplX3QgcnVuSW5kZXgsIElubGluZUxh
eW91dFVuaXQgdHJpbW1hYmxlV2lkdGgpOwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHJlbW92
ZSgpOwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHJlbW92ZVBhcnRpYWxseVRyaW1tYWJsZUNv
bnRlbnQoKTsKLQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IHdpZHRoKCkgY29uc3QgeyByZXR1
cm4gbV9mdWxseVRyaW1tYWJsZVdpZHRoICsgbV9wYXJ0aWFsbHlUcmltbWFibGVXaWR0aDsgfQot
ICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhbV9maXJzdFRyaW1tYWJsZVJ1
bkluZGV4Lmhhc1ZhbHVlKCk7IH0KLSAgICAgICAgYm9vbCBpc1RyYWlsaW5nUnVuRnVsbHlUcmlt
bWFibGUoKSBjb25zdCB7IHJldHVybiBtX2hhc0Z1bGx5VHJpbW1hYmxlQ29udGVudDsgfQotICAg
ICAgICBib29sIGlzVHJhaWxpbmdSdW5QYXJ0aWFsbHlUcmltbWFibGUoKSBjb25zdCB7IHJldHVy
biBtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRoOyB9Ci0KLSAgICAgICAgdm9pZCByZXNldCgpOwot
Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgUnVuTGlzdCYgbV9ydW5zOwotICAgICAgICBPcHRpb25h
bDxzaXplX3Q+IG1fZmlyc3RUcmltbWFibGVSdW5JbmRleDsKLSAgICAgICAgYm9vbCBtX2hhc0Z1
bGx5VHJpbW1hYmxlQ29udGVudCB7IGZhbHNlIH07Ci0gICAgICAgIElubGluZUxheW91dFVuaXQg
bV9mdWxseVRyaW1tYWJsZVdpZHRoIHsgMCB9OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IG1f
cGFydGlhbGx5VHJpbW1hYmxlV2lkdGggeyAwIH07Ci0gICAgfTsKLQotICAgIGNvbnN0IElubGlu
ZUZvcm1hdHRpbmdDb250ZXh0JiBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0OwotICAgIFJ1bkxp
c3QgbV9ydW5zOwotICAgIFRyaW1tYWJsZVRyYWlsaW5nQ29udGVudCBtX3RyaW1tYWJsZVRyYWls
aW5nQ29udGVudDsKLSAgICBJbmxpbmVMYXlvdXRVbml0IG1fY29udGVudExvZ2ljYWxXaWR0aCB7
IDAgfTsKLSAgICBzaXplX3QgbV9ub25TcGFubmluZ0lubGluZUxldmVsQm94Q291bnQgeyAwIH07
Ci0gICAgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gbV90cmFpbGluZ1NvZnRIeXBoZW5XaWR0
aCB7IDAgfTsKLX07Ci0KLWlubGluZSB2b2lkIExpbmU6OlRyaW1tYWJsZVRyYWlsaW5nQ29udGVu
dDo6cmVzZXQoKQotewotICAgIG1faGFzRnVsbHlUcmltbWFibGVDb250ZW50ID0gZmFsc2U7Ci0g
ICAgbV9maXJzdFRyaW1tYWJsZVJ1bkluZGV4ID0geyB9OwotICAgIG1fZnVsbHlUcmltbWFibGVX
aWR0aCA9IHsgfTsKLSAgICBtX3BhcnRpYWxseVRyaW1tYWJsZVdpZHRoID0geyB9OwotfQotCi1p
bmxpbmUgTGluZTo6UnVuOjpUcmFpbGluZ1doaXRlc3BhY2UgTGluZTo6UnVuOjp0cmFpbGluZ1do
aXRlc3BhY2VUeXBlKGNvbnN0IElubGluZVRleHRJdGVtJiBpbmxpbmVUZXh0SXRlbSkgY29uc3QK
LXsKLSAgICBpZiAoIWlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpKQotICAgICAgICByZXR1
cm4gVHJhaWxpbmdXaGl0ZXNwYWNlOjpOb25lOwotICAgIGlmIChJbmxpbmVUZXh0SXRlbTo6c2hv
dWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlubGluZVRleHRJdGVtKSkKLSAgICAgICAgcmV0dXJu
IFRyYWlsaW5nV2hpdGVzcGFjZTo6Tm90Q29sbGFwc2libGU7Ci0gICAgaWYgKGlubGluZVRleHRJ
dGVtLmxlbmd0aCgpID09IDEpCi0gICAgICAgIHJldHVybiBUcmFpbGluZ1doaXRlc3BhY2U6OkNv
bGxhcHNpYmxlOwotICAgIHJldHVybiBUcmFpbGluZ1doaXRlc3BhY2U6OkNvbGxhcHNlZDsKLX0K
LQotaW5saW5lIHZvaWQgTGluZTo6UnVuOjpzZXROZWVkc0h5cGhlbihJbmxpbmVMYXlvdXRVbml0
IGh5cGhlbkxvZ2ljYWxXaWR0aCkKLXsKLSAgICBBU1NFUlQobV90ZXh0Q29udGVudCk7Ci0gICAg
bV90ZXh0Q29udGVudC0+c2V0TmVlZHNIeXBoZW4oKTsKLSAgICBtX2xvZ2ljYWxXaWR0aCArPSBo
eXBoZW5Mb2dpY2FsV2lkdGg7Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZUxpbmVCb3guY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9p
bmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCb3guY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCBlZDIxM2FlMDFjYWEzOTVhNzk4NDIxMThiOTk5NzIzMWU4ZDIwZTI5Li4wMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xh
eW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94LmNw
cAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAy
MDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUg
ImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGluZUxpbmVCb3guaCIKLQotI2lmIEVOQUJMRShMQVlP
VVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2VvbWV0cnkuaCIK
LSNpbmNsdWRlICJMYXlvdXRDb250YWluZXJCb3guaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewot
bmFtZXNwYWNlIExheW91dCB7Ci0KLUxpbmVCb3g6OklubGluZUxldmVsQm94OjpJbmxpbmVMZXZl
bEJveChjb25zdCBCb3gmIGxheW91dEJveCwgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsTGVmdCwg
SW5saW5lTGF5b3V0U2l6ZSBsb2dpY2FsU2l6ZSwgVHlwZSB0eXBlKQotICAgIDogbV9sYXlvdXRC
b3gobWFrZVdlYWtQdHIobGF5b3V0Qm94KSkKLSAgICAsIG1fbG9naWNhbFJlY3QoeyB9LCBsb2dp
Y2FsTGVmdCwgbG9naWNhbFNpemUud2lkdGgoKSwgbG9naWNhbFNpemUuaGVpZ2h0KCkpCi0gICAg
LCBtX3R5cGUodHlwZSkKLXsKLX0KLQotdm9pZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0
QmFzZWxpbmUoSW5saW5lTGF5b3V0VW5pdCBiYXNlbGluZSkKLXsKLSAgICAvLyBGSVhNRTogUmVt
b3ZlIGxlZ2FjeSByb3VuZGluZy4KLSAgICBtX2Jhc2VsaW5lID0gcm91bmRUb0ludChiYXNlbGlu
ZSk7Ci19Ci0KLXZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldERlc2NlbnQoSW5saW5l
TGF5b3V0VW5pdCBkZXNjZW50KQotewotICAgIC8vIEZJWE1FOiBSZW1vdmUgbGVnYWN5IHJvdW5k
aW5nLgotICAgIG1fZGVzY2VudCA9IHJvdW5kVG9JbnQoZGVzY2VudCk7Ci19Ci0KLXZvaWQgTGlu
ZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldExheW91dEJvdW5kcyhjb25zdCBMYXlvdXRCb3VuZHMm
IGxheW91dEJvdW5kcykKLXsKLSAgICAvLyBGSVhNRTogUmVtb3ZlIGxlZ2FjeSByb3VuZGluZy4K
LSAgICBtX2xheW91dEJvdW5kcyA9IHsgSW5saW5lTGF5b3V0VW5pdChyb3VuZFRvSW50KGxheW91
dEJvdW5kcy5hc2NlbnQpKSwgSW5saW5lTGF5b3V0VW5pdChyb3VuZFRvSW50KGxheW91dEJvdW5k
cy5kZXNjZW50KSkgfTsKLX0KLQotdm9pZCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6c2V0TG9n
aWNhbFRvcChJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxUb3ApCi17Ci0gICAgLy8gRklYTUU6IFJl
bW92ZSBsZWdhY3kgcm91bmRpbmcuCi0gICAgbV9sb2dpY2FsUmVjdC5zZXRUb3Aocm91bmRUb0lu
dChsb2dpY2FsVG9wKSk7Ci19Ci0KLXZvaWQgTGluZUJveDo6SW5saW5lTGV2ZWxCb3g6OnNldExv
Z2ljYWxIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KQotewotICAgIC8vIEZJ
WE1FOiBSZW1vdmUgbGVnYWN5IHJvdW5kaW5nLgotICAgIG1fbG9naWNhbFJlY3Quc2V0SGVpZ2h0
KHJvdW5kVG9JbnQobG9naWNhbEhlaWdodCkpOwotfQotCi12b2lkIExpbmVCb3g6OklubGluZUxl
dmVsQm94OjpzZXRIYXNDb250ZW50KCkKLXsKLSAgICBBU1NFUlQoaXNJbmxpbmVCb3goKSk7Ci0g
ICAgbV9oYXNDb250ZW50ID0gdHJ1ZTsKLX0KLQotYm9vbCBMaW5lQm94OjpJbmxpbmVMZXZlbEJv
eDo6aGFzTGluZUJveFJlbGF0aXZlQWxpZ25tZW50KCkgY29uc3QKLXsKLSAgICBhdXRvIHZlcnRp
Y2FsQWxpZ25tZW50ID0gbGF5b3V0Qm94KCkuc3R5bGUoKS52ZXJ0aWNhbEFsaWduKCk7Ci0gICAg
cmV0dXJuIHZlcnRpY2FsQWxpZ25tZW50ID09IFZlcnRpY2FsQWxpZ246OlRvcCB8fCB2ZXJ0aWNh
bEFsaWdubWVudCA9PSBWZXJ0aWNhbEFsaWduOjpCb3R0b207Ci19Ci0KLUxpbmVCb3g6OkxpbmVC
b3goY29uc3QgQm94JiByb290TGF5b3V0Qm94LCBjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgbG9n
aWNhbFRvcGxlZnQsIElubGluZUxheW91dFVuaXQgbGluZUxvZ2ljYWxXaWR0aCwgSW5saW5lTGF5
b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2lj
YWxXaWR0aCwgc2l6ZV90IG5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCkKLSAgICA6IG1f
bG9naWNhbFJlY3QobG9naWNhbFRvcGxlZnQsIElubGluZUxheW91dFNpemUgeyBsaW5lTG9naWNh
bFdpZHRoLCB7IH0gfSkKLSAgICAsIG1fY29udGVudExvZ2ljYWxXaWR0aChjb250ZW50TG9naWNh
bFdpZHRoKQotICAgICwgbV9yb290SW5saW5lQm94KHJvb3RMYXlvdXRCb3gsIGNvbnRlbnRMb2dp
Y2FsTGVmdCwgSW5saW5lTGF5b3V0U2l6ZSB7IGNvbnRlbnRMb2dpY2FsV2lkdGgsIHsgfSB9LCBJ
bmxpbmVMZXZlbEJveDo6VHlwZTo6Um9vdElubGluZUJveCkKLXsKLSAgICBtX25vblJvb3RJbmxp
bmVMZXZlbEJveExpc3QucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShub25TcGFubmluZ0lubGluZUxl
dmVsQm94Q291bnQpOwotICAgIG1fbm9uUm9vdElubGluZUxldmVsQm94TWFwLnJlc2VydmVJbml0
aWFsQ2FwYWNpdHkobm9uU3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50KTsKLX0KLQotdm9pZCBM
aW5lQm94OjphZGRJbmxpbmVMZXZlbEJveChJbmxpbmVMZXZlbEJveCYmIGlubGluZUxldmVsQm94
KQotewotICAgIG1fYm94VHlwZXMuYWRkKGlubGluZUxldmVsQm94LnR5cGUoKSk7Ci0gICAgbV9u
b25Sb290SW5saW5lTGV2ZWxCb3hNYXAuc2V0KCZpbmxpbmVMZXZlbEJveC5sYXlvdXRCb3goKSwg
bV9ub25Sb290SW5saW5lTGV2ZWxCb3hMaXN0LnNpemUoKSk7Ci0gICAgbV9ub25Sb290SW5saW5l
TGV2ZWxCb3hMaXN0LmFwcGVuZChXVEZNb3ZlKGlubGluZUxldmVsQm94KSk7Ci19Ci0KLUlubGlu
ZVJlY3QgTGluZUJveDo6bG9naWNhbFJlY3RGb3JUZXh0UnVuKGNvbnN0IExpbmU6OlJ1biYgcnVu
KSBjb25zdAotewotICAgIEFTU0VSVChydW4uaXNUZXh0KCkgfHwgcnVuLmlzU29mdExpbmVCcmVh
aygpKTsKLSAgICBhdXRvKiBwYXJlbnRJbmxpbmVCb3ggPSAmaW5saW5lTGV2ZWxCb3hGb3JMYXlv
dXRCb3gocnVuLmxheW91dEJveCgpLnBhcmVudCgpKTsKLSAgICBBU1NFUlQocGFyZW50SW5saW5l
Qm94LT5pc0lubGluZUJveCgpKTsKLSAgICBhdXRvJiBmb250TWV0cmljcyA9IHBhcmVudElubGlu
ZUJveC0+c3R5bGUoKS5mb250TWV0cmljcygpOwotICAgIGF1dG8gcnVubG9naWNhbFRvcCA9IHBh
cmVudElubGluZUJveC0+bG9naWNhbFRvcCgpICsgcGFyZW50SW5saW5lQm94LT5iYXNlbGluZSgp
IC0gZm9udE1ldHJpY3MuYXNjZW50KCk7Ci0KLSAgICB3aGlsZSAocGFyZW50SW5saW5lQm94ICE9
ICZtX3Jvb3RJbmxpbmVCb3ggJiYgIXBhcmVudElubGluZUJveC0+aGFzTGluZUJveFJlbGF0aXZl
QWxpZ25tZW50KCkpIHsKLSAgICAgICAgcGFyZW50SW5saW5lQm94ID0gJmlubGluZUxldmVsQm94
Rm9yTGF5b3V0Qm94KHBhcmVudElubGluZUJveC0+bGF5b3V0Qm94KCkucGFyZW50KCkpOwotICAg
ICAgICBBU1NFUlQocGFyZW50SW5saW5lQm94LT5pc0lubGluZUJveCgpKTsKLSAgICAgICAgcnVu
bG9naWNhbFRvcCArPSBwYXJlbnRJbmxpbmVCb3gtPmxvZ2ljYWxUb3AoKTsKLSAgICB9Ci0gICAg
SW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0ID0gZm9udE1ldHJpY3MuaGVpZ2h0KCk7Ci0g
ICAgcmV0dXJuIHsgcnVubG9naWNhbFRvcCwgbV9yb290SW5saW5lQm94LmxvZ2ljYWxMZWZ0KCkg
KyBydW4ubG9naWNhbExlZnQoKSwgcnVuLmxvZ2ljYWxXaWR0aCgpLCBsb2dpY2FsSGVpZ2h0IH07
Ci19Ci0KLUlubGluZVJlY3QgTGluZUJveDo6bG9naWNhbFJlY3RGb3JMaW5lQnJlYWtCb3goY29u
c3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0xpbmVC
cmVha0JveCgpKTsKLSAgICByZXR1cm4gbG9naWNhbFJlY3RGb3JJbmxpbmVMZXZlbEJveChsYXlv
dXRCb3gpOwotfQotCi1JbmxpbmVSZWN0IExpbmVCb3g6OmxvZ2ljYWxSZWN0Rm9ySW5saW5lTGV2
ZWxCb3goY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJv
eC5pc0lubGluZUxldmVsQm94KCkgfHwgbGF5b3V0Qm94LmlzTGluZUJyZWFrQm94KCkpOwotICAg
IC8vIElubGluZSBsZXZlbCBib3hlcyBhcmUgcmVsYXRpdmUgdG8gdGhlaXIgcGFyZW50IHVubGVz
cyB0aGUgdmVydGljYWwgYWxpZ25tZW50IG1ha2VzIHRoZW0gcmVsYXRpdmUgdG8gdGhlIGxpbmUg
Ym94IChlLmcuIHRvcCwgYm90dG9tKS4KLSAgICBhdXRvKiBpbmxpbmVCb3ggPSAmaW5saW5lTGV2
ZWxCb3hGb3JMYXlvdXRCb3gobGF5b3V0Qm94KTsKLSAgICBhdXRvIGlubGluZUJveExvZ2ljYWxS
ZWN0ID0gaW5saW5lQm94LT5sb2dpY2FsUmVjdCgpOwotICAgIGlmIChpbmxpbmVCb3gtPmhhc0xp
bmVCb3hSZWxhdGl2ZUFsaWdubWVudCgpKQotICAgICAgICByZXR1cm4gaW5saW5lQm94TG9naWNh
bFJlY3Q7Ci0KLSAgICAvLyBGYXN0IHBhdGggZm9yIGlubGluZSBsZXZlbCBib3hlcyBvbiB0aGUg
cm9vdCBpbmxpbmUgYm94IChlLmcgPGRpdj48aW1nPjwvZGl2PikuCi0gICAgaWYgKCZsYXlvdXRC
b3gucGFyZW50KCkgPT0gJm1fcm9vdElubGluZUJveC5sYXlvdXRCb3goKSkgewotICAgICAgICBp
bmxpbmVCb3hMb2dpY2FsUmVjdC5tb3ZlVmVydGljYWxseShtX3Jvb3RJbmxpbmVCb3gubG9naWNh
bFRvcCgpKTsKLSAgICAgICAgcmV0dXJuIGlubGluZUJveExvZ2ljYWxSZWN0OwotICAgIH0KLQot
ICAgIC8vIGUuZyA8ZGl2PjxzcGFuPjxpbWc+PC9zcGFuPjwvZGl2PgotICAgIGF1dG8gaW5saW5l
Qm94QWJzb2x1dGVsb2dpY2FsVG9wID0gaW5saW5lQm94TG9naWNhbFJlY3QudG9wKCk7Ci0gICAg
d2hpbGUgKGlubGluZUJveCAhPSAmbV9yb290SW5saW5lQm94ICYmICFpbmxpbmVCb3gtPmhhc0xp
bmVCb3hSZWxhdGl2ZUFsaWdubWVudCgpKSB7Ci0gICAgICAgIGlubGluZUJveCA9ICZpbmxpbmVM
ZXZlbEJveEZvckxheW91dEJveChpbmxpbmVCb3gtPmxheW91dEJveCgpLnBhcmVudCgpKTsKLSAg
ICAgICAgQVNTRVJUKGlubGluZUJveC0+aXNJbmxpbmVCb3goKSk7Ci0gICAgICAgIGlubGluZUJv
eEFic29sdXRlbG9naWNhbFRvcCArPSBpbmxpbmVCb3gtPmxvZ2ljYWxUb3AoKTsKLSAgICB9Ci0g
ICAgcmV0dXJuIElubGluZVJlY3QgeyBpbmxpbmVCb3hBYnNvbHV0ZWxvZ2ljYWxUb3AsIGlubGlu
ZUJveExvZ2ljYWxSZWN0LmxlZnQoKSwgaW5saW5lQm94TG9naWNhbFJlY3Qud2lkdGgoKSwgaW5s
aW5lQm94TG9naWNhbFJlY3QuaGVpZ2h0KCkgfTsKLX0KLQotSW5saW5lUmVjdCBMaW5lQm94Ojps
b2dpY2FsQm9yZGVyQm94Rm9yQXRvbWljSW5saW5lTGV2ZWxCb3goY29uc3QgQm94JiBsYXlvdXRC
b3gsIGNvbnN0IEJveEdlb21ldHJ5JiBib3hHZW9tZXRyeSkgY29uc3QKLXsKLSAgICBBU1NFUlQo
bGF5b3V0Qm94LmlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSk7Ci0gICAgYXV0byBsb2dpY2FsUmVj
dCA9IGxvZ2ljYWxSZWN0Rm9ySW5saW5lTGV2ZWxCb3gobGF5b3V0Qm94KTsKLSAgICAvLyBJbmxp
bmUgbGV2ZWwgYm94ZXMgdXNlIHRoZWlyIG1hcmdpbiBib3ggZm9yIHZlcnRpY2FsIGFsaWdubWVu
dC4gTGV0J3MgY292ZXJ0IHRoZW0gdG8gYm9yZGVyIGJveGVzLgotICAgIGxvZ2ljYWxSZWN0Lm1v
dmVWZXJ0aWNhbGx5KGJveEdlb21ldHJ5Lm1hcmdpbkJlZm9yZSgpKTsKLSAgICBhdXRvIHZlcnRp
Y2FsTWFyZ2luID0gYm94R2VvbWV0cnkubWFyZ2luQmVmb3JlKCkgKyBib3hHZW9tZXRyeS5tYXJn
aW5BZnRlcigpOwotICAgIGxvZ2ljYWxSZWN0LmV4cGFuZFZlcnRpY2FsbHkoLXZlcnRpY2FsTWFy
Z2luKTsKLSAgICByZXR1cm4gbG9naWNhbFJlY3Q7Ci19Ci0KLUlubGluZVJlY3QgTGluZUJveDo6
bG9naWNhbEJvcmRlckJveEZvcklubGluZUJveChjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3Qg
Qm94R2VvbWV0cnkmIGJveEdlb21ldHJ5KSBjb25zdAotewotICAgIGF1dG8gbG9naWNhbFJlY3Qg
PSBsb2dpY2FsUmVjdEZvcklubGluZUxldmVsQm94KGxheW91dEJveCk7Ci0gICAgLy8gVGhpcyBs
b2dpY2FsIHJlY3QgaXMgYXMgdGFsbCBhcyB0aGUgInRleHQiIGNvbnRlbnQgaXMuIExldCdzIGFk
anVzdCB3aXRoIHZlcnRpY2FsIGJvcmRlciBhbmQgcGFkZGluZy4KLSAgICBhdXRvIHZlcnRpY2Fs
Qm9yZGVyQW5kUGFkZGluZyA9IGJveEdlb21ldHJ5LnZlcnRpY2FsQm9yZGVyKCkgKyBib3hHZW9t
ZXRyeS52ZXJ0aWNhbFBhZGRpbmcoKS52YWx1ZU9yKDBfbHUpOwotICAgIGxvZ2ljYWxSZWN0LmV4
cGFuZFZlcnRpY2FsbHkodmVydGljYWxCb3JkZXJBbmRQYWRkaW5nKTsKLSAgICBsb2dpY2FsUmVj
dC5tb3ZlVmVydGljYWxseSgtKGJveEdlb21ldHJ5LmJvcmRlclRvcCgpICsgYm94R2VvbWV0cnku
cGFkZGluZ1RvcCgpLnZhbHVlT3IoMF9sdSkpKTsKLSAgICByZXR1cm4gbG9naWNhbFJlY3Q7Ci19
Ci0KLX0gLy8gbmFtZXNwYWNlIExheW91dAotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQotCi0jZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQm94LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lTGluZUJveC5oCmRlbGV0
ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTJlOTY2MzgzOGVkMzJhOGRkYjE5YjVmZWFkMjQ2
OTc5OWYxYzEwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVMaW5lQm94LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAq
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
WFQpCi0KLSNpbmNsdWRlICJJbmxpbmVMaW5lLmgiCi0jaW5jbHVkZSAiSW5saW5lUmVjdC5oIgot
I2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0jaW5jbHVkZSA8d3RmL1VuaXF1ZVJl
Zi5oPgotI2luY2x1ZGUgPHd0Zi9XZWFrUHRyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5h
bWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBCb3hHZW9tZXRyeTsKLWNsYXNzIElubGluZUZvcm1h
dHRpbmdDb250ZXh0OwotY2xhc3MgTGluZUJveEJ1aWxkZXI7Ci1zdHJ1Y3QgU2ltcGxpZmllZFZl
cnRpY2FsQWxpZ25tZW50OwotCi0vLyAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fXyBMaW5lIEJveAotLy8gfCAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB8ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8Ci0vLyB8IC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0t
LS0tLS0tLSBSb290IElubGluZSBCb3gKLS8vIHx8ICAgX19fX18gICAgX19fICAgICAgX19fICAg
ICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKLS8vIHx8ICB8ICAgICAgICAvICAgXCAgICAv
ICAgXCAgICAgICAgIHwgIElubGluZSBMZXZlbCBCb3ggIHwKLS8vIHx8ICB8X19fX18gIHwgICAg
IHwgIHwgICAgIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgYXNjZW50Ci0vLyB8
fCAgfCAgICAgICB8ICAgICB8ICB8ICAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8
Ci0vLyB8fF9ffF9fX19fX19fXF9fXy9fX19fXF9fXy9fX19fX19fX198X19fX19fX19fX19fX19f
X19fX198X19fX19fXyBhbGlnbm1lbnRfYmFzZWxpbmUKLS8vIHx8Ci0vLyB8fCAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbnQKLS8vIHx8
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fCi0vLyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fXwotLy8gVGhlIHJlc3VsdGluZyByZWN0YW5ndWxhciBhcmVhIHRo
YXQgY29udGFpbnMgdGhlIGJveGVzIHRoYXQgZm9ybSBhIHNpbmdsZSBsaW5lIG9mIGlubGluZS1s
ZXZlbCBjb250ZW50IGlzIGNhbGxlZCBhIGxpbmUgYm94LgotLy8gaHR0cHM6Ly93d3cudzMub3Jn
L1RSL2Nzcy1pbmxpbmUtMy8jbW9kZWwKLWNsYXNzIExpbmVCb3ggewotICAgIFdURl9NQUtFX0ZB
U1RfQUxMT0NBVEVEOwotcHVibGljOgotICAgIHN0cnVjdCBJbmxpbmVMZXZlbEJveCB7Ci0gICAg
cHVibGljOgotICAgICAgICBzdGF0aWMgTGluZUJveDo6SW5saW5lTGV2ZWxCb3ggY3JlYXRlSW5s
aW5lQm94KGNvbnN0IEJveCYsIElubGluZUxheW91dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxh
eW91dFVuaXQgbG9naWNhbFdpZHRoKTsKLSAgICAgICAgc3RhdGljIExpbmVCb3g6OklubGluZUxl
dmVsQm94IGNyZWF0ZUF0b21pY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYsIElubGluZUxheW91
dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFNpemUpOwotICAgICAgICBzdGF0aWMgTGlu
ZUJveDo6SW5saW5lTGV2ZWxCb3ggY3JlYXRlTGluZUJyZWFrQm94KGNvbnN0IEJveCYsIElubGlu
ZUxheW91dFVuaXQgbG9naWNhbExlZnQpOwotICAgICAgICBzdGF0aWMgTGluZUJveDo6SW5saW5l
TGV2ZWxCb3ggY3JlYXRlR2VuZXJpY0lubGluZUxldmVsQm94KGNvbnN0IEJveCYsIElubGluZUxh
eW91dFVuaXQgbG9naWNhbExlZnQpOwotCi0gICAgICAgIElubGluZUxheW91dFVuaXQgYmFzZWxp
bmUoKSBjb25zdCB7IHJldHVybiBtX2Jhc2VsaW5lOyB9Ci0gICAgICAgIE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+IGRlc2NlbnQoKSBjb25zdCB7IHJldHVybiBtX2Rlc2NlbnQ7IH0KLSAgICAg
ICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtaW5saW5lLTMvI2xheW91dC1ib3Vu
ZHMKLSAgICAgICAgc3RydWN0IExheW91dEJvdW5kcyB7Ci0gICAgICAgICAgICBJbmxpbmVMYXlv
dXRVbml0IGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIGFzY2VudCArIGRlc2NlbnQ7IH0KLSAgICAg
ICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMYXlvdXRCb3VuZHMmIG90aGVyKSBjb25zdCB7
IHJldHVybiBhc2NlbnQgPT0gb3RoZXIuYXNjZW50ICYmIGRlc2NlbnQgPT0gb3RoZXIuZGVzY2Vu
dDsgfQotCi0gICAgICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGFzY2VudCB7IDAgfTsKLSAgICAg
ICAgICAgIElubGluZUxheW91dFVuaXQgZGVzY2VudCB7IDAgfTsKLSAgICAgICAgfTsKLSAgICAg
ICAgTGF5b3V0Qm91bmRzIGxheW91dEJvdW5kcygpIGNvbnN0IHsgcmV0dXJuIG1fbGF5b3V0Qm91
bmRzOyB9Ci0KLSAgICAgICAgYm9vbCBoYXNDb250ZW50KCkgY29uc3QgeyByZXR1cm4gbV9oYXND
b250ZW50OyB9Ci0gICAgICAgIHZvaWQgc2V0SGFzQ29udGVudCgpOwotCi0gICAgICAgIFZlcnRp
Y2FsQWxpZ24gdmVydGljYWxBbGlnbigpIGNvbnN0IHsgcmV0dXJuIGxheW91dEJveCgpLnN0eWxl
KCkudmVydGljYWxBbGlnbigpOyB9Ci0gICAgICAgIGNvbnN0IEJveCYgbGF5b3V0Qm94KCkgY29u
c3QgeyByZXR1cm4gKm1fbGF5b3V0Qm94OyB9Ci0gICAgICAgIGNvbnN0IFJlbmRlclN0eWxlJiBz
dHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fbGF5b3V0Qm94LT5zdHlsZSgpOyB9Ci0KLSAgICAgICAg
Ym9vbCBpc0lubGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBUeXBlOjpJbmxpbmVC
b3ggfHwgbV90eXBlID09IFR5cGU6OlJvb3RJbmxpbmVCb3g7IH0KLSAgICAgICAgYm9vbCBpc1Jv
b3RJbmxpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gVHlwZTo6Um9vdElubGluZUJv
eDsgfQotICAgICAgICBib29sIGlzQXRvbWljSW5saW5lTGV2ZWxCb3goKSBjb25zdCB7IHJldHVy
biBtX3R5cGUgPT0gVHlwZTo6QXRvbWljSW5saW5lTGV2ZWxCb3g7IH0KLSAgICAgICAgYm9vbCBp
c0xpbmVCcmVha0JveCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBUeXBlOjpMaW5lQnJlYWtC
b3g7IH0KLSAgICAgICAgYm9vbCBoYXNMaW5lQm94UmVsYXRpdmVBbGlnbm1lbnQoKSBjb25zdDsK
LQotICAgICAgICBlbnVtIGNsYXNzIFR5cGUgOiB1aW50OF90IHsKLSAgICAgICAgICAgIElubGlu
ZUJveCAgICAgICAgICAgICA9IDEgPDwgMCwKLSAgICAgICAgICAgIFJvb3RJbmxpbmVCb3ggICAg
ICAgICA9IDEgPDwgMSwKLSAgICAgICAgICAgIEF0b21pY0lubGluZUxldmVsQm94ICA9IDEgPDwg
MiwKLSAgICAgICAgICAgIExpbmVCcmVha0JveCAgICAgICAgICA9IDEgPDwgMywKLSAgICAgICAg
ICAgIEdlbmVyaWNJbmxpbmVMZXZlbEJveCA9IDEgPDwgNAotICAgICAgICB9OwotICAgICAgICBU
eXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KLQotICAgICAgICBJbmxpbmVMZXZl
bEJveChjb25zdCBCb3gmLCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlv
dXRTaXplLCBUeXBlKTsKLSAgICAgICAgSW5saW5lTGV2ZWxCb3goKSA9IGRlZmF1bHQ7Ci0KLSAg
ICBwcml2YXRlOgotICAgICAgICBmcmllbmQgc3RydWN0IFNpbXBsaWZpZWRWZXJ0aWNhbEFsaWdu
bWVudDsKLSAgICAgICAgZnJpZW5kIGNsYXNzIExpbmVCb3hCdWlsZGVyOwotICAgICAgICBmcmll
bmQgY2xhc3MgTGluZUJveDsKLQotICAgICAgICBjb25zdCBJbmxpbmVSZWN0JiBsb2dpY2FsUmVj
dCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJlY3Q7IH0KLSAgICAgICAgSW5saW5lTGF5b3V0
VW5pdCBsb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdC50b3AoKTsgfQot
ICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxCb3R0b20oKSBjb25zdCB7IHJldHVybiBt
X2xvZ2ljYWxSZWN0LmJvdHRvbSgpOyB9Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbG9naWNh
bExlZnQoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0LmxlZnQoKTsgfQotICAgICAgICBJ
bmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9naWNhbFJl
Y3Qud2lkdGgoKTsgfQotICAgICAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQoKSBj
b25zdCB7IHJldHVybiBtX2xvZ2ljYWxSZWN0LmhlaWdodCgpOyB9Ci0KLSAgICAgICAgdm9pZCBz
ZXRMb2dpY2FsV2lkdGgoSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgpIHsgbV9sb2dpY2Fs
UmVjdC5zZXRXaWR0aChsb2dpY2FsV2lkdGgpOyB9Ci0gICAgICAgIHZvaWQgc2V0TG9naWNhbEhl
aWdodChJbmxpbmVMYXlvdXRVbml0KTsKLSAgICAgICAgdm9pZCBzZXRMb2dpY2FsVG9wKElubGlu
ZUxheW91dFVuaXQpOwotICAgICAgICB2b2lkIHNldEJhc2VsaW5lKElubGluZUxheW91dFVuaXQp
OwotICAgICAgICB2b2lkIHNldERlc2NlbnQoSW5saW5lTGF5b3V0VW5pdCk7Ci0gICAgICAgIHZv
aWQgc2V0TGF5b3V0Qm91bmRzKGNvbnN0IExheW91dEJvdW5kcyYpOwotCi0gICAgcHJpdmF0ZToK
LSAgICAgICAgV2Vha1B0cjxjb25zdCBCb3g+IG1fbGF5b3V0Qm94OwotICAgICAgICAvLyBUaGlz
IGlzIHRoZSBjb21iaW5hdGlvbiBvZiBtYXJnaW4gYW5kIGJvcmRlciBib3hlcy4gSW5saW5lIGxl
dmVsIGJveGVzIGFyZSB2ZXJ0aWNhbGx5IGFsaWduZWQgdXNpbmcgdGhlaXIgbWFyZ2luIGJveGVz
LgotICAgICAgICBJbmxpbmVSZWN0IG1fbG9naWNhbFJlY3Q7Ci0gICAgICAgIExheW91dEJvdW5k
cyBtX2xheW91dEJvdW5kczsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsg
MCB9OwotICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBtX2Rlc2NlbnQ7Ci0gICAg
ICAgIGJvb2wgbV9oYXNDb250ZW50IHsgZmFsc2UgfTsKLSAgICAgICAgVHlwZSBtX3R5cGUgeyBU
eXBlOjpJbmxpbmVCb3ggfTsKLSAgICB9OwotCi0gICAgTGluZUJveChjb25zdCBCb3gmIHJvb3RM
YXlvdXRCb3gsIGNvbnN0IElubGluZUxheW91dFBvaW50JiBsb2dpY2FsVG9wTGVmdCwgSW5saW5l
TGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQsIElubGluZUxheW91dFVuaXQgbGluZUxvZ2lj
YWxXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoLCBzaXplX3Qgbm9u
U3Bhbm5pbmdJbmxpbmVMZXZlbEJveENvdW50KTsKLQotICAgIGNvbnN0IElubGluZVJlY3QmIGxv
Z2ljYWxSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdDsgfQotICAgIElubGluZUxh
eW91dFVuaXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFNpemUoKS53aWR0
aCgpOyB9Ci0gICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsSGVpZ2h0KCkgY29uc3QgeyByZXR1
cm4gbG9naWNhbFNpemUoKS5oZWlnaHQoKTsgfQotICAgIElubGluZUxheW91dFBvaW50IGxvZ2lj
YWxUb3BMZWZ0KCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS50b3BMZWZ0KCk7IH0KLSAg
ICBJbmxpbmVMYXlvdXRTaXplIGxvZ2ljYWxTaXplKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJl
Y3QoKS5zaXplKCk7IH0KLSAgICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsV2lkdGgo
KSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRMb2dpY2FsV2lkdGg7IH0KLQotICAgIC8vIE5vdGUg
dGhhdCB0aGUgbGluZSBjYW4gaGF2ZSBtYW55IGlubGluZSBib3hlcyBhbmQgYmUgImVtcHR5IiB0
aGUgc2FtZSB0aW1lIGUuZy4gPGRpdj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjwvZGl2Pgot
ICAgIGJvb2wgaGFzQ29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzQ29udGVudDsgfQotICAg
IGJvb2wgaGFzSW5saW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV9ib3hUeXBlcy5jb250YWlucyhJ
bmxpbmVMZXZlbEJveDo6VHlwZTo6SW5saW5lQm94KTsgfQotICAgIGJvb2wgaGFzTm9uSW5saW5l
Qm94KCkgY29uc3QgeyByZXR1cm4gbV9ib3hUeXBlcy5jb250YWluc0FueSh7IElubGluZUxldmVs
Qm94OjpUeXBlOjpBdG9taWNJbmxpbmVMZXZlbEJveCwgSW5saW5lTGV2ZWxCb3g6OlR5cGU6Okxp
bmVCcmVha0JveCwgSW5saW5lTGV2ZWxCb3g6OlR5cGU6OkdlbmVyaWNJbmxpbmVMZXZlbEJveCB9
KTsgfQotICAgIGJvb2wgaGFzQXRvbWljSW5saW5lTGV2ZWxCb3goKSBjb25zdCB7IHJldHVybiBt
X2JveFR5cGVzLmNvbnRhaW5zKElubGluZUxldmVsQm94OjpUeXBlOjpBdG9taWNJbmxpbmVMZXZl
bEJveCk7IH0KLQotICAgIGNvbnN0IElubGluZUxldmVsQm94JiBpbmxpbmVMZXZlbEJveEZvckxh
eW91dEJveChjb25zdCBCb3gmIGxheW91dEJveCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxM
aW5lQm94Jj4oKnRoaXMpLmlubGluZUxldmVsQm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7IH0K
LQotICAgIElubGluZVJlY3QgbG9naWNhbFJlY3RGb3JUZXh0UnVuKGNvbnN0IExpbmU6OlJ1biYp
IGNvbnN0OwotICAgIElubGluZVJlY3QgbG9naWNhbFJlY3RGb3JMaW5lQnJlYWtCb3goY29uc3Qg
Qm94JikgY29uc3Q7Ci0gICAgSW5saW5lUmVjdCBsb2dpY2FsUmVjdEZvclJvb3RJbmxpbmVCb3go
KSBjb25zdCB7IHJldHVybiBtX3Jvb3RJbmxpbmVCb3gubG9naWNhbFJlY3QoKTsgfQotICAgIElu
bGluZVJlY3QgbG9naWNhbEJvcmRlckJveEZvckF0b21pY0lubGluZUxldmVsQm94KGNvbnN0IEJv
eCYsIGNvbnN0IEJveEdlb21ldHJ5JikgY29uc3Q7Ci0gICAgSW5saW5lUmVjdCBsb2dpY2FsQm9y
ZGVyQm94Rm9ySW5saW5lQm94KGNvbnN0IEJveCYsIGNvbnN0IEJveEdlb21ldHJ5JikgY29uc3Q7
Ci0KLSAgICBjb25zdCBJbmxpbmVMZXZlbEJveCYgcm9vdElubGluZUJveCgpIGNvbnN0IHsgcmV0
dXJuIG1fcm9vdElubGluZUJveDsgfQotICAgIHVzaW5nIElubGluZUxldmVsQm94TGlzdCA9IFZl
Y3RvcjxJbmxpbmVMZXZlbEJveD47Ci0gICAgY29uc3QgSW5saW5lTGV2ZWxCb3hMaXN0JiBub25S
b290SW5saW5lTGV2ZWxCb3hlcygpIGNvbnN0IHsgcmV0dXJuIG1fbm9uUm9vdElubGluZUxldmVs
Qm94TGlzdDsgfQotCi0gICAgSW5saW5lTGF5b3V0VW5pdCBhbGlnbm1lbnRCYXNlbGluZSgpIGNv
bnN0IHsgcmV0dXJuIG1fcm9vdElubGluZUJveC5sb2dpY2FsVG9wKCkgKyBtX3Jvb3RJbmxpbmVC
b3guYmFzZWxpbmUoKTsgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBMaW5lQm94QnVp
bGRlcjsKLQotICAgIHZvaWQgc2V0TG9naWNhbEhlaWdodChJbmxpbmVMYXlvdXRVbml0IGxvZ2lj
YWxIZWlnaHQpIHsgbV9sb2dpY2FsUmVjdC5zZXRIZWlnaHQobG9naWNhbEhlaWdodCk7IH0KLQot
ICAgIHZvaWQgYWRkSW5saW5lTGV2ZWxCb3goSW5saW5lTGV2ZWxCb3gmJik7Ci0gICAgSW5saW5l
TGV2ZWxCb3hMaXN0JiBub25Sb290SW5saW5lTGV2ZWxCb3hlcygpIHsgcmV0dXJuIG1fbm9uUm9v
dElubGluZUxldmVsQm94TGlzdDsgfQotCi0gICAgSW5saW5lTGV2ZWxCb3gmIHJvb3RJbmxpbmVC
b3goKSB7IHJldHVybiBtX3Jvb3RJbmxpbmVCb3g7IH0KLQotICAgIElubGluZUxldmVsQm94JiBp
bmxpbmVMZXZlbEJveEZvckxheW91dEJveChjb25zdCBCb3gmIGxheW91dEJveCkgeyByZXR1cm4g
JmxheW91dEJveCA9PSAmbV9yb290SW5saW5lQm94LmxheW91dEJveCgpID8gbV9yb290SW5saW5l
Qm94IDogbV9ub25Sb290SW5saW5lTGV2ZWxCb3hMaXN0W21fbm9uUm9vdElubGluZUxldmVsQm94
TWFwLmdldCgmbGF5b3V0Qm94KV07IH0KLSAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0Rm9ySW5s
aW5lTGV2ZWxCb3goY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRI
YXNDb250ZW50KGJvb2wgaGFzQ29udGVudCkgeyBtX2hhc0NvbnRlbnQgPSBoYXNDb250ZW50OyB9
Ci0KLXByaXZhdGU6Ci0gICAgSW5saW5lUmVjdCBtX2xvZ2ljYWxSZWN0OwotICAgIElubGluZUxh
eW91dFVuaXQgbV9jb250ZW50TG9naWNhbFdpZHRoIHsgMCB9OwotICAgIGJvb2wgbV9oYXNDb250
ZW50IHsgZmFsc2UgfTsKLSAgICBPcHRpb25TZXQ8SW5saW5lTGV2ZWxCb3g6OlR5cGU+IG1fYm94
VHlwZXM7Ci0KLSAgICBJbmxpbmVMZXZlbEJveCBtX3Jvb3RJbmxpbmVCb3g7Ci0gICAgSW5saW5l
TGV2ZWxCb3hMaXN0IG1fbm9uUm9vdElubGluZUxldmVsQm94TGlzdDsKLQotICAgIEhhc2hNYXA8
Y29uc3QgQm94Kiwgc2l6ZV90PiBtX25vblJvb3RJbmxpbmVMZXZlbEJveE1hcDsKLX07Ci0KLWlu
bGluZSBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3Jl
YXRlQXRvbWljSW5saW5lTGV2ZWxCb3goY29uc3QgQm94JiBsYXlvdXRCb3gsIElubGluZUxheW91
dFVuaXQgbG9naWNhbExlZnQsIElubGluZUxheW91dFNpemUgbG9naWNhbFNpemUpCi17Ci0gICAg
cmV0dXJuIExpbmVCb3g6OklubGluZUxldmVsQm94IHsgbGF5b3V0Qm94LCBsb2dpY2FsTGVmdCwg
bG9naWNhbFNpemUsIFR5cGU6OkF0b21pY0lubGluZUxldmVsQm94IH07Ci19Ci0KLWlubGluZSBM
aW5lQm94OjpJbmxpbmVMZXZlbEJveCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlSW5s
aW5lQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0
LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxXaWR0aCkKLXsKLSAgICByZXR1cm4gTGluZUJveDo6
SW5saW5lTGV2ZWxCb3ggeyBsYXlvdXRCb3gsIGxvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRTaXpl
IHsgbG9naWNhbFdpZHRoLCB7IH0gfSwgVHlwZTo6SW5saW5lQm94IH07Ci19Ci0KLWlubGluZSBM
aW5lQm94OjpJbmxpbmVMZXZlbEJveCBMaW5lQm94OjpJbmxpbmVMZXZlbEJveDo6Y3JlYXRlTGlu
ZUJyZWFrQm94KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxM
ZWZ0KQotewotICAgIHJldHVybiBMaW5lQm94OjpJbmxpbmVMZXZlbEJveCB7IGxheW91dEJveCwg
bG9naWNhbExlZnQsIElubGluZUxheW91dFNpemUgeyB9LCBUeXBlOjpMaW5lQnJlYWtCb3ggfTsK
LX0KLQotaW5saW5lIExpbmVCb3g6OklubGluZUxldmVsQm94IExpbmVCb3g6OklubGluZUxldmVs
Qm94OjpjcmVhdGVHZW5lcmljSW5saW5lTGV2ZWxCb3goY29uc3QgQm94JiBsYXlvdXRCb3gsIElu
bGluZUxheW91dFVuaXQgbG9naWNhbExlZnQpCi17Ci0gICAgcmV0dXJuIExpbmVCb3g6OklubGlu
ZUxldmVsQm94IHsgbGF5b3V0Qm94LCBsb2dpY2FsTGVmdCwgSW5saW5lTGF5b3V0U2l6ZSB7IH0s
IFR5cGU6OkdlbmVyaWNJbmxpbmVMZXZlbEJveCB9OwotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVm
b3JtYXR0aW5nL0lubGluZUxpbmVCdWlsZGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lQnVpbGRlci5jcHAK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNjI2ZWEwZWU1YTYzYTRhOTYyYjE1NWNl
NjEwNjUzMGZjZTIyZjIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUxpbmVCdWlsZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg1NyArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGluZUxp
bmVCdWlsZGVyLmgiCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQot
I2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIklubGluZUZvcm1hdHRpbmdD
b250ZXh0LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94R2Vv
bWV0cnkuaCIKLSNpbmNsdWRlICJMYXlvdXRTdGF0ZS5oIgotI2luY2x1ZGUgIlRleHRVdGlsLmgi
Ci0jaW5jbHVkZSA8d3RmL3VuaWNvZGUvQ2hhcmFjdGVyTmFtZXMuaD4KLQotbmFtZXNwYWNlIFdl
YkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBlbmRzV2l0
aFNvZnRXcmFwT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5lVGV4dEl0ZW0mIGN1cnJlbnRUZXh0SXRl
bSwgY29uc3QgSW5saW5lVGV4dEl0ZW0mIG5leHRJbmxpbmVUZXh0SXRlbSkKLXsKLSAgICBBU1NF
UlQoIW5leHRJbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSk7Ci0gICAgLy8gV2UgYXJlIGF0
IHRoZSBwb3NpdGlvbiBhZnRlciBhIHdoaXRlc3BhY2UuCi0gICAgaWYgKGN1cnJlbnRUZXh0SXRl
bS5pc1doaXRlc3BhY2UoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgLy8gV2hlbiBib3Ro
IHRoZXNlIG5vbi13aGl0ZXNwYWNlIHJ1bnMgYmVsb25nIHRvIHRoZSBzYW1lIGxheW91dCBib3gs
IGl0J3MgZ3VhcmFudGVlZCB0aGF0Ci0gICAgLy8gdGhleSBhcmUgc3BsaXQgYXQgYSBzb2Z0IGJy
ZWFraW5nIG9wcG9ydHVuaXR5LiBTZWUgSW5saW5lVGV4dEl0ZW06Om1vdmVUb05leHRCcmVha2Fi
bGVQb3NpdGlvbi4KLSAgICBpZiAoJmN1cnJlbnRUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkgPT0g
Jm5leHRJbmxpbmVUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkpCi0gICAgICAgIHJldHVybiB0cnVl
OwotICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGNvbGxlY3QgYXQgbGVhc3QgMyBhZGphY2VudCBjaGFy
YWN0ZXJzIHRvIGJlIGFibGUgdG8gbWFrZSBhIGRlY2lzaW9uIHdoZXRoZXIgdGhlIHByZXZpb3Vz
IHRleHQgaXRlbSBlbmRzIHdpdGggYnJlYWtpbmcgb3Bwb3J0dW5pdHkuCi0gICAgLy8gW2V4LV1b
YW1wbGVdIDwtIHNlY29uZCB0byBsYXN0W3hdIGxhc3RbLV0gY3VycmVudFthXQotICAgIC8vIFdl
IG5lZWQgYXQgbGVhc3QgMSBjaGFyYWN0ZXIgaW4gdGhlIGN1cnJlbnQgaW5saW5lIHRleHQgaXRl
bSBhbmQgMiBtb3JlIGZyb20gcHJldmlvdXMgaW5saW5lIGl0ZW1zLgotICAgIGF1dG8gcHJldmlv
dXNDb250ZW50ID0gY3VycmVudFRleHRJdGVtLmlubGluZVRleHRCb3goKS5jb250ZW50KCk7Ci0g
ICAgYXV0byBsaW5lQnJlYWtJdGVyYXRvciA9IExhenlMaW5lQnJlYWtJdGVyYXRvciB7IG5leHRJ
bmxpbmVUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCkuY29udGVudCgpIH07Ci0gICAgYXV0byBwcmV2
aW91c0NvbnRlbnRMZW5ndGggPSBwcmV2aW91c0NvbnRlbnQubGVuZ3RoKCk7Ci0gICAgLy8gRklY
TUU6IFdlIHNob3VsZCBsb29rIGludG8gdGhlIGVudGlyZSB1bmNvbW1pdHRlZCBjb250ZW50IGZv
ciBtb3JlIHRleHQgY29udGV4dC4KLSAgICBVQ2hhciBsYXN0Q2hhcmFjdGVyID0gcHJldmlvdXND
b250ZW50TGVuZ3RoID8gcHJldmlvdXNDb250ZW50W3ByZXZpb3VzQ29udGVudExlbmd0aCAtIDFd
IDogMDsKLSAgICBpZiAobGFzdENoYXJhY3RlciA9PSBzb2Z0SHlwaGVuICYmIGN1cnJlbnRUZXh0
SXRlbS5zdHlsZSgpLmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpOb25lKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgVUNoYXIgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gcHJldmlvdXNDb250ZW50
TGVuZ3RoID4gMSA/IHByZXZpb3VzQ29udGVudFtwcmV2aW91c0NvbnRlbnRMZW5ndGggLSAyXSA6
IDA7Ci0gICAgbGluZUJyZWFrSXRlcmF0b3Iuc2V0UHJpb3JDb250ZXh0KGxhc3RDaGFyYWN0ZXIs
IHNlY29uZFRvTGFzdENoYXJhY3Rlcik7Ci0gICAgLy8gTm93IGNoZWNrIGlmIHdlIGNhbiBicmVh
ayByaWdodCBhdCB0aGUgaW5saW5lIGl0ZW0gYm91bmRhcnkuCi0gICAgLy8gV2l0aCB0aGUgW2V4
LWFtcGxlXSwgZmluZE5leHRCcmVha2FibGVQb3NpdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBzdGFy
dFBvc2l0aW9uICgwKS4KLSAgICAvLyBGSVhNRTogQ2hlY2sgaWYgdGhlcmUncyBhIG1vcmUgY29y
cmVjdCB3YXkgb2YgZmluZGluZyBicmVha2luZyBvcHBvcnR1bml0aWVzLgotICAgIHJldHVybiAh
VGV4dFV0aWw6OmZpbmROZXh0QnJlYWthYmxlUG9zaXRpb24obGluZUJyZWFrSXRlcmF0b3IsIDAs
IG5leHRJbmxpbmVUZXh0SXRlbS5zdHlsZSgpKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlz
QXRTb2Z0V3JhcE9wcG9ydHVuaXR5KGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxp
bmVGb3JtYXR0aW5nQ29udGV4dCwgY29uc3QgSW5saW5lSXRlbSYgY3VycmVudCwgY29uc3QgSW5s
aW5lSXRlbSYgbmV4dCkKLXsKLSAgICAvLyAiaXMgYXQiIHNpbXBsZSBtZWFucyB0aGF0IHRoZXJl
J3MgYSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgcmlnaHQgYWZ0ZXIgdGhlIFtjdXJyZW50XS4KLSAg
ICAvLyBbdGV4dF1bIF1bdGV4dF1baW5saW5lIGJveCBzdGFydF0uLi4gKDxkaXY+dGV4dCBjb250
ZW50PHNwYW4+Li48L2Rpdj4pCi0gICAgLy8gc29mdCB3cmFwIGluZGV4ZXM6IDAgYW5kIDEgZGVm
aW5pdGVseSwgMiBkZXBlbmRzIG9uIHRoZSBjb250ZW50IGFmdGVyIHRoZSBbaW5saW5lIGJveCBz
dGFydF0uCi0KLSAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXRleHQtMy8jbGlu
ZS1icmVhay1kZXRhaWxzCi0gICAgLy8gRmlndXJlIG91dCBpZiB0aGUgbmV3IGluY29taW5nIGNv
bnRlbnQgcHV0cyB0aGUgdW5jb21taXR0ZWQgY29udGVudCBvbiBhIHNvZnQgd3JhcCBvcHBvcnR1
bml0eS4KLSAgICAvLyBlLmcuIFtpbmxpbmUgYm94IHN0YXJ0XVtwcmlvcl9jb250aW51b3VzX2Nv
bnRlbnRdW2lubGluZSBib3ggZW5kXSAoPHNwYW4+cHJpb3JfY29udGludW91c19jb250ZW50PC9z
cGFuPikKLSAgICAvLyBBbiBpbmNvbWluZyA8aW1nPiBib3ggd291bGQgZW5hYmxlIHVzIHRvIGNv
bW1pdCB0aGUgIjxzcGFuPnByaW9yX2NvbnRpbnVvdXNfY29udGVudDwvc3Bhbj4iIGNvbnRlbnQK
LSAgICAvLyBidXQgYW4gaW5jb21pbmcgdGV4dCBjb250ZW50IHdvdWxkIG5vdCBuZWNlc3Nhcmls
eS4KLSAgICBBU1NFUlQoY3VycmVudC5pc1RleHQoKSB8fCBjdXJyZW50LmlzQm94KCkgfHwgY3Vy
cmVudC5pc0Zsb2F0KCkpOwotICAgIEFTU0VSVChuZXh0LmlzVGV4dCgpIHx8IG5leHQuaXNCb3go
KSB8fCBuZXh0LmlzRmxvYXQoKSk7Ci0gICAgaWYgKGN1cnJlbnQuaXNUZXh0KCkgJiYgbmV4dC5p
c1RleHQoKSkgewotICAgICAgICBhdXRvJiBjdXJyZW50SW5saW5lVGV4dEl0ZW0gPSBkb3duY2Fz
dDxJbmxpbmVUZXh0SXRlbT4oY3VycmVudCk7Ci0gICAgICAgIGF1dG8mIG5leHRJbmxpbmVUZXh0
SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihuZXh0KTsKLSAgICAgICAgaWYgKGN1cnJl
bnRJbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkgewotICAgICAgICAgICAgLy8gWyBdW3Rl
eHRdIDogYWZ0ZXIgW3doaXRlc3BhY2VdIHBvc2l0aW9uIGlzIGEgc29mdCB3cmFwIG9wcG9ydHVu
aXR5LgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5l
eHRJbmxpbmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSkgewotICAgICAgICAgICAgLy8gW3RleHRd
WyBdICg8c3Bhbj50ZXh0PC9zcGFuPiApCi0gICAgICAgICAgICAvLyB3aGl0ZS1zcGFjZTogYnJl
YWstc3BhY2VzOiBsaW5lIGJyZWFraW5nIG9wcG9ydHVuaXR5IGV4aXN0cyBhZnRlciBldmVyeSBw
cmVzZXJ2ZWQgd2hpdGUgc3BhY2UgY2hhcmFjdGVyLCBidXQgbm90IGJlZm9yZS4KLSAgICAgICAg
ICAgIHJldHVybiBuZXh0SW5saW5lVGV4dEl0ZW0uc3R5bGUoKS53aGl0ZVNwYWNlKCkgIT0gV2hp
dGVTcGFjZTo6QnJlYWtTcGFjZXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnQuc3R5
bGUoKS5saW5lQnJlYWsoKSA9PSBMaW5lQnJlYWs6OkFueXdoZXJlIHx8IG5leHQuc3R5bGUoKS5s
aW5lQnJlYWsoKSA9PSBMaW5lQnJlYWs6OkFueXdoZXJlKSB7Ci0gICAgICAgICAgICAvLyBUaGVy
ZSBpcyBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBhcm91bmQgZXZlcnkgdHlwb2dyYXBoaWMgY2hh
cmFjdGVyIHVuaXQsIGluY2x1ZGluZyBhcm91bmQgYW55IHB1bmN0dWF0aW9uIGNoYXJhY3Rlcgot
ICAgICAgICAgICAgLy8gb3IgcHJlc2VydmVkIHdoaXRlIHNwYWNlcywgb3IgaW4gdGhlIG1pZGRs
ZSBvZiB3b3Jkcy4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAg
IC8vIEJvdGggY3VycmVudCBhbmQgbmV4dCBpdGVtcyBhcmUgbm9uLXdoaXRlc3BhY2UgdGV4dC4K
LSAgICAgICAgLy8gW3RleHRdW3RleHRdIDogaXMgYSBjb250aW51b3VzIGNvbnRlbnQuCi0gICAg
ICAgIC8vIFt0ZXh0LV1bdGV4dF0gOiBhZnRlciBbaHlwaGVuXSBwb3NpdGlvbiBpcyBhIHNvZnQg
d3JhcCBvcHBvcnR1bml0eS4KLSAgICAgICAgcmV0dXJuIGVuZHNXaXRoU29mdFdyYXBPcHBvcnR1
bml0eShjdXJyZW50SW5saW5lVGV4dEl0ZW0sIG5leHRJbmxpbmVUZXh0SXRlbSk7Ci0gICAgfQot
ICAgIGlmIChjdXJyZW50LmlzRmxvYXQoKSB8fCBuZXh0LmlzRmxvYXQoKSkgewotICAgICAgICAv
LyBXaGlsZSBmbG9hdHMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBpbmxpbmUgY29udGVudCBhbmQgdGhl
eSBhcmUgbm90IHN1cHBvc2VkIHRvIGludHJvZHVjZSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdGllcywK
LSAgICAgICAgLy8gZS5nLiBbdGV4dF1bZmxvYXQgYm94XVtmbG9hdCBib3hdW3RleHRdW2Zsb2F0
IGJveF1bdGV4dF0gaXMgZXNzZW50aWFsbHkganVzdCBbdGV4dF1bdGV4dF1bdGV4dF0KLSAgICAg
ICAgLy8gZmlndXJpbmcgb3V0IHdoZXRoZXIgYSBmbG9hdCAob3Igc2V0IG9mIGZsb2F0cykgc2hv
dWxkIHN0YXkgb24gdGhlIGxpbmUgb3Igbm90IChhbmQgaGFuZGxlIHBvdGVudGlhbGx5IG91dCBv
ZiBvcmRlciBpbmxpbmUgaXRlbXMpCi0gICAgICAgIC8vIGJyaW5ncyBpbiB1bm5lY2Vzc2FyeSBj
b21wbGV4aXR5LgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGN1cnJlbnQu
aXNCb3goKSB8fCBuZXh0LmlzQm94KCkpIHsKLSAgICAgICAgYXV0byBpc0ltYWdlQ29udGVudCA9
IGN1cnJlbnQubGF5b3V0Qm94KCkuaXNJbWFnZSgpIHx8IG5leHQubGF5b3V0Qm94KCkuaXNJbWFn
ZSgpOwotICAgICAgICBpZiAoaXNJbWFnZUNvbnRlbnQpCi0gICAgICAgICAgICByZXR1cm4gaW5s
aW5lRm9ybWF0dGluZ0NvbnRleHQucXVpcmtzKCkuaGFzU29mdFdyYXBPcHBvcnR1bml0eUF0SW1h
Z2UoKTsKLSAgICAgICAgLy8gW3RleHRdW2lubGluZSBib3ggc3RhcnRdW2lubGluZSBib3ggZW5k
XVtpbmxpbmUgYm94XSAodGV4dDxzcGFuPjwvc3Bhbj48aW1nPikgOiB0aGVyZSdzIGEgc29mdCB3
cmFwIG9wcG9ydHVuaXR5IGJldHdlZW4gdGhlIFt0ZXh0XSBhbmQgW2ltZ10uCi0gICAgICAgIC8v
IFRoZSBsaW5lIGJyZWFraW5nIGJlaGF2aW9yIG9mIGEgcmVwbGFjZWQgZWxlbWVudCBvciBvdGhl
ciBhdG9taWMgaW5saW5lIGlzIGVxdWl2YWxlbnQgdG8gYW4gaWRlb2dyYXBoaWMgY2hhcmFjdGVy
LgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0cnVjdCBMaW5lQ2FuZGlkYXRlIHsKLSAgICBMaW5l
Q2FuZGlkYXRlKGJvb2wgaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKTsKLQotICAgIHZvaWQg
cmVzZXQoKTsKLQotICAgIHN0cnVjdCBJbmxpbmVDb250ZW50IHsKLSAgICAgICAgSW5saW5lQ29u
dGVudChib29sIGlnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZyk7Ci0KLSAgICAgICAgY29uc3Qg
SW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50JiBjb250aW51b3VzQ29udGVu
dCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGludW91c0NvbnRlbnQ7IH0KLSAgICAgICAgY29uc3Qg
SW5saW5lSXRlbSogdHJhaWxpbmdMaW5lQnJlYWsoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5n
TGluZUJyZWFrOyB9Ci0gICAgICAgIGNvbnN0IElubGluZUl0ZW0qIHRyYWlsaW5nV29yZEJyZWFr
T3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX3RyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5p
dHk7IH0KLQotICAgICAgICB2b2lkIGFwcGVuZElubGluZUl0ZW0oY29uc3QgSW5saW5lSXRlbSYs
IElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoKTsKLSAgICAgICAgdm9pZCBhcHBlbmRUcmFp
bGluZ0xpbmVCcmVhayhjb25zdCBJbmxpbmVJdGVtJiBsaW5lQnJlYWtJdGVtKSB7IG1fdHJhaWxp
bmdMaW5lQnJlYWsgPSAmbGluZUJyZWFrSXRlbTsgfQotICAgICAgICB2b2lkIGFwcGVuZHRyYWls
aW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoY29uc3QgSW5saW5lSXRlbSYgd29yZEJyZWFrSXRlbSkg
eyBtX3RyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkgPSAmd29yZEJyZWFrSXRlbTsgfQotICAg
ICAgICB2b2lkIHJlc2V0KCk7Ci0gICAgICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJu
IG1fY29udGludW91c0NvbnRlbnQucnVucygpLmlzRW1wdHkoKSAmJiAhdHJhaWxpbmdXb3JkQnJl
YWtPcHBvcnR1bml0eSgpICYmICF0cmFpbGluZ0xpbmVCcmVhaygpOyB9Ci0gICAgICAgIGJvb2wg
aGFzSW5saW5lTGV2ZWxCb3goKSBjb25zdCB7IHJldHVybiBtX2hhc0lubGluZUxldmVsQm94OyB9
Ci0KLSAgICAgICAgdm9pZCBzZXRIYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoYm9vbCBo
YXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkpIHsgbV9oYXNUcmFpbGluZ1NvZnRXcmFwT3Bw
b3J0dW5pdHkgPSBoYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHk7IH0KLSAgICAgICAgYm9v
bCBoYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoKSBjb25zdCB7IHJldHVybiBtX2hhc1Ry
YWlsaW5nU29mdFdyYXBPcHBvcnR1bml0eTsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgYm9v
bCBtX2lnbm9yZVRyYWlsaW5nTGV0dGVyU3BhY2luZyB7IGZhbHNlIH07Ci0KLSAgICAgICAgSW5s
aW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVvdXNDb250ZW50IG1fY29udGludW91c0NvbnRlbnQ7
Ci0gICAgICAgIGNvbnN0IElubGluZUl0ZW0qIG1fdHJhaWxpbmdMaW5lQnJlYWsgeyBudWxscHRy
IH07Ci0gICAgICAgIGNvbnN0IElubGluZUl0ZW0qIG1fdHJhaWxpbmdXb3JkQnJlYWtPcHBvcnR1
bml0eSB7IG51bGxwdHIgfTsKLSAgICAgICAgYm9vbCBtX2hhc0lubGluZUxldmVsQm94IHsgZmFs
c2UgfTsKLSAgICAgICAgYm9vbCBtX2hhc1RyYWlsaW5nU29mdFdyYXBPcHBvcnR1bml0eSB7IGZh
bHNlIH07Ci0gICAgfTsKLQotICAgIC8vIENhbmRpZGF0ZSBjb250ZW50IGlzIGEgY29sbGVjdGlv
biBvZiBpbmxpbmUgY29udGVudCBvciBhIGZsb2F0IGJveC4KLSAgICBJbmxpbmVDb250ZW50IGlu
bGluZUNvbnRlbnQ7Ci0gICAgY29uc3QgSW5saW5lSXRlbSogZmxvYXRJdGVtIHsgbnVsbHB0ciB9
OwotfTsKLQotTGluZUNhbmRpZGF0ZTo6TGluZUNhbmRpZGF0ZShib29sIGlnbm9yZVRyYWlsaW5n
TGV0dGVyU3BhY2luZykKLSAgICA6IGlubGluZUNvbnRlbnQoaWdub3JlVHJhaWxpbmdMZXR0ZXJT
cGFjaW5nKQotewotfQotCi1MaW5lQ2FuZGlkYXRlOjpJbmxpbmVDb250ZW50OjpJbmxpbmVDb250
ZW50KGJvb2wgaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKQotICAgIDogbV9pZ25vcmVUcmFp
bGluZ0xldHRlclNwYWNpbmcoaWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5nKQotewotfQotCi1p
bmxpbmUgdm9pZCBMaW5lQ2FuZGlkYXRlOjpJbmxpbmVDb250ZW50OjphcHBlbmRJbmxpbmVJdGVt
KGNvbnN0IElubGluZUl0ZW0mIGlubGluZUl0ZW0sIElubGluZUxheW91dFVuaXQgbG9naWNhbFdp
ZHRoKQotewotICAgIEFTU0VSVChpbmxpbmVJdGVtLmlzVGV4dCgpIHx8IGlubGluZUl0ZW0uaXNC
b3goKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJdGVtLmlzSW5s
aW5lQm94RW5kKCkpOwotICAgIGF1dG8gY29sbGFwc2libGVXaWR0aCA9IFsmXSgpIC0+IE9wdGlv
bmFsPElubGluZUxheW91dFVuaXQ+IHsKLSAgICAgICAgaWYgKCFpbmxpbmVJdGVtLmlzVGV4dCgp
KQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgYXV0byYgaW5saW5lVGV4dEl0ZW0g
PSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4oaW5saW5lSXRlbSk7Ci0gICAgICAgIGlmIChpbmxp
bmVUZXh0SXRlbS5pc1doaXRlc3BhY2UoKSAmJiAhSW5saW5lVGV4dEl0ZW06OnNob3VsZFByZXNl
cnZlU3BhY2VzQW5kVGFicyhpbmxpbmVUZXh0SXRlbSkpIHsKLSAgICAgICAgICAgIC8vIEZ1bGx5
IGNvbGxhcHNpYmxlIHRyYWlsaW5nIGNvbnRlbnQuCi0gICAgICAgICAgICByZXR1cm4gbG9naWNh
bFdpZHRoOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIGZvciBwYXJ0aWFsbHkgY29sbGFw
c2libGUgY29udGVudC4KLSAgICAgICAgaWYgKG1faWdub3JlVHJhaWxpbmdMZXR0ZXJTcGFjaW5n
KQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLSAgICAgICAgYXV0byBsZXR0ZXJTcGFjaW5nID0g
aW5saW5lSXRlbS5zdHlsZSgpLmxldHRlclNwYWNpbmcoKTsKLSAgICAgICAgaWYgKGxldHRlclNw
YWNpbmcgPD0gMCkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0gICAgICAgIEFTU0VSVChsb2dp
Y2FsV2lkdGggPiBsZXR0ZXJTcGFjaW5nKTsKLSAgICAgICAgcmV0dXJuIGxldHRlclNwYWNpbmc7
Ci0gICAgfTsKLSAgICBtX2NvbnRpbnVvdXNDb250ZW50LmFwcGVuZChpbmxpbmVJdGVtLCBsb2dp
Y2FsV2lkdGgsIGNvbGxhcHNpYmxlV2lkdGgoKSk7Ci0gICAgbV9oYXNJbmxpbmVMZXZlbEJveCA9
IG1faGFzSW5saW5lTGV2ZWxCb3ggfHwgaW5saW5lSXRlbS5pc0JveCgpIHx8IGlubGluZUl0ZW0u
aXNJbmxpbmVCb3hTdGFydCgpOwotfQotCi1pbmxpbmUgdm9pZCBMaW5lQ2FuZGlkYXRlOjpJbmxp
bmVDb250ZW50OjpyZXNldCgpCi17Ci0gICAgbV9jb250aW51b3VzQ29udGVudC5yZXNldCgpOwot
ICAgIG1fdHJhaWxpbmdMaW5lQnJlYWsgPSB7IH07Ci0gICAgbV90cmFpbGluZ1dvcmRCcmVha09w
cG9ydHVuaXR5ID0geyB9OwotICAgIG1faGFzSW5saW5lTGV2ZWxCb3ggPSBmYWxzZTsKLX0KLQot
aW5saW5lIHZvaWQgTGluZUNhbmRpZGF0ZTo6cmVzZXQoKQotewotICAgIGZsb2F0SXRlbSA9IG51
bGxwdHI7Ci0gICAgaW5saW5lQ29udGVudC5yZXNldCgpOwotfQotCi1JbmxpbmVMYXlvdXRVbml0
IExpbmVCdWlsZGVyOjppbmxpbmVJdGVtV2lkdGgoY29uc3QgSW5saW5lSXRlbSYgaW5saW5lSXRl
bSwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpIGNvbnN0Ci17Ci0gICAgaWYg
KGlzPElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKSkgewotICAgICAgICBhdXRvJiBpbmxpbmVU
ZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihpbmxpbmVJdGVtKTsKLSAgICAgICAg
aWYgKGF1dG8gY29udGVudFdpZHRoID0gaW5saW5lVGV4dEl0ZW0ud2lkdGgoKSkKLSAgICAgICAg
ICAgIHJldHVybiAqY29udGVudFdpZHRoOwotICAgICAgICBpZiAoIWlubGluZVRleHRJdGVtLmlz
V2hpdGVzcGFjZSgpIHx8IElubGluZVRleHRJdGVtOjpzaG91bGRQcmVzZXJ2ZVNwYWNlc0FuZFRh
YnMoaW5saW5lVGV4dEl0ZW0pKQotICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlsOjp3aWR0aChp
bmxpbmVUZXh0SXRlbSwgY29udGVudExvZ2ljYWxMZWZ0KTsKLSAgICAgICAgcmV0dXJuIFRleHRV
dGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbSwgaW5saW5lVGV4dEl0ZW0uc3RhcnQoKSwgaW5saW5l
VGV4dEl0ZW0uc3RhcnQoKSArIDEsIGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0gICAgfQotCi0gICAg
aWYgKGlubGluZUl0ZW0uaXNMaW5lQnJlYWsoKSB8fCBpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bw
b3J0dW5pdHkoKSkKLSAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgIGF1dG8mIGxheW91dEJveCA9
IGlubGluZUl0ZW0ubGF5b3V0Qm94KCk7Ci0gICAgYXV0byYgYm94R2VvbWV0cnkgPSBtX2lubGlu
ZUZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxheW91dEJveCk7Ci0KLSAgICBpZiAo
bGF5b3V0Qm94LmlzRmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBib3hHZW9t
ZXRyeS5tYXJnaW5Cb3hXaWR0aCgpOwotCi0gICAgaWYgKGxheW91dEJveC5pc1JlcGxhY2VkQm94
KCkpCi0gICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5Cb3hXaWR0aCgpOwotCi0gICAg
aWYgKGlubGluZUl0ZW0uaXNJbmxpbmVCb3hTdGFydCgpKQotICAgICAgICByZXR1cm4gYm94R2Vv
bWV0cnkubWFyZ2luU3RhcnQoKSArIGJveEdlb21ldHJ5LmJvcmRlckxlZnQoKSArIGJveEdlb21l
dHJ5LnBhZGRpbmdMZWZ0KCkudmFsdWVPcigwKTsKLQotICAgIGlmIChpbmxpbmVJdGVtLmlzSW5s
aW5lQm94RW5kKCkpCi0gICAgICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5FbmQoKSArIGJv
eEdlb21ldHJ5LmJvcmRlclJpZ2h0KCkgKyBib3hHZW9tZXRyeS5wYWRkaW5nUmlnaHQoKS52YWx1
ZU9yKDApOwotCi0gICAgLy8gTm9uLXJlcGxhY2VkIGlubGluZSBib3ggKGUuZy4gaW5saW5lLWJs
b2NrKQotICAgIHJldHVybiBib3hHZW9tZXRyeS5tYXJnaW5Cb3hXaWR0aCgpOwotfQotCi1MaW5l
QnVpbGRlcjo6TGluZUJ1aWxkZXIoSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmIGlubGluZUZvcm1h
dHRpbmdDb250ZXh0LCBGbG9hdGluZ1N0YXRlJiBmbG9hdGluZ1N0YXRlLCBIb3Jpem9udGFsQ29u
c3RyYWludHMgcm9vdEhvcml6b250YWxDb25zdHJhaW50cywgY29uc3QgSW5saW5lSXRlbXMmIGlu
bGluZUl0ZW1zKQotICAgIDogbV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0
aW5nQ29udGV4dCkKLSAgICAsIG1faW5saW5lRm9ybWF0dGluZ1N0YXRlKCZpbmxpbmVGb3JtYXR0
aW5nQ29udGV4dC5mb3JtYXR0aW5nU3RhdGUoKSkKLSAgICAsIG1fZmxvYXRpbmdTdGF0ZSgmZmxv
YXRpbmdTdGF0ZSkKLSAgICAsIG1fcm9vdEhvcml6b250YWxDb25zdHJhaW50cyhyb290SG9yaXpv
bnRhbENvbnN0cmFpbnRzKQotICAgICwgbV9saW5lKGlubGluZUZvcm1hdHRpbmdDb250ZXh0KQot
ICAgICwgbV9pbmxpbmVJdGVtcyhpbmxpbmVJdGVtcykKLXsKLX0KLQotTGluZUJ1aWxkZXI6Okxp
bmVCdWlsZGVyKGNvbnN0IElubGluZUZvcm1hdHRpbmdDb250ZXh0JiBpbmxpbmVGb3JtYXR0aW5n
Q29udGV4dCwgY29uc3QgSW5saW5lSXRlbXMmIGlubGluZUl0ZW1zKQotICAgIDogbV9pbmxpbmVG
b3JtYXR0aW5nQ29udGV4dChpbmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICAsIG1fbGluZShp
bmxpbmVGb3JtYXR0aW5nQ29udGV4dCkKLSAgICAsIG1faW5saW5lSXRlbXMoaW5saW5lSXRlbXMp
Ci17Ci19Ci0KLUxpbmVCdWlsZGVyOjpMaW5lQ29udGVudCBMaW5lQnVpbGRlcjo6bGF5b3V0SW5s
aW5lQ29udGVudChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2UsIHNpemVf
dCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+
IG92ZXJmbG93TG9naWNhbFdpZHRoLCBjb25zdCBJbmxpbmVSZWN0JiBpbml0aWFsTGluZUxvZ2lj
YWxSZWN0LCBib29sIGlzRmlyc3RMaW5lKQotewotICAgIGluaXRpYWxpemUoaW5pdGlhbENvbnN0
cmFpbnRzRm9yTGluZShpbml0aWFsTGluZUxvZ2ljYWxSZWN0LCBpc0ZpcnN0TGluZSkpOwotCi0g
ICAgYXV0byBjb21taXR0ZWRDb250ZW50ID0gcGxhY2VJbmxpbmVDb250ZW50KG5lZWRzTGF5b3V0
UmFuZ2UsIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCwgb3ZlcmZsb3dMb2dpY2FsV2lkdGgp
OwotICAgIGF1dG8gY29tbWl0dGVkUmFuZ2UgPSBjbG9zZShuZWVkc0xheW91dFJhbmdlLCBjb21t
aXR0ZWRDb250ZW50KTsKLQotICAgIGF1dG8gaXNMYXN0TGluZSA9IGlzTGFzdExpbmVXaXRoSW5s
aW5lQ29udGVudChjb21taXR0ZWRSYW5nZSwgbmVlZHNMYXlvdXRSYW5nZS5lbmQsIGNvbW1pdHRl
ZENvbnRlbnQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCk7Ci0gICAgcmV0dXJuIExpbmVD
b250ZW50IHsgY29tbWl0dGVkUmFuZ2UsIGNvbW1pdHRlZENvbnRlbnQucGFydGlhbFRyYWlsaW5n
Q29udGVudExlbmd0aCwgY29tbWl0dGVkQ29udGVudC5vdmVyZmxvd0xvZ2ljYWxXaWR0aCwgbV9m
bG9hdHMsIG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0Ci0gICAgICAgICwgbV9saW5lTG9n
aWNhbFJlY3QudG9wTGVmdCgpCi0gICAgICAgICwgbV9saW5lTG9naWNhbFJlY3Qud2lkdGgoKQot
ICAgICAgICAsIG1fbGluZS5jb250ZW50TG9naWNhbFdpZHRoKCkKLSAgICAgICAgLCBpc0xhc3RM
aW5lCi0gICAgICAgICwgbV9saW5lLm5vblNwYW5uaW5nSW5saW5lTGV2ZWxCb3hDb3VudCgpCi0g
ICAgICAgICwgbV9saW5lLnJ1bnMoKX07Ci19Ci0KLUxpbmVCdWlsZGVyOjpJbnRyaW5zaWNDb250
ZW50IExpbmVCdWlsZGVyOjpjb21wdXRlZEludHJpbnNpY1dpZHRoKGNvbnN0IElubGluZUl0ZW1S
YW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCkK
LXsKLSAgICBpbml0aWFsaXplKHsgeyB7IH0sIHsgYXZhaWxhYmxlV2lkdGgsIG1heElubGluZUxh
eW91dFVuaXQoKSB9IH0sIGZhbHNlIH0pOwotICAgIGF1dG8gY29tbWl0dGVkQ29udGVudCA9IHBs
YWNlSW5saW5lQ29udGVudChuZWVkc0xheW91dFJhbmdlLCB7IH0sIHsgfSk7Ci0gICAgYXV0byBj
b21taXR0ZWRSYW5nZSA9IGNsb3NlKG5lZWRzTGF5b3V0UmFuZ2UsIGNvbW1pdHRlZENvbnRlbnQp
OwotICAgIHJldHVybiB7IGNvbW1pdHRlZFJhbmdlLCBtX2xpbmUuY29udGVudExvZ2ljYWxXaWR0
aCgpLCBtX2Zsb2F0cyB9OwotfQotCi12b2lkIExpbmVCdWlsZGVyOjppbml0aWFsaXplKGNvbnN0
IFVzZWRDb25zdHJhaW50cyYgbGluZUNvbnN0cmFpbnRzKQotewotICAgIG1fZmxvYXRzLmNsZWFy
KCk7Ci0gICAgbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtID0geyB9OwotICAgIG1fd3JhcE9wcG9y
dHVuaXR5TGlzdC5jbGVhcigpOwotCi0gICAgbV9saW5lLmluaXRpYWxpemUoKTsKLSAgICBtX2xp
bmVMb2dpY2FsUmVjdCA9IGxpbmVDb25zdHJhaW50cy5sb2dpY2FsUmVjdDsKLSAgICBtX2NvbnRl
bnRJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IGxpbmVDb25zdHJhaW50cy5pc0NvbnN0cmFpbmVkQnlG
bG9hdDsKLX0KLQotTGluZUJ1aWxkZXI6OkNvbW1pdHRlZENvbnRlbnQgTGluZUJ1aWxkZXI6OnBs
YWNlSW5saW5lQ29udGVudChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2Us
IHNpemVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91
dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgpCi17Ci0gICAgYXV0byBsaW5lQ2FuZGlkYXRlID0g
TGluZUNhbmRpZGF0ZSB7IGxheW91dFN0YXRlKCkuc2hvdWxkSWdub3JlVHJhaWxpbmdMZXR0ZXJT
cGFjaW5nKCkgfTsKLSAgICBhdXRvIGlubGluZUNvbnRlbnRCcmVha2VyID0gSW5saW5lQ29udGVu
dEJyZWFrZXIgeyB9OwotCi0gICAgYXV0byBjdXJyZW50SXRlbUluZGV4ID0gbmVlZHNMYXlvdXRS
YW5nZS5zdGFydDsKLSAgICBzaXplX3QgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50ID0gMDsKLSAg
ICB3aGlsZSAoY3VycmVudEl0ZW1JbmRleCA8IG5lZWRzTGF5b3V0UmFuZ2UuZW5kKSB7Ci0gICAg
ICAgIC8vIDEuIENvbGxlY3QgdGhlIHNldCBvZiBydW5zIHRoYXQgd2UgY2FuIGNvbW1pdCB0byB0
aGUgbGluZSBhcyBvbmUgZW50aXR5IGUuZy4gPHNwYW4+dGV4dF9hbmRfc3Bhbl9zdGFydF9zcGFu
X2VuZDwvc3Bhbj4uCi0gICAgICAgIC8vIDIuIEFwcGx5IGZsb2F0cyBhbmQgc2hyaW5rIHRoZSBh
dmFpbGFibGUgaG9yaXpvbnRhbCBzcGFjZSBlLmcuIDxzcGFuPmludHJ1XzxkaXYgc3R5bGU9ImZs
b2F0OiBsZWZ0Ij48L2Rpdj5zaXZlX2Zsb2F0PC9zcGFuPi4KLSAgICAgICAgLy8gMy4gQ2hlY2sg
aWYgdGhlIGNvbnRlbnQgZml0cyB0aGUgbGluZSBhbmQgY29tbWl0IHRoZSBjb250ZW50IGFjY29y
ZGluZ2x5IChmdWxsLCBwYXJ0aWFsIG9yIG5vdCBjb21taXQgYXQgYWxsKS4KLSAgICAgICAgLy8g
NC4gUmV0dXJuIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGVpdGhlciBieSBub3Qg
YmVpbmcgYWJsZSB0byBmaXQgbW9yZSBjb250ZW50IG9yIGJlY2F1c2Ugb2YgYW4gZXhwbGljaXQg
bGluZSBicmVhay4KLSAgICAgICAgY2FuZGlkYXRlQ29udGVudEZvckxpbmUobGluZUNhbmRpZGF0
ZSwgY3VycmVudEl0ZW1JbmRleCwgbmVlZHNMYXlvdXRSYW5nZSwgcGFydGlhbExlYWRpbmdDb250
ZW50TGVuZ3RoLCBzdGQ6OmV4Y2hhbmdlKGxlYWRpbmdMb2dpY2FsV2lkdGgsIFdURjo6bnVsbG9w
dCksIG1fbGluZS5jb250ZW50TG9naWNhbFJpZ2h0KCkpOwotICAgICAgICAvLyBOb3cgY2hlY2sg
aWYgd2UgY2FuIHB1dCB0aGlzIGNvbnRlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAg
YXV0byByZXN1bHQgPSBSZXN1bHQgeyB9OwotICAgICAgICBpZiAobGluZUNhbmRpZGF0ZS5mbG9h
dEl0ZW0pIHsKLSAgICAgICAgICAgIEFTU0VSVChsaW5lQ2FuZGlkYXRlLmlubGluZUNvbnRlbnQu
aXNFbXB0eSgpKTsKLSAgICAgICAgICAgIGhhbmRsZUZsb2F0Q29udGVudCgqbGluZUNhbmRpZGF0
ZS5mbG9hdEl0ZW0pOwotICAgICAgICAgICAgLy8gRmxvYXRzIG5ldmVyIHRlcm1pbmF0ZSB0aGUg
bGluZS4KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVJbmxpbmVD
b250ZW50KGlubGluZUNvbnRlbnRCcmVha2VyLCBuZWVkc0xheW91dFJhbmdlLCBsaW5lQ2FuZGlk
YXRlKTsKLSAgICAgICAgYXV0byBpc0VuZE9mTGluZSA9IHJlc3VsdC5pc0VuZE9mTGluZSA9PSBJ
bmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllczsKLSAgICAgICAgaWYgKCFyZXN1
bHQuY29tbWl0dGVkQ291bnQuaXNSZXZlcnQpIHsKLSAgICAgICAgICAgIGNvbW1pdHRlZElubGlu
ZUl0ZW1Db3VudCArPSByZXN1bHQuY29tbWl0dGVkQ291bnQudmFsdWU7Ci0gICAgICAgICAgICBh
dXRvJiBpbmxpbmVDb250ZW50ID0gbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50OwotICAgICAg
ICAgICAgYXV0byBpbmxpbmVDb250ZW50SXNGdWxseUNvbW1pdHRlZCA9IGlubGluZUNvbnRlbnQu
Y29udGludW91c0NvbnRlbnQoKS5ydW5zKCkuc2l6ZSgpID09IHJlc3VsdC5jb21taXR0ZWRDb3Vu
dC52YWx1ZSAmJiAhcmVzdWx0LnBhcnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGg7Ci0gICAgICAg
ICAgICBpZiAoaW5saW5lQ29udGVudElzRnVsbHlDb21taXR0ZWQpIHsKLSAgICAgICAgICAgICAg
ICBpZiAoYXV0byogd29yZEJyZWFrT3Bwb3J0dW5pdHkgPSBpbmxpbmVDb250ZW50LnRyYWlsaW5n
V29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyA8d2JyPiBu
ZWVkcyB0byBiZSBvbiB0aGUgbGluZSBhcyBhbiBlbXB0eSBydW4gc28gdGhhdCB3ZSBjYW4gY29u
c3RydWN0IGFuIGlubGluZSBib3ggYW5kIGNvbXB1dGUgYmFzaWMgZ2VvbWV0cnkuCi0gICAgICAg
ICAgICAgICAgICAgICsrY29tbWl0dGVkSW5saW5lSXRlbUNvdW50OwotICAgICAgICAgICAgICAg
ICAgICBtX2xpbmUuYXBwZW5kKCp3b3JkQnJlYWtPcHBvcnR1bml0eSwgeyB9KTsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlubGluZUNvbnRlbnQudHJhaWxpbmdMaW5l
QnJlYWsoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBGdWxseSBjb21taXR0ZWQgKG9yIGVt
cHR5KSBjb250ZW50IGZvbGxvd2VkIGJ5IGEgbGluZSBicmVhayBtZWFucyAiZW5kIG9mIGxpbmUi
LgotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyB3aWxsIHB1dCB0aGUgbGluZSBi
cmVhayBib3ggYXQgdGhlIGVuZCBvZiB0aGUgbGluZSB3aGlsZSBpbiBjYXNlIG9mIHNvbWUgaW5s
aW5lIGJveGVzLCB0aGUgbGluZSBicmVhawotICAgICAgICAgICAgICAgICAgICAvLyBjb3VsZCB2
ZXJ5IHdlbGwgYmUgYXQgYW4gZWFybGllciBwb3NpdGlvbi4gVGhpcyBoYXMgbm8gdmlzdWFsIGlt
cGxpY2F0aW9ucyBhdCB0aGlzIHBvaW50IHRob3VnaCAob25seSBnZW9tZXRyeSBjb3JyZWN0bmVz
cyBvbiB0aGUgbGluZSBicmVhayBib3gpLgotICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIDxz
cGFuIHN0eWxlPSJib3JkZXItcmlnaHQ6IDEwcHggc29saWQgZ3JlZW4iPnRleHQ8YnI+PC9zcGFu
PiB3aGVyZSB0aGUgPGJyPidzIGhvcml6b250YWwgcG9zaXRpb24gaXMgYmVmb3JlIHRoZSByaWdo
dCBib3JkZXIgYW5kIG5vdCBhZnRlci4KLSAgICAgICAgICAgICAgICAgICAgbV9saW5lLmFwcGVu
ZCgqaW5saW5lQ29udGVudC50cmFpbGluZ0xpbmVCcmVhaygpLCB7IH0pOwotICAgICAgICAgICAg
ICAgICAgICArK2NvbW1pdHRlZElubGluZUl0ZW1Db3VudDsKLSAgICAgICAgICAgICAgICAgICAg
aXNFbmRPZkxpbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfSBlbHNlCi0gICAgICAgICAgICBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgPSByZXN1
bHQuY29tbWl0dGVkQ291bnQudmFsdWU7Ci0KLSAgICAgICAgaWYgKGlzRW5kT2ZMaW5lKSB7Ci0g
ICAgICAgICAgICAvLyBXZSBjYW4ndCBwbGFjZSBhbnkgbW9yZSBpdGVtcyBvbiB0aGUgY3VycmVu
dCBsaW5lLgotICAgICAgICAgICAgcmV0dXJuIHsgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50LCBy
ZXN1bHQucGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCwgcmVzdWx0Lm92ZXJmbG93TG9naWNh
bFdpZHRoIH07Ci0gICAgICAgIH0KLSAgICAgICAgY3VycmVudEl0ZW1JbmRleCA9IG5lZWRzTGF5
b3V0UmFuZ2Uuc3RhcnQgKyBjb21taXR0ZWRJbmxpbmVJdGVtQ291bnQgKyBtX2Zsb2F0cy5zaXpl
KCk7Ci0gICAgICAgIHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCA9IHsgfTsKLSAgICB9Ci0g
ICAgLy8gTG9va3MgbGlrZSB3ZSd2ZSBydW4gb3V0IG9mIHJ1bnMuCi0gICAgcmV0dXJuIHsgY29t
bWl0dGVkSW5saW5lSXRlbUNvdW50LCB7IH0gfTsKLX0KLQotTGluZUJ1aWxkZXI6OklubGluZUl0
ZW1SYW5nZSBMaW5lQnVpbGRlcjo6Y2xvc2UoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xh
eW91dFJhbmdlLCBjb25zdCBDb21taXR0ZWRDb250ZW50JiBjb21taXR0ZWRDb250ZW50KQotewot
ICAgIEFTU0VSVChjb21taXR0ZWRDb250ZW50LmlubGluZUl0ZW1Db3VudCB8fCAhbV9mbG9hdHMu
aXNFbXB0eSgpIHx8IG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0KTsKLSAgICBhdXRvIG51
bWJlck9mQ29tbWl0dGVkSXRlbXMgPSBjb21taXR0ZWRDb250ZW50LmlubGluZUl0ZW1Db3VudCAr
IG1fZmxvYXRzLnNpemUoKTsKLSAgICBhdXRvIHRyYWlsaW5nSW5saW5lSXRlbUluZGV4ID0gbmVl
ZHNMYXlvdXRSYW5nZS5zdGFydCArIG51bWJlck9mQ29tbWl0dGVkSXRlbXMgLSAxOwotICAgIGF1
dG8gbGluZVJhbmdlID0gSW5saW5lSXRlbVJhbmdlIHsgbmVlZHNMYXlvdXRSYW5nZS5zdGFydCwg
dHJhaWxpbmdJbmxpbmVJdGVtSW5kZXggKyAxIH07Ci0gICAgQVNTRVJUKGxpbmVSYW5nZS5lbmQg
PD0gbmVlZHNMYXlvdXRSYW5nZS5lbmQpOwotICAgIGlmICghY29tbWl0dGVkQ29udGVudC5pbmxp
bmVJdGVtQ291bnQpIHsKLSAgICAgICAgLy8gTGluZSBpcyBlbXB0eSwgd2Ugb25seSBtYW5hZ2Vk
IHRvIHBsYWNlIGZsb2F0IGJveGVzLgotICAgICAgICByZXR1cm4gbGluZVJhbmdlOwotICAgIH0K
LSAgICBhdXRvIGF2YWlsYWJsZVdpZHRoID0gbV9saW5lTG9naWNhbFJlY3Qud2lkdGgoKSAtIG1f
bGluZS5jb250ZW50TG9naWNhbFJpZ2h0KCk7Ci0gICAgbV9saW5lLnJlbW92ZUNvbGxhcHNpYmxl
Q29udGVudChhdmFpbGFibGVXaWR0aCk7Ci0gICAgYXV0byBob3Jpem9udGFsQWxpZ25tZW50ID0g
cm9vdCgpLnN0eWxlKCkudGV4dEFsaWduKCk7Ci0gICAgYXV0byBydW5zRXhwYW5kSG9yaXpvbnRh
bGx5ID0gaG9yaXpvbnRhbEFsaWdubWVudCA9PSBUZXh0QWxpZ25Nb2RlOjpKdXN0aWZ5ICYmICFp
c0xhc3RMaW5lV2l0aElubGluZUNvbnRlbnQobGluZVJhbmdlLCBuZWVkc0xheW91dFJhbmdlLmVu
ZCwgY29tbWl0dGVkQ29udGVudC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50TGVuZ3RoKTsKLSAgICBp
ZiAocnVuc0V4cGFuZEhvcml6b250YWxseSkKLSAgICAgICAgbV9saW5lLmFwcGx5UnVuRXhwYW5z
aW9uKG1fbGluZUxvZ2ljYWxSZWN0LndpZHRoKCkgLSBtX2xpbmUuY29udGVudExvZ2ljYWxSaWdo
dCgpKTsKLSAgICBhdXRvIGxpbmVFbmRzV2l0aEh5cGhlbiA9IGZhbHNlOwotICAgIGlmICghbV9s
aW5lLnJ1bnMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgYXV0byYgbGFzdFRleHRDb250ZW50ID0g
bV9saW5lLnJ1bnMoKS5sYXN0KCkudGV4dENvbnRlbnQoKTsKLSAgICAgICAgbGluZUVuZHNXaXRo
SHlwaGVuID0gbGFzdFRleHRDb250ZW50ICYmIGxhc3RUZXh0Q29udGVudC0+bmVlZHNIeXBoZW4o
KTsKLSAgICB9Ci0gICAgbV9zdWNjZXNzaXZlSHlwaGVuYXRlZExpbmVDb3VudCA9IGxpbmVFbmRz
V2l0aEh5cGhlbiA/IG1fc3VjY2Vzc2l2ZUh5cGhlbmF0ZWRMaW5lQ291bnQgKyAxIDogMDsKLSAg
ICByZXR1cm4gbGluZVJhbmdlOwotfQotCi1PcHRpb25hbDxIb3Jpem9udGFsQ29uc3RyYWludHM+
IExpbmVCdWlsZGVyOjpmbG9hdENvbnN0cmFpbnRzKGNvbnN0IElubGluZVJlY3QmIGxpbmVMb2dp
Y2FsUmVjdCkgY29uc3QKLXsKLSAgICBhdXRvKiBmbG9hdGluZ1N0YXRlID0gdGhpcy0+ZmxvYXRp
bmdTdGF0ZSgpOwotICAgIGlmICghZmxvYXRpbmdTdGF0ZSB8fCBmbG9hdGluZ1N0YXRlLT5mbG9h
dHMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICAvLyBDaGVjayBmb3Ig
aW50cnVkaW5nIGZsb2F0cyBhbmQgYWRqdXN0IGxvZ2ljYWwgbGVmdC9hdmFpbGFibGUgd2lkdGgg
Zm9yIHRoaXMgbGluZSBhY2NvcmRpbmdseS4KLSAgICBhdXRvIGZsb2F0aW5nQ29udGV4dCA9IEZs
b2F0aW5nQ29udGV4dCB7IGZvcm1hdHRpbmdDb250ZXh0KCksICpmbG9hdGluZ1N0YXRlIH07Ci0g
ICAgYXV0byBjb25zdHJhaW50cyA9IGZsb2F0aW5nQ29udGV4dC5jb25zdHJhaW50cyh0b0xheW91
dFVuaXQobGluZUxvZ2ljYWxSZWN0LnRvcCgpKSwgdG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmVj
dC5ib3R0b20oKSkpOwotICAgIC8vIENoZWNrIGlmIHRoZXNlIHZhbHVlcyBhY3R1YWxseSBjb25z
dHJhaW4gdGhlIGxpbmUuCi0gICAgaWYgKGNvbnN0cmFpbnRzLmxlZnQgJiYgY29uc3RyYWludHMu
bGVmdC0+eCA8PSBsaW5lTG9naWNhbFJlY3QubGVmdCgpKQotICAgICAgICBjb25zdHJhaW50cy5s
ZWZ0ID0geyB9OwotCi0gICAgaWYgKGNvbnN0cmFpbnRzLnJpZ2h0ICYmIGNvbnN0cmFpbnRzLnJp
Z2h0LT54ID49IGxpbmVMb2dpY2FsUmVjdC5yaWdodCgpKQotICAgICAgICBjb25zdHJhaW50cy5y
aWdodCA9IHsgfTsKLQotICAgIGlmICghY29uc3RyYWludHMubGVmdCAmJiAhY29uc3RyYWludHMu
cmlnaHQpCi0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICBhdXRvIGxpbmVMb2dpY2FsTGVmdCA9
IGxpbmVMb2dpY2FsUmVjdC5sZWZ0KCk7Ci0gICAgYXV0byBsaW5lTG9naWNhbFJpZ2h0ID0gbGlu
ZUxvZ2ljYWxSZWN0LnJpZ2h0KCk7Ci0gICAgaWYgKGNvbnN0cmFpbnRzLmxlZnQgJiYgY29uc3Ry
YWludHMucmlnaHQpIHsKLSAgICAgICAgbGluZUxvZ2ljYWxSaWdodCA9IGNvbnN0cmFpbnRzLnJp
Z2h0LT54OwotICAgICAgICBsaW5lTG9naWNhbExlZnQgPSBjb25zdHJhaW50cy5sZWZ0LT54Owot
ICAgIH0gZWxzZSBpZiAoY29uc3RyYWludHMubGVmdCkgewotICAgICAgICBBU1NFUlQoY29uc3Ry
YWludHMubGVmdC0+eCA+PSBsaW5lTG9naWNhbExlZnQpOwotICAgICAgICBsaW5lTG9naWNhbExl
ZnQgPSBjb25zdHJhaW50cy5sZWZ0LT54OwotICAgIH0gZWxzZSBpZiAoY29uc3RyYWludHMucmln
aHQpIHsKLSAgICAgICAgLy8gUmlnaHQgZmxvYXQgYm94ZXMgbWF5IG92ZXJmbG93IHRoZSBjb250
YWluaW5nIGJsb2NrIG9uIHRoZSBsZWZ0LgotICAgICAgICBsaW5lTG9naWNhbFJpZ2h0ID0gc3Rk
OjptYXg8SW5saW5lTGF5b3V0VW5pdD4obGluZUxvZ2ljYWxMZWZ0LCBjb25zdHJhaW50cy5yaWdo
dC0+eCk7Ci0gICAgfQotICAgIHJldHVybiBIb3Jpem9udGFsQ29uc3RyYWludHMgeyB0b0xheW91
dFVuaXQobGluZUxvZ2ljYWxMZWZ0KSwgdG9MYXlvdXRVbml0KGxpbmVMb2dpY2FsUmlnaHQgLSBs
aW5lTG9naWNhbExlZnQpIH07Ci19Ci0KLUxpbmVCdWlsZGVyOjpVc2VkQ29uc3RyYWludHMgTGlu
ZUJ1aWxkZXI6OmluaXRpYWxDb25zdHJhaW50c0ZvckxpbmUoY29uc3QgSW5saW5lUmVjdCYgaW5p
dGlhbExpbmVMb2dpY2FsUmVjdCwgYm9vbCBpc0ZpcnN0TGluZSkgY29uc3QKLXsKLSAgICBhdXRv
IGxpbmVMb2dpY2FsTGVmdCA9IGluaXRpYWxMaW5lTG9naWNhbFJlY3QubGVmdCgpOwotICAgIGF1
dG8gbGluZUxvZ2ljYWxSaWdodCA9IGluaXRpYWxMaW5lTG9naWNhbFJlY3QucmlnaHQoKTsKLSAg
ICBhdXRvIGxpbmVJc0NvbnN0cmFpbmVkQnlGbG9hdCA9IGZhbHNlOwotCi0gICAgaWYgKGF1dG8g
bGluZUNvbnN0cmFpbnRzID0gZmxvYXRDb25zdHJhaW50cyhpbml0aWFsTGluZUxvZ2ljYWxSZWN0
KSkgewotICAgICAgICBsaW5lTG9naWNhbExlZnQgPSBsaW5lQ29uc3RyYWludHMtPmxvZ2ljYWxM
ZWZ0OwotICAgICAgICBsaW5lTG9naWNhbFJpZ2h0ID0gbGluZUNvbnN0cmFpbnRzLT5sb2dpY2Fs
UmlnaHQoKTsKLSAgICAgICAgbGluZUlzQ29uc3RyYWluZWRCeUZsb2F0ID0gdHJ1ZTsKLSAgICB9
Ci0KLSAgICBhdXRvIGNvbXB1dGVkVGV4dEluZGVudCA9IFsmXSgpIC0+IElubGluZUxheW91dFVu
aXQgewotICAgICAgICAvLyB0ZXh0LWluZGVudCBwcm9wZXJ0eSBzcGVjaWZpZXMgdGhlIGluZGVu
dGF0aW9uIGFwcGxpZWQgdG8gbGluZXMgb2YgaW5saW5lIGNvbnRlbnQgaW4gYSBibG9jay4KLSAg
ICAgICAgLy8gVGhlIGluZGVudCBpcyB0cmVhdGVkIGFzIGEgbWFyZ2luIGFwcGxpZWQgdG8gdGhl
IHN0YXJ0IGVkZ2Ugb2YgdGhlIGxpbmUgYm94LgotICAgICAgICAvLyBVbmxlc3Mgb3RoZXJ3aXNl
IHNwZWNpZmllZCwgb25seSBsaW5lcyB0aGF0IGFyZSB0aGUgZmlyc3QgZm9ybWF0dGVkIGxpbmUg
b2YgYW4gZWxlbWVudCBhcmUgYWZmZWN0ZWQuCi0gICAgICAgIC8vIEZvciBleGFtcGxlLCB0aGUg
Zmlyc3QgbGluZSBvZiBhbiBhbm9ueW1vdXMgYmxvY2sgYm94IGlzIG9ubHkgYWZmZWN0ZWQgaWYg
aXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJlbnQgZWxlbWVudC4KLSAgICAgICAgLy8g
RklYTUU6IEFkZCBzdXBwb3J0IGZvciBlYWNoLWxpbmUuCi0gICAgICAgIC8vIFtJbnRlZ3JhdGlv
bl0gcm9vdCgpLT5wYXJlbnQoKSB3b3VsZCBub3JtYWxseSBwcm9kdWNlIGEgdmFsaWQgbGF5b3V0
IGJveC4KLSAgICAgICAgYXV0byYgcm9vdCA9IHRoaXMtPnJvb3QoKTsKLSAgICAgICAgYXV0byBp
c0Zvcm1hdHRpbmdDb250ZXh0Um9vdENhbmRpZGF0ZVRvVGV4dEluZGVudCA9ICFyb290LmlzQW5v
bnltb3VzKCk7Ci0gICAgICAgIGlmIChyb290LmlzQW5vbnltb3VzKCkpIHsKLSAgICAgICAgICAg
IC8vIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRoZSBlYWNoLWxpbmUgYW5kL29yIGhh
bmdpbmcga2V5d29yZHMsIG9ubHkgbGluZXMgdGhhdCBhcmUgdGhlIGZpcnN0IGZvcm1hdHRlZCBs
aW5lCi0gICAgICAgICAgICAvLyBvZiBhbiBlbGVtZW50IGFyZSBhZmZlY3RlZC4KLSAgICAgICAg
ICAgIC8vIEZvciBleGFtcGxlLCB0aGUgZmlyc3QgbGluZSBvZiBhbiBhbm9ueW1vdXMgYmxvY2sg
Ym94IGlzIG9ubHkgYWZmZWN0ZWQgaWYgaXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJl
bnQgZWxlbWVudC4KLSAgICAgICAgICAgIGF1dG8gaXNJbnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hp
bGQgPSBsYXlvdXRTdGF0ZSgpLmlzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkKCk7Ci0gICAg
ICAgICAgICBpZiAoaXNJbnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQgPT0gTGF5b3V0U3RhdGU6
OklzSW50ZWdyYXRlZFJvb3RCb3hGaXJzdENoaWxkOjpOb3RBcHBsaWNhYmxlKQotICAgICAgICAg
ICAgICAgIGlzRm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9UZXh0SW5kZW50ID0gcm9v
dC5wYXJlbnQoKS5maXJzdEluRmxvd0NoaWxkKCkgPT0gJnJvb3Q7Ci0gICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgaXNGb3JtYXR0aW5nQ29udGV4dFJvb3RDYW5kaWRhdGVUb1RleHRJ
bmRlbnQgPSBpc0ludGVncmF0ZWRSb290Qm94Rmlyc3RDaGlsZCA9PSBMYXlvdXRTdGF0ZTo6SXNJ
bnRlZ3JhdGVkUm9vdEJveEZpcnN0Q2hpbGQ6OlllczsKLSAgICAgICAgfQotICAgICAgICBpZiAo
IWlzRm9ybWF0dGluZ0NvbnRleHRSb290Q2FuZGlkYXRlVG9UZXh0SW5kZW50KQotICAgICAgICAg
ICAgcmV0dXJuIHsgfTsKLSAgICAgICAgYXV0byBpbnZlcnRMaW5lUmFuZ2UgPSByb290LnN0eWxl
KCkudGV4dEluZGVudFR5cGUoKSA9PSBUZXh0SW5kZW50VHlwZTo6SGFuZ2luZzsKLSAgICAgICAg
Ly8gdGV4dC1pbmRlbnQ6IGhhbmdpbmcgaW52ZXJ0cyB3aGljaCBsaW5lcyBhcmUgYWZmZWN0ZWQu
Ci0gICAgICAgIC8vIGludmVydGVkIGxpbmUgcmFuZ2UgLT4gYWxsIHRoZSBsaW5lcyBleGNlcHQg
dGhlIGZpcnN0IG9uZS4KLSAgICAgICAgLy8gIWludmVydGVkIGxpbmUgcmFuZ2UgLT4gZmlyc3Qg
bGluZSBnZXRzIHRoZSBpbmRlbnQuCi0gICAgICAgIGF1dG8gc2hvdWxkSW5kZW50ID0gaW52ZXJ0
TGluZVJhbmdlICE9IGlzRmlyc3RMaW5lOwotICAgICAgICBpZiAoIXNob3VsZEluZGVudCkKLSAg
ICAgICAgICAgIHJldHVybiB7IH07Ci0KLSAgICAgICAgYXV0byB0ZXh0SW5kZW50ID0gcm9vdC5z
dHlsZSgpLnRleHRJbmRlbnQoKTsKLSAgICAgICAgaWYgKHRleHRJbmRlbnQgPT0gUmVuZGVyU3R5
bGU6OmluaXRpYWxUZXh0SW5kZW50KCkpCi0gICAgICAgICAgICByZXR1cm4geyB9OwotICAgICAg
ICByZXR1cm4geyBtaW5pbXVtVmFsdWVGb3JMZW5ndGgodGV4dEluZGVudCwgaW5pdGlhbExpbmVM
b2dpY2FsUmVjdC53aWR0aCgpKSB9OwotICAgIH07Ci0gICAgbGluZUxvZ2ljYWxMZWZ0ICs9IGNv
bXB1dGVkVGV4dEluZGVudCgpOwotICAgIHJldHVybiBVc2VkQ29uc3RyYWludHMgeyB7IGluaXRp
YWxMaW5lTG9naWNhbFJlY3QudG9wKCksIGxpbmVMb2dpY2FsTGVmdCwgbGluZUxvZ2ljYWxSaWdo
dCAtIGxpbmVMb2dpY2FsTGVmdCwgaW5pdGlhbExpbmVMb2dpY2FsUmVjdC5oZWlnaHQoKSB9LCBs
aW5lSXNDb25zdHJhaW5lZEJ5RmxvYXQgfTsKLX0KLQotdm9pZCBMaW5lQnVpbGRlcjo6Y2FuZGlk
YXRlQ29udGVudEZvckxpbmUoTGluZUNhbmRpZGF0ZSYgbGluZUNhbmRpZGF0ZSwgc2l6ZV90IGN1
cnJlbnRJbmxpbmVJdGVtSW5kZXgsIGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFuZ2Us
IHNpemVfdCBwYXJ0aWFsTGVhZGluZ0NvbnRlbnRMZW5ndGgsIE9wdGlvbmFsPElubGluZUxheW91
dFVuaXQ+IGxlYWRpbmdMb2dpY2FsV2lkdGgsIElubGluZUxheW91dFVuaXQgY3VycmVudExvZ2lj
YWxSaWdodCkKLXsKLSAgICBBU1NFUlQoY3VycmVudElubGluZUl0ZW1JbmRleCA8IGxheW91dFJh
bmdlLmVuZCk7Ci0gICAgbGluZUNhbmRpZGF0ZS5yZXNldCgpOwotICAgIC8vIDEuIFNpbXBseSBh
ZGQgYW55IG92ZXJmbG93IGNvbnRlbnQgZnJvbSB0aGUgcHJldmlvdXMgbGluZSB0byB0aGUgY2Fu
ZGlkYXRlIGNvbnRlbnQuIEl0J3MgYWx3YXlzIGEgdGV4dCBjb250ZW50LgotICAgIC8vIDIuIEZp
bmQgdGhlIG5leHQgc29mdCB3cmFwIHBvc2l0aW9uIG9yIGV4cGxpY2l0IGxpbmUgYnJlYWsuCi0g
ICAgLy8gMy4gQ29sbGVjdCBmbG9hdHMgYmV0d2VlbiB0aGUgaW5saW5lIGNvbnRlbnQuCi0gICAg
YXV0byBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggPSBuZXh0V3JhcE9wcG9ydHVuaXR5KGN1cnJl
bnRJbmxpbmVJdGVtSW5kZXgsIGxheW91dFJhbmdlKTsKLSAgICAvLyBzb2Z0V3JhcE9wcG9ydHVu
aXR5SW5kZXggPT0gbGF5b3V0UmFuZ2UuZW5kIG1lYW5zIHdlIGRvbid0IGhhdmUgYW55IHdyYXAg
b3Bwb3J0dW5pdHkgaW4gdGhpcyBjb250ZW50LgotICAgIEFTU0VSVChzb2Z0V3JhcE9wcG9ydHVu
aXR5SW5kZXggPD0gbGF5b3V0UmFuZ2UuZW5kKTsKLQotICAgIGlmIChwYXJ0aWFsTGVhZGluZ0Nv
bnRlbnRMZW5ndGgpIHsKLSAgICAgICAgLy8gSGFuZGxlIGxlYWRpbmcgcGFydGlhbCBjb250ZW50
IGZpcnN0IChvdmVyZmxvd2luZyB0ZXh0IGZyb20gdGhlIHByZXZpb3VzIGxpbmUpLgotICAgICAg
ICAvLyBDb25zdHJ1Y3QgYSBwYXJ0aWFsIGxlYWRpbmcgaW5saW5lIGl0ZW0uCi0gICAgICAgIG1f
cGFydGlhbExlYWRpbmdUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPihtX2lubGlu
ZUl0ZW1zW2N1cnJlbnRJbmxpbmVJdGVtSW5kZXhdKS5yaWdodChwYXJ0aWFsTGVhZGluZ0NvbnRl
bnRMZW5ndGgpOwotICAgICAgICBhdXRvIGl0ZW1XaWR0aCA9IGxlYWRpbmdMb2dpY2FsV2lkdGgg
PyAqc3RkOjpleGNoYW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6Om51bGxvcHQpIDogaW5s
aW5lSXRlbVdpZHRoKCptX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0sIGN1cnJlbnRMb2dpY2FsUmln
aHQpOwotICAgICAgICBsaW5lQ2FuZGlkYXRlLmlubGluZUNvbnRlbnQuYXBwZW5kSW5saW5lSXRl
bSgqbV9wYXJ0aWFsTGVhZGluZ1RleHRJdGVtLCBpdGVtV2lkdGgpOwotICAgICAgICBjdXJyZW50
TG9naWNhbFJpZ2h0ICs9IGl0ZW1XaWR0aDsKLSAgICAgICAgKytjdXJyZW50SW5saW5lSXRlbUlu
ZGV4OwotICAgIH0KLQotICAgIGZvciAoYXV0byBpbmRleCA9IGN1cnJlbnRJbmxpbmVJdGVtSW5k
ZXg7IGluZGV4IDwgc29mdFdyYXBPcHBvcnR1bml0eUluZGV4OyArK2luZGV4KSB7Ci0gICAgICAg
IGF1dG8mIGlubGluZUl0ZW0gPSBtX2lubGluZUl0ZW1zW2luZGV4XTsKLSAgICAgICAgaWYgKGlu
bGluZUl0ZW0uaXNGbG9hdCgpKSB7Ci0gICAgICAgICAgICBsaW5lQ2FuZGlkYXRlLmZsb2F0SXRl
bSA9ICZpbmxpbmVJdGVtOwotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNvZnQgd3JhcCBvcHBv
cnR1bml0eSwgbXVzdCBiZSB0aGUgb25seSBpdGVtIGluIHRoZSBsaXN0LgotICAgICAgICAgICAg
QVNTRVJUKGN1cnJlbnRJbmxpbmVJdGVtSW5kZXggKyAxID09IHNvZnRXcmFwT3Bwb3J0dW5pdHlJ
bmRleCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5s
aW5lSXRlbS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxp
bmVJdGVtLmlzSW5saW5lQm94RW5kKCkgfHwgaW5saW5lSXRlbS5pc0JveCgpKSB7Ci0gICAgICAg
ICAgICBBU1NFUlQoIWxlYWRpbmdMb2dpY2FsV2lkdGggfHwgaW5saW5lSXRlbS5pc1RleHQoKSk7
Ci0gICAgICAgICAgICBhdXRvIGxvZ2ljYWxXaWR0aCA9IGxlYWRpbmdMb2dpY2FsV2lkdGggPyAq
c3RkOjpleGNoYW5nZShsZWFkaW5nTG9naWNhbFdpZHRoLCBXVEY6Om51bGxvcHQpIDogaW5saW5l
SXRlbVdpZHRoKGlubGluZUl0ZW0sIGN1cnJlbnRMb2dpY2FsUmlnaHQpOwotICAgICAgICAgICAg
bGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmFwcGVuZElubGluZUl0ZW0oaW5saW5lSXRlbSwg
bG9naWNhbFdpZHRoKTsKLSAgICAgICAgICAgIGN1cnJlbnRMb2dpY2FsUmlnaHQgKz0gbG9naWNh
bFdpZHRoOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlu
bGluZUl0ZW0uaXNMaW5lQnJlYWsoKSB8fCBpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5p
dHkoKSkgewotICAgICAgICAgICAgLy8gU2luY2UgYm90aCA8YnI+IGFuZCA8d2JyPiBhcmUgZXhw
bGljaXQgd29yZCBicmVhayBvcHBvcnR1bml0aWVzIHRoZXkgaGF2ZSB0byBiZSB0cmFpbGluZyBp
dGVtcyBpbiB0aGlzIGNhbmRpZGF0ZSBydW4gbGlzdCB1bmxlc3MgdGhleSBhcmUgZW1iZWRkZWQg
aW4gaW5saW5lIGJveGVzLgotICAgICAgICAgICAgLy8gZS5nLiA8c3Bhbj48d2JyPjwvc3Bhbj4K
LSNpZiBBU1NFUlRfRU5BQkxFRAotICAgICAgICAgICAgZm9yIChhdXRvIGkgPSBpbmRleCArIDE7
IGkgPCBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXg7ICsraSkKLSAgICAgICAgICAgICAgICBBU1NF
UlQobV9pbmxpbmVJdGVtc1tpXS5pc0lubGluZUJveEVuZCgpKTsKLSNlbmRpZgotICAgICAgICAg
ICAgaW5saW5lSXRlbS5pc0xpbmVCcmVhaygpID8gbGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50
LmFwcGVuZFRyYWlsaW5nTGluZUJyZWFrKGlubGluZUl0ZW0pIDogbGluZUNhbmRpZGF0ZS5pbmxp
bmVDb250ZW50LmFwcGVuZHRyYWlsaW5nV29yZEJyZWFrT3Bwb3J0dW5pdHkoaW5saW5lSXRlbSk7
Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKLSAgICB9Ci0gICAgYXV0byBpbmxpbmVDb250ZW50RW5kc0luU29mdFdyYXBPcHBv
cnR1bml0eSA9IFsmXSB7Ci0gICAgICAgIGlmICghc29mdFdyYXBPcHBvcnR1bml0eUluZGV4IHx8
IHNvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCA9PSBsYXlvdXRSYW5nZS5lbmQpIHsKLSAgICAgICAg
ICAgIC8vIFRoaXMgY2FuZGlkYXRlIGlubGluZSBjb250ZW50IGVuZHMgYmVjYXVzZSB0aGUgZW50
aXJlIGNvbnRlbnQgZW5kcyBhbmQgbm90IGJlY2F1c2UgdGhlcmUncyBhIHNvZnQgd3JhcCBvcHBv
cnR1bml0eS4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBp
ZiAobV9pbmxpbmVJdGVtc1tzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXggLSAxXS5pc0Zsb2F0KCkp
IHsKLSAgICAgICAgICAgIC8vIFdoaWxlIHdlIHN0b3AgYXQgZmxvYXRzLCB0aGV5IGFyZSBub3Qg
Y29uc2lkZXJlZCByZWFsIHNvZnQgd3JhcCBvcHBvcnR1bml0aWVzLiAKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3Jn
L1RSL2Nzcy10ZXh0LTMvI2xpbmUtYnJlYWstZGV0YWlscwotICAgICAgICBhdXRvJiB0cmFpbGlu
Z0lubGluZUl0ZW0gPSBtX2lubGluZUl0ZW1zW3NvZnRXcmFwT3Bwb3J0dW5pdHlJbmRleCAtIDFd
OwotICAgICAgICBpZiAodHJhaWxpbmdJbmxpbmVJdGVtLmlzQm94KCkgfHwgdHJhaWxpbmdJbmxp
bmVJdGVtLmlzTGluZUJyZWFrKCkgfHwgdHJhaWxpbmdJbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bw
b3J0dW5pdHkoKSB8fCB0cmFpbGluZ0lubGluZUl0ZW0uaXNJbmxpbmVCb3hFbmQoKSkgewotICAg
ICAgICAgICAgLy8gRm9yIFdlYi1jb21wYXRpYmlsaXR5IHRoZXJlIGlzIGEgc29mdCB3cmFwIG9w
cG9ydHVuaXR5IGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCByZXBsYWNlZCBlbGVtZW50IG9yIG90aGVy
IGF0b21pYyBpbmxpbmUuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAg
ICAgICBpZiAodHJhaWxpbmdJbmxpbmVJdGVtLmlzVGV4dCgpKSB7Ci0gICAgICAgICAgICBhdXRv
JiBpbmxpbmVUZXh0SXRlbSA9IGRvd25jYXN0PElubGluZVRleHRJdGVtPih0cmFpbGluZ0lubGlu
ZUl0ZW0pOwotICAgICAgICAgICAgaWYgKGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpKQot
ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgLy8gTm93IGluIGNhc2Ug
b2Ygbm9uLXdoaXRlc3BhY2UgdHJhaWxpbmcgY29udGVudCwgd2UgbmVlZCB0byBjaGVjayBpZiB0
aGUgYWN0dWFsIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBiZWxvbmdzIHRvIHRoZSBuZXh0IHNldC4K
LSAgICAgICAgICAgIC8vIGUuZy4gInRoaXNfaXNfdGhlX3RyYWlsaW5nX3J1bjxzcGFuPiA8LWJ1
dF90aGlzX3NwYWNlX2hlcmVfaXNfdGhlX3NvZnRfd3JhcF9vcHBvcnR1bml0eSIKLSAgICAgICAg
ICAgIC8vIFdoZW4gdGhlcmUncyBhbiBpbmxpbmUgYm94IHN0YXJ0KDxzcGFuPikvZW5kKDwvc3Bh
bj4pIGJldHdlZW4gdGhlIHRyYWlsaW5nIGFuZCB0aGUgKG5leHQpbGVhZGluZyBydW4sIHdoaWxl
IHdlIGJyZWFrIGJlZm9yZSB0aGUgaW5saW5lIGJveCBzdGFydCAoPHNwYW4+KQotICAgICAgICAg
ICAgLy8gdGhlIGFjdHVhbCBzb2Z0IHdyYXAgcG9zaXRpb24gaXMgYWZ0ZXIgdGhlIGlubGluZSBi
b3ggc3RhcnQgKDxzcGFuPikgYnV0IGluIHRlcm1zIG9mIGxpbmUgYnJlYWtpbmcgY29udGludWl0
eSB0aGUgaW5saW5lIGJveCBzdGFydCAoPHNwYW4+KSBhbmQgdGhlIHdoaXRlc3BhY2UgcnVuIGJl
bG9uZyB0b2dldGhlci4KLSAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKGxheW91dFJhbmdlLmVu
ZCA8PSBtX2lubGluZUl0ZW1zLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaW5kZXgg
PSBzb2Z0V3JhcE9wcG9ydHVuaXR5SW5kZXg7IGluZGV4IDwgbGF5b3V0UmFuZ2UuZW5kOyArK2lu
ZGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1faW5saW5lSXRlbXNbaW5kZXhdLmlzSW5saW5l
Qm94U3RhcnQoKSB8fCBtX2lubGluZUl0ZW1zW2luZGV4XS5pc0lubGluZUJveEVuZCgpKQotICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAvLyBGSVhNRTogQ2hl
Y2sgaWYgW25vbi13aGl0ZXNwYWNlXVtpbmxpbmUtYm94XVtuby13aGl0ZXNwYWNlXSBjb250ZW50
IGhhcyBydWxlcyBhYm91dCBpdC4KLSAgICAgICAgICAgICAgICAvLyBGb3Igbm93IGxldCdzIHNh
eSB0aGUgc29mdCB3cmFwIHBvc2l0aW9uIGJlbG9uZ3MgdG8gdGhlIG5leHQgc2V0IG9mIHJ1bnMg
d2hlbiBbbm9uLXdoaXRlc3BhY2VdW2lubGluZS1ib3hdW3doaXRlc3BhY2VdLCBbbm9uLXdoaXRl
c3BhY2VdW2lubGluZS1ib3hdW2JveF0gZXRjLgotICAgICAgICAgICAgICAgIHJldHVybiBtX2lu
bGluZUl0ZW1zW2luZGV4XS5pc1RleHQoKSAmJiAhZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KG1f
aW5saW5lSXRlbXNbaW5kZXhdKS5pc1doaXRlc3BhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9OwotICAgIGxpbmVDYW5kaWRhdGUuaW5s
aW5lQ29udGVudC5zZXRIYXNUcmFpbGluZ1NvZnRXcmFwT3Bwb3J0dW5pdHkoaW5saW5lQ29udGVu
dEVuZHNJblNvZnRXcmFwT3Bwb3J0dW5pdHkoKSk7Ci19Ci0KLXNpemVfdCBMaW5lQnVpbGRlcjo6
bmV4dFdyYXBPcHBvcnR1bml0eShzaXplX3Qgc3RhcnRJbmRleCwgY29uc3QgTGluZUJ1aWxkZXI6
OklubGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFuZ2UpIGNvbnN0Ci17Ci0gICAgLy8gMS4gRmluZCB0
aGUgc3RhcnQgY2FuZGlkYXRlIGJ5IHNraXBwaW5nIGxlYWRpbmcgbm9uLWNvbnRlbnQgaXRlbXMg
ZS5nICI8c3Bhbj48c3Bhbj5zdGFydCIuIE9wcG9ydHVuaXR5IGlzIGFmdGVyICI8c3Bhbj48c3Bh
bj4iLgotICAgIC8vIDIuIEZpbmQgdGhlIGVuZCBjYW5kaWRhdGUgYnkgc2tpcHBpbmcgbm9uLWNv
bnRlbnQgaXRlbXMgaW5iZXR3ZWVuIGUuZy4gIjxzcGFuPjxzcGFuPnN0YXJ0PC9zcGFuPmVuZCIu
IE9wcG9ydHVuaXR5IGlzIGFmdGVyICI8L3NwYW4+Ii4KLSAgICAvLyAzLiBDaGVjayBpZiB0aGVy
ZSdzIGEgc29mdCB3cmFwIG9wcG9ydHVuaXR5IGJldHdlZW4gdGhlIDIgY2FuZGlkYXRlIGlubGlu
ZSBpdGVtcyBhbmQgcmVwZWF0LgotICAgIC8vIDQuIEFueSBmb3JjZSBsaW5lIGJyZWFrL2V4cGxp
Y2l0IHdyYXAgY29udGVudCBpbmJldHdlZW4gaXMgY29uc2lkZXJlZCBhcyB3cmFwIG9wcG9ydHVu
aXR5LgotCi0gICAgLy8gW2V4LV1baW5saW5lIGJveCBzdGFydF1baW5saW5lIGJveCBlbmRdW2Zs
b2F0XVthbXBsZV0gKGV4LTxzcGFuPjwvc3Bhbj48ZGl2IHN0eWxlPSJmbG9hdDpsZWZ0Ij48L2Rp
dj5hbXBsZSkuIFdyYXAgaW5kZXggaXMgYXQgW2V4LV0uCi0gICAgLy8gW2V4XVtpbmxpbmUgYm94
IHN0YXJ0XVthbXAtXVtpbmxpbmUgYm94IHN0YXJ0XVtsZV0gKGV4PHNwYW4+YW1wLTxzcGFuPmFt
cGxlKS4gV3JhcCBpbmRleCBpcyBhdCBbYW1wLV0uCi0gICAgLy8gW2V4LV1baW5saW5lIGJveCBz
dGFydF1bbGluZSBicmVha11bYW1wbGVdIChleC08c3Bhbj48YnI+YW1wbGUpLiBXcmFwIGluZGV4
IGlzIGFmdGVyIFticl0uCi0gICAgYXV0byBwcmV2aW91c0lubGluZUl0ZW1JbmRleCA9IE9wdGlv
bmFsPHNpemVfdD4geyB9OwotICAgIGZvciAoYXV0byBpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4
IDwgbGF5b3V0UmFuZ2UuZW5kOyArK2luZGV4KSB7Ci0gICAgICAgIGF1dG8mIGlubGluZUl0ZW0g
PSBtX2lubGluZUl0ZW1zW2luZGV4XTsKLSAgICAgICAgaWYgKGlubGluZUl0ZW0uaXNMaW5lQnJl
YWsoKSB8fCBpbmxpbmVJdGVtLmlzV29yZEJyZWFrT3Bwb3J0dW5pdHkoKSkgewotICAgICAgICAg
ICAgLy8gV2UgYWx3YXlzIHN0b3AgYXQgZXhwbGljaXQgd3JhcHBpbmcgb3Bwb3J0dW5pdGllcyBl
LmcuIDxicj4uIEhvd2V2ZXIgdGhlIHdyYXAgcG9zaXRpb24gbWF5IGJlIGF0IGxhdGVyIHBvc2l0
aW9uLgotICAgICAgICAgICAgLy8gZS5nLiA8c3Bhbj48c3Bhbj48YnI+PC9zcGFuPjwvc3Bhbj4g
PC0gd3JhcCBwb3NpdGlvbiBpcyBhZnRlciB0aGUgc2Vjb25kIDwvc3Bhbj4KLSAgICAgICAgICAg
IC8vIGJ1dCBpbiBjYXNlIG9mIDxzcGFuPjxicj48c3Bhbj48L3NwYW4+PC9zcGFuPiA8LSB3cmFw
IHBvc2l0aW9uIGlzIHJpZ2h0IGFmdGVyIDxicj4uCi0gICAgICAgICAgICBmb3IgKCsraW5kZXg7
IGluZGV4IDwgbGF5b3V0UmFuZ2UuZW5kICYmIG1faW5saW5lSXRlbXNbaW5kZXhdLmlzSW5saW5l
Qm94RW5kKCk7ICsraW5kZXgpIHsgfQotICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAg
ICB9Ci0gICAgICAgIGlmIChpbmxpbmVJdGVtLmlzSW5saW5lQm94U3RhcnQoKSB8fCBpbmxpbmVJ
dGVtLmlzSW5saW5lQm94RW5kKCkpIHsKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gc2VlIHdoYXQg
Y29tZXMgbmV4dCB0byBkZWNpZGUuCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQot
ICAgICAgICBBU1NFUlQoaW5saW5lSXRlbS5pc1RleHQoKSB8fCBpbmxpbmVJdGVtLmlzQm94KCkg
fHwgaW5saW5lSXRlbS5pc0Zsb2F0KCkpOwotICAgICAgICBpZiAoIXByZXZpb3VzSW5saW5lSXRl
bUluZGV4KSB7Ci0gICAgICAgICAgICBwcmV2aW91c0lubGluZUl0ZW1JbmRleCA9IGluZGV4Owot
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQXQgdGhpcyBwb2lu
dCBwcmV2aW91cyBhbmQgY3VycmVudCBpdGVtcyBhcmUgbm90IG5lY2Vzc2FyaWx5IGFkamFjZW50
IGl0ZW1zIGUuZyAicHJldmlvdXM8c3Bhbj5jdXJyZW50PC9zcGFuPiIKLSAgICAgICAgYXV0byYg
cHJldmlvdXNJdGVtID0gbV9pbmxpbmVJdGVtc1sqcHJldmlvdXNJbmxpbmVJdGVtSW5kZXhdOwot
ICAgICAgICBhdXRvJiBjdXJyZW50SXRlbSA9IG1faW5saW5lSXRlbXNbaW5kZXhdOwotICAgICAg
ICBpZiAoaXNBdFNvZnRXcmFwT3Bwb3J0dW5pdHkobV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dCwg
cHJldmlvdXNJdGVtLCBjdXJyZW50SXRlbSkpIHsKLSAgICAgICAgICAgIGlmICgqcHJldmlvdXNJ
bmxpbmVJdGVtSW5kZXggKyAxID09IGluZGV4ICYmICghcHJldmlvdXNJdGVtLmlzVGV4dCgpIHx8
ICFjdXJyZW50SXRlbS5pc1RleHQoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGtu
b3cgdGhlIGV4YWN0IHNvZnQgd3JhcCBvcHBvcnR1bml0eSBpbmRleCB3aGVuIHRoZSBwcmV2aW91
cyBhbmQgY3VycmVudCBpdGVtcyBhcmUgbmV4dCB0byBlYWNoIG90aGVyLgotICAgICAgICAgICAg
ICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRoZXJlJ3Mg
YSBzb2Z0IHdyYXAgb3Bwb3J0dW5pdHkgYmV0d2VlbiAncHJldmlvdXNJbmxpbmVJdGVtSW5kZXgn
IGFuZCAnaW5kZXgnLgotICAgICAgICAgICAgLy8gTm93IGZvcndhcmQtZmluZCBmcm9tIHRoZSBz
dGFydCBwb3NpdGlvbiB0byBzZWUgd2hlcmUgd2UgY2FuIGFjdHVhbGx5IHdyYXAuCi0gICAgICAg
ICAgICAvLyBbZXgtXVthbXBsZV0gdnMuIFtleC1dW2lubGluZSBib3ggc3RhcnRdW2lubGluZSBi
b3ggZW5kXVthbXBsZV0KLSAgICAgICAgICAgIC8vIHdoZXJlIFtleC1dIGlzIHN0YXJ0Q29udGVu
dCBhbmQgW2FtcGxlXSBpcyB0aGUgbmV4dENvbnRlbnQuCi0gICAgICAgICAgICBmb3IgKGF1dG8g
Y2FuZGlkYXRlSW5kZXggPSAqcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggKyAxOyBjYW5kaWRhdGVJ
bmRleCA8IGluZGV4OyArK2NhbmRpZGF0ZUluZGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1f
aW5saW5lSXRlbXNbY2FuZGlkYXRlSW5kZXhdLmlzSW5saW5lQm94U3RhcnQoKSkgewotICAgICAg
ICAgICAgICAgICAgICAvLyBpbmxpbmUgY29udGVudCBhbmQgW2lubGluZSBib3ggc3RhcnRdIGFu
ZCBbaW5saW5lIGJveCBlbmRdIGZvcm0gdW5icmVha2FibGUgY29udGVudC4KLSAgICAgICAgICAg
ICAgICAgICAgLy8gZXgtPHNwYW4+PC9zcGFuPmFtcGxlICA6IHdyYXAgb3Bwb3J0dW5pdHkgaXMg
YWZ0ZXIgImV4LSIuCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4LTwvc3Bhbj48L3NwYW4+YW1w
bGUgOiB3cmFwIG9wcG9ydHVuaXR5IGlzIGFmdGVyICJleC08L3NwYW4+PC9zcGFuPiIuCi0gICAg
ICAgICAgICAgICAgICAgIC8vIGV4LTwvc3Bhbj48c3Bhbj5hbXBsZTwvc3Bhbj4gOiB3cmFwIG9w
cG9ydHVuaXR5IGlzIGFmdGVyICJleC08L3NwYW4+Ii4KLSAgICAgICAgICAgICAgICAgICAgLy8g
ZXgtPHNwYW4+PHNwYW4+YW1wbGU8L3NwYW4+PC9zcGFuPiA6IHdyYXAgb3Bwb3J0dW5pdHkgaXMg
YWZ0ZXIgImV4LSIuCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVJbmRleDsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW5k
ZXg7Ci0gICAgICAgIH0KLSAgICAgICAgcHJldmlvdXNJbmxpbmVJdGVtSW5kZXggPSBpbmRleDsK
LSAgICB9Ci0gICAgcmV0dXJuIGxheW91dFJhbmdlLmVuZDsKLX0KLQotdm9pZCBMaW5lQnVpbGRl
cjo6aGFuZGxlRmxvYXRDb250ZW50KGNvbnN0IElubGluZUl0ZW0mIGZsb2F0SXRlbSkKLXsKLSAg
ICBhdXRvJiBmbG9hdEJveCA9IGZsb2F0SXRlbS5sYXlvdXRCb3goKTsKLSAgICBtX2Zsb2F0cy5h
cHBlbmQoJmZsb2F0Qm94KTsKLQotICAgIGF1dG8qIGZsb2F0aW5nU3RhdGUgPSB0aGlzLT5mbG9h
dGluZ1N0YXRlKCk7Ci0gICAgaWYgKCFmbG9hdGluZ1N0YXRlKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBBU1NFUlQoZm9ybWF0dGluZ1N0YXRlKCkpOwotICAgIGF1dG8mIGJveEdlb21ldHJ5ID0g
Zm9ybWF0dGluZ1N0YXRlKCktPmJveEdlb21ldHJ5KGZsb2F0Qm94KTsKLSAgICAvLyBTZXQgc3Rh
dGljIHBvc2l0aW9uIGZpcnN0LgotICAgIGJveEdlb21ldHJ5LnNldExvZ2ljYWxUb3BMZWZ0KExh
eW91dFBvaW50IHsgbV9saW5lTG9naWNhbFJlY3QudG9wTGVmdCgpIH0pOwotICAgIC8vIEZsb2F0
IGl0LgotICAgIEFTU0VSVChtX3Jvb3RIb3Jpem9udGFsQ29uc3RyYWludHMpOwotICAgIGF1dG8g
ZmxvYXRpbmdDb250ZXh0ID0gRmxvYXRpbmdDb250ZXh0IHsgZm9ybWF0dGluZ0NvbnRleHQoKSwg
KmZsb2F0aW5nU3RhdGUgfTsKLSAgICBhdXRvIGZsb2F0aW5nUG9zaXRpb24gPSBmbG9hdGluZ0Nv
bnRleHQucG9zaXRpb25Gb3JGbG9hdChmbG9hdEJveCwgKm1fcm9vdEhvcml6b250YWxDb25zdHJh
aW50cyk7Ci0gICAgYm94R2VvbWV0cnkuc2V0TG9naWNhbFRvcExlZnQoZmxvYXRpbmdQb3NpdGlv
bik7Ci0gICAgZmxvYXRpbmdTdGF0ZS0+YXBwZW5kKGZsb2F0aW5nQ29udGV4dC50b0Zsb2F0SXRl
bShmbG9hdEJveCkpOwotICAgIC8vIENoZWNrIGlmIHRoaXMgZmxvYXQgc2hyaW5rcyB0aGUgbGlu
ZSAodGhleSBkb24ndCBnZXQgcG9zaXRpb25lZCBoaWdoZXIgdGhhbiB0aGUgbGluZSkuCi0gICAg
aWYgKGZsb2F0aW5nUG9zaXRpb24ueSgpID4gbV9saW5lTG9naWNhbFJlY3QuYm90dG9tKCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIG1fY29udGVudElzQ29uc3RyYWluZWRCeUZsb2F0ID0gdHJ1
ZTsKLSAgICBhdXRvIGZsb2F0Qm94V2lkdGggPSBpbmxpbmVJdGVtV2lkdGgoZmxvYXRJdGVtLCB7
IH0pOwotICAgIGlmIChmbG9hdEJveC5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAg
ICAgbV9saW5lTG9naWNhbFJlY3Quc2V0TGVmdChtX2xpbmVMb2dpY2FsUmVjdC5sZWZ0KCkgKyBm
bG9hdEJveFdpZHRoKTsgICAgCi0gICAgbV9saW5lTG9naWNhbFJlY3QuZXhwYW5kSG9yaXpvbnRh
bGx5KC1mbG9hdEJveFdpZHRoKTsKLX0KLQotTGluZUJ1aWxkZXI6OlJlc3VsdCBMaW5lQnVpbGRl
cjo6aGFuZGxlSW5saW5lQ29udGVudChJbmxpbmVDb250ZW50QnJlYWtlciYgaW5saW5lQ29udGVu
dEJyZWFrZXIsIGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFuZ2UsIGNvbnN0IExpbmVD
YW5kaWRhdGUmIGxpbmVDYW5kaWRhdGUpCi17Ci0gICAgYXV0byYgaW5saW5lQ29udGVudCA9IGxp
bmVDYW5kaWRhdGUuaW5saW5lQ29udGVudDsKLSAgICBpZiAoaW5saW5lQ29udGVudC5jb250aW51
b3VzQ29udGVudCgpLnJ1bnMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgQVNTRVJUKGlubGluZUNv
bnRlbnQudHJhaWxpbmdMaW5lQnJlYWsoKSB8fCBpbmxpbmVDb250ZW50LnRyYWlsaW5nV29yZEJy
ZWFrT3Bwb3J0dW5pdHkoKSk7Ci0gICAgICAgIHJldHVybiB7IGlubGluZUNvbnRlbnQudHJhaWxp
bmdMaW5lQnJlYWsoKSA/IElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzIDog
SW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpObyB9OwotICAgIH0KLSAgICBhdXRv
IHNob3VsZERpc2FibGVIeXBoZW5hdGlvbiA9IFsmXSB7Ci0gICAgICAgIGF1dG8mIHN0eWxlID0g
cm9vdCgpLnN0eWxlKCk7Ci0gICAgICAgIHVuc2lnbmVkIGxpbWl0TGluZXMgPSBzdHlsZS5oeXBo
ZW5hdGlvbkxpbWl0TGluZXMoKSA9PSBSZW5kZXJTdHlsZTo6aW5pdGlhbEh5cGhlbmF0aW9uTGlt
aXRMaW5lcygpID8gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpIDogc3R5bGUu
aHlwaGVuYXRpb25MaW1pdExpbmVzKCk7Ci0gICAgICAgIHJldHVybiBtX3N1Y2Nlc3NpdmVIeXBo
ZW5hdGVkTGluZUNvdW50ID49IGxpbWl0TGluZXM7Ci0gICAgfTsKLSAgICBpZiAoc2hvdWxkRGlz
YWJsZUh5cGhlbmF0aW9uKCkpCi0gICAgICAgIGlubGluZUNvbnRlbnRCcmVha2VyLnNldEh5cGhl
bmF0aW9uRGlzYWJsZWQoKTsKLQotICAgIGF1dG8mIGNvbnRpbnVvdXNJbmxpbmVDb250ZW50ID0g
bGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50LmNvbnRpbnVvdXNDb250ZW50KCk7Ci0gICAgYXV0
byBsaW5lTG9naWNhbFJlY3RGb3JDYW5kaWRhdGVDb250ZW50ID0gWyZdIHsKLSAgICAgICAgLy8g
Q2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBjb250ZW50IHdvdWxkIHN0cmV0Y2ggdGhlIGxpbmUgYW5k
IHdoZXRoZXIgYWRkaXRpb25hbCBmbG9hdHMgYXJlIGdldHRpbmcgaW4gdGhlIHdheS4KLSAgICAg
ICAgaWYgKCFmbG9hdGluZ1N0YXRlKCkgfHwgIWlubGluZUNvbnRlbnQuaGFzSW5saW5lTGV2ZWxC
b3goKSkKLSAgICAgICAgICAgIHJldHVybiBtX2xpbmVMb2dpY2FsUmVjdDsKLSAgICAgICAgYXV0
byBtYXhpbXVtTGluZUxvZ2ljYWxIZWlnaHQgPSBtX2xpbmVMb2dpY2FsUmVjdC5oZWlnaHQoKTsK
LSAgICAgICAgZm9yIChhdXRvJiBydW4gOiBjb250aW51b3VzSW5saW5lQ29udGVudC5ydW5zKCkp
IHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3IgaW5saW5lIGJveGVzIHRv
by4KLSAgICAgICAgICAgIGlmICghcnVuLmlubGluZUl0ZW0uaXNCb3goKSkKLSAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIG1heGltdW1MaW5lTG9naWNhbEhlaWdodCA9IHN0
ZDo6bWF4KG1heGltdW1MaW5lTG9naWNhbEhlaWdodCwgSW5saW5lTGF5b3V0VW5pdCB7IGZvcm1h
dHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3gocnVuLmlubGluZUl0ZW0ubGF5b3V0Qm94KCkp
Lm1hcmdpbkJveEhlaWdodCgpIH0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXhpbXVtTGlu
ZUxvZ2ljYWxIZWlnaHQgPT0gbV9saW5lTG9naWNhbFJlY3QuaGVpZ2h0KCkpCi0gICAgICAgICAg
ICByZXR1cm4gbV9saW5lTG9naWNhbFJlY3Q7Ci0gICAgICAgIGF1dG8gYWRqdXN0ZWRMaW5lTG9n
aWNhbFJlY3QgPSBJbmxpbmVSZWN0IHsgbV9saW5lTG9naWNhbFJlY3QudG9wKCksIG1fbGluZUxv
Z2ljYWxSZWN0LmxlZnQoKSwgbV9saW5lTG9naWNhbFJlY3Qud2lkdGgoKSwgbWF4aW11bUxpbmVM
b2dpY2FsSGVpZ2h0IH07Ci0gICAgICAgIGlmIChhdXRvIGhvcml6b250YWxDb25zdHJhaW50cyA9
IGZsb2F0Q29uc3RyYWludHMoYWRqdXN0ZWRMaW5lTG9naWNhbFJlY3QpKSB7Ci0gICAgICAgICAg
ICBhZGp1c3RlZExpbmVMb2dpY2FsUmVjdC5zZXRMZWZ0KGhvcml6b250YWxDb25zdHJhaW50cy0+
bG9naWNhbExlZnQpOwotICAgICAgICAgICAgYWRqdXN0ZWRMaW5lTG9naWNhbFJlY3Quc2V0V2lk
dGgoaG9yaXpvbnRhbENvbnN0cmFpbnRzLT5sb2dpY2FsV2lkdGgpOwotICAgICAgICB9Ci0gICAg
ICAgIHJldHVybiBhZGp1c3RlZExpbmVMb2dpY2FsUmVjdDsKLSAgICB9KCk7Ci0gICAgYXV0byBh
dmFpbGFibGVXaWR0aCA9IFsmXSB7Ci0gICAgICAgIGF1dG8gYXZhaWxhYmxlV2lkdGhGb3JDb250
ZW50ID0gbGluZUxvZ2ljYWxSZWN0Rm9yQ2FuZGlkYXRlQ29udGVudC53aWR0aCgpIC0gbV9saW5l
LmNvbnRlbnRMb2dpY2FsUmlnaHQoKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6aXNuYW4oYXZhaWxh
YmxlV2lkdGhGb3JDb250ZW50KSA/IG1heElubGluZUxheW91dFVuaXQoKSA6IGF2YWlsYWJsZVdp
ZHRoRm9yQ29udGVudDsKLSAgICB9KCk7Ci0gICAgLy8gV2hpbGUgdGhlIGZsb2F0cyBhcmUgbm90
IGNvbnNpZGVyZWQgdG8gYmUgb24gdGhlIGxpbmUsIHRoZXkgbWFrZSB0aGUgbGluZSBjb250ZW50
ZnVsIGZvciBsaW5lIGJyZWFraW5nLgotICAgIGF1dG8gbGluZUhhc0NvbnRlbnQgPSAhbV9saW5l
LnJ1bnMoKS5pc0VtcHR5KCkgfHwgbV9jb250ZW50SXNDb25zdHJhaW5lZEJ5RmxvYXQ7Ci0gICAg
YXV0byBsaW5lU3RhdHVzID0gSW5saW5lQ29udGVudEJyZWFrZXI6OkxpbmVTdGF0dXMgeyBtX2xp
bmUuY29udGVudExvZ2ljYWxSaWdodCgpLCBhdmFpbGFibGVXaWR0aCwgbV9saW5lLnRyaW1tYWJs
ZVRyYWlsaW5nV2lkdGgoKSwgbV9saW5lLnRyYWlsaW5nU29mdEh5cGhlbldpZHRoKCksIG1fbGlu
ZS5pc1RyYWlsaW5nUnVuRnVsbHlUcmltbWFibGUoKSwgbGluZUhhc0NvbnRlbnQsICFtX3dyYXBP
cHBvcnR1bml0eUxpc3QuaXNFbXB0eSgpIH07Ci0gICAgYXV0byByZXN1bHQgPSBpbmxpbmVDb250
ZW50QnJlYWtlci5wcm9jZXNzSW5saW5lQ29udGVudChjb250aW51b3VzSW5saW5lQ29udGVudCwg
bGluZVN0YXR1cyk7Ci0gICAgYXV0byYgY2FuZGlkYXRlUnVucyA9IGNvbnRpbnVvdXNJbmxpbmVD
b250ZW50LnJ1bnMoKTsKLSAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVDb250ZW50QnJl
YWtlcjo6UmVzdWx0OjpBY3Rpb246OktlZXApIHsKLSAgICAgICAgLy8gVGhpcyBjb250aW51b3Vz
IGNvbnRlbnQgY2FuIGJlIGZ1bGx5IHBsYWNlZCBvbiB0aGUgY3VycmVudCBsaW5lLgotICAgICAg
ICBtX2xpbmVMb2dpY2FsUmVjdCA9IGxpbmVMb2dpY2FsUmVjdEZvckNhbmRpZGF0ZUNvbnRlbnQ7
Ci0gICAgICAgIGZvciAoYXV0byYgcnVuIDogY2FuZGlkYXRlUnVucykKLSAgICAgICAgICAgIG1f
bGluZS5hcHBlbmQocnVuLmlubGluZUl0ZW0sIHJ1bi5sb2dpY2FsV2lkdGgpOwotICAgICAgICBp
ZiAobGluZUNhbmRpZGF0ZS5pbmxpbmVDb250ZW50Lmhhc1RyYWlsaW5nU29mdFdyYXBPcHBvcnR1
bml0eSgpKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgYWxsb3dlZCB0byB3cmFw
IGF0IHRoaXMgcG9zaXRpb24uCi0gICAgICAgICAgICBhdXRvJiB0cmFpbGluZ0l0ZW0gPSBjYW5k
aWRhdGVSdW5zLmxhc3QoKS5pbmxpbmVJdGVtOwotICAgICAgICAgICAgLy8gRklYTUU6IFRoZXJl
IG11c3QgYmUgYSB3YXkgdG8gZGVjaWRlIGlmIHRoZSB0cmFpbGluZyBydW4gYWN0dWFsbHkgZW5k
ZWQgdXAgb24gdGhlIGxpbmUuCi0gICAgICAgICAgICAvLyBMZXQncyBqdXN0IGRlYWwgd2l0aCBj
b2xsYXBzZWQgbGVhZGluZyB3aGl0ZXNwYWNlIGZvciBub3cuCi0gICAgICAgICAgICBpZiAoIW1f
bGluZS5ydW5zKCkuaXNFbXB0eSgpICYmIElubGluZUNvbnRlbnRCcmVha2VyOjppc1dyYXBwaW5n
QWxsb3dlZCh0cmFpbGluZ0l0ZW0pKQotICAgICAgICAgICAgICAgIG1fd3JhcE9wcG9ydHVuaXR5
TGlzdC5hcHBlbmQoJnRyYWlsaW5nSXRlbSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHsg
cmVzdWx0LmlzRW5kT2ZMaW5lLCB7IGNhbmRpZGF0ZVJ1bnMuc2l6ZSgpLCBmYWxzZSB9IH07Ci0g
ICAgfQotCi0gICAgYXV0byBlbGlnaWJsZU92ZXJmbG93V2lkdGhBc0xlYWRpbmcgPSBbJl0gKCkg
LT4gT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gewotICAgICAgICAvLyBGSVhNRTogQWRkIHN1
cHBvcnQgZm9yIG90aGVyIHR5cGVzIG9mIGNvbnRpbnVvdXMgY29udGVudC4KLSAgICAgICAgQVNT
RVJUKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9u
OjpXcmFwIHx8IHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6
QWN0aW9uOjpCcmVhayk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGVSdW5zLnNpemUoKSAhPSAxIHx8
ICFjYW5kaWRhdGVSdW5zLmZpcnN0KCkuaW5saW5lSXRlbS5pc1RleHQoKSkKLSAgICAgICAgICAg
IHJldHVybiB7IH07Ci0gICAgICAgIGF1dG8mIGlubGluZVRleHRJdGVtID0gZG93bmNhc3Q8SW5s
aW5lVGV4dEl0ZW0+KGNhbmRpZGF0ZVJ1bnMuZmlyc3QoKS5pbmxpbmVJdGVtKTsKLSAgICAgICAg
aWYgKGlubGluZVRleHRJdGVtLmlzV2hpdGVzcGFjZSgpKQotICAgICAgICAgICAgcmV0dXJuIHsg
fTsKLSAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJl
c3VsdDo6QWN0aW9uOjpXcmFwKQotICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVJ1bnMuZmly
c3QoKS5sb2dpY2FsV2lkdGg7Ci0gICAgICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNv
bnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFjdGlvbjo6QnJlYWsgJiYgcmVzdWx0LnBhcnRpYWxUcmFp
bGluZ0NvbnRlbnQtPnBhcnRpYWxSdW4pCi0gICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlUnVu
cy5maXJzdCgpLmxvZ2ljYWxXaWR0aCAtIHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50LT5w
YXJ0aWFsUnVuLT5sb2dpY2FsV2lkdGg7Ci0gICAgICAgIHJldHVybiB7IH07Ci0gICAgfTsKLQot
ICAgIGlmIChyZXN1bHQuYWN0aW9uID09IElubGluZUNvbnRlbnRCcmVha2VyOjpSZXN1bHQ6OkFj
dGlvbjo6V3JhcCkgewotICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09IElubGlu
ZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKLSAgICAgICAgLy8gVGhpcyBjb250
aW51b3VzIGNvbnRlbnQgY2FuJ3QgYmUgcGxhY2VkIG9uIHRoZSBjdXJyZW50IGxpbmUuIE5vdGhp
bmcgdG8gY29tbWl0IGF0IHRoaXMgdGltZS4KLSAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29udGVu
dEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgfSwgeyB9LCBlbGlnaWJsZU92ZXJmbG93V2lk
dGhBc0xlYWRpbmcoKSB9OwotICAgIH0KLSAgICBpZiAocmVzdWx0LmFjdGlvbiA9PSBJbmxpbmVD
b250ZW50QnJlYWtlcjo6UmVzdWx0OjpBY3Rpb246OldyYXBXaXRoSHlwaGVuKSB7Ci0gICAgICAg
IEFTU0VSVChyZXN1bHQuaXNFbmRPZkxpbmUgPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OklzRW5k
T2ZMaW5lOjpZZXMpOwotICAgICAgICAvLyBUaGlzIGNvbnRpbnVvdXMgY29udGVudCBjYW4ndCBi
ZSBwbGFjZWQgb24gdGhlIGN1cnJlbnQgbGluZSwgbm90aGluZyB0byBjb21taXQuCi0gICAgICAg
IC8vIEhvd2V2ZXIgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY3VycmVudCBsaW5lIGdh
aW5zIGEgdHJhaWxpbmcgaHlwaGVuLgotICAgICAgICBBU1NFUlQobV9saW5lLnRyYWlsaW5nU29m
dEh5cGhlbldpZHRoKCkpOwotICAgICAgICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBoZW4oKm1fbGlu
ZS50cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCgpKTsKLSAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29u
dGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMgfTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdC5h
Y3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xh
c3RXcmFwT3Bwb3J0dW5pdHkpIHsKLSAgICAgICAgQVNTRVJUKHJlc3VsdC5pc0VuZE9mTGluZSA9
PSBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olllcyk7Ci0gICAgICAgIC8vIE5v
dCBvbmx5IHRoaXMgY29udGVudCBjYW4ndCBiZSBwbGFjZWQgb24gdGhlIGN1cnJlbnQgbGluZSwg
YnV0IHdlIGV2ZW4gbmVlZCB0byByZXZlcnQgdGhlIGxpbmUgYmFjayB0byBhbiBlYXJsaWVyIHBv
c2l0aW9uLgotICAgICAgICBBU1NFUlQoIW1fd3JhcE9wcG9ydHVuaXR5TGlzdC5pc0VtcHR5KCkp
OwotICAgICAgICByZXR1cm4geyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Olll
cywgeyByZWJ1aWxkTGluZShsYXlvdXRSYW5nZSwgKm1fd3JhcE9wcG9ydHVuaXR5TGlzdC5sYXN0
KCkpLCB0cnVlIH0gfTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdC5hY3Rpb24gPT0gSW5saW5lQ29u
dGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpSZXZlcnRUb0xhc3ROb25PdmVyZmxvd2luZ1dy
YXBPcHBvcnR1bml0eSkgewotICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09IElu
bGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKLSAgICAgICAgQVNTRVJUKCFt
X3dyYXBPcHBvcnR1bml0eUxpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgcmV0dXJuIHsgSW5saW5l
Q29udGVudEJyZWFrZXI6OklzRW5kT2ZMaW5lOjpZZXMsIHsgcmVidWlsZExpbmVGb3JUcmFpbGlu
Z1NvZnRIeXBoZW4obGF5b3V0UmFuZ2UpLCB0cnVlIH0gfTsKLSAgICB9Ci0gICAgaWYgKHJlc3Vs
dC5hY3Rpb24gPT0gSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6QWN0aW9uOjpCcmVhaykg
ewotICAgICAgICBBU1NFUlQocmVzdWx0LmlzRW5kT2ZMaW5lID09IElubGluZUNvbnRlbnRCcmVh
a2VyOjpJc0VuZE9mTGluZTo6WWVzKTsKLSAgICAgICAgLy8gQ29tbWl0IHRoZSBjb21iaW5hdGlv
biBvZiBmdWxsIGFuZCBwYXJ0aWFsIGNvbnRlbnQgb24gdGhlIGN1cnJlbnQgbGluZS4KLSAgICAg
ICAgQVNTRVJUKHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50KTsKLSAgICAgICAgY29tbWl0
UGFydGlhbENvbnRlbnQoY2FuZGlkYXRlUnVucywgKnJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250
ZW50KTsKLSAgICAgICAgLy8gV2hlbiBicmVha2luZyBtdWx0aXBsZSBydW5zIDxzcGFuIHN0eWxl
PSJ3b3JkLWJyZWFrOiBicmVhay1hbGwiPnRleHQ8L3NwYW4+PHNwYW4+Y29udGVudDwvc3Bhbj4s
IHdlIG1pZ2h0IGVuZCB1cCBicmVha2luZyB0aGVtIGF0IHJ1biBib3VuZGFyeS4KLSAgICAgICAg
Ly8gSXQgc2ltcGx5IG1lYW5zIHdlIGRvbid0IHJlYWxseSBoYXZlIGEgcGFydGlhbCBydW4uIFBh
cnRpYWwgY29udGVudCB5ZXMsIGJ1dCBub3QgcGFydGlhbCBydW4uCi0gICAgICAgIGF1dG8gdHJh
aWxpbmdSdW5JbmRleCA9IHJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50LT50cmFpbGluZ1J1
bkluZGV4OwotICAgICAgICBhdXRvIGNvbW1pdHRlZElubGluZUl0ZW1Db3VudCA9IHRyYWlsaW5n
UnVuSW5kZXggKyAxOwotICAgICAgICBpZiAoIXJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250ZW50
LT5wYXJ0aWFsUnVuKQotICAgICAgICAgICAgcmV0dXJuIHsgSW5saW5lQ29udGVudEJyZWFrZXI6
OklzRW5kT2ZMaW5lOjpZZXMsIHsgY29tbWl0dGVkSW5saW5lSXRlbUNvdW50LCBmYWxzZSB9IH07
Ci0KLSAgICAgICAgYXV0byBwYXJ0aWFsUnVuID0gKnJlc3VsdC5wYXJ0aWFsVHJhaWxpbmdDb250
ZW50LT5wYXJ0aWFsUnVuOwotICAgICAgICBhdXRvJiB0cmFpbGluZ0lubGluZVRleHRJdGVtID0g
ZG93bmNhc3Q8SW5saW5lVGV4dEl0ZW0+KGNhbmRpZGF0ZVJ1bnNbdHJhaWxpbmdSdW5JbmRleF0u
aW5saW5lSXRlbSk7Ci0gICAgICAgIEFTU0VSVChwYXJ0aWFsUnVuLmxlbmd0aCA8IHRyYWlsaW5n
SW5saW5lVGV4dEl0ZW0ubGVuZ3RoKCkpOwotICAgICAgICBhdXRvIG92ZXJmbG93TGVuZ3RoID0g
dHJhaWxpbmdJbmxpbmVUZXh0SXRlbS5sZW5ndGgoKSAtIHBhcnRpYWxSdW4ubGVuZ3RoOwotICAg
ICAgICByZXR1cm4geyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6OlllcywgeyBj
b21taXR0ZWRJbmxpbmVJdGVtQ291bnQsIGZhbHNlIH0sIG92ZXJmbG93TGVuZ3RoLCBlbGlnaWJs
ZU92ZXJmbG93V2lkdGhBc0xlYWRpbmcoKSB9OwotICAgIH0KLSAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKLSAgICByZXR1cm4geyBJbmxpbmVDb250ZW50QnJlYWtlcjo6SXNFbmRPZkxpbmU6Ok5v
IH07Ci19Ci0KLXZvaWQgTGluZUJ1aWxkZXI6OmNvbW1pdFBhcnRpYWxDb250ZW50KGNvbnN0IElu
bGluZUNvbnRlbnRCcmVha2VyOjpDb250aW51b3VzQ29udGVudDo6UnVuTGlzdCYgcnVucywgY29u
c3QgSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6UGFydGlhbFRyYWlsaW5nQ29udGVudCYg
cGFydGlhbFRyYWlsaW5nQ29udGVudCkKLXsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGlu
ZGV4IDwgcnVucy5zaXplKCk7ICsraW5kZXgpIHsKLSAgICAgICAgYXV0byYgcnVuID0gcnVuc1tp
bmRleF07Ci0gICAgICAgIGlmIChwYXJ0aWFsVHJhaWxpbmdDb250ZW50LnRyYWlsaW5nUnVuSW5k
ZXggPT0gaW5kZXgpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgY29tbWl0IHBhcnRpYWwg
dHJhaWxpbmcgaXRlbS4KLSAgICAgICAgICAgIGlmIChhdXRvIHBhcnRpYWxSdW4gPSBwYXJ0aWFs
VHJhaWxpbmdDb250ZW50LnBhcnRpYWxSdW4pIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQocnVu
LmlubGluZUl0ZW0uaXNUZXh0KCkpOwotICAgICAgICAgICAgICAgIGF1dG8mIHRyYWlsaW5nSW5s
aW5lVGV4dEl0ZW0gPSBkb3duY2FzdDxJbmxpbmVUZXh0SXRlbT4ocnVuc1twYXJ0aWFsVHJhaWxp
bmdDb250ZW50LnRyYWlsaW5nUnVuSW5kZXhdLmlubGluZUl0ZW0pOwotICAgICAgICAgICAgICAg
IGF1dG8gcGFydGlhbFRyYWlsaW5nVGV4dEl0ZW0gPSB0cmFpbGluZ0lubGluZVRleHRJdGVtLmxl
ZnQocGFydGlhbFJ1bi0+bGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBtX2xpbmUuYXBwZW5kKHBh
cnRpYWxUcmFpbGluZ1RleHRJdGVtLCBwYXJ0aWFsUnVuLT5sb2dpY2FsV2lkdGgpOwotICAgICAg
ICAgICAgICAgIGlmIChhdXRvIGh5cGhlbldpZHRoID0gcGFydGlhbFJ1bi0+aHlwaGVuV2lkdGgp
Ci0gICAgICAgICAgICAgICAgICAgIG1fbGluZS5hZGRUcmFpbGluZ0h5cGhlbigqaHlwaGVuV2lk
dGgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IC8vIFRoZSBwYXJ0aWFsIHJ1biBpcyB0aGUgbGFzdCBjb250ZW50IHRvIGNvbW1pdC4KLSAgICAg
ICAgICAgIG1fbGluZS5hcHBlbmQocnVuLmlubGluZUl0ZW0sIHJ1bi5sb2dpY2FsV2lkdGgpOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fbGluZS5hcHBlbmQocnVu
LmlubGluZUl0ZW0sIHJ1bi5sb2dpY2FsV2lkdGgpOwotICAgIH0KLX0KLQotc2l6ZV90IExpbmVC
dWlsZGVyOjpyZWJ1aWxkTGluZShjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlLCBj
b25zdCBJbmxpbmVJdGVtJiBsYXN0SW5saW5lSXRlbVRvQWRkKQotewotICAgIEFTU0VSVCghbV93
cmFwT3Bwb3J0dW5pdHlMaXN0LmlzRW1wdHkoKSk7Ci0gICAgLy8gV2UgbWlnaHQgYWxyZWFkeSBo
YXZlIGFkZGVkIGZsb2F0cy4gVGhleSBzaHJpbmsgdGhlIGF2YWlsYWJsZSBob3Jpem9udGFsIHNw
YWNlIGZvciB0aGUgbGluZS4KLSAgICAvLyBMZXQncyBqdXN0IHJldXNlIHdoYXQgdGhlIGxpbmUg
aGFzIGF0IHRoaXMgcG9pbnQuCi0gICAgbV9saW5lLmluaXRpYWxpemUoKTsKLSAgICBhdXRvIGN1
cnJlbnRJdGVtSW5kZXggPSBsYXlvdXRSYW5nZS5zdGFydDsKLSAgICBpZiAobV9wYXJ0aWFsTGVh
ZGluZ1RleHRJdGVtKSB7Ci0gICAgICAgIG1fbGluZS5hcHBlbmQoKm1fcGFydGlhbExlYWRpbmdU
ZXh0SXRlbSwgaW5saW5lSXRlbVdpZHRoKCptX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW0sIHsgfSkp
OwotICAgICAgICBpZiAoJm1fcGFydGlhbExlYWRpbmdUZXh0SXRlbS52YWx1ZSgpID09ICZsYXN0
SW5saW5lSXRlbVRvQWRkKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICsrY3VycmVu
dEl0ZW1JbmRleDsKLSAgICB9Ci0gICAgZm9yICg7IGN1cnJlbnRJdGVtSW5kZXggPCBsYXlvdXRS
YW5nZS5lbmQ7ICsrY3VycmVudEl0ZW1JbmRleCkgewotICAgICAgICBhdXRvJiBpbmxpbmVJdGVt
ID0gbV9pbmxpbmVJdGVtc1tjdXJyZW50SXRlbUluZGV4XTsKLSAgICAgICAgbV9saW5lLmFwcGVu
ZChpbmxpbmVJdGVtLCBpbmxpbmVJdGVtV2lkdGgoaW5saW5lSXRlbSwgbV9saW5lLmNvbnRlbnRM
b2dpY2FsUmlnaHQoKSkpOwotICAgICAgICBpZiAoJmlubGluZUl0ZW0gPT0gJmxhc3RJbmxpbmVJ
dGVtVG9BZGQpCi0gICAgICAgICAgICByZXR1cm4gY3VycmVudEl0ZW1JbmRleCAtIGxheW91dFJh
bmdlLnN0YXJ0ICsgMTsKLSAgICB9Ci0gICAgcmV0dXJuIGxheW91dFJhbmdlLnNpemUoKTsKLX0K
LQotc2l6ZV90IExpbmVCdWlsZGVyOjpyZWJ1aWxkTGluZUZvclRyYWlsaW5nU29mdEh5cGhlbihj
b25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxheW91dFJhbmdlKQotewotICAgIEFTU0VSVCghbV93cmFw
T3Bwb3J0dW5pdHlMaXN0LmlzRW1wdHkoKSk7Ci0gICAgLy8gUmV2ZXJ0IGFsbCB0aGUgd2F5IGJh
Y2sgdG8gYSB3cmFwIG9wcG9ydHVuaXR5IHdoZW4gZWl0aGVyIGEgc29mdCBoeXBoZW4gZml0cyBv
ciBubyBoeXBoZW4gaXMgcmVxdWlyZWQuCi0gICAgZm9yIChhdXRvIGkgPSBtX3dyYXBPcHBvcnR1
bml0eUxpc3Quc2l6ZSgpOyBpLS0gPiAxOykgewotICAgICAgICBhdXRvJiBzb2Z0V3JhcE9wcG9y
dHVuaXR5SXRlbSA9ICptX3dyYXBPcHBvcnR1bml0eUxpc3RbaV07Ci0gICAgICAgIC8vIEZJWE1F
OiBJZiB0aGlzIHR1cm5zIG91dCB0byBiZSBhIHBlcmYgaXNzdWUsIHdlIGNvdWxkIGFsc28gdHJh
dmVyc2UgdGhlIHdyYXAgbGlzdCBhbmQga2VlcCBhZGRpbmcgdGhlIGl0ZW1zCi0gICAgICAgIC8v
IHdoaWxlIHdhdGNoaW5nIHRoZSBhdmFpbGFibGUgd2lkdGggdmVyeSBjbG9zZWx5LgotICAgICAg
ICBhdXRvIGNvbW1pdHRlZENvdW50ID0gcmVidWlsZExpbmUobGF5b3V0UmFuZ2UsIHNvZnRXcmFw
T3Bwb3J0dW5pdHlJdGVtKTsKLSAgICAgICAgYXV0byBhdmFpbGFibGVXaWR0aCA9IG1fbGluZUxv
Z2ljYWxSZWN0LndpZHRoKCkgLSBtX2xpbmUuY29udGVudExvZ2ljYWxSaWdodCgpOwotICAgICAg
ICBhdXRvIHRyYWlsaW5nU29mdEh5cGhlbldpZHRoID0gbV9saW5lLnRyYWlsaW5nU29mdEh5cGhl
bldpZHRoKCk7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpbGluZyBoeXBoZW4gbm93IGZp
dHMgdGhlIGxpbmUgKG9yIHdlIGRvbid0IG5lZWQgaHloZW4gYW55bW9yZSkuCi0gICAgICAgIGlm
ICghdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggfHwgdHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGggPD0g
YXZhaWxhYmxlV2lkdGgpIHsKLSAgICAgICAgICAgIGlmICh0cmFpbGluZ1NvZnRIeXBoZW5XaWR0
aCkKLSAgICAgICAgICAgICAgICBtX2xpbmUuYWRkVHJhaWxpbmdIeXBoZW4oKnRyYWlsaW5nU29m
dEh5cGhlbldpZHRoKTsKLSAgICAgICAgICAgIHJldHVybiBjb21taXR0ZWRDb3VudDsKLSAgICAg
ICAgfQotICAgIH0KLSAgICAvLyBIYXZlIGF0IGxlYXN0IHNvbWUgY29udGVudCBvbiB0aGUgbGlu
ZS4KLSAgICBhdXRvIGNvbW1pdHRlZENvdW50ID0gcmVidWlsZExpbmUobGF5b3V0UmFuZ2UsICpt
X3dyYXBPcHBvcnR1bml0eUxpc3QuZmlyc3QoKSk7Ci0gICAgaWYgKGF1dG8gdHJhaWxpbmdTb2Z0
SHlwaGVuV2lkdGggPSBtX2xpbmUudHJhaWxpbmdTb2Z0SHlwaGVuV2lkdGgoKSkKLSAgICAgICAg
bV9saW5lLmFkZFRyYWlsaW5nSHlwaGVuKCp0cmFpbGluZ1NvZnRIeXBoZW5XaWR0aCk7Ci0gICAg
cmV0dXJuIGNvbW1pdHRlZENvdW50OwotfQotCi1ib29sIExpbmVCdWlsZGVyOjppc0xhc3RMaW5l
V2l0aElubGluZUNvbnRlbnQoY29uc3QgSW5saW5lSXRlbVJhbmdlJiBsaW5lUmFuZ2UsIHNpemVf
dCBsYXN0SW5saW5lSXRlbUluZGV4LCBib29sIGhhc1BhcnRpYWxUcmFpbGluZ0NvbnRlbnQpIGNv
bnN0Ci17Ci0gICAgaWYgKGhhc1BhcnRpYWxUcmFpbGluZ0NvbnRlbnQpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICBpZiAobGluZVJhbmdlLmVuZCA9PSBsYXN0SW5saW5lSXRlbUluZGV4KQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAvLyBPbWl0IGZsb2F0cyB0byBzZWUgaWYgdGhpcyBp
cyB0aGUgbGFzdCBsaW5lIHdpdGggaW5saW5lIGNvbnRlbnQuCi0gICAgZm9yIChhdXRvIGkgPSBs
YXN0SW5saW5lSXRlbUluZGV4OyBpLS07KSB7Ci0gICAgICAgIGlmICghbV9pbmxpbmVJdGVtc1tp
XS5pc0Zsb2F0KCkpCi0gICAgICAgICAgICByZXR1cm4gaSA9PSBsaW5lUmFuZ2UuZW5kIC0gMTsK
LSAgICB9Ci0gICAgLy8gVGhlcmUgaGFzIHRvIGJlIGF0IGxlYXN0IG9uZSBub24tZmxvYXQgaXRl
bS4KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWNv
bnN0IENvbnRhaW5lckJveCYgTGluZUJ1aWxkZXI6OnJvb3QoKSBjb25zdAotewotICAgIHJldHVy
biBmb3JtYXR0aW5nQ29udGV4dCgpLnJvb3QoKTsKLX0KLQotY29uc3QgTGF5b3V0U3RhdGUmIExp
bmVCdWlsZGVyOjpsYXlvdXRTdGF0ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZvcm1hdHRpbmdD
b250ZXh0KCkubGF5b3V0U3RhdGUoKTsKLX0KLQotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGlu
Zy9JbmxpbmVMaW5lQnVpbGRlci5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVCdWlsZGVyLmgKZGVsZXRlZCBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDBlMjE3MTUwNWVmZmI0MmZkZjBiMzIxNjQzYjM0M2Q4YzU1ZmNh
ZWYuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZUxpbmVCdWlsZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0g
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQot
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQp
Ci0KLSNpbmNsdWRlICJJbmxpbmVDb250ZW50QnJlYWtlci5oIgotI2luY2x1ZGUgIklubGluZUZv
cm1hdHRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIklubGluZUxpbmUuaCIKLQotbmFtZXNwYWNlIFdl
YkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIEZsb2F0aW5nQ29udGV4dDsKLXN0
cnVjdCBMaW5lQ2FuZGlkYXRlOwotCi1jbGFzcyBMaW5lQnVpbGRlciB7Ci1wdWJsaWM6Ci0gICAg
TGluZUJ1aWxkZXIoSW5saW5lRm9ybWF0dGluZ0NvbnRleHQmLCBGbG9hdGluZ1N0YXRlJiwgSG9y
aXpvbnRhbENvbnN0cmFpbnRzIHJvb3RIb3Jpem9udGFsQ29uc3RyYWludHMsIGNvbnN0IElubGlu
ZUl0ZW1zJik7Ci0gICAgTGluZUJ1aWxkZXIoY29uc3QgSW5saW5lRm9ybWF0dGluZ0NvbnRleHQm
LCBjb25zdCBJbmxpbmVJdGVtcyYpOwotCi0gICAgc3RydWN0IElubGluZUl0ZW1SYW5nZSB7Ci0g
ICAgICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0ID09IGVuZDsgfQotICAg
ICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGVuZCAtIHN0YXJ0OyB9Ci0gICAgICAg
IHNpemVfdCBzdGFydCB7IDAgfTsKLSAgICAgICAgc2l6ZV90IGVuZCB7IDAgfTsKLSAgICB9Owot
ICAgIHVzaW5nIEZsb2F0TGlzdCA9IFZlY3Rvcjxjb25zdCBCb3gqPjsKLSAgICBzdHJ1Y3QgTGlu
ZUNvbnRlbnQgewotICAgICAgICBJbmxpbmVJdGVtUmFuZ2UgaW5saW5lSXRlbVJhbmdlOwotICAg
ICAgICBzaXplX3QgcGFydGlhbFRyYWlsaW5nQ29udGVudExlbmd0aCB7IDAgfTsKLSAgICAgICAg
T3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gb3ZlcmZsb3dMb2dpY2FsV2lkdGg7Ci0gICAgICAg
IGNvbnN0IEZsb2F0TGlzdCYgZmxvYXRzOwotICAgICAgICBib29sIGhhc0ludHJ1c2l2ZUZsb2F0
IHsgZmFsc2UgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0UG9pbnQgbG9naWNhbFRvcExlZnQ7Ci0g
ICAgICAgIElubGluZUxheW91dFVuaXQgbGluZUxvZ2ljYWxXaWR0aDsKLSAgICAgICAgSW5saW5l
TGF5b3V0VW5pdCBjb250ZW50TG9naWNhbFdpZHRoOwotICAgICAgICBib29sIGlzTGFzdExpbmVX
aXRoSW5saW5lQ29udGVudCB7IHRydWUgfTsKLSAgICAgICAgc2l6ZV90IG5vblNwYW5uaW5nSW5s
aW5lTGV2ZWxCb3hDb3VudCB7IDAgfTsKLSAgICAgICAgY29uc3QgTGluZTo6UnVuTGlzdCYgcnVu
czsKLSAgICB9OwotICAgIExpbmVDb250ZW50IGxheW91dElubGluZUNvbnRlbnQoY29uc3QgSW5s
aW5lSXRlbVJhbmdlJiwgc2l6ZV90IHBhcnRpYWxMZWFkaW5nQ29udGVudExlbmd0aCwgT3B0aW9u
YWw8SW5saW5lTGF5b3V0VW5pdD4gbGVhZGluZ0xvZ2ljYWxXaWR0aCwgY29uc3QgSW5saW5lUmVj
dCYgaW5pdGlhbExpbmVMb2dpY2FsUmVjdCwgYm9vbCBpc0ZpcnN0TGluZSk7Ci0KLSAgICBzdHJ1
Y3QgSW50cmluc2ljQ29udGVudCB7Ci0gICAgICAgIElubGluZUl0ZW1SYW5nZSBpbmxpbmVJdGVt
UmFuZ2U7Ci0gICAgICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbFdpZHRoIHsgMCB9OwotICAg
ICAgICBjb25zdCBGbG9hdExpc3QmIGZsb2F0czsKLSAgICB9OwotICAgIEludHJpbnNpY0NvbnRl
bnQgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmLCBJbmxpbmVM
YXlvdXRVbml0IGF2YWlsYWJsZVdpZHRoKTsKLQotcHJpdmF0ZToKLSAgICB2b2lkIGNhbmRpZGF0
ZUNvbnRlbnRGb3JMaW5lKExpbmVDYW5kaWRhdGUmLCBzaXplX3QgaW5saW5lSXRlbUluZGV4LCBj
b25zdCBJbmxpbmVJdGVtUmFuZ2UmIG5lZWRzTGF5b3V0UmFuZ2UsIHNpemVfdCBvdmVyZmxvd0xl
bmd0aCwgT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gbGVhZGluZ0xvZ2ljYWxXaWR0aCwgSW5s
aW5lTGF5b3V0VW5pdCBjdXJyZW50TG9naWNhbFJpZ2h0KTsKLSAgICBzaXplX3QgbmV4dFdyYXBP
cHBvcnR1bml0eShzaXplX3Qgc3RhcnRJbmRleCwgY29uc3QgTGluZUJ1aWxkZXI6OklubGluZUl0
ZW1SYW5nZSYgbGF5b3V0UmFuZ2UpIGNvbnN0OwotCi0gICAgc3RydWN0IFJlc3VsdCB7Ci0gICAg
ICAgIElubGluZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZSBpc0VuZE9mTGluZSB7IElubGlu
ZUNvbnRlbnRCcmVha2VyOjpJc0VuZE9mTGluZTo6Tm8gfTsKLSAgICAgICAgc3RydWN0IENvbW1p
dHRlZENvbnRlbnRDb3VudCB7Ci0gICAgICAgICAgICBzaXplX3QgdmFsdWUgeyAwIH07Ci0gICAg
ICAgICAgICBib29sIGlzUmV2ZXJ0IHsgZmFsc2UgfTsKLSAgICAgICAgfTsKLSAgICAgICAgQ29t
bWl0dGVkQ29udGVudENvdW50IGNvbW1pdHRlZENvdW50IHsgfTsKLSAgICAgICAgc2l6ZV90IHBh
cnRpYWxUcmFpbGluZ0NvbnRlbnRMZW5ndGggeyAwIH07Ci0gICAgICAgIE9wdGlvbmFsPElubGlu
ZUxheW91dFVuaXQ+IG92ZXJmbG93TG9naWNhbFdpZHRoIHsgfTsKLSAgICB9OwotICAgIHN0cnVj
dCBVc2VkQ29uc3RyYWludHMgewotICAgICAgICBJbmxpbmVSZWN0IGxvZ2ljYWxSZWN0OwotICAg
ICAgICBib29sIGlzQ29uc3RyYWluZWRCeUZsb2F0IHsgZmFsc2UgfTsKLSAgICB9OwotICAgIFVz
ZWRDb25zdHJhaW50cyBpbml0aWFsQ29uc3RyYWludHNGb3JMaW5lKGNvbnN0IElubGluZVJlY3Qm
IGluaXRpYWxMaW5lTG9naWNhbFJlY3QsIGJvb2wgaXNGaXJzdExpbmUpIGNvbnN0OwotICAgIE9w
dGlvbmFsPEhvcml6b250YWxDb25zdHJhaW50cz4gZmxvYXRDb25zdHJhaW50cyhjb25zdCBJbmxp
bmVSZWN0JiBsaW5lTG9naWNhbFJlY3QpIGNvbnN0OwotCi0gICAgdm9pZCBoYW5kbGVGbG9hdENv
bnRlbnQoY29uc3QgSW5saW5lSXRlbSYpOwotICAgIFJlc3VsdCBoYW5kbGVJbmxpbmVDb250ZW50
KElubGluZUNvbnRlbnRCcmVha2VyJiwgY29uc3QgSW5saW5lSXRlbVJhbmdlJiBuZWVkc0xheW91
dFJhbmdlLCBjb25zdCBMaW5lQ2FuZGlkYXRlJik7Ci0gICAgc2l6ZV90IHJlYnVpbGRMaW5lKGNv
bnN0IElubGluZUl0ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgY29uc3QgSW5saW5lSXRlbSYg
bGFzdElubGluZUl0ZW1Ub0FkZCk7Ci0gICAgc2l6ZV90IHJlYnVpbGRMaW5lRm9yVHJhaWxpbmdT
b2Z0SHlwaGVuKGNvbnN0IElubGluZUl0ZW1SYW5nZSYgbGF5b3V0UmFuZ2UpOwotICAgIHZvaWQg
Y29tbWl0UGFydGlhbENvbnRlbnQoY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OkNvbnRpbnVv
dXNDb250ZW50OjpSdW5MaXN0JiwgY29uc3QgSW5saW5lQ29udGVudEJyZWFrZXI6OlJlc3VsdDo6
UGFydGlhbFRyYWlsaW5nQ29udGVudCYpOwotICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBVc2Vk
Q29uc3RyYWludHMmKTsKLSAgICBzdHJ1Y3QgQ29tbWl0dGVkQ29udGVudCB7Ci0gICAgICAgIHNp
emVfdCBpbmxpbmVJdGVtQ291bnQgeyAwIH07Ci0gICAgICAgIHNpemVfdCBwYXJ0aWFsVHJhaWxp
bmdDb250ZW50TGVuZ3RoIHsgMCB9OwotICAgICAgICBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0
PiBvdmVyZmxvd0xvZ2ljYWxXaWR0aCB7IH07Ci0gICAgfTsKLSAgICBDb21taXR0ZWRDb250ZW50
IHBsYWNlSW5saW5lQ29udGVudChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmLCBzaXplX3QgcGFydGlh
bExlYWRpbmdDb250ZW50TGVuZ3RoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBvdmVyZmxv
d0xvZ2ljYWxXaWR0aCk7Ci0gICAgSW5saW5lSXRlbVJhbmdlIGNsb3NlKGNvbnN0IElubGluZUl0
ZW1SYW5nZSYgbmVlZHNMYXlvdXRSYW5nZSwgY29uc3QgQ29tbWl0dGVkQ29udGVudCYpOwotCi0g
ICAgSW5saW5lTGF5b3V0VW5pdCBpbmxpbmVJdGVtV2lkdGgoY29uc3QgSW5saW5lSXRlbSYsIElu
bGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KSBjb25zdDsKLSAgICBib29sIGlzTGFz
dExpbmVXaXRoSW5saW5lQ29udGVudChjb25zdCBJbmxpbmVJdGVtUmFuZ2UmIGxpbmVSYW5nZSwg
c2l6ZV90IGxhc3RJbmxpbmVJdGVtSW5kZXgsIGJvb2wgaGFzUGFydGlhbFRyYWlsaW5nQ29udGVu
dCkgY29uc3Q7Ci0KLSAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGlu
Z0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2lubGluZUZvcm1hdHRpbmdDb250ZXh0OyB9Ci0g
ICAgSW5saW5lRm9ybWF0dGluZ1N0YXRlKiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVybiBtX2lu
bGluZUZvcm1hdHRpbmdTdGF0ZTsgfQotICAgIEZsb2F0aW5nU3RhdGUqIGZsb2F0aW5nU3RhdGUo
KSB7IHJldHVybiBtX2Zsb2F0aW5nU3RhdGU7IH0KLSAgICBjb25zdCBGbG9hdGluZ1N0YXRlKiBm
bG9hdGluZ1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9mbG9hdGluZ1N0YXRlOyB9Ci0gICAgY29u
c3QgQ29udGFpbmVyQm94JiByb290KCkgY29uc3Q7Ci0gICAgY29uc3QgTGF5b3V0U3RhdGUmIGxh
eW91dFN0YXRlKCkgY29uc3Q7Ci0KLSAgICBjb25zdCBJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCYg
bV9pbmxpbmVGb3JtYXR0aW5nQ29udGV4dDsKLSAgICBJbmxpbmVGb3JtYXR0aW5nU3RhdGUqIG1f
aW5saW5lRm9ybWF0dGluZ1N0YXRlIHsgbnVsbHB0ciB9OwotICAgIEZsb2F0aW5nU3RhdGUqIG1f
ZmxvYXRpbmdTdGF0ZSB7IG51bGxwdHIgfTsKLSAgICBPcHRpb25hbDxIb3Jpem9udGFsQ29uc3Ry
YWludHM+IG1fcm9vdEhvcml6b250YWxDb25zdHJhaW50czsKLQotICAgIExpbmUgbV9saW5lOwot
ICAgIElubGluZVJlY3QgbV9saW5lTG9naWNhbFJlY3Q7Ci0gICAgY29uc3QgSW5saW5lSXRlbXMm
IG1faW5saW5lSXRlbXM7Ci0gICAgRmxvYXRMaXN0IG1fZmxvYXRzOwotICAgIE9wdGlvbmFsPElu
bGluZVRleHRJdGVtPiBtX3BhcnRpYWxMZWFkaW5nVGV4dEl0ZW07Ci0gICAgVmVjdG9yPGNvbnN0
IElubGluZUl0ZW0qPiBtX3dyYXBPcHBvcnR1bml0eUxpc3Q7Ci0gICAgdW5zaWduZWQgbV9zdWNj
ZXNzaXZlSHlwaGVuYXRlZExpbmVDb3VudCB7IDAgfTsKLSAgICBib29sIG1fY29udGVudElzQ29u
c3RyYWluZWRCeUZsb2F0IHsgZmFsc2UgfTsKLX07Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0
aW5nL0lubGluZUxpbmVHZW9tZXRyeS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxpbmVHZW9tZXRyeS5oCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmEyYzU4YTA3NmU0OWMyY2QzYzllMmY5MmFiMzZkMDNm
MjcyOWU1Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9J
bmxpbmVMaW5lR2VvbWV0cnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
LSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQotCi0jaW5jbHVkZSAiSW5saW5lUmVjdC5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1u
YW1lc3BhY2UgTGF5b3V0IHsKLQotY2xhc3MgSW5saW5lTGluZUdlb21ldHJ5IHsKLSAgICBXVEZf
TUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBzdHJ1Y3QgRW5jbG9zaW5nVG9wQW5k
Qm90dG9tIHsKLSAgICAgICAgLy8gVGhpcyB2YWx1ZXMgZW5jbG9zZXMgdGhlIHJvb3QgaW5saW5l
IGJveCBhbmQgYW55IG90aGVyIGlubGluZSBsZXZlbCBib3gncyBib3JkZXIgYm94LgotICAgICAg
ICBJbmxpbmVMYXlvdXRVbml0IHRvcCB7IDAgfTsKLSAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBi
b3R0b20geyAwIH07Ci0gICAgfTsKLSAgICBJbmxpbmVMaW5lR2VvbWV0cnkoY29uc3QgSW5saW5l
UmVjdCYgbGluZUJveExvZ2ljYWxSZWN0LCBFbmNsb3NpbmdUb3BBbmRCb3R0b20sIElubGluZUxh
eW91dFVuaXQgYWxpZ21lbnRCYXNlbGluZSwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNh
bExlZnQsIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxXaWR0aCk7Ci0KLSAgICBjb25z
dCBJbmxpbmVSZWN0JiBsaW5lQm94TG9naWNhbFJlY3QoKSBjb25zdCB7IHJldHVybiBtX2xpbmVC
b3hMb2dpY2FsUmVjdDsgfQotCi0gICAgRW5jbG9zaW5nVG9wQW5kQm90dG9tIGVuY2xvc2luZ1Rv
cEFuZEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIG1fZW5jbG9zaW5nVG9wQW5kQm90dG9tOyB9Ci0K
LSAgICBJbmxpbmVMYXlvdXRVbml0IGJhc2VsaW5lKCkgY29uc3QgeyByZXR1cm4gbV9hbGlnbWVu
dEJhc2VsaW5lOyB9Ci0KLSAgICBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCgp
IGNvbnN0IHsgcmV0dXJuIG1fY29udGVudExvZ2ljYWxMZWZ0OyB9Ci0gICAgSW5saW5lTGF5b3V0
VW5pdCBjb250ZW50TG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50TG9naWNh
bFdpZHRoOyB9Ci0KLSAgICB2b2lkIG1vdmVWZXJ0aWNhbGx5KElubGluZUxheW91dFVuaXQgb2Zm
c2V0KSB7IG1fbGluZUJveExvZ2ljYWxSZWN0Lm1vdmVWZXJ0aWNhbGx5KG9mZnNldCk7IH0KLQot
cHJpdmF0ZToKLSAgICAvLyBUaGlzIGlzIGxpbmUgYm94IGdlb21ldHJ5IChzZWUgaHR0cHM6Ly93
d3cudzMub3JnL1RSL2Nzcy1pbmxpbmUtMy8jbGluZS1ib3gpLgotICAgIElubGluZVJlY3QgbV9s
aW5lQm94TG9naWNhbFJlY3Q7Ci0gICAgLy8gRW5jbG9zaW5nIHRvcCBhbmQgYm90dG9tIGluY2x1
ZGVzIGFsbCBpbmxpbmUgbGV2ZWwgYm94ZXMgKGJvcmRlciBib3gpIHZlcnRpY2FsbHkuCi0gICAg
Ly8gV2hpbGUgdGhlIGxpbmUgYm94IHVzdWFsbHkgZW5jbG9zZSB0aGVtIGFzIHdlbGwsIGl0cyB2
ZXJ0aWNhbCBnZW9tZXRyeSBpcyBiYXNlZCBvbgotICAgIC8vIHRoZSBsYXlvdXQgYm91bmRzIG9m
IHRoZSBpbmxpbmUgbGV2ZWwgYm94ZXMgd2hpY2ggbWF5IGJlIGRpZmZlcmVudCB3aGVuIGxpbmUt
aGVpZ2h0IGlzIHByZXNlbnQuCi0gICAgRW5jbG9zaW5nVG9wQW5kQm90dG9tIG1fZW5jbG9zaW5n
VG9wQW5kQm90dG9tOwotICAgIElubGluZUxheW91dFVuaXQgbV9hbGlnbWVudEJhc2VsaW5lIHsg
MCB9OwotICAgIElubGluZUxheW91dFVuaXQgbV9jb250ZW50TG9naWNhbExlZnQgeyAwIH07Ci0g
ICAgSW5saW5lTGF5b3V0VW5pdCBtX2NvbnRlbnRMb2dpY2FsV2lkdGggeyAwIH07Ci19OwotCi1p
bmxpbmUgSW5saW5lTGluZUdlb21ldHJ5OjpJbmxpbmVMaW5lR2VvbWV0cnkoY29uc3QgSW5saW5l
UmVjdCYgbGluZUJveExvZ2ljYWxSZWN0LCBFbmNsb3NpbmdUb3BBbmRCb3R0b20gZW5jbG9zaW5n
VG9wQW5kQm90dG9tLCBJbmxpbmVMYXlvdXRVbml0IGFsaWdtZW50QmFzZWxpbmUsIElubGluZUxh
eW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0LCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dp
Y2FsV2lkdGgpCi0gICAgOiBtX2xpbmVCb3hMb2dpY2FsUmVjdChsaW5lQm94TG9naWNhbFJlY3Qp
Ci0gICAgLCBtX2VuY2xvc2luZ1RvcEFuZEJvdHRvbShlbmNsb3NpbmdUb3BBbmRCb3R0b20pCi0g
ICAgLCBtX2FsaWdtZW50QmFzZWxpbmUoYWxpZ21lbnRCYXNlbGluZSkKLSAgICAsIG1fY29udGVu
dExvZ2ljYWxMZWZ0KGNvbnRlbnRMb2dpY2FsTGVmdCkKLSAgICAsIG1fY29udGVudExvZ2ljYWxX
aWR0aChjb250ZW50TG9naWNhbFdpZHRoKQotewotfQotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3Jt
YXR0aW5nL0lubGluZUxpbmVSdW4uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVMaW5lUnVuLmgKZGVsZXRlZCBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDBiMGVlMTRkZWQwYmUyY2NkNTJkMzQzM2IwODg0NTQ2YzFmMGQyYjIu
LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUxp
bmVSdW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0
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
Y2x1ZGUgIklubGluZVJlY3QuaCIKLSNpbmNsdWRlICJMYXlvdXRCb3guaCIKLSNpbmNsdWRlICJU
ZXh0RmxhZ3MuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0K
LXN0cnVjdCBMaW5lUnVuIHsKLSAgICBXVEZfTUFLRV9TVFJVQ1RfRkFTVF9BTExPQ0FURUQ7Ci0g
ICAgc3RydWN0IFRleHQgewotICAgICAgICBXVEZfTUFLRV9TVFJVQ1RfRkFTVF9BTExPQ0FURUQ7
Ci0gICAgcHVibGljOgotICAgICAgICBUZXh0KHNpemVfdCBwb3NpdGlvbiwgc2l6ZV90IGxlbmd0
aCwgY29uc3QgU3RyaW5nJik7Ci0KLSAgICAgICAgc2l6ZV90IHN0YXJ0KCkgY29uc3QgeyByZXR1
cm4gbV9zdGFydDsgfQotICAgICAgICBzaXplX3QgZW5kKCkgY29uc3QgeyByZXR1cm4gc3RhcnQo
KSArIGxlbmd0aCgpOyB9Ci0gICAgICAgIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBt
X2xlbmd0aDsgfQotICAgICAgICBTdHJpbmcgY29udGVudCgpIGNvbnN0IHsgcmV0dXJuIG1fY29u
dGVudFN0cmluZzsgfQotCi0gICAgICAgIGJvb2wgbmVlZHNIeXBoZW4oKSBjb25zdCB7IHJldHVy
biBtX25lZWRzSHlwaGVuOyB9Ci0gICAgICAgIHZvaWQgc2V0TmVlZHNIeXBoZW4oKSB7IG1fbmVl
ZHNIeXBoZW4gPSB0cnVlOyB9Ci0KLSAgICAgICAgdm9pZCBleHBhbmQoc2l6ZV90IGRlbHRhKSB7
IG1fbGVuZ3RoICs9IGRlbHRhOyB9Ci0gICAgICAgIHZvaWQgc2hyaW5rKHNpemVfdCBkZWx0YSkg
eyBtX2xlbmd0aCAtPSBkZWx0YTsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc2l6ZV90IG1f
c3RhcnQgeyAwIH07Ci0gICAgICAgIHNpemVfdCBtX2xlbmd0aCB7IDAgfTsKLSAgICAgICAgYm9v
bCBtX25lZWRzSHlwaGVuIHsgZmFsc2UgfTsKLSAgICAgICAgU3RyaW5nIG1fY29udGVudFN0cmlu
ZzsKLSAgICB9OwotCi0gICAgc3RydWN0IEV4cGFuc2lvbjsKLSAgICBMaW5lUnVuKHNpemVfdCBs
aW5lSW5kZXgsIGNvbnN0IEJveCYsIGNvbnN0IElubGluZVJlY3QmLCBFeHBhbnNpb24sIE9wdGlv
bmFsPFRleHQ+ID0gV1RGOjpudWxsb3B0KTsKLQotICAgIGNvbnN0IElubGluZVJlY3QmIGxvZ2lj
YWxSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9sb2dpY2FsUmVjdDsgfQotCi0gICAgSW5saW5lTGF5
b3V0VW5pdCBsb2dpY2FsVG9wKCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS50b3AoKTsg
fQotICAgIElubGluZUxheW91dFVuaXQgbG9naWNhbEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIGxv
Z2ljYWxSZWN0KCkuYm90dG9tKCk7IH0KLSAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0
KCkgY29uc3QgeyByZXR1cm4gbG9naWNhbFJlY3QoKS5sZWZ0KCk7IH0KLSAgICBJbmxpbmVMYXlv
dXRVbml0IGxvZ2ljYWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxSZWN0KCkucmlnaHQo
KTsgfQotCi0gICAgSW5saW5lTGF5b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVy
biBsb2dpY2FsUmVjdCgpLndpZHRoKCk7IH0KLSAgICBJbmxpbmVMYXlvdXRVbml0IGxvZ2ljYWxI
ZWlnaHQoKSBjb25zdCB7IHJldHVybiBsb2dpY2FsUmVjdCgpLmhlaWdodCgpOyB9Ci0KLSAgICB2
b2lkIG1vdmVWZXJ0aWNhbGx5KElubGluZUxheW91dFVuaXQgb2Zmc2V0KSB7IG1fbG9naWNhbFJl
Y3QubW92ZVZlcnRpY2FsbHkob2Zmc2V0KTsgfQotICAgIE9wdGlvbmFsPFRleHQ+JiB0ZXh0KCkg
eyByZXR1cm4gbV90ZXh0OyB9Ci0gICAgY29uc3QgT3B0aW9uYWw8VGV4dD4mIHRleHQoKSBjb25z
dCB7IHJldHVybiBtX3RleHQ7IH0KLQotICAgIHN0cnVjdCBFeHBhbnNpb24gewotICAgICAgICBF
eHBhbnNpb25CZWhhdmlvciBiZWhhdmlvciB7IERlZmF1bHRFeHBhbnNpb24gfTsKLSAgICAgICAg
SW5saW5lTGF5b3V0VW5pdCBob3Jpem9udGFsRXhwYW5zaW9uIHsgMCB9OwotICAgIH07Ci0gICAg
RXhwYW5zaW9uIGV4cGFuc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fZXhwYW5zaW9uOyB9Ci0KLSAg
ICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQot
ICAgIHNpemVfdCBsaW5lSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2xpbmVJbmRleDsgfQotCi1w
cml2YXRlOgotICAgIGNvbnN0IHNpemVfdCBtX2xpbmVJbmRleDsKLSAgICBXZWFrUHRyPGNvbnN0
IExheW91dDo6Qm94PiBtX2xheW91dEJveDsKLSAgICBJbmxpbmVSZWN0IG1fbG9naWNhbFJlY3Q7
Ci0gICAgRXhwYW5zaW9uIG1fZXhwYW5zaW9uOwotICAgIE9wdGlvbmFsPFRleHQ+IG1fdGV4dDsK
LX07Ci0KLWlubGluZSBMaW5lUnVuOjpMaW5lUnVuKHNpemVfdCBsaW5lSW5kZXgsIGNvbnN0IExh
eW91dDo6Qm94JiBsYXlvdXRCb3gsIGNvbnN0IElubGluZVJlY3QmIGxvZ2ljYWxSZWN0LCBFeHBh
bnNpb24gZXhwYW5zaW9uLCBPcHRpb25hbDxUZXh0PiB0ZXh0KQotICAgIDogbV9saW5lSW5kZXgo
bGluZUluZGV4KQotICAgICwgbV9sYXlvdXRCb3gobWFrZVdlYWtQdHIobGF5b3V0Qm94KSkKLSAg
ICAsIG1fbG9naWNhbFJlY3QobG9naWNhbFJlY3QpCi0gICAgLCBtX2V4cGFuc2lvbihleHBhbnNp
b24pCi0gICAgLCBtX3RleHQodGV4dCkKLXsKLX0KLQotaW5saW5lIExpbmVSdW46OlRleHQ6OlRl
eHQoc2l6ZV90IHN0YXJ0LCBzaXplX3QgbGVuZ3RoLCBjb25zdCBTdHJpbmcmIGNvbnRlbnRTdHJp
bmcpCi0gICAgOiBtX3N0YXJ0KHN0YXJ0KQotICAgICwgbV9sZW5ndGgobGVuZ3RoKQotICAgICwg
bV9jb250ZW50U3RyaW5nKGNvbnRlbnRTdHJpbmcpCi17Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVm
b3JtYXR0aW5nL0lubGluZVJlY3QuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVSZWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IGFjZDA5YWIxZTcxMDFhYTZlY2Y0MzNkMjY0MDA0ZmZlOGZiN2E4YzQuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVJlY3Qu
aAorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAy
MDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBv
bmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUg
IkxheW91dFVuaXRzLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQg
ewotCi1jbGFzcyBJbmxpbmVSZWN0IHsKLXB1YmxpYzoKLSAgICBJbmxpbmVSZWN0KCkgPSBkZWZh
dWx0OwotICAgIElubGluZVJlY3QoSW5saW5lTGF5b3V0VW5pdCB0b3AsIElubGluZUxheW91dFVu
aXQgbGVmdCwgSW5saW5lTGF5b3V0VW5pdCB3aWR0aCwgSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQp
OwotICAgIElubGluZVJlY3QoY29uc3QgSW5saW5lTGF5b3V0UG9pbnQmIHRvcExlZnQsIElubGlu
ZUxheW91dFVuaXQgd2lkdGgsIElubGluZUxheW91dFVuaXQgaGVpZ2h0KTsKLSAgICBJbmxpbmVS
ZWN0KGNvbnN0IElubGluZUxheW91dFBvaW50JiB0b3BMZWZ0LCBjb25zdCBJbmxpbmVMYXlvdXRT
aXplJik7Ci0gICAgCi0gICAgSW5saW5lTGF5b3V0VW5pdCB0b3AoKSBjb25zdDsKLSAgICBJbmxp
bmVMYXlvdXRVbml0IGxlZnQoKSBjb25zdDsKLSAgICBJbmxpbmVMYXlvdXRQb2ludCB0b3BMZWZ0
KCkgY29uc3Q7Ci0KLSAgICBJbmxpbmVMYXlvdXRVbml0IGJvdHRvbSgpIGNvbnN0OwotICAgIElu
bGluZUxheW91dFVuaXQgcmlnaHQoKSBjb25zdDsgICAgICAgIAotCi0gICAgSW5saW5lTGF5b3V0
VW5pdCB3aWR0aCgpIGNvbnN0OwotICAgIElubGluZUxheW91dFVuaXQgaGVpZ2h0KCkgY29uc3Q7
Ci0gICAgSW5saW5lTGF5b3V0U2l6ZSBzaXplKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFRvcChJ
bmxpbmVMYXlvdXRVbml0KTsKLSAgICB2b2lkIHNldEJvdHRvbShJbmxpbmVMYXlvdXRVbml0KTsK
LSAgICB2b2lkIHNldExlZnQoSW5saW5lTGF5b3V0VW5pdCk7Ci0gICAgdm9pZCBzZXRUb3BMZWZ0
KGNvbnN0IElubGluZUxheW91dFBvaW50Jik7Ci0gICAgdm9pZCBzZXRXaWR0aChJbmxpbmVMYXlv
dXRVbml0KTsKLSAgICB2b2lkIHNldEhlaWdodChJbmxpbmVMYXlvdXRVbml0KTsKLQotICAgIHZv
aWQgbW92ZUhvcml6b250YWxseShJbmxpbmVMYXlvdXRVbml0KTsKLSAgICB2b2lkIG1vdmVWZXJ0
aWNhbGx5KElubGluZUxheW91dFVuaXQpOwotICAgIHZvaWQgbW92ZUJ5KElubGluZUxheW91dFBv
aW50KTsKLQotICAgIHZvaWQgZXhwYW5kKE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+LCBPcHRp
b25hbDxJbmxpbmVMYXlvdXRVbml0Pik7Ci0gICAgdm9pZCBleHBhbmRUb0NvbnRhaW4oY29uc3Qg
SW5saW5lUmVjdCYpOwotICAgIHZvaWQgZXhwYW5kSG9yaXpvbnRhbGx5KElubGluZUxheW91dFVu
aXQgZGVsdGEpIHsgZXhwYW5kKGRlbHRhLCB7IH0pOyB9Ci0gICAgdm9pZCBleHBhbmRWZXJ0aWNh
bGx5KElubGluZUxheW91dFVuaXQgZGVsdGEpIHsgZXhwYW5kKHsgfSwgZGVsdGEpOyB9Ci0gICAg
dm9pZCBleHBhbmRWZXJ0aWNhbGx5VG9Db250YWluKGNvbnN0IElubGluZVJlY3QmKTsKLSAgICB2
b2lkIGluZmxhdGUoSW5saW5lTGF5b3V0VW5pdCk7Ci0KLSAgICBvcGVyYXRvciBJbmxpbmVMYXlv
dXRSZWN0KCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICB2b2lk
IGludmFsaWRhdGVUb3AoKSB7IG1faGFzVmFsaWRUb3AgPSBmYWxzZTsgfQotICAgIHZvaWQgaW52
YWxpZGF0ZUxlZnQoKSB7IG1faGFzVmFsaWRMZWZ0ID0gZmFsc2U7IH0KLSAgICB2b2lkIGludmFs
aWRhdGVXaWR0aCgpIHsgbV9oYXNWYWxpZFdpZHRoID0gZmFsc2U7IH0KLSAgICB2b2lkIGludmFs
aWRhdGVIZWlnaHQoKSB7IG1faGFzVmFsaWRIZWlnaHQgPSBmYWxzZTsgfQotICAgIHZvaWQgaW52
YWxpZGF0ZVBvc2l0aW9uKCk7Ci0KLSAgICBib29sIGhhc1ZhbGlkUG9zaXRpb24oKSBjb25zdCB7
IHJldHVybiBtX2hhc1ZhbGlkVG9wICYmIG1faGFzVmFsaWRMZWZ0OyB9Ci0gICAgYm9vbCBoYXNW
YWxpZFNpemUoKSBjb25zdCB7IHJldHVybiBtX2hhc1ZhbGlkV2lkdGggJiYgbV9oYXNWYWxpZEhl
aWdodDsgfQotICAgIGJvb2wgaGFzVmFsaWRHZW9tZXRyeSgpIGNvbnN0IHsgcmV0dXJuIGhhc1Zh
bGlkUG9zaXRpb24oKSAmJiBoYXNWYWxpZFNpemUoKTsgfQotCi0gICAgdm9pZCBzZXRIYXNWYWxp
ZFBvc2l0aW9uKCk7Ci0gICAgdm9pZCBzZXRIYXNWYWxpZFNpemUoKTsKLQotICAgIGJvb2wgbV9o
YXNWYWxpZFRvcCB7IGZhbHNlIH07Ci0gICAgYm9vbCBtX2hhc1ZhbGlkTGVmdCB7IGZhbHNlIH07
Ci0gICAgYm9vbCBtX2hhc1ZhbGlkV2lkdGggeyBmYWxzZSB9OwotICAgIGJvb2wgbV9oYXNWYWxp
ZEhlaWdodCB7IGZhbHNlIH07Ci0jZW5kaWYgLy8gQVNTRVJUX0VOQUJMRUQKLSAgICBJbmxpbmVM
YXlvdXRSZWN0IG1fcmVjdDsKLX07Ci0KLWlubGluZSBJbmxpbmVSZWN0OjpJbmxpbmVSZWN0KElu
bGluZUxheW91dFVuaXQgdG9wLCBJbmxpbmVMYXlvdXRVbml0IGxlZnQsIElubGluZUxheW91dFVu
aXQgd2lkdGgsIElubGluZUxheW91dFVuaXQgaGVpZ2h0KQotICAgIDogbV9yZWN0KGxlZnQsIHRv
cCwgd2lkdGgsIGhlaWdodCkKLXsKLSNpZiBBU1NFUlRfRU5BQkxFRAotICAgIG1faGFzVmFsaWRU
b3AgPSB0cnVlOwotICAgIG1faGFzVmFsaWRMZWZ0ID0gdHJ1ZTsKLSAgICBtX2hhc1ZhbGlkV2lk
dGggPSB0cnVlOwotICAgIG1faGFzVmFsaWRIZWlnaHQgPSB0cnVlOwotI2VuZGlmCi19Ci0KLWlu
bGluZSBJbmxpbmVSZWN0OjpJbmxpbmVSZWN0KGNvbnN0IElubGluZUxheW91dFBvaW50JiB0b3BM
ZWZ0LCBJbmxpbmVMYXlvdXRVbml0IHdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGhlaWdodCkKLSAg
ICA6IElubGluZVJlY3QodG9wTGVmdC55KCksIHRvcExlZnQueCgpLCB3aWR0aCwgaGVpZ2h0KQot
ewotfQotCi1pbmxpbmUgSW5saW5lUmVjdDo6SW5saW5lUmVjdChjb25zdCBJbmxpbmVMYXlvdXRQ
b2ludCYgdG9wTGVmdCwgY29uc3QgSW5saW5lTGF5b3V0U2l6ZSYgc2l6ZSkKLSAgICA6IElubGlu
ZVJlY3QodG9wTGVmdC55KCksIHRvcExlZnQueCgpLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0
KCkpCi17Ci19Ci0KLSNpZiBBU1NFUlRfRU5BQkxFRAotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6
aW52YWxpZGF0ZVBvc2l0aW9uKCkKLXsKLSAgICBpbnZhbGlkYXRlVG9wKCk7Ci0gICAgaW52YWxp
ZGF0ZUxlZnQoKTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0SGFzVmFsaWRQb3Np
dGlvbigpCi17Ci0gICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZExlZnQg
PSB0cnVlOwotfQotCi1pbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRIYXNWYWxpZFNpemUoKQot
ewotICAgIG1faGFzVmFsaWRXaWR0aCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZEhlaWdodCA9IHRy
dWU7Ci19Ci0jZW5kaWYgLy8gQVNTRVJUX0VOQUJMRUQKLQotaW5saW5lIElubGluZUxheW91dFVu
aXQgSW5saW5lUmVjdDo6dG9wKCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZFRvcCk7
Ci0gICAgcmV0dXJuIG1fcmVjdC55KCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0IElu
bGluZVJlY3Q6OmxlZnQoKSBjb25zdAotewotICAgIEFTU0VSVChtX2hhc1ZhbGlkTGVmdCk7Ci0g
ICAgcmV0dXJuIG1fcmVjdC54KCk7Ci19Ci0KLWlubGluZSBJbmxpbmVMYXlvdXRVbml0IElubGlu
ZVJlY3Q6OmJvdHRvbSgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faGFzVmFsaWRUb3AgJiYgbV9o
YXNWYWxpZEhlaWdodCk7Ci0gICAgcmV0dXJuIG1fcmVjdC5tYXhZKCk7Ci19Ci0KLWlubGluZSBJ
bmxpbmVMYXlvdXRVbml0IElubGluZVJlY3Q6OnJpZ2h0KCkgY29uc3QKLXsKLSAgICBBU1NFUlQo
bV9oYXNWYWxpZExlZnQgJiYgbV9oYXNWYWxpZFdpZHRoKTsKLSAgICByZXR1cm4gbV9yZWN0Lm1h
eFgoKTsKLX0KLQotaW5saW5lIElubGluZUxheW91dFBvaW50IElubGluZVJlY3Q6OnRvcExlZnQo
KSBjb25zdAotewotICAgIEFTU0VSVChoYXNWYWxpZFBvc2l0aW9uKCkpOwotICAgIHJldHVybiBt
X3JlY3QubWluWE1pbllDb3JuZXIoKTsKLX0KLQotaW5saW5lIElubGluZUxheW91dFNpemUgSW5s
aW5lUmVjdDo6c2l6ZSgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGhhc1ZhbGlkU2l6ZSgpKTsKLSAg
ICByZXR1cm4gbV9yZWN0LnNpemUoKTsKLX0KLQotaW5saW5lIElubGluZUxheW91dFVuaXQgSW5s
aW5lUmVjdDo6d2lkdGgoKSBjb25zdAotewotICAgIEFTU0VSVChtX2hhc1ZhbGlkV2lkdGgpOwot
ICAgIHJldHVybiBtX3JlY3Qud2lkdGgoKTsKLX0KLQotaW5saW5lIElubGluZUxheW91dFVuaXQg
SW5saW5lUmVjdDo6aGVpZ2h0KCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZEhlaWdo
dCk7Ci0gICAgcmV0dXJuIG1fcmVjdC5oZWlnaHQoKTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5l
UmVjdDo6c2V0VG9wTGVmdChjb25zdCBJbmxpbmVMYXlvdXRQb2ludCYgdG9wTGVmdCkKLXsKLSNp
ZiBBU1NFUlRfRU5BQkxFRAotICAgIHNldEhhc1ZhbGlkUG9zaXRpb24oKTsKLSNlbmRpZgotICAg
IG1fcmVjdC5zZXRMb2NhdGlvbih0b3BMZWZ0KTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVj
dDo6c2V0VG9wKElubGluZUxheW91dFVuaXQgdG9wKQotewotI2lmIEFTU0VSVF9FTkFCTEVECi0g
ICAgbV9oYXNWYWxpZFRvcCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX3JlY3Quc2V0WSh0b3ApOwot
fQotCi1pbmxpbmUgdm9pZCBJbmxpbmVSZWN0OjpzZXRCb3R0b20oSW5saW5lTGF5b3V0VW5pdCBi
b3R0b20pCi17Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICBtX2hhc1ZhbGlkVG9wID0gdHJ1ZTsK
LSAgICBtX2hhc1ZhbGlkSGVpZ2h0ID0gdHJ1ZTsKLSNlbmRpZgotICAgIG1fcmVjdC5zaGlmdE1h
eFlFZGdlVG8oYm90dG9tKTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0TGVmdChJ
bmxpbmVMYXlvdXRVbml0IGxlZnQpCi17Ci0jaWYgQVNTRVJUX0VOQUJMRUQKLSAgICBtX2hhc1Zh
bGlkTGVmdCA9IHRydWU7Ci0jZW5kaWYKLSAgICBtX3JlY3Quc2V0WChsZWZ0KTsKLX0KLQotaW5s
aW5lIHZvaWQgSW5saW5lUmVjdDo6c2V0V2lkdGgoSW5saW5lTGF5b3V0VW5pdCB3aWR0aCkKLXsK
LSNpZiBBU1NFUlRfRU5BQkxFRAotICAgIG1faGFzVmFsaWRXaWR0aCA9IHRydWU7Ci0jZW5kaWYK
LSAgICBtX3JlY3Quc2V0V2lkdGgod2lkdGgpOwotfQotCi1pbmxpbmUgdm9pZCBJbmxpbmVSZWN0
OjpzZXRIZWlnaHQoSW5saW5lTGF5b3V0VW5pdCBoZWlnaHQpCi17Ci0jaWYgQVNTRVJUX0VOQUJM
RUQKLSAgICBtX2hhc1ZhbGlkSGVpZ2h0ID0gdHJ1ZTsKLSNlbmRpZgotICAgIG1fcmVjdC5zZXRI
ZWlnaHQoaGVpZ2h0KTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6bW92ZUhvcml6b250
YWxseShJbmxpbmVMYXlvdXRVbml0IG9mZnNldCkKLXsKLSAgICBBU1NFUlQobV9oYXNWYWxpZExl
ZnQpOwotICAgIG1fcmVjdC5tb3ZlKElubGluZUxheW91dFNpemUgeyBvZmZzZXQsIDAgfSk7Ci19
Ci0KLWlubGluZSB2b2lkIElubGluZVJlY3Q6Om1vdmVWZXJ0aWNhbGx5KElubGluZUxheW91dFVu
aXQgb2Zmc2V0KQotewotICAgIEFTU0VSVChtX2hhc1ZhbGlkVG9wKTsKLSAgICBtX3JlY3QubW92
ZShJbmxpbmVMYXlvdXRTaXplIHsgMCwgb2Zmc2V0IH0pOwotfQotCi1pbmxpbmUgdm9pZCBJbmxp
bmVSZWN0Ojptb3ZlQnkoSW5saW5lTGF5b3V0UG9pbnQgb2Zmc2V0KQotewotICAgIEFTU0VSVCht
X2hhc1ZhbGlkVG9wKTsKLSAgICBBU1NFUlQobV9oYXNWYWxpZExlZnQpOwotICAgIG1fcmVjdC5t
b3ZlQnkob2Zmc2V0KTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6ZXhwYW5kKE9wdGlv
bmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRoLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiBo
ZWlnaHQpCi17Ci0gICAgQVNTRVJUKCF3aWR0aCB8fCBtX2hhc1ZhbGlkV2lkdGgpOwotICAgIEFT
U0VSVCghaGVpZ2h0IHx8IG1faGFzVmFsaWRIZWlnaHQpOwotICAgIG1fcmVjdC5leHBhbmQod2lk
dGgudmFsdWVPcigwKSwgaGVpZ2h0LnZhbHVlT3IoMCkpOwotfQotCi1pbmxpbmUgdm9pZCBJbmxp
bmVSZWN0OjpleHBhbmRUb0NvbnRhaW4oY29uc3QgSW5saW5lUmVjdCYgb3RoZXIpCi17Ci0jaWYg
QVNTRVJUX0VOQUJMRUQKLSAgICBtX2hhc1ZhbGlkVG9wID0gdHJ1ZTsKLSAgICBtX2hhc1ZhbGlk
TGVmdCA9IHRydWU7Ci0gICAgbV9oYXNWYWxpZFdpZHRoID0gdHJ1ZTsKLSAgICBtX2hhc1ZhbGlk
SGVpZ2h0ID0gdHJ1ZTsKLSNlbmRpZgotICAgIG1fcmVjdC51bml0ZUV2ZW5JZkVtcHR5KG90aGVy
KTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVjdDo6ZXhwYW5kVmVydGljYWxseVRvQ29udGFp
bihjb25zdCBJbmxpbmVSZWN0JiBvdGhlcikKLXsKLSAgICBhdXRvIGNvbnRhaW5Ub3AgPSBzdGQ6
Om1pbih0b3AoKSwgb3RoZXIudG9wKCkpOwotICAgIGF1dG8gY29udGFpbkJvdHRvbSA9IHN0ZDo6
bWF4KGJvdHRvbSgpLCBvdGhlci5ib3R0b20oKSk7Ci0gICAgc2V0VG9wKGNvbnRhaW5Ub3ApOwot
ICAgIHNldEJvdHRvbShjb250YWluQm90dG9tKTsKLX0KLQotaW5saW5lIHZvaWQgSW5saW5lUmVj
dDo6aW5mbGF0ZShJbmxpbmVMYXlvdXRVbml0IGluZmxhdGUpCi17Ci0gICAgQVNTRVJUKGhhc1Zh
bGlkR2VvbWV0cnkoKSk7Ci0gICAgbV9yZWN0LmluZmxhdGUoaW5mbGF0ZSk7Ci19Ci0KLWlubGlu
ZSBJbmxpbmVSZWN0OjpvcGVyYXRvciBJbmxpbmVMYXlvdXRSZWN0KCkgY29uc3QKLXsKLSAgICBB
U1NFUlQoaGFzVmFsaWRHZW9tZXRyeSgpKTsgCi0gICAgcmV0dXJuIG1fcmVjdDsKLX0KLQotfQot
fQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL2lubGluZWZvcm1hdHRpbmcvSW5saW5lU29mdExpbmVCcmVha0l0ZW0uaCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9Jbmxp
bmVTb2Z0TGluZUJyZWFrSXRlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWEw
NmZiY2RkMTc4MjQyYmFiNTQ3M2E5NGExM2FjMzBiYzc5NzBiLi4wMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVTb2Z0TGluZUJyZWFrSXRlbS5oCisr
KyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBB
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
bmVJdGVtLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1j
bGFzcyBJbmxpbmVTb2Z0TGluZUJyZWFrSXRlbSA6IHB1YmxpYyBJbmxpbmVJdGVtIHsKLXB1Ymxp
YzoKLSAgICBzdGF0aWMgSW5saW5lU29mdExpbmVCcmVha0l0ZW0gY3JlYXRlU29mdExpbmVCcmVh
a0l0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHBvc2l0aW9uKTsKLQotICAgIHVu
c2lnbmVkIHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9zdGFydE9yUG9zaXRpb247IH0KLSAg
ICBjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94KCkgY29uc3QgeyByZXR1cm4gZG93
bmNhc3Q8SW5saW5lVGV4dEJveD4obGF5b3V0Qm94KCkpOyB9Ci0KLSAgICBJbmxpbmVTb2Z0TGlu
ZUJyZWFrSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWduZWQgcG9zaXRpb24pOwotfTsK
LQotaW5saW5lIElubGluZVNvZnRMaW5lQnJlYWtJdGVtIElubGluZVNvZnRMaW5lQnJlYWtJdGVt
OjpjcmVhdGVTb2Z0TGluZUJyZWFrSXRlbShjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0
Qm94LCB1bnNpZ25lZCBwb3NpdGlvbikKLXsKLSAgICByZXR1cm4geyBpbmxpbmVUZXh0Qm94LCBw
b3NpdGlvbiB9OwotfQotCi1pbmxpbmUgSW5saW5lU29mdExpbmVCcmVha0l0ZW06OklubGluZVNv
ZnRMaW5lQnJlYWtJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRCb3gsIHVuc2ln
bmVkIHBvc2l0aW9uKQotICAgIDogSW5saW5lSXRlbShpbmxpbmVUZXh0Qm94LCBUeXBlOjpTb2Z0
TGluZUJyZWFrKQotewotICAgIG1fc3RhcnRPclBvc2l0aW9uID0gcG9zaXRpb247Ci19Ci0KLX0K
LX0KLQotU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19JTkxJTkVfSVRFTShJbmxpbmVTb2Z0TGluZUJy
ZWFrSXRlbSwgaXNTb2Z0TGluZUJyZWFrKCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGlu
ZVRleHRJdGVtLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMv
aW5saW5lZm9ybWF0dGluZy9JbmxpbmVUZXh0SXRlbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDljNzM3YWYwYmRiYTk1YTVmNDA1ZWNiNDk0NWZjY2QxOWNkOGJjMzkuLjAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUv
bGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL0lubGluZVRleHRJdGVt
LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1
ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklubGluZVRleHRJdGVtLmgiCi0KLSNpZiBFTkFCTEUo
TEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCi0j
aW5jbHVkZSAiSW5saW5lU29mdExpbmVCcmVha0l0ZW0uaCIKLSNpbmNsdWRlICJUZXh0VXRpbC5o
IgotI2luY2x1ZGUgPHd0Zi91bmljb2RlL0NoYXJhY3Rlck5hbWVzLmg+Ci0KLW5hbWVzcGFjZSBX
ZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1zdGF0aWNfYXNzZXJ0KHNpemVvZihJbmxp
bmVJdGVtKSA9PSBzaXplb2YoSW5saW5lVGV4dEl0ZW0pLCAiIik7Ci0KLXN0cnVjdCBXaGl0ZXNw
YWNlQ29udGVudCB7Ci0gICAgc2l6ZV90IGxlbmd0aCB7IDAgfTsKLSAgICBib29sIGlzV29yZFNl
cGFyYXRvciB7IHRydWUgfTsKLX07Ci1zdGF0aWMgT3B0aW9uYWw8V2hpdGVzcGFjZUNvbnRlbnQ+
IG1vdmVUb05leHROb25XaGl0ZXNwYWNlUG9zaXRpb24oY29uc3QgU3RyaW5nVmlldyYgdGV4dENv
bnRlbnQsIHNpemVfdCBzdGFydFBvc2l0aW9uLCBib29sIHByZXNlcnZlTmV3bGluZSwgYm9vbCBw
cmVzZXJ2ZVRhYikKLXsKLSAgICBhdXRvIGhhc1dvcmRTZXBhcmF0b3JDaGFyYWN0ZXIgPSBmYWxz
ZTsKLSAgICBhdXRvIGlzV2hpdGVzcGFjZUNoYXJhY3RlciA9IFsmXShhdXRvIGNoYXJhY3Rlcikg
ewotICAgICAgICAvLyB3aGl0ZSBzcGFjZSBwcm9jZXNzaW5nIGluIENTUyBhZmZlY3RzIG9ubHkg
dGhlIGRvY3VtZW50IHdoaXRlIHNwYWNlIGNoYXJhY3RlcnM6IHNwYWNlcyAoVSswMDIwKSwgdGFi
cyAoVSswMDA5KSwgYW5kIHNlZ21lbnQgYnJlYWtzLgotICAgICAgICBhdXRvIGlzVHJlYXRlZEFz
U3BhY2VDaGFyYWN0ZXIgPSBjaGFyYWN0ZXIgPT0gc3BhY2UgfHwgKGNoYXJhY3RlciA9PSBuZXds
aW5lQ2hhcmFjdGVyICYmICFwcmVzZXJ2ZU5ld2xpbmUpIHx8IChjaGFyYWN0ZXIgPT0gdGFiQ2hh
cmFjdGVyICYmICFwcmVzZXJ2ZVRhYik7Ci0gICAgICAgIGhhc1dvcmRTZXBhcmF0b3JDaGFyYWN0
ZXIgPSBoYXNXb3JkU2VwYXJhdG9yQ2hhcmFjdGVyIHx8IGlzVHJlYXRlZEFzU3BhY2VDaGFyYWN0
ZXI7Ci0gICAgICAgIHJldHVybiBpc1RyZWF0ZWRBc1NwYWNlQ2hhcmFjdGVyIHx8IGNoYXJhY3Rl
ciA9PSB0YWJDaGFyYWN0ZXI7Ci0gICAgfTsKLSAgICBhdXRvIG5leHROb25XaGl0ZVNwYWNlUG9z
aXRpb24gPSBzdGFydFBvc2l0aW9uOwotICAgIHdoaWxlIChuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0
aW9uIDwgdGV4dENvbnRlbnQubGVuZ3RoKCkgJiYgaXNXaGl0ZXNwYWNlQ2hhcmFjdGVyKHRleHRD
b250ZW50W25leHROb25XaGl0ZVNwYWNlUG9zaXRpb25dKSkKLSAgICAgICAgKytuZXh0Tm9uV2hp
dGVTcGFjZVBvc2l0aW9uOwotICAgIHJldHVybiBuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uID09
IHN0YXJ0UG9zaXRpb24gPyBXVEY6Om51bGxvcHQgOiBtYWtlT3B0aW9uYWwoV2hpdGVzcGFjZUNv
bnRlbnQgeyBuZXh0Tm9uV2hpdGVTcGFjZVBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiwgaGFzV29y
ZFNlcGFyYXRvckNoYXJhY3RlciB9KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIG1vdmVUb05leHRC
cmVha2FibGVQb3NpdGlvbih1bnNpZ25lZCBzdGFydFBvc2l0aW9uLCBMYXp5TGluZUJyZWFrSXRl
cmF0b3ImIGxpbmVCcmVha0l0ZXJhdG9yLCBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUpCi17Ci0g
ICAgYXV0byB0ZXh0TGVuZ3RoID0gbGluZUJyZWFrSXRlcmF0b3Iuc3RyaW5nVmlldygpLmxlbmd0
aCgpOwotICAgIGF1dG8gc3RhcnRQb3NpdGlvbkZvck5leHRCcmVha2FibGVQb3NpdGlvbiA9IHN0
YXJ0UG9zaXRpb247Ci0gICAgd2hpbGUgKHN0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxlUG9z
aXRpb24gPCB0ZXh0TGVuZ3RoKSB7Ci0gICAgICAgIGF1dG8gbmV4dEJyZWFrYWJsZVBvc2l0aW9u
ID0gVGV4dFV0aWw6OmZpbmROZXh0QnJlYWthYmxlUG9zaXRpb24obGluZUJyZWFrSXRlcmF0b3Is
IHN0YXJ0UG9zaXRpb25Gb3JOZXh0QnJlYWthYmxlUG9zaXRpb24sIHN0eWxlKTsKLSAgICAgICAg
Ly8gT2Z0ZW50aW1lcyB0aGUgbmV4dCBicmVha2FibGUgcG9zaXRpb24gY29tZXMgYmFjayBhcyB0
aGUgc3RhcnQgcG9zaXRpb24gKG1vc3Qgbm90YWJseSBoeXBoZW5zKS4KLSAgICAgICAgaWYgKG5l
eHRCcmVha2FibGVQb3NpdGlvbiAhPSBzdGFydFBvc2l0aW9uKQotICAgICAgICAgICAgcmV0dXJu
IG5leHRCcmVha2FibGVQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb247Ci0gICAgICAgICsrc3RhcnRQ
b3NpdGlvbkZvck5leHRCcmVha2FibGVQb3NpdGlvbjsKLSAgICB9Ci0gICAgcmV0dXJuIHRleHRM
ZW5ndGggLSBzdGFydFBvc2l0aW9uOwotfQotCi12b2lkIElubGluZVRleHRJdGVtOjpjcmVhdGVB
bmRBcHBlbmRUZXh0SXRlbXMoSW5saW5lSXRlbXMmIGlubGluZUNvbnRlbnQsIGNvbnN0IElubGlu
ZVRleHRCb3gmIGlubGluZVRleHRCb3gpCi17Ci0gICAgYXV0byB0ZXh0ID0gaW5saW5lVGV4dEJv
eC5jb250ZW50KCk7Ci0gICAgaWYgKCF0ZXh0Lmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gaW5s
aW5lQ29udGVudC5hcHBlbmQoSW5saW5lVGV4dEl0ZW06OmNyZWF0ZUVtcHR5SXRlbShpbmxpbmVU
ZXh0Qm94KSk7Ci0KLSAgICBhdXRvJiBzdHlsZSA9IGlubGluZVRleHRCb3guc3R5bGUoKTsKLSAg
ICBhdXRvJiBmb250ID0gc3R5bGUuZm9udENhc2NhZGUoKTsKLSAgICBhdXRvIHdoaXRlc3BhY2VD
b250ZW50SXNUcmVhdGVkQXNTaW5nbGVTcGFjZSA9ICFUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVT
cGFjZXNBbmRUYWJzKGlubGluZVRleHRCb3gpOwotICAgIGF1dG8gc2hvdWxkUHJlc2VydmVOZXds
aW5lID0gVGV4dFV0aWw6OnNob3VsZFByZXNlcnZlTmV3bGluZShpbmxpbmVUZXh0Qm94KTsKLSAg
ICBhdXRvIGxpbmVCcmVha0l0ZXJhdG9yID0gTGF6eUxpbmVCcmVha0l0ZXJhdG9yIHsgdGV4dCwg
c3R5bGUuY29tcHV0ZWRMb2NhbGUoKSwgVGV4dFV0aWw6OmxpbmVCcmVha0l0ZXJhdG9yTW9kZShz
dHlsZS5saW5lQnJlYWsoKSkgfTsKLSAgICB1bnNpZ25lZCBjdXJyZW50UG9zaXRpb24gPSAwOwot
Ci0gICAgYXV0byBpbmxpbmVJdGVtV2lkdGggPSBbJl0oYXV0byBzdGFydFBvc2l0aW9uLCBhdXRv
IGxlbmd0aCkgLT4gT3B0aW9uYWw8SW5saW5lTGF5b3V0VW5pdD4gewotICAgICAgICBpZiAoIWlu
bGluZVRleHRCb3guY2FuVXNlU2ltcGxpZmllZENvbnRlbnRNZWFzdXJpbmcoKSkKLSAgICAgICAg
ICAgIHJldHVybiB7IH07Ci0gICAgICAgIHJldHVybiBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4
dEJveCwgc3RhcnRQb3NpdGlvbiwgc3RhcnRQb3NpdGlvbiArIGxlbmd0aCwgeyB9KTsKLSAgICB9
OwotCi0gICAgd2hpbGUgKGN1cnJlbnRQb3NpdGlvbiA8IHRleHQubGVuZ3RoKCkpIHsKLSAgICAg
ICAgYXV0byBpc1NlZ21lbnRCcmVha0NhbmRpZGF0ZSA9IFtdKGF1dG8gY2hhcmFjdGVyKSB7Ci0g
ICAgICAgICAgICByZXR1cm4gY2hhcmFjdGVyID09ICdcbic7Ci0gICAgICAgIH07Ci0KLSAgICAg
ICAgLy8gU2VnbWVudCBicmVha3Mgd2l0aCBwcmVzZXJ2ZSBuZXcgbGluZSBzdHlsZSAod2hpdGUt
c3BhY2U6IHByZSwgcHJlLXdyYXAsIGJyZWFrLXNwYWNlcyBhbmQgcHJlLWxpbmUpIGNvbXB1dGUg
dG8gZm9yY2VkIGxpbmUgYnJlYWsuCi0gICAgICAgIGlmIChpc1NlZ21lbnRCcmVha0NhbmRpZGF0
ZSh0ZXh0W2N1cnJlbnRQb3NpdGlvbl0pICYmIHNob3VsZFByZXNlcnZlTmV3bGluZSkgewotICAg
ICAgICAgICAgaW5saW5lQ29udGVudC5hcHBlbmQoSW5saW5lU29mdExpbmVCcmVha0l0ZW06OmNy
ZWF0ZVNvZnRMaW5lQnJlYWtJdGVtKGlubGluZVRleHRCb3gsIGN1cnJlbnRQb3NpdGlvbikpOwot
ICAgICAgICAgICAgKytjdXJyZW50UG9zaXRpb247Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgfQotCi0gICAgICAgIGlmIChhdXRvIHdoaXRlc3BhY2VDb250ZW50ID0gbW92ZVRvTmV4
dE5vbldoaXRlc3BhY2VQb3NpdGlvbih0ZXh0LCBjdXJyZW50UG9zaXRpb24sIHNob3VsZFByZXNl
cnZlTmV3bGluZSwgIXdoaXRlc3BhY2VDb250ZW50SXNUcmVhdGVkQXNTaW5nbGVTcGFjZSkpIHsK
LSAgICAgICAgICAgIEFTU0VSVCh3aGl0ZXNwYWNlQ29udGVudC0+bGVuZ3RoKTsKLSAgICAgICAg
ICAgIGF1dG8gYXBwZW5kV2hpdGVzcGFjZUl0ZW0gPSBbJl0gKGF1dG8gc3RhcnRQb3NpdGlvbiwg
YXV0byBpdGVtTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBzaW1wbGVTaW5nbGVXaGl0
ZXNwYWNlQ29udGVudCA9IGlubGluZVRleHRCb3guY2FuVXNlU2ltcGxpZmllZENvbnRlbnRNZWFz
dXJpbmcoKSAmJiAoaXRlbUxlbmd0aCA9PSAxIHx8IHdoaXRlc3BhY2VDb250ZW50SXNUcmVhdGVk
QXNTaW5nbGVTcGFjZSk7Ci0gICAgICAgICAgICAgICAgYXV0byB3aWR0aCA9IHNpbXBsZVNpbmds
ZVdoaXRlc3BhY2VDb250ZW50ID8gbWFrZU9wdGlvbmFsKElubGluZUxheW91dFVuaXQgeyBmb250
LnNwYWNlV2lkdGgoKSB9KSA6IGlubGluZUl0ZW1XaWR0aChzdGFydFBvc2l0aW9uLCBpdGVtTGVu
Z3RoKTsKLSAgICAgICAgICAgICAgICBpbmxpbmVDb250ZW50LmFwcGVuZChJbmxpbmVUZXh0SXRl
bTo6Y3JlYXRlV2hpdGVzcGFjZUl0ZW0oaW5saW5lVGV4dEJveCwgc3RhcnRQb3NpdGlvbiwgaXRl
bUxlbmd0aCwgd2hpdGVzcGFjZUNvbnRlbnQtPmlzV29yZFNlcGFyYXRvciwgd2lkdGgpKTsKLSAg
ICAgICAgICAgIH07Ci0gICAgICAgICAgICBpZiAoc3R5bGUud2hpdGVTcGFjZSgpID09IFdoaXRl
U3BhY2U6OkJyZWFrU3BhY2VzKSB7Ci0gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMu
b3JnL1RSL2Nzcy10ZXh0LTMvI3doaXRlLXNwYWNlLXBoYXNlLTEKLSAgICAgICAgICAgICAgICAv
LyBGb3IgYnJlYWstc3BhY2VzLCBhIHNvZnQgd3JhcCBvcHBvcnR1bml0eSBleGlzdHMgYWZ0ZXIg
ZXZlcnkgc3BhY2UgYW5kIGV2ZXJ5IHRhYi4KLSAgICAgICAgICAgICAgICAvLyBGSVhNRTogaWYg
dGhpcyB0dXJucyBvdXQgdG8gYmUgYSBwZXJmIGhpdCB3aXRoIHRvbyBtYW55IGluZGl2aWR1YWwg
d2hpdGVzcGFjZSBpbmxpbmUgaXRlbXMsIHdlIHNob3VsZCB0cmFuc2l0aW9uIHRoaXMgbG9naWMg
dG8gbGluZSBicmVha2luZy4KLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHdoaXRlc3BhY2VDb250ZW50LT5sZW5ndGg7ICsraSkKLSAgICAgICAgICAgICAgICAgICAgYXBw
ZW5kV2hpdGVzcGFjZUl0ZW0oY3VycmVudFBvc2l0aW9uICsgaSwgMSk7Ci0gICAgICAgICAgICB9
IGVsc2UKLSAgICAgICAgICAgICAgICBhcHBlbmRXaGl0ZXNwYWNlSXRlbShjdXJyZW50UG9zaXRp
b24sIHdoaXRlc3BhY2VDb250ZW50LT5sZW5ndGgpOwotICAgICAgICAgICAgY3VycmVudFBvc2l0
aW9uICs9IHdoaXRlc3BhY2VDb250ZW50LT5sZW5ndGg7Ci0gICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gaGFzVHJhaWxpbmdTb2Z0SHlwaGVuID0gZmFsc2U7
Ci0gICAgICAgIGF1dG8gaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiA9IGN1cnJlbnRQb3Np
dGlvbjsKLSAgICAgICAgYXV0byBpc0F0U29mdEh5cGhlbiA9IFsmXShhdXRvIHBvc2l0aW9uKSB7
Ci0gICAgICAgICAgICByZXR1cm4gdGV4dFtwb3NpdGlvbl0gPT0gc29mdEh5cGhlbjsKLSAgICAg
ICAgfTsKLSAgICAgICAgaWYgKHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBoZW5zOjpOb25lKSB7Ci0g
ICAgICAgICAgICAvLyBMZXQncyBtZXJnZSBjYW5kaWRhdGUgSW5saW5lVGV4dEl0ZW1zIHNlcGFy
YXRlZCBieSBzb2Z0IGh5cGhlbiB3aGVuIHRoZSBzdHlsZSBzYXlzIHNvLgotICAgICAgICAgICAg
d2hpbGUgKGN1cnJlbnRQb3NpdGlvbiA8IHRleHQubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAg
ICBhdXRvIG5vbldoaXRlU3BhY2VMZW5ndGggPSBtb3ZlVG9OZXh0QnJlYWthYmxlUG9zaXRpb24o
Y3VycmVudFBvc2l0aW9uLCBsaW5lQnJlYWtJdGVyYXRvciwgc3R5bGUpOwotICAgICAgICAgICAg
ICAgIEFTU0VSVChub25XaGl0ZVNwYWNlTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50
UG9zaXRpb24gKz0gbm9uV2hpdGVTcGFjZUxlbmd0aDsKLSAgICAgICAgICAgICAgICBpZiAoIWlz
QXRTb2Z0SHlwaGVuKGN1cnJlbnRQb3NpdGlvbiAtIDEpKQotICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF1dG8g
bm9uV2hpdGVTcGFjZUxlbmd0aCA9IG1vdmVUb05leHRCcmVha2FibGVQb3NpdGlvbihpbml0aWFs
Tm9uV2hpdGVzcGFjZVBvc2l0aW9uLCBsaW5lQnJlYWtJdGVyYXRvciwgc3R5bGUpOwotICAgICAg
ICAgICAgQVNTRVJUKG5vbldoaXRlU3BhY2VMZW5ndGgpOwotICAgICAgICAgICAgY3VycmVudFBv
c2l0aW9uICs9IG5vbldoaXRlU3BhY2VMZW5ndGg7Ci0gICAgICAgICAgICBoYXNUcmFpbGluZ1Nv
ZnRIeXBoZW4gPSBpc0F0U29mdEh5cGhlbihjdXJyZW50UG9zaXRpb24gLSAxKTsKLSAgICAgICAg
fQotICAgICAgICBBU1NFUlQoaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiA8IGN1cnJlbnRQ
b3NpdGlvbik7Ci0gICAgICAgIEFTU0VSVF9JTVBMSUVTKHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBo
ZW5zOjpOb25lLCAhaGFzVHJhaWxpbmdTb2Z0SHlwaGVuKTsKLSAgICAgICAgYXV0byBsZW5ndGgg
PSBjdXJyZW50UG9zaXRpb24gLSBpbml0aWFsTm9uV2hpdGVzcGFjZVBvc2l0aW9uOwotICAgICAg
ICBpbmxpbmVDb250ZW50LmFwcGVuZChJbmxpbmVUZXh0SXRlbTo6Y3JlYXRlTm9uV2hpdGVzcGFj
ZUl0ZW0oaW5saW5lVGV4dEJveCwgaW5pdGlhbE5vbldoaXRlc3BhY2VQb3NpdGlvbiwgbGVuZ3Ro
LCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIGlubGluZUl0ZW1XaWR0aChpbml0aWFsTm9uV2hpdGVz
cGFjZVBvc2l0aW9uLCBsZW5ndGgpKSk7Ci0gICAgfQotfQotCi1ib29sIElubGluZVRleHRJdGVt
Ojppc0VtcHR5Q29udGVudCgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IFdlIHNob3VsZCBjaGVj
ayBmb3IgbW9yZSB6ZXJvIHdpZHRoIGNvbnRlbnQgYW5kIG5vdCBqdXN0IFUrMjAwQi4KLSAgICBy
ZXR1cm4gIW1fbGVuZ3RoIHx8IChtX2xlbmd0aCA9PSAxICYmIGlubGluZVRleHRCb3goKS5jb250
ZW50KClbc3RhcnQoKV0gPT0gemVyb1dpZHRoU3BhY2UpOyAKLX0KLQotYm9vbCBJbmxpbmVUZXh0
SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGNvbnN0IElubGluZVRleHRJdGVtJiBp
bmxpbmVUZXh0SXRlbSkKLXsKLSAgICBBU1NFUlQoaW5saW5lVGV4dEl0ZW0uaXNXaGl0ZXNwYWNl
KCkpOwotICAgIHJldHVybiBUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRUYWJzKGlu
bGluZVRleHRJdGVtLmxheW91dEJveCgpKTsKLX0KLQotfQotfQotI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRp
bmcvSW5saW5lVGV4dEl0ZW0uaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVUZXh0SXRlbS5oCmRlbGV0ZWQgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCA1MmRjOThkY2YwNmExOWFhMDVmYzRhYTBhYTI0ZDk4M2E1YjdjZDE1Li4w
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVUZXh0
SXRlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
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
bHVkZSAiSW5saW5lSXRlbS5oIgotI2luY2x1ZGUgIkxheW91dElubGluZVRleHRCb3guaCIKLQot
bmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLXVzaW5nIElubGluZUl0
ZW1zID0gVmVjdG9yPElubGluZUl0ZW0+OwotCi1jbGFzcyBJbmxpbmVUZXh0SXRlbSA6IHB1Ymxp
YyBJbmxpbmVJdGVtIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgdm9pZCBjcmVhdGVBbmRBcHBlbmRU
ZXh0SXRlbXMoSW5saW5lSXRlbXMmLCBjb25zdCBJbmxpbmVUZXh0Qm94Jik7Ci0KLSAgICB1bnNp
Z25lZCBzdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRPclBvc2l0aW9uOyB9Ci0gICAgdW5z
aWduZWQgZW5kKCkgY29uc3QgeyByZXR1cm4gc3RhcnQoKSArIGxlbmd0aCgpOyB9Ci0gICAgdW5z
aWduZWQgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9sZW5ndGg7IH0KLQotICAgIGJvb2wgaXNX
aGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV90ZXh0SXRlbVR5cGUgPT0gVGV4dEl0ZW1UeXBl
OjpXaGl0ZXNwYWNlOyB9Ci0gICAgYm9vbCBpc1dvcmRTZXBhcmF0b3IoKSBjb25zdCB7IHJldHVy
biBtX2lzV29yZFNlcGFyYXRvcjsgfQotICAgIGJvb2wgaGFzVHJhaWxpbmdTb2Z0SHlwaGVuKCkg
Y29uc3QgeyByZXR1cm4gbV9oYXNUcmFpbGluZ1NvZnRIeXBoZW47IH0KLSAgICBPcHRpb25hbDxJ
bmxpbmVMYXlvdXRVbml0PiB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzV2lkdGggPyBtYWtl
T3B0aW9uYWwobV93aWR0aCkgOiBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB7IH07IH0KLSAg
ICBib29sIGlzRW1wdHlDb250ZW50KCkgY29uc3Q7Ci0KLSAgICBjb25zdCBJbmxpbmVUZXh0Qm94
JiBpbmxpbmVUZXh0Qm94KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8SW5saW5lVGV4dEJveD4o
bGF5b3V0Qm94KCkpOyB9Ci0KLSAgICBJbmxpbmVUZXh0SXRlbSBsZWZ0KHVuc2lnbmVkIGxlbmd0
aCkgY29uc3Q7Ci0gICAgSW5saW5lVGV4dEl0ZW0gcmlnaHQodW5zaWduZWQgbGVuZ3RoKSBjb25z
dDsKLQotICAgIHN0YXRpYyBib29sIHNob3VsZFByZXNlcnZlU3BhY2VzQW5kVGFicyhjb25zdCBJ
bmxpbmVUZXh0SXRlbSYpOwotCi1wcml2YXRlOgotICAgIHVzaW5nIElubGluZUl0ZW06OlRleHRJ
dGVtVHlwZTsKLQotICAgIElubGluZVRleHRJdGVtKGNvbnN0IElubGluZVRleHRCb3gmLCB1bnNp
Z25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIGhhc1RyYWlsaW5nU29mdEh5cGhlbiwg
Ym9vbCBpc1dvcmRTZXBhcmF0b3IsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRoLCBU
ZXh0SXRlbVR5cGUpOwotICAgIGV4cGxpY2l0IElubGluZVRleHRJdGVtKGNvbnN0IElubGluZVRl
eHRCb3gmKTsKLQotICAgIHN0YXRpYyBJbmxpbmVUZXh0SXRlbSBjcmVhdGVXaGl0ZXNwYWNlSXRl
bShjb25zdCBJbmxpbmVUZXh0Qm94JiwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCwg
Ym9vbCBpc1dvcmRTZXBhcmF0b3IsIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRoKTsK
LSAgICBzdGF0aWMgSW5saW5lVGV4dEl0ZW0gY3JlYXRlTm9uV2hpdGVzcGFjZUl0ZW0oY29uc3Qg
SW5saW5lVGV4dEJveCYsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wgaGFz
VHJhaWxpbmdTb2Z0SHlwaGVuLCBPcHRpb25hbDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCk7Ci0g
ICAgc3RhdGljIElubGluZVRleHRJdGVtIGNyZWF0ZUVtcHR5SXRlbShjb25zdCBJbmxpbmVUZXh0
Qm94Jik7Ci19OwotCi1pbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5saW5lVGV4dEl0ZW06OmNyZWF0
ZVdoaXRlc3BhY2VJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRCb3gsIHVuc2ln
bmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wgaXNXb3JkU2VwYXJhdG9yLCBPcHRpb25h
bDxJbmxpbmVMYXlvdXRVbml0PiB3aWR0aCkKLXsKLSAgICByZXR1cm4geyBpbmxpbmVUZXh0Qm94
LCBzdGFydCwgbGVuZ3RoLCBmYWxzZSwgaXNXb3JkU2VwYXJhdG9yLCB3aWR0aCwgVGV4dEl0ZW1U
eXBlOjpXaGl0ZXNwYWNlIH07Ci19Ci0KLWlubGluZSBJbmxpbmVUZXh0SXRlbSBJbmxpbmVUZXh0
SXRlbTo6Y3JlYXRlTm9uV2hpdGVzcGFjZUl0ZW0oY29uc3QgSW5saW5lVGV4dEJveCYgaW5saW5l
VGV4dEJveCwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGxlbmd0aCwgYm9vbCBoYXNUcmFpbGlu
Z1NvZnRIeXBoZW4sIE9wdGlvbmFsPElubGluZUxheW91dFVuaXQ+IHdpZHRoKQotewotICAgIC8v
IEZJWE1FOiBVc2UgdGhlIGZvbGxvd2luZyBsaXN0IG9mIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rl
cnMgdG8gc2V0IHRoZSAiaXNXb3JkU2VwYXJhdG9yIiBiaXQ6IG5vQnJlYWtTcGFjZSwgZXRoaW9w
aWNXb3Jkc3BhY2UsIGFlZ2VhbldvcmRTZXBhcmF0b3JMaW5lIGFlZ2VhbldvcmRTZXBhcmF0b3JE
b3QgdWdhcml0aWNXb3JkRGl2aWRlci4KLSAgICByZXR1cm4geyBpbmxpbmVUZXh0Qm94LCBzdGFy
dCwgbGVuZ3RoLCBoYXNUcmFpbGluZ1NvZnRIeXBoZW4sIGZhbHNlLCB3aWR0aCwgVGV4dEl0ZW1U
eXBlOjpOb25XaGl0ZXNwYWNlIH07Ci19Ci0KLWlubGluZSBJbmxpbmVUZXh0SXRlbSBJbmxpbmVU
ZXh0SXRlbTo6Y3JlYXRlRW1wdHlJdGVtKGNvbnN0IElubGluZVRleHRCb3gmIGlubGluZVRleHRC
b3gpCi17Ci0gICAgcmV0dXJuIElubGluZVRleHRJdGVtIHsgaW5saW5lVGV4dEJveCB9OwotfQot
Ci1pbmxpbmUgSW5saW5lVGV4dEl0ZW06OklubGluZVRleHRJdGVtKGNvbnN0IElubGluZVRleHRC
b3gmIGlubGluZVRleHRCb3gsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wg
aGFzVHJhaWxpbmdTb2Z0SHlwaGVuLCBib29sIGlzV29yZFNlcGFyYXRvciwgT3B0aW9uYWw8SW5s
aW5lTGF5b3V0VW5pdD4gd2lkdGgsIFRleHRJdGVtVHlwZSB0ZXh0SXRlbVR5cGUpCi0gICAgOiBJ
bmxpbmVJdGVtKGlubGluZVRleHRCb3gsIFR5cGU6OlRleHQpCi17Ci0gICAgbV9zdGFydE9yUG9z
aXRpb24gPSBzdGFydDsKLSAgICBtX2xlbmd0aCA9IGxlbmd0aDsKLSAgICBtX2hhc1dpZHRoID0g
ISF3aWR0aDsKLSAgICBtX2hhc1RyYWlsaW5nU29mdEh5cGhlbiA9IGhhc1RyYWlsaW5nU29mdEh5
cGhlbjsKLSAgICBtX2lzV29yZFNlcGFyYXRvciA9IGlzV29yZFNlcGFyYXRvcjsKLSAgICBtX3dp
ZHRoID0gd2lkdGgudmFsdWVPcigwKTsKLSAgICBtX3RleHRJdGVtVHlwZSA9IHRleHRJdGVtVHlw
ZTsKLX0KLQotaW5saW5lIElubGluZVRleHRJdGVtOjpJbmxpbmVUZXh0SXRlbShjb25zdCBJbmxp
bmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94KQotICAgIDogSW5saW5lSXRlbShpbmxpbmVUZXh0Qm94
LCBUeXBlOjpUZXh0KQotewotfQotCi1pbmxpbmUgSW5saW5lVGV4dEl0ZW0gSW5saW5lVGV4dEl0
ZW06OmxlZnQodW5zaWduZWQgbGVuZ3RoKSBjb25zdAotewotICAgIFJFTEVBU0VfQVNTRVJUKGxl
bmd0aCA8PSB0aGlzLT5sZW5ndGgoKSk7Ci0gICAgQVNTRVJUKG1fdGV4dEl0ZW1UeXBlICE9IFRl
eHRJdGVtVHlwZTo6VW5kZWZpbmVkKTsKLSAgICBBU1NFUlQobGVuZ3RoKTsKLSAgICByZXR1cm4g
eyBpbmxpbmVUZXh0Qm94KCksIHN0YXJ0KCksIGxlbmd0aCwgZmFsc2UsIGlzV29yZFNlcGFyYXRv
cigpLCBXVEY6Om51bGxvcHQsIG1fdGV4dEl0ZW1UeXBlIH07Ci19Ci0KLWlubGluZSBJbmxpbmVU
ZXh0SXRlbSBJbmxpbmVUZXh0SXRlbTo6cmlnaHQodW5zaWduZWQgbGVuZ3RoKSBjb25zdAotewot
ICAgIFJFTEVBU0VfQVNTRVJUKGxlbmd0aCA8PSB0aGlzLT5sZW5ndGgoKSk7Ci0gICAgQVNTRVJU
KG1fdGV4dEl0ZW1UeXBlICE9IFRleHRJdGVtVHlwZTo6VW5kZWZpbmVkKTsKLSAgICBBU1NFUlQo
bGVuZ3RoKTsKLSAgICByZXR1cm4geyBpbmxpbmVUZXh0Qm94KCksIGVuZCgpIC0gbGVuZ3RoLCBs
ZW5ndGgsIGhhc1RyYWlsaW5nU29mdEh5cGhlbigpLCBpc1dvcmRTZXBhcmF0b3IoKSwgV1RGOjpu
dWxsb3B0LCBtX3RleHRJdGVtVHlwZSB9OwotfQotCi19Ci19Ci0KLVNQRUNJQUxJWkVfVFlQRV9U
UkFJVFNfSU5MSU5FX0lURU0oSW5saW5lVGV4dEl0ZW0sIGlzVGV4dCgpKQotCi0jZW5kaWYKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvaW5saW5l
Zm9ybWF0dGluZy90ZXh0L1RleHRVdGlsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRVdGlsLmNwcApkZWxldGVk
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U1NzViY2U3Mjg1M2E4YzlkYmYzNjJmNGZjOWIxOTk3
NmFiMjUyMC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL2lubGluZWZvcm1hdHRpbmcv
dGV4dC9UZXh0VXRpbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
Ci0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgot
ICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJUZXh0VXRpbC5oIgotCi0jaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJCcmVha0xpbmVz
LmgiCi0jaW5jbHVkZSAiRm9udENhc2NhZGUuaCIKLSNpbmNsdWRlICJJbmxpbmVUZXh0SXRlbS5o
IgotI2luY2x1ZGUgIkxheW91dElubGluZVRleHRCb3guaCIKLSNpbmNsdWRlICJSZW5kZXJCb3gu
aCIKLSNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1l
c3BhY2UgTGF5b3V0IHsKLQotSW5saW5lTGF5b3V0VW5pdCBUZXh0VXRpbDo6d2lkdGgoY29uc3Qg
SW5saW5lVGV4dEl0ZW0mIGlubGluZVRleHRJdGVtLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRM
b2dpY2FsTGVmdCkKLXsKLSAgICByZXR1cm4gVGV4dFV0aWw6OndpZHRoKGlubGluZVRleHRJdGVt
LCBpbmxpbmVUZXh0SXRlbS5zdGFydCgpLCBpbmxpbmVUZXh0SXRlbS5lbmQoKSwgY29udGVudExv
Z2ljYWxMZWZ0KTsKLX0KLQotSW5saW5lTGF5b3V0VW5pdCBUZXh0VXRpbDo6d2lkdGgoY29uc3Qg
SW5saW5lVGV4dEl0ZW0mIGlubGluZVRleHRJdGVtLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0
bywgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpCi17Ci0gICAgUkVMRUFTRV9B
U1NFUlQoZnJvbSA+PSBpbmxpbmVUZXh0SXRlbS5zdGFydCgpKTsKLSAgICBSRUxFQVNFX0FTU0VS
VCh0byA8PSBpbmxpbmVUZXh0SXRlbS5lbmQoKSk7Ci0gICAgaWYgKGlubGluZVRleHRJdGVtLmlz
V2hpdGVzcGFjZSgpICYmICFJbmxpbmVUZXh0SXRlbTo6c2hvdWxkUHJlc2VydmVTcGFjZXNBbmRU
YWJzKGlubGluZVRleHRJdGVtKSkgewotICAgICAgICBhdXRvIHNwYWNlV2lkdGggPSBpbmxpbmVU
ZXh0SXRlbS5zdHlsZSgpLmZvbnRDYXNjYWRlKCkuc3BhY2VXaWR0aCgpOwotICAgICAgICByZXR1
cm4gc3RkOjppc25hbihzcGFjZVdpZHRoKSA/IDAuMGYgOiBzdGQ6OmlzaW5mKHNwYWNlV2lkdGgp
ID8gbWF4SW5saW5lTGF5b3V0VW5pdCgpIDogc3BhY2VXaWR0aDsKLSAgICB9Ci0gICAgcmV0dXJu
IFRleHRVdGlsOjp3aWR0aChpbmxpbmVUZXh0SXRlbS5pbmxpbmVUZXh0Qm94KCksIGZyb20sIHRv
LCBjb250ZW50TG9naWNhbExlZnQpOwotfQotCi1JbmxpbmVMYXlvdXRVbml0IFRleHRVdGlsOjp3
aWR0aChjb25zdCBJbmxpbmVUZXh0Qm94JiBpbmxpbmVUZXh0Qm94LCB1bnNpZ25lZCBmcm9tLCB1
bnNpZ25lZCB0bywgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpCi17Ci0gICAg
aWYgKGZyb20gPT0gdG8pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgYXV0byYgc3R5bGUgPSBp
bmxpbmVUZXh0Qm94LnN0eWxlKCk7Ci0gICAgYXV0byYgZm9udCA9IHN0eWxlLmZvbnRDYXNjYWRl
KCk7Ci0gICAgYXV0byB0ZXh0ID0gaW5saW5lVGV4dEJveC5jb250ZW50KCk7Ci0gICAgQVNTRVJU
KHRvIDw9IHRleHQubGVuZ3RoKCkpOwotICAgIGF1dG8gaGFzS2VybmluZ09yTGlnYXR1cmVzID0g
Zm9udC5lbmFibGVLZXJuaW5nKCkgfHwgZm9udC5yZXF1aXJlc1NoYXBpbmcoKTsKLSAgICBhdXRv
IG1lYXN1cmVXaXRoRW5kU3BhY2UgPSBoYXNLZXJuaW5nT3JMaWdhdHVyZXMgJiYgdG8gPCB0ZXh0
Lmxlbmd0aCgpICYmIHRleHRbdG9dID09ICcgJzsKLSAgICBpZiAobWVhc3VyZVdpdGhFbmRTcGFj
ZSkKLSAgICAgICAgKyt0bzsKLSAgICBmbG9hdCB3aWR0aCA9IDA7Ci0gICAgaWYgKGlubGluZVRl
eHRCb3guY2FuVXNlU2ltcGxpZmllZENvbnRlbnRNZWFzdXJpbmcoKSkKLSAgICAgICAgd2lkdGgg
PSBmb250LndpZHRoRm9yU2ltcGxlVGV4dChTdHJpbmdWaWV3KHRleHQpLnN1YnN0cmluZyhmcm9t
LCB0byAtIGZyb20pKTsKLSAgICBlbHNlIHsKLSAgICAgICAgYXV0byB0YWJXaWR0aCA9IHN0eWxl
LmNvbGxhcHNlV2hpdGVTcGFjZSgpID8gVGFiU2l6ZSgwKSA6IHN0eWxlLnRhYlNpemUoKTsKLSAg
ICAgICAgV2ViQ29yZTo6VGV4dFJ1biBydW4oU3RyaW5nVmlldyh0ZXh0KS5zdWJzdHJpbmcoZnJv
bSwgdG8gLSBmcm9tKSwgY29udGVudExvZ2ljYWxMZWZ0KTsKLSAgICAgICAgaWYgKHRhYldpZHRo
KQotICAgICAgICAgICAgcnVuLnNldFRhYlNpemUodHJ1ZSwgdGFiV2lkdGgpOwotICAgICAgICB3
aWR0aCA9IGZvbnQud2lkdGgocnVuKTsKLSAgICB9Ci0KLSAgICBpZiAobWVhc3VyZVdpdGhFbmRT
cGFjZSkKLSAgICAgICAgd2lkdGggLT0gKGZvbnQuc3BhY2VXaWR0aCgpICsgZm9udC53b3JkU3Bh
Y2luZygpKTsKLQotICAgIHJldHVybiBzdGQ6OmlzbmFuKHdpZHRoKSA/IDAuMGYgOiBzdGQ6Omlz
aW5mKHdpZHRoKSA/IG1heElubGluZUxheW91dFVuaXQoKSA6IHdpZHRoOwotfQotCi1UZXh0VXRp
bDo6U3BsaXREYXRhIFRleHRVdGlsOjpzcGxpdChjb25zdCBJbmxpbmVUZXh0SXRlbSYgaW5saW5l
VGV4dEl0ZW0sIElubGluZUxheW91dFVuaXQgdGV4dFdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGF2
YWlsYWJsZVdpZHRoLCBJbmxpbmVMYXlvdXRVbml0IGNvbnRlbnRMb2dpY2FsTGVmdCkKLXsKLSAg
ICBBU1NFUlQoYXZhaWxhYmxlV2lkdGggPj0gMCk7Ci0gICAgYXV0byBzdGFydFBvc2l0aW9uID0g
aW5saW5lVGV4dEl0ZW0uc3RhcnQoKTsKLSAgICBhdXRvIGxlbmd0aCA9IGlubGluZVRleHRJdGVt
Lmxlbmd0aCgpOwotICAgIEFTU0VSVChsZW5ndGgpOwotCi0gICAgYXV0byBsZWZ0ID0gc3RhcnRQ
b3NpdGlvbjsKLSAgICAvLyBQYXRob2xvZ2ljYWwgY2FzZSBvZiAoZXh0cmVtZWx5KWxvbmcgc3Ry
aW5nIGFuZCBuYXJyb3cgbGluZXMuCi0gICAgLy8gQWRqdXN0IHRoZSByYW5nZSBzbyB0aGF0IHdl
IGNhbiBwaWNrIGEgcmVhc29uYWJsZSBtaWRwb2ludC4KLSAgICBJbmxpbmVMYXlvdXRVbml0IGF2
ZXJhZ2VDaGFyYWN0ZXJXaWR0aCA9IHRleHRXaWR0aCAvIGxlbmd0aDsKLSAgICB1bnNpZ25lZCBv
ZmZzZXQgPSB0b0xheW91dFVuaXQoMiAqIGF2YWlsYWJsZVdpZHRoIC8gYXZlcmFnZUNoYXJhY3Rl
cldpZHRoKS50b1Vuc2lnbmVkKCk7Ci0gICAgYXV0byByaWdodCA9IHN0ZDo6bWluPHVuc2lnbmVk
PihsZWZ0ICsgb2Zmc2V0LCAoc3RhcnRQb3NpdGlvbiArIGxlbmd0aCAtIDEpKTsKLSAgICAvLyBQ
cmVzZXJ2ZSB0aGUgbGVmdCB3aWR0aCBmb3IgdGhlIGZpbmFsIHNwbGl0IHBvc2l0aW9uIHNvIHRo
YXQgd2UgZG9uJ3QgbmVlZCB0byByZW1lYXN1cmUgdGhlIGxlZnQgc2lkZSBhZ2Fpbi4KLSAgICBJ
bmxpbmVMYXlvdXRVbml0IGxlZnRTaWRlV2lkdGggPSAwOwotICAgIHdoaWxlIChsZWZ0IDwgcmln
aHQpIHsKLSAgICAgICAgYXV0byBtaWRkbGUgPSAobGVmdCArIHJpZ2h0KSAvIDI7Ci0gICAgICAg
IGF1dG8gd2lkdGggPSBUZXh0VXRpbDo6d2lkdGgoaW5saW5lVGV4dEl0ZW0sIHN0YXJ0UG9zaXRp
b24sIG1pZGRsZSArIDEsIGNvbnRlbnRMb2dpY2FsTGVmdCk7Ci0gICAgICAgIGlmICh3aWR0aCA8
IGF2YWlsYWJsZVdpZHRoKSB7Ci0gICAgICAgICAgICBsZWZ0ID0gbWlkZGxlICsgMTsKLSAgICAg
ICAgICAgIGxlZnRTaWRlV2lkdGggPSB3aWR0aDsKLSAgICAgICAgfSBlbHNlIGlmICh3aWR0aCA+
IGF2YWlsYWJsZVdpZHRoKQotICAgICAgICAgICAgcmlnaHQgPSBtaWRkbGU7Ci0gICAgICAgIGVs
c2UgewotICAgICAgICAgICAgcmlnaHQgPSBtaWRkbGUgKyAxOwotICAgICAgICAgICAgbGVmdFNp
ZGVXaWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgcmV0dXJuIHsgc3RhcnRQb3NpdGlvbiwgcmlnaHQgLSBzdGFydFBvc2l0aW9uLCBsZWZ0U2lk
ZVdpZHRoIH07Ci19Ci0KLXVuc2lnbmVkIFRleHRVdGlsOjpmaW5kTmV4dEJyZWFrYWJsZVBvc2l0
aW9uKExhenlMaW5lQnJlYWtJdGVyYXRvciYgbGluZUJyZWFrSXRlcmF0b3IsIHVuc2lnbmVkIHN0
YXJ0UG9zaXRpb24sIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSkKLXsKLSAgICBhdXRvIGtlZXBB
bGxXb3Jkc0ZvckNKSyA9IHN0eWxlLndvcmRCcmVhaygpID09IFdvcmRCcmVhazo6S2VlcEFsbDsK
LSAgICBhdXRvIGJyZWFrTkJTUCA9IHN0eWxlLmF1dG9XcmFwKCkgJiYgc3R5bGUubmJzcE1vZGUo
KSA9PSBOQlNQTW9kZTo6U3BhY2U7Ci0KLSAgICBpZiAoa2VlcEFsbFdvcmRzRm9yQ0pLKSB7Ci0g
ICAgICAgIGlmIChicmVha05CU1ApCi0gICAgICAgICAgICByZXR1cm4gbmV4dEJyZWFrYWJsZVBv
c2l0aW9uS2VlcGluZ0FsbFdvcmRzKGxpbmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9uKTsK
LSAgICAgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbktlZXBpbmdBbGxXb3Jkc0lnbm9y
aW5nTkJTUChsaW5lQnJlYWtJdGVyYXRvciwgc3RhcnRQb3NpdGlvbik7Ci0gICAgfQotCi0gICAg
aWYgKGxpbmVCcmVha0l0ZXJhdG9yLm1vZGUoKSA9PSBMaW5lQnJlYWtJdGVyYXRvck1vZGU6OkRl
ZmF1bHQpIHsKLSAgICAgICAgaWYgKGJyZWFrTkJTUCkKLSAgICAgICAgICAgIHJldHVybiBXZWJD
b3JlOjpuZXh0QnJlYWthYmxlUG9zaXRpb24obGluZUJyZWFrSXRlcmF0b3IsIHN0YXJ0UG9zaXRp
b24pOwotICAgICAgICByZXR1cm4gbmV4dEJyZWFrYWJsZVBvc2l0aW9uSWdub3JpbmdOQlNQKGxp
bmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9uKTsKLSAgICB9Ci0KLSAgICBpZiAoYnJlYWtO
QlNQKQotICAgICAgICByZXR1cm4gbmV4dEJyZWFrYWJsZVBvc2l0aW9uV2l0aG91dFNob3J0Y3V0
KGxpbmVCcmVha0l0ZXJhdG9yLCBzdGFydFBvc2l0aW9uKTsKLSAgICByZXR1cm4gbmV4dEJyZWFr
YWJsZVBvc2l0aW9uSWdub3JpbmdOQlNQV2l0aG91dFNob3J0Y3V0KGxpbmVCcmVha0l0ZXJhdG9y
LCBzdGFydFBvc2l0aW9uKTsKLX0KLQotYm9vbCBUZXh0VXRpbDo6c2hvdWxkUHJlc2VydmVTcGFj
ZXNBbmRUYWJzKGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAgIC8vIGh0dHBzOi8vd3d3Lncz
Lm9yZy9UUi9jc3MtdGV4dC0zLyN3aGl0ZS1zcGFjZS1wcm9wZXJ0eQotICAgIGF1dG8gd2hpdGVz
cGFjZSA9IGxheW91dEJveC5zdHlsZSgpLndoaXRlU3BhY2UoKTsKLSAgICByZXR1cm4gd2hpdGVz
cGFjZSA9PSBXaGl0ZVNwYWNlOjpQcmUgfHwgd2hpdGVzcGFjZSA9PSBXaGl0ZVNwYWNlOjpQcmVX
cmFwIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6QnJlYWtTcGFjZXM7Ci19Ci0KLWJvb2wg
VGV4dFV0aWw6OnNob3VsZFByZXNlcnZlTmV3bGluZShjb25zdCBCb3gmIGxheW91dEJveCkKLXsK
LSAgICBhdXRvIHdoaXRlc3BhY2UgPSBsYXlvdXRCb3guc3R5bGUoKS53aGl0ZVNwYWNlKCk7Ci0g
ICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10ZXh0LTMvI3doaXRlLXNwYWNlLXByb3Bl
cnR5Ci0gICAgcmV0dXJuIHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlIHx8IHdoaXRlc3Bh
Y2UgPT0gV2hpdGVTcGFjZTo6UHJlV3JhcCB8fCB3aGl0ZXNwYWNlID09IFdoaXRlU3BhY2U6OkJy
ZWFrU3BhY2VzIHx8IHdoaXRlc3BhY2UgPT0gV2hpdGVTcGFjZTo6UHJlTGluZTsgCi19Ci0KLUxp
bmVCcmVha0l0ZXJhdG9yTW9kZSBUZXh0VXRpbDo6bGluZUJyZWFrSXRlcmF0b3JNb2RlKExpbmVC
cmVhayBsaW5lQnJlYWspCi17Ci0gICAgc3dpdGNoIChsaW5lQnJlYWspIHsKLSAgICBjYXNlIExp
bmVCcmVhazo6QXV0bzoKLSAgICBjYXNlIExpbmVCcmVhazo6QWZ0ZXJXaGl0ZVNwYWNlOgotICAg
IGNhc2UgTGluZUJyZWFrOjpBbnl3aGVyZToKLSAgICAgICAgcmV0dXJuIExpbmVCcmVha0l0ZXJh
dG9yTW9kZTo6RGVmYXVsdDsKLSAgICBjYXNlIExpbmVCcmVhazo6TG9vc2U6Ci0gICAgICAgIHJl
dHVybiBMaW5lQnJlYWtJdGVyYXRvck1vZGU6Okxvb3NlOwotICAgIGNhc2UgTGluZUJyZWFrOjpO
b3JtYWw6Ci0gICAgICAgIHJldHVybiBMaW5lQnJlYWtJdGVyYXRvck1vZGU6Ok5vcm1hbDsKLSAg
ICBjYXNlIExpbmVCcmVhazo6U3RyaWN0OgotICAgICAgICByZXR1cm4gTGluZUJyZWFrSXRlcmF0
b3JNb2RlOjpTdHJpY3Q7Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJl
dHVybiBMaW5lQnJlYWtJdGVyYXRvck1vZGU6OkRlZmF1bHQ7Ci19Ci0KLX0KLX0KLSNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxp
bmVmb3JtYXR0aW5nL3RleHQvVGV4dFV0aWwuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvaW5saW5lZm9ybWF0dGluZy90ZXh0L1RleHRVdGlsLmgKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNTg0ZmE3OTgxYmQ0MzgzY2Y0M2UyM2E0YmZhZWI4MjBj
ZTMyZjIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy9pbmxpbmVmb3JtYXR0aW5nL3Rl
eHQvVGV4dFV0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgot
ICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgot
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAq
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwot
Ci0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQot
Ci0jaW5jbHVkZSAiSW5saW5lSXRlbS5oIgotI2luY2x1ZGUgIkxheW91dFVuaXRzLmgiCi0jaW5j
bHVkZSA8d3RmL3RleHQvVGV4dEJyZWFrSXRlcmF0b3IuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUg
ewotCi1jbGFzcyBSZW5kZXJTdHlsZTsKLQotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIElu
bGluZVRleHRCb3g7Ci1jbGFzcyBJbmxpbmVUZXh0SXRlbTsKLQotY2xhc3MgVGV4dFV0aWwgewot
cHVibGljOgotICAgIHN0YXRpYyBJbmxpbmVMYXlvdXRVbml0IHdpZHRoKGNvbnN0IElubGluZVRl
eHRJdGVtJiwgSW5saW5lTGF5b3V0VW5pdCBjb250ZW50TG9naWNhbExlZnQpOwotICAgIHN0YXRp
YyBJbmxpbmVMYXlvdXRVbml0IHdpZHRoKGNvbnN0IElubGluZVRleHRJdGVtJiwgdW5zaWduZWQg
ZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2ljYWxMZWZ0KTsK
LSAgICBzdGF0aWMgSW5saW5lTGF5b3V0VW5pdCB3aWR0aChjb25zdCBJbmxpbmVUZXh0Qm94Jiwg
dW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIElubGluZUxheW91dFVuaXQgY29udGVudExvZ2lj
YWxMZWZ0KTsKLQotICAgIHN0cnVjdCBTcGxpdERhdGEgewotICAgICAgICB1bnNpZ25lZCBzdGFy
dCB7IDAgfTsKLSAgICAgICAgdW5zaWduZWQgbGVuZ3RoIHsgMCB9OwotICAgICAgICBJbmxpbmVM
YXlvdXRVbml0IGxvZ2ljYWxXaWR0aCB7IDAgfTsKLSAgICB9OwotICAgIHN0YXRpYyBTcGxpdERh
dGEgc3BsaXQoY29uc3QgSW5saW5lVGV4dEl0ZW0mLCBJbmxpbmVMYXlvdXRVbml0IHRleHRXaWR0
aCwgSW5saW5lTGF5b3V0VW5pdCBhdmFpbGFibGVXaWR0aCwgSW5saW5lTGF5b3V0VW5pdCBjb250
ZW50TG9naWNhbExlZnQpOwotCi0gICAgc3RhdGljIHVuc2lnbmVkIGZpbmROZXh0QnJlYWthYmxl
UG9zaXRpb24oTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiwgdW5zaWduZWQgc3RhcnRQb3NpdGlvbiwg
Y29uc3QgUmVuZGVyU3R5bGUmKTsKLSAgICBzdGF0aWMgTGluZUJyZWFrSXRlcmF0b3JNb2RlIGxp
bmVCcmVha0l0ZXJhdG9yTW9kZShMaW5lQnJlYWspOwotCi0gICAgc3RhdGljIGJvb2wgc2hvdWxk
UHJlc2VydmVTcGFjZXNBbmRUYWJzKGNvbnN0IEJveCYpOwotICAgIHN0YXRpYyBib29sIHNob3Vs
ZFByZXNlcnZlTmV3bGluZShjb25zdCBCb3gmKTsKLX07Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZS9UYWJs
ZUZvcm1hdHRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5n
Q29udGV4dHMvdGFibGUvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTAy
YWY3YzVlZDg4ZDUwNGNhYzQyNWExMzUyMTAwOGI2ZTU4YjlhYwotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGUvVGFibGVGb3Jt
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
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlL1RhYmxl
Rm9ybWF0dGluZ0NvbnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29u
dGV4dHMvdGFibGUvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFmMzBkZTEz
NTQ1NjY1NTgxZWI5NDlhMjdiODBkZjRlMTIyMjVlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlL1RhYmxlRm9ybWF0dGlu
Z0NvbnRleHQuaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBB
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
YXR0aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5j
bHVkZSAiVGFibGVHcmlkLmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgorI2luY2x1ZGUg
PHd0Zi9VbmlxdWVSZWYuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91
dCB7CisKK2NsYXNzIEludmFsaWRhdGlvblN0YXRlOworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRz
IHRoZSBsYXlvdXQgbG9naWMgZm9yIHRhYmxlIGZvcm1hdHRpbmcgY29udGV4dHMuCisvLyBodHRw
czovL3d3dy53My5vcmcvVFIvQ1NTMjIvdGFibGVzLmh0bWwKK2NsYXNzIFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQgZmluYWwgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQgeworICAgIFdURl9NQUtF
X0lTT19BTExPQ0FURUQoVGFibGVGb3JtYXR0aW5nQ29udGV4dCk7CitwdWJsaWM6CisgICAgVGFi
bGVGb3JtYXR0aW5nQ29udGV4dChjb25zdCBDb250YWluZXJCb3gmIGZvcm1hdHRpbmdDb250ZXh0
Um9vdCwgVGFibGVGb3JtYXR0aW5nU3RhdGUmKTsKKyAgICB2b2lkIGxheW91dEluRmxvd0NvbnRl
bnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJhaW50c0ZvckluRmxvd0NvbnRlbnQm
KSBvdmVycmlkZTsKKyAgICBMYXlvdXRVbml0IHVzZWRDb250ZW50SGVpZ2h0KCkgY29uc3Qgb3Zl
cnJpZGU7CisKKyAgICBzdGF0aWMgVW5pcXVlUmVmPFRhYmxlR3JpZD4gZW5zdXJlVGFibGVHcmlk
KGNvbnN0IENvbnRhaW5lckJveCYgdGFibGVCb3gpOworCitwcml2YXRlOgorICAgIGNsYXNzIFRh
YmxlTGF5b3V0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRhYmxlTGF5b3V0KGNvbnN0IFRhYmxl
Rm9ybWF0dGluZ0NvbnRleHQmLCBjb25zdCBUYWJsZUdyaWQmKTsKKworICAgICAgICB1c2luZyBE
aXN0cmlidXRlZFNwYWNlcyA9IFZlY3RvcjxMYXlvdXRVbml0PjsKKyAgICAgICAgRGlzdHJpYnV0
ZWRTcGFjZXMgZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2UoTGF5b3V0VW5pdCBhdmFpbGFibGVI
b3Jpem9udGFsU3BhY2UpOworICAgICAgICBEaXN0cmlidXRlZFNwYWNlcyBkaXN0cmlidXRlZFZl
cnRpY2FsU3BhY2UoT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlVmVydGljYWxTcGFjZSk7
CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiBm
b3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0dGluZ0NvbnRleHQ7IH0K
KworICAgICAgICBjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiBtX2Zvcm1hdHRpbmdDb250
ZXh0OworICAgICAgICBjb25zdCBUYWJsZUdyaWQmIG1fZ3JpZDsKKyAgICB9OworCisgICAgY2xh
c3MgR2VvbWV0cnkgOiBwdWJsaWMgRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IHsKKyAgICBw
dWJsaWM6CisgICAgICAgIExheW91dFVuaXQgY2VsbEhlaWdoKGNvbnN0IENvbnRhaW5lckJveCYp
IGNvbnN0OworICAgICAgICBFZGdlcyBjb21wdXRlZENlbGxCb3JkZXIoY29uc3QgVGFibGVHcmlk
OjpDZWxsJikgY29uc3Q7CisgICAgICAgIE9wdGlvbmFsPExheW91dFVuaXQ+IGNvbXB1dGVkQ29s
dW1uV2lkdGgoY29uc3QgQ29udGFpbmVyQm94JiBjb2x1bW5Cb3gpOworICAgICAgICBGb3JtYXR0
aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBpbnRyaW5zaWNXaWR0aENvbnN0
cmFpbnRzRm9yQ2VsbChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmKTsKKyAgICAgICAgSW5saW5lTGF5
b3V0VW5pdCB1c2VkQmFzZWxpbmVGb3JDZWxsKGNvbnN0IENvbnRhaW5lckJveCYgY2VsbEJveCk7
CisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgY2xhc3MgVGFibGVGb3JtYXR0aW5nQ29u
dGV4dDsKKyAgICAgICAgR2VvbWV0cnkoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYsIGNv
bnN0IFRhYmxlR3JpZCYpOworCisgICAgICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQm
IGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8VGFibGVGb3JtYXR0
aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5Ojpmb3JtYXR0aW5nQ29udGV4
dCgpKTsgfQorICAgICAgICBjb25zdCBUYWJsZUdyaWQmIG1fZ3JpZDsKKyAgICB9OworICAgIFRh
YmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdlb21ldHJ5IGdlb21ldHJ5KCkgY29uc3QgeyByZXR1cm4g
R2VvbWV0cnkoKnRoaXMsIGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpKTsgfQorCisgICAg
Y2xhc3MgUXVpcmtzIDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3MgeworICAgIHB1
YmxpYzoKKyAgICAgICAgUXVpcmtzKGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmKTsKKwor
ICAgICAgICBib29sIHNob3VsZElnbm9yZUNoaWxkQ29udGVudFZlcnRpY2FsTWFyZ2luKGNvbnN0
IENvbnRhaW5lckJveCYpIGNvbnN0OworCisgICAgICAgIGNvbnN0IFRhYmxlRm9ybWF0dGluZ0Nv
bnRleHQmIGZvcm1hdHRpbmdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gZG93bmNhc3Q8VGFibGVG
b3JtYXR0aW5nQ29udGV4dD4oRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrczo6Zm9ybWF0dGluZ0Nv
bnRleHQoKSk7IH0KKyAgICAgICAgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnkgZ2Vv
bWV0cnkoKSBjb25zdCB7IHJldHVybiBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCk7IH0K
KyAgICB9OworICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlF1aXJrcyBxdWlya3MoKSBjb25z
dCB7IHJldHVybiBRdWlya3MoKnRoaXMpOyB9CisKKyAgICBUYWJsZUZvcm1hdHRpbmdDb250ZXh0
OjpUYWJsZUxheW91dCB0YWJsZUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIFRhYmxlTGF5b3V0KCp0
aGlzLCBmb3JtYXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKSk7IH0KKworICAgIEludHJpbnNpY1dp
ZHRoQ29uc3RyYWludHMgY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzKCkgb3ZlcnJp
ZGU7CisgICAgdm9pZCBsYXlvdXRDZWxsKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYsIExheW91dFVu
aXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxMYXlvdXRVbml0PiB1c2VkQ2Vs
bEhlaWdodCA9IFdURjo6bnVsbG9wdCk7CisgICAgdm9pZCBzZXRVc2VkR2VvbWV0cnlGb3JDZWxs
cyhMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSk7CisgICAgdm9pZCBzZXRVc2Vk
R2VvbWV0cnlGb3JSb3dzKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKKyAg
ICB2b2lkIHNldFVzZWRHZW9tZXRyeUZvclNlY3Rpb25zKGNvbnN0IENvbnN0cmFpbnRzRm9ySW5G
bG93Q29udGVudCYpOworCisgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBjb21wdXRlZFBy
ZWZlcnJlZFdpZHRoRm9yQ29sdW1ucygpOworICAgIHZvaWQgY29tcHV0ZUFuZERpc3RyaWJ1dGVF
eHRyYVNwYWNlKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlLCBPcHRpb25hbDxM
YXlvdXRVbml0PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKTsKKworICAgIGNvbnN0IFRhYmxlRm9y
bWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBkb3duY2FzdDxU
YWJsZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1hdHRpbmdTdGF0ZSgp
KTsgfQorICAgIFRhYmxlRm9ybWF0dGluZ1N0YXRlJiBmb3JtYXR0aW5nU3RhdGUoKSB7IHJldHVy
biBkb3duY2FzdDxUYWJsZUZvcm1hdHRpbmdTdGF0ZT4oRm9ybWF0dGluZ0NvbnRleHQ6OmZvcm1h
dHRpbmdTdGF0ZSgpKTsgfQorfTsKKworaW5saW5lIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6Okdl
b21ldHJ5OjpHZW9tZXRyeShjb25zdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0JiB0YWJsZUZvcm1h
dHRpbmdDb250ZXh0LCBjb25zdCBUYWJsZUdyaWQmIGdyaWQpCisgICAgOiBGb3JtYXR0aW5nQ29u
dGV4dDo6R2VvbWV0cnkodGFibGVGb3JtYXR0aW5nQ29udGV4dCkKKyAgICAsIG1fZ3JpZChncmlk
KQoreworfQorCitpbmxpbmUgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpRdWlya3Mo
Y29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYgdGFibGVGb3JtYXR0aW5nQ29udGV4dCkKKyAg
ICA6IEZvcm1hdHRpbmdDb250ZXh0OjpRdWlya3ModGFibGVGb3JtYXR0aW5nQ29udGV4dCkKK3sK
K30KKworfQorfQorCitTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0xBWU9VVF9GT1JNQVRUSU5HX0NP
TlRFWFQoVGFibGVGb3JtYXR0aW5nQ29udGV4dCwgaXNUYWJsZUZvcm1hdHRpbmdDb250ZXh0KCkp
CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy90YWJsZS9UYWJsZUZvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZS9UYWJsZUZvcm1hdHRpbmdD
b250ZXh0R2VvbWV0cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQ3MzIzOTI2OTRmNmU3YTgyNDI5YzIwYTVl
NjEwOTg0MGUyYWVkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5j
cHAKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5j
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
T1JNQVRUSU5HX0NPTlRFWFQpCisKKyNpbmNsdWRlICJJbmxpbmVGb3JtYXR0aW5nU3RhdGUuaCIK
KyNpbmNsdWRlICJMYXlvdXRCb3hHZW9tZXRyeS5oIgorI2luY2x1ZGUgIkxheW91dENvbnRleHQu
aCIKKyNpbmNsdWRlICJMYXlvdXREZXNjZW5kYW50SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJMYXlv
dXRJbml0aWFsQ29udGFpbmluZ0Jsb2NrLmgiCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nU3Rh
dGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK0xheW91
dFVuaXQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmNlbGxIZWlnaChjb25zdCBD
b250YWluZXJCb3gmIGNlbGxCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGNlbGxCb3guaXNJbkZs
b3coKSk7CisgICAgYXV0byBjb250ZW50SGVpZ2h0ID0gTGF5b3V0VW5pdCB7IH07CisgICAgaWYg
KGZvcm1hdHRpbmdDb250ZXh0KCkucXVpcmtzKCkuc2hvdWxkSWdub3JlQ2hpbGRDb250ZW50VmVy
dGljYWxNYXJnaW4oY2VsbEJveCkpIHsKKyAgICAgICAgQVNTRVJUKGNlbGxCb3guZmlyc3RJbkZs
b3dDaGlsZCgpKTsKKyAgICAgICAgYXV0byBmb3JtYXR0aW5nQ29udGV4dCA9IHRoaXMtPmZvcm1h
dHRpbmdDb250ZXh0KCk7CisgICAgICAgIGF1dG8mIGZpcnN0SW5GbG93Q2hpbGQgPSAqY2VsbEJv
eC5maXJzdEluRmxvd0NoaWxkKCk7CisgICAgICAgIGF1dG8mIGxhc3RJbkZsb3dDaGlsZCA9ICpj
ZWxsQm94Lmxhc3RJbkZsb3dDaGlsZCgpOworICAgICAgICBhdXRvJiBmaXJzdEluRmxvd0NoaWxk
R2VvbWV0cnkgPSBmb3JtYXR0aW5nQ29udGV4dC5nZW9tZXRyeUZvckJveChmaXJzdEluRmxvd0No
aWxkLCBFc2NhcGVSZWFzb246OlRhYmxlUXVpcmtOZWVkc0dlb21ldHJ5RnJvbUVzdGFibGlzaGVk
Rm9ybWF0dGluZ0NvbnRleHQpOworICAgICAgICBhdXRvJiBsYXN0SW5GbG93Q2hpbGRHZW9tZXRy
eSA9IGZvcm1hdHRpbmdDb250ZXh0Lmdlb21ldHJ5Rm9yQm94KGxhc3RJbkZsb3dDaGlsZCwgRXNj
YXBlUmVhc29uOjpUYWJsZVF1aXJrTmVlZHNHZW9tZXRyeUZyb21Fc3RhYmxpc2hlZEZvcm1hdHRp
bmdDb250ZXh0KTsKKworICAgICAgICBhdXRvIHRvcCA9IGZpcnN0SW5GbG93Q2hpbGQuc3R5bGUo
KS5oYXNNYXJnaW5CZWZvcmVRdWlyaygpID8gQm94R2VvbWV0cnk6OmJvcmRlckJveFJlY3QoZmly
c3RJbkZsb3dDaGlsZEdlb21ldHJ5KS50b3AoKSA6IEJveEdlb21ldHJ5OjptYXJnaW5Cb3hSZWN0
KGZpcnN0SW5GbG93Q2hpbGRHZW9tZXRyeSkudG9wKCk7CisgICAgICAgIGF1dG8gYm90dG9tID0g
bGFzdEluRmxvd0NoaWxkLnN0eWxlKCkuaGFzTWFyZ2luQWZ0ZXJRdWlyaygpID8gQm94R2VvbWV0
cnk6OmJvcmRlckJveFJlY3QobGFzdEluRmxvd0NoaWxkR2VvbWV0cnkpLmJvdHRvbSgpIDogQm94
R2VvbWV0cnk6Om1hcmdpbkJveFJlY3QobGFzdEluRmxvd0NoaWxkR2VvbWV0cnkpLmJvdHRvbSgp
OworICAgICAgICBjb250ZW50SGVpZ2h0ID0gYm90dG9tIC0gdG9wOworICAgIH0gZWxzZQorICAg
ICAgICBjb250ZW50SGVpZ2h0ID0gY29udGVudEhlaWdodEZvckZvcm1hdHRpbmdDb250ZXh0Um9v
dChjZWxsQm94KTsKKyAgICByZXR1cm4gc3RkOjptYXgoY29tcHV0ZWRIZWlnaHQoY2VsbEJveCku
dmFsdWVPcigwX2x1KSwgY29udGVudEhlaWdodCk7Cit9CisKK0VkZ2VzIFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQ6Okdlb21ldHJ5Ojpjb21wdXRlZENlbGxCb3JkZXIoY29uc3QgVGFibGVHcmlkOjpD
ZWxsJiBjZWxsKSBjb25zdAoreworICAgIGF1dG8mIGNlbGxCb3ggPSBjZWxsLmJveCgpOworICAg
IGF1dG8gYm9yZGVyID0gY29tcHV0ZWRCb3JkZXIoY2VsbEJveCk7CisgICAgYXV0byBjb2xsYXBz
ZWRCb3JkZXIgPSBtX2dyaWQuY29sbGFwc2VkQm9yZGVyKCk7CisgICAgaWYgKCFjb2xsYXBzZWRC
b3JkZXIpCisgICAgICAgIHJldHVybiBib3JkZXI7CisKKyAgICAvLyBXZSBtaWdodCB3YW50IHRv
IGNhY2hlIHRoZXNlIGNvbGxhcHNlZCBib3JkZXJzIG9uIHRoZSBncmlkLgorICAgIGF1dG8gY2Vs
bFBvc2l0aW9uID0gY2VsbC5wb3NpdGlvbigpOworICAgIC8vIENvbGxhcHNlZCBib3JkZXIgbGVm
dCBmcm9tIHRhYmxlIGFuZCBhZGphY2VudCBjZWxscy4KKyAgICBpZiAoIWNlbGxQb3NpdGlvbi5j
b2x1bW4pCisgICAgICAgIGJvcmRlci5ob3Jpem9udGFsLmxlZnQgPSBjb2xsYXBzZWRCb3JkZXIt
Pmhvcml6b250YWwubGVmdCAvIDI7CisgICAgZWxzZSB7CisgICAgICAgIGF1dG8gYWRqYWNlbnRC
b3JkZXJSaWdodCA9IGNvbXB1dGVkQm9yZGVyKG1fZ3JpZC5zbG90KHsgY2VsbFBvc2l0aW9uLmNv
bHVtbiAtIDEsIGNlbGxQb3NpdGlvbi5yb3cgfSktPmNlbGwoKS5ib3goKSkuaG9yaXpvbnRhbC5y
aWdodDsKKyAgICAgICAgYm9yZGVyLmhvcml6b250YWwubGVmdCA9IHN0ZDo6bWF4KGJvcmRlci5o
b3Jpem9udGFsLmxlZnQsIGFkamFjZW50Qm9yZGVyUmlnaHQpIC8gMjsKKyAgICB9CisgICAgLy8g
Q29sbGFwc2VkIGJvcmRlciByaWdodCBmcm9tIHRhYmxlIGFuZCBhZGphY2VudCBjZWxscy4KKyAg
ICBpZiAoY2VsbFBvc2l0aW9uLmNvbHVtbiA9PSBtX2dyaWQuY29sdW1ucygpLnNpemUoKSAtIDEp
CisgICAgICAgIGJvcmRlci5ob3Jpem9udGFsLnJpZ2h0ID0gY29sbGFwc2VkQm9yZGVyLT5ob3Jp
em9udGFsLnJpZ2h0IC8gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgYXV0byBhZGphY2VudEJvcmRl
ckxlZnQgPSBjb21wdXRlZEJvcmRlcihtX2dyaWQuc2xvdCh7IGNlbGxQb3NpdGlvbi5jb2x1bW4g
KyAxLCBjZWxsUG9zaXRpb24ucm93IH0pLT5jZWxsKCkuYm94KCkpLmhvcml6b250YWwubGVmdDsK
KyAgICAgICAgYm9yZGVyLmhvcml6b250YWwucmlnaHQgPSBzdGQ6Om1heChib3JkZXIuaG9yaXpv
bnRhbC5yaWdodCwgYWRqYWNlbnRCb3JkZXJMZWZ0KSAvIDI7CisgICAgfQorICAgIC8vIENvbGxh
cHNlZCBib3JkZXIgdG9wIGZyb20gdGFibGUsIHJvdyBhbmQgYWRqYWNlbnQgY2VsbHMuCisgICAg
YXV0byYgcm93cyA9IG1fZ3JpZC5yb3dzKCkubGlzdCgpOworICAgIGlmICghY2VsbFBvc2l0aW9u
LnJvdykKKyAgICAgICAgYm9yZGVyLnZlcnRpY2FsLnRvcCA9IGNvbGxhcHNlZEJvcmRlci0+dmVy
dGljYWwudG9wIC8gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgYXV0byBhZGphY2VudEJvcmRlckJv
dHRvbSA9IGNvbXB1dGVkQm9yZGVyKG1fZ3JpZC5zbG90KHsgY2VsbFBvc2l0aW9uLmNvbHVtbiwg
Y2VsbFBvc2l0aW9uLnJvdyAtIDEgfSktPmNlbGwoKS5ib3goKSkudmVydGljYWwuYm90dG9tOwor
ICAgICAgICBhdXRvIGFkamFjZW50Um93Qm90dG9tID0gY29tcHV0ZWRCb3JkZXIocm93c1tjZWxs
UG9zaXRpb24ucm93IC0gMV0uYm94KCkpLnZlcnRpY2FsLmJvdHRvbTsKKyAgICAgICAgYXV0byBh
ZGphY2VudENvbGxhcHNlZEJvcmRlciA9IHN0ZDo6bWF4KGFkamFjZW50Qm9yZGVyQm90dG9tLCBh
ZGphY2VudFJvd0JvdHRvbSk7CisgICAgICAgIGJvcmRlci52ZXJ0aWNhbC50b3AgPSBzdGQ6Om1h
eChib3JkZXIudmVydGljYWwudG9wLCBhZGphY2VudENvbGxhcHNlZEJvcmRlcikgLyAyOworICAg
IH0KKyAgICAvLyBDb2xsYXBzZWQgYm9yZGVyIGJvdHRvbSBmcm9tIHRhYmxlLCByb3cgYW5kIGFk
amFjZW50IGNlbGxzLgorICAgIGlmIChjZWxsUG9zaXRpb24ucm93ID09IG1fZ3JpZC5yb3dzKCku
c2l6ZSgpIC0gMSkKKyAgICAgICAgYm9yZGVyLnZlcnRpY2FsLmJvdHRvbSA9IGNvbGxhcHNlZEJv
cmRlci0+dmVydGljYWwuYm90dG9tIC8gMjsKKyAgICBlbHNlIHsKKyAgICAgICAgYXV0byBhZGph
Y2VudEJvcmRlclRvcCA9IGNvbXB1dGVkQm9yZGVyKG1fZ3JpZC5zbG90KHsgY2VsbFBvc2l0aW9u
LmNvbHVtbiwgY2VsbFBvc2l0aW9uLnJvdyArIDEgfSktPmNlbGwoKS5ib3goKSkudmVydGljYWwu
dG9wOworICAgICAgICBhdXRvIGFkamFjZW50Um93VG9wID0gY29tcHV0ZWRCb3JkZXIocm93c1tj
ZWxsUG9zaXRpb24ucm93ICsgMV0uYm94KCkpLnZlcnRpY2FsLnRvcDsKKyAgICAgICAgYXV0byBh
ZGphY2VudENvbGxhcHNlZEJvcmRlciA9IHN0ZDo6bWF4KGFkamFjZW50Qm9yZGVyVG9wLCBhZGph
Y2VudFJvd1RvcCk7CisgICAgICAgIGJvcmRlci52ZXJ0aWNhbC5ib3R0b20gPSBzdGQ6Om1heChi
b3JkZXIudmVydGljYWwuYm90dG9tLCBhZGphY2VudENvbGxhcHNlZEJvcmRlcikgLyAyOworICAg
IH0KKyAgICByZXR1cm4gYm9yZGVyOworfQorCitPcHRpb25hbDxMYXlvdXRVbml0PiBUYWJsZUZv
cm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6Y29tcHV0ZWRDb2x1bW5XaWR0aChjb25zdCBDb250
YWluZXJCb3gmIGNvbHVtbkJveCkKK3sKKyAgICAvLyBDaGVjayBib3RoIHN0eWxlIGFuZCA8Y29s
PidzIHdpZHRoIGF0dHJpYnV0ZS4KKyAgICAvLyBGSVhNRTogRmlndXJlIG91dCB3aGF0IHRvIGRv
IHdpdGggY2FsY3VsYXRlZCB2YWx1ZXMsIGxpa2UgPGNvbCBzdHlsZT0id2lkdGg6IDEwJSI+Lgor
ICAgIGlmIChhdXRvIGNvbXB1dGVkV2lkdGhWYWx1ZSA9IGNvbXB1dGVkV2lkdGgoY29sdW1uQm94
LCB7IH0pKQorICAgICAgICByZXR1cm4gY29tcHV0ZWRXaWR0aFZhbHVlOworICAgIHJldHVybiBj
b2x1bW5Cb3guY29sdW1uV2lkdGgoKTsKK30KKworRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNp
Y1dpZHRoQ29uc3RyYWludHMgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6OmludHJp
bnNpY1dpZHRoQ29uc3RyYWludHNGb3JDZWxsKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkK
K3sKKyAgICBhdXRvJiBjZWxsQm94ID0gY2VsbC5ib3goKTsKKyAgICBhdXRvJiBzdHlsZSA9IGNl
bGxCb3guc3R5bGUoKTsKKworICAgIGF1dG8gY29tcHV0ZWRJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzID0gWyZdKCkgLT4gRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWlu
dHMgeworICAgICAgICAvLyBFdmVuIGZpeGVkIHdpZHRoIGNlbGxzIGV4cGFuZCB0byB0aGVpciBt
aW5pbXVtIGNvbnRlbnQgd2lkdGgKKyAgICAgICAgLy8gPHRkIHN0eWxlPSJ3aWR0aDogMTBweCI+
dGVzdF9jb250ZW50PC90ZD4gd2lsbCBzaXplIHRvIG1heChtaW5pbXVtIGNvbnRlbnQgd2lkdGgs
IGNvbXB1dGVkIHdpZHRoKS4KKyAgICAgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRz
ID0gRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHMgeyB9OworICAg
ICAgICBpZiAoY2VsbEJveC5oYXNDaGlsZCgpKQorICAgICAgICAgICAgaW50cmluc2ljV2lkdGhD
b25zdHJhaW50cyA9IExheW91dENvbnRleHQ6OmNyZWF0ZUZvcm1hdHRpbmdDb250ZXh0KGNlbGxC
b3gsIGxheW91dFN0YXRlKCkpLT5jb21wdXRlZEludHJpbnNpY1dpZHRoQ29uc3RyYWludHMoKTsK
KyAgICAgICAgaWYgKGF1dG8gZml4ZWRXaWR0aCA9IGZpeGVkVmFsdWUoc3R5bGUubG9naWNhbFdp
ZHRoKCkpKQorICAgICAgICAgICAgcmV0dXJuIHsgc3RkOjptYXgoaW50cmluc2ljV2lkdGhDb25z
dHJhaW50cy5taW5pbXVtLCAqZml4ZWRXaWR0aCksIHN0ZDo6bWF4KGludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMubWluaW11bSwgKmZpeGVkV2lkdGgpIH07CisgICAgICAgIHJldHVybiBpbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzOworICAgIH07CisgICAgLy8gRklYTUUgQ2hlY2sgZm9yIGJveC1z
aXppbmc6IGJvcmRlci1ib3g7CisgICAgYXV0byBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0g
Y29uc3RyYWluQnlNaW5NYXhXaWR0aChjZWxsQm94LCBjb21wdXRlZEludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMoKSk7CisgICAgLy8gRXhwYW5kIHdpdGggYm9yZGVyCisgICAgaW50cmluc2ljV2lk
dGhDb25zdHJhaW50cy5leHBhbmQoY29tcHV0ZWRDZWxsQm9yZGVyKGNlbGwpLndpZHRoKCkpOwor
ICAgIC8vIHBhZGRpbmcKKyAgICBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzLmV4cGFuZChmaXhl
ZFZhbHVlKHN0eWxlLnBhZGRpbmdMZWZ0KCkpLnZhbHVlT3IoMCkgKyBmaXhlZFZhbHVlKHN0eWxl
LnBhZGRpbmdSaWdodCgpKS52YWx1ZU9yKDApKTsKKyAgICAvLyBhbmQgbWFyZ2luCisgICAgaW50
cmluc2ljV2lkdGhDb25zdHJhaW50cy5leHBhbmQoZml4ZWRWYWx1ZShzdHlsZS5tYXJnaW5TdGFy
dCgpKS52YWx1ZU9yKDApICsgZml4ZWRWYWx1ZShzdHlsZS5tYXJnaW5FbmQoKSkudmFsdWVPcigw
KSk7CisgICAgcmV0dXJuIGludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7Cit9CisKKworSW5saW5l
TGF5b3V0VW5pdCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeTo6dXNlZEJhc2VsaW5l
Rm9yQ2VsbChjb25zdCBDb250YWluZXJCb3gmIGNlbGxCb3gpCit7CisgICAgLy8gVGhlIGJhc2Vs
aW5lIG9mIGEgY2VsbCBpcyBkZWZpbmVkIGFzIHRoZSBiYXNlbGluZSBvZiB0aGUgZmlyc3QgaW4t
ZmxvdyBsaW5lIGJveCBpbiB0aGUgY2VsbCwKKyAgICAvLyBvciB0aGUgZmlyc3QgaW4tZmxvdyB0
YWJsZS1yb3cgaW4gdGhlIGNlbGwsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KKyAgICAvLyBJZiB0
aGVyZSBpcyBubyBzdWNoIGxpbmUgYm94LCB0aGUgYmFzZWxpbmUgaXMgdGhlIGJvdHRvbSBvZiBj
b250ZW50IGVkZ2Ugb2YgdGhlIGNlbGwgYm94LgorICAgIGlmIChjZWxsQm94LmVzdGFibGlzaGVz
SW5saW5lRm9ybWF0dGluZ0NvbnRleHQoKSkKKyAgICAgICAgcmV0dXJuIGxheW91dFN0YXRlKCku
ZXN0YWJsaXNoZWRJbmxpbmVGb3JtYXR0aW5nU3RhdGUoY2VsbEJveCkubGluZXMoKVswXS5iYXNl
bGluZSgpOworICAgIGZvciAoYXV0byYgY2VsbERlc2NlbmRhbnQgOiBkZXNjZW5kYW50c09mVHlw
ZTxDb250YWluZXJCb3g+KGNlbGxCb3gpKSB7CisgICAgICAgIGlmIChjZWxsRGVzY2VuZGFudC5l
c3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpIHsKKyAgICAgICAgICAgIGF1dG8m
IGlubGluZUZvcm1hdHRpbmdTdGF0ZUZvckNlbGwgPSBsYXlvdXRTdGF0ZSgpLmVzdGFibGlzaGVk
SW5saW5lRm9ybWF0dGluZ1N0YXRlKGNlbGxEZXNjZW5kYW50KTsKKyAgICAgICAgICAgIGlmICgh
aW5saW5lRm9ybWF0dGluZ1N0YXRlRm9yQ2VsbC5saW5lcygpLmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gaW5saW5lRm9ybWF0dGluZ1N0YXRlRm9yQ2VsbC5saW5lcygpWzBdLmJh
c2VsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNlbGxEZXNjZW5kYW50LmVzdGFibGlz
aGVzVGFibGVGb3JtYXR0aW5nQ29udGV4dCgpKQorICAgICAgICAgICAgcmV0dXJuIGxheW91dFN0
YXRlKCkuZXN0YWJsaXNoZWRUYWJsZUZvcm1hdHRpbmdTdGF0ZShjZWxsRGVzY2VuZGFudCkudGFi
bGVHcmlkKCkucm93cygpLmxpc3QoKVswXS5iYXNlbGluZSgpOworICAgIH0KKyAgICByZXR1cm4g
Zm9ybWF0dGluZ0NvbnRleHQoKS5nZW9tZXRyeUZvckJveChjZWxsQm94KS5jb250ZW50Qm94Qm90
dG9tKCk7Cit9CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRRdWly
a3MuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZS9U
YWJsZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iNjRhNjJkZmYwNzE0
YWQ2OGZhNzg5Njg1ZmJiYjIxMzc0ZmYxNTMyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZS9UYWJsZUZvcm1hdHRpbmdDb250
ZXh0UXVpcmtzLmNwcApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIw
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
CisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ0NvbnRleHQuaCIKKworI2lmIEVOQUJM
RShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisj
aW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyQm94LmgiCisjaW5jbHVkZSAiTGF5b3V0U3RhdGUuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK2Jvb2wgVGFibGVG
b3JtYXR0aW5nQ29udGV4dDo6UXVpcmtzOjpzaG91bGRJZ25vcmVDaGlsZENvbnRlbnRWZXJ0aWNh
bE1hcmdpbihjb25zdCBDb250YWluZXJCb3gmIGNlbGxCb3gpIGNvbnN0Cit7CisgICAgLy8gTm9y
bWFsbHkgQkZDIHJvb3QgY29udGVudCBoZWlnaHQgdGFrZXMgdGhlIG1hcmdpbiBib3ggb2YgdGhl
IGNoaWxkIGNvbnRlbnQgYXMgdmVydGljYWwgbWFyZ2lucyBkb24ndCBjb2xsYXBzZSB3aXRoIEJG
QyByb290cywKKyAgICAvLyBidXQgdGFibGUgY2VsbCBib3hlcyBkbyBjb2xsYXBzZSB0aGVpciAo
bm9uLWV4aXN0aW5nKSBtYXJnaW5zIHdpdGggY2hpbGQgcXVpcmsgbWFyZ2lucyAoc28gbXVjaCBx
dWlyayksIHNvIGhlcmUgd2UgY2hlY2sKKyAgICAvLyBpZiB0aGUgY29udGVudCBoZWlnaHQgc2hv
dWxkIGluY2x1ZGUgbWFyZ2lucyBvciBub3QuCisgICAgLy8gZS5nIDx0YWJsZT48dHI+PHRkPjxw
PnRleHQgY29udGVudDwvdGQ+PC90cj48L3RhYmxlPiA8LSA8cD4ncyBxdWlyayBtYXJnaW4gY29s
bGFwc2VzIHdpdGggdGhlIDx0ZD4gc28gaXRzIGNvbnRlbnQKKyAgICAvLyBoZWlnaHQgc2hvdWxk
IG5vdCBpbmNsdWRlIHZlcnRpY2FsIG1hcmdpbnMuCisgICAgaWYgKCFsYXlvdXRTdGF0ZSgpLmlu
UXVpcmtzTW9kZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGNlbGxCb3guZXN0
YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgaWYgKCFjZWxsQm94Lmhhc0luRmxvd0NoaWxkKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICByZXR1cm4gY2VsbEJveC5maXJzdEluRmxvd0NoaWxkKCktPnN0eWxlKCkuaGFzTWFy
Z2luQmVmb3JlUXVpcmsoKSB8fCBjZWxsQm94Lmxhc3RJbkZsb3dDaGlsZCgpLT5zdHlsZSgpLmhh
c01hcmdpbkFmdGVyUXVpcmsoKTsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGUvVGFibGVGb3JtYXR0
aW5nU3RhdGUuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90
YWJsZS9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTMxMGVmNWUxMzI2MGQx
YTMxZmIxZDllODZlMmM2YjYyM2E2NTk4NwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGUvVGFibGVGb3JtYXR0aW5nU3RhdGUu
Y3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nU3RhdGUuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9S
TUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiVGFibGVGb3JtYXR0aW5nQ29udGV4dC5oIgor
I2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoVGFibGVG
b3JtYXR0aW5nU3RhdGUpOworCitUYWJsZUZvcm1hdHRpbmdTdGF0ZTo6VGFibGVGb3JtYXR0aW5n
U3RhdGUoUmVmPEZsb2F0aW5nU3RhdGU+JiYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0U3RhdGUmIGxh
eW91dFN0YXRlLCBjb25zdCBDb250YWluZXJCb3gmIHRhYmxlQm94KQorICAgIDogRm9ybWF0dGlu
Z1N0YXRlKFdURk1vdmUoZmxvYXRpbmdTdGF0ZSksIFR5cGU6OlRhYmxlLCBsYXlvdXRTdGF0ZSkK
KyAgICAsIG1fdGFibGVHcmlkKFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OmVuc3VyZVRhYmxlR3Jp
ZCh0YWJsZUJveCkpCit7Cit9CisKK1RhYmxlRm9ybWF0dGluZ1N0YXRlOjp+VGFibGVGb3JtYXR0
aW5nU3RhdGUoKQoreworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGUvVGFibGVGb3JtYXR0aW5nU3RhdGUu
aCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGUvVGFibGVG
b3JtYXR0aW5nU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43ZDFlNGFmMGI5NmFjYzRkMzQzNDVhYTljZjZk
ODNmNzhkNTNjNzZmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zv
cm1hdHRpbmdDb250ZXh0cy90YWJsZS9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5oCkBAIC0wLDAgKzEs
NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisg
KiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICog
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShMQVlPVVRfRk9S
TUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRm9ybWF0dGluZ1N0YXRlLmgiCisjaW5jbHVk
ZSAiVGFibGVHcmlkLmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgorI2luY2x1ZGUgPHd0
Zi9VbmlxdWVSZWYuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7
CisKKy8vIFRhYmxlRm9ybWF0dGluZ1N0YXRlIGhvbGRzIHRoZSBzdGF0ZSBmb3IgYSBwYXJ0aWN1
bGFyIHRhYmxlIGZvcm1hdHRpbmcgY29udGV4dCB0cmVlLgorY2xhc3MgVGFibGVGb3JtYXR0aW5n
U3RhdGUgOiBwdWJsaWMgRm9ybWF0dGluZ1N0YXRlIHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NB
VEVEKFRhYmxlRm9ybWF0dGluZ1N0YXRlKTsKK3B1YmxpYzoKKyAgICBUYWJsZUZvcm1hdHRpbmdT
dGF0ZShSZWY8RmxvYXRpbmdTdGF0ZT4mJiwgTGF5b3V0U3RhdGUmLCBjb25zdCBDb250YWluZXJC
b3gmIHRhYmxlQm94KTsKKyAgICB+VGFibGVGb3JtYXR0aW5nU3RhdGUoKTsKKworICAgIFRhYmxl
R3JpZCYgdGFibGVHcmlkKCkgeyByZXR1cm4gbV90YWJsZUdyaWQ7IH0KKyAgICBjb25zdCBUYWJs
ZUdyaWQmIHRhYmxlR3JpZCgpIGNvbnN0IHsgcmV0dXJuIG1fdGFibGVHcmlkOyB9CisKK3ByaXZh
dGU6CisgICAgVW5pcXVlUmVmPFRhYmxlR3JpZD4gbV90YWJsZUdyaWQ7Cit9OworCit9Cit9CisK
K1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfTEFZT1VUX0ZPUk1BVFRJTkdfU1RBVEUoVGFibGVGb3Jt
YXR0aW5nU3RhdGUsIGlzVGFibGVGb3JtYXR0aW5nU3RhdGUoKSkKKworI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlL1RhYmxl
R3JpZC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxl
L1RhYmxlR3JpZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uM2M0MWQ4ZDA4YTUyNWU3NTZhYmNkY2IxYTIxNWM5
ZjQ2NTZhY2ZiNgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvdGFibGUvVGFibGVHcmlkLmNwcApAQCAtMCwwICsxLDE5NyBAQAorLyoK
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
dHMvdGFibGUvVGFibGVHcmlkLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0Nv
bnRleHRzL3RhYmxlL1RhYmxlR3JpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjYyNWEzZjQ0YmY2MjIxY2U0NjUy
NTk0MDkxM2VjZTEwYjA2YWFjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlL1RhYmxlR3JpZC5oCkBAIC0wLDAgKzEsMjQx
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
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
ZSAiTGF5b3V0VW5pdHMuaCIKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0
Zi9Jc29NYWxsb2MuaD4KKyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgorI2luY2x1
ZGUgPHd0Zi9MaXN0SGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9XZWFrUHRyLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworY2xhc3MgQm94OworY2xhc3MgQ29u
dGFpbmVyQm94OworCitjbGFzcyBUYWJsZUdyaWQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FU
RUQoVGFibGVHcmlkKTsKK3B1YmxpYzoKKyAgICBUYWJsZUdyaWQoKTsKKworICAgIHZvaWQgYXBw
ZW5kQ2VsbChjb25zdCBDb250YWluZXJCb3gmKTsKKyAgICB2b2lkIGluc2VydENlbGwoY29uc3Qg
Q29udGFpbmVyQm94JiwgY29uc3QgQ29udGFpbmVyQm94JiBiZWZvcmUpOworICAgIHZvaWQgcmVt
b3ZlQ2VsbChjb25zdCBDb250YWluZXJCb3gmKTsKKworICAgIHZvaWQgc2V0SG9yaXpvbnRhbFNw
YWNpbmcoTGF5b3V0VW5pdCBob3Jpem9udGFsU3BhY2luZykgeyBtX2hvcml6b250YWxTcGFjaW5n
ID0gaG9yaXpvbnRhbFNwYWNpbmc7IH0KKyAgICBMYXlvdXRVbml0IGhvcml6b250YWxTcGFjaW5n
KCkgY29uc3QgeyByZXR1cm4gbV9ob3Jpem9udGFsU3BhY2luZzsgfQorCisgICAgdm9pZCBzZXRW
ZXJ0aWNhbFNwYWNpbmcoTGF5b3V0VW5pdCB2ZXJ0aWNhbFNwYWNpbmcpIHsgbV92ZXJ0aWNhbFNw
YWNpbmcgPSB2ZXJ0aWNhbFNwYWNpbmc7IH0KKyAgICBMYXlvdXRVbml0IHZlcnRpY2FsU3BhY2lu
ZygpIGNvbnN0IHsgcmV0dXJuIG1fdmVydGljYWxTcGFjaW5nOyB9CisKKyAgICB2b2lkIHNldENv
bGxhcHNlZEJvcmRlcihjb25zdCBFZGdlcyYgY29sbGFwc2VkQm9yZGVyKSB7IG1fY29sbGFwc2Vk
Qm9yZGVyID0gY29sbGFwc2VkQm9yZGVyOyB9CisgICAgT3B0aW9uYWw8RWRnZXM+IGNvbGxhcHNl
ZEJvcmRlcigpIGNvbnN0IHsgcmV0dXJuIG1fY29sbGFwc2VkQm9yZGVyOyB9CisKKyAgICB2b2lk
IHNldFdpZHRoQ29uc3RyYWludHMoRm9ybWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMgaW50cmluc2ljV2lkdGhDb25zdHJhaW50cykgeyBtX2ludHJpbnNpY1dpZHRoQ29u
c3RyYWludHMgPSBpbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzOyB9CisgICAgT3B0aW9uYWw8Rm9y
bWF0dGluZ0NvbnRleHQ6OkludHJpbnNpY1dpZHRoQ29uc3RyYWludHM+IHdpZHRoQ29uc3RyYWlu
dHMoKSBjb25zdCB7IHJldHVybiBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7IH0KKworICAg
IGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fc2xvdE1hcC5pc0VtcHR5KCk7IH0KKyAg
ICAvLyBDb2x1bW4gcmVwcmVzZW50cyBhIHZlcnRpY2FsIHNldCBvZiBzbG90cyBpbiB0aGUgZ3Jp
ZC4gQSBjb2x1bW4gaGFzIGhvcml6b250YWwgcG9zaXRpb24gYW5kIHdpZHRoLgorICAgIGNsYXNz
IENvbHVtbiB7CisgICAgcHVibGljOgorICAgICAgICBDb2x1bW4oY29uc3QgQ29udGFpbmVyQm94
Kik7CisKKyAgICAgICAgdm9pZCBzZXRMb2dpY2FsTGVmdChMYXlvdXRVbml0KTsKKyAgICAgICAg
TGF5b3V0VW5pdCBsb2dpY2FsTGVmdCgpIGNvbnN0OworICAgICAgICBMYXlvdXRVbml0IGxvZ2lj
YWxSaWdodCgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxMZWZ0KCkgKyBsb2dpY2FsV2lkdGgoKTsg
fQorICAgICAgICB2b2lkIHNldExvZ2ljYWxXaWR0aChMYXlvdXRVbml0KTsKKyAgICAgICAgTGF5
b3V0VW5pdCBsb2dpY2FsV2lkdGgoKSBjb25zdDsKKworICAgICAgICBib29sIGlzRml4ZWRXaWR0
aCgpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0SGFzRml4ZWRXaWR0aENlbGwoKSB7IG1faGFz
Rml4ZWRXaWR0aENlbGwgPSB0cnVlOyB9CisgICAgICAgIGNvbnN0IENvbnRhaW5lckJveCogYm94
KCkgY29uc3QgeyByZXR1cm4gbV9sYXlvdXRCb3guZ2V0KCk7IH0KKworICAgIHByaXZhdGU6Cisg
ICAgICAgIGJvb2wgaGFzRml4ZWRXaWR0aENlbGwoKSBjb25zdCB7IHJldHVybiBtX2hhc0ZpeGVk
V2lkdGhDZWxsOyB9CisKKyAgICAgICAgTGF5b3V0VW5pdCBtX2NvbXB1dGVkTG9naWNhbFdpZHRo
OworICAgICAgICBMYXlvdXRVbml0IG1fY29tcHV0ZWRMb2dpY2FsTGVmdDsKKyAgICAgICAgV2Vh
a1B0cjxjb25zdCBDb250YWluZXJCb3g+IG1fbGF5b3V0Qm94OworICAgICAgICBib29sIG1faGFz
Rml4ZWRXaWR0aENlbGwgeyBmYWxzZSB9OworCisjaWYgQVNTRVJUX0VOQUJMRUQKKyAgICAgICAg
Ym9vbCBtX2hhc0NvbXB1dGVkV2lkdGggeyBmYWxzZSB9OworICAgICAgICBib29sIG1faGFzQ29t
cHV0ZWRMZWZ0IHsgZmFsc2UgfTsKKyNlbmRpZgorICAgIH07CisKKyAgICBjbGFzcyBDb2x1bW5z
IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHVzaW5nIENvbHVtbkxpc3QgPSBWZWN0b3I8Q29sdW1u
PjsKKyAgICAgICAgQ29sdW1uTGlzdCYgbGlzdCgpIHsgcmV0dXJuIG1fY29sdW1uTGlzdDsgfQor
ICAgICAgICBjb25zdCBDb2x1bW5MaXN0JiBsaXN0KCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5M
aXN0OyB9CisgICAgICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0
LnNpemUoKTsgfQorCisgICAgICAgIHZvaWQgYWRkQ29sdW1uKGNvbnN0IENvbnRhaW5lckJveCYp
OworICAgICAgICB2b2lkIGFkZEFub255bW91c0NvbHVtbigpOworCisgICAgICAgIExheW91dFVu
aXQgbG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9jb2x1bW5MaXN0Lmxhc3QoKS5sb2dp
Y2FsUmlnaHQoKSAtIG1fY29sdW1uTGlzdC5maXJzdCgpLmxvZ2ljYWxMZWZ0KCk7IH0KKyAgICAg
ICAgYm9vbCBoYXNGaXhlZENvbHVtbnNPbmx5KCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAg
ICAgICBDb2x1bW5MaXN0IG1fY29sdW1uTGlzdDsKKyAgICB9OworCisgICAgY2xhc3MgUm93IHsK
KyAgICBwdWJsaWM6CisgICAgICAgIFJvdyhjb25zdCBDb250YWluZXJCb3gmKTsKKworICAgICAg
ICB2b2lkIHNldExvZ2ljYWxUb3AoTGF5b3V0VW5pdCBsb2dpY2FsVG9wKSB7IG1fbG9naWNhbFRv
cCA9IGxvZ2ljYWxUb3A7IH0KKyAgICAgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wKCkgY29uc3Qg
eyByZXR1cm4gbV9sb2dpY2FsVG9wOyB9CisgICAgICAgIExheW91dFVuaXQgbG9naWNhbEJvdHRv
bSgpIGNvbnN0IHsgcmV0dXJuIGxvZ2ljYWxUb3AoKSArIGxvZ2ljYWxIZWlnaHQoKTsgfQorCisg
ICAgICAgIHZvaWQgc2V0TG9naWNhbEhlaWdodChMYXlvdXRVbml0IGxvZ2ljYWxIZWlnaHQpIHsg
bV9sb2dpY2FsSGVpZ2h0ID0gbG9naWNhbEhlaWdodDsgfQorICAgICAgICBMYXlvdXRVbml0IGxv
Z2ljYWxIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2xvZ2ljYWxIZWlnaHQ7IH0KKworICAgICAg
ICB2b2lkIHNldEJhc2VsaW5lKElubGluZUxheW91dFVuaXQgYmFzZWxpbmUpIHsgbV9iYXNlbGlu
ZSA9IGJhc2VsaW5lOyB9CisgICAgICAgIElubGluZUxheW91dFVuaXQgYmFzZWxpbmUoKSBjb25z
dCB7IHJldHVybiBtX2Jhc2VsaW5lOyB9CisKKyAgICAgICAgY29uc3QgQ29udGFpbmVyQm94JiBi
b3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRCb3guZ2V0KCk7IH0KKworICAgIHByaXZhdGU6
CisgICAgICAgIExheW91dFVuaXQgbV9sb2dpY2FsVG9wOworICAgICAgICBMYXlvdXRVbml0IG1f
bG9naWNhbEhlaWdodDsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9
OworICAgICAgICBXZWFrUHRyPGNvbnN0IENvbnRhaW5lckJveD4gbV9sYXlvdXRCb3g7CisgICAg
fTsKKworICAgIGNsYXNzIFJvd3MgeworICAgIHB1YmxpYzoKKyAgICAgICAgdXNpbmcgUm93TGlz
dCA9IFZlY3RvcjxSb3c+OworICAgICAgICBSb3dMaXN0JiBsaXN0KCkgeyByZXR1cm4gbV9yb3dM
aXN0OyB9CisgICAgICAgIGNvbnN0IFJvd0xpc3QmIGxpc3QoKSBjb25zdCB7IHJldHVybiBtX3Jv
d0xpc3Q7IH0KKworICAgICAgICB2b2lkIGFkZFJvdyhjb25zdCBDb250YWluZXJCb3gmKTsKKwor
ICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcm93TGlzdC5zaXplKCk7IH0K
KworICAgIHByaXZhdGU6CisgICAgICAgIFJvd0xpc3QgbV9yb3dMaXN0OworICAgIH07CisKKyAg
ICAvLyBDZWxsIHJlcHJlc2VudHMgYSA8dGQ+IG9yIDx0aD4uIEl0IGNhbiBzcGFuIG11bHRpcGxl
IHNsb3RzIGluIHRoZSBncmlkLgorICAgIGNsYXNzIENlbGwgOiBwdWJsaWMgQ2FuTWFrZVdlYWtQ
dHI8Q2VsbD4geworICAgICAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lOTElORShDZWxsKTsK
KyAgICBwdWJsaWM6CisgICAgICAgIENlbGwoY29uc3QgQ29udGFpbmVyQm94JiwgU2xvdFBvc2l0
aW9uLCBDZWxsU3Bhbik7CisKKyAgICAgICAgc2l6ZV90IHN0YXJ0Q29sdW1uKCkgY29uc3QgeyBy
ZXR1cm4gbV9wb3NpdGlvbi5jb2x1bW47IH0KKyAgICAgICAgc2l6ZV90IGVuZENvbHVtbigpIGNv
bnN0IHsgcmV0dXJuIG1fcG9zaXRpb24uY29sdW1uICsgbV9zcGFuLmNvbHVtbjsgfQorCisgICAg
ICAgIHNpemVfdCBzdGFydFJvdygpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb24ucm93OyB9Cisg
ICAgICAgIHNpemVfdCBlbmRSb3coKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aW9uLnJvdyArIG1f
c3Bhbi5yb3c7IH0KKworICAgICAgICBzaXplX3QgY29sdW1uU3BhbigpIGNvbnN0IHsgcmV0dXJu
IG1fc3Bhbi5jb2x1bW47IH0KKyAgICAgICAgc2l6ZV90IHJvd1NwYW4oKSBjb25zdCB7IHJldHVy
biBtX3NwYW4ucm93OyB9CisKKyAgICAgICAgU2xvdFBvc2l0aW9uIHBvc2l0aW9uKCkgY29uc3Qg
eyByZXR1cm4gbV9wb3NpdGlvbjsgfQorICAgICAgICBDZWxsU3BhbiBzcGFuKCkgY29uc3QgeyBy
ZXR1cm4gbV9zcGFuOyB9CisKKyAgICAgICAgdm9pZCBzZXRCYXNlbGluZShJbmxpbmVMYXlvdXRV
bml0IGJhc2VsaW5lKSB7IG1fYmFzZWxpbmUgPSBiYXNlbGluZTsgfQorICAgICAgICBJbmxpbmVM
YXlvdXRVbml0IGJhc2VsaW5lKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlbGluZTsgfQorCisgICAg
ICAgIGJvb2wgaXNGaXhlZFdpZHRoKCkgY29uc3Q7CisKKyAgICAgICAgY29uc3QgQ29udGFpbmVy
Qm94JiBib3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRCb3guZ2V0KCk7IH0KKworICAgIHBy
aXZhdGU6CisgICAgICAgIFdlYWtQdHI8Y29uc3QgQ29udGFpbmVyQm94PiBtX2xheW91dEJveDsK
KyAgICAgICAgU2xvdFBvc2l0aW9uIG1fcG9zaXRpb247CisgICAgICAgIENlbGxTcGFuIG1fc3Bh
bjsKKyAgICAgICAgSW5saW5lTGF5b3V0VW5pdCBtX2Jhc2VsaW5lIHsgMCB9OworICAgIH07CisK
KyAgICBjbGFzcyBTbG90IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFdURl9NQUtFX1NUUlVDVF9G
QVNUX0FMTE9DQVRFRDsKKyAgICAgICAgU2xvdCgpID0gZGVmYXVsdDsKKyAgICAgICAgU2xvdChD
ZWxsJiwgYm9vbCBpc0NvbHVtblNwYW5uZWQsIGJvb2wgaXNSb3dTcGFubmVkKTsKKworICAgICAg
ICBjb25zdCBDZWxsJiBjZWxsKCkgY29uc3QgeyByZXR1cm4gKm1fY2VsbDsgfQorICAgICAgICBD
ZWxsJiBjZWxsKCkgeyByZXR1cm4gKm1fY2VsbDsgfQorCisgICAgICAgIGNvbnN0IEZvcm1hdHRp
bmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzJiB3aWR0aENvbnN0cmFpbnRzKCkg
Y29uc3QgeyByZXR1cm4gbV93aWR0aENvbnN0cmFpbnRzOyB9CisgICAgICAgIHZvaWQgc2V0V2lk
dGhDb25zdHJhaW50cyhjb25zdCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25z
dHJhaW50cyYgd2lkdGhDb25zdHJhaW50cykgeyBtX3dpZHRoQ29uc3RyYWludHMgPSB3aWR0aENv
bnN0cmFpbnRzOyB9CisKKyAgICAgICAgLy8gSW5pdGlhbCBzbG90IHBvc2l0aW9uIGZvciBhIHNw
YW5uaW5nIGNlbGwuCisgICAgICAgIC8vIDx0ZD48L3RkPjx0ZCBjb2xzcGFuPTI+PC90ZD4gWzEs
IDBdIHNsb3QgaGFzIGNvbHVtbiBzcGFuIG9mIDIuCisgICAgICAgIGJvb2wgaGFzQ29sdW1uU3Bh
bigpIGNvbnN0IHsgcmV0dXJuIG1fY2VsbC0+Y29sdW1uU3BhbigpID4gMSAmJiAhaXNDb2x1bW5T
cGFubmVkKCk7IH0KKyAgICAgICAgYm9vbCBoYXNSb3dTcGFuKCkgY29uc3QgeyByZXR1cm4gbV9j
ZWxsLT5yb3dTcGFuKCkgPiAxICYmICFpc1Jvd1NwYW5uZWQoKTsgfQorCisgICAgICAgIC8vIE5v
bi1pbml0aWFsIHNwYW5uZWQgc2xvdC4KKyAgICAgICAgLy8gPHRkPjwvdGQ+PHRkIGNvbHNwYW49
Mj48L3RkPiBbMiwgMF0gc2xvdCBpcyBjb2x1bW4gc3Bhbm5lZCBieSBbMSwgMF0uCisgICAgICAg
IC8vIDx0ZD48L3RkPjx0ZD48L3RkPjx0ZD48L3RkPgorICAgICAgICBib29sIGlzQ29sdW1uU3Bh
bm5lZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNDb2x1bW5TcGFubmVkOyB9CisgICAgICAgIGJvb2wg
aXNSb3dTcGFubmVkKCkgY29uc3QgeyByZXR1cm4gbV9pc1Jvd1NwYW5uZWQ7IH0KKworICAgIHBy
aXZhdGU6CisgICAgICAgIFdlYWtQdHI8Q2VsbD4gbV9jZWxsOworICAgICAgICBib29sIG1faXND
b2x1bW5TcGFubmVkIHsgZmFsc2UgfTsKKyAgICAgICAgYm9vbCBtX2lzUm93U3Bhbm5lZCB7IGZh
bHNlIH07CisgICAgICAgIEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFp
bnRzIG1fd2lkdGhDb25zdHJhaW50czsKKyAgICB9OworCisgICAgY29uc3QgQ29sdW1ucyYgY29s
dW1ucygpIGNvbnN0IHsgcmV0dXJuIG1fY29sdW1uczsgfQorICAgIENvbHVtbnMmIGNvbHVtbnMo
KSB7IHJldHVybiBtX2NvbHVtbnM7IH0KKworICAgIGNvbnN0IFJvd3MmIHJvd3MoKSBjb25zdCB7
IHJldHVybiBtX3Jvd3M7IH0KKyAgICBSb3dzJiByb3dzKCkgeyByZXR1cm4gbV9yb3dzOyB9CisK
KyAgICB1c2luZyBDZWxscyA9IFdURjo6TGlzdEhhc2hTZXQ8c3RkOjp1bmlxdWVfcHRyPENlbGw+
PjsKKyAgICBDZWxscyYgY2VsbHMoKSB7IHJldHVybiBtX2NlbGxzOyB9CisKKyAgICBTbG90KiBz
bG90KFNsb3RQb3NpdGlvbik7CisgICAgY29uc3QgU2xvdCogc2xvdChTbG90UG9zaXRpb24gcG9z
aXRpb24pIGNvbnN0IHsgcmV0dXJuIG1fc2xvdE1hcC5nZXQocG9zaXRpb24pOyB9CisgICAgYm9v
bCBpc1NwYW5uZWQoU2xvdFBvc2l0aW9uKTsKKworcHJpdmF0ZToKKyAgICB1c2luZyBTbG90TWFw
ID0gV1RGOjpIYXNoTWFwPFNsb3RQb3NpdGlvbiwgc3RkOjp1bmlxdWVfcHRyPFNsb3Q+PjsKKwor
ICAgIENvbHVtbnMgbV9jb2x1bW5zOworICAgIFJvd3MgbV9yb3dzOworICAgIENlbGxzIG1fY2Vs
bHM7CisgICAgU2xvdE1hcCBtX3Nsb3RNYXA7CisKKyAgICBMYXlvdXRVbml0IG1faG9yaXpvbnRh
bFNwYWNpbmc7CisgICAgTGF5b3V0VW5pdCBtX3ZlcnRpY2FsU3BhY2luZzsKKyAgICBPcHRpb25h
bDxGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25zdHJhaW50cz4gbV9pbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzOworICAgIE9wdGlvbmFsPEVkZ2VzPiBtX2NvbGxhcHNlZEJvcmRl
cjsKK307CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlL1RhYmxlTGF5b3V0LmNwcCBiL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGUvVGFibGVMYXlvdXQuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjIzMzUyYzVhMTdmOGMwYjNkM2QyNDRlOTI1YTdlZjI0ODE5OGE4ZDMKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxl
L1RhYmxlTGF5b3V0LmNwcApAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJUYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgiCisKKyNpZiBF
TkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkxheW91dEJveC5o
IgorI2luY2x1ZGUgIkxheW91dEJveEdlb21ldHJ5LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K25hbWVzcGFjZSBMYXlvdXQgeworCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXRhYmxl
cy0zLyN0YWJsZS1sYXlvdXQtYWxnb3JpdGhtCitUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJs
ZUxheW91dDo6VGFibGVMYXlvdXQoY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0
dGluZ0NvbnRleHQsIGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkKKyAgICA6IG1fZm9ybWF0dGluZ0Nv
bnRleHQoZm9ybWF0dGluZ0NvbnRleHQpCisgICAgLCBtX2dyaWQoZ3JpZCkKK3sKK30KKworc3Ry
dWN0IENvbHVtblNwYW4geworICAgIHN0YXRpYyBzaXplX3QgaGFzU3Bhbihjb25zdCBUYWJsZUdy
aWQ6OlNsb3QmIHNsb3QpIHsgcmV0dXJuIHNsb3QuaGFzQ29sdW1uU3BhbigpOyB9CisgICAgc3Rh
dGljIHNpemVfdCBpc1NwYW5uZWQoY29uc3QgVGFibGVHcmlkOjpTbG90JiBzbG90KSB7IHJldHVy
biBzbG90LmlzQ29sdW1uU3Bhbm5lZCgpOyB9CisKKyAgICBzdGF0aWMgc2l6ZV90IHNwYW5Db3Vu
dChjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJuIGNlbGwuY29sdW1uU3Bhbigp
OyB9CisgICAgc3RhdGljIHNpemVfdCBzdGFydFNwYW4oY29uc3QgVGFibGVHcmlkOjpDZWxsJiBj
ZWxsKSB7IHJldHVybiBjZWxsLnN0YXJ0Q29sdW1uKCk7IH0KKyAgICBzdGF0aWMgc2l6ZV90IGVu
ZFNwYW4oY29uc3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBjZWxsLmVuZENvbHVt
bigpOyB9CisKKyAgICBzdGF0aWMgc2l6ZV90IGluZGV4KHNpemVfdCBjb2x1bW5JbmRleCwgc2l6
ZV90IC8qcm93SW5kZXgqLykgeyByZXR1cm4gY29sdW1uSW5kZXg7IH0KKyAgICBzdGF0aWMgc2l6
ZV90IHNpemUoY29uc3QgVGFibGVHcmlkJiBncmlkKSB7IHJldHVybiBncmlkLmNvbHVtbnMoKS5z
aXplKCk7IH0KKworICAgIHN0YXRpYyBMYXlvdXRVbml0IHNwYWNpbmcoY29uc3QgVGFibGVHcmlk
JiBncmlkKSB7IHJldHVybiBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7IH0KK307CisKK3N0cnVj
dCBSb3dTcGFuIHsKKyAgICBzdGF0aWMgc2l6ZV90IGhhc1NwYW4oY29uc3QgVGFibGVHcmlkOjpT
bG90JiBzbG90KSB7IHJldHVybiBzbG90Lmhhc1Jvd1NwYW4oKTsgfQorICAgIHN0YXRpYyBzaXpl
X3QgaXNTcGFubmVkKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCkgeyByZXR1cm4gc2xvdC5p
c1Jvd1NwYW5uZWQoKTsgfQorCisgICAgc3RhdGljIHNpemVfdCBzcGFuQ291bnQoY29uc3QgVGFi
bGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBjZWxsLnJvd1NwYW4oKTsgfQorICAgIHN0YXRp
YyBzaXplX3Qgc3RhcnRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4g
Y2VsbC5zdGFydFJvdygpOyB9CisgICAgc3RhdGljIHNpemVfdCBlbmRTcGFuKGNvbnN0IFRhYmxl
R3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5lbmRSb3coKTsgfQorCisgICAgc3RhdGlj
IHNpemVfdCBpbmRleChzaXplX3QgLypjb2x1bW5JbmRleCovLCBzaXplX3Qgcm93SW5kZXgpIHsg
cmV0dXJuIHJvd0luZGV4OyB9CisgICAgc3RhdGljIHNpemVfdCBzaXplKGNvbnN0IFRhYmxlR3Jp
ZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5yb3dzKCkuc2l6ZSgpOyB9CisKKyAgICBzdGF0aWMgTGF5
b3V0VW5pdCBzcGFjaW5nKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC52ZXJ0
aWNhbFNwYWNpbmcoKTsgfQorfTsKKworc3RydWN0IEdyaWRTcGFjZSB7CisgICAgYm9vbCBpc0Vt
cHR5KCkgY29uc3QgeyByZXR1cm4gIXZhbHVlOyB9CisKKyAgICAvLyBJbml0aWFsIHdpZHRoL2hl
aWdodCBmb3IgY29sdW1uL3JvdyB3ZSBzdGFydCB0aGUgZGlzdHJpYnV0aW9uIHdpZHRoICh1c3Vh
bGx5IGEgbWludW11bSB3aWR0aCkuCisgICAgZmxvYXQgdmFsdWUgeyAwIH07CisgICAgLy8gVGhl
IGJhc2UgdG8gY29tcHV0ZSB0aGUgZGlzdHJpYnV0aW9uIHJhdGlvLiBJdCBub3JtYWxseSBtYXRj
aGVzIHRoZSBbdmFsdWVdIGJ1dCBpbiBzb21lIGNhc2VzIHdlIHVzZSB0aGUgbWF4aW11bSB2YWx1
ZSB0byBkaXN0cmlidXRlIHRoZSBleHRyYSBzcGFjZS4gCisgICAgZmxvYXQgZGlzdHJpYnV0aW9u
QmFzZSB7IDAgfTsKK307CisKK2lubGluZSBzdGF0aWMgR3JpZFNwYWNlIG1heChjb25zdCBHcmlk
U3BhY2UmIGEsIGNvbnN0IEdyaWRTcGFjZSYgYikKK3sKKyAgICByZXR1cm4geyBzdGQ6Om1heChh
LnZhbHVlLCBiLnZhbHVlKSwgc3RkOjptYXgoYS5kaXN0cmlidXRpb25CYXNlLCBiLmRpc3RyaWJ1
dGlvbkJhc2UpIH07Cit9CisKK2lubGluZSBzdGF0aWMgR3JpZFNwYWNlJiBvcGVyYXRvci0oR3Jp
ZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCit7CisgICAgYS52YWx1ZSA9IHN0ZDo6bWF4
KDAuMGYsIGEudmFsdWUgLSBiLnZhbHVlKTsKKyAgICBhLmRpc3RyaWJ1dGlvbkJhc2UgPSBzdGQ6
Om1heCgwLjBmLCBhLmRpc3RyaWJ1dGlvbkJhc2UgLSBiLmRpc3RyaWJ1dGlvbkJhc2UpOworICAg
IHJldHVybiBhOworfQorCitpbmxpbmUgc3RhdGljIEdyaWRTcGFjZSYgb3BlcmF0b3IrPShHcmlk
U3BhY2UmIGEsIGNvbnN0IEdyaWRTcGFjZSYgYikKK3sKKyAgICBhLnZhbHVlICs9IGIudmFsdWU7
CisgICAgYS5kaXN0cmlidXRpb25CYXNlICs9IGIuZGlzdHJpYnV0aW9uQmFzZTsKKyAgICByZXR1
cm4gYTsKK30KKworaW5saW5lIHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJhdG9yLT0oR3JpZFNwYWNl
JiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCit7CisgICAgcmV0dXJuIGEgLSBiOworfQorCitpbmxp
bmUgc3RhdGljIEdyaWRTcGFjZSYgb3BlcmF0b3IvKEdyaWRTcGFjZSYgYSwgdW5zaWduZWQgdmFs
dWUpCit7CisgICAgYS52YWx1ZSAvPSB2YWx1ZTsKKyAgICBhLmRpc3RyaWJ1dGlvbkJhc2UgLz0g
dmFsdWU7CisgICAgcmV0dXJuIGE7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcGFuVHlwZT4K
K3N0YXRpYyBWZWN0b3I8TGF5b3V0VW5pdD4gZGlzdHJpYnV0ZUF2YWlsYWJsZVNwYWNlKGNvbnN0
IFRhYmxlR3JpZCYgZ3JpZCwgTGF5b3V0VW5pdCBhdmFpbGFibGVTcGFjZSwgY29uc3QgV1RGOjpG
dW5jdGlvbjxHcmlkU3BhY2UoY29uc3QgVGFibGVHcmlkOjpTbG90Jiwgc2l6ZV90KT4mIHNsb3RT
cGFjZSkKK3sKKyAgICBzdHJ1Y3QgUmVzb2x2ZWRJdGVtIHsKKyAgICAgICAgR3JpZFNwYWNlIHNs
b3RTcGFjZTsKKyAgICAgICAgYm9vbCBpc0ZpeGVkIHsgZmFsc2UgfTsKKyAgICB9OworCisgICAg
YXV0byYgY29sdW1ucyA9IGdyaWQuY29sdW1ucygpOworICAgIGF1dG8mIHJvd3MgPSBncmlkLnJv
d3MoKTsKKyAgICAvLyAxLiBDb2xsZWN0IHRoZSBub24tc3Bhbm5pbmcgc3BhY2VzIGZpcnN0LiBU
aGV5IGFyZSB1c2VkIGZvciB0aGUgZmluYWwgZGlzdHJpYnV0aW9uIGFzIHdlbGwgYXMgZm9yIGRp
c3RyaWJ1dGluZyB0aGUgc3Bhbm5pbmcgc3BhY2UuCisgICAgVmVjdG9yPE9wdGlvbmFsPFJlc29s
dmVkSXRlbT4+IHJlc29sdmVkSXRlbXMoU3BhblR5cGU6OnNpemUoZ3JpZCkpOworICAgIGZvciAo
c2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1bW5zLnNpemUoKTsgKytj
b2x1bW5JbmRleCkgeworICAgICAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4
IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAgICAgICAgICAgIGF1dG8mIHNsb3QgPSAq
Z3JpZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0pOworICAgICAgICAgICAgaWYgKFNw
YW5UeXBlOjpoYXNTcGFuKHNsb3QpIHx8IFNwYW5UeXBlOjppc1NwYW5uZWQoc2xvdCkpCisgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhdXRvIGluZGV4ID0gU3BhblR5cGU6
OmluZGV4KGNvbHVtbkluZGV4LCByb3dJbmRleCk7CisgICAgICAgICAgICBpZiAoIXJlc29sdmVk
SXRlbXNbaW5kZXhdKQorICAgICAgICAgICAgICAgIHJlc29sdmVkSXRlbXNbaW5kZXhdID0gUmVz
b2x2ZWRJdGVtIHsgfTsKKyAgICAgICAgICAgIHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90U3Bh
Y2UgPSBtYXgocmVzb2x2ZWRJdGVtc1tpbmRleF0tPnNsb3RTcGFjZSwgc2xvdFNwYWNlKHNsb3Qs
IGluZGV4KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAyLiBDb2xsZWN0IHRoZSBzcGFu
bmluZyBjZWxscy4KKyAgICBzdHJ1Y3QgU3Bhbm5pbmdDZWxsIHsKKyAgICAgICAgU2xvdFBvc2l0
aW9uIHBvc2l0aW9uOworICAgICAgICBHcmlkU3BhY2UgdW5yZXNvbHZlZFNwYWNlOworICAgIH07
CisgICAgVmVjdG9yPFNwYW5uaW5nQ2VsbD4gc3Bhbm5pbmdDZWxsczsKKyAgICBmb3IgKHNpemVf
dCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAg
ICAgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IGNvbHVtbnMu
c2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBhdXRvJiBzbG90ID0gKmdyaWQu
c2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsKKyAgICAgICAgICAgIGlmIChTcGFuVHlw
ZTo6aGFzU3BhbihzbG90KSkKKyAgICAgICAgICAgICAgICBzcGFubmluZ0NlbGxzLmFwcGVuZCh7
IHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0sIHNsb3RTcGFjZShzbG90LCBTcGFuVHlwZTo6aW5k
ZXgoY29sdW1uSW5kZXgsIHJvd0luZGV4KSkgfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8g
V2UgbmVlZCB0aGVzZSBzcGFubmluZyBjZWxscyBpbiB0aGUgb3JkZXIgb2YgdGhlIG51bWJlciBv
ZiBjb2x1bW5zL3Jvd3MgdGhleSBzcGFuIHNvIHRoYXQKKyAgICAvLyB3ZSBjYW4gcmVzb2x2ZSBv
dmVybGFwcGluZyBzcGFucyBzdGFydGluZyB3aXRoIHRoZSBzaG9ydGVyIG9uZXMgZS5nLgorICAg
IC8vIDx0ZCBjb2xzcGFuPTQ+I2E8L3RkPjx0ZD4jYjwvdGQ+CisgICAgLy8gPHRkIGNvbHNwYW49
Mj4jYzwvdGQ+PHRkIGNvbHNwYW49Mz4jZDwvdGQ+CisgICAgc3RkOjpzb3J0KHNwYW5uaW5nQ2Vs
bHMuYmVnaW4oKSwgc3Bhbm5pbmdDZWxscy5lbmQoKSwgWyZdIChhdXRvJiBhLCBhdXRvJiBiKSB7
CisgICAgICAgIHJldHVybiBTcGFuVHlwZTo6c3BhbkNvdW50KGdyaWQuc2xvdChhLnBvc2l0aW9u
KS0+Y2VsbCgpKSA8IFNwYW5UeXBlOjpzcGFuQ291bnQoZ3JpZC5zbG90KGIucG9zaXRpb24pLT5j
ZWxsKCkpOworICAgIH0pOworCisgICAgLy8gMy4gRGlzdHJpYnV0ZSB0aGUgc3Bhbm5pbmcgY2Vs
bHMnIG1pbWltdW0gc3BhY2UgYWNyb3NzIHRoZSBjb2x1bW5zL3Jvd3MgdXNpbmcgdGhlIG5vbi1z
cGFubmluZyBzcGFjZXMuCisgICAgLy8gZS5nLiBbIDEgXVsgNSBdWyAxIF0KKyAgICAvLyAgICAg
IFsgICAgOSAgIF1bIDEgXQorICAgIC8vIFRoZSBpbml0aWFsIHdpZHRocyBhcmU6IFsgMiBdWyA3
IF1bIDEgXQorICAgIGZvciAoYXV0byBzcGFubmluZ0NlbGwgOiBzcGFubmluZ0NlbGxzKSB7Cisg
ICAgICAgIGF1dG8mIGNlbGwgPSBncmlkLnNsb3Qoc3Bhbm5pbmdDZWxsLnBvc2l0aW9uKS0+Y2Vs
bCgpOworICAgICAgICBhdXRvIHVucmVzb2x2ZWRTcGFubmluZ1NwYWNlID0gc3Bhbm5pbmdDZWxs
LnVucmVzb2x2ZWRTcGFjZTsKKyAgICAgICAgaWYgKCFyZXNvbHZlZEl0ZW1zW1NwYW5UeXBlOjpz
dGFydFNwYW4oY2VsbCldIHx8ICFyZXNvbHZlZEl0ZW1zW1NwYW5UeXBlOjplbmRTcGFuKGNlbGwp
IC0gMV0pIHsKKyAgICAgICAgICAgIC8vIDx0ZCBjb2xzcGFuPTQ+I2E8L3RkPjx0ZD4jYjwvdGQ+
CisgICAgICAgICAgICAvLyA8dGQgY29sc3Bhbj0yPiNjPC90ZD48dGQgY29sc3Bhbj0zPiNkPC90
ZD4KKyAgICAgICAgICAgIC8vIFVucmVzb2x2ZWQgY29sdW1ucyBhcmU6IDEgMiAzIDQKKyAgICAg
ICAgICAgIC8vIDEuIFRha2UgY29sc3Bhbj0yIChzaG9ydGVzdCBzcGFuKSBhbmQgcmVzb2x2ZSBj
b2x1bW4gMSBhbmQgMgorICAgICAgICAgICAgLy8gMi4gVGFrZSBjb2xzcGFuPTMgYW5kIHJlc29s
dmUgY29sdW1uIDMgYW5kIDQgKDUgaXMgcmVzb2x2ZWQgYmVjYXVzZSBpdCBhbHJlYWR5IGhhcyBh
IG5vbi1zcGFubmluZyBjZWxsKS4KKyAgICAgICAgICAgIC8vIDMuIGNvbHNwYW49NCBuZWVkcyBu
byByZXNvbHZpbmcgYmVjYXVzZSBhbGwgdGhlIHNwYW5uZWQgY29sdW1ucyAoMSAyIDMgNCkgaGF2
ZSBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuCisgICAgICAgICAgICBhdXRvIHVucmVzb2x2ZWRDb2x1
bW5Db3VudCA9IGNlbGwuY29sdW1uU3BhbigpOworICAgICAgICAgICAgZm9yIChhdXRvIHNwYW5J
bmRleCA9IFNwYW5UeXBlOjpzdGFydFNwYW4oY2VsbCk7IHNwYW5JbmRleCA8IFNwYW5UeXBlOjpl
bmRTcGFuKGNlbGwpOyArK3NwYW5JbmRleCkgeworICAgICAgICAgICAgICAgIGlmICghcmVzb2x2
ZWRJdGVtc1tzcGFuSW5kZXhdKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgICAgICBBU1NFUlQodW5yZXNvbHZlZENvbHVtbkNvdW50KTsKKyAgICAgICAgICAgICAg
ICAtLXVucmVzb2x2ZWRDb2x1bW5Db3VudDsKKyAgICAgICAgICAgICAgICB1bnJlc29sdmVkU3Bh
bm5pbmdTcGFjZSAtPSByZXNvbHZlZEl0ZW1zW3NwYW5JbmRleF0tPnNsb3RTcGFjZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVCh1bnJlc29sdmVkQ29sdW1uQ291bnQpOworICAg
ICAgICAgICAgYXV0byBlcXVhbFNwYWNlRm9yU3Bhbm5lZENvbHVtbnMgPSB1bnJlc29sdmVkU3Bh
bm5pbmdTcGFjZSAvIHVucmVzb2x2ZWRDb2x1bW5Db3VudDsKKyAgICAgICAgICAgIGZvciAoYXV0
byBzcGFuSW5kZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpOyBzcGFuSW5kZXggPCBTcGFu
VHlwZTo6ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAo
cmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1zW3NwYW5JbmRleF0gPSBSZXNvbHZlZEl0ZW0g
eyBlcXVhbFNwYWNlRm9yU3Bhbm5lZENvbHVtbnMsIGZhbHNlIH07CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyAxLiBDb2xsZWN0IHRoZSBub24tc3Bhbmlu
ZyByZXNvbHZlZCBzcGFjZXMuCisgICAgICAgICAgICAvLyAyLiBEaXN0cmlidXRlIHRoZSBleHRy
YSBzcGFjZSBhbW9uZyB0aGUgc3Bhbm5lZCBjb2x1bW5zL3Jvd3MgYmFzZWQgb24gdGhlIHJlc29s
dmVkIHNwYWNlIHZhbHVlcy4KKyAgICAgICAgICAgIC8vIGUuZy4gc3Bhbm5pbmcgd2lkdGg6IFsg
ICA5ICAgXS4gUmVzb2x2ZWQgd2lkdGhzIGZvciB0aGUgc3Bhbm5lZCBjb2x1bW5zOiBbIDEgXSBb
IDIgXQorICAgICAgICAgICAgLy8gTmV3IHJlc29sdmVkIHdpZHRoczogWyAzIF0gWyA2IF0uCisg
ICAgICAgICAgICBhdXRvIHJlc29sdmVkU3Bhbm5pbmdTcGFjZSA9IEdyaWRTcGFjZSB7IH07Cisg
ICAgICAgICAgICBmb3IgKGF1dG8gc3BhbkluZGV4ID0gU3BhblR5cGU6OnN0YXJ0U3BhbihjZWxs
KTsgc3BhbkluZGV4IDwgU3BhblR5cGU6OmVuZFNwYW4oY2VsbCk7ICsrc3BhbkluZGV4KQorICAg
ICAgICAgICAgICAgIHJlc29sdmVkU3Bhbm5pbmdTcGFjZSArPSByZXNvbHZlZEl0ZW1zW3NwYW5J
bmRleF0tPnNsb3RTcGFjZTsKKyAgICAgICAgICAgIGlmIChyZXNvbHZlZFNwYW5uaW5nU3BhY2Uu
dmFsdWUgPj0gdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UudmFsdWUpIHsKKyAgICAgICAgICAgICAg
ICAvLyBUaGUgc3Bhbm5pbmcgY2VsbCBmaXRzIHRoZSBzcGFubmVkIGNvbHVtbnMvcm93cyBqdXN0
IGZpbmUuIE5vdGhpbmcgdG8gZGlzdHJpYnV0ZS4KKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gc3BhY2luZyA9IFNwYW5UeXBlOjpzcGFj
aW5nKGdyaWQpICogKFNwYW5UeXBlOjpzcGFuQ291bnQoY2VsbCkgLSAxKTsKKyAgICAgICAgICAg
IGF1dG8gc3BhY2VUb0Rpc3RyaWJ1dGUgPSB1bnJlc29sdmVkU3Bhbm5pbmdTcGFjZSAtIEdyaWRT
cGFjZSB7IHNwYWNpbmcsIHNwYWNpbmcgfSAtIHJlc29sdmVkU3Bhbm5pbmdTcGFjZTsgCisgICAg
ICAgICAgICBpZiAoIXNwYWNlVG9EaXN0cmlidXRlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAg
ICAgIGF1dG8gZGlzdHJpYnV0aW9uUmF0aW8gPSBzcGFjZVRvRGlzdHJpYnV0ZS5kaXN0cmlidXRp
b25CYXNlIC8gcmVzb2x2ZWRTcGFubmluZ1NwYWNlLmRpc3RyaWJ1dGlvbkJhc2U7CisgICAgICAg
ICAgICAgICAgZm9yIChhdXRvIHNwYW5JbmRleCA9IFNwYW5UeXBlOjpzdGFydFNwYW4oY2VsbCk7
IHNwYW5JbmRleCA8IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwpOyArK3NwYW5JbmRleCkKKyAgICAg
ICAgICAgICAgICAgICAgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2UgKz0gR3Jp
ZFNwYWNlIHsgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2UudmFsdWUgKiBkaXN0
cmlidXRpb25SYXRpbywgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2UuZGlzdHJp
YnV0aW9uQmFzZSAqIGRpc3RyaWJ1dGlvblJhdGlvfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH0KKyAgICAvLyA0LiBEaXN0cmlidXRlIHRoZSBleHRyYSBzcGFjZSB1c2luZyB0aGUg
ZmluYWwgcmVzb2x2ZWQgd2lkdGhzLgorI2lmIEFTU0VSVF9FTkFCTEVECisgICAgLy8gV2UgaGF2
ZSB0byBoYXZlIGFsbCB0aGUgc3BhY2VzIHJlc29sdmVkIGF0IHRoaXMgcG9pbnQuCisgICAgZm9y
IChhdXRvJiByZXNvbHZlZEl0ZW0gOiByZXNvbHZlZEl0ZW1zKQorICAgICAgICBBU1NFUlQocmVz
b2x2ZWRJdGVtKTsKKyNlbmRpZgorICAgIC8vIEZpeGVkIHNpemUgY2VsbHMgZG9uJ3QgcGFydGlj
aXBhdGUgaW4gYXZhaWxhYmxlIHNwYWNlIGRpc3RyaWJ1dGlvbi4KKyAgICBhdXRvIGFkanVzdGFi
bGVkU3BhY2UgPSBHcmlkU3BhY2UgeyB9OworICAgIGZvciAoYXV0byYgcmVzb2x2ZWRJdGVtIDog
cmVzb2x2ZWRJdGVtcykgeworICAgICAgICBpZiAocmVzb2x2ZWRJdGVtLT5pc0ZpeGVkKQorICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIGFkanVzdGFibGVkU3BhY2UgKz0gcmVzb2x2ZWRJ
dGVtLT5zbG90U3BhY2U7CisgICAgfQorCisgICAgVmVjdG9yPExheW91dFVuaXQ+IGRpc3RyaWJ1
dGVkU3BhY2VzKHJlc29sdmVkSXRlbXMuc2l6ZSgpKTsKKyAgICBmbG9hdCBzcGFjZVRvRGlzdHJp
YnV0ZSA9IGF2YWlsYWJsZVNwYWNlIC0gYWRqdXN0YWJsZWRTcGFjZS52YWx1ZSAtICgocmVzb2x2
ZWRJdGVtcy5zaXplKCkgKyAxKSAqIFNwYW5UeXBlOjpzcGFjaW5nKGdyaWQpKTsKKyAgICAvLyBF
c3NlbnRpYWxseSB0aGUgcmVtYWluaW5nIHNwYWNlIHRvIGRpc3RyaWJ1dGUgc2hvdWxkIG5ldmVy
IGJlIG5lZ2F0aXZlLiBMYXlvdXRVbml0OjplcHNpbG9uKCkgaXMgcmVxdWlyZWQgdG8gY29tcGVu
c2F0ZSBmb3IgTGF5b3V0VW5pdCdzIGxvdyBwcmVjaXNpb24uCisgICAgQVNTRVJUKHNwYWNlVG9E
aXN0cmlidXRlID49IC1MYXlvdXRVbml0OjplcHNpbG9uKCkgKiByZXNvbHZlZEl0ZW1zLnNpemUo
KSk7CisgICAgLy8gRGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UgYmFzZWQgb24gdGhlIHJlc29s
dmVkIHNwYWNlcy4KKyAgICBhdXRvIGRpc3RyaWJ1dGlvblJhdGlvID0gc3BhY2VUb0Rpc3RyaWJ1
dGUgLyBhZGp1c3RhYmxlZFNwYWNlLmRpc3RyaWJ1dGlvbkJhc2U7CisgICAgZm9yIChzaXplX3Qg
aW5kZXggPSAwOyBpbmRleCA8IHJlc29sdmVkSXRlbXMuc2l6ZSgpOyArK2luZGV4KSB7CisgICAg
ICAgIGF1dG8gc2xvdFNwYWNlID0gcmVzb2x2ZWRJdGVtc1tpbmRleF0tPnNsb3RTcGFjZS52YWx1
ZTsKKyAgICAgICAgYXV0byBuZWVkc1NwYWNlRGlzdHJpYnV0aW9uID0gc3BhY2VUb0Rpc3RyaWJ1
dGUgJiYgIXJlc29sdmVkSXRlbXNbaW5kZXhdLT5pc0ZpeGVkOworICAgICAgICBkaXN0cmlidXRl
ZFNwYWNlc1tpbmRleF0gPSBMYXlvdXRVbml0IHsgc2xvdFNwYWNlIH07CisgICAgICAgIGlmICgh
bmVlZHNTcGFjZURpc3RyaWJ1dGlvbikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBk
aXN0cmlidXRlZFNwYWNlc1tpbmRleF0gKz0gTGF5b3V0VW5pdCB7IHJlc29sdmVkSXRlbXNbaW5k
ZXhdLT5zbG90U3BhY2UuZGlzdHJpYnV0aW9uQmFzZSAqIGRpc3RyaWJ1dGlvblJhdGlvIH07Cisg
ICAgfQorICAgIHJldHVybiBkaXN0cmlidXRlZFNwYWNlczsKK30KKworVGFibGVGb3JtYXR0aW5n
Q29udGV4dDo6VGFibGVMYXlvdXQ6OkRpc3RyaWJ1dGVkU3BhY2VzIFRhYmxlRm9ybWF0dGluZ0Nv
bnRleHQ6OlRhYmxlTGF5b3V0OjpkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZShMYXlvdXRVbml0
IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSkKK3sKKyAgICBlbnVtIGNsYXNzIENvbHVtbldpZHRo
QmFsYW5jaW5nQmFzZSB7IE1pbmltdW1XaWR0aCwgTWF4aW11bVdpZHRoIH07CisgICAgYXV0byBj
b2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UgPSBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UgPj0gbV9n
cmlkLndpZHRoQ29uc3RyYWludHMoKS0+bWF4aW11bSA/IENvbHVtbldpZHRoQmFsYW5jaW5nQmFz
ZTo6TWF4aW11bVdpZHRoIDogQ29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlOjpNaW5pbXVtV2lkdGg7
CisgICAgcmV0dXJuIGRpc3RyaWJ1dGVBdmFpbGFibGVTcGFjZTxDb2x1bW5TcGFuPihtX2dyaWQs
IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSwgWyZdIChjb25zdCBUYWJsZUdyaWQ6OlNsb3QmIHNs
b3QsIHNpemVfdCBjb2x1bW5JbmRleCkgeworICAgICAgICBhdXRvJiBjb2x1bW4gPSBtX2dyaWQu
Y29sdW1ucygpLmxpc3QoKVtjb2x1bW5JbmRleF07CisgICAgICAgIGF1dG8gY29sdW1uQm94Rml4
ZWRXaWR0aCA9IGNvbHVtbi5ib3goKSA/IGNvbHVtbi5ib3goKS0+Y29sdW1uV2lkdGgoKS52YWx1
ZU9yKDBfbHUpIDogMF9sdTsKKyAgICAgICAgYXV0byBtaW5pbXVtV2lkdGggPSBzdGQ6Om1heDxm
bG9hdD4oc2xvdC53aWR0aENvbnN0cmFpbnRzKCkubWluaW11bSwgY29sdW1uQm94Rml4ZWRXaWR0
aCk7CisgICAgICAgIGF1dG8gbWF4aW11bVdpZHRoID0gc3RkOjptYXg8ZmxvYXQ+KHNsb3Qud2lk
dGhDb25zdHJhaW50cygpLm1heGltdW0sIGNvbHVtbkJveEZpeGVkV2lkdGgpOworCisgICAgICAg
IGlmIChjb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UgPT0gQ29sdW1uV2lkdGhCYWxhbmNpbmdCYXNl
OjpNaW5pbXVtV2lkdGgpIHsKKyAgICAgICAgICAgIEFTU0VSVChtYXhpbXVtV2lkdGggPj0gbWlu
aW11bVdpZHRoKTsKKyAgICAgICAgICAgIHJldHVybiBHcmlkU3BhY2UgeyBtaW5pbXVtV2lkdGgs
IG1heGltdW1XaWR0aCAtIG1pbmltdW1XaWR0aCB9OworICAgICAgICB9CisgICAgICAgIC8vIFdo
ZW4gdGhlIGNvbHVtbiBoYXMgYSBmaXhlZCB3aWR0aCBjZWxsLCB0aGUgbWF4aW11bSB3aWR0aCBi
YWxhbmNpbmcgaXMgYmFzZWQgb24gdGhlIG1pbmltdW0gd2lkdGguCisgICAgICAgIGlmIChjb2x1
bW4uaXNGaXhlZFdpZHRoKCkpCisgICAgICAgICAgICByZXR1cm4gR3JpZFNwYWNlIHsgbWluaW11
bVdpZHRoLCBtYXhpbXVtV2lkdGggfTsKKyAgICAgICAgcmV0dXJuIEdyaWRTcGFjZSB7IG1heGlt
dW1XaWR0aCwgbWF4aW11bVdpZHRoIH07CisgICAgfSk7Cit9CisKK1RhYmxlRm9ybWF0dGluZ0Nv
bnRleHQ6OlRhYmxlTGF5b3V0OjpEaXN0cmlidXRlZFNwYWNlcyBUYWJsZUZvcm1hdHRpbmdDb250
ZXh0OjpUYWJsZUxheW91dDo6ZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNlKE9wdGlvbmFsPExheW91
dFVuaXQ+IGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpCit7CisgICAgYXV0byYgcm93cyA9IG1fZ3Jp
ZC5yb3dzKCk7CisgICAgYXV0byYgY29sdW1ucyA9IG1fZ3JpZC5jb2x1bW5zKCk7CisKKyAgICBW
ZWN0b3I8TGF5b3V0VW5pdD4gcm93SGVpZ2h0KHJvd3Muc2l6ZSgpKTsKKyAgICBhdXRvIHRhYmxl
VXNlZEhlaWdodCA9IExheW91dFVuaXQgeyB9OworICAgIC8vIDIuIENvbGxlY3QgaW5pdGlhbCwg
YmFzZWxpbmUgYWxpZ25lZCByb3cgaGVpZ2h0cy4KKyAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9
IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5kZXgpIHsKKyAgICAgICAgYXV0byBt
YXhpbXVtQ29sdW1uQXNjZW50ID0gSW5saW5lTGF5b3V0VW5pdCB7IH07CisgICAgICAgIGF1dG8g
bWF4aW11bUNvbHVtbkRlc2NlbnQgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKKyAgICAgICAgLy8g
SW5pdGlhbCBtaW5pbXVtIGhlaWdodCBpcyB0aGUgY29tcHV0ZWQgaGVpZ2h0IGlmIGF2YWlsYWJs
ZSA8dHIgc3R5bGU9ImhlaWdodDogMTAwcHgiPjx0ZD48L3RkPjwvdHI+CisgICAgICAgIHJvd0hl
aWdodFtyb3dJbmRleF0gPSBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5KCkuY29tcHV0ZWRI
ZWlnaHQocm93cy5saXN0KClbcm93SW5kZXhdLmJveCgpLCBhdmFpbGFibGVWZXJ0aWNhbFNwYWNl
KS52YWx1ZU9yKDBfbHUpOworICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNv
bHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAg
IGF1dG8mIHNsb3QgPSAqbV9ncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7Cisg
ICAgICAgICAgICBpZiAoc2xvdC5pc1Jvd1NwYW5uZWQoKSkKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIGlmIChzbG90Lmhhc1Jvd1NwYW4oKSkKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIFRoZSBtaW5pbXVtIGhlaWdodCBvZiBhIHJvdyAo
d2l0aG91dCBzcGFubmluZy1yZWxhdGVkIGhlaWdodCBkaXN0cmlidXRpb24pIGlzIGRlZmluZWQg
YXMgdGhlIGhlaWdodCBvZiBhbiBoeXBvdGhldGljYWwKKyAgICAgICAgICAgIC8vIGxpbmVib3gg
Y29udGFpbmluZyB0aGUgY2VsbHMgb3JpZ2luYXRpbmcgaW4gdGhlIHJvdy4KKyAgICAgICAgICAg
IGF1dG8mIGNlbGwgPSBzbG90LmNlbGwoKTsKKyAgICAgICAgICAgIGF1dG8mIGNlbGxCb3ggPSBj
ZWxsLmJveCgpOworICAgICAgICAgICAgYXV0byBoZWlnaHQgPSBmb3JtYXR0aW5nQ29udGV4dCgp
Lmdlb21ldHJ5Rm9yQm94KGNlbGxCb3gpLmJvcmRlckJveEhlaWdodCgpOworICAgICAgICAgICAg
aWYgKGNlbGxCb3guc3R5bGUoKS52ZXJ0aWNhbEFsaWduKCkgPT0gVmVydGljYWxBbGlnbjo6QmFz
ZWxpbmUpIHsKKyAgICAgICAgICAgICAgICBtYXhpbXVtQ29sdW1uQXNjZW50ID0gc3RkOjptYXgo
bWF4aW11bUNvbHVtbkFzY2VudCwgY2VsbC5iYXNlbGluZSgpKTsKKyAgICAgICAgICAgICAgICBt
YXhpbXVtQ29sdW1uRGVzY2VudCA9IHN0ZDo6bWF4KG1heGltdW1Db2x1bW5EZXNjZW50LCBoZWln
aHQgLSBjZWxsLmJhc2VsaW5lKCkpOworICAgICAgICAgICAgICAgIHJvd0hlaWdodFtyb3dJbmRl
eF0gPSBzdGQ6Om1heChyb3dIZWlnaHRbcm93SW5kZXhdLCBMYXlvdXRVbml0IHsgbWF4aW11bUNv
bHVtbkFzY2VudCArIG1heGltdW1Db2x1bW5EZXNjZW50IH0pOworICAgICAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICAgICAgcm93SGVpZ2h0W3Jvd0luZGV4XSA9IHN0ZDo6bWF4KHJvd0hlaWdo
dFtyb3dJbmRleF0sIGhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgdGFibGVVc2VkSGVpZ2h0
ICs9IHJvd0hlaWdodFtyb3dJbmRleF07CisgICAgfQorICAgIC8vIEZJWE1FOiBDb2xsZWN0IHNw
YW5uaW5nIHJvdyBtYXhpbXVtIGhlaWdodHMuCisKKyAgICB0YWJsZVVzZWRIZWlnaHQgKz0gKHJv
d3Muc2l6ZSgpICsgMSkgKiBtX2dyaWQudmVydGljYWxTcGFjaW5nKCk7CisgICAgYXV0byBhdmFp
bGFibGVTcGFjZSA9IHN0ZDo6bWF4KGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UudmFsdWVPcigwX2x1
KSwgdGFibGVVc2VkSGVpZ2h0KTsKKyAgICAvLyBEaXN0cmlidXRlIGV4dHJhIHNwYWNlIGlmIHRo
ZSB0YWJsZSBpcyBzdXBwb3NlZCB0byBiZSB0YWxsZXIgdGhhbiB0aGUgc3VtIG9mIHRoZSByb3cg
aGVpZ2h0cy4KKyAgICByZXR1cm4gZGlzdHJpYnV0ZUF2YWlsYWJsZVNwYWNlPFJvd1NwYW4+KG1f
Z3JpZCwgYXZhaWxhYmxlU3BhY2UsIFsmXSAoY29uc3QgVGFibGVHcmlkOjpTbG90JiBzbG90LCBz
aXplX3Qgcm93SW5kZXgpIHsKKyAgICAgICAgaWYgKHNsb3QuaGFzUm93U3BhbigpKQorICAgICAg
ICAgICAgcmV0dXJuIEdyaWRTcGFjZSB7IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JC
b3goc2xvdC5jZWxsKCkuYm94KCkpLmJvcmRlckJveEhlaWdodCgpLCBmb3JtYXR0aW5nQ29udGV4
dCgpLmdlb21ldHJ5Rm9yQm94KHNsb3QuY2VsbCgpLmJveCgpKS5ib3JkZXJCb3hIZWlnaHQoKSB9
OworICAgICAgICBhdXRvJiByb3dzID0gbV9ncmlkLnJvd3MoKTsKKyAgICAgICAgYXV0byBjb21w
dXRlZFJvd0hlaWdodCA9IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnkoKS5jb21wdXRlZEhl
aWdodChyb3dzLmxpc3QoKVtyb3dJbmRleF0uYm94KCksIHsgfSk7CisgICAgICAgIGF1dG8gaGVp
Z2h0ID0gc3RkOjptYXg8ZmxvYXQ+KHJvd0hlaWdodFtyb3dJbmRleF0sIGNvbXB1dGVkUm93SGVp
Z2h0LnZhbHVlT3IoMF9sdSkpOworICAgICAgICByZXR1cm4gR3JpZFNwYWNlIHsgaGVpZ2h0LCBo
ZWlnaHQgfTsKKyAgICB9KTsKK30KKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxl
Rm9ybWF0dGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAKZGVsZXRl
ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMmFmN2M1ZWQ4OGQ1MDRjYWM0MjVhMTM1MjEwMDhi
NmU1OGI5YWMuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcv
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
fQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0
aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQuaCBiL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1Rh
YmxlRm9ybWF0dGluZ0NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYz
MGRlMTM1NDU2NjU1ODFlYjk0OWEyN2I4MGRmNGUxMjIyNWU2Zi4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0
dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmgKKysr
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
Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdD
b250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNw
cCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0
aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IGQ3MzIzOTI2OTRmNmU3YTgyNDI5YzIwYTVlNjEwOTg0MGUyYWVkYzguLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNv
cmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0
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
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dFF1aXJrcy5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJs
ZUZvcm1hdHRpbmdDb250ZXh0UXVpcmtzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggYjY0YTYyZGZmMDcxNGFkNjhmYTc4OTY4NWZiYmIyMTM3NGZmMTUzMi4uMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
Zm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0
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
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZv
cm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nU3RhdGUu
Y3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzEwZWY1ZTEzMjYwZDFhMzFmYjFk
OWU4NmUyYzZiNjIzYTY1OTg3Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVm
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
ewotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
b3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmgg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGlu
Zy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3
ZDFlNGFmMGI5NmFjYzRkMzQzNDVhYTljZjZkODNmNzhkNTNjNzZmLi4wMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mb3Jt
YXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ1N0YXRlLmgKKysr
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
KCkpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRp
bmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mb3JtYXR0aW5nQ29udGV4dHMvdGFibGVmb3JtYXR0aW5nL1RhYmxlR3JpZC5jcHAK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDFkOGQwOGE1MjVlNzU2YWJjZGNiMWEy
MTVjOWY0NjU2YWNmYjYuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1h
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
bmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0
cy90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuaApkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggNjI1YTNmNDRiZjYyMjFjZTQ2NTI1OTQwOTEzZWNlMTBiMDZhYWNl
Zi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUdy
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
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9ybWF0dGluZ0NvbnRleHRzL3Rh
YmxlZm9ybWF0dGluZy9UYWJsZUxheW91dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZm9y
bWF0dGluZ0NvbnRleHRzL3RhYmxlZm9ybWF0dGluZy9UYWJsZUxheW91dC5jcHAKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzUyYzVhMTdmOGMwYjNkM2QyNDRlOTI1YTdlZjI0ODE5
OGE4ZDMuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zvcm1hdHRpbmdDb250ZXh0cy90YWJsZWZvcm1hdHRpbmcvVGFi
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>

          </attachment>
      

    </bug>

</bugzilla>