<?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>134191</bug_id>
          
          <creation_ts>2014-06-23 07:28:10 -0700</creation_ts>
          <short_desc>[ATK] Remove some unused code from DumpRenderTree</short_desc>
          <delta_ts>2014-06-24 01:10:19 -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>Accessibility</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</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="Krzysztof Czech">k.czech</reporter>
          <assigned_to name="Krzysztof Czech">k.czech</assigned_to>
          <cc>mario</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1017546</commentid>
    <comment_count>0</comment_count>
    <who name="Krzysztof Czech">k.czech</who>
    <bug_when>2014-06-23 07:28:10 -0700</bug_when>
    <thetext>DumpRenderTree/atk could be removed since GTK and EFL has stopped supporting WK1.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1017547</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2014-06-23 07:28:20 -0700</bug_when>
    <thetext>&lt;rdar://problem/17418441&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1017550</commentid>
    <comment_count>2</comment_count>
      <attachid>233604</attachid>
    <who name="Krzysztof Czech">k.czech</who>
    <bug_when>2014-06-23 07:30:44 -0700</bug_when>
    <thetext>Created attachment 233604
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1017855</commentid>
    <comment_count>3</comment_count>
      <attachid>233604</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2014-06-23 22:52:45 -0700</bug_when>
    <thetext>Comment on attachment 233604
patch

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

&gt; Tools/ChangeLog:8
&gt; +        DumpRenderTree/atk could be removed since GTK and EFL has stopped supporting WK1.

/atk &quot;can&quot; be removed...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1017894</commentid>
    <comment_count>4</comment_count>
    <who name="Krzysztof Czech">k.czech</who>
    <bug_when>2014-06-24 01:10:19 -0700</bug_when>
    <thetext>Committed r170352: &lt;http://trac.webkit.org/changeset/170352&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>233604</attachid>
            <date>2014-06-23 07:30:44 -0700</date>
            <delta_ts>2014-06-23 22:52:45 -0700</delta_ts>
            <desc>patch</desc>
            <filename>a11y-remove-drt-atk-support.patch</filename>
            <type>text/plain</type>
            <size>83312</size>
            <attacher name="Krzysztof Czech">k.czech</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCAzNGMz
MWVjLi5kYzE1ZmE0IDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTQtMDYtMjMgIEtyenlzenRvZiBDemVjaCAgPGsu
Y3plY2hAc2Ftc3VuZy5jb20+CisKKyAgICAgICAgW0FUS10gUmVtb3ZlIHNvbWUgdW51c2VkIGNv
ZGUgZnJvbSBEdW1wUmVuZGVyVHJlZQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTM0MTkxCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgRHVtcFJlbmRlclRyZWUvYXRrIGNvdWxkIGJlIHJlbW92ZWQgc2luY2Ug
R1RLIGFuZCBFRkwgaGFzIHN0b3BwZWQgc3VwcG9ydGluZyBXSzEuCisKKyAgICAgICAgKiBEdW1w
UmVuZGVyVHJlZS9hdGsvQWNjZXNzaWJpbGl0eUNhbGxiYWNrcy5oOiBSZW1vdmVkLgorICAgICAg
ICAqIER1bXBSZW5kZXJUcmVlL2F0ay9BY2Nlc3NpYmlsaXR5Q2FsbGJhY2tzQXRrLmNwcDogUmVt
b3ZlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9hdGsvQWNjZXNzaWJpbGl0eUNvbnRyb2xs
ZXJBdGsuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2F0ay9BY2Nlc3Np
YmlsaXR5Tm90aWZpY2F0aW9uSGFuZGxlckF0ay5jcHA6IFJlbW92ZWQuCisgICAgICAgICogRHVt
cFJlbmRlclRyZWUvYXRrL0FjY2Vzc2liaWxpdHlOb3RpZmljYXRpb25IYW5kbGVyQXRrLmg6IFJl
bW92ZWQuCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvYXRrL0FjY2Vzc2liaWxpdHlVSUVsZW1l
bnRBdGsuY3BwOiBSZW1vdmVkLgorCiAyMDE0LTA2LTIxICBHeXV5b3VuZyBLaW0gIDxneXV5b3Vu
Zy5raW1Ac2Ftc3VuZy5jb20+CiAKICAgICAgICAgRGlzYWJsZSBnYW1lcGFkIGZlYXR1cmUgb24g
RUZMIGFuZCBHVEsgcG9ydHMgYnkgZGVmYXVsdApkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRl
clRyZWUvYXRrL0FjY2Vzc2liaWxpdHlDYWxsYmFja3MuaCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVl
L2F0ay9BY2Nlc3NpYmlsaXR5Q2FsbGJhY2tzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDFlZDVkNzkuLjAwMDAwMDAKLS0tIGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvYXRrL0FjY2Vz
c2liaWxpdHlDYWxsYmFja3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMTEgSWdhbGlhIFMuTC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMu
ICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMg
b2YKLSAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
Ci0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
Ci0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgQWNjZXNzaWJpbGl0eUNhbGxiYWNrc19oCi0j
ZGVmaW5lIEFjY2Vzc2liaWxpdHlDYWxsYmFja3NfaAotCi0jaWYgSEFWRShBQ0NFU1NJQklMSVRZ
KQotCi0jaW5jbHVkZSAiQWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXJBdGsuaCIKLSNp
bmNsdWRlICJBY2Nlc3NpYmlsaXR5VUlFbGVtZW50LmgiCi0KLXZvaWQgY29ubmVjdEFjY2Vzc2li
aWxpdHlDYWxsYmFja3MoKTsKLWJvb2wgZGlzY29ubmVjdEFjY2Vzc2liaWxpdHlDYWxsYmFja3Mo
KTsKLXZvaWQgYWRkQWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXIoQWNjZXNzaWJpbGl0
eU5vdGlmaWNhdGlvbkhhbmRsZXIqKTsKLXZvaWQgcmVtb3ZlQWNjZXNzaWJpbGl0eU5vdGlmaWNh
dGlvbkhhbmRsZXIoQWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXIqKTsKLQotI2VuZGlm
IC8vIEhBVkUoQUNDRVNTSUJJTElUWSkKLQotI2VuZGlmIC8vIEFjY2Vzc2liaWxpdHlDYWxsYmFj
a3NfaApkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvYXRrL0FjY2Vzc2liaWxpdHlD
YWxsYmFja3NBdGsuY3BwIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvYXRrL0FjY2Vzc2liaWxpdHlD
YWxsYmFja3NBdGsuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2NhMThlLi4w
MDAwMDAwCi0tLSBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2F0ay9BY2Nlc3NpYmlsaXR5Q2FsbGJh
Y2tzQXRrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChDKSAyMDExIElnYWxpYSBTLkwuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiAgTmVpdGhl
ciB0aGUgbmFtZSBvZiBBcHBsZSBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCi0gKiAg
ICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZAotICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQotICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiQWNjZXNzaWJpbGl0
eUNhbGxiYWNrcy5oIgotCi0jaWYgSEFWRShBQ0NFU1NJQklMSVRZKQotCi0jaW5jbHVkZSAiQWNj
ZXNzaWJpbGl0eUNvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJBY2Nlc3NpYmlsaXR5Tm90aWZpY2F0
aW9uSGFuZGxlckF0ay5oIgotI2luY2x1ZGUgIkR1bXBSZW5kZXJUcmVlLmgiCi0jaW5jbHVkZSAi
SlNSZXRhaW5QdHIuaCIKLSNpbmNsdWRlIDxhdGsvYXRrLmg+Ci0jaW5jbHVkZSA8d3RmL2dvYmpl
Y3QvR1VuaXF1ZVB0ci5oPgotCi0jaWYgUExBVEZPUk0oR1RLKQotI2luY2x1ZGUgIldlYkNvcmVT
dXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydEd0ay5oIgotI2luY2x1ZGUgPHdlYmtpdC93ZWJr
aXQuaD4KLSNlbmRpZgotCi0jaWYgUExBVEZPUk0oRUZMKQotI2luY2x1ZGUgIkR1bXBSZW5kZXJU
cmVlQ2hyb21lLmgiCi0jaW5jbHVkZSAiV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBw
b3J0RWZsLmgiCi0jZW5kaWYKLQotdHlwZWRlZiBIYXNoTWFwPFBsYXRmb3JtVUlFbGVtZW50LCBB
Y2Nlc3NpYmlsaXR5Tm90aWZpY2F0aW9uSGFuZGxlcio+IE5vdGlmaWNhdGlvbkhhbmRsZXJzTWFw
OwotCi1zdGF0aWMgZ3VpbnQgc3RhdGVDaGFuZ2VMaXN0ZW5lcklkID0gMDsKLXN0YXRpYyBndWlu
dCBmb2N1c0V2ZW50TGlzdGVuZXJJZCA9IDA7Ci1zdGF0aWMgZ3VpbnQgYWN0aXZlRGVzY2VuZGFu
dENoYW5nZWRMaXN0ZW5lcklkID0gMDsKLXN0YXRpYyBndWludCBjaGlsZHJlbkNoYW5nZWRMaXN0
ZW5lcklkID0gMDsKLXN0YXRpYyBndWludCBwcm9wZXJ0eUNoYW5nZWRMaXN0ZW5lcklkID0gMDsK
LXN0YXRpYyBndWludCB2aXNpYmxlRGF0YUNoYW5nZWRMaXN0ZW5lcklkID0gMDsKLXN0YXRpYyBn
dWludCBsb2FkQ29tcGxldGVMaXN0ZW5lcklkID0gMDsKLS8vIFVwIHRvIDIwMTQgaXQgd2FzIG9i
bGlnYXRvcnkgdG8gbWlycm9yIHRoZSBjaGFuZ2VzIGZyb20KLS8vIFdlYktpdFRlc3RSdW5uZXIv
SW5qZWN0ZWRCdW5kbGUvYXRrL0FjY2Vzc2liaWxpdHlOb3RpZmljYXRpb25IYW5kbGVyQXRrLmNw
cCwKLS8vIGJ1dCB0aGUgaGFiaXQgaGFzIGJlZW4gZHJvcHBlZDogaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTEzMjUyNyNjNgotc3RhdGljIE5vdGlmaWNhdGlvbkhhbmRs
ZXJzTWFwIG5vdGlmaWNhdGlvbkhhbmRsZXJzOwotc3RhdGljIEFjY2Vzc2liaWxpdHlOb3RpZmlj
YXRpb25IYW5kbGVyKiBnbG9iYWxOb3RpZmljYXRpb25IYW5kbGVyID0gMDsKLQotZXh0ZXJuIGJv
b2wgbG9nZ2luZ0FjY2Vzc2liaWxpdHlFdmVudHM7Ci0KLXN0YXRpYyB2b2lkIHByaW50QWNjZXNz
aWJpbGl0eUV2ZW50KEF0a09iamVjdCogYWNjZXNzaWJsZSwgY29uc3QgZ2NoYXIqIHNpZ25hbE5h
bWUsIGNvbnN0IGdjaGFyKiBzaWduYWxWYWx1ZSkKLXsKLSAgICAvLyBEbyBub3QgaGFuZGxlIHN0
YXRlLWNoYW5nZTpkZWZ1bmN0IHNpZ25hbHMsIGFzIHRoZSBBdGtPYmplY3QKLSAgICAvLyBhc3Nv
Y2lhdGVkIHRvIHRoZW0gd2lsbCBub3QgYmUgdmFsaWQgYXQgdGhpcyBwb2ludCBhbHJlYWR5Lgot
ICAgIGlmICghc2lnbmFsTmFtZSB8fCAhZ19zdHJjbXAwKHNpZ25hbE5hbWUsICJzdGF0ZS1jaGFu
Z2U6ZGVmdW5jdCIpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIWFjY2Vzc2libGUgfHwg
IUFUS19JU19PQkpFQ1QoYWNjZXNzaWJsZSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0
IGdjaGFyKiBvYmplY3ROYW1lID0gYXRrX29iamVjdF9nZXRfbmFtZShhY2Nlc3NpYmxlKTsKLSAg
ICBBdGtSb2xlIG9iamVjdFJvbGUgPSBhdGtfb2JqZWN0X2dldF9yb2xlKGFjY2Vzc2libGUpOwot
Ci0gICAgLy8gVHJ5IHRvIGFsd2F5cyBwcm92aWRlIGEgbmFtZSB0byBiZSBsb2dnZWQgZm9yIHRo
ZSBvYmplY3QuCi0gICAgaWYgKCFvYmplY3ROYW1lIHx8ICpvYmplY3ROYW1lID09ICdcMCcpCi0g
ICAgICAgIG9iamVjdE5hbWUgPSAiKE5vIG5hbWUpIjsKLQotICAgIEdVbmlxdWVQdHI8Z2NoYXI+
IHNpZ25hbE5hbWVBbmRWYWx1ZShzaWduYWxWYWx1ZSA/IGdfc3RyZHVwX3ByaW50ZigiJXMgPSAl
cyIsIHNpZ25hbE5hbWUsIHNpZ25hbFZhbHVlKSA6IGdfc3RyZHVwKHNpZ25hbE5hbWUpKTsKLSAg
ICBwcmludGYoIkFjY2Vzc2liaWxpdHkgb2JqZWN0IGVtaXR0ZWQgXCIlc1wiIC8gTmFtZTogXCIl
c1wiIC8gUm9sZTogJWRcbiIsIHNpZ25hbE5hbWVBbmRWYWx1ZS5nZXQoKSwgb2JqZWN0TmFtZSwg
b2JqZWN0Um9sZSk7Ci19Ci0KLXN0YXRpYyBnYm9vbGVhbiBheE9iamVjdEV2ZW50TGlzdGVuZXIo
R1NpZ25hbEludm9jYXRpb25IaW50ICpzaWduYWxIaW50LCBndWludCBudW1QYXJhbVZhbHVlcywg
Y29uc3QgR1ZhbHVlICpwYXJhbVZhbHVlcywgZ3BvaW50ZXIgZGF0YSkKLXsKLSAgICAvLyBBdCBs
ZWFzdCB3ZSBzaG91bGQgcmVjZWl2ZSB0aGUgaW5zdGFuY2UgZW1pdHRpbmcgdGhlIHNpZ25hbC4K
LSAgICBpZiAobnVtUGFyYW1WYWx1ZXMgPCAxKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAg
IEF0a09iamVjdCogYWNjZXNzaWJsZSA9IEFUS19PQkpFQ1QoZ192YWx1ZV9nZXRfb2JqZWN0KCZw
YXJhbVZhbHVlc1swXSkpOwotICAgIGlmICghYWNjZXNzaWJsZSB8fCAhQVRLX0lTX09CSkVDVChh
Y2Nlc3NpYmxlKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBHU2lnbmFsUXVlcnkgc2ln
bmFsUXVlcnk7Ci0gICAgR1VuaXF1ZVB0cjxnY2hhcj4gc2lnbmFsTmFtZTsKLSAgICBHVW5pcXVl
UHRyPGdjaGFyPiBzaWduYWxWYWx1ZTsKLSAgICBTdHJpbmcgbm90aWZpY2F0aW9uTmFtZTsKLQot
ICAgIGdfc2lnbmFsX3F1ZXJ5KHNpZ25hbEhpbnQtPnNpZ25hbF9pZCwgJnNpZ25hbFF1ZXJ5KTsK
LQotICAgIGlmICghZ19zdHJjbXAwKHNpZ25hbFF1ZXJ5LnNpZ25hbF9uYW1lLCAic3RhdGUtY2hh
bmdlIikpIHsKLSAgICAgICAgc2lnbmFsTmFtZS5yZXNldChnX3N0cmR1cF9wcmludGYoInN0YXRl
LWNoYW5nZTolcyIsIGdfdmFsdWVfZ2V0X3N0cmluZygmcGFyYW1WYWx1ZXNbMV0pKSk7Ci0gICAg
ICAgIHNpZ25hbFZhbHVlLnJlc2V0KGdfc3RyZHVwX3ByaW50ZigiJWQiLCBnX3ZhbHVlX2dldF9i
b29sZWFuKCZwYXJhbVZhbHVlc1syXSkpKTsKLSAgICAgICAgaWYgKCFnX3N0cmNtcDAoZ192YWx1
ZV9nZXRfc3RyaW5nKCZwYXJhbVZhbHVlc1sxXSksICJjaGVja2VkIikpCi0gICAgICAgICAgICBu
b3RpZmljYXRpb25OYW1lID0gIkNoZWNrZWRTdGF0ZUNoYW5nZWQiOwotICAgICAgICBlbHNlIGlm
ICghZ19zdHJjbXAwKGdfdmFsdWVfZ2V0X3N0cmluZygmcGFyYW1WYWx1ZXNbMV0pLCAiaW52YWxp
ZC1lbnRyeSIpKQotICAgICAgICAgICAgbm90aWZpY2F0aW9uTmFtZSA9ICJBWEludmFsaWRTdGF0
dXNDaGFuZ2VkIjsKLSAgICB9IGVsc2UgaWYgKCFnX3N0cmNtcDAoc2lnbmFsUXVlcnkuc2lnbmFs
X25hbWUsICJmb2N1cy1ldmVudCIpKSB7Ci0gICAgICAgIHNpZ25hbE5hbWUucmVzZXQoZ19zdHJk
dXAoImZvY3VzLWV2ZW50IikpOwotICAgICAgICBzaWduYWxWYWx1ZS5yZXNldChnX3N0cmR1cF9w
cmludGYoIiVkIiwgZ192YWx1ZV9nZXRfYm9vbGVhbigmcGFyYW1WYWx1ZXNbMV0pKSk7Ci0gICAg
ICAgIGlmIChnX3ZhbHVlX2dldF9ib29sZWFuKCZwYXJhbVZhbHVlc1sxXSkpCi0gICAgICAgICAg
ICBub3RpZmljYXRpb25OYW1lID0gIkFYRm9jdXNlZFVJRWxlbWVudENoYW5nZWQiOwotICAgIH0g
ZWxzZSBpZiAoIWdfc3RyY21wMChzaWduYWxRdWVyeS5zaWduYWxfbmFtZSwgImNoaWxkcmVuLWNo
YW5nZWQiKSkgewotICAgICAgICBjb25zdCBnY2hhciogY2hpbGRyZW5DaGFuZ2VkRGV0YWlsID0g
Z19xdWFya190b19zdHJpbmcoc2lnbmFsSGludC0+ZGV0YWlsKTsKLSAgICAgICAgc2lnbmFsTmFt
ZS5yZXNldChnX3N0cmR1cF9wcmludGYoImNoaWxkcmVuLWNoYW5nZWQ6JXMiLCBjaGlsZHJlbkNo
YW5nZWREZXRhaWwpKTsKLSAgICAgICAgc2lnbmFsVmFsdWUucmVzZXQoZ19zdHJkdXBfcHJpbnRm
KCIlZCIsIGdfdmFsdWVfZ2V0X3VpbnQoJnBhcmFtVmFsdWVzWzFdKSkpOwotICAgICAgICBub3Rp
ZmljYXRpb25OYW1lID0gIWdfc3RyY21wMChjaGlsZHJlbkNoYW5nZWREZXRhaWwsICJhZGQiKSA/
ICJBWENoaWxkcmVuQWRkZWQiIDogIkFYQ2hpbGRyZW5SZW1vdmVkIjsKLSAgICB9IGVsc2UgaWYg
KCFnX3N0cmNtcDAoc2lnbmFsUXVlcnkuc2lnbmFsX25hbWUsICJwcm9wZXJ0eS1jaGFuZ2UiKSkg
ewotICAgICAgICBzaWduYWxOYW1lLnJlc2V0KGdfc3RyZHVwX3ByaW50ZigicHJvcGVydHktY2hh
bmdlOiVzIiwgZ19xdWFya190b19zdHJpbmcoc2lnbmFsSGludC0+ZGV0YWlsKSkpOwotICAgICAg
ICBpZiAoIWdfc3RyY21wMChnX3F1YXJrX3RvX3N0cmluZyhzaWduYWxIaW50LT5kZXRhaWwpLCAi
YWNjZXNzaWJsZS12YWx1ZSIpKQotICAgICAgICAgICAgbm90aWZpY2F0aW9uTmFtZSA9ICJBWFZh
bHVlQ2hhbmdlZCI7Ci0gICAgfSBlbHNlIGlmICghZ19zdHJjbXAwKHNpZ25hbFF1ZXJ5LnNpZ25h
bF9uYW1lLCAibG9hZC1jb21wbGV0ZSIpKQotICAgICAgICBub3RpZmljYXRpb25OYW1lID0gIkFY
TG9hZENvbXBsZXRlIjsKLSAgICBlbHNlCi0gICAgICAgIHNpZ25hbE5hbWUucmVzZXQoZ19zdHJk
dXAoc2lnbmFsUXVlcnkuc2lnbmFsX25hbWUpKTsKLQotICAgIGlmIChsb2dnaW5nQWNjZXNzaWJp
bGl0eUV2ZW50cykKLSAgICAgICAgcHJpbnRBY2Nlc3NpYmlsaXR5RXZlbnQoYWNjZXNzaWJsZSwg
c2lnbmFsTmFtZS5nZXQoKSwgc2lnbmFsVmFsdWUuZ2V0KCkpOwotCi0jaWYgUExBVEZPUk0oR1RL
KQotICAgIEpTR2xvYmFsQ29udGV4dFJlZiBqc0NvbnRleHQgPSB3ZWJraXRfd2ViX2ZyYW1lX2dl
dF9nbG9iYWxfY29udGV4dChtYWluRnJhbWUpOwotI2VsaWYgUExBVEZPUk0oRUZMKQotICAgIEpT
R2xvYmFsQ29udGV4dFJlZiBqc0NvbnRleHQgPSBEdW1wUmVuZGVyVHJlZVN1cHBvcnRFZmw6Omds
b2JhbENvbnRleHRSZWZGb3JGcmFtZShicm93c2VyLT5tYWluRnJhbWUoKSk7Ci0jZWxzZQotICAg
IEpTQ29udGV4dFJlZiBqc0NvbnRleHQgPSAwOwotI2VuZGlmCi0gICAgaWYgKCFqc0NvbnRleHQp
Ci0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKG5vdGlmaWNhdGlvbk5hbWUubGVuZ3Ro
KCkpIHsKLSAgICAgICAgSlNSZXRhaW5QdHI8SlNTdHJpbmdSZWY+IGpzTm90aWZpY2F0aW9uRXZl
bnROYW1lKEFkb3B0LCBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZyhub3RpZmljYXRpb25O
YW1lLnV0ZjgoKS5kYXRhKCkpKTsKLSAgICAgICAgSlNWYWx1ZVJlZiBub3RpZmljYXRpb25OYW1l
QXJndW1lbnQgPSBKU1ZhbHVlTWFrZVN0cmluZyhqc0NvbnRleHQsIGpzTm90aWZpY2F0aW9uRXZl
bnROYW1lLmdldCgpKTsKLSAgICAgICAgTm90aWZpY2F0aW9uSGFuZGxlcnNNYXA6Oml0ZXJhdG9y
IGVsZW1lbnROb3RpZmljYXRpb25IYW5kbGVyID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZmluZChh
Y2Nlc3NpYmxlKTsKLSAgICAgICAgaWYgKGVsZW1lbnROb3RpZmljYXRpb25IYW5kbGVyICE9IG5v
dGlmaWNhdGlvbkhhbmRsZXJzLmVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBMaXN0ZW5lciBmb3Ig
b25lIGVsZW1lbnQganVzdCBnZXRzIG9uZSBhcmd1bWVudCwgdGhlIG5vdGlmaWNhdGlvbiBuYW1l
LgotICAgICAgICAgICAgSlNPYmplY3RDYWxsQXNGdW5jdGlvbihqc0NvbnRleHQsIGVsZW1lbnRO
b3RpZmljYXRpb25IYW5kbGVyLT52YWx1ZS0+bm90aWZpY2F0aW9uRnVuY3Rpb25DYWxsYmFjaygp
LCAwLCAxLCAmbm90aWZpY2F0aW9uTmFtZUFyZ3VtZW50LCAwKTsKLSAgICAgICAgfQotCi0gICAg
ICAgIGlmIChnbG9iYWxOb3RpZmljYXRpb25IYW5kbGVyKSB7Ci0gICAgICAgICAgICAvLyBBIGds
b2JhbCBsaXN0ZW5lciBnZXRzIHRoZSBlbGVtZW50IGFuZCB0aGUgbm90aWZpY2F0aW9uIG5hbWUg
YXMgYXJndW1lbnRzLgotICAgICAgICAgICAgSlNWYWx1ZVJlZiBhcmd1bWVudHNbMl07Ci0gICAg
ICAgICAgICBhcmd1bWVudHNbMF0gPSBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjptYWtlSlNBY2Nl
c3NpYmlsaXR5VUlFbGVtZW50KGpzQ29udGV4dCwgQWNjZXNzaWJpbGl0eVVJRWxlbWVudChhY2Nl
c3NpYmxlKSk7Ci0gICAgICAgICAgICBhcmd1bWVudHNbMV0gPSBub3RpZmljYXRpb25OYW1lQXJn
dW1lbnQ7Ci0gICAgICAgICAgICBKU09iamVjdENhbGxBc0Z1bmN0aW9uKGpzQ29udGV4dCwgZ2xv
YmFsTm90aWZpY2F0aW9uSGFuZGxlci0+bm90aWZpY2F0aW9uRnVuY3Rpb25DYWxsYmFjaygpLCAw
LCAyLCBhcmd1bWVudHMsIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLXZvaWQgY29ubmVjdEFjY2Vzc2liaWxpdHlDYWxsYmFja3MoKQotewotICAgIC8vIEVu
c3VyZSBubyBjYWxsYmFja3MgYXJlIGNvbm5lY3RlZCBiZWZvcmUuCi0gICAgaWYgKCFkaXNjb25u
ZWN0QWNjZXNzaWJpbGl0eUNhbGxiYWNrcygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBF
bnN1cmUgdGhhdCBhY2Nlc3NpYmlsaXR5IGlzIGluaXRpYWxpemVkIGZvciB0aGUgV2ViVmlldyBi
eSBxdWVyeWluZyBmb3IKLSAgICAvLyB0aGUgcm9vdCBhY2Nlc3NpYmxlIG9iamVjdCwgd2hpY2gg
d2lsbCBjcmVhdGUgdGhlIGZ1bGwgaGllcmFyY2h5LgotI2lmIFBMQVRGT1JNKEdUSykKLSAgICBE
dW1wUmVuZGVyVHJlZVN1cHBvcnRHdGs6OmdldFJvb3RBY2Nlc3NpYmxlRWxlbWVudChtYWluRnJh
bWUpOwotI2VsaWYgUExBVEZPUk0oRUZMKQotICAgIER1bXBSZW5kZXJUcmVlU3VwcG9ydEVmbDo6
cm9vdEFjY2Vzc2libGVFbGVtZW50KGJyb3dzZXItPm1haW5GcmFtZSgpKTsKLSNlbmRpZgotCi0g
ICAgLy8gQWRkIGdsb2JhbCBsaXN0ZW5lcnMgZm9yIEF0a09iamVjdCdzIHNpZ25hbHMuCi0gICAg
c3RhdGVDaGFuZ2VMaXN0ZW5lcklkID0gYXRrX2FkZF9nbG9iYWxfZXZlbnRfbGlzdGVuZXIoYXhP
YmplY3RFdmVudExpc3RlbmVyLCAiQVRLOkF0a09iamVjdDpzdGF0ZS1jaGFuZ2UiKTsKLSAgICBm
b2N1c0V2ZW50TGlzdGVuZXJJZCA9IGF0a19hZGRfZ2xvYmFsX2V2ZW50X2xpc3RlbmVyKGF4T2Jq
ZWN0RXZlbnRMaXN0ZW5lciwgIkFUSzpBdGtPYmplY3Q6Zm9jdXMtZXZlbnQiKTsKLSAgICBhY3Rp
dmVEZXNjZW5kYW50Q2hhbmdlZExpc3RlbmVySWQgPSBhdGtfYWRkX2dsb2JhbF9ldmVudF9saXN0
ZW5lcihheE9iamVjdEV2ZW50TGlzdGVuZXIsICJBVEs6QXRrT2JqZWN0OmFjdGl2ZS1kZXNjZW5k
YW50LWNoYW5nZWQiKTsKLSAgICBjaGlsZHJlbkNoYW5nZWRMaXN0ZW5lcklkID0gYXRrX2FkZF9n
bG9iYWxfZXZlbnRfbGlzdGVuZXIoYXhPYmplY3RFdmVudExpc3RlbmVyLCAiQVRLOkF0a09iamVj
dDpjaGlsZHJlbi1jaGFuZ2VkIik7Ci0gICAgcHJvcGVydHlDaGFuZ2VkTGlzdGVuZXJJZCA9IGF0
a19hZGRfZ2xvYmFsX2V2ZW50X2xpc3RlbmVyKGF4T2JqZWN0RXZlbnRMaXN0ZW5lciwgIkFUSzpB
dGtPYmplY3Q6cHJvcGVydHktY2hhbmdlIik7Ci0gICAgdmlzaWJsZURhdGFDaGFuZ2VkTGlzdGVu
ZXJJZCA9IGF0a19hZGRfZ2xvYmFsX2V2ZW50X2xpc3RlbmVyKGF4T2JqZWN0RXZlbnRMaXN0ZW5l
ciwgIkFUSzpBdGtPYmplY3Q6dmlzaWJsZS1kYXRhLWNoYW5nZWQiKTsKLSAgICBsb2FkQ29tcGxl
dGVMaXN0ZW5lcklkID0gYXRrX2FkZF9nbG9iYWxfZXZlbnRfbGlzdGVuZXIoYXhPYmplY3RFdmVu
dExpc3RlbmVyLCAiQVRLOkF0a0RvY3VtZW50OmxvYWQtY29tcGxldGUiKTsKLQotICAgIC8vIEVu
c3VyZSB0aGUgQXRrIGludGVyZmFjZSB0eXBlcyBhcmUgcmVnaXN0ZXJlZCwgb3RoZXJ3aXNlCi0g
ICAgLy8gdGhlIEF0a0RvY3VtZW50IHNpZ25hbCBoYW5kbGVycyBiZWxvdyB3b24ndCBnZXQgcmVn
aXN0ZXJlZC4KLSAgICBHT2JqZWN0KiBkdW1teUF4T2JqZWN0ID0gR19PQkpFQ1QoZ19vYmplY3Rf
bmV3KEFUS19UWVBFX09CSkVDVCwgMCkpOwotICAgIEF0a09iamVjdCogZHVtbXlOb09wQXhPYmpl
Y3QgPSBhdGtfbm9fb3Bfb2JqZWN0X25ldyhkdW1teUF4T2JqZWN0KTsKLSAgICBnX29iamVjdF91
bnJlZihHX09CSkVDVChkdW1teU5vT3BBeE9iamVjdCkpOwotICAgIGdfb2JqZWN0X3VucmVmKGR1
bW15QXhPYmplY3QpOwotfQotCi1ib29sIGRpc2Nvbm5lY3RBY2Nlc3NpYmlsaXR5Q2FsbGJhY2tz
KCkKLXsKLSAgICAvLyBPbmx5IGRpc2Nvbm5lY3QgaWYgbG9nZ2luZyBpcyBvZmYgYW5kIHRoZXJl
IGlzIG5vIG5vdGlmaWNhdGlvbiBoYW5kbGVyLgotICAgIGlmIChsb2dnaW5nQWNjZXNzaWJpbGl0
eUV2ZW50cyB8fCAhbm90aWZpY2F0aW9uSGFuZGxlcnMuaXNFbXB0eSgpIHx8IGdsb2JhbE5vdGlm
aWNhdGlvbkhhbmRsZXIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIEF0a09iamVj
dCBzaWduYWxzLgotICAgIGlmIChzdGF0ZUNoYW5nZUxpc3RlbmVySWQpIHsKLSAgICAgICAgYXRr
X3JlbW92ZV9nbG9iYWxfZXZlbnRfbGlzdGVuZXIoc3RhdGVDaGFuZ2VMaXN0ZW5lcklkKTsKLSAg
ICAgICAgc3RhdGVDaGFuZ2VMaXN0ZW5lcklkID0gMDsKLSAgICB9Ci0gICAgaWYgKGZvY3VzRXZl
bnRMaXN0ZW5lcklkKSB7Ci0gICAgICAgIGF0a19yZW1vdmVfZ2xvYmFsX2V2ZW50X2xpc3RlbmVy
KGZvY3VzRXZlbnRMaXN0ZW5lcklkKTsKLSAgICAgICAgZm9jdXNFdmVudExpc3RlbmVySWQgPSAw
OwotICAgIH0KLSAgICBpZiAoYWN0aXZlRGVzY2VuZGFudENoYW5nZWRMaXN0ZW5lcklkKSB7Ci0g
ICAgICAgIGF0a19yZW1vdmVfZ2xvYmFsX2V2ZW50X2xpc3RlbmVyKGFjdGl2ZURlc2NlbmRhbnRD
aGFuZ2VkTGlzdGVuZXJJZCk7Ci0gICAgICAgIGFjdGl2ZURlc2NlbmRhbnRDaGFuZ2VkTGlzdGVu
ZXJJZCA9IDA7Ci0gICAgfQotICAgIGlmIChjaGlsZHJlbkNoYW5nZWRMaXN0ZW5lcklkKSB7Ci0g
ICAgICAgIGF0a19yZW1vdmVfZ2xvYmFsX2V2ZW50X2xpc3RlbmVyKGNoaWxkcmVuQ2hhbmdlZExp
c3RlbmVySWQpOwotICAgICAgICBjaGlsZHJlbkNoYW5nZWRMaXN0ZW5lcklkID0gMDsKLSAgICB9
Ci0gICAgaWYgKHByb3BlcnR5Q2hhbmdlZExpc3RlbmVySWQpIHsKLSAgICAgICAgYXRrX3JlbW92
ZV9nbG9iYWxfZXZlbnRfbGlzdGVuZXIocHJvcGVydHlDaGFuZ2VkTGlzdGVuZXJJZCk7Ci0gICAg
ICAgIHByb3BlcnR5Q2hhbmdlZExpc3RlbmVySWQgPSAwOwotICAgIH0KLSAgICBpZiAodmlzaWJs
ZURhdGFDaGFuZ2VkTGlzdGVuZXJJZCkgewotICAgICAgICBhdGtfcmVtb3ZlX2dsb2JhbF9ldmVu
dF9saXN0ZW5lcih2aXNpYmxlRGF0YUNoYW5nZWRMaXN0ZW5lcklkKTsKLSAgICAgICAgdmlzaWJs
ZURhdGFDaGFuZ2VkTGlzdGVuZXJJZCA9IDA7Ci0gICAgfQotICAgIGlmIChsb2FkQ29tcGxldGVM
aXN0ZW5lcklkKSB7Ci0gICAgICAgIGF0a19yZW1vdmVfZ2xvYmFsX2V2ZW50X2xpc3RlbmVyKGxv
YWRDb21wbGV0ZUxpc3RlbmVySWQpOwotICAgICAgICBsb2FkQ29tcGxldGVMaXN0ZW5lcklkID0g
MDsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBhZGRBY2Nlc3NpYmlsaXR5
Tm90aWZpY2F0aW9uSGFuZGxlcihBY2Nlc3NpYmlsaXR5Tm90aWZpY2F0aW9uSGFuZGxlciogbm90
aWZpY2F0aW9uSGFuZGxlcikKLXsKLSAgICBpZiAoIW5vdGlmaWNhdGlvbkhhbmRsZXIpCi0gICAg
ICAgIHJldHVybjsKLQotI2lmIFBMQVRGT1JNKEdUSykKLSAgICBKU0dsb2JhbENvbnRleHRSZWYg
anNDb250ZXh0ID0gd2Via2l0X3dlYl9mcmFtZV9nZXRfZ2xvYmFsX2NvbnRleHQobWFpbkZyYW1l
KTsKLSNlbGlmIFBMQVRGT1JNKEVGTCkKLSAgICBKU0dsb2JhbENvbnRleHRSZWYganNDb250ZXh0
ID0gRHVtcFJlbmRlclRyZWVTdXBwb3J0RWZsOjpnbG9iYWxDb250ZXh0UmVmRm9yRnJhbWUoYnJv
d3Nlci0+bWFpbkZyYW1lKCkpOwotI2Vsc2UKLSAgICBKU0NvbnRleHRSZWYganNDb250ZXh0ID0g
MDsKLSNlbmRpZgotICAgIGlmICghanNDb250ZXh0KQotICAgICAgICByZXR1cm47Ci0KLSAgICBK
U1ZhbHVlUHJvdGVjdChqc0NvbnRleHQsIG5vdGlmaWNhdGlvbkhhbmRsZXItPm5vdGlmaWNhdGlv
bkZ1bmN0aW9uQ2FsbGJhY2soKSk7Ci0gICAgLy8gQ2hlY2sgaWYgdGhpcyBub3RpZmljYXRpb24g
aGFuZGxlciBpcyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZWxlbWVudC4KLSAgICBpZiAobm90aWZp
Y2F0aW9uSGFuZGxlci0+cGxhdGZvcm1FbGVtZW50KCkpIHsKLSAgICAgICAgTm90aWZpY2F0aW9u
SGFuZGxlcnNNYXA6Oml0ZXJhdG9yIGN1cnJlbnROb3RpZmljYXRpb25IYW5kbGVyID0gbm90aWZp
Y2F0aW9uSGFuZGxlcnMuZmluZChub3RpZmljYXRpb25IYW5kbGVyLT5wbGF0Zm9ybUVsZW1lbnQo
KSk7Ci0gICAgICAgIGlmIChjdXJyZW50Tm90aWZpY2F0aW9uSGFuZGxlciAhPSBub3RpZmljYXRp
b25IYW5kbGVycy5lbmQoKSkgewotICAgICAgICAgICAgQVNTRVJUKGN1cnJlbnROb3RpZmljYXRp
b25IYW5kbGVyLT52YWx1ZS0+cGxhdGZvcm1FbGVtZW50KCkpOwotICAgICAgICAgICAgSlNWYWx1
ZVVucHJvdGVjdChqc0NvbnRleHQsIGN1cnJlbnROb3RpZmljYXRpb25IYW5kbGVyLT52YWx1ZS0+
bm90aWZpY2F0aW9uRnVuY3Rpb25DYWxsYmFjaygpKTsKLSAgICAgICAgICAgIG5vdGlmaWNhdGlv
bkhhbmRsZXJzLnJlbW92ZShjdXJyZW50Tm90aWZpY2F0aW9uSGFuZGxlci0+dmFsdWUtPnBsYXRm
b3JtRWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZmljYXRpb25IYW5kbGVycy5h
ZGQobm90aWZpY2F0aW9uSGFuZGxlci0+cGxhdGZvcm1FbGVtZW50KCksIG5vdGlmaWNhdGlvbkhh
bmRsZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChnbG9iYWxOb3RpZmljYXRpb25IYW5k
bGVyKQotICAgICAgICAgICAgSlNWYWx1ZVVucHJvdGVjdChqc0NvbnRleHQsIGdsb2JhbE5vdGlm
aWNhdGlvbkhhbmRsZXItPm5vdGlmaWNhdGlvbkZ1bmN0aW9uQ2FsbGJhY2soKSk7Ci0gICAgICAg
IGdsb2JhbE5vdGlmaWNhdGlvbkhhbmRsZXIgPSBub3RpZmljYXRpb25IYW5kbGVyOwotICAgIH0K
LQotICAgIGNvbm5lY3RBY2Nlc3NpYmlsaXR5Q2FsbGJhY2tzKCk7Ci19Ci0KLXZvaWQgcmVtb3Zl
QWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXIoQWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlv
bkhhbmRsZXIqIG5vdGlmaWNhdGlvbkhhbmRsZXIpCi17Ci0gICAgaWYgKCFub3RpZmljYXRpb25I
YW5kbGVyKQotICAgICAgICByZXR1cm47Ci0KLSNpZiBQTEFURk9STShHVEspCi0gICAgSlNHbG9i
YWxDb250ZXh0UmVmIGpzQ29udGV4dCA9IHdlYmtpdF93ZWJfZnJhbWVfZ2V0X2dsb2JhbF9jb250
ZXh0KG1haW5GcmFtZSk7Ci0jZWxpZiBQTEFURk9STShFRkwpCi0gICAgSlNHbG9iYWxDb250ZXh0
UmVmIGpzQ29udGV4dCA9IER1bXBSZW5kZXJUcmVlU3VwcG9ydEVmbDo6Z2xvYmFsQ29udGV4dFJl
ZkZvckZyYW1lKGJyb3dzZXItPm1haW5GcmFtZSgpKTsKLSNlbHNlCi0gICAgSlNHbG9iYWxDb250
ZXh0UmVmIGpzQ29udGV4dCA9IDA7Ci0jZW5kaWYKLSAgICBpZiAoIWpzQ29udGV4dCkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgaWYgKGdsb2JhbE5vdGlmaWNhdGlvbkhhbmRsZXIgPT0gbm90aWZp
Y2F0aW9uSGFuZGxlcikgewotICAgICAgICBKU1ZhbHVlVW5wcm90ZWN0KGpzQ29udGV4dCwgZ2xv
YmFsTm90aWZpY2F0aW9uSGFuZGxlci0+bm90aWZpY2F0aW9uRnVuY3Rpb25DYWxsYmFjaygpKTsK
LSAgICAgICAgZ2xvYmFsTm90aWZpY2F0aW9uSGFuZGxlciA9IDA7Ci0gICAgfSBlbHNlIGlmIChu
b3RpZmljYXRpb25IYW5kbGVyLT5wbGF0Zm9ybUVsZW1lbnQoKSkgewotICAgICAgICBOb3RpZmlj
YXRpb25IYW5kbGVyc01hcDo6aXRlcmF0b3IgcmVtb3ZlTm90aWZpY2F0aW9uSGFuZGxlciA9IG5v
dGlmaWNhdGlvbkhhbmRsZXJzLmZpbmQobm90aWZpY2F0aW9uSGFuZGxlci0+cGxhdGZvcm1FbGVt
ZW50KCkpOwotICAgICAgICBpZiAocmVtb3ZlTm90aWZpY2F0aW9uSGFuZGxlciAhPSBub3RpZmlj
YXRpb25IYW5kbGVycy5lbmQoKSkgewotICAgICAgICAgICAgSlNWYWx1ZVVucHJvdGVjdChqc0Nv
bnRleHQsIHJlbW92ZU5vdGlmaWNhdGlvbkhhbmRsZXItPnZhbHVlLT5ub3RpZmljYXRpb25GdW5j
dGlvbkNhbGxiYWNrKCkpOwotICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMucmVtb3Zl
KHJlbW92ZU5vdGlmaWNhdGlvbkhhbmRsZXIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0jZW5k
aWYKZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2F0ay9BY2Nlc3NpYmlsaXR5Q29u
dHJvbGxlckF0ay5jcHAgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9hdGsvQWNjZXNzaWJpbGl0eUNv
bnRyb2xsZXJBdGsuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTdjNTA5Li4w
MDAwMDAwCi0tLSBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2F0ay9BY2Nlc3NpYmlsaXR5Q29udHJv
bGxlckF0ay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIENvcHly
aWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQu
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmFuIE1pY2hhZWwgQWxvbnpvCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNs
dWRlICJBY2Nlc3NpYmlsaXR5Q29udHJvbGxlci5oIgotCi0jaWYgSEFWRShBQ0NFU1NJQklMSVRZ
KQotCi0jaW5jbHVkZSAiQWNjZXNzaWJpbGl0eUNhbGxiYWNrcy5oIgotI2luY2x1ZGUgIkFjY2Vz
c2liaWxpdHlVSUVsZW1lbnQuaCIKLSNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZS5oIgotCi0jaW5j
bHVkZSA8YXRrL2F0ay5oPgotCi1ib29sIGxvZ2dpbmdBY2Nlc3NpYmlsaXR5RXZlbnRzID0gZmFs
c2U7Ci0KLUFjY2Vzc2liaWxpdHlDb250cm9sbGVyOjpBY2Nlc3NpYmlsaXR5Q29udHJvbGxlcigp
Ci0gICAgOiBtX2dsb2JhbE5vdGlmaWNhdGlvbkhhbmRsZXIobnVsbHB0cikKLXsKLX0KLQotQWNj
ZXNzaWJpbGl0eUNvbnRyb2xsZXI6On5BY2Nlc3NpYmlsaXR5Q29udHJvbGxlcigpCi17Ci19Ci0K
LUFjY2Vzc2liaWxpdHlVSUVsZW1lbnQgQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXI6OmVsZW1lbnRB
dFBvaW50KGludCB4LCBpbnQgeSkKLXsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50Ci0gICAgcmV0
dXJuIG51bGxwdHI7Ci19Ci0KLXZvaWQgQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXI6OnBsYXRmb3Jt
UmVzZXRUb0NvbnNpc3RlbnRTdGF0ZSgpCi17Ci19Ci0KLXZvaWQgQWNjZXNzaWJpbGl0eUNvbnRy
b2xsZXI6OnNldExvZ0ZvY3VzRXZlbnRzKGJvb2wpCi17Ci19Ci0KLXZvaWQgQWNjZXNzaWJpbGl0
eUNvbnRyb2xsZXI6OnNldExvZ1Njcm9sbGluZ1N0YXJ0RXZlbnRzKGJvb2wpCi17Ci19Ci0KLXZv
aWQgQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXI6OnNldExvZ1ZhbHVlQ2hhbmdlRXZlbnRzKGJvb2wp
Ci17Ci19Ci0KLXZvaWQgQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXI6OnNldExvZ0FjY2Vzc2liaWxp
dHlFdmVudHMoYm9vbCBsb2dBY2Nlc3NpYmlsaXR5RXZlbnRzKQotewotICAgIGlmIChsb2dBY2Nl
c3NpYmlsaXR5RXZlbnRzID09IGxvZ2dpbmdBY2Nlc3NpYmlsaXR5RXZlbnRzKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBpZiAoIWxvZ0FjY2Vzc2liaWxpdHlFdmVudHMpIHsKLSAgICAgICAgbG9n
Z2luZ0FjY2Vzc2liaWxpdHlFdmVudHMgPSBmYWxzZTsKLSAgICAgICAgZGlzY29ubmVjdEFjY2Vz
c2liaWxpdHlDYWxsYmFja3MoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbm5l
Y3RBY2Nlc3NpYmlsaXR5Q2FsbGJhY2tzKCk7Ci0gICAgbG9nZ2luZ0FjY2Vzc2liaWxpdHlFdmVu
dHMgPSB0cnVlOwotfQotCi1ib29sIEFjY2Vzc2liaWxpdHlDb250cm9sbGVyOjphZGROb3RpZmlj
YXRpb25MaXN0ZW5lcihKU09iamVjdFJlZiBmdW5jdGlvbkNhbGxiYWNrKQotewotICAgIGlmICgh
ZnVuY3Rpb25DYWxsYmFjaykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gT25seSBv
bmUgZ2xvYmFsIG5vdGlmaWNhdGlvbiBsaXN0ZW5lci4KLSAgICBpZiAobV9nbG9iYWxOb3RpZmlj
YXRpb25IYW5kbGVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBtX2dsb2JhbE5vdGlm
aWNhdGlvbkhhbmRsZXIgPSBBY2Nlc3NpYmlsaXR5Tm90aWZpY2F0aW9uSGFuZGxlcjo6Y3JlYXRl
KCk7Ci0gICAgbV9nbG9iYWxOb3RpZmljYXRpb25IYW5kbGVyLT5zZXROb3RpZmljYXRpb25GdW5j
dGlvbkNhbGxiYWNrKGZ1bmN0aW9uQ2FsbGJhY2spOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LXZvaWQgQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXI6OnJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVy
KCkKLXsKLSAgICAvLyBQcm9ncmFtbWVycyBzaG91bGQgbm90IGJlIHRyeWluZyB0byByZW1vdmUg
YSBsaXN0ZW5lciB0aGF0J3MgYWxyZWFkeSByZW1vdmVkLgotICAgIEFTU0VSVChtX2dsb2JhbE5v
dGlmaWNhdGlvbkhhbmRsZXIpOwotCi0gICAgbV9nbG9iYWxOb3RpZmljYXRpb25IYW5kbGVyID0g
bnVsbHB0cjsKLX0KLQotdm9pZCBBY2Nlc3NpYmlsaXR5Q29udHJvbGxlcjo6ZW5hYmxlRW5oYW5j
ZWRBY2Nlc3NpYmlsaXR5KGJvb2wpCi17Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudAotfQotCi1i
b29sIEFjY2Vzc2liaWxpdHlDb250cm9sbGVyOjplbmhhbmNlZEFjY2Vzc2liaWxpdHlFbmFibGVk
KCkKLXsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1K
U1JldGFpblB0cjxKU1N0cmluZ1JlZj4gQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXI6OnBsYXRmb3Jt
TmFtZSgpIGNvbnN0Ci17Ci0gICAgSlNSZXRhaW5QdHI8SlNTdHJpbmdSZWY+IHBsYXRmb3JtTmFt
ZShBZG9wdCwgSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENTdHJpbmcoImF0ayIpKTsKLSAgICByZXR1
cm4gcGxhdGZvcm1OYW1lOwotfQotCi1BdGtPYmplY3QqIEFjY2Vzc2liaWxpdHlDb250cm9sbGVy
OjpjaGlsZEVsZW1lbnRCeUlkKEF0a09iamVjdCogcGFyZW50LCBjb25zdCBjaGFyKiBpZCkKLXsK
LSAgICBpZiAoIUFUS19JU19PQkpFQ1QocGFyZW50KSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7
Ci0KLSAgICBib29sIHBhcmVudEZvdW5kID0gZmFsc2U7Ci0gICAgQXRrQXR0cmlidXRlU2V0KiBh
dHRyaWJ1dGVTZXQoYXRrX29iamVjdF9nZXRfYXR0cmlidXRlcyhwYXJlbnQpKTsKLSAgICBmb3Ig
KEF0a0F0dHJpYnV0ZVNldCogYXR0cmlidXRlcyA9IGF0dHJpYnV0ZVNldDsgYXR0cmlidXRlczsg
YXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMtPm5leHQpIHsKLSAgICAgICAgQXRrQXR0cmlidXRlKiBh
dHRyaWJ1dGUgPSBzdGF0aWNfY2FzdDxBdGtBdHRyaWJ1dGUqPihhdHRyaWJ1dGVzLT5kYXRhKTsK
LSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cmlidXRlLT5uYW1lLCAiaHRtbC1pZCIpKSB7Ci0gICAg
ICAgICAgICBpZiAoIXN0cmNtcChhdHRyaWJ1dGUtPnZhbHVlLCBpZCkpCi0gICAgICAgICAgICAg
ICAgcGFyZW50Rm91bmQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgYXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShhdHRyaWJ1dGVTZXQpOwotCi0gICAgaWYg
KHBhcmVudEZvdW5kKQotICAgICAgICByZXR1cm4gcGFyZW50OwotCi0gICAgaW50IGNoaWxkQ291
bnQgPSBhdGtfb2JqZWN0X2dldF9uX2FjY2Vzc2libGVfY2hpbGRyZW4ocGFyZW50KTsKLSAgICBm
b3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgewotICAgICAgICBBdGtPYmplY3Qq
IHJlc3VsdCA9IGNoaWxkRWxlbWVudEJ5SWQoYXRrX29iamVjdF9yZWZfYWNjZXNzaWJsZV9jaGls
ZChwYXJlbnQsIGkpLCBpZCk7Ci0gICAgICAgIGlmIChBVEtfSVNfT0JKRUNUKHJlc3VsdCkpCi0g
ICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHJldHVybiBudWxscHRyOwot
fQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2F0ay9BY2Nlc3Np
YmlsaXR5Tm90aWZpY2F0aW9uSGFuZGxlckF0ay5jcHAgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9h
dGsvQWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXJBdGsuY3BwCmRlbGV0ZWQgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCA0NTY1ZDU1Li4wMDAwMDAwCi0tLSBhL1Rvb2xzL0R1bXBSZW5kZXJU
cmVlL2F0ay9BY2Nlc3NpYmlsaXR5Tm90aWZpY2F0aW9uSGFuZGxlckF0ay5jcHAKKysrIC9kZXYv
bnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcg
RWxlY3Ryb25pY3MgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
Ci0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0g
KgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0g
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgi
Ci0jaW5jbHVkZSAiQWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXJBdGsuaCIKLQotI2lm
IEhBVkUoQUNDRVNTSUJJTElUWSkKLQotI2luY2x1ZGUgIkFjY2Vzc2liaWxpdHlDYWxsYmFja3Mu
aCIKLQotQWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXI6OkFjY2Vzc2liaWxpdHlOb3Rp
ZmljYXRpb25IYW5kbGVyKHZvaWQpCi0gICAgOiBtX3BsYXRmb3JtRWxlbWVudChudWxscHRyKQot
ICAgICwgbV9ub3RpZmljYXRpb25GdW5jdGlvbkNhbGxiYWNrKG51bGxwdHIpCi17Ci19Ci0KLUFj
Y2Vzc2liaWxpdHlOb3RpZmljYXRpb25IYW5kbGVyOjp+QWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlv
bkhhbmRsZXIoKQotewotICAgIHJlbW92ZUFjY2Vzc2liaWxpdHlOb3RpZmljYXRpb25IYW5kbGVy
KHRoaXMpOwotICAgIGRpc2Nvbm5lY3RBY2Nlc3NpYmlsaXR5Q2FsbGJhY2tzKCk7Ci19Ci0KLXZv
aWQgQWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXI6OnNldE5vdGlmaWNhdGlvbkZ1bmN0
aW9uQ2FsbGJhY2soSlNPYmplY3RSZWYgbm90aWZpY2F0aW9uRnVuY3Rpb25DYWxsYmFjaykKLXsK
LSAgICBpZiAoIW5vdGlmaWNhdGlvbkZ1bmN0aW9uQ2FsbGJhY2spIHsKLSAgICAgICAgcmVtb3Zl
QWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXIodGhpcyk7Ci0gICAgICAgIGRpc2Nvbm5l
Y3RBY2Nlc3NpYmlsaXR5Q2FsbGJhY2tzKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAg
ICBpZiAobV9ub3RpZmljYXRpb25GdW5jdGlvbkNhbGxiYWNrKQotICAgICAgICByZW1vdmVBY2Nl
c3NpYmlsaXR5Tm90aWZpY2F0aW9uSGFuZGxlcih0aGlzKTsKLQotICAgIG1fbm90aWZpY2F0aW9u
RnVuY3Rpb25DYWxsYmFjayA9IG5vdGlmaWNhdGlvbkZ1bmN0aW9uQ2FsbGJhY2s7Ci0gICAgY29u
bmVjdEFjY2Vzc2liaWxpdHlDYWxsYmFja3MoKTsKLSAgICBhZGRBY2Nlc3NpYmlsaXR5Tm90aWZp
Y2F0aW9uSGFuZGxlcih0aGlzKTsKLX0KLQotI2VuZGlmIC8vIEhBVkUoQUNDRVNTSUJJTElUWSkK
ZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2F0ay9BY2Nlc3NpYmlsaXR5Tm90aWZp
Y2F0aW9uSGFuZGxlckF0ay5oIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvYXRrL0FjY2Vzc2liaWxp
dHlOb3RpZmljYXRpb25IYW5kbGVyQXRrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDkwMThlNzIuLjAwMDAwMDAKLS0tIGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvYXRrL0FjY2Vzc2li
aWxpdHlOb3RpZmljYXRpb25IYW5kbGVyQXRrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFNhbXN1bmcgRWxlY3Ryb25pY3MgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KLSAqLwotCi0jaWZuZGVmIEFjY2Vzc2liaWxpdHlOb3RpZmljYXRpb25IYW5k
bGVyQXRrX2gKLSNkZWZpbmUgQWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXJBdGtfaAot
Ci0jaWYgSEFWRShBQ0NFU1NJQklMSVRZKQotCi0jaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvSlNP
YmplY3RSZWYuaD4KLSNpbmNsdWRlIDxhdGsvYXRrLmg+Ci0jaW5jbHVkZSA8d3RmL1Bhc3NSZWZQ
dHIuaD4KLSNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgotCi1jbGFzcyBBY2Nlc3NpYmlsaXR5
Tm90aWZpY2F0aW9uSGFuZGxlciA6IHB1YmxpYyBSZWZDb3VudGVkPEFjY2Vzc2liaWxpdHlOb3Rp
ZmljYXRpb25IYW5kbGVyPiB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8QWNjZXNz
aWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXI+IGNyZWF0ZSgpCi0gICAgewotICAgICAgICByZXR1
cm4gYWRvcHRSZWYobmV3IEFjY2Vzc2liaWxpdHlOb3RpZmljYXRpb25IYW5kbGVyKCkpOwotICAg
IH0KLSAgICBBY2Nlc3NpYmlsaXR5Tm90aWZpY2F0aW9uSGFuZGxlcih2b2lkKTsKLSAgICB+QWNj
ZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXIoKTsKLQotICAgIHZvaWQgc2V0UGxhdGZvcm1F
bGVtZW50KEF0a09iamVjdCogcGxhdGZvcm1FbGVtZW50KSB7IG1fcGxhdGZvcm1FbGVtZW50ID0g
cGxhdGZvcm1FbGVtZW50OyB9Ci0gICAgQXRrT2JqZWN0KiBwbGF0Zm9ybUVsZW1lbnQodm9pZCkg
Y29uc3QgeyByZXR1cm4gbV9wbGF0Zm9ybUVsZW1lbnQ7IH0KLSAgICB2b2lkIHNldE5vdGlmaWNh
dGlvbkZ1bmN0aW9uQ2FsbGJhY2soSlNPYmplY3RSZWYpOwotICAgIEpTT2JqZWN0UmVmIG5vdGlm
aWNhdGlvbkZ1bmN0aW9uQ2FsbGJhY2sodm9pZCkgY29uc3QgeyByZXR1cm4gbV9ub3RpZmljYXRp
b25GdW5jdGlvbkNhbGxiYWNrOyB9Ci0KLXByaXZhdGU6Ci0gICAgQXRrT2JqZWN0KiBtX3BsYXRm
b3JtRWxlbWVudDsKLSAgICBKU09iamVjdFJlZiBtX25vdGlmaWNhdGlvbkZ1bmN0aW9uQ2FsbGJh
Y2s7Ci19OwotCi0jZW5kaWYgLy8gSEFWRShBQ0NFU1NJQklMSVRZKQotCi0jZW5kaWYgLy8gQWNj
ZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXJBdGtfaApkaWZmIC0tZ2l0IGEvVG9vbHMvRHVt
cFJlbmRlclRyZWUvYXRrL0FjY2Vzc2liaWxpdHlVSUVsZW1lbnRBdGsuY3BwIGIvVG9vbHMvRHVt
cFJlbmRlclRyZWUvYXRrL0FjY2Vzc2liaWxpdHlVSUVsZW1lbnRBdGsuY3BwCmRlbGV0ZWQgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCBiMjRkMTczLi4wMDAwMDAwCi0tLSBhL1Rvb2xzL0R1bXBSZW5k
ZXJUcmVlL2F0ay9BY2Nlc3NpYmlsaXR5VUlFbGVtZW50QXRrLmNwcAorKysgL2Rldi9udWxsCkBA
IC0xLDE3OTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFs
bCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmFuIE1pY2hhZWwgQWxv
bnpvCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2Ftc3VuZyBFbGVjdHJvbmljcy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoK
LSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0K
LSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Lmgi
Ci0KLSNpZiBIQVZFKEFDQ0VTU0lCSUxJVFkpCi0KLSNpbmNsdWRlICJBY2Nlc3NpYmlsaXR5Tm90
aWZpY2F0aW9uSGFuZGxlckF0ay5oIgotI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTU3RyaW5n
UmVmLmg+Ci0jaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvT3BhcXVlSlNTdHJpbmcuaD4KLSNpbmNs
dWRlIDxhdGsvYXRrLmg+Ci0jaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KLSNpbmNsdWRlIDx3
dGYvZ29iamVjdC9HUmVmUHRyLmg+Ci0jaW5jbHVkZSA8d3RmL2dvYmplY3QvR1VuaXF1ZVB0ci5o
PgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJp
bmdCdWlsZGVyLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0jaW5jbHVkZSA8
d3RmL3VuaWNvZGUvQ2hhcmFjdGVyTmFtZXMuaD4KLQotbmFtZXNwYWNlIHsKLQotI2lmIEFUS19D
SEVDS19WRVJTSU9OKDIsMTEsOTIpCi1lbnVtIFJhbmdlTGltaXQgewotICAgIFJhbmdlTGltaXRN
aW5pbXVtLAotICAgIFJhbmdlTGltaXRNYXhpbXVtCi19OwotI2VuZGlmCi0KLWVudW0gQXRrQXR0
cmlidXRlVHlwZSB7Ci0gICAgT2JqZWN0QXR0cmlidXRlVHlwZSwKLSAgICBUZXh0QXR0cmlidXRl
VHlwZQotfTsKLQotZW51bSBBdHRyaWJ1dGVEb21haW4gewotICAgIENvcmVEb21haW4gPSAwLAot
ICAgIEF0a0RvbWFpbgotfTsKLQotZW51bSBBdHRyaWJ1dGVzSW5kZXggewotICAgIC8vIEF0dHJp
YnV0ZSBuYW1lcy4KLSAgICBJbnZhbGlkTmFtZUluZGV4ID0gMCwKLSAgICBQbGFjZWhvbGRlck5h
bWVJbmRleCwKLSAgICBQb3NJblNldEluZGV4LAotICAgIFNldFNpemVJbmRleCwKLSAgICBTb3J0
TmFtZUluZGV4LAotCi0gICAgLy8gQXR0cmlidXRlIHZhbHVlcy4KLSAgICBTb3J0QXNjZW5kaW5n
VmFsdWVJbmRleCwKLSAgICBTb3J0RGVzY2VuZGluZ1ZhbHVlSW5kZXgsCi0gICAgU29ydFVua25v
d25WYWx1ZUluZGV4LAotCi0gICAgTnVtYmVyT2ZBdHRyaWJ1dGVzCi19OwotCi0vLyBBdHRyaWJ1
dGUgbmFtZXMgJiBWYWx1ZXMgKGtlZXAgb24gc3luYyB3aXRoIGVudW0gQXR0cmlidXRlc0luZGV4
KS4KLWNvbnN0IFN0cmluZyBhdHRyaWJ1dGVzTWFwW11bMl0gPSB7Ci0gICAgLy8gQXR0cmlidXRl
IG5hbWVzLgotICAgIHsgIkFYSW52YWxpZCIsICJpbnZhbGlkIiB9LAotICAgIHsgIkFYQVJJQVBv
c0luU2V0IiwgInBvc2luc2V0IiB9LAotICAgIHsgIkFYQVJJQVNldFNpemUiLCAic2V0c2l6ZSIg
fSwKLSAgICB7ICJBWFBsYWNlaG9sZGVyVmFsdWUiLCAicGxhY2Vob2xkZXItdGV4dCIgfSAsCi0g
ICAgeyAiQVhTb3J0RGlyZWN0aW9uIiwgInNvcnQiIH0sCi0KLSAgICAvLyBBdHRyaWJ1dGUgdmFs
dWVzLgotICAgIHsgIkFYQXNjZW5kaW5nU29ydERpcmVjdGlvbiIsICJhc2NlbmRpbmciIH0sCi0g
ICAgeyAiQVhEZXNjZW5kaW5nU29ydERpcmVjdGlvbiIsICJkZXNjZW5kaW5nIiB9LAotICAgIHsg
IkFYVW5rbm93blNvcnREaXJlY3Rpb24iLCAidW5rbm93biIgfQotfTsKLQotI2lmIEFUS19DSEVD
S19WRVJTSU9OKDIsIDExLCAzKQotY29uc3QgY2hhciogbGFuZG1hcmtTdHJpbmdCYW5uZXIgPSAi
QVhMYW5kbWFya0Jhbm5lciI7Ci1jb25zdCBjaGFyKiBsYW5kbWFya1N0cmluZ0NvbXBsZW1lbnRh
cnkgPSAiQVhMYW5kbWFya0NvbXBsZW1lbnRhcnkiOwotY29uc3QgY2hhciogbGFuZG1hcmtTdHJp
bmdDb250ZW50aW5mbyA9ICJBWExhbmRtYXJrQ29udGVudEluZm8iOwotY29uc3QgY2hhciogbGFu
ZG1hcmtTdHJpbmdNYWluID0gIkFYTGFuZG1hcmtNYWluIjsKLWNvbnN0IGNoYXIqIGxhbmRtYXJr
U3RyaW5nTmF2aWdhdGlvbiA9ICJBWExhbmRtYXJrTmF2aWdhdGlvbiI7Ci1jb25zdCBjaGFyKiBs
YW5kbWFya1N0cmluZ1NlYXJjaCA9ICJBWExhbmRtYXJrU2VhcmNoIjsKLSNlbmRpZgotCi1TdHJp
bmcganNTdHJpbmdUb1dURlN0cmluZyhKU1N0cmluZ1JlZiBhdHRyaWJ1dGUpCi17Ci0gICAgc2l6
ZV90IGJ1ZmZlclNpemUgPSBKU1N0cmluZ0dldE1heGltdW1VVEY4Q1N0cmluZ1NpemUoYXR0cmli
dXRlKTsKLSAgICBHVW5pcXVlUHRyPGdjaGFyPiBidWZmZXIoc3RhdGljX2Nhc3Q8Z2NoYXIqPihn
X21hbGxvYyhidWZmZXJTaXplKSkpOwotICAgIEpTU3RyaW5nR2V0VVRGOENTdHJpbmcoYXR0cmli
dXRlLCBidWZmZXIuZ2V0KCksIGJ1ZmZlclNpemUpOwotCi0gICAgcmV0dXJuIFN0cmluZzo6ZnJv
bVVURjgoYnVmZmVyLmdldCgpKTsKLX0KLQotU3RyaW5nIGNvcmVBdHRyaWJ1dGVUb0F0a0F0dHJp
YnV0ZShKU1N0cmluZ1JlZiBhdHRyaWJ1dGUpCi17Ci0gICAgU3RyaW5nIGF0dHJpYnV0ZVN0cmlu
ZyA9IGpzU3RyaW5nVG9XVEZTdHJpbmcoYXR0cmlidXRlKTsKLSAgICBmb3IgKGludCBpID0gMDsg
aSA8IE51bWJlck9mQXR0cmlidXRlczsgKytpKSB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzTWFw
W2ldW0NvcmVEb21haW5dID09IGF0dHJpYnV0ZVN0cmluZykKLSAgICAgICAgICAgIHJldHVybiBh
dHRyaWJ1dGVzTWFwW2ldW0F0a0RvbWFpbl07Ci0gICAgfQotCi0gICAgcmV0dXJuIGF0dHJpYnV0
ZVN0cmluZzsKLX0KLQotU3RyaW5nIGF0a0F0dHJpYnV0ZVZhbHVlVG9Db3JlQXR0cmlidXRlVmFs
dWUoQXRrQXR0cmlidXRlVHlwZSB0eXBlLCBjb25zdCBTdHJpbmcmIGlkLCBjb25zdCBTdHJpbmcm
IHZhbHVlKQotewotICAgIGlmICh0eXBlID09IE9iamVjdEF0dHJpYnV0ZVR5cGUpIHsKLSAgICAg
ICAgLy8gV2UgbmVlZCB0byB0cmFuc2xhdGUgQVRLIHZhbHVlcyBleHBvc2VkIGZvciAnYXJpYS1z
b3J0JyAoZS5nLiAnYXNjZW5kaW5nJykKLSAgICAgICAgLy8gaW50byB0aG9zZSBleHBlY3RlZCBi
eSB0aGUgbGF5b3V0IHRlc3RzIChlLmcuICdBWEFzY2VuZGluZ1NvcnREaXJlY3Rpb24nKS4KLSAg
ICAgICAgaWYgKGlkID09IGF0dHJpYnV0ZXNNYXBbU29ydE5hbWVJbmRleF1bQXRrRG9tYWluXSAm
JiAhdmFsdWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gYXR0cmlidXRl
c01hcFtTb3J0QXNjZW5kaW5nVmFsdWVJbmRleF1bQXRrRG9tYWluXSkKLSAgICAgICAgICAgICAg
ICByZXR1cm4gYXR0cmlidXRlc01hcFtTb3J0QXNjZW5kaW5nVmFsdWVJbmRleF1bQ29yZURvbWFp
bl07Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gYXR0cmlidXRlc01hcFtTb3J0RGVzY2VuZGlu
Z1ZhbHVlSW5kZXhdW0F0a0RvbWFpbl0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0
ZXNNYXBbU29ydERlc2NlbmRpbmdWYWx1ZUluZGV4XVtDb3JlRG9tYWluXTsKLQotICAgICAgICAg
ICAgcmV0dXJuIGF0dHJpYnV0ZXNNYXBbU29ydFVua25vd25WYWx1ZUluZGV4XVtDb3JlRG9tYWlu
XTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUZXh0QXR0cmlidXRlVHlwZSkg
ewotICAgICAgICAvLyBJbiBjYXNlIG9mICdhcmlhLWludmFsaWQnIHdoZW4gdGhlIGF0dHJpYnV0
ZSBlbXB0eSBvciBoYXMgImZhbHNlIiBmb3IgQVRLCi0gICAgICAgIC8vIGl0IHNob3VsZCBub3Qg
YmUgbWFwcGVkIGF0IGFsbCwgYnV0IGxheW91dCB0ZXN0cyB3aWxsIGV4cGVjdCAnZmFsc2UnLgot
ICAgICAgICBpZiAoaWQgPT0gYXR0cmlidXRlc01hcFtJbnZhbGlkTmFtZUluZGV4XVtBdGtEb21h
aW5dICYmIHZhbHVlLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiAiZmFsc2UiOwotICAg
IH0KLQotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotQXRrQXR0cmlidXRlU2V0KiBnZXRBdHRyaWJ1
dGVTZXQoQXRrT2JqZWN0KiBhY2Nlc3NpYmxlLCBBdGtBdHRyaWJ1dGVUeXBlIHR5cGUpCi17Ci0g
ICAgaWYgKHR5cGUgPT0gT2JqZWN0QXR0cmlidXRlVHlwZSkKLSAgICAgICAgcmV0dXJuIGF0a19v
YmplY3RfZ2V0X2F0dHJpYnV0ZXMoYWNjZXNzaWJsZSk7Ci0KLSAgICBpZiAodHlwZSA9PSBUZXh0
QXR0cmlidXRlVHlwZSkgewotICAgICAgICBpZiAoIUFUS19JU19URVhUKGFjY2Vzc2libGUpKQot
ICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICAgICAgcmV0dXJuIGF0a190ZXh0X2dl
dF9kZWZhdWx0X2F0dHJpYnV0ZXMoQVRLX1RFWFQoYWNjZXNzaWJsZSkpOwotICAgIH0KLQotICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBudWxscHRyOwotfQotCi1TdHJpbmcg
Z2V0QXR0cmlidXRlU2V0VmFsdWVGb3JJZChBdGtPYmplY3QqIGFjY2Vzc2libGUsIEF0a0F0dHJp
YnV0ZVR5cGUgdHlwZSwgU3RyaW5nIGlkKQotewotICAgIEF0a0F0dHJpYnV0ZVNldCogYXR0cmli
dXRlU2V0ID0gZ2V0QXR0cmlidXRlU2V0KGFjY2Vzc2libGUsIHR5cGUpOwotICAgIGlmICghYXR0
cmlidXRlU2V0KQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmcgYXR0cmli
dXRlVmFsdWU7Ci0gICAgZm9yIChBdGtBdHRyaWJ1dGVTZXQqIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1
dGVTZXQ7IGF0dHJpYnV0ZXM7IGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLT5uZXh0KSB7Ci0gICAg
ICAgIEF0a0F0dHJpYnV0ZSogYXRrQXR0cmlidXRlID0gc3RhdGljX2Nhc3Q8QXRrQXR0cmlidXRl
Kj4oYXR0cmlidXRlcy0+ZGF0YSk7Ci0gICAgICAgIGlmIChpZCA9PSBhdGtBdHRyaWJ1dGUtPm5h
bWUpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gU3RyaW5nOjpmcm9tVVRGOChhdGtB
dHRyaWJ1dGUtPnZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQot
ICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoYXR0cmlidXRlU2V0KTsKLQotICAgIHJldHVybiBh
dGtBdHRyaWJ1dGVWYWx1ZVRvQ29yZUF0dHJpYnV0ZVZhbHVlKHR5cGUsIGlkLCBhdHRyaWJ1dGVW
YWx1ZSk7Ci19Ci0KLVN0cmluZyBnZXRBdGtBdHRyaWJ1dGVTZXRBc1N0cmluZyhBdGtPYmplY3Qq
IGFjY2Vzc2libGUsIEF0a0F0dHJpYnV0ZVR5cGUgdHlwZSkKLXsKLSAgICBBdGtBdHRyaWJ1dGVT
ZXQqIGF0dHJpYnV0ZVNldCA9IGdldEF0dHJpYnV0ZVNldChhY2Nlc3NpYmxlLCB0eXBlKTsKLSAg
ICBpZiAoIWF0dHJpYnV0ZVNldCkKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotCi0gICAgU3Ry
aW5nQnVpbGRlciBidWlsZGVyOwotICAgIGZvciAoQXRrQXR0cmlidXRlU2V0KiBhdHRyaWJ1dGVz
ID0gYXR0cmlidXRlU2V0OyBhdHRyaWJ1dGVzOyBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcy0+bmV4
dCkgewotICAgICAgICBBdGtBdHRyaWJ1dGUqIGF0dHJpYnV0ZSA9IHN0YXRpY19jYXN0PEF0a0F0
dHJpYnV0ZSo+KGF0dHJpYnV0ZXMtPmRhdGEpOwotICAgICAgICBHVW5pcXVlUHRyPGdjaGFyPiBh
dHRyaWJ1dGVEYXRhKGdfc3RyY29uY2F0KGF0dHJpYnV0ZS0+bmFtZSwgIjoiLCBhdHRyaWJ1dGUt
PnZhbHVlLCBOVUxMKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGF0dHJpYnV0ZURhdGEuZ2V0
KCkpOwotICAgICAgICBpZiAoYXR0cmlidXRlcy0+bmV4dCkKLSAgICAgICAgICAgIGJ1aWxkZXIu
YXBwZW5kKCIsICIpOwotICAgIH0KLSAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKGF0dHJpYnV0
ZVNldCk7Ci0KLSAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotfQotCi1jb25zdCBjaGFy
KiByb2xlVG9TdHJpbmcoQXRrT2JqZWN0KiBvYmplY3QpCi17Ci0gICAgQXRrUm9sZSByb2xlID0g
YXRrX29iamVjdF9nZXRfcm9sZShvYmplY3QpOwotCi0jaWYgQVRLX0NIRUNLX1ZFUlNJT04oMiwg
MTEsIDMpCi0gICAgaWYgKHJvbGUgPT0gQVRLX1JPTEVfTEFORE1BUkspIHsKLSAgICAgICAgU3Ry
aW5nIHhtbFJvbGVzVmFsdWUgPSBnZXRBdHRyaWJ1dGVTZXRWYWx1ZUZvcklkKG9iamVjdCwgT2Jq
ZWN0QXR0cmlidXRlVHlwZSwgInhtbC1yb2xlcyIpOwotICAgICAgICBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UoeG1sUm9sZXNWYWx1ZSwgImJhbm5lciIpKQotICAgICAgICAgICAgcmV0dXJuIGxhbmRt
YXJrU3RyaW5nQmFubmVyOwotICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoeG1sUm9sZXNW
YWx1ZSwgImNvbXBsZW1lbnRhcnkiKSkKLSAgICAgICAgICAgIHJldHVybiBsYW5kbWFya1N0cmlu
Z0NvbXBsZW1lbnRhcnk7Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh4bWxSb2xlc1Zh
bHVlLCAiY29udGVudGluZm8iKSkKLSAgICAgICAgICAgIHJldHVybiBsYW5kbWFya1N0cmluZ0Nv
bnRlbnRpbmZvOwotICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoeG1sUm9sZXNWYWx1ZSwg
Im1haW4iKSkKLSAgICAgICAgICAgIHJldHVybiBsYW5kbWFya1N0cmluZ01haW47Ci0gICAgICAg
IGlmIChlcXVhbElnbm9yaW5nQ2FzZSh4bWxSb2xlc1ZhbHVlLCAibmF2aWdhdGlvbiIpKQotICAg
ICAgICAgICAgcmV0dXJuIGxhbmRtYXJrU3RyaW5nTmF2aWdhdGlvbjsKLSAgICAgICAgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKHhtbFJvbGVzVmFsdWUsICJzZWFyY2giKSkKLSAgICAgICAgICAgIHJl
dHVybiBsYW5kbWFya1N0cmluZ1NlYXJjaDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHN3aXRjaCAo
cm9sZSkgewotICAgIGNhc2UgQVRLX1JPTEVfQUxFUlQ6Ci0gICAgICAgIHJldHVybiAiQVhBbGVy
dCI7Ci0gICAgY2FzZSBBVEtfUk9MRV9ESUFMT0c6Ci0gICAgICAgIHJldHVybiAiQVhEaWFsb2ci
OwotICAgIGNhc2UgQVRLX1JPTEVfQ0FOVkFTOgotICAgICAgICByZXR1cm4gIkFYQ2FudmFzIjsK
LSAgICBjYXNlIEFUS19ST0xFX0NIRUNLX0JPWDoKLSAgICAgICAgcmV0dXJuICJBWENoZWNrQm94
IjsKLSAgICBjYXNlIEFUS19ST0xFX0NPTE9SX0NIT09TRVI6Ci0gICAgICAgIHJldHVybiAiQVhD
b2xvcldlbGwiOwotICAgIGNhc2UgQVRLX1JPTEVfQ09MVU1OX0hFQURFUjoKLSAgICAgICAgcmV0
dXJuICJBWENvbHVtbkhlYWRlciI7Ci0gICAgY2FzZSBBVEtfUk9MRV9DT01CT19CT1g6Ci0gICAg
ICAgIHJldHVybiAiQVhDb21ib0JveCI7Ci0gICAgY2FzZSBBVEtfUk9MRV9DT01NRU5UOgotICAg
ICAgICByZXR1cm4gIkFYQ29tbWVudCI7Ci0gICAgY2FzZSBBVEtfUk9MRV9ET0NVTUVOVF9GUkFN
RToKLSAgICAgICAgcmV0dXJuICJBWERvY3VtZW50IjsKLSAgICBjYXNlIEFUS19ST0xFX0RPQ1VN
RU5UX1dFQjoKLSAgICAgICAgcmV0dXJuICJBWFdlYkFyZWEiOwotICAgIGNhc2UgQVRLX1JPTEVf
RU1CRURERUQ6Ci0gICAgICAgIHJldHVybiAiQVhFbWJlZGRlZCI7Ci0gICAgY2FzZSBBVEtfUk9M
RV9FTlRSWToKLSAgICAgICAgcmV0dXJuICJBWFRleHRGaWVsZCI7Ci0gICAgY2FzZSBBVEtfUk9M
RV9GT09URVI6Ci0gICAgICAgIHJldHVybiAiQVhGb290ZXIiOwotICAgIGNhc2UgQVRLX1JPTEVf
Rk9STToKLSAgICAgICAgcmV0dXJuICJBWEZvcm0iOwotICAgIGNhc2UgQVRLX1JPTEVfR1JPVVBJ
Tkc6Ci0gICAgICAgIHJldHVybiAiQVhHcm91cCI7Ci0gICAgY2FzZSBBVEtfUk9MRV9IRUFESU5H
OgotICAgICAgICByZXR1cm4gIkFYSGVhZGluZyI7Ci0gICAgY2FzZSBBVEtfUk9MRV9JTUFHRToK
LSAgICAgICAgcmV0dXJuICJBWEltYWdlIjsKLSAgICBjYXNlIEFUS19ST0xFX0lNQUdFX01BUDoK
LSAgICAgICAgcmV0dXJuICJBWEltYWdlTWFwIjsKLSAgICBjYXNlIEFUS19ST0xFX0xBQkVMOgot
ICAgICAgICByZXR1cm4gIkFYTGFiZWwiOwotICAgIGNhc2UgQVRLX1JPTEVfTElOSzoKLSAgICAg
ICAgcmV0dXJuICJBWExpbmsiOwotICAgIGNhc2UgQVRLX1JPTEVfTElTVDoKLSAgICAgICAgcmV0
dXJuICJBWExpc3QiOwotICAgIGNhc2UgQVRLX1JPTEVfTElTVF9CT1g6Ci0gICAgICAgIHJldHVy
biAiQVhMaXN0Qm94IjsKLSAgICBjYXNlIEFUS19ST0xFX0xJU1RfSVRFTToKLSAgICAgICAgcmV0
dXJuICJBWExpc3RJdGVtIjsKLSAgICBjYXNlIEFUS19ST0xFX01FTlU6Ci0gICAgICAgIHJldHVy
biAiQVhNZW51IjsKLSAgICBjYXNlIEFUS19ST0xFX01FTlVfQkFSOgotICAgICAgICByZXR1cm4g
IkFYTWVudUJhciI7Ci0gICAgY2FzZSBBVEtfUk9MRV9NRU5VX0lURU06Ci0gICAgICAgIHJldHVy
biAiQVhNZW51SXRlbSI7Ci0gICAgY2FzZSBBVEtfUk9MRV9QQUdFX1RBQjoKLSAgICAgICAgcmV0
dXJuICJBWFRhYiI7Ci0gICAgY2FzZSBBVEtfUk9MRV9QQUdFX1RBQl9MSVNUOgotICAgICAgICBy
ZXR1cm4gIkFYVGFiR3JvdXAiOwotICAgIGNhc2UgQVRLX1JPTEVfUEFORUw6Ci0gICAgICAgIHJl
dHVybiAiQVhHcm91cCI7Ci0gICAgY2FzZSBBVEtfUk9MRV9QQVJBR1JBUEg6Ci0gICAgICAgIHJl
dHVybiAiQVhQYXJhZ3JhcGgiOwotICAgIGNhc2UgQVRLX1JPTEVfUEFTU1dPUkRfVEVYVDoKLSAg
ICAgICAgcmV0dXJuICJBWFBhc3N3b3JkRmllbGQiOwotICAgIGNhc2UgQVRLX1JPTEVfUFJPR1JF
U1NfQkFSOgotICAgICAgICByZXR1cm4gIkFYUHJvZ3Jlc3NJbmRpY2F0b3IiOwotICAgIGNhc2Ug
QVRLX1JPTEVfUFVTSF9CVVRUT046Ci0gICAgICAgIHJldHVybiAiQVhCdXR0b24iOwotICAgIGNh
c2UgQVRLX1JPTEVfUkFESU9fQlVUVE9OOgotICAgICAgICByZXR1cm4gIkFYUmFkaW9CdXR0b24i
OwotICAgIGNhc2UgQVRLX1JPTEVfUkFESU9fTUVOVV9JVEVNOgotICAgICAgICByZXR1cm4gIkFY
UmFkaW9NZW51SXRlbSI7Ci0gICAgY2FzZSBBVEtfUk9MRV9ST1dfSEVBREVSOgotICAgICAgICBy
ZXR1cm4gIkFYUm93SGVhZGVyIjsKLSAgICBjYXNlIEFUS19ST0xFX0NIRUNLX01FTlVfSVRFTToK
LSAgICAgICAgcmV0dXJuICJBWENoZWNrTWVudUl0ZW0iOwotICAgIGNhc2UgQVRLX1JPTEVfUlVM
RVI6Ci0gICAgICAgIHJldHVybiAiQVhSdWxlciI7Ci0gICAgY2FzZSBBVEtfUk9MRV9TQ1JPTExf
QkFSOgotICAgICAgICByZXR1cm4gIkFYU2Nyb2xsQmFyIjsKLSAgICBjYXNlIEFUS19ST0xFX1ND
Uk9MTF9QQU5FOgotICAgICAgICByZXR1cm4gIkFYU2Nyb2xsQXJlYSI7Ci0gICAgY2FzZSBBVEtf
Uk9MRV9TRUNUSU9OOgotICAgICAgICByZXR1cm4gIkFYU2VjdGlvbiI7Ci0gICAgY2FzZSBBVEtf
Uk9MRV9TRVBBUkFUT1I6Ci0gICAgICAgIHJldHVybiAiQVhTZXBhcmF0b3IiOwotICAgIGNhc2Ug
QVRLX1JPTEVfU0xJREVSOgotICAgICAgICByZXR1cm4gIkFYU2xpZGVyIjsKLSAgICBjYXNlIEFU
S19ST0xFX1NQSU5fQlVUVE9OOgotICAgICAgICByZXR1cm4gIkFYU3BpbkJ1dHRvbiI7Ci0gICAg
Y2FzZSBBVEtfUk9MRV9TVEFUVVNCQVI6Ci0gICAgICAgIHJldHVybiAiQVhTdGF0dXNCYXIiOwot
ICAgIGNhc2UgQVRLX1JPTEVfVEFCTEU6Ci0gICAgICAgIHJldHVybiAiQVhUYWJsZSI7Ci0gICAg
Y2FzZSBBVEtfUk9MRV9UQUJMRV9DRUxMOgotICAgICAgICByZXR1cm4gIkFYQ2VsbCI7Ci0gICAg
Y2FzZSBBVEtfUk9MRV9UQUJMRV9DT0xVTU5fSEVBREVSOgotICAgICAgICByZXR1cm4gIkFYQ29s
dW1uSGVhZGVyIjsKLSAgICBjYXNlIEFUS19ST0xFX1RBQkxFX1JPVzoKLSAgICAgICAgcmV0dXJu
ICJBWFJvdyI7Ci0gICAgY2FzZSBBVEtfUk9MRV9UQUJMRV9ST1dfSEVBREVSOgotICAgICAgICBy
ZXR1cm4gIkFYUm93SGVhZGVyIjsKLSAgICBjYXNlIEFUS19ST0xFX1RPR0dMRV9CVVRUT046Ci0g
ICAgICAgIHJldHVybiAiQVhUb2dnbGVCdXR0b24iOwotICAgIGNhc2UgQVRLX1JPTEVfVE9PTF9C
QVI6Ci0gICAgICAgIHJldHVybiAiQVhUb29sYmFyIjsKLSAgICBjYXNlIEFUS19ST0xFX1RPT0xf
VElQOgotICAgICAgICByZXR1cm4gIkFYVXNlckludGVyZmFjZVRvb2x0aXAiOwotICAgIGNhc2Ug
QVRLX1JPTEVfVFJFRToKLSAgICAgICAgcmV0dXJuICJBWFRyZWUiOwotICAgIGNhc2UgQVRLX1JP
TEVfVFJFRV9UQUJMRToKLSAgICAgICAgcmV0dXJuICJBWFRyZWVHcmlkIjsKLSAgICBjYXNlIEFU
S19ST0xFX1RSRUVfSVRFTToKLSAgICAgICAgcmV0dXJuICJBWFRyZWVJdGVtIjsKLSAgICBjYXNl
IEFUS19ST0xFX1dJTkRPVzoKLSAgICAgICAgcmV0dXJuICJBWFdpbmRvdyI7Ci0gICAgY2FzZSBB
VEtfUk9MRV9VTktOT1dOOgotICAgICAgICByZXR1cm4gIkFYVW5rbm93biI7Ci0jaWYgQVRLX0NI
RUNLX1ZFUlNJT04oMiwgMTEsIDMpCi0gICAgY2FzZSBBVEtfUk9MRV9BUlRJQ0xFOgotICAgICAg
ICByZXR1cm4gIkFYQXJ0aWNsZSI7Ci0gICAgY2FzZSBBVEtfUk9MRV9ERUZJTklUSU9OOgotICAg
ICAgICByZXR1cm4gIkFYRGVmaW5pdGlvbiI7Ci0gICAgY2FzZSBBVEtfUk9MRV9MT0c6Ci0gICAg
ICAgIHJldHVybiAiQVhMb2ciOwotICAgIGNhc2UgQVRLX1JPTEVfTUFSUVVFRToKLSAgICAgICAg
cmV0dXJuICJBWE1hcnF1ZWUiOwotICAgIGNhc2UgQVRLX1JPTEVfTUFUSDoKLSAgICAgICAgcmV0
dXJuICJBWE1hdGgiOwotICAgIGNhc2UgQVRLX1JPTEVfVElNRVI6Ci0gICAgICAgIHJldHVybiAi
QVhUaW1lciI7Ci0jZW5kaWYKLSNpZiBBVEtfQ0hFQ0tfVkVSU0lPTigyLCAxMSwgNCkKLSAgICBj
YXNlIEFUS19ST0xFX0RFU0NSSVBUSU9OX0xJU1Q6Ci0gICAgICAgIHJldHVybiAiQVhEZXNjcmlw
dGlvbkxpc3QiOwotICAgIGNhc2UgQVRLX1JPTEVfREVTQ1JJUFRJT05fVEVSTToKLSAgICAgICAg
cmV0dXJuICJBWERlc2NyaXB0aW9uVGVybSI7Ci0gICAgY2FzZSBBVEtfUk9MRV9ERVNDUklQVElP
Tl9WQUxVRToKLSAgICAgICAgcmV0dXJuICJBWERlc2NyaXB0aW9uVmFsdWUiOwotI2VuZGlmCi0g
ICAgZGVmYXVsdDoKLSAgICAgICAgLy8gV2Ugd2FudCB0byBkaXN0aW5ndWlzaCBBVEtfUk9MRV9V
TktOT1dOIGZyb20gYSBrbm93biBBdGtSb2xlIHdoaWNoCi0gICAgICAgIC8vIG91ciBEUlQgaXNu
J3QgcHJvcGVybHkgaGFuZGxpbmcuCi0gICAgICAgIHJldHVybiAiRklYTUUgbm90IGlkZW50aWZp
ZWQiOwotICAgIH0KLX0KLQotaW5saW5lIGdjaGFyKiByZXBsYWNlQ2hhcmFjdGVyc0ZvclJlc3Vs
dHMoZ2NoYXIqIHN0cikKLXsKLSAgICBTdHJpbmcgdVN0cmluZyA9IFN0cmluZzo6ZnJvbVVURjgo
c3RyKTsKLQotICAgIC8vIFRoZSBvYmplY3QgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGlzIHBhc3Nl
ZCBhbG9uZyB0byBBVHMgc28gd2UgbmVlZCB0byBiZQotICAgIC8vIGFibGUgdG8gdGVzdCBmb3Ig
dGhlaXIgcHJlc2VuY2UgYW5kIGRvIHNvIHdpdGhvdXQgY2F1c2luZyB0ZXN0IGZhaWx1cmVzLgot
ICAgIHVTdHJpbmcucmVwbGFjZShvYmplY3RSZXBsYWNlbWVudENoYXJhY3RlciwgIjxvYmo+Iik7
Ci0KLSAgICAvLyBUaGUgcHJlc2VuY2Ugb2YgbmV3bGluZSBjaGFyYWN0ZXJzIGluIGFjY2Vzc2li
bGUgdGV4dCBvZiBhIHNpbmdsZSBvYmplY3QKLSAgICAvLyBpcyBhcHByb3ByaWF0ZSwgYnV0IGl0
IG1ha2VzIHRlc3QgcmVzdWx0cyAoZXNwZWNpYWxseSB0aGUgYWNjZXNzaWJsZSB0cmVlKQotICAg
IC8vIGhhcmRlciB0byByZWFkLgotICAgIHVTdHJpbmcucmVwbGFjZSgiXG4iLCAiPFxcbj4iKTsK
LQotICAgIHJldHVybiBnX3N0cmR1cCh1U3RyaW5nLnV0ZjgoKS5kYXRhKCkpOwotfQotCi1ib29s
IGNoZWNrRWxlbWVudFN0YXRlKFBsYXRmb3JtVUlFbGVtZW50IGVsZW1lbnQsIEF0a1N0YXRlVHlw
ZSBzdGF0ZVR5cGUpCi17Ci0gICAgaWYgKCFBVEtfSVNfT0JKRUNUKGVsZW1lbnQpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICBHUmVmUHRyPEF0a1N0YXRlU2V0PiBzdGF0ZVNldCA9IGFk
b3B0R1JlZihhdGtfb2JqZWN0X3JlZl9zdGF0ZV9zZXQoQVRLX09CSkVDVChlbGVtZW50KSkpOwot
ICAgIHJldHVybiBhdGtfc3RhdGVfc2V0X2NvbnRhaW5zX3N0YXRlKHN0YXRlU2V0LmdldCgpLCBz
dGF0ZVR5cGUpOwotfQotCi1TdHJpbmcgYXR0cmlidXRlc09mRWxlbWVudChBY2Nlc3NpYmlsaXR5
VUlFbGVtZW50KiBlbGVtZW50KQotewotICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKLQotICAg
IGJ1aWxkZXIuYXBwZW5kKFN0cmluZzo6Zm9ybWF0KCIlc1xuIiwgZWxlbWVudC0+cm9sZSgpLT5z
dHJpbmcoKS51dGY4KCkuZGF0YSgpKSk7Ci0KLSAgICAvLyBGb3IgdGhlIHBhcmVudCB3ZSBwcmlu
dCBpdHMgcm9sZSBhbmQgaXRzIG5hbWUsIGlmIGF2YWlsYWJsZS4KLSAgICBidWlsZGVyLmFwcGVu
ZCgiQVhQYXJlbnQ6ICIpOwotICAgIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQgcGFyZW50ID0gZWxl
bWVudC0+cGFyZW50RWxlbWVudCgpOwotICAgIGlmIChBdGtPYmplY3QqIGF0a1BhcmVudCA9IHBh
cmVudC5wbGF0Zm9ybVVJRWxlbWVudCgpKSB7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKHJvbGVU
b1N0cmluZyhhdGtQYXJlbnQpKTsKLSAgICAgICAgY29uc3QgY2hhciogcGFyZW50TmFtZSA9IGF0
a19vYmplY3RfZ2V0X25hbWUoYXRrUGFyZW50KTsKLSAgICAgICAgaWYgKHBhcmVudE5hbWUgJiYg
Z191dGY4X3N0cmxlbihwYXJlbnROYW1lLCAtMSkpCi0gICAgICAgICAgICBidWlsZGVyLmFwcGVu
ZChTdHJpbmc6OmZvcm1hdCgiOiAlcyIsIHBhcmVudE5hbWUpKTsKLSAgICB9IGVsc2UKLSAgICAg
ICAgYnVpbGRlci5hcHBlbmQoIihudWxsKSIpOwotICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwot
Ci0gICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nOjpmb3JtYXQoIkFYQ2hpbGRyZW46ICVkXG4iLCBl
bGVtZW50LT5jaGlsZHJlbkNvdW50KCkpKTsKLSAgICBidWlsZGVyLmFwcGVuZChTdHJpbmc6OmZv
cm1hdCgiQVhQb3NpdGlvbjogeyAlZiwgJWYgfVxuIiwgZWxlbWVudC0+eCgpLCBlbGVtZW50LT55
KCkpKTsKLSAgICBidWlsZGVyLmFwcGVuZChTdHJpbmc6OmZvcm1hdCgiQVhTaXplOiB7ICVmLCAl
ZiB9XG4iLCBlbGVtZW50LT53aWR0aCgpLCBlbGVtZW50LT5oZWlnaHQoKSkpOwotCi0gICAgU3Ry
aW5nIHRpdGxlID0gZWxlbWVudC0+dGl0bGUoKS0+c3RyaW5nKCk7Ci0gICAgaWYgKCF0aXRsZS5p
c0VtcHR5KCkpCi0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZzo6Zm9ybWF0KCIlc1xuIiwg
dGl0bGUudXRmOCgpLmRhdGEoKSkpOwotCi0gICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gZWxlbWVu
dC0+ZGVzY3JpcHRpb24oKS0+c3RyaW5nKCk7Ci0gICAgaWYgKCFkZXNjcmlwdGlvbi5pc0VtcHR5
KCkpCi0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZzo6Zm9ybWF0KCIlc1xuIiwgZGVzY3Jp
cHRpb24udXRmOCgpLmRhdGEoKSkpOwotCi0gICAgU3RyaW5nIHZhbHVlID0gZWxlbWVudC0+c3Ry
aW5nVmFsdWUoKS0+c3RyaW5nKCk7Ci0gICAgaWYgKCF2YWx1ZS5pc0VtcHR5KCkpCi0gICAgICAg
IGJ1aWxkZXIuYXBwZW5kKFN0cmluZzo6Zm9ybWF0KCIlc1xuIiwgdmFsdWUudXRmOCgpLmRhdGEo
KSkpOwotCi0gICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nOjpmb3JtYXQoIkFYRm9jdXNhYmxlOiAl
ZFxuIiwgZWxlbWVudC0+aXNGb2N1c2FibGUoKSkpOwotICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmlu
Zzo6Zm9ybWF0KCJBWEZvY3VzZWQ6ICVkXG4iLCBlbGVtZW50LT5pc0ZvY3VzZWQoKSkpOwotICAg
IGJ1aWxkZXIuYXBwZW5kKFN0cmluZzo6Zm9ybWF0KCJBWFNlbGVjdGFibGU6ICVkXG4iLCBlbGVt
ZW50LT5pc1NlbGVjdGFibGUoKSkpOwotICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZzo6Zm9ybWF0
KCJBWFNlbGVjdGVkOiAlZFxuIiwgZWxlbWVudC0+aXNTZWxlY3RlZCgpKSk7Ci0gICAgYnVpbGRl
ci5hcHBlbmQoU3RyaW5nOjpmb3JtYXQoIkFYTXVsdGlTZWxlY3RhYmxlOiAlZFxuIiwgZWxlbWVu
dC0+aXNNdWx0aVNlbGVjdGFibGUoKSkpOwotICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZzo6Zm9y
bWF0KCJBWEVuYWJsZWQ6ICVkXG4iLCBlbGVtZW50LT5pc0VuYWJsZWQoKSkpOwotICAgIGJ1aWxk
ZXIuYXBwZW5kKFN0cmluZzo6Zm9ybWF0KCJBWEV4cGFuZGVkOiAlZFxuIiwgZWxlbWVudC0+aXNF
eHBhbmRlZCgpKSk7Ci0gICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nOjpmb3JtYXQoIkFYUmVxdWly
ZWQ6ICVkXG4iLCBlbGVtZW50LT5pc1JlcXVpcmVkKCkpKTsKLSAgICBidWlsZGVyLmFwcGVuZChT
dHJpbmc6OmZvcm1hdCgiQVhDaGVja2VkOiAlZFxuIiwgZWxlbWVudC0+aXNDaGVja2VkKCkpKTsK
LQotICAgIFN0cmluZyB1cmwgPSBlbGVtZW50LT51cmwoKS0+c3RyaW5nKCk7Ci0gICAgaWYgKCF1
cmwuaXNFbXB0eSgpKQotICAgICAgICBidWlsZGVyLmFwcGVuZChTdHJpbmc6OmZvcm1hdCgiJXNc
biIsIHVybC51dGY4KCkuZGF0YSgpKSk7Ci0KLSAgICAvLyBXZSBhcHBlbmQgdGhlIEFUSyBzcGVj
aWZpYyBhdHRyaWJ1dGVzIGFzIGEgc2luZ2xlIGxpbmUgYXQgdGhlIGVuZC4KLSAgICBidWlsZGVy
LmFwcGVuZCgiQVhQbGF0Zm9ybUF0dHJpYnV0ZXM6ICIpOwotICAgIGJ1aWxkZXIuYXBwZW5kKGdl
dEF0a0F0dHJpYnV0ZVNldEFzU3RyaW5nKGVsZW1lbnQtPnBsYXRmb3JtVUlFbGVtZW50KCksIE9i
amVjdEF0dHJpYnV0ZVR5cGUpKTsKLQotICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci19
Ci0KLXN0YXRpYyBKU1N0cmluZ1JlZiBjcmVhdGVTdHJpbmdXaXRoQXR0cmlidXRlcyhjb25zdCBW
ZWN0b3I8QWNjZXNzaWJpbGl0eVVJRWxlbWVudD4mIGVsZW1lbnRzKQotewotICAgIFN0cmluZ0J1
aWxkZXIgYnVpbGRlcjsKLQotICAgIGZvciAoVmVjdG9yPEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ+
Ojpjb25zdF9pdGVyYXRvciBpdCA9IGVsZW1lbnRzLmJlZ2luKCk7IGl0ICE9IGVsZW1lbnRzLmVu
ZCgpOyArK2l0KSB7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGF0dHJpYnV0ZXNPZkVsZW1lbnQo
Y29uc3RfY2FzdDxBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Kj4oaXQpKSk7Ci0gICAgICAgIGJ1aWxk
ZXIuYXBwZW5kKCJcbi0tLS0tLS0tLS0tLVxuIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIEpTU3Ry
aW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKGJ1aWxkZXIudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgp
KTsKLX0KLQotc3RhdGljIFZlY3RvcjxBY2Nlc3NpYmlsaXR5VUlFbGVtZW50PiBnZXRSb3dIZWFk
ZXJzKEF0a1RhYmxlKiBhY2Nlc3NpYmxlKQotewotICAgIFZlY3RvcjxBY2Nlc3NpYmlsaXR5VUlF
bGVtZW50PiByb3dIZWFkZXJzOwotCi0gICAgaW50IHJvd3NDb3VudCA9IGF0a190YWJsZV9nZXRf
bl9yb3dzKGFjY2Vzc2libGUpOwotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHJvd3NDb3Vu
dDsgKytyb3cpCi0gICAgICAgIHJvd0hlYWRlcnMuYXBwZW5kKEFjY2Vzc2liaWxpdHlVSUVsZW1l
bnQoYXRrX3RhYmxlX2dldF9yb3dfaGVhZGVyKGFjY2Vzc2libGUsIHJvdykpKTsKLQotICAgIHJl
dHVybiByb3dIZWFkZXJzOwotfQotCi1zdGF0aWMgVmVjdG9yPEFjY2Vzc2liaWxpdHlVSUVsZW1l
bnQ+IGdldENvbHVtbkhlYWRlcnMoQXRrVGFibGUqIGFjY2Vzc2libGUpCi17Ci0gICAgVmVjdG9y
PEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ+IGNvbHVtbkhlYWRlcnM7Ci0KLSAgICBpbnQgY29sdW1u
c0NvdW50ID0gYXRrX3RhYmxlX2dldF9uX2NvbHVtbnMoYWNjZXNzaWJsZSk7Ci0gICAgZm9yIChp
bnQgY29sdW1uID0gMDsgY29sdW1uIDwgY29sdW1uc0NvdW50OyArK2NvbHVtbikKLSAgICAgICAg
Y29sdW1uSGVhZGVycy5hcHBlbmQoQWNjZXNzaWJpbGl0eVVJRWxlbWVudChhdGtfdGFibGVfZ2V0
X2NvbHVtbl9oZWFkZXIoYWNjZXNzaWJsZSwgY29sdW1uKSkpOwotCi0gICAgcmV0dXJuIGNvbHVt
bkhlYWRlcnM7Ci19Ci0KLXN0YXRpYyBWZWN0b3I8QWNjZXNzaWJpbGl0eVVJRWxlbWVudD4gZ2V0
VmlzaWJsZUNlbGxzKEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgVmVj
dG9yPEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ+IHZpc2libGVDZWxsczsKLQotICAgIEF0a1RhYmxl
KiBhY2Nlc3NpYmxlID0gQVRLX1RBQkxFKGVsZW1lbnQtPnBsYXRmb3JtVUlFbGVtZW50KCkpOwot
ICAgIGludCByb3dzQ291bnQgPSBhdGtfdGFibGVfZ2V0X25fcm93cyhhY2Nlc3NpYmxlKTsKLSAg
ICBpbnQgY29sdW1uc0NvdW50ID0gYXRrX3RhYmxlX2dldF9uX2NvbHVtbnMoYWNjZXNzaWJsZSk7
Ci0KLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCByb3dzQ291bnQ7ICsrcm93KSB7Ci0gICAg
ICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IGNvbHVtbnNDb3VudDsgKytjb2x1bW4p
Ci0gICAgICAgICAgICB2aXNpYmxlQ2VsbHMuYXBwZW5kKGVsZW1lbnQtPmNlbGxGb3JDb2x1bW5B
bmRSb3coY29sdW1uLCByb3cpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmlzaWJsZUNlbGxzOwot
fQotCi0jaWYgQVRLX0NIRUNLX1ZFUlNJT04oMiwxMSw5MCkKLXN0YXRpYyB2b2lkIGNvbnZlcnRH
UHRyQXJyYXlUb1ZlY3Rvcihjb25zdCBHUHRyQXJyYXkqIGFycmF5LCBWZWN0b3I8QWNjZXNzaWJp
bGl0eVVJRWxlbWVudD4mIGVsZW1lbnRzKQotewotICAgIGZvciAoZ3VpbnQgaSA9IDA7IGkgPCBh
cnJheS0+bGVuOyBpKyspIHsKLSAgICAgICAgaWYgKEF0a09iamVjdCogYXRrT2JqZWN0ID0gc3Rh
dGljX2Nhc3Q8QXRrT2JqZWN0Kj4oZ19wdHJfYXJyYXlfaW5kZXgoYXJyYXksIGkpKSkKLSAgICAg
ICAgICAgIGVsZW1lbnRzLmFwcGVuZChBY2Nlc3NpYmlsaXR5VUlFbGVtZW50KGF0a09iamVjdCkp
OwotICAgIH0KLX0KLSNlbmRpZgotCi1KU1N0cmluZ1JlZiBpbmRleFJhbmdlSW5UYWJsZShQbGF0
Zm9ybVVJRWxlbWVudCBlbGVtZW50LCBib29sIGlzUm93UmFuZ2UpCi17Ci0gICAgR1VuaXF1ZVB0
cjxnY2hhcj4gcmFuZ2VTdHJpbmcoZ19zdHJkdXAoInswLCAwfSIpKTsKLQotI2lmIEFUS19DSEVD
S19WRVJTSU9OKDIsMTEsOTApCi0gICAgaWYgKCFBVEtfSVNfVEFCTEVfQ0VMTChlbGVtZW50KSkK
LSAgICAgICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKHJhbmdlU3RyaW5n
LmdldCgpKTsKLSNlbHNlCi0gICAgaWYgKCFBVEtfSVNfT0JKRUNUKGVsZW1lbnQpKQotICAgICAg
ICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENTdHJpbmcocmFuZ2VTdHJpbmcuZ2V0KCkp
OwotCi0gICAgQXRrT2JqZWN0KiBheFRhYmxlID0gYXRrX29iamVjdF9nZXRfcGFyZW50KEFUS19P
QkpFQ1QoZWxlbWVudCkpOwotICAgIGlmICghYXhUYWJsZSB8fCAhQVRLX0lTX1RBQkxFKGF4VGFi
bGUpKQotICAgICAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENTdHJpbmcocmFuZ2VT
dHJpbmcuZ2V0KCkpOwotCi0gICAgLy8gTG9vayBmb3IgdGhlIGNlbGwgaW4gdGhlIHRhYmxlLgot
ICAgIGdpbnQgaW5kZXhJblBhcmVudCA9IGF0a19vYmplY3RfZ2V0X2luZGV4X2luX3BhcmVudChB
VEtfT0JKRUNUKGVsZW1lbnQpKTsKLSAgICBpZiAoaW5kZXhJblBhcmVudCA9PSAtMSkKLSAgICAg
ICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKHJhbmdlU3RyaW5nLmdldCgp
KTsKLSNlbmRpZgotCi0gICAgZ2ludCByb3cgPSAtMTsKLSAgICBnaW50IGNvbHVtbiA9IC0xOwot
ICAgIGdpbnQgcm93U3BhbiA9IC0xOwotICAgIGdpbnQgY29sdW1uU3BhbiA9IC0xOwotI2lmIEFU
S19DSEVDS19WRVJTSU9OKDIsMTEsOTApCi0gICAgYXRrX3RhYmxlX2NlbGxfZ2V0X3Jvd19jb2x1
bW5fc3BhbihBVEtfVEFCTEVfQ0VMTChlbGVtZW50KSwgJnJvdywgJmNvbHVtbiwgJnJvd1NwYW4s
ICZjb2x1bW5TcGFuKTsKLSNlbHNlCi0gICAgcm93ID0gYXRrX3RhYmxlX2dldF9yb3dfYXRfaW5k
ZXgoQVRLX1RBQkxFKGF4VGFibGUpLCBpbmRleEluUGFyZW50KTsKLSAgICBjb2x1bW4gPSBhdGtf
dGFibGVfZ2V0X2NvbHVtbl9hdF9pbmRleChBVEtfVEFCTEUoYXhUYWJsZSksIGluZGV4SW5QYXJl
bnQpOwotICAgIHJvd1NwYW4gPSBhdGtfdGFibGVfZ2V0X3Jvd19leHRlbnRfYXQoQVRLX1RBQkxF
KGF4VGFibGUpLCByb3csIGNvbHVtbik7Ci0gICAgY29sdW1uU3BhbiA9IGF0a190YWJsZV9nZXRf
Y29sdW1uX2V4dGVudF9hdChBVEtfVEFCTEUoYXhUYWJsZSksIHJvdywgY29sdW1uKTsKLSNlbmRp
ZgotCi0gICAgLy8gR2V0IHRoZSBhY3R1YWwgdmFsdWVzLCBpZiByb3cgYW5kIGNvbHVtbnMgYXJl
IHZhbGlkIHZhbHVlcy4KLSAgICBpZiAocm93ICE9IC0xICYmIGNvbHVtbiAhPSAtMSkgewotICAg
ICAgICBpbnQgYmFzZSA9IDA7Ci0gICAgICAgIGludCBsZW5ndGggPSAwOwotICAgICAgICBpZiAo
aXNSb3dSYW5nZSkgewotICAgICAgICAgICAgYmFzZSA9IHJvdzsKLSAgICAgICAgICAgIGxlbmd0
aCA9IHJvd1NwYW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiYXNlID0gY29sdW1u
OwotICAgICAgICAgICAgbGVuZ3RoID0gY29sdW1uU3BhbjsKLSAgICAgICAgfQotICAgICAgICBy
YW5nZVN0cmluZy5yZXNldChnX3N0cmR1cF9wcmludGYoInslZCwgJWR9IiwgYmFzZSwgbGVuZ3Ro
KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKHJh
bmdlU3RyaW5nLmdldCgpKTsKLX0KLQotI2lmIEFUS19DSEVDS19WRVJTSU9OKDIsMTEsOTIpCi1z
dGF0aWMgZG91YmxlIHJhbmdlTWluTWF4VmFsdWUoQXRrVmFsdWUqIGF0a1ZhbHVlLCBSYW5nZUxp
bWl0IHJhbmdlTGltaXQpCi17Ci0gICAgQXRrUmFuZ2UqIHJhbmdlID0gYXRrX3ZhbHVlX2dldF9y
YW5nZShhdGtWYWx1ZSk7Ci0gICAgaWYgKCFyYW5nZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAg
ICBkb3VibGUgcmFuZ2VWYWx1ZSA9IDA7Ci0gICAgc3dpdGNoIChyYW5nZUxpbWl0KSB7Ci0gICAg
Y2FzZSBSYW5nZUxpbWl0TWluaW11bToKLSAgICAgICAgcmFuZ2VWYWx1ZSA9IGF0a19yYW5nZV9n
ZXRfbG93ZXJfbGltaXQocmFuZ2UpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJhbmdlTGlt
aXRNYXhpbXVtOgotICAgICAgICByYW5nZVZhbHVlID0gYXRrX3JhbmdlX2dldF91cHBlcl9saW1p
dChyYW5nZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH07Ci0KLSAgICBhdGtfcmFuZ2VfZnJlZShy
YW5nZSk7Ci0gICAgcmV0dXJuIHJhbmdlVmFsdWU7Ci19Ci0jZW5kaWYKLQotdm9pZCBhbHRlckN1
cnJlbnRWYWx1ZShQbGF0Zm9ybVVJRWxlbWVudCBlbGVtZW50LCBpbnQgZmFjdG9yKQotewotICAg
IGlmICghQVRLX0lTX1ZBTFVFKGVsZW1lbnQpKQotICAgICAgICByZXR1cm47Ci0KLSNpZiBBVEtf
Q0hFQ0tfVkVSU0lPTigyLDExLDkyKQotICAgIGRvdWJsZSBjdXJyZW50VmFsdWU7Ci0gICAgYXRr
X3ZhbHVlX2dldF92YWx1ZV9hbmRfdGV4dChBVEtfVkFMVUUoZWxlbWVudCksICZjdXJyZW50VmFs
dWUsIG51bGxwdHIpOwotCi0gICAgZG91YmxlIGluY3JlbWVudCA9IGF0a192YWx1ZV9nZXRfaW5j
cmVtZW50KEFUS19WQUxVRShlbGVtZW50KSk7Ci0gICAgYXRrX3ZhbHVlX3NldF92YWx1ZShBVEtf
VkFMVUUoZWxlbWVudCksIGN1cnJlbnRWYWx1ZSArIGZhY3RvciAqIGluY3JlbWVudCk7Ci0jZWxz
ZQotICAgIEdWYWx1ZSBjdXJyZW50VmFsdWUgPSBHX1ZBTFVFX0lOSVQ7Ci0gICAgYXRrX3ZhbHVl
X2dldF9jdXJyZW50X3ZhbHVlKEFUS19WQUxVRShlbGVtZW50KSwgJmN1cnJlbnRWYWx1ZSk7Ci0K
LSAgICBHVmFsdWUgaW5jcmVtZW50ID0gR19WQUxVRV9JTklUOwotICAgIGF0a192YWx1ZV9nZXRf
bWluaW11bV9pbmNyZW1lbnQoQVRLX1ZBTFVFKGVsZW1lbnQpLCAmaW5jcmVtZW50KTsKLQotICAg
IEdWYWx1ZSBuZXdWYWx1ZSA9IEdfVkFMVUVfSU5JVDsKLSAgICBnX3ZhbHVlX2luaXQoJm5ld1Zh
bHVlLCBHX1RZUEVfRkxPQVQpOwotCi0gICAgZ192YWx1ZV9zZXRfZmxvYXQoJm5ld1ZhbHVlLCBn
X3ZhbHVlX2dldF9mbG9hdCgmY3VycmVudFZhbHVlKSArIGZhY3RvciAqIGdfdmFsdWVfZ2V0X2Zs
b2F0KCZpbmNyZW1lbnQpKTsKLSAgICBhdGtfdmFsdWVfc2V0X2N1cnJlbnRfdmFsdWUoQVRLX1ZB
TFVFKGVsZW1lbnQpLCAmbmV3VmFsdWUpOwotCi0gICAgZ192YWx1ZV91bnNldCgmbmV3VmFsdWUp
OwotICAgIGdfdmFsdWVfdW5zZXQoJmluY3JlbWVudCk7Ci0gICAgZ192YWx1ZV91bnNldCgmY3Vy
cmVudFZhbHVlKTsKLSNlbmRpZgotfQotCi19IC8vIG5hbWVzcGFjZQotCi1BY2Nlc3NpYmlsaXR5
VUlFbGVtZW50OjpBY2Nlc3NpYmlsaXR5VUlFbGVtZW50KFBsYXRmb3JtVUlFbGVtZW50IGVsZW1l
bnQpCi0gICAgOiBtX2VsZW1lbnQoZWxlbWVudCkKLXsKLSAgICBpZiAobV9lbGVtZW50KQotICAg
ICAgICBnX29iamVjdF9yZWYobV9lbGVtZW50KTsKLX0KLQotQWNjZXNzaWJpbGl0eVVJRWxlbWVu
dDo6QWNjZXNzaWJpbGl0eVVJRWxlbWVudChjb25zdCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50JiBv
dGhlcikKLSAgICA6IG1fZWxlbWVudChvdGhlci5tX2VsZW1lbnQpCi17Ci0gICAgaWYgKG1fZWxl
bWVudCkKLSAgICAgICAgZ19vYmplY3RfcmVmKG1fZWxlbWVudCk7Ci19Ci0KLUFjY2Vzc2liaWxp
dHlVSUVsZW1lbnQ6On5BY2Nlc3NpYmlsaXR5VUlFbGVtZW50KCkKLXsKLSAgICBpZiAobV9lbGVt
ZW50KQotICAgICAgICBnX29iamVjdF91bnJlZihtX2VsZW1lbnQpOwotfQotCi12b2lkIEFjY2Vz
c2liaWxpdHlVSUVsZW1lbnQ6OmdldExpbmtlZFVJRWxlbWVudHMoVmVjdG9yPEFjY2Vzc2liaWxp
dHlVSUVsZW1lbnQ+JiBlbGVtZW50cykKLXsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50Ci19Ci0K
LXZvaWQgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6Z2V0RG9jdW1lbnRMaW5rcyhWZWN0b3I8QWNj
ZXNzaWJpbGl0eVVJRWxlbWVudD4mKQotewotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLX0KLQot
dm9pZCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpnZXRDaGlsZHJlbihWZWN0b3I8QWNjZXNzaWJp
bGl0eVVJRWxlbWVudD4mIGNoaWxkcmVuKQotewotICAgIGlmICghQVRLX0lTX09CSkVDVChtX2Vs
ZW1lbnQpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpbnQgY291bnQgPSBjaGlsZHJlbkNvdW50
KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEF0a09i
amVjdCogY2hpbGQgPSBhdGtfb2JqZWN0X3JlZl9hY2Nlc3NpYmxlX2NoaWxkKEFUS19PQkpFQ1Qo
bV9lbGVtZW50KSwgaSk7Ci0gICAgICAgIGNoaWxkcmVuLmFwcGVuZChBY2Nlc3NpYmlsaXR5VUlF
bGVtZW50KGNoaWxkKSk7Ci0gICAgfQotfQotCi12b2lkIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6
OmdldENoaWxkcmVuV2l0aFJhbmdlKFZlY3RvcjxBY2Nlc3NpYmlsaXR5VUlFbGVtZW50PiYgZWxl
bWVudFZlY3RvciwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCkKLXsKLSAgICBpZiAoIUFU
S19JU19PQkpFQ1QobV9lbGVtZW50KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZm9yICh1bnNp
Z25lZCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewotICAgICAgICBBdGtPYmplY3QqIGNoaWxk
ID0gYXRrX29iamVjdF9yZWZfYWNjZXNzaWJsZV9jaGlsZChBVEtfT0JKRUNUKG1fZWxlbWVudCks
IGkpOwotICAgICAgICBlbGVtZW50VmVjdG9yLmFwcGVuZChBY2Nlc3NpYmlsaXR5VUlFbGVtZW50
KGNoaWxkKSk7Ci0gICAgfQotfQotCi1pbnQgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6cm93Q291
bnQoKQotewotICAgIGlmICghQVRLX0lTX1RBQkxFKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVy
biAwOwotCi0gICAgcmV0dXJuIGF0a190YWJsZV9nZXRfbl9yb3dzKEFUS19UQUJMRShtX2VsZW1l
bnQpKTsKLX0KLQotaW50IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmNvbHVtbkNvdW50KCkKLXsK
LSAgICBpZiAoIUFUS19JU19UQUJMRShtX2VsZW1lbnQpKQotICAgICAgICByZXR1cm4gMDsKLQot
ICAgIHJldHVybiBhdGtfdGFibGVfZ2V0X25fY29sdW1ucyhBVEtfVEFCTEUobV9lbGVtZW50KSk7
Ci19Ci0KLWludCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpjaGlsZHJlbkNvdW50KCkKLXsKLSAg
ICBpZiAoIUFUS19JU19PQkpFQ1QobV9lbGVtZW50KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAg
ICByZXR1cm4gYXRrX29iamVjdF9nZXRfbl9hY2Nlc3NpYmxlX2NoaWxkcmVuKEFUS19PQkpFQ1Qo
bV9lbGVtZW50KSk7Ci19Ci0KLUFjY2Vzc2liaWxpdHlVSUVsZW1lbnQgQWNjZXNzaWJpbGl0eVVJ
RWxlbWVudDo6ZWxlbWVudEF0UG9pbnQoaW50IHgsIGludCB5KQotewotICAgIGlmICghQVRLX0lT
X0NPTVBPTkVOVChtX2VsZW1lbnQpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIEdS
ZWZQdHI8QXRrT2JqZWN0PiBvYmplY3RBdFBvaW50ID0gYWRvcHRHUmVmKGF0a19jb21wb25lbnRf
cmVmX2FjY2Vzc2libGVfYXRfcG9pbnQoQVRLX0NPTVBPTkVOVChtX2VsZW1lbnQpLCB4LCB5LCBB
VEtfWFlfV0lORE9XKSk7Ci0gICAgcmV0dXJuIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQob2JqZWN0
QXRQb2ludCA/IG9iamVjdEF0UG9pbnQuZ2V0KCkgOiBtX2VsZW1lbnQpOwotfQotCi1BY2Nlc3Np
YmlsaXR5VUlFbGVtZW50IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmxpbmtlZFVJRWxlbWVudEF0
SW5kZXgodW5zaWduZWQgaW5kZXgpCi17Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudAotICAgIHJl
dHVybiBudWxscHRyOwotfQotCi1BY2Nlc3NpYmlsaXR5VUlFbGVtZW50IEFjY2Vzc2liaWxpdHlV
SUVsZW1lbnQ6OmdldENoaWxkQXRJbmRleCh1bnNpZ25lZCBpbmRleCkKLXsKLSAgICBpZiAoIUFU
S19JU19PQkpFQ1QobV9lbGVtZW50KSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBW
ZWN0b3I8QWNjZXNzaWJpbGl0eVVJRWxlbWVudD4gY2hpbGRyZW47Ci0gICAgZ2V0Q2hpbGRyZW5X
aXRoUmFuZ2UoY2hpbGRyZW4sIGluZGV4LCBpbmRleCArIDEpOwotCi0gICAgaWYgKGNoaWxkcmVu
LnNpemUoKSA9PSAxKQotICAgICAgICByZXR1cm4gY2hpbGRyZW4uYXQoMCk7Ci0KLSAgICByZXR1
cm4gbnVsbHB0cjsKLX0KLQotdW5zaWduZWQgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6aW5kZXhP
ZkNoaWxkKEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQqIGVsZW1lbnQpCi17IAotICAgIC8vIEZJWE1F
OiBpbXBsZW1lbnQKLSAgICByZXR1cm4gMDsKLX0KLQotSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0
eVVJRWxlbWVudDo6YWxsQXR0cmlidXRlcygpCi17Ci0gICAgaWYgKCFBVEtfSVNfT0JKRUNUKG1f
ZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBKU1N0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKDAs
IDApOwotCi0gICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKGF0dHJpYnV0
ZXNPZkVsZW1lbnQodGhpcykudXRmOCgpLmRhdGEoKSk7Ci19Ci0KLUpTU3RyaW5nUmVmIEFjY2Vz
c2liaWxpdHlVSUVsZW1lbnQ6OmF0dHJpYnV0ZXNPZkxpbmtlZFVJRWxlbWVudHMoKQotewotICAg
IC8vIEZJWE1FOiBpbXBsZW1lbnQKLSAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRoQ2hhcmFj
dGVycygwLCAwKTsKLX0KLQotSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6YXR0
cmlidXRlc09mRG9jdW1lbnRMaW5rcygpCi17Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudAotICAg
IHJldHVybiBKU1N0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKDAsIDApOwotfQotCi1BY2Nlc3Np
YmlsaXR5VUlFbGVtZW50IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnRpdGxlVUlFbGVtZW50KCkK
LXsKLSAgICBpZiAoIUFUS19JU19PQkpFQ1QobV9lbGVtZW50KSkKLSAgICAgICAgcmV0dXJuIG51
bGxwdHI7Ci0KLSAgICBBdGtSZWxhdGlvblNldCogc2V0ID0gYXRrX29iamVjdF9yZWZfcmVsYXRp
b25fc2V0KEFUS19PQkpFQ1QobV9lbGVtZW50KSk7Ci0gICAgaWYgKCFzZXQpCi0gICAgICAgIHJl
dHVybiBudWxscHRyOwotCi0gICAgQXRrT2JqZWN0KiB0YXJnZXQgPSBudWxscHRyOwotICAgIGlu
dCBjb3VudCA9IGF0a19yZWxhdGlvbl9zZXRfZ2V0X25fcmVsYXRpb25zKHNldCk7Ci0gICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEF0a1JlbGF0aW9uKiByZWxh
dGlvbiA9IGF0a19yZWxhdGlvbl9zZXRfZ2V0X3JlbGF0aW9uKHNldCwgaSk7Ci0gICAgICAgIGlm
IChhdGtfcmVsYXRpb25fZ2V0X3JlbGF0aW9uX3R5cGUocmVsYXRpb24pID09IEFUS19SRUxBVElP
Tl9MQUJFTExFRF9CWSkgewotICAgICAgICAgICAgR1B0ckFycmF5KiB0YXJnZXRMaXN0ID0gYXRr
X3JlbGF0aW9uX2dldF90YXJnZXQocmVsYXRpb24pOwotICAgICAgICAgICAgaWYgKHRhcmdldExp
c3QtPmxlbikKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBzdGF0aWNfY2FzdDxBdGtPYmplY3Qq
PihnX3B0cl9hcnJheV9pbmRleCh0YXJnZXRMaXN0LCAwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBnX29iamVjdF91bnJlZihzZXQpOwotICAgIHJldHVybiB0YXJnZXQgPyBBY2Nlc3NpYmls
aXR5VUlFbGVtZW50KHRhcmdldCkgOiBudWxscHRyOwotfQotCi1BY2Nlc3NpYmlsaXR5VUlFbGVt
ZW50IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnBhcmVudEVsZW1lbnQoKQotewotICAgIGlmICgh
QVRLX0lTX09CSkVDVChtX2VsZW1lbnQpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAg
IEF0a09iamVjdCogcGFyZW50ID0gIGF0a19vYmplY3RfZ2V0X3BhcmVudChBVEtfT0JKRUNUKG1f
ZWxlbWVudCkpOwotICAgIHJldHVybiBwYXJlbnQgPyBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50KHBh
cmVudCkgOiBudWxscHRyOwotfQotCi1KU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50
OjphdHRyaWJ1dGVzT2ZDaGlsZHJlbigpCi17Ci0gICAgaWYgKCFBVEtfSVNfT0JKRUNUKG1fZWxl
bWVudCkpCi0gICAgICAgIHJldHVybiBKU1N0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKDAsIDAp
OwotCi0gICAgVmVjdG9yPEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ+IGNoaWxkcmVuOwotICAgIGdl
dENoaWxkcmVuKGNoaWxkcmVuKTsKLQotICAgIHJldHVybiBjcmVhdGVTdHJpbmdXaXRoQXR0cmli
dXRlcyhjaGlsZHJlbik7Ci19Ci0KLUpTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6
OnBhcmFtZXRlcml6ZWRBdHRyaWJ1dGVOYW1lcygpCi17Ci0gICAgLy8gRklYTUU6IGltcGxlbWVu
dAotICAgIHJldHVybiBKU1N0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKDAsIDApOwotfQotCi1K
U1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojpyb2xlKCkKLXsKLSAgICBpZiAoIUFU
S19JU19PQkpFQ1QobV9lbGVtZW50KSkKLSAgICAgICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0
aENoYXJhY3RlcnMoMCwgMCk7Ci0KLSAgICBpZiAoIWF0a19vYmplY3RfZ2V0X3JvbGUoQVRLX09C
SkVDVChtX2VsZW1lbnQpKSkKLSAgICAgICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aENoYXJh
Y3RlcnMoMCwgMCk7Ci0KLSAgICBHVW5pcXVlUHRyPGNoYXI+IHJvbGVTdHJpbmdXaXRoUHJlZml4
KGdfc3RyZHVwX3ByaW50ZigiQVhSb2xlOiAlcyIsIHJvbGVUb1N0cmluZyhBVEtfT0JKRUNUKG1f
ZWxlbWVudCkpKSk7Ci0gICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKHJv
bGVTdHJpbmdXaXRoUHJlZml4LmdldCgpKTsKLX0KLQotSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0
eVVJRWxlbWVudDo6c3Vicm9sZSgpCi17Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUpTU3Ry
aW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnJvbGVEZXNjcmlwdGlvbigpCi17Ci0gICAg
cmV0dXJuIG51bGxwdHI7Ci19Ci0KLUpTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6
OmNvbXB1dGVkUm9sZVN0cmluZygpCi17Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudCBodHRwOi8v
d2Via2l0Lm9yZy9iLzEyODQyMAotICAgIHJldHVybiBudWxscHRyOwotfQotCi1KU1N0cmluZ1Jl
ZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojp0aXRsZSgpCi17Ci0gICAgaWYgKCFBVEtfSVNfT0JK
RUNUKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBKU1N0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0
ZXJzKDAsIDApOwotCi0gICAgY29uc3QgZ2NoYXIqIG5hbWUgPSBhdGtfb2JqZWN0X2dldF9uYW1l
KEFUS19PQkpFQ1QobV9lbGVtZW50KSk7Ci0gICAgR1VuaXF1ZVB0cjxnY2hhcj4gYXhUaXRsZShn
X3N0cmR1cF9wcmludGYoIkFYVGl0bGU6ICVzIiwgbmFtZSA/IG5hbWUgOiAiIikpOwotCi0gICAg
cmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKGF4VGl0bGUuZ2V0KCkpOwotfQot
Ci1KU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpkZXNjcmlwdGlvbigpCi17Ci0g
ICAgaWYgKCFBVEtfSVNfT0JKRUNUKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBKU1N0cmlu
Z0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKDAsIDApOwotCi0gICAgY29uc3QgZ2NoYXIqIGRlc2NyaXB0
aW9uID0gYXRrX29iamVjdF9nZXRfZGVzY3JpcHRpb24oQVRLX09CSkVDVChtX2VsZW1lbnQpKTsK
LSAgICBpZiAoIWRlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRo
Q2hhcmFjdGVycygwLCAwKTsKLQotICAgIEdVbmlxdWVQdHI8Z2NoYXI+IGF4RGVzYyhnX3N0cmR1
cF9wcmludGYoIkFYRGVzY3JpcHRpb246ICVzIiwgZGVzY3JpcHRpb24pKTsKLQotICAgIHJldHVy
biBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZyhheERlc2MuZ2V0KCkpOwotfQotCi1KU1N0
cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpzdHJpbmdWYWx1ZSgpCi17Ci0gICAgaWYg
KCFBVEtfSVNfVEVYVChtX2VsZW1lbnQpKQotICAgICAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVX
aXRoQ2hhcmFjdGVycygwLCAwKTsKLQotICAgIEdVbmlxdWVQdHI8Z2NoYXI+IHRleHQoYXRrX3Rl
eHRfZ2V0X3RleHQoQVRLX1RFWFQobV9lbGVtZW50KSwgMCwgLTEpKTsKLSAgICBHVW5pcXVlUHRy
PGdjaGFyPiB0ZXh0V2l0aFJlcGxhY2VkQ2hhcmFjdGVycyhyZXBsYWNlQ2hhcmFjdGVyc0ZvclJl
c3VsdHModGV4dC5nZXQoKSkpOwotICAgIEdVbmlxdWVQdHI8Z2NoYXI+IGF4VmFsdWUoZ19zdHJk
dXBfcHJpbnRmKCJBWFZhbHVlOiAlcyIsIHRleHRXaXRoUmVwbGFjZWRDaGFyYWN0ZXJzLmdldCgp
KSk7Ci0KLSAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENTdHJpbmcoYXhWYWx1ZS5n
ZXQoKSk7Ci19Ci0KLUpTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6Omxhbmd1YWdl
KCkKLXsKLSAgICBpZiAoIUFUS19JU19PQkpFQ1QobV9lbGVtZW50KSkKLSAgICAgICAgcmV0dXJu
IEpTU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoMCwgMCk7Ci0KLSAgICBjb25zdCBnY2hhciog
bG9jYWxlID0gYXRrX29iamVjdF9nZXRfb2JqZWN0X2xvY2FsZShBVEtfT0JKRUNUKG1fZWxlbWVu
dCkpOwotICAgIGlmICghbG9jYWxlKQotICAgICAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRo
Q2hhcmFjdGVycygwLCAwKTsKLQotICAgIEdVbmlxdWVQdHI8Y2hhcj4gYXhWYWx1ZShnX3N0cmR1
cF9wcmludGYoIkFYTGFuZ3VhZ2U6ICVzIiwgbG9jYWxlKSk7Ci0gICAgcmV0dXJuIEpTU3RyaW5n
Q3JlYXRlV2l0aFVURjhDU3RyaW5nKGF4VmFsdWUuZ2V0KCkpOwotfQotCi1KU1N0cmluZ1JlZiBB
Y2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpoZWxwVGV4dCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFBVEtf
SVNfT0JKRUNUKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBKU1N0cmluZ0NyZWF0ZVdpdGhD
aGFyYWN0ZXJzKDAsIDApOwotCi0gICAgQXRrUmVsYXRpb25TZXQqIHJlbGF0aW9uU2V0ID0gYXRr
X29iamVjdF9yZWZfcmVsYXRpb25fc2V0KEFUS19PQkpFQ1QobV9lbGVtZW50KSk7Ci0gICAgaWYg
KCFyZWxhdGlvblNldCkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBBdGtSZWxhdGlv
biogcmVsYXRpb24gPSBhdGtfcmVsYXRpb25fc2V0X2dldF9yZWxhdGlvbl9ieV90eXBlKHJlbGF0
aW9uU2V0LCBBVEtfUkVMQVRJT05fREVTQ1JJQkVEX0JZKTsKLSAgICBpZiAoIXJlbGF0aW9uKQot
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIEdQdHJBcnJheSogdGFyZ2V0TGlzdCA9IGF0
a19yZWxhdGlvbl9nZXRfdGFyZ2V0KHJlbGF0aW9uKTsKLSAgICBpZiAoIXRhcmdldExpc3QgfHwg
IXRhcmdldExpc3QtPmxlbikKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBTdHJpbmdC
dWlsZGVyIGJ1aWxkZXI7Ci0gICAgYnVpbGRlci5hcHBlbmQoIkFYSGVscDogIik7Ci0KLSAgICBm
b3IgKGludCB0YXJnZXRDb3VudCA9IDA7IHRhcmdldENvdW50IDwgdGFyZ2V0TGlzdC0+bGVuOyB0
YXJnZXRDb3VudCsrKSB7Ci0gICAgICAgIGlmIChBdGtPYmplY3QqIHRhcmdldCA9IHN0YXRpY19j
YXN0PEF0a09iamVjdCo+KGdfcHRyX2FycmF5X2luZGV4KHRhcmdldExpc3QsIHRhcmdldENvdW50
KSkpIHsKLSAgICAgICAgICAgIEdVbmlxdWVQdHI8Z2NoYXI+IHRleHQoYXRrX3RleHRfZ2V0X3Rl
eHQoQVRLX1RFWFQodGFyZ2V0KSwgMCwgLTEpKTsKLSAgICAgICAgICAgIGlmICghYnVpbGRlci5p
c0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAiKTsKLSAgICAgICAg
ICAgIGJ1aWxkZXIuYXBwZW5kKHRleHQuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
Z19vYmplY3RfdW5yZWYocmVsYXRpb25TZXQpOwotCi0gICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRl
V2l0aFVURjhDU3RyaW5nKGJ1aWxkZXIudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKLQotfQot
Ci1kb3VibGUgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6eCgpCi17Ci0gICAgaWYgKCFBVEtfSVNf
Q09NUE9ORU5UKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaW50IHg7Ci0j
aWYgQVRLX0NIRUNLX1ZFUlNJT04oMiwxMSw5MCkKLSAgICBhdGtfY29tcG9uZW50X2dldF9leHRl
bnRzKEFUS19DT01QT05FTlQobV9lbGVtZW50KSwgJngsIG51bGxwdHIsIG51bGxwdHIsIG51bGxw
dHIsIEFUS19YWV9TQ1JFRU4pOwotI2Vsc2UKLSAgICBhdGtfY29tcG9uZW50X2dldF9wb3NpdGlv
bihBVEtfQ09NUE9ORU5UKG1fZWxlbWVudCksICZ4LCBudWxscHRyLCBBVEtfWFlfU0NSRUVOKTsK
LSNlbmRpZgotCi0gICAgcmV0dXJuIHg7Ci19Ci0KLWRvdWJsZSBBY2Nlc3NpYmlsaXR5VUlFbGVt
ZW50Ojp5KCkKLXsKLSAgICBpZiAoIUFUS19JU19DT01QT05FTlQobV9lbGVtZW50KSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICBpbnQgeTsKLSNpZiBBVEtfQ0hFQ0tfVkVSU0lPTigyLDExLDkw
KQotICAgIGF0a19jb21wb25lbnRfZ2V0X2V4dGVudHMoQVRLX0NPTVBPTkVOVChtX2VsZW1lbnQp
LCBudWxscHRyLCAmeSwgbnVsbHB0ciwgbnVsbHB0ciwgQVRLX1hZX1NDUkVFTik7Ci0jZWxzZQot
ICAgIGF0a19jb21wb25lbnRfZ2V0X3Bvc2l0aW9uKEFUS19DT01QT05FTlQobV9lbGVtZW50KSwg
bnVsbHB0ciwgJnksIEFUS19YWV9TQ1JFRU4pOwotI2VuZGlmCi0KLSAgICByZXR1cm4geTsKLX0K
LQotZG91YmxlIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OndpZHRoKCkKLXsKLSAgICBpZiAoIUFU
S19JU19DT01QT05FTlQobV9lbGVtZW50KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpbnQg
d2lkdGg7Ci0jaWYgQVRLX0NIRUNLX1ZFUlNJT04oMiwxMSw5MCkKLSAgICBhdGtfY29tcG9uZW50
X2dldF9leHRlbnRzKEFUS19DT01QT05FTlQobV9lbGVtZW50KSwgbnVsbHB0ciwgbnVsbHB0ciwg
JndpZHRoLCBudWxscHRyLCBBVEtfWFlfV0lORE9XKTsKLSNlbHNlCi0gICAgYXRrX2NvbXBvbmVu
dF9nZXRfc2l6ZShBVEtfQ09NUE9ORU5UKG1fZWxlbWVudCksICZ3aWR0aCwgbnVsbHB0cik7Ci0j
ZW5kaWYKLQotICAgIHJldHVybiB3aWR0aDsKLX0KLQotZG91YmxlIEFjY2Vzc2liaWxpdHlVSUVs
ZW1lbnQ6OmhlaWdodCgpCi17Ci0gICAgaWYgKCFBVEtfSVNfQ09NUE9ORU5UKG1fZWxlbWVudCkp
Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgaW50IGhlaWdodDsKLSNpZiBBVEtfQ0hFQ0tfVkVS
U0lPTigyLDExLDkwKQotICAgIGF0a19jb21wb25lbnRfZ2V0X2V4dGVudHMoQVRLX0NPTVBPTkVO
VChtX2VsZW1lbnQpLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCAmaGVpZ2h0LCBBVEtfWFlf
V0lORE9XKTsKLSNlbHNlCi0gICAgYXRrX2NvbXBvbmVudF9nZXRfc2l6ZShBVEtfQ09NUE9ORU5U
KG1fZWxlbWVudCksIG51bGxwdHIsICZoZWlnaHQpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gaGVp
Z2h0OwotfQotCi1kb3VibGUgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6Y2xpY2tQb2ludFgoKQot
ewotICAgIGlmICghQVRLX0lTX0NPTVBPTkVOVChtX2VsZW1lbnQpKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIGludCB4LCB3aWR0aDsKLSNpZiBBVEtfQ0hFQ0tfVkVSU0lPTigyLDExLDkwKQot
ICAgIGF0a19jb21wb25lbnRfZ2V0X2V4dGVudHMoQVRLX0NPTVBPTkVOVChtX2VsZW1lbnQpLCAm
eCwgbnVsbHB0ciwgJndpZHRoLCBudWxscHRyLCBBVEtfWFlfV0lORE9XKTsKLSNlbHNlCi0gICAg
YXRrX2NvbXBvbmVudF9nZXRfcG9zaXRpb24oQVRLX0NPTVBPTkVOVChtX2VsZW1lbnQpLCAmeCwg
bnVsbHB0ciwgQVRLX1hZX1dJTkRPVyk7Ci0gICAgYXRrX2NvbXBvbmVudF9nZXRfc2l6ZShBVEtf
Q09NUE9ORU5UKG1fZWxlbWVudCksICZ3aWR0aCwgbnVsbHB0cik7Ci0jZW5kaWYKLQotICAgIHJl
dHVybiB4ICsgd2lkdGggLyAyLjA7Ci19Ci0KLWRvdWJsZSBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50
OjpjbGlja1BvaW50WSgpCi17Ci0gICAgaWYgKCFBVEtfSVNfQ09NUE9ORU5UKG1fZWxlbWVudCkp
Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgaW50IHksIGhlaWdodDsKLSNpZiBBVEtfQ0hFQ0tf
VkVSU0lPTigyLDExLDkwKQotICAgIGF0a19jb21wb25lbnRfZ2V0X2V4dGVudHMoQVRLX0NPTVBP
TkVOVChtX2VsZW1lbnQpLCBudWxscHRyLCAmeSwgbnVsbHB0ciwgJmhlaWdodCwgQVRLX1hZX1dJ
TkRPVyk7Ci0jZWxzZQotICAgIGF0a19jb21wb25lbnRfZ2V0X3Bvc2l0aW9uKEFUS19DT01QT05F
TlQobV9lbGVtZW50KSwgbnVsbHB0ciwgJnksIEFUS19YWV9XSU5ET1cpOwotICAgIGF0a19jb21w
b25lbnRfZ2V0X3NpemUoQVRLX0NPTVBPTkVOVChtX2VsZW1lbnQpLCBudWxscHRyLCAmaGVpZ2h0
KTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIHkgKyBoZWlnaHQgLyAyLjA7Ci19Ci0KLUpTU3RyaW5n
UmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6Om9yaWVudGF0aW9uKCkgY29uc3QKLXsKLSAgICBp
ZiAoIUFUS19JU19PQkpFQ1QobV9lbGVtZW50KSkKLSAgICAgICAgcmV0dXJuIEpTU3RyaW5nQ3Jl
YXRlV2l0aENoYXJhY3RlcnMoMCwgMCk7Ci0KLSAgICBjb25zdCBjaGFyKiBheE9yaWVudGF0aW9u
ID0gbnVsbHB0cjsKLSAgICBpZiAoY2hlY2tFbGVtZW50U3RhdGUobV9lbGVtZW50LCBBVEtfU1RB
VEVfSE9SSVpPTlRBTCkpCi0gICAgICAgIGF4T3JpZW50YXRpb24gPSAiQVhPcmllbnRhdGlvbjog
QVhIb3Jpem9udGFsT3JpZW50YXRpb24iOwotICAgIGVsc2UgaWYgKGNoZWNrRWxlbWVudFN0YXRl
KG1fZWxlbWVudCwgQVRLX1NUQVRFX1ZFUlRJQ0FMKSkKLSAgICAgICAgYXhPcmllbnRhdGlvbiA9
ICJBWE9yaWVudGF0aW9uOiBBWFZlcnRpY2FsT3JpZW50YXRpb24iOwotCi0gICAgaWYgKCFheE9y
aWVudGF0aW9uKQotICAgICAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycygw
LCAwKTsKLQotICAgIHJldHVybiBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZyhheE9yaWVu
dGF0aW9uKTsKLX0KLQotZG91YmxlIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmludFZhbHVlKCkg
Y29uc3QKLXsKLSAgICBpZiAoIUFUS19JU19PQkpFQ1QobV9lbGVtZW50KSkKLSAgICAgICAgcmV0
dXJuIDA7Ci0KLSAgICBpZiAoQVRLX0lTX1ZBTFVFKG1fZWxlbWVudCkpIHsKLSNpZiBBVEtfQ0hF
Q0tfVkVSU0lPTigyLDExLDkyKQotICAgICAgICBkb3VibGUgdmFsdWU7Ci0gICAgICAgIGF0a192
YWx1ZV9nZXRfdmFsdWVfYW5kX3RleHQoQVRLX1ZBTFVFKG1fZWxlbWVudCksICZ2YWx1ZSwgbnVs
bHB0cik7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSNlbHNlCi0gICAgICAgIEdWYWx1ZSB2YWx1
ZSA9IEdfVkFMVUVfSU5JVDsKLSAgICAgICAgYXRrX3ZhbHVlX2dldF9jdXJyZW50X3ZhbHVlKEFU
S19WQUxVRShtX2VsZW1lbnQpLCAmdmFsdWUpOwotICAgICAgICBpZiAoIUdfVkFMVUVfSE9MRFNf
RkxPQVQoJnZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gZ192
YWx1ZV9nZXRfZmxvYXQoJnZhbHVlKTsKLSNlbmRpZgotICAgIH0KLQotICAgIC8vIENvbnNpZGVy
IGhlYWRpbmdzIGFzIGFuIHNwZWNpYWwgY2FzZSB3aGVuIHJldHVybmluZyB0aGUgImludCB2YWx1
ZSIgb2YKLSAgICAvLyBhbiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50LCBzbyB3ZSBjYW4gcmV1c2Ug
c29tZSB0ZXN0cyB0byBjaGVjayB0aGUgbGV2ZWwKLSAgICAvLyBib3RoIGZvciBIVE1MIGhlYWRp
bmdzIGFuZCBvYmplY3RzIHdpdGggdGhlIGFyaWEtbGV2ZWwgYXR0cmlidXRlLgotICAgIGlmIChh
dGtfb2JqZWN0X2dldF9yb2xlKEFUS19PQkpFQ1QobV9lbGVtZW50KSkgPT0gQVRLX1JPTEVfSEVB
RElORykgewotICAgICAgICBTdHJpbmcgaGVhZGluZ0xldmVsID0gZ2V0QXR0cmlidXRlU2V0VmFs
dWVGb3JJZChBVEtfT0JKRUNUKG1fZWxlbWVudCksIE9iamVjdEF0dHJpYnV0ZVR5cGUsICJsZXZl
bCIpOwotICAgICAgICBib29sIG9rOwotICAgICAgICBkb3VibGUgaGVhZGluZ0xldmVsVmFsdWUg
PSBoZWFkaW5nTGV2ZWwudG9Eb3VibGUoJm9rKTsKLSAgICAgICAgaWYgKG9rKQotICAgICAgICAg
ICAgcmV0dXJuIGhlYWRpbmdMZXZlbFZhbHVlOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQot
Ci1kb3VibGUgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6bWluVmFsdWUoKQotewotICAgIGlmICgh
QVRLX0lTX1ZBTFVFKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVybiAwOwotI2lmIEFUS19DSEVD
S19WRVJTSU9OKDIsMTEsOTIpCi0gICAgcmV0dXJuIHJhbmdlTWluTWF4VmFsdWUoQVRLX1ZBTFVF
KG1fZWxlbWVudCksIFJhbmdlTGltaXRNaW5pbXVtKTsKLSNlbHNlCi0gICAgR1ZhbHVlIHZhbHVl
ID0gR19WQUxVRV9JTklUOwotICAgIGF0a192YWx1ZV9nZXRfbWluaW11bV92YWx1ZShBVEtfVkFM
VUUobV9lbGVtZW50KSwgJnZhbHVlKTsKLSAgICBpZiAoIUdfVkFMVUVfSE9MRFNfRkxPQVQoJnZh
bHVlKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGdfdmFsdWVfZ2V0X2Zsb2F0KCZ2
YWx1ZSk7Ci0jZW5kaWYKLX0KLQotZG91YmxlIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6Om1heFZh
bHVlKCkKLXsKLSAgICBpZiAoIUFUS19JU19WQUxVRShtX2VsZW1lbnQpKQotICAgICAgICByZXR1
cm4gMDsKLSNpZiBBVEtfQ0hFQ0tfVkVSU0lPTigyLDExLDkyKQotICAgIHJldHVybiByYW5nZU1p
bk1heFZhbHVlKEFUS19WQUxVRShtX2VsZW1lbnQpLCBSYW5nZUxpbWl0TWF4aW11bSk7Ci0jZWxz
ZQotICAgIEdWYWx1ZSB2YWx1ZSA9IEdfVkFMVUVfSU5JVDsKLSAgICBhdGtfdmFsdWVfZ2V0X21h
eGltdW1fdmFsdWUoQVRLX1ZBTFVFKG1fZWxlbWVudCksICZ2YWx1ZSk7Ci0gICAgaWYgKCFHX1ZB
TFVFX0hPTERTX0ZMT0FUKCZ2YWx1ZSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBn
X3ZhbHVlX2dldF9mbG9hdCgmdmFsdWUpOwotI2VuZGlmCi19Ci0KLUpTU3RyaW5nUmVmIEFjY2Vz
c2liaWxpdHlVSUVsZW1lbnQ6OnZhbHVlRGVzY3JpcHRpb24oKQotewotICAgIC8vIEZJWE1FOiBp
bXBsZW1lbnQgYWZ0ZXIgaXQgaGFzIGJlZW4gaW1wbGVtZW50ZWQgaW4gQVRLLgotICAgIC8vIFNl
ZTogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NDU3NgotICAg
IHJldHVybiBKU1N0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKDAsIDApOwotfQotCi1ib29sIEFj
Y2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmlzRW5hYmxlZCgpCi17Ci0gICAgcmV0dXJuIGNoZWNrRWxl
bWVudFN0YXRlKG1fZWxlbWVudCwgQVRLX1NUQVRFX0VOQUJMRUQpOwotfQotCi1pbnQgQWNjZXNz
aWJpbGl0eVVJRWxlbWVudDo6aW5zZXJ0aW9uUG9pbnRMaW5lTnVtYmVyKCkKLXsKLSAgICAvLyBG
SVhNRTogaW1wbGVtZW50Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgQWNjZXNzaWJpbGl0eVVJ
RWxlbWVudDo6aXNQcmVzc0FjdGlvblN1cHBvcnRlZCgpCi17Ci0gICAgaWYgKCFBVEtfSVNfQUNU
SU9OKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNvbnN0IGdjaGFy
KiBhY3Rpb25OYW1lID0gYXRrX2FjdGlvbl9nZXRfbmFtZShBVEtfQUNUSU9OKG1fZWxlbWVudCks
IDApOwotICAgIHJldHVybiBlcXVhbElnbm9yaW5nQ2FzZShhY3Rpb25OYW1lLCBTdHJpbmcoInBy
ZXNzIikpIHx8IGVxdWFsSWdub3JpbmdDYXNlKGFjdGlvbk5hbWUsIFN0cmluZygianVtcCIpKTsK
LX0KLQotYm9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojppc0luY3JlbWVudEFjdGlvblN1cHBv
cnRlZCgpCi17Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudAotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotYm9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojppc0RlY3JlbWVudEFjdGlvblN1cHBvcnRl
ZCgpCi17Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudAotICAgIHJldHVybiBmYWxzZTsKLX0KLQot
Ym9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojppc1JlcXVpcmVkKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gY2hlY2tFbGVtZW50U3RhdGUobV9lbGVtZW50LCBBVEtfU1RBVEVfUkVRVUlSRUQpOwot
fQotCi1ib29sIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmlzRm9jdXNlZCgpIGNvbnN0Ci17Ci0g
ICAgaWYgKCFBVEtfSVNfT0JKRUNUKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIEdSZWZQdHI8QXRrU3RhdGVTZXQ+IHN0YXRlU2V0ID0gYWRvcHRHUmVmKGF0a19vYmpl
Y3RfcmVmX3N0YXRlX3NldChBVEtfT0JKRUNUKG1fZWxlbWVudCkpKTsKLSAgICBnYm9vbGVhbiBp
c0ZvY3VzZWQgPSBhdGtfc3RhdGVfc2V0X2NvbnRhaW5zX3N0YXRlKHN0YXRlU2V0LmdldCgpLCBB
VEtfU1RBVEVfRk9DVVNFRCk7Ci0KLSAgICByZXR1cm4gaXNGb2N1c2VkOwotfQotCi1ib29sIEFj
Y2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmlzU2VsZWN0ZWQoKSBjb25zdAotewotICAgIHJldHVybiBj
aGVja0VsZW1lbnRTdGF0ZShtX2VsZW1lbnQsIEFUS19TVEFURV9TRUxFQ1RFRCk7Ci19Ci0KLWlu
dCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpoaWVyYXJjaGljYWxMZXZlbCgpIGNvbnN0Ci17Ci0g
ICAgLy8gRklYTUU6IGltcGxlbWVudAotICAgIHJldHVybiAwOwotfQotCi1ib29sIEFjY2Vzc2li
aWxpdHlVSUVsZW1lbnQ6OmFyaWFJc0dyYWJiZWQoKSBjb25zdAotewotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQotSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6YXJpYURyb3BFZmZl
Y3RzKCkgY29uc3QKLXsgICAKLSAgICByZXR1cm4gbnVsbHB0cjsgCi19Ci0KLWJvb2wgQWNjZXNz
aWJpbGl0eVVJRWxlbWVudDo6aXNFeHBhbmRlZCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFBVEtfSVNf
T0JKRUNUKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIEdSZWZQdHI8
QXRrU3RhdGVTZXQ+IHN0YXRlU2V0ID0gYWRvcHRHUmVmKGF0a19vYmplY3RfcmVmX3N0YXRlX3Nl
dChBVEtfT0JKRUNUKG1fZWxlbWVudCkpKTsKLSAgICBnYm9vbGVhbiBpc0V4cGFuZGVkID0gYXRr
X3N0YXRlX3NldF9jb250YWluc19zdGF0ZShzdGF0ZVNldC5nZXQoKSwgQVRLX1NUQVRFX0VYUEFO
REVEKTsKLQotICAgIHJldHVybiBpc0V4cGFuZGVkOwotfQotCi1ib29sIEFjY2Vzc2liaWxpdHlV
SUVsZW1lbnQ6OmlzQ2hlY2tlZCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFBVEtfSVNfT0JKRUNUKG1f
ZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIEdSZWZQdHI8QXRrU3RhdGVT
ZXQ+IHN0YXRlU2V0ID0gYWRvcHRHUmVmKGF0a19vYmplY3RfcmVmX3N0YXRlX3NldChBVEtfT0JK
RUNUKG1fZWxlbWVudCkpKTsKLSAgICBnYm9vbGVhbiBpc0NoZWNrZWQgPSBhdGtfc3RhdGVfc2V0
X2NvbnRhaW5zX3N0YXRlKHN0YXRlU2V0LmdldCgpLCBBVEtfU1RBVEVfQ0hFQ0tFRCk7Ci0KLSAg
ICByZXR1cm4gaXNDaGVja2VkOwotfQotCi1ib29sIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6Omlz
SW5kZXRlcm1pbmF0ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFBVEtfSVNfT0JKRUNUKG1fZWxlbWVu
dCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIEdSZWZQdHI8QXRrU3RhdGVTZXQ+IHN0
YXRlU2V0ID0gYWRvcHRHUmVmKGF0a19vYmplY3RfcmVmX3N0YXRlX3NldChBVEtfT0JKRUNUKG1f
ZWxlbWVudCkpKTsKLSAgICByZXR1cm4gYXRrX3N0YXRlX3NldF9jb250YWluc19zdGF0ZShzdGF0
ZVNldC5nZXQoKSwgQVRLX1NUQVRFX0lOREVURVJNSU5BVEUpOwotfQotCi1KU1N0cmluZ1JlZiBB
Y2Nlc3NpYmlsaXR5VUlFbGVtZW50OjphdHRyaWJ1dGVzT2ZDb2x1bW5IZWFkZXJzKCkKLXsKLSAg
ICBpZiAoIUFUS19JU19UQUJMRShtX2VsZW1lbnQpKQotICAgICAgICByZXR1cm4gSlNTdHJpbmdD
cmVhdGVXaXRoQ2hhcmFjdGVycygwLCAwKTsKLQotICAgIFZlY3RvcjxBY2Nlc3NpYmlsaXR5VUlF
bGVtZW50PiBjb2x1bW5IZWFkZXJzID0gZ2V0Q29sdW1uSGVhZGVycyhBVEtfVEFCTEUobV9lbGVt
ZW50KSk7Ci0gICAgcmV0dXJuIGNyZWF0ZVN0cmluZ1dpdGhBdHRyaWJ1dGVzKGNvbHVtbkhlYWRl
cnMpOwotfQotCi1KU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjphdHRyaWJ1dGVz
T2ZSb3dIZWFkZXJzKCkKLXsKLSAgICBpZiAoIUFUS19JU19UQUJMRShtX2VsZW1lbnQpKQotICAg
ICAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycygwLCAwKTsKLQotICAgIFZl
Y3RvcjxBY2Nlc3NpYmlsaXR5VUlFbGVtZW50PiByb3dIZWFkZXJzID0gZ2V0Um93SGVhZGVycyhB
VEtfVEFCTEUobV9lbGVtZW50KSk7Ci0gICAgcmV0dXJuIGNyZWF0ZVN0cmluZ1dpdGhBdHRyaWJ1
dGVzKHJvd0hlYWRlcnMpOwotfQotCi1KU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50
OjphdHRyaWJ1dGVzT2ZDb2x1bW5zKCkKLXsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50Ci0gICAg
cmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoMCwgMCk7Ci19Ci0KLUpTU3RyaW5n
UmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmF0dHJpYnV0ZXNPZlJvd3MoKQotewotICAgIC8v
IEZJWE1FOiBpbXBsZW1lbnQKLSAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVy
cygwLCAwKTsKLX0KLQotSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6YXR0cmli
dXRlc09mVmlzaWJsZUNlbGxzKCkKLXsKLSAgICBpZiAoIUFUS19JU19UQUJMRShtX2VsZW1lbnQp
KQotICAgICAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycygwLCAwKTsKLQot
ICAgIFZlY3RvcjxBY2Nlc3NpYmlsaXR5VUlFbGVtZW50PiB2aXNpYmxlQ2VsbHMgPSBnZXRWaXNp
YmxlQ2VsbHModGhpcyk7Ci0gICAgcmV0dXJuIGNyZWF0ZVN0cmluZ1dpdGhBdHRyaWJ1dGVzKHZp
c2libGVDZWxscyk7Ci19Ci0KLUpTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmF0
dHJpYnV0ZXNPZkhlYWRlcigpCi17Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudAotICAgIHJldHVy
biBKU1N0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKDAsIDApOwotfQotCi1pbnQgQWNjZXNzaWJp
bGl0eVVJRWxlbWVudDo6aW5kZXhJblRhYmxlKCkKLXsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50
Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUpTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6
OnJvd0luZGV4UmFuZ2UoKQotewotICAgIC8vIFJhbmdlIGluIHRhYmxlIGZvciByb3dzLgotICAg
IHJldHVybiBpbmRleFJhbmdlSW5UYWJsZShtX2VsZW1lbnQsIHRydWUpOwotfQotCi1KU1N0cmlu
Z1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojpjb2x1bW5JbmRleFJhbmdlKCkKLXsKLSAgICAv
LyBSYW5nZSBpbiB0YWJsZSBmb3IgY29sdW1ucy4KLSAgICByZXR1cm4gaW5kZXhSYW5nZUluVGFi
bGUobV9lbGVtZW50LCBmYWxzZSk7Ci19Ci0KLWludCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojps
aW5lRm9ySW5kZXgoaW50IGluZGV4KQotewotICAgIGlmICghQVRLX0lTX1RFWFQobV9lbGVtZW50
KSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IGF0
a190ZXh0X2dldF9jaGFyYWN0ZXJfY291bnQoQVRLX1RFWFQobV9lbGVtZW50KSkpCi0gICAgICAg
IHJldHVybiAtMTsKLQotICAgIEdVbmlxdWVQdHI8Z2NoYXI+IHRleHQoYXRrX3RleHRfZ2V0X3Rl
eHQoQVRLX1RFWFQobV9lbGVtZW50KSwgMCwgaW5kZXgpKTsKLSAgICBpbnQgbGluZU5vID0gMDsK
LSAgICBmb3IgKGdjaGFyKiBvZmZzZXQgPSB0ZXh0LmdldCgpOyAqb2Zmc2V0OyArK29mZnNldCkg
ewotICAgICAgICBpZiAoKm9mZnNldCA9PSAnXG4nKQotICAgICAgICAgICAgKytsaW5lTm87Ci0g
ICAgfQotCi0gICAgcmV0dXJuIGxpbmVObzsKLX0KLQotSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0
eVVJRWxlbWVudDo6Ym91bmRzRm9yUmFuZ2UodW5zaWduZWQgbG9jYXRpb24sIHVuc2lnbmVkIGxl
bmd0aCkKLXsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50Ci0gICAgcmV0dXJuIEpTU3RyaW5nQ3Jl
YXRlV2l0aENoYXJhY3RlcnMoMCwgMCk7Ci19Ci0KLUpTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlV
SUVsZW1lbnQ6OnN0cmluZ0ZvclJhbmdlKHVuc2lnbmVkIGxvY2F0aW9uLCB1bnNpZ25lZCBsZW5n
dGgpCi17Ci0gICAgaWYgKCFBVEtfSVNfVEVYVChtX2VsZW1lbnQpKQotICAgICAgICByZXR1cm4g
SlNTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycygwLCAwKTsKLQotICAgIFN0cmluZyBzdHJpbmcg
PSBhdGtfdGV4dF9nZXRfdGV4dChBVEtfVEVYVChtX2VsZW1lbnQpLCBsb2NhdGlvbiwgbG9jYXRp
b24gKyBsZW5ndGgpOwotICAgIHJldHVybiBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZyhz
dHJpbmcudXRmOCgpLmRhdGEoKSk7Ci19IAotCi1KU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlF
bGVtZW50OjphdHRyaWJ1dGVkU3RyaW5nRm9yUmFuZ2UodW5zaWduZWQsIHVuc2lnbmVkKQotewot
ICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLSAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRoQ2hh
cmFjdGVycygwLCAwKTsKLX0KLQotYm9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjphdHRyaWJ1
dGVkU3RyaW5nUmFuZ2VJc01pc3NwZWxsZWQodW5zaWduZWQgbG9jYXRpb24sIHVuc2lnbmVkIGxl
bmd0aCkKLXsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50Ci0gICAgcmV0dXJuIGZhbHNlOwotfQot
Ci11bnNpZ25lZCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojp1aUVsZW1lbnRDb3VudEZvclNlYXJj
aFByZWRpY2F0ZShKU0NvbnRleHRSZWYgY29udGV4dCwgQWNjZXNzaWJpbGl0eVVJRWxlbWVudCog
c3RhcnRFbGVtZW50LCBib29sIGlzRGlyZWN0aW9uTmV4dCwgSlNWYWx1ZVJlZiBzZWFyY2hLZXks
IEpTU3RyaW5nUmVmIHNlYXJjaFRleHQsIGJvb2wgdmlzaWJsZU9ubHksIGJvb2wgaW1tZWRpYXRl
RGVzY2VuZGFudHNPbmx5KQotewotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLSAgICByZXR1cm4g
MDsKLX0KLQotQWNjZXNzaWJpbGl0eVVJRWxlbWVudCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojp1
aUVsZW1lbnRGb3JTZWFyY2hQcmVkaWNhdGUoSlNDb250ZXh0UmVmIGNvbnRleHQsIEFjY2Vzc2li
aWxpdHlVSUVsZW1lbnQqIHN0YXJ0RWxlbWVudCwgYm9vbCBpc0RpcmVjdGlvbk5leHQsIEpTVmFs
dWVSZWYgc2VhcmNoS2V5LCBKU1N0cmluZ1JlZiBzZWFyY2hUZXh0LCBib29sIHZpc2libGVPbmx5
LCBib29sIGltbWVkaWF0ZURlc2NlbmRhbnRzT25seSkKLXsKLSAgICAvLyBGSVhNRTogaW1wbGVt
ZW50Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUpTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlV
SUVsZW1lbnQ6OnNlbGVjdFRleHRXaXRoQ3JpdGVyaWEoSlNDb250ZXh0UmVmIGNvbnRleHQsIEpT
U3RyaW5nUmVmIGFtYmlndWl0eVJlc29sdXRpb24sIEpTVmFsdWVSZWYgc2VhcmNoU3RyaW5ncywg
SlNTdHJpbmdSZWYgcmVwbGFjZW1lbnRTdHJpbmcsIEpTU3RyaW5nUmVmIGFjdGl2aXR5KQotewot
ICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQWNjZXNz
aWJpbGl0eVVJRWxlbWVudCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpjZWxsRm9yQ29sdW1uQW5k
Um93KHVuc2lnbmVkIGNvbHVtbiwgdW5zaWduZWQgcm93KQotewotICAgIGlmICghQVRLX0lTX1RB
QkxFKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgLy8gQWRvcHQg
dGhlIEF0a09iamVjdCByZXByZXNlbnRpbmcgdGhlIGNlbGwgYmVjYXVzZQotICAgIC8vIGF0X3Rh
YmxlX3JlZl9hdCgpIHRyYW5zZmVycyBmdWxsIG93bmVyc2hpcC4KLSAgICBHUmVmUHRyPEF0a09i
amVjdD4gZm91bmRDZWxsID0gYWRvcHRHUmVmKGF0a190YWJsZV9yZWZfYXQoQVRLX1RBQkxFKG1f
ZWxlbWVudCksIHJvdywgY29sdW1uKSk7Ci0gICAgcmV0dXJuIGZvdW5kQ2VsbCA/IEFjY2Vzc2li
aWxpdHlVSUVsZW1lbnQoZm91bmRDZWxsLmdldCgpKSA6IG51bGxwdHI7Ci19Ci0KLUpTU3RyaW5n
UmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnNlbGVjdGVkVGV4dFJhbmdlKCkKLXsKLSAgICBp
ZiAoIUFUS19JU19URVhUKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBKU1N0cmluZ0NyZWF0
ZVdpdGhDaGFyYWN0ZXJzKDAsIDApOwotCi0gICAgZ2ludCBzdGFydCwgZW5kOwotICAgIGdfZnJl
ZShhdGtfdGV4dF9nZXRfc2VsZWN0aW9uKEFUS19URVhUKG1fZWxlbWVudCksIDAsICZzdGFydCwg
JmVuZCkpOwotCi0gICAgR1VuaXF1ZVB0cjxnY2hhcj4gc2VsZWN0aW9uKGdfc3RyZHVwX3ByaW50
ZigieyVkLCAlZH0iLCBzdGFydCwgZW5kIC0gc3RhcnQpKTsKLSAgICByZXR1cm4gSlNTdHJpbmdD
cmVhdGVXaXRoVVRGOENTdHJpbmcoc2VsZWN0aW9uLmdldCgpKTsKLX0KLQotdm9pZCBBY2Nlc3Np
YmlsaXR5VUlFbGVtZW50OjpzZXRTZWxlY3RlZFRleHRSYW5nZSh1bnNpZ25lZCBsb2NhdGlvbiwg
dW5zaWduZWQgbGVuZ3RoKQotewotICAgIGlmICghQVRLX0lTX1RFWFQobV9lbGVtZW50KSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgYXRrX3RleHRfc2V0X3NlbGVjdGlvbihBVEtfVEVYVChtX2Vs
ZW1lbnQpLCAwLCBsb2NhdGlvbiwgbG9jYXRpb24gKyBsZW5ndGgpOwotfQotCi1KU1N0cmluZ1Jl
ZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpzdHJpbmdBdHRyaWJ1dGVWYWx1ZShKU1N0cmluZ1Jl
ZiBhdHRyaWJ1dGUpCi17Ci0gICAgaWYgKCFBVEtfSVNfT0JKRUNUKG1fZWxlbWVudCkpCi0gICAg
ICAgIHJldHVybiBKU1N0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKDAsIDApOwotCi0gICAgU3Ry
aW5nIGF0a0F0dHJpYnV0ZU5hbWUgPSBjb3JlQXR0cmlidXRlVG9BdGtBdHRyaWJ1dGUoYXR0cmli
dXRlKTsKLQotICAgIC8vIFRyeSBvYmplY3QgYXR0cmlidXRlcyBmaXJzdC4KLSAgICBTdHJpbmcg
YXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVTZXRWYWx1ZUZvcklkKEFUS19PQkpFQ1QobV9l
bGVtZW50KSwgT2JqZWN0QXR0cmlidXRlVHlwZSwgYXRrQXR0cmlidXRlTmFtZSk7Ci0KLSAgICAv
LyBUcnkgdGV4dCBhdHRyaWJ1dGVzIGlmIHRoZSByZXF1ZXN0ZWQgb25lIHdhcyBub3QgZm91bmQg
YW5kIHdlIGhhdmUgYW4gQXRrVGV4dCBvYmplY3QuCi0gICAgaWYgKGF0dHJpYnV0ZVZhbHVlLmlz
RW1wdHkoKSAmJiBBVEtfSVNfVEVYVChtX2VsZW1lbnQpKQotICAgICAgICBhdHRyaWJ1dGVWYWx1
ZSA9IGdldEF0dHJpYnV0ZVNldFZhbHVlRm9ySWQoQVRLX09CSkVDVChtX2VsZW1lbnQpLCBUZXh0
QXR0cmlidXRlVHlwZSwgYXRrQXR0cmlidXRlTmFtZSk7Ci0KLSAgICAvLyBBZGRpdGlvbmFsIGNo
ZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBleHBvc3VyZSBvZiB0aGUgc3RhdGUgQVRLX1NUQVRF
X0lOVkFMSURfRU5UUlkKLSAgICAvLyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGV4cG9zdXJlIG9m
IGFyaWEtaW52YWxpZCBhcyBhIHRleHQgYXR0cmlidXRlLCBpZiBwcmVzZW50LgotICAgIGlmIChh
dGtBdHRyaWJ1dGVOYW1lID09IGF0dHJpYnV0ZXNNYXBbSW52YWxpZE5hbWVJbmRleF1bQXRrRG9t
YWluXSkgewotICAgICAgICBib29sIGlzSW52YWxpZFN0YXRlID0gY2hlY2tFbGVtZW50U3RhdGUo
bV9lbGVtZW50LCBBVEtfU1RBVEVfSU5WQUxJRF9FTlRSWSk7Ci0gICAgICAgIGlmIChhdHRyaWJ1
dGVWYWx1ZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRo
VVRGOENTdHJpbmcoaXNJbnZhbGlkU3RhdGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQotICAgICAg
ICAvLyBJZiB0aGUgdGV4dCBhdHRyaWJ1dGUgd2FzIHRoZXJlLCBjaGVjayB0aGF0IGl0J3MgY29u
c2lzdGVudCB3aXRoCi0gICAgICAgIC8vIHdoYXQgdGhlIHN0YXRlIHNheXMgb3IgZm9yY2UgdGhl
IHRlc3QgdG8gZmFpbCBvdGhlcndpc2UuCi0gICAgICAgIGJvb2wgaXNBcmlhSW52YWxpZCA9IGF0
dHJpYnV0ZVZhbHVlICE9ICJmYWxzZSI7Ci0gICAgICAgIGlmIChpc0ludmFsaWRTdGF0ZSAhPSBp
c0FyaWFJbnZhbGlkKQotICAgICAgICAgICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aENoYXJh
Y3RlcnMoMCwgMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhD
U3RyaW5nKGF0dHJpYnV0ZVZhbHVlLnV0ZjgoKS5kYXRhKCkpOwotfQotCi1kb3VibGUgQWNjZXNz
aWJpbGl0eVVJRWxlbWVudDo6bnVtYmVyQXR0cmlidXRlVmFsdWUoSlNTdHJpbmdSZWYgYXR0cmli
dXRlKQotewotICAgIGlmICghQVRLX0lTX09CSkVDVChtX2VsZW1lbnQpKQotICAgICAgICByZXR1
cm4gMDsKLQotICAgIFN0cmluZyBhdGtBdHRyaWJ1dGVOYW1lID0gY29yZUF0dHJpYnV0ZVRvQXRr
QXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0gICAgaWYgKGF0a0F0dHJpYnV0ZU5hbWUuaXNFbXB0eSgp
KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChhdGtBdHRyaWJ1dGVOYW1lID09ICJzZXRz
aXplIiB8fCBhdGtBdHRyaWJ1dGVOYW1lID09ICJwb3NpbnNldCIpIHsKLSAgICAgICAgU3RyaW5n
IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlU2V0VmFsdWVGb3JJZChBVEtfT0JKRUNUKG1f
ZWxlbWVudCksIE9iamVjdEF0dHJpYnV0ZVR5cGUsIGF0a0F0dHJpYnV0ZU5hbWUpOwotICAgICAg
ICBpZiAoIWF0dHJpYnV0ZVZhbHVlLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBhdHRy
aWJ1dGVWYWx1ZS50b0RvdWJsZSgpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1ib29s
IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmJvb2xBdHRyaWJ1dGVWYWx1ZShKU1N0cmluZ1JlZiBh
dHRyaWJ1dGUpCi17Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudAotICAgIHJldHVybiBmYWxzZTsK
LX0KLQotYm9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojppc0F0dHJpYnV0ZVNldHRhYmxlKEpT
U3RyaW5nUmVmIGF0dHJpYnV0ZSkKLXsKLSAgICBpZiAoIUFUS19JU19PQkpFQ1QobV9lbGVtZW50
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU3RyaW5nIGF0dHJpYnV0ZVN0cmluZyA9
IGpzU3RyaW5nVG9XVEZTdHJpbmcoYXR0cmlidXRlKTsKLSAgICBpZiAoYXR0cmlidXRlU3RyaW5n
ID09ICJBWFZhbHVlIikKLSAgICAgICAgcmV0dXJuIGNoZWNrRWxlbWVudFN0YXRlKG1fZWxlbWVu
dCwgQVRLX1NUQVRFX0VESVRBQkxFKTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBB
Y2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojppc0F0dHJpYnV0ZVN1cHBvcnRlZChKU1N0cmluZ1JlZiBh
dHRyaWJ1dGUpCi17Ci0gICAgaWYgKCFBVEtfSVNfT0JKRUNUKG1fZWxlbWVudCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIFN0cmluZyBhdGtBdHRyaWJ1dGVOYW1lID0gY29yZUF0dHJp
YnV0ZVRvQXRrQXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0gICAgaWYgKGF0a0F0dHJpYnV0ZU5hbWUu
aXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBGb3Igbm93LCBhbiBh
dHRyaWJ1dGUgaXMgc3VwcG9ydGVkIHdoZXRoZXIgaXQncyBleHBvc2VkIGFzIGEgb2JqZWN0IG9y
IGEgdGV4dCBhdHRyaWJ1dGUuCi0gICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmli
dXRlU2V0VmFsdWVGb3JJZChBVEtfT0JKRUNUKG1fZWxlbWVudCksIE9iamVjdEF0dHJpYnV0ZVR5
cGUsIGF0a0F0dHJpYnV0ZU5hbWUpOwotICAgIGlmIChhdHRyaWJ1dGVWYWx1ZS5pc0VtcHR5KCkp
Ci0gICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlU2V0VmFsdWVGb3JJZChBVEtf
T0JKRUNUKG1fZWxlbWVudCksIFRleHRBdHRyaWJ1dGVUeXBlLCBhdGtBdHRyaWJ1dGVOYW1lKTsK
LQotICAgIHJldHVybiAhYXR0cmlidXRlVmFsdWUuaXNFbXB0eSgpOwotfQotCi12b2lkIEFjY2Vz
c2liaWxpdHlVSUVsZW1lbnQ6OmluY3JlbWVudCgpCi17Ci0gICAgYWx0ZXJDdXJyZW50VmFsdWUo
bV9lbGVtZW50LCAxKTsKLX0KLQotdm9pZCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpkZWNyZW1l
bnQoKQotewotICAgIGFsdGVyQ3VycmVudFZhbHVlKG1fZWxlbWVudCwgLTEpOwotfQotCi12b2lk
IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnByZXNzKCkKLXsKLSAgICBpZiAoIUFUS19JU19BQ1RJ
T04obV9lbGVtZW50KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gT25seSBvbmUgYWN0aW9u
IHBlciBvYmplY3QgaXMgc3VwcG9ydGVkIHNvIGZhci4KLSAgICBhdGtfYWN0aW9uX2RvX2FjdGlv
bihBVEtfQUNUSU9OKG1fZWxlbWVudCksIDApOwotfQotCi12b2lkIEFjY2Vzc2liaWxpdHlVSUVs
ZW1lbnQ6OnNob3dNZW51KCkKLXsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50Ci19Ci0KLUFjY2Vz
c2liaWxpdHlVSUVsZW1lbnQgYWNjZXNzaWJpbGl0eUVsZW1lbnRBdEluZGV4KEF0a09iamVjdCog
ZWxlbWVudCwgQXRrUmVsYXRpb25UeXBlIHJlbGF0aW9uVHlwZSwgdW5zaWduZWQgaW5kZXgpCi17
Ci0gICAgaWYgKCFBVEtfSVNfT0JKRUNUKGVsZW1lbnQpKQotICAgICAgICByZXR1cm4gbnVsbHB0
cjsKLQotICAgIEF0a1JlbGF0aW9uU2V0KiByZWxhdGlvblNldCA9IGF0a19vYmplY3RfcmVmX3Jl
bGF0aW9uX3NldChlbGVtZW50KTsKLSAgICBpZiAoIXJlbGF0aW9uU2V0KQotICAgICAgICByZXR1
cm4gbnVsbHB0cjsKLQotICAgIEF0a1JlbGF0aW9uKiByZWxhdGlvbiA9IGF0a19yZWxhdGlvbl9z
ZXRfZ2V0X3JlbGF0aW9uX2J5X3R5cGUocmVsYXRpb25TZXQsIHJlbGF0aW9uVHlwZSk7Ci0gICAg
aWYgKCFyZWxhdGlvbikKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBHUHRyQXJyYXkq
IHRhcmdldExpc3QgPSBhdGtfcmVsYXRpb25fZ2V0X3RhcmdldChyZWxhdGlvbik7Ci0gICAgaWYg
KCF0YXJnZXRMaXN0IHx8ICF0YXJnZXRMaXN0LT5sZW4gfHwgaW5kZXggPj0gdGFyZ2V0TGlzdC0+
bGVuKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIEF0a09iamVjdCogdGFyZ2V0ID0g
c3RhdGljX2Nhc3Q8QXRrT2JqZWN0Kj4oZ19wdHJfYXJyYXlfaW5kZXgodGFyZ2V0TGlzdCwgaW5k
ZXgpKTsKLSAgICBnX29iamVjdF91bnJlZihyZWxhdGlvblNldCk7Ci0KLSAgICByZXR1cm4gdGFy
Z2V0ID8gQWNjZXNzaWJpbGl0eVVJRWxlbWVudCh0YXJnZXQpIDogbnVsbHB0cjsKLX0KLQotQWNj
ZXNzaWJpbGl0eVVJRWxlbWVudCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpkaXNjbG9zZWRSb3dB
dEluZGV4KHVuc2lnbmVkIGluZGV4KQotewotICAgIHJldHVybiBudWxscHRyOwotfQotCi1BY2Nl
c3NpYmlsaXR5VUlFbGVtZW50IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmFyaWFPd25zRWxlbWVu
dEF0SW5kZXgodW5zaWduZWQgaW5kZXgpCi17Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUFj
Y2Vzc2liaWxpdHlVSUVsZW1lbnQgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6YXJpYUZsb3dUb0Vs
ZW1lbnRBdEluZGV4KHVuc2lnbmVkIGluZGV4KQotewotICAgIHJldHVybiBhY2Nlc3NpYmlsaXR5
RWxlbWVudEF0SW5kZXgobV9lbGVtZW50LCBBVEtfUkVMQVRJT05fRkxPV1NfVE8sIGluZGV4KTsK
LX0KLQotQWNjZXNzaWJpbGl0eVVJRWxlbWVudCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojphcmlh
Q29udHJvbHNFbGVtZW50QXRJbmRleCh1bnNpZ25lZCBpbmRleCkKLXsKLSAgICByZXR1cm4gYWNj
ZXNzaWJpbGl0eUVsZW1lbnRBdEluZGV4KG1fZWxlbWVudCwgQVRLX1JFTEFUSU9OX0NPTlRST0xM
RVJfRk9SLCBpbmRleCk7Ci19Ci0KLUFjY2Vzc2liaWxpdHlVSUVsZW1lbnQgQWNjZXNzaWJpbGl0
eVVJRWxlbWVudDo6c2VsZWN0ZWRSb3dBdEluZGV4KHVuc2lnbmVkIGluZGV4KQotewotICAgIHJl
dHVybiBudWxscHRyOwotfQotCi1BY2Nlc3NpYmlsaXR5VUlFbGVtZW50IEFjY2Vzc2liaWxpdHlV
SUVsZW1lbnQ6OnJvd0F0SW5kZXgodW5zaWduZWQgaW5kZXgpCi17Ci0gICAgcmV0dXJuIG51bGxw
dHI7Ci19Ci0KLUFjY2Vzc2liaWxpdHlVSUVsZW1lbnQgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6
ZGlzY2xvc2VkQnlSb3coKQotewotICAgIHJldHVybiBudWxscHRyOwotfQotCi1KU1N0cmluZ1Jl
ZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjphY2Nlc3NpYmlsaXR5VmFsdWUoKSBjb25zdAotewot
ICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLSAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRoQ2hh
cmFjdGVycygwLCAwKTsKLX0KLQotSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6
ZG9jdW1lbnRFbmNvZGluZygpCi17Ci0gICAgaWYgKCFBVEtfSVNfRE9DVU1FTlQobV9lbGVtZW50
KSkKLSAgICAgICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoMCwgMCk7Ci0K
LSAgICBBdGtSb2xlIHJvbGUgPSBhdGtfb2JqZWN0X2dldF9yb2xlKEFUS19PQkpFQ1QobV9lbGVt
ZW50KSk7Ci0gICAgaWYgKHJvbGUgIT0gQVRLX1JPTEVfRE9DVU1FTlRfRlJBTUUpCi0gICAgICAg
IHJldHVybiBKU1N0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKDAsIDApOwotCi0gICAgcmV0dXJu
IEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKGF0a19kb2N1bWVudF9nZXRfYXR0cmlidXRl
X3ZhbHVlKEFUS19ET0NVTUVOVChtX2VsZW1lbnQpLCAiRW5jb2RpbmciKSk7Ci19Ci0KLUpTU3Ry
aW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmRvY3VtZW50VVJJKCkKLXsKLSAgICBpZiAo
IUFUS19JU19ET0NVTUVOVChtX2VsZW1lbnQpKQotICAgICAgICByZXR1cm4gSlNTdHJpbmdDcmVh
dGVXaXRoQ2hhcmFjdGVycygwLCAwKTsKLQotICAgIEF0a1JvbGUgcm9sZSA9IGF0a19vYmplY3Rf
Z2V0X3JvbGUoQVRLX09CSkVDVChtX2VsZW1lbnQpKTsKLSAgICBpZiAocm9sZSAhPSBBVEtfUk9M
RV9ET0NVTUVOVF9GUkFNRSkKLSAgICAgICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aENoYXJh
Y3RlcnMoMCwgMCk7Ci0KLSAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENTdHJpbmco
YXRrX2RvY3VtZW50X2dldF9hdHRyaWJ1dGVfdmFsdWUoQVRLX0RPQ1VNRU5UKG1fZWxlbWVudCks
ICJVUkkiKSk7Ci19Ci0KLUpTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnVybCgp
Ci17Ci0gICAgaWYgKCFBVEtfSVNfSFlQRVJMSU5LX0lNUEwobV9lbGVtZW50KSkKLSAgICAgICAg
cmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoMCwgMCk7Ci0KLSAgICBBdGtIeXBl
cmxpbmsqIGh5cGVybGluayA9IGF0a19oeXBlcmxpbmtfaW1wbF9nZXRfaHlwZXJsaW5rKEFUS19I
WVBFUkxJTktfSU1QTChtX2VsZW1lbnQpKTsKLSAgICBHVW5pcXVlUHRyPGNoYXI+IGh5cGVybGlu
a1VSSShhdGtfaHlwZXJsaW5rX2dldF91cmkoaHlwZXJsaW5rLCAwKSk7Ci0KLSAgICAvLyBCdWls
ZCB0aGUgcmVzdWx0IHN0cmluZywgc3RyaXBwaW5nIHRoZSBhYnNvbHV0ZSBVUkwgcGF0aHMgaWYg
cHJlc2VudC4KLSAgICBjaGFyKiBsb2NhbFVSSSA9IGdfc3Ryc3RyX2xlbihoeXBlcmxpbmtVUkku
Z2V0KCksIC0xLCAiTGF5b3V0VGVzdHMiKTsKLSAgICBTdHJpbmcgYXhVUkwgPSBTdHJpbmc6OmZv
cm1hdCgiQVhVUkw6ICVzIiwgbG9jYWxVUkkgPyBsb2NhbFVSSSA6IGh5cGVybGlua1VSSS5nZXQo
KSk7Ci0gICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKGF4VVJMLnV0Zjgo
KS5kYXRhKCkpOwotfQotCi1ib29sIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmFkZE5vdGlmaWNh
dGlvbkxpc3RlbmVyKEpTT2JqZWN0UmVmIGZ1bmN0aW9uQ2FsbGJhY2spCi17Ci0gICAgaWYgKCFm
dW5jdGlvbkNhbGxiYWNrKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBPbmx5IG9u
ZSBub3RpZmljYXRpb24gbGlzdGVuZXIgcGVyIGVsZW1lbnQuCi0gICAgaWYgKG1fbm90aWZpY2F0
aW9uSGFuZGxlcikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgbV9ub3RpZmljYXRpb25I
YW5kbGVyID0gQWNjZXNzaWJpbGl0eU5vdGlmaWNhdGlvbkhhbmRsZXI6OmNyZWF0ZSgpOwotICAg
IG1fbm90aWZpY2F0aW9uSGFuZGxlci0+c2V0UGxhdGZvcm1FbGVtZW50KHBsYXRmb3JtVUlFbGVt
ZW50KCkpOwotICAgIG1fbm90aWZpY2F0aW9uSGFuZGxlci0+c2V0Tm90aWZpY2F0aW9uRnVuY3Rp
b25DYWxsYmFjayhmdW5jdGlvbkNhbGxiYWNrKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi12
b2lkIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKCkK
LXsKLSAgICAvLyBQcm9ncmFtbWVycyBzaG91bGQgbm90IGJlIHRyeWluZyB0byByZW1vdmUgYSBs
aXN0ZW5lciB0aGF0J3MgYWxyZWFkeSByZW1vdmVkLgotICAgIEFTU0VSVChtX25vdGlmaWNhdGlv
bkhhbmRsZXIpOwotCi0gICAgbV9ub3RpZmljYXRpb25IYW5kbGVyID0gbnVsbHB0cjsKLX0KLQot
Ym9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAg
aWYgKCFBVEtfSVNfT0JKRUNUKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIEdSZWZQdHI8QXRrU3RhdGVTZXQ+IHN0YXRlU2V0ID0gYWRvcHRHUmVmKGF0a19vYmplY3Rf
cmVmX3N0YXRlX3NldChBVEtfT0JKRUNUKG1fZWxlbWVudCkpKTsKLSAgICBnYm9vbGVhbiBpc0Zv
Y3VzYWJsZSA9IGF0a19zdGF0ZV9zZXRfY29udGFpbnNfc3RhdGUoc3RhdGVTZXQuZ2V0KCksIEFU
S19TVEFURV9GT0NVU0FCTEUpOwotCi0gICAgcmV0dXJuIGlzRm9jdXNhYmxlOwotfQotCi1ib29s
IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmlzU2VsZWN0YWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGNoZWNrRWxlbWVudFN0YXRlKG1fZWxlbWVudCwgQVRLX1NUQVRFX1NFTEVDVEFCTEUpOwot
fQotCi1ib29sIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmlzTXVsdGlTZWxlY3RhYmxlKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gY2hlY2tFbGVtZW50U3RhdGUobV9lbGVtZW50LCBBVEtfU1RBVEVf
TVVMVElTRUxFQ1RBQkxFKTsKLX0KLQotYm9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojppc1Nl
bGVjdGVkT3B0aW9uQWN0aXZlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gY2hlY2tFbGVtZW50U3Rh
dGUobV9lbGVtZW50LCBBVEtfU1RBVEVfQUNUSVZFKTsKLX0KLQotYm9vbCBBY2Nlc3NpYmlsaXR5
VUlFbGVtZW50Ojppc1Zpc2libGUoKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQK
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6aXNP
ZmZTY3JlZW4oKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KLWJvb2wgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6aXNDb2xsYXBzZWQoKSBj
b25zdAotewotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0K
LWJvb2wgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6aXNJZ25vcmVkKCkgY29uc3QKLXsKLSAgICAv
LyBGSVhNRTogaW1wbGVtZW50Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEFjY2Vzc2li
aWxpdHlVSUVsZW1lbnQ6Omhhc1BvcHVwKCkgY29uc3QKLXsKLSAgICBpZiAoIUFUS19JU19PQkpF
Q1QobV9lbGVtZW50KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU3RyaW5nIGhhc1Bv
cHVwVmFsdWUgPSBnZXRBdHRyaWJ1dGVTZXRWYWx1ZUZvcklkKEFUS19PQkpFQ1QobV9lbGVtZW50
KSwgT2JqZWN0QXR0cmlidXRlVHlwZSwgImhhc3BvcHVwIik7Ci0gICAgcmV0dXJuIGVxdWFsSWdu
b3JpbmdDYXNlKGhhc1BvcHVwVmFsdWUsICJ0cnVlIik7Ci19Ci0KLXZvaWQgQWNjZXNzaWJpbGl0
eVVJRWxlbWVudDo6dGFrZUZvY3VzKCkKLXsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50Ci19Ci0K
LXZvaWQgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6dGFrZVNlbGVjdGlvbigpCi17Ci0gICAgLy8g
RklYTUU6IGltcGxlbWVudAotfQotCi12b2lkIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmFkZFNl
bGVjdGlvbigpCi17Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudAotfQotCi12b2lkIEFjY2Vzc2li
aWxpdHlVSUVsZW1lbnQ6OnJlbW92ZVNlbGVjdGlvbigpCi17Ci0gICAgLy8gRklYTUU6IGltcGxl
bWVudAotfQotCi12b2lkIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnNjcm9sbFRvTWFrZVZpc2li
bGUoKQotewotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLX0KLQotdm9pZCBBY2Nlc3NpYmlsaXR5
VUlFbGVtZW50OjpzY3JvbGxUb01ha2VWaXNpYmxlV2l0aFN1YkZvY3VzKGludCB4LCBpbnQgeSwg
aW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLX0KLQot
dm9pZCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpzY3JvbGxUb0dsb2JhbFBvaW50KGludCB4LCBp
bnQgeSkKLXsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50Ci19Ci0KLUpTU3RyaW5nUmVmIEFjY2Vz
c2liaWxpdHlVSUVsZW1lbnQ6OmNsYXNzTGlzdCgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IGlt
cGxlbWVudAotICAgIHJldHVybiBudWxscHRyOwotfQotCi1KU1N0cmluZ1JlZiBzdHJpbmdBdE9m
ZnNldChQbGF0Zm9ybVVJRWxlbWVudCBlbGVtZW50LCBBdGtUZXh0Qm91bmRhcnkgYm91bmRhcnks
IGludCBvZmZzZXQpCi17Ci0gICAgaWYgKCFBVEtfSVNfVEVYVChlbGVtZW50KSkKLSAgICAgICAg
cmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoMCwgMCk7Ci0KLSAgICBnaW50IHN0
YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7Ci0gICAgU3RyaW5nQnVpbGRlciBidWlsZGVyOwotCi0jaWYg
QVRLX0NIRUNLX1ZFUlNJT04oMiwgMTAsIDApCi0gICAgQXRrVGV4dEdyYW51bGFyaXR5IGdyYW51
bGFyaXR5OwotICAgIHN3aXRjaCAoYm91bmRhcnkpIHsKLSAgICBjYXNlIEFUS19URVhUX0JPVU5E
QVJZX0NIQVI6Ci0gICAgICAgIGdyYW51bGFyaXR5ID0gQVRLX1RFWFRfR1JBTlVMQVJJVFlfQ0hB
UjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVEtfVEVYVF9CT1VOREFSWV9XT1JEX1NUQVJU
OgotICAgICAgICBncmFudWxhcml0eSA9IEFUS19URVhUX0dSQU5VTEFSSVRZX1dPUkQ7Ci0gICAg
ICAgIGJyZWFrOwotICAgIGNhc2UgQVRLX1RFWFRfQk9VTkRBUllfTElORV9TVEFSVDoKLSAgICAg
ICAgZ3JhbnVsYXJpdHkgPSBBVEtfVEVYVF9HUkFOVUxBUklUWV9MSU5FOwotICAgICAgICBicmVh
azsKLSAgICBjYXNlIEFUS19URVhUX0JPVU5EQVJZX1NFTlRFTkNFX1NUQVJUOgotICAgICAgICBn
cmFudWxhcml0eSA9IEFUS19URVhUX0dSQU5VTEFSSVRZX1NFTlRFTkNFOwotICAgICAgICBicmVh
azsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gSlNTdHJpbmdDcmVhdGVXaXRoQ2hhcmFj
dGVycygwLCAwKTsKLSAgICB9Ci0KLSAgICBidWlsZGVyLmFwcGVuZChhdGtfdGV4dF9nZXRfc3Ry
aW5nX2F0X29mZnNldChBVEtfVEVYVChlbGVtZW50KSwgb2Zmc2V0LCBncmFudWxhcml0eSwgJnN0
YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KSk7Ci0jZWxzZQotICAgIGJ1aWxkZXIuYXBwZW5kKGF0a190
ZXh0X2dldF90ZXh0X2F0X29mZnNldChBVEtfVEVYVChlbGVtZW50KSwgb2Zmc2V0LCBib3VuZGFy
eSwgJnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KSk7Ci0jZW5kaWYKLSAgICBidWlsZGVyLmFwcGVu
ZChTdHJpbmc6OmZvcm1hdCgiLCAlaSwgJWkiLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KSk7Ci0g
ICAgcmV0dXJuIEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKGJ1aWxkZXIudG9TdHJpbmco
KS51dGY4KCkuZGF0YSgpKTsKLX0KLQotSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVu
dDo6Y2hhcmFjdGVyQXRPZmZzZXQoaW50IG9mZnNldCkKLXsKLSAgICByZXR1cm4gc3RyaW5nQXRP
ZmZzZXQobV9lbGVtZW50LCBBVEtfVEVYVF9CT1VOREFSWV9DSEFSLCBvZmZzZXQpOwotfQotCi1K
U1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojp3b3JkQXRPZmZzZXQoaW50IG9mZnNl
dCkKLXsKLSAgICByZXR1cm4gc3RyaW5nQXRPZmZzZXQobV9lbGVtZW50LCBBVEtfVEVYVF9CT1VO
REFSWV9XT1JEX1NUQVJULCBvZmZzZXQpOwotfQotCi1KU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5
VUlFbGVtZW50OjpsaW5lQXRPZmZzZXQoaW50IG9mZnNldCkKLXsKLSAgICByZXR1cm4gc3RyaW5n
QXRPZmZzZXQobV9lbGVtZW50LCBBVEtfVEVYVF9CT1VOREFSWV9MSU5FX1NUQVJULCBvZmZzZXQp
OwotfQotCi1KU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpzZW50ZW5jZUF0T2Zm
c2V0KGludCBvZmZzZXQpCi17Ci0gICAgcmV0dXJuIHN0cmluZ0F0T2Zmc2V0KG1fZWxlbWVudCwg
QVRLX1RFWFRfQk9VTkRBUllfU0VOVEVOQ0VfU1RBUlQsIG9mZnNldCk7Ci19Ci0KLXVuc2lnbmVk
IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnNlbGVjdGVkQ2hpbGRyZW5Db3VudCgpIGNvbnN0Ci17
Ci0gICAgaWYgKCFBVEtfSVNfU0VMRUNUSU9OKG1fZWxlbWVudCkpCi0gICAgICAgIHJldHVybiAw
OwotCi0gICAgcmV0dXJuIGF0a19zZWxlY3Rpb25fZ2V0X3NlbGVjdGlvbl9jb3VudChBVEtfU0VM
RUNUSU9OKG1fZWxlbWVudCkpOwotfQotCi1BY2Nlc3NpYmlsaXR5VUlFbGVtZW50IEFjY2Vzc2li
aWxpdHlVSUVsZW1lbnQ6OnNlbGVjdGVkQ2hpbGRBdEluZGV4KHVuc2lnbmVkIGluZGV4KSBjb25z
dAotewotICAgIGlmICghQVRLX0lTX1NFTEVDVElPTihtX2VsZW1lbnQpKQotICAgICAgICByZXR1
cm4gbnVsbHB0cjsKLQotICAgIEdSZWZQdHI8QXRrT2JqZWN0PiBjaGlsZCA9IGFkb3B0R1JlZihh
dGtfc2VsZWN0aW9uX3JlZl9zZWxlY3Rpb24oQVRLX1NFTEVDVElPTihtX2VsZW1lbnQpLCBpbmRl
eCkpOwotICAgIHJldHVybiBjaGlsZCA/IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQoY2hpbGQuZ2V0
KCkpIDogbnVsbHB0cjsKLX0KLQotdm9pZCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpzZXRTZWxl
Y3RlZENoaWxkQXRJbmRleCh1bnNpZ25lZCBpbmRleCkgY29uc3QKLXsKLSAgICBpZiAoIUFUS19J
U19TRUxFQ1RJT04obV9lbGVtZW50KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYXRrX3NlbGVj
dGlvbl9hZGRfc2VsZWN0aW9uKEFUS19TRUxFQ1RJT04obV9lbGVtZW50KSwgaW5kZXgpOwotfQot
Ci12b2lkIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnJlbW92ZVNlbGVjdGlvbkF0SW5kZXgodW5z
aWduZWQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKCFBVEtfSVNfU0VMRUNUSU9OKG1fZWxlbWVu
dCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGF0a19zZWxlY3Rpb25fcmVtb3ZlX3NlbGVjdGlv
bihBVEtfU0VMRUNUSU9OKG1fZWxlbWVudCksIGluZGV4KTsKLX0KLQotdm9pZCBBY2Nlc3NpYmls
aXR5VUlFbGVtZW50Ojpjb2x1bW5IZWFkZXJzKFZlY3RvcjxBY2Nlc3NpYmlsaXR5VUlFbGVtZW50
PiYgY29sdW1ucykgY29uc3QKLXsKLSNpZiBBVEtfQ0hFQ0tfVkVSU0lPTigyLDExLDkwKQotICAg
IGlmICghQVRLX0lTX1RBQkxFX0NFTEwobV9lbGVtZW50KSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgR1JlZlB0cjxHUHRyQXJyYXk+IGFycmF5ID0gYWRvcHRHUmVmKGF0a190YWJsZV9jZWxsX2dl
dF9jb2x1bW5faGVhZGVyX2NlbGxzKEFUS19UQUJMRV9DRUxMKG1fZWxlbWVudCkpKTsKLSAgICBp
ZiAoIWFycmF5KQotICAgICAgICByZXR1cm47Ci0KLSAgICBjb252ZXJ0R1B0ckFycmF5VG9WZWN0
b3IoYXJyYXkuZ2V0KCksIGNvbHVtbnMpOwotI2VuZGlmCi19Ci0KLXZvaWQgQWNjZXNzaWJpbGl0
eVVJRWxlbWVudDo6cm93SGVhZGVycyhWZWN0b3I8QWNjZXNzaWJpbGl0eVVJRWxlbWVudD4mIGNl
bGxzKSBjb25zdAotewotI2lmIEFUS19DSEVDS19WRVJTSU9OKDIsMTEsOTApCi0gICAgaWYgKCFB
VEtfSVNfVEFCTEVfQ0VMTChtX2VsZW1lbnQpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBHUmVm
UHRyPEdQdHJBcnJheT4gYXJyYXkgPSBhZG9wdEdSZWYoYXRrX3RhYmxlX2NlbGxfZ2V0X3Jvd19o
ZWFkZXJfY2VsbHMoQVRLX1RBQkxFX0NFTEwobV9lbGVtZW50KSkpOwotICAgIGlmICghYXJyYXkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnZlcnRHUHRyQXJyYXlUb1ZlY3RvcihhcnJheS5n
ZXQoKSwgY2VsbHMpOwotI2VuZGlmCi19Ci0KLSNlbmRpZgo=
</data>
<flag name="review"
          id="258096"
          type_id="1"
          status="+"
          setter="cfleizach"
    />
          </attachment>
      

    </bug>

</bugzilla>